@clr/angular
Version:
Angular components for Clarity
122 lines • 17.4 kB
JavaScript
/*
* Copyright (c) 2016-2023 VMware, Inc. All Rights Reserved.
* This software is released under MIT license.
* The full license information can be found in LICENSE in the root directory of this project.
*/
import { ContentChild, Directive, Optional } from '@angular/core';
import { ClrControlError } from './error';
import { ClrControlHelper } from './helper';
import { CONTROL_STATE } from './if-control-state/if-control-state.service';
import { ClrLabel } from './label';
import { ClrControlSuccess } from './success';
import * as i0 from "@angular/core";
import * as i1 from "./if-control-state/if-control-state.service";
import * as i2 from "./providers/layout.service";
import * as i3 from "./providers/control-class.service";
import * as i4 from "./providers/ng-control.service";
export class ClrAbstractContainer {
constructor(ifControlStateService, layoutService, controlClassService, ngControlService) {
this.ifControlStateService = ifControlStateService;
this.layoutService = layoutService;
this.controlClassService = controlClassService;
this.ngControlService = ngControlService;
this._dynamic = false;
this.subscriptions = [];
this.subscriptions.push(this.ifControlStateService.statusChanges.subscribe((state) => {
this.state = state;
this.updateHelpers();
}));
this.subscriptions.push(this.ngControlService.controlChanges.subscribe(control => {
this.control = control;
}));
}
/**
* @NOTE
* Helper control is a bit different than the others, it must be visible most of the time:
* - Helper must NOT be visible when CONTROL_STATE is not NONE and Success or Error components are \
* defined.
*
* For example user implement only Error control then if CONTROL_STATE is VALID then helper
* control must be visible.
*/
get showHelper() {
// without existence of helper component there is no need of additional checks.
if (!!this.controlHelperComponent === false) {
return false;
}
return (
/* Helper Component exist and the state of the form is NONE (not touched) */
(!!this.controlHelperComponent && (!this.touched || this.state === CONTROL_STATE.NONE)) ||
/* or there is no success component but the state of the form is VALID - show helper information */
(!!this.controlSuccessComponent === false && this.state === CONTROL_STATE.VALID) ||
/* or there is no error component but the state of the form is INVALID - show helper information */
(!!this.controlErrorComponent === false && this.state === CONTROL_STATE.INVALID));
}
get showValid() {
return this.touched && this.state === CONTROL_STATE.VALID && !!this.controlSuccessComponent;
}
get showInvalid() {
return this.touched && this.state === CONTROL_STATE.INVALID && !!this.controlErrorComponent;
}
get touched() {
return this.control?.touched;
}
ngAfterContentInit() {
/**
* We gonna set the helper control state, after all or most of the components
* are ready - also this will trigger some initial flows into wrappers and controls,
* like locating IDs and setting attributes.
*/
this.updateHelpers();
}
ngOnDestroy() {
this.subscriptions.forEach(subscription => subscription.unsubscribe());
}
controlClass() {
/**
* Decide what subtext to display:
* - container is valid but no success component is implemented - use helper class
* - container is valid and success component is implemented - use success class
*/
if ((!this.controlSuccessComponent && this.state === CONTROL_STATE.VALID) || !this.touched) {
return this.controlClassService.controlClass(CONTROL_STATE.NONE, this.addGrid());
}
/**
* Pass form control state and return string of classes to be applied to the container.
*/
return this.controlClassService.controlClass(this.state, this.addGrid());
}
addGrid() {
return this.layoutService && !this.layoutService.isVertical();
}
updateHelpers() {
if (this.ngControlService) {
this.ngControlService.setHelpers({
show: this.showInvalid || this.showHelper || this.showValid,
showInvalid: this.showInvalid,
showHelper: this.showHelper,
showValid: this.showValid,
});
}
}
}
ClrAbstractContainer.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrAbstractContainer, deps: [{ token: i1.IfControlStateService }, { token: i2.LayoutService, optional: true }, { token: i3.ControlClassService }, { token: i4.NgControlService }], target: i0.ɵɵFactoryTarget.Directive });
ClrAbstractContainer.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.2", type: ClrAbstractContainer, queries: [{ propertyName: "label", first: true, predicate: ClrLabel, descendants: true }, { propertyName: "controlSuccessComponent", first: true, predicate: ClrControlSuccess, descendants: true }, { propertyName: "controlErrorComponent", first: true, predicate: ClrControlError, descendants: true }, { propertyName: "controlHelperComponent", first: true, predicate: ClrControlHelper, descendants: true }], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrAbstractContainer, decorators: [{
type: Directive
}], ctorParameters: function () { return [{ type: i1.IfControlStateService }, { type: i2.LayoutService, decorators: [{
type: Optional
}] }, { type: i3.ControlClassService }, { type: i4.NgControlService }]; }, propDecorators: { label: [{
type: ContentChild,
args: [ClrLabel, { static: false }]
}], controlSuccessComponent: [{
type: ContentChild,
args: [ClrControlSuccess]
}], controlErrorComponent: [{
type: ContentChild,
args: [ClrControlError]
}], controlHelperComponent: [{
type: ContentChild,
args: [ClrControlHelper]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci9zcmMvZm9ybXMvY29tbW9uL2Fic3RyYWN0LWNvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7OztHQUlHO0FBRUgsT0FBTyxFQUFvQixZQUFZLEVBQUUsU0FBUyxFQUFhLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUsvRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsYUFBYSxFQUF5QixNQUFNLDZDQUE2QyxDQUFDO0FBQ25HLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFJbkMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFDOzs7Ozs7QUFHOUMsTUFBTSxPQUFnQixvQkFBb0I7SUFheEMsWUFDWSxxQkFBNEMsRUFDaEMsYUFBNEIsRUFDeEMsbUJBQXdDLEVBQ3hDLGdCQUFrQztRQUhsQywwQkFBcUIsR0FBckIscUJBQXFCLENBQXVCO1FBQ2hDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQ3hDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQVY5QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRVAsa0JBQWEsR0FBbUIsRUFBRSxDQUFDO1FBVTNDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQW9CLEVBQUUsRUFBRTtZQUMxRSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNuQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENB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LEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQzNCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUzthQUMxQixDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7O2lIQS9HbUIsb0JBQW9CO3FHQUFwQixvQkFBb0IsNkRBQzFCLFFBQVEsMEZBQ1IsaUJBQWlCLHdGQUNqQixlQUFlLHlGQUNmLGdCQUFnQjsyRkFKVixvQkFBb0I7a0JBRHpDLFNBQVM7OzBCQWdCTCxRQUFROzZHQWRnQyxLQUFLO3NCQUEvQyxZQUFZO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBQ1IsdUJBQXVCO3NCQUF2RCxZQUFZO3VCQUFDLGlCQUFpQjtnQkFDQSxxQkFBcUI7c0JBQW5ELFlBQVk7dUJBQUMsZUFBZTtnQkFDRyxzQkFBc0I7c0JBQXJELFlBQVk7dUJBQUMsZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDIzIFZNd2FyZSwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBDb250ZW50Q2hpbGQsIERpcmVjdGl2ZSwgT25EZXN0cm95LCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IER5bmFtaWNXcmFwcGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvaG9zdC13cmFwcGluZy9keW5hbWljLXdyYXBwZXInO1xuaW1wb3J0IHsgQ2xyQ29udHJvbEVycm9yIH0gZnJvbSAnLi9lcnJvcic7XG5pbXBvcnQgeyBDbHJDb250cm9sSGVscGVyIH0gZnJvbSAnLi9oZWxwZXInO1xuaW1wb3J0IHsgQ09OVFJPTF9TVEFURSwgSWZDb250cm9sU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi9pZi1jb250cm9sLXN0YXRlL2lmLWNvbnRyb2wtc3RhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBDbHJMYWJlbCB9IGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IHsgQ29udHJvbENsYXNzU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL2NvbnRyb2wtY2xhc3Muc2VydmljZSc7XG5pbXBvcnQgeyBMYXlvdXRTZXJ2aWNlIH0gZnJvbSAnLi9wcm92aWRlcnMvbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgTmdDb250cm9sU2VydmljZSB9IGZyb20gJy4vcHJvdmlkZXJzL25nLWNvbnRyb2wuc2VydmljZSc7XG5pbXBvcnQgeyBDbHJDb250cm9sU3VjY2VzcyB9IGZyb20gJy4vc3VjY2Vzcyc7XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENsckFic3RyYWN0Q29udGFpbmVyIGltcGxlbWVudHMgRHluYW1pY1dyYXBwZXIsIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBDb250ZW50Q2hpbGQoQ2xyTGFiZWwsIHsgc3RhdGljOiBmYWxzZSB9KSBsYWJlbDogQ2xyTGFiZWw7XG4gIEBDb250ZW50Q2hpbGQoQ2xyQ29udHJvbFN1Y2Nlc3MpIGNvbnRyb2xTdWNjZXNzQ29tcG9uZW50OiBDbHJDb250cm9sU3VjY2VzcztcbiAgQENvbnRlbnRDaGlsZChDbHJDb250cm9sRXJyb3IpIGNvbnRyb2xFcnJvckNvbXBvbmVudDogQ2xyQ29udHJvbEVycm9yO1xuICBAQ29udGVudENoaWxkKENsckNvbnRyb2xIZWxwZXIpIGNvbnRyb2xIZWxwZXJDb21wb25lbnQ6IENsckNvbnRyb2xIZWxwZXI7XG5cbiAgY29udHJvbDogTmdDb250cm9sO1xuICBfZHluYW1pYyA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xuXG4gIHByaXZhdGUgc3RhdGU6IENPTlRST0xfU1RBVEU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGlmQ29udHJvbFN0YXRlU2VydmljZTogSWZDb250cm9sU3RhdGVTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBsYXlvdXRTZXJ2aWNlOiBMYXlvdXRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjb250cm9sQ2xhc3NTZXJ2aWNlOiBDb250cm9sQ2xhc3NTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBuZ0NvbnRyb2xTZXJ2aWNlOiBOZ0NvbnRyb2xTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5pZkNvbnRyb2xTdGF0ZVNlcnZpY2Uuc3RhdHVzQ2hhbmdlcy5zdWJzY3JpYmUoKHN0YXRlOiBDT05UUk9MX1NUQVRFKSA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy51cGRhdGVIZWxwZXJzKCk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMubmdDb250cm9sU2VydmljZS5jb250cm9sQ2hhbmdlcy5zdWJzY3JpYmUoY29udHJvbCA9PiB7XG4gICAgICAgIHRoaXMuY29udHJvbCA9IGNvbnRyb2w7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQE5PVEVcbiAgICogSGVscGVyIGNvbnRyb2wgaXMgYSBiaXQgZGlmZmVyZW50IHRoYW4gdGhlIG90aGVycywgaXQgbXVzdCBiZSB2aXNpYmxlIG1vc3Qgb2YgdGhlIHRpbWU6XG4gICAqICAgLSBIZWxwZXIgbXVzdCBOT1QgYmUgdmlzaWJsZSB3aGVuIENPTlRST0xfU1RBVEUgaXMgbm90IE5PTkUgYW5kIFN1Y2Nlc3Mgb3IgRXJyb3IgY29tcG9uZW50cyBhcmUgXFxcbiAgICogZGVmaW5lZC5cbiAgICpcbiAgICogRm9yIGV4YW1wbGUgdXNlciBpbXBsZW1lbnQgb25seSBFcnJvciBjb250cm9sIHRoZW4gaWYgQ09OVFJPTF9TVEFURSBpcyBWQUxJRCB0aGVuIGhlbHBlclxuICAgKiBjb250cm9sIG11c3QgYmUgdmlzaWJsZS5cbiAgICovXG4gIGdldCBzaG93SGVscGVyKCk6IGJvb2xlYW4ge1xuICAgIC8vIHdpdGhvdXQgZXhpc3RlbmNlIG9mIGhlbHBlciBjb21wb25lbnQgdGhlcmUgaXMgbm8gbmVlZCBvZiBhZGRpdGlvbmFsIGNoZWNrcy5cbiAgICBpZiAoISF0aGlzLmNvbnRyb2xIZWxwZXJDb21wb25lbnQgPT09IGZhbHNlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIC8qIEhlbHBlciBDb21wb25lbnQgZXhpc3QgYW5kIHRoZSBzdGF0ZSBvZiB0aGUgZm9ybSBpcyBOT05FIChub3QgdG91Y2hlZCkgKi9cbiAgICAgICghIXRoaXMuY29udHJvbEhlbHBlckNvbXBvbmVudCAmJiAoIXRoaXMudG91Y2hlZCB8fCB0aGlzLnN0YXRlID09PSBDT05UUk9MX1NUQVRFLk5PTkUpKSB8fFxuICAgICAgLyogb3IgdGhlcmUgaXMgbm8gc3VjY2VzcyBjb21wb25lbnQgYnV0IHRoZSBzdGF0ZSBvZiB0aGUgZm9ybSBpcyBWQUxJRCAtIHNob3cgaGVscGVyIGluZm9ybWF0aW9uICovXG4gICAgICAoISF0aGlzLmNvbnRyb2xTdWNjZXNzQ29tcG9uZW50ID09PSBmYWxzZSAmJiB0aGlzLnN0YXRlID09PSBDT05UUk9MX1NUQVRFLlZBTElEKSB8fFxuICAgICAgLyogb3IgdGhlcmUgaXMgbm8gZXJyb3IgY29tcG9uZW50IGJ1dCB0aGUgc3RhdGUgb2YgdGhlIGZvcm0gaXMgSU5WQUxJRCAtIHNob3cgaGVscGVyIGluZm9ybWF0aW9uICovXG4gICAgICAoISF0aGlzLmNvbnRyb2xFcnJvckNvbXBvbmVudCA9PT0gZmFsc2UgJiYgdGhpcy5zdGF0ZSA9PT0gQ09OVFJPTF9TVEFURS5JTlZBTElEKVxuICAgICk7XG4gIH1cblxuICBnZXQgc2hvd1ZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRvdWNoZWQgJiYgdGhpcy5zdGF0ZSA9PT0gQ09OVFJPTF9TVEFURS5WQUxJRCAmJiAhIXRoaXMuY29udHJvbFN1Y2Nlc3NDb21wb25lbnQ7XG4gIH1cblxuICBnZXQgc2hvd0ludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudG91Y2hlZCAmJiB0aGlzLnN0YXRlID09PSBDT05UUk9MX1NUQVRFLklOVkFMSUQgJiYgISF0aGlzLmNvbnRyb2xFcnJvckNvbXBvbmVudDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IHRvdWNoZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udHJvbD8udG91Y2hlZDtcbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAvKipcbiAgICAgKiBXZSBnb25uYSBzZXQgdGhlIGhlbHBlciBjb250cm9sIHN0YXRlLCBhZnRlciBhbGwgb3IgbW9zdCBvZiB0aGUgY29tcG9uZW50c1xuICAgICAqIGFyZSByZWFkeSAtIGFsc28gdGhpcyB3aWxsIHRyaWdnZXIgc29tZSBpbml0aWFsIGZsb3dzIGludG8gd3JhcHBlcnMgYW5kIGNvbnRyb2xzLFxuICAgICAqIGxpa2UgbG9jYXRpbmcgSURzICBhbmQgc2V0dGluZyAgYXR0cmlidXRlcy5cbiAgICAgKi9cbiAgICB0aGlzLnVwZGF0ZUhlbHBlcnMoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKHN1YnNjcmlwdGlvbiA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICBjb250cm9sQ2xhc3MoKSB7XG4gICAgLyoqXG4gICAgICogRGVjaWRlIHdoYXQgc3VidGV4dCB0byBkaXNwbGF5OlxuICAgICAqICAgLSBjb250YWluZXIgaXMgdmFsaWQgYnV0IG5vIHN1Y2Nlc3MgY29tcG9uZW50IGlzIGltcGxlbWVudGVkIC0gdXNlIGhlbHBlciBjbGFzc1xuICAgICAqICAgLSBjb250YWluZXIgaXMgdmFsaWQgYW5kIHN1Y2Nlc3MgY29tcG9uZW50IGlzIGltcGxlbWVudGVkIC0gdXNlIHN1Y2Nlc3MgY2xhc3NcbiAgICAgKi9cbiAgICBpZiAoKCF0aGlzLmNvbnRyb2xTdWNjZXNzQ29tcG9uZW50ICYmIHRoaXMuc3RhdGUgPT09IENPTlRST0xfU1RBVEUuVkFMSUQpIHx8ICF0aGlzLnRvdWNoZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xDbGFzc1NlcnZpY2UuY29udHJvbENsYXNzKENPTlRST0xfU1RBVEUuTk9ORSwgdGhpcy5hZGRHcmlkKCkpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBQYXNzIGZvcm0gY29udHJvbCBzdGF0ZSBhbmQgcmV0dXJuIHN0cmluZyBvZiBjbGFzc2VzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGNvbnRhaW5lci5cbiAgICAgKi9cbiAgICByZXR1cm4gdGhpcy5jb250cm9sQ2xhc3NTZXJ2aWNlLmNvbnRyb2xDbGFzcyh0aGlzLnN0YXRlLCB0aGlzLmFkZEdyaWQoKSk7XG4gIH1cblxuICBhZGRHcmlkKCkge1xuICAgIHJldHVybiB0aGlzLmxheW91dFNlcnZpY2UgJiYgIXRoaXMubGF5b3V0U2VydmljZS5pc1ZlcnRpY2FsKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUhlbHBlcnMoKSB7XG4gICAgaWYgKHRoaXMubmdDb250cm9sU2VydmljZSkge1xuICAgICAgdGhpcy5uZ0NvbnRyb2xTZXJ2aWNlLnNldEhlbHBlcnMoe1xuICAgICAgICBzaG93OiB0aGlzLnNob3dJbnZhbGlkIHx8IHRoaXMuc2hvd0hlbHBlciB8fCB0aGlzLnNob3dWYWxpZCxcbiAgICAgICAgc2hvd0ludmFsaWQ6IHRoaXMuc2hvd0ludmFsaWQsXG4gICAgICAgIHNob3dIZWxwZXI6IHRoaXMuc2hvd0hlbHBlcixcbiAgICAgICAgc2hvd1ZhbGlkOiB0aGlzLnNob3dWYWxpZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19