UNPKG

gentics-ui-core

Version:

This is the common core framework for the Gentics CMS and Mesh UI, and other Angular applications.

219 lines 28.6 kB
import { Directive, ElementRef, EventEmitter, Inject, Input, NgZone } from '@angular/core'; import { InjectionToken, Optional, Output } from '@angular/core'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { clientReportsMimeTypesOnDrag, getDataTransfer, transferHasFiles } from './drag-drop-utils'; import { DragStateTrackerFactory } from './drag-state-tracker.service'; import { matchesMimeType } from './matches-mime-type'; import { PageFileDragHandler } from './page-file-drag-handler.service'; import * as i0 from "@angular/core"; import * as i1 from "./page-file-drag-handler.service"; import * as i2 from "./drag-state-tracker.service"; const defaultOptions = { accept: '*', disabled: false, multiple: true }; /** * A token that can be used to inject a mock into the directive * @internal */ export const FILE_DROPAREA_DRAG_EVENT_TARGET = new InjectionToken('FILE_DROPAREA_DRAG_EVENT_TARGET'); /** * File upload area that accepts files via drag and drop. * * ```html * <gtx-file-drop-area (fileDrop)="files = $event">Upload files via drag & drop</gtx-file-drop-area> * <div gtx-file-drop-area (fileDrop)="files = $event">Upload files via drag & drop</div> * ``` */ export class FileDropArea { constructor(elementRef, dragEventTarget, pageDrag, fileDrag, zone) { this.pageDrag = pageDrag; this.fileDrag = fileDrag; /** * Fires when a file or files are dragged over the drop area. */ this.fileDragEnter = new EventEmitter(); /** * Fires when a file or files are dragged out of the drop area. */ this.fileDragLeave = new EventEmitter(); /** * Fires when a file or files are dropped on the drop area. */ this.fileDrop = new EventEmitter(); /** * Fires when a file or files which do not match the "accepted" option * are dropped on the drop area. */ this.fileDropReject = new EventEmitter(); /** * Fires when a file or files are dragged into the page. */ this.pageDragEnter = new EventEmitter(); /** * Fires when a file or files is dragged out of the page. */ this.pageDragLeave = new EventEmitter(); this._draggedFiles = []; this._isDraggedOver = false; this._isPageDraggedOver = false; this._filesDraggedInPage = []; this._options = defaultOptions; this._subscriptions = []; this.accepts = (file) => { return !clientReportsMimeTypesOnDrag() || matchesMimeType(file.type, this._options.accept); }; this.onDragEnterOver = (event) => { let transfer = getDataTransfer(event); if (!transferHasFiles(transfer)) { return; } if (this._isDraggedOver && !this._options.disabled) { transfer.dropEffect = 'copy'; } else { transfer.dropEffect = 'none'; transfer.effectAllowed = 'none'; } event.preventDefault(); }; this.onDrop = (event) => { let transfer = getDataTransfer(event); if (event.defaultPrevented || !transferHasFiles(transfer) || this._options.disabled) { return; } event.preventDefault(); transfer.dropEffect = 'copy'; let files = Array.from(transfer.files); let acceptedFiles = []; let rejectedFiles = []; // Check if the dropped files match the "accept" option for (let file of files) { if (matchesMimeType(file.type, this._options.accept)) { acceptedFiles.push(file); } else { rejectedFiles.push(file); } } if (acceptedFiles.length > 0) { this.fileDrop.emit(acceptedFiles); } if (rejectedFiles.length > 0) { this.fileDropReject.emit(rejectedFiles); } }; this._eventTarget = dragEventTarget || elementRef.nativeElement; this.draggedFiles$ = fileDrag.trackElement(this._eventTarget).pipe(map(files => files.filter(this.accepts))); this.filesDraggedInPage$ = pageDrag.filesDragged$.pipe(map(files => files.filter(this.accepts))); this._subscriptions = [ this.draggedFiles$.subscribe(files => { zone.runGuarded(() => { this._isDraggedOver = files.length > 0; this._draggedFiles = files; if (files.length > 0) { this.fileDragEnter.emit(files); } else { this.fileDragLeave.emit(undefined); } }); }), this.filesDraggedInPage$.subscribe(filesInPage => { zone.runGuarded(() => { this._isPageDraggedOver = filesInPage.length > 0; this._filesDraggedInPage = filesInPage; if (filesInPage.length > 0) { this.pageDragEnter.emit(filesInPage); } else { this.pageDragLeave.emit(undefined); } }); }) ]; } /** * Returns true if an accepted file is dragged on the drop area. */ get dragHovered() { return this._isDraggedOver; } /** * Returns a list of mime types of accepted files dragged over the drop area. */ get draggedFiles() { return this._draggedFiles; } /** * Returns true if an accepted file is dragged on the page. */ get pageDragHovered() { return this._isPageDraggedOver; } /** * If accepted files are dragged inside the current page / browser tab, * returns a list of the dragged file types, `undefined` otherwise. */ get filesDraggedInPage() { return this._filesDraggedInPage; } /** * Sets options of this drop area. */ get options() { return this._options; } set options(options) { this._options = Object.freeze(Object.assign({}, defaultOptions, options)); } ngOnInit() { this._eventTarget.addEventListener('dragenter', this.onDragEnterOver); this._eventTarget.addEventListener('dragover', this.onDragEnterOver); this._eventTarget.addEventListener('drop', this.onDrop); } ngOnDestroy() { this._subscriptions.forEach(s => s.unsubscribe()); this._eventTarget.removeEventListener('dragenter', this.onDragEnterOver); this._eventTarget.removeEventListener('dragover', this.onDragEnterOver); this._eventTarget.removeEventListener('drop', this.onDrop); this.pageDrag.destroy(); } } /** @nocollapse */ FileDropArea.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: FileDropArea, deps: [{ token: i0.ElementRef }, { token: FILE_DROPAREA_DRAG_EVENT_TARGET, optional: true }, { token: i1.PageFileDragHandler }, { token: i2.DragStateTrackerFactory }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); /** @nocollapse */ FileDropArea.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "12.0.0", version: "13.3.8", type: FileDropArea, selector: "gtx-file-drop-area, [gtxFileDropArea]", inputs: { options: ["gtxFileDropArea", "options"] }, outputs: { draggedFiles$: "draggedFiles$", filesDraggedInPage$: "filesDraggedInPage$", fileDragEnter: "fileDragEnter", fileDragLeave: "fileDragLeave", fileDrop: "fileDrop", fileDropReject: "fileDropReject", pageDragEnter: "pageDragEnter", pageDragLeave: "pageDragLeave" }, providers: [DragStateTrackerFactory, PageFileDragHandler], exportAs: ["gtxFileDropArea"], ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: FileDropArea, decorators: [{ type: Directive, args: [{ selector: 'gtx-file-drop-area, [gtxFileDropArea]', exportAs: 'gtxFileDropArea', providers: [DragStateTrackerFactory, PageFileDragHandler] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [FILE_DROPAREA_DRAG_EVENT_TARGET] }] }, { type: i1.PageFileDragHandler }, { type: i2.DragStateTrackerFactory }, { type: i0.NgZone }]; }, propDecorators: { options: [{ type: Input, args: ['gtxFileDropArea'] }], draggedFiles$: [{ type: Output }], filesDraggedInPage$: [{ type: Output }], fileDragEnter: [{ type: Output }], fileDragLeave: [{ type: Output }], fileDrop: [{ type: Output }], fileDropReject: [{ type: Output }], pageDragEnter: [{ type: Output }], pageDragLeave: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1kcm9wLWFyZWEuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvZmlsZS1kcm9wLWFyZWEvZmlsZS1kcm9wLWFyZWEuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6RixPQUFPLEVBQUMsY0FBYyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBQyxVQUFVLEVBQWUsTUFBTSxNQUFNLENBQUM7QUFDOUMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRW5DLE9BQU8sRUFBQyw0QkFBNEIsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRyxPQUFPLEVBQUMsdUJBQXVCLEVBQWdCLE1BQU0sOEJBQThCLENBQUM7QUFDcEYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLGtDQUFrQyxDQUFDOzs7O0FBd0JyRSxNQUFNLGNBQWMsR0FBeUI7SUFDekMsTUFBTSxFQUFFLEdBQUc7SUFDWCxRQUFRLEVBQUUsS0FBSztJQUNmLFFBQVEsRUFBRSxJQUFJO0NBQ2pCLENBQUM7QUFNRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBRyxJQUFJLGNBQWMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBR3JHOzs7Ozs7O0dBT0c7QUFNSCxNQUFNLE9BQU8sWUFBWTtJQThGckIsWUFBWSxVQUFzQixFQUMrQixlQUFvQixFQUNqRSxRQUE2QixFQUM3QixRQUFpQyxFQUN6QyxJQUFZO1FBRkosYUFBUSxH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O2dCQUtHLGFBQWE7c0JBQXRCLE1BQU07Z0JBS0csUUFBUTtzQkFBakIsTUFBTTtnQkFNRyxjQUFjO3NCQUF2QixNQUFNO2dCQUtHLGFBQWE7c0JBQXRCLE1BQU07Z0JBS0csYUFBYTtzQkFBdEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGlyZWN0aXZlLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE5nWm9uZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0luamVjdGlvblRva2VuLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGUsIFN1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge21hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQge2NsaWVudFJlcG9ydHNNaW1lVHlwZXNPbkRyYWcsIGdldERhdGFUcmFuc2ZlciwgdHJhbnNmZXJIYXNGaWxlc30gZnJvbSAnLi9kcmFnLWRyb3AtdXRpbHMnO1xuaW1wb3J0IHtEcmFnU3RhdGVUcmFja2VyRmFjdG9yeSwgRmlsZURyYWdTdGF0ZX0gZnJvbSAnLi9kcmFnLXN0YXRlLXRyYWNrZXIuc2VydmljZSc7XG5pbXBvcnQge21hdGNoZXNNaW1lVHlwZX0gZnJvbSAnLi9tYXRjaGVzLW1pbWUtdHlwZSc7XG5pbXBvcnQge1BhZ2VGaWxlRHJhZ0hhbmRsZXJ9IGZyb20gJy4vcGFnZS1maWxlLWRyYWctaGFuZGxlci5zZXJ2aWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBJRmlsZURyb3BBcmVhT3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG1pbWUgdHlwZXMgYWNjZXB0ZWQgYnkgdGhlIGRyb3AgYXJlYS4gRGVmYXVsdHMgdG8gXCIqXCIuXG4gICAgICogU29tZSBtaW1lIHR5cGVzIHdpbGwgbm90IGJlIHJlcG9ydGVkIGJ5IHRoZSBjbGllbnQsIHRoZXkgZ2V0IG1hdGNoZWQgYXMgXCJ1bmtub3duL3Vua25vd25cIi5cbiAgICAgKiBAZXhhbXBsZVxuICAgICAqICAgeyBhY2NlcHQ6ICdpbWFnZS8qLCAhaW1hZ2UvZ2lmJyB9XG4gICAgICogICB7IGFjY2VwdDogJ3RleHQvKicgfVxuICAgICAqICAgeyBhY2NlcHQ6ICd2aWRlby8qLCB1bmtub3duLyonIH1cbiAgICAgKi9cbiAgICBhY2NlcHQ/OiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG8gdHJ1ZSB0byBwcmV2ZW50IGludGVyYWN0aW9uIHdpdGggdGhlIGRyb3AgYXJlYS5cbiAgICAgKi9cbiAgICBkaXNhYmxlZD86IGJvb2xlYW47XG5cbiAgICAvKipcbiAgICAgKiBBbGxvdyBtdWx0aXBsZSBmaWxlcyB0byBiZSBkcm9wcGVkIG9uIHRoZSBkcm9wIGFyZWEuIERlZmF1bHRzIHRvIHRydWUuXG4gICAgICovXG4gICAgbXVsdGlwbGU/OiBib29sZWFuO1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogSUZpbGVEcm9wQXJlYU9wdGlvbnMgPSB7XG4gICAgYWNjZXB0OiAnKicsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIG11bHRpcGxlOiB0cnVlXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIElEcmFnZ2VkRmlsZSB7XG4gICAgdHlwZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBpbmplY3QgYSBtb2NrIGludG8gdGhlIGRpcmVjdGl2ZVxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBGSUxFX0RST1BBUkVBX0RSQUdfRVZFTlRfVEFSR0VUID0gbmV3IEluamVjdGlvblRva2VuKCdGSUxFX0RST1BBUkVBX0RSQUdfRVZFTlRfVEFSR0VUJyk7XG5cblxuLyoqXG4gKiBGaWxlIHVwbG9hZCBhcmVhIHRoYXQgYWNjZXB0cyBmaWxlcyB2aWEgZHJhZyBhbmQgZHJvcC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8Z3R4LWZpbGUtZHJvcC1hcmVhIChmaWxlRHJvcCk9XCJmaWxlcyA9ICRldmVudFwiPlVwbG9hZCBmaWxlcyB2aWEgZHJhZyAmIGRyb3A8L2d0eC1maWxlLWRyb3AtYXJlYT5cbiAqIDxkaXYgZ3R4LWZpbGUtZHJvcC1hcmVhIChmaWxlRHJvcCk9XCJmaWxlcyA9ICRldmVudFwiPlVwbG9hZCBmaWxlcyB2aWEgZHJhZyAmIGRyb3A8L2Rpdj5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ2d0eC1maWxlLWRyb3AtYXJlYSwgW2d0eEZpbGVEcm9wQXJlYV0nLFxuICAgIGV4cG9ydEFzOiAnZ3R4RmlsZURyb3BBcmVhJyxcbiAgICBwcm92aWRlcnM6IFtEcmFnU3RhdGVUcmFja2VyRmFjdG9yeSwgUGFnZUZpbGVEcmFnSGFuZGxlcl1cbn0pXG5leHBvcnQgY2xhc3MgRmlsZURyb3BBcmVhIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGFuIGFjY2VwdGVkIGZpbGUgaXMgZHJhZ2dlZCBvbiB0aGUgZHJvcCBhcmVhLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZHJhZ0hvdmVyZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0RyYWdnZWRPdmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBsaXN0IG9mIG1pbWUgdHlwZXMgb2YgYWNjZXB0ZWQgZmlsZXMgZHJhZ2dlZCBvdmVyIHRoZSBkcm9wIGFyZWEuXG4gICAgICovXG4gICAgcHVibGljIGdldCBkcmFnZ2VkRmlsZXMoKTogRmlsZURyYWdTdGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kcmFnZ2VkRmlsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0cnVlIGlmIGFuIGFjY2VwdGVkIGZpbGUgaXMgZHJhZ2dlZCBvbiB0aGUgcGFnZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IHBhZ2VEcmFnSG92ZXJlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzUGFnZURyYWdnZWRPdmVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIElmIGFjY2VwdGVkIGZpbGVzIGFyZSBkcmFnZ2VkIGluc2lkZSB0aGUgY3VycmVudCBwYWdlIC8gYnJvd3NlciB0YWIsXG4gICAgICogcmV0dXJucyBhIGxpc3Qgb2YgdGhlIGRyYWdnZWQgZmlsZSB0eXBlcywgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgZmlsZXNEcmFnZ2VkSW5QYWdlKCk6IEZpbGVEcmFnU3RhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmlsZXNEcmFnZ2VkSW5QYWdlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgb3B0aW9ucyBvZiB0aGlzIGRyb3AgYXJlYS5cbiAgICAgKi9cbiAgICBASW5wdXQoJ2d0eEZpbGVEcm9wQXJlYScpIGdldCBvcHRpb25zKCk6IElGaWxlRHJvcEFyZWFPcHRpb25zIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbnM7XG4gICAgfVxuICAgIHNldCBvcHRpb25zKG9wdGlvbnM6IElGaWxlRHJvcEFyZWFPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuX29wdGlvbnMgPSBPYmplY3QuZnJlZXplKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zLCBvcHRpb25zKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW1pdHMgYSBsaXN0IHdoZW4gZmlsZXMgYXJlIGRyYWdnZWQgb3ZlciB0aGUgZHJvcCBhcmVhLCBgdW5kZWZpbmVkYCBvdGhlcndpc2UuXG4gICAgICogQ2FuIGJlIHVzZWQgd2l0aCBBc3luY1BpcGUgZm9yIGNoYW5nZSBkZXRlY3Rpb24gYW5kIHN1YnNjcmlwdGlvbiBoYW5kbGluZy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZHJhZ2dlZEZpbGVzJDogT2JzZXJ2YWJsZTxGaWxlRHJhZ1N0YXRlPjtcblxuICAgIC8qKlxuICAgICAqIEVtaXRzIGEgbGlzdCB3aGVuIGZpbGVzIGFyZSBkcmFnZ2VkIG92ZXIgdGhlIGRyb3AgYXJlYSwgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICogQ2FuIGJlIHVzZWQgd2l0aCBBc3luY1BpcGUgZm9yIGNoYW5nZSBkZXRlY3Rpb24gYW5kIHN1YnNjcmlwdGlvbiBoYW5kbGluZy5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZmlsZXNEcmFnZ2VkSW5QYWdlJDogT2JzZXJ2YWJsZTxGaWxlRHJhZ1N0YXRlPjtcblxuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBmaWxlIG9yIGZpbGVzIGFyZSBkcmFnZ2VkIG92ZXIgdGhlIGRyb3AgYXJlYS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZmlsZURyYWdFbnRlciA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZURyYWdTdGF0ZT4oKTtcblxuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBmaWxlIG9yIGZpbGVzIGFyZSBkcmFnZ2VkIG91dCBvZiB0aGUgZHJvcCBhcmVhLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBmaWxlRHJhZ0xlYXZlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGZpbGUgb3IgZmlsZXMgYXJlIGRyb3BwZWQgb24gdGhlIGRyb3AgYXJlYS5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZmlsZURyb3AgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVbXT4oKTtcblxuICAgIC8qKlxuICAgICAqIEZpcmVzIHdoZW4gYSBmaWxlIG9yIGZpbGVzIHdoaWNoIGRvIG5vdCBtYXRjaCB0aGUgXCJhY2NlcHRlZFwiIG9wdGlvblxuICAgICAqIGFyZSBkcm9wcGVkIG9uIHRoZSBkcm9wIGFyZWEuXG4gICAgICovXG4gICAgQE91dHB1dCgpIGZpbGVEcm9wUmVqZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlW10+KCk7XG5cbiAgICAvKipcbiAgICAgKiBGaXJlcyB3aGVuIGEgZmlsZSBvciBmaWxlcyBhcmUgZHJhZ2dlZCBpbnRvIHRoZSBwYWdlLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBwYWdlRHJhZ0VudGVyID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlRHJhZ1N0YXRlPigpO1xuXG4gICAgLyoqXG4gICAgICogRmlyZXMgd2hlbiBhIGZpbGUgb3IgZmlsZXMgaXMgZHJhZ2dlZCBvdXQgb2YgdGhlIHBhZ2UuXG4gICAgICovXG4gICAgQE91dHB1dCgpIHBhZ2VEcmFnTGVhdmUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cblxuICAgIHByaXZhdGUgX2RyYWdnZWRGaWxlczogSURyYWdnZWRGaWxlW10gPSBbXTtcbiAgICBwcml2YXRlIF9pc0RyYWdnZWRPdmVyOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfaXNQYWdlRHJhZ2dlZE92ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIF9maWxlc0RyYWdnZWRJblBhZ2U6IElEcmFnZ2VkRmlsZVtdID0gW107XG4gICAgcHJpdmF0ZSBfb3B0aW9ucyA9IGRlZmF1bHRPcHRpb25zO1xuICAgIHByaXZhdGUgX3N1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG4gICAgcHJpdmF0ZSBfZXZlbnRUYXJnZXQ6IEV2ZW50VGFyZ2V0O1xuXG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRklMRV9EUk9QQVJFQV9EUkFHX0VWRU5UX1RBUkdFVCkgZHJhZ0V2ZW50VGFyZ2V0OiBhbnksXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwYWdlRHJhZzogUGFnZUZpbGVEcmFnSGFuZGxlcixcbiAgICAgICAgICAgICAgICBwcml2YXRlIGZpbGVEcmFnOiBEcmFnU3RhdGVUcmFja2VyRmFjdG9yeSxcbiAgICAgICAgICAgICAgICB6b25lOiBOZ1pvbmUpIHtcblxuICAgICAgICB0aGlzLl9ldmVudFRhcmdldCA9IGRyYWdFdmVudFRhcmdldCB8fCBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5kcmFnZ2VkRmlsZXMkID0gZmlsZURyYWcudHJhY2tFbGVtZW50KHRoaXMuX2V2ZW50VGFyZ2V0KS5waXBlKFxuICAgICAgICAgICAgbWFwKGZpbGVzID0+IGZpbGVzLmZpbHRlcih0aGlzLmFjY2VwdHMpKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZmlsZXNEcmFnZ2VkSW5QYWdlJCA9IHBhZ2VEcmFnLmZpbGVzRHJhZ2dlZCQucGlwZShcbiAgICAgICAgICAgIG1hcChmaWxlcyA9PiBmaWxlcy5maWx0ZXIodGhpcy5hY2NlcHRzKSlcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zID0gW1xuICAgICAgICAgICAgdGhpcy5kcmFnZ2VkRmlsZXMkLnN1YnNjcmliZShmaWxlcyA9PiB7XG4gICAgICAgICAgICAgICAgem9uZS5ydW5HdWFyZGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNEcmFnZ2VkT3ZlciA9IGZpbGVzLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2RyYWdnZWRGaWxlcyA9IGZpbGVzO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlRHJhZ0VudGVyLmVtaXQoZmlsZXMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maWxlRHJhZ0xlYXZlLmVtaXQodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLmZpbGVzRHJhZ2dlZEluUGFnZSQuc3Vic2NyaWJlKGZpbGVzSW5QYWdlID0+IHtcbiAgICAgICAgICAgICAgICB6b25lLnJ1bkd1YXJkZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1BhZ2VEcmFnZ2VkT3ZlciA9IGZpbGVzSW5QYWdlLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbGVzRHJhZ2dlZEluUGFnZSA9IGZpbGVzSW5QYWdlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZXNJblBhZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlRHJhZ0VudGVyLmVtaXQoZmlsZXNJblBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlRHJhZ0xlYXZlLmVtaXQodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5vbkRyYWdFbnRlck92ZXIpO1xuICAgICAgICB0aGlzLl9ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMub25EcmFnRW50ZXJPdmVyKTtcbiAgICAgICAgdGhpcy5fZXZlbnRUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMub25Ecm9wKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgdGhpcy5fZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJhZ2VudGVyJywgdGhpcy5vbkRyYWdFbnRlck92ZXIpO1xuICAgICAgICB0aGlzLl9ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMub25EcmFnRW50ZXJPdmVyKTtcbiAgICAgICAgdGhpcy5fZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZHJvcCcsIHRoaXMub25Ecm9wKTtcbiAgICAgICAgdGhpcy5wYWdlRHJhZy5kZXN0cm95KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhY2NlcHRzID0gKGZpbGU6IHt0eXBlOiBzdHJpbmd9KTogYm9vbGVhbiA9PiB7XG4gICAgICAgIHJldHVybiAhY2xpZW50UmVwb3J0c01pbWVUeXBlc09uRHJhZygpIHx8IG1hdGNoZXNNaW1lVHlwZShmaWxlLnR5cGUsIHRoaXMuX29wdGlvbnMuYWNjZXB0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRHJhZ0VudGVyT3ZlciA9IChldmVudDogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIGxldCB0cmFuc2ZlciA9IGdldERhdGFUcmFuc2ZlcihldmVudCk7XG4gICAgICAgIGlmICghdHJhbnNmZXJIYXNGaWxlcyh0cmFuc2ZlcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9pc0RyYWdnZWRPdmVyICYmICF0aGlzLl9vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICAgICAgICB0cmFuc2Zlci5kcm9wRWZmZWN0ID0gJ2NvcHknO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJhbnNmZXIuZHJvcEVmZmVjdCA9ICdub25lJztcbiAgICAgICAgICAgIHRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbm9uZSc7XG4gICAgICAgIH1cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRHJvcCA9IChldmVudDogRHJhZ0V2ZW50KSA9PiB7XG4gICAgICAgIGxldCB0cmFuc2ZlciA9IGdldERhdGFUcmFuc2ZlcihldmVudCk7XG4gICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkIHx8ICF0cmFuc2Zlckhhc0ZpbGVzKHRyYW5zZmVyKSB8fCB0aGlzLl9vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0cmFuc2Zlci5kcm9wRWZmZWN0ID0gJ2NvcHknO1xuXG4gICAgICAgIGxldCBmaWxlcyA9IEFycmF5LmZyb20odHJhbnNmZXIuZmlsZXMpO1xuICAgICAgICBsZXQgYWNjZXB0ZWRGaWxlczogRmlsZVtdID0gW107XG4gICAgICAgIGxldCByZWplY3RlZEZpbGVzOiBGaWxlW10gPSBbXTtcblxuICAgICAgICAvLyBDaGVjayBpZiB0aGUgZHJvcHBlZCBmaWxlcyBtYXRjaCB0aGUgXCJhY2NlcHRcIiBvcHRpb25cbiAgICAgICAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgaWYgKG1hdGNoZXNNaW1lVHlwZShmaWxlLnR5cGUsIHRoaXMuX29wdGlvbnMuYWNjZXB0KSkge1xuICAgICAgICAgICAgICAgIGFjY2VwdGVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0ZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhY2NlcHRlZEZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuZmlsZURyb3AuZW1pdChhY2NlcHRlZEZpbGVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVqZWN0ZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGVEcm9wUmVqZWN0LmVtaXQocmVqZWN0ZWRGaWxlcyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=