Files
2026-05-03 14:53:43 -04:00

2841 lines
140 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<title>Rec_rewild Admin Panel</title>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
<style>
/* Theme Variables */
body.red {
--navbar-bg: linear-gradient(135deg, rgba(180, 14, 14, 0.95), rgba(140, 10, 10, 0.95));
--sidebar-bg: rgba(97, 14, 14, 0.9);
--popup-bg: rgba(180, 14, 14, 0.95);
--card-bg: rgba(180, 14, 14, 0.9);
--card-hover-bg: rgba(107, 10, 10, 0.95);
--table-bg: rgba(180, 14, 14, 0.85);
--btn-confirm-bg: #28a745;
--btn-cancel-bg: #dc3545;
--btn-close-bg: #0078d7;
--accent-color: #ff6b6b;
}
body.green {
--navbar-bg: linear-gradient(135deg, rgba(0, 150, 12, 1), rgba(0, 120, 10, 1));
--sidebar-bg: rgba(0, 150, 12, 0.4);
--popup-bg: rgba(0, 150, 12, 1);
--card-bg: rgba(0, 150, 12, 0.9);
--card-hover-bg: rgba(0, 110, 10, 1);
--table-bg: rgba(0, 150, 12, 0.9);
--btn-confirm-bg: rgba(0, 120, 10, 1);
--btn-cancel-bg: #125210;
--btn-close-bg: #006400;
--accent-color: #4ade80;
}
body.purple {
--navbar-bg: linear-gradient(135deg, rgba(87, 27, 148, 0.95), rgba(63, 20, 110, 0.95));
--sidebar-bg: rgba(87, 27, 148, 0.4);
--popup-bg: rgba(87, 27, 148, 0.95);
--card-bg: rgba(87, 27, 148, 0.9);
--card-hover-bg: rgba(63, 20, 110, 0.95);
--table-bg: rgba(87, 27, 148, 0.85);
--btn-confirm-bg: #7e57c2;
--btn-cancel-bg: #ab47bc;
--btn-close-bg: #512da8;
--accent-color: #a78bfa;
}
body.dark {
--navbar-bg: linear-gradient(135deg, rgba(30, 30, 30, 0.98), rgba(20, 20, 20, 0.98));
--sidebar-bg: rgba(35, 35, 35, 0.95);
--popup-bg: rgba(40, 40, 40, 0.98);
--card-bg: rgba(35, 35, 35, 0.95);
--card-hover-bg: rgba(55, 55, 55, 0.95);
--table-bg: rgba(40, 40, 40, 0.95);
--btn-confirm-bg: #2a2a2a;
--btn-cancel-bg: #660000;
--btn-close-bg: #333333;
--accent-color: #60a5fa;
}
body.blue {
--navbar-bg: linear-gradient(135deg, rgba(30, 70, 180, 0.98), rgba(20, 50, 130, 0.98));
--sidebar-bg: rgba(30, 70, 180, 0.4);
--popup-bg: rgba(30, 70, 180, 0.98);
--card-bg: rgba(30, 70, 180, 0.9);
--card-hover-bg: rgba(20, 50, 130, 0.95);
--table-bg: rgba(30, 70, 180, 0.9);
--btn-confirm-bg: #1e46b4;
--btn-cancel-bg: #123070;
--btn-close-bg: #0b2448;
--accent-color: #60a5fa;
}
body.pink {
--navbar-bg: linear-gradient(135deg, rgba(200, 50, 120, 0.95), rgba(150, 30, 90, 0.95));
--sidebar-bg: rgba(200, 100, 130, 0.4);
--popup-bg: rgba(200, 50, 120, 0.95);
--card-bg: rgba(200, 50, 120, 0.9);
--card-hover-bg: rgba(150, 30, 90, 0.95);
--table-bg: rgba(200, 50, 120, 0.85);
--btn-confirm-bg: #c83278;
--btn-cancel-bg: #a02060;
--btn-close-bg: #801850;
--accent-color: #f472b6;
}
body.orange {
--navbar-bg: linear-gradient(135deg, rgba(255, 115, 0, 0.95), rgba(200, 90, 0, 0.95));
--sidebar-bg: rgba(255, 160, 60, 0.4);
--popup-bg: rgba(255, 115, 0, 0.95);
--card-bg: rgba(255, 115, 0, 0.9);
--card-hover-bg: rgba(200, 90, 0, 0.95);
--table-bg: rgba(255, 115, 0, 0.85);
--btn-confirm-bg: #ff9800;
--btn-cancel-bg: #e65100;
--btn-close-bg: #bf360c;
--accent-color: #fb923c;
}
body.yellow {
--navbar-bg: linear-gradient(135deg, rgba(204, 153, 0, 0.95), rgba(160, 120, 0, 0.95));
--sidebar-bg: rgba(204, 153, 0, 0.4);
--popup-bg: rgba(204, 153, 0, 0.95);
--card-bg: rgba(204, 153, 0, 0.9);
--card-hover-bg: rgba(160, 120, 0, 0.95);
--table-bg: rgba(204, 153, 0, 0.85);
--btn-confirm-bg: #cc9900;
--btn-cancel-bg: #b8860b;
--btn-close-bg: #8b7500;
--accent-color: #fbbf24;
}
/* Base Styles */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
--navbar-bg: linear-gradient(135deg, rgba(180, 14, 14, 0.95), rgba(140, 10, 10, 0.95));
--sidebar-bg: rgba(97, 14, 14, 0.9);
--popup-bg: rgba(180, 14, 14, 0.95);
--card-bg: rgba(180, 14, 14, 0.9);
--card-hover-bg: rgba(107, 10, 10, 0.95);
--table-bg: rgba(180, 14, 14, 0.85);
--btn-confirm-bg: #28a745;
--btn-cancel-bg: #dc3545;
--btn-close-bg: #0078d7;
--accent-color: #ff6b6b;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background: #000000;
color: white;
min-height: 100vh;
background-size: cover;
background-position: center center;
}
/* Background Layer */
#background-blur-layer {
position: fixed;
top: -10px;
left: -10px;
width: calc(100vw + 20px);
height: calc(100vh + 20px);
background-size: cover;
background-position: center;
background-attachment: fixed;
filter: blur(2px);
z-index: -1;
transition: background-image 0.3s ease;
}
/* Space Background */
.space-background {
position: fixed;
top: 0;
left: 0;
z-index: -100;
width: 100%;
height: 100%;
background: #000;
overflow: hidden;
visibility: hidden;
}
.star {
position: absolute;
width: 3px;
height: 3px;
background: #fff;
border-radius: 50%;
animation: twinkle 2s infinite ease-in-out;
}
.star:nth-child(odd) {
animation-duration: 4s;
}
@keyframes twinkle {
0%,
100% {
opacity: 0.5;
}
50% {
opacity: 1;
}
}
/* Navbar */
.navbar {
display: flex;
align-items: center;
background: var(--navbar-bg);
position: fixed;
width: 100%;
top: 0;
left: 0;
z-index: 1000;
gap: 20px;
padding: 12px 24px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.navbar h1 {
margin: 0;
font-size: 22px;
font-weight: 600;
}
.tabs {
display: flex;
gap: 8px;
flex: 1;
}
.navbar button {
background-color: var(--card-hover-bg);
color: white;
display: flex;
align-items: center;
gap: 8px;
padding: 10px 16px;
border-radius: 8px;
border: none;
font-weight: 500;
transition: all 0.2s ease;
cursor: pointer;
}
.navbar button:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
opacity: 0.9;
}
.navbar button.active {
background: var(--accent-color);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
}
#you-button {
background-color: var(--card-hover-bg);
border-radius: 8px;
padding: 8px 16px;
transition: all 0.2s ease;
}
#you-button:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
}
/* Content Area */
.content {
display: none;
opacity: 0;
text-align: center;
transition: opacity 0.3s ease-in-out;
margin-left: 40px;
margin-right: 40px;
padding: 100px 20px 40px;
}
.content.active {
display: block;
opacity: 1;
}
.content h2 {
font-size: 32px;
font-weight: 600;
margin-bottom: 24px;
color: var(--accent-color);
}
.content p {
font-size: 16px;
color: #ddd;
line-height: 1.6;
}
/* Dashboard Cards */
.dashboard {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 24px;
margin-bottom: 40px;
justify-content: center;
}
.card,
.card_2 {
background: var(--card-bg);
padding: 24px;
border-radius: 16px;
text-align: center;
transition: all 0.3s ease;
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}
.card:hover,
.card_2:hover {
background: var(--card-hover-bg);
transform: translateY(-4px);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
}
.card h3 {
margin: 0 0 12px 0;
font-size: 20px;
font-weight: 600;
color: var(--accent-color);
}
.card p {
margin: 8px 0;
font-size: 18px;
color: #fff;
font-weight: 500;
}
.card button {
margin-top: 16px;
background: var(--btn-close-bg);
color: white;
border: none;
padding: 10px 20px;
border-radius: 8px;
cursor: pointer;
transition: all 0.2s ease;
font-weight: 500;
}
.card button:hover {
transform: scale(1.05);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
/* Tables */
.table {
color: rgba(255, 255, 255, 0.95);
background: var(--table-bg);
border-radius: 12px;
overflow: hidden;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.table thead {
background: rgba(0, 0, 0, 0.3);
}
.table th {
padding: 16px;
font-weight: 600;
border: none;
}
.table td {
padding: 12px 16px;
vertical-align: middle;
border: none;
}
.table-striped tbody tr:nth-of-type(odd) {
background-color: rgba(255, 255, 255, 0.05);
}
.table button {
margin: 4px;
padding: 8px 16px;
border-radius: 6px;
transition: all 0.2s ease;
}
.table button:hover {
transform: scale(1.05);
}
/* Profile Images */
.profile-img,
.profile-img2 {
border-radius: 12px;
object-fit: cover;
transition: transform 0.3s ease;
image-rendering: -webkit-optimize-contrast;
image-rendering: crisp-edges;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.profile-img {
width: 80px;
height: 80px;
}
.profile-img2 {
width: 150px;
height: 150px;
}
.profile-img:hover,
.profile-img2:hover {
transform: scale(1.05);
box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4);
}
/* Popups */
.popup-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.7);
display: flex;
justify-content: center;
align-items: center;
visibility: hidden;
opacity: 0;
transition: all 0.3s ease;
backdrop-filter: blur(8px);
z-index: 2000;
}
.popup-overlay.active {
visibility: visible;
opacity: 1;
}
.popup {
background: var(--popup-bg);
border-radius: 16px;
padding: 32px;
max-width: 400px;
width: 90%;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
text-align: center;
animation: slideIn 0.3s ease;
}
@keyframes slideIn {
from {
transform: translateY(-20px);
opacity: 0;
}
to {
transform: translateY(0);
opacity: 1;
}
}
.popup img {
max-width: 120px;
margin-bottom: 20px;
border-radius: 12px;
}
.popup h2 {
margin: 0 0 16px;
font-size: 24px;
color: var(--accent-color);
font-weight: 600;
}
.popup p {
font-size: 16px;
color: rgba(255, 255, 255, 0.9);
margin: 0 0 20px;
line-height: 1.5;
}
/* Player Popup */
.player-popup {
background: var(--popup-bg);
max-width: 600px;
width: 550px;
border-radius: 16px;
padding: 32px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
display: flex;
flex-direction: column;
animation: slideIn 0.3s ease;
}
.popup-header {
display: flex !important;
flex-direction: row;
align-items: center;
gap: 20px;
margin-bottom: 20px;
}
#player-popup-icon {
display: block;
max-width: 40%;
height: auto;
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
#player-popup-title {
font-size: 24px;
font-weight: 600;
color: var(--accent-color);
margin: 0;
}
#player-popup-text {
font-size: 14px;
color: rgba(255, 255, 255, 0.8);
margin: 4px 0 0;
}
#player-popup-banstatus {
margin: 8px 0 0;
padding: 8px 12px;
border-radius: 8px;
background: rgba(0, 0, 0, 0.3);
}
#player-popup-bio {
margin-top: 16px;
padding: 16px;
background: rgba(0, 0, 0, 0.2);
border-radius: 12px;
line-height: 1.6;
white-space: pre-line;
}
#popup-buttons {
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 12px;
margin-top: 24px;
}
/* Buttons */
.confirm-btn,
.cancel-btn,
.close-btn {
background: #300c77;
color: #fff;
border: none;
padding: 12px 24px;
font-size: 16px;
border-radius: 8px;
cursor: pointer;
transition: all 0.2s ease;
font-weight: 500;
}
.confirm-btn {
background: var(--btn-confirm-bg);
}
.confirm-btn:hover {
background: #218838;
transform: scale(1.05);
}
.cancel-btn {
background: var(--btn-cancel-bg);
}
.cancel-btn:hover {
opacity: 0.9;
transform: scale(1.05);
}
.close-btn {
background: var(--btn-close-bg);
}
.close-btn:hover {
background: #005a9e;
transform: scale(1.05);
}
/* Forms */
.themed-form-container {
background-color: var(--table-bg);
color: white;
padding: 20px;
border-radius: 12px;
margin-bottom: 20px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.themed-form-container form {
display: flex;
flex-wrap: wrap;
gap: 12px;
align-items: flex-start;
}
.themed-form-container input,
.themed-form-container select {
padding: 10px 14px;
border-radius: 8px;
border: 1px solid rgba(255, 255, 255, 0.2);
background: rgba(0, 0, 0, 0.3);
color: white;
font-size: 14px;
transition: all 0.2s ease;
}
.themed-form-container input:focus,
.themed-form-container select:focus {
outline: none;
border-color: var(--accent-color);
background: rgba(0, 0, 0, 0.4);
}
.themed-form-container button {
padding: 10px 20px;
border-radius: 8px;
font-weight: 500;
transition: all 0.2s ease;
}
.themed-form-container button:hover {
transform: scale(1.05);
}
.themed-form-container label {
display: flex;
align-items: center;
gap: 8px;
cursor: pointer;
}
.input-block {
display: block;
width: 100%;
padding: 12px 16px;
font-size: 16px;
border: 1px solid rgba(255, 255, 255, 0.2);
border-radius: 8px;
margin-bottom: 16px;
background: rgba(0, 0, 0, 0.3);
color: white;
transition: all 0.2s ease;
}
.input-block:focus {
outline: none;
border-color: var(--accent-color);
background: rgba(0, 0, 0, 0.4);
}
/* Dropdown Container */
.dropdown-container {
margin: 20px 0;
padding: 20px;
background-color: rgba(51, 51, 51, 0.8);
border-radius: 12px;
width: 280px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.dropdown-container label {
color: #fff;
font-size: 16px;
display: block;
margin-bottom: 12px;
font-weight: 500;
}
#background-selector,
#theme-selector {
width: 100%;
padding: 12px 14px;
font-size: 14px;
color: #fff;
background-color: rgba(17, 16, 16, 0.9);
border: 1px solid rgba(119, 119, 119, 0.5);
border-radius: 8px;
outline: none;
cursor: pointer;
transition: all 0.2s ease;
}
#background-selector:focus,
#theme-selector:focus {
border-color: var(--accent-color);
box-shadow: 0 0 8px rgba(0, 188, 212, 0.5);
}
#background-selector option,
#theme-selector option {
background-color: #222;
color: #fff;
padding: 10px;
}
/* Toggle Switch */
.switch {
position: relative;
display: inline-block;
width: 60px;
height: 34px;
}
.switch input {
opacity: 0;
width: 0;
height: 0;
}
.slider {
position: absolute;
cursor: pointer;
top: 9px;
left: 12px;
right: 0;
bottom: 0;
background-color: #fff;
transition: 0.4s;
height: 16px;
width: 42px;
}
.slider:before {
position: absolute;
content: "";
height: 26px;
width: 26px;
left: -4px;
bottom: -4px;
background-color: rgb(241, 110, 70);
transition: 0.4s;
}
input:checked+.slider {
background-color: rgb(135, 69, 49);
}
input+.slider {
background-color: #616161;
}
input:checked+.slider:before {
background-color: rgb(241, 110, 70);
transform: translateX(26px);
}
input+.slider:before {
background-color: rgb(224, 224, 224);
}
.slider.round {
border-radius: 34px;
}
.slider.round:before {
border-radius: 50%;
}
/* Spinning Animation */
.spinning {
animation: spin 3s linear infinite;
width: 120px;
height: 100px;
object-fit: contain;
margin: 0 auto;
display: block;
}
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.ban-status {
padding: 10px 14px;
border-radius: 10px;
font-size: 14px;
line-height: 1.4;
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 14px;
}
/* NOT BANNED */
.ban-status.ok {
background: rgba(40, 167, 69, 0.15);
border: 1px solid rgba(40, 167, 69, 0.4);
color: #9be7b2;
}
/* BANNED */
.ban-status.bad {
background: rgba(220, 53, 69, 0.18);
border: 1px solid rgba(220, 53, 69, 0.45);
color: #ff9aa2;
}
.ban-status i {
font-size: 16px;
}
/* Mobile Support */
body.mobile-support {
font-size: 14px;
overflow-x: hidden;
}
body.mobile-support .navbar {
flex-direction: column;
align-items: flex-start;
gap: 10px;
padding: 10px;
}
body.mobile-support .tabs {
flex-wrap: wrap;
justify-content: center;
gap: 8px;
width: 100%;
}
body.mobile-support .card,
body.mobile-support .card_2 {
width: 90% !important;
max-width: 100%;
font-size: 14px;
margin: 10px auto;
}
body.mobile-support .content {
margin-left: 0;
padding: 20px;
}
body.mobile-support .popup {
max-width: 95%;
padding: 15px;
font-size: 14px;
}
body.mobile-support .dashboard {
grid-template-columns: 1fr;
}
/* Utility Classes */
.log-item {
color: #ffffff;
max-width: 100%;
width: 100%;
border-radius: 8px;
background-color: var(--table-bg);
padding: 16px;
margin-bottom: 12px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
.list-item {
display: flex;
align-items: center;
gap: 12px;
padding: 12px;
border-bottom: 1px solid rgba(204, 204, 204, 0.2);
margin-left: 0;
padding-left: 12px;
transition: background 0.2s ease;
}
.list-item:hover {
background: rgba(255, 255, 255, 0.05);
}
.list-item:last-child {
border-bottom: none;
}
/* Home Image */
#home-image {
margin-bottom: 24px;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
}
/* Responsive Images */
img {
max-width: 100%;
height: auto;
}
.spacer {
flex: 1;
}
.stat-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
gap: 16px;
max-width: 900px;
margin: 0 auto 48px;
}
.stat-card {
background: rgba(255, 255, 255, 0.06);
border-radius: 12px;
padding: 16px 18px;
text-align: center;
backdrop-filter: blur(6px);
transition: transform 0.2s ease, box-shadow 0.2s ease;
}
.stat-card:hover {
transform: translateY(-3px);
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.25);
}
.stat-label {
display: block;
font-size: 0.8rem;
color: #aaa;
margin-bottom: 6px;
letter-spacing: 0.05em;
}
.stat-value {
font-size: 1.1rem;
font-weight: 600;
color: #fff;
}
.player-platforms {
margin-top: 16px;
padding: 12px;
background: rgba(0, 0, 0, 0.25);
border-radius: 12px;
}
.popup-section-title {
margin: 0 0 8px;
font-size: 14px;
font-weight: 600;
color: var(--accent-color);
}
.platform-badge {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 12px;
border-radius: 999px;
font-size: 13px;
font-weight: 500;
text-decoration: none;
margin-right: 8px;
margin-bottom: 6px;
white-space: nowrap;
}
.platform-badge.steam {
background: linear-gradient(135deg, #171a21, #2a475e);
color: #fff;
}
.platform-badge.muted {
background: rgba(255, 255, 255, 0.1);
color: #aaa;
}
.platform-badge.unknown {
background: #555;
color: #fff;
}
.ban-form {
display: flex;
flex-direction: column;
gap: 14px;
}
/* Labels */
.ban-form label {
font-size: 13px;
font-weight: 600;
color: #ff6b6b;
letter-spacing: 0.04em;
}
/* Inputs & Select */
.ban-form input,
.ban-form select {
background: rgba(0, 0, 0, 0.35);
border: 1px solid rgba(255, 255, 255, 0.15);
color: white;
padding: 10px 12px;
font-size: 14px;
border-radius: 8px;
transition: all 0.2s ease;
}
/* Focus */
.ban-form input:focus,
.ban-form select:focus {
outline: none;
border-color: #ff6b6b;
box-shadow: 0 0 0 2px rgba(255, 107, 107, 0.25);
background: rgba(0, 0, 0, 0.45);
}
/* Duration Grid */
.ban-duration {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 8px;
}
.ban-duration input {
text-align: center;
font-weight: 500;
}
/* Remove ugly number arrows */
.ban-duration input::-webkit-outer-spin-button,
.ban-duration input::-webkit-inner-spin-button {
-webkit-appearance: none;
margin: 0;
}
.ban-duration input {
-moz-appearance: textfield;
}
/* Category Select */
#banCategory {
cursor: pointer;
}
.ban-form::after {
font-size: 12px;
color: rgba(255, 107, 107, 0.75);
margin-top: 4px;
}
.ban-time {
display: flex;
gap: 10px;
}
.ban-time input,
.ban-time select {
flex: 1;
padding: 10px;
font-size: 14px;
border-radius: 6px;
border: 1px solid rgba(255,255,255,0.15);
background: rgba(255,255,255,0.04);
color: #fff;
}
.ban-preview {
margin-top: 6px;
font-size: 13px;
color: #9aa0a6;
}
.ban-appeal-toggle {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 12px;
background: rgba(0, 0, 0, 0.25);
border-radius: 10px;
border: 1px solid rgba(255, 255, 255, 0.1);
}
/* Appeal text */
.appeal-text {
display: flex;
flex-direction: column;
font-size: 13px;
color: #fff;
}
.appeal-text span {
font-size: 12px;
color: rgba(255, 255, 255, 0.65);
}
/* Reuse your existing switch styling, but tighten it */
.ban-appeal-toggle .switch {
width: 52px;
height: 28px;
}
.ban-appeal-toggle .slider {
height: 18px;
width: 40px;
}
.ban-appeal-toggle .slider:before {
height: 22px;
width: 22px;
}
</style>
</head>
<body>
<div id="background-blur-layer"></div>
<div class="space-background" id="space-background"></div>
<div class="popup-overlay" id="alert-popup">
<div class="popup">
<img id="popup-icon" src="" alt="Icon">
<h2 id="popup-title">null</h2>
<p id="popup-text">null</p>
<button class="close-btn" onclick="closePopup('alert-popup')">Close</button>
</div>
</div>
<div id="ban-modal" class="popup-overlay">
<div class="popup" style="max-width: 520px;">
<h2 id="banTitle">Ban Player</h2>
<img id="accountimage1"
style="margin: 0 auto 12px; width:128px; height:128px; border-radius:10px; display:none;">
<div id="banStatus" style="margin-bottom:10px; display:none;"></div>
<input type="hidden" id="playerid">
<div class="ban-form">
<label>Ban Reason</label>
<input type="text" id="banmsg" placeholder="Enter reason for ban" required>
<label>Duration</label>
<div class="ban-time">
<input type="number"
id="banAmount"
min="1"
placeholder="Amount">
<select id="banUnit">
<option value="seconds">Seconds</option>
<option value="minutes" selected>Minutes</option>
<option value="hours">Hours</option>
<option value="days">Days</option>
<option value="years">Years</option>
<option value="permanent">Permanent</option>
</select>
</div>
<label>Category</label>
<select id="banCategory">
<option value="-1">Moderator</option>
<option value="2">Harassment</option>
<option value="3">Cheating</option>
<option value="5">AFK</option>
<option value="6">Misc</option>
<option value="7">Underage</option>
<option value="101">Sexual Behaviour</option>
<option value="102">Discrimination</option>
<option value="103">Trolling</option>
</select>
<div class="ban-appeal-toggle">
<label class="switch">
<input type="checkbox" id="includeAppeal">
<span class="slider round"></span>
</label>
<div class="appeal-text">
<strong>Add appeal message</strong>
<span>"To appeal this ban, DM @e12354 on Discord."</span>
</div>
</div>
</div>
<div style="display:flex; gap:10px; justify-content:flex-end;">
<button class="btn btn-secondary" onclick="closeBanModal()">Cancel</button>
<button class="btn btn-danger" onclick="ban()">Ban</button>
</div>
</div>
</div>
<div class="popup-overlay" id="confirm-popup">
<div class="popup">
<h2 id="confirm-title">Confirm</h2>
<p id="confirm-text">Nice confirm.</p>
<div class="button-container">
<button class="confirm-btn" id="confirm-action">Confirm</button>
<button class="cancel-btn" onclick="closePopup('confirm-popup')">Cancel</button>
</div>
</div>
</div>
<div class="popup-overlay" id="player-popup">
<div class="player-popup">
<!-- HEADER -->
<div class="popup-header">
<img id="player-popup-icon" src="" alt="Icon">
<div class="popup-header-text">
<h2 id="player-popup-title">null</h2>
<p id="player-popup-text">null</p>
<div id="banStatus" style="margin-bottom:10px; display:none;"></div>
<div id="player-popup-platforms" class="player-platforms"></div>
</div>
</div>
<div class="player-section">
<h4 class="section-title">Bio</h4>
<p id="player-popup-bio">This player has not written a bio yet.</p>
</div>
<!-- BUTTONS -->
<div id="popup-buttons"></div>
</div>
</div>
<div class="navbar">
<div id="you-button-container" class="d-flex align-items-center">
<button id="you-button" class="btn btn-info" onclick="viewProfile()">
<img id="profile-image" src="/img/DefaultImg.png" alt="Profile" class="profile-img2"
style="width: 30px; height: 30px; margin-right: 10px; border-radius: 50%;">
YOU
</button>
</div>
<div class="spacer"></div>
<div class="tabs">
<button class="tab active" data-tab="home"><i class="fas fa-home"></i> Dashboard</button>
<button class="tab" data-tab="Players"><i class="fas fa-user"></i> Players</button>
<button class="tab" data-tab="Rooms"><i class="fas fa-folder-open"></i> Rooms</button>
<button class="tab" data-tab="Server"><i class="fa fa-server"></i> Server</button>
<button class="tab" data-tab="Coach"><i class="fa-solid fa-puzzle-piece"></i> Coach</button>
<button class="tab" data-tab="Settings"><i class="fa-solid fa-gear"></i> Settings</button>
</div>
</div>
<div class="content active" id="home">
<!-- Dashboard Header / Hero -->
<section class="dashboard-header">
<img id="home-image" src="/img/DefaultImgGreen.png" alt="Dashboard Icon" class="profile-img2 themed-pfp" />
<h2 id="dashboard-title">Welcome to the Dashboard</h2>
<div class="stat-cards">
<div class="stat-card">
<span class="stat-label">Message of the Day</span>
<span class="stat-value" id="motd_msg">Loading…</span>
</div>
<div class="stat-card">
<span class="stat-label">RAM Usage</span>
<span class="stat-value" id="ram_mem">Loading…</span>
</div>
<div class="stat-card">
<span class="stat-label">Page Load Time</span>
<span class="stat-value" id="ms_ping">Loading…</span>
</div>
</div>
</section>
<!-- Main Dashboard Cards -->
<section class="dashboard">
<div class="card hidden">
<h3>Logs</h3>
<p id="logs">Check out logs</p>
<button class="btn btn-info" onclick="setup_html_show('Logs')">View Logs</button>
</div>
<div class="card">
<h3>Online Players</h3>
<p id="onlinePlayers">Loading...</p>
<button class="btn btn-info" onclick="viewOnlinePlayers()">View who is online</button>
</div>
<div class="card">
<h3>Total Rooms</h3>
<p id="totalRooms">Loading...</p>
<button class="btn btn-info" onclick="setup_html_show('Rooms')">View All Rooms</button>
</div>
<div class="card">
<h3>Total Players</h3>
<p id="totalPlayers">Loading...</p>
<button class="btn btn-info" onclick="setup_html_show('Players')">View All Players</button>
</div>
<div class="card hidden">
<h3>Total Clubs</h3>
<p id="clubs">Loading...</p>
<button class="btn btn-info" onclick="setup_html_show('Clubs')">View All Clubs</button>
</div>
<div class="card">
<h3>Total Inventions</h3>
<p id="inventions">Loading...</p>
<button class="btn btn-info" onclick="setup_html_show('Inventions')">View All Inventions</button>
</div>
</section>
<!-- Quick Links -->
<section class="quick-links">
<h2>Quick Links</h2>
<div class="dashboard" id="dashboard_quicklink"></div>
</section>
</div>
<div id="onlinePlayersPopup" class="popup">
<div class="popup-content">
<h2>Online Players</h2>
<ul id="onlinePlayersList"></ul>
<button class="btn btn-danger" onclick="closeonlineplayers()">Close</button>
</div>
</div>
<div class="content" id="Players">
<h2>Players</h2>
<div class="themed-form-container">
<form id="playerSearchForm" style="display: flex; flex-wrap: wrap; gap: 10px; align-items: flex-start;">
<input type="text" placeholder="Player ID" id="searchPlayerId" style="width: 100px;">
<input type="text" placeholder="DisplayName" id="searchDisplayName" style="width: 130px;">
<input type="text" placeholder="Email (Bio partial)" id="searchEmail" style="width: 160px;">
<input type="text" placeholder="Min Level" id="searchMinLevel" style="width: 100px;">
<select id="searchJrState" style="width: 80px;">
<option value="N/A">N/A</option>
<option value="Jr">Jr</option>
<option value="Non-Jr">Non-Jr</option>
</select>
<input type="text" placeholder="IP" id="searchIp" style="width: 100px;">
<input type="text" placeholder="Device ID" id="searchDeviceId" style="width: 100px;">
<input type="text" placeholder="Platform ID" id="searchPlatformId" style="width: 100px;">
<select id="searchOrder" style="margin-top: 10px; width: 140px;">
<option value="NewestAccount">NewestAccount</option>
<option value="OldestAccount">OldestAccount</option>
</select>
<button type="button" class="btn btn-danger" style="margin-top: 10px;" onclick="searchPlayers()">
Search
players
</button>
<div style="display: flex; flex-direction: column; flex-wrap: wrap; margin-top: 10px; gap: 4px;">
<label>
<input type="checkbox" id="searchDisplayHistory"> Search DisplayName history [no partial
matches]?
</label>
<label><input type="checkbox" id="searchPartialMatches"> Find partial text matches?</label>
<label><input type="checkbox" id="searchJuniorsOnly"> Juniors Only</label>
<label>
<input type="checkbox" id="searchBannedOnly"> Banned (excluding timeouts & related player
bans)
</label>
<label><input type="checkbox" id="searchOnlineOnly"> Online</label>
<label><input type="checkbox" id="searchIgnoreNoBirthday"> Ignore No Birthday</label>
</div>
</form>
</div>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">Id</th>
<th scope="col">Profile Image</th>
<th scope="col">Username</th>
<th scope="col">Platform Id</th>
<th scope="col">Device Id</th>
<th scope="col">Level</th>
<th scope="col">Player Created At</th>
<th scope="col">Last Online</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody id="player-list">
</tbody>
</table>
<a style="cursor: pointer;" onclick="setup_html_show(`CreatePlayer`);" class="btn btn-success">Create Player</a>
</div>
<div class="content" id="Server">
<h2>Server</h2>
<div class="table">
<h3>Community Board</h3>
<div class="card_2">
<p id="communityboard_player">Loading...</p>
</div>
<div class="card_2">
<table class="table table-striped">
<thead>
<tr>
<th scope="col">RoomId</th>
<th scope="col">ImageName</th>
<th scope="col">RoomName</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody id="communityboard_rooms">
</tbody>
</table>
<p id="communityboard_rooms_name">Loading...</p>
</div>
<div class="card_2">
<table class="table table-striped">
<thead>
<tr>
<th scope="col">Id</th>
<th scope="col">ImageName</th>
<th scope="col">ImageUrl</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody id="communityboard_images">
</tbody>
</table>
<p id="communityboard_images_name">Loading...</p>
</div>
<div class="card_2">
<table class="table table-striped">
<thead>
<tr>
<th scope="col">Id</th>
<th scope="col">Title</th>
<th scope="col">BlobName</th>
<th scope="col">Description</th>
<th scope="col">ThumbnailBlobName</th>
<th scope="col">SourceUrl</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody id="communityboard_videos">
</tbody>
</table>
<p id="communityboard_videos_name">Loading...</p>
</div>
<p id="communityboard_Message">Welcome to Rec_Rewild</p>
</div>
</div>
<div class="content" id="Coach">
<h2>Coach</h2>
<input type="text" id="announcementText" placeholder="Enter announcement" style="display: block; width: 100%; padding: 10px; font-size: 16px; border: 1px solid #ccc;
border-radius: 5px; margin-bottom: 10px;" />
<input type="text" id="announcementid" placeholder="Player Id (optional)" style="display: block; width: 100%; padding: 10px; font-size: 16px; border: 1px solid #ccc;
border-radius: 5px; margin-bottom: 10px;" />
<button id="sendAnnoucement" style="display: block; background: var(--card-hover-bg); color: white; padding: 10px 15px; font-size: 16px; border: none;
cursor: pointer; border-radius: 5px; margin-bottom: 20px;" onclick="sendannoucement();">
Send Announcement
</button>
</div>
<div class="content" id="CreatePlayer">
<h2>Create Player</h2>
<input type="text" id="platformid" placeholder="Enter Platform ID" style="display: block; width: 100%; padding: 10px; font-size: 16px; border: 1px solid #ccc;
border-radius: 5px; margin-bottom: 10px;" />
<input type="text" id="discordid" placeholder="Enter Discord ID" style="display: block; width: 100%; padding: 10px; font-size: 16px; border: 1px solid #ccc;
border-radius: 5px; margin-bottom: 10px;" />
<button id="createplayer" style="display: block; background: var(--card-hover-bg); color: white; padding: 10px 15px; font-size: 16px; border: none;
cursor: pointer; border-radius: 5px; margin-bottom: 20px;" onclick="create_player();">
Create Player
</button>
</div>
<div class="content" id="EditPlayer">
<h2>Edit Player</h2>
<img id="profile-image" src="/img/DefaultImg.png" alt="test" class="profile-img2"
style="width: 150px; height: 150px; margin-right: 0px;">
<input type="text" id="editusername" placeholder="Edit Username" style="display: block; width: 100%; padding: 10px; font-size: 16px; border: 1px solid #ccc;
border-radius: 5px; margin-bottom: 10px;" />
<input type="text" id="editdisplayname" placeholder="Edit Display Name" style="display: block; width: 100%; padding: 10px; font-size: 16px; border: 1px solid #ccc;
border-radius: 5px; margin-bottom: 10px;" />
<button id="save" style="display: block; background: var(--card-hover-bg); color: white; padding: 10px 15px; font-size: 16px; border: none;
cursor: pointer; border-radius: 5px; margin-bottom: 20px;" onclick="edit_player();">
Save
</button>
</div>
<div class="content" id="Settings">
<h2>Settings</h2>
<div class="dropdown-container" style="margin-bottom: 10px;">
<label for="background-selector" style="font-size: 16px; color: white;">Select Background Image</label>
<select id="background-selector" style="margin-left: 1.5px; padding: 5px;">
<option value="Stary_background">Stary Background (OG)</option>
<option value="dorm_room.jpg">Dorm Room</option>
<option value="rec_center.png">Rec Center</option>
<option value="FriendFest2.png">Friend Fest</option>
<option value="Orientation.png">Orientation</option>
<option value="Lounge">Lounge</option>
<option value="3dcharades.png">3D Charades</option>
<option value="wwww.png">Cool thing idk what is it</option>
</select>
</div>
<div class="dropdown-container" style="margin-bottom: 10px;">
<label for="Theme" style="font-size: 16px; color: white;">Select Theme</label>
<select id="theme-selector" style="margin-left: 10px; padding: 5px;">
<option value="red_theme">Default Theme (red)</option>
<option value="green_theme">Green Theme</option>
<option value="blue_theme">Blue Theme</option>
<option value="purple_theme">Purple Theme (OG)</option>
<option value="pink_theme">Pink Theme</option>
<option value="orange_theme">Orange Theme</option>
<option value="yellow_theme">Yellow Theme</option>
<option value="dark_theme">Dark Theme</option>
</select>
</div>
<div class="MuiFormGroup-root css-1mgm2yh-control">
<label class="MuiFormLabel-root MuiFormLabel-colorPrimary css-bngtud-label">
Enable Mobile Support
(beta)
</label>
<label class="switch">
<input type="checkbox" id="mobile-support">
<span class="slider round"></span>
</label>
</span>
</div>
<div class="MuiFormGroup-root css-1mgm2yh-control">
<label class="MuiFormLabel-root MuiFormLabel-colorPrimary css-bngtud-label">
Enable Better Popups
(beta)
</label>
<label class="switch">
<input type="checkbox" id="better-popup">
<span class="slider round"></span>
</label>
</span>
</div>
<div class="MuiFormGroup-root css-1mgm2yh-control">
<label class="MuiFormLabel-root MuiFormLabel-colorPrimary css-bngtud-label">allow notifiyed</label>
<label class="switch">
<input type="checkbox" id="allow_notifiyed">
<span class="slider round"></span>
</label>
</span>
</div>
</div>
<div class="content" id="Logs">
<h2>Logs</h2>
<div id="logs-content"></div>
</div>
<div class="content" id="Inventions">
<h2>Inventions</h2>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">Invention Id</th>
<th scope="col">Image</th>
<th scope="col">Name</th>
<th scope="col">Created At</th>
<th scope="col">Modified At</th>
<th scope="col">Permissions</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody id="inventions_list">
</tbody>
</table>
</div>
<div class="content" id="Clubs">
<h2>Clubs</h2>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">Club Id</th>
<th scope="col">Image</th>
<th scope="col">Name</th>
<th scope="col">Created At</th>
<th scope="col">Members</th>
<th scope="col">None</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody id="clubs_list">
</tbody>
</table>
</div>
<div class="content" id="Rooms">
<h2>Rooms</h2>
<table class="table table-striped">
<thead>
<tr>
<th scope="col">Room Id</th>
<th scope="col">Image</th>
<th scope="col">Room Name</th>
<th scope="col">Description</th>
<th scope="col">Creator Player Id</th>
<th scope="col">Max Players</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody id="rooms_list">
</tbody>
</table>
</div>
<script src="/admin/home_page.js"></script>
<script>
function splitTest() {
}
document.getElementById('mobile-support').addEventListener('change', function () {
localStorage.setItem('mobileSupport', this.checked);
toggleMobileSupport();
});
document.getElementById('better-popup').addEventListener('change', function () {
localStorage.setItem('betterPopup', this.checked);
toggleBetterPopups();
});
document.getElementById('background-selector').addEventListener('change', function () {
const selectedImage = this.value;
if (selectedImage) {
localStorage.setItem('backgroundImage', selectedImage);
setBackgroundImage(selectedImage);
}
});
document.addEventListener('DOMContentLoaded', function () {
const savedBackground = localStorage.getItem('backgroundImage');
if (savedBackground) {
document.getElementById('background-selector').value = savedBackground;
setBackgroundImage(savedBackground);
}
});
function setBackgroundImage(imageName) {
const backgroundLayer = document.getElementById('background-blur-layer');
if (imageName === "Stary_background") {
backgroundLayer.style.backgroundImage = ``;
document.getElementById('space-background').style.visibility = "visible";
return;
}
const imageUrl = `/img/${imageName}`;
backgroundLayer.style.backgroundImage = `url(${imageUrl})`;
document.getElementById('space-background').style.visibility = "hidden";
}
function toggleMobileSupport() {
const isChecked = document.getElementById('mobile-support').checked;
if (isChecked) {
document.body.classList.add('mobile-support');
} else {
document.body.classList.remove('mobile-support');
}
}
function toggleBetterPopups() {
const isChecked = document.getElementById('better-popup').checked;
if (isChecked) {
document.body.classList.add('better-popup');
} else {
document.body.classList.remove('better-popup');
}
}
function closeBanModal() {
document.getElementById("ban-modal").classList.remove("active");
}
function create_player() {
var platformId = document.getElementById("platformid").value;
var discordId = document.getElementById("discordid").value;
if (!platformId) {
showPopup("Warning!", "Please fill in both Platform ID");
return;
}
var formData = new FormData();
formData.append('platform_id', platformId);
formData.append('discord_id', discordId);
formData.append('device_id', "1");
fetch('/admin/api/create_player', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
showPopup('Success!', 'Player created successfully!');
viewPlayer(data, false)
})
.catch(error => {
showPopup('Error!', error.message || error);
});
}
function ban() {
var playerId = document.getElementById("playerid").value;
var message = document.getElementById("banmsg").value;
var category = document.getElementById("banCategory").value;
const includeAppeal = document.getElementById("includeAppeal")?.checked === true;
const amountInput = document.getElementById("banAmount");
const unit = document.getElementById("banUnit").value;
let totalSeconds = 0;
if (unit === "permanent") {
totalSeconds = INT32_MAX; // backend convention
} else {
const amount = parseInt(amountInput.value, 10);
if (isNaN(amount) || amount <= 0) {
alert("Please enter a valid ban duration.");
return;
}
const multiplier = unitMultipliers[unit];
totalSeconds = amount * multiplier;
// INT32 clamp (absolute safety)
if (totalSeconds > INT32_MAX) {
totalSeconds = INT32_MAX;
}
}
// 🔒 Final payload
if (!message) {
showPopup('Error!', 'Reason is required.');
return;
}
if (totalSeconds <= 0) {
showPopup('Error!', 'Duration must be more than 0.');
return;
}
var formData = new FormData();
formData.append('playerId', playerId);
formData.append('message', message);
formData.append('duration', totalSeconds);
formData.append('category', category);
formData.append("includeAppeal", includeAppeal.toString());
fetch('/admin/api/ban_player', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success === false) {
showPopup('Error!', data.error || 'Unknown error');
return;
}
setup_html_show('players');
showPopup('Success!', 'Player banned successfully!');
})
.catch(error => {
showPopup('Error!', error.error || error);
});
}
function showPopup(title, text, iconUrl) {
const popup = document.getElementById('alert-popup');
document.getElementById('popup-title').textContent = title;
document.getElementById('popup-text').innerHTML = text;
const icon = document.getElementById('popup-icon');
icon.src = iconUrl;
icon.style.display = iconUrl ? 'block' : 'none';
popup.classList.add('active');
}
async function showLoading() {
const popup = document.getElementById('alert-popup');
document.getElementById('popup-title').textContent = 'Loading...';
document.getElementById('popup-text').textContent = '';
const icon = document.getElementById('popup-icon');
icon.src = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjgAAAI4CAYAAABndZP2AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCA1LjEuMvu8A7YAAAC2ZVhJZklJKgAIAAAABQAaAQUAAQAAAEoAAAAbAQUAAQAAAFIAAAAoAQMAAQAAAAIAAAAxAQIAEAAAAFoAAABphwQAAQAAAGoAAAAAAAAAYAAAAAEAAABgAAAAAQAAAFBhaW50Lk5FVCA1LjEuMgADAACQBwAEAAAAMDIzMAGgAwABAAAAAQAAAAWgBAABAAAAlAAAAAAAAAACAAEAAgAEAAAAUjk4AAIABwAEAAAAMDEwMAAAAADp1fY4ytpsegAAh3RJREFUeF7t3Qe85FZ5N/5H0szctr15vbvuZm3jSjHFYOMaA0mAP3woCaEETADXpeQlCYSaAMEBgjG2wZhmsAEDITQ7QOiEN4S8wTb2rrd6e293b5mi8n+eI517NbqaGelOn/l918ejmTsadZ1HR+foEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHQ54xenDmwNhmvwgtdajOB1tpJOpxJMvz6Yfn0w/fpg+vXB9OuD6deno6ZvG/xz9f4iAAAAQEcxg1cAAACAnrBzvjGOAAcAAAB6ymPHGVsQ4AAAAEBPMTzajQAHAAAAekrO8bYjwAEAAICesmicNiDAAQAAgJ5y2j7vcQQ4AAAA0FNyHjkIcAAAAKBn7JpnjPPLrxM/6O9gjujB+TkyjXBMpEcN/0T4SYKNeIZgrScjNmIa1XTe9PUU/b9g+ZsLy18dlr+5sPxRWH5fby5/+PdMfudP3+Ch848UaWEx2fR+utp45PL13jmJA5wfLcnQ9WedRI4tXzfJlQ8NlzyvOONpgW7wiVdj3cjE5dvazN8RvJAVfqfW+Io381O37Pd4Gar+fuyvhrRufFO9j+BtUEl0/ZUvtxZaf5Hfx/LL/7H81WH5sfzBYASWX/6P5a8uMj4vj54jk/Nuwx1Uw45p02fX76A/OmCr97X8ZLX54yvWu1fJPMStthn+fbFF152+khxHxghmmmfGdByyIr/gBQsVXqF6OLoS/ffTK1mP4n+NA6ngg7TjKzHBTXRj+L87PX45c8b0olo9vr/TRMTs5P7XZq6/eNPjl08Py4/lDwYrwPKr/6vhmbD8WP5gsAIsv/q/Ghbl7zNkuhl+Z5JjFenTW3bT8w45wd+q+89TrLuetcW5RtZXjVnw3b/YpBtOOp7coNqOzIjF85Fx7BkrRegVGi3NiW4g3gTBkE//Vr3jTysPcsq/ze/N6CflTLd8/KhWjz/z1+LHr7T+ZiofP/o1LD+WvxosP5a/Giw/lr+a6PheOFhTBRRZNYeOVaDbt+2j5x9OFuCsXWb83RP3eR9KHuAssujGVcvJMCw1YVlhUnKT4zVZHnSUr1C9gvUKjwYg0QBF/1a9408rX8HRP7d6B41KO36wGkLix6+0/mYqHz86t1h+LH81WH4sfzVYfix/NdHx3UiA4xkmOfwd1yzSp7fvoyv2F4I/Vlc06M8GPPpqqgBnzcogwAmthpxrcVARWYggABJ6xerXGQGKej+9UHo7+F+bWcSWdHwlOl9Mz5fm/26ljYQiSix/MFgBll/9Xw3PhOXH8geDFWD51f/V8Ez9t/zh95JXO6Ysg6tuUd21dR9dnjDAYS/j0e+T9VVjFnwPSICzYjrAUYECBxAmlQc8ShBYhIMJvYJnbLDIytF/19+P1udJOv6USJCjf0crKxKLMSN4i2j1+DOWr8L4ldbfTNXXH5Yfy18Nlh/LXw2WH8tfTXT8cImOxA92xiObHP7cpi9t2csBTjH4a2U75ltjq446Z/Dou6pPPYasAEk6kpSZkMHp5Ac/4eCmmvJx/Q0hSb+vJTyuJD1+paTnTae474RT9PvRFDdOOMWNE061RL8fN424FF0fsxWdfjSFpxmX4sYJp1qi34+bRlzC8vtJv5+t6PSjKTzNuBQ3TjjVEv1+3DTiEpbfT/r9bEWnH03hacaluHHCqZbo9+OmEZew/H7S72crOv1oCk8zLsWNE05JSNBjm1JyI0tU26Yluc3807tkOHUJjhWU2Mi9PZlBXSdHSzjPTZNsFbRPrfWjI2jZOcKatVzR+Wn29LH81WH5/Vcsv/+qYfmbA8tfrv3LP12CI+2ZXMugSXOCziwepPvWF2h+oXqJkfjZ6UM/vGzj5NUynKIER2ZNvu7f10safckKq5ZqiRsnnLpd3DKFU6PJZgunuGmGU7PFTTOcGg3Lj+XH8mP5sfydv/zSSluSFKe8dWc+UXAjBkrutmAweQnO/Ysy9JYVxwd1cGQkPzbS77VoJSiZ0WqikWJU2vGTBl7tUmv96Pd6ufRro5YL0w8GAph+MBDA9P1XTL/8FdP3X+uF6QcDgUrTFzJtL0s0lpmg2zftoucfiny5gvVLs397xv7Sh2U4RQlOaCFrVBwCAAAAqIcEPIbBgUeKAOvkA6XHg8F0AU45/3YVNJZErTpqbgdMH9PH9IM3bYDpY/r9NH09PT3N6HtV4mMaNJLJ+R8kIL2IB4MpIxQpuUHpDQAAADSQDmqizhsv0HmHazcPF7oXcf8dimAAAACgA8ktqmt3jibuRfyx5ebjHCepJuICAQ4AAAB0FnkIIKcKBTuxPMPbHQwqiQMcQ/6ZnIxIkkpAoRQVvqcWl2qJGyecoqLz02kpqtLyRN/H/dZsUlR42uHpRd/H/dZsUlR42uHpRd/H/dZsUlR42uHpRd/H/dZsUlR42uHpRd/H/dZsUlR42uHpRd/H/dZsUlR42uHpRd/H/dZsUlR42uHpRd/H/dZsUlR42uHpRd/H/dZsUlR42uHpRd/H/dZsUlR42uHpRd/H/dZsUlR42uHpRd/H/dZsUlR42uHpRd/H/dZsUlR42uHpRd/H/dZsUi0z5oVjDn7nDycwUPKmmogLlOAAAABAR5GwRpKRJDIKLJygTcGgggAHAAAAOoo8lqZkueSleI7y6Xu9zcGgggAHAAAAOoq6VWWlC1HCTcQFApwOU3b/sQ0wfUwf0w/etAGmj+n30/SllKZasnMmDWTKe0uoZOd8c4xfppqICwQ4AAAA0FGks80SJ8tKFuBsXJItayIuEOAAAABAxzn76DE651AheFedQc6eYHAKAhwAAADoKK7h0k3bD9HCfFm1mopyNpU1ERcIcAAAAKCjuIZNlpEsuBELx72yJuICAQ4AAAB0FM/UT8JJ5sQjzlQv4hoCnJbRG6vRKSruO9VSVNx3qqWouO9US1Fx36mWoip9DpBGeB+rlqLivlMtRcV9p1qKivtOtRQV951qKSruO9VSVK2/Q7+QW1Rp+mkYsqkUDE5BgAMAfcPzkj80DADa57zxIp0/mizI3T3PmOCXsibiAgFOnUzDoHw+T67rUrEgtb2rX3nICg8naBV/u0gG5zgO5XI5ZHZ9Sra/HK/y6jglHrZ5X3DKUiU4fltLtlEmkyG7NOPiHHpCKK/0yo+oG3aO0bJkDaho3XHlvYhr0stDorP8A4uytGbVSjI9v026Z/gzk6KbiJ4kJ8rdu3aRw68uH4xTD1KMbCzVM6q8RNaXPMyoLhWmk1ivjl/hc4MsMkyTli5dSgMDA4mfsQC9QS5IisUiHTp8mEr8Opmf9D+P7i78vTgzjt9omNMrx09STR7ftj11nMrFyNw5c2jR4sXBX6A38EWnxBJ6Pwht/49t30bPO5wswvnJE6z/uGKDc2XwdgoCnDrJgbdu7Ua+1OB1keH3dvAH6GjLjl9ICxct4owtcoKFniYBTsm2acuWLRzg8MmrUmFNpd0ifL6T4bg4KOlFS6VzJ8b3yd8lyXt+XbB4hI5fsUL+Aj1DAhqTN+90gKOCEt7mH9uxlZ53qOh/XsOvTjU/f/Fm93XB2ykIcOqUzWbpod8/qraTHICRrjBC/Mg0ur7qLsGZcSYuvwKqrVfHj37uGx/Pk80XBctXLlGlODZndtB/NmzYoF5HRgbVa7TEpkIBTsze1qn7f1KdPL78zaT85CTl8zYtWbKAlvAxC73B5LzQ5O0tx5DD8YR0EWF5sv1dkhZUH9++nZ57KNn5+dHjzHedvdf9x+DtlMQBzv2LMrRmBQc4VB7gmInD9d4kV4SPPLxeDS9dPo88mzeQKmbTr0wVv0UP5NkKflOZzW/2y/j8vej659eJyQmanHDpuOWLaPGipX5NfegD/nY2TYMsK0Nr166jUp5o/qJB/kzOaXzlyH+Tk251Sfe/SjD+tBrj8/FqmhmamJigsbEiLVw0QiuOLy/BaWe/TVAfOdYkoJHSm5I5HeCYVCTHKtJtOw/QZfuT1b2azNArh226J3g7ZTZ7KFRTFtxEhxut3t/t1fH5s7j1r14D+p4v9CfJGOvOHIP9atYwftXx5XgNH7PQcyTICR+G8l4CHceSkpvk2z6uibjAWb6l9AFdT4oT971KKU7c9yqlOHHfq5TixH2vUoqT5DsAaUT3KZ3ixH2vUooT971KKU7c9yqlOHHfq5TixH2vUooT9z1J0C8kyJkqPTUNKmb4k4QXIDvnm+P8MqOJuECA0+30Vc5sr3b6cXw5cGYzLYCo2ex/YRi/vvGhq0VvMarHeHBUctZEic45WvlxDWEblmRim4gLBDgtJpWewgnaCSdUkH1A7wd6uPJ+geMXoPFM1+Tjya+HY1sG3bRznJYmfAYOjzKjF3ENAU5L8AkTVyeto9Y11jekgOMToOWkFXH4OkGqHDumPBsn+dXDQEwv4hoCnFbik6g0fwsndWKtJ0XFfadaior7TrUUFfedaikq7jvVUlTcZwBpRfezIM04fqNixqmaouK+Uy1FxX2nWoqK+061FBX3nWopquxvMX+HniGlNTqVbXPTqPigzTgLJp0ZvYhrCHAAAFjtJuIA0EgqpAliGdWiitP5YxN0/rHkXXOcdNDZEgzOgACnwaai0vCwfq++AQDtIidQOZGqYCY4ocpJUAc38j6udBzHL0Dj6QfdSh4pR9iAQ/TmHUfp+ELMQVjBkBPfRFwgwAEAAIC28AxXpWnJg5s9cym2F3ENAU6L6StBXBECdB8cvwDNIaU4nulV7CYlzrrlxlb+emwTcYEAB/pP8gsEAABoGnWD2A9uDFc9AydNUMKn8opNxAUCnCbT9/v9zTgzQbPUWMO6fyroXwh0O48clzrh+Ox5ur6b1MWR4EaegZP0CcYi43gVm4gL7EEAAADQBjqY9W9RuSrASR7hLJygjcFgLAQ4AAAA0HJyd0PCGV2SY1hmmgIcOm0/bQ4GYyHAAQAAgJaaqr4xlVxyzSIHJcmr71drIi4SBziG/AueMBhOUG5qYwXDUfo5GzpBncL37MNpSnh4pumDK1mqV9xvpkn1ivvNNKlecb+ZJs2e7Ad634juE9MnVPXoeDmtRfYns0KCOsk6DKeQ6XzG47yHtxpvl3DeIyluH6mW6tXo3+t3kgdafPhJMvg4NDN5GsiW7weVVOtFXEv2SwDdTJ04OelXAABoM30+1hcLLj1xfJLOPliUP9a0cWmuYi/iGs72AAAA0HL6ScZChq/bnqcFxYRFY171JuKiKwIcz+uCskCLk4sySwCARnFdlxzX4Twg+AB6jgQ20oJKmomnqWE8YHvbg8GKuiLAkXutjuNQqVikXC5HmUyGTP4sTN5bpkkGBxmSJCiaTUo7fn5ikrJZjm+C2bF4C0nS94j1e51kPsMpXB9HEjSIvqevij7L8WrnbWfwduMNB30lkzGpZBfUPiDkGJXToGHIFUpXnA57nGwDnfg4Dc7FYmJyYuq8q+nzrGmZiZLkEWnSjPN1kDQ9L/JdyZfi8iaoTQIcm5PjJa9gPC/vVG1BJSRPTZStPrAoS2tWrSTTkxMBjyS1vlgrMmW1o1kcHvCOIxG9y8GOzUm/SuAzMTlJhUKBSvmCGkdW2GzoimNJx3eKchASZXNECxfN4+DI4U+lNrhsKDdUES3+5OmGDlYRLrKDBGICmHj8Pf7usWPjVMh7vD9xZmdl+OrQ5p04+EoC9e7u9W5eTL8+bsk/Vkt83JoZPmYXDqnPpzOt5CdYpawPHUhtxvE7/V6d7/l0Oj4xzheSREMjBhWD2xc6H9Snz8hptLKUO2B2oHyEQd55BgYGaGhoSL06vEeqYEgCmyAo0iT4iZ7fIYzzdddfX45l07HBPH1py166fH+yOjiTFr1y2KF7grexOj7AMTlCcDmKV4EN7+0m50wTvMMfPXqUxscL5Eg8w7MiGZbMkpzAxGwDBb08ScfniwJyeJpysly6dD6/4QwzJsBxg/UVrXkvBwjUIWWAc/TomMrcZHOkuFiAHiHHqRyzJf8wpcVLh8quyNWHaSDAqU+NAEeChPHxCeLrVxoeNvnY9dc3ZwlKNNCpJXW+INerIVaWp82fTZ07eH8aHs7Q/PnzaWRkmCy+aFKBDu9kqnSHlw9BTjW8nvj/rmnTqc4o3bP+IC0MtnECL+PNeV8wHKvjA5xcLsM7+BiNjo7S2Ng4TYzKmYnJ5CXxupCdLpeTnSpDAxn/tkOrSnAs/nfo0KjKMBcvrlyCgwCnSRIHOMKksWN5yuddmjdvmE+gnrplkcZs9ystuv3TwvSDgVnyHEfdmty/95h6jwCnzVIFOHKeH5z6W5gZnF9rSbP/eEEUo29DKRxZObZDxaJNDv9ZB0x8/a12nYWLR2iEZ3RkzhwV6ISXR8jtKwQ80zxZP+oYculj23fQ8w77d2Bq2TuXJo87Rqfz6q/aiqrjAhypayNFf7LAcstpcnKCDh48RBMTNgcwRFlOkilZwS0reRXRHT5K79jJT7D+zq25wYlMLfXUQWny/Hp0+PCkmreFC+aQpVYIfzfYaNMHVPmOrpUdPJBe0gAn2H75CZeDHJuG5xANDQ3U3G+g28n+oY9H3l3kgPQyfMyOqyvxxUtG+OIkcpmeRvC7MEs1j1+zLMCRW0Nh6Y/f+raX1N0TckdBvQbZpz6Pjx72byFkOQ6bO3cOLVu2jPMGqeMleVWG7JKDACcgq1IOR8mTLc+mm3fs5AAn2e2pn66mdZevp7OCtxUlzB1aZ3BwUAUtR48eoY0bH6fdu/fxFbdNUjAzMGByyk5V5pKkHgKlg4pGJjlxxSX9twjssx1Mb7cwdZ4KtiVS76ap4zWcoHdEt22NFN0/Uiad31iWBCycOA+SlMlyvsRpeG5GBTe2TRxEj9GGDZvVhXqGMzDbLiG4iSGFB35BQPJ1w1uhZhNx0XEBjkS627dv57SXpIRPdhQp0JkzMkC5AUuV3kiaDmq6g2zAuATtI0/mBoDOpQIKzgekoMavvyvnfD/5eUC7Tc+PkAvwEc6r5s3L0dCQlPATbd68nXbu3EElVfELyrmqJMcxZXsGHyUwYFPVXsS1jgtwNm7cqOrbcFCsdpb583O0cNEimjNnmDKGf1uqk0mEHk5SdKmLL1WTx0gCAIDuJvmSBFyqKTpnXvI4k6HhIZKqC9LwZf/eUdq06fHg21DOJYezdc4Rg/e1zZ/0NgWDVUkMnOhXm1UHJ5u1KJ/Pq2K8Xbt2U2mSyJISmzmDKsDhKIG/5UfHQp5RExYtBdF1bKKf+5V+p/8+JXIPeGr84PvaVB0c9XceR41nkqeKIsfV1cWiRXP9Zsc8v4b6oh+dCjcUS4br3cyYH0ipfPvNJH/nbWfwWYb33fHxEu9rxFdYFmVznR8wQ53kOFXHrn/8qjoUbk4ds47t0cLFQ3zsTh/rqfeH4LwAs1SjDo5sj/GJSZqcIBoZkSb+2akKxVKVIXEdxkZtp8j8ziyFn7k8jm3zMhRU683BQYOWLz+eL+Atnn9pccVX8n3Kr4PDwQ0ffyXLpc89vpuuOJCsDs5Yll41t0RfDt5W1PYAx3FKaifevHmLXxOdSYsoCW6ktYMRacvb6QGOLQ/GUQGOfM+ZCnA8IzPjYJTllq/pk2rqkyvM2H4zyd952xkSeJo0elSCaQQ4fUPvH8HxG65kLAHOsuXzpioZ6xLVxJmmQIBTnxrHrxyfExMTxDEOjQwblMlyUNBlAY4mgc7YWEHlc6eeeoL6LCsVdvqUDnBsDm4KGZe+uIUDnITPwGE1m4iLtgc4ExNjquQmx5F5Pl9SJTcq47f8J0byLhx809cLAY5ufiisKgcEJFFr/cnfeX3HlODkBvr36qlv1Ahwoq2oUgU3Svl5AtKqfvxKHjA+kVclOMMjREOD0sLWJ8GOK221k+iAAEeMHRtXyyQPLDzxxBU0NMQL1ackb3T4X5GDm8mcR/dsShbg7Jxvja886qzm0as2ERctD3DkSY+OLqrhk8PGjZumSm7821ID6iTjev5Jx+RgQHYIrWMCHMEnSpnQoYNj0wGO1Irm7+pZngpwTMM/ucpwKMApBk9ehkaKOckE28+1TQ5wXJo3f0CVFDbsxAedKSbAkdtURw5PcoDDmeYcUx274XOMiL6H9pB6LRMTDpX4NCmPwJk7dzrA6bYSHOHYnJlP8r7H2VsmY9App5we/IXH5H2un1pZTQc4Nq0ujdOX1x+iZYXay/+z04cfvWzjxNnB26oSBzj3L8rQmhUc4FB5gGMmfva1v4PJbSd5ErGcQDZt2qZOLlIRS92SyuUiAUgouAl20GiA4ugIIqoVGZcEOJwOHjyqnqlh8Vv1IGPoaHJilGfgyGPYM3z14N++0qqfoKInOARIbRbdHpXo7cTft/kgnZwoUamE47XTyTk1nMUs4AsTnSdUDUIrHpfRzxPuP0nE7ovln1lWlkrFkup+oliUAHuQVq1axfuhrSon91tg7XKAU8gW6Y7H99DVh5IdjL84bfAnz9mUvyJ4W1XLAxzTlP6kPNq1azuNjRWD1lKc2eTk3ir/1lQJjf/9zg5wZB1k6NjopGoCKLfZrGB9zIzsw9IeVPUelL02fi2Vf1+eQmplLNXKQT1uwORLQwQ43WuWAY5kMlLYmrFyyX+jonrH71fVjx2X5Li0yzKo4dDDOTsuwBEz9qXy91KpWB4SWOToRhrW5CeJ5i8cppNOPpkmxsfVRX4/8QOcPN2xdS9dfXD6VnE1vzkp98WLthZfG7ytquUBjijyht26fYcalh02m83xhvebVU8HMP73OzrAYVLkbduuKiqVeU3WVUTag6reg7LXxq+l8u9LRVJ5/o2/X8nvyrNIkx1YCgKczpIywPFvUcm5xn8vFVb9nsTrUHeA1KdqHjvV/95tAY66nRb8Xc5BUn/o4OFxNUvHr1pKc+fOVaXL/XSryvMcmhzI06elBOdgrf3B98hxmfecs9d+f/C2qpYHOPL04U2bNnH0KiUeHOAMz/VLdXhBpX7N9E7rf7+TAxx9/1f6HJH5lI2l6wjFBzg1DqZ6M8+eH7/W70XGj5Hl/c/lfUa2nWwvvQ0Tq3cZobGi26OSYDvpenDqvMKfqf1gqtQ4YCQMeIP6iFCnSuub129Gun4PkRLYsIpBTsXjMvp5wv0nqRn7Y/n7UsmhjCVPP7bIMi06OjZO48cKarbOOPs0lZdIgDNdT7XKMvYA6btxYqhAd2zZnTjASdpEXLQ0wJE+Ofbt20f7dh2l7DDR4kULyJYbkVP4O+FbPLyT6veV6BOWNvW2aRlPtd9NMs1aB5T+e/S39Pt+H7+WWr8vKk1D1Bi/3QEOph8MpBQ7n5XmPc0yzXJ+IFBtXcu65TSbbT5je+v3dW6vWvt/1XmVv5lTpcjC4QD72LEx9fy3hUtH6IQTTlL1cSTAkeBbgpteDXCksMLgi8xjI3n64taD9Jy9iRvcJGoiLurc2slJKY080E+eUixdzHMAS0V58tGUyI7S6hMnAPQRnF+g1WSfk0eITAcsErxI3U0jK49MkYrHfp7olzD7qWepPN6l8yZKdF7CTjalF3F++bX/rraWBTiyIaVX8PyYpyoWSyVPW5oxJCQlM5HCGkV/XunvjedH4bNL0iQg7vMgqVZZ8hoMl/1d3vf7+OH3cSnJdzjpacT9DfpE3LZPmxLub0hVUo11qI7TXuNn7JLkwl8a2UieWBgnvwAg4DqOumXVy+QO0HW7jtHCYrJA7tHl5jbO5ms+/0Zr2dqT0huJUIW0/5eAp/cqUgUHZcXEpjLwmKTIazA8428s/Fk0KfIaDM/4Gwt/Fk2KvAbDM/7Gwp9FkyKvwfCMv7HwZ9GkyGswXPFvlRILj1MpaeFhgCmyXyRJLLpvIaVPsetWUn8Il+JIgCOlOL16WypOmkXliCFRL+Ja0/eiEelAhEmUKqVv0vXGyOAwDQ8O8euQ2pDhpMn9OUnRkplwaU348xlmHERNEp1OrVSTju4jMH6ylFbcb1RLzRY3zXBqtrhphlOzxU0znJKS4u9wqiRuGmlSdDrtTh2P11k0iIlbrzpFxS1zXJpBfivm96Li5iGcaombF51iSJ4n/VL5fVMRjR3J0zDnmfJAXHnt6VtUzDOll8bky5hxve3BYCIJtlh9SsFtKGnz7zlya8rfqLZtq+cBAAAA9IfyPC98Ua/wW3kejuj14EbWhC2LL02dElqQsBdxrekBjgQ20uxtfHyCt5hfkqOeARDUEk+6EaU1eFwCAKhNTqcxF1QJrrIB6lZW+hPez2Q49MR+i+jo6GGyHUfVwellkn9LT+LRGK+aU/fTxmAwkaYHOFKRWDaeBDoS4MiwPOBIBzYzIlgAAIA+IBf60TsZUhgg+WP4WTi9SFUzySZ/0IyYU6LEbclF0wMcSx6Fzo4eHVOv6mF4pjdVO1zXtdGpaaL3UnUC6Gbt3p9bPn2ZRjgllfb70JMavb/W+XvygFtpbGMYJs2bN0d6pqCJ8VLPt54S6i5MLkOZhMu6a74p9+4SNxEXLVqL5ZORUhtdctNPvacCAABolappSP4oFY17mZTgnDWep3OOJHsGzuYlma08SuIm4qLpa1Dq26iNWKG0TXWwCQAA0KfCVTUk3okLenqNlOBcv+0QLSokuxXnkbsvGEys5SEi6twAAABonMFPVXQPPmK9n1cGy5xQxqVUTcRF4r6oHliUpTWrVpIZdDCn+6Kq3cLL/966tY+RZxMtWDJE2aw85M8I6tyEapAzHXElX+w61dtyohH3cQGgufRxjuMVOoijs1/ZP3nfPLh3UmWCZ551OmUsq6crGhdyebrj8T101cFkPRo8cpz13nP2Ou8L3ibSmqM9VAHLNK2pejdVH9QHAADQ61TwzUlewyU4PV/RWAo3EpWvKCcdclI9A0c0fQ1KHZtwRSrpUTwMt6wAAAACnFX2Qx0cKeDg6CB4V1vaJuKi5SGi6/b+hgMAAEhNX+97Zs9f/J89kadzR5M9zHDvXMrzS6om4qLlAY5JbtXn3gSFdZ1L324L3XYDgA6H4xU6kNzhmEryGGPJEzkD9Fse+5/3qmt3j9OyZC3E6dHjjdRNxEV7jnh9zxEAAKCfqcA7mhX3fjCe5vYUf3VvMJRKG9ZiOLBpYZCjKnDFJOgPcdteEvSHuG0vCQCayA/e1FOL6yiMmk0TcdH7YSIAAAB0gOmAJ00v4vMnKXULKtHwACdcv0aSLIN+banZXqnpe/WVUrtFlyttqlfcb6ZJrdKu6UJnwPbvTNHtkjZBF5Lt5nIM4JLpSk0jizwrk6p+0ckHvVS9iGutybHVzhmOcLCzAgAA9IUgv5eAw/EMKnEMYKW4ZTWvoFpRpdaCAKc8kJGexKX5m0pStNMyMh9xCfpDhe2trwx1gh4l2zZm+2L7AzSN5PDqdpS++2GZHODYNGFPUCZhhLN7njnJL6mbiIsOuOcCAAAAPWfGRYNLrmHTk9wCnZuwF/H1y6xtHAqlbiIuWh7g6Lo5OrWOLGpcSqve8aE9sL36G7Y/QHtI/Rv/6HNdlxzLpjfvPESLE/YizmPuCQZSwxEPAAAADSW3ptxwCY5nkuc5/OKRlaJ0I+N424LB1Foe4Ph1b4I6OClqUQMAAEB3kT6nVPmpjmksDnBSZP3z886WYDA1lOAAAABAg0npTZCCSsYS5BiGkyrAOfFg+l7ENbk1lqis6P5FGVqzYiVHRJZ67xnBDIf7d2fRkicppXF5+dauXU8evx5//JBf8ShYYDf4neaTFR0HMV5/0Nsf27s/YftD55nKLoM8cd+ecbWrrj5rNQ0MZMl2imU9i3fTXQ+Pl8k1bbVclpuhjCvHnkvHhkfpc1v30WX7EoUe4mW81PcFw6ngaAcAAIAmMtWtKnHOeIEuOJIsuNk3Z3a9iGsIcAAAAKCpJMDxTIOu3zNJC5P3Ij7rJuICAQ4AAAA0lO6mSYIMKa+R5KSMODxjdr2Iay0IcKKTCL9vweSnyLTiEvQHbO/+hu0P0E5SguNK7eIUHVNmnNn1Iq615oiXCsXqec0BVcEYJxsAAIDe5qpK1BICOBLkBJ8mMS9Pm4PBWWl5lKGiuFACAACA3iOFNeECG8+Mtruu7pT93oZgcFZQjAIAAABNo4IcKcUxCzyQvAxnXpGko81Zk+kmuiGW9Dk4UaZhkeMQrVv7GC+XR8etGOFPZQH98fE0YwAA6EeufsZNDz4HRxbE1MGMl6GSZdNq5xB9YcMoLS7UDjukF/HjR93TeYnRigoAAAA6k2e6dP3O8UTBjdiwLLe1nuBGtDzAkUWTykbqVX0CAAAAvWaqrq081ZiTk+L2FEcIdTURFyjBAQAAgKaRsCbckDqJjEM7gsFZa0OAE54k4isAAIBepO7WBKlkuTSQyQR/qW1u3qmribhocoTBPz/1zJvQpPAcHAAAgJ4npTdym0qegcOZv/wvkVWHZt+LuIYoAwAAAJrK5mgjzW2qhQVvIhicNQQ4AAAA0BT+/RqXnnwsT086Yvsf1lBvL+Ja4gDHkH8mJ6M81RIeRx6Zo4bDnwEAAPQhlRfq/JBfo8wgn+zm/FIetpfjuObGncdocTHZLapHj7fq6kVcQwkOAAAANJjckzKnehRPwzVoXzBYFwQ4AAAA0HBSeqMrGBspKhhnXK+uXsQ1BDgAAADQNCUrXQXjuXmv7ibiouUBjkR04QQAAAC9RwIM9Qwc06Wc5fdjmcQpB7y6m4iLJgc4qgV8KGk8LJ2LAQAAQE9zONJIc4tqQZ7GgsG6tLYER4qowoENghwAAICeJDm8ZxrkWsnDm93zrEl+qbuJuGj5LSoAAADofZ7nkWO6dM7kGJ03Wgw+rW59A3oR16QaTKLA6oFFWVqzaiWZnn8fzTP82Chaj0aahIWZZoZch2jt2sfI9VxavmIOfypxnT++GfwOAABAP5nuXdvPE/fuGlODq89aTQMDWXLdEuebScs+Oo/0H+4MlujWTbvp6kPJHvL389MHf3Hpxvxzgrd1aU10IbeiZtyaCr0HAACAniIlOK4Zyf9ryDpe3b2Ia80PcGYsWPg9ghwAAICepZ7UHAwnMKfgbgkG64b7QwAAANBwUoVFijHS3GQ74aC9IRisW8sDHPXY5lACAACA3iN5/HljRbpwNHlm34hexDWU4AAAAEBDSQ/iBqc37xylRQk72TwwQgV+aUgTcYEABwAAAJokeenNwysb04u4hgAHAAAAmiJF/WIOhby9wWBDJA5weMLkuZy88lTL9DjyhhdW1ajmJK+cAAAA+pFhmEGSfHFmdizPwEmT33YS1UZaVbRN3lracr2dwWBDoAQHAAAAGs6VMowUvWrPzzemk00NAQ4AAAA0lPQiblvpnnV38kHaGAw2BAIcAAAAaCgpvfEyZooqxkQLJhvTi7jWggAnMomgLyslPAwAAAA9QZXgZE0azCTL5/fMNfP80rAm4qI1JTgeT0aWdoq8R3ADAADQi6QEp8TZvJmwn4b1SzMNbSIuWhPghEicI0VW6jXZcgMAAEAXkfz9iaOTdN6hYvBJDYazLxhqmJYHOAAAANDrXHr7jiO0oJisonHGpYb1Iq5JA65EdYDuX5ShNStWckTk31rygjb7Zo3H+JiGRY5DtG7tY7y8Hq1YNY8/5Q+C35H2/wAAAP3Gmcp+/Txxz85RiQto9VmraWAgS7ZTLHv+TTfll4Vcnu7YupeuOpCsBOfB4zMfvGC3/c7gbUOgBAcAAAAayjVcDjCSNxNfddhp6DNwRMsDHKl4FE4AAADQW1T+niKPX5z3jgWDDYMSHAAAAGioc8fzdM6oHbyr7sAIyX2shjYRF60PcKTJuBYeBgAA6CfR/DBRjdhOJMtRnp9ft3uMjisEb2p45Hij4U3ERZMjDNlgesHDk7IQ3AAAAKi8MPxcOM7qY/PN3uWa1PAm4gJRBgAAAMyaFDzpwifVgXhKpkvbg8GGQoADAAAAsyIP9NONhiyTQwrD5WSTIa8JzZ00tgSDDZU4wDHkn8nJKE+1hMeRkrep9/LKCQAAoB/pfFDniVHSzYHOP1Ue2nH8IEb3TJDLZMn0XDK8ScrIU/YSOumQuyEYbCiU4AAAAMCs+Y98McnjKMdxXXIzHmVS3KtaPEkNbyIuEOAAAABAavr2lDZZLFDJc8jLWWTK7aoE9s0xpK1Vw5uICwQ4AAAAUAc/lHBsm0qGR6sni3Tu4WTPwFm73GpKE3HR8gBHSq3CCQAAALqLX3pjksdhhOTlUuXGkD4qMyZdt/MYLSwmzOA9oylNxAVKcAAAACC16C0qw+KAJ2Nw0JO89CLbhF7ENQQ4AAAAUDfXdMm1QhFPAiN52hwMNhwCHAAAAJgVfXtKmodbLr8aDqV5Bs6qw/bGYLDhZL4SlSU9sChLa1at5IXwHyntyb02Fm3qXl6vxiTTzJDrEK1d+xi5rk0rT1jIn8vCB+NHfwAAAKAPcCgQDPl54u7th9V9n9VnnkEDg1nOM0vkepyBdqCp21NBtxJZ11XpFDpEn914iBYlrYND9DL+mfuC4YZCCQ4AAACk4pfaSBDhqtIbISU4b9o9lji4aVYv4hoCHAAAAEgtegPGMV1VspPUH1ZY2/nrTWkiLhDgAAAAtI2UfvglID6OGlQdlujnnUkHOS7Ps63eJJ9n1/Ca1kRctDzAkeUPp9bz7xdOp1bD9DF9TB/Tx/QxfUnhYICHU5R+dAJ1iyrIxx1enJIsUgpWE5uIi5SzAwAAAP0uHNwIuTUlTzFOU24xp4lNxAUCHAAAAJiVcJBDpkFuihDnxMPN6UVcQ4ADAAAAqek7avIqVU5cw05V92TpOI0Gg02ROMCRgifP5eSVp1qi3zUNoyw1nixStdRscdMMp2aLm2Y4NVvcNMOp2eKmGU7NFjfNcGq2uGmGU7PFTTOcmi1umuHUbHHTDKdmi5tmODVb3DTDqdniphlOzRY3zXAqZ3AeqJLpv0a5ofxT56GdxSWLZyvj8tJ5LpnWJM3L+M/Kq2XvHDPPL01rIi5mrnEAAACAGvTtKVVoY7j0xMk8nX245H9Yw2PHZZvaRFwgwAEAAIDUwh1tSnuw63bnE/ci7hm0PxhsGgQ4AAAAMCsS5EgLKmkmnkbG8bYHg02DAEetgnBqNUwf08f0MX1Mvy+mL/026dQD9FOLJciRpxjbZc/1qW5OwXs8GGya3ljLAAAA0HKe4XKA46oSnAEzWQVjseqw3dQm4qLlAY5EeuHUfhJxhlOrYfqYPqaP6WP6fTF96YJBpy6n83Cbk7pFxSljJQ8pFk96TW0iLlCCAwAAAKnpME1aUZ0/PkFPOiydg9d2cLi5vYhrDQ9wwqUzkqQ+tXrl1BqyyqulZoubZjg1W9w0w6nZ4qYZTs0WN81wara4aYZTs8VNM5yaLW6a4dRscdMMp2aLm2Y4NVvcNMOp2eKmGU7NFjfNcGq2uGmGU2/R+XrGc+mGXaO0oJhsGR9emWl6E3GBEhwAAACYFQlypBDDL85IxjW9pjcRF31YB6fdETWmj+lj+pg+po/pt2P6jSf5uLSgMlIEOJbj7AwGmwolOAAAAJCaGVQqlgrGlKLrpZFic3sR1xDgAAAAtEU4C+bh5IUgHSGbyapbVEXTIzNFNHHSQXosGGwqBDgAAABtI4FNOCvmiEG916lzSQegtuuSaxqUSVGC0+xexLXOXnsAAADQkQqFAtmeQ27OIjNhEc7eOWaBX5reRFwgwAEAAIDUSqUSeR4nK0+W6lK8trXHDWwzWtBEXMgsJZqrBxZlac2qlWR6/qOYPcOPjaovk8n/LHJconVrHyNyHVpx0iL+XGqP++NbUhwHAADQZ6afD+fniTu2HlQfrj7zDBoYzJLrlsj1HP8rHcjjectb43S2MU5fWTtB8wu1W4b9/LSB31y6qXBR8LapUIIDAAAAs2JaBt2wPVlwIyyXdgSDTYcABwAAAFIzPb/sKc19mDkFd0sw2HQIcAAAACAllwyOcNRtthQRzoqjze9FXGt5gCMRXzgBAABAd5HgQdWhNVzKBHVyk1g27h0NBpsOJTgAAACQmhTcnDth0/lHk1WEblUv4hoCHAAAAEhNWlFdt2ecFheT3Y55eIW1g4OiljQRFwhwAAAAIDV5knGK6jfSMWdLehHXGh7gROvYyMKrV04AAADQGyRb97xkzcOF5XktayIuUIIDAAAAqUhYUzI8DnKSl16MFLyWNREXCHAAAAAgFWke7pgupehjk1Ye8TYGgy2BAAcAAABScziCSFP75PhjdCgYbImWBzjROjoAAADQXVyDyLYMGsxkgk+q2zfHaFkv4hpKcAAAACAVuUXlZk2yzGT3qB5blmlpE3HR8gDHMAwyeIWo1zQ37wAAAKAjSAlO0XMpYyYLIzyztU3EBUpwAAAAIBXPcOn8/CQ98eBk8El1hte6XsQ1eTxNopow9y/K0JoVKzkistR7L+h7wow85qe8Xg3/1bDIdYjWrn1MPfXwpBMX81RdFc4JL2HxFgAAQC9xp7JfaXRt0o6tByVzpdVnnkEDg1ly3RK5nG92osmBPN2+ZTc996AdfFLd/1uV/een7Cj9dfC2JVCCAwAAAKm4hssBRPKWQiuO2i1tIi5aHuDoujeogwMAANCdpJKxl6KLguXHvJY2ERcowQEAAIBUzh3P0wWjybppODhMJX5paRNxgQAHAAAAUrlu1xgdVwze1PDwSqPlTcQFAhwAAABIJU0Fk1b3Iq61PMCRtvPhBAAAAJ3Lr28TvJkF06OdwWBLoQQHAAAAEnMl2kkR8IwUaXMw2FIND3CiJTRSx1q9cgIAAIDuIw2mDM7MTc8kxzQ5yElWwVisOuRtCAZbCiU4AAAAUJNFBjnkkZchylrJw4dW9yKutTzAUffy9CtKdQAAADqSdMcwnU+bZGZNcjnEcS2Hsgl7Idg3x2x5L+IaSnAAAACggumuleThvK5h0xPzx+i8o8naiK87LrOTQ6GWNxEXCHAAAACgIimrkX4mDcMjx7Lp+p2HaHEhWR0cg4x9wWDLIcABAACAMnJ7SvqbCrMd2/8s8nk1ptueJuICAQ4AAEAbdEPfjKpTTc8vwXFshxyyUwUOgyX38WCw5RDgAAAAQG2uNBHigCdFJ5vHj9qbgsGWSxzgcHxJhlkebXZqxAkAAACNIc+yE5lMlkyOGiwz+S2qFaPegWCw5VCCAwAAAFVJkGOaFp2fd+mCI8lKcA61qRdxDQEOAABAG0zdDQnujnQuqXDsP7vu+t2TtDBhL+J/WGG0rYm4QIADAAAAZaSajQQIkvQDekvyTJwU9W9s02hLL+IaAhwAAACoSkpwJMDxVKiTjOl6O4LBtkCAAwAAADPowhp9e8rhlLx6MdFwkdrWRFx0TYCjisgSpHrF/WaaVK+430yT6hX3m2lSveJ+M02qV9xvpkn1ivvNNKlecb+ZJtUr7jfTpHrF/WaaVK+430yT6hX3m2lSveJ+M02qV9xvpkm9yA9y/If+2RwxpFnMlUfa04u4hhIcAAAAmEE/4M9yJViQ+jdSuzh5Gc7KUWpbE3EhwVlQCFXdA4uytGbVSl5YS733DD82ql7fyOR/Fjm8PtatfYzXi0MnnLKEP5cV5I9vVogHezUaBgCA/hTNL6fyOen6wDNp25b96sPVZ55BA4NZct0SuZ4TfKm1JKAxPTeYZ5Mc06aJ4XH6/JYj9Jx9tvpONftHzOLScfcUXkS0ogIAAIAOoXoQl0IKvwSHDJvOmZik844mC7jWLc/taGdwI7omwJFKTklSveJ+M02qV9xvpkn1ivvNNKlecb+ZJtUr7jfTpHrF/WaaVK+430yT6hX3m2lSveJ+M02qV9xvpkn1ivvNNKlecb+ZJtUr7jfTpF4ksY1nuuRwtHDtzgItLCS66SPro61NxAVKcAAAAKAiCXKkBVWaGsam175exDUEOAAAAFBGl0qpFmKqBEc62Qz+mMBIwWlrE3GBAAcAAABiqUCHX9M2EV9+1NkYDLZNywOccL8bnd33BgAAQP+SwEaX5EgdHM601edJrDjmtrWJuEAJDgAAAFQkz8I5f6xA543Wbh4uDg0bbe1FXEv8HJz7F2VozYqVHBGVPwen0nNsfDOfg3PiqUt5qvyBaoImASFiLAAA6D+eJ2UkrAOfg+NzOQ93Keu69KFdu+i5hyVuqe2nT8g+fvmG0inB27ZBdAEAAAA1JGseLjzDa3sTcdHyAEdKbPz6N/KK+AoAAKCTSf2bNDVmTc/eHQy2FSIMAAAAiCUVjEscKaTpPmm4YGwOBtsKAQ4AAADMIAGCBDYly6Wc5de/TWLlEVofDLYVAhwAAACoSDURT1EHZ+Wo1/Ym4gIBDgAAAMwgbbw80/C7aUjowIhZ5Je2NxEXCHAAAABgBrk9JV00nDM5TueOJmsi/sjy3E4era29iGsIcAAAAKCMBDeuYfKrSzfuPEpLE/YizuN1RBNx0aIARwq6ggcaAQAAQFdwOcAx5EGECZmu1xGlNwIlOAAAABCDAxvTU03FkxoueW3vRVxrcoDDK2dG5IeYCgAAoNN5XrrgRqw4UuqIJuKizdEGgh0AAIBOIx1VGq5H542X6BnHgg8TWHGsM5qIi9ZEGKoUJ1RByZMHBiG4AQAA6Fgc4Fy7c5QWFpNVMD4yRNLdeEc0EReIMgAAANpA98mo+2fsNJbqgSr5A/4eXGns6pQm4gIBDgAAAET4dWjTVMFxTGNvMNgR5DZbovDsgUVZWrNqJZnq9hKPFESb8gPVmIZFjuvSukfXq/V10mnH86dyyyoY30weHTZDvZNPWwGr02D5g4FZwvIHA10Kyx8MzBKWPxiYJc8NZsBwVNWNrZs5PvAMWn3mGTQwmCXXLZHr8d/agoMbnvZHd+2k5x5K9pC/nz3B+M5lG7wXBm/bDiU4AAAAMIMEcEaKW1RDReqYJuKidQFOWaSLuAoAAPqbYRp+kno4/NpJVDcNGWkmnjzAWXG0M3oR19oQaSC4AQAA6GRSeuNK8BW8T+KEI96+YLAjtCDakPo2kirweBYkBeSeaL33RavRv9/s6cxWs+crvOzNnM5sNXu+wsvezOnMVrPnK7zszZzObDV7vsLL3szpzFaz5yu87M2czmw1e77Cy97M6cxaB82TlODYOZMGrUzwSXWHhg2pqNMxTcRFa4tTVChYJdgBAACAtpMSnBJHCKaRrAzn0eVmx/QirrU2wKkmUpIDAAAA7SElOE88Nk7nHS4Gn1TnmmbH9CKuIaIAAACACJfevuMoLSgmu+tiukZHld6Ilgc40Xug0aRV+ryW6HjR1G5x8xROWqXPa4mOF03tFjdP4aRV+ryW6HjR1G5x8xROWqXPa4mOF03tFjdP4aRV+ryW6HjR1G5x8xROWqXPa4mOF03tFjdP4aRV+ryW6HjR1G5x8xROmmTM8l4aMIU/bynDJlOez5PQUJG2BIMdAyU4AAAAHUMimk6oq+pygJM8ulp6zNkUDHYMBDgAAABQJu1D/k486nRUNw0CAQ4AAEC7zWhkU+MRK0129kSezjmW7BbVoeHO6kVc67gAR0rEUpSKpaZ/v9nTAQAAqCoS1LQ+Qw4HUOVTv3b3OC0rBG9qeHiF1VG9iGsdF+AAAAD0DRXkRLPiVpfczAwFjBQlALZJHfUEY63lAY5hSL8b0wkAAABaLxoAhFtzmSk6aTBd2h0MdpSWBzgAAADQGSSg0WU1KsCR1lMkTcSTlyINl7yO6kVck0IovWxV3b8oQ2tWrOQFt9R7z/Bjo1pRnjzm2XFdWrd2oyp1O/m0VcFffFYHdL4htcU7hY6emzVP+ve1Tlp2geX3X7H8/mujYfmDgQCWPxhoE8MNZkiCCc+kzZt3qRz5zDNPp+zgALluiVzP/448WTiq3nqkEszIdJ0gP89yXm0YRf6oSB/duZ+uOih1h2vbupBuPPkwfTJ42zH6vgSn0w5wAADob9F8KS64aaTo9FzD5kAneQnOSYdpTzDYUVoe4KAODgAAQMiMJuKtEw5u1KBpUMkishLmz53Yi7jW9yU4AAAA7df67DiujEYCnoLpJa488ofjMx3ZRFwgwOkwsnNFiwsbSf9+s6czW82er/CyN3M6s9Xs+QovezOnM1vNnq/wsjdzOrPV7PkKL3szpzNbzZ6v8LI3czrJSRYckw3L7aEUt4jqIbe/TM8kg5MENSWenTPzJXrKaLIQxyOjI5uICwQ4AAAAfSiubo9junTjzgmaX0gWYJleZzYRF20PcBodUUd/r1YCAABor/ZmxYZqGu6XGknd2DSVmoeK7tZgsOOgBAcAAKDPqSb0rkeeKS2okvVBJZaNueuDwY7TcQFOXClLmgQAAABpueq5POeP5+mZx5I/YOfEI27H9SKuoQQHAACgj6nCGykk8Gx6w+5jtLCYLMA5MtiZvYhrbQ9w5F5fONUr+nu1EgAAQD+a8SRkU/omSF568+DKzuxFXEMJDgAAQJ/SQY5fzcPl8CZ5gGNbxv5gsCMhwAEAAOhD8vwbIcGNNA+3LTdFH+IyvtexTcQFAhwAAIAO0M7ei6TKhs0RgZuiB8+hYmf2Iq4hwAEAAOgUQZDjua15krE0D/d7WedwwB9I7LhRb0Mw2JEQ4AAAAHSA9pTgSBjghwJyqypNJeNTDnf2LSopjEq0NA8sytKaVSs5wLPUe8/wV0it0iyTt5jDkei6tRt57fEKOX1l8Bef/L0uafvraGOvrUq9/Ytg/uuD+Q8G2gTzHwy0CeY/GOgMbqQp7+NbtpPHi7j6zFMpl82S53n8nXSlKmnokht5jrFj2WRnJuhzOw7Qc/YW1N+rkV7EF014J/MSoBUVAAAAVNbOOjjCsTyyEs7EI8cPdHQTcYEABwAAoFME8YWU3jSb3zTcL8mRwqQnThTorCPF4K/VuUQd3URcIMABAADoAEHNj5ZTzcQ53bRrnBbnk90GtDq4F3ENAQ4AAEAbSB3UcJL6N1IrVlpQSd2bZta/EeqJ/sGrNBG/f+lA4irGg6XO7UVcQ4ADAADQZySo0beodAnO8w5OJn7Q37JRu6ObiIvuC3CkFn04AQAAwKz4pTgmOSmjgROPurhFBQAAAB3KkO4ZbLpg/BhdMFoKPqzuaIf3Iq61IcCRSSZJEbrERp5jUE9qt7h5SpPaLW6e0qR2i5unNKnd4uYpTWq3uHlKk9otbp7SpHaLm6c0qd3i5ilNgggObjyXsl6Rbtx1iI4rJquB8/tV1m6jw5uIC2xxAACAPiWP+VOBjnpNxjE7v4m46L4AR5fk6AQAAACzIrlo2vo3nd6LuIYSHAAAgD4j3SzpvjVVgJO0+RQb7oIm4qL7AhzcUwUAAGgIaUVV4qw0aybPT5eO0vpgsKMhQgAAAOhT6hk4EgmkKME55VDnVzAWLQ9wok9uBAAAgDYxDSoaXuInGB8YMaUtecc3ERcowQEAAOhbLrlmMXErqkeWD3Z8L+Ja4gBH4jvP5eSVp/RkJU4nw/QqJKM8GZafop8jIbUxAcDsxR1T/ZTaTSoaS2Dz5PFj9NTRZAEOj9AVTcQFSnAAAAD6lktrdk7S/EKyAMd0u6OJuGh5gNNpESwAAEA/UgEA58Ne4ho4RIO2ty0Y7HgowQEAAOhDUu1EvaYoa1h6zN4YDHa87gtw8Bwc6CDREkkkJKTkCdrHlNhG6tVaHs3JDvgfJnDCYRu3qAAAAKBDGdLRpk3njBfp3EPF4MPqjg4ZtkX0y+Btx+u+AAd9UQEAANTN4hDgTTtHaWExWV764PHGHqNLmogLlOAAAAD0IXmKMaWoYGyb3oFgsCu0PsCJ1qGplGaQCBMlNgAAAI3hJn7AnzAsq2tKb0RcJAEAAAA9TMIa1QdVmibiRbsrehHXujDA0SU5OkFfiyv9S5MA6hG3T6VJAG0iTcPtjJeqifhxx6hrmogLHGEAAAB9SEpw0jTWP+kA7QwGu0IXBjgyy+HUXQzDQJpNImvqqtdzjenkuFWT45Yn/Xua6l+NkyPflXGC90kT9KepfSDok0/vX+F++iTJc0bikuoDiJMW3s/Lkv68R5JtOyrpZYb2kQrGtmXQYIbPrQkcGu6uJuKi+yKErlN+Ky16AkRKnzQ5QZqmSRYfoJKy2WzN5HImJEkzLVOlqb+b0rMubn1CdWq/MTNq/5Ok9x+obnBwkAYGBnidWWXHMrSe3JpyMhxGG8nCgEePz3VNL+KaXEQk2svuX5ShNStWckTkR3tesFJMvs6oxuRMSK5s1q3dqPL501efFPylhhnPuNHvuykm48wyWA7Ogvn/vLbU2uZlQGiZkpTc+OuyLNDx2zlWPFlG9yLHsdWrf/XIV9zBxYtcL3u8rYys/3umxxlXgjoSuArtU2rfMGl8YsJ/H8hY5VfD4VKaMFPOn7y/6fPD9H4U3eeie3B3k+NUAsIMX5AYvA5c1y/N6VuRc8zmzVtJVskTVp9MmSYHzMWMS6fax+hr6w/QwgQdbf789Oz/XLqx9NTgbVdAgNNUUhrgZ6imK/OdoU3rt/v7dIaTn8cm3AI9pFZMoNeH3uT6ffhzvRsEn1WKM6IV6CzL/0AHRGoSejvIb1abt/B86OFu2h2hPnrfkG3PmZA6eUb3F71faNH3gfD+Kr9RMU7mz9U0on+v9P1OI8uv51+G80Rz5mZo0dLFNDQ8SI6tD/I+1cYAp5C16batu+jqg4Xgk+p+eXrm+5dstP8keNsVEgc4DyzK0ppVHOAEl7w6wKl0haLNCHDOOCH4i6+3r4AlwPEfgW16HNFw2rR+G53Di7wmuNBzeGeuUPjQV2Q30LuCw/vJp3j3eki94c+zBi1ZuFD9rVQo8vcsdQVsmJ7af3SyTIsyZkYN69PmyMiIeg0Kemju3Dn+gOLyzzv0+98+TLlFFp016dD1JX8+pLBIXiVpsp1UUm/UR2V/r0Z/L25bx3ykJPzpmur9/X6dP/278jsyLMeqDN8xSPQgH9ZyJ3Pp8qW0bPly3q6uuvUSPR8ePXpUver6OlL/Rl7l+7L/HR71/+7Te61PApujYxN8qU10Hud11/L0LT4u5GfMIF+U/TRun6plan/0X6bWVfR9WuFZkd/Qx5DMozquOW3kU+Gq01aSkTPJs2WM8ky+n0g9wrCWBji5PN26ZRc97xBPMIH/PjF7+9O2la4N3nYFBDhNVR7gGG6G1q/bRnfliF6XrOuPvvWz+UN02fgkHb9iOf3P//wPHb/kOBodH6W5w/NC+4y8Sqag38s+ye8lE4nsVvo8wqGQPxAw+d+dX7yD/uqNb6ZPc3DzV/JzAFV8d26GXszRzqnHn0a//q9f09x582ggO0jj+XEaHuDoh5Xvo5GdUZ1y9YnT3+F4j1Wv+r2Qods/cwfd8MY1PXPOuIPTW4MAx8xmODNPlP30rHYGOJMDE/TZx/fQFQeSBThbFmfedupB+2PB267Qv6Fzi0zV5VBFkVLqwCcuZKI1bRnPk8XB9D1330NLFy/jTyyaNzKfMw4JsP116Wcc4fe8YvmE4anohtc1f1cn/U8CmvA/yZRe98o30Hvf9j66lUf/CY8JUMnmAYP+3rZpcP58+tYP/o2W8L6Z5eBGDumRwZGp/VP2QTnOXQ62HdvhV77Y4eQ5NqdwhuLvuwbxBZB6nU6yt/7l699Ar37jq+iT/LVHc9FAqfvI+U9CGrngM/mCr99JIBxOrSSxVVYXBSZw4kG7q5qIi+RLB7NicGCjk5CS6Ug9RIj4Lz7vfdz26L3vfB9deslloQNf1qG++pUsRZrlOlNJNcGVE4XF6zsYR24HSMbC3yhL/tikbitIC6z3vPvddNGfv4nW8GcP90BGAs3xU97HNi+ZQ/fdcy+dufqJVCgV1V4pSYZ13S6hMy2/xZWfDIsDGU7+GOEkop+ZNGAN0Pvf/X6aOP00+nPLo905/d3uJEeWlPpbLgdwnPR5EVrvXOlF/IhfR7SW0UFyONvqqibiovv2LjkgwqmDycGbcTJ+4oPZr2hMlMOFS0VrB4neyOtnyZWX0rv+/p3qM7mS5Y0dJHWK5CSf8QmS/6oT5xz+n0JUBiMZS+SfJi059M/e8bnb6bTnvoj+gjOx/875fwfQfsW71yd53/zcHbfRc5/zR2QVOUDOTu8oMqyCGvkXBDf639TuK/cfwmkq1NZf8PdrndxSiU5acTLd/ZX76NGhAfqeVGTpYmoJeRFMm49Lh5N8AG1x7e5jtLCYbAM8uJK6qhdxTY4iaBI5eP0rFb5q08FYJAOGaYdzBv055xcblwzRXXd9zm9p1lRB5iLbJEh3f+FL5J71RHoDz8dDA/IdAKL/zhJdz/vEyz74TvrTq17AOTUfz3EtgBqcYeey0tLIoSecdCa9+23vp1t5H/2v5lbNaCo5zOQOsrQulSbykSoo0KFs0+iqXsS17gtwpPl4OHU0vwhWgpyp0iYc0BV90/Xo95NE9376q7TyxJXkqABEyErTKaLKn6qRfEjnRWo6kmlwmnPcXPrpD35Oh+eeQK/iC+zH/Dqj0MckoLiG94Wr3/bX9Hdr/oFy7nx15nSHU5w+Z7GP+hySej0L5w3Ru278P3T2n/wFvaFE9Ei3Bt+8Dgp84VLM2GRbNgc7nX4OB8GbretKb0T3BThdRl2tBCc2XK1U9r98wv7UMNFN195Ez7vsjynH/1KvrlmtXzkEpI6Of0WZHy/QkiWL6Rc//jVtGZpLL+coaPsANly/+g1nxnLL9KxXvYI+/L6P8KUs72Yc8EjjH7fRxTUR8vtFTqbU2ePAX9zy0U/SoRUn0Z9zXHCwC+vjyJEk50TpA8k25RYdNJO+BSjrXJLGexVvjOT7b65EXdWLuNb6I0RKMpKkGSTS765oXwKakmlSkU9Qfrf0EGc9BzevkWdNnXc+/cvH/kU95ZT4KtW0eaXJJleZSX1bX1Z/OEmeIXV7/BoS0y2sBkd4ZgYNOnH1CfRv//Zv9GjOoj9xPTocPOEY+scfOLB9Mwc3Sy6+ij73qc+rFkBq52Gy/2RUruG/nyK7SXhXmXovX+Qk0Uo4qR8MJz2CJGlJlfH3eymxGeR5OXEBff3rX6WH+MNvdOFD8lQdbJlt9VywLr7X1gUkuNFJ8iJJKrDh/U4quluG7GPJLDvmdVUv4pocUdAkcixLYCNJSgfCETRM+zlfFW87YS7d+4V7g0+YrDxJLVO+cQw+/1586cX0hTu+pB44+K3Wzgy02cYBk/684NHkyWfSN+/9Bg0Fz7eZEYM08ZjWk1JUREU0OjFGFz3rGfR/3vo3dBu//3033qqSZ6lJgCNLGHsxC82g8x+Ho8wi2WSkKME55SDtCAa7ShfuXRL+h1On8+cRwU28X/Ie+EmH6OMf/Bc687SzeD15fv9QcoEXXOBWv7WnI6FKqTopw5EkZEvZns2vMuRRxrDopS99Kd1880foFv5IKppC75Om2C9xXdqxcjH96Mf/TvMXzVMB75RUx3L5fij7VvhfLXKCDp+k586ZQ8WiTR/+8Ido2RVX0Wv5MwnGAGKF6zhxMCmFhnKOm3QnKWsm25GPDnZfL+Iajgxom4dyBl3Pe+Az3nQNveJlf0ZFp+AXpZoeOZzktXYW0FjyCH1XPUZfyM2rDL39pr+mZ9/wZnoDXy2j+Xhv28nBwvNMl9YOZuk//v0/aNXKEzg8cang5Um69fCDkmTBczkZr/69uVgqUS6XUbfL7vjUHbRl/nz6WZc3HYfm0LelVIeuHNxIgY260LYc8nIOZRLm/g+tyHRlE3HRhQGOzHI4QTca40uCj2Q91RT7rW99Gw3lhtTnjm1zUGFQfjKvUu2tLUdstZSc/L6U2sj0dQVSeZaJW/LoUzffRqdf/RK6hj/+HYKcnnSQA+7nl1xaZ2bop9//D3rS2efzXiDVz6VmMe+b/M8PbHSwIsM61eLvwbrEMFxymEY2M12MeMIJJ9ALX/hC+iTPSjc3HYfmiYa+qh4ZBzhnjR+h8w4n6/vDMYz9wWDXic8zAJpsDucVf835xvn8+twXXE2//d//Itt2KMcn8FLJoZGhIfX8oFbTD2gTcrVecotkSgVjnpWvfP4eWnTJxXQNHzV4Rk7v+Z7FATdv6rs+dRc965kXB5/6JDTxHzjZXnKLQY6PyYkCvePv3kG/v/NLdBMHN09IUWEU+o9UNBY2X0BKic5b9+RpfiEa/sTjvX53MNh1EOBA25xfIPoaH3jz1m2jZ115EX3/ge+pSw77WEk1ix0c4TN36BiUwWhqNnlOR7HoX+nYXom+9bV/paMrT6TXcEbzCJqP9wxpDv6xPNH73vW39Mo/e7lfqbdQUkGN/idlLvLPP21Kku2vU2tIcJPNWvS617+efnXHrXQnHyKv4+NoUcIn0kL/Uq2p7KIqiUxTwXio5G0LBrsOAhxoqzP45PxtDhTOsVx6+eteTnd98bM0NG9QNYklznDKS//ljetnLxzdSGoWPwszVC/RuZx/T2p47jAtXLyYfv3T39CuOcvozwoeHcniEOp2Unn8TbwvXfHma+nd7/0gFfkqV8UsQTNufUPJ1/qgJmz00Cg95/LL6NH7vkK35Uv0dL4WAKhF7a3Sktfm4MZNF+AsGnc2BYNdJ/HZWbrz91xOXnmqZapPluCcYHAYGU5TTySOphn8LKfbqPUUWm9tOi92tFM5UPjxUYM+fZToE697A73pLW9U66lo2nxAemRP+g8Es+XhOFJuI7udDAZvZW/RqX56P5MNJdVL5SGA/jOVpcKePDZ/yXFL6PsP3E8b5g3TpRxlIcjpXg9x7Pp63o9Of9Gf0j9/4hbeyB7lhobVK1n+wapLcPzSm7TkN/zf8en3OsnOHE7lbNelQoFnkGOu7et30XP/6Hl0+Kc/o7s49rpQ9v9uw4ss/b9JnmDitlrT6bOZnB0NTy4ODRoeGaTBhC2oxMkH3e3BYNfBmRk6wuKiR2/gOOaODNH//cJn6OqXXk2uxVcafCBmBuRK2qPCxBi/NiaMSUofIByeqlcjY6kSnac+6cl075fvpc25ufSNqVZX0E02DBr0at61hp/+dLrrri+Rw9tRWpmEU7tlTFNVLP75T39FT7/4aVRc+190FwdlT01WPxRAMfm8KUlaTp15ZIzOHU12zjo6aHRlL+IaAhzoKBfxlepteaI93/4hXXLJs+nokcNBTMOBTjarAg3H4EvXLAcc0nKkaXuw5HDy43zdHnoYmR6SWXrRn76APvCP/0i38oc/a9p8QDOsGyB6qeXR5KlPoO9+97u0YMECyvL+1Yl+8N0fqIr4S/fvpPuk5AbBDSQVeZCiZVr0hu1jtESeHJ/Ag6vMrm0iLnBaho4jQc4d/Fr47e/oqRc/hTZtWc9hTYmGssP+Fzi8cMwipxIPtb70pGj79wYcnqtrr72WrlzzVvrb4QH6lRQ0QcfbMWDQn+WIHs8spH/7xndo6dKl6vOJiQn12nrTjyWIuvWTt9GLX/n/0Wpngr6TM2i11EsDSEg9JDUIclSNEJP3tQRVSzTHpK7sRVzrvgBHNlY4QU96Jgc5X+aAYc7OLXTGhWfQr3/7KyrYk6R7jRodP8bf8u8hyF6gU0MFtyikvoA8G0eSkKbsMi15nzUs+ud/+iid95pX0/UDRP/V+pbtkNL9tkePlAboRz/4IZ25+kz1meu6NDw8HNQXnE6NI79V/nvh0FzqRkwUJqfCHJvD5xvfdhPd+bbr6JbJIv2U5+WkQvKMCUCTIEeCGyH1QbNWijOl63VtE3HR8DwBqml9aUM3O7dA9K8lg87h14uvupy+8e1vUrFU5NVo0qA5xAFGRmUM7SSVjqUH8k/d+ilacNklqufpX6Mkp2P9mNOtfBh+9Stfowsveqo6A0pwY5qtPxX6U5T9V3Ifg4YHhnnIo8NjR+jFL3kx/fwTt9Ad/Kc3cUIzcJiNcD0ywzOlgXjwLpnBLu1FXOu+AKdma6sO1C3z2YFO5qvW7/LrnRNEN//Fa+mDH/gQuRMeDWVH/HyhTQGO3BqTf1bOIiPH2RJfGf3oez+i/AVPoOuyeBBgJ/pPDj7fxunNd3yanvcnz1WftT64kZ02HKzIsH+LatLO076D++jiSy6hrf/6HbqDd20pyQSoV1mr8BSnzMUT3dmLuNZ9AU43UYGNDm6CgIx3rhQt9ICdkCe6hk/0/1Ii+u4//QO9/R1vISrxB8F6lMzBT9NruzX8qcqzckzXoizl6Aff/gHtOmERvYrndSMeBNgx5EF+11pEl61ZQ6973V+qwFRpdnBTFs/4A+H6NhMFv7ZnwS7Qo489Qk9+xpPIevhhuovnF8ENNJbUXZSdKhztVHfaAa9rm4iL1gc40To0ldIMrc++Gqdb57uzXMqr8RaH6Me33Uoveumf0uT4UbJJMgjpAbykhv0wJ/kBPFv6uSiGmqJLpmWq5xydfNyp9P2v30+b5g3TSxyP9uXi9mVoJRXcDBI94cUvpY/d/HHKZLKU4X+ypzR168huKPlJEKjoUj/9yAExYGVVdyC/+c1v6NmXP5uWbt1NX+DY66nd+Iwb6GAmBzcuGXNN3ueCj2o4PGTYlte9TcQFzr6tUlaaA7P1LA5wPs0Z1ubvP0CXXP0senznJt6JJcOSPqwKUxWBm07lUfJkifLpSdBz4QVPox/94Me0ac4wXeW6dAgPAmybRznAvMHMknnmU+iLn/9S8GmLTZU0yrNILHJd/8GVEvhYGYvu/upX6IrLLqczi3n6Cu8qT0rYhBcgKTldSWXjM8bG6LwjyYoGH12e6+om4qILz7w6UOiSgEHdluqC+ewiUnT/xQGi4n8/Qhc9/WL61c9/wZ8aNOBK/w6Sm0hqfimOTEKX5GhSp0M87cKn0W233k4P8bx+I/gMWmst7w5/5rlUPOuJ9B8/+QkNDsj+0UKyG8qjdTggl+dhizHnGGXNHO+8/IavpOU5Sre8/nWqMvE3J/0K9QCNJBWN1VPY+TR17Y7xxBXWbYu6thdxDZeW0JXkKvdu3ntXHDhEL/iTF9L93/++esaDTx/A/g2rVhofH1dBjssZ66tf+Wq6+WM3062ct/0SR1pLbZHghgOIPSuX0Te/9U0aGR5pw8lO9j+HpIsRKb0Rc6y56nWS/11347V037veRbeWiN7If5YuSwAaRQc2Ql5tPgDSPJ3b9GhPMNi1uvC0K7McTh2uYp0iqNd5eaJv87pdNXaEXvjyF9CdX/gMfyoZiUEeBxhTtwKaQU4UkiRP4mQE/+bMmaOen5LJZFSdnLff9Ha6/Kab6Dqerf/qzAfl9pydAwa9OOf3M/Vv//odesKpp1HWslSTfoO3STg1j//bcktKntt0+Nhh9b5AeTqY309Xv/gq+tUdt9PtHIQ9u4m7KYAENxLYSICTxkCxe3sR15DzthRWd6OdXHTpP7ImfSrv0qffdj3d+I4bqOTmyXZschyvI9b4zR++mU570YvojZyZ/S+ajzfdDzm4+D2/fuPeb9IzLni6/yHTFcFbabI4yWGvRYvnLlGhzo492+mZlz2Djv361/RZ3jmlThlAM4VvUaV5duXicaerm4gL5LjQ9ZaWXNVR560TRL/45G30yle/UtVzyBiVi0yknMe/aSCamOnxEeZlXbrnG1+h3DOeQq8pIMhpJikl+wS/3nnnnfSnV7/A/zCksU8nDpN9KLwfyXQMGsoOkVfgQJsvnx98+EG66OKLaOh3m+nuPPqUgtaRIMfxd8nETj7sdHUTcYEAp1Vwm6rpVAsrm2j9N75Fz3/h82liTHofL1ce2DSfXMGbVoay1oC6XeI+5Rz6Sz7JbMYzchruv3NEb+Lg8UXvfS+99mV/qdrWSRNsz3NUyU3zght/nyqRox5WEH7OjWQohmXQv9//Y7r8yitpxYED9JUM0TnoUwpaRB7yZ/EO6rf5TH72s1pfhbHhEue6qoaByYlPEuFUi5xY/CRv+Hd4iokS/688ZYIU/bzTk6wnK3iVs536D5rk6SWir/DrzvsfoGdd/GzavmkrX7oQjU8WqOD6R6yfAcntK50R1bFFZNRQkm3shdJAboinI43XDVq2YDl97Z6v0cFVJ9D/xwfEbjwjp2F+x8HNX3E659V/Qe/9m/eQUfTXbdbgD5mhHuXKJ3h+Dae6BT8h+5XD/+e9jIr872hpgooF/pT/u/v2L9PfvehP6IP7DtEPJ0wENyGGGXfO7KMky1+WZKX468WU/KIOsnubLp99eB8c5Au/pxwbpwuPJrsnumO+IVeHv/bfdS+cYZtKVm9oFasKx8EwNM3ZBaKv8lWz+4cH6aLLn0W/+93vaGRogAaCVlZ8GlFJnUkaTDK6OP4UTTp79RPpvq/cR48Pz6eriy4dyDV+HvqNdItxjUW0/MVX02233EbFok12waHSMT6Z8/GW5EKsESSIledZyx4m9W1yWZNufv9H6RM3vp5uNQr0Jv7LUt7mAK0ie34mCHKu3TVGCxM2Ed9wnLmZx+3qZ+AIBDjQk87iA/lrg0SLdu2ky59/Bf34Zz9VsWWGk9rp5U0bgk3bdekZT3s6ffnLX6ZHRgz6ltOGmeghD3Jw8xrezsVnn0F33fE5GrAGKZfLkJUxKDuXox7RzNvDQewk4asEN0OU439ZGiwO0F++5o305fe/nT5CRXpmsgtngKaQCsZpmogb5HR9E3GBAKdlsKpb7aw80b+bJp0yNkp//NLn0idvl+qnTC6iJYViC3nrtCDiUb2hs+c+93n0sQ9/nD7DERd6H5+dxziweQ2ftA+ctpK+e+/3aNHQYlVyUiiUyMxEVmqTghwvKJCRX5fgWRw+cIwuv+pK+p8vf4Y+xX+4PPgcoNVMPqX5LaiCHTWhnE1d30RcdGGuK7McTt2gC1dzj1hedOnnfOly29Ei3fuONfTOv34bkTxQjfO/sbHpg149nM9xVX2xekT3zmgaHhhUgZTcNrnp+pvoRX/3HnozX93/NMXVFRDtyZn0iizR1mXz6Dv3fJdWLFpJgzTAm9WkgYEsmRLfyKaUlS7rVq3f6NaQNHuy97icg0xyQCUFcSXejo9t2EIXXvRUOvKb/1BdiuAZN9BuEuCUeFfPWMmvpBYfMzYEg12tviMcoAssKHn0+hLRv+SJvvcvH6OX/sVLaWLUpjnD07u/KRX8WlRXQ6ocZ3h6Dv97x9+9g8599cvoLQN4EGAa37Fd2pJZQPff90O64AlPIqsUWXkt2JR+iGSQkTHJ4un99ne/pac860k0b+d6upNnB72BQ3vxHur5TSlKHNtIx8BJnX7A2xoMdrUuDHDUdVModYNumc/eJi2sPsMZ0YYffJOuuOoSOrr/aPAX/0CQoKNVQY6QSsfZTI4+/8XP0cJLLlZNnKWpM1Qn3V7caQ3QZz/xRXrKWU9TsYzUu1HkHC5JPqxrU+of0qmyAb4y/tZ3vkuXXHkxnXbwKH3V8fc1gHZTTzE2jVTPwDkyaDjd3ou41oUBTjcJB2H8qjreDN5CW0jG83nOryYf/g2deeFq+u3//FZ9Lk3H/cQnBLlNJXma3nRNIgefNCnOUo6+++3vknvG+fQG/vBhPCOnov/kOGYNB4Gv+uBH6SUveoG/rYr831h7IgrZUp+445P0kpe8gM7lGbk/Y9KZ6DATOohnuhzgFHhfTXZCe2jFQNf3Iq61IcCRSSZJUXIzu1tvaDc5p4RUpKPOL/MmWX50H/3pK15Iv/jVL6ng5dUtI9nzSlKZQnKuuN2woQwObYb4/xnKZQbolz/7JY2uOoVeWfDo4WzTJ951pDK21Fd63o3vohvffh15w0S5ebyeBvh1JOsHpbLdGhgfyl0m/05TEPTavOOEDufXv+ka+so73kqf4b/9uGjSCjQDhw7id9Ng0zn5I/SU0WT3TB2TDgSDXQ9n0VaR0hsEOh3jHA5y7uXjfcXhPfScKy+he795ryq/mbTzqrIxTfKX5EpcMrUmk0IIy8jSYG6Avv31b9GuhQvplSWXduSSVwrsdVI/SYKbC17+l/QP7/sAB6RFci254OGVJ080a2BQ4/MjpUyQ1Ht5yfApk//Lj5fouc+/mn5351308XFbdRWyBMENdCCP854bdo3TAnnwZAKW5+0OBrteFwY4clILpw6nbkvhxNeJzswTfXPMoE+XiG559evp3R94jypJkSd20xDvXVYzMs5pcntFeriWgEo6gszlcnTeky6g73/v+/QoT/gH/Dfwn3XzBt5Gy5//R3Tbpz9FXo6oaBT45CXRpz62mrCt5Oeni3CUyZJNW3dsp0svezbtfuCHdAefQdFSCjqZ1MNJc2xkS73RRFygBAf62qkFj/6K88hbCkT3v//D9NrXvYZs16Yi52pmZuZZQbLTcKqHBDiu56qkKzfbhSI9/aJn0t133023ZYl+1eeFOBLcvJoDiLFzTqW7v/hlygxkgrOWR8dolLdBeCtIRNJg8pOhOGrrzi30zCueTpMP/pY+i5ZS0OHURRTvwGke8rdkwt4UDHa9Lgxw5IwfTh1Odc+AOLLTXcIZ2B38+uDn76Y/esGVdHB0v7roUf0LBQ/ni6MDHZ3SkKbplmWppGUGcirIefkrXkEvee/76HrOz/u1+fjOAYNemyPatmQh/eQHP6XjlixVz7jh0zVl+d8wjQTfTLvmE5IdIFj3XsGl3/z6V/Tkp51FSx/fTV/iv6E3cOh0cvdWnp4+ZAWtDBM49aDTE03EBXLelsLq7mRyNX47xxpjP/lPetozn0bb9+9QAU42y0EHnyTUlVDkX70kyJEUZjsO5fOT9Df/52/omTdeS3/Fn/13nwU52zm4eb7j0ZY58+m73/oenXzCiWr9axLgWJThIyq87lJcpiYV3Am/+2t300VXXUyrjzn0bzzJ89FSCrqAlOBI6U2aM1Uv9CKuIccFCHkWZ2Z38cXO4s076KKnXkTrHlmnAhnXdThDjctAZ1N2U93g8BAHPZaqm3PLR26hVS//U7qG50t6zO4Hh3k5XzDs0UMjRF//6n307GdepD5Xlb+Z3++TBDfhktwmBDeCg953v+899NE3vpbuLBHdz7nFyegNHLqEdNVw3niRLjiS7F7qzvnGOL90fS/iGgKcVsFtqq7x1CLRlzgvXbRjO1307KfTt7/5Lcpl/CIUOWFI8jU2sFHPdHH9H5cgZyA7KKEVfevub9LwFRfR6/lz6Tm71/0rp99zzPK5z3yOLr3kObwGXCq5RbLkccGarCad6jFj/PIfvXHNDfS9j32AbuX84RpOx0s3HwBdwJS6fXzs3LhnlBYl7EX8seW90Yu4ljjXVQXyfPJVRV6hlJ6+4vWTYUi/PHHJiKRMkKKfd3hST8fl+VavvLp5leEU2fnO4yDn37MGnV6YoDdf8wa69dZb1f6utqkqQZAkJQeNI79dzqMMT0OqPH/rK18l+4ln0Kscos09/CDA/+UA7hZ5mN+1a+hVL3u1KqeR84Q1dRsvOHpkFejVMNsDisdzjnEIecwPVP2SeXmgvUOHDx+kSy+9hH7x+U/RrXzeu9j/CjRY2bkSye+8VfII6RtvVvlrOdORc1bynZe/2jNNxAWKFZpKAprwKpb3wSB0vOV8tf4jx6QPHD1Md954A73lphtUXF7I5ymfnwi+1WDSRH2KQZNOUXUiefySZXT/t79PO5csoRfxfG0eDL7SQ+QW3Gt5/V7wqtfSB//+Qyq4k6NHH0GmCkCEHETBgVRnrCcXU+Yck4qlPE2UxqhEedq4eyOd9eQz6fBvfkm3cwZxUbLSfYCuN2C7PdNEXIRzXwCIWFp06Y2cl36U029vv4Ne+uI/JduepOygvlcUzoIbb9Ac9EuKjAE64aRVdP/3H6CHh016cYboQK53SnIkuLmGV+Oq5/8x3XXr52goM0ilknS/4K9bvzJxeD2Hln22q4HHM+dycGPnKZcdpJHsPPrDuj/QU5/5ZDpu1wH6Av8dzcChmzmmy9dMya+qF054PdNEXDTvzAzlQiU5QTUL6CJXcrrZc2j9979Hf/QnV9GxiSM0XiwvxWnGwTQ5nqfJyTzZNEHSlcSFT34K/cPf/wM9xHn/D+RBhD3A5kDiY5wepQH60l13k+EZVJiwKZttdtMxj//ZVJLOrNh3HvhXevJTLqSTd0zSfbwxpUsPgG4lD/hzpcsXfk3qtH30eDDYE7owwJFZDqdu0IWrGWaQFlbyrJxjv/gfeurTz6eDB3ZxBskfNpFpmDQwMECOY1OGAwC5SXPXXXepriZeaPfGfpXhOO0mXrAz8wX61je/RcViiQaG9XM75OwcTrMlwSAn199eri1BjcO/yEGO6dHHbv8IvfAFL6bzeRI/sgxajZZSzYGLu5ZR/VDlLMqFnrNVzeEhw8559IvgbU9AzguQgtyyuDNLNLJ+J5193pn0yCMPq4PIceSJOY0llZqzgzwxk4Mca4Rcr0Qf/NAHae7jm+hz/PH8UqOn2D7Sy/v1vCL/9j1/Q5OFJtVvct2gYYRLZiangkZZg+//x/fRl97yDvoMv7nfNmhZwhYnMDtyvEy3RIRmkRIcuQaSystJPHL8wF7+Zs+0oBJdGODIKSmcukG3zCckIZnxv/JJ49RjDj3lwqfSV+69R/UlZdtSZ6Rx1InJMoKD1KID+w7SR/75n+h6zhye2thJdYTn5IhWjR6gNX97E0m4OFmUHk8beOxwoOipZir+GjU8k175539BD7zn43QLr0/pMBPNwKFXSAmO6nKmrOFCZY7pHgwGe0YXBjjdhE+muomeepX3vNKT7W/QwaQPq+8bJt1acOijr3s1feifPjj1rJxGkl+UujccPdFb3raGTp0YpStj+sjqBWfkiW7gQONL936RfvXfv6RMrtr6TBuIyDrjYFFKbkolOnzwIF35vKvo0a9/XZXISVcdAL3E5TzHyZZS5DfenmCgZ7QhwJFJJkkREiDoYKHbdOt8Q1WrCi69kTftR/IOfeM976I3XPdGKpXK6+TIlg+n1GyPLNuk//3Nf9PDX/kG3WYTndLDpQwvMAw6n4OcN73lzRzcZVRJjuOUyHWlyCq6NmU96BSv4AUdRvFmcfL+FnjkD2vpGU97Nh38+S/obg5upEQOWi9F4x6YBc8s0gWFI3TuISkJrS1nGz3VRFzERBLQHHJyLc/8oDdIC6tPcib5289+hl71mr+giXG/hqoUD9fN8Yv8JHi6jgd7/ZksS4sefZoPk9x/raVb7rqFLA5z5IFnfn9d0cqSfsBSTdbg8fm16NiqP7H/+39/S5dc8Rwa3LJONQM/D5WJW04Cm8SFCjBrUoLz9q0TND8I7GtZNO5sDAZ7RvcFOLokR6eOJ/PYDfMJ9ZAn3X7RM2jtV79Kz7n8ObRt3zbKUYbq7rdugOjmf/og0caH6dmNvwPWkaRE5Tpebf/wvg/QoaMHKJPJUMmWUpygNCbWdGmOGyQh/VaNj49RJmfRD37yPbrkskvoxMNH6F9zBj2p2s8BdDmpZFytdDPqlAO904u4hhIcgAa5oOTRZzNExf/3W3rWZc+ihzY9FPxl9g7u20/vu/kDdB2fp87uowz5mRzMrdh3gN7xjrfT5MQEZTPSAWnt01W4x3EJckqOQ0MjQ3TzJ26m9738/6NPlQr045yp6lAB9LJzx/N0zrHkdw1yzX7mRRt0X4AjD8wLp44n89gN8wmNcGGJ6G6LaNH6HXTxRZfQ//v9/1OfyyPlEu0Frkf5Cf+eeaFQoBvfvoZOO5KnS9Qn/ePcAtG1vC4/++kv0u8ffFBCFf402Y0NKbWRfyX+N+aM0uuvfR3d8/Z30K38m9JSalkRJaqdAGfFRgjvy+Vr9LrdY3RcwodV7ppHPdWLuIZ9rKUa2zkjdKbz+KRyn2XQKUeP0sWXXkxfv+/rvOUNKiZpRm4YNDjodzT12//5LT3y9XtUqdBpfVhX5OWWSefy69ve9jZyHbm4rH26kt6rpGym4BSoUCzQy17xMvr9p79Et/Nnz+6569PuhjCzkWKOjRQVndYtN7bw13vqGTii5QFOuOfUpA8gAug2qwse/cgz6ZZjefrQK15B7/z7dyXvfT9o13ndddfRtbZfKtSP5EGGd2cNGv/N7+gzd97Jn0xniTIUl0FKq6sS2bR792668MILaf+Pfkx38FkOHWZ2Dnk+C24QNl+a3NXweqsXcQ0lOC2DVd1vpKPOv+Jc+F84sPn+zf9Ib3jzNVRSFWWlEqwUJ8QUKQRnpX/+0M1kPPwwPanPC/3OL3l0Pa+Dd3/g7+ngoQPBp5VJCY48XfrSKy+hoQ2P0Z28utFhZgfh/Vta97imSx4nlOM0g8tHgc2rOnkYmXNoezDYUxLnuuquNl9Z1l8Co3dqPxkcOsanyLRUIT+n6OfdkELzzW/kP+gjl/F55lbOZB/68t303D++knYe2s6nHpvy/C/O/u0H6CMf/Bi9meOfC9HShy7NEh2/6yi99/0fIFuVglm8/gx1BvGPJvmMXz2DfvwfD9Czn/NMmv/YdvoqfwHrr7Ooc58hgb1EnZwJh8+TSJzH+ivJME0y+X0t8vVwtxcyLMGNaeQ5Jb8nu2jM2BAM9hQUKzQVr96yitDyPhiEviL1P+T5Lgd+9Eu67MpLaOvhoNNe2R84+eG+v3O88z3vouVje+jKARyeQjq+vMHiIPETn6JH161Va8l2PZqcGKfx/DF+51fM/vzn7qSX/NmLaXWhQN8aMOjMhBUsoXXKT3/YvxtFBTbhlWukK8E5bb/bU72Iay3fw6IRK0C/eDpftH6Gd/mRDVvp6U9+Jm1+bDMVj3Foo/6TNpo2/fI3/0l3fvXTdFOW6PSCX0YBRH9smXT+ENG1b76ebMejAdOi4eG5lBsc4L+a9JGP/hN9/Jq/opsPTtIPiyavu+Qnd2ghyYjdLKccGa70GI8gZzakHpOIPUOYBhX4giBp9jo6YDi91ou4hr2rVXRJDh/gfH6GPiVBzheKRCu2H6bzz38yPXD//VQcd9XVlpys/ubd76Dzef94EYL/MiuKLn2a192xX/+C7v36Par2UsmxaWxsjP7imlfStz74PrqFV5nUeZK6T9DB1LkQWU+9VGVtTvJAP12Co3sQL/Abw78hWNODq7L7+Js914JKdOFepg8OnTqbX2/Jmqq/BHA+Bzjfy5h0VsGmV7zyZXTXXXeRW/LoU5+8lcZ+8St1K2txEVFwlDzh+FqOXd72rjW0f3wfjY6N0ite8mf00F330id5nV6KVdYVXNNWCZWMZ88I9nUJaPzSnOn8UAKcM/MlevKxZAcEf2t/MNhzOj9C6CG6WBHghIJLP82adIsxQbe/9a/ob//2b+md7/o7uon3EXT+WNlT5QnH2w7QG667hi69+lm09xc/pDszflcZ0Plwjdc84aDnxp0TtCDhLW7To57rRVzrwgBHR/06dTZVdBiZz2RxNfS6xSWXrrGJ7uAM+ocfvZmeMJqnZyMDqOopBT558zr63j3fpYHHHqMv8cEkt/2gO+hzn5wXdYYM9eAs3DPL1qVrGakuprMO9Vwv4hpKcJoqHIRNBznIwyBMHkInpRC3WX6LIajujw2TPsuv900a6qnR0EU4IzbJUd3QWnxKlEAHZkeCGr3+HM5UdFDjeQ4ZKZqIL5hwNgeDPacNAY5MMkmK6Jrew32q5Gbq4A3NN++EruyNACFSCoGuBJJZXnTp9SVpZYbcsdtIf6k5DuYztkdZx+RzZMy5HhIzgvVX4osjaTllGvw/r0QjVvL1esoBZ0sw2HMkCEx0lnhgUZbWrFrJOySvQOapJxL5P1CNPKzIcV1at3ajyufPPPv04C+1RIIZHdx0yQExHdyY6p6okAh749ZNdPa4R2/N8BtZFHlwWR3xDkKlDhPdIBWOD7XZefurXhk4qefXSeJh/RNqVP5f8LFSbx0G9ZsJ1DmZimpNPzpdvQ6EWvbgCy4Hg5JRFmsEhbWWI+38RNU7freJLm/V5eM/qm3GI+n9+5/zROt5u5228gQaHBymgumQrSob96vy/GzDho3k8MXO6jNOpWwmQ65acZVJgKieWyyRI+eROf7+aO4QfXnbAbpkX+L1+jLeTPcFwz2l+wKcqC4IeML3Qx9bv9lf45KCg78sRYXGjVXr79Ba0e0Rt02F1BvJcZLdV+/a+lX/hh5XPte7uf5b9DtJpPmuiC5L9H1Urd9PMv3w4Szf10nI36QCtsxHlpM8pVgegxMm300630nmRzRr/G4Tt7zVlk3+Jkn23+A1x6/DAxk6fslyGhgYIJszEPmzvgjsP+X512wDHEcCHB7K8kY6xdlPX9pwkBYmeIr3rnnG+IpRbzWv/p5sJo4Ap4l0YBM+eCcnJ2loaIRGR0dpZHiYDNtV6zBc4hPe6Sss9RS/qWUVtdZPrdt+GD8YqCAyfvRRAF6FM7ftOGTySUnul1tBcbJt+8URZvDec2WnkO/4XZcI/aof4+73aVXFjPmvsTxTguWaWr4a62lK5PdTTn/68fSuOrnL+lGdlPJ8yPrKWHwK5/f5fJ7mzJ1L48cmgu/7PD7o/HVUaf6Tzl+zxo+Kjt/hIss7c/f2/y79Tfm36f3911QZBWfAvG+XSnkamTNElmnxJ/r76qUPla/PdAGOSabr3yGQAMf0XLI4fXTX43T1oWSV036y2vrDFesd6bS/JyHAaRIJbmTHC5fe6HU1FczwMsnJeMY6DC1TePw4/omh3pMnxo+Xfnx53tGU4OQex+EAJ8MnMCGZeLyZ488IoNTfk85/0uXR9O8Gr5WOQW3GsZh++uXL585YvvL1YZZ9XweTU9/h+fX43BOeb5MzVXXMqfFqzZ8er9Jypxw/uv469NxV2cz5LT8/lf9dnlSctXNkOpxnmLyPy/IbNp+zOAfnJNtJBzj9q3z50wY46hyjtoH8jjww1KWP70wV4PyYA5yrgrc9p9/3rqaTc67NSQc7UqAoO6FKvO/GBojqRBD0ths9KYapv1X5u/ob/l5Zk/9ea/sE27myGuOn/nut72v6e0GqOZ+BGd+T4WrvK9HfkwsAj4PG6cTxiSrJ8RNPTv4eBCzqb5ysjOEnS17NsiR/nw6KovMzPd2ypJcr8fJF0ozxApU+71gyr9Xmd/rv+v/+ec9/lVIdqW/jD0verLcDzFb0AlqCxqndO4Gc3Zu9iGtqnQTDVaEEJz2HZ63Iq0sOZmkSmeF1Ja+yznQpTtkVf8T0EldaRv8btUp5ao1fG8aPN3P86czT55cmzBzf5WNCMmBRXipRLjp++e/rEo5aItOvdcxMHWvBa9pMuFZJTpXpq+WrNf1avz+lQ8ePqrI+OlP5/Mr5rQwvz/Q5yS+FlEBU1oN/7vMv8ESlW7j9o3xdpi3B4ZBfDfmtqTh4JIdu2bON/uhAsudNPLrcfOfZe9wPBm97TrcdWV1HBzNxK1o+04HOFNlRgyT3r/0U/MaM5P+qOndUTP5DoOJTtb/p1MnjJ0mtnX+1TUOp2vhq27Zj+/FpsDzJZ6E09d1gXDfJdII047tx06+Rpr4bM/0kvz+VOnD8aKr2t45M5fMr4s5N6m8S2AW3pKRrBj/gqxHsQQrT61PWufAsh88pwZsETt/r9uwzcIScXxPx5J8rlf7KU73kiq1Xk8Wn6xxfygzwVUqOU4aH+fSg/ibFs5LkAkbvpirxSSFN8jdhtVSvsrmLSbXEjRNOcfMsSYsbR6ck4sYLp1rixgmn8vl2eYOGUyWyD8jVmasqElfm34KZTtHpq37OYpPeD8vHT5+C31F7c4I0NV2d4n6zcoou3xTOWFWaIfr9aAp0yvjR1HXKl8+Q0pho4s/lVrwlpZScpOly1vFLr6eCn2D5Z+4v/Z149fF64f94vVUvvZmm1qca4HWfzVNG5Qu1HR3s3V7EtW48wrqG7HhyUOvbUlM7YkB2w2S7IvhXgzEJkolbd5IUeQ2nZotOL5qgu+lgh3exmATNIXWdimaJkj7j76EVAz3bi7iGAAegDeRqDQCgXrq+kxQYnzlWoHOOyO3A2lyTDgSDPQsBDgAAQJeRwEaCGp2kB6Ab9kzSwoRdmBiesTsY7FndE+CE71uHU8PJbzbjdzX9+7OdTr3jt9ss5z9u20tqOZlmOLXaLKcft+4kNZz8ZjN+t1H0/M12Pts9fi3N+l0tPO+zmU6949erx6avbjO7qsWu9Ec1/aDM2rK2uzMY7FkNWMMAAADQDlKSI2U2UoKT5tFCCyedjcFgz0KA0zeiFTl1gtaIW/eSAABmJ3ybSkpxdH2cJE46ZD8eDPYsBDgAAABdSjXJ96T7i6Jqop/UkK26ru1pHRzgyKyFU6NEfzeatEqf1xIdL5pqiRsnnJJqV0lB3DyHU1KzHa9e0elGU1KzXf9x0wynpGY7Xi3R340mrdLnzRadbjTVEjdOONUSN0441SvuN8NJq/R5LdHxoqmWuHHCqdniphlOzRY3zXBqNL9JftYr0lPGjtJTjyaLWXbPM6SX2l/773pXM9Y4AAAAtIR/EXX9rjFaWPQ/qWXdcvNxo8efgSMQ4PSL8MPdwglaI27dSwIAmCX94ESpf5Pu2VrOnmCgp7UkwGlElw4AAAD9Imm+KRWLJcChFPFN1qFtwWBPa3qAU7KDpyryxaqZIbJLJRVpyms2m/X/lojMalxqtGb9biXhZUky3bTfD8Q9A0VSy8k0wymp6Hg6tdospx+37iWlJuOEU1LR8XRqtGb9brOE18Vs5rvd40c16neSCs/7bKZb7/j1avX0y6cneaDkhfL8GsdxOKjhOIX/ZGU4s0xIWlCVeJw0BTgLxo1NwWBPk7XcVLrYLDtoqI1XKBTUe9Oy1CsAAEA/cjmoMUxTdayZn5xUeeTAgEUWf5aULsExUhThnLbf6+lexLWmBzgmbyhJc+bMUT2lTqiN6KnPpMdUAACAfqTzQpfzwvGJCf6AaHhkRBUAJA1ypBChxCMmLcGRXsSHHPpZ8LanNT/A4bUuaWBgQG08XYKT4Q2IujkAANDPJECRvDCfz6s8cnBwcOrORzIueaY0n0pWYPDQisH9/Os934JKSCXsRFHGA4uytGbVSjI9/9aSJzcKWa3u7+W+ogQ3pVKJ1v1hIxkZojPPeoK69yif1StN3xt9rVktdmZVj6SB6l2uVs1/pfnE+utv/b7++3z5pa6NY9tkcz752COb+AOi008/iUbmzKFisXabb4/XXylXotMLB+lr6ydpfqH2+vzp6UN/uHzj5LnB257W9L1DIlG5zyjFbUNzMiQPXDx69KgKbhCcAABAv5L80XFdmhgfV+9H5gxMVTBOfofDpTU7kwU3wvC8nu9FXGt6gCO3oiQ6lQ05f8EC9dmRI0f8e4+oaAwAAH1K6t5ICY5c9EtuPHfuXMpygCP5Y5IAR99B4W/7AwkMON6OYLDnNT3AkSBGNqBEqaoeDsc0kxNFVRdH18cBAADoN3J3w69gPKmah0uBgEhaemO4HjkS3qS4GbJgwumLJuKi6QGOzcFNJptVG2xoaIjmzRtSn0vEKq2okm5IqJPcq45LadU7fru1a/6j09Wp23T7/Hc7rP+eIU3DpQBAWk+5DlEuZ6oKxkLyxloVjU3OOmUPcF2bhqzkz805+aC9JRjseS0/QpYtW8ZBDdGhg6Pq1lXSojgAAIBeIoHMnt0HVN3UVatWqcIAIXc8arakMlwOkhxypBVV8FESQ07v9yKutTzAyeZytHTpAt54RLt37VJFdF1BavvHpW4RN++SukXcvEvqFnHzLqlV4qYtCVojbt1Lgr4kpTdyYb9t2zYOaogWHzdf5Y3SujjNRb+U4pw7WaILjgQ9BtSwZ25/9CKutTzAyWQyNG/ePBoczFB+3KHJ4MF/KMUBAIB+Ic+9GT08qW5LLVywwH82nCulMvLQvuSVam7cM0GLisnyz7XLjb7oRVxrSYAjG0unHEeo8qTGxYsXkzVAtHffPtXeXyogd1SQ0+1XWrOd/+g9/mhqlX6d/0aZ7fTj1lk4QTJY/xBDghe5DSX9T+3YsYOyQ4a64JfPpD5O6jzQtclIc4PK8PqiF3Gt5UeMqnfDUao8yGjZsqVUmvTUhpZKxxLk4Nk4AADQi+QWlOR1GzY8zsEM0aKFC2l4aEg9J06CGwmA0vB7EU8+TsbtnybioqUBjgQvErnKhpTSHIlc5ywYpFLeo507d9LYsWNT3+s8chUWcyU22yu1lpN5i0vdIm7eJXWLCvPbsv1HfjsuQWvErXtJ0E8mJybo8S07aHDQ4jRAQ8PDquRGAhupj5om75O9xzFdHsd/n8TCcWNDMNgXWhrgyEaU2uHyKhGr3HM8fvlymjOfg5xJj7Zt305jwRMdUZLTCpHN33VF4N0+/+2G9ddeWP+9plbdmS2PP07SolueVnzCCSf4JTecJ86m9EaefeNmrVQtqE7b1x+9iGstP6L0DqAiVk5y73HJkiU0f9Ewua5H27ftpGPHjqka5VIhWXaAzgh2ZFU1YnXp32nU7yUVnW4wbTmp6qSE/hZL/73W9xotOt1g2l03//UKz3ua34uOF4zbNeuv20XXW7Du+n39h5e/WuoiksdJ3ibVMSQfkxIauXBf99h6svNEAwM5dWEvt6bk77prBpEmyHElwMlZlOPfT6qfmoiLjthz5AGACxctojkjHOTw6t+2ZTdt375d/c3gAEd2GB3ooGQHAAA6jQQncodCSF0baR0lrYSl+oUksWjZPBXcyIX9pPQeHpK2grGU4JQ4B7cS5om75htye6RvmoiLjgmNdZBz0mkrVeuqg3uP0rp16+jAgQOqOZ0OdCQh0AEAgE4j3S5IF0TjY2M0OjpK27ZupSOHR1W+tWTxIlq6dKlqYCMBkFPnM+CkBKdELpkJK+FsXJLpqybioqPK/iTImcsb//jlx1FmkDfepEe7d+6nPXv3TgU6UuwnkbIOdDpKlxWlQofB/gPQtXR+JPnU/v37adu27TQ5ZtPQ8IB6SvGixYtVKY1KQUlPfVw6b2KSzjmYtE9HY28w0DekgVmicrH7F2VozYqVHBEFnYFJz2DMpMYHGbKjSCAjdXH27t1HTtH/fGTeAM2fP1/1uCrFf9KJpy7WU6U7ZjMzCL1D1phG2kyqZS2v6pz/ls1nJX0+/5UkXq5uX3/dDutfiS5fdLn03ztweXVQEr6VJPmO1KGRUhspsTl86BAVS7bKs7KDBh23bJl6/InkV1IXp1Tyq8BIlQt9OytMfi+pQrZIt2/dTX90MMgga/i/J+W+8Mytxb8M3vaFjgxwNAl0ShzEHDl8mA4fOaJKdBSeheGRnCrtWbBwoepeXu5p6q7nm0IfcDUzoFp/j2rRgVz3/LdoPivp+/mvJOFydfv663ZY/4Ho8kWXS/+9M5dXmnVLkCIBjTzyZGJyUj3XZnKioHoDdwr8nTkZlS/NGRlRQY3JwYw0mBHSFFz3MxVX5yZNgDM5kKc7H99DVx5IVm/40eMy7z57r/2B4G1f6OgAR0jQIjuCbPiJ8XFV9JefcNRcy46Uz9uqF1ZdE12CnrDGleroA67G79U8gUXoE1/T1Tn/LZvPSvp8/itJvFzdvv66Hda/El2+6HLpv3fo8koeJAGOKqXhuGJ4To7yk34JityKks6kpX6NBDVysS0BjjwORV6jzcHrDXDGByfoc1v20hUHkl3UT1r0ymGH7gne9oWOD3ByudzUjiBdOsjOI6+yo0k381KZq1RyVesrmbVoPBOzD82OXsxG/V6ryfx367yLXph/0a5l6Pb11+2w/nuCF6kXnBkg9ZiTBbovKc5wdKmNCFejqBbYaGkCnFOdI3TXpgN0XCHxjvUy/vX7guG+0PEBTi2ys0gpj0TV8ir1dsKq7UxNkfYKPKrZVy4150//PTIfnXJF1e3zX0uz959eX3+drt/Xf5cvv9whkItseX6NqBWQhBvCpHnGTSXSe7iQFlQf3bGNnnc4WQXjPfNocvkonc6j9VUrqq4OcMI7j9zXlGBGouiwRuxU6dQ6gGtp9oFcY/70CWjGCaVTTrDdPv+1NHv/6fX11+n6ff139/KHL5iTlLaE8yhRb34UDnD+mQOc5ycMcH72BHPtZRvcJwZv+0ZXBzjhnU1qpcsOJ62vwjq+BGfGgdxkaedPa/V8VtLt819Ls/efXl9/na7f13+XL7/kMWluIzUqwJGH+klmPdsSnJ+uNn92+Xr3suBt3+j6W1RSk13ueUpLKqloLO/DOr8Ep9UH7ixPMB1zBdnt819Ls/efXl9/na7f139/LX+9AU44oBH6vcP57sd2baXnHUoW4PzyVOtLl2x2XhO87Ruz3ds6hjQPVzXWXVdVPm4/ORCrpXaLm6dw0ip93m7R+YomrdLnnS4639FUr7jfDCet0udQn+h6jSat0ufdLrpc0aRV+ry7ScCTNFkcxGSCpD/L5QZVcONx1p2mF/F5+f7qZFPr+gAHAACgF+kSG82WVlmuR67hcpiTPMI5bb+7KRjsKwhwWq7Tr0w6db6S6vb5r0UvX7OWs1m/C8n0+/rH/hcmgcw0kwOcItleidycS5lo9FPFnBIlu5fVYxDgAAAAdCyXjKBytu065Bgc4GRKZEgN2gR2zrf6rhdxDQEOAABAB5LWU5K0TNaiTM6gJ+bH6IIjybpo2Lgku5V/oq+ef6MhwAEAAOgwEtjo1lNCNXn2PPIyRNdvP0oLi8lKcEzydgeDfacBzcTLH6zXblLTPKz1zcQBAABm5ke1ldc/MoL3pptTwU7JLVBppEif3LiTnn8oWV2l35w88MWLHi+8NnjbV1KV4IQ3lb79h/ABAACgeXRJjnqYrceBTcL6N2Je3unLJuIiVQnOW1asJMvzS2xcw1RFaNJav1zau161otBav4fxq8P41WH86jB+dRi/OoxfXWT8yBObDQ5m5BdcynBObfJ7h05yD9FXNh1MfItqLEuvmluiLwdv+0qttT+N16W0SpMRVOJhi7eFLkKbVmuDAwAAQDV+cMNpKu/lvNX16IY9Y4mDG9GvTcRF4hKcBxZm6a+XryArKLHx40pmcogz4zZj8rjJVykoSvo7GD8exk8G48fD+Mlg/HgYP5nI+EEpjgQ10RIcclz68N7t9LwjefWdWvbOpcnjjvVfL+Ja8gBnUYbesWwlGYa+JaXiSSLLf6qiL2aD1upcLVIkNwPGDwYqwPjBQAUYPxioAOMHAxVg/GCgAowfDFSQevzp9+ouidS3YX6YY5JhE31o787EAc5PzjDXXfGYe1bwtu8kDnD+fVGW3nXKaeTa/tcdfpHAxpMNJK+u/pkaG3SGGjtIzd/D+NVh/OowfnUYvzqMXx3Gry4yfijgkcw5KEbg/5sc8JiUMTL04R076KqDCQOc1ebPrujDXsS1xAHODxdn6f+cdhrlJ/0OLT1Pbk255JryngMcFWlW2JiVotjQxqwK4wcDERg/GKgB4wcDERg/GKgB4wcDERg/GKgh8fgz3+sSHE9uUXH+miWL/mXnXrr6ULKH/P3idPPLz9novip423cSBzg/WpKlG1afRnZQgiPr3TPtUICjfyZmY2IHDwYiMH4wUAPGDwYiMH4wUAPGDwYiMH4wUEPLxp/5fvoWlR/gPHm8RLds2k+r8smm/dAK433n7/LeG7ztO4kDnH0DvLLm5sgy/Y3lkfRlKqMm3MgAAACQiOSvOnOW/Facc9SmZYXkeW4/NxEXiQMcAAAA6Cov49DovmC471QoOwMAAIButauPexHXEOAAAAD0mA193Iu4hgAHAACg9+wNXvsWAhwAAIAek3W9HcFg30KAAwAA0GPm9nEv4hoCHAAAgB5z0gF7UzDYtxDgAAAA9Jh5JUrWn0MPQ4ADAADQQ/bOVcFNXzcRF8YvTs1tDYbj+Q9QjJf0EYGVfqPbx6+lUY9QxPLHw/Ing+WPh+VPBss/O21YfsPwv/zFp4987rP3HHqfegMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQpYj+f1s3XTNHDcKOAAAAAElFTkSuQmCC';
icon.style.display = 'block';
icon.classList.add('spinning');
popup.classList.add('active');
}
function showConfirm(title, text, onConfirmFunction) {
document.getElementById('confirm-title').textContent = title;
document.getElementById('confirm-text').textContent = text;
const confirmButton = document.getElementById('confirm-action');
confirmButton.onclick = () => {
onConfirmFunction();
closePopup('confirm-popup');
};
const confirmPopup = document.getElementById('confirm-popup');
confirmPopup.classList.add('active');
}
function closePopup(popupId) {
const popup = document.getElementById(popupId);
popup.classList.remove('active');
}
function closeonlineplayers() {
const popup = document.getElementById("onlinePlayersPopup");
popup.style.display = "none";
}
function getTotalDurationSeconds() {
const days = parseInt(document.getElementById("durDays").value) || 0;
const hours = parseInt(document.getElementById("durHours").value) || 0;
const minutes = parseInt(document.getElementById("durMinutes").value) || 0;
const seconds = parseInt(document.getElementById("durSeconds").value) || 0;
return (
(days * 24 * 60 * 60) +
(hours * 60 * 60) +
(minutes * 60) +
seconds
);
}
async function viewOnlinePlayers() {
try {
GoToPage("/rewild_net/online_players");
const response = await fetch("/admin/api/who_is_online");
const playerIds = await response.json();
if (playerIds.length === 0) {
showPopup("Warning!", "There are no players online.");
return;
}
const queryString = playerIds.map(id => `id=${encodeURIComponent(id)}`).join("&");
const playerResponse = await fetch(`/admin/api/account/bulk?${queryString}`);
const playersData = await playerResponse.json();
let popupContent = "";
const heartbeatPromises = playersData.map(async (playerData) => {
if (!playerData) return;
const heartbeatResponse = await fetch(`/admin/api/heartbeat_data/${playerData.accountId}/name`);
const heartbeatData = await heartbeatResponse.text();
popupContent += `<b>(${playerData.accountId}) ${playerData.username} - is currently in ${heartbeatData}</b><br>`;
});
await Promise.all(heartbeatPromises);
showPopup("Online Players", popupContent);
} catch (error) {
console.error(error);
showPopup("Error!", "Failed to get online players.");
}
}
function LogoutFromAdminPage() {
GoToPage("/admin/logout");
}
function GoToPage(data_tab) {
closePopup('confirm-popup');
showLoading();
const url = data_tab;
new Promise((resolve) => {
setTimeout(() => {
resolve();
}, 200);
}).then(() => {
window.location.href = data_tab;
});
}
const INT32_MAX = 2147483647;
const unitMultipliers = {
seconds: 1,
minutes: 60,
hours: 3600,
days: 86400,
years: 31536000
};
function updateBanUI() {
const amountInput = document.getElementById("banAmount");
const unit = document.getElementById("banUnit").value;
const preview = document.getElementById("banPreview");
if (unit === "permanent") {
amountInput.value = "";
amountInput.disabled = true;
preview.textContent = "This ban is permanent.";
return;
}
amountInput.disabled = false;
const multiplier = unitMultipliers[unit];
const maxAmount = Math.floor(INT32_MAX / multiplier);
amountInput.max = maxAmount;
if (parseInt(amountInput.value, 10) > maxAmount) {
amountInput.value = maxAmount;
}
if (amountInput.value) {
preview.textContent = `Ban duration: ${amountInput.value} ${unit}`;
} else {
preview.textContent = "";
}
}
function getBanDurationSeconds() {
const unit = document.getElementById("banUnit").value;
if (unit === "permanent") {
return -1;
}
const amount = parseInt(document.getElementById("banAmount").value, 10);
if (isNaN(amount) || amount <= 0) {
return 0;
}
return Math.min(
amount * unitMultipliers[unit],
INT32_MAX
);
}
document.getElementById("banAmount").addEventListener("input", updateBanUI);
document.getElementById("banUnit").addEventListener("change", updateBanUI);
function sendannoucement() {
const announcement = document.getElementById('announcementText').value;
let announcementId = document.getElementById('announcementid').value;
if (announcement.trim() === "") {
showPopup("Error", "Please enter an announcement.");
return;
}
if (!announcementId.trim()) {
announcementId = "1";
}
const formData = new FormData();
formData.append("message", announcement);
formData.append("playerId", announcementId);
fetch("/admin/api/send_annoucement", {
method: "POST",
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
showPopup("Success!", data.message);
} else {
showPopup("Failed", data.message);
}
})
.catch(error => {
showPopup("Error", "An error occurred: " + error.message);
});
}
function giveTokens(playerid) {
const tokenAmount = document.getElementById('token-amount').value;
let playerId = playerid;
if (!tokenAmount || tokenAmount <= 0) {
showPopup("Error", "Please enter a valid amount of tokens.");
return;
}
if (!playerId.trim()) {
showPopup("Error", "Please provide a player ID.");
return;
}
const formData = new FormData();
formData.append("tokenAmount", tokenAmount);
formData.append("playerId", playerId);
fetch("/admin/api/give_tokens", {
method: "POST",
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
showPopup("Success!", `Successfully gave ${tokenAmount} tokens to player ${playerId}.`);
} else {
showPopup("Failed", data.message);
}
})
.catch(error => {
showPopup("Error", "An error occurred: " + error.message);
});
}
function kick_player(playerId) {
const formData = new FormData();
formData.append("playerId", playerId);
fetch("/admin/api/kick_player", {
method: "POST",
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
showPopup("Success!", data.message,);
closePopup("player-popup")
} else {
showPopup("Failed", data.message,);
closePopup("player-popup")
}
})
.catch(error => {
showPopup("Error", "An error occurred: " + error.message);
});
}
function setup_html_show(data_tab) {
let tabContent = document.getElementById(data_tab);
if (!tabContent) {
tabContent = document.getElementById("home");
if (!tabContent) return; // still fail-safe if "home" somehow doesnt exist lol
}
document.querySelectorAll('.content').forEach(content => {
content.classList.remove('active');
content.style.display = 'none';
content.style.opacity = 0;
});
tabContent.classList.add('active');
tabContent.style.display = 'block';
setTimeout(() => {
tabContent.style.opacity = 1;
}, 10);
}
function setup_html() {
document.querySelectorAll('.tab').forEach(tab => {
tab.addEventListener('click', function () {
document.querySelectorAll('.tab').forEach(btn => btn.classList.remove('active'));
document.querySelectorAll('.content').forEach(content => {
content.classList.remove('active');
content.style.display = 'none';
content.style.opacity = 0;
});
const tabContent = document.getElementById(tab.getAttribute('data-tab'));
tab.classList.add('active');
tabContent.classList.add('active');
tabContent.style.display = 'block';
setTimeout(() => {
tabContent.style.opacity = 1;
}, 10);
});
});
setup_html_show("home");
}
async function fetchAsync(url) {
let response = await fetch(url);
let data = await response.json();
return data;
}
document.addEventListener("DOMContentLoaded", function () {
document.getElementById("onlinePlayersPopup").style.display = "none";
});
function updateStats() {
const startTime = performance.now();
fetchAsync("/admin/api/dashboard_data").then(function (data) {
const endTime = performance.now();
const duration = Math.round(endTime - startTime);
document.getElementById("ms_ping").innerText = duration + " ms";
//ram_mem
document.getElementById("ram_mem").innerText = data.mem_usage;
document.getElementById("motd_msg").innerText = data.MOTD;
document.getElementById("onlinePlayers").innerText = data.online_players;
document.getElementById("totalRooms").innerText = data.total_rooms;
document.getElementById("totalPlayers").innerText = data.total_players;
document.getElementById("inventions").innerText = data.total_inventions;
document.getElementById("clubs").innerText = data.total_clubs;
var playerList = data.quick_link.map(player => `
<div class="card">
<h3>${player.Title}</h3>
<p class="card-text">${player.disc}</p>
<a onclick="GoToPage('${player.Button_url}')" class="btn btn-info">${player.Button_Title}</a>
</div>
`).join('');
document.getElementById("dashboard_quicklink").innerHTML = playerList;
const header = document.querySelector("#Players h2");
if (header) {
header.innerText = `Players (count: ${data.total_players})`;
}
});
}
function communityboardMsg() {
fetchAsync("/api/communityboard/v2/current").then(function (data) {
const messageContainer = document.querySelector("#communityboard_Message");
let Room_List = '';
if (data.FeaturedRoomGroup?.Rooms?.length) {
data.FeaturedRoomGroup.Rooms.forEach(function (room) {
Room_List += `
<tr>
<td>${room.RoomId}</td>
<td>
<img src="/img/${room.ImageName}" class="profile-img" alt="${room.RoomName}'s Room Image" style="width:50px;height:50px;">
</td>
<td>${room.RoomName}</td>
<td>
<a class="btn btn-warning btn-room-view" href="/admin/home/view_room/${room.RoomId}">View Room Details</a>
</td>
</tr>
`;
});
} else {
Room_List = `
<tr>
<td colspan="4">No featured rooms available.</td>
</tr>
`;
}
document.getElementById("communityboard_rooms").innerHTML = Room_List;
if (messageContainer && data.CurrentAnnouncement) {
const hasUrl = data.CurrentAnnouncement.MoreInfoUrl && data.CurrentAnnouncement.MoreInfoUrl.trim() !== "";
messageContainer.innerHTML = `
${data.CurrentAnnouncement.Message.replace(/\n/g, "<br>")}
<br>
<a ${hasUrl ? `href="${data.CurrentAnnouncement.MoreInfoUrl}" target="_blank"` : ""}
style="text-decoration:none;">
<button
style="
background-color:${hasUrl ? '#007bff' : '#6c757d'};
color:white;
border:none;
padding:5px 12px;
border-radius:4px;
cursor:${hasUrl ? 'pointer' : 'not-allowed'};
"
${hasUrl ? "" : "disabled"}>
More Info
</button>
</a>
`;
}
const playerId = data.FeaturedPlayer?.Id;
if (playerId) {
fetchAsync(`/admin/api/account/bulk?id=${playerId}`).then(function (playerData) {
const player = playerData[0];
const playerContainer = document.getElementById("communityboard_player");
const imageUrl = player.profileImage ? `/img/${player.profileImage}` : '/img/DefaultImg.png';
playerContainer.innerHTML = `
<div style="display:flex;flex-direction:column;align-items:center; gap:10px;">
<!-- Title -->
<p style="margin:0;">${data.FeaturedPlayer.TitleOverride || "Featured Player"}</p>
<!-- PFP + Username/Bio -->
<div style="display:flex;align-items:center;gap:10px;">
<img id="profileimage"
src="${imageUrl}"
alt="Profile Image"
class="profile-img"
onclick="viewPlayer('${player.accountId}')"
style="width:80px;height:80px;border-radius:8px;object-fit:cover;cursor:pointer;">
<div style="text-align:left;">
<strong>@${player.username}</strong><br>
<span>Test bio</span>
</div>
</div>
<!-- Buttons below the row -->
<div style="display:flex; gap:10px;">
<button style="background-color:#007bff;color:white;border:none;padding:5px 12px;border-radius:4px;cursor:pointer;">
How to Build
</button>
<button style="background-color:#007bff;color:white;border:none;padding:5px 12px;border-radius:4px;cursor:pointer;">
View Rooms
</button>
</div>
</div>
`;
});
}
});
}
function escapehtml(unsafe) { // prevent xss
return unsafe
.replace(/&/g, "&amp;")
.replace(/</g, "&lt;").replace(/>/g, "&gt;")
.replace(/"/g, "&quot;")
.replace(/'/g, "&#039;");
}
async function viewProfile() {
try {
const meData = await AccountMe();
const accountId = meData.accountId;
viewPlayer(accountId, true);
closePopup('alert-popup');
} catch (error) {
showPopup("Error!", "Unable to load your profile: " + error);
}
}
async function AccountMe() {
try {
const data = await fetchAsync("/Accounts/account/me");
if (data) {
const profileImageUrl = `/img/${data.profileImage}?width=40&height=40&cropSquare=true`;
document.getElementById("profile-image").src = profileImageUrl;
document.getElementById("you-button").innerHTML = `
<img id="profile-image" src="${profileImageUrl}" alt="@${data.username}'s Profile Image" class="profile-img2"
style="width: 30px; height: 30px; margin-right: 10px;">
YOU (${data.username})
`;
const header = document.querySelector("#dashboard-title");
if (header) {
header.innerText = `Welcome to the Dashboard, ${data.username}`;
}
return data;
}
} catch (error) {
showPopup("Failed to get your account! Try logging out and logging back in.", error);
throw error;
}
}
function formatDate(isoString) {
if (!isoString || isoString === "0001-01-01T00:00:00") return "None";
const date = new Date(isoString);
const options = {
year: 'numeric',
month: 'long',
day: 'numeric',
hour: 'numeric',
minute: '2-digit',
hour12: true
};
return date.toLocaleString('en-US', options);
}
function loadPlayers() {
fetchAsync("/admin/api/players").then(function (data) {
var playerList = '';
data.forEach(function (player) {
playerList += `
<tr>
<td>${player.AccountId}</td>
<td>
<img loading="lazy" src="/img/${player.ProfileImage}?width=256&cropSquare=true" class="profile-img"
alt="${player.Username}">
</td>
<td>${player.Username}</td>
<td>Steam ${player.PlatformID}</td>
<td style="max-width: 200px; word-break: break-word;">no not yet</td>
<td>${player.Level}</td>
<td>${formatDate(player.CreatedAt)}</td>
<td>${formatDate(player.LastLoginTime)}</td>
<td>
<a class="btn btn-warning btn-room-view" href="/admin/home/view_room/${player.dormroom_id}">View Dorm Room
Details</a>
<button class="btn btn-warning btn-edit"
onclick="viewPlayer('${player.AccountId}', '${player.Username}', '${player.Bio}', '/img/${player.ProfileImage}')">View
Player</button>
</td>
</tr>
`;
});
document.getElementById("player-list").innerHTML = playerList;
});
}
async function goto_ban(name, accountid, profileimage, mbd) {
document.getElementById("banTitle").textContent = `Ban @${name}`;
document.getElementById("playerid").value = accountid;
const avatarImg = document.getElementById("accountimage1");
avatarImg.src = `/img/${profileimage}?width=128&cropSquare=true`;
avatarImg.style.display = "block";
const banStatusDiv = document.getElementById("banStatus");
if (mbd && mbd.IsBan === true) {
const friendlyDuration = formatDuration(mbd.Duration);
banStatusDiv.className = "ban-status bad";
banStatusDiv.innerHTML = `
<i class="fas fa-ban"></i>
<div>
<strong>@${name} is currently banned</strong><br>
${friendlyDuration}<br>
Reason: ${mbd.Message}
</div>
`;
} else {
banStatusDiv.className = "ban-status ok";
banStatusDiv.innerHTML = `
<i class="fas fa-check-circle"></i>
<strong>@${name} is not currently banned</strong>
`;
}
banStatusDiv.style.display = "flex";
closePopup("player-popup");
document.getElementById("ban-modal").classList.add("active");
}
function formatDuration(seconds) {
const years = Math.floor(seconds / (365 * 24 * 60 * 60));
seconds %= 365 * 24 * 60 * 60;
const days = Math.floor(seconds / (24 * 60 * 60));
seconds %= 24 * 60 * 60;
const hours = Math.floor(seconds / 3600);
seconds %= 3600;
const minutes = Math.floor(seconds / 60);
let parts = [];
if (years > 0) parts.push(`${years} year${years !== 1 ? "s" : ""}`);
if (days > 0) parts.push(`${days} day${days !== 1 ? "s" : ""}`);
if (hours > 0) parts.push(`${hours} hour${hours !== 1 ? "s" : ""}`);
if (minutes > 0) parts.push(`${minutes} minute${minutes !== 1 ? "s" : ""}`);
if (parts.length === 0) return "less than a minute";
return parts.join(", ");
}
function searchPlayers() {
const params = new URLSearchParams();
const id = document.getElementById("searchPlayerId").value;
const displayName = document.getElementById("searchDisplayName").value;
const email = document.getElementById("searchEmail").value;
const minLevel = document.getElementById("searchMinLevel").value;
const jrState = document.getElementById("searchJrState").value;
const ip = document.getElementById("searchIp").value;
const deviceId = document.getElementById("searchDeviceId").value;
const platformId = document.getElementById("searchPlatformId").value;
const order = document.getElementById("searchOrder").value;
if (id) params.append("id", id);
if (displayName) params.append("displayName", displayName);
if (email) params.append("email", email);
if (minLevel) params.append("minLevel", minLevel);
if (jrState && jrState !== "N/A") params.append("jrState", jrState);
if (ip) params.append("ip", ip);
if (deviceId) params.append("deviceId", deviceId);
if (platformId) params.append("platformId", platformId);
if (order) params.append("order", order);
if (document.getElementById("searchDisplayHistory").checked)
params.append("searchDisplayHistory", "true");
if (document.getElementById("searchPartialMatches").checked)
params.append("partial", "true");
if (document.getElementById("searchJuniorsOnly").checked)
params.append("juniorsOnly", "true");
if (document.getElementById("searchBannedOnly").checked)
params.append("banned", "true");
if (document.getElementById("searchOnlineOnly").checked)
params.append("online", "true");
if (document.getElementById("searchIgnoreNoBirthday").checked)
params.append("ignoreNoBirthday", "true");
fetchAsync(`/admin/api/players?${params.toString()}`).then(function (data) {
let playerList = '';
data.forEach(function (player) {
playerList += `
<tr>
<td>${player.AccountId}</td>
<td>
<img src="/img/${player.ProfileImage}?width=256&cropSquare=true" class="profile-img"
alt="${player.Username}">
</td>
<td>${player.Username}</td>
<td>Steam ${player.PlatformID}</td>
<td style="max-width: 200px; word-break: break-word;">no not yet</td>
<td>${player.Level}</td>
<td>${formatDate(player.CreatedAt)}</td>
<td>${formatDate(player.LastLoginTime)}</td>
<td>
<a class="btn btn-warning btn-room-view" href="/admin/home/view_room/${player.dormroom_id}">View Dorm Room Details</a>
<button class="btn btn-warning btn-edit"
onclick="viewPlayer('${player.AccountId}', '${player.Username}', '${player.Bio}', '/img/${player.ProfileImage}')">View Player</button>
<button class="btn btn-danger btn-ban" data-id="${player.AccountId}">Ban</button>
</td>
</tr>`;
});
document.getElementById("player-list").innerHTML = playerList;
});
}
function loadRooms() {
fetchAsync("/admin/api/rooms").then(function (data) {
var roomList = '';
data.forEach(function (room) {
roomList += `
<tr>
<td>${room.RoomId}</td>
<td>
<img width=100 loading="lazy" src="/img/${room.ImageName}?width=256&cropSquare=true" class="room-img" alt="Room Image">
</td>
<td>^${room.Name.trim()}</td>
<td>${room.Description}</td>
<td>${room.CreatorAccountId}</td>
<td>${room.MaxPlayers}</td>
<td>
<a href="/admin/edit-room/${room.RoomId}" class="btn btn-warning btn-edit">Edit</a>
<button class="btn btn-danger btn-delete" data-id="${room.RoomId}">Delete</button>
</td>
</tr>
`;
});
document.getElementById("rooms_list").innerHTML = roomList;
});
}
function loadInventions() {
fetchAsync("/admin/api/inventions").then(function (data) {
var inventionList = '';
data.forEach(function (invention) {
inventionList += `
<tr>
<td>${invention.InventionId}</td>
<td>
<img src="/img/${invention.ImageName}?width=256&cropSquare=true" class="profile-img" alt="inventionimg">
</td>
<td>${invention.Name}</td>
<td>${formatDate(invention.CreatedAt)}</td>
<td>${formatDate(invention.LastModifiedAt)}</td>
<td>${formatDate(invention.CreatedAt)}</td>
<td>
<button class="btn btn-warning btn-edit" onclick="viewInvention('${invention.InventionId}')">View
Invention</button>
</td>
</tr>
`;
});
document.getElementById("inventions_list").innerHTML = inventionList;
});
}
async function viewPlayer(accountId, me) {
try {
showLoading();
const bulkData = await fetchAsync(`/admin/api/account/bulk?id=${accountId}`);
if (!Array.isArray(bulkData) || bulkData.length === 0) {
return;
}
const player = bulkData[0];
const { username, profileImage, displayName, bio, mbd, PlatformIDs } = player;
let bioText = "This player has not written a bio yet!";
if (bio && typeof bio === "string" && bio.trim().length > 0) {
bioText = bio;
}
const popup = document.getElementById('player-popup');
document.getElementById('player-popup-title').textContent = "@" + username;
document.getElementById('player-popup-text').textContent = "Account Id: " + accountId;
document.getElementById('player-popup-bio').textContent = bioText;
const platformsDiv = document.getElementById("player-popup-platforms");
if (platformsDiv) {
platformsDiv.innerHTML = `
<h4 class="popup-section-title">Linked Accounts</h4>
${renderPlatforms(PlatformIDs)}
`;
}
try {
const banStatusDiv = document.getElementById("player-popup-banstatus");
if (mbd && mbd.IsBan === true) {
const friendlyDuration = formatDuration(mbd.Duration);
banStatusDiv.className = "ban-status bad";
banStatusDiv.innerHTML = `
<i class="fas fa-ban"></i>
<div>
<strong>@${username} is currently banned</strong><br>
${friendlyDuration}<br>
Reason: ${mbd.Message}
</div>
`;
} else {
banStatusDiv.className = "ban-status ok";
banStatusDiv.innerHTML = `
<i class="fas fa-check-circle"></i>
<strong>@${name} is not currently banned</strong>
`;
}
banStatusDiv.style.display = "flex";
}
catch (e) {
console.error("Failed to fetch ban status:", e);
}
const icon = document.getElementById('player-popup-icon');
if (profileImage) {
icon.src = `/img/${profileImage}?width=256&cropSquare=1`;
icon.style.display = 'block';
} else {
icon.style.display = 'none';
}
const buttonContainer = document.getElementById('popup-buttons');
if (me === true) {
document.getElementById('player-popup-text').textContent =
"This is you!\nAccount Id: " + accountId;
buttonContainer.innerHTML = `
<button class="btn btn-danger" onclick="closePopup('player-popup')">Close</button>
<button class="btn btn-danger" onclick="GoToRewildNet()">Edit Your Profile</button>
`;
} else {
// IMPORTANT FIX:
// JSON.stringify + escaping quotes so HTML doesn't break
const mbdJson = JSON.stringify(mbd).replace(/"/g, '&quot;');
buttonContainer.innerHTML = `
<button class="btn btn-primary" onclick="sendMessage('${accountId}')">Send Message</button>
<button class="btn btn-danger" onclick="kick_player('${accountId}')">Kick @${username} from their current room</button>
<button class="btn btn-danger btn-ban" onclick="goto_ban('${username}', '${accountId}', '${profileImage}', ${mbdJson});">
Ban @${username}
</button>
<button class="btn btn-secondary" onclick="closePopup('player-popup')">Close</button>
`;
}
closePopup("alert-popup");
popup.classList.add('active');
} catch (error) {
console.error("Error loading player data:", error);
showPopup("Error loading player info.");
}
}
function renderPlatforms(platforms) {
if (!Array.isArray(platforms)) {
return `<span class="platform-badge muted">No linked platforms</span>`;
}
const valid = platforms.filter(p =>
p &&
p.Platform === 0 && // Steam only
typeof p.PlatformId === "string" &&
p.PlatformId !== "0"
);
if (valid.length === 0) {
return `<span class="platform-badge muted">No linked platforms</span>`;
}
return valid.map(p => `
<a class="platform-badge steam"
href="https://steamcommunity.com/profiles/${p.PlatformId}"
target="_blank">
<i class="fab fa-steam"></i>
${p.PlatformId}
</a>
`).join("");
}
function GoToRewildNet() {
closePopup('player-popup')
GoToPage('/rewild_net/account/me')
}
function sendMessage(accountId) {
closePopup('player-popup')
showPopup('Warning.', 'This is not implemented yet!')
}
// <button class="btn btn-danger" onclick="gotohiddenpageEditPlayer()">Edit Player</button>
// <button class="btn btn-primary" onclick="sendMessage('${accountId}')">Send Message</button>
async function viewInvention(inventionId) {
try {
const invention = await fetchAsync(`/admin/api/inventions_bulk/${inventionId}`);
if (!invention || !invention.CreatorPlayerId) {
alert("Invalid invention data.");
return;
}
const {
Name, Description, ImageName,
CreatorPlayerId, CreatedAt,
NumDownloads, CheerCount
} = invention;
const playerArray = await fetchAsync(`/admin/api/account/bulk?id=${CreatorPlayerId}`);
const playerData = Array.isArray(playerArray) && playerArray.length > 0 ? playerArray[0] : null;
const { username, profileImage, displayName } = playerData || {};
let bioText = "This player has not written a bio yet!";
try {
const bioData = await fetchAsync(`/Accounts/account/${CreatorPlayerId}/bio`);
if (bioData && typeof bioData.Bio === "string") {
bioText = bioData.Bio;
}
} catch (bioError) {
}
const popup = document.getElementById('player-popup');
document.getElementById('player-popup-title').textContent = Name || "Untitled Invention";
document.getElementById('player-popup-text').textContent =
`By: ${displayName || username || "Unknown"}<br>` +
`Account ID: ${CreatorPlayerId}<br>` +
`Created: ${new Date(CreatedAt).toLocaleString()}<br>` +
`Downloads: ${NumDownloads} | Cheers: ${CheerCount}`;
document.getElementById('player-popup-bio').textContent = Description || bioText;
const icon = document.getElementById('player-popup-icon');
if (ImageName) {
icon.src = `/img/${ImageName}?cropSquare=1`;
icon.style.display = 'block';
} else {
icon.style.display = 'none';
}
const buttonContainer = document.getElementById('popup-buttons');
buttonContainer.innerHTML = `
<button class="btn btn-secondary" onclick="closePopup('player-popup')">Close</button>
`;
popup.classList.add('active');
} catch (error) {
console.error(error);
}
}
function gotohiddenpageEditPlayer() {
closePopup("player-popup");
setup_html_show("EditPlayer");
}
document.getElementById('theme-selector').addEventListener('change', function () {
const selectedTheme = this.value;
document.body.classList.remove('green', 'purple', 'dark', 'red', 'blue', 'pink', 'orange', 'yellow');
if (selectedTheme === 'green_theme') {
document.body.classList.add('green');
const homeImage = document.getElementById('home-image');
homeImage.src = `/img/DefaultImgGreen.png`;
} else if (selectedTheme === 'purple_theme') {
document.body.classList.add('purple');
const homeImage = document.getElementById('home-image');
homeImage.src = `/img/DefaultImgPurple.png`;
}
else if (selectedTheme === 'pink_theme') {
document.body.classList.add('pink');
const homeImage = document.getElementById('home-image');
homeImage.src = `/img/DefaultImgPink.png`;
}
else if (selectedTheme === 'blue_theme') {
document.body.classList.add('blue');
const homeImage = document.getElementById('home-image');
homeImage.src = `/img/DefaultImg.png`;
}
else if (selectedTheme === 'orange_theme') {
document.body.classList.add('orange');
const homeImage = document.getElementById('home-image');
homeImage.src = `/img/DefaultImgOrange.png`;
}
else if (selectedTheme === 'yellow_theme') {
document.body.classList.add('yellow');
const homeImage = document.getElementById('home-image');
homeImage.src = `/img/DefaultImgYellow.png`;
} else if (selectedTheme === 'dark_theme') {
document.body.classList.add('dark');
const homeImage = document.getElementById('home-image');
homeImage.src = `/img/DefaultImgDark.png`;
} else {
document.body.classList.add('red'); // default
const homeImage = document.getElementById('home-image');
homeImage.src = `/img/DefaultImgRed.png`;
}
localStorage.setItem('selectedTheme', selectedTheme);
});
document.addEventListener('DOMContentLoaded', () => {
const savedTheme = localStorage.getItem('selectedTheme');
if (savedTheme) {
document.getElementById('theme-selector').value = savedTheme;
document.getElementById('theme-selector').dispatchEvent(new Event('change'));
}
});
async function initDashboard() {
setup_html();
Promise.allSettled([
AccountMe(),
updateStats(),
loadPlayers(),
loadRooms(),
communityboardMsg()
]);
}
initDashboard();
</script>
</body>
</html>