tango-app-ui-ai-audio 3.0.31 → 3.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { Component } from '@angular/core';
|
|
2
2
|
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
+
import * as XLSX from 'xlsx';
|
|
4
|
+
import * as FileSaver from 'file-saver';
|
|
3
5
|
import * as i0 from "@angular/core";
|
|
4
6
|
import * as i1 from "../../services/audio.service";
|
|
5
7
|
import * as i2 from "@angular/router";
|
|
@@ -67,6 +69,7 @@ export class TangoEchoComponent {
|
|
|
67
69
|
detailOpenId = null;
|
|
68
70
|
detailLoading = false;
|
|
69
71
|
detailConvDetail = null;
|
|
72
|
+
detailSearchValue = '';
|
|
70
73
|
// ── Manage (cohort CRUD API) ───────────────────────
|
|
71
74
|
manageCohorts = [];
|
|
72
75
|
manageLoading = false;
|
|
@@ -452,6 +455,17 @@ export class TangoEchoComponent {
|
|
|
452
455
|
this.fetchCohortCards();
|
|
453
456
|
this.fetchDetailConversations();
|
|
454
457
|
}
|
|
458
|
+
onDetailSearch() {
|
|
459
|
+
this.detailPage = 1;
|
|
460
|
+
this.fetchDetailConversations();
|
|
461
|
+
}
|
|
462
|
+
clearDetailSearch() {
|
|
463
|
+
if (!this.detailSearchValue)
|
|
464
|
+
return;
|
|
465
|
+
this.detailSearchValue = '';
|
|
466
|
+
this.detailPage = 1;
|
|
467
|
+
this.fetchDetailConversations();
|
|
468
|
+
}
|
|
455
469
|
backToOverview() {
|
|
456
470
|
this.detailView = false;
|
|
457
471
|
this.selectedCohortId = '';
|
|
@@ -562,6 +576,7 @@ export class TangoEchoComponent {
|
|
|
562
576
|
overflowChips: overflow,
|
|
563
577
|
overflowCount: overflow.length,
|
|
564
578
|
overflowTooltip: overflow.join(', '),
|
|
579
|
+
allAttributes: cleaned,
|
|
565
580
|
count: row.count ?? 0
|
|
566
581
|
};
|
|
567
582
|
});
|
|
@@ -799,7 +814,8 @@ export class TangoEchoComponent {
|
|
|
799
814
|
limit: this.detailPerPage,
|
|
800
815
|
_id: this.selectedCardId ? [this.selectedCardId] : [],
|
|
801
816
|
name: this.selectedCardName,
|
|
802
|
-
offset: this.detailPage - 1
|
|
817
|
+
offset: this.detailPage - 1,
|
|
818
|
+
searchValue: this.detailSearchValue || ''
|
|
803
819
|
};
|
|
804
820
|
this.audioService.getConversationsList(payload).pipe(takeUntil(this.destroy$)).subscribe({
|
|
805
821
|
next: (res) => {
|
|
@@ -1063,6 +1079,22 @@ export class TangoEchoComponent {
|
|
|
1063
1079
|
hideBbtTooltip() {
|
|
1064
1080
|
this.bbtTooltip = { visible: false, x: 0, y: 0, items: [] };
|
|
1065
1081
|
}
|
|
1082
|
+
exportBbtCard(card) {
|
|
1083
|
+
if (!card || !Array.isArray(card.tableRows) || card.tableRows.length === 0)
|
|
1084
|
+
return;
|
|
1085
|
+
const rows = card.tableRows.map((r) => ({
|
|
1086
|
+
Brand: r.brand || '',
|
|
1087
|
+
Attributes: Array.isArray(r.allAttributes) ? r.allAttributes.join(', ') : '',
|
|
1088
|
+
Count: r.count ?? 0
|
|
1089
|
+
}));
|
|
1090
|
+
const worksheet = XLSX.utils.json_to_sheet(rows);
|
|
1091
|
+
worksheet['!cols'] = [{ wch: 28 }, { wch: 80 }, { wch: 10 }];
|
|
1092
|
+
const workbook = { Sheets: { Data: worksheet }, SheetNames: ['Data'] };
|
|
1093
|
+
const buffer = XLSX.write(workbook, { bookType: 'xlsx', type: 'array' });
|
|
1094
|
+
const blob = new Blob([buffer], { type: 'application/octet-stream' });
|
|
1095
|
+
const safeName = (card.name || 'card').toString().replace(/[^a-z0-9-_]+/gi, '_');
|
|
1096
|
+
FileSaver.saveAs(blob, `${safeName}.xlsx`);
|
|
1097
|
+
}
|
|
1066
1098
|
selectPieSlice(card, slice) {
|
|
1067
1099
|
card.selectedPieLabel = slice.label;
|
|
1068
1100
|
}
|
|
@@ -1090,10 +1122,10 @@ export class TangoEchoComponent {
|
|
|
1090
1122
|
return -offset;
|
|
1091
1123
|
}
|
|
1092
1124
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TangoEchoComponent, deps: [{ token: i1.AudioService }, { token: i2.ActivatedRoute }, { token: i3.GlobalStateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
1093
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TangoEchoComponent, selector: "lib-tango-echo", ngImport: i0, template: "<div class=\"echo-page\">\n <!-- Floating tooltip for BOOLEAN_BASKET_TABLE overflow chips -->\n <div class=\"bbt-float-tooltip\"\n *ngIf=\"bbtTooltip.visible\"\n [style.left.px]=\"bbtTooltip.x\"\n [style.top.px]=\"bbtTooltip.y\">\n <span *ngFor=\"let ov of bbtTooltip.items\" class=\"bbt-chip-tooltip-item\">{{ ov }}</span>\n </div>\n <div class=\"echo-content\">\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CONVERSATIONS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'conversations'\">\n\n <!-- Tango AI Header -->\n <div class=\"tango-ai-header\">\n <div class=\"tango-ai-logo\">\n <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"M12 2l2.09 6.26L20 10l-5.91 1.74L12 18l-2.09-6.26L4 10l5.91-1.74L12 2z\"/></svg>\n </div>\n <div class=\"tango-ai-header-text\">\n <div class=\"tango-ai-title\">Tango AI</div>\n <div class=\"tango-ai-subtitle\">Analyse conversations, stores & staff performance</div>\n </div>\n </div>\n\n <!-- Search Card -->\n <div class=\"echo-search-card\">\n <input type=\"text\" class=\"echo-search-input\" placeholder=\"Ask anything... 'Which stores are not performing well?'\" [(ngModel)]=\"convSearchQuery\" (keyup.enter)=\"sendConvQuery()\">\n <button class=\"echo-search-send\" (click)=\"sendConvQuery()\" [disabled]=\"!convSearchQuery?.trim()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>\n </svg>\n </button>\n </div>\n\n <!-- AI Response -->\n <div class=\"echo-ai-response\" *ngIf=\"convAiLoading || convAiReply\">\n <div *ngIf=\"convAiLoading\" class=\"typing\">\n <span class=\"typing-dot\"></span><span class=\"typing-dot\"></span><span class=\"typing-dot\"></span>\n </div>\n <p *ngIf=\"!convAiLoading && convAiReply\" class=\"echo-ai-text\">{{ convAiReply }}</p>\n </div>\n\n <!-- Total count -->\n <div class=\"echo-conv-count\">{{ convTotal }} Conversations</div>\n\n <!-- Conversations list area -->\n <div class=\"conversations-section\">\n\n <!-- Loading -->\n <div *ngIf=\"convLoading\" class=\"echo-empty-state\">Loading conversations...</div>\n\n <!-- Conversation cards (dynamic from API \u2014 same pattern as transcript-list) -->\n <div *ngFor=\"let conv of conversations; trackBy: trackById\" class=\"conv-card\">\n <div class=\"conv-header\" (click)=\"toggleConvExpand(conv.audioId)\">\n <div class=\"conv-header-body\">\n <div class=\"conv-meta-row\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.userName\">{{ conv.userName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag meta-tag--duration\" *ngIf=\"conv.duration\">{{ conv.duration }}</span>\n </div>\n <div class=\"conv-description\">\n {{ conv.audioDescription || 'No description available' }}\n </div>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"expandedConvIds[conv.audioId]\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body (unified layout matching Agent Analysis design) -->\n <div *ngIf=\"expandedConvIds[conv.audioId]\" class=\"conv-body-expanded\">\n\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\">\n </div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Summary Content -->\n <div class=\"conv-body-padding\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No data -->\n <div *ngIf=\"!convLoading && conversations.length === 0\" class=\"echo-empty-state--sm\">No conversations found.</div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"convTotal > 0\" [itemsPerPage]=\"convPerPage\" [currentPage]=\"convPage\" [totalItems]=\"convTotal\"\n [paginationSizes]=\"convPaginationSizes\" [pageSize]=\"convPerPage\" (pageChange)=\"onConvPageChange($event)\"\n (pageSizeChange)=\"onConvPageSizeChange($event)\"></lib-pagination>\n </div> <!-- end conversations-section -->\n </ng-container>\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 AGENT ANALYSIS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'agentanalysis'\">\n\n <!-- \u2500\u2500 OVERVIEW: Agent Cards Grid \u2500\u2500 -->\n <ng-container *ngIf=\"!detailView\">\n <div class=\"analytics-overview-header\">\n <div>\n <div class=\"analytics-overview-title\">Analytics Overview</div>\n <div class=\"analytics-overview-subtitle\">{{ activeCohorts.length }} active agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"analysisSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input\">\n </div>\n </div>\n\n <div *ngIf=\"cohortList.length === 0\" class=\"echo-empty-state--muted\">Loading agents...</div>\n\n <div class=\"analytics-grid\" [style.grid-template-columns]=\"'repeat(' + Math.min(cohortList.length, 4) + ', 1fr)'\">\n <ng-container *ngFor=\"let cohort of cohortList; trackBy: trackById\">\n <div class=\"analytics-card\" *ngIf=\"!analysisSearch || (cohort.cohortName || cohort.name || '').toLowerCase().includes(analysisSearch.toLowerCase())\" (click)=\"selectCohortDetail(cohort)\">\n <div class=\"analytics-card-header\">\n <div class=\"analytics-card-top-row\">\n <div class=\"analytics-card-name\">{{ cohort.cohortName || cohort.name }}</div>\n <span class=\"analytics-card-badge-active\">Active</span>\n </div>\n <!-- metrics & stores badges hidden for now -->\n </div>\n <div class=\"analytics-card-spacer\"></div>\n <div class=\"analytics-card-footer\">\n <span class=\"analytics-hover-link\">View analytics \u2192</span>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- \u2500\u2500 DETAIL: Selected Cohort Metrics + Conversations \u2500\u2500 -->\n <ng-container *ngIf=\"detailView\">\n\n <!-- Header: \u2190 Back + Title + Conversations + Dropdown -->\n <div class=\"detail-header-bar\">\n <button class=\"detail-back-btn\" (click)=\"backToOverview()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>\n </button>\n <span class=\"detail-header-title\">{{ selectedCohortName }}</span>\n <span class=\"flex-spacer\"></span>\n <span class=\"detail-header-conv-count\">Total Conversations: {{ totalAudio }}</span>\n\n <!-- Cohort Dropdown -->\n <div class=\"agent-dropdown-wrap\">\n <div class=\"agent-dropdown-trigger\" (click)=\"toggleCohortDropdown()\">\n <div class=\"cohort-dd-dot\"></div>\n <span class=\"cohort-dd-trigger-name\">{{ selectedCohortName || 'Select Agent' }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2.5\" stroke-linecap=\"round\" [style.transform]=\"cohortDropdownOpen ? 'rotate(180deg)' : 'none'\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n <div class=\"agent-dropdown-menu\" *ngIf=\"cohortDropdownOpen\">\n <div class=\"cohort-dd-search-wrap\">\n <div class=\"cohort-dd-search-inner\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"cohortDropdownSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input--small\">\n </div>\n </div>\n <div class=\"cohort-dd-scroll\">\n <div *ngFor=\"let c of filteredDropdownCohorts; trackBy: trackById\" class=\"agent-dd-item\" [class.selected]=\"(c.cohortId || c.id || c._id) === selectedCohortId\" (click)=\"selectCohortFromDropdown(c)\">\n <div class=\"cohort-dd-item-dot\" [style.background]=\"c.metricsAdded > 0 ? '#10B981' : '#D0D5DD'\"></div>\n <div class=\"cohort-dd-item-body\">\n <div class=\"agent-dd-name\">{{ c.cohortName || c.name }}</div>\n <div class=\"agent-dd-meta\">{{ c.metricsAdded || 0 }} metrics</div>\n </div>\n <svg *ngIf=\"(c.cohortId || c.id || c._id) === selectedCohortId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#00A3FF\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n </div>\n <div *ngIf=\"filteredDropdownCohorts.length === 0\" class=\"cohort-dd-no-results\">No agents found</div>\n </div>\n </div>\n <div *ngIf=\"cohortDropdownOpen\" class=\"cohort-dd-backdrop\" (click)=\"closeCohortDropdown()\"></div>\n </div>\n </div>\n\n <!-- Loading -->\n <div *ngIf=\"cardsLoading\" class=\"echo-empty-state--muted\">Loading metrics...</div>\n\n <!-- Numeric scores \u2014 full-width stat strip above cards -->\n <div *ngIf=\"!cardsLoading && numericStripCard?.numericRows?.length\" class=\"numeric-stat-strip\">\n <div *ngFor=\"let row of numericStripCard.numericRows; let i = index\"\n class=\"numeric-stat-tile\"\n [style.border-left-color]=\"getNumericTileColor(i)\">\n <div class=\"numeric-stat-label\">{{ row.name }}</div>\n <div class=\"numeric-stat-value\" [style.color]=\"getNumericTileColor(i)\">\n {{ row.avg }}<span *ngIf=\"row.max !== null\" class=\"numeric-stat-max\">/{{ row.max }}</span>\n </div>\n <div class=\"numeric-stat-sub\" *ngIf=\"row.max !== null && row.min !== null\">\n scale {{ row.min }}\u2013{{ row.max }}{{ row.description ? ' \u00B7 ' + row.description : '' }}\n </div>\n </div>\n </div>\n\n <!-- Metric Cards (dynamic columns based on card count) -->\n <div *ngIf=\"!cardsLoading && nonNumericCards.length > 0\" class=\"metric-cards-dynamic\"\n [style.grid-template-columns]=\"'repeat(' + Math.min(nonNumericCards.length, 4) + ', 1fr)'\">\n <div *ngFor=\"let card of nonNumericCards; trackBy: trackById\" class=\"metric-card-dynamic\"\n [class.metric-card-dynamic--wide]=\"card.type === 'BOOLEAN_BASKET_BAR' || card.type === 'BOOLEAN_BASKET_TABLE'\">\n <!-- Card Header: Title + Status Badge + Info -->\n <div class=\"metric-card-header-row\">\n <div class=\"metric-card-title\">{{ card.name }}</div>\n <div class=\"metric-card-actions\">\n <span *ngIf=\"card.status\" class=\"metric-status-badge\"\n [style.background]=\"getStatusBadge(card.status).bg\"\n [style.color]=\"getStatusBadge(card.status).color\">{{ card.status }}</span>\n <div class=\"metric-info-icon\" *ngIf=\"card.description\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>\n <div class=\"metric-info-tooltip\">\n <div>{{ card.description }}</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"metric-card-subtitle\" *ngIf=\"card.type !== 'NUMERIC_SCALAR' && card.type !== 'NUMERIC_ARRAY'\">{{ card.applicableCount ?? totalAudio }} conversations</div>\n\n <div class=\"metric-card-content\">\n <!-- BOOLEAN_BASKET_TABLE \u2014 brand rows with attribute chips + count -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_TABLE'\">\n <div class=\"bbt-wrap\">\n <div *ngFor=\"let row of card.tableRows\" class=\"bbt-row\">\n <div class=\"bbt-brand\" [title]=\"row.brand\">{{ row.brand }}</div>\n <div class=\"bbt-chips\">\n <span *ngFor=\"let chip of row.visibleChips\" class=\"bbt-chip\">{{ chip }}</span>\n <span *ngIf=\"row.overflowCount > 0\" class=\"bbt-chip bbt-chip--more\"\n (mouseenter)=\"showBbtTooltip($event, row.overflowChips)\"\n (mouseleave)=\"hideBbtTooltip()\">\n +{{ row.overflowCount }}\n </span>\n </div>\n <div class=\"bbt-count\">{{ row.count }}</div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET_BAR \u2014 category list + pie chart + legend -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_BAR'\">\n <div class=\"bbb-wrap\">\n <div class=\"bbb-list\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-list-row\"\n [class.bbb-list-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-list-label\" [title]=\"slice.label\">{{ slice.label }}</span>\n </div>\n </div>\n <div class=\"bbb-pie-col\">\n <div class=\"bbb-pie-wrap\">\n <svg class=\"bbb-pie\" viewBox=\"0 0 100 100\">\n <path *ngFor=\"let slice of card.pieSlices\"\n [attr.d]=\"slice.path\"\n [attr.fill]=\"slice.color\"\n stroke=\"#ffffff\"\n stroke-width=\"0.8\"\n [class.bbb-pie-slice--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\"></path>\n </svg>\n </div>\n </div>\n <div class=\"bbb-legend\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-legend-row\"\n [class.bbb-legend-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-legend-dot\" [style.background]=\"slice.color\"></span>\n <span class=\"bbb-legend-label\">{{ slice.label }}</span>\n <span class=\"bbb-legend-pct\">{{ slice.percent }}%</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Boolean_basket_chart \u2014 keyword list + sentiment donut -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_CHART'\">\n <div class=\"bbc-wrap\">\n <div class=\"bbc-keyword-list\">\n <div *ngFor=\"let row of card.keywordRows\"\n class=\"bbc-keyword-row\"\n [class.bbc-keyword-row--active]=\"card.selectedKeyword === row.label\"\n (click)=\"selectBasketKeyword(card, row)\">\n <span class=\"bbc-keyword-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"bbc-keyword-count\">{{ row.count }}</span>\n </div>\n </div>\n <div class=\"bbc-chart-side\">\n <div class=\"bbc-donut-wrap\">\n <svg class=\"bbc-donut\" viewBox=\"0 0 100 100\">\n <circle cx=\"50\" cy=\"50\" r=\"42\" fill=\"none\" stroke=\"#F1F5F9\" stroke-width=\"14\"></circle>\n <circle *ngFor=\"let slice of card.selectedSlices; let i = index\"\n cx=\"50\" cy=\"50\" r=\"42\" fill=\"none\"\n [attr.stroke]=\"slice.color\"\n stroke-width=\"14\"\n [attr.stroke-dasharray]=\"getDonutDash(slice)\"\n [attr.stroke-dashoffset]=\"getDonutOffset(i, card)\"\n transform=\"rotate(-90 50 50)\"\n stroke-linecap=\"butt\"></circle>\n </svg>\n <div class=\"bbc-donut-center\" *ngIf=\"card.selectedSentiment\">\n <div class=\"bbc-donut-pct\">{{ card.selectedSentiment.percent }}%</div>\n <div class=\"bbc-donut-cap\">{{ card.selectedSentiment.label.toLowerCase() }}</div>\n </div>\n </div>\n <div class=\"bbc-legend\">\n <div *ngFor=\"let slice of card.selectedSlices\"\n class=\"bbc-legend-row\"\n [class.bbc-legend-row--active]=\"card.selectedSentiment?.key === slice.key\"\n (click)=\"selectBasketSentiment(card, slice)\">\n <span class=\"bbc-legend-dot\" [style.border-color]=\"slice.color\"></span>\n <span class=\"bbc-legend-label\">{{ slice.label }}</span>\n <span class=\"bbc-legend-pct\">{{ slice.percent }}%</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 Funnel Chart (left-aligned) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && card.isFunnel\">\n <div class=\"funnel-chart\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"funnel-stage\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"funnel-bar\" [title]=\"row.label\"\n [style.width.%]=\"card.booleanRows[0]?.responses > 0 ? (row.responses / card.booleanRows[0].responses * 100) : 100\"\n [style.background]=\"getScoreColor(row.score)\">\n <span class=\"funnel-label-wrap\">\n <span class=\"funnel-label\">{{ row.label }}</span>\n </span>\n <span class=\"funnel-value\"> <span class=\"funnel-value-count\">{{ row.responses }}</span> ({{ row.score }})% </span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 rows with progress bars (non-funnel) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && !card.isFunnel\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n <span class=\"metric-row-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"metric-score metric-score--teal\">{{ row.score }}%</span>\n <span class=\"metric-count\">{{ row.responses }}</span>\n </div>\n <div class=\"metric-progress-track\">\n <div class=\"metric-progress-fill\" [style.width.%]=\"row.score\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n </div>\n </div>\n </ng-container>\n\n\n <!-- UNIQUE_PITCHES \u2014 pitch keywords tracker -->\n <ng-container *ngIf=\"card.type === 'UNIQUE_PITCHES'\">\n <div class=\"pitch-keyword-count\">{{ card.pitchRows?.length || 0 }} keywords</div>\n <div>\n <div *ngFor=\"let pitch of card.pitchRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick('', card.key)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"['#00A3FF','#10B981','#F59E0B','#EF4444','#8B5CF6','#EC4899','#06B6D4','#84CC16','#F97316','#6366F1'][i % 10]\"></div>\n <span class=\"pitch-row-label\">{{ pitch.id }}</span>\n <span class=\"pitch-row-desc\">{{ pitch.desc ? pitch.desc.slice(0, 60) : '\u2013' }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SUBJECTIVE -->\n <ng-container *ngIf=\"card.type === 'SUBJECTIVE' || card.type === 'SUBJECTIVE_COUNT'\">\n <div class=\"subjective-wrap\" (click)=\"onCardRowClick('', card.key)\">\n <div *ngFor=\"let row of card.subjectiveRows?.slice(0, 2)\" class=\"subjective-row\">\n \u2022 {{ row.reasoning || row.store_id }}\n </div>\n </div>\n </ng-container>\n </div><!-- end metric-card-content -->\n </div>\n </div>\n\n <!-- Full no-data state: no cards AND no conversations -->\n <div *ngIf=\"!cardsLoading && !detailLoading && cohortCards.length === 0 && detailPageConvs.length === 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No analysis data or conversations available for the selected date range and stores.</div>\n </div>\n\n <!-- \u2500\u2500 Conversations Section (show when cards exist OR conversations exist OR loading) \u2500\u2500 -->\n <div id=\"echoConversations\" class=\"conversations-section\" *ngIf=\"cardsLoading || detailLoading || cohortCards.length > 0 || detailPageConvs.length > 0\">\n <div class=\"detail-conv-section-header\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#344054\" stroke-width=\"1.8\"><path d=\"M20 2H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h11l5 3V4a2 2 0 0 0-2-2z\"/></svg>\n <span class=\"detail-conv-section-title\">Conversations</span>\n </div>\n\n <div *ngIf=\"detailLoading\" class=\"echo-empty-state--muted\">Loading...</div>\n\n <div *ngFor=\"let conv of detailPageConvs; trackBy: trackById\" class=\"detail-conv-card\">\n <!-- Conv header -->\n <div class=\"conv-header\" (click)=\"toggleDetailConv(conv.audioId); loadConvDetail(conv)\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <div class=\"detail-meta-row\">\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.time\">{{ conv.time }}</span>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"detailOpenId === conv.audioId\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body -->\n <div *ngIf=\"detailOpenId === conv.audioId\" class=\"conv-body-expanded\">\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\"></div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Tabs -->\n <div class=\"conv-tabs\">\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'summary'\" (click)=\"setConvTab(conv.audioId, 'summary', $event)\">Summary</button>\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'transcript'\" (click)=\"setConvTab(conv.audioId, 'transcript', $event)\">Transcript</button>\n </div>\n\n <!-- Content: Left (Summary/Transcript + AI Insights) + Right (Metrics) -->\n <div class=\"detail-content-split\">\n <!-- Left side -->\n <div class=\"detail-content-left\">\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'summary'\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'transcript'\">\n <p class=\"summary-text summary-text--prewrap\">{{ cleanTranscription(conv.conversationDetails?.transcription) || 'No transcript available' }}</p>\n </ng-container>\n </div>\n <!-- Right side: Metrics (only show values that have data) -->\n <div class=\"detail-content-right\">\n <div class=\"metrics-panel-label\">Metrics</div>\n <ng-container *ngIf=\"conv.metrics?.length\">\n <div *ngFor=\"let m of conv.metrics\" class=\"metric-item-wrap\">\n <!-- Single value: name + value on same row -->\n <ng-container *ngIf=\"m.value?.length === 1\">\n <div class=\"metric-single-row\">\n <span class=\"metric-single-name\" [title]=\"m.name\">{{ m.name }}</span>\n <span class=\"metric-single-value\" [style.color]=\"m.value[0].score !== null && m.value[0].score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(m.value[0]) }}\n </span>\n </div>\n </ng-container>\n <!-- Multiple values: header + rows -->\n <ng-container *ngIf=\"m.value?.length > 1\">\n <div class=\"metric-multi-header\" [title]=\"m.name\">{{ m.name }}</div>\n <ng-container *ngFor=\"let v of m.value\">\n <div *ngIf=\"(v.score !== null && v.score !== undefined) || (v.Total !== null && v.Total !== undefined) || (v.Avg !== null && v.Avg !== undefined) || (v.total !== null && v.total !== undefined) || (v.avg !== null && v.avg !== undefined) || (v.count !== null && v.count !== undefined)\" class=\"metric-multi-row\">\n <span class=\"metric-multi-name\" [title]=\"v.name\">{{ v.name }}</span>\n <span class=\"metric-multi-value\"\n [style.color]=\"v.score !== null && v.score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(v) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!conv.metrics?.length\">\n <div *ngIf=\"conv.storeName\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Store</span><span class=\"metric-fallback-value\">{{ conv.storeName }}</span></div>\n <div *ngIf=\"conv.duration\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Duration</span><span class=\"metric-fallback-value\">{{ conv.duration }}</span></div>\n </ng-container>\n <div *ngIf=\"conv._detailLoading\" class=\"metric-detail-loading\">Loading...</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No conversations for this filter (only when cards exist but convs are empty) -->\n <div *ngIf=\"!detailLoading && detailPageConvs.length === 0 && cohortCards.length > 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No conversations available for the selected filter.</div>\n </div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"detailTotal > 0\" [itemsPerPage]=\"detailPerPage\" [currentPage]=\"detailPage\" [totalItems]=\"detailTotal\"\n [paginationSizes]=\"detailPaginationSizes\" [pageSize]=\"detailPerPage\" (pageChange)=\"onDetailPageChange($event)\"\n (pageSizeChange)=\"onDetailPageSizeChange($event)\"></lib-pagination>\n </ng-container><!-- end detailView -->\n </ng-container><!-- end agentanalysis -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 MANAGE TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'manage'\">\n <div class=\"manage-header\">\n <div>\n <div class=\"manage-title\">Agents</div>\n <div class=\"manage-subtitle\">{{ manageTotal }} agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap--wide\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"manageSearch\" (ngModelChange)=\"onManageSearch()\" placeholder=\"Search agents...\" class=\"manage-search-input\">\n </div>\n </div>\n\n <div *ngIf=\"manageLoading\" class=\"echo-empty-state\">Loading agents...</div>\n\n <!-- Agents table -->\n <div *ngIf=\"!manageLoading\" class=\"echo-card\">\n <div class=\"agents-table-header agents-table-4col\">\n <div class=\"agents-table-cell\">Agent Name</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Metrics</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Source</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Action</div>\n </div>\n <div *ngFor=\"let cohort of manageCohorts; trackBy: trackById\" class=\"agents-table-row agents-table-4col\">\n <div class=\"agent-cell-name-wrap\">\n <div class=\"agent-cell-name\">{{ cohort.cohortName || cohort.name }}</div>\n <div class=\"agent-cell-desc\">{{ cohort.cohortDescription || cohort.description || '' }}</div>\n </div>\n <div class=\"agent-cell-metrics\">{{ cohort.metricsAdded || cohort.metricAdded || cohort.metrics?.length || 0 }}</div>\n <div class=\"agent-cell-source\">{{ cohort.source?.join(', ') || '\u2013' }}</div>\n <div class=\"agent-cell-action\">\n <button (click)=\"deleteCohort(cohort.cohortId || cohort.id || cohort._id)\" class=\"agent-delete-btn\">Delete</button>\n </div>\n </div>\n <div *ngIf=\"manageCohorts.length === 0\" class=\"manage-no-results\">No cohorts found.</div>\n </div>\n\n <!-- Manage pagination -->\n <lib-pagination *ngIf=\"manageTotal > 0\" [itemsPerPage]=\"managePerPage\" [currentPage]=\"managePage\" [totalItems]=\"manageTotal\"\n [paginationSizes]=\"managePaginationSizes\" [pageSize]=\"managePerPage\" (pageChange)=\"onManagePageChange($event)\"\n (pageSizeChange)=\"onManagePageSizeChange($event)\"></lib-pagination>\n </ng-container>\n\n </div>\n</div>\n\n<!-- \u2550\u2550\u2550 FILTERS DRAWER \u2550\u2550\u2550 -->\n<div class=\"drawer-overlay\" *ngIf=\"drawerOpen\" (click)=\"closeFilterDrawer()\"></div>\n<div class=\"af-drawer\" *ngIf=\"drawerOpen\">\n <div class=\"drawer-header\">\n <span class=\"drawer-header-title\">Filters</span>\n <button (click)=\"closeFilterDrawer()\" class=\"drawer-close-btn\">\u00D7</button>\n </div>\n <div class=\"drawer-body\">\n <p class=\"drawer-placeholder-text\">Filter configuration coming soon. Uses the same filter APIs as the existing audio pages.</p>\n </div>\n <div class=\"af-footer\">\n <button class=\"af-cancel\" (click)=\"closeFilterDrawer()\">Close</button>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.echo-page{padding:20px 24px;background-color:#f4f6fa}.conversations-section{background:#fff;border-radius:10px;padding:16px;margin-top:8px}.conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;overflow:hidden;background:#fff}.conv-header{padding:14px 20px;display:flex;align-items:center;gap:8px;cursor:pointer;transition:background .15s}.conv-header:hover{background:#f8fafc}.conv-chevron{width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:transform .22s ease}.conv-chevron.open{transform:rotate(180deg)}.conv-id{font-size:13px;font-weight:600;color:#0ea5e9;border-radius:4px;padding:2px 8px}.meta-tag{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:24px;font-size:12px;font-weight:500;border:1px solid #e8edf3;background:#f8fafc;color:#344054;white-space:nowrap}.meta-tag.purple{background:#f0f4ff;color:#1a73e8;border-color:#d0e0ff}.meta-tag.brand{font-weight:600}.conv-tabs{display:flex;border-bottom:1px solid #e8edf3;padding:0 20px}.conv-tab-btn{padding:10px 16px;font-size:13px;font-weight:600;border:none;background:transparent;cursor:pointer;color:#667085;border-bottom:2px solid transparent;transition:all .15s;margin-bottom:-1px}.conv-tab-btn.active{color:#00a3ff;border-bottom-color:#00a3ff}.transcript-content .transcript-section{margin-bottom:20px}.transcript-content .transcript-section:last-child{margin-bottom:0}.transcript-content .transcript-section-title{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:#344054;margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid #f0f4ff}.transcript-content .transcript-summary-text,.summary-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.detail-conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;background:#fff;overflow:hidden}.detail-conv-card .conv-header{padding:12px 16px}.detail-conv-card .conv-tabs{padding:0 16px}.detail-conv-card .echo-player{padding:10px 16px}.conv-body-expanded{border-top:1px solid #e8edf3}.echo-player{display:flex;align-items:center;gap:12px;padding:12px 20px;background:#f2f4f7;border-bottom:1px solid #e8edf3}.echo-play-btn{width:36px;height:36px;min-width:36px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s;position:relative}.echo-play-btn:hover{background:#0087d5}.echo-play-btn.playing{animation:pulse-heartbeat 1.4s ease-in-out infinite}.echo-play-btn.playing:before,.echo-play-btn.playing:after{content:\"\";position:absolute;inset:0;border-radius:50%;border:2px solid #00A3FF;animation:pulse-ring 1.4s ease-out infinite}.echo-play-btn.playing:after{animation-delay:.7s}@keyframes pulse-heartbeat{0%,to{transform:scale(1)}15%{transform:scale(1.08)}30%{transform:scale(1)}45%{transform:scale(1.05)}60%{transform:scale(1)}}@keyframes pulse-ring{0%{transform:scale(1);opacity:.6}to{transform:scale(1.8);opacity:0}}.echo-waveform{flex:1;display:flex;align-items:center;gap:1.5px;height:40px;cursor:pointer}.echo-wf-bar{width:2px;min-width:2px;border-radius:2px;min-height:3px;background:#cbd5e1;transition:background .15s}.echo-wf-bar.played{background:#00a3ff}.wf-playing .echo-wf-bar.played{transform-origin:center}.wf-playing .echo-wf-bar.played:nth-child(3n){animation:wf-eq1 .45s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+1){animation:wf-eq2 .55s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+2){animation:wf-eq3 .35s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(5n){animation-delay:.1s}.wf-playing .echo-wf-bar.played:nth-child(7n){animation-delay:.2s}.wf-playing .echo-wf-bar.played:nth-child(11n){animation-delay:.05s}@keyframes wf-eq1{0%{transform:scaleY(1)}50%{transform:scaleY(.6)}to{transform:scaleY(1.1)}}@keyframes wf-eq2{0%{transform:scaleY(.7)}to{transform:scaleY(1.15)}}@keyframes wf-eq3{0%{transform:scaleY(1.1)}50%{transform:scaleY(.5)}to{transform:scaleY(.9)}}.echo-time{font-size:13px;font-weight:600;color:#344054;flex-shrink:0;min-width:50px;text-align:right}.btn{padding:8px 16px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:all .15s}.btn-primary{background:#1a73e8;color:#fff}.btn-primary:hover{background:#135cbc}.analytics-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}@media (max-width: 992px){.analytics-grid{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.analytics-grid{grid-template-columns:1fr!important}}.analytics-card{background:#fff;border:1px solid #e8edf3;border-radius:10px;cursor:pointer;overflow:hidden;transition:box-shadow .2s,transform .2s,border-color .2s}.analytics-card:hover{box-shadow:0 4px 12px #00000014;transform:translateY(-2px);border-color:#00a3ff}.analytics-card:hover .analytics-hover-link{opacity:1}.analytics-card-header{padding:14px 16px;border-bottom:1px solid #e8edf3;background:linear-gradient(135deg,#f8fafc,#fff)}.analytics-hover-link{font-size:11px;color:#00a3ff;font-weight:700;opacity:0;transition:opacity .2s}.btn-outline{background:#fff;border:1px solid #D0D5DD;color:#344054}.btn-outline:hover{border-color:#1a73e8;color:#1a73e8}.btn-success{background:#10b981;color:#fff}.section-label{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;margin-bottom:8px;text-transform:uppercase}.echo-card{background:#fff;border-radius:10px;border:1px solid #e8edf3;overflow:hidden}.echo-card-header{padding:14px 20px;border-bottom:1px solid #e8edf3;display:flex;align-items:center;gap:8px}.echo-card-title{font-size:16px;font-weight:600;color:#1a2b4b}.echo-card-body{padding:20px}.metric-cards-dynamic{display:grid;gap:16px;margin-bottom:24px;align-items:stretch}.metric-card-dynamic{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:20px;display:flex;flex-direction:column;max-height:420px;cursor:pointer;transition:border-color .2s,box-shadow .2s}.metric-card-dynamic:hover{border-color:#00a3ff;box-shadow:0 2px 8px #00a3ff14}.metric-card-content{flex:1;min-height:0;overflow-y:auto;padding-right:6px}.metric-card-content::-webkit-scrollbar{width:4px}.metric-card-content::-webkit-scrollbar-track{background:transparent}.metric-card-content::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:4px}.metric-card-title{font-size:14px;font-weight:700;color:#1a2b4b;margin-bottom:4px;line-height:1.3}.metric-card-subtitle{font-size:11px;color:#667085;margin-bottom:12px;font-weight:500}.metric-info-icon{position:relative;color:#98a2b3;cursor:pointer;flex-shrink:0;padding:2px;transition:color .15s}.metric-info-icon:hover{color:#00a3ff}.metric-info-icon:hover .metric-info-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.metric-info-tooltip{position:absolute;top:calc(100% + 6px);right:0;z-index:100;min-width:200px;max-width:260px;padding:10px 12px;background:#1a2b4b;color:#fff;font-size:11.5px;line-height:1.5;border-radius:8px;box-shadow:0 4px 16px #0000002e;opacity:0;visibility:hidden;transform:translateY(-4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none}.metric-info-tooltip:before{content:\"\";position:absolute;top:-5px;right:6px;width:10px;height:10px;background:#1a2b4b;transform:rotate(45deg);border-radius:2px}.metric-bool-row{margin-bottom:10px;cursor:pointer}.metric-dot{width:7px;height:7px;border-radius:50%;background:#00a3ff;flex-shrink:0}.metric-score{font-weight:700;font-size:15px}.metric-status-badge{font-size:10px;font-weight:700;padding:3px 10px;border-radius:20px;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;flex-shrink:0}.metric-card-desc{font-size:13px;color:#475467;line-height:1.6;margin:12px 0 8px}.metric-card-short-desc{font-size:12px;color:#98a2b3;font-style:italic;line-height:1.5;margin:4px 0 0}.metric-count{font-size:11px;color:#667085;min-width:20px;text-align:right;font-weight:500}.metric-progress-track{height:6px;border-radius:4px;background:#e2e8f2;overflow:hidden}.metric-progress-fill{height:100%;background:#00a3ff;border-radius:4px;transition:width .5s ease}.funnel-chart{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:4px 0}.bbt-wrap{display:flex;flex-direction:column}.bbt-row{display:grid;grid-template-columns:140px 1fr 50px;align-items:center;padding:12px 14px;border-bottom:1px solid #F1F5F9;transition:background .15s}.bbt-row:last-child{border-bottom:none}.bbt-row:hover{background:#f8fafc}.bbt-row:nth-child(2n){background:#f8fafc}.bbt-row:nth-child(2n):hover{background:#eff6ff}.bbt-brand{font-size:13px;font-weight:700;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bbt-chips{display:flex;flex-wrap:nowrap;gap:6px;overflow:hidden;min-width:0}.bbt-chip{padding:3px 12px;border-radius:999px;background:#fff;border:1px solid #BAE6FD;color:#0284c7;font-size:12px;font-weight:500;white-space:nowrap;flex-shrink:0}.bbt-chip--more{background:#e9f4fe;border-color:#7dd3fc;color:#0369a1;font-weight:600;cursor:pointer}.bbt-float-tooltip{position:fixed;transform:translate(-50%,-100%);background:#1f2937;color:#fff;padding:6px 10px;border-radius:6px;box-shadow:0 6px 18px #0f172a38;display:flex;flex-direction:column;gap:2px;max-width:220px;width:max-content;font-size:11px;font-weight:500;line-height:1.35;text-align:left;pointer-events:none;z-index:9999}.bbt-float-tooltip:after{content:\"\";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#1f2937}.bbt-chip-tooltip-item{display:block;white-space:normal;word-break:break-word}.bbt-count{font-size:14px;font-weight:500;color:#94a3b8;text-align:right}.metric-card-dynamic--wide{grid-column:span 2}@media (max-width: 992px){.metric-card-dynamic--wide{grid-column:span 1}}.bbb-wrap{display:grid;grid-template-columns:minmax(170px,1fr) 1.4fr minmax(170px,1fr);gap:18px;align-items:center}.bbb-list{border-right:1px solid #E4E7EC;padding-right:12px;max-height:280px;overflow-y:auto}.bbb-list-row{padding:10px 12px;border-radius:6px;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbb-list-row:hover{background:#f8fafc}.bbb-list-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbb-list-label{display:inline-block;max-width:100%;white-space:normal;word-break:break-word;line-height:1.3}.bbb-pie-col{display:flex;align-items:center;justify-content:center;padding:8px 0}.bbb-pie-wrap{width:190px;height:190px;max-width:100%}.bbb-pie{width:100%;height:100%;display:block;filter:drop-shadow(0 2px 6px rgba(14,165,233,.12))}.bbb-pie path{cursor:pointer;transition:opacity .15s,transform .15s;transform-origin:50px 50px}.bbb-pie path:hover{opacity:.9}.bbb-pie-slice--active{opacity:1!important;transform:scale(1.04)}.bbb-legend{display:flex;flex-direction:column;gap:6px}.bbb-legend-row{display:flex;align-items:center;gap:8px;padding:3px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbb-legend-row:hover{background:#f8fafc}.bbb-legend-row--active{background:#e9f4fe}.bbb-legend-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.bbb-legend-label{flex:1}.bbb-legend-pct{font-weight:700;color:#101828}.bbc-wrap{display:grid;grid-template-columns:minmax(160px,1fr) 1.4fr;gap:18px;align-items:stretch}.bbc-keyword-list{border-right:1px solid #E4E7EC;padding-right:14px;max-height:280px;overflow-y:auto}.bbc-keyword-row{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-radius:0;border-bottom:1px solid #EAECF0;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbc-keyword-row:last-child{border-bottom:none}.bbc-keyword-row:hover{background:#f8fafc}.bbc-keyword-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbc-keyword-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-right:10px}.bbc-keyword-count{color:#667085;font-weight:500;font-size:13px}.bbc-keyword-row--active .bbc-keyword-count{color:#0077e6}.bbc-chart-side{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;padding:8px 4px}.bbc-donut-wrap{position:relative;width:150px;height:150px}.bbc-donut{width:100%;height:100%}.bbc-donut-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none}.bbc-donut-pct{font-size:20px;font-weight:700;color:#101828;line-height:1}.bbc-donut-cap{font-size:11px;color:#667085;margin-top:3px}.bbc-legend{width:100%;display:flex;flex-direction:column;gap:6px}.bbc-legend-row{display:flex;align-items:center;gap:8px;padding:4px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbc-legend-row:hover{background:#f8fafc}.bbc-legend-row--active{background:#e9f4fe}.bbc-legend-dot{width:10px;height:10px;border-radius:50%;border:2px solid #8AD8FF;background:transparent;flex-shrink:0}.bbc-legend-label{flex:1}.bbc-legend-pct{font-weight:600;color:#0077e6}.funnel-stage{width:100%;display:flex;justify-content:flex-start;cursor:pointer}.funnel-bar{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-radius:6px;min-height:36px;overflow:visible;transition:width .5s ease,opacity .2s}.funnel-bar:hover{opacity:.85}.funnel-label-wrap{position:relative;flex:1;min-width:0;overflow:visible}.funnel-label-wrap .funnel-tooltip{position:absolute;bottom:calc(100% + 10px);left:0;padding:6px 10px;background:#1a2b4b;color:#fff;font-size:11.5px;font-weight:600;border-radius:6px;white-space:nowrap;box-shadow:0 4px 12px #0000002e;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none;z-index:100}.funnel-label-wrap .funnel-tooltip:after{content:\"\";position:absolute;top:100%;left:12px;width:8px;height:8px;background:#1a2b4b;transform:translateY(-50%) rotate(45deg);border-radius:1px}.funnel-label-wrap:hover .funnel-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.funnel-label{font-size:12px;font-weight:600;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.funnel-value{font-size:13px;font-weight:700;color:#fff;flex-shrink:0;margin-left:8px}.numeric-stat-strip{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:12px;margin-bottom:14px}.numeric-stat-tile{background:#fff;border:1px solid #EAECF0;border-left:3px solid #CBD5E1;border-radius:8px;padding:14px 16px;min-width:0}.numeric-stat-label{font-size:10px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:#667085;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-stat-value{font-size:26px;font-weight:800;line-height:1;margin-bottom:8px}.numeric-stat-max{font-size:14px;font-weight:600;color:#98a2b3;margin-left:2px}.numeric-stat-sub{font-size:11px;color:#667085;line-height:1.4;white-space:normal;word-break:break-word}.numeric-score-row{padding:10px 0;border-bottom:1px solid #f0f4ff;cursor:pointer;transition:background .15s}.numeric-score-row:last-child{border-bottom:none}.numeric-score-row:hover{background:#f8fafc;margin:0 -12px;padding:10px 12px;border-radius:6px}.metric-big-number{font-weight:800;font-size:36px;color:#00a3ff;line-height:1}.metric-avg-label{font-size:12px;color:#667085;margin-left:4px}@media (max-width: 992px){.metric-cards-dynamic{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.metric-cards-dynamic{grid-template-columns:1fr!important}}.subjective-wrap{cursor:pointer;max-height:120px;overflow:hidden}.subjective-row{padding:4px 0;font-size:12px;color:#475467;border-bottom:1px solid #f0f4ff;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.metric-card-name{font-size:14px;font-weight:600;color:#1a2b4b}.agents-table-header{display:grid;align-items:center;padding:10px 20px;border-bottom:1px solid #e8edf3;background:#f8fafc}.agents-table-cell{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;text-transform:uppercase}.agents-table-row{display:grid;align-items:center;padding:14px 20px;border-bottom:1px solid #e8edf3;cursor:pointer;transition:background .15s}.agents-table-row:hover{background:#f8fafc}.agents-table-row:last-child{border-bottom:none}.status-dot{width:8px;height:8px;border-radius:50%}.status-dot.active{background:#10b981}.status-dot.pending{background:#f59e0b}.status-dot.paused{background:#98a2b3}.tango-ai-header{display:flex;flex-direction:column;align-items:center;gap:10px;padding:20px 0}.tango-ai-logo{width:52px;height:52px;border-radius:16px;background:linear-gradient(135deg,#794fd9,#33b1f7);display:flex;align-items:center;justify-content:center;box-shadow:0 4px 16px #794fd933}.tango-ai-title{font-size:22px;font-weight:800;color:#1a2b4b;line-height:1.2}.tango-ai-subtitle{font-size:13px;color:#667085;margin-top:4px}.echo-search-card{display:flex;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:10px 12px 10px 20px;margin-bottom:20px;box-shadow:0 1px 2px #1018280d}.echo-search-input{flex:1;border:none;outline:none;font-size:14px;color:#101828}.echo-search-input::placeholder{color:#98a2b3}.echo-search-slash{width:28px;height:28px;border-radius:50%;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:600;color:#667085;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;margin-right:6px}.echo-search-send{width:32px;height:32px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:background .2s}.echo-search-send:hover{background:#0087d5}.echo-search-send:disabled{opacity:.5;cursor:not-allowed}.echo-ai-response{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:16px 20px;margin-bottom:16px}.echo-ai-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.echo-conv-count{font-size:14px;font-weight:700;color:#00a3ff;margin-bottom:16px}.typing{display:flex;gap:4px;align-items:center;padding:4px 0}.typing-dot{width:6px;height:6px;border-radius:50%;background:#00a3ff;animation:pulse 1.2s ease-in-out infinite}.typing-dot:nth-child(2){animation-delay:.2s}.typing-dot:nth-child(3){animation-delay:.4s}@keyframes pulse{0%,to{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}:host ::ng-deep lib-pagination{margin-top:16px;display:block}.agent-dropdown-wrap{position:relative}.agent-dropdown-trigger{display:flex;align-items:center;gap:8px;padding:7px 12px;border:1.5px solid #D0D5DD;border-radius:8px;background:#fff;cursor:pointer;max-width:280px;transition:border-color .15s}.agent-dropdown-trigger:hover{border-color:#00a3ff}.agent-dropdown-menu{position:absolute;top:calc(100% + 6px);right:0;background:#fff;border:1px solid #D0D5DD;border-radius:10px;box-shadow:0 8px 24px #0000001f;width:300px;z-index:300;overflow:hidden}.agent-dd-header{padding:8px 14px;font-size:11px;font-weight:600;color:#98a2b3;letter-spacing:.5px;border-bottom:1px solid #e8edf3;text-transform:uppercase}.agent-dd-item{display:flex;align-items:center;gap:10px;padding:10px 14px;cursor:pointer;transition:background .1s}.agent-dd-item:hover{background:#f8fafc}.agent-dd-item.selected{background:#f0f4ff}.agent-dd-name{font-size:13px;font-weight:600;color:#344054;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-dd-meta{font-size:12px;color:#98a2b3;margin-top:1px}.fbar-pill{display:flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;font-size:13px;font-weight:600;color:#344054;cursor:pointer;transition:all .15s;white-space:nowrap}.fbar-pill:hover,.fbar-pill.active{border-color:#1a73e8;color:#1a73e8;background:#f0f4ff}.echo-sub-header{display:flex;align-items:center;padding:12px 0 16px;gap:10px}.btn-back{background:none;border:none;cursor:pointer;display:flex;align-items:center;color:#1a73e8;padding:4px 6px;border-radius:8px}.sub-header-title{font-size:15px;font-weight:600;color:#1a2b4b}.drawer-overlay{position:fixed;inset:0;background:#0000004d;z-index:200}.af-drawer{position:fixed;top:0;right:0;bottom:0;width:380px;max-width:95vw;background:#fff;z-index:201;display:flex;flex-direction:column;box-shadow:-8px 0 40px #00000026;animation:slideInRight .25s ease-out;overflow:hidden}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}.af-footer{padding:14px 16px;border-top:1px solid #e8edf3;display:flex;align-items:center;justify-content:flex-end;background:#fff}.af-cancel{padding:9px 20px;border-radius:8px;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:500;cursor:pointer;color:#344054}@media (max-width: 768px){.metric-cards-grid{grid-template-columns:1fr}.agents-table-header,.agents-table-row{grid-template-columns:1fr 80px}}.flex-spacer{flex:1}.text-center{text-align:center}.echo-empty-state{text-align:center;padding:40px;color:#94a3b8}.echo-empty-state--muted{text-align:center;padding:40px;color:#667085}.echo-empty-state--sm{text-align:center;padding:40px;color:#94a3b8;font-size:13px}.echo-empty-state--muted-sm{text-align:center;padding:40px;color:#667085;font-size:13px}.echo-empty-state--compact{text-align:center;padding:32px;color:#667085;font-size:13px}.echo-nodata-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 20px;text-align:center}.echo-nodata-img{width:120px;height:auto;margin-bottom:16px;opacity:.85}.echo-nodata-title{font-size:15px;font-weight:700;color:#1a2b4b;margin-bottom:6px}.echo-nodata-sub{font-size:13px;color:#667085;line-height:1.5}.tango-ai-header-text{text-align:center}.conv-header-body{flex:1;min-width:0}.conv-meta-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:4px}.meta-tag--duration{background:#ede9fe;color:#8b5cf6;border-color:#ddd6fe;font-weight:700}.conv-description{font-size:12.5px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.conv-body-padding{padding:14px 16px}.ai-insights-section{margin-top:16px}.ai-insights-label{font-size:11px;font-weight:700;color:#667085;letter-spacing:.5px;text-transform:uppercase;margin-bottom:10px}.ai-insight-row{display:flex;align-items:flex-start;gap:8px;margin-bottom:8px}.ai-insight-dot{width:6px;height:6px;border-radius:50%;margin-top:5px;flex-shrink:0}.ai-insight-text{font-size:13px;color:#475467;line-height:1.5}.analytics-overview-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.analytics-overview-title{font-size:17px;font-weight:700;color:#1a2b4b}.analytics-overview-subtitle{font-size:12px;color:#667085}.echo-search-wrap{width:220px;display:flex;align-items:center;gap:8px;border:1px solid #D0D5DD;border-radius:8px;padding:6px 12px;background:#fff}.echo-search-wrap--wide{width:280px;display:flex;align-items:center;gap:8px;border:1px solid #E2E8F2;border-radius:8px;padding:6px 12px;background:#fff}.echo-inline-input{flex:1;border:none;background:transparent;font-size:13px;color:#344054;outline:none;min-width:0}.echo-inline-input--small{flex:1;border:none;background:transparent;font-size:12px;color:#344054;outline:none;min-width:0}.analytics-card-top-row{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:8px}.analytics-card-name{font-size:13.5px;font-weight:700;color:#1a2b4b;flex:1;padding-right:8px;line-height:1.3}.analytics-card-badge-active{font-size:9px;font-weight:700;padding:2px 8px;border-radius:20px;background:#d1fae5;color:#065f46;text-transform:uppercase;letter-spacing:.5px;flex-shrink:0}.analytics-card-spacer{padding:8px 14px}.analytics-card-footer{padding:8px 14px;border-top:1px solid #e8edf3;display:flex;justify-content:flex-end}.detail-header-bar{display:flex;align-items:center;gap:12px;margin-bottom:20px;padding:14px 20px;background:#fff;border-radius:10px;border:1px solid #e8edf3}.detail-back-btn{background:none;border:none;cursor:pointer;color:#00a3ff;font-size:18px;padding:0}.detail-header-title{font-size:16px;font-weight:700;color:#1a2b4b}.detail-header-conv-count{font-size:13px;color:#667085}.cohort-dd-dot{width:8px;height:8px;border-radius:50%;background:#10b981;flex-shrink:0}.cohort-dd-trigger-name{font-size:13px;font-weight:600;color:#1a2b4b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cohort-dd-search-wrap{padding:8px 10px;border-bottom:1px solid #e8edf3}.cohort-dd-search-inner{display:flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid #D0D5DD;border-radius:6px;background:#fff}.cohort-dd-scroll{max-height:240px;overflow-y:auto}.cohort-dd-item-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.cohort-dd-item-body{flex:1;min-width:0}.cohort-dd-no-results{padding:16px;text-align:center;font-size:12px;color:#667085}.cohort-dd-backdrop{position:fixed;inset:0;z-index:299}.metric-card-header-row{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.metric-card-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.metric-row-flex{display:flex;align-items:center;gap:6px;margin-bottom:4px}.metric-row-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.metric-row-label{font-size:13px;color:#344054;flex:1}.metric-score--teal{color:#00a3ff}.numeric-row-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.numeric-row-name{font-size:13px;color:#344054;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-row-value{font-size:15px;font-weight:800;color:#00a3ff;flex-shrink:0;margin-left:8px}.numeric-row-max{font-size:12px;font-weight:600;color:#98a2b3}.numeric-progress-track{position:relative;height:5px;border-radius:4px;background:#e2e8f2}.numeric-progress-fill{position:absolute;left:0;top:0;height:100%;border-radius:4px;background:linear-gradient(90deg,#00a3ff,#33b1f7)}.pitch-keyword-count{font-size:11px;color:#667085;margin-bottom:8px}.pitch-row-label{font-size:12.5px;color:#344054;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pitch-row-desc{font-size:12px;font-weight:700;color:#667085;flex-shrink:0}.funnel-value-count{opacity:.8;font-weight:500}.detail-conv-section-header{padding:16px 20px;display:flex;align-items:center;gap:8px;background:#fff;border-radius:10px;border:1px solid #e8edf3;margin-bottom:12px}.detail-conv-section-title{font-size:15px;font-weight:700;color:#1a2b4b}.detail-content-split{display:flex}.detail-content-left{flex:3;padding:14px 20px;min-width:0;border-right:1px solid #e8edf3}.detail-content-right{flex:1;min-width:220px;max-width:350px;padding:16px;overflow-y:auto;max-height:500px}.detail-meta-row{display:flex;align-items:center;gap:5px;flex:1;min-width:0;flex-wrap:wrap}.summary-text--prewrap{white-space:pre-wrap}.metrics-panel-label{font-size:10px;font-weight:700;color:#00a3ff;letter-spacing:.5px;text-transform:uppercase;margin-bottom:12px}.metric-item-wrap{margin-bottom:8px;padding:6px 0;border-bottom:1px solid #f0f4ff}.metric-single-row{display:flex;align-items:center;gap:8px}.metric-single-name{font-size:12px;font-weight:600;color:#344054;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-single-value{font-size:12px;font-weight:700;flex-shrink:0}.metric-multi-header{font-size:11px;font-weight:700;color:#344054;margin-bottom:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-row{display:flex;align-items:center;gap:8px;padding:3px 0}.metric-multi-name{font-size:11px;color:#667085;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-value{font-size:11px;font-weight:700;flex-shrink:0}.metric-fallback-row{display:flex;justify-content:space-between;margin-bottom:6px}.metric-fallback-label{font-size:12px;color:#667085}.metric-fallback-value{font-size:12px;font-weight:600;color:#344054}.metric-detail-loading{font-size:11px;color:#667085}.manage-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.manage-title{font-family:Outfit,sans-serif;font-weight:700;font-size:17px}.manage-subtitle{font-size:12px;color:#94a3b8}.manage-search-input{flex:1;border:none;background:transparent;font-size:13px;font-family:Nunito Sans,sans-serif;color:#0f172a;outline:none;min-width:0}.agents-table-4col{grid-template-columns:minmax(0,1fr) 120px 120px 80px}.agents-table-cell--center{text-align:center}.agent-cell-name-wrap{min-width:0}.agent-cell-name{font-family:Outfit,sans-serif;font-weight:700;font-size:13.5px;color:#0f172a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-desc{font-size:11px;color:#94a3b8;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-metrics{text-align:center;font-family:Outfit,sans-serif;font-weight:700;font-size:13px;color:#0f172a}.agent-cell-source{text-align:center;font-size:11.5px;color:#334155;font-weight:600}.agent-cell-action{text-align:center}.agent-delete-btn{background:none;border:none;cursor:pointer;color:#ef4444;font-size:11px;font-weight:700}.manage-no-results{padding:32px;text-align:center;color:#94a3b8;font-size:13px}.drawer-header{padding:16px;border-bottom:1px solid #E2E8F2;display:flex;align-items:center;justify-content:space-between}.drawer-header-title{font-family:Outfit,sans-serif;font-weight:700;font-size:15px}.drawer-close-btn{background:none;border:none;cursor:pointer;color:#94a3b8;font-size:18px}.drawer-body{padding:16px;flex:1;overflow-y:auto}.drawer-placeholder-text{font-size:13px;color:#94a3b8}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }] });
|
|
1125
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: TangoEchoComponent, selector: "lib-tango-echo", ngImport: i0, template: "<div class=\"echo-page\">\n <!-- Floating tooltip for BOOLEAN_BASKET_TABLE overflow chips -->\n <div class=\"bbt-float-tooltip\"\n *ngIf=\"bbtTooltip.visible\"\n [style.left.px]=\"bbtTooltip.x\"\n [style.top.px]=\"bbtTooltip.y\">\n <span *ngFor=\"let ov of bbtTooltip.items\" class=\"bbt-chip-tooltip-item\">{{ ov }}</span>\n </div>\n <div class=\"echo-content\">\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CONVERSATIONS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'conversations'\">\n\n <!-- Tango AI Header -->\n <div class=\"tango-ai-header\">\n <div class=\"tango-ai-logo\">\n <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"M12 2l2.09 6.26L20 10l-5.91 1.74L12 18l-2.09-6.26L4 10l5.91-1.74L12 2z\"/></svg>\n </div>\n <div class=\"tango-ai-header-text\">\n <div class=\"tango-ai-title\">Tango AI</div>\n <div class=\"tango-ai-subtitle\">Analyse conversations, stores & staff performance</div>\n </div>\n </div>\n\n <!-- Search Card -->\n <div class=\"echo-search-card\">\n <input type=\"text\" class=\"echo-search-input\" placeholder=\"Ask anything... 'Which stores are not performing well?'\" [(ngModel)]=\"convSearchQuery\" (keyup.enter)=\"sendConvQuery()\">\n <button class=\"echo-search-send\" (click)=\"sendConvQuery()\" [disabled]=\"!convSearchQuery?.trim()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>\n </svg>\n </button>\n </div>\n\n <!-- AI Response -->\n <div class=\"echo-ai-response\" *ngIf=\"convAiLoading || convAiReply\">\n <div *ngIf=\"convAiLoading\" class=\"typing\">\n <span class=\"typing-dot\"></span><span class=\"typing-dot\"></span><span class=\"typing-dot\"></span>\n </div>\n <p *ngIf=\"!convAiLoading && convAiReply\" class=\"echo-ai-text\">{{ convAiReply }}</p>\n </div>\n\n <!-- Total count -->\n <div class=\"echo-conv-count\">{{ convTotal }} Conversations</div>\n\n <!-- Conversations list area -->\n <div class=\"conversations-section\">\n\n <!-- Loading -->\n <div *ngIf=\"convLoading\" class=\"echo-empty-state\">Loading conversations...</div>\n\n <!-- Conversation cards (dynamic from API \u2014 same pattern as transcript-list) -->\n <div *ngFor=\"let conv of conversations; trackBy: trackById\" class=\"conv-card\">\n <div class=\"conv-header\" (click)=\"toggleConvExpand(conv.audioId)\">\n <div class=\"conv-header-body\">\n <div class=\"conv-meta-row\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.userName\">{{ conv.userName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag meta-tag--duration\" *ngIf=\"conv.duration\">{{ conv.duration }}</span>\n </div>\n <div class=\"conv-description\">\n {{ conv.audioDescription || 'No description available' }}\n </div>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"expandedConvIds[conv.audioId]\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body (unified layout matching Agent Analysis design) -->\n <div *ngIf=\"expandedConvIds[conv.audioId]\" class=\"conv-body-expanded\">\n\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\">\n </div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Summary Content -->\n <div class=\"conv-body-padding\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No data -->\n <div *ngIf=\"!convLoading && conversations.length === 0\" class=\"echo-empty-state--sm\">No conversations found.</div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"convTotal > 0\" [itemsPerPage]=\"convPerPage\" [currentPage]=\"convPage\" [totalItems]=\"convTotal\"\n [paginationSizes]=\"convPaginationSizes\" [pageSize]=\"convPerPage\" (pageChange)=\"onConvPageChange($event)\"\n (pageSizeChange)=\"onConvPageSizeChange($event)\"></lib-pagination>\n </div> <!-- end conversations-section -->\n </ng-container>\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 AGENT ANALYSIS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'agentanalysis'\">\n\n <!-- \u2500\u2500 OVERVIEW: Agent Cards Grid \u2500\u2500 -->\n <ng-container *ngIf=\"!detailView\">\n <div class=\"analytics-overview-header\">\n <div>\n <div class=\"analytics-overview-title\">Analytics Overview</div>\n <div class=\"analytics-overview-subtitle\">{{ activeCohorts.length }} active agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"analysisSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input\">\n </div>\n </div>\n\n <div *ngIf=\"cohortList.length === 0\" class=\"echo-empty-state--muted\">Loading agents...</div>\n\n <div class=\"analytics-grid\" [style.grid-template-columns]=\"'repeat(' + Math.min(cohortList.length, 4) + ', 1fr)'\">\n <ng-container *ngFor=\"let cohort of cohortList; trackBy: trackById\">\n <div class=\"analytics-card\" *ngIf=\"!analysisSearch || (cohort.cohortName || cohort.name || '').toLowerCase().includes(analysisSearch.toLowerCase())\" (click)=\"selectCohortDetail(cohort)\">\n <div class=\"analytics-card-header\">\n <div class=\"analytics-card-top-row\">\n <div class=\"analytics-card-name\">{{ cohort.cohortName || cohort.name }}</div>\n <span class=\"analytics-card-badge-active\">Active</span>\n </div>\n <!-- metrics & stores badges hidden for now -->\n </div>\n <div class=\"analytics-card-spacer\"></div>\n <div class=\"analytics-card-footer\">\n <span class=\"analytics-hover-link\">View analytics \u2192</span>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- \u2500\u2500 DETAIL: Selected Cohort Metrics + Conversations \u2500\u2500 -->\n <ng-container *ngIf=\"detailView\">\n\n <!-- Header: \u2190 Back + Title + Conversations + Dropdown -->\n <div class=\"detail-header-bar\">\n <button class=\"detail-back-btn\" (click)=\"backToOverview()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>\n </button>\n <span class=\"detail-header-title\">{{ selectedCohortName }}</span>\n <span class=\"flex-spacer\"></span>\n <span class=\"detail-header-conv-count\">Total Conversations: {{ totalAudio }}</span>\n\n <!-- Cohort Dropdown -->\n <div class=\"agent-dropdown-wrap\">\n <div class=\"agent-dropdown-trigger\" (click)=\"toggleCohortDropdown()\">\n <div class=\"cohort-dd-dot\"></div>\n <span class=\"cohort-dd-trigger-name\">{{ selectedCohortName || 'Select Agent' }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2.5\" stroke-linecap=\"round\" [style.transform]=\"cohortDropdownOpen ? 'rotate(180deg)' : 'none'\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n <div class=\"agent-dropdown-menu\" *ngIf=\"cohortDropdownOpen\">\n <div class=\"cohort-dd-search-wrap\">\n <div class=\"cohort-dd-search-inner\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"cohortDropdownSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input--small\">\n </div>\n </div>\n <div class=\"cohort-dd-scroll\">\n <div *ngFor=\"let c of filteredDropdownCohorts; trackBy: trackById\" class=\"agent-dd-item\" [class.selected]=\"(c.cohortId || c.id || c._id) === selectedCohortId\" (click)=\"selectCohortFromDropdown(c)\">\n <div class=\"cohort-dd-item-dot\" [style.background]=\"c.metricsAdded > 0 ? '#10B981' : '#D0D5DD'\"></div>\n <div class=\"cohort-dd-item-body\">\n <div class=\"agent-dd-name\">{{ c.cohortName || c.name }}</div>\n <div class=\"agent-dd-meta\">{{ c.metricsAdded || 0 }} metrics</div>\n </div>\n <svg *ngIf=\"(c.cohortId || c.id || c._id) === selectedCohortId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#00A3FF\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n </div>\n <div *ngIf=\"filteredDropdownCohorts.length === 0\" class=\"cohort-dd-no-results\">No agents found</div>\n </div>\n </div>\n <div *ngIf=\"cohortDropdownOpen\" class=\"cohort-dd-backdrop\" (click)=\"closeCohortDropdown()\"></div>\n </div>\n </div>\n\n <!-- Loading -->\n <div *ngIf=\"cardsLoading\" class=\"echo-empty-state--muted\">Loading metrics...</div>\n\n <!-- Numeric scores \u2014 full-width stat strip above cards -->\n <div *ngIf=\"!cardsLoading && numericStripCard?.numericRows?.length\" class=\"numeric-stat-strip\">\n <div *ngFor=\"let row of numericStripCard.numericRows; let i = index\"\n class=\"numeric-stat-tile\"\n [style.border-left-color]=\"getNumericTileColor(i)\">\n <div class=\"numeric-stat-label\">{{ row.name }}</div>\n <div class=\"numeric-stat-value\" [style.color]=\"getNumericTileColor(i)\">\n {{ row.avg }}<span *ngIf=\"row.max !== null\" class=\"numeric-stat-max\">/{{ row.max }}</span>\n </div>\n <div class=\"numeric-stat-sub\" *ngIf=\"row.max !== null && row.min !== null\">\n scale {{ row.min }}\u2013{{ row.max }}{{ row.description ? ' \u00B7 ' + row.description : '' }}\n </div>\n </div>\n </div>\n\n <!-- Metric Cards (dynamic columns based on card count) -->\n <div *ngIf=\"!cardsLoading && nonNumericCards.length > 0\" class=\"metric-cards-dynamic\"\n [style.grid-template-columns]=\"'repeat(' + Math.min(nonNumericCards.length, 4) + ', 1fr)'\">\n <div *ngFor=\"let card of nonNumericCards; trackBy: trackById\" class=\"metric-card-dynamic\"\n [class.metric-card-dynamic--wide]=\"card.type === 'BOOLEAN_BASKET_BAR' || card.type === 'BOOLEAN_BASKET_TABLE'\">\n <!-- Card Header: Title + Status Badge + Info -->\n <div class=\"metric-card-header-row\">\n <div class=\"metric-card-title\">{{ card.name }}</div>\n <div class=\"metric-card-actions\">\n <span *ngIf=\"card.status\" class=\"metric-status-badge\"\n [style.background]=\"getStatusBadge(card.status).bg\"\n [style.color]=\"getStatusBadge(card.status).color\">{{ card.status }}</span>\n <button type=\"button\" class=\"metric-export-btn\"\n *ngIf=\"card.type === 'BOOLEAN_BASKET_TABLE'\"\n title=\"Export to Excel\"\n (click)=\"exportBbtCard(card)\"><span>Export</span> \n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><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>\n </button>\n <div class=\"metric-info-icon\" *ngIf=\"card.description\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>\n <div class=\"metric-info-tooltip\">\n <div>{{ card.description }}</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"metric-card-subtitle\" *ngIf=\"card.type !== 'NUMERIC_SCALAR' && card.type !== 'NUMERIC_ARRAY'\">{{ card.applicableCount ?? totalAudio }} conversations</div>\n\n <div class=\"metric-card-content\">\n <!-- BOOLEAN_BASKET_TABLE \u2014 brand rows with attribute chips + count -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_TABLE'\">\n <div class=\"bbt-wrap\">\n <div *ngFor=\"let row of card.tableRows\" class=\"bbt-row\">\n <div class=\"bbt-brand\" [title]=\"row.brand\">{{ row.brand }}</div>\n <div class=\"bbt-chips\">\n <span *ngFor=\"let chip of row.visibleChips\" class=\"bbt-chip\">{{ chip }}</span>\n <span *ngIf=\"row.overflowCount > 0\" class=\"bbt-chip bbt-chip--more\"\n (mouseenter)=\"showBbtTooltip($event, row.overflowChips)\"\n (mouseleave)=\"hideBbtTooltip()\">\n +{{ row.overflowCount }}\n </span>\n </div>\n <div class=\"bbt-count\">{{ row.count }}</div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET_BAR \u2014 category list + pie chart + legend -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_BAR'\">\n <div class=\"bbb-wrap\">\n <div class=\"bbb-list\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-list-row\"\n [class.bbb-list-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-list-label\" [title]=\"slice.label\">{{ slice.label }}</span>\n </div>\n </div>\n <div class=\"bbb-pie-col\">\n <div class=\"bbb-pie-wrap\">\n <svg class=\"bbb-pie\" viewBox=\"0 0 100 100\">\n <path *ngFor=\"let slice of card.pieSlices\"\n [attr.d]=\"slice.path\"\n [attr.fill]=\"slice.color\"\n stroke=\"#ffffff\"\n stroke-width=\"0.8\"\n [class.bbb-pie-slice--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\"></path>\n </svg>\n </div>\n </div>\n <div class=\"bbb-legend\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-legend-row\"\n [class.bbb-legend-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-legend-dot\" [style.background]=\"slice.color\"></span>\n <span class=\"bbb-legend-label\">{{ slice.label }}</span>\n <span class=\"bbb-legend-pct\">{{ slice.percent }}%</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Boolean_basket_chart \u2014 keyword list + sentiment donut -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_CHART'\">\n <div class=\"bbc-wrap\">\n <div class=\"bbc-keyword-list\">\n <div *ngFor=\"let row of card.keywordRows\"\n class=\"bbc-keyword-row\"\n [class.bbc-keyword-row--active]=\"card.selectedKeyword === row.label\"\n (click)=\"selectBasketKeyword(card, row)\">\n <span class=\"bbc-keyword-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"bbc-keyword-count\">{{ row.count }}</span>\n </div>\n </div>\n <div class=\"bbc-chart-side\">\n <div class=\"bbc-bar-list\">\n <div *ngFor=\"let slice of card.selectedSlices\"\n class=\"bbc-bar-row\"\n [class.bbc-bar-row--active]=\"card.selectedSentiment?.key === slice.key\"\n (click)=\"selectBasketSentiment(card, slice)\">\n <div class=\"bbc-bar-header\">\n <span class=\"bbc-bar-label\">\n <span class=\"bbc-bar-dot\" [style.background]=\"slice.color\"></span>\n {{ slice.label }}\n </span>\n <span class=\"bbc-bar-pct\">{{ slice.percent }}%</span>\n </div>\n <div class=\"bbc-bar-track\">\n <div class=\"bbc-bar-fill\"\n [style.width.%]=\"slice.percent\"\n [style.background]=\"slice.color\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 Funnel Chart (left-aligned) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && card.isFunnel\">\n <div class=\"funnel-chart\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"funnel-stage\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"funnel-bar\" [title]=\"row.label\"\n [style.width.%]=\"card.booleanRows[0]?.responses > 0 ? (row.responses / card.booleanRows[0].responses * 100) : 100\"\n [style.background]=\"getScoreColor(row.score)\">\n <span class=\"funnel-label-wrap\">\n <span class=\"funnel-label\">{{ row.label }}</span>\n </span>\n <span class=\"funnel-value\"> <span class=\"funnel-value-count\">{{ row.responses }}</span> ({{ row.score }})% </span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 rows with progress bars (non-funnel) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && !card.isFunnel\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n <span class=\"metric-row-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"metric-score metric-score--teal\">{{ row.score }}%</span>\n <span class=\"metric-count\">{{ row.responses }}</span>\n </div>\n <div class=\"metric-progress-track\">\n <div class=\"metric-progress-fill\" [style.width.%]=\"row.score\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n </div>\n </div>\n </ng-container>\n\n\n <!-- UNIQUE_PITCHES \u2014 pitch keywords tracker -->\n <ng-container *ngIf=\"card.type === 'UNIQUE_PITCHES'\">\n <div class=\"pitch-keyword-count\">{{ card.pitchRows?.length || 0 }} keywords</div>\n <div>\n <div *ngFor=\"let pitch of card.pitchRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick('', card.key)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"['#00A3FF','#10B981','#F59E0B','#EF4444','#8B5CF6','#EC4899','#06B6D4','#84CC16','#F97316','#6366F1'][i % 10]\"></div>\n <span class=\"pitch-row-label\">{{ pitch.id }}</span>\n <span class=\"pitch-row-desc\">{{ pitch.desc ? pitch.desc.slice(0, 60) : '\u2013' }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SUBJECTIVE -->\n <ng-container *ngIf=\"card.type === 'SUBJECTIVE' || card.type === 'SUBJECTIVE_COUNT'\">\n <div class=\"subjective-wrap\" (click)=\"onCardRowClick('', card.key)\">\n <div *ngFor=\"let row of card.subjectiveRows?.slice(0, 2)\" class=\"subjective-row\">\n \u2022 {{ row.reasoning || row.store_id }}\n </div>\n </div>\n </ng-container>\n </div><!-- end metric-card-content -->\n </div>\n </div>\n\n <!-- Full no-data state: no cards AND no conversations -->\n <div *ngIf=\"!cardsLoading && !detailLoading && cohortCards.length === 0 && detailPageConvs.length === 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No analysis data or conversations available for the selected date range and stores.</div>\n </div>\n\n <!-- \u2500\u2500 Conversations Section (show when cards exist OR conversations exist OR loading) \u2500\u2500 -->\n <div id=\"echoConversations\" class=\"conversations-section\" *ngIf=\"cardsLoading || detailLoading || cohortCards.length > 0 || detailPageConvs.length > 0\">\n <div class=\"detail-conv-section-header\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#344054\" stroke-width=\"1.8\"><path d=\"M20 2H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h11l5 3V4a2 2 0 0 0-2-2z\"/></svg>\n <span class=\"detail-conv-section-title\">Conversations</span>\n <span class=\"flex-spacer\"></span>\n <div class=\"detail-conv-search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input type=\"text\"\n class=\"detail-conv-search-input\"\n placeholder=\"Search conversations...\"\n [(ngModel)]=\"detailSearchValue\"\n (keyup.enter)=\"onDetailSearch()\">\n <button type=\"button\"\n class=\"detail-conv-search-clear\"\n *ngIf=\"detailSearchValue\"\n (click)=\"clearDetailSearch()\"\n title=\"Clear\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"detailLoading\" class=\"echo-empty-state--muted\">Loading...</div>\n\n <div *ngFor=\"let conv of detailPageConvs; trackBy: trackById\" class=\"detail-conv-card\">\n <!-- Conv header -->\n <div class=\"conv-header\" (click)=\"toggleDetailConv(conv.audioId); loadConvDetail(conv)\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <div class=\"detail-meta-row\">\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.time\">{{ conv.time }}</span>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"detailOpenId === conv.audioId\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body -->\n <div *ngIf=\"detailOpenId === conv.audioId\" class=\"conv-body-expanded\">\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\"></div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Tabs -->\n <div class=\"conv-tabs\">\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'summary'\" (click)=\"setConvTab(conv.audioId, 'summary', $event)\">Summary</button>\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'transcript'\" (click)=\"setConvTab(conv.audioId, 'transcript', $event)\">Transcript</button>\n </div>\n\n <!-- Content: Left (Summary/Transcript + AI Insights) + Right (Metrics) -->\n <div class=\"detail-content-split\">\n <!-- Left side -->\n <div class=\"detail-content-left\">\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'summary'\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'transcript'\">\n <p class=\"summary-text summary-text--prewrap\">{{ cleanTranscription(conv.conversationDetails?.transcription) || 'No transcript available' }}</p>\n </ng-container>\n </div>\n <!-- Right side: Metrics (only show values that have data) -->\n <div class=\"detail-content-right\">\n <div class=\"metrics-panel-label\">Metrics</div>\n <ng-container *ngIf=\"conv.metrics?.length\">\n <div *ngFor=\"let m of conv.metrics\" class=\"metric-item-wrap\">\n <!-- Single value: name + value on same row -->\n <ng-container *ngIf=\"m.value?.length === 1\">\n <div class=\"metric-single-row\">\n <span class=\"metric-single-name\" [title]=\"m.name\">{{ m.name }}</span>\n <span class=\"metric-single-value\" [style.color]=\"m.value[0].score !== null && m.value[0].score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(m.value[0]) }}\n </span>\n </div>\n </ng-container>\n <!-- Multiple values: header + rows -->\n <ng-container *ngIf=\"m.value?.length > 1\">\n <div class=\"metric-multi-header\" [title]=\"m.name\">{{ m.name }}</div>\n <ng-container *ngFor=\"let v of m.value\">\n <div *ngIf=\"(v.score !== null && v.score !== undefined) || (v.Total !== null && v.Total !== undefined) || (v.Avg !== null && v.Avg !== undefined) || (v.total !== null && v.total !== undefined) || (v.avg !== null && v.avg !== undefined) || (v.count !== null && v.count !== undefined)\" class=\"metric-multi-row\">\n <span class=\"metric-multi-name\" [title]=\"v.name\">{{ v.name }}</span>\n <span class=\"metric-multi-value\"\n [style.color]=\"v.score !== null && v.score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(v) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!conv.metrics?.length\">\n <div *ngIf=\"conv.storeName\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Store</span><span class=\"metric-fallback-value\">{{ conv.storeName }}</span></div>\n <div *ngIf=\"conv.duration\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Duration</span><span class=\"metric-fallback-value\">{{ conv.duration }}</span></div>\n </ng-container>\n <div *ngIf=\"conv._detailLoading\" class=\"metric-detail-loading\">Loading...</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No conversations for this filter (only when cards exist but convs are empty) -->\n <div *ngIf=\"!detailLoading && detailPageConvs.length === 0 && cohortCards.length > 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No conversations available for the selected filter.</div>\n </div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"detailTotal > 0\" [itemsPerPage]=\"detailPerPage\" [currentPage]=\"detailPage\" [totalItems]=\"detailTotal\"\n [paginationSizes]=\"detailPaginationSizes\" [pageSize]=\"detailPerPage\" (pageChange)=\"onDetailPageChange($event)\"\n (pageSizeChange)=\"onDetailPageSizeChange($event)\"></lib-pagination>\n </ng-container><!-- end detailView -->\n </ng-container><!-- end agentanalysis -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 MANAGE TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'manage'\">\n <div class=\"manage-header\">\n <div>\n <div class=\"manage-title\">Agents</div>\n <div class=\"manage-subtitle\">{{ manageTotal }} agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap--wide\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"manageSearch\" (ngModelChange)=\"onManageSearch()\" placeholder=\"Search agents...\" class=\"manage-search-input\">\n </div>\n </div>\n\n <div *ngIf=\"manageLoading\" class=\"echo-empty-state\">Loading agents...</div>\n\n <!-- Agents table -->\n <div *ngIf=\"!manageLoading\" class=\"echo-card\">\n <div class=\"agents-table-header agents-table-4col\">\n <div class=\"agents-table-cell\">Agent Name</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Metrics</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Source</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Action</div>\n </div>\n <div *ngFor=\"let cohort of manageCohorts; trackBy: trackById\" class=\"agents-table-row agents-table-4col\">\n <div class=\"agent-cell-name-wrap\">\n <div class=\"agent-cell-name\">{{ cohort.cohortName || cohort.name }}</div>\n <div class=\"agent-cell-desc\">{{ cohort.cohortDescription || cohort.description || '' }}</div>\n </div>\n <div class=\"agent-cell-metrics\">{{ cohort.metricsAdded || cohort.metricAdded || cohort.metrics?.length || 0 }}</div>\n <div class=\"agent-cell-source\">{{ cohort.source?.join(', ') || '\u2013' }}</div>\n <div class=\"agent-cell-action\">\n <button (click)=\"deleteCohort(cohort.cohortId || cohort.id || cohort._id)\" class=\"agent-delete-btn\">Delete</button>\n </div>\n </div>\n <div *ngIf=\"manageCohorts.length === 0\" class=\"manage-no-results\">No cohorts found.</div>\n </div>\n\n <!-- Manage pagination -->\n <lib-pagination *ngIf=\"manageTotal > 0\" [itemsPerPage]=\"managePerPage\" [currentPage]=\"managePage\" [totalItems]=\"manageTotal\"\n [paginationSizes]=\"managePaginationSizes\" [pageSize]=\"managePerPage\" (pageChange)=\"onManagePageChange($event)\"\n (pageSizeChange)=\"onManagePageSizeChange($event)\"></lib-pagination>\n </ng-container>\n\n </div>\n</div>\n\n<!-- \u2550\u2550\u2550 FILTERS DRAWER \u2550\u2550\u2550 -->\n<div class=\"drawer-overlay\" *ngIf=\"drawerOpen\" (click)=\"closeFilterDrawer()\"></div>\n<div class=\"af-drawer\" *ngIf=\"drawerOpen\">\n <div class=\"drawer-header\">\n <span class=\"drawer-header-title\">Filters</span>\n <button (click)=\"closeFilterDrawer()\" class=\"drawer-close-btn\">\u00D7</button>\n </div>\n <div class=\"drawer-body\">\n <p class=\"drawer-placeholder-text\">Filter configuration coming soon. Uses the same filter APIs as the existing audio pages.</p>\n </div>\n <div class=\"af-footer\">\n <button class=\"af-cancel\" (click)=\"closeFilterDrawer()\">Close</button>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.echo-page{padding:20px 24px;background-color:#f4f6fa}.conversations-section{background:#fff;border-radius:10px;padding:16px;margin-top:8px}.conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;overflow:hidden;background:#fff}.conv-header{padding:14px 20px;display:flex;align-items:center;gap:8px;cursor:pointer;transition:background .15s}.conv-header:hover{background:#f8fafc}.conv-chevron{width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:transform .22s ease}.conv-chevron.open{transform:rotate(180deg)}.conv-id{font-size:13px;font-weight:600;color:#0ea5e9;border-radius:4px;padding:2px 8px}.meta-tag{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:24px;font-size:12px;font-weight:500;border:1px solid #e8edf3;background:#f8fafc;color:#344054;white-space:nowrap}.meta-tag.purple{background:#f0f4ff;color:#1a73e8;border-color:#d0e0ff}.meta-tag.brand{font-weight:600}.conv-tabs{display:flex;border-bottom:1px solid #e8edf3;padding:0 20px}.conv-tab-btn{padding:10px 16px;font-size:13px;font-weight:600;border:none;background:transparent;cursor:pointer;color:#667085;border-bottom:2px solid transparent;transition:all .15s;margin-bottom:-1px}.conv-tab-btn.active{color:#00a3ff;border-bottom-color:#00a3ff}.transcript-content .transcript-section{margin-bottom:20px}.transcript-content .transcript-section:last-child{margin-bottom:0}.transcript-content .transcript-section-title{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:#344054;margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid #f0f4ff}.transcript-content .transcript-summary-text,.summary-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.detail-conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;background:#fff;overflow:hidden}.detail-conv-card .conv-header{padding:12px 16px}.detail-conv-card .conv-tabs{padding:0 16px}.detail-conv-card .echo-player{padding:10px 16px}.conv-body-expanded{border-top:1px solid #e8edf3}.echo-player{display:flex;align-items:center;gap:12px;padding:12px 20px;background:#f2f4f7;border-bottom:1px solid #e8edf3}.echo-play-btn{width:36px;height:36px;min-width:36px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s;position:relative}.echo-play-btn:hover{background:#0087d5}.echo-play-btn.playing{animation:pulse-heartbeat 1.4s ease-in-out infinite}.echo-play-btn.playing:before,.echo-play-btn.playing:after{content:\"\";position:absolute;inset:0;border-radius:50%;border:2px solid #00A3FF;animation:pulse-ring 1.4s ease-out infinite}.echo-play-btn.playing:after{animation-delay:.7s}@keyframes pulse-heartbeat{0%,to{transform:scale(1)}15%{transform:scale(1.08)}30%{transform:scale(1)}45%{transform:scale(1.05)}60%{transform:scale(1)}}@keyframes pulse-ring{0%{transform:scale(1);opacity:.6}to{transform:scale(1.8);opacity:0}}.echo-waveform{flex:1;display:flex;align-items:center;gap:1.5px;height:40px;cursor:pointer}.echo-wf-bar{width:2px;min-width:2px;border-radius:2px;min-height:3px;background:#cbd5e1;transition:background .15s}.echo-wf-bar.played{background:#00a3ff}.wf-playing .echo-wf-bar.played{transform-origin:center}.wf-playing .echo-wf-bar.played:nth-child(3n){animation:wf-eq1 .45s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+1){animation:wf-eq2 .55s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+2){animation:wf-eq3 .35s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(5n){animation-delay:.1s}.wf-playing .echo-wf-bar.played:nth-child(7n){animation-delay:.2s}.wf-playing .echo-wf-bar.played:nth-child(11n){animation-delay:.05s}@keyframes wf-eq1{0%{transform:scaleY(1)}50%{transform:scaleY(.6)}to{transform:scaleY(1.1)}}@keyframes wf-eq2{0%{transform:scaleY(.7)}to{transform:scaleY(1.15)}}@keyframes wf-eq3{0%{transform:scaleY(1.1)}50%{transform:scaleY(.5)}to{transform:scaleY(.9)}}.echo-time{font-size:13px;font-weight:600;color:#344054;flex-shrink:0;min-width:50px;text-align:right}.btn{padding:8px 16px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:all .15s}.btn-primary{background:#1a73e8;color:#fff}.btn-primary:hover{background:#135cbc}.analytics-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}@media (max-width: 992px){.analytics-grid{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.analytics-grid{grid-template-columns:1fr!important}}.analytics-card{background:#fff;border:1px solid #e8edf3;border-radius:10px;cursor:pointer;overflow:hidden;transition:box-shadow .2s,transform .2s,border-color .2s}.analytics-card:hover{box-shadow:0 4px 12px #00000014;transform:translateY(-2px);border-color:#00a3ff}.analytics-card:hover .analytics-hover-link{opacity:1}.analytics-card-header{padding:14px 16px;border-bottom:1px solid #e8edf3;background:linear-gradient(135deg,#f8fafc,#fff)}.analytics-hover-link{font-size:11px;color:#00a3ff;font-weight:700;opacity:0;transition:opacity .2s}.btn-outline{background:#fff;border:1px solid #D0D5DD;color:#344054}.btn-outline:hover{border-color:#1a73e8;color:#1a73e8}.btn-success{background:#10b981;color:#fff}.section-label{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;margin-bottom:8px;text-transform:uppercase}.echo-card{background:#fff;border-radius:10px;border:1px solid #e8edf3;overflow:hidden}.echo-card-header{padding:14px 20px;border-bottom:1px solid #e8edf3;display:flex;align-items:center;gap:8px}.echo-card-title{font-size:16px;font-weight:600;color:#1a2b4b}.echo-card-body{padding:20px}.metric-cards-dynamic{display:grid;gap:16px;margin-bottom:24px;align-items:stretch}.metric-card-dynamic{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:20px;display:flex;flex-direction:column;max-height:420px;cursor:pointer;transition:border-color .2s,box-shadow .2s}.metric-card-dynamic:hover{border-color:#00a3ff;box-shadow:0 2px 8px #00a3ff14}.metric-card-content{flex:1;min-height:0;overflow-y:auto;padding-right:6px}.metric-card-content::-webkit-scrollbar{width:4px}.metric-card-content::-webkit-scrollbar-track{background:transparent}.metric-card-content::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:4px}.metric-card-title{font-size:14px;font-weight:700;color:#1a2b4b;margin-bottom:4px;line-height:1.3}.metric-card-subtitle{font-size:11px;color:#667085;margin-bottom:12px;font-weight:500}.metric-info-icon{position:relative;color:#98a2b3;cursor:pointer;flex-shrink:0;padding:2px;transition:color .15s}.metric-info-icon:hover{color:#00a3ff}.metric-info-icon:hover .metric-info-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.metric-info-tooltip{position:absolute;top:calc(100% + 6px);right:0;z-index:100;min-width:200px;max-width:260px;padding:10px 12px;background:#1a2b4b;color:#fff;font-size:11.5px;line-height:1.5;border-radius:8px;box-shadow:0 4px 16px #0000002e;opacity:0;visibility:hidden;transform:translateY(-4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none}.metric-info-tooltip:before{content:\"\";position:absolute;top:-5px;right:6px;width:10px;height:10px;background:#1a2b4b;transform:rotate(45deg);border-radius:2px}.metric-bool-row{margin-bottom:10px;cursor:pointer}.metric-dot{width:7px;height:7px;border-radius:50%;background:#00a3ff;flex-shrink:0}.metric-score{font-weight:700;font-size:15px}.metric-status-badge{font-size:10px;font-weight:700;padding:3px 10px;border-radius:20px;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;flex-shrink:0}.metric-card-desc{font-size:13px;color:#475467;line-height:1.6;margin:12px 0 8px}.metric-card-short-desc{font-size:12px;color:#98a2b3;font-style:italic;line-height:1.5;margin:4px 0 0}.metric-count{font-size:11px;color:#667085;min-width:20px;text-align:right;font-weight:500}.metric-progress-track{height:6px;border-radius:4px;background:#e2e8f2;overflow:hidden}.metric-progress-fill{height:100%;background:#00a3ff;border-radius:4px;transition:width .5s ease}.funnel-chart{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:4px 0}.bbt-wrap{display:flex;flex-direction:column}.bbt-row{display:grid;grid-template-columns:140px 1fr 50px;align-items:center;padding:12px 14px;border-bottom:1px solid #F1F5F9;transition:background .15s}.bbt-row:last-child{border-bottom:none}.bbt-row:hover{background:#f8fafc}.bbt-row:nth-child(2n){background:#f8fafc}.bbt-row:nth-child(2n):hover{background:#eff6ff}.bbt-brand{font-size:13px;font-weight:700;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bbt-chips{display:flex;flex-wrap:nowrap;gap:6px;overflow:hidden;min-width:0}.bbt-chip{padding:3px 12px;border-radius:999px;background:#fff;border:1px solid #BAE6FD;color:#0284c7;font-size:12px;font-weight:500;white-space:nowrap;flex-shrink:0}.bbt-chip--more{background:#e9f4fe;border-color:#7dd3fc;color:#0369a1;font-weight:600;cursor:pointer}.bbt-float-tooltip{position:fixed;transform:translate(-50%,-100%);background:#1f2937;color:#fff;padding:6px 10px;border-radius:6px;box-shadow:0 6px 18px #0f172a38;display:flex;flex-direction:column;gap:2px;max-width:220px;width:max-content;font-size:11px;font-weight:500;line-height:1.35;text-align:left;pointer-events:none;z-index:9999}.bbt-float-tooltip:after{content:\"\";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#1f2937}.bbt-chip-tooltip-item{display:block;white-space:normal;word-break:break-word}.bbt-count{font-size:14px;font-weight:500;color:#94a3b8;text-align:right}.metric-card-dynamic--wide{grid-column:span 2}@media (max-width: 992px){.metric-card-dynamic--wide{grid-column:span 1}}.bbb-wrap{display:grid;grid-template-columns:minmax(170px,1fr) 1.4fr minmax(170px,1fr);gap:18px;align-items:center}.bbb-list{border-right:1px solid #E4E7EC;padding-right:12px;max-height:280px;overflow-y:auto}.bbb-list-row{padding:10px 12px;border-radius:6px;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbb-list-row:hover{background:#f8fafc}.bbb-list-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbb-list-label{display:inline-block;max-width:100%;white-space:normal;word-break:break-word;line-height:1.3}.bbb-pie-col{display:flex;align-items:center;justify-content:center;padding:8px 0}.bbb-pie-wrap{width:190px;height:190px;max-width:100%}.bbb-pie{width:100%;height:100%;display:block;filter:drop-shadow(0 2px 6px rgba(14,165,233,.12))}.bbb-pie path{cursor:pointer;transition:opacity .15s,transform .15s;transform-origin:50px 50px}.bbb-pie path:hover{opacity:.9}.bbb-pie-slice--active{opacity:1!important;transform:scale(1.04)}.bbb-legend{display:flex;flex-direction:column;gap:6px}.bbb-legend-row{display:flex;align-items:center;gap:8px;padding:3px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbb-legend-row:hover{background:#f8fafc}.bbb-legend-row--active{background:#e9f4fe}.bbb-legend-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.bbb-legend-label{flex:1}.bbb-legend-pct{font-weight:700;color:#101828}.bbc-wrap{display:grid;grid-template-columns:minmax(160px,1fr) 1.4fr;gap:18px;align-items:stretch}.bbc-keyword-list{border-right:1px solid #E4E7EC;padding-right:14px;max-height:280px;overflow-y:auto}.bbc-keyword-row{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-radius:0;border-bottom:1px solid #EAECF0;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbc-keyword-row:last-child{border-bottom:none}.bbc-keyword-row:hover{background:#f8fafc}.bbc-keyword-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbc-keyword-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-right:10px}.bbc-keyword-count{color:#667085;font-weight:500;font-size:13px}.bbc-keyword-row--active .bbc-keyword-count{color:#0077e6}.bbc-chart-side{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:14px;padding:8px 4px}.bbc-bar-list{display:flex;flex-direction:column;gap:14px;width:100%;padding:4px 2px}.bbc-bar-row{cursor:pointer;padding:8px 10px;border-radius:8px}.bbc-bar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;font-size:12px}.bbc-bar-label{display:inline-flex;align-items:center;gap:8px;color:#1e293b;font-weight:500;letter-spacing:.1px}.bbc-bar-dot{width:8px;height:8px;border-radius:50%;display:inline-block;box-shadow:0 0 0 2px #ffffffe6,0 0 0 3px #0f172a14}.bbc-bar-pct{color:#0f172a;font-weight:700;font-size:12px;font-variant-numeric:tabular-nums}.bbc-bar-track{height:10px;background:linear-gradient(180deg,#f1f5f9,#e2e8f0);border-radius:999px;overflow:hidden;box-shadow:inset 0 1px 2px #0f172a0f}.bbc-bar-fill{height:100%;border-radius:999px;background-image:linear-gradient(180deg,#ffffff40,#fff0 55%);background-blend-mode:overlay;transition:width .35s cubic-bezier(.4,0,.2,1);box-shadow:0 1px 2px #0f172a1f}.bbc-donut-wrap{position:relative;width:150px;height:150px}.bbc-donut{width:100%;height:100%}.bbc-donut-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none}.bbc-donut-pct{font-size:20px;font-weight:700;color:#101828;line-height:1}.bbc-donut-cap{font-size:11px;color:#667085;margin-top:3px}.bbc-legend{width:100%;display:flex;flex-direction:column;gap:6px}.bbc-legend-row{display:flex;align-items:center;gap:8px;padding:4px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbc-legend-row:hover{background:#f8fafc}.bbc-legend-row--active{background:#e9f4fe}.bbc-legend-dot{width:10px;height:10px;border-radius:50%;border:2px solid #8AD8FF;background:transparent;flex-shrink:0}.bbc-legend-label{flex:1}.bbc-legend-pct{font-weight:600;color:#0077e6}.funnel-stage{width:100%;display:flex;justify-content:flex-start;cursor:pointer}.funnel-bar{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-radius:6px;min-height:36px;overflow:visible;transition:width .5s ease,opacity .2s}.funnel-bar:hover{opacity:.85}.funnel-label-wrap{position:relative;flex:1;min-width:0;overflow:visible}.funnel-label-wrap .funnel-tooltip{position:absolute;bottom:calc(100% + 10px);left:0;padding:6px 10px;background:#1a2b4b;color:#fff;font-size:11.5px;font-weight:600;border-radius:6px;white-space:nowrap;box-shadow:0 4px 12px #0000002e;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none;z-index:100}.funnel-label-wrap .funnel-tooltip:after{content:\"\";position:absolute;top:100%;left:12px;width:8px;height:8px;background:#1a2b4b;transform:translateY(-50%) rotate(45deg);border-radius:1px}.funnel-label-wrap:hover .funnel-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.funnel-label{font-size:12px;font-weight:600;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.funnel-value{font-size:13px;font-weight:700;color:#fff;flex-shrink:0;margin-left:8px}.numeric-stat-strip{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:12px;margin-bottom:14px}.numeric-stat-tile{background:#fff;border:1px solid #EAECF0;border-left:3px solid #CBD5E1;border-radius:8px;padding:14px 16px;min-width:0}.numeric-stat-label{font-size:10px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:#667085;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-stat-value{font-size:26px;font-weight:800;line-height:1;margin-bottom:8px}.numeric-stat-max{font-size:14px;font-weight:600;color:#98a2b3;margin-left:2px}.numeric-stat-sub{font-size:11px;color:#667085;line-height:1.4;white-space:normal;word-break:break-word}.numeric-score-row{padding:10px 0;border-bottom:1px solid #f0f4ff;cursor:pointer;transition:background .15s}.numeric-score-row:last-child{border-bottom:none}.numeric-score-row:hover{background:#f8fafc;margin:0 -12px;padding:10px 12px;border-radius:6px}.metric-big-number{font-weight:800;font-size:36px;color:#00a3ff;line-height:1}.metric-avg-label{font-size:12px;color:#667085;margin-left:4px}@media (max-width: 992px){.metric-cards-dynamic{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.metric-cards-dynamic{grid-template-columns:1fr!important}}.subjective-wrap{cursor:pointer;max-height:120px;overflow:hidden}.subjective-row{padding:4px 0;font-size:12px;color:#475467;border-bottom:1px solid #f0f4ff;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.metric-card-name{font-size:14px;font-weight:600;color:#1a2b4b}.agents-table-header{display:grid;align-items:center;padding:10px 20px;border-bottom:1px solid #e8edf3;background:#f8fafc}.agents-table-cell{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;text-transform:uppercase}.agents-table-row{display:grid;align-items:center;padding:14px 20px;border-bottom:1px solid #e8edf3;cursor:pointer;transition:background .15s}.agents-table-row:hover{background:#f8fafc}.agents-table-row:last-child{border-bottom:none}.status-dot{width:8px;height:8px;border-radius:50%}.status-dot.active{background:#10b981}.status-dot.pending{background:#f59e0b}.status-dot.paused{background:#98a2b3}.tango-ai-header{display:flex;flex-direction:column;align-items:center;gap:10px;padding:20px 0}.tango-ai-logo{width:52px;height:52px;border-radius:16px;background:linear-gradient(135deg,#794fd9,#33b1f7);display:flex;align-items:center;justify-content:center;box-shadow:0 4px 16px #794fd933}.tango-ai-title{font-size:22px;font-weight:800;color:#1a2b4b;line-height:1.2}.tango-ai-subtitle{font-size:13px;color:#667085;margin-top:4px}.echo-search-card{display:flex;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:10px 12px 10px 20px;margin-bottom:20px;box-shadow:0 1px 2px #1018280d}.echo-search-input{flex:1;border:none;outline:none;font-size:14px;color:#101828}.echo-search-input::placeholder{color:#98a2b3}.echo-search-slash{width:28px;height:28px;border-radius:50%;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:600;color:#667085;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;margin-right:6px}.echo-search-send{width:32px;height:32px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:background .2s}.echo-search-send:hover{background:#0087d5}.echo-search-send:disabled{opacity:.5;cursor:not-allowed}.echo-ai-response{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:16px 20px;margin-bottom:16px}.echo-ai-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.echo-conv-count{font-size:14px;font-weight:700;color:#00a3ff;margin-bottom:16px}.typing{display:flex;gap:4px;align-items:center;padding:4px 0}.typing-dot{width:6px;height:6px;border-radius:50%;background:#00a3ff;animation:pulse 1.2s ease-in-out infinite}.typing-dot:nth-child(2){animation-delay:.2s}.typing-dot:nth-child(3){animation-delay:.4s}@keyframes pulse{0%,to{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}:host ::ng-deep lib-pagination{margin-top:16px;display:block}.agent-dropdown-wrap{position:relative}.agent-dropdown-trigger{display:flex;align-items:center;gap:8px;padding:7px 12px;border:1.5px solid #D0D5DD;border-radius:8px;background:#fff;cursor:pointer;max-width:280px;transition:border-color .15s}.agent-dropdown-trigger:hover{border-color:#00a3ff}.agent-dropdown-menu{position:absolute;top:calc(100% + 6px);right:0;background:#fff;border:1px solid #D0D5DD;border-radius:10px;box-shadow:0 8px 24px #0000001f;width:300px;z-index:300;overflow:hidden}.agent-dd-header{padding:8px 14px;font-size:11px;font-weight:600;color:#98a2b3;letter-spacing:.5px;border-bottom:1px solid #e8edf3;text-transform:uppercase}.agent-dd-item{display:flex;align-items:center;gap:10px;padding:10px 14px;cursor:pointer;transition:background .1s}.agent-dd-item:hover{background:#f8fafc}.agent-dd-item.selected{background:#f0f4ff}.agent-dd-name{font-size:13px;font-weight:600;color:#344054;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-dd-meta{font-size:12px;color:#98a2b3;margin-top:1px}.fbar-pill{display:flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;font-size:13px;font-weight:600;color:#344054;cursor:pointer;transition:all .15s;white-space:nowrap}.fbar-pill:hover,.fbar-pill.active{border-color:#1a73e8;color:#1a73e8;background:#f0f4ff}.echo-sub-header{display:flex;align-items:center;padding:12px 0 16px;gap:10px}.btn-back{background:none;border:none;cursor:pointer;display:flex;align-items:center;color:#1a73e8;padding:4px 6px;border-radius:8px}.sub-header-title{font-size:15px;font-weight:600;color:#1a2b4b}.drawer-overlay{position:fixed;inset:0;background:#0000004d;z-index:200}.af-drawer{position:fixed;top:0;right:0;bottom:0;width:380px;max-width:95vw;background:#fff;z-index:201;display:flex;flex-direction:column;box-shadow:-8px 0 40px #00000026;animation:slideInRight .25s ease-out;overflow:hidden}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}.af-footer{padding:14px 16px;border-top:1px solid #e8edf3;display:flex;align-items:center;justify-content:flex-end;background:#fff}.af-cancel{padding:9px 20px;border-radius:8px;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:500;cursor:pointer;color:#344054}@media (max-width: 768px){.metric-cards-grid{grid-template-columns:1fr}.agents-table-header,.agents-table-row{grid-template-columns:1fr 80px}}.flex-spacer{flex:1}.text-center{text-align:center}.echo-empty-state{text-align:center;padding:40px;color:#94a3b8}.echo-empty-state--muted{text-align:center;padding:40px;color:#667085}.echo-empty-state--sm{text-align:center;padding:40px;color:#94a3b8;font-size:13px}.echo-empty-state--muted-sm{text-align:center;padding:40px;color:#667085;font-size:13px}.echo-empty-state--compact{text-align:center;padding:32px;color:#667085;font-size:13px}.echo-nodata-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 20px;text-align:center}.echo-nodata-img{width:120px;height:auto;margin-bottom:16px;opacity:.85}.echo-nodata-title{font-size:15px;font-weight:700;color:#1a2b4b;margin-bottom:6px}.echo-nodata-sub{font-size:13px;color:#667085;line-height:1.5}.tango-ai-header-text{text-align:center}.conv-header-body{flex:1;min-width:0}.conv-meta-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:4px}.meta-tag--duration{background:#ede9fe;color:#8b5cf6;border-color:#ddd6fe;font-weight:700}.conv-description{font-size:12.5px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.conv-body-padding{padding:14px 16px}.ai-insights-section{margin-top:16px}.ai-insights-label{font-size:11px;font-weight:700;color:#667085;letter-spacing:.5px;text-transform:uppercase;margin-bottom:10px}.ai-insight-row{display:flex;align-items:flex-start;gap:8px;margin-bottom:8px}.ai-insight-dot{width:6px;height:6px;border-radius:50%;margin-top:5px;flex-shrink:0}.ai-insight-text{font-size:13px;color:#475467;line-height:1.5}.analytics-overview-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.analytics-overview-title{font-size:17px;font-weight:700;color:#1a2b4b}.analytics-overview-subtitle{font-size:12px;color:#667085}.echo-search-wrap{width:220px;display:flex;align-items:center;gap:8px;border:1px solid #D0D5DD;border-radius:8px;padding:6px 12px;background:#fff}.echo-search-wrap--wide{width:280px;display:flex;align-items:center;gap:8px;border:1px solid #E2E8F2;border-radius:8px;padding:6px 12px;background:#fff}.echo-inline-input{flex:1;border:none;background:transparent;font-size:13px;color:#344054;outline:none;min-width:0}.echo-inline-input--small{flex:1;border:none;background:transparent;font-size:12px;color:#344054;outline:none;min-width:0}.analytics-card-top-row{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:8px}.analytics-card-name{font-size:13.5px;font-weight:700;color:#1a2b4b;flex:1;padding-right:8px;line-height:1.3}.analytics-card-badge-active{font-size:9px;font-weight:700;padding:2px 8px;border-radius:20px;background:#d1fae5;color:#065f46;text-transform:uppercase;letter-spacing:.5px;flex-shrink:0}.analytics-card-spacer{padding:8px 14px}.analytics-card-footer{padding:8px 14px;border-top:1px solid #e8edf3;display:flex;justify-content:flex-end}.detail-header-bar{display:flex;align-items:center;gap:12px;margin-bottom:20px;padding:14px 20px;background:#fff;border-radius:10px;border:1px solid #e8edf3}.detail-back-btn{background:none;border:none;cursor:pointer;color:#00a3ff;font-size:18px;padding:0}.detail-header-title{font-size:16px;font-weight:700;color:#1a2b4b}.detail-header-conv-count{font-size:13px;color:#667085}.cohort-dd-dot{width:8px;height:8px;border-radius:50%;background:#10b981;flex-shrink:0}.cohort-dd-trigger-name{font-size:13px;font-weight:600;color:#1a2b4b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cohort-dd-search-wrap{padding:8px 10px;border-bottom:1px solid #e8edf3}.cohort-dd-search-inner{display:flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid #D0D5DD;border-radius:6px;background:#fff}.cohort-dd-scroll{max-height:240px;overflow-y:auto}.cohort-dd-item-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.cohort-dd-item-body{flex:1;min-width:0}.cohort-dd-no-results{padding:16px;text-align:center;font-size:12px;color:#667085}.cohort-dd-backdrop{position:fixed;inset:0;z-index:299}.metric-card-header-row{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.metric-card-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.metric-export-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:28px;padding:0 12px;border:1px solid rgba(0,0,0,.12);border-radius:6px;background:transparent;color:#64748b;font-size:12px;font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;transition:background .15s,color .15s,border-color .15s}.metric-export-btn svg{flex-shrink:0}.metric-export-btn:hover{background:#f1f5f9;color:#0f172a;border-color:#0003}.metric-row-flex{display:flex;align-items:center;gap:6px;margin-bottom:4px}.metric-row-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.metric-row-label{font-size:13px;color:#344054;flex:1}.metric-score--teal{color:#00a3ff}.numeric-row-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.numeric-row-name{font-size:13px;color:#344054;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-row-value{font-size:15px;font-weight:800;color:#00a3ff;flex-shrink:0;margin-left:8px}.numeric-row-max{font-size:12px;font-weight:600;color:#98a2b3}.numeric-progress-track{position:relative;height:5px;border-radius:4px;background:#e2e8f2}.numeric-progress-fill{position:absolute;left:0;top:0;height:100%;border-radius:4px;background:linear-gradient(90deg,#00a3ff,#33b1f7)}.pitch-keyword-count{font-size:11px;color:#667085;margin-bottom:8px}.pitch-row-label{font-size:12.5px;color:#344054;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pitch-row-desc{font-size:12px;font-weight:700;color:#667085;flex-shrink:0}.funnel-value-count{opacity:.8;font-weight:500}.detail-conv-section-header{padding:16px 20px;display:flex;align-items:center;gap:8px;background:#fff;border-radius:10px;border:1px solid #e8edf3;margin-bottom:12px}.detail-conv-section-title{font-size:15px;font-weight:700;color:#1a2b4b}.detail-conv-search{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 10px;border:1px solid #E4E7EC;border-radius:6px;background:#fff;min-width:240px;transition:border-color .15s,box-shadow .15s}.detail-conv-search:focus-within{border-color:#0ea5e9;box-shadow:0 0 0 3px #0ea5e91f}.detail-conv-search-input{flex:1;border:none;outline:none;background:transparent;font-size:13px;color:#1e293b}.detail-conv-search-input::placeholder{color:#98a2b3}.detail-conv-search-clear{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;border-radius:50%;background:transparent;color:#98a2b3;cursor:pointer}.detail-conv-search-clear:hover{background:#f1f5f9;color:#334155}.detail-content-split{display:flex}.detail-content-left{flex:3;padding:14px 20px;min-width:0;border-right:1px solid #e8edf3}.detail-content-right{flex:1;min-width:220px;max-width:350px;padding:16px;overflow-y:auto;max-height:500px}.detail-meta-row{display:flex;align-items:center;gap:5px;flex:1;min-width:0;flex-wrap:wrap}.summary-text--prewrap{white-space:pre-wrap}.metrics-panel-label{font-size:10px;font-weight:700;color:#00a3ff;letter-spacing:.5px;text-transform:uppercase;margin-bottom:12px}.metric-item-wrap{margin-bottom:8px;padding:6px 0;border-bottom:1px solid #f0f4ff}.metric-single-row{display:flex;align-items:center;gap:8px}.metric-single-name{font-size:12px;font-weight:600;color:#344054;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-single-value{font-size:12px;font-weight:700;flex-shrink:0}.metric-multi-header{font-size:11px;font-weight:700;color:#344054;margin-bottom:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-row{display:flex;align-items:center;gap:8px;padding:3px 0}.metric-multi-name{font-size:11px;color:#667085;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-value{font-size:11px;font-weight:700;flex-shrink:0}.metric-fallback-row{display:flex;justify-content:space-between;margin-bottom:6px}.metric-fallback-label{font-size:12px;color:#667085}.metric-fallback-value{font-size:12px;font-weight:600;color:#344054}.metric-detail-loading{font-size:11px;color:#667085}.manage-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.manage-title{font-family:Outfit,sans-serif;font-weight:700;font-size:17px}.manage-subtitle{font-size:12px;color:#94a3b8}.manage-search-input{flex:1;border:none;background:transparent;font-size:13px;font-family:Nunito Sans,sans-serif;color:#0f172a;outline:none;min-width:0}.agents-table-4col{grid-template-columns:minmax(0,1fr) 120px 120px 80px}.agents-table-cell--center{text-align:center}.agent-cell-name-wrap{min-width:0}.agent-cell-name{font-family:Outfit,sans-serif;font-weight:700;font-size:13.5px;color:#0f172a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-desc{font-size:11px;color:#94a3b8;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-metrics{text-align:center;font-family:Outfit,sans-serif;font-weight:700;font-size:13px;color:#0f172a}.agent-cell-source{text-align:center;font-size:11.5px;color:#334155;font-weight:600}.agent-cell-action{text-align:center}.agent-delete-btn{background:none;border:none;cursor:pointer;color:#ef4444;font-size:11px;font-weight:700}.manage-no-results{padding:32px;text-align:center;color:#94a3b8;font-size:13px}.drawer-header{padding:16px;border-bottom:1px solid #E2E8F2;display:flex;align-items:center;justify-content:space-between}.drawer-header-title{font-family:Outfit,sans-serif;font-weight:700;font-size:15px}.drawer-close-btn{background:none;border:none;cursor:pointer;color:#94a3b8;font-size:18px}.drawer-body{padding:16px;flex:1;overflow-y:auto}.drawer-placeholder-text{font-size:13px;color:#94a3b8}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.PaginationComponent, selector: "lib-pagination", inputs: ["collection", "itemsPerPage", "currentPage", "totalItems", "directionLinks", "pageSize", "paginationSizes"], outputs: ["pageChange", "pageSizeChange"] }] });
|
|
1094
1126
|
}
|
|
1095
1127
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TangoEchoComponent, decorators: [{
|
|
1096
1128
|
type: Component,
|
|
1097
|
-
args: [{ selector: 'lib-tango-echo', template: "<div class=\"echo-page\">\n <!-- Floating tooltip for BOOLEAN_BASKET_TABLE overflow chips -->\n <div class=\"bbt-float-tooltip\"\n *ngIf=\"bbtTooltip.visible\"\n [style.left.px]=\"bbtTooltip.x\"\n [style.top.px]=\"bbtTooltip.y\">\n <span *ngFor=\"let ov of bbtTooltip.items\" class=\"bbt-chip-tooltip-item\">{{ ov }}</span>\n </div>\n <div class=\"echo-content\">\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CONVERSATIONS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'conversations'\">\n\n <!-- Tango AI Header -->\n <div class=\"tango-ai-header\">\n <div class=\"tango-ai-logo\">\n <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"M12 2l2.09 6.26L20 10l-5.91 1.74L12 18l-2.09-6.26L4 10l5.91-1.74L12 2z\"/></svg>\n </div>\n <div class=\"tango-ai-header-text\">\n <div class=\"tango-ai-title\">Tango AI</div>\n <div class=\"tango-ai-subtitle\">Analyse conversations, stores & staff performance</div>\n </div>\n </div>\n\n <!-- Search Card -->\n <div class=\"echo-search-card\">\n <input type=\"text\" class=\"echo-search-input\" placeholder=\"Ask anything... 'Which stores are not performing well?'\" [(ngModel)]=\"convSearchQuery\" (keyup.enter)=\"sendConvQuery()\">\n <button class=\"echo-search-send\" (click)=\"sendConvQuery()\" [disabled]=\"!convSearchQuery?.trim()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>\n </svg>\n </button>\n </div>\n\n <!-- AI Response -->\n <div class=\"echo-ai-response\" *ngIf=\"convAiLoading || convAiReply\">\n <div *ngIf=\"convAiLoading\" class=\"typing\">\n <span class=\"typing-dot\"></span><span class=\"typing-dot\"></span><span class=\"typing-dot\"></span>\n </div>\n <p *ngIf=\"!convAiLoading && convAiReply\" class=\"echo-ai-text\">{{ convAiReply }}</p>\n </div>\n\n <!-- Total count -->\n <div class=\"echo-conv-count\">{{ convTotal }} Conversations</div>\n\n <!-- Conversations list area -->\n <div class=\"conversations-section\">\n\n <!-- Loading -->\n <div *ngIf=\"convLoading\" class=\"echo-empty-state\">Loading conversations...</div>\n\n <!-- Conversation cards (dynamic from API \u2014 same pattern as transcript-list) -->\n <div *ngFor=\"let conv of conversations; trackBy: trackById\" class=\"conv-card\">\n <div class=\"conv-header\" (click)=\"toggleConvExpand(conv.audioId)\">\n <div class=\"conv-header-body\">\n <div class=\"conv-meta-row\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.userName\">{{ conv.userName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag meta-tag--duration\" *ngIf=\"conv.duration\">{{ conv.duration }}</span>\n </div>\n <div class=\"conv-description\">\n {{ conv.audioDescription || 'No description available' }}\n </div>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"expandedConvIds[conv.audioId]\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body (unified layout matching Agent Analysis design) -->\n <div *ngIf=\"expandedConvIds[conv.audioId]\" class=\"conv-body-expanded\">\n\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\">\n </div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Summary Content -->\n <div class=\"conv-body-padding\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No data -->\n <div *ngIf=\"!convLoading && conversations.length === 0\" class=\"echo-empty-state--sm\">No conversations found.</div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"convTotal > 0\" [itemsPerPage]=\"convPerPage\" [currentPage]=\"convPage\" [totalItems]=\"convTotal\"\n [paginationSizes]=\"convPaginationSizes\" [pageSize]=\"convPerPage\" (pageChange)=\"onConvPageChange($event)\"\n (pageSizeChange)=\"onConvPageSizeChange($event)\"></lib-pagination>\n </div> <!-- end conversations-section -->\n </ng-container>\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 AGENT ANALYSIS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'agentanalysis'\">\n\n <!-- \u2500\u2500 OVERVIEW: Agent Cards Grid \u2500\u2500 -->\n <ng-container *ngIf=\"!detailView\">\n <div class=\"analytics-overview-header\">\n <div>\n <div class=\"analytics-overview-title\">Analytics Overview</div>\n <div class=\"analytics-overview-subtitle\">{{ activeCohorts.length }} active agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"analysisSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input\">\n </div>\n </div>\n\n <div *ngIf=\"cohortList.length === 0\" class=\"echo-empty-state--muted\">Loading agents...</div>\n\n <div class=\"analytics-grid\" [style.grid-template-columns]=\"'repeat(' + Math.min(cohortList.length, 4) + ', 1fr)'\">\n <ng-container *ngFor=\"let cohort of cohortList; trackBy: trackById\">\n <div class=\"analytics-card\" *ngIf=\"!analysisSearch || (cohort.cohortName || cohort.name || '').toLowerCase().includes(analysisSearch.toLowerCase())\" (click)=\"selectCohortDetail(cohort)\">\n <div class=\"analytics-card-header\">\n <div class=\"analytics-card-top-row\">\n <div class=\"analytics-card-name\">{{ cohort.cohortName || cohort.name }}</div>\n <span class=\"analytics-card-badge-active\">Active</span>\n </div>\n <!-- metrics & stores badges hidden for now -->\n </div>\n <div class=\"analytics-card-spacer\"></div>\n <div class=\"analytics-card-footer\">\n <span class=\"analytics-hover-link\">View analytics \u2192</span>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- \u2500\u2500 DETAIL: Selected Cohort Metrics + Conversations \u2500\u2500 -->\n <ng-container *ngIf=\"detailView\">\n\n <!-- Header: \u2190 Back + Title + Conversations + Dropdown -->\n <div class=\"detail-header-bar\">\n <button class=\"detail-back-btn\" (click)=\"backToOverview()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>\n </button>\n <span class=\"detail-header-title\">{{ selectedCohortName }}</span>\n <span class=\"flex-spacer\"></span>\n <span class=\"detail-header-conv-count\">Total Conversations: {{ totalAudio }}</span>\n\n <!-- Cohort Dropdown -->\n <div class=\"agent-dropdown-wrap\">\n <div class=\"agent-dropdown-trigger\" (click)=\"toggleCohortDropdown()\">\n <div class=\"cohort-dd-dot\"></div>\n <span class=\"cohort-dd-trigger-name\">{{ selectedCohortName || 'Select Agent' }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2.5\" stroke-linecap=\"round\" [style.transform]=\"cohortDropdownOpen ? 'rotate(180deg)' : 'none'\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n <div class=\"agent-dropdown-menu\" *ngIf=\"cohortDropdownOpen\">\n <div class=\"cohort-dd-search-wrap\">\n <div class=\"cohort-dd-search-inner\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"cohortDropdownSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input--small\">\n </div>\n </div>\n <div class=\"cohort-dd-scroll\">\n <div *ngFor=\"let c of filteredDropdownCohorts; trackBy: trackById\" class=\"agent-dd-item\" [class.selected]=\"(c.cohortId || c.id || c._id) === selectedCohortId\" (click)=\"selectCohortFromDropdown(c)\">\n <div class=\"cohort-dd-item-dot\" [style.background]=\"c.metricsAdded > 0 ? '#10B981' : '#D0D5DD'\"></div>\n <div class=\"cohort-dd-item-body\">\n <div class=\"agent-dd-name\">{{ c.cohortName || c.name }}</div>\n <div class=\"agent-dd-meta\">{{ c.metricsAdded || 0 }} metrics</div>\n </div>\n <svg *ngIf=\"(c.cohortId || c.id || c._id) === selectedCohortId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#00A3FF\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n </div>\n <div *ngIf=\"filteredDropdownCohorts.length === 0\" class=\"cohort-dd-no-results\">No agents found</div>\n </div>\n </div>\n <div *ngIf=\"cohortDropdownOpen\" class=\"cohort-dd-backdrop\" (click)=\"closeCohortDropdown()\"></div>\n </div>\n </div>\n\n <!-- Loading -->\n <div *ngIf=\"cardsLoading\" class=\"echo-empty-state--muted\">Loading metrics...</div>\n\n <!-- Numeric scores \u2014 full-width stat strip above cards -->\n <div *ngIf=\"!cardsLoading && numericStripCard?.numericRows?.length\" class=\"numeric-stat-strip\">\n <div *ngFor=\"let row of numericStripCard.numericRows; let i = index\"\n class=\"numeric-stat-tile\"\n [style.border-left-color]=\"getNumericTileColor(i)\">\n <div class=\"numeric-stat-label\">{{ row.name }}</div>\n <div class=\"numeric-stat-value\" [style.color]=\"getNumericTileColor(i)\">\n {{ row.avg }}<span *ngIf=\"row.max !== null\" class=\"numeric-stat-max\">/{{ row.max }}</span>\n </div>\n <div class=\"numeric-stat-sub\" *ngIf=\"row.max !== null && row.min !== null\">\n scale {{ row.min }}\u2013{{ row.max }}{{ row.description ? ' \u00B7 ' + row.description : '' }}\n </div>\n </div>\n </div>\n\n <!-- Metric Cards (dynamic columns based on card count) -->\n <div *ngIf=\"!cardsLoading && nonNumericCards.length > 0\" class=\"metric-cards-dynamic\"\n [style.grid-template-columns]=\"'repeat(' + Math.min(nonNumericCards.length, 4) + ', 1fr)'\">\n <div *ngFor=\"let card of nonNumericCards; trackBy: trackById\" class=\"metric-card-dynamic\"\n [class.metric-card-dynamic--wide]=\"card.type === 'BOOLEAN_BASKET_BAR' || card.type === 'BOOLEAN_BASKET_TABLE'\">\n <!-- Card Header: Title + Status Badge + Info -->\n <div class=\"metric-card-header-row\">\n <div class=\"metric-card-title\">{{ card.name }}</div>\n <div class=\"metric-card-actions\">\n <span *ngIf=\"card.status\" class=\"metric-status-badge\"\n [style.background]=\"getStatusBadge(card.status).bg\"\n [style.color]=\"getStatusBadge(card.status).color\">{{ card.status }}</span>\n <div class=\"metric-info-icon\" *ngIf=\"card.description\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>\n <div class=\"metric-info-tooltip\">\n <div>{{ card.description }}</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"metric-card-subtitle\" *ngIf=\"card.type !== 'NUMERIC_SCALAR' && card.type !== 'NUMERIC_ARRAY'\">{{ card.applicableCount ?? totalAudio }} conversations</div>\n\n <div class=\"metric-card-content\">\n <!-- BOOLEAN_BASKET_TABLE \u2014 brand rows with attribute chips + count -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_TABLE'\">\n <div class=\"bbt-wrap\">\n <div *ngFor=\"let row of card.tableRows\" class=\"bbt-row\">\n <div class=\"bbt-brand\" [title]=\"row.brand\">{{ row.brand }}</div>\n <div class=\"bbt-chips\">\n <span *ngFor=\"let chip of row.visibleChips\" class=\"bbt-chip\">{{ chip }}</span>\n <span *ngIf=\"row.overflowCount > 0\" class=\"bbt-chip bbt-chip--more\"\n (mouseenter)=\"showBbtTooltip($event, row.overflowChips)\"\n (mouseleave)=\"hideBbtTooltip()\">\n +{{ row.overflowCount }}\n </span>\n </div>\n <div class=\"bbt-count\">{{ row.count }}</div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET_BAR \u2014 category list + pie chart + legend -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_BAR'\">\n <div class=\"bbb-wrap\">\n <div class=\"bbb-list\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-list-row\"\n [class.bbb-list-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-list-label\" [title]=\"slice.label\">{{ slice.label }}</span>\n </div>\n </div>\n <div class=\"bbb-pie-col\">\n <div class=\"bbb-pie-wrap\">\n <svg class=\"bbb-pie\" viewBox=\"0 0 100 100\">\n <path *ngFor=\"let slice of card.pieSlices\"\n [attr.d]=\"slice.path\"\n [attr.fill]=\"slice.color\"\n stroke=\"#ffffff\"\n stroke-width=\"0.8\"\n [class.bbb-pie-slice--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\"></path>\n </svg>\n </div>\n </div>\n <div class=\"bbb-legend\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-legend-row\"\n [class.bbb-legend-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-legend-dot\" [style.background]=\"slice.color\"></span>\n <span class=\"bbb-legend-label\">{{ slice.label }}</span>\n <span class=\"bbb-legend-pct\">{{ slice.percent }}%</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Boolean_basket_chart \u2014 keyword list + sentiment donut -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_CHART'\">\n <div class=\"bbc-wrap\">\n <div class=\"bbc-keyword-list\">\n <div *ngFor=\"let row of card.keywordRows\"\n class=\"bbc-keyword-row\"\n [class.bbc-keyword-row--active]=\"card.selectedKeyword === row.label\"\n (click)=\"selectBasketKeyword(card, row)\">\n <span class=\"bbc-keyword-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"bbc-keyword-count\">{{ row.count }}</span>\n </div>\n </div>\n <div class=\"bbc-chart-side\">\n <div class=\"bbc-donut-wrap\">\n <svg class=\"bbc-donut\" viewBox=\"0 0 100 100\">\n <circle cx=\"50\" cy=\"50\" r=\"42\" fill=\"none\" stroke=\"#F1F5F9\" stroke-width=\"14\"></circle>\n <circle *ngFor=\"let slice of card.selectedSlices; let i = index\"\n cx=\"50\" cy=\"50\" r=\"42\" fill=\"none\"\n [attr.stroke]=\"slice.color\"\n stroke-width=\"14\"\n [attr.stroke-dasharray]=\"getDonutDash(slice)\"\n [attr.stroke-dashoffset]=\"getDonutOffset(i, card)\"\n transform=\"rotate(-90 50 50)\"\n stroke-linecap=\"butt\"></circle>\n </svg>\n <div class=\"bbc-donut-center\" *ngIf=\"card.selectedSentiment\">\n <div class=\"bbc-donut-pct\">{{ card.selectedSentiment.percent }}%</div>\n <div class=\"bbc-donut-cap\">{{ card.selectedSentiment.label.toLowerCase() }}</div>\n </div>\n </div>\n <div class=\"bbc-legend\">\n <div *ngFor=\"let slice of card.selectedSlices\"\n class=\"bbc-legend-row\"\n [class.bbc-legend-row--active]=\"card.selectedSentiment?.key === slice.key\"\n (click)=\"selectBasketSentiment(card, slice)\">\n <span class=\"bbc-legend-dot\" [style.border-color]=\"slice.color\"></span>\n <span class=\"bbc-legend-label\">{{ slice.label }}</span>\n <span class=\"bbc-legend-pct\">{{ slice.percent }}%</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 Funnel Chart (left-aligned) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && card.isFunnel\">\n <div class=\"funnel-chart\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"funnel-stage\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"funnel-bar\" [title]=\"row.label\"\n [style.width.%]=\"card.booleanRows[0]?.responses > 0 ? (row.responses / card.booleanRows[0].responses * 100) : 100\"\n [style.background]=\"getScoreColor(row.score)\">\n <span class=\"funnel-label-wrap\">\n <span class=\"funnel-label\">{{ row.label }}</span>\n </span>\n <span class=\"funnel-value\"> <span class=\"funnel-value-count\">{{ row.responses }}</span> ({{ row.score }})% </span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 rows with progress bars (non-funnel) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && !card.isFunnel\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n <span class=\"metric-row-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"metric-score metric-score--teal\">{{ row.score }}%</span>\n <span class=\"metric-count\">{{ row.responses }}</span>\n </div>\n <div class=\"metric-progress-track\">\n <div class=\"metric-progress-fill\" [style.width.%]=\"row.score\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n </div>\n </div>\n </ng-container>\n\n\n <!-- UNIQUE_PITCHES \u2014 pitch keywords tracker -->\n <ng-container *ngIf=\"card.type === 'UNIQUE_PITCHES'\">\n <div class=\"pitch-keyword-count\">{{ card.pitchRows?.length || 0 }} keywords</div>\n <div>\n <div *ngFor=\"let pitch of card.pitchRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick('', card.key)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"['#00A3FF','#10B981','#F59E0B','#EF4444','#8B5CF6','#EC4899','#06B6D4','#84CC16','#F97316','#6366F1'][i % 10]\"></div>\n <span class=\"pitch-row-label\">{{ pitch.id }}</span>\n <span class=\"pitch-row-desc\">{{ pitch.desc ? pitch.desc.slice(0, 60) : '\u2013' }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SUBJECTIVE -->\n <ng-container *ngIf=\"card.type === 'SUBJECTIVE' || card.type === 'SUBJECTIVE_COUNT'\">\n <div class=\"subjective-wrap\" (click)=\"onCardRowClick('', card.key)\">\n <div *ngFor=\"let row of card.subjectiveRows?.slice(0, 2)\" class=\"subjective-row\">\n \u2022 {{ row.reasoning || row.store_id }}\n </div>\n </div>\n </ng-container>\n </div><!-- end metric-card-content -->\n </div>\n </div>\n\n <!-- Full no-data state: no cards AND no conversations -->\n <div *ngIf=\"!cardsLoading && !detailLoading && cohortCards.length === 0 && detailPageConvs.length === 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No analysis data or conversations available for the selected date range and stores.</div>\n </div>\n\n <!-- \u2500\u2500 Conversations Section (show when cards exist OR conversations exist OR loading) \u2500\u2500 -->\n <div id=\"echoConversations\" class=\"conversations-section\" *ngIf=\"cardsLoading || detailLoading || cohortCards.length > 0 || detailPageConvs.length > 0\">\n <div class=\"detail-conv-section-header\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#344054\" stroke-width=\"1.8\"><path d=\"M20 2H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h11l5 3V4a2 2 0 0 0-2-2z\"/></svg>\n <span class=\"detail-conv-section-title\">Conversations</span>\n </div>\n\n <div *ngIf=\"detailLoading\" class=\"echo-empty-state--muted\">Loading...</div>\n\n <div *ngFor=\"let conv of detailPageConvs; trackBy: trackById\" class=\"detail-conv-card\">\n <!-- Conv header -->\n <div class=\"conv-header\" (click)=\"toggleDetailConv(conv.audioId); loadConvDetail(conv)\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <div class=\"detail-meta-row\">\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.time\">{{ conv.time }}</span>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"detailOpenId === conv.audioId\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body -->\n <div *ngIf=\"detailOpenId === conv.audioId\" class=\"conv-body-expanded\">\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\"></div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Tabs -->\n <div class=\"conv-tabs\">\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'summary'\" (click)=\"setConvTab(conv.audioId, 'summary', $event)\">Summary</button>\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'transcript'\" (click)=\"setConvTab(conv.audioId, 'transcript', $event)\">Transcript</button>\n </div>\n\n <!-- Content: Left (Summary/Transcript + AI Insights) + Right (Metrics) -->\n <div class=\"detail-content-split\">\n <!-- Left side -->\n <div class=\"detail-content-left\">\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'summary'\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'transcript'\">\n <p class=\"summary-text summary-text--prewrap\">{{ cleanTranscription(conv.conversationDetails?.transcription) || 'No transcript available' }}</p>\n </ng-container>\n </div>\n <!-- Right side: Metrics (only show values that have data) -->\n <div class=\"detail-content-right\">\n <div class=\"metrics-panel-label\">Metrics</div>\n <ng-container *ngIf=\"conv.metrics?.length\">\n <div *ngFor=\"let m of conv.metrics\" class=\"metric-item-wrap\">\n <!-- Single value: name + value on same row -->\n <ng-container *ngIf=\"m.value?.length === 1\">\n <div class=\"metric-single-row\">\n <span class=\"metric-single-name\" [title]=\"m.name\">{{ m.name }}</span>\n <span class=\"metric-single-value\" [style.color]=\"m.value[0].score !== null && m.value[0].score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(m.value[0]) }}\n </span>\n </div>\n </ng-container>\n <!-- Multiple values: header + rows -->\n <ng-container *ngIf=\"m.value?.length > 1\">\n <div class=\"metric-multi-header\" [title]=\"m.name\">{{ m.name }}</div>\n <ng-container *ngFor=\"let v of m.value\">\n <div *ngIf=\"(v.score !== null && v.score !== undefined) || (v.Total !== null && v.Total !== undefined) || (v.Avg !== null && v.Avg !== undefined) || (v.total !== null && v.total !== undefined) || (v.avg !== null && v.avg !== undefined) || (v.count !== null && v.count !== undefined)\" class=\"metric-multi-row\">\n <span class=\"metric-multi-name\" [title]=\"v.name\">{{ v.name }}</span>\n <span class=\"metric-multi-value\"\n [style.color]=\"v.score !== null && v.score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(v) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!conv.metrics?.length\">\n <div *ngIf=\"conv.storeName\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Store</span><span class=\"metric-fallback-value\">{{ conv.storeName }}</span></div>\n <div *ngIf=\"conv.duration\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Duration</span><span class=\"metric-fallback-value\">{{ conv.duration }}</span></div>\n </ng-container>\n <div *ngIf=\"conv._detailLoading\" class=\"metric-detail-loading\">Loading...</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No conversations for this filter (only when cards exist but convs are empty) -->\n <div *ngIf=\"!detailLoading && detailPageConvs.length === 0 && cohortCards.length > 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No conversations available for the selected filter.</div>\n </div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"detailTotal > 0\" [itemsPerPage]=\"detailPerPage\" [currentPage]=\"detailPage\" [totalItems]=\"detailTotal\"\n [paginationSizes]=\"detailPaginationSizes\" [pageSize]=\"detailPerPage\" (pageChange)=\"onDetailPageChange($event)\"\n (pageSizeChange)=\"onDetailPageSizeChange($event)\"></lib-pagination>\n </ng-container><!-- end detailView -->\n </ng-container><!-- end agentanalysis -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 MANAGE TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'manage'\">\n <div class=\"manage-header\">\n <div>\n <div class=\"manage-title\">Agents</div>\n <div class=\"manage-subtitle\">{{ manageTotal }} agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap--wide\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"manageSearch\" (ngModelChange)=\"onManageSearch()\" placeholder=\"Search agents...\" class=\"manage-search-input\">\n </div>\n </div>\n\n <div *ngIf=\"manageLoading\" class=\"echo-empty-state\">Loading agents...</div>\n\n <!-- Agents table -->\n <div *ngIf=\"!manageLoading\" class=\"echo-card\">\n <div class=\"agents-table-header agents-table-4col\">\n <div class=\"agents-table-cell\">Agent Name</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Metrics</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Source</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Action</div>\n </div>\n <div *ngFor=\"let cohort of manageCohorts; trackBy: trackById\" class=\"agents-table-row agents-table-4col\">\n <div class=\"agent-cell-name-wrap\">\n <div class=\"agent-cell-name\">{{ cohort.cohortName || cohort.name }}</div>\n <div class=\"agent-cell-desc\">{{ cohort.cohortDescription || cohort.description || '' }}</div>\n </div>\n <div class=\"agent-cell-metrics\">{{ cohort.metricsAdded || cohort.metricAdded || cohort.metrics?.length || 0 }}</div>\n <div class=\"agent-cell-source\">{{ cohort.source?.join(', ') || '\u2013' }}</div>\n <div class=\"agent-cell-action\">\n <button (click)=\"deleteCohort(cohort.cohortId || cohort.id || cohort._id)\" class=\"agent-delete-btn\">Delete</button>\n </div>\n </div>\n <div *ngIf=\"manageCohorts.length === 0\" class=\"manage-no-results\">No cohorts found.</div>\n </div>\n\n <!-- Manage pagination -->\n <lib-pagination *ngIf=\"manageTotal > 0\" [itemsPerPage]=\"managePerPage\" [currentPage]=\"managePage\" [totalItems]=\"manageTotal\"\n [paginationSizes]=\"managePaginationSizes\" [pageSize]=\"managePerPage\" (pageChange)=\"onManagePageChange($event)\"\n (pageSizeChange)=\"onManagePageSizeChange($event)\"></lib-pagination>\n </ng-container>\n\n </div>\n</div>\n\n<!-- \u2550\u2550\u2550 FILTERS DRAWER \u2550\u2550\u2550 -->\n<div class=\"drawer-overlay\" *ngIf=\"drawerOpen\" (click)=\"closeFilterDrawer()\"></div>\n<div class=\"af-drawer\" *ngIf=\"drawerOpen\">\n <div class=\"drawer-header\">\n <span class=\"drawer-header-title\">Filters</span>\n <button (click)=\"closeFilterDrawer()\" class=\"drawer-close-btn\">\u00D7</button>\n </div>\n <div class=\"drawer-body\">\n <p class=\"drawer-placeholder-text\">Filter configuration coming soon. Uses the same filter APIs as the existing audio pages.</p>\n </div>\n <div class=\"af-footer\">\n <button class=\"af-cancel\" (click)=\"closeFilterDrawer()\">Close</button>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.echo-page{padding:20px 24px;background-color:#f4f6fa}.conversations-section{background:#fff;border-radius:10px;padding:16px;margin-top:8px}.conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;overflow:hidden;background:#fff}.conv-header{padding:14px 20px;display:flex;align-items:center;gap:8px;cursor:pointer;transition:background .15s}.conv-header:hover{background:#f8fafc}.conv-chevron{width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:transform .22s ease}.conv-chevron.open{transform:rotate(180deg)}.conv-id{font-size:13px;font-weight:600;color:#0ea5e9;border-radius:4px;padding:2px 8px}.meta-tag{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:24px;font-size:12px;font-weight:500;border:1px solid #e8edf3;background:#f8fafc;color:#344054;white-space:nowrap}.meta-tag.purple{background:#f0f4ff;color:#1a73e8;border-color:#d0e0ff}.meta-tag.brand{font-weight:600}.conv-tabs{display:flex;border-bottom:1px solid #e8edf3;padding:0 20px}.conv-tab-btn{padding:10px 16px;font-size:13px;font-weight:600;border:none;background:transparent;cursor:pointer;color:#667085;border-bottom:2px solid transparent;transition:all .15s;margin-bottom:-1px}.conv-tab-btn.active{color:#00a3ff;border-bottom-color:#00a3ff}.transcript-content .transcript-section{margin-bottom:20px}.transcript-content .transcript-section:last-child{margin-bottom:0}.transcript-content .transcript-section-title{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:#344054;margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid #f0f4ff}.transcript-content .transcript-summary-text,.summary-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.detail-conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;background:#fff;overflow:hidden}.detail-conv-card .conv-header{padding:12px 16px}.detail-conv-card .conv-tabs{padding:0 16px}.detail-conv-card .echo-player{padding:10px 16px}.conv-body-expanded{border-top:1px solid #e8edf3}.echo-player{display:flex;align-items:center;gap:12px;padding:12px 20px;background:#f2f4f7;border-bottom:1px solid #e8edf3}.echo-play-btn{width:36px;height:36px;min-width:36px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s;position:relative}.echo-play-btn:hover{background:#0087d5}.echo-play-btn.playing{animation:pulse-heartbeat 1.4s ease-in-out infinite}.echo-play-btn.playing:before,.echo-play-btn.playing:after{content:\"\";position:absolute;inset:0;border-radius:50%;border:2px solid #00A3FF;animation:pulse-ring 1.4s ease-out infinite}.echo-play-btn.playing:after{animation-delay:.7s}@keyframes pulse-heartbeat{0%,to{transform:scale(1)}15%{transform:scale(1.08)}30%{transform:scale(1)}45%{transform:scale(1.05)}60%{transform:scale(1)}}@keyframes pulse-ring{0%{transform:scale(1);opacity:.6}to{transform:scale(1.8);opacity:0}}.echo-waveform{flex:1;display:flex;align-items:center;gap:1.5px;height:40px;cursor:pointer}.echo-wf-bar{width:2px;min-width:2px;border-radius:2px;min-height:3px;background:#cbd5e1;transition:background .15s}.echo-wf-bar.played{background:#00a3ff}.wf-playing .echo-wf-bar.played{transform-origin:center}.wf-playing .echo-wf-bar.played:nth-child(3n){animation:wf-eq1 .45s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+1){animation:wf-eq2 .55s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+2){animation:wf-eq3 .35s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(5n){animation-delay:.1s}.wf-playing .echo-wf-bar.played:nth-child(7n){animation-delay:.2s}.wf-playing .echo-wf-bar.played:nth-child(11n){animation-delay:.05s}@keyframes wf-eq1{0%{transform:scaleY(1)}50%{transform:scaleY(.6)}to{transform:scaleY(1.1)}}@keyframes wf-eq2{0%{transform:scaleY(.7)}to{transform:scaleY(1.15)}}@keyframes wf-eq3{0%{transform:scaleY(1.1)}50%{transform:scaleY(.5)}to{transform:scaleY(.9)}}.echo-time{font-size:13px;font-weight:600;color:#344054;flex-shrink:0;min-width:50px;text-align:right}.btn{padding:8px 16px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:all .15s}.btn-primary{background:#1a73e8;color:#fff}.btn-primary:hover{background:#135cbc}.analytics-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}@media (max-width: 992px){.analytics-grid{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.analytics-grid{grid-template-columns:1fr!important}}.analytics-card{background:#fff;border:1px solid #e8edf3;border-radius:10px;cursor:pointer;overflow:hidden;transition:box-shadow .2s,transform .2s,border-color .2s}.analytics-card:hover{box-shadow:0 4px 12px #00000014;transform:translateY(-2px);border-color:#00a3ff}.analytics-card:hover .analytics-hover-link{opacity:1}.analytics-card-header{padding:14px 16px;border-bottom:1px solid #e8edf3;background:linear-gradient(135deg,#f8fafc,#fff)}.analytics-hover-link{font-size:11px;color:#00a3ff;font-weight:700;opacity:0;transition:opacity .2s}.btn-outline{background:#fff;border:1px solid #D0D5DD;color:#344054}.btn-outline:hover{border-color:#1a73e8;color:#1a73e8}.btn-success{background:#10b981;color:#fff}.section-label{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;margin-bottom:8px;text-transform:uppercase}.echo-card{background:#fff;border-radius:10px;border:1px solid #e8edf3;overflow:hidden}.echo-card-header{padding:14px 20px;border-bottom:1px solid #e8edf3;display:flex;align-items:center;gap:8px}.echo-card-title{font-size:16px;font-weight:600;color:#1a2b4b}.echo-card-body{padding:20px}.metric-cards-dynamic{display:grid;gap:16px;margin-bottom:24px;align-items:stretch}.metric-card-dynamic{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:20px;display:flex;flex-direction:column;max-height:420px;cursor:pointer;transition:border-color .2s,box-shadow .2s}.metric-card-dynamic:hover{border-color:#00a3ff;box-shadow:0 2px 8px #00a3ff14}.metric-card-content{flex:1;min-height:0;overflow-y:auto;padding-right:6px}.metric-card-content::-webkit-scrollbar{width:4px}.metric-card-content::-webkit-scrollbar-track{background:transparent}.metric-card-content::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:4px}.metric-card-title{font-size:14px;font-weight:700;color:#1a2b4b;margin-bottom:4px;line-height:1.3}.metric-card-subtitle{font-size:11px;color:#667085;margin-bottom:12px;font-weight:500}.metric-info-icon{position:relative;color:#98a2b3;cursor:pointer;flex-shrink:0;padding:2px;transition:color .15s}.metric-info-icon:hover{color:#00a3ff}.metric-info-icon:hover .metric-info-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.metric-info-tooltip{position:absolute;top:calc(100% + 6px);right:0;z-index:100;min-width:200px;max-width:260px;padding:10px 12px;background:#1a2b4b;color:#fff;font-size:11.5px;line-height:1.5;border-radius:8px;box-shadow:0 4px 16px #0000002e;opacity:0;visibility:hidden;transform:translateY(-4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none}.metric-info-tooltip:before{content:\"\";position:absolute;top:-5px;right:6px;width:10px;height:10px;background:#1a2b4b;transform:rotate(45deg);border-radius:2px}.metric-bool-row{margin-bottom:10px;cursor:pointer}.metric-dot{width:7px;height:7px;border-radius:50%;background:#00a3ff;flex-shrink:0}.metric-score{font-weight:700;font-size:15px}.metric-status-badge{font-size:10px;font-weight:700;padding:3px 10px;border-radius:20px;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;flex-shrink:0}.metric-card-desc{font-size:13px;color:#475467;line-height:1.6;margin:12px 0 8px}.metric-card-short-desc{font-size:12px;color:#98a2b3;font-style:italic;line-height:1.5;margin:4px 0 0}.metric-count{font-size:11px;color:#667085;min-width:20px;text-align:right;font-weight:500}.metric-progress-track{height:6px;border-radius:4px;background:#e2e8f2;overflow:hidden}.metric-progress-fill{height:100%;background:#00a3ff;border-radius:4px;transition:width .5s ease}.funnel-chart{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:4px 0}.bbt-wrap{display:flex;flex-direction:column}.bbt-row{display:grid;grid-template-columns:140px 1fr 50px;align-items:center;padding:12px 14px;border-bottom:1px solid #F1F5F9;transition:background .15s}.bbt-row:last-child{border-bottom:none}.bbt-row:hover{background:#f8fafc}.bbt-row:nth-child(2n){background:#f8fafc}.bbt-row:nth-child(2n):hover{background:#eff6ff}.bbt-brand{font-size:13px;font-weight:700;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bbt-chips{display:flex;flex-wrap:nowrap;gap:6px;overflow:hidden;min-width:0}.bbt-chip{padding:3px 12px;border-radius:999px;background:#fff;border:1px solid #BAE6FD;color:#0284c7;font-size:12px;font-weight:500;white-space:nowrap;flex-shrink:0}.bbt-chip--more{background:#e9f4fe;border-color:#7dd3fc;color:#0369a1;font-weight:600;cursor:pointer}.bbt-float-tooltip{position:fixed;transform:translate(-50%,-100%);background:#1f2937;color:#fff;padding:6px 10px;border-radius:6px;box-shadow:0 6px 18px #0f172a38;display:flex;flex-direction:column;gap:2px;max-width:220px;width:max-content;font-size:11px;font-weight:500;line-height:1.35;text-align:left;pointer-events:none;z-index:9999}.bbt-float-tooltip:after{content:\"\";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#1f2937}.bbt-chip-tooltip-item{display:block;white-space:normal;word-break:break-word}.bbt-count{font-size:14px;font-weight:500;color:#94a3b8;text-align:right}.metric-card-dynamic--wide{grid-column:span 2}@media (max-width: 992px){.metric-card-dynamic--wide{grid-column:span 1}}.bbb-wrap{display:grid;grid-template-columns:minmax(170px,1fr) 1.4fr minmax(170px,1fr);gap:18px;align-items:center}.bbb-list{border-right:1px solid #E4E7EC;padding-right:12px;max-height:280px;overflow-y:auto}.bbb-list-row{padding:10px 12px;border-radius:6px;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbb-list-row:hover{background:#f8fafc}.bbb-list-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbb-list-label{display:inline-block;max-width:100%;white-space:normal;word-break:break-word;line-height:1.3}.bbb-pie-col{display:flex;align-items:center;justify-content:center;padding:8px 0}.bbb-pie-wrap{width:190px;height:190px;max-width:100%}.bbb-pie{width:100%;height:100%;display:block;filter:drop-shadow(0 2px 6px rgba(14,165,233,.12))}.bbb-pie path{cursor:pointer;transition:opacity .15s,transform .15s;transform-origin:50px 50px}.bbb-pie path:hover{opacity:.9}.bbb-pie-slice--active{opacity:1!important;transform:scale(1.04)}.bbb-legend{display:flex;flex-direction:column;gap:6px}.bbb-legend-row{display:flex;align-items:center;gap:8px;padding:3px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbb-legend-row:hover{background:#f8fafc}.bbb-legend-row--active{background:#e9f4fe}.bbb-legend-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.bbb-legend-label{flex:1}.bbb-legend-pct{font-weight:700;color:#101828}.bbc-wrap{display:grid;grid-template-columns:minmax(160px,1fr) 1.4fr;gap:18px;align-items:stretch}.bbc-keyword-list{border-right:1px solid #E4E7EC;padding-right:14px;max-height:280px;overflow-y:auto}.bbc-keyword-row{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-radius:0;border-bottom:1px solid #EAECF0;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbc-keyword-row:last-child{border-bottom:none}.bbc-keyword-row:hover{background:#f8fafc}.bbc-keyword-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbc-keyword-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-right:10px}.bbc-keyword-count{color:#667085;font-weight:500;font-size:13px}.bbc-keyword-row--active .bbc-keyword-count{color:#0077e6}.bbc-chart-side{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;padding:8px 4px}.bbc-donut-wrap{position:relative;width:150px;height:150px}.bbc-donut{width:100%;height:100%}.bbc-donut-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none}.bbc-donut-pct{font-size:20px;font-weight:700;color:#101828;line-height:1}.bbc-donut-cap{font-size:11px;color:#667085;margin-top:3px}.bbc-legend{width:100%;display:flex;flex-direction:column;gap:6px}.bbc-legend-row{display:flex;align-items:center;gap:8px;padding:4px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbc-legend-row:hover{background:#f8fafc}.bbc-legend-row--active{background:#e9f4fe}.bbc-legend-dot{width:10px;height:10px;border-radius:50%;border:2px solid #8AD8FF;background:transparent;flex-shrink:0}.bbc-legend-label{flex:1}.bbc-legend-pct{font-weight:600;color:#0077e6}.funnel-stage{width:100%;display:flex;justify-content:flex-start;cursor:pointer}.funnel-bar{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-radius:6px;min-height:36px;overflow:visible;transition:width .5s ease,opacity .2s}.funnel-bar:hover{opacity:.85}.funnel-label-wrap{position:relative;flex:1;min-width:0;overflow:visible}.funnel-label-wrap .funnel-tooltip{position:absolute;bottom:calc(100% + 10px);left:0;padding:6px 10px;background:#1a2b4b;color:#fff;font-size:11.5px;font-weight:600;border-radius:6px;white-space:nowrap;box-shadow:0 4px 12px #0000002e;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none;z-index:100}.funnel-label-wrap .funnel-tooltip:after{content:\"\";position:absolute;top:100%;left:12px;width:8px;height:8px;background:#1a2b4b;transform:translateY(-50%) rotate(45deg);border-radius:1px}.funnel-label-wrap:hover .funnel-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.funnel-label{font-size:12px;font-weight:600;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.funnel-value{font-size:13px;font-weight:700;color:#fff;flex-shrink:0;margin-left:8px}.numeric-stat-strip{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:12px;margin-bottom:14px}.numeric-stat-tile{background:#fff;border:1px solid #EAECF0;border-left:3px solid #CBD5E1;border-radius:8px;padding:14px 16px;min-width:0}.numeric-stat-label{font-size:10px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:#667085;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-stat-value{font-size:26px;font-weight:800;line-height:1;margin-bottom:8px}.numeric-stat-max{font-size:14px;font-weight:600;color:#98a2b3;margin-left:2px}.numeric-stat-sub{font-size:11px;color:#667085;line-height:1.4;white-space:normal;word-break:break-word}.numeric-score-row{padding:10px 0;border-bottom:1px solid #f0f4ff;cursor:pointer;transition:background .15s}.numeric-score-row:last-child{border-bottom:none}.numeric-score-row:hover{background:#f8fafc;margin:0 -12px;padding:10px 12px;border-radius:6px}.metric-big-number{font-weight:800;font-size:36px;color:#00a3ff;line-height:1}.metric-avg-label{font-size:12px;color:#667085;margin-left:4px}@media (max-width: 992px){.metric-cards-dynamic{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.metric-cards-dynamic{grid-template-columns:1fr!important}}.subjective-wrap{cursor:pointer;max-height:120px;overflow:hidden}.subjective-row{padding:4px 0;font-size:12px;color:#475467;border-bottom:1px solid #f0f4ff;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.metric-card-name{font-size:14px;font-weight:600;color:#1a2b4b}.agents-table-header{display:grid;align-items:center;padding:10px 20px;border-bottom:1px solid #e8edf3;background:#f8fafc}.agents-table-cell{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;text-transform:uppercase}.agents-table-row{display:grid;align-items:center;padding:14px 20px;border-bottom:1px solid #e8edf3;cursor:pointer;transition:background .15s}.agents-table-row:hover{background:#f8fafc}.agents-table-row:last-child{border-bottom:none}.status-dot{width:8px;height:8px;border-radius:50%}.status-dot.active{background:#10b981}.status-dot.pending{background:#f59e0b}.status-dot.paused{background:#98a2b3}.tango-ai-header{display:flex;flex-direction:column;align-items:center;gap:10px;padding:20px 0}.tango-ai-logo{width:52px;height:52px;border-radius:16px;background:linear-gradient(135deg,#794fd9,#33b1f7);display:flex;align-items:center;justify-content:center;box-shadow:0 4px 16px #794fd933}.tango-ai-title{font-size:22px;font-weight:800;color:#1a2b4b;line-height:1.2}.tango-ai-subtitle{font-size:13px;color:#667085;margin-top:4px}.echo-search-card{display:flex;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:10px 12px 10px 20px;margin-bottom:20px;box-shadow:0 1px 2px #1018280d}.echo-search-input{flex:1;border:none;outline:none;font-size:14px;color:#101828}.echo-search-input::placeholder{color:#98a2b3}.echo-search-slash{width:28px;height:28px;border-radius:50%;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:600;color:#667085;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;margin-right:6px}.echo-search-send{width:32px;height:32px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:background .2s}.echo-search-send:hover{background:#0087d5}.echo-search-send:disabled{opacity:.5;cursor:not-allowed}.echo-ai-response{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:16px 20px;margin-bottom:16px}.echo-ai-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.echo-conv-count{font-size:14px;font-weight:700;color:#00a3ff;margin-bottom:16px}.typing{display:flex;gap:4px;align-items:center;padding:4px 0}.typing-dot{width:6px;height:6px;border-radius:50%;background:#00a3ff;animation:pulse 1.2s ease-in-out infinite}.typing-dot:nth-child(2){animation-delay:.2s}.typing-dot:nth-child(3){animation-delay:.4s}@keyframes pulse{0%,to{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}:host ::ng-deep lib-pagination{margin-top:16px;display:block}.agent-dropdown-wrap{position:relative}.agent-dropdown-trigger{display:flex;align-items:center;gap:8px;padding:7px 12px;border:1.5px solid #D0D5DD;border-radius:8px;background:#fff;cursor:pointer;max-width:280px;transition:border-color .15s}.agent-dropdown-trigger:hover{border-color:#00a3ff}.agent-dropdown-menu{position:absolute;top:calc(100% + 6px);right:0;background:#fff;border:1px solid #D0D5DD;border-radius:10px;box-shadow:0 8px 24px #0000001f;width:300px;z-index:300;overflow:hidden}.agent-dd-header{padding:8px 14px;font-size:11px;font-weight:600;color:#98a2b3;letter-spacing:.5px;border-bottom:1px solid #e8edf3;text-transform:uppercase}.agent-dd-item{display:flex;align-items:center;gap:10px;padding:10px 14px;cursor:pointer;transition:background .1s}.agent-dd-item:hover{background:#f8fafc}.agent-dd-item.selected{background:#f0f4ff}.agent-dd-name{font-size:13px;font-weight:600;color:#344054;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-dd-meta{font-size:12px;color:#98a2b3;margin-top:1px}.fbar-pill{display:flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;font-size:13px;font-weight:600;color:#344054;cursor:pointer;transition:all .15s;white-space:nowrap}.fbar-pill:hover,.fbar-pill.active{border-color:#1a73e8;color:#1a73e8;background:#f0f4ff}.echo-sub-header{display:flex;align-items:center;padding:12px 0 16px;gap:10px}.btn-back{background:none;border:none;cursor:pointer;display:flex;align-items:center;color:#1a73e8;padding:4px 6px;border-radius:8px}.sub-header-title{font-size:15px;font-weight:600;color:#1a2b4b}.drawer-overlay{position:fixed;inset:0;background:#0000004d;z-index:200}.af-drawer{position:fixed;top:0;right:0;bottom:0;width:380px;max-width:95vw;background:#fff;z-index:201;display:flex;flex-direction:column;box-shadow:-8px 0 40px #00000026;animation:slideInRight .25s ease-out;overflow:hidden}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}.af-footer{padding:14px 16px;border-top:1px solid #e8edf3;display:flex;align-items:center;justify-content:flex-end;background:#fff}.af-cancel{padding:9px 20px;border-radius:8px;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:500;cursor:pointer;color:#344054}@media (max-width: 768px){.metric-cards-grid{grid-template-columns:1fr}.agents-table-header,.agents-table-row{grid-template-columns:1fr 80px}}.flex-spacer{flex:1}.text-center{text-align:center}.echo-empty-state{text-align:center;padding:40px;color:#94a3b8}.echo-empty-state--muted{text-align:center;padding:40px;color:#667085}.echo-empty-state--sm{text-align:center;padding:40px;color:#94a3b8;font-size:13px}.echo-empty-state--muted-sm{text-align:center;padding:40px;color:#667085;font-size:13px}.echo-empty-state--compact{text-align:center;padding:32px;color:#667085;font-size:13px}.echo-nodata-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 20px;text-align:center}.echo-nodata-img{width:120px;height:auto;margin-bottom:16px;opacity:.85}.echo-nodata-title{font-size:15px;font-weight:700;color:#1a2b4b;margin-bottom:6px}.echo-nodata-sub{font-size:13px;color:#667085;line-height:1.5}.tango-ai-header-text{text-align:center}.conv-header-body{flex:1;min-width:0}.conv-meta-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:4px}.meta-tag--duration{background:#ede9fe;color:#8b5cf6;border-color:#ddd6fe;font-weight:700}.conv-description{font-size:12.5px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.conv-body-padding{padding:14px 16px}.ai-insights-section{margin-top:16px}.ai-insights-label{font-size:11px;font-weight:700;color:#667085;letter-spacing:.5px;text-transform:uppercase;margin-bottom:10px}.ai-insight-row{display:flex;align-items:flex-start;gap:8px;margin-bottom:8px}.ai-insight-dot{width:6px;height:6px;border-radius:50%;margin-top:5px;flex-shrink:0}.ai-insight-text{font-size:13px;color:#475467;line-height:1.5}.analytics-overview-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.analytics-overview-title{font-size:17px;font-weight:700;color:#1a2b4b}.analytics-overview-subtitle{font-size:12px;color:#667085}.echo-search-wrap{width:220px;display:flex;align-items:center;gap:8px;border:1px solid #D0D5DD;border-radius:8px;padding:6px 12px;background:#fff}.echo-search-wrap--wide{width:280px;display:flex;align-items:center;gap:8px;border:1px solid #E2E8F2;border-radius:8px;padding:6px 12px;background:#fff}.echo-inline-input{flex:1;border:none;background:transparent;font-size:13px;color:#344054;outline:none;min-width:0}.echo-inline-input--small{flex:1;border:none;background:transparent;font-size:12px;color:#344054;outline:none;min-width:0}.analytics-card-top-row{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:8px}.analytics-card-name{font-size:13.5px;font-weight:700;color:#1a2b4b;flex:1;padding-right:8px;line-height:1.3}.analytics-card-badge-active{font-size:9px;font-weight:700;padding:2px 8px;border-radius:20px;background:#d1fae5;color:#065f46;text-transform:uppercase;letter-spacing:.5px;flex-shrink:0}.analytics-card-spacer{padding:8px 14px}.analytics-card-footer{padding:8px 14px;border-top:1px solid #e8edf3;display:flex;justify-content:flex-end}.detail-header-bar{display:flex;align-items:center;gap:12px;margin-bottom:20px;padding:14px 20px;background:#fff;border-radius:10px;border:1px solid #e8edf3}.detail-back-btn{background:none;border:none;cursor:pointer;color:#00a3ff;font-size:18px;padding:0}.detail-header-title{font-size:16px;font-weight:700;color:#1a2b4b}.detail-header-conv-count{font-size:13px;color:#667085}.cohort-dd-dot{width:8px;height:8px;border-radius:50%;background:#10b981;flex-shrink:0}.cohort-dd-trigger-name{font-size:13px;font-weight:600;color:#1a2b4b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cohort-dd-search-wrap{padding:8px 10px;border-bottom:1px solid #e8edf3}.cohort-dd-search-inner{display:flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid #D0D5DD;border-radius:6px;background:#fff}.cohort-dd-scroll{max-height:240px;overflow-y:auto}.cohort-dd-item-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.cohort-dd-item-body{flex:1;min-width:0}.cohort-dd-no-results{padding:16px;text-align:center;font-size:12px;color:#667085}.cohort-dd-backdrop{position:fixed;inset:0;z-index:299}.metric-card-header-row{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.metric-card-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.metric-row-flex{display:flex;align-items:center;gap:6px;margin-bottom:4px}.metric-row-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.metric-row-label{font-size:13px;color:#344054;flex:1}.metric-score--teal{color:#00a3ff}.numeric-row-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.numeric-row-name{font-size:13px;color:#344054;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-row-value{font-size:15px;font-weight:800;color:#00a3ff;flex-shrink:0;margin-left:8px}.numeric-row-max{font-size:12px;font-weight:600;color:#98a2b3}.numeric-progress-track{position:relative;height:5px;border-radius:4px;background:#e2e8f2}.numeric-progress-fill{position:absolute;left:0;top:0;height:100%;border-radius:4px;background:linear-gradient(90deg,#00a3ff,#33b1f7)}.pitch-keyword-count{font-size:11px;color:#667085;margin-bottom:8px}.pitch-row-label{font-size:12.5px;color:#344054;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pitch-row-desc{font-size:12px;font-weight:700;color:#667085;flex-shrink:0}.funnel-value-count{opacity:.8;font-weight:500}.detail-conv-section-header{padding:16px 20px;display:flex;align-items:center;gap:8px;background:#fff;border-radius:10px;border:1px solid #e8edf3;margin-bottom:12px}.detail-conv-section-title{font-size:15px;font-weight:700;color:#1a2b4b}.detail-content-split{display:flex}.detail-content-left{flex:3;padding:14px 20px;min-width:0;border-right:1px solid #e8edf3}.detail-content-right{flex:1;min-width:220px;max-width:350px;padding:16px;overflow-y:auto;max-height:500px}.detail-meta-row{display:flex;align-items:center;gap:5px;flex:1;min-width:0;flex-wrap:wrap}.summary-text--prewrap{white-space:pre-wrap}.metrics-panel-label{font-size:10px;font-weight:700;color:#00a3ff;letter-spacing:.5px;text-transform:uppercase;margin-bottom:12px}.metric-item-wrap{margin-bottom:8px;padding:6px 0;border-bottom:1px solid #f0f4ff}.metric-single-row{display:flex;align-items:center;gap:8px}.metric-single-name{font-size:12px;font-weight:600;color:#344054;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-single-value{font-size:12px;font-weight:700;flex-shrink:0}.metric-multi-header{font-size:11px;font-weight:700;color:#344054;margin-bottom:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-row{display:flex;align-items:center;gap:8px;padding:3px 0}.metric-multi-name{font-size:11px;color:#667085;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-value{font-size:11px;font-weight:700;flex-shrink:0}.metric-fallback-row{display:flex;justify-content:space-between;margin-bottom:6px}.metric-fallback-label{font-size:12px;color:#667085}.metric-fallback-value{font-size:12px;font-weight:600;color:#344054}.metric-detail-loading{font-size:11px;color:#667085}.manage-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.manage-title{font-family:Outfit,sans-serif;font-weight:700;font-size:17px}.manage-subtitle{font-size:12px;color:#94a3b8}.manage-search-input{flex:1;border:none;background:transparent;font-size:13px;font-family:Nunito Sans,sans-serif;color:#0f172a;outline:none;min-width:0}.agents-table-4col{grid-template-columns:minmax(0,1fr) 120px 120px 80px}.agents-table-cell--center{text-align:center}.agent-cell-name-wrap{min-width:0}.agent-cell-name{font-family:Outfit,sans-serif;font-weight:700;font-size:13.5px;color:#0f172a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-desc{font-size:11px;color:#94a3b8;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-metrics{text-align:center;font-family:Outfit,sans-serif;font-weight:700;font-size:13px;color:#0f172a}.agent-cell-source{text-align:center;font-size:11.5px;color:#334155;font-weight:600}.agent-cell-action{text-align:center}.agent-delete-btn{background:none;border:none;cursor:pointer;color:#ef4444;font-size:11px;font-weight:700}.manage-no-results{padding:32px;text-align:center;color:#94a3b8;font-size:13px}.drawer-header{padding:16px;border-bottom:1px solid #E2E8F2;display:flex;align-items:center;justify-content:space-between}.drawer-header-title{font-family:Outfit,sans-serif;font-weight:700;font-size:15px}.drawer-close-btn{background:none;border:none;cursor:pointer;color:#94a3b8;font-size:18px}.drawer-body{padding:16px;flex:1;overflow-y:auto}.drawer-placeholder-text{font-size:13px;color:#94a3b8}\n"] }]
|
|
1129
|
+
args: [{ selector: 'lib-tango-echo', template: "<div class=\"echo-page\">\n <!-- Floating tooltip for BOOLEAN_BASKET_TABLE overflow chips -->\n <div class=\"bbt-float-tooltip\"\n *ngIf=\"bbtTooltip.visible\"\n [style.left.px]=\"bbtTooltip.x\"\n [style.top.px]=\"bbtTooltip.y\">\n <span *ngFor=\"let ov of bbtTooltip.items\" class=\"bbt-chip-tooltip-item\">{{ ov }}</span>\n </div>\n <div class=\"echo-content\">\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 CONVERSATIONS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'conversations'\">\n\n <!-- Tango AI Header -->\n <div class=\"tango-ai-header\">\n <div class=\"tango-ai-logo\">\n <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#fff\" stroke-width=\"1.8\" stroke-linecap=\"round\"><path d=\"M12 2l2.09 6.26L20 10l-5.91 1.74L12 18l-2.09-6.26L4 10l5.91-1.74L12 2z\"/></svg>\n </div>\n <div class=\"tango-ai-header-text\">\n <div class=\"tango-ai-title\">Tango AI</div>\n <div class=\"tango-ai-subtitle\">Analyse conversations, stores & staff performance</div>\n </div>\n </div>\n\n <!-- Search Card -->\n <div class=\"echo-search-card\">\n <input type=\"text\" class=\"echo-search-input\" placeholder=\"Ask anything... 'Which stores are not performing well?'\" [(ngModel)]=\"convSearchQuery\" (keyup.enter)=\"sendConvQuery()\">\n <button class=\"echo-search-send\" (click)=\"sendConvQuery()\" [disabled]=\"!convSearchQuery?.trim()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>\n </svg>\n </button>\n </div>\n\n <!-- AI Response -->\n <div class=\"echo-ai-response\" *ngIf=\"convAiLoading || convAiReply\">\n <div *ngIf=\"convAiLoading\" class=\"typing\">\n <span class=\"typing-dot\"></span><span class=\"typing-dot\"></span><span class=\"typing-dot\"></span>\n </div>\n <p *ngIf=\"!convAiLoading && convAiReply\" class=\"echo-ai-text\">{{ convAiReply }}</p>\n </div>\n\n <!-- Total count -->\n <div class=\"echo-conv-count\">{{ convTotal }} Conversations</div>\n\n <!-- Conversations list area -->\n <div class=\"conversations-section\">\n\n <!-- Loading -->\n <div *ngIf=\"convLoading\" class=\"echo-empty-state\">Loading conversations...</div>\n\n <!-- Conversation cards (dynamic from API \u2014 same pattern as transcript-list) -->\n <div *ngFor=\"let conv of conversations; trackBy: trackById\" class=\"conv-card\">\n <div class=\"conv-header\" (click)=\"toggleConvExpand(conv.audioId)\">\n <div class=\"conv-header-body\">\n <div class=\"conv-meta-row\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.userName\">{{ conv.userName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag meta-tag--duration\" *ngIf=\"conv.duration\">{{ conv.duration }}</span>\n </div>\n <div class=\"conv-description\">\n {{ conv.audioDescription || 'No description available' }}\n </div>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"expandedConvIds[conv.audioId]\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body (unified layout matching Agent Analysis design) -->\n <div *ngIf=\"expandedConvIds[conv.audioId]\" class=\"conv-body-expanded\">\n\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\">\n </div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Summary Content -->\n <div class=\"conv-body-padding\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No data -->\n <div *ngIf=\"!convLoading && conversations.length === 0\" class=\"echo-empty-state--sm\">No conversations found.</div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"convTotal > 0\" [itemsPerPage]=\"convPerPage\" [currentPage]=\"convPage\" [totalItems]=\"convTotal\"\n [paginationSizes]=\"convPaginationSizes\" [pageSize]=\"convPerPage\" (pageChange)=\"onConvPageChange($event)\"\n (pageSizeChange)=\"onConvPageSizeChange($event)\"></lib-pagination>\n </div> <!-- end conversations-section -->\n </ng-container>\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 AGENT ANALYSIS TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'agentanalysis'\">\n\n <!-- \u2500\u2500 OVERVIEW: Agent Cards Grid \u2500\u2500 -->\n <ng-container *ngIf=\"!detailView\">\n <div class=\"analytics-overview-header\">\n <div>\n <div class=\"analytics-overview-title\">Analytics Overview</div>\n <div class=\"analytics-overview-subtitle\">{{ activeCohorts.length }} active agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"analysisSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input\">\n </div>\n </div>\n\n <div *ngIf=\"cohortList.length === 0\" class=\"echo-empty-state--muted\">Loading agents...</div>\n\n <div class=\"analytics-grid\" [style.grid-template-columns]=\"'repeat(' + Math.min(cohortList.length, 4) + ', 1fr)'\">\n <ng-container *ngFor=\"let cohort of cohortList; trackBy: trackById\">\n <div class=\"analytics-card\" *ngIf=\"!analysisSearch || (cohort.cohortName || cohort.name || '').toLowerCase().includes(analysisSearch.toLowerCase())\" (click)=\"selectCohortDetail(cohort)\">\n <div class=\"analytics-card-header\">\n <div class=\"analytics-card-top-row\">\n <div class=\"analytics-card-name\">{{ cohort.cohortName || cohort.name }}</div>\n <span class=\"analytics-card-badge-active\">Active</span>\n </div>\n <!-- metrics & stores badges hidden for now -->\n </div>\n <div class=\"analytics-card-spacer\"></div>\n <div class=\"analytics-card-footer\">\n <span class=\"analytics-hover-link\">View analytics \u2192</span>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n\n <!-- \u2500\u2500 DETAIL: Selected Cohort Metrics + Conversations \u2500\u2500 -->\n <ng-container *ngIf=\"detailView\">\n\n <!-- Header: \u2190 Back + Title + Conversations + Dropdown -->\n <div class=\"detail-header-bar\">\n <button class=\"detail-back-btn\" (click)=\"backToOverview()\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M15 18l-6-6 6-6\"/></svg>\n </button>\n <span class=\"detail-header-title\">{{ selectedCohortName }}</span>\n <span class=\"flex-spacer\"></span>\n <span class=\"detail-header-conv-count\">Total Conversations: {{ totalAudio }}</span>\n\n <!-- Cohort Dropdown -->\n <div class=\"agent-dropdown-wrap\">\n <div class=\"agent-dropdown-trigger\" (click)=\"toggleCohortDropdown()\">\n <div class=\"cohort-dd-dot\"></div>\n <span class=\"cohort-dd-trigger-name\">{{ selectedCohortName || 'Select Agent' }}</span>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#667085\" stroke-width=\"2.5\" stroke-linecap=\"round\" [style.transform]=\"cohortDropdownOpen ? 'rotate(180deg)' : 'none'\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n <div class=\"agent-dropdown-menu\" *ngIf=\"cohortDropdownOpen\">\n <div class=\"cohort-dd-search-wrap\">\n <div class=\"cohort-dd-search-inner\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"cohortDropdownSearch\" placeholder=\"Search agents\u2026\" class=\"echo-inline-input--small\">\n </div>\n </div>\n <div class=\"cohort-dd-scroll\">\n <div *ngFor=\"let c of filteredDropdownCohorts; trackBy: trackById\" class=\"agent-dd-item\" [class.selected]=\"(c.cohortId || c.id || c._id) === selectedCohortId\" (click)=\"selectCohortFromDropdown(c)\">\n <div class=\"cohort-dd-item-dot\" [style.background]=\"c.metricsAdded > 0 ? '#10B981' : '#D0D5DD'\"></div>\n <div class=\"cohort-dd-item-body\">\n <div class=\"agent-dd-name\">{{ c.cohortName || c.name }}</div>\n <div class=\"agent-dd-meta\">{{ c.metricsAdded || 0 }} metrics</div>\n </div>\n <svg *ngIf=\"(c.cohortId || c.id || c._id) === selectedCohortId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#00A3FF\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M20 6L9 17l-5-5\"/></svg>\n </div>\n <div *ngIf=\"filteredDropdownCohorts.length === 0\" class=\"cohort-dd-no-results\">No agents found</div>\n </div>\n </div>\n <div *ngIf=\"cohortDropdownOpen\" class=\"cohort-dd-backdrop\" (click)=\"closeCohortDropdown()\"></div>\n </div>\n </div>\n\n <!-- Loading -->\n <div *ngIf=\"cardsLoading\" class=\"echo-empty-state--muted\">Loading metrics...</div>\n\n <!-- Numeric scores \u2014 full-width stat strip above cards -->\n <div *ngIf=\"!cardsLoading && numericStripCard?.numericRows?.length\" class=\"numeric-stat-strip\">\n <div *ngFor=\"let row of numericStripCard.numericRows; let i = index\"\n class=\"numeric-stat-tile\"\n [style.border-left-color]=\"getNumericTileColor(i)\">\n <div class=\"numeric-stat-label\">{{ row.name }}</div>\n <div class=\"numeric-stat-value\" [style.color]=\"getNumericTileColor(i)\">\n {{ row.avg }}<span *ngIf=\"row.max !== null\" class=\"numeric-stat-max\">/{{ row.max }}</span>\n </div>\n <div class=\"numeric-stat-sub\" *ngIf=\"row.max !== null && row.min !== null\">\n scale {{ row.min }}\u2013{{ row.max }}{{ row.description ? ' \u00B7 ' + row.description : '' }}\n </div>\n </div>\n </div>\n\n <!-- Metric Cards (dynamic columns based on card count) -->\n <div *ngIf=\"!cardsLoading && nonNumericCards.length > 0\" class=\"metric-cards-dynamic\"\n [style.grid-template-columns]=\"'repeat(' + Math.min(nonNumericCards.length, 4) + ', 1fr)'\">\n <div *ngFor=\"let card of nonNumericCards; trackBy: trackById\" class=\"metric-card-dynamic\"\n [class.metric-card-dynamic--wide]=\"card.type === 'BOOLEAN_BASKET_BAR' || card.type === 'BOOLEAN_BASKET_TABLE'\">\n <!-- Card Header: Title + Status Badge + Info -->\n <div class=\"metric-card-header-row\">\n <div class=\"metric-card-title\">{{ card.name }}</div>\n <div class=\"metric-card-actions\">\n <span *ngIf=\"card.status\" class=\"metric-status-badge\"\n [style.background]=\"getStatusBadge(card.status).bg\"\n [style.color]=\"getStatusBadge(card.status).color\">{{ card.status }}</span>\n <button type=\"button\" class=\"metric-export-btn\"\n *ngIf=\"card.type === 'BOOLEAN_BASKET_TABLE'\"\n title=\"Export to Excel\"\n (click)=\"exportBbtCard(card)\"><span>Export</span> \n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><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>\n </button>\n <div class=\"metric-info-icon\" *ngIf=\"card.description\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/><line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/></svg>\n <div class=\"metric-info-tooltip\">\n <div>{{ card.description }}</div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"metric-card-subtitle\" *ngIf=\"card.type !== 'NUMERIC_SCALAR' && card.type !== 'NUMERIC_ARRAY'\">{{ card.applicableCount ?? totalAudio }} conversations</div>\n\n <div class=\"metric-card-content\">\n <!-- BOOLEAN_BASKET_TABLE \u2014 brand rows with attribute chips + count -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_TABLE'\">\n <div class=\"bbt-wrap\">\n <div *ngFor=\"let row of card.tableRows\" class=\"bbt-row\">\n <div class=\"bbt-brand\" [title]=\"row.brand\">{{ row.brand }}</div>\n <div class=\"bbt-chips\">\n <span *ngFor=\"let chip of row.visibleChips\" class=\"bbt-chip\">{{ chip }}</span>\n <span *ngIf=\"row.overflowCount > 0\" class=\"bbt-chip bbt-chip--more\"\n (mouseenter)=\"showBbtTooltip($event, row.overflowChips)\"\n (mouseleave)=\"hideBbtTooltip()\">\n +{{ row.overflowCount }}\n </span>\n </div>\n <div class=\"bbt-count\">{{ row.count }}</div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET_BAR \u2014 category list + pie chart + legend -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_BAR'\">\n <div class=\"bbb-wrap\">\n <div class=\"bbb-list\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-list-row\"\n [class.bbb-list-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-list-label\" [title]=\"slice.label\">{{ slice.label }}</span>\n </div>\n </div>\n <div class=\"bbb-pie-col\">\n <div class=\"bbb-pie-wrap\">\n <svg class=\"bbb-pie\" viewBox=\"0 0 100 100\">\n <path *ngFor=\"let slice of card.pieSlices\"\n [attr.d]=\"slice.path\"\n [attr.fill]=\"slice.color\"\n stroke=\"#ffffff\"\n stroke-width=\"0.8\"\n [class.bbb-pie-slice--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\"></path>\n </svg>\n </div>\n </div>\n <div class=\"bbb-legend\">\n <div *ngFor=\"let slice of card.pieSlices\"\n class=\"bbb-legend-row\"\n [class.bbb-legend-row--active]=\"card.selectedPieLabel === slice.label\"\n (click)=\"selectPieSlice(card, slice)\">\n <span class=\"bbb-legend-dot\" [style.background]=\"slice.color\"></span>\n <span class=\"bbb-legend-label\">{{ slice.label }}</span>\n <span class=\"bbb-legend-pct\">{{ slice.percent }}%</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- Boolean_basket_chart \u2014 keyword list + sentiment donut -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET_CHART'\">\n <div class=\"bbc-wrap\">\n <div class=\"bbc-keyword-list\">\n <div *ngFor=\"let row of card.keywordRows\"\n class=\"bbc-keyword-row\"\n [class.bbc-keyword-row--active]=\"card.selectedKeyword === row.label\"\n (click)=\"selectBasketKeyword(card, row)\">\n <span class=\"bbc-keyword-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"bbc-keyword-count\">{{ row.count }}</span>\n </div>\n </div>\n <div class=\"bbc-chart-side\">\n <div class=\"bbc-bar-list\">\n <div *ngFor=\"let slice of card.selectedSlices\"\n class=\"bbc-bar-row\"\n [class.bbc-bar-row--active]=\"card.selectedSentiment?.key === slice.key\"\n (click)=\"selectBasketSentiment(card, slice)\">\n <div class=\"bbc-bar-header\">\n <span class=\"bbc-bar-label\">\n <span class=\"bbc-bar-dot\" [style.background]=\"slice.color\"></span>\n {{ slice.label }}\n </span>\n <span class=\"bbc-bar-pct\">{{ slice.percent }}%</span>\n </div>\n <div class=\"bbc-bar-track\">\n <div class=\"bbc-bar-fill\"\n [style.width.%]=\"slice.percent\"\n [style.background]=\"slice.color\"></div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 Funnel Chart (left-aligned) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && card.isFunnel\">\n <div class=\"funnel-chart\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"funnel-stage\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"funnel-bar\" [title]=\"row.label\"\n [style.width.%]=\"card.booleanRows[0]?.responses > 0 ? (row.responses / card.booleanRows[0].responses * 100) : 100\"\n [style.background]=\"getScoreColor(row.score)\">\n <span class=\"funnel-label-wrap\">\n <span class=\"funnel-label\">{{ row.label }}</span>\n </span>\n <span class=\"funnel-value\"> <span class=\"funnel-value-count\">{{ row.responses }}</span> ({{ row.score }})% </span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- BOOLEAN_BASKET \u2014 rows with progress bars (non-funnel) -->\n <ng-container *ngIf=\"card.type === 'BOOLEAN_BASKET' && !card.isFunnel\">\n <div *ngFor=\"let row of card.booleanRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick(row.id, row.label)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n <span class=\"metric-row-label\" [title]=\"row.label\">{{ row.label }}</span>\n <span class=\"metric-score metric-score--teal\">{{ row.score }}%</span>\n <span class=\"metric-count\">{{ row.responses }}</span>\n </div>\n <div class=\"metric-progress-track\">\n <div class=\"metric-progress-fill\" [style.width.%]=\"row.score\"\n [style.background]=\"getScoreColor(row.score)\"></div>\n </div>\n </div>\n </ng-container>\n\n\n <!-- UNIQUE_PITCHES \u2014 pitch keywords tracker -->\n <ng-container *ngIf=\"card.type === 'UNIQUE_PITCHES'\">\n <div class=\"pitch-keyword-count\">{{ card.pitchRows?.length || 0 }} keywords</div>\n <div>\n <div *ngFor=\"let pitch of card.pitchRows; let i = index\" class=\"metric-bool-row\" (click)=\"onCardRowClick('', card.key)\">\n <div class=\"metric-row-flex\">\n <div class=\"metric-row-dot\"\n [style.background]=\"['#00A3FF','#10B981','#F59E0B','#EF4444','#8B5CF6','#EC4899','#06B6D4','#84CC16','#F97316','#6366F1'][i % 10]\"></div>\n <span class=\"pitch-row-label\">{{ pitch.id }}</span>\n <span class=\"pitch-row-desc\">{{ pitch.desc ? pitch.desc.slice(0, 60) : '\u2013' }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <!-- SUBJECTIVE -->\n <ng-container *ngIf=\"card.type === 'SUBJECTIVE' || card.type === 'SUBJECTIVE_COUNT'\">\n <div class=\"subjective-wrap\" (click)=\"onCardRowClick('', card.key)\">\n <div *ngFor=\"let row of card.subjectiveRows?.slice(0, 2)\" class=\"subjective-row\">\n \u2022 {{ row.reasoning || row.store_id }}\n </div>\n </div>\n </ng-container>\n </div><!-- end metric-card-content -->\n </div>\n </div>\n\n <!-- Full no-data state: no cards AND no conversations -->\n <div *ngIf=\"!cardsLoading && !detailLoading && cohortCards.length === 0 && detailPageConvs.length === 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No analysis data or conversations available for the selected date range and stores.</div>\n </div>\n\n <!-- \u2500\u2500 Conversations Section (show when cards exist OR conversations exist OR loading) \u2500\u2500 -->\n <div id=\"echoConversations\" class=\"conversations-section\" *ngIf=\"cardsLoading || detailLoading || cohortCards.length > 0 || detailPageConvs.length > 0\">\n <div class=\"detail-conv-section-header\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#344054\" stroke-width=\"1.8\"><path d=\"M20 2H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h11l5 3V4a2 2 0 0 0-2-2z\"/></svg>\n <span class=\"detail-conv-section-title\">Conversations</span>\n <span class=\"flex-spacer\"></span>\n <div class=\"detail-conv-search\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#98A2B3\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input type=\"text\"\n class=\"detail-conv-search-input\"\n placeholder=\"Search conversations...\"\n [(ngModel)]=\"detailSearchValue\"\n (keyup.enter)=\"onDetailSearch()\">\n <button type=\"button\"\n class=\"detail-conv-search-clear\"\n *ngIf=\"detailSearchValue\"\n (click)=\"clearDetailSearch()\"\n title=\"Clear\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"/><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"/></svg>\n </button>\n </div>\n </div>\n\n <div *ngIf=\"detailLoading\" class=\"echo-empty-state--muted\">Loading...</div>\n\n <div *ngFor=\"let conv of detailPageConvs; trackBy: trackById\" class=\"detail-conv-card\">\n <!-- Conv header -->\n <div class=\"conv-header\" (click)=\"toggleDetailConv(conv.audioId); loadConvDetail(conv)\">\n <span class=\"conv-id\">{{ conv.audioId }}</span>\n <div class=\"detail-meta-row\">\n <span class=\"meta-tag brand\" *ngIf=\"conv.storeName\">{{ conv.storeName }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.location\">{{ conv.location }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.date\">{{ conv.date }}</span>\n <span class=\"meta-tag\" *ngIf=\"conv.time\">{{ conv.time }}</span>\n </div>\n <div class=\"conv-chevron\" [class.open]=\"detailOpenId === conv.audioId\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"2.5\" stroke-linecap=\"round\"><path d=\"M6 9l6 6 6-6\"/></svg>\n </div>\n </div>\n\n <!-- Expanded body -->\n <div *ngIf=\"detailOpenId === conv.audioId\" class=\"conv-body-expanded\">\n <!-- Waveform player -->\n <div class=\"echo-player\" *ngIf=\"conv.audioUrl\">\n <button class=\"echo-play-btn\" [class.playing]=\"playingConvId === conv.audioId\" (click)=\"togglePlay(conv.audioId)\">\n <svg *ngIf=\"playingConvId !== conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M8 5v14l11-7z\"/></svg>\n <svg *ngIf=\"playingConvId === conv.audioId\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"white\"><path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\"/></svg>\n </button>\n <div class=\"echo-waveform\" [class.wf-playing]=\"playingConvId === conv.audioId\" (click)=\"seekAudio($event, conv.audioId)\">\n <div class=\"echo-wf-bar\" *ngFor=\"let h of waveformHeights; let i = index\" [style.height.px]=\"h\"\n [class.played]=\"(playbackStates[conv.audioId]?.progress || 0) > i / waveformHeights.length\"></div>\n </div>\n <span class=\"echo-time\">\n <span *ngIf=\"playingConvId === conv.audioId && playbackStates[conv.audioId]?.currentTime\">{{ playbackStates[conv.audioId].currentTime }} / </span>{{ playbackStates[conv.audioId]?.totalTime || conv.duration || '--' }}\n </span>\n <audio [id]=\"'audio-' + conv.audioId\" [src]=\"conv.audioUrl\" preload=\"auto\"\n (timeupdate)=\"onTimeUpdate(audioEl, conv.audioId)\"\n (loadedmetadata)=\"onLoadedMetadata(audioEl, conv.audioId, conv.duration)\"\n (ended)=\"playingConvId = null\" #audioEl></audio>\n </div>\n\n <!-- Tabs -->\n <div class=\"conv-tabs\">\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'summary'\" (click)=\"setConvTab(conv.audioId, 'summary', $event)\">Summary</button>\n <button class=\"conv-tab-btn\" [class.active]=\"getConvTab(conv.audioId) === 'transcript'\" (click)=\"setConvTab(conv.audioId, 'transcript', $event)\">Transcript</button>\n </div>\n\n <!-- Content: Left (Summary/Transcript + AI Insights) + Right (Metrics) -->\n <div class=\"detail-content-split\">\n <!-- Left side -->\n <div class=\"detail-content-left\">\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'summary'\">\n <p class=\"summary-text\">{{ conv.audioDescription || conv.conversationDetails?.audioSummary || 'No summary available' }}</p>\n <!-- AI Insights -->\n <div *ngIf=\"conv.aiInsights?.summary?.length\" class=\"ai-insights-section\">\n <div class=\"ai-insights-label\">AI Insights</div>\n <div *ngFor=\"let insight of conv.aiInsights.summary\" class=\"ai-insight-row\">\n <div class=\"ai-insight-dot\" [style.background]=\"insight.type === 'positive' ? '#00A3FF' : insight.type === 'negative' ? '#EF4444' : '#F59E0B'\"></div>\n <span class=\"ai-insight-text\">{{ insight.text || insight }}</span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"getConvTab(conv.audioId) === 'transcript'\">\n <p class=\"summary-text summary-text--prewrap\">{{ cleanTranscription(conv.conversationDetails?.transcription) || 'No transcript available' }}</p>\n </ng-container>\n </div>\n <!-- Right side: Metrics (only show values that have data) -->\n <div class=\"detail-content-right\">\n <div class=\"metrics-panel-label\">Metrics</div>\n <ng-container *ngIf=\"conv.metrics?.length\">\n <div *ngFor=\"let m of conv.metrics\" class=\"metric-item-wrap\">\n <!-- Single value: name + value on same row -->\n <ng-container *ngIf=\"m.value?.length === 1\">\n <div class=\"metric-single-row\">\n <span class=\"metric-single-name\" [title]=\"m.name\">{{ m.name }}</span>\n <span class=\"metric-single-value\" [style.color]=\"m.value[0].score !== null && m.value[0].score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(m.value[0]) }}\n </span>\n </div>\n </ng-container>\n <!-- Multiple values: header + rows -->\n <ng-container *ngIf=\"m.value?.length > 1\">\n <div class=\"metric-multi-header\" [title]=\"m.name\">{{ m.name }}</div>\n <ng-container *ngFor=\"let v of m.value\">\n <div *ngIf=\"(v.score !== null && v.score !== undefined) || (v.Total !== null && v.Total !== undefined) || (v.Avg !== null && v.Avg !== undefined) || (v.total !== null && v.total !== undefined) || (v.avg !== null && v.avg !== undefined) || (v.count !== null && v.count !== undefined)\" class=\"metric-multi-row\">\n <span class=\"metric-multi-name\" [title]=\"v.name\">{{ v.name }}</span>\n <span class=\"metric-multi-value\"\n [style.color]=\"v.score !== null && v.score !== undefined ? '#00A3FF' : '#344054'\">\n {{ formatMetricValue(v) }}\n </span>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!conv.metrics?.length\">\n <div *ngIf=\"conv.storeName\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Store</span><span class=\"metric-fallback-value\">{{ conv.storeName }}</span></div>\n <div *ngIf=\"conv.duration\" class=\"metric-fallback-row\"><span class=\"metric-fallback-label\">Duration</span><span class=\"metric-fallback-value\">{{ conv.duration }}</span></div>\n </ng-container>\n <div *ngIf=\"conv._detailLoading\" class=\"metric-detail-loading\">Loading...</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n <!-- No conversations for this filter (only when cards exist but convs are empty) -->\n <div *ngIf=\"!detailLoading && detailPageConvs.length === 0 && cohortCards.length > 0\" class=\"echo-nodata-state\">\n <img src=\"./assets/tango/Icons/Nodata1.svg\" alt=\"No data\" class=\"echo-nodata-img\">\n <div class=\"echo-nodata-title\">No data found</div>\n <div class=\"echo-nodata-sub\">No conversations available for the selected filter.</div>\n </div>\n\n <!-- Pagination -->\n <lib-pagination *ngIf=\"detailTotal > 0\" [itemsPerPage]=\"detailPerPage\" [currentPage]=\"detailPage\" [totalItems]=\"detailTotal\"\n [paginationSizes]=\"detailPaginationSizes\" [pageSize]=\"detailPerPage\" (pageChange)=\"onDetailPageChange($event)\"\n (pageSizeChange)=\"onDetailPageSizeChange($event)\"></lib-pagination>\n </ng-container><!-- end detailView -->\n </ng-container><!-- end agentanalysis -->\n\n <!-- \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 MANAGE TAB \u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550 -->\n <ng-container *ngIf=\"currentPage === 'manage'\">\n <div class=\"manage-header\">\n <div>\n <div class=\"manage-title\">Agents</div>\n <div class=\"manage-subtitle\">{{ manageTotal }} agents</div>\n </div>\n <span class=\"flex-spacer\"></span>\n <div class=\"echo-search-wrap--wide\">\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#94A3B8\" stroke-width=\"1.8\" stroke-linecap=\"round\"><circle cx=\"11\" cy=\"11\" r=\"7.5\"/><path d=\"M16.5 16.5L21 21\"/></svg>\n <input [(ngModel)]=\"manageSearch\" (ngModelChange)=\"onManageSearch()\" placeholder=\"Search agents...\" class=\"manage-search-input\">\n </div>\n </div>\n\n <div *ngIf=\"manageLoading\" class=\"echo-empty-state\">Loading agents...</div>\n\n <!-- Agents table -->\n <div *ngIf=\"!manageLoading\" class=\"echo-card\">\n <div class=\"agents-table-header agents-table-4col\">\n <div class=\"agents-table-cell\">Agent Name</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Metrics</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Source</div>\n <div class=\"agents-table-cell agents-table-cell--center\">Action</div>\n </div>\n <div *ngFor=\"let cohort of manageCohorts; trackBy: trackById\" class=\"agents-table-row agents-table-4col\">\n <div class=\"agent-cell-name-wrap\">\n <div class=\"agent-cell-name\">{{ cohort.cohortName || cohort.name }}</div>\n <div class=\"agent-cell-desc\">{{ cohort.cohortDescription || cohort.description || '' }}</div>\n </div>\n <div class=\"agent-cell-metrics\">{{ cohort.metricsAdded || cohort.metricAdded || cohort.metrics?.length || 0 }}</div>\n <div class=\"agent-cell-source\">{{ cohort.source?.join(', ') || '\u2013' }}</div>\n <div class=\"agent-cell-action\">\n <button (click)=\"deleteCohort(cohort.cohortId || cohort.id || cohort._id)\" class=\"agent-delete-btn\">Delete</button>\n </div>\n </div>\n <div *ngIf=\"manageCohorts.length === 0\" class=\"manage-no-results\">No cohorts found.</div>\n </div>\n\n <!-- Manage pagination -->\n <lib-pagination *ngIf=\"manageTotal > 0\" [itemsPerPage]=\"managePerPage\" [currentPage]=\"managePage\" [totalItems]=\"manageTotal\"\n [paginationSizes]=\"managePaginationSizes\" [pageSize]=\"managePerPage\" (pageChange)=\"onManagePageChange($event)\"\n (pageSizeChange)=\"onManagePageSizeChange($event)\"></lib-pagination>\n </ng-container>\n\n </div>\n</div>\n\n<!-- \u2550\u2550\u2550 FILTERS DRAWER \u2550\u2550\u2550 -->\n<div class=\"drawer-overlay\" *ngIf=\"drawerOpen\" (click)=\"closeFilterDrawer()\"></div>\n<div class=\"af-drawer\" *ngIf=\"drawerOpen\">\n <div class=\"drawer-header\">\n <span class=\"drawer-header-title\">Filters</span>\n <button (click)=\"closeFilterDrawer()\" class=\"drawer-close-btn\">\u00D7</button>\n </div>\n <div class=\"drawer-body\">\n <p class=\"drawer-placeholder-text\">Filter configuration coming soon. Uses the same filter APIs as the existing audio pages.</p>\n </div>\n <div class=\"af-footer\">\n <button class=\"af-cancel\" (click)=\"closeFilterDrawer()\">Close</button>\n </div>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.echo-page{padding:20px 24px;background-color:#f4f6fa}.conversations-section{background:#fff;border-radius:10px;padding:16px;margin-top:8px}.conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;overflow:hidden;background:#fff}.conv-header{padding:14px 20px;display:flex;align-items:center;gap:8px;cursor:pointer;transition:background .15s}.conv-header:hover{background:#f8fafc}.conv-chevron{width:24px;height:24px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:transform .22s ease}.conv-chevron.open{transform:rotate(180deg)}.conv-id{font-size:13px;font-weight:600;color:#0ea5e9;border-radius:4px;padding:2px 8px}.meta-tag{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:24px;font-size:12px;font-weight:500;border:1px solid #e8edf3;background:#f8fafc;color:#344054;white-space:nowrap}.meta-tag.purple{background:#f0f4ff;color:#1a73e8;border-color:#d0e0ff}.meta-tag.brand{font-weight:600}.conv-tabs{display:flex;border-bottom:1px solid #e8edf3;padding:0 20px}.conv-tab-btn{padding:10px 16px;font-size:13px;font-weight:600;border:none;background:transparent;cursor:pointer;color:#667085;border-bottom:2px solid transparent;transition:all .15s;margin-bottom:-1px}.conv-tab-btn.active{color:#00a3ff;border-bottom-color:#00a3ff}.transcript-content .transcript-section{margin-bottom:20px}.transcript-content .transcript-section:last-child{margin-bottom:0}.transcript-content .transcript-section-title{display:flex;align-items:center;gap:6px;font-size:13px;font-weight:600;color:#344054;margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid #f0f4ff}.transcript-content .transcript-summary-text,.summary-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.detail-conv-card{border:1px solid #e8edf3;border-radius:10px;margin-bottom:12px;background:#fff;overflow:hidden}.detail-conv-card .conv-header{padding:12px 16px}.detail-conv-card .conv-tabs{padding:0 16px}.detail-conv-card .echo-player{padding:10px 16px}.conv-body-expanded{border-top:1px solid #e8edf3}.echo-player{display:flex;align-items:center;gap:12px;padding:12px 20px;background:#f2f4f7;border-bottom:1px solid #e8edf3}.echo-play-btn{width:36px;height:36px;min-width:36px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:background .2s;position:relative}.echo-play-btn:hover{background:#0087d5}.echo-play-btn.playing{animation:pulse-heartbeat 1.4s ease-in-out infinite}.echo-play-btn.playing:before,.echo-play-btn.playing:after{content:\"\";position:absolute;inset:0;border-radius:50%;border:2px solid #00A3FF;animation:pulse-ring 1.4s ease-out infinite}.echo-play-btn.playing:after{animation-delay:.7s}@keyframes pulse-heartbeat{0%,to{transform:scale(1)}15%{transform:scale(1.08)}30%{transform:scale(1)}45%{transform:scale(1.05)}60%{transform:scale(1)}}@keyframes pulse-ring{0%{transform:scale(1);opacity:.6}to{transform:scale(1.8);opacity:0}}.echo-waveform{flex:1;display:flex;align-items:center;gap:1.5px;height:40px;cursor:pointer}.echo-wf-bar{width:2px;min-width:2px;border-radius:2px;min-height:3px;background:#cbd5e1;transition:background .15s}.echo-wf-bar.played{background:#00a3ff}.wf-playing .echo-wf-bar.played{transform-origin:center}.wf-playing .echo-wf-bar.played:nth-child(3n){animation:wf-eq1 .45s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+1){animation:wf-eq2 .55s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(3n+2){animation:wf-eq3 .35s ease-in-out infinite alternate}.wf-playing .echo-wf-bar.played:nth-child(5n){animation-delay:.1s}.wf-playing .echo-wf-bar.played:nth-child(7n){animation-delay:.2s}.wf-playing .echo-wf-bar.played:nth-child(11n){animation-delay:.05s}@keyframes wf-eq1{0%{transform:scaleY(1)}50%{transform:scaleY(.6)}to{transform:scaleY(1.1)}}@keyframes wf-eq2{0%{transform:scaleY(.7)}to{transform:scaleY(1.15)}}@keyframes wf-eq3{0%{transform:scaleY(1.1)}50%{transform:scaleY(.5)}to{transform:scaleY(.9)}}.echo-time{font-size:13px;font-weight:600;color:#344054;flex-shrink:0;min-width:50px;text-align:right}.btn{padding:8px 16px;border-radius:8px;font-size:14px;font-weight:500;cursor:pointer;border:none;transition:all .15s}.btn-primary{background:#1a73e8;color:#fff}.btn-primary:hover{background:#135cbc}.analytics-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}@media (max-width: 992px){.analytics-grid{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.analytics-grid{grid-template-columns:1fr!important}}.analytics-card{background:#fff;border:1px solid #e8edf3;border-radius:10px;cursor:pointer;overflow:hidden;transition:box-shadow .2s,transform .2s,border-color .2s}.analytics-card:hover{box-shadow:0 4px 12px #00000014;transform:translateY(-2px);border-color:#00a3ff}.analytics-card:hover .analytics-hover-link{opacity:1}.analytics-card-header{padding:14px 16px;border-bottom:1px solid #e8edf3;background:linear-gradient(135deg,#f8fafc,#fff)}.analytics-hover-link{font-size:11px;color:#00a3ff;font-weight:700;opacity:0;transition:opacity .2s}.btn-outline{background:#fff;border:1px solid #D0D5DD;color:#344054}.btn-outline:hover{border-color:#1a73e8;color:#1a73e8}.btn-success{background:#10b981;color:#fff}.section-label{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;margin-bottom:8px;text-transform:uppercase}.echo-card{background:#fff;border-radius:10px;border:1px solid #e8edf3;overflow:hidden}.echo-card-header{padding:14px 20px;border-bottom:1px solid #e8edf3;display:flex;align-items:center;gap:8px}.echo-card-title{font-size:16px;font-weight:600;color:#1a2b4b}.echo-card-body{padding:20px}.metric-cards-dynamic{display:grid;gap:16px;margin-bottom:24px;align-items:stretch}.metric-card-dynamic{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:20px;display:flex;flex-direction:column;max-height:420px;cursor:pointer;transition:border-color .2s,box-shadow .2s}.metric-card-dynamic:hover{border-color:#00a3ff;box-shadow:0 2px 8px #00a3ff14}.metric-card-content{flex:1;min-height:0;overflow-y:auto;padding-right:6px}.metric-card-content::-webkit-scrollbar{width:4px}.metric-card-content::-webkit-scrollbar-track{background:transparent}.metric-card-content::-webkit-scrollbar-thumb{background:#d0d5dd;border-radius:4px}.metric-card-title{font-size:14px;font-weight:700;color:#1a2b4b;margin-bottom:4px;line-height:1.3}.metric-card-subtitle{font-size:11px;color:#667085;margin-bottom:12px;font-weight:500}.metric-info-icon{position:relative;color:#98a2b3;cursor:pointer;flex-shrink:0;padding:2px;transition:color .15s}.metric-info-icon:hover{color:#00a3ff}.metric-info-icon:hover .metric-info-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.metric-info-tooltip{position:absolute;top:calc(100% + 6px);right:0;z-index:100;min-width:200px;max-width:260px;padding:10px 12px;background:#1a2b4b;color:#fff;font-size:11.5px;line-height:1.5;border-radius:8px;box-shadow:0 4px 16px #0000002e;opacity:0;visibility:hidden;transform:translateY(-4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none}.metric-info-tooltip:before{content:\"\";position:absolute;top:-5px;right:6px;width:10px;height:10px;background:#1a2b4b;transform:rotate(45deg);border-radius:2px}.metric-bool-row{margin-bottom:10px;cursor:pointer}.metric-dot{width:7px;height:7px;border-radius:50%;background:#00a3ff;flex-shrink:0}.metric-score{font-weight:700;font-size:15px}.metric-status-badge{font-size:10px;font-weight:700;padding:3px 10px;border-radius:20px;text-transform:uppercase;letter-spacing:.5px;white-space:nowrap;flex-shrink:0}.metric-card-desc{font-size:13px;color:#475467;line-height:1.6;margin:12px 0 8px}.metric-card-short-desc{font-size:12px;color:#98a2b3;font-style:italic;line-height:1.5;margin:4px 0 0}.metric-count{font-size:11px;color:#667085;min-width:20px;text-align:right;font-weight:500}.metric-progress-track{height:6px;border-radius:4px;background:#e2e8f2;overflow:hidden}.metric-progress-fill{height:100%;background:#00a3ff;border-radius:4px;transition:width .5s ease}.funnel-chart{display:flex;flex-direction:column;align-items:flex-start;gap:6px;padding:4px 0}.bbt-wrap{display:flex;flex-direction:column}.bbt-row{display:grid;grid-template-columns:140px 1fr 50px;align-items:center;padding:12px 14px;border-bottom:1px solid #F1F5F9;transition:background .15s}.bbt-row:last-child{border-bottom:none}.bbt-row:hover{background:#f8fafc}.bbt-row:nth-child(2n){background:#f8fafc}.bbt-row:nth-child(2n):hover{background:#eff6ff}.bbt-brand{font-size:13px;font-weight:700;color:#101828;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bbt-chips{display:flex;flex-wrap:nowrap;gap:6px;overflow:hidden;min-width:0}.bbt-chip{padding:3px 12px;border-radius:999px;background:#fff;border:1px solid #BAE6FD;color:#0284c7;font-size:12px;font-weight:500;white-space:nowrap;flex-shrink:0}.bbt-chip--more{background:#e9f4fe;border-color:#7dd3fc;color:#0369a1;font-weight:600;cursor:pointer}.bbt-float-tooltip{position:fixed;transform:translate(-50%,-100%);background:#1f2937;color:#fff;padding:6px 10px;border-radius:6px;box-shadow:0 6px 18px #0f172a38;display:flex;flex-direction:column;gap:2px;max-width:220px;width:max-content;font-size:11px;font-weight:500;line-height:1.35;text-align:left;pointer-events:none;z-index:9999}.bbt-float-tooltip:after{content:\"\";position:absolute;top:100%;left:50%;transform:translate(-50%);border:5px solid transparent;border-top-color:#1f2937}.bbt-chip-tooltip-item{display:block;white-space:normal;word-break:break-word}.bbt-count{font-size:14px;font-weight:500;color:#94a3b8;text-align:right}.metric-card-dynamic--wide{grid-column:span 2}@media (max-width: 992px){.metric-card-dynamic--wide{grid-column:span 1}}.bbb-wrap{display:grid;grid-template-columns:minmax(170px,1fr) 1.4fr minmax(170px,1fr);gap:18px;align-items:center}.bbb-list{border-right:1px solid #E4E7EC;padding-right:12px;max-height:280px;overflow-y:auto}.bbb-list-row{padding:10px 12px;border-radius:6px;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbb-list-row:hover{background:#f8fafc}.bbb-list-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbb-list-label{display:inline-block;max-width:100%;white-space:normal;word-break:break-word;line-height:1.3}.bbb-pie-col{display:flex;align-items:center;justify-content:center;padding:8px 0}.bbb-pie-wrap{width:190px;height:190px;max-width:100%}.bbb-pie{width:100%;height:100%;display:block;filter:drop-shadow(0 2px 6px rgba(14,165,233,.12))}.bbb-pie path{cursor:pointer;transition:opacity .15s,transform .15s;transform-origin:50px 50px}.bbb-pie path:hover{opacity:.9}.bbb-pie-slice--active{opacity:1!important;transform:scale(1.04)}.bbb-legend{display:flex;flex-direction:column;gap:6px}.bbb-legend-row{display:flex;align-items:center;gap:8px;padding:3px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbb-legend-row:hover{background:#f8fafc}.bbb-legend-row--active{background:#e9f4fe}.bbb-legend-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.bbb-legend-label{flex:1}.bbb-legend-pct{font-weight:700;color:#101828}.bbc-wrap{display:grid;grid-template-columns:minmax(160px,1fr) 1.4fr;gap:18px;align-items:stretch}.bbc-keyword-list{border-right:1px solid #E4E7EC;padding-right:14px;max-height:280px;overflow-y:auto}.bbc-keyword-row{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;border-radius:0;border-bottom:1px solid #EAECF0;cursor:pointer;font-size:13px;color:#344054;transition:background .15s}.bbc-keyword-row:last-child{border-bottom:none}.bbc-keyword-row:hover{background:#f8fafc}.bbc-keyword-row--active{background:#e9f4fe;color:#0077e6;font-weight:600}.bbc-keyword-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-right:10px}.bbc-keyword-count{color:#667085;font-weight:500;font-size:13px}.bbc-keyword-row--active .bbc-keyword-count{color:#0077e6}.bbc-chart-side{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:14px;padding:8px 4px}.bbc-bar-list{display:flex;flex-direction:column;gap:14px;width:100%;padding:4px 2px}.bbc-bar-row{cursor:pointer;padding:8px 10px;border-radius:8px}.bbc-bar-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;font-size:12px}.bbc-bar-label{display:inline-flex;align-items:center;gap:8px;color:#1e293b;font-weight:500;letter-spacing:.1px}.bbc-bar-dot{width:8px;height:8px;border-radius:50%;display:inline-block;box-shadow:0 0 0 2px #ffffffe6,0 0 0 3px #0f172a14}.bbc-bar-pct{color:#0f172a;font-weight:700;font-size:12px;font-variant-numeric:tabular-nums}.bbc-bar-track{height:10px;background:linear-gradient(180deg,#f1f5f9,#e2e8f0);border-radius:999px;overflow:hidden;box-shadow:inset 0 1px 2px #0f172a0f}.bbc-bar-fill{height:100%;border-radius:999px;background-image:linear-gradient(180deg,#ffffff40,#fff0 55%);background-blend-mode:overlay;transition:width .35s cubic-bezier(.4,0,.2,1);box-shadow:0 1px 2px #0f172a1f}.bbc-donut-wrap{position:relative;width:150px;height:150px}.bbc-donut{width:100%;height:100%}.bbc-donut-center{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;pointer-events:none}.bbc-donut-pct{font-size:20px;font-weight:700;color:#101828;line-height:1}.bbc-donut-cap{font-size:11px;color:#667085;margin-top:3px}.bbc-legend{width:100%;display:flex;flex-direction:column;gap:6px}.bbc-legend-row{display:flex;align-items:center;gap:8px;padding:4px 6px;border-radius:4px;font-size:13px;color:#344054;cursor:pointer}.bbc-legend-row:hover{background:#f8fafc}.bbc-legend-row--active{background:#e9f4fe}.bbc-legend-dot{width:10px;height:10px;border-radius:50%;border:2px solid #8AD8FF;background:transparent;flex-shrink:0}.bbc-legend-label{flex:1}.bbc-legend-pct{font-weight:600;color:#0077e6}.funnel-stage{width:100%;display:flex;justify-content:flex-start;cursor:pointer}.funnel-bar{display:flex;align-items:center;justify-content:space-between;padding:8px 14px;border-radius:6px;min-height:36px;overflow:visible;transition:width .5s ease,opacity .2s}.funnel-bar:hover{opacity:.85}.funnel-label-wrap{position:relative;flex:1;min-width:0;overflow:visible}.funnel-label-wrap .funnel-tooltip{position:absolute;bottom:calc(100% + 10px);left:0;padding:6px 10px;background:#1a2b4b;color:#fff;font-size:11.5px;font-weight:600;border-radius:6px;white-space:nowrap;box-shadow:0 4px 12px #0000002e;opacity:0;visibility:hidden;transform:translateY(4px);transition:opacity .15s,visibility .15s,transform .15s;pointer-events:none;z-index:100}.funnel-label-wrap .funnel-tooltip:after{content:\"\";position:absolute;top:100%;left:12px;width:8px;height:8px;background:#1a2b4b;transform:translateY(-50%) rotate(45deg);border-radius:1px}.funnel-label-wrap:hover .funnel-tooltip{opacity:1;visibility:visible;transform:translateY(0)}.funnel-label{font-size:12px;font-weight:600;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.funnel-value{font-size:13px;font-weight:700;color:#fff;flex-shrink:0;margin-left:8px}.numeric-stat-strip{display:grid;grid-auto-flow:column;grid-auto-columns:1fr;gap:12px;margin-bottom:14px}.numeric-stat-tile{background:#fff;border:1px solid #EAECF0;border-left:3px solid #CBD5E1;border-radius:8px;padding:14px 16px;min-width:0}.numeric-stat-label{font-size:10px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:#667085;margin-bottom:8px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-stat-value{font-size:26px;font-weight:800;line-height:1;margin-bottom:8px}.numeric-stat-max{font-size:14px;font-weight:600;color:#98a2b3;margin-left:2px}.numeric-stat-sub{font-size:11px;color:#667085;line-height:1.4;white-space:normal;word-break:break-word}.numeric-score-row{padding:10px 0;border-bottom:1px solid #f0f4ff;cursor:pointer;transition:background .15s}.numeric-score-row:last-child{border-bottom:none}.numeric-score-row:hover{background:#f8fafc;margin:0 -12px;padding:10px 12px;border-radius:6px}.metric-big-number{font-weight:800;font-size:36px;color:#00a3ff;line-height:1}.metric-avg-label{font-size:12px;color:#667085;margin-left:4px}@media (max-width: 992px){.metric-cards-dynamic{grid-template-columns:repeat(2,1fr)!important}}@media (max-width: 576px){.metric-cards-dynamic{grid-template-columns:1fr!important}}.subjective-wrap{cursor:pointer;max-height:120px;overflow:hidden}.subjective-row{padding:4px 0;font-size:12px;color:#475467;border-bottom:1px solid #f0f4ff;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical}.metric-card-name{font-size:14px;font-weight:600;color:#1a2b4b}.agents-table-header{display:grid;align-items:center;padding:10px 20px;border-bottom:1px solid #e8edf3;background:#f8fafc}.agents-table-cell{font-size:12px;font-weight:600;color:#98a2b3;letter-spacing:.5px;text-transform:uppercase}.agents-table-row{display:grid;align-items:center;padding:14px 20px;border-bottom:1px solid #e8edf3;cursor:pointer;transition:background .15s}.agents-table-row:hover{background:#f8fafc}.agents-table-row:last-child{border-bottom:none}.status-dot{width:8px;height:8px;border-radius:50%}.status-dot.active{background:#10b981}.status-dot.pending{background:#f59e0b}.status-dot.paused{background:#98a2b3}.tango-ai-header{display:flex;flex-direction:column;align-items:center;gap:10px;padding:20px 0}.tango-ai-logo{width:52px;height:52px;border-radius:16px;background:linear-gradient(135deg,#794fd9,#33b1f7);display:flex;align-items:center;justify-content:center;box-shadow:0 4px 16px #794fd933}.tango-ai-title{font-size:22px;font-weight:800;color:#1a2b4b;line-height:1.2}.tango-ai-subtitle{font-size:13px;color:#667085;margin-top:4px}.echo-search-card{display:flex;align-items:center;background:#fff;border:1px solid #D0D5DD;border-radius:8px;padding:10px 12px 10px 20px;margin-bottom:20px;box-shadow:0 1px 2px #1018280d}.echo-search-input{flex:1;border:none;outline:none;font-size:14px;color:#101828}.echo-search-input::placeholder{color:#98a2b3}.echo-search-slash{width:28px;height:28px;border-radius:50%;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:600;color:#667085;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;margin-right:6px}.echo-search-send{width:32px;height:32px;border-radius:50%;background:#00a3ff;border:none;color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;flex-shrink:0;transition:background .2s}.echo-search-send:hover{background:#0087d5}.echo-search-send:disabled{opacity:.5;cursor:not-allowed}.echo-ai-response{background:#fff;border:1px solid #e8edf3;border-radius:10px;padding:16px 20px;margin-bottom:16px}.echo-ai-text{font-size:14px;color:#475467;line-height:1.7;margin:0}.echo-conv-count{font-size:14px;font-weight:700;color:#00a3ff;margin-bottom:16px}.typing{display:flex;gap:4px;align-items:center;padding:4px 0}.typing-dot{width:6px;height:6px;border-radius:50%;background:#00a3ff;animation:pulse 1.2s ease-in-out infinite}.typing-dot:nth-child(2){animation-delay:.2s}.typing-dot:nth-child(3){animation-delay:.4s}@keyframes pulse{0%,to{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}:host ::ng-deep lib-pagination{margin-top:16px;display:block}.agent-dropdown-wrap{position:relative}.agent-dropdown-trigger{display:flex;align-items:center;gap:8px;padding:7px 12px;border:1.5px solid #D0D5DD;border-radius:8px;background:#fff;cursor:pointer;max-width:280px;transition:border-color .15s}.agent-dropdown-trigger:hover{border-color:#00a3ff}.agent-dropdown-menu{position:absolute;top:calc(100% + 6px);right:0;background:#fff;border:1px solid #D0D5DD;border-radius:10px;box-shadow:0 8px 24px #0000001f;width:300px;z-index:300;overflow:hidden}.agent-dd-header{padding:8px 14px;font-size:11px;font-weight:600;color:#98a2b3;letter-spacing:.5px;border-bottom:1px solid #e8edf3;text-transform:uppercase}.agent-dd-item{display:flex;align-items:center;gap:10px;padding:10px 14px;cursor:pointer;transition:background .1s}.agent-dd-item:hover{background:#f8fafc}.agent-dd-item.selected{background:#f0f4ff}.agent-dd-name{font-size:13px;font-weight:600;color:#344054;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.agent-dd-meta{font-size:12px;color:#98a2b3;margin-top:1px}.fbar-pill{display:flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid #D0D5DD;border-radius:8px;background:#fff;font-size:13px;font-weight:600;color:#344054;cursor:pointer;transition:all .15s;white-space:nowrap}.fbar-pill:hover,.fbar-pill.active{border-color:#1a73e8;color:#1a73e8;background:#f0f4ff}.echo-sub-header{display:flex;align-items:center;padding:12px 0 16px;gap:10px}.btn-back{background:none;border:none;cursor:pointer;display:flex;align-items:center;color:#1a73e8;padding:4px 6px;border-radius:8px}.sub-header-title{font-size:15px;font-weight:600;color:#1a2b4b}.drawer-overlay{position:fixed;inset:0;background:#0000004d;z-index:200}.af-drawer{position:fixed;top:0;right:0;bottom:0;width:380px;max-width:95vw;background:#fff;z-index:201;display:flex;flex-direction:column;box-shadow:-8px 0 40px #00000026;animation:slideInRight .25s ease-out;overflow:hidden}@keyframes slideInRight{0%{transform:translate(100%)}to{transform:translate(0)}}.af-footer{padding:14px 16px;border-top:1px solid #e8edf3;display:flex;align-items:center;justify-content:flex-end;background:#fff}.af-cancel{padding:9px 20px;border-radius:8px;border:1px solid #D0D5DD;background:#fff;font-size:14px;font-weight:500;cursor:pointer;color:#344054}@media (max-width: 768px){.metric-cards-grid{grid-template-columns:1fr}.agents-table-header,.agents-table-row{grid-template-columns:1fr 80px}}.flex-spacer{flex:1}.text-center{text-align:center}.echo-empty-state{text-align:center;padding:40px;color:#94a3b8}.echo-empty-state--muted{text-align:center;padding:40px;color:#667085}.echo-empty-state--sm{text-align:center;padding:40px;color:#94a3b8;font-size:13px}.echo-empty-state--muted-sm{text-align:center;padding:40px;color:#667085;font-size:13px}.echo-empty-state--compact{text-align:center;padding:32px;color:#667085;font-size:13px}.echo-nodata-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 20px;text-align:center}.echo-nodata-img{width:120px;height:auto;margin-bottom:16px;opacity:.85}.echo-nodata-title{font-size:15px;font-weight:700;color:#1a2b4b;margin-bottom:6px}.echo-nodata-sub{font-size:13px;color:#667085;line-height:1.5}.tango-ai-header-text{text-align:center}.conv-header-body{flex:1;min-width:0}.conv-meta-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:4px}.meta-tag--duration{background:#ede9fe;color:#8b5cf6;border-color:#ddd6fe;font-weight:700}.conv-description{font-size:12.5px;color:#94a3b8;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.conv-body-padding{padding:14px 16px}.ai-insights-section{margin-top:16px}.ai-insights-label{font-size:11px;font-weight:700;color:#667085;letter-spacing:.5px;text-transform:uppercase;margin-bottom:10px}.ai-insight-row{display:flex;align-items:flex-start;gap:8px;margin-bottom:8px}.ai-insight-dot{width:6px;height:6px;border-radius:50%;margin-top:5px;flex-shrink:0}.ai-insight-text{font-size:13px;color:#475467;line-height:1.5}.analytics-overview-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.analytics-overview-title{font-size:17px;font-weight:700;color:#1a2b4b}.analytics-overview-subtitle{font-size:12px;color:#667085}.echo-search-wrap{width:220px;display:flex;align-items:center;gap:8px;border:1px solid #D0D5DD;border-radius:8px;padding:6px 12px;background:#fff}.echo-search-wrap--wide{width:280px;display:flex;align-items:center;gap:8px;border:1px solid #E2E8F2;border-radius:8px;padding:6px 12px;background:#fff}.echo-inline-input{flex:1;border:none;background:transparent;font-size:13px;color:#344054;outline:none;min-width:0}.echo-inline-input--small{flex:1;border:none;background:transparent;font-size:12px;color:#344054;outline:none;min-width:0}.analytics-card-top-row{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:8px}.analytics-card-name{font-size:13.5px;font-weight:700;color:#1a2b4b;flex:1;padding-right:8px;line-height:1.3}.analytics-card-badge-active{font-size:9px;font-weight:700;padding:2px 8px;border-radius:20px;background:#d1fae5;color:#065f46;text-transform:uppercase;letter-spacing:.5px;flex-shrink:0}.analytics-card-spacer{padding:8px 14px}.analytics-card-footer{padding:8px 14px;border-top:1px solid #e8edf3;display:flex;justify-content:flex-end}.detail-header-bar{display:flex;align-items:center;gap:12px;margin-bottom:20px;padding:14px 20px;background:#fff;border-radius:10px;border:1px solid #e8edf3}.detail-back-btn{background:none;border:none;cursor:pointer;color:#00a3ff;font-size:18px;padding:0}.detail-header-title{font-size:16px;font-weight:700;color:#1a2b4b}.detail-header-conv-count{font-size:13px;color:#667085}.cohort-dd-dot{width:8px;height:8px;border-radius:50%;background:#10b981;flex-shrink:0}.cohort-dd-trigger-name{font-size:13px;font-weight:600;color:#1a2b4b;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.cohort-dd-search-wrap{padding:8px 10px;border-bottom:1px solid #e8edf3}.cohort-dd-search-inner{display:flex;align-items:center;gap:6px;padding:6px 10px;border:1px solid #D0D5DD;border-radius:6px;background:#fff}.cohort-dd-scroll{max-height:240px;overflow-y:auto}.cohort-dd-item-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}.cohort-dd-item-body{flex:1;min-width:0}.cohort-dd-no-results{padding:16px;text-align:center;font-size:12px;color:#667085}.cohort-dd-backdrop{position:fixed;inset:0;z-index:299}.metric-card-header-row{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}.metric-card-actions{display:flex;align-items:center;gap:6px;flex-shrink:0}.metric-export-btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:28px;padding:0 12px;border:1px solid rgba(0,0,0,.12);border-radius:6px;background:transparent;color:#64748b;font-size:12px;font-weight:500;line-height:1;white-space:nowrap;cursor:pointer;transition:background .15s,color .15s,border-color .15s}.metric-export-btn svg{flex-shrink:0}.metric-export-btn:hover{background:#f1f5f9;color:#0f172a;border-color:#0003}.metric-row-flex{display:flex;align-items:center;gap:6px;margin-bottom:4px}.metric-row-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}.metric-row-label{font-size:13px;color:#344054;flex:1}.metric-score--teal{color:#00a3ff}.numeric-row-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}.numeric-row-name{font-size:13px;color:#344054;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.numeric-row-value{font-size:15px;font-weight:800;color:#00a3ff;flex-shrink:0;margin-left:8px}.numeric-row-max{font-size:12px;font-weight:600;color:#98a2b3}.numeric-progress-track{position:relative;height:5px;border-radius:4px;background:#e2e8f2}.numeric-progress-fill{position:absolute;left:0;top:0;height:100%;border-radius:4px;background:linear-gradient(90deg,#00a3ff,#33b1f7)}.pitch-keyword-count{font-size:11px;color:#667085;margin-bottom:8px}.pitch-row-label{font-size:12.5px;color:#344054;flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pitch-row-desc{font-size:12px;font-weight:700;color:#667085;flex-shrink:0}.funnel-value-count{opacity:.8;font-weight:500}.detail-conv-section-header{padding:16px 20px;display:flex;align-items:center;gap:8px;background:#fff;border-radius:10px;border:1px solid #e8edf3;margin-bottom:12px}.detail-conv-section-title{font-size:15px;font-weight:700;color:#1a2b4b}.detail-conv-search{display:inline-flex;align-items:center;gap:6px;height:32px;padding:0 10px;border:1px solid #E4E7EC;border-radius:6px;background:#fff;min-width:240px;transition:border-color .15s,box-shadow .15s}.detail-conv-search:focus-within{border-color:#0ea5e9;box-shadow:0 0 0 3px #0ea5e91f}.detail-conv-search-input{flex:1;border:none;outline:none;background:transparent;font-size:13px;color:#1e293b}.detail-conv-search-input::placeholder{color:#98a2b3}.detail-conv-search-clear{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;border-radius:50%;background:transparent;color:#98a2b3;cursor:pointer}.detail-conv-search-clear:hover{background:#f1f5f9;color:#334155}.detail-content-split{display:flex}.detail-content-left{flex:3;padding:14px 20px;min-width:0;border-right:1px solid #e8edf3}.detail-content-right{flex:1;min-width:220px;max-width:350px;padding:16px;overflow-y:auto;max-height:500px}.detail-meta-row{display:flex;align-items:center;gap:5px;flex:1;min-width:0;flex-wrap:wrap}.summary-text--prewrap{white-space:pre-wrap}.metrics-panel-label{font-size:10px;font-weight:700;color:#00a3ff;letter-spacing:.5px;text-transform:uppercase;margin-bottom:12px}.metric-item-wrap{margin-bottom:8px;padding:6px 0;border-bottom:1px solid #f0f4ff}.metric-single-row{display:flex;align-items:center;gap:8px}.metric-single-name{font-size:12px;font-weight:600;color:#344054;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-single-value{font-size:12px;font-weight:700;flex-shrink:0}.metric-multi-header{font-size:11px;font-weight:700;color:#344054;margin-bottom:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-row{display:flex;align-items:center;gap:8px;padding:3px 0}.metric-multi-name{font-size:11px;color:#667085;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.metric-multi-value{font-size:11px;font-weight:700;flex-shrink:0}.metric-fallback-row{display:flex;justify-content:space-between;margin-bottom:6px}.metric-fallback-label{font-size:12px;color:#667085}.metric-fallback-value{font-size:12px;font-weight:600;color:#344054}.metric-detail-loading{font-size:11px;color:#667085}.manage-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;flex-wrap:wrap}.manage-title{font-family:Outfit,sans-serif;font-weight:700;font-size:17px}.manage-subtitle{font-size:12px;color:#94a3b8}.manage-search-input{flex:1;border:none;background:transparent;font-size:13px;font-family:Nunito Sans,sans-serif;color:#0f172a;outline:none;min-width:0}.agents-table-4col{grid-template-columns:minmax(0,1fr) 120px 120px 80px}.agents-table-cell--center{text-align:center}.agent-cell-name-wrap{min-width:0}.agent-cell-name{font-family:Outfit,sans-serif;font-weight:700;font-size:13.5px;color:#0f172a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-desc{font-size:11px;color:#94a3b8;margin-top:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.agent-cell-metrics{text-align:center;font-family:Outfit,sans-serif;font-weight:700;font-size:13px;color:#0f172a}.agent-cell-source{text-align:center;font-size:11.5px;color:#334155;font-weight:600}.agent-cell-action{text-align:center}.agent-delete-btn{background:none;border:none;cursor:pointer;color:#ef4444;font-size:11px;font-weight:700}.manage-no-results{padding:32px;text-align:center;color:#94a3b8;font-size:13px}.drawer-header{padding:16px;border-bottom:1px solid #E2E8F2;display:flex;align-items:center;justify-content:space-between}.drawer-header-title{font-family:Outfit,sans-serif;font-weight:700;font-size:15px}.drawer-close-btn{background:none;border:none;cursor:pointer;color:#94a3b8;font-size:18px}.drawer-body{padding:16px;flex:1;overflow-y:auto}.drawer-placeholder-text{font-size:13px;color:#94a3b8}\n"] }]
|
|
1098
1130
|
}], ctorParameters: () => [{ type: i1.AudioService }, { type: i2.ActivatedRoute }, { type: i3.GlobalStateService }] });
|
|
1099
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuZ28tZWNoby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1haS1hdWRpby9zcmMvbGliL2NvbXBvbmVudHMvdGFuZ28tZWNoby90YW5nby1lY2hvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFpLWF1ZGlvL3NyYy9saWIvY29tcG9uZW50cy90YW5nby1lY2hvL3RhbmdvLWVjaG8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7O0FBUzFDLE1BQU0sT0FBTyxrQkFBa0I7SUFzSW5CO0lBQ0E7SUFDQTtJQXRJVixzREFBc0Q7SUFDdEQsV0FBVyxHQUFpRCxlQUFlLENBQUM7SUFFNUUsc0RBQXNEO0lBQ3RELFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDaEIsUUFBUSxHQUFhLEVBQUUsQ0FBQztJQUN4QixTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNiLFVBQVUsR0FBUSxFQUFFLENBQUM7SUFDckIsS0FBSyxHQUFRLEVBQUUsQ0FBQztJQUVoQixzREFBc0Q7SUFDdEQsYUFBYSxHQUFVLEVBQUUsQ0FBQztJQUMxQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNqQixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsY0FBYyxHQUFHLENBQUMsQ0FBQztJQUNuQixtQkFBbUIsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3hDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDcEIsZUFBZSxHQUFHLEVBQUUsQ0FB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c291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBdWRpb1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdWRpby5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItdGFuZ28tZWNobycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YW5nby1lY2hvLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFuZ28tZWNoby5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFRhbmdvRWNob0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvLyDilIDilIAgTmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY3VycmVudFBhZ2U6ICdjb252ZXJzYXRpb25zJyB8ICdhZ2VudGFuYWx5c2lzJyB8ICdtYW5hZ2UnID0gJ2NvbnZlcnNhdGlvbnMnO1xuXG4gIC8vIOKUgOKUgCBVc2VyIC8gR2xvYmFsIFN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjbGllbnRJZCA9ICcxMSc7XG4gIHN0b3JlSWRzOiBzdHJpbmdbXSA9IFtdO1xuICBzdGFydERhdGUgPSAnJztcbiAgZW5kRGF0ZSA9ICcnO1xuICBoZWFkZXJEYXRhOiBhbnkgPSB7fTtcbiAgdXNlcnM6IGFueSA9IHt9O1xuXG4gIC8vIOKUgOKUgCBDb252ZXJzYXRpb25zICh0cmFuc2NyaXB0LWxpc3QgQVBJKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29udmVyc2F0aW9uczogYW55W10gPSBbXTtcbiAgY29udlBhZ2UgPSAxO1xuICBjb252UGVyUGFnZSA9IDEwO1xuICBjb252VG90YWwgPSAwO1xuICBjb252VG90YWxQYWdlcyA9IDE7XG4gIGNvbnZQYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCA1MCwgMTAwXTtcbiAgY29udkxvYWRpbmcgPSBmYWxzZTtcbiAgY29udlNlYXJjaFF1ZXJ5ID0gJyc7XG4gIGV4cGFuZGVkQ29udklkczogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICBjb252VGFiczogeyBbY29udklkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuXG4gIC8vIEFJIENoYXRcbiAgY29udkFpUmVwbHkgPSAnJztcbiAgY29udkFpTG9hZGluZyA9IGZhbHNlO1xuXG4gIC8vIOKUgOKUgCBBZ2VudCBBbmFseXNpcyAoY29ob3J0L2F1ZGlvLXBhZ2UgQVBJKSDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29ob3J0TGlzdDogYW55W10gPSBbXTtcbiAgc2VsZWN0ZWRDb2hvcnRJZCA9ICcnO1xuICBzZWxlY3RlZENvaG9ydE5hbWUgPSAnJztcbiAgY29ob3J0Q2FyZHM6IGFueVtdID0gW107XG4gIGNhcmRzTG9hZGluZyA9IGZhbHNlO1xuICBkZXRhaWxWaWV3ID0gZmFsc2U7XG4gIHByaXZhdGUgX2luaXREb25lID0gZmFsc2U7XG4gIGFuYWx5c2lzU2VhcmNoID0gJyc7XG5cbiAgZ2V0IGFjdGl2ZUNvaG9ydHMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLmNvaG9ydExpc3QuZmlsdGVyKChjOiBhbnkpID0+IGMubWV0cmljc0FkZGVkID4gMCk7XG4gIH1cblxuICBnZXQgbnVtZXJpY1N0cmlwQ2FyZCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNvaG9ydENhcmRzLmZpbmQoKGM6IGFueSkgPT4gYy50eXBlID09PSAnTlVNRVJJQ19HUk9VUCcpIHx8IG51bGw7XG4gIH1cblxuICBnZXQgbm9uTnVtZXJpY0NhcmRzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb2hvcnRDYXJkcy5maWx0ZXIoKGM6IGFueSkgPT4gYy50eXBlICE9PSAnTlVNRVJJQ19HUk9VUCcpO1xuICB9XG5cbiAgZ2V0TnVtZXJpY1RpbGVDb2xvcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYWxldHRlID0gWycjRTU0ODREJywgJyNGNUE2MjMnLCAnIzdDNUNGQycsICcjMTZBMzRBJywgJyMwRUE1RTknLCAnI0VDNDg5OSddO1xuICAgIHJldHVybiBwYWxldHRlW2luZGV4ICUgcGFsZXR0ZS5sZW5ndGhdO1xuICB9XG5cbiAgLy8gRGV0YWlsIGNvbnZlcnNhdGlvbnMgKGZyb20gY29ob3J0IGNhcmQgY2xpY2spXG4gIGRldGFpbENvbnZlcnNhdGlvbnM6IGFueVtdID0gW107XG4gIGRldGFpbFBhZ2UgPSAxO1xuICBkZXRhaWxQZXJQYWdlID0gMTA7XG4gIGRldGFpbFRvdGFsUGFnZXMgPSAxO1xuICBkZXRhaWxUb3RhbCA9IDA7XG4gIGRldGFpbFBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDUwLCAxMDBdO1xuICBkZXRhaWxQYWdlQ29udnM6IGFueVtdID0gW107XG4gIGRldGFpbE9wZW5JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGRldGFpbExvYWRpbmcgPSBmYWxzZTtcbiAgZGV0YWlsQ29udkRldGFpbDogYW55ID0gbnVsbDtcblxuICAvLyDilIDilIAgTWFuYWdlIChjb2hvcnQgQ1JVRCBBUEkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBtYW5hZ2VDb2hvcnRzOiBhbnlbXSA9IFtdO1xuICBtYW5hZ2VMb2FkaW5nID0gZmFsc2U7XG4gIG1hbmFnZVBhZ2UgPSAxO1xuICBtYW5hZ2VQZXJQYWdlID0gMTA7XG4gIG1hbmFnZVRvdGFsID0gMDtcbiAgbWFuYWdlVG90YWxQYWdlcyA9IDE7XG4gIG1hbmFnZVBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXTtcbiAgbWFuYWdlU2VhcmNoID0gJyc7XG5cbiAgLy8g4pSA4pSAIEF1ZGlvIFBsYXllciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcGxheWluZ0NvbnZJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHdhdmVmb3JtSGVpZ2h0czogbnVtYmVyW10gPSBbXTtcblxuICBwcml2YXRlIGdlbmVyYXRlV2F2ZWZvcm0oKTogdm9pZCB7XG4gICAgLy8gR2VuZXJhdGUgfjIwMCBiYXJzIHdpdGggbmF0dXJhbCB3YXZlZm9ybSBwYXR0ZXJuXG4gICAgY29uc3QgYmFyczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIwMDsgaSsrKSB7XG4gICAgICBjb25zdCBoID0gTWF0aC5tYXgoMywgTWF0aC5hYnMoTWF0aC5zaW4oaSAqIDAuMTUpICogMjggKyBNYXRoLnNpbihpICogMC40KSAqIDEyICsgTWF0aC5jb3MoaSAqIDAuMDgpICogOCkpO1xuICAgICAgYmFycy5wdXNoKE1hdGgucm91bmQoaCkpO1xuICAgIH1cbiAgICB0aGlzLndhdmVmb3JtSGVpZ2h0cyA9IGJhcnM7XG4gIH1cblxuICAvLyDilIDilIAgQ29ob3J0IERyb3Bkb3duIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb2hvcnREcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgY29ob3J0RHJvcGRvd25TZWFyY2ggPSAnJztcblxuICB0b2dnbGVDb2hvcnREcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmNvaG9ydERyb3Bkb3duT3BlbiA9ICF0aGlzLmNvaG9ydERyb3Bkb3duT3BlbjtcbiAgICBpZiAodGhpcy5jb2hvcnREcm9wZG93bk9wZW4pIHtcbiAgICAgIHRoaXMuY29ob3J0RHJvcGRvd25TZWFyY2ggPSAnJztcbiAgICB9XG4gIH1cblxuICBjbG9zZUNvaG9ydERyb3Bkb3duKCk6IHZvaWQge1xuICAgIHRoaXMuY29ob3J0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jb2hvcnREcm9wZG93blNlYXJjaCA9ICcnO1xuICB9XG5cbiAgc2VsZWN0Q29ob3J0RnJvbURyb3Bkb3duKGNvaG9ydDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSBjb2hvcnQuY29ob3J0SWQgfHwgY29ob3J0LmlkIHx8IGNvaG9ydC5faWQgfHwgJyc7XG4gICAgdGhpcy5jb2hvcnREcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmNvaG9ydERyb3Bkb3duU2VhcmNoID0gJyc7XG4gICAgdGhpcy5vbkNvaG9ydERyb3Bkb3duQ2hhbmdlKGlkKTtcbiAgfVxuXG4gIGdldCBmaWx0ZXJlZERyb3Bkb3duQ29ob3J0cygpOiBhbnlbXSB7XG4gICAgaWYgKCF0aGlzLmNvaG9ydERyb3Bkb3duU2VhcmNoKSByZXR1cm4gdGhpcy5jb2hvcnRMaXN0O1xuICAgIGNvbnN0IHEgPSB0aGlzLmNvaG9ydERyb3Bkb3duU2VhcmNoLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuY29ob3J0TGlzdC5maWx0ZXIoKGM6IGFueSkgPT4gKChjLmNvaG9ydE5hbWUgfHwgYy5uYW1lIHx8ICcnKSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIEZpbHRlcnMgRHJhd2VyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBkcmF3ZXJPcGVuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gRGVmYXVsdCBzdG9yZSBsaXN0IChzYW1lIGFzIGV4aXN0aW5nIGF1ZGlvLXBhZ2UvdHJhbnNjcmlwdC1saXN0KVxuICBwcml2YXRlIGRlZmF1bHRTdG9yZXMgPSBbXG4gICAgJzExLTEwNjInLCAnMTEtMTA3OCcsICcxMS0xMDgzJywgJzExLTE1MTUnLCAnMTEtMTU0JywgJzExLTE2MjYnLFxuICAgICcxMS0xODEnLCAnMTEtMTk0NycsICcxMS0xOTk0JywgJzExLTIwMCcsICcxMS0yMDInLCAnMTEtMjE1JyxcbiAgICAnMTEtMjYwJywgJzExLTc4JywgJzExLTgxOSdcbiAgXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1ZGlvU2VydmljZTogQXVkaW9TZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZVxuICApIHtcbiAgICB0aGlzLmdlbmVyYXRlV2F2ZWZvcm0oKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIDEuIEdldCB1c2VyIGluZm9cbiAgICBpZiAoJ3VzZXItaW5mbycgaW4gbG9jYWxTdG9yYWdlKSB7XG4gICAgICB0aGlzLnVzZXJzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgfHwgJ3t9Jyk7XG4gICAgICB0aGlzLmNsaWVudElkID0gdGhpcy51c2Vycz8uY2xpZW50SWQgfHwgJzExJztcbiAgICB9XG5cbiAgICAvLyAyLiBSZXN0b3JlIGZpbHRlcnMgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgICBpZiAoJ2hlYWRlci1maWx0ZXJzJyBpbiBsb2NhbFN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IGhlYWRlckZpbHRlcnMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXItZmlsdGVycycpIHx8ICd7fScpO1xuICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckZpbHRlcnM/LmNsaWVudCB8fCB0aGlzLmNsaWVudElkO1xuICAgICAgaWYgKGhlYWRlckZpbHRlcnM/LmRhdGU/LnN0YXJ0RGF0ZSkge1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IGhlYWRlckZpbHRlcnMuZGF0ZS5zdGFydERhdGU7XG4gICAgICAgIHRoaXMuZW5kRGF0ZSA9IGhlYWRlckZpbHRlcnMuZGF0ZS5lbmREYXRlO1xuICAgICAgfVxuICAgICAgaWYgKGhlYWRlckZpbHRlcnM/LnN0b3Jlcz8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc3RvcmVJZHMgPSB0aGlzLmV4dHJhY3RDaGVja2VkU3RvcmVzKGhlYWRlckZpbHRlcnMuc3RvcmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyYi4gUmVzdG9yZSBkZXRhaWwgdmlldyBzdGF0ZSAoc3Vydml2ZXMgY29tcG9uZW50IHJlLWluaXQgb24gZGF0ZSBjaGFuZ2UpXG4gICAgdGhpcy5yZXN0b3JlRGV0YWlsU3RhdGUoKTtcblxuICAgIC8vIDMuIFN1YnNjcmliZSB0byBxdWVyeSBwYXJhbXMgZm9yIHRhYiBzd2l0Y2hpbmdcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgIGNvbnN0IHByZXZQYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICAgIGNvbnN0IHRhYiA9IHBhcmFtc1sndGFiJ107XG4gICAgICBpZiAodGFiID09PSAnYW5hbHlzaXMnKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAnYWdlbnRhbmFseXNpcyc7XG4gICAgICB9IGVsc2UgaWYgKHRhYiA9PT0gJ21hbmFnZScpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9ICdtYW5hZ2UnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9ICdjb252ZXJzYXRpb25zJztcbiAgICAgIH1cbiAgICAgIC8vIENsZWFyIGRldGFpbCBzdGF0ZSB3aGVuIGxlYXZpbmcgQWdlbnQgQW5hbHlzaXMgdGFiXG4gICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSAhPT0gJ2FnZW50YW5hbHlzaXMnICYmIHByZXZQYWdlID09PSAnYWdlbnRhbmFseXNpcycpIHtcbiAgICAgICAgdGhpcy5kZXRhaWxWaWV3ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2hvcnRJZCA9ICcnO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29ob3J0TmFtZSA9ICcnO1xuICAgICAgICB0aGlzLmNsZWFyRGV0YWlsU3RhdGUoKTtcbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgcmVsb2FkIGlmIHRhYiBhY3R1YWxseSBjaGFuZ2VkIChza2lwIG9uIGZpcnN0IGVtaXQg4oCUIGRhdGFSYW5nZVZhbHVlIGhhbmRsZXMgaXQpXG4gICAgICBpZiAocHJldlBhZ2UgIT09IHRoaXMuY3VycmVudFBhZ2UgJiYgdGhpcy5faW5pdERvbmUpIHtcbiAgICAgICAgdGhpcy5sb2FkQ3VycmVudFRhYigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gNC4gU3Vic2NyaWJlIHRvIGdsb2JhbCB0b29sYmFyIGNoYW5nZXMg4oCUIHRoaXMgaXMgdGhlIE1BSU4gZGF0YSB0cmlnZ2VyXG4gICAgLy8gICAgKHNhbWUgcGF0dGVybiBhcyB0cmFuc2NyaXB0LWxpc3QgYW5kIGF1ZGlvLXBhZ2UpXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyRGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhPy5jbGllbnQgfHwgdGhpcy5jbGllbnRJZDtcbiAgICAgICAgaWYgKGRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSkge1xuICAgICAgICAgIHRoaXMuc3RhcnREYXRlID0gZGF0YS5kYXRlLnN0YXJ0RGF0ZTtcbiAgICAgICAgICB0aGlzLmVuZERhdGUgPSBkYXRhLmRhdGUuZW5kRGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YT8uc3RvcmVzPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlSWRzID0gdGhpcy5leHRyYWN0Q2hlY2tlZFN0b3JlcyhkYXRhLnN0b3Jlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZldGNoIGRhdGEgZm9yIGN1cnJlbnQgdGFiXG4gICAgICB0aGlzLmxvYWRDdXJyZW50VGFiKCk7XG4gICAgICB0aGlzLl9pbml0RG9uZSA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBsb2FkQ3VycmVudFRhYigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PT0gJ2NvbnZlcnNhdGlvbnMnKSB7XG4gICAgICB0aGlzLmNvbnZQYWdlID0gMTtcbiAgICAgIHRoaXMuZmV0Y2hDb252ZXJzYXRpb25zKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRQYWdlID09PSAnYWdlbnRhbmFseXNpcycpIHtcbiAgICAgIHRoaXMubG9hZENvaG9ydExpc3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT09ICdtYW5hZ2UnKSB7XG4gICAgICB0aGlzLm1hbmFnZVBhZ2UgPSAxO1xuICAgICAgdGhpcy5sb2FkTWFuYWdlQ29ob3J0cygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBNYXBwaW5nIChzYW1lIGFzIHRyYW5zY3JpcHQtbGlzdCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgbWFwQ29udmVyc2F0aW9uKGl0ZW06IGFueSk6IGFueSB7XG4gICAgY29uc3QgcmF3VGltZSA9IGl0ZW0uVGltZXN0YW1wIHx8IGl0ZW0udGltZSB8fCAnJztcbiAgICBjb25zdCByYXdEdXJhdGlvbiA9IGl0ZW0uRHVyYXRpb24gfHwgaXRlbS5kdXJhdGlvbiB8fCAnJztcbiAgICBjb25zdCByYXdEZXNjID0gaXRlbS5TdW1tYXJ5IHx8IGl0ZW0uYXVkaW9EZXNjcmlwdGlvbiB8fCBpdGVtLnN1bW1hcnkgfHwgaXRlbS5jb252ZXJzYXRpb25EZXRhaWxzPy5hdWRpb1N1bW1hcnkgfHwgJyc7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF1ZGlvSWQ6IGl0ZW0uZG9jX2lkIHx8IGl0ZW0uYXVkaW9JZCB8fCBpdGVtLl9pZCB8fCAnJyxcbiAgICAgIHN0b3JlSWQ6IGl0ZW0uc3RvcmVJZCB8fCAnJyxcbiAgICAgIHN0b3JlTmFtZTogaXRlbS5zdG9yZU5hbWUgfHwgJycsXG4gICAgICB1c2VyTmFtZTogaXRlbS5zdGFmZiB8fCBpdGVtLnN0YWZmSWQgfHwgaXRlbS51c2VyTmFtZSB8fCBpdGVtLnN0YWZmTmFtZSB8fCAnJyxcbiAgICAgIGxvY2F0aW9uOiBpdGVtLmxvY2F0aW9uIHx8IGl0ZW0uc3RhdGUgfHwgJycsXG4gICAgICBkYXRlOiBpdGVtLmRhdGUgfHwgJycsXG4gICAgICB0aW1lOiB0aGlzLmZvcm1hdFRpbWUocmF3VGltZSksXG4gICAgICBkdXJhdGlvbjogdGhpcy5mb3JtYXREdXJhdGlvbihyYXdEdXJhdGlvbiksXG4gICAgICBhdWRpb0Rlc2NyaXB0aW9uOiB0aGlzLmNsZWFuVHJhbnNjcmlwdGlvbihyYXdEZXNjKSxcbiAgICAgIGF1ZGlvVXJsOiBpdGVtLmF1ZGlvVXJsIHx8IGl0ZW0uYXVkaW9fdXJsIHx8ICcnLFxuICAgICAgY29udmVyc2F0aW9uRGV0YWlsczogaXRlbS5jb252ZXJzYXRpb25EZXRhaWxzIHx8IHsgYXVkaW9TdW1tYXJ5OiAnJywgdHJhbnNjcmlwdGlvbjogJycgfSxcbiAgICAgIG1ldHJpY3M6IHRoaXMucGFyc2VNZXRyaWNzKGl0ZW0ubWV0cmljcyksXG4gICAgICBhaUluc2lnaHRzOiBpdGVtLmFpSW5zaWdodHMgfHwgeyB0aXRsZTogJ0FJIEluc2lnaHRzJywgc3VtbWFyeTogW10gfSxcbiAgICAgIF9kZXRhaWxMb2FkZWQ6ICEhKGl0ZW0uYWlJbnNpZ2h0cyB8fCBpdGVtLmNvbnZlcnNhdGlvbkRldGFpbHMpLFxuICAgICAgX2RldGFpbExvYWRpbmc6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICAvLyBQYXJzZSBtZXRyaWNzIGZyb20gQVBJIHJlc3BvbnNlIChzYW1lIGFzIGF1ZGlvLXBhZ2UpXG4gIHByaXZhdGUgcGFyc2VNZXRyaWNzKHJhdzogYW55KTogYW55W10ge1xuICAgIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkgcmV0dXJuIHJhdztcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyYXcpXG4gICAgICAuZmlsdGVyKChzZWN0aW9uOiBhbnkpID0+IHNlY3Rpb24gJiYgdHlwZW9mIHNlY3Rpb24gPT09ICdvYmplY3QnICYmIHNlY3Rpb24udHlwZSlcbiAgICAgIC5tYXAoKHNlY3Rpb246IGFueSkgPT4gKHtcbiAgICAgICAgbmFtZTogc2VjdGlvbi5uYW1lIHx8ICcnLFxuICAgICAgICB0eXBlOiBzZWN0aW9uLnR5cGUgfHwgJycsXG4gICAgICAgIHZhbHVlOiBzZWN0aW9uLnZhbHVlIHx8IFtdXG4gICAgICB9KSk7XG4gIH1cblxuICAvLyBMb2FkIGNvbnZlcnNhdGlvbiBkZXRhaWwgb24gZXhwYW5kIChzYW1lIGFzIGF1ZGlvLXBhZ2UpXG4gIGxvYWRDb252RGV0YWlsKGNvbnY6IGFueSk6IHZvaWQge1xuICAgIGlmICgoY29udi5fZGV0YWlsTG9hZGVkICYmIGNvbnYuYXVkaW9VcmwpIHx8IGNvbnYuX2RldGFpbExvYWRpbmcpIHJldHVybjtcbiAgICBjb252Ll9kZXRhaWxMb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBwYXlsb2FkID0geyBjb2hvcnRJZDogdGhpcy5zZWxlY3RlZENvaG9ydElkID8gW3RoaXMuc2VsZWN0ZWRDb2hvcnRJZF0gOiBbXSwgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQgfTtcbiAgICB0aGlzLmF1ZGlvU2VydmljZS5nZXRDb252ZXJzYXRpb25EZXRhaWwoY29udi5hdWRpb0lkLCBwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByYXcgPSByZXM/LmRhdGE7XG4gICAgICAgIGNvbnN0IGRldGFpbCA9IHJhdz8uYXVkaW9JZCA/IHJhdyA6IChyYXc/LmRhdGE/LmF1ZGlvSWQgPyByYXcuZGF0YSA6IChyYXcgfHwge30pKTtcbiAgICAgICAgaWYgKGRldGFpbC5tZXRyaWNzKSBjb252Lm1ldHJpY3MgPSB0aGlzLnBhcnNlTWV0cmljcyhkZXRhaWwubWV0cmljcyk7XG4gICAgICAgIGlmIChkZXRhaWwuYWlJbnNpZ2h0cz8uc3VtbWFyeT8ubGVuZ3RoKSBjb252LmFpSW5zaWdodHMgPSBkZXRhaWwuYWlJbnNpZ2h0cztcbiAgICAgICAgaWYgKGRldGFpbC5jb252ZXJzYXRpb25EZXRhaWxzPy5hdWRpb1N1bW1hcnkpIGNvbnYuY29udmVyc2F0aW9uRGV0YWlscyA9IGRldGFpbC5jb252ZXJzYXRpb25EZXRhaWxzO1xuICAgICAgICBpZiAoZGV0YWlsLmF1ZGlvVXJsIHx8IGRldGFpbC5hdWRpb191cmwpIGNvbnYuYXVkaW9VcmwgPSBkZXRhaWwuYXVkaW9VcmwgfHwgZGV0YWlsLmF1ZGlvX3VybDtcbiAgICAgICAgY29udi5fZGV0YWlsTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgY29udi5fZGV0YWlsTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7IGNvbnYuX2RldGFpbExvYWRpbmcgPSBmYWxzZTsgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ2xlYW4gXCJTdGFmZjpcIiwgXCJDdXN0b21lcjpcIiBwcmVmaXhlcyBmcm9tIHRyYW5zY3JpcHRpb24gdGV4dFxuICBjbGVhblRyYW5zY3JpcHRpb24odGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiAnJztcbiAgICByZXR1cm4gdGV4dFxuICAgICAgLnJlcGxhY2UoL1xcW1xcZHsyfTpcXGR7Mn1cXHMqLT5cXHMqXFxkezJ9OlxcZHsyfVxcXVxccyovZywgJycpXG4gICAgICAucmVwbGFjZSgvXFxiKFN0YWZmfEN1c3RvbWVyKVxccyo6XFxzKi9naSwgJycpO1xuICB9XG5cbiAgLy8gRm9ybWF0IGR1cmF0aW9uIGZyb20gc2Vjb25kcyAoZS5nLiA1MTQg4oaSIFwiOG0gMTRzXCIpXG4gIHByaXZhdGUgZm9ybWF0RHVyYXRpb24odmFsOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghdmFsKSByZXR1cm4gJyc7XG4gICAgY29uc3QgdG90YWxTZWMgPSBwYXJzZUZsb2F0KHZhbCk7XG4gICAgaWYgKGlzTmFOKHRvdGFsU2VjKSkgcmV0dXJuIHZhbDtcbiAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcih0b3RhbFNlYyAvIDYwKTtcbiAgICBjb25zdCBzZWNzID0gTWF0aC5mbG9vcih0b3RhbFNlYyAlIDYwKTtcbiAgICByZXR1cm4gc2VjcyA+IDAgPyBgJHttaW5zfW0gJHtzZWNzfXNgIDogYCR7bWluc31tYDtcbiAgfVxuXG4gIC8vIEZvcm1hdCB0aW1lIGZyb20gSVNPIHN0cmluZyAoZS5nLiBcIjIwMjYtMDQtMDhUMjI6MDA6NDIuOTcyNzg5KzA1OjMwXCIg4oaSIFwiMTA6MDAgUE1cIilcbiAgcHJpdmF0ZSBmb3JtYXRUaW1lKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbCkgcmV0dXJuICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsKTtcbiAgICAgIGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiB2YWw7XG4gICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLVVTJywgeyBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLCBob3VyMTI6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBwcml2YXRlIGV4dHJhY3RDaGVja2VkU3RvcmVzKHN0b3JlczogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgLy8gRmlsdGVyIG9ubHkgY2hlY2tlZCBzdG9yZXMsIHRoZW4gZXh0cmFjdCBzdG9yZUlkXG4gICAgY29uc3QgY2hlY2tlZCA9IHN0b3Jlcy5maWx0ZXIoKHM6IGFueSkgPT4gcy5jaGVja2VkICE9PSBmYWxzZSk7XG4gICAgcmV0dXJuIGNoZWNrZWQubWFwKChzOiBhbnkpID0+IHMuX2lkIHx8IHMuc3RvcmVJZCB8fCBzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RvcmVJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlSWRzLmxlbmd0aCA+IDAgPyB0aGlzLnN0b3JlSWRzIDogdGhpcy5kZWZhdWx0U3RvcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydERhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydERhdGUgfHwgJzIwMjYtMDQtMDgnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmREYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZW5kRGF0ZSB8fCAnMjAyNi0wNC0wOCc7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQmFzZVBheWxvYWQoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50SWQ6IFt0aGlzLmNsaWVudElkXSxcbiAgICAgIHN0b3JlSWQ6IHRoaXMuZ2V0U3RvcmVJZHMoKSxcbiAgICAgIHN0YXJ0RGF0ZTogdGhpcy5nZXRTdGFydERhdGUoKSxcbiAgICAgIGVuZERhdGU6IHRoaXMuZ2V0RW5kRGF0ZSgpLFxuICAgICAgaXNBSTogdHJ1ZSxcbiAgICAgIGFuYWx5dGljc1R5cGU6ICdhdWRpbycsXG4gICAgICBpc0V4cG9ydDogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIC8vIENPTlZFUlNBVElPTlMgVEFCICh1c2VzIHRyYW5zY3JpcHRzTGlzdCBBUEkpXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICBmZXRjaENvbnZlcnNhdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5jb252TG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIC4uLnRoaXMuYnVpbGRCYXNlUGF5bG9hZCgpLFxuICAgICAgaXNBSTogZmFsc2UsXG4gICAgICBhbmFseXRpY3NUeXBlOiAndHJhbnNjcmlwdCcsXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5jb252U2VhcmNoUXVlcnkgfHwgJycsXG4gICAgICBsaW1pdDogdGhpcy5jb252UGVyUGFnZSxcbiAgICAgIF9pZDogW10sXG4gICAgICBvZmZzZXQ6IHRoaXMuY29udlBhZ2UgLSAxXG4gICAgfTtcblxuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLnRyYW5zY3JpcHRzTGlzdChwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gcmVzPy5kYXRhO1xuICAgICAgICBjb25zdCBsaXN0ID0gZGF0YT8uZGF0YSB8fCBkYXRhPy5jb252ZXJzYXRpb25zIHx8IFtdO1xuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbnMgPSBsaXN0Lm1hcCgoaXRlbTogYW55KSA9PiB0aGlzLm1hcENvbnZlcnNhdGlvbihpdGVtKSk7XG4gICAgICAgIHRoaXMuY29udlRvdGFsID0gZGF0YT8uY291bnQgPz8gZGF0YT8ucGFnaW5hdGlvbj8udG90YWwgPz8gdGhpcy5jb252ZXJzYXRpb25zLmxlbmd0aDtcbiAgICAgICAgdGhpcy5jb252VG90YWxQYWdlcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0aGlzLmNvbnZUb3RhbCAvIHRoaXMuY29udlBlclBhZ2UpKTtcbiAgICAgICAgdGhpcy5jb252UGFnaW5hdGlvblNpemVzID0gdGhpcy5jb252VG90YWwgPiAxMCA/IFsxMCwgMjAsIDUwLCAxMDBdIDogW3RoaXMuY29udlRvdGFsIHx8IDEwXTtcbiAgICAgICAgdGhpcy5jb252UGVyUGFnZSA9IHRoaXMuY29udlBhZ2luYXRpb25TaXplcy5pbmNsdWRlcyh0aGlzLmNvbnZQZXJQYWdlKSA/IHRoaXMuY29udlBlclBhZ2UgOiB0aGlzLmNvbnZQYWdpbmF0aW9uU2l6ZXNbMF07XG4gICAgICAgIC8vIEF1dG8tZXhwYW5kIGZpcnN0XG4gICAgICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZXhwYW5kZWRDb252SWRzID0geyBbdGhpcy5jb252ZXJzYXRpb25zWzBdLmF1ZGlvSWRdOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb252TG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmNvbnZUb3RhbCA9IDA7XG4gICAgICAgIHRoaXMuY29udlRvdGFsUGFnZXMgPSAxO1xuICAgICAgICB0aGlzLmNvbnZMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbkNvbnZQYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29udlBhZ2UgPSBwYWdlO1xuICAgIHRoaXMuZmV0Y2hDb252ZXJzYXRpb25zKCk7XG4gIH1cblxuICBvbkNvbnZQYWdlU2l6ZUNoYW5nZShzaXplOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnZQZXJQYWdlID0gcGFyc2VJbnQoc2l6ZSk7XG4gICAgdGhpcy5jb252UGFnZSA9IDE7XG4gICAgdGhpcy5mZXRjaENvbnZlcnNhdGlvbnMoKTtcbiAgfVxuXG4gIHRvZ2dsZUNvbnZFeHBhbmQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV4cGFuZGVkQ29udklkc1tpZF0pIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRDb252SWRzID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRDb252SWRzID0geyBbaWRdOiB0cnVlIH07XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29udklkKGNvbnY6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbnY/LmRvY19pZCB8fCBjb252Py5hdWRpb0lkIHx8IGNvbnY/Ll9pZCB8fCAnJztcbiAgfVxuXG4gIGdldENvbnZUYWIoY29udklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbnZUYWJzW2NvbnZJZF0gfHwgJ3N1bW1hcnknO1xuICB9XG5cbiAgc2V0Q29udlRhYihjb252SWQ6IHN0cmluZywgdGFiOiBzdHJpbmcsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuY29udlRhYnNbY29udklkXSA9IHRhYjtcbiAgfVxuXG4gIC8vIEFJIFNlYXJjaFxuICBzZW5kQ29udlF1ZXJ5KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb252U2VhcmNoUXVlcnkudHJpbSgpKSByZXR1cm47XG4gICAgdGhpcy5jb252QWlMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnZBaVJlcGx5ID0gJyc7XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgdXNlcl9pZDogdGhpcy51c2Vycz8uZW1haWwgfHwgJ3VzZXInLFxuICAgICAgc2Vzc2lvbl9pZDogYEVDSE9fJHtEYXRlLm5vdygpfWAsXG4gICAgICBzZXNzaW9uX2RhdGU6IHRoaXMuc3RhcnREYXRlLFxuICAgICAgc2Vzc2lvbl90aW1lem9uZTogSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lLFxuICAgICAgbWVzc2FnZTogdGhpcy5jb252U2VhcmNoUXVlcnksXG4gICAgICBhbmFseXRpY3NUeXBlOiAndHJhbnNjcmlwdCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgc2VsZWN0ZWRfc3RvcmVzOiB0aGlzLmdldFN0b3JlSWRzKCksXG4gICAgICAgIGRhdGVfcmFuZ2U6IHsgc3RhcnQ6IHRoaXMuc3RhcnREYXRlLCBlbmQ6IHRoaXMuZW5kRGF0ZSB9LFxuICAgICAgICBzZWxlY3RlZF9wcm9kdWN0czogWydBdWRpbyddXG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmNoYXRTdHJlYW0ocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jb252QWlSZXBseSA9IHR5cGVvZiByZXMgPT09ICdzdHJpbmcnID8gcmVzIDogKHJlcz8uZGF0YT8ubWFwKChkOiBhbnkpID0+IGQudGV4dCkuam9pbignJykgfHwgJ05vIHJlc3BvbnNlJyk7XG4gICAgICAgIHRoaXMuY29udkFpTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29udkFpUmVwbHkgPSAnVW5hYmxlIHRvIHByb2Nlc3MgeW91ciBxdWVyeS4gUGxlYXNlIHRyeSBhZ2Fpbi4nO1xuICAgICAgICB0aGlzLmNvbnZBaUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNvbnZTZWFyY2hRdWVyeSA9ICcnO1xuICB9XG5cbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIC8vIEFHRU5UIEFOQUxZU0lTIFRBQiAodXNlcyBjb2hvcnQgQVBJcylcbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIGxvYWRDb2hvcnRMaXN0KCk6IHZvaWQge1xuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmxpc3RDb2hvcnRzKHRoaXMuY2xpZW50SWQsIDEwMCwgMCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jb2hvcnRMaXN0ID0gcmVzPy5kYXRhPy5jb2hvcnRzIHx8IFtdO1xuICAgICAgICAvLyBJZiBhIGNvaG9ydCB3YXMgYWxyZWFkeSBzZWxlY3RlZCAoZS5nLiBmcm9tIGRyb3Bkb3duKSwgbG9hZCBpdHMgZGF0YVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENvaG9ydElkKSB7XG4gICAgICAgICAgdGhpcy5mZXRjaENvaG9ydENhcmRzKCk7XG4gICAgICAgICAgdGhpcy5mZXRjaERldGFpbENvbnZlcnNhdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMuY29ob3J0TGlzdCA9IFtdOyB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBTZWxlY3QgY29ob3J0IGZyb20gb3ZlcnZpZXcgY2FyZCBjbGlja1xuICBzZWxlY3RDb2hvcnREZXRhaWwoY29ob3J0OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQ29ob3J0SWQgPSBjb2hvcnQuY29ob3J0SWQgfHwgY29ob3J0LmlkIHx8IGNvaG9ydC5faWQgfHwgJyc7XG4gICAgdGhpcy5zZWxlY3RlZENvaG9ydE5hbWUgPSBjb2hvcnQuY29ob3J0TmFtZSB8fCBjb2hvcnQubmFtZSB8fCAnJztcbiAgICB0aGlzLmRldGFpbFZpZXcgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRDYXJkSWQgPSAnJztcbiAgICB0aGlzLnNlbGVjdGVkQ2FyZE5hbWUgPSAnJztcbiAgICB0aGlzLmRldGFpbFBhZ2UgPSAxO1xuICAgIHRoaXMuc2F2ZURldGFpbFN0YXRlKCk7XG4gICAgdGhpcy5mZXRjaENvaG9ydENhcmRzKCk7XG4gICAgdGhpcy5mZXRjaERldGFpbENvbnZlcnNhdGlvbnMoKTtcbiAgfVxuXG4gIGJhY2tUb092ZXJ2aWV3KCk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWlsVmlldyA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWRDb2hvcnRJZCA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRDb2hvcnROYW1lID0gJyc7XG4gICAgdGhpcy5jb2hvcnRDYXJkcyA9IFtdO1xuICAgIHRoaXMuZGV0YWlsUGFnZUNvbnZzID0gW107XG4gICAgdGhpcy5kZXRhaWxDb252ZXJzYXRpb25zID0gW107XG4gICAgdGhpcy5jbGVhckRldGFpbFN0YXRlKCk7XG4gIH1cblxuICAvLyDilIDilIAgUGVyc2lzdCBkZXRhaWwgdmlldyBzdGF0ZSBhY3Jvc3MgY29tcG9uZW50IHJlLWluaXQgKGRhdGUgY2hhbmdlKSDilIDilIBcbiAgcHJpdmF0ZSBzYXZlRGV0YWlsU3RhdGUoKTogdm9pZCB7XG4gICAgc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbSgnZWNoby1kZXRhaWwnLCBKU09OLnN0cmluZ2lmeSh7XG4gICAgICBkZXRhaWxWaWV3OiB0aGlzLmRldGFpbFZpZXcsXG4gICAgICBjb2hvcnRJZDogdGhpcy5zZWxlY3RlZENvaG9ydElkLFxuICAgICAgY29ob3J0TmFtZTogdGhpcy5zZWxlY3RlZENvaG9ydE5hbWVcbiAgICB9KSk7XG4gIH1cblxuICBwcml2YXRlIHJlc3RvcmVEZXRhaWxTdGF0ZSgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbSgnZWNoby1kZXRhaWwnKTtcbiAgICAgIGlmICghcmF3KSByZXR1cm47XG4gICAgICBjb25zdCBzdGF0ZSA9IEpTT04ucGFyc2UocmF3KTtcbiAgICAgIGlmIChzdGF0ZT8uZGV0YWlsVmlldyAmJiBzdGF0ZT8uY29ob3J0SWQpIHtcbiAgICAgICAgdGhpcy5kZXRhaWxWaWV3ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvaG9ydElkID0gc3RhdGUuY29ob3J0SWQ7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2hvcnROYW1lID0gc3RhdGUuY29ob3J0TmFtZSB8fCAnJztcbiAgICAgIH1cbiAgICB9IGNhdGNoIHsgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckRldGFpbFN0YXRlKCk6IHZvaWQge1xuICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oJ2VjaG8tZGV0YWlsJyk7XG4gIH1cblxuICAvLyBDaGFuZ2UgY29ob3J0IGZyb20gZHJvcGRvd25cbiAgb25Db2hvcnREcm9wZG93bkNoYW5nZShjb2hvcnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZENvaG9ydElkID0gY29ob3J0SWQ7XG4gICAgY29uc3QgY29ob3J0ID0gdGhpcy5jb2hvcnRMaXN0LmZpbmQoKGM6IGFueSkgPT4gKGMuY29ob3J0SWQgfHwgYy5pZCB8fCBjLl9pZCkgPT09IGNvaG9ydElkKTtcbiAgICB0aGlzLnNlbGVjdGVkQ29ob3J0TmFtZSA9IGNvaG9ydD8uY29ob3J0TmFtZSB8fCBjb2hvcnQ/Lm5hbWUgfHwgJyc7XG4gICAgdGhpcy5kZXRhaWxWaWV3ID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkQ2FyZElkID0gJyc7XG4gICAgdGhpcy5zZWxlY3RlZENhcmROYW1lID0gJyc7XG4gICAgdGhpcy5kZXRhaWxQYWdlID0gMTtcbiAgICB0aGlzLnNhdmVEZXRhaWxTdGF0ZSgpO1xuICAgIHRoaXMuZmV0Y2hDb2hvcnRDYXJkcygpO1xuICAgIHRoaXMuZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk7XG4gIH1cblxuICBmZXRjaENvaG9ydENhcmRzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZENvaG9ydElkKSByZXR1cm47XG4gICAgdGhpcy5jYXJkc0xvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAuLi50aGlzLmJ1aWxkQmFzZVBheWxvYWQoKSxcbiAgICAgIGNvaG9ydFR5cGU6IFt0aGlzLnNlbGVjdGVkQ29ob3J0SWRdXG4gICAgfTtcblxuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmdldENvaG9ydEFuYWx5c2lzQ2FyZChwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmNvaG9ydENhcmRzID0gdGhpcy5wYXJzZUNvaG9ydEFuYWx5c2lzKHJlcz8uZGF0YT8uY29ob3J0QW5hbHlzaXMgfHwge30pO1xuICAgICAgICB0aGlzLmNhcmRzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29ob3J0Q2FyZHMgPSBbXTtcbiAgICAgICAgdGhpcy5jYXJkc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vIFBhcnNlIGNvaG9ydCBhbmFseXNpcyAoc2FtZSBhcyBhdWRpby1wYWdlKVxuICBwYXJzZUNvaG9ydEFuYWx5c2lzKGFuYWx5c2lzOiBhbnkpOiBhbnlbXSB7XG4gICAgY29uc3QgY2FyZHM6IGFueVtdID0gW107XG4gICAgY29uc3QgbnVtZXJpY1Jvd3M6IGFueVtdID0gW107XG4gICAgY29uc3Qgc2tpcEtleXMgPSBuZXcgU2V0KFsndG90YWxBdWRpb0F2YWlsYWJsZScsICdjb2hvcnRUeXBlJywgJ2RhdGVSYW5nZScsICd1bmlxdWVQaXRjaGVzJ10pO1xuICAgIHRoaXMudG90YWxBdWRpbyA9IGFuYWx5c2lzLnRvdGFsQXVkaW9BdmFpbGFibGUgfHwgMDtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKGFuYWx5c2lzKSkge1xuICAgICAgaWYgKHNraXBLZXlzLmhhcyhrZXkpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHNlY3Rpb24gPSBhbmFseXNpc1trZXldO1xuICAgICAgaWYgKCFzZWN0aW9uIHx8IHR5cGVvZiBzZWN0aW9uICE9PSAnb2JqZWN0JykgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHZhbHVlczogYW55W10gPSBzZWN0aW9uLnZhbHVlIHx8IFtdO1xuICAgICAgY29uc3QgdHlwZSA9IHNlY3Rpb24udHlwZTtcbiAgICAgIGlmICghdmFsdWVzLmxlbmd0aCkgY29udGludWU7XG5cbiAgICAgIC8vIENvbW1vbiBmaWVsZHMgZnJvbSBzZWN0aW9uXG4gICAgICBjb25zdCBkZXNjcmlwdGlvbiA9IHNlY3Rpb24uY29tcHV0YXRpb25fbm90ZSB8fCBzZWN0aW9uLmNvbXB1dGF0aW9uTm90ZSB8fCBzZWN0aW9uLmRlc2NyaXB0aW9uIHx8IHNlY3Rpb24uZGVzYyB8fCAnJztcbiAgICAgIGNvbnN0IHNob3J0RGVzY3JpcHRpb24gPSBzZWN0aW9uLnNob3J0RGVzY3JpcHRpb24gfHwgc2VjdGlvbi5zaG9ydF9kZXNjcmlwdGlvbiB8fCAnJztcbiAgICAgIGNvbnN0IHN0YXR1cyA9IHNlY3Rpb24uc3RhdHVzIHx8IHNlY3Rpb24uc2VudGltZW50IHx8ICcnO1xuICAgICAgY29uc3QgYXBwbGljYWJsZUNvdW50ID0gc2VjdGlvbi5hcHBsaWNhYmxlX2NvdW50ID8/IHNlY3Rpb24uYXBwbGljYWJsZUNvdW50ID8/IG51bGw7XG5cbiAgICAgIGNvbnN0IGFjdHVhbFR5cGUgPSBzZWN0aW9uLmFjdHVhbF90eXBlIHx8IHNlY3Rpb24uYWN0dWFsVHlwZSB8fCAnJztcbiAgICAgIGNvbnN0IHR5cGVVcHBlciA9IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyA/IHR5cGUudG9VcHBlckNhc2UoKSA6ICcnO1xuICAgICAgY29uc3QgYWN0dWFsVXBwZXIgPSB0eXBlb2YgYWN0dWFsVHlwZSA9PT0gJ3N0cmluZycgPyBhY3R1YWxUeXBlLnRvVXBwZXJDYXNlKCkgOiAnJztcbiAgICAgIGlmICh0eXBlVXBwZXIgPT09ICdCT09MRUFOX0JBU0tFVF9UQUJMRScgfHwgYWN0dWFsVXBwZXIgPT09ICdCT09MRUFOX0JBU0tFVF9UQUJMRScpIHtcbiAgICAgICAgY29uc3QgY2FyZE5hbWUgPSBzZWN0aW9uLm5hbWUgfHwga2V5O1xuICAgICAgICBjb25zdCBkYXRhUm93czogYW55W10gPSBBcnJheS5pc0FycmF5KHNlY3Rpb24uZGF0YSkgPyBzZWN0aW9uLmRhdGEgOiBbXTtcbiAgICAgICAgY29uc3QgdGFibGVSb3dzID0gZGF0YVJvd3MubWFwKChyb3c6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGF0dHJzOiBzdHJpbmdbXSA9IEFycmF5LmlzQXJyYXkocm93LmF0dHJpYnV0ZXMpID8gcm93LmF0dHJpYnV0ZXMgOiBbXTtcbiAgICAgICAgICBjb25zdCBzdGF0dXNTZXQgPSBuZXcgU2V0KFsnRlVMRklMTEVEJywgJ05PVF9GVUxGSUxMRUQnLCAnT0ZGRVJFRF9BTFRFUk5BVElWRSddKTtcbiAgICAgICAgICBjb25zdCBNQVhfQ0hJUF9MRU4gPSAxODtcbiAgICAgICAgICBjb25zdCBNQVhfVklTSUJMRSA9IDQ7XG4gICAgICAgICAgY29uc3QgY2xlYW5lZCA9IGF0dHJzLmZpbHRlcigoYTogc3RyaW5nKSA9PiAhc3RhdHVzU2V0LmhhcygoYSB8fCAnJykudG9VcHBlckNhc2UoKSkpO1xuICAgICAgICAgIGNvbnN0IHNob3J0Q2hpcHMgPSBjbGVhbmVkLmZpbHRlcigoYzogc3RyaW5nKSA9PiBjLmxlbmd0aCA8PSBNQVhfQ0hJUF9MRU4pO1xuICAgICAgICAgIGNvbnN0IGxvbmdDaGlwcyA9IGNsZWFuZWQuZmlsdGVyKChjOiBzdHJpbmcpID0+IGMubGVuZ3RoID4gTUFYX0NISVBfTEVOKTtcbiAgICAgICAgICBjb25zdCB2aXNpYmxlID0gc2hvcnRDaGlwcy5zbGljZSgwLCBNQVhfVklTSUJMRSk7XG4gICAgICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBbLi4uc2hvcnRDaGlwcy5zbGljZShNQVhfVklTSUJMRSksIC4uLmxvbmdDaGlwc107XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiByb3cuaWQsXG4gICAgICAgICAgICBicmFuZDogcm93LmJyYW5kIHx8ICcnLFxuICAgICAgICAgICAgdmlzaWJsZUNoaXBzOiB2aXNpYmxlLFxuICAgICAgICAgICAgb3ZlcmZsb3dDaGlwczogb3ZlcmZsb3csXG4gICAgICAgICAgICBvdmVyZmxvd0NvdW50OiBvdmVyZmxvdy5sZW5ndGgsXG4gICAgICAgICAgICBvdmVyZmxvd1Rvb2x0aXA6IG92ZXJmbG93LmpvaW4oJywgJyksXG4gICAgICAgICAgICBjb3VudDogcm93LmNvdW50ID8/IDBcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgY2FyZHMucHVzaCh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5hbWU6IGNhcmROYW1lLFxuICAgICAgICAgIHR5cGU6ICdCT09MRUFOX0JBU0tFVF9UQUJMRScsXG4gICAgICAgICAgYXBwbGljYWJsZUNvdW50LFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHNob3J0RGVzY3JpcHRpb24sXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIHRhYmxlUm93c1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZVVwcGVyID09PSAnQk9PTEVBTl9CQVNLRVRfQkFSJyB8fCBhY3R1YWxVcHBlciA9PT0gJ0JPT0xFQU5fQkFTS0VUX0JBUicpIHtcbiAgICAgICAgY29uc3QgY2FyZE5hbWUgPSBzZWN0aW9uLm5hbWUgfHwga2V5O1xuICAgICAgICBjb25zdCBwaWVDb2xvcnMgPSBbJyMwRUE1RTknLCAnIzM4QkRGOCcsICcjN0REM0ZDJywgJyMwMjg0QzcnLCAnI0JBRTZGRCcsICcjMDc1OTg1JywgJyNFMEYyRkUnLCAnIzAzNjlBMScsICcjMjJEM0VFJ107XG4gICAgICAgIGNvbnN0IHJhd1Jvd3MgPSB2YWx1ZXNcbiAgICAgICAgICAubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogaXRlbS5uYW1lIHx8ICcnLFxuICAgICAgICAgICAgcmVzcG9uc2VzOiBpdGVtLlJlc3BvbnNlcyA/PyBpdGVtLmNvdW50ID8/IDAsXG4gICAgICAgICAgICBzY29yZTogaXRlbS5zY29yZSA/PyAwXG4gICAgICAgICAgfSkpXG4gICAgICAgICAgLmZpbHRlcigocjogYW55KSA9PiByLnJlc3BvbnNlcyA+IDApXG4gICAgICAgICAgLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBiLnNjb3JlIC0gYS5zY29yZSk7XG4gICAgICAgIGNvbnN0IHRvdGFsUmVzcG9uc2VzID0gcmF3Um93cy5yZWR1Y2UoKHM6IG51bWJlciwgcjogYW55KSA9PiBzICsgci5yZXNwb25zZXMsIDApO1xuICAgICAgICBjb25zdCBjeCA9IDUwLCBjeSA9IDUwLCByYWRpdXMgPSA0NTtcbiAgICAgICAgbGV0IHN0YXJ0QW5nbGUgPSAtTWF0aC5QSSAvIDI7XG4gICAgICAgIGNvbnN0IHBpZVNsaWNlcyA9IHJhd1Jvd3MubWFwKChyOiBhbnksIGk6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGZyYWN0aW9uID0gdG90YWxSZXNwb25zZXMgPyByLnJlc3BvbnNlcyAvIHRvdGFsUmVzcG9uc2VzIDogMDtcbiAgICAgICAgICBjb25zdCBhbmdsZSA9IGZyYWN0aW9uICogMiAqIE1hdGguUEk7XG4gICAgICAgICAgY29uc3QgZW5kQW5nbGUgPSBzdGFydEFuZ2xlICsgYW5nbGU7XG4gICAgICAgICAgY29uc3QgeDEgPSBjeCArIHJhZGl1cyAqIE1hdGguY29zKHN0YXJ0QW5nbGUpO1xuICAgICAgICAgIGNvbnN0IHkxID0gY3kgKyByYWRpdXMgKiBNYXRoLnNpbihzdGFydEFuZ2xlKTtcbiAgICAgICAgICBjb25zdCB4MiA9IGN4ICsgcmFkaXVzICogTWF0aC5jb3MoZW5kQW5nbGUpO1xuICAgICAgICAgIGNvbnN0IHkyID0gY3kgKyByYWRpdXMgKiBNYXRoLnNpbihlbmRBbmdsZSk7XG4gICAgICAgICAgY29uc3QgbGFyZ2VBcmMgPSBhbmdsZSA+IE1hdGguUEkgPyAxIDogMDtcbiAgICAgICAgICBsZXQgcGF0aDogc3RyaW5nO1xuICAgICAgICAgIGlmIChyYXdSb3dzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcGF0aCA9IGBNICR7Y3ggLSByYWRpdXN9ICR7Y3l9IEEgJHtyYWRpdXN9ICR7cmFkaXVzfSAwIDEgMSAke2N4ICsgcmFkaXVzfSAke2N5fSBBICR7cmFkaXVzfSAke3JhZGl1c30gMCAxIDEgJHtjeCAtIHJhZGl1c30gJHtjeX0gWmA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBhdGggPSBgTSAke2N4fSAke2N5fSBMICR7eDF9ICR7eTF9IEEgJHtyYWRpdXN9ICR7cmFkaXVzfSAwICR7bGFyZ2VBcmN9IDEgJHt4Mn0gJHt5Mn0gWmA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0YXJ0QW5nbGUgPSBlbmRBbmdsZTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWw6IHIubGFiZWwsXG4gICAgICAgICAgICByZXNwb25zZXM6IHIucmVzcG9uc2VzLFxuICAgICAgICAgICAgc2NvcmU6IHIuc2NvcmUsXG4gICAgICAgICAgICBwZXJjZW50OiBNYXRoLnJvdW5kKGZyYWN0aW9uICogMTAwKSxcbiAgICAgICAgICAgIGNvbG9yOiBwaWVDb2xvcnNbaSAlIHBpZUNvbG9ycy5sZW5ndGhdLFxuICAgICAgICAgICAgcGF0aFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBjYXJkcy5wdXNoKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbmFtZTogY2FyZE5hbWUsXG4gICAgICAgICAgdHlwZTogJ0JPT0xFQU5fQkFTS0VUX0JBUicsXG4gICAgICAgICAgYXBwbGljYWJsZUNvdW50LFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHNob3J0RGVzY3JpcHRpb24sXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIHBpZVNsaWNlcyxcbiAgICAgICAgICBzZWxlY3RlZFBpZUxhYmVsOiBwaWVTbGljZXNbMF0/LmxhYmVsIHx8ICcnXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgJiYgdHlwZS50b0xvd2VyQ2FzZSgpID09PSAnYm9vbGVhbl9iYXNrZXRfY2hhcnQnKSB7XG4gICAgICAgIGNvbnN0IGNhcmROYW1lID0gc2VjdGlvbi5uYW1lIHx8IGtleTtcbiAgICAgICAgY29uc3Qga2V5d29yZERhdGE6IGFueVtdID0gQXJyYXkuaXNBcnJheShzZWN0aW9uLmtleXdvcmREYXRhKSA/IHNlY3Rpb24ua2V5d29yZERhdGEgOiBbXTtcbiAgICAgICAgY29uc3Qgc2VudGltZW50UGFsZXR0ZTogeyBbazogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgICAgTkVHQVRJVkU6ICcjNjBDNkZGJyxcbiAgICAgICAgICBORVVUUkFMOiAnI0I2RTNGRicsXG4gICAgICAgICAgUE9TSVRJVkU6ICcjRDlGMUZGJ1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBidWlsZFNsaWNlcyA9IChzOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBuZWcgPSBzPy5uZWdhdGl2ZSA/PyAwO1xuICAgICAgICAgIGNvbnN0IG5ldSA9IHM/Lm5ldXRyYWwgPz8gMDtcbiAgICAgICAgICBjb25zdCBwb3MgPSBzPy5wb3NpdGl2ZSA/PyAwO1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICB7IGxhYmVsOiAnTmVnYXRpdmUnLCBrZXk6ICdORUdBVElWRScsIHBlcmNlbnQ6IG5lZywgY29sb3I6IHNlbnRpbWVudFBhbGV0dGVbJ05FR0FUSVZFJ10gfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOZXV0cmFsJywgIGtleTogJ05FVVRSQUwnLCAgcGVyY2VudDogbmV1LCBjb2xvcjogc2VudGltZW50UGFsZXR0ZVsnTkVVVFJBTCddIH0sXG4gICAgICAgICAgICB7IGxhYmVsOiAnUG9zaXRpdmUnLCBrZXk6ICdQT1NJVElWRScsIHBlcmNlbnQ6IHBvcywgY29sb3I6IHNlbnRpbWVudFBhbGV0dGVbJ1BPU0lUSVZFJ10gfVxuICAgICAgICAgIF07XG4gICAgICAgIH07XG4gICAgICAgIGxldCBrZXl3b3JkUm93czogYW55W10gPSBbXTtcbiAgICAgICAgaWYgKGtleXdvcmREYXRhLmxlbmd0aCkge1xuICAgICAgICAgIGtleXdvcmRSb3dzID0ga2V5d29yZERhdGEubWFwKChrOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBpZDogay5pZCxcbiAgICAgICAgICAgIGxhYmVsOiBrLmtleXdvcmQgfHwgJycsXG4gICAgICAgICAgICBjb3VudDogay5jb3VudCB8fCAwLFxuICAgICAgICAgICAgc2VudGltZW50OiBrLnNlbnRpbWVudCB8fCB7IG5lZ2F0aXZlOiAwLCBuZXV0cmFsOiAwLCBwb3NpdGl2ZTogMCB9LFxuICAgICAgICAgICAgc2xpY2VzOiBidWlsZFNsaWNlcyhrLnNlbnRpbWVudClcbiAgICAgICAgICB9KSkuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IGIuY291bnQgLSBhLmNvdW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjazogZGVyaXZlIGZyb20gY29udGVudF90YWdzICsgc2hhcmVkIHN0YXR1c190YWdzXG4gICAgICAgICAgY29uc3QgY29udGVudFRhZ3M6IGFueVtdID0gQXJyYXkuaXNBcnJheShzZWN0aW9uLmNvbnRlbnRfdGFncykgPyBzZWN0aW9uLmNvbnRlbnRfdGFncyA6IHZhbHVlcztcbiAgICAgICAgICBjb25zdCBzdGF0dXNUYWdzOiBhbnlbXSA9IEFycmF5LmlzQXJyYXkoc2VjdGlvbi5zdGF0dXNfdGFncykgPyBzZWN0aW9uLnN0YXR1c190YWdzIDogW107XG4gICAgICAgICAgY29uc3QgdG90YWxTdGF0dXMgPSBzdGF0dXNUYWdzLnJlZHVjZSgoc3VtOiBudW1iZXIsIHQ6IGFueSkgPT4gc3VtICsgKHQuY291bnQgfHwgMCksIDApO1xuICAgICAgICAgIGNvbnN0IHNoYXJlZFNlbnRpbWVudDogYW55ID0geyBuZWdhdGl2ZTogMCwgbmV1dHJhbDogMCwgcG9zaXRpdmU6IDAgfTtcbiAgICAgICAgICBzdGF0dXNUYWdzLmZvckVhY2goKHQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgayA9ICh0LnRhZyB8fCAnJykudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmIChrID09PSAnbmVnYXRpdmUnIHx8IGsgPT09ICduZXV0cmFsJyB8fCBrID09PSAncG9zaXRpdmUnKSB7XG4gICAgICAgICAgICAgIHNoYXJlZFNlbnRpbWVudFtrXSA9IHRvdGFsU3RhdHVzID8gTWF0aC5yb3VuZCgodC5jb3VudCAvIHRvdGFsU3RhdHVzKSAqIDEwMCkgOiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGtleXdvcmRSb3dzID0gY29udGVudFRhZ3MubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogaXRlbS50YWcgPz8gaXRlbS5uYW1lID8/ICcnLFxuICAgICAgICAgICAgY291bnQ6IGl0ZW0uY291bnQgPz8gaXRlbS5SZXNwb25zZXMgPz8gMCxcbiAgICAgICAgICAgIHNlbnRpbWVudDogc2hhcmVkU2VudGltZW50LFxuICAgICAgICAgICAgc2xpY2VzOiBidWlsZFNsaWNlcyhzaGFyZWRTZW50aW1lbnQpXG4gICAgICAgICAgfSkpLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBiLmNvdW50IC0gYS5jb3VudCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RSb3cgPSBrZXl3b3JkUm93c1swXSB8fCBudWxsO1xuICAgICAgICBjb25zdCBmaXJzdFNsaWNlID0gZmlyc3RSb3c/LnNsaWNlcz8uZmluZCgoczogYW55KSA9PiBzLnBlcmNlbnQgPiAwKSB8fCBmaXJzdFJvdz8uc2xpY2VzPy5bMF0gfHwgbnVsbDtcbiAgICAgICAgY2FyZHMucHVzaCh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5hbWU6IGNhcmROYW1lLFxuICAgICAgICAgIHR5cGU6ICdCT09MRUFOX0JBU0tFVF9DSEFSVCcsXG4gICAgICAgICAgYXBwbGljYWJsZUNvdW50LFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHNob3J0RGVzY3JpcHRpb24sXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGtleXdvcmRSb3dzLFxuICAgICAgICAgIHNlbGVjdGVkS2V5d29yZDogZmlyc3RSb3c/LmxhYmVsIHx8ICcnLFxuICAgICAgICAgIHNlbGVjdGVkU2xpY2VzOiBmaXJzdFJvdz8uc2xpY2VzIHx8IFtdLFxuICAgICAgICAgIHNlbGVjdGVkU2VudGltZW50OiBmaXJzdFNsaWNlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnQk9PTEVBTl9CQVNLRVQnKSB7XG4gICAgICAgIGNvbnN0IGNhcmROYW1lID0gc2VjdGlvbi5uYW1lIHx8IGtleTtcbiAgICAgICAgY29uc3QgaXNGdW5uZWwgPSBjYXJkTmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdmdW5uZWwnKTtcbiAgICAgICAgY2FyZHMucHVzaCh7XG4gICAgICAgICAga2V5LFxuICAgICAgICAgIG5hbWU6IGNhcmROYW1lLFxuICAgICAgICAgIHR5cGU6ICdCT09MRUFOX0JBU0tFVCcsXG4gICAgICAgICAgaXNGdW5uZWwsXG4gICAgICAgICAgYXBwbGljYWJsZUNvdW50LFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHNob3J0RGVzY3JpcHRpb24sXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIGJvb2xlYW5Sb3dzOiB2YWx1ZXMubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBpZDogaXRlbS5faWQgfHwgJycsXG4gICAgICAgICAgICBsYWJlbDogaXRlbS5uYW1lLFxuICAgICAgICAgICAgcmVzcG9uc2VzOiBpdGVtLlJlc3BvbnNlcyA/PyBpdGVtLmNvdW50ID8/IDAsXG4gICAgICAgICAgICBzY29yZTogaXRlbS5zY29yZSA/PyAwXG4gICAgICAgICAgfSkpLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PiBiLnJlc3BvbnNlcyAtIGEucmVzcG9uc2VzKVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ05VTUVSSUNfU0NBTEFSJyB8fCB0eXBlID09PSAnTlVNRVJJQ19BUlJBWScpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHZhbHVlc1swXSB8fCB7fTtcbiAgICAgICAgY29uc3Qgc2NhbGUgPSBzZWN0aW9uLnNjYWxlIHx8IHt9O1xuICAgICAgICBudW1lcmljUm93cy5wdXNoKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbmFtZTogc2VjdGlvbi5uYW1lIHx8IGtleSxcbiAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgYXZnOiBpdGVtLkF2ZyA/PyBpdGVtLmF2ZyA/PyAwLFxuICAgICAgICAgIG1pbjogaXRlbS5NaW4gPz8gaXRlbS5taW4gPz8gc2NhbGUubWluID8/IHNlY3Rpb24ubWluID8/IG51bGwsXG4gICAgICAgICAgbWF4OiBpdGVtLk1heCA/PyBpdGVtLm1heCA/PyBzY2FsZS5tYXggPz8gc2VjdGlvbi5tYXggPz8gbnVsbFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1NVQkpFQ1RJVkUnIHx8IHR5cGUgPT09ICdTVUJKRUNUSVZFX0NPVU5UJykge1xuICAgICAgICBjYXJkcy5wdXNoKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbmFtZTogc2VjdGlvbi5uYW1lIHx8IGtleSxcbiAgICAgICAgICB0eXBlLFxuICAgICAgICAgIGFwcGxpY2FibGVDb3VudCxcbiAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICBzaG9ydERlc2NyaXB0aW9uLFxuICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICBzdWJqZWN0aXZlUm93czogdmFsdWVzLm1hcCgoaXRlbTogYW55KSA9PiAoe1xuICAgICAgICAgICAgX2lkOiBpdGVtLl9pZCB8fCAnJyxcbiAgICAgICAgICAgIHJlYXNvbmluZzogaXRlbS5yZWFzb25pbmcgfHwgJycsXG4gICAgICAgICAgICBzdG9yZV9pZDogaXRlbS5zdG9yZV9pZCB8fCAnJyxcbiAgICAgICAgICAgIGRhdGU6IGl0ZW0uZGF0ZSB8fCAnJ1xuICAgICAgICAgIH0pKVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHcm91cCBhbGwgbnVtZXJpYyBzY29yZXMgaW50byBvbmUgY2FyZFxuICAgIGlmIChudW1lcmljUm93cy5sZW5ndGggPiAwKSB7XG4gICAgICBjYXJkcy5wdXNoKHtcbiAgICAgICAga2V5OiAnbnVtZXJpY1Njb3JlcycsXG4gICAgICAgIG5hbWU6ICdBdmVyYWdlIFNjb3JlcycsXG4gICAgICAgIHR5cGU6ICdOVU1FUklDX0dST1VQJyxcbiAgICAgICAgbnVtZXJpY1Jvd3NcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEluc2VydCB1bmlxdWUgcGl0Y2hlcyBjYXJkIGlmIHByZXNlbnQgKHNhbWUgYXMgYXVkaW8tcGFnZSlcbiAgICBpZiAoYW5hbHlzaXMudW5pcXVlUGl0Y2hlcyAmJiBBcnJheS5pc0FycmF5KGFuYWx5c2lzLnVuaXF1ZVBpdGNoZXMpKSB7XG4gICAgICBjb25zdCBwaXRjaEluc2VydElkeCA9IGNhcmRzLmxlbmd0aCA+PSAyID8gMiA6IGNhcmRzLmxlbmd0aDtcbiAgICAgIGNhcmRzLnNwbGljZShwaXRjaEluc2VydElkeCwgMCwge1xuICAgICAgICBrZXk6ICd1bmlxdWVQaXRjaGVzJyxcbiAgICAgICAgbmFtZTogJ1BpdGNoIEtleXdvcmRzIFRyYWNrZXInLFxuICAgICAgICB0eXBlOiAnVU5JUVVFX1BJVENIRVMnLFxuICAgICAgICBwaXRjaFJvd3M6IGFuYWx5c2lzLnVuaXF1ZVBpdGNoZXMubWFwKChwOiBhbnkpID0+ICh7IGlkOiBwLnBpdGNoSWQsIGRlc2M6IHAuZGVzY3JpcHRpb24gfSkpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gY2FyZHM7XG4gIH1cblxuICAvLyBDYXJkIHJvdyBjbGljayAoc2FtZSBhcyBhdWRpby1wYWdlIG9uQ2FyZFJvd0NsaWNrKVxuICBzZWxlY3RlZENhcmRJZCA9ICcnO1xuICBzZWxlY3RlZENhcmROYW1lID0gJyc7XG4gIHRvdGFsQXVkaW8gPSAwO1xuXG4gIG9uQ2FyZFJvd0NsaWNrKGlkOiBhbnksIG5hbWU6IGFueSk6IHZvaWQge1xuICAgIC8vIFN0b3AgYW55IHBsYXlpbmcgYXVkaW9cbiAgICBpZiAodGhpcy5wbGF5aW5nQ29udklkKSB7XG4gICAgICBjb25zdCBhdWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhdWRpby0ke3RoaXMucGxheWluZ0NvbnZJZH1gKSBhcyBIVE1MQXVkaW9FbGVtZW50O1xuICAgICAgaWYgKGF1ZGlvKSB7IGF1ZGlvLnBhdXNlKCk7IGF1ZGlvLmN1cnJlbnRUaW1lID0gMDsgfVxuICAgICAgdGhpcy5wbGF5aW5nQ29udklkID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZENhcmRJZCA9IGlkIHx8ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRDYXJkTmFtZSA9IGlkID8gJycgOiAobmFtZSB8fCAnJyk7XG4gICAgdGhpcy5kZXRhaWxQYWdlID0gMTtcbiAgICB0aGlzLmZldGNoRGV0YWlsQ29udmVyc2F0aW9ucygpO1xuICAgIC8vIFNjcm9sbCB0byBjb252ZXJzYXRpb25zIHNlY3Rpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdlY2hvQ29udmVyc2F0aW9ucycpPy5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSk7XG4gICAgfSwgMTAwKTtcbiAgfVxuXG4gIGZldGNoRGV0YWlsQ29udmVyc2F0aW9ucygpOiB2b2lkIHtcbiAgICAvLyBDbGVhciBvbGQgZGF0YSBpbW1lZGlhdGVseSBzbyBzdGFsZSByZXN1bHRzIGRvbid0IHNob3dcbiAgICB0aGlzLmRldGFpbENvbnZlcnNhdGlvbnMgPSBbXTtcbiAgICB0aGlzLmRldGFpbFBhZ2VDb252cyA9IFtdO1xuICAgIHRoaXMuZGV0YWlsT3BlbklkID0gbnVsbDtcbiAgICB0aGlzLmRldGFpbFRvdGFsID0gMDtcbiAgICB0aGlzLmRldGFpbExvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICAuLi50aGlzLmJ1aWxkQmFzZVBheWxvYWQoKSxcbiAgICAgIGNvaG9ydFR5cGU6IFt0aGlzLnNlbGVjdGVkQ29ob3J0SWRdLFxuICAgICAgbGltaXQ6IHRoaXMuZGV0YWlsUGVyUGFnZSxcbiAgICAgIF9pZDogdGhpcy5zZWxlY3RlZENhcmRJZCA/IFt0aGlzLnNlbGVjdGVkQ2FyZElkXSA6IFtdLFxuICAgICAgbmFtZTogdGhpcy5zZWxlY3RlZENhcmROYW1lLFxuICAgICAgb2Zmc2V0OiB0aGlzLmRldGFpbFBhZ2UgLSAxXG4gICAgfTtcblxuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmdldENvbnZlcnNhdGlvbnNMaXN0KHBheWxvYWQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSByZXM/LmRhdGE7XG4gICAgICAgIGNvbnN0IGxpc3QgPSBkYXRhPy5kYXRhIHx8IGRhdGE/LmNvbnZlcnNhdGlvbnMgfHwgW107XG4gICAgICAgIHRoaXMuZGV0YWlsQ29udmVyc2F0aW9ucyA9IGxpc3QubWFwKChpdGVtOiBhbnkpID0+IHRoaXMubWFwQ29udmVyc2F0aW9uKGl0ZW0pKTtcbiAgICAgICAgdGhpcy5kZXRhaWxUb3RhbCA9IGRhdGE/LmNvdW50ID8/IGRhdGE/LnBhZ2luYXRpb24/LnRvdGFsID8/IHRoaXMuZGV0YWlsQ29udmVyc2F0aW9ucy5sZW5ndGg7XG4gICAgICAgIHRoaXMuZGV0YWlsVG90YWxQYWdlcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0aGlzLmRldGFpbFRvdGFsIC8gdGhpcy5kZXRhaWxQZXJQYWdlKSk7XG4gICAgICAgIHRoaXMuZGV0YWlsUGFnaW5hdGlvblNpemVzID0gdGhpcy5kZXRhaWxUb3RhbCA+IDEwID8gWzEwLCAyMCwgNTAsIDEwMF0gOiBbdGhpcy5kZXRhaWxUb3RhbCB8fCAxMF07XG4gICAgICAgIHRoaXMuZGV0YWlsUGVyUGFnZSA9IHRoaXMuZGV0YWlsUGFnaW5hdGlvblNpemVzLmluY2x1ZGVzKHRoaXMuZGV0YWlsUGVyUGFnZSkgPyB0aGlzLmRldGFpbFBlclBhZ2UgOiB0aGlzLmRldGFpbFBhZ2luYXRpb25TaXplc1swXTtcbiAgICAgICAgdGhpcy5kZXRhaWxQYWdlQ29udnMgPSB0aGlzLmRldGFpbENvbnZlcnNhdGlvbnM7XG4gICAgICAgIGlmICh0aGlzLmRldGFpbFBhZ2VDb252cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5kZXRhaWxPcGVuSWQgPSB0aGlzLmRldGFpbFBhZ2VDb252c1swXS5hdWRpb0lkO1xuICAgICAgICAgIHRoaXMubG9hZENvbnZEZXRhaWwodGhpcy5kZXRhaWxQYWdlQ29udnNbMF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGV0YWlsTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuZGV0YWlsQ29udmVyc2F0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmRldGFpbFBhZ2VDb252cyA9IFtdO1xuICAgICAgICB0aGlzLmRldGFpbFRvdGFsUGFnZXMgPSAxO1xuICAgICAgICB0aGlzLmRldGFpbExvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRDb252ZXJzYXRpb25EZXRhaWwoY29udjogYW55KTogdm9pZCB7XG4gICAgY29uc3QgYXVkaW9JZCA9IGNvbnY/LmRvY19pZCB8fCBjb252Py5hdWRpb0lkIHx8IGNvbnY/Ll9pZDtcbiAgICBpZiAoIWF1ZGlvSWQpIHJldHVybjtcblxuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmdldENvbnZlcnNhdGlvbkRldGFpbChhdWRpb0lkLCB7XG4gICAgICBjb2hvcnRJZDogW3RoaXMuc2VsZWN0ZWRDb2hvcnRJZF0sXG4gICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZFxuICAgIH0pLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuZGV0YWlsQ29udkRldGFpbCA9IHJlcz8uZGF0YSB8fCByZXM7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5kZXRhaWxDb252RGV0YWlsID0gbnVsbDsgfVxuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlRGV0YWlsQ29udihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhaWxPcGVuSWQgPSB0aGlzLmRldGFpbE9wZW5JZCA9PT0gaWQgPyBudWxsIDogaWQ7XG4gIH1cblxuICBvbkRldGFpbFBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhaWxQYWdlID0gcGFnZTtcbiAgICB0aGlzLmZldGNoRGV0YWlsQ29udmVyc2F0aW9ucygpO1xuICB9XG5cbiAgb25EZXRhaWxQYWdlU2l6ZUNoYW5nZShzaXplOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFpbFBlclBhZ2UgPSBwYXJzZUludChzaXplKTtcbiAgICB0aGlzLmRldGFpbFBhZ2UgPSAxO1xuICAgIHRoaXMuZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk7XG4gIH1cblxuICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgLy8gTUFOQUdFIFRBQiAodXNlcyBsaXN0Q29ob3J0cy9kZWxldGVDb2hvcnQgQVBJcylcbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIGxvYWRNYW5hZ2VDb2hvcnRzKCk6IHZvaWQge1xuICAgIHRoaXMubWFuYWdlTG9hZGluZyA9IHRydWU7XG4gICAgY29uc3Qgb2Zmc2V0ID0gKHRoaXMubWFuYWdlUGFnZSAtIDEpICogdGhpcy5tYW5hZ2VQZXJQYWdlO1xuXG4gICAgdGhpcy5hdWRpb1NlcnZpY2UubGlzdENvaG9ydHModGhpcy5jbGllbnRJZCwgdGhpcy5tYW5hZ2VQZXJQYWdlLCBvZmZzZXQpLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubWFuYWdlQ29ob3J0cyA9IHJlcz8uZGF0YT8uY29ob3J0cyB8fCBbXTtcbiAgICAgICAgdGhpcy5tYW5hZ2VUb3RhbCA9IHJlcz8uZGF0YT8ucGFnaW5hdGlvbj8udG90YWwgPz8gdGhpcy5tYW5hZ2VDb2hvcnRzLmxlbmd0aDtcbiAgICAgICAgdGhpcy5tYW5hZ2VUb3RhbFBhZ2VzID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRoaXMubWFuYWdlVG90YWwgLyB0aGlzLm1hbmFnZVBlclBhZ2UpKTtcbiAgICAgICAgdGhpcy5tYW5hZ2VMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5tYW5hZ2VDb2hvcnRzID0gW107XG4gICAgICAgIHRoaXMubWFuYWdlVG90YWwgPSAwO1xuICAgICAgICB0aGlzLm1hbmFnZVRvdGFsUGFnZXMgPSAxO1xuICAgICAgICB0aGlzLm1hbmFnZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uTWFuYWdlUGFnZUNoYW5nZShwYWdlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLm1hbmFnZVBhZ2UgPSBwYWdlO1xuICAgIHRoaXMubG9hZE1hbmFnZUNvaG9ydHMoKTtcbiAgfVxuXG4gIG9uTWFuYWdlUGFnZVNpemVDaGFuZ2Uoc2l6ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5tYW5hZ2VQZXJQYWdlID0gcGFyc2VJbnQoc2l6ZSk7XG4gICAgdGhpcy5tYW5hZ2VQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRNYW5hZ2VDb2hvcnRzKCk7XG4gIH1cblxuICBvbk1hbmFnZVNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLm1hbmFnZVBhZ2UgPSAxO1xuICAgIHRoaXMubG9hZE1hbmFnZUNvaG9ydHMoKTtcbiAgfVxuXG4gIGRlbGV0ZUNvaG9ydChjb2hvcnRJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCFjb25maXJtKCdBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIHRoaXMgY29ob3J0PycpKSByZXR1cm47XG4gICAgdGhpcy5hdWRpb1NlcnZpY2UuZGVsZXRlQ29ob3J0KGNvaG9ydElkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICgpID0+IHsgdGhpcy5sb2FkTWFuYWdlQ29ob3J0cygpOyB9LFxuICAgICAgZXJyb3I6ICgpID0+IHsgYWxlcnQoJ0ZhaWxlZCB0byBkZWxldGUgY29ob3J0LicpOyB9XG4gICAgfSk7XG4gIH1cblxuICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgLy8gQVVESU8gUExBWUVSIChzYW1lIHBhdHRlcm4gYXMgdHJhbnNjcmlwdC1saXN0KVxuICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgcGxheWJhY2tTdGF0ZXM6IHsgW2lkOiBzdHJpbmddOiB7IGN1cnJlbnRUaW1lOiBzdHJpbmc7IHRvdGFsVGltZTogc3RyaW5nOyBwcm9ncmVzczogbnVtYmVyIH0gfSA9IHt9O1xuICBpc011dGVkID0gZmFsc2U7XG5cbiAgdG9nZ2xlUGxheShjb252SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGF1ZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGF1ZGlvLSR7Y29udklkfWApIGFzIEhUTUxBdWRpb0VsZW1lbnQ7XG4gICAgaWYgKCFhdWRpbykgcmV0dXJuO1xuICAgIGlmICh0aGlzLnBsYXlpbmdDb252SWQgPT09IGNvbnZJZCkge1xuICAgICAgYXVkaW8ucGF1c2UoKTtcbiAgICAgIHRoaXMucGxheWluZ0NvbnZJZCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBhdXNlIGFueSBjdXJyZW50bHkgcGxheWluZ1xuICAgICAgaWYgKHRoaXMucGxheWluZ0NvbnZJZCkge1xuICAgICAgICBjb25zdCBvdGhlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhdWRpby0ke3RoaXMucGxheWluZ0NvbnZJZH1gKSBhcyBIVE1MQXVkaW9FbGVtZW50O1xuICAgICAgICBpZiAob3RoZXIpIG90aGVyLnBhdXNlKCk7XG4gICAgICAgIHRoaXMucGxheWluZ0NvbnZJZCA9IG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBwbGF5UHJvbWlzZSA9IGF1ZGlvLnBsYXkoKTtcbiAgICAgIGlmIChwbGF5UHJvbWlzZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHBsYXlQcm9taXNlLnRoZW4oKCkgPT4geyB0aGlzLnBsYXlpbmdDb252SWQgPSBjb252SWQ7IH0pLmNhdGNoKCgpID0+IHsgdGhpcy5wbGF5aW5nQ29udklkID0gbnVsbDsgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnBsYXlpbmdDb252SWQgPSBjb252SWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Mb2FkZWRNZXRhZGF0YShhdWRpbzogSFRNTEF1ZGlvRWxlbWVudCwgY29udklkOiBzdHJpbmcsIGFwaUR1cmF0aW9uPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBsYXliYWNrU3RhdGVzW2NvbnZJZF0pIHtcbiAgICAgIHRoaXMucGxheWJhY2tTdGF0ZXNbY29udklkXSA9IHsgY3VycmVudFRpbWU6ICcwOjAwJywgdG90YWxUaW1lOiAnMDowMCcsIHByb2dyZXNzOiAwIH07XG4gICAgfVxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5wbGF5YmFja1N0YXRlc1tjb252SWRdO1xuICAgIGlmIChpc0Zpbml0ZShhdWRpby5kdXJhdGlvbikgJiYgYXVkaW8uZHVyYXRpb24gPiAwKSB7XG4gICAgICBzdGF0ZS50b3RhbFRpbWUgPSB0aGlzLmZvcm1hdEF1ZGlvVGltZShhdWRpby5kdXJhdGlvbik7XG4gICAgfSBlbHNlIGlmIChhcGlEdXJhdGlvbikge1xuICAgICAgc3RhdGUudG90YWxUaW1lID0gYXBpRHVyYXRpb247XG4gICAgfVxuICB9XG5cbiAgb25UaW1lVXBkYXRlKGF1ZGlvOiBIVE1MQXVkaW9FbGVtZW50LCBjb252SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wbGF5YmFja1N0YXRlc1tjb252SWRdKSB7XG4gICAgICB0aGlzLnBsYXliYWNrU3RhdGVzW2NvbnZJZF0gPSB7IGN1cnJlbnRUaW1lOiAnMDowMCcsIHRvdGFsVGltZTogJzA6MDAnLCBwcm9ncmVzczogMCB9O1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMucGxheWJhY2tTdGF0ZXNbY29udklkXTtcbiAgICBzdGF0ZS5jdXJyZW50VGltZSA9IHRoaXMuZm9ybWF0QXVkaW9UaW1lKGF1ZGlvLmN1cnJlbnRUaW1lKTtcbiAgICBpZiAoaXNGaW5pdGUoYXVkaW8uZHVyYXRpb24pICYmIGF1ZGlvLmR1cmF0aW9uID4gMCkge1xuICAgICAgc3RhdGUucHJvZ3Jlc3MgPSBhdWRpby5jdXJyZW50VGltZSAvIGF1ZGlvLmR1cmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHNlZWtBdWRpbyhldmVudDogTW91c2VFdmVudCwgY29udklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCB0cmFjayA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgcmVjdCA9IHRyYWNrLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHJhdGlvID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgKGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aCkpO1xuICAgIGNvbnN0IGF1ZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGF1ZGlvLSR7Y29udklkfWApIGFzIEhUTUxBdWRpb0VsZW1lbnQ7XG4gICAgaWYgKCFhdWRpbyB8fCAhaXNGaW5pdGUoYXVkaW8uZHVyYXRpb24pIHx8IGF1ZGlvLmR1cmF0aW9uIDw9IDApIHJldHVybjtcbiAgICBhdWRpby5jdXJyZW50VGltZSA9IHJhdGlvICogYXVkaW8uZHVyYXRpb247XG4gICAgLy8gVXBkYXRlIHdhdmVmb3JtIHByb2dyZXNzIGluc3RhbnRseSDigJQgcmVhc3NpZ24gb2JqZWN0IHRvIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvblxuICAgIGNvbnN0IHByZXYgPSB0aGlzLnBsYXliYWNrU3RhdGVzW2NvbnZJZF0gfHwgeyBjdXJyZW50VGltZTogJzA6MDAnLCB0b3RhbFRpbWU6ICcwOjAwJywgcHJvZ3Jlc3M6IDAgfTtcbiAgICB0aGlzLnBsYXliYWNrU3RhdGVzID0ge1xuICAgICAgLi4udGhpcy5wbGF5YmFja1N0YXRlcyxcbiAgICAgIFtjb252SWRdOiB7IC4uLnByZXYsIHByb2dyZXNzOiByYXRpbywgY3VycmVudFRpbWU6IHRoaXMuZm9ybWF0QXVkaW9UaW1lKGF1ZGlvLmN1cnJlbnRUaW1lKSB9XG4gICAgfTtcbiAgICAvLyBJZiBub3QgYWxyZWFkeSBwbGF5aW5nLCBzdGFydCBwbGF5YmFjayBmcm9tIHRoZSBjbGlja2VkIHBvc2l0aW9uXG4gICAgaWYgKHRoaXMucGxheWluZ0NvbnZJZCAhPT0gY29udklkKSB7XG4gICAgICBjb25zdCBwbGF5UHJvbWlzZSA9IGF1ZGlvLnBsYXkoKTtcbiAgICAgIGlmIChwbGF5UHJvbWlzZSkge1xuICAgICAgICBwbGF5UHJvbWlzZS50aGVuKCgpID0+IHsgdGhpcy5wbGF5aW5nQ29udklkID0gY29udklkOyB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdG9nZ2xlTXV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzTXV0ZWQgPSAhdGhpcy5pc011dGVkO1xuICAgIGNvbnN0IGF1ZGlvcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2F1ZGlvJyk7XG4gICAgYXVkaW9zLmZvckVhY2goYSA9PiBhLm11dGVkID0gdGhpcy5pc011dGVkKTtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0QXVkaW9UaW1lKHNlY29uZHM6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFzZWNvbmRzKSByZXR1cm4gJzA6MDAnO1xuICAgIGNvbnN0IG1pbnMgPSBNYXRoLmZsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgY29uc3Qgc2VjcyA9IE1hdGguZmxvb3Ioc2Vjb25kcyAlIDYwKTtcbiAgICByZXR1cm4gYCR7bWluc306JHtzZWNzIDwgMTAgPyAnMCcgKyBzZWNzIDogc2Vjc31gO1xuICB9XG5cbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIC8vIEZJTFRFUlMgRFJBV0VSXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICBvcGVuRmlsdGVyRHJhd2VyKCk6IHZvaWQgeyB0aGlzLmRyYXdlck9wZW4gPSB0cnVlOyB9XG4gIGNsb3NlRmlsdGVyRHJhd2VyKCk6IHZvaWQgeyB0aGlzLmRyYXdlck9wZW4gPSBmYWxzZTsgfVxuXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICAvLyBVVElMSVRZXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICB0cmFja0J5SWQoaW5kZXg6IG51bWJlciwgaXRlbTogYW55KTogYW55IHtcbiAgICByZXR1cm4gaXRlbT8uaWQgfHwgaXRlbT8uX2lkIHx8IGl0ZW0/LmRvY19pZCB8fCBpbmRleDtcbiAgfVxuXG4gIGdldFN0YXR1c0JhZGdlKHN0YXR1czogc3RyaW5nKTogeyBiZzogc3RyaW5nOyBjb2xvcjogc3RyaW5nIH0ge1xuICAgIGlmICghc3RhdHVzKSByZXR1cm4geyBiZzogJycsIGNvbG9yOiAnJyB9O1xuICAgIGNvbnN0IHMgPSBzdGF0dXMudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAocy5pbmNsdWRlcygncG9zaXRpdmUnKSB8fCBzLmluY2x1ZGVzKCdzdHJvbmcnKSB8fCBzLmluY2x1ZGVzKCdnb29kJykgfHwgcy5pbmNsdWRlcygnY29uZmlkZW50JykgfHwgcy5pbmNsdWRlcygnZXhjZWxsZW50JykpXG4gICAgICByZXR1cm4geyBiZzogJyNEMUZBRTUnLCBjb2xvcjogJyMwNjVGNDYnIH07XG4gICAgaWYgKHMuaW5jbHVkZXMoJ3dhcm5pbmcnKSB8fCBzLmluY2x1ZGVzKCdtb2RlcmF0ZScpIHx8IHMuaW5jbHVkZXMoJ3Jvb20gdG8gaW1wcm92ZScpIHx8IHMuaW5jbHVkZXMoJ2F2ZXJhZ2UnKSlcbiAgICAgIHJldHVybiB7IGJnOiAnI0ZFRjNDNycsIGNvbG9yOiAnIzkyNDAwRScgfTtcbiAgICBpZiAocy5pbmNsdWRlcygnbmVnYXRpdmUnKSB8fCBzLmluY2x1ZGVzKCd3ZWFrJykgfHwgcy5pbmNsdWRlcygncG9vcicpIHx8IHMuaW5jbHVkZXMoJ2NyaXRpY2FsJykpXG4gICAgICByZXR1cm4geyBiZzogJyNGRUUyRTInLCBjb2xvcjogJyM5OTFCMUInIH07XG4gICAgcmV0dXJuIHsgYmc6ICcjRjBGNEZGJywgY29sb3I6ICcjMUEyQjRCJyB9O1xuICB9XG5cbiAgZm9ybWF0TWV0cmljVmFsdWUodjogYW55KTogc3RyaW5nIHtcbiAgICBpZiAodi5zY29yZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBzID0gdi5zY29yZTtcbiAgICAgIGlmICh0eXBlb2YgcyA9PT0gJ251bWJlcicpIHJldHVybiBzICsgJyUnO1xuICAgICAgY29uc3Qgc3RyID0gU3RyaW5nKHMpO1xuICAgICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKS50b0xvd2VyQ2FzZSgpO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSB2LlRvdGFsID8/IHYudG90YWwgPz8gdi5BdmcgPz8gdi5hdmcgPz8gdi5jb3VudDtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2YWwuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWwuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbCAhPSBudWxsID8gU3RyaW5nKHZhbCkgOiAnJztcbiAgfVxuXG4gIGdldFNjb3JlQ29sb3Ioc2NvcmU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKHNjb3JlID49IDM1KSByZXR1cm4gJyMwMDc3RTYnO1xuICAgIGlmIChzY29yZSA+PSAyMCkgcmV0dXJuICcjMDBBM0ZGJztcbiAgICBpZiAoc2NvcmUgPj0gMTApIHJldHVybiAnIzREQzNGRic7XG4gICAgaWYgKHNjb3JlID49IDUpIHJldHVybiAnIzhBRDhGRic7XG4gICAgaWYgKHNjb3JlID49IDIpIHJldHVybiAnI0JERThGRic7XG4gICAgcmV0dXJuICcjRDlGMUZGJztcbiAgfVxuXG4gIGhhc1NlYXJjaE1hdGNoKGxpc3Q6IGFueVtdLCBzZWFyY2g6IHN0cmluZywga2V5MTogc3RyaW5nLCBrZXkyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXNlYXJjaCkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgcSA9IHNlYXJjaC50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBsaXN0LnNvbWUoaXRlbSA9PiAoKGl0ZW1ba2V5MV0gfHwgaXRlbVtrZXkyXSB8fCAnJykgYXMgc3RyaW5nKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHEpKTtcbiAgfVxuXG4gIE1hdGggPSBNYXRoO1xuXG4gIC8vIOKUgOKUgCBCb29sZWFuX2Jhc2tldF9jaGFydCBoZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvLyDilIDilIAgQk9PTEVBTl9CQVNLRVRfVEFCTEUgb3ZlcmZsb3cgdG9vbHRpcCAoZmxvYXRpbmcpIOKUgOKUgOKUgFxuICBiYnRUb29sdGlwOiB7IHZpc2libGU6IGJvb2xlYW47IHg6IG51bWJlcjsgeTogbnVtYmVyOyBpdGVtczogc3RyaW5nW10gfSA9IHtcbiAgICB2aXNpYmxlOiBmYWxzZSwgeDogMCwgeTogMCwgaXRlbXM6IFtdXG4gIH07XG5cbiAgc2hvd0JidFRvb2x0aXAoZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW1zOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3QgcmVjdCA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBhcHByb3hXaWR0aCA9IDIyMDtcbiAgICBjb25zdCBtYXJnaW4gPSAxMjtcbiAgICBjb25zdCB2dyA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIGxldCB4ID0gcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIDI7XG4gICAgY29uc3QgaGFsZldpZHRoID0gYXBwcm94V2lkdGggLyAyO1xuICAgIGlmICh4ICsgaGFsZldpZHRoID4gdncgLSBtYXJnaW4pIHggPSB2dyAtIG1hcmdpbiAtIGhhbGZXaWR0aDtcbiAgICBpZiAoeCAtIGhhbGZXaWR0aCA8IG1hcmdpbikgeCA9IG1hcmdpbiArIGhhbGZXaWR0aDtcbiAgICB0aGlzLmJidFRvb2x0aXAgPSB7XG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgeCxcbiAgICAgIHk6IHJlY3QudG9wIC0gOCxcbiAgICAgIGl0ZW1zXG4gICAgfTtcbiAgfVxuXG4gIGhpZGVCYnRUb29sdGlwKCk6IHZvaWQge1xuICAgIHRoaXMuYmJ0VG9vbHRpcCA9IHsgdmlzaWJsZTogZmFsc2UsIHg6IDAsIHk6IDAsIGl0ZW1zOiBbXSB9O1xuICB9XG5cbiAgc2VsZWN0UGllU2xpY2UoY2FyZDogYW55LCBzbGljZTogYW55KTogdm9pZCB7XG4gICAgY2FyZC5zZWxlY3RlZFBpZUxhYmVsID0gc2xpY2UubGFiZWw7XG4gIH1cblxuICBzZWxlY3RCYXNrZXRLZXl3b3JkKGNhcmQ6IGFueSwgcm93OiBhbnkpOiB2b2lkIHtcbiAgICBjYXJkLnNlbGVjdGVkS2V5d29yZCA9IHJvdy5sYWJlbDtcbiAgICBjYXJkLnNlbGVjdGVkU2xpY2VzID0gcm93LnNsaWNlcyB8fCBbXTtcbiAgICBjYXJkLnNlbGVjdGVkU2VudGltZW50ID0gY2FyZC5zZWxlY3RlZFNsaWNlcy5maW5kKChzOiBhbnkpID0+IHMucGVyY2VudCA+IDApIHx8IGNhcmQuc2VsZWN0ZWRTbGljZXNbMF0gfHwgbnVsbDtcbiAgfVxuXG4gIHNlbGVjdEJhc2tldFNlbnRpbWVudChjYXJkOiBhbnksIHNsaWNlOiBhbnkpOiB2b2lkIHtcbiAgICBjYXJkLnNlbGVjdGVkU2VudGltZW50ID0gc2xpY2U7XG4gIH1cblxuICAvLyBCdWlsZCBzdHJva2UtZGFzaGFycmF5IG9mZnNldCBzZWdtZW50cyBmb3IgZG9udXQgcmluZ1xuICBnZXREb251dERhc2goc2xpY2U6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgY2lyY3VtZmVyZW5jZSA9IDIgKiBNYXRoLlBJICogNDI7IC8vIHI9NDJcbiAgICBjb25zdCBsZW4gPSAoc2xpY2UucGVyY2VudCAvIDEwMCkgKiBjaXJjdW1mZXJlbmNlO1xuICAgIHJldHVybiBgJHtsZW59ICR7Y2lyY3VtZmVyZW5jZSAtIGxlbn1gO1xuICB9XG5cbiAgZ2V0RG9udXRPZmZzZXQoaW5kZXg6IG51bWJlciwgY2FyZDogYW55KTogbnVtYmVyIHtcbiAgICBjb25zdCBjaXJjdW1mZXJlbmNlID0gMiAqIE1hdGguUEkgKiA0MjtcbiAgICBjb25zdCBzbGljZXMgPSBjYXJkLnNlbGVjdGVkU2xpY2VzIHx8IFtdO1xuICAgIGxldCBvZmZzZXQgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykge1xuICAgICAgb2Zmc2V0ICs9IChzbGljZXNbaV0ucGVyY2VudCAvIDEwMCkgKiBjaXJjdW1mZXJlbmNlO1xuICAgIH1cbiAgICByZXR1cm4gLW9mZnNldDtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImVjaG8tcGFnZVwiPlxuICA8IS0tIEZsb2F0aW5nIHRvb2x0aXAgZm9yIEJPT0xFQU5fQkFTS0VUX1RBQkxFIG92ZXJmbG93IGNoaXBzIC0tPlxuICA8ZGl2IGNsYXNzPVwiYmJ0LWZsb2F0LXRvb2x0aXBcIlxuICAgICAgICpuZ0lmPVwiYmJ0VG9vbHRpcC52aXNpYmxlXCJcbiAgICAgICBbc3R5bGUubGVmdC5weF09XCJiYnRUb29sdGlwLnhcIlxuICAgICAgIFtzdHlsZS50b3AucHhdPVwiYmJ0VG9vbHRpcC55XCI+XG4gICAgPHNwYW4gKm5nRm9yPVwibGV0IG92IG9mIGJidFRvb2x0aXAuaXRlbXNcIiBjbGFzcz1cImJidC1jaGlwLXRvb2x0aXAtaXRlbVwiPnt7IG92IH19PC9zcGFuPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImVjaG8tY29udGVudFwiPlxuXG4gICAgPCEtLSDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgQ09OVkVSU0FUSU9OUyBUQUIg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50UGFnZSA9PT0gJ2NvbnZlcnNhdGlvbnMnXCI+XG5cbiAgICAgIDwhLS0gVGFuZ28gQUkgSGVhZGVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cInRhbmdvLWFpLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFuZ28tYWktbG9nb1wiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNlwiIGhlaWdodD1cIjI2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiI2ZmZlwiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48cGF0aCBkPVwiTTEyIDJsMi4wOSA2LjI2TDIwIDEwbC01LjkxIDEuNzRMMTIgMThsLTIuMDktNi4yNkw0IDEwbDUuOTEtMS43NEwxMiAyelwiLz48L3N2Zz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1haS1oZWFkZXItdGV4dFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1haS10aXRsZVwiPlRhbmdvIEFJPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInRhbmdvLWFpLXN1YnRpdGxlXCI+QW5hbHlzZSBjb252ZXJzYXRpb25zLCBzdG9yZXMgJiBzdGFmZiBwZXJmb3JtYW5jZTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNlYXJjaCBDYXJkIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImVjaG8tc2VhcmNoLWNhcmRcIj5cbiAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJlY2hvLXNlYXJjaC1pbnB1dFwiIHBsYWNlaG9sZGVyPVwiQXNrIGFueXRoaW5nLi4uICdXaGljaCBzdG9yZXMgYXJlIG5vdCBwZXJmb3JtaW5nIHdlbGw/J1wiIFsobmdNb2RlbCldPVwiY29udlNlYXJjaFF1ZXJ5XCIgKGtleXVwLmVudGVyKT1cInNlbmRDb252UXVlcnkoKVwiPlxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZWNoby1zZWFyY2gtc2VuZFwiIChjbGljayk9XCJzZW5kQ29udlF1ZXJ5KClcIiBbZGlzYWJsZWRdPVwiIWNvbnZTZWFyY2hRdWVyeT8udHJpbSgpXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCI+XG4gICAgICAgICAgICA8bGluZSB4MT1cIjIyXCIgeTE9XCIyXCIgeDI9XCIxMVwiIHkyPVwiMTNcIj48L2xpbmU+XG4gICAgICAgICAgICA8cG9seWdvbiBwb2ludHM9XCIyMiAyIDE1IDIyIDExIDEzIDIgOSAyMiAyXCI+PC9wb2x5Z29uPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEFJIFJlc3BvbnNlIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImVjaG8tYWktcmVzcG9uc2VcIiAqbmdJZj1cImNvbnZBaUxvYWRpbmcgfHwgY29udkFpUmVwbHlcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNvbnZBaUxvYWRpbmdcIiBjbGFzcz1cInR5cGluZ1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHlwaW5nLWRvdFwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cInR5cGluZy1kb3RcIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJ0eXBpbmctZG90XCI+PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHAgKm5nSWY9XCIhY29udkFpTG9hZGluZyAmJiBjb252QWlSZXBseVwiIGNsYXNzPVwiZWNoby1haS10ZXh0XCI+e3sgY29udkFpUmVwbHkgfX08L3A+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBUb3RhbCBjb3VudCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLWNvbnYtY291bnRcIj57eyBjb252VG90YWwgfX0gQ29udmVyc2F0aW9uczwvZGl2PlxuXG4gICAgICA8IS0tIENvbnZlcnNhdGlvbnMgbGlzdCBhcmVhIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnZlcnNhdGlvbnMtc2VjdGlvblwiPlxuXG4gICAgICA8IS0tIExvYWRpbmcgLS0+XG4gICAgICA8ZGl2ICpuZ0lmPVwiY29udkxvYWRpbmdcIiBjbGFzcz1cImVjaG8tZW1wdHktc3RhdGVcIj5Mb2FkaW5nIGNvbnZlcnNhdGlvbnMuLi48L2Rpdj5cblxuICAgICAgPCEtLSBDb252ZXJzYXRpb24gY2FyZHMgKGR5bmFtaWMgZnJvbSBBUEkg4oCUIHNhbWUgcGF0dGVybiBhcyB0cmFuc2NyaXB0LWxpc3QpIC0tPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29udiBvZiBjb252ZXJzYXRpb25zOyB0cmFja0J5OiB0cmFja0J5SWRcIiBjbGFzcz1cImNvbnYtY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlQ29udkV4cGFuZChjb252LmF1ZGlvSWQpXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnYtaGVhZGVyLWJvZHlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb252LW1ldGEtcm93XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29udi1pZFwiPnt7IGNvbnYuYXVkaW9JZCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRhLXRhZyBicmFuZFwiICpuZ0lmPVwiY29udi5zdG9yZU5hbWVcIj57eyBjb252LnN0b3JlTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRhLXRhZ1wiICpuZ0lmPVwiY29udi5sb2NhdGlvblwiPnt7IGNvbnYubG9jYXRpb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0YS10YWdcIiAqbmdJZj1cImNvbnYudXNlck5hbWVcIj57eyBjb252LnVzZXJOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldGEtdGFnXCIgKm5nSWY9XCJjb252LmRhdGVcIj57eyBjb252LmRhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0YS10YWcgbWV0YS10YWctLWR1cmF0aW9uXCIgKm5nSWY9XCJjb252LmR1cmF0aW9uXCI+e3sgY29udi5kdXJhdGlvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnYtZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAge3sgY29udi5hdWRpb0Rlc2NyaXB0aW9uIHx8ICdObyBkZXNjcmlwdGlvbiBhdmFpbGFibGUnIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi1jaGV2cm9uXCIgW2NsYXNzLm9wZW5dPVwiZXhwYW5kZWRDb252SWRzW2NvbnYuYXVkaW9JZF1cIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzk0QTNCOFwiIHN0cm9rZS13aWR0aD1cIjIuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48cGF0aCBkPVwiTTYgOWw2IDYgNi02XCIvPjwvc3ZnPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEV4cGFuZGVkIGJvZHkgKHVuaWZpZWQgbGF5b3V0IG1hdGNoaW5nIEFnZW50IEFuYWx5c2lzIGRlc2lnbikgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJleHBhbmRlZENvbnZJZHNbY29udi5hdWRpb0lkXVwiIGNsYXNzPVwiY29udi1ib2R5LWV4cGFuZGVkXCI+XG5cbiAgICAgICAgICA8IS0tIFdhdmVmb3JtIHBsYXllciAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby1wbGF5ZXJcIiAqbmdJZj1cImNvbnYuYXVkaW9VcmxcIj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJlY2hvLXBsYXktYnRuXCIgW2NsYXNzLnBsYXlpbmddPVwicGxheWluZ0NvbnZJZCA9PT0gY29udi5hdWRpb0lkXCIgKGNsaWNrKT1cInRvZ2dsZVBsYXkoY29udi5hdWRpb0lkKVwiPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicGxheWluZ0NvbnZJZCAhPT0gY29udi5hdWRpb0lkXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPjxwYXRoIGQ9XCJNOCA1djE0bDExLTd6XCIvPjwvc3ZnPlxuICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicGxheWluZ0NvbnZJZCA9PT0gY29udi5hdWRpb0lkXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPjxwYXRoIGQ9XCJNNiAxOWg0VjVINnYxNHptOC0xNHYxNGg0VjVoLTR6XCIvPjwvc3ZnPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby13YXZlZm9ybVwiIFtjbGFzcy53Zi1wbGF5aW5nXT1cInBsYXlpbmdDb252SWQgPT09IGNvbnYuYXVkaW9JZFwiIChjbGljayk9XCJzZWVrQXVkaW8oJGV2ZW50LCBjb252LmF1ZGlvSWQpXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLXdmLWJhclwiICpuZ0Zvcj1cImxldCBoIG9mIHdhdmVmb3JtSGVpZ2h0czsgbGV0IGkgPSBpbmRleFwiIFtzdHlsZS5oZWlnaHQucHhdPVwiaFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnBsYXllZF09XCIocGxheWJhY2tTdGF0ZXNbY29udi5hdWRpb0lkXT8ucHJvZ3Jlc3MgfHwgMCkgPiBpIC8gd2F2ZWZvcm1IZWlnaHRzLmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlY2hvLXRpbWVcIj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJwbGF5aW5nQ29udklkID09PSBjb252LmF1ZGlvSWQgJiYgcGxheWJhY2tTdGF0ZXNbY29udi5hdWRpb0lkXT8uY3VycmVudFRpbWVcIj57eyBwbGF5YmFja1N0YXRlc1tjb252LmF1ZGlvSWRdLmN1cnJlbnRUaW1lIH19IC8gPC9zcGFuPnt7IHBsYXliYWNrU3RhdGVzW2NvbnYuYXVkaW9JZF0/LnRvdGFsVGltZSB8fCBjb252LmR1cmF0aW9uIHx8ICctLScgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxhdWRpbyBbaWRdPVwiJ2F1ZGlvLScgKyBjb252LmF1ZGlvSWRcIiBbc3JjXT1cImNvbnYuYXVkaW9VcmxcIiBwcmVsb2FkPVwiYXV0b1wiXG4gICAgICAgICAgICAgICh0aW1ldXBkYXRlKT1cIm9uVGltZVVwZGF0ZShhdWRpb0VsLCBjb252LmF1ZGlvSWQpXCJcbiAgICAgICAgICAgICAgKGxvYWRlZG1ldGFkYXRhKT1cIm9uTG9hZGVkTWV0YWRhdGEoYXVkaW9FbCwgY29udi5hdWRpb0lkLCBjb252LmR1cmF0aW9uKVwiXG4gICAgICAgICAgICAgIChlbmRlZCk9XCJwbGF5aW5nQ29udklkID0gbnVsbFwiICNhdWRpb0VsPjwvYXVkaW8+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8IS0tIFN1bW1hcnkgQ29udGVudCAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi1ib2R5LXBhZGRpbmdcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwic3VtbWFyeS10ZXh0XCI+e3sgY29udi5hdWRpb0Rlc2NyaXB0aW9uIHx8IGNvbnYuY29udmVyc2F0aW9uRGV0YWlscz8uYXVkaW9TdW1tYXJ5IHx8ICdObyBzdW1tYXJ5IGF2YWlsYWJsZScgfX08L3A+XG4gICAgICAgICAgICA8IS0tIEFJIEluc2lnaHRzIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnYuYWlJbnNpZ2h0cz8uc3VtbWFyeT8ubGVuZ3RoXCIgY2xhc3M9XCJhaS1pbnNpZ2h0cy1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1pbnNpZ2h0cy1sYWJlbFwiPkFJIEluc2lnaHRzPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGluc2lnaHQgb2YgY29udi5haUluc2lnaHRzLnN1bW1hcnlcIiBjbGFzcz1cImFpLWluc2lnaHQtcm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLWluc2lnaHQtZG90XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiaW5zaWdodC50eXBlID09PSAncG9zaXRpdmUnID8gJyMwMEEzRkYnIDogaW5zaWdodC50eXBlID09PSAnbmVnYXRpdmUnID8gJyNFRjQ0NDQnIDogJyNGNTlFMEInXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhaS1pbnNpZ2h0LXRleHRcIj57eyBpbnNpZ2h0LnRleHQgfHwgaW5zaWdodCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBObyBkYXRhIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIiFjb252TG9hZGluZyAmJiBjb252ZXJzYXRpb25zLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiZWNoby1lbXB0eS1zdGF0ZS0tc21cIj5ObyBjb252ZXJzYXRpb25zIGZvdW5kLjwvZGl2PlxuXG4gICAgICA8IS0tIFBhZ2luYXRpb24gLS0+XG4gICAgICA8bGliLXBhZ2luYXRpb24gKm5nSWY9XCJjb252VG90YWwgPiAwXCIgW2l0ZW1zUGVyUGFnZV09XCJjb252UGVyUGFnZVwiIFtjdXJyZW50UGFnZV09XCJjb252UGFnZVwiIFt0b3RhbEl0ZW1zXT1cImNvbnZUb3RhbFwiXG4gICAgICAgIFtwYWdpbmF0aW9uU2l6ZXNdPVwiY29udlBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJjb252UGVyUGFnZVwiIChwYWdlQ2hhbmdlKT1cIm9uQ29udlBhZ2VDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvbkNvbnZQYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cbiAgICAgIDwvZGl2PiA8IS0tIGVuZCBjb252ZXJzYXRpb25zLXNlY3Rpb24gLS0+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCBBR0VOVCBBTkFMWVNJUyBUQUIg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50UGFnZSA9PT0gJ2FnZW50YW5hbHlzaXMnXCI+XG5cbiAgICAgIDwhLS0g4pSA4pSAIE9WRVJWSUVXOiBBZ2VudCBDYXJkcyBHcmlkIOKUgOKUgCAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZGV0YWlsVmlld1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLW92ZXJ2aWV3LWhlYWRlclwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLW92ZXJ2aWV3LXRpdGxlXCI+QW5hbHl0aWNzIE92ZXJ2aWV3PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLW92ZXJ2aWV3LXN1YnRpdGxlXCI+e3sgYWN0aXZlQ29ob3J0cy5sZW5ndGggfX0gYWN0aXZlIGFnZW50czwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC1zcGFjZXJcIj48L3NwYW4+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tc2VhcmNoLXdyYXBcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjcuNVwiLz48cGF0aCBkPVwiTTE2LjUgMTYuNUwyMSAyMVwiLz48L3N2Zz5cbiAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImFuYWx5c2lzU2VhcmNoXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYWdlbnRz4oCmXCIgY2xhc3M9XCJlY2hvLWlubGluZS1pbnB1dFwiPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY29ob3J0TGlzdC5sZW5ndGggPT09IDBcIiBjbGFzcz1cImVjaG8tZW1wdHktc3RhdGUtLW11dGVkXCI+TG9hZGluZyBhZ2VudHMuLi48L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLWdyaWRcIiBbc3R5bGUuZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zXT1cIidyZXBlYXQoJyArIE1hdGgubWluKGNvaG9ydExpc3QubGVuZ3RoLCA0KSArICcsIDFmciknXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29ob3J0IG9mIGNvaG9ydExpc3Q7IHRyYWNrQnk6IHRyYWNrQnlJZFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuYWx5dGljcy1jYXJkXCIgKm5nSWY9XCIhYW5hbHlzaXNTZWFyY2ggfHwgKGNvaG9ydC5jb2hvcnROYW1lIHx8IGNvaG9ydC5uYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGFuYWx5c2lzU2VhcmNoLnRvTG93ZXJDYXNlKCkpXCIgKGNsaWNrKT1cInNlbGVjdENvaG9ydERldGFpbChjb2hvcnQpXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXRpY3MtY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLWNhcmQtdG9wLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuYWx5dGljcy1jYXJkLW5hbWVcIj57eyBjb2hvcnQuY29ob3J0TmFtZSB8fCBjb2hvcnQubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhbmFseXRpY3MtY2FyZC1iYWRnZS1hY3RpdmVcIj5BY3RpdmU8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPCEtLSBtZXRyaWNzICYgc3RvcmVzIGJhZGdlcyBoaWRkZW4gZm9yIG5vdyAtLT5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXRpY3MtY2FyZC1zcGFjZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuYWx5dGljcy1jYXJkLWZvb3RlclwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYW5hbHl0aWNzLWhvdmVyLWxpbmtcIj5WaWV3IGFuYWx5dGljcyDihpI8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0g4pSA4pSAIERFVEFJTDogU2VsZWN0ZWQgQ29ob3J0IE1ldHJpY3MgKyBDb252ZXJzYXRpb25zIOKUgOKUgCAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXRhaWxWaWV3XCI+XG5cbiAgICAgICAgPCEtLSBIZWFkZXI6IOKGkCBCYWNrICsgVGl0bGUgKyBDb252ZXJzYXRpb25zICsgRHJvcGRvd24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtaGVhZGVyLWJhclwiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJkZXRhaWwtYmFjay1idG5cIiAoY2xpY2spPVwiYmFja1RvT3ZlcnZpZXcoKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PHBhdGggZD1cIk0xNSAxOGwtNi02IDYtNlwiLz48L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1oZWFkZXItdGl0bGVcIj57eyBzZWxlY3RlZENvaG9ydE5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4LXNwYWNlclwiPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1oZWFkZXItY29udi1jb3VudFwiPlRvdGFsIENvbnZlcnNhdGlvbnM6IHt7IHRvdGFsQXVkaW8gfX08L3NwYW4+XG5cbiAgICAgICAgICA8IS0tIENvaG9ydCBEcm9wZG93biAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtZHJvcGRvd24td3JhcFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWRyb3Bkb3duLXRyaWdnZXJcIiAoY2xpY2spPVwidG9nZ2xlQ29ob3J0RHJvcGRvd24oKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ob3J0LWRkLWRvdFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvaG9ydC1kZC10cmlnZ2VyLW5hbWVcIj57eyBzZWxlY3RlZENvaG9ydE5hbWUgfHwgJ1NlbGVjdCBBZ2VudCcgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzY2NzA4NVwiIHN0cm9rZS13aWR0aD1cIjIuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBbc3R5bGUudHJhbnNmb3JtXT1cImNvaG9ydERyb3Bkb3duT3BlbiA/ICdyb3RhdGUoMTgwZGVnKScgOiAnbm9uZSdcIj48cGF0aCBkPVwiTTYgOWw2IDYgNi02XCIvPjwvc3ZnPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtZHJvcGRvd24tbWVudVwiICpuZ0lmPVwiY29ob3J0RHJvcGRvd25PcGVuXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2hvcnQtZGQtc2VhcmNoLXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ob3J0LWRkLXNlYXJjaC1pbm5lclwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiNy41XCIvPjxwYXRoIGQ9XCJNMTYuNSAxNi41TDIxIDIxXCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwiY29ob3J0RHJvcGRvd25TZWFyY2hcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBhZ2VudHPigKZcIiBjbGFzcz1cImVjaG8taW5saW5lLWlucHV0LS1zbWFsbFwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvaG9ydC1kZC1zY3JvbGxcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjIG9mIGZpbHRlcmVkRHJvcGRvd25Db2hvcnRzOyB0cmFja0J5OiB0cmFja0J5SWRcIiBjbGFzcz1cImFnZW50LWRkLWl0ZW1cIiBbY2xhc3Muc2VsZWN0ZWRdPVwiKGMuY29ob3J0SWQgfHwgYy5pZCB8fCBjLl9pZCkgPT09IHNlbGVjdGVkQ29ob3J0SWRcIiAoY2xpY2spPVwic2VsZWN0Q29ob3J0RnJvbURyb3Bkb3duKGMpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ob3J0LWRkLWl0ZW0tZG90XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiYy5tZXRyaWNzQWRkZWQgPiAwID8gJyMxMEI5ODEnIDogJyNEMEQ1REQnXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ob3J0LWRkLWl0ZW0tYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtZGQtbmFtZVwiPnt7IGMuY29ob3J0TmFtZSB8fCBjLm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWRkLW1ldGFcIj57eyBjLm1ldHJpY3NBZGRlZCB8fCAwIH19IG1ldHJpY3M8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cIihjLmNvaG9ydElkIHx8IGMuaWQgfHwgYy5faWQpID09PSBzZWxlY3RlZENvaG9ydElkXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzAwQTNGRlwiIHN0cm9rZS13aWR0aD1cIjIuNVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48cGF0aCBkPVwiTTIwIDZMOSAxN2wtNS01XCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmaWx0ZXJlZERyb3Bkb3duQ29ob3J0cy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImNvaG9ydC1kZC1uby1yZXN1bHRzXCI+Tm8gYWdlbnRzIGZvdW5kPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29ob3J0RHJvcGRvd25PcGVuXCIgY2xhc3M9XCJjb2hvcnQtZGQtYmFja2Ryb3BcIiAoY2xpY2spPVwiY2xvc2VDb2hvcnREcm9wZG93bigpXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTG9hZGluZyAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNhcmRzTG9hZGluZ1wiIGNsYXNzPVwiZWNoby1lbXB0eS1zdGF0ZS0tbXV0ZWRcIj5Mb2FkaW5nIG1ldHJpY3MuLi48L2Rpdj5cblxuICAgICAgICA8IS0tIE51bWVyaWMgc2NvcmVzIOKAlCBmdWxsLXdpZHRoIHN0YXQgc3RyaXAgYWJvdmUgY2FyZHMgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhY2FyZHNMb2FkaW5nICYmIG51bWVyaWNTdHJpcENhcmQ/Lm51bWVyaWNSb3dzPy5sZW5ndGhcIiBjbGFzcz1cIm51bWVyaWMtc3RhdC1zdHJpcFwiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBudW1lcmljU3RyaXBDYXJkLm51bWVyaWNSb3dzOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICAgICAgIGNsYXNzPVwibnVtZXJpYy1zdGF0LXRpbGVcIlxuICAgICAgICAgICAgICAgW3N0eWxlLmJvcmRlci1sZWZ0LWNvbG9yXT1cImdldE51bWVyaWNUaWxlQ29sb3IoaSlcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJudW1lcmljLXN0YXQtbGFiZWxcIj57eyByb3cubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm51bWVyaWMtc3RhdC12YWx1ZVwiIFtzdHlsZS5jb2xvcl09XCJnZXROdW1lcmljVGlsZUNvbG9yKGkpXCI+XG4gICAgICAgICAgICAgIHt7IHJvdy5hdmcgfX08c3BhbiAqbmdJZj1cInJvdy5tYXggIT09IG51bGxcIiBjbGFzcz1cIm51bWVyaWMtc3RhdC1tYXhcIj4ve3sgcm93Lm1heCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm51bWVyaWMtc3RhdC1zdWJcIiAqbmdJZj1cInJvdy5tYXggIT09IG51bGwgJiYgcm93Lm1pbiAhPT0gbnVsbFwiPlxuICAgICAgICAgICAgICBzY2FsZSB7eyByb3cubWluIH194oCTe3sgcm93Lm1heCB9fXt7IHJvdy5kZXNjcmlwdGlvbiA/ICcgwrcgJyArIHJvdy5kZXNjcmlwdGlvbiA6ICcnIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBNZXRyaWMgQ2FyZHMgKGR5bmFtaWMgY29sdW1ucyBiYXNlZCBvbiBjYXJkIGNvdW50KSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFjYXJkc0xvYWRpbmcgJiYgbm9uTnVtZXJpY0NhcmRzLmxlbmd0aCA+IDBcIiBjbGFzcz1cIm1ldHJpYy1jYXJkcy1keW5hbWljXCJcbiAgICAgICAgICBbc3R5bGUuZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zXT1cIidyZXBlYXQoJyArIE1hdGgubWluKG5vbk51bWVyaWNDYXJkcy5sZW5ndGgsIDQpICsgJywgMWZyKSdcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjYXJkIG9mIG5vbk51bWVyaWNDYXJkczsgdHJhY2tCeTogdHJhY2tCeUlkXCIgY2xhc3M9XCJtZXRyaWMtY2FyZC1keW5hbWljXCJcbiAgICAgICAgICAgICAgIFtjbGFzcy5tZXRyaWMtY2FyZC1keW5hbWljLS13aWRlXT1cImNhcmQudHlwZSA9PT0gJ0JPT0xFQU5fQkFTS0VUX0JBUicgfHwgY2FyZC50eXBlID09PSAnQk9PTEVBTl9CQVNLRVRfVEFCTEUnXCI+XG4gICAgICAgICAgICA8IS0tIENhcmQgSGVhZGVyOiBUaXRsZSArIFN0YXR1cyBCYWRnZSArIEluZm8gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWNhcmQtaGVhZGVyLXJvd1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWNhcmQtdGl0bGVcIj57eyBjYXJkLm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1jYXJkLWFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNhcmQuc3RhdHVzXCIgY2xhc3M9XCJtZXRyaWMtc3RhdHVzLWJhZGdlXCJcbiAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldFN0YXR1c0JhZGdlKGNhcmQuc3RhdHVzKS5iZ1wiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiZ2V0U3RhdHVzQmFkZ2UoY2FyZC5zdGF0dXMpLmNvbG9yXCI+e3sgY2FyZC5zdGF0dXMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1pbmZvLWljb25cIiAqbmdJZj1cImNhcmQuZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjEwXCIvPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE2XCIgeDI9XCIxMlwiIHkyPVwiMTJcIi8+PGxpbmUgeDE9XCIxMlwiIHkxPVwiOFwiIHgyPVwiMTIuMDFcIiB5Mj1cIjhcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWluZm8tdG9vbHRpcFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2Pnt7IGNhcmQuZGVzY3JpcHRpb24gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1jYXJkLXN1YnRpdGxlXCIgKm5nSWY9XCJjYXJkLnR5cGUgIT09ICdOVU1FUklDX1NDQUxBUicgJiYgY2FyZC50eXBlICE9PSAnTlVNRVJJQ19BUlJBWSdcIj57eyBjYXJkLmFwcGxpY2FibGVDb3VudCA/PyB0b3RhbEF1ZGlvIH19IGNvbnZlcnNhdGlvbnM8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1jYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDwhLS0gQk9PTEVBTl9CQVNLRVRfVEFCTEUg4oCUIGJyYW5kIHJvd3Mgd2l0aCBhdHRyaWJ1dGUgY2hpcHMgKyBjb3VudCAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVF9UQUJMRSdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJidC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGNhcmQudGFibGVSb3dzXCIgY2xhc3M9XCJiYnQtcm93XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJ0LWJyYW5kXCIgW3RpdGxlXT1cInJvdy5icmFuZFwiPnt7IHJvdy5icmFuZCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJidC1jaGlwc1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgY2hpcCBvZiByb3cudmlzaWJsZUNoaXBzXCIgY2xhc3M9XCJiYnQtY2hpcFwiPnt7IGNoaXAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicm93Lm92ZXJmbG93Q291bnQgPiAwXCIgY2xhc3M9XCJiYnQtY2hpcCBiYnQtY2hpcC0tbW9yZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cInNob3dCYnRUb29sdGlwKCRldmVudCwgcm93Lm92ZXJmbG93Q2hpcHMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwiaGlkZUJidFRvb2x0aXAoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICt7eyByb3cub3ZlcmZsb3dDb3VudCB9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnQtY291bnRcIj57eyByb3cuY291bnQgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLSBCT09MRUFOX0JBU0tFVF9CQVIg4oCUIGNhdGVnb3J5IGxpc3QgKyBwaWUgY2hhcnQgKyBsZWdlbmQgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FyZC50eXBlID09PSAnQk9PTEVBTl9CQVNLRVRfQkFSJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJiLXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJiLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNsaWNlIG9mIGNhcmQucGllU2xpY2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiYmItbGlzdC1yb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmJiLWxpc3Qtcm93LS1hY3RpdmVdPVwiY2FyZC5zZWxlY3RlZFBpZUxhYmVsID09PSBzbGljZS5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQaWVTbGljZShjYXJkLCBzbGljZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYmItbGlzdC1sYWJlbFwiIFt0aXRsZV09XCJzbGljZS5sYWJlbFwiPnt7IHNsaWNlLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYi1waWUtY29sXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJiLXBpZS13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9XCJiYmItcGllXCIgdmlld0JveD1cIjAgMCAxMDAgMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGggKm5nRm9yPVwibGV0IHNsaWNlIG9mIGNhcmQucGllU2xpY2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5kXT1cInNsaWNlLnBhdGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmZpbGxdPVwic2xpY2UuY29sb3JcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT1cIiNmZmZmZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjAuOFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmJiYi1waWUtc2xpY2UtLWFjdGl2ZV09XCJjYXJkLnNlbGVjdGVkUGllTGFiZWwgPT09IHNsaWNlLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UGllU2xpY2UoY2FyZCwgc2xpY2UpXCI+PC9wYXRoPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmItbGVnZW5kXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHNsaWNlIG9mIGNhcmQucGllU2xpY2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJiYi1sZWdlbmQtcm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmJiLWxlZ2VuZC1yb3ctLWFjdGl2ZV09XCJjYXJkLnNlbGVjdGVkUGllTGFiZWwgPT09IHNsaWNlLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UGllU2xpY2UoY2FyZCwgc2xpY2UpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYmItbGVnZW5kLWRvdFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cInNsaWNlLmNvbG9yXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJiLWxlZ2VuZC1sYWJlbFwiPnt7IHNsaWNlLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJiLWxlZ2VuZC1wY3RcIj57eyBzbGljZS5wZXJjZW50IH19JTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwhLS0gQm9vbGVhbl9iYXNrZXRfY2hhcnQg4oCUIGtleXdvcmQgbGlzdCArIHNlbnRpbWVudCBkb251dCAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVF9DSEFSVCdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYy13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYy1rZXl3b3JkLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBjYXJkLmtleXdvcmRSb3dzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJiYmMta2V5d29yZC1yb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmJjLWtleXdvcmQtcm93LS1hY3RpdmVdPVwiY2FyZC5zZWxlY3RlZEtleXdvcmQgPT09IHJvdy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RCYXNrZXRLZXl3b3JkKGNhcmQsIHJvdylcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYmMta2V5d29yZC1sYWJlbFwiIFt0aXRsZV09XCJyb3cubGFiZWxcIj57eyByb3cubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJjLWtleXdvcmQtY291bnRcIj57eyByb3cuY291bnQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJjLWNoYXJ0LXNpZGVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmMtZG9udXQtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPVwiYmJjLWRvbnV0XCIgdmlld0JveD1cIjAgMCAxMDAgMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjUwXCIgY3k9XCI1MFwiIHI9XCI0MlwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiI0YxRjVGOVwiIHN0cm9rZS13aWR0aD1cIjE0XCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgICAgICAgPGNpcmNsZSAqbmdGb3I9XCJsZXQgc2xpY2Ugb2YgY2FyZC5zZWxlY3RlZFNsaWNlczsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeD1cIjUwXCIgY3k9XCI1MFwiIHI9XCI0MlwiIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLnN0cm9rZV09XCJzbGljZS5jb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxNFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5zdHJva2UtZGFzaGFycmF5XT1cImdldERvbnV0RGFzaChzbGljZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuc3Ryb2tlLWRhc2hvZmZzZXRdPVwiZ2V0RG9udXRPZmZzZXQoaSwgY2FyZClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtPVwicm90YXRlKC05MCA1MCA1MClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJidXR0XCI+PC9jaXJjbGU+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJjLWRvbnV0LWNlbnRlclwiICpuZ0lmPVwiY2FyZC5zZWxlY3RlZFNlbnRpbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmMtZG9udXQtcGN0XCI+e3sgY2FyZC5zZWxlY3RlZFNlbnRpbWVudC5wZXJjZW50IH19JTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmMtZG9udXQtY2FwXCI+e3sgY2FyZC5zZWxlY3RlZFNlbnRpbWVudC5sYWJlbC50b0xvd2VyQ2FzZSgpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJjLWxlZ2VuZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzbGljZSBvZiBjYXJkLnNlbGVjdGVkU2xpY2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJiYy1sZWdlbmQtcm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmJjLWxlZ2VuZC1yb3ctLWFjdGl2ZV09XCJjYXJkLnNlbGVjdGVkU2VudGltZW50Py5rZXkgPT09IHNsaWNlLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEJhc2tldFNlbnRpbWVudChjYXJkLCBzbGljZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJiYy1sZWdlbmQtZG90XCIgW3N0eWxlLmJvcmRlci1jb2xvcl09XCJzbGljZS5jb2xvclwiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJiYy1sZWdlbmQtbGFiZWxcIj57eyBzbGljZS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJiYy1sZWdlbmQtcGN0XCI+e3sgc2xpY2UucGVyY2VudCB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwhLS0gQk9PTEVBTl9CQVNLRVQg4oCUIEZ1bm5lbCBDaGFydCAobGVmdC1hbGlnbmVkKSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVCcgJiYgY2FyZC5pc0Z1bm5lbFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZnVubmVsLWNoYXJ0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGNhcmQuYm9vbGVhblJvd3M7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImZ1bm5lbC1zdGFnZVwiIChjbGljayk9XCJvbkNhcmRSb3dDbGljayhyb3cuaWQsIHJvdy5sYWJlbClcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5uZWwtYmFyXCIgW3RpdGxlXT1cInJvdy5sYWJlbFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC4lXT1cImNhcmQuYm9vbGVhblJvd3NbMF0/LnJlc3BvbnNlcyA+IDAgPyAocm93LnJlc3BvbnNlcyAvIGNhcmQuYm9vbGVhblJvd3NbMF0ucmVzcG9uc2VzICogMTAwKSA6IDEwMFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldFNjb3JlQ29sb3Iocm93LnNjb3JlKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ1bm5lbC1sYWJlbC13cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdW5uZWwtbGFiZWxcIj57eyByb3cubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmdW5uZWwtdmFsdWVcIj4gPHNwYW4gY2xhc3M9XCJmdW5uZWwtdmFsdWUtY291bnRcIj57eyByb3cucmVzcG9uc2VzIH19PC9zcGFuPiAoe3sgcm93LnNjb3JlIH19KSUgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwhLS0gQk9PTEVBTl9CQVNLRVQg4oCUIHJvd3Mgd2l0aCBwcm9ncmVzcyBiYXJzIChub24tZnVubmVsKSAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVCcgJiYgIWNhcmQuaXNGdW5uZWxcIj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGNhcmQuYm9vbGVhblJvd3M7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm1ldHJpYy1ib29sLXJvd1wiIChjbGljayk9XCJvbkNhcmRSb3dDbGljayhyb3cuaWQsIHJvdy5sYWJlbClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLXJvdy1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLXJvdy1kb3RcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRTY29yZUNvbG9yKHJvdy5zY29yZSlcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0cmljLXJvdy1sYWJlbFwiIFt0aXRsZV09XCJyb3cubGFiZWxcIj57eyByb3cubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldHJpYy1zY29yZSBtZXRyaWMtc2NvcmUtLXRlYWxcIj57eyByb3cuc2NvcmUgfX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRyaWMtY291bnRcIj57eyByb3cucmVzcG9uc2VzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtcHJvZ3Jlc3MtdHJhY2tcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtcHJvZ3Jlc3MtZmlsbFwiIFtzdHlsZS53aWR0aC4lXT1cInJvdy5zY29yZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldFNjb3JlQ29sb3Iocm93LnNjb3JlKVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgICAgICAgIDwhLS0gVU5JUVVFX1BJVENIRVMg4oCUIHBpdGNoIGtleXdvcmRzIHRyYWNrZXIgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FyZC50eXBlID09PSAnVU5JUVVFX1BJVENIRVMnXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwaXRjaC1rZXl3b3JkLWNvdW50XCI+e3sgY2FyZC5waXRjaFJvd3M/Lmxlbmd0aCB8fCAwIH19IGtleXdvcmRzPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcGl0Y2ggb2YgY2FyZC5waXRjaFJvd3M7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cIm1ldHJpYy1ib29sLXJvd1wiIChjbGljayk9XCJvbkNhcmRSb3dDbGljaygnJywgY2FyZC5rZXkpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLXJvdy1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtcm93LWRvdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiWycjMDBBM0ZGJywnIzEwQjk4MScsJyNGNTlFMEInLCcjRUY0NDQ0JywnIzhCNUNGNicsJyNFQzQ4OTknLCcjMDZCNkQ0JywnIzg0Q0MxNicsJyNGOTczMTYnLCcjNjM2NkYxJ11baSAlIDEwXVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpdGNoLXJvdy1sYWJlbFwiPnt7IHBpdGNoLmlkIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBpdGNoLXJvdy1kZXNjXCI+e3sgcGl0Y2guZGVzYyA/IHBpdGNoLmRlc2Muc2xpY2UoMCwgNjApIDogJ+KAkycgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLSBTVUJKRUNUSVZFIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcmQudHlwZSA9PT0gJ1NVQkpFQ1RJVkUnIHx8IGNhcmQudHlwZSA9PT0gJ1NVQkpFQ1RJVkVfQ09VTlQnXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJqZWN0aXZlLXdyYXBcIiAoY2xpY2spPVwib25DYXJkUm93Q2xpY2soJycsIGNhcmQua2V5KVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHJvdyBvZiBjYXJkLnN1YmplY3RpdmVSb3dzPy5zbGljZSgwLCAyKVwiIGNsYXNzPVwic3ViamVjdGl2ZS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIOKAoiB7eyByb3cucmVhc29uaW5nIHx8IHJvdy5zdG9yZV9pZCB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+PCEtLSBlbmQgbWV0cmljLWNhcmQtY29udGVudCAtLT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBGdWxsIG5vLWRhdGEgc3RhdGU6IG5vIGNhcmRzIEFORCBubyBjb252ZXJzYXRpb25zIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNhcmRzTG9hZGluZyAmJiAhZGV0YWlsTG9hZGluZyAmJiBjb2hvcnRDYXJkcy5sZW5ndGggPT09IDAgJiYgZGV0YWlsUGFnZUNvbnZzLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiZWNoby1ub2RhdGEtc3RhdGVcIj5cbiAgICAgICAgICA8aW1nIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiTm8gZGF0YVwiIGNsYXNzPVwiZWNoby1ub2RhdGEtaW1nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tbm9kYXRhLXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLW5vZGF0YS1zdWJcIj5ObyBhbmFseXNpcyBkYXRhIG9yIGNvbnZlcnNhdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgc2VsZWN0ZWQgZGF0ZSByYW5nZSBhbmQgc3RvcmVzLjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIOKUgOKUgCBDb252ZXJzYXRpb25zIFNlY3Rpb24gKHNob3cgd2hlbiBjYXJkcyBleGlzdCBPUiBjb252ZXJzYXRpb25zIGV4aXN0IE9SIGxvYWRpbmcpIOKUgOKUgCAtLT5cbiAgICAgICAgPGRpdiBpZD1cImVjaG9Db252ZXJzYXRpb25zXCIgY2xhc3M9XCJjb252ZXJzYXRpb25zLXNlY3Rpb25cIiAqbmdJZj1cImNhcmRzTG9hZGluZyB8fCBkZXRhaWxMb2FkaW5nIHx8IGNvaG9ydENhcmRzLmxlbmd0aCA+IDAgfHwgZGV0YWlsUGFnZUNvbnZzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLWNvbnYtc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzM0NDA1NFwiIHN0cm9rZS13aWR0aD1cIjEuOFwiPjxwYXRoIGQ9XCJNMjAgMkg0YTIgMiAwIDAgMC0yIDJ2MTNhMiAyIDAgMCAwIDIgMmgxMWw1IDNWNGEyIDIgMCAwIDAtMi0yelwiLz48L3N2Zz5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWNvbnYtc2VjdGlvbi10aXRsZVwiPkNvbnZlcnNhdGlvbnM8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZGV0YWlsTG9hZGluZ1wiIGNsYXNzPVwiZWNoby1lbXB0eS1zdGF0ZS0tbXV0ZWRcIj5Mb2FkaW5nLi4uPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBjb252IG9mIGRldGFpbFBhZ2VDb252czsgdHJhY2tCeTogdHJhY2tCeUlkXCIgY2xhc3M9XCJkZXRhaWwtY29udi1jYXJkXCI+XG4gICAgICAgICAgICA8IS0tIENvbnYgaGVhZGVyIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnYtaGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZURldGFpbENvbnYoY29udi5hdWRpb0lkKTsgbG9hZENvbnZEZXRhaWwoY29udilcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb252LWlkXCI+e3sgY29udi5hdWRpb0lkIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLW1ldGEtcm93XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRhLXRhZyBicmFuZFwiICpuZ0lmPVwiY29udi5zdG9yZU5hbWVcIj57eyBjb252LnN0b3JlTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldGEtdGFnXCIgKm5nSWY9XCJjb252LmxvY2F0aW9uXCI+e3sgY29udi5sb2NhdGlvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldGEtdGFnXCIgKm5nSWY9XCJjb252LmRhdGVcIj57eyBjb252LmRhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRhLXRhZ1wiICpuZ0lmPVwiY29udi50aW1lXCI+e3sgY29udi50aW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnYtY2hldnJvblwiIFtjbGFzcy5vcGVuXT1cImRldGFpbE9wZW5JZCA9PT0gY29udi5hdWRpb0lkXCI+XG4gICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEyXCIgaGVpZ2h0PVwiMTJcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjOTRBM0I4XCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxwYXRoIGQ9XCJNNiA5bDYgNiA2LTZcIi8+PC9zdmc+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gRXhwYW5kZWQgYm9keSAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJkZXRhaWxPcGVuSWQgPT09IGNvbnYuYXVkaW9JZFwiIGNsYXNzPVwiY29udi1ib2R5LWV4cGFuZGVkXCI+XG4gICAgICAgICAgICAgIDwhLS0gV2F2ZWZvcm0gcGxheWVyIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby1wbGF5ZXJcIiAqbmdJZj1cImNvbnYuYXVkaW9VcmxcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZWNoby1wbGF5LWJ0blwiIFtjbGFzcy5wbGF5aW5nXT1cInBsYXlpbmdDb252SWQgPT09IGNvbnYuYXVkaW9JZFwiIChjbGljayk9XCJ0b2dnbGVQbGF5KGNvbnYuYXVkaW9JZClcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJwbGF5aW5nQ29udklkICE9PSBjb252LmF1ZGlvSWRcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCI+PHBhdGggZD1cIk04IDV2MTRsMTEtN3pcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgICA8c3ZnICpuZ0lmPVwicGxheWluZ0NvbnZJZCA9PT0gY29udi5hdWRpb0lkXCIgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJ3aGl0ZVwiPjxwYXRoIGQ9XCJNNiAxOWg0VjVINnYxNHptOC0xNHYxNGg0VjVoLTR6XCIvPjwvc3ZnPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLXdhdmVmb3JtXCIgW2NsYXNzLndmLXBsYXlpbmddPVwicGxheWluZ0NvbnZJZCA9PT0gY29udi5hdWRpb0lkXCIgKGNsaWNrKT1cInNlZWtBdWRpbygkZXZlbnQsIGNvbnYuYXVkaW9JZClcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLXdmLWJhclwiICpuZ0Zvcj1cImxldCBoIG9mIHdhdmVmb3JtSGVpZ2h0czsgbGV0IGkgPSBpbmRleFwiIFtzdHlsZS5oZWlnaHQucHhdPVwiaFwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5wbGF5ZWRdPVwiKHBsYXliYWNrU3RhdGVzW2NvbnYuYXVkaW9JZF0/LnByb2dyZXNzIHx8IDApID4gaSAvIHdhdmVmb3JtSGVpZ2h0cy5sZW5ndGhcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImVjaG8tdGltZVwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInBsYXlpbmdDb252SWQgPT09IGNvbnYuYXVkaW9JZCAmJiBwbGF5YmFja1N0YXRlc1tjb252LmF1ZGlvSWRdPy5jdXJyZW50VGltZVwiPnt7IHBsYXliYWNrU3RhdGVzW2NvbnYuYXVkaW9JZF0uY3VycmVudFRpbWUgfX0gLyA8L3NwYW4+e3sgcGxheWJhY2tTdGF0ZXNbY29udi5hdWRpb0lkXT8udG90YWxUaW1lIHx8IGNvbnYuZHVyYXRpb24gfHwgJy0tJyB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxhdWRpbyBbaWRdPVwiJ2F1ZGlvLScgKyBjb252LmF1ZGlvSWRcIiBbc3JjXT1cImNvbnYuYXVkaW9VcmxcIiBwcmVsb2FkPVwiYXV0b1wiXG4gICAgICAgICAgICAgICAgICAodGltZXVwZGF0ZSk9XCJvblRpbWVVcGRhdGUoYXVkaW9FbCwgY29udi5hdWRpb0lkKVwiXG4gICAgICAgICAgICAgICAgICAobG9hZGVkbWV0YWRhdGEpPVwib25Mb2FkZWRNZXRhZGF0YShhdWRpb0VsLCBjb252LmF1ZGlvSWQsIGNvbnYuZHVyYXRpb24pXCJcbiAgICAgICAgICAgICAgICAgIChlbmRlZCk9XCJwbGF5aW5nQ29udklkID0gbnVsbFwiICNhdWRpb0VsPjwvYXVkaW8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gVGFicyAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnYtdGFic1wiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb252LXRhYi1idG5cIiBbY2xhc3MuYWN0aXZlXT1cImdldENvbnZUYWIoY29udi5hdWRpb0lkKSA9PT0gJ3N1bW1hcnknXCIgKGNsaWNrKT1cInNldENvbnZUYWIoY29udi5hdWRpb0lkLCAnc3VtbWFyeScsICRldmVudClcIj5TdW1tYXJ5PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnYtdGFiLWJ0blwiIFtjbGFzcy5hY3RpdmVdPVwiZ2V0Q29udlRhYihjb252LmF1ZGlvSWQpID09PSAndHJhbnNjcmlwdCdcIiAoY2xpY2spPVwic2V0Q29udlRhYihjb252LmF1ZGlvSWQsICd0cmFuc2NyaXB0JywgJGV2ZW50KVwiPlRyYW5zY3JpcHQ8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPCEtLSBDb250ZW50OiBMZWZ0IChTdW1tYXJ5L1RyYW5zY3JpcHQgKyBBSSBJbnNpZ2h0cykgKyBSaWdodCAoTWV0cmljcykgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtY29udGVudC1zcGxpdFwiPlxuICAgICAgICAgICAgICAgIDwhLS0gTGVmdCBzaWRlIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtY29udGVudC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29udlRhYihjb252LmF1ZGlvSWQpID09PSAnc3VtbWFyeSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzdW1tYXJ5LXRleHRcIj57eyBjb252LmF1ZGlvRGVzY3JpcHRpb24gfHwgY29udi5jb252ZXJzYXRpb25EZXRhaWxzPy5hdWRpb1N1bW1hcnkgfHwgJ05vIHN1bW1hcnkgYXZhaWxhYmxlJyB9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBBSSBJbnNpZ2h0cyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnYuYWlJbnNpZ2h0cz8uc3VtbWFyeT8ubGVuZ3RoXCIgY2xhc3M9XCJhaS1pbnNpZ2h0cy1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLWluc2lnaHRzLWxhYmVsXCI+QUkgSW5zaWdodHM8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpbnNpZ2h0IG9mIGNvbnYuYWlJbnNpZ2h0cy5zdW1tYXJ5XCIgY2xhc3M9XCJhaS1pbnNpZ2h0LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLWluc2lnaHQtZG90XCIgW3N0eWxlLmJhY2tncm91bmRdPVwiaW5zaWdodC50eXBlID09PSAncG9zaXRpdmUnID8gJyMwMEEzRkYnIDogaW5zaWdodC50eXBlID09PSAnbmVnYXRpdmUnID8gJyNFRjQ0NDQnIDogJyNGNTlFMEInXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFpLWluc2lnaHQtdGV4dFwiPnt7IGluc2lnaHQudGV4dCB8fCBpbnNpZ2h0IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldENvbnZUYWIoY29udi5hdWRpb0lkKSA9PT0gJ3RyYW5zY3JpcHQnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3VtbWFyeS10ZXh0IHN1bW1hcnktdGV4dC0tcHJld3JhcFwiPnt7IGNsZWFuVHJhbnNjcmlwdGlvbihjb252LmNvbnZlcnNhdGlvbkRldGFpbHM/LnRyYW5zY3JpcHRpb24pIHx8ICdObyB0cmFuc2NyaXB0IGF2YWlsYWJsZScgfX08L3A+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8IS0tIFJpZ2h0IHNpZGU6IE1ldHJpY3MgKG9ubHkgc2hvdyB2YWx1ZXMgdGhhdCBoYXZlIGRhdGEpIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtY29udGVudC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpY3MtcGFuZWwtbGFiZWxcIj5NZXRyaWNzPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udi5tZXRyaWNzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbSBvZiBjb252Lm1ldHJpY3NcIiBjbGFzcz1cIm1ldHJpYy1pdGVtLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNpbmdsZSB2YWx1ZTogbmFtZSArIHZhbHVlIG9uIHNhbWUgcm93IC0tPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtLnZhbHVlPy5sZW5ndGggPT09IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtc2luZ2xlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldHJpYy1zaW5nbGUtbmFtZVwiIFt0aXRsZV09XCJtLm5hbWVcIj57eyBtLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0cmljLXNpbmdsZS12YWx1ZVwiIFtzdHlsZS5jb2xvcl09XCJtLnZhbHVlWzBdLnNjb3JlICE9PSBudWxsICYmIG0udmFsdWVbMF0uc2NvcmUgIT09IHVuZGVmaW5lZCA/ICcjMDBBM0ZGJyA6ICcjMzQ0MDU0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdE1ldHJpY1ZhbHVlKG0udmFsdWVbMF0pIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTXVsdGlwbGUgdmFsdWVzOiBoZWFkZXIgKyByb3dzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJtLnZhbHVlPy5sZW5ndGggPiAxXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLW11bHRpLWhlYWRlclwiIFt0aXRsZV09XCJtLm5hbWVcIj57eyBtLm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHYgb2YgbS52YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiKHYuc2NvcmUgIT09IG51bGwgJiYgdi5zY29yZSAhPT0gdW5kZWZpbmVkKSB8fCAodi5Ub3RhbCAhPT0gbnVsbCAmJiB2LlRvdGFsICE9PSB1bmRlZmluZWQpIHx8ICh2LkF2ZyAhPT0gbnVsbCAmJiB2LkF2ZyAhPT0gdW5kZWZpbmVkKSB8fCAodi50b3RhbCAhPT0gbnVsbCAmJiB2LnRvdGFsICE9PSB1bmRlZmluZWQpIHx8ICh2LmF2ZyAhPT0gbnVsbCAmJiB2LmF2ZyAhPT0gdW5kZWZpbmVkKSB8fCAodi5jb3VudCAhPT0gbnVsbCAmJiB2LmNvdW50ICE9PSB1bmRlZmluZWQpXCIgY2xhc3M9XCJtZXRyaWMtbXVsdGktcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRyaWMtbXVsdGktbmFtZVwiIFt0aXRsZV09XCJ2Lm5hbWVcIj57eyB2Lm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRyaWMtbXVsdGktdmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInYuc2NvcmUgIT09IG51bGwgJiYgdi5zY29yZSAhPT0gdW5kZWZpbmVkID8gJyMwMEEzRkYnIDogJyMzNDQwNTQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyBmb3JtYXRNZXRyaWNWYWx1ZSh2KSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udi5tZXRyaWNzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbnYuc3RvcmVOYW1lXCIgY2xhc3M9XCJtZXRyaWMtZmFsbGJhY2stcm93XCI+PHNwYW4gY2xhc3M9XCJtZXRyaWMtZmFsbGJhY2stbGFiZWxcIj5TdG9yZTwvc3Bhbj48c3BhbiBjbGFzcz1cIm1ldHJpYy1mYWxsYmFjay12YWx1ZVwiPnt7IGNvbnYuc3RvcmVOYW1lIH19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udi5kdXJhdGlvblwiIGNsYXNzPVwibWV0cmljLWZhbGxiYWNrLXJvd1wiPjxzcGFuIGNsYXNzPVwibWV0cmljLWZhbGxiYWNrLWxhYmVsXCI+RHVyYXRpb248L3NwYW4+PHNwYW4gY2xhc3M9XCJtZXRyaWMtZmFsbGJhY2stdmFsdWVcIj57eyBjb252LmR1cmF0aW9uIH19PC9zcGFuPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udi5fZGV0YWlsTG9hZGluZ1wiIGNsYXNzPVwibWV0cmljLWRldGFpbC1sb2FkaW5nXCI+TG9hZGluZy4uLjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE5vIGNvbnZlcnNhdGlvbnMgZm9yIHRoaXMgZmlsdGVyIChvbmx5IHdoZW4gY2FyZHMgZXhpc3QgYnV0IGNvbnZzIGFyZSBlbXB0eSkgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhZGV0YWlsTG9hZGluZyAmJiBkZXRhaWxQYWdlQ29udnMubGVuZ3RoID09PSAwICYmIGNvaG9ydENhcmRzLmxlbmd0aCA+IDBcIiBjbGFzcz1cImVjaG8tbm9kYXRhLXN0YXRlXCI+XG4gICAgICAgICAgPGltZyBzcmM9XCIuL2Fzc2V0cy90YW5nby9JY29ucy9Ob2RhdGExLnN2Z1wiIGFsdD1cIk5vIGRhdGFcIiBjbGFzcz1cImVjaG8tbm9kYXRhLWltZ1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLW5vZGF0YS10aXRsZVwiPk5vIGRhdGEgZm91bmQ8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby1ub2RhdGEtc3ViXCI+Tm8gY29udmVyc2F0aW9ucyBhdmFpbGFibGUgZm9yIHRoZSBzZWxlY3RlZCBmaWx0ZXIuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gUGFnaW5hdGlvbiAtLT5cbiAgICAgICAgPGxpYi1wYWdpbmF0aW9uICpuZ0lmPVwiZGV0YWlsVG90YWwgPiAwXCIgW2l0ZW1zUGVyUGFnZV09XCJkZXRhaWxQZXJQYWdlXCIgW2N1cnJlbnRQYWdlXT1cImRldGFpbFBhZ2VcIiBbdG90YWxJdGVtc109XCJkZXRhaWxUb3RhbFwiXG4gICAgICAgICAgW3BhZ2luYXRpb25TaXplc109XCJkZXRhaWxQYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwiZGV0YWlsUGVyUGFnZVwiIChwYWdlQ2hhbmdlKT1cIm9uRGV0YWlsUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25EZXRhaWxQYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPjwhLS0gZW5kIGRldGFpbFZpZXcgLS0+XG4gICAgPC9uZy1jb250YWluZXI+PCEtLSBlbmQgYWdlbnRhbmFseXNpcyAtLT5cblxuICAgIDwhLS0g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIE1BTkFHRSBUQUIg4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIC0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50UGFnZSA9PT0gJ21hbmFnZSdcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYW5hZ2UtaGVhZGVyXCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1hbmFnZS10aXRsZVwiPkFnZW50czwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYW5hZ2Utc3VidGl0bGVcIj57eyBtYW5hZ2VUb3RhbCB9fSBhZ2VudHM8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC1zcGFjZXJcIj48L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLXNlYXJjaC13cmFwLS13aWRlXCI+XG4gICAgICAgICAgPHN2ZyB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjOTRBM0I4XCIgc3Ryb2tlLXdpZHRoPVwiMS44XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMVwiIGN5PVwiMTFcIiByPVwiNy41XCIvPjxwYXRoIGQ9XCJNMTYuNSAxNi41TDIxIDIxXCIvPjwvc3ZnPlxuICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cIm1hbmFnZVNlYXJjaFwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uTWFuYWdlU2VhcmNoKClcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCBhZ2VudHMuLi5cIiBjbGFzcz1cIm1hbmFnZS1zZWFyY2gtaW5wdXRcIj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiAqbmdJZj1cIm1hbmFnZUxvYWRpbmdcIiBjbGFzcz1cImVjaG8tZW1wdHktc3RhdGVcIj5Mb2FkaW5nIGFnZW50cy4uLjwvZGl2PlxuXG4gICAgICA8IS0tIEFnZW50cyB0YWJsZSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhbWFuYWdlTG9hZGluZ1wiIGNsYXNzPVwiZWNoby1jYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudHMtdGFibGUtaGVhZGVyIGFnZW50cy10YWJsZS00Y29sXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50cy10YWJsZS1jZWxsXCI+QWdlbnQgTmFtZTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudHMtdGFibGUtY2VsbCBhZ2VudHMtdGFibGUtY2VsbC0tY2VudGVyXCI+TWV0cmljczwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudHMtdGFibGUtY2VsbCBhZ2VudHMtdGFibGUtY2VsbC0tY2VudGVyXCI+U291cmNlPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50cy10YWJsZS1jZWxsIGFnZW50cy10YWJsZS1jZWxsLS1jZW50ZXJcIj5BY3Rpb248L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvaG9ydCBvZiBtYW5hZ2VDb2hvcnRzOyB0cmFja0J5OiB0cmFja0J5SWRcIiBjbGFzcz1cImFnZW50cy10YWJsZS1yb3cgYWdlbnRzLXRhYmxlLTRjb2xcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtY2VsbC1uYW1lLXdyYXBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1jZWxsLW5hbWVcIj57eyBjb2hvcnQuY29ob3J0TmFtZSB8fCBjb2hvcnQubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWNlbGwtZGVzY1wiPnt7IGNvaG9ydC5jb2hvcnREZXNjcmlwdGlvbiB8fCBjb2hvcnQuZGVzY3JpcHRpb24gfHwgJycgfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtY2VsbC1tZXRyaWNzXCI+e3sgY29ob3J0Lm1ldHJpY3NBZGRlZCB8fCBjb2hvcnQubWV0cmljQWRkZWQgfHwgY29ob3J0Lm1ldHJpY3M/Lmxlbmd0aCB8fCAwIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWNlbGwtc291cmNlXCI+e3sgY29ob3J0LnNvdXJjZT8uam9pbignLCAnKSB8fCAn4oCTJyB9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1jZWxsLWFjdGlvblwiPlxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiZGVsZXRlQ29ob3J0KGNvaG9ydC5jb2hvcnRJZCB8fCBjb2hvcnQuaWQgfHwgY29ob3J0Ll9pZClcIiBjbGFzcz1cImFnZW50LWRlbGV0ZS1idG5cIj5EZWxldGU8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJtYW5hZ2VDb2hvcnRzLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwibWFuYWdlLW5vLXJlc3VsdHNcIj5ObyBjb2hvcnRzIGZvdW5kLjwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTWFuYWdlIHBhZ2luYXRpb24gLS0+XG4gICAgICA8bGliLXBhZ2luYXRpb24gKm5nSWY9XCJtYW5hZ2VUb3RhbCA+IDBcIiBbaXRlbXNQZXJQYWdlXT1cIm1hbmFnZVBlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwibWFuYWdlUGFnZVwiIFt0b3RhbEl0ZW1zXT1cIm1hbmFnZVRvdGFsXCJcbiAgICAgICAgW3BhZ2luYXRpb25TaXplc109XCJtYW5hZ2VQYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwibWFuYWdlUGVyUGFnZVwiIChwYWdlQ2hhbmdlKT1cIm9uTWFuYWdlUGFnZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgKHBhZ2VTaXplQ2hhbmdlKT1cIm9uTWFuYWdlUGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSDilZDilZDilZAgRklMVEVSUyBEUkFXRVIg4pWQ4pWQ4pWQIC0tPlxuPGRpdiBjbGFzcz1cImRyYXdlci1vdmVybGF5XCIgKm5nSWY9XCJkcmF3ZXJPcGVuXCIgKGNsaWNrKT1cImNsb3NlRmlsdGVyRHJhd2VyKClcIj48L2Rpdj5cbjxkaXYgY2xhc3M9XCJhZi1kcmF3ZXJcIiAqbmdJZj1cImRyYXdlck9wZW5cIj5cbiAgPGRpdiBjbGFzcz1cImRyYXdlci1oZWFkZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cImRyYXdlci1oZWFkZXItdGl0bGVcIj5GaWx0ZXJzPC9zcGFuPlxuICAgIDxidXR0b24gKGNsaWNrKT1cImNsb3NlRmlsdGVyRHJhd2VyKClcIiBjbGFzcz1cImRyYXdlci1jbG9zZS1idG5cIj7DlzwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImRyYXdlci1ib2R5XCI+XG4gICAgPHAgY2xhc3M9XCJkcmF3ZXItcGxhY2Vob2xkZXItdGV4dFwiPkZpbHRlciBjb25maWd1cmF0aW9uIGNvbWluZyBzb29uLiBVc2VzIHRoZSBzYW1lIGZpbHRlciBBUElzIGFzIHRoZSBleGlzdGluZyBhdWRpbyBwYWdlcy48L3A+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiYWYtZm9vdGVyXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImFmLWNhbmNlbFwiIChjbGljayk9XCJjbG9zZUZpbHRlckRyYXdlcigpXCI+Q2xvc2U8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|
|
1131
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuZ28tZWNoby5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1haS1hdWRpby9zcmMvbGliL2NvbXBvbmVudHMvdGFuZ28tZWNoby90YW5nby1lY2hvLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3RhbmdvLWFpLWF1ZGlvL3NyYy9saWIvY29tcG9uZW50cy90YW5nby1lY2hvL3RhbmdvLWVjaG8uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUMsT0FBTyxLQUFLLElBQUksTUFBTSxNQUFNLENBQUM7QUFDN0IsT0FBTyxLQUFLLFNBQVMsTUFBTSxZQUFZLENBQUM7Ozs7Ozs7O0FBU3hDLE1BQU0sT0FBTyxrQkFBa0I7SUF1SW5CO0lBQ0E7SUFDQTtJQXZJVixzREFBc0Q7SUFDdEQsV0FBVyxHQUFpRCxlQUFlLENBQUM7SUFFNUUsc0RBQXNEO0lBQ3RELFFBQVEsR0FBRyxJQUFJLENBQUM7SUFDaEIsUUFBUSxHQUFhLEVBQUUsQ0FBQztJQUN4QixTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ2YsT0FBTyxHQUFHLEVBQUUsQ0FBQztJQUNiLFVBQVUsR0FBUSxFQUFFLENBQUM7SUFDckIsS0FBSyxHQUFRLEVBQUUsQ0FBQztJQUVoQixzREFBc0Q7SUFDdEQsYUFBYSxHQUFVLEVBQUUsQ0FBQztJQUMxQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNqQixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsY0FBYyxHQUFHLENBQUMsQ0FBQztJQUNuQixtQkFBbUIsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFB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LEtBQVU7UUFDckIsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsT0FBTztRQUMvQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDO1FBQ2xELE9BQU8sR0FBRyxHQUFHLElBQUksYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBQ3pDLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBYSxFQUFFLElBQVM7UUFDckMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksRUFBRSxDQUFDO1FBQ3pDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxhQUFhLENBQUM7U0FDckQ7UUFDRCxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQ2pCLENBQUM7d0dBeG9DVSxrQkFBa0I7NEZBQWxCLGtCQUFrQixzRENiL0Isb3R0Q0FnbUJBOzs0RkRubEJhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCAqIGFzIFhMU1ggZnJvbSAneGxzeCc7XG5pbXBvcnQgKiBhcyBGaWxlU2F2ZXIgZnJvbSAnZmlsZS1zYXZlcic7XG5pbXBvcnQgeyBBdWRpb1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdWRpby5zZXJ2aWNlJztcbmltcG9ydCB7IEdsb2JhbFN0YXRlU2VydmljZSB9IGZyb20gJ3RhbmdvLWFwcC11aS1nbG9iYWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItdGFuZ28tZWNobycsXG4gIHRlbXBsYXRlVXJsOiAnLi90YW5nby1lY2hvLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFuZ28tZWNoby5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIFRhbmdvRWNob0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcblxuICAvLyDilIDilIAgTmF2aWdhdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY3VycmVudFBhZ2U6ICdjb252ZXJzYXRpb25zJyB8ICdhZ2VudGFuYWx5c2lzJyB8ICdtYW5hZ2UnID0gJ2NvbnZlcnNhdGlvbnMnO1xuXG4gIC8vIOKUgOKUgCBVc2VyIC8gR2xvYmFsIFN0YXRlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjbGllbnRJZCA9ICcxMSc7XG4gIHN0b3JlSWRzOiBzdHJpbmdbXSA9IFtdO1xuICBzdGFydERhdGUgPSAnJztcbiAgZW5kRGF0ZSA9ICcnO1xuICBoZWFkZXJEYXRhOiBhbnkgPSB7fTtcbiAgdXNlcnM6IGFueSA9IHt9O1xuXG4gIC8vIOKUgOKUgCBDb252ZXJzYXRpb25zICh0cmFuc2NyaXB0LWxpc3QgQVBJKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29udmVyc2F0aW9uczogYW55W10gPSBbXTtcbiAgY29udlBhZ2UgPSAxO1xuICBjb252UGVyUGFnZSA9IDEwO1xuICBjb252VG90YWwgPSAwO1xuICBjb252VG90YWxQYWdlcyA9IDE7XG4gIGNvbnZQYWdpbmF0aW9uU2l6ZXMgPSBbMTAsIDIwLCA1MCwgMTAwXTtcbiAgY29udkxvYWRpbmcgPSBmYWxzZTtcbiAgY29udlNlYXJjaFF1ZXJ5ID0gJyc7XG4gIGV4cGFuZGVkQ29udklkczogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xuICBjb252VGFiczogeyBbY29udklkOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9O1xuXG4gIC8vIEFJIENoYXRcbiAgY29udkFpUmVwbHkgPSAnJztcbiAgY29udkFpTG9hZGluZyA9IGZhbHNlO1xuXG4gIC8vIOKUgOKUgCBBZ2VudCBBbmFseXNpcyAoY29ob3J0L2F1ZGlvLXBhZ2UgQVBJKSDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgY29ob3J0TGlzdDogYW55W10gPSBbXTtcbiAgc2VsZWN0ZWRDb2hvcnRJZCA9ICcnO1xuICBzZWxlY3RlZENvaG9ydE5hbWUgPSAnJztcbiAgY29ob3J0Q2FyZHM6IGFueVtdID0gW107XG4gIGNhcmRzTG9hZGluZyA9IGZhbHNlO1xuICBkZXRhaWxWaWV3ID0gZmFsc2U7XG4gIHByaXZhdGUgX2luaXREb25lID0gZmFsc2U7XG4gIGFuYWx5c2lzU2VhcmNoID0gJyc7XG5cbiAgZ2V0IGFjdGl2ZUNvaG9ydHMoKTogYW55W10ge1xuICAgIHJldHVybiB0aGlzLmNvaG9ydExpc3QuZmlsdGVyKChjOiBhbnkpID0+IGMubWV0cmljc0FkZGVkID4gMCk7XG4gIH1cblxuICBnZXQgbnVtZXJpY1N0cmlwQ2FyZCgpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLmNvaG9ydENhcmRzLmZpbmQoKGM6IGFueSkgPT4gYy50eXBlID09PSAnTlVNRVJJQ19HUk9VUCcpIHx8IG51bGw7XG4gIH1cblxuICBnZXQgbm9uTnVtZXJpY0NhcmRzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5jb2hvcnRDYXJkcy5maWx0ZXIoKGM6IGFueSkgPT4gYy50eXBlICE9PSAnTlVNRVJJQ19HUk9VUCcpO1xuICB9XG5cbiAgZ2V0TnVtZXJpY1RpbGVDb2xvcihpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYWxldHRlID0gWycjRTU0ODREJywgJyNGNUE2MjMnLCAnIzdDNUNGQycsICcjMTZBMzRBJywgJyMwRUE1RTknLCAnI0VDNDg5OSddO1xuICAgIHJldHVybiBwYWxldHRlW2luZGV4ICUgcGFsZXR0ZS5sZW5ndGhdO1xuICB9XG5cbiAgLy8gRGV0YWlsIGNvbnZlcnNhdGlvbnMgKGZyb20gY29ob3J0IGNhcmQgY2xpY2spXG4gIGRldGFpbENvbnZlcnNhdGlvbnM6IGFueVtdID0gW107XG4gIGRldGFpbFBhZ2UgPSAxO1xuICBkZXRhaWxQZXJQYWdlID0gMTA7XG4gIGRldGFpbFRvdGFsUGFnZXMgPSAxO1xuICBkZXRhaWxUb3RhbCA9IDA7XG4gIGRldGFpbFBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDUwLCAxMDBdO1xuICBkZXRhaWxQYWdlQ29udnM6IGFueVtdID0gW107XG4gIGRldGFpbE9wZW5JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGRldGFpbExvYWRpbmcgPSBmYWxzZTtcbiAgZGV0YWlsQ29udkRldGFpbDogYW55ID0gbnVsbDtcbiAgZGV0YWlsU2VhcmNoVmFsdWUgPSAnJztcblxuICAvLyDilIDilIAgTWFuYWdlIChjb2hvcnQgQ1JVRCBBUEkpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBtYW5hZ2VDb2hvcnRzOiBhbnlbXSA9IFtdO1xuICBtYW5hZ2VMb2FkaW5nID0gZmFsc2U7XG4gIG1hbmFnZVBhZ2UgPSAxO1xuICBtYW5hZ2VQZXJQYWdlID0gMTA7XG4gIG1hbmFnZVRvdGFsID0gMDtcbiAgbWFuYWdlVG90YWxQYWdlcyA9IDE7XG4gIG1hbmFnZVBhZ2luYXRpb25TaXplcyA9IFsxMCwgMjAsIDMwXTtcbiAgbWFuYWdlU2VhcmNoID0gJyc7XG5cbiAgLy8g4pSA4pSAIEF1ZGlvIFBsYXllciDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgcGxheWluZ0NvbnZJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHdhdmVmb3JtSGVpZ2h0czogbnVtYmVyW10gPSBbXTtcblxuICBwcml2YXRlIGdlbmVyYXRlV2F2ZWZvcm0oKTogdm9pZCB7XG4gICAgLy8gR2VuZXJhdGUgfjIwMCBiYXJzIHdpdGggbmF0dXJhbCB3YXZlZm9ybSBwYXR0ZXJuXG4gICAgY29uc3QgYmFyczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIwMDsgaSsrKSB7XG4gICAgICBjb25zdCBoID0gTWF0aC5tYXgoMywgTWF0aC5hYnMoTWF0aC5zaW4oaSAqIDAuMTUpICogMjggKyBNYXRoLnNpbihpICogMC40KSAqIDEyICsgTWF0aC5jb3MoaSAqIDAuMDgpICogOCkpO1xuICAgICAgYmFycy5wdXNoKE1hdGgucm91bmQoaCkpO1xuICAgIH1cbiAgICB0aGlzLndhdmVmb3JtSGVpZ2h0cyA9IGJhcnM7XG4gIH1cblxuICAvLyDilIDilIAgQ29ob3J0IERyb3Bkb3duIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBjb2hvcnREcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgY29ob3J0RHJvcGRvd25TZWFyY2ggPSAnJztcblxuICB0b2dnbGVDb2hvcnREcm9wZG93bigpOiB2b2lkIHtcbiAgICB0aGlzLmNvaG9ydERyb3Bkb3duT3BlbiA9ICF0aGlzLmNvaG9ydERyb3Bkb3duT3BlbjtcbiAgICBpZiAodGhpcy5jb2hvcnREcm9wZG93bk9wZW4pIHtcbiAgICAgIHRoaXMuY29ob3J0RHJvcGRvd25TZWFyY2ggPSAnJztcbiAgICB9XG4gIH1cblxuICBjbG9zZUNvaG9ydERyb3Bkb3duKCk6IHZvaWQge1xuICAgIHRoaXMuY29ob3J0RHJvcGRvd25PcGVuID0gZmFsc2U7XG4gICAgdGhpcy5jb2hvcnREcm9wZG93blNlYXJjaCA9ICcnO1xuICB9XG5cbiAgc2VsZWN0Q29ob3J0RnJvbURyb3Bkb3duKGNvaG9ydDogYW55KTogdm9pZCB7XG4gICAgY29uc3QgaWQgPSBjb2hvcnQuY29ob3J0SWQgfHwgY29ob3J0LmlkIHx8IGNvaG9ydC5faWQgfHwgJyc7XG4gICAgdGhpcy5jb2hvcnREcm9wZG93bk9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmNvaG9ydERyb3Bkb3duU2VhcmNoID0gJyc7XG4gICAgdGhpcy5vbkNvaG9ydERyb3Bkb3duQ2hhbmdlKGlkKTtcbiAgfVxuXG4gIGdldCBmaWx0ZXJlZERyb3Bkb3duQ29ob3J0cygpOiBhbnlbXSB7XG4gICAgaWYgKCF0aGlzLmNvaG9ydERyb3Bkb3duU2VhcmNoKSByZXR1cm4gdGhpcy5jb2hvcnRMaXN0O1xuICAgIGNvbnN0IHEgPSB0aGlzLmNvaG9ydERyb3Bkb3duU2VhcmNoLnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMuY29ob3J0TGlzdC5maWx0ZXIoKGM6IGFueSkgPT4gKChjLmNvaG9ydE5hbWUgfHwgYy5uYW1lIHx8ICcnKSBhcyBzdHJpbmcpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocSkpO1xuICB9XG5cbiAgLy8g4pSA4pSAIEZpbHRlcnMgRHJhd2VyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBkcmF3ZXJPcGVuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLy8gRGVmYXVsdCBzdG9yZSBsaXN0IChzYW1lIGFzIGV4aXN0aW5nIGF1ZGlvLXBhZ2UvdHJhbnNjcmlwdC1saXN0KVxuICBwcml2YXRlIGRlZmF1bHRTdG9yZXMgPSBbXG4gICAgJzExLTEwNjInLCAnMTEtMTA3OCcsICcxMS0xMDgzJywgJzExLTE1MTUnLCAnMTEtMTU0JywgJzExLTE2MjYnLFxuICAgICcxMS0xODEnLCAnMTEtMTk0NycsICcxMS0xOTk0JywgJzExLTIwMCcsICcxMS0yMDInLCAnMTEtMjE1JyxcbiAgICAnMTEtMjYwJywgJzExLTc4JywgJzExLTgxOSdcbiAgXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGF1ZGlvU2VydmljZTogQXVkaW9TZXJ2aWNlLFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgZ3M6IEdsb2JhbFN0YXRlU2VydmljZVxuICApIHtcbiAgICB0aGlzLmdlbmVyYXRlV2F2ZWZvcm0oKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIC8vIDEuIEdldCB1c2VyIGluZm9cbiAgICBpZiAoJ3VzZXItaW5mbycgaW4gbG9jYWxTdG9yYWdlKSB7XG4gICAgICB0aGlzLnVzZXJzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndXNlci1pbmZvJykgfHwgJ3t9Jyk7XG4gICAgICB0aGlzLmNsaWVudElkID0gdGhpcy51c2Vycz8uY2xpZW50SWQgfHwgJzExJztcbiAgICB9XG5cbiAgICAvLyAyLiBSZXN0b3JlIGZpbHRlcnMgZnJvbSBsb2NhbFN0b3JhZ2VcbiAgICBpZiAoJ2hlYWRlci1maWx0ZXJzJyBpbiBsb2NhbFN0b3JhZ2UpIHtcbiAgICAgIGNvbnN0IGhlYWRlckZpbHRlcnMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXItZmlsdGVycycpIHx8ICd7fScpO1xuICAgICAgdGhpcy5jbGllbnRJZCA9IGhlYWRlckZpbHRlcnM/LmNsaWVudCB8fCB0aGlzLmNsaWVudElkO1xuICAgICAgaWYgKGhlYWRlckZpbHRlcnM/LmRhdGU/LnN0YXJ0RGF0ZSkge1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IGhlYWRlckZpbHRlcnMuZGF0ZS5zdGFydERhdGU7XG4gICAgICAgIHRoaXMuZW5kRGF0ZSA9IGhlYWRlckZpbHRlcnMuZGF0ZS5lbmREYXRlO1xuICAgICAgfVxuICAgICAgaWYgKGhlYWRlckZpbHRlcnM/LnN0b3Jlcz8ubGVuZ3RoKSB7XG4gICAgICAgIHRoaXMuc3RvcmVJZHMgPSB0aGlzLmV4dHJhY3RDaGVja2VkU3RvcmVzKGhlYWRlckZpbHRlcnMuc3RvcmVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyYi4gUmVzdG9yZSBkZXRhaWwgdmlldyBzdGF0ZSAoc3Vydml2ZXMgY29tcG9uZW50IHJlLWluaXQgb24gZGF0ZSBjaGFuZ2UpXG4gICAgdGhpcy5yZXN0b3JlRGV0YWlsU3RhdGUoKTtcblxuICAgIC8vIDMuIFN1YnNjcmliZSB0byBxdWVyeSBwYXJhbXMgZm9yIHRhYiBzd2l0Y2hpbmdcbiAgICB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1zLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUocGFyYW1zID0+IHtcbiAgICAgIGNvbnN0IHByZXZQYWdlID0gdGhpcy5jdXJyZW50UGFnZTtcbiAgICAgIGNvbnN0IHRhYiA9IHBhcmFtc1sndGFiJ107XG4gICAgICBpZiAodGFiID09PSAnYW5hbHlzaXMnKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAnYWdlbnRhbmFseXNpcyc7XG4gICAgICB9IGVsc2UgaWYgKHRhYiA9PT0gJ21hbmFnZScpIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9ICdtYW5hZ2UnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jdXJyZW50UGFnZSA9ICdjb252ZXJzYXRpb25zJztcbiAgICAgIH1cbiAgICAgIC8vIENsZWFyIGRldGFpbCBzdGF0ZSB3aGVuIGxlYXZpbmcgQWdlbnQgQW5hbHlzaXMgdGFiXG4gICAgICBpZiAodGhpcy5jdXJyZW50UGFnZSAhPT0gJ2FnZW50YW5hbHlzaXMnICYmIHByZXZQYWdlID09PSAnYWdlbnRhbmFseXNpcycpIHtcbiAgICAgICAgdGhpcy5kZXRhaWxWaWV3ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2hvcnRJZCA9ICcnO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29ob3J0TmFtZSA9ICcnO1xuICAgICAgICB0aGlzLmNsZWFyRGV0YWlsU3RhdGUoKTtcbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgcmVsb2FkIGlmIHRhYiBhY3R1YWxseSBjaGFuZ2VkIChza2lwIG9uIGZpcnN0IGVtaXQg4oCUIGRhdGFSYW5nZVZhbHVlIGhhbmRsZXMgaXQpXG4gICAgICBpZiAocHJldlBhZ2UgIT09IHRoaXMuY3VycmVudFBhZ2UgJiYgdGhpcy5faW5pdERvbmUpIHtcbiAgICAgICAgdGhpcy5sb2FkQ3VycmVudFRhYigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gNC4gU3Vic2NyaWJlIHRvIGdsb2JhbCB0b29sYmFyIGNoYW5nZXMg4oCUIHRoaXMgaXMgdGhlIE1BSU4gZGF0YSB0cmlnZ2VyXG4gICAgLy8gICAgKHNhbWUgcGF0dGVybiBhcyB0cmFuc2NyaXB0LWxpc3QgYW5kIGF1ZGlvLXBhZ2UpXG4gICAgdGhpcy5ncy5kYXRhUmFuZ2VWYWx1ZS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyRGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMuY2xpZW50SWQgPSBkYXRhPy5jbGllbnQgfHwgdGhpcy5jbGllbnRJZDtcbiAgICAgICAgaWYgKGRhdGE/LmRhdGU/LnN0YXJ0RGF0ZSkge1xuICAgICAgICAgIHRoaXMuc3RhcnREYXRlID0gZGF0YS5kYXRlLnN0YXJ0RGF0ZTtcbiAgICAgICAgICB0aGlzLmVuZERhdGUgPSBkYXRhLmRhdGUuZW5kRGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YT8uc3RvcmVzPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnN0b3JlSWRzID0gdGhpcy5leHRyYWN0Q2hlY2tlZFN0b3JlcyhkYXRhLnN0b3Jlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIEZldGNoIGRhdGEgZm9yIGN1cnJlbnQgdGFiXG4gICAgICB0aGlzLmxvYWRDdXJyZW50VGFiKCk7XG4gICAgICB0aGlzLl9pbml0RG9uZSA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICBsb2FkQ3VycmVudFRhYigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jdXJyZW50UGFnZSA9PT0gJ2NvbnZlcnNhdGlvbnMnKSB7XG4gICAgICB0aGlzLmNvbnZQYWdlID0gMTtcbiAgICAgIHRoaXMuZmV0Y2hDb252ZXJzYXRpb25zKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmN1cnJlbnRQYWdlID09PSAnYWdlbnRhbmFseXNpcycpIHtcbiAgICAgIHRoaXMubG9hZENvaG9ydExpc3QoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY3VycmVudFBhZ2UgPT09ICdtYW5hZ2UnKSB7XG4gICAgICB0aGlzLm1hbmFnZVBhZ2UgPSAxO1xuICAgICAgdGhpcy5sb2FkTWFuYWdlQ29ob3J0cygpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBNYXBwaW5nIChzYW1lIGFzIHRyYW5zY3JpcHQtbGlzdCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHByaXZhdGUgbWFwQ29udmVyc2F0aW9uKGl0ZW06IGFueSk6IGFueSB7XG4gICAgY29uc3QgcmF3VGltZSA9IGl0ZW0uVGltZXN0YW1wIHx8IGl0ZW0udGltZSB8fCAnJztcbiAgICBjb25zdCByYXdEdXJhdGlvbiA9IGl0ZW0uRHVyYXRpb24gfHwgaXRlbS5kdXJhdGlvbiB8fCAnJztcbiAgICBjb25zdCByYXdEZXNjID0gaXRlbS5TdW1tYXJ5IHx8IGl0ZW0uYXVkaW9EZXNjcmlwdGlvbiB8fCBpdGVtLnN1bW1hcnkgfHwgaXRlbS5jb252ZXJzYXRpb25EZXRhaWxzPy5hdWRpb1N1bW1hcnkgfHwgJyc7XG4gICAgcmV0dXJuIHtcbiAgICAgIGF1ZGlvSWQ6IGl0ZW0uZG9jX2lkIHx8IGl0ZW0uYXVkaW9JZCB8fCBpdGVtLl9pZCB8fCAnJyxcbiAgICAgIHN0b3JlSWQ6IGl0ZW0uc3RvcmVJZCB8fCAnJyxcbiAgICAgIHN0b3JlTmFtZTogaXRlbS5zdG9yZU5hbWUgfHwgJycsXG4gICAgICB1c2VyTmFtZTogaXRlbS5zdGFmZiB8fCBpdGVtLnN0YWZmSWQgfHwgaXRlbS51c2VyTmFtZSB8fCBpdGVtLnN0YWZmTmFtZSB8fCAnJyxcbiAgICAgIGxvY2F0aW9uOiBpdGVtLmxvY2F0aW9uIHx8IGl0ZW0uc3RhdGUgfHwgJycsXG4gICAgICBkYXRlOiBpdGVtLmRhdGUgfHwgJycsXG4gICAgICB0aW1lOiB0aGlzLmZvcm1hdFRpbWUocmF3VGltZSksXG4gICAgICBkdXJhdGlvbjogdGhpcy5mb3JtYXREdXJhdGlvbihyYXdEdXJhdGlvbiksXG4gICAgICBhdWRpb0Rlc2NyaXB0aW9uOiB0aGlzLmNsZWFuVHJhbnNjcmlwdGlvbihyYXdEZXNjKSxcbiAgICAgIGF1ZGlvVXJsOiBpdGVtLmF1ZGlvVXJsIHx8IGl0ZW0uYXVkaW9fdXJsIHx8ICcnLFxuICAgICAgY29udmVyc2F0aW9uRGV0YWlsczogaXRlbS5jb252ZXJzYXRpb25EZXRhaWxzIHx8IHsgYXVkaW9TdW1tYXJ5OiAnJywgdHJhbnNjcmlwdGlvbjogJycgfSxcbiAgICAgIG1ldHJpY3M6IHRoaXMucGFyc2VNZXRyaWNzKGl0ZW0ubWV0cmljcyksXG4gICAgICBhaUluc2lnaHRzOiBpdGVtLmFpSW5zaWdodHMgfHwgeyB0aXRsZTogJ0FJIEluc2lnaHRzJywgc3VtbWFyeTogW10gfSxcbiAgICAgIF9kZXRhaWxMb2FkZWQ6ICEhKGl0ZW0uYWlJbnNpZ2h0cyB8fCBpdGVtLmNvbnZlcnNhdGlvbkRldGFpbHMpLFxuICAgICAgX2RldGFpbExvYWRpbmc6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICAvLyBQYXJzZSBtZXRyaWNzIGZyb20gQVBJIHJlc3BvbnNlIChzYW1lIGFzIGF1ZGlvLXBhZ2UpXG4gIHByaXZhdGUgcGFyc2VNZXRyaWNzKHJhdzogYW55KTogYW55W10ge1xuICAgIGlmICghcmF3IHx8IHR5cGVvZiByYXcgIT09ICdvYmplY3QnKSByZXR1cm4gW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocmF3KSkgcmV0dXJuIHJhdztcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhyYXcpXG4gICAgICAuZmlsdGVyKChzZWN0aW9uOiBhbnkpID0+IHNlY3Rpb24gJiYgdHlwZW9mIHNlY3Rpb24gPT09ICdvYmplY3QnICYmIHNlY3Rpb24udHlwZSlcbiAgICAgIC5tYXAoKHNlY3Rpb246IGFueSkgPT4gKHtcbiAgICAgICAgbmFtZTogc2VjdGlvbi5uYW1lIHx8ICcnLFxuICAgICAgICB0eXBlOiBzZWN0aW9uLnR5cGUgfHwgJycsXG4gICAgICAgIHZhbHVlOiBzZWN0aW9uLnZhbHVlIHx8IFtdXG4gICAgICB9KSk7XG4gIH1cblxuICAvLyBMb2FkIGNvbnZlcnNhdGlvbiBkZXRhaWwgb24gZXhwYW5kIChzYW1lIGFzIGF1ZGlvLXBhZ2UpXG4gIGxvYWRDb252RGV0YWlsKGNvbnY6IGFueSk6IHZvaWQge1xuICAgIGlmICgoY29udi5fZGV0YWlsTG9hZGVkICYmIGNvbnYuYXVkaW9VcmwpIHx8IGNvbnYuX2RldGFpbExvYWRpbmcpIHJldHVybjtcbiAgICBjb252Ll9kZXRhaWxMb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBwYXlsb2FkID0geyBjb2hvcnRJZDogdGhpcy5zZWxlY3RlZENvaG9ydElkID8gW3RoaXMuc2VsZWN0ZWRDb2hvcnRJZF0gOiBbXSwgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQgfTtcbiAgICB0aGlzLmF1ZGlvU2VydmljZS5nZXRDb252ZXJzYXRpb25EZXRhaWwoY29udi5hdWRpb0lkLCBwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByYXcgPSByZXM/LmRhdGE7XG4gICAgICAgIGNvbnN0IGRldGFpbCA9IHJhdz8uYXVkaW9JZCA/IHJhdyA6IChyYXc/LmRhdGE/LmF1ZGlvSWQgPyByYXcuZGF0YSA6IChyYXcgfHwge30pKTtcbiAgICAgICAgaWYgKGRldGFpbC5tZXRyaWNzKSBjb252Lm1ldHJpY3MgPSB0aGlzLnBhcnNlTWV0cmljcyhkZXRhaWwubWV0cmljcyk7XG4gICAgICAgIGlmIChkZXRhaWwuYWlJbnNpZ2h0cz8uc3VtbWFyeT8ubGVuZ3RoKSBjb252LmFpSW5zaWdodHMgPSBkZXRhaWwuYWlJbnNpZ2h0cztcbiAgICAgICAgaWYgKGRldGFpbC5jb252ZXJzYXRpb25EZXRhaWxzPy5hdWRpb1N1bW1hcnkpIGNvbnYuY29udmVyc2F0aW9uRGV0YWlscyA9IGRldGFpbC5jb252ZXJzYXRpb25EZXRhaWxzO1xuICAgICAgICBpZiAoZGV0YWlsLmF1ZGlvVXJsIHx8IGRldGFpbC5hdWRpb191cmwpIGNvbnYuYXVkaW9VcmwgPSBkZXRhaWwuYXVkaW9VcmwgfHwgZGV0YWlsLmF1ZGlvX3VybDtcbiAgICAgICAgY29udi5fZGV0YWlsTG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgY29udi5fZGV0YWlsTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7IGNvbnYuX2RldGFpbExvYWRpbmcgPSBmYWxzZTsgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8gQ2xlYW4gXCJTdGFmZjpcIiwgXCJDdXN0b21lcjpcIiBwcmVmaXhlcyBmcm9tIHRyYW5zY3JpcHRpb24gdGV4dFxuICBjbGVhblRyYW5zY3JpcHRpb24odGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRleHQpIHJldHVybiAnJztcbiAgICByZXR1cm4gdGV4dFxuICAgICAgLnJlcGxhY2UoL1xcW1xcZHsyfTpcXGR7Mn1cXHMqLT5cXHMqXFxkezJ9OlxcZHsyfVxcXVxccyovZywgJycpXG4gICAgICAucmVwbGFjZSgvXFxiKFN0YWZmfEN1c3RvbWVyKVxccyo6XFxzKi9naSwgJycpO1xuICB9XG5cbiAgLy8gRm9ybWF0IGR1cmF0aW9uIGZyb20gc2Vjb25kcyAoZS5nLiA1MTQg4oaSIFwiOG0gMTRzXCIpXG4gIHByaXZhdGUgZm9ybWF0RHVyYXRpb24odmFsOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmICghdmFsKSByZXR1cm4gJyc7XG4gICAgY29uc3QgdG90YWxTZWMgPSBwYXJzZUZsb2F0KHZhbCk7XG4gICAgaWYgKGlzTmFOKHRvdGFsU2VjKSkgcmV0dXJuIHZhbDtcbiAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcih0b3RhbFNlYyAvIDYwKTtcbiAgICBjb25zdCBzZWNzID0gTWF0aC5mbG9vcih0b3RhbFNlYyAlIDYwKTtcbiAgICByZXR1cm4gc2VjcyA+IDAgPyBgJHttaW5zfW0gJHtzZWNzfXNgIDogYCR7bWluc31tYDtcbiAgfVxuXG4gIC8vIEZvcm1hdCB0aW1lIGZyb20gSVNPIHN0cmluZyAoZS5nLiBcIjIwMjYtMDQtMDhUMjI6MDA6NDIuOTcyNzg5KzA1OjMwXCIg4oaSIFwiMTA6MDAgUE1cIilcbiAgcHJpdmF0ZSBmb3JtYXRUaW1lKHZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXZhbCkgcmV0dXJuICcnO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodmFsKTtcbiAgICAgIGlmIChpc05hTihkYXRlLmdldFRpbWUoKSkpIHJldHVybiB2YWw7XG4gICAgICByZXR1cm4gZGF0ZS50b0xvY2FsZVRpbWVTdHJpbmcoJ2VuLVVTJywgeyBob3VyOiAnMi1kaWdpdCcsIG1pbnV0ZTogJzItZGlnaXQnLCBob3VyMTI6IHRydWUgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgCBIZWxwZXJzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICBwcml2YXRlIGV4dHJhY3RDaGVja2VkU3RvcmVzKHN0b3JlczogYW55W10pOiBzdHJpbmdbXSB7XG4gICAgLy8gRmlsdGVyIG9ubHkgY2hlY2tlZCBzdG9yZXMsIHRoZW4gZXh0cmFjdCBzdG9yZUlkXG4gICAgY29uc3QgY2hlY2tlZCA9IHN0b3Jlcy5maWx0ZXIoKHM6IGFueSkgPT4gcy5jaGVja2VkICE9PSBmYWxzZSk7XG4gICAgcmV0dXJuIGNoZWNrZWQubWFwKChzOiBhbnkpID0+IHMuX2lkIHx8IHMuc3RvcmVJZCB8fCBzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U3RvcmVJZHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnN0b3JlSWRzLmxlbmd0aCA+IDAgPyB0aGlzLnN0b3JlSWRzIDogdGhpcy5kZWZhdWx0U3RvcmVzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTdGFydERhdGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zdGFydERhdGUgfHwgJzIwMjYtMDQtMDgnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbmREYXRlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZW5kRGF0ZSB8fCAnMjAyNi0wNC0wOCc7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQmFzZVBheWxvYWQoKTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgY2xpZW50SWQ6IFt0aGlzLmNsaWVudElkXSxcbiAgICAgIHN0b3JlSWQ6IHRoaXMuZ2V0U3RvcmVJZHMoKSxcbiAgICAgIHN0YXJ0RGF0ZTogdGhpcy5nZXRTdGFydERhdGUoKSxcbiAgICAgIGVuZERhdGU6IHRoaXMuZ2V0RW5kRGF0ZSgpLFxuICAgICAgaXNBSTogdHJ1ZSxcbiAgICAgIGFuYWx5dGljc1R5cGU6ICdhdWRpbycsXG4gICAgICBpc0V4cG9ydDogZmFsc2VcbiAgICB9O1xuICB9XG5cbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIC8vIENPTlZFUlNBVElPTlMgVEFCICh1c2VzIHRyYW5zY3JpcHRzTGlzdCBBUEkpXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICBmZXRjaENvbnZlcnNhdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5jb252TG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIC4uLnRoaXMuYnVpbGRCYXNlUGF5bG9hZCgpLFxuICAgICAgaXNBSTogZmFsc2UsXG4gICAgICBhbmFseXRpY3NUeXBlOiAndHJhbnNjcmlwdCcsXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5jb252U2VhcmNoUXVlcnkgfHwgJycsXG4gICAgICBsaW1pdDogdGhpcy5jb252UGVyUGFnZSxcbiAgICAgIF9pZDogW10sXG4gICAgICBvZmZzZXQ6IHRoaXMuY29udlBhZ2UgLSAxXG4gICAgfTtcblxuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLnRyYW5zY3JpcHRzTGlzdChwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gcmVzPy5kYXRhO1xuICAgICAgICBjb25zdCBsaXN0ID0gZGF0YT8uZGF0YSB8fCBkYXRhPy5jb252ZXJzYXRpb25zIHx8IFtdO1xuICAgICAgICB0aGlzLmNvbnZlcnNhdGlvbnMgPSBsaXN0Lm1hcCgoaXRlbTogYW55KSA9PiB0aGlzLm1hcENvbnZlcnNhdGlvbihpdGVtKSk7XG4gICAgICAgIHRoaXMuY29udlRvdGFsID0gZGF0YT8uY291bnQgPz8gZGF0YT8ucGFnaW5hdGlvbj8udG90YWwgPz8gdGhpcy5jb252ZXJzYXRpb25zLmxlbmd0aDtcbiAgICAgICAgdGhpcy5jb252VG90YWxQYWdlcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0aGlzLmNvbnZUb3RhbCAvIHRoaXMuY29udlBlclBhZ2UpKTtcbiAgICAgICAgdGhpcy5jb252UGFnaW5hdGlvblNpemVzID0gdGhpcy5jb252VG90YWwgPiAxMCA/IFsxMCwgMjAsIDUwLCAxMDBdIDogW3RoaXMuY29udlRvdGFsIHx8IDEwXTtcbiAgICAgICAgdGhpcy5jb252UGVyUGFnZSA9IHRoaXMuY29udlBhZ2luYXRpb25TaXplcy5pbmNsdWRlcyh0aGlzLmNvbnZQZXJQYWdlKSA/IHRoaXMuY29udlBlclBhZ2UgOiB0aGlzLmNvbnZQYWdpbmF0aW9uU2l6ZXNbMF07XG4gICAgICAgIC8vIEF1dG8tZXhwYW5kIGZpcnN0XG4gICAgICAgIGlmICh0aGlzLmNvbnZlcnNhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZXhwYW5kZWRDb252SWRzID0geyBbdGhpcy5jb252ZXJzYXRpb25zWzBdLmF1ZGlvSWRdOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb252TG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9ucyA9IFtdO1xuICAgICAgICB0aGlzLmNvbnZUb3RhbCA9IDA7XG4gICAgICAgIHRoaXMuY29udlRvdGFsUGFnZXMgPSAxO1xuICAgICAgICB0aGlzLmNvbnZMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbkNvbnZQYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuY29udlBhZ2UgPSBwYWdlO1xuICAgIHRoaXMuZmV0Y2hDb252ZXJzYXRpb25zKCk7XG4gIH1cblxuICBvbkNvbnZQYWdlU2l6ZUNoYW5nZShzaXplOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnZQZXJQYWdlID0gcGFyc2VJbnQoc2l6ZSk7XG4gICAgdGhpcy5jb252UGFnZSA9IDE7XG4gICAgdGhpcy5mZXRjaENvbnZlcnNhdGlvbnMoKTtcbiAgfVxuXG4gIHRvZ2dsZUNvbnZFeHBhbmQoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV4cGFuZGVkQ29udklkc1tpZF0pIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRDb252SWRzID0ge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRDb252SWRzID0geyBbaWRdOiB0cnVlIH07XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29udklkKGNvbnY6IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNvbnY/LmRvY19pZCB8fCBjb252Py5hdWRpb0lkIHx8IGNvbnY/Ll9pZCB8fCAnJztcbiAgfVxuXG4gIGdldENvbnZUYWIoY29udklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNvbnZUYWJzW2NvbnZJZF0gfHwgJ3N1bW1hcnknO1xuICB9XG5cbiAgc2V0Q29udlRhYihjb252SWQ6IHN0cmluZywgdGFiOiBzdHJpbmcsIGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuY29udlRhYnNbY29udklkXSA9IHRhYjtcbiAgfVxuXG4gIC8vIEFJIFNlYXJjaFxuICBzZW5kQ29udlF1ZXJ5KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5jb252U2VhcmNoUXVlcnkudHJpbSgpKSByZXR1cm47XG4gICAgdGhpcy5jb252QWlMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnZBaVJlcGx5ID0gJyc7XG5cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgdXNlcl9pZDogdGhpcy51c2Vycz8uZW1haWwgfHwgJ3VzZXInLFxuICAgICAgc2Vzc2lvbl9pZDogYEVDSE9fJHtEYXRlLm5vdygpfWAsXG4gICAgICBzZXNzaW9uX2RhdGU6IHRoaXMuc3RhcnREYXRlLFxuICAgICAgc2Vzc2lvbl90aW1lem9uZTogSW50bC5EYXRlVGltZUZvcm1hdCgpLnJlc29sdmVkT3B0aW9ucygpLnRpbWVab25lLFxuICAgICAgbWVzc2FnZTogdGhpcy5jb252U2VhcmNoUXVlcnksXG4gICAgICBhbmFseXRpY3NUeXBlOiAndHJhbnNjcmlwdCcsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgc2VsZWN0ZWRfc3RvcmVzOiB0aGlzLmdldFN0b3JlSWRzKCksXG4gICAgICAgIGRhdGVfcmFuZ2U6IHsgc3RhcnQ6IHRoaXMuc3RhcnREYXRlLCBlbmQ6IHRoaXMuZW5kRGF0ZSB9LFxuICAgICAgICBzZWxlY3RlZF9wcm9kdWN0czogWydBdWRpbyddXG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmNoYXRTdHJlYW0ocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jb252QWlSZXBseSA9IHR5cGVvZiByZXMgPT09ICdzdHJpbmcnID8gcmVzIDogKHJlcz8uZGF0YT8ubWFwKChkOiBhbnkpID0+IGQudGV4dCkuam9pbignJykgfHwgJ05vIHJlc3BvbnNlJyk7XG4gICAgICAgIHRoaXMuY29udkFpTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY29udkFpUmVwbHkgPSAnVW5hYmxlIHRvIHByb2Nlc3MgeW91ciBxdWVyeS4gUGxlYXNlIHRyeSBhZ2Fpbi4nO1xuICAgICAgICB0aGlzLmNvbnZBaUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmNvbnZTZWFyY2hRdWVyeSA9ICcnO1xuICB9XG5cbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIC8vIEFHRU5UIEFOQUxZU0lTIFRBQiAodXNlcyBjb2hvcnQgQVBJcylcbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIGxvYWRDb2hvcnRMaXN0KCk6IHZvaWQge1xuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmxpc3RDb2hvcnRzKHRoaXMuY2xpZW50SWQsIDEwMCwgMCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jb2hvcnRMaXN0ID0gcmVzPy5kYXRhPy5jb2hvcnRzIHx8IFtdO1xuICAgICAgICAvLyBJZiBhIGNvaG9ydCB3YXMgYWxyZWFkeSBzZWxlY3RlZCAoZS5nLiBmcm9tIGRyb3Bkb3duKSwgbG9hZCBpdHMgZGF0YVxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENvaG9ydElkKSB7XG4gICAgICAgICAgdGhpcy5mZXRjaENvaG9ydENhcmRzKCk7XG4gICAgICAgICAgdGhpcy5mZXRjaERldGFpbENvbnZlcnNhdGlvbnMoKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMuY29ob3J0TGlzdCA9IFtdOyB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBTZWxlY3QgY29ob3J0IGZyb20gb3ZlcnZpZXcgY2FyZCBjbGlja1xuICBzZWxlY3RDb2hvcnREZXRhaWwoY29ob3J0OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnNlbGVjdGVkQ29ob3J0SWQgPSBjb2hvcnQuY29ob3J0SWQgfHwgY29ob3J0LmlkIHx8IGNvaG9ydC5faWQgfHwgJyc7XG4gICAgdGhpcy5zZWxlY3RlZENvaG9ydE5hbWUgPSBjb2hvcnQuY29ob3J0TmFtZSB8fCBjb2hvcnQubmFtZSB8fCAnJztcbiAgICB0aGlzLmRldGFpbFZpZXcgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0ZWRDYXJkSWQgPSAnJztcbiAgICB0aGlzLnNlbGVjdGVkQ2FyZE5hbWUgPSAnJztcbiAgICB0aGlzLmRldGFpbFBhZ2UgPSAxO1xuICAgIHRoaXMuc2F2ZURldGFpbFN0YXRlKCk7XG4gICAgdGhpcy5mZXRjaENvaG9ydENhcmRzKCk7XG4gICAgdGhpcy5mZXRjaERldGFpbENvbnZlcnNhdGlvbnMoKTtcbiAgfVxuXG4gIG9uRGV0YWlsU2VhcmNoKCk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWlsUGFnZSA9IDE7XG4gICAgdGhpcy5mZXRjaERldGFpbENvbnZlcnNhdGlvbnMoKTtcbiAgfVxuXG4gIGNsZWFyRGV0YWlsU2VhcmNoKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5kZXRhaWxTZWFyY2hWYWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuZGV0YWlsU2VhcmNoVmFsdWUgPSAnJztcbiAgICB0aGlzLmRldGFpbFBhZ2UgPSAxO1xuICAgIHRoaXMuZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk7XG4gIH1cblxuICBiYWNrVG9PdmVydmlldygpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFpbFZpZXcgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkQ29ob3J0SWQgPSAnJztcbiAgICB0aGlzLnNlbGVjdGVkQ29ob3J0TmFtZSA9ICcnO1xuICAgIHRoaXMuY29ob3J0Q2FyZHMgPSBbXTtcbiAgICB0aGlzLmRldGFpbFBhZ2VDb252cyA9IFtdO1xuICAgIHRoaXMuZGV0YWlsQ29udmVyc2F0aW9ucyA9IFtdO1xuICAgIHRoaXMuY2xlYXJEZXRhaWxTdGF0ZSgpO1xuICB9XG5cbiAgLy8g4pSA4pSAIFBlcnNpc3QgZGV0YWlsIHZpZXcgc3RhdGUgYWNyb3NzIGNvbXBvbmVudCByZS1pbml0IChkYXRlIGNoYW5nZSkg4pSA4pSAXG4gIHByaXZhdGUgc2F2ZURldGFpbFN0YXRlKCk6IHZvaWQge1xuICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oJ2VjaG8tZGV0YWlsJywgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgZGV0YWlsVmlldzogdGhpcy5kZXRhaWxWaWV3LFxuICAgICAgY29ob3J0SWQ6IHRoaXMuc2VsZWN0ZWRDb2hvcnRJZCxcbiAgICAgIGNvaG9ydE5hbWU6IHRoaXMuc2VsZWN0ZWRDb2hvcnROYW1lXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXN0b3JlRGV0YWlsU3RhdGUoKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJhdyA9IHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oJ2VjaG8tZGV0YWlsJyk7XG4gICAgICBpZiAoIXJhdykgcmV0dXJuO1xuICAgICAgY29uc3Qgc3RhdGUgPSBKU09OLnBhcnNlKHJhdyk7XG4gICAgICBpZiAoc3RhdGU/LmRldGFpbFZpZXcgJiYgc3RhdGU/LmNvaG9ydElkKSB7XG4gICAgICAgIHRoaXMuZGV0YWlsVmlldyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDb2hvcnRJZCA9IHN0YXRlLmNvaG9ydElkO1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ29ob3J0TmFtZSA9IHN0YXRlLmNvaG9ydE5hbWUgfHwgJyc7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7IH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYXJEZXRhaWxTdGF0ZSgpOiB2b2lkIHtcbiAgICBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKCdlY2hvLWRldGFpbCcpO1xuICB9XG5cbiAgLy8gQ2hhbmdlIGNvaG9ydCBmcm9tIGRyb3Bkb3duXG4gIG9uQ29ob3J0RHJvcGRvd25DaGFuZ2UoY29ob3J0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRDb2hvcnRJZCA9IGNvaG9ydElkO1xuICAgIGNvbnN0IGNvaG9ydCA9IHRoaXMuY29ob3J0TGlzdC5maW5kKChjOiBhbnkpID0+IChjLmNvaG9ydElkIHx8IGMuaWQgfHwgYy5faWQpID09PSBjb2hvcnRJZCk7XG4gICAgdGhpcy5zZWxlY3RlZENvaG9ydE5hbWUgPSBjb2hvcnQ/LmNvaG9ydE5hbWUgfHwgY29ob3J0Py5uYW1lIHx8ICcnO1xuICAgIHRoaXMuZGV0YWlsVmlldyA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZENhcmRJZCA9ICcnO1xuICAgIHRoaXMuc2VsZWN0ZWRDYXJkTmFtZSA9ICcnO1xuICAgIHRoaXMuZGV0YWlsUGFnZSA9IDE7XG4gICAgdGhpcy5zYXZlRGV0YWlsU3RhdGUoKTtcbiAgICB0aGlzLmZldGNoQ29ob3J0Q2FyZHMoKTtcbiAgICB0aGlzLmZldGNoRGV0YWlsQ29udmVyc2F0aW9ucygpO1xuICB9XG5cbiAgZmV0Y2hDb2hvcnRDYXJkcygpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDb2hvcnRJZCkgcmV0dXJuO1xuICAgIHRoaXMuY2FyZHNMb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgLi4udGhpcy5idWlsZEJhc2VQYXlsb2FkKCksXG4gICAgICBjb2hvcnRUeXBlOiBbdGhpcy5zZWxlY3RlZENvaG9ydElkXVxuICAgIH07XG5cbiAgICB0aGlzLmF1ZGlvU2VydmljZS5nZXRDb2hvcnRBbmFseXNpc0NhcmQocGF5bG9hZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5jb2hvcnRDYXJkcyA9IHRoaXMucGFyc2VDb2hvcnRBbmFseXNpcyhyZXM/LmRhdGE/LmNvaG9ydEFuYWx5c2lzIHx8IHt9KTtcbiAgICAgICAgdGhpcy5jYXJkc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmNvaG9ydENhcmRzID0gW107XG4gICAgICAgIHRoaXMuY2FyZHNMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBQYXJzZSBjb2hvcnQgYW5hbHlzaXMgKHNhbWUgYXMgYXVkaW8tcGFnZSlcbiAgcGFyc2VDb2hvcnRBbmFseXNpcyhhbmFseXNpczogYW55KTogYW55W10ge1xuICAgIGNvbnN0IGNhcmRzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IG51bWVyaWNSb3dzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IHNraXBLZXlzID0gbmV3IFNldChbJ3RvdGFsQXVkaW9BdmFpbGFibGUnLCAnY29ob3J0VHlwZScsICdkYXRlUmFuZ2UnLCAndW5pcXVlUGl0Y2hlcyddKTtcbiAgICB0aGlzLnRvdGFsQXVkaW8gPSBhbmFseXNpcy50b3RhbEF1ZGlvQXZhaWxhYmxlIHx8IDA7XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhhbmFseXNpcykpIHtcbiAgICAgIGlmIChza2lwS2V5cy5oYXMoa2V5KSkgY29udGludWU7XG4gICAgICBjb25zdCBzZWN0aW9uID0gYW5hbHlzaXNba2V5XTtcbiAgICAgIGlmICghc2VjdGlvbiB8fCB0eXBlb2Ygc2VjdGlvbiAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCB2YWx1ZXM6IGFueVtdID0gc2VjdGlvbi52YWx1ZSB8fCBbXTtcbiAgICAgIGNvbnN0IHR5cGUgPSBzZWN0aW9uLnR5cGU7XG4gICAgICBpZiAoIXZhbHVlcy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBDb21tb24gZmllbGRzIGZyb20gc2VjdGlvblxuICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBzZWN0aW9uLmNvbXB1dGF0aW9uX25vdGUgfHwgc2VjdGlvbi5jb21wdXRhdGlvbk5vdGUgfHwgc2VjdGlvbi5kZXNjcmlwdGlvbiB8fCBzZWN0aW9uLmRlc2MgfHwgJyc7XG4gICAgICBjb25zdCBzaG9ydERlc2NyaXB0aW9uID0gc2VjdGlvbi5zaG9ydERlc2NyaXB0aW9uIHx8IHNlY3Rpb24uc2hvcnRfZGVzY3JpcHRpb24gfHwgJyc7XG4gICAgICBjb25zdCBzdGF0dXMgPSBzZWN0aW9uLnN0YXR1cyB8fCBzZWN0aW9uLnNlbnRpbWVudCB8fCAnJztcbiAgICAgIGNvbnN0IGFwcGxpY2FibGVDb3VudCA9IHNlY3Rpb24uYXBwbGljYWJsZV9jb3VudCA/PyBzZWN0aW9uLmFwcGxpY2FibGVDb3VudCA/PyBudWxsO1xuXG4gICAgICBjb25zdCBhY3R1YWxUeXBlID0gc2VjdGlvbi5hY3R1YWxfdHlwZSB8fCBzZWN0aW9uLmFjdHVhbFR5cGUgfHwgJyc7XG4gICAgICBjb25zdCB0eXBlVXBwZXIgPSB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgPyB0eXBlLnRvVXBwZXJDYXNlKCkgOiAnJztcbiAgICAgIGNvbnN0IGFjdHVhbFVwcGVyID0gdHlwZW9mIGFjdHVhbFR5cGUgPT09ICdzdHJpbmcnID8gYWN0dWFsVHlwZS50b1VwcGVyQ2FzZSgpIDogJyc7XG4gICAgICBpZiAodHlwZVVwcGVyID09PSAnQk9PTEVBTl9CQVNLRVRfVEFCTEUnIHx8IGFjdHVhbFVwcGVyID09PSAnQk9PTEVBTl9CQVNLRVRfVEFCTEUnKSB7XG4gICAgICAgIGNvbnN0IGNhcmROYW1lID0gc2VjdGlvbi5uYW1lIHx8IGtleTtcbiAgICAgICAgY29uc3QgZGF0YVJvd3M6IGFueVtdID0gQXJyYXkuaXNBcnJheShzZWN0aW9uLmRhdGEpID8gc2VjdGlvbi5kYXRhIDogW107XG4gICAgICAgIGNvbnN0IHRhYmxlUm93cyA9IGRhdGFSb3dzLm1hcCgocm93OiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBhdHRyczogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KHJvdy5hdHRyaWJ1dGVzKSA/IHJvdy5hdHRyaWJ1dGVzIDogW107XG4gICAgICAgICAgY29uc3Qgc3RhdHVzU2V0ID0gbmV3IFNldChbJ0ZVTEZJTExFRCcsICdOT1RfRlVMRklMTEVEJywgJ09GRkVSRURfQUxURVJOQVRJVkUnXSk7XG4gICAgICAgICAgY29uc3QgTUFYX0NISVBfTEVOID0gMTg7XG4gICAgICAgICAgY29uc3QgTUFYX1ZJU0lCTEUgPSA0O1xuICAgICAgICAgIGNvbnN0IGNsZWFuZWQgPSBhdHRycy5maWx0ZXIoKGE6IHN0cmluZykgPT4gIXN0YXR1c1NldC5oYXMoKGEgfHwgJycpLnRvVXBwZXJDYXNlKCkpKTtcbiAgICAgICAgICBjb25zdCBzaG9ydENoaXBzID0gY2xlYW5lZC5maWx0ZXIoKGM6IHN0cmluZykgPT4gYy5sZW5ndGggPD0gTUFYX0NISVBfTEVOKTtcbiAgICAgICAgICBjb25zdCBsb25nQ2hpcHMgPSBjbGVhbmVkLmZpbHRlcigoYzogc3RyaW5nKSA9PiBjLmxlbmd0aCA+IE1BWF9DSElQX0xFTik7XG4gICAgICAgICAgY29uc3QgdmlzaWJsZSA9IHNob3J0Q2hpcHMuc2xpY2UoMCwgTUFYX1ZJU0lCTEUpO1xuICAgICAgICAgIGNvbnN0IG92ZXJmbG93ID0gWy4uLnNob3J0Q2hpcHMuc2xpY2UoTUFYX1ZJU0lCTEUpLCAuLi5sb25nQ2hpcHNdO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogcm93LmlkLFxuICAgICAgICAgICAgYnJhbmQ6IHJvdy5icmFuZCB8fCAnJyxcbiAgICAgICAgICAgIHZpc2libGVDaGlwczogdmlzaWJsZSxcbiAgICAgICAgICAgIG92ZXJmbG93Q2hpcHM6IG92ZXJmbG93LFxuICAgICAgICAgICAgb3ZlcmZsb3dDb3VudDogb3ZlcmZsb3cubGVuZ3RoLFxuICAgICAgICAgICAgb3ZlcmZsb3dUb29sdGlwOiBvdmVyZmxvdy5qb2luKCcsICcpLFxuICAgICAgICAgICAgYWxsQXR0cmlidXRlczogY2xlYW5lZCxcbiAgICAgICAgICAgIGNvdW50OiByb3cuY291bnQgPz8gMFxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBjYXJkcy5wdXNoKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbmFtZTogY2FyZE5hbWUsXG4gICAgICAgICAgdHlwZTogJ0JPT0xFQU5fQkFTS0VUX1RBQkxFJyxcbiAgICAgICAgICBhcHBsaWNhYmxlQ291bnQsXG4gICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgc2hvcnREZXNjcmlwdGlvbixcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgdGFibGVSb3dzXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlVXBwZXIgPT09ICdCT09MRUFOX0JBU0tFVF9CQVInIHx8IGFjdHVhbFVwcGVyID09PSAnQk9PTEVBTl9CQVNLRVRfQkFSJykge1xuICAgICAgICBjb25zdCBjYXJkTmFtZSA9IHNlY3Rpb24ubmFtZSB8fCBrZXk7XG4gICAgICAgIGNvbnN0IHBpZUNvbG9ycyA9IFsnIzBFQTVFOScsICcjMzhCREY4JywgJyM3REQzRkMnLCAnIzAyODRDNycsICcjQkFFNkZEJywgJyMwNzU5ODUnLCAnI0UwRjJGRScsICcjMDM2OUExJywgJyMyMkQzRUUnXTtcbiAgICAgICAgY29uc3QgcmF3Um93cyA9IHZhbHVlc1xuICAgICAgICAgIC5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgIGxhYmVsOiBpdGVtLm5hbWUgfHwgJycsXG4gICAgICAgICAgICByZXNwb25zZXM6IGl0ZW0uUmVzcG9uc2VzID8/IGl0ZW0uY291bnQgPz8gMCxcbiAgICAgICAgICAgIHNjb3JlOiBpdGVtLnNjb3JlID8/IDBcbiAgICAgICAgICB9KSlcbiAgICAgICAgICAuZmlsdGVyKChyOiBhbnkpID0+IHIucmVzcG9uc2VzID4gMClcbiAgICAgICAgICAuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IGIuc2NvcmUgLSBhLnNjb3JlKTtcbiAgICAgICAgY29uc3QgdG90YWxSZXNwb25zZXMgPSByYXdSb3dzLnJlZHVjZSgoczogbnVtYmVyLCByOiBhbnkpID0+IHMgKyByLnJlc3BvbnNlcywgMCk7XG4gICAgICAgIGNvbnN0IGN4ID0gNTAsIGN5ID0gNTAsIHJhZGl1cyA9IDQ1O1xuICAgICAgICBsZXQgc3RhcnRBbmdsZSA9IC1NYXRoLlBJIC8gMjtcbiAgICAgICAgY29uc3QgcGllU2xpY2VzID0gcmF3Um93cy5tYXAoKHI6IGFueSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgZnJhY3Rpb24gPSB0b3RhbFJlc3BvbnNlcyA/IHIucmVzcG9uc2VzIC8gdG90YWxSZXNwb25zZXMgOiAwO1xuICAgICAgICAgIGNvbnN0IGFuZ2xlID0gZnJhY3Rpb24gKiAyICogTWF0aC5QSTtcbiAgICAgICAgICBjb25zdCBlbmRBbmdsZSA9IHN0YXJ0QW5nbGUgKyBhbmdsZTtcbiAgICAgICAgICBjb25zdCB4MSA9IGN4ICsgcmFkaXVzICogTWF0aC5jb3Moc3RhcnRBbmdsZSk7XG4gICAgICAgICAgY29uc3QgeTEgPSBjeSArIHJhZGl1cyAqIE1hdGguc2luKHN0YXJ0QW5nbGUpO1xuICAgICAgICAgIGNvbnN0IHgyID0gY3ggKyByYWRpdXMgKiBNYXRoLmNvcyhlbmRBbmdsZSk7XG4gICAgICAgICAgY29uc3QgeTIgPSBjeSArIHJhZGl1cyAqIE1hdGguc2luKGVuZEFuZ2xlKTtcbiAgICAgICAgICBjb25zdCBsYXJnZUFyYyA9IGFuZ2xlID4gTWF0aC5QSSA/IDEgOiAwO1xuICAgICAgICAgIGxldCBwYXRoOiBzdHJpbmc7XG4gICAgICAgICAgaWYgKHJhd1Jvd3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBwYXRoID0gYE0gJHtjeCAtIHJhZGl1c30gJHtjeX0gQSAke3JhZGl1c30gJHtyYWRpdXN9IDAgMSAxICR7Y3ggKyByYWRpdXN9ICR7Y3l9IEEgJHtyYWRpdXN9ICR7cmFkaXVzfSAwIDEgMSAke2N4IC0gcmFkaXVzfSAke2N5fSBaYDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF0aCA9IGBNICR7Y3h9ICR7Y3l9IEwgJHt4MX0gJHt5MX0gQSAke3JhZGl1c30gJHtyYWRpdXN9IDAgJHtsYXJnZUFyY30gMSAke3gyfSAke3kyfSBaYDtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhcnRBbmdsZSA9IGVuZEFuZ2xlO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYWJlbDogci5sYWJlbCxcbiAgICAgICAgICAgIHJlc3BvbnNlczogci5yZXNwb25zZXMsXG4gICAgICAgICAgICBzY29yZTogci5zY29yZSxcbiAgICAgICAgICAgIHBlcmNlbnQ6IE1hdGgucm91bmQoZnJhY3Rpb24gKiAxMDApLFxuICAgICAgICAgICAgY29sb3I6IHBpZUNvbG9yc1tpICUgcGllQ29sb3JzLmxlbmd0aF0sXG4gICAgICAgICAgICBwYXRoXG4gICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNhcmRzLnB1c2goe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBuYW1lOiBjYXJkTmFtZSxcbiAgICAgICAgICB0eXBlOiAnQk9PTEVBTl9CQVNLRVRfQkFSJyxcbiAgICAgICAgICBhcHBsaWNhYmxlQ291bnQsXG4gICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgc2hvcnREZXNjcmlwdGlvbixcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgcGllU2xpY2VzLFxuICAgICAgICAgIHNlbGVjdGVkUGllTGFiZWw6IHBpZVNsaWNlc1swXT8ubGFiZWwgfHwgJydcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyAmJiB0eXBlLnRvTG93ZXJDYXNlKCkgPT09ICdib29sZWFuX2Jhc2tldF9jaGFydCcpIHtcbiAgICAgICAgY29uc3QgY2FyZE5hbWUgPSBzZWN0aW9uLm5hbWUgfHwga2V5O1xuICAgICAgICBjb25zdCBrZXl3b3JkRGF0YTogYW55W10gPSBBcnJheS5pc0FycmF5KHNlY3Rpb24ua2V5d29yZERhdGEpID8gc2VjdGlvbi5rZXl3b3JkRGF0YSA6IFtdO1xuICAgICAgICBjb25zdCBzZW50aW1lbnRQYWxldHRlOiB7IFtrOiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgICBORUdBVElWRTogJyM2MEM2RkYnLFxuICAgICAgICAgIE5FVVRSQUw6ICcjQjZFM0ZGJyxcbiAgICAgICAgICBQT1NJVElWRTogJyNEOUYxRkYnXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJ1aWxkU2xpY2VzID0gKHM6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5lZyA9IHM/Lm5lZ2F0aXZlID8/IDA7XG4gICAgICAgICAgY29uc3QgbmV1ID0gcz8ubmV1dHJhbCA/PyAwO1xuICAgICAgICAgIGNvbnN0IHBvcyA9IHM/LnBvc2l0aXZlID8/IDA7XG4gICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdOZWdhdGl2ZScsIGtleTogJ05FR0FUSVZFJywgcGVyY2VudDogbmVnLCBjb2xvcjogc2VudGltZW50UGFsZXR0ZVsnTkVHQVRJVkUnXSB9LFxuICAgICAgICAgICAgeyBsYWJlbDogJ05ldXRyYWwnLCAga2V5OiAnTkVVVFJBTCcsICBwZXJjZW50OiBuZXUsIGNvbG9yOiBzZW50aW1lbnRQYWxldHRlWydORVVUUkFMJ10gfSxcbiAgICAgICAgICAgIHsgbGFiZWw6ICdQb3NpdGl2ZScsIGtleTogJ1BPU0lUSVZFJywgcGVyY2VudDogcG9zLCBjb2xvcjogc2VudGltZW50UGFsZXR0ZVsnUE9TSVRJVkUnXSB9XG4gICAgICAgICAgXTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGtleXdvcmRSb3dzOiBhbnlbXSA9IFtdO1xuICAgICAgICBpZiAoa2V5d29yZERhdGEubGVuZ3RoKSB7XG4gICAgICAgICAga2V5d29yZFJvd3MgPSBrZXl3b3JkRGF0YS5tYXAoKGs6IGFueSkgPT4gKHtcbiAgICAgICAgICAgIGlkOiBrLmlkLFxuICAgICAgICAgICAgbGFiZWw6IGsua2V5d29yZCB8fCAnJyxcbiAgICAgICAgICAgIGNvdW50OiBrLmNvdW50IHx8IDAsXG4gICAgICAgICAgICBzZW50aW1lbnQ6IGsuc2VudGltZW50IHx8IHsgbmVnYXRpdmU6IDAsIG5ldXRyYWw6IDAsIHBvc2l0aXZlOiAwIH0sXG4gICAgICAgICAgICBzbGljZXM6IGJ1aWxkU2xpY2VzKGsuc2VudGltZW50KVxuICAgICAgICAgIH0pKS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gYi5jb3VudCAtIGEuY291bnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrOiBkZXJpdmUgZnJvbSBjb250ZW50X3RhZ3MgKyBzaGFyZWQgc3RhdHVzX3RhZ3NcbiAgICAgICAgICBjb25zdCBjb250ZW50VGFnczogYW55W10gPSBBcnJheS5pc0FycmF5KHNlY3Rpb24uY29udGVudF90YWdzKSA/IHNlY3Rpb24uY29udGVudF90YWdzIDogdmFsdWVzO1xuICAgICAgICAgIGNvbnN0IHN0YXR1c1RhZ3M6IGFueVtdID0gQXJyYXkuaXNBcnJheShzZWN0aW9uLnN0YXR1c190YWdzKSA/IHNlY3Rpb24uc3RhdHVzX3RhZ3MgOiBbXTtcbiAgICAgICAgICBjb25zdCB0b3RhbFN0YXR1cyA9IHN0YXR1c1RhZ3MucmVkdWNlKChzdW06IG51bWJlciwgdDogYW55KSA9PiBzdW0gKyAodC5jb3VudCB8fCAwKSwgMCk7XG4gICAgICAgICAgY29uc3Qgc2hhcmVkU2VudGltZW50OiBhbnkgPSB7IG5lZ2F0aXZlOiAwLCBuZXV0cmFsOiAwLCBwb3NpdGl2ZTogMCB9O1xuICAgICAgICAgIHN0YXR1c1RhZ3MuZm9yRWFjaCgodDogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBrID0gKHQudGFnIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKGsgPT09ICduZWdhdGl2ZScgfHwgayA9PT0gJ25ldXRyYWwnIHx8IGsgPT09ICdwb3NpdGl2ZScpIHtcbiAgICAgICAgICAgICAgc2hhcmVkU2VudGltZW50W2tdID0gdG90YWxTdGF0dXMgPyBNYXRoLnJvdW5kKCh0LmNvdW50IC8gdG90YWxTdGF0dXMpICogMTAwKSA6IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAga2V5d29yZFJvd3MgPSBjb250ZW50VGFncy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgIGxhYmVsOiBpdGVtLnRhZyA/PyBpdGVtLm5hbWUgPz8gJycsXG4gICAgICAgICAgICBjb3VudDogaXRlbS5jb3VudCA/PyBpdGVtLlJlc3BvbnNlcyA/PyAwLFxuICAgICAgICAgICAgc2VudGltZW50OiBzaGFyZWRTZW50aW1lbnQsXG4gICAgICAgICAgICBzbGljZXM6IGJ1aWxkU2xpY2VzKHNoYXJlZFNlbnRpbWVudClcbiAgICAgICAgICB9KSkuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IGIuY291bnQgLSBhLmNvdW50KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaXJzdFJvdyA9IGtleXdvcmRSb3dzWzBdIHx8IG51bGw7XG4gICAgICAgIGNvbnN0IGZpcnN0U2xpY2UgPSBmaXJzdFJvdz8uc2xpY2VzPy5maW5kKChzOiBhbnkpID0+IHMucGVyY2VudCA+IDApIHx8IGZpcnN0Um93Py5zbGljZXM/LlswXSB8fCBudWxsO1xuICAgICAgICBjYXJkcy5wdXNoKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbmFtZTogY2FyZE5hbWUsXG4gICAgICAgICAgdHlwZTogJ0JPT0xFQU5fQkFTS0VUX0NIQVJUJyxcbiAgICAgICAgICBhcHBsaWNhYmxlQ291bnQsXG4gICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgc2hvcnREZXNjcmlwdGlvbixcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAga2V5d29yZFJvd3MsXG4gICAgICAgICAgc2VsZWN0ZWRLZXl3b3JkOiBmaXJzdFJvdz8ubGFiZWwgfHwgJycsXG4gICAgICAgICAgc2VsZWN0ZWRTbGljZXM6IGZpcnN0Um93Py5zbGljZXMgfHwgW10sXG4gICAgICAgICAgc2VsZWN0ZWRTZW50aW1lbnQ6IGZpcnN0U2xpY2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdCT09MRUFOX0JBU0tFVCcpIHtcbiAgICAgICAgY29uc3QgY2FyZE5hbWUgPSBzZWN0aW9uLm5hbWUgfHwga2V5O1xuICAgICAgICBjb25zdCBpc0Z1bm5lbCA9IGNhcmROYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2Z1bm5lbCcpO1xuICAgICAgICBjYXJkcy5wdXNoKHtcbiAgICAgICAgICBrZXksXG4gICAgICAgICAgbmFtZTogY2FyZE5hbWUsXG4gICAgICAgICAgdHlwZTogJ0JPT0xFQU5fQkFTS0VUJyxcbiAgICAgICAgICBpc0Z1bm5lbCxcbiAgICAgICAgICBhcHBsaWNhYmxlQ291bnQsXG4gICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgc2hvcnREZXNjcmlwdGlvbixcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgYm9vbGVhblJvd3M6IHZhbHVlcy5tYXAoKGl0ZW06IGFueSkgPT4gKHtcbiAgICAgICAgICAgIGlkOiBpdGVtLl9pZCB8fCAnJyxcbiAgICAgICAgICAgIGxhYmVsOiBpdGVtLm5hbWUsXG4gICAgICAgICAgICByZXNwb25zZXM6IGl0ZW0uUmVzcG9uc2VzID8/IGl0ZW0uY291bnQgPz8gMCxcbiAgICAgICAgICAgIHNjb3JlOiBpdGVtLnNjb3JlID8/IDBcbiAgICAgICAgICB9KSkuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IGIucmVzcG9uc2VzIC0gYS5yZXNwb25zZXMpXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnTlVNRVJJQ19TQ0FMQVInIHx8IHR5cGUgPT09ICdOVU1FUklDX0FSUkFZJykge1xuICAgICAgICBjb25zdCBpdGVtID0gdmFsdWVzWzBdIHx8IHt9O1xuICAgICAgICBjb25zdCBzY2FsZSA9IHNlY3Rpb24uc2NhbGUgfHwge307XG4gICAgICAgIG51bWVyaWNSb3dzLnB1c2goe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBuYW1lOiBzZWN0aW9uLm5hbWUgfHwga2V5LFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICBhdmc6IGl0ZW0uQXZnID8/IGl0ZW0uYXZnID8/IDAsXG4gICAgICAgICAgbWluOiBpdGVtLk1pbiA/PyBpdGVtLm1pbiA/PyBzY2FsZS5taW4gPz8gc2VjdGlvbi5taW4gPz8gbnVsbCxcbiAgICAgICAgICBtYXg6IGl0ZW0uTWF4ID8/IGl0ZW0ubWF4ID8/IHNjYWxlLm1heCA/PyBzZWN0aW9uLm1heCA/PyBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnU1VCSkVDVElWRScgfHwgdHlwZSA9PT0gJ1NVQkpFQ1RJVkVfQ09VTlQnKSB7XG4gICAgICAgIGNhcmRzLnB1c2goe1xuICAgICAgICAgIGtleSxcbiAgICAgICAgICBuYW1lOiBzZWN0aW9uLm5hbWUgfHwga2V5LFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgYXBwbGljYWJsZUNvdW50LFxuICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgIHNob3J0RGVzY3JpcHRpb24sXG4gICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgIHN1YmplY3RpdmVSb3dzOiB2YWx1ZXMubWFwKChpdGVtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBfaWQ6IGl0ZW0uX2lkIHx8ICcnLFxuICAgICAgICAgICAgcmVhc29uaW5nOiBpdGVtLnJlYXNvbmluZyB8fCAnJyxcbiAgICAgICAgICAgIHN0b3JlX2lkOiBpdGVtLnN0b3JlX2lkIHx8ICcnLFxuICAgICAgICAgICAgZGF0ZTogaXRlbS5kYXRlIHx8ICcnXG4gICAgICAgICAgfSkpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdyb3VwIGFsbCBudW1lcmljIHNjb3JlcyBpbnRvIG9uZSBjYXJkXG4gICAgaWYgKG51bWVyaWNSb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNhcmRzLnB1c2goe1xuICAgICAgICBrZXk6ICdudW1lcmljU2NvcmVzJyxcbiAgICAgICAgbmFtZTogJ0F2ZXJhZ2UgU2NvcmVzJyxcbiAgICAgICAgdHlwZTogJ05VTUVSSUNfR1JPVVAnLFxuICAgICAgICBudW1lcmljUm93c1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSW5zZXJ0IHVuaXF1ZSBwaXRjaGVzIGNhcmQgaWYgcHJlc2VudCAoc2FtZSBhcyBhdWRpby1wYWdlKVxuICAgIGlmIChhbmFseXNpcy51bmlxdWVQaXRjaGVzICYmIEFycmF5LmlzQXJyYXkoYW5hbHlzaXMudW5pcXVlUGl0Y2hlcykpIHtcbiAgICAgIGNvbnN0IHBpdGNoSW5zZXJ0SWR4ID0gY2FyZHMubGVuZ3RoID49IDIgPyAyIDogY2FyZHMubGVuZ3RoO1xuICAgICAgY2FyZHMuc3BsaWNlKHBpdGNoSW5zZXJ0SWR4LCAwLCB7XG4gICAgICAgIGtleTogJ3VuaXF1ZVBpdGNoZXMnLFxuICAgICAgICBuYW1lOiAnUGl0Y2ggS2V5d29yZHMgVHJhY2tlcicsXG4gICAgICAgIHR5cGU6ICdVTklRVUVfUElUQ0hFUycsXG4gICAgICAgIHBpdGNoUm93czogYW5hbHlzaXMudW5pcXVlUGl0Y2hlcy5tYXAoKHA6IGFueSkgPT4gKHsgaWQ6IHAucGl0Y2hJZCwgZGVzYzogcC5kZXNjcmlwdGlvbiB9KSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjYXJkcztcbiAgfVxuXG4gIC8vIENhcmQgcm93IGNsaWNrIChzYW1lIGFzIGF1ZGlvLXBhZ2Ugb25DYXJkUm93Q2xpY2spXG4gIHNlbGVjdGVkQ2FyZElkID0gJyc7XG4gIHNlbGVjdGVkQ2FyZE5hbWUgPSAnJztcbiAgdG90YWxBdWRpbyA9IDA7XG5cbiAgb25DYXJkUm93Q2xpY2soaWQ6IGFueSwgbmFtZTogYW55KTogdm9pZCB7XG4gICAgLy8gU3RvcCBhbnkgcGxheWluZyBhdWRpb1xuICAgIGlmICh0aGlzLnBsYXlpbmdDb252SWQpIHtcbiAgICAgIGNvbnN0IGF1ZGlvID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoYGF1ZGlvLSR7dGhpcy5wbGF5aW5nQ29udklkfWApIGFzIEhUTUxBdWRpb0VsZW1lbnQ7XG4gICAgICBpZiAoYXVkaW8pIHsgYXVkaW8ucGF1c2UoKTsgYXVkaW8uY3VycmVudFRpbWUgPSAwOyB9XG4gICAgICB0aGlzLnBsYXlpbmdDb252SWQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkQ2FyZElkID0gaWQgfHwgJyc7XG4gICAgdGhpcy5zZWxlY3RlZENhcmROYW1lID0gaWQgPyAnJyA6IChuYW1lIHx8ICcnKTtcbiAgICB0aGlzLmRldGFpbFBhZ2UgPSAxO1xuICAgIHRoaXMuZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk7XG4gICAgLy8gU2Nyb2xsIHRvIGNvbnZlcnNhdGlvbnMgc2VjdGlvblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2VjaG9Db252ZXJzYXRpb25zJyk/LnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ3N0YXJ0JyB9KTtcbiAgICB9LCAxMDApO1xuICB9XG5cbiAgZmV0Y2hEZXRhaWxDb252ZXJzYXRpb25zKCk6IHZvaWQge1xuICAgIC8vIENsZWFyIG9sZCBkYXRhIGltbWVkaWF0ZWx5IHNvIHN0YWxlIHJlc3VsdHMgZG9uJ3Qgc2hvd1xuICAgIHRoaXMuZGV0YWlsQ29udmVyc2F0aW9ucyA9IFtdO1xuICAgIHRoaXMuZGV0YWlsUGFnZUNvbnZzID0gW107XG4gICAgdGhpcy5kZXRhaWxPcGVuSWQgPSBudWxsO1xuICAgIHRoaXMuZGV0YWlsVG90YWwgPSAwO1xuICAgIHRoaXMuZGV0YWlsTG9hZGluZyA9IHRydWU7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIC4uLnRoaXMuYnVpbGRCYXNlUGF5bG9hZCgpLFxuICAgICAgY29ob3J0VHlwZTogW3RoaXMuc2VsZWN0ZWRDb2hvcnRJZF0sXG4gICAgICBsaW1pdDogdGhpcy5kZXRhaWxQZXJQYWdlLFxuICAgICAgX2lkOiB0aGlzLnNlbGVjdGVkQ2FyZElkID8gW3RoaXMuc2VsZWN0ZWRDYXJkSWRdIDogW10sXG4gICAgICBuYW1lOiB0aGlzLnNlbGVjdGVkQ2FyZE5hbWUsXG4gICAgICBvZmZzZXQ6IHRoaXMuZGV0YWlsUGFnZSAtIDEsXG4gICAgICBzZWFyY2hWYWx1ZTogdGhpcy5kZXRhaWxTZWFyY2hWYWx1ZSB8fCAnJ1xuICAgIH07XG5cbiAgICB0aGlzLmF1ZGlvU2VydmljZS5nZXRDb252ZXJzYXRpb25zTGlzdChwYXlsb2FkKS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhID0gcmVzPy5kYXRhO1xuICAgICAgICBjb25zdCBsaXN0ID0gZGF0YT8uZGF0YSB8fCBkYXRhPy5jb252ZXJzYXRpb25zIHx8IFtdO1xuICAgICAgICB0aGlzLmRldGFpbENvbnZlcnNhdGlvbnMgPSBsaXN0Lm1hcCgoaXRlbTogYW55KSA9PiB0aGlzLm1hcENvbnZlcnNhdGlvbihpdGVtKSk7XG4gICAgICAgIHRoaXMuZGV0YWlsVG90YWwgPSBkYXRhPy5jb3VudCA/PyBkYXRhPy5wYWdpbmF0aW9uPy50b3RhbCA/PyB0aGlzLmRldGFpbENvbnZlcnNhdGlvbnMubGVuZ3RoO1xuICAgICAgICB0aGlzLmRldGFpbFRvdGFsUGFnZXMgPSBNYXRoLm1heCgxLCBNYXRoLmNlaWwodGhpcy5kZXRhaWxUb3RhbCAvIHRoaXMuZGV0YWlsUGVyUGFnZSkpO1xuICAgICAgICB0aGlzLmRldGFpbFBhZ2luYXRpb25TaXplcyA9IHRoaXMuZGV0YWlsVG90YWwgPiAxMCA/IFsxMCwgMjAsIDUwLCAxMDBdIDogW3RoaXMuZGV0YWlsVG90YWwgfHwgMTBdO1xuICAgICAgICB0aGlzLmRldGFpbFBlclBhZ2UgPSB0aGlzLmRldGFpbFBhZ2luYXRpb25TaXplcy5pbmNsdWRlcyh0aGlzLmRldGFpbFBlclBhZ2UpID8gdGhpcy5kZXRhaWxQZXJQYWdlIDogdGhpcy5kZXRhaWxQYWdpbmF0aW9uU2l6ZXNbMF07XG4gICAgICAgIHRoaXMuZGV0YWlsUGFnZUNvbnZzID0gdGhpcy5kZXRhaWxDb252ZXJzYXRpb25zO1xuICAgICAgICBpZiAodGhpcy5kZXRhaWxQYWdlQ29udnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZGV0YWlsT3BlbklkID0gdGhpcy5kZXRhaWxQYWdlQ29udnNbMF0uYXVkaW9JZDtcbiAgICAgICAgICB0aGlzLmxvYWRDb252RGV0YWlsKHRoaXMuZGV0YWlsUGFnZUNvbnZzWzBdKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRldGFpbExvYWRpbmcgPSBmYWxzZTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLmRldGFpbENvbnZlcnNhdGlvbnMgPSBbXTtcbiAgICAgICAgdGhpcy5kZXRhaWxQYWdlQ29udnMgPSBbXTtcbiAgICAgICAgdGhpcy5kZXRhaWxUb3RhbFBhZ2VzID0gMTtcbiAgICAgICAgdGhpcy5kZXRhaWxMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2FkQ29udmVyc2F0aW9uRGV0YWlsKGNvbnY6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGF1ZGlvSWQgPSBjb252Py5kb2NfaWQgfHwgY29udj8uYXVkaW9JZCB8fCBjb252Py5faWQ7XG4gICAgaWYgKCFhdWRpb0lkKSByZXR1cm47XG5cbiAgICB0aGlzLmF1ZGlvU2VydmljZS5nZXRDb252ZXJzYXRpb25EZXRhaWwoYXVkaW9JZCwge1xuICAgICAgY29ob3J0SWQ6IFt0aGlzLnNlbGVjdGVkQ29ob3J0SWRdLFxuICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWRcbiAgICB9KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmRldGFpbENvbnZEZXRhaWwgPSByZXM/LmRhdGEgfHwgcmVzO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7IHRoaXMuZGV0YWlsQ29udkRldGFpbCA9IG51bGw7IH1cbiAgICB9KTtcbiAgfVxuXG4gIHRvZ2dsZURldGFpbENvbnYoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWlsT3BlbklkID0gdGhpcy5kZXRhaWxPcGVuSWQgPT09IGlkID8gbnVsbCA6IGlkO1xuICB9XG5cbiAgb25EZXRhaWxQYWdlQ2hhbmdlKHBhZ2U6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuZGV0YWlsUGFnZSA9IHBhZ2U7XG4gICAgdGhpcy5mZXRjaERldGFpbENvbnZlcnNhdGlvbnMoKTtcbiAgfVxuXG4gIG9uRGV0YWlsUGFnZVNpemVDaGFuZ2Uoc2l6ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5kZXRhaWxQZXJQYWdlID0gcGFyc2VJbnQoc2l6ZSk7XG4gICAgdGhpcy5kZXRhaWxQYWdlID0gMTtcbiAgICB0aGlzLmZldGNoRGV0YWlsQ29udmVyc2F0aW9ucygpO1xuICB9XG5cbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIC8vIE1BTkFHRSBUQUIgKHVzZXMgbGlzdENvaG9ydHMvZGVsZXRlQ29ob3J0IEFQSXMpXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICBsb2FkTWFuYWdlQ29ob3J0cygpOiB2b2lkIHtcbiAgICB0aGlzLm1hbmFnZUxvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IG9mZnNldCA9ICh0aGlzLm1hbmFnZVBhZ2UgLSAxKSAqIHRoaXMubWFuYWdlUGVyUGFnZTtcblxuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmxpc3RDb2hvcnRzKHRoaXMuY2xpZW50SWQsIHRoaXMubWFuYWdlUGVyUGFnZSwgb2Zmc2V0KS5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXM6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm1hbmFnZUNvaG9ydHMgPSByZXM/LmRhdGE/LmNvaG9ydHMgfHwgW107XG4gICAgICAgIHRoaXMubWFuYWdlVG90YWwgPSByZXM/LmRhdGE/LnBhZ2luYXRpb24/LnRvdGFsID8/IHRoaXMubWFuYWdlQ29ob3J0cy5sZW5ndGg7XG4gICAgICAgIHRoaXMubWFuYWdlVG90YWxQYWdlcyA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0aGlzLm1hbmFnZVRvdGFsIC8gdGhpcy5tYW5hZ2VQZXJQYWdlKSk7XG4gICAgICAgIHRoaXMubWFuYWdlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMubWFuYWdlQ29ob3J0cyA9IFtdO1xuICAgICAgICB0aGlzLm1hbmFnZVRvdGFsID0gMDtcbiAgICAgICAgdGhpcy5tYW5hZ2VUb3RhbFBhZ2VzID0gMTtcbiAgICAgICAgdGhpcy5tYW5hZ2VMb2FkaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbk1hbmFnZVBhZ2VDaGFuZ2UocGFnZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5tYW5hZ2VQYWdlID0gcGFnZTtcbiAgICB0aGlzLmxvYWRNYW5hZ2VDb2hvcnRzKCk7XG4gIH1cblxuICBvbk1hbmFnZVBhZ2VTaXplQ2hhbmdlKHNpemU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubWFuYWdlUGVyUGFnZSA9IHBhcnNlSW50KHNpemUpO1xuICAgIHRoaXMubWFuYWdlUGFnZSA9IDE7XG4gICAgdGhpcy5sb2FkTWFuYWdlQ29ob3J0cygpO1xuICB9XG5cbiAgb25NYW5hZ2VTZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy5tYW5hZ2VQYWdlID0gMTtcbiAgICB0aGlzLmxvYWRNYW5hZ2VDb2hvcnRzKCk7XG4gIH1cblxuICBkZWxldGVDb2hvcnQoY29ob3J0SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghY29uZmlybSgnQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvaG9ydD8nKSkgcmV0dXJuO1xuICAgIHRoaXMuYXVkaW9TZXJ2aWNlLmRlbGV0ZUNvaG9ydChjb2hvcnRJZCkucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7IHRoaXMubG9hZE1hbmFnZUNvaG9ydHMoKTsgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7IGFsZXJ0KCdGYWlsZWQgdG8gZGVsZXRlIGNvaG9ydC4nKTsgfVxuICAgIH0pO1xuICB9XG5cbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIC8vIEFVRElPIFBMQVlFUiAoc2FtZSBwYXR0ZXJuIGFzIHRyYW5zY3JpcHQtbGlzdClcbiAgLy8g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQXG4gIHBsYXliYWNrU3RhdGVzOiB7IFtpZDogc3RyaW5nXTogeyBjdXJyZW50VGltZTogc3RyaW5nOyB0b3RhbFRpbWU6IHN0cmluZzsgcHJvZ3Jlc3M6IG51bWJlciB9IH0gPSB7fTtcbiAgaXNNdXRlZCA9IGZhbHNlO1xuXG4gIHRvZ2dsZVBsYXkoY29udklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBhdWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhdWRpby0ke2NvbnZJZH1gKSBhcyBIVE1MQXVkaW9FbGVtZW50O1xuICAgIGlmICghYXVkaW8pIHJldHVybjtcbiAgICBpZiAodGhpcy5wbGF5aW5nQ29udklkID09PSBjb252SWQpIHtcbiAgICAgIGF1ZGlvLnBhdXNlKCk7XG4gICAgICB0aGlzLnBsYXlpbmdDb252SWQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBQYXVzZSBhbnkgY3VycmVudGx5IHBsYXlpbmdcbiAgICAgIGlmICh0aGlzLnBsYXlpbmdDb252SWQpIHtcbiAgICAgICAgY29uc3Qgb3RoZXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChgYXVkaW8tJHt0aGlzLnBsYXlpbmdDb252SWR9YCkgYXMgSFRNTEF1ZGlvRWxlbWVudDtcbiAgICAgICAgaWYgKG90aGVyKSBvdGhlci5wYXVzZSgpO1xuICAgICAgICB0aGlzLnBsYXlpbmdDb252SWQgPSBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgcGxheVByb21pc2UgPSBhdWRpby5wbGF5KCk7XG4gICAgICBpZiAocGxheVByb21pc2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwbGF5UHJvbWlzZS50aGVuKCgpID0+IHsgdGhpcy5wbGF5aW5nQ29udklkID0gY29udklkOyB9KS5jYXRjaCgoKSA9PiB7IHRoaXMucGxheWluZ0NvbnZJZCA9IG51bGw7IH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5wbGF5aW5nQ29udklkID0gY29udklkO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uTG9hZGVkTWV0YWRhdGEoYXVkaW86IEhUTUxBdWRpb0VsZW1lbnQsIGNvbnZJZDogc3RyaW5nLCBhcGlEdXJhdGlvbj86IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wbGF5YmFja1N0YXRlc1tjb252SWRdKSB7XG4gICAgICB0aGlzLnBsYXliYWNrU3RhdGVzW2NvbnZJZF0gPSB7IGN1cnJlbnRUaW1lOiAnMDowMCcsIHRvdGFsVGltZTogJzA6MDAnLCBwcm9ncmVzczogMCB9O1xuICAgIH1cbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMucGxheWJhY2tTdGF0ZXNbY29udklkXTtcbiAgICBpZiAoaXNGaW5pdGUoYXVkaW8uZHVyYXRpb24pICYmIGF1ZGlvLmR1cmF0aW9uID4gMCkge1xuICAgICAgc3RhdGUudG90YWxUaW1lID0gdGhpcy5mb3JtYXRBdWRpb1RpbWUoYXVkaW8uZHVyYXRpb24pO1xuICAgIH0gZWxzZSBpZiAoYXBpRHVyYXRpb24pIHtcbiAgICAgIHN0YXRlLnRvdGFsVGltZSA9IGFwaUR1cmF0aW9uO1xuICAgIH1cbiAgfVxuXG4gIG9uVGltZVVwZGF0ZShhdWRpbzogSFRNTEF1ZGlvRWxlbWVudCwgY29udklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGxheWJhY2tTdGF0ZXNbY29udklkXSkge1xuICAgICAgdGhpcy5wbGF5YmFja1N0YXRlc1tjb252SWRdID0geyBjdXJyZW50VGltZTogJzA6MDAnLCB0b3RhbFRpbWU6ICcwOjAwJywgcHJvZ3Jlc3M6IDAgfTtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnBsYXliYWNrU3RhdGVzW2NvbnZJZF07XG4gICAgc3RhdGUuY3VycmVudFRpbWUgPSB0aGlzLmZvcm1hdEF1ZGlvVGltZShhdWRpby5jdXJyZW50VGltZSk7XG4gICAgaWYgKGlzRmluaXRlKGF1ZGlvLmR1cmF0aW9uKSAmJiBhdWRpby5kdXJhdGlvbiA+IDApIHtcbiAgICAgIHN0YXRlLnByb2dyZXNzID0gYXVkaW8uY3VycmVudFRpbWUgLyBhdWRpby5kdXJhdGlvbjtcbiAgICB9XG4gIH1cblxuICBzZWVrQXVkaW8oZXZlbnQ6IE1vdXNlRXZlbnQsIGNvbnZJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdHJhY2sgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSB0cmFjay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCByYXRpbyA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIChldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0KSAvIHJlY3Qud2lkdGgpKTtcbiAgICBjb25zdCBhdWRpbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGBhdWRpby0ke2NvbnZJZH1gKSBhcyBIVE1MQXVkaW9FbGVtZW50O1xuICAgIGlmICghYXVkaW8gfHwgIWlzRmluaXRlKGF1ZGlvLmR1cmF0aW9uKSB8fCBhdWRpby5kdXJhdGlvbiA8PSAwKSByZXR1cm47XG4gICAgYXVkaW8uY3VycmVudFRpbWUgPSByYXRpbyAqIGF1ZGlvLmR1cmF0aW9uO1xuICAgIC8vIFVwZGF0ZSB3YXZlZm9ybSBwcm9ncmVzcyBpbnN0YW50bHkg4oCUIHJlYXNzaWduIG9iamVjdCB0byB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb25cbiAgICBjb25zdCBwcmV2ID0gdGhpcy5wbGF5YmFja1N0YXRlc1tjb252SWRdIHx8IHsgY3VycmVudFRpbWU6ICcwOjAwJywgdG90YWxUaW1lOiAnMDowMCcsIHByb2dyZXNzOiAwIH07XG4gICAgdGhpcy5wbGF5YmFja1N0YXRlcyA9IHtcbiAgICAgIC4uLnRoaXMucGxheWJhY2tTdGF0ZXMsXG4gICAgICBbY29udklkXTogeyAuLi5wcmV2LCBwcm9ncmVzczogcmF0aW8sIGN1cnJlbnRUaW1lOiB0aGlzLmZvcm1hdEF1ZGlvVGltZShhdWRpby5jdXJyZW50VGltZSkgfVxuICAgIH07XG4gICAgLy8gSWYgbm90IGFscmVhZHkgcGxheWluZywgc3RhcnQgcGxheWJhY2sgZnJvbSB0aGUgY2xpY2tlZCBwb3NpdGlvblxuICAgIGlmICh0aGlzLnBsYXlpbmdDb252SWQgIT09IGNvbnZJZCkge1xuICAgICAgY29uc3QgcGxheVByb21pc2UgPSBhdWRpby5wbGF5KCk7XG4gICAgICBpZiAocGxheVByb21pc2UpIHtcbiAgICAgICAgcGxheVByb21pc2UudGhlbigoKSA9PiB7IHRoaXMucGxheWluZ0NvbnZJZCA9IGNvbnZJZDsgfSkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRvZ2dsZU11dGUoKTogdm9pZCB7XG4gICAgdGhpcy5pc011dGVkID0gIXRoaXMuaXNNdXRlZDtcbiAgICBjb25zdCBhdWRpb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhdWRpbycpO1xuICAgIGF1ZGlvcy5mb3JFYWNoKGEgPT4gYS5tdXRlZCA9IHRoaXMuaXNNdXRlZCk7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdEF1ZGlvVGltZShzZWNvbmRzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghc2Vjb25kcykgcmV0dXJuICcwOjAwJztcbiAgICBjb25zdCBtaW5zID0gTWF0aC5mbG9vcihzZWNvbmRzIC8gNjApO1xuICAgIGNvbnN0IHNlY3MgPSBNYXRoLmZsb29yKHNlY29uZHMgJSA2MCk7XG4gICAgcmV0dXJuIGAke21pbnN9OiR7c2VjcyA8IDEwID8gJzAnICsgc2VjcyA6IHNlY3N9YDtcbiAgfVxuXG4gIC8vIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkFxuICAvLyBGSUxURVJTIERSQVdFUlxuICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgb3BlbkZpbHRlckRyYXdlcigpOiB2b2lkIHsgdGhpcy5kcmF3ZXJPcGVuID0gdHJ1ZTsgfVxuICBjbG9zZUZpbHRlckRyYXdlcigpOiB2b2lkIHsgdGhpcy5kcmF3ZXJPcGVuID0gZmFsc2U7IH1cblxuICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgLy8gVVRJTElUWVxuICAvLyDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZBcbiAgdHJhY2tCeUlkKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIGl0ZW0/LmlkIHx8IGl0ZW0/Ll9pZCB8fCBpdGVtPy5kb2NfaWQgfHwgaW5kZXg7XG4gIH1cblxuICBnZXRTdGF0dXNCYWRnZShzdGF0dXM6IHN0cmluZyk6IHsgYmc6IHN0cmluZzsgY29sb3I6IHN0cmluZyB9IHtcbiAgICBpZiAoIXN0YXR1cykgcmV0dXJuIHsgYmc6ICcnLCBjb2xvcjogJycgfTtcbiAgICBjb25zdCBzID0gc3RhdHVzLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHMuaW5jbHVkZXMoJ3Bvc2l0aXZlJykgfHwgcy5pbmNsdWRlcygnc3Ryb25nJykgfHwgcy5pbmNsdWRlcygnZ29vZCcpIHx8IHMuaW5jbHVkZXMoJ2NvbmZpZGVudCcpIHx8IHMuaW5jbHVkZXMoJ2V4Y2VsbGVudCcpKVxuICAgICAgcmV0dXJuIHsgYmc6ICcjRDFGQUU1JywgY29sb3I6ICcjMDY1RjQ2JyB9O1xuICAgIGlmIChzLmluY2x1ZGVzKCd3YXJuaW5nJykgfHwgcy5pbmNsdWRlcygnbW9kZXJhdGUnKSB8fCBzLmluY2x1ZGVzKCdyb29tIHRvIGltcHJvdmUnKSB8fCBzLmluY2x1ZGVzKCdhdmVyYWdlJykpXG4gICAgICByZXR1cm4geyBiZzogJyNGRUYzQzcnLCBjb2xvcjogJyM5MjQwMEUnIH07XG4gICAgaWYgKHMuaW5jbHVkZXMoJ25lZ2F0aXZlJykgfHwgcy5pbmNsdWRlcygnd2VhaycpIHx8IHMuaW5jbHVkZXMoJ3Bvb3InKSB8fCBzLmluY2x1ZGVzKCdjcml0aWNhbCcpKVxuICAgICAgcmV0dXJuIHsgYmc6ICcjRkVFMkUyJywgY29sb3I6ICcjOTkxQjFCJyB9O1xuICAgIHJldHVybiB7IGJnOiAnI0YwRjRGRicsIGNvbG9yOiAnIzFBMkI0QicgfTtcbiAgfVxuXG4gIGZvcm1hdE1ldHJpY1ZhbHVlKHY6IGFueSk6IHN0cmluZyB7XG4gICAgaWYgKHYuc2NvcmUgIT0gbnVsbCkge1xuICAgICAgY29uc3QgcyA9IHYuc2NvcmU7XG4gICAgICBpZiAodHlwZW9mIHMgPT09ICdudW1iZXInKSByZXR1cm4gcyArICclJztcbiAgICAgIGNvbnN0IHN0ciA9IFN0cmluZyhzKTtcbiAgICAgIHJldHVybiBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSkudG9Mb3dlckNhc2UoKTtcbiAgICB9XG4gICAgY29uc3QgdmFsID0gdi5Ub3RhbCA/PyB2LnRvdGFsID8/IHYuQXZnID8/IHYuYXZnID8/IHYuY291bnQ7XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdmFsLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiB2YWwgIT0gbnVsbCA/IFN0cmluZyh2YWwpIDogJyc7XG4gIH1cblxuICBnZXRTY29yZUNvbG9yKHNjb3JlOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmIChzY29yZSA+PSAzNSkgcmV0dXJuICcjMDA3N0U2JztcbiAgICBpZiAoc2NvcmUgPj0gMjApIHJldHVybiAnIzAwQTNGRic7XG4gICAgaWYgKHNjb3JlID49IDEwKSByZXR1cm4gJyM0REMzRkYnO1xuICAgIGlmIChzY29yZSA+PSA1KSByZXR1cm4gJyM4QUQ4RkYnO1xuICAgIGlmIChzY29yZSA+PSAyKSByZXR1cm4gJyNCREU4RkYnO1xuICAgIHJldHVybiAnI0Q5RjFGRic7XG4gIH1cblxuICBoYXNTZWFyY2hNYXRjaChsaXN0OiBhbnlbXSwgc2VhcmNoOiBzdHJpbmcsIGtleTE6IHN0cmluZywga2V5Mjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFzZWFyY2gpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHEgPSBzZWFyY2gudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbGlzdC5zb21lKGl0ZW0gPT4gKChpdGVtW2tleTFdIHx8IGl0ZW1ba2V5Ml0gfHwgJycpIGFzIHN0cmluZykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSk7XG4gIH1cblxuICBNYXRoID0gTWF0aDtcblxuICAvLyDilIDilIAgQm9vbGVhbl9iYXNrZXRfY2hhcnQgaGVscGVycyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy8g4pSA4pSAIEJPT0xFQU5fQkFTS0VUX1RBQkxFIG92ZXJmbG93IHRvb2x0aXAgKGZsb2F0aW5nKSDilIDilIDilIBcbiAgYmJ0VG9vbHRpcDogeyB2aXNpYmxlOiBib29sZWFuOyB4OiBudW1iZXI7IHk6IG51bWJlcjsgaXRlbXM6IHN0cmluZ1tdIH0gPSB7XG4gICAgdmlzaWJsZTogZmFsc2UsIHg6IDAsIHk6IDAsIGl0ZW1zOiBbXVxuICB9O1xuXG4gIHNob3dCYnRUb29sdGlwKGV2ZW50OiBNb3VzZUV2ZW50LCBpdGVtczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgYXBwcm94V2lkdGggPSAyMjA7XG4gICAgY29uc3QgbWFyZ2luID0gMTI7XG4gICAgY29uc3QgdncgPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICBsZXQgeCA9IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyO1xuICAgIGNvbnN0IGhhbGZXaWR0aCA9IGFwcHJveFdpZHRoIC8gMjtcbiAgICBpZiAoeCArIGhhbGZXaWR0aCA+IHZ3IC0gbWFyZ2luKSB4ID0gdncgLSBtYXJnaW4gLSBoYWxmV2lkdGg7XG4gICAgaWYgKHggLSBoYWxmV2lkdGggPCBtYXJnaW4pIHggPSBtYXJnaW4gKyBoYWxmV2lkdGg7XG4gICAgdGhpcy5iYnRUb29sdGlwID0ge1xuICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgIHgsXG4gICAgICB5OiByZWN0LnRvcCAtIDgsXG4gICAgICBpdGVtc1xuICAgIH07XG4gIH1cblxuICBoaWRlQmJ0VG9vbHRpcCgpOiB2b2lkIHtcbiAgICB0aGlzLmJidFRvb2x0aXAgPSB7IHZpc2libGU6IGZhbHNlLCB4OiAwLCB5OiAwLCBpdGVtczogW10gfTtcbiAgfVxuXG4gIGV4cG9ydEJidENhcmQoY2FyZDogYW55KTogdm9pZCB7XG4gICAgaWYgKCFjYXJkIHx8ICFBcnJheS5pc0FycmF5KGNhcmQudGFibGVSb3dzKSB8fCBjYXJkLnRhYmxlUm93cy5sZW5ndGggPT09IDApIHJldHVybjtcbiAgICBjb25zdCByb3dzID0gY2FyZC50YWJsZVJvd3MubWFwKChyOiBhbnkpID0+ICh7XG4gICAgICBCcmFuZDogci5icmFuZCB8fCAnJyxcbiAgICAgIEF0dHJpYnV0ZXM6IEFycmF5LmlzQXJyYXkoci5hbGxBdHRyaWJ1dGVzKSA/IHIuYWxsQXR0cmlidXRlcy5qb2luKCcsICcpIDogJycsXG4gICAgICBDb3VudDogci5jb3VudCA/PyAwXG4gICAgfSkpO1xuICAgIGNvbnN0IHdvcmtzaGVldDogWExTWC5Xb3JrU2hlZXQgPSBYTFNYLnV0aWxzLmpzb25fdG9fc2hlZXQocm93cyk7XG4gICAgd29ya3NoZWV0WychY29scyddID0gW3sgd2NoOiAyOCB9LCB7IHdjaDogODAgfSwgeyB3Y2g6IDEwIH1dO1xuICAgIGNvbnN0IHdvcmtib29rOiBYTFNYLldvcmtCb29rID0geyBTaGVldHM6IHsgRGF0YTogd29ya3NoZWV0IH0sIFNoZWV0TmFtZXM6IFsnRGF0YSddIH07XG4gICAgY29uc3QgYnVmZmVyOiBhbnkgPSBYTFNYLndyaXRlKHdvcmtib29rLCB7IGJvb2tUeXBlOiAneGxzeCcsIHR5cGU6ICdhcnJheScgfSk7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nIH0pO1xuICAgIGNvbnN0IHNhZmVOYW1lID0gKGNhcmQubmFtZSB8fCAnY2FyZCcpLnRvU3RyaW5nKCkucmVwbGFjZSgvW15hLXowLTktX10rL2dpLCAnXycpO1xuICAgIEZpbGVTYXZlci5zYXZlQXMoYmxvYiwgYCR7c2FmZU5hbWV9Lnhsc3hgKTtcbiAgfVxuXG4gIHNlbGVjdFBpZVNsaWNlKGNhcmQ6IGFueSwgc2xpY2U6IGFueSk6IHZvaWQge1xuICAgIGNhcmQuc2VsZWN0ZWRQaWVMYWJlbCA9IHNsaWNlLmxhYmVsO1xuICB9XG5cbiAgc2VsZWN0QmFza2V0S2V5d29yZChjYXJkOiBhbnksIHJvdzogYW55KTogdm9pZCB7XG4gICAgY2FyZC5zZWxlY3RlZEtleXdvcmQgPSByb3cubGFiZWw7XG4gICAgY2FyZC5zZWxlY3RlZFNsaWNlcyA9IHJvdy5zbGljZXMgfHwgW107XG4gICAgY2FyZC5zZWxlY3RlZFNlbnRpbWVudCA9IGNhcmQuc2VsZWN0ZWRTbGljZXMuZmluZCgoczogYW55KSA9PiBzLnBlcmNlbnQgPiAwKSB8fCBjYXJkLnNlbGVjdGVkU2xpY2VzWzBdIHx8IG51bGw7XG4gIH1cblxuICBzZWxlY3RCYXNrZXRTZW50aW1lbnQoY2FyZDogYW55LCBzbGljZTogYW55KTogdm9pZCB7XG4gICAgY2FyZC5zZWxlY3RlZFNlbnRpbWVudCA9IHNsaWNlO1xuICB9XG5cbiAgLy8gQnVpbGQgc3Ryb2tlLWRhc2hhcnJheSBvZmZzZXQgc2VnbWVudHMgZm9yIGRvbnV0IHJpbmdcbiAgZ2V0RG9udXREYXNoKHNsaWNlOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IGNpcmN1bWZlcmVuY2UgPSAyICogTWF0aC5QSSAqIDQyOyAvLyByPTQyXG4gICAgY29uc3QgbGVuID0gKHNsaWNlLnBlcmNlbnQgLyAxMDApICogY2lyY3VtZmVyZW5jZTtcbiAgICByZXR1cm4gYCR7bGVufSAke2NpcmN1bWZlcmVuY2UgLSBsZW59YDtcbiAgfVxuXG4gIGdldERvbnV0T2Zmc2V0KGluZGV4OiBudW1iZXIsIGNhcmQ6IGFueSk6IG51bWJlciB7XG4gICAgY29uc3QgY2lyY3VtZmVyZW5jZSA9IDIgKiBNYXRoLlBJICogNDI7XG4gICAgY29uc3Qgc2xpY2VzID0gY2FyZC5zZWxlY3RlZFNsaWNlcyB8fCBbXTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHtcbiAgICAgIG9mZnNldCArPSAoc2xpY2VzW2ldLnBlcmNlbnQgLyAxMDApICogY2lyY3VtZmVyZW5jZTtcbiAgICB9XG4gICAgcmV0dXJuIC1vZmZzZXQ7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJlY2hvLXBhZ2VcIj5cbiAgPCEtLSBGbG9hdGluZyB0b29sdGlwIGZvciBCT09MRUFOX0JBU0tFVF9UQUJMRSBvdmVyZmxvdyBjaGlwcyAtLT5cbiAgPGRpdiBjbGFzcz1cImJidC1mbG9hdC10b29sdGlwXCJcbiAgICAgICAqbmdJZj1cImJidFRvb2x0aXAudmlzaWJsZVwiXG4gICAgICAgW3N0eWxlLmxlZnQucHhdPVwiYmJ0VG9vbHRpcC54XCJcbiAgICAgICBbc3R5bGUudG9wLnB4XT1cImJidFRvb2x0aXAueVwiPlxuICAgIDxzcGFuICpuZ0Zvcj1cImxldCBvdiBvZiBiYnRUb29sdGlwLml0ZW1zXCIgY2xhc3M9XCJiYnQtY2hpcC10b29sdGlwLWl0ZW1cIj57eyBvdiB9fTwvc3Bhbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJlY2hvLWNvbnRlbnRcIj5cblxuICAgIDwhLS0g4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQIENPTlZFUlNBVElPTlMgVEFCIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudFBhZ2UgPT09ICdjb252ZXJzYXRpb25zJ1wiPlxuXG4gICAgICA8IS0tIFRhbmdvIEFJIEhlYWRlciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1haS1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhbmdvLWFpLWxvZ29cIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjZcIiBoZWlnaHQ9XCIyNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiNmZmZcIiBzdHJva2Utd2lkdGg9XCIxLjhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PHBhdGggZD1cIk0xMiAybDIuMDkgNi4yNkwyMCAxMGwtNS45MSAxLjc0TDEyIDE4bC0yLjA5LTYuMjZMNCAxMGw1LjkxLTEuNzRMMTIgMnpcIi8+PC9zdmc+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGFuZ28tYWktaGVhZGVyLXRleHRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFuZ28tYWktdGl0bGVcIj5UYW5nbyBBSTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YW5nby1haS1zdWJ0aXRsZVwiPkFuYWx5c2UgY29udmVyc2F0aW9ucywgc3RvcmVzICYgc3RhZmYgcGVyZm9ybWFuY2U8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBTZWFyY2ggQ2FyZCAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLXNlYXJjaC1jYXJkXCI+XG4gICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZWNoby1zZWFyY2gtaW5wdXRcIiBwbGFjZWhvbGRlcj1cIkFzayBhbnl0aGluZy4uLiAnV2hpY2ggc3RvcmVzIGFyZSBub3QgcGVyZm9ybWluZyB3ZWxsPydcIiBbKG5nTW9kZWwpXT1cImNvbnZTZWFyY2hRdWVyeVwiIChrZXl1cC5lbnRlcik9XCJzZW5kQ29udlF1ZXJ5KClcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImVjaG8tc2VhcmNoLXNlbmRcIiAoY2xpY2spPVwic2VuZENvbnZRdWVyeSgpXCIgW2Rpc2FibGVkXT1cIiFjb252U2VhcmNoUXVlcnk/LnRyaW0oKVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiPlxuICAgICAgICAgICAgPGxpbmUgeDE9XCIyMlwiIHkxPVwiMlwiIHgyPVwiMTFcIiB5Mj1cIjEzXCI+PC9saW5lPlxuICAgICAgICAgICAgPHBvbHlnb24gcG9pbnRzPVwiMjIgMiAxNSAyMiAxMSAxMyAyIDkgMjIgMlwiPjwvcG9seWdvbj5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBBSSBSZXNwb25zZSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLWFpLXJlc3BvbnNlXCIgKm5nSWY9XCJjb252QWlMb2FkaW5nIHx8IGNvbnZBaVJlcGx5XCI+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb252QWlMb2FkaW5nXCIgY2xhc3M9XCJ0eXBpbmdcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInR5cGluZy1kb3RcIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJ0eXBpbmctZG90XCI+PC9zcGFuPjxzcGFuIGNsYXNzPVwidHlwaW5nLWRvdFwiPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwICpuZ0lmPVwiIWNvbnZBaUxvYWRpbmcgJiYgY29udkFpUmVwbHlcIiBjbGFzcz1cImVjaG8tYWktdGV4dFwiPnt7IGNvbnZBaVJlcGx5IH19PC9wPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gVG90YWwgY291bnQgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZWNoby1jb252LWNvdW50XCI+e3sgY29udlRvdGFsIH19IENvbnZlcnNhdGlvbnM8L2Rpdj5cblxuICAgICAgPCEtLSBDb252ZXJzYXRpb25zIGxpc3QgYXJlYSAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb252ZXJzYXRpb25zLXNlY3Rpb25cIj5cblxuICAgICAgPCEtLSBMb2FkaW5nIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cImNvbnZMb2FkaW5nXCIgY2xhc3M9XCJlY2hvLWVtcHR5LXN0YXRlXCI+TG9hZGluZyBjb252ZXJzYXRpb25zLi4uPC9kaXY+XG5cbiAgICAgIDwhLS0gQ29udmVyc2F0aW9uIGNhcmRzIChkeW5hbWljIGZyb20gQVBJIOKAlCBzYW1lIHBhdHRlcm4gYXMgdHJhbnNjcmlwdC1saXN0KSAtLT5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbnYgb2YgY29udmVyc2F0aW9uczsgdHJhY2tCeTogdHJhY2tCeUlkXCIgY2xhc3M9XCJjb252LWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnYtaGVhZGVyXCIgKGNsaWNrKT1cInRvZ2dsZUNvbnZFeHBhbmQoY29udi5hdWRpb0lkKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb252LWhlYWRlci1ib2R5XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi1tZXRhLXJvd1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnYtaWRcIj57eyBjb252LmF1ZGlvSWQgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0YS10YWcgYnJhbmRcIiAqbmdJZj1cImNvbnYuc3RvcmVOYW1lXCI+e3sgY29udi5zdG9yZU5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0YS10YWdcIiAqbmdJZj1cImNvbnYubG9jYXRpb25cIj57eyBjb252LmxvY2F0aW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldGEtdGFnXCIgKm5nSWY9XCJjb252LnVzZXJOYW1lXCI+e3sgY29udi51c2VyTmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRhLXRhZ1wiICpuZ0lmPVwiY29udi5kYXRlXCI+e3sgY29udi5kYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldGEtdGFnIG1ldGEtdGFnLS1kdXJhdGlvblwiICpuZ0lmPVwiY29udi5kdXJhdGlvblwiPnt7IGNvbnYuZHVyYXRpb24gfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb252LWRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgIHt7IGNvbnYuYXVkaW9EZXNjcmlwdGlvbiB8fCAnTm8gZGVzY3JpcHRpb24gYXZhaWxhYmxlJyB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnYtY2hldnJvblwiIFtjbGFzcy5vcGVuXT1cImV4cGFuZGVkQ29udklkc1tjb252LmF1ZGlvSWRdXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiM5NEEzQjhcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PHBhdGggZD1cIk02IDlsNiA2IDYtNlwiLz48L3N2Zz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBFeHBhbmRlZCBib2R5ICh1bmlmaWVkIGxheW91dCBtYXRjaGluZyBBZ2VudCBBbmFseXNpcyBkZXNpZ24pIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiZXhwYW5kZWRDb252SWRzW2NvbnYuYXVkaW9JZF1cIiBjbGFzcz1cImNvbnYtYm9keS1leHBhbmRlZFwiPlxuXG4gICAgICAgICAgPCEtLSBXYXZlZm9ybSBwbGF5ZXIgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tcGxheWVyXCIgKm5nSWY9XCJjb252LmF1ZGlvVXJsXCI+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZWNoby1wbGF5LWJ0blwiIFtjbGFzcy5wbGF5aW5nXT1cInBsYXlpbmdDb252SWQgPT09IGNvbnYuYXVkaW9JZFwiIChjbGljayk9XCJ0b2dnbGVQbGF5KGNvbnYuYXVkaW9JZClcIj5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInBsYXlpbmdDb252SWQgIT09IGNvbnYuYXVkaW9JZFwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj48cGF0aCBkPVwiTTggNXYxNGwxMS03elwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInBsYXlpbmdDb252SWQgPT09IGNvbnYuYXVkaW9JZFwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj48cGF0aCBkPVwiTTYgMTloNFY1SDZ2MTR6bTgtMTR2MTRoNFY1aC00elwiLz48L3N2Zz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8td2F2ZWZvcm1cIiBbY2xhc3Mud2YtcGxheWluZ109XCJwbGF5aW5nQ29udklkID09PSBjb252LmF1ZGlvSWRcIiAoY2xpY2spPVwic2Vla0F1ZGlvKCRldmVudCwgY29udi5hdWRpb0lkKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby13Zi1iYXJcIiAqbmdGb3I9XCJsZXQgaCBvZiB3YXZlZm9ybUhlaWdodHM7IGxldCBpID0gaW5kZXhcIiBbc3R5bGUuaGVpZ2h0LnB4XT1cImhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5wbGF5ZWRdPVwiKHBsYXliYWNrU3RhdGVzW2NvbnYuYXVkaW9JZF0/LnByb2dyZXNzIHx8IDApID4gaSAvIHdhdmVmb3JtSGVpZ2h0cy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZWNoby10aW1lXCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGxheWluZ0NvbnZJZCA9PT0gY29udi5hdWRpb0lkICYmIHBsYXliYWNrU3RhdGVzW2NvbnYuYXVkaW9JZF0/LmN1cnJlbnRUaW1lXCI+e3sgcGxheWJhY2tTdGF0ZXNbY29udi5hdWRpb0lkXS5jdXJyZW50VGltZSB9fSAvIDwvc3Bhbj57eyBwbGF5YmFja1N0YXRlc1tjb252LmF1ZGlvSWRdPy50b3RhbFRpbWUgfHwgY29udi5kdXJhdGlvbiB8fCAnLS0nIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8YXVkaW8gW2lkXT1cIidhdWRpby0nICsgY29udi5hdWRpb0lkXCIgW3NyY109XCJjb252LmF1ZGlvVXJsXCIgcHJlbG9hZD1cImF1dG9cIlxuICAgICAgICAgICAgICAodGltZXVwZGF0ZSk9XCJvblRpbWVVcGRhdGUoYXVkaW9FbCwgY29udi5hdWRpb0lkKVwiXG4gICAgICAgICAgICAgIChsb2FkZWRtZXRhZGF0YSk9XCJvbkxvYWRlZE1ldGFkYXRhKGF1ZGlvRWwsIGNvbnYuYXVkaW9JZCwgY29udi5kdXJhdGlvbilcIlxuICAgICAgICAgICAgICAoZW5kZWQpPVwicGxheWluZ0NvbnZJZCA9IG51bGxcIiAjYXVkaW9FbD48L2F1ZGlvPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBTdW1tYXJ5IENvbnRlbnQgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnYtYm9keS1wYWRkaW5nXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cInN1bW1hcnktdGV4dFwiPnt7IGNvbnYuYXVkaW9EZXNjcmlwdGlvbiB8fCBjb252LmNvbnZlcnNhdGlvbkRldGFpbHM/LmF1ZGlvU3VtbWFyeSB8fCAnTm8gc3VtbWFyeSBhdmFpbGFibGUnIH19PC9wPlxuICAgICAgICAgICAgPCEtLSBBSSBJbnNpZ2h0cyAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb252LmFpSW5zaWdodHM/LnN1bW1hcnk/Lmxlbmd0aFwiIGNsYXNzPVwiYWktaW5zaWdodHMtc2VjdGlvblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktaW5zaWdodHMtbGFiZWxcIj5BSSBJbnNpZ2h0czwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBpbnNpZ2h0IG9mIGNvbnYuYWlJbnNpZ2h0cy5zdW1tYXJ5XCIgY2xhc3M9XCJhaS1pbnNpZ2h0LXJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1pbnNpZ2h0LWRvdFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImluc2lnaHQudHlwZSA9PT0gJ3Bvc2l0aXZlJyA/ICcjMDBBM0ZGJyA6IGluc2lnaHQudHlwZSA9PT0gJ25lZ2F0aXZlJyA/ICcjRUY0NDQ0JyA6ICcjRjU5RTBCJ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktaW5zaWdodC10ZXh0XCI+e3sgaW5zaWdodC50ZXh0IHx8IGluc2lnaHQgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gTm8gZGF0YSAtLT5cbiAgICAgIDxkaXYgKm5nSWY9XCIhY29udkxvYWRpbmcgJiYgY29udmVyc2F0aW9ucy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImVjaG8tZW1wdHktc3RhdGUtLXNtXCI+Tm8gY29udmVyc2F0aW9ucyBmb3VuZC48L2Rpdj5cblxuICAgICAgPCEtLSBQYWdpbmF0aW9uIC0tPlxuICAgICAgPGxpYi1wYWdpbmF0aW9uICpuZ0lmPVwiY29udlRvdGFsID4gMFwiIFtpdGVtc1BlclBhZ2VdPVwiY29udlBlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwiY29udlBhZ2VcIiBbdG90YWxJdGVtc109XCJjb252VG90YWxcIlxuICAgICAgICBbcGFnaW5hdGlvblNpemVzXT1cImNvbnZQYWdpbmF0aW9uU2l6ZXNcIiBbcGFnZVNpemVdPVwiY29udlBlclBhZ2VcIiAocGFnZUNoYW5nZSk9XCJvbkNvbnZQYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25Db252UGFnZVNpemVDaGFuZ2UoJGV2ZW50KVwiPjwvbGliLXBhZ2luYXRpb24+XG4gICAgICA8L2Rpdj4gPCEtLSBlbmQgY29udmVyc2F0aW9ucy1zZWN0aW9uIC0tPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgQUdFTlQgQU5BTFlTSVMgVEFCIOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkCAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudFBhZ2UgPT09ICdhZ2VudGFuYWx5c2lzJ1wiPlxuXG4gICAgICA8IS0tIOKUgOKUgCBPVkVSVklFVzogQWdlbnQgQ2FyZHMgR3JpZCDilIDilIAgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWRldGFpbFZpZXdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFuYWx5dGljcy1vdmVydmlldy1oZWFkZXJcIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuYWx5dGljcy1vdmVydmlldy10aXRsZVwiPkFuYWx5dGljcyBPdmVydmlldzwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuYWx5dGljcy1vdmVydmlldy1zdWJ0aXRsZVwiPnt7IGFjdGl2ZUNvaG9ydHMubGVuZ3RoIH19IGFjdGl2ZSBhZ2VudHM8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZsZXgtc3BhY2VyXCI+PC9zcGFuPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLXNlYXJjaC13cmFwXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiM5OEEyQjNcIiBzdHJva2Utd2lkdGg9XCIxLjhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI3LjVcIi8+PHBhdGggZD1cIk0xNi41IDE2LjVMMjEgMjFcIi8+PC9zdmc+XG4gICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJhbmFseXNpc1NlYXJjaFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGFnZW50c+KAplwiIGNsYXNzPVwiZWNoby1pbmxpbmUtaW5wdXRcIj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNvaG9ydExpc3QubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJlY2hvLWVtcHR5LXN0YXRlLS1tdXRlZFwiPkxvYWRpbmcgYWdlbnRzLi4uPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFuYWx5dGljcy1ncmlkXCIgW3N0eWxlLmdyaWQtdGVtcGxhdGUtY29sdW1uc109XCIncmVwZWF0KCcgKyBNYXRoLm1pbihjb2hvcnRMaXN0Lmxlbmd0aCwgNCkgKyAnLCAxZnIpJ1wiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvaG9ydCBvZiBjb2hvcnRMaXN0OyB0cmFja0J5OiB0cmFja0J5SWRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXRpY3MtY2FyZFwiICpuZ0lmPVwiIWFuYWx5c2lzU2VhcmNoIHx8IChjb2hvcnQuY29ob3J0TmFtZSB8fCBjb2hvcnQubmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhhbmFseXNpc1NlYXJjaC50b0xvd2VyQ2FzZSgpKVwiIChjbGljayk9XCJzZWxlY3RDb2hvcnREZXRhaWwoY29ob3J0KVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLWNhcmQtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFuYWx5dGljcy1jYXJkLXRvcC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXRpY3MtY2FyZC1uYW1lXCI+e3sgY29ob3J0LmNvaG9ydE5hbWUgfHwgY29ob3J0Lm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYW5hbHl0aWNzLWNhcmQtYmFkZ2UtYWN0aXZlXCI+QWN0aXZlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gbWV0cmljcyAmIHN0b3JlcyBiYWRnZXMgaGlkZGVuIGZvciBub3cgLS0+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW5hbHl0aWNzLWNhcmQtc3BhY2VyXCI+PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhbmFseXRpY3MtY2FyZC1mb290ZXJcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImFuYWx5dGljcy1ob3Zlci1saW5rXCI+VmlldyBhbmFseXRpY3Mg4oaSPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIOKUgOKUgCBERVRBSUw6IFNlbGVjdGVkIENvaG9ydCBNZXRyaWNzICsgQ29udmVyc2F0aW9ucyDilIDilIAgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZGV0YWlsVmlld1wiPlxuXG4gICAgICAgIDwhLS0gSGVhZGVyOiDihpAgQmFjayArIFRpdGxlICsgQ29udmVyc2F0aW9ucyArIERyb3Bkb3duIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLWhlYWRlci1iYXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiZGV0YWlsLWJhY2stYnRuXCIgKGNsaWNrKT1cImJhY2tUb092ZXJ2aWV3KClcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi41XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxwYXRoIGQ9XCJNMTUgMThsLTYtNiA2LTZcIi8+PC9zdmc+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtaGVhZGVyLXRpdGxlXCI+e3sgc2VsZWN0ZWRDb2hvcnROYW1lIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC1zcGFjZXJcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtaGVhZGVyLWNvbnYtY291bnRcIj5Ub3RhbCBDb252ZXJzYXRpb25zOiB7eyB0b3RhbEF1ZGlvIH19PC9zcGFuPlxuXG4gICAgICAgICAgPCEtLSBDb2hvcnQgRHJvcGRvd24gLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWRyb3Bkb3duLXdyYXBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1kcm9wZG93bi10cmlnZ2VyXCIgKGNsaWNrKT1cInRvZ2dsZUNvaG9ydERyb3Bkb3duKClcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvaG9ydC1kZC1kb3RcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb2hvcnQtZGQtdHJpZ2dlci1uYW1lXCI+e3sgc2VsZWN0ZWRDb2hvcnROYW1lIHx8ICdTZWxlY3QgQWdlbnQnIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiM2NjcwODVcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgW3N0eWxlLnRyYW5zZm9ybV09XCJjb2hvcnREcm9wZG93bk9wZW4gPyAncm90YXRlKDE4MGRlZyknIDogJ25vbmUnXCI+PHBhdGggZD1cIk02IDlsNiA2IDYtNlwiLz48L3N2Zz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWRyb3Bkb3duLW1lbnVcIiAqbmdJZj1cImNvaG9ydERyb3Bkb3duT3BlblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29ob3J0LWRkLXNlYXJjaC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvaG9ydC1kZC1zZWFyY2gtaW5uZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxM1wiIGhlaWdodD1cIjEzXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjcuNVwiLz48cGF0aCBkPVwiTTE2LjUgMTYuNUwyMSAyMVwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT1cImNvaG9ydERyb3Bkb3duU2VhcmNoXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggYWdlbnRz4oCmXCIgY2xhc3M9XCJlY2hvLWlubGluZS1pbnB1dC0tc21hbGxcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2hvcnQtZGQtc2Nyb2xsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgYyBvZiBmaWx0ZXJlZERyb3Bkb3duQ29ob3J0czsgdHJhY2tCeTogdHJhY2tCeUlkXCIgY2xhc3M9XCJhZ2VudC1kZC1pdGVtXCIgW2NsYXNzLnNlbGVjdGVkXT1cIihjLmNvaG9ydElkIHx8IGMuaWQgfHwgYy5faWQpID09PSBzZWxlY3RlZENvaG9ydElkXCIgKGNsaWNrKT1cInNlbGVjdENvaG9ydEZyb21Ecm9wZG93bihjKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvaG9ydC1kZC1pdGVtLWRvdFwiIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImMubWV0cmljc0FkZGVkID4gMCA/ICcjMTBCOTgxJyA6ICcjRDBENUREJ1wiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvaG9ydC1kZC1pdGVtLWJvZHlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWRkLW5hbWVcIj57eyBjLmNvaG9ydE5hbWUgfHwgYy5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1kZC1tZXRhXCI+e3sgYy5tZXRyaWNzQWRkZWQgfHwgMCB9fSBtZXRyaWNzPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCIoYy5jb2hvcnRJZCB8fCBjLmlkIHx8IGMuX2lkKSA9PT0gc2VsZWN0ZWRDb2hvcnRJZFwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiMwMEEzRkZcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PHBhdGggZD1cIk0yMCA2TDkgMTdsLTUtNVwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsdGVyZWREcm9wZG93bkNvaG9ydHMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJjb2hvcnQtZGQtbm8tcmVzdWx0c1wiPk5vIGFnZW50cyBmb3VuZDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvaG9ydERyb3Bkb3duT3BlblwiIGNsYXNzPVwiY29ob3J0LWRkLWJhY2tkcm9wXCIgKGNsaWNrKT1cImNsb3NlQ29ob3J0RHJvcGRvd24oKVwiPjwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIExvYWRpbmcgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJjYXJkc0xvYWRpbmdcIiBjbGFzcz1cImVjaG8tZW1wdHktc3RhdGUtLW11dGVkXCI+TG9hZGluZyBtZXRyaWNzLi4uPC9kaXY+XG5cbiAgICAgICAgPCEtLSBOdW1lcmljIHNjb3JlcyDigJQgZnVsbC13aWR0aCBzdGF0IHN0cmlwIGFib3ZlIGNhcmRzIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNhcmRzTG9hZGluZyAmJiBudW1lcmljU3RyaXBDYXJkPy5udW1lcmljUm93cz8ubGVuZ3RoXCIgY2xhc3M9XCJudW1lcmljLXN0YXQtc3RyaXBcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgbnVtZXJpY1N0cmlwQ2FyZC5udW1lcmljUm93czsgbGV0IGkgPSBpbmRleFwiXG4gICAgICAgICAgICAgICBjbGFzcz1cIm51bWVyaWMtc3RhdC10aWxlXCJcbiAgICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXItbGVmdC1jb2xvcl09XCJnZXROdW1lcmljVGlsZUNvbG9yKGkpXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibnVtZXJpYy1zdGF0LWxhYmVsXCI+e3sgcm93Lm5hbWUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJudW1lcmljLXN0YXQtdmFsdWVcIiBbc3R5bGUuY29sb3JdPVwiZ2V0TnVtZXJpY1RpbGVDb2xvcihpKVwiPlxuICAgICAgICAgICAgICB7eyByb3cuYXZnIH19PHNwYW4gKm5nSWY9XCJyb3cubWF4ICE9PSBudWxsXCIgY2xhc3M9XCJudW1lcmljLXN0YXQtbWF4XCI+L3t7IHJvdy5tYXggfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJudW1lcmljLXN0YXQtc3ViXCIgKm5nSWY9XCJyb3cubWF4ICE9PSBudWxsICYmIHJvdy5taW4gIT09IG51bGxcIj5cbiAgICAgICAgICAgICAgc2NhbGUge3sgcm93Lm1pbiB9feKAk3t7IHJvdy5tYXggfX17eyByb3cuZGVzY3JpcHRpb24gPyAnIMK3ICcgKyByb3cuZGVzY3JpcHRpb24gOiAnJyB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTWV0cmljIENhcmRzIChkeW5hbWljIGNvbHVtbnMgYmFzZWQgb24gY2FyZCBjb3VudCkgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhY2FyZHNMb2FkaW5nICYmIG5vbk51bWVyaWNDYXJkcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJtZXRyaWMtY2FyZHMtZHluYW1pY1wiXG4gICAgICAgICAgW3N0eWxlLmdyaWQtdGVtcGxhdGUtY29sdW1uc109XCIncmVwZWF0KCcgKyBNYXRoLm1pbihub25OdW1lcmljQ2FyZHMubGVuZ3RoLCA0KSArICcsIDFmciknXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY2FyZCBvZiBub25OdW1lcmljQ2FyZHM7IHRyYWNrQnk6IHRyYWNrQnlJZFwiIGNsYXNzPVwibWV0cmljLWNhcmQtZHluYW1pY1wiXG4gICAgICAgICAgICAgICBbY2xhc3MubWV0cmljLWNhcmQtZHluYW1pYy0td2lkZV09XCJjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVF9CQVInIHx8IGNhcmQudHlwZSA9PT0gJ0JPT0xFQU5fQkFTS0VUX1RBQkxFJ1wiPlxuICAgICAgICAgICAgPCEtLSBDYXJkIEhlYWRlcjogVGl0bGUgKyBTdGF0dXMgQmFkZ2UgKyBJbmZvIC0tPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1jYXJkLWhlYWRlci1yb3dcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1jYXJkLXRpdGxlXCI+e3sgY2FyZC5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtY2FyZC1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjYXJkLnN0YXR1c1wiIGNsYXNzPVwibWV0cmljLXN0YXR1cy1iYWRnZVwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJnZXRTdGF0dXNCYWRnZShjYXJkLnN0YXR1cykuYmdcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cImdldFN0YXR1c0JhZGdlKGNhcmQuc3RhdHVzKS5jb2xvclwiPnt7IGNhcmQuc3RhdHVzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWV0cmljLWV4cG9ydC1idG5cIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVF9UQUJMRSdcIlxuICAgICAgICAgICAgICAgICAgdGl0bGU9XCJFeHBvcnQgdG8gRXhjZWxcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImV4cG9ydEJidENhcmQoY2FyZClcIj48c3Bhbj5FeHBvcnQ8L3NwYW4+IFxuICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk0yMSAxNXY0YTIgMiAwIDAgMS0yIDJINWEyIDIgMCAwIDEtMi0ydi00XCIvPjxwb2x5bGluZSBwb2ludHM9XCI3IDEwIDEyIDE1IDE3IDEwXCIvPjxsaW5lIHgxPVwiMTJcIiB5MT1cIjE1XCIgeDI9XCIxMlwiIHkyPVwiM1wiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWluZm8taWNvblwiICpuZ0lmPVwiY2FyZC5kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiPjxjaXJjbGUgY3g9XCIxMlwiIGN5PVwiMTJcIiByPVwiMTBcIi8+PGxpbmUgeDE9XCIxMlwiIHkxPVwiMTZcIiB4Mj1cIjEyXCIgeTI9XCIxMlwiLz48bGluZSB4MT1cIjEyXCIgeTE9XCI4XCIgeDI9XCIxMi4wMVwiIHkyPVwiOFwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtaW5mby10b29sdGlwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+e3sgY2FyZC5kZXNjcmlwdGlvbiB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWNhcmQtc3VidGl0bGVcIiAqbmdJZj1cImNhcmQudHlwZSAhPT0gJ05VTUVSSUNfU0NBTEFSJyAmJiBjYXJkLnR5cGUgIT09ICdOVU1FUklDX0FSUkFZJ1wiPnt7IGNhcmQuYXBwbGljYWJsZUNvdW50ID8/IHRvdGFsQXVkaW8gfX0gY29udmVyc2F0aW9uczwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgPCEtLSBCT09MRUFOX0JBU0tFVF9UQUJMRSDigJQgYnJhbmQgcm93cyB3aXRoIGF0dHJpYnV0ZSBjaGlwcyArIGNvdW50IC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcmQudHlwZSA9PT0gJ0JPT0xFQU5fQkFTS0VUX1RBQkxFJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJ0LXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgY2FyZC50YWJsZVJvd3NcIiBjbGFzcz1cImJidC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYnQtYnJhbmRcIiBbdGl0bGVdPVwicm93LmJyYW5kXCI+e3sgcm93LmJyYW5kIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJ0LWNoaXBzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBjaGlwIG9mIHJvdy52aXNpYmxlQ2hpcHNcIiBjbGFzcz1cImJidC1jaGlwXCI+e3sgY2hpcCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJyb3cub3ZlcmZsb3dDb3VudCA+IDBcIiBjbGFzcz1cImJidC1jaGlwIGJidC1jaGlwLS1tb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwic2hvd0JidFRvb2x0aXAoJGV2ZW50LCByb3cub3ZlcmZsb3dDaGlwcylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJoaWRlQmJ0VG9vbHRpcCgpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgK3t7IHJvdy5vdmVyZmxvd0NvdW50IH19XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJidC1jb3VudFwiPnt7IHJvdy5jb3VudCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIEJPT0xFQU5fQkFTS0VUX0JBUiDigJQgY2F0ZWdvcnkgbGlzdCArIHBpZSBjaGFydCArIGxlZ2VuZCAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJkLnR5cGUgPT09ICdCT09MRUFOX0JBU0tFVF9CQVInXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmItd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmItbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc2xpY2Ugb2YgY2FyZC5waWVTbGljZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJiYi1saXN0LXJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iYmItbGlzdC1yb3ctLWFjdGl2ZV09XCJjYXJkLnNlbGVjdGVkUGllTGFiZWwgPT09IHNsaWNlLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFBpZVNsaWNlKGNhcmQsIHNsaWNlKVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJiYi1saXN0LWxhYmVsXCIgW3RpdGxlXT1cInNsaWNlLmxhYmVsXCI+e3sgc2xpY2UubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJiLXBpZS1jb2xcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmItcGllLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImJiYi1waWVcIiB2aWV3Qm94PVwiMCAwIDEwMCAxMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCAqbmdGb3I9XCJsZXQgc2xpY2Ugb2YgY2FyZC5waWVTbGljZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmRdPVwic2xpY2UucGF0aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuZmlsbF09XCJzbGljZS5jb2xvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPVwiI2ZmZmZmZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLXdpZHRoPVwiMC44XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmJiLXBpZS1zbGljZS0tYWN0aXZlXT1cImNhcmQuc2VsZWN0ZWRQaWVMYWJlbCA9PT0gc2xpY2UubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQaWVTbGljZShjYXJkLCBzbGljZSlcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYi1sZWdlbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc2xpY2Ugb2YgY2FyZC5waWVTbGljZXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYmJiLWxlZ2VuZC1yb3dcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iYmItbGVnZW5kLXJvdy0tYWN0aXZlXT1cImNhcmQuc2VsZWN0ZWRQaWVMYWJlbCA9PT0gc2xpY2UubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RQaWVTbGljZShjYXJkLCBzbGljZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJiYi1sZWdlbmQtZG90XCIgW3N0eWxlLmJhY2tncm91bmRdPVwic2xpY2UuY29sb3JcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYmItbGVnZW5kLWxhYmVsXCI+e3sgc2xpY2UubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYmItbGVnZW5kLXBjdFwiPnt7IHNsaWNlLnBlcmNlbnQgfX0lPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLSBCb29sZWFuX2Jhc2tldF9jaGFydCDigJQga2V5d29yZCBsaXN0ICsgc2VudGltZW50IGRvbnV0IC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcmQudHlwZSA9PT0gJ0JPT0xFQU5fQkFTS0VUX0NIQVJUJ1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJjLXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJjLWtleXdvcmQtbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGNhcmQua2V5d29yZFJvd3NcIlxuICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJiYy1rZXl3b3JkLXJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5iYmMta2V5d29yZC1yb3ctLWFjdGl2ZV09XCJjYXJkLnNlbGVjdGVkS2V5d29yZCA9PT0gcm93LmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEJhc2tldEtleXdvcmQoY2FyZCwgcm93KVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJiYy1rZXl3b3JkLWxhYmVsXCIgW3RpdGxlXT1cInJvdy5sYWJlbFwiPnt7IHJvdy5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYmMta2V5d29yZC1jb3VudFwiPnt7IHJvdy5jb3VudCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmMtY2hhcnQtc2lkZVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYy1iYXItbGlzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBzbGljZSBvZiBjYXJkLnNlbGVjdGVkU2xpY2VzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJiYy1iYXItcm93XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYmJjLWJhci1yb3ctLWFjdGl2ZV09XCJjYXJkLnNlbGVjdGVkU2VudGltZW50Py5rZXkgPT09IHNsaWNlLmtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEJhc2tldFNlbnRpbWVudChjYXJkLCBzbGljZSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmJjLWJhci1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmJjLWJhci1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJiYy1iYXItZG90XCIgW3N0eWxlLmJhY2tncm91bmRdPVwic2xpY2UuY29sb3JcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHNsaWNlLmxhYmVsIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJiYy1iYXItcGN0XCI+e3sgc2xpY2UucGVyY2VudCB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJiYy1iYXItdHJhY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYmMtYmFyLWZpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUud2lkdGguJV09XCJzbGljZS5wZXJjZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwic2xpY2UuY29sb3JcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLSBCT09MRUFOX0JBU0tFVCDigJQgRnVubmVsIENoYXJ0IChsZWZ0LWFsaWduZWQpIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcmQudHlwZSA9PT0gJ0JPT0xFQU5fQkFTS0VUJyAmJiBjYXJkLmlzRnVubmVsXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmdW5uZWwtY2hhcnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgY2FyZC5ib29sZWFuUm93czsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZnVubmVsLXN0YWdlXCIgKGNsaWNrKT1cIm9uQ2FyZFJvd0NsaWNrKHJvdy5pZCwgcm93LmxhYmVsKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZ1bm5lbC1iYXJcIiBbdGl0bGVdPVwicm93LmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLiVdPVwiY2FyZC5ib29sZWFuUm93c1swXT8ucmVzcG9uc2VzID4gMCA/IChyb3cucmVzcG9uc2VzIC8gY2FyZC5ib29sZWFuUm93c1swXS5yZXNwb25zZXMgKiAxMDApIDogMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0U2NvcmVDb2xvcihyb3cuc2NvcmUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZnVubmVsLWxhYmVsLXdyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ1bm5lbC1sYWJlbFwiPnt7IHJvdy5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZ1bm5lbC12YWx1ZVwiPiA8c3BhbiBjbGFzcz1cImZ1bm5lbC12YWx1ZS1jb3VudFwiPnt7IHJvdy5yZXNwb25zZXMgfX08L3NwYW4+ICh7eyByb3cuc2NvcmUgfX0pJSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPCEtLSBCT09MRUFOX0JBU0tFVCDigJQgcm93cyB3aXRoIHByb2dyZXNzIGJhcnMgKG5vbi1mdW5uZWwpIC0tPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhcmQudHlwZSA9PT0gJ0JPT0xFQU5fQkFTS0VUJyAmJiAhY2FyZC5pc0Z1bm5lbFwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCByb3cgb2YgY2FyZC5ib29sZWFuUm93czsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwibWV0cmljLWJvb2wtcm93XCIgKGNsaWNrKT1cIm9uQ2FyZFJvd0NsaWNrKHJvdy5pZCwgcm93LmxhYmVsKVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtcm93LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtcm93LWRvdFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImdldFNjb3JlQ29sb3Iocm93LnNjb3JlKVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRyaWMtcm93LWxhYmVsXCIgW3RpdGxlXT1cInJvdy5sYWJlbFwiPnt7IHJvdy5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0cmljLXNjb3JlIG1ldHJpYy1zY29yZS0tdGVhbFwiPnt7IHJvdy5zY29yZSB9fSU8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldHJpYy1jb3VudFwiPnt7IHJvdy5yZXNwb25zZXMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1wcm9ncmVzcy10cmFja1wiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1wcm9ncmVzcy1maWxsXCIgW3N0eWxlLndpZHRoLiVdPVwicm93LnNjb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiZ2V0U2NvcmVDb2xvcihyb3cuc2NvcmUpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cblxuICAgICAgICAgICAgPCEtLSBVTklRVUVfUElUQ0hFUyDigJQgcGl0Y2gga2V5d29yZHMgdHJhY2tlciAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJkLnR5cGUgPT09ICdVTklRVUVfUElUQ0hFUydcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpdGNoLWtleXdvcmQtY291bnRcIj57eyBjYXJkLnBpdGNoUm93cz8ubGVuZ3RoIHx8IDAgfX0ga2V5d29yZHM8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBwaXRjaCBvZiBjYXJkLnBpdGNoUm93czsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwibWV0cmljLWJvb2wtcm93XCIgKGNsaWNrKT1cIm9uQ2FyZFJvd0NsaWNrKCcnLCBjYXJkLmtleSlcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtcm93LWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1yb3ctZG90XCJcbiAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJbJyMwMEEzRkYnLCcjMTBCOTgxJywnI0Y1OUUwQicsJyNFRjQ0NDQnLCcjOEI1Q0Y2JywnI0VDNDg5OScsJyMwNkI2RDQnLCcjODRDQzE2JywnI0Y5NzMxNicsJyM2MzY2RjEnXVtpICUgMTBdXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGl0Y2gtcm93LWxhYmVsXCI+e3sgcGl0Y2guaWQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicGl0Y2gtcm93LWRlc2NcIj57eyBwaXRjaC5kZXNjID8gcGl0Y2guZGVzYy5zbGljZSgwLCA2MCkgOiAn4oCTJyB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8IS0tIFNVQkpFQ1RJVkUgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FyZC50eXBlID09PSAnU1VCSkVDVElWRScgfHwgY2FyZC50eXBlID09PSAnU1VCSkVDVElWRV9DT1VOVCdcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1YmplY3RpdmUtd3JhcFwiIChjbGljayk9XCJvbkNhcmRSb3dDbGljaygnJywgY2FyZC5rZXkpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcm93IG9mIGNhcmQuc3ViamVjdGl2ZVJvd3M/LnNsaWNlKDAsIDIpXCIgY2xhc3M9XCJzdWJqZWN0aXZlLXJvd1wiPlxuICAgICAgICAgICAgICAgICAg4oCiIHt7IHJvdy5yZWFzb25pbmcgfHwgcm93LnN0b3JlX2lkIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2Rpdj48IS0tIGVuZCBtZXRyaWMtY2FyZC1jb250ZW50IC0tPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEZ1bGwgbm8tZGF0YSBzdGF0ZTogbm8gY2FyZHMgQU5EIG5vIGNvbnZlcnNhdGlvbnMgLS0+XG4gICAgICAgIDxkaXYgKm5nSWY9XCIhY2FyZHNMb2FkaW5nICYmICFkZXRhaWxMb2FkaW5nICYmIGNvaG9ydENhcmRzLmxlbmd0aCA9PT0gMCAmJiBkZXRhaWxQYWdlQ29udnMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJlY2hvLW5vZGF0YS1zdGF0ZVwiPlxuICAgICAgICAgIDxpbWcgc3JjPVwiLi9hc3NldHMvdGFuZ28vSWNvbnMvTm9kYXRhMS5zdmdcIiBhbHQ9XCJObyBkYXRhXCIgY2xhc3M9XCJlY2hvLW5vZGF0YS1pbWdcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZWNoby1ub2RhdGEtdGl0bGVcIj5ObyBkYXRhIGZvdW5kPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tbm9kYXRhLXN1YlwiPk5vIGFuYWx5c2lzIGRhdGEgb3IgY29udmVyc2F0aW9ucyBhdmFpbGFibGUgZm9yIHRoZSBzZWxlY3RlZCBkYXRlIHJhbmdlIGFuZCBzdG9yZXMuPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0g4pSA4pSAIENvbnZlcnNhdGlvbnMgU2VjdGlvbiAoc2hvdyB3aGVuIGNhcmRzIGV4aXN0IE9SIGNvbnZlcnNhdGlvbnMgZXhpc3QgT1IgbG9hZGluZykg4pSA4pSAIC0tPlxuICAgICAgICA8ZGl2IGlkPVwiZWNob0NvbnZlcnNhdGlvbnNcIiBjbGFzcz1cImNvbnZlcnNhdGlvbnMtc2VjdGlvblwiICpuZ0lmPVwiY2FyZHNMb2FkaW5nIHx8IGRldGFpbExvYWRpbmcgfHwgY29ob3J0Q2FyZHMubGVuZ3RoID4gMCB8fCBkZXRhaWxQYWdlQ29udnMubGVuZ3RoID4gMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtY29udi1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIjMzQ0MDU0XCIgc3Ryb2tlLXdpZHRoPVwiMS44XCI+PHBhdGggZD1cIk0yMCAySDRhMiAyIDAgMCAwLTIgMnYxM2EyIDIgMCAwIDAgMiAyaDExbDUgM1Y0YTIgMiAwIDAgMC0yLTJ6XCIvPjwvc3ZnPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtY29udi1zZWN0aW9uLXRpdGxlXCI+Q29udmVyc2F0aW9uczwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleC1zcGFjZXJcIj48L3NwYW4+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLWNvbnYtc2VhcmNoXCI+XG4gICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiIzk4QTJCM1wiIHN0cm9rZS13aWR0aD1cIjEuOFwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48Y2lyY2xlIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjcuNVwiLz48cGF0aCBkPVwiTTE2LjUgMTYuNUwyMSAyMVwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlsLWNvbnYtc2VhcmNoLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGNvbnZlcnNhdGlvbnMuLi5cIlxuICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJkZXRhaWxTZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwib25EZXRhaWxTZWFyY2goKVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlsLWNvbnYtc2VhcmNoLWNsZWFyXCJcbiAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImRldGFpbFNlYXJjaFZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xlYXJEZXRhaWxTZWFyY2goKVwiXG4gICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJDbGVhclwiPlxuICAgICAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxMlwiIGhlaWdodD1cIjEyXCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIj48bGluZSB4MT1cIjE4XCIgeTE9XCI2XCIgeDI9XCI2XCIgeTI9XCIxOFwiLz48bGluZSB4MT1cIjZcIiB5MT1cIjZcIiB4Mj1cIjE4XCIgeTI9XCIxOFwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJkZXRhaWxMb2FkaW5nXCIgY2xhc3M9XCJlY2hvLWVtcHR5LXN0YXRlLS1tdXRlZFwiPkxvYWRpbmcuLi48L2Rpdj5cblxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGNvbnYgb2YgZGV0YWlsUGFnZUNvbnZzOyB0cmFja0J5OiB0cmFja0J5SWRcIiBjbGFzcz1cImRldGFpbC1jb252LWNhcmRcIj5cbiAgICAgICAgICAgIDwhLS0gQ29udiBoZWFkZXIgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi1oZWFkZXJcIiAoY2xpY2spPVwidG9nZ2xlRGV0YWlsQ29udihjb252LmF1ZGlvSWQpOyBsb2FkQ29udkRldGFpbChjb252KVwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvbnYtaWRcIj57eyBjb252LmF1ZGlvSWQgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtbWV0YS1yb3dcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldGEtdGFnIGJyYW5kXCIgKm5nSWY9XCJjb252LnN0b3JlTmFtZVwiPnt7IGNvbnYuc3RvcmVOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0YS10YWdcIiAqbmdJZj1cImNvbnYubG9jYXRpb25cIj57eyBjb252LmxvY2F0aW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0YS10YWdcIiAqbmdJZj1cImNvbnYuZGF0ZVwiPnt7IGNvbnYuZGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldGEtdGFnXCIgKm5nSWY9XCJjb252LnRpbWVcIj57eyBjb252LnRpbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi1jaGV2cm9uXCIgW2NsYXNzLm9wZW5dPVwiZGV0YWlsT3BlbklkID09PSBjb252LmF1ZGlvSWRcIj5cbiAgICAgICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiM5NEEzQjhcIiBzdHJva2Utd2lkdGg9XCIyLjVcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PHBhdGggZD1cIk02IDlsNiA2IDYtNlwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBFeHBhbmRlZCBib2R5IC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRldGFpbE9wZW5JZCA9PT0gY29udi5hdWRpb0lkXCIgY2xhc3M9XCJjb252LWJvZHktZXhwYW5kZWRcIj5cbiAgICAgICAgICAgICAgPCEtLSBXYXZlZm9ybSBwbGF5ZXIgLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLXBsYXllclwiICpuZ0lmPVwiY29udi5hdWRpb1VybFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJlY2hvLXBsYXktYnRuXCIgW2NsYXNzLnBsYXlpbmddPVwicGxheWluZ0NvbnZJZCA9PT0gY29udi5hdWRpb0lkXCIgKGNsaWNrKT1cInRvZ2dsZVBsYXkoY29udi5hdWRpb0lkKVwiPlxuICAgICAgICAgICAgICAgICAgPHN2ZyAqbmdJZj1cInBsYXlpbmdDb252SWQgIT09IGNvbnYuYXVkaW9JZFwiIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwid2hpdGVcIj48cGF0aCBkPVwiTTggNXYxNGwxMS03elwiLz48L3N2Zz5cbiAgICAgICAgICAgICAgICAgIDxzdmcgKm5nSWY9XCJwbGF5aW5nQ29udklkID09PSBjb252LmF1ZGlvSWRcIiB3aWR0aD1cIjE0XCIgaGVpZ2h0PVwiMTRcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIndoaXRlXCI+PHBhdGggZD1cIk02IDE5aDRWNUg2djE0em04LTE0djE0aDRWNWgtNHpcIi8+PC9zdmc+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8td2F2ZWZvcm1cIiBbY2xhc3Mud2YtcGxheWluZ109XCJwbGF5aW5nQ29udklkID09PSBjb252LmF1ZGlvSWRcIiAoY2xpY2spPVwic2Vla0F1ZGlvKCRldmVudCwgY29udi5hdWRpb0lkKVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8td2YtYmFyXCIgKm5nRm9yPVwibGV0IGggb2Ygd2F2ZWZvcm1IZWlnaHRzOyBsZXQgaSA9IGluZGV4XCIgW3N0eWxlLmhlaWdodC5weF09XCJoXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLnBsYXllZF09XCIocGxheWJhY2tTdGF0ZXNbY29udi5hdWRpb0lkXT8ucHJvZ3Jlc3MgfHwgMCkgPiBpIC8gd2F2ZWZvcm1IZWlnaHRzLmxlbmd0aFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZWNoby10aW1lXCI+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwicGxheWluZ0NvbnZJZCA9PT0gY29udi5hdWRpb0lkICYmIHBsYXliYWNrU3RhdGVzW2NvbnYuYXVkaW9JZF0/LmN1cnJlbnRUaW1lXCI+e3sgcGxheWJhY2tTdGF0ZXNbY29udi5hdWRpb0lkXS5jdXJyZW50VGltZSB9fSAvIDwvc3Bhbj57eyBwbGF5YmFja1N0YXRlc1tjb252LmF1ZGlvSWRdPy50b3RhbFRpbWUgfHwgY29udi5kdXJhdGlvbiB8fCAnLS0nIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGF1ZGlvIFtpZF09XCInYXVkaW8tJyArIGNvbnYuYXVkaW9JZFwiIFtzcmNdPVwiY29udi5hdWRpb1VybFwiIHByZWxvYWQ9XCJhdXRvXCJcbiAgICAgICAgICAgICAgICAgICh0aW1ldXBkYXRlKT1cIm9uVGltZVVwZGF0ZShhdWRpb0VsLCBjb252LmF1ZGlvSWQpXCJcbiAgICAgICAgICAgICAgICAgIChsb2FkZWRtZXRhZGF0YSk9XCJvbkxvYWRlZE1ldGFkYXRhKGF1ZGlvRWwsIGNvbnYuYXVkaW9JZCwgY29udi5kdXJhdGlvbilcIlxuICAgICAgICAgICAgICAgICAgKGVuZGVkKT1cInBsYXlpbmdDb252SWQgPSBudWxsXCIgI2F1ZGlvRWw+PC9hdWRpbz5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPCEtLSBUYWJzIC0tPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udi10YWJzXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnYtdGFiLWJ0blwiIFtjbGFzcy5hY3RpdmVdPVwiZ2V0Q29udlRhYihjb252LmF1ZGlvSWQpID09PSAnc3VtbWFyeSdcIiAoY2xpY2spPVwic2V0Q29udlRhYihjb252LmF1ZGlvSWQsICdzdW1tYXJ5JywgJGV2ZW50KVwiPlN1bW1hcnk8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udi10YWItYnRuXCIgW2NsYXNzLmFjdGl2ZV09XCJnZXRDb252VGFiKGNvbnYuYXVkaW9JZCkgPT09ICd0cmFuc2NyaXB0J1wiIChjbGljayk9XCJzZXRDb252VGFiKGNvbnYuYXVkaW9JZCwgJ3RyYW5zY3JpcHQnLCAkZXZlbnQpXCI+VHJhbnNjcmlwdDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8IS0tIENvbnRlbnQ6IExlZnQgKFN1bW1hcnkvVHJhbnNjcmlwdCArIEFJIEluc2lnaHRzKSArIFJpZ2h0IChNZXRyaWNzKSAtLT5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1jb250ZW50LXNwbGl0XCI+XG4gICAgICAgICAgICAgICAgPCEtLSBMZWZ0IHNpZGUgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1jb250ZW50LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJnZXRDb252VGFiKGNvbnYuYXVkaW9JZCkgPT09ICdzdW1tYXJ5J1wiPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInN1bW1hcnktdGV4dFwiPnt7IGNvbnYuYXVkaW9EZXNjcmlwdGlvbiB8fCBjb252LmNvbnZlcnNhdGlvbkRldGFpbHM/LmF1ZGlvU3VtbWFyeSB8fCAnTm8gc3VtbWFyeSBhdmFpbGFibGUnIH19PC9wPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIEFJIEluc2lnaHRzIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udi5haUluc2lnaHRzPy5zdW1tYXJ5Py5sZW5ndGhcIiBjbGFzcz1cImFpLWluc2lnaHRzLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktaW5zaWdodHMtbGFiZWxcIj5BSSBJbnNpZ2h0czwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGluc2lnaHQgb2YgY29udi5haUluc2lnaHRzLnN1bW1hcnlcIiBjbGFzcz1cImFpLWluc2lnaHQtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktaW5zaWdodC1kb3RcIiBbc3R5bGUuYmFja2dyb3VuZF09XCJpbnNpZ2h0LnR5cGUgPT09ICdwb3NpdGl2ZScgPyAnIzAwQTNGRicgOiBpbnNpZ2h0LnR5cGUgPT09ICduZWdhdGl2ZScgPyAnI0VGNDQ0NCcgOiAnI0Y1OUUwQidcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWktaW5zaWdodC10ZXh0XCI+e3sgaW5zaWdodC50ZXh0IHx8IGluc2lnaHQgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29udlRhYihjb252LmF1ZGlvSWQpID09PSAndHJhbnNjcmlwdCdcIj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzdW1tYXJ5LXRleHQgc3VtbWFyeS10ZXh0LS1wcmV3cmFwXCI+e3sgY2xlYW5UcmFuc2NyaXB0aW9uKGNvbnYuY29udmVyc2F0aW9uRGV0YWlscz8udHJhbnNjcmlwdGlvbikgfHwgJ05vIHRyYW5zY3JpcHQgYXZhaWxhYmxlJyB9fTwvcD5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gUmlnaHQgc2lkZTogTWV0cmljcyAob25seSBzaG93IHZhbHVlcyB0aGF0IGhhdmUgZGF0YSkgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1jb250ZW50LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljcy1wYW5lbC1sYWJlbFwiPk1ldHJpY3M8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb252Lm1ldHJpY3M/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBtIG9mIGNvbnYubWV0cmljc1wiIGNsYXNzPVwibWV0cmljLWl0ZW0td3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2luZ2xlIHZhbHVlOiBuYW1lICsgdmFsdWUgb24gc2FtZSByb3cgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm0udmFsdWU/Lmxlbmd0aCA9PT0gMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1zaW5nbGUtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWV0cmljLXNpbmdsZS1uYW1lXCIgW3RpdGxlXT1cIm0ubmFtZVwiPnt7IG0ubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtZXRyaWMtc2luZ2xlLXZhbHVlXCIgW3N0eWxlLmNvbG9yXT1cIm0udmFsdWVbMF0uc2NvcmUgIT09IG51bGwgJiYgbS52YWx1ZVswXS5zY29yZSAhPT0gdW5kZWZpbmVkID8gJyMwMEEzRkYnIDogJyMzNDQwNTQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZm9ybWF0TWV0cmljVmFsdWUobS52YWx1ZVswXSkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBNdWx0aXBsZSB2YWx1ZXM6IGhlYWRlciArIHJvd3MgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm0udmFsdWU/Lmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWMtbXVsdGktaGVhZGVyXCIgW3RpdGxlXT1cIm0ubmFtZVwiPnt7IG0ubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdiBvZiBtLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIodi5zY29yZSAhPT0gbnVsbCAmJiB2LnNjb3JlICE9PSB1bmRlZmluZWQpIHx8ICh2LlRvdGFsICE9PSBudWxsICYmIHYuVG90YWwgIT09IHVuZGVmaW5lZCkgfHwgKHYuQXZnICE9PSBudWxsICYmIHYuQXZnICE9PSB1bmRlZmluZWQpIHx8ICh2LnRvdGFsICE9PSBudWxsICYmIHYudG90YWwgIT09IHVuZGVmaW5lZCkgfHwgKHYuYXZnICE9PSBudWxsICYmIHYuYXZnICE9PSB1bmRlZmluZWQpIHx8ICh2LmNvdW50ICE9PSBudWxsICYmIHYuY291bnQgIT09IHVuZGVmaW5lZClcIiBjbGFzcz1cIm1ldHJpYy1tdWx0aS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldHJpYy1tdWx0aS1uYW1lXCIgW3RpdGxlXT1cInYubmFtZVwiPnt7IHYubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1ldHJpYy1tdWx0aS12YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwidi5zY29yZSAhPT0gbnVsbCAmJiB2LnNjb3JlICE9PSB1bmRlZmluZWQgPyAnIzAwQTNGRicgOiAnIzM0NDA1NCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZvcm1hdE1ldHJpY1ZhbHVlKHYpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb252Lm1ldHJpY3M/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udi5zdG9yZU5hbWVcIiBjbGFzcz1cIm1ldHJpYy1mYWxsYmFjay1yb3dcIj48c3BhbiBjbGFzcz1cIm1ldHJpYy1mYWxsYmFjay1sYWJlbFwiPlN0b3JlPC9zcGFuPjxzcGFuIGNsYXNzPVwibWV0cmljLWZhbGxiYWNrLXZhbHVlXCI+e3sgY29udi5zdG9yZU5hbWUgfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb252LmR1cmF0aW9uXCIgY2xhc3M9XCJtZXRyaWMtZmFsbGJhY2stcm93XCI+PHNwYW4gY2xhc3M9XCJtZXRyaWMtZmFsbGJhY2stbGFiZWxcIj5EdXJhdGlvbjwvc3Bhbj48c3BhbiBjbGFzcz1cIm1ldHJpYy1mYWxsYmFjay12YWx1ZVwiPnt7IGNvbnYuZHVyYXRpb24gfX08L3NwYW4+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb252Ll9kZXRhaWxMb2FkaW5nXCIgY2xhc3M9XCJtZXRyaWMtZGV0YWlsLWxvYWRpbmdcIj5Mb2FkaW5nLi4uPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTm8gY29udmVyc2F0aW9ucyBmb3IgdGhpcyBmaWx0ZXIgKG9ubHkgd2hlbiBjYXJkcyBleGlzdCBidXQgY29udnMgYXJlIGVtcHR5KSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cIiFkZXRhaWxMb2FkaW5nICYmIGRldGFpbFBhZ2VDb252cy5sZW5ndGggPT09IDAgJiYgY29ob3J0Q2FyZHMubGVuZ3RoID4gMFwiIGNsYXNzPVwiZWNoby1ub2RhdGEtc3RhdGVcIj5cbiAgICAgICAgICA8aW1nIHNyYz1cIi4vYXNzZXRzL3RhbmdvL0ljb25zL05vZGF0YTEuc3ZnXCIgYWx0PVwiTm8gZGF0YVwiIGNsYXNzPVwiZWNoby1ub2RhdGEtaW1nXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tbm9kYXRhLXRpdGxlXCI+Tm8gZGF0YSBmb3VuZDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJlY2hvLW5vZGF0YS1zdWJcIj5ObyBjb252ZXJzYXRpb25zIGF2YWlsYWJsZSBmb3IgdGhlIHNlbGVjdGVkIGZpbHRlci48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBQYWdpbmF0aW9uIC0tPlxuICAgICAgICA8bGliLXBhZ2luYXRpb24gKm5nSWY9XCJkZXRhaWxUb3RhbCA+IDBcIiBbaXRlbXNQZXJQYWdlXT1cImRldGFpbFBlclBhZ2VcIiBbY3VycmVudFBhZ2VdPVwiZGV0YWlsUGFnZVwiIFt0b3RhbEl0ZW1zXT1cImRldGFpbFRvdGFsXCJcbiAgICAgICAgICBbcGFnaW5hdGlvblNpemVzXT1cImRldGFpbFBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJkZXRhaWxQZXJQYWdlXCIgKHBhZ2VDaGFuZ2UpPVwib25EZXRhaWxQYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIChwYWdlU2l6ZUNoYW5nZSk9XCJvbkRldGFpbFBhZ2VTaXplQ2hhbmdlKCRldmVudClcIj48L2xpYi1wYWdpbmF0aW9uPlxuICAgICAgPC9uZy1jb250YWluZXI+PCEtLSBlbmQgZGV0YWlsVmlldyAtLT5cbiAgICA8L25nLWNvbnRhaW5lcj48IS0tIGVuZCBhZ2VudGFuYWx5c2lzIC0tPlxuXG4gICAgPCEtLSDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgTUFOQUdFIFRBQiDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRQYWdlID09PSAnbWFuYWdlJ1wiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1hbmFnZS1oZWFkZXJcIj5cbiAgICAgICAgPGRpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWFuYWdlLXRpdGxlXCI+QWdlbnRzPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1hbmFnZS1zdWJ0aXRsZVwiPnt7IG1hbmFnZVRvdGFsIH19IGFnZW50czwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4LXNwYWNlclwiPjwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImVjaG8tc2VhcmNoLXdyYXAtLXdpZGVcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiM5NEEzQjhcIiBzdHJva2Utd2lkdGg9XCIxLjhcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCI+PGNpcmNsZSBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCI3LjVcIi8+PHBhdGggZD1cIk0xNi41IDE2LjVMMjEgMjFcIi8+PC9zdmc+XG4gICAgICAgICAgPGlucHV0IFsobmdNb2RlbCldPVwibWFuYWdlU2VhcmNoXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25NYW5hZ2VTZWFyY2goKVwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGFnZW50cy4uLlwiIGNsYXNzPVwibWFuYWdlLXNlYXJjaC1pbnB1dFwiPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2ICpuZ0lmPVwibWFuYWdlTG9hZGluZ1wiIGNsYXNzPVwiZWNoby1lbXB0eS1zdGF0ZVwiPkxvYWRpbmcgYWdlbnRzLi4uPC9kaXY+XG5cbiAgICAgIDwhLS0gQWdlbnRzIHRhYmxlIC0tPlxuICAgICAgPGRpdiAqbmdJZj1cIiFtYW5hZ2VMb2FkaW5nXCIgY2xhc3M9XCJlY2hvLWNhcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50cy10YWJsZS1oZWFkZXIgYWdlbnRzLXRhYmxlLTRjb2xcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnRzLXRhYmxlLWNlbGxcIj5BZ2VudCBOYW1lPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50cy10YWJsZS1jZWxsIGFnZW50cy10YWJsZS1jZWxsLS1jZW50ZXJcIj5NZXRyaWNzPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50cy10YWJsZS1jZWxsIGFnZW50cy10YWJsZS1jZWxsLS1jZW50ZXJcIj5Tb3VyY2U8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnRzLXRhYmxlLWNlbGwgYWdlbnRzLXRhYmxlLWNlbGwtLWNlbnRlclwiPkFjdGlvbjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgY29ob3J0IG9mIG1hbmFnZUNvaG9ydHM7IHRyYWNrQnk6IHRyYWNrQnlJZFwiIGNsYXNzPVwiYWdlbnRzLXRhYmxlLXJvdyBhZ2VudHMtdGFibGUtNGNvbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1jZWxsLW5hbWUtd3JhcFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWNlbGwtbmFtZVwiPnt7IGNvaG9ydC5jb2hvcnROYW1lIHx8IGNvaG9ydC5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtY2VsbC1kZXNjXCI+e3sgY29ob3J0LmNvaG9ydERlc2NyaXB0aW9uIHx8IGNvaG9ydC5kZXNjcmlwdGlvbiB8fCAnJyB9fTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZ2VudC1jZWxsLW1ldHJpY3NcIj57eyBjb2hvcnQubWV0cmljc0FkZGVkIHx8IGNvaG9ydC5tZXRyaWNBZGRlZCB8fCBjb2hvcnQubWV0cmljcz8ubGVuZ3RoIHx8IDAgfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWdlbnQtY2VsbC1zb3VyY2VcIj57eyBjb2hvcnQuc291cmNlPy5qb2luKCcsICcpIHx8ICfigJMnIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFnZW50LWNlbGwtYWN0aW9uXCI+XG4gICAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJkZWxldGVDb2hvcnQoY29ob3J0LmNvaG9ydElkIHx8IGNvaG9ydC5pZCB8fCBjb2hvcnQuX2lkKVwiIGNsYXNzPVwiYWdlbnQtZGVsZXRlLWJ0blwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cIm1hbmFnZUNvaG9ydHMubGVuZ3RoID09PSAwXCIgY2xhc3M9XCJtYW5hZ2Utbm8tcmVzdWx0c1wiPk5vIGNvaG9ydHMgZm91bmQuPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPCEtLSBNYW5hZ2UgcGFnaW5hdGlvbiAtLT5cbiAgICAgIDxsaWItcGFnaW5hdGlvbiAqbmdJZj1cIm1hbmFnZVRvdGFsID4gMFwiIFtpdGVtc1BlclBhZ2VdPVwibWFuYWdlUGVyUGFnZVwiIFtjdXJyZW50UGFnZV09XCJtYW5hZ2VQYWdlXCIgW3RvdGFsSXRlbXNdPVwibWFuYWdlVG90YWxcIlxuICAgICAgICBbcGFnaW5hdGlvblNpemVzXT1cIm1hbmFnZVBhZ2luYXRpb25TaXplc1wiIFtwYWdlU2l6ZV09XCJtYW5hZ2VQZXJQYWdlXCIgKHBhZ2VDaGFuZ2UpPVwib25NYW5hZ2VQYWdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAocGFnZVNpemVDaGFuZ2UpPVwib25NYW5hZ2VQYWdlU2l6ZUNoYW5nZSgkZXZlbnQpXCI+PC9saWItcGFnaW5hdGlvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIOKVkOKVkOKVkCBGSUxURVJTIERSQVdFUiDilZDilZDilZAgLS0+XG48ZGl2IGNsYXNzPVwiZHJhd2VyLW92ZXJsYXlcIiAqbmdJZj1cImRyYXdlck9wZW5cIiAoY2xpY2spPVwiY2xvc2VGaWx0ZXJEcmF3ZXIoKVwiPjwvZGl2PlxuPGRpdiBjbGFzcz1cImFmLWRyYXdlclwiICpuZ0lmPVwiZHJhd2VyT3BlblwiPlxuICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWhlYWRlclwiPlxuICAgIDxzcGFuIGNsYXNzPVwiZHJhd2VyLWhlYWRlci10aXRsZVwiPkZpbHRlcnM8L3NwYW4+XG4gICAgPGJ1dHRvbiAoY2xpY2spPVwiY2xvc2VGaWx0ZXJEcmF3ZXIoKVwiIGNsYXNzPVwiZHJhd2VyLWNsb3NlLWJ0blwiPsOXPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWJvZHlcIj5cbiAgICA8cCBjbGFzcz1cImRyYXdlci1wbGFjZWhvbGRlci10ZXh0XCI+RmlsdGVyIGNvbmZpZ3VyYXRpb24gY29taW5nIHNvb24uIFVzZXMgdGhlIHNhbWUgZmlsdGVyIEFQSXMgYXMgdGhlIGV4aXN0aW5nIGF1ZGlvIHBhZ2VzLjwvcD5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJhZi1mb290ZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYWYtY2FuY2VsXCIgKGNsaWNrKT1cImNsb3NlRmlsdGVyRHJhd2VyKClcIj5DbG9zZTwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|