UNPKG

fundamental-ngx

Version:

SAP Fiori Fundamentals, implemented in Angular

280 lines 17.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild } 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. */ var FileInputComponent = /** @class */ (function () { function FileInputComponent() { /** * \@Input Whether the file input is disabled. */ this.disabled = false; /** * \@Input Whether the file input should accept multiple files. */ this.multiple = true; /** * \@Input Whether the file input accepts drag and dropped files. */ this.dragndrop = true; /** * \@Output Event fired when files are selected. Passed object is the array of files selected. */ this.onSelect = new EventEmitter(); /** * \@Output Event fired when some invalid files are selected. Passed object is the array of invalid files. */ this.onInvalidFiles = new EventEmitter(); /** * \@Output Event fired when the dragged file enters the component boundaries. */ this.onDragEnter = new EventEmitter(); /** * \@Output Event fired when the dragged file exits the component boundaries. */ this.onDragLeave = new EventEmitter(); /** * @hidden */ this.onChange = (/** * @return {?} */ function () { }); /** * @hidden */ this.onTouched = (/** * @return {?} */ function () { }); } /** @hidden */ /** * @hidden * @param {?} fn * @return {?} */ FileInputComponent.prototype.registerOnChange = /** * @hidden * @param {?} fn * @return {?} */ function (fn) { this.onChange = fn; }; /** @hidden */ /** * @hidden * @param {?} fn * @return {?} */ FileInputComponent.prototype.registerOnTouched = /** * @hidden * @param {?} fn * @return {?} */ function (fn) { this.onTouched = fn; }; /** @hidden */ /** * @hidden * @param {?} isDisabled * @return {?} */ FileInputComponent.prototype.setDisabledState = /** * @hidden * @param {?} isDisabled * @return {?} */ function (isDisabled) { this.disabled = isDisabled; }; /** @hidden */ /** * @hidden * @param {?} files * @return {?} */ FileInputComponent.prototype.writeValue = /** * @hidden * @param {?} files * @return {?} */ function (files) { // not needed - should be handled by user. }; /** @hidden */ /** * @hidden * @param {?} event * @return {?} */ FileInputComponent.prototype.selectHandler = /** * @hidden * @param {?} event * @return {?} */ function (event) { var _this = this; if (this.maxFileSize) { /** @type {?} */ var valid_files_1 = []; /** @type {?} */ var invalid_files_1 = []; event.forEach((/** * @param {?} file * @return {?} */ function (file) { if (file.size < _this.maxFileSize) { valid_files_1.push(file); } else { invalid_files_1.push(file); } })); if (valid_files_1.length > 0) { this.onChange(valid_files_1); this.onSelect.emit(valid_files_1); } if (invalid_files_1.length > 0) { this.onInvalidFiles.emit(invalid_files_1); } } else { this.onChange(event); this.onSelect.emit(event); } }; /** * Opens the file selector. */ /** * Opens the file selector. * @return {?} */ FileInputComponent.prototype.open = /** * Opens the file selector. * @return {?} */ function () { this.inputRef.nativeElement.click(); }; /** * Clears the files from the input. */ /** * Clears the files from the input. * @return {?} */ FileInputComponent.prototype.clear = /** * Clears the files from the input. * @return {?} */ function () { 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 {?} */ function () { return FileInputComponent; })), multi: true, }], styles: [":host{display:inline-block}input.hidden-file-input{display:none}"] }] } ]; FileInputComponent.propDecorators = { 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 }] }; return FileInputComponent; }()); export { FileInputComponent }; if (false) { /** * @hidden * @type {?} */ FileInputComponent.prototype.inputRef; /** * \@Input Whether the file input is disabled. * @type {?} */ FileInputComponent.prototype.disabled; /** * \@Input Whether the file input should accept multiple files. * @type {?} */ FileInputComponent.prototype.multiple; /** * \@Input Accepted file extensions. Format: `'.png,.jpg'`. * @type {?} */ FileInputComponent.prototype.accept; /** * \@Input Whether the file input accepts drag and dropped files. * @type {?} */ FileInputComponent.prototype.dragndrop; /** * \@Input Max file size in bytes that the input will accept. * @type {?} */ FileInputComponent.prototype.maxFileSize; /** * \@Output Event fired when files are selected. Passed object is the array of files selected. * @type {?} */ FileInputComponent.prototype.onSelect; /** * \@Output Event fired when some invalid files are selected. Passed object is the array of invalid files. * @type {?} */ FileInputComponent.prototype.onInvalidFiles; /** * \@Output Event fired when the dragged file enters the component boundaries. * @type {?} */ FileInputComponent.prototype.onDragEnter; /** * \@Output 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mdW5kYW1lbnRhbC1uZ3gvIiwic291cmNlcyI6WyJsaWIvZmlsZS1pbnB1dC9maWxlLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7OztBQU96RTtJQUFBOzs7O1FBcUJJLGFBQVEsR0FBWSxLQUFLLENBQUM7Ozs7UUFJMUIsYUFBUSxHQUFZLElBQUksQ0FBQzs7OztRQVF6QixjQUFTLEdBQVksSUFBSSxDQUFDOzs7O1FBUTFCLGFBQVEsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQzs7OztRQUk1RCxtQkFBYyxHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDOzs7O1FBSWxFLGdCQUFXLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7Ozs7UUFJM0QsZ0JBQVcsR0FBdUIsSUFBSSxZQUFZLEVBQVEsQ0FBQzs7OztRQUczRCxhQUFROzs7UUFBYSxjQUFPLENBQUMsRUFBQzs7OztRQUc5QixjQUFTOzs7UUFBYSxjQUFPLENBQUMsRUFBQztJQThEbkMsQ0FBQztJQTVERyxjQUFjOzs7Ozs7SUFDZCw2Q0FBZ0I7Ozs7O0lBQWhCLFVBQWlCLEVBQU87UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELGNBQWM7Ozs7OztJQUNkLDhDQUFpQjs7Ozs7SUFBakIsVUFBa0IsRUFBTztRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsY0FBYzs7Ozs7O0lBQ2QsNkNBQWdCOzs7OztJQUFoQixVQUFpQixVQUFtQjtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0lBRUQsY0FBYzs7Ozs7O0lBQ2QsdUNBQVU7Ozs7O0lBQVYsVUFBVyxLQUFhO1FBQ3BCLDBDQUEwQztJQUM5QyxDQUFDO0lBRUQsY0FBYzs7Ozs7O0lBQ2QsMENBQWE7Ozs7O0lBQWIsVUFBYyxLQUFhO1FBQTNCLGlCQXNCQztRQXJCRyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7O2dCQUNaLGFBQVcsR0FBVyxFQUFFOztnQkFDeEIsZUFBYSxHQUFXLEVBQUU7WUFDaEMsS0FBSyxDQUFDLE9BQU87Ozs7WUFBQyxVQUFBLElBQUk7Z0JBQ2QsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUksQ0FBQyxXQUFXLEVBQUU7b0JBQzlCLGFBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzFCO3FCQUFNO29CQUNILGVBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzVCO1lBQ0wsQ0FBQyxFQUFDLENBQUM7WUFDSCxJQUFJLGFBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQVcsQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFXLENBQUMsQ0FBQzthQUNuQztZQUNELElBQUksZUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGVBQWEsQ0FBQyxDQUFDO2FBQzNDO1NBQ0o7YUFBTTtZQUNILElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0I7SUFDTCxDQUFDO0lBRUQ7O09BRUc7Ozs7O0lBQ0ksaUNBQUk7Ozs7SUFBWDtRQUNJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRzs7Ozs7SUFDSSxrQ0FBSzs7OztJQUFaO1FBQ0ksSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3RCLENBQUM7O2dCQXZISixTQUFTLFNBQUM7b0JBQ1AsUUFBUSxFQUFFLGVBQWU7b0JBQ3pCLDhvQkFBMEM7b0JBRTFDLElBQUksRUFBRTt3QkFDRixRQUFRLEVBQUUsYUFBYTtxQkFDMUI7b0JBQ0QsU0FBUyxFQUFFLENBQUM7NEJBQ1IsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVU7Ozs0QkFBQyxjQUFNLE9BQUEsa0JBQWtCLEVBQWxCLENBQWtCLEVBQUM7NEJBQ2pELEtBQUssRUFBRSxJQUFJO3lCQUNkLENBQUM7O2lCQUNMOzs7MkJBSUksU0FBUyxTQUFDLE9BQU87MkJBSWpCLEtBQUs7MkJBSUwsS0FBSzt5QkFJTCxLQUFLOzRCQUlMLEtBQUs7OEJBSUwsS0FBSzsyQkFJTCxNQUFNO2lDQUlOLE1BQU07OEJBSU4sTUFBTTs4QkFJTixNQUFNOztJQXFFWCx5QkFBQztDQUFBLEFBekhELElBeUhDO1NBNUdZLGtCQUFrQjs7Ozs7O0lBRzNCLHNDQUNxQjs7Ozs7SUFHckIsc0NBQzBCOzs7OztJQUcxQixzQ0FDeUI7Ozs7O0lBR3pCLG9DQUNlOzs7OztJQUdmLHVDQUMwQjs7Ozs7SUFHMUIseUNBQ29COzs7OztJQUdwQixzQ0FDNEQ7Ozs7O0lBRzVELDRDQUNrRTs7Ozs7SUFHbEUseUNBQzJEOzs7OztJQUczRCx5Q0FDMkQ7Ozs7O0lBRzNELHNDQUE4Qjs7Ozs7SUFHOUIsdUNBQStCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG4vKipcbiAqIFRvb2wgdG8gZmFjaWxpdGF0ZSB0aGUgaW5wdXQgb2YgZmlsZXMgZnJvbSB0aGUgdXNlci5cbiAqIEl0IHN1cHBvcnRzIGRyYWcgYW5kIGRyb3AsIG11bHRpcGxlIGlucHV0LCBtYXggZmlsZSBzaXplIGFuZCBtb3JlLlxuICogVGhlIGRyYWcgZXZlbnRzIG1ha2UgaXQgdmVyeSBlYXN5IHRvIGNyZWF0ZSBhbmQgc3R5bGUgZWxlbWVudHMgbGlrZSBhIGRyb3B6b25lLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2ZkLWZpbGUtaW5wdXQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9maWxlLWlucHV0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9maWxlLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaG9zdDoge1xuICAgICAgICAnKGJsdXIpJzogJ29uVG91Y2hlZCgpJ1xuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbe1xuICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRmlsZUlucHV0Q29tcG9uZW50KSxcbiAgICAgICAgbXVsdGk6IHRydWUsXG4gICAgfV0sXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnKVxuICAgIGlucHV0UmVmOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqIEBJbnB1dCBXaGV0aGVyIHRoZSBmaWxlIGlucHV0IGlzIGRpc2FibGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBASW5wdXQgV2hldGhlciB0aGUgZmlsZSBpbnB1dCBzaG91bGQgYWNjZXB0IG11bHRpcGxlIGZpbGVzLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgbXVsdGlwbGU6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIEBJbnB1dCBBY2NlcHRlZCBmaWxlIGV4dGVuc2lvbnMuIEZvcm1hdDogYCcucG5nLC5qcGcnYC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGFjY2VwdDogc3RyaW5nO1xuXG4gICAgLyoqIEBJbnB1dCBXaGV0aGVyIHRoZSBmaWxlIGlucHV0IGFjY2VwdHMgZHJhZyBhbmQgZHJvcHBlZCBmaWxlcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGRyYWduZHJvcDogYm9vbGVhbiA9IHRydWU7XG5cbiAgICAvKiogQElucHV0IE1heCBmaWxlIHNpemUgaW4gYnl0ZXMgdGhhdCB0aGUgaW5wdXQgd2lsbCBhY2NlcHQuICovXG4gICAgQElucHV0KClcbiAgICBtYXhGaWxlU2l6ZTogbnVtYmVyO1xuXG4gICAgLyoqIEBPdXRwdXQgRXZlbnQgZmlyZWQgd2hlbiBmaWxlcyBhcmUgc2VsZWN0ZWQuIFBhc3NlZCBvYmplY3QgaXMgdGhlIGFycmF5IG9mIGZpbGVzIHNlbGVjdGVkLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIG9uU2VsZWN0OiBFdmVudEVtaXR0ZXI8RmlsZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpO1xuXG4gICAgLyoqIEBPdXRwdXQgRXZlbnQgZmlyZWQgd2hlbiBzb21lIGludmFsaWQgZmlsZXMgYXJlIHNlbGVjdGVkLiBQYXNzZWQgb2JqZWN0IGlzIHRoZSBhcnJheSBvZiBpbnZhbGlkIGZpbGVzLiAqL1xuICAgIEBPdXRwdXQoKVxuICAgIG9uSW52YWxpZEZpbGVzOiBFdmVudEVtaXR0ZXI8RmlsZVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZVtdPigpO1xuXG4gICAgLyoqIEBPdXRwdXQgRXZlbnQgZmlyZWQgd2hlbiB0aGUgZHJhZ2dlZCBmaWxlIGVudGVycyB0aGUgY29tcG9uZW50IGJvdW5kYXJpZXMuICovXG4gICAgQE91dHB1dCgpXG4gICAgb25EcmFnRW50ZXI6IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcblxuICAgIC8qKiBAT3V0cHV0IEV2ZW50IGZpcmVkIHdoZW4gdGhlIGRyYWdnZWQgZmlsZSBleGl0cyB0aGUgY29tcG9uZW50IGJvdW5kYXJpZXMuICovXG4gICAgQE91dHB1dCgpXG4gICAgb25EcmFnTGVhdmU6IEV2ZW50RW1pdHRlcjxudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVsbD4oKTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgb25DaGFuZ2U6IEZ1bmN0aW9uID0gKCkgPT4ge307XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG9uVG91Y2hlZDogRnVuY3Rpb24gPSAoKSA9PiB7fTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHdyaXRlVmFsdWUoZmlsZXM6IEZpbGVbXSk6IHZvaWQge1xuICAgICAgICAvLyBub3QgbmVlZGVkIC0gc2hvdWxkIGJlIGhhbmRsZWQgYnkgdXNlci5cbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHNlbGVjdEhhbmRsZXIoZXZlbnQ6IEZpbGVbXSkge1xuICAgICAgICBpZiAodGhpcy5tYXhGaWxlU2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgdmFsaWRfZmlsZXM6IEZpbGVbXSA9IFtdO1xuICAgICAgICAgICAgY29uc3QgaW52YWxpZF9maWxlczogRmlsZVtdID0gW107XG4gICAgICAgICAgICBldmVudC5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChmaWxlLnNpemUgPCB0aGlzLm1heEZpbGVTaXplKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkX2ZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW52YWxpZF9maWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHZhbGlkX2ZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHZhbGlkX2ZpbGVzKTtcbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0LmVtaXQodmFsaWRfZmlsZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGludmFsaWRfZmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25JbnZhbGlkRmlsZXMuZW1pdChpbnZhbGlkX2ZpbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgICAgdGhpcy5vblNlbGVjdC5lbWl0KGV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBmaWxlIHNlbGVjdG9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0UmVmLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhcnMgdGhlIGZpbGVzIGZyb20gdGhlIGlucHV0LlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgICAgIHRoaXMub25DaGFuZ2UoW10pO1xuICAgIH1cblxufVxuIl19