UNPKG

juvo-rafa-library

Version:

A comprehensive Angular component library featuring real-world components and validators extracted from the Juvo Rafa backoffice application. Now with improved select components and bug fixes.

139 lines 20 kB
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { CommonModule } from '@angular/common'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; /** * Action Button Group Component * * @description * A reusable button group component commonly used in forms and data entry screens. * Provides standard actions like Save, Create, Create Copy, Save Copy, and Cancel. * Originally designed for backoffice applications where consistent form actions are needed. * * @example * ```html * <!-- Basic usage --> * <juvo-button-action * [buttonSave]="true" * [buttonCreate]="true" * (actionSaveTriggered)="onSave()" * (actionCreateTriggered)="onCreate()" * (actionCancelTriggered)="onCancel()"> * </juvo-button-action> * * <!-- Advanced usage with loading state --> * <juvo-button-action * [loading$]="loadingObservable$" * [buttonSave]="true" * [buttonCreateCopy]="true" * [buttonType]="true" * [disable]="!form.valid" * saveText="Update Record" * (actionSaveTriggered)="onUpdate()" * (actionCreateCopyTriggered)="onDuplicate()"> * </juvo-button-action> * ``` * * @selector juvo-button-action * @since 2.0.0 * @author Juvo Rafa Team */ export class JuvoButtonActionComponent { constructor() { /** Configuration object for button visibility and behavior */ this.config = {}; /** Disable all action buttons */ this.disable = false; /** Custom text for Save button @default "Save" */ this.saveText = "Save"; /** Button style: true for solid, false for outlined @default false */ this.buttonType = false; /** Emitted when Save button is clicked */ this.actionSaveTriggered = new EventEmitter(); /** Emitted when Create button is clicked */ this.actionCreateTriggered = new EventEmitter(); /** Emitted when Create and Copy button is clicked */ this.actionCreateCopyTriggered = new EventEmitter(); /** Emitted when Save and Copy button is clicked */ this.actionSaveCopyTriggered = new EventEmitter(); /** Emitted when Cancel button is clicked */ this.actionCancelTriggered = new EventEmitter(); } /** * Gets the current loading state * @returns true if loading, false otherwise */ get isLoading() { return this.loading$ ? false : false; // Simplified for now } /** * Handles Save button click * @emits actionSaveTriggered */ onSave() { this.actionSaveTriggered.emit(); } /** * Handles Create button click * @emits actionCreateTriggered */ onCreate() { this.actionCreateTriggered.emit(); } /** * Handles Create and Copy button click * @emits actionCreateCopyTriggered */ onCreateCopy() { this.actionCreateCopyTriggered.emit(); } /** * Handles Save and Copy button click * @emits actionSaveCopyTriggered */ onSaveCopy() { this.actionSaveCopyTriggered.emit(); } /** * Handles Cancel button click * @emits actionCancelTriggered */ onCancel() { this.actionCancelTriggered.emit(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: JuvoButtonActionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: JuvoButtonActionComponent, isStandalone: true, selector: "juvo-button-action", inputs: { loading$: "loading$", config: "config", buttonCreate: "buttonCreate", buttonCreateCopy: "buttonCreateCopy", buttonSaveCopy: "buttonSaveCopy", buttonSave: "buttonSave", disable: "disable", saveText: "saveText", buttonType: "buttonType" }, outputs: { actionSaveTriggered: "actionSaveTriggered", actionCreateTriggered: "actionCreateTriggered", actionCreateCopyTriggered: "actionCreateCopyTriggered", actionSaveCopyTriggered: "actionSaveCopyTriggered", actionCancelTriggered: "actionCancelTriggered" }, ngImport: i0, template: "<div class=\"juvo-button-action\">\n <button\n type=\"button\"\n class=\"btn btn-outlined\"\n (click)=\"onCancel()\">\n Cancel\n </button>\n\n <button\n *ngIf=\"buttonCreateCopy\"\n type=\"button\"\n class=\"btn btn-outlined\"\n [disabled]=\"isLoading\"\n (click)=\"onCreateCopy()\">\n <span *ngIf=\"isLoading\" class=\"spinner\"></span>\n Create and copy\n </button>\n\n <button\n *ngIf=\"buttonSaveCopy\"\n type=\"button\"\n class=\"btn btn-outlined\"\n [disabled]=\"isLoading\"\n (click)=\"onSaveCopy()\">\n <span *ngIf=\"isLoading\" class=\"spinner\"></span>\n Save and copy\n </button>\n\n <button\n *ngIf=\"buttonCreate\"\n type=\"button\"\n class=\"btn btn-outlined\"\n [disabled]=\"disable || isLoading\"\n (click)=\"onCreate()\">\n <span *ngIf=\"isLoading\" class=\"spinner\"></span>\n Create\n </button>\n \n <button\n *ngIf=\"buttonSave\"\n type=\"button\"\n [disabled]=\"disable || isLoading\"\n [class]=\"buttonType ? 'btn btn-primary' : 'btn btn-outlined'\"\n (click)=\"onSave()\">\n <span *ngIf=\"isLoading\" class=\"spinner\"></span>\n {{ saveText }}\n </button>\n</div> ", styles: [".juvo-button-action{display:flex;justify-content:flex-end;flex-direction:column;gap:.5rem}@media (min-width: 768px){.juvo-button-action{flex-direction:row}}.btn{padding:.75rem 1.5rem;border-radius:.375rem;font-weight:500;cursor:pointer;transition:all .15s;display:inline-flex;align-items:center;justify-content:center;gap:.5rem;width:100%;border:1px solid}@media (min-width: 768px){.btn{width:auto}}.btn-primary{background:#3b82f6;color:#fff;border-color:#3b82f6}.btn-primary:hover:not(:disabled){background:#2563eb;border-color:#2563eb}.btn-outlined{background:transparent;color:#6b7280;border-color:#d1d5db}.btn-outlined:hover:not(:disabled){background:#f9fafb;border-color:#9ca3af}.btn:disabled{opacity:.5;cursor:not-allowed}.spinner{width:1rem;height:1rem;border:2px solid transparent;border-top:2px solid currentColor;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\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: JuvoButtonActionComponent, decorators: [{ type: Component, args: [{ selector: 'juvo-button-action', standalone: true, imports: [CommonModule], template: "<div class=\"juvo-button-action\">\n <button\n type=\"button\"\n class=\"btn btn-outlined\"\n (click)=\"onCancel()\">\n Cancel\n </button>\n\n <button\n *ngIf=\"buttonCreateCopy\"\n type=\"button\"\n class=\"btn btn-outlined\"\n [disabled]=\"isLoading\"\n (click)=\"onCreateCopy()\">\n <span *ngIf=\"isLoading\" class=\"spinner\"></span>\n Create and copy\n </button>\n\n <button\n *ngIf=\"buttonSaveCopy\"\n type=\"button\"\n class=\"btn btn-outlined\"\n [disabled]=\"isLoading\"\n (click)=\"onSaveCopy()\">\n <span *ngIf=\"isLoading\" class=\"spinner\"></span>\n Save and copy\n </button>\n\n <button\n *ngIf=\"buttonCreate\"\n type=\"button\"\n class=\"btn btn-outlined\"\n [disabled]=\"disable || isLoading\"\n (click)=\"onCreate()\">\n <span *ngIf=\"isLoading\" class=\"spinner\"></span>\n Create\n </button>\n \n <button\n *ngIf=\"buttonSave\"\n type=\"button\"\n [disabled]=\"disable || isLoading\"\n [class]=\"buttonType ? 'btn btn-primary' : 'btn btn-outlined'\"\n (click)=\"onSave()\">\n <span *ngIf=\"isLoading\" class=\"spinner\"></span>\n {{ saveText }}\n </button>\n</div> ", styles: [".juvo-button-action{display:flex;justify-content:flex-end;flex-direction:column;gap:.5rem}@media (min-width: 768px){.juvo-button-action{flex-direction:row}}.btn{padding:.75rem 1.5rem;border-radius:.375rem;font-weight:500;cursor:pointer;transition:all .15s;display:inline-flex;align-items:center;justify-content:center;gap:.5rem;width:100%;border:1px solid}@media (min-width: 768px){.btn{width:auto}}.btn-primary{background:#3b82f6;color:#fff;border-color:#3b82f6}.btn-primary:hover:not(:disabled){background:#2563eb;border-color:#2563eb}.btn-outlined{background:transparent;color:#6b7280;border-color:#d1d5db}.btn-outlined:hover:not(:disabled){background:#f9fafb;border-color:#9ca3af}.btn:disabled{opacity:.5;cursor:not-allowed}.spinner{width:1rem;height:1rem;border:2px solid transparent;border-top:2px solid currentColor;border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}\n"] }] }], propDecorators: { loading$: [{ type: Input }], config: [{ type: Input }], buttonCreate: [{ type: Input }], buttonCreateCopy: [{ type: Input }], buttonSaveCopy: [{ type: Input }], buttonSave: [{ type: Input }], disable: [{ type: Input }], saveText: [{ type: Input }], buttonType: [{ type: Input }], actionSaveTriggered: [{ type: Output }], actionCreateTriggered: [{ type: Output }], actionCreateCopyTriggered: [{ type: Output }], actionSaveCopyTriggered: [{ type: Output }], actionCancelTriggered: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianV2by1idXR0b24tYWN0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbXBvbmVudHMvc3JjL2xpYi9qdXZvLWJ1dHRvbi1hY3Rpb24vanV2by1idXR0b24tYWN0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWNvbXBvbmVudHMvc3JjL2xpYi9qdXZvLWJ1dHRvbi1hY3Rpb24vanV2by1idXR0b24tYWN0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUEwQi9DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1DRztBQVFILE1BQU0sT0FBTyx5QkFBeUI7SUFQdEM7UUFXRSw4REFBOEQ7UUFDckQsV0FBTSxHQUF1QixFQUFFLENBQUM7UUFjekMsaUNBQWlDO1FBQ3hCLFlBQU8sR0FBWSxLQUFLLENBQUM7UUFFbEMsa0RBQWtEO1FBQ3pDLGFBQVEsR0FBVyxNQUFNLENBQUM7UUFFbkMsc0VBQXNFO1FBQzdELGVBQVUsR0FBWSxLQUFLLENBQUM7UUFFckMsMENBQTBDO1FBQ2hDLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFekQsNENBQTRDO1FBQ2xDLDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFM0QscURBQXFEO1FBQzNDLDhCQUF5QixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFL0QsbURBQW1EO1FBQ3pDLDRCQUF1QixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFN0QsNENBQTRDO1FBQ2xDLDBCQUFxQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7S0FpRDVEO0lBL0NDOzs7T0FHRztJQUNILElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxxQkFBcUI7SUFDN0QsQ0FBQztJQUVEOzs7T0FHRztJQUNILE1BQU07UUFDSixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVE7UUFDTixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFlBQVk7UUFDVixJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFVBQVU7UUFDUixJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7T0FHRztJQUNILFFBQVE7UUFDTixJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEMsQ0FBQzsrR0F6RlUseUJBQXlCO21HQUF6Qix5QkFBeUIsMmtCQ3RFdEMsNHFDQStDTyxtOUJEbUJLLFlBQVk7OzRGQUlYLHlCQUF5QjtrQkFQckMsU0FBUzsrQkFDRSxvQkFBb0IsY0FDbEIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDOzhCQU1kLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csTUFBTTtzQkFBZCxLQUFLO2dCQUdHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBR0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0csVUFBVTtzQkFBbEIsS0FBSztnQkFHRyxPQUFPO3NCQUFmLEtBQUs7Z0JBR0csUUFBUTtzQkFBaEIsS0FBSztnQkFHRyxVQUFVO3NCQUFsQixLQUFLO2dCQUdJLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFHRyxxQkFBcUI7c0JBQTlCLE1BQU07Z0JBR0cseUJBQXlCO3NCQUFsQyxNQUFNO2dCQUdHLHVCQUF1QjtzQkFBaEMsTUFBTTtnQkFHRyxxQkFBcUI7c0JBQTlCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGludGVyZmFjZSBmb3IgSnV2b0J1dHRvbkFjdGlvbkNvbXBvbmVudFxuICogXG4gKiBAaW50ZXJmYWNlIEJ1dHRvbkFjdGlvbkNvbmZpZ1xuICogQHNpbmNlIDIuMC4wXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnV0dG9uQWN0aW9uQ29uZmlnIHtcbiAgLyoqIFNob3cgQ3JlYXRlIGJ1dHRvbiAqL1xuICBidXR0b25DcmVhdGU/OiBib29sZWFuO1xuICAvKiogU2hvdyBDcmVhdGUgYW5kIENvcHkgYnV0dG9uICovXG4gIGJ1dHRvbkNyZWF0ZUNvcHk/OiBib29sZWFuO1xuICAvKiogU2hvdyBTYXZlIGFuZCBDb3B5IGJ1dHRvbiAqL1xuICBidXR0b25TYXZlQ29weT86IGJvb2xlYW47XG4gIC8qKiBTaG93IFNhdmUgYnV0dG9uICovXG4gIGJ1dHRvblNhdmU/OiBib29sZWFuO1xuICAvKiogRGlzYWJsZSBhbGwgYWN0aW9uIGJ1dHRvbnMgKi9cbiAgZGlzYWJsZT86IGJvb2xlYW47XG4gIC8qKiBDdXN0b20gdGV4dCBmb3IgU2F2ZSBidXR0b24gKi9cbiAgc2F2ZVRleHQ/OiBzdHJpbmc7XG4gIC8qKiBCdXR0b24gc3R5bGU6IHRydWUgZm9yIHNvbGlkLCBmYWxzZSBmb3Igb3V0bGluZWQgKi9cbiAgYnV0dG9uVHlwZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWN0aW9uIEJ1dHRvbiBHcm91cCBDb21wb25lbnRcbiAqIFxuICogQGRlc2NyaXB0aW9uXG4gKiBBIHJldXNhYmxlIGJ1dHRvbiBncm91cCBjb21wb25lbnQgY29tbW9ubHkgdXNlZCBpbiBmb3JtcyBhbmQgZGF0YSBlbnRyeSBzY3JlZW5zLlxuICogUHJvdmlkZXMgc3RhbmRhcmQgYWN0aW9ucyBsaWtlIFNhdmUsIENyZWF0ZSwgQ3JlYXRlIENvcHksIFNhdmUgQ29weSwgYW5kIENhbmNlbC5cbiAqIE9yaWdpbmFsbHkgZGVzaWduZWQgZm9yIGJhY2tvZmZpY2UgYXBwbGljYXRpb25zIHdoZXJlIGNvbnNpc3RlbnQgZm9ybSBhY3Rpb25zIGFyZSBuZWVkZWQuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBgYGBodG1sXG4gKiA8IS0tIEJhc2ljIHVzYWdlIC0tPlxuICogPGp1dm8tYnV0dG9uLWFjdGlvblxuICogICBbYnV0dG9uU2F2ZV09XCJ0cnVlXCJcbiAqICAgW2J1dHRvbkNyZWF0ZV09XCJ0cnVlXCJcbiAqICAgKGFjdGlvblNhdmVUcmlnZ2VyZWQpPVwib25TYXZlKClcIlxuICogICAoYWN0aW9uQ3JlYXRlVHJpZ2dlcmVkKT1cIm9uQ3JlYXRlKClcIlxuICogICAoYWN0aW9uQ2FuY2VsVHJpZ2dlcmVkKT1cIm9uQ2FuY2VsKClcIj5cbiAqIDwvanV2by1idXR0b24tYWN0aW9uPlxuICogXG4gKiA8IS0tIEFkdmFuY2VkIHVzYWdlIHdpdGggbG9hZGluZyBzdGF0ZSAtLT5cbiAqIDxqdXZvLWJ1dHRvbi1hY3Rpb25cbiAqICAgW2xvYWRpbmckXT1cImxvYWRpbmdPYnNlcnZhYmxlJFwiXG4gKiAgIFtidXR0b25TYXZlXT1cInRydWVcIlxuICogICBbYnV0dG9uQ3JlYXRlQ29weV09XCJ0cnVlXCJcbiAqICAgW2J1dHRvblR5cGVdPVwidHJ1ZVwiXG4gKiAgIFtkaXNhYmxlXT1cIiFmb3JtLnZhbGlkXCJcbiAqICAgc2F2ZVRleHQ9XCJVcGRhdGUgUmVjb3JkXCJcbiAqICAgKGFjdGlvblNhdmVUcmlnZ2VyZWQpPVwib25VcGRhdGUoKVwiXG4gKiAgIChhY3Rpb25DcmVhdGVDb3B5VHJpZ2dlcmVkKT1cIm9uRHVwbGljYXRlKClcIj5cbiAqIDwvanV2by1idXR0b24tYWN0aW9uPlxuICogYGBgXG4gKiBcbiAqIEBzZWxlY3RvciBqdXZvLWJ1dHRvbi1hY3Rpb25cbiAqIEBzaW5jZSAyLjAuMFxuICogQGF1dGhvciBKdXZvIFJhZmEgVGVhbVxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdqdXZvLWJ1dHRvbi1hY3Rpb24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2p1dm8tYnV0dG9uLWFjdGlvbi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9qdXZvLWJ1dHRvbi1hY3Rpb24uY29tcG9uZW50LmNzcydcbn0pXG5leHBvcnQgY2xhc3MgSnV2b0J1dHRvbkFjdGlvbkNvbXBvbmVudCB7XG4gIC8qKiBPYnNlcnZhYmxlIGZvciBsb2FkaW5nIHN0YXRlIG9mIGJ1dHRvbnMgKi9cbiAgQElucHV0KCkgbG9hZGluZyQ/OiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBcbiAgLyoqIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBidXR0b24gdmlzaWJpbGl0eSBhbmQgYmVoYXZpb3IgKi9cbiAgQElucHV0KCkgY29uZmlnOiBCdXR0b25BY3Rpb25Db25maWcgPSB7fTtcbiAgXG4gIC8qKiBTaG93IENyZWF0ZSBidXR0b24gKi9cbiAgQElucHV0KCkgYnV0dG9uQ3JlYXRlPzogYm9vbGVhbjtcbiAgXG4gIC8qKiBTaG93IENyZWF0ZSBhbmQgQ29weSBidXR0b24gKi9cbiAgQElucHV0KCkgYnV0dG9uQ3JlYXRlQ29weT86IGJvb2xlYW47XG4gIFxuICAvKiogU2hvdyBTYXZlIGFuZCBDb3B5IGJ1dHRvbiAqL1xuICBASW5wdXQoKSBidXR0b25TYXZlQ29weT86IGJvb2xlYW47XG4gIFxuICAvKiogU2hvdyBTYXZlIGJ1dHRvbiAqL1xuICBASW5wdXQoKSBidXR0b25TYXZlPzogYm9vbGVhbjtcbiAgXG4gIC8qKiBEaXNhYmxlIGFsbCBhY3Rpb24gYnV0dG9ucyAqL1xuICBASW5wdXQoKSBkaXNhYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIFxuICAvKiogQ3VzdG9tIHRleHQgZm9yIFNhdmUgYnV0dG9uIEBkZWZhdWx0IFwiU2F2ZVwiICovXG4gIEBJbnB1dCgpIHNhdmVUZXh0OiBzdHJpbmcgPSBcIlNhdmVcIjtcbiAgXG4gIC8qKiBCdXR0b24gc3R5bGU6IHRydWUgZm9yIHNvbGlkLCBmYWxzZSBmb3Igb3V0bGluZWQgQGRlZmF1bHQgZmFsc2UgKi9cbiAgQElucHV0KCkgYnV0dG9uVHlwZTogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLyoqIEVtaXR0ZWQgd2hlbiBTYXZlIGJ1dHRvbiBpcyBjbGlja2VkICovXG4gIEBPdXRwdXQoKSBhY3Rpb25TYXZlVHJpZ2dlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBcbiAgLyoqIEVtaXR0ZWQgd2hlbiBDcmVhdGUgYnV0dG9uIGlzIGNsaWNrZWQgKi9cbiAgQE91dHB1dCgpIGFjdGlvbkNyZWF0ZVRyaWdnZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIC8qKiBFbWl0dGVkIHdoZW4gQ3JlYXRlIGFuZCBDb3B5IGJ1dHRvbiBpcyBjbGlja2VkICovXG4gIEBPdXRwdXQoKSBhY3Rpb25DcmVhdGVDb3B5VHJpZ2dlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBcbiAgLyoqIEVtaXR0ZWQgd2hlbiBTYXZlIGFuZCBDb3B5IGJ1dHRvbiBpcyBjbGlja2VkICovXG4gIEBPdXRwdXQoKSBhY3Rpb25TYXZlQ29weVRyaWdnZXJlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgXG4gIC8qKiBFbWl0dGVkIHdoZW4gQ2FuY2VsIGJ1dHRvbiBpcyBjbGlja2VkICovXG4gIEBPdXRwdXQoKSBhY3Rpb25DYW5jZWxUcmlnZ2VyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgbG9hZGluZyBzdGF0ZVxuICAgKiBAcmV0dXJucyB0cnVlIGlmIGxvYWRpbmcsIGZhbHNlIG90aGVyd2lzZVxuICAgKi9cbiAgZ2V0IGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sb2FkaW5nJCA/IGZhbHNlIDogZmFsc2U7IC8vIFNpbXBsaWZpZWQgZm9yIG5vd1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgU2F2ZSBidXR0b24gY2xpY2tcbiAgICogQGVtaXRzIGFjdGlvblNhdmVUcmlnZ2VyZWRcbiAgICovXG4gIG9uU2F2ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGlvblNhdmVUcmlnZ2VyZWQuZW1pdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZXMgQ3JlYXRlIGJ1dHRvbiBjbGlja1xuICAgKiBAZW1pdHMgYWN0aW9uQ3JlYXRlVHJpZ2dlcmVkXG4gICAqL1xuICBvbkNyZWF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGlvbkNyZWF0ZVRyaWdnZXJlZC5lbWl0KCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBDcmVhdGUgYW5kIENvcHkgYnV0dG9uIGNsaWNrXG4gICAqIEBlbWl0cyBhY3Rpb25DcmVhdGVDb3B5VHJpZ2dlcmVkXG4gICAqL1xuICBvbkNyZWF0ZUNvcHkoKTogdm9pZCB7XG4gICAgdGhpcy5hY3Rpb25DcmVhdGVDb3B5VHJpZ2dlcmVkLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIFNhdmUgYW5kIENvcHkgYnV0dG9uIGNsaWNrXG4gICAqIEBlbWl0cyBhY3Rpb25TYXZlQ29weVRyaWdnZXJlZFxuICAgKi9cbiAgb25TYXZlQ29weSgpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGlvblNhdmVDb3B5VHJpZ2dlcmVkLmVtaXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIENhbmNlbCBidXR0b24gY2xpY2tcbiAgICogQGVtaXRzIGFjdGlvbkNhbmNlbFRyaWdnZXJlZFxuICAgKi9cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy5hY3Rpb25DYW5jZWxUcmlnZ2VyZWQuZW1pdCgpO1xuICB9XG59ICIsIjxkaXYgY2xhc3M9XCJqdXZvLWJ1dHRvbi1hY3Rpb25cIj5cbiAgPGJ1dHRvblxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lZFwiXG4gICAgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5cbiAgICBDYW5jZWxcbiAgPC9idXR0b24+XG5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwiYnV0dG9uQ3JlYXRlQ29weVwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVkXCJcbiAgICBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcbiAgICAoY2xpY2spPVwib25DcmVhdGVDb3B5KClcIj5cbiAgICA8c3BhbiAqbmdJZj1cImlzTG9hZGluZ1wiIGNsYXNzPVwic3Bpbm5lclwiPjwvc3Bhbj5cbiAgICBDcmVhdGUgYW5kIGNvcHlcbiAgPC9idXR0b24+XG5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwiYnV0dG9uU2F2ZUNvcHlcIlxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lZFwiXG4gICAgW2Rpc2FibGVkXT1cImlzTG9hZGluZ1wiXG4gICAgKGNsaWNrKT1cIm9uU2F2ZUNvcHkoKVwiPlxuICAgIDxzcGFuICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyXCI+PC9zcGFuPlxuICAgIFNhdmUgYW5kIGNvcHlcbiAgPC9idXR0b24+XG5cbiAgPGJ1dHRvblxuICAgICpuZ0lmPVwiYnV0dG9uQ3JlYXRlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBjbGFzcz1cImJ0biBidG4tb3V0bGluZWRcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlIHx8IGlzTG9hZGluZ1wiXG4gICAgKGNsaWNrKT1cIm9uQ3JlYXRlKClcIj5cbiAgICA8c3BhbiAqbmdJZj1cImlzTG9hZGluZ1wiIGNsYXNzPVwic3Bpbm5lclwiPjwvc3Bhbj5cbiAgICBDcmVhdGVcbiAgPC9idXR0b24+XG4gIFxuICA8YnV0dG9uXG4gICAgKm5nSWY9XCJidXR0b25TYXZlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZSB8fCBpc0xvYWRpbmdcIlxuICAgIFtjbGFzc109XCJidXR0b25UeXBlID8gJ2J0biBidG4tcHJpbWFyeScgOiAnYnRuIGJ0bi1vdXRsaW5lZCdcIlxuICAgIChjbGljayk9XCJvblNhdmUoKVwiPlxuICAgIDxzcGFuICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJzcGlubmVyXCI+PC9zcGFuPlxuICAgIHt7IHNhdmVUZXh0IH19XG4gIDwvYnV0dG9uPlxuPC9kaXY+ICJdfQ==