Files
catalog/dist_ts_web/elements/sz-service-detail-view.js
2026-01-03 02:44:25 +00:00

728 lines
38 KiB
JavaScript

var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
var _, done = false;
for (var i = decorators.length - 1; i >= 0; i--) {
var context = {};
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
if (kind === "accessor") {
if (result === void 0) continue;
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
if (_ = accept(result.get)) descriptor.get = _;
if (_ = accept(result.set)) descriptor.set = _;
if (_ = accept(result.init)) initializers.unshift(_);
}
else if (_ = accept(result)) {
if (kind === "field") initializers.unshift(_);
else descriptor[key] = _;
}
}
if (target) Object.defineProperty(target, contextIn.name, descriptor);
done = true;
};
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
var useValue = arguments.length > 2;
for (var i = 0; i < initializers.length; i++) {
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
}
return useValue ? value : void 0;
};
import { DeesElement, customElement, html, css, cssManager, property, } from '@design.estate/dees-element';
import './sz-stat-card.js';
let SzServiceDetailView = (() => {
let _classDecorators = [customElement('sz-service-detail-view')];
let _classDescriptor;
let _classExtraInitializers = [];
let _classThis;
let _classSuper = DeesElement;
let _service_decorators;
let _service_initializers = [];
let _service_extraInitializers = [];
let _stats_decorators;
let _stats_initializers = [];
let _stats_extraInitializers = [];
let _backups_decorators;
let _backups_initializers = [];
let _backups_extraInitializers = [];
let _logs_decorators;
let _logs_initializers = [];
let _logs_extraInitializers = [];
let _streaming_decorators;
let _streaming_initializers = [];
let _streaming_extraInitializers = [];
var SzServiceDetailView = class extends _classSuper {
static { _classThis = this; }
static {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
_service_decorators = [property({ type: Object })];
_stats_decorators = [property({ type: Object })];
_backups_decorators = [property({ type: Array })];
_logs_decorators = [property({ type: Array })];
_streaming_decorators = [property({ type: Boolean })];
__esDecorate(this, null, _service_decorators, { kind: "accessor", name: "service", static: false, private: false, access: { has: obj => "service" in obj, get: obj => obj.service, set: (obj, value) => { obj.service = value; } }, metadata: _metadata }, _service_initializers, _service_extraInitializers);
__esDecorate(this, null, _stats_decorators, { kind: "accessor", name: "stats", static: false, private: false, access: { has: obj => "stats" in obj, get: obj => obj.stats, set: (obj, value) => { obj.stats = value; } }, metadata: _metadata }, _stats_initializers, _stats_extraInitializers);
__esDecorate(this, null, _backups_decorators, { kind: "accessor", name: "backups", static: false, private: false, access: { has: obj => "backups" in obj, get: obj => obj.backups, set: (obj, value) => { obj.backups = value; } }, metadata: _metadata }, _backups_initializers, _backups_extraInitializers);
__esDecorate(this, null, _logs_decorators, { kind: "accessor", name: "logs", static: false, private: false, access: { has: obj => "logs" in obj, get: obj => obj.logs, set: (obj, value) => { obj.logs = value; } }, metadata: _metadata }, _logs_initializers, _logs_extraInitializers);
__esDecorate(this, null, _streaming_decorators, { kind: "accessor", name: "streaming", static: false, private: false, access: { has: obj => "streaming" in obj, get: obj => obj.streaming, set: (obj, value) => { obj.streaming = value; } }, metadata: _metadata }, _streaming_initializers, _streaming_extraInitializers);
__esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
SzServiceDetailView = _classThis = _classDescriptor.value;
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
}
static demo = () => html `
<div style="padding: 24px; max-width: 1200px;">
<sz-service-detail-view
.service=${{
name: 'test-nginx',
status: 'running',
image: 'nginx:alpine',
port: 80,
domain: 'app.bleu.de',
containerId: 'pchbbr9fjr4g',
created: '11/18/2025, 2:06:55 PM',
updated: '11/26/2025, 4:05:46 PM',
registry: 'Docker Hub',
repository: 'nginx',
tag: 'alpine',
}}
.stats=${{
cpu: 0.5,
memory: '32.1 MB',
memoryLimit: '61.3 GB',
networkIn: '6.4 KB',
networkOut: '252 B',
}}
.backups=${[
{ id: '1', createdAt: '1/2/2026, 2:00:03 AM', size: '21.96 MB', type: 'Docker Image' },
{ id: '2', createdAt: '11/27/2025, 1:42:26 PM', size: '51.76 MB', type: 'Docker Image' },
]}
.logs=${[
{ timestamp: '2024-01-02 10:15:32', message: '192.168.1.100 - - [02/Jan/2024:10:15:32 +0000] "GET / HTTP/1.1" 200 612' },
{ timestamp: '2024-01-02 10:15:30', message: '192.168.1.100 - - [02/Jan/2024:10:15:30 +0000] "GET /favicon.ico HTTP/1.1" 404 153' },
]}
></sz-service-detail-view>
</div>
`;
#service_accessor_storage = __runInitializers(this, _service_initializers, {
name: '',
status: 'stopped',
image: '',
port: 0,
domain: null,
containerId: '',
created: '',
updated: '',
registry: '',
repository: '',
tag: '',
});
get service() { return this.#service_accessor_storage; }
set service(value) { this.#service_accessor_storage = value; }
#stats_accessor_storage = (__runInitializers(this, _service_extraInitializers), __runInitializers(this, _stats_initializers, {
cpu: 0,
memory: '0 MB',
memoryLimit: '0 GB',
networkIn: '0 B',
networkOut: '0 B',
}));
get stats() { return this.#stats_accessor_storage; }
set stats(value) { this.#stats_accessor_storage = value; }
#backups_accessor_storage = (__runInitializers(this, _stats_extraInitializers), __runInitializers(this, _backups_initializers, []));
get backups() { return this.#backups_accessor_storage; }
set backups(value) { this.#backups_accessor_storage = value; }
#logs_accessor_storage = (__runInitializers(this, _backups_extraInitializers), __runInitializers(this, _logs_initializers, []));
get logs() { return this.#logs_accessor_storage; }
set logs(value) { this.#logs_accessor_storage = value; }
#streaming_accessor_storage = (__runInitializers(this, _logs_extraInitializers), __runInitializers(this, _streaming_initializers, false));
get streaming() { return this.#streaming_accessor_storage; }
set streaming(value) { this.#streaming_accessor_storage = value; }
static styles = [
cssManager.defaultStyles,
css `
:host {
display: block;
}
.header {
display: flex;
align-items: center;
gap: 16px;
margin-bottom: 24px;
}
.back-link {
display: inline-flex;
align-items: center;
gap: 6px;
font-size: 14px;
color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
cursor: pointer;
transition: color 200ms ease;
}
.back-link:hover {
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
}
.service-header {
display: flex;
align-items: center;
gap: 12px;
}
.service-name {
font-size: 24px;
font-weight: 700;
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
}
.status-badge {
display: inline-flex;
align-items: center;
padding: 4px 12px;
border-radius: 9999px;
font-size: 13px;
font-weight: 500;
}
.status-badge.running {
background: ${cssManager.bdTheme('#dcfce7', 'rgba(34, 197, 94, 0.2)')};
color: ${cssManager.bdTheme('#16a34a', '#22c55e')};
}
.status-badge.stopped {
background: ${cssManager.bdTheme('#fee2e2', 'rgba(239, 68, 68, 0.2)')};
color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
}
.content {
display: grid;
grid-template-columns: 1fr;
gap: 24px;
}
@media (min-width: 1024px) {
.content {
grid-template-columns: 2fr 1fr;
}
}
.main-content {
display: flex;
flex-direction: column;
gap: 24px;
}
.sidebar {
display: flex;
flex-direction: column;
gap: 24px;
}
.card {
background: ${cssManager.bdTheme('#ffffff', '#09090b')};
border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
border-radius: 8px;
overflow: hidden;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px;
border-bottom: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
}
.card-title {
font-size: 16px;
font-weight: 600;
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
}
.card-subtitle {
font-size: 13px;
color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
margin-top: 2px;
}
.card-content {
padding: 16px;
}
.detail-list {
display: flex;
flex-direction: column;
gap: 12px;
}
.detail-item {
display: flex;
justify-content: space-between;
align-items: flex-start;
}
.detail-label {
font-size: 14px;
color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
}
.detail-value {
font-size: 14px;
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
text-align: right;
}
.detail-value a {
color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
text-decoration: none;
}
.detail-value a:hover {
text-decoration: underline;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 12px;
}
.stat-item {
background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
border-radius: 6px;
padding: 12px;
}
.stat-label {
display: flex;
align-items: center;
gap: 6px;
font-size: 13px;
color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
margin-bottom: 4px;
}
.stat-value {
font-size: 18px;
font-weight: 600;
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
}
.stat-subvalue {
font-size: 12px;
color: ${cssManager.bdTheme('#a1a1aa', '#52525b')};
}
.actions-grid {
display: flex;
flex-direction: column;
gap: 8px;
}
.action-button {
width: 100%;
padding: 10px 16px;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 200ms ease;
border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
background: ${cssManager.bdTheme('#ffffff', '#09090b')};
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
}
.action-button:hover {
background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
}
.action-button.danger {
color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
border-color: ${cssManager.bdTheme('#fee2e2', 'rgba(239, 68, 68, 0.3)')};
}
.action-button.danger:hover {
background: ${cssManager.bdTheme('#fee2e2', 'rgba(239, 68, 68, 0.2)')};
}
.backup-list {
display: flex;
flex-direction: column;
gap: 8px;
}
.backup-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 12px;
background: ${cssManager.bdTheme('#f4f4f5', '#18181b')};
border-radius: 6px;
}
.backup-info {
display: flex;
flex-direction: column;
gap: 2px;
}
.backup-date {
font-size: 13px;
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
}
.backup-meta {
font-size: 12px;
color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
}
.backup-actions {
display: flex;
gap: 4px;
}
.icon-button {
padding: 6px;
background: transparent;
border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
border-radius: 4px;
color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
cursor: pointer;
transition: all 200ms ease;
}
.icon-button:hover {
background: ${cssManager.bdTheme('#ffffff', '#09090b')};
color: ${cssManager.bdTheme('#18181b', '#fafafa')};
}
.logs-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.logs-actions {
display: flex;
gap: 8px;
align-items: center;
}
.stream-button {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 12px;
background: ${cssManager.bdTheme('#2563eb', '#3b82f6')};
border: none;
border-radius: 4px;
font-size: 13px;
font-weight: 500;
color: white;
cursor: pointer;
}
.stream-button.streaming {
background: ${cssManager.bdTheme('#dc2626', '#ef4444')};
}
.clear-button {
padding: 6px 12px;
background: transparent;
border: 1px solid ${cssManager.bdTheme('#e4e4e7', '#27272a')};
border-radius: 4px;
font-size: 13px;
color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
cursor: pointer;
}
.logs-container {
padding: 16px;
font-family: monospace;
font-size: 12px;
max-height: 300px;
overflow-y: auto;
background: ${cssManager.bdTheme('#fafafa', '#0a0a0a')};
}
.log-entry {
padding: 2px 0;
color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
white-space: pre-wrap;
word-break: break-all;
}
.empty-logs {
padding: 24px;
text-align: center;
color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
}
.tag-badge {
display: inline-flex;
padding: 2px 8px;
background: ${cssManager.bdTheme('#dbeafe', 'rgba(59, 130, 246, 0.2)')};
color: ${cssManager.bdTheme('#2563eb', '#60a5fa')};
border-radius: 4px;
font-size: 12px;
font-weight: 500;
}
`,
];
render() {
return html `
<div class="header">
<div class="back-link" @click=${() => this.handleBack()}>
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="15 18 9 12 15 6"></polyline>
</svg>
Back to Services
</div>
</div>
<div class="service-header" style="margin-bottom: 24px;">
<h1 class="service-name">${this.service.name}</h1>
<span class="status-badge ${this.service.status}">${this.service.status}</span>
</div>
<div class="content">
<div class="main-content">
<div class="card">
<div class="card-header">
<div>
<div class="card-title">Service Details</div>
</div>
<button class="action-button" style="width: auto; padding: 6px 12px;" @click=${() => this.handleEdit()}>Edit</button>
</div>
<div class="card-content">
<div class="detail-list">
<div class="detail-item">
<span class="detail-label">Image</span>
<span class="detail-value">${this.service.image}</span>
</div>
<div class="detail-item">
<span class="detail-label">Port</span>
<span class="detail-value">${this.service.port}</span>
</div>
<div class="detail-item">
<span class="detail-label">Domain</span>
<span class="detail-value">
${this.service.domain
? html `<a href="https://${this.service.domain}" target="_blank">${this.service.domain}</a>`
: '-'}
</span>
</div>
<div class="detail-item">
<span class="detail-label">Container ID</span>
<span class="detail-value">${this.service.containerId}</span>
</div>
<div class="detail-item">
<span class="detail-label">Created</span>
<span class="detail-value">${this.service.created}</span>
</div>
<div class="detail-item">
<span class="detail-label">Updated</span>
<span class="detail-value">${this.service.updated}</span>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<div class="logs-header" style="width: 100%;">
<div>
<div class="card-title">Logs</div>
<div class="card-subtitle">Container logs</div>
</div>
<div class="logs-actions">
<button class="stream-button ${this.streaming ? 'streaming' : ''}" @click=${() => this.toggleStreaming()}>
<svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor">
${this.streaming
? html `<rect x="6" y="6" width="12" height="12" rx="1"/>`
: html `<polygon points="5,3 19,12 5,21"/>`}
</svg>
${this.streaming ? 'Stop' : 'Stream'}
</button>
<button class="clear-button" @click=${() => this.handleClearLogs()}>Clear logs</button>
</div>
</div>
</div>
<div class="logs-container">
${this.logs.length > 0 ? this.logs.map(log => html `
<div class="log-entry">${log.timestamp} ${log.message}</div>
`) : html `
<div class="empty-logs">Click "Stream" to start live log streaming</div>
`}
</div>
</div>
</div>
<div class="sidebar">
<div class="card">
<div class="card-header">
<div class="card-title">Live stats</div>
</div>
<div class="card-content">
<div class="stats-grid">
<div class="stat-item">
<div class="stat-label">CPU</div>
<div class="stat-value">${this.stats.cpu.toFixed(1)}%</div>
</div>
<div class="stat-item">
<div class="stat-label">Memory</div>
<div class="stat-value">${this.stats.memory}</div>
<div class="stat-subvalue">of ${this.stats.memoryLimit}</div>
</div>
<div class="stat-item">
<div class="stat-label">Network In</div>
<div class="stat-value">${this.stats.networkIn}</div>
</div>
<div class="stat-item">
<div class="stat-label">Network Out</div>
<div class="stat-value">${this.stats.networkOut}</div>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<div>
<div class="card-title">Actions</div>
<div class="card-subtitle">Manage service state</div>
</div>
</div>
<div class="card-content">
<div class="actions-grid">
${this.service.status === 'running'
? html `<button class="action-button" @click=${() => this.handleAction('stop')}>Stop Service</button>`
: html `<button class="action-button" @click=${() => this.handleAction('start')}>Start Service</button>`}
<button class="action-button" @click=${() => this.handleAction('restart')}>Restart Service</button>
<button class="action-button danger" @click=${() => this.handleAction('delete')}>Delete Service</button>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<div>
<div class="card-title">Image Source</div>
<div class="card-subtitle">${this.service.registry === 'Docker Hub' ? 'External container registry' : 'Onebox registry'}</div>
</div>
</div>
<div class="card-content">
<div class="detail-list">
<div class="detail-item">
<span class="detail-label">Registry</span>
<span class="detail-value">${this.service.registry}</span>
</div>
<div class="detail-item">
<span class="detail-label">Repository</span>
<span class="detail-value">${this.service.repository}</span>
</div>
<div class="detail-item">
<span class="detail-label">Tag</span>
<span class="detail-value"><span class="tag-badge">${this.service.tag}</span></span>
</div>
</div>
</div>
</div>
<div class="card">
<div class="card-header">
<div>
<div class="card-title">Backups</div>
<div class="card-subtitle">Create and manage service backups</div>
</div>
<button class="action-button" style="width: auto; padding: 6px 12px;" @click=${() => this.handleCreateBackup()}>
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="margin-right: 4px;">
<line x1="12" y1="5" x2="12" y2="19"></line>
<line x1="5" y1="12" x2="19" y2="12"></line>
</svg>
Create Backup
</button>
</div>
<div class="card-content">
<div class="backup-list">
${this.backups.map(backup => html `
<div class="backup-item">
<div class="backup-info">
<div class="backup-date">${backup.createdAt}</div>
<div class="backup-meta">${backup.size} · ${backup.type}</div>
</div>
<div class="backup-actions">
<button class="icon-button" title="Download" @click=${() => this.handleDownloadBackup(backup)}>
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/>
<polyline points="7 10 12 15 17 10"/>
<line x1="12" y1="15" x2="12" y2="3"/>
</svg>
</button>
<button class="icon-button" title="Restore" @click=${() => this.handleRestoreBackup(backup)}>
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="1 4 1 10 7 10"/>
<path d="M3.51 15a9 9 0 1 0 2.13-9.36L1 10"/>
</svg>
</button>
<button class="icon-button" title="Delete" @click=${() => this.handleDeleteBackup(backup)}>
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<polyline points="3,6 5,6 21,6"/>
<path d="M19,6v14a2,2,0,0,1-2,2H7a2,2,0,0,1-2-2V6m3,0V4a2,2,0,0,1,2-2h4a2,2,0,0,1,2,2v2"/>
</svg>
</button>
</div>
</div>
`)}
</div>
</div>
</div>
</div>
</div>
`;
}
handleBack() {
this.dispatchEvent(new CustomEvent('back', { bubbles: true, composed: true }));
}
handleEdit() {
this.dispatchEvent(new CustomEvent('edit', { detail: this.service, bubbles: true, composed: true }));
}
handleAction(action) {
this.dispatchEvent(new CustomEvent('service-action', { detail: { service: this.service, action }, bubbles: true, composed: true }));
}
toggleStreaming() {
this.streaming = !this.streaming;
this.dispatchEvent(new CustomEvent('stream-toggle', { detail: { streaming: this.streaming }, bubbles: true, composed: true }));
}
handleClearLogs() {
this.dispatchEvent(new CustomEvent('clear-logs', { bubbles: true, composed: true }));
}
handleCreateBackup() {
this.dispatchEvent(new CustomEvent('create-backup', { bubbles: true, composed: true }));
}
handleDownloadBackup(backup) {
this.dispatchEvent(new CustomEvent('download-backup', { detail: backup, bubbles: true, composed: true }));
}
handleRestoreBackup(backup) {
this.dispatchEvent(new CustomEvent('restore-backup', { detail: backup, bubbles: true, composed: true }));
}
handleDeleteBackup(backup) {
this.dispatchEvent(new CustomEvent('delete-backup', { detail: backup, bubbles: true, composed: true }));
}
constructor() {
super(...arguments);
__runInitializers(this, _streaming_extraInitializers);
}
static {
__runInitializers(_classThis, _classExtraInitializers);
}
};
return SzServiceDetailView = _classThis;
})();
export { SzServiceDetailView };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3otc2VydmljZS1kZXRhaWwtdmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX3dlYi9lbGVtZW50cy9zei1zZXJ2aWNlLWRldGFpbC12aWV3LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGFBQWEsRUFDYixJQUFJLEVBQ0osR0FBRyxFQUNILFVBQVUsRUFDVixRQUFRLEdBRVQsTUFBTSw2QkFBNkIsQ0FBQztBQUVyQyxPQUFPLG1CQUFtQixDQUFDO0lBNENkLG1CQUFtQjs0QkFEL0IsYUFBYSxDQUFDLHdCQUF3QixDQUFDOzs7O3NCQUNDLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7bUNBQW5CLFNBQVEsV0FBVzs7OzttQ0FvQ2pELFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztpQ0FlMUIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO21DQVMxQixRQUFRLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUM7Z0NBR3pCLFFBQVEsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQztxQ0FHekIsUUFBUSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBN0I1QiwwS0FBZ0IsT0FBTyw2QkFBUCxPQUFPLHlGQVlyQjtZQUdGLG9LQUFnQixLQUFLLDZCQUFMLEtBQUsscUZBTW5CO1lBR0YsMEtBQWdCLE9BQU8sNkJBQVAsT0FBTyx5RkFBd0I7WUFHL0MsaUtBQWdCLElBQUksNkJBQUosSUFBSSxtRkFBbUI7WUFHdkMsZ0xBQWdCLFNBQVMsNkJBQVQsU0FBUyw2RkFBa0I7WUFuRTdDLDZLQStvQkM7Ozs7UUE5b0JRLE1BQU0sQ0FBQyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFBOzs7bUJBR2Q7WUFDVCxJQUFJLEVBQUUsWUFB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