UNPKG

@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>

307 lines 20.8 kB
/** * @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. */ 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++; } 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. * @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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11cGxvYWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Aa3VzaGtpL25nLXN1a2EvIiwic291cmNlcyI6WyJsaWIvZmlsZS11cGxvYWRlci9maWxlLXVwbG9hZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7SUFJN0MsSUFBSTs7O0FBQUcsY0FBTyxDQUFDLENBQUE7O0FBRXJCO0lBd0hFOzs7O1FBaEVTLGVBQVUsR0FBRyxvQkFBb0IsQ0FBQzs7OztRQUtsQyxlQUFVLEdBQW9FLE9BQU8sQ0FBQzs7OztRQWV0RixXQUFNLEdBQUcsRUFBRSxDQUFDOzs7Ozs7UUFPWixhQUFRLEdBQUcsSUFBSSxDQUFDOzs7O1FBS2hCLGFBQVEsR0FBRyxLQUFLLENBQUM7Ozs7UUFVakIsbUJBQWMsR0FBRyxtQkFBaUIsWUFBWSxDQUFDLGlCQUFtQixDQUFDOzs7O1FBVW5FLFVBQUssR0FBRyxJQUFJLEdBQUcsRUFBWSxDQUFDOzs7O1FBSzNCLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUVaLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFFM0Msc0JBQWlCLEdBQWUsSUFBSSxDQUFDO1FBQ3JDLHFCQUFnQixHQUErQixJQUFJLENBQUM7UUFHNUQsWUFBWSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUtELHNCQUFJLCtCQUFLO1FBSFQ7O1dBRUc7Ozs7O1FBQ0g7WUFDRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDcEIsQ0FBQzs7Ozs7UUFDRCxVQUFVLENBQWdCO1lBQ3hCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMxQjtRQUNILENBQUM7OztPQU5BOzs7O0lBUUQsNkJBQU07OztJQUFOO1FBQ0UsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHOzs7Ozs7SUFDSCxpQ0FBVTs7Ozs7SUFBVixVQUFXLEtBQW9CO1FBQzdCLElBQUksS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7U0FDcEI7SUFDSCxDQUFDOzs7O0lBRUQsbUNBQVk7OztJQUFaOzs7WUFDUSxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSztRQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3BCOztZQUNELEtBQWlCLElBQUEsVUFBQSxpQkFBQSxLQUFLLENBQUEsNEJBQUEsK0NBQUU7Z0JBQW5CLElBQUksSUFBSSxrQkFBQTs7b0JBQ0wsUUFBUSxHQUFhO29CQUN6QixJQUFJLE1BQUE7b0JBQ0osUUFBUSxFQUFFLEtBQUs7b0JBQ2YsS0FBSyxFQUFFLE1BQU07b0JBQ2IsT0FBTyxFQUFFLEtBQUs7b0JBQ2QsV0FBVyxFQUFFLEVBQUU7aUJBQ2hCO2dCQUNELElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbkM7Ozs7Ozs7OztRQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztJQUMxQixDQUFDOzs7OztJQUVELGlDQUFVOzs7O0lBQVYsVUFBVyxRQUFRO1FBQ2pCLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRzs7Ozs7O0lBQ0gsd0NBQWlCOzs7OztJQUFqQixVQUFrQixFQUFPO1FBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUNEOztPQUVHOzs7Ozs7SUFDSCx1Q0FBZ0I7Ozs7O0lBQWhCLFVBQWlCLEVBQU87UUFDdEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUM3QixDQUFDOzs7O0lBdklNLDhCQUFpQixHQUFHLENBQUMsQ0FBQzs7Z0JBcEQ5QixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsUUFBUSxFQUFFLG0xQ0FxQ1Q7b0JBQ0QsU0FBUyxFQUFFO3dCQUNUOzRCQUNFLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxZQUFZOzRCQUN6QixLQUFLLEVBQUUsSUFBSTt5QkFDWjtxQkFDRjtpQkFDRjs7Ozs7NkJBU0UsS0FBSzs2QkFLTCxLQUFLO3dCQUtMLEtBQUs7OEJBS0wsS0FBSzt5QkFLTCxLQUFLOzJCQU9MLEtBQUs7MkJBS0wsS0FBSzt1QkFLTCxLQUFLO2lDQUtMLEtBQUs7NEJBS0wsU0FBUyxTQUFDLFdBQVcsRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7d0JBS3RDLEtBQUs7OEJBS0wsTUFBTTs0QkFFTixXQUFXLFNBQUMscUJBQXFCOztJQXlFcEMsbUJBQUM7Q0FBQSxBQTVMRCxJQTRMQztTQTVJWSxZQUFZOzs7Ozs7SUFJdkIsK0JBQTZCOzs7OztJQUk3QixrQ0FBMkM7Ozs7O0lBSzNDLGtDQUErRjs7Ozs7SUFLL0YsNkJBQXVCOzs7OztJQUt2QixtQ0FBNkI7Ozs7O0lBSzdCLDhCQUFxQjs7Ozs7OztJQU9yQixnQ0FBeUI7Ozs7O0lBS3pCLGdDQUEwQjs7Ozs7SUFLMUIsNEJBQStCOzs7OztJQUsvQixzQ0FBNEU7Ozs7O0lBSzVFLGlDQUFtRDs7Ozs7SUFLbkQsNkJBQXFDOzs7OztJQUtyQyxtQ0FBZ0Q7O0lBRWhELGlDQUFxRDs7Ozs7SUFFckQseUNBQStDOzs7OztJQUMvQyx3Q0FBOEQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZ1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBGaWxlSXRlbSB9IGZyb20gJy4vZmlsZS1pdGVtLmludGVyZmFjZSc7XG5cbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3VrYS1maWxlLXVwbG9hZGVyJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uOyBlbHNlIHNrZWxldG9uVGVtcGxhdGVcIj5cbiAgICAgIDxsYWJlbCBjbGFzcz1cImxhYmVsXCI+e3t0aXRsZX19PC9sYWJlbD5cbiAgICAgIDxkaXYgKm5nSWY9XCJkZXNjcmlwdGlvblwiIGNsYXNzPVwiZm9ybV9faGVscGVyLXRleHRcIj57e2Rlc2NyaXB0aW9ufX08L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmaWxlXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBbc3VrYUJ1dHRvbl09XCJidXR0b25UeXBlXCJcbiAgICAgICAgICAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIlxuICAgICAgICAgIFthdHRyLmZvcl09XCJmaWxlVXBsb2FkZXJJZFwiXG4gICAgICAgICAgW3NpemVdPVwic2l6ZVwiPlxuICAgICAgICAgIHt7YnV0dG9uVGV4dH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8aW5wdXRcbiAgICAgICAgICAjZmlsZUlucHV0XG4gICAgICAgICAgdHlwZT1cImZpbGVcIlxuICAgICAgICAgIGNsYXNzPVwiZmlsZS1pbnB1dFwiXG4gICAgICAgICAgW2FjY2VwdF09XCJhY2NlcHRcIlxuICAgICAgICAgIFtpZF09XCJmaWxlVXBsb2FkZXJJZFwiXG4gICAgICAgICAgW211bHRpcGxlXT1cIm11bHRpcGxlXCJcbiAgICAgICAgICB0YWJpbmRleD1cIi0xXCJcbiAgICAgICAgICAoY2hhbmdlKT1cIm9uRmlsZXNBZGRlZCgpXCIvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsZS1jb250YWluZXJcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWxlSXRlbSBvZiBmaWxlc1wiPlxuICAgICAgICAgICAgPHN1a2EtZmlsZSBbZmlsZUl0ZW1dPVwiZmlsZUl0ZW1cIiAocmVtb3ZlKT1cInJlbW92ZUZpbGUoZmlsZUl0ZW0pXCI+PC9zdWthLWZpbGU+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmlsZUl0ZW0uaW52YWxpZFwiIGNsYXNzPVwiZm9ybS1yZXF1aXJlbWVudFwiPlxuICAgICAgICAgICAgICB7e2ZpbGVJdGVtLmludmFsaWRUZXh0fX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZSAjc2tlbGV0b25UZW1wbGF0ZT5cbiAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbl9fdGV4dFwiIHN0eWxlPVwid2lkdGg6IDEwMHB4XCI+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b25fX3RleHRcIiBzdHlsZT1cIndpZHRoOiAyMjVweFwiPjwvZGl2PlxuICAgICAgPGJ1dHRvbiBzdWthQnV0dG9uIHNrZWxldG9uPVwidHJ1ZVwiPjwvYnV0dG9uPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IEZpbGVVcGxvYWRlcixcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEZpbGVVcGxvYWRlciB7XG4gIC8qKlxuICAgKiBDb3VudGVyIHVzZWQgdG8gY3JlYXRlIHVuaXF1ZSBpZHMgZm9yIGZpbGUtdXBsb2FkZXIgY29tcG9uZW50c1xuICAgKi9cbiAgc3RhdGljIGZpbGVVcGxvYWRlckNvdW50ID0gMDtcbiAgLyoqXG4gICAqIEFjY2Vzc2libGUgdGV4dCBmb3IgdGhlIGJ1dHRvbiB0aGF0IG9wZW5zIHRoZSB1cGxvYWQgd2luZG93LlxuICAgKi9cbiAgQElucHV0KCkgYnV0dG9uVGV4dCA9ICdBZ3JlZ2FyIGFyY2hpdm8ocyknO1xuXG4gIC8qKlxuICAgKiBUeXBlIHNldCBmb3IgYnV0dG9uXG4gICAqL1xuICBASW5wdXQoKSBidXR0b25UeXBlOiAncHJpbWFyeScgfCAnYmFzaWMnIHwgJ3BsYWluJyB8ICdkZXN0cnVjdGl2ZScgfCAnb3V0bGluZV93aGl0ZScgPSAnYmFzaWMnO1xuXG4gIC8qKlxuICAgKiBUZXh0IHNldCB0byB0aGUgdGl0bGVcbiAgICovXG4gIEBJbnB1dCgpIHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRleHQgc2V0IHRvIHRoZSBkZXNjcmlwdGlvblxuICAgKi9cbiAgQElucHV0KCkgZGVzY3JpcHRpb246IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmeSB0aGUgdHlwZXMgb2YgZmlsZXMgdGhhdCB0aGUgaW5wdXQgc2hvdWxkIGJlIGFibGUgdG8gcmVjZWl2ZVxuICAgKi9cbiAgQElucHV0KCkgYWNjZXB0ID0gW107XG5cbiAgLyoqXG4gICAqIFNldCB0byBgZmFsc2VgIHRvIHRlbGwgdGhlIGNvbXBvbmVudCB0byBvbmx5IGFjY2VwdCBhIHNpbmdsZSBmaWxlIG9uIHVwbG9hZC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLiBBY2NlcHRzIG11bHRpcGxlIGZpbGVzLlxuICAgKi9cbiAgQElucHV0KCkgbXVsdGlwbGUgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBTZXQgdG8gYHRydWVgIGZvciBhIGxvYWRpbmcgZmlsZSB1cGxvYWRlci5cbiAgICovXG4gIEBJbnB1dCgpIHNrZWxldG9uID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIGJ1dHRvbi5cbiAgICovXG4gIEBJbnB1dCgpIHNpemU6ICdzbScgfCAnbm9ybWFsJztcblxuICAvKipcbiAgICogUHJvdmlkZXMgYSB1bmlxdWUgaWQgZm9yIHRoZSB1bmRlcmx5aW5nIGA8aW5wdXQ+YCBub2RlXG4gICAqL1xuICBASW5wdXQoKSBmaWxlVXBsb2FkZXJJZCA9IGBmaWxlLXVwbG9hZGVyLSR7RmlsZVVwbG9hZGVyLmZpbGVVcGxvYWRlckNvdW50fWA7XG5cbiAgLyoqXG4gICAqIE1haW50YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmlldyBET00gZWxlbWVudCBvZiB0aGUgdW5kZXJseWluZyBgPGlucHV0PmAgbm9kZVxuICAgKi9cbiAgQFZpZXdDaGlsZCgnZmlsZUlucHV0Jywge3N0YXRpYzogZmFsc2V9KSBmaWxlSW5wdXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBsaXN0IG9mIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHN1Ym1pdHRlZCB0byBiZSB1cGxvYWRlZFxuICAgKi9cbiAgQElucHV0KCkgZmlsZXMgPSBuZXcgU2V0PEZpbGVJdGVtPigpO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBhbiBldmVudCB0byBvdGhlciBjbGFzc2VzIHdoZW4gZmlsZXMgY2hhbmdlXG4gICAqL1xuICBAT3V0cHV0KCkgZmlsZXNDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZpbGUtdXBsb2FkZXInKSBiYXNlQ2xhc3MgPSB0cnVlO1xuXG4gIHByb3RlY3RlZCBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XG4gIHByb3RlY3RlZCBvbkNoYW5nZUNhbGxiYWNrOiAoXzogU2V0PEZpbGVJdGVtPikgPT4gdm9pZCA9IG5vb3A7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgRmlsZVVwbG9hZGVyLmZpbGVVcGxvYWRlckNvdW50Kys7XG4gIH1cblxuICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBwcm9wZXJ0eSB0byBiZSB1c2VkIGFzIHRoZSByZXR1cm4gdmFsdWUgdG8gYG5nTW9kZWxgXG4gICAqL1xuICBnZXQgdmFsdWUoKTogU2V0PEZpbGVJdGVtPiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsZXM7XG4gIH1cbiAgc2V0IHZhbHVlKHY6IFNldDxGaWxlSXRlbT4pIHtcbiAgICBpZiAodiAhPT0gdGhpcy5maWxlcykge1xuICAgICAgdGhpcy5maWxlcyA9IHY7XG4gICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodik7XG4gICAgfVxuICB9XG5cbiAgb25CbHVyKCkge1xuICAgIHRoaXMub25Ub3VjaGVkQ2FsbGJhY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9wYWdhdGVzIHRoZSBpbmplY3RlZCBgdmFsdWVgLlxuICAgKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogU2V0PEZpbGVJdGVtPikge1xuICAgIGlmICh2YWx1ZSAhPT0gdGhpcy52YWx1ZSkge1xuICAgICAgdGhpcy5maWxlcyA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIG9uRmlsZXNBZGRlZCgpIHtcbiAgICBjb25zdCBmaWxlcyA9IHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQuZmlsZXM7XG4gICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICB0aGlzLmZpbGVzLmNsZWFyKCk7XG4gICAgfVxuICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGNvbnN0IGZpbGVJdGVtOiBGaWxlSXRlbSA9IHtcbiAgICAgICAgZmlsZSxcbiAgICAgICAgdXBsb2FkZWQ6IGZhbHNlLFxuICAgICAgICBzdGF0ZTogJ2VkaXQnLFxuICAgICAgICBpbnZhbGlkOiBmYWxzZSxcbiAgICAgICAgaW52YWxpZFRleHQ6ICcnLFxuICAgICAgfTtcbiAgICAgIHRoaXMuZmlsZXMuYWRkKGZpbGVJdGVtKTtcbiAgICAgIHRoaXMuZmlsZXNDaGFuZ2UuZW1pdCh0aGlzLmZpbGVzKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbHVlID0gdGhpcy5maWxlcztcbiAgfVxuXG4gIHJlbW92ZUZpbGUoZmlsZUl0ZW0pIHtcbiAgICB0aGlzLmZpbGVzLmRlbGV0ZShmaWxlSXRlbSk7XG4gICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xuICAgIHRoaXMuZmlsZXNDaGFuZ2UuZW1pdCh0aGlzLmZpbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgdGhlIGluamVjdGVkIGZ1bmN0aW9uIHRvIGNvbnRyb2wgdGhlIHRvdWNoIHVzZSBvZiB0aGUgYEZpbGVVcGxvYWRlcmAuXG4gICAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG4gIC8qKlxuICAgKiBTZXRzIGEgbWV0aG9kIGluIG9yZGVyIHRvIHByb3BhZ2F0ZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm0uXG4gICAqL1xuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxufVxuIl19