ng-devui
Version:
DevUI components based on Angular
503 lines • 76.1 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Directive, ElementRef, EventEmitter, HostBinding, Inject, Input, NgZone, Optional, Output, Renderer2, Self } from '@angular/core';
import { fromEvent, Subject, Subscription } from 'rxjs';
import { DragDropService } from '../services/drag-drop.service';
import { Utils } from '../shared/utils';
import { PreserveNextEventEmitter } from './../shared/preserve-next-event-emitter';
import { DragPreviewDirective } from './drag-preview.directive';
import * as i0 from "@angular/core";
import * as i1 from "../services/drag-drop.service";
import * as i2 from "./drag-preview.directive";
/**
* Makes an element draggable by adding the draggable html attribute
*/
export class DraggableDirective {
get disabled() {
return this._disabled;
}
set disabled(value) {
this._disabled = value;
this.draggable = !this._disabled;
}
constructor(el, renderer, dragDropService, ngZone, dragPreviewDirective, doc) {
this.el = el;
this.renderer = renderer;
this.dragDropService = dragDropService;
this.ngZone = ngZone;
this.dragPreviewDirective = dragPreviewDirective;
this.doc = doc;
this.draggable = true;
/**
* Currently not used
*/
this.dragEffect = 'move';
/**
* Defines compatible drag drop pairs. Values must match both in draggable and droppable.dropScope.
*/
this.dragScope = 'default';
this.dragHandleClass = 'drag-handle';
/**
* Event fired when Drag is started
*/
this.dragStartEvent = new EventEmitter();
/**
* @deprecated
* Event fired while the element is being dragged
* 为了性能优化,该函数废弃,请用(drag)自行监听, 如果不需要angular脏检测则最好用runOutsideAngular的addEventListener监听以获得好的性能
*/
this.dragEvent = new PreserveNextEventEmitter();
/**
* Event fired when dragged ends
*/
this.dragEndEvent = new EventEmitter();
this.dropEndEvent = new PreserveNextEventEmitter();
this.enableDragFollow = false; // 默认false使用浏览器H5API拖拽, 否则使用原dom定位偏移
this.dragItemParentName = ''; // 当前拖拽元素的类名或元素名称(类名需要加.),主要用于子节点的截取操作
this.dragItemChildrenName = ''; // 当前拖拽元素的子节点类名或元素名称(类名需要加.)
this.dragsSub = new Subscription();
this.destroyDragEndSub = new Subscription();
this.dragElShowHideEvent = new Subject();
this.beforeDragStartEvent = new Subject();
this.insertOriginPlaceholder = (directShow = true, updateService = true) => {
if (this.delayRemoveOriginPlaceholderTimer) {
clearTimeout(this.delayRemoveOriginPlaceholderTimer);
this.delayRemoveOriginPlaceholderTimer = undefined;
}
const node = this.document.createElement(this.originPlaceholder.tag || 'div');
const rect = this.el.nativeElement.getBoundingClientRect();
if (directShow) {
node.style.display = 'block';
}
else {
node.style.display = 'none';
}
node.style.width = rect.width + 'px';
node.style.height = rect.height + 'px';
node.classList.add('drag-origin-placeholder');
if (this.originPlaceholder.text) {
node.innerText = this.originPlaceholder.text;
}
if (this.originPlaceholder.style) {
Utils.addElStyles(node, this.originPlaceholder.style);
}
if (updateService) {
this.dragDropService.dragOriginPlaceholder = node;
this.dragDropService.dragOriginPlaceholderNextSibling = this.el.nativeElement.nextSibling;
}
else {
node.classList.add('side-drag-origin-placeholder');
const originCloneNode = this.el.nativeElement.cloneNode(true);
originCloneNode.style.margin = 0;
originCloneNode.style.pointerEvents = 'none';
originCloneNode.style.opacity = '0.3';
node.appendChild(originCloneNode);
}
this.dragOriginPlaceholder = node;
this.dragOriginPlaceholderNextSibling = this.el.nativeElement.nextSibling;
this.el.nativeElement.parentElement.insertBefore(node, this.el.nativeElement.nextSibling);
};
this.removeOriginPlaceholder = (updateService = true) => {
if (this.dragOriginPlaceholder) {
this.dragOriginPlaceholder.parentElement.removeChild(this.dragOriginPlaceholder);
}
if (updateService) {
this.dragDropService.dragOriginPlaceholder = undefined;
this.dragDropService.dragOriginPlaceholderNextSibling = undefined;
}
this.dragOriginPlaceholder = undefined;
this.dragOriginPlaceholderNextSibling = undefined;
};
this.delayRemoveOriginPlaceholder = (updateService = true) => {
const timeout = this.originPlaceholder.removeDelay;
const delayOriginPlaceholder = this.dragOriginPlaceholder;
const dragOriginPlaceholderNextSibling = this.findNextSibling(this.dragOriginPlaceholderNextSibling);
// 需要临时移动位置,保证被ngFor刷新之后位置是正确的
// ngFor刷新的原理是有变化的部分都刷新,夹在变化部分中间的内容将被刷到变化部分之后的位置,所以需要恢复位置
// setTimeout是等ngFor的View刷新, 后续需要订阅sortContainer的view的更新才需要重新恢复位置
if (delayOriginPlaceholder.parentElement.contains(dragOriginPlaceholderNextSibling)) {
delayOriginPlaceholder.parentElement.insertBefore(delayOriginPlaceholder, dragOriginPlaceholderNextSibling);
}
setTimeout(() => {
if (delayOriginPlaceholder.parentElement.contains(dragOriginPlaceholderNextSibling)) {
delayOriginPlaceholder.parentElement.insertBefore(delayOriginPlaceholder, dragOriginPlaceholderNextSibling);
}
delayOriginPlaceholder.classList.add('delay-deletion');
this.delayRemoveOriginPlaceholderTimer = setTimeout(() => {
delayOriginPlaceholder.parentElement.removeChild(delayOriginPlaceholder);
if (this.document.body.contains(this.el.nativeElement)) {
this.el.nativeElement.style.display = '';
this.dragDropService.dragElShowHideEvent.next(false);
}
}, timeout);
if (updateService) {
this.dragDropService.dragOriginPlaceholder = undefined;
this.dragDropService.dragOriginPlaceholderNextSibling = undefined;
}
this.dragOriginPlaceholder = undefined;
this.dragOriginPlaceholderNextSibling = undefined;
});
};
this.document = this.doc;
}
ngOnInit() {
this.ngZone.runOutsideAngular(() => {
this.dragsSub.add(fromEvent(this.el.nativeElement, 'mouseover').subscribe(event => this.mouseover(event)));
this.dragsSub.add(fromEvent(this.el.nativeElement, 'dragstart').subscribe(event => this.dragStart(event)));
this.dragsSub.add(fromEvent(this.el.nativeElement, 'dragend').subscribe(event => this.dragEnd(event)));
});
}
dropSubscription() {
const dragDropSub = this.dragDropService.newSubscription();
dragDropSub.add(this.dragDropService.dropEvent.subscribe((event) => {
this.mouseOverElement = undefined;
this.renderer.removeClass(this.el.nativeElement, this.dragOverClass);
this.dropEndEvent.emit(event);
// 兼容虚拟滚动后被销毁
if (this.isDestroyed) {
if (this.dropEndEvent.schedulerFns && this.dropEndEvent.schedulerFns.size > 0) {
this.dropEndEvent.forceCallback(event, true);
}
}
if (this.dragDropService.dragOriginPlaceholder) {
if (this.originPlaceholder && this.originPlaceholder.removeDelay > 0
&& !this.dragDropService.dropOnOrigin) { // 非drop到自己的情况
this.delayRemoveOriginPlaceholder();
}
else {
this.removeOriginPlaceholder();
}
this.dragDropService.draggedElIdentity = undefined;
}
this.dragDropService.subscription.unsubscribe();
}));
dragDropSub.add(this.dragDropService.dragElShowHideEvent.subscribe(this.dragElShowHideEvent));
}
ngAfterViewInit() {
this.applyDragHandleClass();
if (this.dragIdentity) {
if (this.dragDropService.draggedEl && this.dragIdentity === this.dragDropService.draggedElIdentity) {
if (this.originPlaceholder && this.originPlaceholder.show !== false) {
this.insertOriginPlaceholder();
}
this.dragDropService.draggedEl = this.el.nativeElement;
this.el.nativeElement.style.display = 'none'; // recovery don't need to emit event
}
}
}
ngOnDestroy() {
// 兼容虚拟滚动后被销毁
this.isDestroyed = true;
if (this.dragDropService.draggedEl === this.el.nativeElement) {
this.destroyDragEndSub = new Subscription();
this.destroyDragEndSub.add(fromEvent(this.el.nativeElement, 'dragend').subscribe(event => {
this.dragEnd(event);
if (this.dropEndEvent.schedulerFns && this.dropEndEvent.schedulerFns.size > 0) {
this.dropEndEvent.forceCallback(event, true);
}
this.destroyDragEndSub.unsubscribe();
this.destroyDragEndSub = undefined;
}));
if (this.originPlaceholder && this.originPlaceholder.show !== false
&& this.dragDropService.dragOriginPlaceholder && this.dragDropService.draggedElIdentity) {
// 如果有originPlaceholder 则销毁
this.removeOriginPlaceholder();
}
}
this.dragsSub.unsubscribe();
}
dragStart(e) {
if (this.allowDrag(e)) {
this.renderer.addClass(this.el.nativeElement, this.dragOverClass);
this.dragDropService.dragData = this.dragData;
this.dragDropService.scope = this.dragScope;
this.dragDropService.draggedEl = this.el.nativeElement;
this.dragDropService.draggedElIdentity = this.dragIdentity;
this.dragDropService.dragFollow = this.enableDragFollow;
this.dragDropService.dragFollowOptions = this.dragFollowOptions;
this.dragDropService.dragItemParentName = this.dragItemParentName;
this.dragDropService.dragItemChildrenName = this.dragItemChildrenName;
this.beforeDragStartEvent.next(true);
if (this.dragPreviewDirective && this.dragPreviewDirective.dragPreviewTemplate) {
this.dragDropService.dragFollow = true;
this.dragDropService.dragPreviewDirective = this.dragPreviewDirective;
}
if (this.batchDraggable) {
if (this.batchDraggable.dragData) {
// 有dragData证明被加入到了group里
if (this.dragDropService.batchDragData && this.dragDropService.batchDragData.length > 1) {
this.dragDropService.batchDragging = true;
this.dragDropService.batchDragStyle = this.batchDraggable.batchDragStyle;
}
}
else if (this.batchDraggable.batchDragLastOneAutoActiveEventKeys) {
const batchActiveAble = this.batchDraggable.batchDragLastOneAutoActiveEventKeys
.map(key => e[key])
.some(eventKey => eventKey === true);
if (batchActiveAble) {
if (this.dragDropService.batchDragData && this.dragDropService.batchDragData.length > 0) {
this.batchDraggable.active();
if (!this.batchDraggable.dragData) {
// 如果用户没做任何处理把项目加到组里则加到组里
this.batchDraggable.addToBatchGroup();
}
if (this.dragDropService.batchDragData.some(dragData => dragData.draggable === this)) {
this.dragDropService.batchDragging = true;
this.dragDropService.batchDragStyle = this.batchDraggable.batchDragStyle;
}
}
}
}
}
const targetOffset = this.el.nativeElement.getBoundingClientRect();
if (this.dragDropService.dragFollow) {
const mousePositionXY = this.mousePosition(e);
// 用于出现transform的场景position:fixed相对位置变更
const transformOffset = this.checkAndGetViewPointChange(this.el.nativeElement);
this.dragDropService.dragOffset = {
left: targetOffset.left,
top: targetOffset.top,
offsetLeft: mousePositionXY.x - targetOffset.left + transformOffset.offsetX,
offsetTop: mousePositionXY.y - targetOffset.top + transformOffset.offsetY,
width: targetOffset.width,
height: targetOffset.height
};
this.dragDropService.enableDraggedCloneNodeFollowMouse();
}
else {
this.dragDropService.dragOffset = {
left: targetOffset.left,
top: targetOffset.top,
offsetLeft: null,
offsetTop: null,
width: targetOffset.width,
height: targetOffset.height
};
}
if (this.originPlaceholder && this.originPlaceholder.show !== false) {
this.insertOriginPlaceholder(false);
}
if (this.dragDropService.batchDragging
&& this.dragDropService.batchDragData && this.dragDropService.batchDragData.length > 1) {
this.dragDropService.batchDragData.map(dragData => dragData.draggable)
.filter(draggable => draggable && draggable !== this)
.forEach((draggable) => {
if (draggable.originPlaceholder && draggable.originPlaceholder.show !== false) {
draggable.insertOriginPlaceholder(true, false);
draggable.el.nativeElement.style.display = 'none';
}
else {
setTimeout(() => { draggable.el.nativeElement.style.display = 'none'; });
}
});
}
// Firefox requires setData() to be called otherwise the drag does not work.
if (e.dataTransfer !== null) {
e.dataTransfer.setData('text', '');
}
e.dataTransfer.effectAllowed = this.dragEffect;
this.dropSubscription();
if (this.dragDropService.dragFollow) {
if (typeof DataTransfer.prototype.setDragImage === 'function') {
e.dataTransfer.setDragImage(this.dragDropService.dragEmptyImage, 0, 0);
}
else {
e.srcElement.style.display = 'none';
this.dragDropService.dragElShowHideEvent.next(false);
}
}
e.stopPropagation();
this.dragStartEvent.emit(e);
this.dragDropService.dragStartEvent.next(e);
}
else {
e.preventDefault();
}
}
dragEnd(e) {
this.renderer.removeClass(this.el.nativeElement, this.dragOverClass);
this.dragDropService.dragEndEvent.next(e);
this.mouseOverElement = undefined;
if (this.dragDropService.draggedEl) {
// 当dom被清除的的时候不会触发dragend,所以清理工作部分交给了drop,但是内部排序的时候dom不会被清理,dragend防止和drop重复操作清理动作
if (this.dragDropService.dragFollow) {
this.dragDropService.disableDraggedCloneNodeFollowMouse();
}
if (this.dragDropService.dragOriginPlaceholder) {
this.removeOriginPlaceholder();
}
if (this.dragDropService.batchDragging && this.dragDropService.batchDragData && this.dragDropService.batchDragData.length > 1) {
this.dragDropService.batchDragData.map(dragData => dragData.draggable)
.filter(draggable => draggable && draggable !== this)
.forEach((draggable) => {
if (draggable.originPlaceholder && draggable.originPlaceholder.show !== false) {
draggable.el.nativeElement.style.display = '';
draggable.removeOriginPlaceholder();
}
else {
draggable.el.nativeElement.style.display = '';
}
});
}
if (this.batchDraggable && !this.batchDraggable.batchDragActive) {
this.batchDraggable.removeFromBatchGroup();
this.dragDropService.batchDragging = false;
this.dragDropService.batchDragStyle = undefined;
}
if (this.dragDropService.subscription) {
this.dragDropService.subscription.unsubscribe();
}
this.dragDropService.dragData = undefined;
this.dragDropService.scope = undefined;
this.dragDropService.draggedEl = undefined;
this.dragDropService.dragFollow = undefined;
this.dragDropService.dragFollowOptions = undefined;
this.dragDropService.dragOffset = undefined;
this.dragDropService.draggedElIdentity = undefined;
this.dragDropService.dragPreviewDirective = undefined;
}
e.stopPropagation();
e.preventDefault();
this.dragEndEvent.emit(e);
}
mouseover(e) {
this.mouseOverElement = e.target;
}
allowDrag(e) {
if (!this.draggable) {
return false;
}
if (this.batchDraggable && !this.batchDraggable.allowAddToBatchGroup()) { // 批量拖拽判断group是否相同
return false;
}
if (this.dragHandle) {
if (e && e.fromTouch) {
return true;
} // from touchstart dispatch event
if (!this.mouseOverElement) {
return false;
}
return Utils.matches(this.mouseOverElement, this.dragHandle);
}
else {
return true;
}
}
applyDragHandleClass() {
const dragElement = this.getDragHandleElement();
if (!dragElement) {
return;
}
if (this.draggable) {
Utils.addClass(dragElement, this.dragHandleClass);
}
else {
Utils.removeClass(this.el, this.dragHandleClass);
}
}
getDragHandleElement() {
let dragElement = this.el;
if (this.dragHandle) {
dragElement = this.el.nativeElement.querySelector(this.dragHandle);
}
return dragElement;
}
mousePosition(event) {
return {
x: event.clientX,
y: event.clientY
};
}
findNextSibling(currentNextSibling) {
if (!this.dragDropService.batchDragData) {
return currentNextSibling;
}
else {
if (this.dragDropService.batchDragData
.map(dragData => dragData.draggable && dragData.draggable.el.nativeElement)
.indexOf(currentNextSibling) > -1) {
currentNextSibling = currentNextSibling.nextSibling;
}
return currentNextSibling;
}
}
checkAndGetViewPointChange(element) {
if (!element.parentNode) {
return null;
}
// 模拟一个元素测预测位置和最终位置是否符合,如果不符合则是有transform等造成的偏移
const elementPosition = element.getBoundingClientRect();
const testEl = this.document.createElement('div');
Utils.addElStyles(testEl, {
opacity: '0',
position: 'fixed',
top: elementPosition.top + 'px',
left: elementPosition.left + 'px',
width: '1px',
height: '1px',
zIndex: '-999999',
});
element.parentNode.appendChild(testEl);
const testElPosition = testEl.getBoundingClientRect();
element.parentNode.removeChild(testEl);
return {
offsetX: testElPosition.left - elementPosition.left,
offsetY: testElPosition.top - elementPosition.top
};
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DraggableDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.DragDropService }, { token: i0.NgZone }, { token: i2.DragPreviewDirective, optional: true, self: true }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DraggableDirective, selector: "[dDraggable]", inputs: { dragData: "dragData", dragHandle: "dragHandle", dragEffect: "dragEffect", dragScope: "dragScope", dragHandleClass: "dragHandleClass", dragOverClass: "dragOverClass", disabled: "disabled", enableDragFollow: "enableDragFollow", dragFollowOptions: "dragFollowOptions", originPlaceholder: "originPlaceholder", dragIdentity: "dragIdentity", dragItemParentName: "dragItemParentName", dragItemChildrenName: "dragItemChildrenName" }, outputs: { dragStartEvent: "dragStartEvent", dragEvent: "dragEvent", dragEndEvent: "dragEndEvent", dropEndEvent: "dropEndEvent" }, host: { properties: { "draggable": "this.draggable", "attr.data-drag-handle-selector": "this.dragHandle" } }, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DraggableDirective, decorators: [{
type: Directive,
args: [{
selector: '[dDraggable]'
}]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.DragDropService }, { type: i0.NgZone }, { type: i2.DragPreviewDirective, decorators: [{
type: Optional
}, {
type: Self
}] }, { type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }], propDecorators: { draggable: [{
type: HostBinding,
args: ['draggable']
}], dragData: [{
type: Input
}], dragHandle: [{
type: HostBinding,
args: ['attr.data-drag-handle-selector']
}, {
type: Input
}], dragEffect: [{
type: Input
}], dragScope: [{
type: Input
}], dragHandleClass: [{
type: Input
}], dragOverClass: [{
type: Input
}], dragStartEvent: [{
type: Output
}], dragEvent: [{
type: Output
}], dragEndEvent: [{
type: Output
}], dropEndEvent: [{
type: Output
}], disabled: [{
type: Input
}], enableDragFollow: [{
type: Input
}], dragFollowOptions: [{
type: Input
}], originPlaceholder: [{
type: Input
}], dragIdentity: [{
type: Input
}], dragItemParentName: [{
type: Input
}], dragItemChildrenName: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhZ2dhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2RldnVpL2RyYWdkcm9wL2RpcmVjdGl2ZXMvZHJhZ2dhYmxlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUNVLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUNsRCxXQUFXLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQXFCLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksRUFDekYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDbkYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7QUFLaEU7O0dBRUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBbUQ3QixJQUNXLFFBQVE7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFXLFFBQVEsQ0FBQyxLQUFjO1FBQ2hDLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ25DLENBQUM7SUE4QkQsWUFBbUIsRUFBYyxFQUFVLFFBQW1CLEVBQVUsZUFBZ0MsRUFBVSxNQUFjLEVBQ3pGLG9CQUEwQyxFQUE0QixHQUFRO1FBRGxHLE9BQUUsR0FBRixFQUFFLENBQVk7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QkFEbEIsV0FBVzt1QkFBQyxnQ0FBZ0M7O3NCQUM1QyxLQUFLO2dCQUtHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBS0csU0FBUztzQkFBakIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUlHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS0ksY0FBYztzQkFBdkIsTUFBTTtnQkFPRyxTQUFTO3NCQUFsQixNQUFNO2dCQUtHLFlBQVk7c0JBQXJCLE1BQU07Z0JBTUcsWUFBWTtzQkFBckIsTUFBTTtnQkFFSSxRQUFRO3NCQURsQixLQUFLO2dCQVdHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBR0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQU9HLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLG9CQUFvQjtzQkFBNUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZywgSW5qZWN0LCBJbnB1dCwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgUmVuZGVyZXIyLCBTZWxmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERyYWdEcm9wU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2RyYWctZHJvcC5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vc2hhcmVkL3V0aWxzJztcbmltcG9ydCB7IFByZXNlcnZlTmV4dEV2ZW50RW1pdHRlciB9IGZyb20gJy4vLi4vc2hhcmVkL3ByZXNlcnZlLW5leHQtZXZlbnQtZW1pdHRlcic7XG5pbXBvcnQgeyBEcmFnUHJldmlld0RpcmVjdGl2ZSB9IGZyb20gJy4vZHJhZy1wcmV2aWV3LmRpcmVjdGl2ZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tkRHJhZ2dhYmxlXSdcbn0pXG4vKipcbiAqIE1ha2VzIGFuIGVsZW1lbnQgZHJhZ2dhYmxlIGJ5IGFkZGluZyB0aGUgZHJhZ2dhYmxlIGh0bWwgYXR0cmlidXRlXG4gKi9cbmV4cG9ydCBjbGFzcyBEcmFnZ2FibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBIb3N0QmluZGluZygnZHJhZ2dhYmxlJykgZHJhZ2dhYmxlID0gdHJ1ZTtcbiAgLyoqXG4gICAqIFRoZSBkYXRhIHRoYXQgd2lsbCBiZSBhdmFpbGFibGUgdG8gdGhlIGRyb3BwYWJsZSBkaXJlY3RpdmUgb24gaXRzIGBkcm9wRXZlbnQoKWAgZXZlbnQuXG4gICAqL1xuICBASW5wdXQoKSBkcmFnRGF0YTtcblxuICAvKipcbiAgICogVGhlIHNlbGVjdG9yIHRoYXQgZGVmaW5lcyB0aGUgZHJhZyBIYW5kbGUuIElmIGRlZmluZWQgZHJhZyB3aWxsIG9ubHkgYmUgYWxsb3dlZCBpZiBkcmFnZ2VkIGZyb20gdGhlIHNlbGVjdG9yIGVsZW1lbnQuXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1kcmFnLWhhbmRsZS1zZWxlY3RvcicpIC8vIGhvc3QtYmluZGluZyBhdHRyaWJ1dGUgZm9yIGNvbW11bmljYXRlIHdpdGggdG91Y2ggc3VwcG9ydCBqc1xuICBASW5wdXQoKSBkcmFnSGFuZGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEN1cnJlbnRseSBub3QgdXNlZFxuICAgKi9cbiAgQElucHV0KCkgZHJhZ0VmZmVjdCA9ICdtb3ZlJztcblxuICAvKipcbiAgICogRGVmaW5lcyBjb21wYXRpYmxlIGRyYWcgZHJvcCBwYWlycy4gVmFsdWVzIG11c3QgbWF0Y2ggYm90aCBpbiBkcmFnZ2FibGUgYW5kIGRyb3BwYWJsZS5kcm9wU2NvcGUuXG4gICAqL1xuICBASW5wdXQoKSBkcmFnU2NvcGU6IHN0cmluZyB8IEFycmF5PHN0cmluZz4gPSAnZGVmYXVsdCc7XG5cbiAgQElucHV0KCkgZHJhZ0hhbmRsZUNsYXNzID0gJ2RyYWctaGFuZGxlJztcbiAgLyoqXG4gICAqIENTUyBjbGFzcyBhcHBsaWVkIG9uIHRoZSBkcmFnZ2FibGUgdGhhdCBpcyBhcHBsaWVkIHdoZW4gdGhlIGl0ZW0gaXMgYmVpbmcgZHJhZ2dlZC5cbiAgICovXG4gIEBJbnB1dCgpIGRyYWdPdmVyQ2xhc3M6IHN0cmluZztcblxuICAvKipcbiAgICogRXZlbnQgZmlyZWQgd2hlbiBEcmFnIGlzIHN0YXJ0ZWRcbiAgICovXG4gIEBPdXRwdXQoKSBkcmFnU3RhcnRFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICogRXZlbnQgZmlyZWQgd2hpbGUgdGhlIGVsZW1lbnQgaXMgYmVpb