fundamental-ngx
Version:
SAP Fundamentals, implemented in Angular
244 lines • 16.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ElementRef, EventEmitter, forwardRef, HostBinding, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/**
* Tool to facilitate the input of files from the user.
* It supports drag and drop, multiple input, max file size and more.
* The drag events make it very easy to create and style elements like a dropzone.
*/
export class FileInputComponent {
constructor() {
/**
* @hidden
*/
this.fdFileInputClass = true;
/**
* Whether the file input is disabled.
*/
this.disabled = false;
/**
* Whether the file input should accept multiple files.
*/
this.multiple = true;
/**
* Whether the file input accepts drag and dropped files.
*/
this.dragndrop = true;
/**
* Event fired when files are selected. Passed object is the array of files selected.
*/
this.onSelect = new EventEmitter();
/**
* Event fired when some invalid files are selected. Passed object is the array of invalid files.
*/
this.onInvalidFiles = new EventEmitter();
/**
* Event fired when the dragged file enters the component boundaries.
*/
this.onDragEnter = new EventEmitter();
/**
* Event fired when the dragged file exits the component boundaries.
*/
this.onDragLeave = new EventEmitter();
/**
* @hidden
*/
this.onChange = (/**
* @return {?}
*/
() => { });
/**
* @hidden
*/
this.onTouched = (/**
* @return {?}
*/
() => { });
}
/**
* @hidden
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChange = fn;
}
/**
* @hidden
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* @hidden
* @param {?} isDisabled
* @return {?}
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
/**
* @hidden
* @param {?} files
* @return {?}
*/
writeValue(files) {
// not needed - should be handled by user.
}
/**
* @hidden
* @param {?} event
* @return {?}
*/
selectHandler(event) {
if (this.maxFileSize) {
/** @type {?} */
const valid_files = [];
/** @type {?} */
const invalid_files = [];
event.forEach((/**
* @param {?} file
* @return {?}
*/
file => {
if (file.size < this.maxFileSize) {
valid_files.push(file);
}
else {
invalid_files.push(file);
}
}));
if (valid_files.length > 0) {
this.onChange(valid_files);
this.onSelect.emit(valid_files);
}
if (invalid_files.length > 0) {
this.onInvalidFiles.emit(invalid_files);
}
}
else {
this.onChange(event);
this.onSelect.emit(event);
}
}
/**
* Opens the file selector.
* @return {?}
*/
open() {
this.inputRef.nativeElement.click();
}
/**
* Clears the files from the input.
* @return {?}
*/
clear() {
this.inputRef.nativeElement.value = '';
this.onChange([]);
}
}
FileInputComponent.decorators = [
{ type: Component, args: [{
selector: 'fd-file-input',
template: "<div style=\"display: block\"\n fdFileDragnDrop\n [accept]=\"accept\"\n [dragndrop]=\"dragndrop\"\n [disabled]=\"disabled\"\n [multiple]=\"multiple\"\n (onFileChange)=\"selectHandler($event)\"\n (onInvalidFiles)=\"onInvalidFiles.emit($event)\"\n (onDragEnter)=\"onDragEnter.emit()\"\n (onDragLeave)=\"onDragLeave.emit()\">\n <ng-content></ng-content>\n</div>\n<input #input\n class=\"hidden-file-input\"\n type=\"file\"\n [attr.accept]=\"accept\"\n (onFileSelect)=\"selectHandler($event)\"\n [multiple]=\"multiple\"\n [disabled]=\"disabled\"\n fdFileSelect>\n\n",
host: {
'(blur)': 'onTouched()'
},
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => FileInputComponent)),
multi: true,
}],
encapsulation: ViewEncapsulation.None,
styles: [".fd-file-input{display:inline-block}.fd-file-input input.hidden-file-input{display:none}"]
}] }
];
FileInputComponent.propDecorators = {
fdFileInputClass: [{ type: HostBinding, args: ['class.fd-file-input',] }],
inputRef: [{ type: ViewChild, args: ['input',] }],
disabled: [{ type: Input }],
multiple: [{ type: Input }],
accept: [{ type: Input }],
dragndrop: [{ type: Input }],
maxFileSize: [{ type: Input }],
onSelect: [{ type: Output }],
onInvalidFiles: [{ type: Output }],
onDragEnter: [{ type: Output }],
onDragLeave: [{ type: Output }]
};
if (false) {
/**
* @hidden
* @type {?}
*/
FileInputComponent.prototype.fdFileInputClass;
/**
* @hidden
* @type {?}
*/
FileInputComponent.prototype.inputRef;
/**
* Whether the file input is disabled.
* @type {?}
*/
FileInputComponent.prototype.disabled;
/**
* Whether the file input should accept multiple files.
* @type {?}
*/
FileInputComponent.prototype.multiple;
/**
* Accepted file extensions. Format: `'.png,.jpg'`.
* @type {?}
*/
FileInputComponent.prototype.accept;
/**
* Whether the file input accepts drag and dropped files.
* @type {?}
*/
FileInputComponent.prototype.dragndrop;
/**
* Max file size in bytes that the input will accept.
* @type {?}
*/
FileInputComponent.prototype.maxFileSize;
/**
* Event fired when files are selected. Passed object is the array of files selected.
* @type {?}
*/
FileInputComponent.prototype.onSelect;
/**
* Event fired when some invalid files are selected. Passed object is the array of invalid files.
* @type {?}
*/
FileInputComponent.prototype.onInvalidFiles;
/**
* Event fired when the dragged file enters the component boundaries.
* @type {?}
*/
FileInputComponent.prototype.onDragEnter;
/**
* Event fired when the dragged file exits the component boundaries.
* @type {?}
*/
FileInputComponent.prototype.onDragLeave;
/**
* @hidden
* @type {?}
*/
FileInputComponent.prototype.onChange;
/**
* @hidden
* @type {?}
*/
FileInputComponent.prototype.onTouched;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mdW5kYW1lbnRhbC1uZ3gvIiwic291cmNlcyI6WyJsaWIvZmlsZS1pbnB1dC9maWxlLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUksT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7QUFxQnpFLE1BQU0sT0FBTyxrQkFBa0I7SUFkL0I7Ozs7UUFrQkkscUJBQWdCLEdBQVksSUFBSSxDQUFDOzs7O1FBUWpDLGFBQVEsR0FBWSxLQUFLLENBQUM7Ozs7UUFJMUIsYUFBUSxHQUFZLElBQUksQ0FBQzs7OztRQVF6QixjQUFTLEdBQVksSUFBSSxDQUFDOzs7O1FBUWpCLGFBQVEsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQzs7OztRQUk1RCxtQkFBYyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDOzs7O1FBSWxFLGdCQUFXLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7Ozs7UUFJM0QsZ0JBQVcsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQzs7OztRQUdwRSxhQUFROzs7UUFBYSxHQUFHLEVBQUUsR0FBRSxDQUFDLEVBQUM7Ozs7UUFHOUIsY0FBUzs7O1FBQWEsR0FBRyxFQUFFLEdBQUUsQ0FBQyxFQUFDO0lBOERuQyxDQUFDOzs7Ozs7SUEzREcsZ0JBQWdCLENBQUMsRUFBTztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDOzs7Ozs7SUFHRCxpQkFBaUIsQ0FBQyxFQUFPO1FBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7Ozs7OztJQUdELGdCQUFnQixDQUFDLFVBQW1CO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7Ozs7OztJQUdELFVBQVUsQ0FBQyxLQUFhO1FBQ3BCLDBDQUEwQztJQUM5QyxDQUFDOzs7Ozs7SUFHRCxhQUFhLENBQUMsS0FBYTtRQUN2QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7O2tCQUNaLFdBQVcsR0FBVyxFQUFFOztrQkFDeEIsYUFBYSxHQUFXLEVBQUU7WUFDaEMsS0FBSyxDQUFDLE9BQU87Ozs7WUFBQyxJQUFJLENBQUMsRUFBRTtnQkFDakIsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQzlCLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzFCO3FCQUFNO29CQUNILGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzVCO1lBQ0wsQ0FBQyxFQUFDLENBQUM7WUFDSCxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNuQztZQUNELElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzNDO1NBQ0o7YUFBTTtZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDOzs7OztJQUtNLElBQUk7UUFDUCxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN4QyxDQUFDOzs7OztJQUtNLEtBQUs7UUFDUixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdEIsQ0FBQzs7O1lBNUhKLFNBQVMsU0FBQztnQkFDUCxRQUFRLEVBQUUsZUFBZTtnQkFDekIsOG9CQUEwQztnQkFFMUMsSUFBSSxFQUFFO29CQUNGLFFBQVEsRUFBRSxhQUFhO2lCQUMxQjtnQkFDRCxTQUFTLEVBQUUsQ0FBQzt3QkFDUixPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsVUFBVTs7O3dCQUFDLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixFQUFDO3dCQUNqRCxLQUFLLEVBQUUsSUFBSTtxQkFDZCxDQUFDO2dCQUNGLGFBQWEsRUFBRSxpQkFBaUIsQ0FBQyxJQUFJOzthQUN4Qzs7OytCQUlJLFdBQVcsU0FBQyxxQkFBcUI7dUJBSWpDLFNBQVMsU0FBQyxPQUFPO3VCQUlqQixLQUFLO3VCQUlMLEtBQUs7cUJBSUwsS0FBSzt3QkFJTCxLQUFLOzBCQUlMLEtBQUs7dUJBSUwsTUFBTTs2QkFJTixNQUFNOzBCQUlOLE1BQU07MEJBSU4sTUFBTTs7Ozs7OztJQXhDUCw4Q0FDaUM7Ozs7O0lBR2pDLHNDQUNxQjs7Ozs7SUFHckIsc0NBQzBCOzs7OztJQUcxQixzQ0FDeUI7Ozs7O0lBR3pCLG9DQUNlOzs7OztJQUdmLHVDQUMwQjs7Ozs7SUFHMUIseUNBQ29COzs7OztJQUdwQixzQ0FDcUU7Ozs7O0lBR3JFLDRDQUMyRTs7Ozs7SUFHM0UseUNBQ29FOzs7OztJQUdwRSx5Q0FDb0U7Ozs7O0lBR3BFLHNDQUE4Qjs7Ozs7SUFHOUIsdUNBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT3V0cHV0LCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qKlxuICogVG9vbCB0byBmYWNpbGl0YXRlIHRoZSBpbnB1dCBvZiBmaWxlcyBmcm9tIHRoZSB1c2VyLlxuICogSXQgc3VwcG9ydHMgZHJhZyBhbmQgZHJvcCwgbXVsdGlwbGUgaW5wdXQsIG1heCBmaWxlIHNpemUgYW5kIG1vcmUuXG4gKiBUaGUgZHJhZyBldmVudHMgbWFrZSBpdCB2ZXJ5IGVhc3kgdG8gY3JlYXRlIGFuZCBzdHlsZSBlbGVtZW50cyBsaWtlIGEgZHJvcHpvbmUuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZmQtZmlsZS1pbnB1dCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2ZpbGUtaW5wdXQuY29tcG9uZW50LnNjc3MnXSxcbiAgICBob3N0OiB7XG4gICAgICAgICcoYmx1ciknOiAnb25Ub3VjaGVkKCknXG4gICAgfSxcbiAgICBwcm92aWRlcnM6IFt7XG4gICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBGaWxlSW5wdXRDb21wb25lbnQpLFxuICAgICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9XSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mZC1maWxlLWlucHV0JylcbiAgICBmZEZpbGVJbnB1dENsYXNzOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnKVxuICAgIGlucHV0UmVmOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGZpbGUgaW5wdXQgaXMgZGlzYWJsZWQuICovXG4gICAgQElucHV0KClcbiAgICBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGZpbGUgaW5wdXQgc2hvdWxkIGFjY2VwdCBtdWx0aXBsZSBmaWxlcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIG11bHRpcGxlOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBBY2NlcHRlZCBmaWxlIGV4dGVuc2lvbnMuIEZvcm1hdDogYCcucG5nLC5qcGcnYC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFjY2VwdDogc3RyaW5nO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGZpbGUgaW5wdXQgYWNjZXB0cyBkcmFnIGFuZCBkcm9wcGVkIGZpbGVzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZHJhZ25kcm9wOiBib29sZWFuID0gdHJ1ZTtcblxuICAgIC8qKiBNYXggZmlsZSBzaXplIGluIGJ5dGVzIHRoYXQgdGhlIGlucHV0IHdpbGwgYWNjZXB0LiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbWF4RmlsZVNpemU6IG51bWJlcjtcblxuICAgIC8qKiBFdmVudCBmaXJlZCB3aGVuIGZpbGVzIGFyZSBzZWxlY3RlZC4gUGFzc2VkIG9iamVjdCBpcyB0aGUgYXJyYXkgb2YgZmlsZXMgc2VsZWN0ZWQuICovXG4gICAgQE91dHB1dCgpXG4gICAgcmVhZG9ubHkgb25TZWxlY3Q6IEV2ZW50RW1pdHRlcjxGaWxlW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxGaWxlW10+KCk7XG5cbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiBzb21lIGludmFsaWQgZmlsZXMgYXJlIHNlbGVjdGVkLiBQYXNzZWQgb2JqZWN0IGlzIHRoZSBhcnJheSBvZiBpbnZhbGlkIGZpbGVzLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IG9uSW52YWxpZEZpbGVzOiBFdmVudEVtaXR0ZXI8RmlsZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpO1xuXG4gICAgLyoqIEV2ZW50IGZpcmVkIHdoZW4gdGhlIGRyYWdnZWQgZmlsZSBlbnRlcnMgdGhlIGNvbXBvbmVudCBib3VuZGFyaWVzLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIHJlYWRvbmx5IG9uRHJhZ0VudGVyOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgICAvKiogRXZlbnQgZmlyZWQgd2hlbiB0aGUgZHJhZ2dlZCBmaWxlIGV4aXRzIHRoZSBjb21wb25lbnQgYm91bmRhcmllcy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBvbkRyYWdMZWF2ZTogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvbkNoYW5nZTogRnVuY3Rpb24gPSAoKSA9PiB7fTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25Ub3VjaGVkOiBGdW5jdGlvbiA9ICgpID0+IHt9O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgd3JpdGVWYWx1ZShmaWxlczogRmlsZVtdKTogdm9pZCB7XG4gICAgICAgIC8vIG5vdCBuZWVkZWQgLSBzaG91bGQgYmUgaGFuZGxlZCBieSB1c2VyLlxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgc2VsZWN0SGFuZGxlcihldmVudDogRmlsZVtdKSB7XG4gICAgICAgIGlmICh0aGlzLm1heEZpbGVTaXplKSB7XG4gICAgICAgICAgICBjb25zdCB2YWxpZF9maWxlczogRmlsZVtdID0gW107XG4gICAgICAgICAgICBjb25zdCBpbnZhbGlkX2ZpbGVzOiBGaWxlW10gPSBbXTtcbiAgICAgICAgICAgIGV2ZW50LmZvckVhY2goZmlsZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGZpbGUuc2l6ZSA8IHRoaXMubWF4RmlsZVNpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRfZmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbnZhbGlkX2ZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodmFsaWRfZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodmFsaWRfZmlsZXMpO1xuICAgICAgICAgICAgICAgIHRoaXMub25TZWxlY3QuZW1pdCh2YWxpZF9maWxlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW52YWxpZF9maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkludmFsaWRGaWxlcy5lbWl0KGludmFsaWRfZmlsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShldmVudCk7XG4gICAgICAgICAgICB0aGlzLm9uU2VsZWN0LmVtaXQoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3BlbnMgdGhlIGZpbGUgc2VsZWN0b3IuXG4gICAgICovXG4gICAgcHVibGljIG9wZW4oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaW5wdXRSZWYubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFycyB0aGUgZmlsZXMgZnJvbSB0aGUgaW5wdXQuXG4gICAgICovXG4gICAgcHVibGljIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0UmVmLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICAgICAgdGhpcy5vbkNoYW5nZShbXSk7XG4gICAgfVxuXG59XG4iXX0=