@cqa-lib/cqa-ui 1.1.549-delta.6 → 1.1.549-delta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -95,10 +95,10 @@ export class GraphQLOperationPickerComponent {
95
95
  }
96
96
  }
97
97
  GraphQLOperationPickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GraphQLOperationPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
98
- GraphQLOperationPickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: GraphQLOperationPickerComponent, selector: "cqa-graphql-operation-picker", inputs: { schemaSource: "schemaSource", operations: "operations", introspected: "introspected", isLoading: "isLoading" }, outputs: { back: "back", operationSelected: "operationSelected", reIntrospect: "reIntrospect", change: "change", preview: "preview" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-graphql-operation-picker cqa-flex cqa-flex-col cqa-gap-4 cqa-bg-white cqa-w-full\">\n\n <!-- Title row: back arrow + heading + Introspected badge -->\n <div class=\"cqa-graphql-operation-picker-header cqa-flex cqa-items-center cqa-gap-3\">\n <div class=\"cqa-cursor-pointer cqa-text-[#6B7280] cqa-text-[14px] cqa-font-semibold\" (click)=\"onBack()\">\n <mat-icon class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[18px] cqa-text-[#6B7280] cqa-font-semibold\" style=\"display:flex;font-size:18px;font-weight: 600;\">arrow_back</mat-icon>\n </div>\n <h3 class=\"cqa-graphql-operation-picker-title cqa-m-0 cqa-text-[18px] cqa-font-semibold cqa-text-[#111827] cqa-leading-[1.25]\">\n Pick a GraphQL operation\n </h3>\n <span *ngIf=\"introspected\"\n class=\"cqa-graphql-operation-picker-badge cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-[2px] cqa-rounded-full cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[11px] cqa-font-medium cqa-leading-[1.4]\">\n <span aria-hidden=\"true\">\u25C6</span> Introspected\n </span>\n </div>\n\n <!-- Subheading -->\n <p class=\"cqa-graphql-operation-picker-subheading cqa-m-0 cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n Phase 1 supports one operation per test step. Select one to auto-fill the request.\n </p>\n\n <!-- Schema source bar: URL + counts + Re-introspect / Change buttons -->\n <div class=\"cqa-graphql-operation-picker-source cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-bg-[#EEF2FF] cqa-rounded-lg cqa-px-4 cqa-py-3 cqa-border cqa-border-solid cqa-border-[#E0E7FF]\">\n <div class=\"cqa-graphql-operation-picker-source-info cqa-flex cqa-flex-col cqa-gap-0.5 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-source-label cqa-text-[10px] cqa-uppercase cqa-tracking-wide cqa-text-[#6B7280] cqa-font-semibold\">\n Schema source\n </div>\n <div *ngIf=\"schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-font-mono cqa-text-[#1F2937] cqa-truncate cqa-min-w-0\"\n [title]=\"schemaSource?.url\">\n {{ schemaSource?.url }}\n </div>\n <div *ngIf=\"!schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-italic cqa-text-[#6B7280]\">\n No schema loaded yet.\n </div>\n </div>\n <div class=\"cqa-graphql-operation-picker-source-meta cqa-flex cqa-items-center cqa-gap-3 cqa-shrink-0\">\n <span *ngIf=\"headerCounts\" class=\"cqa-graphql-operation-picker-source-counts cqa-text-[12px] cqa-text-[#4B5563]\">\n {{ headerCounts }}\n </span>\n <cqa-button type=\"button\" variant=\"outlined\" [icon]=\"'refresh'\" btnSize=\"md\" text=\"Re-introspect\"\n customClass=\"!cqa-bg-white !cqa-text-[#374151] !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#F9FAFB]\"\n (clicked)=\"onReIntrospect()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\" text=\"Change\"\n customClass=\"!cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#EEF2FF]\"\n (clicked)=\"onChange()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Filter -->\n <cqa-custom-input\n [(value)]=\"filterTerm\"\n [label]=\"''\"\n placeholder=\"Filter operations...\"\n [fullWidth]=\"true\"\n size=\"md\"\n ariaLabel=\"Filter GraphQL operations\">\n </cqa-custom-input>\n\n <!-- Loading spinner shown while the parent is introspecting. Replaces the empty state. -->\n <div *ngIf=\"isLoading\"\n class=\"cqa-graphql-operation-picker-loading cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-3 cqa-py-12 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-graphql-operation-picker-spinner cqa-inline-block cqa-w-7 cqa-h-7 cqa-rounded-full cqa-border-2 cqa-border-solid cqa-border-[#E5E7EB] cqa-border-t-[#4F46E5] cqa-animate-spin\" aria-hidden=\"true\"></span>\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">Loading schema\u2026</span>\n <span class=\"cqa-text-[12px] cqa-text-[#6B7280]\">Introspecting GraphQL endpoint, this may take a moment.</span>\n </div>\n\n <!-- Empty state when no operations are loaded yet (or filter rules everything out). -->\n <div *ngIf=\"!isLoading && !filteredOperations.length\"\n class=\"cqa-graphql-operation-picker-empty cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-2 cqa-py-10 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">\n {{ filterTerm ? 'No operations match your filter.' : 'No operations available.' }}\n </span>\n <span *ngIf=\"!filterTerm\" class=\"cqa-text-[12px] cqa-text-[#6B7280]\">\n Click <strong>Re-introspect</strong> above to load the schema.\n </span>\n </div>\n\n <!-- Operation sections (Queries / Mutations / Subscriptions) -->\n <ng-container *ngIf=\"!isLoading && filteredOperations.length\">\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: queryOperations, label: 'Queries', accent: 'cqa-text-[#059669]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: mutationOperations, label: 'Mutations', accent: 'cqa-text-[#D97706]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: subscriptionOperations, label: 'Subscriptions', accent: 'cqa-text-[#7C3AED]' }\"></ng-container>\n </ng-container>\n\n <!-- Footer: selection summary. No Back / Use buttons \u2014 clicking a row commits + returns. -->\n <div *ngIf=\"!isLoading && filteredOperations.length\" class=\"cqa-graphql-operation-picker-footer cqa-flex cqa-items-center cqa-pt-2 cqa-text-[12px] cqa-text-[#6B7280]\">\n <span>Click an operation to use it \u2014 the picker closes and the request is auto-filled.</span>\n </div>\n\n <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Section template \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n <ng-template #opSection let-ops let-label=\"label\" let-accent=\"accent\">\n <div *ngIf=\"ops?.length\" class=\"cqa-graphql-operation-picker-section cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-graphql-operation-picker-section-head cqa-flex cqa-items-center cqa-gap-2 cqa-bg-[#F9FAFB] cqa-px-3 cqa-py-1.5 cqa-rounded-md cqa-border cqa-border-solid cqa-border-[#F3F4F6]\">\n <span class=\"cqa-graphql-operation-picker-section-label cqa-text-[12px] cqa-font-semibold\" [ngClass]=\"accent\">{{ label }}</span>\n <span class=\"cqa-graphql-operation-picker-section-count cqa-text-[11px] cqa-text-[#6B7280]\">\n {{ ops.length }} {{ ops.length === 1 ? 'operation' : 'operations' }}\n </span>\n </div>\n <div *ngFor=\"let op of ops; trackBy: trackByOperation\"\n class=\"cqa-graphql-operation-picker-row cqa-flex cqa-items-start cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2.5 cqa-rounded-md cqa-cursor-pointer cqa-border cqa-border-solid cqa-border-transparent hover:cqa-bg-[#F9FAFB] hover:cqa-border-[#E5E7EB] focus-within:cqa-bg-[#F5F3FF]\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Use operation ' + op.name\"\n (click)=\"onSelect(op)\"\n (keydown.enter)=\"onSelect(op)\"\n (keydown.space)=\"onSelect(op); $event.preventDefault()\">\n <span class=\"cqa-graphql-operation-picker-row-radio cqa-mt-1 cqa-shrink-0\">\n <span class=\"cqa-inline-block cqa-w-4 cqa-h-4 cqa-rounded-full cqa-border cqa-border-solid cqa-border-[#9CA3AF] cqa-bg-white\" aria-hidden=\"true\"></span>\n </span>\n <div class=\"cqa-graphql-operation-picker-row-body cqa-flex cqa-flex-col cqa-gap-0.5 cqa-flex-1 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-row-signature cqa-flex cqa-flex-wrap cqa-items-baseline cqa-gap-x-1 cqa-text-[13px] cqa-font-mono cqa-leading-[1.4] cqa-min-w-0\">\n <span class=\"cqa-text-[#111827] cqa-font-semibold\">{{ op.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">(</span>\n <ng-container *ngFor=\"let arg of op.args ?? []; let last = last\">\n <span class=\"cqa-text-[#374151]\">{{ arg.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">:&nbsp;</span>\n <span [ngClass]=\"returnTypeColorClass(op.kind)\">{{ arg.type }}</span>\n <span *ngIf=\"!last\" class=\"cqa-text-[#6B7280]\">,&nbsp;</span>\n </ng-container>\n <span class=\"cqa-text-[#6B7280]\">)</span>\n \n </div>\n <div *ngIf=\"op.description\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-graphql-operation-picker-row-description cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n <span>{{ op.description }}</span>\n <mat-icon *ngIf=\"op.returnType\" style=\"display:flex;font-size:14px;font-weight: 600;\" class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[#6B7280] cqa-mx-1\">arrow_forward</mat-icon>\n <span *ngIf=\"op.returnType\" [ngClass]=\"returnTypeColorClass(op.kind)\" class=\"cqa-font-semibold\">{{ op.returnType }}</span>\n </div>\n </div>\n <!-- <button type=\"button\"\n class=\"cqa-graphql-operation-picker-row-preview cqa-shrink-0 cqa-inline-flex cqa-items-center cqa-gap-1 cqa-bg-transparent cqa-border-0 cqa-cursor-pointer cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:cqa-underline focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#A5B4FC] cqa-rounded-md cqa-px-2 cqa-py-1\"\n [attr.aria-label]=\"'Preview operation ' + op.name\"\n (click)=\"onPreview(op, $event)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n <span>Preview</span>\n </button> -->\n </div>\n </div>\n </ng-template>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.Default });
98
+ GraphQLOperationPickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: GraphQLOperationPickerComponent, selector: "cqa-graphql-operation-picker", inputs: { schemaSource: "schemaSource", operations: "operations", introspected: "introspected", isLoading: "isLoading" }, outputs: { back: "back", operationSelected: "operationSelected", reIntrospect: "reIntrospect", change: "change", preview: "preview" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-graphql-operation-picker cqa-flex cqa-flex-col cqa-gap-4 cqa-bg-white cqa-w-full\">\n\n <!-- Title row: back arrow + heading + Introspected badge -->\n <div class=\"cqa-graphql-operation-picker-header cqa-flex cqa-items-center cqa-gap-3\">\n <div class=\"cqa-cursor-pointer cqa-text-[#6B7280] cqa-text-[14px] cqa-font-semibold\" (click)=\"onBack()\">\n <mat-icon class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[18px] cqa-text-[#6B7280] cqa-font-semibold\" style=\"display:flex;font-size:18px;font-weight: 600;\">arrow_back</mat-icon>\n </div>\n <h3 class=\"cqa-graphql-operation-picker-title cqa-m-0 cqa-text-[18px] cqa-font-semibold cqa-text-[#111827] cqa-leading-[1.25]\">\n Pick a GraphQL operation\n </h3>\n <span *ngIf=\"introspected\"\n class=\"cqa-graphql-operation-picker-badge cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-[2px] cqa-rounded-full cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[11px] cqa-font-medium cqa-leading-[1.4]\">\n <span aria-hidden=\"true\">\u25C6</span> Introspected\n </span>\n </div>\n\n <!-- Subheading -->\n <p class=\"cqa-graphql-operation-picker-subheading cqa-m-0 cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n Phase 1 supports one operation per test step. Select one to auto-fill the request.\n </p>\n\n <!-- Schema source bar: URL + counts + Re-introspect / Change buttons -->\n <div class=\"cqa-graphql-operation-picker-source cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-bg-[#EEF2FF] cqa-rounded-lg cqa-px-4 cqa-py-3 cqa-border cqa-border-solid cqa-border-[#E0E7FF]\">\n <div class=\"cqa-graphql-operation-picker-source-info cqa-flex cqa-flex-col cqa-gap-0.5 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-source-label cqa-text-[10px] cqa-uppercase cqa-tracking-wide cqa-text-[#6B7280] cqa-font-semibold\">\n Schema source\n </div>\n <div *ngIf=\"schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-font-mono cqa-text-[#1F2937] cqa-truncate cqa-min-w-0\"\n [title]=\"schemaSource?.url\">\n {{ schemaSource?.url }}\n </div>\n <div *ngIf=\"!schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-italic cqa-text-[#6B7280]\">\n No schema loaded yet.\n </div>\n </div>\n <div class=\"cqa-graphql-operation-picker-source-meta cqa-flex cqa-items-center cqa-gap-3 cqa-shrink-0\">\n <span *ngIf=\"headerCounts\" class=\"cqa-graphql-operation-picker-source-counts cqa-text-[12px] cqa-text-[#4B5563]\">\n {{ headerCounts }}\n </span>\n <cqa-button type=\"button\" variant=\"outlined\" [icon]=\"'refresh'\" btnSize=\"md\" text=\"Re-introspect\"\n customClass=\"!cqa-bg-white !cqa-text-[#374151] !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#F9FAFB]\"\n (clicked)=\"onReIntrospect()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\" text=\"Close\"\n customClass=\"!cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#EEF2FF]\"\n (clicked)=\"onChange()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Filter -->\n <cqa-custom-input\n [(value)]=\"filterTerm\"\n [label]=\"''\"\n placeholder=\"Filter operations...\"\n [fullWidth]=\"true\"\n size=\"md\"\n ariaLabel=\"Filter GraphQL operations\">\n </cqa-custom-input>\n\n <!-- Loading spinner shown while the parent is introspecting. Replaces the empty state. -->\n <div *ngIf=\"isLoading\"\n class=\"cqa-graphql-operation-picker-loading cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-3 cqa-py-12 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-graphql-operation-picker-spinner cqa-inline-block cqa-w-7 cqa-h-7 cqa-rounded-full cqa-border-2 cqa-border-solid cqa-border-[#E5E7EB] cqa-border-t-[#4F46E5] cqa-animate-spin\" aria-hidden=\"true\"></span>\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">Loading schema\u2026</span>\n <span class=\"cqa-text-[12px] cqa-text-[#6B7280]\">Introspecting GraphQL endpoint, this may take a moment.</span>\n </div>\n\n <!-- Empty state when no operations are loaded yet (or filter rules everything out). -->\n <div *ngIf=\"!isLoading && !filteredOperations.length\"\n class=\"cqa-graphql-operation-picker-empty cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-2 cqa-py-10 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">\n {{ filterTerm ? 'No operations match your filter.' : 'No operations available.' }}\n </span>\n <span *ngIf=\"!filterTerm\" class=\"cqa-text-[12px] cqa-text-[#6B7280]\">\n Click <strong>Re-introspect</strong> above to load the schema.\n </span>\n </div>\n\n <!-- Operation sections (Queries / Mutations / Subscriptions) -->\n <ng-container *ngIf=\"!isLoading && filteredOperations.length\">\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: queryOperations, label: 'Queries', accent: 'cqa-text-[#059669]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: mutationOperations, label: 'Mutations', accent: 'cqa-text-[#D97706]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: subscriptionOperations, label: 'Subscriptions', accent: 'cqa-text-[#7C3AED]' }\"></ng-container>\n </ng-container>\n\n <!-- Footer: selection summary. No Back / Use buttons \u2014 clicking a row commits + returns. -->\n <div *ngIf=\"!isLoading && filteredOperations.length\" class=\"cqa-graphql-operation-picker-footer cqa-flex cqa-items-center cqa-pt-2 cqa-text-[12px] cqa-text-[#6B7280]\">\n <span>Click an operation to use it \u2014 the picker closes and the request is auto-filled.</span>\n </div>\n\n <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Section template \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n <ng-template #opSection let-ops let-label=\"label\" let-accent=\"accent\">\n <div *ngIf=\"ops?.length\" class=\"cqa-graphql-operation-picker-section cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-graphql-operation-picker-section-head cqa-flex cqa-items-center cqa-gap-2 cqa-bg-[#F9FAFB] cqa-px-3 cqa-py-1.5 cqa-rounded-md cqa-border cqa-border-solid cqa-border-[#F3F4F6]\">\n <span class=\"cqa-graphql-operation-picker-section-label cqa-text-[12px] cqa-font-semibold\" [ngClass]=\"accent\">{{ label }}</span>\n <span class=\"cqa-graphql-operation-picker-section-count cqa-text-[11px] cqa-text-[#6B7280]\">\n {{ ops.length }} {{ ops.length === 1 ? 'operation' : 'operations' }}\n </span>\n </div>\n <div *ngFor=\"let op of ops; trackBy: trackByOperation\"\n class=\"cqa-graphql-operation-picker-row cqa-flex cqa-items-start cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2.5 cqa-rounded-md cqa-cursor-pointer cqa-border cqa-border-solid cqa-border-transparent hover:cqa-bg-[#F9FAFB] hover:cqa-border-[#E5E7EB] focus-within:cqa-bg-[#F5F3FF]\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Use operation ' + op.name\"\n (click)=\"onSelect(op)\"\n (keydown.enter)=\"onSelect(op)\"\n (keydown.space)=\"onSelect(op); $event.preventDefault()\">\n <span class=\"cqa-graphql-operation-picker-row-radio cqa-mt-1 cqa-shrink-0\">\n <span class=\"cqa-inline-block cqa-w-4 cqa-h-4 cqa-rounded-full cqa-border cqa-border-solid cqa-border-[#9CA3AF] cqa-bg-white\" aria-hidden=\"true\"></span>\n </span>\n <div class=\"cqa-graphql-operation-picker-row-body cqa-flex cqa-flex-col cqa-gap-0.5 cqa-flex-1 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-row-signature cqa-flex cqa-flex-wrap cqa-items-baseline cqa-gap-x-1 cqa-text-[13px] cqa-font-mono cqa-leading-[1.4] cqa-min-w-0\">\n <span class=\"cqa-text-[#111827] cqa-font-semibold\">{{ op.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">(</span>\n <ng-container *ngFor=\"let arg of op.args ?? []; let last = last\">\n <span class=\"cqa-text-[#374151]\">{{ arg.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">:&nbsp;</span>\n <span [ngClass]=\"returnTypeColorClass(op.kind)\">{{ arg.type }}</span>\n <span *ngIf=\"!last\" class=\"cqa-text-[#6B7280]\">,&nbsp;</span>\n </ng-container>\n <span class=\"cqa-text-[#6B7280]\">)</span>\n \n </div>\n <div *ngIf=\"op.description\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-graphql-operation-picker-row-description cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n <span>{{ op.description }}</span>\n <mat-icon *ngIf=\"op.returnType\" style=\"display:flex;font-size:14px;font-weight: 600;\" class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[#6B7280] cqa-mx-1\">arrow_forward</mat-icon>\n <span *ngIf=\"op.returnType\" [ngClass]=\"returnTypeColorClass(op.kind)\" class=\"cqa-font-semibold\">{{ op.returnType }}</span>\n </div>\n </div>\n <!-- <button type=\"button\"\n class=\"cqa-graphql-operation-picker-row-preview cqa-shrink-0 cqa-inline-flex cqa-items-center cqa-gap-1 cqa-bg-transparent cqa-border-0 cqa-cursor-pointer cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:cqa-underline focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#A5B4FC] cqa-rounded-md cqa-px-2 cqa-py-1\"\n [attr.aria-label]=\"'Preview operation ' + op.name\"\n (click)=\"onPreview(op, $event)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n <span>Preview</span>\n </button> -->\n </div>\n </div>\n </ng-template>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i2.ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: i3.CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }], directives: [{ type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.Default });
99
99
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GraphQLOperationPickerComponent, decorators: [{
100
100
  type: Component,
101
- args: [{ selector: 'cqa-graphql-operation-picker', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.Default, template: "<div class=\"cqa-graphql-operation-picker cqa-flex cqa-flex-col cqa-gap-4 cqa-bg-white cqa-w-full\">\n\n <!-- Title row: back arrow + heading + Introspected badge -->\n <div class=\"cqa-graphql-operation-picker-header cqa-flex cqa-items-center cqa-gap-3\">\n <div class=\"cqa-cursor-pointer cqa-text-[#6B7280] cqa-text-[14px] cqa-font-semibold\" (click)=\"onBack()\">\n <mat-icon class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[18px] cqa-text-[#6B7280] cqa-font-semibold\" style=\"display:flex;font-size:18px;font-weight: 600;\">arrow_back</mat-icon>\n </div>\n <h3 class=\"cqa-graphql-operation-picker-title cqa-m-0 cqa-text-[18px] cqa-font-semibold cqa-text-[#111827] cqa-leading-[1.25]\">\n Pick a GraphQL operation\n </h3>\n <span *ngIf=\"introspected\"\n class=\"cqa-graphql-operation-picker-badge cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-[2px] cqa-rounded-full cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[11px] cqa-font-medium cqa-leading-[1.4]\">\n <span aria-hidden=\"true\">\u25C6</span> Introspected\n </span>\n </div>\n\n <!-- Subheading -->\n <p class=\"cqa-graphql-operation-picker-subheading cqa-m-0 cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n Phase 1 supports one operation per test step. Select one to auto-fill the request.\n </p>\n\n <!-- Schema source bar: URL + counts + Re-introspect / Change buttons -->\n <div class=\"cqa-graphql-operation-picker-source cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-bg-[#EEF2FF] cqa-rounded-lg cqa-px-4 cqa-py-3 cqa-border cqa-border-solid cqa-border-[#E0E7FF]\">\n <div class=\"cqa-graphql-operation-picker-source-info cqa-flex cqa-flex-col cqa-gap-0.5 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-source-label cqa-text-[10px] cqa-uppercase cqa-tracking-wide cqa-text-[#6B7280] cqa-font-semibold\">\n Schema source\n </div>\n <div *ngIf=\"schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-font-mono cqa-text-[#1F2937] cqa-truncate cqa-min-w-0\"\n [title]=\"schemaSource?.url\">\n {{ schemaSource?.url }}\n </div>\n <div *ngIf=\"!schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-italic cqa-text-[#6B7280]\">\n No schema loaded yet.\n </div>\n </div>\n <div class=\"cqa-graphql-operation-picker-source-meta cqa-flex cqa-items-center cqa-gap-3 cqa-shrink-0\">\n <span *ngIf=\"headerCounts\" class=\"cqa-graphql-operation-picker-source-counts cqa-text-[12px] cqa-text-[#4B5563]\">\n {{ headerCounts }}\n </span>\n <cqa-button type=\"button\" variant=\"outlined\" [icon]=\"'refresh'\" btnSize=\"md\" text=\"Re-introspect\"\n customClass=\"!cqa-bg-white !cqa-text-[#374151] !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#F9FAFB]\"\n (clicked)=\"onReIntrospect()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\" text=\"Change\"\n customClass=\"!cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#EEF2FF]\"\n (clicked)=\"onChange()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Filter -->\n <cqa-custom-input\n [(value)]=\"filterTerm\"\n [label]=\"''\"\n placeholder=\"Filter operations...\"\n [fullWidth]=\"true\"\n size=\"md\"\n ariaLabel=\"Filter GraphQL operations\">\n </cqa-custom-input>\n\n <!-- Loading spinner shown while the parent is introspecting. Replaces the empty state. -->\n <div *ngIf=\"isLoading\"\n class=\"cqa-graphql-operation-picker-loading cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-3 cqa-py-12 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-graphql-operation-picker-spinner cqa-inline-block cqa-w-7 cqa-h-7 cqa-rounded-full cqa-border-2 cqa-border-solid cqa-border-[#E5E7EB] cqa-border-t-[#4F46E5] cqa-animate-spin\" aria-hidden=\"true\"></span>\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">Loading schema\u2026</span>\n <span class=\"cqa-text-[12px] cqa-text-[#6B7280]\">Introspecting GraphQL endpoint, this may take a moment.</span>\n </div>\n\n <!-- Empty state when no operations are loaded yet (or filter rules everything out). -->\n <div *ngIf=\"!isLoading && !filteredOperations.length\"\n class=\"cqa-graphql-operation-picker-empty cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-2 cqa-py-10 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">\n {{ filterTerm ? 'No operations match your filter.' : 'No operations available.' }}\n </span>\n <span *ngIf=\"!filterTerm\" class=\"cqa-text-[12px] cqa-text-[#6B7280]\">\n Click <strong>Re-introspect</strong> above to load the schema.\n </span>\n </div>\n\n <!-- Operation sections (Queries / Mutations / Subscriptions) -->\n <ng-container *ngIf=\"!isLoading && filteredOperations.length\">\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: queryOperations, label: 'Queries', accent: 'cqa-text-[#059669]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: mutationOperations, label: 'Mutations', accent: 'cqa-text-[#D97706]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: subscriptionOperations, label: 'Subscriptions', accent: 'cqa-text-[#7C3AED]' }\"></ng-container>\n </ng-container>\n\n <!-- Footer: selection summary. No Back / Use buttons \u2014 clicking a row commits + returns. -->\n <div *ngIf=\"!isLoading && filteredOperations.length\" class=\"cqa-graphql-operation-picker-footer cqa-flex cqa-items-center cqa-pt-2 cqa-text-[12px] cqa-text-[#6B7280]\">\n <span>Click an operation to use it \u2014 the picker closes and the request is auto-filled.</span>\n </div>\n\n <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Section template \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n <ng-template #opSection let-ops let-label=\"label\" let-accent=\"accent\">\n <div *ngIf=\"ops?.length\" class=\"cqa-graphql-operation-picker-section cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-graphql-operation-picker-section-head cqa-flex cqa-items-center cqa-gap-2 cqa-bg-[#F9FAFB] cqa-px-3 cqa-py-1.5 cqa-rounded-md cqa-border cqa-border-solid cqa-border-[#F3F4F6]\">\n <span class=\"cqa-graphql-operation-picker-section-label cqa-text-[12px] cqa-font-semibold\" [ngClass]=\"accent\">{{ label }}</span>\n <span class=\"cqa-graphql-operation-picker-section-count cqa-text-[11px] cqa-text-[#6B7280]\">\n {{ ops.length }} {{ ops.length === 1 ? 'operation' : 'operations' }}\n </span>\n </div>\n <div *ngFor=\"let op of ops; trackBy: trackByOperation\"\n class=\"cqa-graphql-operation-picker-row cqa-flex cqa-items-start cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2.5 cqa-rounded-md cqa-cursor-pointer cqa-border cqa-border-solid cqa-border-transparent hover:cqa-bg-[#F9FAFB] hover:cqa-border-[#E5E7EB] focus-within:cqa-bg-[#F5F3FF]\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Use operation ' + op.name\"\n (click)=\"onSelect(op)\"\n (keydown.enter)=\"onSelect(op)\"\n (keydown.space)=\"onSelect(op); $event.preventDefault()\">\n <span class=\"cqa-graphql-operation-picker-row-radio cqa-mt-1 cqa-shrink-0\">\n <span class=\"cqa-inline-block cqa-w-4 cqa-h-4 cqa-rounded-full cqa-border cqa-border-solid cqa-border-[#9CA3AF] cqa-bg-white\" aria-hidden=\"true\"></span>\n </span>\n <div class=\"cqa-graphql-operation-picker-row-body cqa-flex cqa-flex-col cqa-gap-0.5 cqa-flex-1 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-row-signature cqa-flex cqa-flex-wrap cqa-items-baseline cqa-gap-x-1 cqa-text-[13px] cqa-font-mono cqa-leading-[1.4] cqa-min-w-0\">\n <span class=\"cqa-text-[#111827] cqa-font-semibold\">{{ op.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">(</span>\n <ng-container *ngFor=\"let arg of op.args ?? []; let last = last\">\n <span class=\"cqa-text-[#374151]\">{{ arg.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">:&nbsp;</span>\n <span [ngClass]=\"returnTypeColorClass(op.kind)\">{{ arg.type }}</span>\n <span *ngIf=\"!last\" class=\"cqa-text-[#6B7280]\">,&nbsp;</span>\n </ng-container>\n <span class=\"cqa-text-[#6B7280]\">)</span>\n \n </div>\n <div *ngIf=\"op.description\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-graphql-operation-picker-row-description cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n <span>{{ op.description }}</span>\n <mat-icon *ngIf=\"op.returnType\" style=\"display:flex;font-size:14px;font-weight: 600;\" class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[#6B7280] cqa-mx-1\">arrow_forward</mat-icon>\n <span *ngIf=\"op.returnType\" [ngClass]=\"returnTypeColorClass(op.kind)\" class=\"cqa-font-semibold\">{{ op.returnType }}</span>\n </div>\n </div>\n <!-- <button type=\"button\"\n class=\"cqa-graphql-operation-picker-row-preview cqa-shrink-0 cqa-inline-flex cqa-items-center cqa-gap-1 cqa-bg-transparent cqa-border-0 cqa-cursor-pointer cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:cqa-underline focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#A5B4FC] cqa-rounded-md cqa-px-2 cqa-py-1\"\n [attr.aria-label]=\"'Preview operation ' + op.name\"\n (click)=\"onPreview(op, $event)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n <span>Preview</span>\n </button> -->\n </div>\n </div>\n </ng-template>\n</div>\n" }]
101
+ args: [{ selector: 'cqa-graphql-operation-picker', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.Default, template: "<div class=\"cqa-graphql-operation-picker cqa-flex cqa-flex-col cqa-gap-4 cqa-bg-white cqa-w-full\">\n\n <!-- Title row: back arrow + heading + Introspected badge -->\n <div class=\"cqa-graphql-operation-picker-header cqa-flex cqa-items-center cqa-gap-3\">\n <div class=\"cqa-cursor-pointer cqa-text-[#6B7280] cqa-text-[14px] cqa-font-semibold\" (click)=\"onBack()\">\n <mat-icon class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[18px] cqa-text-[#6B7280] cqa-font-semibold\" style=\"display:flex;font-size:18px;font-weight: 600;\">arrow_back</mat-icon>\n </div>\n <h3 class=\"cqa-graphql-operation-picker-title cqa-m-0 cqa-text-[18px] cqa-font-semibold cqa-text-[#111827] cqa-leading-[1.25]\">\n Pick a GraphQL operation\n </h3>\n <span *ngIf=\"introspected\"\n class=\"cqa-graphql-operation-picker-badge cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-[2px] cqa-rounded-full cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[11px] cqa-font-medium cqa-leading-[1.4]\">\n <span aria-hidden=\"true\">\u25C6</span> Introspected\n </span>\n </div>\n\n <!-- Subheading -->\n <p class=\"cqa-graphql-operation-picker-subheading cqa-m-0 cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n Phase 1 supports one operation per test step. Select one to auto-fill the request.\n </p>\n\n <!-- Schema source bar: URL + counts + Re-introspect / Change buttons -->\n <div class=\"cqa-graphql-operation-picker-source cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-bg-[#EEF2FF] cqa-rounded-lg cqa-px-4 cqa-py-3 cqa-border cqa-border-solid cqa-border-[#E0E7FF]\">\n <div class=\"cqa-graphql-operation-picker-source-info cqa-flex cqa-flex-col cqa-gap-0.5 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-source-label cqa-text-[10px] cqa-uppercase cqa-tracking-wide cqa-text-[#6B7280] cqa-font-semibold\">\n Schema source\n </div>\n <div *ngIf=\"schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-font-mono cqa-text-[#1F2937] cqa-truncate cqa-min-w-0\"\n [title]=\"schemaSource?.url\">\n {{ schemaSource?.url }}\n </div>\n <div *ngIf=\"!schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-italic cqa-text-[#6B7280]\">\n No schema loaded yet.\n </div>\n </div>\n <div class=\"cqa-graphql-operation-picker-source-meta cqa-flex cqa-items-center cqa-gap-3 cqa-shrink-0\">\n <span *ngIf=\"headerCounts\" class=\"cqa-graphql-operation-picker-source-counts cqa-text-[12px] cqa-text-[#4B5563]\">\n {{ headerCounts }}\n </span>\n <cqa-button type=\"button\" variant=\"outlined\" [icon]=\"'refresh'\" btnSize=\"md\" text=\"Re-introspect\"\n customClass=\"!cqa-bg-white !cqa-text-[#374151] !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#F9FAFB]\"\n (clicked)=\"onReIntrospect()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\" text=\"Close\"\n customClass=\"!cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#EEF2FF]\"\n (clicked)=\"onChange()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Filter -->\n <cqa-custom-input\n [(value)]=\"filterTerm\"\n [label]=\"''\"\n placeholder=\"Filter operations...\"\n [fullWidth]=\"true\"\n size=\"md\"\n ariaLabel=\"Filter GraphQL operations\">\n </cqa-custom-input>\n\n <!-- Loading spinner shown while the parent is introspecting. Replaces the empty state. -->\n <div *ngIf=\"isLoading\"\n class=\"cqa-graphql-operation-picker-loading cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-3 cqa-py-12 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-graphql-operation-picker-spinner cqa-inline-block cqa-w-7 cqa-h-7 cqa-rounded-full cqa-border-2 cqa-border-solid cqa-border-[#E5E7EB] cqa-border-t-[#4F46E5] cqa-animate-spin\" aria-hidden=\"true\"></span>\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">Loading schema\u2026</span>\n <span class=\"cqa-text-[12px] cqa-text-[#6B7280]\">Introspecting GraphQL endpoint, this may take a moment.</span>\n </div>\n\n <!-- Empty state when no operations are loaded yet (or filter rules everything out). -->\n <div *ngIf=\"!isLoading && !filteredOperations.length\"\n class=\"cqa-graphql-operation-picker-empty cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-2 cqa-py-10 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">\n {{ filterTerm ? 'No operations match your filter.' : 'No operations available.' }}\n </span>\n <span *ngIf=\"!filterTerm\" class=\"cqa-text-[12px] cqa-text-[#6B7280]\">\n Click <strong>Re-introspect</strong> above to load the schema.\n </span>\n </div>\n\n <!-- Operation sections (Queries / Mutations / Subscriptions) -->\n <ng-container *ngIf=\"!isLoading && filteredOperations.length\">\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: queryOperations, label: 'Queries', accent: 'cqa-text-[#059669]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: mutationOperations, label: 'Mutations', accent: 'cqa-text-[#D97706]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: subscriptionOperations, label: 'Subscriptions', accent: 'cqa-text-[#7C3AED]' }\"></ng-container>\n </ng-container>\n\n <!-- Footer: selection summary. No Back / Use buttons \u2014 clicking a row commits + returns. -->\n <div *ngIf=\"!isLoading && filteredOperations.length\" class=\"cqa-graphql-operation-picker-footer cqa-flex cqa-items-center cqa-pt-2 cqa-text-[12px] cqa-text-[#6B7280]\">\n <span>Click an operation to use it \u2014 the picker closes and the request is auto-filled.</span>\n </div>\n\n <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Section template \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n <ng-template #opSection let-ops let-label=\"label\" let-accent=\"accent\">\n <div *ngIf=\"ops?.length\" class=\"cqa-graphql-operation-picker-section cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-graphql-operation-picker-section-head cqa-flex cqa-items-center cqa-gap-2 cqa-bg-[#F9FAFB] cqa-px-3 cqa-py-1.5 cqa-rounded-md cqa-border cqa-border-solid cqa-border-[#F3F4F6]\">\n <span class=\"cqa-graphql-operation-picker-section-label cqa-text-[12px] cqa-font-semibold\" [ngClass]=\"accent\">{{ label }}</span>\n <span class=\"cqa-graphql-operation-picker-section-count cqa-text-[11px] cqa-text-[#6B7280]\">\n {{ ops.length }} {{ ops.length === 1 ? 'operation' : 'operations' }}\n </span>\n </div>\n <div *ngFor=\"let op of ops; trackBy: trackByOperation\"\n class=\"cqa-graphql-operation-picker-row cqa-flex cqa-items-start cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2.5 cqa-rounded-md cqa-cursor-pointer cqa-border cqa-border-solid cqa-border-transparent hover:cqa-bg-[#F9FAFB] hover:cqa-border-[#E5E7EB] focus-within:cqa-bg-[#F5F3FF]\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Use operation ' + op.name\"\n (click)=\"onSelect(op)\"\n (keydown.enter)=\"onSelect(op)\"\n (keydown.space)=\"onSelect(op); $event.preventDefault()\">\n <span class=\"cqa-graphql-operation-picker-row-radio cqa-mt-1 cqa-shrink-0\">\n <span class=\"cqa-inline-block cqa-w-4 cqa-h-4 cqa-rounded-full cqa-border cqa-border-solid cqa-border-[#9CA3AF] cqa-bg-white\" aria-hidden=\"true\"></span>\n </span>\n <div class=\"cqa-graphql-operation-picker-row-body cqa-flex cqa-flex-col cqa-gap-0.5 cqa-flex-1 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-row-signature cqa-flex cqa-flex-wrap cqa-items-baseline cqa-gap-x-1 cqa-text-[13px] cqa-font-mono cqa-leading-[1.4] cqa-min-w-0\">\n <span class=\"cqa-text-[#111827] cqa-font-semibold\">{{ op.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">(</span>\n <ng-container *ngFor=\"let arg of op.args ?? []; let last = last\">\n <span class=\"cqa-text-[#374151]\">{{ arg.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">:&nbsp;</span>\n <span [ngClass]=\"returnTypeColorClass(op.kind)\">{{ arg.type }}</span>\n <span *ngIf=\"!last\" class=\"cqa-text-[#6B7280]\">,&nbsp;</span>\n </ng-container>\n <span class=\"cqa-text-[#6B7280]\">)</span>\n \n </div>\n <div *ngIf=\"op.description\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-graphql-operation-picker-row-description cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n <span>{{ op.description }}</span>\n <mat-icon *ngIf=\"op.returnType\" style=\"display:flex;font-size:14px;font-weight: 600;\" class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[#6B7280] cqa-mx-1\">arrow_forward</mat-icon>\n <span *ngIf=\"op.returnType\" [ngClass]=\"returnTypeColorClass(op.kind)\" class=\"cqa-font-semibold\">{{ op.returnType }}</span>\n </div>\n </div>\n <!-- <button type=\"button\"\n class=\"cqa-graphql-operation-picker-row-preview cqa-shrink-0 cqa-inline-flex cqa-items-center cqa-gap-1 cqa-bg-transparent cqa-border-0 cqa-cursor-pointer cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:cqa-underline focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#A5B4FC] cqa-rounded-md cqa-px-2 cqa-py-1\"\n [attr.aria-label]=\"'Preview operation ' + op.name\"\n (click)=\"onPreview(op, $event)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n <span>Preview</span>\n </button> -->\n </div>\n </div>\n </ng-template>\n</div>\n" }]
102
102
  }], propDecorators: { schemaSource: [{
103
103
  type: Input
104
104
  }], operations: [{
@@ -118,4 +118,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImpor
118
118
  }], preview: [{
119
119
  type: Output
120
120
  }] } });
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvYXBpLWVkaXQtc3RlcC9ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXIvZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvYXBpLWVkaXQtc3RlcC9ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXIvZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQWdEaEcsTUFBTSxPQUFPLCtCQUErQjtJQU41QztRQVNFLGlGQUFpRjtRQUN4RSxlQUFVLEdBQTZCLEVBQUUsQ0FBQztRQUNuRCwrRUFBK0U7UUFDdEUsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDOUIsOEdBQThHO1FBQ3JHLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFM0IscUdBQXFHO1FBQzNGLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzFDLHFHQUFxRztRQUMzRixzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQUN6RSxpRkFBaUY7UUFDdkUsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBbUMsQ0FBQztRQUM3RSwrRkFBK0Y7UUFDckYsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDNUMsaUdBQWlHO1FBQ3ZGLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQUUvRCx3RkFBd0Y7UUFDeEYsZUFBVSxHQUFHLEVBQUUsQ0FBQztLQTZFakI7SUEz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O3NCQUFwQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdJLElBQUk7c0JBQWIsTUFBTTtnQkFFRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsWUFBWTtzQkFBckIsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBRUcsT0FBTztzQkFBaEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFdoZXJlIHRoZSBvcGVyYXRpb25zIGxpc3QgY2FtZSBmcm9tLiBUaGUgaGVhZGVyIGJhciByZW5kZXJzIHRoZSBVUkwgcGx1c1xuICogdHlwZSAvIHF1ZXJ5IC8gbXV0YXRpb24gY291bnRzIHNvIHRoZSB1c2VyIGNhbiBzYW5pdHktY2hlY2sgdGhlIHNjaGVtYVxuICogc291cmNlIGJlZm9yZSBwaWNraW5nIGFuIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcmFwaFFMU2NoZW1hU291cmNlIHtcbiAgdXJsOiBzdHJpbmc7XG4gIHR5cGVDb3VudD86IG51bWJlcjtcbiAgcXVlcnlDb3VudD86IG51bWJlcjtcbiAgbXV0YXRpb25Db3VudD86IG51bWJlcjtcbiAgc3Vic2NyaXB0aW9uQ291bnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogT25lIHJvdyBpbiB0aGUgcGlja2VyLiBUaGUgcGFyZW50IChhcGktZWRpdC1zdGVwKSBidWlsZHMgdGhpcyBsaXN0IGZyb21cbiAqIHRoZSBpbnRyb3NwZWN0ZWQgc2NoZW1hIGFuZCBwYXNzZXMgaXQgdmlhIGBbb3BlcmF0aW9uc11gLiBPbiBzZWxlY3QsIHRoZVxuICogcGlja2VyIGVtaXRzIHRoZSB3aG9sZSBvcHRpb24gb2JqZWN0IHNvIHRoZSBjYWxsZXIgY2FuIHBhdGNoIHRoZSBHcmFwaFFMXG4gKiBlZGl0b3Igd2l0aCBgcXVlcnlgLCBgdmFyaWFibGVzYCwgYW5kIGBvcGVyYXRpb25OYW1lYCBpbiBvbmUgc2hvdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcmFwaFFMT3BlcmF0aW9uT3B0aW9uIHtcbiAgLyoqIFN0YWJsZSBpZGVudGlmaWVyIHVzZWQgYXMgKm5nRm9yIHRyYWNrQnkgYW5kIHRoZSByYWRpbydzIFt2YWx1ZV0uIFR5cGljYWxseSB0aGUgb3BlcmF0aW9uIG5hbWUuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWUgKGUuZy4gJ2dldEJvb2tpbmcnKS4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogU2VjdGlvbiBncm91cGluZyArIGNvbG91ci1jb2Rpbmcgb2YgdGhlIHJldHVybiB0eXBlIHBpbGwuICovXG4gIGtpbmQ6ICdxdWVyeScgfCAnbXV0YXRpb24nIHwgJ3N1YnNjcmlwdGlvbic7XG4gIC8qKiBJbmxpbmUgYXJndW1lbnQgbGlzdCwgZS5nLiBgW3sgbmFtZTogJ2lkJywgdHlwZTogJ0lEIScgfV1gLiBVc2VkIGZvciB0aGUgc2lnbmF0dXJlIGxpbmUuICovXG4gIGFyZ3M/OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+O1xuICAvKiogUmV0dXJuIHR5cGUgZGlzcGxheWVkIGFmdGVyIHRoZSBhcnJvdy4gQ29sb3VyZWQgYnkgYGtpbmRgLiAqL1xuICByZXR1cm5UeXBlPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaHVtYW4gZGVzY3JpcHRpb24gcmVuZGVyZWQgYmVsb3cgdGhlIHNpZ25hdHVyZSBsaW5lLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFByZS1idWlsdCBvcGVyYXRpb24gdGV4dCB0aGUgcGFyZW50IGRyb3BzIGludG8gdGhlIEdyYXBoUUwgUXVlcnkgZWRpdG9yLiAqL1xuICBxdWVyeTogc3RyaW5nO1xuICAvKiogSW5pdGlhbCB2YXJpYWJsZXM7IHBhcmVudCBKU09OLXN0cmluZ2lmaWVzIGludG8gdGhlIFZhcmlhYmxlcyBlZGl0b3IuICovXG4gIHZhcmlhYmxlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogT3BlcmF0aW9uIG5hbWUgd3JpdHRlbiBpbnRvIHRoZSBPcGVyYXRpb24gTmFtZSBmaWVsZCAodHlwaWNhbGx5IHNhbWUgYXMgYG5hbWVgKS4gKi9cbiAgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dyYXBocWwtb3BlcmF0aW9uLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxufSlcbmV4cG9ydCBjbGFzcyBHcmFwaFFMT3BlcmF0aW9uUGlja2VyQ29tcG9uZW50IHtcbiAgLyoqIFNjaGVtYSBzb3VyY2UgZGVzY3JpcHRvciAoVVJMICsgY291bnRzKS4gV2hlbiBvbWl0dGVkIHRoZSBoZWFkZXIgc2hvd3MgYW4gZW1wdHkgcGxhY2Vob2xkZXIuICovXG4gIEBJbnB1dCgpIHNjaGVtYVNvdXJjZT86IEdyYXBoUUxTY2hlbWFTb3VyY2U7XG4gIC8qKiBGbGF0IG9wZXJhdGlvbnMgbGlzdC4gUGlja2VyIHBhcnRpdGlvbnMgYnkgYGtpbmRgIGZvciB0aGUgc2VjdGlvbiBoZWFkZXJzLiAqL1xuICBASW5wdXQoKSBvcGVyYXRpb25zOiBHcmFwaFFMT3BlcmF0aW9uT3B0aW9uW10gPSBbXTtcbiAgLyoqIERpc3BsYXkgc3RhdGUgZm9yIHRoZSBcIkludHJvc3BlY3RlZFwiIC8gXCJQZW5kaW5nXCIgYmFkZ2UgaW4gdGhlIHRpdGxlIHJvdy4gKi9cbiAgQElucHV0KCkgaW50cm9zcGVjdGVkID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHRoZSBwYXJlbnQgaXMgZmV0Y2hpbmcvaW50cm9zcGVjdGluZyBhIHNjaGVtYS4gUmVuZGVycyBhIHNwaW5uZXIgaW5zdGVhZCBvZiB0aGUgZW1wdHkgc3RhdGUuICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZyA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBiYWNrIGFycm93IGFib3ZlIHRoZSB0aXRsZSAocmV0dXJucyB0byB0aGUgbWFpbiBzdGVwIDEgdmlldykuICovXG4gIEBPdXRwdXQoKSBiYWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhbiBvcGVyYXRpb24gcm93LiBQYXJlbnQgcGF0Y2hlcyBncmFwaFFMRm9ybSBhbmQgcG9wcyB0aGUgcGlja2VyLiAqL1xuICBAT3V0cHV0KCkgb3BlcmF0aW9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEdyYXBoUUxPcGVyYXRpb25PcHRpb24+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFJlLWludHJvc3BlY3Qg4oCUIHBhcmVudCByZS1mZXRjaGVzIHRoZSBzY2hlbWEuICovXG4gIEBPdXRwdXQoKSByZUludHJvc3BlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPEdyYXBoUUxTY2hlbWFTb3VyY2UgfCB1bmRlZmluZWQ+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIENoYW5nZSDigJQgcGFyZW50IHNob3dzIGEgVVJML2F1dGggcGlja2VyIChkZWZlcnJlZCBmb3Igbm93KS4gKi9cbiAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgUHJldmlldyBvbiBhIHJvdyDigJQgcGFyZW50IHNob3dzIGEgcHJldmlldyBwb3BvdmVyIChkZWZlcnJlZCkuICovXG4gIEBPdXRwdXQoKSBwcmV2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxHcmFwaFFMT3BlcmF0aW9uT3B0aW9uPigpO1xuXG4gIC8qKiBGaWx0ZXIgaW5wdXQgdmFsdWUuIFBsYWluIHN1YnN0cmluZyBtYXRjaCBhY3Jvc3MgbmFtZSAvIGRlc2NyaXB0aW9uIC8gcmV0dXJuVHlwZS4gKi9cbiAgZmlsdGVyVGVybSA9ICcnO1xuXG4gIC8qKiBPcGVyYXRpb25zIGN1cnJlbnRseSBzaG93biBhZnRlciBhcHBseWluZyBgZmlsdGVyVGVybWAuICovXG4gIGdldCBmaWx0ZXJlZE9wZXJhdGlvbnMoKTogR3JhcGhRTE9wZXJhdGlvbk9wdGlvbltdIHtcbiAgICBjb25zdCB0ZXJtID0gdGhpcy5maWx0ZXJUZXJtLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghdGVybSkgcmV0dXJuIHRoaXMub3BlcmF0aW9ucyB8fCBbXTtcbiAgICByZXR1cm4gKHRoaXMub3BlcmF0aW9ucyB8fCBbXSkuZmlsdGVyKChvKSA9PlxuICAgICAgby5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSkgfHxcbiAgICAgIChvLmRlc2NyaXB0aW9uID8/ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pIHx8XG4gICAgICAoby5yZXR1cm5UeXBlID8/ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pLFxuICAgICk7XG4gIH1cblxuICBnZXQgcXVlcnlPcGVyYXRpb25zKCk6IEdyYXBoUUxPcGVyYXRpb25PcHRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcGVyYXRpb25zLmZpbHRlcigobykgPT4gby5raW5kID09PSAncXVlcnknKTtcbiAgfVxuICBnZXQgbXV0YXRpb25PcGVyYXRpb25zKCk6IEdyYXBoUUxPcGVyYXRpb25PcHRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcGVyYXRpb25zLmZpbHRlcigobykgPT4gby5raW5kID09PSAnbXV0YXRpb24nKTtcbiAgfVxuICBnZXQgc3Vic2NyaXB0aW9uT3BlcmF0aW9ucygpOiBHcmFwaFFMT3BlcmF0aW9uT3B0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkT3BlcmF0aW9ucy5maWx0ZXIoKG8pID0+IG8ua2luZCA9PT0gJ3N1YnNjcmlwdGlvbicpO1xuICB9XG5cbiAgLyoqIENvbnZlbmllbmNlOiB0b3RhbCBzY2hlbWEtc291cmNlIGNvdW50IGxpbmUsIGUuZy4gXCIzOCB0eXBlcyDCtyA0IHF1ZXJpZXMgwrcgMyBtdXRhdGlvbnNcIi4gKi9cbiAgZ2V0IGhlYWRlckNvdW50cygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHMgPSB0aGlzLnNjaGVtYVNvdXJjZTtcbiAgICBpZiAoIXMpIHJldHVybiAnJztcbiAgICBpZiAocy50eXBlQ291bnQgIT0gbnVsbCkgcGFydHMucHVzaChgJHtzLnR5cGVDb3VudH0gdHlwZXNgKTtcbiAgICBpZiAocy5xdWVyeUNvdW50ICE9IG51bGwpIHBhcnRzLnB1c2goYCR7cy5xdWVyeUNvdW50fSAke3MucXVlcnlDb3VudCA9PT0gMSA/ICdxdWVyeScgOiAncXVlcmllcyd9YCk7XG4gICAgaWYgKHMubXV0YXRpb25Db3VudCAhPSBudWxsKSBwYXJ0cy5wdXNoKGAke3MubXV0YXRpb25Db3VudH0gJHtzLm11dGF0aW9uQ291bnQgPT09IDEgPyAnbXV0YXRpb24nIDogJ211dGF0aW9ucyd9YCk7XG4gICAgaWYgKHMuc3Vic2NyaXB0aW9uQ291bnQgIT0gbnVsbCAmJiBzLnN1YnNjcmlwdGlvbkNvdW50ID4gMCkge1xuICAgICAgcGFydHMucHVzaChgJHtzLnN1YnNjcmlwdGlvbkNvdW50fSAke3Muc3Vic2NyaXB0aW9uQ291bnQgPT09IDEgPyAnc3Vic2NyaXB0aW9uJyA6ICdzdWJzY3JpcHRpb25zJ31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyDCtyAnKTtcbiAgfVxuXG4gIG9uQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLmJhY2suZW1pdCgpO1xuICB9XG5cbiAgb25TZWxlY3Qob3A6IEdyYXBoUUxPcGVyYXRpb25PcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLm9wZXJhdGlvblNlbGVjdGVkLmVtaXQob3ApO1xuICB9XG5cbiAgb25QcmV2aWV3KG9wOiBHcmFwaFFMT3BlcmF0aW9uT3B0aW9uLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBTdG9wIHRoZSBjbGljayBmcm9tIGFsc28gYnViYmxpbmcgdG8gdGhlIHJvdydzIHNlbGVjdCBoYW5kbGVyIOKAlCBQcmV2aWV3IGlzIGEgcGVlayxcbiAgICAvLyBub3QgYSBjb21taXQuXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5wcmV2aWV3LmVtaXQob3ApO1xuICB9XG5cbiAgb25SZUludHJvc3BlY3QoKTogdm9pZCB7XG4gICAgdGhpcy5yZUludHJvc3BlY3QuZW1pdCh0aGlzLnNjaGVtYVNvdXJjZSk7XG4gIH1cblxuICBvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KCk7XG4gIH1cblxuICBvbkZpbHRlckNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJUZXJtID0gdmFsdWUgPz8gJyc7XG4gIH1cblxuICB0cmFja0J5T3BlcmF0aW9uKF9pbmRleDogbnVtYmVyLCBvcDogR3JhcGhRTE9wZXJhdGlvbk9wdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIG9wLmlkO1xuICB9XG5cbiAgLyoqIFRhaWx3aW5kIHRleHQgY29sb3VyIGZvciB0aGUgcmV0dXJuLXR5cGUgcGlsbCwga2V5ZWQgYnkgb3BlcmF0aW9uIGtpbmQuICovXG4gIHJldHVyblR5cGVDb2xvckNsYXNzKGtpbmQ6IEdyYXBoUUxPcGVyYXRpb25PcHRpb25bJ2tpbmQnXSk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlICdtdXRhdGlvbic6ICAgICAgcmV0dXJuICdjcWEtdGV4dC1bI0Q5NzcwNl0nOyAvLyBhbWJlci02MDBcbiAgICAgIGNhc2UgJ3N1YnNjcmlwdGlvbic6ICByZXR1cm4gJ2NxYS10ZXh0LVsjN0MzQUVEXSc7IC8vIHZpb2xldC02MDBcbiAgICAgIGNhc2UgJ3F1ZXJ5JzpcbiAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsjMDU5NjY5XSc7IC8vIGVtZXJhbGQtNjAwXG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlciBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00IGNxYS1iZy13aGl0ZSBjcWEtdy1mdWxsXCI+XG5cbiAgPCEtLSBUaXRsZSByb3c6IGJhY2sgYXJyb3cgKyBoZWFkaW5nICsgSW50cm9zcGVjdGVkIGJhZGdlIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1oZWFkZXIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWN1cnNvci1wb2ludGVyIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGRcIiAoY2xpY2spPVwib25CYWNrKClcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS10ZXh0LVsxOHB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLWZvbnQtc2VtaWJvbGRcIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmb250LXNpemU6MThweDtmb250LXdlaWdodDogNjAwO1wiPmFycm93X2JhY2s8L21hdC1pY29uPlxuICAgIDwvZGl2PlxuICAgIDxoMyBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItdGl0bGUgY3FhLW0tMCBjcWEtdGV4dC1bMThweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1sZWFkaW5nLVsxLjI1XVwiPlxuICAgICAgUGljayBhIEdyYXBoUUwgb3BlcmF0aW9uXG4gICAgPC9oMz5cbiAgICA8c3BhbiAqbmdJZj1cImludHJvc3BlY3RlZFwiXG4gICAgICBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItYmFkZ2UgY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1weC0yIGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1bI0VERTlGRV0gY3FhLXRleHQtWyM3QzNBRURdIGNxYS10ZXh0LVsxMXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWxlYWRpbmctWzEuNF1cIj5cbiAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPuKXhjwvc3Bhbj4gSW50cm9zcGVjdGVkXG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cblxuICA8IS0tIFN1YmhlYWRpbmcgLS0+XG4gIDxwIGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1zdWJoZWFkaW5nIGNxYS1tLTAgY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbGVhZGluZy1bMS41XVwiPlxuICAgIFBoYXNlIDEgc3VwcG9ydHMgb25lIG9wZXJhdGlvbiBwZXIgdGVzdCBzdGVwLiBTZWxlY3Qgb25lIHRvIGF1dG8tZmlsbCB0aGUgcmVxdWVzdC5cbiAgPC9wPlxuXG4gIDwhLS0gU2NoZW1hIHNvdXJjZSBiYXI6IFVSTCArIGNvdW50cyArIFJlLWludHJvc3BlY3QgLyBDaGFuZ2UgYnV0dG9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItc291cmNlIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTMgY3FhLWJnLVsjRUVGMkZGXSBjcWEtcm91bmRlZC1sZyBjcWEtcHgtNCBjcWEtcHktMyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UwRTdGRl1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1zb3VyY2UtaW5mbyBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0wLjUgY3FhLW1pbi13LTBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLXNvdXJjZS1sYWJlbCBjcWEtdGV4dC1bMTBweF0gY3FhLXVwcGVyY2FzZSBjcWEtdHJhY2tpbmctd2lkZSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLWZvbnQtc2VtaWJvbGRcIj5cbiAgICAgICAgU2NoZW1hIHNvdXJjZVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2NoZW1hU291cmNlPy51cmxcIlxuICAgICAgICBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItc291cmNlLXVybCBjcWEtdGV4dC1bMTNweF0gY3FhLWZvbnQtbW9ubyBjcWEtdGV4dC1bIzFGMjkzN10gY3FhLXRydW5jYXRlIGNxYS1taW4tdy0wXCJcbiAgICAgICAgW3RpdGxlXT1cInNjaGVtYVNvdXJjZT8udXJsXCI+XG4gICAgICAgIHt7IHNjaGVtYVNvdXJjZT8udXJsIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhc2NoZW1hU291cmNlPy51cmxcIlxuICAgICAgICBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItc291cmNlLXVybCBjcWEtdGV4dC1bMTNweF0gY3FhLWl0YWxpYyBjcWEtdGV4dC1bIzZCNzI4MF1cIj5cbiAgICAgICAgTm8gc2NoZW1hIGxvYWRlZCB5ZXQuXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1zb3VyY2UtbWV0YSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtc2hyaW5rLTBcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiaGVhZGVyQ291bnRzXCIgY2xhc3M9XCJjcWEtZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLXNvdXJjZS1jb3VudHMgY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNEI1NTYzXVwiPlxuICAgICAgICB7eyBoZWFkZXJDb3VudHMgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBbaWNvbl09XCIncmVmcmVzaCdcIiBidG5TaXplPVwibWRcIiB0ZXh0PVwiUmUtaW50cm9zcGVjdFwiXG4gICAgICAgIGN1c3RvbUNsYXNzPVwiIWNxYS1iZy13aGl0ZSAhY3FhLXRleHQtWyMzNzQxNTFdICFjcWEtYm9yZGVyICFjcWEtYm9yZGVyLXNvbGlkICFjcWEtYm9yZGVyLVsjRDFENURCXSBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGhvdmVyOiFjcWEtYmctWyNGOUZBRkJdXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25SZUludHJvc3BlY3QoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgYnRuU2l6ZT1cIm1kXCIgdGV4dD1cIkNoYW5nZVwiXG4gICAgICAgIGN1c3RvbUNsYXNzPVwiIWNxYS10ZXh0LVsjNEY0NkU1XSBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGhvdmVyOiFjcWEtYmctWyNFRUYyRkZdXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25DaGFuZ2UoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEZpbHRlciAtLT5cbiAgPGNxYS1jdXN0b20taW5wdXRcbiAgICBbKHZhbHVlKV09XCJmaWx0ZXJUZXJtXCJcbiAgICBbbGFiZWxdPVwiJydcIlxuICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIG9wZXJhdGlvbnMuLi5cIlxuICAgIFtmdWxsV2lkdGhdPVwidHJ1ZVwiXG4gICAgc2l6ZT1cIm1kXCJcbiAgICBhcmlhTGFiZWw9XCJGaWx0ZXIgR3JhcGhRTCBvcGVyYXRpb25zXCI+XG4gIDwvY3FhLWN1c3RvbS1pbnB1dD5cblxuICA8IS0tIExvYWRpbmcgc3Bpbm5lciBzaG93biB3aGlsZSB0aGUgcGFyZW50IGlzIGludHJvc3BlY3RpbmcuIFJlcGxhY2VzIHRoZSBlbXB0eSBzdGF0ZS4gLS0+XG4gIDxkaXYgKm5nSWY9XCJpc0xvYWRpbmdcIlxuICAgIGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1sb2FkaW5nIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtZ2FwLTMgY3FhLXB5LTEyIGNxYS10ZXh0LWNlbnRlciBjcWEtYmctWyNGOUZBRkJdIGNxYS1yb3VuZGVkLW1kIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bI0U1RTdFQl1cIj5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItc3Bpbm5lciBjcWEtaW5saW5lLWJsb2NrIGNxYS13LTcgY3FhLWgtNyBjcWEtcm91bmRlZC1mdWxsIGNxYS1ib3JkZXItMiBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNFNUU3RUJdIGNxYS1ib3JkZXItdC1bIzRGNDZFNV0gY3FhLWFuaW1hdGUtc3BpblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxM3B4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+TG9hZGluZyBzY2hlbWHigKY8L3NwYW4+XG4gICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM2QjcyODBdXCI+SW50cm9zcGVjdGluZyBHcmFwaFFMIGVuZHBvaW50LCB0aGlzIG1heSB0YWtlIGEgbW9tZW50Ljwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBFbXB0eSBzdGF0ZSB3aGVuIG5vIG9wZXJhdGlvbnMgYXJlIGxvYWRlZCB5ZXQgKG9yIGZpbHRlciBydWxlcyBldmVyeXRoaW5nIG91dCkuIC0tPlxuICA8ZGl2ICpuZ0lmPVwiIWlzTG9hZGluZyAmJiAhZmlsdGVyZWRPcGVyYXRpb25zLmxlbmd0aFwiXG4gICAgY2xhc3M9XCJjcWEtZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLWVtcHR5IGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtZ2FwLTIgY3FhLXB5LTEwIGNxYS10ZXh0LWNlbnRlciBjcWEtYmctWyNGOUZBRkJdIGNxYS1yb3VuZGVkLW1kIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1kYXNoZWQgY3FhLWJvcmRlci1bI0U1RTdFQl1cIj5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxM3B4XSBjcWEtZm9udC1tZWRpdW0gY3FhLXRleHQtWyMzNzQxNTFdXCI+XG4gICAgICB7eyBmaWx0ZXJUZXJtID8gJ05vIG9wZXJhdGlvbnMgbWF0Y2ggeW91ciBmaWx0ZXIuJyA6ICdObyBvcGVyYXRpb25zIGF2YWlsYWJsZS4nIH19XG4gICAgPC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwiIWZpbHRlclRlcm1cIiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzZCNzI4MF1cIj5cbiAgICAgIENsaWNrIDxzdHJvbmc+UmUtaW50cm9zcGVjdDwvc3Ryb25nPiBhYm92ZSB0byBsb2FkIHRoZSBzY2hlbWEuXG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cblxuICA8IS0tIE9wZXJhdGlvbiBzZWN0aW9ucyAoUXVlcmllcyAvIE11dGF0aW9ucyAvIFN1YnNjcmlwdGlvbnMpIC0tPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzTG9hZGluZyAmJiBmaWx0ZXJlZE9wZXJhdGlvbnMubGVuZ3RoXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm9wU2VjdGlvbjsgY29udGV4dDogeyAkaW1wbGljaXQ6IHF1ZXJ5T3BlcmF0aW9ucywgbGFiZWw6ICdRdWVyaWVzJywgYWNjZW50OiAnY3FhLXRleHQtWyMwNTk2NjldJyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm9wU2VjdGlvbjsgY29udGV4dDogeyAkaW1wbGljaXQ6IG11dGF0aW9uT3BlcmF0aW9ucywgbGFiZWw6ICdNdXRhdGlvbnMnLCBhY2NlbnQ6ICdjcWEtdGV4dC1bI0Q5NzcwNl0nIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwib3BTZWN0aW9uOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogc3Vic2NyaXB0aW9uT3BlcmF0aW9ucywgbGFiZWw6ICdTdWJzY3JpcHRpb25zJywgYWNjZW50OiAnY3FhLXRleHQtWyM3QzNBRURdJyB9XCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gRm9vdGVyOiBzZWxlY3Rpb24gc3VtbWFyeS4gTm8gQmFjayAvIFVzZSBidXR0b25zIOKAlCBjbGlja2luZyBhIHJvdyBjb21taXRzICsgcmV0dXJucy4gLS0+XG4gIDxkaXYgKm5nSWY9XCIhaXNMb2FkaW5nICYmIGZpbHRlcmVkT3BlcmF0aW9ucy5sZW5ndGhcIiBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItZm9vdGVyIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLXB0LTIgY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXVwiPlxuICAgIDxzcGFuPkNsaWNrIGFuIG9wZXJhdGlvbiB0byB1c2UgaXQg4oCUIHRoZSBwaWNrZXIgY2xvc2VzIGFuZCB0aGUgcmVxdWVzdCBpcyBhdXRvLWZpbGxlZC48L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDwhLS0g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIFNlY3Rpb24gdGVtcGxhdGUg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIC0tPlxuICA8bmctdGVtcGxhdGUgI29wU2VjdGlvbiBsZXQtb3BzIGxldC1sYWJlbD1cImxhYmVsXCIgbGV0LWFjY2VudD1cImFjY2VudFwiPlxuICAgIDxkaXYgKm5nSWY9XCJvcHM/Lmxlbmd0aFwiIGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1zZWN0aW9uIGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLXNlY3Rpb24taGVhZCBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMiBjcWEtYmctWyNGOUZBRkJdIGNxYS1weC0zIGNxYS1weS0xLjUgY3FhLXJvdW5kZWQtbWQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLXNvbGlkIGNxYS1ib3JkZXItWyNGM0Y0RjZdXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1zZWN0aW9uLWxhYmVsIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1zZW1pYm9sZFwiIFtuZ0NsYXNzXT1cImFjY2VudFwiPnt7IGxhYmVsIH19PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItc2VjdGlvbi1jb3VudCBjcWEtdGV4dC1bMTFweF0gY3FhLXRleHQtWyM2QjcyODBdXCI+XG4gICAgICAgICAge3sgb3BzLmxlbmd0aCB9fSB7eyBvcHMubGVuZ3RoID09PSAxID8gJ29wZXJhdGlvbicgOiAnb3BlcmF0aW9ucycgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBvcCBvZiBvcHM7IHRyYWNrQnk6IHRyYWNrQnlPcGVyYXRpb25cIlxuICAgICAgICBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItcm93IGNxYS1mbGV4IGNxYS1pdGVtcy1zdGFydCBjcWEtanVzdGlmeS1iZXR3ZWVuIGNxYS1nYXAtMyBjcWEtcHgtMyBjcWEtcHktMi41IGNxYS1yb3VuZGVkLW1kIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci10cmFuc3BhcmVudCBob3ZlcjpjcWEtYmctWyNGOUZBRkJdIGhvdmVyOmNxYS1ib3JkZXItWyNFNUU3RUJdIGZvY3VzLXdpdGhpbjpjcWEtYmctWyNGNUYzRkZdXCJcbiAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ1VzZSBvcGVyYXRpb24gJyArIG9wLm5hbWVcIlxuICAgICAgICAoY2xpY2spPVwib25TZWxlY3Qob3ApXCJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25TZWxlY3Qob3ApXCJcbiAgICAgICAgKGtleWRvd24uc3BhY2UpPVwib25TZWxlY3Qob3ApOyAkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItcm93LXJhZGlvIGNxYS1tdC0xIGNxYS1zaHJpbmstMFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWlubGluZS1ibG9jayBjcWEtdy00IGNxYS1oLTQgY3FhLXJvdW5kZWQtZnVsbCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bIzlDQTNBRl0gY3FhLWJnLXdoaXRlXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLXJvdy1ib2R5IGNxYS1mbGV4IGNxYS1mbGV4LWNvbCBjcWEtZ2FwLTAuNSBjcWEtZmxleC0xIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItcm93LXNpZ25hdHVyZSBjcWEtZmxleCBjcWEtZmxleC13cmFwIGNxYS1pdGVtcy1iYXNlbGluZSBjcWEtZ2FwLXgtMSBjcWEtdGV4dC1bMTNweF0gY3FhLWZvbnQtbW9ubyBjcWEtbGVhZGluZy1bMS40XSBjcWEtbWluLXctMFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzExMTgyN10gY3FhLWZvbnQtc2VtaWJvbGRcIj57eyBvcC5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF1cIj4oPC9zcGFuPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYXJnIG9mIG9wLmFyZ3MgPz8gW107IGxldCBsYXN0ID0gbGFzdFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMzc0MTUxXVwiPnt7IGFyZy5uYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXVwiPjombmJzcDs8L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInJldHVyblR5cGVDb2xvckNsYXNzKG9wLmtpbmQpXCI+e3sgYXJnLnR5cGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWxhc3RcIiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXVwiPiwmbmJzcDs8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdXCI+KTwvc3Bhbj5cbiAgICAgICAgICAgIFxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcC5kZXNjcmlwdGlvblwiXG4gICAgICAgICAgICBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItcm93LWRlc2NyaXB0aW9uIGNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLWxlYWRpbmctWzEuNV1cIj5cbiAgICAgICAgICAgIDxzcGFuPnt7IG9wLmRlc2NyaXB0aW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwib3AucmV0dXJuVHlwZVwiIHN0eWxlPVwiZGlzcGxheTpmbGV4O2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OiA2MDA7XCIgY2xhc3M9XCJjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1qdXN0aWZ5LWNlbnRlciBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLW14LTFcIj5hcnJvd19mb3J3YXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwib3AucmV0dXJuVHlwZVwiIFtuZ0NsYXNzXT1cInJldHVyblR5cGVDb2xvckNsYXNzKG9wLmtpbmQpXCIgY2xhc3M9XCJjcWEtZm9udC1zZW1pYm9sZFwiPnt7IG9wLnJldHVyblR5cGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJjcWEtZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLXJvdy1wcmV2aWV3IGNxYS1zaHJpbmstMCBjcWEtaW5saW5lLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLWJnLXRyYW5zcGFyZW50IGNxYS1ib3JkZXItMCBjcWEtY3Vyc29yLXBvaW50ZXIgY3FhLXRleHQtWyM0RjQ2RTVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gaG92ZXI6Y3FhLXVuZGVybGluZSBmb2N1czpjcWEtb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctMiBmb2N1cy12aXNpYmxlOmNxYS1yaW5nLVsjQTVCNEZDXSBjcWEtcm91bmRlZC1tZCBjcWEtcHgtMiBjcWEtcHktMVwiXG4gICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInUHJldmlldyBvcGVyYXRpb24gJyArIG9wLm5hbWVcIlxuICAgICAgICAgIChjbGljayk9XCJvblByZXZpZXcob3AsICRldmVudClcIj5cbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgIDxwYXRoIGQ9XCJNMiAxMnMzLjUtNyAxMC03IDEwIDcgMTAgNy0zLjUgNy0xMCA3LTEwLTctMTAtN3pcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIvPlxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjEyXCIgY3k9XCIxMlwiIHI9XCIzXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMlwiLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8c3Bhbj5QcmV2aWV3PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj4gLS0+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cbjwvZGl2PlxuIl19
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvYXBpLWVkaXQtc3RlcC9ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXIvZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvdGVzdC1jYXNlLWRldGFpbHMvYXBpLWVkaXQtc3RlcC9ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXIvZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQWdEaEcsTUFBTSxPQUFPLCtCQUErQjtJQU41QztRQVNFLGlGQUFpRjtRQUN4RSxlQUFVLEdBQTZCLEVBQUUsQ0FBQztRQUNuRCwrRUFBK0U7UUFDdEUsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDOUIsOEdBQThHO1FBQ3JHLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFFM0IscUdBQXFHO1FBQzNGLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzFDLHFHQUFxRztRQUMzRixzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQUN6RSxpRkFBaUY7UUFDdkUsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBbUMsQ0FBQztRQUM3RSwrRkFBK0Y7UUFDckYsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDNUMsaUdBQWlHO1FBQ3ZGLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBMEIsQ0FBQztRQUUvRCx3RkFBd0Y7UUFDeEYsZUFBVSxHQUFHLEVBQUUsQ0FBQztLQTZFakI7SUEz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O3NCQUFwQixLQUFLO2dCQUVHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUdJLElBQUk7c0JBQWIsTUFBTTtnQkFFRyxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsWUFBWTtzQkFBckIsTUFBTTtnQkFFRyxNQUFNO3NCQUFmLE1BQU07Z0JBRUcsT0FBTztzQkFBaEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFdoZXJlIHRoZSBvcGVyYXRpb25zIGxpc3QgY2FtZSBmcm9tLiBUaGUgaGVhZGVyIGJhciByZW5kZXJzIHRoZSBVUkwgcGx1c1xuICogdHlwZSAvIHF1ZXJ5IC8gbXV0YXRpb24gY291bnRzIHNvIHRoZSB1c2VyIGNhbiBzYW5pdHktY2hlY2sgdGhlIHNjaGVtYVxuICogc291cmNlIGJlZm9yZSBwaWNraW5nIGFuIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcmFwaFFMU2NoZW1hU291cmNlIHtcbiAgdXJsOiBzdHJpbmc7XG4gIHR5cGVDb3VudD86IG51bWJlcjtcbiAgcXVlcnlDb3VudD86IG51bWJlcjtcbiAgbXV0YXRpb25Db3VudD86IG51bWJlcjtcbiAgc3Vic2NyaXB0aW9uQ291bnQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogT25lIHJvdyBpbiB0aGUgcGlja2VyLiBUaGUgcGFyZW50IChhcGktZWRpdC1zdGVwKSBidWlsZHMgdGhpcyBsaXN0IGZyb21cbiAqIHRoZSBpbnRyb3NwZWN0ZWQgc2NoZW1hIGFuZCBwYXNzZXMgaXQgdmlhIGBbb3BlcmF0aW9uc11gLiBPbiBzZWxlY3QsIHRoZVxuICogcGlja2VyIGVtaXRzIHRoZSB3aG9sZSBvcHRpb24gb2JqZWN0IHNvIHRoZSBjYWxsZXIgY2FuIHBhdGNoIHRoZSBHcmFwaFFMXG4gKiBlZGl0b3Igd2l0aCBgcXVlcnlgLCBgdmFyaWFibGVzYCwgYW5kIGBvcGVyYXRpb25OYW1lYCBpbiBvbmUgc2hvdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHcmFwaFFMT3BlcmF0aW9uT3B0aW9uIHtcbiAgLyoqIFN0YWJsZSBpZGVudGlmaWVyIHVzZWQgYXMgKm5nRm9yIHRyYWNrQnkgYW5kIHRoZSByYWRpbydzIFt2YWx1ZV0uIFR5cGljYWxseSB0aGUgb3BlcmF0aW9uIG5hbWUuICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWUgKGUuZy4gJ2dldEJvb2tpbmcnKS4gKi9cbiAgbmFtZTogc3RyaW5nO1xuICAvKiogU2VjdGlvbiBncm91cGluZyArIGNvbG91ci1jb2Rpbmcgb2YgdGhlIHJldHVybiB0eXBlIHBpbGwuICovXG4gIGtpbmQ6ICdxdWVyeScgfCAnbXV0YXRpb24nIHwgJ3N1YnNjcmlwdGlvbic7XG4gIC8qKiBJbmxpbmUgYXJndW1lbnQgbGlzdCwgZS5nLiBgW3sgbmFtZTogJ2lkJywgdHlwZTogJ0lEIScgfV1gLiBVc2VkIGZvciB0aGUgc2lnbmF0dXJlIGxpbmUuICovXG4gIGFyZ3M/OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+O1xuICAvKiogUmV0dXJuIHR5cGUgZGlzcGxheWVkIGFmdGVyIHRoZSBhcnJvdy4gQ29sb3VyZWQgYnkgYGtpbmRgLiAqL1xuICByZXR1cm5UeXBlPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaHVtYW4gZGVzY3JpcHRpb24gcmVuZGVyZWQgYmVsb3cgdGhlIHNpZ25hdHVyZSBsaW5lLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqIFByZS1idWlsdCBvcGVyYXRpb24gdGV4dCB0aGUgcGFyZW50IGRyb3BzIGludG8gdGhlIEdyYXBoUUwgUXVlcnkgZWRpdG9yLiAqL1xuICBxdWVyeTogc3RyaW5nO1xuICAvKiogSW5pdGlhbCB2YXJpYWJsZXM7IHBhcmVudCBKU09OLXN0cmluZ2lmaWVzIGludG8gdGhlIFZhcmlhYmxlcyBlZGl0b3IuICovXG4gIHZhcmlhYmxlcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogT3BlcmF0aW9uIG5hbWUgd3JpdHRlbiBpbnRvIHRoZSBPcGVyYXRpb24gTmFtZSBmaWVsZCAodHlwaWNhbGx5IHNhbWUgYXMgYG5hbWVgKS4gKi9cbiAgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjcWEtZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dyYXBocWwtb3BlcmF0aW9uLXBpY2tlci5jb21wb25lbnQuaHRtbCcsXG4gIGhvc3Q6IHsgY2xhc3M6ICdjcWEtdWktcm9vdCcgfSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0LFxufSlcbmV4cG9ydCBjbGFzcyBHcmFwaFFMT3BlcmF0aW9uUGlja2VyQ29tcG9uZW50IHtcbiAgLyoqIFNjaGVtYSBzb3VyY2UgZGVzY3JpcHRvciAoVVJMICsgY291bnRzKS4gV2hlbiBvbWl0dGVkIHRoZSBoZWFkZXIgc2hvd3MgYW4gZW1wdHkgcGxhY2Vob2xkZXIuICovXG4gIEBJbnB1dCgpIHNjaGVtYVNvdXJjZT86IEdyYXBoUUxTY2hlbWFTb3VyY2U7XG4gIC8qKiBGbGF0IG9wZXJhdGlvbnMgbGlzdC4gUGlja2VyIHBhcnRpdGlvbnMgYnkgYGtpbmRgIGZvciB0aGUgc2VjdGlvbiBoZWFkZXJzLiAqL1xuICBASW5wdXQoKSBvcGVyYXRpb25zOiBHcmFwaFFMT3BlcmF0aW9uT3B0aW9uW10gPSBbXTtcbiAgLyoqIERpc3BsYXkgc3RhdGUgZm9yIHRoZSBcIkludHJvc3BlY3RlZFwiIC8gXCJQZW5kaW5nXCIgYmFkZ2UgaW4gdGhlIHRpdGxlIHJvdy4gKi9cbiAgQElucHV0KCkgaW50cm9zcGVjdGVkID0gZmFsc2U7XG4gIC8qKiBUcnVlIHdoaWxlIHRoZSBwYXJlbnQgaXMgZmV0Y2hpbmcvaW50cm9zcGVjdGluZyBhIHNjaGVtYS4gUmVuZGVycyBhIHNwaW5uZXIgaW5zdGVhZCBvZiB0aGUgZW1wdHkgc3RhdGUuICovXG4gIEBJbnB1dCgpIGlzTG9hZGluZyA9IGZhbHNlO1xuXG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBiYWNrIGFycm93IGFib3ZlIHRoZSB0aXRsZSAocmV0dXJucyB0byB0aGUgbWFpbiBzdGVwIDEgdmlldykuICovXG4gIEBPdXRwdXQoKSBiYWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICAvKiogRW1pdHRlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhbiBvcGVyYXRpb24gcm93LiBQYXJlbnQgcGF0Y2hlcyBncmFwaFFMRm9ybSBhbmQgcG9wcyB0aGUgcGlja2VyLiAqL1xuICBAT3V0cHV0KCkgb3BlcmF0aW9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEdyYXBoUUxPcGVyYXRpb25PcHRpb24+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIFJlLWludHJvc3BlY3Qg4oCUIHBhcmVudCByZS1mZXRjaGVzIHRoZSBzY2hlbWEuICovXG4gIEBPdXRwdXQoKSByZUludHJvc3BlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPEdyYXBoUUxTY2hlbWFTb3VyY2UgfCB1bmRlZmluZWQ+KCk7XG4gIC8qKiBFbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIENoYW5nZSDigJQgcGFyZW50IHNob3dzIGEgVVJML2F1dGggcGlja2VyIChkZWZlcnJlZCBmb3Igbm93KS4gKi9cbiAgQE91dHB1dCgpIGNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgLyoqIEVtaXR0ZWQgd2hlbiB0aGUgdXNlciBjbGlja3MgUHJldmlldyBvbiBhIHJvdyDigJQgcGFyZW50IHNob3dzIGEgcHJldmlldyBwb3BvdmVyIChkZWZlcnJlZCkuICovXG4gIEBPdXRwdXQoKSBwcmV2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxHcmFwaFFMT3BlcmF0aW9uT3B0aW9uPigpO1xuXG4gIC8qKiBGaWx0ZXIgaW5wdXQgdmFsdWUuIFBsYWluIHN1YnN0cmluZyBtYXRjaCBhY3Jvc3MgbmFtZSAvIGRlc2NyaXB0aW9uIC8gcmV0dXJuVHlwZS4gKi9cbiAgZmlsdGVyVGVybSA9ICcnO1xuXG4gIC8qKiBPcGVyYXRpb25zIGN1cnJlbnRseSBzaG93biBhZnRlciBhcHBseWluZyBgZmlsdGVyVGVybWAuICovXG4gIGdldCBmaWx0ZXJlZE9wZXJhdGlvbnMoKTogR3JhcGhRTE9wZXJhdGlvbk9wdGlvbltdIHtcbiAgICBjb25zdCB0ZXJtID0gdGhpcy5maWx0ZXJUZXJtLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmICghdGVybSkgcmV0dXJuIHRoaXMub3BlcmF0aW9ucyB8fCBbXTtcbiAgICByZXR1cm4gKHRoaXMub3BlcmF0aW9ucyB8fCBbXSkuZmlsdGVyKChvKSA9PlxuICAgICAgby5uYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXModGVybSkgfHxcbiAgICAgIChvLmRlc2NyaXB0aW9uID8/ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pIHx8XG4gICAgICAoby5yZXR1cm5UeXBlID8/ICcnKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRlcm0pLFxuICAgICk7XG4gIH1cblxuICBnZXQgcXVlcnlPcGVyYXRpb25zKCk6IEdyYXBoUUxPcGVyYXRpb25PcHRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcGVyYXRpb25zLmZpbHRlcigobykgPT4gby5raW5kID09PSAncXVlcnknKTtcbiAgfVxuICBnZXQgbXV0YXRpb25PcGVyYXRpb25zKCk6IEdyYXBoUUxPcGVyYXRpb25PcHRpb25bXSB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRPcGVyYXRpb25zLmZpbHRlcigobykgPT4gby5raW5kID09PSAnbXV0YXRpb24nKTtcbiAgfVxuICBnZXQgc3Vic2NyaXB0aW9uT3BlcmF0aW9ucygpOiBHcmFwaFFMT3BlcmF0aW9uT3B0aW9uW10ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlcmVkT3BlcmF0aW9ucy5maWx0ZXIoKG8pID0+IG8ua2luZCA9PT0gJ3N1YnNjcmlwdGlvbicpO1xuICB9XG5cbiAgLyoqIENvbnZlbmllbmNlOiB0b3RhbCBzY2hlbWEtc291cmNlIGNvdW50IGxpbmUsIGUuZy4gXCIzOCB0eXBlcyDCtyA0IHF1ZXJpZXMgwrcgMyBtdXRhdGlvbnNcIi4gKi9cbiAgZ2V0IGhlYWRlckNvdW50cygpOiBzdHJpbmcge1xuICAgIGNvbnN0IHBhcnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHMgPSB0aGlzLnNjaGVtYVNvdXJjZTtcbiAgICBpZiAoIXMpIHJldHVybiAnJztcbiAgICBpZiAocy50eXBlQ291bnQgIT0gbnVsbCkgcGFydHMucHVzaChgJHtzLnR5cGVDb3VudH0gdHlwZXNgKTtcbiAgICBpZiAocy5xdWVyeUNvdW50ICE9IG51bGwpIHBhcnRzLnB1c2goYCR7cy5xdWVyeUNvdW50fSAke3MucXVlcnlDb3VudCA9PT0gMSA/ICdxdWVyeScgOiAncXVlcmllcyd9YCk7XG4gICAgaWYgKHMubXV0YXRpb25Db3VudCAhPSBudWxsKSBwYXJ0cy5wdXNoKGAke3MubXV0YXRpb25Db3VudH0gJHtzLm11dGF0aW9uQ291bnQgPT09IDEgPyAnbXV0YXRpb24nIDogJ211dGF0aW9ucyd9YCk7XG4gICAgaWYgKHMuc3Vic2NyaXB0aW9uQ291bnQgIT0gbnVsbCAmJiBzLnN1YnNjcmlwdGlvbkNvdW50ID4gMCkge1xuICAgICAgcGFydHMucHVzaChgJHtzLnN1YnNjcmlwdGlvbkNvdW50fSAke3Muc3Vic2NyaXB0aW9uQ291bnQgPT09IDEgPyAnc3Vic2NyaXB0aW9uJyA6ICdzdWJzY3JpcHRpb25zJ31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oJyDCtyAnKTtcbiAgfVxuXG4gIG9uQmFjaygpOiB2b2lkIHtcbiAgICB0aGlzLmJhY2suZW1pdCgpO1xuICB9XG5cbiAgb25TZWxlY3Qob3A6IEdyYXBoUUxPcGVyYXRpb25PcHRpb24pOiB2b2lkIHtcbiAgICB0aGlzLm9wZXJhdGlvblNlbGVjdGVkLmVtaXQob3ApO1xuICB9XG5cbiAgb25QcmV2aWV3KG9wOiBHcmFwaFFMT3BlcmF0aW9uT3B0aW9uLCBldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAvLyBTdG9wIHRoZSBjbGljayBmcm9tIGFsc28gYnViYmxpbmcgdG8gdGhlIHJvdydzIHNlbGVjdCBoYW5kbGVyIOKAlCBQcmV2aWV3IGlzIGEgcGVlayxcbiAgICAvLyBub3QgYSBjb21taXQuXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5wcmV2aWV3LmVtaXQob3ApO1xuICB9XG5cbiAgb25SZUludHJvc3BlY3QoKTogdm9pZCB7XG4gICAgdGhpcy5yZUludHJvc3BlY3QuZW1pdCh0aGlzLnNjaGVtYVNvdXJjZSk7XG4gIH1cblxuICBvbkNoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZS5lbWl0KCk7XG4gIH1cblxuICBvbkZpbHRlckNoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5maWx0ZXJUZXJtID0gdmFsdWUgPz8gJyc7XG4gIH1cblxuICB0cmFja0J5T3BlcmF0aW9uKF9pbmRleDogbnVtYmVyLCBvcDogR3JhcGhRTE9wZXJhdGlvbk9wdGlvbik6IHN0cmluZyB7XG4gICAgcmV0dXJuIG9wLmlkO1xuICB9XG5cbiAgLyoqIFRhaWx3aW5kIHRleHQgY29sb3VyIGZvciB0aGUgcmV0dXJuLXR5cGUgcGlsbCwga2V5ZWQgYnkgb3BlcmF0aW9uIGtpbmQuICovXG4gIHJldHVyblR5cGVDb2xvckNsYXNzKGtpbmQ6IEdyYXBoUUxPcGVyYXRpb25PcHRpb25bJ2tpbmQnXSk6IHN0cmluZyB7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlICdtdXRhdGlvbic6ICAgICAgcmV0dXJuICdjcWEtdGV4dC1bI0Q5NzcwNl0nOyAvLyBhbWJlci02MDBcbiAgICAgIGNhc2UgJ3N1YnNjcmlwdGlvbic6ICByZXR1cm4gJ2NxYS10ZXh0LVsjN0MzQUVEXSc7IC8vIHZpb2xldC02MDBcbiAgICAgIGNhc2UgJ3F1ZXJ5JzpcbiAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICByZXR1cm4gJ2NxYS10ZXh0LVsjMDU5NjY5XSc7IC8vIGVtZXJhbGQtNjAwXG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlciBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC00IGNxYS1iZy13aGl0ZSBjcWEtdy1mdWxsXCI+XG5cbiAgPCEtLSBUaXRsZSByb3c6IGJhY2sgYXJyb3cgKyBoZWFkaW5nICsgSW50cm9zcGVjdGVkIGJhZGdlIC0tPlxuICA8ZGl2IGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1oZWFkZXIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWN1cnNvci1wb2ludGVyIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtdGV4dC1bMTRweF0gY3FhLWZvbnQtc2VtaWJvbGRcIiAoY2xpY2spPVwib25CYWNrKClcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS10ZXh0LVsxOHB4XSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLWZvbnQtc2VtaWJvbGRcIiBzdHlsZT1cImRpc3BsYXk6ZmxleDtmb250LXNpemU6MThweDtmb250LXdlaWdodDogNjAwO1wiPmFycm93X2JhY2s8L21hdC1pY29uPlxuICAgIDwvZGl2PlxuICAgIDxoMyBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItdGl0bGUgY3FhLW0tMCBjcWEtdGV4dC1bMThweF0gY3FhLWZvbnQtc2VtaWJvbGQgY3FhLXRleHQtWyMxMTE4MjddIGNxYS1sZWFkaW5nLVsxLjI1XVwiPlxuICAgICAgUGljayBhIEdyYXBoUUwgb3BlcmF0aW9uXG4gICAgPC9oMz5cbiAgICA8c3BhbiAqbmdJZj1cImludHJvc3BlY3RlZFwiXG4gICAgICBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItYmFkZ2UgY3FhLWlubGluZS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0xIGNxYS1weC0yIGNxYS1weS1bMnB4XSBjcWEtcm91bmRlZC1mdWxsIGNxYS1iZy1bI0VERTlGRV0gY3FhLXRleHQtWyM3QzNBRURdIGNxYS10ZXh0LVsxMXB4XSBjcWEtZm9udC1tZWRpdW0gY3FhLWxlYWRpbmctWzEuNF1cIj5cbiAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPuKXhjwvc3Bhbj4gSW50cm9zcGVjdGVkXG4gICAgPC9zcGFuPlxuICA8L2Rpdj5cblxuICA8IS0tIFN1YmhlYWRpbmcgLS0+XG4gIDxwIGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1zdWJoZWFkaW5nIGNxYS1tLTAgY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbGVhZGluZy1bMS41XVwiPlxuICAgIFBoYXNlIDEgc3VwcG9ydHMgb25lIG9wZXJhdGlvbiBwZXIgdGVzdCBzdGVwLiBTZWxlY3Qgb25lIHRvIGF1dG8tZmlsbCB0aGUgcmVxdWVzdC5cbiAgPC9wPlxuXG4gIDwhLS0gU2NoZW1hIHNvdXJjZSBiYXI6IFVSTCArIGNvdW50cyArIFJlLWludHJvc3BlY3QgLyBDaGFuZ2UgYnV0dG9ucyAtLT5cbiAgPGRpdiBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItc291cmNlIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktYmV0d2VlbiBjcWEtZ2FwLTMgY3FhLWJnLVsjRUVGMkZGXSBjcWEtcm91bmRlZC1sZyBjcWEtcHgtNCBjcWEtcHktMyBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0UwRTdGRl1cIj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1zb3VyY2UtaW5mbyBjcWEtZmxleCBjcWEtZmxleC1jb2wgY3FhLWdhcC0wLjUgY3FhLW1pbi13LTBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjcWEtZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLXNvdXJjZS1sYWJlbCBjcWEtdGV4dC1bMTBweF0gY3FhLXVwcGVyY2FzZSBjcWEtdHJhY2tpbmctd2lkZSBjcWEtdGV4dC1bIzZCNzI4MF0gY3FhLWZvbnQtc2VtaWJvbGRcIj5cbiAgICAgICAgU2NoZW1hIHNvdXJjZVxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2ICpuZ0lmPVwic2NoZW1hU291cmNlPy51cmxcIlxuICAgICAgICBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItc291cmNlLXVybCBjcWEtdGV4dC1bMTNweF0gY3FhLWZvbnQtbW9ubyBjcWEtdGV4dC1bIzFGMjkzN10gY3FhLXRydW5jYXRlIGNxYS1taW4tdy0wXCJcbiAgICAgICAgW3RpdGxlXT1cInNjaGVtYVNvdXJjZT8udXJsXCI+XG4gICAgICAgIHt7IHNjaGVtYVNvdXJjZT8udXJsIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nSWY9XCIhc2NoZW1hU291cmNlPy51cmxcIlxuICAgICAgICBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItc291cmNlLXVybCBjcWEtdGV4dC1bMTNweF0gY3FhLWl0YWxpYyBjcWEtdGV4dC1bIzZCNzI4MF1cIj5cbiAgICAgICAgTm8gc2NoZW1hIGxvYWRlZCB5ZXQuXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1zb3VyY2UtbWV0YSBjcWEtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMyBjcWEtc2hyaW5rLTBcIj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiaGVhZGVyQ291bnRzXCIgY2xhc3M9XCJjcWEtZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLXNvdXJjZS1jb3VudHMgY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNEI1NTYzXVwiPlxuICAgICAgICB7eyBoZWFkZXJDb3VudHMgfX1cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxjcWEtYnV0dG9uIHR5cGU9XCJidXR0b25cIiB2YXJpYW50PVwib3V0bGluZWRcIiBbaWNvbl09XCIncmVmcmVzaCdcIiBidG5TaXplPVwibWRcIiB0ZXh0PVwiUmUtaW50cm9zcGVjdFwiXG4gICAgICAgIGN1c3RvbUNsYXNzPVwiIWNxYS1iZy13aGl0ZSAhY3FhLXRleHQtWyMzNzQxNTFdICFjcWEtYm9yZGVyICFjcWEtYm9yZGVyLXNvbGlkICFjcWEtYm9yZGVyLVsjRDFENURCXSBjcWEtdGV4dC1bMTJweF0gY3FhLWZvbnQtbWVkaXVtIGhvdmVyOiFjcWEtYmctWyNGOUZBRkJdXCJcbiAgICAgICAgKGNsaWNrZWQpPVwib25SZUludHJvc3BlY3QoKVwiPlxuICAgICAgPC9jcWEtYnV0dG9uPlxuICAgICAgPGNxYS1idXR0b24gdHlwZT1cImJ1dHRvblwiIHZhcmlhbnQ9XCJ0ZXh0XCIgYnRuU2l6ZT1cIm1kXCIgdGV4dD1cIkNsb3NlXCJcbiAgICAgICAgY3VzdG9tQ2xhc3M9XCIhY3FhLXRleHQtWyM0RjQ2RTVdIGNxYS10ZXh0LVsxMnB4XSBjcWEtZm9udC1tZWRpdW0gaG92ZXI6IWNxYS1iZy1bI0VFRjJGRl1cIlxuICAgICAgICAoY2xpY2tlZCk9XCJvbkNoYW5nZSgpXCI+XG4gICAgICA8L2NxYS1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gRmlsdGVyIC0tPlxuICA8Y3FhLWN1c3RvbS1pbnB1dFxuICAgIFsodmFsdWUpXT1cImZpbHRlclRlcm1cIlxuICAgIFtsYWJlbF09XCInJ1wiXG4gICAgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgb3BlcmF0aW9ucy4uLlwiXG4gICAgW2Z1bGxXaWR0aF09XCJ0cnVlXCJcbiAgICBzaXplPVwibWRcIlxuICAgIGFyaWFMYWJlbD1cIkZpbHRlciBHcmFwaFFMIG9wZXJhdGlvbnNcIj5cbiAgPC9jcWEtY3VzdG9tLWlucHV0PlxuXG4gIDwhLS0gTG9hZGluZyBzcGlubmVyIHNob3duIHdoaWxlIHRoZSBwYXJlbnQgaXMgaW50cm9zcGVjdGluZy4gUmVwbGFjZXMgdGhlIGVtcHR5IHN0YXRlLiAtLT5cbiAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ1wiXG4gICAgY2xhc3M9XCJjcWEtZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLWxvYWRpbmcgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1nYXAtMyBjcWEtcHktMTIgY3FhLXRleHQtY2VudGVyIGNxYS1iZy1bI0Y5RkFGQl0gY3FhLXJvdW5kZWQtbWQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1zcGlubmVyIGNxYS1pbmxpbmUtYmxvY2sgY3FhLXctNyBjcWEtaC03IGNxYS1yb3VuZGVkLWZ1bGwgY3FhLWJvcmRlci0yIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0U1RTdFQl0gY3FhLWJvcmRlci10LVsjNEY0NkU1XSBjcWEtYW5pbWF0ZS1zcGluXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEzcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj5Mb2FkaW5nIHNjaGVtYeKApjwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsxMnB4XSBjcWEtdGV4dC1bIzZCNzI4MF1cIj5JbnRyb3NwZWN0aW5nIEdyYXBoUUwgZW5kcG9pbnQsIHRoaXMgbWF5IHRha2UgYSBtb21lbnQuPC9zcGFuPlxuICA8L2Rpdj5cblxuICA8IS0tIEVtcHR5IHN0YXRlIHdoZW4gbm8gb3BlcmF0aW9ucyBhcmUgbG9hZGVkIHlldCAob3IgZmlsdGVyIHJ1bGVzIGV2ZXJ5dGhpbmcgb3V0KS4gLS0+XG4gIDxkaXYgKm5nSWY9XCIhaXNMb2FkaW5nICYmICFmaWx0ZXJlZE9wZXJhdGlvbnMubGVuZ3RoXCJcbiAgICBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItZW1wdHkgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS1nYXAtMiBjcWEtcHktMTAgY3FhLXRleHQtY2VudGVyIGNxYS1iZy1bI0Y5RkFGQl0gY3FhLXJvdW5kZWQtbWQgY3FhLWJvcmRlciBjcWEtYm9yZGVyLWRhc2hlZCBjcWEtYm9yZGVyLVsjRTVFN0VCXVwiPlxuICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWzEzcHhdIGNxYS1mb250LW1lZGl1bSBjcWEtdGV4dC1bIzM3NDE1MV1cIj5cbiAgICAgIHt7IGZpbHRlclRlcm0gPyAnTm8gb3BlcmF0aW9ucyBtYXRjaCB5b3VyIGZpbHRlci4nIDogJ05vIG9wZXJhdGlvbnMgYXZhaWxhYmxlLicgfX1cbiAgICA8L3NwYW4+XG4gICAgPHNwYW4gKm5nSWY9XCIhZmlsdGVyVGVybVwiIGNsYXNzPVwiY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXVwiPlxuICAgICAgQ2xpY2sgPHN0cm9uZz5SZS1pbnRyb3NwZWN0PC9zdHJvbmc+IGFib3ZlIHRvIGxvYWQgdGhlIHNjaGVtYS5cbiAgICA8L3NwYW4+XG4gIDwvZGl2PlxuXG4gIDwhLS0gT3BlcmF0aW9uIHNlY3Rpb25zIChRdWVyaWVzIC8gTXV0YXRpb25zIC8gU3Vic2NyaXB0aW9ucykgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nICYmIGZpbHRlcmVkT3BlcmF0aW9ucy5sZW5ndGhcIj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwib3BTZWN0aW9uOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogcXVlcnlPcGVyYXRpb25zLCBsYWJlbDogJ1F1ZXJpZXMnLCBhY2NlbnQ6ICdjcWEtdGV4dC1bIzA1OTY2OV0nIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwib3BTZWN0aW9uOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbXV0YXRpb25PcGVyYXRpb25zLCBsYWJlbDogJ011dGF0aW9ucycsIGFjY2VudDogJ2NxYS10ZXh0LVsjRDk3NzA2XScgfVwiPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJvcFNlY3Rpb247IGNvbnRleHQ6IHsgJGltcGxpY2l0OiBzdWJzY3JpcHRpb25PcGVyYXRpb25zLCBsYWJlbDogJ1N1YnNjcmlwdGlvbnMnLCBhY2NlbnQ6ICdjcWEtdGV4dC1bIzdDM0FFRF0nIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPCEtLSBGb290ZXI6IHNlbGVjdGlvbiBzdW1tYXJ5LiBObyBCYWNrIC8gVXNlIGJ1dHRvbnMg4oCUIGNsaWNraW5nIGEgcm93IGNvbW1pdHMgKyByZXR1cm5zLiAtLT5cbiAgPGRpdiAqbmdJZj1cIiFpc0xvYWRpbmcgJiYgZmlsdGVyZWRPcGVyYXRpb25zLmxlbmd0aFwiIGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1mb290ZXIgY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtcHQtMiBjcWEtdGV4dC1bMTJweF0gY3FhLXRleHQtWyM2QjcyODBdXCI+XG4gICAgPHNwYW4+Q2xpY2sgYW4gb3BlcmF0aW9uIHRvIHVzZSBpdCDigJQgdGhlIHBpY2tlciBjbG9zZXMgYW5kIHRoZSByZXF1ZXN0IGlzIGF1dG8tZmlsbGVkLjwvc3Bhbj5cbiAgPC9kaXY+XG5cbiAgPCEtLSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgU2VjdGlvbiB0ZW1wbGF0ZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAgLS0+XG4gIDxuZy10ZW1wbGF0ZSAjb3BTZWN0aW9uIGxldC1vcHMgbGV0LWxhYmVsPVwibGFiZWxcIiBsZXQtYWNjZW50PVwiYWNjZW50XCI+XG4gICAgPGRpdiAqbmdJZj1cIm9wcz8ubGVuZ3RoXCIgY2xhc3M9XCJjcWEtZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLXNlY3Rpb24gY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMlwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItc2VjdGlvbi1oZWFkIGNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWdhcC0yIGNxYS1iZy1bI0Y5RkFGQl0gY3FhLXB4LTMgY3FhLXB5LTEuNSBjcWEtcm91bmRlZC1tZCBjcWEtYm9yZGVyIGNxYS1ib3JkZXItc29saWQgY3FhLWJvcmRlci1bI0YzRjRGNl1cIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtZ3JhcGhxbC1vcGVyYXRpb24tcGlja2VyLXNlY3Rpb24tbGFiZWwgY3FhLXRleHQtWzEycHhdIGNxYS1mb250LXNlbWlib2xkXCIgW25nQ2xhc3NdPVwiYWNjZW50XCI+e3sgbGFiZWwgfX08L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1zZWN0aW9uLWNvdW50IGNxYS10ZXh0LVsxMXB4XSBjcWEtdGV4dC1bIzZCNzI4MF1cIj5cbiAgICAgICAgICB7eyBvcHMubGVuZ3RoIH19IHt7IG9wcy5sZW5ndGggPT09IDEgPyAnb3BlcmF0aW9uJyA6ICdvcGVyYXRpb25zJyB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wIG9mIG9wczsgdHJhY2tCeTogdHJhY2tCeU9wZXJhdGlvblwiXG4gICAgICAgIGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1yb3cgY3FhLWZsZXggY3FhLWl0ZW1zLXN0YXJ0IGNxYS1qdXN0aWZ5LWJldHdlZW4gY3FhLWdhcC0zIGNxYS1weC0zIGNxYS1weS0yLjUgY3FhLXJvdW5kZWQtbWQgY3FhLWN1cnNvci1wb2ludGVyIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLXRyYW5zcGFyZW50IGhvdmVyOmNxYS1iZy1bI0Y5RkFGQl0gaG92ZXI6Y3FhLWJvcmRlci1bI0U1RTdFQl0gZm9jdXMtd2l0aGluOmNxYS1iZy1bI0Y1RjNGRl1cIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVXNlIG9wZXJhdGlvbiAnICsgb3AubmFtZVwiXG4gICAgICAgIChjbGljayk9XCJvblNlbGVjdChvcClcIlxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvblNlbGVjdChvcClcIlxuICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJvblNlbGVjdChvcCk7ICRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1yb3ctcmFkaW8gY3FhLW10LTEgY3FhLXNocmluay0wXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtaW5saW5lLWJsb2NrIGNxYS13LTQgY3FhLWgtNCBjcWEtcm91bmRlZC1mdWxsIGNxYS1ib3JkZXIgY3FhLWJvcmRlci1zb2xpZCBjcWEtYm9yZGVyLVsjOUNBM0FGXSBjcWEtYmctd2hpdGVcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItcm93LWJvZHkgY3FhLWZsZXggY3FhLWZsZXgtY29sIGNxYS1nYXAtMC41IGNxYS1mbGV4LTEgY3FhLW1pbi13LTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1yb3ctc2lnbmF0dXJlIGNxYS1mbGV4IGNxYS1mbGV4LXdyYXAgY3FhLWl0ZW1zLWJhc2VsaW5lIGNxYS1nYXAteC0xIGNxYS10ZXh0LVsxM3B4XSBjcWEtZm9udC1tb25vIGNxYS1sZWFkaW5nLVsxLjRdIGNxYS1taW4tdy0wXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjMTExODI3XSBjcWEtZm9udC1zZW1pYm9sZFwiPnt7IG9wLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNxYS10ZXh0LVsjNkI3MjgwXVwiPig8L3NwYW4+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBhcmcgb2Ygb3AuYXJncyA/PyBbXTsgbGV0IGxhc3QgPSBsYXN0XCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyMzNzQxNTFdXCI+e3sgYXJnLm5hbWUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdXCI+OiZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwicmV0dXJuVHlwZUNvbG9yQ2xhc3Mob3Aua2luZClcIj57eyBhcmcudHlwZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhbGFzdFwiIGNsYXNzPVwiY3FhLXRleHQtWyM2QjcyODBdXCI+LCZuYnNwOzwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjcWEtdGV4dC1bIzZCNzI4MF1cIj4pPC9zcGFuPlxuICAgICAgICAgICAgXG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cIm9wLmRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY3FhLWZsZXggY3FhLWl0ZW1zLWNlbnRlciBjcWEtZ2FwLTEgY3FhLWdyYXBocWwtb3BlcmF0aW9uLXBpY2tlci1yb3ctZGVzY3JpcHRpb24gY3FhLXRleHQtWzEycHhdIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbGVhZGluZy1bMS41XVwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgb3AuZGVzY3JpcHRpb24gfX08L3NwYW4+XG4gICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJvcC5yZXR1cm5UeXBlXCIgc3R5bGU9XCJkaXNwbGF5OmZsZXg7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6IDYwMDtcIiBjbGFzcz1cImNxYS1mbGV4IGNxYS1pdGVtcy1jZW50ZXIgY3FhLWp1c3RpZnktY2VudGVyIGNxYS10ZXh0LVsjNkI3MjgwXSBjcWEtbXgtMVwiPmFycm93X2ZvcndhcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJvcC5yZXR1cm5UeXBlXCIgW25nQ2xhc3NdPVwicmV0dXJuVHlwZUNvbG9yQ2xhc3Mob3Aua2luZClcIiBjbGFzcz1cImNxYS1mb250LXNlbWlib2xkXCI+e3sgb3AucmV0dXJuVHlwZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cImNxYS1ncmFwaHFsLW9wZXJhdGlvbi1waWNrZXItcm93LXByZXZpZXcgY3FhLXNocmluay0wIGNxYS1pbmxpbmUtZmxleCBjcWEtaXRlbXMtY2VudGVyIGNxYS1nYXAtMSBjcWEtYmctdHJhbnNwYXJlbnQgY3FhLWJvcmRlci0wIGNxYS1jdXJzb3ItcG9pbnRlciBjcWEtdGV4dC1bIzRGNDZFNV0gY3FhLXRleHQtWzEycHhdIGNxYS1mb250LW1lZGl1bSBob3ZlcjpjcWEtdW5kZXJsaW5lIGZvY3VzOmNxYS1vdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpjcWEtcmluZy0yIGZvY3VzLXZpc2libGU6Y3FhLXJpbmctWyNBNUI0RkNdIGNxYS1yb3VuZGVkLW1kIGNxYS1weC0yIGNxYS1weS0xXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidQcmV2aWV3IG9wZXJhdGlvbiAnICsgb3AubmFtZVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uUHJldmlldyhvcCwgJGV2ZW50KVwiPlxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAgPHBhdGggZD1cIk0yIDEyczMuNS03IDEwLTcgMTAgNyAxMCA3LTMuNSA3LTEwIDctMTAtNy0xMC03elwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIi8+XG4gICAgICAgICAgICA8Y2lyY2xlIGN4PVwiMTJcIiBjeT1cIjEyXCIgcj1cIjNcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIvPlxuICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDxzcGFuPlByZXZpZXc8L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPiAtLT5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuPC9kaXY+XG4iXX0=
@@ -35744,10 +35744,10 @@ class GraphQLOperationPickerComponent {
35744
35744
  }
35745
35745
  }
35746
35746
  GraphQLOperationPickerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GraphQLOperationPickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
35747
- GraphQLOperationPickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: GraphQLOperationPickerComponent, selector: "cqa-graphql-operation-picker", inputs: { schemaSource: "schemaSource", operations: "operations", introspected: "introspected", isLoading: "isLoading" }, outputs: { back: "back", operationSelected: "operationSelected", reIntrospect: "reIntrospect", change: "change", preview: "preview" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-graphql-operation-picker cqa-flex cqa-flex-col cqa-gap-4 cqa-bg-white cqa-w-full\">\n\n <!-- Title row: back arrow + heading + Introspected badge -->\n <div class=\"cqa-graphql-operation-picker-header cqa-flex cqa-items-center cqa-gap-3\">\n <div class=\"cqa-cursor-pointer cqa-text-[#6B7280] cqa-text-[14px] cqa-font-semibold\" (click)=\"onBack()\">\n <mat-icon class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[18px] cqa-text-[#6B7280] cqa-font-semibold\" style=\"display:flex;font-size:18px;font-weight: 600;\">arrow_back</mat-icon>\n </div>\n <h3 class=\"cqa-graphql-operation-picker-title cqa-m-0 cqa-text-[18px] cqa-font-semibold cqa-text-[#111827] cqa-leading-[1.25]\">\n Pick a GraphQL operation\n </h3>\n <span *ngIf=\"introspected\"\n class=\"cqa-graphql-operation-picker-badge cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-[2px] cqa-rounded-full cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[11px] cqa-font-medium cqa-leading-[1.4]\">\n <span aria-hidden=\"true\">\u25C6</span> Introspected\n </span>\n </div>\n\n <!-- Subheading -->\n <p class=\"cqa-graphql-operation-picker-subheading cqa-m-0 cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n Phase 1 supports one operation per test step. Select one to auto-fill the request.\n </p>\n\n <!-- Schema source bar: URL + counts + Re-introspect / Change buttons -->\n <div class=\"cqa-graphql-operation-picker-source cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-bg-[#EEF2FF] cqa-rounded-lg cqa-px-4 cqa-py-3 cqa-border cqa-border-solid cqa-border-[#E0E7FF]\">\n <div class=\"cqa-graphql-operation-picker-source-info cqa-flex cqa-flex-col cqa-gap-0.5 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-source-label cqa-text-[10px] cqa-uppercase cqa-tracking-wide cqa-text-[#6B7280] cqa-font-semibold\">\n Schema source\n </div>\n <div *ngIf=\"schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-font-mono cqa-text-[#1F2937] cqa-truncate cqa-min-w-0\"\n [title]=\"schemaSource?.url\">\n {{ schemaSource?.url }}\n </div>\n <div *ngIf=\"!schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-italic cqa-text-[#6B7280]\">\n No schema loaded yet.\n </div>\n </div>\n <div class=\"cqa-graphql-operation-picker-source-meta cqa-flex cqa-items-center cqa-gap-3 cqa-shrink-0\">\n <span *ngIf=\"headerCounts\" class=\"cqa-graphql-operation-picker-source-counts cqa-text-[12px] cqa-text-[#4B5563]\">\n {{ headerCounts }}\n </span>\n <cqa-button type=\"button\" variant=\"outlined\" [icon]=\"'refresh'\" btnSize=\"md\" text=\"Re-introspect\"\n customClass=\"!cqa-bg-white !cqa-text-[#374151] !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#F9FAFB]\"\n (clicked)=\"onReIntrospect()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\" text=\"Change\"\n customClass=\"!cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#EEF2FF]\"\n (clicked)=\"onChange()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Filter -->\n <cqa-custom-input\n [(value)]=\"filterTerm\"\n [label]=\"''\"\n placeholder=\"Filter operations...\"\n [fullWidth]=\"true\"\n size=\"md\"\n ariaLabel=\"Filter GraphQL operations\">\n </cqa-custom-input>\n\n <!-- Loading spinner shown while the parent is introspecting. Replaces the empty state. -->\n <div *ngIf=\"isLoading\"\n class=\"cqa-graphql-operation-picker-loading cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-3 cqa-py-12 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-graphql-operation-picker-spinner cqa-inline-block cqa-w-7 cqa-h-7 cqa-rounded-full cqa-border-2 cqa-border-solid cqa-border-[#E5E7EB] cqa-border-t-[#4F46E5] cqa-animate-spin\" aria-hidden=\"true\"></span>\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">Loading schema\u2026</span>\n <span class=\"cqa-text-[12px] cqa-text-[#6B7280]\">Introspecting GraphQL endpoint, this may take a moment.</span>\n </div>\n\n <!-- Empty state when no operations are loaded yet (or filter rules everything out). -->\n <div *ngIf=\"!isLoading && !filteredOperations.length\"\n class=\"cqa-graphql-operation-picker-empty cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-2 cqa-py-10 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">\n {{ filterTerm ? 'No operations match your filter.' : 'No operations available.' }}\n </span>\n <span *ngIf=\"!filterTerm\" class=\"cqa-text-[12px] cqa-text-[#6B7280]\">\n Click <strong>Re-introspect</strong> above to load the schema.\n </span>\n </div>\n\n <!-- Operation sections (Queries / Mutations / Subscriptions) -->\n <ng-container *ngIf=\"!isLoading && filteredOperations.length\">\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: queryOperations, label: 'Queries', accent: 'cqa-text-[#059669]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: mutationOperations, label: 'Mutations', accent: 'cqa-text-[#D97706]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: subscriptionOperations, label: 'Subscriptions', accent: 'cqa-text-[#7C3AED]' }\"></ng-container>\n </ng-container>\n\n <!-- Footer: selection summary. No Back / Use buttons \u2014 clicking a row commits + returns. -->\n <div *ngIf=\"!isLoading && filteredOperations.length\" class=\"cqa-graphql-operation-picker-footer cqa-flex cqa-items-center cqa-pt-2 cqa-text-[12px] cqa-text-[#6B7280]\">\n <span>Click an operation to use it \u2014 the picker closes and the request is auto-filled.</span>\n </div>\n\n <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Section template \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n <ng-template #opSection let-ops let-label=\"label\" let-accent=\"accent\">\n <div *ngIf=\"ops?.length\" class=\"cqa-graphql-operation-picker-section cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-graphql-operation-picker-section-head cqa-flex cqa-items-center cqa-gap-2 cqa-bg-[#F9FAFB] cqa-px-3 cqa-py-1.5 cqa-rounded-md cqa-border cqa-border-solid cqa-border-[#F3F4F6]\">\n <span class=\"cqa-graphql-operation-picker-section-label cqa-text-[12px] cqa-font-semibold\" [ngClass]=\"accent\">{{ label }}</span>\n <span class=\"cqa-graphql-operation-picker-section-count cqa-text-[11px] cqa-text-[#6B7280]\">\n {{ ops.length }} {{ ops.length === 1 ? 'operation' : 'operations' }}\n </span>\n </div>\n <div *ngFor=\"let op of ops; trackBy: trackByOperation\"\n class=\"cqa-graphql-operation-picker-row cqa-flex cqa-items-start cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2.5 cqa-rounded-md cqa-cursor-pointer cqa-border cqa-border-solid cqa-border-transparent hover:cqa-bg-[#F9FAFB] hover:cqa-border-[#E5E7EB] focus-within:cqa-bg-[#F5F3FF]\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Use operation ' + op.name\"\n (click)=\"onSelect(op)\"\n (keydown.enter)=\"onSelect(op)\"\n (keydown.space)=\"onSelect(op); $event.preventDefault()\">\n <span class=\"cqa-graphql-operation-picker-row-radio cqa-mt-1 cqa-shrink-0\">\n <span class=\"cqa-inline-block cqa-w-4 cqa-h-4 cqa-rounded-full cqa-border cqa-border-solid cqa-border-[#9CA3AF] cqa-bg-white\" aria-hidden=\"true\"></span>\n </span>\n <div class=\"cqa-graphql-operation-picker-row-body cqa-flex cqa-flex-col cqa-gap-0.5 cqa-flex-1 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-row-signature cqa-flex cqa-flex-wrap cqa-items-baseline cqa-gap-x-1 cqa-text-[13px] cqa-font-mono cqa-leading-[1.4] cqa-min-w-0\">\n <span class=\"cqa-text-[#111827] cqa-font-semibold\">{{ op.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">(</span>\n <ng-container *ngFor=\"let arg of op.args ?? []; let last = last\">\n <span class=\"cqa-text-[#374151]\">{{ arg.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">:&nbsp;</span>\n <span [ngClass]=\"returnTypeColorClass(op.kind)\">{{ arg.type }}</span>\n <span *ngIf=\"!last\" class=\"cqa-text-[#6B7280]\">,&nbsp;</span>\n </ng-container>\n <span class=\"cqa-text-[#6B7280]\">)</span>\n \n </div>\n <div *ngIf=\"op.description\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-graphql-operation-picker-row-description cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n <span>{{ op.description }}</span>\n <mat-icon *ngIf=\"op.returnType\" style=\"display:flex;font-size:14px;font-weight: 600;\" class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[#6B7280] cqa-mx-1\">arrow_forward</mat-icon>\n <span *ngIf=\"op.returnType\" [ngClass]=\"returnTypeColorClass(op.kind)\" class=\"cqa-font-semibold\">{{ op.returnType }}</span>\n </div>\n </div>\n <!-- <button type=\"button\"\n class=\"cqa-graphql-operation-picker-row-preview cqa-shrink-0 cqa-inline-flex cqa-items-center cqa-gap-1 cqa-bg-transparent cqa-border-0 cqa-cursor-pointer cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:cqa-underline focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#A5B4FC] cqa-rounded-md cqa-px-2 cqa-py-1\"\n [attr.aria-label]=\"'Preview operation ' + op.name\"\n (click)=\"onPreview(op, $event)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n <span>Preview</span>\n </button> -->\n </div>\n </div>\n </ng-template>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.Default });
35747
+ GraphQLOperationPickerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: GraphQLOperationPickerComponent, selector: "cqa-graphql-operation-picker", inputs: { schemaSource: "schemaSource", operations: "operations", introspected: "introspected", isLoading: "isLoading" }, outputs: { back: "back", operationSelected: "operationSelected", reIntrospect: "reIntrospect", change: "change", preview: "preview" }, host: { classAttribute: "cqa-ui-root" }, ngImport: i0, template: "<div class=\"cqa-graphql-operation-picker cqa-flex cqa-flex-col cqa-gap-4 cqa-bg-white cqa-w-full\">\n\n <!-- Title row: back arrow + heading + Introspected badge -->\n <div class=\"cqa-graphql-operation-picker-header cqa-flex cqa-items-center cqa-gap-3\">\n <div class=\"cqa-cursor-pointer cqa-text-[#6B7280] cqa-text-[14px] cqa-font-semibold\" (click)=\"onBack()\">\n <mat-icon class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[18px] cqa-text-[#6B7280] cqa-font-semibold\" style=\"display:flex;font-size:18px;font-weight: 600;\">arrow_back</mat-icon>\n </div>\n <h3 class=\"cqa-graphql-operation-picker-title cqa-m-0 cqa-text-[18px] cqa-font-semibold cqa-text-[#111827] cqa-leading-[1.25]\">\n Pick a GraphQL operation\n </h3>\n <span *ngIf=\"introspected\"\n class=\"cqa-graphql-operation-picker-badge cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-[2px] cqa-rounded-full cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[11px] cqa-font-medium cqa-leading-[1.4]\">\n <span aria-hidden=\"true\">\u25C6</span> Introspected\n </span>\n </div>\n\n <!-- Subheading -->\n <p class=\"cqa-graphql-operation-picker-subheading cqa-m-0 cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n Phase 1 supports one operation per test step. Select one to auto-fill the request.\n </p>\n\n <!-- Schema source bar: URL + counts + Re-introspect / Change buttons -->\n <div class=\"cqa-graphql-operation-picker-source cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-bg-[#EEF2FF] cqa-rounded-lg cqa-px-4 cqa-py-3 cqa-border cqa-border-solid cqa-border-[#E0E7FF]\">\n <div class=\"cqa-graphql-operation-picker-source-info cqa-flex cqa-flex-col cqa-gap-0.5 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-source-label cqa-text-[10px] cqa-uppercase cqa-tracking-wide cqa-text-[#6B7280] cqa-font-semibold\">\n Schema source\n </div>\n <div *ngIf=\"schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-font-mono cqa-text-[#1F2937] cqa-truncate cqa-min-w-0\"\n [title]=\"schemaSource?.url\">\n {{ schemaSource?.url }}\n </div>\n <div *ngIf=\"!schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-italic cqa-text-[#6B7280]\">\n No schema loaded yet.\n </div>\n </div>\n <div class=\"cqa-graphql-operation-picker-source-meta cqa-flex cqa-items-center cqa-gap-3 cqa-shrink-0\">\n <span *ngIf=\"headerCounts\" class=\"cqa-graphql-operation-picker-source-counts cqa-text-[12px] cqa-text-[#4B5563]\">\n {{ headerCounts }}\n </span>\n <cqa-button type=\"button\" variant=\"outlined\" [icon]=\"'refresh'\" btnSize=\"md\" text=\"Re-introspect\"\n customClass=\"!cqa-bg-white !cqa-text-[#374151] !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#F9FAFB]\"\n (clicked)=\"onReIntrospect()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\" text=\"Close\"\n customClass=\"!cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#EEF2FF]\"\n (clicked)=\"onChange()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Filter -->\n <cqa-custom-input\n [(value)]=\"filterTerm\"\n [label]=\"''\"\n placeholder=\"Filter operations...\"\n [fullWidth]=\"true\"\n size=\"md\"\n ariaLabel=\"Filter GraphQL operations\">\n </cqa-custom-input>\n\n <!-- Loading spinner shown while the parent is introspecting. Replaces the empty state. -->\n <div *ngIf=\"isLoading\"\n class=\"cqa-graphql-operation-picker-loading cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-3 cqa-py-12 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-graphql-operation-picker-spinner cqa-inline-block cqa-w-7 cqa-h-7 cqa-rounded-full cqa-border-2 cqa-border-solid cqa-border-[#E5E7EB] cqa-border-t-[#4F46E5] cqa-animate-spin\" aria-hidden=\"true\"></span>\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">Loading schema\u2026</span>\n <span class=\"cqa-text-[12px] cqa-text-[#6B7280]\">Introspecting GraphQL endpoint, this may take a moment.</span>\n </div>\n\n <!-- Empty state when no operations are loaded yet (or filter rules everything out). -->\n <div *ngIf=\"!isLoading && !filteredOperations.length\"\n class=\"cqa-graphql-operation-picker-empty cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-2 cqa-py-10 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">\n {{ filterTerm ? 'No operations match your filter.' : 'No operations available.' }}\n </span>\n <span *ngIf=\"!filterTerm\" class=\"cqa-text-[12px] cqa-text-[#6B7280]\">\n Click <strong>Re-introspect</strong> above to load the schema.\n </span>\n </div>\n\n <!-- Operation sections (Queries / Mutations / Subscriptions) -->\n <ng-container *ngIf=\"!isLoading && filteredOperations.length\">\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: queryOperations, label: 'Queries', accent: 'cqa-text-[#059669]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: mutationOperations, label: 'Mutations', accent: 'cqa-text-[#D97706]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: subscriptionOperations, label: 'Subscriptions', accent: 'cqa-text-[#7C3AED]' }\"></ng-container>\n </ng-container>\n\n <!-- Footer: selection summary. No Back / Use buttons \u2014 clicking a row commits + returns. -->\n <div *ngIf=\"!isLoading && filteredOperations.length\" class=\"cqa-graphql-operation-picker-footer cqa-flex cqa-items-center cqa-pt-2 cqa-text-[12px] cqa-text-[#6B7280]\">\n <span>Click an operation to use it \u2014 the picker closes and the request is auto-filled.</span>\n </div>\n\n <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Section template \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n <ng-template #opSection let-ops let-label=\"label\" let-accent=\"accent\">\n <div *ngIf=\"ops?.length\" class=\"cqa-graphql-operation-picker-section cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-graphql-operation-picker-section-head cqa-flex cqa-items-center cqa-gap-2 cqa-bg-[#F9FAFB] cqa-px-3 cqa-py-1.5 cqa-rounded-md cqa-border cqa-border-solid cqa-border-[#F3F4F6]\">\n <span class=\"cqa-graphql-operation-picker-section-label cqa-text-[12px] cqa-font-semibold\" [ngClass]=\"accent\">{{ label }}</span>\n <span class=\"cqa-graphql-operation-picker-section-count cqa-text-[11px] cqa-text-[#6B7280]\">\n {{ ops.length }} {{ ops.length === 1 ? 'operation' : 'operations' }}\n </span>\n </div>\n <div *ngFor=\"let op of ops; trackBy: trackByOperation\"\n class=\"cqa-graphql-operation-picker-row cqa-flex cqa-items-start cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2.5 cqa-rounded-md cqa-cursor-pointer cqa-border cqa-border-solid cqa-border-transparent hover:cqa-bg-[#F9FAFB] hover:cqa-border-[#E5E7EB] focus-within:cqa-bg-[#F5F3FF]\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Use operation ' + op.name\"\n (click)=\"onSelect(op)\"\n (keydown.enter)=\"onSelect(op)\"\n (keydown.space)=\"onSelect(op); $event.preventDefault()\">\n <span class=\"cqa-graphql-operation-picker-row-radio cqa-mt-1 cqa-shrink-0\">\n <span class=\"cqa-inline-block cqa-w-4 cqa-h-4 cqa-rounded-full cqa-border cqa-border-solid cqa-border-[#9CA3AF] cqa-bg-white\" aria-hidden=\"true\"></span>\n </span>\n <div class=\"cqa-graphql-operation-picker-row-body cqa-flex cqa-flex-col cqa-gap-0.5 cqa-flex-1 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-row-signature cqa-flex cqa-flex-wrap cqa-items-baseline cqa-gap-x-1 cqa-text-[13px] cqa-font-mono cqa-leading-[1.4] cqa-min-w-0\">\n <span class=\"cqa-text-[#111827] cqa-font-semibold\">{{ op.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">(</span>\n <ng-container *ngFor=\"let arg of op.args ?? []; let last = last\">\n <span class=\"cqa-text-[#374151]\">{{ arg.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">:&nbsp;</span>\n <span [ngClass]=\"returnTypeColorClass(op.kind)\">{{ arg.type }}</span>\n <span *ngIf=\"!last\" class=\"cqa-text-[#6B7280]\">,&nbsp;</span>\n </ng-container>\n <span class=\"cqa-text-[#6B7280]\">)</span>\n \n </div>\n <div *ngIf=\"op.description\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-graphql-operation-picker-row-description cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n <span>{{ op.description }}</span>\n <mat-icon *ngIf=\"op.returnType\" style=\"display:flex;font-size:14px;font-weight: 600;\" class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[#6B7280] cqa-mx-1\">arrow_forward</mat-icon>\n <span *ngIf=\"op.returnType\" [ngClass]=\"returnTypeColorClass(op.kind)\" class=\"cqa-font-semibold\">{{ op.returnType }}</span>\n </div>\n </div>\n <!-- <button type=\"button\"\n class=\"cqa-graphql-operation-picker-row-preview cqa-shrink-0 cqa-inline-flex cqa-items-center cqa-gap-1 cqa-bg-transparent cqa-border-0 cqa-cursor-pointer cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:cqa-underline focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#A5B4FC] cqa-rounded-md cqa-px-2 cqa-py-1\"\n [attr.aria-label]=\"'Preview operation ' + op.name\"\n (click)=\"onPreview(op, $event)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n <span>Preview</span>\n </button> -->\n </div>\n </div>\n </ng-template>\n</div>\n", components: [{ type: i1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: ButtonComponent, selector: "cqa-button", inputs: ["variant", "btnSize", "disabled", "loading", "icon", "iconPosition", "fullWidth", "iconColor", "type", "text", "customClass", "inlineStyles", "tooltip", "tooltipPosition"], outputs: ["clicked"] }, { type: CustomInputComponent, selector: "cqa-custom-input", inputs: ["inputId", "label", "type", "placeholder", "value", "disabled", "errors", "required", "ariaLabel", "size", "fullWidth", "maxLength", "showCharCount", "inputInlineStyle", "labelInlineStyle"], outputs: ["valueChange", "blurred", "focused", "enterPressed"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.Default });
35748
35748
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: GraphQLOperationPickerComponent, decorators: [{
35749
35749
  type: Component,
35750
- args: [{ selector: 'cqa-graphql-operation-picker', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.Default, template: "<div class=\"cqa-graphql-operation-picker cqa-flex cqa-flex-col cqa-gap-4 cqa-bg-white cqa-w-full\">\n\n <!-- Title row: back arrow + heading + Introspected badge -->\n <div class=\"cqa-graphql-operation-picker-header cqa-flex cqa-items-center cqa-gap-3\">\n <div class=\"cqa-cursor-pointer cqa-text-[#6B7280] cqa-text-[14px] cqa-font-semibold\" (click)=\"onBack()\">\n <mat-icon class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[18px] cqa-text-[#6B7280] cqa-font-semibold\" style=\"display:flex;font-size:18px;font-weight: 600;\">arrow_back</mat-icon>\n </div>\n <h3 class=\"cqa-graphql-operation-picker-title cqa-m-0 cqa-text-[18px] cqa-font-semibold cqa-text-[#111827] cqa-leading-[1.25]\">\n Pick a GraphQL operation\n </h3>\n <span *ngIf=\"introspected\"\n class=\"cqa-graphql-operation-picker-badge cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-[2px] cqa-rounded-full cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[11px] cqa-font-medium cqa-leading-[1.4]\">\n <span aria-hidden=\"true\">\u25C6</span> Introspected\n </span>\n </div>\n\n <!-- Subheading -->\n <p class=\"cqa-graphql-operation-picker-subheading cqa-m-0 cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n Phase 1 supports one operation per test step. Select one to auto-fill the request.\n </p>\n\n <!-- Schema source bar: URL + counts + Re-introspect / Change buttons -->\n <div class=\"cqa-graphql-operation-picker-source cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-bg-[#EEF2FF] cqa-rounded-lg cqa-px-4 cqa-py-3 cqa-border cqa-border-solid cqa-border-[#E0E7FF]\">\n <div class=\"cqa-graphql-operation-picker-source-info cqa-flex cqa-flex-col cqa-gap-0.5 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-source-label cqa-text-[10px] cqa-uppercase cqa-tracking-wide cqa-text-[#6B7280] cqa-font-semibold\">\n Schema source\n </div>\n <div *ngIf=\"schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-font-mono cqa-text-[#1F2937] cqa-truncate cqa-min-w-0\"\n [title]=\"schemaSource?.url\">\n {{ schemaSource?.url }}\n </div>\n <div *ngIf=\"!schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-italic cqa-text-[#6B7280]\">\n No schema loaded yet.\n </div>\n </div>\n <div class=\"cqa-graphql-operation-picker-source-meta cqa-flex cqa-items-center cqa-gap-3 cqa-shrink-0\">\n <span *ngIf=\"headerCounts\" class=\"cqa-graphql-operation-picker-source-counts cqa-text-[12px] cqa-text-[#4B5563]\">\n {{ headerCounts }}\n </span>\n <cqa-button type=\"button\" variant=\"outlined\" [icon]=\"'refresh'\" btnSize=\"md\" text=\"Re-introspect\"\n customClass=\"!cqa-bg-white !cqa-text-[#374151] !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#F9FAFB]\"\n (clicked)=\"onReIntrospect()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\" text=\"Change\"\n customClass=\"!cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#EEF2FF]\"\n (clicked)=\"onChange()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Filter -->\n <cqa-custom-input\n [(value)]=\"filterTerm\"\n [label]=\"''\"\n placeholder=\"Filter operations...\"\n [fullWidth]=\"true\"\n size=\"md\"\n ariaLabel=\"Filter GraphQL operations\">\n </cqa-custom-input>\n\n <!-- Loading spinner shown while the parent is introspecting. Replaces the empty state. -->\n <div *ngIf=\"isLoading\"\n class=\"cqa-graphql-operation-picker-loading cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-3 cqa-py-12 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-graphql-operation-picker-spinner cqa-inline-block cqa-w-7 cqa-h-7 cqa-rounded-full cqa-border-2 cqa-border-solid cqa-border-[#E5E7EB] cqa-border-t-[#4F46E5] cqa-animate-spin\" aria-hidden=\"true\"></span>\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">Loading schema\u2026</span>\n <span class=\"cqa-text-[12px] cqa-text-[#6B7280]\">Introspecting GraphQL endpoint, this may take a moment.</span>\n </div>\n\n <!-- Empty state when no operations are loaded yet (or filter rules everything out). -->\n <div *ngIf=\"!isLoading && !filteredOperations.length\"\n class=\"cqa-graphql-operation-picker-empty cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-2 cqa-py-10 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">\n {{ filterTerm ? 'No operations match your filter.' : 'No operations available.' }}\n </span>\n <span *ngIf=\"!filterTerm\" class=\"cqa-text-[12px] cqa-text-[#6B7280]\">\n Click <strong>Re-introspect</strong> above to load the schema.\n </span>\n </div>\n\n <!-- Operation sections (Queries / Mutations / Subscriptions) -->\n <ng-container *ngIf=\"!isLoading && filteredOperations.length\">\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: queryOperations, label: 'Queries', accent: 'cqa-text-[#059669]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: mutationOperations, label: 'Mutations', accent: 'cqa-text-[#D97706]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: subscriptionOperations, label: 'Subscriptions', accent: 'cqa-text-[#7C3AED]' }\"></ng-container>\n </ng-container>\n\n <!-- Footer: selection summary. No Back / Use buttons \u2014 clicking a row commits + returns. -->\n <div *ngIf=\"!isLoading && filteredOperations.length\" class=\"cqa-graphql-operation-picker-footer cqa-flex cqa-items-center cqa-pt-2 cqa-text-[12px] cqa-text-[#6B7280]\">\n <span>Click an operation to use it \u2014 the picker closes and the request is auto-filled.</span>\n </div>\n\n <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Section template \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n <ng-template #opSection let-ops let-label=\"label\" let-accent=\"accent\">\n <div *ngIf=\"ops?.length\" class=\"cqa-graphql-operation-picker-section cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-graphql-operation-picker-section-head cqa-flex cqa-items-center cqa-gap-2 cqa-bg-[#F9FAFB] cqa-px-3 cqa-py-1.5 cqa-rounded-md cqa-border cqa-border-solid cqa-border-[#F3F4F6]\">\n <span class=\"cqa-graphql-operation-picker-section-label cqa-text-[12px] cqa-font-semibold\" [ngClass]=\"accent\">{{ label }}</span>\n <span class=\"cqa-graphql-operation-picker-section-count cqa-text-[11px] cqa-text-[#6B7280]\">\n {{ ops.length }} {{ ops.length === 1 ? 'operation' : 'operations' }}\n </span>\n </div>\n <div *ngFor=\"let op of ops; trackBy: trackByOperation\"\n class=\"cqa-graphql-operation-picker-row cqa-flex cqa-items-start cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2.5 cqa-rounded-md cqa-cursor-pointer cqa-border cqa-border-solid cqa-border-transparent hover:cqa-bg-[#F9FAFB] hover:cqa-border-[#E5E7EB] focus-within:cqa-bg-[#F5F3FF]\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Use operation ' + op.name\"\n (click)=\"onSelect(op)\"\n (keydown.enter)=\"onSelect(op)\"\n (keydown.space)=\"onSelect(op); $event.preventDefault()\">\n <span class=\"cqa-graphql-operation-picker-row-radio cqa-mt-1 cqa-shrink-0\">\n <span class=\"cqa-inline-block cqa-w-4 cqa-h-4 cqa-rounded-full cqa-border cqa-border-solid cqa-border-[#9CA3AF] cqa-bg-white\" aria-hidden=\"true\"></span>\n </span>\n <div class=\"cqa-graphql-operation-picker-row-body cqa-flex cqa-flex-col cqa-gap-0.5 cqa-flex-1 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-row-signature cqa-flex cqa-flex-wrap cqa-items-baseline cqa-gap-x-1 cqa-text-[13px] cqa-font-mono cqa-leading-[1.4] cqa-min-w-0\">\n <span class=\"cqa-text-[#111827] cqa-font-semibold\">{{ op.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">(</span>\n <ng-container *ngFor=\"let arg of op.args ?? []; let last = last\">\n <span class=\"cqa-text-[#374151]\">{{ arg.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">:&nbsp;</span>\n <span [ngClass]=\"returnTypeColorClass(op.kind)\">{{ arg.type }}</span>\n <span *ngIf=\"!last\" class=\"cqa-text-[#6B7280]\">,&nbsp;</span>\n </ng-container>\n <span class=\"cqa-text-[#6B7280]\">)</span>\n \n </div>\n <div *ngIf=\"op.description\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-graphql-operation-picker-row-description cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n <span>{{ op.description }}</span>\n <mat-icon *ngIf=\"op.returnType\" style=\"display:flex;font-size:14px;font-weight: 600;\" class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[#6B7280] cqa-mx-1\">arrow_forward</mat-icon>\n <span *ngIf=\"op.returnType\" [ngClass]=\"returnTypeColorClass(op.kind)\" class=\"cqa-font-semibold\">{{ op.returnType }}</span>\n </div>\n </div>\n <!-- <button type=\"button\"\n class=\"cqa-graphql-operation-picker-row-preview cqa-shrink-0 cqa-inline-flex cqa-items-center cqa-gap-1 cqa-bg-transparent cqa-border-0 cqa-cursor-pointer cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:cqa-underline focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#A5B4FC] cqa-rounded-md cqa-px-2 cqa-py-1\"\n [attr.aria-label]=\"'Preview operation ' + op.name\"\n (click)=\"onPreview(op, $event)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n <span>Preview</span>\n </button> -->\n </div>\n </div>\n </ng-template>\n</div>\n" }]
35750
+ args: [{ selector: 'cqa-graphql-operation-picker', host: { class: 'cqa-ui-root' }, changeDetection: ChangeDetectionStrategy.Default, template: "<div class=\"cqa-graphql-operation-picker cqa-flex cqa-flex-col cqa-gap-4 cqa-bg-white cqa-w-full\">\n\n <!-- Title row: back arrow + heading + Introspected badge -->\n <div class=\"cqa-graphql-operation-picker-header cqa-flex cqa-items-center cqa-gap-3\">\n <div class=\"cqa-cursor-pointer cqa-text-[#6B7280] cqa-text-[14px] cqa-font-semibold\" (click)=\"onBack()\">\n <mat-icon class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[18px] cqa-text-[#6B7280] cqa-font-semibold\" style=\"display:flex;font-size:18px;font-weight: 600;\">arrow_back</mat-icon>\n </div>\n <h3 class=\"cqa-graphql-operation-picker-title cqa-m-0 cqa-text-[18px] cqa-font-semibold cqa-text-[#111827] cqa-leading-[1.25]\">\n Pick a GraphQL operation\n </h3>\n <span *ngIf=\"introspected\"\n class=\"cqa-graphql-operation-picker-badge cqa-inline-flex cqa-items-center cqa-gap-1 cqa-px-2 cqa-py-[2px] cqa-rounded-full cqa-bg-[#EDE9FE] cqa-text-[#7C3AED] cqa-text-[11px] cqa-font-medium cqa-leading-[1.4]\">\n <span aria-hidden=\"true\">\u25C6</span> Introspected\n </span>\n </div>\n\n <!-- Subheading -->\n <p class=\"cqa-graphql-operation-picker-subheading cqa-m-0 cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n Phase 1 supports one operation per test step. Select one to auto-fill the request.\n </p>\n\n <!-- Schema source bar: URL + counts + Re-introspect / Change buttons -->\n <div class=\"cqa-graphql-operation-picker-source cqa-flex cqa-items-center cqa-justify-between cqa-gap-3 cqa-bg-[#EEF2FF] cqa-rounded-lg cqa-px-4 cqa-py-3 cqa-border cqa-border-solid cqa-border-[#E0E7FF]\">\n <div class=\"cqa-graphql-operation-picker-source-info cqa-flex cqa-flex-col cqa-gap-0.5 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-source-label cqa-text-[10px] cqa-uppercase cqa-tracking-wide cqa-text-[#6B7280] cqa-font-semibold\">\n Schema source\n </div>\n <div *ngIf=\"schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-font-mono cqa-text-[#1F2937] cqa-truncate cqa-min-w-0\"\n [title]=\"schemaSource?.url\">\n {{ schemaSource?.url }}\n </div>\n <div *ngIf=\"!schemaSource?.url\"\n class=\"cqa-graphql-operation-picker-source-url cqa-text-[13px] cqa-italic cqa-text-[#6B7280]\">\n No schema loaded yet.\n </div>\n </div>\n <div class=\"cqa-graphql-operation-picker-source-meta cqa-flex cqa-items-center cqa-gap-3 cqa-shrink-0\">\n <span *ngIf=\"headerCounts\" class=\"cqa-graphql-operation-picker-source-counts cqa-text-[12px] cqa-text-[#4B5563]\">\n {{ headerCounts }}\n </span>\n <cqa-button type=\"button\" variant=\"outlined\" [icon]=\"'refresh'\" btnSize=\"md\" text=\"Re-introspect\"\n customClass=\"!cqa-bg-white !cqa-text-[#374151] !cqa-border !cqa-border-solid !cqa-border-[#D1D5DB] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#F9FAFB]\"\n (clicked)=\"onReIntrospect()\">\n </cqa-button>\n <cqa-button type=\"button\" variant=\"text\" btnSize=\"md\" text=\"Close\"\n customClass=\"!cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:!cqa-bg-[#EEF2FF]\"\n (clicked)=\"onChange()\">\n </cqa-button>\n </div>\n </div>\n\n <!-- Filter -->\n <cqa-custom-input\n [(value)]=\"filterTerm\"\n [label]=\"''\"\n placeholder=\"Filter operations...\"\n [fullWidth]=\"true\"\n size=\"md\"\n ariaLabel=\"Filter GraphQL operations\">\n </cqa-custom-input>\n\n <!-- Loading spinner shown while the parent is introspecting. Replaces the empty state. -->\n <div *ngIf=\"isLoading\"\n class=\"cqa-graphql-operation-picker-loading cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-3 cqa-py-12 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-graphql-operation-picker-spinner cqa-inline-block cqa-w-7 cqa-h-7 cqa-rounded-full cqa-border-2 cqa-border-solid cqa-border-[#E5E7EB] cqa-border-t-[#4F46E5] cqa-animate-spin\" aria-hidden=\"true\"></span>\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">Loading schema\u2026</span>\n <span class=\"cqa-text-[12px] cqa-text-[#6B7280]\">Introspecting GraphQL endpoint, this may take a moment.</span>\n </div>\n\n <!-- Empty state when no operations are loaded yet (or filter rules everything out). -->\n <div *ngIf=\"!isLoading && !filteredOperations.length\"\n class=\"cqa-graphql-operation-picker-empty cqa-flex cqa-flex-col cqa-items-center cqa-justify-center cqa-gap-2 cqa-py-10 cqa-text-center cqa-bg-[#F9FAFB] cqa-rounded-md cqa-border cqa-border-dashed cqa-border-[#E5E7EB]\">\n <span class=\"cqa-text-[13px] cqa-font-medium cqa-text-[#374151]\">\n {{ filterTerm ? 'No operations match your filter.' : 'No operations available.' }}\n </span>\n <span *ngIf=\"!filterTerm\" class=\"cqa-text-[12px] cqa-text-[#6B7280]\">\n Click <strong>Re-introspect</strong> above to load the schema.\n </span>\n </div>\n\n <!-- Operation sections (Queries / Mutations / Subscriptions) -->\n <ng-container *ngIf=\"!isLoading && filteredOperations.length\">\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: queryOperations, label: 'Queries', accent: 'cqa-text-[#059669]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: mutationOperations, label: 'Mutations', accent: 'cqa-text-[#D97706]' }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"opSection; context: { $implicit: subscriptionOperations, label: 'Subscriptions', accent: 'cqa-text-[#7C3AED]' }\"></ng-container>\n </ng-container>\n\n <!-- Footer: selection summary. No Back / Use buttons \u2014 clicking a row commits + returns. -->\n <div *ngIf=\"!isLoading && filteredOperations.length\" class=\"cqa-graphql-operation-picker-footer cqa-flex cqa-items-center cqa-pt-2 cqa-text-[12px] cqa-text-[#6B7280]\">\n <span>Click an operation to use it \u2014 the picker closes and the request is auto-filled.</span>\n </div>\n\n <!-- \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Section template \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 -->\n <ng-template #opSection let-ops let-label=\"label\" let-accent=\"accent\">\n <div *ngIf=\"ops?.length\" class=\"cqa-graphql-operation-picker-section cqa-flex cqa-flex-col cqa-gap-2\">\n <div class=\"cqa-graphql-operation-picker-section-head cqa-flex cqa-items-center cqa-gap-2 cqa-bg-[#F9FAFB] cqa-px-3 cqa-py-1.5 cqa-rounded-md cqa-border cqa-border-solid cqa-border-[#F3F4F6]\">\n <span class=\"cqa-graphql-operation-picker-section-label cqa-text-[12px] cqa-font-semibold\" [ngClass]=\"accent\">{{ label }}</span>\n <span class=\"cqa-graphql-operation-picker-section-count cqa-text-[11px] cqa-text-[#6B7280]\">\n {{ ops.length }} {{ ops.length === 1 ? 'operation' : 'operations' }}\n </span>\n </div>\n <div *ngFor=\"let op of ops; trackBy: trackByOperation\"\n class=\"cqa-graphql-operation-picker-row cqa-flex cqa-items-start cqa-justify-between cqa-gap-3 cqa-px-3 cqa-py-2.5 cqa-rounded-md cqa-cursor-pointer cqa-border cqa-border-solid cqa-border-transparent hover:cqa-bg-[#F9FAFB] hover:cqa-border-[#E5E7EB] focus-within:cqa-bg-[#F5F3FF]\"\n role=\"button\"\n tabindex=\"0\"\n [attr.aria-label]=\"'Use operation ' + op.name\"\n (click)=\"onSelect(op)\"\n (keydown.enter)=\"onSelect(op)\"\n (keydown.space)=\"onSelect(op); $event.preventDefault()\">\n <span class=\"cqa-graphql-operation-picker-row-radio cqa-mt-1 cqa-shrink-0\">\n <span class=\"cqa-inline-block cqa-w-4 cqa-h-4 cqa-rounded-full cqa-border cqa-border-solid cqa-border-[#9CA3AF] cqa-bg-white\" aria-hidden=\"true\"></span>\n </span>\n <div class=\"cqa-graphql-operation-picker-row-body cqa-flex cqa-flex-col cqa-gap-0.5 cqa-flex-1 cqa-min-w-0\">\n <div class=\"cqa-graphql-operation-picker-row-signature cqa-flex cqa-flex-wrap cqa-items-baseline cqa-gap-x-1 cqa-text-[13px] cqa-font-mono cqa-leading-[1.4] cqa-min-w-0\">\n <span class=\"cqa-text-[#111827] cqa-font-semibold\">{{ op.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">(</span>\n <ng-container *ngFor=\"let arg of op.args ?? []; let last = last\">\n <span class=\"cqa-text-[#374151]\">{{ arg.name }}</span>\n <span class=\"cqa-text-[#6B7280]\">:&nbsp;</span>\n <span [ngClass]=\"returnTypeColorClass(op.kind)\">{{ arg.type }}</span>\n <span *ngIf=\"!last\" class=\"cqa-text-[#6B7280]\">,&nbsp;</span>\n </ng-container>\n <span class=\"cqa-text-[#6B7280]\">)</span>\n \n </div>\n <div *ngIf=\"op.description\"\n class=\"cqa-flex cqa-items-center cqa-gap-1 cqa-graphql-operation-picker-row-description cqa-text-[12px] cqa-text-[#6B7280] cqa-leading-[1.5]\">\n <span>{{ op.description }}</span>\n <mat-icon *ngIf=\"op.returnType\" style=\"display:flex;font-size:14px;font-weight: 600;\" class=\"cqa-flex cqa-items-center cqa-justify-center cqa-text-[#6B7280] cqa-mx-1\">arrow_forward</mat-icon>\n <span *ngIf=\"op.returnType\" [ngClass]=\"returnTypeColorClass(op.kind)\" class=\"cqa-font-semibold\">{{ op.returnType }}</span>\n </div>\n </div>\n <!-- <button type=\"button\"\n class=\"cqa-graphql-operation-picker-row-preview cqa-shrink-0 cqa-inline-flex cqa-items-center cqa-gap-1 cqa-bg-transparent cqa-border-0 cqa-cursor-pointer cqa-text-[#4F46E5] cqa-text-[12px] cqa-font-medium hover:cqa-underline focus:cqa-outline-none focus-visible:cqa-ring-2 focus-visible:cqa-ring-[#A5B4FC] cqa-rounded-md cqa-px-2 cqa-py-1\"\n [attr.aria-label]=\"'Preview operation ' + op.name\"\n (click)=\"onPreview(op, $event)\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" aria-hidden=\"true\">\n <path d=\"M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7-10-7-10-7z\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\" stroke=\"currentColor\" stroke-width=\"2\"/>\n </svg>\n <span>Preview</span>\n </button> -->\n </div>\n </div>\n </ng-template>\n</div>\n" }]
35751
35751
  }], propDecorators: { schemaSource: [{
35752
35752
  type: Input
35753
35753
  }], operations: [{