UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

344 lines (343 loc) 36.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Directive, ElementRef, ViewContainerRef, Input, NgZone } from '@angular/core'; import { AbstractHasOptions } from '../share/AbstractHasOptions'; import { Option } from '../decorator/decorators'; var /** @type {?} */ DEFAULT_FORMAT = 'application/json'; var /** @type {?} */ DEFAULT_ALWAYS_FIRE_EVENT = false; var /** @type {?} */ DEFAULT_AUTO_ADD_CLASS = true; var /** @type {?} */ CLASS_NAME_DRAGGING = 'dragging'; var Draggable = /** @class */ (function (_super) { tslib_1.__extends(Draggable, _super); function Draggable(elRef, viewConRef, ngZone) { var _this = _super.call(this) || this; _this.elementRef = elRef; if (_this.elementRef !== null && typeof _this.elementRef !== 'undefined') { // Auto add "draggable" html attr into dom $(_this.elementRef.nativeElement).attr('draggable', 'true'); } // Resolve component instance try { _this.component = (/** @type {?} */ (viewConRef))._data.componentView.component; } catch (/** @type {?} */ error) { } // Add drag event listeners ngZone.runOutsideAngular(function () { _this.bindEvents(); }); return _this; } /** * @return {?} */ Draggable.prototype.bindEvents = /** * @return {?} */ function () { var _this = this; if (this.elementRef !== null && typeof this.elementRef !== 'undefined') { $(this.elementRef.nativeElement).on('dragstart', function (event) { _this.onDragStart.call(_this, event.originalEvent); }); $(this.elementRef.nativeElement).on('dragend', function (event) { _this.onDragEnd.call(_this, event.originalEvent); }); $(this.elementRef.nativeElement).on('drag', function (event) { _this.onDrag.call(_this, event.originalEvent); }); } }; /** * @return {?} */ Draggable.prototype.ngOnInit = /** * @return {?} */ function () { if (this.format === null || typeof this.format !== 'string') { this.format = DEFAULT_FORMAT; } if (this.component === null || typeof this.component === 'undefined') { // Try to resolve "component" from @Input() options; if (this.options !== null && typeof this.options !== 'undefined') { // Test that it is a component instance if (typeof this.options.getDragStartDataTransfer === 'function') { this.component = this.options; } } } if (this.alwaysFireEvent === null || typeof this.alwaysFireEvent === 'undefined') { this.alwaysFireEvent = DEFAULT_ALWAYS_FIRE_EVENT; } if (this.autoAddClass === null || typeof this.autoAddClass === 'undefined') { this.autoAddClass = DEFAULT_AUTO_ADD_CLASS; } }; /** * @param {?} event * @return {?} */ Draggable.prototype.isDraggable = /** * @param {?} event * @return {?} */ function (event) { if (this.component === null || typeof this.component === 'undefined') { return true; } if (typeof this.component.isDraggable !== 'function') { return true; } return this.component.isDraggable(event); }; /** * @param {?} className * @return {?} */ Draggable.prototype.addStyleClass = /** * @param {?} className * @return {?} */ function (className) { if (this.elementRef !== null && typeof this.elementRef !== 'undefined') { $(this.elementRef.nativeElement).addClass(className); } if (this.component !== null && typeof this.component !== 'undefined' && this.component.elementRef !== null && typeof this.component.elementRef !== 'undefined') { $(this.component.elementRef.nativeElement).addClass(className); } }; /** * @param {?} className * @return {?} */ Draggable.prototype.removeStyleClass = /** * @param {?} className * @return {?} */ function (className) { if (this.elementRef !== null && typeof this.elementRef !== 'undefined') { $(this.elementRef.nativeElement).removeClass(className); } if (this.component !== null && typeof this.component !== 'undefined' && this.component.elementRef !== null && typeof this.component.elementRef !== 'undefined') { $(this.component.elementRef.nativeElement).removeClass(className); } }; /** * @param {?} event * @return {?} */ Draggable.prototype.onDragStart = /** * @param {?} event * @return {?} */ function (event) { if (this.component === null || typeof this.component === 'undefined') { return; } var /** @type {?} */ draggable = this.isDraggable(event); if (!draggable) { if (event !== null && typeof event !== 'undefined') { event.preventDefault(); } if (!this.alwaysFireEvent) { return; } } if (event !== null && typeof event !== 'undefined') { if (typeof this.component.getDragStartDataTransfer === 'function') { // Auto set data transfer properties if getDragStartDataTransfer() is available. var /** @type {?} */ dataTransfer = this.component.getDragStartDataTransfer(event); if (dataTransfer !== null && typeof dataTransfer !== 'undefined') { // We're not going to set "dropEffect" here since it should be // set in "dragover" event. // Set dataTransfer.effectAllowed if (typeof dataTransfer.effectAllowed === 'function') { // Auto resolve value from function's returned value if it is a function. event.dataTransfer.effectAllowed = dataTransfer.effectAllowed(event); } else if (typeof dataTransfer.effectAllowed !== 'undefined') { event.dataTransfer.effectAllowed = dataTransfer.effectAllowed; } // Set dataTransfer.files if (typeof dataTransfer.files === 'function') { // Auto resolve value from function's returned value if it is a function. event.dataTransfer.files = dataTransfer.files(event); } else if (typeof dataTransfer.files !== 'undefined') { event.dataTransfer.files = dataTransfer.files; } // Set dataTransfer.image if (typeof dataTransfer.image === 'function') { // Auto resolve value from function's returned value if it is a function. event.dataTransfer.setDragImage(dataTransfer.image(event), 0, 0); } else if (typeof dataTransfer.image !== 'undefined') { event.dataTransfer.setDragImage(dataTransfer.image, 0, 0); } var /** @type {?} */ format = this.format; if (typeof dataTransfer.format === 'function') { // Auto resolve value from function's returned value if it is a function. format = dataTransfer.format(event); } else if (typeof dataTransfer.format !== 'undefined') { format = dataTransfer.format; } if (format === null || typeof format === 'undefined') { format = DEFAULT_FORMAT; } var /** @type {?} */ data = null; if (typeof dataTransfer.data === 'function') { // Auto resolve value from function's returned value if it is a function. data = dataTransfer.data(event); } else if (typeof dataTransfer.data !== 'undefined') { data = dataTransfer.data; } if (format.toLowerCase() === 'application/json') { // Auto serialize data into json if it is not json string. try { JSON.parse(data); } catch (/** @type {?} */ e) { // The given "data" is not json string try { data = JSON.stringify(data); } catch (/** @type {?} */ e) { // The data cannot be parsed to json string data = null; } } } if ((format !== null && typeof format !== 'undefined') || (data !== null && typeof data !== 'undefined')) { event.dataTransfer.setData(format, data); } } } } if (this.autoAddClass) { this.addStyleClass(CLASS_NAME_DRAGGING); } if (typeof this.component.onDragStart === 'function') { this.component.onDragStart(event); } }; /** * @param {?} event * @return {?} */ Draggable.prototype.onDragEnd = /** * @param {?} event * @return {?} */ function (event) { if (this.component === null || typeof this.component === 'undefined') { return; } if (this.autoAddClass) { this.removeStyleClass(CLASS_NAME_DRAGGING); } if (typeof this.component.onDragEnd === 'function') { if (this.alwaysFireEvent || this.isDraggable(event)) { this.component.onDragEnd(event); } } }; /** * @param {?} event * @return {?} */ Draggable.prototype.onDrag = /** * @param {?} event * @return {?} */ function (event) { if (this.component === null || typeof this.component === 'undefined') { return; } if (typeof this.component.onDrag === 'function') { if (this.alwaysFireEvent || this.isDraggable(event)) { this.component.onDrag(event); } } }; Draggable.DEFAULT_FORMAT = DEFAULT_FORMAT; Draggable.CLASS_NAME_DRAGGING = CLASS_NAME_DRAGGING; Draggable.DEFAULT_ALWAYS_FIRE_EVENT = DEFAULT_ALWAYS_FIRE_EVENT; Draggable.DEFAULT_AUTO_ADD_CLASS = DEFAULT_AUTO_ADD_CLASS; Draggable.decorators = [ { type: Directive, args: [{ selector: '[phxDraggable]' },] }, ]; /** @nocollapse */ Draggable.ctorParameters = function () { return [ { type: ElementRef, }, { type: ViewContainerRef, }, { type: NgZone, }, ]; }; Draggable.propDecorators = { "options": [{ type: Input, args: ['phxDraggable',] },], "format": [{ type: Input, args: ['dragFormat',] },], "component": [{ type: Input, args: ['dragTarget',] },], "alwaysFireEvent": [{ type: Input, args: ['dragFireEvent',] },], "autoAddClass": [{ type: Input, args: ['dragAddClass',] },], }; tslib_1.__decorate([ Option('format'), tslib_1.__metadata("design:type", String) ], Draggable.prototype, "format", void 0); tslib_1.__decorate([ Option('target'), tslib_1.__metadata("design:type", Object) ], Draggable.prototype, "component", void 0); tslib_1.__decorate([ Option('fireEvent'), tslib_1.__metadata("design:type", Boolean) ], Draggable.prototype, "alwaysFireEvent", void 0); tslib_1.__decorate([ Option('addClass'), tslib_1.__metadata("design:type", Boolean) ], Draggable.prototype, "autoAddClass", void 0); return Draggable; }(AbstractHasOptions)); export { Draggable }; function Draggable_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ Draggable.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ Draggable.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ Draggable.propDecorators; /** @type {?} */ Draggable.DEFAULT_FORMAT; /** @type {?} */ Draggable.CLASS_NAME_DRAGGING; /** @type {?} */ Draggable.DEFAULT_ALWAYS_FIRE_EVENT; /** @type {?} */ Draggable.DEFAULT_AUTO_ADD_CLASS; /** @type {?} */ Draggable.prototype.options; /** @type {?} */ Draggable.prototype.format; /** @type {?} */ Draggable.prototype.component; /** @type {?} */ Draggable.prototype.alwaysFireEvent; /** @type {?} */ Draggable.prototype.autoAddClass; /** @type {?} */ Draggable.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHJhZ2dhYmxlLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZS9EcmFnZ2FibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFxQixTQUFTLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBZ0IsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXhILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRWpFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUlqRCxxQkFBTSxjQUFjLEdBQVcsa0JBQWtCLENBQUM7QUFDbEQscUJBQU0seUJBQXlCLEdBQVksS0FBSyxDQUFDO0FBQ2pELHFCQUFNLHNCQUFzQixHQUFZLElBQUksQ0FBQztBQUM3QyxxQkFBTSxtQkFBbUIsR0FBVyxVQUFVLENBQUM7O0lBT2hCLHFDQUFrQjtJQTRCL0MsbUJBQVksS0FBaUIsRUFBRSxVQUE0QixFQUFFLE1BQWM7UUFBM0UsWUFDRSxpQkFBTyxTQWtCUjtRQWhCQyxLQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixFQUFFLENBQUMsQ0FBQyxLQUFJLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUksQ0FBQyxVQUFVLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQzs7WUFFdkUsQ0FBQyxDQUFDLEtBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztTQUM1RDs7UUFHRCxJQUFJLENBQUM7WUFDSCxLQUFJLENBQUMsU0FBUyxHQUFHLG1CQUFNLFVBQVUsRUFBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO1NBQ2xFO1FBQUMsS0FBSyxDQUFDLENBQUMsaUJBQUEsS0FBSyxFQUFF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IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgVmlld0NvbnRhaW5lclJlZiwgSW5wdXQsIEhvc3RMaXN0ZW5lciwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0SGFzT3B0aW9ucyB9IGZyb20gJy4uL3NoYXJlL0Fic3RyYWN0SGFzT3B0aW9ucyc7XG5cbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uL2RlY29yYXRvci9kZWNvcmF0b3JzJztcblxuaW1wb3J0IHsgRHJhZ0RhdGFUcmFuc2ZlciB9IGZyb20gJy4uL2NvbXBvbmVudC9tb2RlbC9tb2RlbHMnO1xuXG5jb25zdCBERUZBVUxUX0ZPUk1BVDogc3RyaW5nID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuY29uc3QgREVGQVVMVF9BTFdBWVNfRklSRV9FVkVOVDogYm9vbGVhbiA9IGZhbHNlO1xuY29uc3QgREVGQVVMVF9BVVRPX0FERF9DTEFTUzogYm9vbGVhbiA9IHRydWU7XG5jb25zdCBDTEFTU19OQU1FX0RSQUdHSU5HOiBzdHJpbmcgPSAnZHJhZ2dpbmcnO1xuXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1twaHhEcmFnZ2FibGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBEcmFnZ2FibGUgZXh0ZW5kcyBBYnN0cmFjdEhhc09wdGlvbnMgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9GT1JNQVQ6IHN0cmluZyA9IERFRkFVTFRfRk9STUFUO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IENMQVNTX05BTUVfRFJBR0dJTkc6IHN0cmluZyA9IENMQVNTX05BTUVfRFJBR0dJTkc7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9BTFdBWVNfRklSRV9FVkVOVDogYm9vbGVhbiA9IERFRkFVTFRfQUxXQVlTX0ZJUkVfRVZFTlQ7XG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9BVVRPX0FERF9DTEFTUzogYm9vbGVhbiA9IERFRkFVTFRfQVVUT19BRERfQ0xBU1M7XG5cbiAgQElucHV0KCdwaHhEcmFnZ2FibGUnKVxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55O1xuXG4gIEBJbnB1dCgnZHJhZ0Zvcm1hdCcpXG4gIEBPcHRpb24oJ2Zvcm1hdCcpXG4gIHByaXZhdGUgZm9ybWF0OiBzdHJpbmc7XG5cbiAgQElucHV0KCdkcmFnVGFyZ2V0JylcbiAgQE9wdGlvbigndGFyZ2V0JylcbiAgcHJpdmF0ZSBjb21wb25lbnQ6IGFueTtcblxuICBASW5wdXQoJ2RyYWdGaXJlRXZlbnQnKVxuICBAT3B0aW9uKCdmaXJlRXZlbnQnKVxuICBwcml2YXRlIGFsd2F5c0ZpcmVFdmVudDogYm9vbGVhbjtcblxuICBASW5wdXQoJ2RyYWdBZGRDbGFzcycpXG4gIEBPcHRpb24oJ2FkZENsYXNzJylcbiAgcHJpdmF0ZSBhdXRvQWRkQ2xhc3M6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuXG4gIGNvbnN0cnVjdG9yKGVsUmVmOiBFbGVtZW50UmVmLCB2aWV3Q29uUmVmOiBWaWV3Q29udGFpbmVyUmVmLCBuZ1pvbmU6IE5nWm9uZSkge1xuICAgIHN1cGVyKCk7XG5cbiAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbFJlZjtcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmVsZW1lbnRSZWYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBBdXRvIGFkZCBcImRyYWdnYWJsZVwiIGh0bWwgYXR0ciBpbnRvIGRvbVxuICAgICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuYXR0cignZHJhZ2dhYmxlJywgJ3RydWUnKTtcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgIHRyeSB7XG4gICAgICB0aGlzLmNvbXBvbmVudCA9ICg8YW55PnZpZXdDb25SZWYpLl9kYXRhLmNvbXBvbmVudFZpZXcuY29tcG9uZW50O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgfVxuXG4gICAgLy8gQWRkIGRyYWcgZXZlbnQgbGlzdGVuZXJzXG4gICAgbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHRoaXMuYmluZEV2ZW50cygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kRXZlbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmVsZW1lbnRSZWYgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZWxlbWVudFJlZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm9uKCdkcmFnc3RhcnQnLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRHJhZ1N0YXJ0LmNhbGwodGhpcywgZXZlbnQub3JpZ2luYWxFdmVudCk7XG4gICAgICB9KTtcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLm9uKCdkcmFnZW5kJywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5vbkRyYWdFbmQuY2FsbCh0aGlzLCBldmVudC5vcmlnaW5hbEV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkub24oJ2RyYWcnLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm9uRHJhZy5jYWxsKHRoaXMsIGV2ZW50Lm9yaWdpbmFsRXZlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvcm1hdCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5mb3JtYXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLmZvcm1hdCA9IERFRkFVTFRfRk9STUFUO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb21wb25lbnQgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuY29tcG9uZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gVHJ5IHRvIHJlc29sdmUgXCJjb21wb25lbnRcIiBmcm9tIEBJbnB1dCgpIG9wdGlvbnM7XG4gICAgICBpZiAodGhpcy5vcHRpb25zICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm9wdGlvbnMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIFRlc3QgdGhhdCBpdCBpcyBhIGNvbXBvbmVudCBpbnN0YW5jZVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5nZXREcmFnU3RhcnREYXRhVHJhbnNmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB0aGlzLmNvbXBvbmVudCA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5hbHdheXNGaXJlRXZlbnQgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuYWx3YXlzRmlyZUV2ZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5hbHdheXNGaXJlRXZlbnQgPSBERUZBVUxUX0FMV0FZU19GSVJFX0VWRU5UO1xuICAgIH1cbiAgICBpZiAodGhpcy5hdXRvQWRkQ2xhc3MgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuYXV0b0FkZENsYXNzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5hdXRvQWRkQ2xhc3MgPSBERUZBVUxUX0FVVE9fQUREX0NMQVNTO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNEcmFnZ2FibGUoZXZlbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmNvbXBvbmVudCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5jb21wb25lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbXBvbmVudC5pc0RyYWdnYWJsZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50LmlzRHJhZ2dhYmxlKGV2ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkU3R5bGVDbGFzcyhjbGFzc05hbWU6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmVsZW1lbnRSZWYgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuZWxlbWVudFJlZiAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmFkZENsYXNzKGNsYXNzTmFtZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbXBvbmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb21wb25lbnQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIHRoaXMuY29tcG9uZW50LmVsZW1lbnRSZWYgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29tcG9uZW50LmVsZW1lbnRSZWYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAkKHRoaXMuY29tcG9uZW50LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuYWRkQ2xhc3MoY2xhc3NOYW1lKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVN0eWxlQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmVsZW1lbnRSZWYgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5yZW1vdmVDbGFzcyhjbGFzc05hbWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb21wb25lbnQgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMuY29tcG9uZW50ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICB0aGlzLmNvbXBvbmVudC5lbGVtZW50UmVmICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbXBvbmVudC5lbGVtZW50UmVmICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgJCh0aGlzLmNvbXBvbmVudC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLnJlbW92ZUNsYXNzKGNsYXNzTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gQEhvc3RMaXN0ZW5lcignZHJhZ3N0YXJ0JywgWyckZXZlbnQnXSlcbiAgcHJpdmF0ZSBvbkRyYWdTdGFydChldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50ID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLmNvbXBvbmVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgZHJhZ2dhYmxlOiBib29sZWFuID0gdGhpcy5pc0RyYWdnYWJsZShldmVudCk7XG4gICAgaWYgKCFkcmFnZ2FibGUpIHtcbiAgICAgIGlmIChldmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgZXZlbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5hbHdheXNGaXJlRXZlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChldmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgZXZlbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuY29tcG9uZW50LmdldERyYWdTdGFydERhdGFUcmFuc2ZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAvLyBBdXRvIHNldCBkYXRhIHRyYW5zZmVyIHByb3BlcnRpZXMgaWYgZ2V0RHJhZ1N0YXJ0RGF0YVRyYW5zZmVyKCkgaXMgYXZhaWxhYmxlLlxuICAgICAgICBsZXQgZGF0YVRyYW5zZmVyOiBEcmFnRGF0YVRyYW5zZmVyID0gdGhpcy5jb21wb25lbnQuZ2V0RHJhZ1N0YXJ0RGF0YVRyYW5zZmVyKGV2ZW50KTtcblxuICAgICAgICBpZiAoZGF0YVRyYW5zZmVyICE9PSBudWxsICYmIHR5cGVvZiBkYXRhVHJhbnNmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gV2UncmUgbm90IGdvaW5nIHRvIHNldCBcImRyb3BFZmZlY3RcIiBoZXJlIHNpbmNlIGl0IHNob3VsZCBiZVxuICAgICAgICAgIC8vIHNldCBpbiBcImRyYWdvdmVyXCIgZXZlbnQuXG5cbiAgICAgICAgICAvLyBTZXQgZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWRcbiAgICAgICAgICBpZiAodHlwZW9mIGRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBBdXRvIHJlc29sdmUgdmFsdWUgZnJvbSBmdW5jdGlvbidzIHJldHVybmVkIHZhbHVlIGlmIGl0IGlzIGEgZnVuY3Rpb24uXG4gICAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9IGRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkKGV2ZW50KTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gU2V0IGRhdGFUcmFuc2Zlci5maWxlc1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmZpbGVzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAvLyBBdXRvIHJlc29sdmUgdmFsdWUgZnJvbSBmdW5jdGlvbidzIHJldHVybmVkIHZhbHVlIGlmIGl0IGlzIGEgZnVuY3Rpb24uXG4gICAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXMgPSBkYXRhVHJhbnNmZXIuZmlsZXMoZXZlbnQpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGRhdGFUcmFuc2Zlci5maWxlcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5maWxlcyA9IGRhdGFUcmFuc2Zlci5maWxlcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZXQgZGF0YVRyYW5zZmVyLmltYWdlXG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhVHJhbnNmZXIuaW1hZ2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEF1dG8gcmVzb2x2ZSB2YWx1ZSBmcm9tIGZ1bmN0aW9uJ3MgcmV0dXJuZWQgdmFsdWUgaWYgaXQgaXMgYSBmdW5jdGlvbi5cbiAgICAgICAgICAgIGV2ZW50LmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UoZGF0YVRyYW5zZmVyLmltYWdlKGV2ZW50KSwgMCwgMCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmltYWdlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgZXZlbnQuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShkYXRhVHJhbnNmZXIuaW1hZ2UsIDAsIDApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBmb3JtYXQ6IHN0cmluZyA9IHRoaXMuZm9ybWF0O1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmZvcm1hdCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gQXV0byByZXNvbHZlIHZhbHVlIGZyb20gZnVuY3Rpb24ncyByZXR1cm5lZCB2YWx1ZSBpZiBpdCBpcyBhIGZ1bmN0aW9uLlxuICAgICAgICAgICAgZm9ybWF0ID0gZGF0YVRyYW5zZmVyLmZvcm1hdChldmVudCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmZvcm1hdCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGRhdGFUcmFuc2Zlci5mb3JtYXQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmb3JtYXQgPT09IG51bGwgfHwgdHlwZW9mIGZvcm1hdCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IERFRkFVTFRfRk9STUFUO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxldCBkYXRhOiBhbnkgPSBudWxsO1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmRhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIC8vIEF1dG8gcmVzb2x2ZSB2YWx1ZSBmcm9tIGZ1bmN0aW9uJ3MgcmV0dXJuZWQgdmFsdWUgaWYgaXQgaXMgYSBmdW5jdGlvbi5cbiAgICAgICAgICAgIGRhdGEgPSBkYXRhVHJhbnNmZXIuZGF0YShldmVudCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZGF0YVRyYW5zZmVyLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBkYXRhID0gZGF0YVRyYW5zZmVyLmRhdGE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChmb3JtYXQudG9Mb3dlckNhc2UoKSA9PT0gJ2FwcGxpY2F0aW9uL2pzb24nKSB7XG4gICAgICAgICAgICAvLyBBdXRvIHNlcmlhbGl6ZSBkYXRhIGludG8ganNvbiBpZiBpdCBpcyBub3QganNvbiBzdHJpbmcuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBKU09OLnBhcnNlKGRhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaChlKSB7XG4gICAgICAgICAgICAgIC8vIFRoZSBnaXZlbiBcImRhdGFcIiBpcyBub3QganNvbiBzdHJpbmdcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBkYXRhID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgICAgICAgIH0gY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBkYXRhIGNhbm5vdCBiZSBwYXJzZWQgdG8ganNvbiBzdHJpbmdcbiAgICAgICAgICAgICAgICBkYXRhID0gbnVsbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICgoZm9ybWF0ICE9PSBudWxsICYmIHR5cGVvZiBmb3JtYXQgIT09ICd1bmRlZmluZWQnKSB8fFxuICAgICAgICAgICAgICAoZGF0YSAhPT0gbnVsbCAmJiB0eXBlb2YgZGF0YSAhPT0gJ3VuZGVmaW5lZCcpKSB7XG4gICAgICAgICAgICBldmVudC5kYXRhVHJhbnNmZXIuc2V0RGF0YShmb3JtYXQsIGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmF1dG9BZGRDbGFzcykge1xuICAgICAgdGhpcy5hZGRTdHlsZUNsYXNzKENMQVNTX05BTUVfRFJBR0dJTkcpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGhpcy5jb21wb25lbnQub25EcmFnU3RhcnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuY29tcG9uZW50Lm9uRHJhZ1N0YXJ0KGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICAvLyBASG9zdExpc3RlbmVyKCdkcmFnZW5kJywgWyckZXZlbnQnXSlcbiAgcHJpdmF0ZSBvbkRyYWdFbmQoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbXBvbmVudCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5jb21wb25lbnQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYXV0b0FkZENsYXNzKSB7XG4gICAgICB0aGlzLnJlbW92ZVN0eWxlQ2xhc3MoQ0xBU1NfTkFNRV9EUkFHR0lORyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbXBvbmVudC5vbkRyYWdFbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGlmICh0aGlzLmFsd2F5c0ZpcmVFdmVudCB8fCB0aGlzLmlzRHJhZ2dhYmxlKGV2ZW50KSkge1xuICAgICAgICB0aGlzLmNvbXBvbmVudC5vbkRyYWdFbmQoZXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEBIb3N0TGlzdGVuZXIoJ2RyYWcnLCBbJyRldmVudCddKVxuICBwcml2YXRlIG9uRHJhZyhldmVudDogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY29tcG9uZW50ID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLmNvbXBvbmVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMuY29tcG9uZW50Lm9uRHJhZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKHRoaXMuYWx3YXlzRmlyZUV2ZW50IHx8IHRoaXMuaXNEcmFnZ2FibGUoZXZlbnQpKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50Lm9uRHJhZyhldmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=