@taiga-ui/kit
Version:
Taiga UI Angular main components kit
139 lines • 22 kB
JavaScript
import { computed, Directive, effect, inject, Input, isSignal, signal, untracked, } from '@angular/core';
import { tuiAsControl, TuiControl } from '@taiga-ui/cdk/classes';
import { TUI_ALLOW_SIGNAL_WRITES, TUI_STRICT_MATCHER } from '@taiga-ui/cdk/constants';
import { tuiAsOptionContent, } from '@taiga-ui/core/components/data-list';
import { tuiAsTextfieldAccessor, tuiInjectAuxiliary, TuiTextfieldComponent, TuiTextfieldDirective, TuiWithTextfield, } from '@taiga-ui/core/components/textfield';
import { TuiDropdownDirective, tuiDropdownEnabled, tuiDropdownOpen, } from '@taiga-ui/core/directives/dropdown';
import { TUI_ITEMS_HANDLERS, } from '@taiga-ui/core/directives/items-handlers';
import { TuiSelectOption } from '@taiga-ui/kit/components/select';
import * as i0 from "@angular/core";
import * as i1 from "@taiga-ui/core/components/textfield";
class TuiComboBox extends TuiControl {
constructor() {
super(...arguments);
this.host = inject(TuiTextfieldComponent);
this.textfield = inject(TuiTextfieldDirective);
this.open = tuiDropdownOpen();
this.dropdownEnabled = tuiDropdownEnabled(this.interactive);
this.dropdown = inject(TuiDropdownDirective);
this.handlers = inject(TUI_ITEMS_HANDLERS);
this.matcher = signal(TUI_STRICT_MATCHER);
this.strict = signal(true);
this.datalist = tuiInjectAuxiliary((x) => x !== this && 'options' in x && isSignal(x.options));
this.options = computed(() => this.datalist()
?.options?.() // TODO(v5): remove optional call `?.()`
.filter((x) => !this.handlers.disabledItemHandler()(x)) ?? []);
this.nonStrictControlEffect = effect(() => {
if (!this.options().length &&
!this.strict() &&
this.stringify(this.value()) !== this.textfield.value()) {
this.onChange(this.textfield.value() || null);
}
}, TUI_ALLOW_SIGNAL_WRITES);
this.matchingEffect = effect(() => {
const options = this.options();
const matcher = this.matcher();
if (!options.length || !matcher) {
return;
}
const textfieldValue = this.textfield.value();
const selectedOption = options.find((x) => matcher(x, textfieldValue, this.handlers.stringify()));
const value = untracked(() => this.value());
const unchanged = this.stringify(value) === textfieldValue;
const fallback = this.strict() || !textfieldValue ? null : textfieldValue;
this.onChange(selectedOption ??
/**
* Don't clear already not-null form control value on new `this.options()` array.
* Otherwise, `ComboBox` becomes incompatible with virtual scroll
* (which displays large lists of elements by only rendering the items that fit on-screen).
* Users can still able to patch form value with `null` on new items if they wish the such behavior.
*/
(unchanged ? value : fallback));
}, TUI_ALLOW_SIGNAL_WRITES);
this.newValueEffect = effect(() => {
const stringified = this.stringify(this.value());
this.textfield.value.update((x) => stringified || x);
}, TUI_ALLOW_SIGNAL_WRITES);
this.blurEffect = effect(() => {
const incomplete = untracked(() => this.strict() && this.value() === null);
if (!this.host.focused() && incomplete) {
this.textfield.value.set('');
}
}, TUI_ALLOW_SIGNAL_WRITES);
}
// TODO(v5): use signal input
set strictSetter(x) {
this.strict.set(x);
}
// TODO(v5): use signal input
set matcherSetter(x) {
this.matcher.set(x);
}
setValue(value) {
this.textfield.setValue(value);
this.onChange(value);
if (!value) {
this.toggleDropdown(true);
}
}
writeValue(value) {
const reset = this.control.pristine && this.control.untouched && !value;
const changed = untracked(() => value !== this.value());
if (changed || reset) {
super.writeValue(value);
untracked(() => this.textfield.value.set(this.stringify(value)));
}
}
toggleDropdown(open = !this.open()) {
if (this.dropdownEnabled() && this.dropdown._content()) {
this.open.set(open);
}
}
keydownEnter(event) {
if (!this.open()) {
return;
}
event.preventDefault();
const options = this.options();
if (options.length === 1 && options[0]) {
this.setValue(options[0]);
this.toggleDropdown(false);
}
}
stringify(value) {
return value != null ? this.handlers.stringify()(value) : '';
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiComboBox, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: TuiComboBox, isStandalone: true, selector: "input[tuiComboBox]", inputs: { strictSetter: ["strict", "strictSetter"], matcherSetter: ["matcher", "matcherSetter"] }, host: { listeners: { "click": "toggleDropdown()", "input": "toggleDropdown(true)", "keydown.enter": "keydownEnter($event)" }, properties: { "disabled": "disabled()" } }, providers: [
tuiAsOptionContent(TuiSelectOption),
tuiAsTextfieldAccessor(TuiComboBox),
tuiAsControl(TuiComboBox),
], usesInheritance: true, hostDirectives: [{ directive: i1.TuiWithTextfield }], ngImport: i0 }); }
}
export { TuiComboBox };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiComboBox, decorators: [{
type: Directive,
args: [{
standalone: true,
selector: 'input[tuiComboBox]',
providers: [
tuiAsOptionContent(TuiSelectOption),
tuiAsTextfieldAccessor(TuiComboBox),
tuiAsControl(TuiComboBox),
],
hostDirectives: [TuiWithTextfield],
host: {
'[disabled]': 'disabled()',
'(click)': 'toggleDropdown()',
'(input)': 'toggleDropdown(true)',
'(keydown.enter)': 'keydownEnter($event)',
},
}]
}], propDecorators: { strictSetter: [{
type: Input,
args: ['strict']
}], matcherSetter: [{
type: Input,
args: ['matcher']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYm8tYm94LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2tpdC9jb21wb25lbnRzL2NvbWJvLWJveC9jb21iby1ib3guZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxHQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGtCQUFrQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFcEYsT0FBTyxFQUNILGtCQUFrQixHQUVyQixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFDSCxzQkFBc0IsRUFDdEIsa0JBQWtCLEVBRWxCLHFCQUFxQixFQUNyQixxQkFBcUIsRUFDckIsZ0JBQWdCLEdBQ25CLE1BQU0scUNBQXFDLENBQUM7QUFDN0MsT0FBTyxFQUNILG9CQUFvQixFQUNwQixrQkFBa0IsRUFDbEIsZUFBZSxHQUNsQixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFDSCxrQkFBa0IsR0FFckIsTUFBTSwwQ0FBMEMsQ0FBQztBQUNsRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0saUNBQWlDLENBQUM7OztBQUVoRSxNQWdCYSxXQUNULFNBQVEsVUFBNkI7SUFqQnpDOztRQW9CcUIsU0FBSSxHQUE2QixNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUMvRCxjQUFTLEdBQTZCLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3BFLFNBQUksR0FBRyxlQUFlLEVBQUUsQ0FBQztRQUN6QixvQkFBZSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMs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QUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2pFLENBQUM7K0dBbElRLFdBQVc7bUdBQVgsV0FBVyw4VUFiVDtZQUNQLGtCQUFrQixDQUFDLGVBQWUsQ0FBQztZQUNuQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUM7WUFDbkMsWUFBWSxDQUFDLFdBQVcsQ0FBQztTQUM1Qjs7U0FTUSxXQUFXOzRGQUFYLFdBQVc7a0JBaEJ2QixTQUFTO21CQUFDO29CQUNQLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsb0JBQW9CO29CQUM5QixTQUFTLEVBQUU7d0JBQ1Asa0JBQWtCLENBQUMsZUFBZSxDQUFDO3dCQUNuQyxzQkFBc0IsYUFBYTt3QkFDbkMsWUFBWSxhQUFhO3FCQUM1QjtvQkFDRCxjQUFjLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztvQkFDbEMsSUFBSSxFQUFFO3dCQUNGLFlBQVksRUFBRSxZQUFZO3dCQUMxQixTQUFTLEVBQUUsa0JBQWtCO3dCQUM3QixTQUFTLEVBQUUsc0JBQXNCO3dCQUNqQyxpQkFBaUIsRUFBRSxzQkFBc0I7cUJBQzVDO2lCQUNKOzhCQStFYyxZQUFZO3NCQUR0QixLQUFLO3VCQUFDLFFBQVE7Z0JBT0osYUFBYTtzQkFEdkIsS0FBSzt1QkFBQyxTQUFTIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBjb21wdXRlZCxcbiAgICBEaXJlY3RpdmUsXG4gICAgZWZmZWN0LFxuICAgIGluamVjdCxcbiAgICBJbnB1dCxcbiAgICBpc1NpZ25hbCxcbiAgICBzaWduYWwsXG4gICAgdW50cmFja2VkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dHVpQXNDb250cm9sLCBUdWlDb250cm9sfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NsYXNzZXMnO1xuaW1wb3J0IHtUVUlfQUxMT1dfU0lHTkFMX1dSSVRFUywgVFVJX1NUUklDVF9NQVRDSEVSfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2NvbnN0YW50cyc7XG5pbXBvcnQge3R5cGUgVHVpU3RyaW5nTWF0Y2hlcn0gZnJvbSAnQHRhaWdhLXVpL2Nkay90eXBlcyc7XG5pbXBvcnQge1xuICAgIHR1aUFzT3B0aW9uQ29udGVudCxcbiAgICB0eXBlIFR1aURhdGFMaXN0QWNjZXNzb3IsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvZGF0YS1saXN0JztcbmltcG9ydCB7XG4gICAgdHVpQXNUZXh0ZmllbGRBY2Nlc3NvcixcbiAgICB0dWlJbmplY3RBdXhpbGlhcnksXG4gICAgdHlwZSBUdWlUZXh0ZmllbGRBY2Nlc3NvcixcbiAgICBUdWlUZXh0ZmllbGRDb21wb25lbnQsXG4gICAgVHVpVGV4dGZpZWxkRGlyZWN0aXZlLFxuICAgIFR1aVdpdGhUZXh0ZmllbGQsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2NvbXBvbmVudHMvdGV4dGZpZWxkJztcbmltcG9ydCB7XG4gICAgVHVpRHJvcGRvd25EaXJlY3RpdmUsXG4gICAgdHVpRHJvcGRvd25FbmFibGVkLFxuICAgIHR1aURyb3Bkb3duT3Blbixcbn0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvZGlyZWN0aXZlcy9kcm9wZG93bic7XG5pbXBvcnQge1xuICAgIFRVSV9JVEVNU19IQU5ETEVSUyxcbiAgICB0eXBlIFR1aUl0ZW1zSGFuZGxlcnMsXG59IGZyb20gJ0B0YWlnYS11aS9jb3JlL2RpcmVjdGl2ZXMvaXRlbXMtaGFuZGxlcnMnO1xuaW1wb3J0IHtUdWlTZWxlY3RPcHRpb259IGZyb20gJ0B0YWlnYS11aS9raXQvY29tcG9uZW50cy9zZWxlY3QnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnaW5wdXRbdHVpQ29tYm9Cb3hdJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgdHVpQXNPcHRpb25Db250ZW50KFR1aVNlbGVjdE9wdGlvbiksXG4gICAgICAgIHR1aUFzVGV4dGZpZWxkQWNjZXNzb3IoVHVpQ29tYm9Cb3gpLFxuICAgICAgICB0dWlBc0NvbnRyb2woVHVpQ29tYm9Cb3gpLFxuICAgIF0sXG4gICAgaG9zdERpcmVjdGl2ZXM6IFtUdWlXaXRoVGV4dGZpZWxkXSxcbiAgICBob3N0OiB7XG4gICAgICAgICdbZGlzYWJsZWRdJzogJ2Rpc2FibGVkKCknLFxuICAgICAgICAnKGNsaWNrKSc6ICd0b2dnbGVEcm9wZG93bigpJyxcbiAgICAgICAgJyhpbnB1dCknOiAndG9nZ2xlRHJvcGRvd24odHJ1ZSknLFxuICAgICAgICAnKGtleWRvd24uZW50ZXIpJzogJ2tleWRvd25FbnRlcigkZXZlbnQpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBUdWlDb21ib0JveDxUPlxuICAgIGV4dGVuZHMgVHVpQ29udHJvbDxUIHwgc3RyaW5nIHwgbnVsbD5cbiAgICBpbXBsZW1lbnRzIFR1aVRleHRmaWVsZEFjY2Vzc29yPFQ+XG57XG4gICAgcHJpdmF0ZSByZWFkb25seSBob3N0OiBUdWlUZXh0ZmllbGRDb21wb25lbnQ8VD4gPSBpbmplY3QoVHVpVGV4dGZpZWxkQ29tcG9uZW50KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRleHRmaWVsZDogVHVpVGV4dGZpZWxkRGlyZWN0aXZlPFQ+ID0gaW5qZWN0KFR1aVRleHRmaWVsZERpcmVjdGl2ZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBvcGVuID0gdHVpRHJvcGRvd25PcGVuKCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkcm9wZG93bkVuYWJsZWQgPSB0dWlEcm9wZG93bkVuYWJsZWQodGhpcy5pbnRlcmFjdGl2ZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkcm9wZG93biA9IGluamVjdChUdWlEcm9wZG93bkRpcmVjdGl2ZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBoYW5kbGVyczogVHVpSXRlbXNIYW5kbGVyczxUIHwgc3RyaW5nPiA9IGluamVjdChUVUlfSVRFTVNfSEFORExFUlMpO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXRjaGVyID0gc2lnbmFsPFR1aVN0cmluZ01hdGNoZXI8VD4gfCBudWxsPihUVUlfU1RSSUNUX01BVENIRVIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaWN0ID0gc2lnbmFsKHRydWUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGF0YWxpc3QgPSB0dWlJbmplY3RBdXhpbGlhcnk8VHVpRGF0YUxpc3RBY2Nlc3NvcjxUPj4oXG4gICAgICAgICh4KSA9PiB4ICE9PSB0aGlzICYmICdvcHRpb25zJyBpbiB4ICYmIGlzU2lnbmFsKHgub3B0aW9ucyksXG4gICAgKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9ucyA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PlxuICAgICAgICAgICAgdGhpcy5kYXRhbGlzdCgpXG4gICAgICAgICAgICAgICAgPy5vcHRpb25zPy4oKSAvLyBUT0RPKHY1KTogcmVtb3ZlIG9wdGlvbmFsIGNhbGwgYD8uKClgXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoeCkgPT4gIXRoaXMuaGFuZGxlcnMuZGlzYWJsZWRJdGVtSGFuZGxlcigpKHgpKSA/PyBbXSxcbiAgICApO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG5vblN0cmljdENvbnRyb2xFZmZlY3QgPSBlZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhdGhpcy5vcHRpb25zKCkubGVuZ3RoICYmXG4gICAgICAgICAgICAhdGhpcy5zdHJpY3QoKSAmJlxuICAgICAgICAgICAgdGhpcy5zdHJpbmdpZnkodGhpcy52YWx1ZSgpKSAhPT0gdGhpcy50ZXh0ZmllbGQudmFsdWUoKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UodGhpcy50ZXh0ZmllbGQudmFsdWUoKSB8fCBudWxsKTtcbiAgICAgICAgfVxuICAgIH0sIFRVSV9BTExPV19TSUdOQUxfV1JJVEVTKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXRjaGluZ0VmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMoKTtcbiAgICAgICAgY29uc3QgbWF0Y2hlciA9IHRoaXMubWF0Y2hlcigpO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy5sZW5ndGggfHwgIW1hdGNoZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRleHRmaWVsZFZhbHVlID0gdGhpcy50ZXh0ZmllbGQudmFsdWUoKTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb24gPSBvcHRpb25zLmZpbmQoKHgpID0+XG4gICAgICAgICAgICBtYXRjaGVyKHgsIHRleHRmaWVsZFZhbHVlLCB0aGlzLmhhbmRsZXJzLnN0cmluZ2lmeSgpKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy52YWx1ZSgpKTtcbiAgICAgICAgY29uc3QgdW5jaGFuZ2VkID0gdGhpcy5zdHJpbmdpZnkodmFsdWUpID09PSB0ZXh0ZmllbGRWYWx1ZTtcbiAgICAgICAgY29uc3QgZmFsbGJhY2sgPSB0aGlzLnN0cmljdCgpIHx8ICF0ZXh0ZmllbGRWYWx1ZSA/IG51bGwgOiB0ZXh0ZmllbGRWYWx1ZTtcblxuICAgICAgICB0aGlzLm9uQ2hhbmdlKFxuICAgICAgICAgICAgc2VsZWN0ZWRPcHRpb24gPz9cbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiBEb24ndCBjbGVhciBhbHJlYWR5IG5vdC1udWxsIGZvcm0gY29udHJvbCB2YWx1ZSBvbiBuZXcgYHRoaXMub3B0aW9ucygpYCBhcnJheS5cbiAgICAgICAgICAgICAgICAgKiBPdGhlcndpc2UsIGBDb21ib0JveGAgYmVjb21lcyBpbmNvbXBhdGlibGUgd2l0aCB2aXJ0dWFsIHNjcm9sbFxuICAgICAgICAgICAgICAgICAqICh3aGljaCBkaXNwbGF5cyBsYXJnZSBsaXN0cyBvZiBlbGVtZW50cyBieSBvbmx5IHJlbmRlcmluZyB0aGUgaXRlbXMgdGhhdCBmaXQgb24tc2NyZWVuKS5cbiAgICAgICAgICAgICAgICAgKiBVc2VycyBjYW4gc3RpbGwgYWJsZSB0byBwYXRjaCBmb3JtIHZhbHVlIHdpdGggYG51bGxgIG9uIG5ldyBpdGVtcyBpZiB0aGV5IHdpc2ggdGhlIHN1Y2ggYmVoYXZpb3IuXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgKHVuY2hhbmdlZCA/IHZhbHVlIDogZmFsbGJhY2spLFxuICAgICAgICApO1xuICAgIH0sIFRVSV9BTExPV19TSUdOQUxfV1JJVEVTKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBuZXdWYWx1ZUVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0cmluZ2lmaWVkID0gdGhpcy5zdHJpbmdpZnkodGhpcy52YWx1ZSgpKTtcblxuICAgICAgICB0aGlzLnRleHRmaWVsZC52YWx1ZS51cGRhdGUoKHgpID0+IHN0cmluZ2lmaWVkIHx8IHgpO1xuICAgIH0sIFRVSV9BTExPV19TSUdOQUxfV1JJVEVTKTtcblxuICAgIHByb3RlY3RlZCByZWFkb25seSBibHVyRWZmZWN0ID0gZWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgaW5jb21wbGV0ZSA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLnN0cmljdCgpICYmIHRoaXMudmFsdWUoKSA9PT0gbnVsbCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhvc3QuZm9jdXNlZCgpICYmIGluY29tcGxldGUpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dGZpZWxkLnZhbHVlLnNldCgnJyk7XG4gICAgICAgIH1cbiAgICB9LCBUVUlfQUxMT1dfU0lHTkFMX1dSSVRFUyk7XG5cbiAgICAvLyBUT0RPKHY1KTogdXNlIHNpZ25hbCBpbnB1dFxuICAgIEBJbnB1dCgnc3RyaWN0JylcbiAgICBwdWJsaWMgc2V0IHN0cmljdFNldHRlcih4OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuc3RyaWN0LnNldCh4KTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKHY1KTogdXNlIHNpZ25hbCBpbnB1dFxuICAgIEBJbnB1dCgnbWF0Y2hlcicpXG4gICAgcHVibGljIHNldCBtYXRjaGVyU2V0dGVyKHg6IFR1aVN0cmluZ01hdGNoZXI8VD4gfCBudWxsKSB7XG4gICAgICAgIHRoaXMubWF0Y2hlci5zZXQoeCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldFZhbHVlKHZhbHVlOiBUIHwgbnVsbCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRleHRmaWVsZC5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuXG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlRHJvcGRvd24odHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgd3JpdGVWYWx1ZSh2YWx1ZTogVCB8IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcmVzZXQgPSB0aGlzLmNvbnRyb2wucHJpc3RpbmUgJiYgdGhpcy5jb250cm9sLnVudG91Y2hlZCAmJiAhdmFsdWU7XG4gICAgICAgIGNvbnN0IGNoYW5nZWQgPSB1bnRyYWNrZWQoKCkgPT4gdmFsdWUgIT09IHRoaXMudmFsdWUoKSk7XG5cbiAgICAgICAgaWYgKGNoYW5nZWQgfHwgcmVzZXQpIHtcbiAgICAgICAgICAgIHN1cGVyLndyaXRlVmFsdWUodmFsdWUpO1xuICAgICAgICAgICAgdW50cmFja2VkKCgpID0+IHRoaXMudGV4dGZpZWxkLnZhbHVlLnNldCh0aGlzLnN0cmluZ2lmeSh2YWx1ZSkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCB0b2dnbGVEcm9wZG93bihvcGVuID0gIXRoaXMub3BlbigpKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRyb3Bkb3duRW5hYmxlZCgpICYmIHRoaXMuZHJvcGRvd24uX2NvbnRlbnQoKSkge1xuICAgICAgICAgICAgdGhpcy5vcGVuLnNldChvcGVuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBrZXlkb3duRW50ZXIoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLm9wZW4oKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zKCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID09PSAxICYmIG9wdGlvbnNbMF0pIHtcbiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUob3B0aW9uc1swXSk7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZURyb3Bkb3duKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RyaW5naWZ5KHZhbHVlPzogVCB8IHN0cmluZyB8IG51bGwpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHRoaXMuaGFuZGxlcnMuc3RyaW5naWZ5KCkodmFsdWUpIDogJyc7XG4gICAgfVxufVxuIl19