@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
317 lines • 29.9 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: single-upload.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewChild, TemplateRef, } from '@angular/core';
import { Input, Output, EventEmitter, } from '@angular/core';
import { UploadStatus, IUploadOptions, IFileOptions } from './file-uploader.types';
import { SingleUploadViewComponent } from './single-upload-view.component';
import { SelectFiles } from './select-files.utils';
import { ModalService, ModalAlertComponent } from '@duoduo-oba/ng-devui/modal';
import { last, map } from 'rxjs/operators';
import { I18nService } from '@duoduo-oba/ng-devui/i18n';
export class SingleUploadComponent {
/**
* @param {?} modalService
* @param {?} i18n
* @param {?} selectFiles
*/
constructor(modalService, i18n, selectFiles) {
this.modalService = modalService;
this.i18n = i18n;
this.selectFiles = selectFiles;
this.autoUpload = false;
this.withoutBtn = false;
this.uploadedFiles = [];
this.enableDrop = false;
this.successEvent = new EventEmitter();
this.errorEvent = new EventEmitter();
this.deleteUploadedFileEvent = new EventEmitter();
this.fileDrop = new EventEmitter();
this.fileOver = new EventEmitter();
this.UploadStatus = UploadStatus;
this.isDropOVer = false;
this.i18nText = this.i18n.getI18nText().upload;
this.i18nCommonText = this.i18n.getI18nText().common;
this.i18nSubscription = this.i18n.langChange().subscribe((/**
* @param {?} data
* @return {?}
*/
(data) => {
this.i18nText = data.upload;
this.i18nCommonText = data.common;
}));
}
/**
* @param {?} observale
* @return {?}
*/
_dealFiles(observale) {
observale.pipe(map((/**
* @param {?} file
* @return {?}
*/
file => {
this.singleUploadViewComponent.addFile((/** @type {?} */ (file)));
return file;
}))).subscribe((/**
* @return {?}
*/
() => {
this.singleUploadViewComponent.uploadedFilesComponent.cleanUploadedFiles();
if (this.autoUpload) {
this.upload();
}
}), (/**
* @param {?} error
* @return {?}
*/
(error) => {
this.alertMsg(error.message);
}));
}
/**
* @param {?} $event
* @return {?}
*/
onClick($event) {
this._dealFiles(this.selectFiles.triggerSelectFiles(this.fileOptions, this.uploadOptions));
}
/**
* @return {?}
*/
get filename() {
return (this.singleUploadViewComponent.getFiles()[0] || (/** @type {?} */ ({}))).name || '';
}
/**
* @param {?} files
* @return {?}
*/
onFileDrop(files) {
this.isDropOVer = false;
this._dealFiles(this.selectFiles.triggerDropFiles(this.fileOptions, this.uploadOptions, files));
this.fileDrop.emit(files[0]);
}
/**
* @param {?} event
* @return {?}
*/
onFileOver(event) {
this.isDropOVer = event;
this.fileOver.emit(event);
}
/**
* @return {?}
*/
upload() {
this.canUpload().then((/**
* @param {?} canUpload
* @return {?}
*/
(canUpload) => {
if (!canUpload) {
return;
}
this.singleUploadViewComponent
.upload()
.pipe(last()).subscribe((/**
* @param {?} results
* @return {?}
*/
(results) => {
this.successEvent.emit(results);
results.forEach((/**
* @param {?} result
* @return {?}
*/
(result) => {
this.singleUploadViewComponent.deleteFile(result.file);
this.singleUploadViewComponent.uploadedFilesComponent.addAndOverwriteFile(result.file);
}));
}), (/**
* @param {?} error
* @return {?}
*/
(error) => {
this.singleUploadViewComponent.uploadedFilesComponent.cleanUploadedFiles();
this.errorEvent.emit(error);
}));
}));
}
/**
* @return {?}
*/
canUpload() {
/** @type {?} */
let uploadResult = Promise.resolve(true);
if (this.beforeUpload) {
/** @type {?} */
const result = this.beforeUpload(this.singleUploadViewComponent.getFiles()[0] || (/** @type {?} */ ({})));
if (typeof result !== 'undefined') {
if (result.then) {
uploadResult = result;
}
else if (result.subscribe) {
uploadResult = ((/** @type {?} */ (result))).toPromise();
}
else {
uploadResult = Promise.resolve(result);
}
}
}
return uploadResult;
}
/**
* @param {?} filePath
* @return {?}
*/
_onDeleteUploadedFile(filePath) {
this.deleteUploadedFileEvent.emit(filePath);
}
/**
* @param {?} $event
* @return {?}
*/
deleteFile($event) {
$event.stopPropagation();
/** @type {?} */
const files = this.singleUploadViewComponent.getFiles();
this.singleUploadViewComponent.deleteFile(files[0]);
}
/**
* @param {?} errorMsg
* @return {?}
*/
alertMsg(errorMsg) {
/** @type {?} */
const results = this.modalService.open({
width: '300px',
backdropCloseable: false,
showAnimate: true,
component: ModalAlertComponent,
data: {
content: errorMsg,
cancelBtnText: this.confirmText ? this.confirmText : this.i18nCommonText.btnConfirm,
onClose: (/**
* @param {?} event
* @return {?}
*/
(event) => {
results.modalInstance.hide();
}),
},
});
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.i18nSubscription) {
this.i18nSubscription.unsubscribe();
}
}
}
SingleUploadComponent.decorators = [
{ type: Component, args: [{
selector: 'd-single-upload',
template: "<div\r\n [style.display]=\"withoutBtn ? '' : '-webkit-inline-box'\"\r\n d-file-drop\r\n [enableDrop]=\"enableDrop\"\r\n [isSingle]=\"true\"\r\n (fileDrop)=\"onFileDrop($event)\"\r\n (fileOver)=\"onFileOver($event)\"\r\n [ngStyle]=\"{ border: isDropOVer ? '1px solid #15bf15' : '0' }\"\r\n>\r\n <div (click)=\"onClick($event)\" class=\"devui-input-group\">\r\n <input\r\n style=\"cursor: pointer\"\r\n class=\"devui-form-control devui-upload-input\"\r\n [placeholder]=\"placeholderText ? placeholderText : i18nText?.chooseFile\"\r\n [value]=\"filename\"\r\n [title]=\"filename\"\r\n readonly\r\n />\r\n <span\r\n *ngIf=\"!!filename\"\r\n class=\"icon-close devui-upload-delete-file-button devui-icon-close-position\"\r\n (click)=\"deleteFile($event)\"\r\n ></span>\r\n <span class=\"devui-input-group-addon\" style=\"cursor: pointer\">\r\n <svg class=\"svg-icon-dot\" height=\"1em\" width=\"1em\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"m400.31892 176.970574c0-61.574381 50.113351-111.680569 111.679545-111.680569 61.576427 0 111.680569 50.106188 111.680569 111.680569 0 61.568241-50.104141 111.679545-111.680569 111.679545-61.566194 0-111.679545-50.111304-111.679545-111.679545zm0 335.028403c0-61.568241 50.113351-111.678522 111.679545-111.678522 61.576427 0 111.680569 50.110281 111.680569 111.678522 0 61.574381-50.105165 111.682615-111.680569 111.682615-61.566194 0-111.679545-50.108235-111.679545-111.682615zm0 335.037612c0-61.572334 50.113351-111.679545 111.679545-111.679545 61.575404 0 111.680569 50.107211 111.680569 111.679545 0 61.567217-50.105165 111.672382-111.680569 111.672382-61.566194 0-111.679545-50.105164-111.679545-111.672382zm0 0\"\r\n />\r\n </svg>\r\n </span>\r\n </div>\r\n <d-button\r\n *ngIf=\"!autoUpload && !withoutBtn\"\r\n (btnClick)=\"upload()\"\r\n bsStyle=\"common\"\r\n [style.margin-left.px]=\"10\"\r\n [disabled]=\"\r\n dSingleUploadView.uploadedFilesComponent.uploadedFiles.length > 0 ||\r\n dSingleUploadView.fileUploaders[0]?.status === UploadStatus.uploading\r\n \"\r\n >\r\n <span *ngIf=\"!dSingleUploadView.fileUploaders[0] || dSingleUploadView.fileUploaders[0]?.status === UploadStatus.preLoad\">{{\r\n uploadText || i18nText?.upload\r\n }}</span>\r\n <span *ngIf=\"dSingleUploadView.fileUploaders[0]?.status === UploadStatus.uploading\">{{ i18nText?.uploading }}</span>\r\n <span *ngIf=\"dSingleUploadView.fileUploaders[0]?.status === UploadStatus.uploaded\">{{ i18nText?.uploaded }}</span>\r\n <span *ngIf=\"dSingleUploadView.fileUploaders[0]?.status === UploadStatus.failed\">{{ i18nText?.uploadFailed }}</span>\r\n </d-button>\r\n</div>\r\n<d-single-upload-view\r\n #dSingleUploadView=\"dSingleUploadView\"\r\n [uploadOptions]=\"uploadOptions\"\r\n [filePath]=\"filePath\"\r\n [uploadedFiles]=\"uploadedFiles\"\r\n [uploadedFilesRef]=\"uploadedFilesRef\"\r\n [preloadFilesRef]=\"preloadFilesRef\"\r\n (deleteUploadedFileEvent)=\"_onDeleteUploadedFile($event)\"\r\n>\r\n</d-single-upload-view>\r\n",
exportAs: 'dSingleUpload',
styles: [".devui-input-group{position:relative;display:table;border-collapse:separate}.devui-input-group:hover .devui-input-group-addon{border-color:#344899;background-color:#dfe1e6;font-weight:700}.devui-input-group:hover .devui-form-control{border-color:#344899 #adb0b8 #344899 #344899}.devui-input-group .devui-input-group-addon:active{border-color:#344899 #adb0b8 #344899 #344899;background-color:#dfe1e6}.devui-input-group .devui-input-group-addon{width:1%;white-space:nowrap;vertical-align:middle;padding:5px 10px;font-size:14px;font-weight:400;line-height:1;color:#252b3a;text-align:center;background-color:#f8f8f8;border-top:1px solid #adb0b8;border-bottom:1px solid #adb0b8;border-right:1px solid #adb0b8;border-top-right-radius:1px;border-bottom-right-radius:1px;display:table-cell;-webkit-transition:border-color .15s ease-in-out;transition:border-color .15s ease-in-out;cursor:pointer}.devui-input-group .devui-form-control{cursor:pointer;display:block;width:100%;height:32px;padding:5px 10px;font-size:14px;line-height:1.42857143;color:#252b3a;background-image:none;border:1px solid #adb0b8;border-top-left-radius:1px;border-bottom-left-radius:1px;-webkit-transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out}svg.svg-icon-dot>path{fill:#252b3a}.devui-form-control{outline:0}.devui-icon-close-position{position:absolute;top:calc(50% - 7px);right:50px}"]
}] }
];
/** @nocollapse */
SingleUploadComponent.ctorParameters = () => [
{ type: ModalService },
{ type: I18nService },
{ type: SelectFiles }
];
SingleUploadComponent.propDecorators = {
uploadOptions: [{ type: Input }],
fileOptions: [{ type: Input }],
autoUpload: [{ type: Input }],
withoutBtn: [{ type: Input }],
uploadedFiles: [{ type: Input }],
uploadedFilesRef: [{ type: Input }],
preloadFilesRef: [{ type: Input }],
filePath: [{ type: Input }],
placeholderText: [{ type: Input }],
uploadText: [{ type: Input }],
confirmText: [{ type: Input }],
beforeUpload: [{ type: Input }],
enableDrop: [{ type: Input }],
successEvent: [{ type: Output }],
errorEvent: [{ type: Output }],
deleteUploadedFileEvent: [{ type: Output }],
fileDrop: [{ type: Output }],
fileOver: [{ type: Output }],
singleUploadViewComponent: [{ type: ViewChild, args: ['dSingleUploadView', { static: true },] }]
};
if (false) {
/** @type {?} */
SingleUploadComponent.prototype.dSingleUploadView;
/** @type {?} */
SingleUploadComponent.prototype.uploadOptions;
/** @type {?} */
SingleUploadComponent.prototype.fileOptions;
/** @type {?} */
SingleUploadComponent.prototype.autoUpload;
/** @type {?} */
SingleUploadComponent.prototype.withoutBtn;
/** @type {?} */
SingleUploadComponent.prototype.uploadedFiles;
/** @type {?} */
SingleUploadComponent.prototype.uploadedFilesRef;
/** @type {?} */
SingleUploadComponent.prototype.preloadFilesRef;
/** @type {?} */
SingleUploadComponent.prototype.filePath;
/** @type {?} */
SingleUploadComponent.prototype.placeholderText;
/** @type {?} */
SingleUploadComponent.prototype.uploadText;
/** @type {?} */
SingleUploadComponent.prototype.confirmText;
/** @type {?} */
SingleUploadComponent.prototype.beforeUpload;
/** @type {?} */
SingleUploadComponent.prototype.enableDrop;
/** @type {?} */
SingleUploadComponent.prototype.successEvent;
/** @type {?} */
SingleUploadComponent.prototype.errorEvent;
/** @type {?} */
SingleUploadComponent.prototype.deleteUploadedFileEvent;
/** @type {?} */
SingleUploadComponent.prototype.fileDrop;
/** @type {?} */
SingleUploadComponent.prototype.fileOver;
/** @type {?} */
SingleUploadComponent.prototype.singleUploadViewComponent;
/** @type {?} */
SingleUploadComponent.prototype.UploadStatus;
/** @type {?} */
SingleUploadComponent.prototype.isDropOVer;
/** @type {?} */
SingleUploadComponent.prototype.i18nText;
/** @type {?} */
SingleUploadComponent.prototype.i18nCommonText;
/** @type {?} */
SingleUploadComponent.prototype.i18nSubscription;
/**
* @type {?}
* @private
*/
SingleUploadComponent.prototype.modalService;
/**
* @type {?}
* @private
*/
SingleUploadComponent.prototype.i18n;
/**
* @type {?}
* @private
*/
SingleUploadComponent.prototype.selectFiles;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLXVwbG9hZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS91cGxvYWQvIiwic291cmNlcyI6WyJzaW5nbGUtdXBsb2FkLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULFdBQVcsR0FHWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLFlBQVksRUFDWixjQUFjLEVBQ2QsWUFBWSxFQUNiLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDM0UsT0FBTyxFQUNMLFdBQVcsRUFDWixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxZQUFZLEVBQ1osbUJBQW1CLEVBQ3BCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQWlCLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQVMzRCxNQUFNLE9BQU8scUJBQXFCOzs7Ozs7SUEwQmhDLFlBQW9CLFlBQTBCLEVBQ3BDLElBQWlCLEVBQ2pCLFdBQXdCO1FBRmQsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDcEMsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUNqQixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQXhCekIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGtCQUFhLEdBQWtCLEVBQUUsQ0FBQztRQVFsQyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGlCQUFZLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckQsZUFBVSxHQUFzQixJQUFJLFlBQVks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QUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBRXJDO0lBQ0gsQ0FBQzs7O1lBckpGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsaUJBQWlCO2dCQUMzQix3bEdBQTZDO2dCQUM3QyxRQUFRLEVBQUUsZUFBZTs7YUFFMUI7Ozs7WUFiQyxZQUFZO1lBS1UsV0FBVztZQVJqQyxXQUFXOzs7NEJBbUJWLEtBQUs7MEJBQ0wsS0FBSzt5QkFDTCxLQUFLO3lCQUNMLEtBQUs7NEJBQ0wsS0FBSzsrQkFDTCxLQUFLOzhCQUNMLEtBQUs7dUJBQ0wsS0FBSzs4QkFDTCxLQUFLO3lCQUNMLEtBQUs7MEJBQ0wsS0FBSzsyQkFDTCxLQUFLO3lCQUNMLEtBQUs7MkJBQ0wsTUFBTTt5QkFDTixNQUFNO3NDQUNOLE1BQU07dUJBQ04sTUFBTTt1QkFDTixNQUFNO3dDQUNOLFNBQVMsU0FBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Ozs7SUFuQmhELGtEQUFrQjs7SUFDbEIsOENBQXVDOztJQUN2Qyw0Q0FBbUM7O0lBQ25DLDJDQUE0Qjs7SUFDNUIsMkNBQTRCOztJQUM1Qiw4Q0FBMkM7O0lBQzNDLGlEQUE0Qzs7SUFDNUMsZ0RBQTRDOztJQUM1Qyx5Q0FBMEI7O0lBQzFCLGdEQUFpQzs7SUFDakMsMkNBQTRCOztJQUM1Qiw0Q0FBNkI7O0lBQzdCLDZDQUFrRjs7SUFDbEYsMkNBQTRCOztJQUM1Qiw2Q0FBK0Q7O0lBQy9ELDJDQUE2RDs7SUFDN0Qsd0RBQTBFOztJQUMxRSx5Q0FBMkQ7O0lBQzNELHlDQUEyRDs7SUFDM0QsMERBQXVHOztJQUN2Ryw2Q0FBNEI7O0lBQzVCLDJDQUFtQjs7SUFDbkIseUNBQWtDOztJQUNsQywrQ0FBd0M7O0lBQ3hDLGlEQUErQjs7Ozs7SUFDbkIsNkNBQWtDOzs7OztJQUM1QyxxQ0FBeUI7Ozs7O0lBQ3pCLDRDQUFnQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIFZpZXdDaGlsZCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBIb3N0QmluZGluZyxcclxuICBPbkRlc3Ryb3ksXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7XHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHtcclxuICBVcGxvYWRTdGF0dXMsXHJcbiAgSVVwbG9hZE9wdGlvbnMsXHJcbiAgSUZpbGVPcHRpb25zXHJcbn0gZnJvbSAnLi9maWxlLXVwbG9hZGVyLnR5cGVzJztcclxuaW1wb3J0IHsgU2luZ2xlVXBsb2FkVmlld0NvbXBvbmVudCB9IGZyb20gJy4vc2luZ2xlLXVwbG9hZC12aWV3LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgU2VsZWN0RmlsZXNcclxufSBmcm9tICcuL3NlbGVjdC1maWxlcy51dGlscyc7XHJcbmltcG9ydCB7XHJcbiAgTW9kYWxTZXJ2aWNlLFxyXG4gIE1vZGFsQWxlcnRDb21wb25lbnRcclxufSBmcm9tICduZy1kZXZ1aS9tb2RhbCc7XHJcbmltcG9ydCB7IGxhc3QsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEkxOG5JbnRlcmZhY2UsIEkxOG5TZXJ2aWNlIH0gZnJvbSAnbmctZGV2dWkvaTE4bic7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLXNpbmdsZS11cGxvYWQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9zaW5nbGUtdXBsb2FkLmNvbXBvbmVudC5odG1sJyxcclxuICBleHBvcnRBczogJ2RTaW5nbGVVcGxvYWQnLFxyXG4gIHN0eWxlVXJsczogWycuL3VwbG9hZC12aWV3LmNvbXBvbmVudC5zY3NzJ10sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaW5nbGVVcGxvYWRDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xyXG4gIGRTaW5nbGVVcGxvYWRWaWV3O1xyXG4gIEBJbnB1dCgpIHVwbG9hZE9wdGlvbnM6IElVcGxvYWRPcHRpb25zO1xyXG4gIEBJbnB1dCgpIGZpbGVPcHRpb25zOiBJRmlsZU9wdGlvbnM7XHJcbiAgQElucHV0KCkgYXV0b1VwbG9hZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHdpdGhvdXRCdG4gPSBmYWxzZTtcclxuICBASW5wdXQoKSB1cGxvYWRlZEZpbGVzOiBBcnJheTxPYmplY3Q+ID0gW107XHJcbiAgQElucHV0KCkgdXBsb2FkZWRGaWxlc1JlZjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBASW5wdXQoKSBwcmVsb2FkRmlsZXNSZWY/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIGZpbGVQYXRoOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXJUZXh0OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdXBsb2FkVGV4dDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGNvbmZpcm1UZXh0OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgYmVmb3JlVXBsb2FkOiAoZmlsZSkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj4gfCBPYnNlcnZhYmxlPGJvb2xlYW4+O1xyXG4gIEBJbnB1dCgpIGVuYWJsZURyb3AgPSBmYWxzZTtcclxuICBAT3V0cHV0KCkgc3VjY2Vzc0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZXJyb3JFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIGRlbGV0ZVVwbG9hZGVkRmlsZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgZmlsZURyb3A6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBmaWxlT3ZlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQFZpZXdDaGlsZCgnZFNpbmdsZVVwbG9hZFZpZXcnLCB7IHN0YXRpYzogdHJ1ZSB9KSBzaW5nbGVVcGxvYWRWaWV3Q29tcG9uZW50OiBTaW5nbGVVcGxvYWRWaWV3Q29tcG9uZW50O1xyXG4gIFVwbG9hZFN0YXR1cyA9IFVwbG9hZFN0YXR1cztcclxuICBpc0Ryb3BPVmVyID0gZmFsc2U7XHJcbiAgaTE4blRleHQ6IEkxOG5JbnRlcmZhY2VbJ3VwbG9hZCddO1xyXG4gIGkxOG5Db21tb25UZXh0OiBJMThuSW50ZXJmYWNlWydjb21tb24nXTtcclxuICBpMThuU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcclxuICAgIHByaXZhdGUgaTE4bjogSTE4blNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNlbGVjdEZpbGVzOiBTZWxlY3RGaWxlcykge1xyXG4gICAgdGhpcy5pMThuVGV4dCA9IHRoaXMuaTE4bi5nZXRJMThuVGV4dCgpLnVwbG9hZDtcclxuICAgIHRoaXMuaTE4bkNvbW1vblRleHQgPSB0aGlzLmkxOG4uZ2V0STE4blRleHQoKS5jb21tb247XHJcbiAgICB0aGlzLmkxOG5TdWJzY3JpcHRpb24gPSB0aGlzLmkxOG4ubGFuZ0NoYW5nZSgpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmkxOG5UZXh0ID0gZGF0YS51cGxvYWQ7XHJcbiAgICAgIHRoaXMuaTE4bkNvbW1vblRleHQgPSBkYXRhLmNvbW1vbjtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgX2RlYWxGaWxlcyhvYnNlcnZhbGUpIHtcclxuICAgIG9ic2VydmFsZS5waXBlKG1hcChmaWxlID0+IHtcclxuICAgICAgdGhpcy5zaW5nbGVVcGxvYWRWaWV3Q29tcG9uZW50LmFkZEZpbGUoPEZpbGU+ZmlsZSk7XHJcbiAgICAgIHJldHVybiBmaWxlO1xyXG4gICAgfSkpLnN1YnNjcmliZShcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2luZ2xlVXBsb2FkVmlld0NvbXBvbmVudC51cGxvYWRlZEZpbGVzQ29tcG9uZW50LmNsZWFuVXBsb2FkZWRGaWxlcygpO1xyXG4gICAgICAgIGlmICh0aGlzLmF1dG9VcGxvYWQpIHtcclxuICAgICAgICAgIHRoaXMudXBsb2FkKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3I6IEVycm9yKSA9PiB7XHJcbiAgICAgICAgdGhpcy5hbGVydE1zZyhlcnJvci5tZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG9uQ2xpY2soJGV2ZW50KSB7XHJcbiAgICB0aGlzLl9kZWFsRmlsZXModGhpcy5zZWxlY3RGaWxlcy50cmlnZ2VyU2VsZWN0RmlsZXModGhpcy5maWxlT3B0aW9ucywgdGhpcy51cGxvYWRPcHRpb25zKSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZmlsZW5hbWUoKSB7XHJcbiAgICByZXR1cm4gKHRoaXMuc2luZ2xlVXBsb2FkVmlld0NvbXBvbmVudC5nZXRGaWxlcygpWzBdIHx8IHt9IGFzIEZpbGUpLm5hbWUgfHwgJyc7XHJcbiAgfVxyXG5cclxuICBvbkZpbGVEcm9wKGZpbGVzKSB7XHJcbiAgICB0aGlzLmlzRHJvcE9WZXIgPSBmYWxzZTtcclxuICAgIHRoaXMuX2RlYWxGaWxlcyh0aGlzLnNlbGVjdEZpbGVzLnRyaWdnZXJEcm9wRmlsZXModGhpcy5maWxlT3B0aW9ucywgdGhpcy51cGxvYWRPcHRpb25zLCBmaWxlcykpO1xyXG4gICAgdGhpcy5maWxlRHJvcC5lbWl0KGZpbGVzWzBdKTtcclxuICB9XHJcblxyXG4gIG9uRmlsZU92ZXIoZXZlbnQpIHtcclxuICAgIHRoaXMuaXNEcm9wT1ZlciA9IGV2ZW50O1xyXG4gICAgdGhpcy5maWxlT3Zlci5lbWl0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHVwbG9hZCgpIHtcclxuICAgIHRoaXMuY2FuVXBsb2FkKCkudGhlbigoY2FuVXBsb2FkKSA9PiB7XHJcbiAgICAgIGlmICghY2FuVXBsb2FkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2luZ2xlVXBsb2FkVmlld0NvbXBvbmVudFxyXG4gICAgICAgIC51cGxvYWQoKVxyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgbGFzdCgpXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAocmVzdWx0czogQXJyYXk8eyBmaWxlOiBGaWxlLCByZXNwb25zZTogYW55IH0+KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc3VjY2Vzc0V2ZW50LmVtaXQocmVzdWx0cyk7XHJcbiAgICAgICAgICAgIHJlc3VsdHMuZm9yRWFjaCgocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zaW5nbGVVcGxvYWRWaWV3Q29tcG9uZW50LmRlbGV0ZUZpbGUocmVzdWx0LmZpbGUpO1xyXG4gICAgICAgICAgICAgIHRoaXMuc2luZ2xlVXBsb2FkVmlld0NvbXBvbmVudC51cGxvYWRlZEZpbGVzQ29tcG9uZW50LmFkZEFuZE92ZXJ3cml0ZUZpbGUocmVzdWx0LmZpbGUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zaW5nbGVVcGxvYWRWaWV3Q29tcG9uZW50LnVwbG9hZGVkRmlsZXNDb21wb25lbnQuY2xlYW5VcGxvYWRlZEZpbGVzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuZXJyb3JFdmVudC5lbWl0KGVycm9yKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjYW5VcGxvYWQoKSB7XHJcbiAgICBsZXQgdXBsb2FkUmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKHRydWUpO1xyXG4gICAgaWYgKHRoaXMuYmVmb3JlVXBsb2FkKSB7XHJcbiAgICAgIGNvbnN0IHJlc3VsdDogYW55ID0gdGhpcy5iZWZvcmVVcGxvYWQodGhpcy5zaW5nbGVVcGxvYWRWaWV3Q29tcG9uZW50LmdldEZpbGVzKClbMF0gfHwge30gYXMgRmlsZSk7XHJcbiAgICAgIGlmICh0eXBlb2YgcmVzdWx0ICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgIGlmIChyZXN1bHQudGhlbikge1xyXG4gICAgICAgICAgdXBsb2FkUmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgICAgIH0gZWxzZSBpZiAocmVzdWx0LnN1YnNjcmliZSkge1xyXG4gICAgICAgICAgdXBsb2FkUmVzdWx0ID0gKHJlc3VsdCBhcyBPYnNlcnZhYmxlPGJvb2xlYW4+KS50b1Byb21pc2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdXBsb2FkUmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXBsb2FkUmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgX29uRGVsZXRlVXBsb2FkZWRGaWxlKGZpbGVQYXRoOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGVsZXRlVXBsb2FkZWRGaWxlRXZlbnQuZW1pdChmaWxlUGF0aCk7XHJcbiAgfVxyXG4gIGRlbGV0ZUZpbGUoJGV2ZW50KSB7XHJcbiAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBjb25zdCBmaWxlcyA9IHRoaXMuc2luZ2xlVXBsb2FkVmlld0NvbXBvbmVudC5nZXRGaWxlcygpO1xyXG4gICAgdGhpcy5zaW5nbGVVcGxvYWRWaWV3Q29tcG9uZW50LmRlbGV0ZUZpbGUoZmlsZXNbMF0pO1xyXG4gIH1cclxuICBhbGVydE1zZyhlcnJvck1zZykge1xyXG4gICAgY29uc3QgcmVzdWx0cyA9IHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4oe1xyXG4gICAgICB3aWR0aDogJzMwMHB4JyxcclxuICAgICAgYmFja2Ryb3BDbG9zZWFibGU6IGZhbHNlLFxyXG4gICAgICBzaG93QW5pbWF0ZTogdHJ1ZSxcclxuICAgICAgY29tcG9uZW50OiBNb2RhbEFsZXJ0Q29tcG9uZW50LFxyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgY29udGVudDogZXJyb3JNc2csXHJcbiAgICAgICAgY2FuY2VsQnRuVGV4dDogdGhpcy5jb25maXJtVGV4dCA/IHRoaXMuY29uZmlybVRleHQgOiB0aGlzLmkxOG5Db21tb25UZXh0LmJ0bkNvbmZpcm0sXHJcbiAgICAgICAgb25DbG9zZTogKGV2ZW50KSA9PiB7XHJcbiAgICAgICAgICByZXN1bHRzLm1vZGFsSW5zdGFuY2UuaGlkZSgpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9KTtcclxuICB9XHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5pMThuU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuaTE4blN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG5cclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19