@genspectrum/dashboard-components 0.8.2 → 0.8.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"dashboard-components.js","sources":["../node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/@lit/reactive-element/decorators/property.js","../src/web-components/lapis-context.ts","../src/web-components/reference-genome-context.ts","../src/lapisApi/ReferenceGenome.ts","../src/lapisApi/lapisTypes.ts","../src/lapisApi/lapisApi.ts","../src/web-components/app.ts","../node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js","../node_modules/preact/hooks/dist/hooks.module.js","../src/preact/mutationComparison/getMutationComparisonTableData.ts","../src/preact/components/table.tsx","../src/utils/mutations.ts","../src/preact/shared/sort/sortSubstitutionsAndDeletions.ts","../src/preact/shared/table/formatProportion.ts","../src/preact/mutationComparison/mutation-comparison-table.tsx","../src/preact/components/chart.tsx","../src/preact/mutationComparison/mutation-comparison-venn.tsx","../src/operator/FetchSubstitutionsOrDeletionsOperator.ts","../src/operator/SortOperator.ts","../src/query/querySubstitutionsOrDeletions.ts","../src/preact/mutationComparison/queryMutationData.ts","../src/preact/LapisUrlContext.ts","../src/preact/components/csv-download-button.tsx","../src/preact/components/error-display.tsx","../src/preact/components/resize-container.tsx","../src/preact/components/error-boundary.tsx","../src/preact/components/fullscreen.tsx","../src/preact/components/info.tsx","../src/preact/components/loading-display.tsx","../src/preact/shared/floating-ui/hooks.ts","../src/preact/components/dropdown.tsx","../src/preact/components/checkbox-selector.tsx","../src/preact/components/mutation-type-selector.tsx","../src/preact/components/no-data-display.tsx","../src/preact/components/min-max-range-slider.tsx","../src/preact/components/percent-intput.tsx","../src/preact/components/proportion-selector.tsx","../src/preact/components/proportion-selector-dropdown.tsx","../src/preact/ReferenceGenomeContext.ts","../src/preact/components/segment-selector.tsx","../src/preact/components/tabs.tsx","../src/preact/useQuery.ts","../src/preact/mutationComparison/mutation-comparison.tsx","../src/web-components/PreactLitAdapter.tsx","../src/web-components/PreactLitAdapterWithGridJsStyles.tsx","../src/web-components/visualization/gs-mutation-comparison.tsx","../src/preact/mutations/getInsertionsTableData.ts","../src/preact/mutations/getMutationsTableData.ts","../src/preact/shared/sort/sortMutationPositions.ts","../src/preact/mutations/getMutationsGridData.ts","../src/preact/mutations/mutations-grid.tsx","../src/preact/shared/sort/sortInsertions.ts","../src/preact/mutations/mutations-insertions-table.tsx","../src/preact/mutations/mutations-table.tsx","../src/operator/FetchInsertionsOperator.ts","../src/query/queryInsertions.ts","../src/preact/mutations/queryMutations.ts","../src/preact/mutations/mutations.tsx","../src/web-components/visualization/gs-mutations.tsx","../src/preact/prevalenceOverTime/getPrevalenceOverTimeTableData.ts","../src/utils/sort.ts","../src/preact/shared/charts/LogitScale.ts","../src/preact/shared/charts/colors.ts","../src/preact/shared/charts/confideceInterval.ts","../src/preact/shared/charts/getYAxisMax.ts","../src/preact/shared/charts/getYAxisScale.ts","../src/preact/prevalenceOverTime/prevalence-over-time-bar-chart.tsx","../node_modules/dayjs/esm/constant.js","../node_modules/dayjs/esm/locale/en.js","../node_modules/dayjs/esm/utils.js","../node_modules/dayjs/esm/index.js","../node_modules/dayjs/esm/plugin/advancedFormat/index.js","../node_modules/dayjs/esm/plugin/isoWeek/index.js","../src/utils/temporalClass.ts","../src/utils/utils.ts","../src/preact/prevalenceOverTime/prevalence-over-time-bubble-chart.tsx","../src/preact/prevalenceOverTime/prevalence-over-time-line-chart.tsx","../src/preact/prevalenceOverTime/prevalence-over-time-table.tsx","../src/operator/FetchAggregatedOperator.ts","../src/operator/FillMissingOperator.ts","../src/operator/GroupByOperator.ts","../src/operator/GroupByAndSumOperator.ts","../src/operator/MapOperator.ts","../src/operator/RenameFieldOperator.ts","../src/operator/SlidingOperator.ts","../src/query/queryAggregatedDataOverTime.ts","../src/operator/DivisionOperator.ts","../src/query/queryPrevalenceOverTime.ts","../src/preact/components/select.tsx","../src/preact/components/confidence-interval-selector.tsx","../src/preact/components/scaling-selector.tsx","../src/preact/prevalenceOverTime/prevalence-over-time.tsx","../src/web-components/visualization/gs-prevalence-over-time.tsx","../src/preact/relativeGrowthAdvantage/relative-growth-advantage-chart.tsx","../src/query/queryRelativeGrowthAdvantage.ts","../src/preact/relativeGrowthAdvantage/relative-growth-advantage.tsx","../src/web-components/visualization/gs-relative-growth-advantage.tsx","../src/query/queryAggregateData.ts","../src/preact/aggregatedData/aggregate-table.tsx","../src/preact/aggregatedData/aggregate.tsx","../src/web-components/visualization/gs-aggregate.tsx","../src/preact/numberSequencesOverTime/getNumberOfSequencesOverTimeTableData.ts","../src/preact/numberSequencesOverTime/number-sequences-over-time-bar-chart.tsx","../src/preact/numberSequencesOverTime/number-sequences-over-time-line-chart.tsx","../src/preact/numberSequencesOverTime/number-sequences-over-time-table.tsx","../src/query/queryNumberOfSequencesOverTime.ts","../src/preact/numberSequencesOverTime/number-sequences-over-time.tsx","../src/web-components/visualization/gs-number-sequences-over-time.tsx","../src/query/queryMutationsOverTime.ts","../src/utils/map2d.ts","../src/preact/mutationsOverTime/MutationOverTimeData.ts","../src/preact/mutationsOverTime/getFilteredMutationsOverTimeData.ts","../src/preact/components/color-scale-selector.tsx","../src/preact/components/tooltip.tsx","../src/preact/mutationsOverTime/mutations-over-time-grid.tsx","../src/preact/components/color-scale-selector-dropdown.tsx","../src/preact/webWorkers/useWebWorker.ts","../src/preact/mutationsOverTime/mutations-over-time.tsx","../src/web-components/visualization/gs-mutations-over-time.tsx","../src/preact/dateRangeSelector/selectableOptions.ts","../src/preact/dateRangeSelector/computeInitialValues.ts","../src/preact/dateRangeSelector/dateConversion.ts","../src/preact/dateRangeSelector/date-range-selector.tsx","../src/web-components/input/gs-date-range-selector.tsx","../src/preact/locationFilter/fetchAutocompletionList.ts","../src/preact/locationFilter/location-filter.tsx","../src/web-components/input/gs-location-filter.tsx","../src/preact/textInput/fetchAutocompleteList.ts","../src/preact/textInput/text-input.tsx","../src/web-components/input/gs-text-input.tsx","../src/preact/components/ReferenceGenomesAwaiter.tsx","../src/preact/mutationFilter/mutation-filter-info.tsx","../src/preact/mutationFilter/sequenceTypeFromSegment.ts","../src/preact/mutationFilter/parseAndValidateMutation.ts","../src/preact/mutationFilter/mutation-filter.tsx","../src/web-components/input/gs-mutation-filter.tsx","../src/preact/lineageFilter/fetchLineageAutocompleteList.ts","../src/preact/lineageFilter/lineage-filter.tsx","../src/web-components/input/gs-lineage-filter.tsx","../src/preact/dateRangeSelector/dateRangeOption.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer((()=>{customElements.define(t,e)})):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce(((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1]),t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet));else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,adoptStyles,css,getCompatibleStyle,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:r,getOwnPropertyNames:h,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),y={attribute:!0,type:String,converter:u,reflect:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class b extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=y){if(s.state&&(s.attribute=!1),this._$Ei(),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),r=this.getPropertyDescriptor(t,i,s);void 0!==r&&e(this.prototype,t,r)}}static getPropertyDescriptor(t,s,i){const{get:e,set:h}=r(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get(){return e?.call(this)},set(s){const r=e?.call(this);h.call(this,s),this.requestUpdate(t,r,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??y}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...h(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach((t=>t.hostConnected?.()))}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach((t=>t.hostDisconnected?.()))}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$EC(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const r=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==r?this.removeAttribute(e):this.setAttribute(e,r),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),r=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e,this[e]=r.fromAttribute(s,t.type),this._$Em=null}}requestUpdate(t,s,i){if(void 0!==t){if(i??=this.constructor.getPropertyOptions(t),!(i.hasChanged??f)(this[t],s))return;this.P(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$ET())}P(t,s,i){this._$AL.has(t)||this._$AL.set(t,s),!0===i.reflect&&this._$Em!==t&&(this._$Ej??=new Set).add(t)}async _$ET(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t)!0!==i.wrapped||this._$AL.has(s)||void 0===this[s]||this.P(s,this[s],i)}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach((t=>t.hostUpdate?.())),this.update(s)):this._$EU()}catch(s){throw t=!1,this._$EU(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach((t=>t.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EU(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Ej&&=this._$Ej.forEach((t=>this._$EC(t,this[t]))),this._$EU()}updated(t){}firstUpdated(t){}}b.elementStyles=[],b.shadowRootOptions={mode:\"open\"},b[d(\"elementProperties\")]=new Map,b[d(\"finalized\")]=new Map,p?.({ReactiveElement:b}),(a.reactiveElementVersions??=[]).push(\"2.0.4\");export{b as ReactiveElement,u as defaultConverter,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","import{defaultConverter as t,notEqual as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:t,reflect:!1,hasChanged:e},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t)},init(e){return void 0!==e&&this.P(o,void 0,t),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,r?{...t,wrapped:!0}:t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import { createContext } from '@lit/context';\n\nexport const lapisContext = createContext<string>('lapis-context');\n","import { createContext } from '@lit/context';\n\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\n\nexport const referenceGenomeContext = createContext<ReferenceGenome>('reference-genome-context');\n","import z from 'zod';\n\nimport type { SequenceType } from '../types';\n\nexport const referenceGenomeResponse = z.object({\n nucleotideSequences: z.array(\n z.object({\n name: z.string(),\n sequence: z.string(),\n }),\n ),\n genes: z.array(\n z.object({\n name: z.string(),\n sequence: z.string(),\n }),\n ),\n});\nexport type ReferenceGenome = z.infer<typeof referenceGenomeResponse>;\n\nexport const getSegmentNames = (referenceGenome: ReferenceGenome, sequenceType: SequenceType) => {\n switch (sequenceType) {\n case 'nucleotide': {\n return referenceGenome.nucleotideSequences.map((sequence) => sequence.name);\n }\n case 'amino acid': {\n return referenceGenome.genes.map((gene) => gene.name);\n }\n }\n};\n\nexport const isSingleSegmented = (referenceGenome: ReferenceGenome) => referenceGenome.nucleotideSequences.length === 1;\n","import z, { type ZodTypeAny } from 'zod';\n\nexport const orderByType = z.enum(['ascending', 'descending']);\n\nexport const orderBy = z.object({\n field: z.string(),\n type: orderByType,\n});\n\nexport const lapisBaseRequest = z\n .object({\n limit: z.number().optional(),\n offset: z.number().optional(),\n fields: z.array(z.string()).optional(),\n orderBy: z.array(orderBy).optional(),\n })\n .catchall(z.union([z.boolean(), z.undefined(), z.string(), z.number(), z.null(), z.array(z.string())]));\nexport type LapisBaseRequest = z.infer<typeof lapisBaseRequest>;\n\nexport const mutationsRequest = lapisBaseRequest.extend({ minProportion: z.number().optional() });\nexport type MutationsRequest = z.infer<typeof mutationsRequest>;\n\nconst mutationProportionCount = z.object({\n mutation: z.string(),\n proportion: z.number(),\n count: z.number(),\n sequenceName: z.union([z.string(), z.null()]),\n mutationFrom: z.string(),\n mutationTo: z.string(),\n position: z.number(),\n});\nexport const mutationsResponse = makeLapisResponse(z.array(mutationProportionCount));\nexport type MutationsResponse = z.infer<typeof mutationsResponse>;\n\nconst insertionCount = z.object({\n insertion: z.string(),\n count: z.number(),\n insertedSymbols: z.string(),\n position: z.number(),\n sequenceName: z.union([z.string(), z.null()]),\n});\nexport const insertionsResponse = makeLapisResponse(z.array(insertionCount));\n\nexport const aggregatedItem = z.object({ count: z.number() }).catchall(z.union([z.string(), z.number(), z.null()]));\nexport const aggregatedResponse = makeLapisResponse(z.array(aggregatedItem));\nexport type AggregatedItem = z.infer<typeof aggregatedItem>;\n\nfunction makeLapisResponse<T extends ZodTypeAny>(data: T) {\n return z.object({\n data,\n });\n}\n\nexport const problemDetail = z.object({\n title: z.string().optional(),\n status: z.number(),\n detail: z.string().optional(),\n type: z.string(),\n instance: z.string().optional(),\n});\n\nexport type ProblemDetail = z.infer<typeof problemDetail>;\n\nexport const lapisError = z.object({\n error: problemDetail,\n});\n","import { referenceGenomeResponse } from './ReferenceGenome';\nimport {\n aggregatedResponse,\n insertionsResponse,\n type LapisBaseRequest,\n lapisError,\n type MutationsRequest,\n mutationsResponse,\n problemDetail,\n type ProblemDetail,\n} from './lapisTypes';\nimport { type SequenceType } from '../types';\n\nexport class UnknownLapisError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly requestedData: string,\n ) {\n super(message);\n this.name = 'UnknownLapisError';\n }\n}\n\nexport class LapisError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly problemDetail: ProblemDetail,\n public readonly requestedData: string,\n ) {\n super(message);\n this.name = 'LapisError';\n }\n}\n\nexport async function fetchAggregated(lapisUrl: string, body: LapisBaseRequest, signal?: AbortSignal) {\n const response = await callLapis(\n aggregatedEndpoint(lapisUrl),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n },\n 'aggregated data',\n );\n\n return aggregatedResponse.parse(await response.json());\n}\n\nexport async function fetchInsertions(\n lapisUrl: string,\n body: LapisBaseRequest,\n sequenceType: SequenceType,\n signal?: AbortSignal,\n) {\n const response = await callLapis(\n insertionsEndpoint(lapisUrl, sequenceType),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n },\n `${sequenceType} insertions`,\n );\n\n return insertionsResponse.parse(await response.json());\n}\n\nexport async function fetchSubstitutionsOrDeletions(\n lapisUrl: string,\n body: MutationsRequest,\n sequenceType: SequenceType,\n signal?: AbortSignal,\n) {\n const response = await callLapis(\n substitutionsOrDeletionsEndpoint(lapisUrl, sequenceType),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n },\n `${sequenceType} mutations`,\n );\n\n return mutationsResponse.parse(await response.json());\n}\n\nexport async function fetchReferenceGenome(lapisUrl: string, signal?: AbortSignal) {\n const response = await callLapis(\n referenceGenomeEndpoint(lapisUrl),\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n signal,\n },\n 'the reference genomes',\n );\n\n return referenceGenomeResponse.parse(await response.json());\n}\n\nasync function callLapis(\n input: Parameters<typeof fetch>[0],\n init: Parameters<typeof fetch>[1],\n requestedDataName: string,\n) {\n try {\n const response = await fetch(input, init);\n\n await handleErrors(response, requestedDataName);\n return response;\n } catch (error) {\n const message = error instanceof Error ? error.message : `${error}`;\n throw new UnknownLapisError(`Failed to connect to LAPIS: ${message}`, 500, requestedDataName);\n }\n}\n\nconst handleErrors = async (response: Response, requestedData: string) => {\n if (!response.ok) {\n if (response.status >= 400 && response.status < 500) {\n const json = await response.json();\n\n const lapisErrorResult = lapisError.safeParse(json);\n if (lapisErrorResult.success) {\n throw new LapisError(\n response.statusText + lapisErrorResult.data.error.detail,\n response.status,\n lapisErrorResult.data.error,\n requestedData,\n );\n }\n\n const problemDetailResult = problemDetail.safeParse(json);\n if (problemDetailResult.success) {\n throw new LapisError(\n response.statusText + problemDetailResult.data.detail,\n response.status,\n problemDetailResult.data,\n requestedData,\n );\n }\n\n throw new UnknownLapisError(\n `${response.statusText}: ${JSON.stringify(json)}`,\n response.status,\n requestedData,\n );\n }\n throw new UnknownLapisError(`${response.statusText}: ${response.status}`, response.status, requestedData);\n }\n};\n\nexport const aggregatedEndpoint = (lapisUrl: string) => `${lapisUrl}/sample/aggregated`;\nexport const insertionsEndpoint = (lapisUrl: string, sequenceType: SequenceType) => {\n return sequenceType === 'amino acid'\n ? `${lapisUrl}/sample/aminoAcidInsertions`\n : `${lapisUrl}/sample/nucleotideInsertions`;\n};\nexport const substitutionsOrDeletionsEndpoint = (lapisUrl: string, sequenceType: SequenceType) => {\n return sequenceType === 'amino acid'\n ? `${lapisUrl}/sample/aminoAcidMutations`\n : `${lapisUrl}/sample/nucleotideMutations`;\n};\nexport const referenceGenomeEndpoint = (lapisUrl: string) => `${lapisUrl}/sample/referenceGenome`;\n","import { provide } from '@lit/context';\nimport { Task } from '@lit/task';\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { lapisContext } from './lapis-context';\nimport { referenceGenomeContext } from './reference-genome-context';\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\nimport { fetchReferenceGenome } from '../lapisApi/lapisApi';\n\n/**\n * ## Context\n *\n * This component provides the main application context.\n * All other `gs-*` components must be (possibly nested) children of this component.\n * It makes use of the [Lit Context](https://lit.dev/docs/data/context/) to\n * - provide the URL to the LAPIS instance to all its children\n * - fetch the reference genomes from LAPIS and provide it to all its children\n *\n * This will show an error message if the reference genome cannot be fetched\n * (e.g., due to an invalid LAPIS URL).\n *\n * ## Shadow DOM\n *\n * This component does __not__ use a shadow DOM. Children of this component will be rendered directly in the light DOM.\n */\n@customElement('gs-app')\nexport class App extends LitElement {\n /**\n * Required.\n *\n * The URL of the LAPIS instance that all children of this component will use.\n */\n @provide({ context: lapisContext })\n @property()\n lapis: string = '';\n\n /**\n * @internal\n */\n @provide({ context: referenceGenomeContext })\n referenceGenome: ReferenceGenome = {\n nucleotideSequences: [],\n genes: [],\n };\n\n /**\n * @internal\n */\n private updateReferenceGenome = new Task(this, {\n task: async () => {\n this.referenceGenome = await fetchReferenceGenome(this.lapis);\n },\n args: () => [this.lapis],\n });\n\n override render() {\n return this.updateReferenceGenome.render({\n complete: () => html``, // Children will be rendered in the light DOM anyway. We can't use slots without a shadow DOM.\n error: () =>\n html` <div class=\"m-2 w-full alert alert-error\">\n Error: Cannot fetch reference genome. Is LAPIS available?\n </div>`,\n });\n }\n\n override createRenderRoot() {\n return this;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-app': App;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-app': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n","import{options as r,Fragment as e}from\"preact\";export{Fragment}from\"preact\";var t=/[\"&<]/;function n(r){if(0===r.length||!1===t.test(r))return r;for(var e=0,n=0,o=\"\",f=\"\";n<r.length;n++){switch(r.charCodeAt(n)){case 34:f=\"&quot;\";break;case 38:f=\"&amp;\";break;case 60:f=\"&lt;\";break;default:continue}n!==e&&(o+=r.slice(e,n)),o+=f,e=n+1}return n!==e&&(o+=r.slice(e,n)),o}var o=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,f=0,i=Array.isArray;function u(e,t,n,o,i,u){t||(t={});var a,c,l=t;\"ref\"in t&&(a=t.ref,delete t.ref);var p={type:e,props:l,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:--f,__i:-1,__u:0,__source:i,__self:u};if(\"function\"==typeof e&&(a=e.defaultProps))for(c in a)void 0===l[c]&&(l[c]=a[c]);return r.vnode&&r.vnode(p),p}function a(r){var t=u(e,{tpl:r,exprs:[].slice.call(arguments,1)});return t.key=t.__v,t}var c={},l=/[A-Z]/g;function p(e,t){if(r.attr){var f=r.attr(e,t);if(\"string\"==typeof f)return f}if(\"ref\"===e||\"key\"===e)return\"\";if(\"style\"===e&&\"object\"==typeof t){var i=\"\";for(var u in t){var a=t[u];if(null!=a&&\"\"!==a){var p=\"-\"==u[0]?u:c[u]||(c[u]=u.replace(l,\"-$&\").toLowerCase()),_=\";\";\"number\"!=typeof a||p.startsWith(\"--\")||o.test(p)||(_=\"px;\"),i=i+p+\":\"+a+_}}return e+'=\"'+i+'\"'}return null==t||!1===t||\"function\"==typeof t||\"object\"==typeof t?\"\":!0===t?e:e+'=\"'+n(t)+'\"'}function _(r){if(null==r||\"boolean\"==typeof r||\"function\"==typeof r)return null;if(\"object\"==typeof r){if(void 0===r.constructor)return r;if(i(r)){for(var e=0;e<r.length;e++)r[e]=_(r[e]);return r}}return n(\"\"+r)}export{u as jsx,p as jsxAttr,u as jsxDEV,_ as jsxEscape,a as jsxTemplate,u as jsxs};\n//# sourceMappingURL=jsxRuntime.module.js.map\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function d(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function h(n){return o=1,p(D,n)}function p(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),!(!i&&o.__c.props===n)&&(!c||c.call(this,n,t,r))};r.u=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=d(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__H.__h.push(i))}function _(n,u){var i=d(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function T(n,r){var u=d(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=d(t++,10),i=h();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=d(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],c.__e(t,n.__v)}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.i=n.__N=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.i=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,p as useReducer,A as useRef,h as useState};\n//# sourceMappingURL=hooks.module.js.map\n","import { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport { type DeletionClass, type SubstitutionClass } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\ntype Proportions = {\n [displayName: string]: number;\n};\n\ntype MutationComparisonRow = {\n mutation: SubstitutionClass | DeletionClass;\n proportions: Proportions;\n};\n\nexport function getMutationComparisonTableData(data: Dataset<MutationData>, proportionInterval: ProportionInterval) {\n const mutationsToProportions = new Map<string, MutationComparisonRow>();\n\n for (const mutationData of data.content) {\n for (const mutationEntry of mutationData.data) {\n const mutationKey = mutationEntry.mutation.toString();\n const existingRow = mutationsToProportions.get(mutationKey);\n\n if (!existingRow) {\n mutationsToProportions.set(\n mutationKey,\n initializeMutationRow(mutationEntry.mutation, mutationData.displayName, mutationEntry.proportion),\n );\n } else {\n existingRow.proportions = updateProportions(\n existingRow.proportions,\n mutationData.displayName,\n mutationEntry.proportion,\n );\n mutationsToProportions.set(mutationKey, existingRow);\n }\n }\n }\n\n return [...mutationsToProportions.values()]\n .map((row) => {\n return {\n mutation: row.mutation,\n ...data.content\n .map((mutationData) => {\n return {\n [`${mutationData.displayName} prevalence`]: row.proportions[mutationData.displayName] || 0,\n };\n })\n .reduce((acc, val) => ({ ...acc, ...val }), {}),\n } as { mutation: SubstitutionClass | DeletionClass } & Proportions;\n })\n .filter((row) =>\n Object.values(row).some(\n (value) =>\n typeof value === 'number' && value >= proportionInterval.min && value <= proportionInterval.max,\n ),\n );\n}\n\nfunction initializeMutationRow(\n mutation: SubstitutionClass | DeletionClass,\n displayName: string,\n proportion: number,\n): MutationComparisonRow {\n return {\n mutation,\n proportions: {\n [displayName]: proportion,\n },\n };\n}\n\nfunction updateProportions(proportions: Proportions, displayName: string, proportion: number): Proportions {\n return { ...proportions, [displayName]: proportion };\n}\n","import { Grid } from 'gridjs';\nimport { type OneDArray, type TColumn, type TData } from 'gridjs/dist/src/types';\nimport { type ComponentChild } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\n\nimport 'gridjs/dist/theme/mermaid.css';\n\nexport const tableStyle = {\n table: {\n fontSize: '12px',\n },\n th: {\n padding: '4px',\n textAlign: 'center',\n },\n td: {\n textAlign: 'center',\n padding: '8px',\n },\n footer: {\n fontSize: '12px',\n },\n};\n\ninterface TableProps {\n data: TData;\n columns: OneDArray<TColumn | string | ComponentChild>;\n pageSize: number | boolean;\n}\n\nexport const Table = ({ data, columns, pageSize }: TableProps) => {\n const pagination = typeof pageSize === 'number' ? { limit: pageSize } : pageSize;\n\n const wrapper = useRef(null);\n\n useEffect(() => {\n if (wrapper.current === null) {\n return;\n }\n const grid = new Grid({\n columns,\n data,\n style: tableStyle,\n pagination,\n }).render(wrapper.current);\n\n return () => {\n grid.destroy();\n };\n });\n\n return <div ref={wrapper} />;\n};\n","import { type MutationType, type SequenceType } from '../types';\n\nexport interface Mutation {\n readonly position: number;\n readonly code: string;\n readonly type: MutationType;\n readonly segment?: string;\n}\n\nexport interface MutationClass extends Mutation {\n equals(other: MutationClass): boolean;\n\n toString(): string;\n}\n\nexport const substitutionRegex =\n /^((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Za-z])?(?<position>\\d+)(?<substitutionValue>[A-Za-z.])?$/;\n\nexport interface Substitution extends Mutation {\n type: 'substitution';\n valueAtReference: string | undefined;\n substitutionValue: string | undefined;\n}\n\nexport class SubstitutionClass implements MutationClass, Substitution {\n readonly code;\n readonly type = 'substitution';\n\n constructor(\n readonly segment: string | undefined,\n readonly valueAtReference: string | undefined,\n readonly substitutionValue: string | undefined,\n readonly position: number,\n ) {\n const segmentString = this.segment ? `${this.segment}:` : '';\n const valueAtReferenceString = this.valueAtReference ? `${this.valueAtReference}` : '';\n const substitutionValueString = this.substitutionValue ? `${this.substitutionValue}` : '';\n this.code = `${segmentString}${valueAtReferenceString}${this.position}${substitutionValueString}`;\n }\n\n equals(other: MutationClass): boolean {\n if (!(other instanceof SubstitutionClass)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.valueAtReference === other.valueAtReference &&\n this.substitutionValue === other.substitutionValue &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): SubstitutionClass | null {\n const match = mutationStr.match(substitutionRegex);\n if (match === null || match.groups === undefined) {\n return null;\n }\n return new SubstitutionClass(\n match.groups.segment,\n match.groups.valueAtReference,\n match.groups.substitutionValue,\n parseInt(match.groups.position, 10),\n );\n }\n}\n\nexport const deletionRegex = /^((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Za-z])?(?<position>\\d+)(-)$/;\n\nexport interface Deletion extends Mutation {\n type: 'deletion';\n valueAtReference: string | undefined;\n}\n\nexport class DeletionClass implements MutationClass, Deletion {\n readonly code;\n readonly type = 'deletion';\n\n constructor(\n readonly segment: string | undefined,\n readonly valueAtReference: string | undefined,\n readonly position: number,\n ) {\n const segmentString = this.segment ? `${this.segment}:` : '';\n const valueAtReferenceString = this.valueAtReference ? `${this.valueAtReference}` : '';\n this.code = `${segmentString}${valueAtReferenceString}${this.position}-`;\n }\n\n equals(other: MutationClass): boolean {\n if (!(other instanceof DeletionClass)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.valueAtReference === other.valueAtReference &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): DeletionClass | null {\n const match = mutationStr.match(deletionRegex);\n if (match === null || match.groups === undefined) {\n return null;\n }\n\n return new DeletionClass(\n match.groups.segment,\n match.groups.valueAtReference,\n parseInt(match.groups.position, 10),\n );\n }\n}\n\nexport const insertionRegexp =\n /^ins_((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<position>\\d+):(?<insertedSymbols>(([A-Za-z?]|(\\.\\*))+))$/i;\n\nexport interface Insertion extends Mutation {\n type: 'insertion';\n insertedSymbols: string;\n}\n\nexport class InsertionClass implements MutationClass {\n readonly code;\n readonly type = 'insertion';\n\n constructor(\n readonly segment: string | undefined,\n readonly position: number,\n readonly insertedSymbols: string,\n ) {\n this.code = `ins_${this.segment ? `${this.segment}:` : ''}${this.position}:${this.insertedSymbols}`;\n }\n\n equals(other: MutationClass): boolean {\n if (!(other instanceof InsertionClass)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.insertedSymbols === other.insertedSymbols &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): InsertionClass | null {\n const match = mutationStr.match(insertionRegexp);\n if (match === null || match.groups === undefined) {\n return null;\n }\n\n return new InsertionClass(\n match.groups.segment,\n parseInt(match.groups.position, 10),\n match.groups.insertedSymbols,\n );\n }\n}\n\nexport function toMutation(\n mutationClass: SubstitutionClass | DeletionClass | InsertionClass,\n): Substitution | Deletion | Insertion {\n if (mutationClass.type === 'insertion') {\n return {\n type: 'insertion' as const,\n code: mutationClass.code,\n segment: mutationClass.segment,\n position: mutationClass.position,\n insertedSymbols: mutationClass.insertedSymbols,\n };\n }\n return toSubstitutionOrDeletion(mutationClass);\n}\n\nexport function toSubstitutionOrDeletion(mutation: SubstitutionClass | DeletionClass): Substitution | Deletion {\n switch (mutation.type) {\n case 'substitution':\n return {\n type: 'substitution' as const,\n code: mutation.code,\n segment: mutation.segment,\n position: mutation.position,\n valueAtReference: mutation.valueAtReference,\n substitutionValue: mutation.substitutionValue,\n };\n case 'deletion':\n return {\n type: 'deletion' as const,\n code: mutation.code,\n segment: mutation.segment,\n position: mutation.position,\n valueAtReference: mutation.valueAtReference,\n };\n }\n}\n\nexport const bases: { [P in SequenceType]: string[] } = {\n nucleotide: ['A', 'C', 'G', 'T', '-'],\n 'amino acid': [\n 'I',\n 'L',\n 'V',\n 'F',\n 'M',\n 'C',\n 'A',\n 'G',\n 'P',\n 'T',\n 'S',\n 'Y',\n 'W',\n 'Q',\n 'N',\n 'H',\n 'E',\n 'D',\n 'K',\n 'R',\n '-',\n ],\n};\n","import { DeletionClass, type SubstitutionClass } from '../../../utils/mutations';\n\nexport const sortSubstitutionsAndDeletions = (\n a: SubstitutionClass | DeletionClass,\n b: SubstitutionClass | DeletionClass,\n) => {\n if (a.segment !== b.segment) {\n return compareSegments(a.segment, b.segment);\n }\n\n if (a.position !== b.position) {\n return comparePositions(a.position, b.position);\n }\n\n const aIsDeletion = a instanceof DeletionClass;\n const bIsDeletion = b instanceof DeletionClass;\n\n if (aIsDeletion !== bIsDeletion) {\n return aIsDeletion ? 1 : -1;\n }\n\n if (!aIsDeletion && !bIsDeletion) {\n if (a.substitutionValue !== b.substitutionValue) {\n return compareSubstitutionValues(a.substitutionValue, b.substitutionValue);\n }\n }\n\n return 0;\n};\n\nexport const compareSegments = (a: string | undefined, b: string | undefined) => {\n if (a === undefined) {\n return -1;\n }\n if (b === undefined) {\n return 1;\n }\n return a.localeCompare(b);\n};\n\nexport const comparePositions = (a: number, b: number) => {\n return a - b;\n};\n\nconst compareSubstitutionValues = (a: string | undefined, b: string | undefined) => {\n if (a === undefined) {\n return -1;\n }\n if (b === undefined) {\n return 1;\n }\n return a.localeCompare(b);\n};\n","export const formatProportion = (proportion: number, digits: number = 2) => {\n return `${(proportion * 100).toFixed(digits)}%`;\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getMutationComparisonTableData } from './getMutationComparisonTableData';\nimport { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport { type DeletionClass, type SubstitutionClass } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { Table } from '../components/table';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsTableProps {\n data: Dataset<MutationData>;\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nexport const MutationComparisonTable: FunctionComponent<MutationsTableProps> = ({\n data,\n proportionInterval,\n pageSize,\n}) => {\n const headers = [\n {\n name: 'Mutation',\n sort: {\n compare: sortSubstitutionsAndDeletions,\n },\n formatter: (cell: SubstitutionClass | DeletionClass) => cell.toString(),\n },\n {\n name: 'Prevalence',\n columns: data.content.map((mutationData) => {\n return {\n name: mutationData.displayName,\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n };\n }),\n },\n ];\n\n const tableData = getMutationComparisonTableData(data, proportionInterval).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={headers} pageSize={pageSize} />;\n};\n","import { Chart, type ChartConfiguration } from 'chart.js';\nimport { type MutableRef, useEffect, useRef } from 'preact/hooks';\n\nexport interface GsChartProps {\n configuration: ChartConfiguration;\n}\n\nconst GsChart = ({ configuration }: GsChartProps) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const chartRef = useRef<Chart | null>(null);\n\n useEffect(() => {\n if (canvasRef.current === null) {\n return;\n }\n\n const ctx = canvasRef.current.getContext('2d');\n if (ctx === null) {\n return;\n }\n\n chartRef.current = new Chart(ctx, configuration);\n\n resizeChartAfterFullscreenChange(chartRef, ctx, configuration);\n\n return () => {\n chartRef.current?.destroy();\n };\n }, [canvasRef, configuration]);\n\n return <canvas ref={canvasRef} />;\n};\n\nexport default GsChart;\n\nconst resizeChartAfterFullscreenChange = (\n chartRef: MutableRef<Chart | null>,\n ctx: CanvasRenderingContext2D,\n configuration: ChartConfiguration,\n) => {\n document.addEventListener('fullscreenchange', () => {\n chartRef.current?.destroy();\n chartRef.current = new Chart(ctx, configuration);\n });\n};\n","import { type ActiveElement, Chart, type ChartConfiguration, type ChartEvent, registerables } from 'chart.js';\nimport { ArcSlice, extractSets, VennDiagramController } from 'chartjs-chart-venn';\nimport { type FunctionComponent } from 'preact';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\n\nimport { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport GsChart from '../components/chart';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\nChart.register(...registerables, VennDiagramController, ArcSlice);\n\nexport interface MutationComparisonVennProps {\n data: Dataset<MutationData>;\n proportionInterval: ProportionInterval;\n}\n\nexport const MutationComparisonVenn: FunctionComponent<MutationComparisonVennProps> = ({\n data,\n proportionInterval,\n}) => {\n const divRef = useRef<HTMLDivElement>(null);\n const noElementSelectedMessage = 'You have no elements selected. Click in the venn diagram to select.';\n const [selectedDatasetIndex, setSelectedDatasetIndex] = useState<null | number>(null);\n\n const sets = useMemo(\n () =>\n extractSets(\n data.content\n .map((mutationData) => ({\n displayName: mutationData.displayName,\n data: mutationData.data.filter(\n (mutationEntry) =>\n mutationEntry.proportion >= proportionInterval.min &&\n mutationEntry.proportion <= proportionInterval.max,\n ),\n }))\n .map((mutationData) => {\n return {\n label: mutationData.displayName,\n values: mutationData.data.map((mutationEntry) => mutationEntry.mutation.toString()),\n };\n }),\n ),\n [data, proportionInterval],\n );\n\n useEffect(() => {\n if (divRef.current === null) {\n return;\n }\n if (selectedDatasetIndex === null) {\n divRef.current.innerText = noElementSelectedMessage;\n return;\n }\n\n const values = sets.datasets[0].data[selectedDatasetIndex].values;\n const label = sets.datasets[0].data[selectedDatasetIndex].label;\n divRef.current!.innerText = `${label}: ${values.join(', ')}` || '';\n }, [divRef, selectedDatasetIndex, sets]);\n\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'venn',\n data: sets,\n options: {\n maintainAspectRatio: false,\n scales: {\n x: {\n ticks: {\n color: 'black',\n font: {\n size: 20,\n },\n },\n },\n y: {\n ticks: {\n color: 'blue',\n font: {\n size: 20,\n },\n },\n },\n },\n events: ['click'],\n onClick(_: ChartEvent, elements: ActiveElement[]) {\n if (elements.length === 0) {\n setSelectedDatasetIndex(null);\n }\n },\n backgroundColor: '#f5f5f5',\n animation: false,\n layout: {\n padding: 30,\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n filter: ({ dataIndex }) => {\n setSelectedDatasetIndex(dataIndex);\n return false;\n },\n },\n },\n },\n }),\n [sets],\n );\n\n if (data.content.length > 5) {\n return <div>Too many datasets to display. Maximum are five. </div>;\n }\n\n return (\n <div className='h-full flex flex-col'>\n <div className='flex-1'>\n <GsChart configuration={config} />\n </div>\n <div class='flex flex-wrap break-words m-2' ref={divRef} />\n </div>\n );\n};\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchSubstitutionsOrDeletions } from '../lapisApi/lapisApi';\nimport { type LapisFilter, type SequenceType, type SubstitutionOrDeletionEntry } from '../types';\nimport { DeletionClass, SubstitutionClass } from '../utils/mutations';\n\nexport class FetchSubstitutionsOrDeletionsOperator implements Operator<SubstitutionOrDeletionEntry> {\n constructor(\n private filter: LapisFilter,\n private sequenceType: SequenceType,\n private minProportion?: number,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<SubstitutionOrDeletionEntry>> {\n const mutations = await this.fetchMutations(lapis, signal);\n\n const content: SubstitutionOrDeletionEntry[] = mutations.map(\n ({ count, proportion, mutationFrom, mutationTo, position, sequenceName }) => {\n if (mutationTo === '-') {\n return {\n type: 'deletion',\n mutation: new DeletionClass(sequenceName ?? undefined, mutationFrom, position),\n count,\n proportion,\n };\n }\n return {\n type: 'substitution',\n mutation: new SubstitutionClass(sequenceName ?? undefined, mutationFrom, mutationTo, position),\n count,\n proportion,\n };\n },\n );\n\n return { content };\n }\n\n private async fetchMutations(lapis: string, signal?: AbortSignal) {\n const filter = {\n ...this.filter,\n minProportion: this.minProportion,\n };\n\n return fetchSubstitutionsOrDeletions(lapis, filter, this.sequenceType, signal).then(\n (response) => response.data,\n );\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class SortOperator<S> implements Operator<S> {\n constructor(\n private child: Operator<S>,\n private compareFn: (a: S, b: S) => number,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<S>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n return {\n content: childEvaluated.content.sort(this.compareFn),\n };\n }\n}\n","import { FetchSubstitutionsOrDeletionsOperator } from '../operator/FetchSubstitutionsOrDeletionsOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type LapisFilter, type SequenceType } from '../types';\n\nexport function querySubstitutionsOrDeletions(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\n lapis: string,\n signal?: AbortSignal,\n) {\n const fetchData = new FetchSubstitutionsOrDeletionsOperator(lapisFilter, sequenceType, 0);\n const sortData = new SortOperator(fetchData, (a, b) => {\n if (a.mutation.segment !== b.mutation.segment) {\n return (a.mutation.segment ?? '').localeCompare(b.mutation.segment ?? '');\n }\n return a.mutation.position - b.mutation.position;\n });\n return sortData.evaluate(lapis, signal);\n}\n","import { querySubstitutionsOrDeletions } from '../../query/querySubstitutionsOrDeletions';\nimport { type NamedLapisFilter, type SubstitutionOrDeletionEntry } from '../../types';\nimport { type DisplayedMutationType } from '../components/mutation-type-selector';\nimport { type DisplayedSegment } from '../components/segment-selector';\n\nexport type MutationData = {\n displayName: string;\n data: SubstitutionOrDeletionEntry[];\n};\n\nexport async function queryMutationData(\n lapisFilters: NamedLapisFilter[],\n sequenceType: 'nucleotide' | 'amino acid',\n lapis: string,\n) {\n const mutationData = await Promise.all(\n lapisFilters.map(async (filter) => {\n return {\n displayName: filter.displayName,\n data: (await querySubstitutionsOrDeletions(filter.lapisFilter, sequenceType, lapis)).content,\n };\n }),\n );\n return { mutationData };\n}\n\nexport function filterMutationData(\n data: MutationData[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n return data.map((mutationEntry) => ({\n displayName: mutationEntry.displayName,\n data: filterBySegmentAndMutationType(mutationEntry.data, displayedSegments, displayedMutationTypes),\n }));\n}\n\nexport function filterBySegmentAndMutationType(\n data: SubstitutionOrDeletionEntry[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n const byDisplayedSegments = (mutationEntry: SubstitutionOrDeletionEntry) => {\n if (mutationEntry.mutation.segment === undefined) {\n return true;\n }\n return displayedSegments.some(\n (displayedSegment) =>\n displayedSegment.segment === mutationEntry.mutation.segment && displayedSegment.checked,\n );\n };\n const byDisplayedMutationTypes = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return displayedMutationTypes.some(\n (displayedMutationType) =>\n displayedMutationType.checked && displayedMutationType.type === mutationEntry.type,\n );\n };\n\n return data.filter(byDisplayedSegments).filter(byDisplayedMutationTypes);\n}\n","import { createContext } from 'preact';\n\nexport const LapisUrlContext = createContext('');\n","import { type FunctionComponent } from 'preact';\n\ntype ToStringable = {\n toString: () => string;\n};\n\ntype DataValue = string | number | boolean | null | ToStringable;\n\nexport interface CsvDownloadButtonProps {\n label?: string;\n filename?: string;\n getData: () => Record<string, DataValue>[];\n className?: string;\n}\n\nexport const CsvDownloadButton: FunctionComponent<CsvDownloadButtonProps> = ({\n label = 'Download',\n filename = 'data.csv',\n getData,\n className,\n}) => {\n const download = () => {\n const content = getDownloadContent();\n const blob = new Blob([content], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n const getDownloadContent = () => {\n const data = getData();\n const keys = getDataKeys(data);\n const header = `${keys.join(',')}\\n`;\n const rows = data.map((row) => keys.map((key) => row[key]).join(',')).join('\\n');\n return header + rows;\n };\n\n const getDataKeys = (data: Record<string, DataValue>[]) => {\n const keysSet = data\n .map((row) => Object.keys(row))\n .reduce((accumulatedKeys, keys) => {\n keys.forEach((key) => accumulatedKeys.add(key));\n return accumulatedKeys;\n }, new Set<string>());\n\n return [...keysSet];\n };\n\n return (\n <button className={className} onClick={download}>\n {label}\n </button>\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\n\nimport { LapisError, UnknownLapisError } from '../../lapisApi/lapisApi';\n\nexport const GS_ERROR_EVENT_TYPE = 'gs-error';\n\nexport class ErrorEvent extends Event {\n constructor(public readonly error: Error) {\n super(GS_ERROR_EVENT_TYPE, {\n bubbles: true,\n composed: true,\n });\n }\n}\n\nexport class UserFacingError extends Error {\n constructor(\n public readonly headline: string,\n message: string,\n ) {\n super(message);\n this.name = 'UserFacingError';\n }\n}\n\nexport type ErrorDisplayProps = {\n error: Error;\n resetError: () => void;\n layout?: 'horizontal' | 'vertical';\n};\n\nexport const ErrorDisplay: FunctionComponent<ErrorDisplayProps> = ({ error, resetError, layout }) => {\n // eslint-disable-next-line no-console -- Currently we use the following statement for our error handling\n console.error(error);\n\n const containerRef = useRef<HTMLInputElement>(null);\n const ref = useRef<HTMLDialogElement>(null);\n\n useEffect(() => {\n containerRef.current?.dispatchEvent(new ErrorEvent(error));\n });\n\n const { headline, details } = getDisplayedErrorMessage(error);\n\n return (\n <div\n ref={containerRef}\n className={`h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center ${layout === 'horizontal' ? 'flex-row' : 'flex-col'}`}\n >\n <div>\n <div className='text-red-700 font-bold'>{headline}</div>\n <div>\n Oops! Something went wrong.\n {details !== undefined && (\n <>\n {' '}\n <button className='underline hover:text-gray-400' onClick={() => ref.current?.showModal()}>\n Show details.\n </button>\n <dialog ref={ref} class='modal'>\n <div class='modal-box'>\n <form method='dialog'>\n <button className='btn btn-sm btn-circle btn-ghost absolute right-2 top-2'>\n ✕\n </button>\n </form>\n <h1 class='text-lg'>{details.headline}</h1>\n <p class='py-4'>{details.message}</p>\n </div>\n <form method='dialog' class='modal-backdrop'>\n <button>close</button>\n </form>\n </dialog>\n </>\n )}\n </div>\n </div>\n <button onClick={resetError} className='btn btn-sm flex items-center m-4'>\n <span className='iconify mdi--reload text-lg' />\n Try again\n </button>\n </div>\n );\n};\n\nfunction getDisplayedErrorMessage(error: Error) {\n if (error instanceof UserFacingError) {\n return {\n headline: `Error - ${error.headline}`,\n details: {\n headline: error.headline,\n message: error.message,\n },\n };\n }\n\n if (error instanceof LapisError) {\n return {\n headline: `Error - Failed fetching ${error.requestedData} from LAPIS`,\n details: {\n headline: `LAPIS request failed: ${error.requestedData} - ${error.problemDetail.status} ${error.problemDetail.title}`,\n message: error.problemDetail.detail ?? error.message,\n },\n };\n }\n\n if (error instanceof UnknownLapisError) {\n return {\n headline: `Error - Failed fetching ${error.requestedData} from LAPIS`,\n details: {\n headline: `LAPIS request failed: An unexpected error occurred while fetching ${error.requestedData}`,\n message: error.message,\n },\n };\n }\n\n return { headline: 'Error', details: undefined };\n}\n","import { type FunctionComponent } from 'preact';\n\nexport type Size = {\n width: string;\n height: string;\n};\n\nexport interface ResizeContainerProps {\n size: Size;\n}\n\nexport const ResizeContainer: FunctionComponent<ResizeContainerProps> = ({ children, size }) => {\n return (\n <div style={size} className='bg-white'>\n {children}\n </div>\n );\n};\n","import type { FunctionComponent } from 'preact';\nimport { useErrorBoundary } from 'preact/hooks';\n\nimport { ErrorDisplay, type ErrorDisplayProps } from './error-display';\nimport { ResizeContainer, type Size } from './resize-container';\n\ntype ErrorBoundaryProps = {\n size: Size;\n layout?: ErrorDisplayProps['layout'];\n};\n\nexport const ErrorBoundary: FunctionComponent<ErrorBoundaryProps> = ({ size, layout, children }) => {\n const [internalError, resetError] = useErrorBoundary();\n\n if (internalError) {\n return (\n <ResizeContainer size={size}>\n <ErrorDisplay error={internalError} resetError={resetError} layout={layout} />\n </ResizeContainer>\n );\n }\n\n return <>{children}</>;\n};\n","import { useEffect, useRef, useState } from 'preact/hooks';\n\nexport const Fullscreen = () => {\n const element = useRef<HTMLButtonElement>(null);\n const isFullscreen = useFullscreenStatus();\n return (\n <button\n ref={element}\n onClick={async () => {\n if (element.current) {\n if (isFullscreen) {\n await document.exitFullscreen();\n } else {\n const componentRoot = findComponentRoot(element.current);\n if (componentRoot) {\n await componentRoot.requestFullscreen();\n }\n }\n }\n }}\n className={`mt-0.5 iconify text-2xl ${isFullscreen ? 'mdi--fullscreen-exit hover:scale-90' : 'mdi--fullscreen hover:scale-110'}`}\n title={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n />\n );\n};\n\nfunction findComponentRoot(element: HTMLElement) {\n return findShadowRoot(element)?.children[0];\n}\n\nfunction findShadowRoot(element: HTMLElement) {\n let current: Node = element;\n while (current) {\n if (current instanceof ShadowRoot) {\n return current;\n }\n if (current.parentNode === null) {\n return null;\n }\n current = current.parentNode;\n }\n return null;\n}\n\nfunction useFullscreenStatus(): boolean {\n const [isFullscreen, setIsFullscreen] = useState<boolean>(document.fullscreenElement !== null);\n useEffect(() => {\n const handleFullscreenChange = () => {\n setIsFullscreen(document.fullscreenElement !== null);\n };\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n return isFullscreen;\n}\n","import { type FunctionComponent } from 'preact';\nimport { useRef } from 'preact/hooks';\n\nconst Info: FunctionComponent = ({ children }) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n\n const toggleHelp = () => {\n dialogRef.current?.showModal();\n };\n\n return (\n <div className='relative'>\n <button type='button' className='btn btn-xs' onClick={toggleHelp}>\n ?\n </button>\n <dialog ref={dialogRef} className={'modal modal-bottom sm:modal-middle'}>\n <div className='modal-box sm:max-w-5xl'>\n <form method='dialog'>\n <button className='btn btn-sm btn-circle btn-ghost absolute right-2 top-2'>✕</button>\n </form>\n <div className={'flex flex-col'}>{children}</div>\n <div className='modal-action'>\n <form method='dialog'>\n <button className={'float-right underline text-sm hover:text-blue-700 mr-2'}>Close</button>\n </form>\n </div>\n </div>\n <form method='dialog' className='modal-backdrop'>\n <button>Helper to close when clicked outside</button>\n </form>\n </dialog>\n </div>\n );\n};\n\nexport const InfoHeadline1: FunctionComponent = ({ children }) => {\n return <h1 className='text-lg font-bold'>{children}</h1>;\n};\n\nexport const InfoHeadline2: FunctionComponent = ({ children }) => {\n return <h2 className='text-base font-bold mt-4'>{children}</h2>;\n};\n\nexport const InfoParagraph: FunctionComponent = ({ children }) => {\n return <p className='text-justify my-1'>{children}</p>;\n};\n\nexport const InfoLink: FunctionComponent<{ href: string }> = ({ children, href }) => {\n return (\n <a className='text-blue-600 hover:text-blue-800' href={href} target='_blank' rel='noopener noreferrer'>\n {children}\n </a>\n );\n};\n\nexport type InfoComponentCodeProps = {\n componentName: string;\n params: object;\n lapisUrl: string;\n};\n\nexport const InfoComponentCode: FunctionComponent<InfoComponentCodeProps> = ({ componentName, params, lapisUrl }) => {\n const componentCode = componentParametersToCode(componentName, params, lapisUrl);\n const codePenData = {\n title: 'GenSpectrum dashboard component',\n html: generateFullExampleCode(componentCode, componentName),\n layout: 'left',\n editors: '100',\n };\n return (\n <>\n <InfoHeadline2>Use this component yourself</InfoHeadline2>\n <InfoParagraph>\n This component was created using the following parameters:\n <div className='p-4 border border-gray-200 rounded-lg overflow-x-auto'>\n <pre>\n <code>{componentCode}</code>\n </pre>\n </div>\n </InfoParagraph>\n <InfoParagraph>\n You can add this component to your own website using the{' '}\n <InfoLink href='https://github.com/GenSpectrum/dashboard-components'>\n GenSpectrum dashboard components library\n </InfoLink>{' '}\n and the code from above.\n </InfoParagraph>\n <InfoParagraph>\n <form action='https://codepen.io/pen/define' method='POST' target='_blank'>\n <input\n type='hidden'\n name='data'\n value={JSON.stringify(codePenData).replace(/\"/g, '&quot;').replace(/'/g, '&apos;')}\n />\n\n <button className='text-blue-600 hover:text-blue-800' type='submit'>\n Click here to try it out on CodePen.\n </button>\n </form>\n </InfoParagraph>\n </>\n );\n};\n\nexport default Info;\n\nfunction componentParametersToCode(componentName: string, params: object, lapisUrl: string) {\n const stringifyIfNeeded = (value: unknown) => {\n return typeof value === 'object' ? JSON.stringify(value) : value;\n };\n\n const attributes = indentLines(\n Object.entries(params)\n .map(([key, value]) => `${key}='${stringifyIfNeeded(value)}'`)\n .join('\\n'),\n 4,\n );\n return `<gs-app lapis=\"${lapisUrl}\">\\n <gs-${componentName}\\n${attributes}\\n />\\n</gs-app>`;\n}\n\nfunction generateFullExampleCode(componentCode: string, componentName: string) {\n const storyBookPath = `/docs/visualization-${componentName}--docs`;\n return `<html>\n<head>\n <script type=\"module\" src=\"https://unpkg.com/@genspectrum/dashboard-components@latest/standalone-bundle/dashboard-components.js\"></script>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/@genspectrum/dashboard-components@latest/dist/style.css\" />\n</head>\n\n<body>\n <!-- Component documentation: https://genspectrum.github.io/dashboard-components/?path=${storyBookPath} -->\n${indentLines(componentCode, 2)}\n</body>\n</html>\n`;\n}\n\nfunction indentLines(text: string, numberSpaces: number) {\n const spaces = ' '.repeat(numberSpaces);\n return text\n .split('\\n')\n .map((line) => spaces + line)\n .join('\\n');\n}\n","import { type FunctionComponent } from 'preact';\n\nexport const LoadingDisplay: FunctionComponent = () => {\n return (\n <div\n aria-label={'Loading'}\n className='h-full w-full border-2 border-gray-100 rounded-md flex justify-center items-center'\n >\n <div className='loading loading-spinner loading-md text-neutral-500' />\n </div>\n );\n};\n","import { autoUpdate, computePosition, type Middleware } from '@floating-ui/dom';\nimport type { Placement } from '@floating-ui/utils';\nimport { useEffect, useRef } from 'preact/hooks';\nimport type { MutableRefObject } from 'react';\n\nexport function useFloatingUi(\n referenceRef: MutableRefObject<HTMLElement | null>,\n floatingRef: MutableRefObject<HTMLElement | null>,\n middleware?: Array<Middleware | null | undefined | false>,\n placement?: Placement,\n) {\n const cleanupRef = useRef<() => void | null>(null);\n\n useEffect(() => {\n if (!referenceRef.current || !floatingRef.current) {\n return;\n }\n\n const { current: reference } = referenceRef;\n const { current: floating } = floatingRef;\n\n const update = () => {\n computePosition(reference, floating, {\n placement,\n middleware,\n }).then(({ x, y }) => {\n floating.style.left = `${x}px`;\n floating.style.top = `${y}px`;\n });\n };\n\n update();\n cleanupRef.current = autoUpdate(reference, floating, update);\n\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current();\n }\n };\n }, [placement, middleware, referenceRef, floatingRef]);\n}\n\nexport function useCloseOnClickOutside(\n floatingRef: MutableRefObject<HTMLElement | null>,\n referenceRef: MutableRefObject<HTMLElement | null>,\n setShowContent: (value: ((prevState: boolean) => boolean) | boolean) => void,\n) {\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const path = event.composedPath();\n if (\n floatingRef.current &&\n !path.includes(floatingRef.current) &&\n referenceRef.current &&\n !path.includes(referenceRef.current)\n ) {\n setShowContent(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [floatingRef, referenceRef, setShowContent]);\n}\n\nexport function useCloseOnEsc(setShowHelp: (value: ((prevState: boolean) => boolean) | boolean) => void) {\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setShowHelp(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [setShowHelp]);\n}\n","import { flip, offset, shift } from '@floating-ui/dom';\nimport { type Placement } from '@floating-ui/utils';\nimport { type FunctionComponent } from 'preact';\nimport { useRef, useState } from 'preact/hooks';\n\nimport { useCloseOnClickOutside, useCloseOnEsc, useFloatingUi } from '../shared/floating-ui/hooks';\n\ninterface DropdownProps {\n buttonTitle: string;\n placement?: Placement;\n}\n\nexport const dropdownClass =\n 'z-10 absolute w-max top-0 left-0 bg-white p-4 border border-gray-200 shadow-lg rounded-md';\n\nexport const Dropdown: FunctionComponent<DropdownProps> = ({ children, buttonTitle, placement }) => {\n const [showContent, setShowContent] = useState(false);\n const referenceRef = useRef<HTMLButtonElement>(null);\n const floatingRef = useRef<HTMLDivElement>(null);\n\n useFloatingUi(referenceRef, floatingRef, [offset(4), shift(), flip()], placement);\n\n useCloseOnClickOutside(floatingRef, referenceRef, setShowContent);\n useCloseOnEsc(setShowContent);\n\n const toggle = () => {\n setShowContent(!showContent);\n };\n\n return (\n <>\n <button type='button' className='btn btn-xs whitespace-nowrap w-full' onClick={toggle} ref={referenceRef}>\n {buttonTitle}\n </button>\n <div ref={floatingRef} className={`${dropdownClass} ${showContent ? '' : 'hidden'}`}>\n {children}\n </div>\n </>\n );\n};\n","import { Dropdown } from './dropdown';\n\nexport type CheckboxItem = {\n label: string;\n checked: boolean;\n};\n\nexport interface CheckboxSelectorProps<Item extends CheckboxItem = CheckboxItem> {\n items: Item[];\n label: string;\n setItems: (items: Item[]) => void;\n}\n\nexport const CheckboxSelector = <Item extends CheckboxItem>({\n items,\n label,\n setItems,\n}: CheckboxSelectorProps<Item>) => {\n return (\n <Dropdown buttonTitle={label} placement={'bottom-start'}>\n <button\n className='btn btn-xs btn-ghost'\n onClick={() => {\n const newItems = items.map((item) => ({ ...item, checked: true }));\n setItems(newItems);\n }}\n >\n Select all\n </button>\n <button\n className='btn btn-xs btn-ghost'\n onClick={() => {\n const newItems = items.map((item) => ({ ...item, checked: false }));\n setItems(newItems);\n }}\n >\n Select none\n </button>\n <div className='divider mt-0 mb-0' />\n <ul>\n {items.map((item, index) => (\n <li className='flex flex-row items-center' key={item.label}>\n <label>\n <input\n className={'mr-2'}\n type='checkbox'\n id={`item-${index}`}\n checked={item.checked}\n onChange={() => {\n const newItems = items.map((item, i) =>\n i === index ? { ...item, checked: !item.checked } : item,\n );\n setItems(newItems);\n }}\n />\n {item.label}\n </label>\n </li>\n ))}\n </ul>\n </Dropdown>\n );\n};\n","import { type FunctionComponent } from 'preact/compat';\n\nimport { type CheckboxItem, CheckboxSelector } from './checkbox-selector';\nimport type { SubstitutionOrDeletion } from '../../types';\n\nexport type DisplayedMutationType = CheckboxItem & {\n type: SubstitutionOrDeletion;\n};\n\nexport type MutationTypeSelectorProps = {\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (mutationTypes: DisplayedMutationType[]) => void;\n};\n\nexport const MutationTypeSelector: FunctionComponent<MutationTypeSelectorProps> = ({\n displayedMutationTypes,\n setDisplayedMutationTypes,\n}) => {\n return (\n <div className='w-[6rem]'>\n <CheckboxSelector\n items={displayedMutationTypes}\n label={getMutationTypesSelectorLabel(displayedMutationTypes)}\n setItems={(items) => setDisplayedMutationTypes(items)}\n />\n </div>\n );\n};\n\nconst getMutationTypesSelectorLabel = (displayedMutationTypes: DisplayedMutationType[]) => {\n const checkedLabels = displayedMutationTypes.filter((displayedMutationType) => displayedMutationType.checked);\n\n if (checkedLabels.length === 0) {\n return `No types`;\n }\n if (displayedMutationTypes.length === checkedLabels.length) {\n return displayedMutationTypes\n .map((type) => {\n switch (type.type) {\n case 'substitution':\n return 'Subst.';\n case 'deletion':\n return 'Del.';\n }\n })\n .join(', ');\n }\n\n return checkedLabels\n .map((type) => {\n return type.label;\n })\n .join(', ');\n};\n","import { type FunctionComponent } from 'preact';\n\nexport const NoDataDisplay: FunctionComponent = () => {\n return (\n <div className='h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center'>\n <div>No data available.</div>\n </div>\n );\n};\n","import { type FunctionComponent, type JSX } from 'preact';\nimport { useState } from 'preact/hooks';\n\nimport './min-max-percent-slider.css';\n\nexport interface MinMaxPercentSliderProps {\n min: number;\n max: number;\n setMin: (min: number) => void;\n setMax: (max: number) => void;\n rangeMin?: number;\n rangeMax?: number;\n step?: number;\n}\n\nexport const MinMaxRangeSlider: FunctionComponent<MinMaxPercentSliderProps> = ({\n min,\n max,\n setMin,\n setMax,\n rangeMin = 0,\n rangeMax = 100,\n step = 0.1,\n}) => {\n const sliderColor = '#C6C6C6';\n const rangeColor = '#387bbe';\n\n const [zIndexTo, setZIndexTo] = useState(0);\n\n const onMinChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const minValue = Number(input.value);\n\n if (minValue > max) {\n setMax(minValue);\n setMin(minValue);\n } else {\n setMin(minValue);\n }\n };\n\n const onMaxChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const maxValue = Number(input.value);\n\n if (maxValue <= 0) {\n setZIndexTo(2);\n } else {\n setZIndexTo(0);\n }\n\n if (maxValue < min) {\n setMin(maxValue);\n setMax(maxValue);\n } else {\n setMax(maxValue);\n }\n };\n\n const background = `\n linear-gradient(\n to right,\n ${sliderColor} 0%,\n ${sliderColor} ${min}%,\n ${rangeColor} ${min}%,\n ${rangeColor} ${max}%,\n ${sliderColor} ${max}%,\n ${sliderColor} 100%)\n `;\n\n return (\n <div class='my-4 relative w-full h-full'>\n <input\n id='fromSlider'\n type='range'\n value={min}\n onInput={onMinChange}\n min={rangeMin}\n max={rangeMax}\n step={step}\n style={{ background, zIndex: 1, height: 0 }}\n />\n <input\n id='toSlider'\n type='range'\n value={max}\n min={rangeMin}\n max={rangeMax}\n step={step}\n onInput={onMaxChange}\n style={{ background, zIndex: zIndexTo }}\n />\n </div>\n );\n};\n","import { type FunctionComponent, type JSX } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\n\nexport type PercentInputProps = {\n percentage: number;\n setPercentage: (percentage: number) => void;\n indicateError?: boolean;\n};\n\nconst percentageInRange = (percentage: number) => {\n return percentage <= 100 && percentage >= 0;\n};\n\nexport const PercentInput: FunctionComponent<PercentInputProps> = ({\n percentage,\n setPercentage,\n indicateError = false,\n}) => {\n const [internalPercentage, setInternalPercentage] = useState(percentage);\n\n useEffect(() => {\n setInternalPercentage(percentage);\n }, [percentage]);\n\n const handleInputChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const value = Number(input.value);\n\n if (value === internalPercentage || input.value === '') {\n return;\n }\n\n const inRange = percentageInRange(value);\n\n if (inRange) {\n setPercentage(value);\n }\n setInternalPercentage(value);\n };\n\n const isError = indicateError || !percentageInRange(internalPercentage);\n return (\n <label className={`input input-bordered flex items-center gap-2 w-32 ${isError ? 'input-error' : ''}`}>\n <input\n type='number'\n step={0.1}\n min={0}\n max={100}\n value={internalPercentage}\n onInput={handleInputChange}\n lang='en'\n className={`grow w-16`}\n />\n %\n </label>\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { MinMaxRangeSlider } from './min-max-range-slider';\nimport { PercentInput } from './percent-intput';\n\nexport type ProportionInterval = { min: number; max: number };\n\nexport interface ProportionSelectorProps {\n proportionInterval: ProportionInterval;\n setMinProportion: (minProportion: number) => void;\n setMaxProportion: (maxProportion: number) => void;\n}\n\nfunction useUpdateExternalValueInIntervals(\n setExternalValue: (minProportion: number) => void,\n updateIntervalInMs: number,\n internalValue: number,\n) {\n const hasMounted = useRef(false);\n\n useEffect(() => {\n if (!hasMounted.current) {\n hasMounted.current = true;\n return;\n }\n\n const minTimeout = setTimeout(() => {\n setExternalValue(internalValue);\n }, updateIntervalInMs);\n\n return () => clearTimeout(minTimeout);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- We only want to run this effect when the internal value changes\n }, [internalValue]);\n}\n\nexport const ProportionSelector: FunctionComponent<ProportionSelectorProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n}) => {\n const updateIntervalInMs = 300;\n const { min: minProportion, max: maxProportion } = proportionInterval;\n\n const [internalMinProportion, setInternalMinProportion] = useState(minProportion);\n const [internalMaxProportion, setInternalMaxProportion] = useState(maxProportion);\n\n useUpdateExternalValueInIntervals(setMinProportion, updateIntervalInMs, internalMinProportion);\n const updateMinPercentage = (minPercentage: number) => {\n const newMinProportion = minPercentage / 100;\n setInternalMinProportion(newMinProportion);\n };\n\n useUpdateExternalValueInIntervals(setMaxProportion, updateIntervalInMs, internalMaxProportion);\n const updateMaxPercentage = (maxPercentage: number) => {\n const newMaxProportion = maxPercentage / 100;\n setInternalMaxProportion(newMaxProportion);\n };\n\n const indicateError = internalMinProportion > internalMaxProportion;\n\n return (\n <div class='flex flex-col w-64 mb-2'>\n <div class='flex items-center '>\n <PercentInput\n percentage={internalMinProportion * 100}\n setPercentage={updateMinPercentage}\n indicateError={indicateError}\n />\n <div class='m-2'>-</div>\n <PercentInput\n percentage={internalMaxProportion * 100}\n setPercentage={updateMaxPercentage}\n indicateError={indicateError}\n />\n </div>\n <div class='my-1'>\n <MinMaxRangeSlider\n min={internalMinProportion * 100}\n max={internalMaxProportion * 100}\n setMin={updateMinPercentage}\n setMax={updateMaxPercentage}\n />\n </div>\n </div>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Dropdown } from './dropdown';\nimport { ProportionSelector, type ProportionSelectorProps } from './proportion-selector';\n\nexport type ProportionSelectorDropdownProps = ProportionSelectorProps & { labelPrefix?: string };\n\nexport const ProportionSelectorDropdown: FunctionComponent<ProportionSelectorDropdownProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n labelPrefix = 'Proportion',\n}) => {\n const percentLabel = `${(proportionInterval.min * 100).toFixed(1)}% - ${(proportionInterval.max * 100).toFixed(1)}%`;\n\n const width = 'w-[calc(1.5 * var(--tw-space-x-reverse) + 1.5 * var(--tw-space-x))]';\n\n return (\n <div className={width}>\n <Dropdown buttonTitle={`${labelPrefix} ${percentLabel}`} placement={'bottom-start'}>\n <ProportionSelector\n proportionInterval={proportionInterval}\n setMinProportion={setMinProportion}\n setMaxProportion={setMaxProportion}\n />\n </Dropdown>\n </div>\n );\n};\n","import { createContext } from 'preact';\n\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\n\nexport const ReferenceGenomeContext = createContext<ReferenceGenome>({ nucleotideSequences: [], genes: [] });\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport { type CheckboxItem, CheckboxSelector } from './checkbox-selector';\nimport { getSegmentNames } from '../../lapisApi/ReferenceGenome';\nimport { type SequenceType } from '../../types';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\n\nexport type DisplayedSegment = CheckboxItem & {\n segment: string;\n};\n\nexport type SegmentSelectorProps = {\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (items: DisplayedSegment[]) => void;\n};\n\nexport const SegmentSelector: FunctionComponent<SegmentSelectorProps> = ({\n displayedSegments,\n setDisplayedSegments,\n}) => {\n if (displayedSegments.length <= 1) {\n return null;\n }\n\n return (\n <div className='w-24'>\n <CheckboxSelector\n items={displayedSegments}\n label={getSegmentSelectorLabel(displayedSegments)}\n setItems={(items) => setDisplayedSegments(items)}\n />\n </div>\n );\n};\n\nconst getSegmentSelectorLabel = (displayedSegments: DisplayedSegment[]) => {\n const allSelectedSelected = displayedSegments\n .filter((segment) => segment.checked)\n .map((segment) => segment.segment);\n\n if (allSelectedSelected.length === 0) {\n return `No segments`;\n }\n if (displayedSegments.length === allSelectedSelected.length) {\n return `All segments`;\n }\n\n const longestDisplayString = `All segments`;\n\n const allSelectedSelectedString = allSelectedSelected.join(', ');\n\n if (longestDisplayString.length >= allSelectedSelectedString.length) {\n return allSelectedSelectedString;\n }\n\n return `${allSelectedSelected.length} ${allSelectedSelected.length === 1 ? 'segment' : 'segments'}`;\n};\n\nexport function useDisplayedSegments(sequenceType: SequenceType) {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const displayedSegments = getSegmentNames(referenceGenome, sequenceType).map((segment) => ({\n segment,\n label: segment,\n checked: true,\n }));\n\n return useState<DisplayedSegment[]>(displayedSegments);\n}\n","import { Fragment, type FunctionComponent } from 'preact';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { type JSXInternal } from 'preact/src/jsx';\n\ntype Tab = {\n title: string;\n content: JSXInternal.Element;\n};\n\ninterface ComponentTabsProps {\n tabs: Tab[];\n toolbar?: JSXInternal.Element | ((activeTab: string) => JSXInternal.Element);\n}\n\nconst Tabs: FunctionComponent<ComponentTabsProps> = ({ tabs, toolbar }) => {\n const [activeTab, setActiveTab] = useState(tabs[0].title);\n const [heightOfTabs, setHeightOfTabs] = useState('3rem');\n const tabRef = useRef<HTMLDivElement>(null);\n\n const updateHeightOfTabs = () => {\n if (tabRef.current) {\n const heightOfTabs = tabRef.current.getBoundingClientRect().height;\n setHeightOfTabs(`${heightOfTabs}px`);\n }\n };\n\n useEffect(() => {\n updateHeightOfTabs();\n\n window.addEventListener('resize', updateHeightOfTabs);\n return () => {\n window.removeEventListener('resize', updateHeightOfTabs);\n };\n }, []);\n\n const tabElements = (\n <div className='flex flex-row'>\n {tabs.map((tab) => {\n return (\n <Fragment key={tab.title}>\n <button\n className={`px-4 py-2 text-sm font-medium leading-5 transition-colors duration-150 ${\n activeTab === tab.title\n ? 'border-b-2 border-gray-400'\n : 'text-gray-600 hover:bg-gray-100 hover:text-gray-700'\n }`}\n onClick={() => {\n setActiveTab(tab.title);\n }}\n >\n {tab.title}\n </button>\n </Fragment>\n );\n })}\n </div>\n );\n\n const toolbarElement = typeof toolbar === 'function' ? toolbar(activeTab) : toolbar;\n\n return (\n <div className='h-full w-full'>\n <div ref={tabRef} className='flex flex-row justify-between flex-wrap'>\n {tabElements}\n {toolbar && <div className='py-2 flex flex-wrap gap-y-1'>{toolbarElement}</div>}\n </div>\n <div\n className={`p-2 border-2 border-gray-100 rounded-b-md rounded-tr-md ${activeTab === tabs[0].title ? '' : 'rounded-tl-md'}`}\n style={{ height: `calc(100% - ${heightOfTabs})` }}\n >\n {tabs.map((tab) => (\n <div className='h-full overflow-auto' key={tab.title} hidden={activeTab !== tab.title}>\n {tab.content}\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nexport default Tabs;\n","import { useEffect, useState } from 'preact/hooks';\n\nexport function useQuery<Data>(fetchDataCallback: () => Promise<Data>, dependencies: unknown[]) {\n const [data, setData] = useState<Data | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const fetchData = async () => {\n setIsLoading(true);\n try {\n const result = await fetchDataCallback();\n setData(result);\n setError(null);\n } catch (error) {\n setError(error as Error);\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(dependencies)]);\n\n return { data, error, isLoading };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useMemo, useState } from 'preact/hooks';\n\nimport { getMutationComparisonTableData } from './getMutationComparisonTableData';\nimport { MutationComparisonTable } from './mutation-comparison-table';\nimport { MutationComparisonVenn } from './mutation-comparison-venn';\nimport { filterMutationData, type MutationData, queryMutationData } from './queryMutationData';\nimport { type NamedLapisFilter, type SequenceType } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'table' | 'venn';\n\nexport interface MutationComparisonProps {\n width: string;\n height: string;\n lapisFilters: NamedLapisFilter[];\n sequenceType: SequenceType;\n views: View[];\n pageSize: boolean | number;\n}\n\nexport const MutationComparison: FunctionComponent<MutationComparisonProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <MutationComparisonInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationComparisonInner: FunctionComponent<MutationComparisonProps> = (componentProps) => {\n const { lapisFilters, sequenceType } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryMutationData(lapisFilters, sequenceType, lapis);\n }, [lapisFilters, sequenceType, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <MutationComparisonTabs data={data.mutationData} originalComponentProps={componentProps} />;\n};\n\ntype MutationComparisonTabsProps = {\n data: MutationData[];\n originalComponentProps: MutationComparisonProps;\n};\n\nconst MutationComparisonTabs: FunctionComponent<MutationComparisonTabsProps> = ({ data, originalComponentProps }) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.5, max: 1 });\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(originalComponentProps.sequenceType);\n\n const filteredData = useMemo(\n () => filterMutationData(data, displayedSegments, displayedMutationTypes),\n [data, displayedSegments, displayedMutationTypes],\n );\n\n const getTab = (view: View) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: (\n <MutationComparisonTable\n data={{ content: filteredData }}\n proportionInterval={proportionInterval}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n case 'venn':\n return {\n title: 'Venn',\n content: (\n <MutationComparisonVenn\n data={{ content: filteredData }}\n proportionInterval={proportionInterval}\n />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n return (\n <Tabs\n tabs={tabs}\n toolbar={\n <Toolbar\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n filteredData={filteredData}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n originalComponentProps={originalComponentProps}\n />\n }\n />\n );\n};\n\ntype ToolbarProps = {\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n filteredData: MutationData[];\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n originalComponentProps: MutationComparisonProps;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n filteredData,\n proportionInterval,\n setProportionInterval,\n originalComponentProps,\n}) => {\n return (\n <>\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n />\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n <MutationTypeSelector\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getMutationComparisonTableData({ content: filteredData }, proportionInterval)}\n filename='mutation_comparison.csv'\n />\n <MutationComparisonInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype MutationComparisonInfoProps = {\n originalComponentProps: MutationComparisonProps;\n};\n\nconst MutationComparisonInfo: FunctionComponent<MutationComparisonInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Info for mutation comparison</InfoHeadline1>\n <InfoParagraph>TODO: https://github.com/GenSpectrum/dashboard-components/issues/465</InfoParagraph>\n <InfoComponentCode componentName='mutation-comparison' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n","import { consume } from '@lit/context';\nimport { type PropertyValues, ReactiveElement } from '@lit/reactive-element';\nimport { unsafeCSS } from 'lit';\nimport { render } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nimport { lapisContext } from './lapis-context';\nimport { referenceGenomeContext } from './reference-genome-context';\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\nimport { LapisUrlContext } from '../preact/LapisUrlContext';\nimport { ReferenceGenomeContext } from '../preact/ReferenceGenomeContext';\nimport minMaxPercentSliderCss from '../preact/components/min-max-percent-slider.css?inline';\nimport tailwindStyle from '../styles/tailwind.css?inline';\n\nimport '../styles/tailwind.css';\nimport '../preact/components/min-max-percent-slider.css';\n\nconst tailwindElementCss = unsafeCSS(tailwindStyle);\nconst minMaxPercentSliderElementCss = unsafeCSS(minMaxPercentSliderCss);\n\nexport abstract class PreactLitAdapter extends ReactiveElement {\n static override styles = [tailwindElementCss, minMaxPercentSliderElementCss];\n\n /**\n * @internal\n * The URL of the Lapis instance.\n *\n * This component must be a child of a `gs-app` component.\n * This value will automatically be injected by the parent `gs-app` component.\n */\n @consume({ context: lapisContext })\n lapis: string = '';\n\n /**\n * @internal\n * The reference genomes of the underlying organism.\n * These will be fetched from the Lapis instance.\n *\n * This component must be a child of a `gs-app` component.\n * This value will automatically be injected by the parent `gs-app` component.\n */\n @consume({ context: referenceGenomeContext, subscribe: true })\n referenceGenome: ReferenceGenome = {\n nucleotideSequences: [],\n genes: [],\n };\n\n override update(changedProperties: PropertyValues) {\n const vdom = (\n <LapisUrlContext.Provider value={this.lapis}>\n <ReferenceGenomeContext.Provider value={this.referenceGenome}>\n {this.render()}\n </ReferenceGenomeContext.Provider>\n </LapisUrlContext.Provider>\n );\n super.update(changedProperties);\n render(vdom, this.renderRoot);\n }\n\n protected abstract render(): JSXInternal.Element;\n}\n","import gridJsStyle from 'gridjs/dist/theme/mermaid.css?inline';\nimport { unsafeCSS } from 'lit';\n\nimport { PreactLitAdapter } from './PreactLitAdapter';\n\nimport 'gridjs/dist/theme/mermaid.css';\n\nconst gridJsElementCss = unsafeCSS(gridJsStyle);\n\nexport abstract class PreactLitAdapterWithGridJsStyles extends PreactLitAdapter {\n static override styles = [...PreactLitAdapter.styles, gridJsElementCss];\n}\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { MutationComparison, type MutationComparisonProps } from '../../preact/mutationComparison/mutation-comparison';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component allows to compare mutations between two different datasets.\n * The datasets are selected by LAPIS filters.\n *\n * It only shows substitutions and deletions, it does not show insertions.\n *\n * ## Views\n *\n * ### Table View\n *\n * The table view shows mutations and the proportions with which the mutation occurs in the respective data subsets.\n * It only shows mutations that are present in at least one of the data subsets\n * and where the proportion is within the selected proportion interval for at least one data subset.\n *\n * ### Venn View\n *\n * The Venn view shows the overlap of mutations between the datasets in a Venn diagram.\n * A dataset is considered to have a certain mutation, if the proportion of the mutation in the dataset is within the\n * selected proportion interval.\n * Thus, changing the proportion interval may change a mutations from being \"common\" between the datasets\n * to being \"for one dataset only\".\n */\n@customElement('gs-mutation-comparison')\nexport class MutationComparisonComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Required.\n *\n * An array of LAPIS filters to select the data to compare.\n *\n * The `lapisFilter` will be sent as is to LAPIS to filter the mutation data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used as the label for the filtered dataset in the views.\n * It should be human-readable.\n */\n @property({ type: Array })\n lapisFilters: {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }[] = [];\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('table' | 'venn')[] = ['table'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <MutationComparison\n lapisFilters={this.lapisFilters}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutation-comparison-component': MutationComparisonComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutation-comparison-component': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFiltersMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.lapisFilters, MutationComparisonProps['lapisFilters']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.sequenceType, MutationComparisonProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.views, MutationComparisonProps['views']>\n>;\ntype WidthMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.width, MutationComparisonProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.height, MutationComparisonProps['height']>\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.pageSize, MutationComparisonProps['pageSize']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type InsertionEntry } from '../../types';\n\nexport function getInsertionsTableData(data: InsertionEntry[]) {\n return data.map((mutationEntry) => {\n return {\n insertion: mutationEntry.mutation,\n count: mutationEntry.count,\n };\n });\n}\n","import { type SubstitutionOrDeletionEntry } from '../../types';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\nexport function getMutationsTableData(data: SubstitutionOrDeletionEntry[], proportionInterval: ProportionInterval) {\n const byProportion = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return mutationEntry.proportion >= proportionInterval.min && mutationEntry.proportion <= proportionInterval.max;\n };\n\n return data.filter(byProportion).map((mutationEntry) => {\n return {\n mutation: mutationEntry.mutation,\n type: mutationEntry.type,\n count: mutationEntry.count,\n proportion: mutationEntry.proportion,\n };\n });\n}\n","const pattern = /(?:([A-Za-z0-9]+):)?(\\d+)$/;\n\nexport const sortMutationPositions = (a: string, b: string) => {\n const aMatch = a.match(pattern);\n const bMatch = b.match(pattern);\n\n if (aMatch && bMatch) {\n if (aMatch[1] !== bMatch[1]) {\n return aMatch[1].localeCompare(bMatch[1]);\n }\n return parseInt(aMatch[2], 10) - parseInt(bMatch[2], 10);\n }\n throw new Error(`Invalid mutation position: ${a} or ${b}`);\n};\n","import { type BaseCell } from './mutations-grid';\nimport type { SequenceType, SubstitutionOrDeletionEntry } from '../../types';\nimport { bases } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { sortMutationPositions } from '../shared/sort/sortMutationPositions';\n\nexport const getMutationsGridData = (\n data: SubstitutionOrDeletionEntry[],\n sequenceType: SequenceType,\n proportionInterval: ProportionInterval,\n) => {\n return accumulateByPosition(data, sequenceType).filter((row) => byProportion(row, proportionInterval));\n};\n\nconst accumulateByPosition = (data: SubstitutionOrDeletionEntry[], sequenceType: SequenceType) => {\n const basesOfView = bases[sequenceType];\n const positionsToProportionAtBase = new Map<string, Map<string | undefined, number>>();\n const referenceBases = new Map<string, string | undefined>();\n\n for (const mutationEntry of data) {\n const position =\n (mutationEntry.mutation.segment ? `${mutationEntry.mutation.segment}:` : '') +\n mutationEntry.mutation.position;\n referenceBases.set(position, mutationEntry.mutation.valueAtReference);\n\n const initiallyFillPositionsToProportionAtBase = () => {\n if (!positionsToProportionAtBase.has(position)) {\n const empty = new Map();\n basesOfView.forEach((base) => empty.set(base, 0));\n empty.set(mutationEntry.mutation.valueAtReference, 1);\n positionsToProportionAtBase.set(position, empty);\n }\n };\n initiallyFillPositionsToProportionAtBase();\n\n const substitutionValue =\n mutationEntry.type === 'substitution' ? mutationEntry.mutation.substitutionValue : '-';\n\n const subtractSubstitutionValue = () => {\n const proportionAtBase = positionsToProportionAtBase.get(position)!;\n proportionAtBase.set(substitutionValue, mutationEntry.proportion);\n proportionAtBase.set(\n mutationEntry.mutation.valueAtReference,\n proportionAtBase.get(mutationEntry.mutation.valueAtReference)! - mutationEntry.proportion,\n );\n };\n subtractSubstitutionValue();\n }\n const orderedPositionsToProportionAtBase = [...positionsToProportionAtBase.entries()]\n .map(([position, proportionsAtBase]) => ({ position, proportions: proportionsAtBase }))\n .sort((a, b) => {\n return sortMutationPositions(a.position, b.position);\n });\n\n return orderedPositionsToProportionAtBase.map((proportionsForBaseAtPosition) => {\n const proportions = bases[sequenceType].map((base) => {\n return {\n [base]: {\n proportion: proportionsForBaseAtPosition.proportions.get(base)!,\n isReference: base === referenceBases.get(proportionsForBaseAtPosition.position),\n },\n };\n });\n\n return {\n position: proportionsForBaseAtPosition.position,\n ...proportions.reduce((acc, curr) => ({ ...acc, ...curr }), {}),\n } as MutationsGridDataRow;\n });\n};\n\nexport type BasesData = {\n [base: string]: BaseCell;\n};\nexport type MutationsGridDataRow = BasesData & { position: string };\n\nconst byProportion = (row: MutationsGridDataRow, proportionInterval: ProportionInterval) => {\n const numbersAndIsReference = Object.values(row).filter(\n (\n cell,\n ): cell is {\n proportion: number;\n isReference: boolean;\n } => typeof cell === 'object',\n );\n\n return numbersAndIsReference.some((cell) => {\n return (\n !cell.isReference && cell.proportion >= proportionInterval.min && cell.proportion <= proportionInterval.max\n );\n });\n};\n","import { type Row } from 'gridjs';\nimport { type FunctionComponent } from 'preact';\nimport { useMemo } from 'preact/hooks';\n\nimport { getMutationsGridData } from './getMutationsGridData';\nimport { type SequenceType, type SubstitutionOrDeletionEntry } from '../../types';\nimport { bases } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { Table, tableStyle } from '../components/table';\nimport { sortMutationPositions } from '../shared/sort/sortMutationPositions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface MutationsGridProps {\n data: SubstitutionOrDeletionEntry[];\n sequenceType: SequenceType;\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nexport type BaseCell = {\n proportion: number;\n isReference: boolean;\n};\n\nexport const MutationsGrid: FunctionComponent<MutationsGridProps> = ({\n data,\n sequenceType,\n proportionInterval,\n pageSize,\n}) => {\n const getHeaders = () => {\n return [\n {\n name: 'Position',\n sort: {\n compare: (a: string, b: string) => {\n return sortMutationPositions(a, b);\n },\n },\n },\n ...getBasesHeaders(),\n ];\n };\n\n const getBasesHeaders = () => {\n return bases[sequenceType].map((base) => {\n return {\n name: base,\n sort: {\n compare: (a: BaseCell, b: BaseCell) => {\n const aProportion = a.proportion;\n const bProportion = b.proportion;\n if (aProportion < bProportion) {\n return -1;\n }\n if (aProportion > bProportion) {\n return 1;\n }\n\n return 0;\n },\n },\n formatter: (cell: BaseCell) => formatProportion(cell.proportion),\n attributes: (cell: BaseCell, row: Row) => {\n // grid-js: the cell and row are null for header cells\n if (row === null) {\n return {};\n }\n\n return styleCells(cell);\n },\n };\n });\n };\n\n const styleCells = (cell: BaseCell) => {\n if (cell.isReference || cell.proportion < 0.0001) {\n return {\n style: {\n ...tableStyle.td,\n color: 'gray',\n },\n };\n }\n return {};\n };\n\n const tableData = useMemo(\n () => getMutationsGridData(data, sequenceType, proportionInterval).map((row) => Object.values(row)),\n [data, proportionInterval, sequenceType],\n );\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n","import { comparePositions, compareSegments } from './sortSubstitutionsAndDeletions';\nimport { type InsertionClass } from '../../../utils/mutations';\n\nexport const sortInsertions = (a: InsertionClass, b: InsertionClass) => {\n if (a.segment !== b.segment) {\n return compareSegments(a.segment, b.segment);\n }\n\n if (a.position !== b.position) {\n return comparePositions(a.position, b.position);\n }\n\n return a.insertedSymbols.localeCompare(b.insertedSymbols);\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getInsertionsTableData } from './getInsertionsTableData';\nimport { type InsertionEntry } from '../../types';\nimport { type InsertionClass } from '../../utils/mutations';\nimport { Table } from '../components/table';\nimport { sortInsertions } from '../shared/sort/sortInsertions';\n\nexport interface InsertionsTableProps {\n data: InsertionEntry[];\n pageSize: boolean | number;\n}\n\nexport const InsertionsTable: FunctionComponent<InsertionsTableProps> = ({ data, pageSize }) => {\n const getHeaders = () => {\n return [\n {\n name: 'Insertion',\n sort: {\n compare: (a: InsertionClass, b: InsertionClass) => {\n return sortInsertions(a, b);\n },\n },\n formatter: (cell: InsertionClass) => cell.toString(),\n },\n {\n name: 'Count',\n sort: true,\n },\n ];\n };\n\n const tableData = getInsertionsTableData(data).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getMutationsTableData } from './getMutationsTableData';\nimport { type SubstitutionOrDeletionEntry } from '../../types';\nimport { type DeletionClass, type SubstitutionClass } from '../../utils/mutations';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { Table } from '../components/table';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsTableProps {\n data: SubstitutionOrDeletionEntry[];\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nconst MutationsTable: FunctionComponent<MutationsTableProps> = ({ data, proportionInterval, pageSize }) => {\n const getHeaders = () => {\n return [\n {\n name: 'Mutation',\n sort: {\n compare: (a: SubstitutionClass | DeletionClass, b: SubstitutionClass | DeletionClass) => {\n return sortSubstitutionsAndDeletions(a, b);\n },\n },\n formatter: (cell: SubstitutionClass | DeletionClass) => cell.toString(),\n },\n {\n name: 'Type',\n sort: true,\n },\n {\n name: 'Count',\n sort: true,\n },\n {\n name: 'Proportion',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n ];\n };\n\n const tableData = getMutationsTableData(data, proportionInterval).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n\nexport default MutationsTable;\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchInsertions } from '../lapisApi/lapisApi';\nimport { type InsertionEntry, type LapisFilter, type SequenceType } from '../types';\nimport { InsertionClass } from '../utils/mutations';\n\nexport class FetchInsertionsOperator implements Operator<InsertionEntry> {\n constructor(\n private filter: LapisFilter,\n private sequenceType: SequenceType,\n ) {}\n\n async evaluate(lapisUrl: string, signal?: AbortSignal): Promise<Dataset<InsertionEntry>> {\n const insertions = (await fetchInsertions(lapisUrl, this.filter, this.sequenceType, signal)).data;\n\n const content: InsertionEntry[] = insertions.map(({ count, insertedSymbols, sequenceName, position }) => ({\n type: 'insertion',\n mutation: new InsertionClass(sequenceName ?? undefined, position, insertedSymbols),\n count,\n }));\n\n return { content };\n }\n}\n","import { FetchInsertionsOperator } from '../operator/FetchInsertionsOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type LapisFilter, type SequenceType } from '../types';\n\nexport function queryInsertions(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\n lapis: string,\n signal?: AbortSignal,\n) {\n const fetchData = new FetchInsertionsOperator(lapisFilter, sequenceType);\n const sortData = new SortOperator(fetchData, (a, b) => {\n if (a.mutation.segment !== b.mutation.segment) {\n return (a.mutation.segment ?? '').localeCompare(b.mutation.segment ?? '');\n }\n return a.mutation.position - b.mutation.position;\n });\n return sortData.evaluate(lapis, signal);\n}\n","import { queryInsertions } from '../../query/queryInsertions';\nimport { querySubstitutionsOrDeletions } from '../../query/querySubstitutionsOrDeletions';\nimport {\n type InsertionEntry,\n type LapisFilter,\n type MutationEntry,\n type SubstitutionOrDeletionEntry,\n} from '../../types';\nimport { type DisplayedMutationType } from '../components/mutation-type-selector';\nimport { type DisplayedSegment } from '../components/segment-selector';\n\nexport async function queryMutationsData(\n lapisFilter: LapisFilter,\n sequenceType: 'nucleotide' | 'amino acid',\n lapis: string,\n) {\n const substitutionsOrDeletions = (await querySubstitutionsOrDeletions(lapisFilter, sequenceType, lapis)).content;\n const insertions = (await queryInsertions(lapisFilter, sequenceType, lapis)).content;\n\n return {\n substitutionsOrDeletions,\n insertions,\n };\n}\n\nexport function filterMutationsData(\n data: { insertions: InsertionEntry[]; substitutionsOrDeletions: SubstitutionOrDeletionEntry[] },\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n function bySelectedSegments(mutationEntry: MutationEntry) {\n if (mutationEntry.mutation.segment === undefined) {\n return true;\n }\n return displayedSegments.some(\n (displayedSegment) =>\n displayedSegment.segment === mutationEntry.mutation.segment && displayedSegment.checked,\n );\n }\n\n const byDisplayedMutationTypes = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return displayedMutationTypes.some(\n (displayedMutationType) =>\n displayedMutationType.checked && displayedMutationType.type === mutationEntry.type,\n );\n };\n\n const filteredSubstitutionsOrDeletions = data.substitutionsOrDeletions.filter(bySelectedSegments);\n\n return {\n insertions: data.insertions.filter(bySelectedSegments),\n tableData: filteredSubstitutionsOrDeletions.filter(byDisplayedMutationTypes),\n gridData: filteredSubstitutionsOrDeletions,\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useState } from 'preact/hooks';\n\nimport { getInsertionsTableData } from './getInsertionsTableData';\nimport { getMutationsTableData } from './getMutationsTableData';\nimport { MutationsGrid } from './mutations-grid';\nimport { InsertionsTable } from './mutations-insertions-table';\nimport MutationsTable from './mutations-table';\nimport { filterMutationsData, queryMutationsData } from './queryMutations';\nimport {\n type InsertionEntry,\n type LapisFilter,\n type SequenceType,\n type SubstitutionOrDeletionEntry,\n} from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoHeadline2, InfoLink, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'table' | 'grid' | 'insertions';\n\nexport interface MutationsProps {\n width: string;\n height: string;\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n views: View[];\n pageSize: boolean | number;\n}\n\nexport const Mutations: FunctionComponent<MutationsProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <MutationsInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationsInner: FunctionComponent<MutationsProps> = (componentProps) => {\n const lapis = useContext(LapisUrlContext);\n const { lapisFilter, sequenceType } = componentProps;\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryMutationsData(lapisFilter, sequenceType, lapis);\n }, [lapisFilter, sequenceType, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <MutationsTabs mutationsData={data} originalComponentProps={componentProps} />;\n};\n\ntype MutationTabsProps = {\n mutationsData: { insertions: InsertionEntry[]; substitutionsOrDeletions: SubstitutionOrDeletionEntry[] };\n originalComponentProps: MutationsProps;\n};\n\nconst MutationsTabs: FunctionComponent<MutationTabsProps> = ({ mutationsData, originalComponentProps }) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.05, max: 1 });\n\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(originalComponentProps.sequenceType);\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n\n const filteredData = filterMutationsData(mutationsData, displayedSegments, displayedMutationTypes);\n\n const getTab = (view: View) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: (\n <MutationsTable\n data={filteredData.tableData}\n proportionInterval={proportionInterval}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n case 'grid':\n return {\n title: 'Grid',\n content: (\n <MutationsGrid\n data={filteredData.gridData}\n sequenceType={originalComponentProps.sequenceType}\n proportionInterval={proportionInterval}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n case 'insertions':\n return {\n title: 'Insertions',\n content: (\n <InsertionsTable data={filteredData.insertions} pageSize={originalComponentProps.pageSize} />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n filteredData={filteredData}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n originalComponentProps={originalComponentProps}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = {\n activeTab: string;\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n filteredData: { tableData: SubstitutionOrDeletionEntry[]; insertions: InsertionEntry[] };\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n originalComponentProps: MutationsProps;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n filteredData,\n proportionInterval,\n setProportionInterval,\n originalComponentProps,\n}) => {\n return (\n <>\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n {activeTab === 'Table' && (\n <MutationTypeSelector\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n displayedMutationTypes={displayedMutationTypes}\n />\n )}\n {(activeTab === 'Table' || activeTab === 'Grid') && (\n <>\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getMutationsTableData(filteredData.tableData, proportionInterval)}\n filename='substitutions_and_deletions.csv'\n />\n </>\n )}\n {activeTab === 'Insertions' && (\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() =>\n getInsertionsTableData(filteredData.insertions).map((row) => {\n return {\n insertion: row.insertion.toString(),\n count: row.count,\n };\n })\n }\n filename='insertions.csv'\n />\n )}\n <MutationsInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype MutationsInfoProps = {\n originalComponentProps: MutationsProps;\n};\n\nconst MutationsInfo: FunctionComponent<MutationsInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n\n return (\n <Info>\n <InfoHeadline1>Mutations</InfoHeadline1>\n <InfoParagraph>\n This shows mutations of a variant. There are three types of mutations:{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Substitution'>substitutions</InfoLink>,{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Deletion'>deletions</InfoLink> and{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Insertion'>insertions</InfoLink>.\n </InfoParagraph>\n <InfoHeadline2>Proportion calculation</InfoHeadline2>\n <InfoParagraph>\n The proportion of a mutation is calculated by dividing the number of sequences with the mutation by the\n total number of sequences with a non-ambiguous symbol at the position.\n </InfoParagraph>\n <InfoParagraph>\n <b>Example:</b> Assume we look at nucleotide mutations at position 5 where the reference has a T and\n assume there are 10 sequences in total:\n <ul className='list-disc list-inside ml-2'>\n <li>3 sequences have a C,</li>\n <li>2 sequences have a T,</li>\n <li>1 sequence has a G,</li>\n <li>3 sequences have an N,</li>\n <li>1 sequence has a Y (which means T or C),</li>\n </ul>\n then the proportion of the T5C mutation is 50%. The 4 sequences that have an N or Y are excluded from\n the calculation.\n </InfoParagraph>\n <InfoComponentCode componentName='mutations' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { Mutations, type MutationsProps } from '../../preact/mutations/mutations';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays mutations (substitutions, deletions and insertions) for a dataset selected by a LAPIS filter.\n *\n * ## Views\n *\n * ### Table View\n *\n * The table view shows all substitutions and deletions for the dataset.\n * It shows the type (substitution or deletion), the total count of the mutation\n * and the proportion of the mutation in the dataset.\n * The proportion is relative to the total number of sequences matching\n * the specified sequence filters with non-ambiguous reads at that position.\n *\n * The proportion interval filter can be used to filter the displayed mutations on client side.\n *\n * ### Grid View\n *\n * The grid view shows the proportion of each sequence symbol (nucleotide or amino acid) for each position that has a mutation.\n * Only positions with at least one mutation in the selected proportion interval are shown.\n *\n * ### Insertions View\n *\n * The insertions view shows the count of all insertions for the dataset.\n *\n */\n@customElement('gs-mutations')\nexport class MutationsComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Required.\n *\n * LAPIS filter to select the displayed data.\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('table' | 'grid' | 'insertions')[] = ['table', 'grid'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <Mutations\n lapisFilter={this.lapisFilter}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutations-component': MutationsComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutations-component': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof MutationsComponent.prototype.lapisFilter, MutationsProps['lapisFilter']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationsComponent.prototype.sequenceType, MutationsProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<Equals<typeof MutationsComponent.prototype.views, MutationsProps['views']>>;\ntype WidthMatches = Expect<Equals<typeof MutationsComponent.prototype.width, MutationsProps['width']>>;\ntype HeightMatches = Expect<Equals<typeof MutationsComponent.prototype.height, MutationsProps['height']>>;\ntype PageSizeMatches = Expect<Equals<typeof MutationsComponent.prototype.pageSize, MutationsProps['pageSize']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { type TemporalGranularity } from '../../types';\n\nexport function getPrevalenceOverTimeTableData(data: PrevalenceOverTimeData, granularity: TemporalGranularity) {\n return data[0].content.map((row, rowNumber) => {\n const otherColumns = data\n .map((dataset) => ({\n [`${dataset.displayName} prevalence`]: dataset.content[rowNumber].prevalence.toFixed(4),\n [`${dataset.displayName} count`]: dataset.content[rowNumber].count,\n }))\n .reduce((acc, val) => ({ ...acc, ...val }), {});\n\n return {\n [granularity]: row.dateRange?.toString() ?? 'Unknown',\n ...otherColumns,\n };\n });\n}\n","import type { TemporalClass } from './temporalClass';\n\nexport function sortNullToBeginningThenByDate(\n a: { dateRange: TemporalClass | null },\n b: { dateRange: TemporalClass | null },\n) {\n return a.dateRange === null\n ? -1\n : b.dateRange === null\n ? 1\n : a.dateRange.toString().localeCompare(b.dateRange.toString());\n}\n","import { type Chart, type CoreScaleOptions, Scale } from 'chart.js';\n\nexport class LogitScale extends Scale {\n static id = 'logit';\n\n constructor(cfg: { id: string; type: string; ctx: CanvasRenderingContext2D; chart: Chart }) {\n super(cfg);\n this.min = 0.001;\n this.max = 0.999;\n }\n\n override buildTicks() {\n const tickValues = [this.min, 0.01, 0.1, 0.5, 0.9, 0.99, this.max];\n\n this.ticks = tickValues.map((value) => ({ value }));\n return this.ticks;\n }\n\n getLogit(value: number): number {\n if (value <= 0) {\n return -Infinity;\n }\n if (value >= 1) {\n return Infinity;\n }\n\n return Math.log(value / (1 - value));\n }\n\n override getPixelForValue(value: number): number {\n const logitMin = this.getLogit(this.min);\n const logitMax = this.getLogit(this.max);\n\n const logitValue = this.getLogit(value);\n\n const decimal = (logitValue - logitMin) / (logitMax - logitMin);\n\n return this.getPixelForDecimal(decimal);\n }\n}\n\ndeclare module 'chart.js' {\n export interface CartesianScaleTypeRegistry {\n logit: {\n options: CoreScaleOptions;\n };\n }\n}\n","// colorblind friendly colors taken from https://personal.sron.nl/~pault/\n\nconst ColorsRGB = {\n indigo: [51, 34, 136],\n green: [17, 119, 51],\n cyan: [136, 204, 238],\n teal: [68, 170, 153],\n olive: [153, 153, 51],\n sand: [221, 204, 119],\n rose: [204, 102, 119],\n wine: [136, 34, 85],\n purple: [170, 68, 153],\n};\n\nexport type GraphColor = keyof typeof ColorsRGB;\n\nexport const singleGraphColorRGBAById = (id: number, alpha = 1) => {\n const keys = Object.keys(ColorsRGB) as GraphColor[];\n const key = keys[id % keys.length];\n\n return `rgba(${ColorsRGB[key].join(',')},${alpha})`;\n};\n\nexport const singleGraphColorRGBByName = (name: GraphColor, alpha = 1) => {\n return `rgba(${ColorsRGB[name].join(',')},${alpha})`;\n};\n","// calculateWilsonInterval calculates the Wilson score interval for 95% confidence.\n//\n// This function is based on https://github.com/erikfox/wilson-interval, but without\n// high precision math.\n//\n// observed - number of observed positive outcomes\n// sample - number of experiments or size of the sample\nexport function wilson95PercentConfidenceInterval(observed: number, sample: number) {\n const p = observed / sample;\n const n = sample;\n const z = 1.9599639715843482;\n\n const numerator = p + (z * z) / (2 * n);\n const w_plus_minus = z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * (n * n)));\n const denominator = 1 + (z * z) / n;\n\n return {\n lowerLimit: (numerator - w_plus_minus) / denominator,\n upperLimit: (numerator + w_plus_minus) / denominator,\n };\n}\n\nexport const confidenceIntervalDataLabel = (\n value: number,\n lowerLimit?: number,\n upperLimit?: number,\n prefix?: string,\n) => {\n const label = prefix ? `${prefix}: ` : '';\n\n return `${label}${value.toFixed(3)} (${lowerLimit?.toFixed(3)} - ${upperLimit?.toFixed(3)})`;\n};\n\nexport type ConfidenceIntervalMethod = 'wilson' | 'none';\n","export interface YAxisMaxConfig {\n linear?: AxisMax;\n logarithmic?: AxisMax;\n}\n\nexport type AxisMax = 'maxInData' | 'limitTo1' | number;\n\nexport const getYAxisMax = (maxInData: number, axisMax?: AxisMax) => {\n if (!axisMax) {\n return 1;\n }\n\n switch (axisMax) {\n case 'limitTo1': {\n return maxInData > 1 ? 1 : maxInData;\n }\n case 'maxInData': {\n return maxInData;\n }\n default: {\n return axisMax;\n }\n }\n};\n","export type ScaleType = 'linear' | 'logarithmic' | 'logit';\n\nexport function getYAxisScale(scaleType: ScaleType) {\n switch (scaleType) {\n case 'linear': {\n return { beginAtZero: true, type: 'linear' as const, min: 0, max: 1 };\n }\n case 'logarithmic': {\n return { type: 'logarithmic' as const, max: 1 };\n }\n case 'logit':\n return { type: 'logit' as const };\n }\n}\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables, type TooltipItem } from 'chart.js';\nimport { BarWithErrorBar, BarWithErrorBarsController } from 'chartjs-chart-error-bars';\n\nimport { maxInData } from './prevalence-over-time';\nimport {\n type PrevalenceOverTimeData,\n type PrevalenceOverTimeVariantData,\n type PrevalenceOverTimeVariantDataPoint,\n} from '../../query/queryPrevalenceOverTime';\nimport { sortNullToBeginningThenByDate } from '../../utils/sort';\nimport GsChart from '../components/chart';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { type ConfidenceIntervalMethod, wilson95PercentConfidenceInterval } from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeBarChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale, BarWithErrorBarsController, BarWithErrorBar);\n\nconst PrevalenceOverTimeBarChart = ({\n data,\n yAxisScaleType,\n confidenceIntervalMethod,\n yAxisMaxConfig,\n}: PrevalenceOverTimeBarChartProps) => {\n const nullFirstData = data\n .filter((prevalenceOverTimeData) => prevalenceOverTimeData.content.length > 0)\n .map((variantData) => {\n return {\n content: variantData.content.sort(sortNullToBeginningThenByDate),\n displayName: variantData.displayName,\n };\n });\n\n if (nullFirstData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const datasets = nullFirstData.map((graphData, index) => getDataset(graphData, index, confidenceIntervalMethod));\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nullFirstData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: BarWithErrorBarsController.id,\n data: {\n datasets,\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(confidenceIntervalMethod),\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nconst getDataset = (\n prevalenceOverTimeVariant: PrevalenceOverTimeVariantData,\n index: number,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n): ChartDataset<\n typeof BarWithErrorBarsController.id,\n {\n x: string;\n yMin: number | undefined;\n yMax: number | undefined;\n y: number;\n }[]\n> => {\n return {\n borderWidth: 1,\n label: prevalenceOverTimeVariant.displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: prevalenceOverTimeVariant.content.map(mapDataPoint(confidenceIntervalMethod)),\n };\n};\n\nconst mapDataPoint = (confidenceIntervalMethod: ConfidenceIntervalMethod) => {\n return (dataPoint: PrevalenceOverTimeVariantDataPoint) => {\n const confidenceInterval = getConfidenceInterval(dataPoint, confidenceIntervalMethod);\n return {\n y: dataPoint.prevalence,\n yMin: confidenceInterval.lowerLimit,\n yMax: confidenceInterval.upperLimit,\n x: dataPoint.dateRange?.toString() ?? 'Unknown',\n };\n };\n};\n\nconst getConfidenceInterval = (\n dataPoint: PrevalenceOverTimeVariantDataPoint,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n) => {\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total);\n default:\n return { lowerLimit: undefined, upperLimit: undefined };\n }\n};\n\nconst tooltip = (confidenceIntervalMethod: ConfidenceIntervalMethod) => {\n const generalConfig = {\n mode: 'index' as const,\n intersect: false,\n };\n\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return {\n ...generalConfig,\n callbacks: {\n label: (context: TooltipItem<'barWithErrorBars'>) => {\n const value = context.dataset.data[context.dataIndex] as {\n y: number;\n yMin: number;\n yMax: number;\n };\n\n return `${context.dataset.label}: ${value.y.toFixed(3)} (${value.yMin.toFixed(3)} - ${value.yMax.toFixed(3)})`;\n },\n },\n };\n default:\n return generalConfig;\n }\n};\n\nexport default PrevalenceOverTimeBarChart;\n","export var SECONDS_A_MINUTE = 60;\nexport var SECONDS_A_HOUR = SECONDS_A_MINUTE * 60;\nexport var SECONDS_A_DAY = SECONDS_A_HOUR * 24;\nexport var SECONDS_A_WEEK = SECONDS_A_DAY * 7;\nexport var MILLISECONDS_A_SECOND = 1e3;\nexport var MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND; // English locales\n\nexport var MS = 'millisecond';\nexport var S = 'second';\nexport var MIN = 'minute';\nexport var H = 'hour';\nexport var D = 'day';\nexport var W = 'week';\nexport var M = 'month';\nexport var Q = 'quarter';\nexport var Y = 'year';\nexport var DATE = 'date';\nexport var FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ';\nexport var INVALID_DATE_STRING = 'Invalid Date'; // regex\n\nexport var REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/;\nexport var REGEX_FORMAT = /\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;","// English [en]\n// We don't need weekdaysShort, weekdaysMin, monthsShort in en.js locale\nexport default {\n name: 'en',\n weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n ordinal: function ordinal(n) {\n var s = ['th', 'st', 'nd', 'rd'];\n var v = n % 100;\n return \"[\" + n + (s[(v - 20) % 10] || s[v] || s[0]) + \"]\";\n }\n};","import * as C from './constant';\n\nvar padStart = function padStart(string, length, pad) {\n var s = String(string);\n if (!s || s.length >= length) return string;\n return \"\" + Array(length + 1 - s.length).join(pad) + string;\n};\n\nvar padZoneStr = function padZoneStr(instance) {\n var negMinutes = -instance.utcOffset();\n var minutes = Math.abs(negMinutes);\n var hourOffset = Math.floor(minutes / 60);\n var minuteOffset = minutes % 60;\n return \"\" + (negMinutes <= 0 ? '+' : '-') + padStart(hourOffset, 2, '0') + \":\" + padStart(minuteOffset, 2, '0');\n};\n\nvar monthDiff = function monthDiff(a, b) {\n // function from moment.js in order to keep the same result\n if (a.date() < b.date()) return -monthDiff(b, a);\n var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month());\n var anchor = a.clone().add(wholeMonthDiff, C.M);\n var c = b - anchor < 0;\n var anchor2 = a.clone().add(wholeMonthDiff + (c ? -1 : 1), C.M);\n return +(-(wholeMonthDiff + (b - anchor) / (c ? anchor - anchor2 : anchor2 - anchor)) || 0);\n};\n\nvar absFloor = function absFloor(n) {\n return n < 0 ? Math.ceil(n) || 0 : Math.floor(n);\n};\n\nvar prettyUnit = function prettyUnit(u) {\n var special = {\n M: C.M,\n y: C.Y,\n w: C.W,\n d: C.D,\n D: C.DATE,\n h: C.H,\n m: C.MIN,\n s: C.S,\n ms: C.MS,\n Q: C.Q\n };\n return special[u] || String(u || '').toLowerCase().replace(/s$/, '');\n};\n\nvar isUndefined = function isUndefined(s) {\n return s === undefined;\n};\n\nexport default {\n s: padStart,\n z: padZoneStr,\n m: monthDiff,\n a: absFloor,\n p: prettyUnit,\n u: isUndefined\n};","import * as C from './constant';\nimport en from './locale/en';\nimport U from './utils';\nvar L = 'en'; // global locale\n\nvar Ls = {}; // global loaded locale\n\nLs[L] = en;\nvar IS_DAYJS = '$isDayjsObject'; // eslint-disable-next-line no-use-before-define\n\nvar isDayjs = function isDayjs(d) {\n return d instanceof Dayjs || !!(d && d[IS_DAYJS]);\n};\n\nvar parseLocale = function parseLocale(preset, object, isLocal) {\n var l;\n if (!preset) return L;\n\n if (typeof preset === 'string') {\n var presetLower = preset.toLowerCase();\n\n if (Ls[presetLower]) {\n l = presetLower;\n }\n\n if (object) {\n Ls[presetLower] = object;\n l = presetLower;\n }\n\n var presetSplit = preset.split('-');\n\n if (!l && presetSplit.length > 1) {\n return parseLocale(presetSplit[0]);\n }\n } else {\n var name = preset.name;\n Ls[name] = preset;\n l = name;\n }\n\n if (!isLocal && l) L = l;\n return l || !isLocal && L;\n};\n\nvar dayjs = function dayjs(date, c) {\n if (isDayjs(date)) {\n return date.clone();\n } // eslint-disable-next-line no-nested-ternary\n\n\n var cfg = typeof c === 'object' ? c : {};\n cfg.date = date;\n cfg.args = arguments; // eslint-disable-line prefer-rest-params\n\n return new Dayjs(cfg); // eslint-disable-line no-use-before-define\n};\n\nvar wrapper = function wrapper(date, instance) {\n return dayjs(date, {\n locale: instance.$L,\n utc: instance.$u,\n x: instance.$x,\n $offset: instance.$offset // todo: refactor; do not use this.$offset in you code\n\n });\n};\n\nvar Utils = U; // for plugin use\n\nUtils.l = parseLocale;\nUtils.i = isDayjs;\nUtils.w = wrapper;\n\nvar parseDate = function parseDate(cfg) {\n var date = cfg.date,\n utc = cfg.utc;\n if (date === null) return new Date(NaN); // null is invalid\n\n if (Utils.u(date)) return new Date(); // today\n\n if (date instanceof Date) return new Date(date);\n\n if (typeof date === 'string' && !/Z$/i.test(date)) {\n var d = date.match(C.REGEX_PARSE);\n\n if (d) {\n var m = d[2] - 1 || 0;\n var ms = (d[7] || '0').substring(0, 3);\n\n if (utc) {\n return new Date(Date.UTC(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms));\n }\n\n return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n }\n }\n\n return new Date(date); // everything else\n};\n\nvar Dayjs = /*#__PURE__*/function () {\n function Dayjs(cfg) {\n this.$L = parseLocale(cfg.locale, null, true);\n this.parse(cfg); // for plugin\n\n this.$x = this.$x || cfg.x || {};\n this[IS_DAYJS] = true;\n }\n\n var _proto = Dayjs.prototype;\n\n _proto.parse = function parse(cfg) {\n this.$d = parseDate(cfg);\n this.init();\n };\n\n _proto.init = function init() {\n var $d = this.$d;\n this.$y = $d.getFullYear();\n this.$M = $d.getMonth();\n this.$D = $d.getDate();\n this.$W = $d.getDay();\n this.$H = $d.getHours();\n this.$m = $d.getMinutes();\n this.$s = $d.getSeconds();\n this.$ms = $d.getMilliseconds();\n } // eslint-disable-next-line class-methods-use-this\n ;\n\n _proto.$utils = function $utils() {\n return Utils;\n };\n\n _proto.isValid = function isValid() {\n return !(this.$d.toString() === C.INVALID_DATE_STRING);\n };\n\n _proto.isSame = function isSame(that, units) {\n var other = dayjs(that);\n return this.startOf(units) <= other && other <= this.endOf(units);\n };\n\n _proto.isAfter = function isAfter(that, units) {\n return dayjs(that) < this.startOf(units);\n };\n\n _proto.isBefore = function isBefore(that, units) {\n return this.endOf(units) < dayjs(that);\n };\n\n _proto.$g = function $g(input, get, set) {\n if (Utils.u(input)) return this[get];\n return this.set(set, input);\n };\n\n _proto.unix = function unix() {\n return Math.floor(this.valueOf() / 1000);\n };\n\n _proto.valueOf = function valueOf() {\n // timezone(hour) * 60 * 60 * 1000 => ms\n return this.$d.getTime();\n };\n\n _proto.startOf = function startOf(units, _startOf) {\n var _this = this;\n\n // startOf -> endOf\n var isStartOf = !Utils.u(_startOf) ? _startOf : true;\n var unit = Utils.p(units);\n\n var instanceFactory = function instanceFactory(d, m) {\n var ins = Utils.w(_this.$u ? Date.UTC(_this.$y, m, d) : new Date(_this.$y, m, d), _this);\n return isStartOf ? ins : ins.endOf(C.D);\n };\n\n var instanceFactorySet = function instanceFactorySet(method, slice) {\n var argumentStart = [0, 0, 0, 0];\n var argumentEnd = [23, 59, 59, 999];\n return Utils.w(_this.toDate()[method].apply( // eslint-disable-line prefer-spread\n _this.toDate('s'), (isStartOf ? argumentStart : argumentEnd).slice(slice)), _this);\n };\n\n var $W = this.$W,\n $M = this.$M,\n $D = this.$D;\n var utcPad = \"set\" + (this.$u ? 'UTC' : '');\n\n switch (unit) {\n case C.Y:\n return isStartOf ? instanceFactory(1, 0) : instanceFactory(31, 11);\n\n case C.M:\n return isStartOf ? instanceFactory(1, $M) : instanceFactory(0, $M + 1);\n\n case C.W:\n {\n var weekStart = this.$locale().weekStart || 0;\n var gap = ($W < weekStart ? $W + 7 : $W) - weekStart;\n return instanceFactory(isStartOf ? $D - gap : $D + (6 - gap), $M);\n }\n\n case C.D:\n case C.DATE:\n return instanceFactorySet(utcPad + \"Hours\", 0);\n\n case C.H:\n return instanceFactorySet(utcPad + \"Minutes\", 1);\n\n case C.MIN:\n return instanceFactorySet(utcPad + \"Seconds\", 2);\n\n case C.S:\n return instanceFactorySet(utcPad + \"Milliseconds\", 3);\n\n default:\n return this.clone();\n }\n };\n\n _proto.endOf = function endOf(arg) {\n return this.startOf(arg, false);\n };\n\n _proto.$set = function $set(units, _int) {\n var _C$D$C$DATE$C$M$C$Y$C;\n\n // private set\n var unit = Utils.p(units);\n var utcPad = \"set\" + (this.$u ? 'UTC' : '');\n var name = (_C$D$C$DATE$C$M$C$Y$C = {}, _C$D$C$DATE$C$M$C$Y$C[C.D] = utcPad + \"Date\", _C$D$C$DATE$C$M$C$Y$C[C.DATE] = utcPad + \"Date\", _C$D$C$DATE$C$M$C$Y$C[C.M] = utcPad + \"Month\", _C$D$C$DATE$C$M$C$Y$C[C.Y] = utcPad + \"FullYear\", _C$D$C$DATE$C$M$C$Y$C[C.H] = utcPad + \"Hours\", _C$D$C$DATE$C$M$C$Y$C[C.MIN] = utcPad + \"Minutes\", _C$D$C$DATE$C$M$C$Y$C[C.S] = utcPad + \"Seconds\", _C$D$C$DATE$C$M$C$Y$C[C.MS] = utcPad + \"Milliseconds\", _C$D$C$DATE$C$M$C$Y$C)[unit];\n var arg = unit === C.D ? this.$D + (_int - this.$W) : _int;\n\n if (unit === C.M || unit === C.Y) {\n // clone is for badMutable plugin\n var date = this.clone().set(C.DATE, 1);\n date.$d[name](arg);\n date.init();\n this.$d = date.set(C.DATE, Math.min(this.$D, date.daysInMonth())).$d;\n } else if (name) this.$d[name](arg);\n\n this.init();\n return this;\n };\n\n _proto.set = function set(string, _int2) {\n return this.clone().$set(string, _int2);\n };\n\n _proto.get = function get(unit) {\n return this[Utils.p(unit)]();\n };\n\n _proto.add = function add(number, units) {\n var _this2 = this,\n _C$MIN$C$H$C$S$unit;\n\n number = Number(number); // eslint-disable-line no-param-reassign\n\n var unit = Utils.p(units);\n\n var instanceFactorySet = function instanceFactorySet(n) {\n var d = dayjs(_this2);\n return Utils.w(d.date(d.date() + Math.round(n * number)), _this2);\n };\n\n if (unit === C.M) {\n return this.set(C.M, this.$M + number);\n }\n\n if (unit === C.Y) {\n return this.set(C.Y, this.$y + number);\n }\n\n if (unit === C.D) {\n return instanceFactorySet(1);\n }\n\n if (unit === C.W) {\n return instanceFactorySet(7);\n }\n\n var step = (_C$MIN$C$H$C$S$unit = {}, _C$MIN$C$H$C$S$unit[C.MIN] = C.MILLISECONDS_A_MINUTE, _C$MIN$C$H$C$S$unit[C.H] = C.MILLISECONDS_A_HOUR, _C$MIN$C$H$C$S$unit[C.S] = C.MILLISECONDS_A_SECOND, _C$MIN$C$H$C$S$unit)[unit] || 1; // ms\n\n var nextTimeStamp = this.$d.getTime() + number * step;\n return Utils.w(nextTimeStamp, this);\n };\n\n _proto.subtract = function subtract(number, string) {\n return this.add(number * -1, string);\n };\n\n _proto.format = function format(formatStr) {\n var _this3 = this;\n\n var locale = this.$locale();\n if (!this.isValid()) return locale.invalidDate || C.INVALID_DATE_STRING;\n var str = formatStr || C.FORMAT_DEFAULT;\n var zoneStr = Utils.z(this);\n var $H = this.$H,\n $m = this.$m,\n $M = this.$M;\n var weekdays = locale.weekdays,\n months = locale.months,\n meridiem = locale.meridiem;\n\n var getShort = function getShort(arr, index, full, length) {\n return arr && (arr[index] || arr(_this3, str)) || full[index].slice(0, length);\n };\n\n var get$H = function get$H(num) {\n return Utils.s($H % 12 || 12, num, '0');\n };\n\n var meridiemFunc = meridiem || function (hour, minute, isLowercase) {\n var m = hour < 12 ? 'AM' : 'PM';\n return isLowercase ? m.toLowerCase() : m;\n };\n\n var matches = function matches(match) {\n switch (match) {\n case 'YY':\n return String(_this3.$y).slice(-2);\n\n case 'YYYY':\n return Utils.s(_this3.$y, 4, '0');\n\n case 'M':\n return $M + 1;\n\n case 'MM':\n return Utils.s($M + 1, 2, '0');\n\n case 'MMM':\n return getShort(locale.monthsShort, $M, months, 3);\n\n case 'MMMM':\n return getShort(months, $M);\n\n case 'D':\n return _this3.$D;\n\n case 'DD':\n return Utils.s(_this3.$D, 2, '0');\n\n case 'd':\n return String(_this3.$W);\n\n case 'dd':\n return getShort(locale.weekdaysMin, _this3.$W, weekdays, 2);\n\n case 'ddd':\n return getShort(locale.weekdaysShort, _this3.$W, weekdays, 3);\n\n case 'dddd':\n return weekdays[_this3.$W];\n\n case 'H':\n return String($H);\n\n case 'HH':\n return Utils.s($H, 2, '0');\n\n case 'h':\n return get$H(1);\n\n case 'hh':\n return get$H(2);\n\n case 'a':\n return meridiemFunc($H, $m, true);\n\n case 'A':\n return meridiemFunc($H, $m, false);\n\n case 'm':\n return String($m);\n\n case 'mm':\n return Utils.s($m, 2, '0');\n\n case 's':\n return String(_this3.$s);\n\n case 'ss':\n return Utils.s(_this3.$s, 2, '0');\n\n case 'SSS':\n return Utils.s(_this3.$ms, 3, '0');\n\n case 'Z':\n return zoneStr;\n // 'ZZ' logic below\n\n default:\n break;\n }\n\n return null;\n };\n\n return str.replace(C.REGEX_FORMAT, function (match, $1) {\n return $1 || matches(match) || zoneStr.replace(':', '');\n }); // 'ZZ'\n };\n\n _proto.utcOffset = function utcOffset() {\n // Because a bug at FF24, we're rounding the timezone offset around 15 minutes\n // https://github.com/moment/moment/pull/1871\n return -Math.round(this.$d.getTimezoneOffset() / 15) * 15;\n };\n\n _proto.diff = function diff(input, units, _float) {\n var _this4 = this;\n\n var unit = Utils.p(units);\n var that = dayjs(input);\n var zoneDelta = (that.utcOffset() - this.utcOffset()) * C.MILLISECONDS_A_MINUTE;\n var diff = this - that;\n\n var getMonth = function getMonth() {\n return Utils.m(_this4, that);\n };\n\n var result;\n\n switch (unit) {\n case C.Y:\n result = getMonth() / 12;\n break;\n\n case C.M:\n result = getMonth();\n break;\n\n case C.Q:\n result = getMonth() / 3;\n break;\n\n case C.W:\n result = (diff - zoneDelta) / C.MILLISECONDS_A_WEEK;\n break;\n\n case C.D:\n result = (diff - zoneDelta) / C.MILLISECONDS_A_DAY;\n break;\n\n case C.H:\n result = diff / C.MILLISECONDS_A_HOUR;\n break;\n\n case C.MIN:\n result = diff / C.MILLISECONDS_A_MINUTE;\n break;\n\n case C.S:\n result = diff / C.MILLISECONDS_A_SECOND;\n break;\n\n default:\n result = diff; // milliseconds\n\n break;\n }\n\n return _float ? result : Utils.a(result);\n };\n\n _proto.daysInMonth = function daysInMonth() {\n return this.endOf(C.M).$D;\n };\n\n _proto.$locale = function $locale() {\n // get locale object\n return Ls[this.$L];\n };\n\n _proto.locale = function locale(preset, object) {\n if (!preset) return this.$L;\n var that = this.clone();\n var nextLocaleName = parseLocale(preset, object, true);\n if (nextLocaleName) that.$L = nextLocaleName;\n return that;\n };\n\n _proto.clone = function clone() {\n return Utils.w(this.$d, this);\n };\n\n _proto.toDate = function toDate() {\n return new Date(this.valueOf());\n };\n\n _proto.toJSON = function toJSON() {\n return this.isValid() ? this.toISOString() : null;\n };\n\n _proto.toISOString = function toISOString() {\n // ie 8 return\n // new Dayjs(this.valueOf() + this.$d.getTimezoneOffset() * 60000)\n // .format('YYYY-MM-DDTHH:mm:ss.SSS[Z]')\n return this.$d.toISOString();\n };\n\n _proto.toString = function toString() {\n return this.$d.toUTCString();\n };\n\n return Dayjs;\n}();\n\nvar proto = Dayjs.prototype;\ndayjs.prototype = proto;\n[['$ms', C.MS], ['$s', C.S], ['$m', C.MIN], ['$H', C.H], ['$W', C.D], ['$M', C.M], ['$y', C.Y], ['$D', C.DATE]].forEach(function (g) {\n proto[g[1]] = function (input) {\n return this.$g(input, g[0], g[1]);\n };\n});\n\ndayjs.extend = function (plugin, option) {\n if (!plugin.$i) {\n // install plugin only once\n plugin(option, Dayjs, dayjs);\n plugin.$i = true;\n }\n\n return dayjs;\n};\n\ndayjs.locale = parseLocale;\ndayjs.isDayjs = isDayjs;\n\ndayjs.unix = function (timestamp) {\n return dayjs(timestamp * 1e3);\n};\n\ndayjs.en = Ls[L];\ndayjs.Ls = Ls;\ndayjs.p = {};\nexport default dayjs;","import { FORMAT_DEFAULT } from '../../constant';\nexport default (function (o, c) {\n // locale needed later\n var proto = c.prototype;\n var oldFormat = proto.format;\n\n proto.format = function (formatStr) {\n var _this = this;\n\n var locale = this.$locale();\n\n if (!this.isValid()) {\n return oldFormat.bind(this)(formatStr);\n }\n\n var utils = this.$utils();\n var str = formatStr || FORMAT_DEFAULT;\n var result = str.replace(/\\[([^\\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g, function (match) {\n switch (match) {\n case 'Q':\n return Math.ceil((_this.$M + 1) / 3);\n\n case 'Do':\n return locale.ordinal(_this.$D);\n\n case 'gggg':\n return _this.weekYear();\n\n case 'GGGG':\n return _this.isoWeekYear();\n\n case 'wo':\n return locale.ordinal(_this.week(), 'W');\n // W for week\n\n case 'w':\n case 'ww':\n return utils.s(_this.week(), match === 'w' ? 1 : 2, '0');\n\n case 'W':\n case 'WW':\n return utils.s(_this.isoWeek(), match === 'W' ? 1 : 2, '0');\n\n case 'k':\n case 'kk':\n return utils.s(String(_this.$H === 0 ? 24 : _this.$H), match === 'k' ? 1 : 2, '0');\n\n case 'X':\n return Math.floor(_this.$d.getTime() / 1000);\n\n case 'x':\n return _this.$d.getTime();\n\n case 'z':\n return \"[\" + _this.offsetName() + \"]\";\n\n case 'zzz':\n return \"[\" + _this.offsetName('long') + \"]\";\n\n default:\n return match;\n }\n });\n return oldFormat.bind(this)(result);\n };\n});","import { D, W, Y } from '../../constant';\nvar isoWeekPrettyUnit = 'isoweek';\nexport default (function (o, c, d) {\n var getYearFirstThursday = function getYearFirstThursday(year, isUtc) {\n var yearFirstDay = (isUtc ? d.utc : d)().year(year).startOf(Y);\n var addDiffDays = 4 - yearFirstDay.isoWeekday();\n\n if (yearFirstDay.isoWeekday() > 4) {\n addDiffDays += 7;\n }\n\n return yearFirstDay.add(addDiffDays, D);\n };\n\n var getCurrentWeekThursday = function getCurrentWeekThursday(ins) {\n return ins.add(4 - ins.isoWeekday(), D);\n };\n\n var proto = c.prototype;\n\n proto.isoWeekYear = function () {\n var nowWeekThursday = getCurrentWeekThursday(this);\n return nowWeekThursday.year();\n };\n\n proto.isoWeek = function (week) {\n if (!this.$utils().u(week)) {\n return this.add((week - this.isoWeek()) * 7, D);\n }\n\n var nowWeekThursday = getCurrentWeekThursday(this);\n var diffWeekThursday = getYearFirstThursday(this.isoWeekYear(), this.$u);\n return nowWeekThursday.diff(diffWeekThursday, W) + 1;\n };\n\n proto.isoWeekday = function (week) {\n if (!this.$utils().u(week)) {\n return this.day(this.day() % 7 ? week : week - 7);\n }\n\n return this.day() || 7;\n };\n\n var oldStartOf = proto.startOf;\n\n proto.startOf = function (units, startOf) {\n var utils = this.$utils();\n var isStartOf = !utils.u(startOf) ? startOf : true;\n var unit = utils.p(units);\n\n if (unit === isoWeekPrettyUnit) {\n return isStartOf ? this.date(this.date() - (this.isoWeekday() - 1)).startOf('day') : this.date(this.date() - 1 - (this.isoWeekday() - 1) + 7).endOf('day');\n }\n\n return oldStartOf.bind(this)(units, startOf);\n };\n});","import dayjs from 'dayjs/esm';\nimport advancedFormat from 'dayjs/esm/plugin/advancedFormat';\nimport isoWeek from 'dayjs/esm/plugin/isoWeek';\n\nimport type { TemporalGranularity } from '../types';\n\ndayjs.extend(isoWeek);\ndayjs.extend(advancedFormat);\n\n/**\n * https://day.js.org/docs/en/plugin/advanced-format\n */\nconst FORMAT_ISO_WEEK_YEAR_WEEK = 'GGGG-[W]WW';\n\nexport class TemporalCache {\n private yearMonthDayCache = new Map<string, YearMonthDayClass>();\n private yearWeekCache = new Map<string, YearWeekClass>();\n private yearMonthCache = new Map<string, YearMonthClass>();\n private yearCache = new Map<string, YearClass>();\n\n private constructor() {}\n\n getYearMonthDay(s: string): YearMonthDayClass {\n if (!this.yearMonthDayCache.has(s)) {\n this.yearMonthDayCache.set(s, YearMonthDayClass.parse(s, this));\n }\n return this.yearMonthDayCache.get(s)!;\n }\n\n getYearMonth(s: string): YearMonthClass {\n if (!this.yearMonthCache.has(s)) {\n this.yearMonthCache.set(s, YearMonthClass.parse(s, this));\n }\n return this.yearMonthCache.get(s)!;\n }\n\n getYearWeek(s: string): YearWeekClass {\n if (!this.yearWeekCache.has(s)) {\n this.yearWeekCache.set(s, YearWeekClass.parse(s, this));\n }\n return this.yearWeekCache.get(s)!;\n }\n\n getYear(s: string): YearClass {\n if (!this.yearCache.has(s)) {\n this.yearCache.set(s, YearClass.parse(s, this));\n }\n return this.yearCache.get(s)!;\n }\n\n private static instance = new TemporalCache();\n\n static getInstance(): TemporalCache {\n return this.instance;\n }\n}\n\ninterface YearMonthDay {\n type: 'YearMonthDay';\n yearNumber: number;\n monthNumber: number;\n dayNumber: number;\n dateString: string;\n}\n\nexport class YearMonthDayClass implements YearMonthDay {\n readonly type = 'YearMonthDay';\n readonly date;\n readonly dayjs;\n readonly dateString;\n\n constructor(\n readonly yearNumber: number,\n readonly monthNumber: number,\n readonly dayNumber: number,\n readonly cache: TemporalCache,\n ) {\n this.date = new Date(this.yearNumber, this.monthNumber - 1, this.dayNumber);\n this.dayjs = dayjs(this.date);\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.dayjs.format('YYYY-MM-DD');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return this.dayjs.format('dddd, MMMM D, YYYY');\n }\n\n get firstDay(): YearMonthDayClass {\n return this;\n }\n\n get lastDay(): YearMonthDayClass {\n return this;\n }\n\n get year(): YearClass {\n return this.cache.getYear(`${this.yearNumber}`);\n }\n\n get month(): YearMonthClass {\n return this.cache.getYearMonth(this.dayjs.format('YYYY-MM'));\n }\n\n get week(): YearWeekClass {\n return this.cache.getYearWeek(this.dayjs.format(FORMAT_ISO_WEEK_YEAR_WEEK));\n }\n\n addDays(days: number): YearMonthDayClass {\n const date = this.dayjs.add(days, 'day');\n const s = date.format('YYYY-MM-DD');\n return this.cache.getYearMonthDay(s);\n }\n\n minus(other: YearMonthDayClass): number {\n return this.dayjs.diff(other.dayjs, 'day');\n }\n\n static parse(s: string, cache: TemporalCache): YearMonthDayClass {\n const [year, month, day] = s.split('-').map((s) => parseInt(s, 10));\n return new YearMonthDayClass(year, month, day, cache);\n }\n}\n\ninterface YearWeek {\n type: 'YearWeek';\n isoYearNumber: number;\n isoWeekNumber: number;\n dateString: string;\n}\n\nexport class YearWeekClass implements YearWeek {\n readonly type = 'YearWeek';\n readonly dateString;\n\n constructor(\n readonly isoYearNumber: number,\n readonly isoWeekNumber: number,\n readonly cache: TemporalCache,\n ) {\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.firstDay.dayjs.format(FORMAT_ISO_WEEK_YEAR_WEEK);\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return `Week ${this.isoWeekNumber}, ${this.isoYearNumber}`;\n }\n\n get firstDay(): YearMonthDayClass {\n // \"The first week of the year, hence, always contains 4 January.\" https://en.wikipedia.org/wiki/ISO_week_date\n const firstDay = dayjs()\n .year(this.isoYearNumber)\n .month(1)\n .date(4)\n .isoWeek(this.isoWeekNumber)\n .startOf('isoWeek');\n return this.cache.getYearMonthDay(firstDay.format('YYYY-MM-DD'));\n }\n\n get lastDay(): YearMonthDayClass {\n const firstDay = dayjs()\n .year(this.isoYearNumber)\n .startOf('year')\n .add((this.isoWeekNumber - 1) * 7, 'day')\n .startOf('week')\n .add(1, 'day');\n const lastDay = firstDay.add(6, 'day');\n\n return this.cache.getYearMonthDay(lastDay.format('YYYY-MM-DD'));\n }\n\n get year(): YearClass {\n return this.cache.getYear(`${this.isoYearNumber}`);\n }\n\n addWeeks(weeks: number): YearWeekClass {\n const date = this.firstDay.dayjs.add(weeks, 'week');\n const s = date.format(FORMAT_ISO_WEEK_YEAR_WEEK);\n return this.cache.getYearWeek(s);\n }\n\n minus(other: YearWeekClass): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'week');\n }\n\n static parse(s: string, cache: TemporalCache): YearWeekClass {\n const [year, week] = s.split('-W').map((s) => parseInt(s, 10));\n return new YearWeekClass(year, week, cache);\n }\n}\n\ninterface YearMonth {\n type: 'YearMonth';\n yearNumber: number;\n monthNumber: number;\n dateString: string;\n}\n\nexport class YearMonthClass implements YearMonth {\n readonly type = 'YearMonth';\n readonly dateString;\n\n constructor(\n readonly yearNumber: number,\n readonly monthNumber: number,\n readonly cache: TemporalCache,\n ) {\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.firstDay.dayjs.format('YYYY-MM');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return `${monthName(this.monthNumber)} ${this.yearNumber}`;\n }\n\n get firstDay(): YearMonthDayClass {\n return this.cache.getYearMonthDay(dayjs(`${this.yearNumber}-${this.monthNumber}-01`).format('YYYY-MM-DD'));\n }\n\n get lastDay(): YearMonthDayClass {\n return this.cache.getYearMonthDay(\n dayjs(`${this.yearNumber}-${this.monthNumber}-01`).endOf('month').format('YYYY-MM-DD'),\n );\n }\n\n get year(): YearClass {\n return this.cache.getYear(`${this.yearNumber}`);\n }\n\n addMonths(months: number): YearMonthClass {\n const date = this.firstDay.dayjs.add(months, 'month');\n const s = date.format('YYYY-MM');\n return this.cache.getYearMonth(s);\n }\n\n minus(other: YearMonthClass): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'month');\n }\n\n static parse(s: string, cache: TemporalCache): YearMonthClass {\n const [year, month] = s.split('-').map((s) => parseInt(s, 10));\n return new YearMonthClass(year, month, cache);\n }\n}\n\ninterface Year {\n type: 'Year';\n year: number;\n dateString: string;\n}\n\nexport class YearClass implements Year {\n readonly type = 'Year';\n readonly dateString;\n\n constructor(\n readonly year: number,\n readonly cache: TemporalCache,\n ) {\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.firstDay.dayjs.format('YYYY');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return this.year.toString();\n }\n\n get firstMonth(): YearMonthClass {\n return this.cache.getYearMonth(`${this.year}-01`);\n }\n\n get lastMonth(): YearMonthClass {\n return this.cache.getYearMonth(`${this.year}-12`);\n }\n\n get firstDay(): YearMonthDayClass {\n return this.firstMonth.firstDay;\n }\n\n get lastDay(): YearMonthDayClass {\n return this.lastMonth.lastDay;\n }\n\n addYears(years: number): YearClass {\n const date = this.firstDay.dayjs.add(years, 'year');\n const s = date.format('YYYY');\n return this.cache.getYear(s);\n }\n\n minus(other: YearClass): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'year');\n }\n\n static parse(s: string, cache: TemporalCache): YearClass {\n const year = parseInt(s, 10);\n return new YearClass(year, cache);\n }\n}\n\nfunction monthName(month: number): string {\n return dayjs()\n .month(month - 1)\n .format('MMMM');\n}\n\nexport type TemporalClass = YearMonthDayClass | YearWeekClass | YearMonthClass | YearClass;\nexport type Temporal = YearMonthDay | YearWeek | YearMonth | Year;\n\nexport function toTemporalClass(temporal: Temporal) {\n switch (temporal.type) {\n case 'YearMonthDay':\n return new YearMonthDayClass(\n temporal.yearNumber,\n temporal.monthNumber,\n temporal.dayNumber,\n TemporalCache.getInstance(),\n );\n case 'YearWeek':\n return new YearWeekClass(temporal.isoYearNumber, temporal.isoWeekNumber, TemporalCache.getInstance());\n case 'YearMonth':\n return new YearMonthClass(temporal.yearNumber, temporal.monthNumber, TemporalCache.getInstance());\n case 'Year':\n return new YearClass(temporal.year, TemporalCache.getInstance());\n }\n}\n\nexport function toTemporal(temporalClass: TemporalClass): Temporal {\n switch (temporalClass.type) {\n case 'YearMonthDay':\n return {\n type: 'YearMonthDay',\n yearNumber: temporalClass.yearNumber,\n monthNumber: temporalClass.monthNumber,\n dayNumber: temporalClass.dayNumber,\n dateString: temporalClass.dateString,\n };\n case 'YearWeek':\n return {\n type: 'YearWeek',\n isoYearNumber: temporalClass.isoYearNumber,\n isoWeekNumber: temporalClass.isoWeekNumber,\n dateString: temporalClass.dateString,\n };\n case 'YearMonth':\n return {\n type: 'YearMonth',\n yearNumber: temporalClass.yearNumber,\n monthNumber: temporalClass.monthNumber,\n dateString: temporalClass.dateString,\n };\n case 'Year':\n return {\n type: 'Year',\n year: temporalClass.year,\n dateString: temporalClass.dateString,\n };\n }\n}\n\nexport function generateAllDaysInRange(start: YearMonthDayClass, end: YearMonthDayClass): YearMonthDayClass[] {\n const days = [];\n const daysInBetween = end.minus(start);\n for (let i = 0; i <= daysInBetween; i++) {\n days.push(start.addDays(i));\n }\n return days;\n}\n\nexport function generateAllWeeksInRange(start: YearWeekClass, end: YearWeekClass): YearWeekClass[] {\n const weeks = [];\n const weeksInBetween = end.minus(start);\n for (let i = 0; i <= weeksInBetween; i++) {\n weeks.push(start.addWeeks(i));\n }\n return weeks;\n}\n\nexport function generateAllMonthsInRange(start: YearMonthClass, end: YearMonthClass): YearMonthClass[] {\n const months = [];\n const monthsInBetween = end.minus(start);\n for (let i = 0; i <= monthsInBetween; i++) {\n months.push(start.addMonths(i));\n }\n return months;\n}\n\nexport function generateAllYearsInRange(start: YearClass, end: YearClass): YearClass[] {\n const years = [];\n const yearsInBetween = end.minus(start);\n for (let i = 0; i <= yearsInBetween; i++) {\n years.push(start.addYears(i));\n }\n return years;\n}\n\nexport function generateAllInRange(start: TemporalClass | null, end: TemporalClass | null): TemporalClass[] {\n if (start === null || end === null) {\n return [];\n }\n if (start instanceof YearMonthDayClass && end instanceof YearMonthDayClass) {\n return generateAllDaysInRange(start, end);\n }\n if (start instanceof YearWeekClass && end instanceof YearWeekClass) {\n return generateAllWeeksInRange(start, end);\n }\n if (start instanceof YearMonthClass && end instanceof YearMonthClass) {\n return generateAllMonthsInRange(start, end);\n }\n if (start instanceof YearClass && end instanceof YearClass) {\n return generateAllYearsInRange(start, end);\n }\n throw new Error(`Invalid arguments: start and end must be of the same type: ${start}, ${end}`);\n}\n\nexport function minusTemporal(a: TemporalClass, b: TemporalClass): number {\n if (a instanceof YearMonthDayClass && b instanceof YearMonthDayClass) {\n return a.minus(b);\n }\n if (a instanceof YearWeekClass && b instanceof YearWeekClass) {\n return a.minus(b);\n }\n if (a instanceof YearMonthClass && b instanceof YearMonthClass) {\n return a.minus(b);\n }\n if (a instanceof YearClass && b instanceof YearClass) {\n return a.minus(b);\n }\n throw new Error(`Cannot compare ${a} and ${b}`);\n}\n\nexport function compareTemporal(a: TemporalClass | null, b: TemporalClass | null): number {\n if (a === null) {\n return 1;\n }\n if (b === null) {\n return -1;\n }\n const diff = minusTemporal(a, b);\n if (diff < 0) {\n return -1;\n }\n if (diff > 0) {\n return 1;\n }\n return 0;\n}\n\nexport function getMinMaxTemporal<T extends TemporalClass>(values: Iterable<T | null>) {\n let min: T | null = null;\n let max: T | null = null;\n for (const value of values) {\n if (value === null) {\n continue;\n }\n if (min === null || compareTemporal(value, min) < 0) {\n min = value;\n }\n if (max === null || compareTemporal(value, max) > 0) {\n max = value;\n }\n }\n if (min === null || max === null) {\n return { min: null, max: null };\n }\n return { min, max };\n}\n\nexport function addUnit(temporal: TemporalClass, amount: number): TemporalClass {\n if (temporal instanceof YearMonthDayClass) {\n return temporal.addDays(amount);\n }\n if (temporal instanceof YearWeekClass) {\n return temporal.addWeeks(amount);\n }\n if (temporal instanceof YearMonthClass) {\n return temporal.addMonths(amount);\n }\n if (temporal instanceof YearClass) {\n return temporal.addYears(amount);\n }\n throw new Error(`Invalid argument: ${temporal}`);\n}\n\nexport function parseDateStringToTemporal(date: string, granularity: TemporalGranularity) {\n const cache = TemporalCache.getInstance();\n const day = cache.getYearMonthDay(date);\n switch (granularity) {\n case 'day':\n return day;\n case 'week':\n return day.week;\n case 'month':\n return day.month;\n case 'year':\n return day.year;\n }\n}\n\nexport function dateRangeCompare(a: { dateRange: TemporalClass | null }, b: { dateRange: TemporalClass | null }) {\n if (a.dateRange === null) {\n return 1;\n }\n if (b.dateRange === null) {\n return -1;\n }\n return compareTemporal(a.dateRange, b.dateRange);\n}\n","import { type LapisFilter } from '../types';\n\nexport function getMinMaxNumber(values: Iterable<number>): [number, number] | null {\n let min = null;\n let max = null;\n for (const value of values) {\n if (min === null || value < min) {\n min = value;\n }\n if (max === null || value > max) {\n max = value;\n }\n }\n if (min === null || max === null) {\n return null;\n }\n return [min, max];\n}\n\nexport function mapLapisFilterToUrlParams(filter: LapisFilter): URLSearchParams {\n const params = Object.entries(filter).map(([key, value]) => [key, stringifyLapisFilterValue(value)]);\n\n return new URLSearchParams(params);\n}\n\nfunction stringifyLapisFilterValue(value: LapisFilter[string]) {\n if (value === null) {\n return 'null';\n }\n switch (typeof value) {\n case 'boolean':\n return value ? 'true' : 'false';\n case 'number':\n return value.toString();\n case 'string':\n return value;\n }\n}\n\nexport function makeArray<T>(arrayOrSingleItem: T | T[]) {\n if (Array.isArray(arrayOrSingleItem)) {\n return arrayOrSingleItem;\n }\n return [arrayOrSingleItem];\n}\n","import { Chart, type ChartConfiguration, registerables } from 'chart.js';\n\nimport { maxInData } from './prevalence-over-time';\nimport { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { addUnit, minusTemporal } from '../../utils/temporalClass';\nimport { getMinMaxNumber } from '../../utils/utils';\nimport GsChart from '../components/chart';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeBubbleChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst PrevalenceOverTimeBubbleChart = ({\n data,\n yAxisScaleType,\n yAxisMaxConfig,\n}: PrevalenceOverTimeBubbleChartProps) => {\n const nonNullDateRangeData = data\n .filter((prevalenceOverTimeData) => prevalenceOverTimeData.content.length > 0)\n .map((variantData) => {\n return {\n content: variantData.content.filter((dataPoint) => dataPoint.dateRange !== null),\n displayName: variantData.displayName,\n };\n });\n\n if (nonNullDateRangeData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const firstDate = nonNullDateRangeData[0].content[0].dateRange!;\n const total = nonNullDateRangeData.map((graphData) => graphData.content.map((dataPoint) => dataPoint.total)).flat();\n const [minTotal, maxTotal] = getMinMaxNumber(total)!;\n const scaleBubble = (value: number) => {\n return ((value - minTotal) / (maxTotal - minTotal)) * 4.5 + 0.5;\n };\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nonNullDateRangeData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'bubble',\n data: {\n datasets: nonNullDateRangeData.map((graphData, index) => ({\n label: graphData.displayName,\n data: graphData.content\n .filter((dataPoint) => dataPoint.dateRange !== null)\n .map((dataPoint) => ({\n x: minusTemporal(dataPoint.dateRange!, firstDate),\n y: dataPoint.prevalence,\n r: scaleBubble(dataPoint.total),\n })),\n borderWidth: 1,\n pointRadius: 0,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n })),\n },\n options: {\n animation: false,\n maintainAspectRatio: false,\n scales: {\n x: {\n ticks: {\n callback: (value) => addUnit(firstDate, value as number).toString(),\n },\n },\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n callbacks: {\n title: (context) => {\n const dataset = nonNullDateRangeData[context[0].datasetIndex!];\n const dataPoint = dataset.content[context[0].dataIndex!];\n return dataPoint.dateRange?.toString();\n },\n label: (context) => {\n const dataset = nonNullDateRangeData[context.datasetIndex!];\n const dataPoint = dataset.content[context.dataIndex!];\n\n const percentage = (dataPoint.prevalence * 100).toFixed(2);\n const count = dataPoint.count.toFixed(0);\n const total = dataPoint.total.toFixed(0);\n\n return `${dataset.displayName}: ${percentage}%, ${count}/${total} samples`;\n },\n },\n },\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nexport default PrevalenceOverTimeBubbleChart;\n","import { Chart, type ChartConfiguration, registerables } from 'chart.js';\nimport { type TooltipItem } from 'chart.js/dist/types';\n\nimport { maxInData } from './prevalence-over-time';\nimport { type PrevalenceOverTimeData, type PrevalenceOverTimeVariantData } from '../../query/queryPrevalenceOverTime';\nimport GsChart from '../components/chart';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport {\n confidenceIntervalDataLabel,\n type ConfidenceIntervalMethod,\n wilson95PercentConfidenceInterval,\n} from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeLineChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst PrevalenceOverTimeLineChart = ({\n data,\n yAxisScaleType,\n confidenceIntervalMethod,\n yAxisMaxConfig,\n}: PrevalenceOverTimeLineChartProps) => {\n const nonNullDateRangeData = data\n .filter((prevalenceOverTimeData) => prevalenceOverTimeData.content.length > 0)\n .map((variantData) => {\n return {\n content: variantData.content.filter((dataPoint) => dataPoint.dateRange !== null),\n displayName: variantData.displayName,\n };\n });\n\n if (nonNullDateRangeData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const datasets = nonNullDateRangeData\n .map((graphData, index) => getDataset(graphData, index, confidenceIntervalMethod))\n .flat();\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nonNullDateRangeData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'line',\n data: {\n datasets,\n },\n options: {\n animation: false,\n maintainAspectRatio: false,\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(confidenceIntervalMethod),\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nconst getDataset = (\n prevalenceOverTimeVariant: PrevalenceOverTimeVariantData,\n dataIndex: number,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n) => {\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return [\n getDatasetCIUpper(prevalenceOverTimeVariant, dataIndex),\n getDatasetLine(prevalenceOverTimeVariant, dataIndex),\n getDatasetCILower(prevalenceOverTimeVariant, dataIndex),\n ].flat();\n default:\n return getDatasetLine(prevalenceOverTimeVariant, dataIndex);\n }\n};\n\nconst getDatasetCIUpper = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: `${prevalenceOverTimeVariant.displayName} CI upper`,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n return {\n y: wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total).upperLimit,\n x: dataPoint.dateRange?.toString(),\n };\n }),\n borderWidth: 0,\n pointRadius: 0,\n fill: '+1',\n backgroundColor: singleGraphColorRGBAById(dataIndex, 0.3),\n});\n\nconst getDatasetCILower = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: `${prevalenceOverTimeVariant.displayName} CI lower`,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n return {\n y: wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total).lowerLimit,\n x: dataPoint.dateRange?.toString(),\n };\n }),\n borderWidth: 0,\n pointRadius: 0,\n fill: '-1',\n backgroundColor: singleGraphColorRGBAById(dataIndex, 0.3),\n});\n\nconst getDatasetLine = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: prevalenceOverTimeVariant.displayName,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n const ciLimits = wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total);\n\n return {\n y: dataPoint.prevalence,\n x: dataPoint.dateRange?.toString(),\n yCiUpper: ciLimits.upperLimit,\n yCiLower: ciLimits.lowerLimit,\n };\n }),\n borderWidth: 1,\n pointRadius: 0,\n borderColor: singleGraphColorRGBAById(dataIndex),\n backgroundColor: singleGraphColorRGBAById(dataIndex),\n});\n\ninterface Datapoint {\n y: number;\n yCiLower?: number;\n yCiUpper?: number;\n x?: string;\n}\n\nconst tooltip = (confidenceIntervalMethod?: ConfidenceIntervalMethod) => {\n const generalConfig = {\n mode: 'index' as const,\n intersect: false,\n };\n\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return {\n ...generalConfig,\n filter: ({ datasetIndex }: TooltipItem<'line'>) => {\n return isNotCiIndex(datasetIndex);\n },\n callbacks: {\n label: (context: TooltipItem<'line'>) => {\n const dataPoint = context.dataset.data[context.dataIndex] as unknown as Datapoint;\n\n return confidenceIntervalDataLabel(\n dataPoint.y,\n dataPoint.yCiLower,\n dataPoint.yCiUpper,\n context.dataset.label,\n );\n },\n },\n };\n default:\n return generalConfig;\n }\n};\n\nfunction isNotCiIndex(datasetIndex: number) {\n return datasetIndex % 3 === 1;\n}\n\nexport default PrevalenceOverTimeLineChart;\n","import { getPrevalenceOverTimeTableData } from './getPrevalenceOverTimeTableData';\nimport { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { type TemporalGranularity } from '../../types';\nimport { Table } from '../components/table';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface PrevalenceOverTimeTableProps {\n data: PrevalenceOverTimeData;\n granularity: TemporalGranularity;\n pageSize: boolean | number;\n}\n\nconst PrevalenceOverTimeTable = ({ data, granularity, pageSize }: PrevalenceOverTimeTableProps) => {\n const getSplitColumns = (data: PrevalenceOverTimeData) => {\n return data.map((dataset) => ({\n name: dataset.displayName,\n columns: [\n {\n name: 'prevalence',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n {\n name: 'count',\n sort: true,\n },\n ],\n }));\n };\n\n const getColumns = (data: PrevalenceOverTimeData) => [\n {\n name: granularity,\n sort: true,\n },\n ...getSplitColumns(data),\n ];\n\n const getData = (data: PrevalenceOverTimeData, granularity: TemporalGranularity) => {\n const dataByHeader = getPrevalenceOverTimeTableData(data, granularity);\n return Object.values(dataByHeader).map((row) => Object.values(row));\n };\n\n return <Table data={getData(data, granularity)} columns={getColumns(data)} pageSize={pageSize} />;\n};\n\nexport default PrevalenceOverTimeTable;\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchAggregated } from '../lapisApi/lapisApi';\nimport { type AggregatedItem } from '../lapisApi/lapisTypes';\nimport { type LapisFilter } from '../types';\n\nexport class FetchAggregatedOperator<Fields extends Record<string, unknown>>\n implements Operator<Fields & { count: number }>\n{\n constructor(\n private filter: LapisFilter,\n private fields: string[] = [],\n ) {}\n\n async evaluate(lapisUrl: string, signal?: AbortSignal): Promise<Dataset<Fields & { count: number }>> {\n const aggregatedResponse = (\n await fetchAggregated(\n lapisUrl,\n {\n ...this.filter,\n fields: this.fields,\n },\n signal,\n )\n ).data;\n\n if (isFieldsArrayWithCount<Fields & { count: number }>(aggregatedResponse)) {\n return {\n content: aggregatedResponse,\n };\n }\n\n throw new Error('Aggregated response does not have count');\n }\n}\n\nfunction isFieldsArrayWithCount<T>(data: AggregatedItem[]): data is (T & { count: number })[] {\n return data.every((item) => typeof item === 'object' && 'count' in item && typeof item.count === 'number');\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class FillMissingOperator<Data, KeyToFill extends keyof Data> implements Operator<Data> {\n constructor(\n private child: Operator<Data>,\n private keyField: KeyToFill,\n private getMinMaxFn: (\n values: Iterable<Data[KeyToFill]>,\n ) => { min: Data[KeyToFill]; max: Data[KeyToFill] } | null,\n private getAllRequiredKeysFn: (min: Data[KeyToFill], max: Data[KeyToFill]) => Data[KeyToFill][],\n private defaultValueFn: (key: Data[KeyToFill]) => Data,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<Data>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const existingKeys = new Set(childEvaluated.content.map((row) => row[this.keyField]));\n const minMax = this.getMinMaxFn(existingKeys);\n if (minMax === null) {\n return childEvaluated;\n }\n const { min, max } = minMax;\n const requiredKeys = this.getAllRequiredKeysFn(min, max);\n const content = childEvaluated.content;\n for (const key of requiredKeys) {\n if (!existingKeys.has(key)) {\n content.push(this.defaultValueFn(key));\n }\n }\n return { content };\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class GroupByOperator<Data, AggregationResult, KeyToGroupBy extends keyof Data>\n implements Operator<AggregationResult>\n{\n constructor(\n private child: Operator<Data>,\n private field: KeyToGroupBy,\n private aggregate: (values: Data[]) => AggregationResult,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<AggregationResult>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const grouped = new Map<Data[KeyToGroupBy], Data[]>();\n for (const row of childEvaluated.content) {\n const key = row[this.field];\n if (!grouped.has(key)) {\n grouped.set(key, []);\n }\n grouped.get(key)!.push(row);\n }\n const result = new Array<AggregationResult>();\n for (const [, values] of grouped) {\n result.push(this.aggregate(values));\n }\n\n return {\n content: result,\n };\n }\n}\n","import { GroupByOperator } from './GroupByOperator';\nimport { type Operator } from './Operator';\nimport { type NumberFields } from '../utils/type-utils';\n\ntype Result<Data, KeyToGroupBy extends keyof Data, KeyToSumBy extends keyof Data> = {\n [P in KeyToGroupBy | KeyToSumBy]: P extends KeyToGroupBy ? Data[KeyToGroupBy] : number;\n};\n\nexport class GroupByAndSumOperator<\n Data,\n KeyToGroupBy extends keyof Data,\n KeySoSumBy extends NumberFields<Data>,\n> extends GroupByOperator<Data, Result<Data, KeyToGroupBy, KeySoSumBy>, KeyToGroupBy> {\n constructor(child: Operator<Data>, groupByField: KeyToGroupBy, sumField: KeySoSumBy) {\n super(child, groupByField, (values: Data[]) => {\n let n = 0;\n for (const value of values) {\n n += value[sumField] as number;\n }\n return {\n [groupByField]: values[0][groupByField],\n [sumField]: n,\n } as Result<Data, KeyToGroupBy, KeySoSumBy>;\n });\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class MapOperator<S, T> implements Operator<T> {\n constructor(\n private child: Operator<S>,\n private func: (value: S) => T,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<T>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n return {\n content: childEvaluated.content.map(this.func),\n };\n }\n}\n","import { MapOperator } from './MapOperator';\nimport type { Operator } from './Operator';\n\nexport class RenameFieldOperator<\n OldFieldName extends string,\n NewFieldName extends string,\n Data extends { [key in OldFieldName]: unknown },\n> extends MapOperator<Data, Data & { [key in NewFieldName]: Data[OldFieldName] }> {\n constructor(child: Operator<Data>, oldFieldName: OldFieldName, newFieldName: NewFieldName) {\n super(\n child,\n (value) =>\n ({\n ...value,\n [newFieldName]: value[oldFieldName],\n }) as Data & { [key in NewFieldName]: Data[OldFieldName] },\n );\n }\n}\n","import { type Operator } from './Operator';\n\nexport class SlidingOperator<Data, AggregationResult> implements Operator<AggregationResult> {\n constructor(\n private child: Operator<Data>,\n private windowSize: number,\n private aggregate: (values: Data[]) => AggregationResult,\n ) {\n if (windowSize < 1) {\n throw new Error('Window size must be at least 1');\n }\n }\n\n async evaluate(lapis: string, signal?: AbortSignal) {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const content = new Array<AggregationResult>();\n if (childEvaluated.content.length === 0) {\n return { content };\n }\n const numberOfWindows = Math.max(childEvaluated.content.length - this.windowSize, 0) + 1;\n for (let i = 0; i < numberOfWindows; i++) {\n content.push(this.aggregate(childEvaluated.content.slice(i, i + this.windowSize)));\n }\n return { content };\n }\n}\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { FillMissingOperator } from '../operator/FillMissingOperator';\nimport { GroupByAndSumOperator } from '../operator/GroupByAndSumOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { SlidingOperator } from '../operator/SlidingOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport type { LapisFilter, TemporalGranularity } from '../types';\nimport {\n dateRangeCompare,\n generateAllInRange,\n getMinMaxTemporal,\n parseDateStringToTemporal,\n type TemporalClass,\n} from '../utils/temporalClass';\n\nexport function queryAggregatedDataOverTime<LapisDateField extends string>(\n filter: LapisFilter,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n lapisDateField: LapisDateField,\n) {\n const fetchData = new FetchAggregatedOperator<{ [key in LapisDateField]: string | null }>(filter, [lapisDateField]);\n const dataWithFixedDateKey = new RenameFieldOperator(fetchData, lapisDateField, 'date');\n const mapData = new MapOperator(dataWithFixedDateKey, (d) => mapDateToGranularityRange(d, granularity));\n const groupByData = new GroupByAndSumOperator(mapData, 'dateRange', 'count');\n const fillData = new FillMissingOperator(\n groupByData,\n 'dateRange',\n getMinMaxTemporal,\n generateAllInRange,\n (key) => ({ dateRange: key, count: 0 }),\n );\n const sortData = new SortOperator(fillData, dateRangeCompare);\n\n return smoothingWindow >= 1 ? new SlidingOperator(sortData, smoothingWindow, averageSmoothing) : sortData;\n}\n\nexport function mapDateToGranularityRange(\n data: { date: string | null; count: number },\n granularity: TemporalGranularity,\n) {\n return {\n dateRange: data.date === null ? null : parseDateStringToTemporal(data.date, granularity),\n count: data.count,\n };\n}\n\nfunction averageSmoothing(slidingWindow: { dateRange: TemporalClass | null; count: number }[]) {\n const average = slidingWindow.reduce((acc, curr) => acc + curr.count, 0) / slidingWindow.length;\n const centerIndex = Math.floor(slidingWindow.length / 2);\n return { dateRange: slidingWindow[centerIndex].dateRange, count: average };\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { type MappedNumber, type NumberFields } from '../utils/type-utils';\n\nexport type DivisionOperatorResult<\n KeyField extends keyof ValueObject,\n ValueObject,\n ResultField extends string,\n NumeratorField extends string,\n DenominatorField extends string,\n> = { [P in KeyField]: ValueObject[KeyField] } & MappedNumber<ResultField> &\n MappedNumber<NumeratorField> &\n MappedNumber<DenominatorField>;\n\nexport class DivisionOperator<\n ValueObject,\n KeyField extends keyof ValueObject,\n ValueField extends NumberFields<ValueObject>,\n ResultField extends string,\n NumeratorField extends string,\n DenominatorField extends string,\n> implements Operator<DivisionOperatorResult<KeyField, ValueObject, ResultField, NumeratorField, DenominatorField>>\n{\n constructor(\n private numerator: Operator<ValueObject>,\n private denominator: Operator<ValueObject>,\n private keyField: KeyField,\n private valueField: ValueField,\n private resultField: ResultField,\n private numeratorField: NumeratorField,\n private denominatorField: DenominatorField,\n ) {}\n\n async evaluate(\n lapis: string,\n signal?: AbortSignal,\n ): Promise<Dataset<DivisionOperatorResult<KeyField, ValueObject, ResultField, NumeratorField, DenominatorField>>> {\n const numeratorEvaluated = await this.numerator.evaluate(lapis, signal);\n const denominatorEvaluated = await this.denominator.evaluate(lapis, signal);\n\n const numeratorMap = new Map<ValueObject[KeyField], ValueObject[ValueField]>();\n numeratorEvaluated.content.forEach((row) => {\n numeratorMap.set(row[this.keyField], row[this.valueField]);\n });\n\n const content = denominatorEvaluated.content.map((row) => {\n const numeratorValue = numeratorMap.get(row[this.keyField]) ?? 0;\n return {\n [this.keyField]: row[this.keyField],\n [this.numeratorField]: numeratorValue as number,\n [this.denominatorField]: row[this.valueField] as number,\n [this.resultField]: (numeratorValue as number) / (row[this.valueField] as number),\n } as { [P in KeyField]: ValueObject[KeyField] } & MappedNumber<ResultField> &\n MappedNumber<NumeratorField> &\n MappedNumber<DenominatorField>;\n });\n\n return { content };\n }\n}\n","import { queryAggregatedDataOverTime } from './queryAggregatedDataOverTime';\nimport { DivisionOperator } from '../operator/DivisionOperator';\nimport { type LapisFilter, type NamedLapisFilter, type TemporalGranularity } from '../types';\nimport { type TemporalClass } from '../utils/temporalClass';\nimport { makeArray } from '../utils/utils';\n\nexport type PrevalenceOverTimeData = PrevalenceOverTimeVariantData[];\n\nexport type PrevalenceOverTimeVariantData = {\n displayName: string;\n content: PrevalenceOverTimeVariantDataPoint[];\n};\n\nexport type PrevalenceOverTimeVariantDataPoint = {\n count: number;\n prevalence: number;\n total: number;\n dateRange: TemporalClass | null;\n};\n\nexport function queryPrevalenceOverTime(\n numeratorFilter: NamedLapisFilter | NamedLapisFilter[],\n denominatorFilter: LapisFilter,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n lapis: string,\n lapisDateField: string,\n signal?: AbortSignal,\n): Promise<PrevalenceOverTimeData> {\n const numeratorFilters = makeArray(numeratorFilter);\n\n const denominatorData = queryAggregatedDataOverTime(\n denominatorFilter,\n granularity,\n smoothingWindow,\n lapisDateField,\n );\n const subQueries = numeratorFilters.map(async (namedLapisFilter) => {\n const { displayName, lapisFilter } = namedLapisFilter;\n const numeratorData = queryAggregatedDataOverTime(lapisFilter, granularity, smoothingWindow, lapisDateField);\n const divide = new DivisionOperator(\n numeratorData,\n denominatorData,\n 'dateRange',\n 'count',\n 'prevalence',\n 'count',\n 'total',\n );\n const dataset = await divide.evaluate(lapis, signal);\n return {\n displayName,\n content: dataset.content,\n };\n });\n return Promise.all(subQueries);\n}\n","import { type FunctionComponent } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nexport interface SelectProps {\n items: { label: string; value: string; disabled?: boolean }[];\n selected: string;\n onChange: JSXInternal.GenericEventHandler<HTMLSelectElement>;\n selectStyle?: string;\n}\n\nexport const Select: FunctionComponent<SelectProps> = ({ items, selected, onChange, selectStyle }) => {\n return (\n <select class={`select select-bordered ${selectStyle}`} value={selected} onChange={onChange}>\n {items.map((item) => (\n <option key={item.value} value={item.value} disabled={item.disabled}>\n {item.label}\n </option>\n ))}\n </select>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Select } from './select';\nimport type { ConfidenceIntervalMethod } from '../shared/charts/confideceInterval';\n\ntype ConfidenceIntervalSelectorProps = {\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n setConfidenceIntervalMethod: (method: ConfidenceIntervalMethod) => void;\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n};\n\nexport const ConfidenceIntervalSelector: FunctionComponent<ConfidenceIntervalSelectorProps> = ({\n confidenceIntervalMethod,\n setConfidenceIntervalMethod,\n confidenceIntervalMethods,\n}) => {\n if (confidenceIntervalMethods.length === 0) {\n return null;\n }\n\n const items = [\n { label: 'Confidence interval method', value: 'none', disabled: true },\n ...confidenceIntervalMethods.concat('none').map((method) => {\n switch (method) {\n case 'wilson':\n return { label: 'Wilson, 95% CI', value: 'wilson' };\n case 'none':\n return { label: 'None', value: 'none' };\n }\n }),\n ];\n\n return (\n <Select\n items={items}\n selected={confidenceIntervalMethod === undefined ? 'none' : confidenceIntervalMethod}\n onChange={(event: Event) => {\n const select = event.target as HTMLSelectElement;\n const value = select.value as ConfidenceIntervalMethod;\n setConfidenceIntervalMethod(value);\n }}\n selectStyle={'select-xs select-bordered'}\n />\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Select } from './select';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\n\nexport type ScalingSelectorProps = {\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n className?: string;\n enabledTypes?: ScaleType[];\n};\n\nconst scaleTypeItem: { label: string; value: ScaleType }[] = [\n { label: 'Linear', value: 'linear' },\n { label: 'Logarithmic', value: 'logarithmic' },\n { label: 'Logit', value: 'logit' },\n];\n\nexport const ScalingSelector: FunctionComponent<ScalingSelectorProps> = ({\n yAxisScaleType,\n setYAxisScaleType,\n className,\n enabledTypes,\n}) => {\n const items = [\n { label: 'y axis scaling type', value: 'none', disabled: true },\n ...scaleTypeItem.filter((item) => enabledTypes === undefined || enabledTypes.includes(item.value)),\n ];\n\n return (\n <Select\n items={items}\n selected={yAxisScaleType}\n onChange={(event: Event) => {\n const select = event.target as HTMLSelectElement;\n const value = select.value as ScaleType;\n setYAxisScaleType(value);\n }}\n selectStyle={`${className} select-xs select-bordered`}\n />\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport { getPrevalenceOverTimeTableData } from './getPrevalenceOverTimeTableData';\nimport PrevalenceOverTimeBarChart from './prevalence-over-time-bar-chart';\nimport PrevalenceOverTimeBubbleChart from './prevalence-over-time-bubble-chart';\nimport PrevalenceOverTimeLineChart from './prevalence-over-time-line-chart';\nimport PrevalenceOverTimeTable from './prevalence-over-time-table';\nimport { type PrevalenceOverTimeData, queryPrevalenceOverTime } from '../../query/queryPrevalenceOverTime';\nimport { type LapisFilter, type NamedLapisFilter, type TemporalGranularity } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ConfidenceIntervalSelector } from '../components/confidence-interval-selector';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoHeadline2, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport { type ConfidenceIntervalMethod } from '../shared/charts/confideceInterval';\nimport { type AxisMax } from '../shared/charts/getYAxisMax';\nimport { type ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'bar' | 'line' | 'bubble' | 'table';\n\nexport interface PrevalenceOverTimeProps {\n width: string;\n height: string;\n numeratorFilter: NamedLapisFilter | NamedLapisFilter[];\n denominatorFilter: LapisFilter;\n granularity: TemporalGranularity;\n smoothingWindow: number;\n views: View[];\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n lapisDateField: string;\n pageSize: boolean | number;\n yAxisMaxLinear: AxisMax;\n yAxisMaxLogarithmic: AxisMax;\n}\n\nexport const PrevalenceOverTime: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <PrevalenceOverTimeInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const PrevalenceOverTimeInner: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { numeratorFilter, denominatorFilter, granularity, smoothingWindow, lapisDateField } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(\n () =>\n queryPrevalenceOverTime(\n numeratorFilter,\n denominatorFilter,\n granularity,\n smoothingWindow,\n lapis,\n lapisDateField,\n ),\n [lapis, numeratorFilter, denominatorFilter, granularity, smoothingWindow, lapisDateField],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null || data.every((variant) => variant.content.length === 0)) {\n return <NoDataDisplay />;\n }\n\n return <PrevalenceOverTimeTabs data={data} {...componentProps} />;\n};\n\ntype PrevalenceOverTimeTabsProps = PrevalenceOverTimeProps & {\n data: PrevalenceOverTimeData;\n};\n\nconst PrevalenceOverTimeTabs: FunctionComponent<PrevalenceOverTimeTabsProps> = ({ data, ...componentProps }) => {\n const { views, granularity, confidenceIntervalMethods, pageSize, yAxisMaxLinear, yAxisMaxLogarithmic } =\n componentProps;\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n const [confidenceIntervalMethod, setConfidenceIntervalMethod] = useState<ConfidenceIntervalMethod>(\n confidenceIntervalMethods.length > 0 ? confidenceIntervalMethods[0] : 'none',\n );\n const yAxisMaxConfig = { linear: yAxisMaxLinear, logarithmic: yAxisMaxLogarithmic };\n\n const getTab = (view: View) => {\n switch (view) {\n case 'bar':\n return {\n title: 'Bar',\n content: (\n <PrevalenceOverTimeBarChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n confidenceIntervalMethod={confidenceIntervalMethod}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'line':\n return {\n title: 'Line',\n content: (\n <PrevalenceOverTimeLineChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n confidenceIntervalMethod={confidenceIntervalMethod}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'bubble':\n return {\n title: 'Bubble',\n content: (\n <PrevalenceOverTimeBubbleChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'table':\n return {\n title: 'Table',\n content: <PrevalenceOverTimeTable data={data} granularity={granularity} pageSize={pageSize} />,\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n data={data}\n confidenceIntervalMethod={confidenceIntervalMethod}\n setConfidenceIntervalMethod={setConfidenceIntervalMethod}\n {...componentProps}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = PrevalenceOverTimeProps & {\n activeTab: string;\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n setConfidenceIntervalMethod: (confidenceIntervalMethod: ConfidenceIntervalMethod) => void;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n yAxisScaleType,\n setYAxisScaleType,\n confidenceIntervalMethod,\n setConfidenceIntervalMethod,\n data,\n ...componentProps\n}) => {\n const { confidenceIntervalMethods, granularity } = componentProps;\n return (\n <>\n {activeTab !== 'Table' && (\n <ScalingSelector yAxisScaleType={yAxisScaleType} setYAxisScaleType={setYAxisScaleType} />\n )}\n {(activeTab === 'Bar' || activeTab === 'Line') && (\n <ConfidenceIntervalSelector\n confidenceIntervalMethods={confidenceIntervalMethods}\n confidenceIntervalMethod={confidenceIntervalMethod}\n setConfidenceIntervalMethod={setConfidenceIntervalMethod}\n />\n )}\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getPrevalenceOverTimeTableData(data, granularity)}\n filename='prevalence_over_time.csv'\n />\n\n <PrevalenceOverTimeInfo {...componentProps} />\n <Fullscreen />\n </>\n );\n};\n\nconst PrevalenceOverTimeInfo: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { granularity, smoothingWindow, views } = componentProps;\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Prevalence over time</InfoHeadline1>\n <InfoParagraph>\n This presents the proportion of one or more variants per <b>{granularity}</b>\n {smoothingWindow > 0 && `, smoothed using a ${smoothingWindow}-${granularity} sliding window`}. The\n proportion is calculated as the number of sequences of the variant(s) divided by the number of sequences\n that match the <code>denominatorFilter</code> (see below).\n </InfoParagraph>\n <InfoParagraph>\n Sequences that have no assigned date will not be shown in the line and bubble chart. They will show up\n in the bar and table view with date \"unknown\".\n </InfoParagraph>\n {views.includes('bubble') && (\n <>\n <InfoHeadline2>Bubble chart</InfoHeadline2>\n <InfoParagraph>\n The size of the bubble scales with the total number of available sequences from the{' '}\n {granularity}.\n </InfoParagraph>\n </>\n )}\n <InfoComponentCode componentName='prevalence-over-time' params={componentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n\nexport const maxInData = (data: PrevalenceOverTimeData) =>\n Math.max(...data.flatMap((variant) => variant.content.map((dataPoint) => dataPoint.prevalence)));\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { PrevalenceOverTime, type PrevalenceOverTimeProps } from '../../preact/prevalenceOverTime/prevalence-over-time';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays the prevalence over time of one or more datasets, selected by LAPIS filters.\n * The prevalence is calculated as the ratio of the number of cases of each dataset to the number of cases of a reference dataset.\n * The reference dataset is also selected by a LAPIS filter.\n *\n * In the chart views,\n * - the user can select whether to display a confidence interval (not available in the bubble chart).\n * The confidence interval is calculated using [Wilson score interval](https://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval),\n * with a confidence level of 95%.\n * - the x-axis shows time steps in the selected `granularity`.\n * - the user can select the y-axis scale (linear, logistic, logit).\n *\n * ## Views\n *\n * ### Bar View\n *\n * Displays the prevalence over time as a bar chart.\n * Shows a bar for each dataset of the `numeratorFilter` on every time step.\n *\n * ### Line View\n *\n * Displays the prevalence over time as a line chart.\n * Each data point is connected for better visibility.\n * Shows a line for each dataset of the `numeratorFilter`.\n *\n * ### Bubble View\n *\n * Displays the prevalence over time as a bubble chart.\n * The size of the bubbles represents the number of cases of the reference, defined by the `denominatorFilter`.\n * The height of the bubbles represents the prevalence of the datasets selected by the `numeratorFilters`.\n *\n * ### Table View\n *\n * Displays the prevalence over time as a table with one row per time point.\n */\n@customElement('gs-prevalence-over-time')\nexport class PrevalenceOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * Required.\n * Either a LAPIS filter or an array of LAPIS filters to calculate the prevalence for.\n *\n * The `lapisFilter` will be sent as is to LAPIS to select the data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used as the label the prevalence in the views.\n * It should be human-readable.\n *\n */\n @property({type: Object})\n numeratorFilter:\n {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }\n | {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }[] = {displayName: '', lapisFilter: {}};\n\n /**\n * Required.\n *\n * The LAPIS filter, to select the data of the reference.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n denominatorFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'day';\n\n /**\n * The number of time steps to use for smoothing the data.\n * `0` means no smoothing.\n * Must be a non-negative integer.\n *\n * For a given time, the shown value is the mean of the neighbouring measured values.\n * The `smoothingWindow` value provides the number of neighbouring values to take into account.\n * The resulting time is computed via `Math.floor(smoothingWindow / 2)`.\n */\n @property({ type: Number })\n smoothingWindow: number = 0;\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('bar' | 'line' | 'bubble' | 'table')[] = ['bar', 'line', 'bubble', 'table'];\n\n /**\n * A list of methods to calculate the confidence interval.\n * The option `none` is always available and disables confidence intervals.\n * Pass an empty array to disable the confidence interval selector.\n */\n @property({ type: Array })\n confidenceIntervalMethods: ('wilson' | 'none')[] = ['wilson'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n /**\n * The maximum value for the y-axis on all graphs in linear view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLinear: 'maxInData' | 'limitTo1' | number = 1;\n\n /**\n * The maximum value for the y-axis on all graphs in logarithmic view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLogarithmic: 'maxInData' | 'limitTo1' | number = 1;\n\n override render() {\n return (\n <PrevalenceOverTime\n numeratorFilter={this.numeratorFilter}\n denominatorFilter={this.denominatorFilter}\n granularity={this.granularity}\n smoothingWindow={this.smoothingWindow}\n views={this.views}\n confidenceIntervalMethods={this.confidenceIntervalMethods}\n width={this.width}\n height={this.height}\n lapisDateField={this.lapisDateField}\n pageSize={this.pageSize}\n yAxisMaxLinear={this.yAxisMaxLinear}\n yAxisMaxLogarithmic={this.yAxisMaxLogarithmic}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-prevalence-over-time': PrevalenceOverTimeComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-prevalence-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype NumeratorMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.numeratorFilter, PrevalenceOverTimeProps['numeratorFilter']>\n>;\ntype DenominatorMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.denominatorFilter, PrevalenceOverTimeProps['denominatorFilter']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.granularity, PrevalenceOverTimeProps['granularity']>\n>;\ntype SmoothingWindowMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.smoothingWindow, PrevalenceOverTimeProps['smoothingWindow']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.views, PrevalenceOverTimeProps['views']>\n>;\ntype ConfidenceIntervalMethodsMatches = Expect<\n Equals<\n typeof PrevalenceOverTimeComponent.prototype.confidenceIntervalMethods,\n PrevalenceOverTimeProps['confidenceIntervalMethods']\n >\n>;\ntype WidhtMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.width, PrevalenceOverTimeProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.height, PrevalenceOverTimeProps['height']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.lapisDateField, PrevalenceOverTimeProps['lapisDateField']>\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.pageSize, PrevalenceOverTimeProps['pageSize']>\n>;\ntype YAxisMaxLinearMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.yAxisMaxLinear, PrevalenceOverTimeProps['yAxisMaxLinear']>\n>;\ntype YAxisMaxLogarithmicMatches = Expect<\n Equals<\n typeof PrevalenceOverTimeComponent.prototype.yAxisMaxLogarithmic,\n PrevalenceOverTimeProps['yAxisMaxLogarithmic']\n >\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { Chart, type ChartConfiguration, registerables, type TooltipItem } from 'chart.js';\n\nimport { type YearMonthDayClass } from '../../utils/temporalClass';\nimport GsChart from '../components/chart';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { confidenceIntervalDataLabel } from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface RelativeGrowthAdvantageChartData {\n t: YearMonthDayClass[];\n proportion: number[];\n ciLower: number[];\n ciUpper: number[];\n observed: number[];\n params: {\n fd: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n };\n}\n\ninterface RelativeGrowthAdvantageChartProps {\n data: RelativeGrowthAdvantageChartData;\n yAxisScaleType: ScaleType;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst RelativeGrowthAdvantageChart = ({ data, yAxisScaleType, yAxisMaxConfig }: RelativeGrowthAdvantageChartProps) => {\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(Math.max(...data.proportion), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'line',\n data: {\n labels: data.t,\n datasets: datasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(),\n },\n },\n };\n\n return (\n <div className='flex h-full flex-col'>\n <RelativeGrowthAdvantageDisplay\n relativeAdvantage={data.params.fd.value}\n relativeAdvantageLowerBound={data.params.fd.ciLower}\n relativeAdvantageUpperBound={data.params.fd.ciUpper}\n />\n <div className='flex-1'>\n <GsChart configuration={config} />\n </div>\n </div>\n );\n};\n\nconst RelativeGrowthAdvantageDisplay = ({\n relativeAdvantage,\n relativeAdvantageLowerBound,\n relativeAdvantageUpperBound,\n}: {\n relativeAdvantage: number;\n relativeAdvantageLowerBound: number;\n relativeAdvantageUpperBound: number;\n}) => {\n return (\n <div class='mx-auto flex items-end flex-wrap'>\n <span class='text-[#606060]'>Relative advantage:</span>\n <div>\n <span class='text-2xl ml-3'> {formatProportion(relativeAdvantage)} </span>\n <span class='ml-2.5'>\n ({formatProportion(relativeAdvantageLowerBound)} - {formatProportion(relativeAdvantageUpperBound)})\n </span>\n </div>\n </div>\n );\n};\n\nconst datasets = (data: RelativeGrowthAdvantageChartData) => {\n return [\n {\n type: 'line' as const,\n label: 'Prevalence',\n data: data.proportion,\n borderWidth: 1,\n pointRadius: 0,\n borderColor: singleGraphColorRGBByName('indigo'),\n backgroundColor: singleGraphColorRGBByName('indigo'),\n },\n {\n type: 'line' as const,\n label: 'CI Lower',\n data: data.ciLower,\n borderWidth: 1,\n pointRadius: 0,\n fill: '+1',\n backgroundColor: singleGraphColorRGBByName('indigo', 0.3),\n },\n {\n type: 'line' as const,\n label: 'CI Upper',\n data: data.ciUpper,\n borderWidth: 1,\n pointRadius: 0,\n fill: '-1',\n backgroundColor: singleGraphColorRGBByName('indigo', 0.3),\n },\n {\n type: 'scatter' as const,\n label: 'Observed',\n data: data.observed,\n pointBackgroundColor: singleGraphColorRGBByName('green'),\n pointRadius: 2,\n },\n ];\n};\n\nconst tooltip = () => {\n return {\n mode: 'index' as const,\n intersect: false,\n filter: ({ datasetIndex }: TooltipItem<'line'>) => {\n return datasetIndex !== 1 && datasetIndex !== 2;\n },\n callbacks: {\n label: (context: TooltipItem<'line'>) => {\n switch (context.datasetIndex) {\n case 0: {\n const value = context.dataset.data[context.dataIndex];\n const ciLower = context.dataset.data[context.dataIndex + 1];\n const ciUpper = context.dataset.data[context.dataIndex + 2];\n if (typeof value !== 'number' || typeof ciLower !== 'number' || typeof ciUpper !== 'number') {\n return '';\n }\n return confidenceIntervalDataLabel(value, ciLower, ciUpper, context.dataset.label);\n }\n\n case 3: {\n const value = context.dataset.data[context.dataIndex];\n if (typeof value !== 'number') {\n return '';\n }\n return `Observed: ${value.toFixed(3)}`;\n }\n default:\n return '';\n }\n },\n },\n };\n};\n\nexport default RelativeGrowthAdvantageChart;\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { type LapisFilter } from '../types';\nimport { getMinMaxTemporal, TemporalCache, type YearMonthDayClass } from '../utils/temporalClass';\n\nexport type RelativeGrowthAdvantageData = Awaited<ReturnType<typeof queryRelativeGrowthAdvantage>>;\n\nexport async function queryRelativeGrowthAdvantage<LapisDateField extends string>(\n numerator: LapisFilter,\n denominator: LapisFilter,\n generationTime: number,\n lapis: string,\n lapisDateField: LapisDateField,\n signal?: AbortSignal,\n) {\n const fetchNumerator = new FetchAggregatedOperator<{\n [key in LapisDateField]: string | null;\n }>(numerator, [lapisDateField]);\n const fetchDenominator = new FetchAggregatedOperator<{\n [key in LapisDateField]: string | null;\n }>(denominator, [lapisDateField]);\n const mapToFixedDateKeyNumerator = new RenameFieldOperator(fetchNumerator, lapisDateField, 'date');\n const mapToFixedDateKeyDenominator = new RenameFieldOperator(fetchDenominator, lapisDateField, 'date');\n const mapNumerator = new MapOperator(mapToFixedDateKeyNumerator, toYearMonthDay);\n const mapDenominator = new MapOperator(mapToFixedDateKeyDenominator, toYearMonthDay);\n const [numeratorData, denominatorData] = await Promise.all([\n mapNumerator.evaluate(lapis, signal),\n mapDenominator.evaluate(lapis, signal),\n ]);\n const { min: minDate, max: maxDate } = getMinMaxTemporal(denominatorData.content.map((d) => d.date));\n if (!minDate && !maxDate) {\n return null;\n }\n\n const numeratorCounts = new Map<YearMonthDayClass, number>();\n numeratorData.content.forEach((d) => {\n if (d.date) {\n numeratorCounts.set(d.date, d.count);\n }\n });\n const denominatorCounts = new Map<YearMonthDayClass, number>();\n const requestData = {\n t: [] as number[],\n n: [] as number[],\n k: [] as number[],\n };\n denominatorData.content.forEach((d) => {\n if (d.date) {\n denominatorCounts.set(d.date, d.count);\n const t = d.date.minus(minDate);\n requestData.t.push(t);\n requestData.n.push(d.count);\n requestData.k.push(numeratorCounts.get(d.date) ?? 0);\n }\n });\n const requestPayload = {\n config: {\n alpha: 0.95,\n generationTime,\n initialCasesVariant: 1,\n initialCasesWildtype: 1,\n reproductionNumberWildtype: 1,\n tStart: 0,\n tEnd: maxDate.minus(minDate),\n },\n data: requestData,\n };\n const response = await fetch('https://cov-spectrum.org/api/v2/computed/model/chen2021Fitness', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestPayload),\n signal,\n });\n const responseData = (await response.json()) as {\n estimatedAbsoluteNumbers: {\n t: number[];\n variantCases: number[];\n wildtypeCases: number[];\n };\n estimatedProportions: {\n t: number[];\n proportion: number[];\n ciLower: number[];\n ciUpper: number[];\n };\n params: {\n a: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n fc: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n fd: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n t0: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n };\n };\n const transformed = {\n ...responseData,\n estimatedProportions: {\n ...responseData.estimatedProportions,\n t: responseData.estimatedProportions.t.map((t) => minDate.addDays(t)),\n },\n };\n const observedProportions = transformed.estimatedProportions.t.map(\n (t) => (numeratorCounts.get(t) ?? 0) / (denominatorCounts.get(t) ?? 0),\n );\n\n return {\n ...transformed,\n observedProportions,\n };\n}\n\nfunction toYearMonthDay(d: { date: string | null; count: number }) {\n const temporalCache = TemporalCache.getInstance();\n return {\n date: d.date ? temporalCache.getYearMonthDay(d.date) : null,\n count: d.count,\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport RelativeGrowthAdvantageChart from './relative-growth-advantage-chart';\nimport {\n queryRelativeGrowthAdvantage,\n type RelativeGrowthAdvantageData,\n} from '../../query/queryRelativeGrowthAdvantage';\nimport { type LapisFilter } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoHeadline2, InfoLink, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport { type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { type ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'line';\n\nexport interface RelativeGrowthAdvantageProps {\n width: string;\n height: string;\n numeratorFilter: LapisFilter;\n denominatorFilter: LapisFilter;\n generationTime: number;\n views: View[];\n lapisDateField: string;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nexport const RelativeGrowthAdvantage: FunctionComponent<RelativeGrowthAdvantageProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <RelativeGrowthAdvantageInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const RelativeGrowthAdvantageInner: FunctionComponent<RelativeGrowthAdvantageProps> = (componentProps) => {\n const lapis = useContext(LapisUrlContext);\n const { numeratorFilter, denominatorFilter, generationTime, lapisDateField } = componentProps;\n\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n\n const { data, error, isLoading } = useQuery(\n () => queryRelativeGrowthAdvantage(numeratorFilter, denominatorFilter, generationTime, lapis, lapisDateField),\n [lapis, numeratorFilter, denominatorFilter, generationTime, lapisDateField],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return (\n <RelativeGrowthAdvantageTabs\n data={data}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n originalComponentProps={componentProps}\n />\n );\n};\n\ntype RelativeGrowthAdvantageTabsProps = {\n data: NonNullable<RelativeGrowthAdvantageData>;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n originalComponentProps: RelativeGrowthAdvantageProps;\n};\n\nconst RelativeGrowthAdvantageTabs: FunctionComponent<RelativeGrowthAdvantageTabsProps> = ({\n data,\n yAxisScaleType,\n setYAxisScaleType,\n originalComponentProps,\n}) => {\n const getTab = (view: View) => {\n switch (view) {\n case 'line':\n return {\n title: 'Line',\n content: (\n <RelativeGrowthAdvantageChart\n data={{\n ...data.estimatedProportions,\n observed: data.observedProportions,\n params: data.params,\n }}\n yAxisScaleType={yAxisScaleType}\n yAxisMaxConfig={originalComponentProps.yAxisMaxConfig}\n />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n const toolbar = () => (\n <RelativeGrowthAdvantageToolbar\n originalComponentProps={originalComponentProps}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype RelativeGrowthAdvantageToolbarProps = {\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n originalComponentProps: RelativeGrowthAdvantageProps;\n};\n\nconst RelativeGrowthAdvantageToolbar: FunctionComponent<RelativeGrowthAdvantageToolbarProps> = ({\n yAxisScaleType,\n setYAxisScaleType,\n originalComponentProps,\n}) => {\n return (\n <>\n <ScalingSelector yAxisScaleType={yAxisScaleType} setYAxisScaleType={setYAxisScaleType} />\n <RelativeGrowthAdvantageInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\nconst RelativeGrowthAdvantageInfo: FunctionComponent<{ originalComponentProps: RelativeGrowthAdvantageProps }> = ({\n originalComponentProps,\n}) => {\n const lapis = useContext(LapisUrlContext);\n const generationTime = originalComponentProps.generationTime;\n\n return (\n <Info>\n <InfoHeadline1>Relative growth advantage</InfoHeadline1>\n <InfoParagraph>\n If variants spread pre-dominantly by local transmission across demographic groups, this estimate\n reflects the relative viral intrinsic growth advantage of the focal variant in the selected country and\n time frame. We report the relative growth advantage per {generationTime} days (in percentage; 0% means\n equal growth). Importantly, the relative growth advantage estimate reflects the advantage compared to\n the co-circulating variants. Thus, as new variants spread, the advantage of the focal variant may\n decrease. Different mechanisms can alter the intrinsic growth rate, including an intrinsic transmission\n advantage, immune evasion, and a prolonged infectious period. When absolute numbers of a variant are\n low, the growth advantage may merely reflect the current importance of introductions from abroad or the\n variant spreading in a particular demographic group. In this case, the estimate does not provide\n information on any intrinsic fitness advantages.\n </InfoParagraph>\n <InfoParagraph>\n Example: Assume that 10 infections from the focal variant and 100 infections from the co-circulating\n variants occur today and that the focal variant has a relative growth advantage of 50%. Then, if the\n number of new infections from the co-circulating variants remains at 100 in {generationTime} days from\n today, we expect the number of new infections from the focal variant to be 15.\n </InfoParagraph>\n\n <InfoHeadline2>Reference</InfoHeadline2>\n <InfoParagraph>\n Chen, Chaoran, et al. \"Quantification of the spread of SARS-CoV-2 variant B.1.1.7 in Switzerland.\"\n Epidemics (2021); doi:{' '}\n <InfoLink href='https://www.sciencedirect.com/science/article/pii/S1755436521000335?via=ihub'>\n 10.1016/j.epidem.2021.100480\n </InfoLink>\n </InfoParagraph>\n <InfoComponentCode\n componentName='relative-growth-advantage'\n params={originalComponentProps}\n lapisUrl={lapis}\n />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport {\n RelativeGrowthAdvantage,\n type RelativeGrowthAdvantageProps,\n} from '../../preact/relativeGrowthAdvantage/relative-growth-advantage';\nimport { type AxisMax } from '../../preact/shared/charts/getYAxisMax';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n *\n * For this component, we assume a discrete time model, where new infections happen exactly every `generationTime` days.\n * This is what we call a \"generation\".\n *\n * This component estimates the relative growth advantage of a variant (defined by its LAPIS filter) by performing a logistic regression.\n * Based on the inferred logistic growth rate, we derive the relative growth advantage (per generation).\n *\n * For details on the scientific method, see:\n * Chen, Chaoran, et al. \"Quantification of the spread of SARS-CoV-2 variant B.1.1.7 in Switzerland.\" Epidemics (2021);\n * doi: [10.1016/j.epidem.2021.100480](https://doi.org/10.1016/j.epidem.2021.100480)\n *\n * This component fetches aggregated data from LAPIS.\n * Then the data is sent to `https://cov-spectrum.org/api/v2/computed/model/chen2021Fitness`\n * which performs the logistic regression and calculates the relative growth advantage.\n *\n * ## Views\n *\n * ### Line View\n *\n * The line view shows the relative growth advantage over time in a line chart.\n * The dots in the plot show the proportions of the focal variant (defined by the `numeratorFilter`) to the baseline variant (defined by the `denominatorFilter`)\n * for every day as observed in the data.\n * The line shows a logistic curve fitted to the data points, including a 95% confidence interval.\n */\n@customElement('gs-relative-growth-advantage')\nexport class RelativeGrowthAdvantageComponent extends PreactLitAdapter {\n /**\n * Required.\n *\n * LAPIS filter to select the data of the focal variant.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n numeratorFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * Required.\n *\n * LAPIS filter to select the data of the baseline variant.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n denominatorFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The generation time represents the number of days over which the variant's relative growth advantage is measured.\n * For example, if we set a generation time of 7 days, then we estimate the growth advantage per week.\n */\n @property({ type: Number })\n generationTime: number = 7;\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: 'line'[] = ['line'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n /**\n * The maximum value for the y-axis on all graphs in linear view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLinear: 'maxInData' | 'limitTo1' | number = 1;\n\n /**\n * The maximum value for the y-axis on all graphs in logarithmic view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLogarithmic: 'maxInData' | 'limitTo1' | number = 1;\n\n override render() {\n return (\n <RelativeGrowthAdvantage\n numeratorFilter={this.numeratorFilter}\n denominatorFilter={this.denominatorFilter}\n generationTime={this.generationTime}\n views={this.views}\n width={this.width}\n height={this.height}\n lapisDateField={this.lapisDateField}\n yAxisMaxConfig={{\n linear: this.yAxisMaxLinear,\n logarithmic: this.yAxisMaxLogarithmic,\n }}\n />\n );\n }\n}\n\nexport interface RelativeGrowthAdvantageComponentProps extends Omit<RelativeGrowthAdvantageProps, 'yAxisMaxConfig'> {\n yAxisMaxLinear?: AxisMax;\n yAxisMaxLogarithmic?: AxisMax;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-relative-growth-advantage': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype NumeratorMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.numeratorFilter,\n RelativeGrowthAdvantageProps['numeratorFilter']\n >\n>;\ntype DenominatorMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.denominatorFilter,\n RelativeGrowthAdvantageProps['denominatorFilter']\n >\n>;\ntype GenerationTimeMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.generationTime,\n RelativeGrowthAdvantageProps['generationTime']\n >\n>;\ntype ViewsMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.views, RelativeGrowthAdvantageProps['views']>\n>;\ntype WidthMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.width, RelativeGrowthAdvantageProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.height, RelativeGrowthAdvantageProps['height']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.lapisDateField,\n RelativeGrowthAdvantageProps['lapisDateField']\n >\n>;\ntype YAxisMaxLinearMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.yAxisMaxLinear,\n Required<RelativeGrowthAdvantageProps['yAxisMaxConfig']>['linear']\n >\n>;\ntype YAxisMaxLogarithmicMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.yAxisMaxLogarithmic,\n Required<RelativeGrowthAdvantageProps['yAxisMaxConfig']>['logarithmic']\n >\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type InitialSort } from '../preact/aggregatedData/aggregate';\nimport { type LapisFilter } from '../types';\n\nexport type AggregateData = (Record<string, string | null | number | boolean> & {\n count: number;\n proportion: number;\n})[];\n\nexport const compareAscending = (a: string | null | number, b: string | null | number) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n\n const strA = a != null ? String(a) : '';\n const strB = b != null ? String(b) : '';\n\n return strA.localeCompare(strB);\n};\n\nexport async function queryAggregateData(\n lapisFilter: LapisFilter,\n fields: string[],\n lapis: string,\n initialSort: InitialSort = { field: 'count', direction: 'descending' },\n signal?: AbortSignal,\n) {\n const validSortFields = ['count', 'proportion', ...fields];\n if (!validSortFields.includes(initialSort.field)) {\n throw new Error(`InitialSort field not in fields. Valid fields are: ${validSortFields.join(', ')}`);\n }\n\n const fetchData = new FetchAggregatedOperator<Record<string, string | null | number>>(lapisFilter, fields);\n const sortData = new SortOperator(fetchData, (a, b) => {\n return initialSort.direction === 'ascending'\n ? compareAscending(a[initialSort.field], b[initialSort.field])\n : compareAscending(b[initialSort.field], a[initialSort.field]);\n });\n const data = (await sortData.evaluate(lapis, signal)).content;\n\n const total = data.reduce((acc, row) => acc + row.count, 0);\n\n return data.map(\n (row) =>\n ({\n ...row,\n proportion: row.count / total,\n }) as Record<string, string | null | number | boolean> & {\n count: number;\n proportion: number;\n },\n );\n}\n","import { type FunctionComponent } from 'preact';\n\nimport { type AggregateData, compareAscending } from '../../query/queryAggregateData';\nimport { Table } from '../components/table';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ntype AggregateTableProps = {\n fields: string[];\n data: AggregateData;\n pageSize: boolean | number;\n};\n\nexport const AggregateTable: FunctionComponent<AggregateTableProps> = ({ data, fields, pageSize }) => {\n const headers = [\n ...fields.map((field) => {\n return {\n name: field,\n sort: {\n compare: compareAscending,\n },\n };\n }),\n {\n name: 'count',\n sort: true,\n },\n {\n name: 'proportion',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n ];\n\n return <Table data={data} columns={headers} pageSize={pageSize} />;\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\n\nimport { AggregateTable } from './aggregate-table';\nimport { type AggregateData, queryAggregateData } from '../../query/queryAggregateData';\nimport { type LapisFilter } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'table';\nexport type InitialSort = { field: string; direction: 'ascending' | 'descending' };\n\nexport type AggregateProps = {\n width: string;\n height: string;\n filter: LapisFilter;\n fields: string[];\n views: View[];\n initialSortField: string;\n initialSortDirection: 'ascending' | 'descending';\n pageSize: boolean | number;\n};\n\nexport const Aggregate: FunctionComponent<AggregateProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <AggregateInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const AggregateInner: FunctionComponent<AggregateProps> = (componentProps) => {\n const { fields, filter, initialSortField, initialSortDirection } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryAggregateData(filter, fields, lapis, { field: initialSortField, direction: initialSortDirection });\n }, [filter, fields, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <AggregatedDataTabs data={data} originalComponentProps={componentProps} />;\n};\n\ntype AggregatedDataTabsProps = {\n data: AggregateData;\n originalComponentProps: AggregateProps;\n};\n\nconst AggregatedDataTabs: FunctionComponent<AggregatedDataTabsProps> = ({ data, originalComponentProps }) => {\n const getTab = (view: View) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: (\n <AggregateTable\n data={data}\n fields={originalComponentProps.fields}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n return <Tabs tabs={tabs} toolbar={<Toolbar data={data} originalComponentProps={originalComponentProps} />} />;\n};\n\ntype ToolbarProps = {\n data: AggregateData;\n originalComponentProps: AggregateProps;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({ data, originalComponentProps }) => {\n return (\n <div class='flex flex-row'>\n <CsvDownloadButton className='mx-1 btn btn-xs' getData={() => data} filename='aggregate.csv' />\n <AggregateInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </div>\n );\n};\n\ntype AggregateInfoProps = {\n originalComponentProps: AggregateProps;\n};\n\nconst AggregateInfo: FunctionComponent<AggregateInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Aggregated data</InfoHeadline1>\n <InfoParagraph>\n This table shows the number and proportion of sequences stratified by the following fields:{' '}\n {originalComponentProps.fields.join(', ')}. The proportion is calculated with respect to the total count\n within the filtered dataset.\n </InfoParagraph>\n <InfoComponentCode componentName='aggregate' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { Aggregate, type AggregateProps, type View } from '../../preact/aggregatedData/aggregate';\nimport { type LapisFilter } from '../../types';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays aggregated data in a table, which can provide an overview of the underlying data.\n *\n * It expects a list of `fields` to aggregate by and a `filter` to apply to the data.\n *\n * ## Views\n *\n * ### Table View\n *\n * In the table view, the data is presented in a table format where each field is a column,\n * along with the aggregated value and its proportion.\n * The proportion represents the ratio of the aggregated value to the total count of the data\n * (considering the applied filter).\n */\n@customElement('gs-aggregate')\nexport class AggregateComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * The fields to aggregate by.\n * Every field will be a table column.\n * Every field must exist in the backing LAPIS instance.\n *\n * If left empty, the component will only show the absolute count of the provided `filter` and proportion `100%`.\n */\n @property({ type: Array })\n fields: string[] = [];\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: View[] = ['table'];\n\n /**\n * The filter to apply to the data.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n filter: LapisFilter = {};\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The field by which the table is initially sorted.\n * Must be one of the fields specified in the fields property, 'count', or 'proportion'.\n */\n @property({ type: String })\n initialSortField: string = 'count';\n\n /**\n * The initial sort direction of the table.\n */\n @property({ type: String })\n initialSortDirection: 'ascending' | 'descending' = 'descending';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <Aggregate\n fields={this.fields}\n views={this.views}\n filter={this.filter}\n width={this.width}\n height={this.height}\n initialSortField={this.initialSortField}\n initialSortDirection={this.initialSortDirection}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-aggregate-component': AggregateComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-aggregate-component': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype FieldsMatches = Expect<Equals<typeof AggregateComponent.prototype.fields, AggregateProps['fields']>>;\ntype ViewsMatches = Expect<Equals<typeof AggregateComponent.prototype.views, AggregateProps['views']>>;\ntype FilterMatches = Expect<Equals<typeof AggregateComponent.prototype.filter, AggregateProps['filter']>>;\ntype WidthMatches = Expect<Equals<typeof AggregateComponent.prototype.width, AggregateProps['width']>>;\ntype HeightMatches = Expect<Equals<typeof AggregateComponent.prototype.height, AggregateProps['height']>>;\ntype InitialSortFieldMatches = Expect<\n Equals<typeof AggregateComponent.prototype.initialSortField, AggregateProps['initialSortField']>\n>;\ntype InitialSortDirectionMatches = Expect<\n Equals<typeof AggregateComponent.prototype.initialSortDirection, AggregateProps['initialSortDirection']>\n>;\ntype PageSizeMatches = Expect<Equals<typeof AggregateComponent.prototype.pageSize, AggregateProps['pageSize']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import type { NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport { generateAllInRange, getMinMaxTemporal, type TemporalClass } from '../../utils/temporalClass';\n\ntype TableRow<DateRangeKey extends string> = { [K in DateRangeKey]: string } & { [key: string]: number };\n\nexport const getNumberOfSequencesOverTimeTableData = <DateRangeKey extends string>(\n data: NumberOfSequencesDatasets,\n dateRangeKey: DateRangeKey,\n) => {\n const datasetsWithCountByDate = data.map(({ displayName, content }) => ({\n displayName,\n content: new Map(content.map((datum) => [datum.dateRange?.toString(), datum])),\n }));\n\n const allDateRangesThatOccurInData = datasetsWithCountByDate\n .map(({ content }) => [...content.values()].map((datum) => datum.dateRange))\n .reduce((acc, keys) => new Set([...acc, ...keys]), new Set<TemporalClass | null>());\n\n const minMax = getMinMaxTemporal(allDateRangesThatOccurInData);\n if (minMax === null) {\n return [];\n }\n\n const allDateRanges: (TemporalClass | null)[] = generateAllInRange(minMax.min, minMax.max);\n\n if (allDateRangesThatOccurInData.has(null)) {\n allDateRanges.unshift(null);\n }\n\n return allDateRanges.map((dateRange) => {\n return datasetsWithCountByDate.reduce(\n (acc, dataset) => ({\n ...acc,\n [dataset.displayName]: dataset.content.get(dateRange?.toString())?.count ?? 0,\n }),\n { [dateRangeKey]: dateRange?.toString() ?? 'Unknown' } as TableRow<DateRangeKey>,\n );\n });\n};\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables } from 'chart.js';\nimport { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport GsChart from '../components/chart';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface NumberSequencesOverBarChartProps {\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n}\n\nChart.register(...registerables);\n\nexport const NumberSequencesOverTimeBarChart = ({ data, yAxisScaleType }: NumberSequencesOverBarChartProps) => {\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'bar',\n data: {\n datasets: getDatasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: {\n type: getYAxisScale(yAxisScaleType).type,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n },\n },\n },\n }),\n [data, yAxisScaleType],\n );\n\n return <GsChart configuration={config} />;\n};\n\nconst getDatasets = (data: NumberOfSequencesDatasets) => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, 'date');\n\n return data.map(\n ({ displayName }, index) =>\n ({\n borderWidth: 1,\n label: displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: tableData.map((row) => ({\n x: row.date,\n y: row[displayName],\n })),\n }) as ChartDataset<'bar', { x: string; y: number }[]>,\n );\n};\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables } from 'chart.js';\nimport { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport GsChart from '../components/chart';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface NumberSequencesOverBarChartProps {\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n}\n\nChart.register(...registerables);\n\nexport const NumberSequencesOverTimeLineChart = ({ data, yAxisScaleType }: NumberSequencesOverBarChartProps) => {\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'line',\n data: {\n datasets: getDatasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: {\n type: getYAxisScale(yAxisScaleType).type,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n },\n },\n },\n }),\n [data, yAxisScaleType],\n );\n\n return <GsChart configuration={config} />;\n};\n\nconst getDatasets = (data: NumberOfSequencesDatasets) => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, 'date');\n\n return data.map(\n ({ displayName }, index) =>\n ({\n borderWidth: 1,\n pointRadius: 0,\n label: displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: tableData.map((row) => ({\n x: row.date,\n y: row[displayName],\n })),\n }) as ChartDataset<'line', { x: string; y: number }[]>,\n );\n};\n","import { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport { type TemporalGranularity } from '../../types';\nimport { Table } from '../components/table';\n\ninterface NumberSequencesOverTimeTableProps {\n data: NumberOfSequencesDatasets;\n granularity: TemporalGranularity;\n pageSize: boolean | number;\n}\n\nexport const NumberSequencesOverTimeTable = ({ data, granularity, pageSize }: NumberSequencesOverTimeTableProps) => {\n const columns = [\n {\n name: granularity,\n sort: true,\n },\n ...data.map((dataset) => ({\n name: dataset.displayName,\n sort: true,\n })),\n ];\n\n const flatTableData = useMemo(() => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, granularity);\n return Object.values(tableData).map((row) => Object.values(row));\n }, [data, granularity]);\n\n return <Table data={flatTableData} columns={columns} pageSize={pageSize} />;\n};\n","import { queryAggregatedDataOverTime } from './queryAggregatedDataOverTime';\nimport { type NamedLapisFilter, type TemporalGranularity } from '../types';\nimport { sortNullToBeginningThenByDate } from '../utils/sort';\nimport { makeArray } from '../utils/utils';\n\nexport type NumberOfSequencesDatasets = Awaited<ReturnType<typeof queryNumberOfSequencesOverTime>>;\n\nexport async function queryNumberOfSequencesOverTime(\n lapis: string,\n lapisFilter: NamedLapisFilter | NamedLapisFilter[],\n lapisDateField: string,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n) {\n const lapisFilters = makeArray(lapisFilter);\n\n const queries = lapisFilters.map(async ({ displayName, lapisFilter }) => {\n const { content } = await queryAggregatedDataOverTime(\n lapisFilter,\n granularity,\n smoothingWindow,\n lapisDateField,\n ).evaluate(lapis);\n\n return {\n displayName,\n content: content.sort(sortNullToBeginningThenByDate),\n };\n });\n\n return Promise.all(queries);\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { NumberSequencesOverTimeBarChart } from './number-sequences-over-time-bar-chart';\nimport { NumberSequencesOverTimeLineChart } from './number-sequences-over-time-line-chart';\nimport { NumberSequencesOverTimeTable } from './number-sequences-over-time-table';\nimport {\n type NumberOfSequencesDatasets,\n queryNumberOfSequencesOverTime,\n} from '../../query/queryNumberOfSequencesOverTime';\nimport type { NamedLapisFilter, TemporalGranularity } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\ntype NumberSequencesOverTimeView = 'bar' | 'line' | 'table';\n\nexport interface NumberSequencesOverTimeProps {\n width: string;\n height: string;\n lapisFilter: NamedLapisFilter | NamedLapisFilter[];\n lapisDateField: string;\n views: NumberSequencesOverTimeView[];\n granularity: TemporalGranularity;\n smoothingWindow: number;\n pageSize: boolean | number;\n}\n\nexport const NumberSequencesOverTime = (componentProps: NumberSequencesOverTimeProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <NumberSequencesOverTimeInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst NumberSequencesOverTimeInner = (componentProps: NumberSequencesOverTimeProps) => {\n const { lapisFilter, lapisDateField, granularity, smoothingWindow } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(\n () => queryNumberOfSequencesOverTime(lapis, lapisFilter, lapisDateField, granularity, smoothingWindow),\n [lapis, lapisFilter, lapisDateField, granularity, smoothingWindow],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <NumberSequencesOverTimeTabs data={data} originalComponentProps={componentProps} />;\n};\n\ninterface NumberSequencesOverTimeTabsProps {\n data: NumberOfSequencesDatasets;\n originalComponentProps: NumberSequencesOverTimeProps;\n}\n\nconst NumberSequencesOverTimeTabs = ({ data, originalComponentProps }: NumberSequencesOverTimeTabsProps) => {\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n\n const getTab = (view: NumberSequencesOverTimeView) => {\n switch (view) {\n case 'bar':\n return {\n title: 'Bar',\n content: <NumberSequencesOverTimeBarChart data={data} yAxisScaleType={yAxisScaleType} />,\n };\n case 'line':\n return {\n title: 'Line',\n content: <NumberSequencesOverTimeLineChart data={data} yAxisScaleType={yAxisScaleType} />,\n };\n case 'table':\n return {\n title: 'Table',\n content: (\n <NumberSequencesOverTimeTable\n data={data}\n granularity={originalComponentProps.granularity}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n default:\n throw new Error(`Unknown view: ${view}`);\n }\n };\n\n return (\n <Tabs\n tabs={originalComponentProps.views.map((view) => getTab(view))}\n toolbar={(activeTab) => (\n <Toolbar\n activeTab={activeTab}\n data={data}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n originalComponentProps={originalComponentProps}\n />\n )}\n />\n );\n};\n\ninterface ToolbarProps {\n activeTab: string;\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n originalComponentProps: NumberSequencesOverTimeProps;\n}\n\nconst Toolbar = ({ activeTab, data, yAxisScaleType, setYAxisScaleType, originalComponentProps }: ToolbarProps) => {\n return (\n <>\n {activeTab !== 'Table' && (\n <ScalingSelector\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n enabledTypes={['linear', 'logarithmic']}\n />\n )}\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getNumberOfSequencesOverTimeTableData(data, originalComponentProps.granularity)}\n filename='number_of_sequences_over_time.csv'\n />\n <NumberSequencesOverTimeInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype NumberSequencesOverTimeInfoProps = {\n originalComponentProps: NumberSequencesOverTimeProps;\n};\n\nconst NumberSequencesOverTimeInfo: FunctionComponent<NumberSequencesOverTimeInfoProps> = ({\n originalComponentProps,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n return (\n <Info>\n <InfoHeadline1>Number of sequences over time</InfoHeadline1>\n <InfoParagraph>\n This presents the number of available sequences of a variant per{' '}\n <b>{originalComponentProps.granularity}</b>\n {originalComponentProps.smoothingWindow > 0 &&\n `, smoothed using a ${originalComponentProps.smoothingWindow}-${originalComponentProps.granularity} sliding window`}\n .\n </InfoParagraph>\n <InfoComponentCode\n componentName='number-sequences-over-time'\n params={originalComponentProps}\n lapisUrl={lapis}\n />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport {\n NumberSequencesOverTime,\n type NumberSequencesOverTimeProps,\n} from '../../preact/numberSequencesOverTime/number-sequences-over-time';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays the number of sequences over time of one or more datasets,\n * selected by LAPIS filters.\n *\n * In the chart views, the user can select the y-axis scale (linear, logistic).\n * The x-axis shows all available time intervals available in the datasets in the selected `granularity`.\n * Thus, the `lapisFilter` implicitly also defines the range that is shown on the x-axis.\n * If you want to restrict the x-axis to a smaller date range,\n * then you need to set appropriate filter values in the `lapisFilter`.\n */\n@customElement('gs-number-sequences-over-time')\nexport class NumberSequencesOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * Required.\n *\n * Either a LAPIS filter or an array of LAPIS filters to fetch the number of sequences for.\n *\n * The `lapisFilter` will be sent as is to LAPIS to select the data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used to label the component views.\n * It should be human-readable.\n *\n */ @property({type: Object})\n lapisFilter:\n {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }\n | {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }[]= { displayName: '', lapisFilter: {} };\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('bar' | 'line' | 'table')[] = ['bar', 'line', 'table'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'day';\n\n /**\n * The number of time steps to use for smoothing the data.\n * `0` means no smoothing.\n * Must be a non-negative integer.\n *\n * For a given time, the shown value is the mean of the neighbouring measured values.\n * The `smoothingWindow` value provides the number of neighbouring values to take into account.\n * The resulting time is computed via `Math.floor(smoothingWindow / 2)`.\n */\n @property({ type: Number })\n smoothingWindow: number = 0;\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <NumberSequencesOverTime\n lapisFilter={this.lapisFilter}\n lapisDateField={this.lapisDateField}\n views={this.views}\n width={this.width}\n height={this.height}\n granularity={this.granularity}\n smoothingWindow={this.smoothingWindow}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-number-sequences-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.lapisFilter, NumberSequencesOverTimeProps['lapisFilter']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<\n typeof NumberSequencesOverTimeComponent.prototype.lapisDateField,\n NumberSequencesOverTimeProps['lapisDateField']\n >\n>;\ntype ViewsMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.views, NumberSequencesOverTimeProps['views']>\n>;\ntype WidhtMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.width, NumberSequencesOverTimeProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.height, NumberSequencesOverTimeProps['height']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.granularity, NumberSequencesOverTimeProps['granularity']>\n>;\ntype SmoothingWindowMatches = Expect<\n Equals<\n typeof NumberSequencesOverTimeComponent.prototype.smoothingWindow,\n NumberSequencesOverTimeProps['smoothingWindow']\n >\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.pageSize, NumberSequencesOverTimeProps['pageSize']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { mapDateToGranularityRange } from './queryAggregatedDataOverTime';\nimport { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { FetchSubstitutionsOrDeletionsOperator } from '../operator/FetchSubstitutionsOrDeletionsOperator';\nimport { GroupByAndSumOperator } from '../operator/GroupByAndSumOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { UserFacingError } from '../preact/components/error-display';\nimport { BaseMutationOverTimeDataMap } from '../preact/mutationsOverTime/MutationOverTimeData';\nimport { sortSubstitutionsAndDeletions } from '../preact/shared/sort/sortSubstitutionsAndDeletions';\nimport {\n type DeletionEntry,\n type LapisFilter,\n type SequenceType,\n type SubstitutionEntry,\n type SubstitutionOrDeletionEntry,\n type TemporalGranularity,\n} from '../types';\nimport { type Map2d } from '../utils/map2d';\nimport {\n type Deletion,\n type DeletionClass,\n type Substitution,\n type SubstitutionClass,\n toSubstitutionOrDeletion,\n} from '../utils/mutations';\nimport {\n compareTemporal,\n dateRangeCompare,\n generateAllInRange,\n getMinMaxTemporal,\n parseDateStringToTemporal,\n type Temporal,\n type TemporalClass,\n toTemporal,\n} from '../utils/temporalClass';\n\nexport type MutationOverTimeData = {\n date: TemporalClass;\n mutations: SubstitutionOrDeletionEntry[];\n totalCount: number;\n};\n\nexport type MutationOverTimeMutationValue = { proportion: number; count: number; totalCount: number };\nexport type MutationOverTimeDataGroupedByMutation = Map2d<\n SubstitutionClass | DeletionClass,\n TemporalClass,\n MutationOverTimeMutationValue\n>;\n\nconst MAX_NUMBER_OF_GRID_COLUMNS = 200;\n\nexport async function queryOverallMutationData({\n lapisFilter,\n sequenceType,\n lapis,\n granularity,\n lapisDateField,\n signal,\n}: {\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n lapis: string;\n granularity: TemporalGranularity;\n lapisDateField: string;\n signal?: AbortSignal;\n}) {\n const allDates = await getDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);\n\n if (allDates.length === 0) {\n return {\n content: [],\n };\n }\n\n const filter = {\n ...lapisFilter,\n [`${lapisDateField}From`]: allDates[0].firstDay.toString(),\n [`${lapisDateField}To`]: allDates[allDates.length - 1].lastDay.toString(),\n };\n\n return fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType).evaluate(lapis, signal);\n}\n\nexport type MutationOverTimeQuery = {\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n lapis: string;\n lapisDateField: string;\n granularity: TemporalGranularity;\n signal?: AbortSignal;\n};\n\nexport async function queryMutationsOverTimeData({\n lapisFilter,\n sequenceType,\n lapis,\n lapisDateField,\n granularity,\n signal,\n}: MutationOverTimeQuery) {\n const allDates = await getDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);\n\n if (allDates.length > MAX_NUMBER_OF_GRID_COLUMNS) {\n throw new UserFacingError(\n 'Too many dates',\n `The dataset would contain ${allDates.length} date intervals. ` +\n `Please reduce the number to below ${MAX_NUMBER_OF_GRID_COLUMNS} to display the data. ` +\n 'You can achieve this by either narrowing the date range in the provided LAPIS filter or by selecting a larger granularity.',\n );\n }\n\n const subQueries = allDates.map(async (date) => {\n const dateFrom = date.firstDay.toString();\n const dateTo = date.lastDay.toString();\n\n const filter = {\n ...lapisFilter,\n [`${lapisDateField}From`]: dateFrom,\n [`${lapisDateField}To`]: dateTo,\n };\n\n const data = await fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType).evaluate(lapis, signal);\n const totalCountQuery = await getTotalNumberOfSequencesInDateRange(filter).evaluate(lapis, signal);\n return {\n date,\n mutations: data.content,\n totalCount: totalCountQuery.content[0].count,\n };\n });\n\n const data = await Promise.all(subQueries);\n\n const overallMutationsData = (\n await queryOverallMutationData({\n lapisFilter,\n sequenceType,\n lapis,\n lapisDateField,\n granularity,\n })\n ).content;\n\n return {\n mutationOverTimeData: groupByMutation(data, overallMutationsData),\n overallMutationData: overallMutationsData,\n };\n}\n\nasync function getDatesInDataset(\n lapisFilter: LapisFilter,\n lapis: string,\n granularity: TemporalGranularity,\n lapisDateField: string,\n signal: AbortSignal | undefined,\n) {\n const { content: availableDates } = await queryAvailableDates(\n lapisFilter,\n lapis,\n granularity,\n lapisDateField,\n signal,\n );\n\n const { dateFrom, dateTo } = getDateRangeFromFilter(lapisFilter, lapisDateField, granularity);\n const { min, max } = getMinMaxTemporal(availableDates);\n\n return generateAllInRange(dateFrom ?? min, dateTo ?? max);\n}\n\nfunction getDateRangeFromFilter(lapisFilter: LapisFilter, lapisDateField: string, granularity: TemporalGranularity) {\n const valueFromFilter = lapisFilter[lapisDateField] as string | null;\n\n if (valueFromFilter) {\n return {\n dateFrom: parseDateStringToTemporal(valueFromFilter, granularity),\n dateTo: parseDateStringToTemporal(valueFromFilter, granularity),\n };\n }\n\n const minFromFilter = lapisFilter[`${lapisDateField}From`] as string | null;\n const maxFromFilter = lapisFilter[`${lapisDateField}To`] as string | null;\n\n return {\n dateFrom: minFromFilter ? parseDateStringToTemporal(minFromFilter, granularity) : null,\n dateTo: maxFromFilter ? parseDateStringToTemporal(maxFromFilter, granularity) : null,\n };\n}\n\nfunction queryAvailableDates(\n lapisFilter: LapisFilter,\n lapis: string,\n granularity: TemporalGranularity,\n lapisDateField: string,\n signal?: AbortSignal,\n) {\n return fetchAndPrepareDates(lapisFilter, granularity, lapisDateField).evaluate(lapis, signal);\n}\n\nfunction fetchAndPrepareDates<LapisDateField extends string>(\n filter: LapisFilter,\n granularity: TemporalGranularity,\n lapisDateField: LapisDateField,\n) {\n const fetchData = new FetchAggregatedOperator<{ [key in LapisDateField]: string | null }>(filter, [lapisDateField]);\n const dataWithFixedDateKey = new RenameFieldOperator(fetchData, lapisDateField, 'date');\n const mapData = new MapOperator(dataWithFixedDateKey, (data) => mapDateToGranularityRange(data, granularity));\n const groupByData = new GroupByAndSumOperator(mapData, 'dateRange', 'count');\n const sortData = new SortOperator(groupByData, dateRangeCompare);\n return new MapOperator(sortData, (data) => data.dateRange);\n}\n\nfunction fetchAndPrepareSubstitutionsOrDeletions(filter: LapisFilter, sequenceType: SequenceType) {\n return new FetchSubstitutionsOrDeletionsOperator(filter, sequenceType, 0.001);\n}\n\nexport function serializeSubstitutionOrDeletion(mutation: Substitution | Deletion) {\n return mutation.code;\n}\n\nexport function serializeTemporal(date: Temporal) {\n return date.dateString;\n}\n\nexport function groupByMutation(\n data: MutationOverTimeData[],\n overallMutationData: (SubstitutionEntry | DeletionEntry)[],\n) {\n const dataArray = new BaseMutationOverTimeDataMap();\n\n const allDates = data.map((mutationData) => mutationData.date);\n\n const sortedOverallMutationData = overallMutationData\n .sort((a, b) => sortSubstitutionsAndDeletions(a.mutation, b.mutation))\n .map((entry) => {\n return toSubstitutionOrDeletion(entry.mutation);\n });\n const sortedDates = allDates.sort((a, b) => compareTemporal(a, b)).map((date) => toTemporal(date));\n\n sortedOverallMutationData.forEach((mutationData) => {\n sortedDates.forEach((date) => {\n dataArray.set(mutationData, date, {\n count: 0,\n proportion: 0,\n totalCount: 0,\n });\n });\n });\n\n data.forEach((mutationData) => {\n mutationData.mutations.forEach((mutationEntry) => {\n const mutation = toSubstitutionOrDeletion(mutationEntry.mutation);\n const date = toTemporal(mutationData.date);\n\n if (dataArray.get(mutation, date) !== undefined) {\n dataArray.set(mutation, date, {\n count: mutationEntry.count,\n proportion: mutationEntry.proportion,\n totalCount: mutationData.totalCount,\n });\n }\n });\n });\n\n return dataArray;\n}\n\nfunction getTotalNumberOfSequencesInDateRange(filter: LapisFilter) {\n return new FetchAggregatedOperator<{ count: number }>(filter);\n}\n","export interface Map2d<Key1, Key2, Value> {\n get(keyFirstAxis: Key1, keySecondAxis: Key2): Value | undefined;\n\n set(keyFirstAxis: Key1, keySecondAxis: Key2, value: Value): void;\n\n getRow(key: Key1, fillEmptyWith: Value): Value[];\n\n deleteRow(key: Key1): void;\n\n getFirstAxisKeys(): Key1[];\n\n getSecondAxisKeys(): Key2[];\n\n getAsArray(fillEmptyWith: Value): Value[][];\n\n serializeFirstAxis(key: Key1): string;\n\n serializeSecondAxis(key: Key2): string;\n\n readonly keysFirstAxis: Map<string, Key1>;\n readonly keysSecondAxis: Map<string, Key2>;\n}\n\nexport type Map2DContents<Key1, Key2, Value> = {\n keysFirstAxis: Map<string, Key1>;\n keysSecondAxis: Map<string, Key2>;\n data: Map<string, Map<string, Value>>;\n};\n\nexport class Map2dBase<Key1 extends object | string, Key2 extends object | string, Value>\n implements Map2d<Key1, Key2, Value>\n{\n readonly data: Map<string, Map<string, Value>> = new Map<string, Map<string, Value>>();\n readonly keysFirstAxis = new Map<string, Key1>();\n readonly keysSecondAxis = new Map<string, Key2>();\n\n constructor(\n readonly serializeFirstAxis: (key: Key1) => string,\n readonly serializeSecondAxis: (key: Key2) => string,\n initialContent?: Map2DContents<Key1, Key2, Value>,\n ) {\n if (initialContent) {\n this.keysFirstAxis = new Map(initialContent.keysFirstAxis);\n this.keysSecondAxis = new Map(initialContent.keysSecondAxis);\n this.data = new Map(initialContent.data);\n }\n }\n\n get(keyFirstAxis: Key1, keySecondAxis: Key2) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(keyFirstAxis);\n const serializedKeySecondAxis = this.serializeSecondAxis(keySecondAxis);\n return this.data.get(serializedKeyFirstAxis)?.get(serializedKeySecondAxis);\n }\n\n getRow(key: Key1, fillEmptyWith: Value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n const row = this.data.get(serializedKeyFirstAxis);\n if (row === undefined) {\n return [];\n }\n return Array.from(this.keysSecondAxis.keys()).map((key) => row.get(key) ?? fillEmptyWith);\n }\n\n set(keyFirstAxis: Key1, keySecondAxis: Key2, value: Value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(keyFirstAxis);\n const serializedKeySecondAxis = this.serializeSecondAxis(keySecondAxis);\n\n if (!this.data.has(serializedKeyFirstAxis)) {\n this.data.set(serializedKeyFirstAxis, new Map<string, Value>());\n }\n\n this.data.get(serializedKeyFirstAxis)!.set(serializedKeySecondAxis, value);\n\n this.keysFirstAxis.set(serializedKeyFirstAxis, keyFirstAxis);\n this.keysSecondAxis.set(serializedKeySecondAxis, keySecondAxis);\n }\n\n deleteRow(key: Key1) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n this.data.delete(serializedKeyFirstAxis);\n this.keysFirstAxis.delete(serializedKeyFirstAxis);\n }\n\n getFirstAxisKeys() {\n return Array.from(this.keysFirstAxis.values());\n }\n\n getSecondAxisKeys() {\n return Array.from(this.keysSecondAxis.values());\n }\n\n getAsArray(fillEmptyWith: Value) {\n return this.getFirstAxisKeys().map((firstAxisKey) => {\n return this.getSecondAxisKeys().map((secondAxisKey) => {\n return this.get(firstAxisKey, secondAxisKey) ?? fillEmptyWith;\n });\n });\n }\n\n getContents(): Map2DContents<Key1, Key2, Value> {\n return {\n keysFirstAxis: this.keysFirstAxis,\n keysSecondAxis: this.keysSecondAxis,\n data: this.data,\n };\n }\n}\n\nexport class Map2dView<Key1 extends object | string, Key2 extends object | string, Value>\n implements Map2d<Key1, Key2, Value>\n{\n readonly keysFirstAxis;\n readonly keysSecondAxis;\n\n readonly baseMap: Map2d<Key1, Key2, Value>;\n\n constructor(map: Map2d<Key1, Key2, Value>) {\n this.keysFirstAxis = new Map(map.keysFirstAxis);\n this.keysSecondAxis = new Map(map.keysSecondAxis);\n\n if (map instanceof Map2dView) {\n this.baseMap = map.baseMap;\n }\n this.baseMap = map;\n }\n\n serializeFirstAxis(key: Key1) {\n return this.baseMap.serializeFirstAxis(key);\n }\n\n serializeSecondAxis(key: Key2) {\n return this.baseMap.serializeSecondAxis(key);\n }\n\n deleteRow(key: Key1) {\n this.keysFirstAxis.delete(this.serializeFirstAxis(key));\n }\n\n get(keyFirstAxis: Key1, keySecondAxis: Key2) {\n const firstAxisKey = this.serializeFirstAxis(keyFirstAxis);\n const secondAxisKey = this.serializeSecondAxis(keySecondAxis);\n\n if (!this.keysFirstAxis.has(firstAxisKey) || !this.keysSecondAxis.has(secondAxisKey)) {\n return undefined;\n }\n\n return this.baseMap.get(keyFirstAxis, keySecondAxis);\n }\n\n set() {\n throw new Error('Cannot set value on a Map2dView');\n }\n\n getFirstAxisKeys() {\n return Array.from(this.keysFirstAxis.values());\n }\n\n getSecondAxisKeys() {\n return Array.from(this.keysSecondAxis.values());\n }\n\n getAsArray(fillEmptyWith: Value) {\n return this.getFirstAxisKeys().map((firstAxisKey) => {\n return this.getSecondAxisKeys().map((secondAxisKey) => {\n return this.baseMap.get(firstAxisKey, secondAxisKey) ?? fillEmptyWith;\n });\n });\n }\n\n getRow(key: Key1, fillEmptyWith: Value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n if (!this.keysFirstAxis.has(serializedKeyFirstAxis)) {\n return [];\n }\n\n return this.baseMap.getRow(key, fillEmptyWith);\n }\n}\n","import {\n type MutationOverTimeMutationValue,\n serializeSubstitutionOrDeletion,\n serializeTemporal,\n} from '../../query/queryMutationsOverTime';\nimport { type Map2d, Map2dBase, type Map2DContents } from '../../utils/map2d';\nimport type { Deletion, Substitution } from '../../utils/mutations';\nimport type { Temporal } from '../../utils/temporalClass';\n\nexport type MutationOverTimeDataMap = Map2d<Substitution | Deletion, Temporal, MutationOverTimeMutationValue>;\n\nexport class BaseMutationOverTimeDataMap extends Map2dBase<\n Substitution | Deletion,\n Temporal,\n MutationOverTimeMutationValue\n> {\n constructor(initialContent?: Map2DContents<Substitution | Deletion, Temporal, MutationOverTimeMutationValue>) {\n super(serializeSubstitutionOrDeletion, serializeTemporal, initialContent);\n }\n}\n","import { type MutationOverTimeDataMap } from './MutationOverTimeData';\nimport { type SubstitutionOrDeletionEntry } from '../../types';\nimport { Map2dView } from '../../utils/map2d';\nimport type { Deletion, Substitution } from '../../utils/mutations';\nimport type { DisplayedMutationType } from '../components/mutation-type-selector';\nimport type { DisplayedSegment } from '../components/segment-selector';\n\nexport function getFilteredMutationOverTimeData(\n data: MutationOverTimeDataMap,\n overallMutationData: SubstitutionOrDeletionEntry<Substitution, Deletion>[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n proportionInterval: { min: number; max: number },\n) {\n const filteredData = new Map2dView(data);\n\n const mutationsToFilterOut = overallMutationData.filter((entry) => {\n if (entry.proportion < proportionInterval.min || entry.proportion > proportionInterval.max) {\n return true;\n }\n if (displayedSegments.some((segment) => segment.segment === entry.mutation.segment && !segment.checked)) {\n return true;\n }\n return displayedMutationTypes.some(\n (mutationType) => mutationType.type === entry.mutation.type && !mutationType.checked,\n );\n });\n\n mutationsToFilterOut.forEach((entry) => {\n filteredData.deleteRow(entry.mutation);\n });\n\n return filteredData;\n}\n","import { type FunctionComponent } from 'preact';\n\nimport { MinMaxRangeSlider } from './min-max-range-slider';\nimport { type GraphColor, singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface ColorScale {\n min: number;\n max: number;\n color: GraphColor;\n}\n\nexport interface ColorScaleSelectorProps {\n colorScale: ColorScale;\n setColorScale: (colorScale: ColorScale) => void;\n}\n\nexport const ColorScaleSelector: FunctionComponent<ColorScaleSelectorProps> = ({ colorScale, setColorScale }) => {\n const colorDisplayCss = `w-10 h-8 border border-gray-200 mx-2 text-xs flex items-center justify-center`;\n\n return (\n <div className='flex items-center'>\n <div\n style={{\n backgroundColor: singleGraphColorRGBByName(colorScale.color, 0),\n color: 'black',\n }}\n className={colorDisplayCss}\n >\n {formatProportion(colorScale.min, 0)}\n </div>\n <div className='w-64'>\n <MinMaxRangeSlider\n min={colorScale.min * 100}\n max={colorScale.max * 100}\n setMin={(percentage) => {\n setColorScale({ ...colorScale, min: percentage / 100 });\n }}\n setMax={(percentage) => {\n setColorScale({ ...colorScale, max: percentage / 100 });\n }}\n />\n </div>\n <div\n style={{\n backgroundColor: singleGraphColorRGBByName(colorScale.color, 1),\n color: 'white',\n }}\n className={colorDisplayCss}\n >\n {formatProportion(colorScale.max, 0)}\n </div>\n </div>\n );\n};\n\nexport const getColorWithingScale = (value: number, colorScale: ColorScale) => {\n if (colorScale.min === colorScale.max) {\n return singleGraphColorRGBByName(colorScale.color, 0);\n }\n\n const colorRange = colorScale.max - colorScale.min;\n\n const alpha = (value - colorScale.min) / colorRange;\n\n return singleGraphColorRGBByName(colorScale.color, alpha);\n};\n\nexport const getTextColorForScale = (value: number, colorScale: ColorScale) => {\n if (colorScale.min === colorScale.max) {\n return 'black';\n }\n\n const colorRange = colorScale.max - colorScale.min;\n\n const alpha = (value - colorScale.min) / colorRange;\n\n return alpha <= 0.5 ? 'black' : 'white';\n};\n","import { type FunctionComponent } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nexport type TooltipPosition =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'right';\n\nexport type TooltipProps = {\n content: string | JSXInternal.Element;\n position?: TooltipPosition;\n};\n\nfunction getPositionCss(position?: TooltipPosition) {\n switch (position) {\n case 'top':\n return 'bottom-full translate-x-[-50%] left-1/2 mb-1';\n case 'top-start':\n return 'bottom-full mr-1 mb-1';\n case 'top-end':\n return 'bottom-full right-0 ml-1 mb-1';\n case 'bottom':\n return 'top-full translate-x-[-50%] left-1/2 mt-1';\n case 'bottom-start':\n return 'mr-1 mt-1';\n case 'bottom-end':\n return 'right-0 ml-1 mt-1';\n case 'left':\n return 'right-full translate-y-[-50%] top-1/2 mr-1';\n case 'right':\n return 'left-full translate-y-[-50%] top-1/2 ml-1';\n case undefined:\n return '';\n }\n}\n\nconst Tooltip: FunctionComponent<TooltipProps> = ({ children, content, position = 'bottom' }) => {\n return (\n <div className='relative w-full h-full'>\n <div className='peer w-full h-full'>{children}</div>\n <div\n className={`absolute z-10 w-max bg-white p-4 border border-gray-200 rounded-md invisible peer-hover:visible ${getPositionCss(position)}`}\n >\n {content}\n </div>\n </div>\n );\n};\n\nexport default Tooltip;\n","import { Fragment, type FunctionComponent, type RefObject } from 'preact';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { type MutationOverTimeDataMap } from './MutationOverTimeData';\nimport { type MutationOverTimeMutationValue } from '../../query/queryMutationsOverTime';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport { type Temporal, type TemporalClass, toTemporalClass, YearMonthDayClass } from '../../utils/temporalClass';\nimport { type ColorScale, getColorWithingScale, getTextColorForScale } from '../components/color-scale-selector';\nimport Tooltip, { type TooltipPosition } from '../components/tooltip';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsOverTimeGridProps {\n data: MutationOverTimeDataMap;\n colorScale: ColorScale;\n}\n\nconst MAX_NUMBER_OF_GRID_ROWS = 100;\nconst MUTATION_CELL_WIDTH_REM = 8;\n\nconst MutationsOverTimeGrid: FunctionComponent<MutationsOverTimeGridProps> = ({ data, colorScale }) => {\n const allMutations = data.getFirstAxisKeys();\n const shownMutations = allMutations.slice(0, MAX_NUMBER_OF_GRID_ROWS);\n\n const dates = data.getSecondAxisKeys();\n\n const [showProportionText, setShowProportionText] = useState(false);\n const gridRef = useRef<HTMLDivElement>(null);\n useShowProportion(gridRef, dates.length, setShowProportionText);\n\n return (\n <>\n {allMutations.length > MAX_NUMBER_OF_GRID_ROWS && (\n <div className='pl-2'>\n Showing {MAX_NUMBER_OF_GRID_ROWS} of {allMutations.length} mutations. You can narrow the filter to\n reduce the number of mutations.\n </div>\n )}\n {allMutations.length === 0 && (\n <div className={'flex justify-center'}>No data available for your filters.</div>\n )}\n <div\n ref={gridRef}\n style={{\n display: 'grid',\n gridTemplateRows: `repeat(${shownMutations.length}, 24px)`,\n gridTemplateColumns: `${MUTATION_CELL_WIDTH_REM}rem repeat(${dates.length}, minmax(0.05rem, 1fr))`,\n }}\n >\n {shownMutations.map((mutation, rowIndex) => {\n return (\n <Fragment key={`fragment-${mutation.toString()}`}>\n <div\n key={`mutation-${mutation.toString()}`}\n style={{ gridRowStart: rowIndex + 1, gridColumnStart: 1 }}\n >\n <MutationCell mutation={mutation} />\n </div>\n {dates.map((date, columnIndex) => {\n const value = data.get(mutation, date) ?? { proportion: 0, count: 0, totalCount: 0 };\n const tooltipPosition = getTooltipPosition(\n rowIndex,\n shownMutations.length,\n columnIndex,\n dates.length,\n );\n return (\n <div\n style={{ gridRowStart: rowIndex + 1, gridColumnStart: columnIndex + 2 }}\n key={`${mutation.toString()}-${date.toString()}`}\n >\n <ProportionCell\n value={value}\n date={date}\n mutation={mutation}\n tooltipPosition={tooltipPosition}\n showProportionText={showProportionText}\n colorScale={colorScale}\n />\n </div>\n );\n })}\n </Fragment>\n );\n })}\n </div>\n </>\n );\n};\n\nfunction useShowProportion(\n gridRef: RefObject<HTMLDivElement>,\n girdColumns: number,\n setShowProportionText: (value: ((prevState: boolean) => boolean) | boolean) => void,\n) {\n useEffect(() => {\n const checkWidth = () => {\n if (gridRef.current) {\n const width = gridRef.current.getBoundingClientRect().width;\n const widthPerDate = (width - remToPx(MUTATION_CELL_WIDTH_REM)) / girdColumns;\n const maxWidthProportionText = 28;\n\n setShowProportionText(widthPerDate > maxWidthProportionText);\n }\n };\n\n checkWidth();\n window.addEventListener('resize', checkWidth);\n\n return () => {\n window.removeEventListener('resize', checkWidth);\n };\n }, [girdColumns, gridRef, setShowProportionText]);\n}\n\nconst remToPx = (rem: number) => rem * parseFloat(getComputedStyle(document.documentElement).fontSize);\n\nfunction getTooltipPosition(rowIndex: number, rows: number, columnIndex: number, columns: number) {\n const tooltipX = rowIndex < rows / 2 ? 'bottom' : 'top';\n const tooltipY = columnIndex < columns / 2 ? 'start' : 'end';\n return `${tooltipX}-${tooltipY}` as const;\n}\n\nconst ProportionCell: FunctionComponent<{\n value: MutationOverTimeMutationValue;\n date: Temporal;\n mutation: Substitution | Deletion;\n tooltipPosition: TooltipPosition;\n showProportionText: boolean;\n colorScale: ColorScale;\n}> = ({ value, mutation, date, tooltipPosition, showProportionText, colorScale }) => {\n const dateClass = toTemporalClass(date);\n\n const tooltipContent = (\n <div>\n <p>\n <span className='font-bold'>{dateClass.englishName()}</span>\n </p>\n <p>({timeIntervalDisplay(dateClass)})</p>\n <p>{mutation.code}</p>\n <p>Proportion: {formatProportion(value.proportion)}</p>\n <p>\n Count: {value.count} / {value.totalCount} total\n </p>\n </div>\n );\n\n return (\n <div className={'py-1 w-full h-full'}>\n <Tooltip content={tooltipContent} position={tooltipPosition}>\n <div\n style={{\n backgroundColor: getColorWithingScale(value.proportion, colorScale),\n color: getTextColorForScale(value.proportion, colorScale),\n }}\n className={`w-full h-full text-center hover:font-bold text-xs group`}\n >\n {showProportionText ? formatProportion(value.proportion, 0) : undefined}\n </div>\n </Tooltip>\n </div>\n );\n};\n\nconst timeIntervalDisplay = (date: TemporalClass) => {\n if (date instanceof YearMonthDayClass) {\n return date.toString();\n }\n\n return `${date.firstDay.toString()} - ${date.lastDay.toString()}`;\n};\n\nconst MutationCell: FunctionComponent<{ mutation: Substitution | Deletion }> = ({ mutation }) => {\n return <div className='text-center'>{mutation.code}</div>;\n};\n\nexport default MutationsOverTimeGrid;\n","import { type FunctionComponent } from 'preact';\n\nimport { ColorScaleSelector, type ColorScaleSelectorProps } from './color-scale-selector';\nimport { Dropdown } from './dropdown';\n\nexport type ColorScaleSelectorDropdownProps = ColorScaleSelectorProps;\n\nexport const ColorScaleSelectorDropdown: FunctionComponent<ColorScaleSelectorDropdownProps> = ({\n colorScale,\n setColorScale,\n}) => {\n return (\n <div className='w-20'>\n <Dropdown buttonTitle={`Color scale`} placement={'bottom-start'}>\n <ColorScaleSelector colorScale={colorScale} setColorScale={setColorScale} />\n </Dropdown>\n </div>\n );\n};\n","import { useEffect, useState } from 'preact/hooks';\n\nexport function useWebWorker<Request, Response>(messageToWorker: Request, worker: Worker) {\n const [data, setData] = useState<Response | undefined>(undefined);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n worker.onmessage = (\n event: MessageEvent<{\n status: 'loading' | 'success' | 'error';\n data?: Response;\n error?: Error;\n }>,\n ) => {\n const { status, data, error } = event.data;\n\n switch (status) {\n case 'loading':\n setIsLoading(true);\n break;\n case 'success':\n setData(data);\n setError(undefined);\n setIsLoading(false);\n break;\n case 'error':\n setError(error);\n setIsLoading(false);\n break;\n default:\n throw new Error(`Unknown status: ${status}`);\n }\n };\n\n worker.onmessageerror = (event: MessageEvent) => {\n setError(new Error(`Worker received a message that it cannot deserialize: ${event.data}`));\n setIsLoading(false);\n };\n }, [worker]);\n\n useEffect(() => {\n worker.postMessage(messageToWorker);\n }, [messageToWorker, worker]);\n\n return { data, error, isLoading };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useMemo, useState } from 'preact/hooks';\n\n// @ts-expect-error -- uses subpath imports and vite worker import\nimport MutationOverTimeWorker from '#mutationOverTime?worker&inline';\nimport { BaseMutationOverTimeDataMap, type MutationOverTimeDataMap } from './MutationOverTimeData';\nimport { getFilteredMutationOverTimeData } from './getFilteredMutationsOverTimeData';\nimport { type MutationOverTimeWorkerResponse } from './mutationOverTimeWorker';\nimport MutationsOverTimeGrid from './mutations-over-time-grid';\nimport { type MutationOverTimeQuery } from '../../query/queryMutationsOverTime';\nimport {\n type LapisFilter,\n type SequenceType,\n type SubstitutionOrDeletionEntry,\n type TemporalGranularity,\n} from '../../types';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport { toTemporalClass } from '../../utils/temporalClass';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { type ColorScale } from '../components/color-scale-selector';\nimport { ColorScaleSelectorDropdown } from '../components/color-scale-selector-dropdown';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\nimport Tabs from '../components/tabs';\nimport { useWebWorker } from '../webWorkers/useWebWorker';\n\nexport type View = 'grid';\n\nexport interface MutationsOverTimeProps {\n width: string;\n height: string;\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n views: View[];\n granularity: TemporalGranularity;\n lapisDateField: string;\n}\n\nexport const MutationsOverTime: FunctionComponent<MutationsOverTimeProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <MutationsOverTimeInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationsOverTimeInner: FunctionComponent<MutationsOverTimeProps> = (componentProps) => {\n const lapis = useContext(LapisUrlContext);\n const { lapisFilter, sequenceType, granularity, lapisDateField } = componentProps;\n\n const messageToWorker = useMemo(() => {\n return {\n lapisFilter,\n sequenceType,\n granularity,\n lapisDateField,\n lapis,\n };\n }, [granularity, lapis, lapisDateField, lapisFilter, sequenceType]);\n\n const worker = useMemo(() => new MutationOverTimeWorker(), []);\n\n const { data, error, isLoading } = useWebWorker<MutationOverTimeQuery, MutationOverTimeWorkerResponse>(\n messageToWorker,\n worker,\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== undefined) {\n throw error;\n }\n\n if (data === null || data === undefined || data.overallMutationData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const { overallMutationData, mutationOverTimeSerialized } = data;\n const mutationOverTimeData = new BaseMutationOverTimeDataMap(mutationOverTimeSerialized);\n return (\n <MutationsOverTimeTabs\n overallMutationData={overallMutationData}\n mutationOverTimeData={mutationOverTimeData}\n originalComponentProps={componentProps}\n />\n );\n};\n\ntype MutationOverTimeTabsProps = {\n mutationOverTimeData: BaseMutationOverTimeDataMap;\n originalComponentProps: MutationsOverTimeProps;\n overallMutationData: SubstitutionOrDeletionEntry<Substitution, Deletion>[];\n};\n\nconst MutationsOverTimeTabs: FunctionComponent<MutationOverTimeTabsProps> = ({\n mutationOverTimeData,\n originalComponentProps,\n overallMutationData,\n}) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.05, max: 0.9 });\n const [colorScale, setColorScale] = useState<ColorScale>({ min: 0, max: 1, color: 'indigo' });\n\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(originalComponentProps.sequenceType);\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n\n const filteredData = useMemo(() => {\n return getFilteredMutationOverTimeData(\n mutationOverTimeData,\n overallMutationData,\n displayedSegments,\n displayedMutationTypes,\n proportionInterval,\n );\n }, [mutationOverTimeData, overallMutationData, displayedSegments, displayedMutationTypes, proportionInterval]);\n\n const getTab = (view: View) => {\n if (filteredData === undefined) {\n return {\n title: 'Calculating',\n content: <LoadingDisplay />,\n };\n }\n switch (view) {\n case 'grid':\n return {\n title: 'Grid',\n content: <MutationsOverTimeGrid data={filteredData} colorScale={colorScale} />,\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n filteredData={filteredData}\n colorScale={colorScale}\n setColorScale={setColorScale}\n originalComponentProps={originalComponentProps}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = {\n activeTab: string;\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n filteredData: MutationOverTimeDataMap;\n colorScale: ColorScale;\n setColorScale: Dispatch<StateUpdater<ColorScale>>;\n originalComponentProps: MutationsOverTimeProps;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n proportionInterval,\n setProportionInterval,\n filteredData,\n colorScale,\n setColorScale,\n originalComponentProps,\n}) => {\n return (\n <>\n {activeTab === 'Grid' && (\n <ColorScaleSelectorDropdown colorScale={colorScale} setColorScale={setColorScale} />\n )}\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n <MutationTypeSelector\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n displayedMutationTypes={displayedMutationTypes}\n />\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n labelPrefix='Mean proportion'\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getDownloadData(filteredData)}\n filename='mutations_over_time.csv'\n />\n <MutationsOverTimeInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype MutationsOverTimeInfoProps = {\n originalComponentProps: MutationsOverTimeProps;\n};\n\nconst MutationsOverTimeInfo: FunctionComponent<MutationsOverTimeInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Mutations over time</InfoHeadline1>\n <InfoParagraph>\n This presents the proportions of {originalComponentProps.sequenceType} mutations per{' '}\n {originalComponentProps.granularity}. In the toolbar, you can configure which mutations are displayed by\n selecting the mutation type (substitution or deletion), choosing specific segments/genes (if the\n organism has multiple segments/genes), and applying a filter based on the proportion of the mutation's\n occurrence over the entire time range.\n </InfoParagraph>\n <InfoComponentCode componentName='mutations-over-time' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n\nfunction getDownloadData(filteredData: MutationOverTimeDataMap) {\n const dates = filteredData.getSecondAxisKeys().map((date) => toTemporalClass(date));\n\n return filteredData.getFirstAxisKeys().map((mutation) => {\n return dates.reduce(\n (accumulated, date) => {\n const proportion = filteredData.get(mutation, date)?.proportion ?? 0;\n return {\n ...accumulated,\n [date.dateString]: proportion,\n };\n },\n { mutation: mutation.code },\n );\n });\n}\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { MutationsOverTime, type MutationsOverTimeProps } from '../../preact/mutationsOverTime/mutations-over-time';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays mutations (substitutions and deletions) over time for a dataset selected by a LAPIS filter.\n * The shown date range is determined by the date field in the LAPIS filter.\n * If the date field is not set, the date range is determined by all available dates in the dataset.\n *\n * ## Views\n *\n * ### Grid View\n *\n * The grid view shows the proportion for each mutation over date ranges.\n *\n * The grid limits the number of rows and columns for browser performance reasons as\n * too much data might make the browser unresponsive.\n *\n * The number of columns is limited to 200.\n * If this number are exceeded, an error message will be shown.\n * It is your responsibility to make sure that this does not happen.\n * Depending on the selected date range in the `lapisFilter`, you can adapt the granularity accordingly\n * (e.g. use months instead of days).\n *\n * The number of rows is limited to 100.\n * If there are more, the component will only show 100 mutations and notify the user.\n */\n@customElement('gs-mutations-over-time')\nexport class MutationsOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Required.\n *\n * LAPIS filter to select the displayed data.\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: 'grid'[] = ['grid'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'week';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used for the columns of the grid.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n override render() {\n return (\n <MutationsOverTime\n lapisFilter={this.lapisFilter}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n granularity={this.granularity}\n lapisDateField={this.lapisDateField}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutations-over-time': MutationsOverTimeComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutations-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.lapisFilter, MutationsOverTimeProps['lapisFilter']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.sequenceType, MutationsOverTimeProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<Equals<typeof MutationsOverTimeComponent.prototype.views, MutationsOverTimeProps['views']>>;\ntype WidthMatches = Expect<Equals<typeof MutationsOverTimeComponent.prototype.width, MutationsOverTimeProps['width']>>;\ntype HeightMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.height, MutationsOverTimeProps['height']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.granularity, MutationsOverTimeProps['granularity']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.lapisDateField, MutationsOverTimeProps['lapisDateField']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type DateRangeOption } from './dateRangeOption';\n\nexport const getSelectableOptions = (dateRangeOptions: DateRangeOption[]) => {\n return dateRangeOptions.map((customSelectOption) => {\n return { label: customSelectOption.label, value: customSelectOption.label };\n });\n};\n\nexport const getDatesForSelectorValue = (\n initialSelectedDateRange: string | undefined,\n dateRangeOptions: DateRangeOption[],\n earliestDate: string,\n) => {\n const today = new Date();\n const defaultDates = { dateFrom: new Date(earliestDate), dateTo: today };\n\n if (initialSelectedDateRange === undefined) {\n return defaultDates;\n }\n\n const dateRangeOption = dateRangeOptions.find((option) => option.label === initialSelectedDateRange);\n if (dateRangeOption) {\n return {\n dateFrom: new Date(dateRangeOption.dateFrom ?? earliestDate),\n dateTo: new Date(dateRangeOption.dateTo ?? today),\n };\n }\n\n return defaultDates;\n};\n","import { type DateRangeOption } from './dateRangeOption';\nimport { getDatesForSelectorValue, getSelectableOptions } from './selectableOptions';\nimport { UserFacingError } from '../components/error-display';\n\nexport function computeInitialValues(\n initialValue: string | undefined,\n initialDateFrom: string | undefined,\n initialDateTo: string | undefined,\n earliestDate: string,\n dateRangeOptions: DateRangeOption[],\n): {\n initialSelectedDateRange: string | undefined;\n initialSelectedDateFrom: Date;\n initialSelectedDateTo: Date;\n} {\n if (isUndefinedOrEmpty(initialDateFrom) && isUndefinedOrEmpty(initialDateTo)) {\n const selectableOptions = getSelectableOptions(dateRangeOptions);\n const initialSelectedDateRange = selectableOptions.find((option) => option.value === initialValue)?.value;\n\n if (initialValue !== undefined && initialSelectedDateRange === undefined) {\n throw new UserFacingError(\n 'Invalid initialValue',\n `Invalid initialValue \"${initialValue}\", It must be one of ${selectableOptions.map((option) => `'${option.value}'`).join(', ')}`,\n );\n }\n\n const { dateFrom, dateTo } = getDatesForSelectorValue(initialSelectedDateRange, dateRangeOptions, earliestDate);\n\n return {\n initialSelectedDateRange,\n initialSelectedDateFrom: dateFrom,\n initialSelectedDateTo: dateTo,\n };\n }\n\n const initialSelectedDateFrom = isUndefinedOrEmpty(initialDateFrom)\n ? new Date(earliestDate)\n : new Date(initialDateFrom);\n let initialSelectedDateTo = isUndefinedOrEmpty(initialDateTo) ? new Date() : new Date(initialDateTo);\n\n if (isNaN(initialSelectedDateFrom.getTime())) {\n throw new UserFacingError(\n 'Invalid initialDateFrom',\n `Invalid initialDateFrom \"${initialDateFrom}\", It must be of the format YYYY-MM-DD`,\n );\n }\n if (isNaN(initialSelectedDateTo.getTime())) {\n throw new UserFacingError(\n 'Invalid initialDateTo',\n `Invalid initialDateTo \"${initialDateTo}\", It must be of the format YYYY-MM-DD`,\n );\n }\n\n if (initialSelectedDateFrom > initialSelectedDateTo) {\n initialSelectedDateTo = initialSelectedDateFrom;\n }\n\n return {\n initialSelectedDateRange: undefined,\n initialSelectedDateFrom,\n initialSelectedDateTo,\n };\n}\n\nfunction isUndefinedOrEmpty(value: string | undefined): value is undefined | '' {\n return value === undefined || value === '';\n}\n","export const toYYYYMMDD = (date?: Date) => {\n if (!date) {\n return undefined;\n }\n\n const options: Intl.DateTimeFormatOptions = { year: 'numeric', month: '2-digit', day: '2-digit' };\n return date.toLocaleDateString('en-CA', options);\n};\n","import flatpickr from 'flatpickr';\nimport 'flatpickr/dist/flatpickr.min.css';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { computeInitialValues } from './computeInitialValues';\nimport { toYYYYMMDD } from './dateConversion';\nimport { type DateRangeOption } from './dateRangeOption';\nimport { getDatesForSelectorValue, getSelectableOptions } from './selectableOptions';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Select } from '../components/select';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\n\nconst customOption = 'Custom';\n\nexport interface DateRangeSelectorProps extends DateRangeSelectorPropsInner {\n width: string;\n}\n\nexport interface DateRangeSelectorPropsInner {\n dateRangeOptions: DateRangeOption[];\n earliestDate: string;\n initialValue: string | undefined;\n initialDateFrom: string;\n initialDateTo: string;\n dateColumn: string;\n}\n\nexport const DateRangeSelector = ({ width, ...innerProps }: DateRangeSelectorProps) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal'>\n <div style={{ width }}>\n <DateRangeSelectorInner {...innerProps} />\n </div>\n </ErrorBoundary>\n );\n};\n\nexport const DateRangeSelectorInner = ({\n dateRangeOptions,\n earliestDate = '1900-01-01',\n initialValue,\n dateColumn,\n initialDateFrom,\n initialDateTo,\n}: DateRangeSelectorPropsInner) => {\n const initialValues = computeInitialValues(\n initialValue,\n initialDateFrom,\n initialDateTo,\n earliestDate,\n dateRangeOptions,\n );\n\n const fromDatePickerRef = useRef<HTMLInputElement>(null);\n const toDatePickerRef = useRef<HTMLInputElement>(null);\n const divRef = useRef<HTMLDivElement>(null);\n const [dateFromPicker, setDateFromPicker] = useState<flatpickr.Instance | null>(null);\n const [dateToPicker, setDateToPicker] = useState<flatpickr.Instance | null>(null);\n\n const [selectedDateRange, setSelectedDateRange] = useState<string | undefined>(\n initialValues.initialSelectedDateRange,\n );\n\n const [selectedDates, setSelectedDates] = useState<{ dateFrom: Date; dateTo: Date }>({\n dateFrom: initialValues.initialSelectedDateFrom,\n dateTo: initialValues.initialSelectedDateTo,\n });\n\n useEffect(() => {\n const commonConfig = {\n allowInput: true,\n dateFormat: 'Y-m-d',\n };\n\n if (fromDatePickerRef.current) {\n setDateFromPicker(\n flatpickr(fromDatePickerRef.current, {\n ...commonConfig,\n defaultDate: selectedDates.dateFrom,\n }),\n );\n }\n\n if (toDatePickerRef.current) {\n setDateToPicker(\n flatpickr(toDatePickerRef.current, {\n ...commonConfig,\n defaultDate: selectedDates.dateTo,\n }),\n );\n }\n\n return () => {\n dateFromPicker?.destroy();\n dateToPicker?.destroy();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromDatePickerRef, toDatePickerRef]);\n\n const onSelectChange = (value: string) => {\n setSelectedDateRange(value);\n\n const dateRange = getDatesForSelectorValue(value, dateRangeOptions, earliestDate);\n\n dateToPicker?.set('minDate', dateRange.dateFrom);\n dateFromPicker?.set('maxDate', dateRange.dateTo);\n\n dateFromPicker?.setDate(dateRange.dateFrom);\n dateToPicker?.setDate(dateRange.dateTo);\n\n setSelectedDates({\n dateFrom: dateRange.dateFrom,\n dateTo: dateRange.dateTo,\n });\n\n submit();\n };\n\n const onChangeDateFrom = () => {\n if (selectedDates.dateFrom.toDateString() === dateFromPicker?.selectedDates[0].toDateString()) {\n return;\n }\n\n selectedDates.dateFrom = dateFromPicker?.selectedDates[0] || new Date();\n dateToPicker?.set('minDate', dateFromPicker?.selectedDates[0]);\n setSelectedDateRange(customOption);\n\n submit();\n };\n\n const onChangeDateTo = () => {\n if (selectedDates.dateTo.toDateString() === dateToPicker?.selectedDates[0].toDateString()) {\n return;\n }\n\n selectedDates.dateTo = dateToPicker?.selectedDates[0] || new Date();\n dateFromPicker?.set('maxDate', dateToPicker?.selectedDates[0]);\n setSelectedDateRange(customOption);\n\n submit();\n };\n\n const submit = () => {\n const dateFrom = toYYYYMMDD(dateFromPicker?.selectedDates[0]);\n const dateTo = toYYYYMMDD(dateToPicker?.selectedDates[0]);\n\n const detail = {\n ...(dateFrom !== undefined && { [`${dateColumn}From`]: dateFrom }),\n ...(dateTo !== undefined && { [`${dateColumn}To`]: dateTo }),\n };\n\n divRef.current?.dispatchEvent(\n new CustomEvent('gs-date-range-changed', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n return (\n <div class='flex flex-wrap' ref={divRef}>\n <Select\n items={[\n ...getSelectableOptions(dateRangeOptions),\n { label: customOption, value: customOption, disabled: true },\n ]}\n selected={selectedDateRange ?? customOption}\n selectStyle='select-bordered rounded-none flex-grow min-w-[7.5rem]'\n onChange={(event: Event) => {\n event.preventDefault();\n const select = event.target as HTMLSelectElement;\n const value = select.value as ScaleType;\n onSelectChange(value);\n }}\n />\n <div className={'flex flex-wrap flex-grow'}>\n <input\n class='input input-bordered rounded-none flex-grow w-[7.5rem]'\n type='text'\n placeholder='Date from'\n ref={fromDatePickerRef}\n onChange={onChangeDateFrom}\n onBlur={onChangeDateFrom}\n />\n <input\n class='input input-bordered rounded-none flex-grow w-[7.5rem]'\n type='text'\n placeholder='Date to'\n ref={toDatePickerRef}\n onChange={onChangeDateTo}\n onBlur={onChangeDateTo}\n />\n </div>\n </div>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { DateRangeSelector, type DateRangeSelectorProps } from '../../preact/dateRangeSelector/date-range-selector';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n * This component is a group of input fields designed to specify date range filters\n * for a given date column of this Lapis instance. It consists of 3 fields:\n *\n * - a select field to choose a predefined date range,\n * - an input field with an attached date picker for the start date,\n * - an input field with an attached date picker for the end date.\n *\n * Setting a value in the select field will overwrite the previous values of the start and end date.\n * Setting a value in either of the date pickers will set the select field to \"custom\",\n * which represents an arbitrary date range.\n *\n * @fires {CustomEvent<{ `${dateColumn}From`: string; `${dateColumn}To`: string; }>} gs-date-range-changed\n * Fired when:\n * - The select field is changed,\n * - A date is selected in either of the date pickers,\n * - A date was typed into either of the date input fields, and the input field loses focus (\"on blur\").\n * Contains the dates in the format `YYYY-MM-DD`.\n *\n * Example: For `dateColumn = yourDate`, an event with `detail` containing\n * ```\n * {\n * yourDataFrom: \"2021-01-01\",\n * yourDataTo: \"2021-12-31\"\n * }\n * ```\n * will be fired.\n */\n@customElement('gs-date-range-selector')\nexport class DateRangeSelectorComponent extends PreactLitAdapter {\n /**\n * An array of date range options that the select field should provide.\n * The `label` will be shown to the user, and it will be available as `initialValue`.\n * The dates must be in the format `YYYY-MM-DD`.\n *\n * If dateFrom or dateTo is not set, the component will default to the `earliestDate` or the current date.\n */\n @property({ type: Array })\n dateRangeOptions: { label: string; dateFrom?: string; dateTo?: string }[] = [];\n\n /**\n * The `dateFrom` value to use in the `allTimes` preset in the format `YYYY-MM-DD`.\n */\n @property({ type: String })\n earliestDate: string = '1900-01-01';\n\n /**\n * The initial value to use for this date range selector.\n * Must be a valid label from the `dateRangeOptions`.\n *\n * If the value is not set, the component will default to the range `earliestDate` until today.\n *\n * It will be overwritten if `initialDateFrom` or `initialDateTo` is set.\n *\n * We provide some options in `dateRangeOptionPresets` for convenience.\n */\n @property()\n initialValue: string | undefined = undefined;\n\n /**\n * A date string in the format `YYYY-MM-DD`.\n * If set, the date range selector will be initialized with the given date (overwriting `initialValue` to `custom`).\n * If `initialDateTo` is set, but this is unset, it will default to `earliestDate`.\n */\n @property()\n initialDateFrom: string = '';\n\n /**\n * A date string in the format `YYYY-MM-DD`.\n * If set, the date range selector will be initialized with the given date (overwriting `initialValue` to `custom`).\n * If `initialDateFrom` is set, but this is unset, it will default to the current date.\n */\n @property()\n initialDateTo: string = '';\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The name of the column in LAPIS that contains the date information.\n */\n @property({ type: String })\n dateColumn: string = 'date';\n\n override render() {\n return (\n <DateRangeSelector\n dateRangeOptions={this.dateRangeOptions}\n earliestDate={this.earliestDate}\n initialValue={this.initialValue}\n initialDateFrom={this.initialDateFrom}\n initialDateTo={this.initialDateTo}\n dateColumn={this.dateColumn}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-date-range-selector': DateRangeSelectorComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-date-range-changed': CustomEvent<Record<string, string>>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-date-range-selector': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype CustomSelectOptionsMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.dateRangeOptions, DateRangeSelectorProps['dateRangeOptions']>\n>;\ntype EarliestDateMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.earliestDate, DateRangeSelectorProps['earliestDate']>\n>;\ntype InitialValueMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialValue, DateRangeSelectorProps['initialValue']>\n>;\ntype InitialDateFromMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialDateFrom, DateRangeSelectorProps['initialDateFrom']>\n>;\ntype InitialDateToMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialDateTo, DateRangeSelectorProps['initialDateTo']>\n>;\ntype WidthMatches = Expect<Equals<typeof DateRangeSelectorComponent.prototype.width, DateRangeSelectorProps['width']>>;\ntype DateColumnMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.dateColumn, DateRangeSelectorProps['dateColumn']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchAutocompletionList(fields: string[], lapis: string, signal?: AbortSignal) {\n const toAncestorInHierarchyOverwriteValues = Array(fields.length - 1)\n .fill(0)\n .map((_, i) => i + 1)\n .map((i) => fields.slice(i).reduce((acc, field) => ({ ...acc, [field]: null }), {}));\n\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string | null>>({}, fields);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n const locationValues = data\n .map((entry) => fields.reduce((acc, field) => ({ ...acc, [field]: entry[field] }), {}))\n .reduce<Set<string>>((setOfAllHierarchies, entry) => {\n setOfAllHierarchies.add(JSON.stringify(entry));\n toAncestorInHierarchyOverwriteValues.forEach((overwriteValues) => {\n setOfAllHierarchies.add(JSON.stringify({ ...entry, ...overwriteValues }));\n });\n return setOfAllHierarchies;\n }, new Set());\n\n return [...locationValues].map((json) => JSON.parse(json)).sort(compareLocationEntries(fields));\n}\n\nfunction compareLocationEntries(fields: string[]) {\n return (a: Record<string, string | null>, b: Record<string, string | null>) => {\n for (const field of fields) {\n const valueA = a[field];\n const valueB = b[field];\n if (valueA === valueB) {\n continue;\n }\n if (valueA === null) {\n return -1;\n }\n if (valueB === null) {\n return 1;\n }\n return valueA < valueB ? -1 : 1;\n }\n return 0;\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef, useState } from 'preact/hooks';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nimport { fetchAutocompletionList } from './fetchAutocompletionList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nexport interface LocationFilterInnerProps {\n initialValue: string;\n placeholderText: string;\n fields: string[];\n}\n\nexport interface LocationFilterProps extends LocationFilterInnerProps {\n width: string;\n}\n\nexport const LocationFilter: FunctionComponent<LocationFilterProps> = ({ width, ...innerProps }) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal'>\n <ResizeContainer size={size}>\n <LocationFilterInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const LocationFilterInner = ({ initialValue, fields, placeholderText }: LocationFilterInnerProps) => {\n const lapis = useContext(LapisUrlContext);\n\n const [value, setValue] = useState(initialValue ?? '');\n const [unknownLocation, setUnknownLocation] = useState(false);\n\n const divRef = useRef<HTMLDivElement>(null);\n\n const { data, error, isLoading } = useQuery(() => fetchAutocompletionList(fields, lapis), [fields, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n if (error) {\n throw error;\n }\n\n const onInput = (event: JSXInternal.TargetedInputEvent<HTMLInputElement>) => {\n const inputValue = event.currentTarget.value;\n setValue(inputValue);\n if (inputValue.trim() === value.trim() && inputValue !== '') {\n return;\n }\n const eventDetail = parseLocation(inputValue, fields);\n if (hasAllUndefined(eventDetail) || hasMatchingEntry(data, eventDetail)) {\n divRef.current?.dispatchEvent(\n new CustomEvent('gs-location-changed', {\n detail: eventDetail,\n bubbles: true,\n composed: true,\n }),\n );\n setUnknownLocation(false);\n } else {\n setUnknownLocation(true);\n }\n };\n\n return (\n <div class='flex w-full' ref={divRef}>\n <input\n type='text'\n class={`input input-bordered grow ${unknownLocation ? 'border-2 border-error' : ''}`}\n value={value}\n onInput={onInput}\n list='countries'\n placeholder={placeholderText}\n />\n <datalist id='countries'>\n {data?.map((v) => {\n const value = fields\n .map((field) => v[field])\n .filter((value) => value !== null)\n .join(' / ');\n return <option key={value} value={value} />;\n })}\n </datalist>\n </div>\n );\n};\n\nconst parseLocation = (location: string, fields: string[]) => {\n if (location === '') {\n return fields.reduce((acc, field) => ({ ...acc, [field]: undefined }), {});\n }\n const fieldValues = location.split('/').map((part) => part.trim());\n\n return fields.reduce((acc, field, i) => ({ ...acc, [field]: fieldValues[i] }), {});\n};\n\nconst hasAllUndefined = (obj: Record<string, string | undefined>) =>\n Object.values(obj).every((value) => value === undefined);\n\nconst hasMatchingEntry = (data: Record<string, string>[] | null, eventDetail: Record<string, string>) => {\n if (data === null) {\n return false;\n }\n\n const matchingEntries = Object.entries(eventDetail)\n .filter(([, value]) => value !== undefined)\n .reduce((filteredData, [key, value]) => filteredData.filter((it) => it[key] === value), data);\n\n return matchingEntries.length > 0;\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { LocationFilter, type LocationFilterProps } from '../../preact/locationFilter/location-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n *\n * This component provides an input field to specify filters for locations.\n *\n * It expects a list of fields that form a strict hierarchical order, such as continent, country, and city.\n * The component retrieves a list of all possible values for these fields from the Lapis instance.\n * This list is then utilized to display autocomplete suggestions and to validate the input.\n *\n * Given `fields` are `['field1', 'field2', ..., 'fieldN']`,\n * then valid values for the location filter must be in the form `valueForField1 / valueForField2 / ... / valueForFieldK`,\n * where `1 <= K <= N`.\n * Values for the fields `i > K` are considered `undefined`.\n *\n * @fires {CustomEvent<Record<string, string>>} gs-location-changed\n * Fired when a value from the datalist is selected or when a valid value is typed into the field.\n * The `details` of this event contain an object with all `fields` as keys\n * and the corresponding values as values, even if they are `undefined`.\n * Example:\n * ```\n * {\n * continent: \"Asia\",\n * country: \"China\",\n * city: \"Beijing\",\n * district: undefined,\n * }\n * ```\n */\n@customElement('gs-location-filter')\nexport class LocationFilterComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this location filter.\n * Must be of the form `valueForField1 / valueForField2 / ... / valueForFieldN`.\n */\n @property()\n initialValue = '';\n\n /**\n * Required.\n *\n * The fields to display in the location filter, in hierarchical order.\n * The top-level field should be the first entry in the array.\n * This component assumes that the values for each field form a strict hierarchy\n * (e.g., `fields = ['continent', 'country', 'city']`).\n */\n @property({ type: Array })\n fields: string[] = [];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The placeholder text to display in the input field, if it is empty.\n */\n @property()\n placeholderText: string = '';\n\n override render() {\n return (\n <LocationFilter\n initialValue={this.initialValue}\n fields={this.fields}\n width={this.width}\n placeholderText={this.placeholderText}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-location-filter': LocationFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-location-changed': CustomEvent<Record<string, string>>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-location-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof LocationFilterComponent.prototype.initialValue, LocationFilterProps['initialValue']>\n>;\ntype FieldsMatches = Expect<Equals<typeof LocationFilterComponent.prototype.fields, LocationFilterProps['fields']>>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof LocationFilterComponent.prototype.placeholderText, LocationFilterProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof LocationFilterComponent.prototype.width, LocationFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchAutocompleteList(lapis: string, field: string, signal?: AbortSignal) {\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string>>({}, [field]);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n return data.map((item) => item[field]);\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef } from 'preact/hooks';\n\nimport { fetchAutocompleteList } from './fetchAutocompleteList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nexport interface TextInputInnerProps {\n lapisField: string;\n placeholderText: string;\n initialValue: string;\n}\n\nexport interface TextInputProps extends TextInputInnerProps {\n width: string;\n}\n\nexport const TextInput: FunctionComponent<TextInputProps> = ({ width, ...innerProps }) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal'>\n <ResizeContainer size={size}>\n <TextInputInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst TextInputInner: FunctionComponent<TextInputInnerProps> = ({ lapisField, placeholderText, initialValue }) => {\n const lapis = useContext(LapisUrlContext);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data, error, isLoading } = useQuery(() => fetchAutocompleteList(lapis, lapisField), [lapisField, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n const onInput = () => {\n const value = inputRef.current?.value === '' ? undefined : inputRef.current?.value;\n\n if (isValidValue(value)) {\n inputRef.current?.dispatchEvent(\n new CustomEvent('gs-text-input-changed', {\n detail: { [lapisField]: value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n\n const isValidValue = (value: string | undefined) => {\n if (value === undefined) {\n return true;\n }\n return data.includes(value);\n };\n\n return (\n <>\n <input\n type='text'\n class='input input-bordered w-full'\n placeholder={placeholderText !== undefined ? placeholderText : lapisField}\n onInput={onInput}\n ref={inputRef}\n list={lapisField}\n value={initialValue}\n />\n <datalist id={lapisField}>\n {data.map((item) => (\n <option value={item} key={item} />\n ))}\n </datalist>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { TextInput, type TextInputProps } from '../../preact/textInput/text-input';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n *\n * ## Context\n *\n * This component provides a text input field to specify filters for arbitrary fields of this LAPIS instance.\n *\n * @fires {CustomEvent<Record<string, string>>} gs-text-input-changed\n * Fired when the input field is changed.\n * The `details` of this event contain an object with the `lapisField` as key and the input value as value.\n * Example:\n * ```\n * {\n * \"host\": \"Homo sapiens\"\n * }\n * ```\n */\n@customElement('gs-text-input')\nexport class TextInputComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this text input.\n */\n @property()\n initialValue: string = '';\n\n /**\n * Required.\n *\n * The LAPIS field name to use for this text input.\n * The field must exist on this LAPIS instance.\n */\n @property()\n lapisField = '';\n\n /**\n * The placeholder text to display in the input field.\n */\n @property()\n placeholderText: string = '';\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <TextInput\n lapisField={this.lapisField}\n placeholderText={this.placeholderText}\n initialValue={this.initialValue}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-text-input': TextInputComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-text-input-changed': CustomEvent<Record<string, string>>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-text-input': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof TextInputComponent.prototype.initialValue, TextInputProps['initialValue']>\n>;\ntype LapisFieldMatches = Expect<Equals<typeof TextInputComponent.prototype.lapisField, TextInputProps['lapisField']>>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof TextInputComponent.prototype.placeholderText, TextInputProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof TextInputComponent.prototype.width, TextInputProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type ComponentChildren, type FunctionalComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\n\nimport { type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\n\n/**\n * Sometimes the reference genome is not immediately available.\n * This component will display a loading spinner until the reference genome is available.\n * Child components can assume that the reference genome is available on the first render,\n * which e.g. matters for initial values of `useState`.\n */\nexport const ReferenceGenomesAwaiter: FunctionalComponent<{ children: ComponentChildren }> = ({ children }) => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n if (isNotInitialized(referenceGenome)) {\n return <div className='laoding loading-spinner loading-md'>Loading...</div>;\n }\n\n return <>{children}</>;\n};\n\nfunction isNotInitialized(referenceGenome: ReferenceGenome) {\n return referenceGenome.nucleotideSequences.length === 0 && referenceGenome.genes.length === 0;\n}\n","import { useContext } from 'preact/hooks';\n\nimport { isSingleSegmented } from '../../lapisApi/ReferenceGenome';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\nimport Info, { InfoHeadline1, InfoHeadline2, InfoParagraph } from '../components/info';\n\nexport const MutationFilterInfo = () => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const firstGene = referenceGenome.genes[0].name;\n return (\n <Info>\n <InfoHeadline1> Mutation Filter</InfoHeadline1>\n <InfoParagraph>This component allows you to filter for mutations at specific positions.</InfoParagraph>\n\n <InfoHeadline2> Nucleotide Mutations and Insertions</InfoHeadline2>\n {isSingleSegmented(referenceGenome) ? (\n <SingleSegmentedNucleotideMutationsInfo />\n ) : (\n <MultiSegmentedNucleotideMutationsInfo />\n )}\n\n <InfoHeadline2>Amino Acid Mutations and Insertions</InfoHeadline2>\n <InfoParagraph>\n An amino acid mutation has the format <b>&lt;gene&gt;:&lt;position&gt;&lt;base&gt;</b> or\n <b>&lt;gene&gt;:&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. A <b>&lt;base&gt;</b> can be one of\n the 20 amino acid codes. It can also be <b>-</b> for deletion and <b>X</b> for unknown. Example:{' '}\n <b>E:57Q</b>.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_{firstGene}:31:N</b> would filter for sequences with an insertion\n of N between positions 31 and 32 in the gene {firstGene}.\n </InfoParagraph>\n <InfoParagraph>\n This organism has the following genes: {referenceGenome.genes.map((gene) => gene.name).join(', ')}.\n </InfoParagraph>\n\n <InfoHeadline2>Insertion Wildcards</InfoHeadline2>\n <InfoParagraph>\n This component supports insertion queries that contain wildcards <b>?</b>. For example{' '}\n <b>ins_{firstGene}:214:?EP?</b> will match all cases where segment <b>{firstGene}</b> has an insertion\n of <b>EP</b> between the positions <b>214</b> and <b>215</b> but also an insertion of other amino acids\n which include the <b>EP</b>, e.g. the insertion <b>EPE</b> will be matched.\n </InfoParagraph>\n <InfoParagraph>\n You can also use wildcards to match any insertion at a given position. For example{' '}\n <b>ins_{firstGene}:214:?</b> match any (but at least one) insertion between the positions 214 and 215.\n </InfoParagraph>\n\n <InfoHeadline2>Multiple Mutations</InfoHeadline2>\n <InfoParagraph>\n Multiple mutation filters can be provided by adding one mutation after the other.\n </InfoParagraph>\n\n <InfoHeadline2>Any Mutation</InfoHeadline2>\n <InfoParagraph>\n To filter for any mutation at a given position you can omit the <b>&lt;base&gt;</b>. Example:{' '}\n <b>{firstGene}:20</b>.\n </InfoParagraph>\n\n <InfoHeadline2>No Mutation</InfoHeadline2>\n <InfoParagraph>\n You can write a <b>.</b> for the <b>&lt;base&gt;</b> to filter for sequences for which it is confirmed\n that no mutation occurred, i.e. has the same base as the reference genome at the specified position.\n </InfoParagraph>\n </Info>\n );\n};\n\nconst SingleSegmentedNucleotideMutationsInfo = () => {\n return (\n <>\n <InfoParagraph>\n This organism is single-segmented. Thus, nucleotide mutations have the format{' '}\n <b>&lt;position&gt;&lt;base&gt;</b> or <b>&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. The{' '}\n <b>&lt;base_ref&gt;</b> is the reference base at the position. It is optional. A <b>&lt;base&gt;</b> can\n be one of the four nucleotides <b>A</b>, <b>T</b>, <b>C</b>, and <b>G</b>. It can also be <b>-</b> for\n deletion and <b>N</b> for unknown. For example if the reference sequence is <b>A</b> at position{' '}\n <b>23</b> both: <b>23T</b> and <b>A23T</b> will yield the same results.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_1046:A</b> would filter for sequences with an insertion of A\n between the positions 1046 and 1047 in the nucleotide sequence.\n </InfoParagraph>\n </>\n );\n};\n\nconst MultiSegmentedNucleotideMutationsInfo = () => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const firstSegment = referenceGenome.nucleotideSequences[0].name;\n\n return (\n <>\n <InfoParagraph>\n This organism is multi-segmented. Thus, nucleotide mutations have the format{' '}\n <b>&lt;segment&gt;:&lt;position&gt;&lt;base&gt;</b> or{' '}\n <b>&lt;segment&gt;:&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. <b>&lt;base_ref&gt;</b> is the\n reference base at the position. It is optional. A <b>&lt;base&gt;</b> can be one of the four nucleotides{' '}\n <b>A</b>, <b>T</b>, <b>C</b>, and <b>G</b>. It can also be <b>-</b> for deletion and <b>N</b> for\n unknown. For example if the reference sequence is <b>A</b> at position <b>23</b> both:{' '}\n <b>{firstSegment}:23T</b> and <b>{firstSegment}:A23T</b> will yield the same results.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_{firstSegment}:10462:A</b>.\n </InfoParagraph>\n <InfoParagraph>\n This organism has the following segments:{' '}\n {referenceGenome.nucleotideSequences.map((gene) => gene.name).join(', ')}.\n </InfoParagraph>{' '}\n </>\n );\n};\n","import { isSingleSegmented, type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport type { SequenceType } from '../../types';\n\nexport const sequenceTypeFromSegment = (\n possibleSegment: string | undefined,\n referenceGenome: ReferenceGenome,\n): SequenceType | undefined => {\n if (possibleSegment === undefined) {\n return isSingleSegmented(referenceGenome) ? 'nucleotide' : undefined;\n }\n\n if (referenceGenome.nucleotideSequences.some((sequence) => sequence.name === possibleSegment)) {\n return 'nucleotide';\n }\n\n if (referenceGenome.genes.some((gene) => gene.name === possibleSegment)) {\n return 'amino acid';\n }\n return undefined;\n};\n","import { type SelectedFilters } from './mutation-filter';\nimport { sequenceTypeFromSegment } from './sequenceTypeFromSegment';\nimport type { ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { DeletionClass, InsertionClass, SubstitutionClass } from '../../utils/mutations';\n\ntype ParsedMutationFilter = {\n [MutationType in keyof SelectedFilters]: { type: MutationType; value: SelectedFilters[MutationType][number] };\n}[keyof SelectedFilters];\n\nexport const parseAndValidateMutation = (\n value: string,\n referenceGenome: ReferenceGenome,\n): ParsedMutationFilter | null => {\n const possibleInsertion = InsertionClass.parse(value);\n if (possibleInsertion !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleInsertion.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideInsertions', value: possibleInsertion };\n case 'amino acid':\n return { type: 'aminoAcidInsertions', value: possibleInsertion };\n case undefined:\n return null;\n }\n }\n\n const possibleDeletion = DeletionClass.parse(value);\n if (possibleDeletion !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleDeletion.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideMutations', value: possibleDeletion };\n case 'amino acid':\n return { type: 'aminoAcidMutations', value: possibleDeletion };\n case undefined:\n return null;\n }\n }\n\n const possibleSubstitution = SubstitutionClass.parse(value);\n if (possibleSubstitution !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleSubstitution.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideMutations', value: possibleSubstitution };\n case 'amino acid':\n return { type: 'aminoAcidMutations', value: possibleSubstitution };\n case undefined:\n return null;\n }\n }\n\n return null;\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef, useState } from 'preact/hooks';\n\nimport { MutationFilterInfo } from './mutation-filter-info';\nimport { parseAndValidateMutation } from './parseAndValidateMutation';\nimport { type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport {\n type DeletionClass,\n type InsertionClass,\n type MutationClass,\n type SubstitutionClass,\n} from '../../utils/mutations';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { singleGraphColorRGBByName } from '../shared/charts/colors';\n\nexport interface MutationFilterInnerProps {\n initialValue?: SelectedMutationFilterStrings | string[] | undefined;\n}\n\nexport interface MutationFilterProps extends MutationFilterInnerProps {\n width: string;\n}\n\nexport type SelectedFilters = {\n nucleotideMutations: (SubstitutionClass | DeletionClass)[];\n aminoAcidMutations: (SubstitutionClass | DeletionClass)[];\n nucleotideInsertions: InsertionClass[];\n aminoAcidInsertions: InsertionClass[];\n};\n\nexport type SelectedMutationFilterStrings = {\n [Key in keyof SelectedFilters]: string[];\n};\n\nexport const MutationFilter: FunctionComponent<MutationFilterProps> = ({ initialValue, width }) => {\n return (\n <ErrorBoundary size={{ height: '3.375rem', width }} layout='horizontal'>\n <div style={width}>\n <MutationFilterInner initialValue={initialValue} />\n </div>\n </ErrorBoundary>\n );\n};\n\nexport const MutationFilterInner: FunctionComponent<MutationFilterInnerProps> = ({ initialValue }) => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n const [selectedFilters, setSelectedFilters] = useState<SelectedFilters>(\n getInitialState(initialValue, referenceGenome),\n );\n const [inputValue, setInputValue] = useState('');\n const [isError, setIsError] = useState(false);\n const formRef = useRef<HTMLFormElement>(null);\n\n const handleSubmit = (event: Event) => {\n event.preventDefault();\n if (inputValue === '') {\n return;\n }\n\n const parsedMutation = parseAndValidateMutation(inputValue, referenceGenome);\n\n if (parsedMutation === null) {\n setIsError(true);\n return;\n }\n\n const newSelectedValues = {\n ...selectedFilters,\n [parsedMutation.type]: [...selectedFilters[parsedMutation.type], parsedMutation.value],\n };\n\n setSelectedFilters(newSelectedValues);\n fireChangeEvent(newSelectedValues);\n setInputValue('');\n };\n\n const fireChangeEvent = (selectedFilters: SelectedFilters) => {\n const detail = mapToMutationFilterStrings(selectedFilters);\n\n formRef.current?.dispatchEvent(\n new CustomEvent<SelectedMutationFilterStrings>('gs-mutation-filter-changed', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n const handleInputChange = (event: Event) => {\n setInputValue((event.target as HTMLInputElement).value);\n setIsError(false);\n };\n\n return (\n <form className='w-full border boder-gray-300 rounded-md relative' onSubmit={handleSubmit} ref={formRef}>\n <div className='absolute -top-3 -right-3'>\n <MutationFilterInfo />\n </div>\n <div className='w-full flex p-2 flex-wrap items-center'>\n <SelectedMutationDisplay\n selectedFilters={selectedFilters}\n setSelectedFilters={setSelectedFilters}\n fireChangeEvent={fireChangeEvent}\n />\n <div\n className={`w-full flex border ${isError ? 'border-red-500' : 'border-gray-300'} border-solid m-2 text-sm focus-within:border-gray-400 `}\n >\n <input\n className='grow flex-1 p-1 border-none focus:outline-none focus:ring-0'\n type='text'\n value={inputValue}\n onInput={handleInputChange}\n placeholder={getPlaceholder(referenceGenome)}\n />\n <button type='submit' className='btn btn-xs m-1'>\n +\n </button>\n </div>\n </div>\n </form>\n );\n};\n\nfunction getInitialState(\n initialValue: SelectedMutationFilterStrings | string[] | undefined,\n referenceGenome: ReferenceGenome,\n) {\n if (initialValue === undefined) {\n return {\n nucleotideMutations: [],\n aminoAcidMutations: [],\n nucleotideInsertions: [],\n aminoAcidInsertions: [],\n };\n }\n\n const values = Array.isArray(initialValue) ? initialValue : Object.values(initialValue).flatMap((it) => it);\n\n return values.reduce(\n (selectedFilters, value) => {\n const parsedMutation = parseAndValidateMutation(value, referenceGenome);\n if (parsedMutation === null) {\n return selectedFilters;\n }\n\n return {\n ...selectedFilters,\n [parsedMutation.type]: [...selectedFilters[parsedMutation.type], parsedMutation.value],\n };\n },\n {\n nucleotideMutations: [],\n aminoAcidMutations: [],\n nucleotideInsertions: [],\n aminoAcidInsertions: [],\n } as SelectedFilters,\n );\n}\n\nfunction getPlaceholder(referenceGenome: ReferenceGenome) {\n const segmentPrefix =\n referenceGenome.nucleotideSequences.length > 1 ? `${referenceGenome.nucleotideSequences[0].name}:` : '';\n const firstGene = referenceGenome.genes[0].name;\n\n return `Enter a mutation (e.g. ${segmentPrefix}A123T, ins_${segmentPrefix}123:AT, ${firstGene}:M123E, ins_${firstGene}:123:ME)`;\n}\n\nconst SelectedMutationDisplay: FunctionComponent<{\n selectedFilters: SelectedFilters;\n setSelectedFilters: (selectedFilters: SelectedFilters) => void;\n fireChangeEvent: (selectedFilters: SelectedFilters) => void;\n}> = ({ selectedFilters, setSelectedFilters, fireChangeEvent }) => {\n const onSelectedRemoved = <MutationType extends keyof SelectedFilters>(\n mutation: SelectedFilters[MutationType][number],\n key: MutationType,\n ) => {\n const newSelectedValues = {\n ...selectedFilters,\n [key]: selectedFilters[key].filter((i) => !mutation.equals(i)),\n };\n\n setSelectedFilters(newSelectedValues);\n\n fireChangeEvent(newSelectedValues);\n };\n\n return (\n <>\n {selectedFilters.nucleotideMutations.map((mutation) => (\n <SelectedNucleotideMutation\n key={mutation.toString()}\n mutation={mutation}\n onDelete={(mutation: SubstitutionClass | DeletionClass) =>\n onSelectedRemoved(mutation, 'nucleotideMutations')\n }\n />\n ))}\n {selectedFilters.aminoAcidMutations.map((mutation) => (\n <SelectedAminoAcidMutation\n key={mutation.toString()}\n mutation={mutation}\n onDelete={(mutation: SubstitutionClass | DeletionClass) =>\n onSelectedRemoved(mutation, 'aminoAcidMutations')\n }\n />\n ))}\n {selectedFilters.nucleotideInsertions.map((insertion) => (\n <SelectedNucleotideInsertion\n key={insertion.toString()}\n insertion={insertion}\n onDelete={(insertion) => onSelectedRemoved(insertion, 'nucleotideInsertions')}\n />\n ))}\n {selectedFilters.aminoAcidInsertions.map((insertion) => (\n <SelectedAminoAcidInsertion\n key={insertion.toString()}\n insertion={insertion}\n onDelete={(insertion: InsertionClass) => onSelectedRemoved(insertion, 'aminoAcidInsertions')}\n />\n ))}\n </>\n );\n};\n\nconst SelectedAminoAcidInsertion: FunctionComponent<{\n insertion: InsertionClass;\n onDelete: (insertion: InsertionClass) => void;\n}> = ({ insertion, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('teal', 0.3);\n const textColor = singleGraphColorRGBByName('teal', 1);\n return (\n <SelectedFilter\n mutation={insertion}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\nconst SelectedAminoAcidMutation: FunctionComponent<{\n mutation: SubstitutionClass | DeletionClass;\n onDelete: (mutation: SubstitutionClass | DeletionClass) => void;\n}> = ({ mutation, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('rose', 0.3);\n const textColor = singleGraphColorRGBByName('rose', 1);\n return (\n <SelectedFilter\n mutation={mutation}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\nconst SelectedNucleotideMutation: FunctionComponent<{\n mutation: SubstitutionClass | DeletionClass;\n onDelete: (insertion: SubstitutionClass | DeletionClass) => void;\n}> = ({ mutation, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('indigo', 0.3);\n const textColor = singleGraphColorRGBByName('indigo', 1);\n return (\n <SelectedFilter\n mutation={mutation}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\nconst SelectedNucleotideInsertion: FunctionComponent<{\n insertion: InsertionClass;\n onDelete: (insertion: InsertionClass) => void;\n}> = ({ insertion, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('green', 0.3);\n const textColor = singleGraphColorRGBByName('green', 1);\n\n return (\n <SelectedFilter\n mutation={insertion}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\ntype SelectedFilterProps<MutationType extends MutationClass> = {\n mutation: MutationType;\n onDelete: (mutation: MutationType) => void;\n backgroundColor: string;\n textColor: string;\n};\n\nconst SelectedFilter = <MutationType extends MutationClass>({\n mutation,\n onDelete,\n backgroundColor,\n textColor,\n}: SelectedFilterProps<MutationType>) => {\n return (\n <span\n class='inline-block mx-1 px-2 py-1 font-medium text-xs rounded-full'\n style={{ backgroundColor, color: textColor }}\n >\n {mutation.toString()}\n <button className='ml-1' type='button' onClick={() => onDelete(mutation)}>\n ✕\n </button>\n </span>\n );\n};\n\nfunction mapToMutationFilterStrings(selectedFilters: SelectedFilters) {\n return {\n aminoAcidMutations: selectedFilters.aminoAcidMutations.map((mutation) => mutation.toString()),\n nucleotideMutations: selectedFilters.nucleotideMutations.map((mutation) => mutation.toString()),\n aminoAcidInsertions: selectedFilters.aminoAcidInsertions.map((insertion) => insertion.toString()),\n nucleotideInsertions: selectedFilters.nucleotideInsertions.map((insertion) => insertion.toString()),\n };\n}\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { ReferenceGenomesAwaiter } from '../../preact/components/ReferenceGenomesAwaiter';\nimport {\n MutationFilter,\n type MutationFilterProps,\n type SelectedMutationFilterStrings,\n} from '../../preact/mutationFilter/mutation-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n * This component provides an input field to specify filters for nucleotide and amino acid mutations and insertions.\n *\n * Input values have to be provided one at a time and submitted by pressing the Enter key or by clicking the '+' button.\n * After submission, the component validates the input and fires an event with the selected mutations.\n * All previously selected mutations are displayed at the input field and added to the event.\n * Users can remove a mutation by clicking the 'x' button next to the mutation.\n *\n * ## Input Validation\n *\n * Validation of the input is performed according to the following rules:\n *\n * ### Mutations\n *\n * Mutations have to conform to the following format: `<gene/segment>:<symbol at reference><position><Substituted symbol/Deletion>`\n * - Gene/segment: The gene or segment where the mutation occurs. Must be contained in the reference genome.\n * (Optional for elements with only one gene/segment)\n * - Symbol at reference: The symbol at the reference position. (Optional)\n * - Position: The position of the mutation. (Required)\n * - Substituted symbol/Deletion: The substituted symbol or '-' for a deletion. (Required)\n *\n * Examples: `S:614G`, `614G`, `614-`, `614G`\n *\n * ### Insertions\n *\n * Insertions have to conform to the following format: `ins_<gene/segment>:<position>:<Inserted symbols>`\n * - Gene/segment: The gene or segment where the insertion occurs. Must be contained in the reference genome.\n * (Optional for elements with only one gene/segment)\n * - Position: The position of the insertion. (Required)\n * - Inserted symbols: The symbols that are inserted. (Required)\n *\n * Examples: `ins_S:614:G`, `ins_614:G`\n *\n * @fires {CustomEvent<{\n * nucleotideMutations: string[],\n * aminoAcidMutations: string[],\n * nucleotideInsertions: string[],\n * aminoAcidInsertions: string[]\n * }>} gs-mutation-filter-changed\n * Fired when:\n * - The user has submitted a valid mutation or insertion\n * - The user has removed a mutation or insertion\n */\n@customElement('gs-mutation-filter')\nexport class MutationFilterComponent extends PreactLitAdapter {\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * The initial value to use for this mutation filter.\n * All values provided must be valid mutations or insertions.\n * Invalid values will be ignored.\n */\n @property({ type: Object })\n initialValue:\n {\n nucleotideMutations: string[];\n aminoAcidMutations: string[];\n nucleotideInsertions: string[];\n aminoAcidInsertions: string[];\n }\n | string[]\n | undefined = undefined;\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <ReferenceGenomesAwaiter>\n <MutationFilter initialValue={this.initialValue} width={this.width} />\n </ReferenceGenomesAwaiter>\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutation-filter': MutationFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-mutation-filter-changed': CustomEvent<SelectedMutationFilterStrings>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutation-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof MutationFilterComponent.prototype.initialValue, MutationFilterProps['initialValue']>\n>;\ntype WidthMatches = Expect<Equals<typeof MutationFilterComponent.prototype.width, MutationFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchLineageAutocompleteList(lapis: string, field: string, signal?: AbortSignal) {\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string>>({}, [field]);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n return data.flatMap((item) => [item[field], `${item[field]}*`]).sort();\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef } from 'preact/hooks';\n\nimport { fetchLineageAutocompleteList } from './fetchLineageAutocompleteList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nexport interface LineageFilterInnerProps {\n lapisField: string;\n placeholderText: string;\n initialValue: string;\n}\n\nexport interface LineageFilterProps extends LineageFilterInnerProps {\n width: string;\n}\n\nexport const LineageFilter: FunctionComponent<LineageFilterProps> = ({ width, ...innerProps }) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal'>\n <ResizeContainer size={size}>\n <LineageFilterInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst LineageFilterInner: FunctionComponent<LineageFilterInnerProps> = ({\n lapisField,\n placeholderText,\n initialValue,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data, error, isLoading } = useQuery(\n () => fetchLineageAutocompleteList(lapis, lapisField),\n [lapisField, lapis],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n const onInput = () => {\n const value = inputRef.current?.value === '' ? undefined : inputRef.current?.value;\n\n if (isValidValue(value)) {\n inputRef.current?.dispatchEvent(\n new CustomEvent('gs-lineage-filter-changed', {\n detail: { [lapisField]: value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n\n const isValidValue = (value: string | undefined) => {\n if (value === undefined) {\n return true;\n }\n return data.includes(value);\n };\n\n return (\n <>\n <input\n type='text'\n class='input input-bordered w-full'\n placeholder={placeholderText !== undefined ? placeholderText : lapisField}\n onInput={onInput}\n ref={inputRef}\n list={lapisField}\n value={initialValue}\n />\n <datalist id={lapisField}>\n {data.map((item) => (\n <option value={item} key={item} />\n ))}\n </datalist>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { LineageFilter, type LineageFilterProps } from '../../preact/lineageFilter/lineage-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n *\n * ## Context\n *\n * This component provides a text input field to filter by lineages.\n * Currently, it is designed to work well with Pango Lineages,\n * but it may also be used for other lineage types, if suitable.\n *\n * It fetches all available values of the `lapisField` from the LAPIS instance\n * and provides an autocomplete list with the available values of the lineage and sublineage queries\n * (a `*` appended to the lineage value).\n *\n * @fires {CustomEvent<Record<string, string>>} gs-lineage-filter-changed\n * Fired when the input field is changed.\n * The `details` of this event contain an object with the `lapisField` as key and the input value as value.\n * Example:\n * ```\n * {\n * \"pangoLineage\": \"B.1.1.7\"\n * }\n * ```\n */\n@customElement('gs-lineage-filter')\nexport class LineageFilterComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this lineage filter.\n */\n @property()\n initialValue: string = '';\n\n /**\n * Required.\n *\n * The LAPIS field name to use for this lineage filter.\n * The field must exist on this LAPIS instance.\n */\n @property()\n lapisField = '';\n\n /**\n * The placeholder text to display in the input field.\n */\n @property()\n placeholderText: string = '';\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <LineageFilter\n lapisField={this.lapisField}\n placeholderText={this.placeholderText}\n initialValue={this.initialValue}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-lineage-filter': LineageFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-lineage-filter-changed': CustomEvent<Record<string, string>>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-lineage-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.initialValue, LineageFilterProps['initialValue']>\n>;\ntype LapisFieldMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.lapisField, LineageFilterProps['lapisField']>\n>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.placeholderText, LineageFilterProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof LineageFilterComponent.prototype.width, LineageFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { toYYYYMMDD } from './dateConversion';\n\n/**\n * A date range option that can be used in the `gs-date-range-selector` component.\n */\nexport type DateRangeOption = {\n /** The label of the date range option that will be shown to the user */\n label: string;\n /**\n * The start date of the date range in the format `YYYY-MM-DD`.\n * If not set, the date range selector will default to the `earliestDate` property.\n */\n dateFrom?: string;\n /**\n * The end date of the date range in the format `YYYY-MM-DD`.\n * If not set, the date range selector will default to the current date.\n */\n dateTo?: string;\n};\n\nconst today = new Date();\n\nconst twoWeeksAgo = new Date();\ntwoWeeksAgo.setDate(today.getDate() - 14);\n\nconst lastMonth = new Date(today);\nlastMonth.setMonth(today.getMonth() - 1);\n\nconst last2Months = new Date(today);\nlast2Months.setMonth(today.getMonth() - 2);\n\nconst last3Months = new Date(today);\nlast3Months.setMonth(today.getMonth() - 3);\n\nconst last6Months = new Date(today);\nlast6Months.setMonth(today.getMonth() - 6);\n\n/**\n * Presets for the `gs-date-range-selector` component that can be used as `dateRangeOptions`.\n */\nexport const dateRangeOptionPresets = {\n last2Weeks: {\n label: 'Last 2 weeks',\n dateFrom: toYYYYMMDD(twoWeeksAgo),\n },\n lastMonth: {\n label: 'Last month',\n dateFrom: toYYYYMMDD(lastMonth),\n },\n last2Months: {\n label: 'Last 2 months',\n dateFrom: toYYYYMMDD(last2Months),\n },\n last3Months: {\n label: 'Last 3 months',\n dateFrom: toYYYYMMDD(last3Months),\n },\n last6Months: {\n label: 'Last 6 months',\n dateFrom: toYYYYMMDD(last6Months),\n },\n allTimes: {\n label: 'All times',\n },\n} satisfies Record<string, DateRangeOption>;\n"],"names":["t","e","o","s","r","n","S","c","i","h","a","l","p","d","u","f","y","_a","b","z","problemDetail","__decorateClass","property","customElement","D","wrapper","useRef","useEffect","jsx","useState","useMemo","jsxs","createContext","blob","useErrorBoundary","x","item","useContext","heightOfTabs","error","Toolbar","byProportion","maxInData","datasets","getDataset","tooltip","v","padStart","padZoneStr","monthDiff","C.M","absFloor","prettyUnit","C.Y","C.W","C.D","C.DATE","C.H","C.MIN","C.S","C.MS","isUndefined","isDayjs","parseLocale","dayjs","parseDate","C.REGEX_PARSE","m","Dayjs","C.INVALID_DATE_STRING","instanceFactory","instanceFactorySet","C.MILLISECONDS_A_MINUTE","C.MILLISECONDS_A_HOUR","C.MILLISECONDS_A_SECOND","C.FORMAT_DEFAULT","getShort","get$H","matches","C.REGEX_FORMAT","diff","getMonth","C.Q","C.MILLISECONDS_A_WEEK","C.MILLISECONDS_A_DAY","proto","getYearFirstThursday","getCurrentWeekThursday","total","data","granularity","aggregatedResponse","getDatasets","lapisFilter","key","Fragment","MutationOverTimeWorker","today","options","value","selectedFilters","mutation","insertion"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC/KA,MAAM,qBAAqB,UAAU,aAAa;AAClD,MAAM,gCAAgC,UAAU,sBAAsB;AAE/D,MAAe,oBAAf,MAAe,0BAAyB,gBAAgB;AAAA,EAAxD,cAAA;AAAA,UAAA,GAAA,SAAA;AAWa,SAAA,QAAA;AAWmB,SAAA,kBAAA;AAAA,MAC/B,qBAAqB,CAAC;AAAA,MACtB,OAAO,CAAC;AAAA,IAAA;AAAA,EACZ;AAAA,EAES,OAAO,mBAAmC;AAC/C,UAAM,OACDA,oBAAA,gBAAgB,UAAhB,EAAyB,OAAO,KAAK,OAClC,UAAAA,oBAAC,uBAAuB,UAAvB,EAAgC,OAAO,KAAK,iBACxC,UAAK,KAAA,OAAA,GACV,EACJ,CAAA;AAEJ,UAAM,OAAO,iBAAiB;AACvB,WAAA,MAAM,KAAK,UAAU;AAAA,EAChC;AAGJ;AAvCoB,kBAAA,SAAS,CAAC,oBAAoB,6BAA6B;AADxE,IAAe,mBAAf;AAWHP,kBAAA;AAAA,EADC,QAAQ,EAAE,SAAS,cAAc;AAAA,GAVhB,iBAWlB,WAAA,OAAA;AAWAA,kBAAA;AAAA,EADC,QAAQ,EAAE,SAAS,wBAAwB,WAAW,MAAM;AAAA,GArB3C,iBAsBlB,WAAA,iBAAA;ACnCJ,MAAM,mBAAmB,UAAU,WAAW;AAEvC,MAAe,oCAAf,MAAe,0CAAyC,iBAAiB;AAEhF;AADI,kCAAgB,SAAS,CAAC,GAAG,iBAAiB,QAAQ,gBAAgB;AADnE,IAAe,mCAAf;;;;;;;;;;;ACuBM,IAAA,8BAAN,cAA0C,iCAAiC;AAAA,EAA3E,cAAA;AAAA,UAAA,GAAA,SAAA;AAaH,SAAA,eAGM;AAMsC,SAAA,eAAA;AAM5C,SAAA,QAA8B,CAAC,OAAO;AAQtB,SAAA,QAAA;AAQC,SAAA,SAAA;AAOY,SAAA,WAAA;AAAA,EAAA;AAAA,EAEpB,SAAS;AAEV,WAAAO;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,cAAc,KAAK;AAAA,QACnB,cAAc,KAAK;AAAA,QACnB,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AACJ;AApDIP,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,OAAO;AAAA,GAZhB,4BAaT,WAAA,gBAAA,CAAA;AASAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GArBjB,4BAsBT,WAAA,gBAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,OAAO;AAAA,GA3BhB,4BA4BT,WAAA,SAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAnCjB,4BAoCT,WAAA,SAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA3CjB,4BA4CT,WAAA,UAAA,CAAA;AAOAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAlDjB,4BAmDT,WAAA,YAAA,CAAA;AAnDS,8BAAND,kBAAA;AAAA,EADNE,IAAc,wBAAwB;AAAA,GAC1B,2BAAA;AC9BN,SAAS,uBAAuB,MAAwB;AACpD,SAAA,KAAK,IAAI,CAAC,kBAAkB;AACxB,WAAA;AAAA,MACH,WAAW,cAAc;AAAA,MACzB,OAAO,cAAc;AAAA,IAAA;AAAA,EACzB,CACH;AACL;ACNgB,SAAA,sBAAsB,MAAqC,oBAAwC;AACzG,QAAAkB,gBAAe,CAAC,kBAA+C;AACjE,WAAO,cAAc,cAAc,mBAAmB,OAAO,cAAc,cAAc,mBAAmB;AAAA,EAAA;AAGhH,SAAO,KAAK,OAAOA,aAAY,EAAE,IAAI,CAAC,kBAAkB;AAC7C,WAAA;AAAA,MACH,UAAU,cAAc;AAAA,MACxB,MAAM,cAAc;AAAA,MACpB,OAAO,cAAc;AAAA,MACrB,YAAY,cAAc;AAAA,IAAA;AAAA,EAC9B,CACH;AACL;AChBA,MAAM,UAAU;AAEH,MAAA,wBAAwB,CAAC/B,IAAWQ,OAAc;AACrD,QAAA,SAASR,GAAE,MAAM,OAAO;AACxB,QAAA,SAASQ,GAAE,MAAM,OAAO;AAE9B,MAAI,UAAU,QAAQ;AAClB,QAAI,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG;AACzB,aAAO,OAAO,CAAC,EAAE,cAAc,OAAO,CAAC,CAAC;AAAA,IAC5C;AACO,WAAA,SAAS,OAAO,CAAC,GAAG,EAAE,IAAI,SAAS,OAAO,CAAC,GAAG,EAAE;AAAA,EAC3D;AACA,QAAM,IAAI,MAAM,8BAA8BR,EAAC,OAAOQ,EAAC,EAAE;AAC7D;ACPO,MAAM,uBAAuB,CAChC,MACA,cACA,uBACC;AACM,SAAA,qBAAqB,MAAM,YAAY,EAAE,OAAO,CAAC,QAAQ,aAAa,KAAK,kBAAkB,CAAC;AACzG;AAEA,MAAM,uBAAuB,CAAC,MAAqC,iBAA+B;AACxF,QAAA,cAAc,MAAM,YAAY;AAChC,QAAA,kDAAkC;AAClC,QAAA,qCAAqB;AAE3B,aAAW,iBAAiB,MAAM;AACxB,UAAA,YACD,cAAc,SAAS,UAAU,GAAG,cAAc,SAAS,OAAO,MAAM,MACzE,cAAc,SAAS;AAC3B,mBAAe,IAAI,UAAU,cAAc,SAAS,gBAAgB;AAEpE,UAAM,2CAA2C,MAAM;AACnD,UAAI,CAAC,4BAA4B,IAAI,QAAQ,GAAG;AACtC,cAAA,4BAAY;AAClB,oBAAY,QAAQ,CAAC,SAAS,MAAM,IAAI,MAAM,CAAC,CAAC;AAChD,cAAM,IAAI,cAAc,SAAS,kBAAkB,CAAC;AACxB,oCAAA,IAAI,UAAU,KAAK;AAAA,MACnD;AAAA,IAAA;AAEqC;AAEzC,UAAM,oBACF,cAAc,SAAS,iBAAiB,cAAc,SAAS,oBAAoB;AAEvF,UAAM,4BAA4B,MAAM;AAC9B,YAAA,mBAAmB,4BAA4B,IAAI,QAAQ;AAChD,uBAAA,IAAI,mBAAmB,cAAc,UAAU;AAC/C,uBAAA;AAAA,QACb,cAAc,SAAS;AAAA,QACvB,iBAAiB,IAAI,cAAc,SAAS,gBAAgB,IAAK,cAAc;AAAA,MAAA;AAAA,IACnF;AAEsB;EAC9B;AACM,QAAA,qCAAqC,CAAC,GAAG,4BAA4B,QAAS,CAAA,EAC/E,IAAI,CAAC,CAAC,UAAU,iBAAiB,OAAO,EAAE,UAAU,aAAa,oBAAoB,EACrF,KAAK,CAACR,IAAGQ,OAAM;AACZ,WAAO,sBAAsBR,GAAE,UAAUQ,GAAE,QAAQ;AAAA,EAAA,CACtD;AAEE,SAAA,mCAAmC,IAAI,CAAC,iCAAiC;AAC5E,UAAM,cAAc,MAAM,YAAY,EAAE,IAAI,CAAC,SAAS;AAC3C,aAAA;AAAA,QACH,CAAC,IAAI,GAAG;AAAA,UACJ,YAAY,6BAA6B,YAAY,IAAI,IAAI;AAAA,UAC7D,aAAa,SAAS,eAAe,IAAI,6BAA6B,QAAQ;AAAA,QAClF;AAAA,MAAA;AAAA,IACJ,CACH;AAEM,WAAA;AAAA,MACH,UAAU,6BAA6B;AAAA,MACvC,GAAG,YAAY,OAAO,CAAC,KAAK,UAAU,EAAE,GAAG,KAAK,GAAG,SAAS,EAAE;AAAA,IAAA;AAAA,EAClE,CACH;AACL;AAOA,MAAM,eAAe,CAAC,KAA2B,uBAA2C;AACxF,QAAM,wBAAwB,OAAO,OAAO,GAAG,EAAE;AAAA,IAC7C,CACI,SAIC,OAAO,SAAS;AAAA,EAAA;AAGlB,SAAA,sBAAsB,KAAK,CAAC,SAAS;AAEpC,WAAA,CAAC,KAAK,eAAe,KAAK,cAAc,mBAAmB,OAAO,KAAK,cAAc,mBAAmB;AAAA,EAAA,CAE/G;AACL;ACnEO,MAAM,gBAAuD,CAAC;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,aAAa,MAAM;AACd,WAAA;AAAA,MACH;AAAA,QACI,MAAM;AAAA,QACN,MAAM;AAAA,UACF,SAAS,CAACR,IAAWQ,OAAc;AACxB,mBAAA,sBAAsBR,IAAGQ,EAAC;AAAA,UACrC;AAAA,QACJ;AAAA,MACJ;AAAA,MACA,GAAG,gBAAgB;AAAA,IAAA;AAAA,EACvB;AAGJ,QAAM,kBAAkB,MAAM;AAC1B,WAAO,MAAM,YAAY,EAAE,IAAI,CAAC,SAAS;AAC9B,aAAA;AAAA,QACH,MAAM;AAAA,QACN,MAAM;AAAA,UACF,SAAS,CAACR,IAAaQ,OAAgB;AACnC,kBAAM,cAAcR,GAAE;AACtB,kBAAM,cAAcQ,GAAE;AACtB,gBAAI,cAAc,aAAa;AACpB,qBAAA;AAAA,YACX;AACA,gBAAI,cAAc,aAAa;AACpB,qBAAA;AAAA,YACX;AAEO,mBAAA;AAAA,UACX;AAAA,QACJ;AAAA,QACA,WAAW,CAAC,SAAmB,iBAAiB,KAAK,UAAU;AAAA,QAC/D,YAAY,CAAC,MAAgB,QAAa;AAEtC,cAAI,QAAQ,MAAM;AACd,mBAAO;UACX;AAEA,iBAAO,WAAW,IAAI;AAAA,QAC1B;AAAA,MAAA;AAAA,IACJ,CACH;AAAA,EAAA;AAGC,QAAA,aAAa,CAAC,SAAmB;AACnC,QAAI,KAAK,eAAe,KAAK,aAAa,MAAQ;AACvC,aAAA;AAAA,QACH,OAAO;AAAA,UACH,GAAG,WAAW;AAAA,UACd,OAAO;AAAA,QACX;AAAA,MAAA;AAAA,IAER;AACA,WAAO;EAAC;AAGZ,QAAM,YAAYY;AAAAA,IACd,MAAM,qBAAqB,MAAM,cAAc,kBAAkB,EAAE,IAAI,CAAC,QAAQ,OAAO,OAAO,GAAG,CAAC;AAAA,IAClG,CAAC,MAAM,oBAAoB,YAAY;AAAA,EAAA;AAG3C,6BAAQ,OAAM,EAAA,MAAM,WAAW,SAAS,WAAA,GAAc,SAAoB,CAAA;AAC9E;AC1Fa,MAAA,iBAAiB,CAACpB,IAAmBQ,OAAsB;AAChE,MAAAR,GAAE,YAAYQ,GAAE,SAAS;AACzB,WAAO,gBAAgBR,GAAE,SAASQ,GAAE,OAAO;AAAA,EAC/C;AAEI,MAAAR,GAAE,aAAaQ,GAAE,UAAU;AAC3B,WAAO,iBAAiBR,GAAE,UAAUQ,GAAE,QAAQ;AAAA,EAClD;AAEA,SAAOR,GAAE,gBAAgB,cAAcQ,GAAE,eAAe;AAC5D;ACAO,MAAM,kBAA2D,CAAC,EAAE,MAAM,eAAe;AAC5F,QAAM,aAAa,MAAM;AACd,WAAA;AAAA,MACH;AAAA,QACI,MAAM;AAAA,QACN,MAAM;AAAA,UACF,SAAS,CAACR,IAAmBQ,OAAsB;AACxC,mBAAA,eAAeR,IAAGQ,EAAC;AAAA,UAC9B;AAAA,QACJ;AAAA,QACA,WAAW,CAAC,SAAyB,KAAK,SAAS;AAAA,MACvD;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,MAAM;AAAA,MACV;AAAA,IAAA;AAAA,EACJ;AAGE,QAAA,YAAY,uBAAuB,IAAI,EAAE,IAAI,CAAC,QAAQ,OAAO,OAAO,GAAG,CAAC;AAE9E,6BAAQ,OAAM,EAAA,MAAM,WAAW,SAAS,WAAA,GAAc,SAAoB,CAAA;AAC9E;ACnBA,MAAM,iBAAyD,CAAC,EAAE,MAAM,oBAAoB,eAAe;AACvG,QAAM,aAAa,MAAM;AACd,WAAA;AAAA,MACH;AAAA,QACI,MAAM;AAAA,QACN,MAAM;AAAA,UACF,SAAS,CAACR,IAAsCQ,OAAyC;AAC9E,mBAAA,8BAA8BR,IAAGQ,EAAC;AAAA,UAC7C;AAAA,QACJ;AAAA,QACA,WAAW,CAAC,SAA4C,KAAK,SAAS;AAAA,MAC1E;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,MAAM;AAAA,MACV;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,MAAM;AAAA,MACV;AAAA,MACA;AAAA,QACI,MAAM;AAAA,QACN,MAAM;AAAA,QACN,WAAW,CAAC,SAAiB,iBAAiB,IAAI;AAAA,MACtD;AAAA,IAAA;AAAA,EACJ;AAGE,QAAA,YAAY,sBAAsB,MAAM,kBAAkB,EAAE,IAAI,CAAC,QAAQ,OAAO,OAAO,GAAG,CAAC;AAEjG,6BAAQ,OAAM,EAAA,MAAM,WAAW,SAAS,WAAA,GAAc,SAAoB,CAAA;AAC9E;ACzCO,MAAM,wBAA4D;AAAA,EACrE,YACY,QACA,cACV;AAFU,SAAA,SAAA;AACA,SAAA,eAAA;AAAA,EACT;AAAA,EAEH,MAAM,SAAS,UAAkB,QAAwD;AAC/E,UAAA,cAAc,MAAM,gBAAgB,UAAU,KAAK,QAAQ,KAAK,cAAc,MAAM,GAAG;AAEvF,UAAA,UAA4B,WAAW,IAAI,CAAC,EAAE,OAAO,iBAAiB,cAAc,gBAAgB;AAAA,MACtG,MAAM;AAAA,MACN,UAAU,IAAI,eAAe,gBAAgB,QAAW,UAAU,eAAe;AAAA,MACjF;AAAA,IACF,EAAA;AAEF,WAAO,EAAE,QAAQ;AAAA,EACrB;AACJ;ACnBO,SAAS,gBACZ,aACA,cACA,OACA,QACF;AACE,QAAM,YAAY,IAAI,wBAAwB,aAAa,YAAY;AACvE,QAAM,WAAW,IAAI,aAAa,WAAW,CAACR,IAAGQ,OAAM;AACnD,QAAIR,GAAE,SAAS,YAAYQ,GAAE,SAAS,SAAS;AACnC,cAAAR,GAAE,SAAS,WAAW,IAAI,cAAcQ,GAAE,SAAS,WAAW,EAAE;AAAA,IAC5E;AACA,WAAOR,GAAE,SAAS,WAAWQ,GAAE,SAAS;AAAA,EAAA,CAC3C;AACM,SAAA,SAAS,SAAS,OAAO,MAAM;AAC1C;ACPsB,eAAA,mBAClB,aACA,cACA,OACF;AACE,QAAM,4BAA4B,MAAM,8BAA8B,aAAa,cAAc,KAAK,GAAG;AACzG,QAAM,cAAc,MAAM,gBAAgB,aAAa,cAAc,KAAK,GAAG;AAEtE,SAAA;AAAA,IACH;AAAA,IACA;AAAA,EAAA;AAER;AAEgB,SAAA,oBACZ,MACA,mBACA,wBACF;AACE,WAAS,mBAAmB,eAA8B;AAClD,QAAA,cAAc,SAAS,YAAY,QAAW;AACvC,aAAA;AAAA,IACX;AACA,WAAO,kBAAkB;AAAA,MACrB,CAAC,qBACG,iBAAiB,YAAY,cAAc,SAAS,WAAW,iBAAiB;AAAA,IAAA;AAAA,EAE5F;AAEM,QAAA,2BAA2B,CAAC,kBAA+C;AAC7E,WAAO,uBAAuB;AAAA,MAC1B,CAAC,0BACG,sBAAsB,WAAW,sBAAsB,SAAS,cAAc;AAAA,IAAA;AAAA,EACtF;AAGJ,QAAM,mCAAmC,KAAK,yBAAyB,OAAO,kBAAkB;AAEzF,SAAA;AAAA,IACH,YAAY,KAAK,WAAW,OAAO,kBAAkB;AAAA,IACrD,WAAW,iCAAiC,OAAO,wBAAwB;AAAA,IAC3E,UAAU;AAAA,EAAA;AAElB;ACba,MAAA,YAA+C,CAAC,mBAAmB;AACtE,QAAA,EAAE,OAAO,OAAW,IAAA;AACpB,QAAA,OAAO,EAAE,QAAQ;AAGnB,SAAAU,oBAAC,eAAc,EAAA,MACX,UAACA,oBAAA,iBAAA,EAAgB,MACb,UAAAA,oBAAC,gBAAgB,EAAA,GAAG,eAAgB,CAAA,EAAA,CACxC,EACJ,CAAA;AAER;AAEa,MAAA,iBAAoD,CAAC,mBAAmB;AAC3E,QAAA,QAAQS,EAAW,eAAe;AAClC,QAAA,EAAE,aAAa,aAAiB,IAAA;AAEtC,QAAM,EAAE,MAAM,OAAO,UAAU,IAAI,SAAS,YAAY;AAC7C,WAAA,mBAAmB,aAAa,cAAc,KAAK;AAAA,EAC3D,GAAA,CAAC,aAAa,cAAc,KAAK,CAAC;AAErC,MAAI,WAAW;AACX,+BAAQ,gBAAe,CAAA,CAAA;AAAA,EAC3B;AAEA,MAAI,UAAU,MAAM;AACV,UAAA;AAAA,EACV;AAEA,MAAI,SAAS,MAAM;AACf,+BAAQ,eAAc,CAAA,CAAA;AAAA,EAC1B;AAEA,SAAQT,oBAAA,eAAA,EAAc,eAAe,MAAM,wBAAwB,eAAgB,CAAA;AACvF;AAOA,MAAM,gBAAsD,CAAC,EAAE,eAAe,6BAA6B;AACjG,QAAA,CAAC,oBAAoB,qBAAqB,IAAIC,EAAS,EAAE,KAAK,MAAM,KAAK,EAAA,CAAG;AAElF,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,qBAAqB,uBAAuB,YAAY;AAC1G,QAAM,CAAC,wBAAwB,yBAAyB,IAAIA,EAAkC;AAAA,IAC1F,EAAE,OAAO,iBAAiB,SAAS,MAAM,MAAM,eAAe;AAAA,IAC9D,EAAE,OAAO,aAAa,SAAS,MAAM,MAAM,WAAW;AAAA,EAAA,CACzD;AAED,QAAM,eAAe,oBAAoB,eAAe,mBAAmB,sBAAsB;AAE3F,QAAA,SAAS,CAAC,SAAe;AAC3B,YAAQ,MAAM;AAAA,MACV,KAAK;AACM,eAAA;AAAA,UACH,OAAO;AAAA,UACP,SACID;AAAAA,YAAC;AAAA,YAAA;AAAA,cACG,MAAM,aAAa;AAAA,cACnB;AAAA,cACA,UAAU,uBAAuB;AAAA,YAAA;AAAA,UACrC;AAAA,QAAA;AAAA,MAGZ,KAAK;AACM,eAAA;AAAA,UACH,OAAO;AAAA,UACP,SACIA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACG,MAAM,aAAa;AAAA,cACnB,cAAc,uBAAuB;AAAA,cACrC;AAAA,cACA,UAAU,uBAAuB;AAAA,YAAA;AAAA,UACrC;AAAA,QAAA;AAAA,MAGZ,KAAK;AACM,eAAA;AAAA,UACH,OAAO;AAAA,UACP,6BACK,iBAAgB,EAAA,MAAM,aAAa,YAAY,UAAU,uBAAuB,UAAU;AAAA,QAAA;AAAA,IAG3G;AAAA,EAAA;AAGE,QAAA,OAAO,uBAAuB,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAE9D,QAAA,UAAU,CAAC,cACbA;AAAAA,IAACY;AAAAA,IAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAID,SAAAZ,oBAAC,MAAK,EAAA,MAAY,QAAkB,CAAA;AAC/C;AAcA,MAAMY,YAA2C,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,SAEQT,oBAAA,UAAA,EAAA,UAAA;AAAA,IAACH,oBAAA,iBAAA,EAAgB,mBAAsC,qBAA4C,CAAA;AAAA,IAClG,cAAc,WACXA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG;AAAA,QACA;AAAA,MAAA;AAAA,IACJ;AAAA,KAEF,cAAc,WAAW,cAAc,WAEjCG,oBAAA,UAAA,EAAA,UAAA;AAAA,MAAAH;AAAAA,QAAC;AAAA,QAAA;AAAA,UACG;AAAA,UACA,kBAAkB,CAAC,QAAQ,sBAAsB,CAAC,UAAU,EAAE,GAAG,MAAM,IAAA,EAAM;AAAA,UAC7E,kBAAkB,CAAC,QAAQ,sBAAsB,CAAC,UAAU,EAAE,GAAG,MAAM,IAAA,EAAM;AAAA,QAAA;AAAA,MACjF;AAAA,MACAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAU;AAAA,UACV,SAAS,MAAM,sBAAsB,aAAa,WAAW,kBAAkB;AAAA,UAC/E,UAAS;AAAA,QAAA;AAAA,MACb;AAAA,IAAA,GACJ;AAAA,IAEH,cAAc,gBACXA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAU;AAAA,QACV,SAAS,MACL,uBAAuB,aAAa,UAAU,EAAE,IAAI,CAAC,QAAQ;AAClD,iBAAA;AAAA,YACH,WAAW,IAAI,UAAU,SAAS;AAAA,YAClC,OAAO,IAAI;AAAA,UAAA;AAAA,QACf,CACH;AAAA,QAEL,UAAS;AAAA,MAAA;AAAA,IACb;AAAA,IAEJA,oBAAC,iBAAc,wBAAgD;AAAA,wBAC9D,YAAW,EAAA;AAAA,EAChB,EAAA,CAAA;AAER;AAMA,MAAM,gBAAuD,CAAC,EAAE,6BAA6B;AACnF,QAAA,QAAQS,EAAW,eAAe;AAExC,6BACK,MACG,EAAA,UAAA;AAAA,IAAAT,oBAAC,iBAAc,UAAS,YAAA,CAAA;AAAA,wBACvB,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MAC4D;AAAA,MACtEA,oBAAA,UAAA,EAAS,MAAK,yDAAwD,UAAa,iBAAA;AAAA,MAAW;AAAA,MAAE;AAAA,MAChGA,oBAAA,UAAA,EAAS,MAAK,qDAAoD,UAAS,aAAA;AAAA,MAAW;AAAA,MAAK;AAAA,MAC3FA,oBAAA,UAAA,EAAS,MAAK,sDAAqD,UAAU,cAAA;AAAA,MAAW;AAAA,IAAA,GAC7F;AAAA,IACAA,oBAAC,iBAAc,UAAsB,yBAAA,CAAA;AAAA,IACrCA,oBAAC,iBAAc,UAGf,iLAAA,CAAA;AAAA,wBACC,eACG,EAAA,UAAA;AAAA,MAAAA,oBAAC,OAAE,UAAQ,WAAA,CAAA;AAAA,MAAI;AAAA,MAEfG,oBAAC,MAAG,EAAA,WAAU,8BACV,UAAA;AAAA,QAAAH,oBAAC,QAAG,UAAqB,wBAAA,CAAA;AAAA,QACzBA,oBAAC,QAAG,UAAqB,wBAAA,CAAA;AAAA,QACzBA,oBAAC,QAAG,UAAmB,sBAAA,CAAA;AAAA,QACvBA,oBAAC,QAAG,UAAsB,yBAAA,CAAA;AAAA,QAC1BA,oBAAC,QAAG,UAAwC,2CAAA,CAAA;AAAA,MAAA,GAChD;AAAA,MAAK;AAAA,IAAA,GAGT;AAAA,wBACC,mBAAkB,EAAA,eAAc,aAAY,QAAQ,wBAAwB,UAAU,OAAO;AAAA,EAClG,EAAA,CAAA;AAER;;;;;;;;;;;ACvNa,IAAA,qBAAN,cAAiC,iCAAiC;AAAA,EAAlE,cAAA;AAAA,UAAA,GAAA,SAAA;AAOH,SAAA,cAAgE;AAMpB,SAAA,eAAA;AAMC,SAAA,QAAA,CAAC,SAAS,MAAM;AAQ7C,SAAA,QAAA;AAQC,SAAA,SAAA;AAOY,SAAA,WAAA;AAAA,EAAA;AAAA,EAEpB,SAAS;AAEV,WAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,aAAa,KAAK;AAAA,QAClB,cAAc,KAAK;AAAA,QACnB,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AACJ;AAjDIP,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GANjB,mBAOT,WAAA,eAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAZjB,mBAaT,WAAA,gBAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,OAAO;AAAA,GAlBhB,mBAmBT,WAAA,SAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA1BjB,mBA2BT,WAAA,SAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAlCjB,mBAmCT,WAAA,UAAA,CAAA;AAOAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAzCjB,mBA0CT,WAAA,YAAA,CAAA;AA1CS,qBAAND,kBAAA;AAAA,EADNE,IAAc,cAAc;AAAA,GAChB,kBAAA;AChCG,SAAA,+BAA+B,MAA8B,aAAkC;AAC3G,SAAO,KAAK,CAAC,EAAE,QAAQ,IAAI,CAAC,KAAK,cAAc;;AAC3C,UAAM,eAAe,KAChB,IAAI,CAAC,aAAa;AAAA,MACf,CAAC,GAAG,QAAQ,WAAW,aAAa,GAAG,QAAQ,QAAQ,SAAS,EAAE,WAAW,QAAQ,CAAC;AAAA,MACtF,CAAC,GAAG,QAAQ,WAAW,QAAQ,GAAG,QAAQ,QAAQ,SAAS,EAAE;AAAA,IAC/D,EAAA,EACD,OAAO,CAAC,KAAK,SAAS,EAAE,GAAG,KAAK,GAAG,QAAQ,CAAE,CAAA;AAE3C,WAAA;AAAA,MACH,CAAC,WAAW,KAAG,SAAI,cAAJ,mBAAe,eAAc;AAAA,MAC5C,GAAG;AAAA,IAAA;AAAA,EACP,CACH;AACL;ACfgB,SAAA,8BACZb,IACAQ,IACF;AACE,SAAOR,GAAE,cAAc,OACjB,KACAQ,GAAE,cAAc,OACd,IACAR,GAAE,UAAU,WAAW,cAAcQ,GAAE,UAAU,UAAU;AACvE;ACTO,MAAM,cAAN,MAAM,oBAAmB,MAAM;AAAA,EAGlC,YAAY,KAAgF;AACxF,UAAM,GAAG;AACT,SAAK,MAAM;AACX,SAAK,MAAM;AAAA,EACf;AAAA,EAES,aAAa;AACZ,UAAA,aAAa,CAAC,KAAK,KAAK,MAAM,KAAK,KAAK,KAAK,MAAM,KAAK,GAAG;AAEjE,SAAK,QAAQ,WAAW,IAAI,CAAC,WAAW,EAAE,MAAQ,EAAA;AAClD,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,SAAS,OAAuB;AAC5B,QAAI,SAAS,GAAG;AACL,aAAA;AAAA,IACX;AACA,QAAI,SAAS,GAAG;AACL,aAAA;AAAA,IACX;AAEA,WAAO,KAAK,IAAI,SAAS,IAAI,MAAM;AAAA,EACvC;AAAA,EAES,iBAAiB,OAAuB;AAC7C,UAAM,WAAW,KAAK,SAAS,KAAK,GAAG;AACvC,UAAM,WAAW,KAAK,SAAS,KAAK,GAAG;AAEjC,UAAA,aAAa,KAAK,SAAS,KAAK;AAEhC,UAAA,WAAW,aAAa,aAAa,WAAW;AAE/C,WAAA,KAAK,mBAAmB,OAAO;AAAA,EAC1C;AACJ;AApCI,YAAO,KAAK;AADT,IAAM,aAAN;ACAP,MAAM,YAAY;AAAA,EACd,QAAQ,CAAC,IAAI,IAAI,GAAG;AAAA,EACpB,OAAO,CAAC,IAAI,KAAK,EAAE;AAAA,EACnB,MAAM,CAAC,KAAK,KAAK,GAAG;AAAA,EACpB,MAAM,CAAC,IAAI,KAAK,GAAG;AAAA,EACnB,OAAO,CAAC,KAAK,KAAK,EAAE;AAAA,EACpB,MAAM,CAAC,KAAK,KAAK,GAAG;AAAA,EACpB,MAAM,CAAC,KAAK,KAAK,GAAG;AAAA,EACpB,MAAM,CAAC,KAAK,IAAI,EAAE;AAAA,EAClB,QAAQ,CAAC,KAAK,IAAI,GAAG;AACzB;AAIO,MAAM,2BAA2B,CAAC,IAAY,QAAQ,MAAM;AACzD,QAAA,OAAO,OAAO,KAAK,SAAS;AAClC,QAAM,MAAM,KAAK,KAAK,KAAK,MAAM;AAE1B,SAAA,QAAQ,UAAU,GAAG,EAAE,KAAK,GAAG,CAAC,IAAI,KAAK;AACpD;AAEO,MAAM,4BAA4B,CAAC,MAAkB,QAAQ,MAAM;AAC/D,SAAA,QAAQ,UAAU,IAAI,EAAE,KAAK,GAAG,CAAC,IAAI,KAAK;AACrD;AClBgB,SAAA,kCAAkC,UAAkB,QAAgB;AAChF,QAAMN,KAAI,WAAW;AACrB,QAAMP,KAAI;AACV,QAAMc,KAAI;AAEV,QAAM,YAAYP,KAAKO,KAAIA,MAAM,IAAId;AACrC,QAAM,eAAec,KAAI,KAAK,KAAMP,MAAK,IAAIA,MAAMP,KAAKc,KAAIA,MAAM,KAAKd,KAAIA,IAAG;AACxE,QAAA,cAAc,IAAKc,KAAIA,KAAKd;AAE3B,SAAA;AAAA,IACH,aAAa,YAAY,gBAAgB;AAAA,IACzC,aAAa,YAAY,gBAAgB;AAAA,EAAA;AAEjD;AAEO,MAAM,8BAA8B,CACvC,OACA,YACA,YACA,WACC;AACD,QAAM,QAAQ,SAAS,GAAG,MAAM,OAAO;AAEvC,SAAO,GAAG,KAAK,GAAG,MAAM,QAAQ,CAAC,CAAC,KAAK,yCAAY,QAAQ,EAAE,MAAM,yCAAY,QAAQ,EAAE;AAC7F;ACxBa,MAAA,cAAc,CAACqC,YAAmB,YAAsB;AACjE,MAAI,CAAC,SAAS;AACH,WAAA;AAAA,EACX;AAEA,UAAQ,SAAS;AAAA,IACb,KAAK,YAAY;AACN,aAAAA,aAAY,IAAI,IAAIA;AAAA,IAC/B;AAAA,IACA,KAAK,aAAa;AACP,aAAAA;AAAA,IACX;AAAA,IACA,SAAS;AACE,aAAA;AAAA,IACX;AAAA,EACJ;AACJ;ACrBO,SAAS,cAAc,WAAsB;AAChD,UAAQ,WAAW;AAAA,IACf,KAAK,UAAU;AACJ,aAAA,EAAE,aAAa,MAAM,MAAM,UAAmB,KAAK,GAAG,KAAK;IACtE;AAAA,IACA,KAAK,eAAe;AAChB,aAAO,EAAE,MAAM,eAAwB,KAAK,EAAE;AAAA,IAClD;AAAA,IACA,KAAK;AACM,aAAA,EAAE,MAAM;EACvB;AACJ;ACYA,MAAM,SAAS,GAAG,eAAe,YAAY,4BAA4B,eAAe;AAExF,MAAM,6BAA6B,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAuC;AACnC,QAAM,gBAAgB,KACjB,OAAO,CAAC,2BAA2B,uBAAuB,QAAQ,SAAS,CAAC,EAC5E,IAAI,CAAC,gBAAgB;AACX,WAAA;AAAA,MACH,SAAS,YAAY,QAAQ,KAAK,6BAA6B;AAAA,MAC/D,aAAa,YAAY;AAAA,IAAA;AAAA,EAC7B,CACH;AAED,MAAA,cAAc,WAAW,GAAG;AAC5B,+BAAQ,eAAc,CAAA,CAAA;AAAA,EAC1B;AAEM,QAAAC,YAAW,cAAc,IAAI,CAAC,WAAW,UAAUC,aAAW,WAAW,OAAO,wBAAwB,CAAC;AAEzG,QAAA,OACF,mBAAmB,UACb,YAAY,UAAU,aAAa,GAAG,iDAAiB,eAAe,IACtE;AAEV,QAAM,SAA6B;AAAA,IAC/B,MAAM,2BAA2B;AAAA,IACjC,MAAM;AAAA,MACF,UAAAD;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,MACL,qBAAqB;AAAA,MACrB,WAAW;AAAA,MACX,QAAQ;AAAA,QACJ,GAAG,EAAE,GAAG,cAAc,cAAc,GAAG,KAAK,KAAK;AAAA,MACrD;AAAA,MACA,SAAS;AAAA,QACL,QAAQ;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,SAASE,UAAQ,wBAAwB;AAAA,MAC7C;AAAA,IACJ;AAAA,EAAA;AAGG,SAAAjB,oBAAC,SAAQ,EAAA,eAAe,OAAQ,CAAA;AAC3C;AAEA,MAAMgB,eAAa,CACf,2BACA,OACA,6BASC;AACM,SAAA;AAAA,IACH,aAAa;AAAA,IACb,OAAO,0BAA0B;AAAA,IACjC,iBAAiB,yBAAyB,OAAO,GAAG;AAAA,IACpD,aAAa,yBAAyB,KAAK;AAAA,IAC3C,MAAM,0BAA0B,QAAQ,IAAI,aAAa,wBAAwB,CAAC;AAAA,EAAA;AAE1F;AAEA,MAAM,eAAe,CAAC,6BAAuD;AACzE,SAAO,CAAC,cAAkD;;AAChD,UAAA,qBAAqB,sBAAsB,WAAW,wBAAwB;AAC7E,WAAA;AAAA,MACH,GAAG,UAAU;AAAA,MACb,MAAM,mBAAmB;AAAA,MACzB,MAAM,mBAAmB;AAAA,MACzB,KAAG,eAAU,cAAV,mBAAqB,eAAc;AAAA,IAAA;AAAA,EAC1C;AAER;AAEA,MAAM,wBAAwB,CAC1B,WACA,6BACC;AACD,UAAQ,0BAA0B;AAAA,IAC9B,KAAK;AACD,aAAO,kCAAkC,UAAU,OAAO,UAAU,KAAK;AAAA,IAC7E;AACI,aAAO,EAAE,YAAY,QAAW,YAAY,OAAU;AAAA,EAC9D;AACJ;AAEA,MAAMC,YAAU,CAAC,6BAAuD;AACpE,QAAM,gBAAgB;AAAA,IAClB,MAAM;AAAA,IACN,WAAW;AAAA,EAAA;AAGf,UAAQ,0BAA0B;AAAA,IAC9B,KAAK;AACM,aAAA;AAAA,QACH,GAAG;AAAA,QACH,WAAW;AAAA,UACP,OAAO,CAAC,YAA6C;AACjD,kBAAM,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,SAAS;AAM7C,mBAAA,GAAG,QAAQ,QAAQ,KAAK,KAAK,MAAM,EAAE,QAAQ,CAAC,CAAC,KAAK,MAAM,KAAK,QAAQ,CAAC,CAAC,MAAM,MAAM,KAAK,QAAQ,CAAC,CAAC;AAAA,UAC/G;AAAA,QACJ;AAAA,MAAA;AAAA,IAER;AACW,aAAA;AAAA,EACf;AACJ;ACnJO,IAAI,mBAAmB;AACvB,IAAI,iBAAiB,mBAAmB;AACxC,IAAI,gBAAgB,iBAAiB;AACrC,IAAI,iBAAiB,gBAAgB;AACrC,IAAI,wBAAwB;AAC5B,IAAI,wBAAwB,mBAAmB;AAC/C,IAAI,sBAAsB,iBAAiB;AAC3C,IAAI,qBAAqB,gBAAgB;AACzC,IAAI,sBAAsB,iBAAiB;AAE3C,IAAI,KAAK;AACT,IAAI,IAAI;AACR,IAAI,MAAM;AACV,IAAI,IAAI;AACR,IAAI,IAAI;AACR,IAAI,IAAI;AACR,IAAI,IAAI;AACR,IAAI,IAAI;AACR,IAAI,IAAI;AACR,IAAI,OAAO;AACX,IAAI,iBAAiB;AACrB,IAAI,sBAAsB;AAE1B,IAAI,cAAc;AAClB,IAAI,eAAe;ACtB1B,MAAe,KAAA;AAAA,EACb,MAAM;AAAA,EACN,UAAU,2DAA2D,MAAM,GAAG;AAAA,EAC9E,QAAQ,wFAAwF,MAAM,GAAG;AAAA,EACzG,SAAS,SAAS,QAAQxC,IAAG;AAC3B,QAAIF,KAAI,CAAC,MAAM,MAAM,MAAM,IAAI;AAC/B,QAAI2C,KAAIzC,KAAI;AACZ,WAAO,MAAMA,MAAKF,IAAG2C,KAAI,MAAM,EAAE,KAAK3C,GAAE2C,EAAC,KAAK3C,GAAE,CAAC,KAAK;AAAA,EACvD;AACH;ACTA,IAAI,WAAW,SAAS4C,UAAS,QAAQ,QAAQ,KAAK;AACpD,MAAI5C,KAAI,OAAO,MAAM;AACrB,MAAI,CAACA,MAAKA,GAAE,UAAU,OAAQ,QAAO;AACrC,SAAO,KAAK,MAAM,SAAS,IAAIA,GAAE,MAAM,EAAE,KAAK,GAAG,IAAI;AACvD;AAEA,IAAI,aAAa,SAAS6C,YAAW,UAAU;AAC7C,MAAI,aAAa,CAAC,SAAS;AAC3B,MAAI,UAAU,KAAK,IAAI,UAAU;AACjC,MAAI,aAAa,KAAK,MAAM,UAAU,EAAE;AACxC,MAAI,eAAe,UAAU;AAC7B,UAAa,cAAc,IAAI,MAAM,OAAO,SAAS,YAAY,GAAG,GAAG,IAAI,MAAM,SAAS,cAAc,GAAG,GAAG;AAChH;AAEA,IAAI,YAAY,SAASC,WAAUvC,IAAGQ,IAAG;AAEvC,MAAIR,GAAE,KAAM,IAAGQ,GAAE,OAAQ,QAAO,CAAC+B,WAAU/B,IAAGR,EAAC;AAC/C,MAAI,kBAAkBQ,GAAE,KAAM,IAAGR,GAAE,KAAI,KAAM,MAAMQ,GAAE,MAAK,IAAKR,GAAE,MAAO;AACxE,MAAI,SAASA,GAAE,MAAK,EAAG,IAAI,gBAAgBwC,CAAG;AAC9C,MAAI3C,KAAIW,KAAI,SAAS;AACrB,MAAI,UAAUR,GAAE,MAAK,EAAG,IAAI,kBAAkBH,KAAI,KAAK,IAAI2C,CAAG;AAC9D,SAAO,EAAE,EAAE,kBAAkBhC,KAAI,WAAWX,KAAI,SAAS,UAAU,UAAU,YAAY;AAC3F;AAEA,IAAI,WAAW,SAAS4C,UAAS9C,IAAG;AAClC,SAAOA,KAAI,IAAI,KAAK,KAAKA,EAAC,KAAK,IAAI,KAAK,MAAMA,EAAC;AACjD;AAEA,IAAI,aAAa,SAAS+C,YAAWtC,IAAG;AACtC,MAAI,UAAU;AAAA,IACZ;AAAA,IACA,GAAGuC;AAAAA,IACH,GAAGC;AAAAA,IACH,GAAGC;AAAAA,IACH,GAAGC;AAAAA,IACH,GAAGC;AAAAA,IACH,GAAGC;AAAAA,IACH,GAAGC;AAAAA,IACH,IAAIC;AAAAA,IACJ;AAAA,EACJ;AACE,SAAO,QAAQ9C,EAAC,KAAK,OAAOA,MAAK,EAAE,EAAE,cAAc,QAAQ,MAAM,EAAE;AACrE;AAEA,IAAI,cAAc,SAAS+C,aAAY1D,IAAG;AACxC,SAAOA,OAAM;AACf;AAEA,MAAe,IAAA;AAAA,EACb,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;ACtDA,IAAI,IAAI;AAER,IAAI,KAAK,CAAA;AAET,GAAG,CAAC,IAAI;AACR,IAAI,WAAW;AAEf,IAAI,UAAU,SAAS2D,SAAQjD,IAAG;AAChC,SAAOA,cAAa,SAAS,CAAC,EAAEA,MAAKA,GAAE,QAAQ;AACjD;AAEA,IAAI,cAAc,SAASkD,aAAY,QAAQ,QAAQ,SAAS;AAC9D,MAAIpD;AACJ,MAAI,CAAC,OAAQ,QAAO;AAEpB,MAAI,OAAO,WAAW,UAAU;AAC9B,QAAI,cAAc,OAAO;AAEzB,QAAI,GAAG,WAAW,GAAG;AACnB,MAAAA,KAAI;AAAA,IACL;AAED,QAAI,QAAQ;AACV,SAAG,WAAW,IAAI;AAClB,MAAAA,KAAI;AAAA,IACL;AAED,QAAI,cAAc,OAAO,MAAM,GAAG;AAElC,QAAI,CAACA,MAAK,YAAY,SAAS,GAAG;AAChC,aAAOoD,aAAY,YAAY,CAAC,CAAC;AAAA,IAClC;AAAA,EACL,OAAS;AACL,QAAI,OAAO,OAAO;AAClB,OAAG,IAAI,IAAI;AACX,IAAApD,KAAI;AAAA,EACL;AAED,MAAI,CAAC,WAAWA,GAAG,KAAIA;AACvB,SAAOA,MAAK,CAAC,WAAW;AAC1B;AAEA,IAAI,QAAQ,SAASqD,OAAM,MAAMzD,IAAG;AAClC,MAAI,QAAQ,IAAI,GAAG;AACjB,WAAO,KAAK;EACb;AAGD,MAAI,MAAM,OAAOA,OAAM,WAAWA,KAAI,CAAA;AACtC,MAAI,OAAO;AACX,MAAI,OAAO;AAEX,SAAO,IAAI,MAAM,GAAG;AACtB;AAEA,IAAI,UAAU,SAASkB,SAAQ,MAAM,UAAU;AAC7C,SAAO,MAAM,MAAM;AAAA,IACjB,QAAQ,SAAS;AAAA,IACjB,KAAK,SAAS;AAAA,IACd,GAAG,SAAS;AAAA,IACZ,SAAS,SAAS;AAAA;AAAA,EAEtB,CAAG;AACH;AAEA,IAAI,QAAQ;AAEZ,MAAM,IAAI;AACV,MAAM,IAAI;AACV,MAAM,IAAI;AAEV,IAAI,YAAY,SAASwC,WAAU,KAAK;AACtC,MAAI,OAAO,IAAI,MACX,MAAM,IAAI;AACd,MAAI,SAAS,KAAM,QAAO,oBAAI,KAAK,GAAG;AAEtC,MAAI,MAAM,EAAE,IAAI,EAAG,QAAO,oBAAI,KAAI;AAElC,MAAI,gBAAgB,KAAM,QAAO,IAAI,KAAK,IAAI;AAE9C,MAAI,OAAO,SAAS,YAAY,CAAC,MAAM,KAAK,IAAI,GAAG;AACjD,QAAIpD,KAAI,KAAK,MAAMqD,WAAa;AAEhC,QAAIrD,IAAG;AACL,UAAIsD,KAAItD,GAAE,CAAC,IAAI,KAAK;AACpB,UAAI,MAAMA,GAAE,CAAC,KAAK,KAAK,UAAU,GAAG,CAAC;AAErC,UAAI,KAAK;AACP,eAAO,IAAI,KAAK,KAAK,IAAIA,GAAE,CAAC,GAAGsD,IAAGtD,GAAE,CAAC,KAAK,GAAGA,GAAE,CAAC,KAAK,GAAGA,GAAE,CAAC,KAAK,GAAGA,GAAE,CAAC,KAAK,GAAG,EAAE,CAAC;AAAA,MAClF;AAED,aAAO,IAAI,KAAKA,GAAE,CAAC,GAAGsD,IAAGtD,GAAE,CAAC,KAAK,GAAGA,GAAE,CAAC,KAAK,GAAGA,GAAE,CAAC,KAAK,GAAGA,GAAE,CAAC,KAAK,GAAG,EAAE;AAAA,IACxE;AAAA,EACF;AAED,SAAO,IAAI,KAAK,IAAI;AACtB;AAEA,IAAI,QAAqB,2BAAY;AACnC,WAASuD,OAAM,KAAK;AAClB,SAAK,KAAK,YAAY,IAAI,QAAQ,MAAM,IAAI;AAC5C,SAAK,MAAM,GAAG;AAEd,SAAK,KAAK,KAAK,MAAM,IAAI,KAAK;AAC9B,SAAK,QAAQ,IAAI;AAAA,EAClB;AAED,MAAI,SAASA,OAAM;AAEnB,SAAO,QAAQ,SAAS,MAAM,KAAK;AACjC,SAAK,KAAK,UAAU,GAAG;AACvB,SAAK,KAAI;AAAA,EACb;AAEE,SAAO,OAAO,SAAS,OAAO;AAC5B,QAAI,KAAK,KAAK;AACd,SAAK,KAAK,GAAG;AACb,SAAK,KAAK,GAAG;AACb,SAAK,KAAK,GAAG;AACb,SAAK,KAAK,GAAG;AACb,SAAK,KAAK,GAAG;AACb,SAAK,KAAK,GAAG;AACb,SAAK,KAAK,GAAG;AACb,SAAK,MAAM,GAAG;EACf;AAGD,SAAO,SAAS,SAAS,SAAS;AAChC,WAAO;AAAA,EACX;AAEE,SAAO,UAAU,SAAS,UAAU;AAClC,WAAO,EAAE,KAAK,GAAG,SAAU,MAAKC;AAAAA,EACpC;AAEE,SAAO,SAAS,SAAS,OAAO,MAAM,OAAO;AAC3C,QAAI,QAAQ,MAAM,IAAI;AACtB,WAAO,KAAK,QAAQ,KAAK,KAAK,SAAS,SAAS,KAAK,MAAM,KAAK;AAAA,EACpE;AAEE,SAAO,UAAU,SAAS,QAAQ,MAAM,OAAO;AAC7C,WAAO,MAAM,IAAI,IAAI,KAAK,QAAQ,KAAK;AAAA,EAC3C;AAEE,SAAO,WAAW,SAAS,SAAS,MAAM,OAAO;AAC/C,WAAO,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI;AAAA,EACzC;AAEE,SAAO,KAAK,SAAS,GAAG,OAAO,KAAK,KAAK;AACvC,QAAI,MAAM,EAAE,KAAK,EAAG,QAAO,KAAK,GAAG;AACnC,WAAO,KAAK,IAAI,KAAK,KAAK;AAAA,EAC9B;AAEE,SAAO,OAAO,SAAS,OAAO;AAC5B,WAAO,KAAK,MAAM,KAAK,QAAS,IAAG,GAAI;AAAA,EAC3C;AAEE,SAAO,UAAU,SAAS,UAAU;AAElC,WAAO,KAAK,GAAG;EACnB;AAEE,SAAO,UAAU,SAAS,QAAQ,OAAO,UAAU;AACjD,QAAI,QAAQ;AAGZ,QAAI,YAAY,CAAC,MAAM,EAAE,QAAQ,IAAI,WAAW;AAChD,QAAI,OAAO,MAAM,EAAE,KAAK;AAExB,QAAI,kBAAkB,SAASC,iBAAgBzD,IAAGsD,IAAG;AACnD,UAAI,MAAM,MAAM,EAAE,MAAM,KAAK,KAAK,IAAI,MAAM,IAAIA,IAAGtD,EAAC,IAAI,IAAI,KAAK,MAAM,IAAIsD,IAAGtD,EAAC,GAAG,KAAK;AACvF,aAAO,YAAY,MAAM,IAAI,MAAM0C,CAAG;AAAA,IAC5C;AAEI,QAAI,qBAAqB,SAASgB,oBAAmB,QAAQ,OAAO;AAClE,UAAI,gBAAgB,CAAC,GAAG,GAAG,GAAG,CAAC;AAC/B,UAAI,cAAc,CAAC,IAAI,IAAI,IAAI,GAAG;AAClC,aAAO,MAAM,EAAE,MAAM,OAAQ,EAAC,MAAM,EAAE;AAAA;AAAA,QACtC,MAAM,OAAO,GAAG;AAAA,SAAI,YAAY,gBAAgB,aAAa,MAAM,KAAK;AAAA,MAAC,GAAG,KAAK;AAAA,IACvF;AAEI,QAAI,KAAK,KAAK,IACV,KAAK,KAAK,IACV,KAAK,KAAK;AACd,QAAI,SAAS,SAAS,KAAK,KAAK,QAAQ;AAExC,YAAQ,MAAI;AAAA,MACV,KAAKlB;AACH,eAAO,YAAY,gBAAgB,GAAG,CAAC,IAAI,gBAAgB,IAAI,EAAE;AAAA,MAEnE,KAAKH;AACH,eAAO,YAAY,gBAAgB,GAAG,EAAE,IAAI,gBAAgB,GAAG,KAAK,CAAC;AAAA,MAEvE,KAAKI,GACH;AACE,YAAI,YAAY,KAAK,QAAO,EAAG,aAAa;AAC5C,YAAI,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM;AAC3C,eAAO,gBAAgB,YAAY,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE;AAAA,MACjE;AAAA,MAEH,KAAKC;AAAAA,MACL,KAAKC;AACH,eAAO,mBAAmB,SAAS,SAAS,CAAC;AAAA,MAE/C,KAAKC;AACH,eAAO,mBAAmB,SAAS,WAAW,CAAC;AAAA,MAEjD,KAAKC;AACH,eAAO,mBAAmB,SAAS,WAAW,CAAC;AAAA,MAEjD,KAAKC;AACH,eAAO,mBAAmB,SAAS,gBAAgB,CAAC;AAAA,MAEtD;AACE,eAAO,KAAK;IACf;AAAA,EACL;AAEE,SAAO,QAAQ,SAAS,MAAM,KAAK;AACjC,WAAO,KAAK,QAAQ,KAAK,KAAK;AAAA,EAClC;AAEE,SAAO,OAAO,SAAS,KAAK,OAAO,MAAM;AACvC,QAAI;AAGJ,QAAI,OAAO,MAAM,EAAE,KAAK;AACxB,QAAI,SAAS,SAAS,KAAK,KAAK,QAAQ;AACxC,QAAI,QAAQ,wBAAwB,IAAI,sBAAsBJ,CAAG,IAAI,SAAS,QAAQ,sBAAsBC,IAAM,IAAI,SAAS,QAAQ,sBAAsBN,CAAG,IAAI,SAAS,SAAS,sBAAsBG,CAAG,IAAI,SAAS,YAAY,sBAAsBI,CAAG,IAAI,SAAS,SAAS,sBAAsBC,GAAK,IAAI,SAAS,WAAW,sBAAsBC,CAAG,IAAI,SAAS,WAAW,sBAAsBC,EAAI,IAAI,SAAS,gBAAgB,uBAAuB,IAAI;AAC7c,QAAI,MAAM,SAASL,IAAM,KAAK,MAAM,OAAO,KAAK,MAAM;AAEtD,QAAI,SAASL,KAAO,SAASG,GAAK;AAEhC,UAAI,OAAO,KAAK,MAAK,EAAG,IAAIG,MAAQ,CAAC;AACrC,WAAK,GAAG,IAAI,EAAE,GAAG;AACjB,WAAK,KAAI;AACT,WAAK,KAAK,KAAK,IAAIA,MAAQ,KAAK,IAAI,KAAK,IAAI,KAAK,YAAW,CAAE,CAAC,EAAE;AAAA,IACxE,WAAe,KAAM,MAAK,GAAG,IAAI,EAAE,GAAG;AAElC,SAAK,KAAI;AACT,WAAO;AAAA,EACX;AAEE,SAAO,MAAM,SAAS,IAAI,QAAQ,OAAO;AACvC,WAAO,KAAK,MAAO,EAAC,KAAK,QAAQ,KAAK;AAAA,EAC1C;AAEE,SAAO,MAAM,SAAS,IAAI,MAAM;AAC9B,WAAO,KAAK,MAAM,EAAE,IAAI,CAAC,EAAC;AAAA,EAC9B;AAEE,SAAO,MAAM,SAAS,IAAI,QAAQ,OAAO;AACvC,QAAI,SAAS,MACT;AAEJ,aAAS,OAAO,MAAM;AAEtB,QAAI,OAAO,MAAM,EAAE,KAAK;AAExB,QAAI,qBAAqB,SAASe,oBAAmBlE,IAAG;AACtD,UAAIQ,KAAI,MAAM,MAAM;AACpB,aAAO,MAAM,EAAEA,GAAE,KAAKA,GAAE,KAAI,IAAK,KAAK,MAAMR,KAAI,MAAM,CAAC,GAAG,MAAM;AAAA,IACtE;AAEI,QAAI,SAAS6C,GAAK;AAChB,aAAO,KAAK,IAAIA,GAAK,KAAK,KAAK,MAAM;AAAA,IACtC;AAED,QAAI,SAASG,GAAK;AAChB,aAAO,KAAK,IAAIA,GAAK,KAAK,KAAK,MAAM;AAAA,IACtC;AAED,QAAI,SAASE,GAAK;AAChB,aAAO,mBAAmB,CAAC;AAAA,IAC5B;AAED,QAAI,SAASD,GAAK;AAChB,aAAO,mBAAmB,CAAC;AAAA,IAC5B;AAED,QAAI,QAAQ,sBAAsB,CAAA,GAAI,oBAAoBI,GAAK,IAAIc,uBAAyB,oBAAoBf,CAAG,IAAIgB,qBAAuB,oBAAoBd,CAAG,IAAIe,uBAAyB,qBAAqB,IAAI,KAAK;AAEhO,QAAI,gBAAgB,KAAK,GAAG,QAAS,IAAG,SAAS;AACjD,WAAO,MAAM,EAAE,eAAe,IAAI;AAAA,EACtC;AAEE,SAAO,WAAW,SAAS,SAAS,QAAQ,QAAQ;AAClD,WAAO,KAAK,IAAI,SAAS,IAAI,MAAM;AAAA,EACvC;AAEE,SAAO,SAAS,SAAS,OAAO,WAAW;AACzC,QAAI,SAAS;AAEb,QAAI,SAAS,KAAK;AAClB,QAAI,CAAC,KAAK,QAAO,EAAI,QAAO,OAAO,eAAeL;AAClD,QAAI,MAAM,aAAaM;AACvB,QAAI,UAAU,MAAM,EAAE,IAAI;AAC1B,QAAI,KAAK,KAAK,IACV,KAAK,KAAK,IACV,KAAK,KAAK;AACd,QAAI,WAAW,OAAO,UAClB,SAAS,OAAO,QAChB,WAAW,OAAO;AAEtB,QAAI,WAAW,SAASC,UAAS,KAAK,OAAO,MAAM,QAAQ;AACzD,aAAO,QAAQ,IAAI,KAAK,KAAK,IAAI,QAAQ,GAAG,MAAM,KAAK,KAAK,EAAE,MAAM,GAAG,MAAM;AAAA,IACnF;AAEI,QAAI,QAAQ,SAASC,OAAM,KAAK;AAC9B,aAAO,MAAM,EAAE,KAAK,MAAM,IAAI,KAAK,GAAG;AAAA,IAC5C;AAEI,QAAI,eAAe,YAAY,SAAU,MAAM,QAAQ,aAAa;AAClE,UAAIV,KAAI,OAAO,KAAK,OAAO;AAC3B,aAAO,cAAcA,GAAE,YAAW,IAAKA;AAAA,IAC7C;AAEI,QAAI,UAAU,SAASW,SAAQ,OAAO;AACpC,cAAQ,OAAK;AAAA,QACX,KAAK;AACH,iBAAO,OAAO,OAAO,EAAE,EAAE,MAAM,EAAE;AAAA,QAEnC,KAAK;AACH,iBAAO,MAAM,EAAE,OAAO,IAAI,GAAG,GAAG;AAAA,QAElC,KAAK;AACH,iBAAO,KAAK;AAAA,QAEd,KAAK;AACH,iBAAO,MAAM,EAAE,KAAK,GAAG,GAAG,GAAG;AAAA,QAE/B,KAAK;AACH,iBAAO,SAAS,OAAO,aAAa,IAAI,QAAQ,CAAC;AAAA,QAEnD,KAAK;AACH,iBAAO,SAAS,QAAQ,EAAE;AAAA,QAE5B,KAAK;AACH,iBAAO,OAAO;AAAA,QAEhB,KAAK;AACH,iBAAO,MAAM,EAAE,OAAO,IAAI,GAAG,GAAG;AAAA,QAElC,KAAK;AACH,iBAAO,OAAO,OAAO,EAAE;AAAA,QAEzB,KAAK;AACH,iBAAO,SAAS,OAAO,aAAa,OAAO,IAAI,UAAU,CAAC;AAAA,QAE5D,KAAK;AACH,iBAAO,SAAS,OAAO,eAAe,OAAO,IAAI,UAAU,CAAC;AAAA,QAE9D,KAAK;AACH,iBAAO,SAAS,OAAO,EAAE;AAAA,QAE3B,KAAK;AACH,iBAAO,OAAO,EAAE;AAAA,QAElB,KAAK;AACH,iBAAO,MAAM,EAAE,IAAI,GAAG,GAAG;AAAA,QAE3B,KAAK;AACH,iBAAO,MAAM,CAAC;AAAA,QAEhB,KAAK;AACH,iBAAO,MAAM,CAAC;AAAA,QAEhB,KAAK;AACH,iBAAO,aAAa,IAAI,IAAI,IAAI;AAAA,QAElC,KAAK;AACH,iBAAO,aAAa,IAAI,IAAI,KAAK;AAAA,QAEnC,KAAK;AACH,iBAAO,OAAO,EAAE;AAAA,QAElB,KAAK;AACH,iBAAO,MAAM,EAAE,IAAI,GAAG,GAAG;AAAA,QAE3B,KAAK;AACH,iBAAO,OAAO,OAAO,EAAE;AAAA,QAEzB,KAAK;AACH,iBAAO,MAAM,EAAE,OAAO,IAAI,GAAG,GAAG;AAAA,QAElC,KAAK;AACH,iBAAO,MAAM,EAAE,OAAO,KAAK,GAAG,GAAG;AAAA,QAEnC,KAAK;AACH,iBAAO;AAAA,MAKV;AAED,aAAO;AAAA,IACb;AAEI,WAAO,IAAI,QAAQC,cAAgB,SAAU,OAAO,IAAI;AACtD,aAAO,MAAM,QAAQ,KAAK,KAAK,QAAQ,QAAQ,KAAK,EAAE;AAAA,IAC5D,CAAK;AAAA,EACL;AAEE,SAAO,YAAY,SAAS,YAAY;AAGtC,WAAO,CAAC,KAAK,MAAM,KAAK,GAAG,kBAAmB,IAAG,EAAE,IAAI;AAAA,EAC3D;AAEE,SAAO,OAAO,SAAS,KAAK,OAAO,OAAO,QAAQ;AAChD,QAAI,SAAS;AAEb,QAAI,OAAO,MAAM,EAAE,KAAK;AACxB,QAAI,OAAO,MAAM,KAAK;AACtB,QAAI,aAAa,KAAK,UAAW,IAAG,KAAK,UAAW,KAAIP;AACxD,QAAIQ,QAAO,OAAO;AAElB,QAAI,WAAW,SAASC,YAAW;AACjC,aAAO,MAAM,EAAE,QAAQ,IAAI;AAAA,IACjC;AAEI,QAAI;AAEJ,YAAQ,MAAI;AAAA,MACV,KAAK5B;AACH,iBAAS,SAAU,IAAG;AACtB;AAAA,MAEF,KAAKH;AACH,iBAAS,SAAQ;AACjB;AAAA,MAEF,KAAKgC;AACH,iBAAS,SAAU,IAAG;AACtB;AAAA,MAEF,KAAK5B;AACH,kBAAU0B,QAAO,aAAaG;AAC9B;AAAA,MAEF,KAAK5B;AACH,kBAAUyB,QAAO,aAAaI;AAC9B;AAAA,MAEF,KAAK3B;AACH,iBAASuB,QAAOP;AAChB;AAAA,MAEF,KAAKf;AACH,iBAASsB,QAAOR;AAChB;AAAA,MAEF,KAAKb;AACH,iBAASqB,QAAON;AAChB;AAAA,MAEF;AACE,iBAASM;AAET;AAAA,IACH;AAED,WAAO,SAAS,SAAS,MAAM,EAAE,MAAM;AAAA,EAC3C;AAEE,SAAO,cAAc,SAAS,cAAc;AAC1C,WAAO,KAAK,MAAM9B,CAAG,EAAE;AAAA,EAC3B;AAEE,SAAO,UAAU,SAAS,UAAU;AAElC,WAAO,GAAG,KAAK,EAAE;AAAA,EACrB;AAEE,SAAO,SAAS,SAAS,OAAO,QAAQ,QAAQ;AAC9C,QAAI,CAAC,OAAQ,QAAO,KAAK;AACzB,QAAI,OAAO,KAAK;AAChB,QAAI,iBAAiB,YAAY,QAAQ,QAAQ,IAAI;AACrD,QAAI,eAAgB,MAAK,KAAK;AAC9B,WAAO;AAAA,EACX;AAEE,SAAO,QAAQ,SAAS,QAAQ;AAC9B,WAAO,MAAM,EAAE,KAAK,IAAI,IAAI;AAAA,EAChC;AAEE,SAAO,SAAS,SAAS,SAAS;AAChC,WAAO,IAAI,KAAK,KAAK,QAAS,CAAA;AAAA,EAClC;AAEE,SAAO,SAAS,SAAS,SAAS;AAChC,WAAO,KAAK,QAAS,IAAG,KAAK,YAAW,IAAK;AAAA,EACjD;AAEE,SAAO,cAAc,SAAS,cAAc;AAI1C,WAAO,KAAK,GAAG;EACnB;AAEE,SAAO,WAAW,SAAS,WAAW;AACpC,WAAO,KAAK,GAAG;EACnB;AAEE,SAAOkB;AACT;AAEA,IAAI,QAAQ,MAAM;AAClB,MAAM,YAAY;AAClB,CAAC,CAAC,OAAOR,EAAI,GAAG,CAAC,MAAMD,CAAG,GAAG,CAAC,MAAMD,GAAK,GAAG,CAAC,MAAMD,CAAG,GAAG,CAAC,MAAMF,CAAG,GAAG,CAAC,MAAML,CAAG,GAAG,CAAC,MAAMG,CAAG,GAAG,CAAC,MAAMG,IAAM,CAAC,EAAE,QAAQ,SAAU,GAAG;AACnI,QAAM,EAAE,CAAC,CAAC,IAAI,SAAU,OAAO;AAC7B,WAAO,KAAK,GAAG,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;AAAA,EACpC;AACA,CAAC;AAED,MAAM,SAAS,SAAU,QAAQ,QAAQ;AACvC,MAAI,CAAC,OAAO,IAAI;AAEd,WAAO,QAAQ,OAAO,KAAK;AAC3B,WAAO,KAAK;AAAA,EACb;AAED,SAAO;AACT;AAEA,MAAM,SAAS;AACf,MAAM,UAAU;AAEhB,MAAM,OAAO,SAAU,WAAW;AAChC,SAAO,MAAM,YAAY,GAAG;AAC9B;AAEA,MAAM,KAAK,GAAG,CAAC;AACf,MAAM,KAAK;AACX,MAAM,IAAI,CAAE;AC1hBZ,MAAA,iBAAgB,SAAUtD,IAAGK,IAAG;AAE9B,MAAI8E,SAAQ9E,GAAE;AACd,MAAI,YAAY8E,OAAM;AAEtB,EAAAA,OAAM,SAAS,SAAU,WAAW;AAClC,QAAI,QAAQ;AAEZ,QAAI,SAAS,KAAK;AAElB,QAAI,CAAC,KAAK,WAAW;AACnB,aAAO,UAAU,KAAK,IAAI,EAAE,SAAS;AAAA,IACtC;AAED,QAAI,QAAQ,KAAK;AACjB,QAAI,MAAM,aAAa;AACvB,QAAI,SAAS,IAAI,QAAQ,+DAA+D,SAAU,OAAO;AACvG,cAAQ,OAAK;AAAA,QACX,KAAK;AACH,iBAAO,KAAK,MAAM,MAAM,KAAK,KAAK,CAAC;AAAA,QAErC,KAAK;AACH,iBAAO,OAAO,QAAQ,MAAM,EAAE;AAAA,QAEhC,KAAK;AACH,iBAAO,MAAM;QAEf,KAAK;AACH,iBAAO,MAAM;QAEf,KAAK;AACH,iBAAO,OAAO,QAAQ,MAAM,KAAM,GAAE,GAAG;AAAA,QAGzC,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,MAAM,EAAE,MAAM,KAAM,GAAE,UAAU,MAAM,IAAI,GAAG,GAAG;AAAA,QAEzD,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,MAAM,EAAE,MAAM,QAAS,GAAE,UAAU,MAAM,IAAI,GAAG,GAAG;AAAA,QAE5D,KAAK;AAAA,QACL,KAAK;AACH,iBAAO,MAAM,EAAE,OAAO,MAAM,OAAO,IAAI,KAAK,MAAM,EAAE,GAAG,UAAU,MAAM,IAAI,GAAG,GAAG;AAAA,QAEnF,KAAK;AACH,iBAAO,KAAK,MAAM,MAAM,GAAG,QAAO,IAAK,GAAI;AAAA,QAE7C,KAAK;AACH,iBAAO,MAAM,GAAG;QAElB,KAAK;AACH,iBAAO,MAAM,MAAM,WAAU,IAAK;AAAA,QAEpC,KAAK;AACH,iBAAO,MAAM,MAAM,WAAW,MAAM,IAAI;AAAA,QAE1C;AACE,iBAAO;AAAA,MACV;AAAA,IACP,CAAK;AACD,WAAO,UAAU,KAAK,IAAI,EAAE,MAAM;AAAA,EACtC;AACA;AChEA,IAAI,oBAAoB;AACxB,MAAA,UAAgB,SAAUnF,IAAGK,IAAGM,IAAG;AACjC,MAAI,uBAAuB,SAASyE,sBAAqB,MAAM,OAAO;AACpE,QAAI,gBAAgB,QAAQzE,GAAE,MAAMA,MAAK,KAAK,IAAI,EAAE,QAAQ,CAAC;AAC7D,QAAI,cAAc,IAAI,aAAa,WAAU;AAE7C,QAAI,aAAa,WAAY,IAAG,GAAG;AACjC,qBAAe;AAAA,IAChB;AAED,WAAO,aAAa,IAAI,aAAa,CAAC;AAAA,EAC1C;AAEE,MAAI,yBAAyB,SAAS0E,wBAAuB,KAAK;AAChE,WAAO,IAAI,IAAI,IAAI,IAAI,WAAU,GAAI,CAAC;AAAA,EAC1C;AAEE,MAAIF,SAAQ9E,GAAE;AAEd,EAAA8E,OAAM,cAAc,WAAY;AAC9B,QAAI,kBAAkB,uBAAuB,IAAI;AACjD,WAAO,gBAAgB;EAC3B;AAEE,EAAAA,OAAM,UAAU,SAAU,MAAM;AAC9B,QAAI,CAAC,KAAK,OAAQ,EAAC,EAAE,IAAI,GAAG;AAC1B,aAAO,KAAK,KAAK,OAAO,KAAK,QAAS,KAAI,GAAG,CAAC;AAAA,IAC/C;AAED,QAAI,kBAAkB,uBAAuB,IAAI;AACjD,QAAI,mBAAmB,qBAAqB,KAAK,YAAW,GAAI,KAAK,EAAE;AACvE,WAAO,gBAAgB,KAAK,kBAAkB,CAAC,IAAI;AAAA,EACvD;AAEE,EAAAA,OAAM,aAAa,SAAU,MAAM;AACjC,QAAI,CAAC,KAAK,OAAQ,EAAC,EAAE,IAAI,GAAG;AAC1B,aAAO,KAAK,IAAI,KAAK,IAAG,IAAK,IAAI,OAAO,OAAO,CAAC;AAAA,IACjD;AAED,WAAO,KAAK,IAAK,KAAI;AAAA,EACzB;AAEE,MAAI,aAAaA,OAAM;AAEvB,EAAAA,OAAM,UAAU,SAAU,OAAO,SAAS;AACxC,QAAI,QAAQ,KAAK;AACjB,QAAI,YAAY,CAAC,MAAM,EAAE,OAAO,IAAI,UAAU;AAC9C,QAAI,OAAO,MAAM,EAAE,KAAK;AAExB,QAAI,SAAS,mBAAmB;AAC9B,aAAO,YAAY,KAAK,KAAK,KAAK,KAAM,KAAI,KAAK,WAAY,IAAG,EAAE,EAAE,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,KAAK,KAAK,eAAe,KAAK,CAAC,EAAE,MAAM,KAAK;AAAA,IAC1J;AAED,WAAO,WAAW,KAAK,IAAI,EAAE,OAAO,OAAO;AAAA,EAC/C;AACA;AClDA,MAAM,OAAO,OAAO;AACpB,MAAM,OAAO,cAAc;AAK3B,MAAM,4BAA4B;AAE3B,MAAM,iBAAN,MAAM,eAAc;AAAA,EAMf,cAAc;AALd,SAAA,wCAAwB;AACxB,SAAA,oCAAoB;AACpB,SAAA,qCAAqB;AACrB,SAAA,gCAAgB;EAED;AAAA,EAEvB,gBAAgBlF,IAA8B;AAC1C,QAAI,CAAC,KAAK,kBAAkB,IAAIA,EAAC,GAAG;AAChC,WAAK,kBAAkB,IAAIA,IAAG,kBAAkB,MAAMA,IAAG,IAAI,CAAC;AAAA,IAClE;AACO,WAAA,KAAK,kBAAkB,IAAIA,EAAC;AAAA,EACvC;AAAA,EAEA,aAAaA,IAA2B;AACpC,QAAI,CAAC,KAAK,eAAe,IAAIA,EAAC,GAAG;AAC7B,WAAK,eAAe,IAAIA,IAAG,eAAe,MAAMA,IAAG,IAAI,CAAC;AAAA,IAC5D;AACO,WAAA,KAAK,eAAe,IAAIA,EAAC;AAAA,EACpC;AAAA,EAEA,YAAYA,IAA0B;AAClC,QAAI,CAAC,KAAK,cAAc,IAAIA,EAAC,GAAG;AAC5B,WAAK,cAAc,IAAIA,IAAG,cAAc,MAAMA,IAAG,IAAI,CAAC;AAAA,IAC1D;AACO,WAAA,KAAK,cAAc,IAAIA,EAAC;AAAA,EACnC;AAAA,EAEA,QAAQA,IAAsB;AAC1B,QAAI,CAAC,KAAK,UAAU,IAAIA,EAAC,GAAG;AACxB,WAAK,UAAU,IAAIA,IAAG,UAAU,MAAMA,IAAG,IAAI,CAAC;AAAA,IAClD;AACO,WAAA,KAAK,UAAU,IAAIA,EAAC;AAAA,EAC/B;AAAA,EAIA,OAAO,cAA6B;AAChC,WAAO,KAAK;AAAA,EAChB;AACJ;AALmB,eAAA,WAAW,IAAI;AApC3B,IAAM,gBAAN;AAmDA,MAAM,kBAA0C;AAAA,EAMnD,YACa,YACA,aACA,WACA,OACX;AAJW,SAAA,aAAA;AACA,SAAA,cAAA;AACA,SAAA,YAAA;AACA,SAAA,QAAA;AATb,SAAS,OAAO;AAWP,SAAA,OAAO,IAAI,KAAK,KAAK,YAAY,KAAK,cAAc,GAAG,KAAK,SAAS;AACrE,SAAA,QAAQ,MAAM,KAAK,IAAI;AACvB,SAAA,aAAa,KAAK;EAC3B;AAAA,EAEA,IAAI,OAAe;AACR,WAAA,KAAK,MAAM,OAAO,YAAY;AAAA,EACzC;AAAA,EAEA,WAAmB;AACf,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,cAAsB;AACX,WAAA,KAAK,MAAM,OAAO,oBAAoB;AAAA,EACjD;AAAA,EAEA,IAAI,WAA8B;AACvB,WAAA;AAAA,EACX;AAAA,EAEA,IAAI,UAA6B;AACtB,WAAA;AAAA,EACX;AAAA,EAEA,IAAI,OAAkB;AAClB,WAAO,KAAK,MAAM,QAAQ,GAAG,KAAK,UAAU,EAAE;AAAA,EAClD;AAAA,EAEA,IAAI,QAAwB;AACxB,WAAO,KAAK,MAAM,aAAa,KAAK,MAAM,OAAO,SAAS,CAAC;AAAA,EAC/D;AAAA,EAEA,IAAI,OAAsB;AACtB,WAAO,KAAK,MAAM,YAAY,KAAK,MAAM,OAAO,yBAAyB,CAAC;AAAA,EAC9E;AAAA,EAEA,QAAQ,MAAiC;AACrC,UAAM,OAAO,KAAK,MAAM,IAAI,MAAM,KAAK;AACjC,UAAAA,KAAI,KAAK,OAAO,YAAY;AAC3B,WAAA,KAAK,MAAM,gBAAgBA,EAAC;AAAA,EACvC;AAAA,EAEA,MAAM,OAAkC;AACpC,WAAO,KAAK,MAAM,KAAK,MAAM,OAAO,KAAK;AAAA,EAC7C;AAAA,EAEA,OAAO,MAAMA,IAAW,OAAyC;AAC7D,UAAM,CAAC,MAAM,OAAO,GAAG,IAAIA,GAAE,MAAM,GAAG,EAAE,IAAI,CAACA,QAAM,SAASA,KAAG,EAAE,CAAC;AAClE,WAAO,IAAI,kBAAkB,MAAM,OAAO,KAAK,KAAK;AAAA,EACxD;AACJ;AASO,MAAM,cAAkC;AAAA,EAI3C,YACa,eACA,eACA,OACX;AAHW,SAAA,gBAAA;AACA,SAAA,gBAAA;AACA,SAAA,QAAA;AANb,SAAS,OAAO;AAQP,SAAA,aAAa,KAAK;EAC3B;AAAA,EAEA,IAAI,OAAe;AACf,WAAO,KAAK,SAAS,MAAM,OAAO,yBAAyB;AAAA,EAC/D;AAAA,EAEA,WAAmB;AACf,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,cAAsB;AAClB,WAAO,QAAQ,KAAK,aAAa,KAAK,KAAK,aAAa;AAAA,EAC5D;AAAA,EAEA,IAAI,WAA8B;AAE9B,UAAM,WAAW,QACZ,KAAK,KAAK,aAAa,EACvB,MAAM,CAAC,EACP,KAAK,CAAC,EACN,QAAQ,KAAK,aAAa,EAC1B,QAAQ,SAAS;AACtB,WAAO,KAAK,MAAM,gBAAgB,SAAS,OAAO,YAAY,CAAC;AAAA,EACnE;AAAA,EAEA,IAAI,UAA6B;AACvB,UAAA,WAAW,MACZ,EAAA,KAAK,KAAK,aAAa,EACvB,QAAQ,MAAM,EACd,KAAK,KAAK,gBAAgB,KAAK,GAAG,KAAK,EACvC,QAAQ,MAAM,EACd,IAAI,GAAG,KAAK;AACjB,UAAM,UAAU,SAAS,IAAI,GAAG,KAAK;AAErC,WAAO,KAAK,MAAM,gBAAgB,QAAQ,OAAO,YAAY,CAAC;AAAA,EAClE;AAAA,EAEA,IAAI,OAAkB;AAClB,WAAO,KAAK,MAAM,QAAQ,GAAG,KAAK,aAAa,EAAE;AAAA,EACrD;AAAA,EAEA,SAAS,OAA8B;AACnC,UAAM,OAAO,KAAK,SAAS,MAAM,IAAI,OAAO,MAAM;AAC5C,UAAAA,KAAI,KAAK,OAAO,yBAAyB;AACxC,WAAA,KAAK,MAAM,YAAYA,EAAC;AAAA,EACnC;AAAA,EAEA,MAAM,OAA8B;AAChC,WAAO,KAAK,SAAS,MAAM,KAAK,MAAM,SAAS,OAAO,MAAM;AAAA,EAChE;AAAA,EAEA,OAAO,MAAMA,IAAW,OAAqC;AACzD,UAAM,CAAC,MAAM,IAAI,IAAIA,GAAE,MAAM,IAAI,EAAE,IAAI,CAACA,QAAM,SAASA,KAAG,EAAE,CAAC;AAC7D,WAAO,IAAI,cAAc,MAAM,MAAM,KAAK;AAAA,EAC9C;AACJ;AASO,MAAM,eAAoC;AAAA,EAI7C,YACa,YACA,aACA,OACX;AAHW,SAAA,aAAA;AACA,SAAA,cAAA;AACA,SAAA,QAAA;AANb,SAAS,OAAO;AAQP,SAAA,aAAa,KAAK;EAC3B;AAAA,EAEA,IAAI,OAAe;AACf,WAAO,KAAK,SAAS,MAAM,OAAO,SAAS;AAAA,EAC/C;AAAA,EAEA,WAAmB;AACf,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,cAAsB;AAClB,WAAO,GAAG,UAAU,KAAK,WAAW,CAAC,IAAI,KAAK,UAAU;AAAA,EAC5D;AAAA,EAEA,IAAI,WAA8B;AAC9B,WAAO,KAAK,MAAM,gBAAgB,MAAM,GAAG,KAAK,UAAU,IAAI,KAAK,WAAW,KAAK,EAAE,OAAO,YAAY,CAAC;AAAA,EAC7G;AAAA,EAEA,IAAI,UAA6B;AAC7B,WAAO,KAAK,MAAM;AAAA,MACd,MAAM,GAAG,KAAK,UAAU,IAAI,KAAK,WAAW,KAAK,EAAE,MAAM,OAAO,EAAE,OAAO,YAAY;AAAA,IAAA;AAAA,EAE7F;AAAA,EAEA,IAAI,OAAkB;AAClB,WAAO,KAAK,MAAM,QAAQ,GAAG,KAAK,UAAU,EAAE;AAAA,EAClD;AAAA,EAEA,UAAU,QAAgC;AACtC,UAAM,OAAO,KAAK,SAAS,MAAM,IAAI,QAAQ,OAAO;AAC9C,UAAAA,KAAI,KAAK,OAAO,SAAS;AACxB,WAAA,KAAK,MAAM,aAAaA,EAAC;AAAA,EACpC;AAAA,EAEA,MAAM,OAA+B;AACjC,WAAO,KAAK,SAAS,MAAM,KAAK,MAAM,SAAS,OAAO,OAAO;AAAA,EACjE;AAAA,EAEA,OAAO,MAAMA,IAAW,OAAsC;AAC1D,UAAM,CAAC,MAAM,KAAK,IAAIA,GAAE,MAAM,GAAG,EAAE,IAAI,CAACA,QAAM,SAASA,KAAG,EAAE,CAAC;AAC7D,WAAO,IAAI,eAAe,MAAM,OAAO,KAAK;AAAA,EAChD;AACJ;AAQO,MAAM,UAA0B;AAAA,EAInC,YACa,MACA,OACX;AAFW,SAAA,OAAA;AACA,SAAA,QAAA;AALb,SAAS,OAAO;AAOP,SAAA,aAAa,KAAK;EAC3B;AAAA,EAEA,IAAI,OAAe;AACf,WAAO,KAAK,SAAS,MAAM,OAAO,MAAM;AAAA,EAC5C;AAAA,EAEA,WAAmB;AACf,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,cAAsB;AACX,WAAA,KAAK,KAAK;EACrB;AAAA,EAEA,IAAI,aAA6B;AAC7B,WAAO,KAAK,MAAM,aAAa,GAAG,KAAK,IAAI,KAAK;AAAA,EACpD;AAAA,EAEA,IAAI,YAA4B;AAC5B,WAAO,KAAK,MAAM,aAAa,GAAG,KAAK,IAAI,KAAK;AAAA,EACpD;AAAA,EAEA,IAAI,WAA8B;AAC9B,WAAO,KAAK,WAAW;AAAA,EAC3B;AAAA,EAEA,IAAI,UAA6B;AAC7B,WAAO,KAAK,UAAU;AAAA,EAC1B;AAAA,EAEA,SAAS,OAA0B;AAC/B,UAAM,OAAO,KAAK,SAAS,MAAM,IAAI,OAAO,MAAM;AAC5C,UAAAA,KAAI,KAAK,OAAO,MAAM;AACrB,WAAA,KAAK,MAAM,QAAQA,EAAC;AAAA,EAC/B;AAAA,EAEA,MAAM,OAA0B;AAC5B,WAAO,KAAK,SAAS,MAAM,KAAK,MAAM,SAAS,OAAO,MAAM;AAAA,EAChE;AAAA,EAEA,OAAO,MAAMA,IAAW,OAAiC;AAC/C,UAAA,OAAO,SAASA,IAAG,EAAE;AACpB,WAAA,IAAI,UAAU,MAAM,KAAK;AAAA,EACpC;AACJ;AAEA,SAAS,UAAU,OAAuB;AACtC,SAAO,MACF,EAAA,MAAM,QAAQ,CAAC,EACf,OAAO,MAAM;AACtB;AAKO,SAAS,gBAAgB,UAAoB;AAChD,UAAQ,SAAS,MAAM;AAAA,IACnB,KAAK;AACD,aAAO,IAAI;AAAA,QACP,SAAS;AAAA,QACT,SAAS;AAAA,QACT,SAAS;AAAA,QACT,cAAc,YAAY;AAAA,MAAA;AAAA,IAElC,KAAK;AACM,aAAA,IAAI,cAAc,SAAS,eAAe,SAAS,eAAe,cAAc,aAAa;AAAA,IACxG,KAAK;AACM,aAAA,IAAI,eAAe,SAAS,YAAY,SAAS,aAAa,cAAc,aAAa;AAAA,IACpG,KAAK;AACD,aAAO,IAAI,UAAU,SAAS,MAAM,cAAc,aAAa;AAAA,EACvE;AACJ;AAmCgB,SAAA,uBAAuB,OAA0B,KAA6C;AAC1G,QAAM,OAAO,CAAA;AACP,QAAA,gBAAgB,IAAI,MAAM,KAAK;AACrC,WAASK,KAAI,GAAGA,MAAK,eAAeA,MAAK;AACrC,SAAK,KAAK,MAAM,QAAQA,EAAC,CAAC;AAAA,EAC9B;AACO,SAAA;AACX;AAEgB,SAAA,wBAAwB,OAAsB,KAAqC;AAC/F,QAAM,QAAQ,CAAA;AACR,QAAA,iBAAiB,IAAI,MAAM,KAAK;AACtC,WAASA,KAAI,GAAGA,MAAK,gBAAgBA,MAAK;AACtC,UAAM,KAAK,MAAM,SAASA,EAAC,CAAC;AAAA,EAChC;AACO,SAAA;AACX;AAEgB,SAAA,yBAAyB,OAAuB,KAAuC;AACnG,QAAM,SAAS,CAAA;AACT,QAAA,kBAAkB,IAAI,MAAM,KAAK;AACvC,WAASA,KAAI,GAAGA,MAAK,iBAAiBA,MAAK;AACvC,WAAO,KAAK,MAAM,UAAUA,EAAC,CAAC;AAAA,EAClC;AACO,SAAA;AACX;AAEgB,SAAA,wBAAwB,OAAkB,KAA6B;AACnF,QAAM,QAAQ,CAAA;AACR,QAAA,iBAAiB,IAAI,MAAM,KAAK;AACtC,WAASA,KAAI,GAAGA,MAAK,gBAAgBA,MAAK;AACtC,UAAM,KAAK,MAAM,SAASA,EAAC,CAAC;AAAA,EAChC;AACO,SAAA;AACX;AAEgB,SAAA,mBAAmB,OAA6B,KAA4C;AACpG,MAAA,UAAU,QAAQ,QAAQ,MAAM;AAChC,WAAO;EACX;AACI,MAAA,iBAAiB,qBAAqB,eAAe,mBAAmB;AACjE,WAAA,uBAAuB,OAAO,GAAG;AAAA,EAC5C;AACI,MAAA,iBAAiB,iBAAiB,eAAe,eAAe;AACzD,WAAA,wBAAwB,OAAO,GAAG;AAAA,EAC7C;AACI,MAAA,iBAAiB,kBAAkB,eAAe,gBAAgB;AAC3D,WAAA,yBAAyB,OAAO,GAAG;AAAA,EAC9C;AACI,MAAA,iBAAiB,aAAa,eAAe,WAAW;AACjD,WAAA,wBAAwB,OAAO,GAAG;AAAA,EAC7C;AACA,QAAM,IAAI,MAAM,8DAA8D,KAAK,KAAK,GAAG,EAAE;AACjG;AAEgB,SAAA,cAAcE,IAAkBQ,IAA0B;AAClE,MAAAR,cAAa,qBAAqBQ,cAAa,mBAAmB;AAC3D,WAAAR,GAAE,MAAMQ,EAAC;AAAA,EACpB;AACI,MAAAR,cAAa,iBAAiBQ,cAAa,eAAe;AACnD,WAAAR,GAAE,MAAMQ,EAAC;AAAA,EACpB;AACI,MAAAR,cAAa,kBAAkBQ,cAAa,gBAAgB;AACrD,WAAAR,GAAE,MAAMQ,EAAC;AAAA,EACpB;AACI,MAAAR,cAAa,aAAaQ,cAAa,WAAW;AAC3C,WAAAR,GAAE,MAAMQ,EAAC;AAAA,EACpB;AACA,QAAM,IAAI,MAAM,kBAAkBR,EAAC,QAAQQ,EAAC,EAAE;AAClD;AAEgB,SAAA,gBAAgBR,IAAyBQ,IAAiC;AACtF,MAAIR,OAAM,MAAM;AACL,WAAA;AAAA,EACX;AACA,MAAIQ,OAAM,MAAM;AACL,WAAA;AAAA,EACX;AACM,QAAA,OAAO,cAAcR,IAAGQ,EAAC;AAC/B,MAAI,OAAO,GAAG;AACH,WAAA;AAAA,EACX;AACA,MAAI,OAAO,GAAG;AACH,WAAA;AAAA,EACX;AACO,SAAA;AACX;AAEO,SAAS,kBAA2C,QAA4B;AACnF,MAAI,MAAgB;AACpB,MAAI,MAAgB;AACpB,aAAW,SAAS,QAAQ;AACxB,QAAI,UAAU,MAAM;AAChB;AAAA,IACJ;AACA,QAAI,QAAQ,QAAQ,gBAAgB,OAAO,GAAG,IAAI,GAAG;AAC3C,YAAA;AAAA,IACV;AACA,QAAI,QAAQ,QAAQ,gBAAgB,OAAO,GAAG,IAAI,GAAG;AAC3C,YAAA;AAAA,IACV;AAAA,EACJ;AACI,MAAA,QAAQ,QAAQ,QAAQ,MAAM;AAC9B,WAAO,EAAE,KAAK,MAAM,KAAK,KAAK;AAAA,EAClC;AACO,SAAA,EAAE,KAAK;AAClB;AAEgB,SAAA,QAAQ,UAAyB,QAA+B;AAC5E,MAAI,oBAAoB,mBAAmB;AAChC,WAAA,SAAS,QAAQ,MAAM;AAAA,EAClC;AACA,MAAI,oBAAoB,eAAe;AAC5B,WAAA,SAAS,SAAS,MAAM;AAAA,EACnC;AACA,MAAI,oBAAoB,gBAAgB;AAC7B,WAAA,SAAS,UAAU,MAAM;AAAA,EACpC;AACA,MAAI,oBAAoB,WAAW;AACxB,WAAA,SAAS,SAAS,MAAM;AAAA,EACnC;AACA,QAAM,IAAI,MAAM,qBAAqB,QAAQ,EAAE;AACnD;AAEgB,SAAA,0BAA0B,MAAc,aAAkC;AAChF,QAAA,QAAQ,cAAc;AACtB,QAAA,MAAM,MAAM,gBAAgB,IAAI;AACtC,UAAQ,aAAa;AAAA,IACjB,KAAK;AACM,aAAA;AAAA,IACX,KAAK;AACD,aAAO,IAAI;AAAA,IACf,KAAK;AACD,aAAO,IAAI;AAAA,IACf,KAAK;AACD,aAAO,IAAI;AAAA,EACnB;AACJ;AAEgB,SAAA,iBAAiBR,IAAwCQ,IAAwC;AACzG,MAAAR,GAAE,cAAc,MAAM;AACf,WAAA;AAAA,EACX;AACI,MAAAQ,GAAE,cAAc,MAAM;AACf,WAAA;AAAA,EACX;AACA,SAAO,gBAAgBR,GAAE,WAAWQ,GAAE,SAAS;AACnD;ACnhBO,SAAS,gBAAgB,QAAmD;AAC/E,MAAI,MAAM;AACV,MAAI,MAAM;AACV,aAAW,SAAS,QAAQ;AACpB,QAAA,QAAQ,QAAQ,QAAQ,KAAK;AACvB,YAAA;AAAA,IACV;AACI,QAAA,QAAQ,QAAQ,QAAQ,KAAK;AACvB,YAAA;AAAA,IACV;AAAA,EACJ;AACI,MAAA,QAAQ,QAAQ,QAAQ,MAAM;AACvB,WAAA;AAAA,EACX;AACO,SAAA,CAAC,KAAK,GAAG;AACpB;AAsBO,SAAS,UAAa,mBAA4B;AACjD,MAAA,MAAM,QAAQ,iBAAiB,GAAG;AAC3B,WAAA;AAAA,EACX;AACA,SAAO,CAAC,iBAAiB;AAC7B;ACzBA,MAAM,SAAS,GAAG,eAAe,UAAU;AAE3C,MAAM,gCAAgC,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACJ,MAA0C;AACtC,QAAM,uBAAuB,KACxB,OAAO,CAAC,2BAA2B,uBAAuB,QAAQ,SAAS,CAAC,EAC5E,IAAI,CAAC,gBAAgB;AACX,WAAA;AAAA,MACH,SAAS,YAAY,QAAQ,OAAO,CAAC,cAAc,UAAU,cAAc,IAAI;AAAA,MAC/E,aAAa,YAAY;AAAA,IAAA;AAAA,EAC7B,CACH;AAED,MAAA,qBAAqB,WAAW,GAAG;AACnC,+BAAQ,eAAc,CAAA,CAAA;AAAA,EAC1B;AAEA,QAAM,YAAY,qBAAqB,CAAC,EAAE,QAAQ,CAAC,EAAE;AACrD,QAAM,QAAQ,qBAAqB,IAAI,CAAC,cAAc,UAAU,QAAQ,IAAI,CAAC,cAAc,UAAU,KAAK,CAAC,EAAE,KAAK;AAClH,QAAM,CAAC,UAAU,QAAQ,IAAI,gBAAgB,KAAK;AAC5C,QAAA,cAAc,CAAC,UAAkB;AACnC,YAAS,QAAQ,aAAa,WAAW,YAAa,MAAM;AAAA,EAAA;AAG1D,QAAA,OACF,mBAAmB,UACb,YAAY,UAAU,oBAAoB,GAAG,iDAAiB,eAAe,IAC7E;AAEV,QAAM,SAA6B;AAAA,IAC/B,MAAM;AAAA,IACN,MAAM;AAAA,MACF,UAAU,qBAAqB,IAAI,CAAC,WAAW,WAAW;AAAA,QACtD,OAAO,UAAU;AAAA,QACjB,MAAM,UAAU,QACX,OAAO,CAAC,cAAc,UAAU,cAAc,IAAI,EAClD,IAAI,CAAC,eAAe;AAAA,UACjB,GAAG,cAAc,UAAU,WAAY,SAAS;AAAA,UAChD,GAAG,UAAU;AAAA,UACb,GAAG,YAAY,UAAU,KAAK;AAAA,QAAA,EAChC;AAAA,QACN,aAAa;AAAA,QACb,aAAa;AAAA,QACb,iBAAiB,yBAAyB,OAAO,GAAG;AAAA,QACpD,aAAa,yBAAyB,KAAK;AAAA,MAAA,EAC7C;AAAA,IACN;AAAA,IACA,SAAS;AAAA,MACL,WAAW;AAAA,MACX,qBAAqB;AAAA,MACrB,QAAQ;AAAA,QACJ,GAAG;AAAA,UACC,OAAO;AAAA,YACH,UAAU,CAAC,UAAU,QAAQ,WAAW,KAAe,EAAE,SAAS;AAAA,UACtE;AAAA,QACJ;AAAA,QACA,GAAG,EAAE,GAAG,cAAc,cAAc,GAAG,KAAK,KAAK;AAAA,MACrD;AAAA,MACA,SAAS;AAAA,QACL,QAAQ;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,SAAS;AAAA,UACL,MAAM;AAAA,UACN,WAAW;AAAA,UACX,WAAW;AAAA,YACP,OAAO,CAAC,YAAY;;AAChB,oBAAM,UAAU,qBAAqB,QAAQ,CAAC,EAAE,YAAa;AAC7D,oBAAM,YAAY,QAAQ,QAAQ,QAAQ,CAAC,EAAE,SAAU;AAChD,sBAAA,eAAU,cAAV,mBAAqB;AAAA,YAChC;AAAA,YACA,OAAO,CAAC,YAAY;AACV,oBAAA,UAAU,qBAAqB,QAAQ,YAAa;AAC1D,oBAAM,YAAY,QAAQ,QAAQ,QAAQ,SAAU;AAEpD,oBAAM,cAAc,UAAU,aAAa,KAAK,QAAQ,CAAC;AACzD,oBAAM,QAAQ,UAAU,MAAM,QAAQ,CAAC;AACvC,oBAAMsE,SAAQ,UAAU,MAAM,QAAQ,CAAC;AAEhC,qBAAA,GAAG,QAAQ,WAAW,KAAK,UAAU,MAAM,KAAK,IAAIA,MAAK;AAAA,YACpE;AAAA,UACJ;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,EAAA;AAGG,SAAA5D,oBAAC,SAAQ,EAAA,eAAe,OAAQ,CAAA;AAC3C;ACtFA,MAAM,SAAS,GAAG,eAAe,UAAU;AAE3C,MAAM,8BAA8B,CAAC;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAwC;AACpC,QAAM,uBAAuB,KACxB,OAAO,CAAC,2BAA2B,uBAAuB,QAAQ,SAAS,CAAC,EAC5E,IAAI,CAAC,gBAAgB;AACX,WAAA;AAAA,MACH,SAAS,YAAY,QAAQ,OAAO,CAAC,cAAc,UAAU,cAAc,IAAI;AAAA,MAC/E,aAAa,YAAY;AAAA,IAAA;AAAA,EAC7B,CACH;AAED,MAAA,qBAAqB,WAAW,GAAG;AACnC,+BAAQ,eAAc,CAAA,CAAA;AAAA,EAC1B;AAEA,QAAMe,YAAW,qBACZ,IAAI,CAAC,WAAW,UAAU,WAAW,WAAW,OAAO,wBAAwB,CAAC,EAChF,KAAK;AAEJ,QAAA,OACF,mBAAmB,UACb,YAAY,UAAU,oBAAoB,GAAG,iDAAiB,eAAe,IAC7E;AAEV,QAAM,SAA6B;AAAA,IAC/B,MAAM;AAAA,IACN,MAAM;AAAA,MACF,UAAAA;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,MACL,WAAW;AAAA,MACX,qBAAqB;AAAA,MACrB,QAAQ;AAAA,QACJ,GAAG,EAAE,GAAG,cAAc,cAAc,GAAG,KAAK,KAAK;AAAA,MACrD;AAAA,MACA,SAAS;AAAA,QACL,QAAQ;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,SAASE,UAAQ,wBAAwB;AAAA,MAC7C;AAAA,IACJ;AAAA,EAAA;AAGG,SAAAjB,oBAAC,SAAQ,EAAA,eAAe,OAAQ,CAAA;AAC3C;AAEA,MAAM,aAAa,CACf,2BACA,WACA,6BACC;AACD,UAAQ,0BAA0B;AAAA,IAC9B,KAAK;AACM,aAAA;AAAA,QACH,kBAAkB,2BAA2B,SAAS;AAAA,QACtD,eAAe,2BAA2B,SAAS;AAAA,QACnD,kBAAkB,2BAA2B,SAAS;AAAA,QACxD,KAAK;AAAA,IACX;AACW,aAAA,eAAe,2BAA2B,SAAS;AAAA,EAClE;AACJ;AAEA,MAAM,oBAAoB,CAAC,2BAA0D,eAAuB;AAAA,EACxG,OAAO,GAAG,0BAA0B,WAAW;AAAA,EAC/C,MAAM,0BAA0B,QAAQ,IAAI,CAAC,cAAyB;;AAC3D,WAAA;AAAA,MACH,GAAG,kCAAkC,UAAU,OAAO,UAAU,KAAK,EAAE;AAAA,MACvE,IAAG,eAAU,cAAV,mBAAqB;AAAA,IAAS;AAAA,EACrC,CACH;AAAA,EACD,aAAa;AAAA,EACb,aAAa;AAAA,EACb,MAAM;AAAA,EACN,iBAAiB,yBAAyB,WAAW,GAAG;AAC5D;AAEA,MAAM,oBAAoB,CAAC,2BAA0D,eAAuB;AAAA,EACxG,OAAO,GAAG,0BAA0B,WAAW;AAAA,EAC/C,MAAM,0BAA0B,QAAQ,IAAI,CAAC,cAAyB;;AAC3D,WAAA;AAAA,MACH,GAAG,kCAAkC,UAAU,OAAO,UAAU,KAAK,EAAE;AAAA,MACvE,IAAG,eAAU,cAAV,mBAAqB;AAAA,IAAS;AAAA,EACrC,CACH;AAAA,EACD,aAAa;AAAA,EACb,aAAa;AAAA,EACb,MAAM;AAAA,EACN,iBAAiB,yBAAyB,WAAW,GAAG;AAC5D;AAEA,MAAM,iBAAiB,CAAC,2BAA0D,eAAuB;AAAA,EACrG,OAAO,0BAA0B;AAAA,EACjC,MAAM,0BAA0B,QAAQ,IAAI,CAAC,cAAyB;;AAClE,UAAM,WAAW,kCAAkC,UAAU,OAAO,UAAU,KAAK;AAE5E,WAAA;AAAA,MACH,GAAG,UAAU;AAAA,MACb,IAAG,eAAU,cAAV,mBAAqB;AAAA,MACxB,UAAU,SAAS;AAAA,MACnB,UAAU,SAAS;AAAA,IAAA;AAAA,EACvB,CACH;AAAA,EACD,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa,yBAAyB,SAAS;AAAA,EAC/C,iBAAiB,yBAAyB,SAAS;AACvD;AASA,MAAMiB,YAAU,CAAC,6BAAwD;AACrE,QAAM,gBAAgB;AAAA,IAClB,MAAM;AAAA,IACN,WAAW;AAAA,EAAA;AAGf,UAAQ,0BAA0B;AAAA,IAC9B,KAAK;AACM,aAAA;AAAA,QACH,GAAG;AAAA,QACH,QAAQ,CAAC,EAAE,mBAAwC;AAC/C,iBAAO,aAAa,YAAY;AAAA,QACpC;AAAA,QACA,WAAW;AAAA,UACP,OAAO,CAAC,YAAiC;AACrC,kBAAM,YAAY,QAAQ,QAAQ,KAAK,QAAQ,SAAS;AAEjD,mBAAA;AAAA,cACH,UAAU;AAAA,cACV,UAAU;AAAA,cACV,UAAU;AAAA,cACV,QAAQ,QAAQ;AAAA,YAAA;AAAA,UAExB;AAAA,QACJ;AAAA,MAAA;AAAA,IAER;AACW,aAAA;AAAA,EACf;AACJ;AAEA,SAAS,aAAa,cAAsB;AACxC,SAAO,eAAe,MAAM;AAChC;ACxKA,MAAM,0BAA0B,CAAC,EAAE,MAAM,aAAa,eAA6C;AACzF,QAAA,kBAAkB,CAAC4C,UAAiC;AAC/CA,WAAAA,MAAK,IAAI,CAAC,aAAa;AAAA,MAC1B,MAAM,QAAQ;AAAA,MACd,SAAS;AAAA,QACL;AAAA,UACI,MAAM;AAAA,UACN,MAAM;AAAA,UACN,WAAW,CAAC,SAAiB,iBAAiB,IAAI;AAAA,QACtD;AAAA,QACA;AAAA,UACI,MAAM;AAAA,UACN,MAAM;AAAA,QACV;AAAA,MACJ;AAAA,IACF,EAAA;AAAA,EAAA;AAGA,QAAA,aAAa,CAACA,UAAiC;AAAA,IACjD;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,IACV;AAAA,IACA,GAAG,gBAAgBA,KAAI;AAAA,EAAA;AAGrB,QAAA,UAAU,CAACA,OAA8BC,iBAAqC;AAC1E,UAAA,eAAe,+BAA+BD,OAAMC,YAAW;AAC9D,WAAA,OAAO,OAAO,YAAY,EAAE,IAAI,CAAC,QAAQ,OAAO,OAAO,GAAG,CAAC;AAAA,EAAA;AAG/D,SAAA9D,oBAAC,OAAM,EAAA,MAAM,QAAQ,MAAM,WAAW,GAAG,SAAS,WAAW,IAAI,GAAG,SAAoB,CAAA;AACnG;ACtCO,MAAM,wBAEb;AAAA,EACI,YACY,QACA,SAAmB,IAC7B;AAFU,SAAA,SAAA;AACA,SAAA,SAAA;AAAA,EACT;AAAA,EAEH,MAAM,SAAS,UAAkB,QAAoE;AACjG,UAAM+D,uBACF,MAAM;AAAA,MACF;AAAA,MACA;AAAA,QACI,GAAG,KAAK;AAAA,QACR,QAAQ,KAAK;AAAA,MACjB;AAAA,MACA;AAAA,IAEN,GAAA;AAEE,QAAA,uBAAmDA,mBAAkB,GAAG;AACjE,aAAA;AAAA,QACH,SAASA;AAAA,MAAA;AAAA,IAEjB;AAEM,UAAA,IAAI,MAAM,yCAAyC;AAAA,EAC7D;AACJ;AAEA,SAAS,uBAA0B,MAA2D;AAC1F,SAAO,KAAK,MAAM,CAAC,SAAS,OAAO,SAAS,YAAY,WAAW,QAAQ,OAAO,KAAK,UAAU,QAAQ;AAC7G;ACnCO,MAAM,oBAAkF;AAAA,EAC3F,YACY,OACA,UACA,aAGA,sBACA,gBACV;AAPU,SAAA,QAAA;AACA,SAAA,WAAA;AACA,SAAA,cAAA;AAGA,SAAA,uBAAA;AACA,SAAA,iBAAA;AAAA,EACT;AAAA,EAEH,MAAM,SAAS,OAAe,QAA8C;AACxE,UAAM,iBAAiB,MAAM,KAAK,MAAM,SAAS,OAAO,MAAM;AAC9D,UAAM,eAAe,IAAI,IAAI,eAAe,QAAQ,IAAI,CAAC,QAAQ,IAAI,KAAK,QAAQ,CAAC,CAAC;AAC9E,UAAA,SAAS,KAAK,YAAY,YAAY;AAC5C,QAAI,WAAW,MAAM;AACV,aAAA;AAAA,IACX;AACM,UAAA,EAAE,KAAK,IAAQ,IAAA;AACrB,UAAM,eAAe,KAAK,qBAAqB,KAAK,GAAG;AACvD,UAAM,UAAU,eAAe;AAC/B,eAAW,OAAO,cAAc;AAC5B,UAAI,CAAC,aAAa,IAAI,GAAG,GAAG;AACxB,gBAAQ,KAAK,KAAK,eAAe,GAAG,CAAC;AAAA,MACzC;AAAA,IACJ;AACA,WAAO,EAAE,QAAQ;AAAA,EACrB;AACJ;AC5BO,MAAM,gBAEb;AAAA,EACI,YACY,OACA,OACA,WACV;AAHU,SAAA,QAAA;AACA,SAAA,QAAA;AACA,SAAA,YAAA;AAAA,EACT;AAAA,EAEH,MAAM,SAAS,OAAe,QAA2D;AACrF,UAAM,iBAAiB,MAAM,KAAK,MAAM,SAAS,OAAO,MAAM;AACxD,UAAA,8BAAc;AACT,eAAA,OAAO,eAAe,SAAS;AAChC,YAAA,MAAM,IAAI,KAAK,KAAK;AAC1B,UAAI,CAAC,QAAQ,IAAI,GAAG,GAAG;AACX,gBAAA,IAAI,KAAK,CAAA,CAAE;AAAA,MACvB;AACA,cAAQ,IAAI,GAAG,EAAG,KAAK,GAAG;AAAA,IAC9B;AACM,UAAA,SAAS,IAAI;AACnB,eAAW,CAAA,EAAG,MAAM,KAAK,SAAS;AAC9B,aAAO,KAAK,KAAK,UAAU,MAAM,CAAC;AAAA,IACtC;AAEO,WAAA;AAAA,MACH,SAAS;AAAA,IAAA;AAAA,EAEjB;AACJ;ACvBO,MAAM,8BAIH,gBAA4E;AAAA,EAClF,YAAY,OAAuB,cAA4B,UAAsB;AAC3E,UAAA,OAAO,cAAc,CAAC,WAAmB;AAC3C,UAAItF,KAAI;AACR,iBAAW,SAAS,QAAQ;AACxB,QAAAA,MAAK,MAAM,QAAQ;AAAA,MACvB;AACO,aAAA;AAAA,QACH,CAAC,YAAY,GAAG,OAAO,CAAC,EAAE,YAAY;AAAA,QACtC,CAAC,QAAQ,GAAGA;AAAA,MAAA;AAAA,IAChB,CACH;AAAA,EACL;AACJ;ACtBO,MAAM,YAAyC;AAAA,EAClD,YACY,OACA,MACV;AAFU,SAAA,QAAA;AACA,SAAA,OAAA;AAAA,EACT;AAAA,EAEH,MAAM,SAAS,OAAe,QAA2C;AACrE,UAAM,iBAAiB,MAAM,KAAK,MAAM,SAAS,OAAO,MAAM;AACvD,WAAA;AAAA,MACH,SAAS,eAAe,QAAQ,IAAI,KAAK,IAAI;AAAA,IAAA;AAAA,EAErD;AACJ;ACZO,MAAM,4BAIH,YAAwE;AAAA,EAC9E,YAAY,OAAuB,cAA4B,cAA4B;AACvF;AAAA,MACI;AAAA,MACA,CAAC,WACI;AAAA,QACG,GAAG;AAAA,QACH,CAAC,YAAY,GAAG,MAAM,YAAY;AAAA,MAAA;AAAA,IACtC;AAAA,EAEZ;AACJ;AChBO,MAAM,gBAAgF;AAAA,EACzF,YACY,OACA,YACA,WACV;AAHU,SAAA,QAAA;AACA,SAAA,aAAA;AACA,SAAA,YAAA;AAER,QAAI,aAAa,GAAG;AACV,YAAA,IAAI,MAAM,gCAAgC;AAAA,IACpD;AAAA,EACJ;AAAA,EAEA,MAAM,SAAS,OAAe,QAAsB;AAChD,UAAM,iBAAiB,MAAM,KAAK,MAAM,SAAS,OAAO,MAAM;AACxD,UAAA,UAAU,IAAI;AAChB,QAAA,eAAe,QAAQ,WAAW,GAAG;AACrC,aAAO,EAAE,QAAQ;AAAA,IACrB;AACM,UAAA,kBAAkB,KAAK,IAAI,eAAe,QAAQ,SAAS,KAAK,YAAY,CAAC,IAAI;AACvF,aAASG,KAAI,GAAGA,KAAI,iBAAiBA,MAAK;AAC9B,cAAA,KAAK,KAAK,UAAU,eAAe,QAAQ,MAAMA,IAAGA,KAAI,KAAK,UAAU,CAAC,CAAC;AAAA,IACrF;AACA,WAAO,EAAE,QAAQ;AAAA,EACrB;AACJ;ACTO,SAAS,4BACZ,QACA,aACA,iBACA,gBACF;AACE,QAAM,YAAY,IAAI,wBAAoE,QAAQ,CAAC,cAAc,CAAC;AAClH,QAAM,uBAAuB,IAAI,oBAAoB,WAAW,gBAAgB,MAAM;AAChF,QAAA,UAAU,IAAI,YAAY,sBAAsB,CAACK,OAAM,0BAA0BA,IAAG,WAAW,CAAC;AACtG,QAAM,cAAc,IAAI,sBAAsB,SAAS,aAAa,OAAO;AAC3E,QAAM,WAAW,IAAI;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,SAAS,EAAE,WAAW,KAAK,OAAO,EAAE;AAAA,EAAA;AAEzC,QAAM,WAAW,IAAI,aAAa,UAAU,gBAAgB;AAE5D,SAAO,mBAAmB,IAAI,IAAI,gBAAgB,UAAU,iBAAiB,gBAAgB,IAAI;AACrG;AAEgB,SAAA,0BACZ,MACA,aACF;AACS,SAAA;AAAA,IACH,WAAW,KAAK,SAAS,OAAO,OAAO,0BAA0B,KAAK,MAAM,WAAW;AAAA,IACvF,OAAO,KAAK;AAAA,EAAA;AAEpB;AAEA,SAAS,iBAAiB,eAAqE;AACrF,QAAA,UAAU,cAAc,OAAO,CAAC,KAAK,SAAS,MAAM,KAAK,OAAO,CAAC,IAAI,cAAc;AACzF,QAAM,cAAc,KAAK,MAAM,cAAc,SAAS,CAAC;AACvD,SAAO,EAAE,WAAW,cAAc,WAAW,EAAE,WAAW,OAAO;AACrE;ACtCO,MAAM,iBAQb;AAAA,EACI,YACY,WACA,aACA,UACA,YACA,aACA,gBACA,kBACV;AAPU,SAAA,YAAA;AACA,SAAA,cAAA;AACA,SAAA,WAAA;AACA,SAAA,aAAA;AACA,SAAA,cAAA;AACA,SAAA,iBAAA;AACA,SAAA,mBAAA;AAAA,EACT;AAAA,EAEH,MAAM,SACF,OACA,QAC8G;AAC9G,UAAM,qBAAqB,MAAM,KAAK,UAAU,SAAS,OAAO,MAAM;AACtE,UAAM,uBAAuB,MAAM,KAAK,YAAY,SAAS,OAAO,MAAM;AAEpE,UAAA,mCAAmB;AACN,uBAAA,QAAQ,QAAQ,CAAC,QAAQ;AAC3B,mBAAA,IAAI,IAAI,KAAK,QAAQ,GAAG,IAAI,KAAK,UAAU,CAAC;AAAA,IAAA,CAC5D;AAED,UAAM,UAAU,qBAAqB,QAAQ,IAAI,CAAC,QAAQ;AACtD,YAAM,iBAAiB,aAAa,IAAI,IAAI,KAAK,QAAQ,CAAC,KAAK;AACxD,aAAA;AAAA,QACH,CAAC,KAAK,QAAQ,GAAG,IAAI,KAAK,QAAQ;AAAA,QAClC,CAAC,KAAK,cAAc,GAAG;AAAA,QACvB,CAAC,KAAK,gBAAgB,GAAG,IAAI,KAAK,UAAU;AAAA,QAC5C,CAAC,KAAK,WAAW,GAAI,iBAA6B,IAAI,KAAK,UAAU;AAAA,MAAA;AAAA,IACzE,CAGH;AAED,WAAO,EAAE,QAAQ;AAAA,EACrB;AACJ;ACvCO,SAAS,wBACZ,iBACA,mBACA,aACA,iBACA,OACA,gBACA,QAC+B;AACzB,QAAA,mBAAmB,UAAU,eAAe;AAElD,QAAM,kBAAkB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ,QAAM,aAAa,iBAAiB,IAAI,OAAO,qBAAqB;AAC1D,UAAA,EAAE,aAAa,YAAgB,IAAA;AACrC,UAAM,gBAAgB,4BAA4B,aAAa,aAAa,iBAAiB,cAAc;AAC3G,UAAM,SAAS,IAAI;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEJ,UAAM,UAAU,MAAM,OAAO,SAAS,OAAO,MAAM;AAC5C,WAAA;AAAA,MACH;AAAA,MACA,SAAS,QAAQ;AAAA,IAAA;AAAA,EACrB,CACH;AACM,SAAA,QAAQ,IAAI,UAAU;AACjC;AC9CO,MAAM,SAAyC,CAAC,EAAE,OAAO,UAAU,UAAU,kBAAkB;AAE9F,SAAAe,oBAAC,UAAO,EAAA,OAAO,0BAA0B,WAAW,IAAI,OAAO,UAAU,UACpE,UAAM,MAAA,IAAI,CAAC,6BACP,UAAwB,EAAA,OAAO,KAAK,OAAO,UAAU,KAAK,UACtD,UAAA,KAAK,MADG,GAAA,KAAK,KAElB,CACH,EACL,CAAA;AAER;ACTO,MAAM,6BAAiF,CAAC;AAAA,EAC3F;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACE,MAAA,0BAA0B,WAAW,GAAG;AACjC,WAAA;AAAA,EACX;AAEA,QAAM,QAAQ;AAAA,IACV,EAAE,OAAO,8BAA8B,OAAO,QAAQ,UAAU,KAAK;AAAA,IACrE,GAAG,0BAA0B,OAAO,MAAM,EAAE,IAAI,CAAC,WAAW;AACxD,cAAQ,QAAQ;AAAA,QACZ,KAAK;AACD,iBAAO,EAAE,OAAO,kBAAkB,OAAO,SAAS;AAAA,QACtD,KAAK;AACD,iBAAO,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,MAC9C;AAAA,IAAA,CACH;AAAA,EAAA;AAID,SAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,UAAU,6BAA6B,SAAY,SAAS;AAAA,MAC5D,UAAU,CAAC,UAAiB;AACxB,cAAM,SAAS,MAAM;AACrB,cAAM,QAAQ,OAAO;AACrB,oCAA4B,KAAK;AAAA,MACrC;AAAA,MACA,aAAa;AAAA,IAAA;AAAA,EAAA;AAGzB;AChCA,MAAM,gBAAuD;AAAA,EACzD,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,eAAe,OAAO,cAAc;AAAA,EAC7C,EAAE,OAAO,SAAS,OAAO,QAAQ;AACrC;AAEO,MAAM,kBAA2D,CAAC;AAAA,EACrE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,QAAQ;AAAA,IACV,EAAE,OAAO,uBAAuB,OAAO,QAAQ,UAAU,KAAK;AAAA,IAC9D,GAAG,cAAc,OAAO,CAAC,SAAS,iBAAiB,UAAa,aAAa,SAAS,KAAK,KAAK,CAAC;AAAA,EAAA;AAIjG,SAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA,UAAU;AAAA,MACV,UAAU,CAAC,UAAiB;AACxB,cAAM,SAAS,MAAM;AACrB,cAAM,QAAQ,OAAO;AACrB,0BAAkB,KAAK;AAAA,MAC3B;AAAA,MACA,aAAa,GAAG,SAAS;AAAA,IAAA;AAAA,EAAA;AAGrC;ACEa,MAAA,qBAAiE,CAAC,mBAAmB;AACxF,QAAA,EAAE,OAAO,OAAW,IAAA;AACpB,QAAA,OAAO,EAAE,QAAQ;AAGnB,SAAAA,oBAAC,eAAc,EAAA,MACX,UAACA,oBAAA,iBAAA,EAAgB,MACb,UAAAA,oBAAC,yBAAyB,EAAA,GAAG,eAAgB,CAAA,EAAA,CACjD,EACJ,CAAA;AAER;AAEa,MAAA,0BAAsE,CAAC,mBAAmB;AACnG,QAAM,EAAE,iBAAiB,mBAAmB,aAAa,iBAAiB,eAAmB,IAAA;AACvF,QAAA,QAAQS,EAAW,eAAe;AAExC,QAAM,EAAE,MAAM,OAAO,UAAc,IAAA;AAAA,IAC/B,MACI;AAAA,MACI;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,IACJ,CAAC,OAAO,iBAAiB,mBAAmB,aAAa,iBAAiB,cAAc;AAAA,EAAA;AAG5F,MAAI,WAAW;AACX,+BAAQ,gBAAe,CAAA,CAAA;AAAA,EAC3B;AAEA,MAAI,UAAU,MAAM;AACV,UAAA;AAAA,EACV;AAEI,MAAA,SAAS,QAAQ,KAAK,MAAM,CAAC,YAAY,QAAQ,QAAQ,WAAW,CAAC,GAAG;AACxE,+BAAQ,eAAc,CAAA,CAAA;AAAA,EAC1B;AAEA,SAAQT,oBAAA,wBAAA,EAAuB,MAAa,GAAG,eAAgB,CAAA;AACnE;AAMA,MAAM,yBAAyE,CAAC,EAAE,MAAM,GAAG,qBAAqB;AAC5G,QAAM,EAAE,OAAO,aAAa,2BAA2B,UAAU,gBAAgB,oBAC7E,IAAA;AACJ,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,EAAoB,QAAQ;AAClE,QAAA,CAAC,0BAA0B,2BAA2B,IAAIA;AAAAA,IAC5D,0BAA0B,SAAS,IAAI,0BAA0B,CAAC,IAAI;AAAA,EAAA;AAE1E,QAAM,iBAAiB,EAAE,QAAQ,gBAAgB,aAAa,oBAAoB;AAE5E,QAAA,SAAS,CAAC,SAAe;AAC3B,YAAQ,MAAM;AAAA,MACV,KAAK;AACM,eAAA;AAAA,UACH,OAAO;AAAA,UACP,SACID;AAAAA,YAAC;AAAA,YAAA;AAAA,cACG;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UACJ;AAAA,QAAA;AAAA,MAGZ,KAAK;AACM,eAAA;AAAA,UACH,OAAO;AAAA,UACP,SACIA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACG;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UACJ;AAAA,QAAA;AAAA,MAGZ,KAAK;AACM,eAAA;AAAA,UACH,OAAO;AAAA,UACP,SACIA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACG;AAAA,cACA;AAAA,cACA;AAAA,YAAA;AAAA,UACJ;AAAA,QAAA;AAAA,MAGZ,KAAK;AACM,eAAA;AAAA,UACH,OAAO;AAAA,UACP,SAASA,oBAAC,yBAAwB,EAAA,MAAY,aAA0B,UAAoB;AAAA,QAAA;AAAA,IAExG;AAAA,EAAA;AAGJ,QAAM,OAAO,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAEvC,QAAA,UAAU,CAAC,cACbA;AAAAA,IAACY;AAAAA,IAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACC,GAAG;AAAA,IAAA;AAAA,EAAA;AAIL,SAAAZ,oBAAC,MAAK,EAAA,MAAY,QAAkB,CAAA;AAC/C;AAYA,MAAMY,YAA2C,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACP,MAAM;AACI,QAAA,EAAE,2BAA2B,YAAgB,IAAA;AACnD,SAEST,oBAAA,UAAA,EAAA,UAAA;AAAA,IAAA,cAAc,WACXH,oBAAC,iBAAgB,EAAA,gBAAgC,mBAAsC;AAAA,KAEzF,cAAc,SAAS,cAAc,WACnCA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACJ;AAAA,IAEJA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAU;AAAA,QACV,SAAS,MAAM,+BAA+B,MAAM,WAAW;AAAA,QAC/D,UAAS;AAAA,MAAA;AAAA,IACb;AAAA,IAEAA,oBAAC,wBAAwB,EAAA,GAAG,gBAAgB;AAAA,wBAC3C,YAAW,EAAA;AAAA,EAChB,EAAA,CAAA;AAER;AAEA,MAAM,yBAAqE,CAAC,mBAAmB;AAC3F,QAAM,EAAE,aAAa,iBAAiB,MAAA,IAAU;AAC1C,QAAA,QAAQS,EAAW,eAAe;AACxC,6BACK,MACG,EAAA,UAAA;AAAA,IAAAT,oBAAC,iBAAc,UAAoB,uBAAA,CAAA;AAAA,wBAClC,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MAC8CA,oBAAC,OAAG,UAAY,YAAA,CAAA;AAAA,MACxE,kBAAkB,KAAK,sBAAsB,eAAe,IAAI,WAAW;AAAA,MAAkB;AAAA,MAE/EA,oBAAC,UAAK,UAAiB,oBAAA,CAAA;AAAA,MAAO;AAAA,IAAA,GACjD;AAAA,IACAA,oBAAC,iBAAc,UAGf,wJAAA,CAAA;AAAA,IACC,MAAM,SAAS,QAAQ,KAEhBG,oBAAA,UAAA,EAAA,UAAA;AAAA,MAAAH,oBAAC,iBAAc,UAAY,eAAA,CAAA;AAAA,0BAC1B,eAAc,EAAA,UAAA;AAAA,QAAA;AAAA,QACyE;AAAA,QACnF;AAAA,QAAY;AAAA,MAAA,GACjB;AAAA,IAAA,GACJ;AAAA,wBAEH,mBAAkB,EAAA,eAAc,wBAAuB,QAAQ,gBAAgB,UAAU,OAAO;AAAA,EACrG,EAAA,CAAA;AAER;AAEO,MAAM,YAAY,CAAC,SACtB,KAAK,IAAI,GAAG,KAAK,QAAQ,CAAC,YAAY,QAAQ,QAAQ,IAAI,CAAC,cAAc,UAAU,UAAU,CAAC,CAAC;;;;;;;;;;;ACjMtF,IAAA,8BAAN,cAA0C,iCAAiC;AAAA,EAA3E,cAAA;AAAA,UAAA,GAAA,SAAA;AAeH,SAAA,kBAQM,EAAC,aAAa,IAAI,aAAa,CAAA;AASrC,SAAA,oBAAsE;AAMrB,SAAA,cAAA;AAYvB,SAAA,kBAAA;AAM1B,SAAA,QAAiD,CAAC,OAAO,QAAQ,UAAU,OAAO;AAQlF,SAAA,4BAAmD,CAAC,QAAQ;AAQ5C,SAAA,QAAA;AAQC,SAAA,SAAA;AAUQ,SAAA,iBAAA;AAOI,SAAA,WAAA;AAUuB,SAAA,iBAAA;AAUK,SAAA,sBAAA;AAAA,EAAA;AAAA,EAEhD,SAAS;AAEV,WAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,iBAAiB,KAAK;AAAA,QACtB,mBAAmB,KAAK;AAAA,QACxB,aAAa,KAAK;AAAA,QAClB,iBAAiB,KAAK;AAAA,QACtB,OAAO,KAAK;AAAA,QACZ,2BAA2B,KAAK;AAAA,QAChC,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,gBAAgB,KAAK;AAAA,QACrB,UAAU,KAAK;AAAA,QACf,gBAAgB,KAAK;AAAA,QACrB,qBAAqB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGtC;AACJ;AA1HIP,kBAAA;AAAA,EADCC,GAAS,EAAC,MAAM,QAAO;AAAA,GAdf,4BAeT,WAAA,mBAAA,CAAA;AAiBAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA/BjB,4BAgCT,WAAA,qBAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GArCjB,4BAsCT,WAAA,eAAA,CAAA;AAYAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAjDjB,4BAkDT,WAAA,mBAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,OAAO;AAAA,GAvDhB,4BAwDT,WAAA,SAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,OAAO;AAAA,GA/DhB,4BAgET,WAAA,6BAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAvEjB,4BAwET,WAAA,SAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA/EjB,4BAgFT,WAAA,UAAA,CAAA;AAUAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAzFjB,4BA0FT,WAAA,kBAAA,CAAA;AAOAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAhGjB,4BAiGT,WAAA,YAAA,CAAA;AAUAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA1GjB,4BA2GT,WAAA,kBAAA,CAAA;AAUAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GApHjB,4BAqHT,WAAA,uBAAA,CAAA;AArHS,8BAAND,kBAAA;AAAA,EADNE,IAAc,yBAAyB;AAAA,GAC3B,2BAAA;ACbb,MAAM,SAAS,GAAG,eAAe,UAAU;AAE3C,MAAM,+BAA+B,CAAC,EAAE,MAAM,gBAAgB,qBAAwD;AAClH,QAAM,OACF,mBAAmB,UACb,YAAY,KAAK,IAAI,GAAG,KAAK,UAAU,GAAG,iDAAiB,eAAe,IAC1E;AAEV,QAAM,SAA6B;AAAA,IAC/B,MAAM;AAAA,IACN,MAAM;AAAA,MACF,QAAQ,KAAK;AAAA,MACb,UAAU,SAAS,IAAI;AAAA,IAC3B;AAAA,IACA,SAAS;AAAA,MACL,qBAAqB;AAAA,MACrB,WAAW;AAAA,MAEX,QAAQ;AAAA,QACJ,GAAG,EAAE,GAAG,cAAc,cAAc,GAAG,KAAK,KAAK;AAAA,MACrD;AAAA,MACA,SAAS;AAAA,QACL,QAAQ;AAAA,UACJ,SAAS;AAAA,QACb;AAAA,QACA,SAAS,QAAQ;AAAA,MACrB;AAAA,IACJ;AAAA,EAAA;AAIA,SAAAQ,oBAAC,OAAI,EAAA,WAAU,wBACX,UAAA;AAAA,IAAAH;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,mBAAmB,KAAK,OAAO,GAAG;AAAA,QAClC,6BAA6B,KAAK,OAAO,GAAG;AAAA,QAC5C,6BAA6B,KAAK,OAAO,GAAG;AAAA,MAAA;AAAA,IAChD;AAAA,IACAA,oBAAC,SAAI,WAAU,UACX,8BAAC,SAAQ,EAAA,eAAe,QAAQ,EACpC,CAAA;AAAA,EACJ,EAAA,CAAA;AAER;AAEA,MAAM,iCAAiC,CAAC;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AACJ,MAIM;AAEE,SAAAG,oBAAC,OAAI,EAAA,OAAM,oCACP,UAAA;AAAA,IAACH,oBAAA,QAAA,EAAK,OAAM,kBAAiB,UAAmB,uBAAA;AAAA,wBAC/C,OACG,EAAA,UAAA;AAAA,MAACG,oBAAA,QAAA,EAAK,OAAM,iBAAgB,UAAA;AAAA,QAAA;AAAA,QAAE,iBAAiB,iBAAiB;AAAA,QAAE;AAAA,MAAA,GAAC;AAAA,MACnEA,oBAAC,QAAK,EAAA,OAAM,UAAS,UAAA;AAAA,QAAA;AAAA,QACf,iBAAiB,2BAA2B;AAAA,QAAE;AAAA,QAAI,iBAAiB,2BAA2B;AAAA,QAAE;AAAA,MAAA,GACtG;AAAA,IAAA,GACJ;AAAA,EACJ,EAAA,CAAA;AAER;AAEA,MAAM,WAAW,CAAC,SAA2C;AAClD,SAAA;AAAA,IACH;AAAA,MACI,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,aAAa;AAAA,MACb,aAAa;AAAA,MACb,aAAa,0BAA0B,QAAQ;AAAA,MAC/C,iBAAiB,0BAA0B,QAAQ;AAAA,IACvD;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,aAAa;AAAA,MACb,aAAa;AAAA,MACb,MAAM;AAAA,MACN,iBAAiB,0BAA0B,UAAU,GAAG;AAAA,IAC5D;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,aAAa;AAAA,MACb,aAAa;AAAA,MACb,MAAM;AAAA,MACN,iBAAiB,0BAA0B,UAAU,GAAG;AAAA,IAC5D;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM,KAAK;AAAA,MACX,sBAAsB,0BAA0B,OAAO;AAAA,MACvD,aAAa;AAAA,IACjB;AAAA,EAAA;AAER;AAEA,MAAM,UAAU,MAAM;AACX,SAAA;AAAA,IACH,MAAM;AAAA,IACN,WAAW;AAAA,IACX,QAAQ,CAAC,EAAE,mBAAwC;AACxC,aAAA,iBAAiB,KAAK,iBAAiB;AAAA,IAClD;AAAA,IACA,WAAW;AAAA,MACP,OAAO,CAAC,YAAiC;AACrC,gBAAQ,QAAQ,cAAc;AAAA,UAC1B,KAAK,GAAG;AACJ,kBAAM,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,SAAS;AACpD,kBAAM,UAAU,QAAQ,QAAQ,KAAK,QAAQ,YAAY,CAAC;AAC1D,kBAAM,UAAU,QAAQ,QAAQ,KAAK,QAAQ,YAAY,CAAC;AACtD,gBAAA,OAAO,UAAU,YAAY,OAAO,YAAY,YAAY,OAAO,YAAY,UAAU;AAClF,qBAAA;AAAA,YACX;AACA,mBAAO,4BAA4B,OAAO,SAAS,SAAS,QAAQ,QAAQ,KAAK;AAAA,UACrF;AAAA,UAEA,KAAK,GAAG;AACJ,kBAAM,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,SAAS;AAChD,gBAAA,OAAO,UAAU,UAAU;AACpB,qBAAA;AAAA,YACX;AACA,mBAAO,aAAa,MAAM,QAAQ,CAAC,CAAC;AAAA,UACxC;AAAA,UACA;AACW,mBAAA;AAAA,QACf;AAAA,MACJ;AAAA,IACJ;AAAA,EAAA;AAER;AClKA,eAAsB,6BAClB,WACA,aACA,gBACA,OACA,gBACA,QACF;AACE,QAAM,iBAAiB,IAAI,wBAExB,WAAW,CAAC,cAAc,CAAC;AAC9B,QAAM,mBAAmB,IAAI,wBAE1B,aAAa,CAAC,cAAc,CAAC;AAChC,QAAM,6BAA6B,IAAI,oBAAoB,gBAAgB,gBAAgB,MAAM;AACjG,QAAM,+BAA+B,IAAI,oBAAoB,kBAAkB,gBAAgB,MAAM;AACrG,QAAM,eAAe,IAAI,YAAY,4BAA4B,cAAc;AAC/E,QAAM,iBAAiB,IAAI,YAAY,8BAA8B,cAAc;AACnF,QAAM,CAAC,eAAe,eAAe,IAAI,MAAM,QAAQ,IAAI;AAAA,IACvD,aAAa,SAAS,OAAO,MAAM;AAAA,IACnC,eAAe,SAAS,OAAO,MAAM;AAAA,EAAA,CACxC;AACD,QAAM,EAAE,KAAK,SAAS,KAAK,QAAY,IAAA,kBAAkB,gBAAgB,QAAQ,IAAI,CAAClB,OAAMA,GAAE,IAAI,CAAC;AAC/F,MAAA,CAAC,WAAW,CAAC,SAAS;AACf,WAAA;AAAA,EACX;AAEM,QAAA,sCAAsB;AACd,gBAAA,QAAQ,QAAQ,CAACA,OAAM;AACjC,QAAIA,GAAE,MAAM;AACR,sBAAgB,IAAIA,GAAE,MAAMA,GAAE,KAAK;AAAA,IACvC;AAAA,EAAA,CACH;AACK,QAAA,wCAAwB;AAC9B,QAAM,cAAc;AAAA,IAChB,GAAG,CAAC;AAAA,IACJ,GAAG,CAAC;AAAA,IACJ,GAAG,CAAC;AAAA,EAAA;AAEQ,kBAAA,QAAQ,QAAQ,CAACA,OAAM;AACnC,QAAIA,GAAE,MAAM;AACR,wBAAkB,IAAIA,GAAE,MAAMA,GAAE,KAAK;AACrC,YAAMb,KAAIa,GAAE,KAAK,MAAM,OAAO;AAClB,kBAAA,EAAE,KAAKb,EAAC;AACR,kBAAA,EAAE,KAAKa,GAAE,KAAK;AAC1B,kBAAY,EAAE,KAAK,gBAAgB,IAAIA,GAAE,IAAI,KAAK,CAAC;AAAA,IACvD;AAAA,EAAA,CACH;AACD,QAAM,iBAAiB;AAAA,IACnB,QAAQ;AAAA,MACJ,OAAO;AAAA,MACP;AAAA,MACA,qBAAqB;AAAA,MACrB,sBAAsB;AAAA,MACtB,4BAA4B;AAAA,MAC5B,QAAQ;AAAA,MACR,MAAM,QAAQ,MAAM,OAAO;AAAA,IAC/B;AAAA,IACA,MAAM;AAAA,EAAA;AAEJ,QAAA,WAAW,MAAM,MAAM,kEAAkE;AAAA,IAC3F,QAAQ;AAAA,IACR,SAAS;AAAA,MACL,gBAAgB;AAAA,IACpB;AAAA,IACA,MAAM,KAAK,UAAU,cAAc;AAAA,IACnC;AAAA,EAAA,CACH;AACK,QAAA,eAAgB,MAAM,SAAS;AAmCrC,QAAM,cAAc;AAAA,IAChB,GAAG;AAAA,IACH,sBAAsB;AAAA,MAClB,GAAG,aAAa;AAAA,MAChB,GAAG,aAAa,qBAAqB,EAAE,IAAI,CAACb,OAAM,QAAQ,QAAQA,EAAC,CAAC;AAAA,IACxE;AAAA,EAAA;AAEE,QAAA,sBAAsB,YAAY,qBAAqB,EAAE;AAAA,IAC3D,CAACA,QAAO,gBAAgB,IAAIA,EAAC,KAAK,MAAM,kBAAkB,IAAIA,EAAC,KAAK;AAAA,EAAA;AAGjE,SAAA;AAAA,IACH,GAAG;AAAA,IACH;AAAA,EAAA;AAER;AAEA,SAAS,eAAea,IAA2C;AACzD,QAAA,gBAAgB,cAAc;AAC7B,SAAA;AAAA,IACH,MAAMA,GAAE,OAAO,cAAc,gBAAgBA,GAAE,IAAI,IAAI;AAAA,IACvD,OAAOA,GAAE;AAAA,EAAA;AAEjB;ACnGa,MAAA,0BAA2E,CAAC,mBAAmB;AAClG,QAAA,EAAE,OAAO,OAAW,IAAA;AACpB,QAAA,OAAO,EAAE,QAAQ;AAGnB,SAAAe,oBAAC,eAAc,EAAA,MACX,UAACA,oBAAA,iBAAA,EAAgB,MACb,UAAAA,oBAAC,8BAA8B,EAAA,GAAG,eAAgB,CAAA,EAAA,CACtD,EACJ,CAAA;AAER;AAEa,MAAA,+BAAgF,CAAC,mBAAmB;AACvG,QAAA,QAAQS,EAAW,eAAe;AACxC,QAAM,EAAE,iBAAiB,mBAAmB,gBAAgB,mBAAmB;AAE/E,QAAM,CAAC,gBAAgB,iBAAiB,IAAIR,EAAoB,QAAQ;AAExE,QAAM,EAAE,MAAM,OAAO,UAAc,IAAA;AAAA,IAC/B,MAAM,6BAA6B,iBAAiB,mBAAmB,gBAAgB,OAAO,cAAc;AAAA,IAC5G,CAAC,OAAO,iBAAiB,mBAAmB,gBAAgB,cAAc;AAAA,EAAA;AAG9E,MAAI,WAAW;AACX,+BAAQ,gBAAe,CAAA,CAAA;AAAA,EAC3B;AAEA,MAAI,UAAU,MAAM;AACV,UAAA;AAAA,EACV;AAEA,MAAI,SAAS,MAAM;AACf,+BAAQ,eAAc,CAAA,CAAA;AAAA,EAC1B;AAGI,SAAAD;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA,wBAAwB;AAAA,IAAA;AAAA,EAAA;AAGpC;AASA,MAAM,8BAAmF,CAAC;AAAA,EACtF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACI,QAAA,SAAS,CAAC,SAAe;AAC3B,YAAQ,MAAM;AAAA,MACV,KAAK;AACM,eAAA;AAAA,UACH,OAAO;AAAA,UACP,SACIA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACG,MAAM;AAAA,gBACF,GAAG,KAAK;AAAA,gBACR,UAAU,KAAK;AAAA,gBACf,QAAQ,KAAK;AAAA,cACjB;AAAA,cACA;AAAA,cACA,gBAAgB,uBAAuB;AAAA,YAAA;AAAA,UAC3C;AAAA,QAAA;AAAA,IAGhB;AAAA,EAAA;AAGE,QAAA,OAAO,uBAAuB,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AACpE,QAAM,UAAU,MACZA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAID,SAAAA,oBAAC,MAAK,EAAA,MAAY,QAAkB,CAAA;AAC/C;AAQA,MAAM,iCAAyF,CAAC;AAAA,EAC5F;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,SAEQG,oBAAA,UAAA,EAAA,UAAA;AAAA,IAACH,oBAAA,iBAAA,EAAgB,gBAAgC,kBAAsC,CAAA;AAAA,IACvFA,oBAAC,+BAA4B,wBAAgD;AAAA,wBAC5E,YAAW,EAAA;AAAA,EAChB,EAAA,CAAA;AAER;AAEA,MAAM,8BAA2G,CAAC;AAAA,EAC9G;AACJ,MAAM;AACI,QAAA,QAAQS,EAAW,eAAe;AACxC,QAAM,iBAAiB,uBAAuB;AAE9C,6BACK,MACG,EAAA,UAAA;AAAA,IAAAT,oBAAC,iBAAc,UAAyB,4BAAA,CAAA;AAAA,wBACvC,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MAG8C;AAAA,MAAe;AAAA,IAAA,GAQ5E;AAAA,wBACC,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MAGkE;AAAA,MAAe;AAAA,IAAA,GAEhG;AAAA,IAEAA,oBAAC,iBAAc,UAAS,YAAA,CAAA;AAAA,wBACvB,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MAEY;AAAA,MACtBA,oBAAA,UAAA,EAAS,MAAK,gFAA+E,UAE9F,gCAAA;AAAA,IAAA,GACJ;AAAA,IACAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,eAAc;AAAA,QACd,QAAQ;AAAA,QACR,UAAU;AAAA,MAAA;AAAA,IACd;AAAA,EACJ,EAAA,CAAA;AAER;;;;;;;;;;;ACvJa,IAAA,mCAAN,cAA+C,iBAAiB;AAAA,EAAhE,cAAA;AAAA,UAAA,GAAA,SAAA;AAQH,SAAA,kBAAoE;AASpE,SAAA,oBAAsE;AAO7C,SAAA,iBAAA;AAMzB,SAAA,QAAkB,CAAC,MAAM;AAQT,SAAA,QAAA;AAQC,SAAA,SAAA;AAUQ,SAAA,iBAAA;AAU2B,SAAA,iBAAA;AAUK,SAAA,sBAAA;AAAA,EAAA;AAAA,EAEhD,SAAS;AAEV,WAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,iBAAiB,KAAK;AAAA,QACtB,mBAAmB,KAAK;AAAA,QACxB,gBAAgB,KAAK;AAAA,QACrB,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,gBAAgB,KAAK;AAAA,QACrB,gBAAgB;AAAA,UACZ,QAAQ,KAAK;AAAA,UACb,aAAa,KAAK;AAAA,QACtB;AAAA,MAAA;AAAA,IAAA;AAAA,EAGZ;AACJ;AAvFIP,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAPjB,iCAQT,WAAA,mBAAA,CAAA;AASAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAhBjB,iCAiBT,WAAA,qBAAA,CAAA;AAOAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAvBjB,iCAwBT,WAAA,kBAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,OAAO;AAAA,GA7BhB,iCA8BT,WAAA,SAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GArCjB,iCAsCT,WAAA,SAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA7CjB,iCA8CT,WAAA,UAAA,CAAA;AAUAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAvDjB,iCAwDT,WAAA,kBAAA,CAAA;AAUAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAjEjB,iCAkET,WAAA,kBAAA,CAAA;AAUAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA3EjB,iCA4ET,WAAA,uBAAA,CAAA;AA5ES,mCAAND,kBAAA;AAAA,EADNE,IAAc,8BAA8B;AAAA,GAChC,gCAAA;AC5BA,MAAA,mBAAmB,CAACb,IAA2BQ,OAA8B;AACtF,MAAI,OAAOR,OAAM,YAAY,OAAOQ,OAAM,UAAU;AAChD,WAAOR,KAAIQ;AAAA,EACf;AAEA,QAAM,OAAOR,MAAK,OAAO,OAAOA,EAAC,IAAI;AACrC,QAAM,OAAOQ,MAAK,OAAO,OAAOA,EAAC,IAAI;AAE9B,SAAA,KAAK,cAAc,IAAI;AAClC;AAEsB,eAAA,mBAClB,aACA,QACA,OACA,cAA2B,EAAE,OAAO,SAAS,WAAW,aAAa,GACrE,QACF;AACE,QAAM,kBAAkB,CAAC,SAAS,cAAc,GAAG,MAAM;AACzD,MAAI,CAAC,gBAAgB,SAAS,YAAY,KAAK,GAAG;AAC9C,UAAM,IAAI,MAAM,sDAAsD,gBAAgB,KAAK,IAAI,CAAC,EAAE;AAAA,EACtG;AAEA,QAAM,YAAY,IAAI,wBAAgE,aAAa,MAAM;AACzG,QAAM,WAAW,IAAI,aAAa,WAAW,CAACR,IAAGQ,OAAM;AAC5C,WAAA,YAAY,cAAc,cAC3B,iBAAiBR,GAAE,YAAY,KAAK,GAAGQ,GAAE,YAAY,KAAK,CAAC,IAC3D,iBAAiBA,GAAE,YAAY,KAAK,GAAGR,GAAE,YAAY,KAAK,CAAC;AAAA,EAAA,CACpE;AACD,QAAM,QAAQ,MAAM,SAAS,SAAS,OAAO,MAAM,GAAG;AAEhD,QAAA,QAAQ,KAAK,OAAO,CAAC,KAAK,QAAQ,MAAM,IAAI,OAAO,CAAC;AAE1D,SAAO,KAAK;AAAA,IACR,CAAC,SACI;AAAA,MACG,GAAG;AAAA,MACH,YAAY,IAAI,QAAQ;AAAA,IAAA;AAAA,EAC5B;AAKZ;ACzCO,MAAM,iBAAyD,CAAC,EAAE,MAAM,QAAQ,eAAe;AAClG,QAAM,UAAU;AAAA,IACZ,GAAG,OAAO,IAAI,CAAC,UAAU;AACd,aAAA;AAAA,QACH,MAAM;AAAA,QACN,MAAM;AAAA,UACF,SAAS;AAAA,QACb;AAAA,MAAA;AAAA,IACJ,CACH;AAAA,IACD;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,IACV;AAAA,IACA;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,MACN,WAAW,CAAC,SAAiB,iBAAiB,IAAI;AAAA,IACtD;AAAA,EAAA;AAGJ,SAAQkB,oBAAA,OAAA,EAAM,MAAY,SAAS,SAAS,SAAoB,CAAA;AACpE;ACHa,MAAA,YAA+C,CAAC,mBAAmB;AACtE,QAAA,EAAE,OAAO,OAAW,IAAA;AACpB,QAAA,OAAO,EAAE,QAAQ;AAGnB,SAAAA,oBAAC,eAAc,EAAA,MACX,UAACA,oBAAA,iBAAA,EAAgB,MACb,UAAAA,oBAAC,gBAAgB,EAAA,GAAG,eAAgB,CAAA,EAAA,CACxC,EACJ,CAAA;AAER;AAEa,MAAA,iBAAoD,CAAC,mBAAmB;AACjF,QAAM,EAAE,QAAQ,QAAQ,kBAAkB,yBAAyB;AAC7D,QAAA,QAAQS,EAAW,eAAe;AAExC,QAAM,EAAE,MAAM,OAAO,UAAU,IAAI,SAAS,YAAY;AAC7C,WAAA,mBAAmB,QAAQ,QAAQ,OAAO,EAAE,OAAO,kBAAkB,WAAW,qBAAA,CAAsB;AAAA,EAC9G,GAAA,CAAC,QAAQ,QAAQ,KAAK,CAAC;AAE1B,MAAI,WAAW;AACX,+BAAQ,gBAAe,CAAA,CAAA;AAAA,EAC3B;AAEA,MAAI,UAAU,MAAM;AACV,UAAA;AAAA,EACV;AAEA,MAAI,SAAS,MAAM;AACf,+BAAQ,eAAc,CAAA,CAAA;AAAA,EAC1B;AAEA,SAAQT,oBAAA,oBAAA,EAAmB,MAAY,wBAAwB,eAAgB,CAAA;AACnF;AAOA,MAAM,qBAAiE,CAAC,EAAE,MAAM,6BAA6B;AACnG,QAAA,SAAS,CAAC,SAAe;AAC3B,YAAQ,MAAM;AAAA,MACV,KAAK;AACM,eAAA;AAAA,UACH,OAAO;AAAA,UACP,SACIA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACG;AAAA,cACA,QAAQ,uBAAuB;AAAA,cAC/B,UAAU,uBAAuB;AAAA,YAAA;AAAA,UACrC;AAAA,QAAA;AAAA,IAGhB;AAAA,EAAA;AAGE,QAAA,OAAO,uBAAuB,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAE7D,SAAAA,oBAAC,QAAK,MAAY,6BAAUY,WAAQ,EAAA,MAAY,uBAAgD,CAAA,EAAI,CAAA;AAC/G;AAOA,MAAMA,YAA2C,CAAC,EAAE,MAAM,6BAA6B;AAE/E,SAAAT,oBAAC,OAAI,EAAA,OAAM,iBACP,UAAA;AAAA,IAAAH,oBAAC,qBAAkB,WAAU,mBAAkB,SAAS,MAAM,MAAM,UAAS,iBAAgB;AAAA,IAC7FA,oBAAC,iBAAc,wBAAgD;AAAA,wBAC9D,YAAW,EAAA;AAAA,EAChB,EAAA,CAAA;AAER;AAMA,MAAM,gBAAuD,CAAC,EAAE,6BAA6B;AACnF,QAAA,QAAQS,EAAW,eAAe;AACxC,6BACK,MACG,EAAA,UAAA;AAAA,IAAAT,oBAAC,iBAAc,UAAe,kBAAA,CAAA;AAAA,wBAC7B,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MACiF;AAAA,MAC3F,uBAAuB,OAAO,KAAK,IAAI;AAAA,MAAE;AAAA,IAAA,GAE9C;AAAA,wBACC,mBAAkB,EAAA,eAAc,aAAY,QAAQ,wBAAwB,UAAU,OAAO;AAAA,EAClG,EAAA,CAAA;AAER;;;;;;;;;;;ACrGa,IAAA,qBAAN,cAAiC,iCAAiC;AAAA,EAAlE,cAAA;AAAA,UAAA,GAAA,SAAA;AASH,SAAA,SAAmB;AAMnB,SAAA,QAAgB,CAAC,OAAO;AAOxB,SAAA,SAAsB;AAQN,SAAA,QAAA;AAQC,SAAA,SAAA;AAOU,SAAA,mBAAA;AAMwB,SAAA,uBAAA;AAOtB,SAAA,WAAA;AAAA,EAAA;AAAA,EAEpB,SAAS;AAEV,WAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,kBAAkB,KAAK;AAAA,QACvB,sBAAsB,KAAK;AAAA,QAC3B,UAAU,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AACJ;AAjEIP,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,OAAO;AAAA,GARhB,mBAST,WAAA,UAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,OAAO;AAAA,GAdhB,mBAeT,WAAA,SAAA,CAAA;AAOAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GArBjB,mBAsBT,WAAA,UAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA7BjB,mBA8BT,WAAA,SAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GArCjB,mBAsCT,WAAA,UAAA,CAAA;AAOAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA5CjB,mBA6CT,WAAA,oBAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAlDjB,mBAmDT,WAAA,wBAAA,CAAA;AAOAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAzDjB,mBA0DT,WAAA,YAAA,CAAA;AA1DS,qBAAND,kBAAA;AAAA,EADNE,IAAc,cAAc;AAAA,GAChB,kBAAA;ACpBA,MAAA,wCAAwC,CACjD,MACA,iBACC;AACD,QAAM,0BAA0B,KAAK,IAAI,CAAC,EAAE,aAAa,eAAe;AAAA,IACpE;AAAA,IACA,SAAS,IAAI,IAAI,QAAQ,IAAI,CAAC;;AAAU,eAAC,WAAM,cAAN,mBAAiB,YAAY,KAAK;AAAA,KAAC,CAAC;AAAA,EAC/E,EAAA;AAEF,QAAM,+BAA+B,wBAChC,IAAI,CAAC,EAAE,QAAQ,MAAM,CAAC,GAAG,QAAQ,OAAQ,CAAA,EAAE,IAAI,CAAC,UAAU,MAAM,SAAS,CAAC,EAC1E,OAAO,CAAC,KAAK,6BAAa,IAAI,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,oBAAI,IAA2B,CAAA;AAEhF,QAAA,SAAS,kBAAkB,4BAA4B;AAC7D,MAAI,WAAW,MAAM;AACjB,WAAO;EACX;AAEA,QAAM,gBAA0C,mBAAmB,OAAO,KAAK,OAAO,GAAG;AAErF,MAAA,6BAA6B,IAAI,IAAI,GAAG;AACxC,kBAAc,QAAQ,IAAI;AAAA,EAC9B;AAEO,SAAA,cAAc,IAAI,CAAC,cAAc;AACpC,WAAO,wBAAwB;AAAA,MAC3B,CAAC,KAAK,YAAa;;AAAA;AAAA,UACf,GAAG;AAAA,UACH,CAAC,QAAQ,WAAW,KAAG,aAAQ,QAAQ,IAAI,uCAAW,UAAU,MAAzC,mBAA4C,UAAS;AAAA,QAAA;AAAA;AAAA,MAEhF,EAAE,CAAC,YAAY,IAAG,uCAAW,eAAc,UAAU;AAAA,IAAA;AAAA,EACzD,CACH;AACL;ACxBA,MAAM,SAAS,GAAG,aAAa;AAExB,MAAM,kCAAkC,CAAC,EAAE,MAAM,qBAAuD;AAC3G,QAAM,SAA6BO;AAAAA,IAC/B,OAAO;AAAA,MACH,MAAM;AAAA,MACN,MAAM;AAAA,QACF,UAAU8D,cAAY,IAAI;AAAA,MAC9B;AAAA,MACA,SAAS;AAAA,QACL,qBAAqB;AAAA,QACrB,WAAW;AAAA,QACX,QAAQ;AAAA,UACJ,GAAG;AAAA,YACC,MAAM,cAAc,cAAc,EAAE;AAAA,UACxC;AAAA,QACJ;AAAA,QACA,SAAS;AAAA,UACL,QAAQ;AAAA,YACJ,SAAS;AAAA,UACb;AAAA,UACA,SAAS;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,UACf;AAAA,QACJ;AAAA,MACJ;AAAA,IAAA;AAAA,IAEJ,CAAC,MAAM,cAAc;AAAA,EAAA;AAGlB,SAAAhE,oBAAC,SAAQ,EAAA,eAAe,OAAQ,CAAA;AAC3C;AAEA,MAAMgE,gBAAc,CAAC,SAAoC;AAC/C,QAAA,YAAY,sCAAsC,MAAM,MAAM;AAEpE,SAAO,KAAK;AAAA,IACR,CAAC,EAAE,YAAY,GAAG,WACb;AAAA,MACG,aAAa;AAAA,MACb,OAAO;AAAA,MACP,iBAAiB,yBAAyB,OAAO,GAAG;AAAA,MACpD,aAAa,yBAAyB,KAAK;AAAA,MAC3C,MAAM,UAAU,IAAI,CAAC,SAAS;AAAA,QAC1B,GAAG,IAAI;AAAA,QACP,GAAG,IAAI,WAAW;AAAA,MAAA,EACpB;AAAA,IAAA;AAAA,EACN;AAEZ;AClDA,MAAM,SAAS,GAAG,aAAa;AAExB,MAAM,mCAAmC,CAAC,EAAE,MAAM,qBAAuD;AAC5G,QAAM,SAA6B9D;AAAAA,IAC/B,OAAO;AAAA,MACH,MAAM;AAAA,MACN,MAAM;AAAA,QACF,UAAU,YAAY,IAAI;AAAA,MAC9B;AAAA,MACA,SAAS;AAAA,QACL,qBAAqB;AAAA,QACrB,WAAW;AAAA,QACX,QAAQ;AAAA,UACJ,GAAG;AAAA,YACC,MAAM,cAAc,cAAc,EAAE;AAAA,UACxC;AAAA,QACJ;AAAA,QACA,SAAS;AAAA,UACL,QAAQ;AAAA,YACJ,SAAS;AAAA,UACb;AAAA,UACA,SAAS;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,UACf;AAAA,QACJ;AAAA,MACJ;AAAA,IAAA;AAAA,IAEJ,CAAC,MAAM,cAAc;AAAA,EAAA;AAGlB,SAAAF,oBAAC,SAAQ,EAAA,eAAe,OAAQ,CAAA;AAC3C;AAEA,MAAM,cAAc,CAAC,SAAoC;AAC/C,QAAA,YAAY,sCAAsC,MAAM,MAAM;AAEpE,SAAO,KAAK;AAAA,IACR,CAAC,EAAE,YAAY,GAAG,WACb;AAAA,MACG,aAAa;AAAA,MACb,aAAa;AAAA,MACb,OAAO;AAAA,MACP,iBAAiB,yBAAyB,OAAO,GAAG;AAAA,MACpD,aAAa,yBAAyB,KAAK;AAAA,MAC3C,MAAM,UAAU,IAAI,CAAC,SAAS;AAAA,QAC1B,GAAG,IAAI;AAAA,QACP,GAAG,IAAI,WAAW;AAAA,MAAA,EACpB;AAAA,IAAA;AAAA,EACN;AAEZ;ACpDO,MAAM,+BAA+B,CAAC,EAAE,MAAM,aAAa,eAAkD;AAChH,QAAM,UAAU;AAAA,IACZ;AAAA,MACI,MAAM;AAAA,MACN,MAAM;AAAA,IACV;AAAA,IACA,GAAG,KAAK,IAAI,CAAC,aAAa;AAAA,MACtB,MAAM,QAAQ;AAAA,MACd,MAAM;AAAA,IAAA,EACR;AAAA,EAAA;AAGA,QAAA,gBAAgBE,EAAQ,MAAM;AAC1B,UAAA,YAAY,sCAAsC,MAAM,WAAW;AAClE,WAAA,OAAO,OAAO,SAAS,EAAE,IAAI,CAAC,QAAQ,OAAO,OAAO,GAAG,CAAC;AAAA,EAAA,GAChE,CAAC,MAAM,WAAW,CAAC;AAEtB,SAAQF,oBAAA,OAAA,EAAM,MAAM,eAAe,SAAkB,SAAoB,CAAA;AAC7E;ACxBA,eAAsB,+BAClB,OACA,aACA,gBACA,aACA,iBACF;AACQ,QAAA,eAAe,UAAU,WAAW;AAEpC,QAAA,UAAU,aAAa,IAAI,OAAO,EAAE,aAAa,aAAAiE,mBAAkB;AAC/D,UAAA,EAAE,QAAQ,IAAI,MAAM;AAAA,MACtBA;AAAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,EACF,SAAS,KAAK;AAET,WAAA;AAAA,MACH;AAAA,MACA,SAAS,QAAQ,KAAK,6BAA6B;AAAA,IAAA;AAAA,EACvD,CACH;AAEM,SAAA,QAAQ,IAAI,OAAO;AAC9B;ACOa,MAAA,0BAA0B,CAAC,mBAAiD;AAC/E,QAAA,EAAE,OAAO,OAAW,IAAA;AACpB,QAAA,OAAO,EAAE,QAAQ;AAGnB,SAAAjE,oBAAC,eAAc,EAAA,MACX,UAACA,oBAAA,iBAAA,EAAgB,MACb,UAAAA,oBAAC,8BAA8B,EAAA,GAAG,eAAgB,CAAA,EAAA,CACtD,EACJ,CAAA;AAER;AAEA,MAAM,+BAA+B,CAAC,mBAAiD;AACnF,QAAM,EAAE,aAAa,gBAAgB,aAAa,oBAAoB;AAChE,QAAA,QAAQS,EAAW,eAAe;AAExC,QAAM,EAAE,MAAM,OAAO,UAAc,IAAA;AAAA,IAC/B,MAAM,+BAA+B,OAAO,aAAa,gBAAgB,aAAa,eAAe;AAAA,IACrG,CAAC,OAAO,aAAa,gBAAgB,aAAa,eAAe;AAAA,EAAA;AAGrE,MAAI,WAAW;AACX,+BAAQ,gBAAe,CAAA,CAAA;AAAA,EAC3B;AAEA,MAAI,UAAU,MAAM;AACV,UAAA;AAAA,EACV;AAEA,MAAI,SAAS,MAAM;AACf,+BAAQ,eAAc,CAAA,CAAA;AAAA,EAC1B;AAEA,SAAQT,oBAAA,6BAAA,EAA4B,MAAY,wBAAwB,eAAgB,CAAA;AAC5F;AAOA,MAAM,8BAA8B,CAAC,EAAE,MAAM,6BAA+D;AACxG,QAAM,CAAC,gBAAgB,iBAAiB,IAAIC,EAAoB,QAAQ;AAElE,QAAA,SAAS,CAAC,SAAsC;AAClD,YAAQ,MAAM;AAAA,MACV,KAAK;AACM,eAAA;AAAA,UACH,OAAO;AAAA,UACP,SAASD,oBAAC,iCAAgC,EAAA,MAAY,eAAgC,CAAA;AAAA,QAAA;AAAA,MAE9F,KAAK;AACM,eAAA;AAAA,UACH,OAAO;AAAA,UACP,SAASA,oBAAC,kCAAiC,EAAA,MAAY,eAAgC,CAAA;AAAA,QAAA;AAAA,MAE/F,KAAK;AACM,eAAA;AAAA,UACH,OAAO;AAAA,UACP,SACIA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACG;AAAA,cACA,aAAa,uBAAuB;AAAA,cACpC,UAAU,uBAAuB;AAAA,YAAA;AAAA,UACrC;AAAA,QAAA;AAAA,MAGZ;AACI,cAAM,IAAI,MAAM,iBAAiB,IAAI,EAAE;AAAA,IAC/C;AAAA,EAAA;AAIA,SAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG,MAAM,uBAAuB,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAAA,MAC7D,SAAS,CAAC,cACNA;AAAAA,QAACY;AAAAA,QAAA;AAAA,UACG;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EAAA;AAIhB;AAUA,MAAMA,YAAU,CAAC,EAAE,WAAW,MAAM,gBAAgB,mBAAmB,6BAA2C;AAC9G,SAEST,oBAAA,UAAA,EAAA,UAAA;AAAA,IAAA,cAAc,WACXH;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG;AAAA,QACA;AAAA,QACA,cAAc,CAAC,UAAU,aAAa;AAAA,MAAA;AAAA,IAC1C;AAAA,IAEJA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAU;AAAA,QACV,SAAS,MAAM,sCAAsC,MAAM,uBAAuB,WAAW;AAAA,QAC7F,UAAS;AAAA,MAAA;AAAA,IACb;AAAA,IACAA,oBAAC,+BAA4B,wBAAgD;AAAA,wBAC5E,YAAW,EAAA;AAAA,EAChB,EAAA,CAAA;AAER;AAMA,MAAM,8BAAmF,CAAC;AAAA,EACtF;AACJ,MAAM;AACI,QAAA,QAAQS,EAAW,eAAe;AAExC,6BACK,MACG,EAAA,UAAA;AAAA,IAAAT,oBAAC,iBAAc,UAA6B,gCAAA,CAAA;AAAA,wBAC3C,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MACsD;AAAA,MACjEA,oBAAC,KAAG,EAAA,UAAA,uBAAuB,YAAY,CAAA;AAAA,MACtC,uBAAuB,kBAAkB,KACtC,sBAAsB,uBAAuB,eAAe,IAAI,uBAAuB,WAAW;AAAA,MAAkB;AAAA,IAAA,GAE5H;AAAA,IACAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,eAAc;AAAA,QACd,QAAQ;AAAA,QACR,UAAU;AAAA,MAAA;AAAA,IACd;AAAA,EACJ,EAAA,CAAA;AAER;;;;;;;;;;;AC/Ja,IAAA,mCAAN,cAA+C,iCAAiC;AAAA,EAAhF,cAAA;AAAA,UAAA,GAAA,SAAA;AAeH,SAAA,cAQS,EAAE,aAAa,IAAI,aAAa,CAAA;AAUhB,SAAA,iBAAA;AAMa,SAAA,QAAA,CAAC,OAAO,QAAQ,OAAO;AAQ7C,SAAA,QAAA;AAQC,SAAA,SAAA;AAMgC,SAAA,cAAA;AAYvB,SAAA,kBAAA;AAOG,SAAA,WAAA;AAAA,EAAA;AAAA,EAEpB,SAAS;AAEV,WAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,aAAa,KAAK;AAAA,QAClB,gBAAgB,KAAK;AAAA,QACrB,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,aAAa,KAAK;AAAA,QAClB,iBAAiB,KAAK;AAAA,QACtB,UAAU,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAG3B;AACJ;AAjFIP,kBAAA;AAAA,EADKC,GAAS,EAAC,MAAM,QAAO;AAAA,GAdnB,iCAeT,WAAA,eAAA,CAAA;AAkBAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAhCjB,iCAiCT,WAAA,kBAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,OAAO;AAAA,GAtChB,iCAuCT,WAAA,SAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA9CjB,iCA+CT,WAAA,SAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAtDjB,iCAuDT,WAAA,UAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA5DjB,iCA6DT,WAAA,eAAA,CAAA;AAYAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAxEjB,iCAyET,WAAA,mBAAA,CAAA;AAOAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA/EjB,iCAgFT,WAAA,YAAA,CAAA;AAhFS,mCAAND,kBAAA;AAAA,EADNE,IAAc,+BAA+B;AAAA,GACjC,gCAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;ACiMN,SAAS,gCAAgC,UAAmC;AAC/E,SAAO,SAAS;AACpB;AAEO,SAAS,kBAAkB,MAAgB;AAC9C,SAAO,KAAK;AAChB;ACjMO,MAAM,UAEb;AAAA,EAKI,YACa,oBACA,qBACT,gBACF;AAHW,SAAA,qBAAA;AACA,SAAA,sBAAA;AANJ,SAAA,2BAA4C;AAC5C,SAAA,oCAAoB;AACpB,SAAA,qCAAqB;AAO1B,QAAI,gBAAgB;AAChB,WAAK,gBAAgB,IAAI,IAAI,eAAe,aAAa;AACzD,WAAK,iBAAiB,IAAI,IAAI,eAAe,cAAc;AAC3D,WAAK,OAAO,IAAI,IAAI,eAAe,IAAI;AAAA,IAC3C;AAAA,EACJ;AAAA,EAEA,IAAI,cAAoB,eAAqB;;AACnC,UAAA,yBAAyB,KAAK,mBAAmB,YAAY;AAC7D,UAAA,0BAA0B,KAAK,oBAAoB,aAAa;AACtE,YAAO,UAAK,KAAK,IAAI,sBAAsB,MAApC,mBAAuC,IAAI;AAAA,EACtD;AAAA,EAEA,OAAO,KAAW,eAAsB;AAC9B,UAAA,yBAAyB,KAAK,mBAAmB,GAAG;AAC1D,UAAM,MAAM,KAAK,KAAK,IAAI,sBAAsB;AAChD,QAAI,QAAQ,QAAW;AACnB,aAAO;IACX;AACA,WAAO,MAAM,KAAK,KAAK,eAAe,MAAM,EAAE,IAAI,CAACuE,SAAQ,IAAI,IAAIA,IAAG,KAAK,aAAa;AAAA,EAC5F;AAAA,EAEA,IAAI,cAAoB,eAAqB,OAAc;AACjD,UAAA,yBAAyB,KAAK,mBAAmB,YAAY;AAC7D,UAAA,0BAA0B,KAAK,oBAAoB,aAAa;AAEtE,QAAI,CAAC,KAAK,KAAK,IAAI,sBAAsB,GAAG;AACxC,WAAK,KAAK,IAAI,wBAAwB,oBAAI,IAAoB,CAAA;AAAA,IAClE;AAEA,SAAK,KAAK,IAAI,sBAAsB,EAAG,IAAI,yBAAyB,KAAK;AAEpE,SAAA,cAAc,IAAI,wBAAwB,YAAY;AACtD,SAAA,eAAe,IAAI,yBAAyB,aAAa;AAAA,EAClE;AAAA,EAEA,UAAU,KAAW;AACX,UAAA,yBAAyB,KAAK,mBAAmB,GAAG;AACrD,SAAA,KAAK,OAAO,sBAAsB;AAClC,SAAA,cAAc,OAAO,sBAAsB;AAAA,EACpD;AAAA,EAEA,mBAAmB;AACf,WAAO,MAAM,KAAK,KAAK,cAAc,OAAQ,CAAA;AAAA,EACjD;AAAA,EAEA,oBAAoB;AAChB,WAAO,MAAM,KAAK,KAAK,eAAe,OAAQ,CAAA;AAAA,EAClD;AAAA,EAEA,WAAW,eAAsB;AAC7B,WAAO,KAAK,iBAAA,EAAmB,IAAI,CAAC,iBAAiB;AACjD,aAAO,KAAK,kBAAA,EAAoB,IAAI,CAAC,kBAAkB;AACnD,eAAO,KAAK,IAAI,cAAc,aAAa,KAAK;AAAA,MAAA,CACnD;AAAA,IAAA,CACJ;AAAA,EACL;AAAA,EAEA,cAAgD;AACrC,WAAA;AAAA,MACH,eAAe,KAAK;AAAA,MACpB,gBAAgB,KAAK;AAAA,MACrB,MAAM,KAAK;AAAA,IAAA;AAAA,EAEnB;AACJ;AAEO,MAAM,UAEb;AAAA,EAMI,YAAY,KAA+B;AACvC,SAAK,gBAAgB,IAAI,IAAI,IAAI,aAAa;AAC9C,SAAK,iBAAiB,IAAI,IAAI,IAAI,cAAc;AAEhD,QAAI,eAAe,WAAW;AAC1B,WAAK,UAAU,IAAI;AAAA,IACvB;AACA,SAAK,UAAU;AAAA,EACnB;AAAA,EAEA,mBAAmB,KAAW;AACnB,WAAA,KAAK,QAAQ,mBAAmB,GAAG;AAAA,EAC9C;AAAA,EAEA,oBAAoB,KAAW;AACpB,WAAA,KAAK,QAAQ,oBAAoB,GAAG;AAAA,EAC/C;AAAA,EAEA,UAAU,KAAW;AACjB,SAAK,cAAc,OAAO,KAAK,mBAAmB,GAAG,CAAC;AAAA,EAC1D;AAAA,EAEA,IAAI,cAAoB,eAAqB;AACnC,UAAA,eAAe,KAAK,mBAAmB,YAAY;AACnD,UAAA,gBAAgB,KAAK,oBAAoB,aAAa;AAExD,QAAA,CAAC,KAAK,cAAc,IAAI,YAAY,KAAK,CAAC,KAAK,eAAe,IAAI,aAAa,GAAG;AAC3E,aAAA;AAAA,IACX;AAEA,WAAO,KAAK,QAAQ,IAAI,cAAc,aAAa;AAAA,EACvD;AAAA,EAEA,MAAM;AACI,UAAA,IAAI,MAAM,iCAAiC;AAAA,EACrD;AAAA,EAEA,mBAAmB;AACf,WAAO,MAAM,KAAK,KAAK,cAAc,OAAQ,CAAA;AAAA,EACjD;AAAA,EAEA,oBAAoB;AAChB,WAAO,MAAM,KAAK,KAAK,eAAe,OAAQ,CAAA;AAAA,EAClD;AAAA,EAEA,WAAW,eAAsB;AAC7B,WAAO,KAAK,iBAAA,EAAmB,IAAI,CAAC,iBAAiB;AACjD,aAAO,KAAK,kBAAA,EAAoB,IAAI,CAAC,kBAAkB;AACnD,eAAO,KAAK,QAAQ,IAAI,cAAc,aAAa,KAAK;AAAA,MAAA,CAC3D;AAAA,IAAA,CACJ;AAAA,EACL;AAAA,EAEA,OAAO,KAAW,eAAsB;AAC9B,UAAA,yBAAyB,KAAK,mBAAmB,GAAG;AAC1D,QAAI,CAAC,KAAK,cAAc,IAAI,sBAAsB,GAAG;AACjD,aAAO;IACX;AAEA,WAAO,KAAK,QAAQ,OAAO,KAAK,aAAa;AAAA,EACjD;AACJ;ACtKO,MAAM,oCAAoC,UAI/C;AAAA,EACE,YAAY,gBAAkG;AACpG,UAAA,iCAAiC,mBAAmB,cAAc;AAAA,EAC5E;AACJ;ACZO,SAAS,gCACZ,MACA,qBACA,mBACA,wBACA,oBACF;AACQ,QAAA,eAAe,IAAI,UAAU,IAAI;AAEvC,QAAM,uBAAuB,oBAAoB,OAAO,CAAC,UAAU;AAC/D,QAAI,MAAM,aAAa,mBAAmB,OAAO,MAAM,aAAa,mBAAmB,KAAK;AACjF,aAAA;AAAA,IACX;AACA,QAAI,kBAAkB,KAAK,CAAC,YAAY,QAAQ,YAAY,MAAM,SAAS,WAAW,CAAC,QAAQ,OAAO,GAAG;AAC9F,aAAA;AAAA,IACX;AACA,WAAO,uBAAuB;AAAA,MAC1B,CAAC,iBAAiB,aAAa,SAAS,MAAM,SAAS,QAAQ,CAAC,aAAa;AAAA,IAAA;AAAA,EACjF,CACH;AAEoB,uBAAA,QAAQ,CAAC,UAAU;AACvB,iBAAA,UAAU,MAAM,QAAQ;AAAA,EAAA,CACxC;AAEM,SAAA;AACX;AChBO,MAAM,qBAAiE,CAAC,EAAE,YAAY,oBAAoB;AAC7G,QAAM,kBAAkB;AAGpB,SAAA/D,oBAAC,OAAI,EAAA,WAAU,qBACX,UAAA;AAAA,IAAAH;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,UACH,iBAAiB,0BAA0B,WAAW,OAAO,CAAC;AAAA,UAC9D,OAAO;AAAA,QACX;AAAA,QACA,WAAW;AAAA,QAEV,UAAA,iBAAiB,WAAW,KAAK,CAAC;AAAA,MAAA;AAAA,IACvC;AAAA,IACAA,oBAAC,OAAI,EAAA,WAAU,QACX,UAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAK,WAAW,MAAM;AAAA,QACtB,KAAK,WAAW,MAAM;AAAA,QACtB,QAAQ,CAAC,eAAe;AACpB,wBAAc,EAAE,GAAG,YAAY,KAAK,aAAa,KAAK;AAAA,QAC1D;AAAA,QACA,QAAQ,CAAC,eAAe;AACpB,wBAAc,EAAE,GAAG,YAAY,KAAK,aAAa,KAAK;AAAA,QAC1D;AAAA,MAAA;AAAA,IAAA,GAER;AAAA,IACAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,UACH,iBAAiB,0BAA0B,WAAW,OAAO,CAAC;AAAA,UAC9D,OAAO;AAAA,QACX;AAAA,QACA,WAAW;AAAA,QAEV,UAAA,iBAAiB,WAAW,KAAK,CAAC;AAAA,MAAA;AAAA,IACvC;AAAA,EACJ,EAAA,CAAA;AAER;AAEa,MAAA,uBAAuB,CAAC,OAAe,eAA2B;AACvE,MAAA,WAAW,QAAQ,WAAW,KAAK;AAC5B,WAAA,0BAA0B,WAAW,OAAO,CAAC;AAAA,EACxD;AAEM,QAAA,aAAa,WAAW,MAAM,WAAW;AAEzC,QAAA,SAAS,QAAQ,WAAW,OAAO;AAElC,SAAA,0BAA0B,WAAW,OAAO,KAAK;AAC5D;AAEa,MAAA,uBAAuB,CAAC,OAAe,eAA2B;AACvE,MAAA,WAAW,QAAQ,WAAW,KAAK;AAC5B,WAAA;AAAA,EACX;AAEM,QAAA,aAAa,WAAW,MAAM,WAAW;AAEzC,QAAA,SAAS,QAAQ,WAAW,OAAO;AAElC,SAAA,SAAS,MAAM,UAAU;AACpC;AC5DA,SAAS,eAAe,UAA4B;AAChD,UAAQ,UAAU;AAAA,IACd,KAAK;AACM,aAAA;AAAA,IACX,KAAK;AACM,aAAA;AAAA,IACX,KAAK;AACM,aAAA;AAAA,IACX,KAAK;AACM,aAAA;AAAA,IACX,KAAK;AACM,aAAA;AAAA,IACX,KAAK;AACM,aAAA;AAAA,IACX,KAAK;AACM,aAAA;AAAA,IACX,KAAK;AACM,aAAA;AAAA,IACX,KAAK;AACM,aAAA;AAAA,EACf;AACJ;AAEA,MAAM,UAA2C,CAAC,EAAE,UAAU,SAAS,WAAW,eAAe;AAEzF,SAAAG,oBAAC,OAAI,EAAA,WAAU,0BACX,UAAA;AAAA,IAACH,oBAAA,OAAA,EAAI,WAAU,sBAAsB,SAAS,CAAA;AAAA,IAC9CA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAW,mGAAmG,eAAe,QAAQ,CAAC;AAAA,QAErI,UAAA;AAAA,MAAA;AAAA,IACL;AAAA,EACJ,EAAA,CAAA;AAER;ACpCA,MAAM,0BAA0B;AAChC,MAAM,0BAA0B;AAEhC,MAAM,wBAAuE,CAAC,EAAE,MAAM,iBAAiB;AAC7F,QAAA,eAAe,KAAK;AAC1B,QAAM,iBAAiB,aAAa,MAAM,GAAG,uBAAuB;AAE9D,QAAA,QAAQ,KAAK;AAEnB,QAAM,CAAC,oBAAoB,qBAAqB,IAAIC,EAAS,KAAK;AAC5D,QAAA,UAAUH,EAAuB,IAAI;AACzB,oBAAA,SAAS,MAAM,QAAQ,qBAAqB;AAE9D,SAESK,oBAAA,UAAA,EAAA,UAAA;AAAA,IAAA,aAAa,SAAS,2BAClBA,oBAAA,OAAA,EAAI,WAAU,QAAO,UAAA;AAAA,MAAA;AAAA,MACT;AAAA,MAAwB;AAAA,MAAK,aAAa;AAAA,MAAO;AAAA,IAAA,GAE9D;AAAA,IAEH,aAAa,WAAW,yBACpB,OAAI,EAAA,WAAW,uBAAuB,UAAmC,uCAAA;AAAA,IAE9EH;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,KAAK;AAAA,QACL,OAAO;AAAA,UACH,SAAS;AAAA,UACT,kBAAkB,UAAU,eAAe,MAAM;AAAA,UACjD,qBAAqB,GAAG,uBAAuB,cAAc,MAAM,MAAM;AAAA,QAC7E;AAAA,QAEC,UAAe,eAAA,IAAI,CAAC,UAAU,aAAa;AAEpC,iBAAAG,oBAACgE,UAAA,EACG,UAAA;AAAA,YAAAnE;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAEG,OAAO,EAAE,cAAc,WAAW,GAAG,iBAAiB,EAAE;AAAA,gBAExD,UAAAA,oBAAC,gBAAa,SAAoB,CAAA;AAAA,cAAA;AAAA,cAH7B,YAAY,SAAS,SAAA,CAAU;AAAA,YAIxC;AAAA,YACC,MAAM,IAAI,CAAC,MAAM,gBAAgB;AAC9B,oBAAM,QAAQ,KAAK,IAAI,UAAU,IAAI,KAAK,EAAE,YAAY,GAAG,OAAO,GAAG,YAAY,EAAE;AACnF,oBAAM,kBAAkB;AAAA,gBACpB;AAAA,gBACA,eAAe;AAAA,gBACf;AAAA,gBACA,MAAM;AAAA,cAAA;AAGN,qBAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACG,OAAO,EAAE,cAAc,WAAW,GAAG,iBAAiB,cAAc,EAAE;AAAA,kBAGtE,UAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACG;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,sBACA;AAAA,oBAAA;AAAA,kBACJ;AAAA,gBAAA;AAAA,gBATK,GAAG,SAAS,SAAU,CAAA,IAAI,KAAK,UAAU;AAAA,cAAA;AAAA,YAUlD,CAEP;AAAA,UAAA,EAAA,GA9BU,YAAY,SAAS,SAAU,CAAA,EA+B9C;AAAA,QAAA,CAEP;AAAA,MAAA;AAAA,IACL;AAAA,EACJ,EAAA,CAAA;AAER;AAEA,SAAS,kBACL,SACA,aACA,uBACF;AACED,IAAU,MAAM;AACZ,UAAM,aAAa,MAAM;AACrB,UAAI,QAAQ,SAAS;AACjB,cAAM,QAAQ,QAAQ,QAAQ,sBAAA,EAAwB;AACtD,cAAM,gBAAgB,QAAQ,QAAQ,uBAAuB,KAAK;AAClE,cAAM,yBAAyB;AAE/B,8BAAsB,eAAe,sBAAsB;AAAA,MAC/D;AAAA,IAAA;AAGO;AACJ,WAAA,iBAAiB,UAAU,UAAU;AAE5C,WAAO,MAAM;AACF,aAAA,oBAAoB,UAAU,UAAU;AAAA,IAAA;AAAA,EAEpD,GAAA,CAAC,aAAa,SAAS,qBAAqB,CAAC;AACpD;AAEA,MAAM,UAAU,CAAC,QAAgB,MAAM,WAAW,iBAAiB,SAAS,eAAe,EAAE,QAAQ;AAErG,SAAS,mBAAmB,UAAkB,MAAc,aAAqB,SAAiB;AAC9F,QAAM,WAAW,WAAW,OAAO,IAAI,WAAW;AAClD,QAAM,WAAW,cAAc,UAAU,IAAI,UAAU;AAChD,SAAA,GAAG,QAAQ,IAAI,QAAQ;AAClC;AAEA,MAAM,iBAOD,CAAC,EAAE,OAAO,UAAU,MAAM,iBAAiB,oBAAoB,iBAAiB;AAC3E,QAAA,YAAY,gBAAgB,IAAI;AAEhC,QAAA,qCACD,OACG,EAAA,UAAA;AAAA,IAACC,oBAAA,KAAA,EACG,8BAAC,QAAK,EAAA,WAAU,aAAa,UAAU,UAAA,eAAc,EACzD,CAAA;AAAA,wBACC,KAAE,EAAA,UAAA;AAAA,MAAA;AAAA,MAAE,oBAAoB,SAAS;AAAA,MAAE;AAAA,IAAA,GAAC;AAAA,IACrCA,oBAAC,KAAG,EAAA,UAAA,SAAS,KAAK,CAAA;AAAA,wBACjB,KAAE,EAAA,UAAA;AAAA,MAAA;AAAA,MAAa,iBAAiB,MAAM,UAAU;AAAA,IAAA,GAAE;AAAA,wBAClD,KAAE,EAAA,UAAA;AAAA,MAAA;AAAA,MACS,MAAM;AAAA,MAAM;AAAA,MAAI,MAAM;AAAA,MAAW;AAAA,IAAA,GAC7C;AAAA,EACJ,EAAA,CAAA;AAIA,SAAAA,oBAAC,SAAI,WAAW,sBACZ,8BAAC,SAAQ,EAAA,SAAS,gBAAgB,UAAU,iBACxC,UAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG,OAAO;AAAA,QACH,iBAAiB,qBAAqB,MAAM,YAAY,UAAU;AAAA,QAClE,OAAO,qBAAqB,MAAM,YAAY,UAAU;AAAA,MAC5D;AAAA,MACA,WAAW;AAAA,MAEV,UAAqB,qBAAA,iBAAiB,MAAM,YAAY,CAAC,IAAI;AAAA,IAAA;AAAA,EAAA,EAEtE,CAAA,EACJ,CAAA;AAER;AAEA,MAAM,sBAAsB,CAAC,SAAwB;AACjD,MAAI,gBAAgB,mBAAmB;AACnC,WAAO,KAAK;EAChB;AAEO,SAAA,GAAG,KAAK,SAAS,SAAU,CAAA,MAAM,KAAK,QAAQ,SAAU,CAAA;AACnE;AAEA,MAAM,eAAyE,CAAC,EAAE,eAAe;AAC7F,SAAQA,oBAAA,OAAA,EAAI,WAAU,eAAe,mBAAS,KAAK,CAAA;AACvD;ACtKO,MAAM,6BAAiF,CAAC;AAAA,EAC3F;AAAA,EACA;AACJ,MAAM;AACF,SACKA,oBAAA,OAAA,EAAI,WAAU,QACX,8BAAC,UAAS,EAAA,aAAa,eAAe,WAAW,gBAC7C,UAACA,oBAAA,oBAAA,EAAmB,YAAwB,cAA8B,CAAA,GAC9E,EACJ,CAAA;AAER;AChBgB,SAAA,aAAgC,iBAA0B,QAAgB;AACtF,QAAM,CAAC,MAAM,OAAO,IAAIC,EAA+B,MAAS;AAChE,QAAM,CAAC,OAAO,QAAQ,IAAIA,EAA4B,MAAS;AAC/D,QAAM,CAAC,WAAW,YAAY,IAAIA,EAAS,IAAI;AAE/CF,IAAU,MAAM;AACL,WAAA,YAAY,CACf,UAKC;AACD,YAAM,EAAE,QAAQ,MAAA8D,OAAM,OAAAlD,WAAU,MAAM;AAEtC,cAAQ,QAAQ;AAAA,QACZ,KAAK;AACD,uBAAa,IAAI;AACjB;AAAA,QACJ,KAAK;AACD,kBAAQkD,KAAI;AACZ,mBAAS,MAAS;AAClB,uBAAa,KAAK;AAClB;AAAA,QACJ,KAAK;AACD,mBAASlD,MAAK;AACd,uBAAa,KAAK;AAClB;AAAA,QACJ;AACI,gBAAM,IAAI,MAAM,mBAAmB,MAAM,EAAE;AAAA,MACnD;AAAA,IAAA;AAGG,WAAA,iBAAiB,CAAC,UAAwB;AAC7C,eAAS,IAAI,MAAM,yDAAyD,MAAM,IAAI,EAAE,CAAC;AACzF,mBAAa,KAAK;AAAA,IAAA;AAAA,EACtB,GACD,CAAC,MAAM,CAAC;AAEXZ,IAAU,MAAM;AACZ,WAAO,YAAY,eAAe;AAAA,EAAA,GACnC,CAAC,iBAAiB,MAAM,CAAC;AAErB,SAAA,EAAE,MAAM,OAAO;AAC1B;ACCa,MAAA,oBAA+D,CAAC,mBAAmB;AACtF,QAAA,EAAE,OAAO,OAAW,IAAA;AACpB,QAAA,OAAO,EAAE,QAAQ;AAGnB,SAAAC,oBAAC,eAAc,EAAA,MACX,UAACA,oBAAA,iBAAA,EAAgB,MACb,UAAAA,oBAAC,wBAAwB,EAAA,GAAG,eAAgB,CAAA,EAAA,CAChD,EACJ,CAAA;AAER;AAEa,MAAA,yBAAoE,CAAC,mBAAmB;AAC3F,QAAA,QAAQS,EAAW,eAAe;AACxC,QAAM,EAAE,aAAa,cAAc,aAAa,mBAAmB;AAE7D,QAAA,kBAAkBP,EAAQ,MAAM;AAC3B,WAAA;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACJ,GACD,CAAC,aAAa,OAAO,gBAAgB,aAAa,YAAY,CAAC;AAElE,QAAM,SAASA,EAAQ,MAAM,IAAIkE,cAAuB,GAAG,CAAE,CAAA;AAE7D,QAAM,EAAE,MAAM,OAAO,UAAc,IAAA;AAAA,IAC/B;AAAA,IACA;AAAA,EAAA;AAGJ,MAAI,WAAW;AACX,+BAAQ,gBAAe,CAAA,CAAA;AAAA,EAC3B;AAEA,MAAI,UAAU,QAAW;AACf,UAAA;AAAA,EACV;AAEA,MAAI,SAAS,QAAQ,SAAS,UAAa,KAAK,oBAAoB,WAAW,GAAG;AAC9E,+BAAQ,eAAc,CAAA,CAAA;AAAA,EAC1B;AAEM,QAAA,EAAE,qBAAqB,2BAA+B,IAAA;AACtD,QAAA,uBAAuB,IAAI,4BAA4B,0BAA0B;AAEnF,SAAApE;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA,wBAAwB;AAAA,IAAA;AAAA,EAAA;AAGpC;AAQA,MAAM,wBAAsE,CAAC;AAAA,EACzE;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACI,QAAA,CAAC,oBAAoB,qBAAqB,IAAIC,EAAS,EAAE,KAAK,MAAM,KAAK,IAAA,CAAK;AACpF,QAAM,CAAC,YAAY,aAAa,IAAIA,EAAqB,EAAE,KAAK,GAAG,KAAK,GAAG,OAAO,SAAU,CAAA;AAE5F,QAAM,CAAC,mBAAmB,oBAAoB,IAAI,qBAAqB,uBAAuB,YAAY;AAC1G,QAAM,CAAC,wBAAwB,yBAAyB,IAAIA,EAAkC;AAAA,IAC1F,EAAE,OAAO,iBAAiB,SAAS,MAAM,MAAM,eAAe;AAAA,IAC9D,EAAE,OAAO,aAAa,SAAS,MAAM,MAAM,WAAW;AAAA,EAAA,CACzD;AAEK,QAAA,eAAeC,EAAQ,MAAM;AACxB,WAAA;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EACJ,GACD,CAAC,sBAAsB,qBAAqB,mBAAmB,wBAAwB,kBAAkB,CAAC;AAEvG,QAAA,SAAS,CAAC,SAAe;AAC3B,QAAI,iBAAiB,QAAW;AACrB,aAAA;AAAA,QACH,OAAO;AAAA,QACP,6BAAU,gBAAe,EAAA;AAAA,MAAA;AAAA,IAEjC;AACA,YAAQ,MAAM;AAAA,MACV,KAAK;AACM,eAAA;AAAA,UACH,OAAO;AAAA,UACP,SAASF,oBAAC,uBAAsB,EAAA,MAAM,cAAc,YAAwB;AAAA,QAAA;AAAA,IAExF;AAAA,EAAA;AAGE,QAAA,OAAO,uBAAuB,MAAM,IAAI,CAAC,SAAS,OAAO,IAAI,CAAC;AAE9D,QAAA,UAAU,CAAC,cACbA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAID,SAAAA,oBAAC,MAAK,EAAA,MAAY,QAAkB,CAAA;AAC/C;AAgBA,MAAM,UAA2C,CAAC;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,SAESG,oBAAA,UAAA,EAAA,UAAA;AAAA,IAAA,cAAc,UACXH,oBAAC,4BAA2B,EAAA,YAAwB,eAA8B;AAAA,IAEtFA,oBAAC,iBAAgB,EAAA,mBAAsC,qBAA4C,CAAA;AAAA,IACnGA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG;AAAA,QACA;AAAA,MAAA;AAAA,IACJ;AAAA,IACAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG;AAAA,QACA,kBAAkB,CAAC,QAAQ,sBAAsB,CAAC,UAAU,EAAE,GAAG,MAAM,IAAA,EAAM;AAAA,QAC7E,kBAAkB,CAAC,QAAQ,sBAAsB,CAAC,UAAU,EAAE,GAAG,MAAM,IAAA,EAAM;AAAA,QAC7E,aAAY;AAAA,MAAA;AAAA,IAChB;AAAA,IACAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,WAAU;AAAA,QACV,SAAS,MAAM,gBAAgB,YAAY;AAAA,QAC3C,UAAS;AAAA,MAAA;AAAA,IACb;AAAA,IACAA,oBAAC,yBAAsB,wBAAgD;AAAA,wBACtE,YAAW,EAAA;AAAA,EAChB,EAAA,CAAA;AAER;AAMA,MAAM,wBAAuE,CAAC,EAAE,6BAA6B;AACnG,QAAA,QAAQS,EAAW,eAAe;AACxC,6BACK,MACG,EAAA,UAAA;AAAA,IAAAT,oBAAC,iBAAc,UAAmB,sBAAA,CAAA;AAAA,wBACjC,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MACuB,uBAAuB;AAAA,MAAa;AAAA,MAAe;AAAA,MACpF,uBAAuB;AAAA,MAAY;AAAA,IAAA,GAIxC;AAAA,wBACC,mBAAkB,EAAA,eAAc,uBAAsB,QAAQ,wBAAwB,UAAU,OAAO;AAAA,EAC5G,EAAA,CAAA;AAER;AAEA,SAAS,gBAAgB,cAAuC;AACtD,QAAA,QAAQ,aAAa,oBAAoB,IAAI,CAAC,SAAS,gBAAgB,IAAI,CAAC;AAElF,SAAO,aAAa,iBAAA,EAAmB,IAAI,CAAC,aAAa;AACrD,WAAO,MAAM;AAAA,MACT,CAAC,aAAa,SAAS;;AACnB,cAAM,eAAa,kBAAa,IAAI,UAAU,IAAI,MAA/B,mBAAkC,eAAc;AAC5D,eAAA;AAAA,UACH,GAAG;AAAA,UACH,CAAC,KAAK,UAAU,GAAG;AAAA,QAAA;AAAA,MAE3B;AAAA,MACA,EAAE,UAAU,SAAS,KAAK;AAAA,IAAA;AAAA,EAC9B,CACH;AACL;;;;;;;;;;;ACpOa,IAAA,6BAAN,cAAyC,iCAAiC;AAAA,EAA1E,cAAA;AAAA,UAAA,GAAA,SAAA;AAOH,SAAA,cAAgE;AAMpB,SAAA,eAAA;AAM5C,SAAA,QAAkB,CAAC,MAAM;AAQT,SAAA,QAAA;AAQC,SAAA,SAAA;AAMgC,SAAA,cAAA;AAUxB,SAAA,iBAAA;AAAA,EAAA;AAAA,EAEhB,SAAS;AAEV,WAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,aAAa,KAAK;AAAA,QAClB,cAAc,KAAK;AAAA,QACnB,OAAO,KAAK;AAAA,QACZ,OAAO,KAAK;AAAA,QACZ,QAAQ,KAAK;AAAA,QACb,aAAa,KAAK;AAAA,QAClB,gBAAgB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGjC;AACJ;AA3DIP,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GANjB,2BAOT,WAAA,eAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAZjB,2BAaT,WAAA,gBAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,OAAO;AAAA,GAlBhB,2BAmBT,WAAA,SAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA1BjB,2BA2BT,WAAA,SAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAlCjB,2BAmCT,WAAA,UAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAxCjB,2BAyCT,WAAA,eAAA,CAAA;AAUAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAlDjB,2BAmDT,WAAA,kBAAA,CAAA;AAnDS,6BAAND,kBAAA;AAAA,EADNE,IAAc,wBAAwB;AAAA,GAC1B,0BAAA;AC/BA,MAAA,uBAAuB,CAAC,qBAAwC;AAClE,SAAA,iBAAiB,IAAI,CAAC,uBAAuB;AAChD,WAAO,EAAE,OAAO,mBAAmB,OAAO,OAAO,mBAAmB;EAAM,CAC7E;AACL;AAEO,MAAM,2BAA2B,CACpC,0BACA,kBACA,iBACC;AACK,QAAA0E,6BAAY;AACZ,QAAA,eAAe,EAAE,UAAU,IAAI,KAAK,YAAY,GAAG,QAAQA;AAEjE,MAAI,6BAA6B,QAAW;AACjC,WAAA;AAAA,EACX;AAEA,QAAM,kBAAkB,iBAAiB,KAAK,CAAC,WAAW,OAAO,UAAU,wBAAwB;AACnG,MAAI,iBAAiB;AACV,WAAA;AAAA,MACH,UAAU,IAAI,KAAK,gBAAgB,YAAY,YAAY;AAAA,MAC3D,QAAQ,IAAI,KAAK,gBAAgB,UAAUA,MAAK;AAAA,IAAA;AAAA,EAExD;AAEO,SAAA;AACX;ACzBO,SAAS,qBACZ,cACA,iBACA,eACA,cACA,kBAKF;;AACE,MAAI,mBAAmB,eAAe,KAAK,mBAAmB,aAAa,GAAG;AACpE,UAAA,oBAAoB,qBAAqB,gBAAgB;AACzD,UAAA,4BAA2B,uBAAkB,KAAK,CAAC,WAAW,OAAO,UAAU,YAAY,MAAhE,mBAAmE;AAEhG,QAAA,iBAAiB,UAAa,6BAA6B,QAAW;AACtE,YAAM,IAAI;AAAA,QACN;AAAA,QACA,yBAAyB,YAAY,wBAAwB,kBAAkB,IAAI,CAAC,WAAW,IAAI,OAAO,KAAK,GAAG,EAAE,KAAK,IAAI,CAAC;AAAA,MAAA;AAAA,IAEtI;AAEA,UAAM,EAAE,UAAU,WAAW,yBAAyB,0BAA0B,kBAAkB,YAAY;AAEvG,WAAA;AAAA,MACH;AAAA,MACA,yBAAyB;AAAA,MACzB,uBAAuB;AAAA,IAAA;AAAA,EAE/B;AAEM,QAAA,0BAA0B,mBAAmB,eAAe,IAC5D,IAAI,KAAK,YAAY,IACrB,IAAI,KAAK,eAAe;AAC1B,MAAA,wBAAwB,mBAAmB,aAAa,wBAAQ,SAAS,IAAI,KAAK,aAAa;AAEnG,MAAI,MAAM,wBAAwB,QAAQ,CAAC,GAAG;AAC1C,UAAM,IAAI;AAAA,MACN;AAAA,MACA,4BAA4B,eAAe;AAAA,IAAA;AAAA,EAEnD;AACA,MAAI,MAAM,sBAAsB,QAAQ,CAAC,GAAG;AACxC,UAAM,IAAI;AAAA,MACN;AAAA,MACA,0BAA0B,aAAa;AAAA,IAAA;AAAA,EAE/C;AAEA,MAAI,0BAA0B,uBAAuB;AACzB,4BAAA;AAAA,EAC5B;AAEO,SAAA;AAAA,IACH,0BAA0B;AAAA,IAC1B;AAAA,IACA;AAAA,EAAA;AAER;AAEA,SAAS,mBAAmB,OAAoD;AACrE,SAAA,UAAU,UAAa,UAAU;AAC5C;AClEa,MAAA,aAAa,CAAC,SAAgB;AACvC,MAAI,CAAC,MAAM;AACA,WAAA;AAAA,EACX;AAEA,QAAMC,WAAsC,EAAE,MAAM,WAAW,OAAO,WAAW,KAAK;AAC/E,SAAA,KAAK,mBAAmB,SAASA,QAAO;AACnD;ACKA,MAAM,eAAe;AAed,MAAM,oBAAoB,CAAC,EAAE,OAAO,GAAG,iBAAyC;AACnF,QAAM,OAAO,EAAE,OAAO,QAAQ,OAAO;AAErC,6BACK,eAAc,EAAA,MAAY,QAAO,cAC9B,8BAAC,OAAI,EAAA,OAAO,EAAE,SACV,UAACtE,oBAAA,wBAAA,EAAwB,GAAG,WAAY,CAAA,GAC5C,EACJ,CAAA;AAER;AAEO,MAAM,yBAAyB,CAAC;AAAA,EACnC;AAAA,EACA,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAmC;AAC/B,QAAM,gBAAgB;AAAA,IAClB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGE,QAAA,oBAAoBF,EAAyB,IAAI;AACjD,QAAA,kBAAkBA,EAAyB,IAAI;AAC/C,QAAA,SAASA,EAAuB,IAAI;AAC1C,QAAM,CAAC,gBAAgB,iBAAiB,IAAIG,EAAoC,IAAI;AACpF,QAAM,CAAC,cAAc,eAAe,IAAIA,EAAoC,IAAI;AAE1E,QAAA,CAAC,mBAAmB,oBAAoB,IAAIA;AAAAA,IAC9C,cAAc;AAAA,EAAA;AAGlB,QAAM,CAAC,eAAe,gBAAgB,IAAIA,EAA2C;AAAA,IACjF,UAAU,cAAc;AAAA,IACxB,QAAQ,cAAc;AAAA,EAAA,CACzB;AAEDF,IAAU,MAAM;AACZ,UAAM,eAAe;AAAA,MACjB,YAAY;AAAA,MACZ,YAAY;AAAA,IAAA;AAGhB,QAAI,kBAAkB,SAAS;AAC3B;AAAA,QACI,UAAU,kBAAkB,SAAS;AAAA,UACjC,GAAG;AAAA,UACH,aAAa,cAAc;AAAA,QAAA,CAC9B;AAAA,MAAA;AAAA,IAET;AAEA,QAAI,gBAAgB,SAAS;AACzB;AAAA,QACI,UAAU,gBAAgB,SAAS;AAAA,UAC/B,GAAG;AAAA,UACH,aAAa,cAAc;AAAA,QAAA,CAC9B;AAAA,MAAA;AAAA,IAET;AAEA,WAAO,MAAM;AACT,uDAAgB;AAChB,mDAAc;AAAA,IAAQ;AAAA,EAC1B,GAED,CAAC,mBAAmB,eAAe,CAAC;AAEjC,QAAA,iBAAiB,CAAC,UAAkB;AACtC,yBAAqB,KAAK;AAE1B,UAAM,YAAY,yBAAyB,OAAO,kBAAkB,YAAY;AAElE,iDAAA,IAAI,WAAW,UAAU;AACvB,qDAAA,IAAI,WAAW,UAAU;AAEzB,qDAAA,QAAQ,UAAU;AACpB,iDAAA,QAAQ,UAAU;AAEf,qBAAA;AAAA,MACb,UAAU,UAAU;AAAA,MACpB,QAAQ,UAAU;AAAA,IAAA,CACrB;AAEM;EAAA;AAGX,QAAM,mBAAmB,MAAM;AACvB,QAAA,cAAc,SAAS,aAAa,OAAM,iDAAgB,cAAc,GAAG,iBAAgB;AAC3F;AAAA,IACJ;AAEA,kBAAc,YAAW,iDAAgB,cAAc,2BAAU;AACjE,iDAAc,IAAI,WAAW,iDAAgB,cAAc;AAC3D,yBAAqB,YAAY;AAE1B;EAAA;AAGX,QAAM,iBAAiB,MAAM;AACrB,QAAA,cAAc,OAAO,aAAa,OAAM,6CAAc,cAAc,GAAG,iBAAgB;AACvF;AAAA,IACJ;AAEA,kBAAc,UAAS,6CAAc,cAAc,2BAAU;AAC7D,qDAAgB,IAAI,WAAW,6CAAc,cAAc;AAC3D,yBAAqB,YAAY;AAE1B;EAAA;AAGX,QAAM,SAAS,MAAM;;AACjB,UAAM,WAAW,WAAW,iDAAgB,cAAc,EAAE;AAC5D,UAAM,SAAS,WAAW,6CAAc,cAAc,EAAE;AAExD,UAAM,SAAS;AAAA,MACX,GAAI,aAAa,UAAa,EAAE,CAAC,GAAG,UAAU,MAAM,GAAG,SAAS;AAAA,MAChE,GAAI,WAAW,UAAa,EAAE,CAAC,GAAG,UAAU,IAAI,GAAG,OAAO;AAAA,IAAA;AAG9D,iBAAO,YAAP,mBAAgB;AAAA,MACZ,IAAI,YAAY,yBAAyB;AAAA,QACrC;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,MAAA,CACb;AAAA;AAAA,EACL;AAGJ,SACKI,oBAAA,OAAA,EAAI,OAAM,kBAAiB,KAAK,QAC7B,UAAA;AAAA,IAAAH;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,OAAO;AAAA,UACH,GAAG,qBAAqB,gBAAgB;AAAA,UACxC,EAAE,OAAO,cAAc,OAAO,cAAc,UAAU,KAAK;AAAA,QAC/D;AAAA,QACA,UAAU,qBAAqB;AAAA,QAC/B,aAAY;AAAA,QACZ,UAAU,CAAC,UAAiB;AACxB,gBAAM,eAAe;AACrB,gBAAM,SAAS,MAAM;AACrB,gBAAM,QAAQ,OAAO;AACrB,yBAAe,KAAK;AAAA,QACxB;AAAA,MAAA;AAAA,IACJ;AAAA,IACAG,oBAAC,OAAI,EAAA,WAAW,4BACZ,UAAA;AAAA,MAAAH;AAAAA,QAAC;AAAA,QAAA;AAAA,UACG,OAAM;AAAA,UACN,MAAK;AAAA,UACL,aAAY;AAAA,UACZ,KAAK;AAAA,UACL,UAAU;AAAA,UACV,QAAQ;AAAA,QAAA;AAAA,MACZ;AAAA,MACAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACG,OAAM;AAAA,UACN,MAAK;AAAA,UACL,aAAY;AAAA,UACZ,KAAK;AAAA,UACL,UAAU;AAAA,UACV,QAAQ;AAAA,QAAA;AAAA,MACZ;AAAA,IAAA,GACJ;AAAA,EACJ,EAAA,CAAA;AAER;;;;;;;;;;;ACjKa,IAAA,6BAAN,cAAyC,iBAAiB;AAAA,EAA1D,cAAA;AAAA,UAAA,GAAA,SAAA;AASH,SAAA,mBAA4E;AAMrD,SAAA,eAAA;AAaY,SAAA,eAAA;AAQT,SAAA,kBAAA;AAQF,SAAA,gBAAA;AAQR,SAAA,QAAA;AAMK,SAAA,aAAA;AAAA,EAAA;AAAA,EAEZ,SAAS;AAEV,WAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,kBAAkB,KAAK;AAAA,QACvB,cAAc,KAAK;AAAA,QACnB,cAAc,KAAK;AAAA,QACnB,iBAAiB,KAAK;AAAA,QACtB,eAAe,KAAK;AAAA,QACpB,YAAY,KAAK;AAAA,QACjB,OAAO,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGxB;AACJ;AAhEIP,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,OAAO;AAAA,GARhB,2BAST,WAAA,oBAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAdjB,2BAeT,WAAA,gBAAA,CAAA;AAaAD,kBAAA;AAAA,EADCC,GAAS;AAAA,GA3BD,2BA4BT,WAAA,gBAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS;AAAA,GAnCD,2BAoCT,WAAA,mBAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS;AAAA,GA3CD,2BA4CT,WAAA,iBAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAnDjB,2BAoDT,WAAA,SAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAzDjB,2BA0DT,WAAA,cAAA,CAAA;AA1DS,6BAAND,kBAAA;AAAA,EADNE,IAAc,wBAAwB;AAAA,GAC1B,0BAAA;ACnCS,eAAA,wBAAwB,QAAkB,OAAe,QAAsB;AACjG,QAAM,uCAAuC,MAAM,OAAO,SAAS,CAAC,EAC/D,KAAK,CAAC,EACN,IAAI,CAAC,GAAGf,OAAMA,KAAI,CAAC,EACnB,IAAI,CAACA,OAAM,OAAO,MAAMA,EAAC,EAAE,OAAO,CAAC,KAAK,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,GAAG,SAAS,CAAE,CAAA,CAAC;AAEvF,QAAM,0BAA0B,IAAI,wBAAuD,IAAI,MAAM;AAErG,QAAM,QAAQ,MAAM,wBAAwB,SAAS,OAAO,MAAM,GAAG;AAE/D,QAAA,iBAAiB,KAClB,IAAI,CAAC,UAAU,OAAO,OAAO,CAAC,KAAK,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,GAAG,MAAM,KAAK,MAAM,EAAE,CAAC,EACrF,OAAoB,CAAC,qBAAqB,UAAU;AACjD,wBAAoB,IAAI,KAAK,UAAU,KAAK,CAAC;AACR,yCAAA,QAAQ,CAAC,oBAAoB;AAC1C,0BAAA,IAAI,KAAK,UAAU,EAAE,GAAG,OAAO,GAAG,gBAAiB,CAAA,CAAC;AAAA,IAAA,CAC3E;AACM,WAAA;AAAA,EAAA,GACJ,oBAAA,IAAA,CAAK;AAEhB,SAAO,CAAC,GAAG,cAAc,EAAE,IAAI,CAAC,SAAS,KAAK,MAAM,IAAI,CAAC,EAAE,KAAK,uBAAuB,MAAM,CAAC;AAClG;AAEA,SAAS,uBAAuB,QAAkB;AACvC,SAAA,CAACE,IAAkCQ,OAAqC;AAC3E,eAAW,SAAS,QAAQ;AAClB,YAAA,SAASR,GAAE,KAAK;AAChB,YAAA,SAASQ,GAAE,KAAK;AACtB,UAAI,WAAW,QAAQ;AACnB;AAAA,MACJ;AACA,UAAI,WAAW,MAAM;AACV,eAAA;AAAA,MACX;AACA,UAAI,WAAW,MAAM;AACV,eAAA;AAAA,MACX;AACO,aAAA,SAAS,SAAS,KAAK;AAAA,IAClC;AACO,WAAA;AAAA,EAAA;AAEf;ACtBO,MAAM,iBAAyD,CAAC,EAAE,OAAO,GAAG,iBAAiB;AAChG,QAAM,OAAO,EAAE,OAAO,QAAQ,OAAO;AAErC,SACKU,oBAAA,eAAA,EAAc,MAAY,QAAO,cAC9B,UAAAA,oBAAC,iBAAgB,EAAA,MACb,UAACA,oBAAA,qBAAA,EAAqB,GAAG,YAAY,GACzC,EACJ,CAAA;AAER;AAEO,MAAM,sBAAsB,CAAC,EAAE,cAAc,QAAQ,sBAAgD;AAClG,QAAA,QAAQS,EAAW,eAAe;AAExC,QAAM,CAAC,OAAO,QAAQ,IAAIR,EAAS,gBAAgB,EAAE;AACrD,QAAM,CAAC,iBAAiB,kBAAkB,IAAIA,EAAS,KAAK;AAEtD,QAAA,SAASH,EAAuB,IAAI;AAE1C,QAAM,EAAE,MAAM,OAAO,UAAA,IAAc,SAAS,MAAM,wBAAwB,QAAQ,KAAK,GAAG,CAAC,QAAQ,KAAK,CAAC;AAEzG,MAAI,WAAW;AACX,+BAAQ,gBAAe,CAAA,CAAA;AAAA,EAC3B;AACA,MAAI,OAAO;AACD,UAAA;AAAA,EACV;AAEM,QAAA,UAAU,CAAC,UAA4D;;AACnE,UAAA,aAAa,MAAM,cAAc;AACvC,aAAS,UAAU;AACnB,QAAI,WAAW,WAAW,MAAM,KAAK,KAAK,eAAe,IAAI;AACzD;AAAA,IACJ;AACM,UAAA,cAAc,cAAc,YAAY,MAAM;AACpD,QAAI,gBAAgB,WAAW,KAAK,iBAAiB,MAAM,WAAW,GAAG;AACrE,mBAAO,YAAP,mBAAgB;AAAA,QACZ,IAAI,YAAY,uBAAuB;AAAA,UACnC,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,UAAU;AAAA,QAAA,CACb;AAAA;AAEL,yBAAmB,KAAK;AAAA,IAAA,OACrB;AACH,yBAAmB,IAAI;AAAA,IAC3B;AAAA,EAAA;AAGJ,SACKK,oBAAA,OAAA,EAAI,OAAM,eAAc,KAAK,QAC1B,UAAA;AAAA,IAAAH;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,OAAO,6BAA6B,kBAAkB,0BAA0B,EAAE;AAAA,QAClF;AAAA,QACA;AAAA,QACA,MAAK;AAAA,QACL,aAAa;AAAA,MAAA;AAAA,IACjB;AAAA,wBACC,YAAS,EAAA,IAAG,aACR,UAAM,6BAAA,IAAI,CAACkB,OAAM;AACd,YAAMqD,SAAQ,OACT,IAAI,CAAC,UAAUrD,GAAE,KAAK,CAAC,EACvB,OAAO,CAACqD,WAAUA,WAAU,IAAI,EAChC,KAAK,KAAK;AACf,aAAQvE,oBAAA,UAAA,EAAmB,OAAOuE,OAAAA,GAAdA,MAAqB;AAAA,IAC5C,IACL;AAAA,EACJ,EAAA,CAAA;AAER;AAEA,MAAM,gBAAgB,CAAC,UAAkB,WAAqB;AAC1D,MAAI,aAAa,IAAI;AACjB,WAAO,OAAO,OAAO,CAAC,KAAK,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,GAAG,WAAc,CAAE,CAAA;AAAA,EAC7E;AACM,QAAA,cAAc,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,KAAA,CAAM;AAEjE,SAAO,OAAO,OAAO,CAAC,KAAK,OAAO3F,QAAO,EAAE,GAAG,KAAK,CAAC,KAAK,GAAG,YAAYA,EAAC,EAAE,IAAI,CAAE,CAAA;AACrF;AAEA,MAAM,kBAAkB,CAAC,QACrB,OAAO,OAAO,GAAG,EAAE,MAAM,CAAC,UAAU,UAAU,MAAS;AAE3D,MAAM,mBAAmB,CAAC,MAAuC,gBAAwC;AACrG,MAAI,SAAS,MAAM;AACR,WAAA;AAAA,EACX;AAEA,QAAM,kBAAkB,OAAO,QAAQ,WAAW,EAC7C,OAAO,CAAC,CAAA,EAAG,KAAK,MAAM,UAAU,MAAS,EACzC,OAAO,CAAC,cAAc,CAAC,KAAK,KAAK,MAAM,aAAa,OAAO,CAAC,OAAO,GAAG,GAAG,MAAM,KAAK,GAAG,IAAI;AAEhG,SAAO,gBAAgB,SAAS;AACpC;;;;;;;;;;;AChFa,IAAA,0BAAN,cAAsC,iBAAiB;AAAA,EAAvD,cAAA;AAAA,UAAA,GAAA,SAAA;AAMY,SAAA,eAAA;AAWf,SAAA,SAAmB;AAQH,SAAA,QAAA;AAMU,SAAA,kBAAA;AAAA,EAAA;AAAA,EAEjB,SAAS;AAEV,WAAAoB;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,cAAc,KAAK;AAAA,QACnB,QAAQ,KAAK;AAAA,QACb,OAAO,KAAK;AAAA,QACZ,iBAAiB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGlC;AACJ;AArCIP,kBAAA;AAAA,EADCC,GAAS;AAAA,GALD,wBAMT,WAAA,gBAAA,CAAA;AAWAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,OAAO;AAAA,GAhBhB,wBAiBT,WAAA,UAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAxBjB,wBAyBT,WAAA,SAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS;AAAA,GA9BD,wBA+BT,WAAA,mBAAA,CAAA;AA/BS,0BAAND,kBAAA;AAAA,EADNE,IAAc,oBAAoB;AAAA,GACtB,uBAAA;AClCS,eAAA,sBAAsB,OAAe,OAAe,QAAsB;AAC5F,QAAM,0BAA0B,IAAI,wBAAgD,CAAI,GAAA,CAAC,KAAK,CAAC;AAE/F,QAAM,QAAQ,MAAM,wBAAwB,SAAS,OAAO,MAAM,GAAG;AAErE,SAAO,KAAK,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC;AACzC;ACaO,MAAM,YAA+C,CAAC,EAAE,OAAO,GAAG,iBAAiB;AACtF,QAAM,OAAO,EAAE,OAAO,QAAQ,OAAO;AAErC,SACKK,oBAAA,eAAA,EAAc,MAAY,QAAO,cAC9B,UAAAA,oBAAC,iBAAgB,EAAA,MACb,UAACA,oBAAA,gBAAA,EAAgB,GAAG,YAAY,GACpC,EACJ,CAAA;AAER;AAEA,MAAM,iBAAyD,CAAC,EAAE,YAAY,iBAAiB,mBAAmB;AACxG,QAAA,QAAQS,EAAW,eAAe;AAElC,QAAA,WAAWX,EAAyB,IAAI;AAE9C,QAAM,EAAE,MAAM,OAAO,UAAA,IAAc,SAAS,MAAM,sBAAsB,OAAO,UAAU,GAAG,CAAC,YAAY,KAAK,CAAC;AAE/G,MAAI,WAAW;AACX,+BAAQ,gBAAe,CAAA,CAAA;AAAA,EAC3B;AAEA,MAAI,UAAU,MAAM;AACV,UAAA;AAAA,EACV;AAEA,MAAI,SAAS,MAAM;AACf,+BAAQ,eAAc,CAAA,CAAA;AAAA,EAC1B;AAEA,QAAM,UAAU,MAAM;;AAClB,UAAM,UAAQ,cAAS,YAAT,mBAAkB,WAAU,KAAK,UAAY,cAAS,YAAT,mBAAkB;AAEzE,QAAA,aAAa,KAAK,GAAG;AACrB,qBAAS,YAAT,mBAAkB;AAAA,QACd,IAAI,YAAY,yBAAyB;AAAA,UACrC,QAAQ,EAAE,CAAC,UAAU,GAAG,MAAM;AAAA,UAC9B,SAAS;AAAA,UACT,UAAU;AAAA,QAAA,CACb;AAAA;AAAA,IAET;AAAA,EAAA;AAGE,QAAA,eAAe,CAAC,UAA8B;AAChD,QAAI,UAAU,QAAW;AACd,aAAA;AAAA,IACX;AACO,WAAA,KAAK,SAAS,KAAK;AAAA,EAAA;AAG9B,SAEQK,oBAAA,UAAA,EAAA,UAAA;AAAA,IAAAH;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,OAAM;AAAA,QACN,aAAa,oBAAoB,SAAY,kBAAkB;AAAA,QAC/D;AAAA,QACA,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACX;AAAA,IACCA,oBAAA,YAAA,EAAS,IAAI,YACT,eAAK,IAAI,CAAC,SACPA,oBAAC,UAAO,EAAA,OAAO,KAAW,GAAA,IAAM,CACnC,GACL;AAAA,EACJ,EAAA,CAAA;AAER;;;;;;;;;;;ACnEa,IAAA,qBAAN,cAAiC,iBAAiB;AAAA,EAAlD,cAAA;AAAA,UAAA,GAAA,SAAA;AAKoB,SAAA,eAAA;AASV,SAAA,aAAA;AAMa,SAAA,kBAAA;AAQV,SAAA,QAAA;AAAA,EAAA;AAAA,EAEP,SAAS;AAEV,WAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,YAAY,KAAK;AAAA,QACjB,iBAAiB,KAAK;AAAA,QACtB,cAAc,KAAK;AAAA,QACnB,OAAO,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGxB;AACJ;AAnCIP,kBAAA;AAAA,EADCC,GAAS;AAAA,GAJD,mBAKT,WAAA,gBAAA,CAAA;AASAD,kBAAA;AAAA,EADCC,GAAS;AAAA,GAbD,mBAcT,WAAA,cAAA,CAAA;AAMAD,kBAAA;AAAA,EADCC,GAAS;AAAA,GAnBD,mBAoBT,WAAA,mBAAA,CAAA;AAQAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GA3BjB,mBA4BT,WAAA,SAAA,CAAA;AA5BS,qBAAND,kBAAA;AAAA,EADNE,IAAc,eAAe;AAAA,GACjB,kBAAA;ACZN,MAAM,0BAAgF,CAAC,EAAE,eAAe;AACrG,QAAA,kBAAkBc,EAAW,sBAAsB;AAErD,MAAA,iBAAiB,eAAe,GAAG;AACnC,WAAQT,oBAAA,OAAA,EAAI,WAAU,sCAAqC,UAAU,aAAA,CAAA;AAAA,EACzE;AAEA,yCAAU,SAAS,CAAA;AACvB;AAEA,SAAS,iBAAiB,iBAAkC;AACxD,SAAO,gBAAgB,oBAAoB,WAAW,KAAK,gBAAgB,MAAM,WAAW;AAChG;AClBO,MAAM,qBAAqB,MAAM;AAC9B,QAAA,kBAAkBS,EAAW,sBAAsB;AAEzD,QAAM,YAAY,gBAAgB,MAAM,CAAC,EAAE;AAC3C,6BACK,MACG,EAAA,UAAA;AAAA,IAAAT,oBAAC,iBAAc,UAAgB,mBAAA,CAAA;AAAA,IAC/BA,oBAAC,iBAAc,UAAwE,2EAAA,CAAA;AAAA,IAEvFA,oBAAC,iBAAc,UAAoC,uCAAA,CAAA;AAAA,IAClD,kBAAkB,eAAe,wBAC7B,wCAAuC,CAAA,CAAA,wBAEvC,uCAAsC,EAAA;AAAA,IAG3CA,oBAAC,iBAAc,UAAmC,sCAAA,CAAA;AAAA,wBACjD,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MAC2BA,oBAAC,OAAE,UAAyC,0BAAA,CAAA;AAAA,MAAI;AAAA,MACtFA,oBAAC,OAAE,UAAyD,oCAAA,CAAA;AAAA,MAAI;AAAA,MAAIA,oBAAC,OAAE,UAAY,SAAA,CAAA;AAAA,MAAI;AAAA,MAC/CA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAkBA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAuB;AAAA,MACjGA,oBAAC,OAAE,UAAK,QAAA,CAAA;AAAA,MAAI;AAAA,IAAA,GAChB;AAAA,wBACC,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MAC+DA,oBAAC,OAAE,UAAI,OAAA,CAAA;AAAA,MAAI;AAAA,0BACpD,KAAE,EAAA,UAAA;AAAA,QAAA;AAAA,QAAK;AAAA,QAAU;AAAA,MAAA,GAAK;AAAA,MAAI;AAAA,MACb;AAAA,MAAU;AAAA,IAAA,GAC5D;AAAA,wBACC,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MAC6B,gBAAgB,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK,IAAI;AAAA,MAAE;AAAA,IAAA,GACtG;AAAA,IAEAA,oBAAC,iBAAc,UAAmB,sBAAA,CAAA;AAAA,wBACjC,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MACsDA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAc;AAAA,0BACtF,KAAE,EAAA,UAAA;AAAA,QAAA;AAAA,QAAK;AAAA,QAAU;AAAA,MAAA,GAAS;AAAA,MAAI;AAAA,MAAoCA,oBAAC,OAAG,UAAU,UAAA,CAAA;AAAA,MAAI;AAAA,MAClFA,oBAAC,OAAE,UAAE,KAAA,CAAA;AAAA,MAAI;AAAA,MAAuBA,oBAAC,OAAE,UAAG,MAAA,CAAA;AAAA,MAAI;AAAA,MAAKA,oBAAC,OAAE,UAAG,MAAA,CAAA;AAAA,MAAI;AAAA,MAC1CA,oBAAC,OAAE,UAAE,KAAA,CAAA;AAAA,MAAI;AAAA,MAAqBA,oBAAC,OAAE,UAAG,MAAA,CAAA;AAAA,MAAI;AAAA,IAAA,GAC9D;AAAA,wBACC,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MACwE;AAAA,0BAClF,KAAE,EAAA,UAAA;AAAA,QAAA;AAAA,QAAK;AAAA,QAAU;AAAA,MAAA,GAAM;AAAA,MAAI;AAAA,IAAA,GAChC;AAAA,IAEAA,oBAAC,iBAAc,UAAkB,qBAAA,CAAA;AAAA,IACjCA,oBAAC,iBAAc,UAEf,oFAAA,CAAA;AAAA,IAEAA,oBAAC,iBAAc,UAAY,eAAA,CAAA;AAAA,wBAC1B,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MACqDA,oBAAC,OAAE,UAAY,SAAA,CAAA;AAAA,MAAI;AAAA,MAAW;AAAA,0BAC7F,KAAG,EAAA,UAAA;AAAA,QAAA;AAAA,QAAU;AAAA,MAAA,GAAG;AAAA,MAAI;AAAA,IAAA,GACzB;AAAA,IAEAA,oBAAC,iBAAc,UAAW,cAAA,CAAA;AAAA,wBACzB,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MACKA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAASA,oBAAC,OAAE,UAAY,SAAA,CAAA;AAAA,MAAI;AAAA,IAAA,GAExD;AAAA,EACJ,EAAA,CAAA;AAER;AAEA,MAAM,yCAAyC,MAAM;AACjD,SAEQG,oBAAA,UAAA,EAAA,UAAA;AAAA,IAAAA,oBAAC,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MACmE;AAAA,MAC9EH,oBAAC,OAAE,UAA4B,mBAAA,CAAA;AAAA,MAAI;AAAA,MAAIA,oBAAC,OAAE,UAA4C,6BAAA,CAAA;AAAA,MAAI;AAAA,MAAM;AAAA,MAChGA,oBAAC,OAAE,UAAgB,aAAA,CAAA;AAAA,MAAI;AAAA,MAA0DA,oBAAC,OAAE,UAAY,SAAA,CAAA;AAAA,MAAI;AAAA,MACrEA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAEA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAEA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAMA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAiBA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MACrFA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAuDA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAa;AAAA,MACjGA,oBAAC,OAAE,UAAE,KAAA,CAAA;AAAA,MAAI;AAAA,MAAOA,oBAAC,OAAE,UAAG,MAAA,CAAA;AAAA,MAAI;AAAA,MAAKA,oBAAC,OAAE,UAAI,OAAA,CAAA;AAAA,MAAI;AAAA,IAAA,GAC9C;AAAA,wBACC,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MAC+DA,oBAAC,OAAE,UAAI,OAAA,CAAA;AAAA,MAAI;AAAA,MACrDA,oBAAC,OAAE,UAAU,aAAA,CAAA;AAAA,MAAI;AAAA,IAAA,GAErD;AAAA,EACJ,EAAA,CAAA;AAER;AAEA,MAAM,wCAAwC,MAAM;AAC1C,QAAA,kBAAkBS,EAAW,sBAAsB;AAEzD,QAAM,eAAe,gBAAgB,oBAAoB,CAAC,EAAE;AAE5D,SAEQN,oBAAA,UAAA,EAAA,UAAA;AAAA,IAAAA,oBAAC,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MACkE;AAAA,MAC7EH,oBAAC,OAAE,UAA4C,6BAAA,CAAA;AAAA,MAAI;AAAA,MAAI;AAAA,MACvDA,oBAAC,OAAE,UAA4D,uCAAA,CAAA;AAAA,MAAI;AAAA,MAAEA,oBAAC,OAAE,UAAgB,aAAA,CAAA;AAAA,MAAI;AAAA,MAC1CA,oBAAC,OAAE,UAAY,SAAA,CAAA;AAAA,MAAI;AAAA,MAAoC;AAAA,MACzGA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAEA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAEA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAMA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAiBA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAkBA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAC3CA,oBAAC,OAAE,UAAC,IAAA,CAAA;AAAA,MAAI;AAAA,MAAaA,oBAAC,OAAE,UAAE,KAAA,CAAA;AAAA,MAAI;AAAA,MAAO;AAAA,0BACtF,KAAG,EAAA,UAAA;AAAA,QAAA;AAAA,QAAa;AAAA,MAAA,GAAI;AAAA,MAAI;AAAA,0BAAM,KAAG,EAAA,UAAA;AAAA,QAAA;AAAA,QAAa;AAAA,MAAA,GAAK;AAAA,MAAI;AAAA,IAAA,GAC5D;AAAA,wBACC,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MAC+DA,oBAAC,OAAE,UAAI,OAAA,CAAA;AAAA,MAAI;AAAA,0BACpD,KAAE,EAAA,UAAA;AAAA,QAAA;AAAA,QAAK;AAAA,QAAa;AAAA,MAAA,GAAQ;AAAA,MAAI;AAAA,IAAA,GACrE;AAAA,wBACC,eAAc,EAAA,UAAA;AAAA,MAAA;AAAA,MAC+B;AAAA,MACzC,gBAAgB,oBAAoB,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK,IAAI;AAAA,MAAE;AAAA,IAAA,GAC7E;AAAA,IAAiB;AAAA,EACrB,EAAA,CAAA;AAER;ACjHa,MAAA,0BAA0B,CACnC,iBACA,oBAC2B;AAC3B,MAAI,oBAAoB,QAAW;AACxB,WAAA,kBAAkB,eAAe,IAAI,eAAe;AAAA,EAC/D;AAEI,MAAA,gBAAgB,oBAAoB,KAAK,CAAC,aAAa,SAAS,SAAS,eAAe,GAAG;AACpF,WAAA;AAAA,EACX;AAEI,MAAA,gBAAgB,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,eAAe,GAAG;AAC9D,WAAA;AAAA,EACX;AACO,SAAA;AACX;ACVa,MAAA,2BAA2B,CACpC,OACA,oBAC8B;AACxB,QAAA,oBAAoB,eAAe,MAAM,KAAK;AACpD,MAAI,sBAAsB,MAAM;AAC5B,UAAM,eAAe,wBAAwB,kBAAkB,SAAS,eAAe;AACvF,YAAQ,cAAc;AAAA,MAClB,KAAK;AACD,eAAO,EAAE,MAAM,wBAAwB,OAAO,kBAAkB;AAAA,MACpE,KAAK;AACD,eAAO,EAAE,MAAM,uBAAuB,OAAO,kBAAkB;AAAA,MACnE,KAAK;AACM,eAAA;AAAA,IACf;AAAA,EACJ;AAEM,QAAA,mBAAmB,cAAc,MAAM,KAAK;AAClD,MAAI,qBAAqB,MAAM;AAC3B,UAAM,eAAe,wBAAwB,iBAAiB,SAAS,eAAe;AACtF,YAAQ,cAAc;AAAA,MAClB,KAAK;AACD,eAAO,EAAE,MAAM,uBAAuB,OAAO,iBAAiB;AAAA,MAClE,KAAK;AACD,eAAO,EAAE,MAAM,sBAAsB,OAAO,iBAAiB;AAAA,MACjE,KAAK;AACM,eAAA;AAAA,IACf;AAAA,EACJ;AAEM,QAAA,uBAAuB,kBAAkB,MAAM,KAAK;AAC1D,MAAI,yBAAyB,MAAM;AAC/B,UAAM,eAAe,wBAAwB,qBAAqB,SAAS,eAAe;AAC1F,YAAQ,cAAc;AAAA,MAClB,KAAK;AACD,eAAO,EAAE,MAAM,uBAAuB,OAAO,qBAAqB;AAAA,MACtE,KAAK;AACD,eAAO,EAAE,MAAM,sBAAsB,OAAO,qBAAqB;AAAA,MACrE,KAAK;AACM,eAAA;AAAA,IACf;AAAA,EACJ;AAEO,SAAA;AACX;AClBO,MAAM,iBAAyD,CAAC,EAAE,cAAc,YAAY;AAC/F,6BACK,eAAc,EAAA,MAAM,EAAE,QAAQ,YAAY,MAAS,GAAA,QAAO,cACvD,UAAAA,oBAAC,SAAI,OAAO,OACR,8BAAC,qBAAoB,EAAA,aAAA,CAA4B,EACrD,CAAA,EACJ,CAAA;AAER;AAEO,MAAM,sBAAmE,CAAC,EAAE,mBAAmB;AAC5F,QAAA,kBAAkBS,EAAW,sBAAsB;AACnD,QAAA,CAAC,iBAAiB,kBAAkB,IAAIR;AAAAA,IAC1C,gBAAgB,cAAc,eAAe;AAAA,EAAA;AAEjD,QAAM,CAAC,YAAY,aAAa,IAAIA,EAAS,EAAE;AAC/C,QAAM,CAAC,SAAS,UAAU,IAAIA,EAAS,KAAK;AACtC,QAAA,UAAUH,EAAwB,IAAI;AAEtC,QAAA,eAAe,CAAC,UAAiB;AACnC,UAAM,eAAe;AACrB,QAAI,eAAe,IAAI;AACnB;AAAA,IACJ;AAEM,UAAA,iBAAiB,yBAAyB,YAAY,eAAe;AAE3E,QAAI,mBAAmB,MAAM;AACzB,iBAAW,IAAI;AACf;AAAA,IACJ;AAEA,UAAM,oBAAoB;AAAA,MACtB,GAAG;AAAA,MACH,CAAC,eAAe,IAAI,GAAG,CAAC,GAAG,gBAAgB,eAAe,IAAI,GAAG,eAAe,KAAK;AAAA,IAAA;AAGzF,uBAAmB,iBAAiB;AACpC,oBAAgB,iBAAiB;AACjC,kBAAc,EAAE;AAAA,EAAA;AAGd,QAAA,kBAAkB,CAAC0E,qBAAqC;;AACpD,UAAA,SAAS,2BAA2BA,gBAAe;AAEzD,kBAAQ,YAAR,mBAAiB;AAAA,MACb,IAAI,YAA2C,8BAA8B;AAAA,QACzE;AAAA,QACA,SAAS;AAAA,QACT,UAAU;AAAA,MAAA,CACb;AAAA;AAAA,EACL;AAGE,QAAA,oBAAoB,CAAC,UAAiB;AACzB,kBAAA,MAAM,OAA4B,KAAK;AACtD,eAAW,KAAK;AAAA,EAAA;AAGpB,6BACK,QAAK,EAAA,WAAU,oDAAmD,UAAU,cAAc,KAAK,SAC5F,UAAA;AAAA,IAAAxE,oBAAC,OAAI,EAAA,WAAU,4BACX,UAAAA,oBAAC,qBAAmB,CAAA,GACxB;AAAA,IACAG,oBAAC,OAAI,EAAA,WAAU,0CACX,UAAA;AAAA,MAAAH;AAAAA,QAAC;AAAA,QAAA;AAAA,UACG;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,MACJ;AAAA,MACAG;AAAAA,QAAC;AAAA,QAAA;AAAA,UACG,WAAW,sBAAsB,UAAU,mBAAmB,iBAAiB;AAAA,UAE/E,UAAA;AAAA,YAAAH;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACG,WAAU;AAAA,gBACV,MAAK;AAAA,gBACL,OAAO;AAAA,gBACP,SAAS;AAAA,gBACT,aAAa,eAAe,eAAe;AAAA,cAAA;AAAA,YAC/C;AAAA,gCACC,UAAO,EAAA,MAAK,UAAS,WAAU,kBAAiB,UAEjD,KAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MACJ;AAAA,IAAA,GACJ;AAAA,EACJ,EAAA,CAAA;AAER;AAEA,SAAS,gBACL,cACA,iBACF;AACE,MAAI,iBAAiB,QAAW;AACrB,WAAA;AAAA,MACH,qBAAqB,CAAC;AAAA,MACtB,oBAAoB,CAAC;AAAA,MACrB,sBAAsB,CAAC;AAAA,MACvB,qBAAqB,CAAC;AAAA,IAAA;AAAA,EAE9B;AAEA,QAAM,SAAS,MAAM,QAAQ,YAAY,IAAI,eAAe,OAAO,OAAO,YAAY,EAAE,QAAQ,CAAC,OAAO,EAAE;AAE1G,SAAO,OAAO;AAAA,IACV,CAAC,iBAAiB,UAAU;AAClB,YAAA,iBAAiB,yBAAyB,OAAO,eAAe;AACtE,UAAI,mBAAmB,MAAM;AAClB,eAAA;AAAA,MACX;AAEO,aAAA;AAAA,QACH,GAAG;AAAA,QACH,CAAC,eAAe,IAAI,GAAG,CAAC,GAAG,gBAAgB,eAAe,IAAI,GAAG,eAAe,KAAK;AAAA,MAAA;AAAA,IAE7F;AAAA,IACA;AAAA,MACI,qBAAqB,CAAC;AAAA,MACtB,oBAAoB,CAAC;AAAA,MACrB,sBAAsB,CAAC;AAAA,MACvB,qBAAqB,CAAC;AAAA,IAC1B;AAAA,EAAA;AAER;AAEA,SAAS,eAAe,iBAAkC;AAChD,QAAA,gBACF,gBAAgB,oBAAoB,SAAS,IAAI,GAAG,gBAAgB,oBAAoB,CAAC,EAAE,IAAI,MAAM;AACzG,QAAM,YAAY,gBAAgB,MAAM,CAAC,EAAE;AAE3C,SAAO,0BAA0B,aAAa,cAAc,aAAa,WAAW,SAAS,eAAe,SAAS;AACzH;AAEA,MAAM,0BAID,CAAC,EAAE,iBAAiB,oBAAoB,sBAAsB;AACzD,QAAA,oBAAoB,CACtB,UACA,QACC;AACD,UAAM,oBAAoB;AAAA,MACtB,GAAG;AAAA,MACH,CAAC,GAAG,GAAG,gBAAgB,GAAG,EAAE,OAAO,CAACpB,OAAM,CAAC,SAAS,OAAOA,EAAC,CAAC;AAAA,IAAA;AAGjE,uBAAmB,iBAAiB;AAEpC,oBAAgB,iBAAiB;AAAA,EAAA;AAGrC,SAESuB,oBAAA,UAAA,EAAA,UAAA;AAAA,IAAgB,gBAAA,oBAAoB,IAAI,CAAC,aACtCH;AAAAA,MAAC;AAAA,MAAA;AAAA,QAEG;AAAA,QACA,UAAU,CAACyE,cACP,kBAAkBA,WAAU,qBAAqB;AAAA,MAAA;AAAA,MAHhD,SAAS,SAAS;AAAA,IAAA,CAM9B;AAAA,IACA,gBAAgB,mBAAmB,IAAI,CAAC,aACrCzE;AAAAA,MAAC;AAAA,MAAA;AAAA,QAEG;AAAA,QACA,UAAU,CAACyE,cACP,kBAAkBA,WAAU,oBAAoB;AAAA,MAAA;AAAA,MAH/C,SAAS,SAAS;AAAA,IAAA,CAM9B;AAAA,IACA,gBAAgB,qBAAqB,IAAI,CAAC,cACvCzE;AAAAA,MAAC;AAAA,MAAA;AAAA,QAEG;AAAA,QACA,UAAU,CAAC0E,eAAc,kBAAkBA,YAAW,sBAAsB;AAAA,MAAA;AAAA,MAFvE,UAAU,SAAS;AAAA,IAAA,CAI/B;AAAA,IACA,gBAAgB,oBAAoB,IAAI,CAAC,cACtC1E;AAAAA,MAAC;AAAA,MAAA;AAAA,QAEG;AAAA,QACA,UAAU,CAAC0E,eAA8B,kBAAkBA,YAAW,qBAAqB;AAAA,MAAA;AAAA,MAFtF,UAAU,SAAS;AAAA,IAAA,CAI/B;AAAA,EACL,EAAA,CAAA;AAER;AAEA,MAAM,6BAGD,CAAC,EAAE,WAAW,eAAe;AACxB,QAAA,kBAAkB,0BAA0B,QAAQ,GAAG;AACvD,QAAA,YAAY,0BAA0B,QAAQ,CAAC;AAEjD,SAAA1E;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAGZ;AAEA,MAAM,4BAGD,CAAC,EAAE,UAAU,eAAe;AACvB,QAAA,kBAAkB,0BAA0B,QAAQ,GAAG;AACvD,QAAA,YAAY,0BAA0B,QAAQ,CAAC;AAEjD,SAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAGZ;AAEA,MAAM,6BAGD,CAAC,EAAE,UAAU,eAAe;AACvB,QAAA,kBAAkB,0BAA0B,UAAU,GAAG;AACzD,QAAA,YAAY,0BAA0B,UAAU,CAAC;AAEnD,SAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAGZ;AAEA,MAAM,8BAGD,CAAC,EAAE,WAAW,eAAe;AACxB,QAAA,kBAAkB,0BAA0B,SAAS,GAAG;AACxD,QAAA,YAAY,0BAA0B,SAAS,CAAC;AAGlD,SAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAGZ;AASA,MAAM,iBAAiB,CAAqC;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,MAAyC;AAEjC,SAAAG;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG,OAAM;AAAA,MACN,OAAO,EAAE,iBAAiB,OAAO,UAAU;AAAA,MAE1C,UAAA;AAAA,QAAA,SAAS,SAAS;AAAA,QACnBH,oBAAC,UAAO,EAAA,WAAU,QAAO,MAAK,UAAS,SAAS,MAAM,SAAS,QAAQ,GAAG,UAE1E,IAAA,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGZ;AAEA,SAAS,2BAA2B,iBAAkC;AAC3D,SAAA;AAAA,IACH,oBAAoB,gBAAgB,mBAAmB,IAAI,CAAC,aAAa,SAAS,UAAU;AAAA,IAC5F,qBAAqB,gBAAgB,oBAAoB,IAAI,CAAC,aAAa,SAAS,UAAU;AAAA,IAC9F,qBAAqB,gBAAgB,oBAAoB,IAAI,CAAC,cAAc,UAAU,UAAU;AAAA,IAChG,sBAAsB,gBAAgB,qBAAqB,IAAI,CAAC,cAAc,UAAU,UAAU;AAAA,EAAA;AAE1G;;;;;;;;;;;AC1Qa,IAAA,0BAAN,cAAsC,iBAAiB;AAAA,EAAvD,cAAA;AAAA,UAAA,GAAA,SAAA;AAiBe,SAAA,eAAA;AAQF,SAAA,QAAA;AAAA,EAAA;AAAA,EAEP,SAAS;AAEV,WAAAA,oBAAC,yBACG,EAAA,UAAAA,oBAAC,gBAAe,EAAA,cAAc,KAAK,cAAc,OAAO,KAAK,MAAO,CAAA,EACxE,CAAA;AAAA,EAER;AACJ;AAzBIP,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GARjB,wBAST,WAAA,gBAAA,CAAA;AAgBAD,kBAAA;AAAA,EADCC,GAAS,EAAE,MAAM,QAAQ;AAAA,GAxBjB,wBAyBT,WAAA,SAAA,CAAA;AAzBS,0BAAND,kBAAA;AAAA,EADNE,IAAc,oBAAoB;AAAA,GACtB,uBAAA;ACvDS,eAAA,6BAA6B,OAAe,OAAe,QAAsB;AACnG,QAAM,0BAA0B,IAAI,wBAAgD,CAAI,GAAA,CAAC,KAAK,CAAC;AAE/F,QAAM,QAAQ,MAAM,wBAAwB,SAAS,OAAO,MAAM,GAAG;AAErE,SAAO,KAAK,QAAQ,CAAC,SAAS,CAAC,KAAK,KAAK,GAAG,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK;AACzE;ACaO,MAAM,gBAAuD,CAAC,EAAE,OAAO,GAAG,iBAAiB;AAC9F,QAAM,OAAO,EAAE,OAAO,QAAQ,OAAO;AAErC,SACKK,oBAAA,eAAA,EAAc,MAAY,QAAO,cAC9B,UAAAA,oBAAC,iBAAgB,EAAA,MACb,UAACA,oBAAA,oBAAA,EAAoB,GAAG,YAAY,GACxC,EACJ,CAAA;AAER;AAEA,MAAM,qBAAiE,CAAC;AAAA,EACpE;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACI,QAAA,QAAQS,EAAW,eAAe;AAElC,QAAA,WAAWX,EAAyB,IAAI;AAE9C,QAAM,EAAE,MAAM,OAAO,UAAc,IAAA;AAAA,IAC/B,MAAM,6BAA6B,OAAO,UAAU;AAAA,IACpD,CAAC,YAAY,KAAK;AAAA,EAAA;AAGtB,MAAI,WAAW;AACX,+BAAQ,gBAAe,CAAA,CAAA;AAAA,EAC3B;AAEA,MAAI,UAAU,MAAM;AACV,UAAA;AAAA,EACV;AAEA,MAAI,SAAS,MAAM;AACf,+BAAQ,eAAc,CAAA,CAAA;AAAA,EAC1B;AAEA,QAAM,UAAU,MAAM;;AAClB,UAAM,UAAQ,cAAS,YAAT,mBAAkB,WAAU,KAAK,UAAY,cAAS,YAAT,mBAAkB;AAEzE,QAAA,aAAa,KAAK,GAAG;AACrB,qBAAS,YAAT,mBAAkB;AAAA,QACd,IAAI,YAAY,6BAA6B;AAAA,UACzC,QAAQ,EAAE,CAAC,UAAU,GAAG,MAAM;AAAA,UAC9B,SAAS;AAAA,UACT,UAAU;AAAA,QAAA,CACb;AAAA;AAAA,IAET;AAAA,EAAA;AAGE,QAAA,eAAe,CAAC,UAA8B;AAChD,QAAI,UAAU,QAAW;AACd,aAAA;AAAA,IACX;AACO,WAAA,KAAK,SAAS,KAAK;AAAA,EAAA;AAG9B,SAEQK,oBAAA,UAAA,EAAA,UAAA;AAAA,IAAAH;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,MAAK;AAAA,QACL,OAAM;AAAA,QACN,aAAa,oBAAoB,SAAY,kBAAkB;AAAA,QAC/D;AAAA,QACA,KAAK;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,MAAA;AAAA,IACX;AAAA,IACCA,oBAAA,YAAA,EAAS,IAAI,YACT,eAAK,IAAI,CAAC,SACPA,oBAAC,UAAO,EAAA,OAAO,KAAW,GAAA,IAAM,CACnC,GACL;AAAA,EACJ,EAAA,CAAA;AAER;;;;;;;;;;;ACpEa,IAAA,yBAAN,cAAqC,iBAAiB;AAAA,EAAtD,cAAA;AAAA,UAAA,GAAA,SAAA;AAKoB,SAAA,eAAA;AASV,SAAA,aAAA;AAMa,SAAA,kBAAA;AAQV,SAAA,QAAA;AAAA,EAAA;AAAA,EAEP,SAAS;AAEV,WAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,YAAY,KAAK;AAAA,QACjB,iBAAiB,KAAK;AAAA,QACtB,cAAc,KAAK;AAAA,QACnB,OAAO,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGxB;AACJ;AAnCI,gBAAA;AAAA,EADCN,GAAS;AAAA,GAJD,uBAKT,WAAA,gBAAA,CAAA;AASA,gBAAA;AAAA,EADCA,GAAS;AAAA,GAbD,uBAcT,WAAA,cAAA,CAAA;AAMA,gBAAA;AAAA,EADCA,GAAS;AAAA,GAnBD,uBAoBT,WAAA,mBAAA,CAAA;AAQA,gBAAA;AAAA,EADCA,GAAS,EAAE,MAAM,QAAQ;AAAA,GA3BjB,uBA4BT,WAAA,SAAA,CAAA;AA5BS,yBAAN,gBAAA;AAAA,EADNC,IAAc,mBAAmB;AAAA,GACrB,sBAAA;ACVb,MAAM,4BAAY;AAElB,MAAM,kCAAkB;AACxB,YAAY,QAAQ,MAAM,QAAQ,IAAI,EAAE;AAExC,MAAM,YAAY,IAAI,KAAK,KAAK;AAChC,UAAU,SAAS,MAAM,SAAS,IAAI,CAAC;AAEvC,MAAM,cAAc,IAAI,KAAK,KAAK;AAClC,YAAY,SAAS,MAAM,SAAS,IAAI,CAAC;AAEzC,MAAM,cAAc,IAAI,KAAK,KAAK;AAClC,YAAY,SAAS,MAAM,SAAS,IAAI,CAAC;AAEzC,MAAM,cAAc,IAAI,KAAK,KAAK;AAClC,YAAY,SAAS,MAAM,SAAS,IAAI,CAAC;AAKlC,MAAM,yBAAyB;AAAA,EAClC,YAAY;AAAA,IACR,OAAO;AAAA,IACP,UAAU,WAAW,WAAW;AAAA,EACpC;AAAA,EACA,WAAW;AAAA,IACP,OAAO;AAAA,IACP,UAAU,WAAW,SAAS;AAAA,EAClC;AAAA,EACA,aAAa;AAAA,IACT,OAAO;AAAA,IACP,UAAU,WAAW,WAAW;AAAA,EACpC;AAAA,EACA,aAAa;AAAA,IACT,OAAO;AAAA,IACP,UAAU,WAAW,WAAW;AAAA,EACpC;AAAA,EACA,aAAa;AAAA,IACT,OAAO;AAAA,IACP,UAAU,WAAW,WAAW;AAAA,EACpC;AAAA,EACA,UAAU;AAAA,IACN,OAAO;AAAA,EACX;AACJ;","x_google_ignoreList":[0,1,2,3,10,11,70,71,72,73,74,75]}
1
+ {"version":3,"file":"dashboard-components.js","sources":["../node_modules/@lit/reactive-element/decorators/custom-element.js","../node_modules/@lit/reactive-element/css-tag.js","../node_modules/@lit/reactive-element/reactive-element.js","../node_modules/@lit/reactive-element/decorators/property.js","../src/web-components/lapis-context.ts","../src/web-components/reference-genome-context.ts","../src/lapisApi/ReferenceGenome.ts","../src/lapisApi/lapisTypes.ts","../src/lapisApi/lapisApi.ts","../src/web-components/app.ts","../node_modules/preact/jsx-runtime/dist/jsxRuntime.module.js","../node_modules/preact/hooks/dist/hooks.module.js","../src/preact/mutationComparison/getMutationComparisonTableData.ts","../src/preact/components/table.tsx","../src/utils/mutations.ts","../src/preact/shared/sort/sortSubstitutionsAndDeletions.ts","../src/preact/shared/table/formatProportion.ts","../src/preact/mutationComparison/mutation-comparison-table.tsx","../src/preact/components/chart.tsx","../src/preact/mutationComparison/mutation-comparison-venn.tsx","../src/operator/FetchSubstitutionsOrDeletionsOperator.ts","../src/operator/SortOperator.ts","../src/query/querySubstitutionsOrDeletions.ts","../src/preact/mutationComparison/queryMutationData.ts","../src/preact/LapisUrlContext.ts","../src/preact/components/csv-download-button.tsx","../src/preact/components/error-display.tsx","../src/preact/components/resize-container.tsx","../src/preact/components/error-boundary.tsx","../src/preact/components/fullscreen.tsx","../src/preact/components/info.tsx","../src/preact/components/loading-display.tsx","../src/preact/shared/floating-ui/hooks.ts","../src/preact/components/dropdown.tsx","../src/preact/components/checkbox-selector.tsx","../src/preact/components/mutation-type-selector.tsx","../src/preact/components/no-data-display.tsx","../src/preact/components/min-max-range-slider.tsx","../src/preact/components/percent-intput.tsx","../src/preact/components/proportion-selector.tsx","../src/preact/components/proportion-selector-dropdown.tsx","../src/preact/ReferenceGenomeContext.ts","../src/preact/components/segment-selector.tsx","../src/preact/components/tabs.tsx","../src/preact/useQuery.ts","../src/preact/mutationComparison/mutation-comparison.tsx","../src/web-components/PreactLitAdapter.tsx","../src/web-components/PreactLitAdapterWithGridJsStyles.tsx","../src/web-components/visualization/gs-mutation-comparison.tsx","../src/preact/mutations/getInsertionsTableData.ts","../src/preact/mutations/getMutationsTableData.ts","../src/preact/shared/sort/sortMutationPositions.ts","../src/preact/mutations/getMutationsGridData.ts","../src/preact/mutations/mutations-grid.tsx","../src/preact/shared/sort/sortInsertions.ts","../src/preact/mutations/mutations-insertions-table.tsx","../src/preact/mutations/mutations-table.tsx","../src/operator/FetchInsertionsOperator.ts","../src/query/queryInsertions.ts","../src/preact/mutations/queryMutations.ts","../src/preact/mutations/mutations.tsx","../src/web-components/visualization/gs-mutations.tsx","../src/preact/prevalenceOverTime/getPrevalenceOverTimeTableData.ts","../src/utils/sort.ts","../src/preact/shared/charts/LogitScale.ts","../src/preact/shared/charts/colors.ts","../src/preact/shared/charts/confideceInterval.ts","../src/preact/shared/charts/getYAxisMax.ts","../src/preact/shared/charts/getYAxisScale.ts","../src/preact/prevalenceOverTime/prevalence-over-time-bar-chart.tsx","../node_modules/dayjs/esm/constant.js","../node_modules/dayjs/esm/locale/en.js","../node_modules/dayjs/esm/utils.js","../node_modules/dayjs/esm/index.js","../node_modules/dayjs/esm/plugin/advancedFormat/index.js","../node_modules/dayjs/esm/plugin/isoWeek/index.js","../src/utils/temporalClass.ts","../src/utils/utils.ts","../src/preact/prevalenceOverTime/prevalence-over-time-bubble-chart.tsx","../src/preact/prevalenceOverTime/prevalence-over-time-line-chart.tsx","../src/preact/prevalenceOverTime/prevalence-over-time-table.tsx","../src/operator/FetchAggregatedOperator.ts","../src/operator/FillMissingOperator.ts","../src/operator/GroupByOperator.ts","../src/operator/GroupByAndSumOperator.ts","../src/operator/MapOperator.ts","../src/operator/RenameFieldOperator.ts","../src/operator/SlidingOperator.ts","../src/query/queryAggregatedDataOverTime.ts","../src/operator/DivisionOperator.ts","../src/query/queryPrevalenceOverTime.ts","../src/preact/components/select.tsx","../src/preact/components/confidence-interval-selector.tsx","../src/preact/components/scaling-selector.tsx","../src/preact/prevalenceOverTime/prevalence-over-time.tsx","../src/web-components/visualization/gs-prevalence-over-time.tsx","../src/preact/relativeGrowthAdvantage/relative-growth-advantage-chart.tsx","../src/query/queryRelativeGrowthAdvantage.ts","../src/preact/relativeGrowthAdvantage/relative-growth-advantage.tsx","../src/web-components/visualization/gs-relative-growth-advantage.tsx","../src/query/queryAggregateData.ts","../src/preact/aggregatedData/aggregate-table.tsx","../src/preact/aggregatedData/aggregate.tsx","../src/web-components/visualization/gs-aggregate.tsx","../src/preact/numberSequencesOverTime/getNumberOfSequencesOverTimeTableData.ts","../src/preact/numberSequencesOverTime/number-sequences-over-time-bar-chart.tsx","../src/preact/numberSequencesOverTime/number-sequences-over-time-line-chart.tsx","../src/preact/numberSequencesOverTime/number-sequences-over-time-table.tsx","../src/query/queryNumberOfSequencesOverTime.ts","../src/preact/numberSequencesOverTime/number-sequences-over-time.tsx","../src/web-components/visualization/gs-number-sequences-over-time.tsx","../src/query/queryMutationsOverTime.ts","../src/utils/map2d.ts","../src/preact/mutationsOverTime/MutationOverTimeData.ts","../src/preact/mutationsOverTime/getFilteredMutationsOverTimeData.ts","../src/preact/components/color-scale-selector.tsx","../src/preact/components/tooltip.tsx","../src/preact/mutationsOverTime/mutations-over-time-grid.tsx","../src/preact/components/color-scale-selector-dropdown.tsx","../src/preact/webWorkers/useWebWorker.ts","../src/preact/mutationsOverTime/mutations-over-time.tsx","../src/web-components/visualization/gs-mutations-over-time.tsx","../src/preact/dateRangeSelector/selectableOptions.ts","../src/preact/dateRangeSelector/computeInitialValues.ts","../src/preact/dateRangeSelector/dateConversion.ts","../src/preact/dateRangeSelector/date-range-selector.tsx","../src/web-components/input/gs-date-range-selector.tsx","../src/preact/locationFilter/fetchAutocompletionList.ts","../src/preact/locationFilter/location-filter.tsx","../src/web-components/input/gs-location-filter.tsx","../src/preact/textInput/fetchAutocompleteList.ts","../src/preact/textInput/text-input.tsx","../src/web-components/input/gs-text-input.tsx","../src/preact/components/ReferenceGenomesAwaiter.tsx","../src/preact/mutationFilter/mutation-filter-info.tsx","../src/preact/mutationFilter/sequenceTypeFromSegment.ts","../src/preact/mutationFilter/parseAndValidateMutation.ts","../src/preact/mutationFilter/mutation-filter.tsx","../src/web-components/input/gs-mutation-filter.tsx","../src/preact/lineageFilter/fetchLineageAutocompleteList.ts","../src/preact/lineageFilter/lineage-filter.tsx","../src/web-components/input/gs-lineage-filter.tsx","../src/preact/dateRangeSelector/dateRangeOption.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer((()=>{customElements.define(t,e)})):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce(((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1]),t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map((t=>t instanceof CSSStyleSheet?t:t.styleSheet));else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,adoptStyles,css,getCompatibleStyle,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:r,getOwnPropertyNames:h,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),y={attribute:!0,type:String,converter:u,reflect:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class b extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=y){if(s.state&&(s.attribute=!1),this._$Ei(),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),r=this.getPropertyDescriptor(t,i,s);void 0!==r&&e(this.prototype,t,r)}}static getPropertyDescriptor(t,s,i){const{get:e,set:h}=r(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get(){return e?.call(this)},set(s){const r=e?.call(this);h.call(this,s),this.requestUpdate(t,r,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??y}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...h(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise((t=>this.enableUpdating=t)),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach((t=>t(this)))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach((t=>t.hostConnected?.()))}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach((t=>t.hostDisconnected?.()))}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$EC(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const r=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==r?this.removeAttribute(e):this.setAttribute(e,r),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),r=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e,this[e]=r.fromAttribute(s,t.type),this._$Em=null}}requestUpdate(t,s,i){if(void 0!==t){if(i??=this.constructor.getPropertyOptions(t),!(i.hasChanged??f)(this[t],s))return;this.P(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$ET())}P(t,s,i){this._$AL.has(t)||this._$AL.set(t,s),!0===i.reflect&&this._$Em!==t&&(this._$Ej??=new Set).add(t)}async _$ET(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t)!0!==i.wrapped||this._$AL.has(s)||void 0===this[s]||this.P(s,this[s],i)}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach((t=>t.hostUpdate?.())),this.update(s)):this._$EU()}catch(s){throw t=!1,this._$EU(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach((t=>t.hostUpdated?.())),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EU(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Ej&&=this._$Ej.forEach((t=>this._$EC(t,this[t]))),this._$EU()}updated(t){}firstUpdated(t){}}b.elementStyles=[],b.shadowRootOptions={mode:\"open\"},b[d(\"elementProperties\")]=new Map,b[d(\"finalized\")]=new Map,p?.({ReactiveElement:b}),(a.reactiveElementVersions??=[]).push(\"2.0.4\");export{b as ReactiveElement,u as defaultConverter,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","import{defaultConverter as t,notEqual as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:t,reflect:!1,hasChanged:e},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t)},init(e){return void 0!==e&&this.P(o,void 0,t),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,r?{...t,wrapped:!0}:t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import { createContext } from '@lit/context';\n\nexport const lapisContext = createContext<string>('lapis-context');\n","import { createContext } from '@lit/context';\n\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\n\nexport const referenceGenomeContext = createContext<ReferenceGenome>('reference-genome-context');\n","import z from 'zod';\n\nimport type { SequenceType } from '../types';\n\nexport const referenceGenomeResponse = z.object({\n nucleotideSequences: z.array(\n z.object({\n name: z.string(),\n sequence: z.string(),\n }),\n ),\n genes: z.array(\n z.object({\n name: z.string(),\n sequence: z.string(),\n }),\n ),\n});\nexport type ReferenceGenome = z.infer<typeof referenceGenomeResponse>;\n\nexport const getSegmentNames = (referenceGenome: ReferenceGenome, sequenceType: SequenceType) => {\n switch (sequenceType) {\n case 'nucleotide': {\n return referenceGenome.nucleotideSequences.map((sequence) => sequence.name);\n }\n case 'amino acid': {\n return referenceGenome.genes.map((gene) => gene.name);\n }\n }\n};\n\nexport const isSingleSegmented = (referenceGenome: ReferenceGenome) => referenceGenome.nucleotideSequences.length === 1;\n","import z, { type ZodTypeAny } from 'zod';\n\nexport const orderByType = z.enum(['ascending', 'descending']);\n\nexport const orderBy = z.object({\n field: z.string(),\n type: orderByType,\n});\n\nexport const lapisBaseRequest = z\n .object({\n limit: z.number().optional(),\n offset: z.number().optional(),\n fields: z.array(z.string()).optional(),\n orderBy: z.array(orderBy).optional(),\n })\n .catchall(z.union([z.boolean(), z.undefined(), z.string(), z.number(), z.null(), z.array(z.string())]));\nexport type LapisBaseRequest = z.infer<typeof lapisBaseRequest>;\n\nexport const mutationsRequest = lapisBaseRequest.extend({ minProportion: z.number().optional() });\nexport type MutationsRequest = z.infer<typeof mutationsRequest>;\n\nconst mutationProportionCount = z.object({\n mutation: z.string(),\n proportion: z.number(),\n count: z.number(),\n sequenceName: z.union([z.string(), z.null()]),\n mutationFrom: z.string(),\n mutationTo: z.string(),\n position: z.number(),\n});\nexport const mutationsResponse = makeLapisResponse(z.array(mutationProportionCount));\nexport type MutationsResponse = z.infer<typeof mutationsResponse>;\n\nconst insertionCount = z.object({\n insertion: z.string(),\n count: z.number(),\n insertedSymbols: z.string(),\n position: z.number(),\n sequenceName: z.union([z.string(), z.null()]),\n});\nexport const insertionsResponse = makeLapisResponse(z.array(insertionCount));\n\nexport const aggregatedItem = z.object({ count: z.number() }).catchall(z.union([z.string(), z.number(), z.null()]));\nexport const aggregatedResponse = makeLapisResponse(z.array(aggregatedItem));\nexport type AggregatedItem = z.infer<typeof aggregatedItem>;\n\nfunction makeLapisResponse<T extends ZodTypeAny>(data: T) {\n return z.object({\n data,\n });\n}\n\nexport const problemDetail = z.object({\n title: z.string().optional(),\n status: z.number(),\n detail: z.string().optional(),\n type: z.string(),\n instance: z.string().optional(),\n});\n\nexport type ProblemDetail = z.infer<typeof problemDetail>;\n\nexport const lapisError = z.object({\n error: problemDetail,\n});\n","import { referenceGenomeResponse } from './ReferenceGenome';\nimport {\n aggregatedResponse,\n insertionsResponse,\n type LapisBaseRequest,\n lapisError,\n type MutationsRequest,\n mutationsResponse,\n problemDetail,\n type ProblemDetail,\n} from './lapisTypes';\nimport { type SequenceType } from '../types';\n\nexport class UnknownLapisError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly requestedData: string,\n ) {\n super(message);\n this.name = 'UnknownLapisError';\n }\n}\n\nexport class LapisError extends Error {\n constructor(\n message: string,\n public readonly status: number,\n public readonly problemDetail: ProblemDetail,\n public readonly requestedData: string,\n ) {\n super(message);\n this.name = 'LapisError';\n }\n}\n\nexport async function fetchAggregated(lapisUrl: string, body: LapisBaseRequest, signal?: AbortSignal) {\n const response = await callLapis(\n aggregatedEndpoint(lapisUrl),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n },\n 'aggregated data',\n );\n\n return aggregatedResponse.parse(await response.json());\n}\n\nexport async function fetchInsertions(\n lapisUrl: string,\n body: LapisBaseRequest,\n sequenceType: SequenceType,\n signal?: AbortSignal,\n) {\n const response = await callLapis(\n insertionsEndpoint(lapisUrl, sequenceType),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n },\n `${sequenceType} insertions`,\n );\n\n return insertionsResponse.parse(await response.json());\n}\n\nexport async function fetchSubstitutionsOrDeletions(\n lapisUrl: string,\n body: MutationsRequest,\n sequenceType: SequenceType,\n signal?: AbortSignal,\n) {\n const response = await callLapis(\n substitutionsOrDeletionsEndpoint(lapisUrl, sequenceType),\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n signal,\n },\n `${sequenceType} mutations`,\n );\n\n return mutationsResponse.parse(await response.json());\n}\n\nexport async function fetchReferenceGenome(lapisUrl: string, signal?: AbortSignal) {\n const response = await callLapis(\n referenceGenomeEndpoint(lapisUrl),\n {\n method: 'GET',\n headers: {\n 'Content-Type': 'application/json',\n },\n signal,\n },\n 'the reference genomes',\n );\n\n return referenceGenomeResponse.parse(await response.json());\n}\n\nasync function callLapis(\n input: Parameters<typeof fetch>[0],\n init: Parameters<typeof fetch>[1],\n requestedDataName: string,\n) {\n try {\n const response = await fetch(input, init);\n\n await handleErrors(response, requestedDataName);\n return response;\n } catch (error) {\n const message = error instanceof Error ? error.message : `${error}`;\n throw new UnknownLapisError(`Failed to connect to LAPIS: ${message}`, 500, requestedDataName);\n }\n}\n\nconst handleErrors = async (response: Response, requestedData: string) => {\n if (!response.ok) {\n if (response.status >= 400 && response.status < 500) {\n const json = await response.json();\n\n const lapisErrorResult = lapisError.safeParse(json);\n if (lapisErrorResult.success) {\n throw new LapisError(\n response.statusText + lapisErrorResult.data.error.detail,\n response.status,\n lapisErrorResult.data.error,\n requestedData,\n );\n }\n\n const problemDetailResult = problemDetail.safeParse(json);\n if (problemDetailResult.success) {\n throw new LapisError(\n response.statusText + problemDetailResult.data.detail,\n response.status,\n problemDetailResult.data,\n requestedData,\n );\n }\n\n throw new UnknownLapisError(\n `${response.statusText}: ${JSON.stringify(json)}`,\n response.status,\n requestedData,\n );\n }\n throw new UnknownLapisError(`${response.statusText}: ${response.status}`, response.status, requestedData);\n }\n};\n\nexport const aggregatedEndpoint = (lapisUrl: string) => `${lapisUrl}/sample/aggregated`;\nexport const insertionsEndpoint = (lapisUrl: string, sequenceType: SequenceType) => {\n return sequenceType === 'amino acid'\n ? `${lapisUrl}/sample/aminoAcidInsertions`\n : `${lapisUrl}/sample/nucleotideInsertions`;\n};\nexport const substitutionsOrDeletionsEndpoint = (lapisUrl: string, sequenceType: SequenceType) => {\n return sequenceType === 'amino acid'\n ? `${lapisUrl}/sample/aminoAcidMutations`\n : `${lapisUrl}/sample/nucleotideMutations`;\n};\nexport const referenceGenomeEndpoint = (lapisUrl: string) => `${lapisUrl}/sample/referenceGenome`;\n","import { provide } from '@lit/context';\nimport { Task } from '@lit/task';\nimport { html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { lapisContext } from './lapis-context';\nimport { referenceGenomeContext } from './reference-genome-context';\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\nimport { fetchReferenceGenome } from '../lapisApi/lapisApi';\n\n/**\n * ## Context\n *\n * This component provides the main application context.\n * All other `gs-*` components must be (possibly nested) children of this component.\n * It makes use of the [Lit Context](https://lit.dev/docs/data/context/) to\n * - provide the URL to the LAPIS instance to all its children\n * - fetch the reference genomes from LAPIS and provide it to all its children\n *\n * This will show an error message if the reference genome cannot be fetched\n * (e.g., due to an invalid LAPIS URL).\n *\n * ## Shadow DOM\n *\n * This component does __not__ use a shadow DOM. Children of this component will be rendered directly in the light DOM.\n */\n@customElement('gs-app')\nexport class App extends LitElement {\n /**\n * Required.\n *\n * The URL of the LAPIS instance that all children of this component will use.\n */\n @provide({ context: lapisContext })\n @property()\n lapis: string = '';\n\n /**\n * @internal\n */\n @provide({ context: referenceGenomeContext })\n referenceGenome: ReferenceGenome = {\n nucleotideSequences: [],\n genes: [],\n };\n\n /**\n * @internal\n */\n private updateReferenceGenome = new Task(this, {\n task: async () => {\n this.referenceGenome = await fetchReferenceGenome(this.lapis);\n },\n args: () => [this.lapis],\n });\n\n override render() {\n return this.updateReferenceGenome.render({\n complete: () => html``, // Children will be rendered in the light DOM anyway. We can't use slots without a shadow DOM.\n error: () =>\n html` <div class=\"m-2 w-full alert alert-error\">\n Error: Cannot fetch reference genome. Is LAPIS available?\n </div>`,\n });\n }\n\n override createRenderRoot() {\n return this;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-app': App;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-app': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n","import{options as r,Fragment as e}from\"preact\";export{Fragment}from\"preact\";var t=/[\"&<]/;function n(r){if(0===r.length||!1===t.test(r))return r;for(var e=0,n=0,o=\"\",f=\"\";n<r.length;n++){switch(r.charCodeAt(n)){case 34:f=\"&quot;\";break;case 38:f=\"&amp;\";break;case 60:f=\"&lt;\";break;default:continue}n!==e&&(o+=r.slice(e,n)),o+=f,e=n+1}return n!==e&&(o+=r.slice(e,n)),o}var o=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,f=0,i=Array.isArray;function u(e,t,n,o,i,u){t||(t={});var a,c,l=t;\"ref\"in t&&(a=t.ref,delete t.ref);var p={type:e,props:l,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:--f,__i:-1,__u:0,__source:i,__self:u};if(\"function\"==typeof e&&(a=e.defaultProps))for(c in a)void 0===l[c]&&(l[c]=a[c]);return r.vnode&&r.vnode(p),p}function a(r){var t=u(e,{tpl:r,exprs:[].slice.call(arguments,1)});return t.key=t.__v,t}var c={},l=/[A-Z]/g;function p(e,t){if(r.attr){var f=r.attr(e,t);if(\"string\"==typeof f)return f}if(\"ref\"===e||\"key\"===e)return\"\";if(\"style\"===e&&\"object\"==typeof t){var i=\"\";for(var u in t){var a=t[u];if(null!=a&&\"\"!==a){var p=\"-\"==u[0]?u:c[u]||(c[u]=u.replace(l,\"-$&\").toLowerCase()),_=\";\";\"number\"!=typeof a||p.startsWith(\"--\")||o.test(p)||(_=\"px;\"),i=i+p+\":\"+a+_}}return e+'=\"'+i+'\"'}return null==t||!1===t||\"function\"==typeof t||\"object\"==typeof t?\"\":!0===t?e:e+'=\"'+n(t)+'\"'}function _(r){if(null==r||\"boolean\"==typeof r||\"function\"==typeof r)return null;if(\"object\"==typeof r){if(void 0===r.constructor)return r;if(i(r)){for(var e=0;e<r.length;e++)r[e]=_(r[e]);return r}}return n(\"\"+r)}export{u as jsx,p as jsxAttr,u as jsxDEV,_ as jsxEscape,a as jsxTemplate,u as jsxs};\n//# sourceMappingURL=jsxRuntime.module.js.map\n","import{options as n}from\"preact\";var t,r,u,i,o=0,f=[],c=n,e=c.__b,a=c.__r,v=c.diffed,l=c.__c,m=c.unmount,s=c.__;function d(n,t){c.__h&&c.__h(r,n,o||t),o=0;var u=r.__H||(r.__H={__:[],__h:[]});return n>=u.__.length&&u.__.push({}),u.__[n]}function h(n){return o=1,p(D,n)}function p(n,u,i){var o=d(t++,2);if(o.t=n,!o.__c&&(o.__=[i?i(u):D(void 0,u),function(n){var t=o.__N?o.__N[0]:o.__[0],r=o.t(t,n);t!==r&&(o.__N=[r,o.__[1]],o.__c.setState({}))}],o.__c=r,!r.u)){var f=function(n,t,r){if(!o.__c.__H)return!0;var u=o.__c.__H.__.filter(function(n){return!!n.__c});if(u.every(function(n){return!n.__N}))return!c||c.call(this,n,t,r);var i=!1;return u.forEach(function(n){if(n.__N){var t=n.__[0];n.__=n.__N,n.__N=void 0,t!==n.__[0]&&(i=!0)}}),!(!i&&o.__c.props===n)&&(!c||c.call(this,n,t,r))};r.u=!0;var c=r.shouldComponentUpdate,e=r.componentWillUpdate;r.componentWillUpdate=function(n,t,r){if(this.__e){var u=c;c=void 0,f(n,t,r),c=u}e&&e.call(this,n,t,r)},r.shouldComponentUpdate=f}return o.__N||o.__}function y(n,u){var i=d(t++,3);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__H.__h.push(i))}function _(n,u){var i=d(t++,4);!c.__s&&C(i.__H,u)&&(i.__=n,i.i=u,r.__h.push(i))}function A(n){return o=5,T(function(){return{current:n}},[])}function F(n,t,r){o=6,_(function(){return\"function\"==typeof n?(n(t()),function(){return n(null)}):n?(n.current=t(),function(){return n.current=null}):void 0},null==r?r:r.concat(n))}function T(n,r){var u=d(t++,7);return C(u.__H,r)&&(u.__=n(),u.__H=r,u.__h=n),u.__}function q(n,t){return o=8,T(function(){return n},t)}function x(n){var u=r.context[n.__c],i=d(t++,9);return i.c=n,u?(null==i.__&&(i.__=!0,u.sub(r)),u.props.value):n.__}function P(n,t){c.useDebugValue&&c.useDebugValue(t?t(n):n)}function b(n){var u=d(t++,10),i=h();return u.__=n,r.componentDidCatch||(r.componentDidCatch=function(n,t){u.__&&u.__(n,t),i[1](n)}),[i[0],function(){i[1](void 0)}]}function g(){var n=d(t++,11);if(!n.__){for(var u=r.__v;null!==u&&!u.__m&&null!==u.__;)u=u.__;var i=u.__m||(u.__m=[0,0]);n.__=\"P\"+i[0]+\"-\"+i[1]++}return n.__}function j(){for(var n;n=f.shift();)if(n.__P&&n.__H)try{n.__H.__h.forEach(z),n.__H.__h.forEach(B),n.__H.__h=[]}catch(t){n.__H.__h=[],c.__e(t,n.__v)}}c.__b=function(n){r=null,e&&e(n)},c.__=function(n,t){n&&t.__k&&t.__k.__m&&(n.__m=t.__k.__m),s&&s(n,t)},c.__r=function(n){a&&a(n),t=0;var i=(r=n.__c).__H;i&&(u===r?(i.__h=[],r.__h=[],i.__.forEach(function(n){n.__N&&(n.__=n.__N),n.i=n.__N=void 0})):(i.__h.forEach(z),i.__h.forEach(B),i.__h=[],t=0)),u=r},c.diffed=function(n){v&&v(n);var t=n.__c;t&&t.__H&&(t.__H.__h.length&&(1!==f.push(t)&&i===c.requestAnimationFrame||((i=c.requestAnimationFrame)||w)(j)),t.__H.__.forEach(function(n){n.i&&(n.__H=n.i),n.i=void 0})),u=r=null},c.__c=function(n,t){t.some(function(n){try{n.__h.forEach(z),n.__h=n.__h.filter(function(n){return!n.__||B(n)})}catch(r){t.some(function(n){n.__h&&(n.__h=[])}),t=[],c.__e(r,n.__v)}}),l&&l(n,t)},c.unmount=function(n){m&&m(n);var t,r=n.__c;r&&r.__H&&(r.__H.__.forEach(function(n){try{z(n)}catch(n){t=n}}),r.__H=void 0,t&&c.__e(t,r.__v))};var k=\"function\"==typeof requestAnimationFrame;function w(n){var t,r=function(){clearTimeout(u),k&&cancelAnimationFrame(t),setTimeout(n)},u=setTimeout(r,100);k&&(t=requestAnimationFrame(r))}function z(n){var t=r,u=n.__c;\"function\"==typeof u&&(n.__c=void 0,u()),r=t}function B(n){var t=r;n.__c=n.__(),r=t}function C(n,t){return!n||n.length!==t.length||t.some(function(t,r){return t!==n[r]})}function D(n,t){return\"function\"==typeof t?t(n):t}export{q as useCallback,x as useContext,P as useDebugValue,y as useEffect,b as useErrorBoundary,g as useId,F as useImperativeHandle,_ as useLayoutEffect,T as useMemo,p as useReducer,A as useRef,h as useState};\n//# sourceMappingURL=hooks.module.js.map\n","import { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport { type DeletionClass, type SubstitutionClass } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\ntype Proportions = {\n [displayName: string]: number;\n};\n\ntype MutationComparisonRow = {\n mutation: SubstitutionClass | DeletionClass;\n proportions: Proportions;\n};\n\nexport function getMutationComparisonTableData(data: Dataset<MutationData>, proportionInterval: ProportionInterval) {\n const mutationsToProportions = new Map<string, MutationComparisonRow>();\n\n for (const mutationData of data.content) {\n for (const mutationEntry of mutationData.data) {\n const mutationKey = mutationEntry.mutation.toString();\n const existingRow = mutationsToProportions.get(mutationKey);\n\n if (!existingRow) {\n mutationsToProportions.set(\n mutationKey,\n initializeMutationRow(mutationEntry.mutation, mutationData.displayName, mutationEntry.proportion),\n );\n } else {\n existingRow.proportions = updateProportions(\n existingRow.proportions,\n mutationData.displayName,\n mutationEntry.proportion,\n );\n mutationsToProportions.set(mutationKey, existingRow);\n }\n }\n }\n\n return [...mutationsToProportions.values()]\n .map((row) => {\n return {\n mutation: row.mutation,\n ...data.content\n .map((mutationData) => {\n return {\n [`${mutationData.displayName} prevalence`]: row.proportions[mutationData.displayName] || 0,\n };\n })\n .reduce((acc, val) => ({ ...acc, ...val }), {}),\n } as { mutation: SubstitutionClass | DeletionClass } & Proportions;\n })\n .filter((row) =>\n Object.values(row).some(\n (value) =>\n typeof value === 'number' && value >= proportionInterval.min && value <= proportionInterval.max,\n ),\n );\n}\n\nfunction initializeMutationRow(\n mutation: SubstitutionClass | DeletionClass,\n displayName: string,\n proportion: number,\n): MutationComparisonRow {\n return {\n mutation,\n proportions: {\n [displayName]: proportion,\n },\n };\n}\n\nfunction updateProportions(proportions: Proportions, displayName: string, proportion: number): Proportions {\n return { ...proportions, [displayName]: proportion };\n}\n","import { Grid } from 'gridjs';\nimport { type OneDArray, type TColumn, type TData } from 'gridjs/dist/src/types';\nimport { type ComponentChild } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\n\nimport 'gridjs/dist/theme/mermaid.css';\n\nexport const tableStyle = {\n table: {\n fontSize: '12px',\n },\n th: {\n padding: '4px',\n textAlign: 'center',\n },\n td: {\n textAlign: 'center',\n padding: '8px',\n },\n footer: {\n fontSize: '12px',\n },\n};\n\ninterface TableProps {\n data: TData;\n columns: OneDArray<TColumn | string | ComponentChild>;\n pageSize: number | boolean;\n}\n\nexport const Table = ({ data, columns, pageSize }: TableProps) => {\n const pagination = typeof pageSize === 'number' ? { limit: pageSize } : pageSize;\n\n const wrapper = useRef(null);\n\n useEffect(() => {\n if (wrapper.current === null) {\n return;\n }\n const grid = new Grid({\n columns,\n data,\n style: tableStyle,\n pagination,\n }).render(wrapper.current);\n\n return () => {\n grid.destroy();\n };\n });\n\n return <div ref={wrapper} />;\n};\n","import { type MutationType, type SequenceType } from '../types';\n\nexport interface Mutation {\n readonly position: number;\n readonly code: string;\n readonly type: MutationType;\n readonly segment?: string;\n}\n\nexport interface MutationClass extends Mutation {\n equals(other: MutationClass): boolean;\n\n toString(): string;\n}\n\nexport const substitutionRegex =\n /^((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Za-z])?(?<position>\\d+)(?<substitutionValue>[A-Za-z.])?$/;\n\nexport interface Substitution extends Mutation {\n type: 'substitution';\n valueAtReference: string | undefined;\n substitutionValue: string | undefined;\n}\n\nexport class SubstitutionClass implements MutationClass, Substitution {\n readonly code;\n readonly type = 'substitution';\n\n constructor(\n readonly segment: string | undefined,\n readonly valueAtReference: string | undefined,\n readonly substitutionValue: string | undefined,\n readonly position: number,\n ) {\n const segmentString = this.segment ? `${this.segment}:` : '';\n const valueAtReferenceString = this.valueAtReference ? `${this.valueAtReference}` : '';\n const substitutionValueString = this.substitutionValue ? `${this.substitutionValue}` : '';\n this.code = `${segmentString}${valueAtReferenceString}${this.position}${substitutionValueString}`;\n }\n\n equals(other: MutationClass): boolean {\n if (!(other instanceof SubstitutionClass)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.valueAtReference === other.valueAtReference &&\n this.substitutionValue === other.substitutionValue &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): SubstitutionClass | null {\n const match = mutationStr.match(substitutionRegex);\n if (match === null || match.groups === undefined) {\n return null;\n }\n return new SubstitutionClass(\n match.groups.segment,\n match.groups.valueAtReference,\n match.groups.substitutionValue,\n parseInt(match.groups.position, 10),\n );\n }\n}\n\nexport const deletionRegex = /^((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<valueAtReference>[A-Za-z])?(?<position>\\d+)(-)$/;\n\nexport interface Deletion extends Mutation {\n type: 'deletion';\n valueAtReference: string | undefined;\n}\n\nexport class DeletionClass implements MutationClass, Deletion {\n readonly code;\n readonly type = 'deletion';\n\n constructor(\n readonly segment: string | undefined,\n readonly valueAtReference: string | undefined,\n readonly position: number,\n ) {\n const segmentString = this.segment ? `${this.segment}:` : '';\n const valueAtReferenceString = this.valueAtReference ? `${this.valueAtReference}` : '';\n this.code = `${segmentString}${valueAtReferenceString}${this.position}-`;\n }\n\n equals(other: MutationClass): boolean {\n if (!(other instanceof DeletionClass)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.valueAtReference === other.valueAtReference &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): DeletionClass | null {\n const match = mutationStr.match(deletionRegex);\n if (match === null || match.groups === undefined) {\n return null;\n }\n\n return new DeletionClass(\n match.groups.segment,\n match.groups.valueAtReference,\n parseInt(match.groups.position, 10),\n );\n }\n}\n\nexport const insertionRegexp =\n /^ins_((?<segment>[A-Za-z0-9_-]+)(?=:):)?(?<position>\\d+):(?<insertedSymbols>(([A-Za-z?]|(\\.\\*))+))$/i;\n\nexport interface Insertion extends Mutation {\n type: 'insertion';\n insertedSymbols: string;\n}\n\nexport class InsertionClass implements MutationClass {\n readonly code;\n readonly type = 'insertion';\n\n constructor(\n readonly segment: string | undefined,\n readonly position: number,\n readonly insertedSymbols: string,\n ) {\n this.code = `ins_${this.segment ? `${this.segment}:` : ''}${this.position}:${this.insertedSymbols}`;\n }\n\n equals(other: MutationClass): boolean {\n if (!(other instanceof InsertionClass)) {\n return false;\n }\n return (\n this.segment === other.segment &&\n this.insertedSymbols === other.insertedSymbols &&\n this.position === other.position\n );\n }\n\n toString() {\n return this.code;\n }\n\n static parse(mutationStr: string): InsertionClass | null {\n const match = mutationStr.match(insertionRegexp);\n if (match === null || match.groups === undefined) {\n return null;\n }\n\n return new InsertionClass(\n match.groups.segment,\n parseInt(match.groups.position, 10),\n match.groups.insertedSymbols,\n );\n }\n}\n\nexport function toMutation(\n mutationClass: SubstitutionClass | DeletionClass | InsertionClass,\n): Substitution | Deletion | Insertion {\n if (mutationClass.type === 'insertion') {\n return {\n type: 'insertion' as const,\n code: mutationClass.code,\n segment: mutationClass.segment,\n position: mutationClass.position,\n insertedSymbols: mutationClass.insertedSymbols,\n };\n }\n return toSubstitutionOrDeletion(mutationClass);\n}\n\nexport function toSubstitutionOrDeletion(mutation: SubstitutionClass | DeletionClass): Substitution | Deletion {\n switch (mutation.type) {\n case 'substitution':\n return {\n type: 'substitution' as const,\n code: mutation.code,\n segment: mutation.segment,\n position: mutation.position,\n valueAtReference: mutation.valueAtReference,\n substitutionValue: mutation.substitutionValue,\n };\n case 'deletion':\n return {\n type: 'deletion' as const,\n code: mutation.code,\n segment: mutation.segment,\n position: mutation.position,\n valueAtReference: mutation.valueAtReference,\n };\n }\n}\n\nexport const bases: { [P in SequenceType]: string[] } = {\n nucleotide: ['A', 'C', 'G', 'T', '-'],\n 'amino acid': [\n 'I',\n 'L',\n 'V',\n 'F',\n 'M',\n 'C',\n 'A',\n 'G',\n 'P',\n 'T',\n 'S',\n 'Y',\n 'W',\n 'Q',\n 'N',\n 'H',\n 'E',\n 'D',\n 'K',\n 'R',\n '-',\n ],\n};\n","import { DeletionClass, type SubstitutionClass } from '../../../utils/mutations';\n\nexport const sortSubstitutionsAndDeletions = (\n a: SubstitutionClass | DeletionClass,\n b: SubstitutionClass | DeletionClass,\n) => {\n if (a.segment !== b.segment) {\n return compareSegments(a.segment, b.segment);\n }\n\n if (a.position !== b.position) {\n return comparePositions(a.position, b.position);\n }\n\n const aIsDeletion = a instanceof DeletionClass;\n const bIsDeletion = b instanceof DeletionClass;\n\n if (aIsDeletion !== bIsDeletion) {\n return aIsDeletion ? 1 : -1;\n }\n\n if (!aIsDeletion && !bIsDeletion) {\n if (a.substitutionValue !== b.substitutionValue) {\n return compareSubstitutionValues(a.substitutionValue, b.substitutionValue);\n }\n }\n\n return 0;\n};\n\nexport const compareSegments = (a: string | undefined, b: string | undefined) => {\n if (a === undefined) {\n return -1;\n }\n if (b === undefined) {\n return 1;\n }\n return a.localeCompare(b);\n};\n\nexport const comparePositions = (a: number, b: number) => {\n return a - b;\n};\n\nconst compareSubstitutionValues = (a: string | undefined, b: string | undefined) => {\n if (a === undefined) {\n return -1;\n }\n if (b === undefined) {\n return 1;\n }\n return a.localeCompare(b);\n};\n","export const formatProportion = (proportion: number, digits: number = 2) => {\n return `${(proportion * 100).toFixed(digits)}%`;\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getMutationComparisonTableData } from './getMutationComparisonTableData';\nimport { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport { type DeletionClass, type SubstitutionClass } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { Table } from '../components/table';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsTableProps {\n data: Dataset<MutationData>;\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nexport const MutationComparisonTable: FunctionComponent<MutationsTableProps> = ({\n data,\n proportionInterval,\n pageSize,\n}) => {\n const headers = [\n {\n name: 'Mutation',\n sort: {\n compare: sortSubstitutionsAndDeletions,\n },\n formatter: (cell: SubstitutionClass | DeletionClass) => cell.toString(),\n },\n {\n name: 'Prevalence',\n columns: data.content.map((mutationData) => {\n return {\n name: mutationData.displayName,\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n };\n }),\n },\n ];\n\n const tableData = getMutationComparisonTableData(data, proportionInterval).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={headers} pageSize={pageSize} />;\n};\n","import { Chart, type ChartConfiguration } from 'chart.js';\nimport { useEffect, useRef } from 'preact/hooks';\n\nexport interface GsChartProps {\n configuration: ChartConfiguration;\n}\n\nconst GsChart = ({ configuration }: GsChartProps) => {\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const chartRef = useRef<Chart | null>(null);\n\n useEffect(() => {\n if (canvasRef.current === null) {\n return;\n }\n\n const ctx = canvasRef.current.getContext('2d');\n if (ctx === null) {\n return;\n }\n\n chartRef.current = new Chart(ctx, configuration);\n\n const resizeChartAfterFullscreenChange = () => {\n chartRef.current?.destroy();\n chartRef.current = new Chart(ctx, configuration);\n };\n document.addEventListener('fullscreenchange', resizeChartAfterFullscreenChange);\n\n return () => {\n document.removeEventListener('fullscreenchange', resizeChartAfterFullscreenChange);\n chartRef.current?.destroy();\n };\n }, [canvasRef, configuration]);\n\n return <canvas ref={canvasRef} />;\n};\n\nexport default GsChart;\n","import { type ActiveElement, Chart, type ChartConfiguration, type ChartEvent, registerables } from 'chart.js';\nimport { ArcSlice, extractSets, VennDiagramController } from 'chartjs-chart-venn';\nimport { type FunctionComponent } from 'preact';\nimport { useEffect, useMemo, useRef, useState } from 'preact/hooks';\n\nimport { type MutationData } from './queryMutationData';\nimport { type Dataset } from '../../operator/Dataset';\nimport GsChart from '../components/chart';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\nChart.register(...registerables, VennDiagramController, ArcSlice);\n\nexport interface MutationComparisonVennProps {\n data: Dataset<MutationData>;\n proportionInterval: ProportionInterval;\n}\n\nexport const MutationComparisonVenn: FunctionComponent<MutationComparisonVennProps> = ({\n data,\n proportionInterval,\n}) => {\n const divRef = useRef<HTMLDivElement>(null);\n const noElementSelectedMessage = 'You have no elements selected. Click in the venn diagram to select.';\n const [selectedDatasetIndex, setSelectedDatasetIndex] = useState<null | number>(null);\n\n const sets = useMemo(\n () =>\n extractSets(\n data.content\n .map((mutationData) => ({\n displayName: mutationData.displayName,\n data: mutationData.data.filter(\n (mutationEntry) =>\n mutationEntry.proportion >= proportionInterval.min &&\n mutationEntry.proportion <= proportionInterval.max,\n ),\n }))\n .map((mutationData) => {\n return {\n label: mutationData.displayName,\n values: mutationData.data.map((mutationEntry) => mutationEntry.mutation.toString()),\n };\n }),\n ),\n [data, proportionInterval],\n );\n\n useEffect(() => {\n if (divRef.current === null) {\n return;\n }\n if (selectedDatasetIndex === null) {\n divRef.current.innerText = noElementSelectedMessage;\n return;\n }\n\n const values = sets.datasets[0].data[selectedDatasetIndex].values;\n const label = sets.datasets[0].data[selectedDatasetIndex].label;\n divRef.current!.innerText = `${label}: ${values.join(', ')}` || '';\n }, [divRef, selectedDatasetIndex, sets]);\n\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'venn',\n data: sets,\n options: {\n maintainAspectRatio: false,\n scales: {\n x: {\n ticks: {\n color: 'black',\n font: {\n size: 20,\n },\n },\n },\n y: {\n ticks: {\n color: 'blue',\n font: {\n size: 20,\n },\n },\n },\n },\n events: ['click'],\n onClick(_: ChartEvent, elements: ActiveElement[]) {\n if (elements.length === 0) {\n setSelectedDatasetIndex(null);\n }\n },\n backgroundColor: '#f5f5f5',\n animation: false,\n layout: {\n padding: 30,\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n filter: ({ dataIndex }) => {\n setSelectedDatasetIndex(dataIndex);\n return false;\n },\n },\n },\n },\n }),\n [sets],\n );\n\n if (data.content.length > 5) {\n return <div>Too many datasets to display. Maximum are five. </div>;\n }\n\n return (\n <div className='h-full flex flex-col'>\n <div className='flex-1'>\n <GsChart configuration={config} />\n </div>\n <div class='flex flex-wrap break-words m-2' ref={divRef} />\n </div>\n );\n};\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchSubstitutionsOrDeletions } from '../lapisApi/lapisApi';\nimport { type LapisFilter, type SequenceType, type SubstitutionOrDeletionEntry } from '../types';\nimport { DeletionClass, SubstitutionClass } from '../utils/mutations';\n\nexport class FetchSubstitutionsOrDeletionsOperator implements Operator<SubstitutionOrDeletionEntry> {\n constructor(\n private filter: LapisFilter,\n private sequenceType: SequenceType,\n private minProportion?: number,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<SubstitutionOrDeletionEntry>> {\n const mutations = await this.fetchMutations(lapis, signal);\n\n const content: SubstitutionOrDeletionEntry[] = mutations.map(\n ({ count, proportion, mutationFrom, mutationTo, position, sequenceName }) => {\n if (mutationTo === '-') {\n return {\n type: 'deletion',\n mutation: new DeletionClass(sequenceName ?? undefined, mutationFrom, position),\n count,\n proportion,\n };\n }\n return {\n type: 'substitution',\n mutation: new SubstitutionClass(sequenceName ?? undefined, mutationFrom, mutationTo, position),\n count,\n proportion,\n };\n },\n );\n\n return { content };\n }\n\n private async fetchMutations(lapis: string, signal?: AbortSignal) {\n const filter = {\n ...this.filter,\n minProportion: this.minProportion,\n };\n\n return fetchSubstitutionsOrDeletions(lapis, filter, this.sequenceType, signal).then(\n (response) => response.data,\n );\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class SortOperator<S> implements Operator<S> {\n constructor(\n private child: Operator<S>,\n private compareFn: (a: S, b: S) => number,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<S>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n return {\n content: childEvaluated.content.sort(this.compareFn),\n };\n }\n}\n","import { FetchSubstitutionsOrDeletionsOperator } from '../operator/FetchSubstitutionsOrDeletionsOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type LapisFilter, type SequenceType } from '../types';\n\nexport function querySubstitutionsOrDeletions(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\n lapis: string,\n signal?: AbortSignal,\n) {\n const fetchData = new FetchSubstitutionsOrDeletionsOperator(lapisFilter, sequenceType, 0);\n const sortData = new SortOperator(fetchData, (a, b) => {\n if (a.mutation.segment !== b.mutation.segment) {\n return (a.mutation.segment ?? '').localeCompare(b.mutation.segment ?? '');\n }\n return a.mutation.position - b.mutation.position;\n });\n return sortData.evaluate(lapis, signal);\n}\n","import { querySubstitutionsOrDeletions } from '../../query/querySubstitutionsOrDeletions';\nimport { type NamedLapisFilter, type SubstitutionOrDeletionEntry } from '../../types';\nimport { type DisplayedMutationType } from '../components/mutation-type-selector';\nimport { type DisplayedSegment } from '../components/segment-selector';\n\nexport type MutationData = {\n displayName: string;\n data: SubstitutionOrDeletionEntry[];\n};\n\nexport async function queryMutationData(\n lapisFilters: NamedLapisFilter[],\n sequenceType: 'nucleotide' | 'amino acid',\n lapis: string,\n) {\n const mutationData = await Promise.all(\n lapisFilters.map(async (filter) => {\n return {\n displayName: filter.displayName,\n data: (await querySubstitutionsOrDeletions(filter.lapisFilter, sequenceType, lapis)).content,\n };\n }),\n );\n return { mutationData };\n}\n\nexport function filterMutationData(\n data: MutationData[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n return data.map((mutationEntry) => ({\n displayName: mutationEntry.displayName,\n data: filterBySegmentAndMutationType(mutationEntry.data, displayedSegments, displayedMutationTypes),\n }));\n}\n\nexport function filterBySegmentAndMutationType(\n data: SubstitutionOrDeletionEntry[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n const byDisplayedSegments = (mutationEntry: SubstitutionOrDeletionEntry) => {\n if (mutationEntry.mutation.segment === undefined) {\n return true;\n }\n return displayedSegments.some(\n (displayedSegment) =>\n displayedSegment.segment === mutationEntry.mutation.segment && displayedSegment.checked,\n );\n };\n const byDisplayedMutationTypes = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return displayedMutationTypes.some(\n (displayedMutationType) =>\n displayedMutationType.checked && displayedMutationType.type === mutationEntry.type,\n );\n };\n\n return data.filter(byDisplayedSegments).filter(byDisplayedMutationTypes);\n}\n","import { createContext } from 'preact';\n\nexport const LapisUrlContext = createContext('');\n","import { type FunctionComponent } from 'preact';\n\ntype ToStringable = {\n toString: () => string;\n};\n\ntype DataValue = string | number | boolean | null | ToStringable;\n\nexport interface CsvDownloadButtonProps {\n label?: string;\n filename?: string;\n getData: () => Record<string, DataValue>[];\n className?: string;\n}\n\nexport const CsvDownloadButton: FunctionComponent<CsvDownloadButtonProps> = ({\n label = 'Download',\n filename = 'data.csv',\n getData,\n className,\n}) => {\n const download = () => {\n const content = getDownloadContent();\n const blob = new Blob([content], { type: 'text/csv' });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = filename;\n a.click();\n URL.revokeObjectURL(url);\n };\n\n const getDownloadContent = () => {\n const data = getData();\n const keys = getDataKeys(data);\n const header = `${keys.join(',')}\\n`;\n const rows = data.map((row) => keys.map((key) => row[key]).join(',')).join('\\n');\n return header + rows;\n };\n\n const getDataKeys = (data: Record<string, DataValue>[]) => {\n const keysSet = data\n .map((row) => Object.keys(row))\n .reduce((accumulatedKeys, keys) => {\n keys.forEach((key) => accumulatedKeys.add(key));\n return accumulatedKeys;\n }, new Set<string>());\n\n return [...keysSet];\n };\n\n return (\n <button className={className} onClick={download}>\n {label}\n </button>\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useEffect, useRef } from 'preact/hooks';\n\nimport { LapisError, UnknownLapisError } from '../../lapisApi/lapisApi';\n\nexport const GS_ERROR_EVENT_TYPE = 'gs-error';\n\nexport class ErrorEvent extends Event {\n constructor(public readonly error: Error) {\n super(GS_ERROR_EVENT_TYPE, {\n bubbles: true,\n composed: true,\n });\n }\n}\n\nexport class UserFacingError extends Error {\n constructor(\n public readonly headline: string,\n message: string,\n ) {\n super(message);\n this.name = 'UserFacingError';\n }\n}\n\nexport type ErrorDisplayProps = {\n error: Error;\n resetError: () => void;\n layout?: 'horizontal' | 'vertical';\n};\n\nexport const ErrorDisplay: FunctionComponent<ErrorDisplayProps> = ({ error, resetError, layout }) => {\n // eslint-disable-next-line no-console -- Currently we use the following statement for our error handling\n console.error(error);\n\n const containerRef = useRef<HTMLInputElement>(null);\n const ref = useRef<HTMLDialogElement>(null);\n\n useEffect(() => {\n containerRef.current?.dispatchEvent(new ErrorEvent(error));\n });\n\n const { headline, details } = getDisplayedErrorMessage(error);\n\n return (\n <div\n ref={containerRef}\n className={`h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center ${layout === 'horizontal' ? 'flex-row' : 'flex-col'}`}\n >\n <div>\n <div className='text-red-700 font-bold'>{headline}</div>\n <div>\n Oops! Something went wrong.\n {details !== undefined && (\n <>\n {' '}\n <button className='underline hover:text-gray-400' onClick={() => ref.current?.showModal()}>\n Show details.\n </button>\n <dialog ref={ref} class='modal'>\n <div class='modal-box'>\n <form method='dialog'>\n <button className='btn btn-sm btn-circle btn-ghost absolute right-2 top-2'>\n ✕\n </button>\n </form>\n <h1 class='text-lg'>{details.headline}</h1>\n <p class='py-4'>{details.message}</p>\n </div>\n <form method='dialog' class='modal-backdrop'>\n <button>close</button>\n </form>\n </dialog>\n </>\n )}\n </div>\n </div>\n <button onClick={resetError} className='btn btn-sm flex items-center m-4'>\n <span className='iconify mdi--reload text-lg' />\n Try again\n </button>\n </div>\n );\n};\n\nfunction getDisplayedErrorMessage(error: Error) {\n if (error instanceof UserFacingError) {\n return {\n headline: `Error - ${error.headline}`,\n details: {\n headline: error.headline,\n message: error.message,\n },\n };\n }\n\n if (error instanceof LapisError) {\n return {\n headline: `Error - Failed fetching ${error.requestedData} from LAPIS`,\n details: {\n headline: `LAPIS request failed: ${error.requestedData} - ${error.problemDetail.status} ${error.problemDetail.title}`,\n message: error.problemDetail.detail ?? error.message,\n },\n };\n }\n\n if (error instanceof UnknownLapisError) {\n return {\n headline: `Error - Failed fetching ${error.requestedData} from LAPIS`,\n details: {\n headline: `LAPIS request failed: An unexpected error occurred while fetching ${error.requestedData}`,\n message: error.message,\n },\n };\n }\n\n return { headline: 'Error', details: undefined };\n}\n","import { type FunctionComponent } from 'preact';\n\nexport type Size = {\n width: string;\n height: string;\n};\n\nexport interface ResizeContainerProps {\n size: Size;\n}\n\nexport const ResizeContainer: FunctionComponent<ResizeContainerProps> = ({ children, size }) => {\n return (\n <div style={size} className='bg-white'>\n {children}\n </div>\n );\n};\n","import type { FunctionComponent } from 'preact';\nimport { useErrorBoundary } from 'preact/hooks';\n\nimport { ErrorDisplay, type ErrorDisplayProps } from './error-display';\nimport { ResizeContainer, type Size } from './resize-container';\n\ntype ErrorBoundaryProps = {\n size: Size;\n layout?: ErrorDisplayProps['layout'];\n};\n\nexport const ErrorBoundary: FunctionComponent<ErrorBoundaryProps> = ({ size, layout, children }) => {\n const [internalError, resetError] = useErrorBoundary();\n\n if (internalError) {\n return (\n <ResizeContainer size={size}>\n <ErrorDisplay error={internalError} resetError={resetError} layout={layout} />\n </ResizeContainer>\n );\n }\n\n return <>{children}</>;\n};\n","import { useEffect, useRef, useState } from 'preact/hooks';\n\nexport const Fullscreen = () => {\n const element = useRef<HTMLButtonElement>(null);\n const isFullscreen = useFullscreenStatus();\n return (\n <button\n ref={element}\n onClick={async () => {\n if (element.current) {\n if (isFullscreen) {\n await document.exitFullscreen();\n } else {\n const componentRoot = findComponentRoot(element.current);\n if (componentRoot) {\n await componentRoot.requestFullscreen();\n }\n }\n }\n }}\n className={`mt-0.5 iconify text-2xl ${isFullscreen ? 'mdi--fullscreen-exit hover:scale-90' : 'mdi--fullscreen hover:scale-110'}`}\n title={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n />\n );\n};\n\nfunction findComponentRoot(element: HTMLElement) {\n return findShadowRoot(element)?.children[0];\n}\n\nfunction findShadowRoot(element: HTMLElement) {\n let current: Node = element;\n while (current) {\n if (current instanceof ShadowRoot) {\n return current;\n }\n if (current.parentNode === null) {\n return null;\n }\n current = current.parentNode;\n }\n return null;\n}\n\nfunction useFullscreenStatus(): boolean {\n const [isFullscreen, setIsFullscreen] = useState<boolean>(document.fullscreenElement !== null);\n useEffect(() => {\n const handleFullscreenChange = () => {\n setIsFullscreen(document.fullscreenElement !== null);\n };\n document.addEventListener('fullscreenchange', handleFullscreenChange);\n return () => {\n document.removeEventListener('fullscreenchange', handleFullscreenChange);\n };\n }, []);\n return isFullscreen;\n}\n","import { type FunctionComponent } from 'preact';\nimport { useRef } from 'preact/hooks';\n\nconst Info: FunctionComponent = ({ children }) => {\n const dialogRef = useRef<HTMLDialogElement>(null);\n\n const toggleHelp = () => {\n dialogRef.current?.showModal();\n };\n\n return (\n <div className='relative'>\n <button type='button' className='btn btn-xs' onClick={toggleHelp}>\n ?\n </button>\n <dialog ref={dialogRef} className={'modal modal-bottom sm:modal-middle'}>\n <div className='modal-box sm:max-w-5xl'>\n <form method='dialog'>\n <button className='btn btn-sm btn-circle btn-ghost absolute right-2 top-2'>✕</button>\n </form>\n <div className={'flex flex-col'}>{children}</div>\n <div className='modal-action'>\n <form method='dialog'>\n <button className={'float-right underline text-sm hover:text-blue-700 mr-2'}>Close</button>\n </form>\n </div>\n </div>\n <form method='dialog' className='modal-backdrop'>\n <button>Helper to close when clicked outside</button>\n </form>\n </dialog>\n </div>\n );\n};\n\nexport const InfoHeadline1: FunctionComponent = ({ children }) => {\n return <h1 className='text-lg font-bold'>{children}</h1>;\n};\n\nexport const InfoHeadline2: FunctionComponent = ({ children }) => {\n return <h2 className='text-base font-bold mt-4'>{children}</h2>;\n};\n\nexport const InfoParagraph: FunctionComponent = ({ children }) => {\n return <p className='text-justify my-1'>{children}</p>;\n};\n\nexport const InfoLink: FunctionComponent<{ href: string }> = ({ children, href }) => {\n return (\n <a className='text-blue-600 hover:text-blue-800' href={href} target='_blank' rel='noopener noreferrer'>\n {children}\n </a>\n );\n};\n\nexport type InfoComponentCodeProps = {\n componentName: string;\n params: object;\n lapisUrl: string;\n};\n\nexport const InfoComponentCode: FunctionComponent<InfoComponentCodeProps> = ({ componentName, params, lapisUrl }) => {\n const componentCode = componentParametersToCode(componentName, params, lapisUrl);\n const codePenData = {\n title: 'GenSpectrum dashboard component',\n html: generateFullExampleCode(componentCode, componentName),\n layout: 'left',\n editors: '100',\n };\n return (\n <>\n <InfoHeadline2>Use this component yourself</InfoHeadline2>\n <InfoParagraph>\n This component was created using the following parameters:\n <div className='p-4 border border-gray-200 rounded-lg overflow-x-auto'>\n <pre>\n <code>{componentCode}</code>\n </pre>\n </div>\n </InfoParagraph>\n <InfoParagraph>\n You can add this component to your own website using the{' '}\n <InfoLink href='https://github.com/GenSpectrum/dashboard-components'>\n GenSpectrum dashboard components library\n </InfoLink>{' '}\n and the code from above.\n </InfoParagraph>\n <InfoParagraph>\n <form action='https://codepen.io/pen/define' method='POST' target='_blank'>\n <input\n type='hidden'\n name='data'\n value={JSON.stringify(codePenData).replace(/\"/g, '&quot;').replace(/'/g, '&apos;')}\n />\n\n <button className='text-blue-600 hover:text-blue-800' type='submit'>\n Click here to try it out on CodePen.\n </button>\n </form>\n </InfoParagraph>\n </>\n );\n};\n\nexport default Info;\n\nfunction componentParametersToCode(componentName: string, params: object, lapisUrl: string) {\n const stringifyIfNeeded = (value: unknown) => {\n return typeof value === 'object' ? JSON.stringify(value) : value;\n };\n\n const attributes = indentLines(\n Object.entries(params)\n .map(([key, value]) => `${key}='${stringifyIfNeeded(value)}'`)\n .join('\\n'),\n 4,\n );\n return `<gs-app lapis=\"${lapisUrl}\">\\n <gs-${componentName}\\n${attributes}\\n />\\n</gs-app>`;\n}\n\nfunction generateFullExampleCode(componentCode: string, componentName: string) {\n const storyBookPath = `/docs/visualization-${componentName}--docs`;\n return `<html>\n<head>\n <script type=\"module\" src=\"https://unpkg.com/@genspectrum/dashboard-components@latest/standalone-bundle/dashboard-components.js\"></script>\n <link rel=\"stylesheet\" href=\"https://unpkg.com/@genspectrum/dashboard-components@latest/dist/style.css\" />\n</head>\n\n<body>\n <!-- Component documentation: https://genspectrum.github.io/dashboard-components/?path=${storyBookPath} -->\n${indentLines(componentCode, 2)}\n</body>\n</html>\n`;\n}\n\nfunction indentLines(text: string, numberSpaces: number) {\n const spaces = ' '.repeat(numberSpaces);\n return text\n .split('\\n')\n .map((line) => spaces + line)\n .join('\\n');\n}\n","import { type FunctionComponent } from 'preact';\n\nexport const LoadingDisplay: FunctionComponent = () => {\n return (\n <div\n aria-label={'Loading'}\n className='h-full w-full border-2 border-gray-100 rounded-md flex justify-center items-center'\n >\n <div className='loading loading-spinner loading-md text-neutral-500' />\n </div>\n );\n};\n","import { autoUpdate, computePosition, type Middleware } from '@floating-ui/dom';\nimport type { Placement } from '@floating-ui/utils';\nimport { useEffect, useRef } from 'preact/hooks';\nimport type { MutableRefObject } from 'react';\n\nexport function useFloatingUi(\n referenceRef: MutableRefObject<HTMLElement | null>,\n floatingRef: MutableRefObject<HTMLElement | null>,\n middleware?: Array<Middleware | null | undefined | false>,\n placement?: Placement,\n) {\n const cleanupRef = useRef<() => void | null>(null);\n\n useEffect(() => {\n if (!referenceRef.current || !floatingRef.current) {\n return;\n }\n\n const { current: reference } = referenceRef;\n const { current: floating } = floatingRef;\n\n const update = () => {\n computePosition(reference, floating, {\n placement,\n middleware,\n }).then(({ x, y }) => {\n floating.style.left = `${x}px`;\n floating.style.top = `${y}px`;\n });\n };\n\n update();\n cleanupRef.current = autoUpdate(reference, floating, update);\n\n return () => {\n if (cleanupRef.current) {\n cleanupRef.current();\n }\n };\n }, [placement, middleware, referenceRef, floatingRef]);\n}\n\nexport function useCloseOnClickOutside(\n floatingRef: MutableRefObject<HTMLElement | null>,\n referenceRef: MutableRefObject<HTMLElement | null>,\n setShowContent: (value: ((prevState: boolean) => boolean) | boolean) => void,\n) {\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const path = event.composedPath();\n if (\n floatingRef.current &&\n !path.includes(floatingRef.current) &&\n referenceRef.current &&\n !path.includes(referenceRef.current)\n ) {\n setShowContent(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [floatingRef, referenceRef, setShowContent]);\n}\n\nexport function useCloseOnEsc(setShowHelp: (value: ((prevState: boolean) => boolean) | boolean) => void) {\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setShowHelp(false);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleKeyDown);\n };\n }, [setShowHelp]);\n}\n","import { flip, offset, shift } from '@floating-ui/dom';\nimport { type Placement } from '@floating-ui/utils';\nimport { type FunctionComponent } from 'preact';\nimport { useRef, useState } from 'preact/hooks';\n\nimport { useCloseOnClickOutside, useCloseOnEsc, useFloatingUi } from '../shared/floating-ui/hooks';\n\ninterface DropdownProps {\n buttonTitle: string;\n placement?: Placement;\n}\n\nexport const dropdownClass =\n 'z-10 absolute w-max top-0 left-0 bg-white p-4 border border-gray-200 shadow-lg rounded-md';\n\nexport const Dropdown: FunctionComponent<DropdownProps> = ({ children, buttonTitle, placement }) => {\n const [showContent, setShowContent] = useState(false);\n const referenceRef = useRef<HTMLButtonElement>(null);\n const floatingRef = useRef<HTMLDivElement>(null);\n\n useFloatingUi(referenceRef, floatingRef, [offset(4), shift(), flip()], placement);\n\n useCloseOnClickOutside(floatingRef, referenceRef, setShowContent);\n useCloseOnEsc(setShowContent);\n\n const toggle = () => {\n setShowContent(!showContent);\n };\n\n return (\n <>\n <button type='button' className='btn btn-xs whitespace-nowrap w-full' onClick={toggle} ref={referenceRef}>\n {buttonTitle}\n </button>\n <div ref={floatingRef} className={`${dropdownClass} ${showContent ? '' : 'hidden'}`}>\n {children}\n </div>\n </>\n );\n};\n","import { Dropdown } from './dropdown';\n\nexport type CheckboxItem = {\n label: string;\n checked: boolean;\n};\n\nexport interface CheckboxSelectorProps<Item extends CheckboxItem = CheckboxItem> {\n items: Item[];\n label: string;\n setItems: (items: Item[]) => void;\n}\n\nexport const CheckboxSelector = <Item extends CheckboxItem>({\n items,\n label,\n setItems,\n}: CheckboxSelectorProps<Item>) => {\n return (\n <Dropdown buttonTitle={label} placement={'bottom-start'}>\n <button\n className='btn btn-xs btn-ghost'\n onClick={() => {\n const newItems = items.map((item) => ({ ...item, checked: true }));\n setItems(newItems);\n }}\n >\n Select all\n </button>\n <button\n className='btn btn-xs btn-ghost'\n onClick={() => {\n const newItems = items.map((item) => ({ ...item, checked: false }));\n setItems(newItems);\n }}\n >\n Select none\n </button>\n <div className='divider mt-0 mb-0' />\n <ul>\n {items.map((item, index) => (\n <li className='flex flex-row items-center' key={item.label}>\n <label>\n <input\n className={'mr-2'}\n type='checkbox'\n id={`item-${index}`}\n checked={item.checked}\n onChange={() => {\n const newItems = items.map((item, i) =>\n i === index ? { ...item, checked: !item.checked } : item,\n );\n setItems(newItems);\n }}\n />\n {item.label}\n </label>\n </li>\n ))}\n </ul>\n </Dropdown>\n );\n};\n","import { type FunctionComponent } from 'preact/compat';\n\nimport { type CheckboxItem, CheckboxSelector } from './checkbox-selector';\nimport type { SubstitutionOrDeletion } from '../../types';\n\nexport type DisplayedMutationType = CheckboxItem & {\n type: SubstitutionOrDeletion;\n};\n\nexport type MutationTypeSelectorProps = {\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (mutationTypes: DisplayedMutationType[]) => void;\n};\n\nexport const MutationTypeSelector: FunctionComponent<MutationTypeSelectorProps> = ({\n displayedMutationTypes,\n setDisplayedMutationTypes,\n}) => {\n return (\n <div className='w-[6rem]'>\n <CheckboxSelector\n items={displayedMutationTypes}\n label={getMutationTypesSelectorLabel(displayedMutationTypes)}\n setItems={(items) => setDisplayedMutationTypes(items)}\n />\n </div>\n );\n};\n\nconst getMutationTypesSelectorLabel = (displayedMutationTypes: DisplayedMutationType[]) => {\n const checkedLabels = displayedMutationTypes.filter((displayedMutationType) => displayedMutationType.checked);\n\n if (checkedLabels.length === 0) {\n return `No types`;\n }\n if (displayedMutationTypes.length === checkedLabels.length) {\n return displayedMutationTypes\n .map((type) => {\n switch (type.type) {\n case 'substitution':\n return 'Subst.';\n case 'deletion':\n return 'Del.';\n }\n })\n .join(', ');\n }\n\n return checkedLabels\n .map((type) => {\n return type.label;\n })\n .join(', ');\n};\n","import { type FunctionComponent } from 'preact';\n\nexport const NoDataDisplay: FunctionComponent = () => {\n return (\n <div className='h-full w-full rounded-md border-2 border-gray-100 p-2 flex items-center justify-center'>\n <div>No data available.</div>\n </div>\n );\n};\n","import { type FunctionComponent, type JSX } from 'preact';\nimport { useState } from 'preact/hooks';\n\nimport './min-max-percent-slider.css';\n\nexport interface MinMaxPercentSliderProps {\n min: number;\n max: number;\n setMin: (min: number) => void;\n setMax: (max: number) => void;\n rangeMin?: number;\n rangeMax?: number;\n step?: number;\n}\n\nexport const MinMaxRangeSlider: FunctionComponent<MinMaxPercentSliderProps> = ({\n min,\n max,\n setMin,\n setMax,\n rangeMin = 0,\n rangeMax = 100,\n step = 0.1,\n}) => {\n const sliderColor = '#C6C6C6';\n const rangeColor = '#387bbe';\n\n const [zIndexTo, setZIndexTo] = useState(0);\n\n const onMinChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const minValue = Number(input.value);\n\n if (minValue > max) {\n setMax(minValue);\n setMin(minValue);\n } else {\n setMin(minValue);\n }\n };\n\n const onMaxChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const maxValue = Number(input.value);\n\n if (maxValue <= 0) {\n setZIndexTo(2);\n } else {\n setZIndexTo(0);\n }\n\n if (maxValue < min) {\n setMin(maxValue);\n setMax(maxValue);\n } else {\n setMax(maxValue);\n }\n };\n\n const background = `\n linear-gradient(\n to right,\n ${sliderColor} 0%,\n ${sliderColor} ${min}%,\n ${rangeColor} ${min}%,\n ${rangeColor} ${max}%,\n ${sliderColor} ${max}%,\n ${sliderColor} 100%)\n `;\n\n return (\n <div class='my-4 relative w-full h-full'>\n <input\n id='fromSlider'\n type='range'\n value={min}\n onInput={onMinChange}\n min={rangeMin}\n max={rangeMax}\n step={step}\n style={{ background, zIndex: 1, height: 0 }}\n />\n <input\n id='toSlider'\n type='range'\n value={max}\n min={rangeMin}\n max={rangeMax}\n step={step}\n onInput={onMaxChange}\n style={{ background, zIndex: zIndexTo }}\n />\n </div>\n );\n};\n","import { type FunctionComponent, type JSX } from 'preact';\nimport { useEffect, useState } from 'preact/hooks';\n\nexport type PercentInputProps = {\n percentage: number;\n setPercentage: (percentage: number) => void;\n indicateError?: boolean;\n};\n\nconst percentageInRange = (percentage: number) => {\n return percentage <= 100 && percentage >= 0;\n};\n\nexport const PercentInput: FunctionComponent<PercentInputProps> = ({\n percentage,\n setPercentage,\n indicateError = false,\n}) => {\n const [internalPercentage, setInternalPercentage] = useState(percentage);\n\n useEffect(() => {\n setInternalPercentage(percentage);\n }, [percentage]);\n\n const handleInputChange = (event: JSX.TargetedInputEvent<HTMLInputElement>) => {\n const input = event.target as HTMLInputElement;\n const value = Number(input.value);\n\n if (value === internalPercentage || input.value === '') {\n return;\n }\n\n const inRange = percentageInRange(value);\n\n if (inRange) {\n setPercentage(value);\n }\n setInternalPercentage(value);\n };\n\n const isError = indicateError || !percentageInRange(internalPercentage);\n return (\n <label className={`input input-bordered flex items-center gap-2 w-32 ${isError ? 'input-error' : ''}`}>\n <input\n type='number'\n step={0.1}\n min={0}\n max={100}\n value={internalPercentage}\n onInput={handleInputChange}\n lang='en'\n className={`grow w-16`}\n />\n %\n </label>\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { MinMaxRangeSlider } from './min-max-range-slider';\nimport { PercentInput } from './percent-intput';\n\nexport type ProportionInterval = { min: number; max: number };\n\nexport interface ProportionSelectorProps {\n proportionInterval: ProportionInterval;\n setMinProportion: (minProportion: number) => void;\n setMaxProportion: (maxProportion: number) => void;\n}\n\nfunction useUpdateExternalValueInIntervals(\n setExternalValue: (minProportion: number) => void,\n updateIntervalInMs: number,\n internalValue: number,\n) {\n const hasMounted = useRef(false);\n\n useEffect(() => {\n if (!hasMounted.current) {\n hasMounted.current = true;\n return;\n }\n\n const minTimeout = setTimeout(() => {\n setExternalValue(internalValue);\n }, updateIntervalInMs);\n\n return () => clearTimeout(minTimeout);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- We only want to run this effect when the internal value changes\n }, [internalValue]);\n}\n\nexport const ProportionSelector: FunctionComponent<ProportionSelectorProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n}) => {\n const updateIntervalInMs = 300;\n const { min: minProportion, max: maxProportion } = proportionInterval;\n\n const [internalMinProportion, setInternalMinProportion] = useState(minProportion);\n const [internalMaxProportion, setInternalMaxProportion] = useState(maxProportion);\n\n useUpdateExternalValueInIntervals(setMinProportion, updateIntervalInMs, internalMinProportion);\n const updateMinPercentage = (minPercentage: number) => {\n const newMinProportion = minPercentage / 100;\n setInternalMinProportion(newMinProportion);\n };\n\n useUpdateExternalValueInIntervals(setMaxProportion, updateIntervalInMs, internalMaxProportion);\n const updateMaxPercentage = (maxPercentage: number) => {\n const newMaxProportion = maxPercentage / 100;\n setInternalMaxProportion(newMaxProportion);\n };\n\n const indicateError = internalMinProportion > internalMaxProportion;\n\n return (\n <div class='flex flex-col w-64 mb-2'>\n <div class='flex items-center '>\n <PercentInput\n percentage={internalMinProportion * 100}\n setPercentage={updateMinPercentage}\n indicateError={indicateError}\n />\n <div class='m-2'>-</div>\n <PercentInput\n percentage={internalMaxProportion * 100}\n setPercentage={updateMaxPercentage}\n indicateError={indicateError}\n />\n </div>\n <div class='my-1'>\n <MinMaxRangeSlider\n min={internalMinProportion * 100}\n max={internalMaxProportion * 100}\n setMin={updateMinPercentage}\n setMax={updateMaxPercentage}\n />\n </div>\n </div>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Dropdown } from './dropdown';\nimport { ProportionSelector, type ProportionSelectorProps } from './proportion-selector';\n\nexport type ProportionSelectorDropdownProps = ProportionSelectorProps & { labelPrefix?: string };\n\nexport const ProportionSelectorDropdown: FunctionComponent<ProportionSelectorDropdownProps> = ({\n proportionInterval,\n setMinProportion,\n setMaxProportion,\n labelPrefix = 'Proportion',\n}) => {\n const percentLabel = `${(proportionInterval.min * 100).toFixed(1)}% - ${(proportionInterval.max * 100).toFixed(1)}%`;\n\n const width = 'w-[calc(1.5 * var(--tw-space-x-reverse) + 1.5 * var(--tw-space-x))]';\n\n return (\n <div className={width}>\n <Dropdown buttonTitle={`${labelPrefix} ${percentLabel}`} placement={'bottom-start'}>\n <ProportionSelector\n proportionInterval={proportionInterval}\n setMinProportion={setMinProportion}\n setMaxProportion={setMaxProportion}\n />\n </Dropdown>\n </div>\n );\n};\n","import { createContext } from 'preact';\n\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\n\nexport const ReferenceGenomeContext = createContext<ReferenceGenome>({ nucleotideSequences: [], genes: [] });\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport { type CheckboxItem, CheckboxSelector } from './checkbox-selector';\nimport { getSegmentNames } from '../../lapisApi/ReferenceGenome';\nimport { type SequenceType } from '../../types';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\n\nexport type DisplayedSegment = CheckboxItem & {\n segment: string;\n};\n\nexport type SegmentSelectorProps = {\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (items: DisplayedSegment[]) => void;\n};\n\nexport const SegmentSelector: FunctionComponent<SegmentSelectorProps> = ({\n displayedSegments,\n setDisplayedSegments,\n}) => {\n if (displayedSegments.length <= 1) {\n return null;\n }\n\n return (\n <div className='w-24'>\n <CheckboxSelector\n items={displayedSegments}\n label={getSegmentSelectorLabel(displayedSegments)}\n setItems={(items) => setDisplayedSegments(items)}\n />\n </div>\n );\n};\n\nconst getSegmentSelectorLabel = (displayedSegments: DisplayedSegment[]) => {\n const allSelectedSelected = displayedSegments\n .filter((segment) => segment.checked)\n .map((segment) => segment.segment);\n\n if (allSelectedSelected.length === 0) {\n return `No segments`;\n }\n if (displayedSegments.length === allSelectedSelected.length) {\n return `All segments`;\n }\n\n const longestDisplayString = `All segments`;\n\n const allSelectedSelectedString = allSelectedSelected.join(', ');\n\n if (longestDisplayString.length >= allSelectedSelectedString.length) {\n return allSelectedSelectedString;\n }\n\n return `${allSelectedSelected.length} ${allSelectedSelected.length === 1 ? 'segment' : 'segments'}`;\n};\n\nexport function useDisplayedSegments(sequenceType: SequenceType) {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const displayedSegments = getSegmentNames(referenceGenome, sequenceType).map((segment) => ({\n segment,\n label: segment,\n checked: true,\n }));\n\n return useState<DisplayedSegment[]>(displayedSegments);\n}\n","import { Fragment, type FunctionComponent } from 'preact';\nimport { useEffect, useRef, useState } from 'preact/hooks';\nimport { type JSXInternal } from 'preact/src/jsx';\n\ntype Tab = {\n title: string;\n content: JSXInternal.Element;\n};\n\ninterface ComponentTabsProps {\n tabs: Tab[];\n toolbar?: JSXInternal.Element | ((activeTab: string) => JSXInternal.Element);\n}\n\nconst Tabs: FunctionComponent<ComponentTabsProps> = ({ tabs, toolbar }) => {\n const [activeTab, setActiveTab] = useState(tabs[0].title);\n const [heightOfTabs, setHeightOfTabs] = useState('3rem');\n const tabRef = useRef<HTMLDivElement>(null);\n\n const updateHeightOfTabs = () => {\n if (tabRef.current) {\n const heightOfTabs = tabRef.current.getBoundingClientRect().height;\n setHeightOfTabs(`${heightOfTabs}px`);\n }\n };\n\n useEffect(() => {\n updateHeightOfTabs();\n\n window.addEventListener('resize', updateHeightOfTabs);\n return () => {\n window.removeEventListener('resize', updateHeightOfTabs);\n };\n }, []);\n\n const tabElements = (\n <div className='flex flex-row'>\n {tabs.map((tab) => {\n return (\n <Fragment key={tab.title}>\n <button\n className={`px-4 py-2 text-sm font-medium leading-5 transition-colors duration-150 ${\n activeTab === tab.title\n ? 'border-b-2 border-gray-400'\n : 'text-gray-600 hover:bg-gray-100 hover:text-gray-700'\n }`}\n onClick={() => {\n setActiveTab(tab.title);\n }}\n >\n {tab.title}\n </button>\n </Fragment>\n );\n })}\n </div>\n );\n\n const toolbarElement = typeof toolbar === 'function' ? toolbar(activeTab) : toolbar;\n\n return (\n <div className='h-full w-full'>\n <div ref={tabRef} className='flex flex-row justify-between flex-wrap'>\n {tabElements}\n {toolbar && <div className='py-2 flex flex-wrap gap-y-1'>{toolbarElement}</div>}\n </div>\n <div\n className={`p-2 border-2 border-gray-100 rounded-b-md rounded-tr-md ${activeTab === tabs[0].title ? '' : 'rounded-tl-md'}`}\n style={{ height: `calc(100% - ${heightOfTabs})` }}\n >\n {tabs.map((tab) => (\n <div className='h-full overflow-auto' key={tab.title} hidden={activeTab !== tab.title}>\n {tab.content}\n </div>\n ))}\n </div>\n </div>\n );\n};\n\nexport default Tabs;\n","import { useEffect, useState } from 'preact/hooks';\n\nexport function useQuery<Data>(fetchDataCallback: () => Promise<Data>, dependencies: unknown[]) {\n const [data, setData] = useState<Data | null>(null);\n const [error, setError] = useState<Error | null>(null);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n const fetchData = async () => {\n setIsLoading(true);\n try {\n const result = await fetchDataCallback();\n setData(result);\n setError(null);\n } catch (error) {\n setError(error as Error);\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [JSON.stringify(dependencies)]);\n\n return { data, error, isLoading };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useMemo, useState } from 'preact/hooks';\n\nimport { getMutationComparisonTableData } from './getMutationComparisonTableData';\nimport { MutationComparisonTable } from './mutation-comparison-table';\nimport { MutationComparisonVenn } from './mutation-comparison-venn';\nimport { filterMutationData, type MutationData, queryMutationData } from './queryMutationData';\nimport { type NamedLapisFilter, type SequenceType } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'table' | 'venn';\n\nexport interface MutationComparisonProps {\n width: string;\n height: string;\n lapisFilters: NamedLapisFilter[];\n sequenceType: SequenceType;\n views: View[];\n pageSize: boolean | number;\n}\n\nexport const MutationComparison: FunctionComponent<MutationComparisonProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <MutationComparisonInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationComparisonInner: FunctionComponent<MutationComparisonProps> = (componentProps) => {\n const { lapisFilters, sequenceType } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryMutationData(lapisFilters, sequenceType, lapis);\n }, [lapisFilters, sequenceType, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <MutationComparisonTabs data={data.mutationData} originalComponentProps={componentProps} />;\n};\n\ntype MutationComparisonTabsProps = {\n data: MutationData[];\n originalComponentProps: MutationComparisonProps;\n};\n\nconst MutationComparisonTabs: FunctionComponent<MutationComparisonTabsProps> = ({ data, originalComponentProps }) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.5, max: 1 });\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(originalComponentProps.sequenceType);\n\n const filteredData = useMemo(\n () => filterMutationData(data, displayedSegments, displayedMutationTypes),\n [data, displayedSegments, displayedMutationTypes],\n );\n\n const getTab = (view: View) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: (\n <MutationComparisonTable\n data={{ content: filteredData }}\n proportionInterval={proportionInterval}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n case 'venn':\n return {\n title: 'Venn',\n content: (\n <MutationComparisonVenn\n data={{ content: filteredData }}\n proportionInterval={proportionInterval}\n />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n return (\n <Tabs\n tabs={tabs}\n toolbar={\n <Toolbar\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n filteredData={filteredData}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n originalComponentProps={originalComponentProps}\n />\n }\n />\n );\n};\n\ntype ToolbarProps = {\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n filteredData: MutationData[];\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n originalComponentProps: MutationComparisonProps;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n filteredData,\n proportionInterval,\n setProportionInterval,\n originalComponentProps,\n}) => {\n return (\n <>\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n />\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n <MutationTypeSelector\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getMutationComparisonTableData({ content: filteredData }, proportionInterval)}\n filename='mutation_comparison.csv'\n />\n <MutationComparisonInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype MutationComparisonInfoProps = {\n originalComponentProps: MutationComparisonProps;\n};\n\nconst MutationComparisonInfo: FunctionComponent<MutationComparisonInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Info for mutation comparison</InfoHeadline1>\n <InfoParagraph>TODO: https://github.com/GenSpectrum/dashboard-components/issues/465</InfoParagraph>\n <InfoComponentCode componentName='mutation-comparison' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n","import { consume } from '@lit/context';\nimport { type PropertyValues, ReactiveElement } from '@lit/reactive-element';\nimport { unsafeCSS } from 'lit';\nimport { render } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nimport { lapisContext } from './lapis-context';\nimport { referenceGenomeContext } from './reference-genome-context';\nimport { type ReferenceGenome } from '../lapisApi/ReferenceGenome';\nimport { LapisUrlContext } from '../preact/LapisUrlContext';\nimport { ReferenceGenomeContext } from '../preact/ReferenceGenomeContext';\nimport minMaxPercentSliderCss from '../preact/components/min-max-percent-slider.css?inline';\nimport tailwindStyle from '../styles/tailwind.css?inline';\n\nimport '../styles/tailwind.css';\nimport '../preact/components/min-max-percent-slider.css';\n\nconst tailwindElementCss = unsafeCSS(tailwindStyle);\nconst minMaxPercentSliderElementCss = unsafeCSS(minMaxPercentSliderCss);\n\nexport abstract class PreactLitAdapter extends ReactiveElement {\n static override styles = [tailwindElementCss, minMaxPercentSliderElementCss];\n\n /**\n * @internal\n * The URL of the Lapis instance.\n *\n * This component must be a child of a `gs-app` component.\n * This value will automatically be injected by the parent `gs-app` component.\n */\n @consume({ context: lapisContext })\n lapis: string = '';\n\n /**\n * @internal\n * The reference genomes of the underlying organism.\n * These will be fetched from the Lapis instance.\n *\n * This component must be a child of a `gs-app` component.\n * This value will automatically be injected by the parent `gs-app` component.\n */\n @consume({ context: referenceGenomeContext, subscribe: true })\n referenceGenome: ReferenceGenome = {\n nucleotideSequences: [],\n genes: [],\n };\n\n override update(changedProperties: PropertyValues) {\n const vdom = (\n <LapisUrlContext.Provider value={this.lapis}>\n <ReferenceGenomeContext.Provider value={this.referenceGenome}>\n {this.render()}\n </ReferenceGenomeContext.Provider>\n </LapisUrlContext.Provider>\n );\n super.update(changedProperties);\n render(vdom, this.renderRoot);\n }\n\n protected abstract render(): JSXInternal.Element;\n}\n","import gridJsStyle from 'gridjs/dist/theme/mermaid.css?inline';\nimport { unsafeCSS } from 'lit';\n\nimport { PreactLitAdapter } from './PreactLitAdapter';\n\nimport 'gridjs/dist/theme/mermaid.css';\n\nconst gridJsElementCss = unsafeCSS(gridJsStyle);\n\nexport abstract class PreactLitAdapterWithGridJsStyles extends PreactLitAdapter {\n static override styles = [...PreactLitAdapter.styles, gridJsElementCss];\n}\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { MutationComparison, type MutationComparisonProps } from '../../preact/mutationComparison/mutation-comparison';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component allows to compare mutations between two different datasets.\n * The datasets are selected by LAPIS filters.\n *\n * It only shows substitutions and deletions, it does not show insertions.\n *\n * ## Views\n *\n * ### Table View\n *\n * The table view shows mutations and the proportions with which the mutation occurs in the respective data subsets.\n * It only shows mutations that are present in at least one of the data subsets\n * and where the proportion is within the selected proportion interval for at least one data subset.\n *\n * ### Venn View\n *\n * The Venn view shows the overlap of mutations between the datasets in a Venn diagram.\n * A dataset is considered to have a certain mutation, if the proportion of the mutation in the dataset is within the\n * selected proportion interval.\n * Thus, changing the proportion interval may change a mutations from being \"common\" between the datasets\n * to being \"for one dataset only\".\n */\n@customElement('gs-mutation-comparison')\nexport class MutationComparisonComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Required.\n *\n * An array of LAPIS filters to select the data to compare.\n *\n * The `lapisFilter` will be sent as is to LAPIS to filter the mutation data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used as the label for the filtered dataset in the views.\n * It should be human-readable.\n */\n @property({ type: Array })\n lapisFilters: {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }[] = [];\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('table' | 'venn')[] = ['table'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <MutationComparison\n lapisFilters={this.lapisFilters}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutation-comparison-component': MutationComparisonComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutation-comparison-component': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFiltersMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.lapisFilters, MutationComparisonProps['lapisFilters']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.sequenceType, MutationComparisonProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.views, MutationComparisonProps['views']>\n>;\ntype WidthMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.width, MutationComparisonProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.height, MutationComparisonProps['height']>\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof MutationComparisonComponent.prototype.pageSize, MutationComparisonProps['pageSize']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type InsertionEntry } from '../../types';\n\nexport function getInsertionsTableData(data: InsertionEntry[]) {\n return data.map((mutationEntry) => {\n return {\n insertion: mutationEntry.mutation,\n count: mutationEntry.count,\n };\n });\n}\n","import { type SubstitutionOrDeletionEntry } from '../../types';\nimport { type ProportionInterval } from '../components/proportion-selector';\n\nexport function getMutationsTableData(data: SubstitutionOrDeletionEntry[], proportionInterval: ProportionInterval) {\n const byProportion = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return mutationEntry.proportion >= proportionInterval.min && mutationEntry.proportion <= proportionInterval.max;\n };\n\n return data.filter(byProportion).map((mutationEntry) => {\n return {\n mutation: mutationEntry.mutation,\n type: mutationEntry.type,\n count: mutationEntry.count,\n proportion: mutationEntry.proportion,\n };\n });\n}\n","const pattern = /(?:([A-Za-z0-9]+):)?(\\d+)$/;\n\nexport const sortMutationPositions = (a: string, b: string) => {\n const aMatch = a.match(pattern);\n const bMatch = b.match(pattern);\n\n if (aMatch && bMatch) {\n if (aMatch[1] !== bMatch[1]) {\n return aMatch[1].localeCompare(bMatch[1]);\n }\n return parseInt(aMatch[2], 10) - parseInt(bMatch[2], 10);\n }\n throw new Error(`Invalid mutation position: ${a} or ${b}`);\n};\n","import { type BaseCell } from './mutations-grid';\nimport type { SequenceType, SubstitutionOrDeletionEntry } from '../../types';\nimport { bases } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { sortMutationPositions } from '../shared/sort/sortMutationPositions';\n\nexport const getMutationsGridData = (\n data: SubstitutionOrDeletionEntry[],\n sequenceType: SequenceType,\n proportionInterval: ProportionInterval,\n) => {\n return accumulateByPosition(data, sequenceType).filter((row) => byProportion(row, proportionInterval));\n};\n\nconst accumulateByPosition = (data: SubstitutionOrDeletionEntry[], sequenceType: SequenceType) => {\n const basesOfView = bases[sequenceType];\n const positionsToProportionAtBase = new Map<string, Map<string | undefined, number>>();\n const referenceBases = new Map<string, string | undefined>();\n\n for (const mutationEntry of data) {\n const position =\n (mutationEntry.mutation.segment ? `${mutationEntry.mutation.segment}:` : '') +\n mutationEntry.mutation.position;\n referenceBases.set(position, mutationEntry.mutation.valueAtReference);\n\n const initiallyFillPositionsToProportionAtBase = () => {\n if (!positionsToProportionAtBase.has(position)) {\n const empty = new Map();\n basesOfView.forEach((base) => empty.set(base, 0));\n empty.set(mutationEntry.mutation.valueAtReference, 1);\n positionsToProportionAtBase.set(position, empty);\n }\n };\n initiallyFillPositionsToProportionAtBase();\n\n const substitutionValue =\n mutationEntry.type === 'substitution' ? mutationEntry.mutation.substitutionValue : '-';\n\n const subtractSubstitutionValue = () => {\n const proportionAtBase = positionsToProportionAtBase.get(position)!;\n proportionAtBase.set(substitutionValue, mutationEntry.proportion);\n proportionAtBase.set(\n mutationEntry.mutation.valueAtReference,\n proportionAtBase.get(mutationEntry.mutation.valueAtReference)! - mutationEntry.proportion,\n );\n };\n subtractSubstitutionValue();\n }\n const orderedPositionsToProportionAtBase = [...positionsToProportionAtBase.entries()]\n .map(([position, proportionsAtBase]) => ({ position, proportions: proportionsAtBase }))\n .sort((a, b) => {\n return sortMutationPositions(a.position, b.position);\n });\n\n return orderedPositionsToProportionAtBase.map((proportionsForBaseAtPosition) => {\n const proportions = bases[sequenceType].map((base) => {\n return {\n [base]: {\n proportion: proportionsForBaseAtPosition.proportions.get(base)!,\n isReference: base === referenceBases.get(proportionsForBaseAtPosition.position),\n },\n };\n });\n\n return {\n position: proportionsForBaseAtPosition.position,\n ...proportions.reduce((acc, curr) => ({ ...acc, ...curr }), {}),\n } as MutationsGridDataRow;\n });\n};\n\nexport type BasesData = {\n [base: string]: BaseCell;\n};\nexport type MutationsGridDataRow = BasesData & { position: string };\n\nconst byProportion = (row: MutationsGridDataRow, proportionInterval: ProportionInterval) => {\n const numbersAndIsReference = Object.values(row).filter(\n (\n cell,\n ): cell is {\n proportion: number;\n isReference: boolean;\n } => typeof cell === 'object',\n );\n\n return numbersAndIsReference.some((cell) => {\n return (\n !cell.isReference && cell.proportion >= proportionInterval.min && cell.proportion <= proportionInterval.max\n );\n });\n};\n","import { type Row } from 'gridjs';\nimport { type FunctionComponent } from 'preact';\nimport { useMemo } from 'preact/hooks';\n\nimport { getMutationsGridData } from './getMutationsGridData';\nimport { type SequenceType, type SubstitutionOrDeletionEntry } from '../../types';\nimport { bases } from '../../utils/mutations';\nimport { type ProportionInterval } from '../components/proportion-selector';\nimport { Table, tableStyle } from '../components/table';\nimport { sortMutationPositions } from '../shared/sort/sortMutationPositions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface MutationsGridProps {\n data: SubstitutionOrDeletionEntry[];\n sequenceType: SequenceType;\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nexport type BaseCell = {\n proportion: number;\n isReference: boolean;\n};\n\nexport const MutationsGrid: FunctionComponent<MutationsGridProps> = ({\n data,\n sequenceType,\n proportionInterval,\n pageSize,\n}) => {\n const getHeaders = () => {\n return [\n {\n name: 'Position',\n sort: {\n compare: (a: string, b: string) => {\n return sortMutationPositions(a, b);\n },\n },\n },\n ...getBasesHeaders(),\n ];\n };\n\n const getBasesHeaders = () => {\n return bases[sequenceType].map((base) => {\n return {\n name: base,\n sort: {\n compare: (a: BaseCell, b: BaseCell) => {\n const aProportion = a.proportion;\n const bProportion = b.proportion;\n if (aProportion < bProportion) {\n return -1;\n }\n if (aProportion > bProportion) {\n return 1;\n }\n\n return 0;\n },\n },\n formatter: (cell: BaseCell) => formatProportion(cell.proportion),\n attributes: (cell: BaseCell, row: Row) => {\n // grid-js: the cell and row are null for header cells\n if (row === null) {\n return {};\n }\n\n return styleCells(cell);\n },\n };\n });\n };\n\n const styleCells = (cell: BaseCell) => {\n if (cell.isReference || cell.proportion < 0.0001) {\n return {\n style: {\n ...tableStyle.td,\n color: 'gray',\n },\n };\n }\n return {};\n };\n\n const tableData = useMemo(\n () => getMutationsGridData(data, sequenceType, proportionInterval).map((row) => Object.values(row)),\n [data, proportionInterval, sequenceType],\n );\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n","import { comparePositions, compareSegments } from './sortSubstitutionsAndDeletions';\nimport { type InsertionClass } from '../../../utils/mutations';\n\nexport const sortInsertions = (a: InsertionClass, b: InsertionClass) => {\n if (a.segment !== b.segment) {\n return compareSegments(a.segment, b.segment);\n }\n\n if (a.position !== b.position) {\n return comparePositions(a.position, b.position);\n }\n\n return a.insertedSymbols.localeCompare(b.insertedSymbols);\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getInsertionsTableData } from './getInsertionsTableData';\nimport { type InsertionEntry } from '../../types';\nimport { type InsertionClass } from '../../utils/mutations';\nimport { Table } from '../components/table';\nimport { sortInsertions } from '../shared/sort/sortInsertions';\n\nexport interface InsertionsTableProps {\n data: InsertionEntry[];\n pageSize: boolean | number;\n}\n\nexport const InsertionsTable: FunctionComponent<InsertionsTableProps> = ({ data, pageSize }) => {\n const getHeaders = () => {\n return [\n {\n name: 'Insertion',\n sort: {\n compare: (a: InsertionClass, b: InsertionClass) => {\n return sortInsertions(a, b);\n },\n },\n formatter: (cell: InsertionClass) => cell.toString(),\n },\n {\n name: 'Count',\n sort: true,\n },\n ];\n };\n\n const tableData = getInsertionsTableData(data).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { getMutationsTableData } from './getMutationsTableData';\nimport { type SubstitutionOrDeletionEntry } from '../../types';\nimport { type DeletionClass, type SubstitutionClass } from '../../utils/mutations';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { Table } from '../components/table';\nimport { sortSubstitutionsAndDeletions } from '../shared/sort/sortSubstitutionsAndDeletions';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsTableProps {\n data: SubstitutionOrDeletionEntry[];\n proportionInterval: ProportionInterval;\n pageSize: boolean | number;\n}\n\nconst MutationsTable: FunctionComponent<MutationsTableProps> = ({ data, proportionInterval, pageSize }) => {\n const getHeaders = () => {\n return [\n {\n name: 'Mutation',\n sort: {\n compare: (a: SubstitutionClass | DeletionClass, b: SubstitutionClass | DeletionClass) => {\n return sortSubstitutionsAndDeletions(a, b);\n },\n },\n formatter: (cell: SubstitutionClass | DeletionClass) => cell.toString(),\n },\n {\n name: 'Type',\n sort: true,\n },\n {\n name: 'Count',\n sort: true,\n },\n {\n name: 'Proportion',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n ];\n };\n\n const tableData = getMutationsTableData(data, proportionInterval).map((row) => Object.values(row));\n\n return <Table data={tableData} columns={getHeaders()} pageSize={pageSize} />;\n};\n\nexport default MutationsTable;\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchInsertions } from '../lapisApi/lapisApi';\nimport { type InsertionEntry, type LapisFilter, type SequenceType } from '../types';\nimport { InsertionClass } from '../utils/mutations';\n\nexport class FetchInsertionsOperator implements Operator<InsertionEntry> {\n constructor(\n private filter: LapisFilter,\n private sequenceType: SequenceType,\n ) {}\n\n async evaluate(lapisUrl: string, signal?: AbortSignal): Promise<Dataset<InsertionEntry>> {\n const insertions = (await fetchInsertions(lapisUrl, this.filter, this.sequenceType, signal)).data;\n\n const content: InsertionEntry[] = insertions.map(({ count, insertedSymbols, sequenceName, position }) => ({\n type: 'insertion',\n mutation: new InsertionClass(sequenceName ?? undefined, position, insertedSymbols),\n count,\n }));\n\n return { content };\n }\n}\n","import { FetchInsertionsOperator } from '../operator/FetchInsertionsOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type LapisFilter, type SequenceType } from '../types';\n\nexport function queryInsertions(\n lapisFilter: LapisFilter,\n sequenceType: SequenceType,\n lapis: string,\n signal?: AbortSignal,\n) {\n const fetchData = new FetchInsertionsOperator(lapisFilter, sequenceType);\n const sortData = new SortOperator(fetchData, (a, b) => {\n if (a.mutation.segment !== b.mutation.segment) {\n return (a.mutation.segment ?? '').localeCompare(b.mutation.segment ?? '');\n }\n return a.mutation.position - b.mutation.position;\n });\n return sortData.evaluate(lapis, signal);\n}\n","import { queryInsertions } from '../../query/queryInsertions';\nimport { querySubstitutionsOrDeletions } from '../../query/querySubstitutionsOrDeletions';\nimport {\n type InsertionEntry,\n type LapisFilter,\n type MutationEntry,\n type SubstitutionOrDeletionEntry,\n} from '../../types';\nimport { type DisplayedMutationType } from '../components/mutation-type-selector';\nimport { type DisplayedSegment } from '../components/segment-selector';\n\nexport async function queryMutationsData(\n lapisFilter: LapisFilter,\n sequenceType: 'nucleotide' | 'amino acid',\n lapis: string,\n) {\n const substitutionsOrDeletions = (await querySubstitutionsOrDeletions(lapisFilter, sequenceType, lapis)).content;\n const insertions = (await queryInsertions(lapisFilter, sequenceType, lapis)).content;\n\n return {\n substitutionsOrDeletions,\n insertions,\n };\n}\n\nexport function filterMutationsData(\n data: { insertions: InsertionEntry[]; substitutionsOrDeletions: SubstitutionOrDeletionEntry[] },\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n) {\n function bySelectedSegments(mutationEntry: MutationEntry) {\n if (mutationEntry.mutation.segment === undefined) {\n return true;\n }\n return displayedSegments.some(\n (displayedSegment) =>\n displayedSegment.segment === mutationEntry.mutation.segment && displayedSegment.checked,\n );\n }\n\n const byDisplayedMutationTypes = (mutationEntry: SubstitutionOrDeletionEntry) => {\n return displayedMutationTypes.some(\n (displayedMutationType) =>\n displayedMutationType.checked && displayedMutationType.type === mutationEntry.type,\n );\n };\n\n const filteredSubstitutionsOrDeletions = data.substitutionsOrDeletions.filter(bySelectedSegments);\n\n return {\n insertions: data.insertions.filter(bySelectedSegments),\n tableData: filteredSubstitutionsOrDeletions.filter(byDisplayedMutationTypes),\n gridData: filteredSubstitutionsOrDeletions,\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useState } from 'preact/hooks';\n\nimport { getInsertionsTableData } from './getInsertionsTableData';\nimport { getMutationsTableData } from './getMutationsTableData';\nimport { MutationsGrid } from './mutations-grid';\nimport { InsertionsTable } from './mutations-insertions-table';\nimport MutationsTable from './mutations-table';\nimport { filterMutationsData, queryMutationsData } from './queryMutations';\nimport {\n type InsertionEntry,\n type LapisFilter,\n type SequenceType,\n type SubstitutionOrDeletionEntry,\n} from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoHeadline2, InfoLink, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'table' | 'grid' | 'insertions';\n\nexport interface MutationsProps {\n width: string;\n height: string;\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n views: View[];\n pageSize: boolean | number;\n}\n\nexport const Mutations: FunctionComponent<MutationsProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <MutationsInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationsInner: FunctionComponent<MutationsProps> = (componentProps) => {\n const lapis = useContext(LapisUrlContext);\n const { lapisFilter, sequenceType } = componentProps;\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryMutationsData(lapisFilter, sequenceType, lapis);\n }, [lapisFilter, sequenceType, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <MutationsTabs mutationsData={data} originalComponentProps={componentProps} />;\n};\n\ntype MutationTabsProps = {\n mutationsData: { insertions: InsertionEntry[]; substitutionsOrDeletions: SubstitutionOrDeletionEntry[] };\n originalComponentProps: MutationsProps;\n};\n\nconst MutationsTabs: FunctionComponent<MutationTabsProps> = ({ mutationsData, originalComponentProps }) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.05, max: 1 });\n\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(originalComponentProps.sequenceType);\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n\n const filteredData = filterMutationsData(mutationsData, displayedSegments, displayedMutationTypes);\n\n const getTab = (view: View) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: (\n <MutationsTable\n data={filteredData.tableData}\n proportionInterval={proportionInterval}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n case 'grid':\n return {\n title: 'Grid',\n content: (\n <MutationsGrid\n data={filteredData.gridData}\n sequenceType={originalComponentProps.sequenceType}\n proportionInterval={proportionInterval}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n case 'insertions':\n return {\n title: 'Insertions',\n content: (\n <InsertionsTable data={filteredData.insertions} pageSize={originalComponentProps.pageSize} />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n filteredData={filteredData}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n originalComponentProps={originalComponentProps}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = {\n activeTab: string;\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n filteredData: { tableData: SubstitutionOrDeletionEntry[]; insertions: InsertionEntry[] };\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n originalComponentProps: MutationsProps;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n filteredData,\n proportionInterval,\n setProportionInterval,\n originalComponentProps,\n}) => {\n return (\n <>\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n {activeTab === 'Table' && (\n <MutationTypeSelector\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n displayedMutationTypes={displayedMutationTypes}\n />\n )}\n {(activeTab === 'Table' || activeTab === 'Grid') && (\n <>\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getMutationsTableData(filteredData.tableData, proportionInterval)}\n filename='substitutions_and_deletions.csv'\n />\n </>\n )}\n {activeTab === 'Insertions' && (\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() =>\n getInsertionsTableData(filteredData.insertions).map((row) => {\n return {\n insertion: row.insertion.toString(),\n count: row.count,\n };\n })\n }\n filename='insertions.csv'\n />\n )}\n <MutationsInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype MutationsInfoProps = {\n originalComponentProps: MutationsProps;\n};\n\nconst MutationsInfo: FunctionComponent<MutationsInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n\n return (\n <Info>\n <InfoHeadline1>Mutations</InfoHeadline1>\n <InfoParagraph>\n This shows mutations of a variant. There are three types of mutations:{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Substitution'>substitutions</InfoLink>,{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Deletion'>deletions</InfoLink> and{' '}\n <InfoLink href='https://www.genome.gov/genetics-glossary/Insertion'>insertions</InfoLink>.\n </InfoParagraph>\n <InfoHeadline2>Proportion calculation</InfoHeadline2>\n <InfoParagraph>\n The proportion of a mutation is calculated by dividing the number of sequences with the mutation by the\n total number of sequences with a non-ambiguous symbol at the position.\n </InfoParagraph>\n <InfoParagraph>\n <b>Example:</b> Assume we look at nucleotide mutations at position 5 where the reference has a T and\n assume there are 10 sequences in total:\n <ul className='list-disc list-inside ml-2'>\n <li>3 sequences have a C,</li>\n <li>2 sequences have a T,</li>\n <li>1 sequence has a G,</li>\n <li>3 sequences have an N,</li>\n <li>1 sequence has a Y (which means T or C),</li>\n </ul>\n then the proportion of the T5C mutation is 50%. The 4 sequences that have an N or Y are excluded from\n the calculation.\n </InfoParagraph>\n <InfoComponentCode componentName='mutations' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { Mutations, type MutationsProps } from '../../preact/mutations/mutations';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays mutations (substitutions, deletions and insertions) for a dataset selected by a LAPIS filter.\n *\n * ## Views\n *\n * ### Table View\n *\n * The table view shows all substitutions and deletions for the dataset.\n * It shows the type (substitution or deletion), the total count of the mutation\n * and the proportion of the mutation in the dataset.\n * The proportion is relative to the total number of sequences matching\n * the specified sequence filters with non-ambiguous reads at that position.\n *\n * The proportion interval filter can be used to filter the displayed mutations on client side.\n *\n * ### Grid View\n *\n * The grid view shows the proportion of each sequence symbol (nucleotide or amino acid) for each position that has a mutation.\n * Only positions with at least one mutation in the selected proportion interval are shown.\n *\n * ### Insertions View\n *\n * The insertions view shows the count of all insertions for the dataset.\n *\n */\n@customElement('gs-mutations')\nexport class MutationsComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Required.\n *\n * LAPIS filter to select the displayed data.\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('table' | 'grid' | 'insertions')[] = ['table', 'grid'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <Mutations\n lapisFilter={this.lapisFilter}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutations-component': MutationsComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutations-component': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof MutationsComponent.prototype.lapisFilter, MutationsProps['lapisFilter']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationsComponent.prototype.sequenceType, MutationsProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<Equals<typeof MutationsComponent.prototype.views, MutationsProps['views']>>;\ntype WidthMatches = Expect<Equals<typeof MutationsComponent.prototype.width, MutationsProps['width']>>;\ntype HeightMatches = Expect<Equals<typeof MutationsComponent.prototype.height, MutationsProps['height']>>;\ntype PageSizeMatches = Expect<Equals<typeof MutationsComponent.prototype.pageSize, MutationsProps['pageSize']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { type TemporalGranularity } from '../../types';\n\nexport function getPrevalenceOverTimeTableData(data: PrevalenceOverTimeData, granularity: TemporalGranularity) {\n return data[0].content.map((row, rowNumber) => {\n const otherColumns = data\n .map((dataset) => ({\n [`${dataset.displayName} prevalence`]: dataset.content[rowNumber].prevalence.toFixed(4),\n [`${dataset.displayName} count`]: dataset.content[rowNumber].count,\n }))\n .reduce((acc, val) => ({ ...acc, ...val }), {});\n\n return {\n [granularity]: row.dateRange?.toString() ?? 'Unknown',\n ...otherColumns,\n };\n });\n}\n","import type { TemporalClass } from './temporalClass';\n\nexport function sortNullToBeginningThenByDate(\n a: { dateRange: TemporalClass | null },\n b: { dateRange: TemporalClass | null },\n) {\n return a.dateRange === null\n ? -1\n : b.dateRange === null\n ? 1\n : a.dateRange.toString().localeCompare(b.dateRange.toString());\n}\n","import { type Chart, type CoreScaleOptions, Scale } from 'chart.js';\n\nexport class LogitScale extends Scale {\n static id = 'logit';\n\n constructor(cfg: { id: string; type: string; ctx: CanvasRenderingContext2D; chart: Chart }) {\n super(cfg);\n this.min = 0.001;\n this.max = 0.999;\n }\n\n override buildTicks() {\n const tickValues = [this.min, 0.01, 0.1, 0.5, 0.9, 0.99, this.max];\n\n this.ticks = tickValues.map((value) => ({ value }));\n return this.ticks;\n }\n\n getLogit(value: number): number {\n if (value <= 0) {\n return -Infinity;\n }\n if (value >= 1) {\n return Infinity;\n }\n\n return Math.log(value / (1 - value));\n }\n\n override getPixelForValue(value: number): number {\n const logitMin = this.getLogit(this.min);\n const logitMax = this.getLogit(this.max);\n\n const logitValue = this.getLogit(value);\n\n const decimal = (logitValue - logitMin) / (logitMax - logitMin);\n\n return this.getPixelForDecimal(decimal);\n }\n}\n\ndeclare module 'chart.js' {\n export interface CartesianScaleTypeRegistry {\n logit: {\n options: CoreScaleOptions;\n };\n }\n}\n","// colorblind friendly colors taken from https://personal.sron.nl/~pault/\n\nconst ColorsRGB = {\n indigo: [51, 34, 136],\n green: [17, 119, 51],\n cyan: [136, 204, 238],\n teal: [68, 170, 153],\n olive: [153, 153, 51],\n sand: [221, 204, 119],\n rose: [204, 102, 119],\n wine: [136, 34, 85],\n purple: [170, 68, 153],\n};\n\nexport type GraphColor = keyof typeof ColorsRGB;\n\nexport const singleGraphColorRGBAById = (id: number, alpha = 1) => {\n const keys = Object.keys(ColorsRGB) as GraphColor[];\n const key = keys[id % keys.length];\n\n return `rgba(${ColorsRGB[key].join(',')},${alpha})`;\n};\n\nexport const singleGraphColorRGBByName = (name: GraphColor, alpha = 1) => {\n return `rgba(${ColorsRGB[name].join(',')},${alpha})`;\n};\n","// calculateWilsonInterval calculates the Wilson score interval for 95% confidence.\n//\n// This function is based on https://github.com/erikfox/wilson-interval, but without\n// high precision math.\n//\n// observed - number of observed positive outcomes\n// sample - number of experiments or size of the sample\nexport function wilson95PercentConfidenceInterval(observed: number, sample: number) {\n const p = observed / sample;\n const n = sample;\n const z = 1.9599639715843482;\n\n const numerator = p + (z * z) / (2 * n);\n const w_plus_minus = z * Math.sqrt((p * (1 - p)) / n + (z * z) / (4 * (n * n)));\n const denominator = 1 + (z * z) / n;\n\n return {\n lowerLimit: (numerator - w_plus_minus) / denominator,\n upperLimit: (numerator + w_plus_minus) / denominator,\n };\n}\n\nexport const confidenceIntervalDataLabel = (\n value: number,\n lowerLimit?: number,\n upperLimit?: number,\n prefix?: string,\n) => {\n const label = prefix ? `${prefix}: ` : '';\n\n return `${label}${value.toFixed(3)} (${lowerLimit?.toFixed(3)} - ${upperLimit?.toFixed(3)})`;\n};\n\nexport type ConfidenceIntervalMethod = 'wilson' | 'none';\n","export interface YAxisMaxConfig {\n linear?: AxisMax;\n logarithmic?: AxisMax;\n}\n\nexport type AxisMax = 'maxInData' | 'limitTo1' | number;\n\nexport const getYAxisMax = (maxInData: number, axisMax?: AxisMax) => {\n if (!axisMax) {\n return 1;\n }\n\n switch (axisMax) {\n case 'limitTo1': {\n return maxInData > 1 ? 1 : maxInData;\n }\n case 'maxInData': {\n return maxInData;\n }\n default: {\n return axisMax;\n }\n }\n};\n","export type ScaleType = 'linear' | 'logarithmic' | 'logit';\n\nexport function getYAxisScale(scaleType: ScaleType) {\n switch (scaleType) {\n case 'linear': {\n return { beginAtZero: true, type: 'linear' as const, min: 0, max: 1 };\n }\n case 'logarithmic': {\n return { type: 'logarithmic' as const, max: 1 };\n }\n case 'logit':\n return { type: 'logit' as const };\n }\n}\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables, type TooltipItem } from 'chart.js';\nimport { BarWithErrorBar, BarWithErrorBarsController } from 'chartjs-chart-error-bars';\n\nimport { maxInData } from './prevalence-over-time';\nimport {\n type PrevalenceOverTimeData,\n type PrevalenceOverTimeVariantData,\n type PrevalenceOverTimeVariantDataPoint,\n} from '../../query/queryPrevalenceOverTime';\nimport { sortNullToBeginningThenByDate } from '../../utils/sort';\nimport GsChart from '../components/chart';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { type ConfidenceIntervalMethod, wilson95PercentConfidenceInterval } from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeBarChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale, BarWithErrorBarsController, BarWithErrorBar);\n\nconst PrevalenceOverTimeBarChart = ({\n data,\n yAxisScaleType,\n confidenceIntervalMethod,\n yAxisMaxConfig,\n}: PrevalenceOverTimeBarChartProps) => {\n const nullFirstData = data\n .filter((prevalenceOverTimeData) => prevalenceOverTimeData.content.length > 0)\n .map((variantData) => {\n return {\n content: variantData.content.sort(sortNullToBeginningThenByDate),\n displayName: variantData.displayName,\n };\n });\n\n if (nullFirstData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const datasets = nullFirstData.map((graphData, index) => getDataset(graphData, index, confidenceIntervalMethod));\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nullFirstData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: BarWithErrorBarsController.id,\n data: {\n datasets,\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(confidenceIntervalMethod),\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nconst getDataset = (\n prevalenceOverTimeVariant: PrevalenceOverTimeVariantData,\n index: number,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n): ChartDataset<\n typeof BarWithErrorBarsController.id,\n {\n x: string;\n yMin: number | undefined;\n yMax: number | undefined;\n y: number;\n }[]\n> => {\n return {\n borderWidth: 1,\n label: prevalenceOverTimeVariant.displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: prevalenceOverTimeVariant.content.map(mapDataPoint(confidenceIntervalMethod)),\n };\n};\n\nconst mapDataPoint = (confidenceIntervalMethod: ConfidenceIntervalMethod) => {\n return (dataPoint: PrevalenceOverTimeVariantDataPoint) => {\n const confidenceInterval = getConfidenceInterval(dataPoint, confidenceIntervalMethod);\n return {\n y: dataPoint.prevalence,\n yMin: confidenceInterval.lowerLimit,\n yMax: confidenceInterval.upperLimit,\n x: dataPoint.dateRange?.toString() ?? 'Unknown',\n };\n };\n};\n\nconst getConfidenceInterval = (\n dataPoint: PrevalenceOverTimeVariantDataPoint,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n) => {\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total);\n default:\n return { lowerLimit: undefined, upperLimit: undefined };\n }\n};\n\nconst tooltip = (confidenceIntervalMethod: ConfidenceIntervalMethod) => {\n const generalConfig = {\n mode: 'index' as const,\n intersect: false,\n };\n\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return {\n ...generalConfig,\n callbacks: {\n label: (context: TooltipItem<'barWithErrorBars'>) => {\n const value = context.dataset.data[context.dataIndex] as {\n y: number;\n yMin: number;\n yMax: number;\n };\n\n return `${context.dataset.label}: ${value.y.toFixed(3)} (${value.yMin.toFixed(3)} - ${value.yMax.toFixed(3)})`;\n },\n },\n };\n default:\n return generalConfig;\n }\n};\n\nexport default PrevalenceOverTimeBarChart;\n","export var SECONDS_A_MINUTE = 60;\nexport var SECONDS_A_HOUR = SECONDS_A_MINUTE * 60;\nexport var SECONDS_A_DAY = SECONDS_A_HOUR * 24;\nexport var SECONDS_A_WEEK = SECONDS_A_DAY * 7;\nexport var MILLISECONDS_A_SECOND = 1e3;\nexport var MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND;\nexport var MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND; // English locales\n\nexport var MS = 'millisecond';\nexport var S = 'second';\nexport var MIN = 'minute';\nexport var H = 'hour';\nexport var D = 'day';\nexport var W = 'week';\nexport var M = 'month';\nexport var Q = 'quarter';\nexport var Y = 'year';\nexport var DATE = 'date';\nexport var FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ';\nexport var INVALID_DATE_STRING = 'Invalid Date'; // regex\n\nexport var REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/;\nexport var REGEX_FORMAT = /\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;","// English [en]\n// We don't need weekdaysShort, weekdaysMin, monthsShort in en.js locale\nexport default {\n name: 'en',\n weekdays: 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n months: 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n ordinal: function ordinal(n) {\n var s = ['th', 'st', 'nd', 'rd'];\n var v = n % 100;\n return \"[\" + n + (s[(v - 20) % 10] || s[v] || s[0]) + \"]\";\n }\n};","import * as C from './constant';\n\nvar padStart = function padStart(string, length, pad) {\n var s = String(string);\n if (!s || s.length >= length) return string;\n return \"\" + Array(length + 1 - s.length).join(pad) + string;\n};\n\nvar padZoneStr = function padZoneStr(instance) {\n var negMinutes = -instance.utcOffset();\n var minutes = Math.abs(negMinutes);\n var hourOffset = Math.floor(minutes / 60);\n var minuteOffset = minutes % 60;\n return \"\" + (negMinutes <= 0 ? '+' : '-') + padStart(hourOffset, 2, '0') + \":\" + padStart(minuteOffset, 2, '0');\n};\n\nvar monthDiff = function monthDiff(a, b) {\n // function from moment.js in order to keep the same result\n if (a.date() < b.date()) return -monthDiff(b, a);\n var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month());\n var anchor = a.clone().add(wholeMonthDiff, C.M);\n var c = b - anchor < 0;\n var anchor2 = a.clone().add(wholeMonthDiff + (c ? -1 : 1), C.M);\n return +(-(wholeMonthDiff + (b - anchor) / (c ? anchor - anchor2 : anchor2 - anchor)) || 0);\n};\n\nvar absFloor = function absFloor(n) {\n return n < 0 ? Math.ceil(n) || 0 : Math.floor(n);\n};\n\nvar prettyUnit = function prettyUnit(u) {\n var special = {\n M: C.M,\n y: C.Y,\n w: C.W,\n d: C.D,\n D: C.DATE,\n h: C.H,\n m: C.MIN,\n s: C.S,\n ms: C.MS,\n Q: C.Q\n };\n return special[u] || String(u || '').toLowerCase().replace(/s$/, '');\n};\n\nvar isUndefined = function isUndefined(s) {\n return s === undefined;\n};\n\nexport default {\n s: padStart,\n z: padZoneStr,\n m: monthDiff,\n a: absFloor,\n p: prettyUnit,\n u: isUndefined\n};","import * as C from './constant';\nimport en from './locale/en';\nimport U from './utils';\nvar L = 'en'; // global locale\n\nvar Ls = {}; // global loaded locale\n\nLs[L] = en;\nvar IS_DAYJS = '$isDayjsObject'; // eslint-disable-next-line no-use-before-define\n\nvar isDayjs = function isDayjs(d) {\n return d instanceof Dayjs || !!(d && d[IS_DAYJS]);\n};\n\nvar parseLocale = function parseLocale(preset, object, isLocal) {\n var l;\n if (!preset) return L;\n\n if (typeof preset === 'string') {\n var presetLower = preset.toLowerCase();\n\n if (Ls[presetLower]) {\n l = presetLower;\n }\n\n if (object) {\n Ls[presetLower] = object;\n l = presetLower;\n }\n\n var presetSplit = preset.split('-');\n\n if (!l && presetSplit.length > 1) {\n return parseLocale(presetSplit[0]);\n }\n } else {\n var name = preset.name;\n Ls[name] = preset;\n l = name;\n }\n\n if (!isLocal && l) L = l;\n return l || !isLocal && L;\n};\n\nvar dayjs = function dayjs(date, c) {\n if (isDayjs(date)) {\n return date.clone();\n } // eslint-disable-next-line no-nested-ternary\n\n\n var cfg = typeof c === 'object' ? c : {};\n cfg.date = date;\n cfg.args = arguments; // eslint-disable-line prefer-rest-params\n\n return new Dayjs(cfg); // eslint-disable-line no-use-before-define\n};\n\nvar wrapper = function wrapper(date, instance) {\n return dayjs(date, {\n locale: instance.$L,\n utc: instance.$u,\n x: instance.$x,\n $offset: instance.$offset // todo: refactor; do not use this.$offset in you code\n\n });\n};\n\nvar Utils = U; // for plugin use\n\nUtils.l = parseLocale;\nUtils.i = isDayjs;\nUtils.w = wrapper;\n\nvar parseDate = function parseDate(cfg) {\n var date = cfg.date,\n utc = cfg.utc;\n if (date === null) return new Date(NaN); // null is invalid\n\n if (Utils.u(date)) return new Date(); // today\n\n if (date instanceof Date) return new Date(date);\n\n if (typeof date === 'string' && !/Z$/i.test(date)) {\n var d = date.match(C.REGEX_PARSE);\n\n if (d) {\n var m = d[2] - 1 || 0;\n var ms = (d[7] || '0').substring(0, 3);\n\n if (utc) {\n return new Date(Date.UTC(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms));\n }\n\n return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n }\n }\n\n return new Date(date); // everything else\n};\n\nvar Dayjs = /*#__PURE__*/function () {\n function Dayjs(cfg) {\n this.$L = parseLocale(cfg.locale, null, true);\n this.parse(cfg); // for plugin\n\n this.$x = this.$x || cfg.x || {};\n this[IS_DAYJS] = true;\n }\n\n var _proto = Dayjs.prototype;\n\n _proto.parse = function parse(cfg) {\n this.$d = parseDate(cfg);\n this.init();\n };\n\n _proto.init = function init() {\n var $d = this.$d;\n this.$y = $d.getFullYear();\n this.$M = $d.getMonth();\n this.$D = $d.getDate();\n this.$W = $d.getDay();\n this.$H = $d.getHours();\n this.$m = $d.getMinutes();\n this.$s = $d.getSeconds();\n this.$ms = $d.getMilliseconds();\n } // eslint-disable-next-line class-methods-use-this\n ;\n\n _proto.$utils = function $utils() {\n return Utils;\n };\n\n _proto.isValid = function isValid() {\n return !(this.$d.toString() === C.INVALID_DATE_STRING);\n };\n\n _proto.isSame = function isSame(that, units) {\n var other = dayjs(that);\n return this.startOf(units) <= other && other <= this.endOf(units);\n };\n\n _proto.isAfter = function isAfter(that, units) {\n return dayjs(that) < this.startOf(units);\n };\n\n _proto.isBefore = function isBefore(that, units) {\n return this.endOf(units) < dayjs(that);\n };\n\n _proto.$g = function $g(input, get, set) {\n if (Utils.u(input)) return this[get];\n return this.set(set, input);\n };\n\n _proto.unix = function unix() {\n return Math.floor(this.valueOf() / 1000);\n };\n\n _proto.valueOf = function valueOf() {\n // timezone(hour) * 60 * 60 * 1000 => ms\n return this.$d.getTime();\n };\n\n _proto.startOf = function startOf(units, _startOf) {\n var _this = this;\n\n // startOf -> endOf\n var isStartOf = !Utils.u(_startOf) ? _startOf : true;\n var unit = Utils.p(units);\n\n var instanceFactory = function instanceFactory(d, m) {\n var ins = Utils.w(_this.$u ? Date.UTC(_this.$y, m, d) : new Date(_this.$y, m, d), _this);\n return isStartOf ? ins : ins.endOf(C.D);\n };\n\n var instanceFactorySet = function instanceFactorySet(method, slice) {\n var argumentStart = [0, 0, 0, 0];\n var argumentEnd = [23, 59, 59, 999];\n return Utils.w(_this.toDate()[method].apply( // eslint-disable-line prefer-spread\n _this.toDate('s'), (isStartOf ? argumentStart : argumentEnd).slice(slice)), _this);\n };\n\n var $W = this.$W,\n $M = this.$M,\n $D = this.$D;\n var utcPad = \"set\" + (this.$u ? 'UTC' : '');\n\n switch (unit) {\n case C.Y:\n return isStartOf ? instanceFactory(1, 0) : instanceFactory(31, 11);\n\n case C.M:\n return isStartOf ? instanceFactory(1, $M) : instanceFactory(0, $M + 1);\n\n case C.W:\n {\n var weekStart = this.$locale().weekStart || 0;\n var gap = ($W < weekStart ? $W + 7 : $W) - weekStart;\n return instanceFactory(isStartOf ? $D - gap : $D + (6 - gap), $M);\n }\n\n case C.D:\n case C.DATE:\n return instanceFactorySet(utcPad + \"Hours\", 0);\n\n case C.H:\n return instanceFactorySet(utcPad + \"Minutes\", 1);\n\n case C.MIN:\n return instanceFactorySet(utcPad + \"Seconds\", 2);\n\n case C.S:\n return instanceFactorySet(utcPad + \"Milliseconds\", 3);\n\n default:\n return this.clone();\n }\n };\n\n _proto.endOf = function endOf(arg) {\n return this.startOf(arg, false);\n };\n\n _proto.$set = function $set(units, _int) {\n var _C$D$C$DATE$C$M$C$Y$C;\n\n // private set\n var unit = Utils.p(units);\n var utcPad = \"set\" + (this.$u ? 'UTC' : '');\n var name = (_C$D$C$DATE$C$M$C$Y$C = {}, _C$D$C$DATE$C$M$C$Y$C[C.D] = utcPad + \"Date\", _C$D$C$DATE$C$M$C$Y$C[C.DATE] = utcPad + \"Date\", _C$D$C$DATE$C$M$C$Y$C[C.M] = utcPad + \"Month\", _C$D$C$DATE$C$M$C$Y$C[C.Y] = utcPad + \"FullYear\", _C$D$C$DATE$C$M$C$Y$C[C.H] = utcPad + \"Hours\", _C$D$C$DATE$C$M$C$Y$C[C.MIN] = utcPad + \"Minutes\", _C$D$C$DATE$C$M$C$Y$C[C.S] = utcPad + \"Seconds\", _C$D$C$DATE$C$M$C$Y$C[C.MS] = utcPad + \"Milliseconds\", _C$D$C$DATE$C$M$C$Y$C)[unit];\n var arg = unit === C.D ? this.$D + (_int - this.$W) : _int;\n\n if (unit === C.M || unit === C.Y) {\n // clone is for badMutable plugin\n var date = this.clone().set(C.DATE, 1);\n date.$d[name](arg);\n date.init();\n this.$d = date.set(C.DATE, Math.min(this.$D, date.daysInMonth())).$d;\n } else if (name) this.$d[name](arg);\n\n this.init();\n return this;\n };\n\n _proto.set = function set(string, _int2) {\n return this.clone().$set(string, _int2);\n };\n\n _proto.get = function get(unit) {\n return this[Utils.p(unit)]();\n };\n\n _proto.add = function add(number, units) {\n var _this2 = this,\n _C$MIN$C$H$C$S$unit;\n\n number = Number(number); // eslint-disable-line no-param-reassign\n\n var unit = Utils.p(units);\n\n var instanceFactorySet = function instanceFactorySet(n) {\n var d = dayjs(_this2);\n return Utils.w(d.date(d.date() + Math.round(n * number)), _this2);\n };\n\n if (unit === C.M) {\n return this.set(C.M, this.$M + number);\n }\n\n if (unit === C.Y) {\n return this.set(C.Y, this.$y + number);\n }\n\n if (unit === C.D) {\n return instanceFactorySet(1);\n }\n\n if (unit === C.W) {\n return instanceFactorySet(7);\n }\n\n var step = (_C$MIN$C$H$C$S$unit = {}, _C$MIN$C$H$C$S$unit[C.MIN] = C.MILLISECONDS_A_MINUTE, _C$MIN$C$H$C$S$unit[C.H] = C.MILLISECONDS_A_HOUR, _C$MIN$C$H$C$S$unit[C.S] = C.MILLISECONDS_A_SECOND, _C$MIN$C$H$C$S$unit)[unit] || 1; // ms\n\n var nextTimeStamp = this.$d.getTime() + number * step;\n return Utils.w(nextTimeStamp, this);\n };\n\n _proto.subtract = function subtract(number, string) {\n return this.add(number * -1, string);\n };\n\n _proto.format = function format(formatStr) {\n var _this3 = this;\n\n var locale = this.$locale();\n if (!this.isValid()) return locale.invalidDate || C.INVALID_DATE_STRING;\n var str = formatStr || C.FORMAT_DEFAULT;\n var zoneStr = Utils.z(this);\n var $H = this.$H,\n $m = this.$m,\n $M = this.$M;\n var weekdays = locale.weekdays,\n months = locale.months,\n meridiem = locale.meridiem;\n\n var getShort = function getShort(arr, index, full, length) {\n return arr && (arr[index] || arr(_this3, str)) || full[index].slice(0, length);\n };\n\n var get$H = function get$H(num) {\n return Utils.s($H % 12 || 12, num, '0');\n };\n\n var meridiemFunc = meridiem || function (hour, minute, isLowercase) {\n var m = hour < 12 ? 'AM' : 'PM';\n return isLowercase ? m.toLowerCase() : m;\n };\n\n var matches = function matches(match) {\n switch (match) {\n case 'YY':\n return String(_this3.$y).slice(-2);\n\n case 'YYYY':\n return Utils.s(_this3.$y, 4, '0');\n\n case 'M':\n return $M + 1;\n\n case 'MM':\n return Utils.s($M + 1, 2, '0');\n\n case 'MMM':\n return getShort(locale.monthsShort, $M, months, 3);\n\n case 'MMMM':\n return getShort(months, $M);\n\n case 'D':\n return _this3.$D;\n\n case 'DD':\n return Utils.s(_this3.$D, 2, '0');\n\n case 'd':\n return String(_this3.$W);\n\n case 'dd':\n return getShort(locale.weekdaysMin, _this3.$W, weekdays, 2);\n\n case 'ddd':\n return getShort(locale.weekdaysShort, _this3.$W, weekdays, 3);\n\n case 'dddd':\n return weekdays[_this3.$W];\n\n case 'H':\n return String($H);\n\n case 'HH':\n return Utils.s($H, 2, '0');\n\n case 'h':\n return get$H(1);\n\n case 'hh':\n return get$H(2);\n\n case 'a':\n return meridiemFunc($H, $m, true);\n\n case 'A':\n return meridiemFunc($H, $m, false);\n\n case 'm':\n return String($m);\n\n case 'mm':\n return Utils.s($m, 2, '0');\n\n case 's':\n return String(_this3.$s);\n\n case 'ss':\n return Utils.s(_this3.$s, 2, '0');\n\n case 'SSS':\n return Utils.s(_this3.$ms, 3, '0');\n\n case 'Z':\n return zoneStr;\n // 'ZZ' logic below\n\n default:\n break;\n }\n\n return null;\n };\n\n return str.replace(C.REGEX_FORMAT, function (match, $1) {\n return $1 || matches(match) || zoneStr.replace(':', '');\n }); // 'ZZ'\n };\n\n _proto.utcOffset = function utcOffset() {\n // Because a bug at FF24, we're rounding the timezone offset around 15 minutes\n // https://github.com/moment/moment/pull/1871\n return -Math.round(this.$d.getTimezoneOffset() / 15) * 15;\n };\n\n _proto.diff = function diff(input, units, _float) {\n var _this4 = this;\n\n var unit = Utils.p(units);\n var that = dayjs(input);\n var zoneDelta = (that.utcOffset() - this.utcOffset()) * C.MILLISECONDS_A_MINUTE;\n var diff = this - that;\n\n var getMonth = function getMonth() {\n return Utils.m(_this4, that);\n };\n\n var result;\n\n switch (unit) {\n case C.Y:\n result = getMonth() / 12;\n break;\n\n case C.M:\n result = getMonth();\n break;\n\n case C.Q:\n result = getMonth() / 3;\n break;\n\n case C.W:\n result = (diff - zoneDelta) / C.MILLISECONDS_A_WEEK;\n break;\n\n case C.D:\n result = (diff - zoneDelta) / C.MILLISECONDS_A_DAY;\n break;\n\n case C.H:\n result = diff / C.MILLISECONDS_A_HOUR;\n break;\n\n case C.MIN:\n result = diff / C.MILLISECONDS_A_MINUTE;\n break;\n\n case C.S:\n result = diff / C.MILLISECONDS_A_SECOND;\n break;\n\n default:\n result = diff; // milliseconds\n\n break;\n }\n\n return _float ? result : Utils.a(result);\n };\n\n _proto.daysInMonth = function daysInMonth() {\n return this.endOf(C.M).$D;\n };\n\n _proto.$locale = function $locale() {\n // get locale object\n return Ls[this.$L];\n };\n\n _proto.locale = function locale(preset, object) {\n if (!preset) return this.$L;\n var that = this.clone();\n var nextLocaleName = parseLocale(preset, object, true);\n if (nextLocaleName) that.$L = nextLocaleName;\n return that;\n };\n\n _proto.clone = function clone() {\n return Utils.w(this.$d, this);\n };\n\n _proto.toDate = function toDate() {\n return new Date(this.valueOf());\n };\n\n _proto.toJSON = function toJSON() {\n return this.isValid() ? this.toISOString() : null;\n };\n\n _proto.toISOString = function toISOString() {\n // ie 8 return\n // new Dayjs(this.valueOf() + this.$d.getTimezoneOffset() * 60000)\n // .format('YYYY-MM-DDTHH:mm:ss.SSS[Z]')\n return this.$d.toISOString();\n };\n\n _proto.toString = function toString() {\n return this.$d.toUTCString();\n };\n\n return Dayjs;\n}();\n\nvar proto = Dayjs.prototype;\ndayjs.prototype = proto;\n[['$ms', C.MS], ['$s', C.S], ['$m', C.MIN], ['$H', C.H], ['$W', C.D], ['$M', C.M], ['$y', C.Y], ['$D', C.DATE]].forEach(function (g) {\n proto[g[1]] = function (input) {\n return this.$g(input, g[0], g[1]);\n };\n});\n\ndayjs.extend = function (plugin, option) {\n if (!plugin.$i) {\n // install plugin only once\n plugin(option, Dayjs, dayjs);\n plugin.$i = true;\n }\n\n return dayjs;\n};\n\ndayjs.locale = parseLocale;\ndayjs.isDayjs = isDayjs;\n\ndayjs.unix = function (timestamp) {\n return dayjs(timestamp * 1e3);\n};\n\ndayjs.en = Ls[L];\ndayjs.Ls = Ls;\ndayjs.p = {};\nexport default dayjs;","import { FORMAT_DEFAULT } from '../../constant';\nexport default (function (o, c) {\n // locale needed later\n var proto = c.prototype;\n var oldFormat = proto.format;\n\n proto.format = function (formatStr) {\n var _this = this;\n\n var locale = this.$locale();\n\n if (!this.isValid()) {\n return oldFormat.bind(this)(formatStr);\n }\n\n var utils = this.$utils();\n var str = formatStr || FORMAT_DEFAULT;\n var result = str.replace(/\\[([^\\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g, function (match) {\n switch (match) {\n case 'Q':\n return Math.ceil((_this.$M + 1) / 3);\n\n case 'Do':\n return locale.ordinal(_this.$D);\n\n case 'gggg':\n return _this.weekYear();\n\n case 'GGGG':\n return _this.isoWeekYear();\n\n case 'wo':\n return locale.ordinal(_this.week(), 'W');\n // W for week\n\n case 'w':\n case 'ww':\n return utils.s(_this.week(), match === 'w' ? 1 : 2, '0');\n\n case 'W':\n case 'WW':\n return utils.s(_this.isoWeek(), match === 'W' ? 1 : 2, '0');\n\n case 'k':\n case 'kk':\n return utils.s(String(_this.$H === 0 ? 24 : _this.$H), match === 'k' ? 1 : 2, '0');\n\n case 'X':\n return Math.floor(_this.$d.getTime() / 1000);\n\n case 'x':\n return _this.$d.getTime();\n\n case 'z':\n return \"[\" + _this.offsetName() + \"]\";\n\n case 'zzz':\n return \"[\" + _this.offsetName('long') + \"]\";\n\n default:\n return match;\n }\n });\n return oldFormat.bind(this)(result);\n };\n});","import { D, W, Y } from '../../constant';\nvar isoWeekPrettyUnit = 'isoweek';\nexport default (function (o, c, d) {\n var getYearFirstThursday = function getYearFirstThursday(year, isUtc) {\n var yearFirstDay = (isUtc ? d.utc : d)().year(year).startOf(Y);\n var addDiffDays = 4 - yearFirstDay.isoWeekday();\n\n if (yearFirstDay.isoWeekday() > 4) {\n addDiffDays += 7;\n }\n\n return yearFirstDay.add(addDiffDays, D);\n };\n\n var getCurrentWeekThursday = function getCurrentWeekThursday(ins) {\n return ins.add(4 - ins.isoWeekday(), D);\n };\n\n var proto = c.prototype;\n\n proto.isoWeekYear = function () {\n var nowWeekThursday = getCurrentWeekThursday(this);\n return nowWeekThursday.year();\n };\n\n proto.isoWeek = function (week) {\n if (!this.$utils().u(week)) {\n return this.add((week - this.isoWeek()) * 7, D);\n }\n\n var nowWeekThursday = getCurrentWeekThursday(this);\n var diffWeekThursday = getYearFirstThursday(this.isoWeekYear(), this.$u);\n return nowWeekThursday.diff(diffWeekThursday, W) + 1;\n };\n\n proto.isoWeekday = function (week) {\n if (!this.$utils().u(week)) {\n return this.day(this.day() % 7 ? week : week - 7);\n }\n\n return this.day() || 7;\n };\n\n var oldStartOf = proto.startOf;\n\n proto.startOf = function (units, startOf) {\n var utils = this.$utils();\n var isStartOf = !utils.u(startOf) ? startOf : true;\n var unit = utils.p(units);\n\n if (unit === isoWeekPrettyUnit) {\n return isStartOf ? this.date(this.date() - (this.isoWeekday() - 1)).startOf('day') : this.date(this.date() - 1 - (this.isoWeekday() - 1) + 7).endOf('day');\n }\n\n return oldStartOf.bind(this)(units, startOf);\n };\n});","import dayjs from 'dayjs/esm';\nimport advancedFormat from 'dayjs/esm/plugin/advancedFormat';\nimport isoWeek from 'dayjs/esm/plugin/isoWeek';\n\nimport type { TemporalGranularity } from '../types';\n\ndayjs.extend(isoWeek);\ndayjs.extend(advancedFormat);\n\n/**\n * https://day.js.org/docs/en/plugin/advanced-format\n */\nconst FORMAT_ISO_WEEK_YEAR_WEEK = 'GGGG-[W]WW';\n\nexport class TemporalCache {\n private yearMonthDayCache = new Map<string, YearMonthDayClass>();\n private yearWeekCache = new Map<string, YearWeekClass>();\n private yearMonthCache = new Map<string, YearMonthClass>();\n private yearCache = new Map<string, YearClass>();\n\n private constructor() {}\n\n getYearMonthDay(s: string): YearMonthDayClass {\n if (!this.yearMonthDayCache.has(s)) {\n this.yearMonthDayCache.set(s, YearMonthDayClass.parse(s, this));\n }\n return this.yearMonthDayCache.get(s)!;\n }\n\n getYearMonth(s: string): YearMonthClass {\n if (!this.yearMonthCache.has(s)) {\n this.yearMonthCache.set(s, YearMonthClass.parse(s, this));\n }\n return this.yearMonthCache.get(s)!;\n }\n\n getYearWeek(s: string): YearWeekClass {\n if (!this.yearWeekCache.has(s)) {\n this.yearWeekCache.set(s, YearWeekClass.parse(s, this));\n }\n return this.yearWeekCache.get(s)!;\n }\n\n getYear(s: string): YearClass {\n if (!this.yearCache.has(s)) {\n this.yearCache.set(s, YearClass.parse(s, this));\n }\n return this.yearCache.get(s)!;\n }\n\n private static instance = new TemporalCache();\n\n static getInstance(): TemporalCache {\n return this.instance;\n }\n}\n\ninterface YearMonthDay {\n type: 'YearMonthDay';\n yearNumber: number;\n monthNumber: number;\n dayNumber: number;\n dateString: string;\n}\n\nexport class YearMonthDayClass implements YearMonthDay {\n readonly type = 'YearMonthDay';\n readonly date;\n readonly dayjs;\n readonly dateString;\n\n constructor(\n readonly yearNumber: number,\n readonly monthNumber: number,\n readonly dayNumber: number,\n readonly cache: TemporalCache,\n ) {\n this.date = new Date(this.yearNumber, this.monthNumber - 1, this.dayNumber);\n this.dayjs = dayjs(this.date);\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.dayjs.format('YYYY-MM-DD');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return this.dayjs.format('dddd, MMMM D, YYYY');\n }\n\n get firstDay(): YearMonthDayClass {\n return this;\n }\n\n get lastDay(): YearMonthDayClass {\n return this;\n }\n\n get year(): YearClass {\n return this.cache.getYear(`${this.yearNumber}`);\n }\n\n get month(): YearMonthClass {\n return this.cache.getYearMonth(this.dayjs.format('YYYY-MM'));\n }\n\n get week(): YearWeekClass {\n return this.cache.getYearWeek(this.dayjs.format(FORMAT_ISO_WEEK_YEAR_WEEK));\n }\n\n addDays(days: number): YearMonthDayClass {\n const date = this.dayjs.add(days, 'day');\n const s = date.format('YYYY-MM-DD');\n return this.cache.getYearMonthDay(s);\n }\n\n minus(other: YearMonthDayClass): number {\n return this.dayjs.diff(other.dayjs, 'day');\n }\n\n static parse(s: string, cache: TemporalCache): YearMonthDayClass {\n const [year, month, day] = s.split('-').map((s) => parseInt(s, 10));\n return new YearMonthDayClass(year, month, day, cache);\n }\n}\n\ninterface YearWeek {\n type: 'YearWeek';\n isoYearNumber: number;\n isoWeekNumber: number;\n dateString: string;\n}\n\nexport class YearWeekClass implements YearWeek {\n readonly type = 'YearWeek';\n readonly dateString;\n\n constructor(\n readonly isoYearNumber: number,\n readonly isoWeekNumber: number,\n readonly cache: TemporalCache,\n ) {\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.firstDay.dayjs.format(FORMAT_ISO_WEEK_YEAR_WEEK);\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return `Week ${this.isoWeekNumber}, ${this.isoYearNumber}`;\n }\n\n get firstDay(): YearMonthDayClass {\n // \"The first week of the year, hence, always contains 4 January.\" https://en.wikipedia.org/wiki/ISO_week_date\n const firstDay = dayjs()\n .year(this.isoYearNumber)\n .month(1)\n .date(4)\n .isoWeek(this.isoWeekNumber)\n .startOf('isoWeek');\n return this.cache.getYearMonthDay(firstDay.format('YYYY-MM-DD'));\n }\n\n get lastDay(): YearMonthDayClass {\n const firstDay = dayjs()\n .year(this.isoYearNumber)\n .startOf('year')\n .add((this.isoWeekNumber - 1) * 7, 'day')\n .startOf('week')\n .add(1, 'day');\n const lastDay = firstDay.add(6, 'day');\n\n return this.cache.getYearMonthDay(lastDay.format('YYYY-MM-DD'));\n }\n\n get year(): YearClass {\n return this.cache.getYear(`${this.isoYearNumber}`);\n }\n\n addWeeks(weeks: number): YearWeekClass {\n const date = this.firstDay.dayjs.add(weeks, 'week');\n const s = date.format(FORMAT_ISO_WEEK_YEAR_WEEK);\n return this.cache.getYearWeek(s);\n }\n\n minus(other: YearWeekClass): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'week');\n }\n\n static parse(s: string, cache: TemporalCache): YearWeekClass {\n const [year, week] = s.split('-W').map((s) => parseInt(s, 10));\n return new YearWeekClass(year, week, cache);\n }\n}\n\ninterface YearMonth {\n type: 'YearMonth';\n yearNumber: number;\n monthNumber: number;\n dateString: string;\n}\n\nexport class YearMonthClass implements YearMonth {\n readonly type = 'YearMonth';\n readonly dateString;\n\n constructor(\n readonly yearNumber: number,\n readonly monthNumber: number,\n readonly cache: TemporalCache,\n ) {\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.firstDay.dayjs.format('YYYY-MM');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return `${monthName(this.monthNumber)} ${this.yearNumber}`;\n }\n\n get firstDay(): YearMonthDayClass {\n return this.cache.getYearMonthDay(dayjs(`${this.yearNumber}-${this.monthNumber}-01`).format('YYYY-MM-DD'));\n }\n\n get lastDay(): YearMonthDayClass {\n return this.cache.getYearMonthDay(\n dayjs(`${this.yearNumber}-${this.monthNumber}-01`).endOf('month').format('YYYY-MM-DD'),\n );\n }\n\n get year(): YearClass {\n return this.cache.getYear(`${this.yearNumber}`);\n }\n\n addMonths(months: number): YearMonthClass {\n const date = this.firstDay.dayjs.add(months, 'month');\n const s = date.format('YYYY-MM');\n return this.cache.getYearMonth(s);\n }\n\n minus(other: YearMonthClass): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'month');\n }\n\n static parse(s: string, cache: TemporalCache): YearMonthClass {\n const [year, month] = s.split('-').map((s) => parseInt(s, 10));\n return new YearMonthClass(year, month, cache);\n }\n}\n\ninterface Year {\n type: 'Year';\n year: number;\n dateString: string;\n}\n\nexport class YearClass implements Year {\n readonly type = 'Year';\n readonly dateString;\n\n constructor(\n readonly year: number,\n readonly cache: TemporalCache,\n ) {\n this.dateString = this.toString();\n }\n\n get text(): string {\n return this.firstDay.dayjs.format('YYYY');\n }\n\n toString(): string {\n return this.text;\n }\n\n englishName(): string {\n return this.year.toString();\n }\n\n get firstMonth(): YearMonthClass {\n return this.cache.getYearMonth(`${this.year}-01`);\n }\n\n get lastMonth(): YearMonthClass {\n return this.cache.getYearMonth(`${this.year}-12`);\n }\n\n get firstDay(): YearMonthDayClass {\n return this.firstMonth.firstDay;\n }\n\n get lastDay(): YearMonthDayClass {\n return this.lastMonth.lastDay;\n }\n\n addYears(years: number): YearClass {\n const date = this.firstDay.dayjs.add(years, 'year');\n const s = date.format('YYYY');\n return this.cache.getYear(s);\n }\n\n minus(other: YearClass): number {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, 'year');\n }\n\n static parse(s: string, cache: TemporalCache): YearClass {\n const year = parseInt(s, 10);\n return new YearClass(year, cache);\n }\n}\n\nfunction monthName(month: number): string {\n return dayjs()\n .month(month - 1)\n .format('MMMM');\n}\n\nexport type TemporalClass = YearMonthDayClass | YearWeekClass | YearMonthClass | YearClass;\nexport type Temporal = YearMonthDay | YearWeek | YearMonth | Year;\n\nexport function toTemporalClass(temporal: Temporal) {\n switch (temporal.type) {\n case 'YearMonthDay':\n return new YearMonthDayClass(\n temporal.yearNumber,\n temporal.monthNumber,\n temporal.dayNumber,\n TemporalCache.getInstance(),\n );\n case 'YearWeek':\n return new YearWeekClass(temporal.isoYearNumber, temporal.isoWeekNumber, TemporalCache.getInstance());\n case 'YearMonth':\n return new YearMonthClass(temporal.yearNumber, temporal.monthNumber, TemporalCache.getInstance());\n case 'Year':\n return new YearClass(temporal.year, TemporalCache.getInstance());\n }\n}\n\nexport function toTemporal(temporalClass: TemporalClass): Temporal {\n switch (temporalClass.type) {\n case 'YearMonthDay':\n return {\n type: 'YearMonthDay',\n yearNumber: temporalClass.yearNumber,\n monthNumber: temporalClass.monthNumber,\n dayNumber: temporalClass.dayNumber,\n dateString: temporalClass.dateString,\n };\n case 'YearWeek':\n return {\n type: 'YearWeek',\n isoYearNumber: temporalClass.isoYearNumber,\n isoWeekNumber: temporalClass.isoWeekNumber,\n dateString: temporalClass.dateString,\n };\n case 'YearMonth':\n return {\n type: 'YearMonth',\n yearNumber: temporalClass.yearNumber,\n monthNumber: temporalClass.monthNumber,\n dateString: temporalClass.dateString,\n };\n case 'Year':\n return {\n type: 'Year',\n year: temporalClass.year,\n dateString: temporalClass.dateString,\n };\n }\n}\n\nexport function generateAllDaysInRange(start: YearMonthDayClass, end: YearMonthDayClass): YearMonthDayClass[] {\n const days = [];\n const daysInBetween = end.minus(start);\n for (let i = 0; i <= daysInBetween; i++) {\n days.push(start.addDays(i));\n }\n return days;\n}\n\nexport function generateAllWeeksInRange(start: YearWeekClass, end: YearWeekClass): YearWeekClass[] {\n const weeks = [];\n const weeksInBetween = end.minus(start);\n for (let i = 0; i <= weeksInBetween; i++) {\n weeks.push(start.addWeeks(i));\n }\n return weeks;\n}\n\nexport function generateAllMonthsInRange(start: YearMonthClass, end: YearMonthClass): YearMonthClass[] {\n const months = [];\n const monthsInBetween = end.minus(start);\n for (let i = 0; i <= monthsInBetween; i++) {\n months.push(start.addMonths(i));\n }\n return months;\n}\n\nexport function generateAllYearsInRange(start: YearClass, end: YearClass): YearClass[] {\n const years = [];\n const yearsInBetween = end.minus(start);\n for (let i = 0; i <= yearsInBetween; i++) {\n years.push(start.addYears(i));\n }\n return years;\n}\n\nexport function generateAllInRange(start: TemporalClass | null, end: TemporalClass | null): TemporalClass[] {\n if (start === null || end === null) {\n return [];\n }\n if (start instanceof YearMonthDayClass && end instanceof YearMonthDayClass) {\n return generateAllDaysInRange(start, end);\n }\n if (start instanceof YearWeekClass && end instanceof YearWeekClass) {\n return generateAllWeeksInRange(start, end);\n }\n if (start instanceof YearMonthClass && end instanceof YearMonthClass) {\n return generateAllMonthsInRange(start, end);\n }\n if (start instanceof YearClass && end instanceof YearClass) {\n return generateAllYearsInRange(start, end);\n }\n throw new Error(`Invalid arguments: start and end must be of the same type: ${start}, ${end}`);\n}\n\nexport function minusTemporal(a: TemporalClass, b: TemporalClass): number {\n if (a instanceof YearMonthDayClass && b instanceof YearMonthDayClass) {\n return a.minus(b);\n }\n if (a instanceof YearWeekClass && b instanceof YearWeekClass) {\n return a.minus(b);\n }\n if (a instanceof YearMonthClass && b instanceof YearMonthClass) {\n return a.minus(b);\n }\n if (a instanceof YearClass && b instanceof YearClass) {\n return a.minus(b);\n }\n throw new Error(`Cannot compare ${a} and ${b}`);\n}\n\nexport function compareTemporal(a: TemporalClass | null, b: TemporalClass | null): number {\n if (a === null) {\n return 1;\n }\n if (b === null) {\n return -1;\n }\n const diff = minusTemporal(a, b);\n if (diff < 0) {\n return -1;\n }\n if (diff > 0) {\n return 1;\n }\n return 0;\n}\n\nexport function getMinMaxTemporal<T extends TemporalClass>(values: Iterable<T | null>) {\n let min: T | null = null;\n let max: T | null = null;\n for (const value of values) {\n if (value === null) {\n continue;\n }\n if (min === null || compareTemporal(value, min) < 0) {\n min = value;\n }\n if (max === null || compareTemporal(value, max) > 0) {\n max = value;\n }\n }\n if (min === null || max === null) {\n return { min: null, max: null };\n }\n return { min, max };\n}\n\nexport function addUnit(temporal: TemporalClass, amount: number): TemporalClass {\n if (temporal instanceof YearMonthDayClass) {\n return temporal.addDays(amount);\n }\n if (temporal instanceof YearWeekClass) {\n return temporal.addWeeks(amount);\n }\n if (temporal instanceof YearMonthClass) {\n return temporal.addMonths(amount);\n }\n if (temporal instanceof YearClass) {\n return temporal.addYears(amount);\n }\n throw new Error(`Invalid argument: ${temporal}`);\n}\n\nexport function parseDateStringToTemporal(date: string, granularity: TemporalGranularity) {\n const cache = TemporalCache.getInstance();\n const day = cache.getYearMonthDay(date);\n switch (granularity) {\n case 'day':\n return day;\n case 'week':\n return day.week;\n case 'month':\n return day.month;\n case 'year':\n return day.year;\n }\n}\n\nexport function dateRangeCompare(a: { dateRange: TemporalClass | null }, b: { dateRange: TemporalClass | null }) {\n if (a.dateRange === null) {\n return 1;\n }\n if (b.dateRange === null) {\n return -1;\n }\n return compareTemporal(a.dateRange, b.dateRange);\n}\n","import { type LapisFilter } from '../types';\n\nexport function getMinMaxNumber(values: Iterable<number>): [number, number] | null {\n let min = null;\n let max = null;\n for (const value of values) {\n if (min === null || value < min) {\n min = value;\n }\n if (max === null || value > max) {\n max = value;\n }\n }\n if (min === null || max === null) {\n return null;\n }\n return [min, max];\n}\n\nexport function mapLapisFilterToUrlParams(filter: LapisFilter): URLSearchParams {\n const params = Object.entries(filter).map(([key, value]) => [key, stringifyLapisFilterValue(value)]);\n\n return new URLSearchParams(params);\n}\n\nfunction stringifyLapisFilterValue(value: LapisFilter[string]) {\n if (value === null) {\n return 'null';\n }\n switch (typeof value) {\n case 'boolean':\n return value ? 'true' : 'false';\n case 'number':\n return value.toString();\n case 'string':\n return value;\n }\n}\n\nexport function makeArray<T>(arrayOrSingleItem: T | T[]) {\n if (Array.isArray(arrayOrSingleItem)) {\n return arrayOrSingleItem;\n }\n return [arrayOrSingleItem];\n}\n","import { Chart, type ChartConfiguration, registerables } from 'chart.js';\n\nimport { maxInData } from './prevalence-over-time';\nimport { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { addUnit, minusTemporal } from '../../utils/temporalClass';\nimport { getMinMaxNumber } from '../../utils/utils';\nimport GsChart from '../components/chart';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeBubbleChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst PrevalenceOverTimeBubbleChart = ({\n data,\n yAxisScaleType,\n yAxisMaxConfig,\n}: PrevalenceOverTimeBubbleChartProps) => {\n const nonNullDateRangeData = data\n .filter((prevalenceOverTimeData) => prevalenceOverTimeData.content.length > 0)\n .map((variantData) => {\n return {\n content: variantData.content.filter((dataPoint) => dataPoint.dateRange !== null),\n displayName: variantData.displayName,\n };\n });\n\n if (nonNullDateRangeData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const firstDate = nonNullDateRangeData[0].content[0].dateRange!;\n const total = nonNullDateRangeData.map((graphData) => graphData.content.map((dataPoint) => dataPoint.total)).flat();\n const [minTotal, maxTotal] = getMinMaxNumber(total)!;\n const scaleBubble = (value: number) => {\n return ((value - minTotal) / (maxTotal - minTotal)) * 4.5 + 0.5;\n };\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nonNullDateRangeData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'bubble',\n data: {\n datasets: nonNullDateRangeData.map((graphData, index) => ({\n label: graphData.displayName,\n data: graphData.content\n .filter((dataPoint) => dataPoint.dateRange !== null)\n .map((dataPoint) => ({\n x: minusTemporal(dataPoint.dateRange!, firstDate),\n y: dataPoint.prevalence,\n r: scaleBubble(dataPoint.total),\n })),\n borderWidth: 1,\n pointRadius: 0,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n })),\n },\n options: {\n animation: false,\n maintainAspectRatio: false,\n scales: {\n x: {\n ticks: {\n callback: (value) => addUnit(firstDate, value as number).toString(),\n },\n },\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n callbacks: {\n title: (context) => {\n const dataset = nonNullDateRangeData[context[0].datasetIndex!];\n const dataPoint = dataset.content[context[0].dataIndex!];\n return dataPoint.dateRange?.toString();\n },\n label: (context) => {\n const dataset = nonNullDateRangeData[context.datasetIndex!];\n const dataPoint = dataset.content[context.dataIndex!];\n\n const percentage = (dataPoint.prevalence * 100).toFixed(2);\n const count = dataPoint.count.toFixed(0);\n const total = dataPoint.total.toFixed(0);\n\n return `${dataset.displayName}: ${percentage}%, ${count}/${total} samples`;\n },\n },\n },\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nexport default PrevalenceOverTimeBubbleChart;\n","import { Chart, type ChartConfiguration, registerables } from 'chart.js';\nimport { type TooltipItem } from 'chart.js/dist/types';\n\nimport { maxInData } from './prevalence-over-time';\nimport { type PrevalenceOverTimeData, type PrevalenceOverTimeVariantData } from '../../query/queryPrevalenceOverTime';\nimport GsChart from '../components/chart';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport {\n confidenceIntervalDataLabel,\n type ConfidenceIntervalMethod,\n wilson95PercentConfidenceInterval,\n} from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface PrevalenceOverTimeLineChartProps {\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst PrevalenceOverTimeLineChart = ({\n data,\n yAxisScaleType,\n confidenceIntervalMethod,\n yAxisMaxConfig,\n}: PrevalenceOverTimeLineChartProps) => {\n const nonNullDateRangeData = data\n .filter((prevalenceOverTimeData) => prevalenceOverTimeData.content.length > 0)\n .map((variantData) => {\n return {\n content: variantData.content.filter((dataPoint) => dataPoint.dateRange !== null),\n displayName: variantData.displayName,\n };\n });\n\n if (nonNullDateRangeData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const datasets = nonNullDateRangeData\n .map((graphData, index) => getDataset(graphData, index, confidenceIntervalMethod))\n .flat();\n\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(maxInData(nonNullDateRangeData), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'line',\n data: {\n datasets,\n },\n options: {\n animation: false,\n maintainAspectRatio: false,\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(confidenceIntervalMethod),\n },\n },\n };\n\n return <GsChart configuration={config} />;\n};\n\nconst getDataset = (\n prevalenceOverTimeVariant: PrevalenceOverTimeVariantData,\n dataIndex: number,\n confidenceIntervalMethod: ConfidenceIntervalMethod,\n) => {\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return [\n getDatasetCIUpper(prevalenceOverTimeVariant, dataIndex),\n getDatasetLine(prevalenceOverTimeVariant, dataIndex),\n getDatasetCILower(prevalenceOverTimeVariant, dataIndex),\n ].flat();\n default:\n return getDatasetLine(prevalenceOverTimeVariant, dataIndex);\n }\n};\n\nconst getDatasetCIUpper = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: `${prevalenceOverTimeVariant.displayName} CI upper`,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n return {\n y: wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total).upperLimit,\n x: dataPoint.dateRange?.toString(),\n };\n }),\n borderWidth: 0,\n pointRadius: 0,\n fill: '+1',\n backgroundColor: singleGraphColorRGBAById(dataIndex, 0.3),\n});\n\nconst getDatasetCILower = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: `${prevalenceOverTimeVariant.displayName} CI lower`,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n return {\n y: wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total).lowerLimit,\n x: dataPoint.dateRange?.toString(),\n };\n }),\n borderWidth: 0,\n pointRadius: 0,\n fill: '-1',\n backgroundColor: singleGraphColorRGBAById(dataIndex, 0.3),\n});\n\nconst getDatasetLine = (prevalenceOverTimeVariant: PrevalenceOverTimeVariantData, dataIndex: number) => ({\n label: prevalenceOverTimeVariant.displayName,\n data: prevalenceOverTimeVariant.content.map((dataPoint): Datapoint => {\n const ciLimits = wilson95PercentConfidenceInterval(dataPoint.count, dataPoint.total);\n\n return {\n y: dataPoint.prevalence,\n x: dataPoint.dateRange?.toString(),\n yCiUpper: ciLimits.upperLimit,\n yCiLower: ciLimits.lowerLimit,\n };\n }),\n borderWidth: 1,\n pointRadius: 0,\n borderColor: singleGraphColorRGBAById(dataIndex),\n backgroundColor: singleGraphColorRGBAById(dataIndex),\n});\n\ninterface Datapoint {\n y: number;\n yCiLower?: number;\n yCiUpper?: number;\n x?: string;\n}\n\nconst tooltip = (confidenceIntervalMethod?: ConfidenceIntervalMethod) => {\n const generalConfig = {\n mode: 'index' as const,\n intersect: false,\n };\n\n switch (confidenceIntervalMethod) {\n case 'wilson':\n return {\n ...generalConfig,\n filter: ({ datasetIndex }: TooltipItem<'line'>) => {\n return isNotCiIndex(datasetIndex);\n },\n callbacks: {\n label: (context: TooltipItem<'line'>) => {\n const dataPoint = context.dataset.data[context.dataIndex] as unknown as Datapoint;\n\n return confidenceIntervalDataLabel(\n dataPoint.y,\n dataPoint.yCiLower,\n dataPoint.yCiUpper,\n context.dataset.label,\n );\n },\n },\n };\n default:\n return generalConfig;\n }\n};\n\nfunction isNotCiIndex(datasetIndex: number) {\n return datasetIndex % 3 === 1;\n}\n\nexport default PrevalenceOverTimeLineChart;\n","import { getPrevalenceOverTimeTableData } from './getPrevalenceOverTimeTableData';\nimport { type PrevalenceOverTimeData } from '../../query/queryPrevalenceOverTime';\nimport { type TemporalGranularity } from '../../types';\nimport { Table } from '../components/table';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface PrevalenceOverTimeTableProps {\n data: PrevalenceOverTimeData;\n granularity: TemporalGranularity;\n pageSize: boolean | number;\n}\n\nconst PrevalenceOverTimeTable = ({ data, granularity, pageSize }: PrevalenceOverTimeTableProps) => {\n const getSplitColumns = (data: PrevalenceOverTimeData) => {\n return data.map((dataset) => ({\n name: dataset.displayName,\n columns: [\n {\n name: 'prevalence',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n {\n name: 'count',\n sort: true,\n },\n ],\n }));\n };\n\n const getColumns = (data: PrevalenceOverTimeData) => [\n {\n name: granularity,\n sort: true,\n },\n ...getSplitColumns(data),\n ];\n\n const getData = (data: PrevalenceOverTimeData, granularity: TemporalGranularity) => {\n const dataByHeader = getPrevalenceOverTimeTableData(data, granularity);\n return Object.values(dataByHeader).map((row) => Object.values(row));\n };\n\n return <Table data={getData(data, granularity)} columns={getColumns(data)} pageSize={pageSize} />;\n};\n\nexport default PrevalenceOverTimeTable;\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { fetchAggregated } from '../lapisApi/lapisApi';\nimport { type AggregatedItem } from '../lapisApi/lapisTypes';\nimport { type LapisFilter } from '../types';\n\nexport class FetchAggregatedOperator<Fields extends Record<string, unknown>>\n implements Operator<Fields & { count: number }>\n{\n constructor(\n private filter: LapisFilter,\n private fields: string[] = [],\n ) {}\n\n async evaluate(lapisUrl: string, signal?: AbortSignal): Promise<Dataset<Fields & { count: number }>> {\n const aggregatedResponse = (\n await fetchAggregated(\n lapisUrl,\n {\n ...this.filter,\n fields: this.fields,\n },\n signal,\n )\n ).data;\n\n if (isFieldsArrayWithCount<Fields & { count: number }>(aggregatedResponse)) {\n return {\n content: aggregatedResponse,\n };\n }\n\n throw new Error('Aggregated response does not have count');\n }\n}\n\nfunction isFieldsArrayWithCount<T>(data: AggregatedItem[]): data is (T & { count: number })[] {\n return data.every((item) => typeof item === 'object' && 'count' in item && typeof item.count === 'number');\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class FillMissingOperator<Data, KeyToFill extends keyof Data> implements Operator<Data> {\n constructor(\n private child: Operator<Data>,\n private keyField: KeyToFill,\n private getMinMaxFn: (\n values: Iterable<Data[KeyToFill]>,\n ) => { min: Data[KeyToFill]; max: Data[KeyToFill] } | null,\n private getAllRequiredKeysFn: (min: Data[KeyToFill], max: Data[KeyToFill]) => Data[KeyToFill][],\n private defaultValueFn: (key: Data[KeyToFill]) => Data,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<Data>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const existingKeys = new Set(childEvaluated.content.map((row) => row[this.keyField]));\n const minMax = this.getMinMaxFn(existingKeys);\n if (minMax === null) {\n return childEvaluated;\n }\n const { min, max } = minMax;\n const requiredKeys = this.getAllRequiredKeysFn(min, max);\n const content = childEvaluated.content;\n for (const key of requiredKeys) {\n if (!existingKeys.has(key)) {\n content.push(this.defaultValueFn(key));\n }\n }\n return { content };\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class GroupByOperator<Data, AggregationResult, KeyToGroupBy extends keyof Data>\n implements Operator<AggregationResult>\n{\n constructor(\n private child: Operator<Data>,\n private field: KeyToGroupBy,\n private aggregate: (values: Data[]) => AggregationResult,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<AggregationResult>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const grouped = new Map<Data[KeyToGroupBy], Data[]>();\n for (const row of childEvaluated.content) {\n const key = row[this.field];\n if (!grouped.has(key)) {\n grouped.set(key, []);\n }\n grouped.get(key)!.push(row);\n }\n const result = new Array<AggregationResult>();\n for (const [, values] of grouped) {\n result.push(this.aggregate(values));\n }\n\n return {\n content: result,\n };\n }\n}\n","import { GroupByOperator } from './GroupByOperator';\nimport { type Operator } from './Operator';\nimport { type NumberFields } from '../utils/type-utils';\n\ntype Result<Data, KeyToGroupBy extends keyof Data, KeyToSumBy extends keyof Data> = {\n [P in KeyToGroupBy | KeyToSumBy]: P extends KeyToGroupBy ? Data[KeyToGroupBy] : number;\n};\n\nexport class GroupByAndSumOperator<\n Data,\n KeyToGroupBy extends keyof Data,\n KeySoSumBy extends NumberFields<Data>,\n> extends GroupByOperator<Data, Result<Data, KeyToGroupBy, KeySoSumBy>, KeyToGroupBy> {\n constructor(child: Operator<Data>, groupByField: KeyToGroupBy, sumField: KeySoSumBy) {\n super(child, groupByField, (values: Data[]) => {\n let n = 0;\n for (const value of values) {\n n += value[sumField] as number;\n }\n return {\n [groupByField]: values[0][groupByField],\n [sumField]: n,\n } as Result<Data, KeyToGroupBy, KeySoSumBy>;\n });\n }\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\n\nexport class MapOperator<S, T> implements Operator<T> {\n constructor(\n private child: Operator<S>,\n private func: (value: S) => T,\n ) {}\n\n async evaluate(lapis: string, signal?: AbortSignal): Promise<Dataset<T>> {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n return {\n content: childEvaluated.content.map(this.func),\n };\n }\n}\n","import { MapOperator } from './MapOperator';\nimport type { Operator } from './Operator';\n\nexport class RenameFieldOperator<\n OldFieldName extends string,\n NewFieldName extends string,\n Data extends { [key in OldFieldName]: unknown },\n> extends MapOperator<Data, Data & { [key in NewFieldName]: Data[OldFieldName] }> {\n constructor(child: Operator<Data>, oldFieldName: OldFieldName, newFieldName: NewFieldName) {\n super(\n child,\n (value) =>\n ({\n ...value,\n [newFieldName]: value[oldFieldName],\n }) as Data & { [key in NewFieldName]: Data[OldFieldName] },\n );\n }\n}\n","import { type Operator } from './Operator';\n\nexport class SlidingOperator<Data, AggregationResult> implements Operator<AggregationResult> {\n constructor(\n private child: Operator<Data>,\n private windowSize: number,\n private aggregate: (values: Data[]) => AggregationResult,\n ) {\n if (windowSize < 1) {\n throw new Error('Window size must be at least 1');\n }\n }\n\n async evaluate(lapis: string, signal?: AbortSignal) {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const content = new Array<AggregationResult>();\n if (childEvaluated.content.length === 0) {\n return { content };\n }\n const numberOfWindows = Math.max(childEvaluated.content.length - this.windowSize, 0) + 1;\n for (let i = 0; i < numberOfWindows; i++) {\n content.push(this.aggregate(childEvaluated.content.slice(i, i + this.windowSize)));\n }\n return { content };\n }\n}\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { FillMissingOperator } from '../operator/FillMissingOperator';\nimport { GroupByAndSumOperator } from '../operator/GroupByAndSumOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { SlidingOperator } from '../operator/SlidingOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport type { LapisFilter, TemporalGranularity } from '../types';\nimport {\n dateRangeCompare,\n generateAllInRange,\n getMinMaxTemporal,\n parseDateStringToTemporal,\n type TemporalClass,\n} from '../utils/temporalClass';\n\nexport function queryAggregatedDataOverTime<LapisDateField extends string>(\n filter: LapisFilter,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n lapisDateField: LapisDateField,\n) {\n const fetchData = new FetchAggregatedOperator<{ [key in LapisDateField]: string | null }>(filter, [lapisDateField]);\n const dataWithFixedDateKey = new RenameFieldOperator(fetchData, lapisDateField, 'date');\n const mapData = new MapOperator(dataWithFixedDateKey, (d) => mapDateToGranularityRange(d, granularity));\n const groupByData = new GroupByAndSumOperator(mapData, 'dateRange', 'count');\n const fillData = new FillMissingOperator(\n groupByData,\n 'dateRange',\n getMinMaxTemporal,\n generateAllInRange,\n (key) => ({ dateRange: key, count: 0 }),\n );\n const sortData = new SortOperator(fillData, dateRangeCompare);\n\n return smoothingWindow >= 1 ? new SlidingOperator(sortData, smoothingWindow, averageSmoothing) : sortData;\n}\n\nexport function mapDateToGranularityRange(\n data: { date: string | null; count: number },\n granularity: TemporalGranularity,\n) {\n return {\n dateRange: data.date === null ? null : parseDateStringToTemporal(data.date, granularity),\n count: data.count,\n };\n}\n\nfunction averageSmoothing(slidingWindow: { dateRange: TemporalClass | null; count: number }[]) {\n const average = slidingWindow.reduce((acc, curr) => acc + curr.count, 0) / slidingWindow.length;\n const centerIndex = Math.floor(slidingWindow.length / 2);\n return { dateRange: slidingWindow[centerIndex].dateRange, count: average };\n}\n","import { type Dataset } from './Dataset';\nimport { type Operator } from './Operator';\nimport { type MappedNumber, type NumberFields } from '../utils/type-utils';\n\nexport type DivisionOperatorResult<\n KeyField extends keyof ValueObject,\n ValueObject,\n ResultField extends string,\n NumeratorField extends string,\n DenominatorField extends string,\n> = { [P in KeyField]: ValueObject[KeyField] } & MappedNumber<ResultField> &\n MappedNumber<NumeratorField> &\n MappedNumber<DenominatorField>;\n\nexport class DivisionOperator<\n ValueObject,\n KeyField extends keyof ValueObject,\n ValueField extends NumberFields<ValueObject>,\n ResultField extends string,\n NumeratorField extends string,\n DenominatorField extends string,\n> implements Operator<DivisionOperatorResult<KeyField, ValueObject, ResultField, NumeratorField, DenominatorField>>\n{\n constructor(\n private numerator: Operator<ValueObject>,\n private denominator: Operator<ValueObject>,\n private keyField: KeyField,\n private valueField: ValueField,\n private resultField: ResultField,\n private numeratorField: NumeratorField,\n private denominatorField: DenominatorField,\n ) {}\n\n async evaluate(\n lapis: string,\n signal?: AbortSignal,\n ): Promise<Dataset<DivisionOperatorResult<KeyField, ValueObject, ResultField, NumeratorField, DenominatorField>>> {\n const numeratorEvaluated = await this.numerator.evaluate(lapis, signal);\n const denominatorEvaluated = await this.denominator.evaluate(lapis, signal);\n\n const numeratorMap = new Map<ValueObject[KeyField], ValueObject[ValueField]>();\n numeratorEvaluated.content.forEach((row) => {\n numeratorMap.set(row[this.keyField], row[this.valueField]);\n });\n\n const content = denominatorEvaluated.content.map((row) => {\n const numeratorValue = numeratorMap.get(row[this.keyField]) ?? 0;\n return {\n [this.keyField]: row[this.keyField],\n [this.numeratorField]: numeratorValue as number,\n [this.denominatorField]: row[this.valueField] as number,\n [this.resultField]: (numeratorValue as number) / (row[this.valueField] as number),\n } as { [P in KeyField]: ValueObject[KeyField] } & MappedNumber<ResultField> &\n MappedNumber<NumeratorField> &\n MappedNumber<DenominatorField>;\n });\n\n return { content };\n }\n}\n","import { queryAggregatedDataOverTime } from './queryAggregatedDataOverTime';\nimport { DivisionOperator } from '../operator/DivisionOperator';\nimport { type LapisFilter, type NamedLapisFilter, type TemporalGranularity } from '../types';\nimport { type TemporalClass } from '../utils/temporalClass';\nimport { makeArray } from '../utils/utils';\n\nexport type PrevalenceOverTimeData = PrevalenceOverTimeVariantData[];\n\nexport type PrevalenceOverTimeVariantData = {\n displayName: string;\n content: PrevalenceOverTimeVariantDataPoint[];\n};\n\nexport type PrevalenceOverTimeVariantDataPoint = {\n count: number;\n prevalence: number;\n total: number;\n dateRange: TemporalClass | null;\n};\n\nexport function queryPrevalenceOverTime(\n numeratorFilter: NamedLapisFilter | NamedLapisFilter[],\n denominatorFilter: LapisFilter,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n lapis: string,\n lapisDateField: string,\n signal?: AbortSignal,\n): Promise<PrevalenceOverTimeData> {\n const numeratorFilters = makeArray(numeratorFilter);\n\n const denominatorData = queryAggregatedDataOverTime(\n denominatorFilter,\n granularity,\n smoothingWindow,\n lapisDateField,\n );\n const subQueries = numeratorFilters.map(async (namedLapisFilter) => {\n const { displayName, lapisFilter } = namedLapisFilter;\n const numeratorData = queryAggregatedDataOverTime(lapisFilter, granularity, smoothingWindow, lapisDateField);\n const divide = new DivisionOperator(\n numeratorData,\n denominatorData,\n 'dateRange',\n 'count',\n 'prevalence',\n 'count',\n 'total',\n );\n const dataset = await divide.evaluate(lapis, signal);\n return {\n displayName,\n content: dataset.content,\n };\n });\n return Promise.all(subQueries);\n}\n","import { type FunctionComponent } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nexport interface SelectProps {\n items: { label: string; value: string; disabled?: boolean }[];\n selected: string;\n onChange: JSXInternal.GenericEventHandler<HTMLSelectElement>;\n selectStyle?: string;\n}\n\nexport const Select: FunctionComponent<SelectProps> = ({ items, selected, onChange, selectStyle }) => {\n return (\n <select class={`select select-bordered ${selectStyle}`} value={selected} onChange={onChange}>\n {items.map((item) => (\n <option key={item.value} value={item.value} disabled={item.disabled}>\n {item.label}\n </option>\n ))}\n </select>\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Select } from './select';\nimport type { ConfidenceIntervalMethod } from '../shared/charts/confideceInterval';\n\ntype ConfidenceIntervalSelectorProps = {\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n setConfidenceIntervalMethod: (method: ConfidenceIntervalMethod) => void;\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n};\n\nexport const ConfidenceIntervalSelector: FunctionComponent<ConfidenceIntervalSelectorProps> = ({\n confidenceIntervalMethod,\n setConfidenceIntervalMethod,\n confidenceIntervalMethods,\n}) => {\n if (confidenceIntervalMethods.length === 0) {\n return null;\n }\n\n const items = [\n { label: 'Confidence interval method', value: 'none', disabled: true },\n ...confidenceIntervalMethods.concat('none').map((method) => {\n switch (method) {\n case 'wilson':\n return { label: 'Wilson, 95% CI', value: 'wilson' };\n case 'none':\n return { label: 'None', value: 'none' };\n }\n }),\n ];\n\n return (\n <Select\n items={items}\n selected={confidenceIntervalMethod === undefined ? 'none' : confidenceIntervalMethod}\n onChange={(event: Event) => {\n const select = event.target as HTMLSelectElement;\n const value = select.value as ConfidenceIntervalMethod;\n setConfidenceIntervalMethod(value);\n }}\n selectStyle={'select-xs select-bordered'}\n />\n );\n};\n","import { type FunctionComponent } from 'preact';\n\nimport { Select } from './select';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\n\nexport type ScalingSelectorProps = {\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n className?: string;\n enabledTypes?: ScaleType[];\n};\n\nconst scaleTypeItem: { label: string; value: ScaleType }[] = [\n { label: 'Linear', value: 'linear' },\n { label: 'Logarithmic', value: 'logarithmic' },\n { label: 'Logit', value: 'logit' },\n];\n\nexport const ScalingSelector: FunctionComponent<ScalingSelectorProps> = ({\n yAxisScaleType,\n setYAxisScaleType,\n className,\n enabledTypes,\n}) => {\n const items = [\n { label: 'y axis scaling type', value: 'none', disabled: true },\n ...scaleTypeItem.filter((item) => enabledTypes === undefined || enabledTypes.includes(item.value)),\n ];\n\n return (\n <Select\n items={items}\n selected={yAxisScaleType}\n onChange={(event: Event) => {\n const select = event.target as HTMLSelectElement;\n const value = select.value as ScaleType;\n setYAxisScaleType(value);\n }}\n selectStyle={`${className} select-xs select-bordered`}\n />\n );\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport { getPrevalenceOverTimeTableData } from './getPrevalenceOverTimeTableData';\nimport PrevalenceOverTimeBarChart from './prevalence-over-time-bar-chart';\nimport PrevalenceOverTimeBubbleChart from './prevalence-over-time-bubble-chart';\nimport PrevalenceOverTimeLineChart from './prevalence-over-time-line-chart';\nimport PrevalenceOverTimeTable from './prevalence-over-time-table';\nimport { type PrevalenceOverTimeData, queryPrevalenceOverTime } from '../../query/queryPrevalenceOverTime';\nimport { type LapisFilter, type NamedLapisFilter, type TemporalGranularity } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ConfidenceIntervalSelector } from '../components/confidence-interval-selector';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoHeadline2, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport { type ConfidenceIntervalMethod } from '../shared/charts/confideceInterval';\nimport { type AxisMax } from '../shared/charts/getYAxisMax';\nimport { type ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'bar' | 'line' | 'bubble' | 'table';\n\nexport interface PrevalenceOverTimeProps {\n width: string;\n height: string;\n numeratorFilter: NamedLapisFilter | NamedLapisFilter[];\n denominatorFilter: LapisFilter;\n granularity: TemporalGranularity;\n smoothingWindow: number;\n views: View[];\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n lapisDateField: string;\n pageSize: boolean | number;\n yAxisMaxLinear: AxisMax;\n yAxisMaxLogarithmic: AxisMax;\n}\n\nexport const PrevalenceOverTime: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <PrevalenceOverTimeInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const PrevalenceOverTimeInner: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { numeratorFilter, denominatorFilter, granularity, smoothingWindow, lapisDateField } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(\n () =>\n queryPrevalenceOverTime(\n numeratorFilter,\n denominatorFilter,\n granularity,\n smoothingWindow,\n lapis,\n lapisDateField,\n ),\n [lapis, numeratorFilter, denominatorFilter, granularity, smoothingWindow, lapisDateField],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null || data.every((variant) => variant.content.length === 0)) {\n return <NoDataDisplay />;\n }\n\n return <PrevalenceOverTimeTabs data={data} {...componentProps} />;\n};\n\ntype PrevalenceOverTimeTabsProps = PrevalenceOverTimeProps & {\n data: PrevalenceOverTimeData;\n};\n\nconst PrevalenceOverTimeTabs: FunctionComponent<PrevalenceOverTimeTabsProps> = ({ data, ...componentProps }) => {\n const { views, granularity, confidenceIntervalMethods, pageSize, yAxisMaxLinear, yAxisMaxLogarithmic } =\n componentProps;\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n const [confidenceIntervalMethod, setConfidenceIntervalMethod] = useState<ConfidenceIntervalMethod>(\n confidenceIntervalMethods.length > 0 ? confidenceIntervalMethods[0] : 'none',\n );\n const yAxisMaxConfig = { linear: yAxisMaxLinear, logarithmic: yAxisMaxLogarithmic };\n\n const getTab = (view: View) => {\n switch (view) {\n case 'bar':\n return {\n title: 'Bar',\n content: (\n <PrevalenceOverTimeBarChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n confidenceIntervalMethod={confidenceIntervalMethod}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'line':\n return {\n title: 'Line',\n content: (\n <PrevalenceOverTimeLineChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n confidenceIntervalMethod={confidenceIntervalMethod}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'bubble':\n return {\n title: 'Bubble',\n content: (\n <PrevalenceOverTimeBubbleChart\n data={data}\n yAxisScaleType={yAxisScaleType}\n yAxisMaxConfig={yAxisMaxConfig}\n />\n ),\n };\n case 'table':\n return {\n title: 'Table',\n content: <PrevalenceOverTimeTable data={data} granularity={granularity} pageSize={pageSize} />,\n };\n }\n };\n\n const tabs = views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n data={data}\n confidenceIntervalMethod={confidenceIntervalMethod}\n setConfidenceIntervalMethod={setConfidenceIntervalMethod}\n {...componentProps}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = PrevalenceOverTimeProps & {\n activeTab: string;\n data: PrevalenceOverTimeData;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n confidenceIntervalMethods: ConfidenceIntervalMethod[];\n confidenceIntervalMethod: ConfidenceIntervalMethod;\n setConfidenceIntervalMethod: (confidenceIntervalMethod: ConfidenceIntervalMethod) => void;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n yAxisScaleType,\n setYAxisScaleType,\n confidenceIntervalMethod,\n setConfidenceIntervalMethod,\n data,\n ...componentProps\n}) => {\n const { confidenceIntervalMethods, granularity } = componentProps;\n return (\n <>\n {activeTab !== 'Table' && (\n <ScalingSelector yAxisScaleType={yAxisScaleType} setYAxisScaleType={setYAxisScaleType} />\n )}\n {(activeTab === 'Bar' || activeTab === 'Line') && (\n <ConfidenceIntervalSelector\n confidenceIntervalMethods={confidenceIntervalMethods}\n confidenceIntervalMethod={confidenceIntervalMethod}\n setConfidenceIntervalMethod={setConfidenceIntervalMethod}\n />\n )}\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getPrevalenceOverTimeTableData(data, granularity)}\n filename='prevalence_over_time.csv'\n />\n\n <PrevalenceOverTimeInfo {...componentProps} />\n <Fullscreen />\n </>\n );\n};\n\nconst PrevalenceOverTimeInfo: FunctionComponent<PrevalenceOverTimeProps> = (componentProps) => {\n const { granularity, smoothingWindow, views } = componentProps;\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Prevalence over time</InfoHeadline1>\n <InfoParagraph>\n This presents the proportion of one or more variants per <b>{granularity}</b>\n {smoothingWindow > 0 && `, smoothed using a ${smoothingWindow}-${granularity} sliding window`}. The\n proportion is calculated as the number of sequences of the variant(s) divided by the number of sequences\n that match the <code>denominatorFilter</code> (see below).\n </InfoParagraph>\n <InfoParagraph>\n Sequences that have no assigned date will not be shown in the line and bubble chart. They will show up\n in the bar and table view with date \"unknown\".\n </InfoParagraph>\n {views.includes('bubble') && (\n <>\n <InfoHeadline2>Bubble chart</InfoHeadline2>\n <InfoParagraph>\n The size of the bubble scales with the total number of available sequences from the{' '}\n {granularity}.\n </InfoParagraph>\n </>\n )}\n <InfoComponentCode componentName='prevalence-over-time' params={componentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n\nexport const maxInData = (data: PrevalenceOverTimeData) =>\n Math.max(...data.flatMap((variant) => variant.content.map((dataPoint) => dataPoint.prevalence)));\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { PrevalenceOverTime, type PrevalenceOverTimeProps } from '../../preact/prevalenceOverTime/prevalence-over-time';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays the prevalence over time of one or more datasets, selected by LAPIS filters.\n * The prevalence is calculated as the ratio of the number of cases of each dataset to the number of cases of a reference dataset.\n * The reference dataset is also selected by a LAPIS filter.\n *\n * In the chart views,\n * - the user can select whether to display a confidence interval (not available in the bubble chart).\n * The confidence interval is calculated using [Wilson score interval](https://en.wikipedia.org/wiki/Binomial_proportion_confidence_interval),\n * with a confidence level of 95%.\n * - the x-axis shows time steps in the selected `granularity`.\n * - the user can select the y-axis scale (linear, logistic, logit).\n *\n * ## Views\n *\n * ### Bar View\n *\n * Displays the prevalence over time as a bar chart.\n * Shows a bar for each dataset of the `numeratorFilter` on every time step.\n *\n * ### Line View\n *\n * Displays the prevalence over time as a line chart.\n * Each data point is connected for better visibility.\n * Shows a line for each dataset of the `numeratorFilter`.\n *\n * ### Bubble View\n *\n * Displays the prevalence over time as a bubble chart.\n * The size of the bubbles represents the number of cases of the reference, defined by the `denominatorFilter`.\n * The height of the bubbles represents the prevalence of the datasets selected by the `numeratorFilters`.\n *\n * ### Table View\n *\n * Displays the prevalence over time as a table with one row per time point.\n */\n@customElement('gs-prevalence-over-time')\nexport class PrevalenceOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * Required.\n * Either a LAPIS filter or an array of LAPIS filters to calculate the prevalence for.\n *\n * The `lapisFilter` will be sent as is to LAPIS to select the data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used as the label the prevalence in the views.\n * It should be human-readable.\n *\n */\n @property({type: Object})\n numeratorFilter:\n {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }\n | {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }[] = {displayName: '', lapisFilter: {}};\n\n /**\n * Required.\n *\n * The LAPIS filter, to select the data of the reference.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n denominatorFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'day';\n\n /**\n * The number of time steps to use for smoothing the data.\n * `0` means no smoothing.\n * Must be a non-negative integer.\n *\n * For a given time, the shown value is the mean of the neighbouring measured values.\n * The `smoothingWindow` value provides the number of neighbouring values to take into account.\n * The resulting time is computed via `Math.floor(smoothingWindow / 2)`.\n */\n @property({ type: Number })\n smoothingWindow: number = 0;\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('bar' | 'line' | 'bubble' | 'table')[] = ['bar', 'line', 'bubble', 'table'];\n\n /**\n * A list of methods to calculate the confidence interval.\n * The option `none` is always available and disables confidence intervals.\n * Pass an empty array to disable the confidence interval selector.\n */\n @property({ type: Array })\n confidenceIntervalMethods: ('wilson' | 'none')[] = ['wilson'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n /**\n * The maximum value for the y-axis on all graphs in linear view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLinear: 'maxInData' | 'limitTo1' | number = 1;\n\n /**\n * The maximum value for the y-axis on all graphs in logarithmic view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLogarithmic: 'maxInData' | 'limitTo1' | number = 1;\n\n override render() {\n return (\n <PrevalenceOverTime\n numeratorFilter={this.numeratorFilter}\n denominatorFilter={this.denominatorFilter}\n granularity={this.granularity}\n smoothingWindow={this.smoothingWindow}\n views={this.views}\n confidenceIntervalMethods={this.confidenceIntervalMethods}\n width={this.width}\n height={this.height}\n lapisDateField={this.lapisDateField}\n pageSize={this.pageSize}\n yAxisMaxLinear={this.yAxisMaxLinear}\n yAxisMaxLogarithmic={this.yAxisMaxLogarithmic}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-prevalence-over-time': PrevalenceOverTimeComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-prevalence-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype NumeratorMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.numeratorFilter, PrevalenceOverTimeProps['numeratorFilter']>\n>;\ntype DenominatorMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.denominatorFilter, PrevalenceOverTimeProps['denominatorFilter']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.granularity, PrevalenceOverTimeProps['granularity']>\n>;\ntype SmoothingWindowMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.smoothingWindow, PrevalenceOverTimeProps['smoothingWindow']>\n>;\ntype ViewsMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.views, PrevalenceOverTimeProps['views']>\n>;\ntype ConfidenceIntervalMethodsMatches = Expect<\n Equals<\n typeof PrevalenceOverTimeComponent.prototype.confidenceIntervalMethods,\n PrevalenceOverTimeProps['confidenceIntervalMethods']\n >\n>;\ntype WidhtMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.width, PrevalenceOverTimeProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.height, PrevalenceOverTimeProps['height']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.lapisDateField, PrevalenceOverTimeProps['lapisDateField']>\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.pageSize, PrevalenceOverTimeProps['pageSize']>\n>;\ntype YAxisMaxLinearMatches = Expect<\n Equals<typeof PrevalenceOverTimeComponent.prototype.yAxisMaxLinear, PrevalenceOverTimeProps['yAxisMaxLinear']>\n>;\ntype YAxisMaxLogarithmicMatches = Expect<\n Equals<\n typeof PrevalenceOverTimeComponent.prototype.yAxisMaxLogarithmic,\n PrevalenceOverTimeProps['yAxisMaxLogarithmic']\n >\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { Chart, type ChartConfiguration, registerables, type TooltipItem } from 'chart.js';\n\nimport { type YearMonthDayClass } from '../../utils/temporalClass';\nimport GsChart from '../components/chart';\nimport { LogitScale } from '../shared/charts/LogitScale';\nimport { singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { confidenceIntervalDataLabel } from '../shared/charts/confideceInterval';\nimport { getYAxisMax, type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ninterface RelativeGrowthAdvantageChartData {\n t: YearMonthDayClass[];\n proportion: number[];\n ciLower: number[];\n ciUpper: number[];\n observed: number[];\n params: {\n fd: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n };\n}\n\ninterface RelativeGrowthAdvantageChartProps {\n data: RelativeGrowthAdvantageChartData;\n yAxisScaleType: ScaleType;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nChart.register(...registerables, LogitScale);\n\nconst RelativeGrowthAdvantageChart = ({ data, yAxisScaleType, yAxisMaxConfig }: RelativeGrowthAdvantageChartProps) => {\n const maxY =\n yAxisScaleType !== 'logit'\n ? getYAxisMax(Math.max(...data.proportion), yAxisMaxConfig?.[yAxisScaleType])\n : undefined;\n\n const config: ChartConfiguration = {\n type: 'line',\n data: {\n labels: data.t,\n datasets: datasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n\n scales: {\n y: { ...getYAxisScale(yAxisScaleType), max: maxY },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: tooltip(),\n },\n },\n };\n\n return (\n <div className='flex h-full flex-col'>\n <RelativeGrowthAdvantageDisplay\n relativeAdvantage={data.params.fd.value}\n relativeAdvantageLowerBound={data.params.fd.ciLower}\n relativeAdvantageUpperBound={data.params.fd.ciUpper}\n />\n <div className='flex-1'>\n <GsChart configuration={config} />\n </div>\n </div>\n );\n};\n\nconst RelativeGrowthAdvantageDisplay = ({\n relativeAdvantage,\n relativeAdvantageLowerBound,\n relativeAdvantageUpperBound,\n}: {\n relativeAdvantage: number;\n relativeAdvantageLowerBound: number;\n relativeAdvantageUpperBound: number;\n}) => {\n return (\n <div class='mx-auto flex items-end flex-wrap'>\n <span class='text-[#606060]'>Relative advantage:</span>\n <div>\n <span class='text-2xl ml-3'> {formatProportion(relativeAdvantage)} </span>\n <span class='ml-2.5'>\n ({formatProportion(relativeAdvantageLowerBound)} - {formatProportion(relativeAdvantageUpperBound)})\n </span>\n </div>\n </div>\n );\n};\n\nconst datasets = (data: RelativeGrowthAdvantageChartData) => {\n return [\n {\n type: 'line' as const,\n label: 'Prevalence',\n data: data.proportion,\n borderWidth: 1,\n pointRadius: 0,\n borderColor: singleGraphColorRGBByName('indigo'),\n backgroundColor: singleGraphColorRGBByName('indigo'),\n },\n {\n type: 'line' as const,\n label: 'CI Lower',\n data: data.ciLower,\n borderWidth: 1,\n pointRadius: 0,\n fill: '+1',\n backgroundColor: singleGraphColorRGBByName('indigo', 0.3),\n },\n {\n type: 'line' as const,\n label: 'CI Upper',\n data: data.ciUpper,\n borderWidth: 1,\n pointRadius: 0,\n fill: '-1',\n backgroundColor: singleGraphColorRGBByName('indigo', 0.3),\n },\n {\n type: 'scatter' as const,\n label: 'Observed',\n data: data.observed,\n pointBackgroundColor: singleGraphColorRGBByName('green'),\n pointRadius: 2,\n },\n ];\n};\n\nconst tooltip = () => {\n return {\n mode: 'index' as const,\n intersect: false,\n filter: ({ datasetIndex }: TooltipItem<'line'>) => {\n return datasetIndex !== 1 && datasetIndex !== 2;\n },\n callbacks: {\n label: (context: TooltipItem<'line'>) => {\n switch (context.datasetIndex) {\n case 0: {\n const value = context.dataset.data[context.dataIndex];\n const ciLower = context.dataset.data[context.dataIndex + 1];\n const ciUpper = context.dataset.data[context.dataIndex + 2];\n if (typeof value !== 'number' || typeof ciLower !== 'number' || typeof ciUpper !== 'number') {\n return '';\n }\n return confidenceIntervalDataLabel(value, ciLower, ciUpper, context.dataset.label);\n }\n\n case 3: {\n const value = context.dataset.data[context.dataIndex];\n if (typeof value !== 'number') {\n return '';\n }\n return `Observed: ${value.toFixed(3)}`;\n }\n default:\n return '';\n }\n },\n },\n };\n};\n\nexport default RelativeGrowthAdvantageChart;\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { type LapisFilter } from '../types';\nimport { getMinMaxTemporal, TemporalCache, type YearMonthDayClass } from '../utils/temporalClass';\n\nexport type RelativeGrowthAdvantageData = Awaited<ReturnType<typeof queryRelativeGrowthAdvantage>>;\n\nexport async function queryRelativeGrowthAdvantage<LapisDateField extends string>(\n numerator: LapisFilter,\n denominator: LapisFilter,\n generationTime: number,\n lapis: string,\n lapisDateField: LapisDateField,\n signal?: AbortSignal,\n) {\n const fetchNumerator = new FetchAggregatedOperator<{\n [key in LapisDateField]: string | null;\n }>(numerator, [lapisDateField]);\n const fetchDenominator = new FetchAggregatedOperator<{\n [key in LapisDateField]: string | null;\n }>(denominator, [lapisDateField]);\n const mapToFixedDateKeyNumerator = new RenameFieldOperator(fetchNumerator, lapisDateField, 'date');\n const mapToFixedDateKeyDenominator = new RenameFieldOperator(fetchDenominator, lapisDateField, 'date');\n const mapNumerator = new MapOperator(mapToFixedDateKeyNumerator, toYearMonthDay);\n const mapDenominator = new MapOperator(mapToFixedDateKeyDenominator, toYearMonthDay);\n const [numeratorData, denominatorData] = await Promise.all([\n mapNumerator.evaluate(lapis, signal),\n mapDenominator.evaluate(lapis, signal),\n ]);\n const { min: minDate, max: maxDate } = getMinMaxTemporal(denominatorData.content.map((d) => d.date));\n if (!minDate && !maxDate) {\n return null;\n }\n\n const numeratorCounts = new Map<YearMonthDayClass, number>();\n numeratorData.content.forEach((d) => {\n if (d.date) {\n numeratorCounts.set(d.date, d.count);\n }\n });\n const denominatorCounts = new Map<YearMonthDayClass, number>();\n const requestData = {\n t: [] as number[],\n n: [] as number[],\n k: [] as number[],\n };\n denominatorData.content.forEach((d) => {\n if (d.date) {\n denominatorCounts.set(d.date, d.count);\n const t = d.date.minus(minDate);\n requestData.t.push(t);\n requestData.n.push(d.count);\n requestData.k.push(numeratorCounts.get(d.date) ?? 0);\n }\n });\n const requestPayload = {\n config: {\n alpha: 0.95,\n generationTime,\n initialCasesVariant: 1,\n initialCasesWildtype: 1,\n reproductionNumberWildtype: 1,\n tStart: 0,\n tEnd: maxDate.minus(minDate),\n },\n data: requestData,\n };\n const response = await fetch('https://cov-spectrum.org/api/v2/computed/model/chen2021Fitness', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(requestPayload),\n signal,\n });\n const responseData = (await response.json()) as {\n estimatedAbsoluteNumbers: {\n t: number[];\n variantCases: number[];\n wildtypeCases: number[];\n };\n estimatedProportions: {\n t: number[];\n proportion: number[];\n ciLower: number[];\n ciUpper: number[];\n };\n params: {\n a: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n fc: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n fd: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n t0: {\n value: number;\n ciLower: number;\n ciUpper: number;\n };\n };\n };\n const transformed = {\n ...responseData,\n estimatedProportions: {\n ...responseData.estimatedProportions,\n t: responseData.estimatedProportions.t.map((t) => minDate.addDays(t)),\n },\n };\n const observedProportions = transformed.estimatedProportions.t.map(\n (t) => (numeratorCounts.get(t) ?? 0) / (denominatorCounts.get(t) ?? 0),\n );\n\n return {\n ...transformed,\n observedProportions,\n };\n}\n\nfunction toYearMonthDay(d: { date: string | null; count: number }) {\n const temporalCache = TemporalCache.getInstance();\n return {\n date: d.date ? temporalCache.getYearMonthDay(d.date) : null,\n count: d.count,\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport RelativeGrowthAdvantageChart from './relative-growth-advantage-chart';\nimport {\n queryRelativeGrowthAdvantage,\n type RelativeGrowthAdvantageData,\n} from '../../query/queryRelativeGrowthAdvantage';\nimport { type LapisFilter } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoHeadline2, InfoLink, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport { type YAxisMaxConfig } from '../shared/charts/getYAxisMax';\nimport { type ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'line';\n\nexport interface RelativeGrowthAdvantageProps {\n width: string;\n height: string;\n numeratorFilter: LapisFilter;\n denominatorFilter: LapisFilter;\n generationTime: number;\n views: View[];\n lapisDateField: string;\n yAxisMaxConfig: YAxisMaxConfig;\n}\n\nexport const RelativeGrowthAdvantage: FunctionComponent<RelativeGrowthAdvantageProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <RelativeGrowthAdvantageInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const RelativeGrowthAdvantageInner: FunctionComponent<RelativeGrowthAdvantageProps> = (componentProps) => {\n const lapis = useContext(LapisUrlContext);\n const { numeratorFilter, denominatorFilter, generationTime, lapisDateField } = componentProps;\n\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n\n const { data, error, isLoading } = useQuery(\n () => queryRelativeGrowthAdvantage(numeratorFilter, denominatorFilter, generationTime, lapis, lapisDateField),\n [lapis, numeratorFilter, denominatorFilter, generationTime, lapisDateField],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return (\n <RelativeGrowthAdvantageTabs\n data={data}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n originalComponentProps={componentProps}\n />\n );\n};\n\ntype RelativeGrowthAdvantageTabsProps = {\n data: NonNullable<RelativeGrowthAdvantageData>;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n originalComponentProps: RelativeGrowthAdvantageProps;\n};\n\nconst RelativeGrowthAdvantageTabs: FunctionComponent<RelativeGrowthAdvantageTabsProps> = ({\n data,\n yAxisScaleType,\n setYAxisScaleType,\n originalComponentProps,\n}) => {\n const getTab = (view: View) => {\n switch (view) {\n case 'line':\n return {\n title: 'Line',\n content: (\n <RelativeGrowthAdvantageChart\n data={{\n ...data.estimatedProportions,\n observed: data.observedProportions,\n params: data.params,\n }}\n yAxisScaleType={yAxisScaleType}\n yAxisMaxConfig={originalComponentProps.yAxisMaxConfig}\n />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n const toolbar = () => (\n <RelativeGrowthAdvantageToolbar\n originalComponentProps={originalComponentProps}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype RelativeGrowthAdvantageToolbarProps = {\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n originalComponentProps: RelativeGrowthAdvantageProps;\n};\n\nconst RelativeGrowthAdvantageToolbar: FunctionComponent<RelativeGrowthAdvantageToolbarProps> = ({\n yAxisScaleType,\n setYAxisScaleType,\n originalComponentProps,\n}) => {\n return (\n <>\n <ScalingSelector yAxisScaleType={yAxisScaleType} setYAxisScaleType={setYAxisScaleType} />\n <RelativeGrowthAdvantageInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\nconst RelativeGrowthAdvantageInfo: FunctionComponent<{ originalComponentProps: RelativeGrowthAdvantageProps }> = ({\n originalComponentProps,\n}) => {\n const lapis = useContext(LapisUrlContext);\n const generationTime = originalComponentProps.generationTime;\n\n return (\n <Info>\n <InfoHeadline1>Relative growth advantage</InfoHeadline1>\n <InfoParagraph>\n If variants spread pre-dominantly by local transmission across demographic groups, this estimate\n reflects the relative viral intrinsic growth advantage of the focal variant in the selected country and\n time frame. We report the relative growth advantage per {generationTime} days (in percentage; 0% means\n equal growth). Importantly, the relative growth advantage estimate reflects the advantage compared to\n the co-circulating variants. Thus, as new variants spread, the advantage of the focal variant may\n decrease. Different mechanisms can alter the intrinsic growth rate, including an intrinsic transmission\n advantage, immune evasion, and a prolonged infectious period. When absolute numbers of a variant are\n low, the growth advantage may merely reflect the current importance of introductions from abroad or the\n variant spreading in a particular demographic group. In this case, the estimate does not provide\n information on any intrinsic fitness advantages.\n </InfoParagraph>\n <InfoParagraph>\n Example: Assume that 10 infections from the focal variant and 100 infections from the co-circulating\n variants occur today and that the focal variant has a relative growth advantage of 50%. Then, if the\n number of new infections from the co-circulating variants remains at 100 in {generationTime} days from\n today, we expect the number of new infections from the focal variant to be 15.\n </InfoParagraph>\n\n <InfoHeadline2>Reference</InfoHeadline2>\n <InfoParagraph>\n Chen, Chaoran, et al. \"Quantification of the spread of SARS-CoV-2 variant B.1.1.7 in Switzerland.\"\n Epidemics (2021); doi:{' '}\n <InfoLink href='https://www.sciencedirect.com/science/article/pii/S1755436521000335?via=ihub'>\n 10.1016/j.epidem.2021.100480\n </InfoLink>\n </InfoParagraph>\n <InfoComponentCode\n componentName='relative-growth-advantage'\n params={originalComponentProps}\n lapisUrl={lapis}\n />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport {\n RelativeGrowthAdvantage,\n type RelativeGrowthAdvantageProps,\n} from '../../preact/relativeGrowthAdvantage/relative-growth-advantage';\nimport { type AxisMax } from '../../preact/shared/charts/getYAxisMax';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n *\n * For this component, we assume a discrete time model, where new infections happen exactly every `generationTime` days.\n * This is what we call a \"generation\".\n *\n * This component estimates the relative growth advantage of a variant (defined by its LAPIS filter) by performing a logistic regression.\n * Based on the inferred logistic growth rate, we derive the relative growth advantage (per generation).\n *\n * For details on the scientific method, see:\n * Chen, Chaoran, et al. \"Quantification of the spread of SARS-CoV-2 variant B.1.1.7 in Switzerland.\" Epidemics (2021);\n * doi: [10.1016/j.epidem.2021.100480](https://doi.org/10.1016/j.epidem.2021.100480)\n *\n * This component fetches aggregated data from LAPIS.\n * Then the data is sent to `https://cov-spectrum.org/api/v2/computed/model/chen2021Fitness`\n * which performs the logistic regression and calculates the relative growth advantage.\n *\n * ## Views\n *\n * ### Line View\n *\n * The line view shows the relative growth advantage over time in a line chart.\n * The dots in the plot show the proportions of the focal variant (defined by the `numeratorFilter`) to the baseline variant (defined by the `denominatorFilter`)\n * for every day as observed in the data.\n * The line shows a logistic curve fitted to the data points, including a 95% confidence interval.\n */\n@customElement('gs-relative-growth-advantage')\nexport class RelativeGrowthAdvantageComponent extends PreactLitAdapter {\n /**\n * Required.\n *\n * LAPIS filter to select the data of the focal variant.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n numeratorFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * Required.\n *\n * LAPIS filter to select the data of the baseline variant.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n denominatorFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The generation time represents the number of days over which the variant's relative growth advantage is measured.\n * For example, if we set a generation time of 7 days, then we estimate the growth advantage per week.\n */\n @property({ type: Number })\n generationTime: number = 7;\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: 'line'[] = ['line'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n /**\n * The maximum value for the y-axis on all graphs in linear view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLinear: 'maxInData' | 'limitTo1' | number = 1;\n\n /**\n * The maximum value for the y-axis on all graphs in logarithmic view.\n * If set to a number, the maximum value is set to this number.\n * If set to `maxInData`, the maximum value is set to the maximum value in the data.\n * If set to `limitTo1`, the maximum value is set to `min(1, the maximum value in the data)`.\n * If not set, the maximum value is set to the default value (1).\n */\n @property({ type: String })\n yAxisMaxLogarithmic: 'maxInData' | 'limitTo1' | number = 1;\n\n override render() {\n return (\n <RelativeGrowthAdvantage\n numeratorFilter={this.numeratorFilter}\n denominatorFilter={this.denominatorFilter}\n generationTime={this.generationTime}\n views={this.views}\n width={this.width}\n height={this.height}\n lapisDateField={this.lapisDateField}\n yAxisMaxConfig={{\n linear: this.yAxisMaxLinear,\n logarithmic: this.yAxisMaxLogarithmic,\n }}\n />\n );\n }\n}\n\nexport interface RelativeGrowthAdvantageComponentProps extends Omit<RelativeGrowthAdvantageProps, 'yAxisMaxConfig'> {\n yAxisMaxLinear?: AxisMax;\n yAxisMaxLogarithmic?: AxisMax;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-relative-growth-advantage': RelativeGrowthAdvantageComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-relative-growth-advantage': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype NumeratorMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.numeratorFilter,\n RelativeGrowthAdvantageProps['numeratorFilter']\n >\n>;\ntype DenominatorMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.denominatorFilter,\n RelativeGrowthAdvantageProps['denominatorFilter']\n >\n>;\ntype GenerationTimeMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.generationTime,\n RelativeGrowthAdvantageProps['generationTime']\n >\n>;\ntype ViewsMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.views, RelativeGrowthAdvantageProps['views']>\n>;\ntype WidthMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.width, RelativeGrowthAdvantageProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof RelativeGrowthAdvantageComponent.prototype.height, RelativeGrowthAdvantageProps['height']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.lapisDateField,\n RelativeGrowthAdvantageProps['lapisDateField']\n >\n>;\ntype YAxisMaxLinearMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.yAxisMaxLinear,\n Required<RelativeGrowthAdvantageProps['yAxisMaxConfig']>['linear']\n >\n>;\ntype YAxisMaxLogarithmicMatches = Expect<\n Equals<\n typeof RelativeGrowthAdvantageComponent.prototype.yAxisMaxLogarithmic,\n Required<RelativeGrowthAdvantageProps['yAxisMaxConfig']>['logarithmic']\n >\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { type InitialSort } from '../preact/aggregatedData/aggregate';\nimport { type LapisFilter } from '../types';\n\nexport type AggregateData = (Record<string, string | null | number | boolean> & {\n count: number;\n proportion: number;\n})[];\n\nexport const compareAscending = (a: string | null | number, b: string | null | number) => {\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n\n const strA = a != null ? String(a) : '';\n const strB = b != null ? String(b) : '';\n\n return strA.localeCompare(strB);\n};\n\nexport async function queryAggregateData(\n lapisFilter: LapisFilter,\n fields: string[],\n lapis: string,\n initialSort: InitialSort = { field: 'count', direction: 'descending' },\n signal?: AbortSignal,\n) {\n const validSortFields = ['count', 'proportion', ...fields];\n if (!validSortFields.includes(initialSort.field)) {\n throw new Error(`InitialSort field not in fields. Valid fields are: ${validSortFields.join(', ')}`);\n }\n\n const fetchData = new FetchAggregatedOperator<Record<string, string | null | number>>(lapisFilter, fields);\n const sortData = new SortOperator(fetchData, (a, b) => {\n return initialSort.direction === 'ascending'\n ? compareAscending(a[initialSort.field], b[initialSort.field])\n : compareAscending(b[initialSort.field], a[initialSort.field]);\n });\n const data = (await sortData.evaluate(lapis, signal)).content;\n\n const total = data.reduce((acc, row) => acc + row.count, 0);\n\n return data.map(\n (row) =>\n ({\n ...row,\n proportion: row.count / total,\n }) as Record<string, string | null | number | boolean> & {\n count: number;\n proportion: number;\n },\n );\n}\n","import { type FunctionComponent } from 'preact';\n\nimport { type AggregateData, compareAscending } from '../../query/queryAggregateData';\nimport { Table } from '../components/table';\nimport { formatProportion } from '../shared/table/formatProportion';\n\ntype AggregateTableProps = {\n fields: string[];\n data: AggregateData;\n pageSize: boolean | number;\n};\n\nexport const AggregateTable: FunctionComponent<AggregateTableProps> = ({ data, fields, pageSize }) => {\n const headers = [\n ...fields.map((field) => {\n return {\n name: field,\n sort: {\n compare: compareAscending,\n },\n };\n }),\n {\n name: 'count',\n sort: true,\n },\n {\n name: 'proportion',\n sort: true,\n formatter: (cell: number) => formatProportion(cell),\n },\n ];\n\n return <Table data={data} columns={headers} pageSize={pageSize} />;\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\n\nimport { AggregateTable } from './aggregate-table';\nimport { type AggregateData, queryAggregateData } from '../../query/queryAggregateData';\nimport { type LapisFilter } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport Tabs from '../components/tabs';\nimport { useQuery } from '../useQuery';\n\nexport type View = 'table';\nexport type InitialSort = { field: string; direction: 'ascending' | 'descending' };\n\nexport type AggregateProps = {\n width: string;\n height: string;\n filter: LapisFilter;\n fields: string[];\n views: View[];\n initialSortField: string;\n initialSortDirection: 'ascending' | 'descending';\n pageSize: boolean | number;\n};\n\nexport const Aggregate: FunctionComponent<AggregateProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <AggregateInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const AggregateInner: FunctionComponent<AggregateProps> = (componentProps) => {\n const { fields, filter, initialSortField, initialSortDirection } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(async () => {\n return queryAggregateData(filter, fields, lapis, { field: initialSortField, direction: initialSortDirection });\n }, [filter, fields, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <AggregatedDataTabs data={data} originalComponentProps={componentProps} />;\n};\n\ntype AggregatedDataTabsProps = {\n data: AggregateData;\n originalComponentProps: AggregateProps;\n};\n\nconst AggregatedDataTabs: FunctionComponent<AggregatedDataTabsProps> = ({ data, originalComponentProps }) => {\n const getTab = (view: View) => {\n switch (view) {\n case 'table':\n return {\n title: 'Table',\n content: (\n <AggregateTable\n data={data}\n fields={originalComponentProps.fields}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n return <Tabs tabs={tabs} toolbar={<Toolbar data={data} originalComponentProps={originalComponentProps} />} />;\n};\n\ntype ToolbarProps = {\n data: AggregateData;\n originalComponentProps: AggregateProps;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({ data, originalComponentProps }) => {\n return (\n <div class='flex flex-row'>\n <CsvDownloadButton className='mx-1 btn btn-xs' getData={() => data} filename='aggregate.csv' />\n <AggregateInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </div>\n );\n};\n\ntype AggregateInfoProps = {\n originalComponentProps: AggregateProps;\n};\n\nconst AggregateInfo: FunctionComponent<AggregateInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Aggregated data</InfoHeadline1>\n <InfoParagraph>\n This table shows the number and proportion of sequences stratified by the following fields:{' '}\n {originalComponentProps.fields.join(', ')}. The proportion is calculated with respect to the total count\n within the filtered dataset.\n </InfoParagraph>\n <InfoComponentCode componentName='aggregate' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport type { DetailedHTMLProps, HTMLAttributes } from 'react';\n\nimport { Aggregate, type AggregateProps, type View } from '../../preact/aggregatedData/aggregate';\nimport { type LapisFilter } from '../../types';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays aggregated data in a table, which can provide an overview of the underlying data.\n *\n * It expects a list of `fields` to aggregate by and a `filter` to apply to the data.\n *\n * ## Views\n *\n * ### Table View\n *\n * In the table view, the data is presented in a table format where each field is a column,\n * along with the aggregated value and its proportion.\n * The proportion represents the ratio of the aggregated value to the total count of the data\n * (considering the applied filter).\n */\n@customElement('gs-aggregate')\nexport class AggregateComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * The fields to aggregate by.\n * Every field will be a table column.\n * Every field must exist in the backing LAPIS instance.\n *\n * If left empty, the component will only show the absolute count of the provided `filter` and proportion `100%`.\n */\n @property({ type: Array })\n fields: string[] = [];\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: View[] = ['table'];\n\n /**\n * The filter to apply to the data.\n * It must be a valid LAPIS filter object.\n */\n @property({ type: Object })\n filter: LapisFilter = {};\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The field by which the table is initially sorted.\n * Must be one of the fields specified in the fields property, 'count', or 'proportion'.\n */\n @property({ type: String })\n initialSortField: string = 'count';\n\n /**\n * The initial sort direction of the table.\n */\n @property({ type: String })\n initialSortDirection: 'ascending' | 'descending' = 'descending';\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <Aggregate\n fields={this.fields}\n views={this.views}\n filter={this.filter}\n width={this.width}\n height={this.height}\n initialSortField={this.initialSortField}\n initialSortDirection={this.initialSortDirection}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-aggregate-component': AggregateComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-aggregate-component': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype FieldsMatches = Expect<Equals<typeof AggregateComponent.prototype.fields, AggregateProps['fields']>>;\ntype ViewsMatches = Expect<Equals<typeof AggregateComponent.prototype.views, AggregateProps['views']>>;\ntype FilterMatches = Expect<Equals<typeof AggregateComponent.prototype.filter, AggregateProps['filter']>>;\ntype WidthMatches = Expect<Equals<typeof AggregateComponent.prototype.width, AggregateProps['width']>>;\ntype HeightMatches = Expect<Equals<typeof AggregateComponent.prototype.height, AggregateProps['height']>>;\ntype InitialSortFieldMatches = Expect<\n Equals<typeof AggregateComponent.prototype.initialSortField, AggregateProps['initialSortField']>\n>;\ntype InitialSortDirectionMatches = Expect<\n Equals<typeof AggregateComponent.prototype.initialSortDirection, AggregateProps['initialSortDirection']>\n>;\ntype PageSizeMatches = Expect<Equals<typeof AggregateComponent.prototype.pageSize, AggregateProps['pageSize']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import type { NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport { generateAllInRange, getMinMaxTemporal, type TemporalClass } from '../../utils/temporalClass';\n\ntype TableRow<DateRangeKey extends string> = { [K in DateRangeKey]: string } & { [key: string]: number };\n\nexport const getNumberOfSequencesOverTimeTableData = <DateRangeKey extends string>(\n data: NumberOfSequencesDatasets,\n dateRangeKey: DateRangeKey,\n) => {\n const datasetsWithCountByDate = data.map(({ displayName, content }) => ({\n displayName,\n content: new Map(content.map((datum) => [datum.dateRange?.toString(), datum])),\n }));\n\n const allDateRangesThatOccurInData = datasetsWithCountByDate\n .map(({ content }) => [...content.values()].map((datum) => datum.dateRange))\n .reduce((acc, keys) => new Set([...acc, ...keys]), new Set<TemporalClass | null>());\n\n const minMax = getMinMaxTemporal(allDateRangesThatOccurInData);\n if (minMax === null) {\n return [];\n }\n\n const allDateRanges: (TemporalClass | null)[] = generateAllInRange(minMax.min, minMax.max);\n\n if (allDateRangesThatOccurInData.has(null)) {\n allDateRanges.unshift(null);\n }\n\n return allDateRanges.map((dateRange) => {\n return datasetsWithCountByDate.reduce(\n (acc, dataset) => ({\n ...acc,\n [dataset.displayName]: dataset.content.get(dateRange?.toString())?.count ?? 0,\n }),\n { [dateRangeKey]: dateRange?.toString() ?? 'Unknown' } as TableRow<DateRangeKey>,\n );\n });\n};\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables } from 'chart.js';\nimport { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport GsChart from '../components/chart';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface NumberSequencesOverBarChartProps {\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n}\n\nChart.register(...registerables);\n\nexport const NumberSequencesOverTimeBarChart = ({ data, yAxisScaleType }: NumberSequencesOverBarChartProps) => {\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'bar',\n data: {\n datasets: getDatasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: {\n type: getYAxisScale(yAxisScaleType).type,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n },\n },\n },\n }),\n [data, yAxisScaleType],\n );\n\n return <GsChart configuration={config} />;\n};\n\nconst getDatasets = (data: NumberOfSequencesDatasets) => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, 'date');\n\n return data.map(\n ({ displayName }, index) =>\n ({\n borderWidth: 1,\n label: displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: tableData.map((row) => ({\n x: row.date,\n y: row[displayName],\n })),\n }) as ChartDataset<'bar', { x: string; y: number }[]>,\n );\n};\n","import { Chart, type ChartConfiguration, type ChartDataset, registerables } from 'chart.js';\nimport { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport GsChart from '../components/chart';\nimport { singleGraphColorRGBAById } from '../shared/charts/colors';\nimport { getYAxisScale, type ScaleType } from '../shared/charts/getYAxisScale';\n\ninterface NumberSequencesOverBarChartProps {\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n}\n\nChart.register(...registerables);\n\nexport const NumberSequencesOverTimeLineChart = ({ data, yAxisScaleType }: NumberSequencesOverBarChartProps) => {\n const config: ChartConfiguration = useMemo(\n () => ({\n type: 'line',\n data: {\n datasets: getDatasets(data),\n },\n options: {\n maintainAspectRatio: false,\n animation: false,\n scales: {\n y: {\n type: getYAxisScale(yAxisScaleType).type,\n },\n },\n plugins: {\n legend: {\n display: false,\n },\n tooltip: {\n mode: 'index',\n intersect: false,\n },\n },\n },\n }),\n [data, yAxisScaleType],\n );\n\n return <GsChart configuration={config} />;\n};\n\nconst getDatasets = (data: NumberOfSequencesDatasets) => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, 'date');\n\n return data.map(\n ({ displayName }, index) =>\n ({\n borderWidth: 1,\n pointRadius: 0,\n label: displayName,\n backgroundColor: singleGraphColorRGBAById(index, 0.3),\n borderColor: singleGraphColorRGBAById(index),\n data: tableData.map((row) => ({\n x: row.date,\n y: row[displayName],\n })),\n }) as ChartDataset<'line', { x: string; y: number }[]>,\n );\n};\n","import { useMemo } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { type NumberOfSequencesDatasets } from '../../query/queryNumberOfSequencesOverTime';\nimport { type TemporalGranularity } from '../../types';\nimport { Table } from '../components/table';\n\ninterface NumberSequencesOverTimeTableProps {\n data: NumberOfSequencesDatasets;\n granularity: TemporalGranularity;\n pageSize: boolean | number;\n}\n\nexport const NumberSequencesOverTimeTable = ({ data, granularity, pageSize }: NumberSequencesOverTimeTableProps) => {\n const columns = [\n {\n name: granularity,\n sort: true,\n },\n ...data.map((dataset) => ({\n name: dataset.displayName,\n sort: true,\n })),\n ];\n\n const flatTableData = useMemo(() => {\n const tableData = getNumberOfSequencesOverTimeTableData(data, granularity);\n return Object.values(tableData).map((row) => Object.values(row));\n }, [data, granularity]);\n\n return <Table data={flatTableData} columns={columns} pageSize={pageSize} />;\n};\n","import { queryAggregatedDataOverTime } from './queryAggregatedDataOverTime';\nimport { type NamedLapisFilter, type TemporalGranularity } from '../types';\nimport { sortNullToBeginningThenByDate } from '../utils/sort';\nimport { makeArray } from '../utils/utils';\n\nexport type NumberOfSequencesDatasets = Awaited<ReturnType<typeof queryNumberOfSequencesOverTime>>;\n\nexport async function queryNumberOfSequencesOverTime(\n lapis: string,\n lapisFilter: NamedLapisFilter | NamedLapisFilter[],\n lapisDateField: string,\n granularity: TemporalGranularity,\n smoothingWindow: number,\n) {\n const lapisFilters = makeArray(lapisFilter);\n\n const queries = lapisFilters.map(async ({ displayName, lapisFilter }) => {\n const { content } = await queryAggregatedDataOverTime(\n lapisFilter,\n granularity,\n smoothingWindow,\n lapisDateField,\n ).evaluate(lapis);\n\n return {\n displayName,\n content: content.sort(sortNullToBeginningThenByDate),\n };\n });\n\n return Promise.all(queries);\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useState } from 'preact/hooks';\n\nimport { getNumberOfSequencesOverTimeTableData } from './getNumberOfSequencesOverTimeTableData';\nimport { NumberSequencesOverTimeBarChart } from './number-sequences-over-time-bar-chart';\nimport { NumberSequencesOverTimeLineChart } from './number-sequences-over-time-line-chart';\nimport { NumberSequencesOverTimeTable } from './number-sequences-over-time-table';\nimport {\n type NumberOfSequencesDatasets,\n queryNumberOfSequencesOverTime,\n} from '../../query/queryNumberOfSequencesOverTime';\nimport type { NamedLapisFilter, TemporalGranularity } from '../../types';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { ScalingSelector } from '../components/scaling-selector';\nimport Tabs from '../components/tabs';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\nimport { useQuery } from '../useQuery';\n\ntype NumberSequencesOverTimeView = 'bar' | 'line' | 'table';\n\nexport interface NumberSequencesOverTimeProps {\n width: string;\n height: string;\n lapisFilter: NamedLapisFilter | NamedLapisFilter[];\n lapisDateField: string;\n views: NumberSequencesOverTimeView[];\n granularity: TemporalGranularity;\n smoothingWindow: number;\n pageSize: boolean | number;\n}\n\nexport const NumberSequencesOverTime = (componentProps: NumberSequencesOverTimeProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <NumberSequencesOverTimeInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst NumberSequencesOverTimeInner = (componentProps: NumberSequencesOverTimeProps) => {\n const { lapisFilter, lapisDateField, granularity, smoothingWindow } = componentProps;\n const lapis = useContext(LapisUrlContext);\n\n const { data, error, isLoading } = useQuery(\n () => queryNumberOfSequencesOverTime(lapis, lapisFilter, lapisDateField, granularity, smoothingWindow),\n [lapis, lapisFilter, lapisDateField, granularity, smoothingWindow],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n return <NumberSequencesOverTimeTabs data={data} originalComponentProps={componentProps} />;\n};\n\ninterface NumberSequencesOverTimeTabsProps {\n data: NumberOfSequencesDatasets;\n originalComponentProps: NumberSequencesOverTimeProps;\n}\n\nconst NumberSequencesOverTimeTabs = ({ data, originalComponentProps }: NumberSequencesOverTimeTabsProps) => {\n const [yAxisScaleType, setYAxisScaleType] = useState<ScaleType>('linear');\n\n const getTab = (view: NumberSequencesOverTimeView) => {\n switch (view) {\n case 'bar':\n return {\n title: 'Bar',\n content: <NumberSequencesOverTimeBarChart data={data} yAxisScaleType={yAxisScaleType} />,\n };\n case 'line':\n return {\n title: 'Line',\n content: <NumberSequencesOverTimeLineChart data={data} yAxisScaleType={yAxisScaleType} />,\n };\n case 'table':\n return {\n title: 'Table',\n content: (\n <NumberSequencesOverTimeTable\n data={data}\n granularity={originalComponentProps.granularity}\n pageSize={originalComponentProps.pageSize}\n />\n ),\n };\n default:\n throw new Error(`Unknown view: ${view}`);\n }\n };\n\n return (\n <Tabs\n tabs={originalComponentProps.views.map((view) => getTab(view))}\n toolbar={(activeTab) => (\n <Toolbar\n activeTab={activeTab}\n data={data}\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n originalComponentProps={originalComponentProps}\n />\n )}\n />\n );\n};\n\ninterface ToolbarProps {\n activeTab: string;\n data: NumberOfSequencesDatasets;\n yAxisScaleType: ScaleType;\n setYAxisScaleType: (scaleType: ScaleType) => void;\n originalComponentProps: NumberSequencesOverTimeProps;\n}\n\nconst Toolbar = ({ activeTab, data, yAxisScaleType, setYAxisScaleType, originalComponentProps }: ToolbarProps) => {\n return (\n <>\n {activeTab !== 'Table' && (\n <ScalingSelector\n yAxisScaleType={yAxisScaleType}\n setYAxisScaleType={setYAxisScaleType}\n enabledTypes={['linear', 'logarithmic']}\n />\n )}\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getNumberOfSequencesOverTimeTableData(data, originalComponentProps.granularity)}\n filename='number_of_sequences_over_time.csv'\n />\n <NumberSequencesOverTimeInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype NumberSequencesOverTimeInfoProps = {\n originalComponentProps: NumberSequencesOverTimeProps;\n};\n\nconst NumberSequencesOverTimeInfo: FunctionComponent<NumberSequencesOverTimeInfoProps> = ({\n originalComponentProps,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n return (\n <Info>\n <InfoHeadline1>Number of sequences over time</InfoHeadline1>\n <InfoParagraph>\n This presents the number of available sequences of a variant per{' '}\n <b>{originalComponentProps.granularity}</b>\n {originalComponentProps.smoothingWindow > 0 &&\n `, smoothed using a ${originalComponentProps.smoothingWindow}-${originalComponentProps.granularity} sliding window`}\n .\n </InfoParagraph>\n <InfoComponentCode\n componentName='number-sequences-over-time'\n params={originalComponentProps}\n lapisUrl={lapis}\n />\n </Info>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport {\n NumberSequencesOverTime,\n type NumberSequencesOverTimeProps,\n} from '../../preact/numberSequencesOverTime/number-sequences-over-time';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays the number of sequences over time of one or more datasets,\n * selected by LAPIS filters.\n *\n * In the chart views, the user can select the y-axis scale (linear, logistic).\n * The x-axis shows all available time intervals available in the datasets in the selected `granularity`.\n * Thus, the `lapisFilter` implicitly also defines the range that is shown on the x-axis.\n * If you want to restrict the x-axis to a smaller date range,\n * then you need to set appropriate filter values in the `lapisFilter`.\n */\n@customElement('gs-number-sequences-over-time')\nexport class NumberSequencesOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * Required.\n *\n * Either a LAPIS filter or an array of LAPIS filters to fetch the number of sequences for.\n *\n * The `lapisFilter` will be sent as is to LAPIS to select the data.\n * It must be a valid LAPIS filter object.\n *\n * The `displayName` will be used to label the component views.\n * It should be human-readable.\n *\n */ @property({type: Object})\n lapisFilter:\n {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }\n | {\n lapisFilter: Record<string, string | number | null | boolean>;\n displayName: string;\n }[]= { displayName: '', lapisFilter: {} };\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used on the x-axis of the diagram.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: ('bar' | 'line' | 'table')[] = ['bar', 'line', 'table'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'day';\n\n /**\n * The number of time steps to use for smoothing the data.\n * `0` means no smoothing.\n * Must be a non-negative integer.\n *\n * For a given time, the shown value is the mean of the neighbouring measured values.\n * The `smoothingWindow` value provides the number of neighbouring values to take into account.\n * The resulting time is computed via `Math.floor(smoothingWindow / 2)`.\n */\n @property({ type: Number })\n smoothingWindow: number = 0;\n\n /**\n * The maximum number of rows to display in the table view.\n * Set to `false` to disable pagination. Set to `true` to enable pagination with a default limit (10).\n */\n @property({ type: Object })\n pageSize: boolean | number = false;\n\n override render() {\n return (\n <NumberSequencesOverTime\n lapisFilter={this.lapisFilter}\n lapisDateField={this.lapisDateField}\n views={this.views}\n width={this.width}\n height={this.height}\n granularity={this.granularity}\n smoothingWindow={this.smoothingWindow}\n pageSize={this.pageSize}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-number-sequences-over-time': NumberSequencesOverTimeComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-number-sequences-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.lapisFilter, NumberSequencesOverTimeProps['lapisFilter']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<\n typeof NumberSequencesOverTimeComponent.prototype.lapisDateField,\n NumberSequencesOverTimeProps['lapisDateField']\n >\n>;\ntype ViewsMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.views, NumberSequencesOverTimeProps['views']>\n>;\ntype WidhtMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.width, NumberSequencesOverTimeProps['width']>\n>;\ntype HeightMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.height, NumberSequencesOverTimeProps['height']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.granularity, NumberSequencesOverTimeProps['granularity']>\n>;\ntype SmoothingWindowMatches = Expect<\n Equals<\n typeof NumberSequencesOverTimeComponent.prototype.smoothingWindow,\n NumberSequencesOverTimeProps['smoothingWindow']\n >\n>;\ntype PageSizeMatches = Expect<\n Equals<typeof NumberSequencesOverTimeComponent.prototype.pageSize, NumberSequencesOverTimeProps['pageSize']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { mapDateToGranularityRange } from './queryAggregatedDataOverTime';\nimport { FetchAggregatedOperator } from '../operator/FetchAggregatedOperator';\nimport { FetchSubstitutionsOrDeletionsOperator } from '../operator/FetchSubstitutionsOrDeletionsOperator';\nimport { GroupByAndSumOperator } from '../operator/GroupByAndSumOperator';\nimport { MapOperator } from '../operator/MapOperator';\nimport { RenameFieldOperator } from '../operator/RenameFieldOperator';\nimport { SortOperator } from '../operator/SortOperator';\nimport { UserFacingError } from '../preact/components/error-display';\nimport { BaseMutationOverTimeDataMap } from '../preact/mutationsOverTime/MutationOverTimeData';\nimport { sortSubstitutionsAndDeletions } from '../preact/shared/sort/sortSubstitutionsAndDeletions';\nimport {\n type DeletionEntry,\n type LapisFilter,\n type SequenceType,\n type SubstitutionEntry,\n type SubstitutionOrDeletionEntry,\n type TemporalGranularity,\n} from '../types';\nimport { type Map2d } from '../utils/map2d';\nimport {\n type Deletion,\n type DeletionClass,\n type Substitution,\n type SubstitutionClass,\n toSubstitutionOrDeletion,\n} from '../utils/mutations';\nimport {\n compareTemporal,\n dateRangeCompare,\n generateAllInRange,\n getMinMaxTemporal,\n parseDateStringToTemporal,\n type Temporal,\n type TemporalClass,\n toTemporal,\n} from '../utils/temporalClass';\n\nexport type MutationOverTimeData = {\n date: TemporalClass;\n mutations: SubstitutionOrDeletionEntry[];\n totalCount: number;\n};\n\nexport type MutationOverTimeMutationValue = { proportion: number; count: number; totalCount: number };\nexport type MutationOverTimeDataGroupedByMutation = Map2d<\n SubstitutionClass | DeletionClass,\n TemporalClass,\n MutationOverTimeMutationValue\n>;\n\nconst MAX_NUMBER_OF_GRID_COLUMNS = 200;\n\nexport async function queryOverallMutationData({\n lapisFilter,\n sequenceType,\n lapis,\n granularity,\n lapisDateField,\n signal,\n}: {\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n lapis: string;\n granularity: TemporalGranularity;\n lapisDateField: string;\n signal?: AbortSignal;\n}) {\n const allDates = await getDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);\n\n if (allDates.length === 0) {\n return {\n content: [],\n };\n }\n\n const filter = {\n ...lapisFilter,\n [`${lapisDateField}From`]: allDates[0].firstDay.toString(),\n [`${lapisDateField}To`]: allDates[allDates.length - 1].lastDay.toString(),\n };\n\n return fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType).evaluate(lapis, signal);\n}\n\nexport type MutationOverTimeQuery = {\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n lapis: string;\n lapisDateField: string;\n granularity: TemporalGranularity;\n signal?: AbortSignal;\n};\n\nexport async function queryMutationsOverTimeData({\n lapisFilter,\n sequenceType,\n lapis,\n lapisDateField,\n granularity,\n signal,\n}: MutationOverTimeQuery) {\n const allDates = await getDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);\n\n if (allDates.length > MAX_NUMBER_OF_GRID_COLUMNS) {\n throw new UserFacingError(\n 'Too many dates',\n `The dataset would contain ${allDates.length} date intervals. ` +\n `Please reduce the number to below ${MAX_NUMBER_OF_GRID_COLUMNS} to display the data. ` +\n 'You can achieve this by either narrowing the date range in the provided LAPIS filter or by selecting a larger granularity.',\n );\n }\n\n const subQueries = allDates.map(async (date) => {\n const dateFrom = date.firstDay.toString();\n const dateTo = date.lastDay.toString();\n\n const filter = {\n ...lapisFilter,\n [`${lapisDateField}From`]: dateFrom,\n [`${lapisDateField}To`]: dateTo,\n };\n\n const data = await fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType).evaluate(lapis, signal);\n const totalCountQuery = await getTotalNumberOfSequencesInDateRange(filter).evaluate(lapis, signal);\n return {\n date,\n mutations: data.content,\n totalCount: totalCountQuery.content[0].count,\n };\n });\n\n const data = await Promise.all(subQueries);\n\n const overallMutationsData = (\n await queryOverallMutationData({\n lapisFilter,\n sequenceType,\n lapis,\n lapisDateField,\n granularity,\n })\n ).content;\n\n return {\n mutationOverTimeData: groupByMutation(data, overallMutationsData),\n overallMutationData: overallMutationsData,\n };\n}\n\nasync function getDatesInDataset(\n lapisFilter: LapisFilter,\n lapis: string,\n granularity: TemporalGranularity,\n lapisDateField: string,\n signal: AbortSignal | undefined,\n) {\n const { content: availableDates } = await queryAvailableDates(\n lapisFilter,\n lapis,\n granularity,\n lapisDateField,\n signal,\n );\n\n const { dateFrom, dateTo } = getDateRangeFromFilter(lapisFilter, lapisDateField, granularity);\n const { min, max } = getMinMaxTemporal(availableDates);\n\n return generateAllInRange(dateFrom ?? min, dateTo ?? max);\n}\n\nfunction getDateRangeFromFilter(lapisFilter: LapisFilter, lapisDateField: string, granularity: TemporalGranularity) {\n const valueFromFilter = lapisFilter[lapisDateField] as string | null;\n\n if (valueFromFilter) {\n return {\n dateFrom: parseDateStringToTemporal(valueFromFilter, granularity),\n dateTo: parseDateStringToTemporal(valueFromFilter, granularity),\n };\n }\n\n const minFromFilter = lapisFilter[`${lapisDateField}From`] as string | null;\n const maxFromFilter = lapisFilter[`${lapisDateField}To`] as string | null;\n\n return {\n dateFrom: minFromFilter ? parseDateStringToTemporal(minFromFilter, granularity) : null,\n dateTo: maxFromFilter ? parseDateStringToTemporal(maxFromFilter, granularity) : null,\n };\n}\n\nfunction queryAvailableDates(\n lapisFilter: LapisFilter,\n lapis: string,\n granularity: TemporalGranularity,\n lapisDateField: string,\n signal?: AbortSignal,\n) {\n return fetchAndPrepareDates(lapisFilter, granularity, lapisDateField).evaluate(lapis, signal);\n}\n\nfunction fetchAndPrepareDates<LapisDateField extends string>(\n filter: LapisFilter,\n granularity: TemporalGranularity,\n lapisDateField: LapisDateField,\n) {\n const fetchData = new FetchAggregatedOperator<{ [key in LapisDateField]: string | null }>(filter, [lapisDateField]);\n const dataWithFixedDateKey = new RenameFieldOperator(fetchData, lapisDateField, 'date');\n const mapData = new MapOperator(dataWithFixedDateKey, (data) => mapDateToGranularityRange(data, granularity));\n const groupByData = new GroupByAndSumOperator(mapData, 'dateRange', 'count');\n const sortData = new SortOperator(groupByData, dateRangeCompare);\n return new MapOperator(sortData, (data) => data.dateRange);\n}\n\nfunction fetchAndPrepareSubstitutionsOrDeletions(filter: LapisFilter, sequenceType: SequenceType) {\n return new FetchSubstitutionsOrDeletionsOperator(filter, sequenceType, 0.001);\n}\n\nexport function serializeSubstitutionOrDeletion(mutation: Substitution | Deletion) {\n return mutation.code;\n}\n\nexport function serializeTemporal(date: Temporal) {\n return date.dateString;\n}\n\nexport function groupByMutation(\n data: MutationOverTimeData[],\n overallMutationData: (SubstitutionEntry | DeletionEntry)[],\n) {\n const dataArray = new BaseMutationOverTimeDataMap();\n\n const allDates = data.map((mutationData) => mutationData.date);\n\n const sortedOverallMutationData = overallMutationData\n .sort((a, b) => sortSubstitutionsAndDeletions(a.mutation, b.mutation))\n .map((entry) => {\n return toSubstitutionOrDeletion(entry.mutation);\n });\n const sortedDates = allDates.sort((a, b) => compareTemporal(a, b)).map((date) => toTemporal(date));\n\n sortedOverallMutationData.forEach((mutationData) => {\n sortedDates.forEach((date) => {\n dataArray.set(mutationData, date, {\n count: 0,\n proportion: 0,\n totalCount: 0,\n });\n });\n });\n\n data.forEach((mutationData) => {\n mutationData.mutations.forEach((mutationEntry) => {\n const mutation = toSubstitutionOrDeletion(mutationEntry.mutation);\n const date = toTemporal(mutationData.date);\n\n if (dataArray.get(mutation, date) !== undefined) {\n dataArray.set(mutation, date, {\n count: mutationEntry.count,\n proportion: mutationEntry.proportion,\n totalCount: mutationData.totalCount,\n });\n }\n });\n });\n\n return dataArray;\n}\n\nfunction getTotalNumberOfSequencesInDateRange(filter: LapisFilter) {\n return new FetchAggregatedOperator<{ count: number }>(filter);\n}\n","export interface Map2d<Key1, Key2, Value> {\n get(keyFirstAxis: Key1, keySecondAxis: Key2): Value | undefined;\n\n set(keyFirstAxis: Key1, keySecondAxis: Key2, value: Value): void;\n\n getRow(key: Key1, fillEmptyWith: Value): Value[];\n\n deleteRow(key: Key1): void;\n\n getFirstAxisKeys(): Key1[];\n\n getSecondAxisKeys(): Key2[];\n\n getAsArray(fillEmptyWith: Value): Value[][];\n\n serializeFirstAxis(key: Key1): string;\n\n serializeSecondAxis(key: Key2): string;\n\n readonly keysFirstAxis: Map<string, Key1>;\n readonly keysSecondAxis: Map<string, Key2>;\n}\n\nexport type Map2DContents<Key1, Key2, Value> = {\n keysFirstAxis: Map<string, Key1>;\n keysSecondAxis: Map<string, Key2>;\n data: Map<string, Map<string, Value>>;\n};\n\nexport class Map2dBase<Key1 extends object | string, Key2 extends object | string, Value>\n implements Map2d<Key1, Key2, Value>\n{\n readonly data: Map<string, Map<string, Value>> = new Map<string, Map<string, Value>>();\n readonly keysFirstAxis = new Map<string, Key1>();\n readonly keysSecondAxis = new Map<string, Key2>();\n\n constructor(\n readonly serializeFirstAxis: (key: Key1) => string,\n readonly serializeSecondAxis: (key: Key2) => string,\n initialContent?: Map2DContents<Key1, Key2, Value>,\n ) {\n if (initialContent) {\n this.keysFirstAxis = new Map(initialContent.keysFirstAxis);\n this.keysSecondAxis = new Map(initialContent.keysSecondAxis);\n this.data = new Map(initialContent.data);\n }\n }\n\n get(keyFirstAxis: Key1, keySecondAxis: Key2) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(keyFirstAxis);\n const serializedKeySecondAxis = this.serializeSecondAxis(keySecondAxis);\n return this.data.get(serializedKeyFirstAxis)?.get(serializedKeySecondAxis);\n }\n\n getRow(key: Key1, fillEmptyWith: Value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n const row = this.data.get(serializedKeyFirstAxis);\n if (row === undefined) {\n return [];\n }\n return Array.from(this.keysSecondAxis.keys()).map((key) => row.get(key) ?? fillEmptyWith);\n }\n\n set(keyFirstAxis: Key1, keySecondAxis: Key2, value: Value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(keyFirstAxis);\n const serializedKeySecondAxis = this.serializeSecondAxis(keySecondAxis);\n\n if (!this.data.has(serializedKeyFirstAxis)) {\n this.data.set(serializedKeyFirstAxis, new Map<string, Value>());\n }\n\n this.data.get(serializedKeyFirstAxis)!.set(serializedKeySecondAxis, value);\n\n this.keysFirstAxis.set(serializedKeyFirstAxis, keyFirstAxis);\n this.keysSecondAxis.set(serializedKeySecondAxis, keySecondAxis);\n }\n\n deleteRow(key: Key1) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n this.data.delete(serializedKeyFirstAxis);\n this.keysFirstAxis.delete(serializedKeyFirstAxis);\n }\n\n getFirstAxisKeys() {\n return Array.from(this.keysFirstAxis.values());\n }\n\n getSecondAxisKeys() {\n return Array.from(this.keysSecondAxis.values());\n }\n\n getAsArray(fillEmptyWith: Value) {\n return this.getFirstAxisKeys().map((firstAxisKey) => {\n return this.getSecondAxisKeys().map((secondAxisKey) => {\n return this.get(firstAxisKey, secondAxisKey) ?? fillEmptyWith;\n });\n });\n }\n\n getContents(): Map2DContents<Key1, Key2, Value> {\n return {\n keysFirstAxis: this.keysFirstAxis,\n keysSecondAxis: this.keysSecondAxis,\n data: this.data,\n };\n }\n}\n\nexport class Map2dView<Key1 extends object | string, Key2 extends object | string, Value>\n implements Map2d<Key1, Key2, Value>\n{\n readonly keysFirstAxis;\n readonly keysSecondAxis;\n\n readonly baseMap: Map2d<Key1, Key2, Value>;\n\n constructor(map: Map2d<Key1, Key2, Value>) {\n this.keysFirstAxis = new Map(map.keysFirstAxis);\n this.keysSecondAxis = new Map(map.keysSecondAxis);\n\n if (map instanceof Map2dView) {\n this.baseMap = map.baseMap;\n }\n this.baseMap = map;\n }\n\n serializeFirstAxis(key: Key1) {\n return this.baseMap.serializeFirstAxis(key);\n }\n\n serializeSecondAxis(key: Key2) {\n return this.baseMap.serializeSecondAxis(key);\n }\n\n deleteRow(key: Key1) {\n this.keysFirstAxis.delete(this.serializeFirstAxis(key));\n }\n\n get(keyFirstAxis: Key1, keySecondAxis: Key2) {\n const firstAxisKey = this.serializeFirstAxis(keyFirstAxis);\n const secondAxisKey = this.serializeSecondAxis(keySecondAxis);\n\n if (!this.keysFirstAxis.has(firstAxisKey) || !this.keysSecondAxis.has(secondAxisKey)) {\n return undefined;\n }\n\n return this.baseMap.get(keyFirstAxis, keySecondAxis);\n }\n\n set() {\n throw new Error('Cannot set value on a Map2dView');\n }\n\n getFirstAxisKeys() {\n return Array.from(this.keysFirstAxis.values());\n }\n\n getSecondAxisKeys() {\n return Array.from(this.keysSecondAxis.values());\n }\n\n getAsArray(fillEmptyWith: Value) {\n return this.getFirstAxisKeys().map((firstAxisKey) => {\n return this.getSecondAxisKeys().map((secondAxisKey) => {\n return this.baseMap.get(firstAxisKey, secondAxisKey) ?? fillEmptyWith;\n });\n });\n }\n\n getRow(key: Key1, fillEmptyWith: Value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n if (!this.keysFirstAxis.has(serializedKeyFirstAxis)) {\n return [];\n }\n\n return this.baseMap.getRow(key, fillEmptyWith);\n }\n}\n","import {\n type MutationOverTimeMutationValue,\n serializeSubstitutionOrDeletion,\n serializeTemporal,\n} from '../../query/queryMutationsOverTime';\nimport { type Map2d, Map2dBase, type Map2DContents } from '../../utils/map2d';\nimport type { Deletion, Substitution } from '../../utils/mutations';\nimport type { Temporal } from '../../utils/temporalClass';\n\nexport type MutationOverTimeDataMap = Map2d<Substitution | Deletion, Temporal, MutationOverTimeMutationValue>;\n\nexport class BaseMutationOverTimeDataMap extends Map2dBase<\n Substitution | Deletion,\n Temporal,\n MutationOverTimeMutationValue\n> {\n constructor(initialContent?: Map2DContents<Substitution | Deletion, Temporal, MutationOverTimeMutationValue>) {\n super(serializeSubstitutionOrDeletion, serializeTemporal, initialContent);\n }\n}\n","import { type MutationOverTimeDataMap } from './MutationOverTimeData';\nimport { type SubstitutionOrDeletionEntry } from '../../types';\nimport { Map2dView } from '../../utils/map2d';\nimport type { Deletion, Substitution } from '../../utils/mutations';\nimport type { DisplayedMutationType } from '../components/mutation-type-selector';\nimport type { DisplayedSegment } from '../components/segment-selector';\n\nexport function getFilteredMutationOverTimeData(\n data: MutationOverTimeDataMap,\n overallMutationData: SubstitutionOrDeletionEntry<Substitution, Deletion>[],\n displayedSegments: DisplayedSegment[],\n displayedMutationTypes: DisplayedMutationType[],\n proportionInterval: { min: number; max: number },\n) {\n const filteredData = new Map2dView(data);\n\n const mutationsToFilterOut = overallMutationData.filter((entry) => {\n if (entry.proportion < proportionInterval.min || entry.proportion > proportionInterval.max) {\n return true;\n }\n if (displayedSegments.some((segment) => segment.segment === entry.mutation.segment && !segment.checked)) {\n return true;\n }\n return displayedMutationTypes.some(\n (mutationType) => mutationType.type === entry.mutation.type && !mutationType.checked,\n );\n });\n\n mutationsToFilterOut.forEach((entry) => {\n filteredData.deleteRow(entry.mutation);\n });\n\n return filteredData;\n}\n","import { type FunctionComponent } from 'preact';\n\nimport { MinMaxRangeSlider } from './min-max-range-slider';\nimport { type GraphColor, singleGraphColorRGBByName } from '../shared/charts/colors';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface ColorScale {\n min: number;\n max: number;\n color: GraphColor;\n}\n\nexport interface ColorScaleSelectorProps {\n colorScale: ColorScale;\n setColorScale: (colorScale: ColorScale) => void;\n}\n\nexport const ColorScaleSelector: FunctionComponent<ColorScaleSelectorProps> = ({ colorScale, setColorScale }) => {\n const colorDisplayCss = `w-10 h-8 border border-gray-200 mx-2 text-xs flex items-center justify-center`;\n\n return (\n <div className='flex items-center'>\n <div\n style={{\n backgroundColor: singleGraphColorRGBByName(colorScale.color, 0),\n color: 'black',\n }}\n className={colorDisplayCss}\n >\n {formatProportion(colorScale.min, 0)}\n </div>\n <div className='w-64'>\n <MinMaxRangeSlider\n min={colorScale.min * 100}\n max={colorScale.max * 100}\n setMin={(percentage) => {\n setColorScale({ ...colorScale, min: percentage / 100 });\n }}\n setMax={(percentage) => {\n setColorScale({ ...colorScale, max: percentage / 100 });\n }}\n />\n </div>\n <div\n style={{\n backgroundColor: singleGraphColorRGBByName(colorScale.color, 1),\n color: 'white',\n }}\n className={colorDisplayCss}\n >\n {formatProportion(colorScale.max, 0)}\n </div>\n </div>\n );\n};\n\nexport const getColorWithingScale = (value: number, colorScale: ColorScale) => {\n if (colorScale.min === colorScale.max) {\n return singleGraphColorRGBByName(colorScale.color, 0);\n }\n\n const colorRange = colorScale.max - colorScale.min;\n\n const alpha = (value - colorScale.min) / colorRange;\n\n return singleGraphColorRGBByName(colorScale.color, alpha);\n};\n\nexport const getTextColorForScale = (value: number, colorScale: ColorScale) => {\n if (colorScale.min === colorScale.max) {\n return 'black';\n }\n\n const colorRange = colorScale.max - colorScale.min;\n\n const alpha = (value - colorScale.min) / colorRange;\n\n return alpha <= 0.5 ? 'black' : 'white';\n};\n","import { type FunctionComponent } from 'preact';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nexport type TooltipPosition =\n | 'top'\n | 'top-start'\n | 'top-end'\n | 'bottom'\n | 'bottom-start'\n | 'bottom-end'\n | 'left'\n | 'right';\n\nexport type TooltipProps = {\n content: string | JSXInternal.Element;\n position?: TooltipPosition;\n};\n\nfunction getPositionCss(position?: TooltipPosition) {\n switch (position) {\n case 'top':\n return 'bottom-full translate-x-[-50%] left-1/2 mb-1';\n case 'top-start':\n return 'bottom-full mr-1 mb-1';\n case 'top-end':\n return 'bottom-full right-0 ml-1 mb-1';\n case 'bottom':\n return 'top-full translate-x-[-50%] left-1/2 mt-1';\n case 'bottom-start':\n return 'mr-1 mt-1';\n case 'bottom-end':\n return 'right-0 ml-1 mt-1';\n case 'left':\n return 'right-full translate-y-[-50%] top-1/2 mr-1';\n case 'right':\n return 'left-full translate-y-[-50%] top-1/2 ml-1';\n case undefined:\n return '';\n }\n}\n\nconst Tooltip: FunctionComponent<TooltipProps> = ({ children, content, position = 'bottom' }) => {\n return (\n <div className='relative w-full h-full'>\n <div className='peer w-full h-full'>{children}</div>\n <div\n className={`absolute z-10 w-max bg-white p-4 border border-gray-200 rounded-md invisible peer-hover:visible ${getPositionCss(position)}`}\n >\n {content}\n </div>\n </div>\n );\n};\n\nexport default Tooltip;\n","import { Fragment, type FunctionComponent } from 'preact';\nimport { useRef } from 'preact/hooks';\n\nimport { type MutationOverTimeDataMap } from './MutationOverTimeData';\nimport { type MutationOverTimeMutationValue } from '../../query/queryMutationsOverTime';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport { type Temporal, type TemporalClass, toTemporalClass, YearMonthDayClass } from '../../utils/temporalClass';\nimport { type ColorScale, getColorWithingScale, getTextColorForScale } from '../components/color-scale-selector';\nimport Tooltip, { type TooltipPosition } from '../components/tooltip';\nimport { formatProportion } from '../shared/table/formatProportion';\n\nexport interface MutationsOverTimeGridProps {\n data: MutationOverTimeDataMap;\n colorScale: ColorScale;\n}\n\nconst MAX_NUMBER_OF_GRID_ROWS = 100;\nconst MUTATION_CELL_WIDTH_REM = 8;\n\nconst MutationsOverTimeGrid: FunctionComponent<MutationsOverTimeGridProps> = ({ data, colorScale }) => {\n const allMutations = data.getFirstAxisKeys();\n const shownMutations = allMutations.slice(0, MAX_NUMBER_OF_GRID_ROWS);\n\n const dates = data.getSecondAxisKeys();\n\n const gridRef = useRef<HTMLDivElement>(null);\n\n return (\n <>\n {allMutations.length > MAX_NUMBER_OF_GRID_ROWS && (\n <div className='pl-2'>\n Showing {MAX_NUMBER_OF_GRID_ROWS} of {allMutations.length} mutations. You can narrow the filter to\n reduce the number of mutations.\n </div>\n )}\n {allMutations.length === 0 && (\n <div className={'flex justify-center'}>No data available for your filters.</div>\n )}\n <div\n ref={gridRef}\n style={{\n display: 'grid',\n gridTemplateRows: `repeat(${shownMutations.length}, 24px)`,\n gridTemplateColumns: `${MUTATION_CELL_WIDTH_REM}rem repeat(${dates.length}, minmax(0.05rem, 1fr))`,\n }}\n className='@container'\n >\n {shownMutations.map((mutation, rowIndex) => {\n return (\n <Fragment key={`fragment-${mutation.toString()}`}>\n <div\n key={`mutation-${mutation.toString()}`}\n style={{ gridRowStart: rowIndex + 1, gridColumnStart: 1 }}\n >\n <MutationCell mutation={mutation} />\n </div>\n {dates.map((date, columnIndex) => {\n const value = data.get(mutation, date) ?? { proportion: 0, count: 0, totalCount: 0 };\n const tooltipPosition = getTooltipPosition(\n rowIndex,\n shownMutations.length,\n columnIndex,\n dates.length,\n );\n return (\n <div\n style={{ gridRowStart: rowIndex + 1, gridColumnStart: columnIndex + 2 }}\n key={`${mutation.toString()}-${date.toString()}`}\n >\n <ProportionCell\n value={value}\n date={date}\n mutation={mutation}\n tooltipPosition={tooltipPosition}\n colorScale={colorScale}\n />\n </div>\n );\n })}\n </Fragment>\n );\n })}\n </div>\n </>\n );\n};\n\nfunction getTooltipPosition(rowIndex: number, rows: number, columnIndex: number, columns: number) {\n const tooltipX = rowIndex < rows / 2 ? 'bottom' : 'top';\n const tooltipY = columnIndex < columns / 2 ? 'start' : 'end';\n return `${tooltipX}-${tooltipY}` as const;\n}\n\nconst ProportionCell: FunctionComponent<{\n value: MutationOverTimeMutationValue;\n date: Temporal;\n mutation: Substitution | Deletion;\n tooltipPosition: TooltipPosition;\n colorScale: ColorScale;\n}> = ({ value, mutation, date, tooltipPosition, colorScale }) => {\n const dateClass = toTemporalClass(date);\n\n const tooltipContent = (\n <div>\n <p>\n <span className='font-bold'>{dateClass.englishName()}</span>\n </p>\n <p>({timeIntervalDisplay(dateClass)})</p>\n <p>{mutation.code}</p>\n <p>Proportion: {formatProportion(value.proportion)}</p>\n <p>\n Count: {value.count} / {value.totalCount} total\n </p>\n </div>\n );\n\n return (\n <div className={'py-1 w-full h-full'}>\n <Tooltip content={tooltipContent} position={tooltipPosition}>\n <div\n style={{\n backgroundColor: getColorWithingScale(value.proportion, colorScale),\n color: getTextColorForScale(value.proportion, colorScale),\n }}\n className={`w-full h-full text-center hover:font-bold text-xs group`}\n >\n <span className='invisible @[30rem]:visible'>{formatProportion(value.proportion, 0)}</span>\n </div>\n </Tooltip>\n </div>\n );\n};\n\nconst timeIntervalDisplay = (date: TemporalClass) => {\n if (date instanceof YearMonthDayClass) {\n return date.toString();\n }\n\n return `${date.firstDay.toString()} - ${date.lastDay.toString()}`;\n};\n\nconst MutationCell: FunctionComponent<{ mutation: Substitution | Deletion }> = ({ mutation }) => {\n return <div className='text-center'>{mutation.code}</div>;\n};\n\nexport default MutationsOverTimeGrid;\n","import { type FunctionComponent } from 'preact';\n\nimport { ColorScaleSelector, type ColorScaleSelectorProps } from './color-scale-selector';\nimport { Dropdown } from './dropdown';\n\nexport type ColorScaleSelectorDropdownProps = ColorScaleSelectorProps;\n\nexport const ColorScaleSelectorDropdown: FunctionComponent<ColorScaleSelectorDropdownProps> = ({\n colorScale,\n setColorScale,\n}) => {\n return (\n <div className='w-20'>\n <Dropdown buttonTitle={`Color scale`} placement={'bottom-start'}>\n <ColorScaleSelector colorScale={colorScale} setColorScale={setColorScale} />\n </Dropdown>\n </div>\n );\n};\n","import { useEffect, useState } from 'preact/hooks';\n\nexport function useWebWorker<Request, Response>(messageToWorker: Request, worker: Worker) {\n const [data, setData] = useState<Response | undefined>(undefined);\n const [error, setError] = useState<Error | undefined>(undefined);\n const [isLoading, setIsLoading] = useState(true);\n\n useEffect(() => {\n worker.onmessage = (\n event: MessageEvent<{\n status: 'loading' | 'success' | 'error';\n data?: Response;\n error?: Error;\n }>,\n ) => {\n const { status, data, error } = event.data;\n\n switch (status) {\n case 'loading':\n setIsLoading(true);\n break;\n case 'success':\n setData(data);\n setError(undefined);\n setIsLoading(false);\n break;\n case 'error':\n setError(error);\n setIsLoading(false);\n break;\n default:\n throw new Error(`Unknown status: ${status}`);\n }\n };\n\n worker.onmessageerror = (event: MessageEvent) => {\n setError(new Error(`Worker received a message that it cannot deserialize: ${event.data}`));\n setIsLoading(false);\n };\n }, [worker]);\n\n useEffect(() => {\n worker.postMessage(messageToWorker);\n }, [messageToWorker, worker]);\n\n return { data, error, isLoading };\n}\n","import { type FunctionComponent } from 'preact';\nimport { type Dispatch, type StateUpdater, useContext, useMemo, useState } from 'preact/hooks';\n\n// @ts-expect-error -- uses subpath imports and vite worker import\nimport MutationOverTimeWorker from '#mutationOverTime?worker&inline';\nimport { BaseMutationOverTimeDataMap, type MutationOverTimeDataMap } from './MutationOverTimeData';\nimport { getFilteredMutationOverTimeData } from './getFilteredMutationsOverTimeData';\nimport { type MutationOverTimeWorkerResponse } from './mutationOverTimeWorker';\nimport MutationsOverTimeGrid from './mutations-over-time-grid';\nimport { type MutationOverTimeQuery } from '../../query/queryMutationsOverTime';\nimport {\n type LapisFilter,\n type SequenceType,\n type SubstitutionOrDeletionEntry,\n type TemporalGranularity,\n} from '../../types';\nimport { type Deletion, type Substitution } from '../../utils/mutations';\nimport { toTemporalClass } from '../../utils/temporalClass';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { type ColorScale } from '../components/color-scale-selector';\nimport { ColorScaleSelectorDropdown } from '../components/color-scale-selector-dropdown';\nimport { CsvDownloadButton } from '../components/csv-download-button';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Fullscreen } from '../components/fullscreen';\nimport Info, { InfoComponentCode, InfoHeadline1, InfoParagraph } from '../components/info';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { type DisplayedMutationType, MutationTypeSelector } from '../components/mutation-type-selector';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport type { ProportionInterval } from '../components/proportion-selector';\nimport { ProportionSelectorDropdown } from '../components/proportion-selector-dropdown';\nimport { ResizeContainer } from '../components/resize-container';\nimport { type DisplayedSegment, SegmentSelector, useDisplayedSegments } from '../components/segment-selector';\nimport Tabs from '../components/tabs';\nimport { useWebWorker } from '../webWorkers/useWebWorker';\n\nexport type View = 'grid';\n\nexport interface MutationsOverTimeProps {\n width: string;\n height: string;\n lapisFilter: LapisFilter;\n sequenceType: SequenceType;\n views: View[];\n granularity: TemporalGranularity;\n lapisDateField: string;\n}\n\nexport const MutationsOverTime: FunctionComponent<MutationsOverTimeProps> = (componentProps) => {\n const { width, height } = componentProps;\n const size = { height, width };\n\n return (\n <ErrorBoundary size={size}>\n <ResizeContainer size={size}>\n <MutationsOverTimeInner {...componentProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const MutationsOverTimeInner: FunctionComponent<MutationsOverTimeProps> = (componentProps) => {\n const lapis = useContext(LapisUrlContext);\n const { lapisFilter, sequenceType, granularity, lapisDateField } = componentProps;\n\n const messageToWorker = useMemo(() => {\n return {\n lapisFilter,\n sequenceType,\n granularity,\n lapisDateField,\n lapis,\n };\n }, [granularity, lapis, lapisDateField, lapisFilter, sequenceType]);\n\n const worker = useMemo(() => new MutationOverTimeWorker(), []);\n\n const { data, error, isLoading } = useWebWorker<MutationOverTimeQuery, MutationOverTimeWorkerResponse>(\n messageToWorker,\n worker,\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== undefined) {\n throw error;\n }\n\n if (data === null || data === undefined || data.overallMutationData.length === 0) {\n return <NoDataDisplay />;\n }\n\n const { overallMutationData, mutationOverTimeSerialized } = data;\n const mutationOverTimeData = new BaseMutationOverTimeDataMap(mutationOverTimeSerialized);\n return (\n <MutationsOverTimeTabs\n overallMutationData={overallMutationData}\n mutationOverTimeData={mutationOverTimeData}\n originalComponentProps={componentProps}\n />\n );\n};\n\ntype MutationOverTimeTabsProps = {\n mutationOverTimeData: BaseMutationOverTimeDataMap;\n originalComponentProps: MutationsOverTimeProps;\n overallMutationData: SubstitutionOrDeletionEntry<Substitution, Deletion>[];\n};\n\nconst MutationsOverTimeTabs: FunctionComponent<MutationOverTimeTabsProps> = ({\n mutationOverTimeData,\n originalComponentProps,\n overallMutationData,\n}) => {\n const [proportionInterval, setProportionInterval] = useState({ min: 0.05, max: 0.9 });\n const [colorScale, setColorScale] = useState<ColorScale>({ min: 0, max: 1, color: 'indigo' });\n\n const [displayedSegments, setDisplayedSegments] = useDisplayedSegments(originalComponentProps.sequenceType);\n const [displayedMutationTypes, setDisplayedMutationTypes] = useState<DisplayedMutationType[]>([\n { label: 'Substitutions', checked: true, type: 'substitution' },\n { label: 'Deletions', checked: true, type: 'deletion' },\n ]);\n\n const filteredData = useMemo(() => {\n return getFilteredMutationOverTimeData(\n mutationOverTimeData,\n overallMutationData,\n displayedSegments,\n displayedMutationTypes,\n proportionInterval,\n );\n }, [mutationOverTimeData, overallMutationData, displayedSegments, displayedMutationTypes, proportionInterval]);\n\n const getTab = (view: View) => {\n if (filteredData === undefined) {\n return {\n title: 'Calculating',\n content: <LoadingDisplay />,\n };\n }\n switch (view) {\n case 'grid':\n return {\n title: 'Grid',\n content: <MutationsOverTimeGrid data={filteredData} colorScale={colorScale} />,\n };\n }\n };\n\n const tabs = originalComponentProps.views.map((view) => getTab(view));\n\n const toolbar = (activeTab: string) => (\n <Toolbar\n activeTab={activeTab}\n displayedSegments={displayedSegments}\n setDisplayedSegments={setDisplayedSegments}\n displayedMutationTypes={displayedMutationTypes}\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n proportionInterval={proportionInterval}\n setProportionInterval={setProportionInterval}\n filteredData={filteredData}\n colorScale={colorScale}\n setColorScale={setColorScale}\n originalComponentProps={originalComponentProps}\n />\n );\n\n return <Tabs tabs={tabs} toolbar={toolbar} />;\n};\n\ntype ToolbarProps = {\n activeTab: string;\n displayedSegments: DisplayedSegment[];\n setDisplayedSegments: (segments: DisplayedSegment[]) => void;\n displayedMutationTypes: DisplayedMutationType[];\n setDisplayedMutationTypes: (types: DisplayedMutationType[]) => void;\n proportionInterval: ProportionInterval;\n setProportionInterval: Dispatch<StateUpdater<ProportionInterval>>;\n filteredData: MutationOverTimeDataMap;\n colorScale: ColorScale;\n setColorScale: Dispatch<StateUpdater<ColorScale>>;\n originalComponentProps: MutationsOverTimeProps;\n};\n\nconst Toolbar: FunctionComponent<ToolbarProps> = ({\n activeTab,\n displayedSegments,\n setDisplayedSegments,\n displayedMutationTypes,\n setDisplayedMutationTypes,\n proportionInterval,\n setProportionInterval,\n filteredData,\n colorScale,\n setColorScale,\n originalComponentProps,\n}) => {\n return (\n <>\n {activeTab === 'Grid' && (\n <ColorScaleSelectorDropdown colorScale={colorScale} setColorScale={setColorScale} />\n )}\n <SegmentSelector displayedSegments={displayedSegments} setDisplayedSegments={setDisplayedSegments} />\n <MutationTypeSelector\n setDisplayedMutationTypes={setDisplayedMutationTypes}\n displayedMutationTypes={displayedMutationTypes}\n />\n <ProportionSelectorDropdown\n proportionInterval={proportionInterval}\n setMinProportion={(min) => setProportionInterval((prev) => ({ ...prev, min }))}\n setMaxProportion={(max) => setProportionInterval((prev) => ({ ...prev, max }))}\n labelPrefix='Mean proportion'\n />\n <CsvDownloadButton\n className='mx-1 btn btn-xs'\n getData={() => getDownloadData(filteredData)}\n filename='mutations_over_time.csv'\n />\n <MutationsOverTimeInfo originalComponentProps={originalComponentProps} />\n <Fullscreen />\n </>\n );\n};\n\ntype MutationsOverTimeInfoProps = {\n originalComponentProps: MutationsOverTimeProps;\n};\n\nconst MutationsOverTimeInfo: FunctionComponent<MutationsOverTimeInfoProps> = ({ originalComponentProps }) => {\n const lapis = useContext(LapisUrlContext);\n return (\n <Info>\n <InfoHeadline1>Mutations over time</InfoHeadline1>\n <InfoParagraph>\n This presents the proportions of {originalComponentProps.sequenceType} mutations per{' '}\n {originalComponentProps.granularity}. In the toolbar, you can configure which mutations are displayed by\n selecting the mutation type (substitution or deletion), choosing specific segments/genes (if the\n organism has multiple segments/genes), and applying a filter based on the proportion of the mutation's\n occurrence over the entire time range.\n </InfoParagraph>\n <InfoComponentCode componentName='mutations-over-time' params={originalComponentProps} lapisUrl={lapis} />\n </Info>\n );\n};\n\nfunction getDownloadData(filteredData: MutationOverTimeDataMap) {\n const dates = filteredData.getSecondAxisKeys().map((date) => toTemporalClass(date));\n\n return filteredData.getFirstAxisKeys().map((mutation) => {\n return dates.reduce(\n (accumulated, date) => {\n const proportion = filteredData.get(mutation, date)?.proportion ?? 0;\n return {\n ...accumulated,\n [date.dateString]: proportion,\n };\n },\n { mutation: mutation.code },\n );\n });\n}\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { MutationsOverTime, type MutationsOverTimeProps } from '../../preact/mutationsOverTime/mutations-over-time';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapterWithGridJsStyles } from '../PreactLitAdapterWithGridJsStyles';\n\n/**\n * ## Context\n *\n * This component displays mutations (substitutions and deletions) over time for a dataset selected by a LAPIS filter.\n * The shown date range is determined by the date field in the LAPIS filter.\n * If the date field is not set, the date range is determined by all available dates in the dataset.\n *\n * ## Views\n *\n * ### Grid View\n *\n * The grid view shows the proportion for each mutation over date ranges.\n *\n * The grid limits the number of rows and columns for browser performance reasons as\n * too much data might make the browser unresponsive.\n *\n * The number of columns is limited to 200.\n * If this number are exceeded, an error message will be shown.\n * It is your responsibility to make sure that this does not happen.\n * Depending on the selected date range in the `lapisFilter`, you can adapt the granularity accordingly\n * (e.g. use months instead of days).\n *\n * The number of rows is limited to 100.\n * If there are more, the component will only show 100 mutations and notify the user.\n */\n@customElement('gs-mutations-over-time')\nexport class MutationsOverTimeComponent extends PreactLitAdapterWithGridJsStyles {\n /**\n * Required.\n *\n * LAPIS filter to select the displayed data.\n */\n @property({ type: Object })\n lapisFilter: Record<string, string | number | null | boolean> = {};\n\n /**\n * The type of the sequence for which the mutations should be shown.\n */\n @property({ type: String })\n sequenceType: 'nucleotide' | 'amino acid' = 'nucleotide';\n\n /**\n * A list of tabs with views that this component should provide.\n */\n @property({ type: Array })\n views: 'grid'[] = ['grid'];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The height of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n height: string = '700px';\n\n /**\n * The granularity of the time axis.\n */\n @property({ type: String })\n granularity: 'day' | 'week' | 'month' | 'year' = 'week';\n\n /**\n * Required.\n *\n * The LAPIS field that the data should be aggregated by.\n * The values will be used for the columns of the grid.\n * Must be a field of type `date` in LAPIS.\n */\n @property({ type: String })\n lapisDateField: string = 'date';\n\n override render() {\n return (\n <MutationsOverTime\n lapisFilter={this.lapisFilter}\n sequenceType={this.sequenceType}\n views={this.views}\n width={this.width}\n height={this.height}\n granularity={this.granularity}\n lapisDateField={this.lapisDateField}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutations-over-time': MutationsOverTimeComponent;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutations-over-time': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype LapisFilterMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.lapisFilter, MutationsOverTimeProps['lapisFilter']>\n>;\ntype SequenceTypeMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.sequenceType, MutationsOverTimeProps['sequenceType']>\n>;\ntype ViewsMatches = Expect<Equals<typeof MutationsOverTimeComponent.prototype.views, MutationsOverTimeProps['views']>>;\ntype WidthMatches = Expect<Equals<typeof MutationsOverTimeComponent.prototype.width, MutationsOverTimeProps['width']>>;\ntype HeightMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.height, MutationsOverTimeProps['height']>\n>;\ntype GranularityMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.granularity, MutationsOverTimeProps['granularity']>\n>;\ntype LapisDateFieldMatches = Expect<\n Equals<typeof MutationsOverTimeComponent.prototype.lapisDateField, MutationsOverTimeProps['lapisDateField']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type DateRangeOption } from './dateRangeOption';\n\nexport const getSelectableOptions = (dateRangeOptions: DateRangeOption[]) => {\n return dateRangeOptions.map((customSelectOption) => {\n return { label: customSelectOption.label, value: customSelectOption.label };\n });\n};\n\nexport const getDatesForSelectorValue = (\n initialSelectedDateRange: string | undefined,\n dateRangeOptions: DateRangeOption[],\n earliestDate: string,\n) => {\n const today = new Date();\n const defaultDates = { dateFrom: new Date(earliestDate), dateTo: today };\n\n if (initialSelectedDateRange === undefined) {\n return defaultDates;\n }\n\n const dateRangeOption = dateRangeOptions.find((option) => option.label === initialSelectedDateRange);\n if (dateRangeOption) {\n return {\n dateFrom: new Date(dateRangeOption.dateFrom ?? earliestDate),\n dateTo: new Date(dateRangeOption.dateTo ?? today),\n };\n }\n\n return defaultDates;\n};\n","import { type DateRangeOption } from './dateRangeOption';\nimport { getDatesForSelectorValue, getSelectableOptions } from './selectableOptions';\nimport { UserFacingError } from '../components/error-display';\n\nexport function computeInitialValues(\n initialValue: string | undefined,\n initialDateFrom: string | undefined,\n initialDateTo: string | undefined,\n earliestDate: string,\n dateRangeOptions: DateRangeOption[],\n): {\n initialSelectedDateRange: string | undefined;\n initialSelectedDateFrom: Date;\n initialSelectedDateTo: Date;\n} {\n if (isUndefinedOrEmpty(initialDateFrom) && isUndefinedOrEmpty(initialDateTo)) {\n const selectableOptions = getSelectableOptions(dateRangeOptions);\n const initialSelectedDateRange = selectableOptions.find((option) => option.value === initialValue)?.value;\n\n if (initialValue !== undefined && initialSelectedDateRange === undefined) {\n throw new UserFacingError(\n 'Invalid initialValue',\n `Invalid initialValue \"${initialValue}\", It must be one of ${selectableOptions.map((option) => `'${option.value}'`).join(', ')}`,\n );\n }\n\n const { dateFrom, dateTo } = getDatesForSelectorValue(initialSelectedDateRange, dateRangeOptions, earliestDate);\n\n return {\n initialSelectedDateRange,\n initialSelectedDateFrom: dateFrom,\n initialSelectedDateTo: dateTo,\n };\n }\n\n const initialSelectedDateFrom = isUndefinedOrEmpty(initialDateFrom)\n ? new Date(earliestDate)\n : new Date(initialDateFrom);\n let initialSelectedDateTo = isUndefinedOrEmpty(initialDateTo) ? new Date() : new Date(initialDateTo);\n\n if (isNaN(initialSelectedDateFrom.getTime())) {\n throw new UserFacingError(\n 'Invalid initialDateFrom',\n `Invalid initialDateFrom \"${initialDateFrom}\", It must be of the format YYYY-MM-DD`,\n );\n }\n if (isNaN(initialSelectedDateTo.getTime())) {\n throw new UserFacingError(\n 'Invalid initialDateTo',\n `Invalid initialDateTo \"${initialDateTo}\", It must be of the format YYYY-MM-DD`,\n );\n }\n\n if (initialSelectedDateFrom > initialSelectedDateTo) {\n initialSelectedDateTo = initialSelectedDateFrom;\n }\n\n return {\n initialSelectedDateRange: undefined,\n initialSelectedDateFrom,\n initialSelectedDateTo,\n };\n}\n\nfunction isUndefinedOrEmpty(value: string | undefined): value is undefined | '' {\n return value === undefined || value === '';\n}\n","export const toYYYYMMDD = (date?: Date) => {\n if (!date) {\n return undefined;\n }\n\n const options: Intl.DateTimeFormatOptions = { year: 'numeric', month: '2-digit', day: '2-digit' };\n return date.toLocaleDateString('en-CA', options);\n};\n","import flatpickr from 'flatpickr';\nimport 'flatpickr/dist/flatpickr.min.css';\nimport { useEffect, useRef, useState } from 'preact/hooks';\n\nimport { computeInitialValues } from './computeInitialValues';\nimport { toYYYYMMDD } from './dateConversion';\nimport { type DateRangeOption } from './dateRangeOption';\nimport { getDatesForSelectorValue, getSelectableOptions } from './selectableOptions';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { Select } from '../components/select';\nimport type { ScaleType } from '../shared/charts/getYAxisScale';\n\nconst customOption = 'Custom';\n\nexport interface DateRangeSelectorProps extends DateRangeSelectorPropsInner {\n width: string;\n}\n\nexport interface DateRangeSelectorPropsInner {\n dateRangeOptions: DateRangeOption[];\n earliestDate: string;\n initialValue: string | undefined;\n initialDateFrom: string;\n initialDateTo: string;\n dateColumn: string;\n}\n\nexport const DateRangeSelector = ({ width, ...innerProps }: DateRangeSelectorProps) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal'>\n <div style={{ width }}>\n <DateRangeSelectorInner {...innerProps} />\n </div>\n </ErrorBoundary>\n );\n};\n\nexport const DateRangeSelectorInner = ({\n dateRangeOptions,\n earliestDate = '1900-01-01',\n initialValue,\n dateColumn,\n initialDateFrom,\n initialDateTo,\n}: DateRangeSelectorPropsInner) => {\n const initialValues = computeInitialValues(\n initialValue,\n initialDateFrom,\n initialDateTo,\n earliestDate,\n dateRangeOptions,\n );\n\n const fromDatePickerRef = useRef<HTMLInputElement>(null);\n const toDatePickerRef = useRef<HTMLInputElement>(null);\n const divRef = useRef<HTMLDivElement>(null);\n const [dateFromPicker, setDateFromPicker] = useState<flatpickr.Instance | null>(null);\n const [dateToPicker, setDateToPicker] = useState<flatpickr.Instance | null>(null);\n\n const [selectedDateRange, setSelectedDateRange] = useState<string | undefined>(\n initialValues.initialSelectedDateRange,\n );\n\n const [selectedDates, setSelectedDates] = useState<{ dateFrom: Date; dateTo: Date }>({\n dateFrom: initialValues.initialSelectedDateFrom,\n dateTo: initialValues.initialSelectedDateTo,\n });\n\n useEffect(() => {\n const commonConfig = {\n allowInput: true,\n dateFormat: 'Y-m-d',\n };\n\n if (fromDatePickerRef.current) {\n setDateFromPicker(\n flatpickr(fromDatePickerRef.current, {\n ...commonConfig,\n defaultDate: selectedDates.dateFrom,\n }),\n );\n }\n\n if (toDatePickerRef.current) {\n setDateToPicker(\n flatpickr(toDatePickerRef.current, {\n ...commonConfig,\n defaultDate: selectedDates.dateTo,\n }),\n );\n }\n\n return () => {\n dateFromPicker?.destroy();\n dateToPicker?.destroy();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [fromDatePickerRef, toDatePickerRef]);\n\n const onSelectChange = (value: string) => {\n setSelectedDateRange(value);\n\n const dateRange = getDatesForSelectorValue(value, dateRangeOptions, earliestDate);\n\n dateToPicker?.set('minDate', dateRange.dateFrom);\n dateFromPicker?.set('maxDate', dateRange.dateTo);\n\n dateFromPicker?.setDate(dateRange.dateFrom);\n dateToPicker?.setDate(dateRange.dateTo);\n\n setSelectedDates({\n dateFrom: dateRange.dateFrom,\n dateTo: dateRange.dateTo,\n });\n\n submit();\n };\n\n const onChangeDateFrom = () => {\n if (selectedDates.dateFrom.toDateString() === dateFromPicker?.selectedDates[0].toDateString()) {\n return;\n }\n\n selectedDates.dateFrom = dateFromPicker?.selectedDates[0] || new Date();\n dateToPicker?.set('minDate', dateFromPicker?.selectedDates[0]);\n setSelectedDateRange(customOption);\n\n submit();\n };\n\n const onChangeDateTo = () => {\n if (selectedDates.dateTo.toDateString() === dateToPicker?.selectedDates[0].toDateString()) {\n return;\n }\n\n selectedDates.dateTo = dateToPicker?.selectedDates[0] || new Date();\n dateFromPicker?.set('maxDate', dateToPicker?.selectedDates[0]);\n setSelectedDateRange(customOption);\n\n submit();\n };\n\n const submit = () => {\n const dateFrom = toYYYYMMDD(dateFromPicker?.selectedDates[0]);\n const dateTo = toYYYYMMDD(dateToPicker?.selectedDates[0]);\n\n const detail = {\n ...(dateFrom !== undefined && { [`${dateColumn}From`]: dateFrom }),\n ...(dateTo !== undefined && { [`${dateColumn}To`]: dateTo }),\n };\n\n divRef.current?.dispatchEvent(\n new CustomEvent('gs-date-range-changed', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n return (\n <div class='flex flex-wrap' ref={divRef}>\n <Select\n items={[\n ...getSelectableOptions(dateRangeOptions),\n { label: customOption, value: customOption, disabled: true },\n ]}\n selected={selectedDateRange ?? customOption}\n selectStyle='select-bordered rounded-none flex-grow min-w-[7.5rem]'\n onChange={(event: Event) => {\n event.preventDefault();\n const select = event.target as HTMLSelectElement;\n const value = select.value as ScaleType;\n onSelectChange(value);\n }}\n />\n <div className={'flex flex-wrap flex-grow'}>\n <input\n class='input input-bordered rounded-none flex-grow w-[7.5rem]'\n type='text'\n placeholder='Date from'\n ref={fromDatePickerRef}\n onChange={onChangeDateFrom}\n onBlur={onChangeDateFrom}\n />\n <input\n class='input input-bordered rounded-none flex-grow w-[7.5rem]'\n type='text'\n placeholder='Date to'\n ref={toDatePickerRef}\n onChange={onChangeDateTo}\n onBlur={onChangeDateTo}\n />\n </div>\n </div>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { DateRangeSelector, type DateRangeSelectorProps } from '../../preact/dateRangeSelector/date-range-selector';\nimport { type Equals, type Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n * This component is a group of input fields designed to specify date range filters\n * for a given date column of this Lapis instance. It consists of 3 fields:\n *\n * - a select field to choose a predefined date range,\n * - an input field with an attached date picker for the start date,\n * - an input field with an attached date picker for the end date.\n *\n * Setting a value in the select field will overwrite the previous values of the start and end date.\n * Setting a value in either of the date pickers will set the select field to \"custom\",\n * which represents an arbitrary date range.\n *\n * @fires {CustomEvent<{ `${dateColumn}From`: string; `${dateColumn}To`: string; }>} gs-date-range-changed\n * Fired when:\n * - The select field is changed,\n * - A date is selected in either of the date pickers,\n * - A date was typed into either of the date input fields, and the input field loses focus (\"on blur\").\n * Contains the dates in the format `YYYY-MM-DD`.\n *\n * Example: For `dateColumn = yourDate`, an event with `detail` containing\n * ```\n * {\n * yourDataFrom: \"2021-01-01\",\n * yourDataTo: \"2021-12-31\"\n * }\n * ```\n * will be fired.\n */\n@customElement('gs-date-range-selector')\nexport class DateRangeSelectorComponent extends PreactLitAdapter {\n /**\n * An array of date range options that the select field should provide.\n * The `label` will be shown to the user, and it will be available as `initialValue`.\n * The dates must be in the format `YYYY-MM-DD`.\n *\n * If dateFrom or dateTo is not set, the component will default to the `earliestDate` or the current date.\n */\n @property({ type: Array })\n dateRangeOptions: { label: string; dateFrom?: string; dateTo?: string }[] = [];\n\n /**\n * The `dateFrom` value to use in the `allTimes` preset in the format `YYYY-MM-DD`.\n */\n @property({ type: String })\n earliestDate: string = '1900-01-01';\n\n /**\n * The initial value to use for this date range selector.\n * Must be a valid label from the `dateRangeOptions`.\n *\n * If the value is not set, the component will default to the range `earliestDate` until today.\n *\n * It will be overwritten if `initialDateFrom` or `initialDateTo` is set.\n *\n * We provide some options in `dateRangeOptionPresets` for convenience.\n */\n @property()\n initialValue: string | undefined = undefined;\n\n /**\n * A date string in the format `YYYY-MM-DD`.\n * If set, the date range selector will be initialized with the given date (overwriting `initialValue` to `custom`).\n * If `initialDateTo` is set, but this is unset, it will default to `earliestDate`.\n */\n @property()\n initialDateFrom: string = '';\n\n /**\n * A date string in the format `YYYY-MM-DD`.\n * If set, the date range selector will be initialized with the given date (overwriting `initialValue` to `custom`).\n * If `initialDateFrom` is set, but this is unset, it will default to the current date.\n */\n @property()\n initialDateTo: string = '';\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The name of the column in LAPIS that contains the date information.\n */\n @property({ type: String })\n dateColumn: string = 'date';\n\n override render() {\n return (\n <DateRangeSelector\n dateRangeOptions={this.dateRangeOptions}\n earliestDate={this.earliestDate}\n initialValue={this.initialValue}\n initialDateFrom={this.initialDateFrom}\n initialDateTo={this.initialDateTo}\n dateColumn={this.dateColumn}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-date-range-selector': DateRangeSelectorComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-date-range-changed': CustomEvent<Record<string, string>>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-date-range-selector': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype CustomSelectOptionsMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.dateRangeOptions, DateRangeSelectorProps['dateRangeOptions']>\n>;\ntype EarliestDateMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.earliestDate, DateRangeSelectorProps['earliestDate']>\n>;\ntype InitialValueMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialValue, DateRangeSelectorProps['initialValue']>\n>;\ntype InitialDateFromMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialDateFrom, DateRangeSelectorProps['initialDateFrom']>\n>;\ntype InitialDateToMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.initialDateTo, DateRangeSelectorProps['initialDateTo']>\n>;\ntype WidthMatches = Expect<Equals<typeof DateRangeSelectorComponent.prototype.width, DateRangeSelectorProps['width']>>;\ntype DateColumnMatches = Expect<\n Equals<typeof DateRangeSelectorComponent.prototype.dateColumn, DateRangeSelectorProps['dateColumn']>\n>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchAutocompletionList(fields: string[], lapis: string, signal?: AbortSignal) {\n const toAncestorInHierarchyOverwriteValues = Array(fields.length - 1)\n .fill(0)\n .map((_, i) => i + 1)\n .map((i) => fields.slice(i).reduce((acc, field) => ({ ...acc, [field]: null }), {}));\n\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string | null>>({}, fields);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n const locationValues = data\n .map((entry) => fields.reduce((acc, field) => ({ ...acc, [field]: entry[field] }), {}))\n .reduce<Set<string>>((setOfAllHierarchies, entry) => {\n setOfAllHierarchies.add(JSON.stringify(entry));\n toAncestorInHierarchyOverwriteValues.forEach((overwriteValues) => {\n setOfAllHierarchies.add(JSON.stringify({ ...entry, ...overwriteValues }));\n });\n return setOfAllHierarchies;\n }, new Set());\n\n return [...locationValues].map((json) => JSON.parse(json)).sort(compareLocationEntries(fields));\n}\n\nfunction compareLocationEntries(fields: string[]) {\n return (a: Record<string, string | null>, b: Record<string, string | null>) => {\n for (const field of fields) {\n const valueA = a[field];\n const valueB = b[field];\n if (valueA === valueB) {\n continue;\n }\n if (valueA === null) {\n return -1;\n }\n if (valueB === null) {\n return 1;\n }\n return valueA < valueB ? -1 : 1;\n }\n return 0;\n };\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef, useState } from 'preact/hooks';\nimport { type JSXInternal } from 'preact/src/jsx';\n\nimport { fetchAutocompletionList } from './fetchAutocompletionList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nexport interface LocationFilterInnerProps {\n initialValue: string;\n placeholderText: string;\n fields: string[];\n}\n\nexport interface LocationFilterProps extends LocationFilterInnerProps {\n width: string;\n}\n\nexport const LocationFilter: FunctionComponent<LocationFilterProps> = ({ width, ...innerProps }) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal'>\n <ResizeContainer size={size}>\n <LocationFilterInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nexport const LocationFilterInner = ({ initialValue, fields, placeholderText }: LocationFilterInnerProps) => {\n const lapis = useContext(LapisUrlContext);\n\n const [value, setValue] = useState(initialValue ?? '');\n const [unknownLocation, setUnknownLocation] = useState(false);\n\n const divRef = useRef<HTMLDivElement>(null);\n\n const { data, error, isLoading } = useQuery(() => fetchAutocompletionList(fields, lapis), [fields, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n if (error) {\n throw error;\n }\n\n const onInput = (event: JSXInternal.TargetedInputEvent<HTMLInputElement>) => {\n const inputValue = event.currentTarget.value;\n setValue(inputValue);\n if (inputValue.trim() === value.trim() && inputValue !== '') {\n return;\n }\n const eventDetail = parseLocation(inputValue, fields);\n if (hasAllUndefined(eventDetail) || hasMatchingEntry(data, eventDetail)) {\n divRef.current?.dispatchEvent(\n new CustomEvent('gs-location-changed', {\n detail: eventDetail,\n bubbles: true,\n composed: true,\n }),\n );\n setUnknownLocation(false);\n } else {\n setUnknownLocation(true);\n }\n };\n\n return (\n <div class='flex w-full' ref={divRef}>\n <input\n type='text'\n class={`input input-bordered grow ${unknownLocation ? 'border-2 border-error' : ''}`}\n value={value}\n onInput={onInput}\n list='countries'\n placeholder={placeholderText}\n />\n <datalist id='countries'>\n {data?.map((v) => {\n const value = fields\n .map((field) => v[field])\n .filter((value) => value !== null)\n .join(' / ');\n return <option key={value} value={value} />;\n })}\n </datalist>\n </div>\n );\n};\n\nconst parseLocation = (location: string, fields: string[]) => {\n if (location === '') {\n return fields.reduce((acc, field) => ({ ...acc, [field]: undefined }), {});\n }\n const fieldValues = location.split('/').map((part) => part.trim());\n\n return fields.reduce((acc, field, i) => ({ ...acc, [field]: fieldValues[i] }), {});\n};\n\nconst hasAllUndefined = (obj: Record<string, string | undefined>) =>\n Object.values(obj).every((value) => value === undefined);\n\nconst hasMatchingEntry = (data: Record<string, string>[] | null, eventDetail: Record<string, string>) => {\n if (data === null) {\n return false;\n }\n\n const matchingEntries = Object.entries(eventDetail)\n .filter(([, value]) => value !== undefined)\n .reduce((filteredData, [key, value]) => filteredData.filter((it) => it[key] === value), data);\n\n return matchingEntries.length > 0;\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { LocationFilter, type LocationFilterProps } from '../../preact/locationFilter/location-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n *\n * This component provides an input field to specify filters for locations.\n *\n * It expects a list of fields that form a strict hierarchical order, such as continent, country, and city.\n * The component retrieves a list of all possible values for these fields from the Lapis instance.\n * This list is then utilized to display autocomplete suggestions and to validate the input.\n *\n * Given `fields` are `['field1', 'field2', ..., 'fieldN']`,\n * then valid values for the location filter must be in the form `valueForField1 / valueForField2 / ... / valueForFieldK`,\n * where `1 <= K <= N`.\n * Values for the fields `i > K` are considered `undefined`.\n *\n * @fires {CustomEvent<Record<string, string>>} gs-location-changed\n * Fired when a value from the datalist is selected or when a valid value is typed into the field.\n * The `details` of this event contain an object with all `fields` as keys\n * and the corresponding values as values, even if they are `undefined`.\n * Example:\n * ```\n * {\n * continent: \"Asia\",\n * country: \"China\",\n * city: \"Beijing\",\n * district: undefined,\n * }\n * ```\n */\n@customElement('gs-location-filter')\nexport class LocationFilterComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this location filter.\n * Must be of the form `valueForField1 / valueForField2 / ... / valueForFieldN`.\n */\n @property()\n initialValue = '';\n\n /**\n * Required.\n *\n * The fields to display in the location filter, in hierarchical order.\n * The top-level field should be the first entry in the array.\n * This component assumes that the values for each field form a strict hierarchy\n * (e.g., `fields = ['continent', 'country', 'city']`).\n */\n @property({ type: Array })\n fields: string[] = [];\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n /**\n * The placeholder text to display in the input field, if it is empty.\n */\n @property()\n placeholderText: string = '';\n\n override render() {\n return (\n <LocationFilter\n initialValue={this.initialValue}\n fields={this.fields}\n width={this.width}\n placeholderText={this.placeholderText}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-location-filter': LocationFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-location-changed': CustomEvent<Record<string, string>>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-location-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof LocationFilterComponent.prototype.initialValue, LocationFilterProps['initialValue']>\n>;\ntype FieldsMatches = Expect<Equals<typeof LocationFilterComponent.prototype.fields, LocationFilterProps['fields']>>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof LocationFilterComponent.prototype.placeholderText, LocationFilterProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof LocationFilterComponent.prototype.width, LocationFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchAutocompleteList(lapis: string, field: string, signal?: AbortSignal) {\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string>>({}, [field]);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n return data.map((item) => item[field]);\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef } from 'preact/hooks';\n\nimport { fetchAutocompleteList } from './fetchAutocompleteList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nexport interface TextInputInnerProps {\n lapisField: string;\n placeholderText: string;\n initialValue: string;\n}\n\nexport interface TextInputProps extends TextInputInnerProps {\n width: string;\n}\n\nexport const TextInput: FunctionComponent<TextInputProps> = ({ width, ...innerProps }) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal'>\n <ResizeContainer size={size}>\n <TextInputInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst TextInputInner: FunctionComponent<TextInputInnerProps> = ({ lapisField, placeholderText, initialValue }) => {\n const lapis = useContext(LapisUrlContext);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data, error, isLoading } = useQuery(() => fetchAutocompleteList(lapis, lapisField), [lapisField, lapis]);\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n const onInput = () => {\n const value = inputRef.current?.value === '' ? undefined : inputRef.current?.value;\n\n if (isValidValue(value)) {\n inputRef.current?.dispatchEvent(\n new CustomEvent('gs-text-input-changed', {\n detail: { [lapisField]: value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n\n const isValidValue = (value: string | undefined) => {\n if (value === undefined) {\n return true;\n }\n return data.includes(value);\n };\n\n return (\n <>\n <input\n type='text'\n class='input input-bordered w-full'\n placeholder={placeholderText !== undefined ? placeholderText : lapisField}\n onInput={onInput}\n ref={inputRef}\n list={lapisField}\n value={initialValue}\n />\n <datalist id={lapisField}>\n {data.map((item) => (\n <option value={item} key={item} />\n ))}\n </datalist>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { TextInput, type TextInputProps } from '../../preact/textInput/text-input';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n *\n * ## Context\n *\n * This component provides a text input field to specify filters for arbitrary fields of this LAPIS instance.\n *\n * @fires {CustomEvent<Record<string, string>>} gs-text-input-changed\n * Fired when the input field is changed.\n * The `details` of this event contain an object with the `lapisField` as key and the input value as value.\n * Example:\n * ```\n * {\n * \"host\": \"Homo sapiens\"\n * }\n * ```\n */\n@customElement('gs-text-input')\nexport class TextInputComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this text input.\n */\n @property()\n initialValue: string = '';\n\n /**\n * Required.\n *\n * The LAPIS field name to use for this text input.\n * The field must exist on this LAPIS instance.\n */\n @property()\n lapisField = '';\n\n /**\n * The placeholder text to display in the input field.\n */\n @property()\n placeholderText: string = '';\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <TextInput\n lapisField={this.lapisField}\n placeholderText={this.placeholderText}\n initialValue={this.initialValue}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-text-input': TextInputComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-text-input-changed': CustomEvent<Record<string, string>>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-text-input': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof TextInputComponent.prototype.initialValue, TextInputProps['initialValue']>\n>;\ntype LapisFieldMatches = Expect<Equals<typeof TextInputComponent.prototype.lapisField, TextInputProps['lapisField']>>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof TextInputComponent.prototype.placeholderText, TextInputProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof TextInputComponent.prototype.width, TextInputProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { type ComponentChildren, type FunctionalComponent } from 'preact';\nimport { useContext } from 'preact/hooks';\n\nimport { type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\n\n/**\n * Sometimes the reference genome is not immediately available.\n * This component will display a loading spinner until the reference genome is available.\n * Child components can assume that the reference genome is available on the first render,\n * which e.g. matters for initial values of `useState`.\n */\nexport const ReferenceGenomesAwaiter: FunctionalComponent<{ children: ComponentChildren }> = ({ children }) => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n if (isNotInitialized(referenceGenome)) {\n return <div className='laoding loading-spinner loading-md'>Loading...</div>;\n }\n\n return <>{children}</>;\n};\n\nfunction isNotInitialized(referenceGenome: ReferenceGenome) {\n return referenceGenome.nucleotideSequences.length === 0 && referenceGenome.genes.length === 0;\n}\n","import { useContext } from 'preact/hooks';\n\nimport { isSingleSegmented } from '../../lapisApi/ReferenceGenome';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\nimport Info, { InfoHeadline1, InfoHeadline2, InfoParagraph } from '../components/info';\n\nexport const MutationFilterInfo = () => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const firstGene = referenceGenome.genes[0].name;\n return (\n <Info>\n <InfoHeadline1> Mutation Filter</InfoHeadline1>\n <InfoParagraph>This component allows you to filter for mutations at specific positions.</InfoParagraph>\n\n <InfoHeadline2> Nucleotide Mutations and Insertions</InfoHeadline2>\n {isSingleSegmented(referenceGenome) ? (\n <SingleSegmentedNucleotideMutationsInfo />\n ) : (\n <MultiSegmentedNucleotideMutationsInfo />\n )}\n\n <InfoHeadline2>Amino Acid Mutations and Insertions</InfoHeadline2>\n <InfoParagraph>\n An amino acid mutation has the format <b>&lt;gene&gt;:&lt;position&gt;&lt;base&gt;</b> or\n <b>&lt;gene&gt;:&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. A <b>&lt;base&gt;</b> can be one of\n the 20 amino acid codes. It can also be <b>-</b> for deletion and <b>X</b> for unknown. Example:{' '}\n <b>E:57Q</b>.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_{firstGene}:31:N</b> would filter for sequences with an insertion\n of N between positions 31 and 32 in the gene {firstGene}.\n </InfoParagraph>\n <InfoParagraph>\n This organism has the following genes: {referenceGenome.genes.map((gene) => gene.name).join(', ')}.\n </InfoParagraph>\n\n <InfoHeadline2>Insertion Wildcards</InfoHeadline2>\n <InfoParagraph>\n This component supports insertion queries that contain wildcards <b>?</b>. For example{' '}\n <b>ins_{firstGene}:214:?EP?</b> will match all cases where segment <b>{firstGene}</b> has an insertion\n of <b>EP</b> between the positions <b>214</b> and <b>215</b> but also an insertion of other amino acids\n which include the <b>EP</b>, e.g. the insertion <b>EPE</b> will be matched.\n </InfoParagraph>\n <InfoParagraph>\n You can also use wildcards to match any insertion at a given position. For example{' '}\n <b>ins_{firstGene}:214:?</b> match any (but at least one) insertion between the positions 214 and 215.\n </InfoParagraph>\n\n <InfoHeadline2>Multiple Mutations</InfoHeadline2>\n <InfoParagraph>\n Multiple mutation filters can be provided by adding one mutation after the other.\n </InfoParagraph>\n\n <InfoHeadline2>Any Mutation</InfoHeadline2>\n <InfoParagraph>\n To filter for any mutation at a given position you can omit the <b>&lt;base&gt;</b>. Example:{' '}\n <b>{firstGene}:20</b>.\n </InfoParagraph>\n\n <InfoHeadline2>No Mutation</InfoHeadline2>\n <InfoParagraph>\n You can write a <b>.</b> for the <b>&lt;base&gt;</b> to filter for sequences for which it is confirmed\n that no mutation occurred, i.e. has the same base as the reference genome at the specified position.\n </InfoParagraph>\n </Info>\n );\n};\n\nconst SingleSegmentedNucleotideMutationsInfo = () => {\n return (\n <>\n <InfoParagraph>\n This organism is single-segmented. Thus, nucleotide mutations have the format{' '}\n <b>&lt;position&gt;&lt;base&gt;</b> or <b>&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. The{' '}\n <b>&lt;base_ref&gt;</b> is the reference base at the position. It is optional. A <b>&lt;base&gt;</b> can\n be one of the four nucleotides <b>A</b>, <b>T</b>, <b>C</b>, and <b>G</b>. It can also be <b>-</b> for\n deletion and <b>N</b> for unknown. For example if the reference sequence is <b>A</b> at position{' '}\n <b>23</b> both: <b>23T</b> and <b>A23T</b> will yield the same results.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_1046:A</b> would filter for sequences with an insertion of A\n between the positions 1046 and 1047 in the nucleotide sequence.\n </InfoParagraph>\n </>\n );\n};\n\nconst MultiSegmentedNucleotideMutationsInfo = () => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n\n const firstSegment = referenceGenome.nucleotideSequences[0].name;\n\n return (\n <>\n <InfoParagraph>\n This organism is multi-segmented. Thus, nucleotide mutations have the format{' '}\n <b>&lt;segment&gt;:&lt;position&gt;&lt;base&gt;</b> or{' '}\n <b>&lt;segment&gt;:&lt;base_ref&gt;&lt;position&gt;&lt;base&gt;</b>. <b>&lt;base_ref&gt;</b> is the\n reference base at the position. It is optional. A <b>&lt;base&gt;</b> can be one of the four nucleotides{' '}\n <b>A</b>, <b>T</b>, <b>C</b>, and <b>G</b>. It can also be <b>-</b> for deletion and <b>N</b> for\n unknown. For example if the reference sequence is <b>A</b> at position <b>23</b> both:{' '}\n <b>{firstSegment}:23T</b> and <b>{firstSegment}:A23T</b> will yield the same results.\n </InfoParagraph>\n <InfoParagraph>\n Insertions can be searched for in the same manner, they just need to have <b>ins_</b> appended to the\n start of the mutation. Example: <b>ins_{firstSegment}:10462:A</b>.\n </InfoParagraph>\n <InfoParagraph>\n This organism has the following segments:{' '}\n {referenceGenome.nucleotideSequences.map((gene) => gene.name).join(', ')}.\n </InfoParagraph>{' '}\n </>\n );\n};\n","import { isSingleSegmented, type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport type { SequenceType } from '../../types';\n\nexport const sequenceTypeFromSegment = (\n possibleSegment: string | undefined,\n referenceGenome: ReferenceGenome,\n): SequenceType | undefined => {\n if (possibleSegment === undefined) {\n return isSingleSegmented(referenceGenome) ? 'nucleotide' : undefined;\n }\n\n if (referenceGenome.nucleotideSequences.some((sequence) => sequence.name === possibleSegment)) {\n return 'nucleotide';\n }\n\n if (referenceGenome.genes.some((gene) => gene.name === possibleSegment)) {\n return 'amino acid';\n }\n return undefined;\n};\n","import { type SelectedFilters } from './mutation-filter';\nimport { sequenceTypeFromSegment } from './sequenceTypeFromSegment';\nimport type { ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport { DeletionClass, InsertionClass, SubstitutionClass } from '../../utils/mutations';\n\ntype ParsedMutationFilter = {\n [MutationType in keyof SelectedFilters]: { type: MutationType; value: SelectedFilters[MutationType][number] };\n}[keyof SelectedFilters];\n\nexport const parseAndValidateMutation = (\n value: string,\n referenceGenome: ReferenceGenome,\n): ParsedMutationFilter | null => {\n const possibleInsertion = InsertionClass.parse(value);\n if (possibleInsertion !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleInsertion.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideInsertions', value: possibleInsertion };\n case 'amino acid':\n return { type: 'aminoAcidInsertions', value: possibleInsertion };\n case undefined:\n return null;\n }\n }\n\n const possibleDeletion = DeletionClass.parse(value);\n if (possibleDeletion !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleDeletion.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideMutations', value: possibleDeletion };\n case 'amino acid':\n return { type: 'aminoAcidMutations', value: possibleDeletion };\n case undefined:\n return null;\n }\n }\n\n const possibleSubstitution = SubstitutionClass.parse(value);\n if (possibleSubstitution !== null) {\n const sequenceType = sequenceTypeFromSegment(possibleSubstitution.segment, referenceGenome);\n switch (sequenceType) {\n case 'nucleotide':\n return { type: 'nucleotideMutations', value: possibleSubstitution };\n case 'amino acid':\n return { type: 'aminoAcidMutations', value: possibleSubstitution };\n case undefined:\n return null;\n }\n }\n\n return null;\n};\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef, useState } from 'preact/hooks';\n\nimport { MutationFilterInfo } from './mutation-filter-info';\nimport { parseAndValidateMutation } from './parseAndValidateMutation';\nimport { type ReferenceGenome } from '../../lapisApi/ReferenceGenome';\nimport {\n type DeletionClass,\n type InsertionClass,\n type MutationClass,\n type SubstitutionClass,\n} from '../../utils/mutations';\nimport { ReferenceGenomeContext } from '../ReferenceGenomeContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { singleGraphColorRGBByName } from '../shared/charts/colors';\n\nexport interface MutationFilterInnerProps {\n initialValue?: SelectedMutationFilterStrings | string[] | undefined;\n}\n\nexport interface MutationFilterProps extends MutationFilterInnerProps {\n width: string;\n}\n\nexport type SelectedFilters = {\n nucleotideMutations: (SubstitutionClass | DeletionClass)[];\n aminoAcidMutations: (SubstitutionClass | DeletionClass)[];\n nucleotideInsertions: InsertionClass[];\n aminoAcidInsertions: InsertionClass[];\n};\n\nexport type SelectedMutationFilterStrings = {\n [Key in keyof SelectedFilters]: string[];\n};\n\nexport const MutationFilter: FunctionComponent<MutationFilterProps> = ({ initialValue, width }) => {\n return (\n <ErrorBoundary size={{ height: '3.375rem', width }} layout='horizontal'>\n <div style={width}>\n <MutationFilterInner initialValue={initialValue} />\n </div>\n </ErrorBoundary>\n );\n};\n\nexport const MutationFilterInner: FunctionComponent<MutationFilterInnerProps> = ({ initialValue }) => {\n const referenceGenome = useContext(ReferenceGenomeContext);\n const [selectedFilters, setSelectedFilters] = useState<SelectedFilters>(\n getInitialState(initialValue, referenceGenome),\n );\n const [inputValue, setInputValue] = useState('');\n const [isError, setIsError] = useState(false);\n const formRef = useRef<HTMLFormElement>(null);\n\n const handleSubmit = (event: Event) => {\n event.preventDefault();\n if (inputValue === '') {\n return;\n }\n\n const parsedMutation = parseAndValidateMutation(inputValue, referenceGenome);\n\n if (parsedMutation === null) {\n setIsError(true);\n return;\n }\n\n const newSelectedValues = {\n ...selectedFilters,\n [parsedMutation.type]: [...selectedFilters[parsedMutation.type], parsedMutation.value],\n };\n\n setSelectedFilters(newSelectedValues);\n fireChangeEvent(newSelectedValues);\n setInputValue('');\n };\n\n const fireChangeEvent = (selectedFilters: SelectedFilters) => {\n const detail = mapToMutationFilterStrings(selectedFilters);\n\n formRef.current?.dispatchEvent(\n new CustomEvent<SelectedMutationFilterStrings>('gs-mutation-filter-changed', {\n detail,\n bubbles: true,\n composed: true,\n }),\n );\n };\n\n const handleInputChange = (event: Event) => {\n setInputValue((event.target as HTMLInputElement).value);\n setIsError(false);\n };\n\n return (\n <form className='w-full border boder-gray-300 rounded-md relative' onSubmit={handleSubmit} ref={formRef}>\n <div className='absolute -top-3 -right-3'>\n <MutationFilterInfo />\n </div>\n <div className='w-full flex p-2 flex-wrap items-center'>\n <SelectedMutationDisplay\n selectedFilters={selectedFilters}\n setSelectedFilters={setSelectedFilters}\n fireChangeEvent={fireChangeEvent}\n />\n <div\n className={`w-full flex border ${isError ? 'border-red-500' : 'border-gray-300'} border-solid m-2 text-sm focus-within:border-gray-400 `}\n >\n <input\n className='grow flex-1 p-1 border-none focus:outline-none focus:ring-0'\n type='text'\n value={inputValue}\n onInput={handleInputChange}\n placeholder={getPlaceholder(referenceGenome)}\n />\n <button type='submit' className='btn btn-xs m-1'>\n +\n </button>\n </div>\n </div>\n </form>\n );\n};\n\nfunction getInitialState(\n initialValue: SelectedMutationFilterStrings | string[] | undefined,\n referenceGenome: ReferenceGenome,\n) {\n if (initialValue === undefined) {\n return {\n nucleotideMutations: [],\n aminoAcidMutations: [],\n nucleotideInsertions: [],\n aminoAcidInsertions: [],\n };\n }\n\n const values = Array.isArray(initialValue) ? initialValue : Object.values(initialValue).flatMap((it) => it);\n\n return values.reduce(\n (selectedFilters, value) => {\n const parsedMutation = parseAndValidateMutation(value, referenceGenome);\n if (parsedMutation === null) {\n return selectedFilters;\n }\n\n return {\n ...selectedFilters,\n [parsedMutation.type]: [...selectedFilters[parsedMutation.type], parsedMutation.value],\n };\n },\n {\n nucleotideMutations: [],\n aminoAcidMutations: [],\n nucleotideInsertions: [],\n aminoAcidInsertions: [],\n } as SelectedFilters,\n );\n}\n\nfunction getPlaceholder(referenceGenome: ReferenceGenome) {\n const segmentPrefix =\n referenceGenome.nucleotideSequences.length > 1 ? `${referenceGenome.nucleotideSequences[0].name}:` : '';\n const firstGene = referenceGenome.genes[0].name;\n\n return `Enter a mutation (e.g. ${segmentPrefix}A123T, ins_${segmentPrefix}123:AT, ${firstGene}:M123E, ins_${firstGene}:123:ME)`;\n}\n\nconst SelectedMutationDisplay: FunctionComponent<{\n selectedFilters: SelectedFilters;\n setSelectedFilters: (selectedFilters: SelectedFilters) => void;\n fireChangeEvent: (selectedFilters: SelectedFilters) => void;\n}> = ({ selectedFilters, setSelectedFilters, fireChangeEvent }) => {\n const onSelectedRemoved = <MutationType extends keyof SelectedFilters>(\n mutation: SelectedFilters[MutationType][number],\n key: MutationType,\n ) => {\n const newSelectedValues = {\n ...selectedFilters,\n [key]: selectedFilters[key].filter((i) => !mutation.equals(i)),\n };\n\n setSelectedFilters(newSelectedValues);\n\n fireChangeEvent(newSelectedValues);\n };\n\n return (\n <>\n {selectedFilters.nucleotideMutations.map((mutation) => (\n <SelectedNucleotideMutation\n key={mutation.toString()}\n mutation={mutation}\n onDelete={(mutation: SubstitutionClass | DeletionClass) =>\n onSelectedRemoved(mutation, 'nucleotideMutations')\n }\n />\n ))}\n {selectedFilters.aminoAcidMutations.map((mutation) => (\n <SelectedAminoAcidMutation\n key={mutation.toString()}\n mutation={mutation}\n onDelete={(mutation: SubstitutionClass | DeletionClass) =>\n onSelectedRemoved(mutation, 'aminoAcidMutations')\n }\n />\n ))}\n {selectedFilters.nucleotideInsertions.map((insertion) => (\n <SelectedNucleotideInsertion\n key={insertion.toString()}\n insertion={insertion}\n onDelete={(insertion) => onSelectedRemoved(insertion, 'nucleotideInsertions')}\n />\n ))}\n {selectedFilters.aminoAcidInsertions.map((insertion) => (\n <SelectedAminoAcidInsertion\n key={insertion.toString()}\n insertion={insertion}\n onDelete={(insertion: InsertionClass) => onSelectedRemoved(insertion, 'aminoAcidInsertions')}\n />\n ))}\n </>\n );\n};\n\nconst SelectedAminoAcidInsertion: FunctionComponent<{\n insertion: InsertionClass;\n onDelete: (insertion: InsertionClass) => void;\n}> = ({ insertion, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('teal', 0.3);\n const textColor = singleGraphColorRGBByName('teal', 1);\n return (\n <SelectedFilter\n mutation={insertion}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\nconst SelectedAminoAcidMutation: FunctionComponent<{\n mutation: SubstitutionClass | DeletionClass;\n onDelete: (mutation: SubstitutionClass | DeletionClass) => void;\n}> = ({ mutation, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('rose', 0.3);\n const textColor = singleGraphColorRGBByName('rose', 1);\n return (\n <SelectedFilter\n mutation={mutation}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\nconst SelectedNucleotideMutation: FunctionComponent<{\n mutation: SubstitutionClass | DeletionClass;\n onDelete: (insertion: SubstitutionClass | DeletionClass) => void;\n}> = ({ mutation, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('indigo', 0.3);\n const textColor = singleGraphColorRGBByName('indigo', 1);\n return (\n <SelectedFilter\n mutation={mutation}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\nconst SelectedNucleotideInsertion: FunctionComponent<{\n insertion: InsertionClass;\n onDelete: (insertion: InsertionClass) => void;\n}> = ({ insertion, onDelete }) => {\n const backgroundColor = singleGraphColorRGBByName('green', 0.3);\n const textColor = singleGraphColorRGBByName('green', 1);\n\n return (\n <SelectedFilter\n mutation={insertion}\n onDelete={onDelete}\n backgroundColor={backgroundColor}\n textColor={textColor}\n />\n );\n};\n\ntype SelectedFilterProps<MutationType extends MutationClass> = {\n mutation: MutationType;\n onDelete: (mutation: MutationType) => void;\n backgroundColor: string;\n textColor: string;\n};\n\nconst SelectedFilter = <MutationType extends MutationClass>({\n mutation,\n onDelete,\n backgroundColor,\n textColor,\n}: SelectedFilterProps<MutationType>) => {\n return (\n <span\n class='inline-block mx-1 px-2 py-1 font-medium text-xs rounded-full'\n style={{ backgroundColor, color: textColor }}\n >\n {mutation.toString()}\n <button className='ml-1' type='button' onClick={() => onDelete(mutation)}>\n ✕\n </button>\n </span>\n );\n};\n\nfunction mapToMutationFilterStrings(selectedFilters: SelectedFilters) {\n return {\n aminoAcidMutations: selectedFilters.aminoAcidMutations.map((mutation) => mutation.toString()),\n nucleotideMutations: selectedFilters.nucleotideMutations.map((mutation) => mutation.toString()),\n aminoAcidInsertions: selectedFilters.aminoAcidInsertions.map((insertion) => insertion.toString()),\n nucleotideInsertions: selectedFilters.nucleotideInsertions.map((insertion) => insertion.toString()),\n };\n}\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { ReferenceGenomesAwaiter } from '../../preact/components/ReferenceGenomesAwaiter';\nimport {\n MutationFilter,\n type MutationFilterProps,\n type SelectedMutationFilterStrings,\n} from '../../preact/mutationFilter/mutation-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n * ## Context\n * This component provides an input field to specify filters for nucleotide and amino acid mutations and insertions.\n *\n * Input values have to be provided one at a time and submitted by pressing the Enter key or by clicking the '+' button.\n * After submission, the component validates the input and fires an event with the selected mutations.\n * All previously selected mutations are displayed at the input field and added to the event.\n * Users can remove a mutation by clicking the 'x' button next to the mutation.\n *\n * ## Input Validation\n *\n * Validation of the input is performed according to the following rules:\n *\n * ### Mutations\n *\n * Mutations have to conform to the following format: `<gene/segment>:<symbol at reference><position><Substituted symbol/Deletion>`\n * - Gene/segment: The gene or segment where the mutation occurs. Must be contained in the reference genome.\n * (Optional for elements with only one gene/segment)\n * - Symbol at reference: The symbol at the reference position. (Optional)\n * - Position: The position of the mutation. (Required)\n * - Substituted symbol/Deletion: The substituted symbol or '-' for a deletion. (Required)\n *\n * Examples: `S:614G`, `614G`, `614-`, `614G`\n *\n * ### Insertions\n *\n * Insertions have to conform to the following format: `ins_<gene/segment>:<position>:<Inserted symbols>`\n * - Gene/segment: The gene or segment where the insertion occurs. Must be contained in the reference genome.\n * (Optional for elements with only one gene/segment)\n * - Position: The position of the insertion. (Required)\n * - Inserted symbols: The symbols that are inserted. (Required)\n *\n * Examples: `ins_S:614:G`, `ins_614:G`\n *\n * @fires {CustomEvent<{\n * nucleotideMutations: string[],\n * aminoAcidMutations: string[],\n * nucleotideInsertions: string[],\n * aminoAcidInsertions: string[]\n * }>} gs-mutation-filter-changed\n * Fired when:\n * - The user has submitted a valid mutation or insertion\n * - The user has removed a mutation or insertion\n */\n@customElement('gs-mutation-filter')\nexport class MutationFilterComponent extends PreactLitAdapter {\n // prettier-ignore\n // The multiline union type must not start with `|` because it looks weird in the Storybook docs\n /**\n * The initial value to use for this mutation filter.\n * All values provided must be valid mutations or insertions.\n * Invalid values will be ignored.\n */\n @property({ type: Object })\n initialValue:\n {\n nucleotideMutations: string[];\n aminoAcidMutations: string[];\n nucleotideInsertions: string[];\n aminoAcidInsertions: string[];\n }\n | string[]\n | undefined = undefined;\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <ReferenceGenomesAwaiter>\n <MutationFilter initialValue={this.initialValue} width={this.width} />\n </ReferenceGenomesAwaiter>\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-mutation-filter': MutationFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-mutation-filter-changed': CustomEvent<SelectedMutationFilterStrings>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-mutation-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof MutationFilterComponent.prototype.initialValue, MutationFilterProps['initialValue']>\n>;\ntype WidthMatches = Expect<Equals<typeof MutationFilterComponent.prototype.width, MutationFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { FetchAggregatedOperator } from '../../operator/FetchAggregatedOperator';\n\nexport async function fetchLineageAutocompleteList(lapis: string, field: string, signal?: AbortSignal) {\n const fetchAggregatedOperator = new FetchAggregatedOperator<Record<string, string>>({}, [field]);\n\n const data = (await fetchAggregatedOperator.evaluate(lapis, signal)).content;\n\n return data.flatMap((item) => [item[field], `${item[field]}*`]).sort();\n}\n","import { type FunctionComponent } from 'preact';\nimport { useContext, useRef } from 'preact/hooks';\n\nimport { fetchLineageAutocompleteList } from './fetchLineageAutocompleteList';\nimport { LapisUrlContext } from '../LapisUrlContext';\nimport { ErrorBoundary } from '../components/error-boundary';\nimport { LoadingDisplay } from '../components/loading-display';\nimport { NoDataDisplay } from '../components/no-data-display';\nimport { ResizeContainer } from '../components/resize-container';\nimport { useQuery } from '../useQuery';\n\nexport interface LineageFilterInnerProps {\n lapisField: string;\n placeholderText: string;\n initialValue: string;\n}\n\nexport interface LineageFilterProps extends LineageFilterInnerProps {\n width: string;\n}\n\nexport const LineageFilter: FunctionComponent<LineageFilterProps> = ({ width, ...innerProps }) => {\n const size = { width, height: '3rem' };\n\n return (\n <ErrorBoundary size={size} layout='horizontal'>\n <ResizeContainer size={size}>\n <LineageFilterInner {...innerProps} />\n </ResizeContainer>\n </ErrorBoundary>\n );\n};\n\nconst LineageFilterInner: FunctionComponent<LineageFilterInnerProps> = ({\n lapisField,\n placeholderText,\n initialValue,\n}) => {\n const lapis = useContext(LapisUrlContext);\n\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data, error, isLoading } = useQuery(\n () => fetchLineageAutocompleteList(lapis, lapisField),\n [lapisField, lapis],\n );\n\n if (isLoading) {\n return <LoadingDisplay />;\n }\n\n if (error !== null) {\n throw error;\n }\n\n if (data === null) {\n return <NoDataDisplay />;\n }\n\n const onInput = () => {\n const value = inputRef.current?.value === '' ? undefined : inputRef.current?.value;\n\n if (isValidValue(value)) {\n inputRef.current?.dispatchEvent(\n new CustomEvent('gs-lineage-filter-changed', {\n detail: { [lapisField]: value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n };\n\n const isValidValue = (value: string | undefined) => {\n if (value === undefined) {\n return true;\n }\n return data.includes(value);\n };\n\n return (\n <>\n <input\n type='text'\n class='input input-bordered w-full'\n placeholder={placeholderText !== undefined ? placeholderText : lapisField}\n onInput={onInput}\n ref={inputRef}\n list={lapisField}\n value={initialValue}\n />\n <datalist id={lapisField}>\n {data.map((item) => (\n <option value={item} key={item} />\n ))}\n </datalist>\n </>\n );\n};\n","import { customElement, property } from 'lit/decorators.js';\nimport { type DetailedHTMLProps, type HTMLAttributes } from 'react';\n\nimport { LineageFilter, type LineageFilterProps } from '../../preact/lineageFilter/lineage-filter';\nimport type { Equals, Expect } from '../../utils/typeAssertions';\nimport { PreactLitAdapter } from '../PreactLitAdapter';\n\n/**\n *\n * ## Context\n *\n * This component provides a text input field to filter by lineages.\n * Currently, it is designed to work well with Pango Lineages,\n * but it may also be used for other lineage types, if suitable.\n *\n * It fetches all available values of the `lapisField` from the LAPIS instance\n * and provides an autocomplete list with the available values of the lineage and sublineage queries\n * (a `*` appended to the lineage value).\n *\n * @fires {CustomEvent<Record<string, string>>} gs-lineage-filter-changed\n * Fired when the input field is changed.\n * The `details` of this event contain an object with the `lapisField` as key and the input value as value.\n * Example:\n * ```\n * {\n * \"pangoLineage\": \"B.1.1.7\"\n * }\n * ```\n */\n@customElement('gs-lineage-filter')\nexport class LineageFilterComponent extends PreactLitAdapter {\n /**\n * The initial value to use for this lineage filter.\n */\n @property()\n initialValue: string = '';\n\n /**\n * Required.\n *\n * The LAPIS field name to use for this lineage filter.\n * The field must exist on this LAPIS instance.\n */\n @property()\n lapisField = '';\n\n /**\n * The placeholder text to display in the input field.\n */\n @property()\n placeholderText: string = '';\n\n /**\n * The width of the component.\n *\n * Visit https://genspectrum.github.io/dashboard-components/?path=/docs/components-size-of-components--docs for more information.\n */\n @property({ type: String })\n width: string = '100%';\n\n override render() {\n return (\n <LineageFilter\n lapisField={this.lapisField}\n placeholderText={this.placeholderText}\n initialValue={this.initialValue}\n width={this.width}\n />\n );\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'gs-lineage-filter': LineageFilterComponent;\n }\n\n interface HTMLElementEventMap {\n 'gs-lineage-filter-changed': CustomEvent<Record<string, string>>;\n }\n}\n\ndeclare global {\n // eslint-disable-next-line @typescript-eslint/no-namespace\n namespace JSX {\n interface IntrinsicElements {\n 'gs-lineage-filter': DetailedHTMLProps<HTMLAttributes<HTMLElement>, HTMLElement>;\n }\n }\n}\n\n/* eslint-disable @typescript-eslint/no-unused-vars, no-unused-vars */\ntype InitialValueMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.initialValue, LineageFilterProps['initialValue']>\n>;\ntype LapisFieldMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.lapisField, LineageFilterProps['lapisField']>\n>;\ntype PlaceholderTextMatches = Expect<\n Equals<typeof LineageFilterComponent.prototype.placeholderText, LineageFilterProps['placeholderText']>\n>;\ntype WidthMatches = Expect<Equals<typeof LineageFilterComponent.prototype.width, LineageFilterProps['width']>>;\n/* eslint-enable @typescript-eslint/no-unused-vars, no-unused-vars */\n","import { toYYYYMMDD } from './dateConversion';\n\n/**\n * A date range option that can be used in the `gs-date-range-selector` component.\n */\nexport type DateRangeOption = {\n /** The label of the date range option that will be shown to the user */\n label: string;\n /**\n * The start date of the date range in the format `YYYY-MM-DD`.\n * If not set, the date range selector will default to the `earliestDate` property.\n */\n dateFrom?: string;\n /**\n * The end date of the date range in the format `YYYY-MM-DD`.\n * If not set, the date range selector will default to the current date.\n */\n dateTo?: string;\n};\n\nconst today = new Date();\n\nconst twoWeeksAgo = new Date();\ntwoWeeksAgo.setDate(today.getDate() - 14);\n\nconst lastMonth = new Date(today);\nlastMonth.setMonth(today.getMonth() - 1);\n\nconst last2Months = new Date(today);\nlast2Months.setMonth(today.getMonth() - 2);\n\nconst last3Months = new Date(today);\nlast3Months.setMonth(today.getMonth() - 3);\n\nconst last6Months = new Date(today);\nlast6Months.setMonth(today.getMonth() - 6);\n\n/**\n * Presets for the `gs-date-range-selector` component that can be used as `dateRangeOptions`.\n */\nexport const dateRangeOptionPresets = {\n last2Weeks: {\n label: 'Last 2 weeks',\n dateFrom: toYYYYMMDD(twoWeeksAgo),\n },\n lastMonth: {\n label: 'Last month',\n dateFrom: toYYYYMMDD(lastMonth),\n },\n last2Months: {\n label: 'Last 2 months',\n dateFrom: toYYYYMMDD(last2Months),\n },\n last3Months: {\n label: 'Last 3 months',\n dateFrom: toYYYYMMDD(last3Months),\n },\n last6Months: {\n label: 'Last 6 months',\n dateFrom: toYYYYMMDD(last6Months),\n },\n allTimes: {\n label: 'All times',\n },\n} satisfies Record<string, DateRangeOption>;\n"],"names":["t","e","o","s","r","n","S","c","i","h","a","l","p","d","u","f","y","_a","b","z","problemDetail","__decorateClass","property","customElement","D","wrapper","useRef","useEffect","jsx","useState","useMemo","jsxs","createContext","blob","useErrorBoundary","x","item","useContext","heightOfTabs","error","Toolbar","byProportion","maxInData","datasets","getDataset","tooltip","v","padStart","padZoneStr","monthDiff","C.M","absFloor","prettyUnit","C.Y","C.W","C.D","C.DATE","C.H","C.MIN","C.S","C.MS","isUndefined","isDayjs","parseLocale","dayjs","parseDate","C.REGEX_PARSE","m","Dayjs","C.INVALID_DATE_STRING","instanceFactory","instanceFactorySet","C.MILLISECONDS_A_MINUTE","C.MILLISECONDS_A_HOUR","C.MILLISECONDS_A_SECOND","C.FORMAT_DEFAULT","getShort","get$H","matches","C.REGEX_FORMAT","diff","getMonth","C.Q","C.MILLISECONDS_A_WEEK","C.MILLISECONDS_A_DAY","proto","getYearFirstThursday","getCurrentWeekThursday","total","data","granularity","aggregatedResponse","getDatasets","lapisFilter","key","Fragment","MutationOverTimeWorker","today","options","value","selectedFilters","mutation","insertion"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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","x_google_ignoreList":[0,1,2,3,10,11,70,71,72,73,74,75]}