ng-devui
Version:
DevUI components based on Angular
211 lines • 44.3 kB
JavaScript
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Host, HostBinding, Input, Renderer2, SkipSelf, } from '@angular/core';
import { I18nService } from 'ng-devui/i18n';
import { Subscription } from 'rxjs';
import { filter, map, switchMap, takeUntil, tap } from 'rxjs/operators';
import { ResizeDirective } from './resize.directive';
import { SplitterService } from './splitter.service';
import * as i0 from "@angular/core";
import * as i1 from "./splitter.service";
import * as i2 from "./resize.directive";
import * as i3 from "ng-devui/i18n";
import * as i4 from "@angular/common";
import * as i5 from "ng-devui/popover";
export class SplitterBarComponent {
set splitBarSize(size) {
this._splitBarSize = size;
this.renderer.setStyle(this.el.nativeElement, 'flex-basis', size);
}
get splitBarSize() {
return this._splitBarSize;
}
get class() {
let bindClass = 'devui-splitter-bar devui-splitter-bar-' + this.orientation;
if (!this.splitter.isStaticBar(this.index)) {
bindClass += ' resizable';
}
else {
this.renderer.setStyle(this.el.nativeElement, 'flex-basis', this.disabledBarSize);
}
return bindClass;
}
constructor(el, splitter, renderer, resize, cdr, cdrSelf, i18n) {
this.el = el;
this.splitter = splitter;
this.renderer = renderer;
this.resize = resize;
this.cdr = cdr;
this.cdrSelf = cdrSelf;
this.i18n = i18n;
this.subscriptions = new Subscription();
// 移动的时候,阻止事件冒泡
this.stopPropagation = ({ originalEvent: event }) => {
event.stopPropagation();
if (event.cancelable) {
event.preventDefault();
}
};
// 处理移动过程中的数据流, 合并到pressEvent事件流中
this.moveStream = (resize) => (mouseDown) => resize.dragEvent.pipe(takeUntil(resize.releaseEvent), map(({ pageX, pageY }) => ({
originalX: mouseDown.pageX,
originalY: mouseDown.pageY,
pageX,
pageY,
})));
this.splitter.paneChangeSubject.subscribe(() => {
this.initialCollapseStatus();
this.cdr.detectChanges();
this.cdrSelf.detectChanges();
});
this.splitterText = this.i18n.getI18nText().splitter;
this.subscriptions.add(this.i18n.langChange().subscribe((data) => {
this.splitterText = data.splitter;
}));
}
ngOnInit() {
let state;
const resizeListener = this.resize.pressEvent
.pipe(tap(this.stopPropagation), filter(() => this.splitter.isResizable(this.index)), tap(() => {
state = this.splitter.dragState(this.index);
}), switchMap(this.moveStream(this.resize)))
.subscribe(({ pageX, pageY, originalX, originalY }) => {
let distance;
if (this.orientation === 'vertical') {
distance = pageY - originalY;
}
else {
distance = pageX - originalX;
}
this.splitter.setSize(state, distance);
});
this.subscriptions.add(resizeListener);
}
ngAfterViewInit() {
this.initialCollapseStatus();
}
ngOnDestroy() {
this.subscriptions.unsubscribe();
this.splitter.paneChangeSubject.unsubscribe();
}
initialCollapseStatus() {
this.collapsePrePane(true);
this.collapseNextPane(true);
}
collapsePrePane(lockStatus) {
this.splitter.togglePane(this.index, this.index + 1, lockStatus);
this.toggleResize();
this.hidePrevIsCovered();
}
collapseNextPane(lockStatus) {
this.splitter.togglePane(this.index + 1, this.index, lockStatus);
this.toggleResize();
this.hideNextIsCovered();
}
queryPanes(index, nearIndex) {
const pane = this.splitter.getPane(index);
const nearPane = this.splitter.getPane(nearIndex);
return { pane, nearPane };
}
// 切换是否允许拖拽,收起时不能拖拽
toggleResize() {
const { pane, nearPane } = this.queryPanes(this.index, this.index + 1);
const isCollapsed = pane.collapsed || nearPane.collapsed;
if (isCollapsed) {
this.renderer.addClass(this.el.nativeElement, 'none-resizable');
}
else {
this.renderer.removeClass(this.el.nativeElement, 'none-resizable');
}
}
// 计算前面板收起操作样式
get prevClass() {
const { pane, nearPane } = this.queryPanes(this.index, this.index + 1);
this.preTip = pane.collapsed ? this.splitterText.expand : this.splitterText.collapse;
// 第一个面板或者其它面板折叠方向不是向后的显示操作按钮
const showIcon = pane.collapseDirection !== 'after' || this.index === 0;
return this.generateCollapseClass(pane, nearPane, showIcon);
}
// 计算相邻面板收起操作样式
get nextClass() {
const { pane, nearPane } = this.queryPanes(this.index + 1, this.index);
this.nextTip = pane.collapsed ? this.splitterText.expand : this.splitterText.collapse;
// 最后一个面板或者其它面板折叠方向不是向前的显示操作按钮
const showIcon = pane.collapseDirection !== 'before' || this.index + 1 === this.splitter.paneCount - 1;
return this.generateCollapseClass(pane, nearPane, showIcon);
}
// 生成拼接样式
generateClass(classes) {
return Object.keys(classes)
.filter((c) => classes[c])
.join(' ');
}
// 根据当前状态生成收起按钮样式
generateCollapseClass(pane, nearPane, showIcon) {
// 是否允许收起
const isCollapsible = pane.collapsible && showIcon;
// 当前收起状态
const isCollapsed = pane.collapsed;
// 一个pane收起的时候,隐藏相邻pane的收起按钮
const isNearPaneCollapsed = nearPane.collapsed;
return this.generateClass({
'devui-collapse': isCollapsible,
collapsed: isCollapsed,
hidden: isNearPaneCollapsed,
});
}
hidePrevIsCovered() {
const pane = this.splitter.getPane(this.index);
const prevBar = this.splitter.getBar(this.index - 1);
const prevBarDom = prevBar?.el.nativeElement.querySelector('.prev');
if (prevBarDom) {
const rules = [pane.collapsed, pane.collapsible, pane.collapseDirection === 'before'];
if (rules.includes(false)) {
prevBarDom.classList.remove('hidden');
}
else {
prevBarDom.classList.add('hidden');
}
}
}
hideNextIsCovered() {
const pane = this.splitter.getPane(this.index + 1);
const nextBar = this.splitter.getBar(this.index + 1);
const nextBarDom = nextBar?.el.nativeElement.querySelector('.next');
if (nextBarDom) {
const rules = [pane.collapsed, pane.collapsible, pane.collapseDirection === 'after'];
if (rules.includes(false)) {
nextBarDom.classList.remove('hidden');
}
else {
nextBarDom.classList.add('hidden');
}
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SplitterBarComponent, deps: [{ token: i0.ElementRef }, { token: i1.SplitterService }, { token: i0.Renderer2 }, { token: i2.ResizeDirective, host: true }, { token: i0.ChangeDetectorRef, skipSelf: true }, { token: i0.ChangeDetectorRef }, { token: i3.I18nService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SplitterBarComponent, selector: "d-splitter-bar", inputs: { index: "index", orientation: "orientation", showCollapseButton: "showCollapseButton", collapsePosLeft: "collapsePosLeft", collapsePosTop: "collapsePosTop", splitBarSize: "splitBarSize", disabledBarSize: "disabledBarSize" }, host: { properties: { "class": "this.class" } }, ngImport: i0, template: "<div\n class=\"prev\"\n *ngIf=\"showCollapseButton\"\n dPopover\n [style.left]=\"collapsePosLeft\"\n [style.top]=\"collapsePosTop\"\n [trigger]=\"'hover'\"\n [controlled]=\"true\"\n [ngClass]=\"prevClass\"\n [content]=\"preTip\"\n [showAnimation]=\"false\"\n [mouseEnterDelay]=\"100\"\n [mouseLeaveDelay]=\"0\"\n (click)=\"collapsePrePane()\"\n (touchstart)=\"collapsePrePane()\"\n></div>\n<div class=\"devui-resize-handle\"></div>\n<div\n class=\"next\"\n *ngIf=\"showCollapseButton\"\n dPopover\n [trigger]=\"'hover'\"\n [controlled]=\"true\"\n [ngClass]=\"nextClass\"\n [content]=\"nextTip\"\n (click)=\"collapseNextPane()\"\n (touchstart)=\"collapseNextPane()\"\n></div>\n", styles: [":host.devui-splitter-bar{background-color:var(--devui-dividing-line, #f0f0f0);display:flex;position:relative;align-items:center;justify-content:center;flex-grow:0;flex-shrink:0}:host.devui-splitter-bar .devui-collapse{background-color:var(--devui-line, #dbdbdb);position:absolute;z-index:15;cursor:pointer}:host.devui-splitter-bar .devui-collapse:before,:host.devui-splitter-bar .devui-collapse:after{content:\"\";width:10px;height:2px;background:#fff;display:block;position:absolute}:host.devui-splitter-bar .devui-collapse:hover{background-color:var(--devui-brand-hover, #3979f9)}:host.devui-splitter-bar-horizontal .devui-collapse{width:12px;height:30px}:host.devui-splitter-bar-horizontal .devui-collapse.prev.hidden,:host.devui-splitter-bar-horizontal .devui-collapse.next.hidden{display:none}:host.devui-splitter-bar-horizontal .devui-collapse.prev{border-radius:0 var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px) 0;left:100%}:host.devui-splitter-bar-horizontal .devui-collapse.prev:before,:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:before{top:9px;left:1px}:host.devui-splitter-bar-horizontal .devui-collapse.prev:before{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:before{transform:rotate(70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.prev:after,:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:after{top:18px;left:1px}:host.devui-splitter-bar-horizontal .devui-collapse.prev:after{transform:rotate(70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:after{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next{border-radius:var(--devui-border-radius-feedback, 4px) 0 0 var(--devui-border-radius-feedback, 4px);right:100%}:host.devui-splitter-bar-horizontal .devui-collapse.next:before,:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:before{top:9px;right:1px}:host.devui-splitter-bar-horizontal .devui-collapse.next:before{transform:rotate(70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:before{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next:after,:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:after{top:18px;right:1px}:host.devui-splitter-bar-horizontal .devui-collapse.next:after{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:after{transform:rotate(70deg)}:host.devui-splitter-bar-vertical .devui-collapse{height:12px;width:30px}:host.devui-splitter-bar-vertical .devui-collapse.prev.hidden,:host.devui-splitter-bar-vertical .devui-collapse.next.hidden{display:none}:host.devui-splitter-bar-vertical .devui-collapse.prev{border-radius:0 0 var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px);top:100%}:host.devui-splitter-bar-vertical .devui-collapse.prev:before,:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:before{bottom:5px;left:5px}:host.devui-splitter-bar-vertical .devui-collapse.prev:before{transform:rotate(-20deg)}:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:before{transform:rotate(20deg)}:host.devui-splitter-bar-vertical .devui-collapse.prev:after,:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:after{bottom:5px;left:14px}:host.devui-splitter-bar-vertical .devui-collapse.prev:after{transform:rotate(20deg)}:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:after{transform:rotate(-20deg)}:host.devui-splitter-bar-vertical .devui-collapse.next{border-radius:var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px) 0 0;bottom:100%}:host.devui-splitter-bar-vertical .devui-collapse.next:before,:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:before{top:5px;left:5px}:host.devui-splitter-bar-vertical .devui-collapse.next:before{transform:rotate(20deg)}:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:before{transform:rotate(-20deg);top:5px;left:5px}:host.devui-splitter-bar-vertical .devui-collapse.next:after,:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:after{top:5px;left:14px}:host.devui-splitter-bar-vertical .devui-collapse.next:after{transform:rotate(-20deg)}:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:after{transform:rotate(20deg)}:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):hover,:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):focus,:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):active,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):hover,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):focus,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):active{background-color:var(--devui-brand-hover, #3979f9)}:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):after,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):after{content:\"\";display:block;position:absolute;z-index:10}:host.devui-splitter-bar-horizontal.resizable{cursor:col-resize}:host.devui-splitter-bar-horizontal.resizable:after{cursor:col-resize;height:100%;width:10px;top:0}:host.devui-splitter-bar-vertical.resizable{cursor:row-resize}:host.devui-splitter-bar-vertical.resizable:after{cursor:row-resize;width:100%;height:10px;left:0}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SplitterBarComponent, decorators: [{
type: Component,
args: [{ selector: 'd-splitter-bar', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, template: "<div\n class=\"prev\"\n *ngIf=\"showCollapseButton\"\n dPopover\n [style.left]=\"collapsePosLeft\"\n [style.top]=\"collapsePosTop\"\n [trigger]=\"'hover'\"\n [controlled]=\"true\"\n [ngClass]=\"prevClass\"\n [content]=\"preTip\"\n [showAnimation]=\"false\"\n [mouseEnterDelay]=\"100\"\n [mouseLeaveDelay]=\"0\"\n (click)=\"collapsePrePane()\"\n (touchstart)=\"collapsePrePane()\"\n></div>\n<div class=\"devui-resize-handle\"></div>\n<div\n class=\"next\"\n *ngIf=\"showCollapseButton\"\n dPopover\n [trigger]=\"'hover'\"\n [controlled]=\"true\"\n [ngClass]=\"nextClass\"\n [content]=\"nextTip\"\n (click)=\"collapseNextPane()\"\n (touchstart)=\"collapseNextPane()\"\n></div>\n", styles: [":host.devui-splitter-bar{background-color:var(--devui-dividing-line, #f0f0f0);display:flex;position:relative;align-items:center;justify-content:center;flex-grow:0;flex-shrink:0}:host.devui-splitter-bar .devui-collapse{background-color:var(--devui-line, #dbdbdb);position:absolute;z-index:15;cursor:pointer}:host.devui-splitter-bar .devui-collapse:before,:host.devui-splitter-bar .devui-collapse:after{content:\"\";width:10px;height:2px;background:#fff;display:block;position:absolute}:host.devui-splitter-bar .devui-collapse:hover{background-color:var(--devui-brand-hover, #3979f9)}:host.devui-splitter-bar-horizontal .devui-collapse{width:12px;height:30px}:host.devui-splitter-bar-horizontal .devui-collapse.prev.hidden,:host.devui-splitter-bar-horizontal .devui-collapse.next.hidden{display:none}:host.devui-splitter-bar-horizontal .devui-collapse.prev{border-radius:0 var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px) 0;left:100%}:host.devui-splitter-bar-horizontal .devui-collapse.prev:before,:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:before{top:9px;left:1px}:host.devui-splitter-bar-horizontal .devui-collapse.prev:before{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:before{transform:rotate(70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.prev:after,:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:after{top:18px;left:1px}:host.devui-splitter-bar-horizontal .devui-collapse.prev:after{transform:rotate(70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.prev.collapsed:after{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next{border-radius:var(--devui-border-radius-feedback, 4px) 0 0 var(--devui-border-radius-feedback, 4px);right:100%}:host.devui-splitter-bar-horizontal .devui-collapse.next:before,:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:before{top:9px;right:1px}:host.devui-splitter-bar-horizontal .devui-collapse.next:before{transform:rotate(70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:before{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next:after,:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:after{top:18px;right:1px}:host.devui-splitter-bar-horizontal .devui-collapse.next:after{transform:rotate(-70deg)}:host.devui-splitter-bar-horizontal .devui-collapse.next.collapsed:after{transform:rotate(70deg)}:host.devui-splitter-bar-vertical .devui-collapse{height:12px;width:30px}:host.devui-splitter-bar-vertical .devui-collapse.prev.hidden,:host.devui-splitter-bar-vertical .devui-collapse.next.hidden{display:none}:host.devui-splitter-bar-vertical .devui-collapse.prev{border-radius:0 0 var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px);top:100%}:host.devui-splitter-bar-vertical .devui-collapse.prev:before,:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:before{bottom:5px;left:5px}:host.devui-splitter-bar-vertical .devui-collapse.prev:before{transform:rotate(-20deg)}:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:before{transform:rotate(20deg)}:host.devui-splitter-bar-vertical .devui-collapse.prev:after,:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:after{bottom:5px;left:14px}:host.devui-splitter-bar-vertical .devui-collapse.prev:after{transform:rotate(20deg)}:host.devui-splitter-bar-vertical .devui-collapse.prev.collapsed:after{transform:rotate(-20deg)}:host.devui-splitter-bar-vertical .devui-collapse.next{border-radius:var(--devui-border-radius-feedback, 4px) var(--devui-border-radius-feedback, 4px) 0 0;bottom:100%}:host.devui-splitter-bar-vertical .devui-collapse.next:before,:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:before{top:5px;left:5px}:host.devui-splitter-bar-vertical .devui-collapse.next:before{transform:rotate(20deg)}:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:before{transform:rotate(-20deg);top:5px;left:5px}:host.devui-splitter-bar-vertical .devui-collapse.next:after,:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:after{top:5px;left:14px}:host.devui-splitter-bar-vertical .devui-collapse.next:after{transform:rotate(-20deg)}:host.devui-splitter-bar-vertical .devui-collapse.next.collapsed:after{transform:rotate(20deg)}:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):hover,:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):focus,:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):active,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):hover,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):focus,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):active{background-color:var(--devui-brand-hover, #3979f9)}:host.devui-splitter-bar-horizontal.resizable:not(.none-resizable):after,:host.devui-splitter-bar-vertical.resizable:not(.none-resizable):after{content:\"\";display:block;position:absolute;z-index:10}:host.devui-splitter-bar-horizontal.resizable{cursor:col-resize}:host.devui-splitter-bar-horizontal.resizable:after{cursor:col-resize;height:100%;width:10px;top:0}:host.devui-splitter-bar-vertical.resizable{cursor:row-resize}:host.devui-splitter-bar-vertical.resizable:after{cursor:row-resize;width:100%;height:10px;left:0}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.SplitterService }, { type: i0.Renderer2 }, { type: i2.ResizeDirective, decorators: [{
type: Host
}] }, { type: i0.ChangeDetectorRef, decorators: [{
type: SkipSelf
}] }, { type: i0.ChangeDetectorRef }, { type: i3.I18nService }], propDecorators: { index: [{
type: Input
}], orientation: [{
type: Input
}], showCollapseButton: [{
type: Input
}], collapsePosLeft: [{
type: Input
}], collapsePosTop: [{
type: Input
}], splitBarSize: [{
type: Input
}], disabledBarSize: [{
type: Input
}], class: [{
type: HostBinding,
args: ['class']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXR0ZXItYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldnVpL3NwbGl0dGVyL3NwbGl0dGVyLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9kZXZ1aS9zcGxpdHRlci9zcGxpdHRlci1iYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFVBQVUsRUFDVixJQUFJLEVBQ0osV0FBVyxFQUNYLEtBQUssRUFHTCxTQUFTLEVBQ1QsUUFBUSxHQUNULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7QUFVckQsTUFBTSxPQUFPLG9CQUFvQjtJQVcvQixJQUNJLFlBQVksQ0FBQyxJQUFJO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBQ0QsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFHRCxJQUEwQixLQUFLO1FBQzdCLElBQUksU0FBUyxHQUFHLHdDQUF3QyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7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UGhDLFNBQVM7K0JBQ0UsZ0JBQWdCLG1CQUdULHVCQUF1QixDQUFDLE1BQU0sdUJBQzFCLEtBQUs7OzBCQThEdkIsSUFBSTs7MEJBQ0osUUFBUTttR0EzREYsS0FBSztzQkFBYixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFJRixZQUFZO3NCQURmLEtBQUs7Z0JBUUcsZUFBZTtzQkFBdkIsS0FBSztnQkFFb0IsS0FBSztzQkFBOUIsV0FBVzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEhvc3QsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2tpcFNlbGYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnbmctZGV2dWkvaTE4bic7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc3dpdGNoTWFwLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgUmVzaXplRGlyZWN0aXZlIH0gZnJvbSAnLi9yZXNpemUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgU3BsaXR0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9zcGxpdHRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3BsaXR0ZXJPcmllbnRhdGlvbiB9IGZyb20gJy4vc3BsaXR0ZXIudHlwZXMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLXNwbGl0dGVyLWJhcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NwbGl0dGVyLWJhci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc3BsaXR0ZXItYmFyLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgcHJlc2VydmVXaGl0ZXNwYWNlczogZmFsc2UsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTcGxpdHRlckJhckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICAvLyDlvZPliY1wYW5l57Si5byVXHJcbiAgQElucHV0KCkgaW5kZXg6IG51bWJlcjtcclxuICAvLyDnqpfmoLzmjpLliJfmlrnlkJFcclxuICBASW5wdXQoKSBvcmllbnRhdGlvbjogU3BsaXR0ZXJPcmllbnRhdGlvbjtcclxuICAvLyDmmK/lkKbmmL7npLrlsZXlvIAv5pS257yp5oyJ6ZKuXHJcbiAgQElucHV0KCkgc2hvd0NvbGxhcHNlQnV0dG9uO1xyXG4gIEBJbnB1dCgpIGNvbGxhcHNlUG9zTGVmdDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNvbGxhcHNlUG9zVG9wOiBzdHJpbmc7XHJcbiAgLy8g5YiG6ZqU5p2h5aSn5bCPXHJcbiAgX3NwbGl0QmFyU2l6ZTtcclxuICBASW5wdXQoKVxyXG4gIHNldCBzcGxpdEJhclNpemUoc2l6ZSkge1xyXG4gICAgdGhpcy5fc3BsaXRCYXJTaXplID0gc2l6ZTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUodGhpcy5lbC5uYXRpdmVFbGVtZW50LCAnZmxleC1iYXNpcycsIHNpemUpO1xyXG4gIH1cclxuICBnZXQgc3BsaXRCYXJTaXplKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NwbGl0QmFyU2l6ZTtcclxuICB9XHJcbiAgQElucHV0KCkgZGlzYWJsZWRCYXJTaXplO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJykgZ2V0IGNsYXNzKCkge1xyXG4gICAgbGV0IGJpbmRDbGFzcyA9ICdkZXZ1aS1zcGxpdHRlci1iYXIgZGV2dWktc3BsaXR0ZXItYmFyLScgKyB0aGlzLm9yaWVudGF0aW9uO1xyXG4gICAgaWYgKCF0aGlzLnNwbGl0dGVyLmlzU3RhdGljQmFyKHRoaXMuaW5kZXgpKSB7XHJcbiAgICAgIGJpbmRDbGFzcyArPSAnIHJlc2l6YWJsZSc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ2ZsZXgtYmFzaXMnLCB0aGlzLmRpc2FibGVkQmFyU2l6ZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYmluZENsYXNzO1xyXG4gIH1cclxuICAvLyDlm73pmYXljJbmlofmoYhcclxuICBzcGxpdHRlclRleHQ7XHJcbiAgLy8g5o+Q56S65YaF5a65XHJcbiAgcHJlVGlwO1xyXG4gIG5leHRUaXA7XHJcbiAgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAvLyDnp7vliqjnmoTml7blgJnvvIzpmLvmraLkuovku7blhpLms6FcclxuICBwcml2YXRlIHN0b3BQcm9wYWdhdGlvbiA9ICh7IG9yaWdpbmFsRXZlbnQ6IGV2ZW50IH0pID0+IHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgaWYgKGV2ZW50LmNhbmNlbGFibGUpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuICB9O1xyXG5cclxuICAvLyDlpITnkIbnp7vliqjov4fnqIvkuK3nmoTmlbDmja7mtYEsIOWQiOW5tuWIsHByZXNzRXZlbnTkuovku7bmtYHkuK1cclxuICBwcml2YXRlIG1vdmVTdHJlYW0gPSAocmVzaXplKSA9PiAobW91c2VEb3duKSA9PlxyXG4gICAgcmVzaXplLmRyYWdFdmVudC5waXBlKFxyXG4gICAgICB0YWtlVW50aWwocmVzaXplLnJlbGVhc2VFdmVudCksXHJcbiAgICAgIG1hcCgoeyBwYWdlWCwgcGFnZVkgfTogTW91c2VFdmVudCkgPT4gKHtcclxuICAgICAgICBvcmlnaW5hbFg6IG1vdXNlRG93bi5wYWdlWCxcclxuICAgICAgICBvcmlnaW5hbFk6IG1vdXNlRG93bi5wYWdlWSxcclxuICAgICAgICBwYWdlWCxcclxuICAgICAgICBwYWdlWSxcclxuICAgICAgfSkpXHJcbiAgICApO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBlbDogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgc3BsaXR0ZXI6IFNwbGl0dGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcclxuICAgIEBIb3N0KCkgcHJpdmF0ZSByZXNpemU6IFJlc2l6ZURpcmVjdGl2ZSxcclxuICAgIEBTa2lwU2VsZigpIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgY2RyU2VsZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGkxOG46IEkxOG5TZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnNwbGl0dGVyLnBhbmVDaGFuZ2VTdWJqZWN0LnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuaW5pdGlhbENvbGxhcHNlU3RhdHVzKCk7XHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgdGhpcy5jZHJTZWxmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5zcGxpdHRlclRleHQgPSB0aGlzLmkxOG4uZ2V0STE4blRleHQoKS5zcGxpdHRlcjtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXHJcbiAgICAgIHRoaXMuaTE4bi5sYW5nQ2hhbmdlKCkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zcGxpdHRlclRleHQgPSBkYXRhLnNwbGl0dGVyO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgbGV0IHN0YXRlO1xyXG4gICAgY29uc3QgcmVzaXplTGlzdGVuZXIgPSB0aGlzLnJlc2l6ZS5wcmVzc0V2ZW50XHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIHRhcCh0aGlzLnN0b3BQcm9wYWdhdGlvbiksXHJcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuc3BsaXR0ZXIuaXNSZXNpemFibGUodGhpcy5pbmRleCkpLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICBzdGF0ZSA9IHRoaXMuc3BsaXR0ZXIuZHJhZ1N0YXRlKHRoaXMuaW5kZXgpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCh0aGlzLm1vdmVTdHJlYW0odGhpcy5yZXNpemUpKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKHsgcGFnZVgsIHBhZ2VZLCBvcmlnaW5hbFgsIG9yaWdpbmFsWSB9KSA9PiB7XHJcbiAgICAgICAgbGV0IGRpc3RhbmNlO1xyXG4gICAgICAgIGlmICh0aGlzLm9yaWVudGF0aW9uID09PSAndmVydGljYWwnKSB7XHJcbiAgICAgICAgICBkaXN0YW5jZSA9IHBhZ2VZIC0gb3JpZ2luYWxZO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkaXN0YW5jZSA9IHBhZ2VYIC0gb3JpZ2luYWxYO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNwbGl0dGVyLnNldFNpemUoc3RhdGUsIGRpc3RhbmNlKTtcclxuICAgICAgfSk7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHJlc2l6ZUxpc3RlbmVyKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuaW5pdGlhbENvbGxhcHNlU3RhdHVzKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpIHtcclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5zcGxpdHRlci5wYW5lQ2hhbmdlU3ViamVjdC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgaW5pdGlhbENvbGxhcHNlU3RhdHVzKCkge1xyXG4gICAgdGhpcy5jb2xsYXBzZVByZVBhbmUodHJ1ZSk7XHJcbiAgICB0aGlzLmNvbGxhcHNlTmV4dFBhbmUodHJ1ZSk7XHJcbiAgfVxyXG5cclxuICBjb2xsYXBzZVByZVBhbmUobG9ja1N0YXR1cz8pIHtcclxuICAgIHRoaXMuc3BsaXR0ZXIudG9nZ2xlUGFuZSh0aGlzLmluZGV4LCB0aGlzLmluZGV4ICsgMSwgbG9ja1N0YXR1cyk7XHJcbiAgICB0aGlzLnRvZ2dsZVJlc2l6ZSgpO1xyXG4gICAgdGhpcy5oaWRlUHJldklzQ292ZXJlZCgpO1xyXG4gIH1cclxuXHJcbiAgY29sbGFwc2VOZXh0UGFuZShsb2NrU3RhdHVzPykge1xyXG4gICAgdGhpcy5zcGxpdHRlci50b2dnbGVQYW5lKHRoaXMuaW5kZXggKyAxLCB0aGlzLmluZGV4LCBsb2NrU3RhdHVzKTtcclxuICAgIHRoaXMudG9nZ2xlUmVzaXplKCk7XHJcbiAgICB0aGlzLmhpZGVOZXh0SXNDb3ZlcmVkKCk7XHJcbiAgfVxyXG5cclxuICBxdWVyeVBhbmVzKGluZGV4LCBuZWFySW5kZXgpIHtcclxuICAgIGNvbnN0IHBhbmUgPSB0aGlzLnNwbGl0dGVyLmdldFBhbmUoaW5kZXgpO1xyXG4gICAgY29uc3QgbmVhclBhbmUgPSB0aGlzLnNwbGl0dGVyLmdldFBhbmUobmVhckluZGV4KTtcclxuICAgIHJldHVybiB7IHBhbmUsIG5lYXJQYW5lIH07XHJcbiAgfVxyXG5cclxuICAvLyDliIfmjaLmmK/lkKblhYHorrjmi5bmi73vvIzmlLbotbfml7bkuI3og73mi5bmi71cclxuICB0b2dnbGVSZXNpemUoKSB7XHJcbiAgICBjb25zdCB7IHBhbmUsIG5lYXJQYW5lIH0gPSB0aGlzLnF1ZXJ5UGFuZXModGhpcy5pbmRleCwgdGhpcy5pbmRleCArIDEpO1xyXG4gICAgY29uc3QgaXNDb2xsYXBzZWQgPSBwYW5lLmNvbGxhcHNlZCB8fCBuZWFyUGFuZS5jb2xsYXBzZWQ7XHJcbiAgICBpZiAoaXNDb2xsYXBzZWQpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdub25lLXJlc2l6YWJsZScpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICdub25lLXJlc2l6YWJsZScpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8g6K6h566X5YmN6Z2i5p2/5pS26LW35pON5L2c5qC35byPXHJcbiAgZ2V0IHByZXZDbGFzcygpIHtcclxuICAgIGNvbnN0IHsgcGFuZSwgbmVhclBhbmUgfSA9IHRoaXMucXVlcnlQYW5lcyh0aGlzLmluZGV4LCB0aGlzLmluZGV4ICsgMSk7XHJcbiAgICB0aGlzLnByZVRpcCA9IHBhbmUuY29sbGFwc2VkID8gdGhpcy5zcGxpdHRlclRleHQuZXhwYW5kIDogdGhpcy5zcGxpdHRlclRleHQuY29sbGFwc2U7XHJcbiAgICAvLyDnrKzkuIDkuKrpnaLmnb/miJbogIXlhbblroPpnaLmnb/mipjlj6DmlrnlkJHkuI3mmK/lkJHlkI7nmoTmmL7npLrmk43kvZzmjInpkq5cclxuICAgIGNvbnN0IHNob3dJY29uID0gcGFuZS5jb2xsYXBzZURpcmVjdGlvbiAhPT0gJ2FmdGVyJyB8fCB0aGlzLmluZGV4ID09PSAwO1xyXG4gICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVDb2xsYXBzZUNsYXNzKHBhbmUsIG5lYXJQYW5lLCBzaG93SWNvbik7XHJcbiAgfVxyXG5cclxuICAvLyDorqHnrpfnm7jpgrvpnaLmnb/mlLbotbfmk43kvZzmoLflvI9cclxuICBnZXQgbmV4dENsYXNzKCkge1xyXG4gICAgY29uc3QgeyBwYW5lLCBuZWFyUGFuZSB9ID0gdGhpcy5xdWVyeVBhbmVzKHRoaXMuaW5kZXggKyAxLCB0aGlzLmluZGV4KTtcclxuICAgIHRoaXMubmV4dFRpcCA9IHBhbmUuY29sbGFwc2VkID8gdGhpcy5zcGxpdHRlclRleHQuZXhwYW5kIDogdGhpcy5zcGxpdHRlclRleHQuY29sbGFwc2U7XHJcbiAgICAvLyDmnIDlkI7kuIDkuKrpnaLmnb/miJbogIXlhbblroPpnaLmnb/mipjlj6DmlrnlkJHkuI3mmK/lkJHliY3nmoTmmL7npLrmk43kvZzmjInpkq5cclxuICAgIGNvbnN0IHNob3dJY29uID0gcGFuZS5jb2xsYXBzZURpcmVjdGlvbiAhPT0gJ2JlZm9yZScgfHwgdGhpcy5pbmRleCArIDEgPT09IHRoaXMuc3BsaXR0ZXIucGFuZUNvdW50IC0gMTtcclxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ29sbGFwc2VDbGFzcyhwYW5lLCBuZWFyUGFuZSwgc2hvd0ljb24pO1xyXG4gIH1cclxuXHJcbiAgLy8g55Sf5oiQ5ou85o6l5qC35byPXHJcbiAgZ2VuZXJhdGVDbGFzcyhjbGFzc2VzKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoY2xhc3NlcylcclxuICAgICAgLmZpbHRlcigoYykgPT4gY2xhc3Nlc1tjXSlcclxuICAgICAgLmpvaW4oJyAnKTtcclxuICB9XHJcblxyXG4gIC8vIOagueaNruW9k+WJjeeKtuaAgeeUn+aIkOaUtui1t+aMiemSruagt+W8j1xyXG4gIGdlbmVyYXRlQ29sbGFwc2VDbGFzcyhwYW5lLCBuZWFyUGFuZSwgc2hvd0ljb24pIHtcclxuICAgIC8vIOaYr+WQpuWFgeiuuOaUtui1t1xyXG4gICAgY29uc3QgaXNDb2xsYXBzaWJsZSA9IHBhbmUuY29sbGFwc2libGUgJiYgc2hvd0ljb247XHJcbiAgICAvLyDlvZPliY3mlLbotbfnirbmgIFcclxuICAgIGNvbnN0IGlzQ29sbGFwc2VkID0gcGFuZS5jb2xsYXBzZWQ7XHJcbiAgICAvLyDkuIDkuKpwYW5l5pS26LW355qE5pe25YCZ77yM6ZqQ6JeP55u46YK7cGFuZeeahOaUtui1t+aMiemSrlxyXG4gICAgY29uc3QgaXNOZWFyUGFuZUNvbGxhcHNlZCA9IG5lYXJQYW5lLmNvbGxhcHNlZDtcclxuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlQ2xhc3Moe1xyXG4gICAgICAnZGV2dWktY29sbGFwc2UnOiBpc0NvbGxhcHNpYmxlLFxyXG4gICAgICBjb2xsYXBzZWQ6IGlzQ29sbGFwc2VkLFxyXG4gICAgICBoaWRkZW46IGlzTmVhclBhbmVDb2xsYXBzZWQsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGhpZGVQcmV2SXNDb3ZlcmVkKCkge1xyXG4gICAgY29uc3QgcGFuZSA9IHRoaXMuc3BsaXR0ZXIuZ2V0UGFuZSh0aGlzLmluZGV4KTtcclxuICAgIGNvbnN0IHByZXZCYXIgPSB0aGlzLnNwbGl0dGVyLmdldEJhcih0aGlzLmluZGV4IC0gMSk7XHJcbiAgICBjb25zdCBwcmV2QmFyRG9tID0gcHJldkJhcj8uZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcucHJldicpO1xyXG4gICAgaWYgKHByZXZCYXJEb20pIHtcclxuICAgICAgY29uc3QgcnVsZXMgPSBbcGFuZS5jb2xsYXBzZWQsIHBhbmUuY29sbGFwc2libGUsIHBhbmUuY29sbGFwc2VEaXJlY3Rpb24gPT09ICdiZWZvcmUnXTtcclxuICAgICAgaWYgKHJ1bGVzLmluY2x1ZGVzKGZhbHNlKSkge1xyXG4gICAgICAgIHByZXZCYXJEb20uY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcHJldkJhckRvbS5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGlkZU5leHRJc0NvdmVyZWQoKSB7XHJcbiAgICBjb25zdCBwYW5lID0gdGhpcy5zcGxpdHRlci5nZXRQYW5lKHRoaXMuaW5kZXggKyAxKTtcclxuICAgIGNvbnN0IG5leHRCYXIgPSB0aGlzLnNwbGl0dGVyLmdldEJhcih0aGlzLmluZGV4ICsgMSk7XHJcbiAgICBjb25zdCBuZXh0QmFyRG9tID0gbmV4dEJhcj8uZWwubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubmV4dCcpO1xyXG4gICAgaWYgKG5leHRCYXJEb20pIHtcclxuICAgICAgY29uc3QgcnVsZXMgPSBbcGFuZS5jb2xsYXBzZWQsIHBhbmUuY29sbGFwc2libGUsIHBhbmUuY29sbGFwc2VEaXJlY3Rpb24gPT09ICdhZnRlciddO1xyXG4gICAgICBpZiAocnVsZXMuaW5jbHVkZXMoZmFsc2UpKSB7XHJcbiAgICAgICAgbmV4dEJhckRvbS5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuZXh0QmFyRG9tLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxkaXZcbiAgY2xhc3M9XCJwcmV2XCJcbiAgKm5nSWY9XCJzaG93Q29sbGFwc2VCdXR0b25cIlxuICBkUG9wb3ZlclxuICBbc3R5bGUubGVmdF09XCJjb2xsYXBzZVBvc0xlZnRcIlxuICBbc3R5bGUudG9wXT1cImNvbGxhcHNlUG9zVG9wXCJcbiAgW3RyaWdnZXJdPVwiJ2hvdmVyJ1wiXG4gIFtjb250cm9sbGVkXT1cInRydWVcIlxuICBbbmdDbGFzc109XCJwcmV2Q2xhc3NcIlxuICBbY29udGVudF09XCJwcmVUaXBcIlxuICBbc2hvd0FuaW1hdGlvbl09XCJmYWxzZVwiXG4gIFttb3VzZUVudGVyRGVsYXldPVwiMTAwXCJcbiAgW21vdXNlTGVhdmVEZWxheV09XCIwXCJcbiAgKGNsaWNrKT1cImNvbGxhcHNlUHJlUGFuZSgpXCJcbiAgKHRvdWNoc3RhcnQpPVwiY29sbGFwc2VQcmVQYW5lKClcIlxuPjwvZGl2PlxuPGRpdiBjbGFzcz1cImRldnVpLXJlc2l6ZS1oYW5kbGVcIj48L2Rpdj5cbjxkaXZcbiAgY2xhc3M9XCJuZXh0XCJcbiAgKm5nSWY9XCJzaG93Q29sbGFwc2VCdXR0b25cIlxuICBkUG9wb3ZlclxuICBbdHJpZ2dlcl09XCInaG92ZXInXCJcbiAgW2NvbnRyb2xsZWRdPVwidHJ1ZVwiXG4gIFtuZ0NsYXNzXT1cIm5leHRDbGFzc1wiXG4gIFtjb250ZW50XT1cIm5leHRUaXBcIlxuICAoY2xpY2spPVwiY29sbGFwc2VOZXh0UGFuZSgpXCJcbiAgKHRvdWNoc3RhcnQpPVwiY29sbGFwc2VOZXh0UGFuZSgpXCJcbj48L2Rpdj5cbiJdfQ==