UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

250 lines (249 loc) 19.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, forwardRef, ElementRef, ContentChild, ViewChild, Renderer2 } from '@angular/core'; import { NG_VALUE_ACCESSOR, FormControl } from '@angular/forms'; import { DefaultControlValueAccessor } from './../../common/default-control-value-accessor'; import { AsiComponentTemplateOptionDef, AsiComponentTemplateTagDef } from './../../common/asi-component-template'; import { debounceTime, switchMap, tap } from 'rxjs/operators'; import * as nh from '../../../native-helper'; /** * asi-autocomplete-multiple component */ var AsiAutoCompleteMultipleComponent = /** @class */ (function (_super) { tslib_1.__extends(AsiAutoCompleteMultipleComponent, _super); function AsiAutoCompleteMultipleComponent(renderer) { var _this = _super.call(this) || this; _this.renderer = renderer; /** * Label position */ _this.labelPosition = 'top'; /** * Placeholder if needed */ _this.placeholder = ''; /** * Delay between the moment you stop typing and onRequestData is called */ _this.delay = 500; /** * Option to keep the list open once an item is selected */ _this.closeAfterSelect = false; _this.autoCompleteControl = new FormControl(); _this.open = false; // Var used to manage component initialization _this.firstRequestDone = null; _this.init = false; _this.currentValue = null; return _this; } /** * @return {?} */ AsiAutoCompleteMultipleComponent.prototype.checkInput = /** * @return {?} */ function () { if (null == this.onRequestData) { throw new Error("AsiAutoCompleteMultipleComponent : @Input 'onRequestData' is required"); } }; /** * @return {?} */ AsiAutoCompleteMultipleComponent.prototype.ngOnInit = /** * @return {?} */ function () { var _this = this; this.checkInput(); this.renderer.addClass(this.container.nativeElement, 'label-' + this.labelPosition); this.autoCompleteControl.valueChanges .pipe(debounceTime(this.delay), tap(function (value) { return (_this.currentValue = value); }), switchMap(function (value) { return nh.observe(_this.onRequestData(value, !_this.firstRequestDone)); })) .subscribe(function (data) { _this.data = data; if (_this.firstRequestDone && data && data.length > 0) { _this.open = true; } _this.firstRequestDone = true; }); }; /** * @return {?} */ AsiAutoCompleteMultipleComponent.prototype.onDropdownClose = /** * @return {?} */ function () { this.open = false; }; /** * @return {?} */ AsiAutoCompleteMultipleComponent.prototype.ngOnChanges = /** * @return {?} */ function () { if (this.init) { this.open = true; } else { if (this.firstRequestDone) { this.init = true; } } }; /** * @param {?} data * @return {?} */ AsiAutoCompleteMultipleComponent.prototype.addValue = /** * @param {?} data * @return {?} */ function (data) { this.value = (this.value ? /** @type {?} */ (this.value) : []).concat([data]); if (this.closeAfterSelect) { this.open = false; } }; /** * @param {?} data * @return {?} */ AsiAutoCompleteMultipleComponent.prototype.removeValue = /** * @param {?} data * @return {?} */ function (data) { /** @type {?} */ var tab = this.value; nh.remove(tab, function (value) { return data === value; }); this.value = tab; if (nh.isEmpty(this.value)) { this.value = null; } }; /** * @param {?} value * @return {?} */ AsiAutoCompleteMultipleComponent.prototype.writeValue = /** * @param {?} value * @return {?} */ function (value) { this._value = value; if (this.init === false) { this.autoCompleteControl.setValue(this.currentValue); } else { this.currentValue = value; if (this.value == null) { this.autoCompleteControl.setValue(this.currentValue, { emitEvent: false }); } } }; AsiAutoCompleteMultipleComponent.decorators = [ { type: Component, args: [{ selector: 'asi-autocomplete-multiple', template: "<div class=\"tag-container\">\r\n <div class=\"tag\" *ngFor=\"let aValue of value\">\r\n <span>\r\n <ng-template [ngTemplateOutlet]=\"tagDef.template\" [ngTemplateOutletContext]=\"{$implicit : aValue}\"></ng-template>\r\n </span>\r\n <button type=\"button\" [disabled]=\"disabled\" class=\"remove-icon-container\" (click)=\"removeValue(aValue)\">\r\n <span class=\"remove-icon\" [innerHTML]=\"'&#10005;'\"></span>\r\n </button>\r\n </div>\r\n</div>\r\n<div class=\"autocomplete-container\" #container>\r\n <label class=\"input-label\" *ngIf=\"label != null\">{{label | translate}}</label>\r\n <div class=\"autocomplete\">\r\n <input [attr.id]=\"id\" [attr.name]=\"name\"\r\n [attr.disabled]=\"disabled ? '' : null\" class=\"asi-focus-error\"\r\n [placeholder]=\"placeholder\" [formControl]=\"autoCompleteControl\"/>\r\n\r\n <asi-dropdown [open]=\"open\" (onClose)=\"onDropdownClose()\" dropDownClass=\"asi-autocomplete-multiple-dropdown\">\r\n <div class=\"drop-down-autocomplete-multiple\">\r\n <div class=\"drop-down-panel\" [ngClass]=\"{'open' : open }\">\r\n <button [id]=\"'asi-acmddi-'+ id\" type=\"button\" class=\"drop-down-item\" (click)=\"addValue(aData)\" *ngFor=\"let aData of data\">\r\n <div class=\"option\">\r\n <span class=\"item\">\r\n <ng-template *ngIf=\"aData != null\" [ngTemplateOutlet]=\"optionDef.template\" [ngTemplateOutletContext]=\"{$implicit : aData}\"></ng-template>\r\n </span>\r\n </div>\r\n </button>\r\n </div>\r\n </div>\r\n </asi-dropdown>\r\n\r\n </div>\r\n</div>\r\n", host: { class: 'asi-component asi-autocomplete-multiple' }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return AsiAutoCompleteMultipleComponent; }), multi: true } ] }] } ]; /** @nocollapse */ AsiAutoCompleteMultipleComponent.ctorParameters = function () { return [ { type: Renderer2 } ]; }; AsiAutoCompleteMultipleComponent.propDecorators = { id: [{ type: Input }], name: [{ type: Input }], label: [{ type: Input }], labelPosition: [{ type: Input }], placeholder: [{ type: Input }], delay: [{ type: Input }], closeAfterSelect: [{ type: Input }], onRequestData: [{ type: Input }], optionDef: [{ type: ContentChild, args: [AsiComponentTemplateOptionDef,] }], tagDef: [{ type: ContentChild, args: [AsiComponentTemplateTagDef,] }], container: [{ type: ViewChild, args: ['container',] }] }; return AsiAutoCompleteMultipleComponent; }(DefaultControlValueAccessor)); export { AsiAutoCompleteMultipleComponent }; if (false) { /** * html id * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.id; /** * html name * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.name; /** * Label to display (is translated) * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.label; /** * Label position * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.labelPosition; /** * Placeholder if needed * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.placeholder; /** * Delay between the moment you stop typing and onRequestData is called * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.delay; /** * Option to keep the list open once an item is selected * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.closeAfterSelect; /** * Function called to request new data (can return Observable/Promise/Object) : Throw error if null * @type {?} */ AsiAutoCompleteMultipleComponent.prototype.onRequestData; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.optionDef; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.tagDef; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.container; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.data; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.autoCompleteControl; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.open; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.firstRequestDone; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.init; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.currentValue; /** @type {?} */ AsiAutoCompleteMultipleComponent.prototype.renderer; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWF1dG9jb21wbGV0ZS1tdWx0aXBsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYXNpLW5ndG9vbHMvbGliLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYXNpLWF1dG9jb21wbGV0ZS9tdWx0aXBsZS9hc2ktYXV0b2NvbXBsZXRlLW11bHRpcGxlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBVSxVQUFVLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBYSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEksT0FBTyxFQUFFLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLCtDQUErQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSwwQkFBMEIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2xILE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7O0lBZ0JTLDREQUEyQjtJQXdDL0UsMENBQW9CLFFBQW1CO1FBQXZDLFlBQ0UsaUJBQU8sU0FDUjtRQUZtQixjQUFRLEdBQVIsUUFBUSxDQUFXOzs7OzhCQTlCd0QsS0FBSzs7Ozs0QkFHN0UsRUFBRTs7OztzQkFHUixHQUFHOzs7O2lDQUdRLEtBQUs7b0NBWVgsSUFBSSxXQUFXLEVBQUU7cUJBQ2hDLEtBQUs7O2lDQUdnQixJQUFJO3FCQUN6QixLQUFLOzZCQUVRLElBQUk7O0tBSXZCOzs7O0lBRU8scURBQVU7Ozs7UUFDaEIsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsdUVBQXVFLENBQUMsQ0FBQztTQUMxRjs7Ozs7SUFHSCxtREFBUTs7O0lBQVI7UUFBQSxpQkFpQkM7UUFoQkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFcEYsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVk7YUFDbEMsSUFBSSxDQUNILFlBQVksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQ3hCLEdBQUcsQ0FBQyxVQUFDLEtBQUssSUFBSyxPQUFBLENBQUMsS0FBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsRUFBM0IsQ0FBMkIsQ0FBQyxFQUMzQyxTQUFTLENBQUMsVUFBQyxLQUFLLElBQUssT0FBQSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsS0FBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFBN0QsQ0FBNkQsQ0FBQyxDQUNwRjthQUNBLFNBQVMsQ0FBQyxVQUFDLElBQVM7WUFDbkIsS0FBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7WUFDakIsRUFBRSxDQUFDLENBQUMsS0FBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JELEtBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO2FBQ2xCO1lBQ0QsS0FBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztTQUM5QixDQUFDLENBQUM7S0FDTjs7OztJQUVELDBEQUFlOzs7SUFBZjtRQUNFLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0tBQ25COzs7O0lBRUQsc0RBQVc7OztJQUFYO1FBQ0UsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztTQUNsQjtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7YUFDbEI7U0FDRjtLQUNGOzs7OztJQUVELG1EQUFROzs7O0lBQVIsVUFBUyxJQUFTO1FBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsbUJBQUMsSUFBSSxDQUFDLEtBQWMsRUFBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQzFCLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1NBQ25CO0tBQ0Y7Ozs7O0lBRUQsc0RBQVc7Ozs7SUFBWCxVQUFZLElBQVM7O1FBQ25CLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsVUFBQyxLQUFLO1lBQ25CLE1BQU0sQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDO1NBQ3ZCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1FBRWpCLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztTQUNuQjtLQUNGOzs7OztJQUVELHFEQUFVOzs7O0lBQVYsVUFBVyxLQUFVO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUN0RDtRQUFDLElBQUksQ0FBQyxDQUFDO1lBQ04sSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7WUFDMUIsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUN2QixJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQzthQUM1RTtTQUNGO0tBQ0Y7O2dCQTVIRixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLDJCQUEyQjtvQkFDckMsd29EQUF1RDtvQkFDdkQsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLHlDQUF5QyxFQUFFO29CQUMxRCxTQUFTLEVBQUU7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxjQUFNLE9BQUEsZ0NBQWdDLEVBQWhDLENBQWdDLENBQUM7NEJBQy9ELEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGO2lCQUNGOzs7O2dCQXBCOEYsU0FBUzs7O3FCQXVCckcsS0FBSzt1QkFFTCxLQUFLO3dCQUdMLEtBQUs7Z0NBR0wsS0FBSzs4QkFHTCxLQUFLO3dCQUdMLEtBQUs7bUNBR0wsS0FBSztnQ0FHTCxLQUFLOzRCQUVMLFlBQVksU0FBQyw2QkFBNkI7eUJBQzFDLFlBQVksU0FBQywwQkFBMEI7NEJBRXZDLFNBQVMsU0FBQyxXQUFXOzsyQ0FoRHhCO0VBcUJzRCwyQkFBMkI7U0FBcEUsZ0NBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgZm9yd2FyZFJlZiwgT25Jbml0LCBFbGVtZW50UmVmLCBDb250ZW50Q2hpbGQsIFZpZXdDaGlsZCwgT25DaGFuZ2VzLCBSZW5kZXJlcjIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJy4vLi4vLi4vY29tbW9uL2RlZmF1bHQtY29udHJvbC12YWx1ZS1hY2Nlc3Nvcic7XG5pbXBvcnQgeyBBc2lDb21wb25lbnRUZW1wbGF0ZU9wdGlvbkRlZiwgQXNpQ29tcG9uZW50VGVtcGxhdGVUYWdEZWYgfSBmcm9tICcuLy4uLy4uL2NvbW1vbi9hc2ktY29tcG9uZW50LXRlbXBsYXRlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgKiBhcyBuaCBmcm9tICcuLi8uLi8uLi9uYXRpdmUtaGVscGVyJztcbi8qKlxuICogYXNpLWF1dG9jb21wbGV0ZS1tdWx0aXBsZSBjb21wb25lbnRcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXNpLWF1dG9jb21wbGV0ZS1tdWx0aXBsZScsXG4gIHRlbXBsYXRlVXJsOiAnYXNpLWF1dG9jb21wbGV0ZS1tdWx0aXBsZS5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdhc2ktY29tcG9uZW50IGFzaS1hdXRvY29tcGxldGUtbXVsdGlwbGUnIH0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gQXNpQXV0b0NvbXBsZXRlTXVsdGlwbGVDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgQXNpQXV0b0NvbXBsZXRlTXVsdGlwbGVDb21wb25lbnQgZXh0ZW5kcyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIC8qKiBodG1sIGlkICovXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIC8qKiBodG1sIG5hbWUgKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBMYWJlbCB0byBkaXNwbGF5IChpcyB0cmFuc2xhdGVkKSAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xuXG4gIC8qKiBMYWJlbCBwb3NpdGlvbiAqL1xuICBASW5wdXQoKSBsYWJlbFBvc2l0aW9uOiAndG9wJyB8ICdsZWZ0JyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdib3R0b20tY2VudGVyJyB8ICd0b3AtY2VudGVyJyA9ICd0b3AnO1xuXG4gIC8qKiBQbGFjZWhvbGRlciBpZiBuZWVkZWQgKi9cbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcblxuICAvKiogRGVsYXkgYmV0d2VlbiB0aGUgbW9tZW50IHlvdSBzdG9wIHR5cGluZyBhbmQgb25SZXF1ZXN0RGF0YSBpcyBjYWxsZWQgKi9cbiAgQElucHV0KCkgZGVsYXkgPSA1MDA7XG5cbiAgLyoqIE9wdGlvbiB0byBrZWVwIHRoZSBsaXN0IG9wZW4gb25jZSBhbiBpdGVtIGlzIHNlbGVjdGVkICovXG4gIEBJbnB1dCgpIGNsb3NlQWZ0ZXJTZWxlY3QgPSBmYWxzZTtcblxuICAvKiogRnVuY3Rpb24gY2FsbGVkIHRvIHJlcXVlc3QgbmV3IGRhdGEgKGNhbiByZXR1cm4gT2JzZXJ2YWJsZS9Qcm9taXNlL09iamVjdCkgOiBUaHJvdyBlcnJvciBpZiBudWxsICovXG4gIEBJbnB1dCgpIG9uUmVxdWVzdERhdGE6IEZ1bmN0aW9uO1xuXG4gIEBDb250ZW50Q2hpbGQoQXNpQ29tcG9uZW50VGVtcGxhdGVPcHRpb25EZWYpIG9wdGlvbkRlZjogQXNpQ29tcG9uZW50VGVtcGxhdGVPcHRpb25EZWY7XG4gIEBDb250ZW50Q2hpbGQoQXNpQ29tcG9uZW50VGVtcGxhdGVUYWdEZWYpIHRhZ0RlZjogQXNpQ29tcG9uZW50VGVtcGxhdGVUYWdEZWY7XG5cbiAgQFZpZXdDaGlsZCgnY29udGFpbmVyJykgY29udGFpbmVyOiBFbGVtZW50UmVmO1xuXG4gIGRhdGE6IEFycmF5PGFueT47XG5cbiAgYXV0b0NvbXBsZXRlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICBvcGVuID0gZmFsc2U7XG5cbiAgLy8gVmFyIHVzZWQgdG8gbWFuYWdlIGNvbXBvbmVudCBpbml0aWFsaXphdGlvblxuICBmaXJzdFJlcXVlc3REb25lOiBCb29sZWFuID0gbnVsbDtcbiAgaW5pdCA9IGZhbHNlO1xuXG4gIGN1cnJlbnRWYWx1ZTogYW55ID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lucHV0KCkge1xuICAgIGlmIChudWxsID09IHRoaXMub25SZXF1ZXN0RGF0YSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQXNpQXV0b0NvbXBsZXRlTXVsdGlwbGVDb21wb25lbnQgOiBASW5wdXQgJ29uUmVxdWVzdERhdGEnIGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY2hlY2tJbnB1dCgpO1xuICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudCwgJ2xhYmVsLScgKyB0aGlzLmxhYmVsUG9zaXRpb24pO1xuXG4gICAgdGhpcy5hdXRvQ29tcGxldGVDb250cm9sLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlbGF5KSxcbiAgICAgICAgdGFwKCh2YWx1ZSkgPT4gKHRoaXMuY3VycmVudFZhbHVlID0gdmFsdWUpKSxcbiAgICAgICAgc3dpdGNoTWFwKCh2YWx1ZSkgPT4gbmgub2JzZXJ2ZSh0aGlzLm9uUmVxdWVzdERhdGEodmFsdWUsICF0aGlzLmZpcnN0UmVxdWVzdERvbmUpKSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgICAgICBpZiAodGhpcy5maXJzdFJlcXVlc3REb25lICYmIGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5vcGVuID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZpcnN0UmVxdWVzdERvbmUgPSB0cnVlO1xuICAgICAgfSk7XG4gIH1cblxuICBvbkRyb3Bkb3duQ2xvc2UoKSB7XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAodGhpcy5pbml0KSB7XG4gICAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5maXJzdFJlcXVlc3REb25lKSB7XG4gICAgICAgIHRoaXMuaW5pdCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYWRkVmFsdWUoZGF0YTogYW55KSB7XG4gICAgdGhpcy52YWx1ZSA9ICh0aGlzLnZhbHVlID8gdGhpcy52YWx1ZSBhcyBhbnlbXSA6IFtdKS5jb25jYXQoW2RhdGFdKTtcbiAgICBpZiAodGhpcy5jbG9zZUFmdGVyU2VsZWN0KSB7XG4gICAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVWYWx1ZShkYXRhOiBhbnkpIHtcbiAgICBjb25zdCB0YWIgPSB0aGlzLnZhbHVlO1xuICAgIG5oLnJlbW92ZSh0YWIsICh2YWx1ZSkgPT4ge1xuICAgICAgcmV0dXJuIGRhdGEgPT09IHZhbHVlO1xuICAgIH0pO1xuICAgIHRoaXMudmFsdWUgPSB0YWI7XG5cbiAgICBpZiAobmguaXNFbXB0eSh0aGlzLnZhbHVlKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAodGhpcy5pbml0ID09PSBmYWxzZSkge1xuICAgICAgdGhpcy5hdXRvQ29tcGxldGVDb250cm9sLnNldFZhbHVlKHRoaXMuY3VycmVudFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jdXJyZW50VmFsdWUgPSB2YWx1ZTtcbiAgICAgIGlmICh0aGlzLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5hdXRvQ29tcGxldGVDb250cm9sLnNldFZhbHVlKHRoaXMuY3VycmVudFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=