0spam.org Ads.txt file
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="author" content="REC Designer">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale = 1, maximum-scale=8, user-scalable=yes">
<title>Error 404 | 0spam Project</title>
<meta name="description" content="">
<link rel="canonical" href="https://0spam.org/Error404?404;https://0spam.org:443/ads.txt">
<meta property="og:title" content="Error 404">
<meta property="og:type" content="website">
<meta property="og:image" content="https://0spam.org/upload/135/banners/9721609f9fa914f0820ef6925d6d8382_0spam-logo.png">
<meta property="og:image:secure_url" content="https://0spam.org/upload/135/banners/9721609f9fa914f0820ef6925d6d8382_0spam-logo.png">
<meta property="og:description" content="">
<meta property="og:url" content="https://0spam.org/Error404?404;https://0spam.org:443/ads.txt">
<link rel="icon" type="image/png" href="https://0spam.org/upload/135/favicons/f157411f96e5cce7cf4c366cc9bff7f2_0spam-icon.png">
<script src="/js/sha256.js"></script>
<link rel='dns-prefetch' href='https://i.realestatecreate.com' /><link rel='dns-prefetch' href='https://i.afternorth.com' /><link rel='dns-prefetch' href='https://stats.afternorth.com' /><link rel='dns-prefetch' href='https://maps.gstatic.com' /><style>@font-face {
font-family: 'Oswald';
src: url('/theme/0spam.org/fonts/Oswald-SemiBold.ttf') format('truetype');
font-weight: bold;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Oswald';
src: url('/theme/0spam.org/fonts/Oswald-Light.ttf') format('truetype');
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Jost';
src: url('/theme/0spam.org/fonts/Jost-Bold.ttf') format('truetype');
font-weight: bold;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Jost';
src: url('/theme/0spam.org/fonts/Jost-Regular.ttf') format('truetype');
font-weight: normal;
font-style: normal;
font-display: swap;
}
@font-face {
font-family: 'Material';
src: url('/theme/0spam.org/icons/kJEhBvYX7BgnkSrUwT8OhrdQw4oELdPIeeII9v6oFsI.woff2') format('woff2');
font-weight: normal;
font-style: normal;
font-display: swap;
}
body {
margin: 0;
padding: 0;
background-color: #e8fff5;
color: #1a1a24;
scroll-behavior: smooth;
font-size: 16px;
}
template {
display: none !important;
}
* {
box-sizing: border-box;
font-family: Jost, Tahoma, Geneva, Verdana, sans-serif;
outline: none;
}
input, select, textarea {
outline: none;
border: 1px solid #f1c6cb;
padding: 0.5rem;
font-size: 1rem;
min-width: 0;
max-width: 100%;
margin: 1px;
min-height: 2.8rem;
}
input.required, select.required, textarea.required {
border: 1px solid #d1041f;
}
label input {
min-height: auto;
}
a {
color: #d1041f;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
a.selected {
/* font-weight: bold; */
color: gray;
pointer-events: none;
}
a.button, button, input[type='button'], input[type='submit'], input[type='reset'] {
border: solid 2px #d1041f;
background: #d1041f;
color: white;
padding: 0.5rem 1rem;
margin: 1px;
cursor: pointer;
transition: all 0.2s;
font-size: 100%;
font-weight: bold;
}
a.button:hover, button:hover, input[type='button']:hover, input[type='submit']:hover, input[type='reset']:hover {
background: transparent;
color: #d1041f;
text-decoration: none;
}
a.button.small, button.small, input[type='button'].small, input[type='submit'].small, input[type='reset'].small {
border-width: 1px;
padding: 0.1rem 0.3rem;
/* font-size: 80%; */
font-weight: normal;
}
a.button.selected {
/* font-weight: bold; */
background: gray;
border: solid 2px gray;
}
img {
pointer-events: none;
max-width: 100%;
}
a img {
pointer-events: all;
}
p {
margin: 1rem 0;
max-width: 1280px;
line-height: 1.5;
}
hr {
height: 1px;
background: #d1041f;
width: 100%;
border: none;
margin: 1rem 0;
}
.wrapper {
margin: 0 auto;
max-width: 1280px;
padding: 0 1rem;
}
.page_title {
font-size: 200%;
font-weight: bold;
color: #d1041f;
text-align: center;
padding: 2rem 0;
}
.main li {
margin-bottom: 1rem;
}
.form {
display: flex;
flex-direction: column;
gap: 0.3rem;
max-width: 800px;
font-size: 1rem;
}
.form.h {
flex-direction: row;
align-items: end;
flex-wrap: wrap;
max-width: 100%;
}
.form>div {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
}
.form>div>* {
flex: 1;
display: flex;
flex-direction: column;
max-width: 100%;
}
/* .form label {
margin-top: 0.5rem;
} */
.form .input_label {
margin-top: 0.5rem;
font-size: 80%;
color: gray;
margin-left: 5px;
display: block;
}
.form input, .form select, .form textarea {
display: block;
}
.form input[type='checkbox'], .form input[type='radio'] {
display: inline-block;
margin-right: 0.5rem;
}
table {
margin: 2rem 0;
}
th, td {
padding: 0.5rem;
min-width: 5rem;
margin: 0;
}
tr:first-child th {
border-bottom: 1px solid #d1041f;
}
tr:last-child td {
border-top: 1px solid #d1041f;
font-weight: bold;
}
tr:last-child td.total {
font-size: 120%;
}
.refund {
color: #d1041f;
}
.spacer {
flex: 1;
clear: both;
}
.hide { display: none !important; }
h1 { font-size: 200%; font-weight: bold; }
h2 { font-size: 150%; font-weight: bold; }
h3 { font-size: 120%; font-weight: bold; }
h4 { font-size: 100%; font-weight: bold; }
h5 { font-size: 80%; font-weight: bold; }
.tiny { font-size: 60%; }
.smaller { font-size: 80%; }
.small { font-size: 90%; }
.normal { font-size: 100%; }
.large { font-size: 120%; }
.larger { font-size: 150%; }
.huge { font-size: 200%; }
.bold { font-weight: bold; }
.italic { font-style: italic; }
.underline { text-decoration: underline; }
@media screen and (min-width: 701px) { .print, .mobile { display: none !important; } }
@media screen and (max-width: 700px) { .print, .desktop { display: none !important; } }
@media print {
body { display: block !important; }
.page_title { text-align: center !important; font-size: 150% !important; font-weight: normal !important; }
.noprint { display: none !important; }
}
.my_dialog {
background-color: rgba(0, 0, 0, 0.6);
position: fixed;
left: 0;
right: 0;
top: 0;
bottom: 0;
z-index: 1000;
display: flex;
justify-content: center;
align-items: center;
}
.my_dialog .dlg_content {
position: absolute;
color: black;
background-color: white;
max-width: calc(100vw - 2rem);
}
.my_dialog .dlg_title {
padding: 0.5rem;
color: white;
font-weight: bold;
font-size: 1rem;
background-color: black;
}
.my_dialog .dlg_message {
padding: 1.2rem 1.8rem;
max-height: 50rem;
overflow: auto;
position: relative;
}
.my_dialog .dlg_message.message {
max-width: 40rem;
font-size: 120%;
text-align: center;
}
.my_dialog .dlg_buttons {
padding: 0.7rem 1rem;
border-top: solid 0.06rem #c0c0c0;
border-radius: 0 0 0.5rem 0.5rem;
text-align: center;
}
.my_dialog .form {
min-width: 30rem;
}
.my_dialog.compact .form {
min-width: 0rem;
}
@media screen and (max-width: 600px) { .my_dialog .form { min-width: calc(100vw - 8rem); } }
.missed {
border-width: 2px !important;
}
@-webkit-keyframes missed {
0% { transform: scale(1); }
20% { transform: scale(1.01); }
40% { transform: scale(0.99); }
60% { transform: scale(1.01); }
80% { transform: scale(0.99); }
100% { transform: scale(1); }
}
@-moz-keyframes missed {
0% { transform: scale(1); }
20% { transform: scale(1.01); }
40% { transform: scale(0.99); }
60% { transform: scale(1.01); }
80% { transform: scale(0.99); }
100% { transform: scale(1); }
}
@-o-keyframes missed {
0% { transform: scale(1); }
20% { transform: scale(1.01); }
40% { transform: scale(0.99); }
60% { transform: scale(1.01); }
80% { transform: scale(0.99); }
100% { transform: scale(1); }
}
@-ms-keyframes missed {
0% { transform: scale(1); }
20% { transform: scale(1.01); }
40% { transform: scale(0.99); }
60% { transform: scale(1.01); }
80% { transform: scale(0.99); }
100% { transform: scale(1); }
}
@keyframes missed {
0% { transform: scale(1); }
20% { transform: scale(1.01); }
40% { transform: scale(0.99); }
60% { transform: scale(1.01); }
80% { transform: scale(0.99); }
100% { transform: scale(1); }
}
body.default {
min-height: 100vh;
display: flex;
flex-direction: column;
}
body.default a.logo {
z-index: 1;
}
body.default a.logo img {
height: 6rem;
}
body.default .fright {
float: right;
box-shadow: 0 0 8px 0px #c72a40;
border: 1px solid #c72a40;
padding: 0 1.5rem 1.5rem 1.5rem;;
width: 25rem;
margin: 2rem;
background: white;
}
body.default .fright li {
margin-bottom: 0;
}
body.default #sponsor_info {
width: calc(100vw - 12rem);
}
body.default #sponsor_info sup {
border: solid 1px #c72a40;
background: #d1041f;
color: #ffffff;
padding: 0 0.1rem;
margin: 1px;
transition: all 0.2s;
font-size: .7rem;
}
body.default #sponsor_info .button {
margin-left: -.6rem;
}
body.default #sponsor_info ul {
list-style: none;
padding: 0;
display: flow-root;
}
body.default #sponsor_info li {
background-color: #ffffff;
border: .1rem solid #e6e6e6;
padding: 0.6rem;
}
body.default #sponsor_info ul .mega-content {
margin-top: 1rem;
}
body.default form#donate {
display: flex;
flex-direction: column;
}
body.default .form#contact {
display: flex;
flex-direction: column;
}
body.default .footer {
text-align: center;
font-size: 80%;
padding: 3rem 1rem;
/* background: #ebebeb; */
}
body.default .menubox {
background: #e8fff5;
position: relative;
}
body.default .menubox .wrapper {
display: flex;
justify-content: space-between;
align-items: center;
padding: 1rem;
flex-wrap: wrap;
}
body.default .header_menu {
list-style: none;
margin: 0;
padding: 0;
text-align: center;
}
body.default .header_menu li {
list-style: none;
display: inline-block;
margin: 1rem;
font-size: 120%;
}
body.default .header_menu label {
padding: 1rem 0;
}
body.default .header_menu label>input {
display: none;
}
body.default .header_menu>li>div {
position: absolute;
left: 0;
right: 0;
background: #e8fff5;
margin-top: 1rem;
padding: 1rem;
display: none;
}
body.default .header_menu>li:hover>div {
display: block;
}
body.default .header_menu>li>div ul {
display: flex;
flex-wrap: wrap;
justify-content: center;
max-width: 1280px;
margin: 0 auto;
}
body.default .header_menu>li>div ul li {
width: 15rem;
text-align: left;
}
body.default .header_menu .mega-content {
font-size: 70%;
padding-left: 1rem;
color: gray;
}
@media screen and (max-width: 900px) {
body.default .header_menu li { margin: 1rem 0.5rem; }
}
@media screen and (max-width: 700px) {
body.default .header_menu { width: 100vw; }
body.default .fright { width: 100%; margin: 0 0 2rem; float: none; }
}
@media screen and (max-width: 500px) {
body.default .header_menu { margin: 0 -1rem; text-align: center; padding: 0.5rem 0; }
body.default .header_menu li { font-size: 100%; margin: 0.5rem; }
}
/*********************************************** Backoffice Frame *******************************************/
/*********************************************** Backoffice Frame *******************************************/
/*********************************************** Backoffice Frame *******************************************/
/*********************************************** Backoffice Frame *******************************************/
/*********************************************** Backoffice Frame *******************************************/
body.backoffice {
margin: 0;
padding: 0;
background-color: #e8fff5;
color: #1a1a24;
scroll-behavior: smooth;
font-size: 16px;
display: flex;
height: 100vh;
}
body.backoffice .menubox {
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: center;
width: 13rem;
text-align: center;
background: #2c0a0a;
color: #d9d9d9;
padding: 1rem;
}
body.backoffice.Admin .menubox { background: black; }
body.backoffice.Free .menubox { background: #3c3c3c; }
body.backoffice.Basic .menubox { background: #004a02; }
body.backoffice.Plus .menubox { background: #6e0500; }
body.backoffice.Premium .menubox { background: #545300; }
body.backoffice.Unlimited .menubox { background: #1e0095; }
body.backoffice a.logo {
margin-top: 1rem;
}
body.backoffice a.logo img {
height: 4rem;
}
body.backoffice .main_part {
flex: 1;
padding: 2rem;
position: relative;
overflow: auto;
}
body.backoffice.simple .main_part {
text-align: center;
}
body.backoffice .page_title {
color: #7a0000;
text-align: left;
padding: 0px 0 1rem;
border-bottom: 1px solid #ff9292;
margin-bottom: 1rem;
}
body.backoffice .main_part p, body.backoffice .main_part ol, body.backoffice .main_part ul {
max-width: 1024px;
}
body.backoffice .menubox .menu {
margin: 0;
padding: 1rem 0;
list-style: none;
}
body.backoffice .menubox .menu a {
color: #ffdfdf;
}
body.backoffice .menubox .menu a.logout {
color: #c72a40;
}
body.backoffice .menubox .menu a.selected {
color: gray;
}
body.backoffice .menubox .menu li {
margin: 2px;
position: relative;
}
body.backoffice .menubox .menu a {
display: block;
padding: 0.3rem 1rem;
border: 2px solid transparent;
}
body.backoffice .menubox .menu a:hover {
text-decoration: none;
border: 2px solid #ffdfdf;
}
body.backoffice .menubox .menu a.logout:hover {
border: 2px solid #c72a40;
}
body.backoffice .menubox .menu label input {
display: none;
}
body.backoffice .menubox .menu>li>div {
position: absolute;
left: 100%;
top: -0.6rem;
background: #2c0a0a;
z-index: 1;
min-width: 12rem;
display: none;
padding: 0.5rem;
}
body.backoffice .menubox .menu>li:hover>div {
display: block;
}
body.backoffice .menubox .menu>li>div ul {
list-style: none;
padding: 0;
margin: 0;
}
body.backoffice.Admin .menubox .menu>li>div { background: black; }
body.backoffice.Free .menubox .menu>li>div { background: #3c3c3c; }
body.backoffice.Basic .menubox .menu>li>div { background: #004a02; }
body.backoffice.Plus .menubox .menu>li>div { background: #6e0500; }
body.backoffice.Premium .menubox .menu>li>div { background: #545300; }
body.backoffice.Unlimited .menubox .menu>li>div { background: #1e0095; }
body.backoffice .copyright {
position: fixed;
bottom: 0.5rem;
right: 1rem;
padding: 0.3rem 1rem;
font-size: 80%;
opacity: 0.8;
pointer-events: none;
background: rgba(232, 255, 245, 0.8);
border-radius: 1rem;
}
body.backoffice .user_name {
font-weight: bold;
margin-top: 1rem;
}
body.backoffice .user_role {
font-size: 80%;
}
/* body.backoffice .search_options {
position: absolute;
left: 2rem;
bottom: 1rem;
z-index: 1;
} */
body.backoffice .search_summary {
text-align: center;
padding: 0.5rem 1rem;
background: #350000;
margin: 0 auto 1rem auto;
display: inline-block;
border-radius: 3rem;
color: white;
}
/*********************************************** Mobile Layout *******************************************/
@media screen and (max-width: 700px) {
body.default a.logo img {
height: 3rem;
}
body.backoffice {
flex-direction: column;
min-height: 100vh;
height: auto;
}
body.backoffice .menubox {
flex-direction: row;
flex-wrap: wrap;
bottom: auto;
right: 0;
position: fixed;
width: 100%;
z-index: 1000;
}
body.backoffice a.logo {
margin-top: 0;
}
body.backoffice a.logo img {
height: 3rem;
}
body.backoffice .user_name {
margin-top: 0rem;
}
body.backoffice .user_role {
margin-bottom: 0;
padding-bottom: 0;
}
.menu_toggle {
line-height: 0;
cursor: pointer;
}
body.backoffice .menubox .menu {
width: 100%;
display: none;
position: absolute;
top: 100%;
left: 0;
background: #560000;
padding: 1rem 0;
}
body.backoffice.Admin .menubox .menu { background: black; }
body.backoffice.Free .menubox .menu { background: #3c3c3c; }
body.backoffice.Basic .menubox .menu { background: #004a02; }
body.backoffice.Plus .menubox .menu { background: #6e0500; }
body.backoffice.Premium .menubox .menu { background: #545300; }
body.backoffice.Unlimited .menubox .menu { background: #1e0095; }
body.backoffice .menubox .menu.show {
display: block;
}
body.backoffice .menubox .menu li {
display: inline-block;
min-width: 150px;
}
body.backoffice .menubox .menu a {
display: inline-block;
width: 100%;
}
body.backoffice .main_part {
flex: 0;
padding: 7rem 1rem 1rem 1rem;
overflow: auto;
height: auto;
}
body.backoffice .page_title {
text-align: center;
font-size: 150%;
}
body.backoffice .copyright {
position: relative;
padding: 2rem 1rem;
text-align: center;
}
/* body.backoffice .search_options {
position: fixed;
left: 1rem;
} */
}
#__templates{display:none;}</style>
</head>
<body class="default">
<div class="menubox">
<div class="wrapper">
<a class="logo" href="/"><img src="/upload/135/banners/9721609f9fa914f0820ef6925d6d8382_0spam-logo.png"></a>
<a class="button mobile large" href="/login">Log In</a>
<ul class="header_menu" id="header_menu"><li class="mc_14452 m131648" onclick=""><a href="/" class="">Home</a></li><li class="mc_14452 m131649" onclick=""><label class="label "><input type="checkbox" name="m131649chk" onChange="toggle_menu('.m131649', '.mc_14452'); "><a href="/services" class="">Services</a></label><div class="m131649div"><ul><li class="mc_131649 m131650" onclick=""><a href="/IP-Domain-Asset-Management" class="">IP & Domain Management Tools</a><div class="mega-content">These tools were created for network providers to quickly and efficiently manage larger networks including bulk removals after termination of end user service violations and network abuse.</div></li><li class="mc_131649 m131651" onclick=""><a href="/backoffice/manages" class="">Manage IP's</a><div class="mega-content">Already a user of The 0spam Project? Manage your IP assets, notifications and Trusted assets.</div></li><li class="mc_131649 m131652" onclick=""><a href="/research-request" class="">Research Request</a><div class="mega-content">Open a research request on a spam incident. In some cases an admin may need help tracking down the source of a spam outbreak. We can pull logs to help identify the source.</div></li></ul></div></li><li class="mc_14452 m131653" onclick=""><a href="/q-a" class="">Q & A</a></li><li class="mc_14452 m131654" onclick=""><a href="/contact-us" class="">Support</a></li><li class="mc_14452 button desktop m131655" onclick=""><a href="/Donate" class="button desktop">Donate</a></li><li class="mc_14452 m131656" onclick=""><a href="/login" class="">Log In</a></li></ul>
</div>
</div>
<div class="main wrapper">
<div class="main" style="text-align: center">
<p><img src="/theme/0spam.org/images/error404-w240.png" alt="error404"></p>
<h1>Error 404!!!</h1>
<h3>Oops, we could not find the page you requested. Please <a href="/contact-us">contact</a> system manager or <a href="javascript:void(0)" onclick="window.location.reload()">reload</a> the page later.</h3>
</div>
</div>
<div class="spacer"></div>
<div class="footer">
© 2025 <a title="0spam Project" href="/">0Spam Project</a>, All Rights Reserved | <a href="/ToS" title="0Spam Terms of Service">Terms of Service</a> | <a href="/Privacy" title="0Spam Privacy Policy">Privacy</a> | (Rev v4.1)
</div>
<div id='__templates'><template id="input_form">
<div class="form">
<div class="input_label">$LABEL$</div>
<input class="input_element required" type="$TYPE$" value="$VALUE$" size="32">
</div>
</template>
<template id="text_form">
<div class="form">
<div class="input_label">$LABEL$</div>
<textarea class="text_element required" rows="10">$VALUE$</textarea>
</div>
</template>
<template id="select_form">
<div class="form">
<div class="input_label">$LABEL$</div>
<select class="select_element"></select>
</div>
</template>
</div><script>
/*
$A(url, param, callback, failed) - make an AJAX call
$ASK(message, buttons) - open ask dialog
$C(tag, html, cls, parent) - create new element with tag, html and cls
$CK(array, cls) - check elements in array with empty value
$CKEM(array, cls) - check elements in array with vaild email
$CLA(ele, cls) - add css class for element
$CLR(ele, cls) - remove css class for element
$CLT(ele, cls) - toggle css class for element
$DLG(title, message, buttons) - show dialog
$E(ele) - get or query element using ID or Query Selector
$EM(ele) - check if email is vaild
$ERR(message) - show error
$H(ele) - hide element
$HTML(ele, html) - get or set HTML of element
$INPUT(label, value, type, callback) - open input dialog
$K(ele) - get checked of element
$JSON(data) - JSON parse or stringify
$MSG(message) - show message
$N(type, id, cls) - create new element with type, id and cls
$Q(parent, query) - query element for parent
$QA(parent, query) - query all element for parent
$S(ele, disp) - show element with disp
$SELECT(label, ar, value, callback) - open select dialog
$STO(key, value) - get or set storage data
$STR(data) - get string data
$T(ele) - toggle element with disp
$TEXT(label, value, callback) - open text dialog
$TMPL(ele) - get template html content
$V(ele, value) - get or set value of element
*/
function $C(tag, html, cls, parent) { if(!tag) tag = 'div'; let e = document.createElement(tag); if(html) e.innerHTML = html; if(cls) e.className = cls; parent = $E(parent); if(parent) parent.appendChild(e); return e; }
function $R(ele) { if(ele && ele.parentElement) return ele.parentElement.removeChild(ele); }
function $E(ele) { let e = ele; if(typeof ele === "string") { e = document.getElementById(ele); if(!e) e = document.querySelector(ele); } return e; }
function $V(ele, value) { ele = $E(ele); if(!ele) return; if(value) ele.value = value; else return ele.value; }
function $K(ele, value) { ele = $E(ele); if(!ele) return; if(value) ele.checked = value; else return ele.checked; }
function $S(ele, disp) { if(Array.isArray(ele)) ele.forEach(function(e) { $S(e) }); else { ele = $E(ele); if(!ele) return; if(!disp) disp = "block"; ele.style.display = disp; } }
function $H(ele) { if(Array.isArray(ele)) ele.forEach(function(e) { $H(e) }); else { ele = $E(ele); if(!ele) return; ele.style.display = "none"; } }
function $T(ele, disp) { if(Array.isArray(ele)) ele.forEach(function(e) { $T(e) }); else { ele = $E(ele); if(!ele) return; if(!disp) disp = "block"; if(ele.style.display == "none") ele.style.display = disp; else ele.style.display ="none"; } }
function $CLA(ele, cls) { let e = $E(ele); if(!e) return; e.classList.add(cls); }
function $CLR(ele, cls) { let e = $E(ele); if(!e) return; e.classList.remove(cls); }
function $CLT(ele, cls) { let e = $E(ele); if(!e) return; e.classList.toggle(cls); }
function $MSG(message) { show_message(message); }
function $ERR(message) { show_error(message); }
function $EM(ele) { return valid_email($V(ele)); }
function $CKEM(array, cls, animation, msg) { if(!msg) msg = "Input vaild email address."; return $CK(array, cls, animation, $EM, msg); }
function $N(type, id, cls) { if(!type) type = "div"; let ele = document.createElement(type); if(cls) ele.className = cls; if(id) ele.id = id; return ele; }
function $STO(key, value) { if(value) set_storage(key, value); else return get_storage(key); }
function $STR(data) { return get_string(data); }
function $HTML(ele, html) { let e = $E(ele); if(!e) return ""; if(html) e.innerHTML = html; else return e.innerHTML; }
function $JSON(data) { if(typeof data === "string") { if(!data.startsWith("[{") && !data.startsWith("{")) return null; return JSON.parse(data); } return JSON.stringify(data); }
function $Q(parent, query) { if(!parent) parent = document; if(typeof parent == "string") parent = $E(parent); if(!parent) return []; if(!query) return null; return parent.querySelector(query); }
function $QA(parent, query) { if(!parent) parent = document; if(typeof parent == "string") parent = $E(parent); if(!parent) return []; if(!query) return null; let ar = []; let qa = parent.querySelectorAll(query); qa.forEach(function(e) { ar.push(e); }); return ar; }
function $CK(array, cls, animation, check, msg) {
if(!Array.isArray(array)) array = [array]; if(!cls) cls = "missed"; if(!check) check = $V; if(!msg) msg = "Input all required fields.";
let p = true; for(let i=0; i<array.length; i++) {
let e = $E(array[i]); if(!e) continue;
e.oninput = function() { $CLR(e, cls); }
if(!check(e)) { $CLA(e, cls); p = false; animation && animation(e); }
} if(!p && msg) $ERR(msg); return p;
}
function $A(url, param, callback, prg, add_url = true) {
if(add_url) { if(param) param.request_url = window.location.href; else param = { request_url: window.location.href }; }
if(prg != null && !prg) prg = "Please wait...";
if(typeof prg === "string") prg = show_message(prg, -1);
ajax("POST", url, param, callback, function(err) { $ERR("Failed: " + err); }, prg);
}
function $ASK(message, buttons) {
if(typeof buttons === "function") buttons = ["Yes", buttons, "No"];
return show_dialog("", message, buttons);
}
function $DLG(title, message, buttons) {
if(!buttons) buttons = ["Close"];
return show_dialog(title, message, buttons);
}
function $TMPL(ele, ar) {
if(typeof(ele) == "string") ele = "template#" + ele; let html = $HTML(ele); if(!ar) ar = [];
for(let i=0; i<ar.length; i+=2) html = html.replaceAll(ar[i], ar[i+1]); return html;
}
function $INPUT(label, value, type, callback) {
if(!label) label = ""; if(!value) value = ""; if(!type) type="text";
let dlg = show_dialog(null, $TMPL("input_form", ["$LABEL$", label, "$VALUE$", value, "$TYPE$", type]), ["Cancel", "OK", function () {
if(!$CK([$Q(dlg, ".input_element")], "missed", animate_missed)) return false;
if(callback) return callback(dlg, $V($Q(dlg, ".input_element")));
}]);
return dlg;
}
function $TEXT(label, value, callback) {
if(!label) label = ""; if(!value) value = "";
let dlg = show_dialog(null, $TMPL("text_form", ["$LABEL$", label, "$VALUE$", value]), ["Cancel", "OK", function () {
if(!$CK([$Q(dlg, ".text_element")], "missed", animate_missed)) return false;
if(callback) return callback(dlg, $V($Q(dlg, ".text_element")));
}]);
return dlg;
}
function $SELECT(label, ar, value, callback) {
if(!label) label = ""; if(!value) value = ""; if(!ar) ar = [];
let select = null;
let dlg = show_dialog(null, $TMPL("select_form", ["$LABEL$", label]), ["Cancel", "OK", function () {
if(callback) return callback(dlg, $V(select));
}]);
select = $Q(dlg, ".select_element");
ar.forEach(function(data) { if(typeof data === "string") add_option({value: data, text: data}); else add_option(data); });
function add_option(d) {
let opt = $N("option"); opt.value = d.value; opt.innerHTML = d.text; if(d.value == value) opt.selected = "selected";
select.appendChild(opt);
}
return dlg;
}
function toggle_element(element) {
if(typeof element == "string") element = document.getElementById(element);
if(element == undefined || element == null) return;
element.style.display = element.style.display != "block" ? "block" : "none";
}
// show_dialog("sample", "dialog", null, -1);
// show_dialog("sample", "dialog", "OK", 5000);
// show_dialog("sample", "dialog", ["Yes", function (button) { alert(button); }, "No", "Cancel"], 1500);
function getBrowserVersion() {
var ua = navigator.userAgent, tem,
M = ua.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || [];
if (/trident/i.test(M[1])) {
tem = /\brv[ :]+(\d+)/g.exec(ua) || [];
return 'IE ' + (tem[1] || '');
}
if (M[1] === 'Chrome') {
tem = ua.match(/\b(OPR|Edge)\/(\d+)/);
if (tem != null) return tem.slice(1).join(' ').replaceAll('OPR', 'Opera');
}
M = M[2] ? [M[1], M[2]] : [navigator.appName, navigator.appVersion, '-?'];
if ((tem = ua.match(/version\/(\d+)/i)) != null) M.splice(1, 1, tem[1]);
return M.join(' ');
}
function goback() {
window.history.back();
}
function hash(data) {
return Sha256.hash(data);
}
function set_editor_content(content) {
editor.setValue(get_str(content));
editor.setScrollPosition({ scrollTop: 0 });
editor.setPosition({ lineNumber: 0, column: 0 });
editor.focus();
}
function start_heart_beat(interval) {
if (is_null(interval)) interval = 60000;
setInterval(function () {
ajax("POST", "/Api/HeartBeat", null, function (data) {
console.log(data);
});
}, interval);
}
function start_auto_login(interval) {
if (is_null(interval)) interval = 60000;
let uuid = get_uuid();
if (uuid != "") {
setInterval(function () {
ajax("POST", "/Manager/Login/Api/AutoLogin", {
uuid: uuid
});
}, interval);
}
}
function create_editor(id, lang) {
if (lang == undefined || lang == "") lang = "html";
return monaco.editor.create(document.getElementById(id), {
value: "",
automaticLayout: true,
language: lang,
quickSuggestions: false,
wordWrap: "bounded",
wordWrapColumn: 1000,
wrappingIndent: "indent"
});
}
function get_uuid() {
let uuid = get_storage("REC_MANAGER_UUID");
if (uuid == undefined || uuid == "") {
uuid = generate_uuid();
set_storage("REC_MANAGER_UUID", uuid);
}
return uuid;
}
function generate_uuid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
function get_storage(key) {
return localStorage.getItem(key);
}
function set_storage(key, value) {
return localStorage.setItem(key, value);
}
function switch_elements(elements, index) {
for (let i = 0; i < elements.length; i++) {
if (i == index) show_element(elements[i]); else hide_element(elements[i]);
}
}
function format_money(amount, decimalCount, decimal, thousands) { // = 2, decimal = ".", thousands = ",") {
try {
if (decimalCount == undefined) decimalCount = 2;
if (decimal == undefined) decimal = ".";
if (thousands == undefined) thousands = ",";
decimalCount = Math.abs(decimalCount);
decimalCount = isNaN(decimalCount) ? 2 : decimalCount;
const negativeSign = amount < 0 ? "-" : "";
let i = parseInt(amount = Math.abs(Number(amount) || 0).toFixed(decimalCount)).toString();
let j = (i.length > 3) ? i.length % 3 : 0;
return negativeSign + (j ? i.substr(0, j) + thousands : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands) + (decimalCount ? decimal + Math.abs(amount - i).toFixed(decimalCount).slice(2) : "");
} catch (e) {
console.log(e)
}
}
function init_checkboxes() {
let elements = document.querySelectorAll(".checkbox");
for (let i = 0; i < elements.length; i++) {
let label = get_element_attr_value(elements[i], "label");
let checked = get_element_attr_value(elements[i], "checked");
elements[i].innerHTML = generate_checkbox_string(label, checked);
elements[i].isChecked = function () {
return this.querySelectorAll("input")[0].checked;
};
elements[i].setCheck = function (checked) {
this.querySelectorAll("input")[0].checked = checked;
}
}
}
function create_checkbox(label, checked) {
let div_checkbox = document.createElement("div");
div_checkbox.className = "checkbox";
div_checkbox.innerHTML = generate_checkbox_string(label, checked);
div_checkbox.isChecked = function () {
return this.querySelectorAll("input")[0].checked;
};
div_checkbox.setCheck = function (checked) {
this.querySelectorAll("input")[0].checked = checked;
}
return div_checkbox;
}
function generate_checkbox_string(label, checked) {
return "<label class='checkboxcontainer'>" + label + "<input type='checkbox' " + checked + "'><span class='checkmark'></span></label>";
}
function get_element_attr_value(element, attr) {
let value = element.attributes[attr];
if (value == undefined) return "";
return value.value;
}
function init_links(query) {
let elements = document.querySelectorAll(query);
for (let i = 0; i < elements.length; i++) {
let href = get_element_attr_value(elements[i], "href");
let target = get_element_attr_value(elements[i], "target");
if (target == "") target = "_current";
if (href == "") continue;
elements[i].addEventListener("click", function (event) { window.open(href, target); });
}
}
function init_filter_inputs() {
let inputs = document.getElementsByTagName("input");
for (let i = 0; i < inputs.length; i++) {
let filter = get_element_attr_value(inputs[i], "filter");
if (filter == "") continue;
let target = document.getElementsByName(filter);
if (target.length == 0) continue;
inputs[i].filter_target = target;
inputs[i].addEventListener("keyup", function (event) {
if (this.filter_target == undefined) return;
for (let i = 0; i < this.filter_target.length; i++) {
let options = this.filter_target[i].getElementsByTagName("option");
let key = this.value;
for (let j = 0; j < options.length; j++) {
options[j].style.display = options[j].innerHTML.toString().includes(key) == true ? "block" : "none";
}
}
});
}
}
function show_dialog(title, body, buttons, timeout, onclose) {
let div_dialog = document.createElement("div");
div_dialog.className = "my_dialog";
let div_content = document.createElement("div");
div_content.className = "dlg_content";
div_dialog.appendChild(div_content);
if (title) {
let div_title = document.createElement("div");
div_title.className = "dlg_title";
div_title.innerHTML = title;
div_content.appendChild(div_title);
}
if (body) {
let div_message = document.createElement("div");
div_message.className = "dlg_message";
if (typeof (body) == "string") {
if(!body.trim().startsWith("<")) div_message.classList.add("message");
div_message.innerHTML = body;
}
if (typeof (body) == "object") {
div_message.innerHTML = "";
div_message.appendChild(body);
}
div_content.appendChild(div_message);
}
if (buttons && buttons.length > 0) {
let div_buttons = document.createElement("div");
div_buttons.className = "dlg_buttons";
if (typeof (buttons) == "string") {
let button = document.createElement("button");
button.className = buttons.replace(/\W/g, '');
button.innerHTML = buttons;
button.addEventListener("click", function () { div_dialog.selected_button = button; close_dialog(div_dialog, onclose); });
div_buttons.appendChild(button);
} else {
for (let i = 0; i < buttons.length; i++) {
if (typeof (buttons[i]) != "string") continue;
let button = document.createElement("button");
button.className = buttons[i].replace(/\W/g, '');
button.innerHTML = buttons[i];
if (i < buttons.length - 1 && typeof (buttons[i + 1]) == "function")
button.addEventListener("click", function () { div_dialog.selected_button = button; if (buttons[i + 1](button) != false) close_dialog(div_dialog, onclose); });
else
button.addEventListener("click", function () { div_dialog.selected_button = button; close_dialog(div_dialog, onclose); });
div_buttons.appendChild(button);
}
}
div_content.appendChild(div_buttons);
}
if (timeout > 0) setTimeout(function () { close_dialog(div_dialog, onclose); }, timeout);
open_dialog(div_dialog);
return div_dialog;
}
// let old_body_overflow_for_dialog = null;
function open_dialog(dialog) {
// old_body_overflow_for_dialog = document.body.style.overflow;
// document.body.style.overflow = "hidden";
document.body.appendChild(dialog);
}
function close_dialog(dialog, onclose) {
if (onclose != undefined) if (onclose(dialog.selected_button) == false) return;
if (document.body.contains(dialog)) document.body.removeChild(dialog);
// document.body.style.overflow = old_body_overflow_for_dialog;
}
function show_message(message, timeout, onclose) {
if (timeout == undefined) timeout = 1000;
return show_dialog(null, message, null, timeout, onclose);
}
function show_error(error, onclose) {
return show_dialog(null, error, "OK", -1, onclose);
}
function show_dialog_for_design(title, design, buttons, timeout, onclose) {
let div_design = document.getElementsByName(design);
if (div_design.length == 0) return;
return show_dialog(title, div_design[0], buttons, timeout, onclose);
}
function get_dialog_element_value(dialog, element_id) {
let element = dialog.querySelector("#" + element_id);
if (element == null) return null;
return element.value;
}
function set_dialog_element_value(dialog, element_id, value) {
let element = dialog.querySelector("#" + element_id);
if (element == null) return null;
element.value = value;
}
function get_dialog_element_checked(dialog, element_id) {
let element = dialog.querySelector("#" + element_id);
if (element == null) return null;
return element.checked;
}
function set_dialog_element_checked(dialog, element_id, val) {
let element = dialog.querySelector("#" + element_id);
if (element == null) return null;
return element.checked = val;
}
function dialog_element(dialog, element_id) {
return dialog.querySelector("#" + element_id);
}
// Replace name with class
function get_string(data) {
if (is_null(data)) return "";
return data;
}
function add_str(arr, str) {
if (is_null(str)) return;
if (str.trim() == "") return;
arr.push(str.trim());
}
function get_addr_str(addr, city, state, zip) {
let data = [];
add_str(data, addr);
add_str(data, city);
add_str(data, state);
add_str(data, zip);
return data.join(",");
}
function is_null(data) {
return data == undefined || data == null;
}
function get_email_atag(email, prefix) {
if (is_null(email)) return "";
if (email == "") return "";
return get_str(prefix) + "<a href='mailto:" + email + "'>" + email + "</a>";
}
function get_phone_atag(data, prefix) {
if (is_null(data)) return "";
if (data == "") return "";
return get_str(prefix) + "<a href='tel:" + data + "'>" + data + "</a>";
}
function get_http_atag(data, prefix) {
if (is_null(data)) return "";
if (data == "") return "";
return get_str(prefix) + "[<a href='" + get_http_url(data) + "' target='_blank'>" + data + "</a>]";
}
function get_agency_atag(data) {
if (is_null(data)) return "";
return "<a href='/Manager/Admin/AgencyEdit?agency_id=" + data.Id + "'>" + get_string(data.Name) + "</a>";
}
function get_domain_atag(domain) {
if (is_null(domain)) return "";
if (domain == "") return "";
return "[<a href='http://" + domain + "' target='_blank'>" + domain + "</a>]";
}
function get_domain_atag_v2(domain) {
if (is_null(domain) || is_null(domain.Domain)) return "";
if (domain.Domain == "") return "";
return "[<a href='http://dev." + domain.Domain + "' target='_blank'>dev</a>] [<a href='http://" + domain.Domain + "' target='_blank'>" + domain.Domain + "</a>]";
}
function get_dev_domain_atag(domain) {
if (is_null(domain)) return "";
if (domain == "") return "";
return "[<a href='http://dev." + domain + "' target='_blank'>dev</a>]";
}
function get_http_url(url) {
if (is_null(url) || url == "") return "";
if (url.startsWith("http")) return url;
return "http://" + url;
}
if (typeof on_start === "function") window.addEventListener('load', on_start, false);
if (typeof on_keyup === "function") window.addEventListener('keyup', on_keyup, false);
if (typeof on_keydown === "function") window.addEventListener('keydown', on_keydown, false);
if (typeof on_keypress === "function") window.addEventListener('keypress', on_keypress, false);
function ismobile() {
return screen.width < 900 || window.innerWidth < 900;
}
function on_load(callback) {
if (callback && typeof callback == "function") window.addEventListener('load', callback, false);
}
function get_design_form_text(design_name, params) {
let div_design = document.getElementsByName(design_name);
if (div_design.length == 0) return "";
let str = div_design[0].innerText;
if (params && params.length > 0) {
for (let i = 0; i < params.length; i += 2) {
if (i < params.length - 1) {
str = str.replaceAll(params[i], params[i + 1]);
}
}
}
return str;
}
function get_class_form_html(design_id, params) {
let div_design = document.getElementById(design_id);
if (!div_design) return "";
let str = div_design.innerHTML;
if (params && params.length > 0) {
for (let i = 0; i < params.length; i += 2) {
if (i < params.length - 1) {
str = str.replaceAll(params[i], params[i + 1]);
}
}
}
return str;
}
function get_class_form_text(design_id, params) {
let div_design = document.getElementById(design_id);
if (!div_design) return "";
let str = div_design.innerText;
if (params && params.length > 0) {
for (let i = 0; i < params.length; i += 2) {
if (i < params.length - 1) {
str = str.replaceAll(params[i], params[i + 1]);
}
}
}
return str;
}
function get_template_html(template) {
if(typeof template == "text") template = document.querySelector("template#" + template);
if(!template) return "";
return template.innerHTML;
}
function getQueryString(key) {
let itm = null;
let qs = location.search.substring(1);
// if (arguments.length > 0 && arguments[0].length > 1) key = arguments[0];
let pattern = /([^&=]+)=([^&]*)/g;
while (itm = pattern.exec(qs)) {
if (decodeURIComponent(itm[1]) === key) return decodeURIComponent(itm[2]);
}
return null;
}
function isInViewport(element) {
if(typeof element === "string") element = document.getElementById(element);
if(!element) return false;
const rect = element.getBoundingClientRect();
return (
rect.top >= 0 &&
rect.left >= 0 &&
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
rect.right <= (window.innerWidth || document.documentElement.clientWidth)
);
}
function to_param_value(val) {
var v = val.trim();
if (!v) return null;
return v;
}
function valid_email(email) {
var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
return re.test(email);
}
function ajax_old(method, url, param, callback, failed, prg) {
let xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4) {
if (prg) close_dialog(prg);
if (this.status == 200) {
if (callback) callback(this.responseText);
} else {
if (failed) failed(this.responseText);
}
}
};
xhttp.open(method, url, true);
if (param) {
xhttp.setRequestHeader("Content-type", "application/json");
xhttp.send(JSON.stringify(param));
} else xhttp.send();
}
function ajax_xml(method, url, param, callback, failed, prg) {
let xhttp = new XMLHttpRequest();
xhttp.onload = function () {
if (callback) callback(xhttp.responseXML);
};
xhttp.onerror = function () {
if (failed) failed(xhttp.statusText);
};
xhttp.open(method, url, true);
if (param) {
xhttp.setRequestHeader("Content-type", "application/json");
xhttp.send(JSON.stringify(param));
} else xhttp.send();
}
function ajax0(method, url, param, callback, failed) {
let xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4) {
if (this.status == 200) callback && callback(this.responseText);
else failed && failed(this.responseText);
}
};
xhttp.open(method, url, true);
if (param != undefined) {
xhttp.setRequestHeader("Content-type", "application/json");
xhttp.send(JSON.stringify(param));
} else xhttp.send();
}
function ajax(method, url, param, callback, failed, prg) {
ajax0(method, url, param, function(data) {
if(data.split(":")[0] == "-1011") {
if (login_data && login_data.email) {
ajax0("POST", "/api/login", { email: login_data.email }, function(data) {
if(data.split(":")[0] == "0") ajax0(method, url, param, ajax_callback, ajax_failed);
});
}
} else {
ajax_callback(data);
}
}, ajax_failed);
function ajax_callback(data) {
prg && close_dialog(prg);
callback && callback(data);
}
function ajax_failed(data) {
prg && close_dialog(prg);
failed && failed(data);
}
}
function add_css_class(element, css_class) {
css_class = css_class || "";
if(typeof element == "string") element = document.getElementById(element);
if (!css_class || !element) return;
element.classList.add(css_class);
}
function remove_css_class(element, css_class) {
css_class = css_class || "";
if(typeof element == "string") element = document.getElementById(element);
if (!css_class || !element) return;
element.classList.remove(css_class);
}
function toggle_css_class(element, css_class) {
css_class = css_class || "";
if(typeof element == "string") element = document.getElementById(element);
if (!css_class || !element) return;
if(element.classList.contains(css_class)) element.classList.remove(css_class);
else element.classList.add(css_class);
}
function add_css_class_by_id(element_id, css_class, parent) {
parent = parent || document;
let element = parent.getElementById(element_id);
add_css_class(element, css_class);
}
function remove_css_class_by_id(element_id, css_class, parent) {
parent = parent || document;
let element = parent.getElementById(element_id);
remove_css_class(element, css_class);
}
function animate_missed(e) {
e.animate([
{ transform: 'scale(1)' },
{ transform: 'scale(1.01)', offset: 0.2 },
{ transform: 'scale(0.99)', offset: 0.4 },
{ transform: 'scale(1.01)', offset: 0.6 },
{ transform: 'scale(0.99)', offset: 0.8 },
{ transform: 'scale(1)' }
], {
duration: 500,
iterations: 3
});
}
function toggle_menu() { }
function sticky_check() {
if(isInViewport("sticky_checker")) remove_css_class_by_id("header_sticky", "sticky");
else add_css_class_by_id("header_sticky", "sticky");
}
window.addEventListener("scroll", sticky_check);
sticky_check();
var storage_key = "0SPAM_LOGIN_DATA_STORED";
var login_data = $JSON($STO(storage_key));
function on_logout() {
// $ASK("Would you like to log out?", function() {
// $A("/Api/LogOut", null, function(result) {
// result = result.split(":");
// if(result[0] == "0") {
// if(login_data) $STO(storage_key, $JSON({ email: login_data.email, remember: false }));
// else location.href = "/";
// return;
// }
// show_error(result.length > 1 ? result[1] : result[0]);
// });
// });
$ASK("Would your like to remember your log in information after log out?", ["Yes", function() {
$A("/api/logout", { type: "Log Out & Remember" }, function(result) {
result = result.split(":");
if(result[0] == "0") {
if(login_data) $STO(storage_key, $JSON({ email: login_data.email, remember: false }));
location.href = "/";
return;
}
if(result[0] == "1") {
location.href = "/admin/users";
return;
}
show_error(result.length > 1 ? result[1] : result[0]);
});
}, "No", function() {
$A("/api/logout", { type: "Log Out & Clear" }, function(result) {
result = result.split(":");
if(result[0] == "0") {
$STO(storage_key, $JSON({ email: '', remember: false }));
location.href = "/";
return;
}
if(result[0] == "1") {
location.href = "/admin/users";
return;
}
show_error(result.length > 1 ? result[1] : result[0]);
});
}, "Cancel"]);
}
function price_str2(d) {
if(!d) return "";
d = Number.parseFloat(d);
let sign = "";
if(d < 0) { sign = "-"; d *= -1; }
return sign + "$" + d.toLocaleString();
}
function get_item_data(item, id) {
let data = $HTML("." + item + "_" + id + " .fulldata");
if(!data.startsWith("{")) return null;
return $JSON(data);
}
function ValidateIPAddress(element) {
return /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/.test($V(element));
}
function ValidateIPAddressBlock(element) {
return /^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.\*$/.test($V(element));
}
function ValidateDomainName(element) {
return /([A-Za-z0-9-]+\.)+[A-Za-z0-9-]+/.test($V(element));
}
</script>
<script>
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//stats.afternorth.com/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '3']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
</body>
</html>