ngx-tags-input
Version:
To install this library, run:
336 lines (332 loc) • 24.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, forwardRef, Input, Output, EventEmitter } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
/** @type {?} */
const noop = (/**
* @return {?}
*/
() => { });
const ɵ0 = noop;
/** @type {?} */
const TAGS_INPUT_TEMPLATE = `
<div class="tags-input">
<span class="tags-input__tag label label-primary badge badge-primary" *ngFor="let tag of tags">
{{tag[displayField]}}
<span *ngIf="isDeleteable(tag)" role="button" class="tags-input__tag-remove-btn" (click)="removeTag(tag)" (touch)="removeTag(tag)">
<span aria-hidden="true">×</span>
<span class="sr-only">Close</span>
</span>
</span>
<input
*ngIf="options === null; else withTypeahead"
class="tags-input__input-field"
type="text"
[placeholder]="getPlaceholder()"
name="tags"
(keyup.enter)="addTag(tagInput)" (keydown.backspace)="removeLastTag(tagInput)"
[disabled]="!canAddTags || maximumOfTagsReached()"
[hidden]="!canAddTags || maximumOfTagsReached()"
#tagInput />
<ng-template #withTypeahead>
<input
*ngIf="options !== null"
class="tags-input__input-field"
type="text"
[placeholder]="getPlaceholder()"
name="tags"
(keydown.backspace)="removeLastTag(tagInput)"
[(ngModel)]="selected"
[typeahead]="options"
[typeaheadOptionField]="displayField"
(typeaheadOnSelect)="typeaheadOnSelect($event)"
(typeaheadNoResults)="typeaheadOnNoMatch($event)"
[typeaheadMinLength]="minLengthBeforeOptions"
[typeaheadScrollable]="scrollableOptions"
[typeaheadLatinize]="true"
[typeaheadOptionsInScrollableView]="scrollableOptionsInView"
[disabled]="!canAddTags || maximumOfTagsReached()"
[hidden]="!canAddTags || maximumOfTagsReached()"
#tagInput />
</ng-template>
</div>
`;
/** @type {?} */
const TAGS_INPUT_STYLE = `
:host {
overflow: auto;
white-space: nowrap;
}
.tags-input {
align-items: center;
display: flex;
flex-wrap: wrap;
}
.tags-input__tag {
display: inline-block;
margin-bottom: 2px;
margin-right: 5px;
padding-right: 0.3em;
}
.tags-input__tag-remove-btn {
cursor: pointer;
display: inline-block;
font-size: 12px;
margin: -3px 0 0 3px;
padding: 0;
vertical-align: top;
}
.tags-input__input-field {
border: none;
flex-grow: 1;
outline: none;
}
`;
/** @type {?} */
const CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => NgxTagsInputComponent)),
multi: true
};
/**
* @record
*/
export function TagsChangedEvent() { }
if (false) {
/** @type {?} */
TagsChangedEvent.prototype.change;
/** @type {?} */
TagsChangedEvent.prototype.tag;
}
export class NgxTagsInputComponent {
constructor() {
this.selected = '';
this.tags = [];
this.onTouchedCallback = noop;
this.onChangeCallback = noop;
this.removeLastOnBackspace = false;
this.canDeleteTags = true;
this.canAddTags = true;
this.placeholder = '';
this.options = null;
this.displayField = 'displayValue';
this.minLengthBeforeOptions = 1;
this.scrollableOptions = false;
this.scrollableOptionsInView = 5;
this.onTagsChanged = new EventEmitter();
this.onMaxTagsReached = new EventEmitter();
this.onNoOptionsMatch = new EventEmitter();
}
/**
* @return {?}
*/
getPlaceholder() {
if (this.tags && this.tags.length > 0) {
return '';
}
return this.placeholder;
}
/**
* @private
* @param {?} type
* @param {?} tag
* @return {?}
*/
tagsChanged(type, tag) {
this.onChangeCallback(this.tags);
this.onTagsChanged.emit({
change: type,
tag: tag
});
if (this.maximumOfTagsReached()) {
this.onMaxTagsReached.emit();
}
}
/**
* @param {?} tagInput
* @return {?}
*/
removeLastTag(tagInput) {
if (!this.removeLastOnBackspace || !this.tags.length) {
return;
}
if (tagInput.value === '') {
this.removeTag(this.tags[this.tags.length - 1]);
}
}
/**
* @param {?} tagInput
* @return {?}
*/
addTag(tagInput) {
if (tagInput.value.trim() !== '') {
/** @type {?} */
let tag = {
[this.displayField]: tagInput.value
};
this.addPredefinedTag(tag);
}
tagInput.value = '';
}
/**
* @private
* @param {?} tag
* @return {?}
*/
addPredefinedTag(tag) {
if (!this.maximumOfTagsReached()) {
this.tags.push(tag);
this.tagsChanged('add', tag);
}
}
/**
* @param {?} tagToRemove
* @return {?}
*/
removeTag(tagToRemove) {
if (!this.isDeleteable(tagToRemove)) {
return;
}
this.tags = this.tags.filter((/**
* @param {?} tag
* @return {?}
*/
tag => tagToRemove !== tag));
this.tagsChanged('remove', tagToRemove);
}
/**
* @return {?}
*/
maximumOfTagsReached() {
return typeof this.maxTags !== 'undefined' && this.tags && this.tags.length >= this.maxTags;
}
/**
* @param {?} tag
* @return {?}
*/
isDeleteable(tag) {
if (typeof tag.deleteable !== "undefined" && !tag.deleteable) {
return false;
}
return this.canDeleteTags;
}
/**
* @param {?} e
* @return {?}
*/
typeaheadOnSelect(e) {
if (typeof e.item === 'string') {
this.addPredefinedTag({
[this.displayField]: e.value
});
}
else {
this.addPredefinedTag(e.item);
}
this.selected = '';
}
/**
* @param {?} e
* @return {?}
*/
typeaheadOnNoMatch(e) {
if (typeof this.onNoOptionsMatch !== 'undefined') {
this.onNoOptionsMatch.emit(e);
}
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
if (value !== this.tags) {
this.tags = value;
}
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChangeCallback = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouchedCallback = fn;
}
}
NgxTagsInputComponent.decorators = [
{ type: Component, args: [{
selector: 'ngx-tags-input',
template: TAGS_INPUT_TEMPLATE,
providers: [CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR],
styles: [TAGS_INPUT_STYLE]
}] }
];
NgxTagsInputComponent.propDecorators = {
maxTags: [{ type: Input }],
removeLastOnBackspace: [{ type: Input }],
canDeleteTags: [{ type: Input }],
canAddTags: [{ type: Input }],
placeholder: [{ type: Input }],
options: [{ type: Input }],
displayField: [{ type: Input }],
minLengthBeforeOptions: [{ type: Input }],
scrollableOptions: [{ type: Input }],
scrollableOptionsInView: [{ type: Input }],
onTagsChanged: [{ type: Output }],
onMaxTagsReached: [{ type: Output }],
onNoOptionsMatch: [{ type: Output }]
};
if (false) {
/** @type {?} */
NgxTagsInputComponent.prototype.selected;
/** @type {?} */
NgxTagsInputComponent.prototype.tags;
/**
* @type {?}
* @private
*/
NgxTagsInputComponent.prototype.onTouchedCallback;
/**
* @type {?}
* @private
*/
NgxTagsInputComponent.prototype.onChangeCallback;
/** @type {?} */
NgxTagsInputComponent.prototype.maxTags;
/** @type {?} */
NgxTagsInputComponent.prototype.removeLastOnBackspace;
/** @type {?} */
NgxTagsInputComponent.prototype.canDeleteTags;
/** @type {?} */
NgxTagsInputComponent.prototype.canAddTags;
/** @type {?} */
NgxTagsInputComponent.prototype.placeholder;
/** @type {?} */
NgxTagsInputComponent.prototype.options;
/** @type {?} */
NgxTagsInputComponent.prototype.displayField;
/** @type {?} */
NgxTagsInputComponent.prototype.minLengthBeforeOptions;
/** @type {?} */
NgxTagsInputComponent.prototype.scrollableOptions;
/** @type {?} */
NgxTagsInputComponent.prototype.scrollableOptionsInView;
/** @type {?} */
NgxTagsInputComponent.prototype.onTagsChanged;
/** @type {?} */
NgxTagsInputComponent.prototype.onMaxTagsReached;
/** @type {?} */
NgxTagsInputComponent.prototype.onNoOptionsMatch;
}
export { ɵ0 };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRhZ3MtaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXRhZ3MtaW5wdXQvIiwic291cmNlcyI6WyJsaWIvbmd4LXRhZ3MtaW5wdXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQXdCLE1BQU0sZ0JBQWdCLENBQUM7O01BR25FLElBQUk7OztBQUFHLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQTs7O01BRWYsbUJBQW1CLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBeUMzQjs7TUFFSyxnQkFBZ0IsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBaUN4Qjs7TUFFSyxtQ0FBbUMsR0FBUTtJQUMvQyxPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLFdBQVcsRUFBRSxVQUFVOzs7SUFBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsRUFBQztJQUNwRCxLQUFLLEVBQUUsSUFBSTtDQUNaOzs7O0FBRUQsc0NBR0M7OztJQUZDLGtDQUFlOztJQUNmLCtCQUFROztBQVNWLE1BQU0sT0FBTyxxQkFBcUI7SUFObEM7UUFPRSxhQUFRLEdBQVUsRUFBRSxDQUFDO1FBQ2QsU0FBSSxHQUFlLEVBQUUsQ0FBQztRQUNyQixzQkFBaUIsR0FBZSxJQUFJLENBQUM7UUFDckMscUJBQWdCLEdBQXFCLElBQUksQ0FBQztRQUd6QywwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFDdkMsa0JBQWEsR0FBWSxJQUFJLENBQUM7UUFDOUIsZUFBVSxHQUFZLElBQUksQ0FBQztRQUMzQixnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUN6QixZQUFPLEdBQVEsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQVcs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bUMsQ0FBQzt5QkFEdkMsZ0JBQWdCO2FBRTFCOzs7c0JBT0UsS0FBSztvQ0FDTCxLQUFLOzRCQUNMLEtBQUs7eUJBQ0wsS0FBSzswQkFDTCxLQUFLO3NCQUNMLEtBQUs7MkJBQ0wsS0FBSztxQ0FDTCxLQUFLO2dDQUNMLEtBQUs7c0NBQ0wsS0FBSzs0QkFDTCxNQUFNOytCQUNOLE1BQU07K0JBQ04sTUFBTTs7OztJQWpCUCx5Q0FBcUI7O0lBQ3JCLHFDQUE2Qjs7Ozs7SUFDN0Isa0RBQTZDOzs7OztJQUM3QyxpREFBa0Q7O0lBRWxELHdDQUF5Qjs7SUFDekIsc0RBQWdEOztJQUNoRCw4Q0FBdUM7O0lBQ3ZDLDJDQUFvQzs7SUFDcEMsNENBQWtDOztJQUNsQyx3Q0FBNkI7O0lBQzdCLDZDQUErQzs7SUFDL0MsdURBQTRDOztJQUM1QyxrREFBNEM7O0lBQzVDLHdEQUE2Qzs7SUFDN0MsOENBQTZFOztJQUM3RSxpREFBb0U7O0lBQ3BFLGlEQUF1RSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZm9yd2FyZFJlZiwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgVHlwZWFoZWFkTWF0Y2ggfSBmcm9tICduZ3gtYm9vdHN0cmFwL3R5cGVhaGVhZC9wdWJsaWNfYXBpJztcclxuXHJcbmNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcclxuXHJcbmNvbnN0IFRBR1NfSU5QVVRfVEVNUExBVEUgPSBgXHJcbiAgICA8ZGl2IGNsYXNzPVwidGFncy1pbnB1dFwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidGFncy1pbnB1dF9fdGFnIGxhYmVsIGxhYmVsLXByaW1hcnkgYmFkZ2UgYmFkZ2UtcHJpbWFyeVwiICpuZ0Zvcj1cImxldCB0YWcgb2YgdGFnc1wiPlxyXG4gICAgICAgICAgICB7e3RhZ1tkaXNwbGF5RmllbGRdfX1cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJpc0RlbGV0ZWFibGUodGFnKVwiIHJvbGU9XCJidXR0b25cIiBjbGFzcz1cInRhZ3MtaW5wdXRfX3RhZy1yZW1vdmUtYnRuXCIgKGNsaWNrKT1cInJlbW92ZVRhZyh0YWcpXCIgKHRvdWNoKT1cInJlbW92ZVRhZyh0YWcpXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICpuZ0lmPVwib3B0aW9ucyA9PT0gbnVsbDsgZWxzZSB3aXRoVHlwZWFoZWFkXCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwidGFncy1pbnB1dF9faW5wdXQtZmllbGRcIiBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdldFBsYWNlaG9sZGVyKClcIlxyXG4gICAgICAgICAgICBuYW1lPVwidGFnc1wiXHJcbiAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJhZGRUYWcodGFnSW5wdXQpXCIgKGtleWRvd24uYmFja3NwYWNlKT1cInJlbW92ZUxhc3RUYWcodGFnSW5wdXQpXCJcclxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5BZGRUYWdzIHx8IG1heGltdW1PZlRhZ3NSZWFjaGVkKClcIlxyXG4gICAgICAgICAgICBbaGlkZGVuXT1cIiFjYW5BZGRUYWdzIHx8IG1heGltdW1PZlRhZ3NSZWFjaGVkKClcIlxyXG4gICAgICAgICAgICAjdGFnSW5wdXQgLz5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI3dpdGhUeXBlYWhlYWQ+XHJcbiAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgKm5nSWY9XCJvcHRpb25zICE9PSBudWxsXCIgXHJcbiAgICAgICAgICAgIGNsYXNzPVwidGFncy1pbnB1dF9faW5wdXQtZmllbGRcIiBcclxuICAgICAgICAgICAgdHlwZT1cInRleHRcIiBcclxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImdldFBsYWNlaG9sZGVyKClcIlxyXG4gICAgICAgICAgICBuYW1lPVwidGFnc1wiXHJcbiAgICAgICAgICAgIChrZXlkb3duLmJhY2tzcGFjZSk9XCJyZW1vdmVMYXN0VGFnKHRhZ0lucHV0KVwiXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRcIiBcclxuICAgICAgICAgICAgW3R5cGVhaGVhZF09XCJvcHRpb25zXCJcclxuICAgICAgICAgICAgW3R5cGVhaGVhZE9wdGlvbkZpZWxkXT1cImRpc3BsYXlGaWVsZFwiXHJcbiAgICAgICAgICAgICh0eXBlYWhlYWRPblNlbGVjdCk9XCJ0eXBlYWhlYWRPblNlbGVjdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKHR5cGVhaGVhZE5vUmVzdWx0cyk9XCJ0eXBlYWhlYWRPbk5vTWF0Y2goJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFt0eXBlYWhlYWRNaW5MZW5ndGhdPVwibWluTGVuZ3RoQmVmb3JlT3B0aW9uc1wiXHJcbiAgICAgICAgICAgIFt0eXBlYWhlYWRTY3JvbGxhYmxlXT1cInNjcm9sbGFibGVPcHRpb25zXCJcclxuICAgICAgICAgICAgW3R5cGVhaGVhZExhdGluaXplXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbdHlwZWFoZWFkT3B0aW9uc0luU2Nyb2xsYWJsZVZpZXddPVwic2Nyb2xsYWJsZU9wdGlvbnNJblZpZXdcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhbkFkZFRhZ3MgfHwgbWF4aW11bU9mVGFnc1JlYWNoZWQoKVwiXHJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwiIWNhbkFkZFRhZ3MgfHwgbWF4aW11bU9mVGFnc1JlYWNoZWQoKVwiXHJcbiAgICAgICAgICAgICN0YWdJbnB1dCAvPlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8L2Rpdj5cclxuYDtcclxuXHJcbmNvbnN0IFRBR1NfSU5QVVRfU1RZTEUgPSBgXHJcbiAgICA6aG9zdCB7XHJcbiAgICAgICAgb3ZlcmZsb3c6IGF1dG87XHJcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgIH1cclxuXHJcbiAgICAudGFncy1pbnB1dCB7XHJcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcclxuICAgIH1cclxuXHJcbiAgICAudGFncy1pbnB1dF9fdGFnIHtcclxuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMnB4O1xyXG4gICAgICAgIG1hcmdpbi1yaWdodDogNXB4O1xyXG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDAuM2VtO1xyXG4gICAgfVxyXG5cclxuICAgIC50YWdzLWlucHV0X190YWctcmVtb3ZlLWJ0biB7XHJcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgICAgbWFyZ2luOiAtM3B4IDAgMCAzcHg7XHJcbiAgICAgICAgcGFkZGluZzogMDtcclxuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xyXG4gICAgfVxyXG5cclxuICAgIC50YWdzLWlucHV0X19pbnB1dC1maWVsZCB7XHJcbiAgICAgICAgYm9yZGVyOiBub25lO1xyXG4gICAgICAgIGZsZXgtZ3JvdzogMTtcclxuICAgICAgICBvdXRsaW5lOiBub25lO1xyXG4gICAgfVxyXG5gO1xyXG5cclxuY29uc3QgQ1VTVE9NX0lOUFVUX0NPTlRST0xfVkFMVUVfQUNDRVNTT1I6IGFueSA9IHtcclxuICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3hUYWdzSW5wdXRDb21wb25lbnQpLFxyXG4gIG11bHRpOiB0cnVlXHJcbn07XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFRhZ3NDaGFuZ2VkRXZlbnQge1xyXG4gIGNoYW5nZTogc3RyaW5nLFxyXG4gIHRhZzogYW55XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmd4LXRhZ3MtaW5wdXQnLFxyXG4gIHRlbXBsYXRlOiBUQUdTX0lOUFVUX1RFTVBMQVRFLFxyXG4gIHN0eWxlczogW1RBR1NfSU5QVVRfU1RZTEVdLFxyXG4gIHByb3ZpZGVyczogW0NVU1RPTV9JTlBVVF9DT05UUk9MX1ZBTFVFX0FDQ0VTU09SXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmd4VGFnc0lucHV0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG4gIHNlbGVjdGVkOnN0cmluZyA9ICcnO1xyXG4gIHB1YmxpYyB0YWdzOiBBcnJheTxhbnk+ID0gW107XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWRDYWxsYmFjazogKCkgPT4gdm9pZCA9IG5vb3A7XHJcbiAgcHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrOiAoXzogYW55KSA9PiB2b2lkID0gbm9vcDtcclxuXHJcbiAgQElucHV0KCkgbWF4VGFnczogbnVtYmVyO1xyXG4gIEBJbnB1dCgpIHJlbW92ZUxhc3RPbkJhY2tzcGFjZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGNhbkRlbGV0ZVRhZ3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGNhbkFkZFRhZ3M6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSBvcHRpb25zOiBhbnkgPSBudWxsO1xyXG4gIEBJbnB1dCgpIGRpc3BsYXlGaWVsZDogc3RyaW5nID0gJ2Rpc3BsYXlWYWx1ZSc7XHJcbiAgQElucHV0KCkgbWluTGVuZ3RoQmVmb3JlT3B0aW9uczogbnVtYmVyID0gMTtcclxuICBASW5wdXQoKSBzY3JvbGxhYmxlT3B0aW9uczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNjcm9sbGFibGVPcHRpb25zSW5WaWV3OiBudW1iZXIgPSA1O1xyXG4gIEBPdXRwdXQoKSBvblRhZ3NDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8VGFnc0NoYW5nZWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIG9uTWF4VGFnc1JlYWNoZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBAT3V0cHV0KCkgb25Ob09wdGlvbnNNYXRjaDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBnZXRQbGFjZWhvbGRlcigpOiBzdHJpbmcge1xyXG4gICAgaWYodGhpcy50YWdzICYmIHRoaXMudGFncy5sZW5ndGggPiAwKXtcclxuICAgICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5wbGFjZWhvbGRlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdGFnc0NoYW5nZWQodHlwZTogc3RyaW5nLCB0YWc6IGFueSk6IHZvaWQge1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sodGhpcy50YWdzKTtcclxuICAgICAgdGhpcy5vblRhZ3NDaGFuZ2VkLmVtaXQoe1xyXG4gICAgICAgICAgY2hhbmdlOiB0eXBlLFxyXG4gICAgICAgICAgdGFnOiB0YWdcclxuICAgICAgfSk7XHJcbiAgICAgIGlmKHRoaXMubWF4aW11bU9mVGFnc1JlYWNoZWQoKSl7XHJcbiAgICAgICAgICB0aGlzLm9uTWF4VGFnc1JlYWNoZWQuZW1pdCgpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVMYXN0VGFnKHRhZ0lucHV0OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgIGlmKCF0aGlzLnJlbW92ZUxhc3RPbkJhY2tzcGFjZSB8fCAhdGhpcy50YWdzLmxlbmd0aCkge1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodGFnSW5wdXQudmFsdWUgPT09ICcnKXtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlVGFnKHRoaXMudGFnc1t0aGlzLnRhZ3MubGVuZ3RoLTFdKTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgYWRkVGFnKHRhZ0lucHV0OiBIVE1MSW5wdXRFbGVtZW50KTogdm9pZCB7XHJcbiAgICAgIGlmICh0YWdJbnB1dC52YWx1ZS50cmltKCkgIT09ICcnKXtcclxuICAgICAgICAgIGxldCB0YWcgPSB7XHJcbiAgICAgICAgICAgICAgW3RoaXMuZGlzcGxheUZpZWxkXTogdGFnSW5wdXQudmFsdWVcclxuICAgICAgICAgIH07XHJcbiAgICAgICAgICB0aGlzLmFkZFByZWRlZmluZWRUYWcodGFnKTtcclxuICAgICAgfVxyXG4gICAgICB0YWdJbnB1dC52YWx1ZSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRQcmVkZWZpbmVkVGFnKHRhZzogT2JqZWN0KTogdm9pZCB7XHJcbiAgICAgIGlmICghdGhpcy5tYXhpbXVtT2ZUYWdzUmVhY2hlZCgpKXtcclxuICAgICAgICAgIHRoaXMudGFncy5wdXNoKHRhZyk7XHJcbiAgICAgICAgICB0aGlzLnRhZ3NDaGFuZ2VkKCdhZGQnLCB0YWcpO1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVUYWcodGFnVG9SZW1vdmU6IGFueSk6IHZvaWQge1xyXG4gICAgICBpZighdGhpcy5pc0RlbGV0ZWFibGUodGFnVG9SZW1vdmUpKXtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnRhZ3MgPSB0aGlzLnRhZ3MuZmlsdGVyKHRhZyA9PiB0YWdUb1JlbW92ZSAhPT0gdGFnKTtcclxuICAgICAgdGhpcy50YWdzQ2hhbmdlZCgncmVtb3ZlJywgdGFnVG9SZW1vdmUpO1xyXG4gIH1cclxuXHJcbiAgbWF4aW11bU9mVGFnc1JlYWNoZWQoKTogYm9vbGVhbiB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YgdGhpcy5tYXhUYWdzICE9PSAndW5kZWZpbmVkJyAmJiB0aGlzLnRhZ3MgJiYgdGhpcy50YWdzLmxlbmd0aD49dGhpcy5tYXhUYWdzO1xyXG4gIH1cclxuXHJcbiAgaXNEZWxldGVhYmxlKHRhZzogYW55KSB7XHJcbiAgICAgIGlmKHR5cGVvZiB0YWcuZGVsZXRlYWJsZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiAhdGFnLmRlbGV0ZWFibGUpe1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB0aGlzLmNhbkRlbGV0ZVRhZ3M7XHJcbiAgfVxyXG5cclxuICB0eXBlYWhlYWRPblNlbGVjdChlOlR5cGVhaGVhZE1hdGNoKTp2b2lkIHtcclxuICAgICAgaWYodHlwZW9mIGUuaXRlbSA9PT0gJ3N0cmluZycpe1xyXG4gICAgICAgICAgdGhpcy5hZGRQcmVkZWZpbmVkVGFnKHtcclxuICAgICAgICAgICAgICBbdGhpcy5kaXNwbGF5RmllbGRdOiBlLnZhbHVlXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5hZGRQcmVkZWZpbmVkVGFnKGUuaXRlbSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZWxlY3RlZCA9ICcnO1xyXG4gIH1cclxuXHJcbiAgdHlwZWFoZWFkT25Ob01hdGNoKGU6YW55KTp2b2lkIHtcclxuICAgICAgaWYodHlwZW9mIHRoaXMub25Ob09wdGlvbnNNYXRjaCAhPT0gJ3VuZGVmaW5lZCcpe1xyXG4gICAgICAgICAgdGhpcy5vbk5vT3B0aW9uc01hdGNoLmVtaXQoZSlcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgIGlmICh2YWx1ZSAhPT0gdGhpcy50YWdzKSB7XHJcbiAgICAgICAgICB0aGlzLnRhZ3MgPSB2YWx1ZTtcclxuICAgICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KSB7XHJcbiAgICAgIHRoaXMub25DaGFuZ2VDYWxsYmFjayA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSkge1xyXG4gICAgICB0aGlzLm9uVG91Y2hlZENhbGxiYWNrID0gZm47XHJcbiAgfVxyXG59XHJcbiJdfQ==