lct-components
Version:
LCT basic components
105 lines • 39.7 kB
JavaScript
import { Component } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class CheckConnectionComponent {
constructor() {
this.connectionType = '';
this.showWarning = false;
this.connectionLost = false;
this.showGoodConnection = false;
this.isLocalhost = false;
}
ngOnInit() {
this.checkIfLocalhost();
this.checkConnection();
this.setupConnectionListeners();
}
checkConnection() {
// Verificar si hay conexión a internet
if (!navigator.onLine) {
this.connectionLost = true;
this.showWarning = false;
this.connectionType = 'offline';
return;
}
// Verificar si el navegador soporta la API de Network Information
if ('connection' in navigator) {
const connection = navigator.connection;
this.connectionType = connection.effectiveType || connection.type || 'unknown';
// Mostrar advertencia si la conexión es 3g o peor
if (this.connectionType === '3g' || this.connectionType === 'slow-2g' || this.connectionType === '2g') {
this.showWarning = true;
this.connectionLost = false;
this.showGoodConnection = false;
}
else {
this.showWarning = false;
this.connectionLost = false;
// Mostrar banner de conexión buena solo en localhost
this.showGoodConnection = this.isLocalhost;
}
}
else {
// Fallback: simular detección básica
this.connectionType = 'unknown';
this.showWarning = false;
this.connectionLost = false;
// Mostrar banner de conexión buena solo en localhost
this.showGoodConnection = this.isLocalhost;
}
}
testConnection() {
this.checkConnection();
}
checkIfLocalhost() {
const hostname = window.location.hostname;
this.isLocalhost = hostname.startsWith('192.168.') ||
hostname.startsWith('10.') ||
hostname.endsWith('.local');
}
setupConnectionListeners() {
// Listener para cuando se recupera la conexión
this.onlineListener = () => {
this.checkConnection();
};
// Listener para cuando se pierde la conexión
this.offlineListener = () => {
this.checkConnection();
};
// Agregar listeners a los eventos del navegador
window.addEventListener('online', this.onlineListener);
window.addEventListener('offline', this.offlineListener);
// Listener para cambios en la calidad de la conexión (si está disponible)
if ('connection' in navigator) {
const connection = navigator.connection;
this.connectionChangeListener = () => {
this.checkConnection();
};
connection.addEventListener('change', this.connectionChangeListener);
}
}
ngOnDestroy() {
// Limpiar listeners para evitar memory leaks
if (this.onlineListener) {
window.removeEventListener('online', this.onlineListener);
}
if (this.offlineListener) {
window.removeEventListener('offline', this.offlineListener);
}
if (this.connectionChangeListener && 'connection' in navigator) {
const connection = navigator.connection;
connection.removeEventListener('change', this.connectionChangeListener);
}
}
}
CheckConnectionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CheckConnectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
CheckConnectionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: CheckConnectionComponent, selector: "lct-check-connection", ngImport: i0, template: "<div class=\"test-connection-container\">\n <!-- Banner de advertencia para conexi\u00F3n deficiente -->\n <div class=\"connection-warning\" *ngIf=\"showWarning\">\n <div class=\"warning-banner\">\n <div class=\"warning-icon\">\n <svg width=\"24\" height=\"18\" viewBox=\"0 0 24 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M16.6536 11.3541C15.2874 10.1396 13.5229 9.46875 11.6949 9.46875C9.86694 9.46875 8.1025 10.1396 6.73625 11.3541C6.62081 11.454 6.52636 11.5758 6.45839 11.7125C6.39043 11.8492 6.3503 11.9981 6.34034 12.1504C6.33039 12.3028 6.3508 12.4556 6.40039 12.5999C6.44998 12.7443 6.52776 12.8774 6.62922 12.9915C6.73068 13.1056 6.8538 13.1984 6.99142 13.2645C7.12903 13.3306 7.27841 13.3686 7.43088 13.3765C7.58334 13.3844 7.73585 13.3619 7.87955 13.3104C8.02325 13.2588 8.15527 13.1792 8.26796 13.0762C9.21223 12.237 10.4316 11.7734 11.6949 11.7734C12.9583 11.7734 14.1776 12.237 15.1219 13.0762C15.3504 13.2793 15.6503 13.3834 15.9555 13.3654C16.2607 13.3474 16.5463 13.209 16.7494 12.9804C16.9525 12.7519 17.0565 12.4521 17.0386 12.1469C17.0206 11.8417 16.8821 11.5561 16.6536 11.353V11.3541Z\" fill=\"#B19300\"/>\n <path d=\"M11.6948 4.73439C8.6005 4.73012 5.6211 5.90618 3.36399 8.0228C3.24971 8.12516 3.15703 8.24932 3.09136 8.38798C3.0257 8.52664 2.98838 8.67701 2.9816 8.83029C2.97481 8.98356 2.9987 9.13664 3.05186 9.28056C3.10502 9.42448 3.18638 9.55634 3.29117 9.6684C3.39596 9.78046 3.52207 9.87047 3.66211 9.93315C3.80214 9.99583 3.95328 10.0299 4.10666 10.0334C4.26005 10.0369 4.41258 10.0098 4.55533 9.95353C4.69808 9.8973 4.82816 9.81313 4.93795 9.70597C6.77065 7.99254 9.18587 7.03937 11.6948 7.03937C14.2037 7.03937 16.6189 7.99254 18.4516 9.70597C18.5614 9.81313 18.6915 9.8973 18.8342 9.95353C18.977 10.0098 19.1295 10.0369 19.2829 10.0334C19.4363 10.0299 19.5874 9.99583 19.7275 9.93315C19.8675 9.87047 19.9936 9.78046 20.0984 9.6684C20.2032 9.55634 20.2845 9.42448 20.3377 9.28056C20.3909 9.13664 20.4147 8.98356 20.408 8.83029C20.4012 8.67701 20.3639 8.52664 20.2982 8.38798C20.2325 8.24932 20.1398 8.12516 20.0256 8.0228C17.7685 5.90618 14.7891 4.73012 11.6948 4.73439Z\" fill=\"#B19300\"/>\n <path d=\"M22.9838 4.30451C19.8766 1.53217 15.858 0 11.6939 0C7.52969 0 3.5111 1.53217 0.403942 4.30451C0.287166 4.40426 0.191505 4.52634 0.12258 4.66359C0.0536551 4.80083 0.0128567 4.95047 0.00258208 5.1037C-0.00769259 5.25694 0.0127638 5.41068 0.0627493 5.5559C0.112735 5.70112 0.191241 5.83488 0.293655 5.94933C0.396069 6.06378 0.520324 6.1566 0.65912 6.22235C0.797917 6.28809 0.948453 6.32543 1.10189 6.33218C1.25532 6.33892 1.40855 6.31493 1.55258 6.26161C1.69661 6.20829 1.82852 6.12672 1.94058 6.0217C4.62511 3.62749 8.09651 2.30438 11.6936 2.30438C15.2907 2.30438 18.7621 3.62749 21.4466 6.0217C21.6744 6.22547 21.9739 6.33038 22.2791 6.31335C22.5843 6.29632 22.8703 6.15874 23.0741 5.93088C23.2778 5.70302 23.3827 5.40354 23.3657 5.09833C23.3487 4.79312 23.2111 4.50718 22.9832 4.30341L22.9838 4.30451Z\" fill=\"#B19300\"/>\n <path d=\"M11.6937 18.0006C12.6636 18.0006 13.4498 17.2143 13.4498 16.2444C13.4498 15.2745 12.6636 14.4883 11.6937 14.4883C10.7238 14.4883 9.9375 15.2745 9.9375 16.2444C9.9375 17.2143 10.7238 18.0006 11.6937 18.0006Z\" fill=\"#B19300\"/>\n </svg>\n </div>\n <div class=\"warning-text\">\n La conexi\u00F3n es <strong>deficiente.</strong> Revisa el estado de tu red.\n </div>\n </div>\n </div>\n\n <!-- Banner de conexi\u00F3n perdida -->\n <div class=\"connection-lost\" *ngIf=\"connectionLost\">\n <div class=\"lost-banner\">\n <div class=\"lost-icon\">\n <svg width=\"24\" height=\"18\" viewBox=\"0 0 24 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M16.6536 11.3541C15.2874 10.1396 13.5229 9.46875 11.6949 9.46875C9.86694 9.46875 8.1025 10.1396 6.73625 11.3541C6.62081 11.454 6.52636 11.5758 6.45839 11.7125C6.39043 11.8492 6.3503 11.9981 6.34034 12.1504C6.33039 12.3028 6.3508 12.4556 6.40039 12.5999C6.44998 12.7443 6.52776 12.8774 6.62922 12.9915C6.73068 13.1056 6.8538 13.1984 6.99142 13.2645C7.12903 13.3306 7.27841 13.3686 7.43088 13.3765C7.58334 13.3844 7.73585 13.3619 7.87955 13.3104C8.02325 13.2588 8.15527 13.1792 8.26796 13.0762C9.21223 12.237 10.4316 11.7734 11.6949 11.7734C12.9583 11.7734 14.1776 12.237 15.1219 13.0762C15.3504 13.2793 15.6503 13.3834 15.9555 13.3654C16.2607 13.3474 16.5463 13.209 16.7494 12.9804C16.9525 12.7519 17.0565 12.4521 17.0386 12.1469C17.0206 11.8417 16.8821 11.5561 16.6536 11.353V11.3541Z\" fill=\"#C60E4C\"/>\n <path d=\"M11.6948 4.73439C8.6005 4.73012 5.6211 5.90618 3.36399 8.0228C3.24971 8.12516 3.15703 8.24932 3.09136 8.38798C3.0257 8.52664 2.98838 8.67701 2.9816 8.83029C2.97481 8.98356 2.9987 9.13664 3.05186 9.28056C3.10502 9.42448 3.18638 9.55634 3.29117 9.6684C3.39596 9.78046 3.52207 9.87047 3.66211 9.93315C3.80214 9.99583 3.95328 10.0299 4.10666 10.0334C4.26005 10.0369 4.41258 10.0098 4.55533 9.95353C4.69808 9.8973 4.82816 9.81313 4.93795 9.70597C6.77065 7.99254 9.18587 7.03937 11.6948 7.03937C14.2037 7.03937 16.6189 7.99254 18.4516 9.70597C18.5614 9.81313 18.6915 9.8973 18.8342 9.95353C18.977 10.0098 19.1295 10.0369 19.2829 10.0334C19.4363 10.0299 19.5874 9.99583 19.7275 9.93315C19.8675 9.87047 19.9936 9.78046 20.0984 9.6684C20.2032 9.55634 20.2845 9.42448 20.3377 9.28056C20.3909 9.13664 20.4147 8.98356 20.408 8.83029C20.4012 8.67701 20.3639 8.52664 20.2982 8.38798C20.2325 8.24932 20.1398 8.12516 20.0256 8.0228C17.7685 5.90618 14.7891 4.73012 11.6948 4.73439Z\" fill=\"#C60E4C\"/>\n <path d=\"M22.9838 4.30451C19.8766 1.53217 15.858 0 11.6939 0C7.52969 0 3.5111 1.53217 0.403942 4.30451C0.287166 4.40426 0.191505 4.52634 0.12258 4.66359C0.0536551 4.80083 0.0128567 4.95047 0.00258208 5.1037C-0.00769259 5.25694 0.0127638 5.41068 0.0627493 5.5559C0.112735 5.70112 0.191241 5.83488 0.293655 5.94933C0.396069 6.06378 0.520324 6.1566 0.65912 6.22235C0.797917 6.28809 0.948453 6.32543 1.10189 6.33218C1.25532 6.33892 1.40855 6.31493 1.55258 6.26161C1.69661 6.20829 1.82852 6.12672 1.94058 6.0217C4.62511 3.62749 8.09651 2.30438 11.6936 2.30438C15.2907 2.30438 18.7621 3.62749 21.4466 6.0217C21.6744 6.22547 21.9739 6.33038 22.2791 6.31335C22.5843 6.29632 22.8703 6.15874 23.0741 5.93088C23.2778 5.70302 23.3827 5.40354 23.3657 5.09833C23.3487 4.79312 23.2111 4.50718 22.9832 4.30341L22.9838 4.30451Z\" fill=\"#C60E4C\"/>\n <path d=\"M11.6937 18.0006C12.6636 18.0006 13.4498 17.2143 13.4498 16.2444C13.4498 15.2745 12.6636 14.4883 11.6937 14.4883C10.7238 14.4883 9.9375 15.2745 9.9375 16.2444C9.9375 17.2143 10.7238 18.0006 11.6937 18.0006Z\" fill=\"#C60E4C\"/>\n </svg>\n </div>\n <div class=\"lost-text\">\n La conexi\u00F3n se ha <strong>perdido.</strong> Revisa el estado de tu red.\n </div>\n </div>\n </div>\n\n <!-- Banner de conexi\u00F3n buena (solo visible en localhost) -->\n <div class=\"connection-good\" *ngIf=\"showGoodConnection && !showWarning && !connectionLost\">\n <div class=\"good-banner\">\n <div class=\"good-icon\">\n <svg width=\"24\" height=\"18\" viewBox=\"0 0 24 18\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M16.6536 11.3541C15.2874 10.1396 13.5229 9.46875 11.6949 9.46875C9.86694 9.46875 8.1025 10.1396 6.73625 11.3541C6.62081 11.454 6.52636 11.5758 6.45839 11.7125C6.39043 11.8492 6.3503 11.9981 6.34034 12.1504C6.33039 12.3028 6.3508 12.4556 6.40039 12.5999C6.44998 12.7443 6.52776 12.8774 6.62922 12.9915C6.73068 13.1056 6.8538 13.1984 6.99142 13.2645C7.12903 13.3306 7.27841 13.3686 7.43088 13.3765C7.58334 13.3844 7.73585 13.3619 7.87955 13.3104C8.02325 13.2588 8.15527 13.1792 8.26796 13.0762C9.21223 12.237 10.4316 11.7734 11.6949 11.7734C12.9583 11.7734 14.1776 12.237 15.1219 13.0762C15.3504 13.2793 15.6503 13.3834 15.9555 13.3654C16.2607 13.3474 16.5463 13.209 16.7494 12.9804C16.9525 12.7519 17.0565 12.4521 17.0386 12.1469C17.0206 11.8417 16.8821 11.5561 16.6536 11.353V11.3541Z\" fill=\"#00A651\"/>\n <path d=\"M11.6948 4.73439C8.6005 4.73012 5.6211 5.90618 3.36399 8.0228C3.24971 8.12516 3.15703 8.24932 3.09136 8.38798C3.0257 8.52664 2.98838 8.67701 2.9816 8.83029C2.97481 8.98356 2.9987 9.13664 3.05186 9.28056C3.10502 9.42448 3.18638 9.55634 3.29117 9.6684C3.39596 9.78046 3.52207 9.87047 3.66211 9.93315C3.80214 9.99583 3.95328 10.0299 4.10666 10.0334C4.26005 10.0369 4.41258 10.0098 4.55533 9.95353C4.69808 9.8973 4.82816 9.81313 4.93795 9.70597C6.77065 7.99254 9.18587 7.03937 11.6948 7.03937C14.2037 7.03937 16.6189 7.99254 18.4516 9.70597C18.5614 9.81313 18.6915 9.8973 18.8342 9.95353C18.977 10.0098 19.1295 10.0369 19.2829 10.0334C19.4363 10.0299 19.5874 9.99583 19.7275 9.93315C19.8675 9.87047 19.9936 9.78046 20.0984 9.6684C20.2032 9.55634 20.2845 9.42448 20.3377 9.28056C20.3909 9.13664 20.4147 8.98356 20.408 8.83029C20.4012 8.67701 20.3639 8.52664 20.2982 8.38798C20.2325 8.24932 20.1398 8.12516 20.0256 8.0228C17.7685 5.90618 14.7891 4.73012 11.6948 4.73439Z\" fill=\"#00A651\"/>\n <path d=\"M22.9838 4.30451C19.8766 1.53217 15.858 0 11.6939 0C7.52969 0 3.5111 1.53217 0.403942 4.30451C0.287166 4.40426 0.191505 4.52634 0.12258 4.66359C0.0536551 4.80083 0.0128567 4.95047 0.00258208 5.1037C-0.00769259 5.25694 0.0127638 5.41068 0.0627493 5.5559C0.112735 5.70112 0.191241 5.83488 0.293655 5.94933C0.396069 6.06378 0.520324 6.1566 0.65912 6.22235C0.797917 6.28809 0.948453 6.32543 1.10189 6.33218C1.25532 6.33892 1.40855 6.31493 1.55258 6.26161C1.69661 6.20829 1.82852 6.12672 1.94058 6.0217C4.62511 3.62749 8.09651 2.30438 11.6936 2.30438C15.2907 2.30438 18.7621 3.62749 21.4466 6.0217C21.6744 6.22547 21.9739 6.33038 22.2791 6.31335C22.5843 6.29632 22.8703 6.15874 23.0741 5.93088C23.2778 5.70302 23.3827 5.40354 23.3657 5.09833C23.3487 4.79312 23.2111 4.50718 22.9832 4.30341L22.9838 4.30451Z\" fill=\"#00A651\"/>\n <path d=\"M11.6937 18.0006C12.6636 18.0006 13.4498 17.2143 13.4498 16.2444C13.4498 15.2745 12.6636 14.4883 11.6937 14.4883C10.7238 14.4883 9.9375 15.2745 9.9375 16.2444C9.9375 17.2143 10.7238 18.0006 11.6937 18.0006Z\" fill=\"#00A651\"/>\n </svg>\n </div>\n <div class=\"good-text\">\n La conexi\u00F3n est\u00E1 <strong>estable.</strong>\n </div>\n </div>\n </div>\n\n \n</div>\n", styles: [".test-connection-container{margin:0 auto}.connection-info{margin-bottom:30px;padding:20px;background-color:#f8f9fa;border-radius:8px;border:1px solid #dee2e6}.connection-info p{margin-bottom:15px;font-size:16px;color:#495057}.btn{padding:10px 20px;border:none;border-radius:4px;cursor:pointer;font-size:14px;font-weight:500;transition:all .3s ease}.btn-primary{background-color:#007bff;color:#fff}.btn-primary:hover{background-color:#0056b3}.connection-lost{margin-bottom:20px}.lost-banner{display:flex;align-items:center;padding:4px 20px;background-color:#fbe8e8;border:1px solid #ffe2e5;border-radius:4px}.lost-icon{margin-right:15px;display:flex;align-items:center}.lost-text{font-family:Barlow;font-weight:400;font-size:16px;line-height:20px;letter-spacing:0%;color:#3c4149}.lost-text strong{font-weight:600}.connection-warning{margin-bottom:20px}.warning-banner{display:flex;align-items:center;padding:4px 20px;background-color:#fff3cd;border:1px solid #ffeaa7;border-radius:2px}.warning-icon{margin-right:15px;display:flex;align-items:center}.warning-text{font-family:Barlow;font-weight:400;font-size:16px;line-height:20px;letter-spacing:0%;color:#3c4149}.warning-text strong{font-weight:600}.connection-good{margin-bottom:20px}.good-banner{display:flex;align-items:center;padding:4px 20px;background-color:#e8f5e8;border:1px solid #C3E6CB;border-radius:4px}.good-icon{margin-right:15px;display:flex;align-items:center}.good-text{font-family:Barlow;font-weight:400;font-size:16px;line-height:20px;letter-spacing:0%;color:#3c4149}.good-text strong{font-weight:600}.connection-status{margin-bottom:20px}.status-good{display:flex;align-items:center;padding:15px 20px;background-color:#d4edda;border:1px solid #c3e6cb;border-radius:8px;box-shadow:0 2px 4px #0000001a}.status-icon{margin-right:15px;display:flex;align-items:center}.status-text{color:#155724;font-size:14px;line-height:1.4;font-weight:500}h2{color:#333;margin-bottom:20px;font-size:24px;font-weight:600}\n"], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: CheckConnectionComponent, decorators: [{
type: Component,
args: [{
selector: 'lct-check-connection',
templateUrl: './check-connection.component.html',
styleUrls: ['./check-connection.component.scss']
}]
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2stY29ubmVjdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9sY3QtY29tcG9uZW50cy9zcmMvbGliL2NoZWNrLWNvbm5lY3Rpb24vY2hlY2stY29ubmVjdGlvbi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9sY3QtY29tcG9uZW50cy9zcmMvbGliL2NoZWNrLWNvbm5lY3Rpb24vY2hlY2stY29ubmVjdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQzs7O0FBUTdELE1BQU0sT0FBTyx3QkFBd0I7SUFVbkM7UUFUQSxtQkFBYyxHQUFXLEVBQUUsQ0FBQztRQUM1QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUM3QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyx1QkFBa0IsR0FBWSxLQUFLLENBQUM7UUFDcEMsZ0JBQVcsR0FBWSxLQUFLLENBQUM7SUFLYixDQUFDO0lBRWpCLFFBQVE7UUFDTixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELGVBQWU7UUFDYix1Q0FBdUM7UUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7WUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7WUFDaEMsT0FBTztTQUNSO1FBRUQsa0VBQWtFO1FBQ2xFLElBQUksWUFBWSxJQUFJLFNBQVMsRUFBRTtZQUM3QixNQUFNLFVBQVUsR0FBSSxTQUFpQixDQUFDLFVBQVUsQ0FBQztZQUNqRCxJQUFJLENBQUMsY0FBYyxHQUFHLFVBQVUsQ0FBQyxhQUFhLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxTQUFTLENBQUM7WUFFL0Usa0RBQWtEO1lBQ2xELElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLEVBQUU7Z0JBQ3JHLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztnQkFDNUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQzthQUNqQztpQkFBTTtnQkFDTCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztnQkFDekIsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7Z0JBQzVCLHFEQUFxRDtnQkFDckQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7YUFDNUM7U0FDRjthQUFNO1lBQ0wscUNBQXFDO1lBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzVCLHFEQUFxRDtZQUNyRCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUM1QztJQUNILENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztZQUNoQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztZQUMxQixRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxFQUFFO1lBQ3pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUM7UUFFRiw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxHQUFHLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FBQztRQUVGLGdEQUFnRDtRQUNoRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN2RCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV6RCwwRUFBMEU7UUFDMUUsSUFBSSxZQUFZLElBQUksU0FBUyxFQUFFO1lBQzdCLE1BQU0sVUFBVSxHQUFJLFNBQWlCLENBQUMsVUFBVSxDQUFDO1lBQ2pELElBQUksQ0FBQyx3QkFBd0IsR0FBRyxHQUFHLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixDQUFDLENBQUM7WUFDRixVQUFVLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1NBQ3RFO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCw2Q0FBNkM7UUFDN0MsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQzNEO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQzdEO1FBQ0QsSUFBSSxJQUFJLENBQUMsd0JBQXdCLElBQUksWUFBWSxJQUFJLFNBQVMsRUFBRTtZQUM5RCxNQUFNLFVBQVUsR0FBSSxTQUFpQixDQUFDLFVBQVUsQ0FBQztZQUNqRCxVQUFVLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1NBQ3pFO0lBQ0gsQ0FBQzs7cUhBckdVLHdCQUF3Qjt5R0FBeEIsd0JBQXdCLDREQ1JyQyx3bFVBc0RBOzJGRDlDYSx3QkFBd0I7a0JBTHBDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjtvQkFDaEMsV0FBVyxFQUFFLG1DQUFtQztvQkFDaEQsU0FBUyxFQUFFLENBQUMsbUNBQW1DLENBQUM7aUJBQ2pEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGN0LWNoZWNrLWNvbm5lY3Rpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vY2hlY2stY29ubmVjdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2NoZWNrLWNvbm5lY3Rpb24uY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBDaGVja0Nvbm5lY3Rpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGNvbm5lY3Rpb25UeXBlOiBzdHJpbmcgPSAnJztcbiAgc2hvd1dhcm5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29ubmVjdGlvbkxvc3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd0dvb2RDb25uZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIGlzTG9jYWxob3N0OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgb25saW5lTGlzdGVuZXI/OiAoKSA9PiB2b2lkO1xuICBwcml2YXRlIG9mZmxpbmVMaXN0ZW5lcj86ICgpID0+IHZvaWQ7XG4gIHByaXZhdGUgY29ubmVjdGlvbkNoYW5nZUxpc3RlbmVyPzogKCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcigpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tJZkxvY2FsaG9zdCgpO1xuICAgIHRoaXMuY2hlY2tDb25uZWN0aW9uKCk7XG4gICAgdGhpcy5zZXR1cENvbm5lY3Rpb25MaXN0ZW5lcnMoKTtcbiAgfVxuXG4gIGNoZWNrQ29ubmVjdGlvbigpOiB2b2lkIHtcbiAgICAvLyBWZXJpZmljYXIgc2kgaGF5IGNvbmV4acOzbiBhIGludGVybmV0XG4gICAgaWYgKCFuYXZpZ2F0b3Iub25MaW5lKSB7XG4gICAgICB0aGlzLmNvbm5lY3Rpb25Mb3N0ID0gdHJ1ZTtcbiAgICAgIHRoaXMuc2hvd1dhcm5pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuY29ubmVjdGlvblR5cGUgPSAnb2ZmbGluZSc7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVmVyaWZpY2FyIHNpIGVsIG5hdmVnYWRvciBzb3BvcnRhIGxhIEFQSSBkZSBOZXR3b3JrIEluZm9ybWF0aW9uXG4gICAgaWYgKCdjb25uZWN0aW9uJyBpbiBuYXZpZ2F0b3IpIHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSAobmF2aWdhdG9yIGFzIGFueSkuY29ubmVjdGlvbjtcbiAgICAgIHRoaXMuY29ubmVjdGlvblR5cGUgPSBjb25uZWN0aW9uLmVmZmVjdGl2ZVR5cGUgfHwgY29ubmVjdGlvbi50eXBlIHx8ICd1bmtub3duJztcbiAgICAgIFxuICAgICAgLy8gTW9zdHJhciBhZHZlcnRlbmNpYSBzaSBsYSBjb25leGnDs24gZXMgM2cgbyBwZW9yXG4gICAgICBpZiAodGhpcy5jb25uZWN0aW9uVHlwZSA9PT0gJzNnJyB8fCB0aGlzLmNvbm5lY3Rpb25UeXBlID09PSAnc2xvdy0yZycgfHwgdGhpcy5jb25uZWN0aW9uVHlwZSA9PT0gJzJnJykge1xuICAgICAgICB0aGlzLnNob3dXYXJuaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb25uZWN0aW9uTG9zdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNob3dHb29kQ29ubmVjdGlvbiA9IGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93V2FybmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbm5lY3Rpb25Mb3N0ID0gZmFsc2U7XG4gICAgICAgIC8vIE1vc3RyYXIgYmFubmVyIGRlIGNvbmV4acOzbiBidWVuYSBzb2xvIGVuIGxvY2FsaG9zdFxuICAgICAgICB0aGlzLnNob3dHb29kQ29ubmVjdGlvbiA9IHRoaXMuaXNMb2NhbGhvc3Q7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGxiYWNrOiBzaW11bGFyIGRldGVjY2nDs24gYsOhc2ljYVxuICAgICAgdGhpcy5jb25uZWN0aW9uVHlwZSA9ICd1bmtub3duJztcbiAgICAgIHRoaXMuc2hvd1dhcm5pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkxvc3QgPSBmYWxzZTtcbiAgICAgIC8vIE1vc3RyYXIgYmFubmVyIGRlIGNvbmV4acOzbiBidWVuYSBzb2xvIGVuIGxvY2FsaG9zdFxuICAgICAgdGhpcy5zaG93R29vZENvbm5lY3Rpb24gPSB0aGlzLmlzTG9jYWxob3N0O1xuICAgIH1cbiAgfVxuXG4gIHRlc3RDb25uZWN0aW9uKCk6IHZvaWQge1xuICAgIHRoaXMuY2hlY2tDb25uZWN0aW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSWZMb2NhbGhvc3QoKTogdm9pZCB7XG4gICAgY29uc3QgaG9zdG5hbWUgPSB3aW5kb3cubG9jYXRpb24uaG9zdG5hbWU7XG4gICAgdGhpcy5pc0xvY2FsaG9zdCA9IGhvc3RuYW1lLnN0YXJ0c1dpdGgoJzE5Mi4xNjguJykgfHxcbiAgICAgICAgICAgICAgICAgICAgICBob3N0bmFtZS5zdGFydHNXaXRoKCcxMC4nKSB8fFxuICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lLmVuZHNXaXRoKCcubG9jYWwnKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBDb25uZWN0aW9uTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgIC8vIExpc3RlbmVyIHBhcmEgY3VhbmRvIHNlIHJlY3VwZXJhIGxhIGNvbmV4acOzblxuICAgIHRoaXMub25saW5lTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrQ29ubmVjdGlvbigpO1xuICAgIH07XG5cbiAgICAvLyBMaXN0ZW5lciBwYXJhIGN1YW5kbyBzZSBwaWVyZGUgbGEgY29uZXhpw7NuXG4gICAgdGhpcy5vZmZsaW5lTGlzdGVuZXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLmNoZWNrQ29ubmVjdGlvbigpO1xuICAgIH07XG5cbiAgICAvLyBBZ3JlZ2FyIGxpc3RlbmVycyBhIGxvcyBldmVudG9zIGRlbCBuYXZlZ2Fkb3JcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignb25saW5lJywgdGhpcy5vbmxpbmVMaXN0ZW5lcik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCB0aGlzLm9mZmxpbmVMaXN0ZW5lcik7XG5cbiAgICAvLyBMaXN0ZW5lciBwYXJhIGNhbWJpb3MgZW4gbGEgY2FsaWRhZCBkZSBsYSBjb25leGnDs24gKHNpIGVzdMOhIGRpc3BvbmlibGUpXG4gICAgaWYgKCdjb25uZWN0aW9uJyBpbiBuYXZpZ2F0b3IpIHtcbiAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSAobmF2aWdhdG9yIGFzIGFueSkuY29ubmVjdGlvbjtcbiAgICAgIHRoaXMuY29ubmVjdGlvbkNoYW5nZUxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICB0aGlzLmNoZWNrQ29ubmVjdGlvbigpO1xuICAgICAgfTtcbiAgICAgIGNvbm5lY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgdGhpcy5jb25uZWN0aW9uQ2hhbmdlTGlzdGVuZXIpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIExpbXBpYXIgbGlzdGVuZXJzIHBhcmEgZXZpdGFyIG1lbW9yeSBsZWFrc1xuICAgIGlmICh0aGlzLm9ubGluZUxpc3RlbmVyKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignb25saW5lJywgdGhpcy5vbmxpbmVMaXN0ZW5lcik7XG4gICAgfVxuICAgIGlmICh0aGlzLm9mZmxpbmVMaXN0ZW5lcikge1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ29mZmxpbmUnLCB0aGlzLm9mZmxpbmVMaXN0ZW5lcik7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbm5lY3Rpb25DaGFuZ2VMaXN0ZW5lciAmJiAnY29ubmVjdGlvbicgaW4gbmF2aWdhdG9yKSB7XG4gICAgICBjb25zdCBjb25uZWN0aW9uID0gKG5hdmlnYXRvciBhcyBhbnkpLmNvbm5lY3Rpb247XG4gICAgICBjb25uZWN0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuY29ubmVjdGlvbkNoYW5nZUxpc3RlbmVyKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0ZXN0LWNvbm5lY3Rpb24tY29udGFpbmVyXCI+XG4gIDwhLS0gQmFubmVyIGRlIGFkdmVydGVuY2lhIHBhcmEgY29uZXhpw7NuIGRlZmljaWVudGUgLS0+XG4gIDxkaXYgY2xhc3M9XCJjb25uZWN0aW9uLXdhcm5pbmdcIiAqbmdJZj1cInNob3dXYXJuaW5nXCI+XG4gICAgPGRpdiBjbGFzcz1cIndhcm5pbmctYmFubmVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwid2FybmluZy1pY29uXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAxOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTYuNjUzNiAxMS4zNTQxQzE1LjI4NzQgMTAuMTM5NiAxMy41MjI5IDkuNDY4NzUgMTEuNjk0OSA5LjQ2ODc1QzkuODY2OTQgOS40Njg3NSA4LjEwMjUgMTAuMTM5NiA2LjczNjI1IDExLjM1NDFDNi42MjA4MSAxMS40NTQgNi41MjYzNiAxMS41NzU4IDYuNDU4MzkgMTEuNzEyNUM2LjM5MDQzIDExLjg0OTIgNi4zNTAzIDExLjk5ODEgNi4zNDAzNCAxMi4xNTA0QzYuMzMwMzkgMTIuMzAyOCA2LjM1MDggMTIuNDU1NiA2LjQwMDM5IDEyLjU5OTlDNi40NDk5OCAxMi43NDQzIDYuNTI3NzYgMTIuODc3NCA2LjYyOTIyIDEyLjk5MTVDNi43MzA2OCAxMy4xMDU2IDYuODUzOCAxMy4xOTg0IDYuOTkxNDIgMTMuMjY0NUM3LjEyOTAzIDEzLjMzMDYgNy4yNzg0MSAxMy4zNjg2IDcuNDMwODggMTMuMzc2NUM3LjU4MzM0IDEzLjM4NDQgNy43MzU4NSAxMy4zNjE5IDcuODc5NTUgMTMuMzEwNEM4LjAyMzI1IDEzLjI1ODggOC4xNTUyNyAxMy4xNzkyIDguMjY3OTYgMTMuMDc2MkM5LjIxMjIzIDEyLjIzNyAxMC40MzE2IDExLjc3MzQgMTEuNjk0OSAxMS43NzM0QzEyLjk1ODMgMTEuNzczNCAxNC4xNzc2IDEyLjIzNyAxNS4xMjE5IDEzLjA3NjJDMTUuMzUwNCAxMy4yNzkzIDE1LjY1MDMgMTMuMzgzNCAxNS45NTU1IDEzLjM2NTRDMTYuMjYwNyAxMy4zNDc0IDE2LjU0NjMgMTMuMjA5IDE2Ljc0OTQgMTIuOTgwNEMxNi45NTI1IDEyLjc1MTkgMTcuMDU2NSAxMi40NTIxIDE3LjAzODYgMTIuMTQ2OUMxNy4wMjA2IDExLjg0MTcgMTYuODgyMSAxMS41NTYxIDE2LjY1MzYgMTEuMzUzVjExLjM1NDFaXCIgZmlsbD1cIiNCMTkzMDBcIi8+XG4gICAgICAgICAgPHBhdGggZD1cIk0xMS42OTQ4IDQuNzM0MzlDOC42MDA1IDQuNzMwMTIgNS42MjExIDUuOTA2MTggMy4zNjM5OSA4LjAyMjhDMy4yNDk3MSA4LjEyNTE2IDMuMTU3MDMgOC4yNDkzMiAzLjA5MTM2IDguMzg3OThDMy4wMjU3IDguNTI2NjQgMi45ODgzOCA4LjY3NzAxIDIuOTgxNiA4LjgzMDI5QzIuOTc0ODEgOC45ODM1NiAyLjk5ODcgOS4xMzY2NCAzLjA1MTg2IDkuMjgwNTZDMy4xMDUwMiA5LjQyNDQ4IDMuMTg2MzggOS41NTYzNCAzLjI5MTE3IDkuNjY4NEMzLjM5NTk2IDkuNzgwNDYgMy41MjIwNyA5Ljg3MDQ3IDMuNjYyMTEgOS45MzMxNUMzLjgwMjE0IDkuOTk1ODMgMy45NTMyOCAxMC4wMjk5IDQuMTA2NjYgMTAuMDMzNEM0LjI2MDA1IDEwLjAzNjkgNC40MTI1OCAxMC4wMDk4IDQuNTU1MzMgOS45NTM1M0M0LjY5ODA4IDkuODk3MyA0LjgyODE2IDkuODEzMTMgNC45Mzc5NSA5LjcwNTk3QzYuNzcwNjUgNy45OTI1NCA5LjE4NTg3IDcuMDM5MzcgMTEuNjk0OCA3LjAzOTM3QzE0LjIwMzcgNy4wMzkzNyAxNi42MTg5IDcuOTkyNTQgMTguNDUxNiA5LjcwNTk3QzE4LjU2MTQgOS44MTMxMyAxOC42OTE1IDkuODk3MyAxOC44MzQyIDkuOTUzNTNDMTguOTc3IDEwLjAwOTggMTkuMTI5NSAxMC4wMzY5IDE5LjI4MjkgMTAuMDMzNEMxOS40MzYzIDEwLjAyOTkgMTkuNTg3NCA5Ljk5NTgzIDE5LjcyNzUgOS45MzMxNUMxOS44Njc1IDkuODcwNDcgMTkuOTkzNiA5Ljc4MDQ2IDIwLjA5ODQgOS42Njg0QzIwLjIwMzIgOS41NTYzNCAyMC4yODQ1IDkuNDI0NDggMjAuMzM3NyA5LjI4MDU2QzIwLjM5MDkgOS4xMzY2NCAyMC40MTQ3IDguOTgzNTYgMjAuNDA4IDguODMwMjlDMjAuNDAxMiA4LjY3NzAxIDIwLjM2MzkgOC41MjY2NCAyMC4yOTgyIDguMzg3OThDMjAuMjMyNSA4LjI0OTMyIDIwLjEzOTggOC4xMjUxNiAyMC4wMjU2IDguMDIyOEMxNy43Njg1IDUuOTA2MTggMTQuNzg5MSA0LjczMDEyIDExLjY5NDggNC43MzQzOVpcIiBmaWxsPVwiI0IxOTMwMFwiLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTIyLjk4MzggNC4zMDQ1MUMxOS44NzY2IDEuNTMyMTcgMTUuODU4IDAgMTEuNjkzOSAwQzcuNTI5NjkgMCAzLjUxMTEgMS41MzIxNyAwLjQwMzk0MiA0LjMwNDUxQzAuMjg3MTY2IDQuNDA0MjYgMC4xOTE1MDUgNC41MjYzNCAwLjEyMjU4IDQuNjYzNTlDMC4wNTM2NTUxIDQuODAwODMgMC4wMTI4NTY3IDQuOTUwNDcgMC4wMDI1ODIwOCA1LjEwMzdDLTAuMDA3NjkyNTkgNS4yNTY5NCAwLjAxMjc2MzggNS40MTA2OCAwLjA2Mjc0OTMgNS41NTU5QzAuMTEyNzM1IDUuNzAxMTIgMC4xOTEyNDEgNS44MzQ4OCAwLjI5MzY1NSA1Ljk0OTMzQzAuMzk2MDY5IDYuMDYzNzggMC41MjAzMjQgNi4xNTY2IDAuNjU5MTIgNi4yMjIzNUMwLjc5NzkxNyA2LjI4ODA5IDAuOTQ4NDUzIDYuMzI1NDMgMS4xMDE4OSA2LjMzMjE4QzEuMjU1MzIgNi4zMzg5MiAxLjQwODU1IDYuMzE0OTMgMS41NTI1OCA2LjI2MTYxQzEuNjk2NjEgNi4yMDgyOSAxLjgyODUyIDYuMTI2NzIgMS45NDA1OCA2LjAyMTdDNC42MjUxMSAzLjYyNzQ5IDguMDk2NTEgMi4zMDQzOCAxMS42OTM2IDIuMzA0MzhDMTUuMjkwNyAyLjMwNDM4IDE4Ljc2MjEgMy42Mjc0OSAyMS40NDY2IDYuMDIxN0MyMS42NzQ0IDYuMjI1NDcgMjEuOTczOSA2LjMzMDM4IDIyLjI3OTEgNi4zMTMzNUMyMi41ODQzIDYuMjk2MzIgMjIuODcwMyA2LjE1ODc0IDIzLjA3NDEgNS45MzA4OEMyMy4yNzc4IDUuNzAzMDIgMjMuMzgyNyA1LjQwMzU0IDIzLjM2NTcgNS4wOTgzM0MyMy4zNDg3IDQuNzkzMTIgMjMuMjExMSA0LjUwNzE4IDIyLjk4MzIgNC4zMDM0MUwyMi45ODM4IDQuMzA0NTFaXCIgZmlsbD1cIiNCMTkzMDBcIi8+XG4gICAgICAgICAgPHBhdGggZD1cIk0xMS42OTM3IDE4LjAwMDZDMTIuNjYzNiAxOC4wMDA2IDEzLjQ0OTggMTcuMjE0MyAxMy40NDk4IDE2LjI0NDRDMTMuNDQ5OCAxNS4yNzQ1IDEyLjY2MzYgMTQuNDg4MyAxMS42OTM3IDE0LjQ4ODNDMTAuNzIzOCAxNC40ODgzIDkuOTM3NSAxNS4yNzQ1IDkuOTM3NSAxNi4yNDQ0QzkuOTM3NSAxNy4yMTQzIDEwLjcyMzggMTguMDAwNiAxMS42OTM3IDE4LjAwMDZaXCIgZmlsbD1cIiNCMTkzMDBcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ3YXJuaW5nLXRleHRcIj5cbiAgICAgICAgTGEgY29uZXhpw7NuIGVzIDxzdHJvbmc+ZGVmaWNpZW50ZS48L3N0cm9uZz4gUmV2aXNhIGVsIGVzdGFkbyBkZSB0dSByZWQuXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBCYW5uZXIgZGUgY29uZXhpw7NuIHBlcmRpZGEgLS0+XG4gIDxkaXYgY2xhc3M9XCJjb25uZWN0aW9uLWxvc3RcIiAqbmdJZj1cImNvbm5lY3Rpb25Mb3N0XCI+XG4gICAgPGRpdiBjbGFzcz1cImxvc3QtYmFubmVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibG9zdC1pY29uXCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjE4XCIgdmlld0JveD1cIjAgMCAyNCAxOFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTYuNjUzNiAxMS4zNTQxQzE1LjI4NzQgMTAuMTM5NiAxMy41MjI5IDkuNDY4NzUgMTEuNjk0OSA5LjQ2ODc1QzkuODY2OTQgOS40Njg3NSA4LjEwMjUgMTAuMTM5NiA2LjczNjI1IDExLjM1NDFDNi42MjA4MSAxMS40NTQgNi41MjYzNiAxMS41NzU4IDYuNDU4MzkgMTEuNzEyNUM2LjM5MDQzIDExLjg0OTIgNi4zNTAzIDExLjk5ODEgNi4zNDAzNCAxMi4xNTA0QzYuMzMwMzkgMTIuMzAyOCA2LjM1MDggMTIuNDU1NiA2LjQwMDM5IDEyLjU5OTlDNi40NDk5OCAxMi43NDQzIDYuNTI3NzYgMTIuODc3NCA2LjYyOTIyIDEyLjk5MTVDNi43MzA2OCAxMy4xMDU2IDYuODUzOCAxMy4xOTg0IDYuOTkxNDIgMTMuMjY0NUM3LjEyOTAzIDEzLjMzMDYgNy4yNzg0MSAxMy4zNjg2IDcuNDMwODggMTMuMzc2NUM3LjU4MzM0IDEzLjM4NDQgNy43MzU4NSAxMy4zNjE5IDcuODc5NTUgMTMuMzEwNEM4LjAyMzI1IDEzLjI1ODggOC4xNTUyNyAxMy4xNzkyIDguMjY3OTYgMTMuMDc2MkM5LjIxMjIzIDEyLjIzNyAxMC40MzE2IDExLjc3MzQgMTEuNjk0OSAxMS43NzM0QzEyLjk1ODMgMTEuNzczNCAxNC4xNzc2IDEyLjIzNyAxNS4xMjE5IDEzLjA3NjJDMTUuMzUwNCAxMy4yNzkzIDE1LjY1MDMgMTMuMzgzNCAxNS45NTU1IDEzLjM2NTRDMTYuMjYwNyAxMy4zNDc0IDE2LjU0NjMgMTMuMjA5IDE2Ljc0OTQgMTIuOTgwNEMxNi45NTI1IDEyLjc1MTkgMTcuMDU2NSAxMi40NTIxIDE3LjAzODYgMTIuMTQ2OUMxNy4wMjA2IDExLjg0MTcgMTYuODgyMSAxMS41NTYxIDE2LjY1MzYgMTEuMzUzVjExLjM1NDFaXCIgZmlsbD1cIiNDNjBFNENcIi8+XG4gICAgICAgICAgPHBhdGggZD1cIk0xMS42OTQ4IDQuNzM0MzlDOC42MDA1IDQuNzMwMTIgNS42MjExIDUuOTA2MTggMy4zNjM5OSA4LjAyMjhDMy4yNDk3MSA4LjEyNTE2IDMuMTU3MDMgOC4yNDkzMiAzLjA5MTM2IDguMzg3OThDMy4wMjU3IDguNTI2NjQgMi45ODgzOCA4LjY3NzAxIDIuOTgxNiA4LjgzMDI5QzIuOTc0ODEgOC45ODM1NiAyLjk5ODcgOS4xMzY2NCAzLjA1MTg2IDkuMjgwNTZDMy4xMDUwMiA5LjQyNDQ4IDMuMTg2MzggOS41NTYzNCAzLjI5MTE3IDkuNjY4NEMzLjM5NTk2IDkuNzgwNDYgMy41MjIwNyA5Ljg3MDQ3IDMuNjYyMTEgOS45MzMxNUMzLjgwMjE0IDkuOTk1ODMgMy45NTMyOCAxMC4wMjk5IDQuMTA2NjYgMTAuMDMzNEM0LjI2MDA1IDEwLjAzNjkgNC40MTI1OCAxMC4wMDk4IDQuNTU1MzMgOS45NTM1M0M0LjY5ODA4IDkuODk3MyA0LjgyODE2IDkuODEzMTMgNC45Mzc5NSA5LjcwNTk3QzYuNzcwNjUgNy45OTI1NCA5LjE4NTg3IDcuMDM5MzcgMTEuNjk0OCA3LjAzOTM3QzE0LjIwMzcgNy4wMzkzNyAxNi42MTg5IDcuOTkyNTQgMTguNDUxNiA5LjcwNTk3QzE4LjU2MTQgOS44MTMxMyAxOC42OTE1IDkuODk3MyAxOC44MzQyIDkuOTUzNTNDMTguOTc3IDEwLjAwOTggMTkuMTI5NSAxMC4wMzY5IDE5LjI4MjkgMTAuMDMzNEMxOS40MzYzIDEwLjAyOTkgMTkuNTg3NCA5Ljk5NTgzIDE5LjcyNzUgOS45MzMxNUMxOS44Njc1IDkuODcwNDcgMTkuOTkzNiA5Ljc4MDQ2IDIwLjA5ODQgOS42Njg0QzIwLjIwMzIgOS41NTYzNCAyMC4yODQ1IDkuNDI0NDggMjAuMzM3NyA5LjI4MDU2QzIwLjM5MDkgOS4xMzY2NCAyMC40MTQ3IDguOTgzNTYgMjAuNDA4IDguODMwMjlDMjAuNDAxMiA4LjY3NzAxIDIwLjM2MzkgOC41MjY2NCAyMC4yOTgyIDguMzg3OThDMjAuMjMyNSA4LjI0OTMyIDIwLjEzOTggOC4xMjUxNiAyMC4wMjU2IDguMDIyOEMxNy43Njg1IDUuOTA2MTggMTQuNzg5MSA0LjczMDEyIDExLjY5NDggNC43MzQzOVpcIiBmaWxsPVwiI0M2MEU0Q1wiLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTIyLjk4MzggNC4zMDQ1MUMxOS44NzY2IDEuNTMyMTcgMTUuODU4IDAgMTEuNjkzOSAwQzcuNTI5NjkgMCAzLjUxMTEgMS41MzIxNyAwLjQwMzk0MiA0LjMwNDUxQzAuMjg3MTY2IDQuNDA0MjYgMC4xOTE1MDUgNC41MjYzNCAwLjEyMjU4IDQuNjYzNTlDMC4wNTM2NTUxIDQuODAwODMgMC4wMTI4NTY3IDQuOTUwNDcgMC4wMDI1ODIwOCA1LjEwMzdDLTAuMDA3NjkyNTkgNS4yNTY5NCAwLjAxMjc2MzggNS40MTA2OCAwLjA2Mjc0OTMgNS41NTU5QzAuMTEyNzM1IDUuNzAxMTIgMC4xOTEyNDEgNS44MzQ4OCAwLjI5MzY1NSA1Ljk0OTMzQzAuMzk2MDY5IDYuMDYzNzggMC41MjAzMjQgNi4xNTY2IDAuNjU5MTIgNi4yMjIzNUMwLjc5NzkxNyA2LjI4ODA5IDAuOTQ4NDUzIDYuMzI1NDMgMS4xMDE4OSA2LjMzMjE4QzEuMjU1MzIgNi4zMzg5MiAxLjQwODU1IDYuMzE0OTMgMS41NTI1OCA2LjI2MTYxQzEuNjk2NjEgNi4yMDgyOSAxLjgyODUyIDYuMTI2NzIgMS45NDA1OCA2LjAyMTdDNC42MjUxMSAzLjYyNzQ5IDguMDk2NTEgMi4zMDQzOCAxMS42OTM2IDIuMzA0MzhDMTUuMjkwNyAyLjMwNDM4IDE4Ljc2MjEgMy42Mjc0OSAyMS40NDY2IDYuMDIxN0MyMS42NzQ0IDYuMjI1NDcgMjEuOTczOSA2LjMzMDM4IDIyLjI3OTEgNi4zMTMzNUMyMi41ODQzIDYuMjk2MzIgMjIuODcwMyA2LjE1ODc0IDIzLjA3NDEgNS45MzA4OEMyMy4yNzc4IDUuNzAzMDIgMjMuMzgyNyA1LjQwMzU0IDIzLjM2NTcgNS4wOTgzM0MyMy4zNDg3IDQuNzkzMTIgMjMuMjExMSA0LjUwNzE4IDIyLjk4MzIgNC4zMDM0MUwyMi45ODM4IDQuMzA0NTFaXCIgZmlsbD1cIiNDNjBFNENcIi8+XG4gICAgICAgICAgPHBhdGggZD1cIk0xMS42OTM3IDE4LjAwMDZDMTIuNjYzNiAxOC4wMDA2IDEzLjQ0OTggMTcuMjE0MyAxMy40NDk4IDE2LjI0NDRDMTMuNDQ5OCAxNS4yNzQ1IDEyLjY2MzYgMTQuNDg4MyAxMS42OTM3IDE0LjQ4ODNDMTAuNzIzOCAxNC40ODgzIDkuOTM3NSAxNS4yNzQ1IDkuOTM3NSAxNi4yNDQ0QzkuOTM3NSAxNy4yMTQzIDEwLjcyMzggMTguMDAwNiAxMS42OTM3IDE4LjAwMDZaXCIgZmlsbD1cIiNDNjBFNENcIi8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsb3N0LXRleHRcIj5cbiAgICAgICAgTGEgY29uZXhpw7NuIHNlIGhhIDxzdHJvbmc+cGVyZGlkby48L3N0cm9uZz4gUmV2aXNhIGVsIGVzdGFkbyBkZSB0dSByZWQuXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBCYW5uZXIgZGUgY29uZXhpw7NuIGJ1ZW5hIChzb2xvIHZpc2libGUgZW4gbG9jYWxob3N0KSAtLT5cbiAgPGRpdiBjbGFzcz1cImNvbm5lY3Rpb24tZ29vZFwiICpuZ0lmPVwic2hvd0dvb2RDb25uZWN0aW9uICYmICFzaG93V2FybmluZyAmJiAhY29ubmVjdGlvbkxvc3RcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZ29vZC1iYW5uZXJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJnb29kLWljb25cIj5cbiAgICAgICAgPHN2ZyB3aWR0aD1cIjI0XCIgaGVpZ2h0PVwiMThcIiB2aWV3Qm94PVwiMCAwIDI0IDE4XCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XG4gICAgICAgICAgPHBhdGggZD1cIk0xNi42NTM2IDExLjM1NDFDMTUuMjg3NCAxMC4xMzk2IDEzLjUyMjkgOS40Njg3NSAxMS42OTQ5IDkuNDY4NzVDOS44NjY5NCA5LjQ2ODc1IDguMTAyNSAxMC4xMzk2IDYuNzM2MjUgMTEuMzU0MUM2LjYyMDgxIDExLjQ1NCA2LjUyNjM2IDExLjU3NTggNi40NTgzOSAxMS43MTI1QzYuMzkwNDMgMTEuODQ5MiA2LjM1MDMgMTEuOTk4MSA2LjM0MDM0IDEyLjE1MDRDNi4zMzAzOSAxMi4zMDI4IDYuMzUwOCAxMi40NTU2IDYuNDAwMzkgMTIuNTk5OUM2LjQ0OTk4IDEyLjc0NDMgNi41Mjc3NiAxMi44Nzc0IDYuNjI5MjIgMTIuOTkxNUM2LjczMDY4IDEzLjEwNTYgNi44NTM4IDEzLjE5ODQgNi45OTE0MiAxMy4yNjQ1QzcuMTI5MDMgMTMuMzMwNiA3LjI3ODQxIDEzLjM2ODYgNy40MzA4OCAxMy4zNzY1QzcuNTgzMzQgMTMuMzg0NCA3LjczNTg1IDEzLjM2MTkgNy44Nzk1NSAxMy4zMTA0QzguMDIzMjUgMTMuMjU4OCA4LjE1NTI3IDEzLjE3OTIgOC4yNjc5NiAxMy4wNzYyQzkuMjEyMjMgMTIuMjM3IDEwLjQzMTYgMTEuNzczNCAxMS42OTQ5IDExLjc3MzRDMTIuOTU4MyAxMS43NzM0IDE0LjE3NzYgMTIuMjM3IDE1LjEyMTkgMTMuMDc2MkMxNS4zNTA0IDEzLjI3OTMgMTUuNjUwMyAxMy4zODM0IDE1Ljk1NTUgMTMuMzY1NEMxNi4yNjA3IDEzLjM0NzQgMTYuNTQ2MyAxMy4yMDkgMTYuNzQ5NCAxMi45ODA0QzE2Ljk1MjUgMTIuNzUxOSAxNy4wNTY1IDEyLjQ1MjEgMTcuMDM4NiAxMi4xNDY5QzE3LjAyMDYgMTEuODQxNyAxNi44ODIxIDExLjU1NjEgMTYuNjUzNiAxMS4zNTNWMTEuMzU0MVpcIiBmaWxsPVwiIzAwQTY1MVwiLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTExLjY5NDggNC43MzQzOUM4LjYwMDUgNC43MzAxMiA1LjYyMTEgNS45MDYxOCAzLjM2Mzk5IDguMDIyOEMzLjI0OTcxIDguMTI1MTYgMy4xNTcwMyA4LjI0OTMyIDMuMDkxMzYgOC4zODc5OEMzLjAyNTcgOC41MjY2NCAyLjk4ODM4IDguNjc3MDEgMi45ODE2IDguODMwMjlDMi45NzQ4MSA4Ljk4MzU2IDIuOTk4NyA5LjEzNjY0IDMuMDUxODYgOS4yODA1NkMzLjEwNTAyIDkuNDI0NDggMy4xODYzOCA5LjU1NjM0IDMuMjkxMTcgOS42Njg0QzMuMzk1OTYgOS43ODA0NiAzLjUyMjA3IDkuODcwNDcgMy42NjIxMSA5LjkzMzE1QzMuODAyMTQgOS45OTU4MyAzLjk1MzI4IDEwLjAyOTkgNC4xMDY2NiAxMC4wMzM0QzQuMjYwMDUgMTAuMDM2OSA0LjQxMjU4IDEwLjAwOTggNC41NTUzMyA5Ljk1MzUzQzQuNjk4MDggOS44OTczIDQuODI4MTYgOS44MTMxMyA0LjkzNzk1IDkuNzA1OTdDNi43NzA2NSA3Ljk5MjU0IDkuMTg1ODcgNy4wMzkzNyAxMS42OTQ4IDcuMDM5MzdDMTQuMjAzNyA3LjAzOTM3IDE2LjYxODkgNy45OTI1NCAxOC40NTE2IDkuNzA1OTdDMTguNTYxNCA5LjgxMzEzIDE4LjY5MTUgOS44OTczIDE4LjgzNDIgOS45NTM1M0MxOC45NzcgMTAuMDA5OCAxOS4xMjk1IDEwLjAzNjkgMTkuMjgyOSAxMC4wMzM0QzE5LjQzNjMgMTAuMDI5OSAxOS41ODc0IDkuOTk1ODMgMTkuNzI3NSA5LjkzMzE1QzE5Ljg2NzUgOS44NzA0NyAxOS45OTM2IDkuNzgwNDYgMjAuMDk4NCA5LjY2ODRDMjAuMjAzMiA5LjU1NjM0IDIwLjI4NDUgOS40MjQ0OCAyMC4zMzc3IDkuMjgwNTZDMjAuMzkwOSA5LjEzNjY0IDIwLjQxNDcgOC45ODM1NiAyMC40MDggOC44MzAyOUMyMC40MDEyIDguNjc3MDEgMjAuMzYzOSA4LjUyNjY0IDIwLjI5ODIgOC4zODc5OEMyMC4yMzI1IDguMjQ5MzIgMjAuMTM5OCA4LjEyNTE2IDIwLjAyNTYgOC4wMjI4QzE3Ljc2ODUgNS45MDYxOCAxNC43ODkxIDQuNzMwMTIgMTEuNjk0OCA0LjczNDM5WlwiIGZpbGw9XCIjMDBBNjUxXCIvPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNMjIuOTgzOCA0LjMwNDUxQzE5Ljg3NjYgMS41MzIxNyAxNS44NTggMCAxMS42OTM5IDBDNy41Mjk2OSAwIDMuNTExMSAxLjUzMjE3IDAuNDAzOTQyIDQuMzA0NTFDMC4yODcxNjYgNC40MDQyNiAwLjE5MTUwNSA0LjUyNjM0IDAuMTIyNTggNC42NjM1OUMwLjA1MzY1NTEgNC44MDA4MyAwLjAxMjg1NjcgNC45NTA0NyAwLjAwMjU4MjA4IDUuMTAzN0MtMC4wMDc2OTI1OSA1LjI1Njk0IDAuMDEyNzYzOCA1LjQxMDY4IDAuMDYyNzQ5MyA1LjU1NTlDMC4xMTI3MzUgNS43MDExMiAwLjE5MTI0MSA1LjgzNDg4IDAuMjkzNjU1IDUuOTQ5MzNDMC4zOTYwNjkgNi4wNjM3OCAwLjUyMDMyNCA2LjE1NjYgMC42NTkxMiA2LjIyMjM1QzAuNzk3OTE3IDYuMjg4MDkgMC45NDg0NTMgNi4zMjU0MyAxLjEwMTg5IDYuMzMyMThDMS4yNTUzMiA2LjMzODkyIDEuNDA4NTUgNi4zMTQ5MyAxLjU1MjU4IDYuMjYxNjFDMS42OTY2MSA2LjIwODI5IDEuODI4NTIgNi4xMjY3MiAxLjk0MDU4IDYuMDIxN0M0LjYyNTExIDMuNjI3NDkgOC4wOTY1MSAyLjMwNDM4IDExLjY5MzYgMi4zMDQzOEMxNS4yOTA3IDIuMzA0MzggMTguNzYyMSAzLjYyNzQ5IDIxLjQ0NjYgNi4wMjE3QzIxLjY3NDQgNi4yMjU0NyAyMS45NzM5IDYuMzMwMzggMjIuMjc5MSA2LjMxMzM1QzIyLjU4NDMgNi4yOTYzMiAyMi44NzAzIDYuMTU4NzQgMjMuMDc0MSA1LjkzMDg4QzIzLjI3NzggNS43MDMwMiAyMy4zODI3IDUuNDAzNTQgMjMuMzY1NyA1LjA5ODMzQzIzLjM0ODcgNC43OTMxMiAyMy4yMTExIDQuNTA3MTggMjIuOTgzMiA0LjMwMzQxTDIyLjk4MzggNC4zMDQ1MVpcIiBmaWxsPVwiIzAwQTY1MVwiLz5cbiAgICAgICAgICA8cGF0aCBkPVwiTTExLjY5MzcgMTguMDAwNkMxMi42NjM2IDE4LjAwMDYgMTMuNDQ5OCAxNy4yMTQzIDEzLjQ0OTggMTYuMjQ0NEMxMy40NDk4IDE1LjI3NDUgMTIuNjYzNiAxNC40ODgzIDExLjY5MzcgMTQuNDg4M0MxMC43MjM4IDE0LjQ4ODMgOS45Mzc1IDE1LjI3NDUgOS45Mzc1IDE2LjI0NDRDOS45Mzc1IDE3LjIxNDMgMTAuNzIzOCAxOC4wMDA2IDExLjY5MzcgMTguMDAwNlpcIiBmaWxsPVwiIzAwQTY1MVwiLz5cbiAgICAgICAgPC9zdmc+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJnb29kLXRleHRcIj5cbiAgICAgICAgTGEgY29uZXhpw7NuIGVzdMOhIDxzdHJvbmc+ZXN0YWJsZS48L3N0cm9uZz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICBcbjwvZGl2PlxuIl19