UNPKG

ngx-tags

Version:
338 lines 24.3 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ViewEncapsulation, TemplateRef, Input, EventEmitter, Output, forwardRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { NgxTagsValueAccessor } from './ngxTagsValueAccessor'; /* tslint:disable:component-selector */ var NgTagComponent = /** @class */ (function (_super) { tslib_1.__extends(NgTagComponent, _super); function NgTagComponent() { var _this = _super.call(this) || this; _this.isMenuOpen = false; _this.inputTag = ''; _this.placeholder = 'add a tag'; _this.actionTypes = { 'add': 'add', 'delete': 'delete', 'update': 'update', }; _this.tagLabel = 'tagLabel'; _this.tagValue = 'tagValue'; _this.clearOnBlur = true; _this.allowDupes = false; _this.onlyFromDropdown = false; _this.tagEditable = false; _this.change = new EventEmitter(); return _this; } Object.defineProperty(NgTagComponent.prototype, "tags", { get: /** * @return {?} */ function () { return this._value; }, enumerable: true, configurable: true }); /** * @return {?} */ NgTagComponent.prototype.whenClickedOut = /** * @return {?} */ function () { this.isMenuOpen = false; }; /** * @param {?} e * @return {?} */ NgTagComponent.prototype.enter = /** * @param {?} e * @return {?} */ function (e) { if (this.onlyFromDropdown) { e.stopProgation(); return false; } if (this.inputTag.trim()) { this.addToModal(this.inputTag); this.clearInput(); } }; /** * @param {?} $event * @return {?} */ NgTagComponent.prototype.save = /** * @param {?} $event * @return {?} */ function ($event) { this._value[$event.index][this.tagLabel] = $event.item.trim(); this.emitChange(this.actionTypes.update, this._value[$event.index]); }; /** * @return {?} */ NgTagComponent.prototype.blur = /** * @return {?} */ function () { if (this.clearOnBlur) { this.clearInput(); } }; /** * @return {?} */ NgTagComponent.prototype.clearInput = /** * @return {?} */ function () { this.inputTag = ''; }; /** * @param {?} indx * @return {?} */ NgTagComponent.prototype.del = /** * @param {?} indx * @return {?} */ function (indx) { if (this.canDeleteTags) { this._value.splice(indx, 1); this.emitChange(this.actionTypes.delete, this._value); } }; /** * @return {?} */ NgTagComponent.prototype.backspace = /** * @return {?} */ function () { if (!this.removeLastOnBackspace && !this.inputTag.trim()) { this._value.pop(); } }; /** * @return {?} */ NgTagComponent.prototype.input = /** * @return {?} */ function () { /** @type {?} */ var _inputTag = this.inputTag.trim(); if (_inputTag) { this._options = this.filterByInput(this.options); this.isMenuOpen = true; } }; /** * @private * @param {?} items * @return {?} */ NgTagComponent.prototype.filterByInput = /** * @private * @param {?} items * @return {?} */ function (items) { var _this = this; return items.filter((/** * @param {?} item * @return {?} */ function (item) { /** @type {?} */ var val = (typeof item !== 'string' && _this.tagLabel) ? item[_this.tagLabel] : item; if (val.toLowerCase().includes(_this.inputTag.trim().toLowerCase())) { return true; } return false; })); }; /** * @param {?} item * @return {?} */ NgTagComponent.prototype.select = /** * @param {?} item * @return {?} */ function (item) { this.addToModal(item.value); this.clearInput(); this.whenClickedOut(); }; /** * @private * @param {?} item * @return {?} */ NgTagComponent.prototype.addToModal = /** * @private * @param {?} item * @return {?} */ function (item) { if (this.hasReachedMaxTags()) { return; } /** @type {?} */ var itemToAdd = this.createTag(item); if (!this.allowDupes) { if (this.isDuplicate(itemToAdd)) { this._value.push(itemToAdd); this.emitChange(this.actionTypes.add, itemToAdd); } } else { this._value.push(itemToAdd); this.emitChange(this.actionTypes.add, itemToAdd); } }; /** * @private * @param {?} tag * @return {?} */ NgTagComponent.prototype.createTag = /** * @private * @param {?} tag * @return {?} */ function (tag) { var _a; if (typeof tag !== 'string') { return tag; } else { return _a = {}, _a[this.tagValue] = tag, _a[this.tagLabel] = tag, _a; } }; /** * @return {?} */ NgTagComponent.prototype.hasReachedMaxTags = /** * @return {?} */ function () { return this.maxTags ? (this.maxTags === this._value.length) : false; }; /** * @param {?} item * @return {?} */ NgTagComponent.prototype.isDuplicate = /** * @param {?} item * @return {?} */ function (item) { return this._value.indexOf(item) === -1 ? true : false; }; /** * @private * @param {?} type * @param {?} value * @return {?} */ NgTagComponent.prototype.emitChange = /** * @private * @param {?} type * @param {?} value * @return {?} */ function (type, value) { this.change.emit({ type: type, value: value }); }; NgTagComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-tags', template: "<section class=\"ngx-tags\">\n <section class=\"tag-container\" [closeMenu]=\"isMenuOpen\" (whenClickedOut)=\"whenClickedOut()\" [ngClass]=\"{'ngx-tags-disabled':disabled}\" >\n <span class=\"tag\" *ngFor=\"let tag of tags;let $index = index\" [ngClass]=\"{'tag-readonly': tag.readonly}\">\n <ng-container [ngTemplateOutletContext]=\"{ item: tag, index: $index,tagLabel:tagLabel,tagEditable:tagEditable }\"\n [ngTemplateOutlet]=\"tagTemplate ? tagTemplate:defaultTagItemTemplate\">\n </ng-container>\n <a href=\"#\" class=\"close\" [hidden]=\"!canDeleteTags\" (click)=\"del($index)\"></a>\n </span>\n <span class=\"tag-input\" >\n <input type=\"text\" *ngIf=\"canAddTags\" [(ngModel)]=\"inputTag\" (blur)=\"blur()\"\n [placeholder]=\"placeholder\" (keydown.enter)=\"enter($event)\" (keydown.backspace)=\"backspace()\"\n (input)=\"input()\">\n </span>\n </section>\n <ngx-tags-dropdown [items]=\"_options\" [dropdownItemTemplate]=\"dropdownItemTemplate\" [tagLabel]=\"tagLabel\" [inputTag]=\"inputTag\" (select)=\"select($event) \" [hidden]=\"!isMenuOpen\"></ngx-tags-dropdown>\n</section>\n\n<ng-template #defaultTagItemTemplate let-item=\"item\" let-tagLabel=\"tagLabel\" let-input=\"input\" let-tagEditable=\"tagEditable\" let-index=\"index\">\n <ngx-tag [item]=\"item\" [tagEditable]=\"tagEditable\" [tagLabel]=\"tagLabel\" [index]=\"index\" (change)=\"save($event)\"></ngx-tag>\n</ng-template>", providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ function () { return NgTagComponent; })), multi: true }], encapsulation: ViewEncapsulation.None, styles: [".ngx-tags{position:relative;display:block;width:100%}.ngx-tags .ngx-tags-disabled{opacity:.7;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.ngx-tags .tag-container{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;box-sizing:border-box}.ngx-tags .tag-container .tag,.ngx-tags .tag-container .tag-input{background:#9dc1ff;padding:.25rem;border-radius:.25rem;margin-right:.25rem;display:inline-flex;align-items:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.ngx-tags .tag-container .tag-input{background:#fff}.ngx-tags .tag-container .tag-input input{border:none;outline:0;min-width:140px;max-width:100%;height:100%;margin-left:4px;box-sizing:border-box;display:inline-block}.ngx-tags .tag-container .tag-readonly{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;opacity:.7}.ngx-tags .tag-container .close{position:relative;display:inline-block;width:10px;height:10px;opacity:.8}.ngx-tags .tag-container .close:hover{opacity:1}.ngx-tags .tag-container .close:after,.ngx-tags .tag-container .close:before{position:absolute;left:3px;content:' ';height:11px;width:2px;background-color:#333}.ngx-tags .tag-container .close:before{transform:rotate(45deg)}.ngx-tags .tag-container .close:after{transform:rotate(-45deg)}.item:hover,.keynav-active{background:#e1e4e8}.dropdown{margin:0;padding:0;border:1px solid #e1e4e8;box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);border-radius:2px;max-height:200px;overflow-y:auto;position:absolute;background:#fff;display:block;width:100%;z-index:1}.item{padding:4px 2px;display:block}"] }] } ]; /** @nocollapse */ NgTagComponent.ctorParameters = function () { return []; }; NgTagComponent.propDecorators = { tagTemplate: [{ type: Input }], dropdownItemTemplate: [{ type: Input }], options: [{ type: Input }], maxTags: [{ type: Input }], tagLabel: [{ type: Input }], tagValue: [{ type: Input }], removeLastOnBackspace: [{ type: Input }], canDeleteTags: [{ type: Input }], canAddTags: [{ type: Input }], clearOnBlur: [{ type: Input }], allowDupes: [{ type: Input }], onlyFromDropdown: [{ type: Input }], tagEditable: [{ type: Input }], change: [{ type: Output }] }; return NgTagComponent; }(NgxTagsValueAccessor)); export { NgTagComponent }; if (false) { /** @type {?} */ NgTagComponent.prototype.isMenuOpen; /** @type {?} */ NgTagComponent.prototype._options; /** @type {?} */ NgTagComponent.prototype.inputTag; /** @type {?} */ NgTagComponent.prototype.placeholder; /** @type {?} */ NgTagComponent.prototype.actionTypes; /** @type {?} */ NgTagComponent.prototype.tagTemplate; /** @type {?} */ NgTagComponent.prototype.dropdownItemTemplate; /** @type {?} */ NgTagComponent.prototype.options; /** @type {?} */ NgTagComponent.prototype.maxTags; /** @type {?} */ NgTagComponent.prototype.tagLabel; /** @type {?} */ NgTagComponent.prototype.tagValue; /** @type {?} */ NgTagComponent.prototype.removeLastOnBackspace; /** @type {?} */ NgTagComponent.prototype.canDeleteTags; /** @type {?} */ NgTagComponent.prototype.canAddTags; /** @type {?} */ NgTagComponent.prototype.clearOnBlur; /** @type {?} */ NgTagComponent.prototype.allowDupes; /** @type {?} */ NgTagComponent.prototype.onlyFromDropdown; /** @type {?} */ NgTagComponent.prototype.tagEditable; /** @type {?} */ NgTagComponent.prototype.change; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4VGFncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtdGFncy8iLCJzb3VyY2VzIjpbImxpYi9uZ3hUYWdzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuSCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7QUFLOUQ7SUFZb0MsMENBQW9CO0lBK0J0RDtRQUFBLFlBQ0UsaUJBQU8sU0FDUjtRQWhDTSxnQkFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQixjQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QsaUJBQVcsR0FBRyxXQUFXLENBQUM7UUFDMUIsaUJBQVcsR0FBRztZQUNuQixLQUFLLEVBQUUsS0FBSztZQUNaLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1NBQ25CLENBQUM7UUFVTyxjQUFRLEdBQUcsVUFBVSxDQUFDO1FBQ3RCLGNBQVEsR0FBRyxVQUFVLENBQUM7UUFJdEIsaUJBQVcsR0FBRyxJQUFJLENBQUM7UUFDbkIsZ0JBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsc0JBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLGlCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRVosWUFBTSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7O0lBSWxELENBQUM7SUF0QkQsc0JBQVcsZ0NBQUk7Ozs7UUFBZjtZQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNyQixDQUFDOzs7T0FBQTs7OztJQXVCRCx1Q0FBYzs7O0lBQWQ7UUFDRSxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDOzs7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Q0FBd0M7O0lBQ3hDLHVDQUFnQzs7SUFDaEMsb0NBQTZCOztJQUM3QixxQ0FBNEI7O0lBQzVCLG9DQUE0Qjs7SUFDNUIsMENBQWtDOztJQUNsQyxxQ0FBNkI7O0lBRTdCLGdDQUFrRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIFRlbXBsYXRlUmVmLCBJbnB1dCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTmd4VGFnc1ZhbHVlQWNjZXNzb3IgfSBmcm9tICcuL25neFRhZ3NWYWx1ZUFjY2Vzc29yJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qIHRzbGludDpkaXNhYmxlOmNvbXBvbmVudC1zZWxlY3RvciAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LXRhZ3MnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmd4VGFncy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25neFRhZ3MuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5nVGFnQ29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxuICB9XSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxuXG59KVxuZXhwb3J0IGNsYXNzIE5nVGFnQ29tcG9uZW50IGV4dGVuZHMgTmd4VGFnc1ZhbHVlQWNjZXNzb3Ige1xuICBwdWJsaWMgaXNNZW51T3BlbiA9IGZhbHNlO1xuICBwdWJsaWMgX29wdGlvbnM6IE9ic2VydmFibGU8e30+IHwgQXJyYXk8YW55PjtcbiAgcHVibGljIGlucHV0VGFnID0gJyc7XG4gIHB1YmxpYyBwbGFjZWhvbGRlciA9ICdhZGQgYSB0YWcnO1xuICBwdWJsaWMgYWN0aW9uVHlwZXMgPSB7XG4gICAgJ2FkZCc6ICdhZGQnLFxuICAgICdkZWxldGUnOiAnZGVsZXRlJyxcbiAgICAndXBkYXRlJzogJ3VwZGF0ZScsXG4gIH07XG5cbiAgcHVibGljIGdldCB0YWdzKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHRhZ1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBkcm9wZG93bkl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgb3B0aW9uczogYW55O1xuICBASW5wdXQoKSBtYXhUYWdzOiBudW1iZXI7XG4gIEBJbnB1dCgpIHRhZ0xhYmVsID0gJ3RhZ0xhYmVsJztcbiAgQElucHV0KCkgdGFnVmFsdWUgPSAndGFnVmFsdWUnO1xuICBASW5wdXQoKSByZW1vdmVMYXN0T25CYWNrc3BhY2U6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNhbkRlbGV0ZVRhZ3M6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNhbkFkZFRhZ3M6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNsZWFyT25CbHVyID0gdHJ1ZTtcbiAgQElucHV0KCkgYWxsb3dEdXBlcyA9IGZhbHNlO1xuICBASW5wdXQoKSBvbmx5RnJvbURyb3Bkb3duID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRhZ0VkaXRhYmxlID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHB1YmxpYyBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cblxuICB3aGVuQ2xpY2tlZE91dCgpIHtcbiAgICB0aGlzLmlzTWVudU9wZW4gPSBmYWxzZTtcbiAgfVxuXG5cbiAgZW50ZXIoZSkge1xuICAgIGlmICh0aGlzLm9ubHlGcm9tRHJvcGRvd24pIHtcbiAgICBlLnN0b3BQcm9nYXRpb24oKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5wdXRUYWcudHJpbSgpKSB7XG4gICAgICB0aGlzLmFkZFRvTW9kYWwodGhpcy5pbnB1dFRhZyk7XG4gICAgICB0aGlzLmNsZWFySW5wdXQoKTtcbiAgICB9XG4gIH1cbiAgc2F2ZSgkZXZlbnQpIHtcbiAgICB0aGlzLl92YWx1ZVskZXZlbnQuaW5kZXhdW3RoaXMudGFnTGFiZWxdID0gJGV2ZW50Lml0ZW0udHJpbSgpO1xuICAgIHRoaXMuZW1pdENoYW5nZSh0aGlzLmFjdGlvblR5cGVzLnVwZGF0ZSwgdGhpcy5fdmFsdWVbJGV2ZW50LmluZGV4XSk7XG4gIH1cblxuICBibHVyKCkge1xuICAgIGlmICh0aGlzLmNsZWFyT25CbHVyKSB7IHRoaXMuY2xlYXJJbnB1dCgpOyB9XG4gIH1cblxuICBjbGVhcklucHV0KCkge1xuICAgIHRoaXMuaW5wdXRUYWcgPSAnJztcbiAgfVxuXG4gIGRlbChpbmR4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5jYW5EZWxldGVUYWdzKSB7XG4gICAgICB0aGlzLl92YWx1ZS5zcGxpY2UoaW5keCwgMSk7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UodGhpcy5hY3Rpb25UeXBlcy5kZWxldGUsIHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBiYWNrc3BhY2UoKSB7XG4gICAgaWYgKCF0aGlzLnJlbW92ZUxhc3RPbkJhY2tzcGFjZSAmJiAhdGhpcy5pbnB1dFRhZy50cmltKCkpIHtcbiAgICAgIHRoaXMuX3ZhbHVlLnBvcCgpO1xuICAgIH1cbiAgfVxuXG4gIGlucHV0KCkge1xuICAgIGNvbnN0IF9pbnB1dFRhZyA9IHRoaXMuaW5wdXRUYWcudHJpbSgpO1xuICAgIGlmIChfaW5wdXRUYWcpIHtcbiAgICAgIHRoaXMuX29wdGlvbnMgPSB0aGlzLmZpbHRlckJ5SW5wdXQodGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMuaXNNZW51T3BlbiA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJCeUlucHV0KGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gKHR5cGVvZiBpdGVtICE9PSAnc3RyaW5nJyAmJiB0aGlzLnRhZ0xhYmVsKSA/IGl0ZW1bdGhpcy50YWdMYWJlbF0gOiBpdGVtO1xuICAgICAgaWYgKHZhbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuaW5wdXRUYWcudHJpbSgpLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgc2VsZWN0KGl0ZW0pIHtcbiAgICB0aGlzLmFkZFRvTW9kYWwoaXRlbS52YWx1ZSk7XG4gICAgdGhpcy5jbGVhcklucHV0KCk7XG4gICAgdGhpcy53aGVuQ2xpY2tlZE91dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRUb01vZGFsKGl0ZW0pIHtcbiAgICBpZiAodGhpcy5oYXNSZWFjaGVkTWF4VGFncygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1Ub0FkZCA9IHRoaXMuY3JlYXRlVGFnKGl0ZW0pO1xuICAgIGlmICghdGhpcy5hbGxvd0R1cGVzKSB7XG4gICAgICBpZiAodGhpcy5pc0R1cGxpY2F0ZShpdGVtVG9BZGQpKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlLnB1c2goaXRlbVRvQWRkKTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKHRoaXMuYWN0aW9uVHlwZXMuYWRkLCBpdGVtVG9BZGQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZS5wdXNoKGl0ZW1Ub0FkZCk7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UodGhpcy5hY3Rpb25UeXBlcy5hZGQsIGl0ZW1Ub0FkZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUYWcodGFnKSB7XG4gICAgaWYgKHR5cGVvZiB0YWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbdGhpcy50YWdWYWx1ZV06IHRhZyxcbiAgICAgICAgW3RoaXMudGFnTGFiZWxdOiB0YWdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaGFzUmVhY2hlZE1heFRhZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4VGFncyA/ICh0aGlzLm1heFRhZ3MgPT09IHRoaXMuX3ZhbHVlLmxlbmd0aCkgOiBmYWxzZTtcbiAgfVxuXG4gIGlzRHVwbGljYXRlKGl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUuaW5kZXhPZihpdGVtKSA9PT0gLTEgPyB0cnVlIDogZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlKHR5cGU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuY2hhbmdlLmVtaXQoeyB0eXBlOiB0eXBlLCB2YWx1ZTogdmFsdWUgfSk7XG4gIH1cbn1cbiJdfQ==