@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>
289 lines • 18.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, Input, Output, ViewChild, EventEmitter, HostBinding } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/** @type {?} */
const noop = (/**
* @return {?}
*/
() => { });
const ɵ0 = noop;
export class FileUploader {
constructor() {
/**
* Accessible text for the button that opens the upload window.
*/
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();
/**
* Emits an event to other classes when files change
*/
this.filesChange = new EventEmitter();
this.baseClass = true;
this.onTouchedCallback = noop;
this.onChangeCallback = noop;
FileUploader.fileUploaderCount++;
}
/**
* Specifies the property to be used as the return value to `ngModel`
* @return {?}
*/
get value() {
return this.files;
}
/**
* @param {?} v
* @return {?}
*/
set value(v) {
if (v !== this.files) {
this.files = v;
this.onChangeCallback(v);
}
}
/**
* @return {?}
*/
onBlur() {
this.onTouchedCallback();
}
/**
* Propagates the injected `value`.
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (value !== this.value) {
this.files = value;
}
}
/**
* @return {?}
*/
onFilesAdded() {
/** @type {?} */
const files = this.fileInput.nativeElement.files;
if (!this.multiple) {
this.files.clear();
}
for (let file of files) {
/** @type {?} */
const fileItem = {
file,
uploaded: false,
state: 'edit',
invalid: false,
invalidText: '',
};
this.files.add(fileItem);
this.filesChange.emit(this.files);
}
this.value = this.files;
}
/**
* @param {?} fileItem
* @return {?}
*/
removeFile(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`.
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouchedCallback = fn;
}
/**
* Sets a method in order to propagate changes back to the form.
* @param {?} fn
* @return {?}
*/
registerOnChange(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: `
<ng-container *ngIf="!skeleton; else skeletonTemplate">
<label class="label">{{title}}</label>
<div *ngIf="description" class="form__helper-text">{{description}}</div>
<div class="file">
<button
type="button"
[sukaButton]="buttonType"
(click)="fileInput.click()"
[attr.for]="fileUploaderId"
[size]="size">
{{buttonText}}
</button>
<input
#fileInput
type="file"
class="file-input"
[accept]="accept"
[id]="fileUploaderId"
[multiple]="multiple"
tabindex="-1"
(change)="onFilesAdded()"/>
<div class="file-container">
<div *ngFor="let fileItem of files">
<suka-file [fileItem]="fileItem" (remove)="removeFile(fileItem)"></suka-file>
<div *ngIf="fileItem.invalid" class="form-requirement">
{{fileItem.invalidText}}
</div>
</div>
</div>
</div>
</ng-container>
<ng-template #skeletonTemplate>
<div class="skeleton__text" style="width: 100px"></div>
<div class="skeleton__text" style="width: 225px"></div>
<button sukaButton skeleton="true"></button>
</ng-template>
`,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: FileUploader,
multi: true
}
]
}] }
];
/** @nocollapse */
FileUploader.ctorParameters = () => [];
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',] }]
};
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.
* @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;
/**
* Emits an event to other classes when files change
* @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3VzaGtpL25nLXN1a2EvIiwic291cmNlcyI6WyJsaWIvZmlsZS11cGxvYWRlci9maWxlLXVwbG9hZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztNQUk3QyxJQUFJOzs7QUFBRyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUE7O0FBa0RyQixNQUFNLE9BQU8sWUFBWTtJQXdFdkI7Ozs7UUFoRVMsZUFBVSxHQUFHLG9CQUFvQixDQUFDOzs7O1FBS2xDLGVBQVUsR0FBb0UsT0FBTyxDQUFDOzs7O1FBZXRGLFdBQU0sR0FBRyxFQUFFLENBQUM7Ozs7OztRQU9aLGFBQVEsR0FBRyxJQUFJLENBQUM7Ozs7UUFLaEIsYUFBUSxHQUFHLEtBQUssQ0FBQzs7OztRQVVqQixtQkFBYyxHQUFHLGlCQUFpQixZQUFZLENBQUMsaUJBQWlCLEVBQUUsQ0FBQzs7OztRQVVuRSxVQUFLLEdBQUcsSUFBSSxHQUFHLEVBQVksQ0FBQzs7OztRQUszQixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFWixjQUFTLEdBQUcsSUFBSSxDQUFDO1FBRTNDLHNCQUFpQixHQUFlLElBQUksQ0FBQztRQUNyQyxxQkFBZ0IsR0FBK0IsSUFBSSxDQUFDO1FBRzVELFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7Ozs7O0lBS0QsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Ozs7O0lBQ0QsSUFBSSxLQUFLLENBQUMsQ0FBZ0I7UUFDeEIsSUFBSSxDQUFDLEtBQUss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O0lBRXJELHlDQUErQzs7Ozs7SUFDL0Msd0NBQThEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmdcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgRmlsZUl0ZW0gfSBmcm9tICcuL2ZpbGUtaXRlbS5pbnRlcmZhY2UnO1xuXG5jb25zdCBub29wID0gKCkgPT4ge307XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3N1a2EtZmlsZS11cGxvYWRlcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbjsgZWxzZSBza2VsZXRvblRlbXBsYXRlXCI+XG4gICAgICA8bGFiZWwgY2xhc3M9XCJsYWJlbFwiPnt7dGl0bGV9fTwvbGFiZWw+XG4gICAgICA8ZGl2ICpuZ0lmPVwiZGVzY3JpcHRpb25cIiBjbGFzcz1cImZvcm1fX2hlbHBlci10ZXh0XCI+e3tkZXNjcmlwdGlvbn19PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmlsZVwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgW3N1a2FCdXR0b25dPVwiYnV0dG9uVHlwZVwiXG4gICAgICAgICAgKGNsaWNrKT1cImZpbGVJbnB1dC5jbGljaygpXCJcbiAgICAgICAgICBbYXR0ci5mb3JdPVwiZmlsZVVwbG9hZGVySWRcIlxuICAgICAgICAgIFtzaXplXT1cInNpemVcIj5cbiAgICAgICAgICB7e2J1dHRvblRleHR9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGlucHV0XG4gICAgICAgICAgI2ZpbGVJbnB1dFxuICAgICAgICAgIHR5cGU9XCJmaWxlXCJcbiAgICAgICAgICBjbGFzcz1cImZpbGUtaW5wdXRcIlxuICAgICAgICAgIFthY2NlcHRdPVwiYWNjZXB0XCJcbiAgICAgICAgICBbaWRdPVwiZmlsZVVwbG9hZGVySWRcIlxuICAgICAgICAgIFttdWx0aXBsZV09XCJtdWx0aXBsZVwiXG4gICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgKGNoYW5nZSk9XCJvbkZpbGVzQWRkZWQoKVwiLz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZpbGUtY29udGFpbmVyXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmlsZUl0ZW0gb2YgZmlsZXNcIj5cbiAgICAgICAgICAgIDxzdWthLWZpbGUgW2ZpbGVJdGVtXT1cImZpbGVJdGVtXCIgKHJlbW92ZSk9XCJyZW1vdmVGaWxlKGZpbGVJdGVtKVwiPjwvc3VrYS1maWxlPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImZpbGVJdGVtLmludmFsaWRcIiBjbGFzcz1cImZvcm0tcmVxdWlyZW1lbnRcIj5cbiAgICAgICAgICAgICAge3tmaWxlSXRlbS5pbnZhbGlkVGV4dH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctdGVtcGxhdGUgI3NrZWxldG9uVGVtcGxhdGU+XG4gICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b25fX3RleHRcIiBzdHlsZT1cIndpZHRoOiAxMDBweFwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uX190ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMjI1cHhcIj48L2Rpdj5cbiAgICAgIDxidXR0b24gc3VrYUJ1dHRvbiBza2VsZXRvbj1cInRydWVcIj48L2J1dHRvbj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICBgLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBGaWxlVXBsb2FkZXIsXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBGaWxlVXBsb2FkZXIge1xuICAvKipcbiAgICogQ291bnRlciB1c2VkIHRvIGNyZWF0ZSB1bmlxdWUgaWRzIGZvciBmaWxlLXVwbG9hZGVyIGNvbXBvbmVudHNcbiAgICovXG4gIHN0YXRpYyBmaWxlVXBsb2FkZXJDb3VudCA9IDA7XG4gIC8qKlxuICAgKiBBY2Nlc3NpYmxlIHRleHQgZm9yIHRoZSBidXR0b24gdGhhdCBvcGVucyB0aGUgdXBsb2FkIHdpbmRvdy5cbiAgICovXG4gIEBJbnB1dCgpIGJ1dHRvblRleHQgPSAnQWdyZWdhciBhcmNoaXZvKHMpJztcblxuICAvKipcbiAgICogVHlwZSBzZXQgZm9yIGJ1dHRvblxuICAgKi9cbiAgQElucHV0KCkgYnV0dG9uVHlwZTogJ3ByaW1hcnknIHwgJ2Jhc2ljJyB8ICdwbGFpbicgfCAnZGVzdHJ1Y3RpdmUnIHwgJ291dGxpbmVfd2hpdGUnID0gJ2Jhc2ljJztcblxuICAvKipcbiAgICogVGV4dCBzZXQgdG8gdGhlIHRpdGxlXG4gICAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUZXh0IHNldCB0byB0aGUgZGVzY3JpcHRpb25cbiAgICovXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIHR5cGVzIG9mIGZpbGVzIHRoYXQgdGhlIGlucHV0IHNob3VsZCBiZSBhYmxlIHRvIHJlY2VpdmVcbiAgICovXG4gIEBJbnB1dCgpIGFjY2VwdCA9IFtdO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYGZhbHNlYCB0byB0ZWxsIHRoZSBjb21wb25lbnQgdG8gb25seSBhY2NlcHQgYSBzaW5nbGUgZmlsZSBvbiB1cGxvYWQuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYC4gQWNjZXB0cyBtdWx0aXBsZSBmaWxlcy5cbiAgICovXG4gIEBJbnB1dCgpIG11bHRpcGxlID0gdHJ1ZTtcblxuICAvKipcbiAgICogU2V0IHRvIGB0cnVlYCBmb3IgYSBsb2FkaW5nIGZpbGUgdXBsb2FkZXIuXG4gICAqL1xuICBASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBidXR0b24uXG4gICAqL1xuICBASW5wdXQoKSBzaXplOiAnc20nIHwgJ25vcm1hbCc7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGEgdW5pcXVlIGlkIGZvciB0aGUgdW5kZXJseWluZyBgPGlucHV0PmAgbm9kZVxuICAgKi9cbiAgQElucHV0KCkgZmlsZVVwbG9hZGVySWQgPSBgZmlsZS11cGxvYWRlci0ke0ZpbGVVcGxvYWRlci5maWxlVXBsb2FkZXJDb3VudH1gO1xuXG4gIC8qKlxuICAgKiBNYWludGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIHZpZXcgRE9NIGVsZW1lbnQgb2YgdGhlIHVuZGVybHlpbmcgYDxpbnB1dD5gIG5vZGVcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2ZpbGVJbnB1dCcsIHtzdGF0aWM6IGZhbHNlfSkgZmlsZUlucHV0O1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBmaWxlcyB0aGF0IGhhdmUgYmVlbiBzdWJtaXR0ZWQgdG8gYmUgdXBsb2FkZWRcbiAgICovXG4gIEBJbnB1dCgpIGZpbGVzID0gbmV3IFNldDxGaWxlSXRlbT4oKTtcblxuICAvKipcbiAgICogRW1pdHMgYW4gZXZlbnQgdG8gb3RoZXIgY2xhc3NlcyB3aGVuIGZpbGVzIGNoYW5nZVxuICAgKi9cbiAgQE91dHB1dCgpIGZpbGVzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5maWxlLXVwbG9hZGVyJykgYmFzZUNsYXNzID0gdHJ1ZTtcblxuICBwcm90ZWN0ZWQgb25Ub3VjaGVkQ2FsbGJhY2s6ICgpID0+IHZvaWQgPSBub29wO1xuICBwcm90ZWN0ZWQgb25DaGFuZ2VDYWxsYmFjazogKF86IFNldDxGaWxlSXRlbT4pID0+IHZvaWQgPSBub29wO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIEZpbGVVcGxvYWRlci5maWxlVXBsb2FkZXJDb3VudCsrO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgcHJvcGVydHkgdG8gYmUgdXNlZCBhcyB0aGUgcmV0dXJuIHZhbHVlIHRvIGBuZ01vZGVsYFxuICAgKi9cbiAgZ2V0IHZhbHVlKCk6IFNldDxGaWxlSXRlbT4ge1xuICAgIHJldHVybiB0aGlzLmZpbGVzO1xuICB9XG4gIHNldCB2YWx1ZSh2OiBTZXQ8RmlsZUl0ZW0+KSB7XG4gICAgaWYgKHYgIT09IHRoaXMuZmlsZXMpIHtcbiAgICAgIHRoaXMuZmlsZXMgPSB2O1xuICAgICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHYpO1xuICAgIH1cbiAgfVxuXG4gIG9uQmx1cigpIHtcbiAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogUHJvcGFnYXRlcyB0aGUgaW5qZWN0ZWQgYHZhbHVlYC5cbiAgICovXG4gIHdyaXRlVmFsdWUodmFsdWU6IFNldDxGaWxlSXRlbT4pIHtcbiAgICBpZiAodmFsdWUgIT09IHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMuZmlsZXMgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBvbkZpbGVzQWRkZWQoKSB7XG4gICAgY29uc3QgZmlsZXMgPSB0aGlzLmZpbGVJbnB1dC5uYXRpdmVFbGVtZW50LmZpbGVzO1xuICAgIGlmICghdGhpcy5tdWx0aXBsZSkge1xuICAgICAgdGhpcy5maWxlcy5jbGVhcigpO1xuICAgIH1cbiAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICBjb25zdCBmaWxlSXRlbTogRmlsZUl0ZW0gPSB7XG4gICAgICAgIGZpbGUsXG4gICAgICAgIHVwbG9hZGVkOiBmYWxzZSxcbiAgICAgICAgc3RhdGU6ICdlZGl0JyxcbiAgICAgICAgaW52YWxpZDogZmFsc2UsXG4gICAgICAgIGludmFsaWRUZXh0OiAnJyxcbiAgICAgIH07XG4gICAgICB0aGlzLmZpbGVzLmFkZChmaWxlSXRlbSk7XG4gICAgICB0aGlzLmZpbGVzQ2hhbmdlLmVtaXQodGhpcy5maWxlcyk7XG4gICAgfVxuXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuZmlsZXM7XG4gIH1cblxuICByZW1vdmVGaWxlKGZpbGVJdGVtKSB7XG4gICAgdGhpcy5maWxlcy5kZWxldGUoZmlsZUl0ZW0pO1xuICAgIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSAnJztcbiAgICB0aGlzLmZpbGVzQ2hhbmdlLmVtaXQodGhpcy5maWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBpbmplY3RlZCBmdW5jdGlvbiB0byBjb250cm9sIHRoZSB0b3VjaCB1c2Ugb2YgdGhlIGBGaWxlVXBsb2FkZXJgLlxuICAgKi9cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xuICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2sgPSBmbjtcbiAgfVxuICAvKipcbiAgICogU2V0cyBhIG1ldGhvZCBpbiBvcmRlciB0byBwcm9wYWdhdGUgY2hhbmdlcyBiYWNrIHRvIHRoZSBmb3JtLlxuICAgKi9cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrID0gZm47XG4gIH1cbn1cbiJdfQ==