@kushki/ng-suka
Version:
<p align="center"> <h1 align="center">Suka Components Angular</h1> <p align="center"> An Angular implementation of the Suka Design System </p> </p>
305 lines • 20.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, Input, Output, ViewChild, EventEmitter, HostBinding } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/** @type {?} */
var noop = (/**
* @return {?}
*/
function () { });
var ɵ0 = noop;
var FileUploader = /** @class */ (function () {
function FileUploader() {
/**
* Accessible text for the button that opens the upload window.
*
* Defaults to the `FILE_UPLOADER.OPEN` value from the i18n service
*/
this.buttonText = 'Agregar archivo(s)';
/**
* Type set for button
*/
this.buttonType = 'basic';
/**
* Specify the types of files that the input should be able to receive
*/
this.accept = [];
/**
* Set to `false` to tell the component to only accept a single file on upload.
*
* Defaults to `true`. Accepts multiple files.
*/
this.multiple = true;
/**
* Set to `true` for a loading file uploader.
*/
this.skeleton = false;
/**
* Provides a unique id for the underlying <input> node
*/
this.fileUploaderId = "file-uploader-" + FileUploader.fileUploaderCount;
/**
* The list of files that have been submitted to be uploaded
*/
this.files = new Set();
this.filesChange = new EventEmitter();
this.baseClass = true;
this.onTouchedCallback = noop;
this.onChangeCallback = noop;
FileUploader.fileUploaderCount++;
}
Object.defineProperty(FileUploader.prototype, "value", {
/**
* Specifies the property to be used as the return value to `ngModel`
*/
get: /**
* Specifies the property to be used as the return value to `ngModel`
* @return {?}
*/
function () {
return this.files;
},
set: /**
* @param {?} v
* @return {?}
*/
function (v) {
if (v !== this.files) {
this.files = v;
this.onChangeCallback(v);
}
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
FileUploader.prototype.onBlur = /**
* @return {?}
*/
function () {
this.onTouchedCallback();
};
/**
* Propagates the injected `value`.
*/
/**
* Propagates the injected `value`.
* @param {?} value
* @return {?}
*/
FileUploader.prototype.writeValue = /**
* Propagates the injected `value`.
* @param {?} value
* @return {?}
*/
function (value) {
if (value !== this.value) {
this.files = value;
}
};
/**
* @return {?}
*/
FileUploader.prototype.onFilesAdded = /**
* @return {?}
*/
function () {
var e_1, _a;
/** @type {?} */
var files = this.fileInput.nativeElement.files;
if (!this.multiple) {
this.files.clear();
}
try {
for (var files_1 = tslib_1.__values(files), files_1_1 = files_1.next(); !files_1_1.done; files_1_1 = files_1.next()) {
var file = files_1_1.value;
/** @type {?} */
var fileItem = {
file: file,
uploaded: false,
state: 'edit',
invalid: false,
invalidText: '',
};
this.files.add(fileItem);
this.filesChange.emit(this.files);
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (files_1_1 && !files_1_1.done && (_a = files_1.return)) _a.call(files_1);
}
finally { if (e_1) throw e_1.error; }
}
this.value = this.files;
};
/**
* @param {?} fileItem
* @return {?}
*/
FileUploader.prototype.removeFile = /**
* @param {?} fileItem
* @return {?}
*/
function (fileItem) {
this.files.delete(fileItem);
this.fileInput.nativeElement.value = '';
this.filesChange.emit(this.files);
};
/**
* Registers the injected function to control the touch use of the `FileUploader`.
*/
/**
* Registers the injected function to control the touch use of the `FileUploader`.
* @param {?} fn
* @return {?}
*/
FileUploader.prototype.registerOnTouched = /**
* Registers the injected function to control the touch use of the `FileUploader`.
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onTouchedCallback = fn;
};
/**
* Sets a method in order to propagate changes back to the form.
*/
/**
* Sets a method in order to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
FileUploader.prototype.registerOnChange = /**
* Sets a method in order to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
function (fn) {
this.onChangeCallback = fn;
};
/**
* Counter used to create unique ids for file-uploader components
*/
FileUploader.fileUploaderCount = 0;
FileUploader.decorators = [
{ type: Component, args: [{
selector: 'suka-file-uploader',
template: "\n <ng-container *ngIf=\"!skeleton; else skeletonTemplate\">\n <label class=\"label\">{{title}}</label>\n <div *ngIf=\"description\" class=\"form__helper-text\">{{description}}</div>\n <div class=\"file\">\n <button\n type=\"button\"\n [sukaButton]=\"buttonType\"\n (click)=\"fileInput.click()\"\n [attr.for]=\"fileUploaderId\"\n [size]=\"size\">\n {{buttonText}}\n </button>\n <input\n #fileInput\n type=\"file\"\n class=\"file-input\"\n [accept]=\"accept\"\n [id]=\"fileUploaderId\"\n [multiple]=\"multiple\"\n tabindex=\"-1\"\n (change)=\"onFilesAdded()\"/>\n <div class=\"file-container\">\n <div *ngFor=\"let fileItem of files\">\n <suka-file [fileItem]=\"fileItem\" (remove)=\"removeFile(fileItem)\"></suka-file>\n <div *ngIf=\"fileItem.invalid\" class=\"form-requirement\">\n {{fileItem.invalidText}}\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-template #skeletonTemplate>\n <div class=\"skeleton__text\" style=\"width: 100px\"></div>\n <div class=\"skeleton__text\" style=\"width: 225px\"></div>\n <button sukaButton skeleton=\"true\"></button>\n </ng-template>\n ",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: FileUploader,
multi: true
}
]
}] }
];
/** @nocollapse */
FileUploader.ctorParameters = function () { return []; };
FileUploader.propDecorators = {
buttonText: [{ type: Input }],
buttonType: [{ type: Input }],
title: [{ type: Input }],
description: [{ type: Input }],
accept: [{ type: Input }],
multiple: [{ type: Input }],
skeleton: [{ type: Input }],
size: [{ type: Input }],
fileUploaderId: [{ type: Input }],
fileInput: [{ type: ViewChild, args: ['fileInput', { static: false },] }],
files: [{ type: Input }],
filesChange: [{ type: Output }],
baseClass: [{ type: HostBinding, args: ['class.file-uploader',] }]
};
return FileUploader;
}());
export { FileUploader };
if (false) {
/**
* Counter used to create unique ids for file-uploader components
* @type {?}
*/
FileUploader.fileUploaderCount;
/**
* Accessible text for the button that opens the upload window.
*
* Defaults to the `FILE_UPLOADER.OPEN` value from the i18n service
* @type {?}
*/
FileUploader.prototype.buttonText;
/**
* Type set for button
* @type {?}
*/
FileUploader.prototype.buttonType;
/**
* Text set to the title
* @type {?}
*/
FileUploader.prototype.title;
/**
* Text set to the description
* @type {?}
*/
FileUploader.prototype.description;
/**
* Specify the types of files that the input should be able to receive
* @type {?}
*/
FileUploader.prototype.accept;
/**
* Set to `false` to tell the component to only accept a single file on upload.
*
* Defaults to `true`. Accepts multiple files.
* @type {?}
*/
FileUploader.prototype.multiple;
/**
* Set to `true` for a loading file uploader.
* @type {?}
*/
FileUploader.prototype.skeleton;
/**
* Sets the size of the button.
* @type {?}
*/
FileUploader.prototype.size;
/**
* Provides a unique id for the underlying <input> node
* @type {?}
*/
FileUploader.prototype.fileUploaderId;
/**
* Maintains a reference to the view DOM element of the underlying <input> node
* @type {?}
*/
FileUploader.prototype.fileInput;
/**
* The list of files that have been submitted to be uploaded
* @type {?}
*/
FileUploader.prototype.files;
/** @type {?} */
FileUploader.prototype.filesChange;
/** @type {?} */
FileUploader.prototype.baseClass;
/**
* @type {?}
* @protected
*/
FileUploader.prototype.onTouchedCallback;
/**
* @type {?}
* @protected
*/
FileUploader.prototype.onChangeCallback;
}
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3VzaGtpL25nLXN1a2EvIiwic291cmNlcyI6WyJsaWIvZmlsZS11cGxvYWRlci9maWxlLXVwbG9hZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7SUFJN0MsSUFBSTs7O0FBQUcsY0FBTyxDQUFDLENBQUE7O0FBRXJCO0lBNkdFOzs7Ozs7UUFuRFMsZUFBVSxHQUFHLG9CQUFvQixDQUFDOzs7O1FBSWxDLGVBQVUsR0FBb0UsT0FBTyxDQUFDOzs7O1FBWXRGLFdBQU0sR0FBRyxFQUFFLENBQUM7Ozs7OztRQU1aLGFBQVEsR0FBRyxJQUFJLENBQUM7Ozs7UUFJaEIsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQVFqQixtQkFBYyxHQUFHLG1CQUFpQixZQUFZLENBQUMsaUJBQW1CLENBQUM7Ozs7UUFRbkUsVUFBSyxHQUFHLElBQUksR0FBRyxFQUFZLENBQUM7UUFFM0IsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBRVosY0FBUyxHQUFHLElBQUksQ0FBQztRQUUzQyxzQkFBaUIsR0FBZSxJQUFJLENBQUM7UUFDckMscUJBQWdCLEdBQStCLElBQUksQ0FBQztRQUc1RCxZQUFZLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBS0Qsc0JBQUksK0JBQUs7UUFIVDs7V0FFRzs7Ozs7UUFDSDtZQUNFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztRQUNwQixDQUFDOzs7OztRQUNELFVBQVUsQ0FBZ0I7WUFDeEIsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFD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Ozs7Ozs7SUFNckIsZ0NBQXlCOzs7OztJQUl6QixnQ0FBMEI7Ozs7O0lBSTFCLDRCQUErQjs7Ozs7SUFJL0Isc0NBQTRFOzs7OztJQUk1RSxpQ0FBbUQ7Ozs7O0lBSW5ELDZCQUFxQzs7SUFFckMsbUNBQWdEOztJQUVoRCxpQ0FBcUQ7Ozs7O0lBRXJELHlDQUErQzs7Ozs7SUFDL0Msd0NBQThEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmdcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgRmlsZUl0ZW0gfSBmcm9tICcuL2ZpbGUtaXRlbS5pbnRlcmZhY2UnO1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtZmlsZS11cGxvYWRlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbjsgZWxzZSBza2VsZXRvblRlbXBsYXRlXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiPnt7dGl0bGV9fTwvbGFiZWw+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBjbGFzcz1cImZvcm1fX2hlbHBlci10ZXh0XCI+e3tkZXNjcmlwdGlvbn19PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW3N1a2FCdXR0b25dPVwiYnV0dG9uVHlwZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCJcbiAgICAgICAgICBbYXR0ci5mb3JdPVwiZmlsZVVwbG9hZGVySWRcIlxuICAgICAgICAgIFtzaXplXT1cInNpemVcIj5cbiAgICAgICAgICB7e2J1dHRvblRleHR9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI2ZpbGVJbnB1dFxuICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICBjbGFzcz1cImZpbGUtaW5wdXRcIlxuICAgICAgICAgIFthY2NlcHRdPVwiYWNjZXB0XCJcbiAgICAgICAgICBbaWRdPVwiZmlsZVVwbG9hZGVySWRcIlxuICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVzQWRkZWQoKVwiLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmlsZUl0ZW0gb2YgZmlsZXNcIj5cbiAgICAgICAgICAgIDxzdWthLWZpbGUgW2ZpbGVJdGVtXT1cImZpbGVJdGVtXCIgKHJlbW92ZSk9XCJyZW1vdmVGaWxlKGZpbGVJdGVtKVwiPjwvc3VrYS1maWxlPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbGVJdGVtLmludmFsaWRcIiBjbGFzcz1cImZvcm0tcmVxdWlyZW1lbnRcIj5cbiAgICAgICAgICAgICAge3tmaWxlSXRlbS5pbnZhbGlkVGV4dH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3NrZWxldG9uVGVtcGxhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b25fX3RleHRcIiBzdHlsZT1cIndpZHRoOiAxMDBweFwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uX190ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMjI1cHhcIj48L2Rpdj5cbiAgICAgIDxidXR0b24gc3VrYUJ1dHRvbiBza2VsZXRvbj1cInRydWVcIj48L2J1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBGaWxlVXBsb2FkZXIsXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBGaWxlVXBsb2FkZXIge1xuICAvKipcbiAgICogQ291bnRlciB1c2VkIHRvIGNyZWF0ZSB1bmlxdWUgaWRzIGZvciBmaWxlLXVwbG9hZGVyIGNvbXBvbmVudHNcbiAgICovXG4gIHN0YXRpYyBmaWxlVXBsb2FkZXJDb3VudCA9IDA7XG4gIC8qKlxuICAgKiBBY2Nlc3NpYmxlIHRleHQgZm9yIHRoZSBidXR0b24gdGhhdCBvcGVucyB0aGUgdXBsb2FkIHdpbmRvdy5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gdGhlIGBGSUxFX1VQTE9BREVSLk9QRU5gIHZhbHVlIGZyb20gdGhlIGkxOG4gc2VydmljZVxuICAgKi9cbiAgQElucHV0KCkgYnV0dG9uVGV4dCA9ICdBZ3JlZ2FyIGFyY2hpdm8ocyknO1xuICAvKipcbiAgICogVHlwZSBzZXQgZm9yIGJ1dHRvblxuICAgKi9cbiAgQElucHV0KCkgYnV0dG9uVHlwZTogJ3ByaW1hcnknIHwgJ2Jhc2ljJyB8ICdwbGFpbicgfCAnZGVzdHJ1Y3RpdmUnIHwgJ291dGxpbmVfd2hpdGUnID0gJ2Jhc2ljJztcbiAgLyoqXG4gICAqIFRleHQgc2V0IHRvIHRoZSB0aXRsZVxuICAgKi9cbiAgQElucHV0KCkgdGl0bGU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRleHQgc2V0IHRvIHRoZSBkZXNjcmlwdGlvblxuICAgKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZztcbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHR5cGVzIG9mIGZpbGVzIHRoYXQgdGhlIGlucHV0IHNob3VsZCBiZSBhYmxlIHRvIHJlY2VpdmVcbiAgICovXG4gIEBJbnB1dCgpIGFjY2VwdCA9IFtdO1xuICAvKipcbiAgICogU2V0IHRvIGBmYWxzZWAgdG8gdGVsbCB0aGUgY29tcG9uZW50IHRvIG9ubHkgYWNjZXB0IGEgc2luZ2xlIGZpbGUgb24gdXBsb2FkLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgdHJ1ZWAuIEFjY2VwdHMgbXVsdGlwbGUgZmlsZXMuXG4gICAqL1xuICBASW5wdXQoKSBtdWx0aXBsZSA9IHRydWU7XG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIGxvYWRpbmcgZmlsZSB1cGxvYWRlci5cbiAgICovXG4gIEBJbnB1dCgpIHNrZWxldG9uID0gZmFsc2U7XG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBidXR0b24uXG4gICAqL1xuICBASW5wdXQoKSBzaXplOiAnc20nIHwgJ25vcm1hbCc7XG4gIC8qKlxuICAgKiBQcm92aWRlcyBhIHVuaXF1ZSBpZCBmb3IgdGhlIHVuZGVybHlpbmcgPGlucHV0PiBub2RlXG4gICAqL1xuICBASW5wdXQoKSBmaWxlVXBsb2FkZXJJZCA9IGBmaWxlLXVwbG9hZGVyLSR7RmlsZVVwbG9hZGVyLmZpbGVVcGxvYWRlckNvdW50fWA7XG4gIC8qKlxuICAgKiBNYWludGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZpZXcgRE9NIGVsZW1lbnQgb2YgdGhlIHVuZGVybHlpbmcgPGlucHV0PiBub2RlXG4gICAqL1xuICBAVmlld0NoaWxkKCdmaWxlSW5wdXQnLCB7c3RhdGljOiBmYWxzZX0pIGZpbGVJbnB1dDtcbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHN1Ym1pdHRlZCB0byBiZSB1cGxvYWRlZFxuICAgKi9cbiAgQElucHV0KCkgZmlsZXMgPSBuZXcgU2V0PEZpbGVJdGVtPigpO1xuXG4gIEBPdXRwdXQoKSBmaWxlc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmlsZS11cGxvYWRlcicpIGJhc2VDbGFzcyA9IHRydWU7XG5cbiAgcHJvdGVjdGVkIG9uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJvdGVjdGVkIG9uQ2hhbmdlQ2FsbGJhY2s6IChfOiBTZXQ8RmlsZUl0ZW0+KSA9PiB2b2lkID0gbm9vcDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBGaWxlVXBsb2FkZXIuZmlsZVVwbG9hZGVyQ291bnQrKztcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHByb3BlcnR5IHRvIGJlIHVzZWQgYXMgdGhlIHJldHVybiB2YWx1ZSB0byBgbmdNb2RlbGBcbiAgICovXG4gIGdldCB2YWx1ZSgpOiBTZXQ8RmlsZUl0ZW0+IHtcbiAgICByZXR1cm4gdGhpcy5maWxlcztcbiAgfVxuICBzZXQgdmFsdWUodjogU2V0PEZpbGVJdGVtPikge1xuICAgIGlmICh2ICE9PSB0aGlzLmZpbGVzKSB7XG4gICAgICB0aGlzLmZpbGVzID0gdjtcbiAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayh2KTtcbiAgICB9XG4gIH1cblxuICBvbkJsdXIoKSB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjaygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByb3BhZ2F0ZXMgdGhlIGluamVjdGVkIGB2YWx1ZWAuXG4gICAqL1xuICB3cml0ZVZhbHVlKHZhbHVlOiBTZXQ8RmlsZUl0ZW0+KSB7XG4gICAgaWYgKHZhbHVlICE9PSB0aGlzLnZhbHVlKSB7XG4gICAgICB0aGlzLmZpbGVzID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgb25GaWxlc0FkZGVkKCkge1xuICAgIGNvbnN0IGZpbGVzID0gdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC5maWxlcztcbiAgICBpZiAoIXRoaXMubXVsdGlwbGUpIHtcbiAgICAgIHRoaXMuZmlsZXMuY2xlYXIoKTtcbiAgICB9XG4gICAgZm9yIChsZXQgZmlsZSBvZiBmaWxlcykge1xuICAgICAgY29uc3QgZmlsZUl0ZW06IEZpbGVJdGVtID0ge1xuICAgICAgICBmaWxlLFxuICAgICAgICB1cGxvYWRlZDogZmFsc2UsXG4gICAgICAgIHN0YXRlOiAnZWRpdCcsXG4gICAgICAgIGludmFsaWQ6IGZhbHNlLFxuICAgICAgICBpbnZhbGlkVGV4dDogJycsXG4gICAgICB9O1xuICAgICAgdGhpcy5maWxlcy5hZGQoZmlsZUl0ZW0pO1xuICAgICAgdGhpcy5maWxlc0NoYW5nZS5lbWl0KHRoaXMuZmlsZXMpO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWUgPSB0aGlzLmZpbGVzO1xuICB9XG5cbiAgcmVtb3ZlRmlsZShmaWxlSXRlbSkge1xuICAgIHRoaXMuZmlsZXMuZGVsZXRlKGZpbGVJdGVtKTtcbiAgICB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XG4gICAgdGhpcy5maWxlc0NoYW5nZS5lbWl0KHRoaXMuZmlsZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVycyB0aGUgaW5qZWN0ZWQgZnVuY3Rpb24gdG8gY29udHJvbCB0aGUgdG91Y2ggdXNlIG9mIHRoZSBgRmlsZVVwbG9hZGVyYC5cbiAgICovXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgYSBtZXRob2QgaW4gb3JkZXIgdG8gcHJvcGFnYXRlIGNoYW5nZXMgYmFjayB0byB0aGUgZm9ybS5cbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xuICB9XG59XG4iXX0=