ngx-tags
Version:
To install this library, run:
338 lines • 24.3 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, 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==