@seniorsistemas/components-ai 2.5.0 → 2.5.1
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,4 +1,4 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter, ContentChild, ViewChild } from '@angular/core';
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ContentChild, ViewChild, HostListener } from '@angular/core';
|
|
2
2
|
import { CommonModule } from '@angular/common';
|
|
3
3
|
import { DragDropModule, moveItemInArray, transferArrayItem } from '@angular/cdk/drag-drop';
|
|
4
4
|
import { ButtonModule } from 'primeng/button';
|
|
@@ -13,6 +13,8 @@ import * as i4 from "primeng/tag";
|
|
|
13
13
|
import * as i5 from "primeng/tooltip";
|
|
14
14
|
export class KanbanBoardComponent {
|
|
15
15
|
ngZone;
|
|
16
|
+
elRef;
|
|
17
|
+
cdr;
|
|
16
18
|
columns = [];
|
|
17
19
|
allowReorder = true;
|
|
18
20
|
allowDrag = true;
|
|
@@ -46,6 +48,8 @@ export class KanbanBoardComponent {
|
|
|
46
48
|
// Scroll state
|
|
47
49
|
hasHorizontalScroll = false;
|
|
48
50
|
scrollPosition = 'start';
|
|
51
|
+
/** Dynamic top offset (in px) for scroll hint buttons so they follow vertical scroll. */
|
|
52
|
+
scrollHintTopOffset = null;
|
|
49
53
|
// Selection state
|
|
50
54
|
selectedIds = new Set();
|
|
51
55
|
// Auto-scroll during drag
|
|
@@ -53,8 +57,10 @@ export class KanbanBoardComponent {
|
|
|
53
57
|
autoScrollSpeed = 0;
|
|
54
58
|
autoScrollRaf = null;
|
|
55
59
|
resizeObserver;
|
|
56
|
-
constructor(ngZone) {
|
|
60
|
+
constructor(ngZone, elRef, cdr) {
|
|
57
61
|
this.ngZone = ngZone;
|
|
62
|
+
this.elRef = elRef;
|
|
63
|
+
this.cdr = cdr;
|
|
58
64
|
}
|
|
59
65
|
ngOnInit() {
|
|
60
66
|
this.updateColumnIds();
|
|
@@ -62,9 +68,13 @@ export class KanbanBoardComponent {
|
|
|
62
68
|
ngAfterViewInit() {
|
|
63
69
|
if (this.showScrollHints) {
|
|
64
70
|
this.checkScroll();
|
|
71
|
+
this.updateScrollHintPosition();
|
|
65
72
|
this.ngZone.runOutsideAngular(() => {
|
|
66
73
|
this.resizeObserver = new ResizeObserver(() => {
|
|
67
|
-
this.ngZone.run(() =>
|
|
74
|
+
this.ngZone.run(() => {
|
|
75
|
+
this.checkScroll();
|
|
76
|
+
this.updateScrollHintPosition();
|
|
77
|
+
});
|
|
68
78
|
});
|
|
69
79
|
if (this.scrollContainer?.nativeElement) {
|
|
70
80
|
this.resizeObserver.observe(this.scrollContainer.nativeElement);
|
|
@@ -76,6 +86,43 @@ export class KanbanBoardComponent {
|
|
|
76
86
|
this.resizeObserver?.disconnect();
|
|
77
87
|
this.stopAutoScroll();
|
|
78
88
|
}
|
|
89
|
+
onWindowScroll() {
|
|
90
|
+
this.updateScrollHintPosition();
|
|
91
|
+
}
|
|
92
|
+
onWindowResize() {
|
|
93
|
+
this.updateScrollHintPosition();
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Calculates the top offset for the scroll hint buttons so they stay visible
|
|
97
|
+
* as the user scrolls vertically. Uses the board's bounding rect relative to
|
|
98
|
+
* the viewport to determine the ideal vertical center within the visible area.
|
|
99
|
+
*/
|
|
100
|
+
updateScrollHintPosition() {
|
|
101
|
+
if (!this.showScrollHints || !this.hasHorizontalScroll)
|
|
102
|
+
return;
|
|
103
|
+
const boardEl = this.elRef.nativeElement.querySelector('.kanban-board');
|
|
104
|
+
if (!boardEl)
|
|
105
|
+
return;
|
|
106
|
+
const rect = boardEl.getBoundingClientRect();
|
|
107
|
+
const viewportHeight = window.innerHeight;
|
|
108
|
+
// Visible portion of the board within the viewport
|
|
109
|
+
const visibleTop = Math.max(rect.top, 0);
|
|
110
|
+
const visibleBottom = Math.min(rect.bottom, viewportHeight);
|
|
111
|
+
const visibleHeight = visibleBottom - visibleTop;
|
|
112
|
+
if (visibleHeight <= 0) {
|
|
113
|
+
// Board not visible, no need to update
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// Center of the visible portion relative to the board's top
|
|
117
|
+
const visibleCenterInViewport = visibleTop + visibleHeight / 2;
|
|
118
|
+
const topOffset = visibleCenterInViewport - rect.top;
|
|
119
|
+
// Apply minimum distance from the board top (e.g., 120px)
|
|
120
|
+
const minTop = 120;
|
|
121
|
+
const maxTop = rect.height - 60;
|
|
122
|
+
const clampedOffset = Math.max(minTop, Math.min(topOffset, maxTop));
|
|
123
|
+
this.scrollHintTopOffset = clampedOffset;
|
|
124
|
+
this.cdr.detectChanges();
|
|
125
|
+
}
|
|
79
126
|
ngOnChanges() {
|
|
80
127
|
this.updateColumnIds();
|
|
81
128
|
setTimeout(() => this.checkScroll(), 50);
|
|
@@ -257,8 +304,8 @@ export class KanbanBoardComponent {
|
|
|
257
304
|
'border-top': column.color ? `3px solid ${column.color}` : '3px solid #dee2e6'
|
|
258
305
|
};
|
|
259
306
|
}
|
|
260
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KanbanBoardComponent, deps: [{ token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
261
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: KanbanBoardComponent, isStandalone: true, selector: "sia-kanban-board", inputs: { columns: "columns", allowReorder: "allowReorder", allowDrag: "allowDrag", showAddButton: "showAddButton", showEditButton: "showEditButton", showDeleteButton: "showDeleteButton", canDeleteColumn: "canDeleteColumn", emptyMessage: "emptyMessage", minColumnWidth: "minColumnWidth", maxColumnWidth: "maxColumnWidth", showScrollHints: "showScrollHints", selectable: "selectable" }, outputs: { itemMoved: "itemMoved", itemClicked: "itemClicked", addItem: "addItem", editColumn: "editColumn", deleteColumn: "deleteColumn", selectionChange: "selectionChange" }, queries: [{ propertyName: "columnHeaderTemplate", first: true, predicate: ["columnHeaderTemplate"], descendants: true }, { propertyName: "itemTemplate", first: true, predicate: ["itemTemplate"], descendants: true }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"kanban-board\">\n <!-- Scroll hint arrows -->\n <div class=\"kanban-scroll-controls\" *ngIf=\"showScrollHints && hasHorizontalScroll\">\n <button\n *ngIf=\"scrollPosition !== 'start'\"\n pButton\n type=\"button\"\n icon=\"pi pi-chevron-left\"\n [rounded]=\"true\"\n class=\"scroll-hint scroll-hint-left\"\n (click)=\"scrollLeft()\">\n </button>\n <button\n *ngIf=\"scrollPosition !== 'end'\"\n pButton\n type=\"button\"\n icon=\"pi pi-chevron-right\"\n [rounded]=\"true\"\n class=\"scroll-hint scroll-hint-right\"\n (click)=\"scrollRight()\">\n </button>\n </div>\n\n <!-- Scrollable columns container -->\n <div class=\"kanban-columns\" #scrollContainer (scroll)=\"onScroll()\">\n <div \n *ngFor=\"let column of columns\" \n class=\"kanban-column\"\n [style]=\"getColumnStyle(column)\">\n \n <!-- Column Header -->\n <div class=\"column-header\">\n <!-- Custom header template -->\n <ng-container *ngIf=\"columnHeaderTemplate; else defaultColumnHeader\"\n [ngTemplateOutlet]=\"columnHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: column }\">\n </ng-container>\n\n <ng-template #defaultColumnHeader>\n <div class=\"column-title\">\n <i *ngIf=\"column.icon\" [class]=\"'pi ' + column.icon\"></i>\n <span>{{ column.title }}</span>\n <span class=\"item-count\">{{ column.items.length }}</span>\n </div>\n <div class=\"column-actions\">\n <button \n *ngIf=\"showAddButton\"\n pButton \n type=\"button\" \n icon=\"pi pi-plus\" \n class=\"p-button-text p-button-sm p-button-rounded\"\n (click)=\"onAddItem(column)\"\n [pTooltip]=\"'Add item'\"\n tooltipPosition=\"top\">\n </button>\n <button \n *ngIf=\"showEditButton\"\n pButton \n type=\"button\" \n icon=\"pi pi-pencil\" \n class=\"p-button-text p-button-sm p-button-rounded\"\n (click)=\"onEditColumn(column)\"\n [pTooltip]=\"'Edit column'\"\n tooltipPosition=\"top\">\n </button>\n <button \n *ngIf=\"canShowDeleteButton(column)\"\n pButton \n type=\"button\" \n icon=\"pi pi-trash\" \n class=\"p-button-text p-button-sm p-button-rounded p-button-danger\"\n (click)=\"onDeleteColumn(column)\"\n [pTooltip]=\"'Delete column'\"\n tooltipPosition=\"top\">\n </button>\n </div>\n </ng-template>\n </div>\n\n <!-- Column Content -->\n <div \n class=\"column-content\"\n cdkDropList\n [id]=\"column.id\"\n [cdkDropListData]=\"column.items\"\n [cdkDropListConnectedTo]=\"columnIds\"\n (cdkDropListDropped)=\"onDrop($event, column)\">\n \n <!-- Items -->\n <div \n *ngFor=\"let item of column.items\"\n class=\"kanban-item\"\n [class.kanban-item--selected]=\"selectable && isSelected(item)\"\n cdkDrag\n [cdkDragDisabled]=\"!allowDrag\"\n (cdkDragMoved)=\"onDragMoved($event)\"\n (cdkDragEnded)=\"onDragEnded()\"\n (click)=\"onItemClick(item)\">\n \n <!-- Custom item template with selection context -->\n <ng-container *ngIf=\"itemTemplate; else defaultItem\"\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"getItemContext(item, column)\">\n </ng-container>\n\n <ng-template #defaultItem>\n <div class=\"item-content\">\n <div class=\"item-title\">{{ item.title }}</div>\n <div *ngIf=\"item.description\" class=\"item-description\">\n {{ item.description }}\n </div>\n <div *ngIf=\"item.tags && item.tags.length > 0\" class=\"item-tags\">\n <p-tag \n *ngFor=\"let tag of item.tags\"\n [value]=\"tag.label\"\n [severity]=\"tag.severity || 'secondary'\"\n styleClass=\"item-tag\">\n </p-tag>\n </div>\n </div>\n </ng-template>\n\n <!-- Drag Placeholder -->\n <div class=\"item-placeholder\" *cdkDragPlaceholder></div>\n </div>\n\n <!-- Empty State -->\n <div *ngIf=\"column.items.length === 0\" class=\"empty-column\">\n <i class=\"pi pi-inbox\"></i>\n <p>{{ emptyMessage }}</p>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".kanban-board{position:relative;width:100%;height:100%;padding:1rem}.kanban-board .kanban-scroll-controls{position:absolute;inset:0;pointer-events:none;z-index:10}.kanban-board .kanban-scroll-controls .scroll-hint{position:absolute;top:50%;transform:translateY(-50%);pointer-events:auto;box-shadow:0 4px 12px #00000026;transition:all .3s ease}.kanban-board .kanban-scroll-controls .scroll-hint:hover{transform:translateY(-50%) scale(1.1);box-shadow:0 6px 16px #0003}.kanban-board .kanban-scroll-controls .scroll-hint.scroll-hint-left{left:.5rem}.kanban-board .kanban-scroll-controls .scroll-hint.scroll-hint-right{right:.5rem}.kanban-board .kanban-columns{display:flex;gap:1rem;min-height:500px;padding-bottom:1rem;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin}.kanban-board .kanban-columns::-webkit-scrollbar{height:6px}.kanban-board .kanban-columns::-webkit-scrollbar-track{background:transparent}.kanban-board .kanban-columns::-webkit-scrollbar-thumb{background:#94a3b84d;border-radius:3px}.kanban-board .kanban-columns::-webkit-scrollbar-thumb:hover{background:#94a3b880}.kanban-board .kanban-column{flex-shrink:0;display:flex;flex-direction:column;background:#fff;border-radius:8px;box-shadow:0 1px 3px #0000001a}.kanban-board .kanban-column .column-header{display:flex;justify-content:space-between;align-items:center;padding:1rem;border-bottom:1px solid #e9ecef;background:#fafbfc;border-radius:8px 8px 0 0}.kanban-board .kanban-column .column-header .column-title{display:flex;align-items:center;gap:.5rem;font-weight:600;color:#2c3e50;font-size:.95rem}.kanban-board .kanban-column .column-header .column-title .pi{font-size:.875rem;color:#6c757d}.kanban-board .kanban-column .column-header .column-title .item-count{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:24px;padding:0 .5rem;background:#e9ecef;border-radius:12px;font-size:.75rem;font-weight:600;color:#495057}.kanban-board .kanban-column .column-header .column-actions{display:flex;gap:.25rem}.kanban-board .kanban-column .column-content{flex:1;padding:.75rem;overflow-y:auto;min-height:200px}.kanban-board .kanban-column .column-content .kanban-item{background:#fff;border:1px solid #e9ecef;border-radius:6px;padding:.875rem;margin-bottom:.75rem;cursor:pointer;transition:all .2s ease;box-shadow:0 1px 2px #0000000d}.kanban-board .kanban-column .column-content .kanban-item:hover{border-color:#007bff;box-shadow:0 2px 8px #007bff26;transform:translateY(-1px)}.kanban-board .kanban-column .column-content .kanban-item:last-child{margin-bottom:0}.kanban-board .kanban-column .column-content .kanban-item.kanban-item--selected{border-left:3px solid #007bff;background:#f0f7ff}.kanban-board .kanban-column .column-content .kanban-item .item-content .item-title{font-weight:500;color:#2c3e50;font-size:.875rem;margin-bottom:.5rem;line-height:1.4}.kanban-board .kanban-column .column-content .kanban-item .item-content .item-description{font-size:.8rem;color:#6c757d;margin-bottom:.5rem;line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.kanban-board .kanban-column .column-content .kanban-item .item-content .item-tags{display:flex;flex-wrap:wrap;gap:.375rem;margin-top:.5rem}.kanban-board .kanban-column .column-content .kanban-item .item-content .item-tags ::ng-deep .item-tag{font-size:.7rem;padding:.25rem .5rem}.kanban-board .kanban-column .column-content .kanban-item .item-placeholder{background:#e9ecef;border:2px dashed #adb5bd;border-radius:6px;min-height:80px}.kanban-board .kanban-column .column-content .empty-column{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem;color:#adb5bd;text-align:center}.kanban-board .kanban-column .column-content .empty-column .pi{font-size:2.5rem;margin-bottom:.5rem;opacity:.5}.kanban-board .kanban-column .column-content .empty-column p{font-size:.875rem;margin:0}::ng-deep .cdk-drag-preview{background:#fff;border:1px solid #007bff;border-radius:6px;padding:.875rem;box-shadow:0 4px 12px #007bff4d;opacity:.9;cursor:grabbing}::ng-deep .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}::ng-deep .cdk-drop-list-dragging .kanban-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}@media (max-width: 768px){.kanban-board .kanban-columns{flex-direction:column}.kanban-board .kanban-column{min-width:100%!important;max-width:100%!important}.kanban-board .kanban-scroll-controls{display:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "ngmodule", type: CardModule }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i4.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }] });
|
|
307
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KanbanBoardComponent, deps: [{ token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
308
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: KanbanBoardComponent, isStandalone: true, selector: "sia-kanban-board", inputs: { columns: "columns", allowReorder: "allowReorder", allowDrag: "allowDrag", showAddButton: "showAddButton", showEditButton: "showEditButton", showDeleteButton: "showDeleteButton", canDeleteColumn: "canDeleteColumn", emptyMessage: "emptyMessage", minColumnWidth: "minColumnWidth", maxColumnWidth: "maxColumnWidth", showScrollHints: "showScrollHints", selectable: "selectable" }, outputs: { itemMoved: "itemMoved", itemClicked: "itemClicked", addItem: "addItem", editColumn: "editColumn", deleteColumn: "deleteColumn", selectionChange: "selectionChange" }, host: { listeners: { "window:scroll": "onWindowScroll()", "window:resize": "onWindowResize()" } }, queries: [{ propertyName: "columnHeaderTemplate", first: true, predicate: ["columnHeaderTemplate"], descendants: true }, { propertyName: "itemTemplate", first: true, predicate: ["itemTemplate"], descendants: true }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"kanban-board\">\n <!-- Scroll hint arrows -->\n <div class=\"kanban-scroll-controls\" *ngIf=\"showScrollHints && hasHorizontalScroll\">\n <button\n *ngIf=\"scrollPosition !== 'start'\"\n pButton\n type=\"button\"\n icon=\"pi pi-chevron-left\"\n [rounded]=\"true\"\n class=\"scroll-hint scroll-hint-left\"\n [style.top.px]=\"scrollHintTopOffset\"\n (click)=\"scrollLeft()\">\n </button>\n <button\n *ngIf=\"scrollPosition !== 'end'\"\n pButton\n type=\"button\"\n icon=\"pi pi-chevron-right\"\n [rounded]=\"true\"\n class=\"scroll-hint scroll-hint-right\"\n [style.top.px]=\"scrollHintTopOffset\"\n (click)=\"scrollRight()\">\n </button>\n </div>\n\n <!-- Scrollable columns container -->\n <div class=\"kanban-columns\" #scrollContainer (scroll)=\"onScroll()\">\n <div \n *ngFor=\"let column of columns\" \n class=\"kanban-column\"\n [style]=\"getColumnStyle(column)\">\n \n <!-- Column Header -->\n <div class=\"column-header\">\n <!-- Custom header template -->\n <ng-container *ngIf=\"columnHeaderTemplate; else defaultColumnHeader\"\n [ngTemplateOutlet]=\"columnHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: column }\">\n </ng-container>\n\n <ng-template #defaultColumnHeader>\n <div class=\"column-title\">\n <i *ngIf=\"column.icon\" [class]=\"'pi ' + column.icon\"></i>\n <span>{{ column.title }}</span>\n <span class=\"item-count\">{{ column.items.length }}</span>\n </div>\n <div class=\"column-actions\">\n <button \n *ngIf=\"showAddButton\"\n pButton \n type=\"button\" \n icon=\"pi pi-plus\" \n class=\"p-button-text p-button-sm p-button-rounded\"\n (click)=\"onAddItem(column)\"\n [pTooltip]=\"'Add item'\"\n tooltipPosition=\"top\">\n </button>\n <button \n *ngIf=\"showEditButton\"\n pButton \n type=\"button\" \n icon=\"pi pi-pencil\" \n class=\"p-button-text p-button-sm p-button-rounded\"\n (click)=\"onEditColumn(column)\"\n [pTooltip]=\"'Edit column'\"\n tooltipPosition=\"top\">\n </button>\n <button \n *ngIf=\"canShowDeleteButton(column)\"\n pButton \n type=\"button\" \n icon=\"pi pi-trash\" \n class=\"p-button-text p-button-sm p-button-rounded p-button-danger\"\n (click)=\"onDeleteColumn(column)\"\n [pTooltip]=\"'Delete column'\"\n tooltipPosition=\"top\">\n </button>\n </div>\n </ng-template>\n </div>\n\n <!-- Column Content -->\n <div \n class=\"column-content\"\n cdkDropList\n [id]=\"column.id\"\n [cdkDropListData]=\"column.items\"\n [cdkDropListConnectedTo]=\"columnIds\"\n (cdkDropListDropped)=\"onDrop($event, column)\">\n \n <!-- Items -->\n <div \n *ngFor=\"let item of column.items\"\n class=\"kanban-item\"\n [class.kanban-item--selected]=\"selectable && isSelected(item)\"\n cdkDrag\n [cdkDragDisabled]=\"!allowDrag\"\n (cdkDragMoved)=\"onDragMoved($event)\"\n (cdkDragEnded)=\"onDragEnded()\"\n (click)=\"onItemClick(item)\">\n \n <!-- Custom item template with selection context -->\n <ng-container *ngIf=\"itemTemplate; else defaultItem\"\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"getItemContext(item, column)\">\n </ng-container>\n\n <ng-template #defaultItem>\n <div class=\"item-content\">\n <div class=\"item-title\">{{ item.title }}</div>\n <div *ngIf=\"item.description\" class=\"item-description\">\n {{ item.description }}\n </div>\n <div *ngIf=\"item.tags && item.tags.length > 0\" class=\"item-tags\">\n <p-tag \n *ngFor=\"let tag of item.tags\"\n [value]=\"tag.label\"\n [severity]=\"tag.severity || 'secondary'\"\n styleClass=\"item-tag\">\n </p-tag>\n </div>\n </div>\n </ng-template>\n\n <!-- Drag Placeholder -->\n <div class=\"item-placeholder\" *cdkDragPlaceholder></div>\n </div>\n\n <!-- Empty State -->\n <div *ngIf=\"column.items.length === 0\" class=\"empty-column\">\n <i class=\"pi pi-inbox\"></i>\n <p>{{ emptyMessage }}</p>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".kanban-board{position:relative;width:100%;height:100%;padding:1rem}.kanban-board .kanban-scroll-controls{position:absolute;inset:0;pointer-events:none;z-index:10}.kanban-board .kanban-scroll-controls .scroll-hint{position:absolute;top:50%;transform:translateY(-50%);pointer-events:auto;box-shadow:0 4px 12px #00000026;transition:box-shadow .3s ease,transform .15s ease}.kanban-board .kanban-scroll-controls .scroll-hint:hover{transform:translateY(-50%) scale(1.1);box-shadow:0 6px 16px #0003}.kanban-board .kanban-scroll-controls .scroll-hint.scroll-hint-left{left:.5rem}.kanban-board .kanban-scroll-controls .scroll-hint.scroll-hint-right{right:.5rem}.kanban-board .kanban-columns{display:flex;gap:1rem;min-height:500px;padding-bottom:1rem;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin}.kanban-board .kanban-columns::-webkit-scrollbar{height:6px}.kanban-board .kanban-columns::-webkit-scrollbar-track{background:transparent}.kanban-board .kanban-columns::-webkit-scrollbar-thumb{background:#94a3b84d;border-radius:3px}.kanban-board .kanban-columns::-webkit-scrollbar-thumb:hover{background:#94a3b880}.kanban-board .kanban-column{flex-shrink:0;display:flex;flex-direction:column;background:#fff;border-radius:8px;box-shadow:0 1px 3px #0000001a}.kanban-board .kanban-column .column-header{display:flex;justify-content:space-between;align-items:center;padding:1rem;border-bottom:1px solid #e9ecef;background:#fafbfc;border-radius:8px 8px 0 0}.kanban-board .kanban-column .column-header .column-title{display:flex;align-items:center;gap:.5rem;font-weight:600;color:#2c3e50;font-size:.95rem}.kanban-board .kanban-column .column-header .column-title .pi{font-size:.875rem;color:#6c757d}.kanban-board .kanban-column .column-header .column-title .item-count{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:24px;padding:0 .5rem;background:#e9ecef;border-radius:12px;font-size:.75rem;font-weight:600;color:#495057}.kanban-board .kanban-column .column-header .column-actions{display:flex;gap:.25rem}.kanban-board .kanban-column .column-content{flex:1;padding:.75rem;overflow-y:auto;min-height:200px}.kanban-board .kanban-column .column-content .kanban-item{background:#fff;border:1px solid #e9ecef;border-radius:6px;padding:.875rem;margin-bottom:.75rem;cursor:pointer;transition:all .2s ease;box-shadow:0 1px 2px #0000000d}.kanban-board .kanban-column .column-content .kanban-item:hover{border-color:#007bff;box-shadow:0 2px 8px #007bff26;transform:translateY(-1px)}.kanban-board .kanban-column .column-content .kanban-item:last-child{margin-bottom:0}.kanban-board .kanban-column .column-content .kanban-item.kanban-item--selected{border-left:3px solid #007bff;background:#f0f7ff}.kanban-board .kanban-column .column-content .kanban-item .item-content .item-title{font-weight:500;color:#2c3e50;font-size:.875rem;margin-bottom:.5rem;line-height:1.4}.kanban-board .kanban-column .column-content .kanban-item .item-content .item-description{font-size:.8rem;color:#6c757d;margin-bottom:.5rem;line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.kanban-board .kanban-column .column-content .kanban-item .item-content .item-tags{display:flex;flex-wrap:wrap;gap:.375rem;margin-top:.5rem}.kanban-board .kanban-column .column-content .kanban-item .item-content .item-tags ::ng-deep .item-tag{font-size:.7rem;padding:.25rem .5rem}.kanban-board .kanban-column .column-content .kanban-item .item-placeholder{background:#e9ecef;border:2px dashed #adb5bd;border-radius:6px;min-height:80px}.kanban-board .kanban-column .column-content .empty-column{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem;color:#adb5bd;text-align:center}.kanban-board .kanban-column .column-content .empty-column .pi{font-size:2.5rem;margin-bottom:.5rem;opacity:.5}.kanban-board .kanban-column .column-content .empty-column p{font-size:.875rem;margin:0}::ng-deep .cdk-drag-preview{background:#fff;border:1px solid #007bff;border-radius:6px;padding:.875rem;box-shadow:0 4px 12px #007bff4d;opacity:.9;cursor:grabbing}::ng-deep .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}::ng-deep .cdk-drop-list-dragging .kanban-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}@media (max-width: 768px){.kanban-board .kanban-columns{flex-direction:column}.kanban-board .kanban-column{min-width:100%!important;max-width:100%!important}.kanban-board .kanban-scroll-controls{display:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2.CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "ngmodule", type: CardModule }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i4.Tag, selector: "p-tag", inputs: ["style", "styleClass", "severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }] });
|
|
262
309
|
}
|
|
263
310
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: KanbanBoardComponent, decorators: [{
|
|
264
311
|
type: Component,
|
|
@@ -269,8 +316,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
269
316
|
CardModule,
|
|
270
317
|
TagModule,
|
|
271
318
|
TooltipModule
|
|
272
|
-
], template: "<div class=\"kanban-board\">\n <!-- Scroll hint arrows -->\n <div class=\"kanban-scroll-controls\" *ngIf=\"showScrollHints && hasHorizontalScroll\">\n <button\n *ngIf=\"scrollPosition !== 'start'\"\n pButton\n type=\"button\"\n icon=\"pi pi-chevron-left\"\n [rounded]=\"true\"\n class=\"scroll-hint scroll-hint-left\"\n (click)=\"scrollLeft()\">\n </button>\n <button\n *ngIf=\"scrollPosition !== 'end'\"\n pButton\n type=\"button\"\n icon=\"pi pi-chevron-right\"\n [rounded]=\"true\"\n class=\"scroll-hint scroll-hint-right\"\n (click)=\"scrollRight()\">\n </button>\n </div>\n\n <!-- Scrollable columns container -->\n <div class=\"kanban-columns\" #scrollContainer (scroll)=\"onScroll()\">\n <div \n *ngFor=\"let column of columns\" \n class=\"kanban-column\"\n [style]=\"getColumnStyle(column)\">\n \n <!-- Column Header -->\n <div class=\"column-header\">\n <!-- Custom header template -->\n <ng-container *ngIf=\"columnHeaderTemplate; else defaultColumnHeader\"\n [ngTemplateOutlet]=\"columnHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: column }\">\n </ng-container>\n\n <ng-template #defaultColumnHeader>\n <div class=\"column-title\">\n <i *ngIf=\"column.icon\" [class]=\"'pi ' + column.icon\"></i>\n <span>{{ column.title }}</span>\n <span class=\"item-count\">{{ column.items.length }}</span>\n </div>\n <div class=\"column-actions\">\n <button \n *ngIf=\"showAddButton\"\n pButton \n type=\"button\" \n icon=\"pi pi-plus\" \n class=\"p-button-text p-button-sm p-button-rounded\"\n (click)=\"onAddItem(column)\"\n [pTooltip]=\"'Add item'\"\n tooltipPosition=\"top\">\n </button>\n <button \n *ngIf=\"showEditButton\"\n pButton \n type=\"button\" \n icon=\"pi pi-pencil\" \n class=\"p-button-text p-button-sm p-button-rounded\"\n (click)=\"onEditColumn(column)\"\n [pTooltip]=\"'Edit column'\"\n tooltipPosition=\"top\">\n </button>\n <button \n *ngIf=\"canShowDeleteButton(column)\"\n pButton \n type=\"button\" \n icon=\"pi pi-trash\" \n class=\"p-button-text p-button-sm p-button-rounded p-button-danger\"\n (click)=\"onDeleteColumn(column)\"\n [pTooltip]=\"'Delete column'\"\n tooltipPosition=\"top\">\n </button>\n </div>\n </ng-template>\n </div>\n\n <!-- Column Content -->\n <div \n class=\"column-content\"\n cdkDropList\n [id]=\"column.id\"\n [cdkDropListData]=\"column.items\"\n [cdkDropListConnectedTo]=\"columnIds\"\n (cdkDropListDropped)=\"onDrop($event, column)\">\n \n <!-- Items -->\n <div \n *ngFor=\"let item of column.items\"\n class=\"kanban-item\"\n [class.kanban-item--selected]=\"selectable && isSelected(item)\"\n cdkDrag\n [cdkDragDisabled]=\"!allowDrag\"\n (cdkDragMoved)=\"onDragMoved($event)\"\n (cdkDragEnded)=\"onDragEnded()\"\n (click)=\"onItemClick(item)\">\n \n <!-- Custom item template with selection context -->\n <ng-container *ngIf=\"itemTemplate; else defaultItem\"\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"getItemContext(item, column)\">\n </ng-container>\n\n <ng-template #defaultItem>\n <div class=\"item-content\">\n <div class=\"item-title\">{{ item.title }}</div>\n <div *ngIf=\"item.description\" class=\"item-description\">\n {{ item.description }}\n </div>\n <div *ngIf=\"item.tags && item.tags.length > 0\" class=\"item-tags\">\n <p-tag \n *ngFor=\"let tag of item.tags\"\n [value]=\"tag.label\"\n [severity]=\"tag.severity || 'secondary'\"\n styleClass=\"item-tag\">\n </p-tag>\n </div>\n </div>\n </ng-template>\n\n <!-- Drag Placeholder -->\n <div class=\"item-placeholder\" *cdkDragPlaceholder></div>\n </div>\n\n <!-- Empty State -->\n <div *ngIf=\"column.items.length === 0\" class=\"empty-column\">\n <i class=\"pi pi-inbox\"></i>\n <p>{{ emptyMessage }}</p>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".kanban-board{position:relative;width:100%;height:100%;padding:1rem}.kanban-board .kanban-scroll-controls{position:absolute;inset:0;pointer-events:none;z-index:10}.kanban-board .kanban-scroll-controls .scroll-hint{position:absolute;top:50%;transform:translateY(-50%);pointer-events:auto;box-shadow:0 4px 12px #00000026;transition:
|
|
273
|
-
}], ctorParameters: () => [{ type: i0.NgZone }], propDecorators: { columns: [{
|
|
319
|
+
], template: "<div class=\"kanban-board\">\n <!-- Scroll hint arrows -->\n <div class=\"kanban-scroll-controls\" *ngIf=\"showScrollHints && hasHorizontalScroll\">\n <button\n *ngIf=\"scrollPosition !== 'start'\"\n pButton\n type=\"button\"\n icon=\"pi pi-chevron-left\"\n [rounded]=\"true\"\n class=\"scroll-hint scroll-hint-left\"\n [style.top.px]=\"scrollHintTopOffset\"\n (click)=\"scrollLeft()\">\n </button>\n <button\n *ngIf=\"scrollPosition !== 'end'\"\n pButton\n type=\"button\"\n icon=\"pi pi-chevron-right\"\n [rounded]=\"true\"\n class=\"scroll-hint scroll-hint-right\"\n [style.top.px]=\"scrollHintTopOffset\"\n (click)=\"scrollRight()\">\n </button>\n </div>\n\n <!-- Scrollable columns container -->\n <div class=\"kanban-columns\" #scrollContainer (scroll)=\"onScroll()\">\n <div \n *ngFor=\"let column of columns\" \n class=\"kanban-column\"\n [style]=\"getColumnStyle(column)\">\n \n <!-- Column Header -->\n <div class=\"column-header\">\n <!-- Custom header template -->\n <ng-container *ngIf=\"columnHeaderTemplate; else defaultColumnHeader\"\n [ngTemplateOutlet]=\"columnHeaderTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: column }\">\n </ng-container>\n\n <ng-template #defaultColumnHeader>\n <div class=\"column-title\">\n <i *ngIf=\"column.icon\" [class]=\"'pi ' + column.icon\"></i>\n <span>{{ column.title }}</span>\n <span class=\"item-count\">{{ column.items.length }}</span>\n </div>\n <div class=\"column-actions\">\n <button \n *ngIf=\"showAddButton\"\n pButton \n type=\"button\" \n icon=\"pi pi-plus\" \n class=\"p-button-text p-button-sm p-button-rounded\"\n (click)=\"onAddItem(column)\"\n [pTooltip]=\"'Add item'\"\n tooltipPosition=\"top\">\n </button>\n <button \n *ngIf=\"showEditButton\"\n pButton \n type=\"button\" \n icon=\"pi pi-pencil\" \n class=\"p-button-text p-button-sm p-button-rounded\"\n (click)=\"onEditColumn(column)\"\n [pTooltip]=\"'Edit column'\"\n tooltipPosition=\"top\">\n </button>\n <button \n *ngIf=\"canShowDeleteButton(column)\"\n pButton \n type=\"button\" \n icon=\"pi pi-trash\" \n class=\"p-button-text p-button-sm p-button-rounded p-button-danger\"\n (click)=\"onDeleteColumn(column)\"\n [pTooltip]=\"'Delete column'\"\n tooltipPosition=\"top\">\n </button>\n </div>\n </ng-template>\n </div>\n\n <!-- Column Content -->\n <div \n class=\"column-content\"\n cdkDropList\n [id]=\"column.id\"\n [cdkDropListData]=\"column.items\"\n [cdkDropListConnectedTo]=\"columnIds\"\n (cdkDropListDropped)=\"onDrop($event, column)\">\n \n <!-- Items -->\n <div \n *ngFor=\"let item of column.items\"\n class=\"kanban-item\"\n [class.kanban-item--selected]=\"selectable && isSelected(item)\"\n cdkDrag\n [cdkDragDisabled]=\"!allowDrag\"\n (cdkDragMoved)=\"onDragMoved($event)\"\n (cdkDragEnded)=\"onDragEnded()\"\n (click)=\"onItemClick(item)\">\n \n <!-- Custom item template with selection context -->\n <ng-container *ngIf=\"itemTemplate; else defaultItem\"\n [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"getItemContext(item, column)\">\n </ng-container>\n\n <ng-template #defaultItem>\n <div class=\"item-content\">\n <div class=\"item-title\">{{ item.title }}</div>\n <div *ngIf=\"item.description\" class=\"item-description\">\n {{ item.description }}\n </div>\n <div *ngIf=\"item.tags && item.tags.length > 0\" class=\"item-tags\">\n <p-tag \n *ngFor=\"let tag of item.tags\"\n [value]=\"tag.label\"\n [severity]=\"tag.severity || 'secondary'\"\n styleClass=\"item-tag\">\n </p-tag>\n </div>\n </div>\n </ng-template>\n\n <!-- Drag Placeholder -->\n <div class=\"item-placeholder\" *cdkDragPlaceholder></div>\n </div>\n\n <!-- Empty State -->\n <div *ngIf=\"column.items.length === 0\" class=\"empty-column\">\n <i class=\"pi pi-inbox\"></i>\n <p>{{ emptyMessage }}</p>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".kanban-board{position:relative;width:100%;height:100%;padding:1rem}.kanban-board .kanban-scroll-controls{position:absolute;inset:0;pointer-events:none;z-index:10}.kanban-board .kanban-scroll-controls .scroll-hint{position:absolute;top:50%;transform:translateY(-50%);pointer-events:auto;box-shadow:0 4px 12px #00000026;transition:box-shadow .3s ease,transform .15s ease}.kanban-board .kanban-scroll-controls .scroll-hint:hover{transform:translateY(-50%) scale(1.1);box-shadow:0 6px 16px #0003}.kanban-board .kanban-scroll-controls .scroll-hint.scroll-hint-left{left:.5rem}.kanban-board .kanban-scroll-controls .scroll-hint.scroll-hint-right{right:.5rem}.kanban-board .kanban-columns{display:flex;gap:1rem;min-height:500px;padding-bottom:1rem;overflow-x:auto;overflow-y:hidden;scrollbar-width:thin}.kanban-board .kanban-columns::-webkit-scrollbar{height:6px}.kanban-board .kanban-columns::-webkit-scrollbar-track{background:transparent}.kanban-board .kanban-columns::-webkit-scrollbar-thumb{background:#94a3b84d;border-radius:3px}.kanban-board .kanban-columns::-webkit-scrollbar-thumb:hover{background:#94a3b880}.kanban-board .kanban-column{flex-shrink:0;display:flex;flex-direction:column;background:#fff;border-radius:8px;box-shadow:0 1px 3px #0000001a}.kanban-board .kanban-column .column-header{display:flex;justify-content:space-between;align-items:center;padding:1rem;border-bottom:1px solid #e9ecef;background:#fafbfc;border-radius:8px 8px 0 0}.kanban-board .kanban-column .column-header .column-title{display:flex;align-items:center;gap:.5rem;font-weight:600;color:#2c3e50;font-size:.95rem}.kanban-board .kanban-column .column-header .column-title .pi{font-size:.875rem;color:#6c757d}.kanban-board .kanban-column .column-header .column-title .item-count{display:inline-flex;align-items:center;justify-content:center;min-width:24px;height:24px;padding:0 .5rem;background:#e9ecef;border-radius:12px;font-size:.75rem;font-weight:600;color:#495057}.kanban-board .kanban-column .column-header .column-actions{display:flex;gap:.25rem}.kanban-board .kanban-column .column-content{flex:1;padding:.75rem;overflow-y:auto;min-height:200px}.kanban-board .kanban-column .column-content .kanban-item{background:#fff;border:1px solid #e9ecef;border-radius:6px;padding:.875rem;margin-bottom:.75rem;cursor:pointer;transition:all .2s ease;box-shadow:0 1px 2px #0000000d}.kanban-board .kanban-column .column-content .kanban-item:hover{border-color:#007bff;box-shadow:0 2px 8px #007bff26;transform:translateY(-1px)}.kanban-board .kanban-column .column-content .kanban-item:last-child{margin-bottom:0}.kanban-board .kanban-column .column-content .kanban-item.kanban-item--selected{border-left:3px solid #007bff;background:#f0f7ff}.kanban-board .kanban-column .column-content .kanban-item .item-content .item-title{font-weight:500;color:#2c3e50;font-size:.875rem;margin-bottom:.5rem;line-height:1.4}.kanban-board .kanban-column .column-content .kanban-item .item-content .item-description{font-size:.8rem;color:#6c757d;margin-bottom:.5rem;line-height:1.4;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.kanban-board .kanban-column .column-content .kanban-item .item-content .item-tags{display:flex;flex-wrap:wrap;gap:.375rem;margin-top:.5rem}.kanban-board .kanban-column .column-content .kanban-item .item-content .item-tags ::ng-deep .item-tag{font-size:.7rem;padding:.25rem .5rem}.kanban-board .kanban-column .column-content .kanban-item .item-placeholder{background:#e9ecef;border:2px dashed #adb5bd;border-radius:6px;min-height:80px}.kanban-board .kanban-column .column-content .empty-column{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem;color:#adb5bd;text-align:center}.kanban-board .kanban-column .column-content .empty-column .pi{font-size:2.5rem;margin-bottom:.5rem;opacity:.5}.kanban-board .kanban-column .column-content .empty-column p{font-size:.875rem;margin:0}::ng-deep .cdk-drag-preview{background:#fff;border:1px solid #007bff;border-radius:6px;padding:.875rem;box-shadow:0 4px 12px #007bff4d;opacity:.9;cursor:grabbing}::ng-deep .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}::ng-deep .cdk-drop-list-dragging .kanban-item:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}@media (max-width: 768px){.kanban-board .kanban-columns{flex-direction:column}.kanban-board .kanban-column{min-width:100%!important;max-width:100%!important}.kanban-board .kanban-scroll-controls{display:none}}\n"] }]
|
|
320
|
+
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { columns: [{
|
|
274
321
|
type: Input
|
|
275
322
|
}], allowReorder: [{
|
|
276
323
|
type: Input
|
|
@@ -315,5 +362,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
315
362
|
}], scrollContainer: [{
|
|
316
363
|
type: ViewChild,
|
|
317
364
|
args: ['scrollContainer', { static: false }]
|
|
365
|
+
}], onWindowScroll: [{
|
|
366
|
+
type: HostListener,
|
|
367
|
+
args: ['window:scroll']
|
|
368
|
+
}], onWindowResize: [{
|
|
369
|
+
type: HostListener,
|
|
370
|
+
args: ['window:resize']
|
|
318
371
|
}] } });
|
|
319
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2FuYmFuLWJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL2xpYi9jb21wb25lbnRzL2thbmJhbi1ib2FyZC9rYW5iYW4tYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy1haS9zcmMvbGliL2NvbXBvbmVudHMva2FuYmFuLWJvYXJkL2thbmJhbi1ib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFVLFlBQVksRUFDNUQsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQTRCLGNBQWMsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0SCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7OztBQWdEaEQsTUFBTSxPQUFPLG9CQUFvQjtJQXNEWDtJQXJEWCxPQUFPLEdBQW1CLEVBQUUsQ0FBQztJQUM3QixZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDakIsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUN0QixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLGdCQUFnQixHQUFHLEtBQUssQ0FBQztJQUN6QixlQUFlLENBQXFDO0lBQ3BELFlBQVksR0FBRyxVQUFVLENB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QWRoQyxTQUFTOytCQUNFLGtCQUFrQixjQUNoQixJQUFJLFdBQ1A7d0JBQ1AsWUFBWTt3QkFDWixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osVUFBVTt3QkFDVixTQUFTO3dCQUNULGFBQWE7cUJBQ2Q7MkVBS1EsT0FBTztzQkFBZixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0csZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVJLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxPQUFPO3NCQUFoQixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFHRyxlQUFlO3NCQUF4QixNQUFNO2dCQUcrQixvQkFBb0I7c0JBQXpELFlBQVk7dUJBQUMsc0JBQXNCO2dCQU1OLFlBQVk7c0JBQXpDLFlBQVk7dUJBQUMsY0FBYztnQkFFcUIsZUFBZTtzQkFBL0QsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBDb250ZW50Q2hpbGQsIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgTmdab25lLCBIb3N0TGlzdGVuZXJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIENka0RyYWdNb3ZlLCBEcmFnRHJvcE1vZHVsZSwgbW92ZUl0ZW1JbkFycmF5LCB0cmFuc2ZlckFycmF5SXRlbSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQnV0dG9uTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHsgQ2FyZE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY2FyZCc7XG5pbXBvcnQgeyBUYWdNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RhZyc7XG5pbXBvcnQgeyBUb29sdGlwTW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b29sdGlwJztcblxuZXhwb3J0IGludGVyZmFjZSBLYW5iYW5Db2x1bW4ge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBjb2xvcj86IHN0cmluZztcbiAgaWNvbj86IHN0cmluZztcbiAgaXRlbXM6IEthbmJhbkl0ZW1bXTtcbiAgbWF4SXRlbXM/OiBudW1iZXI7XG4gIGFsbG93RHJvcD86IGJvb2xlYW47XG4gIG1ldGFkYXRhPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEthbmJhbkl0ZW0ge1xuICBpZDogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgdGFncz86IEthbmJhblRhZ1tdO1xuICBtZXRhZGF0YT86IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBLYW5iYW5UYWcge1xuICBsYWJlbDogc3RyaW5nO1xuICBzZXZlcml0eT86ICdzdWNjZXNzJyB8ICdpbmZvJyB8ICd3YXJuJyB8ICdkYW5nZXInIHwgJ3NlY29uZGFyeScgfCAnY29udHJhc3QnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEthbmJhbkRyb3BFdmVudCB7XG4gIGl0ZW06IEthbmJhbkl0ZW07XG4gIHByZXZpb3VzQ29sdW1uOiBLYW5iYW5Db2x1bW47XG4gIGN1cnJlbnRDb2x1bW46IEthbmJhbkNvbHVtbjtcbiAgcHJldmlvdXNJbmRleDogbnVtYmVyO1xuICBjdXJyZW50SW5kZXg6IG51bWJlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc2lhLWthbmJhbi1ib2FyZCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgRHJhZ0Ryb3BNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLFxuICAgIENhcmRNb2R1bGUsXG4gICAgVGFnTW9kdWxlLFxuICAgIFRvb2x0aXBNb2R1bGVcbiAgXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2thbmJhbi1ib2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2thbmJhbi1ib2FyZC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEthbmJhbkJvYXJkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBjb2x1bW5zOiBLYW5iYW5Db2x1bW5bXSA9IFtdO1xuICBASW5wdXQoKSBhbGxvd1Jlb3JkZXIgPSB0cnVlO1xuICBASW5wdXQoKSBhbGxvd0RyYWcgPSB0cnVlO1xuICBASW5wdXQoKSBzaG93QWRkQnV0dG9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dFZGl0QnV0dG9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNob3dEZWxldGVCdXR0b24gPSBmYWxzZTtcbiAgQElucHV0KCkgY2FuRGVsZXRlQ29sdW1uPzogKGNvbHVtbjogS2FuYmFuQ29sdW1uKSA9PiBib29sZWFuO1xuICBASW5wdXQoKSBlbXB0eU1lc3NhZ2UgPSAnTm8gaXRlbXMnO1xuICBASW5wdXQoKSBtaW5Db2x1bW5XaWR0aCA9ICcyODBweCc7XG4gIEBJbnB1dCgpIG1heENvbHVtbldpZHRoID0gJzM1MHB4JztcblxuICAvKiogU2hvdyBzY3JvbGwgaGludCBhcnJvd3Mgd2hlbiBjb2x1bW5zIG92ZXJmbG93IGhvcml6b250YWxseS4gKi9cbiAgQElucHV0KCkgc2hvd1Njcm9sbEhpbnRzID0gdHJ1ZTtcblxuICAvKiogRW5hYmxlIGl0ZW0gc2VsZWN0aW9uIG1vZGUuIEFkZHMgc2VsZWN0ZWQgc3RhdGUgbWFuYWdlbWVudCBhbmQgQ1NTIGNsYXNzIG9uIGNhcmRzLiAqL1xuICBASW5wdXQoKSBzZWxlY3RhYmxlID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIGl0ZW1Nb3ZlZCA9IG5ldyBFdmVudEVtaXR0ZXI8S2FuYmFuRHJvcEV2ZW50PigpO1xuICBAT3V0cHV0KCkgaXRlbUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEthbmJhbkl0ZW0+KCk7XG4gIEBPdXRwdXQoKSBhZGRJdGVtID0gbmV3IEV2ZW50RW1pdHRlcjxLYW5iYW5Db2x1bW4+KCk7XG4gIEBPdXRwdXQoKSBlZGl0Q29sdW1uID0gbmV3IEV2ZW50RW1pdHRlcjxLYW5iYW5Db2x1bW4+KCk7XG4gIEBPdXRwdXQoKSBkZWxldGVDb2x1bW4gPSBuZXcgRXZlbnRFbWl0dGVyPEthbmJhbkNvbHVtbj4oKTtcblxuICAvKiogRW1pdHRlZCB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzLiBQYXlsb2FkIGlzIHRoZSBmdWxsIGFycmF5IG9mIHNlbGVjdGVkIEthbmJhbkl0ZW1zLiAqL1xuICBAT3V0cHV0KCkgc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxLYW5iYW5JdGVtW10+KCk7XG5cbiAgLyoqIEN1c3RvbSB0ZW1wbGF0ZSBmb3IgdGhlIGNvbHVtbiBoZWFkZXIuIENvbnRleHQ6IHsgJGltcGxpY2l0OiBLYW5iYW5Db2x1bW4gfSAqL1xuICBAQ29udGVudENoaWxkKCdjb2x1bW5IZWFkZXJUZW1wbGF0ZScpIGNvbHVtbkhlYWRlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICAvKipcbiAgICogQ3VzdG9tIHRlbXBsYXRlIGZvciBlYWNoIGl0ZW0gY2FyZC5cbiAgICogQ29udGV4dDogeyAkaW1wbGljaXQ6IEthbmJhbkl0ZW0sIGNvbHVtbjogS2FuYmFuQ29sdW1uLCBzZWxlY3RlZDogYm9vbGVhbiwgdG9nZ2xlOiAoKSA9PiB2b2lkIH1cbiAgICovXG4gIEBDb250ZW50Q2hpbGQoJ2l0ZW1UZW1wbGF0ZScpIGl0ZW1UZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgQFZpZXdDaGlsZCgnc2Nyb2xsQ29udGFpbmVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIHNjcm9sbENvbnRhaW5lcj86IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gIGNvbHVtbklkczogc3RyaW5nW10gPSBbXTtcblxuICAvLyBTY3JvbGwgc3RhdGVcbiAgaGFzSG9yaXpvbnRhbFNjcm9sbCA9IGZhbHNlO1xuICBzY3JvbGxQb3NpdGlvbjogJ3N0YXJ0JyB8ICdtaWRkbGUnIHwgJ2VuZCcgPSAnc3RhcnQnO1xuXG4gIC8vIFNlbGVjdGlvbiBzdGF0ZVxuICBwcml2YXRlIHNlbGVjdGVkSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLy8gQXV0by1zY3JvbGwgZHVyaW5nIGRyYWdcbiAgcHJpdmF0ZSBhdXRvU2Nyb2xsQWN0aXZlID0gZmFsc2U7XG4gIHByaXZhdGUgYXV0b1Njcm9sbFNwZWVkID0gMDtcbiAgcHJpdmF0ZSBhdXRvU2Nyb2xsUmFmOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHJlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZUNvbHVtbklkcygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNob3dTY3JvbGxIaW50cykge1xuICAgICAgdGhpcy5jaGVja1Njcm9sbCgpO1xuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5jaGVja1Njcm9sbCgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuc3RvcEF1dG9TY3JvbGwoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQ29sdW1uSWRzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmNoZWNrU2Nyb2xsKCksIDUwKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uSWRzKCk6IHZvaWQge1xuICAgIHRoaXMuY29sdW1uSWRzID0gdGhpcy5jb2x1bW5zLm1hcChjb2wgPT4gY29sLmlkKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFNFTEVDVElPTiA9PT09PT09PT09PT09PT09PT09PVxuXG4gIGlzU2VsZWN0ZWQoaXRlbTogS2FuYmFuSXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSWRzLmhhcyhpdGVtLmlkKTtcbiAgfVxuXG4gIHRvZ2dsZVNlbGVjdGlvbihpdGVtOiBLYW5iYW5JdGVtKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJZHMuaGFzKGl0ZW0uaWQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSWRzLmRlbGV0ZShpdGVtLmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZElkcy5hZGQoaXRlbS5pZCk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgLyoqIENsZWFyIGFsbCBzZWxlY3Rpb25zLiBDYW4gYmUgY2FsbGVkIGV4dGVybmFsbHkgdmlhIFZpZXdDaGlsZC4gKi9cbiAgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgLyoqIEdldCBjdXJyZW50IHNlbGVjdGVkIGl0ZW1zLiAqL1xuICBnZXRTZWxlY3RlZEl0ZW1zKCk6IEthbmJhbkl0ZW1bXSB7XG4gICAgY29uc3QgYWxsSXRlbXMgPSB0aGlzLmNvbHVtbnMuZmxhdE1hcChjb2wgPT4gY29sLml0ZW1zKTtcbiAgICByZXR1cm4gYWxsSXRlbXMuZmlsdGVyKGl0ZW0gPT4gdGhpcy5zZWxlY3RlZElkcy5oYXMoaXRlbS5pZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCkpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgZm9yIGFuIGl0ZW0gKHVzZWQgaW4gdGhlIHRlbXBsYXRlKS4gKi9cbiAgZ2V0SXRlbUNvbnRleHQoaXRlbTogS2FuYmFuSXRlbSwgY29sdW1uOiBLYW5iYW5Db2x1bW4pOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IGl0ZW0sXG4gICAgICBjb2x1bW4sXG4gICAgICBzZWxlY3RlZDogdGhpcy5pc1NlbGVjdGVkKGl0ZW0pLFxuICAgICAgdG9nZ2xlOiAoKSA9PiB0aGlzLnRvZ2dsZVNlbGVjdGlvbihpdGVtKVxuICAgIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBTQ1JPTEwgPT09PT09PT09PT09PT09PT09PT1cblxuICBvblNjcm9sbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrU2Nyb2xsKCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrU2Nyb2xsKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5zY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBzY3JvbGxMZWZ0LCBzY3JvbGxXaWR0aCwgY2xpZW50V2lkdGggfSA9IGVsO1xuICAgIHRoaXMuaGFzSG9yaXpvbnRhbFNjcm9sbCA9IHNjcm9sbFdpZHRoID4gY2xpZW50V2lkdGggKyAyO1xuXG4gICAgaWYgKHNjcm9sbExlZnQgPD0gMikge1xuICAgICAgdGhpcy5zY3JvbGxQb3NpdGlvbiA9ICdzdGFydCc7XG4gICAgfSBlbHNlIGlmIChzY3JvbGxMZWZ0ICsgY2xpZW50V2lkdGggPj0gc2Nyb2xsV2lkdGggLSAyKSB7XG4gICAgICB0aGlzLnNjcm9sbFBvc2l0aW9uID0gJ2VuZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2Nyb2xsUG9zaXRpb24gPSAnbWlkZGxlJztcbiAgICB9XG4gIH1cblxuICBzY3JvbGxMZWZ0KCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5zY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbHVtbiA9IGVsLnF1ZXJ5U2VsZWN0b3IoJy5rYW5iYW4tY29sdW1uJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3Qgc2Nyb2xsQW1vdW50ID0gY29sdW1uID8gY29sdW1uLm9mZnNldFdpZHRoICsgMTYgOiAzMDA7XG4gICAgZWwuc2Nyb2xsQnkoeyBsZWZ0OiAtc2Nyb2xsQW1vdW50LCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gIH1cblxuICBzY3JvbGxSaWdodCgpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBjb2x1bW4gPSBlbC5xdWVyeVNlbGVjdG9yKCcua2FuYmFuLWNvbHVtbicpIGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHNjcm9sbEFtb3VudCA9IGNvbHVtbiA/IGNvbHVtbi5vZmZzZXRXaWR0aCArIDE2IDogMzAwO1xuICAgIGVsLnNjcm9sbEJ5KHsgbGVmdDogc2Nyb2xsQW1vdW50LCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBBVVRPLVNDUk9MTCBEVVJJTkcgRFJBRyA9PT09PT09PT09PT09PT09PT09PVxuXG4gIG9uRHJhZ01vdmVkKGV2ZW50OiBDZGtEcmFnTW92ZSk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5zY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHBvaW50ZXJYID0gZXZlbnQucG9pbnRlclBvc2l0aW9uLng7XG4gICAgY29uc3QgZWRnZVpvbmUgPSA4MDsgLy8gcGl4ZWxzIGZyb20gZWRnZSB0byB0cmlnZ2VyIHNjcm9sbFxuXG4gICAgaWYgKHBvaW50ZXJYIDwgcmVjdC5sZWZ0ICsgZWRnZVpvbmUpIHtcbiAgICAgIC8vIE5lYXIgbGVmdCBlZGdlXG4gICAgICBjb25zdCBwcm94aW1pdHkgPSAxIC0gKHBvaW50ZXJYIC0gcmVjdC5sZWZ0KSAvIGVkZ2Vab25lO1xuICAgICAgdGhpcy5hdXRvU2Nyb2xsU3BlZWQgPSAtTWF0aC5tYXgoMywgcHJveGltaXR5ICogMTUpO1xuICAgICAgdGhpcy5zdGFydEF1dG9TY3JvbGwoKTtcbiAgICB9IGVsc2UgaWYgKHBvaW50ZXJYID4gcmVjdC5yaWdodCAtIGVkZ2Vab25lKSB7XG4gICAgICAvLyBOZWFyIHJpZ2h0IGVkZ2VcbiAgICAgIGNvbnN0IHByb3hpbWl0eSA9IDEgLSAocmVjdC5yaWdodCAtIHBvaW50ZXJYKSAvIGVkZ2Vab25lO1xuICAgICAgdGhpcy5hdXRvU2Nyb2xsU3BlZWQgPSBNYXRoLm1heCgzLCBwcm94aW1pdHkgKiAxNSk7XG4gICAgICB0aGlzLnN0YXJ0QXV0b1Njcm9sbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3BBdXRvU2Nyb2xsKCk7XG4gICAgfVxuICB9XG5cbiAgb25EcmFnRW5kZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wQXV0b1Njcm9sbCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEF1dG9TY3JvbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b1Njcm9sbEFjdGl2ZSkgcmV0dXJuO1xuICAgIHRoaXMuYXV0b1Njcm9sbEFjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5ydW5BdXRvU2Nyb2xsKCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BBdXRvU2Nyb2xsKCk6IHZvaWQge1xuICAgIHRoaXMuYXV0b1Njcm9sbEFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuYXV0b1Njcm9sbFNwZWVkID0gMDtcbiAgICBpZiAodGhpcy5hdXRvU2Nyb2xsUmFmKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmF1dG9TY3JvbGxSYWYpO1xuICAgICAgdGhpcy5hdXRvU2Nyb2xsUmFmID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJ1bkF1dG9TY3JvbGwoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmF1dG9TY3JvbGxBY3RpdmUpIHJldHVybjtcbiAgICBjb25zdCBlbCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChlbCkge1xuICAgICAgZWwuc2Nyb2xsTGVmdCArPSB0aGlzLmF1dG9TY3JvbGxTcGVlZDtcbiAgICB9XG4gICAgdGhpcy5hdXRvU2Nyb2xsUmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMucnVuQXV0b1Njcm9sbCgpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IERSQUcgJiBEUk9QID09PT09PT09PT09PT09PT09PT09XG5cbiAgb25Ecm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxLYW5iYW5JdGVtW10+LCBjb2x1bW46IEthbmJhbkNvbHVtbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5hbGxvd0RyYWcpIHJldHVybjtcblxuICAgIGNvbnN0IHByZXZpb3VzQ29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5pZCA9PT0gZXZlbnQucHJldmlvdXNDb250YWluZXIuaWQpO1xuXG4gICAgaWYgKGV2ZW50LnByZXZpb3VzQ29udGFpbmVyID09PSBldmVudC5jb250YWluZXIpIHtcbiAgICAgIG1vdmVJdGVtSW5BcnJheShldmVudC5jb250YWluZXIuZGF0YSwgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNvbHVtbi5hbGxvd0Ryb3AgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICBpZiAoY29sdW1uLm1heEl0ZW1zICYmIGV2ZW50LmNvbnRhaW5lci5kYXRhLmxlbmd0aCA+PSBjb2x1bW4ubWF4SXRlbXMpIHJldHVybjtcblxuICAgICAgY29uc3QgaXRlbSA9IGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmRhdGFbZXZlbnQucHJldmlvdXNJbmRleF07XG5cbiAgICAgIHRyYW5zZmVyQXJyYXlJdGVtKFxuICAgICAgICBldmVudC5wcmV2aW91c0NvbnRhaW5lci5kYXRhLFxuICAgICAgICBldmVudC5jb250YWluZXIuZGF0YSxcbiAgICAgICAgZXZlbnQucHJldmlvdXNJbmRleCxcbiAgICAgICAgZXZlbnQuY3VycmVudEluZGV4XG4gICAgICApO1xuXG4gICAgICBpZiAocHJldmlvdXNDb2x1bW4pIHtcbiAgICAgICAgdGhpcy5pdGVtTW92ZWQuZW1pdCh7XG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBwcmV2aW91c0NvbHVtbixcbiAgICAgICAgICBjdXJyZW50Q29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgcHJldmlvdXNJbmRleDogZXZlbnQucHJldmlvdXNJbmRleCxcbiAgICAgICAgICBjdXJyZW50SW5kZXg6IGV2ZW50LmN1cnJlbnRJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkl0ZW1DbGljayhpdGVtOiBLYW5iYW5JdGVtKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtQ2xpY2tlZC5lbWl0KGl0ZW0pO1xuICB9XG5cbiAgb25BZGRJdGVtKGNvbHVtbjogS2FuYmFuQ29sdW1uKTogdm9pZCB7XG4gICAgdGhpcy5hZGRJdGVtLmVtaXQoY29sdW1uKTtcbiAgfVxuXG4gIG9uRWRpdENvbHVtbihjb2x1bW46IEthbmJhbkNvbHVtbik6IHZvaWQge1xuICAgIHRoaXMuZWRpdENvbHVtbi5lbWl0KGNvbHVtbik7XG4gIH1cblxuICBvbkRlbGV0ZUNvbHVtbihjb2x1bW46IEthbmJhbkNvbHVtbik6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlQ29sdW1uLmVtaXQoY29sdW1uKTtcbiAgfVxuXG4gIGNhblNob3dEZWxldGVCdXR0b24oY29sdW1uOiBLYW5iYW5Db2x1bW4pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2hvd0RlbGV0ZUJ1dHRvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmNhbkRlbGV0ZUNvbHVtbikge1xuICAgICAgcmV0dXJuIHRoaXMuY2FuRGVsZXRlQ29sdW1uKGNvbHVtbik7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0Q29sdW1uU3R5bGUoY29sdW1uOiBLYW5iYW5Db2x1bW4pOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAnbWluLXdpZHRoJzogdGhpcy5taW5Db2x1bW5XaWR0aCxcbiAgICAgICdtYXgtd2lkdGgnOiB0aGlzLm1heENvbHVtbldpZHRoLFxuICAgICAgJ2JvcmRlci10b3AnOiBjb2x1bW4uY29sb3IgPyBgM3B4IHNvbGlkICR7Y29sdW1uLmNvbG9yfWAgOiAnM3B4IHNvbGlkICNkZWUyZTYnXG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImthbmJhbi1ib2FyZFwiPlxuICA8IS0tIFNjcm9sbCBoaW50IGFycm93cyAtLT5cbiAgPGRpdiBjbGFzcz1cImthbmJhbi1zY3JvbGwtY29udHJvbHNcIiAqbmdJZj1cInNob3dTY3JvbGxIaW50cyAmJiBoYXNIb3Jpem9udGFsU2Nyb2xsXCI+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJzY3JvbGxQb3NpdGlvbiAhPT0gJ3N0YXJ0J1wiXG4gICAgICBwQnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIlxuICAgICAgW3JvdW5kZWRdPVwidHJ1ZVwiXG4gICAgICBjbGFzcz1cInNjcm9sbC1oaW50IHNjcm9sbC1oaW50LWxlZnRcIlxuICAgICAgKGNsaWNrKT1cInNjcm9sbExlZnQoKVwiPlxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwic2Nyb2xsUG9zaXRpb24gIT09ICdlbmQnXCJcbiAgICAgIHBCdXR0b25cbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgaWNvbj1cInBpIHBpLWNoZXZyb24tcmlnaHRcIlxuICAgICAgW3JvdW5kZWRdPVwidHJ1ZVwiXG4gICAgICBjbGFzcz1cInNjcm9sbC1oaW50IHNjcm9sbC1oaW50LXJpZ2h0XCJcbiAgICAgIChjbGljayk9XCJzY3JvbGxSaWdodCgpXCI+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU2Nyb2xsYWJsZSBjb2x1bW5zIGNvbnRhaW5lciAtLT5cbiAgPGRpdiBjbGFzcz1cImthbmJhbi1jb2x1bW5zXCIgI3Njcm9sbENvbnRhaW5lciAoc2Nyb2xsKT1cIm9uU2Nyb2xsKClcIj5cbiAgICA8ZGl2IFxuICAgICAgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zXCIgXG4gICAgICBjbGFzcz1cImthbmJhbi1jb2x1bW5cIlxuICAgICAgW3N0eWxlXT1cImdldENvbHVtblN0eWxlKGNvbHVtbilcIj5cbiAgICAgIFxuICAgICAgPCEtLSBDb2x1bW4gSGVhZGVyIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi1oZWFkZXJcIj5cbiAgICAgICAgPCEtLSBDdXN0b20gaGVhZGVyIHRlbXBsYXRlIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uSGVhZGVyVGVtcGxhdGU7IGVsc2UgZGVmYXVsdENvbHVtbkhlYWRlclwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY29sdW1uSGVhZGVyVGVtcGxhdGVcIlxuICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogY29sdW1uIH1cIj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0Q29sdW1uSGVhZGVyPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2x1bW4tdGl0bGVcIj5cbiAgICAgICAgICAgIDxpICpuZ0lmPVwiY29sdW1uLmljb25cIiBbY2xhc3NdPVwiJ3BpICcgKyBjb2x1bW4uaWNvblwiPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7IGNvbHVtbi50aXRsZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXRlbS1jb3VudFwiPnt7IGNvbHVtbi5pdGVtcy5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi1hY3Rpb25zXCI+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICAqbmdJZj1cInNob3dBZGRCdXR0b25cIlxuICAgICAgICAgICAgICBwQnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIGljb249XCJwaSBwaS1wbHVzXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zbSBwLWJ1dHRvbi1yb3VuZGVkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQWRkSXRlbShjb2x1bW4pXCJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidBZGQgaXRlbSdcIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RWRpdEJ1dHRvblwiXG4gICAgICAgICAgICAgIHBCdXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXBlbmNpbFwiIFxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24tc20gcC1idXR0b24tcm91bmRlZFwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJvbkVkaXRDb2x1bW4oY29sdW1uKVwiXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCInRWRpdCBjb2x1bW4nXCJcbiAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICpuZ0lmPVwiY2FuU2hvd0RlbGV0ZUJ1dHRvbihjb2x1bW4pXCJcbiAgICAgICAgICAgICAgcEJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXNtIHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tZGFuZ2VyXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlQ29sdW1uKGNvbHVtbilcIlxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ0RlbGV0ZSBjb2x1bW4nXCJcbiAgICAgICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCI+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIENvbHVtbiBDb250ZW50IC0tPlxuICAgICAgPGRpdiBcbiAgICAgICAgY2xhc3M9XCJjb2x1bW4tY29udGVudFwiXG4gICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgIFtpZF09XCJjb2x1bW4uaWRcIlxuICAgICAgICBbY2RrRHJvcExpc3REYXRhXT1cImNvbHVtbi5pdGVtc1wiXG4gICAgICAgIFtjZGtEcm9wTGlzdENvbm5lY3RlZFRvXT1cImNvbHVtbklkc1wiXG4gICAgICAgIChjZGtEcm9wTGlzdERyb3BwZWQpPVwib25Ecm9wKCRldmVudCwgY29sdW1uKVwiPlxuICAgICAgICBcbiAgICAgICAgPCEtLSBJdGVtcyAtLT5cbiAgICAgICAgPGRpdiBcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBjb2x1bW4uaXRlbXNcIlxuICAgICAgICAgIGNsYXNzPVwia2FuYmFuLWl0ZW1cIlxuICAgICAgICAgIFtjbGFzcy5rYW5iYW4taXRlbS0tc2VsZWN0ZWRdPVwic2VsZWN0YWJsZSAmJiBpc1NlbGVjdGVkKGl0ZW0pXCJcbiAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgW2Nka0RyYWdEaXNhYmxlZF09XCIhYWxsb3dEcmFnXCJcbiAgICAgICAgICAoY2RrRHJhZ01vdmVkKT1cIm9uRHJhZ01vdmVkKCRldmVudClcIlxuICAgICAgICAgIChjZGtEcmFnRW5kZWQpPVwib25EcmFnRW5kZWQoKVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uSXRlbUNsaWNrKGl0ZW0pXCI+XG4gICAgICAgICAgXG4gICAgICAgICAgPCEtLSBDdXN0b20gaXRlbSB0ZW1wbGF0ZSB3aXRoIHNlbGVjdGlvbiBjb250ZXh0IC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpdGVtVGVtcGxhdGU7IGVsc2UgZGVmYXVsdEl0ZW1cIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiaXRlbVRlbXBsYXRlXCJcbiAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJnZXRJdGVtQ29udGV4dChpdGVtLCBjb2x1bW4pXCI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRJdGVtPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tY29udGVudFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS10aXRsZVwiPnt7IGl0ZW0udGl0bGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cIml0ZW0uZGVzY3JpcHRpb25cIiBjbGFzcz1cIml0ZW0tZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICB7eyBpdGVtLmRlc2NyaXB0aW9uIH19XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS50YWdzICYmIGl0ZW0udGFncy5sZW5ndGggPiAwXCIgY2xhc3M9XCJpdGVtLXRhZ3NcIj5cbiAgICAgICAgICAgICAgICA8cC10YWcgXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGFnIG9mIGl0ZW0udGFnc1wiXG4gICAgICAgICAgICAgICAgICBbdmFsdWVdPVwidGFnLmxhYmVsXCJcbiAgICAgICAgICAgICAgICAgIFtzZXZlcml0eV09XCJ0YWcuc2V2ZXJpdHkgfHwgJ3NlY29uZGFyeSdcIlxuICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cIml0ZW0tdGFnXCI+XG4gICAgICAgICAgICAgICAgPC9wLXRhZz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgPCEtLSBEcmFnIFBsYWNlaG9sZGVyIC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLXBsYWNlaG9sZGVyXCIgKmNka0RyYWdQbGFjZWhvbGRlcj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBFbXB0eSBTdGF0ZSAtLT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImNvbHVtbi5pdGVtcy5sZW5ndGggPT09IDBcIiBjbGFzcz1cImVtcHR5LWNvbHVtblwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktaW5ib3hcIj48L2k+XG4gICAgICAgICAgPHA+e3sgZW1wdHlNZXNzYWdlIH19PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|
|
372
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2FuYmFuLWJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMtYWkvc3JjL2xpYi9jb21wb25lbnRzL2thbmJhbi1ib2FyZC9rYW5iYW4tYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy1haS9zcmMvbGliL2NvbXBvbmVudHMva2FuYmFuLWJvYXJkL2thbmJhbi1ib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFVLFlBQVksRUFDNUQsU0FBUyxFQUFnRCxZQUFZLEVBQ3RFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQTRCLGNBQWMsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0SCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUMxQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7OztBQWdEaEQsTUFBTSxPQUFPLG9CQUFvQjtJQXlEWDtJQUF3QjtJQUF3QztJQXhEM0UsT0FBTyxHQUFtQixFQUFFLENBQUM7SUFDN0IsWUFBWSxHQUFHLElBQUksQ0FBQztJQUNwQixTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDdEIsY0FBYyxHQUFHLEtBQUssQ0FBQztJQUN2QixnQkFBZ0IsR0FBRyxLQUFLLENBQUM7SUFDekIsZUFBZSxDQUFx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LE1BQU07Z0JBR0csZUFBZTtzQkFBeEIsTUFBTTtnQkFHK0Isb0JBQW9CO3NCQUF6RCxZQUFZO3VCQUFDLHNCQUFzQjtnQkFNTixZQUFZO3NCQUF6QyxZQUFZO3VCQUFDLGNBQWM7Z0JBRXFCLGVBQWU7c0JBQS9ELFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO2dCQW1EL0MsY0FBYztzQkFEYixZQUFZO3VCQUFDLGVBQWU7Z0JBTTdCLGNBQWM7c0JBRGIsWUFBWTt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LCBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgQ29udGVudENoaWxkLCBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIE5nWm9uZSwgSG9zdExpc3RlbmVyLCBDaGFuZ2VEZXRlY3RvclJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgQ2RrRHJhZ01vdmUsIERyYWdEcm9wTW9kdWxlLCBtb3ZlSXRlbUluQXJyYXksIHRyYW5zZmVyQXJyYXlJdGVtIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBCdXR0b25Nb2R1bGUgfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBDYXJkTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9jYXJkJztcbmltcG9ydCB7IFRhZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdGFnJztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEthbmJhbkNvbHVtbiB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGNvbG9yPzogc3RyaW5nO1xuICBpY29uPzogc3RyaW5nO1xuICBpdGVtczogS2FuYmFuSXRlbVtdO1xuICBtYXhJdGVtcz86IG51bWJlcjtcbiAgYWxsb3dEcm9wPzogYm9vbGVhbjtcbiAgbWV0YWRhdGE/OiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2FuYmFuSXRlbSB7XG4gIGlkOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICB0YWdzPzogS2FuYmFuVGFnW107XG4gIG1ldGFkYXRhPzogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEthbmJhblRhZyB7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIHNldmVyaXR5PzogJ3N1Y2Nlc3MnIHwgJ2luZm8nIHwgJ3dhcm4nIHwgJ2RhbmdlcicgfCAnc2Vjb25kYXJ5JyB8ICdjb250cmFzdCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2FuYmFuRHJvcEV2ZW50IHtcbiAgaXRlbTogS2FuYmFuSXRlbTtcbiAgcHJldmlvdXNDb2x1bW46IEthbmJhbkNvbHVtbjtcbiAgY3VycmVudENvbHVtbjogS2FuYmFuQ29sdW1uO1xuICBwcmV2aW91c0luZGV4OiBudW1iZXI7XG4gIGN1cnJlbnRJbmRleDogbnVtYmVyO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaWEta2FuYmFuLWJvYXJkJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBEcmFnRHJvcE1vZHVsZSxcbiAgICBCdXR0b25Nb2R1bGUsXG4gICAgQ2FyZE1vZHVsZSxcbiAgICBUYWdNb2R1bGUsXG4gICAgVG9vbHRpcE1vZHVsZVxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4va2FuYmFuLWJvYXJkLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4va2FuYmFuLWJvYXJkLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgS2FuYmFuQm9hcmRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIGNvbHVtbnM6IEthbmJhbkNvbHVtbltdID0gW107XG4gIEBJbnB1dCgpIGFsbG93UmVvcmRlciA9IHRydWU7XG4gIEBJbnB1dCgpIGFsbG93RHJhZyA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dBZGRCdXR0b24gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0VkaXRCdXR0b24gPSBmYWxzZTtcbiAgQElucHV0KCkgc2hvd0RlbGV0ZUJ1dHRvbiA9IGZhbHNlO1xuICBASW5wdXQoKSBjYW5EZWxldGVDb2x1bW4/OiAoY29sdW1uOiBLYW5iYW5Db2x1bW4pID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIGVtcHR5TWVzc2FnZSA9ICdObyBpdGVtcyc7XG4gIEBJbnB1dCgpIG1pbkNvbHVtbldpZHRoID0gJzI4MHB4JztcbiAgQElucHV0KCkgbWF4Q29sdW1uV2lkdGggPSAnMzUwcHgnO1xuXG4gIC8qKiBTaG93IHNjcm9sbCBoaW50IGFycm93cyB3aGVuIGNvbHVtbnMgb3ZlcmZsb3cgaG9yaXpvbnRhbGx5LiAqL1xuICBASW5wdXQoKSBzaG93U2Nyb2xsSGludHMgPSB0cnVlO1xuXG4gIC8qKiBFbmFibGUgaXRlbSBzZWxlY3Rpb24gbW9kZS4gQWRkcyBzZWxlY3RlZCBzdGF0ZSBtYW5hZ2VtZW50IGFuZCBDU1MgY2xhc3Mgb24gY2FyZHMuICovXG4gIEBJbnB1dCgpIHNlbGVjdGFibGUgPSBmYWxzZTtcblxuICBAT3V0cHV0KCkgaXRlbU1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcjxLYW5iYW5Ecm9wRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBpdGVtQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8S2FuYmFuSXRlbT4oKTtcbiAgQE91dHB1dCgpIGFkZEl0ZW0gPSBuZXcgRXZlbnRFbWl0dGVyPEthbmJhbkNvbHVtbj4oKTtcbiAgQE91dHB1dCgpIGVkaXRDb2x1bW4gPSBuZXcgRXZlbnRFbWl0dGVyPEthbmJhbkNvbHVtbj4oKTtcbiAgQE91dHB1dCgpIGRlbGV0ZUNvbHVtbiA9IG5ldyBFdmVudEVtaXR0ZXI8S2FuYmFuQ29sdW1uPigpO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gc2VsZWN0aW9uIGNoYW5nZXMuIFBheWxvYWQgaXMgdGhlIGZ1bGwgYXJyYXkgb2Ygc2VsZWN0ZWQgS2FuYmFuSXRlbXMuICovXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEthbmJhbkl0ZW1bXT4oKTtcblxuICAvKiogQ3VzdG9tIHRlbXBsYXRlIGZvciB0aGUgY29sdW1uIGhlYWRlci4gQ29udGV4dDogeyAkaW1wbGljaXQ6IEthbmJhbkNvbHVtbiB9ICovXG4gIEBDb250ZW50Q2hpbGQoJ2NvbHVtbkhlYWRlclRlbXBsYXRlJykgY29sdW1uSGVhZGVyVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gIC8qKlxuICAgKiBDdXN0b20gdGVtcGxhdGUgZm9yIGVhY2ggaXRlbSBjYXJkLlxuICAgKiBDb250ZXh0OiB7ICRpbXBsaWNpdDogS2FuYmFuSXRlbSwgY29sdW1uOiBLYW5iYW5Db2x1bW4sIHNlbGVjdGVkOiBib29sZWFuLCB0b2dnbGU6ICgpID0+IHZvaWQgfVxuICAgKi9cbiAgQENvbnRlbnRDaGlsZCgnaXRlbVRlbXBsYXRlJykgaXRlbVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAVmlld0NoaWxkKCdzY3JvbGxDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgc2Nyb2xsQ29udGFpbmVyPzogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG5cbiAgY29sdW1uSWRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8vIFNjcm9sbCBzdGF0ZVxuICBoYXNIb3Jpem9udGFsU2Nyb2xsID0gZmFsc2U7XG4gIHNjcm9sbFBvc2l0aW9uOiAnc3RhcnQnIHwgJ21pZGRsZScgfCAnZW5kJyA9ICdzdGFydCc7XG5cbiAgLyoqIER5bmFtaWMgdG9wIG9mZnNldCAoaW4gcHgpIGZvciBzY3JvbGwgaGludCBidXR0b25zIHNvIHRoZXkgZm9sbG93IHZlcnRpY2FsIHNjcm9sbC4gKi9cbiAgc2Nyb2xsSGludFRvcE9mZnNldDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLy8gU2VsZWN0aW9uIHN0YXRlXG4gIHByaXZhdGUgc2VsZWN0ZWRJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBBdXRvLXNjcm9sbCBkdXJpbmcgZHJhZ1xuICBwcml2YXRlIGF1dG9TY3JvbGxBY3RpdmUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBhdXRvU2Nyb2xsU3BlZWQgPSAwO1xuICBwcml2YXRlIGF1dG9TY3JvbGxSYWY6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgcmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lLCBwcml2YXRlIGVsUmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiwgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQ29sdW1uSWRzKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2hvd1Njcm9sbEhpbnRzKSB7XG4gICAgICB0aGlzLmNoZWNrU2Nyb2xsKCk7XG4gICAgICB0aGlzLnVwZGF0ZVNjcm9sbEhpbnRQb3NpdGlvbigpO1xuICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jaGVja1Njcm9sbCgpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTY3JvbGxIaW50UG9zaXRpb24oKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLnNjcm9sbENvbnRhaW5lci5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMuc3RvcEF1dG9TY3JvbGwoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnKVxuICBvbldpbmRvd1Njcm9sbCgpOiB2b2lkIHtcbiAgICB0aGlzLnVwZGF0ZVNjcm9sbEhpbnRQb3NpdGlvbigpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScpXG4gIG9uV2luZG93UmVzaXplKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlU2Nyb2xsSGludFBvc2l0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgdG9wIG9mZnNldCBmb3IgdGhlIHNjcm9sbCBoaW50IGJ1dHRvbnMgc28gdGhleSBzdGF5IHZpc2libGVcbiAgICogYXMgdGhlIHVzZXIgc2Nyb2xscyB2ZXJ0aWNhbGx5LiBVc2VzIHRoZSBib2FyZCdzIGJvdW5kaW5nIHJlY3QgcmVsYXRpdmUgdG9cbiAgICogdGhlIHZpZXdwb3J0IHRvIGRldGVybWluZSB0aGUgaWRlYWwgdmVydGljYWwgY2VudGVyIHdpdGhpbiB0aGUgdmlzaWJsZSBhcmVhLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVTY3JvbGxIaW50UG9zaXRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNob3dTY3JvbGxIaW50cyB8fCAhdGhpcy5oYXNIb3Jpem9udGFsU2Nyb2xsKSByZXR1cm47XG5cbiAgICBjb25zdCBib2FyZEVsID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5rYW5iYW4tYm9hcmQnKSBhcyBIVE1MRWxlbWVudDtcbiAgICBpZiAoIWJvYXJkRWwpIHJldHVybjtcblxuICAgIGNvbnN0IHJlY3QgPSBib2FyZEVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgLy8gVmlzaWJsZSBwb3J0aW9uIG9mIHRoZSBib2FyZCB3aXRoaW4gdGhlIHZpZXdwb3J0XG4gICAgY29uc3QgdmlzaWJsZVRvcCA9IE1hdGgubWF4KHJlY3QudG9wLCAwKTtcbiAgICBjb25zdCB2aXNpYmxlQm90dG9tID0gTWF0aC5taW4ocmVjdC5ib3R0b20sIHZpZXdwb3J0SGVpZ2h0KTtcbiAgICBjb25zdCB2aXNpYmxlSGVpZ2h0ID0gdmlzaWJsZUJvdHRvbSAtIHZpc2libGVUb3A7XG5cbiAgICBpZiAodmlzaWJsZUhlaWdodCA8PSAwKSB7XG4gICAgICAvLyBCb2FyZCBub3QgdmlzaWJsZSwgbm8gbmVlZCB0byB1cGRhdGVcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDZW50ZXIgb2YgdGhlIHZpc2libGUgcG9ydGlvbiByZWxhdGl2ZSB0byB0aGUgYm9hcmQncyB0b3BcbiAgICBjb25zdCB2aXNpYmxlQ2VudGVySW5WaWV3cG9ydCA9IHZpc2libGVUb3AgKyB2aXNpYmxlSGVpZ2h0IC8gMjtcbiAgICBjb25zdCB0b3BPZmZzZXQgPSB2aXNpYmxlQ2VudGVySW5WaWV3cG9ydCAtIHJlY3QudG9wO1xuXG4gICAgLy8gQXBwbHkgbWluaW11bSBkaXN0YW5jZSBmcm9tIHRoZSBib2FyZCB0b3AgKGUuZy4sIDEyMHB4KVxuICAgIGNvbnN0IG1pblRvcCA9IDEyMDtcbiAgICBjb25zdCBtYXhUb3AgPSByZWN0LmhlaWdodCAtIDYwO1xuICAgIGNvbnN0IGNsYW1wZWRPZmZzZXQgPSBNYXRoLm1heChtaW5Ub3AsIE1hdGgubWluKHRvcE9mZnNldCwgbWF4VG9wKSk7XG5cbiAgICB0aGlzLnNjcm9sbEhpbnRUb3BPZmZzZXQgPSBjbGFtcGVkT2Zmc2V0O1xuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlQ29sdW1uSWRzKCk7XG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmNoZWNrU2Nyb2xsKCksIDUwKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ29sdW1uSWRzKCk6IHZvaWQge1xuICAgIHRoaXMuY29sdW1uSWRzID0gdGhpcy5jb2x1bW5zLm1hcChjb2wgPT4gY29sLmlkKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IFNFTEVDVElPTiA9PT09PT09PT09PT09PT09PT09PVxuXG4gIGlzU2VsZWN0ZWQoaXRlbTogS2FuYmFuSXRlbSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSWRzLmhhcyhpdGVtLmlkKTtcbiAgfVxuXG4gIHRvZ2dsZVNlbGVjdGlvbihpdGVtOiBLYW5iYW5JdGVtKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJZHMuaGFzKGl0ZW0uaWQpKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkSWRzLmRlbGV0ZShpdGVtLmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZWxlY3RlZElkcy5hZGQoaXRlbS5pZCk7XG4gICAgfVxuICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgLyoqIENsZWFyIGFsbCBzZWxlY3Rpb25zLiBDYW4gYmUgY2FsbGVkIGV4dGVybmFsbHkgdmlhIFZpZXdDaGlsZC4gKi9cbiAgY2xlYXJTZWxlY3Rpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgIHRoaXMuZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICB9XG5cbiAgLyoqIEdldCBjdXJyZW50IHNlbGVjdGVkIGl0ZW1zLiAqL1xuICBnZXRTZWxlY3RlZEl0ZW1zKCk6IEthbmJhbkl0ZW1bXSB7XG4gICAgY29uc3QgYWxsSXRlbXMgPSB0aGlzLmNvbHVtbnMuZmxhdE1hcChjb2wgPT4gY29sLml0ZW1zKTtcbiAgICByZXR1cm4gYWxsSXRlbXMuZmlsdGVyKGl0ZW0gPT4gdGhpcy5zZWxlY3RlZElkcy5oYXMoaXRlbS5pZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5nZXRTZWxlY3RlZEl0ZW1zKCkpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgZm9yIGFuIGl0ZW0gKHVzZWQgaW4gdGhlIHRlbXBsYXRlKS4gKi9cbiAgZ2V0SXRlbUNvbnRleHQoaXRlbTogS2FuYmFuSXRlbSwgY29sdW1uOiBLYW5iYW5Db2x1bW4pOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAkaW1wbGljaXQ6IGl0ZW0sXG4gICAgICBjb2x1bW4sXG4gICAgICBzZWxlY3RlZDogdGhpcy5pc1NlbGVjdGVkKGl0ZW0pLFxuICAgICAgdG9nZ2xlOiAoKSA9PiB0aGlzLnRvZ2dsZVNlbGVjdGlvbihpdGVtKVxuICAgIH07XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBTQ1JPTEwgPT09PT09PT09PT09PT09PT09PT1cblxuICBvblNjcm9sbCgpOiB2b2lkIHtcbiAgICB0aGlzLmNoZWNrU2Nyb2xsKCk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrU2Nyb2xsKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5zY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgeyBzY3JvbGxMZWZ0LCBzY3JvbGxXaWR0aCwgY2xpZW50V2lkdGggfSA9IGVsO1xuICAgIHRoaXMuaGFzSG9yaXpvbnRhbFNjcm9sbCA9IHNjcm9sbFdpZHRoID4gY2xpZW50V2lkdGggKyAyO1xuXG4gICAgaWYgKHNjcm9sbExlZnQgPD0gMikge1xuICAgICAgdGhpcy5zY3JvbGxQb3NpdGlvbiA9ICdzdGFydCc7XG4gICAgfSBlbHNlIGlmIChzY3JvbGxMZWZ0ICsgY2xpZW50V2lkdGggPj0gc2Nyb2xsV2lkdGggLSAyKSB7XG4gICAgICB0aGlzLnNjcm9sbFBvc2l0aW9uID0gJ2VuZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2Nyb2xsUG9zaXRpb24gPSAnbWlkZGxlJztcbiAgICB9XG4gIH1cblxuICBzY3JvbGxMZWZ0KCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5zY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGNvbnN0IGNvbHVtbiA9IGVsLnF1ZXJ5U2VsZWN0b3IoJy5rYW5iYW4tY29sdW1uJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgY29uc3Qgc2Nyb2xsQW1vdW50ID0gY29sdW1uID8gY29sdW1uLm9mZnNldFdpZHRoICsgMTYgOiAzMDA7XG4gICAgZWwuc2Nyb2xsQnkoeyBsZWZ0OiAtc2Nyb2xsQW1vdW50LCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gIH1cblxuICBzY3JvbGxSaWdodCgpOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBjb2x1bW4gPSBlbC5xdWVyeVNlbGVjdG9yKCcua2FuYmFuLWNvbHVtbicpIGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHNjcm9sbEFtb3VudCA9IGNvbHVtbiA/IGNvbHVtbi5vZmZzZXRXaWR0aCArIDE2IDogMzAwO1xuICAgIGVsLnNjcm9sbEJ5KHsgbGVmdDogc2Nyb2xsQW1vdW50LCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PSBBVVRPLVNDUk9MTCBEVVJJTkcgRFJBRyA9PT09PT09PT09PT09PT09PT09PVxuXG4gIG9uRHJhZ01vdmVkKGV2ZW50OiBDZGtEcmFnTW92ZSk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5zY3JvbGxDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHBvaW50ZXJYID0gZXZlbnQucG9pbnRlclBvc2l0aW9uLng7XG4gICAgY29uc3QgZWRnZVpvbmUgPSA4MDsgLy8gcGl4ZWxzIGZyb20gZWRnZSB0byB0cmlnZ2VyIHNjcm9sbFxuXG4gICAgaWYgKHBvaW50ZXJYIDwgcmVjdC5sZWZ0ICsgZWRnZVpvbmUpIHtcbiAgICAgIC8vIE5lYXIgbGVmdCBlZGdlXG4gICAgICBjb25zdCBwcm94aW1pdHkgPSAxIC0gKHBvaW50ZXJYIC0gcmVjdC5sZWZ0KSAvIGVkZ2Vab25lO1xuICAgICAgdGhpcy5hdXRvU2Nyb2xsU3BlZWQgPSAtTWF0aC5tYXgoMywgcHJveGltaXR5ICogMTUpO1xuICAgICAgdGhpcy5zdGFydEF1dG9TY3JvbGwoKTtcbiAgICB9IGVsc2UgaWYgKHBvaW50ZXJYID4gcmVjdC5yaWdodCAtIGVkZ2Vab25lKSB7XG4gICAgICAvLyBOZWFyIHJpZ2h0IGVkZ2VcbiAgICAgIGNvbnN0IHByb3hpbWl0eSA9IDEgLSAocmVjdC5yaWdodCAtIHBvaW50ZXJYKSAvIGVkZ2Vab25lO1xuICAgICAgdGhpcy5hdXRvU2Nyb2xsU3BlZWQgPSBNYXRoLm1heCgzLCBwcm94aW1pdHkgKiAxNSk7XG4gICAgICB0aGlzLnN0YXJ0QXV0b1Njcm9sbCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0b3BBdXRvU2Nyb2xsKCk7XG4gICAgfVxuICB9XG5cbiAgb25EcmFnRW5kZWQoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wQXV0b1Njcm9sbCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEF1dG9TY3JvbGwoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYXV0b1Njcm9sbEFjdGl2ZSkgcmV0dXJuO1xuICAgIHRoaXMuYXV0b1Njcm9sbEFjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5ydW5BdXRvU2Nyb2xsKCk7XG4gIH1cblxuICBwcml2YXRlIHN0b3BBdXRvU2Nyb2xsKCk6IHZvaWQge1xuICAgIHRoaXMuYXV0b1Njcm9sbEFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuYXV0b1Njcm9sbFNwZWVkID0gMDtcbiAgICBpZiAodGhpcy5hdXRvU2Nyb2xsUmFmKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmF1dG9TY3JvbGxSYWYpO1xuICAgICAgdGhpcy5hdXRvU2Nyb2xsUmFmID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJ1bkF1dG9TY3JvbGwoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmF1dG9TY3JvbGxBY3RpdmUpIHJldHVybjtcbiAgICBjb25zdCBlbCA9IHRoaXMuc2Nyb2xsQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmIChlbCkge1xuICAgICAgZWwuc2Nyb2xsTGVmdCArPSB0aGlzLmF1dG9TY3JvbGxTcGVlZDtcbiAgICB9XG4gICAgdGhpcy5hdXRvU2Nyb2xsUmFmID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMucnVuQXV0b1Njcm9sbCgpKTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09IERSQUcgJiBEUk9QID09PT09PT09PT09PT09PT09PT09XG5cbiAgb25Ecm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxLYW5iYW5JdGVtW10+LCBjb2x1bW46IEthbmJhbkNvbHVtbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5hbGxvd0RyYWcpIHJldHVybjtcblxuICAgIGNvbnN0IHByZXZpb3VzQ29sdW1uID0gdGhpcy5jb2x1bW5zLmZpbmQoY29sID0+IGNvbC5pZCA9PT0gZXZlbnQucHJldmlvdXNDb250YWluZXIuaWQpO1xuXG4gICAgaWYgKGV2ZW50LnByZXZpb3VzQ29udGFpbmVyID09PSBldmVudC5jb250YWluZXIpIHtcbiAgICAgIG1vdmVJdGVtSW5BcnJheShldmVudC5jb250YWluZXIuZGF0YSwgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNvbHVtbi5hbGxvd0Ryb3AgPT09IGZhbHNlKSByZXR1cm47XG4gICAgICBpZiAoY29sdW1uLm1heEl0ZW1zICYmIGV2ZW50LmNvbnRhaW5lci5kYXRhLmxlbmd0aCA+PSBjb2x1bW4ubWF4SXRlbXMpIHJldHVybjtcblxuICAgICAgY29uc3QgaXRlbSA9IGV2ZW50LnByZXZpb3VzQ29udGFpbmVyLmRhdGFbZXZlbnQucHJldmlvdXNJbmRleF07XG5cbiAgICAgIHRyYW5zZmVyQXJyYXlJdGVtKFxuICAgICAgICBldmVudC5wcmV2aW91c0NvbnRhaW5lci5kYXRhLFxuICAgICAgICBldmVudC5jb250YWluZXIuZGF0YSxcbiAgICAgICAgZXZlbnQucHJldmlvdXNJbmRleCxcbiAgICAgICAgZXZlbnQuY3VycmVudEluZGV4XG4gICAgICApO1xuXG4gICAgICBpZiAocHJldmlvdXNDb2x1bW4pIHtcbiAgICAgICAgdGhpcy5pdGVtTW92ZWQuZW1pdCh7XG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBwcmV2aW91c0NvbHVtbixcbiAgICAgICAgICBjdXJyZW50Q29sdW1uOiBjb2x1bW4sXG4gICAgICAgICAgcHJldmlvdXNJbmRleDogZXZlbnQucHJldmlvdXNJbmRleCxcbiAgICAgICAgICBjdXJyZW50SW5kZXg6IGV2ZW50LmN1cnJlbnRJbmRleFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBvbkl0ZW1DbGljayhpdGVtOiBLYW5iYW5JdGVtKTogdm9pZCB7XG4gICAgdGhpcy5pdGVtQ2xpY2tlZC5lbWl0KGl0ZW0pO1xuICB9XG5cbiAgb25BZGRJdGVtKGNvbHVtbjogS2FuYmFuQ29sdW1uKTogdm9pZCB7XG4gICAgdGhpcy5hZGRJdGVtLmVtaXQoY29sdW1uKTtcbiAgfVxuXG4gIG9uRWRpdENvbHVtbihjb2x1bW46IEthbmJhbkNvbHVtbik6IHZvaWQge1xuICAgIHRoaXMuZWRpdENvbHVtbi5lbWl0KGNvbHVtbik7XG4gIH1cblxuICBvbkRlbGV0ZUNvbHVtbihjb2x1bW46IEthbmJhbkNvbHVtbik6IHZvaWQge1xuICAgIHRoaXMuZGVsZXRlQ29sdW1uLmVtaXQoY29sdW1uKTtcbiAgfVxuXG4gIGNhblNob3dEZWxldGVCdXR0b24oY29sdW1uOiBLYW5iYW5Db2x1bW4pOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuc2hvd0RlbGV0ZUJ1dHRvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh0aGlzLmNhbkRlbGV0ZUNvbHVtbikge1xuICAgICAgcmV0dXJuIHRoaXMuY2FuRGVsZXRlQ29sdW1uKGNvbHVtbik7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0Q29sdW1uU3R5bGUoY29sdW1uOiBLYW5iYW5Db2x1bW4pOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAnbWluLXdpZHRoJzogdGhpcy5taW5Db2x1bW5XaWR0aCxcbiAgICAgICdtYXgtd2lkdGgnOiB0aGlzLm1heENvbHVtbldpZHRoLFxuICAgICAgJ2JvcmRlci10b3AnOiBjb2x1bW4uY29sb3IgPyBgM3B4IHNvbGlkICR7Y29sdW1uLmNvbG9yfWAgOiAnM3B4IHNvbGlkICNkZWUyZTYnXG4gICAgfTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImthbmJhbi1ib2FyZFwiPlxuICA8IS0tIFNjcm9sbCBoaW50IGFycm93cyAtLT5cbiAgPGRpdiBjbGFzcz1cImthbmJhbi1zY3JvbGwtY29udHJvbHNcIiAqbmdJZj1cInNob3dTY3JvbGxIaW50cyAmJiBoYXNIb3Jpem9udGFsU2Nyb2xsXCI+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJzY3JvbGxQb3NpdGlvbiAhPT0gJ3N0YXJ0J1wiXG4gICAgICBwQnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLWxlZnRcIlxuICAgICAgW3JvdW5kZWRdPVwidHJ1ZVwiXG4gICAgICBjbGFzcz1cInNjcm9sbC1oaW50IHNjcm9sbC1oaW50LWxlZnRcIlxuICAgICAgW3N0eWxlLnRvcC5weF09XCJzY3JvbGxIaW50VG9wT2Zmc2V0XCJcbiAgICAgIChjbGljayk9XCJzY3JvbGxMZWZ0KClcIj5cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cInNjcm9sbFBvc2l0aW9uICE9PSAnZW5kJ1wiXG4gICAgICBwQnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGljb249XCJwaSBwaS1jaGV2cm9uLXJpZ2h0XCJcbiAgICAgIFtyb3VuZGVkXT1cInRydWVcIlxuICAgICAgY2xhc3M9XCJzY3JvbGwtaGludCBzY3JvbGwtaGludC1yaWdodFwiXG4gICAgICBbc3R5bGUudG9wLnB4XT1cInNjcm9sbEhpbnRUb3BPZmZzZXRcIlxuICAgICAgKGNsaWNrKT1cInNjcm9sbFJpZ2h0KClcIj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTY3JvbGxhYmxlIGNvbHVtbnMgY29udGFpbmVyIC0tPlxuICA8ZGl2IGNsYXNzPVwia2FuYmFuLWNvbHVtbnNcIiAjc2Nyb2xsQ29udGFpbmVyIChzY3JvbGwpPVwib25TY3JvbGwoKVwiPlxuICAgIDxkaXYgXG4gICAgICAqbmdGb3I9XCJsZXQgY29sdW1uIG9mIGNvbHVtbnNcIiBcbiAgICAgIGNsYXNzPVwia2FuYmFuLWNvbHVtblwiXG4gICAgICBbc3R5bGVdPVwiZ2V0Q29sdW1uU3R5bGUoY29sdW1uKVwiPlxuICAgICAgXG4gICAgICA8IS0tIENvbHVtbiBIZWFkZXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uLWhlYWRlclwiPlxuICAgICAgICA8IS0tIEN1c3RvbSBoZWFkZXIgdGVtcGxhdGUgLS0+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW5IZWFkZXJUZW1wbGF0ZTsgZWxzZSBkZWZhdWx0Q29sdW1uSGVhZGVyXCJcbiAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJjb2x1bW5IZWFkZXJUZW1wbGF0ZVwiXG4gICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBjb2x1bW4gfVwiPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRDb2x1bW5IZWFkZXI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtbi10aXRsZVwiPlxuICAgICAgICAgICAgPGkgKm5nSWY9XCJjb2x1bW4uaWNvblwiIFtjbGFzc109XCIncGkgJyArIGNvbHVtbi5pY29uXCI+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgY29sdW1uLnRpdGxlIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpdGVtLWNvdW50XCI+e3sgY29sdW1uLml0ZW1zLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sdW1uLWFjdGlvbnNcIj5cbiAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICpuZ0lmPVwic2hvd0FkZEJ1dHRvblwiXG4gICAgICAgICAgICAgIHBCdXR0b24gXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBcbiAgICAgICAgICAgICAgaWNvbj1cInBpIHBpLXBsdXNcIiBcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXNtIHAtYnV0dG9uLXJvdW5kZWRcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25BZGRJdGVtKGNvbHVtbilcIlxuICAgICAgICAgICAgICBbcFRvb2x0aXBdPVwiJ0FkZCBpdGVtJ1wiXG4gICAgICAgICAgICAgIHRvb2x0aXBQb3NpdGlvbj1cInRvcFwiPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIFxuICAgICAgICAgICAgICAqbmdJZj1cInNob3dFZGl0QnV0dG9uXCJcbiAgICAgICAgICAgICAgcEJ1dHRvbiBcbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiIFxuICAgICAgICAgICAgICBpY29uPVwicGkgcGktcGVuY2lsXCIgXG4gICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zbSBwLWJ1dHRvbi1yb3VuZGVkXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdENvbHVtbihjb2x1bW4pXCJcbiAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIidFZGl0IGNvbHVtbidcIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiBcbiAgICAgICAgICAgICAgKm5nSWY9XCJjYW5TaG93RGVsZXRlQnV0dG9uKGNvbHVtbilcIlxuICAgICAgICAgICAgICBwQnV0dG9uIFxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCIgXG4gICAgICAgICAgICAgIGljb249XCJwaSBwaS10cmFzaFwiIFxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXRleHQgcC1idXR0b24tc20gcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi1kYW5nZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGVDb2x1bW4oY29sdW1uKVwiXG4gICAgICAgICAgICAgIFtwVG9vbHRpcF09XCInRGVsZXRlIGNvbHVtbidcIlxuICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gQ29sdW1uIENvbnRlbnQgLS0+XG4gICAgICA8ZGl2IFxuICAgICAgICBjbGFzcz1cImNvbHVtbi1jb250ZW50XCJcbiAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgW2lkXT1cImNvbHVtbi5pZFwiXG4gICAgICAgIFtjZGtEcm9wTGlzdERhdGFdPVwiY29sdW1uLml0ZW1zXCJcbiAgICAgICAgW2Nka0Ryb3BMaXN0Q29ubmVjdGVkVG9dPVwiY29sdW1uSWRzXCJcbiAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvbkRyb3AoJGV2ZW50LCBjb2x1bW4pXCI+XG4gICAgICAgIFxuICAgICAgICA8IS0tIEl0ZW1zIC0tPlxuICAgICAgICA8ZGl2IFxuICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGNvbHVtbi5pdGVtc1wiXG4gICAgICAgICAgY2xhc3M9XCJrYW5iYW4taXRlbVwiXG4gICAgICAgICAgW2NsYXNzLmthbmJhbi1pdGVtLS1zZWxlY3RlZF09XCJzZWxlY3RhYmxlICYmIGlzU2VsZWN0ZWQoaXRlbSlcIlxuICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cIiFhbGxvd0RyYWdcIlxuICAgICAgICAgIChjZGtEcmFnTW92ZWQpPVwib25EcmFnTW92ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgKGNka0RyYWdFbmRlZCk9XCJvbkRyYWdFbmRlZCgpXCJcbiAgICAgICAgICAoY2xpY2spPVwib25JdGVtQ2xpY2soaXRlbSlcIj5cbiAgICAgICAgICBcbiAgICAgICAgICA8IS0tIEN1c3RvbSBpdGVtIHRlbXBsYXRlIHdpdGggc2VsZWN0aW9uIGNvbnRleHQgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIml0ZW1UZW1wbGF0ZTsgZWxzZSBkZWZhdWx0SXRlbVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtVGVtcGxhdGVcIlxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cImdldEl0ZW1Db250ZXh0KGl0ZW0sIGNvbHVtbilcIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdEl0ZW0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLXRpdGxlXCI+e3sgaXRlbS50aXRsZSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXRlbS5kZXNjcmlwdGlvblwiIGNsYXNzPVwiaXRlbS1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgIHt7IGl0ZW0uZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJpdGVtLnRhZ3MgJiYgaXRlbS50YWdzLmxlbmd0aCA+IDBcIiBjbGFzcz1cIml0ZW0tdGFnc1wiPlxuICAgICAgICAgICAgICAgIDxwLXRhZyBcbiAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB0YWcgb2YgaXRlbS50YWdzXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ0YWcubGFiZWxcIlxuICAgICAgICAgICAgICAgICAgW3NldmVyaXR5XT1cInRhZy5zZXZlcml0eSB8fCAnc2Vjb25kYXJ5J1wiXG4gICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwiaXRlbS10YWdcIj5cbiAgICAgICAgICAgICAgICA8L3AtdGFnPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICA8IS0tIERyYWcgUGxhY2Vob2xkZXIgLS0+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0tcGxhY2Vob2xkZXJcIiAqY2RrRHJhZ1BsYWNlaG9sZGVyPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEVtcHR5IFN0YXRlIC0tPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sdW1uLml0ZW1zLmxlbmd0aCA9PT0gMFwiIGNsYXNzPVwiZW1wdHktY29sdW1uXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmJveFwiPjwvaT5cbiAgICAgICAgICA8cD57eyBlbXB0eU1lc3NhZ2UgfX08L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|