{"version":3,"file":"datasetService.mjs","sources":["../../lib/services/datasetService.ts"],"sourcesContent":["/* eslint-disable no-console */\n\n import axios from 'axios';\n import { has, isNil, isArray } from 'lodash-es';\n\n import dataGetters from './getters/data-getters';\n\n export const getResponseData = (dataset: { is_hvd: boolean; }) => {\n   const ds: {[key: string]: unknown} = {};\n   // New fields from DCAT-AP.de\n   // Dataset\n   ds.politicalGeocodingLevelURI = dataGetters.getArrayOfObjects(dataset, 'political_geocoding_level_uri', ['resource', 'label']);\n   ds.politicalGeocodingURI = dataGetters.getArrayOfObjects(dataset, 'political_geocoding_uri', ['resource', 'label']);\n   ds.availability = dataGetters.getObject(dataset, 'availability', ['resource', 'label']);\n   ds.contributorID = dataGetters.getArrayOfObjects(dataset, 'contributor_id', ['resource', 'label']);\n   ds.geocodingDescriptionDe = dataGetters.getObjectLanguage(dataset, 'geocoding_description');\n   ds.legalBasis = dataGetters.getObjectLanguage(dataset, 'legal_basis');\n   ds.qualityProcessURI = dataGetters.getString(dataset, 'quality_process_uri');\n   ds.typeDe = dataGetters.getString(dataset, 'type');\n   ds.references = dataGetters.getString(dataset, 'references');\n   ds.contributor = dataGetters.getArrayOfObjects(dataset, 'contributor', ['name', 'type', 'resource', 'email', 'homepage']);\n   ds.originator = dataGetters.getArrayOfObjects(dataset, 'originator', ['name', 'type', 'resource', 'email', 'homepage']);\n   ds.maintainer = dataGetters.getArrayOfObjects(dataset, 'maintainer', ['name', 'type', 'resource', 'email', 'homepage']);\n   //\n   ds.accessRights = dataGetters.getObject(dataset, 'access_right', ['label', 'resource']);\n   ds.accrualPeriodicity = dataGetters.getObject(dataset, 'accrual_periodicity', ['resource', 'label']);\n   ds.admsIdentifiers = dataGetters.getArrayOfObjects(dataset, 'adms_identifier', ['identifier', 'schema', 'resource']);\n   ds.attributes = dataGetters.getArrayOfStrings(dataset, 'attribute');\n   ds.catalog = dataGetters.getObject(dataset, 'catalog', ['id', 'title', 'description', 'country', 'homepage', 'issued', 'modified', 'language', 'license', 'publisher', 'spatial', 'spatial_resource', 'availability','is_part_of']);\n   ds.catalogRecord = dataGetters.getObject(dataset, 'catalog_record', ['issued', 'modified']);\n   ds.categories = dataGetters.getArrayOfObjects(dataset, 'categories', ['id', 'label']);\n   ds.conformsTo = dataGetters.getArrayOfObjects(dataset, 'conforms_to', ['label', 'resource']);\n   ds.contactPoints = dataGetters.getArrayOfObjects(dataset, 'contact_point', ['name','organisation_name', 'type', 'resource', 'email', 'telephone', 'address', 'url']);\n   ds.country = dataGetters.getObject(dataset, 'country', [{ key: 'id', default: 'eu' }, { key: 'title', default: 'European Union' }, { key: 'label', default: 'European Union' }]);\n   ds.creator = dataGetters.getArrayOfObjects(dataset, 'creator', ['name','resource','email', 'homepage']);\n   ds.deadline = dataGetters.getString(dataset, 'deadline');\n   ds.description = dataGetters.getObjectLanguage(dataset, 'description');\n   ds.dimensions = dataGetters.getArrayOfStrings(dataset, 'dimension');\n   ds.distributions = [];\n   ds.distributionFormats = [];\n   ds.documentations = dataGetters.getArrayOfStrings(dataset, 'documentations');\n   ds.extendetMetadata = dataGetters.getObject(dataset, 'extended_metadata', ['is_used_by']);\n   ds.frequency = dataGetters.getObject(dataset, 'frequency', ['title', 'resource']);\n   ds.geocodingDescription = dataGetters.getObject(dataset, 'geocoding_description', ['id', 'label']);\n   ds.hasQualityAnnotations = dataGetters.getArrayOfStrings(dataset, 'has_quality_annotation');\n   ds.hasVersion = dataGetters.getArrayOfStrings(dataset, 'has_version');\n   ds.id = dataGetters.getString(dataset, 'id');\n   ds.identifiers = dataGetters.getArrayOfStrings(dataset, 'identifier');\n   ds.idName = dataGetters.getString(dataset, 'idName');\n   ds.isHvd = dataset.is_hvd || false;\n   ds.hvdCategory = dataGetters.getArrayOfObjects(dataset, 'hvd_category', ['id', 'label', 'resource']);\n   ds.isReferencedBy = dataGetters.getArrayOfStrings(dataset, 'is_referenced_by');\n   ds.isVersionOf = dataGetters.getArrayOfStrings(dataset, 'is_version_of');\n   ds.keywords = dataGetters.getArrayOfObjects(dataset, 'keywords', ['id', 'label', 'language']);\n   ds.landingPages = dataGetters.getArrayOfObjects(dataset, 'landing_page', ['format', 'description', 'title', 'resource']);\n   ds.languages = dataGetters.getArrayOfObjects(dataset, 'language', ['id', 'label', 'resource']);\n   ds.licences = [];\n   ds.modificationDate = dataGetters.getString(dataset, 'modified');\n   ds.numSeries = dataGetters.getNumber(dataset, 'num_series');\n   ds.originalLanguage = dataGetters.getOriginalLanguage(dataset);\n   ds.otherIdentifiers = dataGetters.getArrayOfObjects(dataset, 'adms_identifier', ['identifier', 'scheme', 'resource']);\n   ds.pages = dataGetters.getArrayOfObjects(dataset, 'page', ['format', 'description', 'title', 'resource']);\n   ds.provenances = dataGetters.getArrayOfObjects(dataset, 'provenance', ['label', 'resource']);\n   ds.publisher = dataGetters.getObject(dataset, 'publisher', ['name', 'type', 'email', 'resource', 'homepage']);\n   ds.qualifiedAttributions = dataGetters.getArrayOfStrings(dataset, 'qualified_attribution');\n   ds.qualifiedRelations = dataGetters.getArrayOfObjects(dataset, 'qualified_relation', ['relation', 'had_role']);\n   ds.relations = dataGetters.getArrayOfStrings(dataset, 'relation');\n   // ds.relatedResources = dataGetters.getArrayOfStrings(dataset, 'related_resources');\n   ds.releaseDate = dataGetters.getString(dataset, 'issued');\n   ds.sample = dataGetters.getArrayOfStrings(dataset, 'sample');\n   ds.sources = dataGetters.getArrayOfStrings(dataset, 'source');\n   ds.spatial = dataGetters.getArrayOfObjects(dataset, 'spatial', ['type', 'coordinates']);\n   ds.spatialResolutionInMeters = dataGetters.getNumber(dataset, 'spatial_resolution_in_meters');\n   ds.spatialResource = dataGetters.getArrayOfObjects(dataset, 'spatial_resource', ['label', 'resource']);\n   ds.statUnitMeasures = dataGetters.getArrayOfStrings(dataset, 'stat_unit_measure');\n   ds.subject = dataGetters.getArrayOfObjects(dataset, 'subject', ['resource', 'label', 'id']);\n   ds.temporal = dataGetters.getArrayOfObjects(dataset, 'temporal', ['gte', 'lte']);\n   ds.temporalResolution = dataGetters.getString(dataset, 'temporal_resolution');\n   ds.theme = dataGetters.getArrayOfObjects(dataset, 'categories', ['id', 'label', 'resource']);\n   ds.translationMetaData = dataGetters.getTranslationMetaData(dataset);\n   ds.title = dataGetters.getObjectLanguage(dataset, 'title', '');\n   ds.type = dataGetters.getObject(dataset, 'type', ['id', 'label', 'resource']);\n   ds.resource = dataGetters.getString(dataset, 'resource');\n   ds.versionInfo = dataGetters.getString(dataset, 'version_info');\n   ds.versionNotes = dataGetters.getObjectLanguage(dataset, 'version_notes');\n   ds.visualisations = [];\n   ds.wasGeneratedBy = dataGetters.getArrayOfStrings(dataset, 'was_generated_by');\n\n  // High-value dataset fields\n  // https://semiceu.github.io/DCAT-AP/releases/2.2.0-hvd/\n  // NOTE: This is a solution primarily addressing Open Data Bayern's needs.\n  ds.isHvd = dataset.is_hvd || false;\n  ds.applicableLegislation = dataGetters.getArrayOfStrings(dataset, 'applicable_legislation');\n  ds.hvdCategory = dataGetters.getArrayOfObjects(dataset, 'hvd_category', ['id', 'label', 'resource']);\n\n   for (const dist of dataGetters.getDistributions(dataset)) {\n     const distribution : {[key: string]: unknown} = {};\n     distribution.accessUrl = dataGetters.getArrayOfStrings(dist, 'access_url');\n     distribution.accessService = dataGetters.getArrayOfObjects(dist, 'access_service', [\n      'title',\n      'description',\n      'endpoint_url',\n      'availability',\n      'applicable_legislation',\n      'contact_point',\n      'page',\n      'hvd_category',\n      'rights',\n    ]); // availability field for DCAT-AP.de\n     // distribution.accessService = dataGetters.getArrayOfStrings(dist, 'access_service');\n     distribution.licenseAttributionByText = dataGetters.getObjectLanguage(dist, 'license_attribution_by_text');\n     distribution.byteSize = dataGetters.getNumber(dist, 'byte_size');\n     distribution.checksum = dataGetters.getObject(dist, 'checksum', ['algorithm', 'checksum_value']);\n     distribution.compressFormat = dataGetters.getObject(dist, 'compress_format', ['label', 'resource']);\n     distribution.conformsTo = dataGetters.getArrayOfObjects(dist, 'conforms_to', ['label', 'resource']);\n     distribution.description = dataGetters.getObjectLanguage(dist, 'description', '');\n     distribution.downloadUrls = dataGetters.getArrayOfStrings(dist, 'download_url');\n     distribution.format = dataGetters.getObject(dist, 'format', ['id', 'resource', { key: 'label', default: 'UNKNOWN' }]);\n     distribution.hasPolicy = dataGetters.getString(dist, 'has_policy');\n     distribution.id = dataGetters.getString(dist, 'id');\n     distribution.languages = dataGetters.getArrayOfObjects(dist, 'language', ['id', 'label', 'resource']);\n     distribution.licence = dataGetters.getObject(dist, 'license', ['id', 'label', 'description', 'resource', 'la_url', 'homepage']);\n     distribution.mediaType = dataGetters.getString(dist, 'media_type');\n     distribution.modificationDate = dataGetters.getString(dist, 'modified');\n     distribution.packageFormat = dataGetters.getObject(dist, 'package_format', ['label', 'resource']);\n     distribution.pages = dataGetters.getArrayOfObjects(dist, 'page', ['format', 'title', 'description', 'resource']);\n     distribution.releaseDate = dataGetters.getString(dist, 'issued');\n     distribution.rights = dataGetters.getObject(dist, 'rights', ['label', 'resource']);\n     //distribution.spatialResolutionInMeters = dataGetters.getArrayOfNumbers(dist, 'spatial_resolution_in_meters');\n     distribution.spatialResolutionInMeters = dataGetters.getNumber(dist, 'spatial_resolution_in_meters');\n     distribution.status = dataGetters.getObject(dist, 'status', ['label', 'resource']);\n     distribution.temporalResolution = dataGetters.getArrayOfStrings(dist, 'temporal_resolution');\n     distribution.title = dataGetters.getObjectLanguage(dist, 'title', '');\n     distribution.type = dataGetters.getObject(dist, 'type', ['label', 'resource']);\n\n    // High-value dataset fields\n    // https://semiceu.github.io/DCAT-AP/releases/2.2.0-hvd/\n    // NOTE: This is a solution primarily addressing Open Data Bayern's needs.\n    distribution.applicableLegislation = dataGetters.getArrayOfObjects(dist, 'applicable_legislation', ['id', 'label', 'resource']);\n\n\n     // Check type of ditribution\n     if (distribution.type.resource === 'http://publications.europa.eu/resource/authority/distribution-type/VISUALIZATION') {\n       ds.visualisations.push(distribution);\n     } else {\n       ds.distributions.push(distribution);\n     }\n\n     ds.distributionFormats.push(distribution.format);\n     ds.licences.push(distribution.licence);\n\n   }\n\n  return {\n    ...ds,\n    __raw: { ...dataset },\n  };\n };\n\n const checkBounds = (bounds: any) => {\n   try {\n     let gb = bounds;\n     if (isNil(gb)) return undefined;\n     // If gb is a string, split to array\n     if (!isArray(gb) && typeof gb === 'string') gb = gb.split(',');\n     // Check number of elements. we need 4 for latMin, LonMin, LatMax, LonMax\n     if (isArray(gb) && gb.length === 4) {\n       for (const coord of gb) {\n         // Check if items are floats\n         if (!parseFloat(coord)) return undefined;\n         return gb;\n       }\n     }\n     return undefined;\n   } catch (error) {\n     console.error(error.message);\n     return undefined;\n   }\n };\n\n export default class Datasets {\n\n   private readonly baseUrl: string;\n   private readonly hubUrl: string;\n   private readonly qualityBaseUrl: string;\n   private readonly similarityBaseUrl: string;\n   private readonly similarityServiceName: string;\n   private readonly defaultScoringFacets: any[];\n\n   constructor(baseUrl: string, hubUrl: string, qualityBaseUrl: string, similarityBaseUrl: string, similarityServiceName: string, defaultScoringFacets: any[]) {\n     this.baseUrl = baseUrl;\n     this.hubUrl = hubUrl;\n     this.qualityBaseUrl = qualityBaseUrl;\n     this.similarityBaseUrl = similarityBaseUrl;\n     this.similarityServiceName = similarityServiceName;\n     this.defaultScoringFacets = defaultScoringFacets;\n   }\n\n   /**\n      * @description GET dataset by given id.\n      * @param id\n      */\n   getSingle(id: any) {\n     return new Promise((resolve, reject) => {\n       const endpoint = 'datasets';\n       const reqStr = `${this.baseUrl}${endpoint}/${id}`;\n       axios.get(reqStr, {\n         params: {},\n       })\n         .then((response) => {\n           const dataset = response.data.result;\n           let ds = {};\n           try {\n             ds = getResponseData(dataset);\n           } catch (error) {\n             console.warn('Error in datasets.js while checking response:', error.message);\n             console.error(error.stack);\n           }\n           resolve(ds);\n         })\n         .catch((error) => {\n           reject(error);\n         });\n     });\n   }\n\n   /**\n      * @description GET all datasets matching the given criteria.\n      * @param q\n      * @param fields\n      * @param locale\n      * @param facets\n      * @param geoBounds\n      * @param minScoring\n      * @param maxScoring\n      * @param dataScope\n      * @param minDate\n      * @param maxDate\n      * @param dateType\n      * @returns {Promise}\n      */\n   get(q: any, fields: any, locale: any, limit: any, page = 0, sort = `relevance+desc, modified+desc, title.${locale}+asc`, facetOperator = 'AND', facetGroupOperator = 'AND', dataServices = 'false', facets: { scoring: any; dataServices: any; }, geoBounds: any, minScoring = 0, maxScoring: any, dataScope: string, minDate: any, maxDate: any, dateType: any) {\n\n     facets = { ...facets }; // create a copy to prevent side effects\n     delete facets.scoring; // Those are not facets in the api call! They are separate query parameters\n     delete facets.dataServices; // ...\n     // The request parameters\n     const params: {[key: string]: unknown} = {\n       q,\n       fields,\n       filter: 'dataset',\n       limit,\n       page: page - 1,\n       sort,\n       facetOperator,\n       facetGroupOperator,\n       dataServices,\n       includes: `id,title.${locale},description.${locale},country,languages,modified,issued,catalog.id,catalog.title,catalog.country.id,distributions.id,distributions.format.label,distributions.format.id,distributions.license,categories.label,publisher`,\n       facets,\n       minDate,\n       maxDate,\n       dateType,\n     };\n\n     // Check if minScoring is set\n     if (minScoring > 0) params.minScoring = minScoring;\n     if (maxScoring > 0) params.maxScoring = maxScoring;\n\n     // Check if dataScope is set and then modify params to fullfil the corresponding data scope criterias\n     if (!isNil(dataScope)) {\n        // Set countryData param to true if Country data is requested\n        params.countryData = dataScope === 'countryData';\n        // Set country facets param\n        if (params.countryData) {\n          params.facets.country = params.facets.country.filter((c: string) => c !== 'countryData');\n        } else {\n          params.facets.country = [];\n          params.facets.country.push(dataScope);\n        }\n      }\n\n      // Add geoBounds parameters if the bounds are valid\n      const bounds = checkBounds(geoBounds);\n      if (!isNil(bounds)) {\n        params.bboxMinLat = bounds[0];\n        params.bboxMaxLat = bounds[2];\n        params.bboxMinLon = bounds[1];\n        params.bboxMaxLon = bounds[3];\n      }\n\n      return new Promise((resolve, reject) => {\n        const endpoint = 'search';\n        const reqStr = `${this.baseUrl}${endpoint}`;\n        axios.get(reqStr, {\n          params,\n        })\n          .then((response) => {\n            if (!has(response.data, 'result')) {\n              console.warn('Error in datasets.js while checking response');\n              return reject(new Error('Empty Response Data'));\n            }\n            /**\n            * @property availableFacets\n            * @type {availableFacets: Array, datasetsCount, datasets: Array}\n            * @description The set union of all available facets for the .\n            */\n            const resData = {\n              availableFacets: [],\n              scoringCount: {},\n              datasetsCount: response.data.result.count,\n              datasets: [],\n            };\n\n            // Transform fetched facets\n            for (const field of response.data.result.facets) {\n              // Check for required field keys\n              if (has(field, 'id') && has(field, 'title') && has(field, 'items')) {\n                const items = [];\n                for (const facet of field.items) {\n                  const item: {id?: any, title?: any, count?: any, minScoring?: any, maxScoring?: any} = {};\n                  // Check for required facet/item keys\n                  if (has(facet, 'id') && has(facet, 'title') && has(facet, 'count')) {\n                    item.id = facet.id;\n                    item.title = facet.title;\n                    item.count = facet.count;\n                  }\n                  // Handle Scoring Facets\n                  if (has(facet, 'from') && has(facet, 'to')) {\n                    const currentScoringFacet: {id?: any, title?: any, count?: any, minScoring?: any, maxScoring?: any} = this.defaultScoringFacets[facet.id];\n                    item.minScoring = facet.from;\n                    item.maxScoring = facet.to;\n\n                    // Use config values to overwrite the default values from the backend\n                    if (currentScoringFacet.title) item.title = currentScoringFacet.title;\n                    if (currentScoringFacet.minScoring) item.minScoring = currentScoringFacet.minScoring;\n                    if (currentScoringFacet.maxScoring) item.maxScoring = currentScoringFacet.maxScoring;\n                  }\n                  items.push(item);\n                }\n                // Add to response array\n                resData.availableFacets.push({\n                  id: field.id,\n                  title: field.title,\n                  items,\n                });\n              }\n            }\n\n            // Transform Datasets Data model\n            const datasets = response.data.result.results;\n\n            for (const dataset of datasets) {\n              let ds = {};\n              try {\n                ds = getResponseData(dataset);\n              } catch (error) {\n                console.warn('Error in datasets.js while checking response:', error.message);\n                console.error(error.stack);\n              }\n              resData.datasets.push(ds);\n            }\n            return resolve(resData);\n          })\n          .catch((error) => {\n            console.error(error);\n            reject(error);\n          });\n      });\n    }\n\n    /**\n     * @description Get similar datasets to the dataset represented by the provided id.\n     * @param id {string} The dataset id to get similar datasets for.\n     * @param properties additional parameters, in particular for the knn-request\n     * @param query {SimilarDatasetsQuery} query params\n     */\n    getSimilarDatasets(id: any, properties: any, query?: SimilarDatasetsQuery) {\n      return new Promise((resolve, reject) => {\n        let url = this.similarityBaseUrl;\n        if ( ! url.endsWith('/')) {\n          url += '/';\n        }\n        const similarityServiceName = this.similarityServiceName;\n        if (similarityServiceName === 'knn_request') {\n            properties.exclude_uris = [`http://data.europa.eu/88u/dataset/${id}`];\n            // properties.exclude_uris = [`https://data.europa.eu/api/hub/search/datasets/${id}`];\n            axios.post(`${url}knn_request/`, { ...properties, k: 10})\n              .then((response) => {\n                resolve(response);\n              })\n              .catch((error) => {\n                reject(error);\n              });\n        } else {\n            const reqStr = `${url}similarity/${id}`;\n            axios.get(reqStr, {\n                params: query,\n            }).then((response) => {\n                resolve(response);\n            })\n            .catch((error) => {\n                reject(error);\n            });\n        }\n      });\n    }\n    // curl -i -X POST -H \"Content-Type: application/json\" -d '{\"k\": 10, \"query\": \"This dataset presents all the political groups of the French National Assembly since the 14th legislature (2012). The data comes from open data from the National Assembly.\"}' https://live-service-server-data-europa-eu.apps.osc.fokus.fraunhofer.de/knn_request\n\n    getQualityData(id: any) {\n      return new Promise((resolve, reject) => {\n        const endpoint = 'datasets';\n        const reqStr = `${this.qualityBaseUrl}${endpoint}/${id} `;\n        axios.get(reqStr, {\n          timeout: 30000,\n        })\n          .then((response) => {\n            resolve(response);\n          })\n          .catch((error) => {\n            reject(error);\n          });\n      });\n    }\n\n    getQualityDistributionData(id: any) {\n      return new Promise((resolve, reject) => {\n        const endpoint = `datasets/${id}/distributions`;\n        const reqStr = `${this.qualityBaseUrl}${endpoint} `;\n        axios.get(reqStr, {\n          timeout: 30000,\n        })\n          .then((response) => {\n            resolve(response);\n          })\n          .catch((error) => {\n            reject(error);\n          });\n      });\n    }\n\n    getDQVDataHead(id: any, locale: any) {\n      return new Promise((resolve, reject) => {\n        // Only check if DQV data is available. No need to request single formats.\n        const reqStr = `${this.hubUrl}datasets/${id}/metrics`;\n        axios.head(reqStr, {\n        })\n          .then((response) => {\n            resolve(response);\n          })\n          .catch((error) => {\n            reject(error);\n          });\n      });\n    }\n\n    /**\n   * @description Autocomplete the given query.\n   * @param q {String} The Query to autocomplete.\n   */\n    autocomplete(q: any) {\n      return new Promise((resolve, reject) => {\n        const endpoint = 'autocomplete';\n        const reqStr = `${this.baseUrl}${endpoint}`;\n        axios.get(reqStr, {\n          params: {\n            q,\n          },\n        })\n          .then((response) => {\n            resolve(response);\n          })\n          .catch((err) => {\n            reject(err);\n          });\n      });\n    }\n}\n\nexport interface SimilarDatasetsQuery {\n    limits?: number\n}\n"],"names":["getResponseData","dataset","ds","dataGetters","dist","distribution","checkBounds","bounds","gb","isNil","isArray","coord","error","Datasets","baseUrl","hubUrl","qualityBaseUrl","similarityBaseUrl","similarityServiceName","defaultScoringFacets","__publicField","id","resolve","reject","endpoint","reqStr","axios","response","q","fields","locale","limit","page","sort","facetOperator","facetGroupOperator","dataServices","facets","geoBounds","minScoring","maxScoring","dataScope","minDate","maxDate","dateType","params","c","has","resData","field","items","facet","item","currentScoringFacet","datasets","properties","query","url","err"],"mappings":";;;;;;AAOc,MAAAA,IAAkB,CAACC,MAAkC;AAChE,QAAMC,IAA+B,CAAA;AAGlC,EAAAA,EAAA,6BAA6BC,EAAY,kBAAkBF,GAAS,iCAAiC,CAAC,YAAY,OAAO,CAAC,GAC1HC,EAAA,wBAAwBC,EAAY,kBAAkBF,GAAS,2BAA2B,CAAC,YAAY,OAAO,CAAC,GAC/GC,EAAA,eAAeC,EAAY,UAAUF,GAAS,gBAAgB,CAAC,YAAY,OAAO,CAAC,GACnFC,EAAA,gBAAgBC,EAAY,kBAAkBF,GAAS,kBAAkB,CAAC,YAAY,OAAO,CAAC,GACjGC,EAAG,yBAAyBC,EAAY,kBAAkBF,GAAS,uBAAuB,GAC1FC,EAAG,aAAaC,EAAY,kBAAkBF,GAAS,aAAa,GACpEC,EAAG,oBAAoBC,EAAY,UAAUF,GAAS,qBAAqB,GAC3EC,EAAG,SAASC,EAAY,UAAUF,GAAS,MAAM,GACjDC,EAAG,aAAaC,EAAY,UAAUF,GAAS,YAAY,GACxDC,EAAA,cAAcC,EAAY,kBAAkBF,GAAS,eAAe,CAAC,QAAQ,QAAQ,YAAY,SAAS,UAAU,CAAC,GACrHC,EAAA,aAAaC,EAAY,kBAAkBF,GAAS,cAAc,CAAC,QAAQ,QAAQ,YAAY,SAAS,UAAU,CAAC,GACnHC,EAAA,aAAaC,EAAY,kBAAkBF,GAAS,cAAc,CAAC,QAAQ,QAAQ,YAAY,SAAS,UAAU,CAAC,GAEnHC,EAAA,eAAeC,EAAY,UAAUF,GAAS,gBAAgB,CAAC,SAAS,UAAU,CAAC,GACnFC,EAAA,qBAAqBC,EAAY,UAAUF,GAAS,uBAAuB,CAAC,YAAY,OAAO,CAAC,GAChGC,EAAA,kBAAkBC,EAAY,kBAAkBF,GAAS,mBAAmB,CAAC,cAAc,UAAU,UAAU,CAAC,GACnHC,EAAG,aAAaC,EAAY,kBAAkBF,GAAS,WAAW,GAC/DC,EAAA,UAAUC,EAAY,UAAUF,GAAS,WAAW,CAAC,MAAM,SAAS,eAAe,WAAW,YAAY,UAAU,YAAY,YAAY,WAAW,aAAa,WAAW,oBAAoB,gBAAe,YAAY,CAAC,GAC/NC,EAAA,gBAAgBC,EAAY,UAAUF,GAAS,kBAAkB,CAAC,UAAU,UAAU,CAAC,GACvFC,EAAA,aAAaC,EAAY,kBAAkBF,GAAS,cAAc,CAAC,MAAM,OAAO,CAAC,GACjFC,EAAA,aAAaC,EAAY,kBAAkBF,GAAS,eAAe,CAAC,SAAS,UAAU,CAAC,GAC3FC,EAAG,gBAAgBC,EAAY,kBAAkBF,GAAS,iBAAiB,CAAC,QAAO,qBAAqB,QAAQ,YAAY,SAAS,aAAa,WAAW,KAAK,CAAC,GAChKC,EAAA,UAAUC,EAAY,UAAUF,GAAS,WAAW,CAAC,EAAE,KAAK,MAAM,SAAS,KAAK,GAAG,EAAE,KAAK,SAAS,SAAS,oBAAoB,EAAE,KAAK,SAAS,SAAS,iBAAkB,CAAA,CAAC,GAC5KC,EAAA,UAAUC,EAAY,kBAAkBF,GAAS,WAAW,CAAC,QAAO,YAAW,SAAS,UAAU,CAAC,GACtGC,EAAG,WAAWC,EAAY,UAAUF,GAAS,UAAU,GACvDC,EAAG,cAAcC,EAAY,kBAAkBF,GAAS,aAAa,GACrEC,EAAG,aAAaC,EAAY,kBAAkBF,GAAS,WAAW,GAClEC,EAAG,gBAAgB,IACnBA,EAAG,sBAAsB,IACzBA,EAAG,iBAAiBC,EAAY,kBAAkBF,GAAS,gBAAgB,GAC3EC,EAAG,mBAAmBC,EAAY,UAAUF,GAAS,qBAAqB,CAAC,YAAY,CAAC,GACrFC,EAAA,YAAYC,EAAY,UAAUF,GAAS,aAAa,CAAC,SAAS,UAAU,CAAC,GAC7EC,EAAA,uBAAuBC,EAAY,UAAUF,GAAS,yBAAyB,CAAC,MAAM,OAAO,CAAC,GACjGC,EAAG,wBAAwBC,EAAY,kBAAkBF,GAAS,wBAAwB,GAC1FC,EAAG,aAAaC,EAAY,kBAAkBF,GAAS,aAAa,GACpEC,EAAG,KAAKC,EAAY,UAAUF,GAAS,IAAI,GAC3CC,EAAG,cAAcC,EAAY,kBAAkBF,GAAS,YAAY,GACpEC,EAAG,SAASC,EAAY,UAAUF,GAAS,QAAQ,GAChDC,EAAA,QAAQD,EAAQ,UAAU,IAC1BC,EAAA,cAAcC,EAAY,kBAAkBF,GAAS,gBAAgB,CAAC,MAAM,SAAS,UAAU,CAAC,GACnGC,EAAG,iBAAiBC,EAAY,kBAAkBF,GAAS,kBAAkB,GAC7EC,EAAG,cAAcC,EAAY,kBAAkBF,GAAS,eAAe,GACpEC,EAAA,WAAWC,EAAY,kBAAkBF,GAAS,YAAY,CAAC,MAAM,SAAS,UAAU,CAAC,GACzFC,EAAA,eAAeC,EAAY,kBAAkBF,GAAS,gBAAgB,CAAC,UAAU,eAAe,SAAS,UAAU,CAAC,GACpHC,EAAA,YAAYC,EAAY,kBAAkBF,GAAS,YAAY,CAAC,MAAM,SAAS,UAAU,CAAC,GAC7FC,EAAG,WAAW,IACdA,EAAG,mBAAmBC,EAAY,UAAUF,GAAS,UAAU,GAC/DC,EAAG,YAAYC,EAAY,UAAUF,GAAS,YAAY,GACvDC,EAAA,mBAAmBC,EAAY,oBAAoBF,CAAO,GAC1DC,EAAA,mBAAmBC,EAAY,kBAAkBF,GAAS,mBAAmB,CAAC,cAAc,UAAU,UAAU,CAAC,GACjHC,EAAA,QAAQC,EAAY,kBAAkBF,GAAS,QAAQ,CAAC,UAAU,eAAe,SAAS,UAAU,CAAC,GACrGC,EAAA,cAAcC,EAAY,kBAAkBF,GAAS,cAAc,CAAC,SAAS,UAAU,CAAC,GACxFC,EAAA,YAAYC,EAAY,UAAUF,GAAS,aAAa,CAAC,QAAQ,QAAQ,SAAS,YAAY,UAAU,CAAC,GAC5GC,EAAG,wBAAwBC,EAAY,kBAAkBF,GAAS,uBAAuB,GACtFC,EAAA,qBAAqBC,EAAY,kBAAkBF,GAAS,sBAAsB,CAAC,YAAY,UAAU,CAAC,GAC7GC,EAAG,YAAYC,EAAY,kBAAkBF,GAAS,UAAU,GAEhEC,EAAG,cAAcC,EAAY,UAAUF,GAAS,QAAQ,GACxDC,EAAG,SAASC,EAAY,kBAAkBF,GAAS,QAAQ,GAC3DC,EAAG,UAAUC,EAAY,kBAAkBF,GAAS,QAAQ,GACzDC,EAAA,UAAUC,EAAY,kBAAkBF,GAAS,WAAW,CAAC,QAAQ,aAAa,CAAC,GACtFC,EAAG,4BAA4BC,EAAY,UAAUF,GAAS,8BAA8B,GACzFC,EAAA,kBAAkBC,EAAY,kBAAkBF,GAAS,oBAAoB,CAAC,SAAS,UAAU,CAAC,GACrGC,EAAG,mBAAmBC,EAAY,kBAAkBF,GAAS,mBAAmB,GAC7EC,EAAA,UAAUC,EAAY,kBAAkBF,GAAS,WAAW,CAAC,YAAY,SAAS,IAAI,CAAC,GACvFC,EAAA,WAAWC,EAAY,kBAAkBF,GAAS,YAAY,CAAC,OAAO,KAAK,CAAC,GAC/EC,EAAG,qBAAqBC,EAAY,UAAUF,GAAS,qBAAqB,GACzEC,EAAA,QAAQC,EAAY,kBAAkBF,GAAS,cAAc,CAAC,MAAM,SAAS,UAAU,CAAC,GACxFC,EAAA,sBAAsBC,EAAY,uBAAuBF,CAAO,GACnEC,EAAG,QAAQC,EAAY,kBAAkBF,GAAS,SAAS,EAAE,GAC1DC,EAAA,OAAOC,EAAY,UAAUF,GAAS,QAAQ,CAAC,MAAM,SAAS,UAAU,CAAC,GAC5EC,EAAG,WAAWC,EAAY,UAAUF,GAAS,UAAU,GACvDC,EAAG,cAAcC,EAAY,UAAUF,GAAS,cAAc,GAC9DC,EAAG,eAAeC,EAAY,kBAAkBF,GAAS,eAAe,GACxEC,EAAG,iBAAiB,IACpBA,EAAG,iBAAiBC,EAAY,kBAAkBF,GAAS,kBAAkB,GAK3EC,EAAA,QAAQD,EAAQ,UAAU,IAC7BC,EAAG,wBAAwBC,EAAY,kBAAkBF,GAAS,wBAAwB,GACvFC,EAAA,cAAcC,EAAY,kBAAkBF,GAAS,gBAAgB,CAAC,MAAM,SAAS,UAAU,CAAC;AAElG,aAAWG,KAAQD,EAAY,iBAAiBF,CAAO,GAAG;AACxD,UAAMI,IAA0C,CAAA;AAChD,IAAAA,EAAa,YAAYF,EAAY,kBAAkBC,GAAM,YAAY,GACzEC,EAAa,gBAAgBF,EAAY,kBAAkBC,GAAM,kBAAkB;AAAA,MAClF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD,GAEAC,EAAa,2BAA2BF,EAAY,kBAAkBC,GAAM,6BAA6B,GACzGC,EAAa,WAAWF,EAAY,UAAUC,GAAM,WAAW,GAClDC,EAAA,WAAWF,EAAY,UAAUC,GAAM,YAAY,CAAC,aAAa,gBAAgB,CAAC,GAClFC,EAAA,iBAAiBF,EAAY,UAAUC,GAAM,mBAAmB,CAAC,SAAS,UAAU,CAAC,GACrFC,EAAA,aAAaF,EAAY,kBAAkBC,GAAM,eAAe,CAAC,SAAS,UAAU,CAAC,GAClGC,EAAa,cAAcF,EAAY,kBAAkBC,GAAM,eAAe,EAAE,GAChFC,EAAa,eAAeF,EAAY,kBAAkBC,GAAM,cAAc,GAC9EC,EAAa,SAASF,EAAY,UAAUC,GAAM,UAAU,CAAC,MAAM,YAAY,EAAE,KAAK,SAAS,SAAS,UAAA,CAAW,CAAC,GACpHC,EAAa,YAAYF,EAAY,UAAUC,GAAM,YAAY,GACjEC,EAAa,KAAKF,EAAY,UAAUC,GAAM,IAAI,GACrCC,EAAA,YAAYF,EAAY,kBAAkBC,GAAM,YAAY,CAAC,MAAM,SAAS,UAAU,CAAC,GACpGC,EAAa,UAAUF,EAAY,UAAUC,GAAM,WAAW,CAAC,MAAM,SAAS,eAAe,YAAY,UAAU,UAAU,CAAC,GAC9HC,EAAa,YAAYF,EAAY,UAAUC,GAAM,YAAY,GACjEC,EAAa,mBAAmBF,EAAY,UAAUC,GAAM,UAAU,GACzDC,EAAA,gBAAgBF,EAAY,UAAUC,GAAM,kBAAkB,CAAC,SAAS,UAAU,CAAC,GACnFC,EAAA,QAAQF,EAAY,kBAAkBC,GAAM,QAAQ,CAAC,UAAU,SAAS,eAAe,UAAU,CAAC,GAC/GC,EAAa,cAAcF,EAAY,UAAUC,GAAM,QAAQ,GAClDC,EAAA,SAASF,EAAY,UAAUC,GAAM,UAAU,CAAC,SAAS,UAAU,CAAC,GAEjFC,EAAa,4BAA4BF,EAAY,UAAUC,GAAM,8BAA8B,GACtFC,EAAA,SAASF,EAAY,UAAUC,GAAM,UAAU,CAAC,SAAS,UAAU,CAAC,GACjFC,EAAa,qBAAqBF,EAAY,kBAAkBC,GAAM,qBAAqB,GAC3FC,EAAa,QAAQF,EAAY,kBAAkBC,GAAM,SAAS,EAAE,GACvDC,EAAA,OAAOF,EAAY,UAAUC,GAAM,QAAQ,CAAC,SAAS,UAAU,CAAC,GAKjEC,EAAA,wBAAwBF,EAAY,kBAAkBC,GAAM,0BAA0B,CAAC,MAAM,SAAS,UAAU,CAAC,GAIzHC,EAAa,KAAK,aAAa,qFAC9BH,EAAA,eAAe,KAAKG,CAAY,IAEhCH,EAAA,cAAc,KAAKG,CAAY,GAGjCH,EAAA,oBAAoB,KAAKG,EAAa,MAAM,GAC5CH,EAAA,SAAS,KAAKG,EAAa,OAAO;AAAA,EAEvC;AAEM,SAAA;AAAA,IACL,GAAGH;AAAA,IACH,OAAO,EAAE,GAAGD,EAAQ;AAAA,EAAA;AAEvB,GAEMK,IAAc,CAACC,MAAgB;AAC/B,MAAA;AACF,QAAIC,IAAKD;AACT,QAAIE,EAAMD,CAAE;AAAU;AAItB,QAFI,CAACE,EAAQF,CAAE,KAAK,OAAOA,KAAO,aAAeA,IAAAA,EAAG,MAAM,GAAG,IAEzDE,EAAQF,CAAE,KAAKA,EAAG,WAAW;AAC/B,iBAAWG,KAASH;AAEd,eAAC,WAAWG,CAAK,IACdH,IADwB;AAI5B;AAAA,WACAI,GAAO;AACN,YAAA,MAAMA,EAAM,OAAO;AACpB;AAAA,EACT;AACF;AAEA,MAAqBC,EAAS;AAAA,EAS5B,YAAYC,GAAiBC,GAAgBC,GAAwBC,GAA2BC,GAA+BC,GAA6B;AAP3I,IAAAC,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AACA,IAAAA,EAAA;AAGf,SAAK,UAAUN,GACf,KAAK,SAASC,GACd,KAAK,iBAAiBC,GACtB,KAAK,oBAAoBC,GACzB,KAAK,wBAAwBC,GAC7B,KAAK,uBAAuBC;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,UAAUE,GAAS;AACjB,WAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AACtC,YAAMC,IAAW,YACXC,IAAS,GAAG,KAAK,OAAO,GAAGD,CAAQ,IAAIH,CAAE;AAC/C,MAAAK,EAAM,IAAID,GAAQ;AAAA,QAChB,QAAQ,CAAC;AAAA,MAAA,CACV,EACE,KAAK,CAACE,MAAa;AACZ,cAAA1B,IAAU0B,EAAS,KAAK;AAC9B,YAAIzB,IAAK,CAAA;AACL,YAAA;AACF,UAAAA,IAAKF,EAAgBC,CAAO;AAAA,iBACrBW,GAAO;AACN,kBAAA,KAAK,iDAAiDA,EAAM,OAAO,GACnE,QAAA,MAAMA,EAAM,KAAK;AAAA,QAC3B;AACA,QAAAU,EAAQpB,CAAE;AAAA,MAAA,CACX,EACA,MAAM,CAACU,MAAU;AAChB,QAAAW,EAAOX,CAAK;AAAA,MAAA,CACb;AAAA,IAAA,CACJ;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,IAAIgB,GAAQC,GAAaC,GAAaC,GAAYC,IAAO,GAAGC,IAAO,wCAAwCH,CAAM,QAAQI,IAAgB,OAAOC,IAAqB,OAAOC,IAAe,SAASC,GAA8CC,GAAgBC,IAAa,GAAGC,GAAiBC,GAAmBC,GAAcC,GAAcC,GAAe;AAEtV,IAAAP,IAAA,EAAE,GAAGA,KACd,OAAOA,EAAO,SACd,OAAOA,EAAO;AAEd,UAAMQ,IAAmC;AAAA,MACvC,GAAAjB;AAAA,MACA,QAAAC;AAAA,MACA,QAAQ;AAAA,MACR,OAAAE;AAAA,MACA,MAAMC,IAAO;AAAA,MACb,MAAAC;AAAA,MACA,eAAAC;AAAA,MACA,oBAAAC;AAAA,MACA,cAAAC;AAAA,MACA,UAAU,YAAYN,CAAM,gBAAgBA,CAAM;AAAA,MAClD,QAAAO;AAAA,MACA,SAAAK;AAAA,MACA,SAAAC;AAAA,MACA,UAAAC;AAAA,IAAA;AAIF,IAAIL,IAAa,MAAGM,EAAO,aAAaN,IACpCC,IAAa,MAAGK,EAAO,aAAaL,IAGnC/B,EAAMgC,CAAS,MAEjBI,EAAO,cAAcJ,MAAc,eAE/BI,EAAO,cACFA,EAAA,OAAO,UAAUA,EAAO,OAAO,QAAQ,OAAO,CAACC,MAAcA,MAAM,aAAa,KAEhFD,EAAA,OAAO,UAAU,IACjBA,EAAA,OAAO,QAAQ,KAAKJ,CAAS;AAKlC,UAAAlC,IAASD,EAAYgC,CAAS;AAChC,WAAC7B,EAAMF,CAAM,MACRsC,EAAA,aAAatC,EAAO,CAAC,GACrBsC,EAAA,aAAatC,EAAO,CAAC,GACrBsC,EAAA,aAAatC,EAAO,CAAC,GACrBsC,EAAA,aAAatC,EAAO,CAAC,IAGvB,IAAI,QAAQ,CAACe,GAASC,MAAW;AACtC,YAAMC,IAAW,UACXC,IAAS,GAAG,KAAK,OAAO,GAAGD,CAAQ;AACzC,MAAAE,EAAM,IAAID,GAAQ;AAAA,QAChB,QAAAoB;AAAA,MAAA,CACD,EACE,KAAK,CAAClB,MAAa;AAClB,YAAI,CAACoB,EAAIpB,EAAS,MAAM,QAAQ;AAC9B,yBAAQ,KAAK,8CAA8C,GACpDJ,EAAO,IAAI,MAAM,qBAAqB,CAAC;AAOhD,cAAMyB,IAAU;AAAA,UACd,iBAAiB,CAAC;AAAA,UAClB,cAAc,CAAC;AAAA,UACf,eAAerB,EAAS,KAAK,OAAO;AAAA,UACpC,UAAU,CAAC;AAAA,QAAA;AAIb,mBAAWsB,KAAStB,EAAS,KAAK,OAAO;AAEnC,cAAAoB,EAAIE,GAAO,IAAI,KAAKF,EAAIE,GAAO,OAAO,KAAKF,EAAIE,GAAO,OAAO,GAAG;AAClE,kBAAMC,IAAQ,CAAA;AACH,uBAAAC,KAASF,EAAM,OAAO;AAC/B,oBAAMG,IAAiF,CAAA;AAQvF,kBANIL,EAAII,GAAO,IAAI,KAAKJ,EAAII,GAAO,OAAO,KAAKJ,EAAII,GAAO,OAAO,MAC/DC,EAAK,KAAKD,EAAM,IAChBC,EAAK,QAAQD,EAAM,OACnBC,EAAK,QAAQD,EAAM,QAGjBJ,EAAII,GAAO,MAAM,KAAKJ,EAAII,GAAO,IAAI,GAAG;AAC1C,sBAAME,IAAgG,KAAK,qBAAqBF,EAAM,EAAE;AACxI,gBAAAC,EAAK,aAAaD,EAAM,MACxBC,EAAK,aAAaD,EAAM,IAGpBE,EAAoB,UAAOD,EAAK,QAAQC,EAAoB,QAC5DA,EAAoB,eAAYD,EAAK,aAAaC,EAAoB,aACtEA,EAAoB,eAAYD,EAAK,aAAaC,EAAoB;AAAA,cAC5E;AACA,cAAAH,EAAM,KAAKE,CAAI;AAAA,YACjB;AAEA,YAAAJ,EAAQ,gBAAgB,KAAK;AAAA,cAC3B,IAAIC,EAAM;AAAA,cACV,OAAOA,EAAM;AAAA,cACb,OAAAC;AAAA,YAAA,CACD;AAAA,UACH;AAII,cAAAI,IAAW3B,EAAS,KAAK,OAAO;AAEtC,mBAAW1B,KAAWqD,GAAU;AAC9B,cAAIpD,IAAK,CAAA;AACL,cAAA;AACF,YAAAA,IAAKF,EAAgBC,CAAO;AAAA,mBACrBW,GAAO;AACN,oBAAA,KAAK,iDAAiDA,EAAM,OAAO,GACnE,QAAA,MAAMA,EAAM,KAAK;AAAA,UAC3B;AACQ,UAAAoC,EAAA,SAAS,KAAK9C,CAAE;AAAA,QAC1B;AACA,eAAOoB,EAAQ0B,CAAO;AAAA,MAAA,CACvB,EACA,MAAM,CAACpC,MAAU;AAChB,gBAAQ,MAAMA,CAAK,GACnBW,EAAOX,CAAK;AAAA,MAAA,CACb;AAAA,IAAA,CACJ;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmBS,GAASkC,GAAiBC,GAA8B;AACzE,WAAO,IAAI,QAAQ,CAAClC,GAASC,MAAW;AACtC,UAAIkC,IAAM,KAAK;AAKf,UAJOA,EAAI,SAAS,GAAG,MACdA,KAAA,MAEqB,KAAK,0BACL;AAC1B,QAAAF,EAAW,eAAe,CAAC,qCAAqClC,CAAE,EAAE,GAEpEK,EAAM,KAAK,GAAG+B,CAAG,gBAAgB,EAAE,GAAGF,GAAY,GAAG,GAAE,CAAC,EACrD,KAAK,CAAC5B,MAAa;AAClB,UAAAL,EAAQK,CAAQ;AAAA,QAAA,CACjB,EACA,MAAM,CAACf,MAAU;AAChB,UAAAW,EAAOX,CAAK;AAAA,QAAA,CACb;AAAA,WACA;AACH,cAAMa,IAAS,GAAGgC,CAAG,cAAcpC,CAAE;AACrC,QAAAK,EAAM,IAAID,GAAQ;AAAA,UACd,QAAQ+B;AAAA,QAAA,CACX,EAAE,KAAK,CAAC7B,MAAa;AAClB,UAAAL,EAAQK,CAAQ;AAAA,QAAA,CACnB,EACA,MAAM,CAACf,MAAU;AACd,UAAAW,EAAOX,CAAK;AAAA,QAAA,CACf;AAAA,MACL;AAAA,IAAA,CACD;AAAA,EACH;AAAA;AAAA,EAGA,eAAeS,GAAS;AACtB,WAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AACtC,YAAMC,IAAW,YACXC,IAAS,GAAG,KAAK,cAAc,GAAGD,CAAQ,IAAIH,CAAE;AACtD,MAAAK,EAAM,IAAID,GAAQ;AAAA,QAChB,SAAS;AAAA,MAAA,CACV,EACE,KAAK,CAACE,MAAa;AAClB,QAAAL,EAAQK,CAAQ;AAAA,MAAA,CACjB,EACA,MAAM,CAACf,MAAU;AAChB,QAAAW,EAAOX,CAAK;AAAA,MAAA,CACb;AAAA,IAAA,CACJ;AAAA,EACH;AAAA,EAEA,2BAA2BS,GAAS;AAClC,WAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AAChC,YAAAC,IAAW,YAAYH,CAAE,kBACzBI,IAAS,GAAG,KAAK,cAAc,GAAGD,CAAQ;AAChD,MAAAE,EAAM,IAAID,GAAQ;AAAA,QAChB,SAAS;AAAA,MAAA,CACV,EACE,KAAK,CAACE,MAAa;AAClB,QAAAL,EAAQK,CAAQ;AAAA,MAAA,CACjB,EACA,MAAM,CAACf,MAAU;AAChB,QAAAW,EAAOX,CAAK;AAAA,MAAA,CACb;AAAA,IAAA,CACJ;AAAA,EACH;AAAA,EAEA,eAAeS,GAASS,GAAa;AACnC,WAAO,IAAI,QAAQ,CAACR,GAASC,MAAW;AAEtC,YAAME,IAAS,GAAG,KAAK,MAAM,YAAYJ,CAAE;AAC3C,MAAAK,EAAM,KAAKD,GAAQ,CAClB,CAAA,EACE,KAAK,CAACE,MAAa;AAClB,QAAAL,EAAQK,CAAQ;AAAA,MAAA,CACjB,EACA,MAAM,CAACf,MAAU;AAChB,QAAAW,EAAOX,CAAK;AAAA,MAAA,CACb;AAAA,IAAA,CACJ;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,aAAagB,GAAQ;AACnB,WAAO,IAAI,QAAQ,CAACN,GAASC,MAAW;AACtC,YAAMC,IAAW,gBACXC,IAAS,GAAG,KAAK,OAAO,GAAGD,CAAQ;AACzC,MAAAE,EAAM,IAAID,GAAQ;AAAA,QAChB,QAAQ;AAAA,UACN,GAAAG;AAAA,QACF;AAAA,MAAA,CACD,EACE,KAAK,CAACD,MAAa;AAClB,QAAAL,EAAQK,CAAQ;AAAA,MAAA,CACjB,EACA,MAAM,CAAC+B,MAAQ;AACd,QAAAnC,EAAOmC,CAAG;AAAA,MAAA,CACX;AAAA,IAAA,CACJ;AAAA,EACH;AACJ;"}