commit b0960891888cfa4c43e79e96d7e57476237502cb Author: Jason Date: Tue Feb 15 09:55:45 2022 -0500 🦈🏠🐜❗ Initial Commit ❗🐜🦈🏠 diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..810979f --- /dev/null +++ b/.dockerignore @@ -0,0 +1,7 @@ +.git +circle.yml +LICENSE +VERSION +README.md +Changelog.md +Makefile diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b763338 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +# gitignore created on 02/14/22 at 15:49 +# Disable reminder in prompt +ignoredirmessage + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Other +.installed + + diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..63cd3d3 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,29 @@ +sudo: required +services: + - docker + +env: + DOCKER_COMPOSE_VERSION: 1.5.2 + +before_install: + - sudo rm /usr/local/bin/docker-compose + - curl -L https://github.com/docker/compose/releases/download/${DOCKER_COMPOSE_VERSION}/docker-compose-`uname -s`-`uname -m` > docker-compose + - chmod +x docker-compose + - sudo mv docker-compose /usr/local/bin + +script: + - docker-compose build + - docker-compose up -d + # everything running? + - docker-compose ps + - docker-compose ps squidguard | grep Up + # wpad should be available + - docker-compose run squidguard wget -o /dev/null http://squidguard/wpat.dat + # muenchhausen.de should not be blocked + - docker-compose run squidguard wget -e use_proxy=yes -e http_proxy=http://squidguard:3128 -o /dev/null http://www.muenchhausen.de + # lemonlime.de should be blocked because it is not in the whitelist + - docker-compose run squidguard wget -e use_proxy=yes -e http_proxy=http://squidguard:3128 --content-on-error -qO- http://www.lemonlime.de | grep "block" + +notifications: + email: + - derk@muenchhausen.de diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..4cab855 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,59 @@ +FROM casjaysdev/debian:latest AS build + +ARG BUILD_DATE="$(date +'%Y-%m-%d %H:%M')" + +LABEL \ + org.label-schema.name="Full proxy server" \ + org.label-schema.description="" \ + org.label-schema.url="https://github.com/casjaysdev/squid" \ + org.label-schema.vcs-url="https://github.com/casjaysdev/squid" \ + org.label-schema.build-date=$BUILD_DATE \ + org.label-schema.version=$BUILD_DATE \ + org.label-schema.vcs-ref=$BUILD_DATE \ + org.label-schema.license="MIT" \ + org.label-schema.vcs-type="Git" \ + org.label-schema.schema-version="latest" \ + org.label-schema.vendor="CasjaysDev" \ + maintainer="CasjaysDev " + +ENV \ + HOSTNAME=proxy \ + SQUID_HOME_DIR=/var/lib/squid \ + SQUID_CACHE_DIR=/data/cache/squid \ + SQUID_LOG_DIR=/data/log/squid \ + SQUID_USER=squid + +RUN apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -yy \ + postfix \ + squid \ + squidguard \ + e2guardian \ + c-icap \ + apache2 \ + apache2-bin \ + libapache2-mod-fcgid \ + libapache2-mod-geoip \ + libapache2-mod-proxy-uwsgi \ + libapache2-mod-fcgid \ + libapache2-mod-wsgi \ + && apt-get remove -yy --purge exim* \ + && rm -rf /var/lib/apt/lists/* /etc/apache2/*conf* \ + && mkdir -p /config /data \ + && useradd -d "$SQUID_HOME_DIR" -r -U -m "$SQUID_USER" + +ADD ./config/. /etc/ +ADD ./bin/. /usr/local/bin/ + +ADD ./data/. /usr/local/share/squidFiles/data/ +ADD ./config/. /usr/local/share/squidFiles/config/ + +FROM scratch + +COPY --from=build /. / + +EXPOSE 3127 3128 80 +VOLUME ["/config", "/data"] + +HEALTHCHECK CMD ["/usr/local/bin/entrypoint-squid.sh","healthcheck"] +ENTRYPOINT ["/usr/local/bin/entrypoint-squid.sh"] diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..86d4345 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,13 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2022 Jason Hempstead + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 1. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b079138 --- /dev/null +++ b/README.md @@ -0,0 +1,10 @@ +

+👋 Welcome to squidguard 👋 +

+

+StartDocumentationHere +

+ +## Author + +👤 **Jason Hempstead** diff --git a/bin/create-blocklists.sh b/bin/create-blocklists.sh new file mode 100755 index 0000000..592f5b2 --- /dev/null +++ b/bin/create-blocklists.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash + +set -ex + +SQUID_USER="${SQUID_USER:-squid}" +SQUID_LOG_DIR="${SQUID_LOG_DIR:-/data/log/squid}" +REDIRECT_URL="${REDIRECT_URL:-/}" +BLOCKLIST="${BLOCKLIST:-http://www.shallalist.de/Downloads/shallalist.tar.gz}" +BLOCKED_CATEGORIES="${BLOCKED_CATEGORIES:-adv,aggressive,porn,spyware,violence,warez}" + +CONFIG_FILE="/etc/squidguard/squidGuard.conf" +DB_LOCATION="/data/squidguard/db" +LOG_LOCATION="/data/log" + +echo "Downloading blocklist..." +wget -q "${BLOCKLIST}" -O /tmp/blocklist.tgz + +echo "Extracting blocklist..." +mkdir -p /tmp/blocklist +tar xzf /tmp/blocklist.tgz --strip-components=1 -C /tmp/blocklist + +echo "Creating config file..." +rm "${CONFIG_FILE}" +touch "${CONFIG_FILE}" + +echo "dbhome ${DB_LOCATION}" >>"${CONFIG_FILE}" +echo "logdir ${LOG_LOCATION}" >>"${CONFIG_FILE}" + +for CATEGORY in $(echo ${BLOCKED_CATEGORIES} | sed "s/,/ /g"); do + if [ ! -d "/tmp/blocklist/${CATEGORY}" ]; then + echo "Category ${CATEGORY} not available!" + exit 1 + fi + + cp -r "/tmp/blocklist/${CATEGORY}" "${DB_LOCATION}/" + + echo "dest ${CATEGORY} {" >>"${CONFIG_FILE}" + + if [ -e "${DB_LOCATION}/${CATEGORY}/domains" ]; then + echo " domainlist ${CATEGORY}/domains" >>"${CONFIG_FILE}" + fi + + if [ -e "${DB_LOCATION}/${CATEGORY}/urls" ]; then + echo " urllist ${CATEGORY}/urls" >>"${CONFIG_FILE}" + fi + + if [ -e "${DB_LOCATION}/${CATEGORY}/expressions" ]; then + echo " expressionlist ${CATEGORY}/expressions" >>"${CONFIG_FILE}" + fi + + echo "}" >>"${CONFIG_FILE}" +done + +NOT_LIST="${BLOCKED_CATEGORIES//,/ !}" + +{ + echo "acl {" + echo " default {" + echo " pass !${NOT_LIST} all" + echo " redirect $REDIRECT_URL" + echo " }" + echo "}" +} >>"${CONFIG_FILE}" + +squidGuard -C all + +chown -R ${SQUID_USER}:${SQUID_USER} "${DB_LOCATION}" +chown -R ${SQUID_USER}:${SQUID_USER} "${LOG_LOCATION}" +chown -R ${SQUID_USER}:${SQUID_USER} "${CONFIG_FILE}" + +echo "Cleanup..." +rm -rf /tmp/* diff --git a/bin/entrypoint-squid.sh b/bin/entrypoint-squid.sh new file mode 100755 index 0000000..64da2ec --- /dev/null +++ b/bin/entrypoint-squid.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +set -e + +if [ "$1" = "healthcheck" ]; then + squidclient -h localhost cache_object://localhost/counters + exit $? +fi + +SQUID_USER="${SQUID_USER:-squid}" +SQUID_LOG_DIR="${SQUID_LOG_DIR:-/data/log/squid}" +SQUID_CACHE_DIR="${SQUID_CACHE_DIR:-/data/cache/squid}" +HOSTNAME="${HOSTNAME:-$(hostname -f)}" + +mkdir -p "/config" "/data" + +for dir in apache2 e2guardian squid squidguard; do + if [ -f "/usr/local/share/squidFiles/$dir" ]; then + cp -Rf "/usr/local/share/squidFiles/$dir" "/config/$dir" + elif [ -d "/usr/local/share/squidFiles/$dir" ]; then + cp -Rf "/usr/local/share/squidFiles/$dir/." "/config/$dir/" + else + cp -Rf "/usr/local/share/squidFiles/data/." "/data/" + cp -Rf "usr/local/share/squidFiles/config/." "/config/" + fi +done + +mkdir -p "${SQUID_LOG_DIR}" "${SQUID_CACHE_DIR}" +mkdir -p "/data/log/squidguard" "/data/log/e2guardian" "/data/squidguard/db" +chown -Rf ${SQUID_USER}:${SQUID_USER} "/config" "/data" +chmod -Rf 755 "${SQUID_LOG_DIR}" + +cp -Rf "/config/." "/etc/" + +if [ "${UPDATE_BLACKLIST_URL}" != "" ]; then + sudo wget -O backlist.tar.gz ${UPDATE_BLACKLIST_URL} && + tar -xzf backlist.tar.gz -C "/data/squidguard/db" && + rm -Rf backlist.tar.gz && + chown -Rf ${SQUID_USER}:${SQUID_USER} "/data/squidguard/db" +fi + +if [ "${WPAD_IP}" != "" ]; then + sed 's/{{WPAD_IP}}/'"${WPAD_IP}"'/' -i "/data/htdocs/www/wpad.dat" + sed 's/{{WPAD_NOPROXY_NET}}/'"${WPAD_NOPROXY_NET}"'/' -i "/data/htdocs/www/wpad.dat" + sed 's/{{WPAD_NOPROXY_MASK}}/'"${WPAD_NOPROXY_MASK}"'/' -i "/data/htdocs/www/wpad.dat" +fi + +# allow arguments to be passed to squid +if [[ ${1:0:1} = '-' ]]; then + EXTRA_ARGS="$@" + set -- +elif [[ ${1} == squid || ${1} == $(which squid) ]]; then + EXTRA_ARGS="${@:2}" + set -- +fi + +# start apache to serve wpad.dat file and or block.html +sudo /etc/init.d/apache2 restart + +# default behaviour is to launch squid +if [[ -z ${1} ]]; then + if [[ ! -d ${SQUID_CACHE_DIR}/00 ]]; then + echo "Initializing cache..." + $(which squid) -N -f /etc/squid/squid.conf -z + fi + echo "Starting squid..." + exec $(which squid) -f /etc/squid/squid.conf -NYCd 1 ${EXTRA_ARGS} +else + exec "$@" +fi diff --git a/config/apache2/apache2.conf b/config/apache2/apache2.conf new file mode 100644 index 0000000..fe696fc --- /dev/null +++ b/config/apache2/apache2.conf @@ -0,0 +1,204 @@ +# This is the main Apache HTTP server configuration file. It contains the +# Set to one of: Full | OS | Minor | Minimal | Major | Prod +ServerTokens Prod +ServerRoot /etc/apache2 +Listen 80 + +LoadModule mpm_prefork_module /usr/lib/apache2/modules/mod_mpm_prefork.so +LoadModule access_compat_module /usr/lib/apache2/modules/mod_access_compat.so +LoadModule actions_module /usr/lib/apache2/modules/mod_actions.so +LoadModule alias_module /usr/lib/apache2/modules/mod_alias.so +LoadModule allowmethods_module /usr/lib/apache2/modules/mod_allowmethods.so +LoadModule asis_module /usr/lib/apache2/modules/mod_asis.so +LoadModule auth_basic_module /usr/lib/apache2/modules/mod_auth_basic.so +LoadModule auth_digest_module /usr/lib/apache2/modules/mod_auth_digest.so +LoadModule auth_form_module /usr/lib/apache2/modules/mod_auth_form.so +LoadModule authn_anon_module /usr/lib/apache2/modules/mod_authn_anon.so +LoadModule authn_core_module /usr/lib/apache2/modules/mod_authn_core.so +LoadModule authn_dbd_module /usr/lib/apache2/modules/mod_authn_dbd.so +LoadModule authn_dbm_module /usr/lib/apache2/modules/mod_authn_dbm.so +LoadModule authn_file_module /usr/lib/apache2/modules/mod_authn_file.so +LoadModule authn_socache_module /usr/lib/apache2/modules/mod_authn_socache.so +LoadModule authnz_fcgi_module /usr/lib/apache2/modules/mod_authnz_fcgi.so +LoadModule authnz_ldap_module /usr/lib/apache2/modules/mod_authnz_ldap.so +LoadModule authz_core_module /usr/lib/apache2/modules/mod_authz_core.so +LoadModule authz_dbd_module /usr/lib/apache2/modules/mod_authz_dbd.so +LoadModule authz_dbm_module /usr/lib/apache2/modules/mod_authz_dbm.so +LoadModule authz_groupfile_module /usr/lib/apache2/modules/mod_authz_groupfile.so +LoadModule authz_host_module /usr/lib/apache2/modules/mod_authz_host.so +LoadModule authz_owner_module /usr/lib/apache2/modules/mod_authz_owner.so +LoadModule authz_user_module /usr/lib/apache2/modules/mod_authz_user.so +LoadModule autoindex_module /usr/lib/apache2/modules/mod_autoindex.so +LoadModule brotli_module /usr/lib/apache2/modules/mod_brotli.so +LoadModule buffer_module /usr/lib/apache2/modules/mod_buffer.so +LoadModule cache_module /usr/lib/apache2/modules/mod_cache.so +LoadModule cache_disk_module /usr/lib/apache2/modules/mod_cache_disk.so +LoadModule cache_socache_module /usr/lib/apache2/modules/mod_cache_socache.so +LoadModule cern_meta_module /usr/lib/apache2/modules/mod_cern_meta.so +LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so +LoadModule cgid_module /usr/lib/apache2/modules/mod_cgid.so +LoadModule charset_lite_module /usr/lib/apache2/modules/mod_charset_lite.so +LoadModule data_module /usr/lib/apache2/modules/mod_data.so +LoadModule dav_module /usr/lib/apache2/modules/mod_dav.so +LoadModule dav_fs_module /usr/lib/apache2/modules/mod_dav_fs.so +LoadModule dav_lock_module /usr/lib/apache2/modules/mod_dav_lock.so +LoadModule dbd_module /usr/lib/apache2/modules/mod_dbd.so +LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so +LoadModule dialup_module /usr/lib/apache2/modules/mod_dialup.so +LoadModule dir_module /usr/lib/apache2/modules/mod_dir.so +LoadModule dumpio_module /usr/lib/apache2/modules/mod_dumpio.so +LoadModule echo_module /usr/lib/apache2/modules/mod_echo.so +LoadModule env_module /usr/lib/apache2/modules/mod_env.so +LoadModule expires_module /usr/lib/apache2/modules/mod_expires.so +LoadModule ext_filter_module /usr/lib/apache2/modules/mod_ext_filter.so +LoadModule fcgid_module /usr/lib/apache2/modules/mod_fcgid.so +LoadModule file_cache_module /usr/lib/apache2/modules/mod_file_cache.so +LoadModule filter_module /usr/lib/apache2/modules/mod_filter.so +LoadModule geoip_module /usr/lib/apache2/modules/mod_geoip.so +LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so +LoadModule heartbeat_module /usr/lib/apache2/modules/mod_heartbeat.so +LoadModule heartmonitor_module /usr/lib/apache2/modules/mod_heartmonitor.so +LoadModule http2_module /usr/lib/apache2/modules/mod_http2.so +LoadModule ident_module /usr/lib/apache2/modules/mod_ident.so +LoadModule imagemap_module /usr/lib/apache2/modules/mod_imagemap.so +LoadModule include_module /usr/lib/apache2/modules/mod_include.so +LoadModule info_module /usr/lib/apache2/modules/mod_info.so +LoadModule lbmethod_bybusyness_module /usr/lib/apache2/modules/mod_lbmethod_bybusyness.so +LoadModule lbmethod_byrequests_module /usr/lib/apache2/modules/mod_lbmethod_byrequests.so +LoadModule lbmethod_bytraffic_module /usr/lib/apache2/modules/mod_lbmethod_bytraffic.so +LoadModule lbmethod_heartbeat_module /usr/lib/apache2/modules/mod_lbmethod_heartbeat.so +LoadModule ldap_module /usr/lib/apache2/modules/mod_ldap.so +LoadModule log_debug_module /usr/lib/apache2/modules/mod_log_debug.so +LoadModule log_forensic_module /usr/lib/apache2/modules/mod_log_forensic.so +LoadModule lua_module /usr/lib/apache2/modules/mod_lua.so +LoadModule macro_module /usr/lib/apache2/modules/mod_macro.so +LoadModule md_module /usr/lib/apache2/modules/mod_md.so +LoadModule mime_module /usr/lib/apache2/modules/mod_mime.so +LoadModule mime_magic_module /usr/lib/apache2/modules/mod_mime_magic.so +LoadModule negotiation_module /usr/lib/apache2/modules/mod_negotiation.so +LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so +LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so +LoadModule proxy_balancer_module /usr/lib/apache2/modules/mod_proxy_balancer.so +LoadModule proxy_connect_module /usr/lib/apache2/modules/mod_proxy_connect.so +LoadModule proxy_express_module /usr/lib/apache2/modules/mod_proxy_express.so +LoadModule proxy_fcgi_module /usr/lib/apache2/modules/mod_proxy_fcgi.so +LoadModule proxy_fdpass_module /usr/lib/apache2/modules/mod_proxy_fdpass.so +LoadModule proxy_ftp_module /usr/lib/apache2/modules/mod_proxy_ftp.so +LoadModule proxy_hcheck_module /usr/lib/apache2/modules/mod_proxy_hcheck.so +LoadModule proxy_html_module /usr/lib/apache2/modules/mod_proxy_html.so +LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so +LoadModule proxy_http2_module /usr/lib/apache2/modules/mod_proxy_http2.so +LoadModule proxy_scgi_module /usr/lib/apache2/modules/mod_proxy_scgi.so +LoadModule proxy_uwsgi_module /usr/lib/apache2/modules/mod_proxy_uwsgi.so +LoadModule proxy_wstunnel_module /usr/lib/apache2/modules/mod_proxy_wstunnel.so +LoadModule ratelimit_module /usr/lib/apache2/modules/mod_ratelimit.so +LoadModule reflector_module /usr/lib/apache2/modules/mod_reflector.so +LoadModule remoteip_module /usr/lib/apache2/modules/mod_remoteip.so +LoadModule reqtimeout_module /usr/lib/apache2/modules/mod_reqtimeout.so +LoadModule request_module /usr/lib/apache2/modules/mod_request.so +LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so +LoadModule sed_module /usr/lib/apache2/modules/mod_sed.so +LoadModule session_module /usr/lib/apache2/modules/mod_session.so +LoadModule session_cookie_module /usr/lib/apache2/modules/mod_session_cookie.so +LoadModule session_crypto_module /usr/lib/apache2/modules/mod_session_crypto.so +LoadModule session_dbd_module /usr/lib/apache2/modules/mod_session_dbd.so +LoadModule setenvif_module /usr/lib/apache2/modules/mod_setenvif.so +LoadModule slotmem_plain_module /usr/lib/apache2/modules/mod_slotmem_plain.so +LoadModule slotmem_shm_module /usr/lib/apache2/modules/mod_slotmem_shm.so +LoadModule socache_dbm_module /usr/lib/apache2/modules/mod_socache_dbm.so +LoadModule socache_memcache_module /usr/lib/apache2/modules/mod_socache_memcache.so +LoadModule socache_shmcb_module /usr/lib/apache2/modules/mod_socache_shmcb.so +LoadModule speling_module /usr/lib/apache2/modules/mod_speling.so +LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so +LoadModule status_module /usr/lib/apache2/modules/mod_status.so +LoadModule substitute_module /usr/lib/apache2/modules/mod_substitute.so +LoadModule suexec_module /usr/lib/apache2/modules/mod_suexec.so +LoadModule unique_id_module /usr/lib/apache2/modules/mod_unique_id.so +LoadModule userdir_module /usr/lib/apache2/modules/mod_userdir.so +LoadModule usertrack_module /usr/lib/apache2/modules/mod_usertrack.so +LoadModule vhost_alias_module /usr/lib/apache2/modules/mod_vhost_alias.so +LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so +LoadModule xml2enc_module /usr/lib/apache2/modules/mod_xml2enc.so + + +User www-data +Group www-data + + +# 'Main' server configuration +ServerName SERVERNAME +ServerAdmin SERVERADMIN@SERVERNAME +ServerSignature On + + + AllowOverride none + Require all denied + + + + Options Indexes FollowSymLinks MultiViews ExecCGI Includes + AllowOverride All + Require all granted + + + + DirectoryIndex index.html index.html.var index.php index.cgi index.asp index.aspx index.pl index.aspx Default.aspx default.aspx index.shtml awstats.pl index.unknown.php index.default.php + + + + Require all denied + + +ErrorLog /var/log/apache2/error.log +LogLevel warn + + + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined + LogFormat "%h %l %u %t \"%r\" %>s %b" common + + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio + + CustomLog /var/log/apache2/access.log combined + + + + Alias /server-health /data/htdocs/www/server-health + Alias /server-health.json /data/htdocs/www/server-health.json + ScriptAlias /cgi-bin/ "/data/htdocs/cgi-bin/" + + + + AllowOverride None + Options ExecCGI + Require all granted + + + + #Scriptsock cgisock + + + + RequestHeader unset Proxy early + + + + TypesConfig /etc/apache2/mime.types + AddType application/x-gzip .tgz + AddEncoding x-compress .Z + AddEncoding x-gzip .gz .tgz + AddType application/x-compress .Z + AddType application/x-gzip .gz .tgz + AddHandler cgi-script .cgi + AddHandler type-map var + AddType text/html .shtml + AddOutputFilter INCLUDES .shtml + AddType application/x-ns-proxy-autoconfig .dat + + + + MIMEMagicFile /etc/apache2/magic + + + +DocumentRoot "/data/htdocs/www" + diff --git a/config/apache2/mime.types b/config/apache2/mime.types new file mode 100644 index 0000000..1a59fd6 --- /dev/null +++ b/config/apache2/mime.types @@ -0,0 +1,1855 @@ +# This file maps Internet media types to unique file extension(s). +# Although created for httpd, this file is used by many software systems +# and has been placed in the public domain for unlimited redisribution. +# +# The table below contains both registered and (common) unregistered types. +# A type that has no unique extension can be ignored -- they are listed +# here to guide configurations toward known types and to make it easier to +# identify "new" types. File extensions are also commonly used to indicate +# content languages and encodings, so choose them carefully. +# +# Internet media types should be registered as described in RFC 4288. +# The registry is at . +# +# MIME type (lowercased) Extensions +# ============================================ ========== +# application/1d-interleaved-parityfec +# application/3gpdash-qoe-report+xml +# application/3gpp-ims+xml +# application/a2l +# application/activemessage +# application/alto-costmap+json +# application/alto-costmapfilter+json +# application/alto-directory+json +# application/alto-endpointcost+json +# application/alto-endpointcostparams+json +# application/alto-endpointprop+json +# application/alto-endpointpropparams+json +# application/alto-error+json +# application/alto-networkmap+json +# application/alto-networkmapfilter+json +# application/aml +application/andrew-inset ez +# application/applefile +application/applixware aw +# application/atf +# application/atfx +application/atom+xml atom +application/atomcat+xml atomcat +# application/atomdeleted+xml +# application/atomicmail +application/atomsvc+xml atomsvc +# application/atxml +# application/auth-policy+xml +# application/bacnet-xdd+zip +# application/batch-smtp +# application/beep+xml +# application/calendar+json +# application/calendar+xml +# application/call-completion +# application/cals-1840 +# application/cbor +# application/ccmp+xml +application/ccxml+xml ccxml +# application/cdfx+xml +application/cdmi-capability cdmia +application/cdmi-container cdmic +application/cdmi-domain cdmid +application/cdmi-object cdmio +application/cdmi-queue cdmiq +# application/cdni +# application/cea +# application/cea-2018+xml +# application/cellml+xml +# application/cfw +# application/cms +# application/cnrp+xml +# application/coap-group+json +# application/commonground +# application/conference-info+xml +# application/cpl+xml +# application/csrattrs +# application/csta+xml +# application/cstadata+xml +# application/csvm+json +application/cu-seeme cu +# application/cybercash +# application/dash+xml +# application/dashdelta +application/davmount+xml davmount +# application/dca-rft +# application/dcd +# application/dec-dx +# application/dialog-info+xml +# application/dicom +# application/dii +# application/dit +# application/dns +application/docbook+xml dbk +# application/dskpp+xml +application/dssc+der dssc +application/dssc+xml xdssc +# application/dvcs +application/ecmascript ecma +# application/edi-consent +# application/edi-x12 +# application/edifact +# application/efi +# application/emergencycalldata.comment+xml +# application/emergencycalldata.deviceinfo+xml +# application/emergencycalldata.providerinfo+xml +# application/emergencycalldata.serviceinfo+xml +# application/emergencycalldata.subscriberinfo+xml +application/emma+xml emma +# application/emotionml+xml +# application/encaprtp +# application/epp+xml +application/epub+zip epub +# application/eshop +# application/example +application/exi exi +# application/fastinfoset +# application/fastsoap +# application/fdt+xml +# application/fits +application/font-tdpfr pfr +# application/framework-attributes+xml +# application/geo+json +application/gml+xml gml +application/gpx+xml gpx +application/gxf gxf +# application/gzip +# application/h224 +# application/held+xml +# application/http +application/hyperstudio stk +# application/ibe-key-request+xml +# application/ibe-pkg-reply+xml +# application/ibe-pp-data +# application/iges +# application/im-iscomposing+xml +# application/index +# application/index.cmd +# application/index.obj +# application/index.response +# application/index.vnd +application/inkml+xml ink inkml +# application/iotp +application/ipfix ipfix +# application/ipp +# application/isup +# application/its+xml +application/java-archive jar +application/java-serialized-object ser +application/java-vm class +application/javascript js +# application/jose +# application/jose+json +# application/jrd+json +application/json json +# application/json-patch+json +# application/json-seq +application/jsonml+json jsonml +# application/jwk+json +# application/jwk-set+json +# application/jwt +# application/kpml-request+xml +# application/kpml-response+xml +# application/ld+json +# application/lgr+xml +# application/link-format +# application/load-control+xml +application/lost+xml lostxml +# application/lostsync+xml +# application/lxf +application/mac-binhex40 hqx +application/mac-compactpro cpt +# application/macwriteii +application/mads+xml mads +application/marc mrc +application/marcxml+xml mrcx +application/mathematica ma nb mb +application/mathml+xml mathml +# application/mathml-content+xml +# application/mathml-presentation+xml +# application/mbms-associated-procedure-description+xml +# application/mbms-deregister+xml +# application/mbms-envelope+xml +# application/mbms-msk+xml +# application/mbms-msk-response+xml +# application/mbms-protection-description+xml +# application/mbms-reception-report+xml +# application/mbms-register+xml +# application/mbms-register-response+xml +# application/mbms-schedule+xml +# application/mbms-user-service-description+xml +application/mbox mbox +# application/media-policy-dataset+xml +# application/media_control+xml +application/mediaservercontrol+xml mscml +# application/merge-patch+json +application/metalink+xml metalink +application/metalink4+xml meta4 +application/mets+xml mets +# application/mf4 +# application/mikey +application/mods+xml mods +# application/moss-keys +# application/moss-signature +# application/mosskey-data +# application/mosskey-request +application/mp21 m21 mp21 +application/mp4 mp4s +# application/mpeg4-generic +# application/mpeg4-iod +# application/mpeg4-iod-xmt +# application/mrb-consumer+xml +# application/mrb-publish+xml +# application/msc-ivr+xml +# application/msc-mixer+xml +application/msword doc dot +application/mxf mxf +# application/nasdata +# application/news-checkgroups +# application/news-groupinfo +# application/news-transmission +# application/nlsml+xml +# application/nss +# application/ocsp-request +# application/ocsp-response +application/octet-stream bin dms lrf mar so dist distz pkg bpk dump elc deploy +application/oda oda +# application/odx +application/oebps-package+xml opf +application/ogg ogx +application/omdoc+xml omdoc +application/onenote onetoc onetoc2 onetmp onepkg +application/oxps oxps +# application/p2p-overlay+xml +# application/parityfec +application/patch-ops-error+xml xer +application/pdf pdf +# application/pdx +application/pgp-encrypted pgp +# application/pgp-keys +application/pgp-signature asc sig +application/pics-rules prf +# application/pidf+xml +# application/pidf-diff+xml +application/pkcs10 p10 +# application/pkcs12 +application/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +application/pkcs8 p8 +application/pkix-attr-cert ac +application/pkix-cert cer +application/pkix-crl crl +application/pkix-pkipath pkipath +application/pkixcmp pki +application/pls+xml pls +# application/poc-settings+xml +application/postscript ai eps ps +# application/ppsp-tracker+json +# application/problem+json +# application/problem+xml +# application/provenance+xml +# application/prs.alvestrand.titrax-sheet +application/prs.cww cww +# application/prs.hpub+zip +# application/prs.nprend +# application/prs.plucker +# application/prs.rdf-xml-crypt +# application/prs.xsf+xml +application/pskc+xml pskcxml +# application/qsig +# application/raptorfec +# application/rdap+json +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +# application/remote-printing +# application/reputon+json +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +# application/rfc+xml +# application/riscos +# application/rlmi+xml +application/rls-services+xml rs +application/rpki-ghostbusters gbr +application/rpki-manifest mft +application/rpki-roa roa +# application/rpki-updown +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +# application/rtploopback +# application/rtx +# application/samlassertion+xml +# application/samlmetadata+xml +application/sbml+xml sbml +# application/scaip+xml +# application/scim+json +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +# application/sep+xml +# application/sep-exi +# application/session-info +# application/set-payment +application/set-payment-initiation setpay +# application/set-registration +application/set-registration-initiation setreg +# application/sgml +# application/sgml-open-catalog +application/shf+xml shf +# application/sieve +# application/simple-filter+xml +# application/simple-message-summary +# application/simplesymbolcontainer +# application/slate +# application/smil +application/smil+xml smi smil +# application/smpte336m +# application/soap+fastinfoset +# application/soap+xml +application/sparql-query rq +application/sparql-results+xml srx +# application/spirits-event+xml +# application/sql +application/srgs gram +application/srgs+xml grxml +application/sru+xml sru +application/ssdl+xml ssdl +application/ssml+xml ssml +# application/tamp-apex-update +# application/tamp-apex-update-confirm +# application/tamp-community-update +# application/tamp-community-update-confirm +# application/tamp-error +# application/tamp-sequence-adjust +# application/tamp-sequence-adjust-confirm +# application/tamp-status-query +# application/tamp-status-response +# application/tamp-update +# application/tamp-update-confirm +application/tei+xml tei teicorpus +application/thraud+xml tfi +# application/timestamp-query +# application/timestamp-reply +application/timestamped-data tsd +# application/ttml+xml +# application/tve-trigger +# application/ulpfec +# application/urc-grpsheet+xml +# application/urc-ressheet+xml +# application/urc-targetdesc+xml +# application/urc-uisocketdesc+xml +# application/vcard+json +# application/vcard+xml +# application/vemmi +# application/vividence.scriptfile +# application/vnd.3gpp-prose+xml +# application/vnd.3gpp-prose-pc3ch+xml +# application/vnd.3gpp.access-transfer-events+xml +# application/vnd.3gpp.bsf+xml +# application/vnd.3gpp.mid-call+xml +application/vnd.3gpp.pic-bw-large plb +application/vnd.3gpp.pic-bw-small psb +application/vnd.3gpp.pic-bw-var pvb +# application/vnd.3gpp.sms +# application/vnd.3gpp.sms+xml +# application/vnd.3gpp.srvcc-ext+xml +# application/vnd.3gpp.srvcc-info+xml +# application/vnd.3gpp.state-and-event-info+xml +# application/vnd.3gpp.ussd+xml +# application/vnd.3gpp2.bcmcsinfo+xml +# application/vnd.3gpp2.sms +application/vnd.3gpp2.tcap tcap +# application/vnd.3lightssoftware.imagescal +application/vnd.3m.post-it-notes pwn +application/vnd.accpac.simply.aso aso +application/vnd.accpac.simply.imp imp +application/vnd.acucobol acu +application/vnd.acucorp atc acutc +application/vnd.adobe.air-application-installer-package+zip air +# application/vnd.adobe.flash.movie +application/vnd.adobe.formscentral.fcdt fcdt +application/vnd.adobe.fxp fxp fxpl +# application/vnd.adobe.partial-upload +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +# application/vnd.aether.imp +# application/vnd.ah-barcode +application/vnd.ahead.space ahead +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +# application/vnd.amazon.mobi8-ebook +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +# application/vnd.amundsen.maze+xml +application/vnd.android.package-archive apk +# application/vnd.anki +application/vnd.anser-web-certificate-issue-initiation cii +application/vnd.anser-web-funds-transfer-initiation fti +application/vnd.antix.game-component atx +# application/vnd.apache.thrift.binary +# application/vnd.apache.thrift.compact +# application/vnd.apache.thrift.json +# application/vnd.api+json +application/vnd.apple.installer+xml mpkg +application/vnd.apple.mpegurl m3u8 +# application/vnd.arastra.swi +application/vnd.aristanetworks.swi swi +# application/vnd.artsquare +application/vnd.astraea-software.iota iota +application/vnd.audiograph aep +# application/vnd.autopackage +# application/vnd.avistar+xml +# application/vnd.balsamiq.bmml+xml +# application/vnd.balsamiq.bmpr +# application/vnd.bekitzur-stech+json +# application/vnd.biopax.rdf+xml +application/vnd.blueice.multipass mpm +# application/vnd.bluetooth.ep.oob +# application/vnd.bluetooth.le.oob +application/vnd.bmi bmi +application/vnd.businessobjects rep +# application/vnd.cab-jscript +# application/vnd.canon-cpdl +# application/vnd.canon-lips +# application/vnd.cendio.thinlinc.clientconf +# application/vnd.century-systems.tcp_stream +application/vnd.chemdraw+xml cdxml +# application/vnd.chess-pgn +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +# application/vnd.cirpack.isdn-ext +# application/vnd.citationstyles.style+xml +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +application/vnd.cluetrust.cartomobile-config c11amc +application/vnd.cluetrust.cartomobile-config-pkg c11amz +# application/vnd.coffeescript +# application/vnd.collection+json +# application/vnd.collection.doc+json +# application/vnd.collection.next+json +# application/vnd.comicbook+zip +# application/vnd.commerce-battelle +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +# application/vnd.coreos.ignition+json +application/vnd.cosmocaller cmc +application/vnd.crick.clicker clkx +application/vnd.crick.clicker.keyboard clkk +application/vnd.crick.clicker.palette clkp +application/vnd.crick.clicker.template clkt +application/vnd.crick.clicker.wordbank clkw +application/vnd.criticaltools.wbs+xml wbs +application/vnd.ctc-posml pml +# application/vnd.ctct.ws+xml +# application/vnd.cups-pdf +# application/vnd.cups-postscript +application/vnd.cups-ppd ppd +# application/vnd.cups-raster +# application/vnd.cups-raw +# application/vnd.curl +application/vnd.curl.car car +application/vnd.curl.pcurl pcurl +# application/vnd.cyan.dean.root+xml +# application/vnd.cybank +application/vnd.dart dart +application/vnd.data-vision.rdz rdz +# application/vnd.debian.binary-package +application/vnd.dece.data uvf uvvf uvd uvvd +application/vnd.dece.ttml+xml uvt uvvt +application/vnd.dece.unspecified uvx uvvx +application/vnd.dece.zip uvz uvvz +application/vnd.denovo.fcselayout-link fe_launch +# application/vnd.desmume.movie +# application/vnd.dir-bi.plate-dl-nosuffix +# application/vnd.dm.delegation+xml +application/vnd.dna dna +# application/vnd.document+json +application/vnd.dolby.mlp mlp +# application/vnd.dolby.mobile.1 +# application/vnd.dolby.mobile.2 +# application/vnd.doremir.scorecloud-binary-document +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +# application/vnd.drive+json +application/vnd.ds-keypoint kpxx +# application/vnd.dtg.local +# application/vnd.dtg.local.flash +# application/vnd.dtg.local.html +application/vnd.dvb.ait ait +# application/vnd.dvb.dvbj +# application/vnd.dvb.esgcontainer +# application/vnd.dvb.ipdcdftnotifaccess +# application/vnd.dvb.ipdcesgaccess +# application/vnd.dvb.ipdcesgaccess2 +# application/vnd.dvb.ipdcesgpdd +# application/vnd.dvb.ipdcroaming +# application/vnd.dvb.iptv.alfec-base +# application/vnd.dvb.iptv.alfec-enhancement +# application/vnd.dvb.notif-aggregate-root+xml +# application/vnd.dvb.notif-container+xml +# application/vnd.dvb.notif-generic+xml +# application/vnd.dvb.notif-ia-msglist+xml +# application/vnd.dvb.notif-ia-registration-request+xml +# application/vnd.dvb.notif-ia-registration-response+xml +# application/vnd.dvb.notif-init+xml +# application/vnd.dvb.pfr +application/vnd.dvb.service svc +# application/vnd.dxr +application/vnd.dynageo geo +# application/vnd.dzr +# application/vnd.easykaraoke.cdgdownload +# application/vnd.ecdis-update +application/vnd.ecowin.chart mag +# application/vnd.ecowin.filerequest +# application/vnd.ecowin.fileupdate +# application/vnd.ecowin.series +# application/vnd.ecowin.seriesrequest +# application/vnd.ecowin.seriesupdate +# application/vnd.emclient.accessrequest+xml +application/vnd.enliven nml +# application/vnd.enphase.envoy +# application/vnd.eprints.data+xml +application/vnd.epson.esf esf +application/vnd.epson.msf msf +application/vnd.epson.quickanime qam +application/vnd.epson.salt slt +application/vnd.epson.ssf ssf +# application/vnd.ericsson.quickcall +application/vnd.eszigno3+xml es3 et3 +# application/vnd.etsi.aoc+xml +# application/vnd.etsi.asic-e+zip +# application/vnd.etsi.asic-s+zip +# application/vnd.etsi.cug+xml +# application/vnd.etsi.iptvcommand+xml +# application/vnd.etsi.iptvdiscovery+xml +# application/vnd.etsi.iptvprofile+xml +# application/vnd.etsi.iptvsad-bc+xml +# application/vnd.etsi.iptvsad-cod+xml +# application/vnd.etsi.iptvsad-npvr+xml +# application/vnd.etsi.iptvservice+xml +# application/vnd.etsi.iptvsync+xml +# application/vnd.etsi.iptvueprofile+xml +# application/vnd.etsi.mcid+xml +# application/vnd.etsi.mheg5 +# application/vnd.etsi.overload-control-policy-dataset+xml +# application/vnd.etsi.pstn+xml +# application/vnd.etsi.sci+xml +# application/vnd.etsi.simservs+xml +# application/vnd.etsi.timestamp-token +# application/vnd.etsi.tsl+xml +# application/vnd.etsi.tsl.der +# application/vnd.eudora.data +application/vnd.ezpix-album ez2 +application/vnd.ezpix-package ez3 +# application/vnd.f-secure.mobile +# application/vnd.fastcopy-disk-image +application/vnd.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed seed dataless +# application/vnd.ffsns +# application/vnd.filmit.zfc +# application/vnd.fints +# application/vnd.firemonkeys.cloudcell +application/vnd.flographit gph +application/vnd.fluxtime.clip ftc +# application/vnd.font-fontforge-sfd +application/vnd.framemaker fm frame maker book +application/vnd.frogans.fnc fnc +application/vnd.frogans.ltf ltf +application/vnd.fsc.weblaunch fsc +application/vnd.fujitsu.oasys oas +application/vnd.fujitsu.oasys2 oa2 +application/vnd.fujitsu.oasys3 oa3 +application/vnd.fujitsu.oasysgp fg5 +application/vnd.fujitsu.oasysprs bh2 +# application/vnd.fujixerox.art-ex +# application/vnd.fujixerox.art4 +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +# application/vnd.fujixerox.docuworks.container +# application/vnd.fujixerox.hbpl +# application/vnd.fut-misnet +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +# application/vnd.geo+json +# application/vnd.geocube+xml +application/vnd.geogebra.file ggb +application/vnd.geogebra.tool ggt +application/vnd.geometry-explorer gex gre +application/vnd.geonext gxt +application/vnd.geoplan g2w +application/vnd.geospace g3w +# application/vnd.gerber +# application/vnd.globalplatform.card-content-mgt +# application/vnd.globalplatform.card-content-mgt-response +application/vnd.gmx gmx +application/vnd.google-earth.kml+xml kml +application/vnd.google-earth.kmz kmz +# application/vnd.gov.sk.e-form+xml +# application/vnd.gov.sk.e-form+zip +# application/vnd.gov.sk.xmldatacontainer+xml +application/vnd.grafeq gqf gqs +# application/vnd.gridmp +application/vnd.groove-account gac +application/vnd.groove-help ghf +application/vnd.groove-identity-message gim +application/vnd.groove-injector grv +application/vnd.groove-tool-message gtm +application/vnd.groove-tool-template tpl +application/vnd.groove-vcard vcg +# application/vnd.hal+json +application/vnd.hal+xml hal +application/vnd.handheld-entertainment+xml zmm +application/vnd.hbci hbci +# application/vnd.hcl-bireports +# application/vnd.hdt +# application/vnd.heroku+json +application/vnd.hhe.lesson-player les +application/vnd.hp-hpgl hpgl +application/vnd.hp-hpid hpid +application/vnd.hp-hps hps +application/vnd.hp-jlyt jlt +application/vnd.hp-pcl pcl +application/vnd.hp-pclxl pclxl +# application/vnd.httphone +application/vnd.hydrostatix.sof-data sfd-hdstx +# application/vnd.hyperdrive+json +# application/vnd.hzn-3d-crossword +# application/vnd.ibm.afplinedata +# application/vnd.ibm.electronic-media +application/vnd.ibm.minipay mpy +application/vnd.ibm.modcap afp listafp list3820 +application/vnd.ibm.rights-management irm +application/vnd.ibm.secure-container sc +application/vnd.iccprofile icc icm +# application/vnd.ieee.1905 +application/vnd.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +# application/vnd.ims.imsccv1p1 +# application/vnd.ims.imsccv1p2 +# application/vnd.ims.imsccv1p3 +# application/vnd.ims.lis.v2.result+json +# application/vnd.ims.lti.v2.toolconsumerprofile+json +# application/vnd.ims.lti.v2.toolproxy+json +# application/vnd.ims.lti.v2.toolproxy.id+json +# application/vnd.ims.lti.v2.toolsettings+json +# application/vnd.ims.lti.v2.toolsettings.simple+json +# application/vnd.informedcontrol.rms+xml +# application/vnd.informix-visionary +# application/vnd.infotech.project +# application/vnd.infotech.project+xml +# application/vnd.innopath.wamp.notification +application/vnd.insors.igm igm +application/vnd.intercon.formnet xpw xpx +application/vnd.intergeo i2g +# application/vnd.intertrust.digibox +# application/vnd.intertrust.nncp +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +# application/vnd.iptc.g2.catalogitem+xml +# application/vnd.iptc.g2.conceptitem+xml +# application/vnd.iptc.g2.knowledgeitem+xml +# application/vnd.iptc.g2.newsitem+xml +# application/vnd.iptc.g2.newsmessage+xml +# application/vnd.iptc.g2.packageitem+xml +# application/vnd.iptc.g2.planningitem+xml +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +application/vnd.isac.fcs fcs +application/vnd.jam jam +# application/vnd.japannet-directory-service +# application/vnd.japannet-jpnstore-wakeup +# application/vnd.japannet-payment-wakeup +# application/vnd.japannet-registration +# application/vnd.japannet-registration-wakeup +# application/vnd.japannet-setstore-wakeup +# application/vnd.japannet-verification +# application/vnd.japannet-verification-wakeup +application/vnd.jcp.javame.midlet-rms rms +application/vnd.jisp jisp +application/vnd.joost.joda-archive joda +# application/vnd.jsk.isdn-ngn +application/vnd.kahootz ktz ktr +application/vnd.kde.karbon karbon +application/vnd.kde.kchart chrt +application/vnd.kde.kformula kfo +application/vnd.kde.kivio flw +application/vnd.kde.kontour kon +application/vnd.kde.kpresenter kpr kpt +application/vnd.kde.kspread ksp +application/vnd.kde.kword kwd kwt +application/vnd.kenameaapp htke +application/vnd.kidspiration kia +application/vnd.kinar kne knp +application/vnd.koan skp skd skt skm +application/vnd.kodak-descriptor sse +application/vnd.las.las+xml lasxml +# application/vnd.liberty-request+xml +application/vnd.llamagraphics.life-balance.desktop lbd +application/vnd.llamagraphics.life-balance.exchange+xml lbe +application/vnd.lotus-1-2-3 123 +application/vnd.lotus-approach apr +application/vnd.lotus-freelance pre +application/vnd.lotus-notes nsf +application/vnd.lotus-organizer org +application/vnd.lotus-screencam scm +application/vnd.lotus-wordpro lwp +application/vnd.macports.portpkg portpkg +# application/vnd.mapbox-vector-tile +# application/vnd.marlin.drm.actiontoken+xml +# application/vnd.marlin.drm.conftoken+xml +# application/vnd.marlin.drm.license+xml +# application/vnd.marlin.drm.mdcf +# application/vnd.mason+json +# application/vnd.maxmind.maxmind-db +application/vnd.mcd mcd +application/vnd.medcalcdata mc1 +application/vnd.mediastation.cdkey cdkey +# application/vnd.meridian-slingshot +application/vnd.mfer mwf +application/vnd.mfmp mfm +# application/vnd.micro+json +application/vnd.micrografx.flo flo +application/vnd.micrografx.igx igx +# application/vnd.microsoft.portable-executable +# application/vnd.miele+json +application/vnd.mif mif +# application/vnd.minisoft-hp3000-save +# application/vnd.mitsubishi.misty-guard.trustweb +application/vnd.mobius.daf daf +application/vnd.mobius.dis dis +application/vnd.mobius.mbk mbk +application/vnd.mobius.mqy mqy +application/vnd.mobius.msl msl +application/vnd.mobius.plc plc +application/vnd.mobius.txf txf +application/vnd.mophun.application mpn +application/vnd.mophun.certificate mpc +# application/vnd.motorola.flexsuite +# application/vnd.motorola.flexsuite.adsi +# application/vnd.motorola.flexsuite.fis +# application/vnd.motorola.flexsuite.gotap +# application/vnd.motorola.flexsuite.kmr +# application/vnd.motorola.flexsuite.ttc +# application/vnd.motorola.flexsuite.wem +# application/vnd.motorola.iprm +application/vnd.mozilla.xul+xml xul +# application/vnd.ms-3mfdocument +application/vnd.ms-artgalry cil +# application/vnd.ms-asf +application/vnd.ms-cab-compressed cab +# application/vnd.ms-color.iccprofile +application/vnd.ms-excel xls xlm xla xlc xlt xlw +application/vnd.ms-excel.addin.macroenabled.12 xlam +application/vnd.ms-excel.sheet.binary.macroenabled.12 xlsb +application/vnd.ms-excel.sheet.macroenabled.12 xlsm +application/vnd.ms-excel.template.macroenabled.12 xltm +application/vnd.ms-fontobject eot +application/vnd.ms-htmlhelp chm +application/vnd.ms-ims ims +application/vnd.ms-lrm lrm +# application/vnd.ms-office.activex+xml +application/vnd.ms-officetheme thmx +# application/vnd.ms-opentype +# application/vnd.ms-package.obfuscated-opentype +application/vnd.ms-pki.seccat cat +application/vnd.ms-pki.stl stl +# application/vnd.ms-playready.initiator+xml +application/vnd.ms-powerpoint ppt pps pot +application/vnd.ms-powerpoint.addin.macroenabled.12 ppam +application/vnd.ms-powerpoint.presentation.macroenabled.12 pptm +application/vnd.ms-powerpoint.slide.macroenabled.12 sldm +application/vnd.ms-powerpoint.slideshow.macroenabled.12 ppsm +application/vnd.ms-powerpoint.template.macroenabled.12 potm +# application/vnd.ms-printdevicecapabilities+xml +# application/vnd.ms-printing.printticket+xml +# application/vnd.ms-printschematicket+xml +application/vnd.ms-project mpp mpt +# application/vnd.ms-tnef +# application/vnd.ms-windows.devicepairing +# application/vnd.ms-windows.nwprinting.oob +# application/vnd.ms-windows.printerpairing +# application/vnd.ms-windows.wsd.oob +# application/vnd.ms-wmdrm.lic-chlg-req +# application/vnd.ms-wmdrm.lic-resp +# application/vnd.ms-wmdrm.meter-chlg-req +# application/vnd.ms-wmdrm.meter-resp +application/vnd.ms-word.document.macroenabled.12 docm +application/vnd.ms-word.template.macroenabled.12 dotm +application/vnd.ms-works wps wks wcm wdb +application/vnd.ms-wpl wpl +application/vnd.ms-xpsdocument xps +# application/vnd.msa-disk-image +application/vnd.mseq mseq +# application/vnd.msign +# application/vnd.multiad.creator +# application/vnd.multiad.creator.cif +# application/vnd.music-niff +application/vnd.musician mus +application/vnd.muvee.style msty +application/vnd.mynfc taglet +# application/vnd.ncd.control +# application/vnd.ncd.reference +# application/vnd.nervana +# application/vnd.netfpx +application/vnd.neurolanguage.nlu nlu +# application/vnd.nintendo.nitro.rom +# application/vnd.nintendo.snes.rom +application/vnd.nitf ntf nitf +application/vnd.noblenet-directory nnd +application/vnd.noblenet-sealer nns +application/vnd.noblenet-web nnw +# application/vnd.nokia.catalogs +# application/vnd.nokia.conml+wbxml +# application/vnd.nokia.conml+xml +# application/vnd.nokia.iptv.config+xml +# application/vnd.nokia.isds-radio-presets +# application/vnd.nokia.landmark+wbxml +# application/vnd.nokia.landmark+xml +# application/vnd.nokia.landmarkcollection+xml +# application/vnd.nokia.n-gage.ac+xml +application/vnd.nokia.n-gage.data ngdat +application/vnd.nokia.n-gage.symbian.install n-gage +# application/vnd.nokia.ncd +# application/vnd.nokia.pcd+wbxml +# application/vnd.nokia.pcd+xml +application/vnd.nokia.radio-preset rpst +application/vnd.nokia.radio-presets rpss +application/vnd.novadigm.edm edm +application/vnd.novadigm.edx edx +application/vnd.novadigm.ext ext +# application/vnd.ntt-local.content-share +# application/vnd.ntt-local.file-transfer +# application/vnd.ntt-local.ogw_remote-access +# application/vnd.ntt-local.sip-ta_remote +# application/vnd.ntt-local.sip-ta_tcp_stream +application/vnd.oasis.opendocument.chart odc +application/vnd.oasis.opendocument.chart-template otc +application/vnd.oasis.opendocument.database odb +application/vnd.oasis.opendocument.formula odf +application/vnd.oasis.opendocument.formula-template odft +application/vnd.oasis.opendocument.graphics odg +application/vnd.oasis.opendocument.graphics-template otg +application/vnd.oasis.opendocument.image odi +application/vnd.oasis.opendocument.image-template oti +application/vnd.oasis.opendocument.presentation odp +application/vnd.oasis.opendocument.presentation-template otp +application/vnd.oasis.opendocument.spreadsheet ods +application/vnd.oasis.opendocument.spreadsheet-template ots +application/vnd.oasis.opendocument.text odt +application/vnd.oasis.opendocument.text-master odm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +# application/vnd.obn +# application/vnd.oftn.l10n+json +# application/vnd.oipf.contentaccessdownload+xml +# application/vnd.oipf.contentaccessstreaming+xml +# application/vnd.oipf.cspg-hexbinary +# application/vnd.oipf.dae.svg+xml +# application/vnd.oipf.dae.xhtml+xml +# application/vnd.oipf.mippvcontrolmessage+xml +# application/vnd.oipf.pae.gem +# application/vnd.oipf.spdiscovery+xml +# application/vnd.oipf.spdlist+xml +# application/vnd.oipf.ueprofile+xml +# application/vnd.oipf.userprofile+xml +application/vnd.olpc-sugar xo +# application/vnd.oma-scws-config +# application/vnd.oma-scws-http-request +# application/vnd.oma-scws-http-response +# application/vnd.oma.bcast.associated-procedure-parameter+xml +# application/vnd.oma.bcast.drm-trigger+xml +# application/vnd.oma.bcast.imd+xml +# application/vnd.oma.bcast.ltkm +# application/vnd.oma.bcast.notification+xml +# application/vnd.oma.bcast.provisioningtrigger +# application/vnd.oma.bcast.sgboot +# application/vnd.oma.bcast.sgdd+xml +# application/vnd.oma.bcast.sgdu +# application/vnd.oma.bcast.simple-symbol-container +# application/vnd.oma.bcast.smartcard-trigger+xml +# application/vnd.oma.bcast.sprov+xml +# application/vnd.oma.bcast.stkm +# application/vnd.oma.cab-address-book+xml +# application/vnd.oma.cab-feature-handler+xml +# application/vnd.oma.cab-pcc+xml +# application/vnd.oma.cab-subs-invite+xml +# application/vnd.oma.cab-user-prefs+xml +# application/vnd.oma.dcd +# application/vnd.oma.dcdc +application/vnd.oma.dd2+xml dd2 +# application/vnd.oma.drm.risd+xml +# application/vnd.oma.group-usage-list+xml +# application/vnd.oma.lwm2m+json +# application/vnd.oma.lwm2m+tlv +# application/vnd.oma.pal+xml +# application/vnd.oma.poc.detailed-progress-report+xml +# application/vnd.oma.poc.final-report+xml +# application/vnd.oma.poc.groups+xml +# application/vnd.oma.poc.invocation-descriptor+xml +# application/vnd.oma.poc.optimized-progress-report+xml +# application/vnd.oma.push +# application/vnd.oma.scidm.messages+xml +# application/vnd.oma.xcap-directory+xml +# application/vnd.omads-email+xml +# application/vnd.omads-file+xml +# application/vnd.omads-folder+xml +# application/vnd.omaloc-supl-init +# application/vnd.onepager +# application/vnd.openblox.game+xml +# application/vnd.openblox.game-binary +# application/vnd.openeye.oeb +application/vnd.openofficeorg.extension oxt +# application/vnd.openxmlformats-officedocument.custom-properties+xml +# application/vnd.openxmlformats-officedocument.customxmlproperties+xml +# application/vnd.openxmlformats-officedocument.drawing+xml +# application/vnd.openxmlformats-officedocument.drawingml.chart+xml +# application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml +# application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml +# application/vnd.openxmlformats-officedocument.extended-properties+xml +# application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml +# application/vnd.openxmlformats-officedocument.presentationml.comments+xml +# application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml +# application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml +application/vnd.openxmlformats-officedocument.presentationml.presentation pptx +# application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.presprops+xml +application/vnd.openxmlformats-officedocument.presentationml.slide sldx +# application/vnd.openxmlformats-officedocument.presentationml.slide+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml +# application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml +application/vnd.openxmlformats-officedocument.presentationml.slideshow ppsx +# application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml +# application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml +# application/vnd.openxmlformats-officedocument.presentationml.tags+xml +application/vnd.openxmlformats-officedocument.presentationml.template potx +# application/vnd.openxmlformats-officedocument.presentationml.template.main+xml +# application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml +application/vnd.openxmlformats-officedocument.spreadsheetml.template xltx +# application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml +# application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml +# application/vnd.openxmlformats-officedocument.theme+xml +# application/vnd.openxmlformats-officedocument.themeoverride+xml +# application/vnd.openxmlformats-officedocument.vmldrawing +# application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.document docx +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml +application/vnd.openxmlformats-officedocument.wordprocessingml.template dotx +# application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml +# application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml +# application/vnd.openxmlformats-package.core-properties+xml +# application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml +# application/vnd.openxmlformats-package.relationships+xml +# application/vnd.oracle.resource+json +# application/vnd.orange.indata +# application/vnd.osa.netdeploy +application/vnd.osgeo.mapguide.package mgp +# application/vnd.osgi.bundle +application/vnd.osgi.dp dp +application/vnd.osgi.subsystem esa +# application/vnd.otps.ct-kip+xml +# application/vnd.oxli.countgraph +# application/vnd.pagerduty+json +application/vnd.palm pdb pqa oprc +# application/vnd.panoply +# application/vnd.paos.xml +application/vnd.pawaafile paw +# application/vnd.pcos +application/vnd.pg.format str +application/vnd.pg.osasli ei6 +# application/vnd.piaccess.application-licence +application/vnd.picsel efif +application/vnd.pmi.widget wg +# application/vnd.poc.group-advertisement+xml +application/vnd.pocketlearn plf +application/vnd.powerbuilder6 pbd +# application/vnd.powerbuilder6-s +# application/vnd.powerbuilder7 +# application/vnd.powerbuilder7-s +# application/vnd.powerbuilder75 +# application/vnd.powerbuilder75-s +# application/vnd.preminet +application/vnd.previewsystems.box box +application/vnd.proteus.magazine mgz +application/vnd.publishare-delta-tree qps +application/vnd.pvi.ptid1 ptid +# application/vnd.pwg-multiplexed +# application/vnd.pwg-xhtml-print+xml +# application/vnd.qualcomm.brew-app-res +# application/vnd.quarantainenet +application/vnd.quark.quarkxpress qxd qxt qwd qwt qxl qxb +# application/vnd.quobject-quoxdocument +# application/vnd.radisys.moml+xml +# application/vnd.radisys.msml+xml +# application/vnd.radisys.msml-audit+xml +# application/vnd.radisys.msml-audit-conf+xml +# application/vnd.radisys.msml-audit-conn+xml +# application/vnd.radisys.msml-audit-dialog+xml +# application/vnd.radisys.msml-audit-stream+xml +# application/vnd.radisys.msml-conf+xml +# application/vnd.radisys.msml-dialog+xml +# application/vnd.radisys.msml-dialog-base+xml +# application/vnd.radisys.msml-dialog-fax-detect+xml +# application/vnd.radisys.msml-dialog-fax-sendrecv+xml +# application/vnd.radisys.msml-dialog-group+xml +# application/vnd.radisys.msml-dialog-speech+xml +# application/vnd.radisys.msml-dialog-transform+xml +# application/vnd.rainstor.data +# application/vnd.rapid +# application/vnd.rar +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +# application/vnd.renlearn.rlprint +application/vnd.rig.cryptonote cryptonote +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.rn-realmedia-vbr rmvb +application/vnd.route66.link66+xml link66 +# application/vnd.rs-274x +# application/vnd.ruckus.download +# application/vnd.s3sms +application/vnd.sailingtracker.track st +# application/vnd.sbm.cid +# application/vnd.sbm.mid2 +# application/vnd.scribus +# application/vnd.sealed.3df +# application/vnd.sealed.csf +# application/vnd.sealed.doc +# application/vnd.sealed.eml +# application/vnd.sealed.mht +# application/vnd.sealed.net +# application/vnd.sealed.ppt +# application/vnd.sealed.tiff +# application/vnd.sealed.xls +# application/vnd.sealedmedia.softseal.html +# application/vnd.sealedmedia.softseal.pdf +application/vnd.seemail see +application/vnd.sema sema +application/vnd.semd semd +application/vnd.semf semf +application/vnd.shana.informed.formdata ifm +application/vnd.shana.informed.formtemplate itp +application/vnd.shana.informed.interchange iif +application/vnd.shana.informed.package ipk +application/vnd.simtech-mindmapper twd twds +# application/vnd.siren+json +application/vnd.smaf mmf +# application/vnd.smart.notebook +application/vnd.smart.teacher teacher +# application/vnd.software602.filler.form+xml +# application/vnd.software602.filler.form-xml-zip +application/vnd.solent.sdkm+xml sdkm sdkd +application/vnd.spotfire.dxp dxp +application/vnd.spotfire.sfs sfs +# application/vnd.sss-cod +# application/vnd.sss-dtf +# application/vnd.sss-ntf +application/vnd.stardivision.calc sdc +application/vnd.stardivision.draw sda +application/vnd.stardivision.impress sdd +application/vnd.stardivision.math smf +application/vnd.stardivision.writer sdw vor +application/vnd.stardivision.writer-global sgl +application/vnd.stepmania.package smzip +application/vnd.stepmania.stepchart sm +# application/vnd.street-stream +# application/vnd.sun.wadl+xml +application/vnd.sun.xml.calc sxc +application/vnd.sun.xml.calc.template stc +application/vnd.sun.xml.draw sxd +application/vnd.sun.xml.draw.template std +application/vnd.sun.xml.impress sxi +application/vnd.sun.xml.impress.template sti +application/vnd.sun.xml.math sxm +application/vnd.sun.xml.writer sxw +application/vnd.sun.xml.writer.global sxg +application/vnd.sun.xml.writer.template stw +application/vnd.sus-calendar sus susp +application/vnd.svd svd +# application/vnd.swiftview-ics +application/vnd.symbian.install sis sisx +application/vnd.syncml+xml xsm +application/vnd.syncml.dm+wbxml bdm +application/vnd.syncml.dm+xml xdm +# application/vnd.syncml.dm.notification +# application/vnd.syncml.dmddf+wbxml +# application/vnd.syncml.dmddf+xml +# application/vnd.syncml.dmtnds+wbxml +# application/vnd.syncml.dmtnds+xml +# application/vnd.syncml.ds.notification +application/vnd.tao.intent-module-archive tao +application/vnd.tcpdump.pcap pcap cap dmp +# application/vnd.tmd.mediaflex.api+xml +# application/vnd.tml +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +# application/vnd.truedoc +# application/vnd.ubisoft.webplayer +application/vnd.ufdl ufd ufdl +application/vnd.uiq.theme utz +application/vnd.umajin umj +application/vnd.unity unityweb +application/vnd.uoml+xml uoml +# application/vnd.uplanet.alert +# application/vnd.uplanet.alert-wbxml +# application/vnd.uplanet.bearer-choice +# application/vnd.uplanet.bearer-choice-wbxml +# application/vnd.uplanet.cacheop +# application/vnd.uplanet.cacheop-wbxml +# application/vnd.uplanet.channel +# application/vnd.uplanet.channel-wbxml +# application/vnd.uplanet.list +# application/vnd.uplanet.list-wbxml +# application/vnd.uplanet.listcmd +# application/vnd.uplanet.listcmd-wbxml +# application/vnd.uplanet.signal +# application/vnd.uri-map +# application/vnd.valve.source.material +application/vnd.vcx vcx +# application/vnd.vd-study +# application/vnd.vectorworks +# application/vnd.vel+json +# application/vnd.verimatrix.vcas +# application/vnd.vidsoft.vidconference +application/vnd.visio vsd vst vss vsw +application/vnd.visionary vis +# application/vnd.vividence.scriptfile +application/vnd.vsf vsf +# application/vnd.wap.sic +# application/vnd.wap.slc +application/vnd.wap.wbxml wbxml +application/vnd.wap.wmlc wmlc +application/vnd.wap.wmlscriptc wmlsc +application/vnd.webturbo wtb +# application/vnd.wfa.p2p +# application/vnd.wfa.wsc +# application/vnd.windows.devicepairing +# application/vnd.wmc +# application/vnd.wmf.bootstrap +# application/vnd.wolfram.mathematica +# application/vnd.wolfram.mathematica.package +application/vnd.wolfram.player nbp +application/vnd.wordperfect wpd +application/vnd.wqd wqd +# application/vnd.wrq-hp3000-labelled +application/vnd.wt.stf stf +# application/vnd.wv.csp+wbxml +# application/vnd.wv.csp+xml +# application/vnd.wv.ssp+xml +# application/vnd.xacml+json +application/vnd.xara xar +application/vnd.xfdl xfdl +# application/vnd.xfdl.webform +# application/vnd.xmi+xml +# application/vnd.xmpie.cpkg +# application/vnd.xmpie.dpkg +# application/vnd.xmpie.plan +# application/vnd.xmpie.ppkg +# application/vnd.xmpie.xlim +application/vnd.yamaha.hv-dic hvd +application/vnd.yamaha.hv-script hvs +application/vnd.yamaha.hv-voice hvp +application/vnd.yamaha.openscoreformat osf +application/vnd.yamaha.openscoreformat.osfpvg+xml osfpvg +# application/vnd.yamaha.remote-setup +application/vnd.yamaha.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +# application/vnd.yamaha.through-ngn +# application/vnd.yamaha.tunnel-udpencap +# application/vnd.yaoweme +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +# application/vq-rtcpxr +# application/watcherinfo+xml +# application/whoispp-query +# application/whoispp-response +application/widget wgt +application/winhlp hlp +# application/wita +# application/wordperfect5.1 +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-7z-compressed 7z +application/x-abiword abw +application/x-ace-compressed ace +# application/x-amf +application/x-apple-diskimage dmg +application/x-authorware-bin aab x32 u32 vox +application/x-authorware-map aam +application/x-authorware-seg aas +application/x-bcpio bcpio +application/x-bittorrent torrent +application/x-blorb blb blorb +application/x-bzip bz +application/x-bzip2 bz2 boz +application/x-cbr cbr cba cbt cbz cb7 +application/x-cdlink vcd +application/x-cfs-compressed cfs +application/x-chat chat +application/x-chess-pgn pgn +# application/x-compress +application/x-conference nsc +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb udeb +application/x-dgc-compressed dgc +application/x-director dir dcr dxr cst cct cxt w3d fgd swa +application/x-doom wad +application/x-dtbncx+xml ncx +application/x-dtbook+xml dtb +application/x-dtbresource+xml res +application/x-dvi dvi +application/x-envoy evy +application/x-eva eva +application/x-font-bdf bdf +# application/x-font-dos +# application/x-font-framemaker +application/x-font-ghostscript gsf +# application/x-font-libgrx +application/x-font-linux-psf psf +application/x-font-pcf pcf +application/x-font-snf snf +# application/x-font-speedo +# application/x-font-sunos-news +application/x-font-type1 pfa pfb pfm afm +# application/x-font-vfont +application/x-freearc arc +application/x-futuresplash spl +application/x-gca-compressed gca +application/x-glulx ulx +application/x-gnumeric gnumeric +application/x-gramps-xml gramps +application/x-gtar gtar +# application/x-gzip +application/x-hdf hdf +application/x-install-instructions install +application/x-iso9660-image iso +application/x-java-jnlp-file jnlp +application/x-latex latex +application/x-lzh-compressed lzh lha +application/x-mie mie +application/x-mobipocket-ebook prc mobi +application/x-ms-application application +application/x-ms-shortcut lnk +application/x-ms-wmd wmd +application/x-ms-wmz wmz +application/x-ms-xbap xbap +application/x-msaccess mdb +application/x-msbinder obd +application/x-mscardfile crd +application/x-msclip clp +application/x-msdownload exe dll com bat msi +application/x-msmediaview mvb m13 m14 +application/x-msmetafile wmf wmz emf emz +application/x-msmoney mny +application/x-mspublisher pub +application/x-msschedule scd +application/x-msterminal trm +application/x-mswrite wri +application/x-netcdf nc cdf +application/x-nzb nzb +application/x-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-rar-compressed rar +application/x-research-info-systems ris +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-silverlight-app xap +application/x-sql sql +application/x-stuffit sit +application/x-stuffitx sitx +application/x-subrip srt +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-t3vm-image t3 +application/x-tads gam +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-tex-tfm tfm +application/x-texinfo texinfo texi +application/x-tgif obj +application/x-ustar ustar +application/x-wais-source src +# application/x-www-form-urlencoded +application/x-x509-ca-cert der crt +application/x-xfig fig +application/x-xliff+xml xlf +application/x-xpinstall xpi +application/x-xz xz +application/x-zmachine z1 z2 z3 z4 z5 z6 z7 z8 +# application/x400-bp +# application/xacml+xml +application/xaml+xml xaml +# application/xcap-att+xml +# application/xcap-caps+xml +application/xcap-diff+xml xdf +# application/xcap-el+xml +# application/xcap-error+xml +# application/xcap-ns+xml +# application/xcon-conference-info+xml +# application/xcon-conference-info-diff+xml +application/xenc+xml xenc +application/xhtml+xml xhtml xht +# application/xhtml-voice+xml +application/xml xml xsl +application/xml-dtd dtd +# application/xml-external-parsed-entity +# application/xml-patch+xml +# application/xmpp+xml +application/xop+xml xop +application/xproc+xml xpl +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvml xvm +application/yang yang +application/yin+xml yin +application/zip zip +# application/zlib +# audio/1d-interleaved-parityfec +# audio/32kadpcm +# audio/3gpp +# audio/3gpp2 +# audio/ac3 +audio/adpcm adp +# audio/amr +# audio/amr-wb +# audio/amr-wb+ +# audio/aptx +# audio/asc +# audio/atrac-advanced-lossless +# audio/atrac-x +# audio/atrac3 +audio/basic au snd +# audio/bv16 +# audio/bv32 +# audio/clearmode +# audio/cn +# audio/dat12 +# audio/dls +# audio/dsr-es201108 +# audio/dsr-es202050 +# audio/dsr-es202211 +# audio/dsr-es202212 +# audio/dv +# audio/dvi4 +# audio/eac3 +# audio/encaprtp +# audio/evrc +# audio/evrc-qcp +# audio/evrc0 +# audio/evrc1 +# audio/evrcb +# audio/evrcb0 +# audio/evrcb1 +# audio/evrcnw +# audio/evrcnw0 +# audio/evrcnw1 +# audio/evrcwb +# audio/evrcwb0 +# audio/evrcwb1 +# audio/evs +# audio/example +# audio/fwdred +# audio/g711-0 +# audio/g719 +# audio/g722 +# audio/g7221 +# audio/g723 +# audio/g726-16 +# audio/g726-24 +# audio/g726-32 +# audio/g726-40 +# audio/g728 +# audio/g729 +# audio/g7291 +# audio/g729d +# audio/g729e +# audio/gsm +# audio/gsm-efr +# audio/gsm-hr-08 +# audio/ilbc +# audio/ip-mr_v2.5 +# audio/isac +# audio/l16 +# audio/l20 +# audio/l24 +# audio/l8 +# audio/lpc +audio/midi mid midi kar rmi +# audio/mobile-xmf +audio/mp4 m4a mp4a +# audio/mp4a-latm +# audio/mpa +# audio/mpa-robust +audio/mpeg mpga mp2 mp2a mp3 m2a m3a +# audio/mpeg4-generic +# audio/musepack +audio/ogg oga ogg spx opus +# audio/opus +# audio/parityfec +# audio/pcma +# audio/pcma-wb +# audio/pcmu +# audio/pcmu-wb +# audio/prs.sid +# audio/qcelp +# audio/raptorfec +# audio/red +# audio/rtp-enc-aescm128 +# audio/rtp-midi +# audio/rtploopback +# audio/rtx +audio/s3m s3m +audio/silk sil +# audio/smv +# audio/smv-qcp +# audio/smv0 +# audio/sp-midi +# audio/speex +# audio/t140c +# audio/t38 +# audio/telephone-event +# audio/tone +# audio/uemclip +# audio/ulpfec +# audio/vdvi +# audio/vmr-wb +# audio/vnd.3gpp.iufp +# audio/vnd.4sb +# audio/vnd.audiokoz +# audio/vnd.celp +# audio/vnd.cisco.nse +# audio/vnd.cmles.radio-events +# audio/vnd.cns.anp1 +# audio/vnd.cns.inf1 +audio/vnd.dece.audio uva uvva +audio/vnd.digital-winds eol +# audio/vnd.dlna.adts +# audio/vnd.dolby.heaac.1 +# audio/vnd.dolby.heaac.2 +# audio/vnd.dolby.mlp +# audio/vnd.dolby.mps +# audio/vnd.dolby.pl2 +# audio/vnd.dolby.pl2x +# audio/vnd.dolby.pl2z +# audio/vnd.dolby.pulse.1 +audio/vnd.dra dra +audio/vnd.dts dts +audio/vnd.dts.hd dtshd +# audio/vnd.dvb.file +# audio/vnd.everad.plj +# audio/vnd.hns.audio +audio/vnd.lucent.voice lvp +audio/vnd.ms-playready.media.pya pya +# audio/vnd.nokia.mobile-xmf +# audio/vnd.nortel.vbk +audio/vnd.nuera.ecelp4800 ecelp4800 +audio/vnd.nuera.ecelp7470 ecelp7470 +audio/vnd.nuera.ecelp9600 ecelp9600 +# audio/vnd.octel.sbc +# audio/vnd.qcelp +# audio/vnd.rhetorex.32kadpcm +audio/vnd.rip rip +# audio/vnd.sealedmedia.softseal.mpeg +# audio/vnd.vmx.cvsd +# audio/vorbis +# audio/vorbis-config +audio/webm weba +audio/x-aac aac +audio/x-aiff aif aiff aifc +audio/x-caf caf +audio/x-flac flac +audio/x-matroska mka +audio/x-mpegurl m3u +audio/x-ms-wax wax +audio/x-ms-wma wma +audio/x-pn-realaudio ram ra +audio/x-pn-realaudio-plugin rmp +# audio/x-tta +audio/x-wav wav +audio/xm xm +chemical/x-cdx cdx +chemical/x-cif cif +chemical/x-cmdf cmdf +chemical/x-cml cml +chemical/x-csml csml +# chemical/x-pdb +chemical/x-xyz xyz +font/collection ttc +font/otf otf +# font/sfnt +font/ttf ttf +font/woff woff +font/woff2 woff2 +image/bmp bmp +image/cgm cgm +# image/dicom-rle +# image/emf +# image/example +# image/fits +image/g3fax g3 +image/gif gif +image/ief ief +# image/jls +# image/jp2 +image/jpeg jpeg jpg jpe +# image/jpm +# image/jpx +image/ktx ktx +# image/naplps +image/png png +image/prs.btif btif +# image/prs.pti +# image/pwg-raster +image/sgi sgi +image/svg+xml svg svgz +# image/t38 +image/tiff tiff tif +# image/tiff-fx +image/vnd.adobe.photoshop psd +# image/vnd.airzip.accelerator.azv +# image/vnd.cns.inf2 +image/vnd.dece.graphic uvi uvvi uvg uvvg +image/vnd.djvu djvu djv +image/vnd.dvb.subtitle sub +image/vnd.dwg dwg +image/vnd.dxf dxf +image/vnd.fastbidsheet fbs +image/vnd.fpx fpx +image/vnd.fst fst +image/vnd.fujixerox.edmics-mmr mmr +image/vnd.fujixerox.edmics-rlc rlc +# image/vnd.globalgraphics.pgb +# image/vnd.microsoft.icon +# image/vnd.mix +# image/vnd.mozilla.apng +image/vnd.ms-modi mdi +image/vnd.ms-photo wdp +image/vnd.net-fpx npx +# image/vnd.radiance +# image/vnd.sealed.png +# image/vnd.sealedmedia.softseal.gif +# image/vnd.sealedmedia.softseal.jpg +# image/vnd.svf +# image/vnd.tencent.tap +# image/vnd.valve.source.texture +image/vnd.wap.wbmp wbmp +image/vnd.xiff xif +# image/vnd.zbrush.pcx +image/webp webp +# image/wmf +image/x-3ds 3ds +image/x-cmu-raster ras +image/x-cmx cmx +image/x-freehand fh fhc fh4 fh5 fh7 +image/x-icon ico +image/x-mrsid-image sid +image/x-pcx pcx +image/x-pict pic pct +image/x-portable-anymap pnm +image/x-portable-bitmap pbm +image/x-portable-graymap pgm +image/x-portable-pixmap ppm +image/x-rgb rgb +image/x-tga tga +image/x-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +# message/cpim +# message/delivery-status +# message/disposition-notification +# message/example +# message/external-body +# message/feedback-report +# message/global +# message/global-delivery-status +# message/global-disposition-notification +# message/global-headers +# message/http +# message/imdn+xml +# message/news +# message/partial +message/rfc822 eml mime +# message/s-http +# message/sip +# message/sipfrag +# message/tracking-status +# message/vnd.si.simp +# message/vnd.wfa.wsc +# model/example +# model/gltf+json +model/iges igs iges +model/mesh msh mesh silo +model/vnd.collada+xml dae +model/vnd.dwf dwf +# model/vnd.flatland.3dml +model/vnd.gdl gdl +# model/vnd.gs-gdl +# model/vnd.gs.gdl +model/vnd.gtw gtw +# model/vnd.moml+xml +model/vnd.mts mts +# model/vnd.opengex +# model/vnd.parasolid.transmit.binary +# model/vnd.parasolid.transmit.text +# model/vnd.rosette.annotated-data-model +# model/vnd.valve.source.compiled-map +model/vnd.vtu vtu +model/vrml wrl vrml +model/x3d+binary x3db x3dbz +# model/x3d+fastinfoset +model/x3d+vrml x3dv x3dvz +model/x3d+xml x3d x3dz +# model/x3d-vrml +# multipart/alternative +# multipart/appledouble +# multipart/byteranges +# multipart/digest +# multipart/encrypted +# multipart/example +# multipart/form-data +# multipart/header-set +# multipart/mixed +# multipart/parallel +# multipart/related +# multipart/report +# multipart/signed +# multipart/voice-message +# multipart/x-mixed-replace +# text/1d-interleaved-parityfec +text/cache-manifest appcache +text/calendar ics ifb +text/css css +text/csv csv +# text/csv-schema +# text/directory +# text/dns +# text/ecmascript +# text/encaprtp +# text/enriched +# text/example +# text/fwdred +# text/grammar-ref-list +text/html html htm +# text/javascript +# text/jcr-cnd +# text/markdown +# text/mizar +text/n3 n3 +# text/parameters +# text/parityfec +text/plain txt text conf def list log in +# text/provenance-notation +# text/prs.fallenstein.rst +text/prs.lines.tag dsc +# text/prs.prop.logic +# text/raptorfec +# text/red +# text/rfc822-headers +text/richtext rtx +# text/rtf +# text/rtp-enc-aescm128 +# text/rtploopback +# text/rtx +text/sgml sgml sgm +# text/t140 +text/tab-separated-values tsv +text/troff t tr roff man me ms +text/turtle ttl +# text/ulpfec +text/uri-list uri uris urls +text/vcard vcard +# text/vnd.a +# text/vnd.abc +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.mcurl mcurl +text/vnd.curl.scurl scurl +# text/vnd.debian.copyright +# text/vnd.dmclientscript +text/vnd.dvb.subtitle sub +# text/vnd.esmertec.theme-descriptor +text/vnd.fly fly +text/vnd.fmi.flexstor flx +text/vnd.graphviz gv +text/vnd.in3d.3dml 3dml +text/vnd.in3d.spot spot +# text/vnd.iptc.newsml +# text/vnd.iptc.nitf +# text/vnd.latex-z +# text/vnd.motorola.reflex +# text/vnd.ms-mediapackage +# text/vnd.net2phone.commcenter.command +# text/vnd.radisys.msml-basic-layout +# text/vnd.si.uricatalogue +text/vnd.sun.j2me.app-descriptor jad +# text/vnd.trolltech.linguist +# text/vnd.wap.si +# text/vnd.wap.sl +text/vnd.wap.wml wml +text/vnd.wap.wmlscript wmls +text/x-asm s asm +text/x-c c cc cxx cpp h hh dic +text/x-fortran f for f77 f90 +text/x-java-source java +text/x-nfo nfo +text/x-opml opml +text/x-pascal p pas +text/x-setext etx +text/x-sfv sfv +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +# text/xml +# text/xml-external-parsed-entity +# video/1d-interleaved-parityfec +video/3gpp 3gp +# video/3gpp-tt +video/3gpp2 3g2 +# video/bmpeg +# video/bt656 +# video/celb +# video/dv +# video/encaprtp +# video/example +video/h261 h261 +video/h263 h263 +# video/h263-1998 +# video/h263-2000 +video/h264 h264 +# video/h264-rcdo +# video/h264-svc +# video/h265 +# video/iso.segment +video/jpeg jpgv +# video/jpeg2000 +video/jpm jpm jpgm +video/mj2 mj2 mjp2 +# video/mp1s +# video/mp2p +# video/mp2t +video/mp4 mp4 mp4v mpg4 +# video/mp4v-es +video/mpeg mpeg mpg mpe m1v m2v +# video/mpeg4-generic +# video/mpv +# video/nv +video/ogg ogv +# video/parityfec +# video/pointer +video/quicktime qt mov +# video/raptorfec +# video/raw +# video/rtp-enc-aescm128 +# video/rtploopback +# video/rtx +# video/smpte292m +# video/ulpfec +# video/vc1 +# video/vnd.cctv +video/vnd.dece.hd uvh uvvh +video/vnd.dece.mobile uvm uvvm +# video/vnd.dece.mp4 +video/vnd.dece.pd uvp uvvp +video/vnd.dece.sd uvs uvvs +video/vnd.dece.video uvv uvvv +# video/vnd.directv.mpeg +# video/vnd.directv.mpeg-tts +# video/vnd.dlna.mpeg-tts +video/vnd.dvb.file dvb +video/vnd.fvt fvt +# video/vnd.hns.video +# video/vnd.iptvforum.1dparityfec-1010 +# video/vnd.iptvforum.1dparityfec-2005 +# video/vnd.iptvforum.2dparityfec-1010 +# video/vnd.iptvforum.2dparityfec-2005 +# video/vnd.iptvforum.ttsavc +# video/vnd.iptvforum.ttsmpeg2 +# video/vnd.motorola.video +# video/vnd.motorola.videop +video/vnd.mpegurl mxu m4u +video/vnd.ms-playready.media.pyv pyv +# video/vnd.nokia.interleaved-multimedia +# video/vnd.nokia.videovoip +# video/vnd.objectvideo +# video/vnd.radgamettools.bink +# video/vnd.radgamettools.smacker +# video/vnd.sealed.mpeg1 +# video/vnd.sealed.mpeg4 +# video/vnd.sealed.swf +# video/vnd.sealedmedia.softseal.mov +video/vnd.uvvu.mp4 uvu uvvu +video/vnd.vivo viv +# video/vp8 +video/webm webm +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-m4v m4v +video/x-matroska mkv mk3d mks +video/x-mng mng +video/x-ms-asf asf asx +video/x-ms-vob vob +video/x-ms-wm wm +video/x-ms-wmv wmv +video/x-ms-wmx wmx +video/x-ms-wvx wvx +video/x-msvideo avi +video/x-sgi-movie movie +video/x-smv smv +x-conference/x-cooltalk ice diff --git a/config/e2guardian/authplugins/ident.conf b/config/e2guardian/authplugins/ident.conf new file mode 100644 index 0000000..92d61ee --- /dev/null +++ b/config/e2guardian/authplugins/ident.conf @@ -0,0 +1,4 @@ +# Ident auth plugin +# Identifies users via IDENT servers running on client machines + +plugname = 'ident' diff --git a/config/e2guardian/authplugins/ip.conf b/config/e2guardian/authplugins/ip.conf new file mode 100644 index 0000000..914c466 --- /dev/null +++ b/config/e2guardian/authplugins/ip.conf @@ -0,0 +1,11 @@ +# IP-based auth plugin +# +# Maps client IPs to filter groups. +# If "usexforwardedfor" is enabled, grabs the IP from the X-Forwarded-For +# header, if available. + +plugname = 'ip' + +# ipgroups file +# List file assigning IP addresses, subnets and ranges to filter groups +ipgroups = '/etc/e2guardian/lists/authplugins/ipgroups' diff --git a/config/e2guardian/authplugins/port.conf b/config/e2guardian/authplugins/port.conf new file mode 100644 index 0000000..67b0d9e --- /dev/null +++ b/config/e2guardian/authplugins/port.conf @@ -0,0 +1,9 @@ +# IP-Port-based auth plugin +# +# Maps IP Ports to filter groups. + +plugname = 'port' + +# portgroups file +# List file assigning ports to filter groups +portgroups = '/etc/e2guardian/lists/authplugins/portgroups' diff --git a/config/e2guardian/authplugins/proxy-basic.conf b/config/e2guardian/authplugins/proxy-basic.conf new file mode 100644 index 0000000..ce365cd --- /dev/null +++ b/config/e2guardian/authplugins/proxy-basic.conf @@ -0,0 +1,5 @@ +# Proxy-Basic auth plugin +# Identifies usernames in "Proxy-Authorization: Basic" headers; +# relies upon the upstream proxy (squid) to perform the actual password check. + +plugname = 'proxy-basic' diff --git a/config/e2guardian/authplugins/proxy-digest.conf b/config/e2guardian/authplugins/proxy-digest.conf new file mode 100644 index 0000000..3a849b3 --- /dev/null +++ b/config/e2guardian/authplugins/proxy-digest.conf @@ -0,0 +1,7 @@ +# Proxy-Digest auth plugin +# Identifies usernames in "Proxy-Authorization: Digest" headers; +# relies upon the upstream proxy (squid) to perform the actual password check. + +# Contributed by Darryl Sutherland + +plugname = 'proxy-digest' diff --git a/config/e2guardian/authplugins/proxy-ntlm.conf b/config/e2guardian/authplugins/proxy-ntlm.conf new file mode 100644 index 0000000..dbdd08b --- /dev/null +++ b/config/e2guardian/authplugins/proxy-ntlm.conf @@ -0,0 +1,5 @@ +# Proxy-NTLM auth plugin +# Identifies usernames in "Proxy-Authorization: NTLM" headers; +# relies on the upstream proxy (squid) to perform the actual password check. + +plugname = 'proxy-ntlm' diff --git a/config/e2guardian/common.story b/config/e2guardian/common.story new file mode 100644 index 0000000..ae24c9b --- /dev/null +++ b/config/e2guardian/common.story @@ -0,0 +1,250 @@ +# Storyboard library file + +# For ease of upgrade DO NOT CHANGE THIS library file +# Make your function changes by overriding functions +# in the site.story file - for site wide changes +# and in filtergroup specific story file - see examplef1.story +# +# This library is built to largely duplicate the logic in V4 +# +# Many e2guardian[f1].conf flags are replaced by overiding +# library functions - see site.story and examplef1.story +# +# Simple functions are defined which control the logic flow and the +# lists that are used. See notes/Storyboard for details. +# +# The entry point in v5 for standard filtering is 'checkrequest' +# +# Entry function called by proxy module to check http request +function(checkrequest) +if(viruscheckset) checknoscanlists +if(bypassallowset) checknobypasslists +if(exceptionset) return true +if(fullurlin,searchterms) setsearchterm +ifnot(greyset) returnif localcheckrequest +if(connect) return sslrequestcheck +ifnot(greyset) returnif exceptioncheck +ifnot(greyset) greycheck +ifnot(greyset) returnif bannedcheck +if(fullurlin, change) setmodurl +if(true) returnif embeddedcheck +if(headerin,headermods) setmodheader +if(fullurlin, addheader) setaddheader +if(searchin,override) return setgrey +if(searchin,banned) return setblock +if(fullurlin,redirect) return setredirect +if(true) setgrey + + +# Entry function called by proxy module to check http response +function(checkresponse) +if(exceptionset) return false +if(viruscheckset) checknoscantypes +if(urlin,exceptionfile) return false +if(true) return checkfiletype + +# Entry function called by THTTPS module to check https request +function(thttps-checkrequest) +if(true) returnif localsslrequestcheck +if(true) returnif sslrequestcheck +ifnot(hassniset) checksni + +# Entry function called by ICAP module to check reqmod +function(icap-checkrequest) +#unless blocked or redirect or connect - leave logging for RESPMOD +if(connect) return icapsslrequestcheck +ifnot(greyset) icap-checkrequest2 +if(redirectset) return true +ifnot(blockset) setnolog + +function(icap-checkrequest2) +if(viruscheckset) checknoscanlists +if(bypassallowset) checknobypasslists +if(exceptionset) return true +if(fullurlin,searchterms) setsearchterm +ifnot(greyset) returnif localcheckrequest +ifnot(greyset) returnif exceptioncheck +ifnot(greyset) greycheck +ifnot(greyset) returnif bannedcheck +if(fullurlin, change) setmodurl +if(true) returnif embeddedcheck +if(headerin,headermods) setmodheader +if(fullurlin, addheader) setaddheader +if(searchin,override) return setgrey +if(searchin,banned) return setblock +if(true) setgrey + +# Entry function called by ICAP module to check respmod +function(icap-checkresponse) +if(viruscheckset) checknoscanlists +if(true) return checkresponse + +# Checks embeded urls +# returns true if blocked, otherwise false +function(embeddedcheck) +if(embeddedin, localexception) return false +if(embeddedin, localgrey) return false +if(embeddedin, localbanned) return setblock +if(embeddedin, exception) return false +if(embeddedin, grey) return false +if(embeddedin, banned) return setblock + +# Local checks +# returns true if matches local exception or banned +function(localcheckrequest) +if(connect) return localsslrequestcheck +ifnot(greyset) returnif localexceptioncheck +ifnot(greyset) localgreycheck +ifnot(greyset) returnif localbannedcheck +if(searchin,localbanned) return setblock + + +# Local SSL checks +# returns true if matches local exception +function(localsslrequestcheck) +if(sitein, localexception) return setexception +if(sitein, localgreyssl) returnif sslcheckmitm +if(sitein, localbanned) true +ifnot(returnset) return false +if(true) returnif sslcheckmitm +if(true) return setblock + +# SSL site replace (used instead of dns kulge) +# returns true on match and successful replacement +function(sslreplace) +if(fullurlin,sslreplace) return setconnectsite +if(true) return false + +# Local grey check +# returns true on match +function(localgreycheck) +if(urlin, localgrey) return setgrey + +# Local banned check +# returns true on match +function(localbannedcheck) +if(urlin, localbanned) return setblock + +# Local exception check +# returns true on match +function(localexceptioncheck) +if(urlin, localexception) return setexception + +# Exception check +# returns true on match +function(exceptioncheck) +if(urlin, exception) return setexception +if(headerin, exceptionheader) return setexception +if(useragentin, exceptionuseragent) return setexception + +# SSL Exception check +# returns true on match +function(sslexceptioncheck) +if(sitein, exception) return setexception +if(headerin, exceptionheader) return setexception +if(useragentin, exceptionuseragent) return setexception +if(true) return false + +# Greylist check +# returns true on match +function(greycheck) +if(urlin, grey) return setgrey + +# Banned list check +# returns true on match +function(bannedcheck) +if(true) returnif checkblanketblock +if(urlin, banned) return setblock +if(urlin,bannedextension) return setblock +if(useragentin, banneduseragent) return setblock +if(headerin, bannedheader) return setblock + +# Local SSL list(s) check +# returns true on match +function(localsslcheckrequest) +if(sitein, localexception) return setexception +#if(sitein, localbanned) return setblock + +# Check whether to go MITM +# returns true if yes, false if no +function(sslcheckmitm) +# use next line to have general MITM +if(true) return sslcheckmitmgeneral +# use next line instead of last to limit MITM to greylist +#if(true) return sslcheckmitmgreyonly + +# Always go MITM +# returns true if yes, false if no +function(sslcheckmitmgeneral) +if(true) setgomitm +ifnot(returnset) return false +if(sitein, nocheckcert) setnocheckcert +if(true) sslreplace +if(true) return true + +# Only go MITM when in greyssl list +# returns true if yes, false if no +function(sslcheckmitmgreyonly) +if(sitein, greyssl) setgomitm +ifnot(returnset) return false +if(sitein, nocheckcert) setnocheckcert +if(true) sslreplace +if(true) return true + +# SSL request check +# returns true if exception or gomitm +function(sslrequestcheck) +if(true) returnif sslexceptioncheck +if(true) returnif sslcheckmitm +if(sitein, banned) return setblock +if(true) sslreplace +ifnot(returnset) returnif sslcheckblanketblock +if(true) setgrey + +function(checknoscanlists) +if(urlin,exceptionvirus) unsetviruscheck + +function(checknoscantypes) +if(mimein,exceptionvirus) return unsetviruscheck +if(extensionin,exceptionvirus) return unsetviruscheck + +function(checknobypasslists) +if(urlin,bannedbypass) return unsetbypassallow + +# ICAP SSL request check +# returns true if exception +function(icapsslrequestcheck) +if(true) returnif icapsquidbump +if(true) returnif sslexceptioncheck +if(true) sslreplace +if(sitein, banned) return setblock + +# Blanket block +# returns true if to block +# Placeholder function - overide in fn.story +function(checkblanketblock) + +# SSL Blanket block +# returns true if to block +# Placeholder function - overide in fn.story +function(sslcheckblanketblock) + +# ICAP Squid bump +# override in site.story to return true if bump is being deployed on squid +function(icapsquidbump) + +# File type blocking +# returns true if blocking +# Default uses banned lists and allows all others +# Overide in site.story or fn.story if only types in exception file type lists +# are to be allowed +function(checkfiletype) +if(mimein, bannedmime) return setblock +if(extensionin, bannedextension) return setblock + +# SNI checking - determines default action when no SNI or TSL is present on a +# THTTPS connection +# Default blocks all requests with TLS or SNI absent that are not ip site exceptions +function(checksni) +ifnot(tls,,511) return setblock +ifnot(hassniset,,512) return setblock diff --git a/config/e2guardian/contentscanners/clamdscan.conf b/config/e2guardian/contentscanners/clamdscan.conf new file mode 100644 index 0000000..4500e0a --- /dev/null +++ b/config/e2guardian/contentscanners/clamdscan.conf @@ -0,0 +1,13 @@ +plugname = 'clamdscan' + +# edit this to match the location of your ClamD UNIX domain socket +clamdudsfile = '/run/clamav/clamd.ctl' + +# If this string is set, the text it contains shall be removed from the +# beginning of filenames when passing them to ClamD. +# Use it to - for example - support a ClamD running inside a chroot jail: +# if DG's filecachedir is set to "/var/clamdchroot/downloads/" and pathprefix +# is set to "/var/clamdchroot", then file names given to ClamD will be of the +# form "/downloads/tf*" instead of "/var/clamdchroot/downloads/tf*". +#pathprefix = '/var/clamdchroot' + diff --git a/config/e2guardian/contentscanners/commandlinescan.conf b/config/e2guardian/contentscanners/commandlinescan.conf new file mode 100644 index 0000000..9822d99 --- /dev/null +++ b/config/e2guardian/contentscanners/commandlinescan.conf @@ -0,0 +1,45 @@ +plugname = 'commandlinescan' + +# Program to run & initial arguments - filename for scanning will be appended +#progname = /path/to/scanner + +# At least one of the following three options must be defined! +# They are checked in the following order, with the first match determining +# the scan result: +# virusregexp - regular expression for extracting virus names from +# the scanner's output +# cleancodes - program return code(s), as a comma-separated list, for +# uninfected files +# infectedcodes - program return code(s), as a comma-separated list, for +# infected files + +#virusregexp = (someregexp) + +# Which submatch of the above contains the virus name? (0 = all matched text) +#submatch = 1 + +# cleancodes = 0 +# infectedcodes = 1,2,3 + +# Default result when none of the other options triggers a match +# Valid values are "infected" and "clean" +#defaultresult = infected + + + +# +# Example configuration for clamdscan +# + +## Path to binary +#progname = '/usr/bin/clamdscan' + +## Program returns 0 for clean files (for an easy out) +#cleancodes = 0 + +## Regular expression for virus names +#virusregexp = : ([ -/a-zA-Z0-9\.]+) FOUND +#submatch = 1 + +## Default scan result when the above don't match +#defaultresult = infected diff --git a/config/e2guardian/contentscanners/icapscan.conf b/config/e2guardian/contentscanners/icapscan.conf new file mode 100644 index 0000000..8e5dd19 --- /dev/null +++ b/config/e2guardian/contentscanners/icapscan.conf @@ -0,0 +1,8 @@ +plugname = 'icapscan' + +# ICAP URL +# Use hostname rather than IP address +# Always specify the port +# +icapurl = 'icap://icapserver:1344/avscan' + diff --git a/config/e2guardian/downloadmanagers/default.conf b/config/e2guardian/downloadmanagers/default.conf new file mode 100644 index 0000000..61935a8 --- /dev/null +++ b/config/e2guardian/downloadmanagers/default.conf @@ -0,0 +1,17 @@ +# The default download manager. +# This is the safest option for unknown user-agents and content types, and +# hence a good one to include last. + +# Which plugin should be loaded? +plugname = 'default' + +# Regular expression for matching user agents +# When not defined, matches all agents. +#useragentregexp = '.*' + +# Lists of mime types and extensions to manage +# When not defined, matches everything. +# These can be enabled separately; when both enabled, +# a request may match either list. +#managedmimetypelist = '' +#managedextensionlist = '' diff --git a/config/e2guardian/e2guardian.conf b/config/e2guardian/e2guardian.conf new file mode 100644 index 0000000..9ca11eb --- /dev/null +++ b/config/e2guardian/e2guardian.conf @@ -0,0 +1,699 @@ +# e2guardian config file for version 5.3.1 + +#NOTE This file is only read at start-up +# +# but the lists defined in this file are re-read on reload or gentle restart +# as is any rooms directory files. + +# Language dir where languages are stored for internationalisation. +# The HTML template within this dir is only used when reportinglevel +# is set to 3. When used, e2guardian will display the HTML file instead of +# using the perl cgi script. This option is faster, cleaner +# and easier to customise the access denied page. +# The language file is used no matter what setting however. +# +languagedir = '/usr/share/e2guardian/languages' + +# language to use from languagedir. +language = 'ukenglish' + +#Debug Level +#Enable debug e2guardian +#debug one value: +#Eg +# debuglevel = 'ICAP' +#Enable ICAP debug informations only +# +#Eg +# debuglevel = 'ALL' +#Enable ALL debug informations +# +#Additive mode: +#Eg +# debuglevel = 'ICAP,NET' +#Enable ICAP and NET debug informations +# +#Soustractive mode: +#Eg +# debuglevel = 'ALL,-ICAP' +#Enable all debug informations but without ICAP debug informations +# debuglevel = 'ALL,-ICAP,-NET,-FILTER' +#Enable all debug informations but without ICAP, NETWORK and FILTER debug informations +#by default disabled, if this option is required just uncomment the line below +#works also with e2guardian -N (-N Do not go into the background) +#Possible value : ICAP CLAMAV ICAPC (icap client) +#debuglevel = 'ALL' + +#Directory for result of debug level (log) +#Works only if debuglevel is enabled +# +#debuglevelfile = '/data/log/e2guardian/debuge2' + +# Logging Settings +# +# 0 = none 1 = just denied 2 = all text based 3 = all requests +loglevel = 3 + +# Log Exception Hits +# Log if an exception (user, ip, URL, phrase) is matched and so +# the page gets let through. Can be useful for diagnosing +# why a site gets through the filter. +# 0 = never log exceptions +# 1 = log exceptions, but do not explicitly mark them as such +# 2 = always log & mark exceptions (default) +logexceptionhits = 2 + +# Log File Format +# 1 = Dansguardian format (space delimited) +# 2 = CSV-style format +# 3 = Squid Log File Format +# 4 = Tab delimited +# Protex format type 5 Tab delimited, squid style format with extra fields +# for filter block/result codes, reasons, filter group, and system name +# used in arrays so that combined logs show originating server. +# 5 = Protex format +# Protex format type 6 Same format as above but system name field is blank +# used in stand-alone systems. +# 6 = Protex format with server field blanked + +logfileformat = 6 + +# Log a specific value from header +# low case only +# only used with logs: 1,5 and 6 +logheadervalue = 'proxy-authorization:' + +# truncate large items in log lines +# allowable values 10 to 32000 +# default 2000 +# unlimited not longer allowed - 0 will now set default of 2000 +maxlogitemlength = 2000 + +# anonymize logs (blank out usernames & IPs) +#anonymizelogs = off + +# Syslog logging +# +# Use syslog for access logging instead of logging to the file +# at the defined or built-in "loglocation" +#logsyslog = off + +#Suffix to append to program name when logging through syslog +# Default is the e2Guardian instance number +#namesuffix = $z + +# Log file location +# +# Defines the log directory and filename. +loglocation = '/data/log/e2guardian/access.log' + +# Dymamic statistics log file location +# +# Defines the dstats file directory and filename. +# Once every 'dstatinterval' seconds, stats on number of threads in use, +# Q sizes and other useful information is written to this file. +# Format is similar to sar. See notes/dstats_format for more details. +# Default is not to write stats. +dstatlocation = '/data/log/e2guardian/dstats.log' + +# Interval in seconds between stats output +# Default 300 (= 5 mins) +# Minimum 10 +# Maximum 3600 (= 1 hour) +dstatinterval = 300 # = 5 minutes + +# Time format is epoch GMT+0 by default | statshumanreadable change to local zone +statshumanreadable = on + +# Container mode +# the process will not fork into the background AND log in stdout +# In this mode systemd service is disabled ! +# Default: +dockermode = on + +# Network Settings +# +# the IP that e2guardian listens on. If left blank e2guardian will +# listen on all IPs. That would include all NICs, loopback, modem, etc. +# Normally you would have your firewall protecting this, but if you want +# you can limit it to a certain IP. To bind to multiple interfaces, +# specify each IP on an individual filterip line. +# If mapportstoips is 'on' you can have the same IP twice so long as +# it has a different port. +filterip = + +# the ports that e2guardian listens to. Specify one line per filterip +# line. If both mapportstoips and mapauthtoports are set to 'on' +# you can specify different authentication mechanisms per port but +# only if the mechanisms can co-exist (e.g. basic/proxy auth can't) +filterports = 8080 +#filterports = 8081 + +# Map ports to IPs +# If enabled map filterports to filterip - number of filterports must then be same as +# number of filterip +# If disabled will listen on all filterports on all filterips. +# on (default) | off +#mapportstoips = off + +#port for transparent https +#if defined enables tranparent https +transparenthttpsport = 8443 + +#port for ICAP +#if defined enables icap mode +icapport = 1344 + +# the ip of upstream proxy - optional - if blank e2g will go direct to sites. +# default is "" i.e. no proxy +proxyip = 127.0.0.1 + +# the port e2guardian connects to proxy on +proxyport = 3127 + +# Proxy timeout +# Set tcp timeout between the Proxy and e2guardian +# This is a connection timeout +# If proxy is remote you may need to increase this to 10 or more. +# Min 5 - Max 100 +proxytimeout = 5 + +# Connect timeout +# Set tcp timeout between the e2guardian and upstream service (proxy or target host) +# This is a connection timeout +# For remote sites you may need to increase this to 10 or more. +# Min 1 - Max 100 +# default 3 +connecttimeout = 5 + +# Connect retries +# Set the number of retries to make on connection failure before giving up +# Min 1 - Max 100 +# default 1 + +# Proxy header exchange +# Set timeout between the Proxy and e2guardian +# Min 20 - Max 300 +# If this is higher than proxies timeout user will get proxy Gateway error page +# If lower e2guardian Gateway error page +proxyexchange = 61 + +# Pconn timeout +# how long a persistent connection will wait for other requests +# squid apparently defaults to 1 minute (persistent_request_timeout), +# so wait slightly less than this to avoid duff pconns. +# Min 5 - Max 300 +pcontimeout = 55 + +# Whether to retrieve the original destination IP in transparent proxy +# setups and check it against the domain pulled from the HTTP headers. +# +# Be aware that when visiting sites which use a certain type of round-robin +# DNS for load balancing, DG may mark requests as invalid unless DG gets +# exactly the same answers to its DNS requests as clients. The chances of +# this happening can be increased if all clients and servers on the same LAN +# make use of a local, caching DNS server instead of using upstream DNS +# directly. +# +# See http://www.kb.cert.org/vuls/id/435052 +# on (default) | off +#!! Not compiled !! originalip = off + +# Banned image replacement +# Images that are banned due to domain/url/etc reasons including those +# in the adverts blacklists can be replaced by an image. This will, +# for example, hide images from advert sites and remove broken image +# icons from banned domains. +# on (default) | off +usecustombannedimage = on +custombannedimagefile = '/usr/share/e2guardian/transparent1x1.gif' + +#Banned flash replacement +usecustombannedflash = on +custombannedflashfile = '/usr/share/e2guardian/blockedflash.swf' + +# Filter groups options +# filtergroups sets the number of filter groups. A filter group is a set of content +# filtering options you can apply to a group of users. The value must be 1 or more. +# e2guardian will automatically look for e2guardianfN.conf where N is the filter +# group. To assign users to groups use the filtergroupslist option. All users default +# to filter group 1. You must have some sort of authentication to be able to map users +# to a group. +filtergroups = 1 +filtergroupslist = '/etc/e2guardian/lists/filtergroupslist' + +# default filtergroup for standard (explicit) mode +# optional defaults to 1 +#defaultfiltergroup = 1; + +# default filtergroup for transparent proxy mode +# optional defaults to 1 +#defaulttransparentfiltergroup = 1; + +# default filtergroup for ICAP mode +# optional defaults to 1 +#defaulticapfiltergroup = 1; + +# If on it a user without group is considered like unauthenfied +# E2guardian tries the next plugin +# If off the user is connected with group1 +# Defaults to off +# authrequiresuserandgroup = off + +# Authentication files location +# These are now replaced with pre-authstoryboard logic but lists defined here +# +# bannediplist is ONLY for banned client IP +iplist = 'name=bannedclient,messageno=100,logmessageno=103,path=/etc/e2guardian/lists/bannediplist' +# Put client dns names in bannedclientlist if required +#sitelist = 'name=bannedclient,messageno=100,logmessageno=104,path=/etc/e2guardian/lists/bannedclientlist' +# exceptioniplist is ONLY for exception client IP +iplist = 'name=exceptionclient,messageno=600,path=/etc/e2guardian/lists/exceptioniplist' +# Put client dns names in exceptionclientlist if required +#sitelist = 'name=exceptionclient,messageno=631,path=/etc/e2guardian/lists/exceptionclientlist' + +# authexception lists are for exception sites/urls allowed before authentication# to allow for machines to update without user authentication +iplist = 'name=authexception,messageno=602,path=/etc/e2guardian/lists/authexceptioniplist' +sitelist = 'name=authexception,messageno=602,path=/etc/e2guardian/lists/authexceptionsitelist' +urllist = 'name=authexception,messageno=603,path=/etc/e2guardian/lists/authexceptionurllist' + +#Note: only iplist, sitelist, ipsitelist and urllist can currently be defined for use with pre-authstoryboard. + +# Per-Room definition directory +# A directory containing text files containing the room's name followed by IPs or ranges +# and optionaly site and url lists +# Think of it as bannediplist and/or exceptions on crack +# perroomdirectory = '/etc/e2guardian/lists/rooms/' + +# Show weighted phrases found +# If enabled then the phrases found that made up the total which excedes +# the naughtyness limit will be logged and, if the reporting level is +# high enough, reported. on | off +showweightedfound = on + +# Weighted phrase mode +# There are 3 possible modes of operation: +# 0 = off = do not use the weighted phrase feature. +# 1 = on, normal = normal weighted phrase operation. +# 2 = on, singular = each weighted phrase found only counts once on a page. +# +# IMPORTANT: Note that setting this to "0" turns off all features which +# extract phrases from page content, including banned & exception +# phrases (not just weighted), search term filtering, and scanning for +# links to banned URLs. +# +weightedphrasemode = 2 + +# Smart, Raw and Meta/Title phrase content filtering options +# Smart is where the multiple spaces and HTML are removed before phrase filtering +# Raw is where the raw HTML including meta tags are phrase filtered +# Meta/Title is where only meta and title tags are phrase filtered (v. quick) +# CPU usage can be effectively halved by using setting 0 or 1 compared to 2 +# 0 = raw only +# 1 = smart only +# 2 = both of the above (default) +# 3 = meta/title +phrasefiltermode = 2 + +# Lower casing options +# When a document is scanned the uppercase letters are converted to lower case +# in order to compare them with the phrases. However this can break Big5 and +# other 16-bit texts. If needed preserve the case. As of version 2.7.0 accented +# characters are supported. +# 0 = force lower case (default) +# 1 = do not change case +# 2 = scan first in lower case, then in original case +preservecase = 0 + +# Note: +# If phrasefiltermode and preserve case are both 2, this equates to 4 phrase +# filtering passes. If you have a large enough userbase for this to be a +# worry, and need to filter pages in exotic character encodings, it may be +# better to run two instances on separate servers: one with preservecase 1 +# (and possibly forcequicksearch 1) and non ASCII/UTF-8 phrase lists, and one +# with preservecase 0 and ASCII/UTF-8 lists. + +# Hex decoding options +# When a document is scanned it can optionally convert %XX to chars. +# If you find documents are getting past the phrase filtering due to encoding +# then enable. However this can break Big5 and other 16-bit texts. +# off = disabled (default) +# on = enabled +hexdecodecontent = off + +# Force Quick Search rather than DFA search algorithm +# The current DFA implementation is not totally 16-bit character compatible +# but is used by default as it handles large phrase lists much faster. +# If you wish to use a large number of 16-bit character phrases then +# enable this option. +# off (default) | on (Big5 compatible) +forcequicksearch = off + +# Reverse lookups for banned site and URLs. +# If set to on, e2guardian will look up the forward DNS for an IP URL +# address and search for both in the banned site and URL lists. This would +# prevent a user from simply entering the IP for a banned address. +# It will reduce searching speed somewhat so unless you have a local caching +# DNS server, leave it off and use the Blanket IP Block option in the +# f1.story file instead. +reverseaddresslookups = off + +# Reverse lookups for banned and exception IP lists. +# If set to on, e2guardian will look up the forward DNS for the IP +# of the connecting computer. +# If a client computer is matched against an IP given in the lists, then the +# IP will be recorded in any log entries; if forward DNS is successful and a +# match occurs against a hostname, the hostname will be logged instead. +# It will reduce searching speed somewhat so unless you have a local DNS server, +# leave it off. +reverseclientiplookups = off + +# Perform reverse lookups on client IPs for successful requests. +# If set to on, e2guardian will look up the forward DNS for the IP +# of the connecting computer, and log host names (where available) rather than +# IPs against requests. +# This is not dependent on reverseclientiplookups being enabled; however, if it +# is, enabling this option does not incur any additional forward DNS requests. +logclienthostnames = off + +# Max content filter size +# Sometimes web servers label binary files as text which can be very +# large which causes a huge drain on memory and cpu resources. +# To counter this, you can limit the size of the document to be +# filtered and get it to just pass it straight through. +# This setting also applies to content regular expression modification. +# The value must not be higher than maxcontentramcachescansize +# Do not set this too low as this will result in pages that contain a +# long preamble not being content filtered +# The size is in Kibibytes - eg 2048 = 2Mb +# use 0 to set it to maxcontentramcachescansize +maxcontentfiltersize = 1024 + +# Max content ram cache scan size +# This is only used if you use a content scanner plugin such as AV +# This is the max size of file that e2g will download and cache +# in RAM. After this limit is reached it will cache to disk +# This value must be less than or equal to maxcontentfilecachescansize. +# The size is in Kibibytes - eg 10240 = 10Mb +# use 0 to set it to maxcontentfilecachescansize +# This option may be ignored by the configured download manager. +maxcontentramcachescansize = 2000 + +# Max content file cache scan size +# This is only used if you use a content scanner plugin such as AV +# This is the max size file that DG will download +# so that it can be scanned or virus checked. +# This value must be greater or equal to maxcontentramcachescansize. +# The size is in Kibibytes - eg 10240 = 10Mb +maxcontentfilecachescansize = 20000 + +# File cache dir +# Where DG will download files to be scanned if too large for the +# RAM cache. +filecachedir = '/tmp' + +# Delete file cache after user completes download +# When a file gets save to temp it stays there until it is deleted. +# You can choose to have the file deleted when the user makes a sucessful +# download. This will mean if they click on the link to download from +# the temp store a second time it will give a 404 error. +# You should configure something to delete old files in temp to stop it filling up. +# on|off (defaults to on) +deletedownloadedtempfiles = on + +# Initial Trickle delay +# This is the number of seconds a browser connection is left waiting +# before first being sent *something* to keep it alive. The +# *something* depends on the download manager chosen. +# Do not choose a value too low or normal web pages will be affected. +# A value between 20 and 110 would be sensible +# This may be ignored by the configured download manager. +initialtrickledelay = 20 + +# Trickle delay +# This is the number of seconds a browser connection is left waiting +# before being sent more *something* to keep it alive. The +# *something* depends on the download manager chosen. +# This may be ignored by the configured download manager. +trickledelay = 10 + +# Download Managers +# These handle downloads of files to be filtered and scanned. +# They differ in the method they deal with large downloads. +# Files usually need to be downloaded 100% before they can be +# filtered and scanned before being sent on to the browser. +# Normally the browser can just wait, but with content scanning, +# for example to AV, the browser may timeout or the user may get +# confused so the download manager has to do some sort of +# 'keep alive'. +# +# There are various methods possible but not all are included. +# The author does not have the time to write them all so I have +# included a plugin systam. Also, not all methods work with all +# browsers and clients. Specifically some fancy methods don't +# work with software that downloads updates. To solve this, +# each plugin can support a regular expression for matching +# the client's user-agent string, and lists of the mime types +# and extensions it should manage. +# +# Note that these are the matching methods provided by the base plugin +# code, and individual plugins may override or add to them. +# See the individual plugin conf files for supported options. +# +# The plugins are matched in the order you specify and the last +# one is forced to match as the default, regardless of user agent +# and other matching mechanisms. +# +# NOTE - ONLY default downloadmanager is supported in v5 +downloadmanager = '/etc/e2guardian/downloadmanagers/default.conf' + +# Content Scanners (Also known as AV scanners) +# These are plugins that scan the content of all files your browser fetches +# for example to AV scan. You can have more than one content +# scanner. The plugins are run in the order you specify. +# This is one of the few places you can have multiple options of the same name. +# +# Some of the scanner(s) require 3rd party software and libraries eg clamav. +# See the individual plugin conf file for more options (if any). +# +#contentscanner = '/etc/e2guardian/contentscanners/clamdscan.conf' +#contentscanner = '/etc/e2guardian/contentscanners/icapscan.conf' +#contentscanner = '/etc/e2guardian/contentscanners/commandlinescan.conf' + +# Content scanner timeout +# Some of the content scanners support using a timeout value to stop +# processing (eg AV scanning) the file if it takes too long. +# If supported this will be used. +# The default of 60 seconds is probably reasonable. +contentscannertimeout = 60 + +# Content scan exceptions // THIS MOVED to e2guardianf1.conf +# contentscanexceptions = off + +# Auth plugins +# +# Handle the extraction of client usernames from various sources, such as +# Proxy-Authorisation headers and ident servers, enabling requests to be +# handled according to the settings of the user's filter group. +# +# If you do not use multiple filter groups, you need not specify this option. +# +#authplugin = '/etc/e2guardian/authplugins/proxy-basic.conf' +#authplugin = '/etc/e2guardian/authplugins/proxy-digest.conf' +#authplugin = '/etc/e2guardian/authplugins/proxy-ntlm.conf' +#authplugin = '/etc/e2guardian/authplugins/ident.conf' +#authplugin = '/etc/e2guardian/authplugins/ip.conf' +#authplugin = '/etc/e2guardian/authplugins/proxy-header.conf' +#authplugin = '/etc/e2guardian/authplugins/port.conf' + +# Map auth to ports +# If enabled map auth plugins to ips/ports - number of authplugins must then be same as +# number of ports +# If disabled scan authplugins on all ports - number of authplugins can then be different +# to number of ports +# on (default) | off +#mapauthtoports = off + +# Re-check replaced URLs +# As a matter of course, URLs undergo regular expression search/replace (urlregexplist) +# *after* checking the exception site/URL/regexpURL lists, but *before* checking against +# the banned site/URL lists, allowing certain requests that would be matched against the +# latter in their original state to effectively be converted into grey requests. +# With this option enabled, the exception site/URL/regexpURL lists are also re-checked +# after replacement, making it possible for URL replacement to trigger exceptions based +# on them. +# Defaults to off. +recheckreplacedurls = off + +# Misc settings + +# if on it adds an X-Forwarded-For: to the HTTP request +# header. This may help solve some problem sites that need to know the +# source ip. on | off +forwardedfor = on + +# if on it uses the X-Forwarded-For: to determine the client +# IP. This is for when you have squid between the clients and e2guardian. +# Warning - headers are easily spoofed. on | off +usexforwardedfor = on + +# as mentioned above, the headers can be easily spoofed in order to fake the +# request origin by setting the X-Forwarded-For header. If you have the +# "usexforwardedfor" option enabled, you may want to specify the IPs from which +# this kind of header is allowed, such as another upstream proxy server for +# instance If you want authorize multiple IPs, specify each one on an individual +# xforwardedforfilterip line. +# xforwardedforfilterip = + +# if on it logs some debug info regarding accept()ing and failed connections +# which +# can usually be ignored. These are logged by syslog. It is safe to leave +# it on or off +logconnectionhandlingerrors = on + +#sets the number of worker threads to use +# +# This figure is the maximum number of concurrent connections. +# If more connections are made, connections will queue until a worker thread is free. +# On large site you might want to try 5000 (max value 20000) +httpworkers = 500 + +# Process options +# (Change these only if you really know what you are doing). +# These options allow you to run multiple instances of e2guardian on a single machine. +# Remember to edit the log file path above also if that is your intention. + +# PID filename +# +# Defines process id directory and filename. +#pidfilename = '/var/run/e2guardian.pid' + +# Disable daemoning +# If enabled the process will not fork into the background. +# It is not usually advantageous to do this. +# on|off (defaults to off) +nodaemon = off + +# Disable logging process +# on|off (defaults to off) +nologger = off + +# Enable logging of "ADs" category blocks +# on|off (defaults to off) +logadblocks = off + +# Enable logging of client User-Agent +# Some browsers will cause a *lot* of extra information on each line! +# on|off (defaults to off) +loguseragent = off + +# Daemon runas user and group +# This is the user that e2guardian runs as. Normally the user/group nobody. +# Uncomment to use. Defaults to the user set at compile time. +# Temp files created during virus scanning are given owner and group read + +# clamdscan, the two processes must run with either the same group or user ID. +#daemonuser = 'e2guardian' +#daemongroup = 'e2guardian' + + +# Mail program +# Path (sendmail-compatible) email program, with options. +# Not used if usesmtp is disabled (filtergroup specific). +#mailer = '/usr/sbin/sendmail -t' # NOT YET IMPLIMENTED + +# Enable SSL support +# This must be present to enable MITM and/or Cert checking +# default is off +enablessl = off + +#SSL certificate checking path +#Path to CA certificates used to validate the certificates of https sites. +# if left blank openssl default ca certificate bundle will be used +#Leave as default unless you want to load non-default cert bundle +#sslcertificatepath = '' + +#SSL man in the middle +#CA certificate path +#Path to the CA certificate to use as a signing certificate for +#generated certificates. +# default is blank - required if ssl_mitm is enabled. +#cacertificatepath = '/home/e2/e2install/ca.pem' + +#CA private key path +#path to the private key that matches the public key in the CA certificate. +# default is blank - required if ssl_mitm is enabled. +#caprivatekeypath = '/home/e2/e2install/ca.key' + +#Cert private key path +#The public / private key pair used by all generated certificates +# default is blank - required if ssl_mitm is enabled. +#certprivatekeypath = '/home/e2/e2install/cert.key' + +#Generated cert path +#The location where generated certificates will be saved for future use. +#(must be writable by the dg user) +# default is blank - required if ssl_mitm is enabled. +#generatedcertpath = '/home/e2/e2install/generatedcerts/' + +#Warning: if you change the cert start/end time from default on a running +# system you will need to clear the generated certificate +# store and also may get problems on running client browsers + +#Generated cert start time (in unix time) - optional +# defaults to 1417872951 = 6th Dec 2014 +# generatedcertstart = 1417872951 + +#Generated cert end time (in unix time) - optional +# defaults to generatedcertstart + 10 years +#genratedcertend = +# generatedcertstart = + +# monitor helper path +# If defined this script/binary will be called with start or stop appended as follows:- +# Note change in V4!!! - No longer detects cache failure +# At start after e2guardian has started listener and worker threads with +# ' start' appended +# When e2guardian is stopping with ' stop' appended +# monitorhelper = '/usr/local/bin/mymonitor' + +# monitor flag prefix path +# If defined path will be used to generate flag files as follows:- +# +# At start after e2guardian has started listener and worker threads with +# 'running' appended +# When e2guardian is stopping with 'paused' appended +# Note change in V4!!! - No longer detects cache failure +# monitorflagprefix = '/home/e2g/run/e2g_flag_' + +# Much logic has moved to storyboard files +preauthstoryboard = '/etc/e2guardian/preauth.story' + +# Storyboard tracing +# Warning - produces verbose output - do not use in production +# Output goes to syslog (or stderr in debug mode) +# default off +# storyboardtrace = off + +# Abort if list is missing or unreadable +# default is to warn but then ignore missing lists +# To abort on missing list set to on +# abortiflistmissing = off //NOT YET IMPLIMENTED + +#Search sitelist for ip sites +# In v5 a separate set of lists has been introduced for IP sites +# and normally e2g will no longer check site lists for ip's +# If you want to keep backward list compatablity then set this to +# 'on' - but note this incurs an overhead - putting IP in ipsitelists +# and setting this to off gives the fastest implimentation. +# default is 'on' +searchsitelistforip = on + + +# http header checking setings +# +# Limit number of http header lines in a request/response +# (to guard against attacks) +# Minimum 10 max 250 +# default 50 +# maxheaderlines = 50 diff --git a/config/e2guardian/e2guardianf1.conf b/config/e2guardian/e2guardianf1.conf new file mode 100644 index 0000000..bbd92fb --- /dev/null +++ b/config/e2guardian/e2guardianf1.conf @@ -0,0 +1,527 @@ +# e2guardian filter group config file for version 5.3.1 + +# This file is re-read on gentle restart and any changes actioned + +# Filter group mode IS NOT LONGER SUPPORTED +# Unauthenticated users are treated as being in the default filter group. +# groupmode = 1 #DISABLED + +# Filter group name +# Used to fill in the -FILTERGROUP- placeholder in the HTML template file, and to +# name the group in the access logs +# Defaults to empty string +#groupname = '' +groupname = 'no_name_group' + +# Much logic has moved to storyboard files +storyboard = '/etc/e2guardian/examplef1.story' + +# Enable legacy (DG) ssl logic +# +# The following option is replaced by storyboard logic +# ssllegacylogic = off + +# Content filtering files location + +bannedphraselist = '/etc/e2guardian/lists/bannedphraselist' +weightedphraselist = '/etc/e2guardian/lists/weightedphraselist' +exceptionphraselist = '/etc/e2guardian/lists/exceptionphraselist' + +### NOTE - New format for all other list definitions in v5.0 +### see notes/V5_list_definition for details + +#banned lists +sitelist = 'name=banned,messageno=500,path=/etc/e2guardian/lists/bannedsitelist' +ipsitelist = 'name=banned,messageno=510,path=/etc/e2guardian/lists/bannedsiteiplist' +urllist = 'name=banned,messageno=501,path=/etc/e2guardian/lists/bannedurllist' +regexpboollist = 'name=banned,messageno=503,path=/etc/e2guardian/lists/bannedregexpurllist' +regexpboollist = 'name=banneduseragent,messageno=522,path=/etc/e2guardian/lists/bannedregexpuseragentlist' + +sitelist = 'name=bannedssl,messageno=520,path=/etc/e2guardian/lists/bannedsslsitelist' +ipsitelist = 'name=bannedssl,messageno=520,path=/etc/e2guardian/lists/bannedsslsiteiplist' + +#grey (i.e. content check) lists +sitelist = 'name=grey,path=/etc/e2guardian/lists/greysitelist' +ipsitelist = 'name=grey,path=/etc/e2guardian/lists/greysiteiplist' +urllist = 'name=grey,path=/etc/e2guardian/lists/greyurllist' +sitelist = 'name=greyssl,path=/etc/e2guardian/lists/greysslsitelist' +ipsitelist = 'name=greyssl,path=/etc/e2guardian/lists/greysslsiteiplist' + +#exception lists +sitelist = 'name=exception,messageno=602,path=/etc/e2guardian/lists/exceptionsitelist' +ipsitelist = 'name=exception,messageno=602,path=/etc/e2guardian/lists/exceptionsiteiplist' +urllist = 'name=exception,messageno=603,path=/etc/e2guardian/lists/exceptionurllist' +regexpboollist = 'name=exception,messageno=609,path=/etc/e2guardian/lists/exceptionregexpurllist' +regexpboollist = 'name=exceptionuseragent,messageno=610,path=/etc/e2guardian/lists/exceptionregexpuseragentlist' + +sitelist = 'name=refererexception,messageno=620,path=/etc/e2guardian/lists/refererexceptionsitelist' +ipsitelist = 'name=refererexception,messageno=620,path=/etc/e2guardian/lists/refererexceptionsiteiplist' +urllist = 'name=refererexception,messageno=620,path=/etc/e2guardian/lists/refererexceptionurllist' +sitelist = 'name=embededreferer,path=/etc/e2guardian/lists/embededreferersitelist' +ipsitelist = 'name=embededreferer,path=/etc/e2guardian/lists/embededreferersiteiplist' +urllist = 'name=embededreferer,path=/etc/e2guardian/lists/embededrefererurllist' + +#modification lists +regexpreplacelist = 'name=change,path=/etc/e2guardian/lists/urlregexplist' +regexpreplacelist = 'name=sslreplace,path=/etc/e2guardian/lists/sslsiteregexplist' + +#redirection lists +regexpreplacelist = 'name=redirect,path=/etc/e2guardian/lists/urlredirectregexplist' + +contentregexplist = '/etc/e2guardian/lists/contentregexplist' + +# local versions of lists + +#local banned +sitelist = 'name=localbanned,messageno=560,path=/etc/e2guardian/lists/localbannedsitelist' +#ipsitelist = 'name=localbanned,messageno=560,path=/etc/e2guardian/lists/localbannedsiteiplist' +#urllist = 'name=localbanned,messageno=561,path=/etc/e2guardian/lists/localbannedurllist' +#sitelist = 'name=localbannedssl,messageno=580,path=/etc/e2guardian/lists/localbannedsslsitelist' +#ipsitelist = 'name=localbannedssl,messageno=580,path=/etc/e2guardian/lists/localbannedsslsiteiplist' +searchlist = 'name=localbanned,messageno=581,path=/etc/e2guardian/lists/localbannedsearchlist' + +#local grey lists +sitelist = 'name=localgrey,path=/etc/e2guardian/lists/localgreysitelist' +#ipsitelist = 'name=localgrey,path=/etc/e2guardian/lists/localgreysiteiplist' +#urllist = 'name=localgrey,path=/etc/e2guardian/lists/localgreyurllist' +sitelist = 'name=localgreyssl,path=/etc/e2guardian/lists/localgreysslsitelist' +#ipsitelist = 'name=localgreyssl,path=/etc/e2guardian/lists/localgreysslsiteiplist' + +#local exception lists +sitelist = 'name=localexception,messageno=662,path=/etc/e2guardian/lists/localexceptionsitelist' +#ipsitelist = 'name=localexception,messageno=662,path=/etc/e2guardian/lists/localexceptionsiteiplist' +#urllist = 'name=localexception,messageno=663,path=/etc/e2guardian/lists/localexceptionurllist' + + +# Filetype filtering +# +# Allow bannedregexpurllist with grey list mode +# +# The following option is replaced by storyboard logic +# bannedregexwithblanketblock = off +# +# The following option is replaced by storyboard logic +#blockdownloads = off + +# Phrase filtering additional mime types (by default text/*) +# textmimetypes = 'application/xhtml+xml,application/xml,application/json,application/javascript,application/x-javascript' + +# Uncomment the two lines below if want to only allow extentions/mime types in these lists +# You will also need to uncomment the checkfiletype function in site.story to enable this +#fileextlist = 'name=exceptionextension,path=/etc/e2guardian/lists/exceptionextensionlist' +#mimelist = 'name=exceptionmime,path=/etc/e2guardian/lists/exceptionmimelist' +# +# Use the following lists to block specific kinds of file downloads. +# +fileextlist = 'name=bannedextension,messageno=900,path=/etc/e2guardian/lists/bannedextensionlist' +mimelist = 'name=bannedmime,messageno=800,path=/etc/e2guardian/lists/bannedmimetypelist' +# +# In either file filtering mode, the following list can be used to override +# MIME type & extension blocks for particular domains & URLs (trusted download sites). +# +sitelist = 'name=exceptionfile,path=/etc/e2guardian/lists/exceptionfilesitelist' +ipsitelist = 'name=exceptionfile,path=/etc/e2guardian/lists/exceptionfilesiteiplist' +urllist = 'name=exceptionfile,path=/etc/e2guardian/lists/exceptionfileurllist' + +# POST protection (web upload and forms) +# does not block forms without any file upload, i.e. this is just for +# blocking or limiting uploads +# measured in kibibytes after MIME encoding and header bumph +# use 0 for a complete block +# use higher (e.g. 512 = 512Kbytes) for limiting +# use -1 for no blocking +# NOTE: POST PROTECTION IS NOT YET IMPLIMENTED IN V5 +#maxuploadsize = 512 +#maxuploadsize = 0 +maxuploadsize = -1 + +# Categorise without blocking: +# Supply categorised lists here and the category string shall be logged against +# matching requests, but matching these lists does not perform any filtering +# action. +#sitelist = 'name=log,path=/etc/e2guardian/lists/logsitelist' +#ipsitelist = 'name=log,path=/etc/e2guardian/lists/logsiteiplist' +#urllist = 'name=log,path=/etc/e2guardian/lists/logurllist' +#regexpboollist = 'name=log,path=/etc/e2guardian/lists/logregexpurllist' + +# Outgoing HTTP header rules: +# Optional lists for blocking based on, and modification of, outgoing HTTP +# request headers. Format for headerregexplist is one modification rule per +# line, similar to content/URL modifications. Format for +# bannedregexpheaderlist is one regular expression per line, with matching +# headers causing a request to be blocked. +# Headers are matched/replaced on a line-by-line basis, not as a contiguous +# block. +# Use for example, to remove cookies or prevent certain user-agents. +regexpreplacelist = 'name=headermods,path=/etc/e2guardian/lists/headerregexplist' +regexpboollist = 'name=bannedheader,path=/etc/e2guardian/lists/bannedregexpheaderlist' +regexpboollist = 'name=exceptionheader,path=/etc/e2guardian/lists/exceptionregexpheaderlist' +# used for Youtube add cookies etc +regexpreplacelist = 'name=addheader,path=/etc/e2guardian/lists/addheaderregexplist' + +#Virus checking exceptions - matched urls will not be virus checked +#mimelist = 'name=exceptionvirus,path=/etc/e2guardian/lists/contentscanners/exceptionvirusmimetypelist' +#fileextlist = 'name=exceptionvirus,path=/etc/e2guardian/lists/contentscanners/exceptionvirusextensionlist' +#sitelist = 'name=exceptionvirus,path=/etc/e2guardian/lists/contentscanners/exceptionvirussitelist' +#ipsitelist = 'name=exceptionvirus,path=/etc/e2guardian/lists/contentscanners/exceptionvirussiteiplist' +#urllist = 'name=exceptionvirus,path=/etc/e2guardian/lists/contentscanners/exceptionvirusurllist' + +# Weighted phrase mode +# Optional; overrides the weightedphrasemode option in e2guardian.conf +# for this particular group. See documentation for supported values in +# that file. +#weightedphrasemode = 0 + +# Naughtiness limit +# This the limit over which the page will be blocked. Each weighted phrase is given +# a value either positive or negative and the values added up. Phrases to do with +# good subjects will have negative values, and bad subjects will have positive +# values. See the weightedphraselist file for examples. +# As a guide: +# 50 is for young children, 100 for old children, 160 for young adults. +naughtynesslimit = 50 + +# Search term blocking +# Search terms can be extracted from search URLs and filtered using one or +# both of two different methods. + +# Method 1 is that developed by Protex where specific +# search terms are contained in a bannedsearchlist. +# (localbannedsearchlist and bannedsearchoveridelist can be used to suppliment +# and overide this list as required.) +# These lists contain banned search words combinations on each line. +# Words are separated by '+' and must be in sorted order within a line. +# so to block 'sexy girl' then the list must contain the line +# girl+sexy +# and this will block both 'sexy girl' and 'girl sexy' +# To use this method, the searchregexplist must be enabled and the bannedsearchlist(s) defined + +# Method 2 is uses the +# bannedphraselist, weightedphraselist and exceptionphraselist, with a separate +# threshold for blocking than that used for normal page content. +# To do this, the searchregexplist must be enabled and searchtermlimit +# must be greater than 0. + +# +# Search engine regular expression list (need for both options) +# List of regular expressions for matching search engine URLs. It is assumed +# that the search terms themselves will be contained in the +# of output of each expression. +regexpreplacelist = 'name=searchterms,path=/etc/e2guardian/lists/searchregexplist' +# +# Banned Search Term list(s) for option 1 +searchlist = 'name=banned,path=/etc/e2guardian/lists/bannedsearchlist' +searchlist = 'name=override,path=/etc/e2guardian/lists/bannedsearchoveridelist' + + +# Search term limit (for Option 2) +# The limit over which requests will be blocked for containing search terms +# which match the weightedphraselist. This should usually be lower than the +# 'naughtynesslimit' value above, because the amount of text being filtered +# is only a few words, rather than a whole page. +# This option must be uncommented if searchregexplist is uncommented. +# A value of 0 here indicates that search terms should be extracted, +# but no phrase filtering should be performed on the resulting text. +#searchtermlimit = 0 +# +# Search term phrase lists (for Option 2) +# If the three lines below are uncommented, search term blocking will use +# the banned, weighted & exception phrases from these lists, instead of using +# the same phrase lists as for page content. This is optional but recommended, +# as weights for individual phrases in the "normal" lists may not be +# appropriate for blocking when those phrases appear in a much smaller block +# of text. +# Please note that all or none of the below should be uncommented, not a +# mixture. +# NOTE: these are phrase lists and still use the old style defines +#bannedsearchtermlist = '/etc/e2guardian/lists/bannedsearchtermlist' +#weightedsearchtermlist = '/etc/e2guardian/lists/weightedsearchtermlist' +#exceptionsearchtermlist = '/etc/e2guardian/lists/exceptionsearchtermlist' + +# Category display threshold +# This option only applies to pages blocked by weighted phrase filtering. +# Defines the minimum score that must be accumulated within a particular +# category in order for it to show up on the block pages' category list. +# All categories under which the page scores positively will be logged; those +# that were not displayed to the user appear in brackets. +# +# -1 = display only the highest scoring category +# 0 = display all categories (default) +# > 0 = minimum score for a category to be displayed +categorydisplaythreshold = 0 + +# Embedded URL weighting +# When set to something greater than zero, this option causes URLs embedded within a +# page's HTML (from links, image tags, etc.) to be extracted and checked against the +# bannedsitelist and bannedurllist. Each link to a banned page causes the amount set +# here to be added to the page's weighting. +# The behaviour of this option with regards to multiple occurrences of a site/URL is +# affected by the weightedphrasemode setting. +# +# NB: Currently, this feature uses regular expressions that require the PCRE library. +# As such, it is only available if you compiled e2guardian with '--enable-pcre=yes'. +# You can check compile-time options by running 'e2guardian -v'. +# +# Set to 0 to disable. +# Defaults to 0. +# WARNING: This option is highly CPU intensive! +embeddedurlweight = 0 + +# Temporary Denied Page Bypass +# This provides a link on the denied page to bypass the ban for a few minutes. To be +# secure it uses a random hashed secret generated at daemon startup. You define the +# number of seconds the bypass will function for before the deny will appear again. +# To allow the link on the denied page to appear you will need to edit the template.html +# or e2guardian.pl file for your language. +# 300 = enable for 5 minutes +# 0 = disable ( defaults to 0 ) +# -1 - depreciated - for backward compatability enables cgibypass with bypassversion 1 +bypass = 0 + +# Byapss version 2 is experimental, provide a secure cgi communication (see notes/cgi_bypass documentation) +# + +# Bypass version +# can be 1 or 2 +# Always use v2 unless you have old style cgi hash generation in use +# Default is 1 +# bypassversion = 2 + +# cgibypass - Use a separate program/CGI to (in v1 generate) or (in v2 validate) link +# 'on' or 'off' (default) +# cgibypass = 'off' + +# Temporary Denied Page Bypass Secret Key +# Rather than generating a random key you can specify one. It must be more than 8 chars. +# '' = generate a random one (recommended and default) +# 'Mary had a little lamb.' = an example +# '76b42abc1cd0fdcaf6e943dcbc93b826' = an example +bypasskey = '' + +# magic key for cgi bypass v2 - used to sign communications between e2g and cgi +# default is blank +#cgikey = 'you must change this text in order to be secure' + +# Users will not be able to bypass sites/urls in these lists +sitelist = 'name=bannedbypass,messageno=500,path=/etc/e2guardian/lists/bannedsitelistwithbypass' +#ipsitelist = 'name=bannedbypass,messageno=500,path=/etc/e2guardian/lists/bannedsiteiplistwithbypass' +#urllist = 'name=bannedbypass,messageno=501,path=/etc/e2guardian/lists/bannedurllistwithbypass' + +# Infection/Scan Error Bypass +# Similar to the 'bypass' setting, but specifically for bypassing files scanned and found +# to be infected, or files that trigger scanner errors - for example, archive types with +# recognised but unsupported compression schemes, or corrupt archives. +# The option specifies the number of seconds for which the bypass link will be valid. +# 300 = enable for 5 minutes +# 0 = disable (default) +# -1 - depreciated - for backward compatability enables cgiinfectionbypass with bypassversion 1 +infectionbypass = 0 + +# cgiinfectionbypass - Use a separate program/CGI to (v1 generate) or (v2 validate) link +# 'on' or 'off' (default) +# cgiinfectionbypass = 'off' + +# Infection/Scan Error Bypass Secret Key +# Same as the 'bypasskey' option, but used for infection bypass mode. +infectionbypasskey = '' + +# Infection/Scan Error Bypass on Scan Errors Only +# Enable this option to allow infectionbypass links only when virus scanning fails, +# not when a file is found to contain a virus. +# on = enable (default and highly recommended) +# off = disable +infectionbypasserrorsonly = on + +# Disable content scanning +# If you enable this option you will disable content scanning for this group. +# Content scanning primarily is AV scanning (if enabled) but could include +# other types. +# (on|off) default = off. +disablecontentscan = off + +# Disable content scanning with error (timeout, AV crash, etc) +# If you enable this option you will allow object with an unexpected result +# Content scanning primarily is AV scanning (if enabled) but could include +# other types. +# With "on" you can allow INFECTED objects +# (on|off) default = off. (default and highly recommended) +disablecontentscanerror = off + +# If 'on' exception sites, urls, users etc will be scanned +# This is probably not desirable behavour as exceptions are +# supposed to be trusted and will increase load. +# Correct use of grey lists are a better idea. +# (on|off) default = off +contentscanexceptions = off + +# Auth plugins +# Enable Deep URL Analysis +# When enabled, DG looks for URLs within URLs, checking against the bannedsitelist and +# bannedurllist. This can be used, for example, to block images originating from banned +# sites from appearing in Google Images search results, as the original URLs are +# embedded in the thumbnail GET requests. +# (on|off) default = off +deepurlanalysis = off + +# reportinglevel +# +# -1 = log, but do not block - Stealth mode +# 0 = just say 'Access Denied' +# 1 = report why but not what denied phrase +# 2 = report fully +# 3 = use HTML template file (accessdeniedaddress ignored) - recommended +# +# If defined, this overrides the global setting in e2guardian.conf for +# members of this filter group. +# +reportinglevel = 3 + +# accessdeniedaddress is the address of your web server to which the cgi +# e2guardian reporting script was copied. Only used in reporting levels +# 1 and 2. +# +# This webserver must be either: +# 1. Non-proxied. Either a machine on the local network, or listed as an +# exception in your browser's proxy configuration. +# 2. Added to the exceptionsitelist. Option 1 is preferable; this option is +# only for users using both transparent proxying and a non-local server +# to host this script. +# +#accessdeniedaddress = 'http://YOURSERVER.YOURDOMAIN/cgi-bin/e2guardian.pl' + +# HTML Template override +# If defined, this specifies a custom HTML template file for members of this +# filter group, overriding the global setting in e2guardian.conf. This is +# only used in reporting level 3. +# +# The default template file path is //template.html +# e.g. /usr/share/e2guardian/languages/ukenglish/template.html when using 'ukenglish' +# language. +# +# This option generates a file path of the form: +# // +# e.g. /usr/share/e2guardian/languages/ukenglish/custom.html +# +#htmltemplate = 'custom.html' + +#Template for use to report network issues and sites which are not responding +# The default template file path is //neterr_template.html +# e.g. /usr/share/e2guardian/languages/ukenglish/neterr_template.html when using 'ukenglish' +# language. +#neterrtemplate = 'custom_neterr_template.html' + +# Non standard delimiter (only used with accessdeniedaddress) +# To help preserve the full banned URL, including parameters, the variables +# passed into the access denied CGI are separated using non-standard +# delimiters. This can be useful to ensure correct operation of the filter +# bypass modes. Parameters are split using "::" in place of "&", and "==" in +# place of "=". +# Default is enabled, but to go back to the standard mode, disable it. + +#nonstandarddelimiter = off + +# Email reporting - original patch by J. Gauthier + +# Use SMTP +# If on, will enable system wide events to be reported by email. +# need to configure mail program (see 'mailer' in global config) +# and email recipients +# default usesmtp = off +usesmtp = off #NOT YET TESTED + +# mailfrom +# who the email would come from +# example: mailfrom = 'e2guardian@mycompany.com' +mailfrom = '' + +# avadmin +# who the virus emails go to (if notify av is on) +# example: avadmin = 'admin@mycompany.com' +avadmin = '' + +# contentdmin +# who the content emails go to (when thresholds are exceeded) +# and contentnotify is on +# example: contentadmin = 'admin@mycompany.com' +contentadmin = '' + +# avsubject +# Subject of the email sent when a virus is caught. +# only applicable if notifyav is on +# default avsubject = 'e2guardian virus block' +avsubject = 'e2guardian virus block' + +# content +# Subject of the email sent when violation thresholds are exceeded +# default contentsubject = 'e2guardian violation' +contentsubject = 'e2guardian violation' + +# notifyAV +# This will send a notification, if usesmtp/notifyav is on, any time an +# infection is found. +# Important: If this option is off, viruses will still be recorded like a +# content infraction. +notifyav = off + +# notifycontent +# This will send a notification, if usesmtp is on, based on thresholds +# below +notifycontent = off + +# thresholdbyuser +# results are only predictable with user authenticated configs +# if enabled the violation/threshold count is kept track of by the user +thresholdbyuser = off + +#violations +# number of violations before notification +# setting to 0 will never trigger a notification +violations = 0 + +#threshold +# this is in seconds. If 'violations' occur in 'threshold' seconds, then +# a notification is made. +# if this is set to 0, then whenever the set number of violations are made a +# notifaction will be sent. +threshold = 0 + +#NOTE to enable SSL MITM or NON-MITM SSL CERT checking +# enablessl must be defined as 'yes' in e2guardian.conf + +#SSL certificate checking +# Check that ssl certificates for servers on https connections are valid +# and signed by a ca in the configured path +# ONLY for connections that are NOT MITM +#sslcertcheck = off - NOT implimented in V5 yet + +#SSL man in the middle +# Forge ssl certificates for all non-exception sites, decrypt the data then re encrypt it +# using a different private key. Used to filter ssl sites +sslmitm = off + +#Limit SSL MITM to sites in greysslsitelist(s) +# ignored if sslmitm is off +# SSL sites not matching greysslsitelist will be treat as if sslmitm is off. +# The following option is replaced by storyboard logic +#onlymitmsslgrey = off - ignored in V5 + +# Enable MITM site certificate checking +# ignored if sslmitm is off +# default (recommended) is 'on' +mitmcheckcert = on + +#Do not check ssl certificates for sites listed +# Can be used to allow sites with self-signed or invalid certificates +# or to reduced CPU load by not checking certs on heavily used sites (e.g. Google, Bing) +# Use with caution! +# Ignored if mitmcheckcert is 'off' +#nocheckcertsitelist = '/etc/e2guardian/lists/nocheckcertsitelist' +sitelist = 'name=nocheckcert,path=/etc/e2guardian/lists/nocheckcertsitelist' +ipsitelist = 'name=nocheckcert,path=/etc/e2guardian/lists/nocheckcertsiteiplist' +# + +# Auto switch to MITM with upstream connection error or to deliver block page +# ignored if sslmitm is off +# To revert to v4 type behavour switch this off +# Default is 'on' +# automitm = on diff --git a/config/e2guardian/examplef1.story b/config/e2guardian/examplef1.story new file mode 100644 index 0000000..a4ea505 --- /dev/null +++ b/config/e2guardian/examplef1.story @@ -0,0 +1,48 @@ +.Include +.Include + +# Add any altered functions for this filtergroup here +# They will overwrite library or site level definitions + +# To allow unfiltered access to this group +# uncomment next 4 lines +#function(checkrequest) +#if(true) return setexception +#function(thttps-checkrequest) +#if(true) return setexception + +# To block all access to this group +# uncomment next 4 lines +#function(checkrequest) +#if(true,,105) return setblock +#function(sslexceptioncheck) +#function(localsslcheckrequest) + +# Note: Blanket blocks are checked after exceptions +# and can be used to make a 'walled garden' filtergroup + +# To create blanket block for http +# uncomment next line and one condition line. +#function(checkblanketblock) +#if(true,,502) return setblock # = ** total blanket +#if(siteisip,,505) return setblock # = *ip ip blanket + +# To create blanket block for SSL +# uncomment next line and one condition line. +#function(sslcheckblanketblock) +#if(true,,506) return setblock # = **s total blanket +#if(siteisip,,507) return setblock # = **ips ip blanket + +# To limit MITM to sslgreylist +# replaces onlymitmsslgrey e2guardianf1.conf option +# uncomment the next 2 lines +#function(sslcheckmitm) +#if(true) return sslcheckmitmgreyonly + + +# SNI checking - overrides default action when no SNI or TSL is present on a +# THTTPS connection +# To allow (tunnell) non-tls and/or non-sni connections uncomment the next 3 lines +#function(checksni) +#ifnot(tls,,511) return setexception # change to setblock to block only non-tls +#ifnot(hassniset,,512) return setexception diff --git a/config/e2guardian/languages/arspanish/fancydmtemplate.html b/config/e2guardian/languages/arspanish/fancydmtemplate.html new file mode 100644 index 0000000..0f79f6b --- /dev/null +++ b/config/e2guardian/languages/arspanish/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/arspanish/messages b/config/e2guardian/languages/arspanish/messages new file mode 100644 index 0000000..65beb6b --- /dev/null +++ b/config/e2guardian/languages/arspanish/messages @@ -0,0 +1,119 @@ +# e2guardian messages file in AR Spanish +# Translated by Roberto Quiroga +"0","Message number absent" # needs translation +"1","Acceso Denegado" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Su dirección IP no esta autorizada a visitar: " +"101","Su dirección IP no esta autorizada navegar." +"102","El usuario no esta autorizado a visitar: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","La URL solicitada esta mal formada." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Se encontró la frase no permitida: " +"301","Se encontró una frase no permitida" +"400","Combinación de frases no permitida: " +"401","Combinación de frases no permitida." +"402","Límite de ponderación de frases de " +"403","Límite de ponderación de frases excedido" +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Sitio no permitido: " +"501","URL no permitida: " +"502","El sitio no esta en la lista permitida por el bloqueo activo." +"503","Banned Regular Expression URL: " +"503","URL bloqueada por Expresion Regular: " +"504","URL bloqueada por Expresion Regular." +"505","Solo se suministro la direccion IP y el bloqueo esta activo." +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Se encontró una excepción por IP de origen." +"601","Se encontró una excepción por usuario de origen." +"602","Se encontró una excepción por lugar." +"603","Se encontró una excepción por URL." +"604","Se encontró una excepción por la frase: " +"605","Se encontró una excepción por la combinación de frases: " +"606","Bypass URL excepción." +"607","Bypass cookie excepción." +"608","Scan bypass URL exception." +"609","Exception regular expression URL match: " +# 606,607 by Daniel Barron - corrections welcome +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","La subida esta bloqueada." +"701","Límite de subida excedido." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","Clase MIME bloqueada: " +"900","Extension bloqueada: " +"1000","Clasificación PICS excedida en el sitio indicado." +"1100","Virus or bad content detected." +"1101","Advert blocked" +"1200","Please wait - downloading to be scanned..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","File no longer available" diff --git a/config/e2guardian/languages/arspanish/neterr_template.html b/config/e2guardian/languages/arspanish/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/arspanish/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/arspanish/template.html b/config/e2guardian/languages/arspanish/template.html new file mode 100644 index 0000000..97a00c0 --- /dev/null +++ b/config/e2guardian/languages/arspanish/template.html @@ -0,0 +1,38 @@ +e2guardian - Acceso Denegado + +

EL ACCESO HA SIDO DENEGADO -USER-

+
EL ACCESO A LA PAGINA:

+-URL- +

... ha sido denegado por la siguiente razón:

+-REASONGIVEN- +

Ud. esta viendo este mensaje de error porque la página a la que
+intenta acceder contiene, o esta clasificada como conteniendo,
+material que se considera inapropiado.
+

Si lo desea contacte al Administrador de Sistemas.
+ +

Powered by e2guardian +

+ + + diff --git a/config/e2guardian/languages/bulgarian/fancydmtemplate.html b/config/e2guardian/languages/bulgarian/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/bulgarian/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/bulgarian/messages b/config/e2guardian/languages/bulgarian/messages new file mode 100644 index 0000000..66fdce2 --- /dev/null +++ b/config/e2guardian/languages/bulgarian/messages @@ -0,0 +1,119 @@ +# e2guardian messages file in Bulgarian +# by Pavel Constantinov +"0","Message number absent" # needs translation +"1"," " +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100"," IP : " +"101"," IP ." +"102"," : " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200"," URL ." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300"," : " +"301"," ." +"400"," : " +"401"," ." +"402"," " +"403"," ." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500"," : " +"501"," URL: " +"502"," Blanket Block ." +"503"," URL : " +"504"," URL ." +"505"," Blanket IP Block IP address." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600"," IP ." +"601"," IP ." +"602"," ." +"603"," URL-." +"604"," : " +"605"," : " +"606","Bypass URL exception." +"607","Bypass cookie exception." +"608","Scan bypass URL exception." +"609","Exception regular expression URL match: " +# 606,607 by Daniel Barron - corrections welcome +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700"," ." +"701"," ." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800"," MIME: " +"900"," : " +"1000"," ." +"1100","Virus or bad content detected." +"1101","Advert blocked" +"1200","Please wait - downloading to be scanned..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","File no longer available" diff --git a/config/e2guardian/languages/bulgarian/neterr_template.html b/config/e2guardian/languages/bulgarian/neterr_template.html new file mode 100644 index 0000000..d2bb67e --- /dev/null +++ b/config/e2guardian/languages/bulgarian/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/bulgarian/template.html b/config/e2guardian/languages/bulgarian/template.html new file mode 100644 index 0000000..d63e349 --- /dev/null +++ b/config/e2guardian/languages/bulgarian/template.html @@ -0,0 +1,59 @@ + + + + + + e2guardian - Access Denied + + + +

+

+ , -USER-

+ +
: +

-URL- +

... : +

-REASONGIVEN-

+ +
+ + + +
+
, , + +
, .
+
+ +
+ + + +
, ICT + .
+ +
+

Powered by e2guardian

+ + + + diff --git a/config/e2guardian/languages/chinesebig5/fancydmtemplate.html b/config/e2guardian/languages/chinesebig5/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/chinesebig5/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/chinesebig5/messages b/config/e2guardian/languages/chinesebig5/messages new file mode 100644 index 0000000..addfd1f --- /dev/null +++ b/config/e2guardian/languages/chinesebig5/messages @@ -0,0 +1,120 @@ +# e2guardian messages file +# Translated to Traditional Chinese (Big5) by: Fr. Visminlu Vicente L. Chua, S.J. 2002-10-10 +# 2004-08-20: Translated 606 and 607 +# 2008/10/16: Translated 608, 609, 1100, 1101, 1200, 1210, 1220, 1230 +"0","Message number absent" # needs translation +"1","ڵŪ" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","zϥΪ IP }\sںG" +"101","zϥΪ IP }\sںC" +"102","zϥΪbW٤\sںG" +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","zҽШD URL 榡~C" +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","QTyryG" +"301","QTyryC" +"400","QTզXyryG" +"401","QTզXyryC" +"402","[vyry" +"403","WL[vyryC" +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","QT}G" +"501","QT URLG" +"502","ͮġAӨ}buզWv̡C" +"503","uWܡvoOQT URLG" +"504","uWܡvQT URLC" +"505","ϥ IP ͮġAӨӦa}uO@IPa}C" +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Pҥ~Ȥ IP ۦPC" +"601","Pҥ~ȤbۦPC" +"602","Pҥ~}ۦPC" +"603","Pҥ~URLۦPC" +"604","ҥ~yryG" +"605","զXҥ~yryG" +"606","VL URL ҥ~C" +"607","VL cookie ҥ~C" +"608","yɲL URL ҥ~C" +"609","Wܨҥ~ URL kXG" +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","TWǡC" +"701","WLWǷC" +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","QTMIMEwAG" +"900","QTɦWG" +"1000","W}WLFPICSХܼhC" +"1100","frΤ}eC" +"1101","si" +"1200","еy - bUAԱy ..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","UC}ly ..." +"1220","yC

Io̤UG " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","ɮפwsb" diff --git a/config/e2guardian/languages/chinesebig5/neterr_template.html b/config/e2guardian/languages/chinesebig5/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/chinesebig5/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/chinesebig5/template.html b/config/e2guardian/languages/chinesebig5/template.html new file mode 100644 index 0000000..cd90907 --- /dev/null +++ b/config/e2guardian/languages/chinesebig5/template.html @@ -0,0 +1,46 @@ + + +e2guardian - TŪ + + +

T -USER- Ū

+
ŪG +

-URL- +

... QT]FHUzѡG +

-REASONGIVEN- +

+ + + +
zݨoӿ~]znŪAơC +
+

+ + + +
pzDpICTխκ޲zC +
+

Powered by e2guardian +

+ + + diff --git a/config/e2guardian/languages/chinesegb2312/fancydmtemplate.html b/config/e2guardian/languages/chinesegb2312/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/chinesegb2312/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/chinesegb2312/messages b/config/e2guardian/languages/chinesegb2312/messages new file mode 100644 index 0000000..a329ee3 --- /dev/null +++ b/config/e2guardian/languages/chinesegb2312/messages @@ -0,0 +1,119 @@ +# e2guardian messages file in chinese gb2312 +# By Chen YiFei +"0","Message number absent" # needs translation +"1","ܾ" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100"," IP ַȨ web : " +"101"," IP ַȨ web ʡ" +"102","ʺȨ web ʡ " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200"," URL ʽд" +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","ֱֹĶ: " +"301","ֱֹĶ" +"400","ֱֹ϶: " +"401","ֱֹ϶" +"402"," ȨΪ: " +"403","Ȩơ" +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","ֹվ: " +"501","ֹ URL: " +"502","ȫֹЧվ㲢ڰС" +"503","ʽֹ URL: " +"504","ֱʽֹ URL" +"505","ȫֹʹ IP Чõַһ IP ַ" +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","ƥһĿͻ IP ַ" +"601","ƥһĿͻʺš" +"602","ƥһվ㡣" +"603","ƥһ URL" +"604","Ķ:" +"605","϶: " +"606","Bypass URL exception." +"607","Bypass cookie exception." +"608","Scan bypass URL exception." +"609","Exception regular expression URL match: " +# 606,607 by Daniel Barron - corrections welcome +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","ֹϴļ" +"701","ļϴ޶" +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","ֹ MIME : " +"900","ֹļչ: " +"1000","վ PICS ǩ" +"1100","Virus or bad content detected." +"1101","Advert blocked" +"1200","Please wait - downloading to be scanned..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","File no longer available" diff --git a/config/e2guardian/languages/chinesegb2312/neterr_template.html b/config/e2guardian/languages/chinesegb2312/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/chinesegb2312/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/chinesegb2312/template.html b/config/e2guardian/languages/chinesegb2312/template.html new file mode 100644 index 0000000..ab72bc4 --- /dev/null +++ b/config/e2guardian/languages/chinesegb2312/template.html @@ -0,0 +1,33 @@ +e2guardian - Access Denied + +

ʱܾ -USER-

+
ʸҳ:

+-URL- +

... ԭܾ:

+-REASONGIVEN- +

Ϣԭͼʵҳвʵݡ
+

κʣϵ ICT ЭԱܡ
+ +

Powered by e2guardian +

+ + + diff --git a/config/e2guardian/languages/czech/fancydmtemplate.html b/config/e2guardian/languages/czech/fancydmtemplate.html new file mode 100644 index 0000000..28296b7 --- /dev/null +++ b/config/e2guardian/languages/czech/fancydmtemplate.html @@ -0,0 +1,173 @@ + + + Stahuji -FILENAME- (-FILESIZE- bytes) + + + + + + diff --git a/config/e2guardian/languages/czech/messages b/config/e2guardian/languages/czech/messages new file mode 100644 index 0000000..4177961 --- /dev/null +++ b/config/e2guardian/languages/czech/messages @@ -0,0 +1,119 @@ +# DansGuardian messages file in Czech +# by Richard Bukovansky bukovansky@atcomp.cz +# updates,recode to utf8 by Jan Bubík bubik@acvyskov.cz +"0","Message number absent" # needs translation +"1","Přístup zamítnut" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Vaši IP adrese není povoleno prohlížet: " +"101","Vaše IP adresa nemá povoleno prohlížení." +"102","Vaše uživatelské jméno nemá povoleno prohlížet: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","Požadované URL je špatně zadáno." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Nalezena zakázaná fráze: " +"301","Nalezena zakázaná fráze." +"400","Nalezena zakázaná kombinace frází: " +"401","Nalezena zakázaná kombinace frází." +"402","Limit vážených frází: " +"403","Byl překročen limit pro vážené fráze." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Zakázaný webový server: " +"501","Zakázaná webová adresa: " +"502","Celoplošné blokování přístupu je aktivováno a tento webový server není povolen." +"503","Nalezena zakázaná webová adresa dle regularního výrazu: " +"504","Nalezena zakázaná webová adresa dle regularního výrazu." +"505","Celoplošné blokovaní IP adres je aktivováno a byla zadána IP adresa." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Nalezena IP adresa s vyjímkou." +"601","Nalezen uživatel s vyjímkou." +"602","Nalezen webový server s vyjímkou." +"603","Nalezena webová adresa s vyjímkou." +"604","Nalezena fráze s vyjímkou: " +"605","Nalezena kombinace frází s vyjímkou: " +"606","Nalezen uživatelem vyžádaný přístup k webové adrese." +"607","Nalezen uživatelem vyžádaný přístup k položce cookie." +"608","Nalezen uživatelem vyžádaný přístup ke škodlivému kódu." +"609","Nalezen regulární výraz s vyjímkou webové adresy: " +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","Nahrávání souborů na web je zakázáno." +"701","Limit nahrávání souborů na web byl překročen." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","Zakázaný typ obsahu: " +"900","Zakázaná přípona souboru: " +"1000","Byle překročena úroveň hodnocení PICS na tomto webovém serveru." +"1100","Detekován virus nebo škodlivý obsah." +"1101","Blokována reklama" +"1200","Prosím vyčkejte - stahuji data k prověření..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Stahování dokončeno. Prověřuji..." +"1220","Prověřeno.

Pro stáhnutí klikněte zde: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","Soubor již neexistuje" diff --git a/config/e2guardian/languages/czech/neterr_template.html b/config/e2guardian/languages/czech/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/czech/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/czech/template.html b/config/e2guardian/languages/czech/template.html new file mode 100644 index 0000000..a67a3d5 --- /dev/null +++ b/config/e2guardian/languages/czech/template.html @@ -0,0 +1,42 @@ + +DansGuardian - Přístup zakázán + + + +

PŘÍSTUP ZAKÁZÁN -USER-

+
Přístup na tuto stránku:

+-URL- +

... byl zakázán z důvodu:

+-REASONGIVEN- +

Zobrazení tohoto chybového +hlášení způsobila stránka, na kterou jste se pokusil(a)
+přistoupit a obsahuje nebo je označena jako obsahující nepatřičný materiál.

+Kategorizace obsahu: -CATEGORIES-
+

Máte-li nějaké dotazy, obraťte +se prosím na vašeho správce sítě či osobu pověřenou správou sítě.
+

Powered by DansGuardian +

+ + + diff --git a/config/e2guardian/languages/danish/fancydmtemplate.html b/config/e2guardian/languages/danish/fancydmtemplate.html new file mode 100644 index 0000000..a65a2bd --- /dev/null +++ b/config/e2guardian/languages/danish/fancydmtemplate.html @@ -0,0 +1,173 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + diff --git a/config/e2guardian/languages/danish/messages b/config/e2guardian/languages/danish/messages new file mode 100644 index 0000000..0731f5b --- /dev/null +++ b/config/e2guardian/languages/danish/messages @@ -0,0 +1,120 @@ +# e2guardian messages file in Danish +# +# Translated by Peter Kilsgaard +"0","Message number absent" # needs translation +"1","Adgang ngtet" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Din IP address har ikke lov til at bruge internet: " +"101","Din IP address har ikke lov til at bruge internet." +"102","Dit brugernavn har ikke lov til at bruge internet: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","Den indtastede adresse er ikke valid." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Forbudt stning fundet: " +"301","Forbudt stning fundet." +"400","Forbudt stningskombination fundet: " +"401","Forbudt stningskombination fundet." +"402","Vgtede stningsgrnse p " +"403","Vgtede stningsgrnse overskredet." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Forbudt side: " +"501","Forbudt Adresse: " +"502","Total blokering er aktiveret og den forspurgte side er ikke p positiv listen." +"503","Forbudt ord i adressefelt: " +"504","Forbudt ord i adressefelt fundet." +"505","IP Blokering er aktiveret og den forspurgte side har IP ingen DNS navn." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Undtagelse PC IP match." +"601","Undtagelse brugernavn match." +"602","Undtagelse side match." +"603","Undtagelse adresse match." +"604","Undtagelses stning fundet: " +"605","Kombinations undtagelse stning fundet: " +"606","Bypass URL undtagelse." +"607","Bypass cookie undtagelse." +"608","Scan bypass URL exception." +"609","Exception regular expression URL match: " +# 606,607 by Daniel Barron - corrections welcome +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","Web upload er forbudt." +"701","Web upload grnse overskredet." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","Forbudt MIME Type: " +"900","Forbudt fil format: " +"1000","PICS niveau overskredet p den pgldende side." +"1100","Virus or bad content detected." +"1101","Advert blocked" +"1200","Please wait - downloading to be scanned..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","File no longer available" diff --git a/config/e2guardian/languages/danish/neterr_template.html b/config/e2guardian/languages/danish/neterr_template.html new file mode 100644 index 0000000..d2bb67e --- /dev/null +++ b/config/e2guardian/languages/danish/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/danish/template.html b/config/e2guardian/languages/danish/template.html new file mode 100644 index 0000000..8abdf13 --- /dev/null +++ b/config/e2guardian/languages/danish/template.html @@ -0,0 +1,68 @@ + + + + + e2guardian - Access Denied + + + + + +

ADGANG NÆGTET -USER-

+


Adgang til denne side:

+

-URL- +

+

... er blevet nægtet på grund af:

+

-REASONGIVEN- +

+
+ + + + +
+

Denne meddelse kommer fordi, siden du forsøger at få + adgang til indeholder, eller er blevet katagoriseret som, uegnet + materiale .

+
+
+
+ + + + + +
+

Hvis du har spørgsmål til + ovennævnte,
bedes du kontakte netværksadministratoren

+
+
+

Powered by +e2guardian +

+

+
+

+ + diff --git a/config/e2guardian/languages/dutch/fancydmtemplate.html b/config/e2guardian/languages/dutch/fancydmtemplate.html new file mode 100644 index 0000000..a65a2bd --- /dev/null +++ b/config/e2guardian/languages/dutch/fancydmtemplate.html @@ -0,0 +1,173 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + diff --git a/config/e2guardian/languages/dutch/messages b/config/e2guardian/languages/dutch/messages new file mode 100644 index 0000000..ca01628 --- /dev/null +++ b/config/e2guardian/languages/dutch/messages @@ -0,0 +1,119 @@ +# e2guardian berichten in het Nederlands +# Door S.A. de Heer +# Updates door Eric Hameleers +"0","Message number absent" # needs translation +"1","Toegang geweigerd" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Uw IP adres mag niet websurfen: " +"101","Uw IP adres mag niet websurfen." +"102","Uw gebruikersnaam mag niet websurfen: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","De gevraagde URL is syntactisch incorrect." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Geblokkeerd woord gevonden: " +"301","Geblokkeerd woord gevonden." +"400","Geblokkerde combinatie van woorden gevonden: " +"401","Geblokkerde combinatie van woorden gevonden." +"402","Gewogen woorden limiet van: " +"403","Gewogen woorden limiet overschreden." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Geblokkeerde website: " +"501","Geblokkeerde URL: " +"502","Web blokkade is actief en deze website is niet in de toegangslijst." +"503","Geblokkeerde reguliere expressie in de URL: " +"504","Geblokkeerde reguliere expressie in de URL gevonden." +"505","IP adressen zijn geblokkeerd en dat adres is enkel een IP adres." +"506","SSL is geblokkeerd en deze website komt niet voor op de toegangslijsten." +"507","SSL IP adressen zijn geblokkeerd en dat adres is enkel een IP addres." +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Uitzonderings IP adres gevonden." +"601","Uitzonderings gebruiker gevonden." +"602","Uitzonderings website gevonden." +"603","Uitzonderings URL gevonden." +"604","Uitzonderings woord gevonden: " +"605","Uitzonderings combinatie van woorden gevonden: " +"606","URL omzeiling uitzondering." +"607","Cookie omzeiling uitzondering." +"608","Scan omzeiling URL uitzondering." +"609","Uitzondering reguliere expressie URL gevonden: " +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","Uploaden via het web is geblokkerd." +"701","Web upload limiet overschreden." +"750","Bestands-download is geblokkeerd en dit MIME type komt niet voor op de goedkeuringslijst: " +"751","Bestands-download is geblokkeerd en dit bestand komt niet voor op de goedkeuringslijsten: " +"800","Geblokkeerd MIME Type: " +"900","Geblokkeerd bestandstype: " +"1000","'PICS labeling' niveau overschrijding op bovenvermelde site." +"1100","Virus of onbetamelijke inhoud ontdekt." +"1101","Advertentie geblokkeerd." +"1200","Geduld a.u.b. - bezig met downloaden om te scannen..." +"1201","Waarschuwing: bestand te groot om te scannen. Vermoedt u dat dit bestand groter is dan " +"1202",", ververs dan deze pagina om direct te downloaden." +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Compleet. Scan wordt gestart..." +"1220","Scan compleet.

Klik hier om te downloaden: " +"1221","Download compleet; bestand niet gescand.

Klik hier om te downloaden: " +"1222","Bestand te groot voor tussenopslag.

Klik hier om opnieuw te downloaden zonder scan: " +"1230","Bestand niet langer beschikbaar" diff --git a/config/e2guardian/languages/dutch/neterr_template.html b/config/e2guardian/languages/dutch/neterr_template.html new file mode 100644 index 0000000..d2bb67e --- /dev/null +++ b/config/e2guardian/languages/dutch/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/dutch/template.html b/config/e2guardian/languages/dutch/template.html new file mode 100644 index 0000000..63dd149 --- /dev/null +++ b/config/e2guardian/languages/dutch/template.html @@ -0,0 +1,87 @@ + + + +e2guardian - toegang geweigerd + + + + +

+ + + + + + + + + + + +
+ + De toegang werd geweigerd!! +
+ + -USER-  +
+ + YOUR ORG NAME + + + + Toegang tot de pagina: +

+ -URL- +

+ + ... werd geweigerd om de volgende reden: +

+ + -REASONGIVEN- + +

+ Categorieën: +

+ + -CATEGORIES- + +



+ U ziet deze melding omdat de pagina die u probeerde te benaderen, + materiaal lijkt te bevatten dat ongeschikt is om te bekijken, + of gemarkeerd is als ongeschikt om te bekijken. +

+ Als u hier vragen over heeft neem dan contact op met uw netwerkbeheerder. +



+ + Verzorgd door e2guardian +
+ + + + + + + diff --git a/config/e2guardian/languages/french/fancydmtemplate.html b/config/e2guardian/languages/french/fancydmtemplate.html new file mode 100644 index 0000000..40d40b7 --- /dev/null +++ b/config/e2guardian/languages/french/fancydmtemplate.html @@ -0,0 +1,181 @@ + + + + Téléchargement de -FILENAME- (-FILESIZE- octets) + + + + + + + + + diff --git a/config/e2guardian/languages/french/messages b/config/e2guardian/languages/french/messages new file mode 100644 index 0000000..a5992a2 --- /dev/null +++ b/config/e2guardian/languages/french/messages @@ -0,0 +1,122 @@ +# e2guardian messages file in French +# Translated by: Bernard Wanadoo and Jacques Theys +# Improvements by Jeanuel +# Improvements by Mathieu Parent (2011) +# +# ! Quote "'" changed by backquote "`" to avoid bad interpretation ! +"0","Message number absent" # needs translation +"1","Accès interdit" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","Accès interdit" +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Votre addresse IP n`est pas autorisée à naviguer sur le site : " +"101","Votre addresse IP n`est pas autorisée à naviguer." +"102","Votre compte utilisateur n`est pas autorisé à afficher le site : " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server`s SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","L`URL demandée n'est pas bien formée." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Phrase interdite : " +"301","Phrase interdite trouvée." +"400","Combinaison de mots interdite : " +"401","Combinaison de mots interdite trouvée." +"402","Limite de pondération " +"403","Limite de pondération dépassée." +"450","Terme de recherche interdit : " +"451","Terme de recherche interdit trouvé." +"452","Combinaison de termes de recherche interdite : " +"453","Combinaison de termes de recherche interdite trouvée." +"454","Limite de pondération de termes de recherche " +"455","Limite de pondération de termes de recherche dépassée." +"456","Exception de combinaison de termes de recherche autorisée : " +"457","Exception de terme de recherche autorisé : " +"500","Site interdit : " +"501","URL interdite : " +"502","Le mode liste blanche (Blanket Block) est actif et ce site n`est pas dans la liste autorisée, blanche ou grise." +"503","Expression régulière d`URL interdite : " +"504","Expression régulière d`URL interdite trouvée." +"505","Le mode liste blanche d`IPs (IP Blanket Block) est actif et cette addresse est une adresse IP uniquement." +"506","Le mode liste blanche SSL (SSL Blanket Block) est actif et ce site n`est pas dans la liste autorisée, blanche ou grise." +"507","Le mode liste blanche SSL d`IPs (SSL IP Blanket Block) est actif et cette addresse est une adresse IP uniquement." +"508","Expression régulière d`entète HTTP interdite : ", +"509","Expression régulière d`entète HTTP interdite trouvée." +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Exception d`adresse IP client trouvée." +"601","Exception d`utilisateur client trouvée." +"602","Exception de site trouvée : " +"603","Exception d`URL trouvée : " +"604","Exception de phrase trouvée : " +"605","Exception de combinaison de mots trouvée : " +"606","Exception d`URL sans controle trouvée." +"607","Exception de cookie sans controle trouvée." +"608","Exception d`URL sans inspection des logiciels malveillants trouvée." +"609","Exception d`expression régulière d'URL trouvée : " +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local): " # needs translation +"663","URL (local): " # needs translation +"700","L`upload web est interdit." +"701","Dépassement de la limite d`upload Web." +"750","Le mode liste blanche de téléchargement (Blanket file download) est actif et ce type MIME n`est pas dans la liste blanche : " +"751","Le mode liste blanche de téléchargement (Blanket file download) est actif et ce fichier n`est pas dans la liste blanche." +"800","Type MIME interdit: " +"900","Type de fichier interdit : " +"1000","Niveau PICS depassé sur le site entier." +"1100","Logiciel malveillant détecté." +"1101","Publicité bloqué" +"1200","Veuillez patienter - téléchargement du fichier en cours ..." +"1201","Avertissement : fichier trop volumineux pour ètre inspecté. Si vous pensez que le fichier est plus volumineux que " +"1202",", raffraîchissez la page pour le télécharger directement." +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Téléchargement terminé. Inspection des logiciels malveillants en cours ..." +"1220","Inspection du fichier terminée.

Cliquez ici pour le télécharger : " +"1221","Télécharge terminé. fichier non inspecté.

Cliquez ici pour le télécharger : " +"1222","Fichier trop volumineux pour ètre mis en cache.

Cliquez ici pour le télécharger à nouveau, sans inspection des logiciels malveillants : " +"1230","Le fichier n`est plus disponible" diff --git a/config/e2guardian/languages/french/neterr_template.html b/config/e2guardian/languages/french/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/french/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/french/template.html b/config/e2guardian/languages/french/template.html new file mode 100644 index 0000000..7db05e8 --- /dev/null +++ b/config/e2guardian/languages/french/template.html @@ -0,0 +1,89 @@ + + + +e2guardian - Acc&eagrav;s interdit + + + + +

+ + + + + + + + + + + +
+ + Accès interdit ! +
+ + -USER-  +
+ + YOUR ORG NAME + + + + L'accès à la page : +

+ -URL- +

+ + ... a été interdit pour les raisons suivantes : +

+ + -REASONGIVEN- + +

+ Catégories: +

+ + -CATEGORIES- + +



+ Vous voyez ce message parce que vous tentez d'accéder à + une page qui contient, ou est réputée contenir des élements + qui ont été déclarés inappropriés. +

+ Pour toute question, contactez votre administrateur réseau. +



+ + Propulsé par e2guardian +
+ + + + + + diff --git a/config/e2guardian/languages/german/fancydmtemplate.html b/config/e2guardian/languages/german/fancydmtemplate.html new file mode 100644 index 0000000..45386c8 --- /dev/null +++ b/config/e2guardian/languages/german/fancydmtemplate.html @@ -0,0 +1,173 @@ + + + Herunterladen -FILENAME- (-FILESIZE- bytes) + + + + + + diff --git a/config/e2guardian/languages/german/messages b/config/e2guardian/languages/german/messages new file mode 100644 index 0000000..2ed0b6d --- /dev/null +++ b/config/e2guardian/languages/german/messages @@ -0,0 +1,119 @@ +# e2guardian 3 messages file in German +# +# Translated and adapted to Unicode by Peter Vollmar, Klaus Tachtler. +"0","Message number absent" # needs translation +"1","Zugriff verweigert" +"10","IP-Limit erreicht. Limit bei " +"11"," IP-Limit wurde gesetzt." +"50"," von " +"51","VERTRAUENSWÜRDIG" +"52","VERWEIGERT" +"53","INFIZIERT" +"54","ÜBERPRÜFT" +"55","INHALT MODIFIZIERT" +"56","URL MODIFIZIERT" +"57","HEADER MODIFIZIERT" +"58","HEADER HINZUGEFÜGT" +"59","NETZWERKFEHLER" +"70","SSL SEITE" +"71","IP-Limit" +"72","Inhalt überprüfen" +"100","Ihre Arbeitsstation hat keine Erlaubnis zum Surfen auf: " +"101","Ihre Arbeitsstation hat keine Erlaubnis zum Surfen" +"102","Ihr Benutzername hat keine Erlaubnis zum Surfen auf: " +"103","Client-IP geblockt" +"104","Lokation geblockt" +"105","Benutzer geblockt" +"110","Proxy authentication error" # needs translation +"121","Von Ihrer Lokation aus ist nur ein begrenzter Zugriff möglich" +"150","Das vom Server ausgelieferte Zertifikat ist ungültig" +"151","Es konnte keine SSL-Verbindung aufgebaut werden" +"152","Es wurde kein Zertifikat gefunden" +"153","Es konnte kein privater Schlüssel geladen werden" +"154","Es konnte keine Verbindung zum Client hergestellt werden" +"155","Es wurde kein SSL-Zertifikat vom Server ausgeliefert" +"156","Das vom Server ausgelieferte SSL-Zertifikat, passt nicht zum Namen der Domain" +"157","Es konnte kein Verbindung zum lokalen Proxy hergestellt werden" +"158","Verbindungsaufbau fehlgeschlagen" +"159","Es konnte kein Verbindung zum Proxy-Server aufgebaut werden" +"160","Die SSL-Verbindung zum Server konnte nicht hergestellt werden" +"200","Die angeforderte URL ist ungültig" +"201","Antwort vom Upstream-Proxy nicht möglich (Zeitüberschreitung)" +"202","Antwort vom Upstream-Proxy nicht möglich (Fehler)" +"203","Die angeforderte Seite antwortet nicht" +"204"," - Bitte versuchen Sie es später noch einmal" +"205","Upstream-Proxy antwortet nicht (Netzwerkfehler)" +"206"," - Bitte versuchen Sie es später noch einmal" +"207","Die angeforderte Seite existiert nicht" +"208","Die angeforderte Seite hat keine IPv4-Adresse" +"209","Vorübergehender Ausfall des DNS-Dienstes - Bitte versuchen Sie es erneut" +"210","DNS-Dienstfehler - Bitte versuchen Sie es später noch einmal" +"300","Verbotener Ausdruck gefunden: " +"301","Verbotener Ausdruck gefunden" +"400","Verbotene Kombination von Ausdrücken gefunden: " +"401","Verbotene Kombination von Ausdrücken gefunden" +"402","Gewichtete Ausdrucksbeschränkung von " +"403","Gewichtete Ausdrucksbeschränkung überschritten" +"450","Verbotener Suchausdruck gefunden: " +"451","Verbotener Suchausdruck gefunden." +"452","Verbotene Suchausdrücke gefunden: " +"453","Verbotene Suchausdrücke gefunden." +"454","Gewichtetes Suchausdruck-Limit erreicht: " +"455","Gewichtetes Suchausdruck-Limit wurde erreicht." +"456","Kombination von erlaubten Ausdrücken wurde gefunden: " +"457","Erlaubter Ausdruck gefunden: " +"500","Verbotene Seite: " +"501","Verbotene URL: " +"502","Totalsperre für Nur-IP-Adressen aktiv, diese Seite ist nicht auf der Erlaubt-Liste" +"503","Aufgrund von regulären Ausdrücken verbotene URL: " +"504","Aufgrund von regulären Ausdrücken verbotene URL gefunden" +"505","Totalsperre für IP-Adressen aktiv, diese Adresse ist nur eine IP." +"506","HTTPS-Verbindungen sind nur zu vertrauenswürdige Seiten erlaubt." +"507","HTTPS-Verbindungen zu IP-Adressen sind nicht erlaubt." +"508","Verbindungen mit diesem Browser (oder dieser Anwendungen) sind nicht gestattet: " +"509","Verbindungen mit diesem Browser (oder dieser Anwendungen) sind nicht gestattet." +"510","Geblockte Seite (IP) " +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Geblockte HTTPS-Seite: " +"521","Geblockte Ausdrücke: " +"522","Geblockter Benutzer-Agent: " +"560","Geblockte Seite (lokal): " +"561","Geblockte URL (lokal): " +"580","Geblockte HTTPS-Seite (lokal): " +"581","Geblockte Ausdrücke (lokal): " +"600","Übereinstimmung mit Client-IP in Ausnahmeliste" +"601","Übereinstimmung mit Client-Benutzer in Ausnahmeliste" +"602","Übereinstimmung mit Seite in Ausnahmeliste" +"603","Übereinstimmung mit URL in Ausnahmeliste" +"604","Ausnahme-Ausdruck gefunden: " +"605","Kombination von Ausnahme Ausdrücken gefunden: " +"606","Umgehungs-URL gefunden" +"607","Umgehungs-Cookie gefunden" +"608","Überprüfe Umgehungs-URL Ausnahme." +"609","Ausnahme von regular expression URL gefunden: " +"610","Benutzer-Agent Suchmuster-Abgleich: " +"620","Ursprungsseite gefunden: " +"630","URL gefunden in " +"631"," erlaubte Lokations-Liste" +"632","Lokation überschreibt die Liste der zulässigen Seiten" +"662","Seite (lokal)." +"663","URL (lokal)." +"700","Web-Upload verboten" +"701","Web-Upload-Schwellwert erreicht" +"750","Globale Datei-Download Überprüfung ist aktiv und dieser Datei-Typ (MIME type) ist nicht auf der Erlaubt-Liste: " +"751","Globale Datei-Download Überprüfung ist aktiv und diese Datei ist nicht auf der Erlaubt-Liste" +"800","Verbotener Datei-Typ (MIME Type): " +"900","Verbotene Datei-Erweiterung: " +"1000","PICS-Kennzeichnungsschwellwert überschritten" +"1100","Ein Virus oder unerlaubter Inhalt wurde gefunden." +"1101","Werbung blockiert" +"1200","Bitte warten - die heruntergeladene Datei wird überprüft..." +"1201","Warnung: Datei ist zu gross um überprüft zu werden. Wenn Sie glauben das die Datei größer als " +"1202"," ist, rufen Sie die Seite erneut auf, um ein direktes herunterladen durchzuführen." +"1203","WARNUNG: Es konnte keine Inhaltsüberprüfung durchgeführt werden!" +"1210","Herunterladen abgeschlossen. Starte Überprüfung..." +"1220","Überprüfung abgeschlossen.

Zum herunterladen hier klicken: " +"1221","Herunterladen abgeschlossen. Datei konnte nicht überprüft werden.

Zum herunterladen hier klicken: " +"1222","Datei zu gross zum zwischenspeichern.

Zum erneuten herunterladen, OHNE Überprüfung, hier klicken: " +"1230","Die Datei wurde bereits abgerufen und ist daher nicht mehr gespeichert!" diff --git a/config/e2guardian/languages/german/neterr_template.html b/config/e2guardian/languages/german/neterr_template.html new file mode 100644 index 0000000..9d15c61 --- /dev/null +++ b/config/e2guardian/languages/german/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Laden der Webseite nicht möglich + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Ups! Es gab ein Problem beim Aufruf dieser Seite:


+
+ -URL- +

+ Grund
+
+ -REASONGIVEN- +


+

Ihre Details:

+ Benutzer: -USER-   Gruppe: -FILTERGROUP-   IP: -IP- +


+ +Zurück zur vorherigen Seite +
+
+ + diff --git a/config/e2guardian/languages/german/template.html b/config/e2guardian/languages/german/template.html new file mode 100644 index 0000000..3bf6df8 --- /dev/null +++ b/config/e2guardian/languages/german/template.html @@ -0,0 +1,77 @@ + + + +e2guardian - Zugriff verweigert + + + + + +

+ + + + + + + + + + + +
+ + Zugriff verweigert! +
+ + -USER-  +
+ + IHRE FIRMA + + + + Der Zugriff auf die Seite +

+ -URL- +

+ + wurde mit folgender Begründung verweigert: +

+ + -REASONLOGGED- + +



+ Sie sehen diese Fehlermeldung, weil die von Ihnen gewünschte Seite unangebrachte Inhalte aufweist oder als solche gekennzeichnet ist. +

+ Bei Fragen oder Beschwerden wenden Sie sich bitte an Ihren Netzwerkadministrator. +



+ + Powered by e2guardian +
+ + + + + + diff --git a/config/e2guardian/languages/hebrew/fancydmtemplate.html b/config/e2guardian/languages/hebrew/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/hebrew/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/hebrew/messages b/config/e2guardian/languages/hebrew/messages new file mode 100644 index 0000000..cad5268 --- /dev/null +++ b/config/e2guardian/languages/hebrew/messages @@ -0,0 +1,118 @@ +# e2guardian messages file in Hebrew +# by Nitzo Tomer +"0","Message number absent" # needs translation +"1"," " +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100"," -IP : " +"101"," -IP ." +"102"," : " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200"," ." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300"," : " +"301"," ." +"400"," : " +"401"," ." +"402"," " +"403"," ." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500"," : " +"501"," : " +"502"," " ." +"503"," : " +"504"," ." +"505"," " ." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600"," IP ." +"601"," ." +"602"," ." +"603"," ." +"604"," : " +"605"," : " +"606"," ." +"607"," ." +"608"," URL ." +"609"," URL : " +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700"," ." +"701"," ." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800"," MIME : " +"900"," : " +"1000"," PICS " ." +"1100"," ." +"1101"," " +"1200"," - ..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210"," . ..." +"1220"," .

: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230"," diff --git a/config/e2guardian/languages/hebrew/neterr_template.html b/config/e2guardian/languages/hebrew/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/hebrew/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/hebrew/template.html b/config/e2guardian/languages/hebrew/template.html new file mode 100644 index 0000000..db0d8dc --- /dev/null +++ b/config/e2guardian/languages/hebrew/template.html @@ -0,0 +1,89 @@ + + + e2guardian - + + + + + +

+ + + + + + + + + + + + + + +
+ ! +
+ -USER- +
+ YOUR ORG NAME + + : + +
+ +
+ + -URL- + +
+ +
... : + +
+ +
-REASONGIVEN-
+ +
+ +
+ +
+ + , , + . + +
+ +
+ + . + +
+ +
+ +
+ +
Powered by + e2guardian
+
+ diff --git a/config/e2guardian/languages/hungarian/fancydmtemplate.html b/config/e2guardian/languages/hungarian/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/hungarian/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/hungarian/messages b/config/e2guardian/languages/hungarian/messages new file mode 100644 index 0000000..68f25c6 --- /dev/null +++ b/config/e2guardian/languages/hungarian/messages @@ -0,0 +1,117 @@ +# e2guardian 3 messages file in Hungarian +"0","Message number absent" # needs translation +"1","A hozzfrs tiltott" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Az n IP cme nem engedlyezett ehhez a bngszhz: " +"101","Az n IP cme nem engedlyezett ehhez a bngszhz." +"102","A felhasznlneve nem engedlyezett ehhez e abngszhz: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","A krt URL formtuma nem tnik biztonsgosnak." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Tiltott kifejezs: " +"301","Tiltott kifejezs." +"400","Tiltott sszettel kifejezs: " +"401","Tiltott sszettel kifejezs." +"402","A slyozott kifejezs hatra " +"403","A slyozott kifejezs elrte a hatrt." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Tiltott oldal: " +"501","Tiltott URL: " +"502","A domain-alap szrs aktv s ez az oldal sem a 'fehr', sem a 'szrke' listn nincs fent." +"503","Tiltott regulris kifejezs URL: " +"504","Tiltott regulris kifejezs URL." +"505","A cmtartomny alap szrs aktv s ez csak egy egyszer IP-cm." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Kifogsolhat kliens IP egyezs." +"601","Kifogsolhat kliens felhasznl egyezs." +"602","Kifogsolhat oldalegyezs." +"603","Kifogsolhat URL-egyezs." +"604","Kifogsolhat kifejezs: " +"605","Kombincis kifogsolhat kifejezs: " +"606","Tovbbugrat URL kifogs." +"607","Tovbbugrat sti kifogs." +"608","Scan bypass URL exception." +"609","Exception regular expression URL match: " +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","A Webre trtn feltlts tiltva." +"701","A Webre trtn feltlts korltjt elrte." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","Tiltott MIME Tpus: " +"900","Tiltott kiterjeszts: " +"1000","A PICS szervezet jellsi szintjt elrte a fels oldal." +"1100","Vrussal fetztt llomny." +"1101","Advert blocked" +"1200","Please wait - downloading to be scanned..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","File no longer available" diff --git a/config/e2guardian/languages/hungarian/neterr_template.html b/config/e2guardian/languages/hungarian/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/hungarian/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/hungarian/template.html b/config/e2guardian/languages/hungarian/template.html new file mode 100644 index 0000000..98ee361 --- /dev/null +++ b/config/e2guardian/languages/hungarian/template.html @@ -0,0 +1,77 @@ + + + +e2guardian - A hozz�f�r�s tiltva + + + + +

+ + + + + + + + + + + +
+ + A hozz�f�r�s tiltva! +
+ + -USER-  +
+ + YOUR ORG NAME + + + + A hozz�f�r�s ehhez az oldalhoz: +

+ -URL- +

+ + ... nem lehets�ges a k�vetkez� ok miatt: +

+ + -REASONGIVEN- + +



+ �n az�rt l�tja ezt a hiba�zenetet, mert �gy t�nik, amit �n megk�s�relt el�rni tartalmaz + vagy besorol�sa alapj�n tartalmazhat helytelennek v�lt anyagokat. +

+ Amennyiben �nnek ezzel kapcsolatban agg�lyai mer�ltek fel, vegye fel a kapcsolatot az �n + Inform�ci�s- �s kommunk�ci�technol�giai koordin�tor�val vagy a h�l�zati menedzser�vel. +



+ + Powered by e2guardian +
+ + + + + + diff --git a/config/e2guardian/languages/indonesian/fancydmtemplate.html b/config/e2guardian/languages/indonesian/fancydmtemplate.html new file mode 100644 index 0000000..a65a2bd --- /dev/null +++ b/config/e2guardian/languages/indonesian/fancydmtemplate.html @@ -0,0 +1,173 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + diff --git a/config/e2guardian/languages/indonesian/messages b/config/e2guardian/languages/indonesian/messages new file mode 100644 index 0000000..11d18e0 --- /dev/null +++ b/config/e2guardian/languages/indonesian/messages @@ -0,0 +1,121 @@ +# e2guardian messages file in Indonesian +# +# Indonesian translation by: Kumoro Wisnu Wibowo +# +"0","Message number absent" # needs translation +"1","Akses Ditolak" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Alamat IP Anda tidak diperbolehkan untuk browsing: " +"101","Alamat IP Anda tidak diperbolehkan untuk browsing." +"102","Username Anda tidak diperbolehkan untuk browsing: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","Format alamat URL yang diminta tidak benar." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Frase yang ditolak ditemukan: " +"301","Frase yang ditolak ditemukan." +"400","Kombinasi frase yang ditolak ditemukan: " +"401","Kombinasi frase yang ditolak ditemukan." +"402","Bobot batas frase dari " +"403","Bobot batas frase terlewati." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Situs yang ditolak: " +"501","Alamat URL yang ditolak: " +"502","Blanket Block aktif dan situs tersebut tidak dalam white list." +"503","Alamat Regular Expression URL yang ditolak: " +"504","Alamat Regular Expression URL ditemukan." +"505","Blanket IP Block aktif dan alamat tersebut adalah hanya alamat IP saja." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","IP klien pengecualian cocok." +"601","User klien pengecualian cocok." +"602","Situs pengecualian cocok." +"603","Alamat URL pengecualian cocok." +"604","Frase pengecualian ditemukan: " +"605","Kombinasi frase pengecualian ditemukan: " +"606","Bypass URL cocok." +"607","Bypass cookie cocok." +"608","Scan bypass URL exception." +"609","Exception regular expression URL match: " +# 606,607 by Daniel Barron - corrections welcome +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","Web upload ditolak." +"701","Batas untuk web upload terlewati." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","Tipe MIME yang ditolak: " +"900","Ekstensi yang ditolak: " +"1000","Level Label PICS terlewati pada situs di atas." +"1100","Virus or bad content detected." +"1101","Advert blocked" +"1200","Please wait - downloading to be scanned..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","File no longer available" diff --git a/config/e2guardian/languages/indonesian/neterr_template.html b/config/e2guardian/languages/indonesian/neterr_template.html new file mode 100644 index 0000000..d2bb67e --- /dev/null +++ b/config/e2guardian/languages/indonesian/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/indonesian/template.html b/config/e2guardian/languages/indonesian/template.html new file mode 100644 index 0000000..91cb5e2 --- /dev/null +++ b/config/e2guardian/languages/indonesian/template.html @@ -0,0 +1,37 @@ +e2guardian - Akses Ditolak + +

ACCESS DITOLAK -USER-

+
Akses ke halaman:

+-URL- +

... telah ditolak untuk alasan sebagai berikut:

+-REASONGIVEN- +

Anda melihat pesan kesalahan ini karena halaman yang ingin Anda akses
+mengandung isi yang telah dianggap sebagai tidak pantas.
+

Apabila Anda mempunyai pertanyaan-pertanyaan, silakan kontak Manager IT atau +Manager Network Anda.
+ +

Powered by e2guardian +

+ + + diff --git a/config/e2guardian/languages/italian/fancydmtemplate.html b/config/e2guardian/languages/italian/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/italian/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/italian/messages b/config/e2guardian/languages/italian/messages new file mode 100644 index 0000000..33baa97 --- /dev/null +++ b/config/e2guardian/languages/italian/messages @@ -0,0 +1,118 @@ +# e2guardian messages file in IT Italian +# Translated by andrea at diclemente.net +"0","Message number absent" # needs translation +"1","Accesso Negato" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Al tuo indirizzo IP non e' permesso di navigare il web: " +"101","Al tuo indirizzo IP non e' permesso di navigare il web." +"102","Al tuo username non permesso di navigare il web: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","L'URL richiesta e' malformata." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Trovata una frase vietata: " +"301","Trovata una frase vietata." +"400","Trovata una combinazione di frasi vietata: " +"401","Trovata una combinazione di frasi vietata." +"402","Il limite di frasi pesate di " +"403","E' stato superato il limite per le frasi pesate." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Sito vietato: " +"501","URL vietato: " +"502","Il blocco 'Blanket' e' attivo e il sito non e' nella white list." +"503","URL con espressione regolare vietata: " +"504","URL con espressione regolare vietata trovato." +"505","Il blocco 'Blanket' e' attivo e l'indirizzo e' formato dal solo indirizzo IP." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Exception client IP match." +"601","Exception client user match." +"602","Exception site match." +"603","Exception URL match." +"604","Exception phrase found: " +"605","Combination exception phrase found: " +"606","Bypass URL exception." +"607","Bypass cookie exception." +"608","Scan bypass URL exception." +"609","Exception regular expression URL match: " +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","Il Web-upload e' vietato." +"701","E' stato superato il limite per il Web upload." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","MIME Type vietato: " +"900","Extensione vietata: " +"1000","Si e' oltrepassato il limite del livello PICS sul sito." +"1100","Virus or bad content detected." +"1101","Advert blocked" +"1200","Please wait - downloading to be scanned..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","File no longer available" diff --git a/config/e2guardian/languages/italian/neterr_template.html b/config/e2guardian/languages/italian/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/italian/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/italian/template.html b/config/e2guardian/languages/italian/template.html new file mode 100644 index 0000000..48d968c --- /dev/null +++ b/config/e2guardian/languages/italian/template.html @@ -0,0 +1,38 @@ +e2guardian - Accesso Negato + +

L'ACCESSO E' STATO NEGATO -USER-

+
L'accesso alla pagina:

+-URL- +

... e' stato negato per il seguente motivo:

+-REASONGIVEN- +

Stai vedendo questo errore perche' la pagina che hai cercato
+di accedere contiene, o e' marcata come contenente, materiale che
+e' stato ritenuto non appropriato.
+

Se hai ulteriori domande, contatta il tuo coordinatore ICT o Network Manager.
+ +

Powered by e2guardian +

+ + + diff --git a/config/e2guardian/languages/japanese/fancydmtemplate.html b/config/e2guardian/languages/japanese/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/japanese/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/japanese/messages b/config/e2guardian/languages/japanese/messages new file mode 100644 index 0000000..6b79530 --- /dev/null +++ b/config/e2guardian/languages/japanese/messages @@ -0,0 +1,117 @@ +# e2guardian messages file in 日本語 +"0","Message number absent" # needs translation +"1","アクセス拒否" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","あなたのIPアドレスは閲覧の許可がありません: " +"101","あなたのIPアドレスは閲覧の許可がありません。" +"102","あなたのユーザ名は閲覧の許可がありません: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","要求されたURLは不適切です。" +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","禁止されたフレーズが見つかりました: " +"301","禁止されたフレーズが見つかりました。" +"400","拒否された結合フレーズが見つかりました: " +"401","拒否された結合フレーズが見つかりました。" +"402","重み付けされたフレーズの制限を越えました(規定値:測定値) " +"403","重み付けされたフレーズの制限を越えました。" +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","拒否されたサイト: " +"501","拒否されたURL: " +"502","統括的な遮断は有効です。そしてそれらのサイトはホワイトリストかグレーリストにありません。" +"503","拒否された正規表現のURL: " +"504","拒否された正規表現のURLが見つかりました。" +"505","統括的なIPの遮断は有効です。そしてそれらのアドレスはIPのみのアドレスです。" +"506","統括的なSSLの遮断は有効です。そしてそれらのサイトはホワイトリストかグレーリストにありません。" +"507","統括的なSSL IPの遮断は有効です。そしてそれらのアドレスはIPのみのアドレスです。" +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","例外クライアントIPマッチ。" +"601","例外クライアントユーザマッチ。" +"602","例外サイトマッチ。" +"603","例外URLマッチ。" +"604","例外フレーズが見つかりました: " +"605","結合例外フレーズがみつかりました: " +"606","例外迂回URL" +"607","例外迂回Cookie。" +"608","例外スキャン迂回URL" +"609","例外正規表現URLマッチ: " +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","Webのアップロードは拒否されました。" +"701","Webのアップロードは制限を越えました。" +"750","統括的なファイルのダウンロードは有効です。そしてこのMIMEタイプはホワイトリストにありません: " +"751","統括的なファイルのダウンロードは有効です。そしてこのファイルはホワイトリストにマッチしませんでした。" +"800","拒否されたMIMEタイプ: " +"900","拒否された拡張: " +"1000","PICSラベリングレベルは上のサイトで超えました。" +"1100","ウィルスか不正なコンテンツを検出しました。" +"1101","広告は拒否されました" +"1200","お待ちください。 - ダウンロードファイルのスキャン中です・・・" +"1201","警告: ファイルはスキャンするのに大きすぎます。 このふぁいるが" +"1202","より大きいと疑うならば直接ダウンロードするためにこのページをリフレッシュしてください。" +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","ダウンロード完了。スキャンを開始します..." +"1220","スキャンが完了しました。

ダウンロードをするにはここをクリックしてください: " +"1221","ダウンロードは完了しました。ファイルはスキャンされませんでした。

ダウンロードをするにはここをクリックしてください: " +"1222","ファイルはキャッシュするのに大きすぎます。

スキャンを迂回させて、再ダウンロードするためにここをクリックしてください: " +"1230","ファイルは長いこと利用可能ではありません" diff --git a/config/e2guardian/languages/japanese/neterr_template.html b/config/e2guardian/languages/japanese/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/japanese/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/japanese/template.html b/config/e2guardian/languages/japanese/template.html new file mode 100644 index 0000000..4219546 --- /dev/null +++ b/config/e2guardian/languages/japanese/template.html @@ -0,0 +1,61 @@ + + +Access Denied + + + +

+ + + + + + + + + + + +
+ + アクセスは拒否されました。 +
+ + -USER-  +
+ + www.shonbori.com + + + + アクセス先URL: +

+ -URL- +

+ + は以下の理由により拒否されました。: +

+ + -REASONGIVEN- + +

+ カテゴリ: +

+ + -CATEGORIES- + +



+ 不適切と思われるコンテンツがページ内に含まれている・含まれていると思われる場合に + このエラーページが表示されます +

+ 何か質問がありましたら、以下に連絡してください。 +
+ webmaster@shonbori.com +



+ + Powered by e2guardian +
+ + + + diff --git a/config/e2guardian/languages/lithuanian/fancydmtemplate.html b/config/e2guardian/languages/lithuanian/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/lithuanian/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/lithuanian/messages b/config/e2guardian/languages/lithuanian/messages new file mode 100644 index 0000000..566bddb --- /dev/null +++ b/config/e2guardian/languages/lithuanian/messages @@ -0,0 +1,119 @@ +# e2guardian 3 messages file +# Lithuanian version by Nerijus Baliūnas and Mantas Kriaučiūnas +# charset=utf-8 +"0","Message number absent" # needs translation +"1","Tinklalapis uždraustas" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Iš jūsų IP adreso negalima pasiekti tinklalapio: " +"101","Draudžiama naršyti iš jūsų IP adreso." +"102","Jūsų naudotojui negalima pasiekti tinklalapio: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","Neteisingas URL." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Rasta uždrausta frazė: " +"301","Rasta uždrausta frazė." +"400","Rasta uždrausta frazių kombinacija: " +"401","Rasta uždrausta frazių kombinacija." +"402","Sumuojamų frazių limitas " +"403","Viršytas sumuojamų frazių limitas." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Uždraustas adresas (site): " +"501","Uždraustas URL: " +"502","Leidžiamas priėjimas tik prie tinklalapių, esančių 'baltame' ar 'pilkame' sąraše, bet šio tinklalapio juose nėra." +"503","Draudžiamas URL regexp: " +"504","Rastas draudžiamas URL regexp." +"505","Priėjimas prie IP adresų uždraustas, o šis adresas yra tik IP adresas." +"506","Aktyvus Blanket SSL Block ir šis tinklalapis nėra 'baltame' ar 'pilkame' sąraše." +"507","Aktyvus Blanket SSL IP Block ir šis adresas yra tik IP adresas." +"508","Uždrausta reguliarioji išraiška (regexp) HTTP antraštėje: ", +"509","Rasta draudžiama reguliarioji išraiška (regexp) HTTP antraštėje." +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Kliento IP yra išimčių sąraše." +"601","Kliento vardas yra išimčių sąraše." +"602","Adresas yra išimčių sąraše." +"603","URL yra išimčių sąraše." +"604","Rasta frazė iš išimčių sąrašo: " +"605","Rasta frazių kombinacija iš išimčių sąrašo: " +"606","URL apėjimo išimtis." +"607","Slapuko apėjimo išimtis." +"608","URL skanavimo apėjimo išimtis." +"609","Regexp URL yra išimčių sąraše: " +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","Nusiuntimas (upload) yra uždraustas." +"701","Viršytas nusiuntimo (upload) limitas." +"750","Aktyvus Blanket failų atsiuntimas ir šis MIME tipas nėra 'baltame' sąraše: " +"751","Aktyvus Blanket failų atsiuntimas ir šis failas netinka pagal 'baltus' sąrašus." +"800","Uždraustas MIME tipas: " +"900","Uždraustas praplėtimas: " +"1000","Viršytas šio tinklalapio PICS vertinimo kriterijus." +"1100","Aptiktas virusas arba negeras turinys." +"1101","Reklama užblokuota" +"1200","Palaukite - siunčiame tikrinimui nuo virusų..." +"1201","Dėmesio: failo negalime patikrinti, nes jis per didelis. Jei manote, kad šis failas yra didesnis nei " +"1202",", tuomet nueikite į šį puslapį iš naujo (refresh) ir atsisiųskite nepatikrintą failą." +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Atsiųsta. Tikriname nuo virusų..." +"1220","Patikrinta.

Atsisiųskite: " +"1221","Siuntimas baigtas; failas nebuvo patikrintas.

Spustelėkite čia jei norite atsisiųsti: " +"1222","Failas per didelis.

Jei norite atsisiųsti nepatikrintą failą - spustelėkite čia: " +"1230","Failas neprieinamas" diff --git a/config/e2guardian/languages/lithuanian/neterr_template.html b/config/e2guardian/languages/lithuanian/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/lithuanian/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/lithuanian/template.html b/config/e2guardian/languages/lithuanian/template.html new file mode 100644 index 0000000..d4cb901 --- /dev/null +++ b/config/e2guardian/languages/lithuanian/template.html @@ -0,0 +1,49 @@ + + +e2guardian - Tinklalapis uždraustas + + + +

+

TINKLALAPIS UŽDRAUSTAS -USER-

+
Interneto turinio filtravimo sistema neleidžia Jums atidaryti šio tinklalapio:

+-URL- +

dėl šios priežasties:

+-REASONGIVEN- +

tinklalapis pateko į šias kategorijas:

+-CATEGORIES- +

+
+Tinklalapis, kurį Jūs bandėte pasiekti, pripažintas nepriimtinu. +
+

Jei turite klausimų, kreipkitės į kompiuterio ar tinklo administratorių.
+ +

Powered by e2guardian +

+ + + + + diff --git a/config/e2guardian/languages/malay/fancydmtemplate.html b/config/e2guardian/languages/malay/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/malay/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/malay/messages b/config/e2guardian/languages/malay/messages new file mode 100644 index 0000000..cbc1aa2 --- /dev/null +++ b/config/e2guardian/languages/malay/messages @@ -0,0 +1,143 @@ +# e2guardian 3 messages file in Malay language +# Edited by Sazarul Izam +"0","Message number absent" # needs translation +"1","Akses Tidak Dibenarkan" +# Access Denied +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","IP anda tidak dibenarkan untuk melayari web: " +"101","IP anda tidak dibenarkan untuk melayari web." +"102","Nama pengguna anda tidak dibenarkan untuk melayari web: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","URL yang diminta adalah malformed." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Frasa larangan dikesan: " +# Banned Phrase found: +"301","Frasa larangan dikesan." +# Banned phrase found. +"400","Kombinasi frasa larangan dikesan: " +# Banned combination phrase found: +"401","Kombinasi frasa larangan dikesan." +# Banned combination phrase found. +"402","Had beban frasa oleh " +# Weighted phrase limit of +"403","Melebihi had beban frasa." +# Weighted phrase limit exceeded. +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Laman larangan: " +# Banned site: +"501","URL larangan: " +# Banned URL: +"502","Blok Blanket adalah aktif dan laman tersebut tidak tersenarai dalam white atau grey list." # Blanket Block is active and that site is not on the white or grey list. +"503","URL Ekspresi Biasa larangan: " +# Banned Regular Expression URL: +"504","URL Ekspresi Biasa larangan dikesan." +# Banned Regular Expression URL found. +"505","Blok Blanket IP adalah aktif dan alamat tersebut hanyalah alamat IP." +#Blanket IP Block is active and that address is an IP only address. +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","IP pengecualian klien sepadan." +# Exception client IP match. +"601","Pengguna pengecualian klien sepadan." +# Exception client user match. +"602","Laman pengecualian sepadan." +# Exception site match. +"603","URL pengecualian sepadan." +# Exception URL match. +"604","Frasa pengecualian sepadan: " +# Exception phrase found: +"605","Kombinasi frasa pengecualian sepadan: " +# Combination exception phrase found: +"606","URL pintasan sepadan." +# Bypass URL exception. +"607","Cookie pintasan sepadan." +# Bypass cookie exception. +"608","Scan bypass URL." # needs translation +"609","URL pattern match: " # needs translation +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","Muatnaik laman dilarang." +# Web upload is banned. +"701","Muatnaik laman melebihi had." +# Web upload limit exceeded. +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","Jenis MIME larangan: " +# Banned MIME Type: +"900","Extension larangan: " +# Banned extension: +"1000","Penglabelan PICS melebihi peringkat pada laman di atas." +# PICS labeling level exceeded on the above site. +"1100","Virus or bad content detected." +"1101","Advert blocked" +"1200","Please wait - downloading file for scanning..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " +"1202",", then refresh this page to download directly." +"1203","WARNING: Could not perform content scan!" +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " +"1222","File too large to cache.

Click here to re-download, bypassing scan: " +"1230","File no longer available" diff --git a/config/e2guardian/languages/malay/neterr_template.html b/config/e2guardian/languages/malay/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/malay/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/malay/template.html b/config/e2guardian/languages/malay/template.html new file mode 100644 index 0000000..69ea9b9 --- /dev/null +++ b/config/e2guardian/languages/malay/template.html @@ -0,0 +1,60 @@ +e2guardian - Akses Tidak Dibenarkan +

+ + + + +
+D a n s G u a r d i a n +  + +h a l a m a n   +t i d a k   b a i k   b e r h e n t i   d i   s i n i +
+ + + + + + +
+H A L A +N G A N +
+Akses ke halaman berkenaan +tidak dibenarkan + +

URL: -URL-
-REASONGIVEN-

Sila hubungi Pentadbir Rangkaian jika terdapat +kesilapan berhubung perkara ini +

Penapis Kandungan Web oleh +e2guardian +
+
+ + + + diff --git a/config/e2guardian/languages/mxspanish/fancydmtemplate.html b/config/e2guardian/languages/mxspanish/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/mxspanish/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/mxspanish/messages b/config/e2guardian/languages/mxspanish/messages new file mode 100644 index 0000000..fa4a0cc --- /dev/null +++ b/config/e2guardian/languages/mxspanish/messages @@ -0,0 +1,120 @@ +# e2guardian messages file in MX Spanish +# Translated by Vladimir Gomez +# Typo corrected by Pedro Fortuny 2003/10/13 +"0","Message number absent" # needs translation +"1","Acceso Denegado" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Su dirección IP no tiene permiso para ver: " +"101","Su dirección IP no esta autorizada a navegar en Internet." +"102","Su usuario no tiene autorizació para ver: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","El URL solicitado esta mal formado." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Frase no permitida: " +"301","Frase no permitida." +"400","Combinación de palabras/frases no permitida: " +"401","Combinación de palabras/frases no permitida." +"402","La frase excede el nivel " +"403","La página solicitada excede el nivel de frases permitidas." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Sitio no permitido: " +"501","URL no permitido: " +"502","Blanket Block esta activado y el sitio no se encuentra en la lista de permitidos." +"503","URL bloqueada por Expresión Regular: " +"504","URL bloqueada por Expresión Regular." +"505","No se puede accesar un sitio por su dirección IP cuando Blanket IP Block está activado." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Dirección ip del cliente presente en la lista de excepciones." +"601","Usuario presente en la lista de excepciones." +"602","Sitio presente en la lista de excepciones." +"603","URL presente en la lista de excepciones." +"604","Frase presente en la lista de excepciones." +"605","Combinación de frases presente en la lista de excepciones: " +"606","Puente URL excepciones." +"607","Puente cookie excepciones." +"608","Scan bypass URL exception." +"609","Exception regular expression URL match: " +# 606,607 by Daniel Barron - corrections welcome +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","No esta permitido enviar archivos a sitios en Internet." +"701","El archivo que intenta enviar excede el tamaño permitido." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","Clase MIME no permitida: " +"900","Extensión de archivo bloqueada: " +"1000","Las etiquetas del sitio exceden el nivel PICS." +"1100","Virus or bad content detected." # needs translation +"1101","Advert blocked" +"1200","Please wait - downloading to be scanned..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","File no longer available" diff --git a/config/e2guardian/languages/mxspanish/neterr_template.html b/config/e2guardian/languages/mxspanish/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/mxspanish/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/mxspanish/template.html b/config/e2guardian/languages/mxspanish/template.html new file mode 100644 index 0000000..4842fbb --- /dev/null +++ b/config/e2guardian/languages/mxspanish/template.html @@ -0,0 +1,40 @@ +e2guardian - Acceso Denegado + +

ACCESO DENEGADO -USER-

+
El acceso a la páina:

+-URL- +

... ha sido denegado por la siguiente razón:

+-REASONGIVEN- +

Usted esta viendo esta +página de error porque
el sitio que está tratando de ver +o su contenido
han sido catalogados como inapropiados.
+

Si requiere acceso a esta +página por favor pongase en contacto
con el Administrador de Sistemas +o el Administrador de la Red.
+ +

Powered by e2guardian +

+ + + diff --git a/config/e2guardian/languages/polish/fancydmtemplate.html b/config/e2guardian/languages/polish/fancydmtemplate.html new file mode 100644 index 0000000..a65a2bd --- /dev/null +++ b/config/e2guardian/languages/polish/fancydmtemplate.html @@ -0,0 +1,173 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + diff --git a/config/e2guardian/languages/polish/messages b/config/e2guardian/languages/polish/messages new file mode 100644 index 0000000..bea03e0 --- /dev/null +++ b/config/e2guardian/languages/polish/messages @@ -0,0 +1,120 @@ +# e2guardian messages file +# Polish version by Piotr Kapczuk +# charset=iso-8859-2 +"0","Message number absent" # needs translation +"1","Dostp Zabroniony" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Zakazano dostpu z twojego adresu IP do strony: " +"101","Przegldanie stron www z twojego adresu IP jest niedozwolone." +"102","Zakazano dostpu z twoj nazw uytkownika do strony: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","dany URL jest le skonstruowany." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Znaleziono zakazan fraz: " +"301","Znaleziono zakazan fraz." +"400","Znaleziono zakazan kombinacj fraz: " +"401","Znaleziono zakazan kombinacj fraz." +"402","Limit fraz liczonych wagowo " +"403","Przekroczono limit fraz liczonych wagowo." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Zakazany adres (site): " +"501","Zakazany URL: " +"502","Dostp zezwolony jedynie do wybranych stron, a ta strona nie jest na licie dozwolonych." +"503","Zakazane Wyraenie Regularne dla URL: " +"504","Znaleziono zakazane Wyraenie Regularne w URL." +"505","Dostp po samych adresach IP jest zakazany, a ten adres jest jedynie adresem IP." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","IP klienta pasuje do wyjtkw." +"601","Nazwa uytkownika pasuje do wyjtkw." +"602","Adres pasuje do wyjtkw." +"603","URL pasuje do wyjtkw." +"604","Znaleziono fraz, ktra pasuje do wyjtkw: " +"605","Znaleziono kombinacj fraz, ktra pasuje do wyjtkw: " +"606","Bypass URL wyjtkw." +"607","Bypass cookie wyjtkw." +"608","Scan bypass URL exception." +"609","Exception regular expression URL match: " +# 606,607 by Daniel Barron - corrections welcome +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","Wgrywanie do sieci jest zakazane." +"701","Przekroczono limit wgrywanych danych." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","Zakazany typ MIME: " +"900","Zakazane rozszerzenie: " +"1000","Wedle etykietowania PICS przekroczono dopuszczalny poziom zakazanych treci." +"1100","Virus or bad content detected." +"1101","Advert blocked" +"1200","Please wait - downloading to be scanned..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","File no longer available" diff --git a/config/e2guardian/languages/polish/neterr_template.html b/config/e2guardian/languages/polish/neterr_template.html new file mode 100644 index 0000000..d2bb67e --- /dev/null +++ b/config/e2guardian/languages/polish/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/polish/template.html b/config/e2guardian/languages/polish/template.html new file mode 100644 index 0000000..08a396a --- /dev/null +++ b/config/e2guardian/languages/polish/template.html @@ -0,0 +1,40 @@ +e2guardian - Dostp Zabroniony + + + +

ZABRONIONO DOSTPU -USER-

+
Dostp do strony:

+-URL- +

... zosta zabroniony z nastpujcego powodu:

+-REASONGIVEN- +

+
+Ten bd pojawia si, poniewa strona, do ktrej prbowano uzyska dostp,
+zawiera lub te jest oznakowana jako zawierajca treci uznane za nieodpowiednie. +
+

Jeli masz jakie pytania lub wtpliwoci skontaktuj si ze swoim Administratorem Sieci
+ +

Powered by e2guardian +

+ + + + diff --git a/config/e2guardian/languages/portuguese/fancydmtemplate.html b/config/e2guardian/languages/portuguese/fancydmtemplate.html new file mode 100644 index 0000000..a65a2bd --- /dev/null +++ b/config/e2guardian/languages/portuguese/fancydmtemplate.html @@ -0,0 +1,173 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + diff --git a/config/e2guardian/languages/portuguese/messages b/config/e2guardian/languages/portuguese/messages new file mode 100644 index 0000000..f91c272 --- /dev/null +++ b/config/e2guardian/languages/portuguese/messages @@ -0,0 +1,122 @@ +# e2guardian 3 messages in Brazilian Portuguese +# Mensagens do e2guardian 3 file em Portugus do Brasil (pt-BR) +# Translated/traduzido (?) by/por Henrique Araujo - Sys Admin +# henrique@colegiosaogoncalo.g12.br +# Cuiab - MT, Brasil +"0","Message number absent" # needs translation +"1","Acesso negado." +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Seu endereço IP não tem permissão de acesso à  web: " +"101","Seu endereço IP não tem permissão de acesso à  web: " +"102","Esse nome de usuário não tem permissão de acesso à  web: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","A URL requerida está mal formada." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Encontrada frase proibida: " +"301","Encontrada frase proibida: " +"400","Encontrada combinação de frases proibida: " +"401","Encontrada combinação de frases proibida: " +"402","Limite de frase ponderada de " +"403","Limite de frase ponderada excedido." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Sítio proibido: " +"501","URL proibida: " +"502","Bloqueio geral está ativo e aquele sítio não está na lista livre." +"503","Expressão Regular proibida em URL: " +"504","Encontrada Expressão Regular proibida em URL: " +"505","Bloqueio geral de IP está ativo e aquele endereço não possui nome." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Cliente IP está na lista de exceções." +"601","Usuário está na lista de exceções." +"602","Sítio está na lista de exceções." +"603","URL está na lista de exceções." +"604","Encontrada frase na lista de exceções: " +"605","Encontrada combinação de frases na lista de exceções: " +"606","Desvio temporário de bloqueio (Bypass URL.)" +"607","Desvio temporário de bloqueio (Bypass cookie.)" +"608","Scan bypass URL exception." +"609","Exception regular expression URL match: " +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","Transferência de arquivos para web proibida." +"701","Limite de transferência de arquivos para web excedido." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","Tipo MIME proibido: " +"900","Extensão proibida: " +"1000","Nível de rotulagem PICS excedido no sítio acima." +# 1,1000 by Andson Gomes - html internet +"1100","Virus or bad content detected." +"1101","Advert blocked" +"1200","Please wait - downloading to be scanned..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","File no longer available" diff --git a/config/e2guardian/languages/portuguese/neterr_template.html b/config/e2guardian/languages/portuguese/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/portuguese/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/portuguese/template.html b/config/e2guardian/languages/portuguese/template.html new file mode 100644 index 0000000..2125c09 --- /dev/null +++ b/config/e2guardian/languages/portuguese/template.html @@ -0,0 +1,83 @@ + + + +e2guardian - Access Denied + + + + +

+ + + + + + + + + + + +
+ + O acesso foi negado! +
+ + Usu�rio: -USER-  +
+ + Empresa S/A + + + + O acesso a p�gina: +

+ -URL- +

+ + ... foi negado devido a seguinte raz�o: +

+ + -REASONGIVEN- + +

+ Categorias: +

+ + -CATEGORIES- + +



+ Voc� est� vendo esta mensagem porque o que voc� tentou acessar parece conter material que foi julgado impr�prio. +

+ Se voc� tiver alguma d�vida favor entrar em contato com a equipe de suporte de sua rede. +



+ + Powered by e2guardian +
+ + + + + + diff --git a/config/e2guardian/languages/ptbrazilian/fancydmtemplate.html b/config/e2guardian/languages/ptbrazilian/fancydmtemplate.html new file mode 100644 index 0000000..26ae56e --- /dev/null +++ b/config/e2guardian/languages/ptbrazilian/fancydmtemplate.html @@ -0,0 +1,181 @@ + + + Baixando -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/ptbrazilian/messages b/config/e2guardian/languages/ptbrazilian/messages new file mode 100644 index 0000000..56286d0 --- /dev/null +++ b/config/e2guardian/languages/ptbrazilian/messages @@ -0,0 +1,121 @@ +# e2guardian messages file in Brazilian Portuguese +# Arquivo de mensagens do e2guardian em Português Brasil +# Traduzido por Renato C. Pacheco - renato.camarao@gmail.com +# Em 2015-04-15 +# +"0","Message number absent" # needs translation +"1","Acesso Negado" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," em " +"51","EXCEÇÃO" +"52","NEGADO" +"53","INFECTADO" +"54","VERIFICADO" +"55","CONTENTMOD" +"56","URLMOD" +"57","HEADERMOD" +"58","HEADERADD" +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Seu endereço IP está impedido de navegar: " +"101","Seu endereço IP está impedido de navegar." +"102","Seu usuário está impedido de navegar: " +"103","IP de Cliente Proibido" +"104","Espaço Bloqueado" +"105","Usuário Proibido" +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","A URL solicitada está mal formada." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Frase proibida encontrada: " +"301","Frase proibida encontrada." +"400","Combinação de frase proibida encontrada: " +"401","Combinação de frase proibida encontrada." +"402","Limite de frase ponderada de " +"403","Limite de frase ponderada excedida." +"450","Termo de busca proibido encontrado: " +"451","Termo de busca proibido encontrado." +"452","Combinação de termo de busca proibido encontrado: " +"453","Combinação de termo de busca proibido encontrado." +"454","Limite de termo de busca ponderado de " +"455","Limite de termo de busca ponderado excedido." +"456","Exceção da combinação do termo de busca encontrado: " +"457","Exceção do termo de busca encontrado: " +"500","Sítio proibido: " +"501","URL Proibida: " +"502","Bloco Restrito está ativado e este sítio não está na lista de exceções." +"503","URL Expressão Regular Proibida: " +"504","URL Expressão Regular Proibida encontrada." +"505","Bloco de IP Restrito está ativado e este endereço é apenas um endereço IP." +"506","Bloco Restrito SSL está ativado e este sítio não está na lista de exceções." +"507","Bloco de IP SSL Restrito está ativado e este endereço é apenas um endereço IP." +"508","Expressão Regular de Cabeçalho HTTP proibida: ", +"509","Expressão Regular de Cabeçalho HTTP proibida encontrada." +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Sítio HTTPS Proibido: " +"521","Palavras de Busca Proibidas: " +"522","Blocked User-Agent: " # needs translation +"560","Sítio bloqueado (local): " +"561","URL bloqueada (local): " +"580","Sítio HTTPS bloqueado (local): " +"581","Palavras de Busca Proibidas (local): " +"600","Exceção IP do cliente confere." +"601","Exceção do usuário cliente confere." +"602","Exceção do sítio confere." +"603","Exceção da URL confere." +"604","Exceção da frase encontrada: " +"605","Combinação de exceção da frase encontrada: " +"606","Exceção de URL ignorada." +"607","Exceção de cookie ignorada." +"608","Verificação de exceção de URL ignorada." +"609","Exceção de expressão de URL confere: " +"610","User-Agent pattern match: " # needs translation +"620","Campo cabeçalho HTTP Referer confere: " +"630","URL confere em " +"631"," Lista de espaço permitida" +"632","Lista permitida além do espaço conferida" +"662","Sítio (local)." +"663","URL (local)." +"700","Upload é proibido." +"701","Upload excedeu o limite." +"750","Download de arquivos restrito está ativado e este MIME type não está nas listas de exceções: " +"751","Download de arquivos restrito está ativado e este arquivo não confere com as listas de exceções." +"800","MIME Type Proibido: " +"900","Extensão Proibida: " +"1000","Nível de rotulagem PICS excedido no sítio acima." +"1100","Malware detectado." +"1101","Anúncio bloqueado" +"1200","Por favor, espere - baixando arquivo para verificação..." +"1201","Aviso: arquivo muito grande para verificar. Se você suspeita que este arquivo maior que " +"1202",", então recarregue esta página para baixar diretamente." +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download completo. Iniciando a verificação..." +"1220","Verificação completa.

Clique aqui para download: " +"1221","Download completo; arquivo não verificado.

Clique aqui para download: " +"1222","Arquivo muito grande para ser armazenado no cache.

Clique aqui para baixar novamente, ignorando a verificação: " +"1230","Arquivo não está mais disponível" diff --git a/config/e2guardian/languages/ptbrazilian/neterr_template.html b/config/e2guardian/languages/ptbrazilian/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/ptbrazilian/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/ptbrazilian/template.html b/config/e2guardian/languages/ptbrazilian/template.html new file mode 100644 index 0000000..822a90e --- /dev/null +++ b/config/e2guardian/languages/ptbrazilian/template.html @@ -0,0 +1,154 @@ + + + + + + + E2Guardian - Acesso negado + + + + + + + + + + + + + + + + +
+ +ACCESS DEINIED + +
+

+

Opa! Você tentou visitar um site que foi considerado inadequado:


+
+ -URL- +

+ Motivo
+
+ -REASONGIVEN-  + -CATEGORIES- +


+

Detalhes da conexão:

+ -USER-  +


+ + Confirmar e continuar +

+
+
+ + diff --git a/config/e2guardian/languages/russian-1251/fancydmtemplate.html b/config/e2guardian/languages/russian-1251/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/russian-1251/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/russian-1251/messages b/config/e2guardian/languages/russian-1251/messages new file mode 100644 index 0000000..ce787dc --- /dev/null +++ b/config/e2guardian/languages/russian-1251/messages @@ -0,0 +1,119 @@ +# e2guardian 3 messages file in russian +# charset=windows-1251 +# version by Shipitsin Igor +"0","Message number absent" # needs translation +"1"," " +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100"," IP :" +"101"," IP ." +"102"," :" +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200"," URL ." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300"," :" +"301"," ." +"400"," :" +"401"," ." +"402"," " +"403"," ." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500"," :" +"501"," URL:" +"502"," - ." +"503"," URL:" +"504"," URL." +"505"," IP - IP, ." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600"," IP ." +"601"," ." +"602"," ." +"603"," URL." +"604"," :" +"605"," :" +"606"," URL ." +"607"," cookie ." +"608","Scan bypass URL exception." +"609","Exception regular expression URL match: " +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700"," ." +"701"," ." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800"," MIME:" +"900"," :" +"1000"," PICS ." +"1100"," " +"1101","Advert blocked" +"1200","Please wait - downloading to be scanned..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","File no longer available" diff --git a/config/e2guardian/languages/russian-1251/neterr_template.html b/config/e2guardian/languages/russian-1251/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/russian-1251/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/russian-1251/template.html b/config/e2guardian/languages/russian-1251/template.html new file mode 100644 index 0000000..5c3ef48 --- /dev/null +++ b/config/e2guardian/languages/russian-1251/template.html @@ -0,0 +1,77 @@ + + + +e2guardian - ������ �������� + + + + + + + +

+ + + + + + + + + + + +
+ + ������ ��������! +
+ + -USER-  +
+ + ���� ����������� + + + + ������ � �������� �������: +

+ -URL- +

+ + ... �������� �� ��������� ��������: +

+ + -REASONGIVEN- + +



+ �� ������ ��� ������, ������ ���, ������� ������� ������� � ������� ����������� + ��� ���������� ��� ����������, ��������, ������� ��������� ����������������� ��� �������������� ��������. +

+ ���� � ��� ���� ������� ���������� � ���������� �������������� ���� ����� ����������� . +



+ + ������������e2guardian +
+ + + + + + diff --git a/config/e2guardian/languages/russian-koi8-r/fancydmtemplate.html b/config/e2guardian/languages/russian-koi8-r/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/russian-koi8-r/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/russian-koi8-r/messages b/config/e2guardian/languages/russian-koi8-r/messages new file mode 100644 index 0000000..583eee9 --- /dev/null +++ b/config/e2guardian/languages/russian-koi8-r/messages @@ -0,0 +1,117 @@ +# e2guardian messages file in Russian KOI8-R +"0","Message number absent" # needs translation +"1","Доступ запрещён" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," в " +"51","ИСКЛЮЧЕНИЕ" +"52","ЗАПРЕЩЕН" +"53","ЗАРАЖЕН" +"54","ОТСКАНИРОВАН" +"55","CONTENTMOD" +"56","URLMOD" +"57","HEADERMOD" +"58","HEADERADD" +"59","NETERROR" +"70","SSL САЙТ" +"71","IP Limit" +"72","Сканирование контента" +"100","Вашему IP адресу запрещен веб-просмотр: " +"101","Вашему IP адресу запрещен веб-просмотр." +"102","Пользователю запрещён веб-просмотр: " +"103","Заблокированный IP клиента" +"104","Заблокированная локация" +"105","Заблокированный пользователь" +"110","Proxy authentication error" # needs translation +"121","С вашей локации разрешен только ограниченный доступ" +"150","Сертификат сервера не является действительным" +"151","Невозможно открыть SSL соединение" +"152","Не удалось получить SSL сертификат" +"153","Не удалось загрузить приватный ключ сертификата" +"154","Не удалось согласовать SSL соединение с клиентом" +"155","Сервер не предоставил SSL сертификат" +"156","SSL сертификат сервера не совпадает с именем домена" +"157","Не удалось создать тоннель через локальный прокси" +"158","Не удалось открыть тоннель" +"159","Не удалось подключить к прокси серверу" +"160","Не удалось согласовать SSL соединение с сервером" +"200","Неверный URL" +"201","Не удалось подключиться к прокси серверу (таймаут)" +"202","Не удалось подключиться к прокси серверу (ошибка сети)" +"203","Запрашиваемый сайт не отвечает" +"204"," - Пожалуйста попробуйте ещё раз" +"205","Прокси сервер не отвечает (ошибка сети)" +"206"," - Пожалуйста попробуйте ещё раз позже" +"207","Запрашиваемый сайт не существует" +"208","Запрашиваемый сайт не имеет IPv4 адреса" +"209","Ошибка сервиса DNS - попробуйте снова" +"210","Ошибка сервиса DNS - попробуйте снова" +"300","Найдена запрещённая фраза: " +"301","Найдена запрещенная фраза." +"400","Найдена запрещённая комбинация фраз: " +"401","Найдена запрещённая комбинация фраз." +"402","Лимит проверки контента " +"403","Заблокирован системой проверки контента." +"450","Найден запрещённый поисковой запрос: " +"451","Найден запрещённый поисковой запрос." +"452","Найдена запрещённая комбинация поисковых фраз: " +"453","Найдена запрещённая комбинация поисковых фраз." +"454","Лимит веса поискового запроса " +"455","Достигнут лимит веса поискового запроса." +"456","Найден доверенный поисковой запрос: " +"457","Найден доверенный поисковой запрос: " +"500","Заблокированный сайт: " +"501","Заблокированная ссылка: " +"502","Включен режим белого списка. Данный сайт отсутствует в нём." +"503","Ссылка совпала с запрещённым паттерном : " +"504","Заблокированная ссылка." +"505","Доступ по IP запрещён." +"506","HTTPS доступен только к доверенным адресам." +"507","HTTPS доступ по IP адресу запрещён." +"508","Доступ с этого браузера запрещён: " +"509","Доступ с этого браузера запрещён." +"510","Заблокированный IP сайт " +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Заблокированный HTTPS сайт: " +"521","Заблокированная поисковая фраза: " +"522","Заблокированный User-Agent: " +"560","Заблокированный сайт (локально): " +"561","Заблокированная ссылка (локально): " +"580","Заблокированный HTTPS сайт (локально): " +"581","Заблокированная поисковая фраза (локально): " +"600","Совпал IP клиента." +"601","Совпал пользователь." +"602","Совпал сайт: " +"603","Совпала ссылка: " +"604","Найдена фраза: " +"605","Найдена комбинация фраз: " +"606","Ссылка на обход." +"607","Cookie обхода." +"608","Отсканировать ссылку обхода." +"609","Совпал паттерн ссылки: " +"610","Совпал паттерн User-Agent: " +"620","Referer match Совпал реферер: " +"630","Совпала ссылка " +"631"," списка доступа локации" +"632","Совпадение со списком доступа локации" +"662","Сайт (локально): " +"663","Ссылка (локально): " +"700","Загрузка заблокирована." +"701","Достигнут лимит загрузки." +"750","Включен режим белого списка для загрузок и этот MIME type в нем отсутствует: " +"751","Включен режим белого списка для загрузок и этот MIME type в нем отсутствует." +"800","Заблокированный MIME type: " +"900","Заблокированное расширение файла: " +"1100","Найден плохой, либо вирусный контент." +"1101","Реклама заблокирована" +"1200","Пожалуйста подождите. Загрузка файла для сканирования..." +"1201","Внимание: файл слишком большой для сканирования. Если этот файл больше " +"1202",", обновите страницу для прямого скачивания." +"1203","ВНИМАНИЕ: Невозможно произвести сканирование контента!" +"1210","Загрузка завершена. Сканирование..." +"1220","Сканирование завершено.

Нажмите здесь для загрузки: " +"1221","Загрузка завершена; файл не был отсканирован.

Нажмите здесь для загрузки: " +"1222","Файл слишком большой для кэша.

Нажмите здесь для скачивания без сканирования: " +"1230","Файл недоступен" +"9999","Dummy so master always has higher number" diff --git a/config/e2guardian/languages/russian-koi8-r/neterr_template.html b/config/e2guardian/languages/russian-koi8-r/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/russian-koi8-r/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/russian-koi8-r/template.html b/config/e2guardian/languages/russian-koi8-r/template.html new file mode 100644 index 0000000..9f45b41 --- /dev/null +++ b/config/e2guardian/languages/russian-koi8-r/template.html @@ -0,0 +1,73 @@ + + + e2guardian - Access Denied + + + + + +

+ + + + + + + + + + + +
+ + ������ ��������! +
+ + -USER-  +
+ + �������� ����� ����������� + + + + ������ � ��������:

-URL-

+ + ... ��� �������� �� ��������� �������: +

+ + -REASONGIVEN- + +



�� ������ ��� ���������, ��������� �� + ��������� �������� ������ � ����, ��� �������� (��� ���������, + ��� ��������) ����������� ���������.

���� � ��� + ���������� �������, �� ��������� � ����� ������� + ���������������.



+ + Powered by e2guardian +
+ + + + + + diff --git a/config/e2guardian/languages/slovak/fancydmtemplate.html b/config/e2guardian/languages/slovak/fancydmtemplate.html new file mode 100644 index 0000000..a65a2bd --- /dev/null +++ b/config/e2guardian/languages/slovak/fancydmtemplate.html @@ -0,0 +1,173 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + diff --git a/config/e2guardian/languages/slovak/messages b/config/e2guardian/languages/slovak/messages new file mode 100644 index 0000000..989ce36 --- /dev/null +++ b/config/e2guardian/languages/slovak/messages @@ -0,0 +1,120 @@ +# e2guardian messages file in Slovak +# by Dušan Biroščák biroscak@gmail.com +# corrections Peter Tuhársky tuharsky@misbb.sk +# charset=utf-8 +"0","Message number absent" # needs translation +"1","Prístup bol odopretý +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Vašej IP adrese nie je dovolené prehliadať: " +"101","Vaša IP adresa nemá dovolené prohliadanie." +"102","Vaše používateľské meno nemá dovolené prehliadať: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","Požadovaná URL je chybne zadaná." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Našla sa zakázaná fráza: " +"301","Našla sa zakázaná fráza." +"400","Našla sa zakázaná kombinácia fráz: " +"401","Našla sa zakázaná kombinácia fráz." +"402","Limit vážených fráz: " +"403","Bol prekročený limit pre vážené frázy." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Zakázaná doména: " +"501","Zakázaná URL: " +"502","Celoplošné blokovanie prístupu je aktivované a táto webová doména nie je povolená." +"503","Našla sa zakázaná URL adresa podľa regulárneho výrazu: " +"504","Našla sa zakázaná URL adresa podľa regulárneho výrazu." +"505","Celoplošné blokovanie IP adries je aktivované a bola zadaná len IP adresa." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Našla sa výnimková IP adresa klienta." +"601","Našiel sa výnimkový používateľ." +"602","Našla sa výnimková webová doména." +"603","Našla sa výnimková URL adresa." +"604","Našla sa výnimková fráza: " +"605","Našla sa kombinácia výnimkových fráz: " +"606","Prekonať výnimku URL." +"607","Prekonať cookie výnimku." +"608","Scan bypass URL exception." +"609","Exception regular expression URL match: " +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","Odosielanie na web je zakázané." +"701","Limit pre odosielanie na web bol prekročený." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","Zakázaný obsah súboru (MIME): " +"900","Zakázaná prípona súboru: " +"1000","Na tejto webovej doméne bola prekročená úroveň označovania PICS." +"1100","V tomto obsahu sa našiel vírus." +"1101","Advert blocked" +"1200","Please wait - downloading to be scanned..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","File no longer available" diff --git a/config/e2guardian/languages/slovak/neterr_template.html b/config/e2guardian/languages/slovak/neterr_template.html new file mode 100644 index 0000000..d2bb67e --- /dev/null +++ b/config/e2guardian/languages/slovak/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/slovak/template.html b/config/e2guardian/languages/slovak/template.html new file mode 100644 index 0000000..48908f9 --- /dev/null +++ b/config/e2guardian/languages/slovak/template.html @@ -0,0 +1,81 @@ + + + + + e2guardian - Prístup bol odopretý + + + +
+

+ + + + + + + + + + + + + +
+ Prístup +na túto stránku bol odopretý. +
+ -USER-  +
+ YOUR ORG NAME + + +Prístup na túto stránku: +

+ -URL- +

+ +... bol odopretý z týchto dôvodov: +

+ + -REASONGIVEN- + +



+Zobrazenie tohto hlásenia spôsobila +webstránka, ktorú ste sa +pokúsili otvoriť, +pretože obsahuje alebo je označená ako obsahujúca +nepatričný obsah. +

+Ak máte nejaké otázky alebo +námietky, prosím obráťte sa na svojho +správcu siete. +



+ +Beží na e2guardian +
+
+ + + + + + diff --git a/config/e2guardian/languages/spanish/fancydmtemplate.html b/config/e2guardian/languages/spanish/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/spanish/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/spanish/messages b/config/e2guardian/languages/spanish/messages new file mode 100644 index 0000000..4de8f3e --- /dev/null +++ b/config/e2guardian/languages/spanish/messages @@ -0,0 +1,118 @@ +# e2guardian 3 messages file in Spanish +# Translated by Roberto Quiroga, adapted for Unicode by Peter Vollmar +"0","Message number absent" # needs translation +"1","Acceso Denegado" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Su dirección IP no está autorizada a visitar: " +"101","Su dirección IP no está autorizada a navegar." +"102","El usuario no está autorizado a visitar: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","La URL solicitada está mal formada." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Se encontró la frase no permitida: " +"301","Se encontró una frase no permitida" +"400","Combinación de frases no permitida: " +"401","Combinación de frases no permitida." +"402","Límite de ponderación de frases de " +"403","Límite de ponderación de frases excedido" +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Sitio no permitido: " +"501","URL no permitida: " +"502","Bloqueo general de IP está activo y el sitio deseado no está en la lista de IPs permitidas." +"503","URL bloqueada por expresión regular: " +"504","URL bloqueada por expresión regular." +"505","Bloqueo general de IP está activo y la dirección deseada consiste únicamente en IP." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Dirección IP del cliente presente en la lista de excepciones." +"601","Usuario presente en la lista de excepciones." +"602","Sitio presente en la lista de excepciones." +"603","URL presente en la lista de excepciones." +"604","Frase presente en la lista de excepciones." +"605","Combinación de frases presente en la lista de excepciones: " +"606","Puente URL en la lista de excepciones." +"607","Puente cookie en la lista de excepciones." +"608","Scan bypass URL exception." +"609","Exception regular expression URL match: " +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","La subida está bloqueada." +"701","Límite de subida excedido." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","Clase MIME bloqueada: " +"900","Extensión bloqueada: " +"1000","Clasificación PICS excedida en el sitio indicado." +"1100","Virus or bad content detected." +"1101","Advert blocked" +"1200","Please wait - downloading to be scanned..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","File no longer available" diff --git a/config/e2guardian/languages/spanish/neterr_template.html b/config/e2guardian/languages/spanish/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/spanish/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/spanish/template.html b/config/e2guardian/languages/spanish/template.html new file mode 100644 index 0000000..140f060 --- /dev/null +++ b/config/e2guardian/languages/spanish/template.html @@ -0,0 +1,79 @@ + + + +e2guardian Acceso denegado + + + + + +

+ + + + + + + + + + + +
+ + Acceso denegado! +
+ + -USER-  +
+ +SU COMPANIA + + + +El acceso a la página web +

+ -URL- +

+ +ha sido denegado por la siguiente razón: +

+ + -REASONGIVEN- + +



+Usted está viendo este mensaje de error porque la página a la que
+intenta acceder contiene, o está clasificada como conteniendo,
+material que se considera inapropiado. +

+Si tiene preguntas, por favor póngase en contacto
con el Administrador de Sistemas o el Administrador de la Red. +



+ + Powered by e2guardian +
+ + + + + + diff --git a/config/e2guardian/languages/swedish/fancydmtemplate.html b/config/e2guardian/languages/swedish/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/swedish/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/swedish/messages b/config/e2guardian/languages/swedish/messages new file mode 100644 index 0000000..a0a4c16 --- /dev/null +++ b/config/e2guardian/languages/swedish/messages @@ -0,0 +1,118 @@ +# e2guardian messages file in Swedish +# Swedish translation by: David Hed +"0","Message number absent" # needs translation +"1","åtkomst nekad" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Din IP adress har inte tillstånd att surfa: " +"101","Din IP adress har inte tillstånd att surfa." +"102","Din användaridentitet har inte tillstånd att surfa: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","Begärd URL är felformaterad." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Förbjuden fras funnen: " +"301","Förbjuden fras funnen." +"400","Förbjuden kombination av fraser funnen: " +"401","Förbjuden kombination av fraser funnen." +"402","Viktad frasbedömning av " +"403","Viktad fras begränsning överskriden." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Förbjuden webbplats: " +"501","Förbjuden adress: " +"502","Blanket Block är aktiverat och webbplatsen är inte grå eller vitlistad." +"503","Förbjudet ord i adressfältet: " +"504","Förbjudet ord i adressfältet funnen." +"505","Blanket IP Block är aktiverat och denna adress är en endast IP adress." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Undantagen Dators IP-adress matchar." +"601","Undantagen användaridentitet matchar." +"602","Undantagen webbplats matchar." +"603","Undantagen URL matchar." +"604","Undantagsfras funnen: " +"605","Kombinerad undantagsfras funnen: " +"606","Kringgå URL begränsning." +"607","Kringgå cookie begränsning." +"608","Scan bypass URL exception." +"609","Exception regular expression URL match: " +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","Webbuppladdning är förbjuden." +"701","Storlek för webbuppladdning är överskriden." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","Förbjuden MIME typ: " +"900","Förbjuden filändelse: " +"1000","PICS klassificiering överskriden på ovanstående webbplats." +"1100","Virusinfekterat innehåll funnet." +"1101","Advert blocked" +"1200","Please wait - downloading to be scanned..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","File no longer available" diff --git a/config/e2guardian/languages/swedish/neterr_template.html b/config/e2guardian/languages/swedish/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/swedish/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/swedish/template.html b/config/e2guardian/languages/swedish/template.html new file mode 100644 index 0000000..3fffa88 --- /dev/null +++ b/config/e2guardian/languages/swedish/template.html @@ -0,0 +1,75 @@ + + + +e2guardian - Åtkomst nekad + + + + +

+ + + + + + + + + + + +
+ + Åtkomst förhindrad av proxy! +
+ + -USER-  +
+ + YOUR ORG NAME + + + + Åtkomst till sidan: +

+ -URL- +

+ + ... har blivit nekad på grund av följande skäl: +

+ + -REASONGIVEN- + +



+ Den centrala proxyservern är inställd på att filtrera undan eventuell skadlig kod eller av policyskäl begränsade nerladdningar. Bedömningen är automatisk så programmet kan ibland på felaktiga grunder förhindra åtkomst. +

+ Anser du att denna blockering är felaktig eller har andra frågor, kontakta din systemadministratör. +



+ + Powered by e2guardian +
+ + + + + + diff --git a/config/e2guardian/languages/turkish/fancydmtemplate.html b/config/e2guardian/languages/turkish/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/turkish/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/turkish/messages b/config/e2guardian/languages/turkish/messages new file mode 100644 index 0000000..ff73e1e --- /dev/null +++ b/config/e2guardian/languages/turkish/messages @@ -0,0 +1,119 @@ +# e2guardian messages file in Turkish +# Translation by Ozgur Karatas +# trdocmaster at e2guardian dot org +"0","Message number absent" # needs translation +"1","Erisim Engellendi" +"10","IP limit exceeded. There is a " # needs translation +"11"," IP limit set." # needs translation +"50"," in " # needs translation +"51","TRUSTED" # needs translation +"52","DENIED" # needs translation +"53","INFECTED" # needs translation +"54","SCANNED" # needs translation +"55","CONTENTMOD" # needs translation +"56","URLMOD" # needs translation +"57","HEADERMOD" # needs translation +"58","HEADERADD" # needs translation +"59","NETERROR" # needs translation +"70","SSL SITE" # needs translation +"71","IP Limit" # needs translation +"72","Content scanning" # needs translation +"100","Bu IP adresi ile internete erisim engellenmistir: " +"101","Bu IP ile internete erisim engellenmistir." +"102","Bu kullanici adi ile internete erisim engellenmistir.: " +"103","Banned Client IP" # needs translation +"104","Banned Location" # needs translation +"105","Banned User" # needs translation +"110","Proxy authentication error" # needs translation +"121","Only limited access allowed from your location" # needs translation +"150","Certificate supplied by server was not valid" # needs translation +"151","Could not open ssl connection" # needs translation +"152","Failed to get ssl certificate" # needs translation +"153","Failed to load ssl private key" # needs translation +"154","Failed to negotiate ssl connection to client" # needs translation +"155","No SSL certificate supplied by server" # needs translation +"156","Server's SSL certificate does not match domain name" # needs translation +"157","Unable to create tunnel through local proxy" # needs translation +"158","Opening tunnel failed" # needs translation +"159","Could not connect to proxy server" # needs translation +"160","Failed to nogotiate ssl connection to server" # needs translation +"200","Gitmek istediginiz URL hatalidir." +"201","Unable to get response from upstream proxy (timeout)" # needs translation +"202","Unable to get response from upstream proxy (error)" # needs translation +"203","The site requested is not responding" # needs translation +"204"," - Please try again later" # needs translation +"205","Upstream proxy is not responding (network error)" # needs translation +"206"," - Please try again later" # needs translation +"207","The site requested does not exist" # needs translation +"208","The site requested does not have an IPv4 address" # needs translation +"209","Temporary DNS service failure - please try again" # needs translation +"210","DNS service failure - please try again later" # needs translation +"300","Yasaklanmis bir ifade iceren sayfaya girmeye calisiyorsunuz: " +"301","Sistem yoneticisi tarafindan engellenmis bir ifade tespit edildi." +"400","Yasaklanmis kelimeler bulundu: " +"401","Yasaklanmis kelimeler tespit edildi." +"402","Engellenmis ifadelerin limiti asildi: " +"403","Engellenmis kelime limiti asildi." +"450","Banned search term found: " # needs translation +"451","Banned search term found." # needs translation +"452","Banned combination search term found: " # needs translation +"453","Banned combination search term found." # needs translation +"454","Weighted search term limit of " # needs translation +"455","Weighted search term limit exceeded." # needs translation +"456","Exception combination search term found: " # needs translation +"457","Exception search term found: " # needs translation +"500","Yasaklanmis Site: " +"501","Yasaklanmis URL: " +"502","Erisilebilir listesinde bulunmayan bir siteye giremezsiniz." +"503","Yasaklanmis dzensiz ifade (URL): " +"504","Yasaklanmis duzensiz ifadeye rastlandi." +"505","Bu IP adresinin asagidaki siteye girisi engellenmistir." +"506","HTTPS access is only allowed to trusted sites." # needs translation +"507","HTTPS access by IP address is not allowed." # needs translation +"508","Access not allowed using this browser (or app): " # needs translation +"509","Access not allowed using this browser (or app)." # needs translation +"510","Blocked IP site " # needs translation +"511","Tranparent https connection is not TLS: " # needs translation +"512","Tranparent https connection does not have SNI: " # needs translation +"520","Blocked HTTPS site: " # needs translation +"521","Banned Search Words: " # needs translation +"522","Blocked User-Agent: " # needs translation +"560","Blocked site (local): " # needs translation +"561","Blocked URL (local): " # needs translation +"580","Blocked HTTPS site (local): " # needs translation +"581","Banned Search Words (local): " # needs translation +"600","Ayricalikli IP adresine sahipsiniz." +"601","Ayricalikli kullanici adina sahipsiniz." +"602","Ayricalikli bir siteye girdiniz." +"603","Ayricalikli bir URL adresine girdiniz." +"604","Ayricalikli ifade bulundu: " +"605","Kombinasyonu ertelenmis ifade bulundu: " +"606","URL adresi ayricalikli listesine alinmalidir." +"607","Bu sitede cookie kesfedildi." +"608","Ayricalikli URL adresi taraniyor." +"609","Ayricalikli duzenlenmis url adresi: " +"610","User-Agent pattern match: " # needs translation +"620","Referer match: " # needs translation +"630","URL match in " # needs translation +"631"," location allow list" # needs translation +"632","Location overide allow list matched" # needs translation +"662","Site (local)." # needs translation +"663","URL (local)." # needs translation +"700","Internet zerinden dosya gnderimi yasaklanmistir." +"701","Internet zerinden dosya gnderimi sinirini astiniz." +"750","Blanket file download is active and this MIME type is not on the white list: " # needs translation +"751","Blanket file download is active and this file is not matched by the white lists." # needs translation +"800","Yasaklanmis MIME Tr: " +"900","Yasaklanmis dosya uzantisi: " +"1000","Bu sitedeki resim siniri asildi." +"1100","Virus ve kotu icerige rastlandi." +"1101","Site bloklandi. Adware veya spyware tespit edildi." +"1200","Lutfen bekleyiniz, icerik taranarak yukleniyor.." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " # needs translation +"1202",", then refresh this page to download directly." # needs translation +"1203","WARNING: Could not perform content scan!" # needs translation +"1210","Yukleme bitti, taramadan geciriliyor.." +"1220","Tarama bitti.

Yuklemek icin tiklayiniz: " +"1221","Download complete; file not scanned.

Click here to download: " # needs translation +"1222","File too large to cache.

Click here to re-download, bypassing scan: " # needs translation +"1230","Dosya uzunlugu gecersizdir." diff --git a/config/e2guardian/languages/turkish/neterr_template.html b/config/e2guardian/languages/turkish/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/turkish/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/turkish/template.html b/config/e2guardian/languages/turkish/template.html new file mode 100644 index 0000000..4ef166d --- /dev/null +++ b/config/e2guardian/languages/turkish/template.html @@ -0,0 +1,151 @@ + + + + + + + + E2Guardian - Erisim Engellendi + + + + + + + + + + + + + + + + +
+ +ACCESS DEINIED + +
+

+

Asagidaki adrese erisiminiz engellenmistir:


+
+ -URL- +

+ Erisim kisitlama sebebi:
+
+ Category: -CATEGORIES-   + -REASONGIVEN- +


+

Sistem yöneticiniz tarafindan girilmesine izin verilmeyen bir sayfaya erisim yapmaya calisiyorsunuz.

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+

+
+
+ diff --git a/config/e2guardian/languages/ukenglish/fancydmtemplate.html b/config/e2guardian/languages/ukenglish/fancydmtemplate.html new file mode 100644 index 0000000..11fff02 --- /dev/null +++ b/config/e2guardian/languages/ukenglish/fancydmtemplate.html @@ -0,0 +1,179 @@ + + + Downloading -FILENAME- (-FILESIZE- bytes) + + + + + + + + diff --git a/config/e2guardian/languages/ukenglish/messages b/config/e2guardian/languages/ukenglish/messages new file mode 100644 index 0000000..3d5fffb --- /dev/null +++ b/config/e2guardian/languages/ukenglish/messages @@ -0,0 +1,117 @@ +# e2guardian messages file in UK English +"0","Message number absent" +"1","Access Denied" +"10","IP limit exceeded. There is a " +"11"," IP limit set." +"50"," in " +"51","TRUSTED" +"52","DENIED" +"53","INFECTED" +"54","SCANNED" +"55","CONTENTMOD" +"56","URLMOD" +"57","HEADERMOD" +"58","HEADERADD" +"59","NETERROR" +"70","SSL SITE" +"71","IP Limit" +"72","Content scanning" +"100","Your IP address is not allowed to web browse: " +"101","Your IP address is not allowed to web browse." +"102","Your username is not allowed to web browse: " +"103","Banned Client IP" +"104","Banned Location" +"105","Banned User" +"110","Proxy authentication error" +"121","Only limited access allowed from your location" +"150","Certificate supplied by server was not valid" +"151","Could not open ssl connection" +"152","Failed to get ssl certificate" +"153","Failed to load ssl private key" +"154","Failed to negotiate ssl connection to client" +"155","No SSL certificate supplied by server" +"156","Servers SSL certificate does not match domain name" +"157","Unable to create tunnel through local proxy" +"158","Opening tunnel failed" +"159","Could not connect to proxy server" +"160","Failed to nogotiate ssl connection to server" +"200","The requested URL is malformed." +"201","Unable to get response from upstream proxy (timeout)" +"202","Unable to connect to upstream proxy (network error)" +"203","The site requested is not responding" +"204"," - Please try again later" +"205","Upstream proxy is not responding (network error)" +"206"," - Please try again later" +"207","The site requested does not exist" +"208","The site requested does not have an IPv4 address" +"209","Temporary DNS service failure - please try again" +"210","DNS service failure - please try again later" +"300","Banned phrase found: " +"301","Banned phrase found." +"400","Banned combination phrase found: " +"401","Banned combination phrase found." +"402","Content Check limit of " +"403","Blocked by Content Checking." +"450","Banned search term found: " +"451","Banned search term found." +"452","Banned combination search term found: " +"453","Banned combination search term found." +"454","Weighted search term limit of " +"455","Weighted search term limit exceeded." +"456","Exception combination search term found: " +"457","Exception search term found: " +"500","Blocked site: " +"501","Blocked URL: " +"502","Walled Garden is on and the site is not available to you." +"503","Banned pattern matched URL: " +"504","Blocked URL." +"505","Access to sites by IP address is not allowed." +"506","HTTPS access is only allowed to trusted sites." +"507","HTTPS access by IP address is not allowed." +"508","Access not allowed using this browser (or app): " +"509","Access not allowed using this browser (or app)." +"510","Blocked IP site " +"511","Tranparent https connection is not TLS: " +"512","Tranparent https connection does not have SNI: " +"520","Blocked HTTPS site: " +"521","Banned Search Words: " +"522","Blocked User-Agent: " +"560","Blocked site (local): " +"561","Blocked URL (local): " +"580","Blocked HTTPS site (local): " +"581","Banned Search Words (local): " +"600","Client IP match." +"601","Client user match." +"602","Site match: " +"603","URL match: " +"604","Phrase found: " +"605","Combination phrase found: " +"606","Bypass URL." +"607","Bypass cookie." +"608","Scan bypass URL." +"609","URL pattern match: " +"610","User-Agent pattern match: " +"620","Referer match: " +"630","URL match in " +"631"," location allow list" +"632","Location overide allow list matched" +"662","Site (local): " +"663","URL (local): " +"700","Web upload is banned." +"701","Web upload limit exceeded." +"750","Blanket file download is active and this MIME type is not on the white list: " +"751","Blanket file download is active and this file is not matched by the white lists." +"800","Banned MIME file type: " +"900","Banned file extension: " +"1100","Virus or bad content detected." +"1101","Advert blocked" +"1200","Please wait - downloading file for scanning..." +"1201","Warning: file too large to scan. If you suspect that this file is larger than " +"1202",", then refresh this page to download directly." +"1203","WARNING: Could not perform content scan!" +"1210","Download Complete. Starting scan..." +"1220","Scan complete.

Click here to download: " +"1221","Download complete; file not scanned.

Click here to download: " +"1222","File too large to cache.

Click here to re-download, bypassing scan: " +"1230","File no longer available" +"9999","Dummy so master always has higher number" diff --git a/config/e2guardian/languages/ukenglish/neterr_template.html b/config/e2guardian/languages/ukenglish/neterr_template.html new file mode 100644 index 0000000..aec3aed --- /dev/null +++ b/config/e2guardian/languages/ukenglish/neterr_template.html @@ -0,0 +1,144 @@ + + + + + + + + E2Guardian - Unable to load website + + + + + + + + + + + + + + + + +
+ +Page unavailable + +
+

+

Oops! There seems to be an issue loading this page:


+
+ -URL- +

+ Because
+
+ -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ +Go Back to previous page +
+
+ + diff --git a/config/e2guardian/languages/ukenglish/template.html b/config/e2guardian/languages/ukenglish/template.html new file mode 100644 index 0000000..60c1524 --- /dev/null +++ b/config/e2guardian/languages/ukenglish/template.html @@ -0,0 +1,154 @@ + + + + + + + + E2Guardian - Access Denied + + + + + + + + + + + + + + + + +
+ +ACCESS DEINIED + +
+

+

Oops! You have tried visiting a website which has been deemed inappropriate:


+
+ -URL- +

+ Because
+
+ Category: -CATEGORIES-   + -REASONGIVEN- +


+

Your details are below:

+ User: -USER-   Group: -FILTERGROUP-   IP: -IP- +


+ + Acknowledge +

+
+
+ + diff --git a/config/e2guardian/lists/addheaderregexplist b/config/e2guardian/lists/addheaderregexplist new file mode 100644 index 0000000..8447024 --- /dev/null +++ b/config/e2guardian/lists/addheaderregexplist @@ -0,0 +1,13 @@ +#Add header where url matches +# +## to enable restricted YouTube +#"(^http://www\.youtube\.com/.*$)"->"YouTube-Restrict: Strict" +#"(^http://m\.youtube\.com/.*$)"->"YouTube-Restrict: Strict" +#"(^http://youtubei\.googleapis\.com/.*$)"->"YouTube-Restrict: Strict" +#"(^http://youtube\.googleapis\.com/.*$)"->"YouTube-Restrict: Strict" +#"(^http://www\.youtube-nocookie\.com/.*$)"->"YouTube-Restrict: Strict" +#"(^http://www\.youtube\.com$)"->"YouTube-Restrict: Strict" +#"(^http://m\.youtube\.com$)"->"YouTube-Restrict: Strict" +#"(^http://youtubei\.googleapis\.com$)"->"YouTube-Restrict: Strict" +#"(^http://youtube\.googleapis\.com$)"->"YouTube-Restrict: Strict" +#"(^http://www\.youtube-nocookie\.com$)"->"YouTube-Restrict: Strict" diff --git a/config/e2guardian/lists/authexceptioniplist b/config/e2guardian/lists/authexceptioniplist new file mode 100644 index 0000000..f6b8ec5 --- /dev/null +++ b/config/e2guardian/lists/authexceptioniplist @@ -0,0 +1,9 @@ +#Access allowed prior to authentication +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/authexceptionsiteiplist b/config/e2guardian/lists/authexceptionsiteiplist new file mode 100644 index 0000000..f6b8ec5 --- /dev/null +++ b/config/e2guardian/lists/authexceptionsiteiplist @@ -0,0 +1,9 @@ +#Access allowed prior to authentication +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/authexceptionsitelist b/config/e2guardian/lists/authexceptionsitelist new file mode 100644 index 0000000..570abd3 --- /dev/null +++ b/config/e2guardian/lists/authexceptionsitelist @@ -0,0 +1 @@ +#Access allowed prior to authentication diff --git a/config/e2guardian/lists/authexceptionurllist b/config/e2guardian/lists/authexceptionurllist new file mode 100644 index 0000000..570abd3 --- /dev/null +++ b/config/e2guardian/lists/authexceptionurllist @@ -0,0 +1 @@ +#Access allowed prior to authentication diff --git a/config/e2guardian/lists/authplugins/ipgroups b/config/e2guardian/lists/authplugins/ipgroups new file mode 100644 index 0000000..5ec6b58 --- /dev/null +++ b/config/e2guardian/lists/authplugins/ipgroups @@ -0,0 +1,11 @@ +# IP-Group list +# Used by the IP-based auth plugin to assign IP addresses to filter groups. +# +# Examples: +# Straight IP matching: +#192.168.0.1 = filter1 +# Subnet matching: +#192.168.1.0/255.255.255.0 = filter1 +# Range matching: +#192.168.1.0-192.168.1.255 = filter1 + diff --git a/config/e2guardian/lists/authplugins/portgroups b/config/e2guardian/lists/authplugins/portgroups new file mode 100644 index 0000000..4938e98 --- /dev/null +++ b/config/e2guardian/lists/authplugins/portgroups @@ -0,0 +1,8 @@ +# Port-Group list +# Used by the Port-based auth plugin to assign Ports to filter groups. +# +# Note that ports MUST be entered in ascending order +# +# Examples: +#8080 = filter0 +#8081 = filter1 diff --git a/config/e2guardian/lists/bannedclientlist b/config/e2guardian/lists/bannedclientlist new file mode 100644 index 0000000..bd7eff1 --- /dev/null +++ b/config/e2guardian/lists/bannedclientlist @@ -0,0 +1,6 @@ +# Domain names of client machines to +# disallow web access to. +# +# This is not the the domains of web servers +# you want to filter. + diff --git a/config/e2guardian/lists/bannedextensionlist b/config/e2guardian/lists/bannedextensionlist new file mode 100644 index 0000000..ad42160 --- /dev/null +++ b/config/e2guardian/lists/bannedextensionlist @@ -0,0 +1,211 @@ +#Banned extension list + +# File extensions with executable code + +# The following file extensions can contain executable code. +# This means they can potentially carry a virus to infect your computer. + +.ade # Microsoft Access project extension +.adp # Microsoft Access project +.asx # Windows Media Audio / Video +.bas # Microsoft Visual Basic class module +.bat # Batch file +.cab # Windows setup file +.chm # Compiled HTML Help file +.cmd # Microsoft Windows NT Command script +.com # Microsoft MS-DOS program +.cpl # Control Panel extension +.crt # Security certificate +.dll # Windows system file +.exe # Program +.hlp # Help file +.ini # Windows system file +.hta # HTML program +.inf # Setup Information +.ins # Internet Naming Service +.isp # Internet Communication settings +# .js # JScript file - often needed in web pages +# .jse # Jscript Encoded Script file - often needed in web pages +.lnk # Windows Shortcut +.mda # Microsoft Access add-in program +.mdb # Microsoft Access program +.mde # Microsoft Access MDE database +.mdt # Microsoft Access workgroup information +.mdw # Microsoft Access workgroup information +.mdz # Microsoft Access wizard program +.msc # Microsoft Common Console document +.msi # Microsoft Windows Installer package +.msp # Microsoft Windows Installer patch +.mst # Microsoft Visual Test source files +.pcd # Photo CD image, Microsoft Visual compiled script +.pif # Shortcut to MS-DOS program +.prf # Microsoft Outlook profile settings +.reg # Windows registry entries +.scf # Windows Explorer command +.scr # Screen saver +.sct # Windows Script Component +.sh # Shell script +.shs # Shell Scrap object +.shb # Shell Scrap object +.sys # Windows system file +.url # Internet shortcut +.vb # VBScript file +.vbe # VBScript Encoded script file +.vbs # VBScript file +.vxd # Windows system file +.wsc # Windows Script Component +.wsf # Windows Script file +.wsh # Windows Script Host Settings file +.otf # Font file - can be used to instant reboot 2k and xp +.ops # Office XP settings + + + +# Files which one normally things as non-executable but +# can contain harmful macros and viruses + +.doc # Word document +.xls # Excel document +.pps + + +# Other files which may contain files with executable code + +.gz # Gziped file +.tar # Tape ARchive file +.zip # Windows compressed file +.tgz # Unix compressed file +.bz2 # Unix compressed file +.cdr # Mac disk image +.dmg # Mac disk image +.smi # Mac self mounting disk image +.sit # Mac compressed file +.sea # Mac compressed file, self extracting +.bin # Mac binary compressed file +.hqx # Mac binhex encoded file +.rar # Similar to zip + + +# Time/bandwidth wasting files + +.mp3 # Music file +.mpeg # Movie file +.mpg # Movie file +.avi # Movie file +.asf # this can also exploit a security hole allowing virus infection +.iso # CD ISO image +.ogg # Music file +.wmf # Movie file +.bin # CD ISO image +.cue # CD ISO image + +# Banned Media extension list (Audio , Video , Streaming) +# Arrange Alphabetically +# Some have no Description +#.3g2 # +#.3gp # Nokia Movie File +#.3gp2 +#.3gpp +#.3gpp2 +#.aac # AAC Audio +#.acp # AAC for SD Media +#.adts +#.aif +#.aifc +#.aiff # AIFF Audio +#.amc # AMC Media +#.amr # narrow-Band Content +#.asf # Media / this can also exploit a security hole allowing virus infection +#.asx # Windows Media Audio / Video +#.au # uLaw/AU Audio +#.avi # Movie file +#.awb # AMR Wide-Band Content +#.bwf +#.caf # CAF Audio +#.cda # Audio CD File +#.cdda # Audio CD File +#.cel +#.cue # CD ISO image +#.dif +#.divx # Compress Movie +#.dv # Video Format used in Portable Camera +#.flc # Autodesk Animator +#.fli +#.flv # Internet Movies +#.gsm +#.ivf +#.kar # Karaoke Media Files +#.m15 +#.m1a +#.m1s +#.m1v +#.m2v +#.m3u # MP3 Playlist +#.m4a # AAC Audio +#.m4b +#.m4e +#.m4p # AAC Audio (Protected) +#.m4v # Video (Protected) +#.m75 +#.mid # Midi Audio Files +#.midi # Midi Audio Files +#.mjpg +#.mov # Movie Files +#.mp1 +#.mp2 +#.mp3 # Music file +#.mp4 # Mpeg-4 Media +#.mpa +#.mpe +#.mpeg # Movie file +#.mpg # Movie file +#.mpga +#.mpm +#.mps +#.mpv +#.mpv2 +#.mqv # Quicktime Movies +#.mv +#.ogg # Music file +#.ogm # Ogg Based Movie Files +#.pls # Shoutcast type of radio +#.qcp # Qualcomm Purevoice Audio +#.qt # Quicktime File +#.qtc +#.qtl # Quicktime Movies +#.ra # Real Audio +#.ram # Real Audio Media +#.rm # Real Media Files +#.rmi +#.rmm +#.rmp +#.rmvb # Real Media Video +#.rnx +#.rp # Real Player Files +#.rt +#.rts +#.rtsp +#.rv +#.sd2 # Sound Designer II +#.sdp # Stream Descriptor +#.sdv # SD Video +#.sf +#.smf +#.smi # +#.smil # SMIL Multimedia Presentation (Video and Audio Presentation +#.snd +#.ssm # Streaming Media Metafile +#.swa # MP3 Audio +#.swf # Shockwave Streaming files +#.ulw +#.vfw # Video for Windows +#.wav +#.wax +#.wm +#.wma +#.wmf # Movie file +#.wmp +#.wmv # Windows Media Video +#.wmx +#.wvx +#.xpl diff --git a/config/e2guardian/lists/bannediplist b/config/e2guardian/lists/bannediplist new file mode 100644 index 0000000..9ddddaa --- /dev/null +++ b/config/e2guardian/lists/bannediplist @@ -0,0 +1,12 @@ +# IP addresses of client machines to +# disallow web access to. +# +# This is not the IP of web servers +# you want to filter. + +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/bannedmimetypelist b/config/e2guardian/lists/bannedmimetypelist new file mode 100644 index 0000000..791ffea --- /dev/null +++ b/config/e2guardian/lists/bannedmimetypelist @@ -0,0 +1,18 @@ +# banned MIME types + +audio/mpeg +audio/x-mpeg +audio/x-pn-realaudio +audio/x-wav +video/mpeg +video/x-mpeg2 +video/acorn-replay +video/quicktime +video/x-msvideo +video/msvideo +application/gzip +application/x-gzip +application/zip +application/compress +application/x-compress +application/java-vm diff --git a/config/e2guardian/lists/bannedphraselist b/config/e2guardian/lists/bannedphraselist new file mode 100644 index 0000000..3d7da1d --- /dev/null +++ b/config/e2guardian/lists/bannedphraselist @@ -0,0 +1,57 @@ +# BANNEDPHRASELIST - INSTRUCTIONS FOR USE +# +# To block any page with the word "sex". +# < sex > +# +# To block any page with words that contain the string "sex". (ie. sexual) +# +# +# To block any page with the string "sex magazine". +# +# +# To block any page containing the words/strings "sex" and "fetish". +# , +# +# < test> will match any word with the string 'test' at the beginning +# will match any word with the string 'test' at the end +# will match any word with the string 'test' at any point in the word +# < test > will match only the word 'test' +# will match that exact phrase +# , will match if both words are found in the page +# A combination of the above can also be used eg < test>, +# +# +# Extra phrase-list files to include +# .Include +# +# +# All phrases need to be within < and > to work, othewise they will be +# ignored. + +# MORE EXAMPLE LISTS CAN BE DOWNLOADED FROM DANSGUARDIAN.ORG + +# Phrase Exceptions are no longer listed in this file, they are now +# listed in the exceptionphraselist file. +# + +#listcategory: "Banned Phrases" + +# The following banned phraselists enable Website Content Labeling systems. These are enabled by default, but may also be activated using phraselists. + +.Include +#.Include + +# The following banned phraselists are included in the default DG distribution. + +.Include +##.Include + +#.Include + +#.Include +##.Include + +#.Include + + + diff --git a/config/e2guardian/lists/bannedregexpheaderlist b/config/e2guardian/lists/bannedregexpheaderlist new file mode 100644 index 0000000..ac2a8eb --- /dev/null +++ b/config/e2guardian/lists/bannedregexpheaderlist @@ -0,0 +1,9 @@ +#Banned outgoing HTTP headers based on regular expressions +# +# E.g. 'User-Agent: .*MSIE' would block several versions of Internet Explorer +# (assuming the user-agent is not being spoofed by the client) +# +# Headers are matched line-by-line, not as a single block. + +#listcategory: "Banned Regular Expression HTTP Headers" + diff --git a/config/e2guardian/lists/bannedregexpurllist b/config/e2guardian/lists/bannedregexpurllist new file mode 100644 index 0000000..647d4e1 --- /dev/null +++ b/config/e2guardian/lists/bannedregexpurllist @@ -0,0 +1,120 @@ +#Banned URLs based on Regular Expressions +# +# E.g. 'sex' would block sex.com and middlesex.com etc + +#listcategory: "Banned Regular Expression URLs" + +#Banned URLs based on Regular Expressions + + +###################################################### +# Pornography, Modelling and Adult Sites +###################################################### + +# The following two lines may work better than the above - Philip Pearce 9/11/2004 +(big|cyber|hard|huge|mega|small|soft|super|tiny|bare|naked|nude|anal|oral|topp?les|sex|phone)+.*(anal|babe|bharath|boob|breast|busen|busty|clit|cum|cunt|dick|fetish|fuck|girl|hooter|lez|lust|naked|nude|oral|orgy|penis|porn|porno|pupper|pussy|rotten|sex|shit|smutpump|teen|tit|topp?les|xxx)s? +(anal|babe|bharath|boob|breast|busen|busty|clit|cum|cunt|dick|fetish|fuck|girl|hooter|lez|lust|naked|nude|oral|orgy|penis|porn|porno|pupper|pussy|rotten|sex|shit|smutpump|teen|tit|topp?les|xxx)+.*(big|cyber|hard|huge|mega|small|soft|super|tiny|bare|naked|nude|anal|oral|topp?les|sex)+ + +#HardCore phrases +(adultsight|adultsite|adultsonly|adultweb|blowjob|bondage|centerfold|cumshot|cyberlust|cybercore|hardcore|masturbat) +(bangbros|pussylip|playmate|pornstar|sexdream|showgirl|softcore|striptease) + +#SoftCore phrases - more likely to overblock - possibly on news sites +#(incest|obscene|pedophil|pedofil) + +#Photo Modeling - supplied by David Burkholder +#(male|m[ae]n|boy|girl|beaut|agen[ct]|glam)+.*(model|talent) + +# The following will help to block explicit media files (images and video) +(sex|fuck|boob|cunt|fetish|tits|anal|hooter|asses|shemale|submission|porn|xxx|busty|knockers|slut|nude|naked|pussy)+.*(\.jpg|\.wmv|\.mpg|\.mpeg|\.gif|\.mov) +(girls|babes|bikini|model)+.*(\.jpg|\.wmv|\.mpg|\.mpeg|\.gif|\.mov) + +#Block Naturism and Nudist sites +#(naturism|naturist|nude|nudist|nudism|nekkid|nakt|naakt) + + +###################################################### +# Search Engine and Related +###################################################### + +#Block unfiltered options on various search engines +#(^|[\?+=&/])(.*\.google\..*/.*\?.*safe=off)([\?+=&/]|$) +#(^|[\?+=&/])(.*\.alltheweb.com/customize\?.*copt_offensive=off)([\?+=&/]|$) + +#Block images and video on altavista, alltheweb, yahoo etc - as they are anonomised +#(yahoo.com\/image\/) +#(yimg.com\/image\/) +#(altavista.com\/image\/) +#(altavista.com\/video\/) +#(picsearch.com\/is) + +#Block images and video on google +#(images.google)+.*(\.jpg|\.wmv|\.mpg|\.mpeg|\.gif|\.mov) +#(google.com\/video) #block all video +#(google.com\/ThumbnailServer) #block video thumbnails +#(google.com\/videoplay) #block only playing the video + + +###################################################### +# Proxy Sites +###################################################### + +#Block Cgiproxy, Poxy, PHProxy and other Web-based proxies +(cecid.php|nph-webpr|nph-pro|/dmirror|cgiproxy|phpwebproxy|__proxy_url|proxy.php) + +#Block websites containing proxy lists +(anonymizer|proxify|megaproxy) + +#AGRESSIVE blocking of all URLs containing proxy - WARNING - this WILL overblock!! +#(proxy) + + +###################################################### +# Gambling - supplied by David Burkholder +###################################################### +#(casino|bet(ting|s)|lott(ery|o)|gam(e[rs]|ing|bl(e|ing))|sweepstake|poker) + + +###################################################### +# Sport - supplied by David Burkholder +###################################################### +#(bowling|badminton|box(e[dr]|ing)|skat(e[rs]|ing)|hockey|soccer|nascar|wrest|rugby|tennis|sports|cheerlead|rodeo|cricket|badminton|stadium|derby) +#((paint|volley|bas(e|ket)|foot|quet)ball|/players[/\.]?|(carn|fest)ival) + +#Racing - supplied by David Burkholder +#(speed(st|wa|y)|corvette|rac[eiy]|wrest|harley|motorcycle|nascar) + + +###################################################### +# News sites - supplied by David Burkholder +###################################################### +#(news(watch|pap|cast)|herald|sentinel|courier|gazet|tribune|chronicle|daily|ning)news) + + +###################################################### +# Dating Sites - supplied by David Burkholder +###################################################### +#(meet|hook|mailord|latin|(asi|mexic|dominic|russi|kore|colombi|balk)an|brazil|filip|french|chinese|ukrain|thai|tour|foreign|date)+.*(dar?[lt]ing|(sing|coup)le|m[ae]n|girl|boy|guy|mat(e|ing)|l[ou]ve?|partner|meet) +#(marr(y|i[ae])|roman(ce|tic)|fiance|bachelo|dating|affair|personals) + + +###################################################### +# Miscellaneous - Productivity etc. +###################################################### + +#Use this to block web counters: +#(adlog.php|cnt.cgi|count.cgi|count.dat|count.jsp|count.pl|count.php|counter.cgi|counter.js|counter.pl|countlink.cgi|fpcount.exe|logitpro.cgi|rcounter.dll|track.pl|w_counter.js) +#Contributed by proxy@barendse.to + +#Free stuff - supplied by David Burkholder +#(free|phone|mobile)+.*(love|music|movie|dvd|video|stuff|site|arcade|wallpaper|mp3) +#((ring|real)tone) + +#Music - supplied by David Burkholder +#(rock|pop|jazz|rap|punk)+.*(cult|roll|geek|drum|music|history|band) + +# WARNING: This is part of the URL for the e2guardian.org sample virus archive. +# You probably don't want to go there unintentionally. +(Variants/AVTest) + + diff --git a/config/e2guardian/lists/bannedregexpuseragentlist b/config/e2guardian/lists/bannedregexpuseragentlist new file mode 100644 index 0000000..3ebc2eb --- /dev/null +++ b/config/e2guardian/lists/bannedregexpuseragentlist @@ -0,0 +1,7 @@ +#Banned User-Agents based on regular expressions +# +# E.g. ' .*MSIE' would block several versions of Internet Explorer +# (assuming the user-agent is not being spoofed by the client) +# +#listcategory: "user-agent" + diff --git a/config/e2guardian/lists/bannedrooms/default b/config/e2guardian/lists/bannedrooms/default new file mode 100644 index 0000000..127f5d3 --- /dev/null +++ b/config/e2guardian/lists/bannedrooms/default @@ -0,0 +1,2 @@ +#Untitled room +192.168.42.42 diff --git a/config/e2guardian/lists/bannedsearchlist b/config/e2guardian/lists/bannedsearchlist new file mode 100644 index 0000000..18c50cb --- /dev/null +++ b/config/e2guardian/lists/bannedsearchlist @@ -0,0 +1,9 @@ +#Banned Search Words +# +#Words must be in alphabetic order within a single line +# and separated by a '+' sign. +#All combinations of the words will be blocked +# e.g. girl+naughty +# will block naughty+girl as well as girl+naughty + + diff --git a/config/e2guardian/lists/bannedsearchoveridelist b/config/e2guardian/lists/bannedsearchoveridelist new file mode 100644 index 0000000..e69de29 diff --git a/config/e2guardian/lists/bannedsiteiplist b/config/e2guardian/lists/bannedsiteiplist new file mode 100644 index 0000000..097078b --- /dev/null +++ b/config/e2guardian/lists/bannedsiteiplist @@ -0,0 +1,12 @@ +# IP sites in banned list + +#The bannedsiteiplist is for blocking ALL of an IP site + +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/bannedsitelist b/config/e2guardian/lists/bannedsitelist new file mode 100644 index 0000000..8ecec1d --- /dev/null +++ b/config/e2guardian/lists/bannedsitelist @@ -0,0 +1,97 @@ +#domains in banned list +#Don't bother with the www. or the http:// + +#The bannedurllist is for blocking PART of a site +#The bannedsitelist is for blocking ALL of a site + +#NOTE: Sites using just IP should be put into bannedsiteiplist + +#You can include +#.tld so for example you can match .gov for example + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +#An example of grey list use is when in Blanket Block (whitelist) +#mode and you want to allow some sites but still filter as normal +#on their content + +#Another example of grey list use is when you ban a site but want +#to allow part of it. + +#To include additional files in this list use this example: +#.Include + +#You can have multiple .Includes. + +# Time limiting syntax: +# #time: +# Example: +##time: 9 0 17 0 01234 +# Remove the first # from the line above to enable this list only from +# 9am to 5pm, Monday to Friday. + +# List categorisation +#listcategory: "Banned Sites" + +#List other sites to block: + +# badboys.com + +# NOTE: From v5 Blanket blocks are now implimented using Storyboarding +# WARNING: Old style Blanket blocks in this file will be silently ignored + + +# The squidGuard advert domain/URL lists are now included by default. +# To work with advanced ad blocking & the logadblocks option, advert +# phrase/site/URL lists should have the string "ADs" in their listcategory. +# .Include + +#Remove the # from the following and edit as needed to use a stock +#squidGuard/urlblacklists collection. +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include + +# You will need to edit to add and remove categories you want diff --git a/config/e2guardian/lists/bannedsitelistwithbypass b/config/e2guardian/lists/bannedsitelistwithbypass new file mode 100644 index 0000000..9f36333 --- /dev/null +++ b/config/e2guardian/lists/bannedsitelistwithbypass @@ -0,0 +1,64 @@ +#domains in bannedwithbypass list +# User are not allowed to bypass sites in this list + +#Don't bother with the www. or the http:// + +#NOTE: Sites using just IP should be put into bannedsiteiplistwithbypass + +#You can include +#.tld so for example you can match .gov for example + +#.Include + +#You can have multiple .Includes. + +# WARNING: Old style Blanket blocks in this file will be silently ignored + + +# .Include + +#Remove the # from the following and edit as needed to use a stock +#squidGuard/urlblacklists collection. +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include + +# You will need to edit to add and remove categories you want diff --git a/config/e2guardian/lists/bannedsslsiteiplist b/config/e2guardian/lists/bannedsslsiteiplist new file mode 100644 index 0000000..bba2c2d --- /dev/null +++ b/config/e2guardian/lists/bannedsslsiteiplist @@ -0,0 +1,15 @@ +#IP sites in banned ssl list +#This list is only used for SSL (or CONNECT) requests +#Unlike the bannedsitelist it overides all other lists +# so can be used ban an https site white the http is allowed or made an exception +# +#Only list sites where you only want the https site blocked +#Use bannedsiteiplist for sites where you want both http & https blocked +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/bannedsslsitelist b/config/e2guardian/lists/bannedsslsitelist new file mode 100644 index 0000000..66baaed --- /dev/null +++ b/config/e2guardian/lists/bannedsslsitelist @@ -0,0 +1,9 @@ +#domains in banned ssl list +#Don't bother with the www. or the https:// +#This list is only used for SSL (or CONNECT) requests +# and will not have any effect when MITM is enabled. +#Unlike the bannedsitelist it overides all other lists +# so can be used ban an https site white the http is allowed or made an exception +# +#Only list sites where you only want the https site blocked +#Use bannedsitelist for sites where you want both http & https blocked diff --git a/config/e2guardian/lists/bannedurllist b/config/e2guardian/lists/bannedurllist new file mode 100644 index 0000000..6d6b563 --- /dev/null +++ b/config/e2guardian/lists/bannedurllist @@ -0,0 +1,59 @@ +#URLs in banned list +#Don't bother with the http:// or the www + +#The bannedurllist is for blocking PART of a site +#The bannedsitelist is for blocking ALL of a site + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +#An example of grey list use is when in Blanket Block (whitelist) +#mode and you want to allow some sites but still filter as normal +#on their content + +#Another example of grey list use is when you ban a site but want +#to allow part of it. + +#To include additional files in this list use this example: +#.Include + +#You can have multiple .Includes. + +#listcategory: "Banned URLs" + +#List other URLs to block: + +# members.home.net/uporn + +# The squidGuard advert domain/URL lists are now included by default. +# To work with advanced ad blocking & the logadblocks option, advert +# phrase/site/URL lists should have the string "ADs" in their listcategory. +#.Include + +#Remove the # from the following and edit as needed to use a stock +#squidGuard/urlblacklist blacklists collection. +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +#.Include +# You will need to edit to add and remove categories you want diff --git a/config/e2guardian/lists/contentregexplist b/config/e2guardian/lists/contentregexplist new file mode 100644 index 0000000..e0b55f0 --- /dev/null +++ b/config/e2guardian/lists/contentregexplist @@ -0,0 +1,93 @@ +#Content modifying Regular Expressions +# +# The format is: "extended regular expression"->"replacement straight string" +# E.g. "shit"->"censored" would replace all occurances of shit in any case. +# Far more complicated matches are possible. See other sources for examples +# of extended regular expressions. + +# These are just some examples. If you write any, for example, to +# remove popups etc, please send them to author at e2guardian.org. +# +#"" +#"=[ ]*?window\.open[ ]*?\("->"=fwo(" +#""->"" + +# Fix Firefox <= 1.0.7 DoS +# http://www.whitedust.net/speaks/1432/ +#"(("->"$1dosremovedtext" + +# Disable ActiveX objects. +#"]*application\/x-oleobject[^>]*>.*?<\/object>"->"" +#"]*(application/x-oleobject).*?>(.*?)?"->"" + +# Warn about address bar spoofing. +#"(]*href[^>]*)(\x01|\x02|\x03|%0[012])"->"$1MALICIOUS-LINK" + +# Disable all popups in JavaScript and HTML. It may cause unavoidable +# Javascript warnings or errors. Do not enable at the same time as other +# popup removing lines. +#"((\W\s*)(window|this|parent)\.)open\s*\\?\("->"$1concat(" +#"\starget\s*=\s*(['"]?)_?(blank|new)\1?"->" notarget" + +# Removes the APPLET tag which is generally used Java applets. +#"]*>.*?<\/applet>"->"" + +# Disable the BLINK and MARQUEE tags. +#"]*>"->"" + +# Warn about potential cross-site-scripting vulnerability described here: +# http://online.securityfocus.com/archive/1/298748/2002-11-02/2002-11-08/2 +#"f\("javascript:location.replace\('mk:@MSITStore:C:'\)"\);"->"alert\("This page looks like it tries to use a vulnerability described here:\n http://online.securityfocus.com/archive/1/298748/2002-11-02/2002-11-08/2"\);" + +# Removes the SCRIPT tag with JavaScript. This will likely break sites that are +# badly written and thus rely on JavaScript. This should not be used at the same +# time as the 'script' category. +#""->"
WARNING: This Server is infected with Nimda!" + +# Disable onunload (page close) popups. +#"(]*)onunload"->"$1never" +#"()"->"$1never" + +# Removes the SCRIPT tag which could include JavaScript, perlscript and vbscript. +# This will likely break sites that are badly written and thus rely on client +# side scripts. This should not be used at the same time as the 'javascript' line. +#"]*>.*?<\/script>"->"" + +# Disable Sockwave Flash objects. +#"]*macromedia[^>]*>.*?<\/object>"->"" +#"]*(application/x-shockwave-flash\|\.swf).*?>(.*?)?"->"" + +# Disable unsolicited popups. +#"([^'"]\s*)(?=\s*[^'"])"->"$1" +#"([^\w\s.]\s*)((window|this|parent)\.)?open\s*\("->"$1SWGuardianWindowOpen(" +#"([^'"]\s*)(?!\s*(\\n|'|"))"->"$1" + +# Remove 1x1 GIFs used for user tracking. +#"]*(?:(width)|(height))\s*=\s*['"]?[01](?=\D)[^>]*(?:(width)|(height))\s*=\s*['"]?[01](?=\D)[^>]*?>"->"" + +# Prevent windows from resizing and moving themselves. +#"(?:window|this|self|top)\.(?:move|resize)(?:to|by)\("->"''.concat(" diff --git a/config/e2guardian/lists/contentscanners/exceptionvirusextensionlist b/config/e2guardian/lists/contentscanners/exceptionvirusextensionlist new file mode 100644 index 0000000..e8554b8 --- /dev/null +++ b/config/e2guardian/lists/contentscanners/exceptionvirusextensionlist @@ -0,0 +1,35 @@ +#Exception Virus extension list + +#This file originally from: +#http://dgav.sourceforge.net + +# The Virus scanning code will ignore files with these extensions. + +# File extensions with executable code + + +# Files which one normally things as non-executable but +# can contain harmful macros and viruses + + +# Other files which may contain files with executable code + + +# Time/bandwidth wasting files + +.mp3 # Music file +.mpeg # Movie file +.mpg # Movie file +.avi # Movie file +.ra # Real Audio +.ram # " +.rm # " + +# Image files not to scan +.gif +.png +.tiff +.ico +# http://www.kb.cert.org/vuls/id/297462 +#.jpg +#.jpeg diff --git a/config/e2guardian/lists/contentscanners/exceptionvirusmimetypelist b/config/e2guardian/lists/contentscanners/exceptionvirusmimetypelist new file mode 100644 index 0000000..6eab11a --- /dev/null +++ b/config/e2guardian/lists/contentscanners/exceptionvirusmimetypelist @@ -0,0 +1,28 @@ +# MIME types the virus scanning code ignores. + +#This file originally from: +#http://dgav.sourceforge.net + +audio/mpeg +audio/x-mpeg +audio/x-pn-realaudio +audio/x-wav +audio/x-realaudio +audio/x-pn-realaudio +audio/vnd.rn-realaudio +application/ogg +video/mpeg +video/x-mpeg2 +video/acorn-replay +video/quicktime +video/x-msvideo +video/msvideo +video/vnd.rn-realvideo + +image/png +image/gif +image/tiff +# http://www.kb.cert.org/vuls/id/297462 +# image/jpeg + +# text/html diff --git a/config/e2guardian/lists/contentscanners/exceptionvirussitelist b/config/e2guardian/lists/contentscanners/exceptionvirussitelist new file mode 100644 index 0000000..731f118 --- /dev/null +++ b/config/e2guardian/lists/contentscanners/exceptionvirussitelist @@ -0,0 +1,12 @@ +#Sites in virus exception list will not be virus scanned +#Don't bother with the www. or +#the http:// +# +#These are specifically domains and are not URLs. +#For example 'foo.bar/porn/' is no good, you need +#to just have 'foo.bar'. +# +#You can also match IPs here too. +# + +example.com diff --git a/config/e2guardian/lists/contentscanners/exceptionvirusurllist b/config/e2guardian/lists/contentscanners/exceptionvirusurllist new file mode 100644 index 0000000..30c2c30 --- /dev/null +++ b/config/e2guardian/lists/contentscanners/exceptionvirusurllist @@ -0,0 +1,15 @@ +#URLs in exception virus list will not be virus scanned +#Don't bother with the www. or +#the http:// +# +#These are parts of sites that filtering should +#be switched off for. +# +#These should not be domains, i.e. entire sites, +#they should be a domain with a path. +# +#For example 'foo.bar' is no good, you need +#to just have 'foo.bar/porn'. +# +#Another example: +#generallybadsite.tld/partthatsok diff --git a/config/e2guardian/lists/embededreferersiteiplist b/config/e2guardian/lists/embededreferersiteiplist new file mode 100644 index 0000000..e081a53 --- /dev/null +++ b/config/e2guardian/lists/embededreferersiteiplist @@ -0,0 +1,10 @@ +# Embeded referer IP sites +# sites which may contain embeded exception referer sites in the url +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/embededreferersitelist b/config/e2guardian/lists/embededreferersitelist new file mode 100644 index 0000000..0f782be --- /dev/null +++ b/config/e2guardian/lists/embededreferersitelist @@ -0,0 +1,2 @@ +# Embeded referer sites +# sites which may contain embeded exception referer sites in the url diff --git a/config/e2guardian/lists/embededrefererurllist b/config/e2guardian/lists/embededrefererurllist new file mode 100644 index 0000000..2c67d9d --- /dev/null +++ b/config/e2guardian/lists/embededrefererurllist @@ -0,0 +1,5 @@ +# Embeded referer urls +# urls which may contain embeded exception referer sites in the url + +# e.g. to allow youtube video when embeded in a trusted referer site/urls +# www.youtube.com/get_video_info diff --git a/config/e2guardian/lists/exceptionclientlist b/config/e2guardian/lists/exceptionclientlist new file mode 100644 index 0000000..e051e41 --- /dev/null +++ b/config/e2guardian/lists/exceptionclientlist @@ -0,0 +1,16 @@ +# Doamin names of computers from which +# web access should not be filtered. +# +# These would be servers which +# need unfiltered access for +# updates. Also administrator +# workstations which need to +# download programs and check +# out blocked sites should be +# put here. +# +# To work you must +# cater for reverse DNS lookups +# on your LAN and enable the +# "reverseclientiplookups" option in +# e2guardian.conf diff --git a/config/e2guardian/lists/exceptionextensionlist b/config/e2guardian/lists/exceptionextensionlist new file mode 100644 index 0000000..fff466d --- /dev/null +++ b/config/e2guardian/lists/exceptionextensionlist @@ -0,0 +1,49 @@ +# Exception file extension list +# Use as a filter group's "exceptionextensionlist", +# to override a blanket download block. +# (blockdownloads = on) +# +# DOES NOT override content/virus scanning or site/URL bans. +# +# Default list: +# Unblock web pages & graphics + +# Text/web document types + +.css +.html +.shtml +.htm +.stm +.asp +.php +.txt +.rtx +.xml +.xsl +.cgi +.pl + +# Image types + +.bmp +.cod +.gif +.ief +.jpe +.jpeg +.jpg +.jfif +.tif +.tiff +.ras +.cmx +.ico +.pnm +.pbm +.pgm +.ppm +.rgb +.xbm +.xpm +.xwd diff --git a/config/e2guardian/lists/exceptionfilesiteiplist b/config/e2guardian/lists/exceptionfilesiteiplist new file mode 100644 index 0000000..8307b4d --- /dev/null +++ b/config/e2guardian/lists/exceptionfilesiteiplist @@ -0,0 +1,15 @@ +# Exception file site ip list +# Use this list to define ip sites from which files can be downloaded, +# overriding a blanket download block (blockdownloads = on) or the +# banned MIME type and extension lists (blockdownloads = off). +# +# DOES NOT override content/virus scanning or site/URL bans. + +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/exceptionfilesitelist b/config/e2guardian/lists/exceptionfilesitelist new file mode 100644 index 0000000..a95ba1d --- /dev/null +++ b/config/e2guardian/lists/exceptionfilesitelist @@ -0,0 +1,30 @@ +# Exception file site list +# Use this list to define sites from which files can be downloaded, +# overriding a blanket download block (blockdownloads = on) or the +# banned MIME type and extension lists (blockdownloads = off). +# +# DOES NOT override content/virus scanning or site/URL bans. + +# Don't bother with the www. or +# the http:// +# +# These are specifically domains and are not URLs. +# For example 'foo.bar/porn/' is no good, you need +# to just have 'foo.bar'. +# +# You can also match IPs here too. +# +# As of DansGuardian 2.7.3 you can now include +# .tld so for example you can match .gov for example + + +# Time limiting syntax: +# #time: +# Example: +##time: 9 0 17 0 01234 +# Remove the first # from the line above to enable this list only from +# 9am to 5pm, Monday to Friday. + +windowsupdate.microsoft.com +update.microsoft.com +download.windowsupdate.com diff --git a/config/e2guardian/lists/exceptionfileurllist b/config/e2guardian/lists/exceptionfileurllist new file mode 100644 index 0000000..9b80e9e --- /dev/null +++ b/config/e2guardian/lists/exceptionfileurllist @@ -0,0 +1,27 @@ +# Exception file URL list +# Use this list to define URLs from which files can be downloaded, +# overriding a blanket download block (blockdownloads = on) or the +# banned MIME type and extension lists (blockdownloads = off). +# +# DOES NOT override content/virus scanning or site/URL bans. + +# Don't bother with the www. or +# the http:// +# +# These are specifically domains and are not URLs. +# For example 'foo.bar/porn/' is no good, you need +# to just have 'foo.bar'. +# +# You can also match IPs here too. +# +# As of DansGuardian 2.7.3 you can now include +# .tld so for example you can match .gov for example + + +# Time limiting syntax: +# #time: +# Example: +##time: 9 0 17 0 01234 +# Remove the first # from the line above to enable this list only from +# 9am to 5pm, Monday to Friday. + diff --git a/config/e2guardian/lists/exceptioniplist b/config/e2guardian/lists/exceptioniplist new file mode 100644 index 0000000..134c0a9 --- /dev/null +++ b/config/e2guardian/lists/exceptioniplist @@ -0,0 +1,27 @@ +# IP addresses of computers from which +# web access should not be filtered. +# +# These would be servers which +# need unfiltered access for +# updates. Also administrator +# workstations which need to +# download programs and check +# out blocked sites should be +# put here. +# +# Hostnames are NOT allowed here, +# put these in exceptionclientlist and +# enable the reverseclientlookups option. +# +# This is not the IP of web servers +# you don't want to filter. + +#192.168.0.1 +#192.168.0.2 +#192.168.42.2 + +# Ranges and subnets can also be used, +# e.g. +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/exceptionmimetypelist b/config/e2guardian/lists/exceptionmimetypelist new file mode 100644 index 0000000..86f2a79 --- /dev/null +++ b/config/e2guardian/lists/exceptionmimetypelist @@ -0,0 +1,40 @@ +# Exception MIME type list +# Use as a filter group's "exceptionmimetypelist", +# to override a blanket download block. +# (blockdownloads = on) +# +# DOES NOT override content/virus scanning or site/URL bans. +# +# Default list: +# Unblock web pages & graphics + +# Text/web document types + +text/plain +text/html +text/css +text/xml +text/xsl +text/richtext + +# Image types + +image/bmp +image/cis-cod +image/gif +image/ief +image/jpeg +image/pipeg +image/png +image/tiff +image/x-cmu-raster +image/x-cmx +image/x-icon +image/x-portable-anymap +image/x-portable-bitmap +image/x-portable-graymap +image/x-portable-pixmap +image/x-rgb +image/x-xbitmap +image/x-xpixmap +image/x-xwindowdump diff --git a/config/e2guardian/lists/exceptionphraselist b/config/e2guardian/lists/exceptionphraselist new file mode 100644 index 0000000..0b160d7 --- /dev/null +++ b/config/e2guardian/lists/exceptionphraselist @@ -0,0 +1,18 @@ +# EXCEPTIONPHRASELIST - INSTRUCTIONS FOR USE +# +# If any of the phrases listed below appear in a web page +# then it will bypass the filtering and be allowed through +# eg +# < medical > +# +# +# Combinations +# Unblock the page if the following phrases are found on the same page. +# Each line is a new combination. +# eg +#,, +# +# See the bannedphraselist for more examples. + +.Include +#.Include diff --git a/config/e2guardian/lists/exceptionregexpheaderlist b/config/e2guardian/lists/exceptionregexpheaderlist new file mode 100644 index 0000000..0a1e863 --- /dev/null +++ b/config/e2guardian/lists/exceptionregexpheaderlist @@ -0,0 +1,8 @@ +#Allowed outgoing HTTP headers based on regular expressions +# +# E.g. 'User-Agent: .*MSIE' would allow several versions of Internet Explorer +# (assuming the user-agent is not being spoofed by the client) +# +# Headers are matched line-by-line, not as a single block. + +#listcategory: "Allowed Regular Expression HTTP Headers" diff --git a/config/e2guardian/lists/exceptionregexpurllist b/config/e2guardian/lists/exceptionregexpurllist new file mode 100644 index 0000000..440cacb --- /dev/null +++ b/config/e2guardian/lists/exceptionregexpurllist @@ -0,0 +1,15 @@ +#Exception URLs based on Regular Expressions +# +# E.g. 'news' would unblock news.bbc.com etc + +# Example +#news + +# Prevent content scanning of CSS and/or JavaScript files +#^[^?]*\.css($|\?) +#^[^?]*\.jsp?($|\?) + +# Allow Facebook plugin applications like +# http://apps.facebook.com/neighborhoods/Setup.aspx and others. +mock_ajax_proxy.php + diff --git a/config/e2guardian/lists/exceptionregexpuseragentlist b/config/e2guardian/lists/exceptionregexpuseragentlist new file mode 100644 index 0000000..9c601de --- /dev/null +++ b/config/e2guardian/lists/exceptionregexpuseragentlist @@ -0,0 +1,9 @@ +#Exception User-Agent based on regular expressions +# +# E.g. ' .*MSIE' would allow several versions of Internet Explorer +# (assuming the user-agent is not being spoofed by the client) +# +# Usefull for allowing 'apps' to work + +#listcategory: "user-agent" + diff --git a/config/e2guardian/lists/exceptionsiteiplist b/config/e2guardian/lists/exceptionsiteiplist new file mode 100644 index 0000000..00b1a22 --- /dev/null +++ b/config/e2guardian/lists/exceptionsiteiplist @@ -0,0 +1,9 @@ +#IP Sites in exception list +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/exceptionsitelist b/config/e2guardian/lists/exceptionsitelist new file mode 100644 index 0000000..776b501 --- /dev/null +++ b/config/e2guardian/lists/exceptionsitelist @@ -0,0 +1,24 @@ +#Sites in exception list +#Don't bother with the www. or +#the http:// +# +#These are specifically domains and are not URLs. +#For example 'foo.bar/porn/' is no good, you need +#to just have 'foo.bar'. +# +# IP must be put in exceptionsiteiplist +# +#.tld so for example you can match .gov for example + + +# Time limiting syntax: +# #time: +# Example: +##time: 9 0 17 0 01234 +# Remove the first # from the line above to enable this list only from +# 9am to 5pm, Monday to Friday. + +# NOTE: From v5 Blanket exceptions are now implimented using Storyboarding +# WARNING: Old style Blanket blocks in this file will be silently ignored + +windowsupdate.microsoft.com diff --git a/config/e2guardian/lists/exceptionurllist b/config/e2guardian/lists/exceptionurllist new file mode 100644 index 0000000..a90150d --- /dev/null +++ b/config/e2guardian/lists/exceptionurllist @@ -0,0 +1,15 @@ +#URLs in exception list +#Don't bother with the www. or +#the http:// +# +#These are parts of sites that filtering should +#be switched off for. +# +#These should not be domains, i.e. entire sites, +#they should be a domain with a path. +# +#For example 'foo.bar' is no good, you need +#to just have 'foo.bar/porn/'. +# +#Another example: +#generallybadsite.tld/partthatsok/ diff --git a/config/e2guardian/lists/exceptionvirusextensionlist b/config/e2guardian/lists/exceptionvirusextensionlist new file mode 100644 index 0000000..d55c4b2 --- /dev/null +++ b/config/e2guardian/lists/exceptionvirusextensionlist @@ -0,0 +1,45 @@ +# Exception file extension list +# Use as a filter group's "exceptionvirusextensionlist", +# +# Default list: +# Unblock web pages & graphics + +# Text/web document types + +.css +.html +.shtml +.htm +.stm +.asp +.php +.txt +.rtx +.xml +.xsl +.cgi +.pl + +# Image types + +.bmp +.cod +.gif +.ief +.jpe +.jpeg +.jpg +.jfif +.tif +.tiff +.ras +.cmx +.ico +.pnm +.pbm +.pgm +.ppm +.rgb +.xbm +.xpm +.xwd diff --git a/config/e2guardian/lists/exceptionvirussiteiplist b/config/e2guardian/lists/exceptionvirussiteiplist new file mode 100644 index 0000000..018d541 --- /dev/null +++ b/config/e2guardian/lists/exceptionvirussiteiplist @@ -0,0 +1,12 @@ +# IP sites in exceptionvirussiteiplist + +#The exceptionvirussiteiplist is for allowing ALL of an IP site + +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/filtergroupslist b/config/e2guardian/lists/filtergroupslist new file mode 100644 index 0000000..483383c --- /dev/null +++ b/config/e2guardian/lists/filtergroupslist @@ -0,0 +1,9 @@ +# Filter Groups List file for DansGuardian +# +# Format is =filter<1-9> where 1-9 are the groups +# +# Eg: +# daniel=filter2 +# +# This file is only of use if you have more than 1 filter group +# diff --git a/config/e2guardian/lists/greysiteiplist b/config/e2guardian/lists/greysiteiplist new file mode 100644 index 0000000..8bcf54f --- /dev/null +++ b/config/e2guardian/lists/greysiteiplist @@ -0,0 +1,16 @@ +# IP site in grey list + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/greysitelist b/config/e2guardian/lists/greysitelist new file mode 100644 index 0000000..5e7e465 --- /dev/null +++ b/config/e2guardian/lists/greysitelist @@ -0,0 +1,59 @@ +#domains in grey list +#Don't bother with the www. or the http:// + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +#An example of grey list use is when in Blanket Block (whitelist) +#mode and you want to allow some sites but still filter as normal +#on their content + +#Another example of grey list use is when you ban a site but want +#to allow part of it. + +#The greyurllist is for partly unblocking PART of a site +#The greysitelist is for partly unblocking ALL of a site + +#As of DansGuardian 2.7.3 you can now include +#.tld so for example you can match .gov for example + +#To include additional files in this list use this example: +#.Include + +#You can have multiple .Includes. + +# Time limiting syntax: +# #time: +# Example: +##time: 9 0 17 0 01234 +# Remove the first # from the line above to enable this list only from +# 9am to 5pm, Monday to Friday. + + +# Blanket match. To greylist all sites except those in the +# exceptionsitelist and greysitelist files, remove +# the # from the next line to leave only a '**': +#** + +# Blanket SSL/CONNECT match. To greylist all SSL +# and CONNECT tunnels except to addresses in the +# exceptionsitelist and greysitelist files, remove +# the # from the next line to leave only a '**s': +#**s + +# Blanket IP match. To greylist all sites specified only as an IP, +# remove the # from the next line to leave only a '*ip': +#*ip + +# Blanket SSL/CONNECT IP match. To greylist all SSL and CONNECT +# tunnels to sites specified only as an IP, +# remove the # from the next line to leave only a '*ips': +#*ips + + +#List other sites to greylist: + +#www.bbc.co.uk diff --git a/config/e2guardian/lists/greysslsiteiplist b/config/e2guardian/lists/greysslsiteiplist new file mode 100644 index 0000000..c6934d6 --- /dev/null +++ b/config/e2guardian/lists/greysslsiteiplist @@ -0,0 +1,10 @@ +# IP sites in SSL grey list + +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/greysslsitelist b/config/e2guardian/lists/greysslsitelist new file mode 100644 index 0000000..b0726b8 --- /dev/null +++ b/config/e2guardian/lists/greysslsitelist @@ -0,0 +1,4 @@ +#domains in SSL grey list +#Don't bother with the www. or the https:// + +#This 'grey' lists override the 'banned' lists for SSL only. diff --git a/config/e2guardian/lists/greyurllist b/config/e2guardian/lists/greyurllist new file mode 100644 index 0000000..99fee88 --- /dev/null +++ b/config/e2guardian/lists/greyurllist @@ -0,0 +1,27 @@ +#URLs in grey list +#Don't bother with the http:// or the www + +#The greyurllist is for partly unblocking PART of a site +#The greysitelist is for partly unblocking ALL of a site + +#The 'grey' lists override the 'banned' lists. +#The 'exception' lists override the 'banned' lists also. +#The difference is that the 'exception' lists completely switch +#off *all* other filtering for the match. 'grey' lists only +#stop the URL filtering and allow the normal filtering to work. + +#An example of grey list use is when in Blanket Block (whitelist) +#mode and you want to allow some sites but still filter as normal +#on their content + +#Another example of grey list use is when you ban a site but want +#to allow part of it. + +#To include additional files in this list use this example: +#.Include + +#You can have multiple .Includes. + +#List other URLs to block: + +#members.home.net/nice diff --git a/config/e2guardian/lists/headerregexplist b/config/e2guardian/lists/headerregexplist new file mode 100644 index 0000000..95467dc --- /dev/null +++ b/config/e2guardian/lists/headerregexplist @@ -0,0 +1,11 @@ +# Outgoing HTTP header modifying Regular Expressions +# +# The format is: "extended regular expression"->"replacement straight string" +# E.g. "shit"->"censored" would replace all occurances of shit in any case. +# Far more complicated matches are possible. See other sources for examples +# of extended regular expressions. +# +# Headers are run through replacements line-by-line, not as a single block. + +# Windows Live Search cookie replacement - force filtering on +#"cookie:(.*)&ADLT=(OFF|DEMOTE)"->"Cookie:$1&ADLT=STRICT" diff --git a/config/e2guardian/lists/localbannedsearchlist b/config/e2guardian/lists/localbannedsearchlist new file mode 100644 index 0000000..51f25e3 --- /dev/null +++ b/config/e2guardian/lists/localbannedsearchlist @@ -0,0 +1,14 @@ +#Local Banned Search Words +# +#Words must be in alphabetic order within a single line +# and separated by a '+' sign. +#All combinations of the words will be blocked +# e.g. girl+naughty +# will block naughty+girl as well as girl+naughty + + +#.Include +#.Include +#.Include +#.Include +#.Include diff --git a/config/e2guardian/lists/localbannedsiteiplist b/config/e2guardian/lists/localbannedsiteiplist new file mode 100644 index 0000000..e462d29 --- /dev/null +++ b/config/e2guardian/lists/localbannedsiteiplist @@ -0,0 +1,10 @@ +# IP sites in local banned list + +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/localbannedsitelist b/config/e2guardian/lists/localbannedsitelist new file mode 100644 index 0000000..fb6c766 --- /dev/null +++ b/config/e2guardian/lists/localbannedsitelist @@ -0,0 +1,6 @@ +#domains in local banned list +#.Include +#.Include +#.Include +#.Include +#.Include diff --git a/config/e2guardian/lists/localbannedsslsiteiplist b/config/e2guardian/lists/localbannedsslsiteiplist new file mode 100644 index 0000000..050c4f4 --- /dev/null +++ b/config/e2guardian/lists/localbannedsslsiteiplist @@ -0,0 +1,12 @@ +# IP sites in local banned ssl list +#This list is only used for SSL (or CONNECT) requests +#Unlike the bannedsitelist it overides all other lists + +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/localbannedsslsitelist b/config/e2guardian/lists/localbannedsslsitelist new file mode 100644 index 0000000..f26c70c --- /dev/null +++ b/config/e2guardian/lists/localbannedsslsitelist @@ -0,0 +1,5 @@ +#domains in banned ssl list +#Don't bother with the www. or the https:// +#This list is only used for SSL (or CONNECT) requests +# and has no effect when MITM is enabled +#Unlike the bannedsitelist it overides all other lists diff --git a/config/e2guardian/lists/localbannedurllist b/config/e2guardian/lists/localbannedurllist new file mode 100644 index 0000000..8ec7619 --- /dev/null +++ b/config/e2guardian/lists/localbannedurllist @@ -0,0 +1 @@ +#URLs in local banned list diff --git a/config/e2guardian/lists/localexceptionsiteiplist b/config/e2guardian/lists/localexceptionsiteiplist new file mode 100644 index 0000000..0c717be --- /dev/null +++ b/config/e2guardian/lists/localexceptionsiteiplist @@ -0,0 +1,10 @@ +#IP Sites in local exception list + +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/localexceptionsitelist b/config/e2guardian/lists/localexceptionsitelist new file mode 100644 index 0000000..8d0067d --- /dev/null +++ b/config/e2guardian/lists/localexceptionsitelist @@ -0,0 +1 @@ +#Sites in local exception list diff --git a/config/e2guardian/lists/localexceptionurllist b/config/e2guardian/lists/localexceptionurllist new file mode 100644 index 0000000..a031365 --- /dev/null +++ b/config/e2guardian/lists/localexceptionurllist @@ -0,0 +1 @@ +#URLs in local exception list diff --git a/config/e2guardian/lists/localgreysiteiplist b/config/e2guardian/lists/localgreysiteiplist new file mode 100644 index 0000000..6ba4dac --- /dev/null +++ b/config/e2guardian/lists/localgreysiteiplist @@ -0,0 +1,10 @@ +# IP sites in local grey list + +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/localgreysitelist b/config/e2guardian/lists/localgreysitelist new file mode 100644 index 0000000..af02151 --- /dev/null +++ b/config/e2guardian/lists/localgreysitelist @@ -0,0 +1 @@ +#domains in local grey list diff --git a/config/e2guardian/lists/localgreysslsiteiplist b/config/e2guardian/lists/localgreysslsiteiplist new file mode 100644 index 0000000..3495c9f --- /dev/null +++ b/config/e2guardian/lists/localgreysslsiteiplist @@ -0,0 +1,10 @@ +# IP sites in local SSL grey list + +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/localgreysslsitelist b/config/e2guardian/lists/localgreysslsitelist new file mode 100644 index 0000000..da2e9e0 --- /dev/null +++ b/config/e2guardian/lists/localgreysslsitelist @@ -0,0 +1,6 @@ +#domains in SSL grey list +#Don't bother with the www. or the https:// + +#This 'grey' lists overrides the main site 'exception' lists for SSL allowing MITM to be enabled in order to check https full url. + +# Use to overcome issue where ssl url is in local blocked url list but is overriden by main site exception list forcing tunnel mode and so url never checked. diff --git a/config/e2guardian/lists/localgreyurllist b/config/e2guardian/lists/localgreyurllist new file mode 100644 index 0000000..1eb8ccc --- /dev/null +++ b/config/e2guardian/lists/localgreyurllist @@ -0,0 +1 @@ +#URLs in local grey list diff --git a/config/e2guardian/lists/logregexpurllist b/config/e2guardian/lists/logregexpurllist new file mode 100644 index 0000000..2698766 --- /dev/null +++ b/config/e2guardian/lists/logregexpurllist @@ -0,0 +1,12 @@ +# Log regular expression URL list +# +# This acts as a list of URL regexes which, if matched, will have their category +# recorded but no specific filtering action taken. It is only really useful +# in conjunction with log analysers, to perform meaningful categorisation and +# analysis upon non-blocked/exception requests, and so is disabled and empty +# by default. +# +# If you would like to enable this feature, uncomment "logregexpurllist" in your +# e2guardianf*.conf file(s), and place .Include<> statements here for the +# categories you would like to log. Included list files must contain a +# "#listcategory" directive. diff --git a/config/e2guardian/lists/logsiteiplist b/config/e2guardian/lists/logsiteiplist new file mode 100644 index 0000000..2877709 --- /dev/null +++ b/config/e2guardian/lists/logsiteiplist @@ -0,0 +1,21 @@ +# Log IP site list +# +# This acts as a list of IP sites which, when found, will have their category +# recorded but no specific filtering action taken. It is only really useful +# in conjunction with log analysers, to perform meaningful categorisation and +# analysis upon non-blocked/exception requests, and so is disabled and empty +# by default. +# +# If you would like to enable this feature, uncomment "logsitelist" in your +# e2guardianf*.conf file(s), and place .Include<> statements here for the +# categories you would like to log. Included list files must contain a +# "#listcategory" directive. + +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/logsitelist b/config/e2guardian/lists/logsitelist new file mode 100644 index 0000000..d2a6cf8 --- /dev/null +++ b/config/e2guardian/lists/logsitelist @@ -0,0 +1,12 @@ +# Log site list +# +# This acts as a list of domains which, when found, will have their category +# recorded but no specific filtering action taken. It is only really useful +# in conjunction with log analysers, to perform meaningful categorisation and +# analysis upon non-blocked/exception requests, and so is disabled and empty +# by default. +# +# If you would like to enable this feature, uncomment "logsitelist" in your +# e2guardianf*.conf file(s), and place .Include<> statements here for the +# categories you would like to log. Included list files must contain a +# "#listcategory" directive. diff --git a/config/e2guardian/lists/logurllist b/config/e2guardian/lists/logurllist new file mode 100644 index 0000000..cd5a0e2 --- /dev/null +++ b/config/e2guardian/lists/logurllist @@ -0,0 +1,12 @@ +# Log URL list +# +# This acts as a list of URLs which, when found, will have their category +# recorded but no specific filtering action taken. It is only really useful +# in conjunction with log analysers, to perform meaningful categorisation and +# analysis upon non-blocked/exception requests, and so is disabled and empty +# by default. +# +# If you would like to enable this feature, uncomment "logurllist" in your +# e2guardianf*.conf file(s), and place .Include<> statements here for the +# categories you would like to log. Included list files must contain a +# "#listcategory" directive. diff --git a/config/e2guardian/lists/nocheckcertsiteiplist b/config/e2guardian/lists/nocheckcertsiteiplist new file mode 100644 index 0000000..158c3f6 --- /dev/null +++ b/config/e2guardian/lists/nocheckcertsiteiplist @@ -0,0 +1,17 @@ +# IP sites which are NOT to have their certificates checked (when in MITM mode) +# +# Do not check ssl certificates for IP sites listed +# +# Can be used to allow sites with self-signed or invalid certificates +# or to reduced CPU load by not checking certs on heavily used sites (e.g. Google, Bing) +# Use with caution! +# Ignored if mitmcheckcert is 'off' + +# IP site addresses +# +# Single IPs, ranges and subnets can be used, +# e.g. +# 192.168.0.1 +# 10.0.0.1-10.0.0.3 +# 10.0.0.0/24 +# diff --git a/config/e2guardian/lists/nocheckcertsitelist b/config/e2guardian/lists/nocheckcertsitelist new file mode 100644 index 0000000..b54735f --- /dev/null +++ b/config/e2guardian/lists/nocheckcertsitelist @@ -0,0 +1,9 @@ +# domains which are NOT to have their certificates checked (when in MITM mode) +# +# Do not check ssl certificates for sites/domains listed +# +# Can be used to allow sites with self-signed or invalid certificates +# or to reduced CPU load by not checking certs on heavily used sites (e.g. Google, Bing) +# Use with caution! +# Ignored if mitmcheckcert is 'off' +#Don't bother with the https:// diff --git a/config/e2guardian/lists/phraselists/badwords/weighted_dutch b/config/e2guardian/lists/phraselists/badwords/weighted_dutch new file mode 100644 index 0000000..d92f3dd --- /dev/null +++ b/config/e2guardian/lists/phraselists/badwords/weighted_dutch @@ -0,0 +1,36 @@ +# +# Dutch Swear Words Weighted Phrases +# Taken from swif.zip from dansguardian website +# + +#listcategory: "Bad words (Dutch)" + +< apenaaier ><75> #monkey-fucker +< bruinweker ><50> #literally: brown-creeper = fagget +< droogkloot ><25> #literally: dry-nut (as in: testicle) +< flikker ><50> #fagget/sissy +< hoer ><25> #hooker +< hoerenjong ><65> #son-of-bitch +< hondelul ><50> #cock-of-a-dog (commonly used, also by kids) +< kak ><10> #shit +< klootzak ><50> #ass-hole +< kut ><5> #cunt/pussy +< kutwijf ><90> #fucking bitch +< lul ><50> #dick/cock +< moederneuker ><75> #motherfucker +< nauwe gaatje ><50> #literally: ass-hole +< paardenlul ><50> #horse-cock +< pik omhoog ><80> #boner +< reetneuker ><70> #literally: ass-fucker +< rukker ><50> #jerk-off +< schijt ><50> #shit +< schijtlul ><50> #literally: shit-cock; commonly used for a chicken-shit +< slet ><50> #slut +< smerige kankerhoer ><75> #fucking whore (bad..) +< spast ><50> #spastic +< stront ><25> #shit +< sufkut ><75> #literally; sleepy-cunt +< sukkel ><20> #dumbo +< vuile kankerlijer ><75> #fucking ass-hole (bad one) +< zakkewasser ><42> #ass-hole + diff --git a/config/e2guardian/lists/phraselists/badwords/weighted_french b/config/e2guardian/lists/phraselists/badwords/weighted_french new file mode 100644 index 0000000..8ab0b79 --- /dev/null +++ b/config/e2guardian/lists/phraselists/badwords/weighted_french @@ -0,0 +1,43 @@ +# +# French Swear Words Weighted Phrases +# + +#listcategory: "Bad words (French)" + +< merde ><50> +< tu m'emmerdes ><80> +< tu me fais chier ><50> # you are pissing me off +< retourne enculer ><80> # go and fuck yourself +< encul ><70> +< salope ><60> +< conasse ><40> +< poufiasse ><40> +< ordure ><20> # mess / rubbish +< chier ><50> # to shit +< faire foutre ><80> +< fils de pute ><90> # son of a whore +< branler ><50> +< bique ><50> # cock +< trou du cul ><80> # literally hole of arse +< le con ><60> +< la chatte ><90> # pussy +< baiser ><60> +< conneries ><30> +< fait moi jouir ><80> # make me cum +< tte moi le dard ><80> +< tte moi le noeud ><80> +< pd ><40> +< tantouze ><50> +< couilles ><60> # balls +< putain ><60> # whore +< pute ><60> +< cul ><40> +< pauvre con ><60> # poor bastard +< pisser dans ><50> +< fils de pute ><90> +< salope ><60> +< Va te branler ><70> +< Va te tripoter ><80> +< Va te faire enculer ><90> +< choleque de merde ><60> + diff --git a/config/e2guardian/lists/phraselists/badwords/weighted_german b/config/e2guardian/lists/phraselists/badwords/weighted_german new file mode 100644 index 0000000..89d0af7 --- /dev/null +++ b/config/e2guardian/lists/phraselists/badwords/weighted_german @@ -0,0 +1,34 @@ +# +# German Swear Words Weighted Phrases +# Taken from swif.zip from dansguardian website +# + +#listcategory: "Bad words (German)" + +< arschloch ><20> +< scheiss ><20> +< scheisse ><20> +< fotze ><20> +< schwuchtl ><20> +< lesbe ><20> +< mutterficker ><20> +< hurensohn ><20> +< hure ><20> +< arschgesicht ><20> +< fick ><20> +< scheissdreck ><20> +< arschficker ><20> +< arsch ><20> +< scheisskopf ><20> +< schnoodle noodle ><20> +< verpiss dich ><20> +< wichser ><20> +< arschgeige ><20> +< hosenscheisser ><20> +< schwanz ><20> +< affenschwanz ><20> +< schlampe><20> # - tramp or slut +< schweinebacke><20> # - double crossing so and so +< dumpfbacke><20> # - idiot (mainly for female) +< arschkriecher><20> # - person who kisses bosses arse + diff --git a/config/e2guardian/lists/phraselists/badwords/weighted_portuguese b/config/e2guardian/lists/phraselists/badwords/weighted_portuguese new file mode 100644 index 0000000..261c5a2 --- /dev/null +++ b/config/e2guardian/lists/phraselists/badwords/weighted_portuguese @@ -0,0 +1,16 @@ +# +# Brazilian Portuguese Swear Words Weighted Phrases +# + +#listcategory: "Bad words (Portuguese)" + +<80> +<10> +<10> +<10> +<10> +<5> +<10> +<10> +< viad><15> + diff --git a/config/e2guardian/lists/phraselists/badwords/weighted_spanish b/config/e2guardian/lists/phraselists/badwords/weighted_spanish new file mode 100644 index 0000000..c91a45c --- /dev/null +++ b/config/e2guardian/lists/phraselists/badwords/weighted_spanish @@ -0,0 +1,67 @@ +# +# Spanish Swear Words Weighted Phrases +# Taken from swif.zip from dansguardian website +# + +#listcategory: "Bad words (Spanish)" + +< marica ><20> +< maricn ><20> +< mariconazo ><20> +< mariquita ><20> +< chapero ><20> +< bastardo ><20> +< cabron ><20> +< polla ><20> +< nabo ><20> +< rabo ><20> +< verga ><20> +< cipote ><20> +< gilipollas ><20> +< tontopollas ><20> +< pichacorta ><20> +< cojones ><20> +< pelotas ><20> +< huevos ><20> +< cojonazos ><20> +< coo ><20> +< chocho ><20> +< raja ><20> +< chichi ><20> +< pelos de los huevos ><20> +< pelos de los coo ><20> +< mierda ><20> +< cagar ><20> +< jiar ><20> +< chupame la polla ><20> +< chupamela ><20> +< chupar ><20> +< puta ><20> +< zorra ><20> +< guarra ><20> +< follar ><20> +< jode ><20> +< chingar ><20> +< me cago en ti ><20> +< que te jodan ><20> +< culo ><20> +< cabron ><20> +< calientapollas ><20> + +#South American spanish: +< mariposa ><20> +< joto ><20> +< pinga ><20> +< chilito ><20> +< panocha ><20> +< chimba ><20> +< chichis ><20> +< Chinga ><20> +< pendejo ><20> +< pendeja ><20> +< cago en tu leche ><20> +< hazte cojer ><20> +< pinche cabron ><20> +< concha ><20> +< coger ><20> + diff --git a/config/e2guardian/lists/phraselists/chat/weighted b/config/e2guardian/lists/phraselists/chat/weighted new file mode 100644 index 0000000..11dec57 --- /dev/null +++ b/config/e2guardian/lists/phraselists/chat/weighted @@ -0,0 +1,33 @@ +#listcategory: "Chat" + +< javachat ><50> +< webbchat ><50> +< webbtjatt ><50> +< webchat ><50> +< chatkamer ><50> +< chatroom ><50> +< irc ><50> +< ircd ><50> +< javachat ><50> +< javatjatt ><50> + +#Web-based Instant Messaging +< gaim ><30> +< icq ><30> +<30> +<30> +< wbmsn ><30> +<30> +< kiwibox ><30> +< webmessenger ><30> +< e-messenger ><30> +< web2messenger ><30> +< onlinemessenger ><30> +< msnger><30> +< jpager><30> +< easymessage ><30> +<30> +< instant messenger ><10> +,,< msn ><50> +,<30> + diff --git a/config/e2guardian/lists/phraselists/chat/weighted_italian b/config/e2guardian/lists/phraselists/chat/weighted_italian new file mode 100644 index 0000000..e590314 --- /dev/null +++ b/config/e2guardian/lists/phraselists/chat/weighted_italian @@ -0,0 +1,26 @@ +#listcategory: "Chat (Italian)" + +< scegliere la ragazza><30> +< scegliere le ragazze><30> +<30> +<30> +,< ragazza >,< preferita><30> +,< ragazza >,< che preferisci><30> +< scegliere >,< ragazza >,< che preferisci><30> +< scegliere >,< ragazza >,< preferita><30> +< conoscere >,< ragazz><10> +< incontrare>,< ragazz><10> +< dal vivo><30> +< incontri eccitanti><30> +< incontrare persone><10> +< interagire con><10> +< chat><10> +<10> +<10> +< spregiudicat><10> +< eros ><10> +< video-chat><20> +< scambio coppie><30> +< videocamer>,< nascost><10> +< telecamer>,< nascost><10> + diff --git a/config/e2guardian/lists/phraselists/conspiracy/weighted b/config/e2guardian/lists/phraselists/conspiracy/weighted new file mode 100644 index 0000000..7ccebc5 --- /dev/null +++ b/config/e2guardian/lists/phraselists/conspiracy/weighted @@ -0,0 +1,61 @@ +# Originally created by David Burkholder +# +# +# listcategory: "conspiracy" +# + + +<30> +<40> +<40> +<40> +<40> +<25> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<20> +<40> +<40> +<40> +<40> +<40> +<55> + + +#New world order +<40> +<40> +<40> +<40> +<40> +<75> +<75> + +#Ufo +< ufo><40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> +<40> \ No newline at end of file diff --git a/config/e2guardian/lists/phraselists/domainsforsale/weighted b/config/e2guardian/lists/phraselists/domainsforsale/weighted new file mode 100644 index 0000000..471230e --- /dev/null +++ b/config/e2guardian/lists/phraselists/domainsforsale/weighted @@ -0,0 +1,31 @@ +# +# Phraselists to block parked domains - domains that are for sale +# Originally created by Fernand Jonker +# +# If you use this list please send feedback to phrasemaster@dansguardian.org +# Waiting for feedback and input +# + +#listcategory: "Domain for Sale" + +,<150> +<50> +<50> +<50> +<50> +<50> +<50> +<50> +<50> +<50> +< sedo><50> +<50> +<150> +,<150> + +#Companies + +<100> +<50> +<50> +<50> \ No newline at end of file diff --git a/config/e2guardian/lists/phraselists/drugadvocacy/weighted b/config/e2guardian/lists/phraselists/drugadvocacy/weighted new file mode 100644 index 0000000..b5b169a --- /dev/null +++ b/config/e2guardian/lists/phraselists/drugadvocacy/weighted @@ -0,0 +1,12 @@ +#listcategory: "Drug Advocacy" + +< american cannabis society ><40> +< drogenpolitik ><60> +< ganga ><50> +< ganja ><50> +< marihuanabeleid ><60> +< marijuanalagstiftning ><60> +< marijuanalovgivning ><60> +< medicinal marijuana ><40> +< spliff ><60> + diff --git a/config/e2guardian/lists/phraselists/forums/weighted b/config/e2guardian/lists/phraselists/forums/weighted new file mode 100644 index 0000000..7682a29 --- /dev/null +++ b/config/e2guardian/lists/phraselists/forums/weighted @@ -0,0 +1,66 @@ +# +# Phraselists to block forum sites +# Originally Created by Fernand Jonker +# +#listcategory: "Forums" + +#General +< Member>,< register><20> +< Search>,< faq><20> +< Login>,< home><20> +< Moderator><20> +<20> +<20> +<20> +<20> +<20> +<20> +,,<20> +<20> +<20> +<20> +<20> +<20> +<20> +<20> +<20> +<20> + +#PHPBB +<100> + +#UBB +<100> + +#Web Wiz Forums +<100> + +#vBulletin +<100> +<100> + +#Simple Machines +<100> +< SMF >,<100> + +#PostNuke +<100> + +#Snitz +<100> + +#Invision Power Board +<100> +<20> + +#FUDForum +<100> + +#Groupee Community +<100> + +#Mailgust +<100> + +#php Bulletin Board +<40> diff --git a/config/e2guardian/lists/phraselists/gambling/banned b/config/e2guardian/lists/phraselists/gambling/banned new file mode 100644 index 0000000..03bab10 --- /dev/null +++ b/config/e2guardian/lists/phraselists/gambling/banned @@ -0,0 +1,13 @@ +#listcategory: "Gambling" + + + + +< loto > +< lotto > +< video poker > + + + + + diff --git a/config/e2guardian/lists/phraselists/gambling/banned_portuguese b/config/e2guardian/lists/phraselists/gambling/banned_portuguese new file mode 100644 index 0000000..88a31d5 --- /dev/null +++ b/config/e2guardian/lists/phraselists/gambling/banned_portuguese @@ -0,0 +1,10 @@ +#listcategory: "Gambling (Portuguese)" + +< cassino virtual > +< cassinos virtuais > +< loteria virtual > +< loterias virtuais > +< lotomania virtual > +< megasena virtual > +< vegas virtual > + diff --git a/config/e2guardian/lists/phraselists/gambling/weighted b/config/e2guardian/lists/phraselists/gambling/weighted new file mode 100644 index 0000000..6ede17b --- /dev/null +++ b/config/e2guardian/lists/phraselists/gambling/weighted @@ -0,0 +1,45 @@ +# +# Phraselists to block gambling sites +# + +#listcategory: "Gambling" + +< bet >,<40> +< betting ><30> +< blackjack ><30> +< casino ><30> +< casinon ><30> +< casinos ><30> +< gamblers ><30> +< gambling ><30> +< jackpot ><20> +< jackpott ><20> +< kasino><30> +< kasinon ><30> +< loto ><30> +< lotteri ><30> +< lotterier ><30> +< lotteries ><20> +< lottery ><30> +< lotto ><30> +< prispott ><20> +< roulette ><30> +< snake eyes ><20> +< snakeeyes ><20> +< sports book ><10> +< sportsbook ><10> +< totalisator ><30> +< video poker ><30> +< wagering ><50> +< wager ><30> +<10> +<30> +<30> +,<50> +,<50> +,<50> +<30> +<30> +<30> +<30> + diff --git a/config/e2guardian/lists/phraselists/gambling/weighted_portuguese b/config/e2guardian/lists/phraselists/gambling/weighted_portuguese new file mode 100644 index 0000000..87772fd --- /dev/null +++ b/config/e2guardian/lists/phraselists/gambling/weighted_portuguese @@ -0,0 +1,12 @@ +#listcategory: "Gambling (Portuguese)" + +< aposta ><10> +< apostadores ><10> +< apostando ><10> +< casino><20> +< cassino><20> +< jogo de vinte e um ><10> +< jogos de vinte e um ><10> +< jogo de azar><10> +< jogos de azar><10> + diff --git a/config/e2guardian/lists/phraselists/games/weighted b/config/e2guardian/lists/phraselists/games/weighted new file mode 100644 index 0000000..2f24d88 --- /dev/null +++ b/config/e2guardian/lists/phraselists/games/weighted @@ -0,0 +1,64 @@ +# +# Phraselists to block gaming websites +# Originally created by Fernand Jonker +# +# This list is seriously ALPHA - it blocks many pages, but may overblock. +# This list has NOT been tested in a production environment! +# If you use this list please send feedback to phrasemaster@dansguardian.org +# Waiting for input :-) +# + +#listcategory: "Games" + +< games><10> +< puzzles><10> +<40> +<30> +<30> +<20> + +#game names +<30> +<30> +<30> +<30> +<30> +<30> +<30> +<30> +<10> +<30> +<30> +<30> +<30> +<30> + +<30> +<30> +<30> +<30> +<30> + +#game companies +<30> +<10> +<10> +<10> +<20> +,< psp ><20> +<20> +<20> +<20> +<20> +<20> + +#general gaming +,<30> +#,<30> +,< simulation><30> +,< strategy><30> +,< adventure><30> +#,< action><30> +,< rpg><30> +,< sport><30> + diff --git a/config/e2guardian/lists/phraselists/goodphrases/exception b/config/e2guardian/lists/phraselists/goodphrases/exception new file mode 100644 index 0000000..c517fa6 --- /dev/null +++ b/config/e2guardian/lists/phraselists/goodphrases/exception @@ -0,0 +1,6 @@ + +#< ringtone > +# + + + diff --git a/config/e2guardian/lists/phraselists/goodphrases/exception_email b/config/e2guardian/lists/phraselists/goodphrases/exception_email new file mode 100644 index 0000000..a8763c1 --- /dev/null +++ b/config/e2guardian/lists/phraselists/goodphrases/exception_email @@ -0,0 +1,11 @@ + + + + + +, + + + + + diff --git a/config/e2guardian/lists/phraselists/goodphrases/weighted_general b/config/e2guardian/lists/phraselists/goodphrases/weighted_general new file mode 100644 index 0000000..12d98bb --- /dev/null +++ b/config/e2guardian/lists/phraselists/goodphrases/weighted_general @@ -0,0 +1,425 @@ +# +#Generally Good Phrases to balance out bad phrases tagged on a page. +# + +#Following Added to exempt DansGuardian blocking sites +,<-200> +<-20> +<-20> +<-20> +<-20> +< logrotat>,<-200> +< weightedphraselist><-50> +< weightedphrasemode>,<-200> +< configuring>,<-200> +< building><-20> +< apache>,<-20> +< binary><-20> +< naughtynesslimit><-50> +# + +< smoothwall ><-20> +<-20> +<-50> +< dns ><-20> +< wikipedia ><-30> +<-50> +<-50> +< vpn ><-20> +<-50> +<-50> +<-10> +<-10> +<-10> +<-50> +<-10> +<-10> +<-10> +<-10> +<-20> +<-20> +<-20> +<-30> +<-10> +<-50> +<-20> +,,<-50> +,,<-50> +,,<-50> +,,<-50> +,<-50> +,,<-50> +<-50> +,<-30> +,<-30> +,<-30> +<-20> +,,<-50> +< amd ><-20> +<-50> +<-50> +<-100> +<-20> +<-50> +<-50> +<-20> +<-10> +<-50> +
,<-30> +
,<-30> +
,<-30> +
,<-30> +
,<-30> +
,<-30> +
,<-30> +
,<-30> +
,<-30> +<-20> +<-30> +<-50> +,<-30> +,<-30> +,<-30> +<-10> +<-10> +<-10> +<-50> +<-20> +,,<-20> +<-20> +<-20> +<-20> +<-10> +<-20> +<-10> +<-30> +<-10> +<-50> +<-20> +<-40> +<-10> +<-20> +<-20> +<-50> +<-50> +,,<-50> +,<-30> +<-50> +<-10> +<-30> +,<-30> +,<-30> +,<-30> +,<-30> +,<-30> +,<-30> +,<-30> +<-20> +<-10> +<-10> +<-20> +<-10> +<-20> +<-50> +<-40> +<-10> +<-40> +<-40> +<-20> +<-30> +<-40> +<-60> +<-10> +<-10> +<-30> +<-20> +<-20> +<-20> +<-20> +<-10> +<-10> +<-1000> +<-10> +<-10> +<-30> +<-20> +<-30> +<-50> +<-50> +<-10> +<-10> +<-10> +<-10> +<-30> +<-30> +,<-50> +<-50> +,< vinyl><-50> +<-50> +<-20> +<-30> +<-20> +<-50> +<-20> +<-20> +<-40> +<-40> +< e-card><-10> +< ecard><-10> +<-20> +,<-20> +,<-20> +<-10> +<-20> +<-20> +<-10> +<-20> +<-30> +<-50> +< ex-><-20> +<-10> +<-5> +<-40> +<-40> +,<-20> +,<-20> +,<-60> +,<-10> +<-20> +<-5> +<-5> +<-5> +<-30> +<-20> +<-30> +<-40> +<-40> +<-10> +<-20> +<-30> +<-30> +<-50> +<-20> +<-30> +<-30> +<-20> +<-50> +<-20> +<-30> +<-50> +<-40> +<-30> +<-40> +<-40> +<-40> +<-30> +<-20> +< health ><-10> +<-30> +<-30> +,<-10> +,<-20> +,<-20> +,<-20> +,<-20> +,<-20> +<-20> +<-20> +< h.i.v ><-50> +< hiv ><-50> +<-20> +,<-30> +<-50> +,<-30> +,<-30> +<-10> +<-10> +<-30> +<-40> +< intel ><-20> +<-20> +<-80> +<-20> +<-10> +<-50> +<-500> +<-40> +<-20> +,<-30> +,<-30> +<-10> +<-30> +,<-50> +,<-50> +<-10> +,<-50> +,<-50> +<-30> +<-40> +<-20> +<-30> +<-60> +<-20> +<-100> +<-100> +<-20> +<-50> +<-30> +<-20> +,<-20> +<-50> +<-50> +<-50> +<-10> +<-10> +<-50> +<-20> +<-40> +<-20> +<-10> +<-50> +<-20> +<-30> +<-50> +<-5> +<-20> +<-50> +<-20> +<-10> +<-80> +<-40> +<-10> +<-5> +<-20> +<-40> +<-50> +<-30> +<-30> +<-50> +<-30> +<-30> +<-30> +<-30> +<-30> +<-30> +<-50> +<-50> +<-20> +<-20> +<-50> +<-10> +<-20> +<-20> +<-20> +<-20> +<-20> +<-50> +,<-30> +<-20> +<-50> +<-40> +<-40> +<-40> +<-40> +<-50> +<-50> +<-50> +<-40> +<-30> +,,<-30> +<-15> +<-50> +< research ><-20> +<-20> +<-10> +<-30> +<-20> +<-50> +<-50> +<-20> +<-30> +<-30> + + + + + + + + + 404 Not Found + + + + +
+
+

+ + 404 Not Found +

+

+ We apologize but we can't seem to be able to find what you're looking + for! +

+ + error
+
+ + +
+ + diff --git a/data/htdocs/www/block.html b/data/htdocs/www/block.html new file mode 100644 index 0000000..85d47a3 --- /dev/null +++ b/data/htdocs/www/block.html @@ -0,0 +1,3 @@ + + This URL was blocked by your squid! + diff --git a/data/htdocs/www/css/bootstrap.min.css b/data/htdocs/www/css/bootstrap.min.css new file mode 100644 index 0000000..f7f8545 --- /dev/null +++ b/data/htdocs/www/css/bootstrap.min.css @@ -0,0 +1,10531 @@ +/*! + * Bootswatch v5.1.3 + * Homepage: https://bootswatch.com + * Copyright 2012-2021 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*/ /*! + * Bootstrap v5.1.3 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors + * Copyright 2011-2021 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +@import url(https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400;0,700;1,400&display=swap); +:root { + --bs-blue: #375a7f; + --bs-indigo: #6610f2; + --bs-purple: #6f42c1; + --bs-pink: #e83e8c; + --bs-red: #e74c3c; + --bs-orange: #fd7e14; + --bs-yellow: #f39c12; + --bs-green: #00bc8c; + --bs-teal: #20c997; + --bs-cyan: #3498db; + --bs-white: #fff; + --bs-gray: #888; + --bs-gray-dark: #303030; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #ebebeb; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #888; + --bs-gray-700: #444; + --bs-gray-800: #303030; + --bs-gray-900: #222; + --bs-primary: #375a7f; + --bs-secondary: #444; + --bs-success: #00bc8c; + --bs-info: #3498db; + --bs-warning: #f39c12; + --bs-danger: #e74c3c; + --bs-light: #adb5bd; + --bs-dark: #303030; + --bs-primary-rgb: 55, 90, 127; + --bs-secondary-rgb: 68, 68, 68; + --bs-success-rgb: 0, 188, 140; + --bs-info-rgb: 52, 152, 219; + --bs-warning-rgb: 243, 156, 18; + --bs-danger-rgb: 231, 76, 60; + --bs-light-rgb: 173, 181, 189; + --bs-dark-rgb: 48, 48, 48; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-body-color-rgb: 255, 255, 255; + --bs-body-bg-rgb: 34, 34, 34; + --bs-font-sans-serif: Lato, -apple-system, BlinkMacSystemFont, 'Segoe UI', + Roboto, 'Helvetica Neue', Arial, sans-serif, 'Apple Color Emoji', + 'Segoe UI Emoji', 'Segoe UI Symbol'; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, + 'Liberation Mono', 'Courier New', monospace; + --bs-gradient: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.15), + rgba(255, 255, 255, 0) + ); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 1rem; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #fff; + --bs-body-bg: #222; +} +*, +::after, +::before { + box-sizing: border-box; +} +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth; + } +} +body { + margin: 0; + font-family: var(--bs-body-font-family); + font-size: var(--bs-body-font-size); + font-weight: var(--bs-body-font-weight); + line-height: var(--bs-body-line-height); + color: var(--bs-body-color); + text-align: var(--bs-body-text-align); + background-color: var(--bs-body-bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: transparent; +} +hr { + margin: 1rem 0; + color: inherit; + background-color: currentColor; + border: 0; + opacity: 0.25; +} +hr:not([size]) { + height: 1px; +} +.h1, +.h2, +.h3, +.h4, +.h5, +.h6, +h1, +h2, +h3, +h4, +h5, +h6 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; +} +.h1, +h1 { + font-size: calc(1.425rem + 2.1vw); +} +@media (min-width: 1200px) { + .h1, + h1 { + font-size: 3rem; + } +} +.h2, +h2 { + font-size: calc(1.375rem + 1.5vw); +} +@media (min-width: 1200px) { + .h2, + h2 { + font-size: 2.5rem; + } +} +.h3, +h3 { + font-size: calc(1.325rem + 0.9vw); +} +@media (min-width: 1200px) { + .h3, + h3 { + font-size: 2rem; + } +} +.h4, +h4 { + font-size: calc(1.275rem + 0.3vw); +} +@media (min-width: 1200px) { + .h4, + h4 { + font-size: 1.5rem; + } +} +.h5, +h5 { + font-size: 1.25rem; +} +.h6, +h6 { + font-size: 1rem; +} +p { + margin-top: 0; + margin-bottom: 1rem; +} +abbr[data-bs-original-title], +abbr[title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} +ol, +ul { + padding-left: 2rem; +} +dl, +ol, +ul { + margin-top: 0; + margin-bottom: 1rem; +} +ol ol, +ol ul, +ul ol, +ul ul { + margin-bottom: 0; +} +dt { + font-weight: 700; +} +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} +blockquote { + margin: 0 0 1rem; +} +b, +strong { + font-weight: bolder; +} +.small, +small { + font-size: 0.875em; +} +.mark, +mark { + padding: 0.2em; + background-color: #fcf8e3; +} +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} +sub { + bottom: -0.25em; +} +sup { + top: -0.5em; +} +a { + color: #00bc8c; + text-decoration: underline; +} +a:hover { + color: #009670; +} +a:not([href]):not([class]), +a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} +code, +kbd, +pre, +samp { + font-family: var(--bs-font-monospace); + font-size: 1em; + direction: ltr; + unicode-bidi: bidi-override; +} +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; + color: inherit; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} +code { + font-size: 0.875em; + color: #e83e8c; + word-wrap: break-word; +} +a > code { + color: inherit; +} +kbd { + padding: 0.2rem 0.4rem; + font-size: 0.875em; + color: #fff; + background-color: #222; + border-radius: 0.2rem; +} +kbd kbd { + padding: 0; + font-size: 1em; + font-weight: 700; +} +figure { + margin: 0 0 1rem; +} +img, +svg { + vertical-align: middle; +} +table { + caption-side: bottom; + border-collapse: collapse; +} +caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: #888; + text-align: left; +} +th { + text-align: inherit; + text-align: -webkit-match-parent; +} +tbody, +td, +tfoot, +th, +thead, +tr { + border-color: inherit; + border-style: solid; + border-width: 0; +} +label { + display: inline-block; +} +button { + border-radius: 0; +} +button:focus:not(:focus-visible) { + outline: 0; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +button, +select { + text-transform: none; +} +[role='button'] { + cursor: pointer; +} +select { + word-wrap: normal; +} +select:disabled { + opacity: 1; +} +[list]::-webkit-calendar-picker-indicator { + display: none; +} +[type='button'], +[type='reset'], +[type='submit'], +button { + -webkit-appearance: button; +} +[type='button']:not(:disabled), +[type='reset']:not(:disabled), +[type='submit']:not(:disabled), +button:not(:disabled) { + cursor: pointer; +} +::-moz-focus-inner { + padding: 0; + border-style: none; +} +textarea { + resize: vertical; +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + float: left; + width: 100%; + padding: 0; + margin-bottom: 0.5rem; + font-size: calc(1.275rem + 0.3vw); + line-height: inherit; +} +@media (min-width: 1200px) { + legend { + font-size: 1.5rem; + } +} +legend + * { + clear: left; +} +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-fields-wrapper, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-minute, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-text, +::-webkit-datetime-edit-year-field { + padding: 0; +} +::-webkit-inner-spin-button { + height: auto; +} +[type='search'] { + outline-offset: -2px; + -webkit-appearance: textfield; +} +::-webkit-search-decoration { + -webkit-appearance: none; +} +::-webkit-color-swatch-wrapper { + padding: 0; +} +::file-selector-button { + font: inherit; +} +::-webkit-file-upload-button { + font: inherit; + -webkit-appearance: button; +} +output { + display: inline-block; +} +iframe { + border: 0; +} +summary { + display: list-item; + cursor: pointer; +} +progress { + vertical-align: baseline; +} +[hidden] { + display: none !important; +} +.lead { + font-size: 1.25rem; + font-weight: 300; +} +.display-1 { + font-size: calc(1.625rem + 4.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-1 { + font-size: 5rem; + } +} +.display-2 { + font-size: calc(1.575rem + 3.9vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-2 { + font-size: 4.5rem; + } +} +.display-3 { + font-size: calc(1.525rem + 3.3vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-3 { + font-size: 4rem; + } +} +.display-4 { + font-size: calc(1.475rem + 2.7vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-4 { + font-size: 3.5rem; + } +} +.display-5 { + font-size: calc(1.425rem + 2.1vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-5 { + font-size: 3rem; + } +} +.display-6 { + font-size: calc(1.375rem + 1.5vw); + font-weight: 300; + line-height: 1.2; +} +@media (min-width: 1200px) { + .display-6 { + font-size: 2.5rem; + } +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + list-style: none; +} +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} +.initialism { + font-size: 0.875em; + text-transform: uppercase; +} +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} +.blockquote > :last-child { + margin-bottom: 0; +} +.blockquote-footer { + margin-top: -1rem; + margin-bottom: 1rem; + font-size: 0.875em; + color: #888; +} +.blockquote-footer::before { + content: '\2014\00A0'; +} +.img-fluid { + max-width: 100%; + height: auto; +} +.img-thumbnail { + padding: 0.25rem; + background-color: #222; + border: 1px solid #dee2e6; + border-radius: 0.25rem; + max-width: 100%; + height: auto; +} +.figure { + display: inline-block; +} +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} +.figure-caption { + font-size: 0.875em; + color: #888; +} +.container, +.container-fluid, +.container-lg, +.container-md, +.container-sm, +.container-xl, +.container-xxl { + width: 100%; + padding-right: var(--bs-gutter-x, 0.75rem); + padding-left: var(--bs-gutter-x, 0.75rem); + margin-right: auto; + margin-left: auto; +} +@media (min-width: 576px) { + .container, + .container-sm { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container, + .container-md, + .container-sm { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container, + .container-lg, + .container-md, + .container-sm { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container, + .container-lg, + .container-md, + .container-sm, + .container-xl { + max-width: 1140px; + } +} +@media (min-width: 1400px) { + .container, + .container-lg, + .container-md, + .container-sm, + .container-xl, + .container-xxl { + max-width: 1320px; + } +} +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-top: calc(-1 * var(--bs-gutter-y)); + margin-right: calc(-0.5 * var(--bs-gutter-x)); + margin-left: calc(-0.5 * var(--bs-gutter-x)); +} +.row > * { + -ms-flex-negative: 0; + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-top: var(--bs-gutter-y); +} +.col { + -ms-flex: 1 0 0%; + flex: 1 0 0%; +} +.row-cols-auto > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; +} +.row-cols-1 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; +} +.row-cols-2 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; +} +.row-cols-3 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.333333%; +} +.row-cols-4 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; +} +.row-cols-5 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 20%; +} +.row-cols-6 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.666667%; +} +.col-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; +} +.col-1 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 8.333333%; +} +.col-2 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.666667%; +} +.col-3 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; +} +.col-4 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.333333%; +} +.col-5 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 41.666667%; +} +.col-6 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; +} +.col-7 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 58.333333%; +} +.col-8 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 66.666667%; +} +.col-9 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 75%; +} +.col-10 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 83.333333%; +} +.col-11 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 91.666667%; +} +.col-12 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; +} +.offset-1 { + margin-left: 8.333333%; +} +.offset-2 { + margin-left: 16.666667%; +} +.offset-3 { + margin-left: 25%; +} +.offset-4 { + margin-left: 33.333333%; +} +.offset-5 { + margin-left: 41.666667%; +} +.offset-6 { + margin-left: 50%; +} +.offset-7 { + margin-left: 58.333333%; +} +.offset-8 { + margin-left: 66.666667%; +} +.offset-9 { + margin-left: 75%; +} +.offset-10 { + margin-left: 83.333333%; +} +.offset-11 { + margin-left: 91.666667%; +} +.g-0, +.gx-0 { + --bs-gutter-x: 0; +} +.g-0, +.gy-0 { + --bs-gutter-y: 0; +} +.g-1, +.gx-1 { + --bs-gutter-x: 0.25rem; +} +.g-1, +.gy-1 { + --bs-gutter-y: 0.25rem; +} +.g-2, +.gx-2 { + --bs-gutter-x: 0.5rem; +} +.g-2, +.gy-2 { + --bs-gutter-y: 0.5rem; +} +.g-3, +.gx-3 { + --bs-gutter-x: 1rem; +} +.g-3, +.gy-3 { + --bs-gutter-y: 1rem; +} +.g-4, +.gx-4 { + --bs-gutter-x: 1.5rem; +} +.g-4, +.gy-4 { + --bs-gutter-y: 1.5rem; +} +.g-5, +.gx-5 { + --bs-gutter-x: 3rem; +} +.g-5, +.gy-5 { + --bs-gutter-y: 3rem; +} +@media (min-width: 576px) { + .col-sm { + -ms-flex: 1 0 0%; + flex: 1 0 0%; + } + .row-cols-sm-auto > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .row-cols-sm-1 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .row-cols-sm-2 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .row-cols-sm-3 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.333333%; + } + .row-cols-sm-4 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .row-cols-sm-5 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 20%; + } + .row-cols-sm-6 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.666667%; + } + .col-sm-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .col-sm-1 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 8.333333%; + } + .col-sm-2 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.666667%; + } + .col-sm-3 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .col-sm-4 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.333333%; + } + .col-sm-5 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 41.666667%; + } + .col-sm-6 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .col-sm-7 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 58.333333%; + } + .col-sm-8 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 66.666667%; + } + .col-sm-9 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 75%; + } + .col-sm-10 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 83.333333%; + } + .col-sm-11 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 91.666667%; + } + .col-sm-12 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.333333%; + } + .offset-sm-2 { + margin-left: 16.666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.333333%; + } + .offset-sm-5 { + margin-left: 41.666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.333333%; + } + .offset-sm-8 { + margin-left: 66.666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.333333%; + } + .offset-sm-11 { + margin-left: 91.666667%; + } + .g-sm-0, + .gx-sm-0 { + --bs-gutter-x: 0; + } + .g-sm-0, + .gy-sm-0 { + --bs-gutter-y: 0; + } + .g-sm-1, + .gx-sm-1 { + --bs-gutter-x: 0.25rem; + } + .g-sm-1, + .gy-sm-1 { + --bs-gutter-y: 0.25rem; + } + .g-sm-2, + .gx-sm-2 { + --bs-gutter-x: 0.5rem; + } + .g-sm-2, + .gy-sm-2 { + --bs-gutter-y: 0.5rem; + } + .g-sm-3, + .gx-sm-3 { + --bs-gutter-x: 1rem; + } + .g-sm-3, + .gy-sm-3 { + --bs-gutter-y: 1rem; + } + .g-sm-4, + .gx-sm-4 { + --bs-gutter-x: 1.5rem; + } + .g-sm-4, + .gy-sm-4 { + --bs-gutter-y: 1.5rem; + } + .g-sm-5, + .gx-sm-5 { + --bs-gutter-x: 3rem; + } + .g-sm-5, + .gy-sm-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 768px) { + .col-md { + -ms-flex: 1 0 0%; + flex: 1 0 0%; + } + .row-cols-md-auto > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .row-cols-md-1 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .row-cols-md-2 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .row-cols-md-3 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.333333%; + } + .row-cols-md-4 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .row-cols-md-5 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 20%; + } + .row-cols-md-6 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.666667%; + } + .col-md-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .col-md-1 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 8.333333%; + } + .col-md-2 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.666667%; + } + .col-md-3 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .col-md-4 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.333333%; + } + .col-md-5 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 41.666667%; + } + .col-md-6 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .col-md-7 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 58.333333%; + } + .col-md-8 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 66.666667%; + } + .col-md-9 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 75%; + } + .col-md-10 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 83.333333%; + } + .col-md-11 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 91.666667%; + } + .col-md-12 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.333333%; + } + .offset-md-2 { + margin-left: 16.666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.333333%; + } + .offset-md-5 { + margin-left: 41.666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.333333%; + } + .offset-md-8 { + margin-left: 66.666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.333333%; + } + .offset-md-11 { + margin-left: 91.666667%; + } + .g-md-0, + .gx-md-0 { + --bs-gutter-x: 0; + } + .g-md-0, + .gy-md-0 { + --bs-gutter-y: 0; + } + .g-md-1, + .gx-md-1 { + --bs-gutter-x: 0.25rem; + } + .g-md-1, + .gy-md-1 { + --bs-gutter-y: 0.25rem; + } + .g-md-2, + .gx-md-2 { + --bs-gutter-x: 0.5rem; + } + .g-md-2, + .gy-md-2 { + --bs-gutter-y: 0.5rem; + } + .g-md-3, + .gx-md-3 { + --bs-gutter-x: 1rem; + } + .g-md-3, + .gy-md-3 { + --bs-gutter-y: 1rem; + } + .g-md-4, + .gx-md-4 { + --bs-gutter-x: 1.5rem; + } + .g-md-4, + .gy-md-4 { + --bs-gutter-y: 1.5rem; + } + .g-md-5, + .gx-md-5 { + --bs-gutter-x: 3rem; + } + .g-md-5, + .gy-md-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 992px) { + .col-lg { + -ms-flex: 1 0 0%; + flex: 1 0 0%; + } + .row-cols-lg-auto > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .row-cols-lg-1 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .row-cols-lg-2 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .row-cols-lg-3 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.333333%; + } + .row-cols-lg-4 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .row-cols-lg-5 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 20%; + } + .row-cols-lg-6 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.666667%; + } + .col-lg-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .col-lg-1 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 8.333333%; + } + .col-lg-2 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.666667%; + } + .col-lg-3 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .col-lg-4 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.333333%; + } + .col-lg-5 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 41.666667%; + } + .col-lg-6 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .col-lg-7 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 58.333333%; + } + .col-lg-8 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 66.666667%; + } + .col-lg-9 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 75%; + } + .col-lg-10 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 83.333333%; + } + .col-lg-11 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 91.666667%; + } + .col-lg-12 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.333333%; + } + .offset-lg-2 { + margin-left: 16.666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.333333%; + } + .offset-lg-5 { + margin-left: 41.666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.333333%; + } + .offset-lg-8 { + margin-left: 66.666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.333333%; + } + .offset-lg-11 { + margin-left: 91.666667%; + } + .g-lg-0, + .gx-lg-0 { + --bs-gutter-x: 0; + } + .g-lg-0, + .gy-lg-0 { + --bs-gutter-y: 0; + } + .g-lg-1, + .gx-lg-1 { + --bs-gutter-x: 0.25rem; + } + .g-lg-1, + .gy-lg-1 { + --bs-gutter-y: 0.25rem; + } + .g-lg-2, + .gx-lg-2 { + --bs-gutter-x: 0.5rem; + } + .g-lg-2, + .gy-lg-2 { + --bs-gutter-y: 0.5rem; + } + .g-lg-3, + .gx-lg-3 { + --bs-gutter-x: 1rem; + } + .g-lg-3, + .gy-lg-3 { + --bs-gutter-y: 1rem; + } + .g-lg-4, + .gx-lg-4 { + --bs-gutter-x: 1.5rem; + } + .g-lg-4, + .gy-lg-4 { + --bs-gutter-y: 1.5rem; + } + .g-lg-5, + .gx-lg-5 { + --bs-gutter-x: 3rem; + } + .g-lg-5, + .gy-lg-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1200px) { + .col-xl { + -ms-flex: 1 0 0%; + flex: 1 0 0%; + } + .row-cols-xl-auto > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .row-cols-xl-1 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .row-cols-xl-2 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .row-cols-xl-3 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.333333%; + } + .row-cols-xl-4 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .row-cols-xl-5 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 20%; + } + .row-cols-xl-6 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.666667%; + } + .col-xl-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .col-xl-1 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 8.333333%; + } + .col-xl-2 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.666667%; + } + .col-xl-3 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .col-xl-4 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.333333%; + } + .col-xl-5 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 41.666667%; + } + .col-xl-6 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .col-xl-7 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 58.333333%; + } + .col-xl-8 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 66.666667%; + } + .col-xl-9 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 75%; + } + .col-xl-10 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 83.333333%; + } + .col-xl-11 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 91.666667%; + } + .col-xl-12 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.333333%; + } + .offset-xl-2 { + margin-left: 16.666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.333333%; + } + .offset-xl-5 { + margin-left: 41.666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.333333%; + } + .offset-xl-8 { + margin-left: 66.666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.333333%; + } + .offset-xl-11 { + margin-left: 91.666667%; + } + .g-xl-0, + .gx-xl-0 { + --bs-gutter-x: 0; + } + .g-xl-0, + .gy-xl-0 { + --bs-gutter-y: 0; + } + .g-xl-1, + .gx-xl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xl-1, + .gy-xl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xl-2, + .gx-xl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xl-2, + .gy-xl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xl-3, + .gx-xl-3 { + --bs-gutter-x: 1rem; + } + .g-xl-3, + .gy-xl-3 { + --bs-gutter-y: 1rem; + } + .g-xl-4, + .gx-xl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xl-4, + .gy-xl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xl-5, + .gx-xl-5 { + --bs-gutter-x: 3rem; + } + .g-xl-5, + .gy-xl-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1400px) { + .col-xxl { + -ms-flex: 1 0 0%; + flex: 1 0 0%; + } + .row-cols-xxl-auto > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .row-cols-xxl-1 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .row-cols-xxl-2 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .row-cols-xxl-3 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.333333%; + } + .row-cols-xxl-4 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .row-cols-xxl-5 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 20%; + } + .row-cols-xxl-6 > * { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.666667%; + } + .col-xxl-auto { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + } + .col-xxl-1 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 8.333333%; + } + .col-xxl-2 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 16.666667%; + } + .col-xxl-3 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 25%; + } + .col-xxl-4 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 33.333333%; + } + .col-xxl-5 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 41.666667%; + } + .col-xxl-6 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 50%; + } + .col-xxl-7 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 58.333333%; + } + .col-xxl-8 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 66.666667%; + } + .col-xxl-9 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 75%; + } + .col-xxl-10 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 83.333333%; + } + .col-xxl-11 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 91.666667%; + } + .col-xxl-12 { + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: 100%; + } + .offset-xxl-0 { + margin-left: 0; + } + .offset-xxl-1 { + margin-left: 8.333333%; + } + .offset-xxl-2 { + margin-left: 16.666667%; + } + .offset-xxl-3 { + margin-left: 25%; + } + .offset-xxl-4 { + margin-left: 33.333333%; + } + .offset-xxl-5 { + margin-left: 41.666667%; + } + .offset-xxl-6 { + margin-left: 50%; + } + .offset-xxl-7 { + margin-left: 58.333333%; + } + .offset-xxl-8 { + margin-left: 66.666667%; + } + .offset-xxl-9 { + margin-left: 75%; + } + .offset-xxl-10 { + margin-left: 83.333333%; + } + .offset-xxl-11 { + margin-left: 91.666667%; + } + .g-xxl-0, + .gx-xxl-0 { + --bs-gutter-x: 0; + } + .g-xxl-0, + .gy-xxl-0 { + --bs-gutter-y: 0; + } + .g-xxl-1, + .gx-xxl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xxl-1, + .gy-xxl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xxl-2, + .gx-xxl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xxl-2, + .gy-xxl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xxl-3, + .gx-xxl-3 { + --bs-gutter-x: 1rem; + } + .g-xxl-3, + .gy-xxl-3 { + --bs-gutter-y: 1rem; + } + .g-xxl-4, + .gx-xxl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xxl-4, + .gy-xxl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xxl-5, + .gx-xxl-5 { + --bs-gutter-x: 3rem; + } + .g-xxl-5, + .gy-xxl-5 { + --bs-gutter-y: 3rem; + } +} +.table { + --bs-table-bg: transparent; + --bs-table-accent-bg: transparent; + --bs-table-striped-color: #fff; + --bs-table-striped-bg: rgba(0, 0, 0, 0.05); + --bs-table-active-color: #fff; + --bs-table-active-bg: rgba(0, 0, 0, 0.1); + --bs-table-hover-color: #fff; + --bs-table-hover-bg: rgba(0, 0, 0, 0.075); + width: 100%; + margin-bottom: 1rem; + color: #fff; + vertical-align: top; + border-color: #444; +} +.table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + background-color: var(--bs-table-bg); + border-bottom-width: 1px; + box-shadow: inset 0 0 0 9999px var(--bs-table-accent-bg); +} +.table > tbody { + vertical-align: inherit; +} +.table > thead { + vertical-align: bottom; +} +.table > :not(:first-child) { + border-top: 2px solid currentColor; +} +.caption-top { + caption-side: top; +} +.table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; +} +.table-bordered > :not(caption) > * { + border-width: 1px 0; +} +.table-bordered > :not(caption) > * > * { + border-width: 0 1px; +} +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0; +} +.table-borderless > :not(:first-child) { + border-top-width: 0; +} +.table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-accent-bg: var(--bs-table-striped-bg); + color: var(--bs-table-striped-color); +} +.table-active { + --bs-table-accent-bg: var(--bs-table-active-bg); + color: var(--bs-table-active-color); +} +.table-hover > tbody > tr:hover > * { + --bs-table-accent-bg: var(--bs-table-hover-bg); + color: var(--bs-table-hover-color); +} +.table-primary { + --bs-table-bg: #375a7f; + --bs-table-striped-bg: #416285; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #4b6b8c; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #466689; + --bs-table-hover-color: #fff; + color: #fff; + border-color: #4b6b8c; +} +.table-secondary { + --bs-table-bg: #444444; + --bs-table-striped-bg: #4d4d4d; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #575757; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #525252; + --bs-table-hover-color: #fff; + color: #fff; + border-color: #575757; +} +.table-success { + --bs-table-bg: #00bc8c; + --bs-table-striped-bg: #0dbf92; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #1ac398; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #13c195; + --bs-table-hover-color: #fff; + color: #fff; + border-color: #1ac398; +} +.table-info { + --bs-table-bg: #3498db; + --bs-table-striped-bg: #3e9ddd; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #48a2df; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #43a0de; + --bs-table-hover-color: #fff; + color: #fff; + border-color: #48a2df; +} +.table-warning { + --bs-table-bg: #f39c12; + --bs-table-striped-bg: #f4a11e; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #f4a62a; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #f4a324; + --bs-table-hover-color: #fff; + color: #fff; + border-color: #f4a62a; +} +.table-danger { + --bs-table-bg: #e74c3c; + --bs-table-striped-bg: #e85546; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #e95e50; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #e9594b; + --bs-table-hover-color: #fff; + color: #fff; + border-color: #e95e50; +} +.table-light { + --bs-table-bg: #adb5bd; + --bs-table-striped-bg: #b1b9c0; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #b5bcc4; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #b3bbc2; + --bs-table-hover-color: #fff; + color: #fff; + border-color: #b5bcc4; +} +.table-dark { + --bs-table-bg: #303030; + --bs-table-striped-bg: #3a3a3a; + --bs-table-striped-color: #fff; + --bs-table-active-bg: #454545; + --bs-table-active-color: #fff; + --bs-table-hover-bg: #404040; + --bs-table-hover-color: #fff; + color: #fff; + border-color: #454545; +} +.table-responsive { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} +@media (max-width: 575.98px) { + .table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1399.98px) { + .table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +.form-label { + margin-bottom: 0.5rem; +} +.col-form-label { + padding-top: calc(0.375rem + 1px); + padding-bottom: calc(0.375rem + 1px); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} +.col-form-label-lg { + padding-top: calc(0.5rem + 1px); + padding-bottom: calc(0.5rem + 1px); + font-size: 1.25rem; +} +.col-form-label-sm { + padding-top: calc(0.25rem + 1px); + padding-bottom: calc(0.25rem + 1px); + font-size: 0.875rem; +} +.form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: #888; +} +.form-control { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #303030; + background-color: #fff; + background-clip: padding-box; + border: 1px solid #222; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control[type='file'] { + overflow: hidden; +} +.form-control[type='file']:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control:focus { + color: #303030; + background-color: #fff; + border-color: #9badbf; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25); +} +.form-control::-webkit-date-and-time-value { + height: 1.5em; +} +.form-control::-webkit-input-placeholder { + color: #888; + opacity: 1; +} +.form-control::-moz-placeholder { + color: #888; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #888; + opacity: 1; +} +.form-control::-ms-input-placeholder { + color: #888; + opacity: 1; +} +.form-control::placeholder { + color: #888; + opacity: 1; +} +.form-control:disabled, +.form-control[readonly] { + background-color: #ebebeb; + opacity: 1; +} +.form-control::file-selector-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + -moz-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: #fff; + background-color: #444; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::file-selector-button { + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: #414141; +} +.form-control::-webkit-file-upload-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + -webkit-margin-end: 0.75rem; + margin-inline-end: 0.75rem; + color: #fff; + background-color: #444; + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: 1px; + border-radius: 0; + -webkit-transition: color 0.15s ease-in-out, + background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::-webkit-file-upload-button { + -webkit-transition: none; + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::-webkit-file-upload-button { + background-color: #414141; +} +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: #fff; + background-color: transparent; + border: solid transparent; + border-width: 1px 0; +} +.form-control-plaintext.form-control-lg, +.form-control-plaintext.form-control-sm { + padding-right: 0; + padding-left: 0; +} +.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} +.form-control-sm::file-selector-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + -moz-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} +.form-control-sm::-webkit-file-upload-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + -webkit-margin-end: 0.5rem; + margin-inline-end: 0.5rem; +} +.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} +.form-control-lg::file-selector-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + -moz-margin-end: 1rem; + margin-inline-end: 1rem; +} +.form-control-lg::-webkit-file-upload-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + -webkit-margin-end: 1rem; + margin-inline-end: 1rem; +} +textarea.form-control { + min-height: calc(1.5em + 0.75rem + 2px); +} +textarea.form-control-sm { + min-height: calc(1.5em + 0.5rem + 2px); +} +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + 2px); +} +.form-control-color { + width: 3rem; + height: auto; + padding: 0.375rem; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + height: 1.5em; + border-radius: 0.25rem; +} +.form-control-color::-webkit-color-swatch { + height: 1.5em; + border-radius: 0.25rem; +} +.form-select { + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + -moz-padding-start: calc(0.75rem - 3px); + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #303030; + background-color: #fff; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23303030' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: 1px solid #222; + border-radius: 0.25rem; + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-select { + transition: none; + } +} +.form-select:focus { + border-color: #9badbf; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25); +} +.form-select[multiple], +.form-select[size]:not([size='1']) { + padding-right: 0.75rem; + background-image: none; +} +.form-select:disabled { + background-color: #ebebeb; +} +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #303030; +} +.form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} +.form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} +.form-check-input { + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + background-color: #fff; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: none; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + -webkit-print-color-adjust: exact; + color-adjust: exact; +} +.form-check-input[type='checkbox'] { + border-radius: 0.25em; +} +.form-check-input[type='radio'] { + border-radius: 50%; +} +.form-check-input:active { + -webkit-filter: brightness(90%); + filter: brightness(90%); +} +.form-check-input:focus { + border-color: #9badbf; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25); +} +.form-check-input:checked { + background-color: #375a7f; + border-color: #375a7f; +} +.form-check-input:checked[type='checkbox'] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10l3 3l6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type='radio'] { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-input[type='checkbox']:indeterminate { + background-color: #375a7f; + border-color: #375a7f; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} +.form-check-input:disabled { + pointer-events: none; + -webkit-filter: none; + filter: none; + opacity: 0.5; +} +.form-check-input:disabled ~ .form-check-label, +.form-check-input[disabled] ~ .form-check-label { + opacity: 0.5; +} +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + width: 2em; + margin-left: -2.5em; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + background-position: left center; + border-radius: 2em; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none; + } +} +.form-switch .form-check-input:focus { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%239badbf'/%3e%3c/svg%3e"); +} +.form-switch .form-check-input:checked { + background-position: right center; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-inline { + display: inline-block; + margin-right: 1rem; +} +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.btn-check:disabled + .btn, +.btn-check[disabled] + .btn { + pointer-events: none; + -webkit-filter: none; + filter: none; + opacity: 0.65; +} +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + background-color: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} +.form-range:focus { + outline: 0; +} +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #222, 0 0 0 0.25rem rgba(55, 90, 127, 0.25); +} +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #222, 0 0 0 0.25rem rgba(55, 90, 127, 0.25); +} +.form-range::-moz-focus-outer { + border: 0; +} +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + background-color: #375a7f; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; + -webkit-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none; + } +} +.form-range::-webkit-slider-thumb:active { + background-color: #c3ced9; +} +.form-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + background-color: #375a7f; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, + box-shadow 0.15s ease-in-out; + -moz-appearance: none; + appearance: none; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none; + } +} +.form-range::-moz-range-thumb:active { + background-color: #c3ced9; +} +.form-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: #dee2e6; + border-color: transparent; + border-radius: 1rem; +} +.form-range:disabled { + pointer-events: none; +} +.form-range:disabled::-webkit-slider-thumb { + background-color: #adb5bd; +} +.form-range:disabled::-moz-range-thumb { + background-color: #adb5bd; +} +.form-floating { + position: relative; +} +.form-floating > .form-control, +.form-floating > .form-select { + height: calc(3.5rem + 2px); + line-height: 1.25; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + height: 100%; + padding: 1rem 0.75rem; + pointer-events: none; + border: 1px solid transparent; + -webkit-transform-origin: 0 0; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, -webkit-transform 0.1s ease-in-out; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out, + -webkit-transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none; + } +} +.form-floating > .form-control { + padding: 1rem 0.75rem; +} +.form-floating > .form-control::-webkit-input-placeholder { + color: transparent; +} +.form-floating > .form-control::-moz-placeholder { + color: transparent; +} +.form-floating > .form-control:-ms-input-placeholder { + color: transparent; +} +.form-floating > .form-control::-ms-input-placeholder { + color: transparent; +} +.form-floating > .form-control::placeholder { + color: transparent; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:not(:-ms-input-placeholder) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:focus, +.form-floating > .form-control:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:not(:-moz-placeholder-shown) ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:not(:-ms-input-placeholder) ~ label { + opacity: 0.65; + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-select ~ label { + opacity: 0.65; + -webkit-transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:-webkit-autofill ~ label { + opacity: 0.65; + -webkit-transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.input-group { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: stretch; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-select { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, +.input-group > .form-select:focus { + z-index: 3; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 3; +} +.input-group-text { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: #adb5bd; + text-align: center; + white-space: nowrap; + background-color: #444; + border: 1px solid #222; + border-radius: 0.25rem; +} +.input-group-lg > .btn, +.input-group-lg > .form-control, +.input-group-lg > .form-select, +.input-group-lg > .input-group-text { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} +.input-group-sm > .btn, +.input-group-sm > .form-control, +.input-group-sm > .form-select, +.input-group-sm > .input-group-text { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} +.input-group-lg > .form-select, +.input-group-sm > .form-select { + padding-right: 3rem; +} +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n + 3), +.input-group:not(.has-validation) + > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group.has-validation > .dropdown-toggle:nth-last-child(n + 4), +.input-group.has-validation + > :nth-last-child(n + 3):not(.dropdown-toggle):not(.dropdown-menu) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group + > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { + margin-left: -1px; + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #00bc8c; +} +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(0, 188, 140, 0.9); + border-radius: 0.25rem; +} +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip, +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip { + display: block; +} +.form-control.is-valid, +.was-validated .form-control:valid { + border-color: #00bc8c; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2300bc8c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-control.is-valid:focus, +.was-validated .form-control:valid:focus { + border-color: #00bc8c; + box-shadow: 0 0 0 0.25rem rgba(0, 188, 140, 0.25); +} +.was-validated textarea.form-control:valid, +textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right + calc(0.375em + 0.1875rem); +} +.form-select.is-valid, +.was-validated .form-select:valid { + border-color: #00bc8c; +} +.form-select.is-valid:not([multiple]):not([size]), +.form-select.is-valid:not([multiple])[size='1'], +.was-validated .form-select:valid:not([multiple]):not([size]), +.was-validated .form-select:valid:not([multiple])[size='1'] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23303030' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), + url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%2300bc8c' d='M2.3 6.73L.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-select.is-valid:focus, +.was-validated .form-select:valid:focus { + border-color: #00bc8c; + box-shadow: 0 0 0 0.25rem rgba(0, 188, 140, 0.25); +} +.form-check-input.is-valid, +.was-validated .form-check-input:valid { + border-color: #00bc8c; +} +.form-check-input.is-valid:checked, +.was-validated .form-check-input:valid:checked { + background-color: #00bc8c; +} +.form-check-input.is-valid:focus, +.was-validated .form-check-input:valid:focus { + box-shadow: 0 0 0 0.25rem rgba(0, 188, 140, 0.25); +} +.form-check-input.is-valid ~ .form-check-label, +.was-validated .form-check-input:valid ~ .form-check-label { + color: #00bc8c; +} +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; +} +.input-group .form-control.is-valid, +.input-group .form-select.is-valid, +.was-validated .input-group .form-control:valid, +.was-validated .input-group .form-select:valid { + z-index: 1; +} +.input-group .form-control.is-valid:focus, +.input-group .form-select.is-valid:focus, +.was-validated .input-group .form-control:valid:focus, +.was-validated .input-group .form-select:valid:focus { + z-index: 3; +} +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: #e74c3c; +} +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: rgba(231, 76, 60, 0.9); + border-radius: 0.25rem; +} +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip, +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip { + display: block; +} +.form-control.is-invalid, +.was-validated .form-control:invalid { + border-color: #e74c3c; + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%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='%23e74c3c' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-control.is-invalid:focus, +.was-validated .form-control:invalid:focus { + border-color: #e74c3c; + box-shadow: 0 0 0 0.25rem rgba(231, 76, 60, 0.25); +} +.was-validated textarea.form-control:invalid, +textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right + calc(0.375em + 0.1875rem); +} +.form-select.is-invalid, +.was-validated .form-select:invalid { + border-color: #e74c3c; +} +.form-select.is-invalid:not([multiple]):not([size]), +.form-select.is-invalid:not([multiple])[size='1'], +.was-validated .form-select:invalid:not([multiple]):not([size]), +.was-validated .form-select:invalid:not([multiple])[size='1'] { + padding-right: 4.125rem; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23303030' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M2 5l6 6 6-6'/%3e%3c/svg%3e"), + url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23e74c3c'%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='%23e74c3c' stroke='none'/%3e%3c/svg%3e"); + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.form-select.is-invalid:focus, +.was-validated .form-select:invalid:focus { + border-color: #e74c3c; + box-shadow: 0 0 0 0.25rem rgba(231, 76, 60, 0.25); +} +.form-check-input.is-invalid, +.was-validated .form-check-input:invalid { + border-color: #e74c3c; +} +.form-check-input.is-invalid:checked, +.was-validated .form-check-input:invalid:checked { + background-color: #e74c3c; +} +.form-check-input.is-invalid:focus, +.was-validated .form-check-input:invalid:focus { + box-shadow: 0 0 0 0.25rem rgba(231, 76, 60, 0.25); +} +.form-check-input.is-invalid ~ .form-check-label, +.was-validated .form-check-input:invalid ~ .form-check-label { + color: #e74c3c; +} +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} +.input-group .form-control.is-invalid, +.input-group .form-select.is-invalid, +.was-validated .input-group .form-control:invalid, +.was-validated .input-group .form-select:invalid { + z-index: 2; +} +.input-group .form-control.is-invalid:focus, +.input-group .form-select.is-invalid:focus, +.was-validated .input-group .form-control:invalid:focus, +.was-validated .input-group .form-select:invalid:focus { + z-index: 3; +} +.btn { + display: inline-block; + font-weight: 400; + line-height: 1.5; + color: #fff; + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.375rem 0.75rem; + font-size: 1rem; + border-radius: 0.25rem; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: #fff; +} +.btn-check:focus + .btn, +.btn:focus { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25); +} +.btn.disabled, +.btn:disabled, +fieldset:disabled .btn { + pointer-events: none; + opacity: 0.65; +} +.btn-primary { + color: #fff; + background-color: #375a7f; + border-color: #375a7f; +} +.btn-primary:hover { + color: #fff; + background-color: #2f4d6c; + border-color: #2c4866; +} +.btn-check:focus + .btn-primary, +.btn-primary:focus { + color: #fff; + background-color: #2f4d6c; + border-color: #2c4866; + box-shadow: 0 0 0 0.25rem rgba(85, 115, 146, 0.5); +} +.btn-check:active + .btn-primary, +.btn-check:checked + .btn-primary, +.btn-primary.active, +.btn-primary:active, +.show > .btn-primary.dropdown-toggle { + color: #fff; + background-color: #2c4866; + border-color: #29445f; +} +.btn-check:active + .btn-primary:focus, +.btn-check:checked + .btn-primary:focus, +.btn-primary.active:focus, +.btn-primary:active:focus, +.show > .btn-primary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(85, 115, 146, 0.5); +} +.btn-primary.disabled, +.btn-primary:disabled { + color: #fff; + background-color: #375a7f; + border-color: #375a7f; +} +.btn-secondary { + color: #fff; + background-color: #444; + border-color: #444; +} +.btn-secondary:hover { + color: #fff; + background-color: #3a3a3a; + border-color: #363636; +} +.btn-check:focus + .btn-secondary, +.btn-secondary:focus { + color: #fff; + background-color: #3a3a3a; + border-color: #363636; + box-shadow: 0 0 0 0.25rem rgba(96, 96, 96, 0.5); +} +.btn-check:active + .btn-secondary, +.btn-check:checked + .btn-secondary, +.btn-secondary.active, +.btn-secondary:active, +.show > .btn-secondary.dropdown-toggle { + color: #fff; + background-color: #363636; + border-color: #333; +} +.btn-check:active + .btn-secondary:focus, +.btn-check:checked + .btn-secondary:focus, +.btn-secondary.active:focus, +.btn-secondary:active:focus, +.show > .btn-secondary.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(96, 96, 96, 0.5); +} +.btn-secondary.disabled, +.btn-secondary:disabled { + color: #fff; + background-color: #444; + border-color: #444; +} +.btn-success { + color: #fff; + background-color: #00bc8c; + border-color: #00bc8c; +} +.btn-success:hover { + color: #fff; + background-color: #00a077; + border-color: #009670; +} +.btn-check:focus + .btn-success, +.btn-success:focus { + color: #fff; + background-color: #00a077; + border-color: #009670; + box-shadow: 0 0 0 0.25rem rgba(38, 198, 157, 0.5); +} +.btn-check:active + .btn-success, +.btn-check:checked + .btn-success, +.btn-success.active, +.btn-success:active, +.show > .btn-success.dropdown-toggle { + color: #fff; + background-color: #009670; + border-color: #008d69; +} +.btn-check:active + .btn-success:focus, +.btn-check:checked + .btn-success:focus, +.btn-success.active:focus, +.btn-success:active:focus, +.show > .btn-success.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(38, 198, 157, 0.5); +} +.btn-success.disabled, +.btn-success:disabled { + color: #fff; + background-color: #00bc8c; + border-color: #00bc8c; +} +.btn-info { + color: #fff; + background-color: #3498db; + border-color: #3498db; +} +.btn-info:hover { + color: #fff; + background-color: #2c81ba; + border-color: #2a7aaf; +} +.btn-check:focus + .btn-info, +.btn-info:focus { + color: #fff; + background-color: #2c81ba; + border-color: #2a7aaf; + box-shadow: 0 0 0 0.25rem rgba(82, 167, 224, 0.5); +} +.btn-check:active + .btn-info, +.btn-check:checked + .btn-info, +.btn-info.active, +.btn-info:active, +.show > .btn-info.dropdown-toggle { + color: #fff; + background-color: #2a7aaf; + border-color: #2772a4; +} +.btn-check:active + .btn-info:focus, +.btn-check:checked + .btn-info:focus, +.btn-info.active:focus, +.btn-info:active:focus, +.show > .btn-info.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(82, 167, 224, 0.5); +} +.btn-info.disabled, +.btn-info:disabled { + color: #fff; + background-color: #3498db; + border-color: #3498db; +} +.btn-warning { + color: #fff; + background-color: #f39c12; + border-color: #f39c12; +} +.btn-warning:hover { + color: #fff; + background-color: #cf850f; + border-color: #c27d0e; +} +.btn-check:focus + .btn-warning, +.btn-warning:focus { + color: #fff; + background-color: #cf850f; + border-color: #c27d0e; + box-shadow: 0 0 0 0.25rem rgba(245, 171, 54, 0.5); +} +.btn-check:active + .btn-warning, +.btn-check:checked + .btn-warning, +.btn-warning.active, +.btn-warning:active, +.show > .btn-warning.dropdown-toggle { + color: #fff; + background-color: #c27d0e; + border-color: #b6750e; +} +.btn-check:active + .btn-warning:focus, +.btn-check:checked + .btn-warning:focus, +.btn-warning.active:focus, +.btn-warning:active:focus, +.show > .btn-warning.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(245, 171, 54, 0.5); +} +.btn-warning.disabled, +.btn-warning:disabled { + color: #fff; + background-color: #f39c12; + border-color: #f39c12; +} +.btn-danger { + color: #fff; + background-color: #e74c3c; + border-color: #e74c3c; +} +.btn-danger:hover { + color: #fff; + background-color: #c44133; + border-color: #b93d30; +} +.btn-check:focus + .btn-danger, +.btn-danger:focus { + color: #fff; + background-color: #c44133; + border-color: #b93d30; + box-shadow: 0 0 0 0.25rem rgba(235, 103, 89, 0.5); +} +.btn-check:active + .btn-danger, +.btn-check:checked + .btn-danger, +.btn-danger.active, +.btn-danger:active, +.show > .btn-danger.dropdown-toggle { + color: #fff; + background-color: #b93d30; + border-color: #ad392d; +} +.btn-check:active + .btn-danger:focus, +.btn-check:checked + .btn-danger:focus, +.btn-danger.active:focus, +.btn-danger:active:focus, +.show > .btn-danger.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(235, 103, 89, 0.5); +} +.btn-danger.disabled, +.btn-danger:disabled { + color: #fff; + background-color: #e74c3c; + border-color: #e74c3c; +} +.btn-light { + color: #fff; + background-color: #adb5bd; + border-color: #adb5bd; +} +.btn-light:hover { + color: #fff; + background-color: #939aa1; + border-color: #8a9197; +} +.btn-check:focus + .btn-light, +.btn-light:focus { + color: #fff; + background-color: #939aa1; + border-color: #8a9197; + box-shadow: 0 0 0 0.25rem rgba(185, 192, 199, 0.5); +} +.btn-check:active + .btn-light, +.btn-check:checked + .btn-light, +.btn-light.active, +.btn-light:active, +.show > .btn-light.dropdown-toggle { + color: #fff; + background-color: #8a9197; + border-color: #82888e; +} +.btn-check:active + .btn-light:focus, +.btn-check:checked + .btn-light:focus, +.btn-light.active:focus, +.btn-light:active:focus, +.show > .btn-light.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(185, 192, 199, 0.5); +} +.btn-light.disabled, +.btn-light:disabled { + color: #fff; + background-color: #adb5bd; + border-color: #adb5bd; +} +.btn-dark { + color: #fff; + background-color: #303030; + border-color: #303030; +} +.btn-dark:hover { + color: #fff; + background-color: #292929; + border-color: #262626; +} +.btn-check:focus + .btn-dark, +.btn-dark:focus { + color: #fff; + background-color: #292929; + border-color: #262626; + box-shadow: 0 0 0 0.25rem rgba(79, 79, 79, 0.5); +} +.btn-check:active + .btn-dark, +.btn-check:checked + .btn-dark, +.btn-dark.active, +.btn-dark:active, +.show > .btn-dark.dropdown-toggle { + color: #fff; + background-color: #262626; + border-color: #242424; +} +.btn-check:active + .btn-dark:focus, +.btn-check:checked + .btn-dark:focus, +.btn-dark.active:focus, +.btn-dark:active:focus, +.show > .btn-dark.dropdown-toggle:focus { + box-shadow: 0 0 0 0.25rem rgba(79, 79, 79, 0.5); +} +.btn-dark.disabled, +.btn-dark:disabled { + color: #fff; + background-color: #303030; + border-color: #303030; +} +.btn-outline-primary { + color: #375a7f; + border-color: #375a7f; +} +.btn-outline-primary:hover { + color: #fff; + background-color: #375a7f; + border-color: #375a7f; +} +.btn-check:focus + .btn-outline-primary, +.btn-outline-primary:focus { + box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.5); +} +.btn-check:active + .btn-outline-primary, +.btn-check:checked + .btn-outline-primary, +.btn-outline-primary.active, +.btn-outline-primary.dropdown-toggle.show, +.btn-outline-primary:active { + color: #fff; + background-color: #375a7f; + border-color: #375a7f; +} +.btn-check:active + .btn-outline-primary:focus, +.btn-check:checked + .btn-outline-primary:focus, +.btn-outline-primary.active:focus, +.btn-outline-primary.dropdown-toggle.show:focus, +.btn-outline-primary:active:focus { + box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.5); +} +.btn-outline-primary.disabled, +.btn-outline-primary:disabled { + color: #375a7f; + background-color: transparent; +} +.btn-outline-secondary { + color: #444; + border-color: #444; +} +.btn-outline-secondary:hover { + color: #fff; + background-color: #444; + border-color: #444; +} +.btn-check:focus + .btn-outline-secondary, +.btn-outline-secondary:focus { + box-shadow: 0 0 0 0.25rem rgba(68, 68, 68, 0.5); +} +.btn-check:active + .btn-outline-secondary, +.btn-check:checked + .btn-outline-secondary, +.btn-outline-secondary.active, +.btn-outline-secondary.dropdown-toggle.show, +.btn-outline-secondary:active { + color: #fff; + background-color: #444; + border-color: #444; +} +.btn-check:active + .btn-outline-secondary:focus, +.btn-check:checked + .btn-outline-secondary:focus, +.btn-outline-secondary.active:focus, +.btn-outline-secondary.dropdown-toggle.show:focus, +.btn-outline-secondary:active:focus { + box-shadow: 0 0 0 0.25rem rgba(68, 68, 68, 0.5); +} +.btn-outline-secondary.disabled, +.btn-outline-secondary:disabled { + color: #444; + background-color: transparent; +} +.btn-outline-success { + color: #00bc8c; + border-color: #00bc8c; +} +.btn-outline-success:hover { + color: #fff; + background-color: #00bc8c; + border-color: #00bc8c; +} +.btn-check:focus + .btn-outline-success, +.btn-outline-success:focus { + box-shadow: 0 0 0 0.25rem rgba(0, 188, 140, 0.5); +} +.btn-check:active + .btn-outline-success, +.btn-check:checked + .btn-outline-success, +.btn-outline-success.active, +.btn-outline-success.dropdown-toggle.show, +.btn-outline-success:active { + color: #fff; + background-color: #00bc8c; + border-color: #00bc8c; +} +.btn-check:active + .btn-outline-success:focus, +.btn-check:checked + .btn-outline-success:focus, +.btn-outline-success.active:focus, +.btn-outline-success.dropdown-toggle.show:focus, +.btn-outline-success:active:focus { + box-shadow: 0 0 0 0.25rem rgba(0, 188, 140, 0.5); +} +.btn-outline-success.disabled, +.btn-outline-success:disabled { + color: #00bc8c; + background-color: transparent; +} +.btn-outline-info { + color: #3498db; + border-color: #3498db; +} +.btn-outline-info:hover { + color: #fff; + background-color: #3498db; + border-color: #3498db; +} +.btn-check:focus + .btn-outline-info, +.btn-outline-info:focus { + box-shadow: 0 0 0 0.25rem rgba(52, 152, 219, 0.5); +} +.btn-check:active + .btn-outline-info, +.btn-check:checked + .btn-outline-info, +.btn-outline-info.active, +.btn-outline-info.dropdown-toggle.show, +.btn-outline-info:active { + color: #fff; + background-color: #3498db; + border-color: #3498db; +} +.btn-check:active + .btn-outline-info:focus, +.btn-check:checked + .btn-outline-info:focus, +.btn-outline-info.active:focus, +.btn-outline-info.dropdown-toggle.show:focus, +.btn-outline-info:active:focus { + box-shadow: 0 0 0 0.25rem rgba(52, 152, 219, 0.5); +} +.btn-outline-info.disabled, +.btn-outline-info:disabled { + color: #3498db; + background-color: transparent; +} +.btn-outline-warning { + color: #f39c12; + border-color: #f39c12; +} +.btn-outline-warning:hover { + color: #fff; + background-color: #f39c12; + border-color: #f39c12; +} +.btn-check:focus + .btn-outline-warning, +.btn-outline-warning:focus { + box-shadow: 0 0 0 0.25rem rgba(243, 156, 18, 0.5); +} +.btn-check:active + .btn-outline-warning, +.btn-check:checked + .btn-outline-warning, +.btn-outline-warning.active, +.btn-outline-warning.dropdown-toggle.show, +.btn-outline-warning:active { + color: #fff; + background-color: #f39c12; + border-color: #f39c12; +} +.btn-check:active + .btn-outline-warning:focus, +.btn-check:checked + .btn-outline-warning:focus, +.btn-outline-warning.active:focus, +.btn-outline-warning.dropdown-toggle.show:focus, +.btn-outline-warning:active:focus { + box-shadow: 0 0 0 0.25rem rgba(243, 156, 18, 0.5); +} +.btn-outline-warning.disabled, +.btn-outline-warning:disabled { + color: #f39c12; + background-color: transparent; +} +.btn-outline-danger { + color: #e74c3c; + border-color: #e74c3c; +} +.btn-outline-danger:hover { + color: #fff; + background-color: #e74c3c; + border-color: #e74c3c; +} +.btn-check:focus + .btn-outline-danger, +.btn-outline-danger:focus { + box-shadow: 0 0 0 0.25rem rgba(231, 76, 60, 0.5); +} +.btn-check:active + .btn-outline-danger, +.btn-check:checked + .btn-outline-danger, +.btn-outline-danger.active, +.btn-outline-danger.dropdown-toggle.show, +.btn-outline-danger:active { + color: #fff; + background-color: #e74c3c; + border-color: #e74c3c; +} +.btn-check:active + .btn-outline-danger:focus, +.btn-check:checked + .btn-outline-danger:focus, +.btn-outline-danger.active:focus, +.btn-outline-danger.dropdown-toggle.show:focus, +.btn-outline-danger:active:focus { + box-shadow: 0 0 0 0.25rem rgba(231, 76, 60, 0.5); +} +.btn-outline-danger.disabled, +.btn-outline-danger:disabled { + color: #e74c3c; + background-color: transparent; +} +.btn-outline-light { + color: #adb5bd; + border-color: #adb5bd; +} +.btn-outline-light:hover { + color: #fff; + background-color: #adb5bd; + border-color: #adb5bd; +} +.btn-check:focus + .btn-outline-light, +.btn-outline-light:focus { + box-shadow: 0 0 0 0.25rem rgba(173, 181, 189, 0.5); +} +.btn-check:active + .btn-outline-light, +.btn-check:checked + .btn-outline-light, +.btn-outline-light.active, +.btn-outline-light.dropdown-toggle.show, +.btn-outline-light:active { + color: #fff; + background-color: #adb5bd; + border-color: #adb5bd; +} +.btn-check:active + .btn-outline-light:focus, +.btn-check:checked + .btn-outline-light:focus, +.btn-outline-light.active:focus, +.btn-outline-light.dropdown-toggle.show:focus, +.btn-outline-light:active:focus { + box-shadow: 0 0 0 0.25rem rgba(173, 181, 189, 0.5); +} +.btn-outline-light.disabled, +.btn-outline-light:disabled { + color: #adb5bd; + background-color: transparent; +} +.btn-outline-dark { + color: #303030; + border-color: #303030; +} +.btn-outline-dark:hover { + color: #fff; + background-color: #303030; + border-color: #303030; +} +.btn-check:focus + .btn-outline-dark, +.btn-outline-dark:focus { + box-shadow: 0 0 0 0.25rem rgba(48, 48, 48, 0.5); +} +.btn-check:active + .btn-outline-dark, +.btn-check:checked + .btn-outline-dark, +.btn-outline-dark.active, +.btn-outline-dark.dropdown-toggle.show, +.btn-outline-dark:active { + color: #fff; + background-color: #303030; + border-color: #303030; +} +.btn-check:active + .btn-outline-dark:focus, +.btn-check:checked + .btn-outline-dark:focus, +.btn-outline-dark.active:focus, +.btn-outline-dark.dropdown-toggle.show:focus, +.btn-outline-dark:active:focus { + box-shadow: 0 0 0 0.25rem rgba(48, 48, 48, 0.5); +} +.btn-outline-dark.disabled, +.btn-outline-dark:disabled { + color: #303030; + background-color: transparent; +} +.btn-link { + font-weight: 400; + color: #00bc8c; + text-decoration: underline; +} +.btn-link:hover { + color: #009670; +} +.btn-link.disabled, +.btn-link:disabled { + color: #888; +} +.btn-group-lg > .btn, +.btn-lg { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: 0.3rem; +} +.btn-group-sm > .btn, +.btn-sm { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: 0.2rem; +} +.fade { + transition: opacity 0.15s linear; +} +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} +.collapse:not(.show) { + display: none; +} +.collapsing { + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} +.collapsing.collapse-horizontal { + width: 0; + height: auto; + transition: width 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + transition: none; + } +} +.dropdown, +.dropend, +.dropstart, +.dropup { + position: relative; +} +.dropdown-toggle { + white-space: nowrap; +} +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ''; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} +.dropdown-menu { + position: absolute; + z-index: 1000; + display: none; + min-width: 10rem; + padding: 0.5rem 0; + margin: 0; + font-size: 1rem; + color: #fff; + text-align: left; + list-style: none; + background-color: #222; + background-clip: padding-box; + border: 1px solid #444; + border-radius: 0.25rem; +} +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: 0.125rem; +} +.dropdown-menu-start { + --bs-position: start; +} +.dropdown-menu-start[data-bs-popper] { + right: auto; + left: 0; +} +.dropdown-menu-end { + --bs-position: end; +} +.dropdown-menu-end[data-bs-popper] { + right: 0; + left: auto; +} +@media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start; + } + .dropdown-menu-sm-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-sm-end { + --bs-position: end; + } + .dropdown-menu-sm-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start; + } + .dropdown-menu-md-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-md-end { + --bs-position: end; + } + .dropdown-menu-md-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start; + } + .dropdown-menu-lg-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-lg-end { + --bs-position: end; + } + .dropdown-menu-lg-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start; + } + .dropdown-menu-xl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xl-end { + --bs-position: end; + } + .dropdown-menu-xl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start; + } + .dropdown-menu-xxl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xxl-end { + --bs-position: end; + } + .dropdown-menu-xxl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +.dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: 0.125rem; +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ''; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: 0.125rem; +} +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ''; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropend .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropend .dropdown-toggle::after { + vertical-align: 0; +} +.dropstart .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: 0.125rem; +} +.dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ''; +} +.dropstart .dropdown-toggle::after { + display: none; +} +.dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ''; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropstart .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropstart .dropdown-toggle::before { + vertical-align: 0; +} +.dropdown-divider { + height: 0; + margin: 0.5rem 0; + overflow: hidden; + border-top: 1px solid #444; +} +.dropdown-item { + display: block; + width: 100%; + padding: 0.25rem 1rem; + clear: both; + font-weight: 400; + color: #fff; + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; +} +.dropdown-item:focus, +.dropdown-item:hover { + color: #fff; + background-color: #375a7f; +} +.dropdown-item.active, +.dropdown-item:active { + color: #fff; + text-decoration: none; + background-color: #375a7f; +} +.dropdown-item.disabled, +.dropdown-item:disabled { + color: #adb5bd; + pointer-events: none; + background-color: transparent; +} +.dropdown-menu.show { + display: block; +} +.dropdown-header { + display: block; + padding: 0.5rem 1rem; + margin-bottom: 0; + font-size: 0.875rem; + color: #888; + white-space: nowrap; +} +.dropdown-item-text { + display: block; + padding: 0.25rem 1rem; + color: #fff; +} +.dropdown-menu-dark { + color: #dee2e6; + background-color: #303030; + border-color: #444; +} +.dropdown-menu-dark .dropdown-item { + color: #dee2e6; +} +.dropdown-menu-dark .dropdown-item:focus, +.dropdown-menu-dark .dropdown-item:hover { + color: #fff; + background-color: rgba(255, 255, 255, 0.15); +} +.dropdown-menu-dark .dropdown-item.active, +.dropdown-menu-dark .dropdown-item:active { + color: #fff; + background-color: #375a7f; +} +.dropdown-menu-dark .dropdown-item.disabled, +.dropdown-menu-dark .dropdown-item:disabled { + color: #adb5bd; +} +.dropdown-menu-dark .dropdown-divider { + border-color: #444; +} +.dropdown-menu-dark .dropdown-item-text { + color: #dee2e6; +} +.dropdown-menu-dark .dropdown-header { + color: #adb5bd; +} +.btn-group, +.btn-group-vertical { + position: relative; + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: middle; +} +.btn-group-vertical > .btn, +.btn-group > .btn { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; +} +.btn-group-vertical > .btn-check:checked + .btn, +.btn-group-vertical > .btn-check:focus + .btn, +.btn-group-vertical > .btn.active, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:hover, +.btn-group > .btn-check:checked + .btn, +.btn-group > .btn-check:focus + .btn, +.btn-group > .btn.active, +.btn-group > .btn:active, +.btn-group > .btn:focus, +.btn-group > .btn:hover { + z-index: 1; +} +.btn-toolbar { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-pack: start; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} +.btn-group > .btn-group:not(:first-child), +.btn-group > .btn:not(:first-child) { + margin-left: -1px; +} +.btn-group > .btn-group:not(:last-child) > .btn, +.btn-group > .btn:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:not(:first-child) > .btn, +.btn-group > .btn:nth-child(n + 3), +.btn-group > :not(.btn-check) + .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, +.dropend .dropdown-toggle-split::after, +.dropup .dropdown-toggle-split::after { + margin-left: 0; +} +.dropstart .dropdown-toggle-split::before { + margin-right: 0; +} +.btn-group-sm > .btn + .dropdown-toggle-split, +.btn-sm + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} +.btn-group-lg > .btn + .dropdown-toggle-split, +.btn-lg + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} +.btn-group-vertical { + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-align: start; + align-items: flex-start; + -ms-flex-pack: center; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn-group:not(:first-child), +.btn-group-vertical > .btn:not(:first-child) { + margin-top: -1px; +} +.btn-group-vertical > .btn-group:not(:last-child) > .btn, +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle) { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:not(:first-child) > .btn, +.btn-group-vertical > .btn ~ .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.nav { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav-link { + display: block; + padding: 0.5rem 2rem; + color: #00bc8c; + text-decoration: none; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none; + } +} +.nav-link:focus, +.nav-link:hover { + color: #009670; +} +.nav-link.disabled { + color: #adb5bd; + pointer-events: none; + cursor: default; +} +.nav-tabs { + border-bottom: 1px solid #444; +} +.nav-tabs .nav-link { + margin-bottom: -1px; + background: 0 0; + border: 1px solid transparent; + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.nav-tabs .nav-link:focus, +.nav-tabs .nav-link:hover { + border-color: #444 #444 transparent; + isolation: isolate; +} +.nav-tabs .nav-link.disabled { + color: #adb5bd; + background-color: transparent; + border-color: transparent; +} +.nav-tabs .nav-item.show .nav-link, +.nav-tabs .nav-link.active { + color: #fff; + background-color: #222; + border-color: #444 #444 transparent; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.nav-pills .nav-link { + background: 0 0; + border: 0; + border-radius: 0.25rem; +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: #fff; + background-color: #375a7f; +} +.nav-fill .nav-item, +.nav-fill > .nav-link { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + text-align: center; +} +.nav-justified .nav-item, +.nav-justified > .nav-link { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -ms-flex-positive: 1; + flex-grow: 1; + text-align: center; +} +.nav-fill .nav-item .nav-link, +.nav-justified .nav-item .nav-link { + width: 100%; +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.navbar { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between; + padding-top: 1rem; + padding-bottom: 1rem; +} +.navbar > .container, +.navbar > .container-fluid, +.navbar > .container-lg, +.navbar > .container-md, +.navbar > .container-sm, +.navbar > .container-xl, +.navbar > .container-xxl { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: inherit; + flex-wrap: inherit; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between; +} +.navbar-brand { + padding-top: 0.3125rem; + padding-bottom: 0.3125rem; + margin-right: 1rem; + font-size: 1.25rem; + text-decoration: none; + white-space: nowrap; +} +.navbar-nav { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link { + padding-right: 0; + padding-left: 0; +} +.navbar-nav .dropdown-menu { + position: static; +} +.navbar-text { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.navbar-collapse { + -ms-flex-preferred-size: 100%; + flex-basis: 100%; + -ms-flex-positive: 1; + flex-grow: 1; + -ms-flex-align: center; + align-items: center; +} +.navbar-toggler { + padding: 0.25rem 0.75rem; + font-size: 1.25rem; + line-height: 1; + background-color: transparent; + border: 1px solid transparent; + border-radius: 0.25rem; + transition: box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .navbar-toggler { + transition: none; + } +} +.navbar-toggler:hover { + text-decoration: none; +} +.navbar-toggler:focus { + text-decoration: none; + outline: 0; + box-shadow: 0 0 0 0.25rem; +} +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-repeat: no-repeat; + background-position: center; + background-size: 100%; +} +.navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto; +} +@media (min-width: 576px) { + .navbar-expand-sm { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-sm .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } + .navbar-expand-sm .offcanvas-header { + display: none; + } + .navbar-expand-sm .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -ms-flex-positive: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + -webkit-transform: none; + transform: none; + } + .navbar-expand-sm .offcanvas-bottom, + .navbar-expand-sm .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-sm .offcanvas-body { + display: -ms-flexbox; + display: flex; + -ms-flex-positive: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-md .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } + .navbar-expand-md .offcanvas-header { + display: none; + } + .navbar-expand-md .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -ms-flex-positive: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + -webkit-transform: none; + transform: none; + } + .navbar-expand-md .offcanvas-bottom, + .navbar-expand-md .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-md .offcanvas-body { + display: -ms-flexbox; + display: flex; + -ms-flex-positive: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-lg .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } + .navbar-expand-lg .offcanvas-header { + display: none; + } + .navbar-expand-lg .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -ms-flex-positive: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + -webkit-transform: none; + transform: none; + } + .navbar-expand-lg .offcanvas-bottom, + .navbar-expand-lg .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-lg .offcanvas-body { + display: -ms-flexbox; + display: flex; + -ms-flex-positive: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xl .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } + .navbar-expand-xl .offcanvas-header { + display: none; + } + .navbar-expand-xl .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -ms-flex-positive: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + -webkit-transform: none; + transform: none; + } + .navbar-expand-xl .offcanvas-bottom, + .navbar-expand-xl .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-xl .offcanvas-body { + display: -ms-flexbox; + display: flex; + -ms-flex-positive: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1400px) { + .navbar-expand-xxl { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -ms-flex-pack: start; + justify-content: flex-start; + } + .navbar-expand-xxl .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; + } + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; + } + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xxl .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; + } + .navbar-expand-xxl .navbar-toggler { + display: none; + } + .navbar-expand-xxl .offcanvas-header { + display: none; + } + .navbar-expand-xxl .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -ms-flex-positive: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + -webkit-transform: none; + transform: none; + } + .navbar-expand-xxl .offcanvas-bottom, + .navbar-expand-xxl .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0; + } + .navbar-expand-xxl .offcanvas-body { + display: -ms-flexbox; + display: flex; + -ms-flex-positive: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +.navbar-expand { + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -ms-flex-pack: start; + justify-content: flex-start; +} +.navbar-expand .navbar-nav { + -ms-flex-direction: row; + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: 0.5rem; + padding-left: 0.5rem; +} +.navbar-expand .navbar-nav-scroll { + overflow: visible; +} +.navbar-expand .navbar-collapse { + display: -ms-flexbox !important; + display: flex !important; + -ms-flex-preferred-size: auto; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} +.navbar-expand .offcanvas-header { + display: none; +} +.navbar-expand .offcanvas { + position: inherit; + bottom: 0; + z-index: 1000; + -ms-flex-positive: 1; + flex-grow: 1; + visibility: visible !important; + background-color: transparent; + border-right: 0; + border-left: 0; + transition: none; + -webkit-transform: none; + transform: none; +} +.navbar-expand .offcanvas-bottom, +.navbar-expand .offcanvas-top { + height: auto; + border-top: 0; + border-bottom: 0; +} +.navbar-expand .offcanvas-body { + display: -ms-flexbox; + display: flex; + -ms-flex-positive: 0; + flex-grow: 0; + padding: 0; + overflow-y: visible; +} +.navbar-light .navbar-brand { + color: #222; +} +.navbar-light .navbar-brand:focus, +.navbar-light .navbar-brand:hover { + color: #222; +} +.navbar-light .navbar-nav .nav-link { + color: rgba(34, 34, 34, 0.7); +} +.navbar-light .navbar-nav .nav-link:focus, +.navbar-light .navbar-nav .nav-link:hover { + color: #222; +} +.navbar-light .navbar-nav .nav-link.disabled { + color: rgba(0, 0, 0, 0.3); +} +.navbar-light .navbar-nav .nav-link.active, +.navbar-light .navbar-nav .show > .nav-link { + color: #222; +} +.navbar-light .navbar-toggler { + color: rgba(34, 34, 34, 0.7); + border-color: rgba(34, 34, 34, 0.1); +} +.navbar-light .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%2834, 34, 34, 0.7%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(34, 34, 34, 0.7); +} +.navbar-light .navbar-text a, +.navbar-light .navbar-text a:focus, +.navbar-light .navbar-text a:hover { + color: #222; +} +.navbar-dark .navbar-brand { + color: #fff; +} +.navbar-dark .navbar-brand:focus, +.navbar-dark .navbar-brand:hover { + color: #fff; +} +.navbar-dark .navbar-nav .nav-link { + color: rgba(255, 255, 255, 0.6); +} +.navbar-dark .navbar-nav .nav-link:focus, +.navbar-dark .navbar-nav .nav-link:hover { + color: #fff; +} +.navbar-dark .navbar-nav .nav-link.disabled { + color: rgba(255, 255, 255, 0.25); +} +.navbar-dark .navbar-nav .nav-link.active, +.navbar-dark .navbar-nav .show > .nav-link { + color: #fff; +} +.navbar-dark .navbar-toggler { + color: rgba(255, 255, 255, 0.6); + border-color: rgba(255, 255, 255, 0.1); +} +.navbar-dark .navbar-toggler-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.6%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} +.navbar-dark .navbar-text { + color: rgba(255, 255, 255, 0.6); +} +.navbar-dark .navbar-text a, +.navbar-dark .navbar-text a:focus, +.navbar-dark .navbar-text a:hover { + color: #fff; +} +.card { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + min-width: 0; + word-wrap: break-word; + background-color: #303030; + background-clip: border-box; + border: 1px solid rgba(0, 0, 0, 0.125); + border-radius: 0.25rem; +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} +.card-body { + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1rem 1rem; +} +.card-title { + margin-bottom: 0.5rem; +} +.card-subtitle { + margin-top: -0.25rem; + margin-bottom: 0; +} +.card-text:last-child { + margin-bottom: 0; +} +.card-link + .card-link { + margin-left: 1rem; +} +.card-header { + padding: 0.5rem 1rem; + margin-bottom: 0; + background-color: #444; + border-bottom: 1px solid rgba(0, 0, 0, 0.125); +} +.card-header:first-child { + border-radius: calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0; +} +.card-footer { + padding: 0.5rem 1rem; + background-color: #444; + border-top: 1px solid rgba(0, 0, 0, 0.125); +} +.card-footer:last-child { + border-radius: 0 0 calc(0.25rem - 1px) calc(0.25rem - 1px); +} +.card-header-tabs { + margin-right: -0.5rem; + margin-bottom: -0.5rem; + margin-left: -0.5rem; + border-bottom: 0; +} +.card-header-tabs .nav-link.active { + background-color: #303030; + border-bottom-color: #303030; +} +.card-header-pills { + margin-right: -0.5rem; + margin-left: -0.5rem; +} +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: 1rem; + border-radius: calc(0.25rem - 1px); +} +.card-img, +.card-img-bottom, +.card-img-top { + width: 100%; +} +.card-img, +.card-img-top { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.card-img, +.card-img-bottom { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.card-group > .card { + margin-bottom: 0.75rem; +} +@media (min-width: 576px) { + .card-group { + display: -ms-flexbox; + display: flex; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + } + .card-group > .card { + -ms-flex: 1 0 0%; + flex: 1 0 0%; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-header, + .card-group > .card:not(:last-child) .card-img-top { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) .card-footer, + .card-group > .card:not(:last-child) .card-img-bottom { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-header, + .card-group > .card:not(:first-child) .card-img-top { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) .card-footer, + .card-group > .card:not(:first-child) .card-img-bottom { + border-bottom-left-radius: 0; + } +} +.accordion-button { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + width: 100%; + padding: 1rem 1.25rem; + font-size: 1rem; + color: #fff; + text-align: left; + background-color: #222; + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, + border-radius 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none; + } +} +.accordion-button:not(.collapsed) { + color: #325172; + background-color: #ebeff2; + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.125); +} +.accordion-button:not(.collapsed)::after { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23325172'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + -webkit-transform: rotate(-180deg); + transform: rotate(-180deg); +} +.accordion-button::after { + -ms-flex-negative: 0; + flex-shrink: 0; + width: 1.25rem; + height: 1.25rem; + margin-left: auto; + content: ''; + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-size: 1.25rem; + transition: -webkit-transform 0.2s ease-in-out; + transition: transform 0.2s ease-in-out; + transition: transform 0.2s ease-in-out, -webkit-transform 0.2s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none; + } +} +.accordion-button:hover { + z-index: 2; +} +.accordion-button:focus { + z-index: 3; + border-color: #9badbf; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25); +} +.accordion-header { + margin-bottom: 0; +} +.accordion-item { + background-color: #222; + border: 1px solid rgba(0, 0, 0, 0.125); +} +.accordion-item:first-of-type { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; +} +.accordion-item:first-of-type .accordion-button { + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.accordion-item:not(:first-of-type) { + border-top: 0; +} +.accordion-item:last-of-type { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.accordion-item:last-of-type .accordion-button.collapsed { + border-bottom-right-radius: calc(0.25rem - 1px); + border-bottom-left-radius: calc(0.25rem - 1px); +} +.accordion-item:last-of-type .accordion-collapse { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.accordion-body { + padding: 1rem 1.25rem; +} +.accordion-flush .accordion-collapse { + border-width: 0; +} +.accordion-flush .accordion-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.accordion-flush .accordion-item:first-child { + border-top: 0; +} +.accordion-flush .accordion-item:last-child { + border-bottom: 0; +} +.accordion-flush .accordion-item .accordion-button { + border-radius: 0; +} +.breadcrumb { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + padding: 0.375rem 0.75rem; + margin-bottom: 1rem; + list-style: none; + background-color: #444; + border-radius: 0.25rem; +} +.breadcrumb-item + .breadcrumb-item { + padding-left: 0.5rem; +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: 0.5rem; + color: #888; + content: var(--bs-breadcrumb-divider, '/'); +} +.breadcrumb-item.active { + color: #888; +} +.pagination { + display: -ms-flexbox; + display: flex; + padding-left: 0; + list-style: none; +} +.page-link { + position: relative; + display: block; + color: #fff; + text-decoration: none; + background-color: #00bc8c; + border: 0 solid transparent; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, + border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .page-link { + transition: none; + } +} +.page-link:hover { + z-index: 2; + color: #fff; + background-color: #00efb2; + border-color: transparent; +} +.page-link:focus { + z-index: 3; + color: #009670; + background-color: #ebebeb; + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25); +} +.page-item:not(:first-child) .page-link { + margin-left: 0; +} +.page-item.active .page-link { + z-index: 3; + color: #fff; + background-color: #00efb2; + border-color: transparent; +} +.page-item.disabled .page-link { + color: #fff; + pointer-events: none; + background-color: #007053; + border-color: transparent; +} +.page-link { + padding: 0.375rem 0.75rem; +} +.page-item:first-child .page-link { + border-top-left-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; +} +.page-item:last-child .page-link { + border-top-right-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} +.pagination-lg .page-link { + padding: 0.75rem 1.5rem; + font-size: 1.25rem; +} +.pagination-lg .page-item:first-child .page-link { + border-top-left-radius: 0.3rem; + border-bottom-left-radius: 0.3rem; +} +.pagination-lg .page-item:last-child .page-link { + border-top-right-radius: 0.3rem; + border-bottom-right-radius: 0.3rem; +} +.pagination-sm .page-link { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; +} +.pagination-sm .page-item:first-child .page-link { + border-top-left-radius: 0.2rem; + border-bottom-left-radius: 0.2rem; +} +.pagination-sm .page-item:last-child .page-link { + border-top-right-radius: 0.2rem; + border-bottom-right-radius: 0.2rem; +} +.badge { + display: inline-block; + padding: 0.35em 0.65em; + font-size: 0.75em; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: 0.25rem; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.alert { + position: relative; + padding: 1rem 1rem; + margin-bottom: 1rem; + border: 1px solid transparent; + border-radius: 0.25rem; +} +.alert-heading { + color: inherit; +} +.alert-link { + font-weight: 700; +} +.alert-dismissible { + padding-right: 3rem; +} +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; +} +.alert-primary { + color: #21364c; + background-color: #d7dee5; + border-color: #c3ced9; +} +.alert-primary .alert-link { + color: #1a2b3d; +} +.alert-secondary { + color: #292929; + background-color: #dadada; + border-color: #c7c7c7; +} +.alert-secondary .alert-link { + color: #212121; +} +.alert-success { + color: #007154; + background-color: #ccf2e8; + border-color: #b3ebdd; +} +.alert-success .alert-link { + color: #005a43; +} +.alert-info { + color: #1f5b83; + background-color: #d6eaf8; + border-color: #c2e0f4; +} +.alert-info .alert-link { + color: #194969; +} +.alert-warning { + color: #925e0b; + background-color: #fdebd0; + border-color: #fbe1b8; +} +.alert-warning .alert-link { + color: #754b09; +} +.alert-danger { + color: #8b2e24; + background-color: #fadbd8; + border-color: #f8c9c5; +} +.alert-danger .alert-link { + color: #6f251d; +} +.alert-light { + color: #686d71; + background-color: #eff0f2; + border-color: #e6e9eb; +} +.alert-light .alert-link { + color: #53575a; +} +.alert-dark { + color: #1d1d1d; + background-color: #d6d6d6; + border-color: #c1c1c1; +} +.alert-dark .alert-link { + color: #171717; +} +@-webkit-keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} +@keyframes progress-bar-stripes { + 0% { + background-position-x: 1rem; + } +} +.progress { + display: -ms-flexbox; + display: flex; + height: 1rem; + overflow: hidden; + font-size: 0.75rem; + background-color: #444; + border-radius: 0.25rem; +} +.progress-bar { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-pack: center; + justify-content: center; + overflow: hidden; + color: #fff; + text-align: center; + white-space: nowrap; + background-color: #375a7f; + transition: width 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} +.progress-bar-striped { + background-image: linear-gradient( + 45deg, + rgba(255, 255, 255, 0.15) 25%, + transparent 25%, + transparent 50%, + rgba(255, 255, 255, 0.15) 50%, + rgba(255, 255, 255, 0.15) 75%, + transparent 75%, + transparent + ); + background-size: 1rem 1rem; +} +.progress-bar-animated { + -webkit-animation: 1s linear infinite progress-bar-stripes; + animation: 1s linear infinite progress-bar-stripes; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + -webkit-animation: none; + animation: none; + } +} +.list-group { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: 0.25rem; +} +.list-group-numbered { + list-style-type: none; + counter-reset: section; +} +.list-group-numbered > li::before { + content: counters(section, '.') '. '; + counter-increment: section; +} +.list-group-item-action { + width: 100%; + color: #444; + text-align: inherit; +} +.list-group-item-action:focus, +.list-group-item-action:hover { + z-index: 1; + color: #fff; + text-decoration: none; + background-color: #444; +} +.list-group-item-action:active { + color: #fff; + background-color: #222; +} +.list-group-item { + position: relative; + display: block; + padding: 0.5rem 1rem; + color: #fff; + text-decoration: none; + background-color: #303030; + border: 1px solid #444; +} +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} +.list-group-item.disabled, +.list-group-item:disabled { + color: #888; + pointer-events: none; + background-color: #303030; +} +.list-group-item.active { + z-index: 2; + color: #fff; + background-color: #375a7f; + border-color: #375a7f; +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: -1px; + border-top-width: 1px; +} +.list-group-horizontal { + -ms-flex-direction: row; + flex-direction: row; +} +.list-group-horizontal > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; +} +.list-group-horizontal > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; +} +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; +} +@media (min-width: 576px) { + .list-group-horizontal-sm { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 768px) { + .list-group-horizontal-md { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 992px) { + .list-group-horizontal-lg { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 1200px) { + .list-group-horizontal-xl { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + -ms-flex-direction: row; + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item:first-child { + border-bottom-left-radius: 0.25rem; + border-top-right-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item:last-child { + border-top-right-radius: 0.25rem; + border-bottom-left-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: 1px; + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: -1px; + border-left-width: 1px; + } +} +.list-group-flush { + border-radius: 0; +} +.list-group-flush > .list-group-item { + border-width: 0 0 1px; +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} +.list-group-item-primary { + color: #21364c; + background-color: #d7dee5; +} +.list-group-item-primary.list-group-item-action:focus, +.list-group-item-primary.list-group-item-action:hover { + color: #21364c; + background-color: #c2c8ce; +} +.list-group-item-primary.list-group-item-action.active { + color: #fff; + background-color: #21364c; + border-color: #21364c; +} +.list-group-item-secondary { + color: #292929; + background-color: #dadada; +} +.list-group-item-secondary.list-group-item-action:focus, +.list-group-item-secondary.list-group-item-action:hover { + color: #292929; + background-color: #c4c4c4; +} +.list-group-item-secondary.list-group-item-action.active { + color: #fff; + background-color: #292929; + border-color: #292929; +} +.list-group-item-success { + color: #007154; + background-color: #ccf2e8; +} +.list-group-item-success.list-group-item-action:focus, +.list-group-item-success.list-group-item-action:hover { + color: #007154; + background-color: #b8dad1; +} +.list-group-item-success.list-group-item-action.active { + color: #fff; + background-color: #007154; + border-color: #007154; +} +.list-group-item-info { + color: #1f5b83; + background-color: #d6eaf8; +} +.list-group-item-info.list-group-item-action:focus, +.list-group-item-info.list-group-item-action:hover { + color: #1f5b83; + background-color: #c1d3df; +} +.list-group-item-info.list-group-item-action.active { + color: #fff; + background-color: #1f5b83; + border-color: #1f5b83; +} +.list-group-item-warning { + color: #925e0b; + background-color: #fdebd0; +} +.list-group-item-warning.list-group-item-action:focus, +.list-group-item-warning.list-group-item-action:hover { + color: #925e0b; + background-color: #e4d4bb; +} +.list-group-item-warning.list-group-item-action.active { + color: #fff; + background-color: #925e0b; + border-color: #925e0b; +} +.list-group-item-danger { + color: #8b2e24; + background-color: #fadbd8; +} +.list-group-item-danger.list-group-item-action:focus, +.list-group-item-danger.list-group-item-action:hover { + color: #8b2e24; + background-color: #e1c5c2; +} +.list-group-item-danger.list-group-item-action.active { + color: #fff; + background-color: #8b2e24; + border-color: #8b2e24; +} +.list-group-item-light { + color: #686d71; + background-color: #eff0f2; +} +.list-group-item-light.list-group-item-action:focus, +.list-group-item-light.list-group-item-action:hover { + color: #686d71; + background-color: #d7d8da; +} +.list-group-item-light.list-group-item-action.active { + color: #fff; + background-color: #686d71; + border-color: #686d71; +} +.list-group-item-dark { + color: #1d1d1d; + background-color: #d6d6d6; +} +.list-group-item-dark.list-group-item-action:focus, +.list-group-item-dark.list-group-item-action:hover { + color: #1d1d1d; + background-color: #c1c1c1; +} +.list-group-item-dark.list-group-item-action.active { + color: #fff; + background-color: #1d1d1d; + border-color: #1d1d1d; +} +.btn-close { + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: #fff; + background: transparent + url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M.293.293a1 1 0 011.414 0L8 6.586 14.293.293a1 1 0 111.414 1.414L9.414 8l6.293 6.293a1 1 0 01-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 01-1.414-1.414L6.586 8 .293 1.707a1 1 0 010-1.414z'/%3e%3c/svg%3e") + center/1em auto no-repeat; + border: 0; + border-radius: 0.25rem; + opacity: 0.4; +} +.btn-close:hover { + color: #fff; + text-decoration: none; + opacity: 1; +} +.btn-close:focus { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(55, 90, 127, 0.25); + opacity: 1; +} +.btn-close.disabled, +.btn-close:disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + opacity: 0.25; +} +.btn-close-white { + -webkit-filter: invert(1) grayscale(100%) brightness(200%); + filter: invert(1) grayscale(100%) brightness(200%); +} +.toast { + width: 350px; + max-width: 100%; + font-size: 0.875rem; + pointer-events: auto; + background-color: #444; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.1); + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + border-radius: 0.25rem; +} +.toast.showing { + opacity: 0; +} +.toast:not(.show) { + display: none; +} +.toast-container { + width: -webkit-max-content; + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none; +} +.toast-container > :not(:last-child) { + margin-bottom: 0.75rem; +} +.toast-header { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + padding: 0.5rem 0.75rem; + color: #888; + background-color: #303030; + background-clip: padding-box; + border-bottom: 1px solid rgba(0, 0, 0, 0.05); + border-top-left-radius: calc(0.25rem - 1px); + border-top-right-radius: calc(0.25rem - 1px); +} +.toast-header .btn-close { + margin-right: -0.375rem; + margin-left: 0.75rem; +} +.toast-body { + padding: 0.75rem; + word-wrap: break-word; +} +.modal { + position: fixed; + top: 0; + left: 0; + z-index: 1055; + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; +} +.modal-dialog { + position: relative; + width: auto; + margin: 0.5rem; + pointer-events: none; +} +.modal.fade .modal-dialog { + transition: -webkit-transform 0.3s ease-out; + transition: transform 0.3s ease-out; + transition: transform 0.3s ease-out, -webkit-transform 0.3s ease-out; + -webkit-transform: translate(0, -50px); + transform: translate(0, -50px); +} +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + -webkit-transform: none; + transform: none; +} +.modal.modal-static .modal-dialog { + -webkit-transform: scale(1.02); + transform: scale(1.02); +} +.modal-dialog-scrollable { + height: calc(100% - 1rem); +} +.modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden; +} +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} +.modal-dialog-centered { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + min-height: calc(100% - 1rem); +} +.modal-content { + position: relative; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + width: 100%; + pointer-events: auto; + background-color: #303030; + background-clip: padding-box; + border: 1px solid #444; + border-radius: 0.3rem; + outline: 0; +} +.modal-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1050; + width: 100vw; + height: 100vh; + background-color: #000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: 0.5; +} +.modal-header { + display: -ms-flexbox; + display: flex; + -ms-flex-negative: 0; + flex-shrink: 0; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 1rem 1rem; + border-bottom: 1px solid #444; + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.modal-header .btn-close { + padding: 0.5rem 0.5rem; + margin: -0.5rem -0.5rem -0.5rem auto; +} +.modal-title { + margin-bottom: 0; + line-height: 1.5; +} +.modal-body { + position: relative; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + padding: 1rem; +} +.modal-footer { + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -ms-flex-negative: 0; + flex-shrink: 0; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: end; + justify-content: flex-end; + padding: 0.75rem; + border-top: 1px solid #444; + border-bottom-right-radius: calc(0.3rem - 1px); + border-bottom-left-radius: calc(0.3rem - 1px); +} +.modal-footer > * { + margin: 0.25rem; +} +@media (min-width: 576px) { + .modal-dialog { + max-width: 500px; + margin: 1.75rem auto; + } + .modal-dialog-scrollable { + height: calc(100% - 3.5rem); + } + .modal-dialog-centered { + min-height: calc(100% - 3.5rem); + } + .modal-sm { + max-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + max-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + max-width: 1140px; + } +} +.modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; +} +.modal-fullscreen .modal-content { + height: 100%; + border: 0; + border-radius: 0; +} +.modal-fullscreen .modal-header { + border-radius: 0; +} +.modal-fullscreen .modal-body { + overflow-y: auto; +} +.modal-fullscreen .modal-footer { + border-radius: 0; +} +@media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-sm-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 767.98px) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-md-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-md-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-lg-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-xl-down .modal-footer { + border-radius: 0; + } +} +@media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-header { + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } + .modal-fullscreen-xxl-down .modal-footer { + border-radius: 0; + } +} +.tooltip { + position: absolute; + z-index: 1080; + display: block; + margin: 0; + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: 0.9; +} +.tooltip .tooltip-arrow { + position: absolute; + display: block; + width: 0.8rem; + height: 0.4rem; +} +.tooltip .tooltip-arrow::before { + position: absolute; + content: ''; + border-color: transparent; + border-style: solid; +} +.bs-tooltip-auto[data-popper-placement^='top'], +.bs-tooltip-top { + padding: 0.4rem 0; +} +.bs-tooltip-auto[data-popper-placement^='top'] .tooltip-arrow, +.bs-tooltip-top .tooltip-arrow { + bottom: 0; +} +.bs-tooltip-auto[data-popper-placement^='top'] .tooltip-arrow::before, +.bs-tooltip-top .tooltip-arrow::before { + top: -1px; + border-width: 0.4rem 0.4rem 0; + border-top-color: #000; +} +.bs-tooltip-auto[data-popper-placement^='right'], +.bs-tooltip-end { + padding: 0 0.4rem; +} +.bs-tooltip-auto[data-popper-placement^='right'] .tooltip-arrow, +.bs-tooltip-end .tooltip-arrow { + left: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-auto[data-popper-placement^='right'] .tooltip-arrow::before, +.bs-tooltip-end .tooltip-arrow::before { + right: -1px; + border-width: 0.4rem 0.4rem 0.4rem 0; + border-right-color: #000; +} +.bs-tooltip-auto[data-popper-placement^='bottom'], +.bs-tooltip-bottom { + padding: 0.4rem 0; +} +.bs-tooltip-auto[data-popper-placement^='bottom'] .tooltip-arrow, +.bs-tooltip-bottom .tooltip-arrow { + top: 0; +} +.bs-tooltip-auto[data-popper-placement^='bottom'] .tooltip-arrow::before, +.bs-tooltip-bottom .tooltip-arrow::before { + bottom: -1px; + border-width: 0 0.4rem 0.4rem; + border-bottom-color: #000; +} +.bs-tooltip-auto[data-popper-placement^='left'], +.bs-tooltip-start { + padding: 0 0.4rem; +} +.bs-tooltip-auto[data-popper-placement^='left'] .tooltip-arrow, +.bs-tooltip-start .tooltip-arrow { + right: 0; + width: 0.4rem; + height: 0.8rem; +} +.bs-tooltip-auto[data-popper-placement^='left'] .tooltip-arrow::before, +.bs-tooltip-start .tooltip-arrow::before { + left: -1px; + border-width: 0.4rem 0 0.4rem 0.4rem; + border-left-color: #000; +} +.tooltip-inner { + max-width: 200px; + padding: 0.25rem 0.5rem; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 0.25rem; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1070; + display: block; + max-width: 276px; + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + white-space: normal; + line-break: auto; + font-size: 0.875rem; + word-wrap: break-word; + background-color: #303030; + background-clip: padding-box; + border: 1px solid rgba(0, 0, 0, 0.2); + border-radius: 0.3rem; +} +.popover .popover-arrow { + position: absolute; + display: block; + width: 1rem; + height: 0.5rem; +} +.popover .popover-arrow::after, +.popover .popover-arrow::before { + position: absolute; + display: block; + content: ''; + border-color: transparent; + border-style: solid; +} +.bs-popover-auto[data-popper-placement^='top'] > .popover-arrow, +.bs-popover-top > .popover-arrow { + bottom: calc(-0.5rem - 1px); +} +.bs-popover-auto[data-popper-placement^='top'] > .popover-arrow::before, +.bs-popover-top > .popover-arrow::before { + bottom: 0; + border-width: 0.5rem 0.5rem 0; + border-top-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-auto[data-popper-placement^='top'] > .popover-arrow::after, +.bs-popover-top > .popover-arrow::after { + bottom: 1px; + border-width: 0.5rem 0.5rem 0; + border-top-color: #303030; +} +.bs-popover-auto[data-popper-placement^='right'] > .popover-arrow, +.bs-popover-end > .popover-arrow { + left: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; +} +.bs-popover-auto[data-popper-placement^='right'] > .popover-arrow::before, +.bs-popover-end > .popover-arrow::before { + left: 0; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-auto[data-popper-placement^='right'] > .popover-arrow::after, +.bs-popover-end > .popover-arrow::after { + left: 1px; + border-width: 0.5rem 0.5rem 0.5rem 0; + border-right-color: #303030; +} +.bs-popover-auto[data-popper-placement^='bottom'] > .popover-arrow, +.bs-popover-bottom > .popover-arrow { + top: calc(-0.5rem - 1px); +} +.bs-popover-auto[data-popper-placement^='bottom'] > .popover-arrow::before, +.bs-popover-bottom > .popover-arrow::before { + top: 0; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-auto[data-popper-placement^='bottom'] > .popover-arrow::after, +.bs-popover-bottom > .popover-arrow::after { + top: 1px; + border-width: 0 0.5rem 0.5rem 0.5rem; + border-bottom-color: #303030; +} +.bs-popover-auto[data-popper-placement^='bottom'] .popover-header::before, +.bs-popover-bottom .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: 1rem; + margin-left: -0.5rem; + content: ''; + border-bottom: 1px solid #444; +} +.bs-popover-auto[data-popper-placement^='left'] > .popover-arrow, +.bs-popover-start > .popover-arrow { + right: calc(-0.5rem - 1px); + width: 0.5rem; + height: 1rem; +} +.bs-popover-auto[data-popper-placement^='left'] > .popover-arrow::before, +.bs-popover-start > .popover-arrow::before { + right: 0; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: rgba(0, 0, 0, 0.25); +} +.bs-popover-auto[data-popper-placement^='left'] > .popover-arrow::after, +.bs-popover-start > .popover-arrow::after { + right: 1px; + border-width: 0.5rem 0 0.5rem 0.5rem; + border-left-color: #303030; +} +.popover-header { + padding: 0.5rem 1rem; + margin-bottom: 0; + font-size: 1rem; + background-color: #444; + border-bottom: 1px solid rgba(0, 0, 0, 0.2); + border-top-left-radius: calc(0.3rem - 1px); + border-top-right-radius: calc(0.3rem - 1px); +} +.popover-header:empty { + display: none; +} +.popover-body { + padding: 1rem 1rem; + color: #fff; +} +.carousel { + position: relative; +} +.carousel.pointer-event { + -ms-touch-action: pan-y; + touch-action: pan-y; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ''; +} +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + transition: -webkit-transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out; + transition: transform 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} +.carousel-item-next, +.carousel-item-prev, +.carousel-item.active { + display: block; +} +.active.carousel-item-end, +.carousel-item-next:not(.carousel-item-start) { + -webkit-transform: translateX(100%); + transform: translateX(100%); +} +.active.carousel-item-start, +.carousel-item-prev:not(.carousel-item-end) { + -webkit-transform: translateX(-100%); + transform: translateX(-100%); +} +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + -webkit-transform: none; + transform: none; +} +.carousel-fade .carousel-item-next.carousel-item-start, +.carousel-fade .carousel-item-prev.carousel-item-end, +.carousel-fade .carousel-item.active { + z-index: 1; + opacity: 1; +} +.carousel-fade .active.carousel-item-end, +.carousel-fade .active.carousel-item-start { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-end, + .carousel-fade .active.carousel-item-start { + transition: none; + } +} +.carousel-control-next, +.carousel-control-prev { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: center; + justify-content: center; + width: 15%; + padding: 0; + color: #fff; + text-align: center; + background: 0 0; + border: 0; + opacity: 0.5; + transition: opacity 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-control-next, + .carousel-control-prev { + transition: none; + } +} +.carousel-control-next:focus, +.carousel-control-next:hover, +.carousel-control-prev:focus, +.carousel-control-prev:hover { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} +.carousel-control-prev { + left: 0; +} +.carousel-control-next { + right: 0; +} +.carousel-control-next-icon, +.carousel-control-prev-icon { + display: inline-block; + width: 2rem; + height: 2rem; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0z'/%3e%3c/svg%3e"); +} +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); +} +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: center; + justify-content: center; + padding: 0; + margin-right: 15%; + margin-bottom: 1rem; + margin-left: 15%; + list-style: none; +} +.carousel-indicators [data-bs-target] { + box-sizing: content-box; + -ms-flex: 0 1 auto; + flex: 0 1 auto; + width: 30px; + height: 3px; + padding: 0; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: #fff; + background-clip: padding-box; + border: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-indicators [data-bs-target] { + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 1.25rem; + left: 15%; + padding-top: 1.25rem; + padding-bottom: 1.25rem; + color: #fff; + text-align: center; +} +.carousel-dark .carousel-control-next-icon, +.carousel-dark .carousel-control-prev-icon { + -webkit-filter: invert(1) grayscale(100); + filter: invert(1) grayscale(100); +} +.carousel-dark .carousel-indicators [data-bs-target] { + background-color: #000; +} +.carousel-dark .carousel-caption { + color: #000; +} +@-webkit-keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@keyframes spinner-border { + to { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +.spinner-border { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: -0.125em; + border: 0.25em solid currentColor; + border-right-color: transparent; + border-radius: 50%; + -webkit-animation: 0.75s linear infinite spinner-border; + animation: 0.75s linear infinite spinner-border; +} +.spinner-border-sm { + width: 1rem; + height: 1rem; + border-width: 0.2em; +} +@-webkit-keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} +@keyframes spinner-grow { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} +.spinner-grow { + display: inline-block; + width: 2rem; + height: 2rem; + vertical-align: -0.125em; + background-color: currentColor; + border-radius: 50%; + opacity: 0; + -webkit-animation: 0.75s linear infinite spinner-grow; + animation: 0.75s linear infinite spinner-grow; +} +.spinner-grow-sm { + width: 1rem; + height: 1rem; +} +@media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + -webkit-animation-duration: 1.5s; + animation-duration: 1.5s; + } +} +.offcanvas { + position: fixed; + bottom: 0; + z-index: 1045; + display: -ms-flexbox; + display: flex; + -ms-flex-direction: column; + flex-direction: column; + max-width: 100%; + visibility: hidden; + background-color: #303030; + background-clip: padding-box; + outline: 0; + transition: -webkit-transform 0.3s ease-in-out; + transition: transform 0.3s ease-in-out; + transition: transform 0.3s ease-in-out, -webkit-transform 0.3s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none; + } +} +.offcanvas-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} +.offcanvas-backdrop.fade { + opacity: 0; +} +.offcanvas-backdrop.show { + opacity: 0.5; +} +.offcanvas-header { + display: -ms-flexbox; + display: flex; + -ms-flex-align: center; + align-items: center; + -ms-flex-pack: justify; + justify-content: space-between; + padding: 1rem 1rem; +} +.offcanvas-header .btn-close { + padding: 0.5rem 0.5rem; + margin-top: -0.5rem; + margin-right: -0.5rem; + margin-bottom: -0.5rem; +} +.offcanvas-title { + margin-bottom: 0; + line-height: 1.5; +} +.offcanvas-body { + -ms-flex-positive: 1; + flex-grow: 1; + padding: 1rem 1rem; + overflow-y: auto; +} +.offcanvas-start { + top: 0; + left: 0; + width: 400px; + border-right: 1px solid #444; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); +} +.offcanvas-end { + top: 0; + right: 0; + width: 400px; + border-left: 1px solid #444; + -webkit-transform: translateX(100%); + transform: translateX(100%); +} +.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: 30vh; + max-height: 100%; + border-bottom: 1px solid #444; + -webkit-transform: translateY(-100%); + transform: translateY(-100%); +} +.offcanvas-bottom { + right: 0; + left: 0; + height: 30vh; + max-height: 100%; + border-top: 1px solid #444; + -webkit-transform: translateY(100%); + transform: translateY(100%); +} +.offcanvas.show { + -webkit-transform: none; + transform: none; +} +.placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentColor; + opacity: 0.5; +} +.placeholder.btn::before { + display: inline-block; + content: ''; +} +.placeholder-xs { + min-height: 0.6em; +} +.placeholder-sm { + min-height: 0.8em; +} +.placeholder-lg { + min-height: 1.2em; +} +.placeholder-glow .placeholder { + -webkit-animation: placeholder-glow 2s ease-in-out infinite; + animation: placeholder-glow 2s ease-in-out infinite; +} +@-webkit-keyframes placeholder-glow { + 50% { + opacity: 0.2; + } +} +@keyframes placeholder-glow { + 50% { + opacity: 0.2; + } +} +.placeholder-wave { + -webkit-mask-image: linear-gradient( + 130deg, + #000 55%, + rgba(0, 0, 0, 0.8) 75%, + #000 95% + ); + mask-image: linear-gradient( + 130deg, + #000 55%, + rgba(0, 0, 0, 0.8) 75%, + #000 95% + ); + -webkit-mask-size: 200% 100%; + mask-size: 200% 100%; + -webkit-animation: placeholder-wave 2s linear infinite; + animation: placeholder-wave 2s linear infinite; +} +@-webkit-keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0; + mask-position: -200% 0; + } +} +@keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0; + mask-position: -200% 0; + } +} +.clearfix::after { + display: block; + clear: both; + content: ''; +} +.link-primary { + color: #375a7f; +} +.link-primary:focus, +.link-primary:hover { + color: #2c4866; +} +.link-secondary { + color: #444; +} +.link-secondary:focus, +.link-secondary:hover { + color: #363636; +} +.link-success { + color: #00bc8c; +} +.link-success:focus, +.link-success:hover { + color: #009670; +} +.link-info { + color: #3498db; +} +.link-info:focus, +.link-info:hover { + color: #2a7aaf; +} +.link-warning { + color: #f39c12; +} +.link-warning:focus, +.link-warning:hover { + color: #c27d0e; +} +.link-danger { + color: #e74c3c; +} +.link-danger:focus, +.link-danger:hover { + color: #b93d30; +} +.link-light { + color: #adb5bd; +} +.link-light:focus, +.link-light:hover { + color: #8a9197; +} +.link-dark { + color: #303030; +} +.link-dark:focus, +.link-dark:hover { + color: #262626; +} +.ratio { + position: relative; + width: 100%; +} +.ratio::before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: ''; +} +.ratio > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ratio-1x1 { + --bs-aspect-ratio: 100%; +} +.ratio-4x3 { + --bs-aspect-ratio: calc(3 / 4 * 100%); +} +.ratio-16x9 { + --bs-aspect-ratio: calc(9 / 16 * 100%); +} +.ratio-21x9 { + --bs-aspect-ratio: calc(9 / 21 * 100%); +} +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} +.sticky-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; +} +@media (min-width: 576px) { + .sticky-sm-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 768px) { + .sticky-md-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 992px) { + .sticky-lg-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 1200px) { + .sticky-xl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +@media (min-width: 1400px) { + .sticky-xxl-top { + position: -webkit-sticky; + position: sticky; + top: 0; + z-index: 1020; + } +} +.hstack { + display: -ms-flexbox; + display: flex; + -ms-flex-direction: row; + flex-direction: row; + -ms-flex-align: center; + align-items: center; + -ms-flex-item-align: stretch; + align-self: stretch; +} +.vstack { + display: -ms-flexbox; + display: flex; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + -ms-flex-direction: column; + flex-direction: column; + -ms-flex-item-align: stretch; + align-self: stretch; +} +.visually-hidden, +.visually-hidden-focusable:not(:focus):not(:focus-within) { + position: absolute !important; + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: ''; +} +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.vr { + display: inline-block; + -ms-flex-item-align: stretch; + align-self: stretch; + width: 1px; + min-height: 1em; + background-color: currentColor; + opacity: 0.25; +} +.align-baseline { + vertical-align: baseline !important; +} +.align-top { + vertical-align: top !important; +} +.align-middle { + vertical-align: middle !important; +} +.align-bottom { + vertical-align: bottom !important; +} +.align-text-bottom { + vertical-align: text-bottom !important; +} +.align-text-top { + vertical-align: text-top !important; +} +.float-start { + float: left !important; +} +.float-end { + float: right !important; +} +.float-none { + float: none !important; +} +.opacity-0 { + opacity: 0 !important; +} +.opacity-25 { + opacity: 0.25 !important; +} +.opacity-50 { + opacity: 0.5 !important; +} +.opacity-75 { + opacity: 0.75 !important; +} +.opacity-100 { + opacity: 1 !important; +} +.overflow-auto { + overflow: auto !important; +} +.overflow-hidden { + overflow: hidden !important; +} +.overflow-visible { + overflow: visible !important; +} +.overflow-scroll { + overflow: scroll !important; +} +.d-inline { + display: inline !important; +} +.d-inline-block { + display: inline-block !important; +} +.d-block { + display: block !important; +} +.d-grid { + display: grid !important; +} +.d-table { + display: table !important; +} +.d-table-row { + display: table-row !important; +} +.d-table-cell { + display: table-cell !important; +} +.d-flex { + display: -ms-flexbox !important; + display: flex !important; +} +.d-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; +} +.d-none { + display: none !important; +} +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; +} +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; +} +.shadow-none { + box-shadow: none !important; +} +.position-static { + position: static !important; +} +.position-relative { + position: relative !important; +} +.position-absolute { + position: absolute !important; +} +.position-fixed { + position: fixed !important; +} +.position-sticky { + position: -webkit-sticky !important; + position: sticky !important; +} +.top-0 { + top: 0 !important; +} +.top-50 { + top: 50% !important; +} +.top-100 { + top: 100% !important; +} +.bottom-0 { + bottom: 0 !important; +} +.bottom-50 { + bottom: 50% !important; +} +.bottom-100 { + bottom: 100% !important; +} +.start-0 { + left: 0 !important; +} +.start-50 { + left: 50% !important; +} +.start-100 { + left: 100% !important; +} +.end-0 { + right: 0 !important; +} +.end-50 { + right: 50% !important; +} +.end-100 { + right: 100% !important; +} +.translate-middle { + -webkit-transform: translate(-50%, -50%) !important; + transform: translate(-50%, -50%) !important; +} +.translate-middle-x { + -webkit-transform: translateX(-50%) !important; + transform: translateX(-50%) !important; +} +.translate-middle-y { + -webkit-transform: translateY(-50%) !important; + transform: translateY(-50%) !important; +} +.border { + border: 1px solid #dee2e6 !important; +} +.border-0 { + border: 0 !important; +} +.border-top { + border-top: 1px solid #dee2e6 !important; +} +.border-top-0 { + border-top: 0 !important; +} +.border-end { + border-right: 1px solid #dee2e6 !important; +} +.border-end-0 { + border-right: 0 !important; +} +.border-bottom { + border-bottom: 1px solid #dee2e6 !important; +} +.border-bottom-0 { + border-bottom: 0 !important; +} +.border-start { + border-left: 1px solid #dee2e6 !important; +} +.border-start-0 { + border-left: 0 !important; +} +.border-primary { + border-color: #375a7f !important; +} +.border-secondary { + border-color: #444 !important; +} +.border-success { + border-color: #00bc8c !important; +} +.border-info { + border-color: #3498db !important; +} +.border-warning { + border-color: #f39c12 !important; +} +.border-danger { + border-color: #e74c3c !important; +} +.border-light { + border-color: #adb5bd !important; +} +.border-dark { + border-color: #303030 !important; +} +.border-white { + border-color: #fff !important; +} +.border-1 { + border-width: 1px !important; +} +.border-2 { + border-width: 2px !important; +} +.border-3 { + border-width: 3px !important; +} +.border-4 { + border-width: 4px !important; +} +.border-5 { + border-width: 5px !important; +} +.w-25 { + width: 25% !important; +} +.w-50 { + width: 50% !important; +} +.w-75 { + width: 75% !important; +} +.w-100 { + width: 100% !important; +} +.w-auto { + width: auto !important; +} +.mw-100 { + max-width: 100% !important; +} +.vw-100 { + width: 100vw !important; +} +.min-vw-100 { + min-width: 100vw !important; +} +.h-25 { + height: 25% !important; +} +.h-50 { + height: 50% !important; +} +.h-75 { + height: 75% !important; +} +.h-100 { + height: 100% !important; +} +.h-auto { + height: auto !important; +} +.mh-100 { + max-height: 100% !important; +} +.vh-100 { + height: 100vh !important; +} +.min-vh-100 { + min-height: 100vh !important; +} +.flex-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; +} +.flex-row { + -ms-flex-direction: row !important; + flex-direction: row !important; +} +.flex-column { + -ms-flex-direction: column !important; + flex-direction: column !important; +} +.flex-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; +} +.flex-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; +} +.flex-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; +} +.flex-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; +} +.flex-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; +} +.flex-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; +} +.flex-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; +} +.flex-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; +} +.flex-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; +} +.gap-0 { + gap: 0 !important; +} +.gap-1 { + gap: 0.25rem !important; +} +.gap-2 { + gap: 0.5rem !important; +} +.gap-3 { + gap: 1rem !important; +} +.gap-4 { + gap: 1.5rem !important; +} +.gap-5 { + gap: 3rem !important; +} +.justify-content-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; +} +.justify-content-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; +} +.justify-content-center { + -ms-flex-pack: center !important; + justify-content: center !important; +} +.justify-content-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; +} +.justify-content-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; +} +.justify-content-evenly { + -ms-flex-pack: space-evenly !important; + justify-content: space-evenly !important; +} +.align-items-start { + -ms-flex-align: start !important; + align-items: flex-start !important; +} +.align-items-end { + -ms-flex-align: end !important; + align-items: flex-end !important; +} +.align-items-center { + -ms-flex-align: center !important; + align-items: center !important; +} +.align-items-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; +} +.align-items-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; +} +.align-content-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; +} +.align-content-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; +} +.align-content-center { + -ms-flex-line-pack: center !important; + align-content: center !important; +} +.align-content-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; +} +.align-content-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; +} +.align-content-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; +} +.align-self-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; +} +.align-self-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; +} +.align-self-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; +} +.align-self-center { + -ms-flex-item-align: center !important; + align-self: center !important; +} +.align-self-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; +} +.align-self-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; +} +.order-first { + -ms-flex-order: -1 !important; + order: -1 !important; +} +.order-0 { + -ms-flex-order: 0 !important; + order: 0 !important; +} +.order-1 { + -ms-flex-order: 1 !important; + order: 1 !important; +} +.order-2 { + -ms-flex-order: 2 !important; + order: 2 !important; +} +.order-3 { + -ms-flex-order: 3 !important; + order: 3 !important; +} +.order-4 { + -ms-flex-order: 4 !important; + order: 4 !important; +} +.order-5 { + -ms-flex-order: 5 !important; + order: 5 !important; +} +.order-last { + -ms-flex-order: 6 !important; + order: 6 !important; +} +.m-0 { + margin: 0 !important; +} +.m-1 { + margin: 0.25rem !important; +} +.m-2 { + margin: 0.5rem !important; +} +.m-3 { + margin: 1rem !important; +} +.m-4 { + margin: 1.5rem !important; +} +.m-5 { + margin: 3rem !important; +} +.m-auto { + margin: auto !important; +} +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} +.mt-0 { + margin-top: 0 !important; +} +.mt-1 { + margin-top: 0.25rem !important; +} +.mt-2 { + margin-top: 0.5rem !important; +} +.mt-3 { + margin-top: 1rem !important; +} +.mt-4 { + margin-top: 1.5rem !important; +} +.mt-5 { + margin-top: 3rem !important; +} +.mt-auto { + margin-top: auto !important; +} +.me-0 { + margin-right: 0 !important; +} +.me-1 { + margin-right: 0.25rem !important; +} +.me-2 { + margin-right: 0.5rem !important; +} +.me-3 { + margin-right: 1rem !important; +} +.me-4 { + margin-right: 1.5rem !important; +} +.me-5 { + margin-right: 3rem !important; +} +.me-auto { + margin-right: auto !important; +} +.mb-0 { + margin-bottom: 0 !important; +} +.mb-1 { + margin-bottom: 0.25rem !important; +} +.mb-2 { + margin-bottom: 0.5rem !important; +} +.mb-3 { + margin-bottom: 1rem !important; +} +.mb-4 { + margin-bottom: 1.5rem !important; +} +.mb-5 { + margin-bottom: 3rem !important; +} +.mb-auto { + margin-bottom: auto !important; +} +.ms-0 { + margin-left: 0 !important; +} +.ms-1 { + margin-left: 0.25rem !important; +} +.ms-2 { + margin-left: 0.5rem !important; +} +.ms-3 { + margin-left: 1rem !important; +} +.ms-4 { + margin-left: 1.5rem !important; +} +.ms-5 { + margin-left: 3rem !important; +} +.ms-auto { + margin-left: auto !important; +} +.p-0 { + padding: 0 !important; +} +.p-1 { + padding: 0.25rem !important; +} +.p-2 { + padding: 0.5rem !important; +} +.p-3 { + padding: 1rem !important; +} +.p-4 { + padding: 1.5rem !important; +} +.p-5 { + padding: 3rem !important; +} +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} +.pt-0 { + padding-top: 0 !important; +} +.pt-1 { + padding-top: 0.25rem !important; +} +.pt-2 { + padding-top: 0.5rem !important; +} +.pt-3 { + padding-top: 1rem !important; +} +.pt-4 { + padding-top: 1.5rem !important; +} +.pt-5 { + padding-top: 3rem !important; +} +.pe-0 { + padding-right: 0 !important; +} +.pe-1 { + padding-right: 0.25rem !important; +} +.pe-2 { + padding-right: 0.5rem !important; +} +.pe-3 { + padding-right: 1rem !important; +} +.pe-4 { + padding-right: 1.5rem !important; +} +.pe-5 { + padding-right: 3rem !important; +} +.pb-0 { + padding-bottom: 0 !important; +} +.pb-1 { + padding-bottom: 0.25rem !important; +} +.pb-2 { + padding-bottom: 0.5rem !important; +} +.pb-3 { + padding-bottom: 1rem !important; +} +.pb-4 { + padding-bottom: 1.5rem !important; +} +.pb-5 { + padding-bottom: 3rem !important; +} +.ps-0 { + padding-left: 0 !important; +} +.ps-1 { + padding-left: 0.25rem !important; +} +.ps-2 { + padding-left: 0.5rem !important; +} +.ps-3 { + padding-left: 1rem !important; +} +.ps-4 { + padding-left: 1.5rem !important; +} +.ps-5 { + padding-left: 3rem !important; +} +.font-monospace { + font-family: var(--bs-font-monospace) !important; +} +.fs-1 { + font-size: calc(1.425rem + 2.1vw) !important; +} +.fs-2 { + font-size: calc(1.375rem + 1.5vw) !important; +} +.fs-3 { + font-size: calc(1.325rem + 0.9vw) !important; +} +.fs-4 { + font-size: calc(1.275rem + 0.3vw) !important; +} +.fs-5 { + font-size: 1.25rem !important; +} +.fs-6 { + font-size: 1rem !important; +} +.fst-italic { + font-style: italic !important; +} +.fst-normal { + font-style: normal !important; +} +.fw-light { + font-weight: 300 !important; +} +.fw-lighter { + font-weight: lighter !important; +} +.fw-normal { + font-weight: 400 !important; +} +.fw-bold { + font-weight: 700 !important; +} +.fw-bolder { + font-weight: bolder !important; +} +.lh-1 { + line-height: 1 !important; +} +.lh-sm { + line-height: 1.25 !important; +} +.lh-base { + line-height: 1.5 !important; +} +.lh-lg { + line-height: 2 !important; +} +.text-start { + text-align: left !important; +} +.text-end { + text-align: right !important; +} +.text-center { + text-align: center !important; +} +.text-decoration-none { + text-decoration: none !important; +} +.text-decoration-underline { + text-decoration: underline !important; +} +.text-decoration-line-through { + text-decoration: line-through !important; +} +.text-lowercase { + text-transform: lowercase !important; +} +.text-uppercase { + text-transform: uppercase !important; +} +.text-capitalize { + text-transform: capitalize !important; +} +.text-wrap { + white-space: normal !important; +} +.text-nowrap { + white-space: nowrap !important; +} +.text-break { + word-wrap: break-word !important; + word-break: break-word !important; +} +.text-primary { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; +} +.text-secondary { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; +} +.text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; +} +.text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; +} +.text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; +} +.text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; +} +.text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; +} +.text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; +} +.text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; +} +.text-white { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; +} +.text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; +} +.text-muted { + --bs-text-opacity: 1; + color: #888 !important; +} +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, 0.5) !important; +} +.text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, 0.5) !important; +} +.text-reset { + --bs-text-opacity: 1; + color: inherit !important; +} +.text-opacity-25 { + --bs-text-opacity: 0.25; +} +.text-opacity-50 { + --bs-text-opacity: 0.5; +} +.text-opacity-75 { + --bs-text-opacity: 0.75; +} +.text-opacity-100 { + --bs-text-opacity: 1; +} +.bg-primary { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-primary-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-secondary-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-success { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-success-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; +} +.bg-warning { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-warning-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-danger { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; +} +.bg-light { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; +} +.bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; +} +.bg-black { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; +} +.bg-white { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; +} +.bg-body { + --bs-bg-opacity: 1; + background-color: rgba( + var(--bs-body-bg-rgb), + var(--bs-bg-opacity) + ) !important; +} +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important; +} +.bg-opacity-10 { + --bs-bg-opacity: 0.1; +} +.bg-opacity-25 { + --bs-bg-opacity: 0.25; +} +.bg-opacity-50 { + --bs-bg-opacity: 0.5; +} +.bg-opacity-75 { + --bs-bg-opacity: 0.75; +} +.bg-opacity-100 { + --bs-bg-opacity: 1; +} +.bg-gradient { + background-image: var(--bs-gradient) !important; +} +.user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + user-select: all !important; +} +.user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + -ms-user-select: auto !important; + user-select: auto !important; +} +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + -ms-user-select: none !important; + user-select: none !important; +} +.pe-none { + pointer-events: none !important; +} +.pe-auto { + pointer-events: auto !important; +} +.rounded { + border-radius: 0.25rem !important; +} +.rounded-0 { + border-radius: 0 !important; +} +.rounded-1 { + border-radius: 0.2rem !important; +} +.rounded-2 { + border-radius: 0.25rem !important; +} +.rounded-3 { + border-radius: 0.3rem !important; +} +.rounded-circle { + border-radius: 50% !important; +} +.rounded-pill { + border-radius: 50rem !important; +} +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; +} +.rounded-end { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; +} +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; +} +.rounded-start { + border-bottom-left-radius: 0.25rem !important; + border-top-left-radius: 0.25rem !important; +} +.visible { + visibility: visible !important; +} +.invisible { + visibility: hidden !important; +} +@media (min-width: 576px) { + .float-sm-start { + float: left !important; + } + .float-sm-end { + float: right !important; + } + .float-sm-none { + float: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-grid { + display: grid !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-sm-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } + .d-sm-none { + display: none !important; + } + .flex-sm-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-sm-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-sm-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-sm-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-sm-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .flex-sm-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .gap-sm-0 { + gap: 0 !important; + } + .gap-sm-1 { + gap: 0.25rem !important; + } + .gap-sm-2 { + gap: 0.5rem !important; + } + .gap-sm-3 { + gap: 1rem !important; + } + .gap-sm-4 { + gap: 1.5rem !important; + } + .gap-sm-5 { + gap: 3rem !important; + } + .justify-content-sm-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-sm-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-sm-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-sm-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-sm-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .justify-content-sm-evenly { + -ms-flex-pack: space-evenly !important; + justify-content: space-evenly !important; + } + .align-items-sm-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-sm-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-sm-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-sm-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-sm-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-sm-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-sm-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-sm-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-sm-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-sm-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-sm-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-sm-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-sm-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-sm-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-sm-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-sm-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-sm-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } + .order-sm-first { + -ms-flex-order: -1 !important; + order: -1 !important; + } + .order-sm-0 { + -ms-flex-order: 0 !important; + order: 0 !important; + } + .order-sm-1 { + -ms-flex-order: 1 !important; + order: 1 !important; + } + .order-sm-2 { + -ms-flex-order: 2 !important; + order: 2 !important; + } + .order-sm-3 { + -ms-flex-order: 3 !important; + order: 3 !important; + } + .order-sm-4 { + -ms-flex-order: 4 !important; + order: 4 !important; + } + .order-sm-5 { + -ms-flex-order: 5 !important; + order: 5 !important; + } + .order-sm-last { + -ms-flex-order: 6 !important; + order: 6 !important; + } + .m-sm-0 { + margin: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-sm-0 { + margin-top: 0 !important; + } + .mt-sm-1 { + margin-top: 0.25rem !important; + } + .mt-sm-2 { + margin-top: 0.5rem !important; + } + .mt-sm-3 { + margin-top: 1rem !important; + } + .mt-sm-4 { + margin-top: 1.5rem !important; + } + .mt-sm-5 { + margin-top: 3rem !important; + } + .mt-sm-auto { + margin-top: auto !important; + } + .me-sm-0 { + margin-right: 0 !important; + } + .me-sm-1 { + margin-right: 0.25rem !important; + } + .me-sm-2 { + margin-right: 0.5rem !important; + } + .me-sm-3 { + margin-right: 1rem !important; + } + .me-sm-4 { + margin-right: 1.5rem !important; + } + .me-sm-5 { + margin-right: 3rem !important; + } + .me-sm-auto { + margin-right: auto !important; + } + .mb-sm-0 { + margin-bottom: 0 !important; + } + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + .mb-sm-3 { + margin-bottom: 1rem !important; + } + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + .mb-sm-5 { + margin-bottom: 3rem !important; + } + .mb-sm-auto { + margin-bottom: auto !important; + } + .ms-sm-0 { + margin-left: 0 !important; + } + .ms-sm-1 { + margin-left: 0.25rem !important; + } + .ms-sm-2 { + margin-left: 0.5rem !important; + } + .ms-sm-3 { + margin-left: 1rem !important; + } + .ms-sm-4 { + margin-left: 1.5rem !important; + } + .ms-sm-5 { + margin-left: 3rem !important; + } + .ms-sm-auto { + margin-left: auto !important; + } + .p-sm-0 { + padding: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-sm-0 { + padding-top: 0 !important; + } + .pt-sm-1 { + padding-top: 0.25rem !important; + } + .pt-sm-2 { + padding-top: 0.5rem !important; + } + .pt-sm-3 { + padding-top: 1rem !important; + } + .pt-sm-4 { + padding-top: 1.5rem !important; + } + .pt-sm-5 { + padding-top: 3rem !important; + } + .pe-sm-0 { + padding-right: 0 !important; + } + .pe-sm-1 { + padding-right: 0.25rem !important; + } + .pe-sm-2 { + padding-right: 0.5rem !important; + } + .pe-sm-3 { + padding-right: 1rem !important; + } + .pe-sm-4 { + padding-right: 1.5rem !important; + } + .pe-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-0 { + padding-bottom: 0 !important; + } + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + .pb-sm-3 { + padding-bottom: 1rem !important; + } + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + .pb-sm-5 { + padding-bottom: 3rem !important; + } + .ps-sm-0 { + padding-left: 0 !important; + } + .ps-sm-1 { + padding-left: 0.25rem !important; + } + .ps-sm-2 { + padding-left: 0.5rem !important; + } + .ps-sm-3 { + padding-left: 1rem !important; + } + .ps-sm-4 { + padding-left: 1.5rem !important; + } + .ps-sm-5 { + padding-left: 3rem !important; + } + .text-sm-start { + text-align: left !important; + } + .text-sm-end { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .float-md-start { + float: left !important; + } + .float-md-end { + float: right !important; + } + .float-md-none { + float: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-grid { + display: grid !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-md-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } + .d-md-none { + display: none !important; + } + .flex-md-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-md-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-md-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-md-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-md-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-md-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .flex-md-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-md-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .gap-md-0 { + gap: 0 !important; + } + .gap-md-1 { + gap: 0.25rem !important; + } + .gap-md-2 { + gap: 0.5rem !important; + } + .gap-md-3 { + gap: 1rem !important; + } + .gap-md-4 { + gap: 1.5rem !important; + } + .gap-md-5 { + gap: 3rem !important; + } + .justify-content-md-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-md-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-md-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-md-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-md-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .justify-content-md-evenly { + -ms-flex-pack: space-evenly !important; + justify-content: space-evenly !important; + } + .align-items-md-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-md-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-md-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-md-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-md-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-md-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-md-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-md-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-md-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-md-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-md-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-md-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-md-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-md-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-md-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-md-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-md-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } + .order-md-first { + -ms-flex-order: -1 !important; + order: -1 !important; + } + .order-md-0 { + -ms-flex-order: 0 !important; + order: 0 !important; + } + .order-md-1 { + -ms-flex-order: 1 !important; + order: 1 !important; + } + .order-md-2 { + -ms-flex-order: 2 !important; + order: 2 !important; + } + .order-md-3 { + -ms-flex-order: 3 !important; + order: 3 !important; + } + .order-md-4 { + -ms-flex-order: 4 !important; + order: 4 !important; + } + .order-md-5 { + -ms-flex-order: 5 !important; + order: 5 !important; + } + .order-md-last { + -ms-flex-order: 6 !important; + order: 6 !important; + } + .m-md-0 { + margin: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-md-0 { + margin-top: 0 !important; + } + .mt-md-1 { + margin-top: 0.25rem !important; + } + .mt-md-2 { + margin-top: 0.5rem !important; + } + .mt-md-3 { + margin-top: 1rem !important; + } + .mt-md-4 { + margin-top: 1.5rem !important; + } + .mt-md-5 { + margin-top: 3rem !important; + } + .mt-md-auto { + margin-top: auto !important; + } + .me-md-0 { + margin-right: 0 !important; + } + .me-md-1 { + margin-right: 0.25rem !important; + } + .me-md-2 { + margin-right: 0.5rem !important; + } + .me-md-3 { + margin-right: 1rem !important; + } + .me-md-4 { + margin-right: 1.5rem !important; + } + .me-md-5 { + margin-right: 3rem !important; + } + .me-md-auto { + margin-right: auto !important; + } + .mb-md-0 { + margin-bottom: 0 !important; + } + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + .mb-md-3 { + margin-bottom: 1rem !important; + } + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + .mb-md-5 { + margin-bottom: 3rem !important; + } + .mb-md-auto { + margin-bottom: auto !important; + } + .ms-md-0 { + margin-left: 0 !important; + } + .ms-md-1 { + margin-left: 0.25rem !important; + } + .ms-md-2 { + margin-left: 0.5rem !important; + } + .ms-md-3 { + margin-left: 1rem !important; + } + .ms-md-4 { + margin-left: 1.5rem !important; + } + .ms-md-5 { + margin-left: 3rem !important; + } + .ms-md-auto { + margin-left: auto !important; + } + .p-md-0 { + padding: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-md-0 { + padding-top: 0 !important; + } + .pt-md-1 { + padding-top: 0.25rem !important; + } + .pt-md-2 { + padding-top: 0.5rem !important; + } + .pt-md-3 { + padding-top: 1rem !important; + } + .pt-md-4 { + padding-top: 1.5rem !important; + } + .pt-md-5 { + padding-top: 3rem !important; + } + .pe-md-0 { + padding-right: 0 !important; + } + .pe-md-1 { + padding-right: 0.25rem !important; + } + .pe-md-2 { + padding-right: 0.5rem !important; + } + .pe-md-3 { + padding-right: 1rem !important; + } + .pe-md-4 { + padding-right: 1.5rem !important; + } + .pe-md-5 { + padding-right: 3rem !important; + } + .pb-md-0 { + padding-bottom: 0 !important; + } + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + .pb-md-3 { + padding-bottom: 1rem !important; + } + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + .pb-md-5 { + padding-bottom: 3rem !important; + } + .ps-md-0 { + padding-left: 0 !important; + } + .ps-md-1 { + padding-left: 0.25rem !important; + } + .ps-md-2 { + padding-left: 0.5rem !important; + } + .ps-md-3 { + padding-left: 1rem !important; + } + .ps-md-4 { + padding-left: 1.5rem !important; + } + .ps-md-5 { + padding-left: 3rem !important; + } + .text-md-start { + text-align: left !important; + } + .text-md-end { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .float-lg-start { + float: left !important; + } + .float-lg-end { + float: right !important; + } + .float-lg-none { + float: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-grid { + display: grid !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-lg-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } + .d-lg-none { + display: none !important; + } + .flex-lg-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-lg-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-lg-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-lg-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-lg-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .flex-lg-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .gap-lg-0 { + gap: 0 !important; + } + .gap-lg-1 { + gap: 0.25rem !important; + } + .gap-lg-2 { + gap: 0.5rem !important; + } + .gap-lg-3 { + gap: 1rem !important; + } + .gap-lg-4 { + gap: 1.5rem !important; + } + .gap-lg-5 { + gap: 3rem !important; + } + .justify-content-lg-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-lg-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-lg-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-lg-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-lg-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .justify-content-lg-evenly { + -ms-flex-pack: space-evenly !important; + justify-content: space-evenly !important; + } + .align-items-lg-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-lg-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-lg-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-lg-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-lg-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-lg-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-lg-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-lg-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-lg-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-lg-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-lg-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-lg-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-lg-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-lg-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-lg-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-lg-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-lg-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } + .order-lg-first { + -ms-flex-order: -1 !important; + order: -1 !important; + } + .order-lg-0 { + -ms-flex-order: 0 !important; + order: 0 !important; + } + .order-lg-1 { + -ms-flex-order: 1 !important; + order: 1 !important; + } + .order-lg-2 { + -ms-flex-order: 2 !important; + order: 2 !important; + } + .order-lg-3 { + -ms-flex-order: 3 !important; + order: 3 !important; + } + .order-lg-4 { + -ms-flex-order: 4 !important; + order: 4 !important; + } + .order-lg-5 { + -ms-flex-order: 5 !important; + order: 5 !important; + } + .order-lg-last { + -ms-flex-order: 6 !important; + order: 6 !important; + } + .m-lg-0 { + margin: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-lg-0 { + margin-top: 0 !important; + } + .mt-lg-1 { + margin-top: 0.25rem !important; + } + .mt-lg-2 { + margin-top: 0.5rem !important; + } + .mt-lg-3 { + margin-top: 1rem !important; + } + .mt-lg-4 { + margin-top: 1.5rem !important; + } + .mt-lg-5 { + margin-top: 3rem !important; + } + .mt-lg-auto { + margin-top: auto !important; + } + .me-lg-0 { + margin-right: 0 !important; + } + .me-lg-1 { + margin-right: 0.25rem !important; + } + .me-lg-2 { + margin-right: 0.5rem !important; + } + .me-lg-3 { + margin-right: 1rem !important; + } + .me-lg-4 { + margin-right: 1.5rem !important; + } + .me-lg-5 { + margin-right: 3rem !important; + } + .me-lg-auto { + margin-right: auto !important; + } + .mb-lg-0 { + margin-bottom: 0 !important; + } + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + .mb-lg-3 { + margin-bottom: 1rem !important; + } + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + .mb-lg-5 { + margin-bottom: 3rem !important; + } + .mb-lg-auto { + margin-bottom: auto !important; + } + .ms-lg-0 { + margin-left: 0 !important; + } + .ms-lg-1 { + margin-left: 0.25rem !important; + } + .ms-lg-2 { + margin-left: 0.5rem !important; + } + .ms-lg-3 { + margin-left: 1rem !important; + } + .ms-lg-4 { + margin-left: 1.5rem !important; + } + .ms-lg-5 { + margin-left: 3rem !important; + } + .ms-lg-auto { + margin-left: auto !important; + } + .p-lg-0 { + padding: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-lg-0 { + padding-top: 0 !important; + } + .pt-lg-1 { + padding-top: 0.25rem !important; + } + .pt-lg-2 { + padding-top: 0.5rem !important; + } + .pt-lg-3 { + padding-top: 1rem !important; + } + .pt-lg-4 { + padding-top: 1.5rem !important; + } + .pt-lg-5 { + padding-top: 3rem !important; + } + .pe-lg-0 { + padding-right: 0 !important; + } + .pe-lg-1 { + padding-right: 0.25rem !important; + } + .pe-lg-2 { + padding-right: 0.5rem !important; + } + .pe-lg-3 { + padding-right: 1rem !important; + } + .pe-lg-4 { + padding-right: 1.5rem !important; + } + .pe-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-0 { + padding-bottom: 0 !important; + } + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + .pb-lg-3 { + padding-bottom: 1rem !important; + } + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + .pb-lg-5 { + padding-bottom: 3rem !important; + } + .ps-lg-0 { + padding-left: 0 !important; + } + .ps-lg-1 { + padding-left: 0.25rem !important; + } + .ps-lg-2 { + padding-left: 0.5rem !important; + } + .ps-lg-3 { + padding-left: 1rem !important; + } + .ps-lg-4 { + padding-left: 1.5rem !important; + } + .ps-lg-5 { + padding-left: 3rem !important; + } + .text-lg-start { + text-align: left !important; + } + .text-lg-end { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .float-xl-start { + float: left !important; + } + .float-xl-end { + float: right !important; + } + .float-xl-none { + float: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-grid { + display: grid !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-xl-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } + .d-xl-none { + display: none !important; + } + .flex-xl-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-xl-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-xl-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-xl-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-xl-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .flex-xl-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .gap-xl-0 { + gap: 0 !important; + } + .gap-xl-1 { + gap: 0.25rem !important; + } + .gap-xl-2 { + gap: 0.5rem !important; + } + .gap-xl-3 { + gap: 1rem !important; + } + .gap-xl-4 { + gap: 1.5rem !important; + } + .gap-xl-5 { + gap: 3rem !important; + } + .justify-content-xl-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-xl-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-xl-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-xl-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-xl-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .justify-content-xl-evenly { + -ms-flex-pack: space-evenly !important; + justify-content: space-evenly !important; + } + .align-items-xl-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-xl-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-xl-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-xl-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-xl-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-xl-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-xl-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-xl-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-xl-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-xl-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-xl-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-xl-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-xl-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-xl-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-xl-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-xl-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-xl-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } + .order-xl-first { + -ms-flex-order: -1 !important; + order: -1 !important; + } + .order-xl-0 { + -ms-flex-order: 0 !important; + order: 0 !important; + } + .order-xl-1 { + -ms-flex-order: 1 !important; + order: 1 !important; + } + .order-xl-2 { + -ms-flex-order: 2 !important; + order: 2 !important; + } + .order-xl-3 { + -ms-flex-order: 3 !important; + order: 3 !important; + } + .order-xl-4 { + -ms-flex-order: 4 !important; + order: 4 !important; + } + .order-xl-5 { + -ms-flex-order: 5 !important; + order: 5 !important; + } + .order-xl-last { + -ms-flex-order: 6 !important; + order: 6 !important; + } + .m-xl-0 { + margin: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xl-0 { + margin-top: 0 !important; + } + .mt-xl-1 { + margin-top: 0.25rem !important; + } + .mt-xl-2 { + margin-top: 0.5rem !important; + } + .mt-xl-3 { + margin-top: 1rem !important; + } + .mt-xl-4 { + margin-top: 1.5rem !important; + } + .mt-xl-5 { + margin-top: 3rem !important; + } + .mt-xl-auto { + margin-top: auto !important; + } + .me-xl-0 { + margin-right: 0 !important; + } + .me-xl-1 { + margin-right: 0.25rem !important; + } + .me-xl-2 { + margin-right: 0.5rem !important; + } + .me-xl-3 { + margin-right: 1rem !important; + } + .me-xl-4 { + margin-right: 1.5rem !important; + } + .me-xl-5 { + margin-right: 3rem !important; + } + .me-xl-auto { + margin-right: auto !important; + } + .mb-xl-0 { + margin-bottom: 0 !important; + } + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xl-3 { + margin-bottom: 1rem !important; + } + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xl-5 { + margin-bottom: 3rem !important; + } + .mb-xl-auto { + margin-bottom: auto !important; + } + .ms-xl-0 { + margin-left: 0 !important; + } + .ms-xl-1 { + margin-left: 0.25rem !important; + } + .ms-xl-2 { + margin-left: 0.5rem !important; + } + .ms-xl-3 { + margin-left: 1rem !important; + } + .ms-xl-4 { + margin-left: 1.5rem !important; + } + .ms-xl-5 { + margin-left: 3rem !important; + } + .ms-xl-auto { + margin-left: auto !important; + } + .p-xl-0 { + padding: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xl-0 { + padding-top: 0 !important; + } + .pt-xl-1 { + padding-top: 0.25rem !important; + } + .pt-xl-2 { + padding-top: 0.5rem !important; + } + .pt-xl-3 { + padding-top: 1rem !important; + } + .pt-xl-4 { + padding-top: 1.5rem !important; + } + .pt-xl-5 { + padding-top: 3rem !important; + } + .pe-xl-0 { + padding-right: 0 !important; + } + .pe-xl-1 { + padding-right: 0.25rem !important; + } + .pe-xl-2 { + padding-right: 0.5rem !important; + } + .pe-xl-3 { + padding-right: 1rem !important; + } + .pe-xl-4 { + padding-right: 1.5rem !important; + } + .pe-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-0 { + padding-bottom: 0 !important; + } + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xl-3 { + padding-bottom: 1rem !important; + } + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xl-5 { + padding-bottom: 3rem !important; + } + .ps-xl-0 { + padding-left: 0 !important; + } + .ps-xl-1 { + padding-left: 0.25rem !important; + } + .ps-xl-2 { + padding-left: 0.5rem !important; + } + .ps-xl-3 { + padding-left: 1rem !important; + } + .ps-xl-4 { + padding-left: 1.5rem !important; + } + .ps-xl-5 { + padding-left: 3rem !important; + } + .text-xl-start { + text-align: left !important; + } + .text-xl-end { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} +@media (min-width: 1400px) { + .float-xxl-start { + float: left !important; + } + .float-xxl-end { + float: right !important; + } + .float-xxl-none { + float: none !important; + } + .d-xxl-inline { + display: inline !important; + } + .d-xxl-inline-block { + display: inline-block !important; + } + .d-xxl-block { + display: block !important; + } + .d-xxl-grid { + display: grid !important; + } + .d-xxl-table { + display: table !important; + } + .d-xxl-table-row { + display: table-row !important; + } + .d-xxl-table-cell { + display: table-cell !important; + } + .d-xxl-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-xxl-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } + .d-xxl-none { + display: none !important; + } + .flex-xxl-fill { + -ms-flex: 1 1 auto !important; + flex: 1 1 auto !important; + } + .flex-xxl-row { + -ms-flex-direction: row !important; + flex-direction: row !important; + } + .flex-xxl-column { + -ms-flex-direction: column !important; + flex-direction: column !important; + } + .flex-xxl-row-reverse { + -ms-flex-direction: row-reverse !important; + flex-direction: row-reverse !important; + } + .flex-xxl-column-reverse { + -ms-flex-direction: column-reverse !important; + flex-direction: column-reverse !important; + } + .flex-xxl-grow-0 { + -ms-flex-positive: 0 !important; + flex-grow: 0 !important; + } + .flex-xxl-grow-1 { + -ms-flex-positive: 1 !important; + flex-grow: 1 !important; + } + .flex-xxl-shrink-0 { + -ms-flex-negative: 0 !important; + flex-shrink: 0 !important; + } + .flex-xxl-shrink-1 { + -ms-flex-negative: 1 !important; + flex-shrink: 1 !important; + } + .flex-xxl-wrap { + -ms-flex-wrap: wrap !important; + flex-wrap: wrap !important; + } + .flex-xxl-nowrap { + -ms-flex-wrap: nowrap !important; + flex-wrap: nowrap !important; + } + .flex-xxl-wrap-reverse { + -ms-flex-wrap: wrap-reverse !important; + flex-wrap: wrap-reverse !important; + } + .gap-xxl-0 { + gap: 0 !important; + } + .gap-xxl-1 { + gap: 0.25rem !important; + } + .gap-xxl-2 { + gap: 0.5rem !important; + } + .gap-xxl-3 { + gap: 1rem !important; + } + .gap-xxl-4 { + gap: 1.5rem !important; + } + .gap-xxl-5 { + gap: 3rem !important; + } + .justify-content-xxl-start { + -ms-flex-pack: start !important; + justify-content: flex-start !important; + } + .justify-content-xxl-end { + -ms-flex-pack: end !important; + justify-content: flex-end !important; + } + .justify-content-xxl-center { + -ms-flex-pack: center !important; + justify-content: center !important; + } + .justify-content-xxl-between { + -ms-flex-pack: justify !important; + justify-content: space-between !important; + } + .justify-content-xxl-around { + -ms-flex-pack: distribute !important; + justify-content: space-around !important; + } + .justify-content-xxl-evenly { + -ms-flex-pack: space-evenly !important; + justify-content: space-evenly !important; + } + .align-items-xxl-start { + -ms-flex-align: start !important; + align-items: flex-start !important; + } + .align-items-xxl-end { + -ms-flex-align: end !important; + align-items: flex-end !important; + } + .align-items-xxl-center { + -ms-flex-align: center !important; + align-items: center !important; + } + .align-items-xxl-baseline { + -ms-flex-align: baseline !important; + align-items: baseline !important; + } + .align-items-xxl-stretch { + -ms-flex-align: stretch !important; + align-items: stretch !important; + } + .align-content-xxl-start { + -ms-flex-line-pack: start !important; + align-content: flex-start !important; + } + .align-content-xxl-end { + -ms-flex-line-pack: end !important; + align-content: flex-end !important; + } + .align-content-xxl-center { + -ms-flex-line-pack: center !important; + align-content: center !important; + } + .align-content-xxl-between { + -ms-flex-line-pack: justify !important; + align-content: space-between !important; + } + .align-content-xxl-around { + -ms-flex-line-pack: distribute !important; + align-content: space-around !important; + } + .align-content-xxl-stretch { + -ms-flex-line-pack: stretch !important; + align-content: stretch !important; + } + .align-self-xxl-auto { + -ms-flex-item-align: auto !important; + align-self: auto !important; + } + .align-self-xxl-start { + -ms-flex-item-align: start !important; + align-self: flex-start !important; + } + .align-self-xxl-end { + -ms-flex-item-align: end !important; + align-self: flex-end !important; + } + .align-self-xxl-center { + -ms-flex-item-align: center !important; + align-self: center !important; + } + .align-self-xxl-baseline { + -ms-flex-item-align: baseline !important; + align-self: baseline !important; + } + .align-self-xxl-stretch { + -ms-flex-item-align: stretch !important; + align-self: stretch !important; + } + .order-xxl-first { + -ms-flex-order: -1 !important; + order: -1 !important; + } + .order-xxl-0 { + -ms-flex-order: 0 !important; + order: 0 !important; + } + .order-xxl-1 { + -ms-flex-order: 1 !important; + order: 1 !important; + } + .order-xxl-2 { + -ms-flex-order: 2 !important; + order: 2 !important; + } + .order-xxl-3 { + -ms-flex-order: 3 !important; + order: 3 !important; + } + .order-xxl-4 { + -ms-flex-order: 4 !important; + order: 4 !important; + } + .order-xxl-5 { + -ms-flex-order: 5 !important; + order: 5 !important; + } + .order-xxl-last { + -ms-flex-order: 6 !important; + order: 6 !important; + } + .m-xxl-0 { + margin: 0 !important; + } + .m-xxl-1 { + margin: 0.25rem !important; + } + .m-xxl-2 { + margin: 0.5rem !important; + } + .m-xxl-3 { + margin: 1rem !important; + } + .m-xxl-4 { + margin: 1.5rem !important; + } + .m-xxl-5 { + margin: 3rem !important; + } + .m-xxl-auto { + margin: auto !important; + } + .mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xxl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xxl-0 { + margin-top: 0 !important; + } + .mt-xxl-1 { + margin-top: 0.25rem !important; + } + .mt-xxl-2 { + margin-top: 0.5rem !important; + } + .mt-xxl-3 { + margin-top: 1rem !important; + } + .mt-xxl-4 { + margin-top: 1.5rem !important; + } + .mt-xxl-5 { + margin-top: 3rem !important; + } + .mt-xxl-auto { + margin-top: auto !important; + } + .me-xxl-0 { + margin-right: 0 !important; + } + .me-xxl-1 { + margin-right: 0.25rem !important; + } + .me-xxl-2 { + margin-right: 0.5rem !important; + } + .me-xxl-3 { + margin-right: 1rem !important; + } + .me-xxl-4 { + margin-right: 1.5rem !important; + } + .me-xxl-5 { + margin-right: 3rem !important; + } + .me-xxl-auto { + margin-right: auto !important; + } + .mb-xxl-0 { + margin-bottom: 0 !important; + } + .mb-xxl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xxl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xxl-3 { + margin-bottom: 1rem !important; + } + .mb-xxl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xxl-5 { + margin-bottom: 3rem !important; + } + .mb-xxl-auto { + margin-bottom: auto !important; + } + .ms-xxl-0 { + margin-left: 0 !important; + } + .ms-xxl-1 { + margin-left: 0.25rem !important; + } + .ms-xxl-2 { + margin-left: 0.5rem !important; + } + .ms-xxl-3 { + margin-left: 1rem !important; + } + .ms-xxl-4 { + margin-left: 1.5rem !important; + } + .ms-xxl-5 { + margin-left: 3rem !important; + } + .ms-xxl-auto { + margin-left: auto !important; + } + .p-xxl-0 { + padding: 0 !important; + } + .p-xxl-1 { + padding: 0.25rem !important; + } + .p-xxl-2 { + padding: 0.5rem !important; + } + .p-xxl-3 { + padding: 1rem !important; + } + .p-xxl-4 { + padding: 1.5rem !important; + } + .p-xxl-5 { + padding: 3rem !important; + } + .px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xxl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xxl-0 { + padding-top: 0 !important; + } + .pt-xxl-1 { + padding-top: 0.25rem !important; + } + .pt-xxl-2 { + padding-top: 0.5rem !important; + } + .pt-xxl-3 { + padding-top: 1rem !important; + } + .pt-xxl-4 { + padding-top: 1.5rem !important; + } + .pt-xxl-5 { + padding-top: 3rem !important; + } + .pe-xxl-0 { + padding-right: 0 !important; + } + .pe-xxl-1 { + padding-right: 0.25rem !important; + } + .pe-xxl-2 { + padding-right: 0.5rem !important; + } + .pe-xxl-3 { + padding-right: 1rem !important; + } + .pe-xxl-4 { + padding-right: 1.5rem !important; + } + .pe-xxl-5 { + padding-right: 3rem !important; + } + .pb-xxl-0 { + padding-bottom: 0 !important; + } + .pb-xxl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xxl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xxl-3 { + padding-bottom: 1rem !important; + } + .pb-xxl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xxl-5 { + padding-bottom: 3rem !important; + } + .ps-xxl-0 { + padding-left: 0 !important; + } + .ps-xxl-1 { + padding-left: 0.25rem !important; + } + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + .ps-xxl-3 { + padding-left: 1rem !important; + } + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + .ps-xxl-5 { + padding-left: 3rem !important; + } + .text-xxl-start { + text-align: left !important; + } + .text-xxl-end { + text-align: right !important; + } + .text-xxl-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .fs-1 { + font-size: 3rem !important; + } + .fs-2 { + font-size: 2.5rem !important; + } + .fs-3 { + font-size: 2rem !important; + } + .fs-4 { + font-size: 1.5rem !important; + } +} +@media print { + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-grid { + display: grid !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: -ms-flexbox !important; + display: flex !important; + } + .d-print-inline-flex { + display: -ms-inline-flexbox !important; + display: inline-flex !important; + } + .d-print-none { + display: none !important; + } +} +.blockquote-footer { + color: #888; +} +.input-group-addon { + color: #fff; +} +.form-floating > label { + color: #444; +} +.nav-pills .nav-item.open .nav-link, +.nav-pills .nav-item.open .nav-link:focus, +.nav-pills .nav-item.open .nav-link:hover, +.nav-pills .nav-link, +.nav-pills .nav-link.active, +.nav-pills .nav-link.active:focus, +.nav-pills .nav-link.active:hover, +.nav-tabs .nav-item.open .nav-link, +.nav-tabs .nav-item.open .nav-link:focus, +.nav-tabs .nav-item.open .nav-link:hover, +.nav-tabs .nav-link, +.nav-tabs .nav-link.active, +.nav-tabs .nav-link.active:focus, +.nav-tabs .nav-link.active:hover { + color: #fff; +} +.breadcrumb a { + color: #fff; +} +.pagination a:hover { + text-decoration: none; +} +.alert { + border: none; + color: #fff; +} +.alert .alert-link, +.alert a { + color: #fff; + text-decoration: underline; +} +.alert-primary { + background-color: #375a7f; +} +.alert-secondary { + background-color: #444; +} +.alert-success { + background-color: #00bc8c; +} +.alert-info { + background-color: #3498db; +} +.alert-warning { + background-color: #f39c12; +} +.alert-danger { + background-color: #e74c3c; +} +.alert-light { + background-color: #adb5bd; +} +.alert-dark { + background-color: #303030; +} diff --git a/data/htdocs/www/css/errorpages.css b/data/htdocs/www/css/errorpages.css new file mode 100644 index 0000000..5645b88 --- /dev/null +++ b/data/htdocs/www/css/errorpages.css @@ -0,0 +1,342 @@ +@import url( + https://fonts.googleapis.com/css?family=Lato:300italic, + 700italic, + 300, + 700 +); + +body { + padding: 50px; + font: 14px/1.5 Lato, "Helvetica Neue", Helvetica, Arial, sans-serif; + color: #777; + font-weight: 300; + padding: 1.5em 0; +} + +/* Layout */ +.jumbotron { + line-height: 2.1428571435; + color: inherit; + padding: 10px 0px; +} + +/* Main marketing message and sign up button */ +.jumbotron { + text-align: center; + background-color: transparent; +} + +.jumbotron .btn { + font-size: 21px; + padding: 1.5em 2em; +} + +/* Everything but the jumbotron gets side spacing for mobile-first views */ +.masthead, +.body-content { + padding: 0 15px; +} + +/* Colors */ +.green { + color: green; +} + +.orange { + color: orange; +} + +.red { + color: red; +} + +.blue { + color: blue; +} + +.yellow { + color: yellow; +} + +h2, +h3, +h4, +h5, +h6 { + color: #222; + margin: 0 0 40px; +} + +p, +ul, +ol, +table, +pre, +dl { + margin: 0 0 20px; +} + +h2, +h3 { + line-height: 1.1; +} + +h1 { + line-height: 1.1; + text-align: center; + font: Lato; + font-size: 80px; + color: #222; + margin: 0 0 40px; +} + +h2 { + color: #393939; +} + +h3, +h4, +h5, +h6 { + color: #494949; +} + +a { + color: #39c; + font-weight: 400; + text-decoration: none; +} + +a small { + font-size: 11px; + color: #777; + margin-top: -0.6em; + display: block; +} + +.wrapper { + width: 860px; + margin: 0 auto; +} + +blockquote { + border-left: 1px solid #e5e5e5; + margin: 0; + padding: 0 0 0 20px; + font-style: italic; +} + +.btn-block { + width: 40%; + text-align: center; + display: block; + margin: 0 auto; +} + +code, +pre { + font-family: Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal; + color: #333; + font-size: 12px; +} + +pre { + padding: 8px 15px; + background: #f8f8f8; + border-radius: 5px; + border: 1px solid #e5e5e5; + overflow-x: auto; +} + +table { + width: 100%; + border-collapse: collapse; +} + +th, +td { + text-align: left; + padding: 5px 10px; + border-bottom: 1px solid #e5e5e5; +} + +dt { + color: #444; + font-weight: 700; +} + +th { + color: #444; +} + +img { + max-width: 100%; +} + +header { + width: 270px; + float: left; + position: fixed; +} + +header ul { + list-style: none; + height: 40px; + + padding: 0; + + background: #eee; + background: -moz-linear-gradient(top, #f8f8f8 0%, #dddddd 100%); + background: -webkit-gradient( + linear, + left top, + left bottom, + color-stop(0%, #f8f8f8), + color-stop(100%, #dddddd) + ); + background: -webkit-linear-gradient(top, #f8f8f8 0%, #dddddd 100%); + background: -o-linear-gradient(top, #f8f8f8 0%, #dddddd 100%); + background: -ms-linear-gradient(top, #f8f8f8 0%, #dddddd 100%); + background: linear-gradient(top, #f8f8f8 0%, #dddddd 100%); + + border-radius: 5px; + border: 1px solid #d2d2d2; + box-shadow: inset #fff 0 1px 0, inset rgba(0, 0, 0, 0.03) 0 -1px 0; + width: 270px; +} + +header li { + width: 89px; + float: left; + border-right: 1px solid #d2d2d2; + height: 40px; +} + +header ul a { + line-height: 1; + font-size: 11px; + color: #999; + display: block; + text-align: center; + padding-top: 6px; + height: 40px; +} + +strong { + color: #222; + font-weight: 700; +} + +header ul li + li { + width: 88px; + border-left: 1px solid #fff; +} + +header ul li + li + li { + border-right: none; + width: 89px; +} + +header ul a strong { + font-size: 14px; + display: block; + color: #222; +} + +section { + width: 500px; + float: right; + padding-bottom: 50px; +} + +small { + font-size: 11px; +} + +hr { + border: 0; + background: #e5e5e5; + height: 1px; + margin: 0 0 20px; +} + +footer { + width: 270px; + float: left; + position: fixed; + bottom: 50px; +} + +@media print, screen and (max-width: 960px) { + div.wrapper { + width: auto; + margin: 0; + } + + header, + section, + footer { + float: none; + position: static; + width: auto; + } + + header { + padding-right: 320px; + } + + section { + border: 1px solid #e5e5e5; + border-width: 1px 0; + padding: 20px 0; + margin: 0 0 20px; + } + + header a small { + display: inline; + } + + header ul { + position: absolute; + right: 50px; + top: 52px; + } +} + +@media print, screen and (max-width: 720px) { + body { + word-wrap: break-word; + } + + header { + padding: 0; + } + + header ul, + header p.view { + position: static; + } + + pre, + code { + word-wrap: normal; + } +} + +@media print, screen and (max-width: 480px) { + body { + padding: 15px; + } + + header ul { + display: none; + } +} + +@media print { + body { + padding: 0.4in; + font-size: 12pt; + color: #444; + } +} diff --git a/data/htdocs/www/css/index.css b/data/htdocs/www/css/index.css new file mode 100644 index 0000000..647284d --- /dev/null +++ b/data/htdocs/www/css/index.css @@ -0,0 +1,79 @@ +@import url(http://fonts.googleapis.com/css?family=Open+Sans:400,300,600,700); +@import url(./bootstrap.min.css); + +body { + color: purple; + background-image: url('../images/bg.png'); +} + +th { + background-color: #333; + color: #ffffff; + border-top: 1px solid #678ca0; + vertical-align: middle; + height: 50px; +} + +td { + background-color: 333; + border-top: 1px solid #678ca0; +} + +.box { + border: 1px solid #678ca0; + padding: 0px; + width: 100%; + background-color: #333; + margin-bottom: 10px; + width: 600px; +} + +.spacer { + margin: 0px; + width: 100%; + background-color: #333; +} + +.leftspacer { + margin: 0px; + padding: 5px; + width: 100%; + text-align: left; + background-color: #333; +} + +.serviceup { + color: green; +} + +.servicedown { + color: red; +} + +a { + text-decoration: none; + color: #5d83a9; +} + +p.main { + margin-top: 5px; + margin-bottom: 5px; + text-align: center; + font-size: 10px; +} + +a:visited { + color: #c39; +} + +a:hover { + color: #f00; +} + +a:active { + color: #c0f; +} + +tr:hover { + background-color: #f5f5f5; +} diff --git a/data/htdocs/www/images/403.png b/data/htdocs/www/images/403.png new file mode 100644 index 0000000..2935697 Binary files /dev/null and b/data/htdocs/www/images/403.png differ diff --git a/data/htdocs/www/images/404.gif b/data/htdocs/www/images/404.gif new file mode 100644 index 0000000..ad19c4e Binary files /dev/null and b/data/htdocs/www/images/404.gif differ diff --git a/data/htdocs/www/images/bg.png b/data/htdocs/www/images/bg.png new file mode 100644 index 0000000..d10e5ca Binary files /dev/null and b/data/htdocs/www/images/bg.png differ diff --git a/data/htdocs/www/images/favicon.ico b/data/htdocs/www/images/favicon.ico new file mode 100644 index 0000000..be74abd Binary files /dev/null and b/data/htdocs/www/images/favicon.ico differ diff --git a/data/htdocs/www/images/icon.png b/data/htdocs/www/images/icon.png new file mode 100644 index 0000000..8a42581 Binary files /dev/null and b/data/htdocs/www/images/icon.png differ diff --git a/data/htdocs/www/images/icon.svg b/data/htdocs/www/images/icon.svg new file mode 100644 index 0000000..f232922 --- /dev/null +++ b/data/htdocs/www/images/icon.svg @@ -0,0 +1 @@ + diff --git a/data/htdocs/www/index.html b/data/htdocs/www/index.html new file mode 100644 index 0000000..b9b2495 --- /dev/null +++ b/data/htdocs/www/index.html @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Welcome + + + +
+

Congratulations

+

+ Your apache container has been setup.




+

+
+ + diff --git a/data/htdocs/www/js/app.js b/data/htdocs/www/js/app.js new file mode 100644 index 0000000..e69de29 diff --git a/data/htdocs/www/js/bootstrap.min.js b/data/htdocs/www/js/bootstrap.min.js new file mode 100644 index 0000000..641156c --- /dev/null +++ b/data/htdocs/www/js/bootstrap.min.js @@ -0,0 +1,4075 @@ +/*! + * Bootstrap v5.1.3 (https://getbootstrap.com/) + * Copyright 2011-2021 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +!(function (t, e) { + 'object' == typeof exports && 'undefined' != typeof module + ? (module.exports = e()) + : 'function' == typeof define && define.amd + ? define(e) + : ((t = + 'undefined' != typeof globalThis ? globalThis : t || self).bootstrap = + e()); +})(this, function () { + 'use strict'; + const t = 'transitionend', + e = (t) => { + let e = t.getAttribute('data-bs-target'); + if (!e || '#' === e) { + let i = t.getAttribute('href'); + if (!i || (!i.includes('#') && !i.startsWith('.'))) return null; + i.includes('#') && !i.startsWith('#') && (i = `#${i.split('#')[1]}`), + (e = i && '#' !== i ? i.trim() : null); + } + return e; + }, + i = (t) => { + const i = e(t); + return i && document.querySelector(i) ? i : null; + }, + n = (t) => { + const i = e(t); + return i ? document.querySelector(i) : null; + }, + s = (e) => { + e.dispatchEvent(new Event(t)); + }, + o = (t) => + !(!t || 'object' != typeof t) && + (void 0 !== t.jquery && (t = t[0]), void 0 !== t.nodeType), + r = (t) => + o(t) + ? t.jquery + ? t[0] + : t + : 'string' == typeof t && t.length > 0 + ? document.querySelector(t) + : null, + a = (t, e, i) => { + Object.keys(i).forEach((n) => { + const s = i[n], + r = e[n], + a = + r && o(r) + ? 'element' + : null == (l = r) + ? `${l}` + : {}.toString + .call(l) + .match(/\s([a-z]+)/i)[1] + .toLowerCase(); + var l; + if (!new RegExp(s).test(a)) + throw new TypeError( + `${t.toUpperCase()}: Option "${n}" provided type "${a}" but expected type "${s}".` + ); + }); + }, + l = (t) => + !(!o(t) || 0 === t.getClientRects().length) && + 'visible' === getComputedStyle(t).getPropertyValue('visibility'), + c = (t) => + !t || + t.nodeType !== Node.ELEMENT_NODE || + !!t.classList.contains('disabled') || + (void 0 !== t.disabled + ? t.disabled + : t.hasAttribute('disabled') && 'false' !== t.getAttribute('disabled')), + h = (t) => { + if (!document.documentElement.attachShadow) return null; + if ('function' == typeof t.getRootNode) { + const e = t.getRootNode(); + return e instanceof ShadowRoot ? e : null; + } + return t instanceof ShadowRoot + ? t + : t.parentNode + ? h(t.parentNode) + : null; + }, + d = () => {}, + u = (t) => { + t.offsetHeight; + }, + f = () => { + const { jQuery: t } = window; + return t && !document.body.hasAttribute('data-bs-no-jquery') ? t : null; + }, + p = [], + m = () => 'rtl' === document.documentElement.dir, + g = (t) => { + var e; + (e = () => { + const e = f(); + if (e) { + const i = t.NAME, + n = e.fn[i]; + (e.fn[i] = t.jQueryInterface), + (e.fn[i].Constructor = t), + (e.fn[i].noConflict = () => ((e.fn[i] = n), t.jQueryInterface)); + } + }), + 'loading' === document.readyState + ? (p.length || + document.addEventListener('DOMContentLoaded', () => { + p.forEach((t) => t()); + }), + p.push(e)) + : e(); + }, + _ = (t) => { + 'function' == typeof t && t(); + }, + b = (e, i, n = !0) => { + if (!n) return void _(e); + const o = + ((t) => { + if (!t) return 0; + let { transitionDuration: e, transitionDelay: i } = + window.getComputedStyle(t); + const n = Number.parseFloat(e), + s = Number.parseFloat(i); + return n || s + ? ((e = e.split(',')[0]), + (i = i.split(',')[0]), + 1e3 * (Number.parseFloat(e) + Number.parseFloat(i))) + : 0; + })(i) + 5; + let r = !1; + const a = ({ target: n }) => { + n === i && ((r = !0), i.removeEventListener(t, a), _(e)); + }; + i.addEventListener(t, a), + setTimeout(() => { + r || s(i); + }, o); + }, + v = (t, e, i, n) => { + let s = t.indexOf(e); + if (-1 === s) return t[!i && n ? t.length - 1 : 0]; + const o = t.length; + return ( + (s += i ? 1 : -1), + n && (s = (s + o) % o), + t[Math.max(0, Math.min(s, o - 1))] + ); + }, + y = /[^.]*(?=\..*)\.|.*/, + w = /\..*/, + E = /::\d+$/, + A = {}; + let T = 1; + const O = { mouseenter: 'mouseover', mouseleave: 'mouseout' }, + C = /^(mouseenter|mouseleave)/i, + k = new Set([ + 'click', + 'dblclick', + 'mouseup', + 'mousedown', + 'contextmenu', + 'mousewheel', + 'DOMMouseScroll', + 'mouseover', + 'mouseout', + 'mousemove', + 'selectstart', + 'selectend', + 'keydown', + 'keypress', + 'keyup', + 'orientationchange', + 'touchstart', + 'touchmove', + 'touchend', + 'touchcancel', + 'pointerdown', + 'pointermove', + 'pointerup', + 'pointerleave', + 'pointercancel', + 'gesturestart', + 'gesturechange', + 'gestureend', + 'focus', + 'blur', + 'change', + 'reset', + 'select', + 'submit', + 'focusin', + 'focusout', + 'load', + 'unload', + 'beforeunload', + 'resize', + 'move', + 'DOMContentLoaded', + 'readystatechange', + 'error', + 'abort', + 'scroll', + ]); + function L(t, e) { + return (e && `${e}::${T++}`) || t.uidEvent || T++; + } + function x(t) { + const e = L(t); + return (t.uidEvent = e), (A[e] = A[e] || {}), A[e]; + } + function D(t, e, i = null) { + const n = Object.keys(t); + for (let s = 0, o = n.length; s < o; s++) { + const o = t[n[s]]; + if (o.originalHandler === e && o.delegationSelector === i) return o; + } + return null; + } + function S(t, e, i) { + const n = 'string' == typeof e, + s = n ? i : e; + let o = P(t); + return k.has(o) || (o = t), [n, s, o]; + } + function N(t, e, i, n, s) { + if ('string' != typeof e || !t) return; + if ((i || ((i = n), (n = null)), C.test(e))) { + const t = (t) => + function (e) { + if ( + !e.relatedTarget || + (e.relatedTarget !== e.delegateTarget && + !e.delegateTarget.contains(e.relatedTarget)) + ) + return t.call(this, e); + }; + n ? (n = t(n)) : (i = t(i)); + } + const [o, r, a] = S(e, i, n), + l = x(t), + c = l[a] || (l[a] = {}), + h = D(c, r, o ? i : null); + if (h) return void (h.oneOff = h.oneOff && s); + const d = L(r, e.replace(y, '')), + u = o + ? (function (t, e, i) { + return function n(s) { + const o = t.querySelectorAll(e); + for (let { target: r } = s; r && r !== this; r = r.parentNode) + for (let a = o.length; a--; ) + if (o[a] === r) + return ( + (s.delegateTarget = r), + n.oneOff && j.off(t, s.type, e, i), + i.apply(r, [s]) + ); + return null; + }; + })(t, i, n) + : (function (t, e) { + return function i(n) { + return ( + (n.delegateTarget = t), + i.oneOff && j.off(t, n.type, e), + e.apply(t, [n]) + ); + }; + })(t, i); + (u.delegationSelector = o ? i : null), + (u.originalHandler = r), + (u.oneOff = s), + (u.uidEvent = d), + (c[d] = u), + t.addEventListener(a, u, o); + } + function I(t, e, i, n, s) { + const o = D(e[i], n, s); + o && (t.removeEventListener(i, o, Boolean(s)), delete e[i][o.uidEvent]); + } + function P(t) { + return (t = t.replace(w, '')), O[t] || t; + } + const j = { + on(t, e, i, n) { + N(t, e, i, n, !1); + }, + one(t, e, i, n) { + N(t, e, i, n, !0); + }, + off(t, e, i, n) { + if ('string' != typeof e || !t) return; + const [s, o, r] = S(e, i, n), + a = r !== e, + l = x(t), + c = e.startsWith('.'); + if (void 0 !== o) { + if (!l || !l[r]) return; + return void I(t, l, r, o, s ? i : null); + } + c && + Object.keys(l).forEach((i) => { + !(function (t, e, i, n) { + const s = e[i] || {}; + Object.keys(s).forEach((o) => { + if (o.includes(n)) { + const n = s[o]; + I(t, e, i, n.originalHandler, n.delegationSelector); + } + }); + })(t, l, i, e.slice(1)); + }); + const h = l[r] || {}; + Object.keys(h).forEach((i) => { + const n = i.replace(E, ''); + if (!a || e.includes(n)) { + const e = h[i]; + I(t, l, r, e.originalHandler, e.delegationSelector); + } + }); + }, + trigger(t, e, i) { + if ('string' != typeof e || !t) return null; + const n = f(), + s = P(e), + o = e !== s, + r = k.has(s); + let a, + l = !0, + c = !0, + h = !1, + d = null; + return ( + o && + n && + ((a = n.Event(e, i)), + n(t).trigger(a), + (l = !a.isPropagationStopped()), + (c = !a.isImmediatePropagationStopped()), + (h = a.isDefaultPrevented())), + r + ? ((d = document.createEvent('HTMLEvents')), d.initEvent(s, l, !0)) + : (d = new CustomEvent(e, { bubbles: l, cancelable: !0 })), + void 0 !== i && + Object.keys(i).forEach((t) => { + Object.defineProperty(d, t, { get: () => i[t] }); + }), + h && d.preventDefault(), + c && t.dispatchEvent(d), + d.defaultPrevented && void 0 !== a && a.preventDefault(), + d + ); + }, + }, + M = new Map(), + H = { + set(t, e, i) { + M.has(t) || M.set(t, new Map()); + const n = M.get(t); + n.has(e) || 0 === n.size + ? n.set(e, i) + : console.error( + `Bootstrap doesn't allow more than one instance per element. Bound instance: ${ + Array.from(n.keys())[0] + }.` + ); + }, + get: (t, e) => (M.has(t) && M.get(t).get(e)) || null, + remove(t, e) { + if (!M.has(t)) return; + const i = M.get(t); + i.delete(e), 0 === i.size && M.delete(t); + }, + }; + class B { + constructor(t) { + (t = r(t)) && + ((this._element = t), + H.set(this._element, this.constructor.DATA_KEY, this)); + } + dispose() { + H.remove(this._element, this.constructor.DATA_KEY), + j.off(this._element, this.constructor.EVENT_KEY), + Object.getOwnPropertyNames(this).forEach((t) => { + this[t] = null; + }); + } + _queueCallback(t, e, i = !0) { + b(t, e, i); + } + static getInstance(t) { + return H.get(r(t), this.DATA_KEY); + } + static getOrCreateInstance(t, e = {}) { + return ( + this.getInstance(t) || new this(t, 'object' == typeof e ? e : null) + ); + } + static get VERSION() { + return '5.1.3'; + } + static get NAME() { + throw new Error( + 'You have to implement the static method "NAME", for each component!' + ); + } + static get DATA_KEY() { + return `bs.${this.NAME}`; + } + static get EVENT_KEY() { + return `.${this.DATA_KEY}`; + } + } + const R = (t, e = 'hide') => { + const i = `click.dismiss${t.EVENT_KEY}`, + s = t.NAME; + j.on(document, i, `[data-bs-dismiss="${s}"]`, function (i) { + if ((['A', 'AREA'].includes(this.tagName) && i.preventDefault(), c(this))) + return; + const o = n(this) || this.closest(`.${s}`); + t.getOrCreateInstance(o)[e](); + }); + }; + class W extends B { + static get NAME() { + return 'alert'; + } + close() { + if (j.trigger(this._element, 'close.bs.alert').defaultPrevented) return; + this._element.classList.remove('show'); + const t = this._element.classList.contains('fade'); + this._queueCallback(() => this._destroyElement(), this._element, t); + } + _destroyElement() { + this._element.remove(), + j.trigger(this._element, 'closed.bs.alert'), + this.dispose(); + } + static jQueryInterface(t) { + return this.each(function () { + const e = W.getOrCreateInstance(this); + if ('string' == typeof t) { + if (void 0 === e[t] || t.startsWith('_') || 'constructor' === t) + throw new TypeError(`No method named "${t}"`); + e[t](this); + } + }); + } + } + R(W, 'close'), g(W); + const $ = '[data-bs-toggle="button"]'; + class z extends B { + static get NAME() { + return 'button'; + } + toggle() { + this._element.setAttribute( + 'aria-pressed', + this._element.classList.toggle('active') + ); + } + static jQueryInterface(t) { + return this.each(function () { + const e = z.getOrCreateInstance(this); + 'toggle' === t && e[t](); + }); + } + } + function q(t) { + return ( + 'true' === t || + ('false' !== t && + (t === Number(t).toString() + ? Number(t) + : '' === t || 'null' === t + ? null + : t)) + ); + } + function F(t) { + return t.replace(/[A-Z]/g, (t) => `-${t.toLowerCase()}`); + } + j.on(document, 'click.bs.button.data-api', $, (t) => { + t.preventDefault(); + const e = t.target.closest($); + z.getOrCreateInstance(e).toggle(); + }), + g(z); + const U = { + setDataAttribute(t, e, i) { + t.setAttribute(`data-bs-${F(e)}`, i); + }, + removeDataAttribute(t, e) { + t.removeAttribute(`data-bs-${F(e)}`); + }, + getDataAttributes(t) { + if (!t) return {}; + const e = {}; + return ( + Object.keys(t.dataset) + .filter((t) => t.startsWith('bs')) + .forEach((i) => { + let n = i.replace(/^bs/, ''); + (n = n.charAt(0).toLowerCase() + n.slice(1, n.length)), + (e[n] = q(t.dataset[i])); + }), + e + ); + }, + getDataAttribute: (t, e) => q(t.getAttribute(`data-bs-${F(e)}`)), + offset(t) { + const e = t.getBoundingClientRect(); + return { + top: e.top + window.pageYOffset, + left: e.left + window.pageXOffset, + }; + }, + position: (t) => ({ top: t.offsetTop, left: t.offsetLeft }), + }, + V = { + find: (t, e = document.documentElement) => + [].concat(...Element.prototype.querySelectorAll.call(e, t)), + findOne: (t, e = document.documentElement) => + Element.prototype.querySelector.call(e, t), + children: (t, e) => [].concat(...t.children).filter((t) => t.matches(e)), + parents(t, e) { + const i = []; + let n = t.parentNode; + for (; n && n.nodeType === Node.ELEMENT_NODE && 3 !== n.nodeType; ) + n.matches(e) && i.push(n), (n = n.parentNode); + return i; + }, + prev(t, e) { + let i = t.previousElementSibling; + for (; i; ) { + if (i.matches(e)) return [i]; + i = i.previousElementSibling; + } + return []; + }, + next(t, e) { + let i = t.nextElementSibling; + for (; i; ) { + if (i.matches(e)) return [i]; + i = i.nextElementSibling; + } + return []; + }, + focusableChildren(t) { + const e = [ + 'a', + 'button', + 'input', + 'textarea', + 'select', + 'details', + '[tabindex]', + '[contenteditable="true"]', + ] + .map((t) => `${t}:not([tabindex^="-"])`) + .join(', '); + return this.find(e, t).filter((t) => !c(t) && l(t)); + }, + }, + K = 'carousel', + X = { + interval: 5e3, + keyboard: !0, + slide: !1, + pause: 'hover', + wrap: !0, + touch: !0, + }, + Y = { + interval: '(number|boolean)', + keyboard: 'boolean', + slide: '(boolean|string)', + pause: '(string|boolean)', + wrap: 'boolean', + touch: 'boolean', + }, + Q = 'next', + G = 'prev', + Z = 'left', + J = 'right', + tt = { ArrowLeft: J, ArrowRight: Z }, + et = 'slid.bs.carousel', + it = 'active', + nt = '.active.carousel-item'; + class st extends B { + constructor(t, e) { + super(t), + (this._items = null), + (this._interval = null), + (this._activeElement = null), + (this._isPaused = !1), + (this._isSliding = !1), + (this.touchTimeout = null), + (this.touchStartX = 0), + (this.touchDeltaX = 0), + (this._config = this._getConfig(e)), + (this._indicatorsElement = V.findOne( + '.carousel-indicators', + this._element + )), + (this._touchSupported = + 'ontouchstart' in document.documentElement || + navigator.maxTouchPoints > 0), + (this._pointerEvent = Boolean(window.PointerEvent)), + this._addEventListeners(); + } + static get Default() { + return X; + } + static get NAME() { + return K; + } + next() { + this._slide(Q); + } + nextWhenVisible() { + !document.hidden && l(this._element) && this.next(); + } + prev() { + this._slide(G); + } + pause(t) { + t || (this._isPaused = !0), + V.findOne('.carousel-item-next, .carousel-item-prev', this._element) && + (s(this._element), this.cycle(!0)), + clearInterval(this._interval), + (this._interval = null); + } + cycle(t) { + t || (this._isPaused = !1), + this._interval && + (clearInterval(this._interval), (this._interval = null)), + this._config && + this._config.interval && + !this._isPaused && + (this._updateInterval(), + (this._interval = setInterval( + (document.visibilityState ? this.nextWhenVisible : this.next).bind( + this + ), + this._config.interval + ))); + } + to(t) { + this._activeElement = V.findOne(nt, this._element); + const e = this._getItemIndex(this._activeElement); + if (t > this._items.length - 1 || t < 0) return; + if (this._isSliding) + return void j.one(this._element, et, () => this.to(t)); + if (e === t) return this.pause(), void this.cycle(); + const i = t > e ? Q : G; + this._slide(i, this._items[t]); + } + _getConfig(t) { + return ( + (t = { + ...X, + ...U.getDataAttributes(this._element), + ...('object' == typeof t ? t : {}), + }), + a(K, t, Y), + t + ); + } + _handleSwipe() { + const t = Math.abs(this.touchDeltaX); + if (t <= 40) return; + const e = t / this.touchDeltaX; + (this.touchDeltaX = 0), e && this._slide(e > 0 ? J : Z); + } + _addEventListeners() { + this._config.keyboard && + j.on(this._element, 'keydown.bs.carousel', (t) => this._keydown(t)), + 'hover' === this._config.pause && + (j.on(this._element, 'mouseenter.bs.carousel', (t) => this.pause(t)), + j.on(this._element, 'mouseleave.bs.carousel', (t) => this.cycle(t))), + this._config.touch && + this._touchSupported && + this._addTouchEventListeners(); + } + _addTouchEventListeners() { + const t = (t) => + this._pointerEvent && + ('pen' === t.pointerType || 'touch' === t.pointerType), + e = (e) => { + t(e) + ? (this.touchStartX = e.clientX) + : this._pointerEvent || (this.touchStartX = e.touches[0].clientX); + }, + i = (t) => { + this.touchDeltaX = + t.touches && t.touches.length > 1 + ? 0 + : t.touches[0].clientX - this.touchStartX; + }, + n = (e) => { + t(e) && (this.touchDeltaX = e.clientX - this.touchStartX), + this._handleSwipe(), + 'hover' === this._config.pause && + (this.pause(), + this.touchTimeout && clearTimeout(this.touchTimeout), + (this.touchTimeout = setTimeout( + (t) => this.cycle(t), + 500 + this._config.interval + ))); + }; + V.find('.carousel-item img', this._element).forEach((t) => { + j.on(t, 'dragstart.bs.carousel', (t) => t.preventDefault()); + }), + this._pointerEvent + ? (j.on(this._element, 'pointerdown.bs.carousel', (t) => e(t)), + j.on(this._element, 'pointerup.bs.carousel', (t) => n(t)), + this._element.classList.add('pointer-event')) + : (j.on(this._element, 'touchstart.bs.carousel', (t) => e(t)), + j.on(this._element, 'touchmove.bs.carousel', (t) => i(t)), + j.on(this._element, 'touchend.bs.carousel', (t) => n(t))); + } + _keydown(t) { + if (/input|textarea/i.test(t.target.tagName)) return; + const e = tt[t.key]; + e && (t.preventDefault(), this._slide(e)); + } + _getItemIndex(t) { + return ( + (this._items = + t && t.parentNode ? V.find('.carousel-item', t.parentNode) : []), + this._items.indexOf(t) + ); + } + _getItemByOrder(t, e) { + const i = t === Q; + return v(this._items, e, i, this._config.wrap); + } + _triggerSlideEvent(t, e) { + const i = this._getItemIndex(t), + n = this._getItemIndex(V.findOne(nt, this._element)); + return j.trigger(this._element, 'slide.bs.carousel', { + relatedTarget: t, + direction: e, + from: n, + to: i, + }); + } + _setActiveIndicatorElement(t) { + if (this._indicatorsElement) { + const e = V.findOne('.active', this._indicatorsElement); + e.classList.remove(it), e.removeAttribute('aria-current'); + const i = V.find('[data-bs-target]', this._indicatorsElement); + for (let e = 0; e < i.length; e++) + if ( + Number.parseInt(i[e].getAttribute('data-bs-slide-to'), 10) === + this._getItemIndex(t) + ) { + i[e].classList.add(it), i[e].setAttribute('aria-current', 'true'); + break; + } + } + } + _updateInterval() { + const t = this._activeElement || V.findOne(nt, this._element); + if (!t) return; + const e = Number.parseInt(t.getAttribute('data-bs-interval'), 10); + e + ? ((this._config.defaultInterval = + this._config.defaultInterval || this._config.interval), + (this._config.interval = e)) + : (this._config.interval = + this._config.defaultInterval || this._config.interval); + } + _slide(t, e) { + const i = this._directionToOrder(t), + n = V.findOne(nt, this._element), + s = this._getItemIndex(n), + o = e || this._getItemByOrder(i, n), + r = this._getItemIndex(o), + a = Boolean(this._interval), + l = i === Q, + c = l ? 'carousel-item-start' : 'carousel-item-end', + h = l ? 'carousel-item-next' : 'carousel-item-prev', + d = this._orderToDirection(i); + if (o && o.classList.contains(it)) return void (this._isSliding = !1); + if (this._isSliding) return; + if (this._triggerSlideEvent(o, d).defaultPrevented) return; + if (!n || !o) return; + (this._isSliding = !0), + a && this.pause(), + this._setActiveIndicatorElement(o), + (this._activeElement = o); + const f = () => { + j.trigger(this._element, et, { + relatedTarget: o, + direction: d, + from: s, + to: r, + }); + }; + if (this._element.classList.contains('slide')) { + o.classList.add(h), u(o), n.classList.add(c), o.classList.add(c); + const t = () => { + o.classList.remove(c, h), + o.classList.add(it), + n.classList.remove(it, h, c), + (this._isSliding = !1), + setTimeout(f, 0); + }; + this._queueCallback(t, n, !0); + } else n.classList.remove(it), o.classList.add(it), (this._isSliding = !1), f(); + a && this.cycle(); + } + _directionToOrder(t) { + return [J, Z].includes(t) + ? m() + ? t === Z + ? G + : Q + : t === Z + ? Q + : G + : t; + } + _orderToDirection(t) { + return [Q, G].includes(t) + ? m() + ? t === G + ? Z + : J + : t === G + ? J + : Z + : t; + } + static carouselInterface(t, e) { + const i = st.getOrCreateInstance(t, e); + let { _config: n } = i; + 'object' == typeof e && (n = { ...n, ...e }); + const s = 'string' == typeof e ? e : n.slide; + if ('number' == typeof e) i.to(e); + else if ('string' == typeof s) { + if (void 0 === i[s]) throw new TypeError(`No method named "${s}"`); + i[s](); + } else n.interval && n.ride && (i.pause(), i.cycle()); + } + static jQueryInterface(t) { + return this.each(function () { + st.carouselInterface(this, t); + }); + } + static dataApiClickHandler(t) { + const e = n(this); + if (!e || !e.classList.contains('carousel')) return; + const i = { ...U.getDataAttributes(e), ...U.getDataAttributes(this) }, + s = this.getAttribute('data-bs-slide-to'); + s && (i.interval = !1), + st.carouselInterface(e, i), + s && st.getInstance(e).to(s), + t.preventDefault(); + } + } + j.on( + document, + 'click.bs.carousel.data-api', + '[data-bs-slide], [data-bs-slide-to]', + st.dataApiClickHandler + ), + j.on(window, 'load.bs.carousel.data-api', () => { + const t = V.find('[data-bs-ride="carousel"]'); + for (let e = 0, i = t.length; e < i; e++) + st.carouselInterface(t[e], st.getInstance(t[e])); + }), + g(st); + const ot = 'collapse', + rt = { toggle: !0, parent: null }, + at = { toggle: 'boolean', parent: '(null|element)' }, + lt = 'show', + ct = 'collapse', + ht = 'collapsing', + dt = 'collapsed', + ut = ':scope .collapse .collapse', + ft = '[data-bs-toggle="collapse"]'; + class pt extends B { + constructor(t, e) { + super(t), + (this._isTransitioning = !1), + (this._config = this._getConfig(e)), + (this._triggerArray = []); + const n = V.find(ft); + for (let t = 0, e = n.length; t < e; t++) { + const e = n[t], + s = i(e), + o = V.find(s).filter((t) => t === this._element); + null !== s && + o.length && + ((this._selector = s), this._triggerArray.push(e)); + } + this._initializeChildren(), + this._config.parent || + this._addAriaAndCollapsedClass(this._triggerArray, this._isShown()), + this._config.toggle && this.toggle(); + } + static get Default() { + return rt; + } + static get NAME() { + return ot; + } + toggle() { + this._isShown() ? this.hide() : this.show(); + } + show() { + if (this._isTransitioning || this._isShown()) return; + let t, + e = []; + if (this._config.parent) { + const t = V.find(ut, this._config.parent); + e = V.find( + '.collapse.show, .collapse.collapsing', + this._config.parent + ).filter((e) => !t.includes(e)); + } + const i = V.findOne(this._selector); + if (e.length) { + const n = e.find((t) => i !== t); + if (((t = n ? pt.getInstance(n) : null), t && t._isTransitioning)) + return; + } + if (j.trigger(this._element, 'show.bs.collapse').defaultPrevented) return; + e.forEach((e) => { + i !== e && pt.getOrCreateInstance(e, { toggle: !1 }).hide(), + t || H.set(e, 'bs.collapse', null); + }); + const n = this._getDimension(); + this._element.classList.remove(ct), + this._element.classList.add(ht), + (this._element.style[n] = 0), + this._addAriaAndCollapsedClass(this._triggerArray, !0), + (this._isTransitioning = !0); + const s = `scroll${n[0].toUpperCase() + n.slice(1)}`; + this._queueCallback( + () => { + (this._isTransitioning = !1), + this._element.classList.remove(ht), + this._element.classList.add(ct, lt), + (this._element.style[n] = ''), + j.trigger(this._element, 'shown.bs.collapse'); + }, + this._element, + !0 + ), + (this._element.style[n] = `${this._element[s]}px`); + } + hide() { + if (this._isTransitioning || !this._isShown()) return; + if (j.trigger(this._element, 'hide.bs.collapse').defaultPrevented) return; + const t = this._getDimension(); + (this._element.style[t] = `${ + this._element.getBoundingClientRect()[t] + }px`), + u(this._element), + this._element.classList.add(ht), + this._element.classList.remove(ct, lt); + const e = this._triggerArray.length; + for (let t = 0; t < e; t++) { + const e = this._triggerArray[t], + i = n(e); + i && !this._isShown(i) && this._addAriaAndCollapsedClass([e], !1); + } + (this._isTransitioning = !0), + (this._element.style[t] = ''), + this._queueCallback( + () => { + (this._isTransitioning = !1), + this._element.classList.remove(ht), + this._element.classList.add(ct), + j.trigger(this._element, 'hidden.bs.collapse'); + }, + this._element, + !0 + ); + } + _isShown(t = this._element) { + return t.classList.contains(lt); + } + _getConfig(t) { + return ( + ((t = { ...rt, ...U.getDataAttributes(this._element), ...t }).toggle = + Boolean(t.toggle)), + (t.parent = r(t.parent)), + a(ot, t, at), + t + ); + } + _getDimension() { + return this._element.classList.contains('collapse-horizontal') + ? 'width' + : 'height'; + } + _initializeChildren() { + if (!this._config.parent) return; + const t = V.find(ut, this._config.parent); + V.find(ft, this._config.parent) + .filter((e) => !t.includes(e)) + .forEach((t) => { + const e = n(t); + e && this._addAriaAndCollapsedClass([t], this._isShown(e)); + }); + } + _addAriaAndCollapsedClass(t, e) { + t.length && + t.forEach((t) => { + e ? t.classList.remove(dt) : t.classList.add(dt), + t.setAttribute('aria-expanded', e); + }); + } + static jQueryInterface(t) { + return this.each(function () { + const e = {}; + 'string' == typeof t && /show|hide/.test(t) && (e.toggle = !1); + const i = pt.getOrCreateInstance(this, e); + if ('string' == typeof t) { + if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`); + i[t](); + } + }); + } + } + j.on(document, 'click.bs.collapse.data-api', ft, function (t) { + ('A' === t.target.tagName || + (t.delegateTarget && 'A' === t.delegateTarget.tagName)) && + t.preventDefault(); + const e = i(this); + V.find(e).forEach((t) => { + pt.getOrCreateInstance(t, { toggle: !1 }).toggle(); + }); + }), + g(pt); + var mt = 'top', + gt = 'bottom', + _t = 'right', + bt = 'left', + vt = 'auto', + yt = [mt, gt, _t, bt], + wt = 'start', + Et = 'end', + At = 'clippingParents', + Tt = 'viewport', + Ot = 'popper', + Ct = 'reference', + kt = yt.reduce(function (t, e) { + return t.concat([e + '-' + wt, e + '-' + Et]); + }, []), + Lt = [].concat(yt, [vt]).reduce(function (t, e) { + return t.concat([e, e + '-' + wt, e + '-' + Et]); + }, []), + xt = 'beforeRead', + Dt = 'read', + St = 'afterRead', + Nt = 'beforeMain', + It = 'main', + Pt = 'afterMain', + jt = 'beforeWrite', + Mt = 'write', + Ht = 'afterWrite', + Bt = [xt, Dt, St, Nt, It, Pt, jt, Mt, Ht]; + function Rt(t) { + return t ? (t.nodeName || '').toLowerCase() : null; + } + function Wt(t) { + if (null == t) return window; + if ('[object Window]' !== t.toString()) { + var e = t.ownerDocument; + return (e && e.defaultView) || window; + } + return t; + } + function $t(t) { + return t instanceof Wt(t).Element || t instanceof Element; + } + function zt(t) { + return t instanceof Wt(t).HTMLElement || t instanceof HTMLElement; + } + function qt(t) { + return ( + 'undefined' != typeof ShadowRoot && + (t instanceof Wt(t).ShadowRoot || t instanceof ShadowRoot) + ); + } + const Ft = { + name: 'applyStyles', + enabled: !0, + phase: 'write', + fn: function (t) { + var e = t.state; + Object.keys(e.elements).forEach(function (t) { + var i = e.styles[t] || {}, + n = e.attributes[t] || {}, + s = e.elements[t]; + zt(s) && + Rt(s) && + (Object.assign(s.style, i), + Object.keys(n).forEach(function (t) { + var e = n[t]; + !1 === e + ? s.removeAttribute(t) + : s.setAttribute(t, !0 === e ? '' : e); + })); + }); + }, + effect: function (t) { + var e = t.state, + i = { + popper: { + position: e.options.strategy, + left: '0', + top: '0', + margin: '0', + }, + arrow: { position: 'absolute' }, + reference: {}, + }; + return ( + Object.assign(e.elements.popper.style, i.popper), + (e.styles = i), + e.elements.arrow && Object.assign(e.elements.arrow.style, i.arrow), + function () { + Object.keys(e.elements).forEach(function (t) { + var n = e.elements[t], + s = e.attributes[t] || {}, + o = Object.keys( + e.styles.hasOwnProperty(t) ? e.styles[t] : i[t] + ).reduce(function (t, e) { + return (t[e] = ''), t; + }, {}); + zt(n) && + Rt(n) && + (Object.assign(n.style, o), + Object.keys(s).forEach(function (t) { + n.removeAttribute(t); + })); + }); + } + ); + }, + requires: ['computeStyles'], + }; + function Ut(t) { + return t.split('-')[0]; + } + function Vt(t, e) { + var i = t.getBoundingClientRect(); + return { + width: i.width / 1, + height: i.height / 1, + top: i.top / 1, + right: i.right / 1, + bottom: i.bottom / 1, + left: i.left / 1, + x: i.left / 1, + y: i.top / 1, + }; + } + function Kt(t) { + var e = Vt(t), + i = t.offsetWidth, + n = t.offsetHeight; + return ( + Math.abs(e.width - i) <= 1 && (i = e.width), + Math.abs(e.height - n) <= 1 && (n = e.height), + { x: t.offsetLeft, y: t.offsetTop, width: i, height: n } + ); + } + function Xt(t, e) { + var i = e.getRootNode && e.getRootNode(); + if (t.contains(e)) return !0; + if (i && qt(i)) { + var n = e; + do { + if (n && t.isSameNode(n)) return !0; + n = n.parentNode || n.host; + } while (n); + } + return !1; + } + function Yt(t) { + return Wt(t).getComputedStyle(t); + } + function Qt(t) { + return ['table', 'td', 'th'].indexOf(Rt(t)) >= 0; + } + function Gt(t) { + return ( + ($t(t) ? t.ownerDocument : t.document) || window.document + ).documentElement; + } + function Zt(t) { + return 'html' === Rt(t) + ? t + : t.assignedSlot || t.parentNode || (qt(t) ? t.host : null) || Gt(t); + } + function Jt(t) { + return zt(t) && 'fixed' !== Yt(t).position ? t.offsetParent : null; + } + function te(t) { + for (var e = Wt(t), i = Jt(t); i && Qt(i) && 'static' === Yt(i).position; ) + i = Jt(i); + return i && + ('html' === Rt(i) || ('body' === Rt(i) && 'static' === Yt(i).position)) + ? e + : i || + (function (t) { + var e = -1 !== navigator.userAgent.toLowerCase().indexOf('firefox'); + if ( + -1 !== navigator.userAgent.indexOf('Trident') && + zt(t) && + 'fixed' === Yt(t).position + ) + return null; + for ( + var i = Zt(t); + zt(i) && ['html', 'body'].indexOf(Rt(i)) < 0; + + ) { + var n = Yt(i); + if ( + 'none' !== n.transform || + 'none' !== n.perspective || + 'paint' === n.contain || + -1 !== ['transform', 'perspective'].indexOf(n.willChange) || + (e && 'filter' === n.willChange) || + (e && n.filter && 'none' !== n.filter) + ) + return i; + i = i.parentNode; + } + return null; + })(t) || + e; + } + function ee(t) { + return ['top', 'bottom'].indexOf(t) >= 0 ? 'x' : 'y'; + } + var ie = Math.max, + ne = Math.min, + se = Math.round; + function oe(t, e, i) { + return ie(t, ne(e, i)); + } + function re(t) { + return Object.assign({}, { top: 0, right: 0, bottom: 0, left: 0 }, t); + } + function ae(t, e) { + return e.reduce(function (e, i) { + return (e[i] = t), e; + }, {}); + } + const le = { + name: 'arrow', + enabled: !0, + phase: 'main', + fn: function (t) { + var e, + i = t.state, + n = t.name, + s = t.options, + o = i.elements.arrow, + r = i.modifiersData.popperOffsets, + a = Ut(i.placement), + l = ee(a), + c = [bt, _t].indexOf(a) >= 0 ? 'height' : 'width'; + if (o && r) { + var h = (function (t, e) { + return re( + 'number' != + typeof (t = + 'function' == typeof t + ? t(Object.assign({}, e.rects, { placement: e.placement })) + : t) + ? t + : ae(t, yt) + ); + })(s.padding, i), + d = Kt(o), + u = 'y' === l ? mt : bt, + f = 'y' === l ? gt : _t, + p = + i.rects.reference[c] + + i.rects.reference[l] - + r[l] - + i.rects.popper[c], + m = r[l] - i.rects.reference[l], + g = te(o), + _ = g ? ('y' === l ? g.clientHeight || 0 : g.clientWidth || 0) : 0, + b = p / 2 - m / 2, + v = h[u], + y = _ - d[c] - h[f], + w = _ / 2 - d[c] / 2 + b, + E = oe(v, w, y), + A = l; + i.modifiersData[n] = (((e = {})[A] = E), (e.centerOffset = E - w), e); + } + }, + effect: function (t) { + var e = t.state, + i = t.options.element, + n = void 0 === i ? '[data-popper-arrow]' : i; + null != n && + ('string' != typeof n || (n = e.elements.popper.querySelector(n))) && + Xt(e.elements.popper, n) && + (e.elements.arrow = n); + }, + requires: ['popperOffsets'], + requiresIfExists: ['preventOverflow'], + }; + function ce(t) { + return t.split('-')[1]; + } + var he = { top: 'auto', right: 'auto', bottom: 'auto', left: 'auto' }; + function de(t) { + var e, + i = t.popper, + n = t.popperRect, + s = t.placement, + o = t.variation, + r = t.offsets, + a = t.position, + l = t.gpuAcceleration, + c = t.adaptive, + h = t.roundOffsets, + d = + !0 === h + ? (function (t) { + var e = t.x, + i = t.y, + n = window.devicePixelRatio || 1; + return { x: se(se(e * n) / n) || 0, y: se(se(i * n) / n) || 0 }; + })(r) + : 'function' == typeof h + ? h(r) + : r, + u = d.x, + f = void 0 === u ? 0 : u, + p = d.y, + m = void 0 === p ? 0 : p, + g = r.hasOwnProperty('x'), + _ = r.hasOwnProperty('y'), + b = bt, + v = mt, + y = window; + if (c) { + var w = te(i), + E = 'clientHeight', + A = 'clientWidth'; + w === Wt(i) && + 'static' !== Yt((w = Gt(i))).position && + 'absolute' === a && + ((E = 'scrollHeight'), (A = 'scrollWidth')), + (w = w), + (s !== mt && ((s !== bt && s !== _t) || o !== Et)) || + ((v = gt), (m -= w[E] - n.height), (m *= l ? 1 : -1)), + (s !== bt && ((s !== mt && s !== gt) || o !== Et)) || + ((b = _t), (f -= w[A] - n.width), (f *= l ? 1 : -1)); + } + var T, + O = Object.assign({ position: a }, c && he); + return l + ? Object.assign( + {}, + O, + (((T = {})[v] = _ ? '0' : ''), + (T[b] = g ? '0' : ''), + (T.transform = + (y.devicePixelRatio || 1) <= 1 + ? 'translate(' + f + 'px, ' + m + 'px)' + : 'translate3d(' + f + 'px, ' + m + 'px, 0)'), + T) + ) + : Object.assign( + {}, + O, + (((e = {})[v] = _ ? m + 'px' : ''), + (e[b] = g ? f + 'px' : ''), + (e.transform = ''), + e) + ); + } + const ue = { + name: 'computeStyles', + enabled: !0, + phase: 'beforeWrite', + fn: function (t) { + var e = t.state, + i = t.options, + n = i.gpuAcceleration, + s = void 0 === n || n, + o = i.adaptive, + r = void 0 === o || o, + a = i.roundOffsets, + l = void 0 === a || a, + c = { + placement: Ut(e.placement), + variation: ce(e.placement), + popper: e.elements.popper, + popperRect: e.rects.popper, + gpuAcceleration: s, + }; + null != e.modifiersData.popperOffsets && + (e.styles.popper = Object.assign( + {}, + e.styles.popper, + de( + Object.assign({}, c, { + offsets: e.modifiersData.popperOffsets, + position: e.options.strategy, + adaptive: r, + roundOffsets: l, + }) + ) + )), + null != e.modifiersData.arrow && + (e.styles.arrow = Object.assign( + {}, + e.styles.arrow, + de( + Object.assign({}, c, { + offsets: e.modifiersData.arrow, + position: 'absolute', + adaptive: !1, + roundOffsets: l, + }) + ) + )), + (e.attributes.popper = Object.assign({}, e.attributes.popper, { + 'data-popper-placement': e.placement, + })); + }, + data: {}, + }; + var fe = { passive: !0 }; + const pe = { + name: 'eventListeners', + enabled: !0, + phase: 'write', + fn: function () {}, + effect: function (t) { + var e = t.state, + i = t.instance, + n = t.options, + s = n.scroll, + o = void 0 === s || s, + r = n.resize, + a = void 0 === r || r, + l = Wt(e.elements.popper), + c = [].concat(e.scrollParents.reference, e.scrollParents.popper); + return ( + o && + c.forEach(function (t) { + t.addEventListener('scroll', i.update, fe); + }), + a && l.addEventListener('resize', i.update, fe), + function () { + o && + c.forEach(function (t) { + t.removeEventListener('scroll', i.update, fe); + }), + a && l.removeEventListener('resize', i.update, fe); + } + ); + }, + data: {}, + }; + var me = { left: 'right', right: 'left', bottom: 'top', top: 'bottom' }; + function ge(t) { + return t.replace(/left|right|bottom|top/g, function (t) { + return me[t]; + }); + } + var _e = { start: 'end', end: 'start' }; + function be(t) { + return t.replace(/start|end/g, function (t) { + return _e[t]; + }); + } + function ve(t) { + var e = Wt(t); + return { scrollLeft: e.pageXOffset, scrollTop: e.pageYOffset }; + } + function ye(t) { + return Vt(Gt(t)).left + ve(t).scrollLeft; + } + function we(t) { + var e = Yt(t), + i = e.overflow, + n = e.overflowX, + s = e.overflowY; + return /auto|scroll|overlay|hidden/.test(i + s + n); + } + function Ee(t) { + return ['html', 'body', '#document'].indexOf(Rt(t)) >= 0 + ? t.ownerDocument.body + : zt(t) && we(t) + ? t + : Ee(Zt(t)); + } + function Ae(t, e) { + var i; + void 0 === e && (e = []); + var n = Ee(t), + s = n === (null == (i = t.ownerDocument) ? void 0 : i.body), + o = Wt(n), + r = s ? [o].concat(o.visualViewport || [], we(n) ? n : []) : n, + a = e.concat(r); + return s ? a : a.concat(Ae(Zt(r))); + } + function Te(t) { + return Object.assign({}, t, { + left: t.x, + top: t.y, + right: t.x + t.width, + bottom: t.y + t.height, + }); + } + function Oe(t, e) { + return e === Tt + ? Te( + (function (t) { + var e = Wt(t), + i = Gt(t), + n = e.visualViewport, + s = i.clientWidth, + o = i.clientHeight, + r = 0, + a = 0; + return ( + n && + ((s = n.width), + (o = n.height), + /^((?!chrome|android).)*safari/i.test(navigator.userAgent) || + ((r = n.offsetLeft), (a = n.offsetTop))), + { width: s, height: o, x: r + ye(t), y: a } + ); + })(t) + ) + : zt(e) + ? (function (t) { + var e = Vt(t); + return ( + (e.top = e.top + t.clientTop), + (e.left = e.left + t.clientLeft), + (e.bottom = e.top + t.clientHeight), + (e.right = e.left + t.clientWidth), + (e.width = t.clientWidth), + (e.height = t.clientHeight), + (e.x = e.left), + (e.y = e.top), + e + ); + })(e) + : Te( + (function (t) { + var e, + i = Gt(t), + n = ve(t), + s = null == (e = t.ownerDocument) ? void 0 : e.body, + o = ie( + i.scrollWidth, + i.clientWidth, + s ? s.scrollWidth : 0, + s ? s.clientWidth : 0 + ), + r = ie( + i.scrollHeight, + i.clientHeight, + s ? s.scrollHeight : 0, + s ? s.clientHeight : 0 + ), + a = -n.scrollLeft + ye(t), + l = -n.scrollTop; + return ( + 'rtl' === Yt(s || i).direction && + (a += ie(i.clientWidth, s ? s.clientWidth : 0) - o), + { width: o, height: r, x: a, y: l } + ); + })(Gt(t)) + ); + } + function Ce(t) { + var e, + i = t.reference, + n = t.element, + s = t.placement, + o = s ? Ut(s) : null, + r = s ? ce(s) : null, + a = i.x + i.width / 2 - n.width / 2, + l = i.y + i.height / 2 - n.height / 2; + switch (o) { + case mt: + e = { x: a, y: i.y - n.height }; + break; + case gt: + e = { x: a, y: i.y + i.height }; + break; + case _t: + e = { x: i.x + i.width, y: l }; + break; + case bt: + e = { x: i.x - n.width, y: l }; + break; + default: + e = { x: i.x, y: i.y }; + } + var c = o ? ee(o) : null; + if (null != c) { + var h = 'y' === c ? 'height' : 'width'; + switch (r) { + case wt: + e[c] = e[c] - (i[h] / 2 - n[h] / 2); + break; + case Et: + e[c] = e[c] + (i[h] / 2 - n[h] / 2); + } + } + return e; + } + function ke(t, e) { + void 0 === e && (e = {}); + var i = e, + n = i.placement, + s = void 0 === n ? t.placement : n, + o = i.boundary, + r = void 0 === o ? At : o, + a = i.rootBoundary, + l = void 0 === a ? Tt : a, + c = i.elementContext, + h = void 0 === c ? Ot : c, + d = i.altBoundary, + u = void 0 !== d && d, + f = i.padding, + p = void 0 === f ? 0 : f, + m = re('number' != typeof p ? p : ae(p, yt)), + g = h === Ot ? Ct : Ot, + _ = t.rects.popper, + b = t.elements[u ? g : h], + v = (function (t, e, i) { + var n = + 'clippingParents' === e + ? (function (t) { + var e = Ae(Zt(t)), + i = + ['absolute', 'fixed'].indexOf(Yt(t).position) >= 0 && + zt(t) + ? te(t) + : t; + return $t(i) + ? e.filter(function (t) { + return $t(t) && Xt(t, i) && 'body' !== Rt(t); + }) + : []; + })(t) + : [].concat(e), + s = [].concat(n, [i]), + o = s[0], + r = s.reduce(function (e, i) { + var n = Oe(t, i); + return ( + (e.top = ie(n.top, e.top)), + (e.right = ne(n.right, e.right)), + (e.bottom = ne(n.bottom, e.bottom)), + (e.left = ie(n.left, e.left)), + e + ); + }, Oe(t, o)); + return ( + (r.width = r.right - r.left), + (r.height = r.bottom - r.top), + (r.x = r.left), + (r.y = r.top), + r + ); + })($t(b) ? b : b.contextElement || Gt(t.elements.popper), r, l), + y = Vt(t.elements.reference), + w = Ce({ reference: y, element: _, strategy: 'absolute', placement: s }), + E = Te(Object.assign({}, _, w)), + A = h === Ot ? E : y, + T = { + top: v.top - A.top + m.top, + bottom: A.bottom - v.bottom + m.bottom, + left: v.left - A.left + m.left, + right: A.right - v.right + m.right, + }, + O = t.modifiersData.offset; + if (h === Ot && O) { + var C = O[s]; + Object.keys(T).forEach(function (t) { + var e = [_t, gt].indexOf(t) >= 0 ? 1 : -1, + i = [mt, gt].indexOf(t) >= 0 ? 'y' : 'x'; + T[t] += C[i] * e; + }); + } + return T; + } + function Le(t, e) { + void 0 === e && (e = {}); + var i = e, + n = i.placement, + s = i.boundary, + o = i.rootBoundary, + r = i.padding, + a = i.flipVariations, + l = i.allowedAutoPlacements, + c = void 0 === l ? Lt : l, + h = ce(n), + d = h + ? a + ? kt + : kt.filter(function (t) { + return ce(t) === h; + }) + : yt, + u = d.filter(function (t) { + return c.indexOf(t) >= 0; + }); + 0 === u.length && (u = d); + var f = u.reduce(function (e, i) { + return ( + (e[i] = ke(t, { + placement: i, + boundary: s, + rootBoundary: o, + padding: r, + })[Ut(i)]), + e + ); + }, {}); + return Object.keys(f).sort(function (t, e) { + return f[t] - f[e]; + }); + } + const xe = { + name: 'flip', + enabled: !0, + phase: 'main', + fn: function (t) { + var e = t.state, + i = t.options, + n = t.name; + if (!e.modifiersData[n]._skip) { + for ( + var s = i.mainAxis, + o = void 0 === s || s, + r = i.altAxis, + a = void 0 === r || r, + l = i.fallbackPlacements, + c = i.padding, + h = i.boundary, + d = i.rootBoundary, + u = i.altBoundary, + f = i.flipVariations, + p = void 0 === f || f, + m = i.allowedAutoPlacements, + g = e.options.placement, + _ = Ut(g), + b = + l || + (_ !== g && p + ? (function (t) { + if (Ut(t) === vt) return []; + var e = ge(t); + return [be(t), e, be(e)]; + })(g) + : [ge(g)]), + v = [g].concat(b).reduce(function (t, i) { + return t.concat( + Ut(i) === vt + ? Le(e, { + placement: i, + boundary: h, + rootBoundary: d, + padding: c, + flipVariations: p, + allowedAutoPlacements: m, + }) + : i + ); + }, []), + y = e.rects.reference, + w = e.rects.popper, + E = new Map(), + A = !0, + T = v[0], + O = 0; + O < v.length; + O++ + ) { + var C = v[O], + k = Ut(C), + L = ce(C) === wt, + x = [mt, gt].indexOf(k) >= 0, + D = x ? 'width' : 'height', + S = ke(e, { + placement: C, + boundary: h, + rootBoundary: d, + altBoundary: u, + padding: c, + }), + N = x ? (L ? _t : bt) : L ? gt : mt; + y[D] > w[D] && (N = ge(N)); + var I = ge(N), + P = []; + if ( + (o && P.push(S[k] <= 0), + a && P.push(S[N] <= 0, S[I] <= 0), + P.every(function (t) { + return t; + })) + ) { + (T = C), (A = !1); + break; + } + E.set(C, P); + } + if (A) + for ( + var j = function (t) { + var e = v.find(function (e) { + var i = E.get(e); + if (i) + return i.slice(0, t).every(function (t) { + return t; + }); + }); + if (e) return (T = e), 'break'; + }, + M = p ? 3 : 1; + M > 0 && 'break' !== j(M); + M-- + ); + e.placement !== T && + ((e.modifiersData[n]._skip = !0), (e.placement = T), (e.reset = !0)); + } + }, + requiresIfExists: ['offset'], + data: { _skip: !1 }, + }; + function De(t, e, i) { + return ( + void 0 === i && (i = { x: 0, y: 0 }), + { + top: t.top - e.height - i.y, + right: t.right - e.width + i.x, + bottom: t.bottom - e.height + i.y, + left: t.left - e.width - i.x, + } + ); + } + function Se(t) { + return [mt, _t, gt, bt].some(function (e) { + return t[e] >= 0; + }); + } + const Ne = { + name: 'hide', + enabled: !0, + phase: 'main', + requiresIfExists: ['preventOverflow'], + fn: function (t) { + var e = t.state, + i = t.name, + n = e.rects.reference, + s = e.rects.popper, + o = e.modifiersData.preventOverflow, + r = ke(e, { elementContext: 'reference' }), + a = ke(e, { altBoundary: !0 }), + l = De(r, n), + c = De(a, s, o), + h = Se(l), + d = Se(c); + (e.modifiersData[i] = { + referenceClippingOffsets: l, + popperEscapeOffsets: c, + isReferenceHidden: h, + hasPopperEscaped: d, + }), + (e.attributes.popper = Object.assign({}, e.attributes.popper, { + 'data-popper-reference-hidden': h, + 'data-popper-escaped': d, + })); + }, + }, + Ie = { + name: 'offset', + enabled: !0, + phase: 'main', + requires: ['popperOffsets'], + fn: function (t) { + var e = t.state, + i = t.options, + n = t.name, + s = i.offset, + o = void 0 === s ? [0, 0] : s, + r = Lt.reduce(function (t, i) { + return ( + (t[i] = (function (t, e, i) { + var n = Ut(t), + s = [bt, mt].indexOf(n) >= 0 ? -1 : 1, + o = + 'function' == typeof i + ? i(Object.assign({}, e, { placement: t })) + : i, + r = o[0], + a = o[1]; + return ( + (r = r || 0), + (a = (a || 0) * s), + [bt, _t].indexOf(n) >= 0 ? { x: a, y: r } : { x: r, y: a } + ); + })(i, e.rects, o)), + t + ); + }, {}), + a = r[e.placement], + l = a.x, + c = a.y; + null != e.modifiersData.popperOffsets && + ((e.modifiersData.popperOffsets.x += l), + (e.modifiersData.popperOffsets.y += c)), + (e.modifiersData[n] = r); + }, + }, + Pe = { + name: 'popperOffsets', + enabled: !0, + phase: 'read', + fn: function (t) { + var e = t.state, + i = t.name; + e.modifiersData[i] = Ce({ + reference: e.rects.reference, + element: e.rects.popper, + strategy: 'absolute', + placement: e.placement, + }); + }, + data: {}, + }, + je = { + name: 'preventOverflow', + enabled: !0, + phase: 'main', + fn: function (t) { + var e = t.state, + i = t.options, + n = t.name, + s = i.mainAxis, + o = void 0 === s || s, + r = i.altAxis, + a = void 0 !== r && r, + l = i.boundary, + c = i.rootBoundary, + h = i.altBoundary, + d = i.padding, + u = i.tether, + f = void 0 === u || u, + p = i.tetherOffset, + m = void 0 === p ? 0 : p, + g = ke(e, { + boundary: l, + rootBoundary: c, + padding: d, + altBoundary: h, + }), + _ = Ut(e.placement), + b = ce(e.placement), + v = !b, + y = ee(_), + w = 'x' === y ? 'y' : 'x', + E = e.modifiersData.popperOffsets, + A = e.rects.reference, + T = e.rects.popper, + O = + 'function' == typeof m + ? m(Object.assign({}, e.rects, { placement: e.placement })) + : m, + C = { x: 0, y: 0 }; + if (E) { + if (o || a) { + var k = 'y' === y ? mt : bt, + L = 'y' === y ? gt : _t, + x = 'y' === y ? 'height' : 'width', + D = E[y], + S = E[y] + g[k], + N = E[y] - g[L], + I = f ? -T[x] / 2 : 0, + P = b === wt ? A[x] : T[x], + j = b === wt ? -T[x] : -A[x], + M = e.elements.arrow, + H = f && M ? Kt(M) : { width: 0, height: 0 }, + B = e.modifiersData['arrow#persistent'] + ? e.modifiersData['arrow#persistent'].padding + : { top: 0, right: 0, bottom: 0, left: 0 }, + R = B[k], + W = B[L], + $ = oe(0, A[x], H[x]), + z = v ? A[x] / 2 - I - $ - R - O : P - $ - R - O, + q = v ? -A[x] / 2 + I + $ + W + O : j + $ + W + O, + F = e.elements.arrow && te(e.elements.arrow), + U = F ? ('y' === y ? F.clientTop || 0 : F.clientLeft || 0) : 0, + V = e.modifiersData.offset + ? e.modifiersData.offset[e.placement][y] + : 0, + K = E[y] + z - V - U, + X = E[y] + q - V; + if (o) { + var Y = oe(f ? ne(S, K) : S, D, f ? ie(N, X) : N); + (E[y] = Y), (C[y] = Y - D); + } + if (a) { + var Q = 'x' === y ? mt : bt, + G = 'x' === y ? gt : _t, + Z = E[w], + J = Z + g[Q], + tt = Z - g[G], + et = oe(f ? ne(J, K) : J, Z, f ? ie(tt, X) : tt); + (E[w] = et), (C[w] = et - Z); + } + } + e.modifiersData[n] = C; + } + }, + requiresIfExists: ['offset'], + }; + function Me(t, e, i) { + void 0 === i && (i = !1); + var n = zt(e); + zt(e) && + (function (t) { + var e = t.getBoundingClientRect(); + e.width, t.offsetWidth, e.height, t.offsetHeight; + })(e); + var s, + o, + r = Gt(e), + a = Vt(t), + l = { scrollLeft: 0, scrollTop: 0 }, + c = { x: 0, y: 0 }; + return ( + (n || (!n && !i)) && + (('body' !== Rt(e) || we(r)) && + (l = + (s = e) !== Wt(s) && zt(s) + ? { scrollLeft: (o = s).scrollLeft, scrollTop: o.scrollTop } + : ve(s)), + zt(e) + ? (((c = Vt(e)).x += e.clientLeft), (c.y += e.clientTop)) + : r && (c.x = ye(r))), + { + x: a.left + l.scrollLeft - c.x, + y: a.top + l.scrollTop - c.y, + width: a.width, + height: a.height, + } + ); + } + function He(t) { + var e = new Map(), + i = new Set(), + n = []; + function s(t) { + i.add(t.name), + [] + .concat(t.requires || [], t.requiresIfExists || []) + .forEach(function (t) { + if (!i.has(t)) { + var n = e.get(t); + n && s(n); + } + }), + n.push(t); + } + return ( + t.forEach(function (t) { + e.set(t.name, t); + }), + t.forEach(function (t) { + i.has(t.name) || s(t); + }), + n + ); + } + var Be = { placement: 'bottom', modifiers: [], strategy: 'absolute' }; + function Re() { + for (var t = arguments.length, e = new Array(t), i = 0; i < t; i++) + e[i] = arguments[i]; + return !e.some(function (t) { + return !(t && 'function' == typeof t.getBoundingClientRect); + }); + } + function We(t) { + void 0 === t && (t = {}); + var e = t, + i = e.defaultModifiers, + n = void 0 === i ? [] : i, + s = e.defaultOptions, + o = void 0 === s ? Be : s; + return function (t, e, i) { + void 0 === i && (i = o); + var s, + r, + a = { + placement: 'bottom', + orderedModifiers: [], + options: Object.assign({}, Be, o), + modifiersData: {}, + elements: { reference: t, popper: e }, + attributes: {}, + styles: {}, + }, + l = [], + c = !1, + h = { + state: a, + setOptions: function (i) { + var s = 'function' == typeof i ? i(a.options) : i; + d(), + (a.options = Object.assign({}, o, a.options, s)), + (a.scrollParents = { + reference: $t(t) + ? Ae(t) + : t.contextElement + ? Ae(t.contextElement) + : [], + popper: Ae(e), + }); + var r, + c, + u = (function (t) { + var e = He(t); + return Bt.reduce(function (t, i) { + return t.concat( + e.filter(function (t) { + return t.phase === i; + }) + ); + }, []); + })( + ((r = [].concat(n, a.options.modifiers)), + (c = r.reduce(function (t, e) { + var i = t[e.name]; + return ( + (t[e.name] = i + ? Object.assign({}, i, e, { + options: Object.assign({}, i.options, e.options), + data: Object.assign({}, i.data, e.data), + }) + : e), + t + ); + }, {})), + Object.keys(c).map(function (t) { + return c[t]; + })) + ); + return ( + (a.orderedModifiers = u.filter(function (t) { + return t.enabled; + })), + a.orderedModifiers.forEach(function (t) { + var e = t.name, + i = t.options, + n = void 0 === i ? {} : i, + s = t.effect; + if ('function' == typeof s) { + var o = s({ state: a, name: e, instance: h, options: n }); + l.push(o || function () {}); + } + }), + h.update() + ); + }, + forceUpdate: function () { + if (!c) { + var t = a.elements, + e = t.reference, + i = t.popper; + if (Re(e, i)) { + (a.rects = { + reference: Me(e, te(i), 'fixed' === a.options.strategy), + popper: Kt(i), + }), + (a.reset = !1), + (a.placement = a.options.placement), + a.orderedModifiers.forEach(function (t) { + return (a.modifiersData[t.name] = Object.assign( + {}, + t.data + )); + }); + for (var n = 0; n < a.orderedModifiers.length; n++) + if (!0 !== a.reset) { + var s = a.orderedModifiers[n], + o = s.fn, + r = s.options, + l = void 0 === r ? {} : r, + d = s.name; + 'function' == typeof o && + (a = + o({ state: a, options: l, name: d, instance: h }) || a); + } else (a.reset = !1), (n = -1); + } + } + }, + update: + ((s = function () { + return new Promise(function (t) { + h.forceUpdate(), t(a); + }); + }), + function () { + return ( + r || + (r = new Promise(function (t) { + Promise.resolve().then(function () { + (r = void 0), t(s()); + }); + })), + r + ); + }), + destroy: function () { + d(), (c = !0); + }, + }; + if (!Re(t, e)) return h; + function d() { + l.forEach(function (t) { + return t(); + }), + (l = []); + } + return ( + h.setOptions(i).then(function (t) { + !c && i.onFirstUpdate && i.onFirstUpdate(t); + }), + h + ); + }; + } + var $e = We(), + ze = We({ defaultModifiers: [pe, Pe, ue, Ft] }), + qe = We({ defaultModifiers: [pe, Pe, ue, Ft, Ie, xe, je, le, Ne] }); + const Fe = Object.freeze({ + __proto__: null, + popperGenerator: We, + detectOverflow: ke, + createPopperBase: $e, + createPopper: qe, + createPopperLite: ze, + top: mt, + bottom: gt, + right: _t, + left: bt, + auto: vt, + basePlacements: yt, + start: wt, + end: Et, + clippingParents: At, + viewport: Tt, + popper: Ot, + reference: Ct, + variationPlacements: kt, + placements: Lt, + beforeRead: xt, + read: Dt, + afterRead: St, + beforeMain: Nt, + main: It, + afterMain: Pt, + beforeWrite: jt, + write: Mt, + afterWrite: Ht, + modifierPhases: Bt, + applyStyles: Ft, + arrow: le, + computeStyles: ue, + eventListeners: pe, + flip: xe, + hide: Ne, + offset: Ie, + popperOffsets: Pe, + preventOverflow: je, + }), + Ue = 'dropdown', + Ve = 'Escape', + Ke = 'Space', + Xe = 'ArrowUp', + Ye = 'ArrowDown', + Qe = new RegExp('ArrowUp|ArrowDown|Escape'), + Ge = 'click.bs.dropdown.data-api', + Ze = 'keydown.bs.dropdown.data-api', + Je = 'show', + ti = '[data-bs-toggle="dropdown"]', + ei = '.dropdown-menu', + ii = m() ? 'top-end' : 'top-start', + ni = m() ? 'top-start' : 'top-end', + si = m() ? 'bottom-end' : 'bottom-start', + oi = m() ? 'bottom-start' : 'bottom-end', + ri = m() ? 'left-start' : 'right-start', + ai = m() ? 'right-start' : 'left-start', + li = { + offset: [0, 2], + boundary: 'clippingParents', + reference: 'toggle', + display: 'dynamic', + popperConfig: null, + autoClose: !0, + }, + ci = { + offset: '(array|string|function)', + boundary: '(string|element)', + reference: '(string|element|object)', + display: 'string', + popperConfig: '(null|object|function)', + autoClose: '(boolean|string)', + }; + class hi extends B { + constructor(t, e) { + super(t), + (this._popper = null), + (this._config = this._getConfig(e)), + (this._menu = this._getMenuElement()), + (this._inNavbar = this._detectNavbar()); + } + static get Default() { + return li; + } + static get DefaultType() { + return ci; + } + static get NAME() { + return Ue; + } + toggle() { + return this._isShown() ? this.hide() : this.show(); + } + show() { + if (c(this._element) || this._isShown(this._menu)) return; + const t = { relatedTarget: this._element }; + if (j.trigger(this._element, 'show.bs.dropdown', t).defaultPrevented) + return; + const e = hi.getParentFromElement(this._element); + this._inNavbar + ? U.setDataAttribute(this._menu, 'popper', 'none') + : this._createPopper(e), + 'ontouchstart' in document.documentElement && + !e.closest('.navbar-nav') && + [] + .concat(...document.body.children) + .forEach((t) => j.on(t, 'mouseover', d)), + this._element.focus(), + this._element.setAttribute('aria-expanded', !0), + this._menu.classList.add(Je), + this._element.classList.add(Je), + j.trigger(this._element, 'shown.bs.dropdown', t); + } + hide() { + if (c(this._element) || !this._isShown(this._menu)) return; + const t = { relatedTarget: this._element }; + this._completeHide(t); + } + dispose() { + this._popper && this._popper.destroy(), super.dispose(); + } + update() { + (this._inNavbar = this._detectNavbar()), + this._popper && this._popper.update(); + } + _completeHide(t) { + j.trigger(this._element, 'hide.bs.dropdown', t).defaultPrevented || + ('ontouchstart' in document.documentElement && + [] + .concat(...document.body.children) + .forEach((t) => j.off(t, 'mouseover', d)), + this._popper && this._popper.destroy(), + this._menu.classList.remove(Je), + this._element.classList.remove(Je), + this._element.setAttribute('aria-expanded', 'false'), + U.removeDataAttribute(this._menu, 'popper'), + j.trigger(this._element, 'hidden.bs.dropdown', t)); + } + _getConfig(t) { + if ( + ((t = { + ...this.constructor.Default, + ...U.getDataAttributes(this._element), + ...t, + }), + a(Ue, t, this.constructor.DefaultType), + 'object' == typeof t.reference && + !o(t.reference) && + 'function' != typeof t.reference.getBoundingClientRect) + ) + throw new TypeError( + `${Ue.toUpperCase()}: Option "reference" provided type "object" without a required "getBoundingClientRect" method.` + ); + return t; + } + _createPopper(t) { + if (void 0 === Fe) + throw new TypeError( + "Bootstrap's dropdowns require Popper (https://popper.js.org)" + ); + let e = this._element; + 'parent' === this._config.reference + ? (e = t) + : o(this._config.reference) + ? (e = r(this._config.reference)) + : 'object' == typeof this._config.reference && + (e = this._config.reference); + const i = this._getPopperConfig(), + n = i.modifiers.find( + (t) => 'applyStyles' === t.name && !1 === t.enabled + ); + (this._popper = qe(e, this._menu, i)), + n && U.setDataAttribute(this._menu, 'popper', 'static'); + } + _isShown(t = this._element) { + return t.classList.contains(Je); + } + _getMenuElement() { + return V.next(this._element, ei)[0]; + } + _getPlacement() { + const t = this._element.parentNode; + if (t.classList.contains('dropend')) return ri; + if (t.classList.contains('dropstart')) return ai; + const e = + 'end' === + getComputedStyle(this._menu).getPropertyValue('--bs-position').trim(); + return t.classList.contains('dropup') ? (e ? ni : ii) : e ? oi : si; + } + _detectNavbar() { + return null !== this._element.closest('.navbar'); + } + _getOffset() { + const { offset: t } = this._config; + return 'string' == typeof t + ? t.split(',').map((t) => Number.parseInt(t, 10)) + : 'function' == typeof t + ? (e) => t(e, this._element) + : t; + } + _getPopperConfig() { + const t = { + placement: this._getPlacement(), + modifiers: [ + { + name: 'preventOverflow', + options: { boundary: this._config.boundary }, + }, + { name: 'offset', options: { offset: this._getOffset() } }, + ], + }; + return ( + 'static' === this._config.display && + (t.modifiers = [{ name: 'applyStyles', enabled: !1 }]), + { + ...t, + ...('function' == typeof this._config.popperConfig + ? this._config.popperConfig(t) + : this._config.popperConfig), + } + ); + } + _selectMenuItem({ key: t, target: e }) { + const i = V.find( + '.dropdown-menu .dropdown-item:not(.disabled):not(:disabled)', + this._menu + ).filter(l); + i.length && v(i, e, t === Ye, !i.includes(e)).focus(); + } + static jQueryInterface(t) { + return this.each(function () { + const e = hi.getOrCreateInstance(this, t); + if ('string' == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t](); + } + }); + } + static clearMenus(t) { + if (t && (2 === t.button || ('keyup' === t.type && 'Tab' !== t.key))) + return; + const e = V.find(ti); + for (let i = 0, n = e.length; i < n; i++) { + const n = hi.getInstance(e[i]); + if (!n || !1 === n._config.autoClose) continue; + if (!n._isShown()) continue; + const s = { relatedTarget: n._element }; + if (t) { + const e = t.composedPath(), + i = e.includes(n._menu); + if ( + e.includes(n._element) || + ('inside' === n._config.autoClose && !i) || + ('outside' === n._config.autoClose && i) + ) + continue; + if ( + n._menu.contains(t.target) && + (('keyup' === t.type && 'Tab' === t.key) || + /input|select|option|textarea|form/i.test(t.target.tagName)) + ) + continue; + 'click' === t.type && (s.clickEvent = t); + } + n._completeHide(s); + } + } + static getParentFromElement(t) { + return n(t) || t.parentNode; + } + static dataApiKeydownHandler(t) { + if ( + /input|textarea/i.test(t.target.tagName) + ? t.key === Ke || + (t.key !== Ve && + ((t.key !== Ye && t.key !== Xe) || t.target.closest(ei))) + : !Qe.test(t.key) + ) + return; + const e = this.classList.contains(Je); + if (!e && t.key === Ve) return; + if ((t.preventDefault(), t.stopPropagation(), c(this))) return; + const i = this.matches(ti) ? this : V.prev(this, ti)[0], + n = hi.getOrCreateInstance(i); + if (t.key !== Ve) + return t.key === Xe || t.key === Ye + ? (e || n.show(), void n._selectMenuItem(t)) + : void ((e && t.key !== Ke) || hi.clearMenus()); + n.hide(); + } + } + j.on(document, Ze, ti, hi.dataApiKeydownHandler), + j.on(document, Ze, ei, hi.dataApiKeydownHandler), + j.on(document, Ge, hi.clearMenus), + j.on(document, 'keyup.bs.dropdown.data-api', hi.clearMenus), + j.on(document, Ge, ti, function (t) { + t.preventDefault(), hi.getOrCreateInstance(this).toggle(); + }), + g(hi); + const di = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top', + ui = '.sticky-top'; + class fi { + constructor() { + this._element = document.body; + } + getWidth() { + const t = document.documentElement.clientWidth; + return Math.abs(window.innerWidth - t); + } + hide() { + const t = this.getWidth(); + this._disableOverFlow(), + this._setElementAttributes(this._element, 'paddingRight', (e) => e + t), + this._setElementAttributes(di, 'paddingRight', (e) => e + t), + this._setElementAttributes(ui, 'marginRight', (e) => e - t); + } + _disableOverFlow() { + this._saveInitialAttribute(this._element, 'overflow'), + (this._element.style.overflow = 'hidden'); + } + _setElementAttributes(t, e, i) { + const n = this.getWidth(); + this._applyManipulationCallback(t, (t) => { + if (t !== this._element && window.innerWidth > t.clientWidth + n) + return; + this._saveInitialAttribute(t, e); + const s = window.getComputedStyle(t)[e]; + t.style[e] = `${i(Number.parseFloat(s))}px`; + }); + } + reset() { + this._resetElementAttributes(this._element, 'overflow'), + this._resetElementAttributes(this._element, 'paddingRight'), + this._resetElementAttributes(di, 'paddingRight'), + this._resetElementAttributes(ui, 'marginRight'); + } + _saveInitialAttribute(t, e) { + const i = t.style[e]; + i && U.setDataAttribute(t, e, i); + } + _resetElementAttributes(t, e) { + this._applyManipulationCallback(t, (t) => { + const i = U.getDataAttribute(t, e); + void 0 === i + ? t.style.removeProperty(e) + : (U.removeDataAttribute(t, e), (t.style[e] = i)); + }); + } + _applyManipulationCallback(t, e) { + o(t) ? e(t) : V.find(t, this._element).forEach(e); + } + isOverflowing() { + return this.getWidth() > 0; + } + } + const pi = { + className: 'modal-backdrop', + isVisible: !0, + isAnimated: !1, + rootElement: 'body', + clickCallback: null, + }, + mi = { + className: 'string', + isVisible: 'boolean', + isAnimated: 'boolean', + rootElement: '(element|string)', + clickCallback: '(function|null)', + }, + gi = 'show', + _i = 'mousedown.bs.backdrop'; + class bi { + constructor(t) { + (this._config = this._getConfig(t)), + (this._isAppended = !1), + (this._element = null); + } + show(t) { + this._config.isVisible + ? (this._append(), + this._config.isAnimated && u(this._getElement()), + this._getElement().classList.add(gi), + this._emulateAnimation(() => { + _(t); + })) + : _(t); + } + hide(t) { + this._config.isVisible + ? (this._getElement().classList.remove(gi), + this._emulateAnimation(() => { + this.dispose(), _(t); + })) + : _(t); + } + _getElement() { + if (!this._element) { + const t = document.createElement('div'); + (t.className = this._config.className), + this._config.isAnimated && t.classList.add('fade'), + (this._element = t); + } + return this._element; + } + _getConfig(t) { + return ( + ((t = { ...pi, ...('object' == typeof t ? t : {}) }).rootElement = r( + t.rootElement + )), + a('backdrop', t, mi), + t + ); + } + _append() { + this._isAppended || + (this._config.rootElement.append(this._getElement()), + j.on(this._getElement(), _i, () => { + _(this._config.clickCallback); + }), + (this._isAppended = !0)); + } + dispose() { + this._isAppended && + (j.off(this._element, _i), + this._element.remove(), + (this._isAppended = !1)); + } + _emulateAnimation(t) { + b(t, this._getElement(), this._config.isAnimated); + } + } + const vi = { trapElement: null, autofocus: !0 }, + yi = { trapElement: 'element', autofocus: 'boolean' }, + wi = '.bs.focustrap', + Ei = 'backward'; + class Ai { + constructor(t) { + (this._config = this._getConfig(t)), + (this._isActive = !1), + (this._lastTabNavDirection = null); + } + activate() { + const { trapElement: t, autofocus: e } = this._config; + this._isActive || + (e && t.focus(), + j.off(document, wi), + j.on(document, 'focusin.bs.focustrap', (t) => this._handleFocusin(t)), + j.on(document, 'keydown.tab.bs.focustrap', (t) => + this._handleKeydown(t) + ), + (this._isActive = !0)); + } + deactivate() { + this._isActive && ((this._isActive = !1), j.off(document, wi)); + } + _handleFocusin(t) { + const { target: e } = t, + { trapElement: i } = this._config; + if (e === document || e === i || i.contains(e)) return; + const n = V.focusableChildren(i); + 0 === n.length + ? i.focus() + : this._lastTabNavDirection === Ei + ? n[n.length - 1].focus() + : n[0].focus(); + } + _handleKeydown(t) { + 'Tab' === t.key && + (this._lastTabNavDirection = t.shiftKey ? Ei : 'forward'); + } + _getConfig(t) { + return ( + (t = { ...vi, ...('object' == typeof t ? t : {}) }), + a('focustrap', t, yi), + t + ); + } + } + const Ti = 'modal', + Oi = 'Escape', + Ci = { backdrop: !0, keyboard: !0, focus: !0 }, + ki = { + backdrop: '(boolean|string)', + keyboard: 'boolean', + focus: 'boolean', + }, + Li = 'hidden.bs.modal', + xi = 'show.bs.modal', + Di = 'resize.bs.modal', + Si = 'click.dismiss.bs.modal', + Ni = 'keydown.dismiss.bs.modal', + Ii = 'mousedown.dismiss.bs.modal', + Pi = 'modal-open', + ji = 'show', + Mi = 'modal-static'; + class Hi extends B { + constructor(t, e) { + super(t), + (this._config = this._getConfig(e)), + (this._dialog = V.findOne('.modal-dialog', this._element)), + (this._backdrop = this._initializeBackDrop()), + (this._focustrap = this._initializeFocusTrap()), + (this._isShown = !1), + (this._ignoreBackdropClick = !1), + (this._isTransitioning = !1), + (this._scrollBar = new fi()); + } + static get Default() { + return Ci; + } + static get NAME() { + return Ti; + } + toggle(t) { + return this._isShown ? this.hide() : this.show(t); + } + show(t) { + this._isShown || + this._isTransitioning || + j.trigger(this._element, xi, { relatedTarget: t }).defaultPrevented || + ((this._isShown = !0), + this._isAnimated() && (this._isTransitioning = !0), + this._scrollBar.hide(), + document.body.classList.add(Pi), + this._adjustDialog(), + this._setEscapeEvent(), + this._setResizeEvent(), + j.on(this._dialog, Ii, () => { + j.one(this._element, 'mouseup.dismiss.bs.modal', (t) => { + t.target === this._element && (this._ignoreBackdropClick = !0); + }); + }), + this._showBackdrop(() => this._showElement(t))); + } + hide() { + if (!this._isShown || this._isTransitioning) return; + if (j.trigger(this._element, 'hide.bs.modal').defaultPrevented) return; + this._isShown = !1; + const t = this._isAnimated(); + t && (this._isTransitioning = !0), + this._setEscapeEvent(), + this._setResizeEvent(), + this._focustrap.deactivate(), + this._element.classList.remove(ji), + j.off(this._element, Si), + j.off(this._dialog, Ii), + this._queueCallback(() => this._hideModal(), this._element, t); + } + dispose() { + [window, this._dialog].forEach((t) => j.off(t, '.bs.modal')), + this._backdrop.dispose(), + this._focustrap.deactivate(), + super.dispose(); + } + handleUpdate() { + this._adjustDialog(); + } + _initializeBackDrop() { + return new bi({ + isVisible: Boolean(this._config.backdrop), + isAnimated: this._isAnimated(), + }); + } + _initializeFocusTrap() { + return new Ai({ trapElement: this._element }); + } + _getConfig(t) { + return ( + (t = { + ...Ci, + ...U.getDataAttributes(this._element), + ...('object' == typeof t ? t : {}), + }), + a(Ti, t, ki), + t + ); + } + _showElement(t) { + const e = this._isAnimated(), + i = V.findOne('.modal-body', this._dialog); + (this._element.parentNode && + this._element.parentNode.nodeType === Node.ELEMENT_NODE) || + document.body.append(this._element), + (this._element.style.display = 'block'), + this._element.removeAttribute('aria-hidden'), + this._element.setAttribute('aria-modal', !0), + this._element.setAttribute('role', 'dialog'), + (this._element.scrollTop = 0), + i && (i.scrollTop = 0), + e && u(this._element), + this._element.classList.add(ji), + this._queueCallback( + () => { + this._config.focus && this._focustrap.activate(), + (this._isTransitioning = !1), + j.trigger(this._element, 'shown.bs.modal', { relatedTarget: t }); + }, + this._dialog, + e + ); + } + _setEscapeEvent() { + this._isShown + ? j.on(this._element, Ni, (t) => { + this._config.keyboard && t.key === Oi + ? (t.preventDefault(), this.hide()) + : this._config.keyboard || + t.key !== Oi || + this._triggerBackdropTransition(); + }) + : j.off(this._element, Ni); + } + _setResizeEvent() { + this._isShown + ? j.on(window, Di, () => this._adjustDialog()) + : j.off(window, Di); + } + _hideModal() { + (this._element.style.display = 'none'), + this._element.setAttribute('aria-hidden', !0), + this._element.removeAttribute('aria-modal'), + this._element.removeAttribute('role'), + (this._isTransitioning = !1), + this._backdrop.hide(() => { + document.body.classList.remove(Pi), + this._resetAdjustments(), + this._scrollBar.reset(), + j.trigger(this._element, Li); + }); + } + _showBackdrop(t) { + j.on(this._element, Si, (t) => { + this._ignoreBackdropClick + ? (this._ignoreBackdropClick = !1) + : t.target === t.currentTarget && + (!0 === this._config.backdrop + ? this.hide() + : 'static' === this._config.backdrop && + this._triggerBackdropTransition()); + }), + this._backdrop.show(t); + } + _isAnimated() { + return this._element.classList.contains('fade'); + } + _triggerBackdropTransition() { + if (j.trigger(this._element, 'hidePrevented.bs.modal').defaultPrevented) + return; + const { classList: t, scrollHeight: e, style: i } = this._element, + n = e > document.documentElement.clientHeight; + (!n && 'hidden' === i.overflowY) || + t.contains(Mi) || + (n || (i.overflowY = 'hidden'), + t.add(Mi), + this._queueCallback(() => { + t.remove(Mi), + n || + this._queueCallback(() => { + i.overflowY = ''; + }, this._dialog); + }, this._dialog), + this._element.focus()); + } + _adjustDialog() { + const t = + this._element.scrollHeight > document.documentElement.clientHeight, + e = this._scrollBar.getWidth(), + i = e > 0; + ((!i && t && !m()) || (i && !t && m())) && + (this._element.style.paddingLeft = `${e}px`), + ((i && !t && !m()) || (!i && t && m())) && + (this._element.style.paddingRight = `${e}px`); + } + _resetAdjustments() { + (this._element.style.paddingLeft = ''), + (this._element.style.paddingRight = ''); + } + static jQueryInterface(t, e) { + return this.each(function () { + const i = Hi.getOrCreateInstance(this, t); + if ('string' == typeof t) { + if (void 0 === i[t]) throw new TypeError(`No method named "${t}"`); + i[t](e); + } + }); + } + } + j.on( + document, + 'click.bs.modal.data-api', + '[data-bs-toggle="modal"]', + function (t) { + const e = n(this); + ['A', 'AREA'].includes(this.tagName) && t.preventDefault(), + j.one(e, xi, (t) => { + t.defaultPrevented || + j.one(e, Li, () => { + l(this) && this.focus(); + }); + }); + const i = V.findOne('.modal.show'); + i && Hi.getInstance(i).hide(), Hi.getOrCreateInstance(e).toggle(this); + } + ), + R(Hi), + g(Hi); + const Bi = 'offcanvas', + Ri = { backdrop: !0, keyboard: !0, scroll: !1 }, + Wi = { backdrop: 'boolean', keyboard: 'boolean', scroll: 'boolean' }, + $i = 'show', + zi = '.offcanvas.show', + qi = 'hidden.bs.offcanvas'; + class Fi extends B { + constructor(t, e) { + super(t), + (this._config = this._getConfig(e)), + (this._isShown = !1), + (this._backdrop = this._initializeBackDrop()), + (this._focustrap = this._initializeFocusTrap()), + this._addEventListeners(); + } + static get NAME() { + return Bi; + } + static get Default() { + return Ri; + } + toggle(t) { + return this._isShown ? this.hide() : this.show(t); + } + show(t) { + this._isShown || + j.trigger(this._element, 'show.bs.offcanvas', { relatedTarget: t }) + .defaultPrevented || + ((this._isShown = !0), + (this._element.style.visibility = 'visible'), + this._backdrop.show(), + this._config.scroll || new fi().hide(), + this._element.removeAttribute('aria-hidden'), + this._element.setAttribute('aria-modal', !0), + this._element.setAttribute('role', 'dialog'), + this._element.classList.add($i), + this._queueCallback( + () => { + this._config.scroll || this._focustrap.activate(), + j.trigger(this._element, 'shown.bs.offcanvas', { + relatedTarget: t, + }); + }, + this._element, + !0 + )); + } + hide() { + this._isShown && + (j.trigger(this._element, 'hide.bs.offcanvas').defaultPrevented || + (this._focustrap.deactivate(), + this._element.blur(), + (this._isShown = !1), + this._element.classList.remove($i), + this._backdrop.hide(), + this._queueCallback( + () => { + this._element.setAttribute('aria-hidden', !0), + this._element.removeAttribute('aria-modal'), + this._element.removeAttribute('role'), + (this._element.style.visibility = 'hidden'), + this._config.scroll || new fi().reset(), + j.trigger(this._element, qi); + }, + this._element, + !0 + ))); + } + dispose() { + this._backdrop.dispose(), this._focustrap.deactivate(), super.dispose(); + } + _getConfig(t) { + return ( + (t = { + ...Ri, + ...U.getDataAttributes(this._element), + ...('object' == typeof t ? t : {}), + }), + a(Bi, t, Wi), + t + ); + } + _initializeBackDrop() { + return new bi({ + className: 'offcanvas-backdrop', + isVisible: this._config.backdrop, + isAnimated: !0, + rootElement: this._element.parentNode, + clickCallback: () => this.hide(), + }); + } + _initializeFocusTrap() { + return new Ai({ trapElement: this._element }); + } + _addEventListeners() { + j.on(this._element, 'keydown.dismiss.bs.offcanvas', (t) => { + this._config.keyboard && 'Escape' === t.key && this.hide(); + }); + } + static jQueryInterface(t) { + return this.each(function () { + const e = Fi.getOrCreateInstance(this, t); + if ('string' == typeof t) { + if (void 0 === e[t] || t.startsWith('_') || 'constructor' === t) + throw new TypeError(`No method named "${t}"`); + e[t](this); + } + }); + } + } + j.on( + document, + 'click.bs.offcanvas.data-api', + '[data-bs-toggle="offcanvas"]', + function (t) { + const e = n(this); + if ((['A', 'AREA'].includes(this.tagName) && t.preventDefault(), c(this))) + return; + j.one(e, qi, () => { + l(this) && this.focus(); + }); + const i = V.findOne(zi); + i && i !== e && Fi.getInstance(i).hide(), + Fi.getOrCreateInstance(e).toggle(this); + } + ), + j.on(window, 'load.bs.offcanvas.data-api', () => + V.find(zi).forEach((t) => Fi.getOrCreateInstance(t).show()) + ), + R(Fi), + g(Fi); + const Ui = new Set([ + 'background', + 'cite', + 'href', + 'itemtype', + 'longdesc', + 'poster', + 'src', + 'xlink:href', + ]), + Vi = /^(?:(?:https?|mailto|ftp|tel|file|sms):|[^#&/:?]*(?:[#/?]|$))/i, + Ki = + /^data:(?:image\/(?:bmp|gif|jpeg|jpg|png|tiff|webp)|video\/(?:mpeg|mp4|ogg|webm)|audio\/(?:mp3|oga|ogg|opus));base64,[\d+/a-z]+=*$/i, + Xi = (t, e) => { + const i = t.nodeName.toLowerCase(); + if (e.includes(i)) + return ( + !Ui.has(i) || Boolean(Vi.test(t.nodeValue) || Ki.test(t.nodeValue)) + ); + const n = e.filter((t) => t instanceof RegExp); + for (let t = 0, e = n.length; t < e; t++) if (n[t].test(i)) return !0; + return !1; + }; + function Yi(t, e, i) { + if (!t.length) return t; + if (i && 'function' == typeof i) return i(t); + const n = new window.DOMParser().parseFromString(t, 'text/html'), + s = [].concat(...n.body.querySelectorAll('*')); + for (let t = 0, i = s.length; t < i; t++) { + const i = s[t], + n = i.nodeName.toLowerCase(); + if (!Object.keys(e).includes(n)) { + i.remove(); + continue; + } + const o = [].concat(...i.attributes), + r = [].concat(e['*'] || [], e[n] || []); + o.forEach((t) => { + Xi(t, r) || i.removeAttribute(t.nodeName); + }); + } + return n.body.innerHTML; + } + const Qi = 'tooltip', + Gi = new Set(['sanitize', 'allowList', 'sanitizeFn']), + Zi = { + animation: 'boolean', + template: 'string', + title: '(string|element|function)', + trigger: 'string', + delay: '(number|object)', + html: 'boolean', + selector: '(string|boolean)', + placement: '(string|function)', + offset: '(array|string|function)', + container: '(string|element|boolean)', + fallbackPlacements: 'array', + boundary: '(string|element)', + customClass: '(string|function)', + sanitize: 'boolean', + sanitizeFn: '(null|function)', + allowList: 'object', + popperConfig: '(null|object|function)', + }, + Ji = { + AUTO: 'auto', + TOP: 'top', + RIGHT: m() ? 'left' : 'right', + BOTTOM: 'bottom', + LEFT: m() ? 'right' : 'left', + }, + tn = { + animation: !0, + template: + '', + trigger: 'hover focus', + title: '', + delay: 0, + html: !1, + selector: !1, + placement: 'top', + offset: [0, 0], + container: !1, + fallbackPlacements: ['top', 'right', 'bottom', 'left'], + boundary: 'clippingParents', + customClass: '', + sanitize: !0, + sanitizeFn: null, + allowList: { + '*': ['class', 'dir', 'id', 'lang', 'role', /^aria-[\w-]*$/i], + a: ['target', 'href', 'title', 'rel'], + area: [], + b: [], + br: [], + col: [], + code: [], + div: [], + em: [], + hr: [], + h1: [], + h2: [], + h3: [], + h4: [], + h5: [], + h6: [], + i: [], + img: ['src', 'srcset', 'alt', 'title', 'width', 'height'], + li: [], + ol: [], + p: [], + pre: [], + s: [], + small: [], + span: [], + sub: [], + sup: [], + strong: [], + u: [], + ul: [], + }, + popperConfig: null, + }, + en = { + HIDE: 'hide.bs.tooltip', + HIDDEN: 'hidden.bs.tooltip', + SHOW: 'show.bs.tooltip', + SHOWN: 'shown.bs.tooltip', + INSERTED: 'inserted.bs.tooltip', + CLICK: 'click.bs.tooltip', + FOCUSIN: 'focusin.bs.tooltip', + FOCUSOUT: 'focusout.bs.tooltip', + MOUSEENTER: 'mouseenter.bs.tooltip', + MOUSELEAVE: 'mouseleave.bs.tooltip', + }, + nn = 'fade', + sn = 'show', + on = 'show', + rn = 'out', + an = '.tooltip-inner', + ln = '.modal', + cn = 'hide.bs.modal', + hn = 'hover', + dn = 'focus'; + class un extends B { + constructor(t, e) { + if (void 0 === Fe) + throw new TypeError( + "Bootstrap's tooltips require Popper (https://popper.js.org)" + ); + super(t), + (this._isEnabled = !0), + (this._timeout = 0), + (this._hoverState = ''), + (this._activeTrigger = {}), + (this._popper = null), + (this._config = this._getConfig(e)), + (this.tip = null), + this._setListeners(); + } + static get Default() { + return tn; + } + static get NAME() { + return Qi; + } + static get Event() { + return en; + } + static get DefaultType() { + return Zi; + } + enable() { + this._isEnabled = !0; + } + disable() { + this._isEnabled = !1; + } + toggleEnabled() { + this._isEnabled = !this._isEnabled; + } + toggle(t) { + if (this._isEnabled) + if (t) { + const e = this._initializeOnDelegatedTarget(t); + (e._activeTrigger.click = !e._activeTrigger.click), + e._isWithActiveTrigger() ? e._enter(null, e) : e._leave(null, e); + } else { + if (this.getTipElement().classList.contains(sn)) + return void this._leave(null, this); + this._enter(null, this); + } + } + dispose() { + clearTimeout(this._timeout), + j.off(this._element.closest(ln), cn, this._hideModalHandler), + this.tip && this.tip.remove(), + this._disposePopper(), + super.dispose(); + } + show() { + if ('none' === this._element.style.display) + throw new Error('Please use show on visible elements'); + if (!this.isWithContent() || !this._isEnabled) return; + const t = j.trigger(this._element, this.constructor.Event.SHOW), + e = h(this._element), + i = + null === e + ? this._element.ownerDocument.documentElement.contains( + this._element + ) + : e.contains(this._element); + if (t.defaultPrevented || !i) return; + 'tooltip' === this.constructor.NAME && + this.tip && + this.getTitle() !== this.tip.querySelector(an).innerHTML && + (this._disposePopper(), this.tip.remove(), (this.tip = null)); + const n = this.getTipElement(), + s = ((t) => { + do { + t += Math.floor(1e6 * Math.random()); + } while (document.getElementById(t)); + return t; + })(this.constructor.NAME); + n.setAttribute('id', s), + this._element.setAttribute('aria-describedby', s), + this._config.animation && n.classList.add(nn); + const o = + 'function' == typeof this._config.placement + ? this._config.placement.call(this, n, this._element) + : this._config.placement, + r = this._getAttachment(o); + this._addAttachmentClass(r); + const { container: a } = this._config; + H.set(n, this.constructor.DATA_KEY, this), + this._element.ownerDocument.documentElement.contains(this.tip) || + (a.append(n), + j.trigger(this._element, this.constructor.Event.INSERTED)), + this._popper + ? this._popper.update() + : (this._popper = qe(this._element, n, this._getPopperConfig(r))), + n.classList.add(sn); + const l = this._resolvePossibleFunction(this._config.customClass); + l && n.classList.add(...l.split(' ')), + 'ontouchstart' in document.documentElement && + [].concat(...document.body.children).forEach((t) => { + j.on(t, 'mouseover', d); + }); + const c = this.tip.classList.contains(nn); + this._queueCallback( + () => { + const t = this._hoverState; + (this._hoverState = null), + j.trigger(this._element, this.constructor.Event.SHOWN), + t === rn && this._leave(null, this); + }, + this.tip, + c + ); + } + hide() { + if (!this._popper) return; + const t = this.getTipElement(); + if ( + j.trigger(this._element, this.constructor.Event.HIDE).defaultPrevented + ) + return; + t.classList.remove(sn), + 'ontouchstart' in document.documentElement && + [] + .concat(...document.body.children) + .forEach((t) => j.off(t, 'mouseover', d)), + (this._activeTrigger.click = !1), + (this._activeTrigger.focus = !1), + (this._activeTrigger.hover = !1); + const e = this.tip.classList.contains(nn); + this._queueCallback( + () => { + this._isWithActiveTrigger() || + (this._hoverState !== on && t.remove(), + this._cleanTipClass(), + this._element.removeAttribute('aria-describedby'), + j.trigger(this._element, this.constructor.Event.HIDDEN), + this._disposePopper()); + }, + this.tip, + e + ), + (this._hoverState = ''); + } + update() { + null !== this._popper && this._popper.update(); + } + isWithContent() { + return Boolean(this.getTitle()); + } + getTipElement() { + if (this.tip) return this.tip; + const t = document.createElement('div'); + t.innerHTML = this._config.template; + const e = t.children[0]; + return ( + this.setContent(e), e.classList.remove(nn, sn), (this.tip = e), this.tip + ); + } + setContent(t) { + this._sanitizeAndSetContent(t, this.getTitle(), an); + } + _sanitizeAndSetContent(t, e, i) { + const n = V.findOne(i, t); + e || !n ? this.setElementContent(n, e) : n.remove(); + } + setElementContent(t, e) { + if (null !== t) + return o(e) + ? ((e = r(e)), + void (this._config.html + ? e.parentNode !== t && ((t.innerHTML = ''), t.append(e)) + : (t.textContent = e.textContent))) + : void (this._config.html + ? (this._config.sanitize && + (e = Yi(e, this._config.allowList, this._config.sanitizeFn)), + (t.innerHTML = e)) + : (t.textContent = e)); + } + getTitle() { + const t = + this._element.getAttribute('data-bs-original-title') || + this._config.title; + return this._resolvePossibleFunction(t); + } + updateAttachment(t) { + return 'right' === t ? 'end' : 'left' === t ? 'start' : t; + } + _initializeOnDelegatedTarget(t, e) { + return ( + e || + this.constructor.getOrCreateInstance( + t.delegateTarget, + this._getDelegateConfig() + ) + ); + } + _getOffset() { + const { offset: t } = this._config; + return 'string' == typeof t + ? t.split(',').map((t) => Number.parseInt(t, 10)) + : 'function' == typeof t + ? (e) => t(e, this._element) + : t; + } + _resolvePossibleFunction(t) { + return 'function' == typeof t ? t.call(this._element) : t; + } + _getPopperConfig(t) { + const e = { + placement: t, + modifiers: [ + { + name: 'flip', + options: { fallbackPlacements: this._config.fallbackPlacements }, + }, + { name: 'offset', options: { offset: this._getOffset() } }, + { + name: 'preventOverflow', + options: { boundary: this._config.boundary }, + }, + { + name: 'arrow', + options: { element: `.${this.constructor.NAME}-arrow` }, + }, + { + name: 'onChange', + enabled: !0, + phase: 'afterWrite', + fn: (t) => this._handlePopperPlacementChange(t), + }, + ], + onFirstUpdate: (t) => { + t.options.placement !== t.placement && + this._handlePopperPlacementChange(t); + }, + }; + return { + ...e, + ...('function' == typeof this._config.popperConfig + ? this._config.popperConfig(e) + : this._config.popperConfig), + }; + } + _addAttachmentClass(t) { + this.getTipElement().classList.add( + `${this._getBasicClassPrefix()}-${this.updateAttachment(t)}` + ); + } + _getAttachment(t) { + return Ji[t.toUpperCase()]; + } + _setListeners() { + this._config.trigger.split(' ').forEach((t) => { + if ('click' === t) + j.on( + this._element, + this.constructor.Event.CLICK, + this._config.selector, + (t) => this.toggle(t) + ); + else if ('manual' !== t) { + const e = + t === hn + ? this.constructor.Event.MOUSEENTER + : this.constructor.Event.FOCUSIN, + i = + t === hn + ? this.constructor.Event.MOUSELEAVE + : this.constructor.Event.FOCUSOUT; + j.on(this._element, e, this._config.selector, (t) => this._enter(t)), + j.on(this._element, i, this._config.selector, (t) => + this._leave(t) + ); + } + }), + (this._hideModalHandler = () => { + this._element && this.hide(); + }), + j.on(this._element.closest(ln), cn, this._hideModalHandler), + this._config.selector + ? (this._config = { + ...this._config, + trigger: 'manual', + selector: '', + }) + : this._fixTitle(); + } + _fixTitle() { + const t = this._element.getAttribute('title'), + e = typeof this._element.getAttribute('data-bs-original-title'); + (t || 'string' !== e) && + (this._element.setAttribute('data-bs-original-title', t || ''), + !t || + this._element.getAttribute('aria-label') || + this._element.textContent || + this._element.setAttribute('aria-label', t), + this._element.setAttribute('title', '')); + } + _enter(t, e) { + (e = this._initializeOnDelegatedTarget(t, e)), + t && (e._activeTrigger['focusin' === t.type ? dn : hn] = !0), + e.getTipElement().classList.contains(sn) || e._hoverState === on + ? (e._hoverState = on) + : (clearTimeout(e._timeout), + (e._hoverState = on), + e._config.delay && e._config.delay.show + ? (e._timeout = setTimeout(() => { + e._hoverState === on && e.show(); + }, e._config.delay.show)) + : e.show()); + } + _leave(t, e) { + (e = this._initializeOnDelegatedTarget(t, e)), + t && + (e._activeTrigger['focusout' === t.type ? dn : hn] = + e._element.contains(t.relatedTarget)), + e._isWithActiveTrigger() || + (clearTimeout(e._timeout), + (e._hoverState = rn), + e._config.delay && e._config.delay.hide + ? (e._timeout = setTimeout(() => { + e._hoverState === rn && e.hide(); + }, e._config.delay.hide)) + : e.hide()); + } + _isWithActiveTrigger() { + for (const t in this._activeTrigger) + if (this._activeTrigger[t]) return !0; + return !1; + } + _getConfig(t) { + const e = U.getDataAttributes(this._element); + return ( + Object.keys(e).forEach((t) => { + Gi.has(t) && delete e[t]; + }), + ((t = { + ...this.constructor.Default, + ...e, + ...('object' == typeof t && t ? t : {}), + }).container = !1 === t.container ? document.body : r(t.container)), + 'number' == typeof t.delay && + (t.delay = { show: t.delay, hide: t.delay }), + 'number' == typeof t.title && (t.title = t.title.toString()), + 'number' == typeof t.content && (t.content = t.content.toString()), + a(Qi, t, this.constructor.DefaultType), + t.sanitize && (t.template = Yi(t.template, t.allowList, t.sanitizeFn)), + t + ); + } + _getDelegateConfig() { + const t = {}; + for (const e in this._config) + this.constructor.Default[e] !== this._config[e] && + (t[e] = this._config[e]); + return t; + } + _cleanTipClass() { + const t = this.getTipElement(), + e = new RegExp(`(^|\\s)${this._getBasicClassPrefix()}\\S+`, 'g'), + i = t.getAttribute('class').match(e); + null !== i && + i.length > 0 && + i.map((t) => t.trim()).forEach((e) => t.classList.remove(e)); + } + _getBasicClassPrefix() { + return 'bs-tooltip'; + } + _handlePopperPlacementChange(t) { + const { state: e } = t; + e && + ((this.tip = e.elements.popper), + this._cleanTipClass(), + this._addAttachmentClass(this._getAttachment(e.placement))); + } + _disposePopper() { + this._popper && (this._popper.destroy(), (this._popper = null)); + } + static jQueryInterface(t) { + return this.each(function () { + const e = un.getOrCreateInstance(this, t); + if ('string' == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t](); + } + }); + } + } + g(un); + const fn = { + ...un.Default, + placement: 'right', + offset: [0, 8], + trigger: 'click', + content: '', + template: + '', + }, + pn = { ...un.DefaultType, content: '(string|element|function)' }, + mn = { + HIDE: 'hide.bs.popover', + HIDDEN: 'hidden.bs.popover', + SHOW: 'show.bs.popover', + SHOWN: 'shown.bs.popover', + INSERTED: 'inserted.bs.popover', + CLICK: 'click.bs.popover', + FOCUSIN: 'focusin.bs.popover', + FOCUSOUT: 'focusout.bs.popover', + MOUSEENTER: 'mouseenter.bs.popover', + MOUSELEAVE: 'mouseleave.bs.popover', + }; + class gn extends un { + static get Default() { + return fn; + } + static get NAME() { + return 'popover'; + } + static get Event() { + return mn; + } + static get DefaultType() { + return pn; + } + isWithContent() { + return this.getTitle() || this._getContent(); + } + setContent(t) { + this._sanitizeAndSetContent(t, this.getTitle(), '.popover-header'), + this._sanitizeAndSetContent(t, this._getContent(), '.popover-body'); + } + _getContent() { + return this._resolvePossibleFunction(this._config.content); + } + _getBasicClassPrefix() { + return 'bs-popover'; + } + static jQueryInterface(t) { + return this.each(function () { + const e = gn.getOrCreateInstance(this, t); + if ('string' == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t](); + } + }); + } + } + g(gn); + const _n = 'scrollspy', + bn = { offset: 10, method: 'auto', target: '' }, + vn = { offset: 'number', method: 'string', target: '(string|element)' }, + yn = 'active', + wn = '.nav-link, .list-group-item, .dropdown-item', + En = 'position'; + class An extends B { + constructor(t, e) { + super(t), + (this._scrollElement = + 'BODY' === this._element.tagName ? window : this._element), + (this._config = this._getConfig(e)), + (this._offsets = []), + (this._targets = []), + (this._activeTarget = null), + (this._scrollHeight = 0), + j.on(this._scrollElement, 'scroll.bs.scrollspy', () => this._process()), + this.refresh(), + this._process(); + } + static get Default() { + return bn; + } + static get NAME() { + return _n; + } + refresh() { + const t = + this._scrollElement === this._scrollElement.window ? 'offset' : En, + e = 'auto' === this._config.method ? t : this._config.method, + n = e === En ? this._getScrollTop() : 0; + (this._offsets = []), + (this._targets = []), + (this._scrollHeight = this._getScrollHeight()), + V.find(wn, this._config.target) + .map((t) => { + const s = i(t), + o = s ? V.findOne(s) : null; + if (o) { + const t = o.getBoundingClientRect(); + if (t.width || t.height) return [U[e](o).top + n, s]; + } + return null; + }) + .filter((t) => t) + .sort((t, e) => t[0] - e[0]) + .forEach((t) => { + this._offsets.push(t[0]), this._targets.push(t[1]); + }); + } + dispose() { + j.off(this._scrollElement, '.bs.scrollspy'), super.dispose(); + } + _getConfig(t) { + return ( + ((t = { + ...bn, + ...U.getDataAttributes(this._element), + ...('object' == typeof t && t ? t : {}), + }).target = r(t.target) || document.documentElement), + a(_n, t, vn), + t + ); + } + _getScrollTop() { + return this._scrollElement === window + ? this._scrollElement.pageYOffset + : this._scrollElement.scrollTop; + } + _getScrollHeight() { + return ( + this._scrollElement.scrollHeight || + Math.max( + document.body.scrollHeight, + document.documentElement.scrollHeight + ) + ); + } + _getOffsetHeight() { + return this._scrollElement === window + ? window.innerHeight + : this._scrollElement.getBoundingClientRect().height; + } + _process() { + const t = this._getScrollTop() + this._config.offset, + e = this._getScrollHeight(), + i = this._config.offset + e - this._getOffsetHeight(); + if ((this._scrollHeight !== e && this.refresh(), t >= i)) { + const t = this._targets[this._targets.length - 1]; + this._activeTarget !== t && this._activate(t); + } else { + if (this._activeTarget && t < this._offsets[0] && this._offsets[0] > 0) + return (this._activeTarget = null), void this._clear(); + for (let e = this._offsets.length; e--; ) + this._activeTarget !== this._targets[e] && + t >= this._offsets[e] && + (void 0 === this._offsets[e + 1] || t < this._offsets[e + 1]) && + this._activate(this._targets[e]); + } + } + _activate(t) { + (this._activeTarget = t), this._clear(); + const e = wn + .split(',') + .map((e) => `${e}[data-bs-target="${t}"],${e}[href="${t}"]`), + i = V.findOne(e.join(','), this._config.target); + i.classList.add(yn), + i.classList.contains('dropdown-item') + ? V.findOne('.dropdown-toggle', i.closest('.dropdown')).classList.add( + yn + ) + : V.parents(i, '.nav, .list-group').forEach((t) => { + V.prev(t, '.nav-link, .list-group-item').forEach((t) => + t.classList.add(yn) + ), + V.prev(t, '.nav-item').forEach((t) => { + V.children(t, '.nav-link').forEach((t) => + t.classList.add(yn) + ); + }); + }), + j.trigger(this._scrollElement, 'activate.bs.scrollspy', { + relatedTarget: t, + }); + } + _clear() { + V.find(wn, this._config.target) + .filter((t) => t.classList.contains(yn)) + .forEach((t) => t.classList.remove(yn)); + } + static jQueryInterface(t) { + return this.each(function () { + const e = An.getOrCreateInstance(this, t); + if ('string' == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t](); + } + }); + } + } + j.on(window, 'load.bs.scrollspy.data-api', () => { + V.find('[data-bs-spy="scroll"]').forEach((t) => new An(t)); + }), + g(An); + const Tn = 'active', + On = 'fade', + Cn = 'show', + kn = '.active', + Ln = ':scope > li > .active'; + class xn extends B { + static get NAME() { + return 'tab'; + } + show() { + if ( + this._element.parentNode && + this._element.parentNode.nodeType === Node.ELEMENT_NODE && + this._element.classList.contains(Tn) + ) + return; + let t; + const e = n(this._element), + i = this._element.closest('.nav, .list-group'); + if (i) { + const e = 'UL' === i.nodeName || 'OL' === i.nodeName ? Ln : kn; + (t = V.find(e, i)), (t = t[t.length - 1]); + } + const s = t + ? j.trigger(t, 'hide.bs.tab', { relatedTarget: this._element }) + : null; + if ( + j.trigger(this._element, 'show.bs.tab', { relatedTarget: t }) + .defaultPrevented || + (null !== s && s.defaultPrevented) + ) + return; + this._activate(this._element, i); + const o = () => { + j.trigger(t, 'hidden.bs.tab', { relatedTarget: this._element }), + j.trigger(this._element, 'shown.bs.tab', { relatedTarget: t }); + }; + e ? this._activate(e, e.parentNode, o) : o(); + } + _activate(t, e, i) { + const n = ( + !e || ('UL' !== e.nodeName && 'OL' !== e.nodeName) + ? V.children(e, kn) + : V.find(Ln, e) + )[0], + s = i && n && n.classList.contains(On), + o = () => this._transitionComplete(t, n, i); + n && s ? (n.classList.remove(Cn), this._queueCallback(o, t, !0)) : o(); + } + _transitionComplete(t, e, i) { + if (e) { + e.classList.remove(Tn); + const t = V.findOne(':scope > .dropdown-menu .active', e.parentNode); + t && t.classList.remove(Tn), + 'tab' === e.getAttribute('role') && + e.setAttribute('aria-selected', !1); + } + t.classList.add(Tn), + 'tab' === t.getAttribute('role') && t.setAttribute('aria-selected', !0), + u(t), + t.classList.contains(On) && t.classList.add(Cn); + let n = t.parentNode; + if ( + (n && 'LI' === n.nodeName && (n = n.parentNode), + n && n.classList.contains('dropdown-menu')) + ) { + const e = t.closest('.dropdown'); + e && V.find('.dropdown-toggle', e).forEach((t) => t.classList.add(Tn)), + t.setAttribute('aria-expanded', !0); + } + i && i(); + } + static jQueryInterface(t) { + return this.each(function () { + const e = xn.getOrCreateInstance(this); + if ('string' == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t](); + } + }); + } + } + j.on( + document, + 'click.bs.tab.data-api', + '[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]', + function (t) { + ['A', 'AREA'].includes(this.tagName) && t.preventDefault(), + c(this) || xn.getOrCreateInstance(this).show(); + } + ), + g(xn); + const Dn = 'toast', + Sn = 'hide', + Nn = 'show', + In = 'showing', + Pn = { animation: 'boolean', autohide: 'boolean', delay: 'number' }, + jn = { animation: !0, autohide: !0, delay: 5e3 }; + class Mn extends B { + constructor(t, e) { + super(t), + (this._config = this._getConfig(e)), + (this._timeout = null), + (this._hasMouseInteraction = !1), + (this._hasKeyboardInteraction = !1), + this._setListeners(); + } + static get DefaultType() { + return Pn; + } + static get Default() { + return jn; + } + static get NAME() { + return Dn; + } + show() { + j.trigger(this._element, 'show.bs.toast').defaultPrevented || + (this._clearTimeout(), + this._config.animation && this._element.classList.add('fade'), + this._element.classList.remove(Sn), + u(this._element), + this._element.classList.add(Nn), + this._element.classList.add(In), + this._queueCallback( + () => { + this._element.classList.remove(In), + j.trigger(this._element, 'shown.bs.toast'), + this._maybeScheduleHide(); + }, + this._element, + this._config.animation + )); + } + hide() { + this._element.classList.contains(Nn) && + (j.trigger(this._element, 'hide.bs.toast').defaultPrevented || + (this._element.classList.add(In), + this._queueCallback( + () => { + this._element.classList.add(Sn), + this._element.classList.remove(In), + this._element.classList.remove(Nn), + j.trigger(this._element, 'hidden.bs.toast'); + }, + this._element, + this._config.animation + ))); + } + dispose() { + this._clearTimeout(), + this._element.classList.contains(Nn) && + this._element.classList.remove(Nn), + super.dispose(); + } + _getConfig(t) { + return ( + (t = { + ...jn, + ...U.getDataAttributes(this._element), + ...('object' == typeof t && t ? t : {}), + }), + a(Dn, t, this.constructor.DefaultType), + t + ); + } + _maybeScheduleHide() { + this._config.autohide && + (this._hasMouseInteraction || + this._hasKeyboardInteraction || + (this._timeout = setTimeout(() => { + this.hide(); + }, this._config.delay))); + } + _onInteraction(t, e) { + switch (t.type) { + case 'mouseover': + case 'mouseout': + this._hasMouseInteraction = e; + break; + case 'focusin': + case 'focusout': + this._hasKeyboardInteraction = e; + } + if (e) return void this._clearTimeout(); + const i = t.relatedTarget; + this._element === i || + this._element.contains(i) || + this._maybeScheduleHide(); + } + _setListeners() { + j.on(this._element, 'mouseover.bs.toast', (t) => + this._onInteraction(t, !0) + ), + j.on(this._element, 'mouseout.bs.toast', (t) => + this._onInteraction(t, !1) + ), + j.on(this._element, 'focusin.bs.toast', (t) => + this._onInteraction(t, !0) + ), + j.on(this._element, 'focusout.bs.toast', (t) => + this._onInteraction(t, !1) + ); + } + _clearTimeout() { + clearTimeout(this._timeout), (this._timeout = null); + } + static jQueryInterface(t) { + return this.each(function () { + const e = Mn.getOrCreateInstance(this, t); + if ('string' == typeof t) { + if (void 0 === e[t]) throw new TypeError(`No method named "${t}"`); + e[t](this); + } + }); + } + } + return ( + R(Mn), + g(Mn), + { + Alert: W, + Button: z, + Carousel: st, + Collapse: pt, + Dropdown: hi, + Modal: Hi, + Offcanvas: Fi, + Popover: gn, + ScrollSpy: An, + Tab: xn, + Toast: Mn, + Tooltip: un, + } + ); +}); +//# sourceMappingURL=bootstrap.bundle.min.js.map diff --git a/data/htdocs/www/js/errorpages/homepage.js b/data/htdocs/www/js/errorpages/homepage.js new file mode 100644 index 0000000..bd3925d --- /dev/null +++ b/data/htdocs/www/js/errorpages/homepage.js @@ -0,0 +1,6 @@ +function homepage() { + let proto = location.protocol; + let port = location.port; + let currentSite = window.location.hostname; + window.location = proto + '//' + currentSite + ':' + port; +} diff --git a/data/htdocs/www/js/errorpages/isup.js b/data/htdocs/www/js/errorpages/isup.js new file mode 100644 index 0000000..60a653f --- /dev/null +++ b/data/htdocs/www/js/errorpages/isup.js @@ -0,0 +1,7 @@ +function isupme() { + let proto = location.protocol; + let port = location.port; + let currentSite = window.location.hostname; + fullurllocation = proto + '//' + currentSite + ':' + port; + window.location = 'http://isup.me/' + fullurllocation; +} diff --git a/data/htdocs/www/js/errorpages/loaddomain.js b/data/htdocs/www/js/errorpages/loaddomain.js new file mode 100644 index 0000000..067ac9e --- /dev/null +++ b/data/htdocs/www/js/errorpages/loaddomain.js @@ -0,0 +1,7 @@ +function loadDomain() { + let proto = location.protocol; + let port = location.port; + let url = location.hostname; + var display = document.getElementById('display-domain'); + display.innerHTML = proto + '//' + url + ':' + port; +} diff --git a/data/htdocs/www/js/errorpages/scale.fix.js b/data/htdocs/www/js/errorpages/scale.fix.js new file mode 100644 index 0000000..33fb0d4 --- /dev/null +++ b/data/htdocs/www/js/errorpages/scale.fix.js @@ -0,0 +1,20 @@ +var metas = document.getElementsByTagName('meta'); +var i; +if (navigator.userAgent.match(/iPhone/i)) { + for (i = 0; i < metas.length; i++) { + if (metas[i].name == 'viewport') { + metas[i].content = + 'width=device-width, minimum-scale=1.0, maximum-scale=1.0'; + } + } + document.addEventListener('gesturestart', gestureStart, false); +} + +function gestureStart() { + for (i = 0; i < metas.length; i++) { + if (metas[i].name == 'viewport') { + metas[i].content = + 'width=device-width, minimum-scale=0.25, maximum-scale=1.6'; + } + } +} diff --git a/data/htdocs/www/js/jquery/default.js b/data/htdocs/www/js/jquery/default.js new file mode 100644 index 0000000..d47405a --- /dev/null +++ b/data/htdocs/www/js/jquery/default.js @@ -0,0 +1,5540 @@ +/*! jQuery v3.5.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!(function (e, t) { + "use strict"; + "object" == typeof module && "object" == typeof module.exports + ? (module.exports = e.document + ? t(e, !0) + : function (e) { + if (!e.document) + throw new Error("jQuery requires a window with a document"); + return t(e); + }) + : t(e); +})("undefined" != typeof window ? window : this, function (C, e) { + "use strict"; + var t = [], + r = Object.getPrototypeOf, + s = t.slice, + g = t.flat + ? function (e) { + return t.flat.call(e); + } + : function (e) { + return t.concat.apply([], e); + }, + u = t.push, + i = t.indexOf, + n = {}, + o = n.toString, + v = n.hasOwnProperty, + a = v.toString, + l = a.call(Object), + y = {}, + m = function (e) { + return "function" == typeof e && "number" != typeof e.nodeType; + }, + x = function (e) { + return null != e && e === e.window; + }, + E = C.document, + c = { type: !0, src: !0, nonce: !0, noModule: !0 }; + function b(e, t, n) { + var r, + i, + o = (n = n || E).createElement("script"); + if (((o.text = e), t)) + for (r in c) + (i = t[r] || (t.getAttribute && t.getAttribute(r))) && + o.setAttribute(r, i); + n.head.appendChild(o).parentNode.removeChild(o); + } + function w(e) { + return null == e + ? e + "" + : "object" == typeof e || "function" == typeof e + ? n[o.call(e)] || "object" + : typeof e; + } + var f = "3.5.1", + S = function (e, t) { + return new S.fn.init(e, t); + }; + function p(e) { + var t = !!e && "length" in e && e.length, + n = w(e); + return ( + !m(e) && + !x(e) && + ("array" === n || + 0 === t || + ("number" == typeof t && 0 < t && t - 1 in e)) + ); + } + (S.fn = S.prototype = { + jquery: f, + constructor: S, + length: 0, + toArray: function () { + return s.call(this); + }, + get: function (e) { + return null == e ? s.call(this) : e < 0 ? this[e + this.length] : this[e]; + }, + pushStack: function (e) { + var t = S.merge(this.constructor(), e); + return (t.prevObject = this), t; + }, + each: function (e) { + return S.each(this, e); + }, + map: function (n) { + return this.pushStack( + S.map(this, function (e, t) { + return n.call(e, t, e); + }) + ); + }, + slice: function () { + return this.pushStack(s.apply(this, arguments)); + }, + first: function () { + return this.eq(0); + }, + last: function () { + return this.eq(-1); + }, + even: function () { + return this.pushStack( + S.grep(this, function (e, t) { + return (t + 1) % 2; + }) + ); + }, + odd: function () { + return this.pushStack( + S.grep(this, function (e, t) { + return t % 2; + }) + ); + }, + eq: function (e) { + var t = this.length, + n = +e + (e < 0 ? t : 0); + return this.pushStack(0 <= n && n < t ? [this[n]] : []); + }, + end: function () { + return this.prevObject || this.constructor(); + }, + push: u, + sort: t.sort, + splice: t.splice, + }), + (S.extend = S.fn.extend = function () { + var e, + t, + n, + r, + i, + o, + a = arguments[0] || {}, + s = 1, + u = arguments.length, + l = !1; + for ( + "boolean" == typeof a && ((l = a), (a = arguments[s] || {}), s++), + "object" == typeof a || m(a) || (a = {}), + s === u && ((a = this), s--); + s < u; + s++ + ) + if (null != (e = arguments[s])) + for (t in e) + (r = e[t]), + "__proto__" !== t && + a !== r && + (l && r && (S.isPlainObject(r) || (i = Array.isArray(r))) + ? ((n = a[t]), + (o = + i && !Array.isArray(n) + ? [] + : i || S.isPlainObject(n) + ? n + : {}), + (i = !1), + (a[t] = S.extend(l, o, r))) + : void 0 !== r && (a[t] = r)); + return a; + }), + S.extend({ + expando: "jQuery" + (f + Math.random()).replace(/\D/g, ""), + isReady: !0, + error: function (e) { + throw new Error(e); + }, + noop: function () {}, + isPlainObject: function (e) { + var t, n; + return ( + !(!e || "[object Object]" !== o.call(e)) && + (!(t = r(e)) || + ("function" == + typeof (n = v.call(t, "constructor") && t.constructor) && + a.call(n) === l)) + ); + }, + isEmptyObject: function (e) { + var t; + for (t in e) return !1; + return !0; + }, + globalEval: function (e, t, n) { + b(e, { nonce: t && t.nonce }, n); + }, + each: function (e, t) { + var n, + r = 0; + if (p(e)) { + for (n = e.length; r < n; r++) + if (!1 === t.call(e[r], r, e[r])) break; + } else for (r in e) if (!1 === t.call(e[r], r, e[r])) break; + return e; + }, + makeArray: function (e, t) { + var n = t || []; + return ( + null != e && + (p(Object(e)) + ? S.merge(n, "string" == typeof e ? [e] : e) + : u.call(n, e)), + n + ); + }, + inArray: function (e, t, n) { + return null == t ? -1 : i.call(t, e, n); + }, + merge: function (e, t) { + for (var n = +t.length, r = 0, i = e.length; r < n; r++) e[i++] = t[r]; + return (e.length = i), e; + }, + grep: function (e, t, n) { + for (var r = [], i = 0, o = e.length, a = !n; i < o; i++) + !t(e[i], i) !== a && r.push(e[i]); + return r; + }, + map: function (e, t, n) { + var r, + i, + o = 0, + a = []; + if (p(e)) + for (r = e.length; o < r; o++) + null != (i = t(e[o], o, n)) && a.push(i); + else for (o in e) null != (i = t(e[o], o, n)) && a.push(i); + return g(a); + }, + guid: 1, + support: y, + }), + "function" == typeof Symbol && (S.fn[Symbol.iterator] = t[Symbol.iterator]), + S.each( + "Boolean Number String Function Array Date RegExp Object Error Symbol".split( + " " + ), + function (e, t) { + n["[object " + t + "]"] = t.toLowerCase(); + } + ); + var d = (function (n) { + var e, + d, + b, + o, + i, + h, + f, + g, + w, + u, + l, + T, + C, + a, + E, + v, + s, + c, + y, + S = "sizzle" + 1 * new Date(), + p = n.document, + k = 0, + r = 0, + m = ue(), + x = ue(), + A = ue(), + N = ue(), + D = function (e, t) { + return e === t && (l = !0), 0; + }, + j = {}.hasOwnProperty, + t = [], + q = t.pop, + L = t.push, + H = t.push, + O = t.slice, + P = function (e, t) { + for (var n = 0, r = e.length; n < r; n++) if (e[n] === t) return n; + return -1; + }, + R = + "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + M = "[\\x20\\t\\r\\n\\f]", + I = + "(?:\\\\[\\da-fA-F]{1,6}" + + M + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + W = + "\\[" + + M + + "*(" + + I + + ")(?:" + + M + + "*([*^$|!~]?=)" + + M + + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + + I + + "))|)" + + M + + "*\\]", + F = + ":(" + + I + + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + + W + + ")*)|.*)\\)|)", + B = new RegExp(M + "+", "g"), + $ = new RegExp("^" + M + "+|((?:^|[^\\\\])(?:\\\\.)*)" + M + "+$", "g"), + _ = new RegExp("^" + M + "*," + M + "*"), + z = new RegExp("^" + M + "*([>+~]|" + M + ")" + M + "*"), + U = new RegExp(M + "|>"), + X = new RegExp(F), + V = new RegExp("^" + I + "$"), + G = { + ID: new RegExp("^#(" + I + ")"), + CLASS: new RegExp("^\\.(" + I + ")"), + TAG: new RegExp("^(" + I + "|[*])"), + ATTR: new RegExp("^" + W), + PSEUDO: new RegExp("^" + F), + CHILD: new RegExp( + "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + M + + "*(even|odd|(([+-]|)(\\d*)n|)" + + M + + "*(?:([+-]|)" + + M + + "*(\\d+)|))" + + M + + "*\\)|)", + "i" + ), + bool: new RegExp("^(?:" + R + ")$", "i"), + needsContext: new RegExp( + "^" + + M + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + M + + "*((?:-\\d)?\\d*)" + + M + + "*\\)|)(?=[^-]|$)", + "i" + ), + }, + Y = /HTML$/i, + Q = /^(?:input|select|textarea|button)$/i, + J = /^h\d$/i, + K = /^[^{]+\{\s*\[native \w/, + Z = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + ee = /[+~]/, + te = new RegExp("\\\\[\\da-fA-F]{1,6}" + M + "?|\\\\([^\\r\\n\\f])", "g"), + ne = function (e, t) { + var n = "0x" + e.slice(1) - 65536; + return ( + t || + (n < 0 + ? String.fromCharCode(n + 65536) + : String.fromCharCode((n >> 10) | 55296, (1023 & n) | 56320)) + ); + }, + re = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, + ie = function (e, t) { + return t + ? "\0" === e + ? "\ufffd" + : e.slice(0, -1) + + "\\" + + e.charCodeAt(e.length - 1).toString(16) + + " " + : "\\" + e; + }, + oe = function () { + T(); + }, + ae = be( + function (e) { + return !0 === e.disabled && "fieldset" === e.nodeName.toLowerCase(); + }, + { dir: "parentNode", next: "legend" } + ); + try { + H.apply((t = O.call(p.childNodes)), p.childNodes), + t[p.childNodes.length].nodeType; + } catch (e) { + H = { + apply: t.length + ? function (e, t) { + L.apply(e, O.call(t)); + } + : function (e, t) { + var n = e.length, + r = 0; + while ((e[n++] = t[r++])); + e.length = n - 1; + }, + }; + } + function se(t, e, n, r) { + var i, + o, + a, + s, + u, + l, + c, + f = e && e.ownerDocument, + p = e ? e.nodeType : 9; + if ( + ((n = n || []), + "string" != typeof t || !t || (1 !== p && 9 !== p && 11 !== p)) + ) + return n; + if (!r && (T(e), (e = e || C), E)) { + if (11 !== p && (u = Z.exec(t))) + if ((i = u[1])) { + if (9 === p) { + if (!(a = e.getElementById(i))) return n; + if (a.id === i) return n.push(a), n; + } else if (f && (a = f.getElementById(i)) && y(e, a) && a.id === i) + return n.push(a), n; + } else { + if (u[2]) return H.apply(n, e.getElementsByTagName(t)), n; + if ( + (i = u[3]) && + d.getElementsByClassName && + e.getElementsByClassName + ) + return H.apply(n, e.getElementsByClassName(i)), n; + } + if ( + d.qsa && + !N[t + " "] && + (!v || !v.test(t)) && + (1 !== p || "object" !== e.nodeName.toLowerCase()) + ) { + if (((c = t), (f = e), 1 === p && (U.test(t) || z.test(t)))) { + ((f = (ee.test(t) && ye(e.parentNode)) || e) === e && d.scope) || + ((s = e.getAttribute("id")) + ? (s = s.replace(re, ie)) + : e.setAttribute("id", (s = S))), + (o = (l = h(t)).length); + while (o--) l[o] = (s ? "#" + s : ":scope") + " " + xe(l[o]); + c = l.join(","); + } + try { + return H.apply(n, f.querySelectorAll(c)), n; + } catch (e) { + N(t, !0); + } finally { + s === S && e.removeAttribute("id"); + } + } + } + return g(t.replace($, "$1"), e, n, r); + } + function ue() { + var r = []; + return function e(t, n) { + return ( + r.push(t + " ") > b.cacheLength && delete e[r.shift()], + (e[t + " "] = n) + ); + }; + } + function le(e) { + return (e[S] = !0), e; + } + function ce(e) { + var t = C.createElement("fieldset"); + try { + return !!e(t); + } catch (e) { + return !1; + } finally { + t.parentNode && t.parentNode.removeChild(t), (t = null); + } + } + function fe(e, t) { + var n = e.split("|"), + r = n.length; + while (r--) b.attrHandle[n[r]] = t; + } + function pe(e, t) { + var n = t && e, + r = + n && + 1 === e.nodeType && + 1 === t.nodeType && + e.sourceIndex - t.sourceIndex; + if (r) return r; + if (n) while ((n = n.nextSibling)) if (n === t) return -1; + return e ? 1 : -1; + } + function de(t) { + return function (e) { + return "input" === e.nodeName.toLowerCase() && e.type === t; + }; + } + function he(n) { + return function (e) { + var t = e.nodeName.toLowerCase(); + return ("input" === t || "button" === t) && e.type === n; + }; + } + function ge(t) { + return function (e) { + return "form" in e + ? e.parentNode && !1 === e.disabled + ? "label" in e + ? "label" in e.parentNode + ? e.parentNode.disabled === t + : e.disabled === t + : e.isDisabled === t || (e.isDisabled !== !t && ae(e) === t) + : e.disabled === t + : "label" in e && e.disabled === t; + }; + } + function ve(a) { + return le(function (o) { + return ( + (o = +o), + le(function (e, t) { + var n, + r = a([], e.length, o), + i = r.length; + while (i--) e[(n = r[i])] && (e[n] = !(t[n] = e[n])); + }) + ); + }); + } + function ye(e) { + return e && "undefined" != typeof e.getElementsByTagName && e; + } + for (e in ((d = se.support = {}), + (i = se.isXML = function (e) { + var t = e.namespaceURI, + n = (e.ownerDocument || e).documentElement; + return !Y.test(t || (n && n.nodeName) || "HTML"); + }), + (T = se.setDocument = function (e) { + var t, + n, + r = e ? e.ownerDocument || e : p; + return ( + r != C && + 9 === r.nodeType && + r.documentElement && + ((a = (C = r).documentElement), + (E = !i(C)), + p != C && + (n = C.defaultView) && + n.top !== n && + (n.addEventListener + ? n.addEventListener("unload", oe, !1) + : n.attachEvent && n.attachEvent("onunload", oe)), + (d.scope = ce(function (e) { + return ( + a.appendChild(e).appendChild(C.createElement("div")), + "undefined" != typeof e.querySelectorAll && + !e.querySelectorAll(":scope fieldset div").length + ); + })), + (d.attributes = ce(function (e) { + return (e.className = "i"), !e.getAttribute("className"); + })), + (d.getElementsByTagName = ce(function (e) { + return ( + e.appendChild(C.createComment("")), + !e.getElementsByTagName("*").length + ); + })), + (d.getElementsByClassName = K.test(C.getElementsByClassName)), + (d.getById = ce(function (e) { + return ( + (a.appendChild(e).id = S), + !C.getElementsByName || !C.getElementsByName(S).length + ); + })), + d.getById + ? ((b.filter.ID = function (e) { + var t = e.replace(te, ne); + return function (e) { + return e.getAttribute("id") === t; + }; + }), + (b.find.ID = function (e, t) { + if ("undefined" != typeof t.getElementById && E) { + var n = t.getElementById(e); + return n ? [n] : []; + } + })) + : ((b.filter.ID = function (e) { + var n = e.replace(te, ne); + return function (e) { + var t = + "undefined" != typeof e.getAttributeNode && + e.getAttributeNode("id"); + return t && t.value === n; + }; + }), + (b.find.ID = function (e, t) { + if ("undefined" != typeof t.getElementById && E) { + var n, + r, + i, + o = t.getElementById(e); + if (o) { + if ((n = o.getAttributeNode("id")) && n.value === e) + return [o]; + (i = t.getElementsByName(e)), (r = 0); + while ((o = i[r++])) + if ((n = o.getAttributeNode("id")) && n.value === e) + return [o]; + } + return []; + } + })), + (b.find.TAG = d.getElementsByTagName + ? function (e, t) { + return "undefined" != typeof t.getElementsByTagName + ? t.getElementsByTagName(e) + : d.qsa + ? t.querySelectorAll(e) + : void 0; + } + : function (e, t) { + var n, + r = [], + i = 0, + o = t.getElementsByTagName(e); + if ("*" === e) { + while ((n = o[i++])) 1 === n.nodeType && r.push(n); + return r; + } + return o; + }), + (b.find.CLASS = + d.getElementsByClassName && + function (e, t) { + if ("undefined" != typeof t.getElementsByClassName && E) + return t.getElementsByClassName(e); + }), + (s = []), + (v = []), + (d.qsa = K.test(C.querySelectorAll)) && + (ce(function (e) { + var t; + (a.appendChild(e).innerHTML = + ""), + e.querySelectorAll("[msallowcapture^='']").length && + v.push("[*^$]=" + M + "*(?:''|\"\")"), + e.querySelectorAll("[selected]").length || + v.push("\\[" + M + "*(?:value|" + R + ")"), + e.querySelectorAll("[id~=" + S + "-]").length || v.push("~="), + (t = C.createElement("input")).setAttribute("name", ""), + e.appendChild(t), + e.querySelectorAll("[name='']").length || + v.push("\\[" + M + "*name" + M + "*=" + M + "*(?:''|\"\")"), + e.querySelectorAll(":checked").length || v.push(":checked"), + e.querySelectorAll("a#" + S + "+*").length || + v.push(".#.+[+~]"), + e.querySelectorAll("\\\f"), + v.push("[\\r\\n\\f]"); + }), + ce(function (e) { + e.innerHTML = + ""; + var t = C.createElement("input"); + t.setAttribute("type", "hidden"), + e.appendChild(t).setAttribute("name", "D"), + e.querySelectorAll("[name=d]").length && + v.push("name" + M + "*[*^$|!~]?="), + 2 !== e.querySelectorAll(":enabled").length && + v.push(":enabled", ":disabled"), + (a.appendChild(e).disabled = !0), + 2 !== e.querySelectorAll(":disabled").length && + v.push(":enabled", ":disabled"), + e.querySelectorAll("*,:x"), + v.push(",.*:"); + })), + (d.matchesSelector = K.test( + (c = + a.matches || + a.webkitMatchesSelector || + a.mozMatchesSelector || + a.oMatchesSelector || + a.msMatchesSelector) + )) && + ce(function (e) { + (d.disconnectedMatch = c.call(e, "*")), + c.call(e, "[s!='']:x"), + s.push("!=", F); + }), + (v = v.length && new RegExp(v.join("|"))), + (s = s.length && new RegExp(s.join("|"))), + (t = K.test(a.compareDocumentPosition)), + (y = + t || K.test(a.contains) + ? function (e, t) { + var n = 9 === e.nodeType ? e.documentElement : e, + r = t && t.parentNode; + return ( + e === r || + !( + !r || + 1 !== r.nodeType || + !(n.contains + ? n.contains(r) + : e.compareDocumentPosition && + 16 & e.compareDocumentPosition(r)) + ) + ); + } + : function (e, t) { + if (t) while ((t = t.parentNode)) if (t === e) return !0; + return !1; + }), + (D = t + ? function (e, t) { + if (e === t) return (l = !0), 0; + var n = !e.compareDocumentPosition - !t.compareDocumentPosition; + return ( + n || + (1 & + (n = + (e.ownerDocument || e) == (t.ownerDocument || t) + ? e.compareDocumentPosition(t) + : 1) || + (!d.sortDetached && t.compareDocumentPosition(e) === n) + ? e == C || (e.ownerDocument == p && y(p, e)) + ? -1 + : t == C || (t.ownerDocument == p && y(p, t)) + ? 1 + : u + ? P(u, e) - P(u, t) + : 0 + : 4 & n + ? -1 + : 1) + ); + } + : function (e, t) { + if (e === t) return (l = !0), 0; + var n, + r = 0, + i = e.parentNode, + o = t.parentNode, + a = [e], + s = [t]; + if (!i || !o) + return e == C + ? -1 + : t == C + ? 1 + : i + ? -1 + : o + ? 1 + : u + ? P(u, e) - P(u, t) + : 0; + if (i === o) return pe(e, t); + n = e; + while ((n = n.parentNode)) a.unshift(n); + n = t; + while ((n = n.parentNode)) s.unshift(n); + while (a[r] === s[r]) r++; + return r ? pe(a[r], s[r]) : a[r] == p ? -1 : s[r] == p ? 1 : 0; + })), + C + ); + }), + (se.matches = function (e, t) { + return se(e, null, null, t); + }), + (se.matchesSelector = function (e, t) { + if ( + (T(e), + d.matchesSelector && + E && + !N[t + " "] && + (!s || !s.test(t)) && + (!v || !v.test(t))) + ) + try { + var n = c.call(e, t); + if ( + n || + d.disconnectedMatch || + (e.document && 11 !== e.document.nodeType) + ) + return n; + } catch (e) { + N(t, !0); + } + return 0 < se(t, C, null, [e]).length; + }), + (se.contains = function (e, t) { + return (e.ownerDocument || e) != C && T(e), y(e, t); + }), + (se.attr = function (e, t) { + (e.ownerDocument || e) != C && T(e); + var n = b.attrHandle[t.toLowerCase()], + r = n && j.call(b.attrHandle, t.toLowerCase()) ? n(e, t, !E) : void 0; + return void 0 !== r + ? r + : d.attributes || !E + ? e.getAttribute(t) + : (r = e.getAttributeNode(t)) && r.specified + ? r.value + : null; + }), + (se.escape = function (e) { + return (e + "").replace(re, ie); + }), + (se.error = function (e) { + throw new Error("Syntax error, unrecognized expression: " + e); + }), + (se.uniqueSort = function (e) { + var t, + n = [], + r = 0, + i = 0; + if ( + ((l = !d.detectDuplicates), + (u = !d.sortStable && e.slice(0)), + e.sort(D), + l) + ) { + while ((t = e[i++])) t === e[i] && (r = n.push(i)); + while (r--) e.splice(n[r], 1); + } + return (u = null), e; + }), + (o = se.getText = function (e) { + var t, + n = "", + r = 0, + i = e.nodeType; + if (i) { + if (1 === i || 9 === i || 11 === i) { + if ("string" == typeof e.textContent) return e.textContent; + for (e = e.firstChild; e; e = e.nextSibling) n += o(e); + } else if (3 === i || 4 === i) return e.nodeValue; + } else while ((t = e[r++])) n += o(t); + return n; + }), + ((b = se.selectors = { + cacheLength: 50, + createPseudo: le, + match: G, + attrHandle: {}, + find: {}, + relative: { + ">": { dir: "parentNode", first: !0 }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: !0 }, + "~": { dir: "previousSibling" }, + }, + preFilter: { + ATTR: function (e) { + return ( + (e[1] = e[1].replace(te, ne)), + (e[3] = (e[3] || e[4] || e[5] || "").replace(te, ne)), + "~=" === e[2] && (e[3] = " " + e[3] + " "), + e.slice(0, 4) + ); + }, + CHILD: function (e) { + return ( + (e[1] = e[1].toLowerCase()), + "nth" === e[1].slice(0, 3) + ? (e[3] || se.error(e[0]), + (e[4] = +(e[4] + ? e[5] + (e[6] || 1) + : 2 * ("even" === e[3] || "odd" === e[3]))), + (e[5] = +(e[7] + e[8] || "odd" === e[3]))) + : e[3] && se.error(e[0]), + e + ); + }, + PSEUDO: function (e) { + var t, + n = !e[6] && e[2]; + return G.CHILD.test(e[0]) + ? null + : (e[3] + ? (e[2] = e[4] || e[5] || "") + : n && + X.test(n) && + (t = h(n, !0)) && + (t = n.indexOf(")", n.length - t) - n.length) && + ((e[0] = e[0].slice(0, t)), (e[2] = n.slice(0, t))), + e.slice(0, 3)); + }, + }, + filter: { + TAG: function (e) { + var t = e.replace(te, ne).toLowerCase(); + return "*" === e + ? function () { + return !0; + } + : function (e) { + return e.nodeName && e.nodeName.toLowerCase() === t; + }; + }, + CLASS: function (e) { + var t = m[e + " "]; + return ( + t || + ((t = new RegExp("(^|" + M + ")" + e + "(" + M + "|$)")) && + m(e, function (e) { + return t.test( + ("string" == typeof e.className && e.className) || + ("undefined" != typeof e.getAttribute && + e.getAttribute("class")) || + "" + ); + })) + ); + }, + ATTR: function (n, r, i) { + return function (e) { + var t = se.attr(e, n); + return null == t + ? "!=" === r + : !r || + ((t += ""), + "=" === r + ? t === i + : "!=" === r + ? t !== i + : "^=" === r + ? i && 0 === t.indexOf(i) + : "*=" === r + ? i && -1 < t.indexOf(i) + : "$=" === r + ? i && t.slice(-i.length) === i + : "~=" === r + ? -1 < (" " + t.replace(B, " ") + " ").indexOf(i) + : "|=" === r && + (t === i || t.slice(0, i.length + 1) === i + "-")); + }; + }, + CHILD: function (h, e, t, g, v) { + var y = "nth" !== h.slice(0, 3), + m = "last" !== h.slice(-4), + x = "of-type" === e; + return 1 === g && 0 === v + ? function (e) { + return !!e.parentNode; + } + : function (e, t, n) { + var r, + i, + o, + a, + s, + u, + l = y !== m ? "nextSibling" : "previousSibling", + c = e.parentNode, + f = x && e.nodeName.toLowerCase(), + p = !n && !x, + d = !1; + if (c) { + if (y) { + while (l) { + a = e; + while ((a = a[l])) + if ( + x ? a.nodeName.toLowerCase() === f : 1 === a.nodeType + ) + return !1; + u = l = "only" === h && !u && "nextSibling"; + } + return !0; + } + if (((u = [m ? c.firstChild : c.lastChild]), m && p)) { + (d = + (s = + (r = + (i = + (o = (a = c)[S] || (a[S] = {}))[a.uniqueID] || + (o[a.uniqueID] = {}))[h] || [])[0] === k && r[1]) && + r[2]), + (a = s && c.childNodes[s]); + while ((a = (++s && a && a[l]) || (d = s = 0) || u.pop())) + if (1 === a.nodeType && ++d && a === e) { + i[h] = [k, s, d]; + break; + } + } else if ( + (p && + (d = s = + (r = + (i = + (o = (a = e)[S] || (a[S] = {}))[a.uniqueID] || + (o[a.uniqueID] = {}))[h] || [])[0] === k && r[1]), + !1 === d) + ) + while ((a = (++s && a && a[l]) || (d = s = 0) || u.pop())) + if ( + (x + ? a.nodeName.toLowerCase() === f + : 1 === a.nodeType) && + ++d && + (p && + ((i = + (o = a[S] || (a[S] = {}))[a.uniqueID] || + (o[a.uniqueID] = {}))[h] = [k, d]), + a === e) + ) + break; + return (d -= v) === g || (d % g == 0 && 0 <= d / g); + } + }; + }, + PSEUDO: function (e, o) { + var t, + a = + b.pseudos[e] || + b.setFilters[e.toLowerCase()] || + se.error("unsupported pseudo: " + e); + return a[S] + ? a(o) + : 1 < a.length + ? ((t = [e, e, "", o]), + b.setFilters.hasOwnProperty(e.toLowerCase()) + ? le(function (e, t) { + var n, + r = a(e, o), + i = r.length; + while (i--) e[(n = P(e, r[i]))] = !(t[n] = r[i]); + }) + : function (e) { + return a(e, 0, t); + }) + : a; + }, + }, + pseudos: { + not: le(function (e) { + var r = [], + i = [], + s = f(e.replace($, "$1")); + return s[S] + ? le(function (e, t, n, r) { + var i, + o = s(e, null, r, []), + a = e.length; + while (a--) (i = o[a]) && (e[a] = !(t[a] = i)); + }) + : function (e, t, n) { + return (r[0] = e), s(r, null, n, i), (r[0] = null), !i.pop(); + }; + }), + has: le(function (t) { + return function (e) { + return 0 < se(t, e).length; + }; + }), + contains: le(function (t) { + return ( + (t = t.replace(te, ne)), + function (e) { + return -1 < (e.textContent || o(e)).indexOf(t); + } + ); + }), + lang: le(function (n) { + return ( + V.test(n || "") || se.error("unsupported lang: " + n), + (n = n.replace(te, ne).toLowerCase()), + function (e) { + var t; + do { + if ( + (t = E + ? e.lang + : e.getAttribute("xml:lang") || e.getAttribute("lang")) + ) + return ( + (t = t.toLowerCase()) === n || 0 === t.indexOf(n + "-") + ); + } while ((e = e.parentNode) && 1 === e.nodeType); + return !1; + } + ); + }), + target: function (e) { + var t = n.location && n.location.hash; + return t && t.slice(1) === e.id; + }, + root: function (e) { + return e === a; + }, + focus: function (e) { + return ( + e === C.activeElement && + (!C.hasFocus || C.hasFocus()) && + !!(e.type || e.href || ~e.tabIndex) + ); + }, + enabled: ge(!1), + disabled: ge(!0), + checked: function (e) { + var t = e.nodeName.toLowerCase(); + return ( + ("input" === t && !!e.checked) || ("option" === t && !!e.selected) + ); + }, + selected: function (e) { + return e.parentNode && e.parentNode.selectedIndex, !0 === e.selected; + }, + empty: function (e) { + for (e = e.firstChild; e; e = e.nextSibling) + if (e.nodeType < 6) return !1; + return !0; + }, + parent: function (e) { + return !b.pseudos.empty(e); + }, + header: function (e) { + return J.test(e.nodeName); + }, + input: function (e) { + return Q.test(e.nodeName); + }, + button: function (e) { + var t = e.nodeName.toLowerCase(); + return ("input" === t && "button" === e.type) || "button" === t; + }, + text: function (e) { + var t; + return ( + "input" === e.nodeName.toLowerCase() && + "text" === e.type && + (null == (t = e.getAttribute("type")) || "text" === t.toLowerCase()) + ); + }, + first: ve(function () { + return [0]; + }), + last: ve(function (e, t) { + return [t - 1]; + }), + eq: ve(function (e, t, n) { + return [n < 0 ? n + t : n]; + }), + even: ve(function (e, t) { + for (var n = 0; n < t; n += 2) e.push(n); + return e; + }), + odd: ve(function (e, t) { + for (var n = 1; n < t; n += 2) e.push(n); + return e; + }), + lt: ve(function (e, t, n) { + for (var r = n < 0 ? n + t : t < n ? t : n; 0 <= --r; ) e.push(r); + return e; + }), + gt: ve(function (e, t, n) { + for (var r = n < 0 ? n + t : n; ++r < t; ) e.push(r); + return e; + }), + }, + }).pseudos.nth = b.pseudos.eq), + { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 })) + b.pseudos[e] = de(e); + for (e in { submit: !0, reset: !0 }) b.pseudos[e] = he(e); + function me() {} + function xe(e) { + for (var t = 0, n = e.length, r = ""; t < n; t++) r += e[t].value; + return r; + } + function be(s, e, t) { + var u = e.dir, + l = e.next, + c = l || u, + f = t && "parentNode" === c, + p = r++; + return e.first + ? function (e, t, n) { + while ((e = e[u])) if (1 === e.nodeType || f) return s(e, t, n); + return !1; + } + : function (e, t, n) { + var r, + i, + o, + a = [k, p]; + if (n) { + while ((e = e[u])) + if ((1 === e.nodeType || f) && s(e, t, n)) return !0; + } else + while ((e = e[u])) + if (1 === e.nodeType || f) + if ( + ((i = + (o = e[S] || (e[S] = {}))[e.uniqueID] || + (o[e.uniqueID] = {})), + l && l === e.nodeName.toLowerCase()) + ) + e = e[u] || e; + else { + if ((r = i[c]) && r[0] === k && r[1] === p) + return (a[2] = r[2]); + if (((i[c] = a)[2] = s(e, t, n))) return !0; + } + return !1; + }; + } + function we(i) { + return 1 < i.length + ? function (e, t, n) { + var r = i.length; + while (r--) if (!i[r](e, t, n)) return !1; + return !0; + } + : i[0]; + } + function Te(e, t, n, r, i) { + for (var o, a = [], s = 0, u = e.length, l = null != t; s < u; s++) + (o = e[s]) && ((n && !n(o, r, i)) || (a.push(o), l && t.push(s))); + return a; + } + function Ce(d, h, g, v, y, e) { + return ( + v && !v[S] && (v = Ce(v)), + y && !y[S] && (y = Ce(y, e)), + le(function (e, t, n, r) { + var i, + o, + a, + s = [], + u = [], + l = t.length, + c = + e || + (function (e, t, n) { + for (var r = 0, i = t.length; r < i; r++) se(e, t[r], n); + return n; + })(h || "*", n.nodeType ? [n] : n, []), + f = !d || (!e && h) ? c : Te(c, s, d, n, r), + p = g ? (y || (e ? d : l || v) ? [] : t) : f; + if ((g && g(f, p, n, r), v)) { + (i = Te(p, u)), v(i, [], n, r), (o = i.length); + while (o--) (a = i[o]) && (p[u[o]] = !(f[u[o]] = a)); + } + if (e) { + if (y || d) { + if (y) { + (i = []), (o = p.length); + while (o--) (a = p[o]) && i.push((f[o] = a)); + y(null, (p = []), i, r); + } + o = p.length; + while (o--) + (a = p[o]) && + -1 < (i = y ? P(e, a) : s[o]) && + (e[i] = !(t[i] = a)); + } + } else (p = Te(p === t ? p.splice(l, p.length) : p)), y ? y(null, t, p, r) : H.apply(t, p); + }) + ); + } + function Ee(e) { + for ( + var i, + t, + n, + r = e.length, + o = b.relative[e[0].type], + a = o || b.relative[" "], + s = o ? 1 : 0, + u = be( + function (e) { + return e === i; + }, + a, + !0 + ), + l = be( + function (e) { + return -1 < P(i, e); + }, + a, + !0 + ), + c = [ + function (e, t, n) { + var r = + (!o && (n || t !== w)) || + ((i = t).nodeType ? u(e, t, n) : l(e, t, n)); + return (i = null), r; + }, + ]; + s < r; + s++ + ) + if ((t = b.relative[e[s].type])) c = [be(we(c), t)]; + else { + if ((t = b.filter[e[s].type].apply(null, e[s].matches))[S]) { + for (n = ++s; n < r; n++) if (b.relative[e[n].type]) break; + return Ce( + 1 < s && we(c), + 1 < s && + xe( + e + .slice(0, s - 1) + .concat({ value: " " === e[s - 2].type ? "*" : "" }) + ).replace($, "$1"), + t, + s < n && Ee(e.slice(s, n)), + n < r && Ee((e = e.slice(n))), + n < r && xe(e) + ); + } + c.push(t); + } + return we(c); + } + return ( + (me.prototype = b.filters = b.pseudos), + (b.setFilters = new me()), + (h = se.tokenize = function (e, t) { + var n, + r, + i, + o, + a, + s, + u, + l = x[e + " "]; + if (l) return t ? 0 : l.slice(0); + (a = e), (s = []), (u = b.preFilter); + while (a) { + for (o in ((n && !(r = _.exec(a))) || + (r && (a = a.slice(r[0].length) || a), s.push((i = []))), + (n = !1), + (r = z.exec(a)) && + ((n = r.shift()), + i.push({ value: n, type: r[0].replace($, " ") }), + (a = a.slice(n.length))), + b.filter)) + !(r = G[o].exec(a)) || + (u[o] && !(r = u[o](r))) || + ((n = r.shift()), + i.push({ value: n, type: o, matches: r }), + (a = a.slice(n.length))); + if (!n) break; + } + return t ? a.length : a ? se.error(e) : x(e, s).slice(0); + }), + (f = se.compile = function (e, t) { + var n, + v, + y, + m, + x, + r, + i = [], + o = [], + a = A[e + " "]; + if (!a) { + t || (t = h(e)), (n = t.length); + while (n--) (a = Ee(t[n]))[S] ? i.push(a) : o.push(a); + (a = A( + e, + ((v = o), + (m = 0 < (y = i).length), + (x = 0 < v.length), + (r = function (e, t, n, r, i) { + var o, + a, + s, + u = 0, + l = "0", + c = e && [], + f = [], + p = w, + d = e || (x && b.find.TAG("*", i)), + h = (k += null == p ? 1 : Math.random() || 0.1), + g = d.length; + for ( + i && (w = t == C || t || i); + l !== g && null != (o = d[l]); + l++ + ) { + if (x && o) { + (a = 0), t || o.ownerDocument == C || (T(o), (n = !E)); + while ((s = v[a++])) + if (s(o, t || C, n)) { + r.push(o); + break; + } + i && (k = h); + } + m && ((o = !s && o) && u--, e && c.push(o)); + } + if (((u += l), m && l !== u)) { + a = 0; + while ((s = y[a++])) s(c, f, t, n); + if (e) { + if (0 < u) while (l--) c[l] || f[l] || (f[l] = q.call(r)); + f = Te(f); + } + H.apply(r, f), + i && + !e && + 0 < f.length && + 1 < u + y.length && + se.uniqueSort(r); + } + return i && ((k = h), (w = p)), c; + }), + m ? le(r) : r) + )).selector = e; + } + return a; + }), + (g = se.select = function (e, t, n, r) { + var i, + o, + a, + s, + u, + l = "function" == typeof e && e, + c = !r && h((e = l.selector || e)); + if (((n = n || []), 1 === c.length)) { + if ( + 2 < (o = c[0] = c[0].slice(0)).length && + "ID" === (a = o[0]).type && + 9 === t.nodeType && + E && + b.relative[o[1].type] + ) { + if (!(t = (b.find.ID(a.matches[0].replace(te, ne), t) || [])[0])) + return n; + l && (t = t.parentNode), (e = e.slice(o.shift().value.length)); + } + i = G.needsContext.test(e) ? 0 : o.length; + while (i--) { + if (((a = o[i]), b.relative[(s = a.type)])) break; + if ( + (u = b.find[s]) && + (r = u( + a.matches[0].replace(te, ne), + (ee.test(o[0].type) && ye(t.parentNode)) || t + )) + ) { + if ((o.splice(i, 1), !(e = r.length && xe(o)))) + return H.apply(n, r), n; + break; + } + } + } + return ( + (l || f(e, c))( + r, + t, + !E, + n, + !t || (ee.test(e) && ye(t.parentNode)) || t + ), + n + ); + }), + (d.sortStable = S.split("").sort(D).join("") === S), + (d.detectDuplicates = !!l), + T(), + (d.sortDetached = ce(function (e) { + return 1 & e.compareDocumentPosition(C.createElement("fieldset")); + })), + ce(function (e) { + return ( + (e.innerHTML = ""), + "#" === e.firstChild.getAttribute("href") + ); + }) || + fe("type|href|height|width", function (e, t, n) { + if (!n) return e.getAttribute(t, "type" === t.toLowerCase() ? 1 : 2); + }), + (d.attributes && + ce(function (e) { + return ( + (e.innerHTML = ""), + e.firstChild.setAttribute("value", ""), + "" === e.firstChild.getAttribute("value") + ); + })) || + fe("value", function (e, t, n) { + if (!n && "input" === e.nodeName.toLowerCase()) return e.defaultValue; + }), + ce(function (e) { + return null == e.getAttribute("disabled"); + }) || + fe(R, function (e, t, n) { + var r; + if (!n) + return !0 === e[t] + ? t.toLowerCase() + : (r = e.getAttributeNode(t)) && r.specified + ? r.value + : null; + }), + se + ); + })(C); + (S.find = d), + (S.expr = d.selectors), + (S.expr[":"] = S.expr.pseudos), + (S.uniqueSort = S.unique = d.uniqueSort), + (S.text = d.getText), + (S.isXMLDoc = d.isXML), + (S.contains = d.contains), + (S.escapeSelector = d.escape); + var h = function (e, t, n) { + var r = [], + i = void 0 !== n; + while ((e = e[t]) && 9 !== e.nodeType) + if (1 === e.nodeType) { + if (i && S(e).is(n)) break; + r.push(e); + } + return r; + }, + T = function (e, t) { + for (var n = []; e; e = e.nextSibling) + 1 === e.nodeType && e !== t && n.push(e); + return n; + }, + k = S.expr.match.needsContext; + function A(e, t) { + return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase(); + } + var N = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; + function D(e, n, r) { + return m(n) + ? S.grep(e, function (e, t) { + return !!n.call(e, t, e) !== r; + }) + : n.nodeType + ? S.grep(e, function (e) { + return (e === n) !== r; + }) + : "string" != typeof n + ? S.grep(e, function (e) { + return -1 < i.call(n, e) !== r; + }) + : S.filter(n, e, r); + } + (S.filter = function (e, t, n) { + var r = t[0]; + return ( + n && (e = ":not(" + e + ")"), + 1 === t.length && 1 === r.nodeType + ? S.find.matchesSelector(r, e) + ? [r] + : [] + : S.find.matches( + e, + S.grep(t, function (e) { + return 1 === e.nodeType; + }) + ) + ); + }), + S.fn.extend({ + find: function (e) { + var t, + n, + r = this.length, + i = this; + if ("string" != typeof e) + return this.pushStack( + S(e).filter(function () { + for (t = 0; t < r; t++) if (S.contains(i[t], this)) return !0; + }) + ); + for (n = this.pushStack([]), t = 0; t < r; t++) S.find(e, i[t], n); + return 1 < r ? S.uniqueSort(n) : n; + }, + filter: function (e) { + return this.pushStack(D(this, e || [], !1)); + }, + not: function (e) { + return this.pushStack(D(this, e || [], !0)); + }, + is: function (e) { + return !!D(this, "string" == typeof e && k.test(e) ? S(e) : e || [], !1) + .length; + }, + }); + var j, + q = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; + ((S.fn.init = function (e, t, n) { + var r, i; + if (!e) return this; + if (((n = n || j), "string" == typeof e)) { + if ( + !(r = + "<" === e[0] && ">" === e[e.length - 1] && 3 <= e.length + ? [null, e, null] + : q.exec(e)) || + (!r[1] && t) + ) + return !t || t.jquery ? (t || n).find(e) : this.constructor(t).find(e); + if (r[1]) { + if ( + ((t = t instanceof S ? t[0] : t), + S.merge( + this, + S.parseHTML(r[1], t && t.nodeType ? t.ownerDocument || t : E, !0) + ), + N.test(r[1]) && S.isPlainObject(t)) + ) + for (r in t) m(this[r]) ? this[r](t[r]) : this.attr(r, t[r]); + return this; + } + return ( + (i = E.getElementById(r[2])) && ((this[0] = i), (this.length = 1)), this + ); + } + return e.nodeType + ? ((this[0] = e), (this.length = 1), this) + : m(e) + ? void 0 !== n.ready + ? n.ready(e) + : e(S) + : S.makeArray(e, this); + }).prototype = S.fn), + (j = S(E)); + var L = /^(?:parents|prev(?:Until|All))/, + H = { children: !0, contents: !0, next: !0, prev: !0 }; + function O(e, t) { + while ((e = e[t]) && 1 !== e.nodeType); + return e; + } + S.fn.extend({ + has: function (e) { + var t = S(e, this), + n = t.length; + return this.filter(function () { + for (var e = 0; e < n; e++) if (S.contains(this, t[e])) return !0; + }); + }, + closest: function (e, t) { + var n, + r = 0, + i = this.length, + o = [], + a = "string" != typeof e && S(e); + if (!k.test(e)) + for (; r < i; r++) + for (n = this[r]; n && n !== t; n = n.parentNode) + if ( + n.nodeType < 11 && + (a + ? -1 < a.index(n) + : 1 === n.nodeType && S.find.matchesSelector(n, e)) + ) { + o.push(n); + break; + } + return this.pushStack(1 < o.length ? S.uniqueSort(o) : o); + }, + index: function (e) { + return e + ? "string" == typeof e + ? i.call(S(e), this[0]) + : i.call(this, e.jquery ? e[0] : e) + : this[0] && this[0].parentNode + ? this.first().prevAll().length + : -1; + }, + add: function (e, t) { + return this.pushStack(S.uniqueSort(S.merge(this.get(), S(e, t)))); + }, + addBack: function (e) { + return this.add(null == e ? this.prevObject : this.prevObject.filter(e)); + }, + }), + S.each( + { + parent: function (e) { + var t = e.parentNode; + return t && 11 !== t.nodeType ? t : null; + }, + parents: function (e) { + return h(e, "parentNode"); + }, + parentsUntil: function (e, t, n) { + return h(e, "parentNode", n); + }, + next: function (e) { + return O(e, "nextSibling"); + }, + prev: function (e) { + return O(e, "previousSibling"); + }, + nextAll: function (e) { + return h(e, "nextSibling"); + }, + prevAll: function (e) { + return h(e, "previousSibling"); + }, + nextUntil: function (e, t, n) { + return h(e, "nextSibling", n); + }, + prevUntil: function (e, t, n) { + return h(e, "previousSibling", n); + }, + siblings: function (e) { + return T((e.parentNode || {}).firstChild, e); + }, + children: function (e) { + return T(e.firstChild); + }, + contents: function (e) { + return null != e.contentDocument && r(e.contentDocument) + ? e.contentDocument + : (A(e, "template") && (e = e.content || e), + S.merge([], e.childNodes)); + }, + }, + function (r, i) { + S.fn[r] = function (e, t) { + var n = S.map(this, i, e); + return ( + "Until" !== r.slice(-5) && (t = e), + t && "string" == typeof t && (n = S.filter(t, n)), + 1 < this.length && + (H[r] || S.uniqueSort(n), L.test(r) && n.reverse()), + this.pushStack(n) + ); + }; + } + ); + var P = /[^\x20\t\r\n\f]+/g; + function R(e) { + return e; + } + function M(e) { + throw e; + } + function I(e, t, n, r) { + var i; + try { + e && m((i = e.promise)) + ? i.call(e).done(t).fail(n) + : e && m((i = e.then)) + ? i.call(e, t, n) + : t.apply(void 0, [e].slice(r)); + } catch (e) { + n.apply(void 0, [e]); + } + } + (S.Callbacks = function (r) { + var e, n; + r = + "string" == typeof r + ? ((e = r), + (n = {}), + S.each(e.match(P) || [], function (e, t) { + n[t] = !0; + }), + n) + : S.extend({}, r); + var i, + t, + o, + a, + s = [], + u = [], + l = -1, + c = function () { + for (a = a || r.once, o = i = !0; u.length; l = -1) { + t = u.shift(); + while (++l < s.length) + !1 === s[l].apply(t[0], t[1]) && + r.stopOnFalse && + ((l = s.length), (t = !1)); + } + r.memory || (t = !1), (i = !1), a && (s = t ? [] : ""); + }, + f = { + add: function () { + return ( + s && + (t && !i && ((l = s.length - 1), u.push(t)), + (function n(e) { + S.each(e, function (e, t) { + m(t) + ? (r.unique && f.has(t)) || s.push(t) + : t && t.length && "string" !== w(t) && n(t); + }); + })(arguments), + t && !i && c()), + this + ); + }, + remove: function () { + return ( + S.each(arguments, function (e, t) { + var n; + while (-1 < (n = S.inArray(t, s, n))) + s.splice(n, 1), n <= l && l--; + }), + this + ); + }, + has: function (e) { + return e ? -1 < S.inArray(e, s) : 0 < s.length; + }, + empty: function () { + return s && (s = []), this; + }, + disable: function () { + return (a = u = []), (s = t = ""), this; + }, + disabled: function () { + return !s; + }, + lock: function () { + return (a = u = []), t || i || (s = t = ""), this; + }, + locked: function () { + return !!a; + }, + fireWith: function (e, t) { + return ( + a || + ((t = [e, (t = t || []).slice ? t.slice() : t]), + u.push(t), + i || c()), + this + ); + }, + fire: function () { + return f.fireWith(this, arguments), this; + }, + fired: function () { + return !!o; + }, + }; + return f; + }), + S.extend({ + Deferred: function (e) { + var o = [ + [ + "notify", + "progress", + S.Callbacks("memory"), + S.Callbacks("memory"), + 2, + ], + [ + "resolve", + "done", + S.Callbacks("once memory"), + S.Callbacks("once memory"), + 0, + "resolved", + ], + [ + "reject", + "fail", + S.Callbacks("once memory"), + S.Callbacks("once memory"), + 1, + "rejected", + ], + ], + i = "pending", + a = { + state: function () { + return i; + }, + always: function () { + return s.done(arguments).fail(arguments), this; + }, + catch: function (e) { + return a.then(null, e); + }, + pipe: function () { + var i = arguments; + return S.Deferred(function (r) { + S.each(o, function (e, t) { + var n = m(i[t[4]]) && i[t[4]]; + s[t[1]](function () { + var e = n && n.apply(this, arguments); + e && m(e.promise) + ? e + .promise() + .progress(r.notify) + .done(r.resolve) + .fail(r.reject) + : r[t[0] + "With"](this, n ? [e] : arguments); + }); + }), + (i = null); + }).promise(); + }, + then: function (t, n, r) { + var u = 0; + function l(i, o, a, s) { + return function () { + var n = this, + r = arguments, + e = function () { + var e, t; + if (!(i < u)) { + if ((e = a.apply(n, r)) === o.promise()) + throw new TypeError("Thenable self-resolution"); + (t = + e && + ("object" == typeof e || "function" == typeof e) && + e.then), + m(t) + ? s + ? t.call(e, l(u, o, R, s), l(u, o, M, s)) + : (u++, + t.call( + e, + l(u, o, R, s), + l(u, o, M, s), + l(u, o, R, o.notifyWith) + )) + : (a !== R && ((n = void 0), (r = [e])), + (s || o.resolveWith)(n, r)); + } + }, + t = s + ? e + : function () { + try { + e(); + } catch (e) { + S.Deferred.exceptionHook && + S.Deferred.exceptionHook(e, t.stackTrace), + u <= i + 1 && + (a !== M && ((n = void 0), (r = [e])), + o.rejectWith(n, r)); + } + }; + i + ? t() + : (S.Deferred.getStackHook && + (t.stackTrace = S.Deferred.getStackHook()), + C.setTimeout(t)); + }; + } + return S.Deferred(function (e) { + o[0][3].add(l(0, e, m(r) ? r : R, e.notifyWith)), + o[1][3].add(l(0, e, m(t) ? t : R)), + o[2][3].add(l(0, e, m(n) ? n : M)); + }).promise(); + }, + promise: function (e) { + return null != e ? S.extend(e, a) : a; + }, + }, + s = {}; + return ( + S.each(o, function (e, t) { + var n = t[2], + r = t[5]; + (a[t[1]] = n.add), + r && + n.add( + function () { + i = r; + }, + o[3 - e][2].disable, + o[3 - e][3].disable, + o[0][2].lock, + o[0][3].lock + ), + n.add(t[3].fire), + (s[t[0]] = function () { + return ( + s[t[0] + "With"](this === s ? void 0 : this, arguments), this + ); + }), + (s[t[0] + "With"] = n.fireWith); + }), + a.promise(s), + e && e.call(s, s), + s + ); + }, + when: function (e) { + var n = arguments.length, + t = n, + r = Array(t), + i = s.call(arguments), + o = S.Deferred(), + a = function (t) { + return function (e) { + (r[t] = this), + (i[t] = 1 < arguments.length ? s.call(arguments) : e), + --n || o.resolveWith(r, i); + }; + }; + if ( + n <= 1 && + (I(e, o.done(a(t)).resolve, o.reject, !n), + "pending" === o.state() || m(i[t] && i[t].then)) + ) + return o.then(); + while (t--) I(i[t], a(t), o.reject); + return o.promise(); + }, + }); + var W = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + (S.Deferred.exceptionHook = function (e, t) { + C.console && + C.console.warn && + e && + W.test(e.name) && + C.console.warn("jQuery.Deferred exception: " + e.message, e.stack, t); + }), + (S.readyException = function (e) { + C.setTimeout(function () { + throw e; + }); + }); + var F = S.Deferred(); + function B() { + E.removeEventListener("DOMContentLoaded", B), + C.removeEventListener("load", B), + S.ready(); + } + (S.fn.ready = function (e) { + return ( + F.then(e)["catch"](function (e) { + S.readyException(e); + }), + this + ); + }), + S.extend({ + isReady: !1, + readyWait: 1, + ready: function (e) { + (!0 === e ? --S.readyWait : S.isReady) || + ((S.isReady = !0) !== e && 0 < --S.readyWait) || + F.resolveWith(E, [S]); + }, + }), + (S.ready.then = F.then), + "complete" === E.readyState || + ("loading" !== E.readyState && !E.documentElement.doScroll) + ? C.setTimeout(S.ready) + : (E.addEventListener("DOMContentLoaded", B), + C.addEventListener("load", B)); + var $ = function (e, t, n, r, i, o, a) { + var s = 0, + u = e.length, + l = null == n; + if ("object" === w(n)) + for (s in ((i = !0), n)) $(e, t, s, n[s], !0, o, a); + else if ( + void 0 !== r && + ((i = !0), + m(r) || (a = !0), + l && + (a + ? (t.call(e, r), (t = null)) + : ((l = t), + (t = function (e, t, n) { + return l.call(S(e), n); + }))), + t) + ) + for (; s < u; s++) t(e[s], n, a ? r : r.call(e[s], s, t(e[s], n))); + return i ? e : l ? t.call(e) : u ? t(e[0], n) : o; + }, + _ = /^-ms-/, + z = /-([a-z])/g; + function U(e, t) { + return t.toUpperCase(); + } + function X(e) { + return e.replace(_, "ms-").replace(z, U); + } + var V = function (e) { + return 1 === e.nodeType || 9 === e.nodeType || !+e.nodeType; + }; + function G() { + this.expando = S.expando + G.uid++; + } + (G.uid = 1), + (G.prototype = { + cache: function (e) { + var t = e[this.expando]; + return ( + t || + ((t = {}), + V(e) && + (e.nodeType + ? (e[this.expando] = t) + : Object.defineProperty(e, this.expando, { + value: t, + configurable: !0, + }))), + t + ); + }, + set: function (e, t, n) { + var r, + i = this.cache(e); + if ("string" == typeof t) i[X(t)] = n; + else for (r in t) i[X(r)] = t[r]; + return i; + }, + get: function (e, t) { + return void 0 === t + ? this.cache(e) + : e[this.expando] && e[this.expando][X(t)]; + }, + access: function (e, t, n) { + return void 0 === t || (t && "string" == typeof t && void 0 === n) + ? this.get(e, t) + : (this.set(e, t, n), void 0 !== n ? n : t); + }, + remove: function (e, t) { + var n, + r = e[this.expando]; + if (void 0 !== r) { + if (void 0 !== t) { + n = (t = Array.isArray(t) + ? t.map(X) + : (t = X(t)) in r + ? [t] + : t.match(P) || []).length; + while (n--) delete r[t[n]]; + } + (void 0 === t || S.isEmptyObject(r)) && + (e.nodeType ? (e[this.expando] = void 0) : delete e[this.expando]); + } + }, + hasData: function (e) { + var t = e[this.expando]; + return void 0 !== t && !S.isEmptyObject(t); + }, + }); + var Y = new G(), + Q = new G(), + J = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + K = /[A-Z]/g; + function Z(e, t, n) { + var r, i; + if (void 0 === n && 1 === e.nodeType) + if ( + ((r = "data-" + t.replace(K, "-$&").toLowerCase()), + "string" == typeof (n = e.getAttribute(r))) + ) { + try { + n = + "true" === (i = n) || + ("false" !== i && + ("null" === i + ? null + : i === +i + "" + ? +i + : J.test(i) + ? JSON.parse(i) + : i)); + } catch (e) {} + Q.set(e, t, n); + } else n = void 0; + return n; + } + S.extend({ + hasData: function (e) { + return Q.hasData(e) || Y.hasData(e); + }, + data: function (e, t, n) { + return Q.access(e, t, n); + }, + removeData: function (e, t) { + Q.remove(e, t); + }, + _data: function (e, t, n) { + return Y.access(e, t, n); + }, + _removeData: function (e, t) { + Y.remove(e, t); + }, + }), + S.fn.extend({ + data: function (n, e) { + var t, + r, + i, + o = this[0], + a = o && o.attributes; + if (void 0 === n) { + if ( + this.length && + ((i = Q.get(o)), 1 === o.nodeType && !Y.get(o, "hasDataAttrs")) + ) { + t = a.length; + while (t--) + a[t] && + 0 === (r = a[t].name).indexOf("data-") && + ((r = X(r.slice(5))), Z(o, r, i[r])); + Y.set(o, "hasDataAttrs", !0); + } + return i; + } + return "object" == typeof n + ? this.each(function () { + Q.set(this, n); + }) + : $( + this, + function (e) { + var t; + if (o && void 0 === e) + return void 0 !== (t = Q.get(o, n)) + ? t + : void 0 !== (t = Z(o, n)) + ? t + : void 0; + this.each(function () { + Q.set(this, n, e); + }); + }, + null, + e, + 1 < arguments.length, + null, + !0 + ); + }, + removeData: function (e) { + return this.each(function () { + Q.remove(this, e); + }); + }, + }), + S.extend({ + queue: function (e, t, n) { + var r; + if (e) + return ( + (t = (t || "fx") + "queue"), + (r = Y.get(e, t)), + n && + (!r || Array.isArray(n) + ? (r = Y.access(e, t, S.makeArray(n))) + : r.push(n)), + r || [] + ); + }, + dequeue: function (e, t) { + t = t || "fx"; + var n = S.queue(e, t), + r = n.length, + i = n.shift(), + o = S._queueHooks(e, t); + "inprogress" === i && ((i = n.shift()), r--), + i && + ("fx" === t && n.unshift("inprogress"), + delete o.stop, + i.call( + e, + function () { + S.dequeue(e, t); + }, + o + )), + !r && o && o.empty.fire(); + }, + _queueHooks: function (e, t) { + var n = t + "queueHooks"; + return ( + Y.get(e, n) || + Y.access(e, n, { + empty: S.Callbacks("once memory").add(function () { + Y.remove(e, [t + "queue", n]); + }), + }) + ); + }, + }), + S.fn.extend({ + queue: function (t, n) { + var e = 2; + return ( + "string" != typeof t && ((n = t), (t = "fx"), e--), + arguments.length < e + ? S.queue(this[0], t) + : void 0 === n + ? this + : this.each(function () { + var e = S.queue(this, t, n); + S._queueHooks(this, t), + "fx" === t && "inprogress" !== e[0] && S.dequeue(this, t); + }) + ); + }, + dequeue: function (e) { + return this.each(function () { + S.dequeue(this, e); + }); + }, + clearQueue: function (e) { + return this.queue(e || "fx", []); + }, + promise: function (e, t) { + var n, + r = 1, + i = S.Deferred(), + o = this, + a = this.length, + s = function () { + --r || i.resolveWith(o, [o]); + }; + "string" != typeof e && ((t = e), (e = void 0)), (e = e || "fx"); + while (a--) + (n = Y.get(o[a], e + "queueHooks")) && + n.empty && + (r++, n.empty.add(s)); + return s(), i.promise(t); + }, + }); + var ee = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, + te = new RegExp("^(?:([+-])=|)(" + ee + ")([a-z%]*)$", "i"), + ne = ["Top", "Right", "Bottom", "Left"], + re = E.documentElement, + ie = function (e) { + return S.contains(e.ownerDocument, e); + }, + oe = { composed: !0 }; + re.getRootNode && + (ie = function (e) { + return ( + S.contains(e.ownerDocument, e) || e.getRootNode(oe) === e.ownerDocument + ); + }); + var ae = function (e, t) { + return ( + "none" === (e = t || e).style.display || + ("" === e.style.display && ie(e) && "none" === S.css(e, "display")) + ); + }; + function se(e, t, n, r) { + var i, + o, + a = 20, + s = r + ? function () { + return r.cur(); + } + : function () { + return S.css(e, t, ""); + }, + u = s(), + l = (n && n[3]) || (S.cssNumber[t] ? "" : "px"), + c = + e.nodeType && + (S.cssNumber[t] || ("px" !== l && +u)) && + te.exec(S.css(e, t)); + if (c && c[3] !== l) { + (u /= 2), (l = l || c[3]), (c = +u || 1); + while (a--) + S.style(e, t, c + l), + (1 - o) * (1 - (o = s() / u || 0.5)) <= 0 && (a = 0), + (c /= o); + (c *= 2), S.style(e, t, c + l), (n = n || []); + } + return ( + n && + ((c = +c || +u || 0), + (i = n[1] ? c + (n[1] + 1) * n[2] : +n[2]), + r && ((r.unit = l), (r.start = c), (r.end = i))), + i + ); + } + var ue = {}; + function le(e, t) { + for (var n, r, i, o, a, s, u, l = [], c = 0, f = e.length; c < f; c++) + (r = e[c]).style && + ((n = r.style.display), + t + ? ("none" === n && + ((l[c] = Y.get(r, "display") || null), + l[c] || (r.style.display = "")), + "" === r.style.display && + ae(r) && + (l[c] = + ((u = a = o = void 0), + (a = (i = r).ownerDocument), + (s = i.nodeName), + (u = ue[s]) || + ((o = a.body.appendChild(a.createElement(s))), + (u = S.css(o, "display")), + o.parentNode.removeChild(o), + "none" === u && (u = "block"), + (ue[s] = u))))) + : "none" !== n && ((l[c] = "none"), Y.set(r, "display", n))); + for (c = 0; c < f; c++) null != l[c] && (e[c].style.display = l[c]); + return e; + } + S.fn.extend({ + show: function () { + return le(this, !0); + }, + hide: function () { + return le(this); + }, + toggle: function (e) { + return "boolean" == typeof e + ? e + ? this.show() + : this.hide() + : this.each(function () { + ae(this) ? S(this).show() : S(this).hide(); + }); + }, + }); + var ce, + fe, + pe = /^(?:checkbox|radio)$/i, + de = /<([a-z][^\/\0>\x20\t\r\n\f]*)/i, + he = /^$|^module$|\/(?:java|ecma)script/i; + (ce = E.createDocumentFragment().appendChild(E.createElement("div"))), + (fe = E.createElement("input")).setAttribute("type", "radio"), + fe.setAttribute("checked", "checked"), + fe.setAttribute("name", "t"), + ce.appendChild(fe), + (y.checkClone = ce.cloneNode(!0).cloneNode(!0).lastChild.checked), + (ce.innerHTML = ""), + (y.noCloneChecked = !!ce.cloneNode(!0).lastChild.defaultValue), + (ce.innerHTML = ""), + (y.option = !!ce.lastChild); + var ge = { + thead: [1, "", "
"], + col: [2, "", "
"], + tr: [2, "", "
"], + td: [3, "", "
"], + _default: [0, "", ""], + }; + function ve(e, t) { + var n; + return ( + (n = + "undefined" != typeof e.getElementsByTagName + ? e.getElementsByTagName(t || "*") + : "undefined" != typeof e.querySelectorAll + ? e.querySelectorAll(t || "*") + : []), + void 0 === t || (t && A(e, t)) ? S.merge([e], n) : n + ); + } + function ye(e, t) { + for (var n = 0, r = e.length; n < r; n++) + Y.set(e[n], "globalEval", !t || Y.get(t[n], "globalEval")); + } + (ge.tbody = ge.tfoot = ge.colgroup = ge.caption = ge.thead), + (ge.th = ge.td), + y.option || + (ge.optgroup = ge.option = [ + 1, + "", + ]); + var me = /<|&#?\w+;/; + function xe(e, t, n, r, i) { + for ( + var o, + a, + s, + u, + l, + c, + f = t.createDocumentFragment(), + p = [], + d = 0, + h = e.length; + d < h; + d++ + ) + if ((o = e[d]) || 0 === o) + if ("object" === w(o)) S.merge(p, o.nodeType ? [o] : o); + else if (me.test(o)) { + (a = a || f.appendChild(t.createElement("div"))), + (s = (de.exec(o) || ["", ""])[1].toLowerCase()), + (u = ge[s] || ge._default), + (a.innerHTML = u[1] + S.htmlPrefilter(o) + u[2]), + (c = u[0]); + while (c--) a = a.lastChild; + S.merge(p, a.childNodes), ((a = f.firstChild).textContent = ""); + } else p.push(t.createTextNode(o)); + (f.textContent = ""), (d = 0); + while ((o = p[d++])) + if (r && -1 < S.inArray(o, r)) i && i.push(o); + else if ( + ((l = ie(o)), (a = ve(f.appendChild(o), "script")), l && ye(a), n) + ) { + c = 0; + while ((o = a[c++])) he.test(o.type || "") && n.push(o); + } + return f; + } + var be = /^key/, + we = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + Te = /^([^.]*)(?:\.(.+)|)/; + function Ce() { + return !0; + } + function Ee() { + return !1; + } + function Se(e, t) { + return ( + (e === + (function () { + try { + return E.activeElement; + } catch (e) {} + })()) == + ("focus" === t) + ); + } + function ke(e, t, n, r, i, o) { + var a, s; + if ("object" == typeof t) { + for (s in ("string" != typeof n && ((r = r || n), (n = void 0)), t)) + ke(e, s, n, r, t[s], o); + return e; + } + if ( + (null == r && null == i + ? ((i = n), (r = n = void 0)) + : null == i && + ("string" == typeof n + ? ((i = r), (r = void 0)) + : ((i = r), (r = n), (n = void 0))), + !1 === i) + ) + i = Ee; + else if (!i) return e; + return ( + 1 === o && + ((a = i), + ((i = function (e) { + return S().off(e), a.apply(this, arguments); + }).guid = a.guid || (a.guid = S.guid++))), + e.each(function () { + S.event.add(this, t, i, r, n); + }) + ); + } + function Ae(e, i, o) { + o + ? (Y.set(e, i, !1), + S.event.add(e, i, { + namespace: !1, + handler: function (e) { + var t, + n, + r = Y.get(this, i); + if (1 & e.isTrigger && this[i]) { + if (r.length) + (S.event.special[i] || {}).delegateType && e.stopPropagation(); + else if ( + ((r = s.call(arguments)), + Y.set(this, i, r), + (t = o(this, i)), + this[i](), + r !== (n = Y.get(this, i)) || t ? Y.set(this, i, !1) : (n = {}), + r !== n) + ) + return ( + e.stopImmediatePropagation(), e.preventDefault(), n.value + ); + } else + r.length && + (Y.set(this, i, { + value: S.event.trigger( + S.extend(r[0], S.Event.prototype), + r.slice(1), + this + ), + }), + e.stopImmediatePropagation()); + }, + })) + : void 0 === Y.get(e, i) && S.event.add(e, i, Ce); + } + (S.event = { + global: {}, + add: function (t, e, n, r, i) { + var o, + a, + s, + u, + l, + c, + f, + p, + d, + h, + g, + v = Y.get(t); + if (V(t)) { + n.handler && ((n = (o = n).handler), (i = o.selector)), + i && S.find.matchesSelector(re, i), + n.guid || (n.guid = S.guid++), + (u = v.events) || (u = v.events = Object.create(null)), + (a = v.handle) || + (a = v.handle = function (e) { + return "undefined" != typeof S && S.event.triggered !== e.type + ? S.event.dispatch.apply(t, arguments) + : void 0; + }), + (l = (e = (e || "").match(P) || [""]).length); + while (l--) + (d = g = (s = Te.exec(e[l]) || [])[1]), + (h = (s[2] || "").split(".").sort()), + d && + ((f = S.event.special[d] || {}), + (d = (i ? f.delegateType : f.bindType) || d), + (f = S.event.special[d] || {}), + (c = S.extend( + { + type: d, + origType: g, + data: r, + handler: n, + guid: n.guid, + selector: i, + needsContext: i && S.expr.match.needsContext.test(i), + namespace: h.join("."), + }, + o + )), + (p = u[d]) || + (((p = u[d] = []).delegateCount = 0), + (f.setup && !1 !== f.setup.call(t, r, h, a)) || + (t.addEventListener && t.addEventListener(d, a))), + f.add && + (f.add.call(t, c), c.handler.guid || (c.handler.guid = n.guid)), + i ? p.splice(p.delegateCount++, 0, c) : p.push(c), + (S.event.global[d] = !0)); + } + }, + remove: function (e, t, n, r, i) { + var o, + a, + s, + u, + l, + c, + f, + p, + d, + h, + g, + v = Y.hasData(e) && Y.get(e); + if (v && (u = v.events)) { + l = (t = (t || "").match(P) || [""]).length; + while (l--) + if ( + ((d = g = (s = Te.exec(t[l]) || [])[1]), + (h = (s[2] || "").split(".").sort()), + d) + ) { + (f = S.event.special[d] || {}), + (p = u[(d = (r ? f.delegateType : f.bindType) || d)] || []), + (s = + s[2] && + new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)")), + (a = o = p.length); + while (o--) + (c = p[o]), + (!i && g !== c.origType) || + (n && n.guid !== c.guid) || + (s && !s.test(c.namespace)) || + (r && r !== c.selector && ("**" !== r || !c.selector)) || + (p.splice(o, 1), + c.selector && p.delegateCount--, + f.remove && f.remove.call(e, c)); + a && + !p.length && + ((f.teardown && !1 !== f.teardown.call(e, h, v.handle)) || + S.removeEvent(e, d, v.handle), + delete u[d]); + } else for (d in u) S.event.remove(e, d + t[l], n, r, !0); + S.isEmptyObject(u) && Y.remove(e, "handle events"); + } + }, + dispatch: function (e) { + var t, + n, + r, + i, + o, + a, + s = new Array(arguments.length), + u = S.event.fix(e), + l = (Y.get(this, "events") || Object.create(null))[u.type] || [], + c = S.event.special[u.type] || {}; + for (s[0] = u, t = 1; t < arguments.length; t++) s[t] = arguments[t]; + if ( + ((u.delegateTarget = this), + !c.preDispatch || !1 !== c.preDispatch.call(this, u)) + ) { + (a = S.event.handlers.call(this, u, l)), (t = 0); + while ((i = a[t++]) && !u.isPropagationStopped()) { + (u.currentTarget = i.elem), (n = 0); + while ((o = i.handlers[n++]) && !u.isImmediatePropagationStopped()) + (u.rnamespace && + !1 !== o.namespace && + !u.rnamespace.test(o.namespace)) || + ((u.handleObj = o), + (u.data = o.data), + void 0 !== + (r = ( + (S.event.special[o.origType] || {}).handle || o.handler + ).apply(i.elem, s)) && + !1 === (u.result = r) && + (u.preventDefault(), u.stopPropagation())); + } + return c.postDispatch && c.postDispatch.call(this, u), u.result; + } + }, + handlers: function (e, t) { + var n, + r, + i, + o, + a, + s = [], + u = t.delegateCount, + l = e.target; + if (u && l.nodeType && !("click" === e.type && 1 <= e.button)) + for (; l !== this; l = l.parentNode || this) + if (1 === l.nodeType && ("click" !== e.type || !0 !== l.disabled)) { + for (o = [], a = {}, n = 0; n < u; n++) + void 0 === a[(i = (r = t[n]).selector + " ")] && + (a[i] = r.needsContext + ? -1 < S(i, this).index(l) + : S.find(i, this, null, [l]).length), + a[i] && o.push(r); + o.length && s.push({ elem: l, handlers: o }); + } + return ( + (l = this), u < t.length && s.push({ elem: l, handlers: t.slice(u) }), s + ); + }, + addProp: function (t, e) { + Object.defineProperty(S.Event.prototype, t, { + enumerable: !0, + configurable: !0, + get: m(e) + ? function () { + if (this.originalEvent) return e(this.originalEvent); + } + : function () { + if (this.originalEvent) return this.originalEvent[t]; + }, + set: function (e) { + Object.defineProperty(this, t, { + enumerable: !0, + configurable: !0, + writable: !0, + value: e, + }); + }, + }); + }, + fix: function (e) { + return e[S.expando] ? e : new S.Event(e); + }, + special: { + load: { noBubble: !0 }, + click: { + setup: function (e) { + var t = this || e; + return ( + pe.test(t.type) && t.click && A(t, "input") && Ae(t, "click", Ce), + !1 + ); + }, + trigger: function (e) { + var t = this || e; + return ( + pe.test(t.type) && t.click && A(t, "input") && Ae(t, "click"), !0 + ); + }, + _default: function (e) { + var t = e.target; + return ( + (pe.test(t.type) && + t.click && + A(t, "input") && + Y.get(t, "click")) || + A(t, "a") + ); + }, + }, + beforeunload: { + postDispatch: function (e) { + void 0 !== e.result && + e.originalEvent && + (e.originalEvent.returnValue = e.result); + }, + }, + }, + }), + (S.removeEvent = function (e, t, n) { + e.removeEventListener && e.removeEventListener(t, n); + }), + (S.Event = function (e, t) { + if (!(this instanceof S.Event)) return new S.Event(e, t); + e && e.type + ? ((this.originalEvent = e), + (this.type = e.type), + (this.isDefaultPrevented = + e.defaultPrevented || + (void 0 === e.defaultPrevented && !1 === e.returnValue) + ? Ce + : Ee), + (this.target = + e.target && 3 === e.target.nodeType + ? e.target.parentNode + : e.target), + (this.currentTarget = e.currentTarget), + (this.relatedTarget = e.relatedTarget)) + : (this.type = e), + t && S.extend(this, t), + (this.timeStamp = (e && e.timeStamp) || Date.now()), + (this[S.expando] = !0); + }), + (S.Event.prototype = { + constructor: S.Event, + isDefaultPrevented: Ee, + isPropagationStopped: Ee, + isImmediatePropagationStopped: Ee, + isSimulated: !1, + preventDefault: function () { + var e = this.originalEvent; + (this.isDefaultPrevented = Ce), + e && !this.isSimulated && e.preventDefault(); + }, + stopPropagation: function () { + var e = this.originalEvent; + (this.isPropagationStopped = Ce), + e && !this.isSimulated && e.stopPropagation(); + }, + stopImmediatePropagation: function () { + var e = this.originalEvent; + (this.isImmediatePropagationStopped = Ce), + e && !this.isSimulated && e.stopImmediatePropagation(), + this.stopPropagation(); + }, + }), + S.each( + { + altKey: !0, + bubbles: !0, + cancelable: !0, + changedTouches: !0, + ctrlKey: !0, + detail: !0, + eventPhase: !0, + metaKey: !0, + pageX: !0, + pageY: !0, + shiftKey: !0, + view: !0, + char: !0, + code: !0, + charCode: !0, + key: !0, + keyCode: !0, + button: !0, + buttons: !0, + clientX: !0, + clientY: !0, + offsetX: !0, + offsetY: !0, + pointerId: !0, + pointerType: !0, + screenX: !0, + screenY: !0, + targetTouches: !0, + toElement: !0, + touches: !0, + which: function (e) { + var t = e.button; + return null == e.which && be.test(e.type) + ? null != e.charCode + ? e.charCode + : e.keyCode + : !e.which && void 0 !== t && we.test(e.type) + ? 1 & t + ? 1 + : 2 & t + ? 3 + : 4 & t + ? 2 + : 0 + : e.which; + }, + }, + S.event.addProp + ), + S.each({ focus: "focusin", blur: "focusout" }, function (e, t) { + S.event.special[e] = { + setup: function () { + return Ae(this, e, Se), !1; + }, + trigger: function () { + return Ae(this, e), !0; + }, + delegateType: t, + }; + }), + S.each( + { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout", + }, + function (e, i) { + S.event.special[e] = { + delegateType: i, + bindType: i, + handle: function (e) { + var t, + n = e.relatedTarget, + r = e.handleObj; + return ( + (n && (n === this || S.contains(this, n))) || + ((e.type = r.origType), + (t = r.handler.apply(this, arguments)), + (e.type = i)), + t + ); + }, + }; + } + ), + S.fn.extend({ + on: function (e, t, n, r) { + return ke(this, e, t, n, r); + }, + one: function (e, t, n, r) { + return ke(this, e, t, n, r, 1); + }, + off: function (e, t, n) { + var r, i; + if (e && e.preventDefault && e.handleObj) + return ( + (r = e.handleObj), + S(e.delegateTarget).off( + r.namespace ? r.origType + "." + r.namespace : r.origType, + r.selector, + r.handler + ), + this + ); + if ("object" == typeof e) { + for (i in e) this.off(i, t, e[i]); + return this; + } + return ( + (!1 !== t && "function" != typeof t) || ((n = t), (t = void 0)), + !1 === n && (n = Ee), + this.each(function () { + S.event.remove(this, e, n, t); + }) + ); + }, + }); + var Ne = /\s*$/g; + function qe(e, t) { + return ( + (A(e, "table") && + A(11 !== t.nodeType ? t : t.firstChild, "tr") && + S(e).children("tbody")[0]) || + e + ); + } + function Le(e) { + return (e.type = (null !== e.getAttribute("type")) + "/" + e.type), e; + } + function He(e) { + return ( + "true/" === (e.type || "").slice(0, 5) + ? (e.type = e.type.slice(5)) + : e.removeAttribute("type"), + e + ); + } + function Oe(e, t) { + var n, r, i, o, a, s; + if (1 === t.nodeType) { + if (Y.hasData(e) && (s = Y.get(e).events)) + for (i in (Y.remove(t, "handle events"), s)) + for (n = 0, r = s[i].length; n < r; n++) S.event.add(t, i, s[i][n]); + Q.hasData(e) && ((o = Q.access(e)), (a = S.extend({}, o)), Q.set(t, a)); + } + } + function Pe(n, r, i, o) { + r = g(r); + var e, + t, + a, + s, + u, + l, + c = 0, + f = n.length, + p = f - 1, + d = r[0], + h = m(d); + if (h || (1 < f && "string" == typeof d && !y.checkClone && De.test(d))) + return n.each(function (e) { + var t = n.eq(e); + h && (r[0] = d.call(this, e, t.html())), Pe(t, r, i, o); + }); + if ( + f && + ((t = (e = xe(r, n[0].ownerDocument, !1, n, o)).firstChild), + 1 === e.childNodes.length && (e = t), + t || o) + ) { + for (s = (a = S.map(ve(e, "script"), Le)).length; c < f; c++) + (u = e), + c !== p && + ((u = S.clone(u, !0, !0)), s && S.merge(a, ve(u, "script"))), + i.call(n[c], u, c); + if (s) + for (l = a[a.length - 1].ownerDocument, S.map(a, He), c = 0; c < s; c++) + (u = a[c]), + he.test(u.type || "") && + !Y.access(u, "globalEval") && + S.contains(l, u) && + (u.src && "module" !== (u.type || "").toLowerCase() + ? S._evalUrl && + !u.noModule && + S._evalUrl( + u.src, + { nonce: u.nonce || u.getAttribute("nonce") }, + l + ) + : b(u.textContent.replace(je, ""), u, l)); + } + return n; + } + function Re(e, t, n) { + for (var r, i = t ? S.filter(t, e) : e, o = 0; null != (r = i[o]); o++) + n || 1 !== r.nodeType || S.cleanData(ve(r)), + r.parentNode && + (n && ie(r) && ye(ve(r, "script")), r.parentNode.removeChild(r)); + return e; + } + S.extend({ + htmlPrefilter: function (e) { + return e; + }, + clone: function (e, t, n) { + var r, + i, + o, + a, + s, + u, + l, + c = e.cloneNode(!0), + f = ie(e); + if ( + !( + y.noCloneChecked || + (1 !== e.nodeType && 11 !== e.nodeType) || + S.isXMLDoc(e) + ) + ) + for (a = ve(c), r = 0, i = (o = ve(e)).length; r < i; r++) + (s = o[r]), + (u = a[r]), + void 0, + "input" === (l = u.nodeName.toLowerCase()) && pe.test(s.type) + ? (u.checked = s.checked) + : ("input" !== l && "textarea" !== l) || + (u.defaultValue = s.defaultValue); + if (t) + if (n) + for (o = o || ve(e), a = a || ve(c), r = 0, i = o.length; r < i; r++) + Oe(o[r], a[r]); + else Oe(e, c); + return ( + 0 < (a = ve(c, "script")).length && ye(a, !f && ve(e, "script")), c + ); + }, + cleanData: function (e) { + for (var t, n, r, i = S.event.special, o = 0; void 0 !== (n = e[o]); o++) + if (V(n)) { + if ((t = n[Y.expando])) { + if (t.events) + for (r in t.events) + i[r] ? S.event.remove(n, r) : S.removeEvent(n, r, t.handle); + n[Y.expando] = void 0; + } + n[Q.expando] && (n[Q.expando] = void 0); + } + }, + }), + S.fn.extend({ + detach: function (e) { + return Re(this, e, !0); + }, + remove: function (e) { + return Re(this, e); + }, + text: function (e) { + return $( + this, + function (e) { + return void 0 === e + ? S.text(this) + : this.empty().each(function () { + (1 !== this.nodeType && + 11 !== this.nodeType && + 9 !== this.nodeType) || + (this.textContent = e); + }); + }, + null, + e, + arguments.length + ); + }, + append: function () { + return Pe(this, arguments, function (e) { + (1 !== this.nodeType && + 11 !== this.nodeType && + 9 !== this.nodeType) || + qe(this, e).appendChild(e); + }); + }, + prepend: function () { + return Pe(this, arguments, function (e) { + if ( + 1 === this.nodeType || + 11 === this.nodeType || + 9 === this.nodeType + ) { + var t = qe(this, e); + t.insertBefore(e, t.firstChild); + } + }); + }, + before: function () { + return Pe(this, arguments, function (e) { + this.parentNode && this.parentNode.insertBefore(e, this); + }); + }, + after: function () { + return Pe(this, arguments, function (e) { + this.parentNode && this.parentNode.insertBefore(e, this.nextSibling); + }); + }, + empty: function () { + for (var e, t = 0; null != (e = this[t]); t++) + 1 === e.nodeType && (S.cleanData(ve(e, !1)), (e.textContent = "")); + return this; + }, + clone: function (e, t) { + return ( + (e = null != e && e), + (t = null == t ? e : t), + this.map(function () { + return S.clone(this, e, t); + }) + ); + }, + html: function (e) { + return $( + this, + function (e) { + var t = this[0] || {}, + n = 0, + r = this.length; + if (void 0 === e && 1 === t.nodeType) return t.innerHTML; + if ( + "string" == typeof e && + !Ne.test(e) && + !ge[(de.exec(e) || ["", ""])[1].toLowerCase()] + ) { + e = S.htmlPrefilter(e); + try { + for (; n < r; n++) + 1 === (t = this[n] || {}).nodeType && + (S.cleanData(ve(t, !1)), (t.innerHTML = e)); + t = 0; + } catch (e) {} + } + t && this.empty().append(e); + }, + null, + e, + arguments.length + ); + }, + replaceWith: function () { + var n = []; + return Pe( + this, + arguments, + function (e) { + var t = this.parentNode; + S.inArray(this, n) < 0 && + (S.cleanData(ve(this)), t && t.replaceChild(e, this)); + }, + n + ); + }, + }), + S.each( + { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith", + }, + function (e, a) { + S.fn[e] = function (e) { + for (var t, n = [], r = S(e), i = r.length - 1, o = 0; o <= i; o++) + (t = o === i ? this : this.clone(!0)), + S(r[o])[a](t), + u.apply(n, t.get()); + return this.pushStack(n); + }; + } + ); + var Me = new RegExp("^(" + ee + ")(?!px)[a-z%]+$", "i"), + Ie = function (e) { + var t = e.ownerDocument.defaultView; + return (t && t.opener) || (t = C), t.getComputedStyle(e); + }, + We = function (e, t, n) { + var r, + i, + o = {}; + for (i in t) (o[i] = e.style[i]), (e.style[i] = t[i]); + for (i in ((r = n.call(e)), t)) e.style[i] = o[i]; + return r; + }, + Fe = new RegExp(ne.join("|"), "i"); + function Be(e, t, n) { + var r, + i, + o, + a, + s = e.style; + return ( + (n = n || Ie(e)) && + ("" !== (a = n.getPropertyValue(t) || n[t]) || + ie(e) || + (a = S.style(e, t)), + !y.pixelBoxStyles() && + Me.test(a) && + Fe.test(t) && + ((r = s.width), + (i = s.minWidth), + (o = s.maxWidth), + (s.minWidth = s.maxWidth = s.width = a), + (a = n.width), + (s.width = r), + (s.minWidth = i), + (s.maxWidth = o))), + void 0 !== a ? a + "" : a + ); + } + function $e(e, t) { + return { + get: function () { + if (!e()) return (this.get = t).apply(this, arguments); + delete this.get; + }, + }; + } + !(function () { + function e() { + if (l) { + (u.style.cssText = + "position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0"), + (l.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%"), + re.appendChild(u).appendChild(l); + var e = C.getComputedStyle(l); + (n = "1%" !== e.top), + (s = 12 === t(e.marginLeft)), + (l.style.right = "60%"), + (o = 36 === t(e.right)), + (r = 36 === t(e.width)), + (l.style.position = "absolute"), + (i = 12 === t(l.offsetWidth / 3)), + re.removeChild(u), + (l = null); + } + } + function t(e) { + return Math.round(parseFloat(e)); + } + var n, + r, + i, + o, + a, + s, + u = E.createElement("div"), + l = E.createElement("div"); + l.style && + ((l.style.backgroundClip = "content-box"), + (l.cloneNode(!0).style.backgroundClip = ""), + (y.clearCloneStyle = "content-box" === l.style.backgroundClip), + S.extend(y, { + boxSizingReliable: function () { + return e(), r; + }, + pixelBoxStyles: function () { + return e(), o; + }, + pixelPosition: function () { + return e(), n; + }, + reliableMarginLeft: function () { + return e(), s; + }, + scrollboxSize: function () { + return e(), i; + }, + reliableTrDimensions: function () { + var e, t, n, r; + return ( + null == a && + ((e = E.createElement("table")), + (t = E.createElement("tr")), + (n = E.createElement("div")), + (e.style.cssText = "position:absolute;left:-11111px"), + (t.style.height = "1px"), + (n.style.height = "9px"), + re.appendChild(e).appendChild(t).appendChild(n), + (r = C.getComputedStyle(t)), + (a = 3 < parseInt(r.height)), + re.removeChild(e)), + a + ); + }, + })); + })(); + var _e = ["Webkit", "Moz", "ms"], + ze = E.createElement("div").style, + Ue = {}; + function Xe(e) { + var t = S.cssProps[e] || Ue[e]; + return ( + t || + (e in ze + ? e + : (Ue[e] = + (function (e) { + var t = e[0].toUpperCase() + e.slice(1), + n = _e.length; + while (n--) if ((e = _e[n] + t) in ze) return e; + })(e) || e)) + ); + } + var Ve = /^(none|table(?!-c[ea]).+)/, + Ge = /^--/, + Ye = { position: "absolute", visibility: "hidden", display: "block" }, + Qe = { letterSpacing: "0", fontWeight: "400" }; + function Je(e, t, n) { + var r = te.exec(t); + return r ? Math.max(0, r[2] - (n || 0)) + (r[3] || "px") : t; + } + function Ke(e, t, n, r, i, o) { + var a = "width" === t ? 1 : 0, + s = 0, + u = 0; + if (n === (r ? "border" : "content")) return 0; + for (; a < 4; a += 2) + "margin" === n && (u += S.css(e, n + ne[a], !0, i)), + r + ? ("content" === n && (u -= S.css(e, "padding" + ne[a], !0, i)), + "margin" !== n && + (u -= S.css(e, "border" + ne[a] + "Width", !0, i))) + : ((u += S.css(e, "padding" + ne[a], !0, i)), + "padding" !== n + ? (u += S.css(e, "border" + ne[a] + "Width", !0, i)) + : (s += S.css(e, "border" + ne[a] + "Width", !0, i))); + return ( + !r && + 0 <= o && + (u += + Math.max( + 0, + Math.ceil( + e["offset" + t[0].toUpperCase() + t.slice(1)] - o - u - s - 0.5 + ) + ) || 0), + u + ); + } + function Ze(e, t, n) { + var r = Ie(e), + i = + (!y.boxSizingReliable() || n) && + "border-box" === S.css(e, "boxSizing", !1, r), + o = i, + a = Be(e, t, r), + s = "offset" + t[0].toUpperCase() + t.slice(1); + if (Me.test(a)) { + if (!n) return a; + a = "auto"; + } + return ( + ((!y.boxSizingReliable() && i) || + (!y.reliableTrDimensions() && A(e, "tr")) || + "auto" === a || + (!parseFloat(a) && "inline" === S.css(e, "display", !1, r))) && + e.getClientRects().length && + ((i = "border-box" === S.css(e, "boxSizing", !1, r)), + (o = s in e) && (a = e[s])), + (a = parseFloat(a) || 0) + + Ke(e, t, n || (i ? "border" : "content"), o, r, a) + + "px" + ); + } + function et(e, t, n, r, i) { + return new et.prototype.init(e, t, n, r, i); + } + S.extend({ + cssHooks: { + opacity: { + get: function (e, t) { + if (t) { + var n = Be(e, "opacity"); + return "" === n ? "1" : n; + } + }, + }, + }, + cssNumber: { + animationIterationCount: !0, + columnCount: !0, + fillOpacity: !0, + flexGrow: !0, + flexShrink: !0, + fontWeight: !0, + gridArea: !0, + gridColumn: !0, + gridColumnEnd: !0, + gridColumnStart: !0, + gridRow: !0, + gridRowEnd: !0, + gridRowStart: !0, + lineHeight: !0, + opacity: !0, + order: !0, + orphans: !0, + widows: !0, + zIndex: !0, + zoom: !0, + }, + cssProps: {}, + style: function (e, t, n, r) { + if (e && 3 !== e.nodeType && 8 !== e.nodeType && e.style) { + var i, + o, + a, + s = X(t), + u = Ge.test(t), + l = e.style; + if ( + (u || (t = Xe(s)), (a = S.cssHooks[t] || S.cssHooks[s]), void 0 === n) + ) + return a && "get" in a && void 0 !== (i = a.get(e, !1, r)) ? i : l[t]; + "string" === (o = typeof n) && + (i = te.exec(n)) && + i[1] && + ((n = se(e, t, i)), (o = "number")), + null != n && + n == n && + ("number" !== o || + u || + (n += (i && i[3]) || (S.cssNumber[s] ? "" : "px")), + y.clearCloneStyle || + "" !== n || + 0 !== t.indexOf("background") || + (l[t] = "inherit"), + (a && "set" in a && void 0 === (n = a.set(e, n, r))) || + (u ? l.setProperty(t, n) : (l[t] = n))); + } + }, + css: function (e, t, n, r) { + var i, + o, + a, + s = X(t); + return ( + Ge.test(t) || (t = Xe(s)), + (a = S.cssHooks[t] || S.cssHooks[s]) && + "get" in a && + (i = a.get(e, !0, n)), + void 0 === i && (i = Be(e, t, r)), + "normal" === i && t in Qe && (i = Qe[t]), + "" === n || n + ? ((o = parseFloat(i)), !0 === n || isFinite(o) ? o || 0 : i) + : i + ); + }, + }), + S.each(["height", "width"], function (e, u) { + S.cssHooks[u] = { + get: function (e, t, n) { + if (t) + return !Ve.test(S.css(e, "display")) || + (e.getClientRects().length && e.getBoundingClientRect().width) + ? Ze(e, u, n) + : We(e, Ye, function () { + return Ze(e, u, n); + }); + }, + set: function (e, t, n) { + var r, + i = Ie(e), + o = !y.scrollboxSize() && "absolute" === i.position, + a = (o || n) && "border-box" === S.css(e, "boxSizing", !1, i), + s = n ? Ke(e, u, n, a, i) : 0; + return ( + a && + o && + (s -= Math.ceil( + e["offset" + u[0].toUpperCase() + u.slice(1)] - + parseFloat(i[u]) - + Ke(e, u, "border", !1, i) - + 0.5 + )), + s && + (r = te.exec(t)) && + "px" !== (r[3] || "px") && + ((e.style[u] = t), (t = S.css(e, u))), + Je(0, t, s) + ); + }, + }; + }), + (S.cssHooks.marginLeft = $e(y.reliableMarginLeft, function (e, t) { + if (t) + return ( + (parseFloat(Be(e, "marginLeft")) || + e.getBoundingClientRect().left - + We(e, { marginLeft: 0 }, function () { + return e.getBoundingClientRect().left; + })) + "px" + ); + })), + S.each({ margin: "", padding: "", border: "Width" }, function (i, o) { + (S.cssHooks[i + o] = { + expand: function (e) { + for ( + var t = 0, n = {}, r = "string" == typeof e ? e.split(" ") : [e]; + t < 4; + t++ + ) + n[i + ne[t] + o] = r[t] || r[t - 2] || r[0]; + return n; + }, + }), + "margin" !== i && (S.cssHooks[i + o].set = Je); + }), + S.fn.extend({ + css: function (e, t) { + return $( + this, + function (e, t, n) { + var r, + i, + o = {}, + a = 0; + if (Array.isArray(t)) { + for (r = Ie(e), i = t.length; a < i; a++) + o[t[a]] = S.css(e, t[a], !1, r); + return o; + } + return void 0 !== n ? S.style(e, t, n) : S.css(e, t); + }, + e, + t, + 1 < arguments.length + ); + }, + }), + (((S.Tween = et).prototype = { + constructor: et, + init: function (e, t, n, r, i, o) { + (this.elem = e), + (this.prop = n), + (this.easing = i || S.easing._default), + (this.options = t), + (this.start = this.now = this.cur()), + (this.end = r), + (this.unit = o || (S.cssNumber[n] ? "" : "px")); + }, + cur: function () { + var e = et.propHooks[this.prop]; + return e && e.get ? e.get(this) : et.propHooks._default.get(this); + }, + run: function (e) { + var t, + n = et.propHooks[this.prop]; + return ( + this.options.duration + ? (this.pos = t = S.easing[this.easing]( + e, + this.options.duration * e, + 0, + 1, + this.options.duration + )) + : (this.pos = t = e), + (this.now = (this.end - this.start) * t + this.start), + this.options.step && + this.options.step.call(this.elem, this.now, this), + n && n.set ? n.set(this) : et.propHooks._default.set(this), + this + ); + }, + }).init.prototype = et.prototype), + ((et.propHooks = { + _default: { + get: function (e) { + var t; + return 1 !== e.elem.nodeType || + (null != e.elem[e.prop] && null == e.elem.style[e.prop]) + ? e.elem[e.prop] + : (t = S.css(e.elem, e.prop, "")) && "auto" !== t + ? t + : 0; + }, + set: function (e) { + S.fx.step[e.prop] + ? S.fx.step[e.prop](e) + : 1 !== e.elem.nodeType || + (!S.cssHooks[e.prop] && null == e.elem.style[Xe(e.prop)]) + ? (e.elem[e.prop] = e.now) + : S.style(e.elem, e.prop, e.now + e.unit); + }, + }, + }).scrollTop = et.propHooks.scrollLeft = { + set: function (e) { + e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now); + }, + }), + (S.easing = { + linear: function (e) { + return e; + }, + swing: function (e) { + return 0.5 - Math.cos(e * Math.PI) / 2; + }, + _default: "swing", + }), + (S.fx = et.prototype.init), + (S.fx.step = {}); + var tt, + nt, + rt, + it, + ot = /^(?:toggle|show|hide)$/, + at = /queueHooks$/; + function st() { + nt && + (!1 === E.hidden && C.requestAnimationFrame + ? C.requestAnimationFrame(st) + : C.setTimeout(st, S.fx.interval), + S.fx.tick()); + } + function ut() { + return ( + C.setTimeout(function () { + tt = void 0; + }), + (tt = Date.now()) + ); + } + function lt(e, t) { + var n, + r = 0, + i = { height: e }; + for (t = t ? 1 : 0; r < 4; r += 2 - t) + i["margin" + (n = ne[r])] = i["padding" + n] = e; + return t && (i.opacity = i.width = e), i; + } + function ct(e, t, n) { + for ( + var r, + i = (ft.tweeners[t] || []).concat(ft.tweeners["*"]), + o = 0, + a = i.length; + o < a; + o++ + ) + if ((r = i[o].call(n, t, e))) return r; + } + function ft(o, e, t) { + var n, + a, + r = 0, + i = ft.prefilters.length, + s = S.Deferred().always(function () { + delete u.elem; + }), + u = function () { + if (a) return !1; + for ( + var e = tt || ut(), + t = Math.max(0, l.startTime + l.duration - e), + n = 1 - (t / l.duration || 0), + r = 0, + i = l.tweens.length; + r < i; + r++ + ) + l.tweens[r].run(n); + return ( + s.notifyWith(o, [l, n, t]), + n < 1 && i + ? t + : (i || s.notifyWith(o, [l, 1, 0]), s.resolveWith(o, [l]), !1) + ); + }, + l = s.promise({ + elem: o, + props: S.extend({}, e), + opts: S.extend(!0, { specialEasing: {}, easing: S.easing._default }, t), + originalProperties: e, + originalOptions: t, + startTime: tt || ut(), + duration: t.duration, + tweens: [], + createTween: function (e, t) { + var n = S.Tween( + o, + l.opts, + e, + t, + l.opts.specialEasing[e] || l.opts.easing + ); + return l.tweens.push(n), n; + }, + stop: function (e) { + var t = 0, + n = e ? l.tweens.length : 0; + if (a) return this; + for (a = !0; t < n; t++) l.tweens[t].run(1); + return ( + e + ? (s.notifyWith(o, [l, 1, 0]), s.resolveWith(o, [l, e])) + : s.rejectWith(o, [l, e]), + this + ); + }, + }), + c = l.props; + for ( + !(function (e, t) { + var n, r, i, o, a; + for (n in e) + if ( + ((i = t[(r = X(n))]), + (o = e[n]), + Array.isArray(o) && ((i = o[1]), (o = e[n] = o[0])), + n !== r && ((e[r] = o), delete e[n]), + (a = S.cssHooks[r]) && ("expand" in a)) + ) + for (n in ((o = a.expand(o)), delete e[r], o)) + (n in e) || ((e[n] = o[n]), (t[n] = i)); + else t[r] = i; + })(c, l.opts.specialEasing); + r < i; + r++ + ) + if ((n = ft.prefilters[r].call(l, o, c, l.opts))) + return ( + m(n.stop) && + (S._queueHooks(l.elem, l.opts.queue).stop = n.stop.bind(n)), + n + ); + return ( + S.map(c, ct, l), + m(l.opts.start) && l.opts.start.call(o, l), + l + .progress(l.opts.progress) + .done(l.opts.done, l.opts.complete) + .fail(l.opts.fail) + .always(l.opts.always), + S.fx.timer(S.extend(u, { elem: o, anim: l, queue: l.opts.queue })), + l + ); + } + (S.Animation = S.extend(ft, { + tweeners: { + "*": [ + function (e, t) { + var n = this.createTween(e, t); + return se(n.elem, e, te.exec(t), n), n; + }, + ], + }, + tweener: function (e, t) { + m(e) ? ((t = e), (e = ["*"])) : (e = e.match(P)); + for (var n, r = 0, i = e.length; r < i; r++) + (n = e[r]), + (ft.tweeners[n] = ft.tweeners[n] || []), + ft.tweeners[n].unshift(t); + }, + prefilters: [ + function (e, t, n) { + var r, + i, + o, + a, + s, + u, + l, + c, + f = "width" in t || "height" in t, + p = this, + d = {}, + h = e.style, + g = e.nodeType && ae(e), + v = Y.get(e, "fxshow"); + for (r in (n.queue || + (null == (a = S._queueHooks(e, "fx")).unqueued && + ((a.unqueued = 0), + (s = a.empty.fire), + (a.empty.fire = function () { + a.unqueued || s(); + })), + a.unqueued++, + p.always(function () { + p.always(function () { + a.unqueued--, S.queue(e, "fx").length || a.empty.fire(); + }); + })), + t)) + if (((i = t[r]), ot.test(i))) { + if ( + (delete t[r], + (o = o || "toggle" === i), + i === (g ? "hide" : "show")) + ) { + if ("show" !== i || !v || void 0 === v[r]) continue; + g = !0; + } + d[r] = (v && v[r]) || S.style(e, r); + } + if ((u = !S.isEmptyObject(t)) || !S.isEmptyObject(d)) + for (r in (f && + 1 === e.nodeType && + ((n.overflow = [h.overflow, h.overflowX, h.overflowY]), + null == (l = v && v.display) && (l = Y.get(e, "display")), + "none" === (c = S.css(e, "display")) && + (l + ? (c = l) + : (le([e], !0), + (l = e.style.display || l), + (c = S.css(e, "display")), + le([e]))), + ("inline" === c || ("inline-block" === c && null != l)) && + "none" === S.css(e, "float") && + (u || + (p.done(function () { + h.display = l; + }), + null == l && ((c = h.display), (l = "none" === c ? "" : c))), + (h.display = "inline-block"))), + n.overflow && + ((h.overflow = "hidden"), + p.always(function () { + (h.overflow = n.overflow[0]), + (h.overflowX = n.overflow[1]), + (h.overflowY = n.overflow[2]); + })), + (u = !1), + d)) + u || + (v + ? "hidden" in v && (g = v.hidden) + : (v = Y.access(e, "fxshow", { display: l })), + o && (v.hidden = !g), + g && le([e], !0), + p.done(function () { + for (r in (g || le([e]), Y.remove(e, "fxshow"), d)) + S.style(e, r, d[r]); + })), + (u = ct(g ? v[r] : 0, r, p)), + r in v || + ((v[r] = u.start), g && ((u.end = u.start), (u.start = 0))); + }, + ], + prefilter: function (e, t) { + t ? ft.prefilters.unshift(e) : ft.prefilters.push(e); + }, + })), + (S.speed = function (e, t, n) { + var r = + e && "object" == typeof e + ? S.extend({}, e) + : { + complete: n || (!n && t) || (m(e) && e), + duration: e, + easing: (n && t) || (t && !m(t) && t), + }; + return ( + S.fx.off + ? (r.duration = 0) + : "number" != typeof r.duration && + (r.duration in S.fx.speeds + ? (r.duration = S.fx.speeds[r.duration]) + : (r.duration = S.fx.speeds._default)), + (null != r.queue && !0 !== r.queue) || (r.queue = "fx"), + (r.old = r.complete), + (r.complete = function () { + m(r.old) && r.old.call(this), r.queue && S.dequeue(this, r.queue); + }), + r + ); + }), + S.fn.extend({ + fadeTo: function (e, t, n, r) { + return this.filter(ae) + .css("opacity", 0) + .show() + .end() + .animate({ opacity: t }, e, n, r); + }, + animate: function (t, e, n, r) { + var i = S.isEmptyObject(t), + o = S.speed(e, n, r), + a = function () { + var e = ft(this, S.extend({}, t), o); + (i || Y.get(this, "finish")) && e.stop(!0); + }; + return ( + (a.finish = a), + i || !1 === o.queue ? this.each(a) : this.queue(o.queue, a) + ); + }, + stop: function (i, e, o) { + var a = function (e) { + var t = e.stop; + delete e.stop, t(o); + }; + return ( + "string" != typeof i && ((o = e), (e = i), (i = void 0)), + e && this.queue(i || "fx", []), + this.each(function () { + var e = !0, + t = null != i && i + "queueHooks", + n = S.timers, + r = Y.get(this); + if (t) r[t] && r[t].stop && a(r[t]); + else for (t in r) r[t] && r[t].stop && at.test(t) && a(r[t]); + for (t = n.length; t--; ) + n[t].elem !== this || + (null != i && n[t].queue !== i) || + (n[t].anim.stop(o), (e = !1), n.splice(t, 1)); + (!e && o) || S.dequeue(this, i); + }) + ); + }, + finish: function (a) { + return ( + !1 !== a && (a = a || "fx"), + this.each(function () { + var e, + t = Y.get(this), + n = t[a + "queue"], + r = t[a + "queueHooks"], + i = S.timers, + o = n ? n.length : 0; + for ( + t.finish = !0, + S.queue(this, a, []), + r && r.stop && r.stop.call(this, !0), + e = i.length; + e--; + + ) + i[e].elem === this && + i[e].queue === a && + (i[e].anim.stop(!0), i.splice(e, 1)); + for (e = 0; e < o; e++) + n[e] && n[e].finish && n[e].finish.call(this); + delete t.finish; + }) + ); + }, + }), + S.each(["toggle", "show", "hide"], function (e, r) { + var i = S.fn[r]; + S.fn[r] = function (e, t, n) { + return null == e || "boolean" == typeof e + ? i.apply(this, arguments) + : this.animate(lt(r, !0), e, t, n); + }; + }), + S.each( + { + slideDown: lt("show"), + slideUp: lt("hide"), + slideToggle: lt("toggle"), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" }, + }, + function (e, r) { + S.fn[e] = function (e, t, n) { + return this.animate(r, e, t, n); + }; + } + ), + (S.timers = []), + (S.fx.tick = function () { + var e, + t = 0, + n = S.timers; + for (tt = Date.now(); t < n.length; t++) + (e = n[t])() || n[t] !== e || n.splice(t--, 1); + n.length || S.fx.stop(), (tt = void 0); + }), + (S.fx.timer = function (e) { + S.timers.push(e), S.fx.start(); + }), + (S.fx.interval = 13), + (S.fx.start = function () { + nt || ((nt = !0), st()); + }), + (S.fx.stop = function () { + nt = null; + }), + (S.fx.speeds = { slow: 600, fast: 200, _default: 400 }), + (S.fn.delay = function (r, e) { + return ( + (r = (S.fx && S.fx.speeds[r]) || r), + (e = e || "fx"), + this.queue(e, function (e, t) { + var n = C.setTimeout(e, r); + t.stop = function () { + C.clearTimeout(n); + }; + }) + ); + }), + (rt = E.createElement("input")), + (it = E.createElement("select").appendChild(E.createElement("option"))), + (rt.type = "checkbox"), + (y.checkOn = "" !== rt.value), + (y.optSelected = it.selected), + ((rt = E.createElement("input")).value = "t"), + (rt.type = "radio"), + (y.radioValue = "t" === rt.value); + var pt, + dt = S.expr.attrHandle; + S.fn.extend({ + attr: function (e, t) { + return $(this, S.attr, e, t, 1 < arguments.length); + }, + removeAttr: function (e) { + return this.each(function () { + S.removeAttr(this, e); + }); + }, + }), + S.extend({ + attr: function (e, t, n) { + var r, + i, + o = e.nodeType; + if (3 !== o && 8 !== o && 2 !== o) + return "undefined" == typeof e.getAttribute + ? S.prop(e, t, n) + : ((1 === o && S.isXMLDoc(e)) || + (i = + S.attrHooks[t.toLowerCase()] || + (S.expr.match.bool.test(t) ? pt : void 0)), + void 0 !== n + ? null === n + ? void S.removeAttr(e, t) + : i && "set" in i && void 0 !== (r = i.set(e, n, t)) + ? r + : (e.setAttribute(t, n + ""), n) + : i && "get" in i && null !== (r = i.get(e, t)) + ? r + : null == (r = S.find.attr(e, t)) + ? void 0 + : r); + }, + attrHooks: { + type: { + set: function (e, t) { + if (!y.radioValue && "radio" === t && A(e, "input")) { + var n = e.value; + return e.setAttribute("type", t), n && (e.value = n), t; + } + }, + }, + }, + removeAttr: function (e, t) { + var n, + r = 0, + i = t && t.match(P); + if (i && 1 === e.nodeType) while ((n = i[r++])) e.removeAttribute(n); + }, + }), + (pt = { + set: function (e, t, n) { + return !1 === t ? S.removeAttr(e, n) : e.setAttribute(n, n), n; + }, + }), + S.each(S.expr.match.bool.source.match(/\w+/g), function (e, t) { + var a = dt[t] || S.find.attr; + dt[t] = function (e, t, n) { + var r, + i, + o = t.toLowerCase(); + return ( + n || + ((i = dt[o]), + (dt[o] = r), + (r = null != a(e, t, n) ? o : null), + (dt[o] = i)), + r + ); + }; + }); + var ht = /^(?:input|select|textarea|button)$/i, + gt = /^(?:a|area)$/i; + function vt(e) { + return (e.match(P) || []).join(" "); + } + function yt(e) { + return (e.getAttribute && e.getAttribute("class")) || ""; + } + function mt(e) { + return Array.isArray(e) ? e : ("string" == typeof e && e.match(P)) || []; + } + S.fn.extend({ + prop: function (e, t) { + return $(this, S.prop, e, t, 1 < arguments.length); + }, + removeProp: function (e) { + return this.each(function () { + delete this[S.propFix[e] || e]; + }); + }, + }), + S.extend({ + prop: function (e, t, n) { + var r, + i, + o = e.nodeType; + if (3 !== o && 8 !== o && 2 !== o) + return ( + (1 === o && S.isXMLDoc(e)) || + ((t = S.propFix[t] || t), (i = S.propHooks[t])), + void 0 !== n + ? i && "set" in i && void 0 !== (r = i.set(e, n, t)) + ? r + : (e[t] = n) + : i && "get" in i && null !== (r = i.get(e, t)) + ? r + : e[t] + ); + }, + propHooks: { + tabIndex: { + get: function (e) { + var t = S.find.attr(e, "tabindex"); + return t + ? parseInt(t, 10) + : ht.test(e.nodeName) || (gt.test(e.nodeName) && e.href) + ? 0 + : -1; + }, + }, + }, + propFix: { for: "htmlFor", class: "className" }, + }), + y.optSelected || + (S.propHooks.selected = { + get: function (e) { + var t = e.parentNode; + return t && t.parentNode && t.parentNode.selectedIndex, null; + }, + set: function (e) { + var t = e.parentNode; + t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex); + }, + }), + S.each( + [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable", + ], + function () { + S.propFix[this.toLowerCase()] = this; + } + ), + S.fn.extend({ + addClass: function (t) { + var e, + n, + r, + i, + o, + a, + s, + u = 0; + if (m(t)) + return this.each(function (e) { + S(this).addClass(t.call(this, e, yt(this))); + }); + if ((e = mt(t)).length) + while ((n = this[u++])) + if (((i = yt(n)), (r = 1 === n.nodeType && " " + vt(i) + " "))) { + a = 0; + while ((o = e[a++])) + r.indexOf(" " + o + " ") < 0 && (r += o + " "); + i !== (s = vt(r)) && n.setAttribute("class", s); + } + return this; + }, + removeClass: function (t) { + var e, + n, + r, + i, + o, + a, + s, + u = 0; + if (m(t)) + return this.each(function (e) { + S(this).removeClass(t.call(this, e, yt(this))); + }); + if (!arguments.length) return this.attr("class", ""); + if ((e = mt(t)).length) + while ((n = this[u++])) + if (((i = yt(n)), (r = 1 === n.nodeType && " " + vt(i) + " "))) { + a = 0; + while ((o = e[a++])) + while (-1 < r.indexOf(" " + o + " ")) + r = r.replace(" " + o + " ", " "); + i !== (s = vt(r)) && n.setAttribute("class", s); + } + return this; + }, + toggleClass: function (i, t) { + var o = typeof i, + a = "string" === o || Array.isArray(i); + return "boolean" == typeof t && a + ? t + ? this.addClass(i) + : this.removeClass(i) + : m(i) + ? this.each(function (e) { + S(this).toggleClass(i.call(this, e, yt(this), t), t); + }) + : this.each(function () { + var e, t, n, r; + if (a) { + (t = 0), (n = S(this)), (r = mt(i)); + while ((e = r[t++])) + n.hasClass(e) ? n.removeClass(e) : n.addClass(e); + } else (void 0 !== i && "boolean" !== o) || ((e = yt(this)) && Y.set(this, "__className__", e), this.setAttribute && this.setAttribute("class", e || !1 === i ? "" : Y.get(this, "__className__") || "")); + }); + }, + hasClass: function (e) { + var t, + n, + r = 0; + t = " " + e + " "; + while ((n = this[r++])) + if (1 === n.nodeType && -1 < (" " + vt(yt(n)) + " ").indexOf(t)) + return !0; + return !1; + }, + }); + var xt = /\r/g; + S.fn.extend({ + val: function (n) { + var r, + e, + i, + t = this[0]; + return arguments.length + ? ((i = m(n)), + this.each(function (e) { + var t; + 1 === this.nodeType && + (null == (t = i ? n.call(this, e, S(this).val()) : n) + ? (t = "") + : "number" == typeof t + ? (t += "") + : Array.isArray(t) && + (t = S.map(t, function (e) { + return null == e ? "" : e + ""; + })), + ((r = + S.valHooks[this.type] || + S.valHooks[this.nodeName.toLowerCase()]) && + "set" in r && + void 0 !== r.set(this, t, "value")) || + (this.value = t)); + })) + : t + ? (r = S.valHooks[t.type] || S.valHooks[t.nodeName.toLowerCase()]) && + "get" in r && + void 0 !== (e = r.get(t, "value")) + ? e + : "string" == typeof (e = t.value) + ? e.replace(xt, "") + : null == e + ? "" + : e + : void 0; + }, + }), + S.extend({ + valHooks: { + option: { + get: function (e) { + var t = S.find.attr(e, "value"); + return null != t ? t : vt(S.text(e)); + }, + }, + select: { + get: function (e) { + var t, + n, + r, + i = e.options, + o = e.selectedIndex, + a = "select-one" === e.type, + s = a ? null : [], + u = a ? o + 1 : i.length; + for (r = o < 0 ? u : a ? o : 0; r < u; r++) + if ( + ((n = i[r]).selected || r === o) && + !n.disabled && + (!n.parentNode.disabled || !A(n.parentNode, "optgroup")) + ) { + if (((t = S(n).val()), a)) return t; + s.push(t); + } + return s; + }, + set: function (e, t) { + var n, + r, + i = e.options, + o = S.makeArray(t), + a = i.length; + while (a--) + ((r = i[a]).selected = + -1 < S.inArray(S.valHooks.option.get(r), o)) && (n = !0); + return n || (e.selectedIndex = -1), o; + }, + }, + }, + }), + S.each(["radio", "checkbox"], function () { + (S.valHooks[this] = { + set: function (e, t) { + if (Array.isArray(t)) + return (e.checked = -1 < S.inArray(S(e).val(), t)); + }, + }), + y.checkOn || + (S.valHooks[this].get = function (e) { + return null === e.getAttribute("value") ? "on" : e.value; + }); + }), + (y.focusin = "onfocusin" in C); + var bt = /^(?:focusinfocus|focusoutblur)$/, + wt = function (e) { + e.stopPropagation(); + }; + S.extend(S.event, { + trigger: function (e, t, n, r) { + var i, + o, + a, + s, + u, + l, + c, + f, + p = [n || E], + d = v.call(e, "type") ? e.type : e, + h = v.call(e, "namespace") ? e.namespace.split(".") : []; + if ( + ((o = f = a = n = n || E), + 3 !== n.nodeType && + 8 !== n.nodeType && + !bt.test(d + S.event.triggered) && + (-1 < d.indexOf(".") && ((d = (h = d.split(".")).shift()), h.sort()), + (u = d.indexOf(":") < 0 && "on" + d), + ((e = e[S.expando] + ? e + : new S.Event(d, "object" == typeof e && e)).isTrigger = r ? 2 : 3), + (e.namespace = h.join(".")), + (e.rnamespace = e.namespace + ? new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)") + : null), + (e.result = void 0), + e.target || (e.target = n), + (t = null == t ? [e] : S.makeArray(t, [e])), + (c = S.event.special[d] || {}), + r || !c.trigger || !1 !== c.trigger.apply(n, t))) + ) { + if (!r && !c.noBubble && !x(n)) { + for ( + s = c.delegateType || d, bt.test(s + d) || (o = o.parentNode); + o; + o = o.parentNode + ) + p.push(o), (a = o); + a === (n.ownerDocument || E) && + p.push(a.defaultView || a.parentWindow || C); + } + i = 0; + while ((o = p[i++]) && !e.isPropagationStopped()) + (f = o), + (e.type = 1 < i ? s : c.bindType || d), + (l = + (Y.get(o, "events") || Object.create(null))[e.type] && + Y.get(o, "handle")) && l.apply(o, t), + (l = u && o[u]) && + l.apply && + V(o) && + ((e.result = l.apply(o, t)), + !1 === e.result && e.preventDefault()); + return ( + (e.type = d), + r || + e.isDefaultPrevented() || + (c._default && !1 !== c._default.apply(p.pop(), t)) || + !V(n) || + (u && + m(n[d]) && + !x(n) && + ((a = n[u]) && (n[u] = null), + (S.event.triggered = d), + e.isPropagationStopped() && f.addEventListener(d, wt), + n[d](), + e.isPropagationStopped() && f.removeEventListener(d, wt), + (S.event.triggered = void 0), + a && (n[u] = a))), + e.result + ); + } + }, + simulate: function (e, t, n) { + var r = S.extend(new S.Event(), n, { type: e, isSimulated: !0 }); + S.event.trigger(r, null, t); + }, + }), + S.fn.extend({ + trigger: function (e, t) { + return this.each(function () { + S.event.trigger(e, t, this); + }); + }, + triggerHandler: function (e, t) { + var n = this[0]; + if (n) return S.event.trigger(e, t, n, !0); + }, + }), + y.focusin || + S.each({ focus: "focusin", blur: "focusout" }, function (n, r) { + var i = function (e) { + S.event.simulate(r, e.target, S.event.fix(e)); + }; + S.event.special[r] = { + setup: function () { + var e = this.ownerDocument || this.document || this, + t = Y.access(e, r); + t || e.addEventListener(n, i, !0), Y.access(e, r, (t || 0) + 1); + }, + teardown: function () { + var e = this.ownerDocument || this.document || this, + t = Y.access(e, r) - 1; + t + ? Y.access(e, r, t) + : (e.removeEventListener(n, i, !0), Y.remove(e, r)); + }, + }; + }); + var Tt = C.location, + Ct = { guid: Date.now() }, + Et = /\?/; + S.parseXML = function (e) { + var t; + if (!e || "string" != typeof e) return null; + try { + t = new C.DOMParser().parseFromString(e, "text/xml"); + } catch (e) { + t = void 0; + } + return ( + (t && !t.getElementsByTagName("parsererror").length) || + S.error("Invalid XML: " + e), + t + ); + }; + var St = /\[\]$/, + kt = /\r?\n/g, + At = /^(?:submit|button|image|reset|file)$/i, + Nt = /^(?:input|select|textarea|keygen)/i; + function Dt(n, e, r, i) { + var t; + if (Array.isArray(e)) + S.each(e, function (e, t) { + r || St.test(n) + ? i(n, t) + : Dt( + n + "[" + ("object" == typeof t && null != t ? e : "") + "]", + t, + r, + i + ); + }); + else if (r || "object" !== w(e)) i(n, e); + else for (t in e) Dt(n + "[" + t + "]", e[t], r, i); + } + (S.param = function (e, t) { + var n, + r = [], + i = function (e, t) { + var n = m(t) ? t() : t; + r[r.length] = + encodeURIComponent(e) + "=" + encodeURIComponent(null == n ? "" : n); + }; + if (null == e) return ""; + if (Array.isArray(e) || (e.jquery && !S.isPlainObject(e))) + S.each(e, function () { + i(this.name, this.value); + }); + else for (n in e) Dt(n, e[n], t, i); + return r.join("&"); + }), + S.fn.extend({ + serialize: function () { + return S.param(this.serializeArray()); + }, + serializeArray: function () { + return this.map(function () { + var e = S.prop(this, "elements"); + return e ? S.makeArray(e) : this; + }) + .filter(function () { + var e = this.type; + return ( + this.name && + !S(this).is(":disabled") && + Nt.test(this.nodeName) && + !At.test(e) && + (this.checked || !pe.test(e)) + ); + }) + .map(function (e, t) { + var n = S(this).val(); + return null == n + ? null + : Array.isArray(n) + ? S.map(n, function (e) { + return { name: t.name, value: e.replace(kt, "\r\n") }; + }) + : { name: t.name, value: n.replace(kt, "\r\n") }; + }) + .get(); + }, + }); + var jt = /%20/g, + qt = /#.*$/, + Lt = /([?&])_=[^&]*/, + Ht = /^(.*?):[ \t]*([^\r\n]*)$/gm, + Ot = /^(?:GET|HEAD)$/, + Pt = /^\/\//, + Rt = {}, + Mt = {}, + It = "*/".concat("*"), + Wt = E.createElement("a"); + function Ft(o) { + return function (e, t) { + "string" != typeof e && ((t = e), (e = "*")); + var n, + r = 0, + i = e.toLowerCase().match(P) || []; + if (m(t)) + while ((n = i[r++])) + "+" === n[0] + ? ((n = n.slice(1) || "*"), (o[n] = o[n] || []).unshift(t)) + : (o[n] = o[n] || []).push(t); + }; + } + function Bt(t, i, o, a) { + var s = {}, + u = t === Mt; + function l(e) { + var r; + return ( + (s[e] = !0), + S.each(t[e] || [], function (e, t) { + var n = t(i, o, a); + return "string" != typeof n || u || s[n] + ? u + ? !(r = n) + : void 0 + : (i.dataTypes.unshift(n), l(n), !1); + }), + r + ); + } + return l(i.dataTypes[0]) || (!s["*"] && l("*")); + } + function $t(e, t) { + var n, + r, + i = S.ajaxSettings.flatOptions || {}; + for (n in t) void 0 !== t[n] && ((i[n] ? e : r || (r = {}))[n] = t[n]); + return r && S.extend(!0, e, r), e; + } + (Wt.href = Tt.href), + S.extend({ + active: 0, + lastModified: {}, + etag: {}, + ajaxSettings: { + url: Tt.href, + type: "GET", + isLocal: /^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test( + Tt.protocol + ), + global: !0, + processData: !0, + async: !0, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + accepts: { + "*": It, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript", + }, + contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON", + }, + converters: { + "* text": String, + "text html": !0, + "text json": JSON.parse, + "text xml": S.parseXML, + }, + flatOptions: { url: !0, context: !0 }, + }, + ajaxSetup: function (e, t) { + return t ? $t($t(e, S.ajaxSettings), t) : $t(S.ajaxSettings, e); + }, + ajaxPrefilter: Ft(Rt), + ajaxTransport: Ft(Mt), + ajax: function (e, t) { + "object" == typeof e && ((t = e), (e = void 0)), (t = t || {}); + var c, + f, + p, + n, + d, + r, + h, + g, + i, + o, + v = S.ajaxSetup({}, t), + y = v.context || v, + m = v.context && (y.nodeType || y.jquery) ? S(y) : S.event, + x = S.Deferred(), + b = S.Callbacks("once memory"), + w = v.statusCode || {}, + a = {}, + s = {}, + u = "canceled", + T = { + readyState: 0, + getResponseHeader: function (e) { + var t; + if (h) { + if (!n) { + n = {}; + while ((t = Ht.exec(p))) + n[t[1].toLowerCase() + " "] = ( + n[t[1].toLowerCase() + " "] || [] + ).concat(t[2]); + } + t = n[e.toLowerCase() + " "]; + } + return null == t ? null : t.join(", "); + }, + getAllResponseHeaders: function () { + return h ? p : null; + }, + setRequestHeader: function (e, t) { + return ( + null == h && + ((e = s[e.toLowerCase()] = s[e.toLowerCase()] || e), + (a[e] = t)), + this + ); + }, + overrideMimeType: function (e) { + return null == h && (v.mimeType = e), this; + }, + statusCode: function (e) { + var t; + if (e) + if (h) T.always(e[T.status]); + else for (t in e) w[t] = [w[t], e[t]]; + return this; + }, + abort: function (e) { + var t = e || u; + return c && c.abort(t), l(0, t), this; + }, + }; + if ( + (x.promise(T), + (v.url = ((e || v.url || Tt.href) + "").replace( + Pt, + Tt.protocol + "//" + )), + (v.type = t.method || t.type || v.method || v.type), + (v.dataTypes = (v.dataType || "*").toLowerCase().match(P) || [""]), + null == v.crossDomain) + ) { + r = E.createElement("a"); + try { + (r.href = v.url), + (r.href = r.href), + (v.crossDomain = + Wt.protocol + "//" + Wt.host != r.protocol + "//" + r.host); + } catch (e) { + v.crossDomain = !0; + } + } + if ( + (v.data && + v.processData && + "string" != typeof v.data && + (v.data = S.param(v.data, v.traditional)), + Bt(Rt, v, t, T), + h) + ) + return T; + for (i in ((g = S.event && v.global) && + 0 == S.active++ && + S.event.trigger("ajaxStart"), + (v.type = v.type.toUpperCase()), + (v.hasContent = !Ot.test(v.type)), + (f = v.url.replace(qt, "")), + v.hasContent + ? v.data && + v.processData && + 0 === + (v.contentType || "").indexOf( + "application/x-www-form-urlencoded" + ) && + (v.data = v.data.replace(jt, "+")) + : ((o = v.url.slice(f.length)), + v.data && + (v.processData || "string" == typeof v.data) && + ((f += (Et.test(f) ? "&" : "?") + v.data), delete v.data), + !1 === v.cache && + ((f = f.replace(Lt, "$1")), + (o = (Et.test(f) ? "&" : "?") + "_=" + Ct.guid++ + o)), + (v.url = f + o)), + v.ifModified && + (S.lastModified[f] && + T.setRequestHeader("If-Modified-Since", S.lastModified[f]), + S.etag[f] && T.setRequestHeader("If-None-Match", S.etag[f])), + ((v.data && v.hasContent && !1 !== v.contentType) || t.contentType) && + T.setRequestHeader("Content-Type", v.contentType), + T.setRequestHeader( + "Accept", + v.dataTypes[0] && v.accepts[v.dataTypes[0]] + ? v.accepts[v.dataTypes[0]] + + ("*" !== v.dataTypes[0] ? ", " + It + "; q=0.01" : "") + : v.accepts["*"] + ), + v.headers)) + T.setRequestHeader(i, v.headers[i]); + if (v.beforeSend && (!1 === v.beforeSend.call(y, T, v) || h)) + return T.abort(); + if ( + ((u = "abort"), + b.add(v.complete), + T.done(v.success), + T.fail(v.error), + (c = Bt(Mt, v, t, T))) + ) { + if (((T.readyState = 1), g && m.trigger("ajaxSend", [T, v]), h)) + return T; + v.async && + 0 < v.timeout && + (d = C.setTimeout(function () { + T.abort("timeout"); + }, v.timeout)); + try { + (h = !1), c.send(a, l); + } catch (e) { + if (h) throw e; + l(-1, e); + } + } else l(-1, "No Transport"); + function l(e, t, n, r) { + var i, + o, + a, + s, + u, + l = t; + h || + ((h = !0), + d && C.clearTimeout(d), + (c = void 0), + (p = r || ""), + (T.readyState = 0 < e ? 4 : 0), + (i = (200 <= e && e < 300) || 304 === e), + n && + (s = (function (e, t, n) { + var r, + i, + o, + a, + s = e.contents, + u = e.dataTypes; + while ("*" === u[0]) + u.shift(), + void 0 === r && + (r = e.mimeType || t.getResponseHeader("Content-Type")); + if (r) + for (i in s) + if (s[i] && s[i].test(r)) { + u.unshift(i); + break; + } + if (u[0] in n) o = u[0]; + else { + for (i in n) { + if (!u[0] || e.converters[i + " " + u[0]]) { + o = i; + break; + } + a || (a = i); + } + o = o || a; + } + if (o) return o !== u[0] && u.unshift(o), n[o]; + })(v, T, n)), + !i && + -1 < S.inArray("script", v.dataTypes) && + (v.converters["text script"] = function () {}), + (s = (function (e, t, n, r) { + var i, + o, + a, + s, + u, + l = {}, + c = e.dataTypes.slice(); + if (c[1]) + for (a in e.converters) l[a.toLowerCase()] = e.converters[a]; + o = c.shift(); + while (o) + if ( + (e.responseFields[o] && (n[e.responseFields[o]] = t), + !u && r && e.dataFilter && (t = e.dataFilter(t, e.dataType)), + (u = o), + (o = c.shift())) + ) + if ("*" === o) o = u; + else if ("*" !== u && u !== o) { + if (!(a = l[u + " " + o] || l["* " + o])) + for (i in l) + if ( + (s = i.split(" "))[1] === o && + (a = l[u + " " + s[0]] || l["* " + s[0]]) + ) { + !0 === a + ? (a = l[i]) + : !0 !== l[i] && ((o = s[0]), c.unshift(s[1])); + break; + } + if (!0 !== a) + if (a && e["throws"]) t = a(t); + else + try { + t = a(t); + } catch (e) { + return { + state: "parsererror", + error: a + ? e + : "No conversion from " + u + " to " + o, + }; + } + } + return { state: "success", data: t }; + })(v, s, T, i)), + i + ? (v.ifModified && + ((u = T.getResponseHeader("Last-Modified")) && + (S.lastModified[f] = u), + (u = T.getResponseHeader("etag")) && (S.etag[f] = u)), + 204 === e || "HEAD" === v.type + ? (l = "nocontent") + : 304 === e + ? (l = "notmodified") + : ((l = s.state), (o = s.data), (i = !(a = s.error)))) + : ((a = l), (!e && l) || ((l = "error"), e < 0 && (e = 0))), + (T.status = e), + (T.statusText = (t || l) + ""), + i ? x.resolveWith(y, [o, l, T]) : x.rejectWith(y, [T, l, a]), + T.statusCode(w), + (w = void 0), + g && m.trigger(i ? "ajaxSuccess" : "ajaxError", [T, v, i ? o : a]), + b.fireWith(y, [T, l]), + g && + (m.trigger("ajaxComplete", [T, v]), + --S.active || S.event.trigger("ajaxStop"))); + } + return T; + }, + getJSON: function (e, t, n) { + return S.get(e, t, n, "json"); + }, + getScript: function (e, t) { + return S.get(e, void 0, t, "script"); + }, + }), + S.each(["get", "post"], function (e, i) { + S[i] = function (e, t, n, r) { + return ( + m(t) && ((r = r || n), (n = t), (t = void 0)), + S.ajax( + S.extend( + { url: e, type: i, dataType: r, data: t, success: n }, + S.isPlainObject(e) && e + ) + ) + ); + }; + }), + S.ajaxPrefilter(function (e) { + var t; + for (t in e.headers) + "content-type" === t.toLowerCase() && + (e.contentType = e.headers[t] || ""); + }), + (S._evalUrl = function (e, t, n) { + return S.ajax({ + url: e, + type: "GET", + dataType: "script", + cache: !0, + async: !1, + global: !1, + converters: { "text script": function () {} }, + dataFilter: function (e) { + S.globalEval(e, t, n); + }, + }); + }), + S.fn.extend({ + wrapAll: function (e) { + var t; + return ( + this[0] && + (m(e) && (e = e.call(this[0])), + (t = S(e, this[0].ownerDocument).eq(0).clone(!0)), + this[0].parentNode && t.insertBefore(this[0]), + t + .map(function () { + var e = this; + while (e.firstElementChild) e = e.firstElementChild; + return e; + }) + .append(this)), + this + ); + }, + wrapInner: function (n) { + return m(n) + ? this.each(function (e) { + S(this).wrapInner(n.call(this, e)); + }) + : this.each(function () { + var e = S(this), + t = e.contents(); + t.length ? t.wrapAll(n) : e.append(n); + }); + }, + wrap: function (t) { + var n = m(t); + return this.each(function (e) { + S(this).wrapAll(n ? t.call(this, e) : t); + }); + }, + unwrap: function (e) { + return ( + this.parent(e) + .not("body") + .each(function () { + S(this).replaceWith(this.childNodes); + }), + this + ); + }, + }), + (S.expr.pseudos.hidden = function (e) { + return !S.expr.pseudos.visible(e); + }), + (S.expr.pseudos.visible = function (e) { + return !!(e.offsetWidth || e.offsetHeight || e.getClientRects().length); + }), + (S.ajaxSettings.xhr = function () { + try { + return new C.XMLHttpRequest(); + } catch (e) {} + }); + var _t = { 0: 200, 1223: 204 }, + zt = S.ajaxSettings.xhr(); + (y.cors = !!zt && "withCredentials" in zt), + (y.ajax = zt = !!zt), + S.ajaxTransport(function (i) { + var o, a; + if (y.cors || (zt && !i.crossDomain)) + return { + send: function (e, t) { + var n, + r = i.xhr(); + if ( + (r.open(i.type, i.url, i.async, i.username, i.password), + i.xhrFields) + ) + for (n in i.xhrFields) r[n] = i.xhrFields[n]; + for (n in (i.mimeType && + r.overrideMimeType && + r.overrideMimeType(i.mimeType), + i.crossDomain || + e["X-Requested-With"] || + (e["X-Requested-With"] = "XMLHttpRequest"), + e)) + r.setRequestHeader(n, e[n]); + (o = function (e) { + return function () { + o && + ((o = a = r.onload = r.onerror = r.onabort = r.ontimeout = r.onreadystatechange = null), + "abort" === e + ? r.abort() + : "error" === e + ? "number" != typeof r.status + ? t(0, "error") + : t(r.status, r.statusText) + : t( + _t[r.status] || r.status, + r.statusText, + "text" !== (r.responseType || "text") || + "string" != typeof r.responseText + ? { binary: r.response } + : { text: r.responseText }, + r.getAllResponseHeaders() + )); + }; + }), + (r.onload = o()), + (a = r.onerror = r.ontimeout = o("error")), + void 0 !== r.onabort + ? (r.onabort = a) + : (r.onreadystatechange = function () { + 4 === r.readyState && + C.setTimeout(function () { + o && a(); + }); + }), + (o = o("abort")); + try { + r.send((i.hasContent && i.data) || null); + } catch (e) { + if (o) throw e; + } + }, + abort: function () { + o && o(); + }, + }; + }), + S.ajaxPrefilter(function (e) { + e.crossDomain && (e.contents.script = !1); + }), + S.ajaxSetup({ + accepts: { + script: + "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript", + }, + contents: { script: /\b(?:java|ecma)script\b/ }, + converters: { + "text script": function (e) { + return S.globalEval(e), e; + }, + }, + }), + S.ajaxPrefilter("script", function (e) { + void 0 === e.cache && (e.cache = !1), e.crossDomain && (e.type = "GET"); + }), + S.ajaxTransport("script", function (n) { + var r, i; + if (n.crossDomain || n.scriptAttrs) + return { + send: function (e, t) { + (r = S("