UNPKG

@blare/angular2gridster

Version:

[![npm version](https://badge.fury.io/js/angular2gridster.svg)](https://badge.fury.io/js/angular2gridster)

487 lines 37.9 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,uselessCode} checked by tsc */ import { Directive, ElementRef, Input, Output, EventEmitter, NgZone } from '@angular/core'; import { fromEvent } from 'rxjs'; import { GridsterPrototypeService } from './gridster-prototype.service'; import { GridListItem } from '../gridList/GridListItem'; import { Draggable } from '../utils/draggable'; import { utils } from '../utils/utils'; var GridsterItemPrototypeDirective = /** @class */ (function () { function GridsterItemPrototypeDirective(zone, elementRef, gridsterPrototype) { this.zone = zone; this.elementRef = elementRef; this.gridsterPrototype = gridsterPrototype; this.drop = new EventEmitter(); this.start = new EventEmitter(); this.cancel = new EventEmitter(); this.enter = new EventEmitter(); this.out = new EventEmitter(); this.config = {}; this.x = 0; this.y = 0; this.autoSize = false; this.isDragging = false; this.subscribtions = []; this.item = (new GridListItem()).setFromGridsterItemPrototype(this); } Object.defineProperty(GridsterItemPrototypeDirective.prototype, "dragAndDrop", { // must be set to true because of item dragAndDrop configuration get: // must be set to true because of item dragAndDrop configuration /** * @return {?} */ function () { return true; }, enumerable: true, configurable: true }); Object.defineProperty(GridsterItemPrototypeDirective.prototype, "gridster", { get: /** * @return {?} */ function () { return this.dragContextGridster; }, enumerable: true, configurable: true }); /** * @return {?} */ GridsterItemPrototypeDirective.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.wSm = this.wSm || this.w; this.hSm = this.hSm || this.h; this.wMd = this.wMd || this.w; this.hMd = this.hMd || this.h; this.wLg = this.wLg || this.w; this.hLg = this.hLg || this.h; this.wXl = this.wXl || this.w; this.hXl = this.hXl || this.h; this.zone.runOutsideAngular(function () { _this.enableDragDrop(); }); }; /** * @return {?} */ GridsterItemPrototypeDirective.prototype.ngOnDestroy = /** * @return {?} */ function () { this.subscribtions.forEach(function (sub) { sub.unsubscribe(); }); }; /** * @param {?} gridster * @return {?} */ GridsterItemPrototypeDirective.prototype.onDrop = /** * @param {?} gridster * @return {?} */ function (gridster) { if (!this.config.helper) { this.$element.parentNode.removeChild(this.$element); } this.drop.emit({ item: this.item, gridster: gridster }); }; /** * @return {?} */ GridsterItemPrototypeDirective.prototype.onCancel = /** * @return {?} */ function () { this.cancel.emit({ item: this.item }); }; /** * @param {?} gridster * @return {?} */ GridsterItemPrototypeDirective.prototype.onEnter = /** * @param {?} gridster * @return {?} */ function (gridster) { this.enter.emit({ item: this.item, gridster: gridster }); }; /** * @param {?} gridster * @return {?} */ GridsterItemPrototypeDirective.prototype.onOver = /** * @param {?} gridster * @return {?} */ function (gridster) { }; /** * @param {?} gridster * @return {?} */ GridsterItemPrototypeDirective.prototype.onOut = /** * @param {?} gridster * @return {?} */ function (gridster) { this.out.emit({ item: this.item, gridster: gridster }); }; /** * @param {?} gridster * @return {?} */ GridsterItemPrototypeDirective.prototype.getPositionToGridster = /** * @param {?} gridster * @return {?} */ function (gridster) { /** @type {?} */ var relativeContainerCoords = this.getContainerCoordsToGridster(gridster); return { y: this.positionY - relativeContainerCoords.top, x: this.positionX - relativeContainerCoords.left }; }; /** * @param {?} gridster * @return {?} */ GridsterItemPrototypeDirective.prototype.setDragContextGridster = /** * @param {?} gridster * @return {?} */ function (gridster) { this.dragContextGridster = gridster; }; /** * @param {?} gridster * @return {?} */ GridsterItemPrototypeDirective.prototype.getContainerCoordsToGridster = /** * @param {?} gridster * @return {?} */ function (gridster) { return { left: gridster.gridsterRect.left - this.parentRect.left, top: gridster.gridsterRect.top - this.parentRect.top }; }; /** * @return {?} */ GridsterItemPrototypeDirective.prototype.enableDragDrop = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var cursorToElementPosition; /** @type {?} */ var draggable = new Draggable(this.elementRef.nativeElement); /** @type {?} */ var dragStartSub = draggable.dragStart .subscribe(function (event) { _this.zone.run(function () { _this.$element = _this.provideDragElement(); _this.containerRectange = _this.$element.parentElement.getBoundingClientRect(); _this.updateParentElementData(); _this.onStart(event); cursorToElementPosition = event.getRelativeCoordinates(_this.$element); }); }); /** @type {?} */ var dragSub = draggable.dragMove .subscribe(function (event) { _this.setElementPosition(_this.$element, { x: event.clientX - cursorToElementPosition.x - _this.parentRect.left, y: event.clientY - cursorToElementPosition.y - _this.parentRect.top }); _this.onDrag(event); }); /** @type {?} */ var dragStopSub = draggable.dragStop .subscribe(function (event) { _this.zone.run(function () { _this.onStop(event); _this.$element = null; }); }); /** @type {?} */ var scrollSub = fromEvent(document, 'scroll') .subscribe(function () { if (_this.$element) { _this.updateParentElementData(); } }); this.subscribtions = this.subscribtions.concat([dragStartSub, dragSub, dragStopSub, scrollSub]); }; /** * @param {?} element * @param {?} position * @return {?} */ GridsterItemPrototypeDirective.prototype.setElementPosition = /** * @param {?} element * @param {?} position * @return {?} */ function (element, position) { this.positionX = position.x; this.positionY = position.y; utils.setCssElementPosition(element, position); }; /** * @return {?} */ GridsterItemPrototypeDirective.prototype.updateParentElementData = /** * @return {?} */ function () { this.parentRect = this.$element.parentElement.getBoundingClientRect(); this.parentOffset = { left: this.$element.parentElement.offsetLeft, top: this.$element.parentElement.offsetTop }; }; /** * @param {?} event * @return {?} */ GridsterItemPrototypeDirective.prototype.onStart = /** * @param {?} event * @return {?} */ function (event) { this.isDragging = true; this.$element.style.pointerEvents = 'none'; this.$element.style.position = 'absolute'; this.gridsterPrototype.dragItemStart(this, event); this.start.emit({ item: this.item }); }; /** * @param {?} event * @return {?} */ GridsterItemPrototypeDirective.prototype.onDrag = /** * @param {?} event * @return {?} */ function (event) { this.gridsterPrototype.updatePrototypePosition(this, event); }; /** * @param {?} event * @return {?} */ GridsterItemPrototypeDirective.prototype.onStop = /** * @param {?} event * @return {?} */ function (event) { this.gridsterPrototype.dragItemStop(this, event); this.isDragging = false; this.$element.style.pointerEvents = 'auto'; this.$element.style.position = ''; utils.resetCSSElementPosition(this.$element); if (this.config.helper) { this.$element.parentNode.removeChild(this.$element); } }; /** * @return {?} */ GridsterItemPrototypeDirective.prototype.provideDragElement = /** * @return {?} */ function () { /** @type {?} */ var dragElement = this.elementRef.nativeElement; if (this.config.helper) { dragElement = (/** @type {?} */ ((dragElement).cloneNode(true))); document.body.appendChild(this.fixStylesForBodyHelper(dragElement)); } else { this.fixStylesForRelativeElement(dragElement); } return dragElement; }; /** * @param {?} el * @return {?} */ GridsterItemPrototypeDirective.prototype.fixStylesForRelativeElement = /** * @param {?} el * @return {?} */ function (el) { if (window.getComputedStyle(el).position === 'absolute') { return el; } /** @type {?} */ var rect = this.elementRef.nativeElement.getBoundingClientRect(); this.containerRectange = el.parentElement.getBoundingClientRect(); el.style.position = 'absolute'; this.setElementPosition(el, { x: rect.left - this.containerRectange.left, y: rect.top - this.containerRectange.top }); return el; }; /** * When element is cloned and append to body it should have position absolute and coords set by original * relative prototype element position. */ /** * When element is cloned and append to body it should have position absolute and coords set by original * relative prototype element position. * @param {?} el * @return {?} */ GridsterItemPrototypeDirective.prototype.fixStylesForBodyHelper = /** * When element is cloned and append to body it should have position absolute and coords set by original * relative prototype element position. * @param {?} el * @return {?} */ function (el) { /** @type {?} */ var bodyRect = document.body.getBoundingClientRect(); /** @type {?} */ var rect = this.elementRef.nativeElement.getBoundingClientRect(); el.style.position = 'absolute'; this.setElementPosition(el, { x: rect.left - bodyRect.left, y: rect.top - bodyRect.top }); return el; }; GridsterItemPrototypeDirective.decorators = [ { type: Directive, args: [{ selector: '[ngxGridsterItemPrototype]' },] } ]; /** @nocollapse */ GridsterItemPrototypeDirective.ctorParameters = function () { return [ { type: NgZone }, { type: ElementRef }, { type: GridsterPrototypeService } ]; }; GridsterItemPrototypeDirective.propDecorators = { drop: [{ type: Output }], start: [{ type: Output }], cancel: [{ type: Output }], enter: [{ type: Output }], out: [{ type: Output }], data: [{ type: Input }], config: [{ type: Input }], w: [{ type: Input }], wSm: [{ type: Input }], wMd: [{ type: Input }], wLg: [{ type: Input }], wXl: [{ type: Input }], h: [{ type: Input }], hSm: [{ type: Input }], hMd: [{ type: Input }], hLg: [{ type: Input }], hXl: [{ type: Input }] }; return GridsterItemPrototypeDirective; }()); export { GridsterItemPrototypeDirective }; if (false) { /** @type {?} */ GridsterItemPrototypeDirective.prototype.drop; /** @type {?} */ GridsterItemPrototypeDirective.prototype.start; /** @type {?} */ GridsterItemPrototypeDirective.prototype.cancel; /** @type {?} */ GridsterItemPrototypeDirective.prototype.enter; /** @type {?} */ GridsterItemPrototypeDirective.prototype.out; /** @type {?} */ GridsterItemPrototypeDirective.prototype.data; /** @type {?} */ GridsterItemPrototypeDirective.prototype.config; /** @type {?} */ GridsterItemPrototypeDirective.prototype.x; /** @type {?} */ GridsterItemPrototypeDirective.prototype.y; /** @type {?} */ GridsterItemPrototypeDirective.prototype.w; /** @type {?} */ GridsterItemPrototypeDirective.prototype.wSm; /** @type {?} */ GridsterItemPrototypeDirective.prototype.wMd; /** @type {?} */ GridsterItemPrototypeDirective.prototype.wLg; /** @type {?} */ GridsterItemPrototypeDirective.prototype.wXl; /** @type {?} */ GridsterItemPrototypeDirective.prototype.h; /** @type {?} */ GridsterItemPrototypeDirective.prototype.hSm; /** @type {?} */ GridsterItemPrototypeDirective.prototype.hMd; /** @type {?} */ GridsterItemPrototypeDirective.prototype.hLg; /** @type {?} */ GridsterItemPrototypeDirective.prototype.hXl; /** @type {?} */ GridsterItemPrototypeDirective.prototype.positionX; /** @type {?} */ GridsterItemPrototypeDirective.prototype.positionY; /** @type {?} */ GridsterItemPrototypeDirective.prototype.autoSize; /** @type {?} */ GridsterItemPrototypeDirective.prototype.$element; /** * Mouse drag observable * @type {?} */ GridsterItemPrototypeDirective.prototype.drag; /** * Subscribtion for drag observable * @type {?} */ GridsterItemPrototypeDirective.prototype.dragSubscription; /** @type {?} */ GridsterItemPrototypeDirective.prototype.isDragging; /** @type {?} */ GridsterItemPrototypeDirective.prototype.item; /** @type {?} */ GridsterItemPrototypeDirective.prototype.containerRectange; /** @type {?} */ GridsterItemPrototypeDirective.prototype.dragContextGridster; /** @type {?} */ GridsterItemPrototypeDirective.prototype.parentRect; /** @type {?} */ GridsterItemPrototypeDirective.prototype.parentOffset; /** @type {?} */ GridsterItemPrototypeDirective.prototype.subscribtions; /** @type {?} */ GridsterItemPrototypeDirective.prototype.zone; /** @type {?} */ GridsterItemPrototypeDirective.prototype.elementRef; /** @type {?} */ GridsterItemPrototypeDirective.prototype.gridsterPrototype; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZHN0ZXItaXRlbS1wcm90b3R5cGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGJsYXJlL2FuZ3VsYXIyZ3JpZHN0ZXIvIiwic291cmNlcyI6WyJsaWIvZ3JpZHN0ZXItcHJvdG90eXBlL2dyaWRzdGVyLWl0ZW0tcHJvdG90eXBlLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBZSxZQUFZLEVBQ3BFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqQyxPQUFPLEVBQTRCLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUzRCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QztJQWdFSSx3Q0FBb0IsSUFBWSxFQUNaLFVBQXNCLEVBQ3RCLGlCQUEyQztRQUYzQyxTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ1osZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO1FBOURyRCxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMxQixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUM1QixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQixRQUFHLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUcxQixXQUFNLEdBQVEsRUFBRSxDQUFDO1FBRW5CLE1BQUMsR0FBRyxDQUFDLENBQUM7UUFDTixNQUFDLEdBQUcsQ0FBQyxDQUFD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QUN6Qzs7OztnQkFaRyxNQUFNO2dCQURVLFVBQVU7Z0JBSXJCLHdCQUF3Qjs7O3VCQVc1QixNQUFNO3dCQUNOLE1BQU07eUJBQ04sTUFBTTt3QkFDTixNQUFNO3NCQUNOLE1BQU07dUJBRU4sS0FBSzt5QkFDTCxLQUFLO29CQUlMLEtBQUs7c0JBQ0wsS0FBSztzQkFDTCxLQUFLO3NCQUNMLEtBQUs7c0JBQ0wsS0FBSztvQkFDTCxLQUFLO3NCQUNMLEtBQUs7c0JBQ0wsS0FBSztzQkFDTCxLQUFLO3NCQUNMLEtBQUs7O0lBNFBWLHFDQUFDO0NBQUEsQUFwUkQsSUFvUkM7U0FqUlksOEJBQThCOzs7SUFDdkMsOENBQW9DOztJQUNwQywrQ0FBcUM7O0lBQ3JDLGdEQUFzQzs7SUFDdEMsK0NBQXFDOztJQUNyQyw2Q0FBbUM7O0lBRW5DLDhDQUFtQjs7SUFDbkIsZ0RBQTBCOztJQUUxQiwyQ0FBYTs7SUFDYiwyQ0FBYTs7SUFDYiwyQ0FBbUI7O0lBQ25CLDZDQUFxQjs7SUFDckIsNkNBQXFCOztJQUNyQiw2Q0FBcUI7O0lBQ3JCLDZDQUFxQjs7SUFDckIsMkNBQW1COztJQUNuQiw2Q0FBcUI7O0lBQ3JCLDZDQUFxQjs7SUFDckIsNkNBQXFCOztJQUNyQiw2Q0FBcUI7O0lBRXJCLG1EQUFrQjs7SUFDbEIsbURBQWtCOztJQUVsQixrREFBaUI7O0lBRWpCLGtEQUFzQjs7Ozs7SUFLdEIsOENBQXNCOzs7OztJQUt0QiwwREFBK0I7O0lBRS9CLG9EQUFtQjs7SUFFbkIsOENBQW1COztJQUVuQiwyREFBOEI7O0lBRTlCLDZEQUE2Qzs7SUFDN0Msb0RBQStCOztJQUMvQixzREFBa0Q7O0lBRWxELHVEQUFnRDs7SUFXcEMsOENBQW9COztJQUNwQixvREFBOEI7O0lBQzlCLDJEQUFtRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgSG9zdEJpbmRpbmcsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPbkRlc3Ryb3ksXG4gICAgTmdab25lfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEdyaWRzdGVyUHJvdG90eXBlU2VydmljZSB9IGZyb20gJy4vZ3JpZHN0ZXItcHJvdG90eXBlLnNlcnZpY2UnO1xuaW1wb3J0IHsgR3JpZExpc3RJdGVtIH0gZnJvbSAnLi4vZ3JpZExpc3QvR3JpZExpc3RJdGVtJztcbmltcG9ydCB7IEdyaWRzdGVyU2VydmljZSB9IGZyb20gJy4uL2dyaWRzdGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRHJhZ2dhYmxlRXZlbnQgfSBmcm9tICcuLi91dGlscy9EcmFnZ2FibGVFdmVudCc7XG5pbXBvcnQgeyBEcmFnZ2FibGUgfSBmcm9tICcuLi91dGlscy9kcmFnZ2FibGUnO1xuaW1wb3J0IHsgdXRpbHMgfSBmcm9tICcuLi91dGlscy91dGlscyc7XG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW25neEdyaWRzdGVySXRlbVByb3RvdHlwZV0nXG59KVxuZXhwb3J0IGNsYXNzIEdyaWRzdGVySXRlbVByb3RvdHlwZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBAT3V0cHV0KCkgZHJvcCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgc3RhcnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICBAT3V0cHV0KCkgZW50ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIG91dCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIEBJbnB1dCgpIGRhdGE6IGFueTtcbiAgICBASW5wdXQoKSBjb25maWc6IGFueSA9IHt9O1xuXG4gICAgcHVibGljIHggPSAwO1xuICAgIHB1YmxpYyB5ID0gMDtcbiAgICBASW5wdXQoKSB3OiBudW1iZXI7XG4gICAgQElucHV0KCkgd1NtOiBudW1iZXI7XG4gICAgQElucHV0KCkgd01kOiBudW1iZXI7XG4gICAgQElucHV0KCkgd0xnOiBudW1iZXI7XG4gICAgQElucHV0KCkgd1hsOiBudW1iZXI7XG4gICAgQElucHV0KCkgaDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGhTbTogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGhNZDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGhMZzogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGhYbDogbnVtYmVyO1xuXG4gICAgcG9zaXRpb25YOiBudW1iZXI7XG4gICAgcG9zaXRpb25ZOiBudW1iZXI7XG5cbiAgICBhdXRvU2l6ZSA9IGZhbHNlO1xuXG4gICAgJGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuXG4gICAgLyoqXG4gICAgICogTW91c2UgZHJhZyBvYnNlcnZhYmxlXG4gICAgICovXG4gICAgZHJhZzogT2JzZXJ2YWJsZTxhbnk+O1xuXG4gICAgLyoqXG4gICAgICogU3Vic2NyaWJ0aW9uIGZvciBkcmFnIG9ic2VydmFibGVcbiAgICAgKi9cbiAgICBkcmFnU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBpc0RyYWdnaW5nID0gZmFsc2U7XG5cbiAgICBpdGVtOiBHcmlkTGlzdEl0ZW07XG5cbiAgICBjb250YWluZXJSZWN0YW5nZTogQ2xpZW50UmVjdDtcblxuICAgIHByaXZhdGUgZHJhZ0NvbnRleHRHcmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlO1xuICAgIHByaXZhdGUgcGFyZW50UmVjdDogQ2xpZW50UmVjdDtcbiAgICBwcml2YXRlIHBhcmVudE9mZnNldDoge2xlZnQ6IG51bWJlciwgdG9wOiBudW1iZXJ9O1xuXG4gICAgcHJpdmF0ZSBzdWJzY3JpYnRpb25zOiBBcnJheTxTdWJzY3JpcHRpb24+ID0gW107XG5cbiAgICAvLyBtdXN0IGJlIHNldCB0byB0cnVlIGJlY2F1c2Ugb2YgaXRlbSBkcmFnQW5kRHJvcCBjb25maWd1cmF0aW9uXG4gICAgZ2V0IGRyYWdBbmREcm9wKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXQgZ3JpZHN0ZXIoKTogR3JpZHN0ZXJTZXJ2aWNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJhZ0NvbnRleHRHcmlkc3RlcjtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHpvbmU6IE5nWm9uZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBncmlkc3RlclByb3RvdHlwZTogR3JpZHN0ZXJQcm90b3R5cGVTZXJ2aWNlKSB7XG5cbiAgICAgICAgdGhpcy5pdGVtID0gKG5ldyBHcmlkTGlzdEl0ZW0oKSkuc2V0RnJvbUdyaWRzdGVySXRlbVByb3RvdHlwZSh0aGlzKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgdGhpcy53U20gPSB0aGlzLndTbSB8fCB0aGlzLnc7XG4gICAgICAgIHRoaXMuaFNtID0gdGhpcy5oU20gfHwgdGhpcy5oO1xuICAgICAgICB0aGlzLndNZCA9IHRoaXMud01kIHx8IHRoaXMudztcbiAgICAgICAgdGhpcy5oTWQgPSB0aGlzLmhNZCB8fCB0aGlzLmg7XG4gICAgICAgIHRoaXMud0xnID0gdGhpcy53TGcgfHwgdGhpcy53O1xuICAgICAgICB0aGlzLmhMZyA9IHRoaXMuaExnIHx8IHRoaXMuaDtcbiAgICAgICAgdGhpcy53WGwgPSB0aGlzLndYbCB8fCB0aGlzLnc7XG4gICAgICAgIHRoaXMuaFhsID0gdGhpcy5oWGwgfHwgdGhpcy5oO1xuICAgICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5lbmFibGVEcmFnRHJvcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpYnRpb25zLmZvckVhY2goKHN1YjogU3Vic2NyaXB0aW9uKSA9PiB7XG4gICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Ecm9wIChncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jb25maWcuaGVscGVyKSB7XG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRyb3AuZW1pdCh7XG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXG4gICAgICAgICAgICBncmlkc3RlcjogZ3JpZHN0ZXJcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25DYW5jZWwgKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNhbmNlbC5lbWl0KHtpdGVtOiB0aGlzLml0ZW19KTtcbiAgICB9XG5cbiAgICBvbkVudGVyIChncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZW50ZXIuZW1pdCh7XG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXG4gICAgICAgICAgICBncmlkc3RlcjogZ3JpZHN0ZXJcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25PdmVyIChncmlkc3RlcjogR3JpZHN0ZXJTZXJ2aWNlKTogdm9pZCB7fVxuXG4gICAgb25PdXQgKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vdXQuZW1pdCh7XG4gICAgICAgICAgICBpdGVtOiB0aGlzLml0ZW0sXG4gICAgICAgICAgICBncmlkc3RlcjogZ3JpZHN0ZXJcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0UG9zaXRpb25Ub0dyaWRzdGVyKGdyaWRzdGVyOiBHcmlkc3RlclNlcnZpY2UpIHtcbiAgICAgICAgY29uc3QgcmVsYXRpdmVDb250YWluZXJDb29yZHMgPSB0aGlzLmdldENvbnRhaW5lckNvb3Jkc1RvR3JpZHN0ZXIoZ3JpZHN0ZXIpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5OiB0aGlzLnBvc2l0aW9uWSAtIHJlbGF0aXZlQ29udGFpbmVyQ29vcmRzLnRvcCxcbiAgICAgICAgICAgIHg6IHRoaXMucG9zaXRpb25YIC0gcmVsYXRpdmVDb250YWluZXJDb29yZHMubGVmdFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHNldERyYWdDb250ZXh0R3JpZHN0ZXIoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSkge1xuICAgICAgICB0aGlzLmRyYWdDb250ZXh0R3JpZHN0ZXIgPSBncmlkc3RlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldENvbnRhaW5lckNvb3Jkc1RvR3JpZHN0ZXIoZ3JpZHN0ZXI6IEdyaWRzdGVyU2VydmljZSk6IHt0b3A6IG51bWJlciwgbGVmdDogbnVtYmVyfSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWZ0OiBncmlkc3Rlci5ncmlkc3RlclJlY3QubGVmdCAtIHRoaXMucGFyZW50UmVjdC5sZWZ0LFxuICAgICAgICAgICAgdG9wOiBncmlkc3Rlci5ncmlkc3RlclJlY3QudG9wIC0gdGhpcy5wYXJlbnRSZWN0LnRvcFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlRHJhZ0Ryb3AoKSB7XG4gICAgICAgIGxldCBjdXJzb3JUb0VsZW1lbnRQb3NpdGlvbjtcbiAgICAgICAgY29uc3QgZHJhZ2dhYmxlID0gbmV3IERyYWdnYWJsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgY29uc3QgZHJhZ1N0YXJ0U3ViID0gZHJhZ2dhYmxlLmRyYWdTdGFydFxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQgPSB0aGlzLnByb3ZpZGVEcmFnRWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lclJlY3RhbmdlID0gdGhpcy4kZWxlbWVudC5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVBhcmVudEVsZW1lbnREYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TdGFydChldmVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yVG9FbGVtZW50UG9zaXRpb24gPSBldmVudC5nZXRSZWxhdGl2ZUNvb3JkaW5hdGVzKHRoaXMuJGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgZHJhZ1N1YiA9IGRyYWdnYWJsZS5kcmFnTW92ZVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSA9PiB7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnNldEVsZW1lbnRQb3NpdGlvbih0aGlzLiRlbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgICAgIHg6IGV2ZW50LmNsaWVudFggLSBjdXJzb3JUb0VsZW1lbnRQb3NpdGlvbi54ICAtIHRoaXMucGFyZW50UmVjdC5sZWZ0LFxuICAgICAgICAgICAgICAgICAgICB5OiBldmVudC5jbGllbnRZIC0gY3Vyc29yVG9FbGVtZW50UG9zaXRpb24ueSAgLSB0aGlzLnBhcmVudFJlY3QudG9wXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9uRHJhZyhldmVudCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBkcmFnU3RvcFN1YiA9IGRyYWdnYWJsZS5kcmFnU3RvcFxuICAgICAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdnYWJsZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25TdG9wKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWxlbWVudCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBzY3JvbGxTdWIgPSBmcm9tRXZlbnQoZG9jdW1lbnQsICdzY3JvbGwnKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQYXJlbnRFbGVtZW50RGF0YSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc3Vic2NyaWJ0aW9ucyA9IHRoaXMuc3Vic2NyaWJ0aW9ucy5jb25jYXQoW2RyYWdTdGFydFN1YiwgZHJhZ1N1YiwgZHJhZ1N0b3BTdWIsIHNjcm9sbFN1Yl0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0RWxlbWVudFBvc2l0aW9uKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwb3NpdGlvbjoge3g6IG51bWJlciwgeTogbnVtYmVyfSkge1xuICAgICAgICB0aGlzLnBvc2l0aW9uWCA9IHBvc2l0aW9uLng7XG4gICAgICAgIHRoaXMucG9zaXRpb25ZID0gcG9zaXRpb24ueTtcbiAgICAgICAgdXRpbHMuc2V0Q3NzRWxlbWVudFBvc2l0aW9uKGVsZW1lbnQsIHBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVBhcmVudEVsZW1lbnREYXRhKCkge1xuICAgICAgICB0aGlzLnBhcmVudFJlY3QgPSB0aGlzLiRlbGVtZW50LnBhcmVudEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMucGFyZW50T2Zmc2V0ID0ge1xuICAgICAgICAgICAgbGVmdDogdGhpcy4kZWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldExlZnQsXG4gICAgICAgICAgICB0b3A6IHRoaXMuJGVsZW1lbnQucGFyZW50RWxlbWVudC5vZmZzZXRUb3BcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU3RhcnQgKGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuJGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdub25lJztcbiAgICAgICAgdGhpcy4kZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG5cbiAgICAgICAgdGhpcy5ncmlkc3RlclByb3RvdHlwZS5kcmFnSXRlbVN0YXJ0KHRoaXMsIGV2ZW50KTtcblxuICAgICAgICB0aGlzLnN0YXJ0LmVtaXQoe2l0ZW06IHRoaXMuaXRlbX0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25EcmFnIChldmVudDogRHJhZ2dhYmxlRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ncmlkc3RlclByb3RvdHlwZS51cGRhdGVQcm90b3R5cGVQb3NpdGlvbih0aGlzLCBldmVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblN0b3AgKGV2ZW50OiBEcmFnZ2FibGVFdmVudCk6IHZvaWQge1xuICAgICAgICB0aGlzLmdyaWRzdGVyUHJvdG90eXBlLmRyYWdJdGVtU3RvcCh0aGlzLCBldmVudCk7XG5cbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgdGhpcy4kZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICcnO1xuICAgICAgICB1dGlscy5yZXNldENTU0VsZW1lbnRQb3NpdGlvbih0aGlzLiRlbGVtZW50KTtcblxuICAgICAgICBpZiAodGhpcy5jb25maWcuaGVscGVyKSB7XG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy4kZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHByb3ZpZGVEcmFnRWxlbWVudCAoKTogSFRNTEVsZW1lbnQge1xuICAgICAgICBsZXQgZHJhZ0VsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5jb25maWcuaGVscGVyKSB7XG4gICAgICAgICAgICBkcmFnRWxlbWVudCA9IDxhbnk+KGRyYWdFbGVtZW50KS5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5maXhTdHlsZXNGb3JCb2R5SGVscGVyKGRyYWdFbGVtZW50KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpeFN0eWxlc0ZvclJlbGF0aXZlRWxlbWVudChkcmFnRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZHJhZ0VsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaXhTdHlsZXNGb3JSZWxhdGl2ZUVsZW1lbnQoZWw6IEhUTUxFbGVtZW50KSB7XG4gICAgICAgIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbCkucG9zaXRpb24gPT09ICdhYnNvbHV0ZScpIHtcbiAgICAgICAgICAgIHJldHVybiBlbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIHRoaXMuY29udGFpbmVyUmVjdGFuZ2UgPSBlbC5wYXJlbnRFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIGVsLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgdGhpcy5zZXRFbGVtZW50UG9zaXRpb24oZWwsIHtcbiAgICAgICAgICAgIHg6IHJlY3QubGVmdCAtIHRoaXMuY29udGFpbmVyUmVjdGFuZ2UubGVmdCxcbiAgICAgICAgICAgIHk6IHJlY3QudG9wIC0gdGhpcy5jb250YWluZXJSZWN0YW5nZS50b3BcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGVsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFdoZW4gZWxlbWVudCBpcyBjbG9uZWQgYW5kIGFwcGVuZCB0byBib2R5IGl0IHNob3VsZCBoYXZlIHBvc2l0aW9uIGFic29sdXRlIGFuZCBjb29yZHMgc2V0IGJ5IG9yaWdpbmFsXG4gICAgICogcmVsYXRpdmUgcHJvdG90eXBlIGVsZW1lbnQgcG9zaXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaXhTdHlsZXNGb3JCb2R5SGVscGVyIChlbDogSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgYm9keVJlY3QgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgZWwuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICB0aGlzLnNldEVsZW1lbnRQb3NpdGlvbihlbCwge1xuICAgICAgICAgICAgeDogcmVjdC5sZWZ0IC0gYm9keVJlY3QubGVmdCxcbiAgICAgICAgICAgIHk6IHJlY3QudG9wIC0gYm9keVJlY3QudG9wXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBlbDtcbiAgICB9XG5cbn1cbiJdfQ==