UNPKG

carbon-components-angular

Version:
201 lines 20 kB
import { ChangeDetectionStrategy, Component, ContentChildren, forwardRef, HostBinding, Input, TemplateRef } from "@angular/core"; import { CHECKBOX_GROUP_HOST } from "./checkbox-group-host"; import { Checkbox } from "./checkbox.component"; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "carbon-components-angular/icon"; /** * Groups related checkboxes with a shared legend, validation, and optional decorator * (e.g. AI label). * * ```html * <cds-checkbox-group legend="Group label" [decorator]="decoratorTpl"> * <cds-checkbox>Option 1</cds-checkbox> * </cds-checkbox-group> * ``` */ export class CheckboxGroup { constructor(changeDetectorRef) { this.changeDetectorRef = changeDetectorRef; this.hostFormItem = true; this.helperTextId = `checkbox-group-helper-${CheckboxGroup.nextHelperId++}`; this.orientation = "vertical"; this.invalid = false; this.warn = false; this.readOnly = false; } ngOnChanges(changes) { if (changes["readOnly"] || changes["invalid"] || changes["warn"]) { this.notifyCheckboxesHostStateChanged(); } } ngAfterContentInit() { this.checkboxes.changes.subscribe(() => this.notifyCheckboxesHostStateChanged()); } isTemplate(value) { return value instanceof TemplateRef; } notifyCheckboxesHostStateChanged() { Promise.resolve().then(() => { this.checkboxes?.forEach((cb) => cb.markForCheckFromGroup()); this.changeDetectorRef.markForCheck(); }); } } CheckboxGroup.nextHelperId = 0; CheckboxGroup.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CheckboxGroup, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); CheckboxGroup.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CheckboxGroup, selector: "cds-checkbox-group, ibm-checkbox-group", inputs: { legend: "legend", legendId: "legendId", fieldsetAriaLabelledby: "fieldsetAriaLabelledby", orientation: "orientation", helperText: "helperText", invalid: "invalid", invalidText: "invalidText", warn: "warn", warnText: "warnText", readOnly: "readOnly", decorator: "decorator" }, host: { properties: { "class.cds--form-item": "this.hostFormItem" } }, providers: [ { provide: CHECKBOX_GROUP_HOST, useExisting: CheckboxGroup } ], queries: [{ propertyName: "checkboxes", predicate: i0.forwardRef(function () { return Checkbox; }), descendants: true }], usesOnChanges: true, ngImport: i0, template: ` <fieldset class="cds--checkbox-group" [ngClass]="{ 'cds--checkbox-group--horizontal': orientation === 'horizontal', 'cds--checkbox-group--readonly': readOnly, 'cds--checkbox-group--invalid': !readOnly && invalid, 'cds--checkbox-group--warning': !readOnly && !invalid && warn, 'cds--checkbox-group--decorator': !!decorator }" [attr.data-invalid]="invalid ? true : null" [attr.aria-labelledby]="legendId || fieldsetAriaLabelledby || null" [attr.aria-readonly]="readOnly ? true : null" [attr.aria-describedby]="(helperText && !invalid && !warn) ? helperTextId : null"> <legend *ngIf="legend" class="cds--label" [attr.id]="legendId || null"> <ng-template *ngIf="isTemplate(legend); else legendLabel" [ngTemplateOutlet]="legend"></ng-template> <ng-template #legendLabel>{{legend}}</ng-template> <ng-container *ngIf="decorator"> <div class="cds--checkbox-group-inner--decorator"> <ng-template [ngTemplateOutlet]="decorator"></ng-template> </div> </ng-container> </legend> <ng-content></ng-content> <div class="cds--checkbox-group__validation-msg"> <ng-container *ngIf="!readOnly && invalid"> <svg cdsIcon="warning--filled" size="16" class="cds--checkbox__invalid-icon"> </svg> <div class="cds--form-requirement"> <ng-container *ngIf="!isTemplate(invalidText)">{{ invalidText }}</ng-container> <ng-template *ngIf="isTemplate(invalidText)" [ngTemplateOutlet]="invalidText"></ng-template> </div> </ng-container> <ng-container *ngIf="!readOnly && !invalid && warn"> <svg cdsIcon="warning--alt--filled" size="16" class="cds--checkbox__invalid-icon cds--checkbox__invalid-icon--warning"> </svg> <div class="cds--form-requirement"> <ng-container *ngIf="!isTemplate(warnText)">{{warnText}}</ng-container> <ng-template *ngIf="isTemplate(warnText)" [ngTemplateOutlet]="warnText"></ng-template> </div> </ng-container> </div> <div *ngIf="helperText && !invalid && !warn" class="cds--form__helper-text" [id]="helperTextId"> <ng-container *ngIf="!isTemplate(helperText)">{{helperText}}</ng-container> <ng-template *ngIf="isTemplate(helperText)" [ngTemplateOutlet]="helperText"></ng-template> </div> </fieldset> `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CheckboxGroup, decorators: [{ type: Component, args: [{ selector: "cds-checkbox-group, ibm-checkbox-group", template: ` <fieldset class="cds--checkbox-group" [ngClass]="{ 'cds--checkbox-group--horizontal': orientation === 'horizontal', 'cds--checkbox-group--readonly': readOnly, 'cds--checkbox-group--invalid': !readOnly && invalid, 'cds--checkbox-group--warning': !readOnly && !invalid && warn, 'cds--checkbox-group--decorator': !!decorator }" [attr.data-invalid]="invalid ? true : null" [attr.aria-labelledby]="legendId || fieldsetAriaLabelledby || null" [attr.aria-readonly]="readOnly ? true : null" [attr.aria-describedby]="(helperText && !invalid && !warn) ? helperTextId : null"> <legend *ngIf="legend" class="cds--label" [attr.id]="legendId || null"> <ng-template *ngIf="isTemplate(legend); else legendLabel" [ngTemplateOutlet]="legend"></ng-template> <ng-template #legendLabel>{{legend}}</ng-template> <ng-container *ngIf="decorator"> <div class="cds--checkbox-group-inner--decorator"> <ng-template [ngTemplateOutlet]="decorator"></ng-template> </div> </ng-container> </legend> <ng-content></ng-content> <div class="cds--checkbox-group__validation-msg"> <ng-container *ngIf="!readOnly && invalid"> <svg cdsIcon="warning--filled" size="16" class="cds--checkbox__invalid-icon"> </svg> <div class="cds--form-requirement"> <ng-container *ngIf="!isTemplate(invalidText)">{{ invalidText }}</ng-container> <ng-template *ngIf="isTemplate(invalidText)" [ngTemplateOutlet]="invalidText"></ng-template> </div> </ng-container> <ng-container *ngIf="!readOnly && !invalid && warn"> <svg cdsIcon="warning--alt--filled" size="16" class="cds--checkbox__invalid-icon cds--checkbox__invalid-icon--warning"> </svg> <div class="cds--form-requirement"> <ng-container *ngIf="!isTemplate(warnText)">{{warnText}}</ng-container> <ng-template *ngIf="isTemplate(warnText)" [ngTemplateOutlet]="warnText"></ng-template> </div> </ng-container> </div> <div *ngIf="helperText && !invalid && !warn" class="cds--form__helper-text" [id]="helperTextId"> <ng-container *ngIf="!isTemplate(helperText)">{{helperText}}</ng-container> <ng-template *ngIf="isTemplate(helperText)" [ngTemplateOutlet]="helperText"></ng-template> </div> </fieldset> `, providers: [ { provide: CHECKBOX_GROUP_HOST, useExisting: CheckboxGroup } ], changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { hostFormItem: [{ type: HostBinding, args: ["class.cds--form-item"] }], checkboxes: [{ type: ContentChildren, args: [forwardRef(() => Checkbox), { descendants: true }] }], legend: [{ type: Input }], legendId: [{ type: Input }], fieldsetAriaLabelledby: [{ type: Input }], orientation: [{ type: Input }], helperText: [{ type: Input }], invalid: [{ type: Input }], invalidText: [{ type: Input }], warn: [{ type: Input }], warnText: [{ type: Input }], readOnly: [{ type: Input }], decorator: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tib3gtZ3JvdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NoZWNrYm94L2NoZWNrYm94LWdyb3VwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRU4sdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFdBQVcsRUFDWCxLQUFLLEVBSUwsV0FBVyxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7OztBQUVoRDs7Ozs7Ozs7O0dBU0c7QUFpRUgsTUFBTSxPQUFPLGFBQWE7SUF3Q3pCLFlBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBdENuQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUtoRCxpQkFBWSxHQUFHLHlCQUF5QixhQUFhLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQztRQWN2RSxnQkFBVyxHQUE4QixVQUFVLENBQUM7UUFJcEQsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUloQixTQUFJLEdBQUcsS0FBSyxDQUFDO1FBSWIsYUFBUSxHQUFHLEtBQUssQ0FBQztJQU9pQyxDQUFDO0lBRTVELFdBQVcsQ0FBQyxPQUFzQjtRQUNqQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2pFLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO1NBQ3hDO0lBQ0YsQ0FBQztJQUVELGtCQUFrQjtRQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQVU7UUFDcEIsT0FBTyxLQUFLLFlBQVksV0FBVyxDQUFDO0lBQ3JDLENBQUM7SUFFTyxnQ0FBZ0M7UUFDdkMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDM0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3ZDLENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQzs7QUE1RGMsMEJBQVksR0FBRyxDQUFFLENBQUE7MEdBRHBCLGFBQWE7OEZBQWIsYUFBYSxzYUFMZDtRQUNWLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUU7S0FDNUQsd0ZBUWlDLFFBQVEseUVBbkVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF3RFQ7MkZBTVcsYUFBYTtrQkFoRXpCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLHdDQUF3QztvQkFDbEQsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQXdEVDtvQkFDRCxTQUFTLEVBQUU7d0JBQ1YsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxlQUFlLEVBQUU7cUJBQzVEO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUMvQzt3R0FHcUMsWUFBWTtzQkFBaEQsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBR2lDLFVBQVU7c0JBQTdFLGVBQWU7dUJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRTtnQkFJekQsTUFBTTtzQkFBZCxLQUFLO2dCQUtHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBS0csc0JBQXNCO3NCQUE5QixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxPQUFPO3NCQUFmLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG5cdEFmdGVyQ29udGVudEluaXQsXHJcblx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcblx0Q2hhbmdlRGV0ZWN0b3JSZWYsXHJcblx0Q29tcG9uZW50LFxyXG5cdENvbnRlbnRDaGlsZHJlbixcclxuXHRmb3J3YXJkUmVmLFxyXG5cdEhvc3RCaW5kaW5nLFxyXG5cdElucHV0LFxyXG5cdE9uQ2hhbmdlcyxcclxuXHRRdWVyeUxpc3QsXHJcblx0U2ltcGxlQ2hhbmdlcyxcclxuXHRUZW1wbGF0ZVJlZlxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IENIRUNLQk9YX0dST1VQX0hPU1QgfSBmcm9tIFwiLi9jaGVja2JveC1ncm91cC1ob3N0XCI7XHJcbmltcG9ydCB7IENoZWNrYm94IH0gZnJvbSBcIi4vY2hlY2tib3guY29tcG9uZW50XCI7XHJcblxyXG4vKipcclxuICogR3JvdXBzIHJlbGF0ZWQgY2hlY2tib3hlcyB3aXRoIGEgc2hhcmVkIGxlZ2VuZCwgdmFsaWRhdGlvbiwgYW5kIG9wdGlvbmFsIGRlY29yYXRvclxyXG4gKiAoZS5nLiBBSSBsYWJlbCkuXHJcbiAqXHJcbiAqIGBgYGh0bWxcclxuICogPGNkcy1jaGVja2JveC1ncm91cCBsZWdlbmQ9XCJHcm91cCBsYWJlbFwiIFtkZWNvcmF0b3JdPVwiZGVjb3JhdG9yVHBsXCI+XHJcbiAqICAgPGNkcy1jaGVja2JveD5PcHRpb24gMTwvY2RzLWNoZWNrYm94PlxyXG4gKiA8L2Nkcy1jaGVja2JveC1ncm91cD5cclxuICogYGBgXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuXHRzZWxlY3RvcjogXCJjZHMtY2hlY2tib3gtZ3JvdXAsIGlibS1jaGVja2JveC1ncm91cFwiLFxyXG5cdHRlbXBsYXRlOiBgXHJcblx0XHQ8ZmllbGRzZXRcclxuXHRcdFx0Y2xhc3M9XCJjZHMtLWNoZWNrYm94LWdyb3VwXCJcclxuXHRcdFx0W25nQ2xhc3NdPVwie1xyXG5cdFx0XHRcdCdjZHMtLWNoZWNrYm94LWdyb3VwLS1ob3Jpem9udGFsJzogb3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyxcclxuXHRcdFx0XHQnY2RzLS1jaGVja2JveC1ncm91cC0tcmVhZG9ubHknOiByZWFkT25seSxcclxuXHRcdFx0XHQnY2RzLS1jaGVja2JveC1ncm91cC0taW52YWxpZCc6ICFyZWFkT25seSAmJiBpbnZhbGlkLFxyXG5cdFx0XHRcdCdjZHMtLWNoZWNrYm94LWdyb3VwLS13YXJuaW5nJzogIXJlYWRPbmx5ICYmICFpbnZhbGlkICYmIHdhcm4sXHJcblx0XHRcdFx0J2Nkcy0tY2hlY2tib3gtZ3JvdXAtLWRlY29yYXRvcic6ICEhZGVjb3JhdG9yXHJcblx0XHRcdH1cIlxyXG5cdFx0XHRbYXR0ci5kYXRhLWludmFsaWRdPVwiaW52YWxpZCA/IHRydWUgOiBudWxsXCJcclxuXHRcdFx0W2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImxlZ2VuZElkIHx8IGZpZWxkc2V0QXJpYUxhYmVsbGVkYnkgfHwgbnVsbFwiXHJcblx0XHRcdFthdHRyLmFyaWEtcmVhZG9ubHldPVwicmVhZE9ubHkgPyB0cnVlIDogbnVsbFwiXHJcblx0XHRcdFthdHRyLmFyaWEtZGVzY3JpYmVkYnldPVwiKGhlbHBlclRleHQgJiYgIWludmFsaWQgJiYgIXdhcm4pID8gaGVscGVyVGV4dElkIDogbnVsbFwiPlxyXG5cdFx0XHQ8bGVnZW5kICpuZ0lmPVwibGVnZW5kXCIgY2xhc3M9XCJjZHMtLWxhYmVsXCIgW2F0dHIuaWRdPVwibGVnZW5kSWQgfHwgbnVsbFwiPlxyXG5cdFx0XHRcdDxuZy10ZW1wbGF0ZSAqbmdJZj1cImlzVGVtcGxhdGUobGVnZW5kKTsgZWxzZSBsZWdlbmRMYWJlbFwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxlZ2VuZFwiPjwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PG5nLXRlbXBsYXRlICNsZWdlbmRMYWJlbD57e2xlZ2VuZH19PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZGVjb3JhdG9yXCI+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2RzLS1jaGVja2JveC1ncm91cC1pbm5lci0tZGVjb3JhdG9yXCI+XHJcblx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdUZW1wbGF0ZU91dGxldF09XCJkZWNvcmF0b3JcIj48L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdDwvbGVnZW5kPlxyXG5cdFx0XHQ8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJjZHMtLWNoZWNrYm94LWdyb3VwX192YWxpZGF0aW9uLW1zZ1wiPlxyXG5cdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhcmVhZE9ubHkgJiYgaW52YWxpZFwiPlxyXG5cdFx0XHRcdFx0PHN2Z1xyXG5cdFx0XHRcdFx0XHRjZHNJY29uPVwid2FybmluZy0tZmlsbGVkXCJcclxuXHRcdFx0XHRcdFx0c2l6ZT1cIjE2XCJcclxuXHRcdFx0XHRcdFx0Y2xhc3M9XCJjZHMtLWNoZWNrYm94X19pbnZhbGlkLWljb25cIj5cclxuXHRcdFx0XHRcdDwvc3ZnPlxyXG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImNkcy0tZm9ybS1yZXF1aXJlbWVudFwiPlxyXG5cdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGVtcGxhdGUoaW52YWxpZFRleHQpXCI+e3sgaW52YWxpZFRleHQgfX08L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICpuZ0lmPVwiaXNUZW1wbGF0ZShpbnZhbGlkVGV4dClcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJpbnZhbGlkVGV4dFwiPjwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIXJlYWRPbmx5ICYmICFpbnZhbGlkICYmIHdhcm5cIj5cclxuXHRcdFx0XHRcdDxzdmdcclxuXHRcdFx0XHRcdFx0Y2RzSWNvbj1cIndhcm5pbmctLWFsdC0tZmlsbGVkXCJcclxuXHRcdFx0XHRcdFx0c2l6ZT1cIjE2XCJcclxuXHRcdFx0XHRcdFx0Y2xhc3M9XCJjZHMtLWNoZWNrYm94X19pbnZhbGlkLWljb24gY2RzLS1jaGVja2JveF9faW52YWxpZC1pY29uLS13YXJuaW5nXCI+XHJcblx0XHRcdFx0XHQ8L3N2Zz5cclxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJjZHMtLWZvcm0tcmVxdWlyZW1lbnRcIj5cclxuXHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKHdhcm5UZXh0KVwiPnt7d2FyblRleHR9fTwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKHdhcm5UZXh0KVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIndhcm5UZXh0XCI+PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdFx0PGRpdlxyXG5cdFx0XHRcdCpuZ0lmPVwiaGVscGVyVGV4dCAmJiAhaW52YWxpZCAmJiAhd2FyblwiXHJcblx0XHRcdFx0Y2xhc3M9XCJjZHMtLWZvcm1fX2hlbHBlci10ZXh0XCJcclxuXHRcdFx0XHRbaWRdPVwiaGVscGVyVGV4dElkXCI+XHJcblx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RlbXBsYXRlKGhlbHBlclRleHQpXCI+e3toZWxwZXJUZXh0fX08L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgKm5nSWY9XCJpc1RlbXBsYXRlKGhlbHBlclRleHQpXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiaGVscGVyVGV4dFwiPjwvbmctdGVtcGxhdGU+XHJcblx0XHRcdDwvZGl2PlxyXG5cdFx0PC9maWVsZHNldD5cclxuXHRgLFxyXG5cdHByb3ZpZGVyczogW1xyXG5cdFx0eyBwcm92aWRlOiBDSEVDS0JPWF9HUk9VUF9IT1NULCB1c2VFeGlzdGluZzogQ2hlY2tib3hHcm91cCB9XHJcblx0XSxcclxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ2hlY2tib3hHcm91cCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCB7XHJcblx0cHJpdmF0ZSBzdGF0aWMgbmV4dEhlbHBlcklkID0gMDtcclxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWZvcm0taXRlbVwiKSBob3N0Rm9ybUl0ZW0gPSB0cnVlO1xyXG5cclxuXHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tZm9yd2FyZC1yZWZcclxuXHRAQ29udGVudENoaWxkcmVuKGZvcndhcmRSZWYoKCkgPT4gQ2hlY2tib3gpLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIGNoZWNrYm94ZXM6IFF1ZXJ5TGlzdDxDaGVja2JveD47XHJcblxyXG5cdHJlYWRvbmx5IGhlbHBlclRleHRJZCA9IGBjaGVja2JveC1ncm91cC1oZWxwZXItJHtDaGVja2JveEdyb3VwLm5leHRIZWxwZXJJZCsrfWA7XHJcblxyXG5cdEBJbnB1dCgpIGxlZ2VuZDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblx0LyoqXHJcblx0ICogT3B0aW9uYWwgaWQgZm9yIHRoZSBgPGxlZ2VuZD5gOyByZWZlcmVuY2VkIGJ5IGBmaWVsZHNldEFyaWFMYWJlbGxlZGJ5YCB3aGVuIHNldC5cclxuXHQgKi9cclxuXHRASW5wdXQoKSBsZWdlbmRJZDogc3RyaW5nO1xyXG5cclxuXHQvKipcclxuXHQgKiBPcHRpb25hbCBgYXJpYS1sYWJlbGxlZGJ5YCBmb3IgdGhlIGA8ZmllbGRzZXQ+YCB3aGVuIG5vdCB1c2luZyBgbGVnZW5kSWRgLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpIGZpZWxkc2V0QXJpYUxhYmVsbGVkYnk6IHN0cmluZztcclxuXHJcblx0QElucHV0KCkgb3JpZW50YXRpb246IFwiaG9yaXpvbnRhbFwiIHwgXCJ2ZXJ0aWNhbFwiID0gXCJ2ZXJ0aWNhbFwiO1xyXG5cclxuXHRASW5wdXQoKSBoZWxwZXJUZXh0OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHRASW5wdXQoKSBpbnZhbGlkID0gZmFsc2U7XHJcblxyXG5cdEBJbnB1dCgpIGludmFsaWRUZXh0OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHRASW5wdXQoKSB3YXJuID0gZmFsc2U7XHJcblxyXG5cdEBJbnB1dCgpIHdhcm5UZXh0OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHRASW5wdXQoKSByZWFkT25seSA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBPcHRpb25hbCBkZWNvcmF0b3IgKGUuZy4gQUkgbGFiZWwpIHJlbmRlcmVkIGluIHRoZSBsZWdlbmQuXHJcblx0ICovXHJcblx0QElucHV0KCkgZGVjb3JhdG9yOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge31cclxuXHJcblx0bmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG5cdFx0aWYgKGNoYW5nZXNbXCJyZWFkT25seVwiXSB8fCBjaGFuZ2VzW1wiaW52YWxpZFwiXSB8fCBjaGFuZ2VzW1wid2FyblwiXSkge1xyXG5cdFx0XHR0aGlzLm5vdGlmeUNoZWNrYm94ZXNIb3N0U3RhdGVDaGFuZ2VkKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcblx0XHR0aGlzLmNoZWNrYm94ZXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5ub3RpZnlDaGVja2JveGVzSG9zdFN0YXRlQ2hhbmdlZCgpKTtcclxuXHR9XHJcblxyXG5cdGlzVGVtcGxhdGUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgVGVtcGxhdGVSZWY7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIG5vdGlmeUNoZWNrYm94ZXNIb3N0U3RhdGVDaGFuZ2VkKCkge1xyXG5cdFx0UHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XHJcblx0XHRcdHRoaXMuY2hlY2tib3hlcz8uZm9yRWFjaCgoY2IpID0+IGNiLm1hcmtGb3JDaGVja0Zyb21Hcm91cCgpKTtcclxuXHRcdFx0dGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuXHRcdH0pO1xyXG5cdH1cclxufVxyXG4iXX0=