ais-uploader
Version:
Simple uploader library for Angular 2+
329 lines • 24.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ComponentFactoryResolver, Directive, ElementRef, HostListener, Input, Renderer2, ViewContainerRef, } from '@angular/core';
import { UploaderConfig } from '../models/uploader-config';
import { Subscription } from 'rxjs';
import { Output, EventEmitter } from '@angular/core';
import { AisUploaderComponent } from '../ais-uploader.component';
export class UploaderDirective {
/**
* @param {?} factory
* @param {?} ref
* @param {?} viewContainerRef
* @param {?} renderer
*/
constructor(factory, ref, viewContainerRef, renderer) {
this.factory = factory;
this.ref = ref;
this.viewContainerRef = viewContainerRef;
this.renderer = renderer;
this.onChange = new EventEmitter();
this.onProgress = new EventEmitter();
this.onError = new EventEmitter();
this._sub$ = new Subscription();
}
/**
* @return {?}
*/
get config() {
return this._config;
}
/**
* @param {?} config
* @return {?}
*/
set config(config) {
if (config === this._config) {
return;
}
this._config = config;
}
/**
* @return {?}
*/
ngOnInit() {
if (!this.config.apiUrl ||
!this.config.supportedFormats) {
this.onError.emit('Incorrect config!');
return;
}
this._setBtnContainer();
}
/**
* @return {?}
*/
ngOnDestroy() {
this.viewContainerRef.clear();
if (this._clickFn) {
this._clickFn();
}
}
// uploader instance
/**
* @return {?}
*/
get instance() {
if (!this._btnContainer) {
return;
}
return this._btnContainer.instance;
}
// selected file name
/**
* @return {?}
*/
get fileName() {
if (!this.instance) {
return;
}
return this.instance.fileName;
}
// info message
/**
* @return {?}
*/
get tooltipMessage() {
if (!this.instance) {
return;
}
return this.instance.tooltipMessage;
}
// get progress
/**
* @return {?}
*/
get progress() {
if (!this.instance) {
return;
}
return this.instance.uploadingProgress;
}
// delete file from uploader
/**
* @param {?} index
* @return {?}
*/
delete(index) {
if (!this.instance) {
return;
}
this.instance.delete(index);
}
// remove file from uploader
/**
* @param {?=} emit
* @return {?}
*/
clear(emit = true) {
if (!this.instance) {
return;
}
this.instance.clear(emit);
}
// cancel uploading
/**
* @return {?}
*/
preventUploading() {
if (!this.instance) {
return;
}
this.instance.preventUploading();
}
// start uploading
/**
* @return {?}
*/
upload() {
if (!this.instance) {
return;
}
return this.instance.upload();
}
// DROP
/**
* @param {?} event
* @return {?}
*/
onDragOver(event) {
/** @type {?} */
const transfer = this._getTransfer(event);
if (!this._haveFiles(transfer.types)) {
return;
}
transfer.dropEffect = 'copy';
this._preventAndStop(event);
}
/**
* @param {?} event
* @return {?}
*/
onDragLeave(event) {
if (((/** @type {?} */ (this))).element) {
if (event.currentTarget === ((/** @type {?} */ (this))).element[0]) {
return;
}
}
this._preventAndStop(event);
}
/**
* @param {?} event
* @return {?}
*/
onDrop(event) {
if (!this.config.isDropAllowed) {
return;
}
/** @type {?} */
const transfer = this._getTransfer(event);
if (!transfer) {
return;
}
this._preventAndStop(event);
this.instance.loadFile({ target: { files: transfer.files } });
}
/**
* @protected
* @param {?} event
* @return {?}
*/
_getTransfer(event) {
return event.dataTransfer ? event.dataTransfer : event.originalEvent.dataTransfer; // jQuery fix;
}
/**
* @protected
* @param {?} event
* @return {?}
*/
_preventAndStop(event) {
event.preventDefault();
event.stopPropagation();
}
/**
* @protected
* @param {?} types
* @return {?}
*/
_haveFiles(types) {
if (!types) {
return false;
}
if (types.indexOf) {
return types.indexOf('Files') !== -1;
}
else if (types.contains) {
return types.contains('Files');
}
else {
return false;
}
}
// DROP END
/**
* @private
* @return {?}
*/
_setBtnContainer() {
/** @type {?} */
const componentFactory = this.factory.resolveComponentFactory(AisUploaderComponent);
this._btnContainer = this.viewContainerRef.createComponent(componentFactory);
this._btnContainer.instance.config = this.config;
this._clickFn = this.renderer.listen(this.ref.nativeElement, 'click', (e) => this._handleClick(e));
this._sub$.add(this._btnContainer.instance.onChange.subscribe(data => this.onChange.emit(data)));
this._sub$.add(this._btnContainer.instance.onError.subscribe(err => this.onError.emit(err)));
this._sub$.add(this._btnContainer.instance.onProgress.subscribe(progress => this.onProgress.emit(progress)));
}
/**
* @private
* @param {?} event
* @return {?}
*/
_handleClick(event) {
/** @type {?} */
const attributes = Object.values(event.target.attributes).map(el => el['name']);
if (!!attributes.find(attr => attr == 'clear') &&
this.fileName && !this.instance.uploadingProgress) {
this.clear();
return;
}
if (!!attributes.find(attr => attr == 'stop') &&
this.fileName && this.instance.uploadingProgress) {
this.preventUploading();
return;
}
this._btnContainer.instance.select();
}
}
UploaderDirective.decorators = [
{ type: Directive, args: [{
selector: '[uploader]',
exportAs: 'uploader',
},] }
];
/** @nocollapse */
UploaderDirective.ctorParameters = () => [
{ type: ComponentFactoryResolver },
{ type: ElementRef },
{ type: ViewContainerRef },
{ type: Renderer2 }
];
UploaderDirective.propDecorators = {
config: [{ type: Input, args: ['uploader',] }],
onChange: [{ type: Output }],
onProgress: [{ type: Output }],
onError: [{ type: Output }],
onDragOver: [{ type: HostListener, args: ['dragover', ['$event'],] }],
onDragLeave: [{ type: HostListener, args: ['dragleave', ['$event'],] }],
onDrop: [{ type: HostListener, args: ['drop', ['$event'],] }]
};
if (false) {
/** @type {?} */
UploaderDirective.prototype.onChange;
/** @type {?} */
UploaderDirective.prototype.onProgress;
/** @type {?} */
UploaderDirective.prototype.onError;
/**
* @type {?}
* @private
*/
UploaderDirective.prototype._clickFn;
/**
* @type {?}
* @private
*/
UploaderDirective.prototype._btnContainer;
/**
* @type {?}
* @private
*/
UploaderDirective.prototype._config;
/**
* @type {?}
* @private
*/
UploaderDirective.prototype._sub$;
/**
* @type {?}
* @private
*/
UploaderDirective.prototype.factory;
/**
* @type {?}
* @private
*/
UploaderDirective.prototype.ref;
/**
* @type {?}
* @private
*/
UploaderDirective.prototype.viewContainerRef;
/**
* @type {?}
* @private
*/
UploaderDirective.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vYWlzLXVwbG9hZGVyLyIsInNvdXJjZXMiOlsibGliL2RpcmVjdGl2ZXMvdXBsb2FkZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQ0gsd0JBQXdCLEVBQUUsU0FBUyxFQUNuQyxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLGdCQUFnQixHQUNsRixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQU1qRSxNQUFNLE9BQU8saUJBQWlCOzs7Ozs7O0lBc0IxQixZQUNZLE9BQWlDLEVBQ2pDLEdBQWUsRUFDZixnQkFBa0MsRUFDbEMsUUFBbUI7UUFIbkIsWUFBTyxHQUFQLE9BQU8sQ0FBMEI7UUFDakMsUUFBRyxHQUFILEdBQUcsQ0FBWTtRQUNmLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQWJyQixhQUFRLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDakQsZUFBVSxHQUF5QixJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ3RELFlBQU8sR0FBeUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUtyRCxVQUFLLEdBQWlCLElBQUksWUFBWSxFQUFFLENBQUM7SUFRakQsQ0FBQzs7OztJQTNCRCxJQUNJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQzs7Ozs7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFzQjtRQUM3QixJQUFJLE1BQU0s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VXBDLFlBQVksU0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUM7Ozs7SUF4SGhDLHFDQUEyRDs7SUFDM0QsdUNBQWdFOztJQUNoRSxvQ0FBNkQ7Ozs7O0lBRTdELHFDQUEyQjs7Ozs7SUFDM0IsMENBQTJCOzs7OztJQUMzQixvQ0FBZ0M7Ozs7O0lBQ2hDLGtDQUFpRDs7Ozs7SUFHN0Msb0NBQXlDOzs7OztJQUN6QyxnQ0FBdUI7Ozs7O0lBQ3ZCLDZDQUEwQzs7Ozs7SUFDMUMscUNBQTJCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgRGlyZWN0aXZlLFxyXG4gICAgRWxlbWVudFJlZiwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFJlbmRlcmVyMiwgVmlld0NvbnRhaW5lclJlZixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVXBsb2FkZXJDb25maWcgfSBmcm9tICcuLi9tb2RlbHMvdXBsb2FkZXItY29uZmlnJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFpc1VwbG9hZGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vYWlzLXVwbG9hZGVyLmNvbXBvbmVudCc7XHJcblxyXG5ARGlyZWN0aXZlKHtcclxuICAgIHNlbGVjdG9yOiAnW3VwbG9hZGVyXScsXHJcbiAgICBleHBvcnRBczogJ3VwbG9hZGVyJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFVwbG9hZGVyRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gICAgQElucHV0KCd1cGxvYWRlcicpXHJcbiAgICBnZXQgY29uZmlnKCk6IFVwbG9hZGVyQ29uZmlnIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBjb25maWcoY29uZmlnOiBVcGxvYWRlckNvbmZpZykge1xyXG4gICAgICAgIGlmIChjb25maWcgPT09IHRoaXMuX2NvbmZpZykge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2NvbmZpZyA9IGNvbmZpZztcclxuICAgIH1cclxuXHJcbiAgICBAT3V0cHV0KCkgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIG9uUHJvZ3Jlc3M6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgQE91dHB1dCgpIG9uRXJyb3I6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAgIHByaXZhdGUgX2NsaWNrRm46IEZ1bmN0aW9uO1xyXG4gICAgcHJpdmF0ZSBfYnRuQ29udGFpbmVyOiBhbnk7XHJcbiAgICBwcml2YXRlIF9jb25maWc6IFVwbG9hZGVyQ29uZmlnO1xyXG4gICAgcHJpdmF0ZSBfc3ViJDogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZmFjdG9yeTogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxyXG4gICAgICAgIHByaXZhdGUgcmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgICApIHtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICF0aGlzLmNvbmZpZy5hcGlVcmwgfHxcclxuICAgICAgICAgICAgIXRoaXMuY29uZmlnLnN1cHBvcnRlZEZvcm1hdHNcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgdGhpcy5vbkVycm9yLmVtaXQoJ0luY29ycmVjdCBjb25maWchJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fc2V0QnRuQ29udGFpbmVyKCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7XHJcbiAgICAgICAgaWYgKHRoaXMuX2NsaWNrRm4pIHtcclxuICAgICAgICAgICAgdGhpcy5fY2xpY2tGbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyB1cGxvYWRlciBpbnN0YW5jZVxyXG4gICAgZ2V0IGluc3RhbmNlKCk6IEFpc1VwbG9hZGVyQ29tcG9uZW50IHtcclxuICAgICAgICBpZiAoIXRoaXMuX2J0bkNvbnRhaW5lcikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLl9idG5Db250YWluZXIuaW5zdGFuY2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gc2VsZWN0ZWQgZmlsZSBuYW1lXHJcbiAgICBnZXQgZmlsZU5hbWUoKTogc3RyaW5nIHwgc3RyaW5nW10ge1xyXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLmZpbGVOYW1lO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGluZm8gbWVzc2FnZVxyXG4gICAgZ2V0IHRvb2x0aXBNZXNzYWdlKCk6IHN0cmluZyB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmluc3RhbmNlKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaW5zdGFuY2UudG9vbHRpcE1lc3NhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZ2V0IHByb2dyZXNzXHJcbiAgICBnZXQgcHJvZ3Jlc3MoKTogbnVtYmVyIHtcclxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS51cGxvYWRpbmdQcm9ncmVzcztcclxuICAgIH1cclxuXHJcbiAgICAvLyBkZWxldGUgZmlsZSBmcm9tIHVwbG9hZGVyXHJcbiAgICBkZWxldGUoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaW5zdGFuY2UuZGVsZXRlKGluZGV4KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyByZW1vdmUgZmlsZSBmcm9tIHVwbG9hZGVyXHJcbiAgICBjbGVhcihlbWl0OiBib29sZWFuID0gdHJ1ZSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuaW5zdGFuY2UuY2xlYXIoZW1pdCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2FuY2VsIHVwbG9hZGluZ1xyXG4gICAgcHJldmVudFVwbG9hZGluZygpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmluc3RhbmNlLnByZXZlbnRVcGxvYWRpbmcoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBzdGFydCB1cGxvYWRpbmdcclxuICAgIHVwbG9hZCgpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgICAgIGlmICghdGhpcy5pbnN0YW5jZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLmluc3RhbmNlLnVwbG9hZCgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERST1BcclxuICAgIEBIb3N0TGlzdGVuZXIoJ2RyYWdvdmVyJywgWyckZXZlbnQnXSlcclxuICAgIG9uRHJhZ092ZXIoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHRyYW5zZmVyID0gdGhpcy5fZ2V0VHJhbnNmZXIoZXZlbnQpO1xyXG4gICAgICAgIGlmICghdGhpcy5faGF2ZUZpbGVzKHRyYW5zZmVyLnR5cGVzKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnY29weSc7XHJcbiAgICAgICAgdGhpcy5fcHJldmVudEFuZFN0b3AoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIFsnJGV2ZW50J10pXHJcbiAgICBvbkRyYWdMZWF2ZShldmVudDogYW55KTogYW55IHtcclxuICAgICAgICBpZiAoKHRoaXMgYXMgYW55KS5lbGVtZW50KSB7XHJcbiAgICAgICAgICAgIGlmIChldmVudC5jdXJyZW50VGFyZ2V0ID09PSAodGhpcyBhcyBhbnkpLmVsZW1lbnRbMF0pIHtcclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wcmV2ZW50QW5kU3RvcChldmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgQEhvc3RMaXN0ZW5lcignZHJvcCcsIFsnJGV2ZW50J10pXHJcbiAgICBvbkRyb3AoZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5jb25maWcuaXNEcm9wQWxsb3dlZCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHRyYW5zZmVyID0gdGhpcy5fZ2V0VHJhbnNmZXIoZXZlbnQpO1xyXG4gICAgICAgIGlmICghdHJhbnNmZXIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9wcmV2ZW50QW5kU3RvcChldmVudCk7XHJcbiAgICAgICAgdGhpcy5pbnN0YW5jZS5sb2FkRmlsZSh7dGFyZ2V0OiB7ZmlsZXM6IHRyYW5zZmVyLmZpbGVzfX0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZ2V0VHJhbnNmZXIoZXZlbnQ6IGFueSk6IGFueSB7XHJcbiAgICAgICAgcmV0dXJuIGV2ZW50LmRhdGFUcmFuc2ZlciA/IGV2ZW50LmRhdGFUcmFuc2ZlciA6IGV2ZW50Lm9yaWdpbmFsRXZlbnQuZGF0YVRyYW5zZmVyOyAvLyBqUXVlcnkgZml4O1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfcHJldmVudEFuZFN0b3AoZXZlbnQ6IGFueSk6IGFueSB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2hhdmVGaWxlcyh0eXBlczogYW55KTogYW55IHtcclxuICAgICAgICBpZiAoIXR5cGVzKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVzLmluZGV4T2YpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHR5cGVzLmluZGV4T2YoJ0ZpbGVzJykgIT09IC0xO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZXMuY29udGFpbnMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHR5cGVzLmNvbnRhaW5zKCdGaWxlcycpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRFJPUCBFTkRcclxuXHJcbiAgICBwcml2YXRlIF9zZXRCdG5Db250YWluZXIoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgY29tcG9uZW50RmFjdG9yeSA9IHRoaXMuZmFjdG9yeS5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShBaXNVcGxvYWRlckNvbXBvbmVudCk7XHJcbiAgICAgICAgdGhpcy5fYnRuQ29udGFpbmVyID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTtcclxuICAgICAgICB0aGlzLl9idG5Db250YWluZXIuaW5zdGFuY2UuY29uZmlnID0gdGhpcy5jb25maWc7XHJcbiAgICAgICAgdGhpcy5fY2xpY2tGbiA9IHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQsICdjbGljaycsIChlKSA9PiB0aGlzLl9oYW5kbGVDbGljayhlKSk7XHJcbiAgICAgICAgdGhpcy5fc3ViJC5hZGQodGhpcy5fYnRuQ29udGFpbmVyLmluc3RhbmNlLm9uQ2hhbmdlLnN1YnNjcmliZShkYXRhID0+IHRoaXMub25DaGFuZ2UuZW1pdChkYXRhKSkpO1xyXG4gICAgICAgIHRoaXMuX3N1YiQuYWRkKHRoaXMuX2J0bkNvbnRhaW5lci5pbnN0YW5jZS5vbkVycm9yLnN1YnNjcmliZShlcnIgPT4gdGhpcy5vbkVycm9yLmVtaXQoZXJyKSkpO1xyXG4gICAgICAgIHRoaXMuX3N1YiQuYWRkKHRoaXMuX2J0bkNvbnRhaW5lci5pbnN0YW5jZS5vblByb2dyZXNzLnN1YnNjcmliZShwcm9ncmVzcyA9PiB0aGlzLm9uUHJvZ3Jlc3MuZW1pdChwcm9ncmVzcykpKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9oYW5kbGVDbGljayhldmVudCk6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSBPYmplY3QudmFsdWVzKGV2ZW50LnRhcmdldC5hdHRyaWJ1dGVzKS5tYXAoZWwgPT4gZWxbJ25hbWUnXSk7XHJcbiAgICAgICAgaWYgKCEhYXR0cmlidXRlcy5maW5kKGF0dHIgPT4gYXR0ciA9PSAnY2xlYXInKSAmJlxyXG4gICAgICAgICAgICB0aGlzLmZpbGVOYW1lICYmICF0aGlzLmluc3RhbmNlLnVwbG9hZGluZ1Byb2dyZXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXIoKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoISFhdHRyaWJ1dGVzLmZpbmQoYXR0ciA9PiBhdHRyID09ICdzdG9wJykgJiZcclxuICAgICAgICAgICAgdGhpcy5maWxlTmFtZSAmJiB0aGlzLmluc3RhbmNlLnVwbG9hZGluZ1Byb2dyZXNzKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJldmVudFVwbG9hZGluZygpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2J0bkNvbnRhaW5lci5pbnN0YW5jZS5zZWxlY3QoKTtcclxuICAgIH1cclxuXHJcbn1cclxuIl19