UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

121 lines 19.5 kB
/** * © 2025 Visa * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **/ import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { CommonModule } from '@angular/common'; import { Component, ContentChild, ContentChildren, HostBinding, Input, QueryList } from '@angular/core'; import { ButtonDirective } from '../button/button.directive'; import { CheckboxDirective } from '../checkbox/checkbox.directive'; import { IconToggleComponent } from '../icon-toggle/icon-toggle.component'; import { InputMessageDirective } from '../input-message/input-message.directive'; import { InputDirective } from '../input/input.directive'; import { LabelDirective } from '../label/label.directive'; import { RadioDirective } from '../radio/radio.directive'; import { SelectDirective } from '../select/select.directive'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class InputContainerComponent { get hostClasses() { this.class = ['v-input-container', this.input || this.select ? 'v-surface' : ''].join(' '); return this.class; } /** * Removes the default toggle icon when true, allowing you to provide your own. <br> * After the closing <code>select</code> tag, provide your custom icon inside a <code>&lt;div class=&#8220;v-input-control&#8221;&gt;</code>. * @default false */ get useCustomIcon() { return this._useCustomIcon; } set useCustomIcon(value) { this._useCustomIcon = coerceBooleanProperty(value); } constructor() { /** * Provides custom class&#40;es&#41; for custom styling. * @default .v-input-container * @default .v-surface if contains input or select directive. */ this.class = ''; } ngAfterContentInit() { if (this.buttons.length > 0 && (this.input || this.select)) { const directive = this.input ? this.input : this.select; // disabled child buttons if input or select is disabled or readonly // must call out input readonly specifically since this is not a shared prop with select if (directive.disabled || (this.input && this.input.readonly)) { this.setButtonDisabledState(true); } // disabled or enable buttons as appropriate depending on input/select readonly and disabled state directive.communicateState.subscribe((state) => { if (state.disabled || state.readonly) { this.setButtonDisabledState(true); } else { this.setButtonDisabledState(false); } }); } if (this.label) { if (this.checkbox?.id) { this.label.for = this.checkbox.id; } else if (this.radio?.id) { this.label.for = this.radio.id; } } } setButtonDisabledState(isDisabled) { this.buttons.forEach((button) => { button.disabled = isDisabled; }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InputContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: InputContainerComponent, isStandalone: true, selector: "[v-input-container]", inputs: { class: "class", useCustomIcon: "useCustomIcon" }, host: { properties: { "class": "this.hostClasses" } }, queries: [{ propertyName: "select", first: true, predicate: SelectDirective, descendants: true }, { propertyName: "input", first: true, predicate: InputDirective, descendants: true }, { propertyName: "message", first: true, predicate: InputMessageDirective, descendants: true }, { propertyName: "checkbox", first: true, predicate: CheckboxDirective, descendants: true }, { propertyName: "radio", first: true, predicate: RadioDirective, descendants: true }, { propertyName: "label", first: true, predicate: LabelDirective, descendants: true }, { propertyName: "buttons", predicate: ButtonDirective }], ngImport: i0, template: "<!--\n * \u00A9 2025 Visa\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n -->\n<ng-content></ng-content>\n<ng-container *ngIf=\"select && !useCustomIcon\">\n <div class=\"v-input-control\">\n <ng-content select=\"v-icon-visa-toggle\"></ng-content>\n <ng-content select=\"[v-icon-visa-chevron-down-tiny]\"></ng-content>\n <ng-content select=\"[v-icon-visa-chevron-up-tiny]\"></ng-content>\n <ng-content select=\"[v-icon][icon='chevron-down']\"></ng-content>\n <ng-content select=\"[v-icon][icon='chevron-up']\"></ng-content>\n </div>\n</ng-container>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InputContainerComponent, decorators: [{ type: Component, args: [{ standalone: true, imports: [CommonModule, IconToggleComponent], selector: '[v-input-container]', template: "<!--\n * \u00A9 2025 Visa\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n -->\n<ng-content></ng-content>\n<ng-container *ngIf=\"select && !useCustomIcon\">\n <div class=\"v-input-control\">\n <ng-content select=\"v-icon-visa-toggle\"></ng-content>\n <ng-content select=\"[v-icon-visa-chevron-down-tiny]\"></ng-content>\n <ng-content select=\"[v-icon-visa-chevron-up-tiny]\"></ng-content>\n <ng-content select=\"[v-icon][icon='chevron-down']\"></ng-content>\n <ng-content select=\"[v-icon][icon='chevron-up']\"></ng-content>\n </div>\n</ng-container>\n" }] }], ctorParameters: () => [], propDecorators: { select: [{ type: ContentChild, args: [SelectDirective] }], buttons: [{ type: ContentChildren, args: [ButtonDirective] }], input: [{ type: ContentChild, args: [InputDirective] }], message: [{ type: ContentChild, args: [InputMessageDirective] }], checkbox: [{ type: ContentChild, args: [CheckboxDirective] }], radio: [{ type: ContentChild, args: [RadioDirective] }], label: [{ type: ContentChild, args: [LabelDirective] }], class: [{ type: Input }], hostClasses: [{ type: HostBinding, args: ['class'] }], useCustomIcon: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtY29udGFpbmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9pbnB1dC1jb250YWluZXIvaW5wdXQtY29udGFpbmVyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9pbnB1dC1jb250YWluZXIvaW5wdXQtY29udGFpbmVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7SUFlSTtBQUNKLE9BQU8sRUFBZ0IscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUVMLFNBQVMsRUFDVCxZQUFZLEVBQ1osZUFBZSxFQUNmLFdBQVcsRUFDWCxLQUFLLEVBQ0wsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUMzRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNqRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztBQVE3RCxNQUFNLE9BQU8sdUJBQXVCO0lBZWxDLElBQ0ksV0FBVztRQUNiLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FB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QUFLO3NCQUFsQyxZQUFZO3VCQUFDLGNBQWM7Z0JBQ1MsT0FBTztzQkFBM0MsWUFBWTt1QkFBQyxxQkFBcUI7Z0JBQ0YsUUFBUTtzQkFBeEMsWUFBWTt1QkFBQyxpQkFBaUI7Z0JBQ0QsS0FBSztzQkFBbEMsWUFBWTt1QkFBQyxjQUFjO2dCQUNFLEtBQUs7c0JBQWxDLFlBQVk7dUJBQUMsY0FBYztnQkFPbkIsS0FBSztzQkFBYixLQUFLO2dCQUVGLFdBQVc7c0JBRGQsV0FBVzt1QkFBQyxPQUFPO2dCQVloQixhQUFhO3NCQURoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgICAgICAgICAgICAgwqkgMjAyNSBWaXNhXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiovXG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBRdWVyeUxpc3Rcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBDaGVja2JveERpcmVjdGl2ZSB9IGZyb20gJy4uL2NoZWNrYm94L2NoZWNrYm94LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBJY29uVG9nZ2xlQ29tcG9uZW50IH0gZnJvbSAnLi4vaWNvbi10b2dnbGUvaWNvbi10b2dnbGUuY29tcG9uZW50JztcbmltcG9ydCB7IElucHV0TWVzc2FnZURpcmVjdGl2ZSB9IGZyb20gJy4uL2lucHV0LW1lc3NhZ2UvaW5wdXQtbWVzc2FnZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSW5wdXREaXJlY3RpdmUgfSBmcm9tICcuLi9pbnB1dC9pbnB1dC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTGFiZWxEaXJlY3RpdmUgfSBmcm9tICcuLi9sYWJlbC9sYWJlbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgUmFkaW9EaXJlY3RpdmUgfSBmcm9tICcuLi9yYWRpby9yYWRpby5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU2VsZWN0RGlyZWN0aXZlIH0gZnJvbSAnLi4vc2VsZWN0L3NlbGVjdC5kaXJlY3RpdmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSWNvblRvZ2dsZUNvbXBvbmVudF0sXG4gIHNlbGVjdG9yOiAnW3YtaW5wdXQtY29udGFpbmVyXScsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIElucHV0Q29udGFpbmVyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XG4gIEBDb250ZW50Q2hpbGQoU2VsZWN0RGlyZWN0aXZlKSBzZWxlY3Q6IFNlbGVjdERpcmVjdGl2ZTtcbiAgQENvbnRlbnRDaGlsZHJlbihCdXR0b25EaXJlY3RpdmUpIGJ1dHRvbnM6IFF1ZXJ5TGlzdDxCdXR0b25EaXJlY3RpdmU+O1xuICBAQ29udGVudENoaWxkKElucHV0RGlyZWN0aXZlKSBpbnB1dDogSW5wdXREaXJlY3RpdmU7XG4gIEBDb250ZW50Q2hpbGQoSW5wdXRNZXNzYWdlRGlyZWN0aXZlKSBtZXNzYWdlOiBJbnB1dE1lc3NhZ2VEaXJlY3RpdmU7XG4gIEBDb250ZW50Q2hpbGQoQ2hlY2tib3hEaXJlY3RpdmUpIGNoZWNrYm94OiBDaGVja2JveERpcmVjdGl2ZTtcbiAgQENvbnRlbnRDaGlsZChSYWRpb0RpcmVjdGl2ZSkgcmFkaW86IFJhZGlvRGlyZWN0aXZlO1xuICBAQ29udGVudENoaWxkKExhYmVsRGlyZWN0aXZlKSBsYWJlbDogTGFiZWxEaXJlY3RpdmU7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIGN1c3RvbSBjbGFzcyYjNDA7ZXMmIzQxOyBmb3IgY3VzdG9tIHN0eWxpbmcuXG4gICAqIEBkZWZhdWx0IC52LWlucHV0LWNvbnRhaW5lclxuICAgKiBAZGVmYXVsdCAudi1zdXJmYWNlIGlmIGNvbnRhaW5zIGlucHV0IG9yIHNlbGVjdCBkaXJlY3RpdmUuXG4gICAqL1xuICBASW5wdXQoKSBjbGFzczogc3RyaW5nID0gJyc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzZXMoKTogc3RyaW5nIHtcbiAgICB0aGlzLmNsYXNzID0gWyd2LWlucHV0LWNvbnRhaW5lcicsIHRoaXMuaW5wdXQgfHwgdGhpcy5zZWxlY3QgPyAndi1zdXJmYWNlJyA6ICcnXS5qb2luKCcgJyk7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgZGVmYXVsdCB0b2dnbGUgaWNvbiB3aGVuIHRydWUsIGFsbG93aW5nIHlvdSB0byBwcm92aWRlIHlvdXIgb3duLiA8YnI+XG4gICAqIEFmdGVyIHRoZSBjbG9zaW5nIDxjb2RlPnNlbGVjdDwvY29kZT4gdGFnLCBwcm92aWRlIHlvdXIgY3VzdG9tIGljb24gaW5zaWRlIGEgPGNvZGU+Jmx0O2RpdiBjbGFzcz0mIzgyMjA7di1pbnB1dC1jb250cm9sJiM4MjIxOyZndDs8L2NvZGU+LlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHVzZUN1c3RvbUljb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3VzZUN1c3RvbUljb247XG4gIH1cbiAgc2V0IHVzZUN1c3RvbUljb24odmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3VzZUN1c3RvbUljb24gPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF91c2VDdXN0b21JY29uOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYnV0dG9ucy5sZW5ndGggPiAwICYmICh0aGlzLmlucHV0IHx8IHRoaXMuc2VsZWN0KSkge1xuICAgICAgY29uc3QgZGlyZWN0aXZlID0gdGhpcy5pbnB1dCA/IHRoaXMuaW5wdXQgOiB0aGlzLnNlbGVjdDtcblxuICAgICAgLy8gZGlzYWJsZWQgY2hpbGQgYnV0dG9ucyBpZiBpbnB1dCBvciBzZWxlY3QgaXMgZGlzYWJsZWQgb3IgcmVhZG9ubHlcbiAgICAgIC8vIG11c3QgY2FsbCBvdXQgaW5wdXQgcmVhZG9ubHkgc3BlY2lmaWNhbGx5IHNpbmNlIHRoaXMgaXMgbm90IGEgc2hhcmVkIHByb3Agd2l0aCBzZWxlY3RcbiAgICAgIGlmIChkaXJlY3RpdmUuZGlzYWJsZWQgfHwgKHRoaXMuaW5wdXQgJiYgdGhpcy5pbnB1dC5yZWFkb25seSkpIHtcbiAgICAgICAgdGhpcy5zZXRCdXR0b25EaXNhYmxlZFN0YXRlKHRydWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBkaXNhYmxlZCBvciBlbmFibGUgYnV0dG9ucyBhcyBhcHByb3ByaWF0ZSBkZXBlbmRpbmcgb24gaW5wdXQvc2VsZWN0IHJlYWRvbmx5IGFuZCBkaXNhYmxlZCBzdGF0ZVxuICAgICAgZGlyZWN0aXZlLmNvbW11bmljYXRlU3RhdGUuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuICAgICAgICBpZiAoc3RhdGUuZGlzYWJsZWQgfHwgc3RhdGUucmVhZG9ubHkpIHtcbiAgICAgICAgICB0aGlzLnNldEJ1dHRvbkRpc2FibGVkU3RhdGUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZXRCdXR0b25EaXNhYmxlZFN0YXRlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmxhYmVsKSB7XG4gICAgICBpZiAodGhpcy5jaGVja2JveD8uaWQpIHtcbiAgICAgICAgdGhpcy5sYWJlbC5mb3IgPSB0aGlzLmNoZWNrYm94LmlkO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnJhZGlvPy5pZCkge1xuICAgICAgICB0aGlzLmxhYmVsLmZvciA9IHRoaXMucmFkaW8uaWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0QnV0dG9uRGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKSB7XG4gICAgdGhpcy5idXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgYnV0dG9uLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9KTtcbiAgfVxufVxuIiwiPCEtLVxuICogICAgICAgICAgICAgIMKpIDIwMjUgVmlzYVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuIC0tPlxuPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdCAmJiAhdXNlQ3VzdG9tSWNvblwiPlxuICA8ZGl2IGNsYXNzPVwidi1pbnB1dC1jb250cm9sXCI+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwidi1pY29uLXZpc2EtdG9nZ2xlXCI+PC9uZy1jb250ZW50PlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIlt2LWljb24tdmlzYS1jaGV2cm9uLWRvd24tdGlueV1cIj48L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3YtaWNvbi12aXNhLWNoZXZyb24tdXAtdGlueV1cIj48L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3YtaWNvbl1baWNvbj0nY2hldnJvbi1kb3duJ11cIj48L25nLWNvbnRlbnQ+XG4gICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3YtaWNvbl1baWNvbj0nY2hldnJvbi11cCddXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuIl19