ng-devui
Version:
DevUI components based on Angular
80 lines • 22.8 kB
JavaScript
import { Component, Input, TemplateRef } from '@angular/core';
import { QuadrantDiagramService } from '../quadrant-diagram.service';
import { LARGE_LABEL_SIZE_CENTER_POINT, NORMAL_LABEL_SIZE_CENTER_POINT, SMALL_LABEL_SIZE_CENTER_POINT } from '../quadrant.config';
import * as i0 from "@angular/core";
import * as i1 from "../quadrant-diagram.service";
import * as i2 from "@angular/common";
import * as i3 from "ng-devui/dragdrop";
import * as i4 from "ng-devui/progress";
import * as i5 from "ng-devui/popover";
export class QuadrantLabelComponent {
constructor(quadrantDiagramService) {
this.quadrantDiagramService = quadrantDiagramService;
}
ngOnChanges(changes) {
if (changes?.currentLabelSize) {
switch (this.currentLabelSize) {
case 'small':
this.currentCenterPoint = SMALL_LABEL_SIZE_CENTER_POINT;
this.currentLabelTemplate = this.smallLabelTemplate;
break;
case 'normal':
this.currentCenterPoint = NORMAL_LABEL_SIZE_CENTER_POINT;
this.currentLabelTemplate = this.normalLabelTemplate;
break;
default:
this.currentCenterPoint = LARGE_LABEL_SIZE_CENTER_POINT;
this.currentLabelTemplate = this.largeLabelTemplate;
}
}
}
/**
* @param offsetY the half height of label
*/
getLabelTopValue(yAxisValue, offsetY) {
return this.view.height - yAxisValue * this.axisConfigs.yTickSpacing - this.axisConfigs.originPosition.bottom - offsetY;
}
/**
* @param offsetX the half width of label
*/
getLabelLeftValue(xAxisValue, offsetX) {
return xAxisValue * this.axisConfigs.xTickSpacing + this.axisConfigs.originPosition.left - offsetX;
}
showAxisLine(x, y) {
const top = this.getLabelTopValue(y, 0);
const left = this.getLabelLeftValue(x, 0);
this.quadrantDiagramService.showAxisLine(left, top, this.diagramId, this.view, this.axisConfigs);
}
hideAxisLine() {
this.quadrantDiagramService.hideAxisLine(this.diagramId);
}
handleDropOutRegion(event) {
this.hideAxisLine();
this.quadrantDiagramService.setListPointerEvents(this.diagramId, '');
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QuadrantLabelComponent, deps: [{ token: i1.QuadrantDiagramService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: QuadrantLabelComponent, selector: "d-quadrant-label", inputs: { currentLabelSize: "currentLabelSize", labelData: "labelData", axisConfigs: "axisConfigs", view: "view", normalLabelTemplate: "normalLabelTemplate", largeLabelTemplate: "largeLabelTemplate", smallLabelTemplate: "smallLabelTemplate", dropScope: "dropScope", diagramId: "diagramId" }, usesOnChanges: true, ngImport: i0, template: "<ng-template\n [ngTemplateOutlet]=\"currentLabelTemplate ? currentLabelTemplate : defaultLabel\"\n [ngTemplateOutletContext]=\"{\n $implicit: this,\n labelData: labelData\n }\"\n>\n</ng-template>\n<ng-template #defaultLabel let-labelData=\"labelData\">\n <div\n dDraggable\n [dragScope]=\"dropScope\"\n [dragData]=\"{ item: item, parent: labelData }\"\n (dragEndEvent)=\"handleDropOutRegion($event)\"\n *ngFor=\"let item of labelData\"\n class=\"devui-list-style devui-{{ currentLabelSize }}-size\"\n [style.position]=\"'absolute'\"\n [style.top.px]=\"getLabelTopValue(item?.y, currentCenterPoint?.y)\"\n [style.left.px]=\"getLabelLeftValue(item?.x, currentCenterPoint?.x)\"\n dPopover\n [content]=\"item?.content\"\n [position]=\"'bottom'\"\n [controlled]=\"true\"\n [trigger]=\"'hover'\"\n (mouseover)=\"showAxisLine(item?.x, item?.y)\"\n (mouseout)=\"hideAxisLine()\"\n >\n <div *ngIf=\"currentLabelSize !== 'small'\" class=\"devui-label-style\">{{ item?.title }}</div>\n <ng-container *ngIf=\"currentLabelSize === 'large'\">\n <d-progress style=\"margin-top: -4px\" [percentage]=\"item?.progress\" [percentageText]=\"''\" [strokeColor]=\"'#3ECCA6'\" [height]=\"'4px'\">\n </d-progress>\n </ng-container>\n </div>\n <div\n class=\"devui-horizontal-line\"\n [style.width.px]=\"view.width - axisConfigs.originPosition.left - axisConfigs.axisMargin\"\n [style.left.px]=\"axisConfigs.originPosition.left\"\n [style.display]=\"'none'\"\n >\n <span class=\"devui-axis-value\" id=\"devui-label-y-axis-value\"></span>\n </div>\n <div\n class=\"devui-vertical-line\"\n [style.height.px]=\"view.height - axisConfigs.originPosition.bottom - axisConfigs.axisMargin\"\n [style.top.px]=\"axisConfigs.axisMargin\"\n [style.display]=\"'none'\"\n >\n <span class=\"devui-axis-value\" id=\"devui-label-x-axis-value\"></span>\n </div>\n</ng-template>\n", styles: [".devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-list-style{font-size:var(--devui-font-size-card-title, 14px);color:var(--devui-text, #191919);background:var(--devui-base-bg, #ffffff);box-shadow:var(--devui-shadow-length-base, 0 1px 6px 0) var(--devui-shadow, rgba(0, 0, 0, .16));border-radius:var(--devui-border-radius, 2px);z-index:10;cursor:grabbing}.devui-list-style:hover{color:var(--devui-brand, #0a59f7);box-shadow:var(--devui-shadow-length-hover, 0 8px 24px 0) var(--devui-hover-shadow, rgba(0, 0, 0, .16))}.devui-large-size{height:36px;line-height:36px;width:120px}.devui-normal-size{height:28px;line-height:28px;width:90px}.devui-small-size{background:var(--devui-success, #058358);border-radius:100%;height:12px;width:12px}.devui-label-style{padding:0 12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center}:host ::ng-deep .devui-progress{background:var(--devui-dividing-line, #f0f0f0)!important}.devui-horizontal-line{position:absolute;height:1px;border-bottom:1px dashed var(--devui-dividing-line, #f0f0f0)}.devui-vertical-line{position:absolute;width:1px;border-left:1px dashed var(--devui-dividing-line, #f0f0f0)}.devui-axis-value{color:var(--devui-aide-text, #595959);line-height:20px;padding:4px;font-size:var(--devui-font-size, 12px)}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.DraggableDirective, selector: "[dDraggable]", inputs: ["dragData", "dragHandle", "dragEffect", "dragScope", "dragHandleClass", "dragOverClass", "disabled", "enableDragFollow", "dragFollowOptions", "originPlaceholder", "dragIdentity", "dragItemParentName", "dragItemChildrenName"], outputs: ["dragStartEvent", "dragEvent", "dragEndEvent", "dropEndEvent"] }, { kind: "component", type: i4.ProgressComponent, selector: "d-progress", inputs: ["isDynamic", "percentage", "percentageText", "barbgcolor", "strokeColor", "height", "strokeWidth", "isCircle", "type", "showContent", "multiProgressConfig"] }, { kind: "directive", type: i5.PopoverDirective, selector: "[dPopover]", inputs: ["content", "controlled", "position", "showAnimation", "showAnimate", "scrollElement", "autoHideCoefficient", "appendToBody", "zIndex", "popType", "popMaxWidth", "trigger", "hoverToContent", "hoverDelayTime", "popoverStyle", "mouseEnterDelay", "mouseLeaveDelay", "visible"], exportAs: ["dPopover"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: QuadrantLabelComponent, decorators: [{
type: Component,
args: [{ selector: 'd-quadrant-label', template: "<ng-template\n [ngTemplateOutlet]=\"currentLabelTemplate ? currentLabelTemplate : defaultLabel\"\n [ngTemplateOutletContext]=\"{\n $implicit: this,\n labelData: labelData\n }\"\n>\n</ng-template>\n<ng-template #defaultLabel let-labelData=\"labelData\">\n <div\n dDraggable\n [dragScope]=\"dropScope\"\n [dragData]=\"{ item: item, parent: labelData }\"\n (dragEndEvent)=\"handleDropOutRegion($event)\"\n *ngFor=\"let item of labelData\"\n class=\"devui-list-style devui-{{ currentLabelSize }}-size\"\n [style.position]=\"'absolute'\"\n [style.top.px]=\"getLabelTopValue(item?.y, currentCenterPoint?.y)\"\n [style.left.px]=\"getLabelLeftValue(item?.x, currentCenterPoint?.x)\"\n dPopover\n [content]=\"item?.content\"\n [position]=\"'bottom'\"\n [controlled]=\"true\"\n [trigger]=\"'hover'\"\n (mouseover)=\"showAxisLine(item?.x, item?.y)\"\n (mouseout)=\"hideAxisLine()\"\n >\n <div *ngIf=\"currentLabelSize !== 'small'\" class=\"devui-label-style\">{{ item?.title }}</div>\n <ng-container *ngIf=\"currentLabelSize === 'large'\">\n <d-progress style=\"margin-top: -4px\" [percentage]=\"item?.progress\" [percentageText]=\"''\" [strokeColor]=\"'#3ECCA6'\" [height]=\"'4px'\">\n </d-progress>\n </ng-container>\n </div>\n <div\n class=\"devui-horizontal-line\"\n [style.width.px]=\"view.width - axisConfigs.originPosition.left - axisConfigs.axisMargin\"\n [style.left.px]=\"axisConfigs.originPosition.left\"\n [style.display]=\"'none'\"\n >\n <span class=\"devui-axis-value\" id=\"devui-label-y-axis-value\"></span>\n </div>\n <div\n class=\"devui-vertical-line\"\n [style.height.px]=\"view.height - axisConfigs.originPosition.bottom - axisConfigs.axisMargin\"\n [style.top.px]=\"axisConfigs.axisMargin\"\n [style.display]=\"'none'\"\n >\n <span class=\"devui-axis-value\" id=\"devui-label-x-axis-value\"></span>\n </div>\n</ng-template>\n", styles: [".devui-font-size-base{font-size:var(--devui-font-size, 12px)}.devui-font-base{font-size:var(--devui-font-size, 12px);font-weight:var(--devui-font-content-weight, normal);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-modal-title{font-size:var(--devui-font-size-modal-title, 18px)}.devui-font-modal-title{font-size:var(--devui-font-size-modal-title, 18px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-page-title{font-size:var(--devui-font-size-page-title, 16px)}.devui-font-page-title{font-size:var(--devui-font-size-page-title, 16px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-font-size-secondary-title{font-size:var(--devui-font-size-card-title, 14px)}.devui-font-secondary-title{font-size:var(--devui-font-size-card-title, 14px);font-weight:var(--devui-font-title-weight, bold);line-height:var(--devui-line-height-base, 1.5)}.devui-list-style{font-size:var(--devui-font-size-card-title, 14px);color:var(--devui-text, #191919);background:var(--devui-base-bg, #ffffff);box-shadow:var(--devui-shadow-length-base, 0 1px 6px 0) var(--devui-shadow, rgba(0, 0, 0, .16));border-radius:var(--devui-border-radius, 2px);z-index:10;cursor:grabbing}.devui-list-style:hover{color:var(--devui-brand, #0a59f7);box-shadow:var(--devui-shadow-length-hover, 0 8px 24px 0) var(--devui-hover-shadow, rgba(0, 0, 0, .16))}.devui-large-size{height:36px;line-height:36px;width:120px}.devui-normal-size{height:28px;line-height:28px;width:90px}.devui-small-size{background:var(--devui-success, #058358);border-radius:100%;height:12px;width:12px}.devui-label-style{padding:0 12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center}:host ::ng-deep .devui-progress{background:var(--devui-dividing-line, #f0f0f0)!important}.devui-horizontal-line{position:absolute;height:1px;border-bottom:1px dashed var(--devui-dividing-line, #f0f0f0)}.devui-vertical-line{position:absolute;width:1px;border-left:1px dashed var(--devui-dividing-line, #f0f0f0)}.devui-axis-value{color:var(--devui-aide-text, #595959);line-height:20px;padding:4px;font-size:var(--devui-font-size, 12px)}\n"] }]
}], ctorParameters: () => [{ type: i1.QuadrantDiagramService }], propDecorators: { currentLabelSize: [{
type: Input
}], labelData: [{
type: Input
}], axisConfigs: [{
type: Input
}], view: [{
type: Input
}], normalLabelTemplate: [{
type: Input
}], largeLabelTemplate: [{
type: Input
}], smallLabelTemplate: [{
type: Input
}], dropScope: [{
type: Input
}], diagramId: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhZHJhbnQtbGFiZWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vZGV2dWkvcXVhZHJhbnQtZGlhZ3JhbS9xdWFkcmFudC1sYWJlbC9xdWFkcmFudC1sYWJlbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9kZXZ1aS9xdWFkcmFudC1kaWFncmFtL3F1YWRyYW50LWxhYmVsL3F1YWRyYW50LWxhYmVsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUE0QixXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFckUsT0FBTyxFQUFFLDZCQUE2QixFQUFFLDhCQUE4QixFQUFFLDZCQUE2QixFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7QUFNbEksTUFBTSxPQUFPLHNCQUFzQjtJQWFqQyxZQUFvQixzQkFBOEM7UUFBOUMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtJQUFHLENBQUM7SUFFdEUsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxFQUFFLGdCQUFnQixFQUFFLENBQUM7WUFDOUIsUUFBUSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDaEMsS0FBSyxPQUFPO29CQUNWLElBQUksQ0FBQyxrQkFBa0IsR0FBRyw2QkFBNkIsQ0FBQztvQkFDeEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztvQkFDcEQsTUFBTTtnQkFDUixLQUFLLFFBQVE7b0JBQ1gsSUFBSSxDQUFDLGtCQUFrQixHQUFHLDhCQUE4QixDQUFDO29CQUN6RCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO29CQUNyRCxNQUFNO2dCQUNSO29CQUNFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyw2QkFBNkIsQ0FBQztvQkFDeEQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztZQUN0RCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7TUFFRTtJQUNGLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxPQUFPO1FBQ2xDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUM7SUFDMUgsQ0FBQztJQUVEOztNQUVFO0lBQ0YsaUJBQWlCLENBQUMsVUFBVSxFQUFFLE9BQU87UUFDbkMsT0FBTyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztJQUNyRyxDQUFDO0lBQ0QsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2YsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN4QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25HLENBQUM7SUFDRCxZQUFZO1FBQ1YsSUFBSSxDQUFDLHNCQUFzQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUNELG1CQUFtQixDQUFDLEtBQUs7UUFDdkIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7K0dBekRVLHNCQUFzQjttR0FBdEIsc0JBQXNCLGlYQ1RuQyxpNkRBa0RBOzs0RkR6Q2Esc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLGtCQUFrQjsyRkFLbkIsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBRdWFkcmFudERpYWdyYW1TZXJ2aWNlIH0gZnJvbSAnLi4vcXVhZHJhbnQtZGlhZ3JhbS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSUF4aXNDb25maWdzLCBJVmlld0NvbmZpZ3MgfSBmcm9tICcuLi9xdWFkcmFudC1kaWFncmFtLnR5cGUnO1xyXG5pbXBvcnQgeyBMQVJHRV9MQUJFTF9TSVpFX0NFTlRFUl9QT0lOVCwgTk9STUFMX0xBQkVMX1NJWkVfQ0VOVEVSX1BPSU5ULCBTTUFMTF9MQUJFTF9TSVpFX0NFTlRFUl9QT0lOVCB9IGZyb20gJy4uL3F1YWRyYW50LmNvbmZpZyc7XHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZC1xdWFkcmFudC1sYWJlbCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3F1YWRyYW50LWxhYmVsLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9xdWFkcmFudC1sYWJlbC5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUXVhZHJhbnRMYWJlbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XHJcbiAgQElucHV0KCkgY3VycmVudExhYmVsU2l6ZTtcclxuICBASW5wdXQoKSBsYWJlbERhdGE7XHJcbiAgQElucHV0KCkgYXhpc0NvbmZpZ3M6IElBeGlzQ29uZmlncztcclxuICBASW5wdXQoKSB2aWV3OiBJVmlld0NvbmZpZ3M7XHJcbiAgQElucHV0KCkgbm9ybWFsTGFiZWxUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBASW5wdXQoKSBsYXJnZUxhYmVsVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQElucHV0KCkgc21hbGxMYWJlbFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIGRyb3BTY29wZTtcclxuICBASW5wdXQoKSBkaWFncmFtSWQ7XHJcbiAgY3VycmVudENlbnRlclBvaW50O1xyXG4gIGN1cnJlbnRMYWJlbFRlbXBsYXRlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHF1YWRyYW50RGlhZ3JhbVNlcnZpY2U6IFF1YWRyYW50RGlhZ3JhbVNlcnZpY2UpIHt9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzPy5jdXJyZW50TGFiZWxTaXplKSB7XHJcbiAgICAgIHN3aXRjaCAodGhpcy5jdXJyZW50TGFiZWxTaXplKSB7XHJcbiAgICAgIGNhc2UgJ3NtYWxsJzpcclxuICAgICAgICB0aGlzLmN1cnJlbnRDZW50ZXJQb2ludCA9IFNNQUxMX0xBQkVMX1NJWkVfQ0VOVEVSX1BPSU5UO1xyXG4gICAgICAgIHRoaXMuY3VycmVudExhYmVsVGVtcGxhdGUgPSB0aGlzLnNtYWxsTGFiZWxUZW1wbGF0ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnbm9ybWFsJzpcclxuICAgICAgICB0aGlzLmN1cnJlbnRDZW50ZXJQb2ludCA9IE5PUk1BTF9MQUJFTF9TSVpFX0NFTlRFUl9QT0lOVDtcclxuICAgICAgICB0aGlzLmN1cnJlbnRMYWJlbFRlbXBsYXRlID0gdGhpcy5ub3JtYWxMYWJlbFRlbXBsYXRlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMuY3VycmVudENlbnRlclBvaW50ID0gTEFSR0VfTEFCRUxfU0laRV9DRU5URVJfUE9JTlQ7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50TGFiZWxUZW1wbGF0ZSA9IHRoaXMubGFyZ2VMYWJlbFRlbXBsYXRlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIEBwYXJhbSBvZmZzZXRZIHRoZSBoYWxmIGhlaWdodCBvZiBsYWJlbFxyXG4gICovXHJcbiAgZ2V0TGFiZWxUb3BWYWx1ZSh5QXhpc1ZhbHVlLCBvZmZzZXRZKSB7XHJcbiAgICByZXR1cm4gdGhpcy52aWV3LmhlaWdodCAtIHlBeGlzVmFsdWUgKiB0aGlzLmF4aXNDb25maWdzLnlUaWNrU3BhY2luZyAtIHRoaXMuYXhpc0NvbmZpZ3Mub3JpZ2luUG9zaXRpb24uYm90dG9tIC0gb2Zmc2V0WTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogQHBhcmFtIG9mZnNldFggdGhlIGhhbGYgd2lkdGggb2YgbGFiZWxcclxuICAqL1xyXG4gIGdldExhYmVsTGVmdFZhbHVlKHhBeGlzVmFsdWUsIG9mZnNldFgpIHtcclxuICAgIHJldHVybiB4QXhpc1ZhbHVlICogdGhpcy5heGlzQ29uZmlncy54VGlja1NwYWNpbmcgKyB0aGlzLmF4aXNDb25maWdzLm9yaWdpblBvc2l0aW9uLmxlZnQgLSBvZmZzZXRYO1xyXG4gIH1cclxuICBzaG93QXhpc0xpbmUoeCwgeSkge1xyXG4gICAgY29uc3QgdG9wID0gdGhpcy5nZXRMYWJlbFRvcFZhbHVlKHksIDApO1xyXG4gICAgY29uc3QgbGVmdCA9IHRoaXMuZ2V0TGFiZWxMZWZ0VmFsdWUoeCwgMCk7XHJcbiAgICB0aGlzLnF1YWRyYW50RGlhZ3JhbVNlcnZpY2Uuc2hvd0F4aXNMaW5lKGxlZnQsIHRvcCwgdGhpcy5kaWFncmFtSWQsIHRoaXMudmlldywgdGhpcy5heGlzQ29uZmlncyk7XHJcbiAgfVxyXG4gIGhpZGVBeGlzTGluZSgpIHtcclxuICAgIHRoaXMucXVhZHJhbnREaWFncmFtU2VydmljZS5oaWRlQXhpc0xpbmUodGhpcy5kaWFncmFtSWQpO1xyXG4gIH1cclxuICBoYW5kbGVEcm9wT3V0UmVnaW9uKGV2ZW50KSB7XHJcbiAgICB0aGlzLmhpZGVBeGlzTGluZSgpO1xyXG4gICAgdGhpcy5xdWFkcmFudERpYWdyYW1TZXJ2aWNlLnNldExpc3RQb2ludGVyRXZlbnRzKHRoaXMuZGlhZ3JhbUlkLCAnJyk7XHJcbiAgfVxyXG59XHJcbiIsIjxuZy10ZW1wbGF0ZVxuICBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXJyZW50TGFiZWxUZW1wbGF0ZSA/IGN1cnJlbnRMYWJlbFRlbXBsYXRlIDogZGVmYXVsdExhYmVsXCJcbiAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntcbiAgICAkaW1wbGljaXQ6IHRoaXMsXG4gICAgbGFiZWxEYXRhOiBsYWJlbERhdGFcbiAgfVwiXG4+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNkZWZhdWx0TGFiZWwgbGV0LWxhYmVsRGF0YT1cImxhYmVsRGF0YVwiPlxuICA8ZGl2XG4gICAgZERyYWdnYWJsZVxuICAgIFtkcmFnU2NvcGVdPVwiZHJvcFNjb3BlXCJcbiAgICBbZHJhZ0RhdGFdPVwieyBpdGVtOiBpdGVtLCBwYXJlbnQ6IGxhYmVsRGF0YSB9XCJcbiAgICAoZHJhZ0VuZEV2ZW50KT1cImhhbmRsZURyb3BPdXRSZWdpb24oJGV2ZW50KVwiXG4gICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbGFiZWxEYXRhXCJcbiAgICBjbGFzcz1cImRldnVpLWxpc3Qtc3R5bGUgZGV2dWkte3sgY3VycmVudExhYmVsU2l6ZSB9fS1zaXplXCJcbiAgICBbc3R5bGUucG9zaXRpb25dPVwiJ2Fic29sdXRlJ1wiXG4gICAgW3N0eWxlLnRvcC5weF09XCJnZXRMYWJlbFRvcFZhbHVlKGl0ZW0/LnksIGN1cnJlbnRDZW50ZXJQb2ludD8ueSlcIlxuICAgIFtzdHlsZS5sZWZ0LnB4XT1cImdldExhYmVsTGVmdFZhbHVlKGl0ZW0/LngsIGN1cnJlbnRDZW50ZXJQb2ludD8ueClcIlxuICAgIGRQb3BvdmVyXG4gICAgW2NvbnRlbnRdPVwiaXRlbT8uY29udGVudFwiXG4gICAgW3Bvc2l0aW9uXT1cIidib3R0b20nXCJcbiAgICBbY29udHJvbGxlZF09XCJ0cnVlXCJcbiAgICBbdHJpZ2dlcl09XCInaG92ZXInXCJcbiAgICAobW91c2VvdmVyKT1cInNob3dBeGlzTGluZShpdGVtPy54LCBpdGVtPy55KVwiXG4gICAgKG1vdXNlb3V0KT1cImhpZGVBeGlzTGluZSgpXCJcbiAgPlxuICAgIDxkaXYgKm5nSWY9XCJjdXJyZW50TGFiZWxTaXplICE9PSAnc21hbGwnXCIgY2xhc3M9XCJkZXZ1aS1sYWJlbC1zdHlsZVwiPnt7IGl0ZW0/LnRpdGxlIH19PC9kaXY+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRMYWJlbFNpemUgPT09ICdsYXJnZSdcIj5cbiAgICAgIDxkLXByb2dyZXNzIHN0eWxlPVwibWFyZ2luLXRvcDogLTRweFwiIFtwZXJjZW50YWdlXT1cIml0ZW0/LnByb2dyZXNzXCIgW3BlcmNlbnRhZ2VUZXh0XT1cIicnXCIgW3N0cm9rZUNvbG9yXT1cIicjM0VDQ0E2J1wiIFtoZWlnaHRdPVwiJzRweCdcIj5cbiAgICAgIDwvZC1wcm9ncmVzcz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDxkaXZcbiAgICBjbGFzcz1cImRldnVpLWhvcml6b250YWwtbGluZVwiXG4gICAgW3N0eWxlLndpZHRoLnB4XT1cInZpZXcud2lkdGggLSBheGlzQ29uZmlncy5vcmlnaW5Qb3NpdGlvbi5sZWZ0IC0gYXhpc0NvbmZpZ3MuYXhpc01hcmdpblwiXG4gICAgW3N0eWxlLmxlZnQucHhdPVwiYXhpc0NvbmZpZ3Mub3JpZ2luUG9zaXRpb24ubGVmdFwiXG4gICAgW3N0eWxlLmRpc3BsYXldPVwiJ25vbmUnXCJcbiAgPlxuICAgIDxzcGFuIGNsYXNzPVwiZGV2dWktYXhpcy12YWx1ZVwiIGlkPVwiZGV2dWktbGFiZWwteS1heGlzLXZhbHVlXCI+PC9zcGFuPlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwiZGV2dWktdmVydGljYWwtbGluZVwiXG4gICAgW3N0eWxlLmhlaWdodC5weF09XCJ2aWV3LmhlaWdodCAtIGF4aXNDb25maWdzLm9yaWdpblBvc2l0aW9uLmJvdHRvbSAtIGF4aXNDb25maWdzLmF4aXNNYXJnaW5cIlxuICAgIFtzdHlsZS50b3AucHhdPVwiYXhpc0NvbmZpZ3MuYXhpc01hcmdpblwiXG4gICAgW3N0eWxlLmRpc3BsYXldPVwiJ25vbmUnXCJcbiAgPlxuICAgIDxzcGFuIGNsYXNzPVwiZGV2dWktYXhpcy12YWx1ZVwiIGlkPVwiZGV2dWktbGFiZWwteC1heGlzLXZhbHVlXCI+PC9zcGFuPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=