{"version":3,"file":"react-querybuilder_core.production.mjs","names":["defaultPlaceholderFieldName: typeof defaultPlaceholderName","defaultPlaceholderFieldLabel: typeof defaultPlaceholderLabel","defaultPlaceholderFieldGroupLabel: typeof defaultPlaceholderLabel","defaultPlaceholderOperatorName: typeof defaultPlaceholderName","defaultPlaceholderOperatorLabel: typeof defaultPlaceholderLabel","defaultPlaceholderOperatorGroupLabel: typeof defaultPlaceholderLabel","defaultPlaceholderValueName: typeof defaultPlaceholderName","defaultPlaceholderValueLabel: typeof defaultPlaceholderLabel","defaultPlaceholderValueGroupLabel: typeof defaultPlaceholderLabel","defaultTranslations: BaseTranslationsFull","defaultOperatorLabelMap: Record<DefaultOperatorName, string>","defaultCombinatorLabelMap: Record<DefaultCombinatorNameExtended, string>","defaultOperators: DefaultOperators","defaultOperatorNegationMap: Record<DefaultOperatorName, DefaultOperatorName>","defaultCombinators: DefaultCombinators","defaultCombinatorsExtended: DefaultCombinatorsExtended","defaultMatchModes: DefaultMatchModes","defaultControlClassnames: Classnames","rootPath: Path","queryBuilderFlagDefaults: Required<QueryBuilderFlags>","v","numericRegex: RegExp","numericQuantityRegex","rules: (RuleGroupTypeIC | RuleType | string)[]","defaultValidator: QueryValidator","result: ValidationMap","reasons: any[]","idObj: { name?: string; value?: string }","newArray: T[]","newArray: OptionGroup<ToFullOption<T>>[]","optionsForThisGroup: WithUnknownIndex<ToFullOption<T>>[]","optionList: O[] | OptionGroup<O>[]","optionsMap: Partial<FullOptionRecord<FullOption>>","valAsNum: number | bigint","celCombinatorMap: {\n  and: '&&';\n  or: '||';\n}","jsonLogicAdditionalOperators: Record<\n  'startsWith' | 'endsWith',\n  (a: string, b: string) => boolean\n>","result: string[]","defaultNLTranslations: NLTranslations","defaultRuleGroupProcessorCEL: RuleGroupProcessor<string>","shouldNegate","defaultRuleProcessorCEL: RuleProcessor","defaultRuleGroupProcessorMongoDBQuery: RuleGroupProcessor","expressions: Record<string, unknown>[]","processNumber","defaultRuleProcessorMongoDBQuery: RuleProcessor","defaultRuleProcessorMongoDB: RuleProcessor","defaultRuleGroupProcessorSpEL: RuleGroupProcessor<string>","shouldNegate","negate","defaultRuleProcessorSpEL: RuleProcessor","escapeStringValueQuotes","defaultValueProcessorByRule: ValueProcessorByRule","defaultRuleProcessorDrizzle: RuleProcessor","defaultRuleGroupProcessorDrizzle: RuleGroupProcessor<\n  (columns: Record<string, Column> | Table, drizzleOperators: Operators) => SQL | undefined\n>","ruleGroupSQL: SQL | undefined","defaultRuleGroupProcessorElasticSearch: RuleGroupProcessor<Record<string, unknown>>","defaultRuleGroupProcessorJSONata: RuleGroupProcessor<string>","defaultRuleGroupProcessorJsonLogic: RuleGroupProcessor<RQBJsonLogic>","jsonRuleGroup: RQBJsonLogic","defaultRuleGroupProcessorLDAP: RuleGroupProcessor<string>","rules: string[]","defaultRuleGroupProcessorMongoDB: RuleGroupProcessor<string>","expressions: string[]","defaultRuleGroupProcessorNL: RuleGroupProcessor<string>","defaultRuleGroupProcessorParameterized: RuleGroupProcessor<\n  ParameterizedSQL | ParameterizedNamedSQL\n>","params: any[]","paramsNamed: Record<string, any>","fieldParams: Map<string, Set<string>>","defaultRuleGroupProcessorPrisma: RuleGroupProcessor<\n  Record<string, unknown> | undefined\n>","expressions: Record<string, unknown>[]","defaultRuleGroupProcessorSequelize: RuleGroupProcessor<WhereOptions | undefined>","expressions: Record<string, unknown>[]","defaultRuleGroupProcessorSQL: RuleGroupProcessor<string>","negateIfNotOp","textFunctionMap: Partial<Record<Lowercase<DefaultOperatorName>, string>>","defaultRuleProcessorElasticSearch: RuleProcessor","negate","defaultRuleProcessorJSONata: RuleProcessor","defaultRuleProcessorJsonLogic: RuleProcessor","fieldObject: JsonLogicVar","negate","defaultRuleProcessorLDAP: RuleProcessor","defaultValueProcessorNL: ValueProcessorByRule","defaultExportOperatorMap: ExportOperatorMap","defaultOperatorProcessorNL: RuleProcessor","defaultRuleProcessorNL: RuleProcessor","defaultOperatorProcessorSQL: RuleProcessor","defaultRuleProcessorSQL: RuleProcessor","defaultRuleProcessorParameterized: RuleProcessor","params: any[]","paramsNamed: Record<string, any>","inParams: string[]","defaultRuleProcessorPrisma: RuleProcessor","defaultRuleProcessorSequelize: RuleProcessor","sqlDialectPresets: Record<SQLPreset, FormatQueryOptions>","formatQueryOptionPresets: Record<string, FormatQueryOptions>","defaultOperatorProcessor: RuleProcessor","defaultFallbackExpressions: Partial<Record<ExportFormat, string>>","optObj: MostFormatQueryOptions","valueProcessor: ValueProcessorByRule","getOperators: FormatQueryOptions['getOperators']","validationMap: ValidationMap","validatorMap: Record<string, RuleValidator>","validationResult: boolean | ValidationResult | undefined","fieldValidator: RuleValidator | undefined","finalOptions: FormatQueryFinalOptions","defaultValueProcessor: ValueProcessorLegacy","defaultMongoDBValueProcessor: ValueProcessorLegacy","defaultCELValueProcessor: ValueProcessorLegacy","defaultSpELValueProcessor: ValueProcessorLegacy","defaultValueProcessorCELByRule: RuleProcessor","defaultValueProcessorMongoDBByRule: RuleProcessor","defaultValueProcessorSpELByRule: RuleProcessor","target: FindPathReturnType","t: RuleGroupTypeAny | RuleType | string","commonAncestorPath: Path","target: RuleType | RuleGroupTypeAny","generateAccessibleDescription: ADG","dummyFD","matchModes: boolean | MatchMode[] | FlexibleOption<MatchMode>[]","defaultValueSourcesArray: ValueSourceFullOptions","valueSourcesNEW:\n    | false\n    | ValueSources\n    | ValueSourceFlexibleOptions\n    | ((operator: string) => ValueSources | ValueSourceFlexibleOptions)"],"sources":["../src/defaults.ts","../src/utils/arrayUtils.ts","../src/utils/clsx.ts","../src/utils/misc.ts","../src/utils/isRuleGroup.ts","../src/utils/convertQuery.ts","../src/utils/defaultValidator.ts","../src/utils/objectUtils.ts","../src/utils/optGroupUtils.ts","../src/utils/filterFieldsByComparator.ts","../src/utils/parseNumber.ts","../src/utils/transformQuery.ts","../src/utils/isRuleOrGroupValid.ts","../src/utils/getParseNumberMethod.ts","../src/utils/formatQuery/utils.ts","../src/utils/formatQuery/defaultRuleGroupProcessorCEL.ts","../src/utils/formatQuery/defaultRuleProcessorCEL.ts","../src/utils/formatQuery/defaultRuleGroupProcessorMongoDBQuery.ts","../src/utils/formatQuery/defaultRuleProcessorMongoDBQuery.ts","../src/utils/formatQuery/defaultRuleProcessorMongoDB.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSpEL.ts","../src/utils/formatQuery/defaultRuleProcessorSpEL.ts","../src/utils/formatQuery/defaultValueProcessorByRule.ts","../src/utils/formatQuery/defaultRuleProcessorDrizzle.ts","../src/utils/formatQuery/defaultRuleGroupProcessorDrizzle.ts","../src/utils/formatQuery/defaultRuleGroupProcessorElasticSearch.ts","../src/utils/formatQuery/defaultRuleGroupProcessorJSONata.ts","../src/utils/formatQuery/defaultRuleGroupProcessorJsonLogic.ts","../src/utils/formatQuery/defaultRuleGroupProcessorLDAP.ts","../src/utils/formatQuery/defaultRuleGroupProcessorMongoDB.ts","../src/utils/formatQuery/defaultRuleGroupProcessorNL.ts","../src/utils/formatQuery/defaultRuleGroupProcessorParameterized.ts","../src/utils/formatQuery/defaultRuleGroupProcessorPrisma.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSequelize.ts","../src/utils/formatQuery/defaultRuleGroupProcessorSQL.ts","../src/utils/formatQuery/defaultRuleProcessorElasticSearch.ts","../src/utils/formatQuery/defaultRuleProcessorJSONata.ts","../src/utils/formatQuery/defaultRuleProcessorJsonLogic.ts","../src/utils/formatQuery/defaultRuleProcessorLDAP.ts","../src/utils/formatQuery/defaultValueProcessorNL.ts","../src/utils/formatQuery/defaultRuleProcessorNL.ts","../src/utils/formatQuery/defaultRuleProcessorSQL.ts","../src/utils/formatQuery/defaultRuleProcessorParameterized.ts","../src/utils/formatQuery/defaultRuleProcessorPrisma.ts","../src/utils/formatQuery/defaultRuleProcessorSequelize.ts","../src/utils/formatQuery/formatQuery.ts","../src/utils/formatQuery/index.ts","../src/utils/pathUtils.ts","../src/utils/generateAccessibleDescription.ts","../src/utils/generateID.ts","../src/utils/getMatchModesUtil.ts","../src/utils/getValidationClassNames.ts","../src/utils/getValueSourcesUtil.ts","../src/utils/mergeAnyTranslations.ts","../src/utils/mergeClassnames.ts","../src/utils/preferProp.ts","../src/utils/prepareQueryObjects.ts","../src/utils/regenerateIDs.ts","../src/utils/queryTools.ts"],"sourcesContent":["import type {\n  BaseTranslationsFull,\n  Classnames,\n  DefaultCombinatorName,\n  DefaultCombinatorNameExtended,\n  DefaultOperatorName,\n  MatchMode,\n  Path,\n  QueryBuilderFlags,\n  StringUnionToFullOptionArray,\n} from './types';\n\n// DO NOT ALTER OR REMOVE REGION NAMES. Some of them are used\n// to generate code snippets in the documentation.\n\n/**\n * @group Defaults\n */\nexport const defaultPlaceholderName = '~';\n/**\n * @group Defaults\n */\nexport const defaultPlaceholderLabel = '------';\n/**\n * Default `name` for placeholder option in the `fields` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderFieldName: typeof defaultPlaceholderName = defaultPlaceholderName;\n/**\n * Default `label` for placeholder option in the `fields` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderFieldLabel: typeof defaultPlaceholderLabel = defaultPlaceholderLabel;\n/**\n * Default `label` for placeholder option group in the `fields` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderFieldGroupLabel: typeof defaultPlaceholderLabel =\n  defaultPlaceholderLabel;\n/**\n * Default `name` for placeholder option in the `operators` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderOperatorName: typeof defaultPlaceholderName = defaultPlaceholderName;\n/**\n * Default `label` for placeholder option in the `operators` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderOperatorLabel: typeof defaultPlaceholderLabel =\n  defaultPlaceholderLabel;\n/**\n * Default `label` for placeholder option group in the `operators` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderOperatorGroupLabel: typeof defaultPlaceholderLabel =\n  defaultPlaceholderLabel;\n/**\n * Default `name` for placeholder option in the `values` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderValueName: typeof defaultPlaceholderName = defaultPlaceholderName;\n/**\n * Default `label` for placeholder option in the `values` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderValueLabel: typeof defaultPlaceholderLabel = defaultPlaceholderLabel;\n/**\n * Default `label` for placeholder option group in the `values` array.\n *\n * @group Defaults\n */\nexport const defaultPlaceholderValueGroupLabel: typeof defaultPlaceholderLabel =\n  defaultPlaceholderLabel;\n\n/**\n * Default configuration of translatable strings.\n *\n * @group Defaults\n */\n// #region docs-translations\nexport const defaultTranslations: BaseTranslationsFull = {\n  fields: {\n    title: 'Field',\n    placeholderName: defaultPlaceholderFieldName,\n    placeholderLabel: defaultPlaceholderFieldLabel,\n    placeholderGroupLabel: defaultPlaceholderFieldGroupLabel,\n  } as const,\n  operators: {\n    title: 'Operator',\n    placeholderName: defaultPlaceholderOperatorName,\n    placeholderLabel: defaultPlaceholderOperatorLabel,\n    placeholderGroupLabel: defaultPlaceholderOperatorGroupLabel,\n  } as const,\n  values: {\n    title: 'Values',\n    placeholderName: defaultPlaceholderValueName,\n    placeholderLabel: defaultPlaceholderValueLabel,\n    placeholderGroupLabel: defaultPlaceholderValueGroupLabel,\n  } as const,\n  matchMode: { title: 'Match mode' } as const,\n  matchThreshold: { title: 'Match threshold' } as const,\n  value: { title: 'Value' } as const,\n  removeRule: { label: '⨯', title: 'Remove rule' } as const,\n  removeGroup: { label: '⨯', title: 'Remove group' } as const,\n  addRule: { label: '+ Rule', title: 'Add rule' } as const,\n  addGroup: { label: '+ Group', title: 'Add group' } as const,\n  combinators: { title: 'Combinator' } as const,\n  notToggle: { label: 'Not', title: 'Invert this group' } as const,\n  cloneRule: { label: '⧉', title: 'Clone rule' } as const,\n  cloneRuleGroup: { label: '⧉', title: 'Clone group' } as const,\n  shiftActionUp: { label: '˄', title: 'Shift up' } as const,\n  shiftActionDown: { label: '˅', title: 'Shift down' } as const,\n  dragHandle: { label: '⁞⁞', title: 'Drag handle' } as const,\n  lockRule: { label: '🔓', title: 'Lock rule' } as const,\n  lockGroup: { label: '🔓', title: 'Lock group' } as const,\n  lockRuleDisabled: { label: '🔒', title: 'Unlock rule' } as const,\n  lockGroupDisabled: { label: '🔒', title: 'Unlock group' } as const,\n  muteRule: { label: '🔊', title: 'Mute rule' } as const,\n  muteGroup: { label: '🔊', title: 'Mute group' } as const,\n  unmuteRule: { label: '🔇', title: 'Unmute rule' } as const,\n  unmuteGroup: { label: '🔇', title: 'Unmute group' } as const,\n  valueSourceSelector: { title: 'Value source' } as const,\n} satisfies BaseTranslationsFull;\n// #endregion\n\n/**\n * Default character used to `.join` and `.split` arrays.\n *\n * @group Defaults\n */\nexport const defaultJoinChar = ',';\n\nexport type DefaultOperators = StringUnionToFullOptionArray<DefaultOperatorName>;\n\nexport const defaultOperatorLabelMap: Record<DefaultOperatorName, string> = {\n  '=': '=',\n  '!=': '!=',\n  '<': '<',\n  '>': '>',\n  '<=': '<=',\n  '>=': '>=',\n  contains: 'contains',\n  beginsWith: 'begins with',\n  endsWith: 'ends with',\n  doesNotContain: 'does not contain',\n  doesNotBeginWith: 'does not begin with',\n  doesNotEndWith: 'does not end with',\n  null: 'is null',\n  notNull: 'is not null',\n  in: 'in',\n  notIn: 'not in',\n  between: 'between',\n  notBetween: 'not between',\n};\n\nexport const defaultCombinatorLabelMap: Record<DefaultCombinatorNameExtended, string> = {\n  and: 'AND',\n  or: 'OR',\n  xor: 'XOR',\n};\n\n/**\n * Default operator list.\n *\n * @group Defaults\n */\n// #region docs-operators\nexport const defaultOperators: DefaultOperators = [\n  { name: '=', value: '=', label: '=' },\n  { name: '!=', value: '!=', label: '!=' },\n  { name: '<', value: '<', label: '<' },\n  { name: '>', value: '>', label: '>' },\n  { name: '<=', value: '<=', label: '<=' },\n  { name: '>=', value: '>=', label: '>=' },\n  { name: 'contains', value: 'contains', label: 'contains' },\n  { name: 'beginsWith', value: 'beginsWith', label: 'begins with' },\n  { name: 'endsWith', value: 'endsWith', label: 'ends with' },\n  { name: 'doesNotContain', value: 'doesNotContain', label: 'does not contain' },\n  { name: 'doesNotBeginWith', value: 'doesNotBeginWith', label: 'does not begin with' },\n  { name: 'doesNotEndWith', value: 'doesNotEndWith', label: 'does not end with' },\n  { name: 'null', value: 'null', label: 'is null' },\n  { name: 'notNull', value: 'notNull', label: 'is not null' },\n  { name: 'in', value: 'in', label: 'in' },\n  { name: 'notIn', value: 'notIn', label: 'not in' },\n  { name: 'between', value: 'between', label: 'between' },\n  { name: 'notBetween', value: 'notBetween', label: 'not between' },\n];\n// #endregion\n\n/**\n * Map of default operators to their respective opposite/negating operators.\n *\n * @group Defaults\n */\nexport const defaultOperatorNegationMap: Record<DefaultOperatorName, DefaultOperatorName> = {\n  '=': '!=',\n  '!=': '=',\n  '<': '>=',\n  '<=': '>',\n  '>': '<=',\n  '>=': '<',\n  beginsWith: 'doesNotBeginWith',\n  doesNotBeginWith: 'beginsWith',\n  endsWith: 'doesNotEndWith',\n  doesNotEndWith: 'endsWith',\n  contains: 'doesNotContain',\n  doesNotContain: 'contains',\n  between: 'notBetween',\n  notBetween: 'between',\n  in: 'notIn',\n  notIn: 'in',\n  notNull: 'null',\n  null: 'notNull',\n} satisfies Record<DefaultOperatorName, DefaultOperatorName>;\n\nexport type DefaultCombinators = StringUnionToFullOptionArray<DefaultCombinatorName>;\n\n/**\n * Default combinator list.\n *\n * @group Defaults\n */\n// #region docs-combinators\nexport const defaultCombinators: DefaultCombinators = [\n  { name: 'and', value: 'and', label: 'AND' } as const,\n  { name: 'or', value: 'or', label: 'OR' } as const,\n];\n// #endregion\n\nexport type DefaultCombinatorsExtended =\n  StringUnionToFullOptionArray<DefaultCombinatorNameExtended>;\n\n/**\n * Default combinator list, with `XOR` added.\n *\n * @group Defaults\n */\nexport const defaultCombinatorsExtended: DefaultCombinatorsExtended = [\n  ...defaultCombinators,\n  { name: 'xor', value: 'xor', label: 'XOR' } as const,\n];\n\nexport type DefaultMatchModes = StringUnionToFullOptionArray<MatchMode>;\n\n/**\n * Default match modes.\n *\n * @group Defaults\n */\n// #region docs-matchmodes\nexport const defaultMatchModes: DefaultMatchModes = [\n  { name: 'all', value: 'all', label: 'all' },\n  { name: 'some', value: 'some', label: 'some' },\n  { name: 'none', value: 'none', label: 'none' },\n  { name: 'atLeast', value: 'atLeast', label: 'at least' },\n  { name: 'atMost', value: 'atMost', label: 'at most' },\n  { name: 'exactly', value: 'exactly', label: 'exactly' },\n];\n// #endregion\n\n/**\n * Standard classnames applied to each component.\n *\n * @group Defaults\n */\n// #region docs-standardclassnames\nexport const standardClassnames = {\n  queryBuilder: 'queryBuilder',\n  ruleGroup: 'ruleGroup',\n  header: 'ruleGroup-header',\n  body: 'ruleGroup-body',\n  combinators: 'ruleGroup-combinators',\n  addRule: 'ruleGroup-addRule',\n  addGroup: 'ruleGroup-addGroup',\n  cloneRule: 'rule-cloneRule',\n  cloneGroup: 'ruleGroup-cloneGroup',\n  removeGroup: 'ruleGroup-remove',\n  notToggle: 'ruleGroup-notToggle',\n  rule: 'rule',\n  fields: 'rule-fields',\n  matchMode: 'rule-matchMode',\n  matchThreshold: 'rule-matchThreshold',\n  operators: 'rule-operators',\n  value: 'rule-value',\n  removeRule: 'rule-remove',\n  betweenRules: 'betweenRules',\n  valid: 'queryBuilder-valid',\n  invalid: 'queryBuilder-invalid',\n  shiftActions: 'shiftActions',\n  dndDragging: 'dndDragging',\n  dndOver: 'dndOver',\n  dndCopy: 'dndCopy',\n  dndGroup: 'dndGroup',\n  dndDropNotAllowed: 'dndDropNotAllowed',\n  dragHandle: 'queryBuilder-dragHandle',\n  disabled: 'queryBuilder-disabled',\n  muted: 'queryBuilder-muted',\n  lockRule: 'rule-lock',\n  lockGroup: 'ruleGroup-lock',\n  muteRule: 'rule-mute',\n  muteGroup: 'ruleGroup-mute',\n  valueSource: 'rule-valueSource',\n  valueListItem: 'rule-value-list-item',\n  branches: 'queryBuilder-branches',\n  justified: 'queryBuilder-justified',\n  hasSubQuery: 'rule-hasSubQuery',\n} as const;\n// #endregion\n\n/**\n * Default classnames for each component.\n *\n * @group Defaults\n */\nexport const defaultControlClassnames: Classnames = {\n  queryBuilder: '',\n  ruleGroup: '',\n  header: '',\n  body: '',\n  combinators: '',\n  addRule: '',\n  addGroup: '',\n  cloneRule: '',\n  cloneGroup: '',\n  removeGroup: '',\n  notToggle: '',\n  rule: '',\n  fields: '',\n  matchMode: '',\n  matchThreshold: '',\n  operators: '',\n  value: '',\n  removeRule: '',\n  shiftActions: '',\n  dragHandle: '',\n  lockRule: '',\n  lockGroup: '',\n  muteRule: '',\n  muteGroup: '',\n  muted: '',\n  valueSource: '',\n  actionElement: '',\n  valueSelector: '',\n  betweenRules: '',\n  valid: '',\n  invalid: '',\n  dndDragging: '',\n  dndOver: '',\n  dndGroup: '',\n  dndCopy: '',\n  dndDropNotAllowed: '',\n  disabled: '',\n  valueListItem: '',\n  branches: '',\n  hasSubQuery: '',\n} satisfies Classnames;\n\n/**\n * Default reason codes for a group being invalid.\n *\n * @group Defaults\n */\nexport const groupInvalidReasons = {\n  empty: 'empty',\n  invalidCombinator: 'invalid combinator',\n  invalidIndependentCombinators: 'invalid independent combinators',\n} as const;\n\n/**\n * Component identifiers for testing.\n *\n * @group Defaults\n */\nexport const TestID = {\n  rule: 'rule',\n  ruleGroup: 'rule-group',\n  inlineCombinator: 'inline-combinator',\n  addGroup: 'add-group',\n  removeGroup: 'remove-group',\n  cloneGroup: 'clone-group',\n  cloneRule: 'clone-rule',\n  addRule: 'add-rule',\n  removeRule: 'remove-rule',\n  combinators: 'combinators',\n  fields: 'fields',\n  operators: 'operators',\n  valueEditor: 'value-editor',\n  notToggle: 'not-toggle',\n  shiftActions: 'shift-actions',\n  dragHandle: 'drag-handle',\n  lockRule: 'lock-rule',\n  lockGroup: 'lock-group',\n  muteRule: 'mute-rule',\n  muteGroup: 'mute-group',\n  valueSourceSelector: 'value-source-selector',\n  matchModeEditor: 'match-mode-editor',\n} as const;\n\nexport const LogType = {\n  parentPathDisabled: 'action aborted: parent path disabled',\n  pathDisabled: 'action aborted: path is disabled',\n  queryUpdate: 'query updated',\n  onAddRuleFalse: 'onAddRule callback returned false',\n  onAddGroupFalse: 'onAddGroup callback returned false',\n  onGroupRuleFalse: 'onGroupRule callback returned false',\n  onGroupGroupFalse: 'onGroupGroup callback returned false',\n  onMoveRuleFalse: 'onMoveRule callback returned false',\n  onMoveGroupFalse: 'onMoveGroup callback returned false',\n  onRemoveFalse: 'onRemove callback returned false',\n  add: 'rule or group added',\n  remove: 'rule or group removed',\n  update: 'rule or group updated',\n  move: 'rule or group moved',\n  group: 'rule or group grouped with another',\n} as const;\n\n/**\n * The {@link Path} of the root group.\n *\n * @group Defaults\n */\nexport const rootPath: Path = [] satisfies Path;\n\n/**\n * Default values for all `boolean`\n * {@link react-querybuilder!QueryBuilder QueryBuilder} options.\n *\n * @group Defaults\n */\nexport const queryBuilderFlagDefaults: Required<QueryBuilderFlags> = {\n  addRuleToNewGroups: false,\n  autoSelectField: true,\n  autoSelectOperator: true,\n  autoSelectValue: false,\n  debugMode: false,\n  enableDragAndDrop: false,\n  enableMountQueryChange: true,\n  listsAsArrays: false,\n  resetOnFieldChange: true,\n  resetOnOperatorChange: false,\n  showCloneButtons: false,\n  showCombinatorsBetweenRules: false,\n  showLockButtons: false,\n  showMuteButtons: false,\n  showNotToggle: false,\n  showShiftActions: false,\n  suppressStandardClassnames: false,\n};\n","import { defaultJoinChar } from '../defaults';\n\n/**\n * Splits a string by a given character (see {@link defaultJoinChar}). Escaped characters\n * (characters preceded by a backslash) will not apply to the split, and the backslash will\n * be removed in the array element. Inverse of {@link joinWith}.\n *\n * @example\n * splitBy('this\\\\,\\\\,that,,the other,,,\\\\,')\n * // or\n * splitBy('this\\\\,\\\\,that,,the other,,,\\\\,', ',')\n * // would return\n * ['this,,that', '', 'the other', '', '', ',']\n */\nexport const splitBy = (str?: string, splitChar: string = defaultJoinChar): string[] =>\n  typeof str === 'string'\n    ? str\n        .split(`\\\\${splitChar}`)\n        .map(c => c.split(splitChar))\n        .reduce((prev, curr, idx) => {\n          if (idx === 0) {\n            return curr;\n          }\n          return [...prev.slice(0, -1), `${prev.at(-1)}${splitChar}${curr[0]}`, ...curr.slice(1)];\n        }, [])\n    : [];\n\n/**\n * Joins an array of strings using the given character (see {@link defaultJoinChar}). When\n * the given character appears in an array element, a backslash will be added just before it\n * to distinguish it from the join character. Effectively the inverse of {@link splitBy}.\n *\n * TIP: The join character can actually be a string of any length. Only the first character\n * will be searched for in the array elements and preceded by a backslash.\n *\n * @example\n * joinWith(['this,,that', '', 'the other', '', '', ','], ', ')\n * // would return\n * 'this\\\\,\\\\,that, , the other, , , \\\\,'\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const joinWith = (strArr: any[], joinChar: string = defaultJoinChar): string =>\n  strArr.map(str => `${str ?? ''}`.replaceAll(joinChar[0], `\\\\${joinChar[0]}`)).join(joinChar);\n\n/**\n * Trims the value if it is a string. Otherwise returns the value as is.\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const trimIfString = (val: any): any => (typeof val === 'string' ? val.trim() : val);\n\n/**\n * Splits a string by comma then trims each element. Arrays are returned as is except\n * any string elements are trimmed.\n */\nexport const toArray = (\n  // oxlint-disable-next-line typescript/no-explicit-any\n  v: any,\n  { retainEmptyStrings }: { retainEmptyStrings?: boolean } = {}\n  // oxlint-disable-next-line typescript/no-explicit-any\n): any[] =>\n  Array.isArray(v)\n    ? v.map(v => trimIfString(v))\n    : typeof v === 'string'\n      ? splitBy(v, defaultJoinChar)\n          .filter(retainEmptyStrings ? () => true : s => !/^\\s*$/.test(s))\n          .map(s => s.trim())\n      : typeof v === 'number'\n        ? [v]\n        : [];\n\n/**\n * Determines if an array is free of `null`/`undefined`.\n */\nexport const nullFreeArray = <T>(arr: T[]): arr is Exclude<T, null>[] =>\n  arr.every(el => el === false || (el ?? false) !== false);\n","// Adapted from https://github.com/lukeed/clsx/tree/925494cf31bcd97d3337aacd34e659e80cae7fe2\n\n// oxlint-disable-next-line typescript/no-explicit-any\ntype ClassDictionary = Record<string, any>;\ntype ClassValue =\n  | ClassArray\n  | ClassDictionary\n  | string\n  | number\n  | bigint\n  | null\n  | boolean\n  | undefined;\ntype ClassArray = ClassValue[];\n\n// istanbul ignore next\n// oxlint-disable-next-line typescript/no-explicit-any\nfunction toVal(mix: any) {\n  let k;\n  let y;\n  let str = '';\n\n  if (typeof mix === 'string' || typeof mix === 'number') {\n    str += mix;\n  } else if (typeof mix === 'object') {\n    if (Array.isArray(mix)) {\n      const len = mix.length;\n      for (k = 0; k < len; k++) {\n        if (mix[k] && (y = toVal(mix[k]))) {\n          // oxlint-disable-next-line no-unused-expressions\n          str && (str += ' ');\n          str += y;\n        }\n      }\n    } else {\n      for (y in mix) {\n        if (mix[y]) {\n          // oxlint-disable-next-line no-unused-expressions\n          str && (str += ' ');\n          str += y;\n        }\n      }\n    }\n  }\n\n  return str;\n}\n\n/**\n * Vendored/adapted version of the `clsx` package.\n *\n * **NOTE:** Prefer the official package from npm outside the context of React Query Builder.\n */\n// istanbul ignore next\nexport function clsx(...args: ClassValue[]): string {\n  let i = 0;\n  let tmp;\n  let x;\n  let str = '';\n  const len = args.length;\n  for (; i < len; i++) {\n    if ((tmp = args[i]) && (x = toVal(tmp))) {\n      // oxlint-disable-next-line no-unused-expressions\n      str && (str += ' ');\n      str += x;\n    }\n  }\n  return str;\n}\n\nexport default clsx;\n","import { numericRegex as numericQuantityRegex } from 'numeric-quantity';\n\n/**\n * Converts a value to lowercase if it's a string, otherwise returns the value as is.\n */\n// istanbul ignore next\nexport const lc = <T>(v: T): T => (typeof v === 'string' ? (v.toLowerCase() as T) : v);\n\n/**\n * Regex matching numeric strings. Passes for positive/negative integers, decimals,\n * and E notation, with optional surrounding whitespace.\n */\nexport const numericRegex: RegExp = new RegExp(\n  numericQuantityRegex.source.replace(/^\\^/, String.raw`^\\s*`).replace(/\\$$/, String.raw`\\s*$`)\n);\n\n/**\n * Determines if a variable is a plain old JavaScript object, aka POJO.\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isPojo = (obj: any): obj is Record<string, any> =>\n  obj === null || typeof obj !== 'object' ? false : Object.getPrototypeOf(obj) === Object.prototype;\n\n/**\n * Simple helper to determine whether a value is null, undefined, or an empty string.\n */\nexport const nullOrUndefinedOrEmpty = (value: unknown): value is null | undefined | '' =>\n  value === null || value === undefined || value === '';\n","import type { RuleGroupType, RuleGroupTypeAny, RuleGroupTypeIC, RuleType } from '../types';\nimport { isPojo } from './misc';\n\n/**\n * Determines if an object is a {@link RuleType} (only checks for a `field` property).\n */\nexport const isRuleType = (s: unknown): s is RuleType =>\n  isPojo(s) && 'field' in s && typeof s.field === 'string';\n\n/**\n * Determines if an object is a {@link RuleGroupType} or {@link RuleGroupTypeIC}.\n */\nexport const isRuleGroup = (rg: unknown): rg is RuleGroupTypeAny =>\n  isPojo(rg) && Array.isArray(rg.rules);\n\n/**\n * Determines if an object is a {@link RuleGroupType}.\n */\nexport const isRuleGroupType = (rg: unknown): rg is RuleGroupType =>\n  isRuleGroup(rg) && typeof rg.combinator === 'string';\n\n/**\n * Determines if an object is a {@link RuleGroupTypeIC}.\n */\nexport const isRuleGroupTypeIC = (rg: unknown): rg is RuleGroupTypeIC =>\n  isRuleGroup(rg) && rg.combinator === undefined;\n","import { produce } from 'immer';\nimport type {\n  RuleGroupArray,\n  RuleGroupType,\n  RuleGroupTypeAny,\n  RuleGroupTypeIC,\n  RuleType,\n} from '../types';\nimport { isRuleGroup, isRuleGroupType, isRuleGroupTypeIC } from './isRuleGroup';\nimport { lc } from './misc';\n\nconst combinatorLevels = ['or', 'xor', 'and'] as const;\n\nconst isSameString = (a: unknown, b: string) => lc(a) === b;\n\nconst generateRuleGroupICWithConsistentCombinators = (\n  rg: RuleGroupTypeIC,\n  baseCombinatorLevel: number = 0\n): RuleGroupTypeIC => {\n  const baseCombinator = combinatorLevels[baseCombinatorLevel];\n\n  // oxlint-disable-next-line typescript/no-explicit-any\n  if (!rg.rules.includes(baseCombinator as any)) {\n    // No instances of this combinator, so group based on the next\n    // combinator level if at least two levels remain\n    return baseCombinatorLevel < combinatorLevels.length - 2\n      ? generateRuleGroupICWithConsistentCombinators(rg, baseCombinatorLevel + 1)\n      : rg;\n  }\n\n  return produce(rg, draft => {\n    let cursor = 0;\n\n    // Group all chains of combinators in the rule array that are not the base combinator\n    while (cursor < draft.rules.length - 2) {\n      if (isSameString(draft.rules[cursor + 1], baseCombinator)) {\n        cursor += 2;\n        continue;\n      }\n\n      const nextBaseCombinatorIndex = draft.rules.findIndex(\n        (r, i) => i > cursor && typeof r === 'string' && lc(r) === baseCombinator\n      );\n\n      if (nextBaseCombinatorIndex === -1) {\n        // No more instances of this combinator, so group all remaining rules and exit the loop\n        draft.rules.splice(\n          cursor,\n          draft.rules.length,\n          generateRuleGroupICWithConsistentCombinators(\n            // oxlint-disable-next-line typescript/no-explicit-any\n            { rules: draft.rules.slice(cursor) as any },\n            baseCombinatorLevel + 1\n          )\n        );\n        break;\n      } else {\n        // Group all rules between the current cursor and the next instance of the base combinator\n        draft.rules.splice(\n          cursor,\n          nextBaseCombinatorIndex - cursor,\n          generateRuleGroupICWithConsistentCombinators(\n            // oxlint-disable-next-line typescript/no-explicit-any\n            { rules: draft.rules.slice(cursor, nextBaseCombinatorIndex) as any },\n            baseCombinatorLevel + 1\n          )\n        );\n      }\n    }\n  });\n};\n\n/**\n * Converts a {@link RuleGroupTypeIC} to {@link RuleGroupType}.\n *\n * This function is idempotent: {@link RuleGroupType} queries will be\n * returned as-is.\n *\n * @group Query Tools\n */\nexport const convertFromIC = <RG extends RuleGroupType = RuleGroupType>(\n  rg: RuleGroupTypeAny\n): RG => {\n  if (isRuleGroupType(rg)) {\n    return rg as RG;\n  }\n  const processedRG = generateRuleGroupICWithConsistentCombinators(rg);\n  const rulesAsMixedList = processedRG.rules.map(r =>\n    typeof r === 'string' || !isRuleGroup(r) ? r : convertFromIC(r)\n  );\n  const combinator = rulesAsMixedList.length < 2 ? 'and' : (rulesAsMixedList[1] as string);\n  const rules = rulesAsMixedList.filter(r => typeof r !== 'string') as RuleGroupArray;\n  return { ...processedRG, combinator, rules } as RG;\n};\n\n/**\n * Converts a {@link RuleGroupType} to {@link RuleGroupTypeIC}.\n *\n * This function is idempotent: {@link RuleGroupTypeIC} queries will be\n * returned as-is.\n *\n * @group Query Tools\n */\nexport const convertToIC = <RGIC extends RuleGroupTypeIC = RuleGroupTypeIC>(\n  rg: RuleGroupTypeAny\n): RGIC => {\n  if (isRuleGroupTypeIC(rg)) {\n    return rg as RGIC;\n  }\n  const { combinator, ...queryWithoutCombinator } = rg;\n  const rules: (RuleGroupTypeIC | RuleType | string)[] = [];\n  const { length } = rg.rules;\n  for (const [idx, r] of rg.rules.entries()) {\n    if (isRuleGroup(r)) {\n      rules.push(convertToIC(r));\n    } else {\n      rules.push(r);\n    }\n    if (combinator && idx < length - 1) {\n      rules.push(combinator);\n    }\n  }\n  return { ...queryWithoutCombinator, rules } as RGIC;\n};\n\n/**\n * Converts a {@link RuleGroupType} to {@link RuleGroupTypeIC}. For a more explicit\n * operation, use {@link convertToIC}.\n *\n * @group Query Tools\n */\nfunction convertQuery(query: RuleGroupType): RuleGroupTypeIC;\n/**\n * Converts a {@link RuleGroupTypeIC} to {@link RuleGroupType}. For a more explicit\n * operation, use {@link convertFromIC}.\n *\n * @group Query Tools\n */\nfunction convertQuery(query: RuleGroupTypeIC): RuleGroupType;\nfunction convertQuery(query: RuleGroupType | RuleGroupTypeIC): RuleGroupType | RuleGroupTypeIC {\n  return isRuleGroupTypeIC(query) ? convertFromIC(query) : convertToIC(query);\n}\n\nexport { convertQuery };\n","import { defaultCombinators, groupInvalidReasons } from '../defaults';\nimport type { QueryValidator, RuleGroupTypeAny, RuleType, ValidationMap } from '../types';\nimport { isRuleGroup, isRuleGroupType } from './isRuleGroup';\n\n/**\n * This is an example validation function you can pass to {@link react-querybuilder!QueryBuilder QueryBuilder} in the\n * `validator` prop. It assumes that you want to validate groups, and has a no-op\n * for validating rules which you can replace with your own implementation.\n */\nexport const defaultValidator: QueryValidator = query => {\n  const result: ValidationMap = {};\n\n  /**\n   * Replace this with your custom rule validator.\n   */\n  const validateRule = (rule: RuleType) => {\n    // Set `result[rule.id] = true` for a valid rule, or either\n    // `{ valid: false, reasons: ['whatever', 'reasons', 'here'] }`\n    // or simply `false` for an invalid rule.\n    // istanbul ignore else\n    // oxlint-disable-next-line no-unused-expressions\n    if (rule.id) result[rule.id]; // = true;\n  };\n\n  const validateGroup = (rg: RuleGroupTypeAny) => {\n    // oxlint-disable-next-line typescript/no-explicit-any\n    const reasons: any[] = [];\n    if (rg.rules.length === 0) {\n      reasons.push(groupInvalidReasons.empty);\n    } else if (!isRuleGroupType(rg)) {\n      // Odd indexes should be valid combinators and even indexes should be rules or groups\n      let invalidICs = false;\n      for (let i = 0; i < rg.rules.length && !invalidICs; i++) {\n        if (\n          (i % 2 === 0 && typeof rg.rules[i] === 'string') ||\n          (i % 2 === 1 && typeof rg.rules[i] !== 'string') ||\n          (i % 2 === 1 &&\n            typeof rg.rules[i] === 'string' &&\n            !defaultCombinators.map(c => c.name as string).includes(rg.rules[i] as string))\n        ) {\n          invalidICs = true;\n        }\n      }\n      if (invalidICs) {\n        reasons.push(groupInvalidReasons.invalidIndependentCombinators);\n      }\n    }\n    // Non-independent combinators should be valid, but only checked if there are multiple rules\n    // since combinators don't really apply to groups with only one rule/group\n    if (\n      isRuleGroupType(rg) &&\n      !defaultCombinators.map(c => c.name as string).includes(rg.combinator) &&\n      rg.rules.length > 1\n    ) {\n      reasons.push(groupInvalidReasons.invalidCombinator);\n    }\n    /* istanbul ignore else */\n    if (rg.id) {\n      result[rg.id] = reasons.length > 0 ? { valid: false, reasons } : true;\n    }\n    for (const r of rg.rules) {\n      if (typeof r === 'string') {\n        // Validation for this case was done earlier\n      } else if (isRuleGroup(r)) {\n        validateGroup(r);\n      } else {\n        validateRule(r);\n      }\n    }\n  };\n\n  validateGroup(query);\n\n  return result;\n  // You can return the result object itself like above, or if you just\n  // want the entire query to be marked invalid if _any_ rules/groups are\n  // invalid, return a boolean like this:\n  //   return Object.values(result).map(rv => (typeof rv !== 'boolean')).includes(true);\n  // That will return `true` if no errors were found.\n};\n","// All code in this file is adapted from:\n// npm: https://www.npmjs.com/package/ts-extras\n// src: https://github.com/sindresorhus/ts-extras\n\n/**\n * Original looked like this (not sure why template string is used):\n * ```\n * type ObjectKeys<T extends object> = `${Exclude<keyof T, symbol>}`;\n * ```\n */\ntype ObjectKeys<T extends object> = Exclude<keyof T, symbol>;\n\n/**\n * A strongly-typed version of `Object.keys()`.\n *\n * [Original source](https://github.com/sindresorhus/ts-extras/blob/44f57392c5f027268330771996c4fdf9260b22d6/source/object-keys.ts)\n */\nexport const objectKeys = Object.keys as <Type extends object>(\n  value: Type\n) => Array<ObjectKeys<Type>>;\n\n/**\n * A strongly-typed version of `Object.entries()`.\n *\n * [Original source](https://github.com/sindresorhus/ts-extras/blob/44f57392c5f027268330771996c4fdf9260b22d6/source/object-entries.ts)\n */\nexport const objectEntries = Object.entries as <Type extends Record<PropertyKey, unknown>>(\n  value: Type\n) => Array<[ObjectKeys<Type>, Type[ObjectKeys<Type>]]>;\n","import type { Draft } from 'immer';\nimport { produce } from 'immer';\nimport type { RequireAtLeastOne } from 'type-fest';\nimport { defaultPlaceholderLabel, defaultPlaceholderName } from '../defaults';\nimport type {\n  BaseOption,\n  BaseOptionMap,\n  FlexibleOption,\n  FlexibleOptionGroup,\n  FlexibleOptionList,\n  FlexibleOptionListProp,\n  FullOption,\n  FullOptionList,\n  FullOptionMap,\n  FullOptionRecord,\n  GetOptionIdentifierType,\n  Option,\n  OptionGroup,\n  Placeholder,\n  ToFullOption,\n  ValueOption,\n  WithUnknownIndex,\n} from '../types';\nimport { isPojo } from './misc';\nimport { objectKeys } from './objectUtils';\n\nconst isOptionWithName = (opt: BaseOption): opt is Option =>\n  isPojo(opt) && 'name' in opt && typeof opt.name === 'string';\nconst isOptionWithValue = (opt: BaseOption): opt is ValueOption =>\n  isPojo(opt) && 'value' in opt && typeof opt.value === 'string';\n\n/**\n * Converts an {@link Option} or {@link ValueOption} (i.e., {@link BaseOption})\n * into a {@link FullOption}. Full options are left unchanged.\n *\n * @group Option Lists\n */\nexport function toFullOption<Opt extends BaseOption>(\n  opt: Opt | string,\n  baseProperties?: Record<string, unknown>,\n  labelMap?: Record<string, unknown>\n): ToFullOption<Opt> {\n  const recipe: (o: Opt | string) => ToFullOption<Opt> = produce(draft => {\n    const idObj: { name?: string; value?: string } = {};\n    let needsUpdating = !!baseProperties;\n\n    if (typeof draft === 'string') {\n      return {\n        ...baseProperties,\n        name: draft,\n        value: draft,\n        label: labelMap?.[draft] ?? draft,\n      } as Draft<Opt>;\n    }\n\n    if (isOptionWithName(draft) && !isOptionWithValue(draft)) {\n      idObj.value = draft.name;\n      needsUpdating = true;\n    } else if (!isOptionWithName(draft) && isOptionWithValue(draft)) {\n      idObj.name = draft.value;\n      needsUpdating = true;\n    }\n\n    if (needsUpdating) {\n      return Object.assign({}, baseProperties, draft, idObj);\n    }\n  });\n  return recipe(opt);\n}\n\n/**\n * Converts an {@link OptionList} or {@link FlexibleOptionList} into a {@link FullOptionList}.\n * Lists of full options are left unchanged.\n *\n * @group Option Lists\n */\nexport function toFullOptionList<Opt extends BaseOption>(\n  optList: unknown[],\n  baseProperties?: Record<string, unknown>,\n  labelMap?: Record<string, unknown>\n): FullOptionList<Opt> {\n  if (!Array.isArray(optList)) {\n    return [] as unknown as FullOptionList<Opt>;\n  }\n\n  const recipe: (ol: FlexibleOptionList<Opt>) => FullOptionList<Opt> = produce(draft => {\n    if (isFlexibleOptionGroupArray(draft)) {\n      for (const optGroup of draft) {\n        for (const [idx, opt] of optGroup.options.entries())\n          optGroup.options[idx] = toFullOption(opt, baseProperties, labelMap);\n      }\n    } else {\n      for (const [idx, opt] of (draft as Opt[]).entries())\n        draft[idx] = toFullOption(opt, baseProperties, labelMap);\n    }\n  });\n\n  return recipe(optList as FlexibleOptionList<Opt>);\n}\n\n/**\n * Converts a {@link FlexibleOptionList} into a {@link FullOptionList}.\n * Lists of full options are left unchanged.\n *\n * @group Option Lists\n */\nexport function toFullOptionMap<OptMap extends BaseOptionMap>(\n  optMap: OptMap,\n  baseProperties?: Record<string, unknown>\n): OptMap extends BaseOptionMap<infer V, infer K> ? Partial<Record<K, ToFullOption<V>>> : never {\n  type FullOptMapType =\n    OptMap extends BaseOptionMap<infer VT, infer KT>\n      ? Partial<Record<KT, ToFullOption<VT>>>\n      : never;\n\n  return Object.fromEntries(\n    (Object.entries(optMap) as [string, FlexibleOption][]).map(([k, v]) => [\n      k,\n      toFullOption(v, baseProperties),\n    ])\n  ) as FullOptMapType;\n}\n\n/**\n * @deprecated Renamed to {@link uniqByIdentifier}.\n *\n * @group Option Lists\n */\nexport const uniqByName = <\n  T extends { name: string; value?: string } | { name?: string; value: string },\n>(\n  originalArray: T[]\n): T[] => uniqByIdentifier(originalArray);\n\n/**\n * Generates a new array of objects with duplicates removed based\n * on the identifying property (`value` or `name`)\n *\n * @group Option Lists\n */\nexport const uniqByIdentifier = <\n  T extends RequireAtLeastOne<{ name: string; value: string }, 'name' | 'value'>,\n>(\n  originalArray: T[]\n): T[] => {\n  const names = new Set<string>();\n  const newArray: T[] = [];\n  for (const el of originalArray) {\n    if (!names.has((el.value ?? el.name)!)) {\n      names.add((el.value ?? el.name)!);\n      newArray.push(el);\n    }\n  }\n  return originalArray.length === newArray.length ? originalArray : newArray;\n};\n\n/**\n * Determines if an {@link OptionList} is an {@link OptionGroup} array.\n *\n * @group Option Lists\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isOptionGroupArray = (arr: any): arr is OptionGroup<BaseOption>[] =>\n  Array.isArray(arr) &&\n  arr.length > 0 &&\n  isPojo(arr[0]) &&\n  'options' in arr[0] &&\n  Array.isArray(arr[0].options);\n\n/**\n * Determines if an array is a flat array of {@link FlexibleOption}.\n *\n * @group Option Lists\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isFlexibleOptionArray = (arr: any): arr is FlexibleOption[] => {\n  let isFOA = false;\n  if (Array.isArray(arr)) {\n    for (const o of arr) {\n      if (isOptionWithName(o) || isOptionWithValue(o)) {\n        isFOA = true;\n      } else {\n        return false;\n      }\n    }\n  }\n  return isFOA;\n};\n\n/**\n * Determines if an array is a flat array of {@link FullOption}.\n *\n * @group Option Lists\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isFullOptionArray = (arr: any): arr is FullOption[] => {\n  let isFOA = false;\n  if (Array.isArray(arr)) {\n    for (const o of arr) {\n      if (isOptionWithName(o) && isOptionWithValue(o)) {\n        isFOA = true;\n      } else {\n        return false;\n      }\n    }\n  }\n  return isFOA;\n};\n\n/**\n * Determines if a {@link FlexibleOptionList} is a {@link FlexibleOptionGroup} array.\n *\n * @group Option Lists\n */\nexport const isFlexibleOptionGroupArray = (\n  // oxlint-disable-next-line typescript/no-explicit-any\n  arr: any,\n  { allowEmpty = false }: { allowEmpty?: boolean } = {}\n): arr is FlexibleOptionGroup[] => {\n  let isFOGA = false;\n  if (Array.isArray(arr)) {\n    for (const og of arr) {\n      if (\n        isPojo(og) &&\n        'options' in og &&\n        (isFlexibleOptionArray(og.options) ||\n          (allowEmpty && Array.isArray(og.options) && og.options.length === 0))\n      ) {\n        isFOGA = true;\n      } else {\n        return false;\n      }\n    }\n  }\n  return isFOGA;\n};\n\n/**\n * Determines if a {@link FlexibleOptionList} is a {@link OptionGroup} array of {@link FullOption}.\n *\n * @group Option Lists\n */\nexport const isFullOptionGroupArray = (\n  // oxlint-disable-next-line typescript/no-explicit-any\n  arr: any,\n  { allowEmpty = false }: { allowEmpty?: boolean } = {}\n): arr is OptionGroup<FullOption>[] => {\n  let isFOGA = false;\n  if (Array.isArray(arr)) {\n    for (const og of arr) {\n      if (\n        isPojo(og) &&\n        'options' in og &&\n        (isFullOptionArray(og.options) ||\n          (allowEmpty && Array.isArray(og.options) && og.options.length === 0))\n      ) {\n        isFOGA = true;\n      } else {\n        return false;\n      }\n    }\n  }\n  return isFOGA;\n};\n\n/**\n * Gets the option from an {@link OptionList} with the given `name`. Handles\n * {@link Option} arrays as well as {@link OptionGroup} arrays.\n *\n * @group Option Lists\n */\nexport function getOption<OptType extends FullOption>(\n  arr: FullOptionList<OptType>,\n  name: string\n): OptType | undefined;\nexport function getOption<OptType extends ValueOption>(\n  arr: FlexibleOptionList<OptType>,\n  name: string\n): OptType | undefined;\nexport function getOption<OptType extends Option>(\n  arr: FlexibleOptionList<OptType>,\n  name: string\n): OptType | undefined;\nexport function getOption<OptType extends BaseOption>(\n  arr: FlexibleOptionList<OptType>,\n  name: string\n): OptType | undefined {\n  const options = isFlexibleOptionGroupArray(arr, { allowEmpty: true })\n    ? arr.flatMap(og => og.options)\n    : arr;\n  return options.find(op => op.value === name || op.name === name) as OptType | undefined;\n}\n\n/**\n * Gets the first option from an {@link OptionList}.\n *\n * @group Option Lists\n */\nexport function getFirstOption<Opt extends FullOption>(\n  arr?: OptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null;\nexport function getFirstOption<Opt extends ValueOption>(\n  arr?: OptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null;\nexport function getFirstOption<Opt extends Option>(\n  arr?: OptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null;\nexport function getFirstOption<Opt extends BaseOption>(\n  arr?: FlexibleOptionGroup<Opt>[] | Opt[]\n): GetOptionIdentifierType<Opt> | null {\n  if (!Array.isArray(arr) || arr.length === 0) {\n    return null;\n  } else if (isFlexibleOptionGroupArray(arr, { allowEmpty: true })) {\n    for (const og of arr) {\n      if (og.options.length > 0) {\n        return (og.options[0].value ?? og.options[0].name) as GetOptionIdentifierType<Opt>;\n      }\n    }\n    // istanbul ignore next\n    return null;\n  }\n\n  return (arr[0].value ?? arr[0].name) as GetOptionIdentifierType<Opt>;\n}\n\n/**\n * Flattens {@link FlexibleOptionGroup} arrays into {@link BaseOption} arrays.\n * If the array is already flat, it is returned as is.\n *\n * @group Option Lists\n */\nexport const toFlatOptionArray = <T extends FullOption, OL extends FullOptionList<T>>(arr: OL) =>\n  uniqByIdentifier(isOptionGroupArray(arr) ? arr.flatMap(og => og.options) : arr) as T[];\n\n/**\n * Generates a new {@link OptionGroup} array with duplicates\n * removed based on the identifying property (`value` or `name`).\n *\n * @group Option Lists\n */\nexport const uniqOptGroups = <T extends BaseOption>(\n  originalArray: FlexibleOptionGroup<T>[]\n): OptionGroup<ToFullOption<T>>[] => {\n  type K = T extends BaseOption<infer KT> ? KT : never;\n  const labels = new Set<string>();\n  const names = new Set<K>();\n  const newArray: OptionGroup<ToFullOption<T>>[] = [];\n  for (const el of originalArray) {\n    if (!labels.has(el.label)) {\n      labels.add(el.label);\n      const optionsForThisGroup: WithUnknownIndex<ToFullOption<T>>[] = [];\n      for (const opt of el.options) {\n        if (!names.has((opt.value ?? opt.name) as K)) {\n          names.add((opt.value ?? opt.name) as K);\n          optionsForThisGroup.push(toFullOption(opt) as WithUnknownIndex<ToFullOption<T>>);\n        }\n      }\n      newArray.push({ ...el, options: optionsForThisGroup });\n    }\n  }\n  return newArray;\n};\n\n/**\n * Generates a new {@link Option} or {@link OptionGroup} array with duplicates\n * removed based on the identifier property (`value` or `name`).\n *\n * @group Option Lists\n */\nexport const uniqOptList = <T extends BaseOption>(\n  originalArray: FlexibleOptionList<T>\n): WithUnknownIndex<BaseOption & FullOption>[] | OptionGroup<ToFullOption<T>>[] => {\n  if (isFlexibleOptionGroupArray(originalArray)) {\n    return uniqOptGroups(originalArray) as OptionGroup<ToFullOption<T>>[];\n  }\n  return uniqByIdentifier((originalArray as BaseOption[]).map(o => toFullOption(o)));\n};\n\nexport interface PreparedOptionList<O extends FullOption> {\n  defaultOption: FullOption;\n  optionList: O[] | OptionGroup<O>[];\n  optionsMap: Partial<FullOptionRecord<FullOption>>;\n}\n\nexport interface PrepareOptionListParams<O extends FullOption> {\n  placeholder?: Placeholder;\n  optionList?: FlexibleOptionListProp<O> | BaseOptionMap<O>;\n  baseOption?: Record<string, unknown>;\n  labelMap?: Record<string, string>;\n  autoSelectOption?: boolean;\n}\n\nexport const prepareOptionList = <O extends FullOption>(\n  props: PrepareOptionListParams<O>\n): PreparedOptionList<O> => {\n  type OptionIdentifier = GetOptionIdentifierType<O>;\n\n  // istanbul ignore next\n  const {\n    optionList: optionListPropOriginal,\n    baseOption = {},\n    labelMap = {},\n    placeholder: {\n      placeholderName = defaultPlaceholderName,\n      placeholderLabel = defaultPlaceholderLabel,\n      placeholderGroupLabel = defaultPlaceholderLabel,\n    } = {},\n    autoSelectOption = true,\n  } = props;\n\n  const defaultOption = {\n    id: placeholderName,\n    name: placeholderName,\n    value: placeholderName,\n    label: placeholderLabel,\n  } as FullOption;\n\n  const optionsProp = optionListPropOriginal ?? ([defaultOption] as FlexibleOptionList<O>);\n\n  let optionList: O[] | OptionGroup<O>[] = [];\n  const opts = (\n    Array.isArray(optionsProp)\n      ? toFullOptionList(optionsProp, baseOption, labelMap)\n      : (objectKeys(toFullOptionMap(optionsProp, baseOption)) as unknown as OptionIdentifier[])\n          .map<FullOption<OptionIdentifier>>(opt => ({\n            ...optionsProp[opt]!,\n            name: opt,\n            value: opt,\n          }))\n          // oxlint-disable-next-line no-array-sort\n          .sort((a, b) => a.label.localeCompare(b.label))\n  ) as FullOptionList<O>;\n  if (isFlexibleOptionGroupArray(opts)) {\n    optionList = autoSelectOption\n      ? (uniqOptGroups(opts) as FullOptionList<O>)\n      : (uniqOptGroups([\n          {\n            label: placeholderGroupLabel,\n            options: [defaultOption],\n          },\n          ...opts,\n        ]) as FullOptionList<O>);\n  } else {\n    optionList = autoSelectOption\n      ? (uniqByIdentifier(opts as O[]) as FullOptionList<O>)\n      : (uniqByIdentifier([defaultOption, ...(opts as O[])]) as FullOptionList<O>);\n  }\n\n  let optionsMap: Partial<FullOptionRecord<FullOption>> = {};\n  if (!Array.isArray(optionsProp)) {\n    const op = toFullOptionMap(optionsProp, baseOption) as FullOptionMap<\n      FullOption,\n      OptionIdentifier\n    >;\n    optionsMap = autoSelectOption ? op : { ...op, [placeholderName]: defaultOption };\n  } else {\n    if (isFlexibleOptionGroupArray(optionList)) {\n      for (const og of optionList) {\n        for (const opt of og.options) {\n          optionsMap[(opt.value ?? /* istanbul ignore next */ opt.name) as OptionIdentifier] =\n            toFullOption(opt, baseOption) as FullOption;\n        }\n      }\n    } else {\n      for (const opt of optionList) {\n        optionsMap[(opt.value ?? /* istanbul ignore next */ opt.name) as OptionIdentifier] =\n          toFullOption(opt, baseOption) as FullOption;\n      }\n    }\n  }\n\n  return { defaultOption, optionList, optionsMap };\n};\n","import type { FullField, OptionList, WithUnknownIndex } from '../types';\nimport { isFlexibleOptionGroupArray, toFullOption } from './optGroupUtils';\n\nconst filterByComparator = (field: FullField, operator: string, fieldToCompare: FullField) => {\n  const fullField = toFullOption(field);\n  const fullFieldToCompare = toFullOption(fieldToCompare);\n  if (fullField.value === fullFieldToCompare.value) {\n    return false;\n  }\n  if (typeof fullField.comparator === 'string') {\n    return fullField[fullField.comparator] === fullFieldToCompare[fullField.comparator];\n  }\n  return fullField.comparator?.(fullFieldToCompare, operator) ?? /* istanbul ignore next */ false;\n};\n\n/**\n * For a given {@link FullField}, returns the `fields` list filtered for\n * other fields that match by `comparator`. Only fields *other than the\n * one in question* will ever be included, even if `comparator` is `null`\n * or `undefined`. If `comparator` is a string, fields with the same value\n * for that property will be included. If `comparator` is a function, each\n * field will be passed to the function along with the `operator` and fields\n * for which the function returns `true` will be included.\n *\n * @group Option Lists\n */\nexport const filterFieldsByComparator = (\n  /** The field in question. */\n  field: FullField,\n  /** The full {@link FullField} list to be filtered. */\n  fields: OptionList<FullField>,\n  operator: string\n):\n  | FullField[]\n  | {\n      options: WithUnknownIndex<FullField>[];\n      label: string;\n    }[] => {\n  if (!field.comparator) {\n    const filterOutSameField = (f: FullField) =>\n      (f.value ?? /* istanbul ignore next */ f.name) !==\n      (field.value ?? /* istanbul ignore next */ field.name);\n    if (isFlexibleOptionGroupArray(fields)) {\n      return fields.map(og => ({\n        ...og,\n        options: og.options.filter(v => filterOutSameField(v)),\n      }));\n    }\n    return fields.filter(v => filterOutSameField(v));\n  }\n\n  if (isFlexibleOptionGroupArray(fields)) {\n    return fields\n      .map(og => ({\n        ...og,\n        options: og.options.filter(f => filterByComparator(field, operator, f)),\n      }))\n      .filter(og => og.options.length > 0);\n  }\n\n  return fields.filter(f => filterByComparator(field, operator, f));\n};\n","import { numericQuantity } from 'numeric-quantity';\nimport type { ParseNumberMethod } from '../types';\n\n/**\n * Options object for {@link parseNumber}.\n */\nexport interface ParseNumberOptions {\n  parseNumbers?: ParseNumberMethod;\n  /**\n   * Generates a `bigint` value if the string represents a valid integer\n   * outside the safe boundaries of the `number` type.\n   */\n  bigIntOnOverflow?: boolean;\n}\n\n/**\n * Converts a string to a number. Uses native `parseFloat` if `parseNumbers` is \"native\",\n * otherwise uses [`numeric-quantity`](https://jakeboone02.github.io/numeric-quantity/).\n * If that returns `NaN`, the string is returned unchanged. Numeric values are returned\n * as-is regardless of the `parseNumbers` option.\n */\nexport const parseNumber = (\n  // oxlint-disable-next-line typescript/no-explicit-any\n  val: any,\n  { parseNumbers, bigIntOnOverflow }: ParseNumberOptions = {}\n  // oxlint-disable-next-line typescript/no-explicit-any\n): any => {\n  if (!parseNumbers || typeof val === 'bigint' || typeof val === 'number') {\n    return val;\n  }\n\n  if (parseNumbers === 'native') {\n    return Number.parseFloat(val);\n  }\n\n  const valAsNum: number | bigint =\n    // TODO: Should these options be configurable?\n    numericQuantity(val, {\n      allowTrailingInvalid: parseNumbers === 'enhanced',\n      bigIntOnOverflow,\n      romanNumerals: false,\n      round: false,\n    });\n\n  return typeof valAsNum === 'bigint' || !Number.isNaN(valAsNum) ? valAsNum : val;\n};\n","/**\n * Recursively steps through a query object ({@link index!RuleGroupType RuleGroupType} or {@link index!RuleGroupTypeIC RuleGroupTypeIC}),\n * passing each {@link index!RuleType RuleType} object to a provided `ruleProcessor` function and returning a\n * new query object if there were any referential changes.\n *\n * @module transformQuery\n */\n\nimport { produce } from 'immer';\nimport type { RuleGroupType, RuleGroupTypeAny, RuleGroupTypeIC, RuleType } from '../types';\nimport { isRuleGroup, isRuleGroupType } from './isRuleGroup';\n\nconst remapProperties = (\n  // oxlint-disable-next-line typescript/no-explicit-any\n  obj: Record<string, any>,\n  propertyMap: Record<string, string | false>,\n  deleteRemappedProperties: boolean\n) =>\n  produce(obj, draft => {\n    for (const [k, v] of Object.entries(propertyMap)) {\n      if (v === false) {\n        delete draft[k];\n      } else if (!!v && k !== v && k in draft) {\n        draft[v] = draft[k];\n        if (deleteRemappedProperties) {\n          delete draft[k];\n        }\n      }\n    }\n  });\n\n/**\n * Options object for {@link index!transformQuery transformQuery}.\n */\nexport interface TransformQueryOptions<RG extends RuleGroupTypeAny = RuleGroupType> {\n  /**\n   * When a rule is encountered in the hierarchy, it will be replaced\n   * with the result of this function.\n   *\n   * @defaultValue `r => r`\n   */\n  // oxlint-disable-next-line typescript/no-explicit-any\n  ruleProcessor?: (rule: RuleType) => any;\n  /**\n   * When a group is encountered in the hierarchy (including the root group, the\n   * query itself), it will be replaced with the result of this function.\n   *\n   * @defaultValue `rg => rg`\n   */\n  // oxlint-disable-next-line typescript/no-explicit-any\n  ruleGroupProcessor?: (ruleGroup: RG) => Record<string, any>;\n  /**\n   * For each rule and group in the query, any properties matching a key\n   * in this object will be renamed to the corresponding value. To retain both\n   * the new _and_ the original properties, set `deleteRemappedProperties`\n   * to `false`.\n   *\n   * If a key has a value of `false`, the corresponding property will be removed\n   * without being copied to a new property name. (Warning: `{ rules: false }`\n   * will prevent recursion and only return the processed root group.)\n   *\n   * @defaultValue `{}`\n   *\n   * @example\n   * ```\n   *   transformQuery(\n   *     { combinator: 'and', not: true, rules: [] },\n   *     { propertyMap: { combinator: 'AndOr', not: false } }\n   *   )\n   *   // Returns: { AndOr: 'and', rules: [] }\n   * ```\n   */\n  propertyMap?: Record<string, string | false>;\n  /**\n   * Any combinator values (including independent combinators) will be translated\n   * from the key in this object to the value.\n   *\n   * @defaultValue `{}`\n   *\n   * @example\n   * ```\n   *   transformQuery(\n   *     { combinator: 'and', rules: [] },\n   *     { combinatorMap: { and: '&&', or: '||' } }\n   *   )\n   *   // Returns: { combinator: '&&', rules: [] }\n   * ```\n   */\n  combinatorMap?: Record<string, string>;\n  /**\n   * Any operator values will be translated from the key in this object to the value.\n   *\n   * @defaultValue `{}`\n   *\n   * @example\n   * ```\n   *   transformQuery(\n   *     { combinator: 'and', rules: [{ field: 'name', operator: '=', value: 'Steve Vai' }] },\n   *     { operatorMap: { '=': 'is' } }\n   *   )\n   *   // Returns:\n   *   // {\n   *   //   combinator: 'and',\n   *   //   rules: [{ field: 'name', operator: 'is', value: 'Steve Vai' }]\n   *   // }\n   * ```\n   */\n  operatorMap?: Record<string, string>;\n  /**\n   * Prevents the `path` property (see {@link index!Path Path}) from being added to each\n   * rule and group in the hierarchy.\n   *\n   * @defaultValue `false`\n   */\n  omitPath?: boolean;\n  /**\n   * Original properties remapped according to the `propertyMap` option will be removed.\n   *\n   * @defaultValue `true`\n   *\n   * @example\n   * ```\n   *   transformQuery(\n   *     { combinator: 'and', rules: [] },\n   *     { propertyMap: { combinator: 'AndOr' }, deleteRemappedProperties: false }\n   *   )\n   *   // Returns: { combinator: 'and', AndOr: 'and', rules: [] }\n   * ```\n   */\n  deleteRemappedProperties?: boolean;\n}\n\n/**\n * Recursively process a query heirarchy using this versatile utility function.\n *\n * [Documentation](https://react-querybuilder.js.org/docs/utils/misc#transformquery)\n */\nexport function transformQuery(\n  query: RuleGroupType,\n  options?: TransformQueryOptions\n  // oxlint-disable-next-line typescript/no-explicit-any\n): any;\n/**\n * Recursively process a query heirarchy with independent combinators using this\n * versatile utility function.\n *\n * [Documentation](https://react-querybuilder.js.org/docs/utils/misc#transformquery)\n */\nexport function transformQuery(\n  query: RuleGroupTypeIC,\n  options?: TransformQueryOptions<RuleGroupTypeIC>\n  // oxlint-disable-next-line typescript/no-explicit-any\n): any;\nexport function transformQuery<RG extends RuleGroupTypeAny>(\n  query: RG,\n  options: TransformQueryOptions<RG> = {}\n) {\n  const {\n    ruleProcessor = r => r,\n    ruleGroupProcessor = rg => rg,\n    propertyMap = {},\n    combinatorMap = {},\n    operatorMap = {},\n    omitPath = false,\n    deleteRemappedProperties = true,\n  } = options;\n\n  // oxlint-disable-next-line typescript/no-explicit-any\n  const processGroup = (rg: RuleGroupTypeAny): any => ({\n    ...ruleGroupProcessor(\n      remapProperties(\n        {\n          ...rg,\n          ...(isRuleGroupType(rg)\n            ? { combinator: combinatorMap[rg.combinator] ?? rg.combinator }\n            : {}),\n        },\n        propertyMap,\n        deleteRemappedProperties\n      ) as RG\n    ),\n    ...(propertyMap['rules'] === false\n      ? null\n      : {\n          // oxlint-disable-next-line typescript/no-explicit-any\n          [propertyMap['rules'] ?? 'rules']: rg.rules.map((r: any, idx) => {\n            const pathObject = omitPath ? null : { path: [...rg.path!, idx] };\n            if (typeof r === 'string') {\n              // independent combinators\n              return combinatorMap[r] ?? r;\n            } else if (isRuleGroup(r)) {\n              // sub-groups\n              return processGroup({ ...r, ...pathObject });\n            }\n            // rules\n            return ruleProcessor(\n              remapProperties(\n                {\n                  ...r,\n                  ...pathObject,\n                  ...('operator' in r ? { operator: operatorMap[r.operator] ?? r.operator } : {}),\n                },\n                propertyMap,\n                deleteRemappedProperties\n              ) as RuleType\n            );\n          }),\n        }),\n  });\n\n  return processGroup({ ...query, ...(omitPath ? null : { path: [] }) });\n}\n","import type { RuleGroupTypeAny, RuleType, RuleValidator, ValidationResult } from '../types';\nimport { isRuleGroup } from './isRuleGroup';\nimport { isPojo } from './misc';\n\n/**\n * Determines if an object is useful as a validation result.\n */\nexport const isValidationResult = (vr?: ValidationResult): vr is ValidationResult =>\n  isPojo(vr) && typeof vr.valid === 'boolean';\n\n/**\n * Determines if a rule or group is valid based on a validation result (if defined)\n * or a validator function. Returns `true` if neither are defined and the `muted`\n * property is not `true`.\n */\nexport const isRuleOrGroupValid = (\n  rg: RuleType | RuleGroupTypeAny,\n  validationResult?: boolean | ValidationResult,\n  validator?: RuleValidator\n): boolean => {\n  if (rg.muted) {\n    return false;\n  }\n  if (typeof validationResult === 'boolean') {\n    return validationResult;\n  }\n  if (isValidationResult(validationResult)) {\n    return validationResult.valid;\n  }\n  if (typeof validator === 'function' && !isRuleGroup(rg)) {\n    const vr = validator(rg);\n    if (typeof vr === 'boolean') {\n      return vr;\n    }\n    // istanbul ignore else\n    if (isValidationResult(vr)) {\n      return vr.valid;\n    }\n  }\n  return true;\n};\n","import type { InputType, ParseNumberMethod, ParseNumbersPropConfig } from '../types';\n\nexport const getParseNumberMethod = ({\n  parseNumbers,\n  inputType,\n}: {\n  parseNumbers?: ParseNumbersPropConfig;\n  inputType?: InputType | null;\n}): ParseNumberMethod => {\n  if (typeof parseNumbers === 'string') {\n    const [method, level] = parseNumbers.split('-') as\n      | [ParseNumberMethod, 'limited']\n      | [ParseNumberMethod];\n    if (level === 'limited') {\n      return inputType === 'number' ? method : false;\n    }\n\n    return method;\n  }\n\n  return parseNumbers ? 'strict' : false;\n};\n","import type { SetRequired } from 'type-fest';\nimport type {\n  ConstituentWordOrder,\n  DefaultCombinatorName,\n  FormatQueryOptions,\n  FullField,\n  GroupVariantCondition,\n  MatchMode,\n  NLTranslationKey,\n  NLTranslations,\n  OptionList,\n  RuleGroupTypeAny,\n  RuleType,\n  ValueProcessorByRule,\n  ValueProcessorLegacy,\n  ValueProcessorOptions,\n} from '../../types';\nimport { joinWith, splitBy, toArray } from '../arrayUtils';\nimport { getParseNumberMethod } from '../getParseNumberMethod';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isPojo, lc, numericRegex } from '../misc';\nimport { getOption } from '../optGroupUtils';\nimport { parseNumber } from '../parseNumber';\n\n/**\n * Maps a {@link DefaultOperatorName} to a SQL operator.\n *\n * @group Export\n */\nexport const mapSQLOperator = (rqbOperator: string): string => {\n  switch (lc(rqbOperator)) {\n    case 'null':\n      return 'is null';\n    case 'notnull':\n      return 'is not null';\n    case 'notin':\n      return 'not in';\n    case 'notbetween':\n      return 'not between';\n    case 'contains':\n    case 'beginswith':\n    case 'endswith':\n      return 'like';\n    case 'doesnotcontain':\n    case 'doesnotbeginwith':\n    case 'doesnotendwith':\n      return 'not like';\n    default:\n      return rqbOperator;\n  }\n};\n\n/**\n * Maps a (lowercase) {@link DefaultOperatorName} to a MongoDB operator.\n *\n * @group Export\n */\nexport const mongoOperators = {\n  '=': '$eq',\n  '!=': '$ne',\n  '<': '$lt',\n  '<=': '$lte',\n  '>': '$gt',\n  '>=': '$gte',\n  in: '$in',\n  notin: '$nin',\n  notIn: '$nin', // only here for backwards compatibility\n};\n\n/**\n * Maps a (lowercase) {@link DefaultOperatorName} to a Prisma ORM operator.\n *\n * @group Export\n */\nexport const prismaOperators = {\n  '=': 'equals',\n  '!=': 'not',\n  '<': 'lt',\n  '<=': 'lte',\n  '>': 'gt',\n  '>=': 'gte',\n  in: 'in',\n  notin: 'notIn',\n};\n\n/**\n * Maps a {@link DefaultCombinatorName} to a CEL combinator.\n *\n * @group Export\n */\nexport const celCombinatorMap: {\n  and: '&&';\n  or: '||';\n} = {\n  and: '&&',\n  or: '||',\n} satisfies Record<DefaultCombinatorName, '&&' | '||'>;\n\n/**\n * Register these operators with `jsonLogic` before applying the result\n * of `formatQuery(query, 'jsonlogic')`.\n *\n * @example\n * ```\n * for (const [op, func] of Object.entries(jsonLogicAdditionalOperators)) {\n *   jsonLogic.add_operation(op, func);\n * }\n * jsonLogic.apply({ \"startsWith\": [{ \"var\": \"firstName\" }, \"Stev\"] }, data);\n * ```\n *\n * @group Export\n */\nexport const jsonLogicAdditionalOperators: Record<\n  'startsWith' | 'endsWith',\n  (a: string, b: string) => boolean\n> = {\n  startsWith: (a: string, b: string) => typeof a === 'string' && a.startsWith(b),\n  endsWith: (a: string, b: string) => typeof a === 'string' && a.endsWith(b),\n};\n\n/**\n * Converts all `string`-type `value` properties of a query object into `number` where appropriate.\n *\n * Used by {@link formatQuery} for the `json*` formats when `parseNumbers` is `true`.\n *\n * @group Export\n */\nexport const numerifyValues = (\n  rg: RuleGroupTypeAny,\n  options: SetRequired<FormatQueryOptions, 'fields'>\n): RuleGroupTypeAny => ({\n  ...rg,\n  // @ts-expect-error TS doesn't keep track of odd/even indexes here\n  rules: rg.rules.map(r => {\n    if (typeof r === 'string') {\n      return r;\n    }\n\n    if (isRuleGroup(r)) {\n      return numerifyValues(r, options);\n    }\n\n    const fieldData = getOption(options.fields as OptionList<FullField>, r.field);\n    const parseNumbers = getParseNumberMethod({\n      parseNumbers: options.parseNumbers,\n      inputType: fieldData?.inputType,\n    });\n\n    if (Array.isArray(r.value)) {\n      return { ...r, value: r.value.map(v => parseNumber(v, { parseNumbers })) };\n    }\n\n    const valAsArray = toArray(r.value, { retainEmptyStrings: true }).map(v =>\n      parseNumber(v, { parseNumbers })\n    );\n    if (valAsArray.every(v => typeof v === 'number')) {\n      // istanbul ignore else\n      if (valAsArray.length > 1) {\n        return { ...r, value: valAsArray };\n      } else if (valAsArray.length === 1) {\n        return { ...r, value: valAsArray[0] };\n      }\n    }\n\n    return r;\n  }),\n});\n\n/**\n * Determines whether a value is _anything_ except an empty `string` or `NaN`.\n *\n * @group Export\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const isValidValue = (value: any): boolean =>\n  (typeof value === 'string' && value.length > 0) ||\n  (typeof value === 'number' && !Number.isNaN(value)) ||\n  (typeof value !== 'string' && typeof value !== 'number');\n\n/**\n * Determines whether {@link formatQuery} should render the given value as a number.\n * As long as `parseNumbers` is `true`, `number` and `bigint` values will return `true` and\n * `string` values will return `true` if they test positive against {@link numericRegex}.\n *\n * @group Export\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const shouldRenderAsNumber = (value: any, parseNumbers?: boolean): boolean =>\n  !!parseNumbers &&\n  (typeof value === 'number' ||\n    typeof value === 'bigint' ||\n    (typeof value === 'string' && numericRegex.test(value)));\n\n/**\n * Used by {@link formatQuery} to determine whether the given value processor is a\n * \"legacy\" value processor by counting the number of arguments. Legacy value\n * processors take 3 arguments (not counting any arguments with default values), while\n * rule-based value processors take no more than 2 arguments.\n *\n * @group Export\n */\nexport const isValueProcessorLegacy = (\n  valueProcessor: ValueProcessorLegacy | ValueProcessorByRule\n): valueProcessor is ValueProcessorLegacy => valueProcessor.length >= 3;\n\n/**\n * Converts the `quoteFieldNamesWith` option into an array of two strings.\n * If the option is a string, the array elements are both that string.\n *\n * @default\n * ['', '']\n *\n * @group Export\n */\nexport const getQuoteFieldNamesWithArray = (\n  // istanbul ignore next\n  quoteFieldNamesWith: null | string | [string, string] = ['', '']\n): [string, string] =>\n  Array.isArray(quoteFieldNamesWith)\n    ? quoteFieldNamesWith\n    : typeof quoteFieldNamesWith === 'string'\n      ? [quoteFieldNamesWith, quoteFieldNamesWith]\n      : (quoteFieldNamesWith ?? ['', '']);\n\n/**\n * Given a field name and relevant {@link ValueProcessorOptions}, returns the field name\n * wrapped in the configured quote character(s).\n *\n * @group Export\n */\nexport const getQuotedFieldName = (\n  fieldName: string,\n  { quoteFieldNamesWith, fieldIdentifierSeparator }: ValueProcessorOptions\n): string => {\n  const [qPre, qPost] = getQuoteFieldNamesWithArray(quoteFieldNamesWith);\n  return typeof fieldIdentifierSeparator === 'string' && fieldIdentifierSeparator.length > 0\n    ? joinWith(\n        splitBy(fieldName, fieldIdentifierSeparator).map(part => `${qPre}${part}${qPost}`),\n        fieldIdentifierSeparator\n      )\n    : `${qPre}${fieldName}${qPost}`;\n};\n\nconst defaultWordOrder = ['S', 'V', 'O'];\n\n/**\n * Given a [Constituent word order](https://en.wikipedia.org/wiki/Word_order#Constituent_word_orders)\n * like \"svo\" or \"sov\", returns a permutation of `[\"S\", \"V\", \"O\"]` based on the first occurrence of\n * each letter in the input string (case insensitive). This widens the valid input from abbreviations\n * like \"svo\" to more expressive strings like \"subject-verb-object\" or \"sub ver obj\". Any missing\n * letters are appended in the default order \"SVO\" (e.g., \"object\" would yield `[\"O\", \"S\", \"V\"]`).\n *\n * @group Export\n */\nexport const normalizeConstituentWordOrder = (input: string): ConstituentWordOrder => {\n  const result: string[] = [];\n  const letterSet = new Set(defaultWordOrder);\n\n  for (const char of input.toUpperCase()) {\n    if (letterSet.has(char)) {\n      result.push(char);\n      letterSet.delete(char);\n      if (letterSet.size === 0) break;\n    }\n  }\n\n  // Add any missing letters in default order\n  for (const letter of defaultWordOrder) {\n    if (letterSet.has(letter)) {\n      result.push(letter);\n    }\n  }\n\n  return result as ConstituentWordOrder;\n};\n\n/**\n * Default translations used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\n// The ones commented below are unnecessary for the default implementation,\n// but they can be overridden for customized implementations.\nexport const defaultNLTranslations: NLTranslations = {\n  // and: 'and',\n  // or: 'or',\n  // true: 'true',\n  // false: 'false',\n  groupPrefix: '',\n  // groupPrefix_not: '',\n  groupPrefix_not_xor: 'either zero or more than one of',\n  groupPrefix_xor: 'exactly one of',\n  groupSuffix: 'is true',\n  groupSuffix_not: 'is not true',\n  // groupSuffix_not_xor: 'is true',\n  // groupSuffix_xor: 'is true',\n};\n\n/**\n * Note: This function assumes `conditions.length > 0`\n */\nconst translationMatchFilter = (\n  key: NLTranslationKey,\n  keyToTest: string,\n  conditions: GroupVariantCondition[]\n) =>\n  // The translation matches the base key\n  keyToTest.startsWith(key) &&\n  // The translation specifies all conditions\n  conditions.every(\n    c =>\n      // This translation specifies _this_ condition\n      keyToTest.includes(`_${c}`) &&\n      // This translation specifies the same _total number_ of conditions\n      keyToTest.match(/_/g)?.length === conditions.length\n  );\n\n/**\n * Used by {@link formatQuery} to get a translation based on certain conditions\n * for the \"natural_language\" format.\n *\n * @group Export\n */\nexport const getNLTranslataion = (\n  key: NLTranslationKey,\n  translations: NLTranslations,\n  conditions: GroupVariantCondition[] = []\n): string =>\n  conditions.length === 0\n    ? (translations[key] ?? defaultNLTranslations[key] ?? /* istanbul ignore next */ '')\n    : (Object.entries(translations).find(([keyToTest]) =>\n        translationMatchFilter(key, keyToTest, conditions)\n      )?.[1] ??\n      Object.entries(defaultNLTranslations).find(([keyToTest]) =>\n        translationMatchFilter(key, keyToTest, conditions)\n      )?.[1] ??\n      defaultNLTranslations[key] ??\n      /* istanbul ignore next */ '');\n\ntype ProcessedMatchMode =\n  | { mode: 'all'; threshold?: number | null | undefined }\n  | { mode: 'none'; threshold?: number | null | undefined }\n  | { mode: 'some'; threshold?: number | null | undefined }\n  | { mode: 'atleast'; threshold: number }\n  | { mode: 'atmost'; threshold: number }\n  | { mode: 'exactly'; threshold: number };\n\nexport const processMatchMode = (rule: RuleType): void | false | ProcessedMatchMode => {\n  const { mode, threshold } = rule.match ?? {};\n\n  if (mode) {\n    if (!isRuleGroup(rule.value)) return false;\n\n    const matchModeLC = lc(mode) as Lowercase<MatchMode>;\n\n    const matchModeCoerced =\n      matchModeLC === 'atleast' && threshold === 1\n        ? 'some'\n        : matchModeLC === 'atmost' && threshold === 0\n          ? 'none'\n          : matchModeLC;\n\n    if (\n      (matchModeCoerced === 'atleast' ||\n        matchModeCoerced === 'atmost' ||\n        matchModeCoerced === 'exactly') &&\n      (typeof threshold !== 'number' || threshold < 0)\n    ) {\n      return false;\n    }\n\n    return { mode: matchModeCoerced, threshold: threshold! };\n  }\n};\n\n/**\n * \"Replacer\" method for JSON.stringify's second argument. Converts `bigint` values to\n * objects with a `$bigint` property having a value of a string representation of\n * the actual `bigint`-type value.\n *\n * Inverse of {@link bigIntJsonParseReviver}.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#use_within_json\n */\nexport const bigIntJsonStringifyReplacer = (_key: string, value: unknown): unknown =>\n  typeof value === 'bigint' ? { $bigint: value.toString() } : value;\n\n/**\n * \"Reviver\" method for JSON.parse's second argument. Converts objects having a single\n * `$bigint: string` property to an actual `bigint` value.\n *\n * Inverse of {@link bigIntJsonStringifyReplacer}.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt#use_within_json\n */\nexport const bigIntJsonParseReviver = (_key: string, value: unknown): unknown =>\n  isPojo(value) && Object.keys(value).length === 1 && typeof value.$bigint === 'string'\n    ? BigInt(value.$bigint)\n    : value;\n","import type { DefaultCombinatorName, RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\nimport { celCombinatorMap } from './utils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"cel\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorCEL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n  const {\n    fields,\n    fallbackExpression,\n    getParseNumberBoolean,\n    placeholderFieldName,\n    placeholderOperatorName,\n    placeholderValueName,\n    ruleProcessor,\n    validateRule,\n    validationMap,\n  } = options;\n\n  const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean): string => {\n    if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n      return outermost ? fallbackExpression : '';\n    }\n\n    const processedRules = [];\n    let precedingCombinator = '';\n    let firstRule = true;\n\n    for (const rule of rg.rules) {\n      // Independent combinators\n      if (typeof rule === 'string') {\n        precedingCombinator = celCombinatorMap[rule as DefaultCombinatorName];\n        continue;\n      }\n\n      // Groups\n      if (isRuleGroup(rule)) {\n        const processedGroup = processRuleGroup(rule);\n        if (processedGroup) {\n          if (!firstRule && precedingCombinator) {\n            processedRules.push(precedingCombinator);\n            precedingCombinator = '';\n          }\n          firstRule = false;\n          processedRules.push(processedGroup);\n        }\n        continue;\n      }\n\n      // Rules\n      const [validationResult, fieldValidator] = validateRule(rule);\n      if (\n        !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n        rule.field === placeholderFieldName ||\n        rule.operator === placeholderOperatorName ||\n        /* istanbul ignore next */\n        (placeholderValueName !== undefined && rule.value === placeholderValueName)\n      ) {\n        continue;\n      }\n\n      const fieldData = getOption(fields, rule.field);\n      const processedRule = ruleProcessor(rule, {\n        ...options,\n        parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n        escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n        fieldData,\n      });\n\n      if (processedRule) {\n        if (!firstRule && precedingCombinator) {\n          processedRules.push(precedingCombinator);\n          precedingCombinator = '';\n        }\n        firstRule = false;\n        processedRules.push(processedRule);\n      }\n    }\n\n    const expression = processedRules.join(\n      isRuleGroupType(rg) ? ` ${celCombinatorMap[rg.combinator as DefaultCombinatorName]} ` : ' '\n    );\n\n    const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '!' : ''}(`, ')'] : ['', ''];\n\n    return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n  };\n\n  return processRuleGroup(ruleGroup, true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorCEL } from './defaultRuleGroupProcessorCEL';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeDoubleQuotes = (v: any, escapeQuotes?: boolean) =>\n  typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`\"`, `\\\\\"`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"cel\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorCEL: RuleProcessor = (\n  rule,\n  // istanbul ignore next\n  opts = {}\n) => {\n  const { escapeQuotes, parseNumbers, preserveValueOrder } = opts;\n  const { field, operator, value, valueSource } = rule;\n  const valueIsField = valueSource === 'field';\n  const operatorTL = lc(operator === '=' ? '==' : operator);\n  const useBareValue =\n    typeof value === 'number' ||\n    typeof value === 'boolean' ||\n    typeof value === 'bigint' ||\n    shouldRenderAsNumber(value, parseNumbers);\n\n  const matchEval = processMatchMode(rule);\n\n  if (matchEval === false) {\n    return '';\n  } else if (matchEval) {\n    const { mode, threshold } = matchEval;\n\n    // TODO?: Randomize this alias\n    const arrayElementAlias = 'elem_alias';\n\n    const celQuery = transformQuery(rule.value as RuleGroupType, {\n      ruleProcessor: r => ({ ...r, field: `${arrayElementAlias}${r.field ? `.${r.field}` : ''}` }),\n    });\n    const nestedArrayFilter = defaultRuleGroupProcessorCEL(\n      celQuery,\n      opts as FormatQueryFinalOptions\n    );\n\n    switch (mode) {\n      case 'all':\n        return `${field}.all(${arrayElementAlias}, ${nestedArrayFilter})`;\n\n      case 'none':\n      case 'some':\n        return `${mode === 'none' ? '!' : ''}${field}.exists(${arrayElementAlias}, ${nestedArrayFilter})`;\n\n      case 'atleast':\n      case 'atmost':\n      case 'exactly': {\n        const totalCount = `double(${field}.size())`;\n        const filteredCount = `${field}.filter(${arrayElementAlias}, ${nestedArrayFilter}).size()`;\n\n        const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n        if (threshold > 0 && threshold < 1) {\n          return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n        }\n        return `${filteredCount} ${op} ${threshold}`;\n      }\n    }\n  }\n\n  switch (operatorTL) {\n    case '<':\n    case '<=':\n    case '==':\n    case '!=':\n    case '>':\n    case '>=':\n      return `${field} ${operatorTL} ${\n        valueIsField || useBareValue\n          ? trimIfString(value)\n          : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n      }`;\n\n    case 'contains':\n    case 'doesnotcontain': {\n      const negate = shouldNegate(operatorTL) ? '!' : '';\n      return `${negate}${field}.contains(${\n        valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n      })`;\n    }\n\n    case 'beginswith':\n    case 'doesnotbeginwith': {\n      const negate = shouldNegate(operatorTL) ? '!' : '';\n      return `${negate}${field}.startsWith(${\n        valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n      })`;\n    }\n\n    case 'endswith':\n    case 'doesnotendwith': {\n      const negate = shouldNegate(operatorTL) ? '!' : '';\n      return `${negate}${field}.endsWith(${\n        valueIsField ? trimIfString(value) : `\"${escapeDoubleQuotes(value, escapeQuotes)}\"`\n      })`;\n    }\n\n    case 'null':\n      return `${field} == null`;\n\n    case 'notnull':\n      return `${field} != null`;\n\n    case 'in':\n    case 'notin': {\n      const [prefix, suffix] = shouldNegate(operatorTL) ? ['!(', ')'] : ['', ''];\n      const valueAsArray = toArray(value);\n      return `${prefix}${field} in [${valueAsArray\n        .map(val =>\n          valueIsField || shouldRenderAsNumber(val, parseNumbers)\n            ? `${trimIfString(val)}`\n            : `\"${escapeDoubleQuotes(val, escapeQuotes)}\"`\n        )\n        .join(', ')}]${suffix}`;\n    }\n\n    case 'between':\n    case 'notbetween': {\n      const valueAsArray = toArray(value);\n      if (\n        valueAsArray.length >= 2 &&\n        !nullOrUndefinedOrEmpty(valueAsArray[0]) &&\n        !nullOrUndefinedOrEmpty(valueAsArray[1])\n      ) {\n        const [first, second] = valueAsArray;\n        // For backwards compatibility, default to parsing numbers for between operators\n        // unless parseNumbers is explicitly set to false\n        const shouldParseNumbers = !(parseNumbers === false);\n        const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n          ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n          : Number.NaN;\n        const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n          ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n          : Number.NaN;\n        let firstValue = Number.isNaN(firstNum)\n          ? valueIsField\n            ? `${first}`\n            : `\"${escapeDoubleQuotes(first, escapeQuotes)}\"`\n          : firstNum;\n        let secondValue = Number.isNaN(secondNum)\n          ? valueIsField\n            ? `${second}`\n            : `\"${escapeDoubleQuotes(second, escapeQuotes)}\"`\n          : secondNum;\n\n        if (\n          !preserveValueOrder &&\n          firstValue === firstNum &&\n          secondValue === secondNum &&\n          secondNum < firstNum\n        ) {\n          const tempNum = secondNum;\n          secondValue = firstNum;\n          firstValue = tempNum;\n        }\n\n        return operatorTL === 'between'\n          ? `(${field} >= ${firstValue} && ${field} <= ${secondValue})`\n          : `(${field} < ${firstValue} || ${field} > ${secondValue})`;\n      } else {\n        return '';\n      }\n    }\n  }\n  return '';\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default fallback object used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const mongoDbFallback = { $and: [{ $expr: true }] } as const;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorMongoDBQuery: RuleGroupProcessor = (\n  ruleGroup,\n  options,\n  meta\n) => {\n  const {\n    fields,\n    getParseNumberBoolean,\n    placeholderFieldName,\n    placeholderOperatorName,\n    placeholderValueName,\n    ruleProcessor,\n    validateRule,\n    validationMap,\n  } = options;\n\n  const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n    if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n      return outermost ? mongoDbFallback : false;\n    }\n\n    const combinator = `$${lc(rg.combinator)}`;\n    let hasChildRules = false;\n\n    const expressions: Record<string, unknown>[] = rg.rules\n      .map(rule => {\n        if (isRuleGroup(rule)) {\n          const processedRuleGroup = processRuleGroup(rule);\n          if (processedRuleGroup) {\n            hasChildRules = true;\n            return processedRuleGroup;\n          }\n          return false;\n        }\n        const [validationResult, fieldValidator] = validateRule(rule);\n        if (\n          !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n          rule.field === placeholderFieldName ||\n          rule.operator === placeholderOperatorName ||\n          /* istanbul ignore next */\n          (placeholderValueName !== undefined && rule.value === placeholderValueName)\n        ) {\n          return false;\n        }\n        const fieldData = getOption(fields, rule.field);\n        return ruleProcessor(\n          rule,\n          {\n            ...options,\n            parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n            fieldData,\n          },\n          meta\n        );\n      })\n      .filter(Boolean);\n\n    return expressions.length > 0\n      ? expressions.length === 1 && !hasChildRules\n        ? expressions[0]\n        : { [combinator]: expressions }\n      : mongoDbFallback;\n  };\n\n  return processRuleGroup(convertFromIC(ruleGroup), true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorMongoDBQuery } from './defaultRuleGroupProcessorMongoDBQuery';\nimport { isValidValue, mongoOperators, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst processNumber = <T>(value: unknown, fallback: T, parseNumbers = false) =>\n  shouldRenderAsNumber(value, parseNumbers || typeof value === 'bigint')\n    ? Number(parseNumber(value, { parseNumbers: 'strict' }))\n    : fallback;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorMongoDBQuery: RuleProcessor = (\n  rule,\n  // istanbul ignore next\n  options = {}\n) => {\n  const { field, operator, value, valueSource } = rule;\n  const { parseNumbers, preserveValueOrder, context } = options;\n  const valueIsField = valueSource === 'field';\n\n  const { avoidFieldsAsKeys } = (context ?? {}) as { avoidFieldsAsKeys?: boolean };\n\n  const matchEval = processMatchMode(rule);\n\n  if (matchEval === false) {\n    return;\n  } else if (matchEval) {\n    const { mode, threshold } = matchEval;\n\n    const totalCount = { $size: { $ifNull: [`$${field}`, []] } };\n    const subQueryNoAggCtx = defaultRuleGroupProcessorMongoDBQuery(\n      transformQuery(value as RuleGroupType, {\n        ruleProcessor: r => ({ ...r, field: r.field ? `${field}.${r.field}` : field }),\n      }),\n      {\n        ...(options as FormatQueryFinalOptions),\n        // We have to override `ruleProcessor` in case original `format` is \"mongodb\"\n        ruleProcessor: defaultRuleProcessorMongoDBQuery,\n        context: { ...options.context, avoidFieldsAsKeys: false },\n      }\n    );\n    const subQueryWithAggCtx = defaultRuleGroupProcessorMongoDBQuery(\n      transformQuery(value as RuleGroupType, {\n        ruleProcessor: r => ({ ...r, field: r.field ? `$item.${r.field}` : '$item' }),\n      }),\n      {\n        ...(options as FormatQueryFinalOptions),\n        // We have to override `ruleProcessor` in case original `format` is \"mongodb\"\n        ruleProcessor: defaultRuleProcessorMongoDBQuery,\n        context: { ...options.context, avoidFieldsAsKeys: true },\n      }\n    );\n\n    const filteredCount = {\n      $size: {\n        $ifNull: [\n          { $filter: { input: `$${field}`, as: 'item', cond: { $and: [subQueryWithAggCtx] } } },\n          [],\n        ],\n      },\n    };\n\n    switch (mode) {\n      case 'all':\n        return { $expr: { $eq: [filteredCount, totalCount] } };\n\n      case 'none':\n        return { $nor: [subQueryNoAggCtx] };\n\n      case 'some':\n        return subQueryNoAggCtx;\n\n      case 'atleast':\n      case 'atmost':\n      case 'exactly': {\n        const op =\n          mode === 'atleast'\n            ? mongoOperators['>=']\n            : mode === 'atmost'\n              ? mongoOperators['<=']\n              : mongoOperators['='];\n\n        if (threshold > 0 && threshold < 1) {\n          return { $expr: { [op]: [filteredCount, { $multiply: [totalCount, threshold] }] } };\n        }\n        return { $expr: { [op]: [filteredCount, threshold] } };\n      }\n    }\n  }\n\n  if (operator === '=' && !valueIsField) {\n    return avoidFieldsAsKeys\n      ? { $eq: [`$${field}`, processNumber(value, value, parseNumbers)] }\n      : { [field]: processNumber(value, value, parseNumbers) };\n  }\n\n  const operatorLC = lc(operator);\n  switch (operatorLC) {\n    case '<':\n    case '<=':\n    case '=':\n    case '!=':\n    case '>':\n    case '>=': {\n      const mongoOperator = mongoOperators[operatorLC];\n      return valueIsField\n        ? { [mongoOperator]: [`$${field}`, `$${value}`] }\n        : avoidFieldsAsKeys\n          ? {\n              $and: [\n                { $ne: [`$${field}`, null] },\n                { [mongoOperator]: [`$${field}`, processNumber(value, value, parseNumbers)] },\n              ],\n            }\n          : { [field]: { [mongoOperator]: processNumber(value, value, parseNumbers) } };\n    }\n\n    case 'contains':\n      return valueIsField\n        ? { $where: `this.${field}.includes(this.${value})` }\n        : avoidFieldsAsKeys\n          ? { $regexMatch: { input: `$${field}`, regex: value } }\n          : { [field]: { $regex: value } };\n\n    case 'beginswith':\n      return valueIsField\n        ? { $where: `this.${field}.startsWith(this.${value})` }\n        : avoidFieldsAsKeys\n          ? { $regexMatch: { input: `$${field}`, regex: `^${value}` } }\n          : { [field]: { $regex: `^${value}` } };\n\n    case 'endswith':\n      return valueIsField\n        ? { $where: `this.${field}.endsWith(this.${value})` }\n        : avoidFieldsAsKeys\n          ? { $regexMatch: { input: `$${field}`, regex: `${value}$` } }\n          : { [field]: { $regex: `${value}$` } };\n\n    case 'doesnotcontain':\n      return valueIsField\n        ? { $where: `!this.${field}.includes(this.${value})` }\n        : avoidFieldsAsKeys\n          ? { $not: { $regexMatch: { input: `$${field}`, regex: value } } }\n          : { [field]: { $not: { $regex: value } } };\n\n    case 'doesnotbeginwith':\n      return valueIsField\n        ? { $where: `!this.${field}.startsWith(this.${value})` }\n        : avoidFieldsAsKeys\n          ? { $not: { $regexMatch: { input: `$${field}`, regex: `^${value}` } } }\n          : { [field]: { $not: { $regex: `^${value}` } } };\n\n    case 'doesnotendwith':\n      return valueIsField\n        ? { $where: `!this.${field}.endsWith(this.${value})` }\n        : avoidFieldsAsKeys\n          ? { $not: { $regexMatch: { input: `$${field}`, regex: `${value}$` } } }\n          : { [field]: { $not: { $regex: `${value}$` } } };\n\n    case 'null':\n      return avoidFieldsAsKeys ? { $eq: [`$${field}`, null] } : { [field]: null };\n\n    case 'notnull':\n      return avoidFieldsAsKeys ? { $ne: [`$${field}`, null] } : { [field]: { $ne: null } };\n\n    case 'in':\n    case 'notin': {\n      const valueAsArray = toArray(value);\n      return valueIsField\n        ? {\n            $where: `${operatorLC === 'notin' ? '!' : ''}[${valueAsArray\n              .map(val => `this.${val}`)\n              .join(',')}].includes(this.${field})`,\n          }\n        : avoidFieldsAsKeys\n          ? operatorLC === 'notin'\n            ? {\n                $not: {\n                  [mongoOperators.in]: [\n                    `$${field}`,\n                    valueAsArray.map(val => processNumber(val, val, parseNumbers)),\n                  ],\n                },\n              }\n            : {\n                [mongoOperators[operatorLC]]: [\n                  `$${field}`,\n                  valueAsArray.map(val => processNumber(val, val, parseNumbers)),\n                ],\n              }\n          : {\n              [field]: {\n                [mongoOperators[operatorLC]]: valueAsArray.map(val =>\n                  processNumber(val, val, parseNumbers)\n                ),\n              },\n            };\n    }\n\n    case 'between':\n    case 'notbetween': {\n      const valueAsArray = toArray(value);\n      if (\n        valueAsArray.length >= 2 &&\n        isValidValue(valueAsArray[0]) &&\n        isValidValue(valueAsArray[1])\n      ) {\n        const [first, second] = valueAsArray;\n        const firstNum = processNumber(first, Number.NaN, true);\n        const secondNum = processNumber(second, Number.NaN, true);\n        let firstValue = valueIsField ? first : Number.isNaN(firstNum) ? first : firstNum;\n        let secondValue = valueIsField ? second : Number.isNaN(secondNum) ? second : secondNum;\n        if (\n          !preserveValueOrder &&\n          firstValue === firstNum &&\n          secondValue === secondNum &&\n          secondNum < firstNum\n        ) {\n          const tempNum = secondNum;\n          secondValue = firstNum;\n          firstValue = tempNum;\n        }\n\n        if (operatorLC === 'between') {\n          return valueIsField\n            ? { $gte: [`$${field}`, `$${firstValue}`], $lte: [`$${field}`, `$${secondValue}`] }\n            : avoidFieldsAsKeys\n              ? {\n                  $and: [{ $gte: [`$${field}`, firstValue] }, { $lte: [`$${field}`, secondValue] }],\n                }\n              : { [field]: { $gte: firstValue, $lte: secondValue } };\n        } else {\n          return valueIsField\n            ? {\n                $or: [\n                  { $lt: [`$${field}`, `$${firstValue}`] },\n                  { $gt: [`$${field}`, `$${secondValue}`] },\n                ],\n              }\n            : avoidFieldsAsKeys\n              ? {\n                  $or: [{ $lt: [`$${field}`, firstValue] }, { $gt: [`$${field}`, secondValue] }],\n                }\n              : { $or: [{ [field]: { $lt: firstValue } }, { [field]: { $gt: secondValue } }] };\n        }\n      } else {\n        return '';\n      }\n    }\n  }\n  return '';\n};\n","import type { RuleProcessor } from '../../types';\nimport { defaultRuleProcessorMongoDBQuery } from './defaultRuleProcessorMongoDBQuery';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"mongodb\" format.\n *\n * Note that the \"mongodb\" format is deprecated in favor of the \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorMongoDB: RuleProcessor = (rule, options) => {\n  const queryObj = defaultRuleProcessorMongoDBQuery(rule, options);\n  return queryObj ? JSON.stringify(queryObj) : '';\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"spel\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSpEL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n  const {\n    fields,\n    fallbackExpression,\n    getParseNumberBoolean,\n    placeholderFieldName,\n    placeholderOperatorName,\n    placeholderValueName,\n    ruleProcessor,\n    validateRule,\n    validationMap,\n  } = options;\n\n  const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean): string => {\n    if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n      return outermost ? fallbackExpression : '';\n    }\n\n    const processedRules = [];\n    let precedingCombinator = '';\n    let firstRule = true;\n\n    for (const rule of rg.rules) {\n      // Independent combinators\n      if (typeof rule === 'string') {\n        precedingCombinator = rule;\n        continue;\n      }\n\n      // Groups\n      if (isRuleGroup(rule)) {\n        const processedGroup = processRuleGroup(rule);\n        if (processedGroup) {\n          if (!firstRule && precedingCombinator) {\n            processedRules.push(precedingCombinator);\n            precedingCombinator = '';\n          }\n          firstRule = false;\n          processedRules.push(processedGroup);\n        }\n        continue;\n      }\n\n      // Rules\n      const [validationResult, fieldValidator] = validateRule(rule);\n      if (\n        !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n        rule.field === placeholderFieldName ||\n        rule.operator === placeholderOperatorName ||\n        /* istanbul ignore next */\n        (placeholderValueName !== undefined && rule.value === placeholderValueName)\n      ) {\n        continue;\n      }\n\n      const fieldData = getOption(fields, rule.field);\n      const processedRule = ruleProcessor(rule, {\n        ...options,\n        parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n        escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n        fieldData,\n      });\n\n      if (processedRule) {\n        if (!firstRule && precedingCombinator) {\n          processedRules.push(precedingCombinator);\n          precedingCombinator = '';\n        }\n        firstRule = false;\n        processedRules.push(processedRule);\n      }\n    }\n\n    const expression = processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ');\n\n    const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '!' : ''}(`, ')'] : ['', ''];\n\n    return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n  };\n\n  return processRuleGroup(ruleGroup, true);\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorSpEL } from './defaultRuleGroupProcessorSpEL';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\nconst wrapInNegation = (clause: string, negate: boolean) => (negate ? `!(${clause})` : clause);\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeSingleQuotes = (v: any, escapeQuotes?: boolean) =>\n  typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`'`, `\\\\'`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"spel\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSpEL: RuleProcessor = (\n  rule,\n  // istanbul ignore next\n  opts = {}\n) => {\n  const { field, operator, value, valueSource } = rule;\n  const { escapeQuotes, parseNumbers, preserveValueOrder } = opts;\n  const valueIsField = valueSource === 'field';\n  const operatorTL = lc(operator === '=' ? '==' : operator);\n  const useBareValue =\n    typeof value === 'number' ||\n    typeof value === 'boolean' ||\n    typeof value === 'bigint' ||\n    shouldRenderAsNumber(value, parseNumbers);\n\n  const matchEval = processMatchMode(rule);\n\n  if (matchEval === false) {\n    return '';\n  } else if (matchEval) {\n    const { mode, threshold } = matchEval;\n\n    const nestedArrayFilter = defaultRuleGroupProcessorSpEL(\n      transformQuery(rule.value as RuleGroupType, {\n        ruleProcessor: r => ({ ...r, field: r.field || '#this' }),\n      }),\n      opts as FormatQueryFinalOptions\n    );\n\n    const totalCount = `${field}.size()`;\n    const filteredCount = `${field}.?[${nestedArrayFilter}].size()`;\n\n    switch (mode) {\n      case 'all':\n        return `${filteredCount} == ${totalCount}`;\n\n      case 'none':\n        return `${filteredCount} == 0`;\n\n      case 'some':\n        return `${filteredCount} >= 1`;\n\n      case 'atleast':\n      case 'atmost':\n      case 'exactly': {\n        const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n        if (threshold > 0 && threshold < 1) {\n          return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n        }\n        return `${filteredCount} ${op} ${threshold}`;\n      }\n    }\n  }\n\n  switch (operatorTL) {\n    case '<':\n    case '<=':\n    case '==':\n    case '!=':\n    case '>':\n    case '>=':\n      return `${field} ${operatorTL} ${\n        valueIsField || useBareValue\n          ? trimIfString(value)\n          : `'${escapeSingleQuotes(value, escapeQuotes)}'`\n      }`;\n\n    case 'contains':\n    case 'doesnotcontain':\n      return wrapInNegation(\n        `${field} matches ${\n          valueIsField || useBareValue\n            ? trimIfString(value)\n            : `'${escapeSingleQuotes(value, escapeQuotes)}'`\n        }`,\n        shouldNegate(operatorTL)\n      );\n\n    case 'beginswith':\n    case 'doesnotbeginwith': {\n      const valueTL = valueIsField\n        ? `'^'.concat(${trimIfString(value)})`\n        : `'${\n            (typeof value === 'string' && !value.startsWith('^')) || useBareValue ? '^' : ''\n          }${escapeSingleQuotes(value, escapeQuotes)}'`;\n      return wrapInNegation(`${field} matches ${valueTL}`, shouldNegate(operatorTL));\n    }\n\n    case 'endswith':\n    case 'doesnotendwith': {\n      const valueTL = valueIsField\n        ? `${trimIfString(value)}.concat('$')`\n        : `'${escapeSingleQuotes(value, escapeQuotes)}${\n            (typeof value === 'string' && !value.endsWith('$')) || useBareValue ? '$' : ''\n          }'`;\n      return wrapInNegation(`${field} matches ${valueTL}`, shouldNegate(operatorTL));\n    }\n\n    case 'null':\n      return `${field} == null`;\n\n    case 'notnull':\n      return `${field} != null`;\n\n    case 'in':\n    case 'notin': {\n      const negate = shouldNegate(operatorTL) ? '!' : '';\n      const valueAsArray = toArray(value);\n      return valueAsArray.length > 0\n        ? `${negate}(${valueAsArray\n            .map(\n              val =>\n                `${field} == ${\n                  valueIsField || shouldRenderAsNumber(val, parseNumbers)\n                    ? `${trimIfString(val)}`\n                    : `'${escapeSingleQuotes(val, escapeQuotes)}'`\n                }`\n            )\n            .join(' or ')})`\n        : '';\n    }\n\n    case 'between':\n    case 'notbetween': {\n      const valueAsArray = toArray(value);\n      if (\n        valueAsArray.length >= 2 &&\n        !nullOrUndefinedOrEmpty(valueAsArray[0]) &&\n        !nullOrUndefinedOrEmpty(valueAsArray[1])\n      ) {\n        const [first, second] = valueAsArray;\n        // For backwards compatibility in SpEL format, between operators should parse numbers\n        // unless parseNumbers is explicitly set to false\n        const shouldParseNumbers = !(parseNumbers === false);\n        const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n          ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n          : Number.NaN;\n        const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n          ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n          : Number.NaN;\n        let firstValue = Number.isNaN(firstNum)\n          ? valueIsField\n            ? `${first}`\n            : `'${escapeSingleQuotes(first, escapeQuotes)}'`\n          : firstNum;\n        let secondValue = Number.isNaN(secondNum)\n          ? valueIsField\n            ? `${second}`\n            : `'${escapeSingleQuotes(second, escapeQuotes)}'`\n          : secondNum;\n        if (\n          !preserveValueOrder &&\n          firstValue === firstNum &&\n          secondValue === secondNum &&\n          secondNum < firstNum\n        ) {\n          const tempNum = secondNum;\n          secondValue = firstNum;\n          firstValue = tempNum;\n        }\n        return operatorTL === 'between'\n          ? `(${field} >= ${firstValue} and ${field} <= ${secondValue})`\n          : `(${field} < ${firstValue} or ${field} > ${secondValue})`;\n      } else {\n        return '';\n      }\n    }\n  }\n\n  return '';\n};\n","import type { ValueProcessorByRule } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { getQuotedFieldName, isValidValue, shouldRenderAsNumber } from './utils';\n\n// oxlint-disable-next-line no-explicit-any\nconst escapeStringValueQuotes = (v: any, quoteChar: string, escapeQuotes?: boolean) =>\n  escapeQuotes && typeof v === 'string'\n    ? v.replaceAll(`${quoteChar}`, `${quoteChar}${quoteChar}`)\n    : v;\n\n/**\n * Default value processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessorByRule: ValueProcessorByRule = (\n  { operator, value, valueSource },\n  // istanbul ignore next - defaultRuleProcessorSQL always provides options\n  {\n    escapeQuotes,\n    parseNumbers,\n    preserveValueOrder,\n    quoteFieldNamesWith,\n    quoteValuesWith,\n    concatOperator = '||',\n    fieldIdentifierSeparator,\n    wrapValueWith = ['', ''],\n    translations,\n  } = {}\n) => {\n  const valueIsField = valueSource === 'field';\n  const operatorLowerCase = lc(operator);\n  const quoteChar = quoteValuesWith || \"'\";\n\n  // oxlint-disable no-explicit-any\n  const quoteValue = (v: any) =>\n    `${wrapValueWith[0]}${quoteChar}${v}${quoteChar}${wrapValueWith[1]}`;\n  const escapeValue = (v: any) => escapeStringValueQuotes(v, quoteChar, escapeQuotes);\n  const wrapAndEscape = (v: any) => quoteValue(escapeValue(v));\n  // oxlint-enable no-explicit-any\n  const wrapFieldName = (v: string) =>\n    getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n  const concat = (...values: string[]) =>\n    concatOperator.toUpperCase() === 'CONCAT'\n      ? `CONCAT(${values.join(', ')})`\n      : values.join(` ${concatOperator} `);\n\n  switch (operatorLowerCase) {\n    case 'null':\n    case 'notnull': {\n      return '';\n    }\n\n    case 'in':\n    case 'notin': {\n      const valueAsArray = toArray(value);\n      if (valueAsArray.length > 0) {\n        return `(${valueAsArray\n          .map(v =>\n            valueIsField\n              ? wrapFieldName(v)\n              : shouldRenderAsNumber(v, parseNumbers)\n                ? `${trimIfString(v)}`\n                : `${wrapAndEscape(v)}`\n          )\n          .join(', ')})`;\n      }\n      return '';\n    }\n\n    case 'between':\n    case 'notbetween': {\n      const valueAsArray = toArray(value, { retainEmptyStrings: true });\n      if (\n        valueAsArray.length < 2 ||\n        !isValidValue(valueAsArray[0]) ||\n        !isValidValue(valueAsArray[1])\n      ) {\n        return '';\n      }\n\n      const [first, second] = valueAsArray;\n\n      const firstNum = shouldRenderAsNumber(first, parseNumbers)\n        ? parseNumber(first, { parseNumbers: 'strict' })\n        : Number.NaN;\n      const secondNum = shouldRenderAsNumber(second, parseNumbers)\n        ? parseNumber(second, { parseNumbers: 'strict' })\n        : Number.NaN;\n      const firstValue = Number.isNaN(firstNum) ? (valueIsField ? `${first}` : first) : firstNum;\n      const secondValue = Number.isNaN(secondNum)\n        ? valueIsField\n          ? `${second}`\n          : second\n        : secondNum;\n\n      const valsOneAndTwoOnly = [firstValue, secondValue];\n      if (\n        !preserveValueOrder &&\n        firstValue === firstNum &&\n        secondValue === secondNum &&\n        secondNum < firstNum\n      ) {\n        valsOneAndTwoOnly[0] = secondNum;\n        valsOneAndTwoOnly[1] = firstNum;\n      }\n\n      return (\n        (\n          valueIsField\n            ? valsOneAndTwoOnly.map(v => wrapFieldName(v))\n            : valsOneAndTwoOnly.every(v => shouldRenderAsNumber(v, parseNumbers))\n              ? valsOneAndTwoOnly.map(v => parseNumber(v, { parseNumbers: 'strict' }))\n              : valsOneAndTwoOnly.map(v => wrapAndEscape(v))\n        )\n          // Note: `translations` should not be used for SQL.\n          // This is only here to support the \"natural_language\" format.\n          .join(` ${translations?.and ?? 'and'} `)\n      );\n    }\n\n    case 'contains':\n    case 'doesnotcontain':\n      return valueIsField\n        ? concat(quoteValue('%'), wrapFieldName(value), quoteValue('%'))\n        : quoteValue(`%${escapeValue(value)}%`);\n\n    case 'beginswith':\n    case 'doesnotbeginwith':\n      return valueIsField\n        ? concat(wrapFieldName(value), quoteValue('%'))\n        : quoteValue(`${escapeValue(value)}%`);\n\n    case 'endswith':\n    case 'doesnotendwith':\n      return valueIsField\n        ? concat(quoteValue('%'), wrapFieldName(value))\n        : quoteValue(`%${escapeValue(value)}`);\n  }\n\n  if (typeof value === 'boolean') {\n    return value ? 'TRUE' : 'FALSE';\n  }\n\n  return valueIsField\n    ? wrapFieldName(value)\n    : shouldRenderAsNumber(value, parseNumbers)\n      ? `${trimIfString(value)}`\n      : `${wrapAndEscape(value)}`;\n};\n","import type { Column, Operators, SQL, SQLWrapper } from 'drizzle-orm';\nimport type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorDrizzle } from './defaultRuleGroupProcessorDrizzle';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\n/**\n * Default rule processor used by {@link formatQuery} for the \"drizzle\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorDrizzle: RuleProcessor = (rule, _options): SQL | undefined => {\n  const opts = _options ?? /* istanbul ignore next */ {};\n  // istanbul ignore next\n  const { parseNumbers, preserveValueOrder, context = {} } = opts;\n  const { columns, drizzleOperators, useRawFields } = context as {\n    columns: Record<string, Column>;\n    drizzleOperators: Operators;\n    useRawFields?: boolean;\n  };\n\n  if (!columns || !drizzleOperators) return;\n\n  const {\n    between,\n    eq,\n    gt,\n    gte,\n    inArray,\n    isNotNull,\n    isNull,\n    like,\n    lt,\n    lte,\n    ne,\n    notBetween,\n    notInArray,\n    notLike,\n    sql,\n  } = drizzleOperators;\n\n  const { field, operator, value, valueSource } = rule;\n  // TODO: Improve field validation\n  const column =\n    useRawFields && /[a-z][a-z0-9]*/i.test(field)\n      ? (sql.raw(field) as Exclude<SQLWrapper, SQL.Aliased | Column>)\n      : columns[field];\n  const operatorLC = lc(operator);\n\n  const valueIsField = valueSource === 'field';\n  const asFieldOrValue = (v: string) => (valueIsField ? columns[v] : v);\n\n  if (!column) return;\n\n  const matchEval = processMatchMode(rule);\n\n  if (matchEval === false) {\n    return;\n  } else if (matchEval) {\n    // We only support PostgreSQL nested arrays\n    if (opts.preset !== 'postgresql') return;\n\n    const { mode, threshold } = matchEval;\n\n    // TODO?: Randomize this alias\n    const arrayElementAlias = 'elem_alias';\n\n    const sqlQuery = transformQuery(rule.value as RuleGroupType, {\n      ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n    });\n\n    const nestedArrayFilter = defaultRuleGroupProcessorDrizzle(sqlQuery, {\n      ...(opts as FormatQueryFinalOptions),\n      context: { ...opts.context, useRawFields: true },\n    });\n\n    switch (mode) {\n      case 'all':\n        return sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) = array_length(${column}, 1)`;\n\n      case 'none':\n        return sql`not exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;\n\n      case 'some':\n        return sql`exists (select 1 from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)})`;\n\n      case 'atleast':\n      case 'atmost':\n      case 'exactly': {\n        const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n        return threshold > 0 && threshold < 1\n          ? sql`(select count(*) / array_length(${column}, 1) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`\n          : sql`(select count(*) from unnest(${column}) as ${sql.raw(arrayElementAlias)} where ${nestedArrayFilter({}, drizzleOperators)}) ${sql.raw(`${op} ${threshold}`)}`;\n      }\n    }\n  }\n\n  switch (operatorLC) {\n    case '=':\n      return eq(column, asFieldOrValue(value));\n    case '!=':\n      return ne(column, asFieldOrValue(value));\n    case '>':\n      return gt(column, asFieldOrValue(value));\n    case '<':\n      return lt(column, asFieldOrValue(value));\n    case '>=':\n      return gte(column, asFieldOrValue(value));\n    case '<=':\n      return lte(column, asFieldOrValue(value));\n    case 'beginswith':\n    case 'doesnotbeginwith':\n      return (operatorLC === 'doesnotbeginwith' ? notLike : like)(\n        column as SQL,\n        valueIsField ? sql`${asFieldOrValue(value)} || '%'` : `${value}%`\n      );\n    case 'contains':\n    case 'doesnotcontain':\n      return (operatorLC === 'doesnotcontain' ? notLike : like)(\n        column as SQL,\n        valueIsField ? sql`'%' || ${asFieldOrValue(value)} || '%'` : `%${value}%`\n      );\n    case 'endswith':\n    case 'doesnotendwith':\n      return (operatorLC === 'doesnotendwith' ? notLike : like)(\n        column as SQL,\n        valueIsField ? sql`'%' || ${asFieldOrValue(value)}` : `%${value}`\n      );\n    case 'null':\n      return isNull(column);\n    case 'notnull':\n      return isNotNull(column);\n    case 'in':\n    case 'notin': {\n      const valueAsArray = toArray(value).map(v => asFieldOrValue(v));\n      return operatorLC === 'notin'\n        ? notInArray(column, valueAsArray)\n        : inArray(column, valueAsArray);\n    }\n    case 'between':\n    case 'notbetween': {\n      const valueAsArray = toArray(value);\n      if (\n        valueAsArray.length >= 2 &&\n        isValidValue(valueAsArray[0]) &&\n        isValidValue(valueAsArray[1])\n      ) {\n        let [first, second] = valueAsArray;\n        // For backwards compatibility, default to parsing numbers for between operators\n        // unless parseNumbers is explicitly set to false\n        const shouldParseNumbers = !(parseNumbers === false);\n        if (\n          !valueIsField &&\n          shouldRenderAsNumber(first, shouldParseNumbers) &&\n          shouldRenderAsNumber(second, shouldParseNumbers)\n        ) {\n          const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n          const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n          if (!preserveValueOrder && secondNum < firstNum) {\n            const tempNum = secondNum;\n            second = firstNum;\n            first = tempNum;\n          } else {\n            first = firstNum;\n            second = secondNum;\n          }\n        } else {\n          // istanbul ignore else\n          if (valueIsField) {\n            first = asFieldOrValue(first);\n            second = asFieldOrValue(second);\n          }\n        }\n        return operatorLC === 'notbetween'\n          ? notBetween(column, first, second)\n          : between(column, first, second);\n      }\n      return;\n    }\n    default:\n      return;\n  }\n};\n","import type { Column, Operators, SQL, Table } from 'drizzle-orm';\nimport type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\nimport { defaultRuleProcessorDrizzle } from './defaultRuleProcessorDrizzle';\n\n/**\n * Default rule group processor used by {@link formatQuery} for the \"drizzle\" format. The returned\n * function can be assigned to the `where` property in the Drizzle relational queries API.\n *\n * @example\n * const where = formatQuery(query, 'drizzle');\n * const results = db.query.users.findMany({ where });\n *\n * @returns Function that takes a Drizzle table config and an object of Drizzle operators.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorDrizzle: RuleGroupProcessor<\n  (columns: Record<string, Column> | Table, drizzleOperators: Operators) => SQL | undefined\n> =\n  (ruleGroup, options, _meta) =>\n  (columns: Table | Record<string, Column>, drizzleOperators: Operators) => {\n    const {\n      fields,\n      getParseNumberBoolean,\n      placeholderFieldName,\n      placeholderOperatorName,\n      placeholderValueName,\n      validateRule,\n      validationMap,\n    } = options;\n\n    if (!columns || !drizzleOperators) return;\n\n    const { and, not, or } = drizzleOperators;\n\n    const ruleProcessor = defaultRuleProcessorDrizzle;\n\n    const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): SQL | undefined => {\n      if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n        return;\n      }\n\n      const processedRules = rg.rules\n        .map(rule => {\n          if (isRuleGroup(rule)) {\n            return processRuleGroup(rule);\n          }\n          const [validationResult, fieldValidator] = validateRule(rule);\n          if (\n            !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n            rule.field === placeholderFieldName ||\n            rule.operator === placeholderOperatorName ||\n            /* istanbul ignore next */\n            (placeholderValueName !== undefined && rule.value === placeholderValueName)\n          ) {\n            return;\n          }\n          const fieldData = getOption(fields, rule.field);\n          return ruleProcessor(rule, {\n            ...options,\n            parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n            fieldData,\n            context: { ...options.context, columns, drizzleOperators },\n          });\n        })\n        .filter(Boolean);\n\n      if (processedRules.length === 0) {\n        return;\n      }\n\n      const ruleGroupSQL: SQL | undefined =\n        rg.combinator === 'or' ? or(...processedRules)! : and(...processedRules)!;\n\n      return rg.not ? not(ruleGroupSQL) : ruleGroupSQL;\n    };\n\n    return processRuleGroup(convertFromIC(ruleGroup), true);\n  };\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"elasticsearch\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorElasticSearch: RuleGroupProcessor<Record<string, unknown>> = (\n  ruleGroup,\n  options\n) => {\n  const {\n    fields,\n    getParseNumberBoolean,\n    placeholderFieldName,\n    placeholderOperatorName,\n    placeholderValueName,\n    ruleProcessor,\n    validateRule,\n    validationMap,\n  } = options;\n\n  // oxlint-disable-next-line typescript/no-explicit-any\n  const processRuleGroup = (rg: RuleGroupType): Record<string, any> | false => {\n    if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n      return false;\n    }\n\n    const processedRules = rg.rules\n      .map(rule => {\n        if (isRuleGroup(rule)) {\n          return processRuleGroup(rule);\n        }\n        const [validationResult, fieldValidator] = validateRule(rule);\n        if (\n          !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n          rule.field === placeholderFieldName ||\n          rule.operator === placeholderOperatorName ||\n          /* istanbul ignore next */\n          (placeholderValueName !== undefined && rule.value === placeholderValueName)\n        ) {\n          return false;\n        }\n        const fieldData = getOption(fields, rule.field);\n        return ruleProcessor(rule, {\n          ...options,\n          parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n          fieldData,\n        });\n      })\n      .filter(Boolean);\n\n    if (processedRules.length === 0) {\n      return false;\n    }\n\n    return {\n      bool: rg.not\n        ? {\n            must_not: /^or$/i.test(rg.combinator)\n              ? { bool: { should: processedRules } }\n              : processedRules,\n          }\n        : { [/^or$/i.test(rg.combinator) ? 'should' : 'must']: processedRules },\n    };\n  };\n\n  const processedRuleGroup = processRuleGroup(convertFromIC(ruleGroup));\n  return processedRuleGroup === false ? {} : processedRuleGroup;\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"jsonata\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorJSONata: RuleGroupProcessor<string> = (\n  ruleGroup,\n  options\n) => {\n  const {\n    fields,\n    fallbackExpression,\n    getParseNumberBoolean,\n    placeholderFieldName,\n    placeholderOperatorName,\n    placeholderValueName,\n    ruleProcessor,\n    validateRule,\n    validationMap,\n  } = options;\n\n  const processRuleGroup = (rg: RuleGroupTypeAny, outermost?: boolean): string => {\n    if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n      return outermost ? fallbackExpression : '';\n    }\n\n    const processedRules = [];\n    let precedingCombinator = '';\n    let firstRule = true;\n\n    for (const rule of rg.rules) {\n      // Independent combinators\n      if (typeof rule === 'string') {\n        precedingCombinator = rule;\n        continue;\n      }\n\n      // Groups\n      if (isRuleGroup(rule)) {\n        const processedGroup = processRuleGroup(rule);\n        if (processedGroup) {\n          if (!firstRule && precedingCombinator) {\n            processedRules.push(precedingCombinator);\n            precedingCombinator = '';\n          }\n          firstRule = false;\n          processedRules.push(processedGroup);\n        }\n        continue;\n      }\n\n      // Rules\n      const [validationResult, fieldValidator] = validateRule(rule);\n      if (\n        !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n        rule.field === placeholderFieldName ||\n        rule.operator === placeholderOperatorName ||\n        /* istanbul ignore next */\n        (placeholderValueName !== undefined && rule.value === placeholderValueName)\n      ) {\n        continue;\n      }\n\n      const fieldData = getOption(fields, rule.field);\n      const processedRule = ruleProcessor(rule, {\n        ...options,\n        parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n        escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n        fieldData,\n      });\n\n      if (processedRule) {\n        if (!firstRule && precedingCombinator) {\n          processedRules.push(precedingCombinator);\n          precedingCombinator = '';\n        }\n        firstRule = false;\n        processedRules.push(processedRule);\n      }\n    }\n\n    const expression = processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ');\n\n    const [prefix, suffix] = rg.not || !outermost ? [`${rg.not ? '$not' : ''}(`, ')'] : ['', ''];\n\n    return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n  };\n\n  return processRuleGroup(ruleGroup, true);\n};\n","import type {\n  DefaultCombinatorName,\n  RQBJsonLogic,\n  RuleGroupProcessor,\n  RuleGroupType,\n} from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"jsonlogic\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorJsonLogic: RuleGroupProcessor<RQBJsonLogic> = (\n  ruleGroup,\n  options\n) => {\n  const {\n    fields,\n    getParseNumberBoolean,\n    placeholderFieldName,\n    placeholderOperatorName,\n    placeholderValueName,\n    ruleProcessor,\n    validateRule,\n    validationMap,\n  } = options;\n\n  const query = convertFromIC(ruleGroup);\n\n  const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): RQBJsonLogic => {\n    if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n      return false;\n    }\n\n    const processedRules = rg.rules\n      .map(rule => {\n        if (isRuleGroup(rule)) {\n          return processRuleGroup(rule);\n        }\n        const [validationResult, fieldValidator] = validateRule(rule);\n        if (\n          !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n          rule.field === placeholderFieldName ||\n          rule.operator === placeholderOperatorName ||\n          /* istanbul ignore next */\n          (placeholderValueName !== undefined && rule.value === placeholderValueName)\n        ) {\n          return false;\n        }\n        const fieldData = getOption(fields, rule.field);\n        return ruleProcessor(rule, {\n          ...options,\n          parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n          fieldData,\n        });\n      })\n      .filter(Boolean);\n\n    if (processedRules.length === 0) {\n      return false;\n    }\n\n    const jsonRuleGroup: RQBJsonLogic = { [rg.combinator]: processedRules } as {\n      [k in DefaultCombinatorName]: [RQBJsonLogic, RQBJsonLogic, ...RQBJsonLogic[]];\n    };\n\n    return rg.not ? { '!': jsonRuleGroup } : jsonRuleGroup;\n  };\n\n  return processRuleGroup(query, true);\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"ldap\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorLDAP: RuleGroupProcessor<string> = (ruleGroup, options) => {\n  const {\n    fields,\n    fallbackExpression,\n    getParseNumberBoolean,\n    placeholderFieldName,\n    placeholderOperatorName,\n    placeholderValueName,\n    ruleProcessor,\n    validateRule,\n    validationMap,\n  } = options;\n\n  const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n    if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n      return outermost ? fallbackExpression : '';\n    }\n\n    const rules: string[] = rg.rules\n      .map(rule => {\n        if (isRuleGroup(rule)) {\n          return processRuleGroup(rule);\n        }\n        const [validationResult, fieldValidator] = validateRule(rule);\n        if (\n          !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n          rule.field === placeholderFieldName ||\n          rule.operator === placeholderOperatorName ||\n          /* istanbul ignore next */\n          (placeholderValueName !== undefined && rule.value === placeholderValueName)\n        ) {\n          return '';\n        }\n        const fieldData = getOption(fields, rule.field);\n        return ruleProcessor(rule, {\n          ...options,\n          parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n          escapeQuotes: (rule.valueSource ?? 'value') === 'value',\n          fieldData,\n        });\n      })\n      .filter(Boolean);\n\n    const expression = rules.join('');\n\n    const [notPrefix, notSuffix] = rg.not ? ['(!', ')'] : ['', ''];\n    const [prefix, suffix] =\n      rules.length > 1\n        ? [`${notPrefix}(${rg.combinator === 'or' ? '|' : '&'}`, `)${notSuffix}`]\n        : [notPrefix, notSuffix];\n\n    return expression ? `${prefix}${expression}${suffix}` : fallbackExpression;\n  };\n\n  return processRuleGroup(convertFromIC(ruleGroup), true);\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\nconst isBracketed = (str: string) => str.startsWith('{') && str.endsWith('}');\n\n/**\n * Rule group processor used by {@link formatQuery} for \"mongodb\" format.\n *\n * Note that the \"mongodb\" format is deprecated in favor of the \"mongodb_query\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorMongoDB: RuleGroupProcessor<string> = (\n  ruleGroup,\n  options,\n  meta\n) => {\n  const {\n    fields,\n    fallbackExpression,\n    getParseNumberBoolean,\n    placeholderFieldName,\n    placeholderOperatorName,\n    placeholderValueName,\n    ruleProcessor,\n    validateRule,\n    validationMap,\n  } = options;\n\n  const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n    if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n      return outermost ? fallbackExpression : '';\n    }\n\n    const combinator = `\"$${lc(rg.combinator)}\"`;\n    let hasChildRules = false;\n\n    const expressions: string[] = rg.rules\n      .map(rule => {\n        if (isRuleGroup(rule)) {\n          const processedRuleGroup = processRuleGroup(rule);\n          if (processedRuleGroup) {\n            hasChildRules = true;\n            // Don't wrap in curly braces if the result already is.\n            return isBracketed(processedRuleGroup) ? processedRuleGroup : `{${processedRuleGroup}}`;\n          }\n          return '';\n        }\n        const [validationResult, fieldValidator] = validateRule(rule);\n        if (\n          !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n          rule.field === placeholderFieldName ||\n          rule.operator === placeholderOperatorName ||\n          /* istanbul ignore next */\n          (placeholderValueName !== undefined && rule.value === placeholderValueName)\n        ) {\n          return '';\n        }\n        const fieldData = getOption(fields, rule.field);\n        return ruleProcessor(\n          rule,\n          {\n            ...options,\n            parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n            fieldData,\n          },\n          meta\n        );\n      })\n      .filter(Boolean);\n\n    return expressions.length > 0\n      ? expressions.length === 1 && !hasChildRules\n        ? expressions[0]\n        : `${combinator}:[${expressions.join(',')}]`\n      : fallbackExpression;\n  };\n\n  const processedQuery = processRuleGroup(convertFromIC(ruleGroup), true);\n  return isBracketed(processedQuery) ? processedQuery : `{${processedQuery}}`;\n};\n","import type { NLTranslationKey, RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup, isRuleGroupType, isRuleGroupTypeIC } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\nimport { getNLTranslataion } from './utils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorNL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n  const {\n    fields,\n    fallbackExpression,\n    getParseNumberBoolean,\n    placeholderFieldName,\n    placeholderOperatorName,\n    placeholderValueName,\n    ruleProcessor,\n    translations,\n    validateRule,\n    validationMap,\n  } = options;\n\n  const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n    if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n      // TODO: test for the last case and remove \"ignore\" comment\n      return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n    }\n\n    const rg2 =\n      isRuleGroupTypeIC(rg) && rg.rules.some(r => typeof r === 'string' && lc(r) === 'xor')\n        ? convertFromIC(rg)\n        : rg;\n\n    const processedRules = [];\n    let precedingCombinator = '';\n    let firstRule = true;\n\n    for (const rule of rg2.rules) {\n      // Independent combinators\n      if (typeof rule === 'string') {\n        precedingCombinator = `, ${translations[rule as NLTranslationKey] ?? rule} `;\n        continue;\n      }\n\n      // Groups\n      if (isRuleGroup(rule)) {\n        const processedGroup = processRuleGroup(\n          rule,\n          rg2.rules.length === 1 &&\n            !(rg2.not || /^xor$/i.test(rg2.combinator ?? /* istanbul ignore next */ ''))\n        );\n        // istanbul ignore else\n        if (processedGroup) {\n          if (!firstRule && precedingCombinator) {\n            processedRules.push(precedingCombinator);\n            precedingCombinator = '';\n          }\n          firstRule = false;\n          processedRules.push(processedGroup);\n        }\n        continue;\n      }\n\n      // Basic rule validation\n      const [validationResult, fieldValidator] = validateRule(rule);\n      if (\n        !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n        rule.field === placeholderFieldName ||\n        rule.operator === placeholderOperatorName ||\n        /* istanbul ignore next */\n        (placeholderValueName !== undefined && rule.value === placeholderValueName)\n      ) {\n        continue;\n      }\n\n      const escapeQuotes = (rule.valueSource ?? 'value') === 'value';\n\n      const fieldData = getOption(fields, rule.field);\n\n      const processedRule = ruleProcessor(rule, {\n        ...options,\n        parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n        escapeQuotes,\n        fieldData,\n      });\n\n      if (processedRule) {\n        if (!firstRule && precedingCombinator) {\n          processedRules.push(precedingCombinator);\n          precedingCombinator = '';\n        }\n        firstRule = false;\n        processedRules.push(processedRule);\n      }\n    }\n\n    if (processedRules.length === 0) {\n      return fallbackExpression;\n    }\n\n    const isXOR = lc(rg2.combinator ?? '') === 'xor';\n    const combinator = isXOR ? rg2.combinator!.slice(1) : rg2.combinator;\n    const mustWrap = rg2.not || !outermostOrLonelyInGroup || (isXOR && processedRules.length > 1);\n\n    const [prefixTL, suffixTL] = (['groupPrefix', 'groupSuffix'] as const).map(key =>\n      rg2.not\n        ? isXOR\n          ? getNLTranslataion(key, translations, ['not', 'xor'])\n          : getNLTranslataion(key, translations, ['not'])\n        : isXOR\n          ? getNLTranslataion(key, translations, ['xor'])\n          : getNLTranslataion(key, translations)\n    );\n\n    const prefix = mustWrap ? `${prefixTL} (`.trim() : '';\n    const suffix = mustWrap ? `) ${suffixTL}`.trim() : '';\n\n    return `${prefix}${processedRules.join(\n      isRuleGroupType(rg2) ? `, ${translations[combinator as NLTranslationKey] ?? combinator} ` : ''\n    )}${suffix}`;\n  };\n\n  return processRuleGroup(ruleGroup, true);\n};\n","import type {\n  ParameterizedNamedSQL,\n  ParameterizedSQL,\n  RuleGroupProcessor,\n  RuleGroupTypeAny,\n  RuleType,\n} from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { isPojo } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Rule group processor used by {@link formatQuery} for \"parameterized\" and\n * \"parameterized_named\" formats.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorParameterized: RuleGroupProcessor<\n  ParameterizedSQL | ParameterizedNamedSQL\n> = (ruleGroup, options) => {\n  const {\n    format,\n    fields,\n    fallbackExpression,\n    getParseNumberBoolean,\n    placeholderFieldName,\n    placeholderOperatorName,\n    placeholderValueName,\n    ruleProcessor,\n    validateRule,\n    validationMap,\n  } = options;\n\n  const parameterized = format === 'parameterized';\n  // oxlint-disable-next-line typescript/no-explicit-any\n  const params: any[] = [];\n  // oxlint-disable-next-line typescript/no-explicit-any\n  const paramsNamed: Record<string, any> = {};\n  const fieldParams: Map<string, Set<string>> = new Map();\n\n  const getNextNamedParam = (field: string) => {\n    if (!fieldParams.has(field)) {\n      fieldParams.set(field, new Set());\n    }\n    const nextNamedParam = `${field}_${fieldParams.get(field)!.size + 1}`;\n    fieldParams.get(field)!.add(nextNamedParam);\n    return nextNamedParam;\n  };\n\n  const processRule = (rule: RuleType) => {\n    const [validationResult, fieldValidator] = validateRule(rule);\n    if (\n      !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n      rule.field === placeholderFieldName ||\n      rule.operator === placeholderOperatorName ||\n      /* istanbul ignore next */\n      (placeholderValueName !== undefined && rule.value === placeholderValueName)\n    ) {\n      return '';\n    }\n\n    const fieldData = getOption(fields, rule.field);\n\n    const fieldParamNames = Object.fromEntries(\n      ([...fieldParams.entries()] as [string, Set<string>][]).map(([f, s]) => [f, [...s]])\n    );\n\n    const processedRule = ruleProcessor(\n      rule,\n      {\n        ...options,\n        parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n        getNextNamedParam,\n        fieldParamNames,\n        fieldData,\n      },\n      { processedParams: params }\n    );\n\n    if (!isPojo(processedRule)) {\n      return '';\n    }\n\n    const { sql, params: customParams } = processedRule;\n\n    if (typeof sql !== 'string' || !sql) {\n      return '';\n    }\n\n    // istanbul ignore else\n    if (format === 'parameterized' && Array.isArray(customParams)) {\n      params.push(...customParams);\n    } else if (format === 'parameterized_named' && isPojo(customParams)) {\n      Object.assign(paramsNamed, customParams);\n      // `getNextNamedParam` already adds new params to the list, but a custom\n      // rule processor might not call it so we need to make sure we add\n      // any new params here.\n      for (const p of Object.keys(customParams)) fieldParams.get(rule.field)?.add(p);\n    }\n\n    return sql;\n  };\n\n  const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n    if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n      // TODO: test for the last case and remove \"ignore\" comment\n      return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n    }\n\n    const processedRules = [];\n    let precedingCombinator = '';\n    let firstRule = true;\n\n    for (const rule of rg.rules) {\n      // Independent combinators\n      if (typeof rule === 'string') {\n        precedingCombinator = rule;\n        continue;\n      }\n\n      // Groups\n      if (isRuleGroup(rule)) {\n        const processedGroup = processRuleGroup(rule, rg.rules.length === 1);\n        // istanbul ignore else\n        if (processedGroup) {\n          if (!firstRule && precedingCombinator) {\n            processedRules.push(precedingCombinator);\n            precedingCombinator = '';\n          }\n          firstRule = false;\n          processedRules.push(processedGroup);\n        }\n        continue;\n      }\n\n      // Rules\n      const processedRule = processRule(rule);\n      if (processedRule) {\n        if (!firstRule && precedingCombinator) {\n          processedRules.push(precedingCombinator);\n          precedingCombinator = '';\n        }\n        firstRule = false;\n        processedRules.push(processedRule);\n      }\n    }\n\n    if (processedRules.length === 0) {\n      return fallbackExpression;\n    }\n\n    return `${rg.not ? 'NOT ' : ''}(${processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ')})`;\n  };\n\n  if (parameterized) {\n    return { sql: processRuleGroup(ruleGroup, true), params };\n  }\n  return { sql: processRuleGroup(ruleGroup, true), params: paramsNamed };\n};\n","import type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default fallback object used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\n// TODO?: make this configurable\nexport const prismaFallback = {} as const;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorPrisma: RuleGroupProcessor<\n  Record<string, unknown> | undefined\n> = (ruleGroup, options) => {\n  const {\n    fields,\n    getParseNumberBoolean,\n    placeholderFieldName,\n    placeholderOperatorName,\n    placeholderValueName,\n    ruleProcessor,\n    validateRule,\n    validationMap,\n  } = options;\n\n  const processRuleGroup = (rg: RuleGroupType, outermost?: boolean) => {\n    if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n      return outermost ? prismaFallback : undefined;\n    }\n\n    const combinator = rg.combinator.toUpperCase();\n    let hasChildRules = false;\n\n    const expressions: Record<string, unknown>[] = rg.rules\n      .map(rule => {\n        if (isRuleGroup(rule)) {\n          const processedRuleGroup = processRuleGroup(rule);\n          if (processedRuleGroup) {\n            hasChildRules = true;\n            return processedRuleGroup;\n          }\n          return;\n        }\n        const [validationResult, fieldValidator] = validateRule(rule);\n        if (\n          !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n          rule.field === placeholderFieldName ||\n          rule.operator === placeholderOperatorName ||\n          /* istanbul ignore next */\n          (placeholderValueName !== undefined && rule.value === placeholderValueName)\n        ) {\n          return;\n        }\n        const fieldData = getOption(fields, rule.field);\n        return ruleProcessor(rule, {\n          ...options,\n          parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n          fieldData,\n        });\n      })\n      .filter(Boolean);\n\n    return expressions.length > 0\n      ? expressions.length === 1 && !hasChildRules\n        ? expressions[0]\n        : { [combinator]: expressions }\n      : prismaFallback;\n  };\n\n  const result = processRuleGroup(convertFromIC(ruleGroup), true);\n\n  return ruleGroup.not ? { NOT: result } : result;\n};\n","import type { Op as _OpTypes, WhereOptions } from 'sequelize';\nimport type { RuleGroupProcessor, RuleGroupType } from '../../types';\nimport { convertFromIC } from '../convertQuery';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\n\ntype OpTypes = typeof _OpTypes;\n\n/**\n * Rule group processor used by {@link formatQuery} for \"sequelize\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSequelize: RuleGroupProcessor<WhereOptions | undefined> = (\n  ruleGroup,\n  options\n) => {\n  // istanbul ignore next\n  const {\n    fields,\n    getParseNumberBoolean,\n    placeholderFieldName,\n    placeholderOperatorName,\n    placeholderValueName,\n    ruleProcessor,\n    validateRule,\n    validationMap,\n    context = {},\n  } = options;\n\n  const { sequelizeOperators: Op } = context as {\n    sequelizeOperators: OpTypes;\n  };\n\n  if (!Op) return;\n\n  const processRuleGroup = (rg: RuleGroupType, _outermost?: boolean): WhereOptions | undefined => {\n    if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n      return;\n    }\n\n    const combinator = rg.combinator.toUpperCase();\n    let hasChildRules = false;\n\n    const expressions: Record<string, unknown>[] = rg.rules\n      .map(rule => {\n        if (isRuleGroup(rule)) {\n          const processedRuleGroup = processRuleGroup(rule);\n          if (processedRuleGroup) {\n            hasChildRules = true;\n            return processedRuleGroup;\n          }\n          return;\n        }\n        const [validationResult, fieldValidator] = validateRule(rule);\n        if (\n          !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n          rule.field === placeholderFieldName ||\n          rule.operator === placeholderOperatorName ||\n          /* istanbul ignore next */\n          (placeholderValueName !== undefined && rule.value === placeholderValueName)\n        ) {\n          return;\n        }\n        const fieldData = getOption(fields, rule.field);\n        return ruleProcessor(rule, {\n          ...options,\n          parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n          fieldData,\n        });\n      })\n      .filter(Boolean);\n\n    if (expressions.length === 0) return;\n\n    const result =\n      expressions.length === 1 && !hasChildRules\n        ? expressions[0]\n        : { [lc(combinator) === 'or' ? Op.or : Op.and]: expressions };\n\n    return rg.not ? { [Op.not]: result } : result;\n  };\n\n  return processRuleGroup(convertFromIC(ruleGroup), true);\n};\n","import type { RuleGroupProcessor, RuleGroupTypeAny } from '../../types';\nimport { isRuleGroup, isRuleGroupType } from '../isRuleGroup';\nimport { isRuleOrGroupValid } from '../isRuleOrGroupValid';\nimport { getOption } from '../optGroupUtils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultRuleGroupProcessorSQL: RuleGroupProcessor<string> = (ruleGroup, options) => {\n  const {\n    fields,\n    fallbackExpression,\n    getParseNumberBoolean,\n    placeholderFieldName,\n    placeholderOperatorName,\n    placeholderValueName,\n    ruleProcessor,\n    validateRule,\n    validationMap,\n  } = options;\n\n  const processRuleGroup = (rg: RuleGroupTypeAny, outermostOrLonelyInGroup?: boolean): string => {\n    if (!isRuleOrGroupValid(rg, validationMap[rg.id ?? /* istanbul ignore next */ ''])) {\n      // TODO: test for the last case and remove \"ignore\" comment\n      return outermostOrLonelyInGroup ? fallbackExpression : /* istanbul ignore next */ '';\n    }\n\n    const processedRules = [];\n    let precedingCombinator = '';\n    let firstRule = true;\n\n    for (const rule of rg.rules) {\n      // Independent combinators\n      if (typeof rule === 'string') {\n        precedingCombinator = rule;\n        continue;\n      }\n\n      // Groups\n      if (isRuleGroup(rule)) {\n        const processedGroup = processRuleGroup(rule, rg.rules.length === 1);\n        // istanbul ignore else\n        if (processedGroup) {\n          if (!firstRule && precedingCombinator) {\n            processedRules.push(precedingCombinator);\n            precedingCombinator = '';\n          }\n          firstRule = false;\n          processedRules.push(processedGroup);\n        }\n        continue;\n      }\n\n      // Basic rule validation\n      const [validationResult, fieldValidator] = validateRule(rule);\n      if (\n        !isRuleOrGroupValid(rule, validationResult, fieldValidator) ||\n        rule.field === placeholderFieldName ||\n        rule.operator === placeholderOperatorName ||\n        (placeholderValueName !== undefined && rule.value === placeholderValueName)\n      ) {\n        continue;\n      }\n\n      const escapeQuotes = (rule.valueSource ?? 'value') === 'value';\n\n      const fieldData = getOption(fields, rule.field);\n\n      const processedRule = ruleProcessor(rule, {\n        ...options,\n        parseNumbers: getParseNumberBoolean(fieldData?.inputType),\n        escapeQuotes,\n        fieldData,\n      });\n\n      if (processedRule) {\n        if (!firstRule && precedingCombinator) {\n          processedRules.push(precedingCombinator);\n          precedingCombinator = '';\n        }\n        firstRule = false;\n        processedRules.push(processedRule);\n      }\n    }\n\n    if (processedRules.length === 0) {\n      return fallbackExpression;\n    }\n\n    return `${rg.not ? 'NOT ' : ''}(${processedRules.join(isRuleGroupType(rg) ? ` ${rg.combinator} ` : ' ')})`;\n  };\n\n  return processRuleGroup(ruleGroup, true);\n};\n","import type { DefaultOperatorName, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\ntype RangeOperator = 'gt' | 'gte' | 'lt' | 'lte';\ntype RangeRule = (\n  | { gt: string | number }\n  | { gte: string | number }\n  | { lt: string | number }\n  | { lte: string | number }\n) & { [k in RangeOperator]?: string | number };\ntype ElasticSearchRule =\n  | { range: Record<string, RangeRule> }\n  // oxlint-disable-next-line typescript/no-explicit-any\n  | { term: Record<string, any> }\n  | { exists: { field: string } }\n  | { regexp: { [k: string]: { value: string } } };\ntype ElasticSearchQuery = {\n  bool:\n    | { filter: { script: { script: string } } }\n    | { must: ElasticSearchRule | ElasticSearchQuery | (ElasticSearchRule | ElasticSearchQuery)[] }\n    | {\n        must_not:\n          | ElasticSearchRule\n          | ElasticSearchQuery\n          | (ElasticSearchRule | ElasticSearchQuery)[];\n      }\n    | {\n        should: ElasticSearchRule | ElasticSearchQuery | (ElasticSearchRule | ElasticSearchQuery)[];\n      };\n};\n\nconst rangeOperatorMap = { '<': 'lt', '<=': 'lte', '>': 'gt', '>=': 'gte' } satisfies Record<\n  '<' | '<=' | '>' | '>=',\n  RangeOperator\n>;\n\nconst negateIfNotOp = (\n  op: string,\n  elasticSearchRule: ElasticSearchRule\n): ElasticSearchQuery | ElasticSearchRule =>\n  op.startsWith('not') || op.startsWith('doesnot')\n    ? { bool: { must_not: elasticSearchRule } }\n    : elasticSearchRule;\n\nconst escapeSQ = (s: string) => s?.replace(/('|\\\\)/g, `\\\\$1`);\n\nconst textFunctionMap: Partial<Record<Lowercase<DefaultOperatorName>, string>> = {\n  beginswith: 'startsWith',\n  doesnotbeginwith: 'startsWith',\n  doesnotcontain: 'contains',\n  doesnotendwith: 'endsWith',\n  endswith: 'endsWith',\n};\nconst getTextScript = (f: string, o: Lowercase<DefaultOperatorName>, v: string) => {\n  const script = `doc['${f}'].value.${textFunctionMap[o] ?? o}(doc['${v}'].value)`;\n  return o.startsWith('d') ? `!${script}` : script;\n};\n\n// oxlint-disable-next-line typescript/no-explicit-any\nconst valueRenderer = (v: any, parseNumbers?: boolean) =>\n  typeof v === 'boolean'\n    ? v\n    : shouldRenderAsNumber(v, parseNumbers)\n      ? parseNumber(v, { parseNumbers })\n      : v;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"elasticsearch\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorElasticSearch: RuleProcessor = (\n  rule,\n  options = {}\n): ElasticSearchQuery | ElasticSearchRule | false => {\n  const { field, operator, value, valueSource } = rule;\n  const { parseNumbers, preserveValueOrder } = options;\n  const operatorLC = lc(operator) as Lowercase<DefaultOperatorName>;\n\n  // Match modes are not supported in this format\n  if (processMatchMode(rule)) return false;\n\n  if (valueSource === 'field') {\n    // Bail out if not all values are strings\n    if (toArray(value).some(v => typeof v !== 'string')) return false;\n\n    const fieldForScript = escapeSQ(field);\n\n    switch (operatorLC) {\n      case '=':\n      case '!=':\n      case '>':\n      case '>=':\n      case '<':\n      case '<=': {\n        const operatorForScript = operatorLC === '=' ? '==' : operatorLC;\n        const valueForScript = escapeSQ(value);\n        return valueForScript\n          ? {\n              bool: {\n                filter: {\n                  script: {\n                    script: `doc['${fieldForScript}'].value ${operatorForScript} doc['${valueForScript}'].value`,\n                  },\n                },\n              },\n            }\n          : false;\n      }\n\n      case 'in':\n      case 'notin': {\n        const valueAsArray = toArray(value);\n        if (valueAsArray.length > 0) {\n          const arr = valueAsArray.map(v => ({\n            bool: {\n              filter: { script: { script: `doc['${fieldForScript}'].value == doc['${v}'].value` } },\n            },\n          }));\n          return { bool: operatorLC === 'in' ? { should: arr } : { must_not: arr } };\n        }\n        return false;\n      }\n\n      case 'between':\n      case 'notbetween': {\n        const valueAsArray = toArray(value);\n        if (valueAsArray.length >= 2 && valueAsArray[0] && valueAsArray[1]) {\n          const script = `doc['${fieldForScript}'].value >= doc['${valueAsArray[0]}'].value && doc['${fieldForScript}'].value <= doc['${valueAsArray[1]}'].value`;\n          return {\n            bool: {\n              filter: { script: { script: operatorLC === 'notbetween' ? `!(${script})` : script } },\n            },\n          };\n        }\n        return false;\n      }\n\n      case 'contains':\n      case 'doesnotcontain':\n      case 'beginswith':\n      case 'doesnotbeginwith':\n      case 'endswith':\n      case 'doesnotendwith': {\n        const valueForScript = escapeSQ(value);\n        if (!valueForScript) return false;\n        const script = getTextScript(fieldForScript, operatorLC, valueForScript);\n        return {\n          bool: {\n            filter: {\n              script: {\n                script,\n              },\n            },\n          },\n        };\n      }\n    }\n  }\n\n  switch (operatorLC) {\n    case '<':\n    case '<=':\n    case '>':\n    case '>=':\n      return {\n        range: {\n          [field]: {\n            [rangeOperatorMap[operatorLC]]: valueRenderer(value, parseNumbers),\n          } as RangeRule,\n        },\n      };\n\n    case '=':\n      return { term: { [field]: valueRenderer(value, parseNumbers) } };\n\n    case '!=':\n      return { bool: { must_not: { term: { [field]: valueRenderer(value, parseNumbers) } } } };\n\n    case 'null':\n      return { bool: { must_not: { exists: { field } } } };\n\n    case 'notnull':\n      return { exists: { field } };\n\n    case 'in':\n    case 'notin': {\n      const valueAsArray = toArray(value).map(v => valueRenderer(v, parseNumbers));\n      if (valueAsArray.length > 0) {\n        const arr = valueAsArray.map(v => ({ term: { [field]: valueRenderer(v, parseNumbers) } }));\n        return { bool: operatorLC === 'in' ? { should: arr } : { must_not: arr } };\n      }\n      return false;\n    }\n\n    case 'between':\n    case 'notbetween': {\n      const valueAsArray = toArray(value);\n      if (\n        valueAsArray.length >= 2 &&\n        isValidValue(valueAsArray[0]) &&\n        isValidValue(valueAsArray[1])\n      ) {\n        let [first, second] = valueAsArray;\n        // For backwards compatibility, default to parsing numbers for between operators\n        // unless parseNumbers is explicitly set to false\n        const shouldParseNumbers = !(parseNumbers === false);\n        if (\n          shouldRenderAsNumber(first, shouldParseNumbers) &&\n          shouldRenderAsNumber(second, shouldParseNumbers)\n        ) {\n          const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n          const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n          if (!preserveValueOrder && secondNum < firstNum) {\n            const tempNum = secondNum;\n            second = firstNum;\n            first = tempNum;\n          } else {\n            first = firstNum;\n            second = secondNum;\n          }\n        }\n        return negateIfNotOp(operatorLC, { range: { [field]: { gte: first, lte: second } } });\n      }\n      return false;\n    }\n\n    case 'contains':\n    case 'doesnotcontain':\n      return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `.*${value}.*` } } });\n\n    case 'beginswith':\n    case 'doesnotbeginwith':\n      return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `${value}.*` } } });\n\n    case 'endswith':\n    case 'doesnotendwith':\n      return negateIfNotOp(operatorLC, { regexp: { [field]: { value: `.*${value}` } } });\n  }\n  return false;\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorJSONata } from './defaultRuleGroupProcessorJSONata';\nimport { getQuotedFieldName, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst shouldNegate = (op: string) => op.startsWith('not') || op.startsWith('doesnot');\n\n// oxlint-disable-next-line no-explicit-any\nconst quote = (v: any, escapeQuotes?: boolean) =>\n  `\"${typeof v !== 'string' || !escapeQuotes ? `${v}` : v.replaceAll(`\"`, `\\\\\"`)}\"`;\n\nconst negate = (clause: string, negate: boolean) => (negate ? `$not(${clause})` : clause);\n\nconst escapeStringRegex = (s: string) =>\n  `${s}`.replaceAll(/[/$()*+.?[\\\\\\]^{|}]/g, String.raw`\\$&`).replaceAll('-', String.raw`\\x2d`);\n\n/**\n * Default rule processor used by {@link formatQuery} for \"jsonata\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorJSONata: RuleProcessor = (\n  rule,\n  // istanbul ignore next\n  options = {}\n) => {\n  const { field, operator, value, valueSource } = rule;\n  const {\n    escapeQuotes,\n    parseNumbers,\n    preserveValueOrder,\n    quoteFieldNamesWith = ['', ''] as [string, string],\n    fieldIdentifierSeparator = '',\n  } = options;\n\n  const valueIsField = valueSource === 'field';\n  const useBareValue =\n    typeof value === 'number' ||\n    typeof value === 'boolean' ||\n    typeof value === 'bigint' ||\n    shouldRenderAsNumber(value, parseNumbers);\n\n  const qfn = (f: string) =>\n    getQuotedFieldName(f, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n  const matchEval = processMatchMode(rule);\n\n  if (matchEval === false) {\n    return;\n  } else if (matchEval) {\n    const { mode, threshold } = matchEval;\n\n    const totalCount = `$count(${qfn(field)})`;\n    const filteredCount = `$count($filter(${qfn(field)}, function($v) {${defaultRuleGroupProcessorJSONata(\n      transformQuery(value as RuleGroupType, {\n        ruleProcessor: r => ({ ...r, field: r.field ? `$v.${r.field}` : '$v' }),\n      }),\n      options as FormatQueryFinalOptions\n    )}}))`;\n\n    switch (mode) {\n      case 'all':\n        return `${filteredCount} = ${totalCount}`;\n\n      case 'none':\n        return `${filteredCount} = 0`;\n\n      case 'some':\n        return `${filteredCount} > 0`;\n\n      case 'atleast':\n      case 'atmost':\n      case 'exactly': {\n        const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n        if (threshold > 0 && threshold < 1) {\n          return `${filteredCount} ${op} (${totalCount} * ${threshold})`;\n        }\n        return `${filteredCount} ${op} ${threshold}`;\n      }\n    }\n  }\n\n  const operatorLC = lc(operator);\n  switch (operatorLC) {\n    case '<':\n    case '<=':\n    case '=':\n    case '!=':\n    case '>':\n    case '>=':\n      return `${qfn(field)} ${operatorLC} ${\n        valueIsField\n          ? qfn(trimIfString(value))\n          : useBareValue\n            ? trimIfString(value)\n            : quote(value, escapeQuotes)\n      }`;\n\n    case 'contains':\n    case 'doesnotcontain':\n      return negate(\n        `$contains(${qfn(field)}, ${valueIsField ? qfn(trimIfString(value)) : quote(value, escapeQuotes)})`,\n        shouldNegate(operatorLC)\n      );\n\n    case 'beginswith':\n    case 'doesnotbeginwith':\n      return negate(\n        valueIsField\n          ? `$substring(${qfn(field)}, 0, $length(${qfn(trimIfString(value))})) = ${qfn(trimIfString(value))}`\n          : `$contains(${qfn(field)}, /^${escapeStringRegex(value)}/)`,\n        shouldNegate(operatorLC)\n      );\n\n    case 'endswith':\n    case 'doesnotendwith':\n      return negate(\n        valueIsField\n          ? `$substring(${qfn(field)}, $length(${qfn(field)}) - $length(${qfn(trimIfString(value))})) = ${qfn(trimIfString(value))}`\n          : `$contains(${qfn(field)}, /${escapeStringRegex(value)}$/)`,\n        shouldNegate(operatorLC)\n      );\n\n    case 'null':\n      return `${qfn(field)} = null`;\n\n    case 'notnull':\n      return `${qfn(field)} != null`;\n\n    case 'in':\n    case 'notin': {\n      const valueAsArray = toArray(value);\n      return negate(\n        `${qfn(field)} in [${valueAsArray\n          .map(val =>\n            valueIsField\n              ? `${qfn(trimIfString(val))}`\n              : shouldRenderAsNumber(val, parseNumbers)\n                ? `${trimIfString(val)}`\n                : quote(val, escapeQuotes)\n          )\n          .join(', ')}]`,\n        shouldNegate(operatorLC)\n      );\n    }\n\n    case 'between':\n    case 'notbetween': {\n      const valueAsArray = toArray(value);\n      if (\n        valueAsArray.length < 2 ||\n        nullOrUndefinedOrEmpty(valueAsArray[0]) ||\n        nullOrUndefinedOrEmpty(valueAsArray[1])\n      ) {\n        return '';\n      }\n\n      const [first, second] = valueAsArray;\n      // For backwards compatibility, default to parsing numbers for between operators\n      // unless parseNumbers is explicitly set to false\n      const shouldParseNumbers = !(parseNumbers === false);\n      const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n        ? parseNumber(first, { parseNumbers: shouldParseNumbers })\n        : Number.NaN;\n      const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n        ? parseNumber(second, { parseNumbers: shouldParseNumbers })\n        : Number.NaN;\n      let firstValue = Number.isNaN(firstNum) ? (valueIsField ? `${first}` : first) : firstNum;\n      let secondValue = Number.isNaN(secondNum) ? (valueIsField ? `${second}` : second) : secondNum;\n\n      if (\n        !preserveValueOrder &&\n        firstValue === firstNum &&\n        secondValue === secondNum &&\n        secondNum < firstNum\n      ) {\n        const tempNum = secondNum;\n        secondValue = firstNum;\n        firstValue = tempNum;\n      }\n\n      const renderAsNumbers =\n        shouldRenderAsNumber(first, parseNumbers) && shouldRenderAsNumber(second, parseNumbers);\n      const getValueString = (raw: string, val: string | number) =>\n        valueIsField ? qfn(raw) : renderAsNumbers ? val : quote(val, escapeQuotes);\n\n      const expression = `${qfn(field)} >= ${getValueString(first, firstValue)} and ${qfn(field)} <= ${getValueString(second, secondValue)}`;\n\n      return operatorLC === 'between' ? `(${expression})` : negate(expression, true);\n    }\n  }\n\n  return '';\n};\n","import type {\n  FormatQueryFinalOptions,\n  JsonLogicVar,\n  RQBJsonLogic,\n  RuleProcessor,\n} from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { isRuleGroup } from '../isRuleGroup';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { defaultRuleGroupProcessorJsonLogic } from './defaultRuleGroupProcessorJsonLogic';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst convertOperator = (op: '<' | '<=' | '=' | '!=' | '>' | '>=') =>\n  op\n    .replace(/^(=)$/, '$1=')\n    .replace(/^notnull$/i, '!=')\n    .replace(/^null$/i, '==') as '<' | '<=' | '==' | '!=' | '===' | '!==' | '>' | '>=';\n\nconst negateIfNotOp = (op: string, jsonRule: RQBJsonLogic) =>\n  op.startsWith('not') || op.startsWith('doesnot') ? { '!': jsonRule } : jsonRule;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"jsonlogic\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorJsonLogic: RuleProcessor = (rule, options = {}): RQBJsonLogic => {\n  const { field, operator, value, valueSource } = rule;\n  const { parseNumbers, preserveValueOrder } = options;\n  const valueIsField = valueSource === 'field';\n  const fieldObject: JsonLogicVar = { var: field };\n  const fieldOrNumberRenderer = (v: string) =>\n    valueIsField\n      ? { var: `${v}` }\n      : shouldRenderAsNumber(v, parseNumbers)\n        ? parseNumber(v, { parseNumbers })\n        : v;\n\n  const matchEval = processMatchMode(rule);\n\n  if (matchEval === false) {\n    return false;\n  } else if (matchEval) {\n    const { mode, threshold } = matchEval;\n\n    switch (mode) {\n      case 'all':\n      case 'none':\n      case 'some':\n        return {\n          [mode]: [\n            { var: field },\n            value.rules.length === 1 && !isRuleGroup(value.rules[0])\n              ? defaultRuleProcessorJsonLogic(value.rules[0], options)\n              : defaultRuleGroupProcessorJsonLogic(value, options as FormatQueryFinalOptions),\n          ],\n        } as RQBJsonLogic;\n\n      case 'atleast':\n      case 'atmost':\n      case 'exactly': {\n        const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '==';\n\n        const filteredCount = {\n          reduce: [\n            {\n              filter: [\n                { var: field },\n                value.rules.length === 1 && !isRuleGroup(value.rules[0])\n                  ? defaultRuleProcessorJsonLogic(value.rules[0], options)\n                  : defaultRuleGroupProcessorJsonLogic(value, options as FormatQueryFinalOptions),\n              ],\n            },\n            { '+': [1, { var: 'accumulator' }] },\n            0,\n          ],\n        };\n\n        if (threshold > 0 && threshold < 1) {\n          const totalCount = {\n            reduce: [{ var: field }, { '+': [1, { var: 'accumulator' }] }, 0],\n          };\n          return { [op]: [filteredCount, { '*': [totalCount, threshold] }] } as RQBJsonLogic;\n        }\n        return { [op]: [filteredCount, threshold] } as RQBJsonLogic;\n      }\n    }\n  }\n\n  const operatorLC = lc(operator);\n  switch (operatorLC) {\n    case '<':\n    case '<=':\n    case '=':\n    case '!=':\n    case '>':\n    case '>=':\n      return {\n        [convertOperator(operatorLC)]: [fieldObject, fieldOrNumberRenderer(value)],\n      } as RQBJsonLogic;\n\n    case 'null':\n    case 'notnull': {\n      return {\n        [`${operatorLC === 'notnull' ? '!' : '='}=`]: [fieldObject, null],\n      } as RQBJsonLogic;\n    }\n\n    case 'in':\n    case 'notin': {\n      const valueAsArray = toArray(value).map(v => fieldOrNumberRenderer(v));\n      return negateIfNotOp(operatorLC, { in: [fieldObject, valueAsArray] });\n    }\n\n    case 'between':\n    case 'notbetween': {\n      const valueAsArray = toArray(value);\n      if (\n        valueAsArray.length >= 2 &&\n        isValidValue(valueAsArray[0]) &&\n        isValidValue(valueAsArray[1])\n      ) {\n        let [first, second] = valueAsArray;\n        // For backwards compatibility, default to parsing numbers for between operators\n        // unless parseNumbers is explicitly set to false\n        const shouldParseNumbers = !(parseNumbers === false);\n        if (\n          !valueIsField &&\n          shouldRenderAsNumber(first, shouldParseNumbers) &&\n          shouldRenderAsNumber(second, shouldParseNumbers)\n        ) {\n          const firstNum = parseNumber(first, { parseNumbers: shouldParseNumbers });\n          const secondNum = parseNumber(second, { parseNumbers: shouldParseNumbers });\n          if (!preserveValueOrder && secondNum < firstNum) {\n            const tempNum = secondNum;\n            second = firstNum;\n            first = tempNum;\n          } else {\n            first = firstNum;\n            second = secondNum;\n          }\n        } else if (valueIsField) {\n          first = { var: first };\n          second = { var: second };\n        }\n        const jsonRule: RQBJsonLogic = { '<=': [first, fieldObject, second] };\n        return negateIfNotOp(operatorLC, jsonRule);\n      }\n      return false;\n    }\n\n    case 'contains':\n    case 'doesnotcontain': {\n      const jsonRule: RQBJsonLogic = {\n        in: [fieldOrNumberRenderer(value), fieldObject],\n      };\n      return negateIfNotOp(operatorLC, jsonRule);\n    }\n\n    case 'beginswith':\n    case 'doesnotbeginwith': {\n      const jsonRule: RQBJsonLogic = {\n        startsWith: [fieldObject, fieldOrNumberRenderer(value)],\n      };\n      return negateIfNotOp(operatorLC, jsonRule);\n    }\n\n    case 'endswith':\n    case 'doesnotendwith': {\n      const jsonRule: RQBJsonLogic = {\n        endsWith: [fieldObject, fieldOrNumberRenderer(value)],\n      };\n      return negateIfNotOp(operatorLC, jsonRule);\n    }\n  }\n  return false;\n};\n","import type { RuleProcessor } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc, nullOrUndefinedOrEmpty } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst negateIf = (clause: string, negate: boolean) => (negate ? `(!${clause})` : `${clause}`);\n\nconst ldapEscape = (s: unknown) =>\n  `${trimIfString(s)}`.replaceAll(\n    /[()&|=<>~*\\\\/]/g,\n    (m: string) => `\\\\${m.codePointAt(0)!.toString(16)}`\n  );\n\n/**\n * Default rule processor used by {@link formatQuery} for \"ldap\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorLDAP: RuleProcessor = (\n  rule,\n  // istanbul ignore next\n  options = {}\n) => {\n  const { field, operator, value, valueSource } = rule;\n  const { preserveValueOrder } = options;\n  const operatorLC = lc(operator);\n\n  // Bail out if...\n  if (\n    // This is a field comparison (which LDAP does not support), or\n    valueSource === 'field' ||\n    // `value` is null/undefined/empty and the operator is not unary, or\n    (nullOrUndefinedOrEmpty(value) && operatorLC !== 'null' && operatorLC !== 'notnull') ||\n    // a valid `match` property is found (match modes are not supported in this format)\n    processMatchMode(rule)\n  ) {\n    return '';\n  }\n\n  switch (operatorLC) {\n    case '=':\n    case '!=':\n      return negateIf(`(${field}=${ldapEscape(value)})`, operatorLC === '!=');\n\n    case '>':\n    case '>=':\n      return `(${field}>=${ldapEscape(value)})`;\n\n    case '<':\n    case '<=':\n      return `(${field}<=${ldapEscape(value)})`;\n\n    case 'contains':\n    case 'doesnotcontain':\n      return negateIf(`(${field}=*${ldapEscape(value)}*)`, operatorLC === 'doesnotcontain');\n\n    case 'beginswith':\n    case 'doesnotbeginwith':\n      return negateIf(`(${field}=${ldapEscape(value)}*)`, operatorLC === 'doesnotbeginwith');\n\n    case 'endswith':\n    case 'doesnotendwith':\n      return negateIf(`(${field}=*${ldapEscape(value)})`, operatorLC === 'doesnotendwith');\n\n    case 'null':\n    case 'notnull':\n      return negateIf(`(${field}=*)`, operatorLC === 'notnull');\n\n    case 'in':\n    case 'notin': {\n      const valueAsArray = toArray(value);\n      return negateIf(\n        `(|${valueAsArray.map(val => `(${field}=${ldapEscape(val)})`).join('')})`,\n        operatorLC === 'notin'\n      );\n    }\n\n    case 'between':\n    case 'notbetween': {\n      const valueAsArray = toArray(value);\n      if (\n        valueAsArray.length < 2 ||\n        nullOrUndefinedOrEmpty(valueAsArray[0]) ||\n        nullOrUndefinedOrEmpty(valueAsArray[1])\n      ) {\n        return '';\n      }\n\n      const [first, second] = valueAsArray;\n      const firstNum = shouldRenderAsNumber(first, true)\n        ? parseNumber(first, { parseNumbers: true })\n        : Number.NaN;\n      const secondNum = shouldRenderAsNumber(second, true)\n        ? parseNumber(second, { parseNumbers: true })\n        : Number.NaN;\n      let firstValue = Number.isNaN(firstNum) ? first : firstNum;\n      let secondValue = Number.isNaN(secondNum) ? second : secondNum;\n\n      if (\n        !preserveValueOrder &&\n        firstValue === firstNum &&\n        secondValue === secondNum &&\n        secondNum < firstNum\n      ) {\n        const tempNum = secondNum;\n        secondValue = firstNum;\n        firstValue = tempNum;\n      }\n\n      return negateIf(\n        `(&(${field}>=${ldapEscape(firstValue)})(${field}<=${ldapEscape(secondValue)}))`,\n        operatorLC === 'notbetween'\n      );\n    }\n  }\n\n  // istanbul ignore next\n  return '';\n};\n","import type { FullField, ValueProcessorByRule } from '../../types';\nimport { toArray, trimIfString } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { getOption } from '../optGroupUtils';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, isValidValue, shouldRenderAsNumber } from './utils';\n\nconst escapeStringValueQuotes = (v: unknown, quoteChar: string, escapeQuotes?: boolean) =>\n  escapeQuotes && typeof v === 'string'\n    ? v.replaceAll(`${quoteChar}`, `${quoteChar}${quoteChar}`)\n    : /* istanbul ignore next */ v;\n\n/**\n * Default value processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessorNL: ValueProcessorByRule = (\n  rule,\n  // istanbul ignore next - defaultRuleProcessorNL always provides options\n  opts = {}\n) => {\n  const {\n    escapeQuotes,\n    fields,\n    parseNumbers,\n    quoteFieldNamesWith,\n    quoteValuesWith,\n    fieldIdentifierSeparator,\n    translations,\n  } = opts;\n  const valueIsField = rule.valueSource === 'field';\n  const operatorLowerCase = lc(rule.operator);\n  const quoteChar = quoteValuesWith || /* istanbul ignore next */ \"'\";\n\n  // oxlint-disable no-explicit-any\n  const quoteValue = (v: any) => `${quoteChar}${v}${quoteChar}`;\n  const escapeValue = (v: any) => escapeStringValueQuotes(v, quoteChar, escapeQuotes);\n  const wrapAndEscape = (v: any) => quoteValue(escapeValue(v));\n  // oxlint-enable no-explicit-any\n  const wrapFieldName = (v: string) =>\n    getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n  const t = translations ?? /* istanbul ignore next */ {};\n  const orTL = t.or ?? 'or';\n  const trueTL = t.true ?? 'true';\n  const falseTL = t.false ?? 'false';\n\n  switch (operatorLowerCase) {\n    case 'null':\n    case 'notnull': {\n      return '';\n    }\n\n    case 'between':\n    case 'notbetween': {\n      if (!valueIsField) {\n        return defaultValueProcessorByRule(rule, opts);\n      }\n\n      const valueAsArray = toArray(rule.value, { retainEmptyStrings: true })\n        .slice(0, 2)\n        .map(v =>\n          wrapFieldName(\n            getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], v)?.label ?? v\n          )\n        );\n      if (\n        valueAsArray.length < 2 ||\n        !isValidValue(valueAsArray[0]) ||\n        !isValidValue(valueAsArray[1])\n      ) {\n        return '';\n      }\n      return defaultValueProcessorByRule({ ...rule, value: valueAsArray }, opts);\n    }\n\n    case 'in':\n    case 'notin': {\n      const valueAsArray = toArray(rule.value);\n      if (valueAsArray.length === 0) return '';\n      const valStringArray = valueAsArray.map(v =>\n        valueIsField\n          ? wrapFieldName(\n              getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], v)?.label ?? v\n            )\n          : shouldRenderAsNumber(v, parseNumbers)\n            ? `${trimIfString(v)}`\n            : `${wrapAndEscape(v)}`\n      );\n      return `${valStringArray.slice(0, -1).join(', ')}${valStringArray.length > 2 ? ',' : ''} ${orTL} ${valStringArray.at(-1)}`;\n    }\n  }\n\n  if (typeof rule.value === 'boolean') {\n    return rule.value ? trueTL : falseTL;\n  }\n\n  return valueIsField\n    ? wrapFieldName(\n        getOption((fields as FullField[]) ?? /* istanbul ignore next */ [], rule.value)?.label ??\n          rule.value\n      )\n    : shouldRenderAsNumber(rule.value, parseNumbers)\n      ? `${trimIfString(rule.value)}`\n      : `${wrapAndEscape(rule.value)}`;\n};\n","import type {\n  DefaultOperatorName,\n  ExportOperatorMap,\n  FormatQueryFinalOptions,\n  FullOption,\n  RuleProcessor,\n} from '../../types';\nimport { lc } from '../misc';\nimport { getOption, toFullOptionList } from '../optGroupUtils';\nimport { defaultRuleGroupProcessorNL } from './defaultRuleGroupProcessorNL';\nimport { defaultValueProcessorNL } from './defaultValueProcessorNL';\nimport { getQuotedFieldName, normalizeConstituentWordOrder, processMatchMode } from './utils';\n\n/**\n * Default operator map used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultExportOperatorMap: ExportOperatorMap = {\n  '=': ['is', 'is the same as the value in'],\n  '!=': ['is not', 'is not the same as the value in'],\n  '<': ['is less than', 'is less than the value in'],\n  '>': ['is greater than', 'is greater than the value in'],\n  '<=': ['is less than or equal to', 'is less than or equal to the value in'],\n  '>=': ['is greater than or equal to', 'is greater than or equal to the value in'],\n  contains: ['contains', 'contains the value in'],\n  beginswith: ['starts with', 'starts with the value in'],\n  endswith: ['ends with', 'ends with the value in'],\n  doesnotcontain: ['does not contain', 'does not contain the value in'],\n  doesnotbeginwith: ['does not start with', 'does not start with the value in'],\n  doesnotendwith: ['does not end with', 'does not end with the value in'],\n  null: 'is null',\n  notnull: 'is not null',\n  in: ['is one of the values', 'is the same as a value in'],\n  notin: ['is not one of the values', 'is not the same as any value in'],\n  between: ['is between', 'is between the values in'],\n  notbetween: ['is not between', 'is not between the values in'],\n};\n\n/* istanbul ignore next */\nconst defaultGetOperators = () => [];\n\n/**\n * Default operator processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultOperatorProcessorNL: RuleProcessor = (\n  rule,\n  // istanbul ignore next\n  opts = {}\n) => {\n  const { field, operator, valueSource = 'value' } = rule;\n  // istanbul ignore next\n  const {\n    getOperators = defaultGetOperators,\n    operatorMap: operatorMapParam = defaultExportOperatorMap,\n  } = opts;\n\n  const mapOperatorMap = new Map<string, string | [string, string]>(\n    Object.entries(defaultExportOperatorMap)\n  );\n  for (const [key, value] of Object.entries(operatorMapParam)) {\n    mapOperatorMap.set(lc(key), value);\n  }\n  const operatorMap = Object.fromEntries(mapOperatorMap);\n\n  const { value: operatorNL, label } = getOption(\n    toFullOptionList(\n      getOperators(field, {\n        fieldData: opts.fieldData ?? {\n          name: field,\n          value: field,\n          label: field,\n        },\n      }) ?? /* istanbul ignore next */ []\n    ) as FullOption[],\n    operator\n  ) ?? {\n    name: operator,\n    value: operator,\n    label: operator,\n  };\n\n  const operatorTL = operatorMap[operatorNL as DefaultOperatorName] ??\n    operatorMap[lc(operatorNL) as Lowercase<DefaultOperatorName>] ?? [label, label];\n\n  return typeof operatorTL === 'string' ? operatorTL : operatorTL[valueSource === 'field' ? 1 : 0];\n};\n\n/**\n * Default rule processor used by {@link formatQuery} for \"natural_language\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorNL: RuleProcessor = (rule, opts) => {\n  const { field, operator } = rule;\n  // istanbul ignore next\n  const {\n    fieldData,\n    quoteFieldNamesWith = ['', ''] as [string, string],\n    fieldIdentifierSeparator = '',\n    quoteValuesWith = `'`,\n    operatorProcessor = defaultOperatorProcessorNL,\n    valueProcessor = defaultValueProcessorNL,\n    concatOperator = '||',\n    wordOrder = 'SVO',\n  } = opts ?? /* istanbul ignore next */ {};\n\n  const processedField = getQuotedFieldName(fieldData?.label ?? field, {\n    quoteFieldNamesWith,\n    fieldIdentifierSeparator,\n  });\n\n  const matchEval = processMatchMode(rule);\n\n  if (matchEval === false) {\n    return '';\n  } else if (matchEval) {\n    const { mode, threshold } = matchEval;\n\n    const nestedArrayFilter = defaultRuleGroupProcessorNL(rule.value, {\n      ...(opts as FormatQueryFinalOptions),\n      fields: toFullOptionList(fieldData?.subproperties ?? []),\n    });\n\n    // (H)as (S)ub(P)roperties\n    const hsp = (fieldData?.subproperties?.length ?? 0) > 0;\n\n    switch (mode) {\n      case 'all':\n        return `(${hsp ? 'for ' : ''}every item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n      case 'none':\n        return `(${hsp ? 'for ' : ''}no item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n      case 'some':\n        return `(${hsp ? 'for ' : ''}at least one item in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n\n      case 'atleast':\n      case 'atmost':\n      case 'exactly': {\n        const mm = mode.replace('at', 'at ');\n        if (threshold > 0 && threshold < 1) {\n          return `(${hsp ? 'for ' : ''}${mm} ${threshold * 100}% of the items in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n        }\n        return `(${hsp ? 'for ' : ''}${mm} ${threshold} of the items in ${processedField}${hsp ? ',' : ''} ${nestedArrayFilter})`;\n      }\n    }\n  }\n\n  const value = valueProcessor(rule, {\n    ...opts,\n    quoteFieldNamesWith,\n    fieldIdentifierSeparator,\n    quoteValuesWith,\n    concatOperator,\n  });\n\n  const operatorLC = lc(operator);\n  if (\n    (operatorLC === 'in' ||\n      operatorLC === 'notin' ||\n      operatorLC === 'between' ||\n      operatorLC === 'notbetween') &&\n    !value\n  ) {\n    return '';\n  }\n\n  const processedOperator = operatorProcessor(rule, opts);\n\n  const wordOrderMap = {\n    S: processedField,\n    V: processedOperator,\n    O: value,\n  };\n\n  return normalizeConstituentWordOrder(wordOrder)\n    .map(term => `${wordOrderMap[term]}`)\n    .join(' ')\n    .trim();\n};\n","import type { FormatQueryFinalOptions, RuleGroupType, RuleProcessor } from '../../types';\nimport { lc } from '../misc';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorSQL } from './defaultRuleGroupProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, mapSQLOperator, processMatchMode } from './utils';\n\n/**\n * Default operator processor used by {@link formatQuery} for \"sql\" and \"parameterized*\" formats.\n *\n * @group Export\n */\nexport const defaultOperatorProcessorSQL: RuleProcessor = rule => lc(mapSQLOperator(rule.operator));\n\n/**\n * Default rule processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSQL: RuleProcessor = (rule, opts = {}) => {\n  const {\n    quoteFieldNamesWith = ['', ''] as [string, string],\n    fieldIdentifierSeparator = '',\n    quoteValuesWith = `'`,\n    operatorProcessor = defaultOperatorProcessorSQL,\n    valueProcessor = defaultValueProcessorByRule,\n    concatOperator = '||',\n  } = opts;\n\n  const wrapFieldName = (v: string) =>\n    getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n  const ruleField = wrapFieldName(rule.field);\n\n  const matchEval = processMatchMode(rule);\n\n  if (matchEval === false) {\n    return;\n  } else if (matchEval) {\n    // We only support PostgreSQL nested arrays\n    if (opts?.preset !== 'postgresql') return '';\n\n    const { mode, threshold } = matchEval;\n\n    // TODO?: Randomize this alias\n    const arrayElementAlias = 'elem_alias';\n\n    const nestedArrayFilter = defaultRuleGroupProcessorSQL(\n      transformQuery(rule.value as RuleGroupType, {\n        ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n      }),\n      opts as FormatQueryFinalOptions\n    );\n\n    switch (mode) {\n      case 'all':\n        return `(select count(*) from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) = array_length(${ruleField}, 1)`;\n\n      case 'none':\n        return `not exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter})`;\n\n      case 'some':\n        return `exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter})`;\n\n      case 'atleast':\n      case 'atmost':\n      case 'exactly': {\n        const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n        return `(select count(*)${threshold > 0 && threshold < 1 ? ` / array_length(${ruleField}, 1)` : ''} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedArrayFilter}) ${op} ${threshold}`;\n      }\n    }\n  }\n\n  const value = valueProcessor(rule, {\n    ...opts,\n    quoteFieldNamesWith,\n    fieldIdentifierSeparator,\n    quoteValuesWith,\n    concatOperator,\n  });\n\n  const operator = operatorProcessor(rule, opts);\n\n  const operatorLowerCase = lc(operator);\n  if (\n    (operatorLowerCase === 'in' ||\n      operatorLowerCase === 'not in' ||\n      operatorLowerCase === 'between' ||\n      operatorLowerCase === 'not between') &&\n    !value\n  ) {\n    return '';\n  }\n\n  return `${ruleField} ${operator} ${value}`.trim();\n};\n","import type { FormatQueryFinalOptions, FullField, RuleGroupType, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { transformQuery } from '../transformQuery';\nimport { defaultRuleGroupProcessorParameterized } from './defaultRuleGroupProcessorParameterized';\nimport { defaultOperatorProcessorSQL } from './defaultRuleProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { getQuotedFieldName, processMatchMode, shouldRenderAsNumber } from './utils';\n\n/**\n * Default rule processor used by {@link formatQuery} for \"parameterized\" and\n * \"parameterized_named\" formats.\n *\n * @group Export\n */\nexport const defaultRuleProcessorParameterized: RuleProcessor = (rule, opts, meta) => {\n  // TODO?: test for this so we don't have to ignore it\n  // istanbul ignore next\n  const {\n    fieldData,\n    format,\n    getNextNamedParam,\n    parseNumbers,\n    paramPrefix,\n    paramsKeepPrefix,\n    numberedParams,\n    quoteFieldNamesWith = ['', ''] as [string, string],\n    fieldIdentifierSeparator,\n    concatOperator,\n    operatorProcessor = defaultOperatorProcessorSQL,\n    valueProcessor = defaultValueProcessorByRule,\n  } = opts ?? {};\n\n  const { processedParams = [] } = meta ?? {};\n\n  const parameterized = format === 'parameterized';\n  // oxlint-disable-next-line typescript/no-explicit-any\n  const params: any[] = [];\n  // oxlint-disable-next-line typescript/no-explicit-any\n  const paramsNamed: Record<string, any> = {};\n\n  const finalize = (sql: string) =>\n    parameterized ? { sql, params } : { sql, params: paramsNamed };\n\n  const wrapFieldName = (v: string) =>\n    getQuotedFieldName(v, { quoteFieldNamesWith, fieldIdentifierSeparator });\n\n  const ruleField = wrapFieldName(rule.field);\n\n  const matchEval = processMatchMode(rule);\n\n  if (matchEval === false) {\n    return;\n  } else if (matchEval) {\n    // We only support PostgreSQL nested arrays\n    if (opts?.preset !== 'postgresql') return finalize('');\n\n    const { mode, threshold } = matchEval;\n\n    // TODO?: Randomize this alias\n    const arrayElementAlias = 'elem_alias';\n\n    const { sql: nestedSQL, params: nestedParams } = defaultRuleGroupProcessorParameterized(\n      transformQuery(rule.value as RuleGroupType, {\n        ruleProcessor: r => ({ ...r, field: arrayElementAlias }),\n      }),\n      { ...(opts as FormatQueryFinalOptions), fields: [] as FullField[] }\n    );\n    // Ignore the \"parameterized_named\" case because PostgreSQL doesn't support named parameters\n    // istanbul ignore else\n    if (Array.isArray(nestedParams)) {\n      params.push(...nestedParams);\n    } else {\n      Object.assign(paramsNamed, nestedParams);\n    }\n\n    switch (mode) {\n      case 'all':\n        return finalize(\n          `(select count(*) from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) = array_length(${ruleField}, 1)`\n        );\n\n      case 'none':\n        return finalize(\n          `not exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL})`\n        );\n\n      case 'some':\n        return finalize(\n          `exists (select 1 from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL})`\n        );\n\n      case 'atleast':\n      case 'atmost':\n      case 'exactly': {\n        const op = mode === 'atleast' ? '>=' : mode === 'atmost' ? '<=' : '=';\n\n        return finalize(\n          `(select count(*)${threshold > 0 && threshold < 1 ? ` / array_length(${ruleField}, 1)` : ''} from unnest(${ruleField}) as ${wrapFieldName(arrayElementAlias)} where ${nestedSQL}) ${op} ${threshold}`\n        );\n      }\n    }\n  }\n\n  const value = valueProcessor(rule, {\n    parseNumbers,\n    quoteFieldNamesWith,\n    concatOperator,\n    fieldData,\n    format,\n  });\n\n  const sqlOperator = operatorProcessor(rule, opts);\n  const sqlOperatorLowerCase = lc(sqlOperator);\n  const [qPre, qPost] = quoteFieldNamesWith;\n\n  if (\n    (sqlOperatorLowerCase === 'in' ||\n      sqlOperatorLowerCase === 'not in' ||\n      sqlOperatorLowerCase === 'between' ||\n      sqlOperatorLowerCase === 'not between') &&\n    !value\n  ) {\n    return finalize('');\n  } else if (sqlOperatorLowerCase === 'is null' || sqlOperatorLowerCase === 'is not null') {\n    return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator}`);\n  } else if (rule.valueSource === 'field') {\n    return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator} ${value}`.trim());\n  } else if (sqlOperatorLowerCase === 'in' || sqlOperatorLowerCase === 'not in') {\n    const splitValue = toArray(rule.value);\n    if (parameterized) {\n      for (const v of splitValue) {\n        params.push(shouldRenderAsNumber(v, parseNumbers) ? parseNumber(v, { parseNumbers }) : v);\n      }\n      return finalize(\n        `${qPre}${rule.field}${qPost} ${sqlOperator} (${splitValue\n          .map((_v, i) =>\n            numberedParams\n              ? `${paramPrefix}${processedParams.length + 1 + splitValue.length - (splitValue.length - i)}`\n              : '?'\n          )\n          .join(', ')})`\n      );\n    }\n    const inParams: string[] = [];\n    for (const v of splitValue) {\n      const thisParamName = getNextNamedParam!(rule.field);\n      inParams.push(`${paramPrefix}${thisParamName}`);\n      paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${thisParamName}`] = shouldRenderAsNumber(\n        v,\n        parseNumbers\n      )\n        ? parseNumber(v, { parseNumbers })\n        : v;\n    }\n    return finalize(`${qPre}${rule.field}${qPost} ${sqlOperator} (${inParams.join(', ')})`);\n  } else if (sqlOperatorLowerCase === 'between' || sqlOperatorLowerCase === 'not between') {\n    const valueAsArray = toArray(rule.value, { retainEmptyStrings: true });\n    const [first, second] = valueAsArray\n      .slice(0, 2)\n      .map(v => (shouldRenderAsNumber(v, parseNumbers) ? parseNumber(v, { parseNumbers }) : v));\n    if (parameterized) {\n      params.push(first, second);\n      return finalize(\n        `${qPre}${rule.field}${qPost} ${sqlOperator} ${\n          numberedParams ? `${paramPrefix}${processedParams.length + 1}` : '?'\n        } and ${numberedParams ? `${paramPrefix}${processedParams.length + 2}` : '?'}`\n      );\n    }\n    const firstParamName = getNextNamedParam!(rule.field);\n    const secondParamName = getNextNamedParam!(rule.field);\n    paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${firstParamName}`] = first;\n    paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${secondParamName}`] = second;\n    return finalize(\n      `${qPre}${rule.field}${qPost} ${sqlOperator} ${paramPrefix}${firstParamName} and ${paramPrefix}${secondParamName}`\n    );\n  }\n\n  let paramValue = rule.value;\n  if (typeof rule.value === 'string') {\n    if (shouldRenderAsNumber(rule.value, parseNumbers)) {\n      paramValue = parseNumber(rule.value, { parseNumbers });\n    } else {\n      // Note that we're using `value` here, which has been processed through\n      // a `valueProcessor`, as opposed to `rule.value` which has not\n      paramValue = /^'.*'$/g.test(value)\n        ? value.replaceAll(/(^'|'$)/g, '')\n        : /* istanbul ignore next */ value;\n    }\n  }\n\n  let paramName = '';\n  if (parameterized) {\n    params.push(paramValue);\n  } else {\n    paramName = getNextNamedParam!(rule.field);\n    paramsNamed[`${paramsKeepPrefix ? paramPrefix : ''}${paramName}`] = paramValue;\n  }\n\n  return finalize(\n    `${qPre}${rule.field}${qPost} ${sqlOperator} ${\n      parameterized\n        ? numberedParams\n          ? `${paramPrefix}${processedParams.length + 1}`\n          : '?'\n        : `${paramPrefix}${paramName}`\n    }`.trim()\n  );\n};\n","import type { ParseNumbersPropConfig, RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, prismaOperators, processMatchMode, shouldRenderAsNumber } from './utils';\n\nconst processNumber = <T>(value: unknown, fallback: T, parseNumbers?: ParseNumbersPropConfig) =>\n  shouldRenderAsNumber(value, !!parseNumbers || typeof value === 'bigint')\n    ? Number(parseNumber(value, { parseNumbers: !!parseNumbers }))\n    : fallback;\n\n/**\n * Default rule processor used by {@link formatQuery} for \"prisma\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorPrisma: RuleProcessor = (\n  rule,\n  // istanbul ignore next\n  options = {}\n) => {\n  const { field, operator, value, valueSource } = rule;\n  // istanbul ignore next\n  const { parseNumbers, preserveValueOrder } = options;\n\n  // Neither field-to-field comparisons nor match modes are supported in this format\n  if (valueSource === 'field' || processMatchMode(rule)) return;\n\n  const operatorLC = lc(operator);\n  switch (operatorLC) {\n    case '=':\n      return { [field]: processNumber(value, value, parseNumbers) };\n\n    case '!=':\n    case '<':\n    case '<=':\n    case '>':\n    case '>=': {\n      const prismaOperator = prismaOperators[operatorLC];\n      return {\n        [field]: {\n          [prismaOperator]: processNumber(value, value, parseNumbers),\n        },\n      };\n    }\n\n    case 'contains':\n      return { [field]: { contains: value } };\n\n    case 'beginswith':\n      return { [field]: { startsWith: value } };\n\n    case 'endswith':\n      return { [field]: { endsWith: value } };\n\n    case 'doesnotcontain':\n      return { NOT: { [field]: { contains: value } } };\n\n    case 'doesnotbeginwith':\n      return { NOT: { [field]: { startsWith: value } } };\n\n    case 'doesnotendwith':\n      return { NOT: { [field]: { endsWith: value } } };\n\n    case 'null':\n      return { [field]: null };\n\n    case 'notnull':\n      return { [field]: { not: null } };\n\n    case 'in':\n    case 'notin': {\n      const valueAsArray = toArray(value);\n      return {\n        [field]: {\n          [prismaOperators[operatorLC]]: valueAsArray.map(val =>\n            processNumber(val, val, parseNumbers)\n          ),\n        },\n      };\n    }\n\n    case 'between':\n    case 'notbetween': {\n      const valueAsArray = toArray(value);\n      if (\n        valueAsArray.length >= 2 &&\n        isValidValue(valueAsArray[0]) &&\n        isValidValue(valueAsArray[1])\n      ) {\n        const [first, second] = valueAsArray;\n        // For backwards compatibility, default to parsing numbers for between operators\n        // unless parseNumbers is explicitly set to false\n        const shouldParseNumbers = !(parseNumbers === false);\n        const firstNum = shouldRenderAsNumber(first, shouldParseNumbers)\n          ? parseNumber(first, { parseNumbers })\n          : Number.NaN;\n        const secondNum = shouldRenderAsNumber(second, shouldParseNumbers)\n          ? parseNumber(second, { parseNumbers })\n          : Number.NaN;\n        let firstValue = Number.isNaN(firstNum) ? first : firstNum;\n        let secondValue = Number.isNaN(secondNum) ? second : secondNum;\n        if (\n          !preserveValueOrder &&\n          firstValue === firstNum &&\n          secondValue === secondNum &&\n          secondNum < firstNum\n        ) {\n          const tempNum = secondNum;\n          secondValue = firstNum;\n          firstValue = tempNum;\n        }\n\n        return operatorLC === 'between'\n          ? { [field]: { gte: firstValue, lte: secondValue } }\n          : { OR: [{ [field]: { lt: firstValue } }, { [field]: { gt: secondValue } }] };\n      } else {\n        return '';\n      }\n    }\n  }\n  return '';\n};\n","import type { Op as _OpTypes, col as _colType, fn as _fnType } from 'sequelize';\nimport type { Simplify } from 'type-fest';\nimport type { RuleProcessor } from '../../types';\nimport { toArray } from '../arrayUtils';\nimport { lc } from '../misc';\nimport { parseNumber } from '../parseNumber';\nimport { isValidValue, processMatchMode, shouldRenderAsNumber } from './utils';\n\ntype OpTypes = Simplify<typeof _OpTypes>;\ntype ColType = typeof _colType;\ntype FnType = typeof _fnType;\n\n/**\n * Default rule processor used by {@link formatQuery} for the \"sequelize\" format.\n *\n * @group Export\n */\nexport const defaultRuleProcessorSequelize: RuleProcessor = (\n  rule,\n  // istanbul ignore next\n  { parseNumbers, preserveValueOrder, context = {} } = {}\n): Record<string, unknown> | undefined => {\n  const {\n    sequelizeOperators: Op,\n    sequelizeCol: col,\n    sequelizeFn: fn,\n  } = context as {\n    sequelizeOperators: OpTypes;\n    sequelizeCol?: ColType;\n    sequelizeFn?: FnType;\n  };\n\n  // Match modes are not supported in this format\n  if (processMatchMode(rule)) return;\n\n  const { field, operator, value, valueSource } = rule;\n  const valueIsField = valueSource === 'field';\n\n  const operatorLC = lc(operator);\n\n  if (\n    // Bail out if we don't have the Op symbols\n    !Op ||\n    // ...or valueSource is 'field' and we don't have the `col` function,\n    (valueIsField &&\n      (!col ||\n        // ...or valueSource is 'field' and we don't have the `fn` function\n        // and the operator is one of the \"doesNot*\" ones\n        (!fn && ['doesnotcontain', 'doesnotbeginwith', 'doesnotendwith'].includes(operatorLC))))\n  ) {\n    return;\n  }\n\n  switch (operatorLC) {\n    case '=':\n    case '!=':\n    case '<':\n    case '<=':\n    case '>':\n    case '>=': {\n      const sequelizeOperator = {\n        '=': Op.eq,\n        '!=': Op.ne,\n        '<': Op.lt,\n        '<=': Op.lte,\n        '>': Op.gt,\n        '>=': Op.gte,\n      }[operatorLC];\n      return {\n        [field]:\n          valueIsField && operatorLC === '='\n            ? { [Op.col]: value }\n            : {\n                [sequelizeOperator]: valueIsField\n                  ? col!(value)\n                  : shouldRenderAsNumber(value, parseNumbers)\n                    ? parseNumber(value, { parseNumbers: 'strict' })\n                    : value,\n              },\n      };\n    }\n\n    case 'contains':\n      return { [field]: { [Op.substring]: valueIsField ? col!(value) : `${value}` } };\n\n    case 'beginswith':\n      return { [field]: { [Op.startsWith]: valueIsField ? col!(value) : `${value}` } };\n\n    case 'endswith':\n      return { [field]: { [Op.endsWith]: valueIsField ? col!(value) : `${value}` } };\n\n    case 'doesnotcontain':\n      return {\n        [field]: {\n          [Op.notLike]: valueIsField ? fn!('CONCAT', '%', col!(value), '%') : `%${value}%`,\n        },\n      };\n\n    case 'doesnotbeginwith':\n      return {\n        [field]: { [Op.notLike]: valueIsField ? fn!('CONCAT', col!(value), '%') : `${value}%` },\n      };\n\n    case 'doesnotendwith':\n      return {\n        [field]: { [Op.notLike]: valueIsField ? fn!('CONCAT', '%', col!(value)) : `%${value}` },\n      };\n\n    case 'null':\n      return { [field]: { [Op.is]: null } };\n\n    case 'notnull':\n      return { [field]: { [Op.not]: null } };\n\n    case 'in':\n    case 'notin': {\n      const valueAsArray = toArray(value);\n      return {\n        [field]: {\n          [operatorLC === 'in' ? Op.in : Op.notIn]: valueAsArray.map(val =>\n            valueIsField\n              ? col!(val)\n              : shouldRenderAsNumber(val, parseNumbers)\n                ? parseNumber(val, { parseNumbers: 'strict' })\n                : val\n          ),\n        },\n      };\n    }\n\n    case 'between':\n    case 'notbetween': {\n      const valueAsArray = toArray(value, { retainEmptyStrings: true });\n      if (\n        valueAsArray.length < 2 ||\n        !isValidValue(valueAsArray[0]) ||\n        !isValidValue(valueAsArray[1])\n      ) {\n        return;\n      }\n\n      const [first, second] = valueAsArray;\n\n      const firstNum = shouldRenderAsNumber(first, parseNumbers)\n        ? parseNumber(first, { parseNumbers: 'strict' })\n        : Number.NaN;\n      const secondNum = shouldRenderAsNumber(second, parseNumbers)\n        ? parseNumber(second, { parseNumbers: 'strict' })\n        : Number.NaN;\n      const firstValue = Number.isNaN(firstNum) ? first : firstNum;\n      const secondValue = Number.isNaN(secondNum) ? second : secondNum;\n      const valsOneAndTwoOnly = [firstValue, secondValue];\n      if (\n        !preserveValueOrder &&\n        firstValue === firstNum &&\n        secondValue === secondNum &&\n        secondNum < firstNum\n      ) {\n        valsOneAndTwoOnly[0] = secondNum;\n        valsOneAndTwoOnly[1] = firstNum;\n      }\n\n      return {\n        [field]: {\n          [operatorLC === 'between' ? Op.between : Op.notBetween]: valueIsField\n            ? valsOneAndTwoOnly.map(v => col!(v))\n            : valsOneAndTwoOnly.every(v => shouldRenderAsNumber(v, parseNumbers))\n              ? valsOneAndTwoOnly.map(v => parseNumber(v, { parseNumbers: 'strict' }))\n              : valsOneAndTwoOnly,\n        },\n      };\n    }\n  }\n  return;\n};\n","import { produce } from 'immer';\nimport type { SetOptional } from 'type-fest';\nimport { defaultPlaceholderFieldName, defaultPlaceholderOperatorName } from '../../defaults';\nimport type {\n  ExportFormat,\n  ExportObjectFormats,\n  FormatQueryFinalOptions,\n  FormatQueryOptions,\n  FullField,\n  FullOperator,\n  FullOptionList,\n  InputType,\n  ParameterizedNamedSQL,\n  ParameterizedSQL,\n  RQBJsonLogic,\n  RuleGroupProcessor,\n  RuleGroupTypeAny,\n  RuleProcessor,\n  RuleType,\n  RuleValidator,\n  SQLPreset,\n  ValidationMap,\n  ValidationResult,\n  ValueProcessorByRule,\n} from '../../types';\nimport { getParseNumberMethod } from '../getParseNumberMethod';\nimport { lc } from '../misc';\nimport { toFlatOptionArray, toFullOptionList } from '../optGroupUtils';\nimport { defaultRuleGroupProcessorCEL } from './defaultRuleGroupProcessorCEL';\nimport { defaultRuleGroupProcessorDrizzle } from './defaultRuleGroupProcessorDrizzle';\nimport { defaultRuleGroupProcessorElasticSearch } from './defaultRuleGroupProcessorElasticSearch';\nimport { defaultRuleGroupProcessorJSONata } from './defaultRuleGroupProcessorJSONata';\nimport { defaultRuleGroupProcessorJsonLogic } from './defaultRuleGroupProcessorJsonLogic';\nimport { defaultRuleGroupProcessorLDAP } from './defaultRuleGroupProcessorLDAP';\nimport { defaultRuleGroupProcessorMongoDB } from './defaultRuleGroupProcessorMongoDB';\nimport {\n  defaultRuleGroupProcessorMongoDBQuery,\n  mongoDbFallback,\n} from './defaultRuleGroupProcessorMongoDBQuery';\nimport { defaultRuleGroupProcessorNL } from './defaultRuleGroupProcessorNL';\nimport { defaultRuleGroupProcessorParameterized } from './defaultRuleGroupProcessorParameterized';\nimport { defaultRuleGroupProcessorPrisma, prismaFallback } from './defaultRuleGroupProcessorPrisma';\nimport { defaultRuleGroupProcessorSequelize } from './defaultRuleGroupProcessorSequelize';\nimport { defaultRuleGroupProcessorSpEL } from './defaultRuleGroupProcessorSpEL';\nimport { defaultRuleGroupProcessorSQL } from './defaultRuleGroupProcessorSQL';\nimport { defaultRuleProcessorCEL } from './defaultRuleProcessorCEL';\nimport { defaultRuleProcessorDrizzle } from './defaultRuleProcessorDrizzle';\nimport { defaultRuleProcessorElasticSearch } from './defaultRuleProcessorElasticSearch';\nimport { defaultRuleProcessorJSONata } from './defaultRuleProcessorJSONata';\nimport { defaultRuleProcessorJsonLogic } from './defaultRuleProcessorJsonLogic';\nimport { defaultRuleProcessorLDAP } from './defaultRuleProcessorLDAP';\nimport { defaultRuleProcessorMongoDB } from './defaultRuleProcessorMongoDB';\nimport { defaultRuleProcessorMongoDBQuery } from './defaultRuleProcessorMongoDBQuery';\nimport { defaultOperatorProcessorNL, defaultRuleProcessorNL } from './defaultRuleProcessorNL';\nimport { defaultRuleProcessorParameterized } from './defaultRuleProcessorParameterized';\nimport { defaultRuleProcessorPrisma } from './defaultRuleProcessorPrisma';\nimport { defaultRuleProcessorSequelize } from './defaultRuleProcessorSequelize';\nimport { defaultRuleProcessorSpEL } from './defaultRuleProcessorSpEL';\nimport { defaultOperatorProcessorSQL, defaultRuleProcessorSQL } from './defaultRuleProcessorSQL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\nimport { defaultValueProcessorNL } from './defaultValueProcessorNL';\nimport {\n  bigIntJsonStringifyReplacer,\n  getQuoteFieldNamesWithArray,\n  isValueProcessorLegacy,\n  numerifyValues,\n} from './utils';\n\n/**\n * A collection of option presets for {@link formatQuery}, specifically for SQL-based formats.\n *\n * @group Export\n */\nexport const sqlDialectPresets: Record<SQLPreset, FormatQueryOptions> = {\n  ansi: {}, // This should always be empty\n  sqlite: {\n    paramsKeepPrefix: true,\n  },\n  oracle: {},\n  mssql: {\n    concatOperator: '+',\n    quoteFieldNamesWith: ['[', ']'],\n    fieldIdentifierSeparator: '.',\n    paramPrefix: '@',\n  },\n  mysql: {\n    concatOperator: 'CONCAT',\n  },\n  postgresql: {\n    quoteFieldNamesWith: '\"',\n    numberedParams: true,\n    paramPrefix: '$',\n  },\n};\n\n/**\n * A collection of option presets for {@link formatQuery}.\n *\n * @group Export\n */\nexport const formatQueryOptionPresets: Record<string, FormatQueryOptions> = {\n  ...sqlDialectPresets,\n};\n\nconst defaultRuleProcessors = {\n  cel: defaultRuleProcessorCEL,\n  drizzle: defaultRuleProcessorDrizzle,\n  elasticsearch: defaultRuleProcessorElasticSearch,\n  json_without_ids: defaultRuleProcessorSQL,\n  json: defaultRuleProcessorSQL,\n  jsonata: defaultRuleProcessorJSONata,\n  jsonlogic: defaultRuleProcessorJsonLogic,\n  ldap: defaultRuleProcessorLDAP,\n  mongodb_query: defaultRuleProcessorMongoDBQuery,\n  mongodb: defaultRuleProcessorMongoDB,\n  natural_language: defaultRuleProcessorNL,\n  parameterized_named: defaultRuleProcessorParameterized,\n  parameterized: defaultRuleProcessorParameterized,\n  prisma: defaultRuleProcessorPrisma,\n  sequelize: defaultRuleProcessorSequelize,\n  spel: defaultRuleProcessorSpEL,\n  sql: defaultRuleProcessorSQL,\n} satisfies Record<ExportFormat, RuleProcessor>;\n\n/* istanbul ignore next */\nconst defaultOperatorProcessor: RuleProcessor = r => r.operator;\nconst defaultOperatorProcessors = {\n  cel: defaultOperatorProcessor,\n  drizzle: defaultOperatorProcessor,\n  elasticsearch: defaultOperatorProcessor,\n  json_without_ids: defaultOperatorProcessor,\n  json: defaultOperatorProcessor,\n  jsonata: defaultOperatorProcessor,\n  jsonlogic: defaultOperatorProcessor,\n  ldap: defaultOperatorProcessor,\n  mongodb_query: defaultOperatorProcessor,\n  mongodb: defaultOperatorProcessor,\n  natural_language: defaultOperatorProcessorNL,\n  parameterized_named: defaultOperatorProcessorSQL,\n  parameterized: defaultOperatorProcessorSQL,\n  prisma: defaultOperatorProcessor,\n  sequelize: defaultOperatorProcessor,\n  spel: defaultOperatorProcessor,\n  sql: defaultOperatorProcessorSQL,\n} satisfies Record<ExportFormat, RuleProcessor>;\n\nconst defaultFallbackExpressions: Partial<Record<ExportFormat, string>> = {\n  cel: '1 == 1',\n  ldap: '',\n  mongodb: '\"$and\":[{\"$expr\":true}]',\n  natural_language: '1 is 1',\n  spel: '1 == 1',\n  sql: '(1 = 1)',\n};\n\ntype MostFormatQueryOptions = SetOptional<\n  Required<FormatQueryOptions>,\n  | 'context'\n  | 'fallbackExpression'\n  | 'operatorProcessor'\n  | 'ruleGroupProcessor'\n  | 'ruleProcessor'\n  | 'validator'\n  | 'valueProcessor'\n  | 'placeholderValueName'\n  | 'parseNumbers'\n>;\n\nconst defaultFormatQueryOptions = {\n  format: 'json',\n  fields: [] as FullOptionList<FullField>,\n  quoteFieldNamesWith: ['', ''],\n  fieldIdentifierSeparator: '',\n  getOperators: () => [] as FullOptionList<FullOperator>,\n  paramPrefix: ':',\n  paramsKeepPrefix: false,\n  numberedParams: false,\n  preserveValueOrder: false,\n  placeholderFieldName: defaultPlaceholderFieldName,\n  placeholderOperatorName: defaultPlaceholderOperatorName,\n  quoteValuesWith: \"'\",\n  concatOperator: '||',\n  preset: 'ansi',\n  wordOrder: 'SVO',\n  translations: {},\n  operatorMap: {},\n} satisfies MostFormatQueryOptions;\n\nconst valueProcessorCanActAsRuleProcessor = new Set<ExportFormat>([\n  'cel',\n  'drizzle',\n  'elasticsearch',\n  'jsonata',\n  'jsonlogic',\n  'ldap',\n  'mongodb_query',\n  'mongodb',\n  'prisma',\n  'sequelize',\n  'spel',\n]);\n\nconst sqlFormats = new Set<ExportFormat>([\n  'sql',\n  'parameterized',\n  'parameterized_named',\n  'drizzle',\n  'prisma',\n  'sequelize',\n]);\n\n/**\n * Generates a formatted (indented two spaces) JSON string from a query object.\n *\n * @group Export\n */\nfunction formatQuery(ruleGroup: RuleGroupTypeAny): string;\n/**\n * Generates a result based on the provided rule group processor.\n *\n * @group Export\n */\nfunction formatQuery<TResult = unknown>(\n  ruleGroup: RuleGroupTypeAny,\n  options: FormatQueryOptions & { ruleGroupProcessor: RuleGroupProcessor<TResult> }\n): TResult;\n/**\n * Generates a {@link index!ParameterizedSQL ParameterizedSQL} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n  ruleGroup: RuleGroupTypeAny,\n  options: 'parameterized' | (FormatQueryOptions & { format: 'parameterized' })\n): ParameterizedSQL;\n/**\n * Generates a {@link index!ParameterizedNamedSQL ParameterizedNamedSQL} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n  ruleGroup: RuleGroupTypeAny,\n  options: 'parameterized_named' | (FormatQueryOptions & { format: 'parameterized_named' })\n): ParameterizedNamedSQL;\n/**\n * Generates a {@link index!RQBJsonLogic JsonLogic} object from a query object.\n *\n * @group Export\n */\nfunction formatQuery(\n  ruleGroup: RuleGroupTypeAny,\n  options: 'jsonlogic' | (FormatQueryOptions & { format: 'jsonlogic' })\n): RQBJsonLogic;\n/**\n * Generates an ElasticSearch query object from an RQB query object.\n *\n * NOTE: Support for the ElasticSearch format is experimental.\n * You may have better results exporting \"sql\" format then using\n * [ElasticSearch SQL](https://www.elastic.co/guide/en/elasticsearch/reference/current/xpack-sql.html).\n *\n * @group Export\n */\nfunction formatQuery(\n  ruleGroup: RuleGroupTypeAny,\n  options: 'elasticsearch' | (FormatQueryOptions & { format: 'elasticsearch' })\n  // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a MongoDB query object from an RQB query object.\n *\n * This is equivalent to the \"mongodb\" format, but returns a JSON object\n * instead of a string.\n *\n * @group Export\n */\nfunction formatQuery(\n  ruleGroup: RuleGroupTypeAny,\n  options: 'mongodb_query' | (FormatQueryOptions & { format: 'mongodb_query' })\n  // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a JSON.stringify'd MongoDB query object from an RQB query object.\n *\n * This is equivalent to the \"mongodb_query\" format, but returns a string\n * instead of a JSON object.\n *\n * @deprecated Use the \"mongodb_query\" format for greater flexibility.\n *\n * @group Export\n */\nfunction formatQuery(\n  ruleGroup: RuleGroupTypeAny,\n  options: 'mongodb' | (FormatQueryOptions & { format: 'mongodb' })\n): string;\n/**\n * Generates a Prisma ORM query object from an RQB query object.\n *\n * @group Export\n */\nfunction formatQuery(\n  ruleGroup: RuleGroupTypeAny,\n  options: 'prisma' | (FormatQueryOptions & { format: 'prisma' })\n  // oxlint-disable-next-line typescript/no-explicit-any\n): Record<string, any>;\n/**\n * Generates a Drizzle ORM query function from an RQB query object. The function can\n * be assigned to the `where` property in the Drizzle relational queries API.\n *\n * @group Export\n */\nfunction formatQuery(\n  ruleGroup: RuleGroupTypeAny,\n  options: 'drizzle' | (FormatQueryOptions & { format: 'drizzle' })\n): ReturnType<typeof defaultRuleGroupProcessorDrizzle>;\n/**\n * Generates a Sequelize query object from an RQB query object. The object can\n * be assigned to the `where` property in the Sequelize query functions.\n *\n * @group Export\n */\nfunction formatQuery(\n  ruleGroup: RuleGroupTypeAny,\n  options: 'sequelize' | (FormatQueryOptions & { format: 'sequelize' })\n): ReturnType<typeof defaultRuleGroupProcessorSequelize>;\n/**\n * Generates a JSONata query string from an RQB query object.\n *\n * NOTE: Either `parseNumbers: \"strict-limited\"` or `parseNumbers: true`\n * are recommended for this format.\n *\n * @group Export\n */\nfunction formatQuery(\n  ruleGroup: RuleGroupTypeAny,\n  options: 'jsonata' | (FormatQueryOptions & { format: 'jsonata' })\n): string;\n/**\n * Generates an LDAP query string from an RQB query object.\n *\n * @group Export\n */\nfunction formatQuery(\n  ruleGroup: RuleGroupTypeAny,\n  options: 'ldap' | (FormatQueryOptions & { format: 'ldap' })\n): string;\n/**\n * Generates a formatted (indented two spaces) JSON string from a query object.\n *\n * @group Export\n */\nfunction formatQuery(ruleGroup: RuleGroupTypeAny, options: FormatQueryOptions): string;\n/**\n * Generates a query string in the requested format.\n *\n * @group Export\n */\nfunction formatQuery(\n  ruleGroup: RuleGroupTypeAny,\n  options: Exclude<ExportFormat, ExportObjectFormats>\n): string;\n/**\n * Generates a query string in the requested format.\n *\n * @group Export\n */\nfunction formatQuery(\n  ruleGroup: RuleGroupTypeAny,\n  options: FormatQueryOptions & { format: Exclude<ExportFormat, ExportObjectFormats> }\n): string;\nfunction formatQuery(\n  ruleGroup: RuleGroupTypeAny,\n  optionParam: FormatQueryOptions | ExportFormat = {}\n) {\n  const options = typeof optionParam === 'string' ? { format: lc(optionParam) } : optionParam;\n\n  const optObj: MostFormatQueryOptions = {\n    ...defaultFormatQueryOptions,\n    ...(!options.format || sqlFormats.has(options.format)\n      ? (sqlDialectPresets[options.preset ?? 'ansi'] ?? null)\n      : null),\n    ...options,\n    ...(!options.format &&\n      (Object.keys(sqlDialectPresets).includes(options.preset ?? '') ? { format: 'sql' } : null)),\n  };\n\n  const format = lc(optObj.format);\n\n  const {\n    fallbackExpression: fallbackExpression_option,\n    getOperators: getOperators_option,\n    operatorProcessor: operatorProcessor_option,\n    parseNumbers,\n    quoteFieldNamesWith: quoteFieldNamesWith_option,\n    ruleGroupProcessor: ruleGroupProcessor_option,\n    ruleProcessor: ruleProcessor_option,\n    validator,\n    valueProcessor: valueProcessor_option,\n    context,\n  } = optObj;\n\n  const getParseNumberBoolean = (inputType?: InputType | null): boolean | undefined => {\n    const parseNumberMethod = getParseNumberMethod({ parseNumbers, inputType });\n    return typeof parseNumberMethod === 'string'\n      ? true\n      : typeof parseNumbers === 'boolean'\n        ? parseNumbers\n        : undefined;\n  };\n\n  const operatorProcessor =\n    typeof operatorProcessor_option === 'function'\n      ? operatorProcessor_option\n      : (defaultOperatorProcessors[format] ?? defaultOperatorProcessor);\n\n  const valueProcessor: ValueProcessorByRule =\n    typeof valueProcessor_option === 'function'\n      ? isValueProcessorLegacy(valueProcessor_option)\n        ? r => valueProcessor_option(r.field, r.operator, r.value, r.valueSource)\n        : valueProcessor_option\n      : format === 'natural_language'\n        ? defaultValueProcessorNL\n        : valueProcessorCanActAsRuleProcessor.has(format)\n          ? (ruleProcessor_option ?? defaultRuleProcessors[format])\n          : defaultValueProcessorByRule;\n\n  const ruleProcessor =\n    (typeof ruleProcessor_option === 'function' ? ruleProcessor_option : null) ??\n    (valueProcessorCanActAsRuleProcessor.has(format) &&\n    typeof ruleProcessor_option !== 'function' &&\n    valueProcessor_option\n      ? valueProcessor\n      : null) ??\n    defaultRuleProcessors[format] ??\n    defaultRuleProcessorSQL;\n\n  const quoteFieldNamesWith = getQuoteFieldNamesWithArray(quoteFieldNamesWith_option);\n  const fields = toFullOptionList(optObj.fields) as FullOptionList<FullField>;\n  const getOperators: FormatQueryOptions['getOperators'] = (f, m) =>\n    toFullOptionList(getOperators_option(f, m) ?? /* istanbul ignore next */ []);\n\n  const fallbackExpression =\n    fallbackExpression_option ??\n    defaultFallbackExpressions[format] ??\n    defaultFallbackExpressions.sql!;\n\n  // #region Validation\n  let validationMap: ValidationMap = {};\n\n  // istanbul ignore else\n  if (typeof validator === 'function') {\n    const validationResult = validator(ruleGroup);\n    if (typeof validationResult === 'boolean') {\n      // istanbul ignore else\n      if (!validationResult) {\n        return format === 'parameterized'\n          ? { sql: fallbackExpression, params: [] }\n          : format === 'parameterized_named'\n            ? { sql: fallbackExpression, params: {} }\n            : format === 'mongodb'\n              ? `{${fallbackExpression}}`\n              : format === 'mongodb_query'\n                ? mongoDbFallback\n                : format === 'prisma'\n                  ? prismaFallback\n                  : format === 'jsonlogic'\n                    ? false\n                    : format === 'elasticsearch'\n                      ? {}\n                      : format === 'drizzle' || format === 'sequelize'\n                        ? undefined\n                        : fallbackExpression;\n      }\n    } else {\n      validationMap = validationResult;\n    }\n  }\n\n  const validatorMap: Record<string, RuleValidator> = {};\n  const uniqueFields = toFlatOptionArray(fields) satisfies FullField[];\n  for (const f of uniqueFields) {\n    // istanbul ignore else\n    if (typeof f.validator === 'function') {\n      validatorMap[f.value ?? /* istanbul ignore next */ f.name] = f.validator;\n    }\n  }\n\n  const validateRule = (rule: RuleType) => {\n    let validationResult: boolean | ValidationResult | undefined;\n    let fieldValidator: RuleValidator | undefined;\n    if (rule.id) {\n      validationResult = validationMap[rule.id];\n    }\n    if (uniqueFields.length > 0) {\n      const fieldArr = uniqueFields.filter(f => f.name === rule.field);\n      if (fieldArr.length > 0) {\n        const field = fieldArr[0];\n        // istanbul ignore else\n        if (typeof field.validator === 'function') {\n          fieldValidator = field.validator;\n        }\n      }\n    }\n    return [validationResult, fieldValidator] as const;\n  };\n  // #endregion\n\n  const finalOptions: FormatQueryFinalOptions = {\n    ...optObj,\n    fallbackExpression,\n    fields,\n    format,\n    getOperators,\n    getParseNumberBoolean,\n    quoteFieldNamesWith,\n    operatorProcessor,\n    ruleProcessor,\n    valueProcessor,\n    validateRule,\n    validationMap,\n    context,\n  };\n\n  if (typeof ruleGroupProcessor_option === 'function') {\n    return ruleGroupProcessor_option(ruleGroup, finalOptions);\n  }\n\n  switch (format) {\n    case 'json':\n    case 'json_without_ids': {\n      const rg = parseNumbers\n        ? produce(ruleGroup, g => numerifyValues(g, finalOptions))\n        : ruleGroup;\n      if (format === 'json_without_ids') {\n        return JSON.stringify(rg, (key, value) =>\n          // Remove `id` and `path` keys; leave everything else unchanged.\n          key === 'id' || key === 'path' ? undefined : bigIntJsonStringifyReplacer(key, value)\n        );\n      }\n      return JSON.stringify(rg, bigIntJsonStringifyReplacer, 2);\n    }\n\n    case 'sql':\n      return defaultRuleGroupProcessorSQL(ruleGroup, finalOptions);\n\n    case 'parameterized':\n    case 'parameterized_named':\n      return defaultRuleGroupProcessorParameterized(ruleGroup, finalOptions);\n\n    case 'mongodb':\n      return defaultRuleGroupProcessorMongoDB(ruleGroup, finalOptions);\n\n    case 'mongodb_query':\n      return defaultRuleGroupProcessorMongoDBQuery(ruleGroup, finalOptions);\n\n    case 'cel':\n      return defaultRuleGroupProcessorCEL(ruleGroup, finalOptions);\n\n    case 'spel':\n      return defaultRuleGroupProcessorSpEL(ruleGroup, finalOptions);\n\n    case 'jsonata':\n      return defaultRuleGroupProcessorJSONata(ruleGroup, finalOptions);\n\n    case 'jsonlogic':\n      return defaultRuleGroupProcessorJsonLogic(ruleGroup, finalOptions);\n\n    case 'elasticsearch':\n      return defaultRuleGroupProcessorElasticSearch(ruleGroup, finalOptions);\n\n    case 'natural_language':\n      return defaultRuleGroupProcessorNL(ruleGroup, finalOptions);\n\n    case 'ldap':\n      return defaultRuleGroupProcessorLDAP(ruleGroup, finalOptions);\n\n    case 'prisma':\n      return defaultRuleGroupProcessorPrisma(ruleGroup, finalOptions);\n\n    case 'drizzle':\n      return defaultRuleGroupProcessorDrizzle(ruleGroup, finalOptions);\n\n    case 'sequelize':\n      return defaultRuleGroupProcessorSequelize(ruleGroup, finalOptions);\n\n    default:\n      return '';\n  }\n}\n\nexport { formatQuery };\n","/**\n * Converts a given query object into one of the supported {@link index!ExportFormat ExportFormat} formats.\n *\n * @module formatQuery\n */\n\nimport type { RuleProcessor, ValueProcessorByRule, ValueProcessorLegacy } from '../../types';\nimport { defaultRuleProcessorCEL } from './defaultRuleProcessorCEL';\nimport { defaultRuleProcessorMongoDB } from './defaultRuleProcessorMongoDB';\nimport { defaultRuleProcessorSpEL } from './defaultRuleProcessorSpEL';\nimport { defaultValueProcessorByRule } from './defaultValueProcessorByRule';\n\nconst generateValueProcessor =\n  (vpbr: ValueProcessorByRule): ValueProcessorLegacy =>\n  (field, operator, value, valueSource) =>\n    vpbr({ field, operator, value, valueSource }, { parseNumbers: false });\n// TODO: Deprecate defaultValueProcessor.\n/**\n * Default value processor used by {@link formatQuery} for \"sql\" format.\n *\n * @group Export\n */\nexport const defaultValueProcessor: ValueProcessorLegacy = generateValueProcessor(\n  defaultValueProcessorByRule\n);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorMongoDB}.\n *\n * @group Export\n */\nexport const defaultMongoDBValueProcessor: ValueProcessorLegacy = generateValueProcessor(\n  defaultRuleProcessorMongoDB\n);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorCEL}.\n *\n * @group Export\n */\nexport const defaultCELValueProcessor: ValueProcessorLegacy =\n  generateValueProcessor(defaultRuleProcessorCEL);\n/**\n * @deprecated Prefer {@link defaultRuleProcessorSpEL}.\n *\n * @group Export\n */\nexport const defaultSpELValueProcessor: ValueProcessorLegacy =\n  generateValueProcessor(defaultRuleProcessorSpEL);\n\nexport * from './defaultRuleGroupProcessorCEL';\nexport * from './defaultRuleGroupProcessorDrizzle';\nexport * from './defaultRuleGroupProcessorElasticSearch';\nexport * from './defaultRuleGroupProcessorJSONata';\nexport * from './defaultRuleGroupProcessorJsonLogic';\nexport * from './defaultRuleGroupProcessorLDAP';\nexport * from './defaultRuleGroupProcessorMongoDB';\nexport * from './defaultRuleGroupProcessorMongoDBQuery';\nexport * from './defaultRuleGroupProcessorNL';\nexport * from './defaultRuleGroupProcessorParameterized';\nexport * from './defaultRuleGroupProcessorPrisma';\nexport * from './defaultRuleGroupProcessorSequelize';\nexport * from './defaultRuleGroupProcessorSpEL';\nexport * from './defaultRuleGroupProcessorSQL';\nexport * from './defaultRuleProcessorDrizzle';\nexport * from './defaultRuleProcessorElasticSearch';\nexport * from './defaultRuleProcessorJSONata';\nexport * from './defaultRuleProcessorJsonLogic';\nexport * from './defaultRuleProcessorLDAP';\nexport * from './defaultRuleProcessorMongoDBQuery';\nexport * from './defaultRuleProcessorNL';\nexport * from './defaultRuleProcessorParameterized';\nexport * from './defaultRuleProcessorPrisma';\nexport * from './defaultRuleProcessorSequelize';\nexport * from './defaultRuleProcessorSQL';\nexport * from './defaultValueProcessorNL';\nexport * from './formatQuery';\nexport * from './utils';\nexport {\n  defaultRuleProcessorCEL,\n  defaultRuleProcessorMongoDB,\n  defaultRuleProcessorSpEL,\n  defaultValueProcessorByRule,\n};\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorCEL}.\n *\n * @group Export\n */\nexport const defaultValueProcessorCELByRule: RuleProcessor = defaultRuleProcessorCEL;\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorMongoDB}.\n *\n * @group Export\n */\nexport const defaultValueProcessorMongoDBByRule: RuleProcessor = defaultRuleProcessorMongoDB;\n/**\n * @deprecated Renamed to {@link defaultRuleProcessorSpEL}.\n *\n * @group Export\n */\nexport const defaultValueProcessorSpELByRule: RuleProcessor = defaultRuleProcessorSpEL;\n","import type { Path, RuleGroupTypeAny, RuleType } from '../types';\nimport { isRuleGroup } from './isRuleGroup';\nimport { isPojo } from './misc';\n\n/**\n * Return type for {@link findPath}.\n */\nexport type FindPathReturnType = RuleGroupTypeAny | RuleType | null;\n\n/**\n * Returns the {@link RuleType} or {@link RuleGroupType}/{@link RuleGroupTypeIC}\n * at the given path within a query.\n */\nexport const findPath = (path: Path, query: RuleGroupTypeAny): FindPathReturnType => {\n  let target: FindPathReturnType = query;\n  let level = 0;\n  while (level < path.length && target && isRuleGroup(target)) {\n    const t: RuleGroupTypeAny | RuleType | string = target.rules[path[level]];\n    target = typeof t === 'string' ? null : t;\n    level++;\n  }\n\n  return level < path.length ? null : target;\n};\n\n/**\n * Returns the {@link RuleType} or {@link RuleGroupType}/{@link RuleGroupTypeIC}\n * with the given `id` within a query.\n */\nexport const findID = (id: string, query: RuleGroupTypeAny): FindPathReturnType => {\n  if (query.id === id) {\n    return query;\n  }\n\n  for (const rule of query.rules) {\n    if (typeof rule === 'string') continue;\n    if (rule.id === id) {\n      return rule;\n    } else if (isRuleGroup(rule)) {\n      const subRule = findID(id, rule);\n      if (subRule) {\n        return subRule;\n      }\n    }\n  }\n\n  return null;\n};\n\n/**\n * Returns the {@link Path} of the {@link RuleType} or {@link RuleGroupType}/{@link RuleGroupTypeIC}\n * with the given `id` within a query.\n */\nexport const getPathOfID = (id: string, query: RuleGroupTypeAny): Path | null => {\n  if (query.id === id) return [];\n\n  const idx = query.rules.findIndex(r => !(typeof r === 'string') && r.id === id);\n\n  if (idx >= 0) {\n    return [idx];\n  }\n\n  for (const [i, r] of Object.entries(query.rules)) {\n    if (isRuleGroup(r)) {\n      const subPath = getPathOfID(id, r);\n      if (Array.isArray(subPath)) {\n        return [Number.parseInt(i), ...subPath];\n      }\n    }\n  }\n\n  return null;\n};\n\n/**\n * Truncates the last element of an array and returns the result as a new array.\n */\nexport const getParentPath = (path: Path): Path => path.slice(0, -1);\n\n/**\n * Determines if two paths (each `Path`) are equivalent.\n */\nexport const pathsAreEqual = (path1: Path, path2: Path): boolean =>\n  path1.length === path2.length && path1.every((val, idx) => val === path2[idx]);\n\n/**\n * Determines if the first path is an ancestor of the second path. The first path must\n * be shorter and exactly match the second path up through the length of the first path.\n */\nexport const isAncestor = (maybeAncestor: Path, path: Path): boolean =>\n  maybeAncestor.length < path.length &&\n  new RegExp(`^${maybeAncestor.join('-')}`).test(path.join('-'));\n\n/**\n * Finds the deepest/longest path that two paths have in common.\n */\nexport const getCommonAncestorPath = (path1: Path, path2: Path): Path => {\n  const commonAncestorPath: Path = [];\n  const parentPath1 = getParentPath(path1);\n  const parentPath2 = getParentPath(path2);\n  let i = 0;\n\n  while (i < parentPath1.length && i < parentPath2.length && parentPath1[i] === parentPath2[i]) {\n    commonAncestorPath.push(parentPath2[i]);\n    i++;\n  }\n\n  return commonAncestorPath;\n};\n\n/**\n * Determines if the rule or group at the specified path is either disabled itself\n * or disabled by an ancestor group.\n */\nexport const pathIsDisabled = (path: Path, query: RuleGroupTypeAny): boolean => {\n  let disabled = !!query.disabled;\n  let target: RuleType | RuleGroupTypeAny = query;\n  let level = 0;\n  while (level < path.length && !disabled && isRuleGroup(target)) {\n    const t: RuleGroupTypeAny | RuleType | string = target.rules[path[level]];\n    if (isPojo(t) && (isRuleGroup(t) || ('field' in t && !!t.field))) {\n      disabled = !!t.disabled;\n      target = t;\n    }\n    level++;\n  }\n  return disabled;\n};\n","import type { AccessibleDescriptionGenerator as ADG } from '../types';\nimport { pathsAreEqual } from './pathUtils';\n\nexport const generateAccessibleDescription: ADG = params =>\n  pathsAreEqual([], params.path) ? `Query builder` : `Rule group at path ${params.path.join('-')}`;\n","// import type { UUID } from 'node:crypto';\ntype UUID = `${string}-${string}-${string}-${string}-${string}`;\n\nconst cryptoModule = globalThis.crypto;\n\n/**\n * Default `id` generator. Generates a valid v4 UUID. Uses `crypto.randomUUID()`\n * when available, otherwise uses an alternate method based on `getRandomValues`.\n * The returned string is guaranteed to match this regex:\n * ```\n * /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i\n * ```\n * @returns Valid v4 UUID\n */\n// Default implementation adapted from https://stackoverflow.com/a/68141099/217579\n// istanbul ignore next\nexport let generateID = (): UUID =>\n  '00-0-4-2-000'.replaceAll(/[^-]/g, s =>\n    (((Math.random() + Math.trunc(s as unknown as number)) * 0x1_00_00) >> Number.parseInt(s))\n      .toString(16)\n      .padStart(4, '0')\n  ) as UUID;\n\n// Improve on the default implementation by using the crypto package if it's available\n// istanbul ignore else\nif (cryptoModule) {\n  // istanbul ignore else\n  if (typeof cryptoModule.randomUUID === 'function') {\n    generateID = () => cryptoModule.randomUUID();\n  } else if (typeof cryptoModule.getRandomValues === 'function') {\n    // `randomUUID` is much simpler and faster, but it's only guaranteed to be\n    // available in secure contexts (server-side, https, etc.). `generateID`\n    // doesn't really need to be cryptographically secure, it only needs a\n    // fairly low chance of collisions. We fall back to the always-available\n    // `getRandomValues` here (while still generating a valid v4 UUID) when\n    // `randomUUID` is not available.\n    const position19vals = '89ab';\n    const container = new Uint32Array(32);\n\n    generateID = () => {\n      cryptoModule.getRandomValues(container);\n      let id = (container[0] % 16).toString(16);\n      for (let i = 1; i < 32; i++) {\n        if (i === 12) {\n          id = `${id}${'4'}`;\n        } else if (i === 16) {\n          id = `${id}${position19vals[container[17] % 4]}`;\n        } else {\n          id = `${id}${(container[i] % 16).toString(16)}`;\n        }\n\n        if (i === 7 || i === 11 || i === 15 || i === 19) {\n          id = `${id}${'-'}`;\n        }\n      }\n      return id as UUID;\n    };\n  }\n}\n","import { defaultMatchModes } from '../defaults';\nimport type {\n  FlexibleOption,\n  FullField,\n  GetOptionIdentifierType,\n  MatchMode,\n  MatchModeOptions,\n} from '../types';\nimport { lc } from './misc';\nimport { isFlexibleOptionArray, toFullOption, toFullOptionList } from './optGroupUtils';\n\nconst dummyFD = {\n  name: 'name',\n  value: 'name',\n  matchModes: null,\n  label: 'label',\n};\n\n/**\n * Utility function to get the match modes array for the given\n * field. If the field definition does not define a `matchModes`\n * property, the `getMatchModes` prop is used. Returns\n * `FullOption<MatchMode>[]` of all match modes by default.\n */\nexport const getMatchModesUtil = <F extends FullField>(\n  fieldData: F,\n  getMatchModes?: (\n    field: GetOptionIdentifierType<F>,\n    misc: { fieldData: F }\n  ) => boolean | MatchMode[] | FlexibleOption<MatchMode>[]\n): MatchModeOptions => {\n  // TypeScript doesn't allow it directly, but in practice\n  // `fieldData` can end up being undefined or null. The nullish\n  // coalescing assignment below avoids errors like\n  // \"TypeError: Cannot read properties of undefined (reading 'name')\"\n  const fd = fieldData ? toFullOption(fieldData) : /* istanbul ignore next */ dummyFD;\n\n  let matchModes: boolean | MatchMode[] | FlexibleOption<MatchMode>[] = fd.matchModes ?? false;\n\n  if (!matchModes && getMatchModes) {\n    matchModes = getMatchModes(fd.value as GetOptionIdentifierType<F>, {\n      fieldData: fd as F,\n    });\n  }\n\n  if (matchModes === true) {\n    return defaultMatchModes;\n  } else if (matchModes === false) {\n    return [];\n  }\n\n  if (isFlexibleOptionArray(matchModes)) {\n    return toFullOptionList(matchModes) as MatchModeOptions;\n  }\n\n  return (matchModes?.map(\n    mm =>\n      defaultMatchModes.find(dmm => dmm.value === lc(mm)) ?? {\n        name: mm,\n        value: mm,\n        label: mm,\n      }\n  ) ?? []) as MatchModeOptions;\n};\n","import { standardClassnames } from '../defaults';\nimport type { ValidationResult } from '../types';\n\n/**\n * Gets the standard classname for valid or invalid components\n * based on the given validation result.\n */\nexport const getValidationClassNames = (\n  validationResult: boolean | ValidationResult\n): '' | (typeof standardClassnames)['valid'] | (typeof standardClassnames)['invalid'] => {\n  const valid =\n    typeof validationResult === 'boolean'\n      ? validationResult\n      : typeof validationResult === 'object' && validationResult !== null\n        ? validationResult.valid\n        : null;\n  return typeof valid === 'boolean'\n    ? valid\n      ? standardClassnames.valid\n      : standardClassnames.invalid\n    : '';\n};\n","import type {\n  FullField,\n  GetOptionIdentifierType,\n  ValueSourceFlexibleOptions,\n  ValueSourceFullOptions,\n  ValueSources,\n} from '../types';\nimport { lc } from './misc';\nimport { isFlexibleOptionArray, toFullOption, toFullOptionList } from './optGroupUtils';\n\nconst defaultValueSourcesArray: ValueSourceFullOptions = [\n  { name: 'value', value: 'value', label: 'value' },\n];\n\nconst dummyFD = {\n  name: 'name',\n  value: 'name',\n  valueSources: null,\n  label: 'label',\n};\n\n/**\n * Utility function to get the value sources array for the given\n * field and operator. If the field definition does not define a\n * `valueSources` property, the `getValueSources` prop is used.\n * Returns `[FullOption<\"value\">]` by default.\n */\nexport const getValueSourcesUtil = <F extends FullField, O extends string>(\n  fieldData: F,\n  operator: string,\n  getValueSources?: (\n    field: GetOptionIdentifierType<F>,\n    operator: O,\n    misc: { fieldData: F }\n  ) => ValueSources | ValueSourceFlexibleOptions\n): ValueSourceFullOptions => {\n  // TypeScript doesn't allow it directly, but in practice\n  // `fieldData` can end up being undefined or null. The nullish\n  // coalescing assignment below avoids errors like\n  // \"TypeError: Cannot read properties of undefined (reading 'name')\"\n  const fd = fieldData ? toFullOption(fieldData) : dummyFD;\n\n  let valueSourcesNEW:\n    | false\n    | ValueSources\n    | ValueSourceFlexibleOptions\n    | ((operator: string) => ValueSources | ValueSourceFlexibleOptions) = fd.valueSources ?? false;\n\n  if (typeof valueSourcesNEW === 'function') {\n    valueSourcesNEW = valueSourcesNEW(operator as O);\n  }\n\n  if (!valueSourcesNEW && getValueSources) {\n    valueSourcesNEW = getValueSources(fd.value as GetOptionIdentifierType<F>, operator as O, {\n      fieldData: fd as F,\n    });\n  }\n\n  if (!valueSourcesNEW) {\n    return defaultValueSourcesArray;\n  }\n\n  if (isFlexibleOptionArray(valueSourcesNEW)) {\n    return toFullOptionList(valueSourcesNEW as ValueSourceFullOptions) as ValueSourceFullOptions;\n  }\n\n  return valueSourcesNEW.map(\n    vs =>\n      defaultValueSourcesArray.find(dmm => dmm.value === lc(vs)) ?? {\n        name: vs,\n        value: vs,\n        label: vs,\n      }\n  ) as ValueSourceFullOptions;\n};\n","import { objectEntries, objectKeys } from '@react-querybuilder/core';\nimport { produce } from 'immer';\n\n/**\n * Merges any number of partial translations into a single definition.\n */\nexport const mergeAnyTranslations = (\n  base: Record<string, Record<string, unknown>>,\n  ...otherTranslations: (Record<string, Record<string, unknown>> | undefined)[]\n): Record<string, Record<string, unknown>> =>\n  produce(base, draft => {\n    for (const translations of otherTranslations) {\n      // istanbul ignore else\n      if (translations) {\n        for (const t of objectKeys(translations)) {\n          if (draft[t]) {\n            Object.assign(draft[t], translations[t]);\n          } else {\n            Object.assign(draft, { [t]: translations[t] });\n          }\n        }\n      }\n    }\n  });\n\nexport const mergeAnyTranslation = (\n  el: string,\n  keyPropContextMap: Record<string, [unknown, unknown]>,\n  defaults?: Record<string, Record<string, unknown>>\n): Record<string, Record<string, unknown>> | undefined => {\n  const finalKeys = objectEntries(keyPropContextMap)\n    .map(([key, [pT, cT]]) => [key, pT ?? cT ?? defaults?.[el]?.[key]])\n    .filter(k => !!k[1]);\n  if (finalKeys.length > 0 || defaults) {\n    const defaultProperties = defaults?.[el] ?? {};\n    const finalObject = Object.assign({}, defaultProperties, Object.fromEntries(finalKeys));\n    return { [el]: finalObject };\n  }\n  return undefined;\n};\n","import type { Classnames } from '../types';\nimport { clsx } from './clsx';\n\ntype MergeClassnamesParams = (Partial<Classnames> | undefined)[];\n\nconst joinClassnamesByName = (name: keyof Classnames, args: MergeClassnamesParams) =>\n  clsx(args.map(c => clsx(c?.[name])));\n\n/**\n * Merges a list of partial {@link Classnames} definitions into a single definition.\n */\nexport const mergeClassnames = (...args: MergeClassnamesParams): Classnames => ({\n  queryBuilder: joinClassnamesByName('queryBuilder', args),\n  ruleGroup: joinClassnamesByName('ruleGroup', args),\n  header: joinClassnamesByName('header', args),\n  body: joinClassnamesByName('body', args),\n  combinators: joinClassnamesByName('combinators', args),\n  addRule: joinClassnamesByName('addRule', args),\n  addGroup: joinClassnamesByName('addGroup', args),\n  cloneRule: joinClassnamesByName('cloneRule', args),\n  cloneGroup: joinClassnamesByName('cloneGroup', args),\n  removeGroup: joinClassnamesByName('removeGroup', args),\n  rule: joinClassnamesByName('rule', args),\n  fields: joinClassnamesByName('fields', args),\n  operators: joinClassnamesByName('operators', args),\n  value: joinClassnamesByName('value', args),\n  removeRule: joinClassnamesByName('removeRule', args),\n  notToggle: joinClassnamesByName('notToggle', args),\n  shiftActions: joinClassnamesByName('shiftActions', args),\n  dragHandle: joinClassnamesByName('dragHandle', args),\n  lockRule: joinClassnamesByName('lockRule', args),\n  lockGroup: joinClassnamesByName('lockGroup', args),\n  muteRule: joinClassnamesByName('muteRule', args),\n  muteGroup: joinClassnamesByName('muteGroup', args),\n  muted: joinClassnamesByName('muted', args),\n  valueSource: joinClassnamesByName('valueSource', args),\n  actionElement: joinClassnamesByName('actionElement', args),\n  valueSelector: joinClassnamesByName('valueSelector', args),\n  betweenRules: joinClassnamesByName('betweenRules', args),\n  valid: joinClassnamesByName('valid', args),\n  invalid: joinClassnamesByName('invalid', args),\n  dndDragging: joinClassnamesByName('dndDragging', args),\n  dndOver: joinClassnamesByName('dndOver', args),\n  dndCopy: joinClassnamesByName('dndCopy', args),\n  dndGroup: joinClassnamesByName('dndGroup', args),\n  dndDropNotAllowed: joinClassnamesByName('dndDropNotAllowed', args),\n  disabled: joinClassnamesByName('disabled', args),\n  valueListItem: joinClassnamesByName('valueListItem', args),\n  matchMode: joinClassnamesByName('matchMode', args),\n  matchThreshold: joinClassnamesByName('matchThreshold', args),\n  branches: joinClassnamesByName('branches', args),\n  hasSubQuery: joinClassnamesByName('hasSubQuery', args),\n});\n","import type { QueryBuilderFlags } from 'react-querybuilder';\nimport { queryBuilderFlagDefaults } from '../defaults';\nimport { objectEntries } from './objectUtils';\n\nconst preferPropDefaultTrue = (prop?: boolean, context?: boolean) =>\n  prop === false ? false : prop ? true : !(context === false);\n\nconst preferPropDefaultFalse = (prop?: boolean, context?: boolean) =>\n  prop ? true : prop === false ? false : !!context;\n\n/**\n * For given default, prop, and context values, return the first provided of prop,\n * context, and default, in that order.\n */\nexport const preferProp = (\n  def: boolean,\n  prop?: boolean,\n  context?: boolean,\n  doNotFinalize?: boolean\n): boolean =>\n  !doNotFinalize\n    ? def\n      ? preferPropDefaultTrue(prop, context)\n      : preferPropDefaultFalse(prop, context)\n    : (prop ?? (context as boolean));\n\n/**\n * For given default, prop, and context values, return the first provided of prop,\n * context, and default, in that order.\n */\n// oxlint-disable-next-line typescript/no-explicit-any\nexport const preferAnyProp = (def?: any, prop?: any, context?: any): any =>\n  prop !== undefined && prop != null\n    ? prop\n    : context !== undefined && context != null\n      ? context\n      : def;\n\n/**\n * For a given set of defaults, props, and context values, return the first provided of prop,\n * context, and default—in that order—for each property in the defaults object.\n */\nexport const preferFlagProps = (\n  props: QueryBuilderFlags = {},\n  contextVals: QueryBuilderFlags = {},\n  finalize?: boolean\n): QueryBuilderFlags =>\n  objectEntries(queryBuilderFlagDefaults).reduce<QueryBuilderFlags>((acc, [key, def]) => {\n    acc[key] = preferProp(def, props[key], contextVals[key], !finalize);\n    return acc;\n  }, {});\n","import { produce } from 'immer';\nimport type {\n  RuleGroupArray,\n  RuleGroupICArray,\n  RuleGroupType,\n  RuleGroupTypeAny,\n  RuleGroupTypeIC,\n  RuleType,\n} from '../types';\nimport { generateID } from './generateID';\nimport { isRuleGroup } from './isRuleGroup';\n\n/**\n * Options for {@link prepareRule}/{@link prepareRuleGroup}.\n */\nexport interface PreparerOptions {\n  idGenerator?: () => string;\n}\n\n/**\n * Ensures that a rule is valid by adding an `id` property if it does not already exist.\n */\nexport const prepareRule = (\n  rule: RuleType,\n  { idGenerator = generateID }: PreparerOptions = {}\n): RuleType =>\n  produce(rule, draft => {\n    if (!draft.id) {\n      draft.id = idGenerator();\n    }\n  });\n\n/**\n * Ensures that a rule group is valid by recursively adding an `id` property to the group itself\n * and all its rules and subgroups where one does not already exist.\n */\nexport const prepareRuleGroup = <RG extends RuleGroupTypeAny>(\n  queryObject: RG,\n  { idGenerator = generateID }: PreparerOptions = {}\n): RG =>\n  produce(queryObject, draft => {\n    if (!draft.id) {\n      draft.id = idGenerator();\n    }\n    draft.rules = draft.rules.map(r =>\n      typeof r === 'string'\n        ? r\n        : isRuleGroup(r)\n          ? prepareRuleGroup(r, { idGenerator })\n          : prepareRule(r, { idGenerator })\n    ) as RuleGroupArray | RuleGroupICArray;\n  });\n\n/**\n * Ensures that a rule or group is valid. See {@link prepareRule} and {@link prepareRuleGroup}.\n */\nexport const prepareRuleOrGroup = <RG extends RuleGroupTypeAny>(\n  rg: RG | RuleType,\n  { idGenerator = generateID }: PreparerOptions = {}\n): RuleGroupType | RuleGroupTypeIC | RuleType =>\n  isRuleGroup(rg) ? prepareRuleGroup(rg, { idGenerator }) : prepareRule(rg, { idGenerator });\n","import type { SetRequired } from 'type-fest';\nimport type { RuleGroupTypeAny, RuleType } from '../types';\nimport { generateID } from './generateID';\nimport { isRuleGroup } from './isRuleGroup';\nimport { isPojo } from './misc';\n\n/**\n * Options object for {@link regenerateID}/{@link regenerateIDs}.\n */\nexport interface RegenerateIdOptions {\n  idGenerator?: () => string;\n}\n\n/**\n * Generates a new `id` property for a rule.\n */\nexport const regenerateID = <R extends RuleType>(\n  rule: R,\n  { idGenerator = generateID }: RegenerateIdOptions = {}\n): SetRequired<R, 'id'> => structuredClone({ ...rule, id: idGenerator() } as SetRequired<R, 'id'>);\n\n/**\n * Recursively generates new `id` properties for a rule group and all its rules and subgroups.\n */\nexport const regenerateIDs = <RG>(\n  subject: RG,\n  { idGenerator = generateID }: RegenerateIdOptions = {}\n): RG & { id: string } => {\n  if (!isPojo(subject)) return subject as RG & { id: string };\n\n  if (!isRuleGroup(subject)) {\n    return structuredClone({\n      ...subject,\n      id: idGenerator(),\n    }) as RG & { id: string };\n  }\n\n  const newGroup = { ...subject, id: idGenerator() } as RuleGroupTypeAny;\n\n  // istanbul ignore else\n  if (Array.isArray(newGroup.rules)) {\n    // oxlint-disable-next-line no-explicit-any\n    (newGroup.rules as any) = subject.rules.map((r: unknown) =>\n      typeof r === 'string'\n        ? r\n        : isRuleGroup(r)\n          ? regenerateIDs(r, { idGenerator })\n          : regenerateID(r as RuleType, { idGenerator })\n    );\n  }\n\n  return newGroup as unknown as RG & { id: string };\n};\n","import { produce } from 'immer';\nimport { defaultCombinators } from '../defaults';\nimport type {\n  MatchModeOptions,\n  OptionList,\n  Path,\n  RuleGroupTypeAny,\n  RuleType,\n  UpdateableProperties,\n  ValueSourceFlexibleOptions,\n  ValueSources,\n} from '../types';\nimport { generateID } from './generateID';\nimport { getValueSourcesUtil } from './getValueSourcesUtil';\nimport { isRuleGroup, isRuleGroupType, isRuleGroupTypeIC } from './isRuleGroup';\nimport { getFirstOption, getOption } from './optGroupUtils';\nimport {\n  findID,\n  findPath,\n  getCommonAncestorPath,\n  getParentPath,\n  getPathOfID,\n  pathsAreEqual,\n} from './pathUtils';\nimport { prepareRuleOrGroup } from './prepareQueryObjects';\nimport { regenerateIDs } from './regenerateIDs';\n\n/**\n * Options for {@link add}.\n *\n * @group Query Tools\n */\nexport interface AddOptions {\n  /**\n   * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n   * combinators), then the first combinator in this list will be inserted\n   * before the new rule/group if the parent group is not empty. This option\n   * is overridden by `combinatorPreceding`.\n   */\n  combinators?: OptionList;\n  /**\n   * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n   * combinators), then this combinator will be inserted before the new rule/group\n   * if the parent group is not empty. This option will supersede `combinators`.\n   */\n  combinatorPreceding?: string;\n  /**\n   * ID generator.\n   */\n  idGenerator?: () => string;\n}\n/**\n * Adds a rule or group to a query.\n * @returns The new query with the rule or group added.\n *\n * @group Query Tools\n */\nexport const add = <RG extends RuleGroupTypeAny>(\n  /** The query to update. */\n  query: RG,\n  /** The rule or group to add. */\n  ruleOrGroup: RG | RuleType,\n  /** Path or ID of the group to add to. */\n  parentPathOrID: Path | string,\n  /** Options. */\n  {\n    combinators = defaultCombinators,\n    combinatorPreceding,\n    idGenerator = generateID,\n  }: AddOptions = {}\n): RG =>\n  produce(query, draft => {\n    const parent = Array.isArray(parentPathOrID)\n      ? findPath(parentPathOrID, draft)\n      : findID(parentPathOrID, draft);\n\n    if (!parent || !isRuleGroup(parent)) return;\n\n    if (isRuleGroupTypeIC(parent) && parent.rules.length > 0) {\n      const prevCombinator = parent.rules.at(-2);\n      parent.rules.push(\n        // @ts-expect-error This is technically a type violation until the next push\n        // to the rules array, but that happens immediately and unconditionally so\n        // there's no significant risk.\n        combinatorPreceding ??\n          (typeof prevCombinator === 'string' ? prevCombinator : getFirstOption(combinators))\n      );\n    }\n    // `as RuleType` is only here to avoid the ambiguity with `RuleGroupTypeAny`\n    parent.rules.push(prepareRuleOrGroup(ruleOrGroup, { idGenerator }) as RuleType);\n  });\n\n/**\n * Options for {@link update}.\n *\n * @group Query Tools\n */\nexport interface UpdateOptions {\n  /**\n   * When updating the `field` of a rule, the rule's `operator`, `value`, and `valueSource`\n   * will be reset to their respective defaults. Defaults to `true`.\n   */\n  resetOnFieldChange?: boolean;\n  /**\n   * When updating the `operator` of a rule, the rule's `value` and `valueSource`\n   * will be reset to their respective defaults. Defaults to `false`.\n   */\n  resetOnOperatorChange?: boolean;\n  /**\n   * Determines the default operator name for a given field.\n   */\n  getRuleDefaultOperator?: (field: string) => string;\n  /**\n   * Determines the valid value sources for a given field and operator.\n   */\n  getValueSources?: (field: string, operator: string) => ValueSources | ValueSourceFlexibleOptions;\n  /**\n   * Gets the default value for a given rule, in case the value needs to be reset.\n   */\n  // oxlint-disable-next-line typescript/no-explicit-any\n  getRuleDefaultValue?: (rule: RuleType) => any;\n  /**\n   * Determines the valid match modes for a given field.\n   */\n  getMatchModes?: (field: string) => MatchModeOptions;\n}\n/**\n * Updates a property of a rule or group within a query.\n * @returns The new query with the rule or group property updated.\n *\n * @group Query Tools\n */\nexport const update = <RG extends RuleGroupTypeAny>(\n  /** The query to update. */\n  query: RG,\n  /** The name of the property to update. */\n  prop: UpdateableProperties,\n  /** The new value of the property. */\n  // oxlint-disable-next-line typescript/no-explicit-any\n  value: any,\n  /** The path or ID of the rule or group to update. */\n  pathOrID: Path | string,\n  /** Options. */\n  {\n    resetOnFieldChange = true,\n    resetOnOperatorChange = false,\n    getRuleDefaultOperator = () => '=',\n    getValueSources = () => ['value'],\n    getRuleDefaultValue = () => '',\n    getMatchModes = () => [],\n  }: UpdateOptions = {}\n): RG =>\n  produce(query, draft => {\n    const path = Array.isArray(pathOrID) ? pathOrID : getPathOfID(pathOrID, draft);\n\n    // Ignore invalid paths/ids\n    if (!path) return;\n\n    // Independent combinators\n    if (prop === 'combinator' && !isRuleGroupType(draft)) {\n      const parentRules = (findPath(getParentPath(path), draft) as RG).rules;\n      // Only update an independent combinator if it occupies an odd index\n      if (path.at(-1)! % 2 === 1) {\n        parentRules[path.at(-1)!] = value;\n      }\n      return;\n    }\n\n    const ruleOrGroup = findPath(path, draft);\n\n    // Ignore invalid paths\n    if (!ruleOrGroup) return;\n\n    const isGroup = isRuleGroup(ruleOrGroup);\n\n    // Only update if there is actually a change\n    // @ts-expect-error prop can refer to rule or group properties\n    if (ruleOrGroup[prop] === value) return;\n\n    // Handle valueSource updates later\n    if (prop !== 'valueSource') {\n      // @ts-expect-error prop can refer to rule or group properties\n      ruleOrGroup[prop] = value;\n    }\n\n    // If this is a group, there's no more to do\n    if (isGroup) return;\n\n    let resetValueSource = false;\n    let resetValue = false;\n\n    if (prop === 'field') {\n      const fromFieldMatchModes = getMatchModes(ruleOrGroup.field);\n      const toFieldMatchModes = getMatchModes(value);\n\n      if (toFieldMatchModes.length === 0) {\n        delete ruleOrGroup.match;\n      } else {\n        const nextMatchMode =\n          ruleOrGroup.match?.mode && getOption(toFieldMatchModes, ruleOrGroup.match.mode)\n            ? null\n            : getFirstOption(toFieldMatchModes);\n        if (nextMatchMode) {\n          ruleOrGroup.match = { mode: nextMatchMode, threshold: 1 };\n        }\n      }\n\n      if (fromFieldMatchModes.length > 0 || toFieldMatchModes.length > 0) {\n        // Force `resetOnFieldChange` when field is updated FROM or TO one that has match modes\n        resetOnFieldChange = true;\n      }\n    }\n\n    // Set default operator, valueSource, and value for field change\n    if (resetOnFieldChange && prop === 'field') {\n      ruleOrGroup.operator = getRuleDefaultOperator(value);\n      resetValueSource = true;\n      resetValue = true;\n    }\n\n    // Set default valueSource and value for operator change\n    if (resetOnOperatorChange && prop === 'operator') {\n      resetValueSource = true;\n      resetValue = true;\n    }\n\n    const valueSources = getValueSourcesUtil(\n      { name: ruleOrGroup.field, value: ruleOrGroup.field, label: '' },\n      ruleOrGroup.operator,\n      getValueSources\n    );\n    const defaultValueSource = getFirstOption(valueSources);\n    if (\n      (resetValueSource &&\n        ruleOrGroup.valueSource &&\n        defaultValueSource !== ruleOrGroup.valueSource) ||\n      (prop === 'valueSource' && value !== ruleOrGroup.valueSource)\n    ) {\n      // Only reset the value if we're changing the valueSource either\n      // 1) from `undefined` to something that is _not_ the default, or\n      // 2) from the current (defined) value to something else\n      resetValue =\n        !!ruleOrGroup.valueSource || (!ruleOrGroup.valueSource && value !== defaultValueSource);\n      ruleOrGroup.valueSource = resetValueSource ? defaultValueSource : value;\n    }\n\n    if (resetValue) {\n      // The default value should be a valid field name if defaultValueSource is 'field'\n      ruleOrGroup.value = getRuleDefaultValue(ruleOrGroup);\n    }\n  });\n\n/**\n * Removes a rule or group from a query.\n * @returns The new query with the rule or group removed.\n *\n * @group Query Tools\n */\nexport const remove = <RG extends RuleGroupTypeAny>(\n  /** The query to update. */\n  query: RG,\n  /** The path or ID of the rule or group to remove. */\n  pathOrID: Path | string\n): RG => {\n  const path = Array.isArray(pathOrID) ? pathOrID : getPathOfID(pathOrID, query);\n\n  // Ignore invalid paths/ids\n  if (!path) return query;\n\n  if (\n    // Can't remove the root group\n    path.length === 0 ||\n    // Can't independently remove independent combinators\n    (!isRuleGroupType(query) && !findPath(path, query))\n  ) {\n    return query;\n  }\n\n  return produce(query, draft => {\n    const index = path.at(-1)!;\n    const parent = findPath(getParentPath(path), draft);\n    if (parent && isRuleGroup(parent)) {\n      if (!isRuleGroupType(parent) && parent.rules.length > 1) {\n        const idxStartDelete = index === 0 ? 0 : index - 1;\n        parent.rules.splice(idxStartDelete, 2);\n      } else {\n        parent.rules.splice(index, 1);\n      }\n    }\n  });\n};\n\nconst getNextPath = (\n  query: RuleGroupTypeAny,\n  currentPath: Path,\n  newPathOrShiftDirection: Path | 'up' | 'down'\n): Path => {\n  if (Array.isArray(newPathOrShiftDirection)) {\n    return newPathOrShiftDirection;\n  }\n\n  const ic = isRuleGroupTypeIC(query);\n\n  if (newPathOrShiftDirection === 'up') {\n    if (pathsAreEqual(currentPath, [0])) {\n      return currentPath;\n    } else if (currentPath.at(-1) === 0) {\n      const parentPath = getParentPath(currentPath);\n      return [...getParentPath(parentPath), Math.max(0, parentPath.at(-1)! - (ic ? 1 : 0))];\n    } else {\n      const evaluationPath = [\n        ...getParentPath(currentPath),\n        Math.max(0, currentPath.at(-1)! - (ic ? 2 : 1)),\n      ];\n      const entityAtTarget = findPath(evaluationPath, query);\n      if (isRuleGroup(entityAtTarget)) {\n        return [...evaluationPath, entityAtTarget.rules.length];\n      } else {\n        const targetPath = [\n          ...getParentPath(currentPath),\n          Math.max(0, currentPath.at(-1)! - (ic ? 3 : 1)),\n        ];\n        return targetPath;\n      }\n    }\n  } else if (newPathOrShiftDirection === 'down') {\n    if (pathsAreEqual([query.rules.length - 1], currentPath)) {\n      return currentPath;\n    } else if (\n      currentPath.at(-1) ===\n      (findPath(getParentPath(currentPath), query) as RuleGroupTypeAny).rules.length - 1\n    ) {\n      const parentPath = getParentPath(currentPath);\n      return [...getParentPath(parentPath), parentPath.at(-1)! + 1];\n    } else {\n      const evaluationPath = [...getParentPath(currentPath), currentPath.at(-1)! + (ic ? 2 : 1)];\n      const entityToEvaluate = findPath(evaluationPath, query);\n      if (isRuleGroup(entityToEvaluate)) {\n        return [...evaluationPath, 0];\n      } else {\n        const targetPath = [...getParentPath(currentPath), currentPath.at(-1)! + (ic ? 3 : 2)];\n        return targetPath;\n      }\n    }\n  }\n\n  return currentPath;\n};\n\n/**\n * Options for {@link move}.\n *\n * @group Query Tools\n */\nexport interface MoveOptions {\n  /**\n   * When `true`, the source rule/group will not be removed from its original path.\n   */\n  clone?: boolean;\n  /**\n   * If the query extends `RuleGroupTypeIC` (i.e. the query is using independent\n   * combinators), then the first combinator in this list will be inserted before\n   * the rule/group if necessary.\n   */\n  combinators?: OptionList;\n  /**\n   * ID generator.\n   */\n  idGenerator?: () => string;\n}\n/**\n * Moves a rule or group from one path to another. In the options parameter, pass\n * `{ clone: true }` to copy instead of move.\n * @returns The new query with the rule or group moved or cloned.\n *\n * @group Query Tools\n */\nexport const move = <RG extends RuleGroupTypeAny>(\n  /** The query to update. */\n  query: RG,\n  /** ID or original path of the rule or group to move. */\n  oldPathOrID: Path | string,\n  /** Path to move the rule or group to, or a shift direction. */\n  newPath: Path | 'up' | 'down',\n  /** Options. */\n  { clone = false, combinators = defaultCombinators, idGenerator = generateID }: MoveOptions = {}\n): RG => {\n  const oldPath = Array.isArray(oldPathOrID) ? oldPathOrID : getPathOfID(oldPathOrID, query);\n\n  // Ignore invalid paths/ids\n  if (!oldPath) return query;\n\n  const nextPath = getNextPath(query, oldPath, newPath);\n\n  // Don't move to the same location or a path that doesn't exist yet\n  if (\n    oldPath.length === 0 ||\n    pathsAreEqual(oldPath, nextPath) ||\n    !findPath(getParentPath(nextPath), query)\n  ) {\n    return query;\n  }\n\n  const ruleOrGroupOriginal = findPath(oldPath, query);\n  if (!ruleOrGroupOriginal) {\n    return query;\n  }\n  const ruleOrGroup = clone\n    ? regenerateIDs(ruleOrGroupOriginal as RuleGroupTypeAny, { idGenerator })\n    : ruleOrGroupOriginal;\n\n  return produce(query, draft => {\n    const independentCombinators = isRuleGroupTypeIC(draft);\n    const parentOfRuleToRemove = findPath(getParentPath(oldPath), draft) as RG;\n    const ruleToRemoveIndex = oldPath.at(-1)!;\n    const oldPrevCombinator =\n      independentCombinators && ruleToRemoveIndex > 0\n        ? (parentOfRuleToRemove.rules[ruleToRemoveIndex - 1] as string)\n        : null;\n    const oldNextCombinator =\n      independentCombinators && ruleToRemoveIndex < parentOfRuleToRemove.rules.length - 1\n        ? (parentOfRuleToRemove.rules[ruleToRemoveIndex + 1] as string)\n        : null;\n\n    // Remove the source item if not cloning\n    if (!clone) {\n      const idxStartDelete = independentCombinators\n        ? Math.max(0, ruleToRemoveIndex - 1)\n        : ruleToRemoveIndex;\n      const deleteLength = independentCombinators ? 2 : 1;\n      parentOfRuleToRemove.rules.splice(idxStartDelete, deleteLength);\n    }\n\n    const newNewPath = [...nextPath];\n    const commonAncestorPath = getCommonAncestorPath(oldPath, nextPath);\n    if (\n      !clone &&\n      oldPath.length === commonAncestorPath.length + 1 &&\n      nextPath[commonAncestorPath.length] > oldPath[commonAncestorPath.length]\n    ) {\n      // Getting here means there will be a shift of paths upward at the common\n      // ancestor level because the object at `oldPath` will be spliced out. The\n      // real new path should therefore be one or two higher than `newPathCalc`.\n      newNewPath[commonAncestorPath.length] -= independentCombinators ? 2 : 1;\n    }\n    const newNewParentPath = getParentPath(newNewPath);\n    const parentToInsertInto = findPath(newNewParentPath, draft) as RG;\n    const newIndex = newNewPath.at(-1)!;\n\n    /**\n     * This function 1) glosses over the need for type assertions to splice directly\n     * into `parentToInsertInto.rules`, and 2) shortens the actual insertion code.\n     */\n    // oxlint-disable-next-line typescript/no-explicit-any\n    const insertRuleOrGroup = (...args: any[]) =>\n      parentToInsertInto.rules.splice(newIndex, 0, ...args);\n\n    // Insert the source item at the target path\n    if (parentToInsertInto.rules.length === 0 || !independentCombinators) {\n      insertRuleOrGroup(ruleOrGroup);\n    } else {\n      if (newIndex === 0) {\n        if (ruleToRemoveIndex === 0 && oldNextCombinator) {\n          insertRuleOrGroup(ruleOrGroup, oldNextCombinator);\n        } else {\n          const newNextCombinator =\n            parentToInsertInto.rules[1] ?? oldPrevCombinator ?? getFirstOption(combinators);\n          insertRuleOrGroup(ruleOrGroup, newNextCombinator);\n        }\n      } else {\n        if (oldPrevCombinator) {\n          insertRuleOrGroup(oldPrevCombinator, ruleOrGroup);\n        } else {\n          const newPrevCombinator =\n            parentToInsertInto.rules[newIndex - 2] ??\n            oldNextCombinator ??\n            getFirstOption(combinators);\n          insertRuleOrGroup(newPrevCombinator, ruleOrGroup);\n        }\n      }\n    }\n  });\n};\n\n/**\n * Options for {@link insert}.\n *\n * @group Query Tools\n */\nexport interface InsertOptions {\n  /**\n   * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n   * combinators), then the first combinator in this list will be inserted\n   * before the new rule/group if the parent group is not empty. This option\n   * is overridden by `combinatorPreceding`.\n   */\n  combinators?: OptionList;\n  /**\n   * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n   * combinators), then this combinator will be inserted before the new rule/group\n   * if the parent group is not empty and the new rule/group is not the first in the\n   * group (`path.at(-1) > 0`). This option will supersede `combinators`.\n   */\n  combinatorPreceding?: string;\n  /**\n   * If the query extends `RuleGroupTypeIC` (i.e. the query has independent\n   * combinators), then this combinator will be inserted after the new rule/group\n   * if the parent group is not empty and the new rule/group is the first in the\n   * group (`path.at(-1) === 0`). This option will supersede `combinators`.\n   */\n  combinatorSucceeding?: string;\n  /**\n   * ID generator.\n   *\n   * @default generateID\n   */\n  idGenerator?: () => string;\n  /**\n   * When `true`, the new rule/group will replace the rule/group at `path`.\n   */\n  replace?: boolean;\n}\n/**\n * Inserts a rule or group into a query.\n * @returns The new query with the rule or group inserted.\n *\n * @group Query Tools\n */\nexport const insert = <RG extends RuleGroupTypeAny>(\n  /** The query to update. */\n  query: RG,\n  /** The rule or group to insert. */\n  ruleOrGroup: RG | RuleType,\n  /** Path at which to insert the rule or group. */\n  path: number[],\n  /** Options. */\n  {\n    combinators = defaultCombinators,\n    combinatorPreceding,\n    combinatorSucceeding,\n    idGenerator = generateID,\n    replace = false,\n  }: InsertOptions = {}\n): RG =>\n  produce(query, draft => {\n    const parentToInsertInto = findPath(getParentPath(path), draft) as RG;\n    if (!parentToInsertInto || !isRuleGroup(parentToInsertInto)) return;\n\n    const rorg = regenerateIDs(ruleOrGroup as RuleGroupTypeAny, { idGenerator });\n    const independentCombinators = isRuleGroupTypeIC(draft);\n    const newIndex = path.at(-1)!;\n\n    /**\n     * This function 1) glosses over the need for type assertions to splice directly\n     * into `parentToInsertInto.rules`, and 2) shortens the actual insertion code.\n     */\n    // oxlint-disable-next-line typescript/no-explicit-any\n    const insertRuleOrGroup = (idx: number, ...args: any[]) =>\n      parentToInsertInto.rules.splice(idx, replace ? args.length : 0, ...args);\n\n    // Insert the source item at the target path\n    if (parentToInsertInto.rules.length === 0 || !independentCombinators) {\n      insertRuleOrGroup(newIndex, rorg);\n    } else if (replace && independentCombinators) {\n      insertRuleOrGroup(newIndex + (newIndex % 2), rorg);\n    } else {\n      if (newIndex === 0) {\n        if (rorg.path?.at(-1) === 0 && combinatorSucceeding) {\n          insertRuleOrGroup(newIndex, rorg, combinatorSucceeding);\n        } else {\n          const newNextCombinator =\n            parentToInsertInto.rules[1] ?? combinatorPreceding ?? getFirstOption(combinators);\n          insertRuleOrGroup(newIndex, rorg, newNextCombinator);\n        }\n      } else {\n        const normalizedNewIndex = newIndex % 2 === 0 ? newIndex - 1 : newIndex;\n        if (combinatorPreceding) {\n          insertRuleOrGroup(normalizedNewIndex, combinatorPreceding, rorg);\n        } else {\n          const newPrevCombinator =\n            parentToInsertInto.rules[normalizedNewIndex - 2] ??\n            combinatorSucceeding ??\n            getFirstOption(combinators);\n          insertRuleOrGroup(normalizedNewIndex, newPrevCombinator, rorg);\n        }\n      }\n    }\n  });\n\n/**\n * Options for {@link group}.\n *\n * @group Query Tools\n */\nexport interface GroupOptions {\n  /**\n   * When `true`, the source rule/group will not be removed from its original path.\n   */\n  clone?: boolean;\n  /**\n   * If the query extends `RuleGroupTypeIC` (i.e. the query is using independent\n   * combinators), then the first combinator in this list will be inserted between\n   * the two rules/groups.\n   */\n  combinators?: OptionList;\n  /**\n   * ID generator.\n   */\n  idGenerator?: () => string;\n}\n/**\n * Creates a new group at a target path with its `rules` array containing the current\n * objects at the target path and the source path. In the options parameter, pass\n * `{ clone: true }` to copy the source rule/group instead of move.\n *\n * @returns The new query with the rules or groups grouped.\n *\n * @group Query Tools\n */\nexport const group = <RG extends RuleGroupTypeAny>(\n  /** The query to update. */\n  query: RG,\n  /** Path of the rule/group to move or clone. */\n  sourcePathOrID: Path | string,\n  /** Path of the target rule/group, which will become the path of the new group. */\n  targetPathOrID: Path | string,\n  /** Options. */\n  { clone = false, combinators = defaultCombinators, idGenerator = generateID }: GroupOptions = {}\n): RG => {\n  const sourcePath = Array.isArray(sourcePathOrID)\n    ? sourcePathOrID\n    : getPathOfID(sourcePathOrID, query);\n  const targetPath = Array.isArray(targetPathOrID)\n    ? targetPathOrID\n    : getPathOfID(targetPathOrID, query);\n\n  // Ignore invalid paths/ids\n  if (!sourcePath || !targetPath) return query;\n\n  const nextPath = getNextPath(query, sourcePath, targetPath);\n\n  // Don't move to the same location or a path that doesn't exist yet\n  if (\n    sourcePath.length === 0 ||\n    pathsAreEqual(sourcePath, nextPath) ||\n    !findPath(getParentPath(nextPath), query)\n  ) {\n    return query;\n  }\n\n  const sourceRuleOrGroupOriginal = findPath(sourcePath, query);\n  const targetRuleOrGroup = findPath(targetPath, query);\n  if (!sourceRuleOrGroupOriginal || !targetRuleOrGroup) {\n    return query;\n  }\n  const sourceRuleOrGroup = clone\n    ? regenerateIDs(sourceRuleOrGroupOriginal as RuleGroupTypeAny, { idGenerator })\n    : sourceRuleOrGroupOriginal;\n\n  return produce(query, draft => {\n    const independentCombinators = isRuleGroupTypeIC(draft);\n    const parentOfRuleToRemove = findPath(getParentPath(sourcePath), draft) as RG;\n    const ruleToRemoveIndex = sourcePath.at(-1)!;\n\n    // Remove the source item if not cloning\n    if (!clone) {\n      const idxStartDelete = independentCombinators\n        ? Math.max(0, ruleToRemoveIndex - 1)\n        : ruleToRemoveIndex;\n      const deleteLength = independentCombinators ? 2 : 1;\n      parentOfRuleToRemove.rules.splice(idxStartDelete, deleteLength);\n    }\n\n    const newNewPath = [...nextPath];\n    const commonAncestorPath = getCommonAncestorPath(sourcePath, nextPath);\n    if (\n      !clone &&\n      sourcePath.length === commonAncestorPath.length + 1 &&\n      nextPath[commonAncestorPath.length] > sourcePath[commonAncestorPath.length]\n    ) {\n      // Getting here means there will be a shift of paths upward at the common\n      // ancestor level because the object at `oldPath` will be spliced out. The\n      // real new path should therefore be one or two higher than `newPathCalc`.\n      newNewPath[commonAncestorPath.length] -= independentCombinators ? 2 : 1;\n    }\n    const newNewParentPath = getParentPath(newNewPath);\n    const parentOfTargetPath = findPath(newNewParentPath, draft) as RG;\n    const targetPathIndex = newNewPath.at(-1)!;\n\n    // Convert the target path to a group and insert the source and target items as children\n    parentOfTargetPath.rules.splice(\n      targetPathIndex,\n      1,\n      prepareRuleOrGroup(\n        (independentCombinators\n          ? { rules: [targetRuleOrGroup, getFirstOption(combinators), sourceRuleOrGroup] }\n          : {\n              combinator: getFirstOption(combinators),\n              rules: [targetRuleOrGroup, sourceRuleOrGroup],\n              // oxlint-disable-next-line typescript/no-explicit-any\n            }) as any,\n        { idGenerator }\n        // oxlint-disable-next-line typescript/no-explicit-any\n      ) as any\n    );\n  });\n};\n"],"mappings":"qGAkBA,MAAa,EAAyB,IAIzB,EAA0B,SAM1BA,EAA6D,IAM7DC,EAA+D,EAM/DC,EACX,EAMWC,EAAgE,IAMhEC,EACX,EAMWC,EACX,EAMWC,EAA6D,IAM7DC,EAA+D,EAM/DC,EACX,EAQWC,EAA4C,CACvD,OAAQ,CACN,MAAO,QACP,gBAAiB,IACjB,iBAAkB,EAClB,sBAAuB,EACxB,CACD,UAAW,CACT,MAAO,WACP,gBAAiB,IACjB,iBAAkB,EAClB,sBAAuB,EACxB,CACD,OAAQ,CACN,MAAO,SACP,gBAAiB,IACjB,iBAAkB,EAClB,sBAAuB,EACxB,CACD,UAAW,CAAE,MAAO,aAAc,CAClC,eAAgB,CAAE,MAAO,kBAAmB,CAC5C,MAAO,CAAE,MAAO,QAAS,CACzB,WAAY,CAAE,MAAO,IAAK,MAAO,cAAe,CAChD,YAAa,CAAE,MAAO,IAAK,MAAO,eAAgB,CAClD,QAAS,CAAE,MAAO,SAAU,MAAO,WAAY,CAC/C,SAAU,CAAE,MAAO,UAAW,MAAO,YAAa,CAClD,YAAa,CAAE,MAAO,aAAc,CACpC,UAAW,CAAE,MAAO,MAAO,MAAO,oBAAqB,CACvD,UAAW,CAAE,MAAO,IAAK,MAAO,aAAc,CAC9C,eAAgB,CAAE,MAAO,IAAK,MAAO,cAAe,CACpD,cAAe,CAAE,MAAO,IAAK,MAAO,WAAY,CAChD,gBAAiB,CAAE,MAAO,IAAK,MAAO,aAAc,CACpD,WAAY,CAAE,MAAO,KAAM,MAAO,cAAe,CACjD,SAAU,CAAE,MAAO,KAAM,MAAO,YAAa,CAC7C,UAAW,CAAE,MAAO,KAAM,MAAO,aAAc,CAC/C,iBAAkB,CAAE,MAAO,KAAM,MAAO,cAAe,CACvD,kBAAmB,CAAE,MAAO,KAAM,MAAO,eAAgB,CACzD,SAAU,CAAE,MAAO,KAAM,MAAO,YAAa,CAC7C,UAAW,CAAE,MAAO,KAAM,MAAO,aAAc,CAC/C,WAAY,CAAE,MAAO,KAAM,MAAO,cAAe,CACjD,YAAa,CAAE,MAAO,KAAM,MAAO,eAAgB,CACnD,oBAAqB,CAAE,MAAO,eAAgB,CAC/C,CAQY,EAAkB,IAIlBC,EAA+D,CAC1E,IAAK,IACL,KAAM,KACN,IAAK,IACL,IAAK,IACL,KAAM,KACN,KAAM,KACN,SAAU,WACV,WAAY,cACZ,SAAU,YACV,eAAgB,mBAChB,iBAAkB,sBAClB,eAAgB,oBAChB,KAAM,UACN,QAAS,cACT,GAAI,KACJ,MAAO,SACP,QAAS,UACT,WAAY,cACb,CAEYC,EAA2E,CACtF,IAAK,MACL,GAAI,KACJ,IAAK,MACN,CAQYC,EAAqC,CAChD,CAAE,KAAM,IAAK,MAAO,IAAK,MAAO,IAAK,CACrC,CAAE,KAAM,KAAM,MAAO,KAAM,MAAO,KAAM,CACxC,CAAE,KAAM,IAAK,MAAO,IAAK,MAAO,IAAK,CACrC,CAAE,KAAM,IAAK,MAAO,IAAK,MAAO,IAAK,CACrC,CAAE,KAAM,KAAM,MAAO,KAAM,MAAO,KAAM,CACxC,CAAE,KAAM,KAAM,MAAO,KAAM,MAAO,KAAM,CACxC,CAAE,KAAM,WAAY,MAAO,WAAY,MAAO,WAAY,CAC1D,CAAE,KAAM,aAAc,MAAO,aAAc,MAAO,cAAe,CACjE,CAAE,KAAM,WAAY,MAAO,WAAY,MAAO,YAAa,CAC3D,CAAE,KAAM,iBAAkB,MAAO,iBAAkB,MAAO,mBAAoB,CAC9E,CAAE,KAAM,mBAAoB,MAAO,mBAAoB,MAAO,sBAAuB,CACrF,CAAE,KAAM,iBAAkB,MAAO,iBAAkB,MAAO,oBAAqB,CAC/E,CAAE,KAAM,OAAQ,MAAO,OAAQ,MAAO,UAAW,CACjD,CAAE,KAAM,UAAW,MAAO,UAAW,MAAO,cAAe,CAC3D,CAAE,KAAM,KAAM,MAAO,KAAM,MAAO,KAAM,CACxC,CAAE,KAAM,QAAS,MAAO,QAAS,MAAO,SAAU,CAClD,CAAE,KAAM,UAAW,MAAO,UAAW,MAAO,UAAW,CACvD,CAAE,KAAM,aAAc,MAAO,aAAc,MAAO,cAAe,CAClE,CAQYC,EAA+E,CAC1F,IAAK,KACL,KAAM,IACN,IAAK,KACL,KAAM,IACN,IAAK,KACL,KAAM,IACN,WAAY,mBACZ,iBAAkB,aAClB,SAAU,iBACV,eAAgB,WAChB,SAAU,iBACV,eAAgB,WAChB,QAAS,aACT,WAAY,UACZ,GAAI,QACJ,MAAO,KACP,QAAS,OACT,KAAM,UACP,CAUYC,EAAyC,CACpD,CAAE,KAAM,MAAO,MAAO,MAAO,MAAO,MAAO,CAC3C,CAAE,KAAM,KAAM,MAAO,KAAM,MAAO,KAAM,CACzC,CAWYC,EAAyD,CACpE,GAAG,EACH,CAAE,KAAM,MAAO,MAAO,MAAO,MAAO,MAAO,CAC5C,CAUYC,EAAuC,CAClD,CAAE,KAAM,MAAO,MAAO,MAAO,MAAO,MAAO,CAC3C,CAAE,KAAM,OAAQ,MAAO,OAAQ,MAAO,OAAQ,CAC9C,CAAE,KAAM,OAAQ,MAAO,OAAQ,MAAO,OAAQ,CAC9C,CAAE,KAAM,UAAW,MAAO,UAAW,MAAO,WAAY,CACxD,CAAE,KAAM,SAAU,MAAO,SAAU,MAAO,UAAW,CACrD,CAAE,KAAM,UAAW,MAAO,UAAW,MAAO,UAAW,CACxD,CASY,EAAqB,CAChC,aAAc,eACd,UAAW,YACX,OAAQ,mBACR,KAAM,iBACN,YAAa,wBACb,QAAS,oBACT,SAAU,qBACV,UAAW,iBACX,WAAY,uBACZ,YAAa,mBACb,UAAW,sBACX,KAAM,OACN,OAAQ,cACR,UAAW,iBACX,eAAgB,sBAChB,UAAW,iBACX,MAAO,aACP,WAAY,cACZ,aAAc,eACd,MAAO,qBACP,QAAS,uBACT,aAAc,eACd,YAAa,cACb,QAAS,UACT,QAAS,UACT,SAAU,WACV,kBAAmB,oBACnB,WAAY,0BACZ,SAAU,wBACV,MAAO,qBACP,SAAU,YACV,UAAW,iBACX,SAAU,YACV,UAAW,iBACX,YAAa,mBACb,cAAe,uBACf,SAAU,wBACV,UAAW,yBACX,YAAa,mBACd,CAQYC,EAAuC,CAClD,aAAc,GACd,UAAW,GACX,OAAQ,GACR,KAAM,GACN,YAAa,GACb,QAAS,GACT,SAAU,GACV,UAAW,GACX,WAAY,GACZ,YAAa,GACb,UAAW,GACX,KAAM,GACN,OAAQ,GACR,UAAW,GACX,eAAgB,GAChB,UAAW,GACX,MAAO,GACP,WAAY,GACZ,aAAc,GACd,WAAY,GACZ,SAAU,GACV,UAAW,GACX,SAAU,GACV,UAAW,GACX,MAAO,GACP,YAAa,GACb,cAAe,GACf,cAAe,GACf,aAAc,GACd,MAAO,GACP,QAAS,GACT,YAAa,GACb,QAAS,GACT,SAAU,GACV,QAAS,GACT,kBAAmB,GACnB,SAAU,GACV,cAAe,GACf,SAAU,GACV,YAAa,GACd,CAOY,EAAsB,CACjC,MAAO,QACP,kBAAmB,qBACnB,8BAA+B,kCAChC,CAOY,EAAS,CACpB,KAAM,OACN,UAAW,aACX,iBAAkB,oBAClB,SAAU,YACV,YAAa,eACb,WAAY,cACZ,UAAW,aACX,QAAS,WACT,WAAY,cACZ,YAAa,cACb,OAAQ,SACR,UAAW,YACX,YAAa,eACb,UAAW,aACX,aAAc,gBACd,WAAY,cACZ,SAAU,YACV,UAAW,aACX,SAAU,YACV,UAAW,aACX,oBAAqB,wBACrB,gBAAiB,oBAClB,CAEY,EAAU,CACrB,mBAAoB,uCACpB,aAAc,mCACd,YAAa,gBACb,eAAgB,oCAChB,gBAAiB,qCACjB,iBAAkB,sCAClB,kBAAmB,uCACnB,gBAAiB,qCACjB,iBAAkB,sCAClB,cAAe,mCACf,IAAK,sBACL,OAAQ,wBACR,OAAQ,wBACR,KAAM,sBACN,MAAO,qCACR,CAOYC,EAAiB,EAAE,CAQnBC,EAAwD,CACnE,mBAAoB,GACpB,gBAAiB,GACjB,mBAAoB,GACpB,gBAAiB,GACjB,UAAW,GACX,kBAAmB,GACnB,uBAAwB,GACxB,cAAe,GACf,mBAAoB,GACpB,sBAAuB,GACvB,iBAAkB,GAClB,4BAA6B,GAC7B,gBAAiB,GACjB,gBAAiB,GACjB,cAAe,GACf,iBAAkB,GAClB,2BAA4B,GAC7B,CCzbY,GAAW,EAAc,EAAoB,MACxD,OAAO,GAAQ,SACX,EACG,MAAM,KAAK,IAAY,CACvB,IAAI,GAAK,EAAE,MAAM,EAAU,CAAC,CAC5B,QAAQ,EAAM,EAAM,IACf,IAAQ,EACH,EAEF,CAAC,GAAG,EAAK,MAAM,EAAG,GAAG,CAAE,GAAG,EAAK,GAAG,GAAG,GAAG,IAAY,EAAK,KAAM,GAAG,EAAK,MAAM,EAAE,CAAC,CACtF,EAAE,CAAC,CACR,EAAE,CAgBK,GAAY,EAAe,EAAmB,MACzD,EAAO,IAAI,GAAO,GAAG,GAAO,KAAK,WAAW,EAAS,GAAI,KAAK,EAAS,KAAK,CAAC,CAAC,KAAK,EAAS,CAMjF,EAAgB,GAAmB,OAAO,GAAQ,SAAW,EAAI,MAAM,CAAG,EAM1E,GAEX,EACA,CAAE,sBAAyD,EAAE,GAG7D,MAAM,QAAQ,EAAE,CACZ,EAAE,IAAI,GAAK,EAAaC,EAAE,CAAC,CAC3B,OAAO,GAAM,SACX,EAAQ,EAAG,IAAgB,CACxB,OAAO,MAA2B,GAAO,GAAK,CAAC,QAAQ,KAAK,EAAE,CAAC,CAC/D,IAAI,GAAK,EAAE,MAAM,CAAC,CACrB,OAAO,GAAM,SACX,CAAC,EAAE,CACH,EAAE,CAKC,GAAoB,GAC/B,EAAI,MAAM,GAAM,IAAO,KAAU,GAAM,MAAW,GAAM,CCzD1D,SAAS,GAAM,EAAU,CACvB,IAAI,EACA,EACA,EAAM,GAEV,GAAI,OAAO,GAAQ,UAAY,OAAO,GAAQ,SAC5C,GAAO,UACE,OAAO,GAAQ,YACpB,MAAM,QAAQ,EAAI,CAAE,CACtB,IAAM,EAAM,EAAI,OAChB,IAAK,EAAI,EAAG,EAAI,EAAK,IACf,EAAI,KAAO,EAAI,GAAM,EAAI,GAAG,IAE9B,IAAQ,GAAO,KACf,GAAO,QAIX,IAAK,KAAK,EACJ,EAAI,KAEN,IAAQ,GAAO,KACf,GAAO,GAMf,OAAO,EAST,SAAgB,GAAK,GAAG,EAA4B,CAClD,IAAI,EAAI,EACJ,EACA,EACA,EAAM,GACJ,EAAM,EAAK,OACjB,KAAO,EAAI,EAAK,KACT,EAAM,EAAK,MAAQ,EAAI,GAAM,EAAI,IAEpC,IAAQ,GAAO,KACf,GAAO,GAGX,OAAO,EC7DT,MAAa,EAAS,GAAa,OAAO,GAAM,SAAY,EAAE,aAAa,CAAS,EAMvEC,GAAuB,IAAI,OACtCC,EAAqB,OAAO,QAAQ,MAAO,OAAO,GAAG,OAAO,CAAC,QAAQ,MAAO,OAAO,GAAG,OAAO,CAC9F,CAMY,EAAU,GACL,OAAO,GAAQ,WAA/B,EAA0C,GAAQ,OAAO,eAAe,EAAI,GAAK,OAAO,UAK7E,EAA0B,GACrC,GAAU,MAA+B,IAAU,GCrBxC,GAAc,GACzB,EAAO,EAAE,EAAI,UAAW,GAAK,OAAO,EAAE,OAAU,SAKrC,EAAe,GAC1B,EAAO,EAAG,EAAI,MAAM,QAAQ,EAAG,MAAM,CAK1B,EAAmB,GAC9B,EAAY,EAAG,EAAI,OAAO,EAAG,YAAe,SAKjC,GAAqB,GAChC,EAAY,EAAG,EAAI,EAAG,aAAe,IAAA,GCdjC,GAAmB,CAAC,KAAM,MAAO,MAAM,CAEvC,IAAgB,EAAY,IAAc,EAAG,EAAE,GAAK,EAEpD,IACJ,EACA,EAA8B,IACV,CACpB,IAAM,EAAiB,GAAiB,GAWxC,OARK,EAAG,MAAM,SAAS,EAAsB,CAQtC,EAAQ,EAAI,GAAS,CAC1B,IAAI,EAAS,EAGb,KAAO,EAAS,EAAM,MAAM,OAAS,GAAG,CACtC,GAAI,GAAa,EAAM,MAAM,EAAS,GAAI,EAAe,CAAE,CACzD,GAAU,EACV,SAGF,IAAM,EAA0B,EAAM,MAAM,WACzC,EAAG,IAAM,EAAI,GAAU,OAAO,GAAM,UAAY,EAAG,EAAE,GAAK,EAC5D,CAED,GAAI,IAA4B,GAAI,CAElC,EAAM,MAAM,OACV,EACA,EAAM,MAAM,OACZ,GAEE,CAAE,MAAO,EAAM,MAAM,MAAM,EAAO,CAAS,CAC3C,EAAsB,EACvB,CACF,CACD,WAGA,EAAM,MAAM,OACV,EACA,EAA0B,EAC1B,GAEE,CAAE,MAAO,EAAM,MAAM,MAAM,EAAQ,EAAwB,CAAS,CACpE,EAAsB,EACvB,CACF,GAGL,CA5CO,EAAsB,GAAiB,OAAS,EACnD,GAA6C,EAAI,EAAsB,EAAE,CACzE,GAqDK,EACX,GACO,CACP,GAAI,EAAgB,EAAG,CACrB,OAAO,EAET,IAAM,EAAc,GAA6C,EAAG,CAC9D,EAAmB,EAAY,MAAM,IAAI,GAC7C,OAAO,GAAM,UAAY,CAAC,EAAY,EAAE,CAAG,EAAI,EAAc,EAAE,CAChE,CACK,EAAa,EAAiB,OAAS,EAAI,MAAS,EAAiB,GACrE,EAAQ,EAAiB,OAAO,GAAK,OAAO,GAAM,SAAS,CACjE,MAAO,CAAE,GAAG,EAAa,aAAY,QAAO,EAWjC,GACX,GACS,CACT,GAAI,GAAkB,EAAG,CACvB,OAAO,EAET,GAAM,CAAE,aAAY,GAAG,GAA2B,EAC5CC,EAAiD,EAAE,CACnD,CAAE,UAAW,EAAG,MACtB,IAAK,GAAM,CAAC,EAAK,KAAM,EAAG,MAAM,SAAS,CACnC,EAAY,EAAE,CAChB,EAAM,KAAK,GAAY,EAAE,CAAC,CAE1B,EAAM,KAAK,EAAE,CAEX,GAAc,EAAM,EAAS,GAC/B,EAAM,KAAK,EAAW,CAG1B,MAAO,CAAE,GAAG,EAAwB,QAAO,EAiB7C,SAAS,GAAa,EAAyE,CAC7F,OAAO,GAAkB,EAAM,CAAG,EAAc,EAAM,CAAG,GAAY,EAAM,CCnI7E,MAAaC,GAAmC,GAAS,CACvD,IAAMC,EAAwB,EAAE,CAK1B,EAAgB,GAAmB,CAMnC,EAAK,IAAI,EAAO,EAAK,KAGrB,EAAiB,GAAyB,CAE9C,IAAMC,EAAiB,EAAE,CACzB,GAAI,EAAG,MAAM,SAAW,EACtB,EAAQ,KAAK,EAAoB,MAAM,SAC9B,CAAC,EAAgB,EAAG,CAAE,CAE/B,IAAI,EAAa,GACjB,IAAK,IAAI,EAAI,EAAG,EAAI,EAAG,MAAM,QAAU,CAAC,EAAY,KAE/C,EAAI,GAAM,GAAK,OAAO,EAAG,MAAM,IAAO,UACtC,EAAI,GAAM,GAAK,OAAO,EAAG,MAAM,IAAO,UACtC,EAAI,GAAM,GACT,OAAO,EAAG,MAAM,IAAO,UACvB,CAAC,EAAmB,IAAI,GAAK,EAAE,KAAe,CAAC,SAAS,EAAG,MAAM,GAAa,IAEhF,EAAa,IAGb,GACF,EAAQ,KAAK,EAAoB,8BAA8B,CAMjE,EAAgB,EAAG,EACnB,CAAC,EAAmB,IAAI,GAAK,EAAE,KAAe,CAAC,SAAS,EAAG,WAAW,EACtE,EAAG,MAAM,OAAS,GAElB,EAAQ,KAAK,EAAoB,kBAAkB,CAGjD,EAAG,KACL,EAAO,EAAG,IAAM,EAAQ,OAAS,EAAI,CAAE,MAAO,GAAO,UAAS,CAAG,IAEnE,IAAK,IAAM,KAAK,EAAG,MACb,OAAO,GAAM,WAEN,EAAY,EAAE,CACvB,EAAc,EAAE,CAEhB,EAAa,EAAE,GAOrB,OAFA,EAAc,EAAM,CAEb,GCxDI,GAAa,OAAO,KASpB,GAAgB,OAAO,QCA9B,GAAoB,GACxB,EAAO,EAAI,EAAI,SAAU,GAAO,OAAO,EAAI,MAAS,SAChD,GAAqB,GACzB,EAAO,EAAI,EAAI,UAAW,GAAO,OAAO,EAAI,OAAU,SAQxD,SAAgB,EACd,EACA,EACA,EACmB,CA0BnB,OAzBuD,EAAQ,GAAS,CACtE,IAAMC,EAA2C,EAAE,CAC/C,EAAgB,CAAC,CAAC,EAEtB,GAAI,OAAO,GAAU,SACnB,MAAO,CACL,GAAG,EACH,KAAM,EACN,MAAO,EACP,MAAO,IAAW,IAAU,EAC7B,CAWH,GARI,GAAiB,EAAM,EAAI,CAAC,GAAkB,EAAM,EACtD,EAAM,MAAQ,EAAM,KACpB,EAAgB,IACP,CAAC,GAAiB,EAAM,EAAI,GAAkB,EAAM,GAC7D,EAAM,KAAO,EAAM,MACnB,EAAgB,IAGd,EACF,OAAO,OAAO,OAAO,EAAE,CAAE,EAAgB,EAAO,EAAM,EAExD,CACY,EAAI,CASpB,SAAgB,GACd,EACA,EACA,EACqB,CAiBrB,OAhBK,MAAM,QAAQ,EAAQ,CAI0C,EAAQ,GAAS,CACpF,GAAI,GAA2B,EAAM,CACnC,IAAK,IAAM,KAAY,EACrB,IAAK,GAAM,CAAC,EAAK,KAAQ,EAAS,QAAQ,SAAS,CACjD,EAAS,QAAQ,GAAO,EAAa,EAAK,EAAgB,EAAS,MAGvE,IAAK,GAAM,CAAC,EAAK,KAAS,EAAgB,SAAS,CACjD,EAAM,GAAO,EAAa,EAAK,EAAgB,EAAS,EAE5D,CAEY,EAAmC,CAfxC,EAAE,CAwBb,SAAgB,GACd,EACA,EAC8F,CAM9F,OAAO,OAAO,YACX,OAAO,QAAQ,EAAO,CAAgC,KAAK,CAAC,EAAG,KAAO,CACrE,EACA,EAAa,EAAG,EAAe,CAChC,CAAC,CACH,CAQH,MAAa,GAGX,GACQ,GAAiB,EAAc,CAQ5B,GAGX,GACQ,CACR,IAAM,EAAQ,IAAI,IACZC,EAAgB,EAAE,CACxB,IAAK,IAAM,KAAM,EACV,EAAM,IAAK,EAAG,OAAS,EAAG,KAAO,GACpC,EAAM,IAAK,EAAG,OAAS,EAAG,KAAO,CACjC,EAAS,KAAK,EAAG,EAGrB,OAAO,EAAc,SAAW,EAAS,OAAS,EAAgB,GASvD,GAAsB,GACjC,MAAM,QAAQ,EAAI,EAClB,EAAI,OAAS,GACb,EAAO,EAAI,GAAG,EACd,YAAa,EAAI,IACjB,MAAM,QAAQ,EAAI,GAAG,QAAQ,CAQlB,GAAyB,GAAsC,CAC1E,IAAI,EAAQ,GACZ,GAAI,MAAM,QAAQ,EAAI,CACpB,IAAK,IAAM,KAAK,EACd,GAAI,GAAiB,EAAE,EAAI,GAAkB,EAAE,CAC7C,EAAQ,QAER,MAAO,GAIb,OAAO,GASI,GAAqB,GAAkC,CAClE,IAAI,EAAQ,GACZ,GAAI,MAAM,QAAQ,EAAI,CACpB,IAAK,IAAM,KAAK,EACd,GAAI,GAAiB,EAAE,EAAI,GAAkB,EAAE,CAC7C,EAAQ,QAER,MAAO,GAIb,OAAO,GAQI,IAEX,EACA,CAAE,aAAa,IAAoC,EAAE,GACpB,CACjC,IAAI,EAAS,GACb,GAAI,MAAM,QAAQ,EAAI,CACpB,IAAK,IAAM,KAAM,EACf,GACE,EAAO,EAAG,EACV,YAAa,IACZ,GAAsB,EAAG,QAAQ,EAC/B,GAAc,MAAM,QAAQ,EAAG,QAAQ,EAAI,EAAG,QAAQ,SAAW,GAEpE,EAAS,QAET,MAAO,GAIb,OAAO,GAQI,IAEX,EACA,CAAE,aAAa,IAAoC,EAAE,GAChB,CACrC,IAAI,EAAS,GACb,GAAI,MAAM,QAAQ,EAAI,CACpB,IAAK,IAAM,KAAM,EACf,GACE,EAAO,EAAG,EACV,YAAa,IACZ,GAAkB,EAAG,QAAQ,EAC3B,GAAc,MAAM,QAAQ,EAAG,QAAQ,EAAI,EAAG,QAAQ,SAAW,GAEpE,EAAS,QAET,MAAO,GAIb,OAAO,GAqBT,SAAgB,EACd,EACA,EACqB,CAIrB,OAHgB,GAA2B,EAAK,CAAE,WAAY,GAAM,CAAC,CACjE,EAAI,QAAQ,GAAM,EAAG,QAAQ,CAC7B,GACW,KAAK,GAAM,EAAG,QAAU,GAAQ,EAAG,OAAS,EAAK,CAiBlE,SAAgB,EACd,EACqC,CACrC,GAAI,CAAC,MAAM,QAAQ,EAAI,EAAI,EAAI,SAAW,EACxC,OAAO,QACE,GAA2B,EAAK,CAAE,WAAY,GAAM,CAAC,CAAE,CAChE,IAAK,IAAM,KAAM,EACf,GAAI,EAAG,QAAQ,OAAS,EACtB,OAAQ,EAAG,QAAQ,GAAG,OAAS,EAAG,QAAQ,GAAG,KAIjD,OAAO,KAGT,OAAQ,EAAI,GAAG,OAAS,EAAI,GAAG,KASjC,MAAa,GAAyE,GACpF,GAAiB,GAAmB,EAAI,CAAG,EAAI,QAAQ,GAAM,EAAG,QAAQ,CAAG,EAAI,CAQpE,GACX,GACmC,CAEnC,IAAM,EAAS,IAAI,IACb,EAAQ,IAAI,IACZC,EAA2C,EAAE,CACnD,IAAK,IAAM,KAAM,EACf,GAAI,CAAC,EAAO,IAAI,EAAG,MAAM,CAAE,CACzB,EAAO,IAAI,EAAG,MAAM,CACpB,IAAMC,EAA2D,EAAE,CACnE,IAAK,IAAM,KAAO,EAAG,QACd,EAAM,IAAK,EAAI,OAAS,EAAI,KAAW,GAC1C,EAAM,IAAK,EAAI,OAAS,EAAI,KAAW,CACvC,EAAoB,KAAK,EAAa,EAAI,CAAsC,EAGpF,EAAS,KAAK,CAAE,GAAG,EAAI,QAAS,EAAqB,CAAC,CAG1D,OAAO,GASI,GACX,GAEI,GAA2B,EAAc,CACpC,GAAc,EAAc,CAE9B,GAAkB,EAA+B,IAAI,GAAK,EAAa,EAAE,CAAC,CAAC,CAiBvE,GACX,GAC0B,CAI1B,GAAM,CACJ,WAAY,EACZ,aAAa,EAAE,CACf,WAAW,EAAE,CACb,YAAa,CACX,kBAAkB,IAClB,mBAAmB,EACnB,wBAAwB,GACtB,EAAE,CACN,mBAAmB,IACjB,EAEE,EAAgB,CACpB,GAAI,EACJ,KAAM,EACN,MAAO,EACP,MAAO,EACR,CAEK,EAAc,GAA2B,CAAC,EAAc,CAE1DC,EAAqC,EAAE,CACrC,EACJ,MAAM,QAAQ,EAAY,CACtB,GAAiB,EAAa,EAAY,EAAS,CAClD,GAAW,GAAgB,EAAa,EAAW,CAAC,CAClD,IAAkC,IAAQ,CACzC,GAAG,EAAY,GACf,KAAM,EACN,MAAO,EACR,EAAE,CAEF,MAAM,EAAG,IAAM,EAAE,MAAM,cAAc,EAAE,MAAM,CAAC,CAEvD,AAWE,EAXE,GAA2B,EAAK,CAE7B,GADQ,EACM,EACA,CACb,CACE,MAAO,EACP,QAAS,CAAC,EAAc,CACzB,CACD,GAAG,EACJ,CAAC,CAGD,GADQ,EACS,EACA,CAAC,EAAe,GAAI,EAAa,CAAC,CAG1D,IAAIC,EAAoD,EAAE,CAC1D,GAAK,MAAM,QAAQ,EAAY,IAOzB,GAA2B,EAAW,CACxC,IAAK,IAAM,KAAM,EACf,IAAK,IAAM,KAAO,EAAG,QACnB,EAAY,EAAI,OAAoC,EAAI,MACtD,EAAa,EAAK,EAAW,MAInC,IAAK,IAAM,KAAO,EAChB,EAAY,EAAI,OAAoC,EAAI,MACtD,EAAa,EAAK,EAAW,KAjBJ,CAC/B,IAAM,EAAK,GAAgB,EAAa,EAAW,CAInD,EAAa,EAAmB,EAAK,CAAE,GAAG,GAAK,GAAkB,EAAe,CAiBlF,MAAO,CAAE,gBAAe,aAAY,aAAY,ECpd5C,IAAsB,EAAkB,EAAkB,IAA8B,CAC5F,IAAM,EAAY,EAAa,EAAM,CAC/B,EAAqB,EAAa,EAAe,CAOvD,OANI,EAAU,QAAU,EAAmB,MAClC,GAEL,OAAO,EAAU,YAAe,SAC3B,EAAU,EAAU,cAAgB,EAAmB,EAAU,YAEnE,EAAU,aAAa,EAAoB,EAAS,EAA+B,IAc/E,IAEX,EAEA,EACA,IAMS,CACT,GAAI,CAAC,EAAM,WAAY,CACrB,IAAM,EAAsB,IACzB,EAAE,OAAoC,EAAE,SACxC,EAAM,OAAoC,EAAM,MAOnD,OANI,GAA2B,EAAO,CAC7B,EAAO,IAAI,IAAO,CACvB,GAAG,EACH,QAAS,EAAG,QAAQ,OAAO,GAAK,EAAmB,EAAE,CAAC,CACvD,EAAE,CAEE,EAAO,OAAO,GAAK,EAAmB,EAAE,CAAC,CAYlD,OATI,GAA2B,EAAO,CAC7B,EACJ,IAAI,IAAO,CACV,GAAG,EACH,QAAS,EAAG,QAAQ,OAAO,GAAK,GAAmB,EAAO,EAAU,EAAE,CAAC,CACxE,EAAE,CACF,OAAO,GAAM,EAAG,QAAQ,OAAS,EAAE,CAGjC,EAAO,OAAO,GAAK,GAAmB,EAAO,EAAU,EAAE,CAAC,ECvCtD,GAEX,EACA,CAAE,eAAc,oBAAyC,EAAE,GAEnD,CACR,GAAI,CAAC,GAAgB,OAAO,GAAQ,UAAY,OAAO,GAAQ,SAC7D,OAAO,EAGT,GAAI,IAAiB,SACnB,OAAO,OAAO,WAAW,EAAI,CAG/B,IAAMC,EAEJ,EAAgB,EAAK,CACnB,qBAAsB,IAAiB,WACvC,mBACA,cAAe,GACf,MAAO,GACR,CAAC,CAEJ,OAAO,OAAO,GAAa,UAAY,CAAC,OAAO,MAAM,EAAS,CAAG,EAAW,GChCxE,IAEJ,EACA,EACA,IAEA,EAAQ,EAAK,GAAS,CACpB,IAAK,GAAM,CAAC,EAAG,KAAM,OAAO,QAAQ,EAAY,CAC1C,IAAM,GACR,OAAO,EAAM,GACF,GAAK,IAAM,GAAK,KAAK,IAChC,EAAM,GAAK,EAAM,GACb,GACF,OAAO,EAAM,KAInB,CA4HJ,SAAgB,EACd,EACA,EAAqC,EAAE,CACvC,CACA,GAAM,CACJ,gBAAgB,GAAK,EACrB,qBAAqB,GAAM,EAC3B,cAAc,EAAE,CAChB,gBAAgB,EAAE,CAClB,cAAc,EAAE,CAChB,WAAW,GACX,2BAA2B,IACzB,EAGE,EAAgB,IAA+B,CACnD,GAAG,EACD,GACE,CACE,GAAG,EACH,GAAI,EAAgB,EAAG,CACnB,CAAE,WAAY,EAAc,EAAG,aAAe,EAAG,WAAY,CAC7D,EAAE,CACP,CACD,EACA,EACD,CACF,CACD,GAAI,EAAY,QAAa,GACzB,KACA,EAEG,EAAY,OAAY,SAAU,EAAG,MAAM,KAAK,EAAQ,IAAQ,CAC/D,IAAM,EAAa,EAAW,KAAO,CAAE,KAAM,CAAC,GAAG,EAAG,KAAO,EAAI,CAAE,CASjE,OARI,OAAO,GAAM,SAER,EAAc,IAAM,EAClB,EAAY,EAAE,CAEhB,EAAa,CAAE,GAAG,EAAG,GAAG,EAAY,CAAC,CAGvC,EACL,GACE,CACE,GAAG,EACH,GAAG,EACH,GAAI,aAAc,EAAI,CAAE,SAAU,EAAY,EAAE,WAAa,EAAE,SAAU,CAAG,EAAE,CAC/E,CACD,EACA,EACD,CACF,EACD,CACH,CACN,EAED,OAAO,EAAa,CAAE,GAAG,EAAO,GAAI,EAAW,KAAO,CAAE,KAAM,EAAE,CAAE,CAAG,CAAC,CC3MxE,MAAa,GAAsB,GACjC,EAAO,EAAG,EAAI,OAAO,EAAG,OAAU,UAOvB,GACX,EACA,EACA,IACY,CACZ,GAAI,EAAG,MACL,MAAO,GAET,GAAI,OAAO,GAAqB,UAC9B,OAAO,EAET,GAAI,GAAmB,EAAiB,CACtC,OAAO,EAAiB,MAE1B,GAAI,OAAO,GAAc,YAAc,CAAC,EAAY,EAAG,CAAE,CACvD,IAAM,EAAK,EAAU,EAAG,CACxB,GAAI,OAAO,GAAO,UAChB,OAAO,EAGT,GAAI,GAAmB,EAAG,CACxB,OAAO,EAAG,MAGd,MAAO,ICrCI,IAAwB,CACnC,eACA,eAIuB,CACvB,GAAI,OAAO,GAAiB,SAAU,CACpC,GAAM,CAAC,EAAQ,GAAS,EAAa,MAAM,IAAI,CAO/C,OAJI,IAAU,UACL,IAAc,SAAW,EAAS,GAGpC,EAGT,OAAO,EAAe,SAAW,ICStB,GAAkB,GAAgC,CAC7D,OAAQ,EAAG,EAAY,CAAvB,CACE,IAAK,OACH,MAAO,UACT,IAAK,UACH,MAAO,cACT,IAAK,QACH,MAAO,SACT,IAAK,aACH,MAAO,cACT,IAAK,WACL,IAAK,aACL,IAAK,WACH,MAAO,OACT,IAAK,iBACL,IAAK,mBACL,IAAK,iBACH,MAAO,WACT,QACE,OAAO,IASA,GAAiB,CAC5B,IAAK,MACL,KAAM,MACN,IAAK,MACL,KAAM,OACN,IAAK,MACL,KAAM,OACN,GAAI,MACJ,MAAO,OACP,MAAO,OACR,CAOY,GAAkB,CAC7B,IAAK,SACL,KAAM,MACN,IAAK,KACL,KAAM,MACN,IAAK,KACL,KAAM,MACN,GAAI,KACJ,MAAO,QACR,CAOYC,GAGT,CACF,IAAK,KACL,GAAI,KACL,CAgBYC,GAGT,CACF,YAAa,EAAW,IAAc,OAAO,GAAM,UAAY,EAAE,WAAW,EAAE,CAC9E,UAAW,EAAW,IAAc,OAAO,GAAM,UAAY,EAAE,SAAS,EAAE,CAC3E,CASY,IACX,EACA,KACsB,CACtB,GAAG,EAEH,MAAO,EAAG,MAAM,IAAI,GAAK,CACvB,GAAI,OAAO,GAAM,SACf,OAAO,EAGT,GAAI,EAAY,EAAE,CAChB,OAAO,GAAe,EAAG,EAAQ,CAGnC,IAAM,EAAY,EAAU,EAAQ,OAAiC,EAAE,MAAM,CACvE,EAAe,GAAqB,CACxC,aAAc,EAAQ,aACtB,UAAW,GAAW,UACvB,CAAC,CAEF,GAAI,MAAM,QAAQ,EAAE,MAAM,CACxB,MAAO,CAAE,GAAG,EAAG,MAAO,EAAE,MAAM,IAAI,GAAK,EAAY,EAAG,CAAE,eAAc,CAAC,CAAC,CAAE,CAG5E,IAAM,EAAa,EAAQ,EAAE,MAAO,CAAE,mBAAoB,GAAM,CAAC,CAAC,IAAI,GACpE,EAAY,EAAG,CAAE,eAAc,CAAC,CACjC,CACD,GAAI,EAAW,MAAM,GAAK,OAAO,GAAM,SAAS,CAE9C,IAAI,EAAW,OAAS,EACtB,MAAO,CAAE,GAAG,EAAG,MAAO,EAAY,IACzB,EAAW,SAAW,EAC/B,MAAO,CAAE,GAAG,EAAG,MAAO,EAAW,GAAI,CAIzC,OAAO,GACP,CACH,EAQY,EAAgB,GAC1B,OAAO,GAAU,UAAY,EAAM,OAAS,GAC5C,OAAO,GAAU,UAAY,CAAC,OAAO,MAAM,EAAM,EACjD,OAAO,GAAU,UAAY,OAAO,GAAU,SAUpC,GAAwB,EAAY,IAC/C,CAAC,CAAC,IACD,OAAO,GAAU,UAChB,OAAO,GAAU,UAChB,OAAO,GAAU,UAAY,GAAa,KAAK,EAAM,EAU7C,GACX,GAC2C,EAAe,QAAU,EAWzD,IAEX,EAAwD,CAAC,GAAI,GAAG,GAEhE,MAAM,QAAQ,EAAoB,CAC9B,EACA,OAAO,GAAwB,SAC7B,CAAC,EAAqB,EAAoB,CACzC,GAAuB,CAAC,GAAI,GAAG,CAQ3B,IACX,EACA,CAAE,sBAAqB,8BACZ,CACX,GAAM,CAAC,EAAM,GAAS,GAA4B,EAAoB,CACtE,OAAO,OAAO,GAA6B,UAAY,EAAyB,OAAS,EACrF,EACE,EAAQ,EAAW,EAAyB,CAAC,IAAI,GAAQ,GAAG,IAAO,IAAO,IAAQ,CAClF,EACD,CACD,GAAG,IAAO,IAAY,KAGtB,GAAmB,CAAC,IAAK,IAAK,IAAI,CAW3B,GAAiC,GAAwC,CACpF,IAAMC,EAAmB,EAAE,CACrB,EAAY,IAAI,IAAI,GAAiB,CAE3C,IAAK,IAAM,KAAQ,EAAM,aAAa,CACpC,GAAI,EAAU,IAAI,EAAK,GACrB,EAAO,KAAK,EAAK,CACjB,EAAU,OAAO,EAAK,CAClB,EAAU,OAAS,GAAG,MAK9B,IAAK,IAAM,KAAU,GACf,EAAU,IAAI,EAAO,EACvB,EAAO,KAAK,EAAO,CAIvB,OAAO,GAUIC,GAAwC,CAKnD,YAAa,GAEb,oBAAqB,kCACrB,gBAAiB,iBACjB,YAAa,UACb,gBAAiB,cAGlB,CAKK,IACJ,EACA,EACA,IAGA,EAAU,WAAW,EAAI,EAEzB,EAAW,MACT,GAEE,EAAU,SAAS,IAAI,IAAI,EAE3B,EAAU,MAAM,KAAK,EAAE,SAAW,EAAW,OAChD,CAQU,IACX,EACA,EACA,EAAsC,EAAE,GAExC,EAAW,SAAW,EACjB,EAAa,IAAQ,GAAsB,IAAmC,GAC9E,OAAO,QAAQ,EAAa,CAAC,MAAM,CAAC,KACnC,GAAuB,EAAK,EAAW,EAAW,CACnD,GAAG,IACJ,OAAO,QAAQ,GAAsB,CAAC,MAAM,CAAC,KAC3C,GAAuB,EAAK,EAAW,EAAW,CACnD,GAAG,IACJ,GAAsB,IACK,GAUpB,EAAoB,GAAsD,CACrF,GAAM,CAAE,OAAM,aAAc,EAAK,OAAS,EAAE,CAE5C,GAAI,EAAM,CACR,GAAI,CAAC,EAAY,EAAK,MAAM,CAAE,MAAO,GAErC,IAAM,EAAc,EAAG,EAAK,CAEtB,EACJ,IAAgB,WAAa,IAAc,EACvC,OACA,IAAgB,UAAY,IAAc,EACxC,OACA,EAWR,OARG,IAAqB,WACpB,IAAqB,UACrB,IAAqB,aACtB,OAAO,GAAc,UAAY,EAAY,GAEvC,GAGF,CAAE,KAAM,EAA6B,YAAY,GAa/C,IAA+B,EAAc,IACxD,OAAO,GAAU,SAAW,CAAE,QAAS,EAAM,UAAU,CAAE,CAAG,EAUjD,IAA0B,EAAc,IACnD,EAAO,EAAM,EAAI,OAAO,KAAK,EAAM,CAAC,SAAW,GAAK,OAAO,EAAM,SAAY,SACzE,OAAO,EAAM,QAAQ,CACrB,ECnYOC,IAA4D,EAAW,IAAY,CAC9F,GAAM,CACJ,SACA,qBACA,wBACA,uBACA,0BACA,uBACA,gBACA,eACA,iBACE,EAEE,GAAoB,EAAsB,IAAgC,CAC9E,GAAI,CAAC,EAAmB,EAAI,EAAc,EAAG,IAAiC,IAAI,CAChF,OAAO,EAAY,EAAqB,GAG1C,IAAM,EAAiB,EAAE,CACrB,EAAsB,GACtB,EAAY,GAEhB,IAAK,IAAM,KAAQ,EAAG,MAAO,CAE3B,GAAI,OAAO,GAAS,SAAU,CAC5B,EAAsB,GAAiB,GACvC,SAIF,GAAI,EAAY,EAAK,CAAE,CACrB,IAAM,EAAiB,EAAiB,EAAK,CACzC,IACE,CAAC,GAAa,IAChB,EAAe,KAAK,EAAoB,CACxC,EAAsB,IAExB,EAAY,GACZ,EAAe,KAAK,EAAe,EAErC,SAIF,GAAM,CAAC,EAAkB,GAAkB,EAAa,EAAK,CAC7D,GACE,CAAC,EAAmB,EAAM,EAAkB,EAAe,EAC3D,EAAK,QAAU,GACf,EAAK,WAAa,GAEjB,IAAyB,IAAA,IAAa,EAAK,QAAU,EAEtD,SAGF,IAAM,EAAY,EAAU,EAAQ,EAAK,MAAM,CACzC,EAAgB,EAAc,EAAM,CACxC,GAAG,EACH,aAAc,EAAsB,GAAW,UAAU,CACzD,cAAe,EAAK,aAAe,WAAa,QAChD,YACD,CAAC,CAEE,IACE,CAAC,GAAa,IAChB,EAAe,KAAK,EAAoB,CACxC,EAAsB,IAExB,EAAY,GACZ,EAAe,KAAK,EAAc,EAItC,IAAM,EAAa,EAAe,KAChC,EAAgB,EAAG,CAAG,IAAI,GAAiB,EAAG,YAAqC,GAAK,IACzF,CAEK,CAAC,EAAQ,GAAU,EAAG,KAAO,CAAC,EAAY,CAAC,GAAG,EAAG,IAAM,IAAM,GAAG,GAAI,IAAI,CAAG,CAAC,GAAI,GAAG,CAEzF,OAAO,EAAa,GAAG,IAAS,IAAa,IAAW,GAG1D,OAAO,EAAiB,EAAW,GAAK,ECrFpCC,GAAgB,GAAe,EAAG,WAAW,MAAM,EAAI,EAAG,WAAW,UAAU,CAG/E,IAAsB,EAAQ,IAClC,OAAO,GAAM,UAAY,CAAC,EAAe,GAAG,IAAM,EAAE,WAAW,IAAK,MAAM,CAO/DC,IACX,EAEA,EAAO,EAAE,GACN,CACH,GAAM,CAAE,eAAc,eAAc,sBAAuB,EACrD,CAAE,QAAO,WAAU,QAAO,eAAgB,EAC1C,EAAe,IAAgB,QAC/B,EAAa,EAAG,IAAa,IAAM,KAAO,EAAS,CACnD,EACJ,OAAO,GAAU,UACjB,OAAO,GAAU,WACjB,OAAO,GAAU,UACjB,EAAqB,EAAO,EAAa,CAErC,EAAY,EAAiB,EAAK,CAExC,GAAI,IAAc,GAChB,MAAO,MACE,EAAW,CACpB,GAAM,CAAE,OAAM,aAAc,EAGtB,EAAoB,aAKpB,EAAoB,GAHT,EAAe,EAAK,MAAwB,CAC3D,cAAe,IAAM,CAAE,GAAG,EAAG,MAAO,GAAG,IAAoB,EAAE,MAAQ,IAAI,EAAE,QAAU,KAAM,EAC5F,CAAC,CAGA,EACD,CAED,OAAQ,EAAR,CACE,IAAK,MACH,MAAO,GAAG,EAAM,OAAO,EAAkB,IAAI,EAAkB,GAEjE,IAAK,OACL,IAAK,OACH,MAAO,GAAG,IAAS,OAAS,IAAM,KAAK,EAAM,UAAU,EAAkB,IAAI,EAAkB,GAEjG,IAAK,UACL,IAAK,SACL,IAAK,UAAW,CACd,IAAM,EAAa,UAAU,EAAM,UAC7B,EAAgB,GAAG,EAAM,UAAU,EAAkB,IAAI,EAAkB,UAE3E,EAAK,IAAS,UAAY,KAAO,IAAS,SAAW,KAAO,KAKlE,OAHI,EAAY,GAAK,EAAY,EACxB,GAAG,EAAc,GAAG,EAAG,IAAI,EAAW,KAAK,EAAU,GAEvD,GAAG,EAAc,GAAG,EAAG,GAAG,MAKvC,OAAQ,EAAR,CACE,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,IACL,IAAK,KACH,MAAO,GAAG,EAAM,GAAG,EAAW,GAC5B,GAAgB,EACZ,EAAa,EAAM,CACnB,IAAI,GAAmB,EAAO,EAAa,CAAC,KAGpD,IAAK,WACL,IAAK,iBAEH,MAAO,GADQD,GAAa,EAAW,CAAG,IAAM,KAC7B,EAAM,YACvB,EAAe,EAAa,EAAM,CAAG,IAAI,GAAmB,EAAO,EAAa,CAAC,GAClF,GAGH,IAAK,aACL,IAAK,mBAEH,MAAO,GADQA,GAAa,EAAW,CAAG,IAAM,KAC7B,EAAM,cACvB,EAAe,EAAa,EAAM,CAAG,IAAI,GAAmB,EAAO,EAAa,CAAC,GAClF,GAGH,IAAK,WACL,IAAK,iBAEH,MAAO,GADQA,GAAa,EAAW,CAAG,IAAM,KAC7B,EAAM,YACvB,EAAe,EAAa,EAAM,CAAG,IAAI,GAAmB,EAAO,EAAa,CAAC,GAClF,GAGH,IAAK,OACH,MAAO,GAAG,EAAM,UAElB,IAAK,UACH,MAAO,GAAG,EAAM,UAElB,IAAK,KACL,IAAK,QAAS,CACZ,GAAM,CAAC,EAAQ,GAAUA,GAAa,EAAW,CAAG,CAAC,KAAM,IAAI,CAAG,CAAC,GAAI,GAAG,CAE1E,MAAO,GAAG,IAAS,EAAM,OADJ,EAAQ,EAAM,CAEhC,IAAI,GACH,GAAgB,EAAqB,EAAK,EAAa,CACnD,GAAG,EAAa,EAAI,GACpB,IAAI,GAAmB,EAAK,EAAa,CAAC,GAC/C,CACA,KAAK,KAAK,CAAC,GAAG,IAGnB,IAAK,UACL,IAAK,aAAc,CACjB,IAAM,EAAe,EAAQ,EAAM,CACnC,GACE,EAAa,QAAU,GACvB,CAAC,EAAuB,EAAa,GAAG,EACxC,CAAC,EAAuB,EAAa,GAAG,CACxC,CACA,GAAM,CAAC,EAAO,GAAU,EAGlB,EAAuB,IAAiB,GACxC,EAAW,EAAqB,EAAO,EAAmB,CAC5D,EAAY,EAAO,CAAE,aAAc,EAAoB,CAAC,CACxD,IACE,EAAY,EAAqB,EAAQ,EAAmB,CAC9D,EAAY,EAAQ,CAAE,aAAc,EAAoB,CAAC,CACzD,IACA,EAAa,OAAO,MAAM,EAAS,CACnC,EACE,GAAG,IACH,IAAI,GAAmB,EAAO,EAAa,CAAC,GAC9C,EACA,EAAc,OAAO,MAAM,EAAU,CACrC,EACE,GAAG,IACH,IAAI,GAAmB,EAAQ,EAAa,CAAC,GAC/C,EAEJ,GACE,CAAC,GACD,IAAe,GACf,IAAgB,GAChB,EAAY,EACZ,CACA,IAAM,EAAU,EAChB,EAAc,EACd,EAAa,EAGf,OAAO,IAAe,UAClB,IAAI,EAAM,MAAM,EAAW,MAAM,EAAM,MAAM,EAAY,GACzD,IAAI,EAAM,KAAK,EAAW,MAAM,EAAM,KAAK,EAAY,QAE3D,MAAO,IAIb,MAAO,ICxKI,GAAkB,CAAE,KAAM,CAAC,CAAE,MAAO,GAAM,CAAC,CAAE,CAO7CE,IACX,EACA,EACA,IACG,CACH,GAAM,CACJ,SACA,wBACA,uBACA,0BACA,uBACA,gBACA,eACA,iBACE,EAEE,GAAoB,EAAmB,IAAwB,CACnE,GAAI,CAAC,EAAmB,EAAI,EAAc,EAAG,IAAiC,IAAI,CAChF,OAAO,EAAY,GAAkB,GAGvC,IAAM,EAAa,IAAI,EAAG,EAAG,WAAW,GACpC,EAAgB,GAEdC,EAAyC,EAAG,MAC/C,IAAI,GAAQ,CACX,GAAI,EAAY,EAAK,CAAE,CACrB,IAAM,EAAqB,EAAiB,EAAK,CAKjD,OAJI,GACF,EAAgB,GACT,GAEF,GAET,GAAM,CAAC,EAAkB,GAAkB,EAAa,EAAK,CAC7D,GACE,CAAC,EAAmB,EAAM,EAAkB,EAAe,EAC3D,EAAK,QAAU,GACf,EAAK,WAAa,GAEjB,IAAyB,IAAA,IAAa,EAAK,QAAU,EAEtD,MAAO,GAET,IAAM,EAAY,EAAU,EAAQ,EAAK,MAAM,CAC/C,OAAO,EACL,EACA,CACE,GAAG,EACH,aAAc,EAAsB,GAAW,UAAU,CACzD,YACD,CACD,EACD,EACD,CACD,OAAO,QAAQ,CAElB,OAAO,EAAY,OAAS,EACxB,EAAY,SAAW,GAAK,CAAC,EAC3B,EAAY,GACZ,EAAG,GAAa,EAAa,CAC/B,IAGN,OAAO,EAAiB,EAAc,EAAU,CAAE,GAAK,EC3EnDC,IAAoB,EAAgB,EAAa,EAAe,KACpE,EAAqB,EAAO,GAAgB,OAAO,GAAU,SAAS,CAClE,OAAO,EAAY,EAAO,CAAE,aAAc,SAAU,CAAC,CAAC,CACtD,EAOOC,IACX,EAEA,EAAU,EAAE,GACT,CACH,GAAM,CAAE,QAAO,WAAU,QAAO,eAAgB,EAC1C,CAAE,eAAc,qBAAoB,WAAY,EAChD,EAAe,IAAgB,QAE/B,CAAE,qBAAuB,GAAW,EAAE,CAEtC,EAAY,EAAiB,EAAK,CAExC,GAAI,IAAc,GAChB,UACS,EAAW,CACpB,GAAM,CAAE,OAAM,aAAc,EAEtB,EAAa,CAAE,MAAO,CAAE,QAAS,CAAC,IAAI,IAAS,EAAE,CAAC,CAAE,CAAE,CACtD,EAAmB,GACvB,EAAe,EAAwB,CACrC,cAAe,IAAM,CAAE,GAAG,EAAG,MAAO,EAAE,MAAQ,GAAG,EAAM,GAAG,EAAE,QAAU,EAAO,EAC9E,CAAC,CACF,CACE,GAAI,EAEJ,cAAe,GACf,QAAS,CAAE,GAAG,EAAQ,QAAS,kBAAmB,GAAO,CAC1D,CACF,CACK,EAAqB,GACzB,EAAe,EAAwB,CACrC,cAAe,IAAM,CAAE,GAAG,EAAG,MAAO,EAAE,MAAQ,SAAS,EAAE,QAAU,QAAS,EAC7E,CAAC,CACF,CACE,GAAI,EAEJ,cAAe,GACf,QAAS,CAAE,GAAG,EAAQ,QAAS,kBAAmB,GAAM,CACzD,CACF,CAEK,EAAgB,CACpB,MAAO,CACL,QAAS,CACP,CAAE,QAAS,CAAE,MAAO,IAAI,IAAS,GAAI,OAAQ,KAAM,CAAE,KAAM,CAAC,EAAmB,CAAE,CAAE,CAAE,CACrF,EAAE,CACH,CACF,CACF,CAED,OAAQ,EAAR,CACE,IAAK,MACH,MAAO,CAAE,MAAO,CAAE,IAAK,CAAC,EAAe,EAAW,CAAE,CAAE,CAExD,IAAK,OACH,MAAO,CAAE,KAAM,CAAC,EAAiB,CAAE,CAErC,IAAK,OACH,OAAO,EAET,IAAK,UACL,IAAK,SACL,IAAK,UAAW,CACd,IAAM,EACJ,IAAS,UACL,GAAe,MACf,IAAS,SACP,GAAe,MACf,GAAe,KAKvB,OAHI,EAAY,GAAK,EAAY,EACxB,CAAE,MAAO,EAAG,GAAK,CAAC,EAAe,CAAE,UAAW,CAAC,EAAY,EAAU,CAAE,CAAC,CAAE,CAAE,CAE9E,CAAE,MAAO,EAAG,GAAK,CAAC,EAAe,EAAU,CAAE,CAAE,GAK5D,GAAI,IAAa,KAAO,CAAC,EACvB,OAAO,EACH,CAAE,IAAK,CAAC,IAAI,IAASD,GAAc,EAAO,EAAO,EAAa,CAAC,CAAE,CACjE,EAAG,GAAQA,GAAc,EAAO,EAAO,EAAa,CAAE,CAG5D,IAAM,EAAa,EAAG,EAAS,CAC/B,OAAQ,EAAR,CACE,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KAAM,CACT,IAAM,EAAgB,GAAe,GACrC,OAAO,EACH,EAAG,GAAgB,CAAC,IAAI,IAAS,IAAI,IAAQ,CAAE,CAC/C,EACE,CACE,KAAM,CACJ,CAAE,IAAK,CAAC,IAAI,IAAS,KAAK,CAAE,CAC5B,EAAG,GAAgB,CAAC,IAAI,IAASA,GAAc,EAAO,EAAO,EAAa,CAAC,CAAE,CAC9E,CACF,CACD,EAAG,GAAQ,EAAG,GAAgBA,GAAc,EAAO,EAAO,EAAa,CAAE,CAAE,CAGnF,IAAK,WACH,OAAO,EACH,CAAE,OAAQ,QAAQ,EAAM,iBAAiB,EAAM,GAAI,CACnD,EACE,CAAE,YAAa,CAAE,MAAO,IAAI,IAAS,MAAO,EAAO,CAAE,CACrD,EAAG,GAAQ,CAAE,OAAQ,EAAO,CAAE,CAEtC,IAAK,aACH,OAAO,EACH,CAAE,OAAQ,QAAQ,EAAM,mBAAmB,EAAM,GAAI,CACrD,EACE,CAAE,YAAa,CAAE,MAAO,IAAI,IAAS,MAAO,IAAI,IAAS,CAAE,CAC3D,EAAG,GAAQ,CAAE,OAAQ,IAAI,IAAS,CAAE,CAE5C,IAAK,WACH,OAAO,EACH,CAAE,OAAQ,QAAQ,EAAM,iBAAiB,EAAM,GAAI,CACnD,EACE,CAAE,YAAa,CAAE,MAAO,IAAI,IAAS,MAAO,GAAG,EAAM,GAAI,CAAE,CAC3D,EAAG,GAAQ,CAAE,OAAQ,GAAG,EAAM,GAAI,CAAE,CAE5C,IAAK,iBACH,OAAO,EACH,CAAE,OAAQ,SAAS,EAAM,iBAAiB,EAAM,GAAI,CACpD,EACE,CAAE,KAAM,CAAE,YAAa,CAAE,MAAO,IAAI,IAAS,MAAO,EAAO,CAAE,CAAE,CAC/D,EAAG,GAAQ,CAAE,KAAM,CAAE,OAAQ,EAAO,CAAE,CAAE,CAEhD,IAAK,mBACH,OAAO,EACH,CAAE,OAAQ,SAAS,EAAM,mBAAmB,EAAM,GAAI,CACtD,EACE,CAAE,KAAM,CAAE,YAAa,CAAE,MAAO,IAAI,IAAS,MAAO,IAAI,IAAS,CAAE,CAAE,CACrE,EAAG,GAAQ,CAAE,KAAM,CAAE,OAAQ,IAAI,IAAS,CAAE,CAAE,CAEtD,IAAK,iBACH,OAAO,EACH,CAAE,OAAQ,SAAS,EAAM,iBAAiB,EAAM,GAAI,CACpD,EACE,CAAE,KAAM,CAAE,YAAa,CAAE,MAAO,IAAI,IAAS,MAAO,GAAG,EAAM,GAAI,CAAE,CAAE,CACrE,EAAG,GAAQ,CAAE,KAAM,CAAE,OAAQ,GAAG,EAAM,GAAI,CAAE,CAAE,CAEtD,IAAK,OACH,OAAO,EAAoB,CAAE,IAAK,CAAC,IAAI,IAAS,KAAK,CAAE,CAAG,EAAG,GAAQ,KAAM,CAE7E,IAAK,UACH,OAAO,EAAoB,CAAE,IAAK,CAAC,IAAI,IAAS,KAAK,CAAE,CAAG,EAAG,GAAQ,CAAE,IAAK,KAAM,CAAE,CAEtF,IAAK,KACL,IAAK,QAAS,CACZ,IAAM,EAAe,EAAQ,EAAM,CACnC,OAAO,EACH,CACE,OAAQ,GAAG,IAAe,QAAU,IAAM,GAAG,GAAG,EAC7C,IAAI,GAAO,QAAQ,IAAM,CACzB,KAAK,IAAI,CAAC,kBAAkB,EAAM,GACtC,CACD,EACE,IAAe,QACb,CACE,KAAM,EACH,GAAe,IAAK,CACnB,IAAI,IACJ,EAAa,IAAI,GAAOA,GAAc,EAAK,EAAK,EAAa,CAAC,CAC/D,CACF,CACF,CACD,EACG,GAAe,IAAc,CAC5B,IAAI,IACJ,EAAa,IAAI,GAAOA,GAAc,EAAK,EAAK,EAAa,CAAC,CAC/D,CACF,CACH,EACG,GAAQ,EACN,GAAe,IAAc,EAAa,IAAI,GAC7CA,GAAc,EAAK,EAAK,EAAa,CACtC,CACF,CACF,CAGT,IAAK,UACL,IAAK,aAAc,CACjB,IAAM,EAAe,EAAQ,EAAM,CACnC,GACE,EAAa,QAAU,GACvB,EAAa,EAAa,GAAG,EAC7B,EAAa,EAAa,GAAG,CAC7B,CACA,GAAM,CAAC,EAAO,GAAU,EAClB,EAAWA,GAAc,EAAO,IAAY,GAAK,CACjD,EAAYA,GAAc,EAAQ,IAAY,GAAK,CACrD,EAAa,GAAuB,OAAO,MAAM,EAAS,CAA9B,EAAyC,EACrE,EAAc,GAAwB,OAAO,MAAM,EAAU,CAAhC,EAA4C,EAC7E,GACE,CAAC,GACD,IAAe,GACf,IAAgB,GAChB,EAAY,EACZ,CACA,IAAM,EAAU,EAChB,EAAc,EACd,EAAa,EAYb,OATE,IAAe,UACV,EACH,CAAE,KAAM,CAAC,IAAI,IAAS,IAAI,IAAa,CAAE,KAAM,CAAC,IAAI,IAAS,IAAI,IAAc,CAAE,CACjF,EACE,CACE,KAAM,CAAC,CAAE,KAAM,CAAC,IAAI,IAAS,EAAW,CAAE,CAAE,CAAE,KAAM,CAAC,IAAI,IAAS,EAAY,CAAE,CAAC,CAClF,CACD,EAAG,GAAQ,CAAE,KAAM,EAAY,KAAM,EAAa,CAAE,CAEnD,EACH,CACE,IAAK,CACH,CAAE,IAAK,CAAC,IAAI,IAAS,IAAI,IAAa,CAAE,CACxC,CAAE,IAAK,CAAC,IAAI,IAAS,IAAI,IAAc,CAAE,CAC1C,CACF,CACD,EACE,CACE,IAAK,CAAC,CAAE,IAAK,CAAC,IAAI,IAAS,EAAW,CAAE,CAAE,CAAE,IAAK,CAAC,IAAI,IAAS,EAAY,CAAE,CAAC,CAC/E,CACD,CAAE,IAAK,CAAC,EAAG,GAAQ,CAAE,IAAK,EAAY,CAAE,CAAE,EAAG,GAAQ,CAAE,IAAK,EAAa,CAAE,CAAC,CAAE,MAGtF,MAAO,IAIb,MAAO,ICvPIE,IAA8C,EAAM,IAAY,CAC3E,IAAM,EAAW,GAAiC,EAAM,EAAQ,CAChE,OAAO,EAAW,KAAK,UAAU,EAAS,CAAG,ICFlCC,IAA6D,EAAW,IAAY,CAC/F,GAAM,CACJ,SACA,qBACA,wBACA,uBACA,0BACA,uBACA,gBACA,eACA,iBACE,EAEE,GAAoB,EAAsB,IAAgC,CAC9E,GAAI,CAAC,EAAmB,EAAI,EAAc,EAAG,IAAiC,IAAI,CAChF,OAAO,EAAY,EAAqB,GAG1C,IAAM,EAAiB,EAAE,CACrB,EAAsB,GACtB,EAAY,GAEhB,IAAK,IAAM,KAAQ,EAAG,MAAO,CAE3B,GAAI,OAAO,GAAS,SAAU,CAC5B,EAAsB,EACtB,SAIF,GAAI,EAAY,EAAK,CAAE,CACrB,IAAM,EAAiB,EAAiB,EAAK,CACzC,IACE,CAAC,GAAa,IAChB,EAAe,KAAK,EAAoB,CACxC,EAAsB,IAExB,EAAY,GACZ,EAAe,KAAK,EAAe,EAErC,SAIF,GAAM,CAAC,EAAkB,GAAkB,EAAa,EAAK,CAC7D,GACE,CAAC,EAAmB,EAAM,EAAkB,EAAe,EAC3D,EAAK,QAAU,GACf,EAAK,WAAa,GAEjB,IAAyB,IAAA,IAAa,EAAK,QAAU,EAEtD,SAGF,IAAM,EAAY,EAAU,EAAQ,EAAK,MAAM,CACzC,EAAgB,EAAc,EAAM,CACxC,GAAG,EACH,aAAc,EAAsB,GAAW,UAAU,CACzD,cAAe,EAAK,aAAe,WAAa,QAChD,YACD,CAAC,CAEE,IACE,CAAC,GAAa,IAChB,EAAe,KAAK,EAAoB,CACxC,EAAsB,IAExB,EAAY,GACZ,EAAe,KAAK,EAAc,EAItC,IAAM,EAAa,EAAe,KAAK,EAAgB,EAAG,CAAG,IAAI,EAAG,WAAW,GAAK,IAAI,CAElF,CAAC,EAAQ,GAAU,EAAG,KAAO,CAAC,EAAY,CAAC,GAAG,EAAG,IAAM,IAAM,GAAG,GAAI,IAAI,CAAG,CAAC,GAAI,GAAG,CAEzF,OAAO,EAAa,GAAG,IAAS,IAAa,IAAW,GAG1D,OAAO,EAAiB,EAAW,GAAK,EClFpCC,GAAgB,GAAe,EAAG,WAAW,MAAM,EAAI,EAAG,WAAW,UAAU,CAE/E,IAAkB,EAAgB,IAAqBC,EAAS,KAAK,EAAO,GAAK,EAGjF,IAAsB,EAAQ,IAClC,OAAO,GAAM,UAAY,CAAC,EAAe,GAAG,IAAM,EAAE,WAAW,IAAK,MAAM,CAO/DC,IACX,EAEA,EAAO,EAAE,GACN,CACH,GAAM,CAAE,QAAO,WAAU,QAAO,eAAgB,EAC1C,CAAE,eAAc,eAAc,sBAAuB,EACrD,EAAe,IAAgB,QAC/B,EAAa,EAAG,IAAa,IAAM,KAAO,EAAS,CACnD,EACJ,OAAO,GAAU,UACjB,OAAO,GAAU,WACjB,OAAO,GAAU,UACjB,EAAqB,EAAO,EAAa,CAErC,EAAY,EAAiB,EAAK,CAExC,GAAI,IAAc,GAChB,MAAO,MACE,EAAW,CACpB,GAAM,CAAE,OAAM,aAAc,EAEtB,EAAoB,GACxB,EAAe,EAAK,MAAwB,CAC1C,cAAe,IAAM,CAAE,GAAG,EAAG,MAAO,EAAE,OAAS,QAAS,EACzD,CAAC,CACF,EACD,CAEK,EAAa,GAAG,EAAM,SACtB,EAAgB,GAAG,EAAM,KAAK,EAAkB,UAEtD,OAAQ,EAAR,CACE,IAAK,MACH,MAAO,GAAG,EAAc,MAAM,IAEhC,IAAK,OACH,MAAO,GAAG,EAAc,OAE1B,IAAK,OACH,MAAO,GAAG,EAAc,OAE1B,IAAK,UACL,IAAK,SACL,IAAK,UAAW,CACd,IAAM,EAAK,IAAS,UAAY,KAAO,IAAS,SAAW,KAAO,KAKlE,OAHI,EAAY,GAAK,EAAY,EACxB,GAAG,EAAc,GAAG,EAAG,IAAI,EAAW,KAAK,EAAU,GAEvD,GAAG,EAAc,GAAG,EAAG,GAAG,MAKvC,OAAQ,EAAR,CACE,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,KACL,IAAK,IACL,IAAK,KACH,MAAO,GAAG,EAAM,GAAG,EAAW,GAC5B,GAAgB,EACZ,EAAa,EAAM,CACnB,IAAI,GAAmB,EAAO,EAAa,CAAC,KAGpD,IAAK,WACL,IAAK,iBACH,OAAO,GACL,GAAG,EAAM,WACP,GAAgB,EACZ,EAAa,EAAM,CACnB,IAAI,GAAmB,EAAO,EAAa,CAAC,KAElDF,GAAa,EAAW,CACzB,CAEH,IAAK,aACL,IAAK,mBAMH,OAAO,GAAe,GAAG,EAAM,WALf,EACZ,cAAc,EAAa,EAAM,CAAC,GAClC,IACG,OAAO,GAAU,UAAY,CAAC,EAAM,WAAW,IAAI,EAAK,EAAe,IAAM,KAC7E,GAAmB,EAAO,EAAa,CAAC,KACMA,GAAa,EAAW,CAAC,CAGhF,IAAK,WACL,IAAK,iBAMH,OAAO,GAAe,GAAG,EAAM,WALf,EACZ,GAAG,EAAa,EAAM,CAAC,cACvB,IAAI,GAAmB,EAAO,EAAa,GACxC,OAAO,GAAU,UAAY,CAAC,EAAM,SAAS,IAAI,EAAK,EAAe,IAAM,GAC7E,KACgDA,GAAa,EAAW,CAAC,CAGhF,IAAK,OACH,MAAO,GAAG,EAAM,UAElB,IAAK,UACH,MAAO,GAAG,EAAM,UAElB,IAAK,KACL,IAAK,QAAS,CACZ,IAAMC,EAASD,GAAa,EAAW,CAAG,IAAM,GAC1C,EAAe,EAAQ,EAAM,CACnC,OAAO,EAAa,OAAS,EACzB,GAAGC,EAAO,GAAG,EACV,IACC,GACE,GAAG,EAAM,MACP,GAAgB,EAAqB,EAAK,EAAa,CACnD,GAAG,EAAa,EAAI,GACpB,IAAI,GAAmB,EAAK,EAAa,CAAC,KAEnD,CACA,KAAK,OAAO,CAAC,GAChB,GAGN,IAAK,UACL,IAAK,aAAc,CACjB,IAAM,EAAe,EAAQ,EAAM,CACnC,GACE,EAAa,QAAU,GACvB,CAAC,EAAuB,EAAa,GAAG,EACxC,CAAC,EAAuB,EAAa,GAAG,CACxC,CACA,GAAM,CAAC,EAAO,GAAU,EAGlB,EAAuB,IAAiB,GACxC,EAAW,EAAqB,EAAO,EAAmB,CAC5D,EAAY,EAAO,CAAE,aAAc,EAAoB,CAAC,CACxD,IACE,EAAY,EAAqB,EAAQ,EAAmB,CAC9D,EAAY,EAAQ,CAAE,aAAc,EAAoB,CAAC,CACzD,IACA,EAAa,OAAO,MAAM,EAAS,CACnC,EACE,GAAG,IACH,IAAI,GAAmB,EAAO,EAAa,CAAC,GAC9C,EACA,EAAc,OAAO,MAAM,EAAU,CACrC,EACE,GAAG,IACH,IAAI,GAAmB,EAAQ,EAAa,CAAC,GAC/C,EACJ,GACE,CAAC,GACD,IAAe,GACf,IAAgB,GAChB,EAAY,EACZ,CACA,IAAM,EAAU,EAChB,EAAc,EACd,EAAa,EAEf,OAAO,IAAe,UAClB,IAAI,EAAM,MAAM,EAAW,OAAO,EAAM,MAAM,EAAY,GAC1D,IAAI,EAAM,KAAK,EAAW,MAAM,EAAM,KAAK,EAAY,QAE3D,MAAO,IAKb,MAAO,ICxLHE,IAA2B,EAAQ,EAAmB,IAC1D,GAAgB,OAAO,GAAM,SACzB,EAAE,WAAW,GAAG,IAAa,GAAG,IAAY,IAAY,CACxD,EAOOC,IACX,CAAE,WAAU,QAAO,eAEnB,CACE,eACA,eACA,qBACA,sBACA,kBACA,iBAAiB,KACjB,2BACA,gBAAgB,CAAC,GAAI,GAAG,CACxB,gBACE,EAAE,GACH,CACH,IAAM,EAAe,IAAgB,QAC/B,EAAoB,EAAG,EAAS,CAChC,EAAY,GAAmB,IAG/B,EAAc,GAClB,GAAG,EAAc,KAAK,IAAY,IAAI,IAAY,EAAc,KAC5D,EAAe,GAAWD,GAAwB,EAAG,EAAW,EAAa,CAC7E,EAAiB,GAAW,EAAW,EAAY,EAAE,CAAC,CAEtD,EAAiB,GACrB,GAAmB,EAAG,CAAE,sBAAqB,2BAA0B,CAAC,CACpE,GAAU,GAAG,IACjB,EAAe,aAAa,GAAK,SAC7B,UAAU,EAAO,KAAK,KAAK,CAAC,GAC5B,EAAO,KAAK,IAAI,EAAe,GAAG,CAExC,OAAQ,EAAR,CACE,IAAK,OACL,IAAK,UACH,MAAO,GAGT,IAAK,KACL,IAAK,QAAS,CACZ,IAAM,EAAe,EAAQ,EAAM,CAYnC,OAXI,EAAa,OAAS,EACjB,IAAI,EACR,IAAI,GACH,EACI,EAAc,EAAE,CAChB,EAAqB,EAAG,EAAa,CACnC,GAAG,EAAa,EAAE,GAClB,GAAG,EAAc,EAAE,GAC1B,CACA,KAAK,KAAK,CAAC,GAET,GAGT,IAAK,UACL,IAAK,aAAc,CACjB,IAAM,EAAe,EAAQ,EAAO,CAAE,mBAAoB,GAAM,CAAC,CACjE,GACE,EAAa,OAAS,GACtB,CAAC,EAAa,EAAa,GAAG,EAC9B,CAAC,EAAa,EAAa,GAAG,CAE9B,MAAO,GAGT,GAAM,CAAC,EAAO,GAAU,EAElB,EAAW,EAAqB,EAAO,EAAa,CACtD,EAAY,EAAO,CAAE,aAAc,SAAU,CAAC,CAC9C,IACE,EAAY,EAAqB,EAAQ,EAAa,CACxD,EAAY,EAAQ,CAAE,aAAc,SAAU,CAAC,CAC/C,IACE,EAAa,OAAO,MAAM,EAAS,CAAI,EAAe,GAAG,IAAU,EAAS,EAC5E,EAAc,OAAO,MAAM,EAAU,CACvC,EACE,GAAG,IACH,EACF,EAEE,EAAoB,CAAC,EAAY,EAAY,CAWnD,MATE,CAAC,GACD,IAAe,GACf,IAAgB,GAChB,EAAY,IAEZ,EAAkB,GAAK,EACvB,EAAkB,GAAK,IAKrB,EACI,EAAkB,IAAI,GAAK,EAAc,EAAE,CAAC,CAC5C,EAAkB,MAAM,GAAK,EAAqB,EAAG,EAAa,CAAC,CACjE,EAAkB,IAAI,GAAK,EAAY,EAAG,CAAE,aAAc,SAAU,CAAC,CAAC,CACtE,EAAkB,IAAI,GAAK,EAAc,EAAE,CAAC,EAIjD,KAAK,IAAI,GAAc,KAAO,MAAM,GAAG,CAI9C,IAAK,WACL,IAAK,iBACH,OAAO,EACH,EAAO,EAAW,IAAI,CAAE,EAAc,EAAM,CAAE,EAAW,IAAI,CAAC,CAC9D,EAAW,IAAI,EAAY,EAAM,CAAC,GAAG,CAE3C,IAAK,aACL,IAAK,mBACH,OAAO,EACH,EAAO,EAAc,EAAM,CAAE,EAAW,IAAI,CAAC,CAC7C,EAAW,GAAG,EAAY,EAAM,CAAC,GAAG,CAE1C,IAAK,WACL,IAAK,iBACH,OAAO,EACH,EAAO,EAAW,IAAI,CAAE,EAAc,EAAM,CAAC,CAC7C,EAAW,IAAI,EAAY,EAAM,GAAG,CAO5C,OAJI,OAAO,GAAU,UACZ,EAAQ,OAAS,QAGnB,EACH,EAAc,EAAM,CACpB,EAAqB,EAAO,EAAa,CACvC,GAAG,EAAa,EAAM,GACtB,GAAG,EAAc,EAAM,ICxIlBE,IAA8C,EAAM,IAA8B,CAC7F,IAAM,EAAO,GAAuC,EAAE,CAEhD,CAAE,eAAc,qBAAoB,UAAU,EAAE,EAAK,EACrD,CAAE,UAAS,mBAAkB,gBAAiB,EAMpD,GAAI,CAAC,GAAW,CAAC,EAAkB,OAEnC,GAAM,CACJ,UACA,KACA,KACA,MACA,UACA,YACA,SACA,OACA,KACA,MACA,KACA,aACA,aACA,UACA,OACE,EAEE,CAAE,QAAO,WAAU,QAAO,eAAgB,EAE1C,EACJ,GAAgB,kBAAkB,KAAK,EAAM,CACxC,EAAI,IAAI,EAAM,CACf,EAAQ,GACR,EAAa,EAAG,EAAS,CAEzB,EAAe,IAAgB,QAC/B,EAAkB,GAAe,EAAe,EAAQ,GAAK,EAEnE,GAAI,CAAC,EAAQ,OAEb,IAAM,EAAY,EAAiB,EAAK,CAEpC,OAAc,OAEP,EAAW,CAEpB,GAAI,EAAK,SAAW,aAAc,OAElC,GAAM,CAAE,OAAM,aAAc,EAGtB,EAAoB,aAMpB,EAAoB,GAJT,EAAe,EAAK,MAAwB,CAC3D,cAAe,IAAM,CAAE,GAAG,EAAG,MAAO,EAAmB,EACxD,CAAC,CAEmE,CACnE,GAAI,EACJ,QAAS,CAAE,GAAG,EAAK,QAAS,aAAc,GAAM,CACjD,CAAC,CAEF,OAAQ,EAAR,CACE,IAAK,MACH,MAAO,EAAG,gCAAgC,EAAO,OAAO,EAAI,IAAI,EAAkB,CAAC,SAAS,EAAkB,EAAE,CAAE,EAAiB,CAAC,mBAAmB,EAAO,MAEhK,IAAK,OACH,MAAO,EAAG,oCAAoC,EAAO,OAAO,EAAI,IAAI,EAAkB,CAAC,SAAS,EAAkB,EAAE,CAAE,EAAiB,CAAC,GAE1I,IAAK,OACH,MAAO,EAAG,gCAAgC,EAAO,OAAO,EAAI,IAAI,EAAkB,CAAC,SAAS,EAAkB,EAAE,CAAE,EAAiB,CAAC,GAEtI,IAAK,UACL,IAAK,SACL,IAAK,UAAW,CACd,IAAM,EAAK,IAAS,UAAY,KAAO,IAAS,SAAW,KAAO,IAElE,OAAO,EAAY,GAAK,EAAY,EAChC,CAAG,mCAAmC,EAAO,mBAAmB,EAAO,OAAO,EAAI,IAAI,EAAkB,CAAC,SAAS,EAAkB,EAAE,CAAE,EAAiB,CAAC,IAAI,EAAI,IAAI,GAAG,EAAG,GAAG,IAAY,GAC3L,CAAG,gCAAgC,EAAO,OAAO,EAAI,IAAI,EAAkB,CAAC,SAAS,EAAkB,EAAE,CAAE,EAAiB,CAAC,IAAI,EAAI,IAAI,GAAG,EAAG,GAAG,IAAY,KAKxK,OAAQ,EAAR,CACE,IAAK,IACH,OAAO,EAAG,EAAQ,EAAe,EAAM,CAAC,CAC1C,IAAK,KACH,OAAO,EAAG,EAAQ,EAAe,EAAM,CAAC,CAC1C,IAAK,IACH,OAAO,EAAG,EAAQ,EAAe,EAAM,CAAC,CAC1C,IAAK,IACH,OAAO,EAAG,EAAQ,EAAe,EAAM,CAAC,CAC1C,IAAK,KACH,OAAO,EAAI,EAAQ,EAAe,EAAM,CAAC,CAC3C,IAAK,KACH,OAAO,EAAI,EAAQ,EAAe,EAAM,CAAC,CAC3C,IAAK,aACL,IAAK,mBACH,OAAQ,IAAe,mBAAqB,EAAU,GACpD,EACA,EAAe,CAAG,GAAG,EAAe,EAAM,CAAC,SAAW,GAAG,EAAM,GAChE,CACH,IAAK,WACL,IAAK,iBACH,OAAQ,IAAe,iBAAmB,EAAU,GAClD,EACA,EAAe,CAAG,UAAU,EAAe,EAAM,CAAC,SAAW,IAAI,EAAM,GACxE,CACH,IAAK,WACL,IAAK,iBACH,OAAQ,IAAe,iBAAmB,EAAU,GAClD,EACA,EAAe,CAAG,UAAU,EAAe,EAAM,GAAK,IAAI,IAC3D,CACH,IAAK,OACH,OAAO,EAAO,EAAO,CACvB,IAAK,UACH,OAAO,EAAU,EAAO,CAC1B,IAAK,KACL,IAAK,QAAS,CACZ,IAAM,EAAe,EAAQ,EAAM,CAAC,IAAI,GAAK,EAAe,EAAE,CAAC,CAC/D,OAAO,IAAe,QAClB,EAAW,EAAQ,EAAa,CAChC,EAAQ,EAAQ,EAAa,CAEnC,IAAK,UACL,IAAK,aAAc,CACjB,IAAM,EAAe,EAAQ,EAAM,CACnC,GACE,EAAa,QAAU,GACvB,EAAa,EAAa,GAAG,EAC7B,EAAa,EAAa,GAAG,CAC7B,CACA,GAAI,CAAC,EAAO,GAAU,EAGhB,EAAuB,IAAiB,GAC9C,GACE,CAAC,GACD,EAAqB,EAAO,EAAmB,EAC/C,EAAqB,EAAQ,EAAmB,CAChD,CACA,IAAM,EAAW,EAAY,EAAO,CAAE,aAAc,EAAoB,CAAC,CACnE,EAAY,EAAY,EAAQ,CAAE,aAAc,EAAoB,CAAC,CAC3E,GAAI,CAAC,GAAsB,EAAY,EAAU,CAC/C,IAAM,EAAU,EAChB,EAAS,EACT,EAAQ,OAER,EAAQ,EACR,EAAS,OAIP,IACF,EAAQ,EAAe,EAAM,CAC7B,EAAS,EAAe,EAAO,EAGnC,OAAO,IAAe,aAClB,EAAW,EAAQ,EAAO,EAAO,CACjC,EAAQ,EAAQ,EAAO,EAAO,CAEpC,OAEF,QACE,UCpKOC,IAGV,EAAW,EAAS,KACpB,EAAyC,IAAgC,CACxE,GAAM,CACJ,SACA,wBACA,uBACA,0BACA,uBACA,eACA,iBACE,EAEJ,GAAI,CAAC,GAAW,CAAC,EAAkB,OAEnC,GAAM,CAAE,MAAK,MAAK,MAAO,EAEnB,EAAgB,GAEhB,GAAoB,EAAmB,IAA0C,CACrF,GAAI,CAAC,EAAmB,EAAI,EAAc,EAAG,IAAiC,IAAI,CAChF,OAGF,IAAM,EAAiB,EAAG,MACvB,IAAI,GAAQ,CACX,GAAI,EAAY,EAAK,CACnB,OAAO,EAAiB,EAAK,CAE/B,GAAM,CAAC,EAAkB,GAAkB,EAAa,EAAK,CAC7D,GACE,CAAC,EAAmB,EAAM,EAAkB,EAAe,EAC3D,EAAK,QAAU,GACf,EAAK,WAAa,GAEjB,IAAyB,IAAA,IAAa,EAAK,QAAU,EAEtD,OAEF,IAAM,EAAY,EAAU,EAAQ,EAAK,MAAM,CAC/C,OAAO,EAAc,EAAM,CACzB,GAAG,EACH,aAAc,EAAsB,GAAW,UAAU,CACzD,YACA,QAAS,CAAE,GAAG,EAAQ,QAAS,UAAS,mBAAkB,CAC3D,CAAC,EACF,CACD,OAAO,QAAQ,CAElB,GAAI,EAAe,SAAW,EAC5B,OAGF,IAAMC,EACJ,EAAG,aAAe,KAAO,EAAG,GAAG,EAAe,CAAI,EAAI,GAAG,EAAe,CAE1E,OAAO,EAAG,IAAM,EAAI,EAAa,CAAG,GAGtC,OAAO,EAAiB,EAAc,EAAU,CAAE,GAAK,ECtE9CC,IACX,EACA,IACG,CACH,GAAM,CACJ,SACA,wBACA,uBACA,0BACA,uBACA,gBACA,eACA,iBACE,EAGE,EAAoB,GAAmD,CAC3E,GAAI,CAAC,EAAmB,EAAI,EAAc,EAAG,IAAiC,IAAI,CAChF,MAAO,GAGT,IAAM,EAAiB,EAAG,MACvB,IAAI,GAAQ,CACX,GAAI,EAAY,EAAK,CACnB,OAAO,EAAiB,EAAK,CAE/B,GAAM,CAAC,EAAkB,GAAkB,EAAa,EAAK,CAC7D,GACE,CAAC,EAAmB,EAAM,EAAkB,EAAe,EAC3D,EAAK,QAAU,GACf,EAAK,WAAa,GAEjB,IAAyB,IAAA,IAAa,EAAK,QAAU,EAEtD,MAAO,GAET,IAAM,EAAY,EAAU,EAAQ,EAAK,MAAM,CAC/C,OAAO,EAAc,EAAM,CACzB,GAAG,EACH,aAAc,EAAsB,GAAW,UAAU,CACzD,YACD,CAAC,EACF,CACD,OAAO,QAAQ,CAMlB,OAJI,EAAe,SAAW,EACrB,GAGF,CACL,KAAM,EAAG,IACL,CACE,SAAU,QAAQ,KAAK,EAAG,WAAW,CACjC,CAAE,KAAM,CAAE,OAAQ,EAAgB,CAAE,CACpC,EACL,CACD,EAAG,QAAQ,KAAK,EAAG,WAAW,CAAG,SAAW,QAAS,EAAgB,CAC1E,EAGG,EAAqB,EAAiB,EAAc,EAAU,CAAC,CACrE,OAAO,IAAuB,GAAQ,EAAE,CAAG,GC9DhCC,IACX,EACA,IACG,CACH,GAAM,CACJ,SACA,qBACA,wBACA,uBACA,0BACA,uBACA,gBACA,eACA,iBACE,EAEE,GAAoB,EAAsB,IAAgC,CAC9E,GAAI,CAAC,EAAmB,EAAI,EAAc,EAAG,IAAiC,IAAI,CAChF,OAAO,EAAY,EAAqB,GAG1C,IAAM,EAAiB,EAAE,CACrB,EAAsB,GACtB,EAAY,GAEhB,IAAK,IAAM,KAAQ,EAAG,MAAO,CAE3B,GAAI,OAAO,GAAS,SAAU,CAC5B,EAAsB,EACtB,SAIF,GAAI,EAAY,EAAK,CAAE,CACrB,IAAM,EAAiB,EAAiB,EAAK,CACzC,IACE,CAAC,GAAa,IAChB,EAAe,KAAK,EAAoB,CACxC,EAAsB,IAExB,EAAY,GACZ,EAAe,KAAK,EAAe,EAErC,SAIF,GAAM,CAAC,EAAkB,GAAkB,EAAa,EAAK,CAC7D,GACE,CAAC,EAAmB,EAAM,EAAkB,EAAe,EAC3D,EAAK,QAAU,GACf,EAAK,WAAa,GAEjB,IAAyB,IAAA,IAAa,EAAK,QAAU,EAEtD,SAGF,IAAM,EAAY,EAAU,EAAQ,EAAK,MAAM,CACzC,EAAgB,EAAc,EAAM,CACxC,GAAG,EACH,aAAc,EAAsB,GAAW,UAAU,CACzD,cAAe,EAAK,aAAe,WAAa,QAChD,YACD,CAAC,CAEE,IACE,CAAC,GAAa,IAChB,EAAe,KAAK,EAAoB,CACxC,EAAsB,IAExB,EAAY,GACZ,EAAe,KAAK,EAAc,EAItC,IAAM,EAAa,EAAe,KAAK,EAAgB,EAAG,CAAG,IAAI,EAAG,WAAW,GAAK,IAAI,CAElF,CAAC,EAAQ,GAAU,EAAG,KAAO,CAAC,EAAY,CAAC,GAAG,EAAG,IAAM,OAAS,GAAG,GAAI,IAAI,CAAG,CAAC,GAAI,GAAG,CAE5F,OAAO,EAAa,GAAG,IAAS,IAAa,IAAW,GAG1D,OAAO,EAAiB,EAAW,GAAK,EC7E7BC,IACX,EACA,IACG,CACH,GAAM,CACJ,SACA,wBACA,uBACA,0BACA,uBACA,gBACA,eACA,iBACE,EAEE,EAAQ,EAAc,EAAU,CAEhC,GAAoB,EAAmB,IAAuC,CAClF,GAAI,CAAC,EAAmB,EAAI,EAAc,EAAG,IAAiC,IAAI,CAChF,MAAO,GAGT,IAAM,EAAiB,EAAG,MACvB,IAAI,GAAQ,CACX,GAAI,EAAY,EAAK,CACnB,OAAO,EAAiB,EAAK,CAE/B,GAAM,CAAC,EAAkB,GAAkB,EAAa,EAAK,CAC7D,GACE,CAAC,EAAmB,EAAM,EAAkB,EAAe,EAC3D,EAAK,QAAU,GACf,EAAK,WAAa,GAEjB,IAAyB,IAAA,IAAa,EAAK,QAAU,EAEtD,MAAO,GAET,IAAM,EAAY,EAAU,EAAQ,EAAK,MAAM,CAC/C,OAAO,EAAc,EAAM,CACzB,GAAG,EACH,aAAc,EAAsB,GAAW,UAAU,CACzD,YACD,CAAC,EACF,CACD,OAAO,QAAQ,CAElB,GAAI,EAAe,SAAW,EAC5B,MAAO,GAGT,IAAMC,EAA8B,EAAG,EAAG,YAAa,EAAgB,CAIvE,OAAO,EAAG,IAAM,CAAE,IAAK,EAAe,CAAG,GAG3C,OAAO,EAAiB,EAAO,GAAK,EC9DzBC,IAA6D,EAAW,IAAY,CAC/F,GAAM,CACJ,SACA,qBACA,wBACA,uBACA,0BACA,uBACA,gBACA,eACA,iBACE,EAEE,GAAoB,EAAmB,IAAwB,CACnE,GAAI,CAAC,EAAmB,EAAI,EAAc,EAAG,IAAiC,IAAI,CAChF,OAAO,EAAY,EAAqB,GAG1C,IAAMC,EAAkB,EAAG,MACxB,IAAI,GAAQ,CACX,GAAI,EAAY,EAAK,CACnB,OAAO,EAAiB,EAAK,CAE/B,GAAM,CAAC,EAAkB,GAAkB,EAAa,EAAK,CAC7D,GACE,CAAC,EAAmB,EAAM,EAAkB,EAAe,EAC3D,EAAK,QAAU,GACf,EAAK,WAAa,GAEjB,IAAyB,IAAA,IAAa,EAAK,QAAU,EAEtD,MAAO,GAET,IAAM,EAAY,EAAU,EAAQ,EAAK,MAAM,CAC/C,OAAO,EAAc,EAAM,CACzB,GAAG,EACH,aAAc,EAAsB,GAAW,UAAU,CACzD,cAAe,EAAK,aAAe,WAAa,QAChD,YACD,CAAC,EACF,CACD,OAAO,QAAQ,CAEZ,EAAa,EAAM,KAAK,GAAG,CAE3B,CAAC,EAAW,GAAa,EAAG,IAAM,CAAC,KAAM,IAAI,CAAG,CAAC,GAAI,GAAG,CACxD,CAAC,EAAQ,GACb,EAAM,OAAS,EACX,CAAC,GAAG,EAAU,GAAG,EAAG,aAAe,KAAO,IAAM,MAAO,IAAI,IAAY,CACvE,CAAC,EAAW,EAAU,CAE5B,OAAO,EAAa,GAAG,IAAS,IAAa,IAAW,GAG1D,OAAO,EAAiB,EAAc,EAAU,CAAE,GAAK,EC1DnD,GAAe,GAAgB,EAAI,WAAW,IAAI,EAAI,EAAI,SAAS,IAAI,CAShEC,IACX,EACA,EACA,IACG,CACH,GAAM,CACJ,SACA,qBACA,wBACA,uBACA,0BACA,uBACA,gBACA,eACA,iBACE,EAEE,GAAoB,EAAmB,IAAwB,CACnE,GAAI,CAAC,EAAmB,EAAI,EAAc,EAAG,IAAiC,IAAI,CAChF,OAAO,EAAY,EAAqB,GAG1C,IAAM,EAAa,KAAK,EAAG,EAAG,WAAW,CAAC,GACtC,EAAgB,GAEdC,EAAwB,EAAG,MAC9B,IAAI,GAAQ,CACX,GAAI,EAAY,EAAK,CAAE,CACrB,IAAM,EAAqB,EAAiB,EAAK,CAMjD,OALI,GACF,EAAgB,GAET,GAAY,EAAmB,CAAG,EAAqB,IAAI,EAAmB,IAEhF,GAET,GAAM,CAAC,EAAkB,GAAkB,EAAa,EAAK,CAC7D,GACE,CAAC,EAAmB,EAAM,EAAkB,EAAe,EAC3D,EAAK,QAAU,GACf,EAAK,WAAa,GAEjB,IAAyB,IAAA,IAAa,EAAK,QAAU,EAEtD,MAAO,GAET,IAAM,EAAY,EAAU,EAAQ,EAAK,MAAM,CAC/C,OAAO,EACL,EACA,CACE,GAAG,EACH,aAAc,EAAsB,GAAW,UAAU,CACzD,YACD,CACD,EACD,EACD,CACD,OAAO,QAAQ,CAElB,OAAO,EAAY,OAAS,EACxB,EAAY,SAAW,GAAK,CAAC,EAC3B,EAAY,GACZ,GAAG,EAAW,IAAI,EAAY,KAAK,IAAI,CAAC,GAC1C,GAGA,EAAiB,EAAiB,EAAc,EAAU,CAAE,GAAK,CACvE,OAAO,GAAY,EAAe,CAAG,EAAiB,IAAI,EAAe,ICtE9DC,IAA2D,EAAW,IAAY,CAC7F,GAAM,CACJ,SACA,qBACA,wBACA,uBACA,0BACA,uBACA,gBACA,eACA,eACA,iBACE,EAEE,GAAoB,EAAsB,IAA+C,CAC7F,GAAI,CAAC,EAAmB,EAAI,EAAc,EAAG,IAAiC,IAAI,CAEhF,OAAO,EAA2B,EAAgD,GAGpF,IAAM,EACJ,GAAkB,EAAG,EAAI,EAAG,MAAM,KAAK,GAAK,OAAO,GAAM,UAAY,EAAG,EAAE,GAAK,MAAM,CACjF,EAAc,EAAG,CACjB,EAEA,EAAiB,EAAE,CACrB,EAAsB,GACtB,EAAY,GAEhB,IAAK,IAAM,KAAQ,EAAI,MAAO,CAE5B,GAAI,OAAO,GAAS,SAAU,CAC5B,EAAsB,KAAK,EAAa,IAA6B,EAAK,GAC1E,SAIF,GAAI,EAAY,EAAK,CAAE,CACrB,IAAM,EAAiB,EACrB,EACA,EAAI,MAAM,SAAW,GACnB,EAAE,EAAI,KAAO,SAAS,KAAK,EAAI,YAAyC,GAAG,EAC9E,CAEG,IACE,CAAC,GAAa,IAChB,EAAe,KAAK,EAAoB,CACxC,EAAsB,IAExB,EAAY,GACZ,EAAe,KAAK,EAAe,EAErC,SAIF,GAAM,CAAC,EAAkB,GAAkB,EAAa,EAAK,CAC7D,GACE,CAAC,EAAmB,EAAM,EAAkB,EAAe,EAC3D,EAAK,QAAU,GACf,EAAK,WAAa,GAEjB,IAAyB,IAAA,IAAa,EAAK,QAAU,EAEtD,SAGF,IAAM,GAAgB,EAAK,aAAe,WAAa,QAEjD,EAAY,EAAU,EAAQ,EAAK,MAAM,CAEzC,EAAgB,EAAc,EAAM,CACxC,GAAG,EACH,aAAc,EAAsB,GAAW,UAAU,CACzD,eACA,YACD,CAAC,CAEE,IACE,CAAC,GAAa,IAChB,EAAe,KAAK,EAAoB,CACxC,EAAsB,IAExB,EAAY,GACZ,EAAe,KAAK,EAAc,EAItC,GAAI,EAAe,SAAW,EAC5B,OAAO,EAGT,IAAM,EAAQ,EAAG,EAAI,YAAc,GAAG,GAAK,MACrC,EAAa,EAAQ,EAAI,WAAY,MAAM,EAAE,CAAG,EAAI,WACpD,EAAW,EAAI,KAAO,CAAC,GAA6B,GAAS,EAAe,OAAS,EAErF,CAAC,EAAU,GAAa,CAAC,cAAe,cAAc,CAAW,IAAI,GACzE,EAAI,IACA,EACE,GAAkB,EAAK,EAAc,CAAC,MAAO,MAAM,CAAC,CACpD,GAAkB,EAAK,EAAc,CAAC,MAAM,CAAC,CAC/C,EACE,GAAkB,EAAK,EAAc,CAAC,MAAM,CAAC,CAC7C,GAAkB,EAAK,EAAa,CAC3C,CAEK,EAAS,EAAW,GAAG,EAAS,IAAI,MAAM,CAAG,GAC7C,EAAS,EAAW,KAAK,IAAW,MAAM,CAAG,GAEnD,MAAO,GAAG,IAAS,EAAe,KAChC,EAAgB,EAAI,CAAG,KAAK,EAAa,IAAmC,EAAW,GAAK,GAC7F,GAAG,KAGN,OAAO,EAAiB,EAAW,GAAK,EC7G7BC,IAER,EAAW,IAAY,CAC1B,GAAM,CACJ,SACA,SACA,qBACA,wBACA,uBACA,0BACA,uBACA,gBACA,eACA,iBACE,EAEE,EAAgB,IAAW,gBAE3BC,EAAgB,EAAE,CAElBC,EAAmC,EAAE,CACrCC,EAAwC,IAAI,IAE5C,EAAqB,GAAkB,CACtC,EAAY,IAAI,EAAM,EACzB,EAAY,IAAI,EAAO,IAAI,IAAM,CAEnC,IAAM,EAAiB,GAAG,EAAM,GAAG,EAAY,IAAI,EAAM,CAAE,KAAO,IAElE,OADA,EAAY,IAAI,EAAM,CAAE,IAAI,EAAe,CACpC,GAGH,EAAe,GAAmB,CACtC,GAAM,CAAC,EAAkB,GAAkB,EAAa,EAAK,CAC7D,GACE,CAAC,EAAmB,EAAM,EAAkB,EAAe,EAC3D,EAAK,QAAU,GACf,EAAK,WAAa,GAEjB,IAAyB,IAAA,IAAa,EAAK,QAAU,EAEtD,MAAO,GAGT,IAAM,EAAY,EAAU,EAAQ,EAAK,MAAM,CAEzC,EAAkB,OAAO,YAC5B,CAAC,GAAG,EAAY,SAAS,CAAC,CAA6B,KAAK,CAAC,EAAG,KAAO,CAAC,EAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CACrF,CAEK,EAAgB,EACpB,EACA,CACE,GAAG,EACH,aAAc,EAAsB,GAAW,UAAU,CACzD,oBACA,kBACA,YACD,CACD,CAAE,gBAAiB,EAAQ,CAC5B,CAED,GAAI,CAAC,EAAO,EAAc,CACxB,MAAO,GAGT,GAAM,CAAE,MAAK,OAAQ,GAAiB,EAEtC,GAAI,OAAO,GAAQ,UAAY,CAAC,EAC9B,MAAO,GAIT,GAAI,IAAW,iBAAmB,MAAM,QAAQ,EAAa,CAC3D,EAAO,KAAK,GAAG,EAAa,SACnB,IAAW,uBAAyB,EAAO,EAAa,CAAE,CACnE,OAAO,OAAO,EAAa,EAAa,CAIxC,IAAK,IAAM,KAAK,OAAO,KAAK,EAAa,CAAE,EAAY,IAAI,EAAK,MAAM,EAAE,IAAI,EAAE,CAGhF,OAAO,GAGH,GAAoB,EAAsB,IAA+C,CAC7F,GAAI,CAAC,EAAmB,EAAI,EAAc,EAAG,IAAiC,IAAI,CAEhF,OAAO,EAA2B,EAAgD,GAGpF,IAAM,EAAiB,EAAE,CACrB,EAAsB,GACtB,EAAY,GAEhB,IAAK,IAAM,KAAQ,EAAG,MAAO,CAE3B,GAAI,OAAO,GAAS,SAAU,CAC5B,EAAsB,EACtB,SAIF,GAAI,EAAY,EAAK,CAAE,CACrB,IAAM,EAAiB,EAAiB,EAAM,EAAG,MAAM,SAAW,EAAE,CAEhE,IACE,CAAC,GAAa,IAChB,EAAe,KAAK,EAAoB,CACxC,EAAsB,IAExB,EAAY,GACZ,EAAe,KAAK,EAAe,EAErC,SAIF,IAAM,EAAgB,EAAY,EAAK,CACnC,IACE,CAAC,GAAa,IAChB,EAAe,KAAK,EAAoB,CACxC,EAAsB,IAExB,EAAY,GACZ,EAAe,KAAK,EAAc,EAQtC,OAJI,EAAe,SAAW,EACrB,EAGF,GAAG,EAAG,IAAM,OAAS,GAAG,GAAG,EAAe,KAAK,EAAgB,EAAG,CAAG,IAAI,EAAG,WAAW,GAAK,IAAI,CAAC,IAM1G,OAHI,EACK,CAAE,IAAK,EAAiB,EAAW,GAAK,CAAE,SAAQ,CAEpD,CAAE,IAAK,EAAiB,EAAW,GAAK,CAAE,OAAQ,EAAa,EClJ3D,GAAiB,EAAE,CAOnBC,IAER,EAAW,IAAY,CAC1B,GAAM,CACJ,SACA,wBACA,uBACA,0BACA,uBACA,gBACA,eACA,iBACE,EAEE,GAAoB,EAAmB,IAAwB,CACnE,GAAI,CAAC,EAAmB,EAAI,EAAc,EAAG,IAAiC,IAAI,CAChF,OAAO,EAAY,GAAiB,IAAA,GAGtC,IAAM,EAAa,EAAG,WAAW,aAAa,CAC1C,EAAgB,GAEdC,EAAyC,EAAG,MAC/C,IAAI,GAAQ,CACX,GAAI,EAAY,EAAK,CAAE,CACrB,IAAM,EAAqB,EAAiB,EAAK,CAKjD,OAJI,GACF,EAAgB,GACT,GAET,OAEF,GAAM,CAAC,EAAkB,GAAkB,EAAa,EAAK,CAC7D,GACE,CAAC,EAAmB,EAAM,EAAkB,EAAe,EAC3D,EAAK,QAAU,GACf,EAAK,WAAa,GAEjB,IAAyB,IAAA,IAAa,EAAK,QAAU,EAEtD,OAEF,IAAM,EAAY,EAAU,EAAQ,EAAK,MAAM,CAC/C,OAAO,EAAc,EAAM,CACzB,GAAG,EACH,aAAc,EAAsB,GAAW,UAAU,CACzD,YACD,CAAC,EACF,CACD,OAAO,QAAQ,CAElB,OAAO,EAAY,OAAS,EACxB,EAAY,SAAW,GAAK,CAAC,EAC3B,EAAY,GACZ,EAAG,GAAa,EAAa,CAC/B,IAGA,EAAS,EAAiB,EAAc,EAAU,CAAE,GAAK,CAE/D,OAAO,EAAU,IAAM,CAAE,IAAK,EAAQ,CAAG,GChE9BC,IACX,EACA,IACG,CAEH,GAAM,CACJ,SACA,wBACA,uBACA,0BACA,uBACA,gBACA,eACA,gBACA,UAAU,EAAE,EACV,EAEE,CAAE,mBAAoB,GAAO,EAInC,GAAI,CAAC,EAAI,OAET,IAAM,GAAoB,EAAmB,IAAmD,CAC9F,GAAI,CAAC,EAAmB,EAAI,EAAc,EAAG,IAAiC,IAAI,CAChF,OAGF,IAAM,EAAa,EAAG,WAAW,aAAa,CAC1C,EAAgB,GAEdC,EAAyC,EAAG,MAC/C,IAAI,GAAQ,CACX,GAAI,EAAY,EAAK,CAAE,CACrB,IAAM,EAAqB,EAAiB,EAAK,CAKjD,OAJI,GACF,EAAgB,GACT,GAET,OAEF,GAAM,CAAC,EAAkB,GAAkB,EAAa,EAAK,CAC7D,GACE,CAAC,EAAmB,EAAM,EAAkB,EAAe,EAC3D,EAAK,QAAU,GACf,EAAK,WAAa,GAEjB,IAAyB,IAAA,IAAa,EAAK,QAAU,EAEtD,OAEF,IAAM,EAAY,EAAU,EAAQ,EAAK,MAAM,CAC/C,OAAO,EAAc,EAAM,CACzB,GAAG,EACH,aAAc,EAAsB,GAAW,UAAU,CACzD,YACD,CAAC,EACF,CACD,OAAO,QAAQ,CAElB,GAAI,EAAY,SAAW,EAAG,OAE9B,IAAM,EACJ,EAAY,SAAW,GAAK,CAAC,EACzB,EAAY,GACZ,EAAG,EAAG,EAAW,GAAK,KAAO,EAAG,GAAK,EAAG,KAAM,EAAa,CAEjE,OAAO,EAAG,IAAM,EAAG,EAAG,KAAM,EAAQ,CAAG,GAGzC,OAAO,EAAiB,EAAc,EAAU,CAAE,GAAK,EC3E5CC,IAA4D,EAAW,IAAY,CAC9F,GAAM,CACJ,SACA,qBACA,wBACA,uBACA,0BACA,uBACA,gBACA,eACA,iBACE,EAEE,GAAoB,EAAsB,IAA+C,CAC7F,GAAI,CAAC,EAAmB,EAAI,EAAc,EAAG,IAAiC,IAAI,CAEhF,OAAO,EAA2B,EAAgD,GAGpF,IAAM,EAAiB,EAAE,CACrB,EAAsB,GACtB,EAAY,GAEhB,IAAK,IAAM,KAAQ,EAAG,MAAO,CAE3B,GAAI,OAAO,GAAS,SAAU,CAC5B,EAAsB,EACtB,SAIF,GAAI,EAAY,EAAK,CAAE,CACrB,IAAM,EAAiB,EAAiB,EAAM,EAAG,MAAM,SAAW,EAAE,CAEhE,IACE,CAAC,GAAa,IAChB,EAAe,KAAK,EAAoB,CACxC,EAAsB,IAExB,EAAY,GACZ,EAAe,KAAK,EAAe,EAErC,SAIF,GAAM,CAAC,EAAkB,GAAkB,EAAa,EAAK,CAC7D,GACE,CAAC,EAAmB,EAAM,EAAkB,EAAe,EAC3D,EAAK,QAAU,GACf,EAAK,WAAa,GACjB,IAAyB,IAAA,IAAa,EAAK,QAAU,EAEtD,SAGF,IAAM,GAAgB,EAAK,aAAe,WAAa,QAEjD,EAAY,EAAU,EAAQ,EAAK,MAAM,CAEzC,EAAgB,EAAc,EAAM,CACxC,GAAG,EACH,aAAc,EAAsB,GAAW,UAAU,CACzD,eACA,YACD,CAAC,CAEE,IACE,CAAC,GAAa,IAChB,EAAe,KAAK,EAAoB,CACxC,EAAsB,IAExB,EAAY,GACZ,EAAe,KAAK,EAAc,EAQtC,OAJI,EAAe,SAAW,EACrB,EAGF,GAAG,EAAG,IAAM,OAAS,GAAG,GAAG,EAAe,KAAK,EAAgB,EAAG,CAAG,IAAI,EAAG,WAAW,GAAK,IAAI,CAAC,IAG1G,OAAO,EAAiB,EAAW,GAAK,EC5DpC,GAAmB,CAAE,IAAK,KAAM,KAAM,MAAO,IAAK,KAAM,KAAM,MAAO,CAKrEC,IACJ,EACA,IAEA,EAAG,WAAW,MAAM,EAAI,EAAG,WAAW,UAAU,CAC5C,CAAE,KAAM,CAAE,SAAU,EAAmB,CAAE,CACzC,EAEA,GAAY,GAAc,GAAG,QAAQ,UAAW,OAAO,CAEvDC,GAA2E,CAC/E,WAAY,aACZ,iBAAkB,aAClB,eAAgB,WAChB,eAAgB,WAChB,SAAU,WACX,CACK,IAAiB,EAAW,EAAmC,IAAc,CACjF,IAAM,EAAS,QAAQ,EAAE,WAAW,GAAgB,IAAM,EAAE,QAAQ,EAAE,WACtE,OAAO,EAAE,WAAW,IAAI,CAAG,IAAI,IAAW,GAItC,IAAiB,EAAQ,IAC7B,OAAO,GAAM,UACT,EACA,EAAqB,EAAG,EAAa,CACnC,EAAY,EAAG,CAAE,eAAc,CAAC,CAChC,EAOKC,IACX,EACA,EAAU,EAAE,GACuC,CACnD,GAAM,CAAE,QAAO,WAAU,QAAO,eAAgB,EAC1C,CAAE,eAAc,sBAAuB,EACvC,EAAa,EAAG,EAAS,CAG/B,GAAI,EAAiB,EAAK,CAAE,MAAO,GAEnC,GAAI,IAAgB,QAAS,CAE3B,GAAI,EAAQ,EAAM,CAAC,KAAK,GAAK,OAAO,GAAM,SAAS,CAAE,MAAO,GAE5D,IAAM,EAAiB,GAAS,EAAM,CAEtC,OAAQ,EAAR,CACE,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KAAM,CACT,IAAM,EAAoB,IAAe,IAAM,KAAO,EAChD,EAAiB,GAAS,EAAM,CACtC,OAAO,EACH,CACE,KAAM,CACJ,OAAQ,CACN,OAAQ,CACN,OAAQ,QAAQ,EAAe,WAAW,EAAkB,QAAQ,EAAe,UACpF,CACF,CACF,CACF,CACD,GAGN,IAAK,KACL,IAAK,QAAS,CACZ,IAAM,EAAe,EAAQ,EAAM,CACnC,GAAI,EAAa,OAAS,EAAG,CAC3B,IAAM,EAAM,EAAa,IAAI,IAAM,CACjC,KAAM,CACJ,OAAQ,CAAE,OAAQ,CAAE,OAAQ,QAAQ,EAAe,mBAAmB,EAAE,UAAW,CAAE,CACtF,CACF,EAAE,CACH,MAAO,CAAE,KAAM,IAAe,KAAO,CAAE,OAAQ,EAAK,CAAG,CAAE,SAAU,EAAK,CAAE,CAE5E,MAAO,GAGT,IAAK,UACL,IAAK,aAAc,CACjB,IAAM,EAAe,EAAQ,EAAM,CACnC,GAAI,EAAa,QAAU,GAAK,EAAa,IAAM,EAAa,GAAI,CAClE,IAAM,EAAS,QAAQ,EAAe,mBAAmB,EAAa,GAAG,mBAAmB,EAAe,mBAAmB,EAAa,GAAG,UAC9I,MAAO,CACL,KAAM,CACJ,OAAQ,CAAE,OAAQ,CAAE,OAAQ,IAAe,aAAe,KAAK,EAAO,GAAK,EAAQ,CAAE,CACtF,CACF,CAEH,MAAO,GAGT,IAAK,WACL,IAAK,iBACL,IAAK,aACL,IAAK,mBACL,IAAK,WACL,IAAK,iBAAkB,CACrB,IAAM,EAAiB,GAAS,EAAM,CAGtC,OAFK,EAEE,CACL,KAAM,CACJ,OAAQ,CACN,OAAQ,CACN,OALO,GAAc,EAAgB,EAAY,EAAe,CAMjE,CACF,CACF,CACF,CAV2B,KAelC,OAAQ,EAAR,CACE,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KACH,MAAO,CACL,MAAO,EACJ,GAAQ,EACN,GAAiB,IAAc,GAAc,EAAO,EAAa,CACnE,CACF,CACF,CAEH,IAAK,IACH,MAAO,CAAE,KAAM,EAAG,GAAQ,GAAc,EAAO,EAAa,CAAE,CAAE,CAElE,IAAK,KACH,MAAO,CAAE,KAAM,CAAE,SAAU,CAAE,KAAM,EAAG,GAAQ,GAAc,EAAO,EAAa,CAAE,CAAE,CAAE,CAAE,CAE1F,IAAK,OACH,MAAO,CAAE,KAAM,CAAE,SAAU,CAAE,OAAQ,CAAE,QAAO,CAAE,CAAE,CAAE,CAEtD,IAAK,UACH,MAAO,CAAE,OAAQ,CAAE,QAAO,CAAE,CAE9B,IAAK,KACL,IAAK,QAAS,CACZ,IAAM,EAAe,EAAQ,EAAM,CAAC,IAAI,GAAK,GAAc,EAAG,EAAa,CAAC,CAC5E,GAAI,EAAa,OAAS,EAAG,CAC3B,IAAM,EAAM,EAAa,IAAI,IAAM,CAAE,KAAM,EAAG,GAAQ,GAAc,EAAG,EAAa,CAAE,CAAE,EAAE,CAC1F,MAAO,CAAE,KAAM,IAAe,KAAO,CAAE,OAAQ,EAAK,CAAG,CAAE,SAAU,EAAK,CAAE,CAE5E,MAAO,GAGT,IAAK,UACL,IAAK,aAAc,CACjB,IAAM,EAAe,EAAQ,EAAM,CACnC,GACE,EAAa,QAAU,GACvB,EAAa,EAAa,GAAG,EAC7B,EAAa,EAAa,GAAG,CAC7B,CACA,GAAI,CAAC,EAAO,GAAU,EAGhB,EAAuB,IAAiB,GAC9C,GACE,EAAqB,EAAO,EAAmB,EAC/C,EAAqB,EAAQ,EAAmB,CAChD,CACA,IAAM,EAAW,EAAY,EAAO,CAAE,aAAc,EAAoB,CAAC,CACnE,EAAY,EAAY,EAAQ,CAAE,aAAc,EAAoB,CAAC,CAC3E,GAAI,CAAC,GAAsB,EAAY,EAAU,CAC/C,IAAM,EAAU,EAChB,EAAS,EACT,EAAQ,OAER,EAAQ,EACR,EAAS,EAGb,OAAOF,GAAc,EAAY,CAAE,MAAO,EAAG,GAAQ,CAAE,IAAK,EAAO,IAAK,EAAQ,CAAE,CAAE,CAAC,CAEvF,MAAO,GAGT,IAAK,WACL,IAAK,iBACH,OAAOA,GAAc,EAAY,CAAE,OAAQ,EAAG,GAAQ,CAAE,MAAO,KAAK,EAAM,IAAK,CAAE,CAAE,CAAC,CAEtF,IAAK,aACL,IAAK,mBACH,OAAOA,GAAc,EAAY,CAAE,OAAQ,EAAG,GAAQ,CAAE,MAAO,GAAG,EAAM,IAAK,CAAE,CAAE,CAAC,CAEpF,IAAK,WACL,IAAK,iBACH,OAAOA,GAAc,EAAY,CAAE,OAAQ,EAAG,GAAQ,CAAE,MAAO,KAAK,IAAS,CAAE,CAAE,CAAC,CAEtF,MAAO,IC1OH,GAAgB,GAAe,EAAG,WAAW,MAAM,EAAI,EAAG,WAAW,UAAU,CAG/E,IAAS,EAAQ,IACrB,IAAI,OAAO,GAAM,UAAY,CAAC,EAAe,GAAG,IAAM,EAAE,WAAW,IAAK,MAAM,CAAC,GAE3E,IAAU,EAAgB,IAAqBG,EAAS,QAAQ,EAAO,GAAK,EAE5E,GAAqB,GACzB,GAAG,IAAI,WAAW,uBAAwB,OAAO,GAAG,MAAM,CAAC,WAAW,IAAK,OAAO,GAAG,OAAO,CAOjFC,IACX,EAEA,EAAU,EAAE,GACT,CACH,GAAM,CAAE,QAAO,WAAU,QAAO,eAAgB,EAC1C,CACJ,eACA,eACA,qBACA,sBAAsB,CAAC,GAAI,GAAG,CAC9B,2BAA2B,IACzB,EAEE,EAAe,IAAgB,QAC/B,EACJ,OAAO,GAAU,UACjB,OAAO,GAAU,WACjB,OAAO,GAAU,UACjB,EAAqB,EAAO,EAAa,CAErC,EAAO,GACX,GAAmB,EAAG,CAAE,sBAAqB,2BAA0B,CAAC,CAEpE,EAAY,EAAiB,EAAK,CAExC,GAAI,IAAc,GAChB,UACS,EAAW,CACpB,GAAM,CAAE,OAAM,aAAc,EAEtB,EAAa,UAAU,EAAI,EAAM,CAAC,GAClC,EAAgB,kBAAkB,EAAI,EAAM,CAAC,kBAAkB,GACnE,EAAe,EAAwB,CACrC,cAAe,IAAM,CAAE,GAAG,EAAG,MAAO,EAAE,MAAQ,MAAM,EAAE,QAAU,KAAM,EACvE,CAAC,CACF,EACD,CAAC,KAEF,OAAQ,EAAR,CACE,IAAK,MACH,MAAO,GAAG,EAAc,KAAK,IAE/B,IAAK,OACH,MAAO,GAAG,EAAc,MAE1B,IAAK,OACH,MAAO,GAAG,EAAc,MAE1B,IAAK,UACL,IAAK,SACL,IAAK,UAAW,CACd,IAAM,EAAK,IAAS,UAAY,KAAO,IAAS,SAAW,KAAO,IAKlE,OAHI,EAAY,GAAK,EAAY,EACxB,GAAG,EAAc,GAAG,EAAG,IAAI,EAAW,KAAK,EAAU,GAEvD,GAAG,EAAc,GAAG,EAAG,GAAG,MAKvC,IAAM,EAAa,EAAG,EAAS,CAC/B,OAAQ,EAAR,CACE,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KACH,MAAO,GAAG,EAAI,EAAM,CAAC,GAAG,EAAW,GACjC,EACI,EAAI,EAAa,EAAM,CAAC,CACxB,EACE,EAAa,EAAM,CACnB,GAAM,EAAO,EAAa,GAGpC,IAAK,WACL,IAAK,iBACH,OAAO,GACL,aAAa,EAAI,EAAM,CAAC,IAAI,EAAe,EAAI,EAAa,EAAM,CAAC,CAAG,GAAM,EAAO,EAAa,CAAC,GACjG,GAAa,EAAW,CACzB,CAEH,IAAK,aACL,IAAK,mBACH,OAAO,GACL,EACI,cAAc,EAAI,EAAM,CAAC,eAAe,EAAI,EAAa,EAAM,CAAC,CAAC,OAAO,EAAI,EAAa,EAAM,CAAC,GAChG,aAAa,EAAI,EAAM,CAAC,MAAM,GAAkB,EAAM,CAAC,IAC3D,GAAa,EAAW,CACzB,CAEH,IAAK,WACL,IAAK,iBACH,OAAO,GACL,EACI,cAAc,EAAI,EAAM,CAAC,YAAY,EAAI,EAAM,CAAC,cAAc,EAAI,EAAa,EAAM,CAAC,CAAC,OAAO,EAAI,EAAa,EAAM,CAAC,GACtH,aAAa,EAAI,EAAM,CAAC,KAAK,GAAkB,EAAM,CAAC,KAC1D,GAAa,EAAW,CACzB,CAEH,IAAK,OACH,MAAO,GAAG,EAAI,EAAM,CAAC,SAEvB,IAAK,UACH,MAAO,GAAG,EAAI,EAAM,CAAC,UAEvB,IAAK,KACL,IAAK,QAAS,CACZ,IAAM,EAAe,EAAQ,EAAM,CACnC,OAAO,GACL,GAAG,EAAI,EAAM,CAAC,OAAO,EAClB,IAAI,GACH,EACI,GAAG,EAAI,EAAa,EAAI,CAAC,GACzB,EAAqB,EAAK,EAAa,CACrC,GAAG,EAAa,EAAI,GACpB,GAAM,EAAK,EAAa,CAC/B,CACA,KAAK,KAAK,CAAC,GACd,GAAa,EAAW,CACzB,CAGH,IAAK,UACL,IAAK,aAAc,CACjB,IAAM,EAAe,EAAQ,EAAM,CACnC,GACE,EAAa,OAAS,GACtB,EAAuB,EAAa,GAAG,EACvC,EAAuB,EAAa,GAAG,CAEvC,MAAO,GAGT,GAAM,CAAC,EAAO,GAAU,EAGlB,EAAuB,IAAiB,GACxC,EAAW,EAAqB,EAAO,EAAmB,CAC5D,EAAY,EAAO,CAAE,aAAc,EAAoB,CAAC,CACxD,IACE,EAAY,EAAqB,EAAQ,EAAmB,CAC9D,EAAY,EAAQ,CAAE,aAAc,EAAoB,CAAC,CACzD,IACA,EAAa,OAAO,MAAM,EAAS,CAAI,EAAe,GAAG,IAAU,EAAS,EAC5E,EAAc,OAAO,MAAM,EAAU,CAAI,EAAe,GAAG,IAAW,EAAU,EAEpF,GACE,CAAC,GACD,IAAe,GACf,IAAgB,GAChB,EAAY,EACZ,CACA,IAAM,EAAU,EAChB,EAAc,EACd,EAAa,EAGf,IAAM,EACJ,EAAqB,EAAO,EAAa,EAAI,EAAqB,EAAQ,EAAa,CACnF,GAAkB,EAAa,IACnC,EAAe,EAAI,EAAI,CAAG,EAAkB,EAAM,GAAM,EAAK,EAAa,CAEtE,EAAa,GAAG,EAAI,EAAM,CAAC,MAAM,EAAe,EAAO,EAAW,CAAC,OAAO,EAAI,EAAM,CAAC,MAAM,EAAe,EAAQ,EAAY,GAEpI,OAAO,IAAe,UAAY,IAAI,EAAW,GAAK,GAAO,EAAY,GAAK,EAIlF,MAAO,ICvLH,GAAmB,GACvB,EACG,QAAQ,QAAS,MAAM,CACvB,QAAQ,aAAc,KAAK,CAC3B,QAAQ,UAAW,KAAK,CAEvB,IAAiB,EAAY,IACjC,EAAG,WAAW,MAAM,EAAI,EAAG,WAAW,UAAU,CAAG,CAAE,IAAK,EAAU,CAAG,EAO5DC,IAAgD,EAAM,EAAU,EAAE,GAAmB,CAChG,GAAM,CAAE,QAAO,WAAU,QAAO,eAAgB,EAC1C,CAAE,eAAc,sBAAuB,EACvC,EAAe,IAAgB,QAC/BC,EAA4B,CAAE,IAAK,EAAO,CAC1C,EAAyB,GAC7B,EACI,CAAE,IAAK,GAAG,IAAK,CACf,EAAqB,EAAG,EAAa,CACnC,EAAY,EAAG,CAAE,eAAc,CAAC,CAChC,EAEF,EAAY,EAAiB,EAAK,CAExC,GAAI,IAAc,GAChB,MAAO,MACE,EAAW,CACpB,GAAM,CAAE,OAAM,aAAc,EAE5B,OAAQ,EAAR,CACE,IAAK,MACL,IAAK,OACL,IAAK,OACH,MAAO,EACJ,GAAO,CACN,CAAE,IAAK,EAAO,CACd,EAAM,MAAM,SAAW,GAAK,CAAC,EAAY,EAAM,MAAM,GAAG,CACpD,GAA8B,EAAM,MAAM,GAAI,EAAQ,CACtD,GAAmC,EAAO,EAAmC,CAClF,CACF,CAEH,IAAK,UACL,IAAK,SACL,IAAK,UAAW,CACd,IAAM,EAAK,IAAS,UAAY,KAAO,IAAS,SAAW,KAAO,KAE5D,EAAgB,CACpB,OAAQ,CACN,CACE,OAAQ,CACN,CAAE,IAAK,EAAO,CACd,EAAM,MAAM,SAAW,GAAK,CAAC,EAAY,EAAM,MAAM,GAAG,CACpD,GAA8B,EAAM,MAAM,GAAI,EAAQ,CACtD,GAAmC,EAAO,EAAmC,CAClF,CACF,CACD,CAAE,IAAK,CAAC,EAAG,CAAE,IAAK,cAAe,CAAC,CAAE,CACpC,EACD,CACF,CAED,GAAI,EAAY,GAAK,EAAY,EAAG,CAClC,IAAM,EAAa,CACjB,OAAQ,CAAC,CAAE,IAAK,EAAO,CAAE,CAAE,IAAK,CAAC,EAAG,CAAE,IAAK,cAAe,CAAC,CAAE,CAAE,EAAE,CAClE,CACD,MAAO,EAAG,GAAK,CAAC,EAAe,CAAE,IAAK,CAAC,EAAY,EAAU,CAAE,CAAC,CAAE,CAEpE,MAAO,EAAG,GAAK,CAAC,EAAe,EAAU,CAAE,GAKjD,IAAM,EAAa,EAAG,EAAS,CAC/B,OAAQ,EAAR,CACE,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KACH,MAAO,EACJ,GAAgB,EAAW,EAAG,CAAC,EAAa,EAAsB,EAAM,CAAC,CAC3E,CAEH,IAAK,OACL,IAAK,UACH,MAAO,EACJ,GAAG,IAAe,UAAY,IAAM,IAAI,IAAK,CAAC,EAAa,KAAK,CAClE,CAGH,IAAK,KACL,IAAK,QAEH,OAAO,GAAc,EAAY,CAAE,GAAI,CAAC,EADnB,EAAQ,EAAM,CAAC,IAAI,GAAK,EAAsB,EAAE,CAAC,CACJ,CAAE,CAAC,CAGvE,IAAK,UACL,IAAK,aAAc,CACjB,IAAM,EAAe,EAAQ,EAAM,CACnC,GACE,EAAa,QAAU,GACvB,EAAa,EAAa,GAAG,EAC7B,EAAa,EAAa,GAAG,CAC7B,CACA,GAAI,CAAC,EAAO,GAAU,EAGhB,EAAuB,IAAiB,GAC9C,GACE,CAAC,GACD,EAAqB,EAAO,EAAmB,EAC/C,EAAqB,EAAQ,EAAmB,CAChD,CACA,IAAM,EAAW,EAAY,EAAO,CAAE,aAAc,EAAoB,CAAC,CACnE,EAAY,EAAY,EAAQ,CAAE,aAAc,EAAoB,CAAC,CAC3E,GAAI,CAAC,GAAsB,EAAY,EAAU,CAC/C,IAAM,EAAU,EAChB,EAAS,EACT,EAAQ,OAER,EAAQ,EACR,EAAS,OAEF,IACT,EAAQ,CAAE,IAAK,EAAO,CACtB,EAAS,CAAE,IAAK,EAAQ,EAG1B,OAAO,GAAc,EADU,CAAE,KAAM,CAAC,EAAO,EAAa,EAAO,CAAE,CAC3B,CAE5C,MAAO,GAGT,IAAK,WACL,IAAK,iBAIH,OAAO,GAAc,EAHU,CAC7B,GAAI,CAAC,EAAsB,EAAM,CAAE,EAAY,CAChD,CACyC,CAG5C,IAAK,aACL,IAAK,mBAIH,OAAO,GAAc,EAHU,CAC7B,WAAY,CAAC,EAAa,EAAsB,EAAM,CAAC,CACxD,CACyC,CAG5C,IAAK,WACL,IAAK,iBAIH,OAAO,GAAc,EAHU,CAC7B,SAAU,CAAC,EAAa,EAAsB,EAAM,CAAC,CACtD,CACyC,CAG9C,MAAO,IC1KH,IAAY,EAAgB,IAAqBC,EAAS,KAAK,EAAO,GAAK,GAAG,IAE9E,GAAc,GAClB,GAAG,EAAa,EAAE,GAAG,WACnB,kBACC,GAAc,KAAK,EAAE,YAAY,EAAE,CAAE,SAAS,GAAG,GACnD,CAOUC,IACX,EAEA,EAAU,EAAE,GACT,CACH,GAAM,CAAE,QAAO,WAAU,QAAO,eAAgB,EAC1C,CAAE,sBAAuB,EACzB,EAAa,EAAG,EAAS,CAG/B,GAEE,IAAgB,SAEf,EAAuB,EAAM,EAAI,IAAe,QAAU,IAAe,WAE1E,EAAiB,EAAK,CAEtB,MAAO,GAGT,OAAQ,EAAR,CACE,IAAK,IACL,IAAK,KACH,OAAO,GAAS,IAAI,EAAM,GAAG,GAAW,EAAM,CAAC,GAAI,IAAe,KAAK,CAEzE,IAAK,IACL,IAAK,KACH,MAAO,IAAI,EAAM,IAAI,GAAW,EAAM,CAAC,GAEzC,IAAK,IACL,IAAK,KACH,MAAO,IAAI,EAAM,IAAI,GAAW,EAAM,CAAC,GAEzC,IAAK,WACL,IAAK,iBACH,OAAO,GAAS,IAAI,EAAM,IAAI,GAAW,EAAM,CAAC,IAAK,IAAe,iBAAiB,CAEvF,IAAK,aACL,IAAK,mBACH,OAAO,GAAS,IAAI,EAAM,GAAG,GAAW,EAAM,CAAC,IAAK,IAAe,mBAAmB,CAExF,IAAK,WACL,IAAK,iBACH,OAAO,GAAS,IAAI,EAAM,IAAI,GAAW,EAAM,CAAC,GAAI,IAAe,iBAAiB,CAEtF,IAAK,OACL,IAAK,UACH,OAAO,GAAS,IAAI,EAAM,KAAM,IAAe,UAAU,CAE3D,IAAK,KACL,IAAK,QAEH,OAAO,GACL,KAFmB,EAAQ,EAAM,CAEf,IAAI,GAAO,IAAI,EAAM,GAAG,GAAW,EAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,GACvE,IAAe,QAChB,CAGH,IAAK,UACL,IAAK,aAAc,CACjB,IAAM,EAAe,EAAQ,EAAM,CACnC,GACE,EAAa,OAAS,GACtB,EAAuB,EAAa,GAAG,EACvC,EAAuB,EAAa,GAAG,CAEvC,MAAO,GAGT,GAAM,CAAC,EAAO,GAAU,EAClB,EAAW,EAAqB,EAAO,GAAK,CAC9C,EAAY,EAAO,CAAE,aAAc,GAAM,CAAC,CAC1C,IACE,EAAY,EAAqB,EAAQ,GAAK,CAChD,EAAY,EAAQ,CAAE,aAAc,GAAM,CAAC,CAC3C,IACA,EAAa,OAAO,MAAM,EAAS,CAAG,EAAQ,EAC9C,EAAc,OAAO,MAAM,EAAU,CAAG,EAAS,EAErD,GACE,CAAC,GACD,IAAe,GACf,IAAgB,GAChB,EAAY,EACZ,CACA,IAAM,EAAU,EAChB,EAAc,EACd,EAAa,EAGf,OAAO,GACL,MAAM,EAAM,IAAI,GAAW,EAAW,CAAC,IAAI,EAAM,IAAI,GAAW,EAAY,CAAC,IAC7E,IAAe,aAChB,EAKL,MAAO,IC/GH,IAA2B,EAAY,EAAmB,IAC9D,GAAgB,OAAO,GAAM,SACzB,EAAE,WAAW,GAAG,IAAa,GAAG,IAAY,IAAY,CAC7B,EAOpBC,IACX,EAEA,EAAO,EAAE,GACN,CACH,GAAM,CACJ,eACA,SACA,eACA,sBACA,kBACA,2BACA,gBACE,EACE,EAAe,EAAK,cAAgB,QACpC,EAAoB,EAAG,EAAK,SAAS,CACrC,EAAY,GAA8C,IAG1D,EAAc,GAAW,GAAG,IAAY,IAAI,IAC5C,EAAe,GAAW,GAAwB,EAAG,EAAW,EAAa,CAC7E,EAAiB,GAAW,EAAW,EAAY,EAAE,CAAC,CAEtD,EAAiB,GACrB,GAAmB,EAAG,CAAE,sBAAqB,2BAA0B,CAAC,CAEpE,EAAI,GAA2C,EAAE,CACjD,EAAO,EAAE,IAAM,KACf,EAAS,EAAE,MAAQ,OACnB,EAAU,EAAE,OAAS,QAE3B,OAAQ,EAAR,CACE,IAAK,OACL,IAAK,UACH,MAAO,GAGT,IAAK,UACL,IAAK,aAAc,CACjB,GAAI,CAAC,EACH,OAAO,GAA4B,EAAM,EAAK,CAGhD,IAAM,EAAe,EAAQ,EAAK,MAAO,CAAE,mBAAoB,GAAM,CAAC,CACnE,MAAM,EAAG,EAAE,CACX,IAAI,GACH,EACE,EAAW,GAAqD,EAAE,CAAE,EAAE,EAAE,OAAS,EAClF,CACF,CAQH,OANE,EAAa,OAAS,GACtB,CAAC,EAAa,EAAa,GAAG,EAC9B,CAAC,EAAa,EAAa,GAAG,CAEvB,GAEF,GAA4B,CAAE,GAAG,EAAM,MAAO,EAAc,CAAE,EAAK,CAG5E,IAAK,KACL,IAAK,QAAS,CACZ,IAAM,EAAe,EAAQ,EAAK,MAAM,CACxC,GAAI,EAAa,SAAW,EAAG,MAAO,GACtC,IAAM,EAAiB,EAAa,IAAI,GACtC,EACI,EACE,EAAW,GAAqD,EAAE,CAAE,EAAE,EAAE,OAAS,EAClF,CACD,EAAqB,EAAG,EAAa,CACnC,GAAG,EAAa,EAAE,GAClB,GAAG,EAAc,EAAE,GAC1B,CACD,MAAO,GAAG,EAAe,MAAM,EAAG,GAAG,CAAC,KAAK,KAAK,GAAG,EAAe,OAAS,EAAI,IAAM,GAAG,GAAG,EAAK,GAAG,EAAe,GAAG,GAAG,IAQ5H,OAJI,OAAO,EAAK,OAAU,UACjB,EAAK,MAAQ,EAAS,EAGxB,EACH,EACE,EAAW,GAAqD,EAAE,CAAE,EAAK,MAAM,EAAE,OAC/E,EAAK,MACR,CACD,EAAqB,EAAK,MAAO,EAAa,CAC5C,GAAG,EAAa,EAAK,MAAM,GAC3B,GAAG,EAAc,EAAK,MAAM,ICvFvBC,GAA8C,CACzD,IAAK,CAAC,KAAM,8BAA8B,CAC1C,KAAM,CAAC,SAAU,kCAAkC,CACnD,IAAK,CAAC,eAAgB,4BAA4B,CAClD,IAAK,CAAC,kBAAmB,+BAA+B,CACxD,KAAM,CAAC,2BAA4B,wCAAwC,CAC3E,KAAM,CAAC,8BAA+B,2CAA2C,CACjF,SAAU,CAAC,WAAY,wBAAwB,CAC/C,WAAY,CAAC,cAAe,2BAA2B,CACvD,SAAU,CAAC,YAAa,yBAAyB,CACjD,eAAgB,CAAC,mBAAoB,gCAAgC,CACrE,iBAAkB,CAAC,sBAAuB,mCAAmC,CAC7E,eAAgB,CAAC,oBAAqB,iCAAiC,CACvE,KAAM,UACN,QAAS,cACT,GAAI,CAAC,uBAAwB,4BAA4B,CACzD,MAAO,CAAC,2BAA4B,kCAAkC,CACtE,QAAS,CAAC,aAAc,2BAA2B,CACnD,WAAY,CAAC,iBAAkB,+BAA+B,CAC/D,CAGK,OAA4B,EAAE,CAOvBC,IACX,EAEA,EAAO,EAAE,GACN,CACH,GAAM,CAAE,QAAO,WAAU,cAAc,SAAY,EAE7C,CACJ,eAAe,GACf,YAAa,EAAmB,IAC9B,EAEE,EAAiB,IAAI,IACzB,OAAO,QAAQ,GAAyB,CACzC,CACD,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,EAAiB,CACzD,EAAe,IAAI,EAAG,EAAI,CAAE,EAAM,CAEpC,IAAM,EAAc,OAAO,YAAY,EAAe,CAEhD,CAAE,MAAO,EAAY,SAAU,EACnC,GACE,EAAa,EAAO,CAClB,UAAW,EAAK,WAAa,CAC3B,KAAM,EACN,MAAO,EACP,MAAO,EACR,CACF,CAAC,EAA+B,EAAE,CACpC,CACD,EACD,EAAI,CACH,KAAM,EACN,MAAO,EACP,MAAO,EACR,CAEK,EAAa,EAAY,IAC7B,EAAY,EAAG,EAAW,GAAuC,CAAC,EAAO,EAAM,CAEjF,OAAO,OAAO,GAAe,SAAW,EAAa,EAAW,IAAgB,QAAU,EAAI,IAQnFC,IAAyC,EAAM,IAAS,CACnE,GAAM,CAAE,QAAO,YAAa,EAEtB,CACJ,YACA,sBAAsB,CAAC,GAAI,GAAG,CAC9B,2BAA2B,GAC3B,kBAAkB,IAClB,oBAAoB,GACpB,iBAAiB,GACjB,iBAAiB,KACjB,YAAY,OACV,GAAmC,EAAE,CAEnC,EAAiB,GAAmB,GAAW,OAAS,EAAO,CACnE,sBACA,2BACD,CAAC,CAEI,EAAY,EAAiB,EAAK,CAExC,GAAI,IAAc,GAChB,MAAO,MACE,EAAW,CACpB,GAAM,CAAE,OAAM,aAAc,EAEtB,EAAoB,GAA4B,EAAK,MAAO,CAChE,GAAI,EACJ,OAAQ,GAAiB,GAAW,eAAiB,EAAE,CAAC,CACzD,CAAC,CAGI,GAAO,GAAW,eAAe,QAAU,GAAK,EAEtD,OAAQ,EAAR,CACE,IAAK,MACH,MAAO,IAAI,EAAM,OAAS,GAAG,gBAAgB,IAAiB,EAAM,IAAM,GAAG,GAAG,EAAkB,GAEpG,IAAK,OACH,MAAO,IAAI,EAAM,OAAS,GAAG,aAAa,IAAiB,EAAM,IAAM,GAAG,GAAG,EAAkB,GAEjG,IAAK,OACH,MAAO,IAAI,EAAM,OAAS,GAAG,uBAAuB,IAAiB,EAAM,IAAM,GAAG,GAAG,EAAkB,GAE3G,IAAK,UACL,IAAK,SACL,IAAK,UAAW,CACd,IAAM,EAAK,EAAK,QAAQ,KAAM,MAAM,CAIpC,OAHI,EAAY,GAAK,EAAY,EACxB,IAAI,EAAM,OAAS,KAAK,EAAG,GAAG,EAAY,IAAI,oBAAoB,IAAiB,EAAM,IAAM,GAAG,GAAG,EAAkB,GAEzH,IAAI,EAAM,OAAS,KAAK,EAAG,GAAG,EAAU,mBAAmB,IAAiB,EAAM,IAAM,GAAG,GAAG,EAAkB,KAK7H,IAAM,EAAQ,EAAe,EAAM,CACjC,GAAG,EACH,sBACA,2BACA,kBACA,iBACD,CAAC,CAEI,EAAa,EAAG,EAAS,CAC/B,IACG,IAAe,MACd,IAAe,SACf,IAAe,WACf,IAAe,eACjB,CAAC,EAED,MAAO,GAKT,IAAM,EAAe,CACnB,EAAG,EACH,EAJwB,EAAkB,EAAM,EAAK,CAKrD,EAAG,EACJ,CAED,OAAO,GAA8B,EAAU,CAC5C,IAAI,GAAQ,GAAG,EAAa,KAAQ,CACpC,KAAK,IAAI,CACT,MAAM,ECzKEC,GAA6C,GAAQ,EAAG,GAAe,EAAK,SAAS,CAAC,CAOtFC,IAA0C,EAAM,EAAO,EAAE,GAAK,CACzE,GAAM,CACJ,sBAAsB,CAAC,GAAI,GAAG,CAC9B,2BAA2B,GAC3B,kBAAkB,IAClB,oBAAoB,GACpB,iBAAiB,GACjB,iBAAiB,MACf,EAEE,EAAiB,GACrB,GAAmB,EAAG,CAAE,sBAAqB,2BAA0B,CAAC,CAEpE,EAAY,EAAc,EAAK,MAAM,CAErC,EAAY,EAAiB,EAAK,CAExC,GAAI,IAAc,GAChB,UACS,EAAW,CAEpB,GAAI,GAAM,SAAW,aAAc,MAAO,GAE1C,GAAM,CAAE,OAAM,aAAc,EAGtB,EAAoB,aAEpB,EAAoB,GACxB,EAAe,EAAK,MAAwB,CAC1C,cAAe,IAAM,CAAE,GAAG,EAAG,MAAO,EAAmB,EACxD,CAAC,CACF,EACD,CAED,OAAQ,EAAR,CACE,IAAK,MACH,MAAO,gCAAgC,EAAU,OAAO,EAAc,EAAkB,CAAC,SAAS,EAAkB,mBAAmB,EAAU,MAEnJ,IAAK,OACH,MAAO,oCAAoC,EAAU,OAAO,EAAc,EAAkB,CAAC,SAAS,EAAkB,GAE1H,IAAK,OACH,MAAO,gCAAgC,EAAU,OAAO,EAAc,EAAkB,CAAC,SAAS,EAAkB,GAEtH,IAAK,UACL,IAAK,SACL,IAAK,UAAW,CACd,IAAM,EAAK,IAAS,UAAY,KAAO,IAAS,SAAW,KAAO,IAElE,MAAO,mBAAmB,EAAY,GAAK,EAAY,EAAI,mBAAmB,EAAU,MAAQ,GAAG,eAAe,EAAU,OAAO,EAAc,EAAkB,CAAC,SAAS,EAAkB,IAAI,EAAG,GAAG,MAK/M,IAAM,EAAQ,EAAe,EAAM,CACjC,GAAG,EACH,sBACA,2BACA,kBACA,iBACD,CAAC,CAEI,EAAW,EAAkB,EAAM,EAAK,CAExC,EAAoB,EAAG,EAAS,CAWtC,OATG,IAAsB,MACrB,IAAsB,UACtB,IAAsB,WACtB,IAAsB,gBACxB,CAAC,EAEM,GAGF,GAAG,EAAU,GAAG,EAAS,GAAG,IAAQ,MAAM,EC/EtCC,IAAoD,EAAM,EAAM,IAAS,CAGpF,GAAM,CACJ,YACA,SACA,oBACA,eACA,cACA,mBACA,iBACA,sBAAsB,CAAC,GAAI,GAAG,CAC9B,2BACA,iBACA,oBAAoB,GACpB,iBAAiB,IACf,GAAQ,EAAE,CAER,CAAE,kBAAkB,EAAE,EAAK,GAAQ,EAAE,CAErC,EAAgB,IAAW,gBAE3BC,EAAgB,EAAE,CAElBC,EAAmC,EAAE,CAErC,EAAY,GAChB,EAAgB,CAAE,MAAK,SAAQ,CAAG,CAAE,MAAK,OAAQ,EAAa,CAE1D,EAAiB,GACrB,GAAmB,EAAG,CAAE,sBAAqB,2BAA0B,CAAC,CAEpE,EAAY,EAAc,EAAK,MAAM,CAErC,EAAY,EAAiB,EAAK,CAExC,GAAI,IAAc,GAChB,UACS,EAAW,CAEpB,GAAI,GAAM,SAAW,aAAc,OAAO,EAAS,GAAG,CAEtD,GAAM,CAAE,OAAM,aAAc,EAGtB,EAAoB,aAEpB,CAAE,IAAK,EAAW,OAAQ,GAAiB,GAC/C,EAAe,EAAK,MAAwB,CAC1C,cAAe,IAAM,CAAE,GAAG,EAAG,MAAO,EAAmB,EACxD,CAAC,CACF,CAAE,GAAI,EAAkC,OAAQ,EAAE,CAAiB,CACpE,CASD,OANI,MAAM,QAAQ,EAAa,CAC7B,EAAO,KAAK,GAAG,EAAa,CAE5B,OAAO,OAAO,EAAa,EAAa,CAGlC,EAAR,CACE,IAAK,MACH,OAAO,EACL,gCAAgC,EAAU,OAAO,EAAc,EAAkB,CAAC,SAAS,EAAU,mBAAmB,EAAU,MACnI,CAEH,IAAK,OACH,OAAO,EACL,oCAAoC,EAAU,OAAO,EAAc,EAAkB,CAAC,SAAS,EAAU,GAC1G,CAEH,IAAK,OACH,OAAO,EACL,gCAAgC,EAAU,OAAO,EAAc,EAAkB,CAAC,SAAS,EAAU,GACtG,CAEH,IAAK,UACL,IAAK,SACL,IAAK,UAAW,CACd,IAAM,EAAK,IAAS,UAAY,KAAO,IAAS,SAAW,KAAO,IAElE,OAAO,EACL,mBAAmB,EAAY,GAAK,EAAY,EAAI,mBAAmB,EAAU,MAAQ,GAAG,eAAe,EAAU,OAAO,EAAc,EAAkB,CAAC,SAAS,EAAU,IAAI,EAAG,GAAG,IAC3L,GAKP,IAAM,EAAQ,EAAe,EAAM,CACjC,eACA,sBACA,iBACA,YACA,SACD,CAAC,CAEI,EAAc,EAAkB,EAAM,EAAK,CAC3C,EAAuB,EAAG,EAAY,CACtC,CAAC,EAAM,GAAS,EAEtB,IACG,IAAyB,MACxB,IAAyB,UACzB,IAAyB,WACzB,IAAyB,gBAC3B,CAAC,EAED,OAAO,EAAS,GAAG,IACV,IAAyB,WAAa,IAAyB,cACxE,OAAO,EAAS,GAAG,IAAO,EAAK,QAAQ,EAAM,GAAG,IAAc,IACrD,EAAK,cAAgB,QAC9B,OAAO,EAAS,GAAG,IAAO,EAAK,QAAQ,EAAM,GAAG,EAAY,GAAG,IAAQ,MAAM,CAAC,IACrE,IAAyB,MAAQ,IAAyB,SAAU,CAC7E,IAAM,EAAa,EAAQ,EAAK,MAAM,CACtC,GAAI,EAAe,CACjB,IAAK,IAAM,KAAK,EACd,EAAO,KAAK,EAAqB,EAAG,EAAa,CAAG,EAAY,EAAG,CAAE,eAAc,CAAC,CAAG,EAAE,CAE3F,OAAO,EACL,GAAG,IAAO,EAAK,QAAQ,EAAM,GAAG,EAAY,IAAI,EAC7C,KAAK,EAAI,IACR,EACI,GAAG,IAAc,EAAgB,OAAS,EAAI,EAAW,QAAU,EAAW,OAAS,KACvF,IACL,CACA,KAAK,KAAK,CAAC,GACf,CAEH,IAAMC,EAAqB,EAAE,CAC7B,IAAK,IAAM,KAAK,EAAY,CAC1B,IAAM,EAAgB,EAAmB,EAAK,MAAM,CACpD,EAAS,KAAK,GAAG,IAAc,IAAgB,CAC/C,EAAY,GAAG,EAAmB,EAAc,KAAK,KAAmB,EACtE,EACA,EACD,CACG,EAAY,EAAG,CAAE,eAAc,CAAC,CAChC,EAEN,OAAO,EAAS,GAAG,IAAO,EAAK,QAAQ,EAAM,GAAG,EAAY,IAAI,EAAS,KAAK,KAAK,CAAC,GAAG,SAC9E,IAAyB,WAAa,IAAyB,cAAe,CAEvF,GAAM,CAAC,EAAO,GADO,EAAQ,EAAK,MAAO,CAAE,mBAAoB,GAAM,CAAC,CAEnE,MAAM,EAAG,EAAE,CACX,IAAI,GAAM,EAAqB,EAAG,EAAa,CAAG,EAAY,EAAG,CAAE,eAAc,CAAC,CAAG,EAAG,CAC3F,GAAI,EAEF,OADA,EAAO,KAAK,EAAO,EAAO,CACnB,EACL,GAAG,IAAO,EAAK,QAAQ,EAAM,GAAG,EAAY,GAC1C,EAAiB,GAAG,IAAc,EAAgB,OAAS,IAAM,IAClE,OAAO,EAAiB,GAAG,IAAc,EAAgB,OAAS,IAAM,MAC1E,CAEH,IAAM,EAAiB,EAAmB,EAAK,MAAM,CAC/C,EAAkB,EAAmB,EAAK,MAAM,CAGtD,MAFA,GAAY,GAAG,EAAmB,EAAc,KAAK,KAAoB,EACzE,EAAY,GAAG,EAAmB,EAAc,KAAK,KAAqB,EACnE,EACL,GAAG,IAAO,EAAK,QAAQ,EAAM,GAAG,EAAY,GAAG,IAAc,EAAe,OAAO,IAAc,IAClG,CAGH,IAAI,EAAa,EAAK,MAClB,OAAO,EAAK,OAAU,WACxB,AAKE,EALE,EAAqB,EAAK,MAAO,EAAa,CACnC,EAAY,EAAK,MAAO,CAAE,eAAc,CAAC,CAIzC,UAAU,KAAK,EAAM,CAC9B,EAAM,WAAW,WAAY,GAAG,CACL,GAInC,IAAI,EAAY,GAQhB,OAPI,EACF,EAAO,KAAK,EAAW,EAEvB,EAAY,EAAmB,EAAK,MAAM,CAC1C,EAAY,GAAG,EAAmB,EAAc,KAAK,KAAe,GAG/D,EACL,GAAG,IAAO,EAAK,QAAQ,EAAM,GAAG,EAAY,GAC1C,EACI,EACE,GAAG,IAAc,EAAgB,OAAS,IAC1C,IACF,GAAG,IAAc,MACpB,MAAM,CACV,EC1MG,IAAoB,EAAgB,EAAa,IACrD,EAAqB,EAAO,CAAC,CAAC,GAAgB,OAAO,GAAU,SAAS,CACpE,OAAO,EAAY,EAAO,CAAE,aAAc,CAAC,CAAC,EAAc,CAAC,CAAC,CAC5D,EAOOC,IACX,EAEA,EAAU,EAAE,GACT,CACH,GAAM,CAAE,QAAO,WAAU,QAAO,eAAgB,EAE1C,CAAE,eAAc,sBAAuB,EAG7C,GAAI,IAAgB,SAAW,EAAiB,EAAK,CAAE,OAEvD,IAAM,EAAa,EAAG,EAAS,CAC/B,OAAQ,EAAR,CACE,IAAK,IACH,MAAO,EAAG,GAAQ,GAAc,EAAO,EAAO,EAAa,CAAE,CAE/D,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KAAM,CACT,IAAM,EAAiB,GAAgB,GACvC,MAAO,EACJ,GAAQ,EACN,GAAiB,GAAc,EAAO,EAAO,EAAa,CAC5D,CACF,CAGH,IAAK,WACH,MAAO,EAAG,GAAQ,CAAE,SAAU,EAAO,CAAE,CAEzC,IAAK,aACH,MAAO,EAAG,GAAQ,CAAE,WAAY,EAAO,CAAE,CAE3C,IAAK,WACH,MAAO,EAAG,GAAQ,CAAE,SAAU,EAAO,CAAE,CAEzC,IAAK,iBACH,MAAO,CAAE,IAAK,EAAG,GAAQ,CAAE,SAAU,EAAO,CAAE,CAAE,CAElD,IAAK,mBACH,MAAO,CAAE,IAAK,EAAG,GAAQ,CAAE,WAAY,EAAO,CAAE,CAAE,CAEpD,IAAK,iBACH,MAAO,CAAE,IAAK,EAAG,GAAQ,CAAE,SAAU,EAAO,CAAE,CAAE,CAElD,IAAK,OACH,MAAO,EAAG,GAAQ,KAAM,CAE1B,IAAK,UACH,MAAO,EAAG,GAAQ,CAAE,IAAK,KAAM,CAAE,CAEnC,IAAK,KACL,IAAK,QAAS,CACZ,IAAM,EAAe,EAAQ,EAAM,CACnC,MAAO,EACJ,GAAQ,EACN,GAAgB,IAAc,EAAa,IAAI,GAC9C,GAAc,EAAK,EAAK,EAAa,CACtC,CACF,CACF,CAGH,IAAK,UACL,IAAK,aAAc,CACjB,IAAM,EAAe,EAAQ,EAAM,CACnC,GACE,EAAa,QAAU,GACvB,EAAa,EAAa,GAAG,EAC7B,EAAa,EAAa,GAAG,CAC7B,CACA,GAAM,CAAC,EAAO,GAAU,EAGlB,EAAuB,IAAiB,GACxC,EAAW,EAAqB,EAAO,EAAmB,CAC5D,EAAY,EAAO,CAAE,eAAc,CAAC,CACpC,IACE,EAAY,EAAqB,EAAQ,EAAmB,CAC9D,EAAY,EAAQ,CAAE,eAAc,CAAC,CACrC,IACA,EAAa,OAAO,MAAM,EAAS,CAAG,EAAQ,EAC9C,EAAc,OAAO,MAAM,EAAU,CAAG,EAAS,EACrD,GACE,CAAC,GACD,IAAe,GACf,IAAgB,GAChB,EAAY,EACZ,CACA,IAAM,EAAU,EAChB,EAAc,EACd,EAAa,EAGf,OAAO,IAAe,UAClB,EAAG,GAAQ,CAAE,IAAK,EAAY,IAAK,EAAa,CAAE,CAClD,CAAE,GAAI,CAAC,EAAG,GAAQ,CAAE,GAAI,EAAY,CAAE,CAAE,EAAG,GAAQ,CAAE,GAAI,EAAa,CAAE,CAAC,CAAE,MAE/E,MAAO,IAIb,MAAO,ICxGIC,IACX,EAEA,CAAE,eAAc,qBAAoB,UAAU,EAAE,EAAK,EAAE,GACf,CACxC,GAAM,CACJ,mBAAoB,EACpB,aAAc,EACd,YAAa,GACX,EAOJ,GAAI,EAAiB,EAAK,CAAE,OAE5B,GAAM,CAAE,QAAO,WAAU,QAAO,eAAgB,EAC1C,EAAe,IAAgB,QAE/B,EAAa,EAAG,EAAS,CAI7B,MAAC,GAEA,IACE,CAAC,GAGC,CAAC,GAAM,CAAC,iBAAkB,mBAAoB,iBAAiB,CAAC,SAAS,EAAW,GAK3F,OAAQ,EAAR,CACE,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KACL,IAAK,IACL,IAAK,KAAM,CACT,IAAM,EAAoB,CACxB,IAAK,EAAG,GACR,KAAM,EAAG,GACT,IAAK,EAAG,GACR,KAAM,EAAG,IACT,IAAK,EAAG,GACR,KAAM,EAAG,IACV,CAAC,GACF,MAAO,EACJ,GACC,GAAgB,IAAe,IAC3B,EAAG,EAAG,KAAM,EAAO,CACnB,EACG,GAAoB,EACjB,EAAK,EAAM,CACX,EAAqB,EAAO,EAAa,CACvC,EAAY,EAAO,CAAE,aAAc,SAAU,CAAC,CAC9C,EACP,CACR,CAGH,IAAK,WACH,MAAO,EAAG,GAAQ,EAAG,EAAG,WAAY,EAAe,EAAK,EAAM,CAAG,GAAG,IAAS,CAAE,CAEjF,IAAK,aACH,MAAO,EAAG,GAAQ,EAAG,EAAG,YAAa,EAAe,EAAK,EAAM,CAAG,GAAG,IAAS,CAAE,CAElF,IAAK,WACH,MAAO,EAAG,GAAQ,EAAG,EAAG,UAAW,EAAe,EAAK,EAAM,CAAG,GAAG,IAAS,CAAE,CAEhF,IAAK,iBACH,MAAO,EACJ,GAAQ,EACN,EAAG,SAAU,EAAe,EAAI,SAAU,IAAK,EAAK,EAAM,CAAE,IAAI,CAAG,IAAI,EAAM,GAC/E,CACF,CAEH,IAAK,mBACH,MAAO,EACJ,GAAQ,EAAG,EAAG,SAAU,EAAe,EAAI,SAAU,EAAK,EAAM,CAAE,IAAI,CAAG,GAAG,EAAM,GAAI,CACxF,CAEH,IAAK,iBACH,MAAO,EACJ,GAAQ,EAAG,EAAG,SAAU,EAAe,EAAI,SAAU,IAAK,EAAK,EAAM,CAAC,CAAG,IAAI,IAAS,CACxF,CAEH,IAAK,OACH,MAAO,EAAG,GAAQ,EAAG,EAAG,IAAK,KAAM,CAAE,CAEvC,IAAK,UACH,MAAO,EAAG,GAAQ,EAAG,EAAG,KAAM,KAAM,CAAE,CAExC,IAAK,KACL,IAAK,QAAS,CACZ,IAAM,EAAe,EAAQ,EAAM,CACnC,MAAO,EACJ,GAAQ,EACN,IAAe,KAAO,EAAG,GAAK,EAAG,OAAQ,EAAa,IAAI,GACzD,EACI,EAAK,EAAI,CACT,EAAqB,EAAK,EAAa,CACrC,EAAY,EAAK,CAAE,aAAc,SAAU,CAAC,CAC5C,EACP,CACF,CACF,CAGH,IAAK,UACL,IAAK,aAAc,CACjB,IAAM,EAAe,EAAQ,EAAO,CAAE,mBAAoB,GAAM,CAAC,CACjE,GACE,EAAa,OAAS,GACtB,CAAC,EAAa,EAAa,GAAG,EAC9B,CAAC,EAAa,EAAa,GAAG,CAE9B,OAGF,GAAM,CAAC,EAAO,GAAU,EAElB,EAAW,EAAqB,EAAO,EAAa,CACtD,EAAY,EAAO,CAAE,aAAc,SAAU,CAAC,CAC9C,IACE,EAAY,EAAqB,EAAQ,EAAa,CACxD,EAAY,EAAQ,CAAE,aAAc,SAAU,CAAC,CAC/C,IACE,EAAa,OAAO,MAAM,EAAS,CAAG,EAAQ,EAC9C,EAAc,OAAO,MAAM,EAAU,CAAG,EAAS,EACjD,EAAoB,CAAC,EAAY,EAAY,CAWnD,MATE,CAAC,GACD,IAAe,GACf,IAAgB,GAChB,EAAY,IAEZ,EAAkB,GAAK,EACvB,EAAkB,GAAK,GAGlB,EACJ,GAAQ,EACN,IAAe,UAAY,EAAG,QAAU,EAAG,YAAa,EACrD,EAAkB,IAAI,GAAK,EAAK,EAAE,CAAC,CACnC,EAAkB,MAAM,GAAK,EAAqB,EAAG,EAAa,CAAC,CACjE,EAAkB,IAAI,GAAK,EAAY,EAAG,CAAE,aAAc,SAAU,CAAC,CAAC,CACtE,EACP,CACF,ICjGMC,GAA2D,CACtE,KAAM,EAAE,CACR,OAAQ,CACN,iBAAkB,GACnB,CACD,OAAQ,EAAE,CACV,MAAO,CACL,eAAgB,IAChB,oBAAqB,CAAC,IAAK,IAAI,CAC/B,yBAA0B,IAC1B,YAAa,IACd,CACD,MAAO,CACL,eAAgB,SACjB,CACD,WAAY,CACV,oBAAqB,IACrB,eAAgB,GAChB,YAAa,IACd,CACF,CAOYC,GAA+D,CAC1E,GAAG,GACJ,CAEK,GAAwB,CAC5B,IAAK,GACL,QAAS,GACT,cAAe,GACf,iBAAkB,GAClB,KAAM,GACN,QAAS,GACT,UAAW,GACX,KAAM,GACN,cAAe,GACf,QAAS,GACT,iBAAkB,GAClB,oBAAqB,GACrB,cAAe,GACf,OAAQ,GACR,UAAW,GACX,KAAM,GACN,IAAK,GACN,CAGKC,EAA0C,GAAK,EAAE,SACjD,GAA4B,CAChC,IAAK,EACL,QAAS,EACT,cAAe,EACf,iBAAkB,EAClB,KAAM,EACN,QAAS,EACT,UAAW,EACX,KAAM,EACN,cAAe,EACf,QAAS,EACT,iBAAkB,GAClB,oBAAqB,GACrB,cAAe,GACf,OAAQ,EACR,UAAW,EACX,KAAM,EACN,IAAK,GACN,CAEKC,GAAoE,CACxE,IAAK,SACL,KAAM,GACN,QAAS,0BACT,iBAAkB,SAClB,KAAM,SACN,IAAK,UACN,CAeK,GAA4B,CAChC,OAAQ,OACR,OAAQ,EAAE,CACV,oBAAqB,CAAC,GAAI,GAAG,CAC7B,yBAA0B,GAC1B,iBAAoB,EAAE,CACtB,YAAa,IACb,iBAAkB,GAClB,eAAgB,GAChB,mBAAoB,GACpB,qBAAsB,IACtB,wBAAyB,IACzB,gBAAiB,IACjB,eAAgB,KAChB,OAAQ,OACR,UAAW,MACX,aAAc,EAAE,CAChB,YAAa,EAAE,CAChB,CAEK,GAAsC,IAAI,IAAkB,CAChE,MACA,UACA,gBACA,UACA,YACA,OACA,gBACA,UACA,SACA,YACA,OACD,CAAC,CAEI,GAAa,IAAI,IAAkB,CACvC,MACA,gBACA,sBACA,UACA,SACA,YACD,CAAC,CAgKF,SAAS,GACP,EACA,EAAiD,EAAE,CACnD,CACA,IAAM,EAAU,OAAO,GAAgB,SAAW,CAAE,OAAQ,EAAG,EAAY,CAAE,CAAG,EAE1EC,EAAiC,CACrC,GAAG,GACH,GAAI,CAAC,EAAQ,QAAU,GAAW,IAAI,EAAQ,OAAO,CAChD,GAAkB,EAAQ,QAAU,SAAW,KAChD,KACJ,GAAG,EACH,GAAI,CAAC,EAAQ,SACV,OAAO,KAAK,GAAkB,CAAC,SAAS,EAAQ,QAAU,GAAG,CAAG,CAAE,OAAQ,MAAO,CAAG,MACxF,CAEK,EAAS,EAAG,EAAO,OAAO,CAE1B,CACJ,mBAAoB,EACpB,aAAc,EACd,kBAAmB,EACnB,eACA,oBAAqB,EACrB,mBAAoB,EACpB,cAAe,EACf,YACA,eAAgB,EAChB,WACE,EAEE,EAAyB,GAEtB,OADmB,GAAqB,CAAE,eAAc,YAAW,CAAC,EACvC,SAChC,GACA,OAAO,GAAiB,UACtB,EACA,IAAA,GAGF,EACJ,OAAO,GAA6B,WAChC,EACC,GAA0B,IAAW,EAEtCC,EACJ,OAAO,GAA0B,WAC7B,GAAuB,EAAsB,CAC3C,GAAK,EAAsB,EAAE,MAAO,EAAE,SAAU,EAAE,MAAO,EAAE,YAAY,CACvE,EACF,IAAW,mBACT,GACA,GAAoC,IAAI,EAAO,CAC5C,GAAwB,GAAsB,GAC/C,GAEJ,GACH,OAAO,GAAyB,WAAa,EAAuB,QACpE,GAAoC,IAAI,EAAO,EAChD,OAAO,GAAyB,YAChC,EACI,EACA,OACJ,GAAsB,IACtB,GAEI,EAAsB,GAA4B,EAA2B,CAC7E,EAAS,GAAiB,EAAO,OAAO,CACxCC,GAAoD,EAAG,IAC3D,GAAiB,EAAoB,EAAG,EAAE,EAA+B,EAAE,CAAC,CAExE,EACJ,GACA,GAA2B,IAC3B,GAA2B,IAGzBC,EAA+B,EAAE,CAGrC,GAAI,OAAO,GAAc,WAAY,CACnC,IAAM,EAAmB,EAAU,EAAU,CAC7C,GAAI,OAAO,GAAqB,cAE1B,CAAC,EACH,OAAO,IAAW,gBACd,CAAE,IAAK,EAAoB,OAAQ,EAAE,CAAE,CACvC,IAAW,sBACT,CAAE,IAAK,EAAoB,OAAQ,EAAE,CAAE,CACvC,IAAW,UACT,IAAI,EAAmB,GACvB,IAAW,gBACT,GACA,IAAW,SACT,GACA,IAAW,YACT,GACA,IAAW,gBACT,EAAE,CACF,IAAW,WAAa,IAAW,YACjC,IAAA,GACA,OAGpB,EAAgB,EAIpB,IAAMC,EAA8C,EAAE,CAChD,EAAe,GAAkB,EAAO,CAC9C,IAAK,IAAM,KAAK,EAEV,OAAO,EAAE,WAAc,aACzB,EAAa,EAAE,OAAoC,EAAE,MAAQ,EAAE,WAInE,IAAM,EAAgB,GAAmB,CACvC,IAAIC,EACAC,EAIJ,GAHI,EAAK,KACP,EAAmB,EAAc,EAAK,KAEpC,EAAa,OAAS,EAAG,CAC3B,IAAM,EAAW,EAAa,OAAO,GAAK,EAAE,OAAS,EAAK,MAAM,CAChE,GAAI,EAAS,OAAS,EAAG,CACvB,IAAM,EAAQ,EAAS,GAEnB,OAAO,EAAM,WAAc,aAC7B,EAAiB,EAAM,YAI7B,MAAO,CAAC,EAAkB,EAAe,EAIrCC,EAAwC,CAC5C,GAAG,EACH,qBACA,SACA,SACA,eACA,wBACA,sBACA,oBACA,gBACA,iBACA,eACA,gBACA,UACD,CAED,GAAI,OAAO,GAA8B,WACvC,OAAO,EAA0B,EAAW,EAAa,CAG3D,OAAQ,EAAR,CACE,IAAK,OACL,IAAK,mBAAoB,CACvB,IAAM,EAAK,EACP,EAAQ,EAAW,GAAK,GAAe,EAAG,EAAa,CAAC,CACxD,EAOJ,OANI,IAAW,mBACN,KAAK,UAAU,GAAK,EAAK,IAE9B,IAAQ,MAAQ,IAAQ,OAAS,IAAA,GAAY,GAA4B,EAAK,EAAM,CACrF,CAEI,KAAK,UAAU,EAAI,GAA6B,EAAE,CAG3D,IAAK,MACH,OAAO,GAA6B,EAAW,EAAa,CAE9D,IAAK,gBACL,IAAK,sBACH,OAAO,GAAuC,EAAW,EAAa,CAExE,IAAK,UACH,OAAO,GAAiC,EAAW,EAAa,CAElE,IAAK,gBACH,OAAO,GAAsC,EAAW,EAAa,CAEvE,IAAK,MACH,OAAO,GAA6B,EAAW,EAAa,CAE9D,IAAK,OACH,OAAO,GAA8B,EAAW,EAAa,CAE/D,IAAK,UACH,OAAO,GAAiC,EAAW,EAAa,CAElE,IAAK,YACH,OAAO,GAAmC,EAAW,EAAa,CAEpE,IAAK,gBACH,OAAO,GAAuC,EAAW,EAAa,CAExE,IAAK,mBACH,OAAO,GAA4B,EAAW,EAAa,CAE7D,IAAK,OACH,OAAO,GAA8B,EAAW,EAAa,CAE/D,IAAK,SACH,OAAO,GAAgC,EAAW,EAAa,CAEjE,IAAK,UACH,OAAO,GAAiC,EAAW,EAAa,CAElE,IAAK,YACH,OAAO,GAAmC,EAAW,EAAa,CAEpE,QACE,MAAO,IC7jBb,MAAM,GACH,IACA,EAAO,EAAU,EAAO,IACvB,EAAK,CAAE,QAAO,WAAU,QAAO,cAAa,CAAE,CAAE,aAAc,GAAO,CAAC,CAO7DC,GAA8C,GACzD,GACD,CAMYC,GAAqD,GAChE,GACD,CAMYC,GACX,GAAuB,GAAwB,CAMpCC,GACX,GAAuB,GAAyB,CAyCrCC,GAAgD,GAMhDC,GAAoD,GAMpDC,GAAiD,GCtFjD,GAAY,EAAY,IAAgD,CACnF,IAAIC,EAA6B,EAC7B,EAAQ,EACZ,KAAO,EAAQ,EAAK,QAAU,GAAU,EAAY,EAAO,EAAE,CAC3D,IAAMC,EAA0C,EAAO,MAAM,EAAK,IAClE,EAAS,OAAO,GAAM,SAAW,KAAO,EACxC,IAGF,OAAO,EAAQ,EAAK,OAAS,KAAO,GAOzB,IAAU,EAAY,IAAgD,CACjF,GAAI,EAAM,KAAO,EACf,OAAO,EAGT,IAAK,IAAM,KAAQ,EAAM,MACnB,UAAO,GAAS,SACpB,IAAI,EAAK,KAAO,EACd,OAAO,KACE,EAAY,EAAK,CAAE,CAC5B,IAAM,EAAU,GAAO,EAAI,EAAK,CAChC,GAAI,EACF,OAAO,GAKb,OAAO,MAOI,IAAe,EAAY,IAAyC,CAC/E,GAAI,EAAM,KAAO,EAAI,MAAO,EAAE,CAE9B,IAAM,EAAM,EAAM,MAAM,UAAU,GAAO,OAAO,GAAM,UAAa,EAAE,KAAO,EAAG,CAE/E,GAAI,GAAO,EACT,MAAO,CAAC,EAAI,CAGd,IAAK,GAAM,CAAC,EAAG,KAAM,OAAO,QAAQ,EAAM,MAAM,CAC9C,GAAI,EAAY,EAAE,CAAE,CAClB,IAAM,EAAU,GAAY,EAAI,EAAE,CAClC,GAAI,MAAM,QAAQ,EAAQ,CACxB,MAAO,CAAC,OAAO,SAAS,EAAE,CAAE,GAAG,EAAQ,CAK7C,OAAO,MAMI,EAAiB,GAAqB,EAAK,MAAM,EAAG,GAAG,CAKvD,IAAiB,EAAa,IACzC,EAAM,SAAW,EAAM,QAAU,EAAM,OAAO,EAAK,IAAQ,IAAQ,EAAM,GAAK,CAMnE,IAAc,EAAqB,IAC9C,EAAc,OAAS,EAAK,QACxB,OAAO,IAAI,EAAc,KAAK,IAAI,GAAG,CAAC,KAAK,EAAK,KAAK,IAAI,CAAC,CAKnD,IAAyB,EAAa,IAAsB,CACvE,IAAMC,EAA2B,EAAE,CAC7B,EAAc,EAAc,EAAM,CAClC,EAAc,EAAc,EAAM,CACpC,EAAI,EAER,KAAO,EAAI,EAAY,QAAU,EAAI,EAAY,QAAU,EAAY,KAAO,EAAY,IACxF,EAAmB,KAAK,EAAY,GAAG,CACvC,IAGF,OAAO,GAOI,IAAkB,EAAY,IAAqC,CAC9E,IAAI,EAAW,CAAC,CAAC,EAAM,SACnBC,EAAsC,EACtC,EAAQ,EACZ,KAAO,EAAQ,EAAK,QAAU,CAAC,GAAY,EAAY,EAAO,EAAE,CAC9D,IAAMF,EAA0C,EAAO,MAAM,EAAK,IAC9D,EAAO,EAAE,GAAK,EAAY,EAAE,EAAK,UAAW,GAAO,EAAE,SACvD,EAAW,CAAC,CAAC,EAAE,SACf,EAAS,GAEX,IAEF,OAAO,GC3HIG,GAAqC,GAChD,GAAc,EAAE,CAAE,EAAO,KAAK,CAAG,gBAAkB,sBAAsB,EAAO,KAAK,KAAK,IAAI,GCD1F,GAAe,WAAW,OAahC,IAAW,MACT,eAAe,WAAW,QAAS,KAC9B,KAAK,QAAQ,CAAG,KAAK,MAAM,EAAuB,EAAI,OAAc,OAAO,SAAS,EAAE,EACtF,SAAS,GAAG,CACZ,SAAS,EAAG,IAAI,CACpB,CAIH,GAAI,OAEE,OAAO,GAAa,YAAe,WACrC,MAAmB,GAAa,YAAY,SACnC,OAAO,GAAa,iBAAoB,WAAY,CAO7D,IACM,EAAY,IAAI,YAAY,GAAG,CAErC,MAAmB,CACjB,GAAa,gBAAgB,EAAU,CACvC,IAAI,GAAM,EAAU,GAAK,IAAI,SAAS,GAAG,CACzC,IAAK,IAAI,EAAI,EAAG,EAAI,GAAI,IACtB,AAKE,EALE,IAAM,GACH,GAAG,EAAA,GACC,IAAM,GACV,GAAG,IAAK,OAAe,EAAU,IAAM,KAEvC,GAAG,KAAM,EAAU,GAAK,IAAI,SAAS,GAAG,IAG3C,IAAM,GAAK,IAAM,IAAM,IAAM,IAAM,IAAM,MAC3C,EAAK,GAAG,EAAA,IAGZ,OAAO,IC5Cb,MAAMC,GAAU,CACd,KAAM,OACN,MAAO,OACP,WAAY,KACZ,MAAO,QACR,CAQY,IACX,EACA,IAIqB,CAKrB,IAAM,EAAK,EAAY,EAAa,EAAU,CAA8BA,GAExEC,EAAkE,EAAG,YAAc,GAkBvF,MAhBI,CAAC,GAAc,IACjB,EAAa,EAAc,EAAG,MAAqC,CACjE,UAAW,EACZ,CAAC,EAGA,IAAe,GACV,EACE,IAAe,GACjB,EAAE,CAGP,GAAsB,EAAW,CAC5B,GAAiB,EAAW,CAG7B,GAAY,IAClB,GACE,EAAkB,KAAK,GAAO,EAAI,QAAU,EAAG,EAAG,CAAC,EAAI,CACrD,KAAM,EACN,MAAO,EACP,MAAO,EACR,CACJ,EAAI,EAAE,ECvDI,GACX,GACuF,CACvF,IAAM,EACJ,OAAO,GAAqB,UACxB,EACA,OAAO,GAAqB,UAAY,EACtC,EAAiB,MACjB,KACR,OAAO,OAAO,GAAU,UACpB,EACE,EAAmB,MACnB,EAAmB,QACrB,ICVAC,GAAmD,CACvD,CAAE,KAAM,QAAS,MAAO,QAAS,MAAO,QAAS,CAClD,CAEK,GAAU,CACd,KAAM,OACN,MAAO,OACP,aAAc,KACd,MAAO,QACR,CAQY,IACX,EACA,EACA,IAK2B,CAK3B,IAAM,EAAK,EAAY,EAAa,EAAU,CAAG,GAE7CC,EAIoE,EAAG,cAAgB,GAoB3F,OAlBI,OAAO,GAAoB,aAC7B,EAAkB,EAAgB,EAAc,EAG9C,CAAC,GAAmB,IACtB,EAAkB,EAAgB,EAAG,MAAqC,EAAe,CACvF,UAAW,EACZ,CAAC,EAGC,EAID,GAAsB,EAAgB,CACjC,GAAiB,EAA0C,CAG7D,EAAgB,IACrB,GACE,GAAyB,KAAK,GAAO,EAAI,QAAU,EAAG,EAAG,CAAC,EAAI,CAC5D,KAAM,EACN,MAAO,EACP,MAAO,EACR,CACJ,CAdQ,ICrDE,IACX,EACA,GAAG,IAEH,EAAQ,EAAM,GAAS,CACrB,IAAK,IAAM,KAAgB,EAEzB,GAAI,EACF,IAAK,IAAM,KAAK,GAAW,EAAa,CAClC,EAAM,GACR,OAAO,OAAO,EAAM,GAAI,EAAa,GAAG,CAExC,OAAO,OAAO,EAAO,EAAG,GAAI,EAAa,GAAI,CAAC,EAKtD,CAES,IACX,EACA,EACA,IACwD,CACxD,IAAM,EAAY,GAAc,EAAkB,CAC/C,KAAK,CAAC,EAAK,CAAC,EAAI,MAAS,CAAC,EAAK,GAAM,GAAM,IAAW,KAAM,GAAK,CAAC,CAClE,OAAO,GAAK,CAAC,CAAC,EAAE,GAAG,CACtB,GAAI,EAAU,OAAS,GAAK,EAAU,CACpC,IAAM,EAAoB,IAAW,IAAO,EAAE,CACxC,EAAc,OAAO,OAAO,EAAE,CAAE,EAAmB,OAAO,YAAY,EAAU,CAAC,CACvF,MAAO,EAAG,GAAK,EAAa,GC/B1B,GAAwB,EAAwB,IACpD,GAAK,EAAK,IAAI,GAAK,GAAK,IAAI,GAAM,CAAC,CAAC,CAKzB,IAAmB,GAAG,KAA6C,CAC9E,aAAc,EAAqB,eAAgB,EAAK,CACxD,UAAW,EAAqB,YAAa,EAAK,CAClD,OAAQ,EAAqB,SAAU,EAAK,CAC5C,KAAM,EAAqB,OAAQ,EAAK,CACxC,YAAa,EAAqB,cAAe,EAAK,CACtD,QAAS,EAAqB,UAAW,EAAK,CAC9C,SAAU,EAAqB,WAAY,EAAK,CAChD,UAAW,EAAqB,YAAa,EAAK,CAClD,WAAY,EAAqB,aAAc,EAAK,CACpD,YAAa,EAAqB,cAAe,EAAK,CACtD,KAAM,EAAqB,OAAQ,EAAK,CACxC,OAAQ,EAAqB,SAAU,EAAK,CAC5C,UAAW,EAAqB,YAAa,EAAK,CAClD,MAAO,EAAqB,QAAS,EAAK,CAC1C,WAAY,EAAqB,aAAc,EAAK,CACpD,UAAW,EAAqB,YAAa,EAAK,CAClD,aAAc,EAAqB,eAAgB,EAAK,CACxD,WAAY,EAAqB,aAAc,EAAK,CACpD,SAAU,EAAqB,WAAY,EAAK,CAChD,UAAW,EAAqB,YAAa,EAAK,CAClD,SAAU,EAAqB,WAAY,EAAK,CAChD,UAAW,EAAqB,YAAa,EAAK,CAClD,MAAO,EAAqB,QAAS,EAAK,CAC1C,YAAa,EAAqB,cAAe,EAAK,CACtD,cAAe,EAAqB,gBAAiB,EAAK,CAC1D,cAAe,EAAqB,gBAAiB,EAAK,CAC1D,aAAc,EAAqB,eAAgB,EAAK,CACxD,MAAO,EAAqB,QAAS,EAAK,CAC1C,QAAS,EAAqB,UAAW,EAAK,CAC9C,YAAa,EAAqB,cAAe,EAAK,CACtD,QAAS,EAAqB,UAAW,EAAK,CAC9C,QAAS,EAAqB,UAAW,EAAK,CAC9C,SAAU,EAAqB,WAAY,EAAK,CAChD,kBAAmB,EAAqB,oBAAqB,EAAK,CAClE,SAAU,EAAqB,WAAY,EAAK,CAChD,cAAe,EAAqB,gBAAiB,EAAK,CAC1D,UAAW,EAAqB,YAAa,EAAK,CAClD,eAAgB,EAAqB,iBAAkB,EAAK,CAC5D,SAAU,EAAqB,WAAY,EAAK,CAChD,YAAa,EAAqB,cAAe,EAAK,CACvD,EChDK,IAAyB,EAAgB,IAC7C,IAAS,GAAQ,GAAQ,EAAO,GAAS,IAAY,GAEjD,IAA0B,EAAgB,IAC9C,EAAO,GAAO,IAAS,GAAQ,GAAQ,CAAC,CAAC,EAM9B,IACX,EACA,EACA,EACA,IAEC,EAII,GAAS,EAHV,EACE,GAAsB,EAAM,EAAQ,CACpC,GAAuB,EAAM,EAAQ,CAQhC,IAAiB,EAAW,EAAY,IACnD,IAAS,IAAA,IAAa,GAAQ,KAC1B,EACA,IAAY,IAAA,IAAa,GAAW,KAClC,EACA,EAMK,IACX,EAA2B,EAAE,CAC7B,EAAiC,EAAE,CACnC,IAEA,GAAc,EAAyB,CAAC,QAA2B,EAAK,CAAC,EAAK,MAC5E,EAAI,GAAO,GAAW,EAAK,EAAM,GAAM,EAAY,GAAM,CAAC,EAAS,CAC5D,GACN,EAAE,CAAC,CC5BK,IACX,EACA,CAAE,cAAc,GAAgC,EAAE,GAElD,EAAQ,EAAM,GAAS,CACrB,AACE,EAAM,KAAK,GAAa,EAE1B,CAMS,IACX,EACA,CAAE,cAAc,GAAgC,EAAE,GAElD,EAAQ,EAAa,GAAS,CAC5B,AACE,EAAM,KAAK,GAAa,CAE1B,EAAM,MAAQ,EAAM,MAAM,IAAI,GAC5B,OAAO,GAAM,SACT,EACA,EAAY,EAAE,CACZ,GAAiB,EAAG,CAAE,cAAa,CAAC,CACpC,GAAY,EAAG,CAAE,cAAa,CAAC,CACtC,EACD,CAKS,IACX,EACA,CAAE,cAAc,GAAgC,EAAE,GAElD,EAAY,EAAG,CAAG,GAAiB,EAAI,CAAE,cAAa,CAAC,CAAG,GAAY,EAAI,CAAE,cAAa,CAAC,CC5C/E,IACX,EACA,CAAE,cAAc,GAAoC,EAAE,GAC7B,gBAAgB,CAAE,GAAG,EAAM,GAAI,GAAa,CAAE,CAAyB,CAKrF,IACX,EACA,CAAE,cAAc,GAAoC,EAAE,GAC9B,CACxB,GAAI,CAAC,EAAO,EAAQ,CAAE,OAAO,EAE7B,GAAI,CAAC,EAAY,EAAQ,CACvB,OAAO,gBAAgB,CACrB,GAAG,EACH,GAAI,GAAa,CAClB,CAAC,CAGJ,IAAM,EAAW,CAAE,GAAG,EAAS,GAAI,GAAa,CAAE,CAclD,OAXI,MAAM,QAAQ,EAAS,MAAM,GAE9B,EAAS,MAAgB,EAAQ,MAAM,IAAK,GAC3C,OAAO,GAAM,SACT,EACA,EAAY,EAAE,CACZ,GAAc,EAAG,CAAE,cAAa,CAAC,CACjC,GAAa,EAAe,CAAE,cAAa,CAAC,CACnD,EAGI,GCMI,IAEX,EAEA,EAEA,EAEA,CACE,cAAc,EACd,sBACA,cAAc,GACA,EAAE,GAElB,EAAQ,EAAO,GAAS,CACtB,IAAM,EAAS,MAAM,QAAQ,EAAe,CACxC,EAAS,EAAgB,EAAM,CAC/B,GAAO,EAAgB,EAAM,CAE7B,MAAC,GAAU,CAAC,EAAY,EAAO,EAEnC,IAAI,GAAkB,EAAO,EAAI,EAAO,MAAM,OAAS,EAAG,CACxD,IAAM,EAAiB,EAAO,MAAM,GAAG,GAAG,CAC1C,EAAO,MAAM,KAIX,IACG,OAAO,GAAmB,SAAW,EAAiB,EAAe,EAAY,EACrF,CAGH,EAAO,MAAM,KAAK,GAAmB,EAAa,CAAE,cAAa,CAAC,CAAa,GAC/E,CA0CS,IAEX,EAEA,EAGA,EAEA,EAEA,CACE,qBAAqB,GACrB,wBAAwB,GACxB,6BAA+B,IAC/B,sBAAwB,CAAC,QAAQ,CACjC,0BAA4B,GAC5B,oBAAsB,EAAE,EACP,EAAE,GAErB,EAAQ,EAAO,GAAS,CACtB,IAAM,EAAO,MAAM,QAAQ,EAAS,CAAG,EAAW,GAAY,EAAU,EAAM,CAG9E,GAAI,CAAC,EAAM,OAGX,GAAI,IAAS,cAAgB,CAAC,EAAgB,EAAM,CAAE,CACpD,IAAM,EAAe,EAAS,EAAc,EAAK,CAAE,EAAM,CAAQ,MAE7D,EAAK,GAAG,GAAG,CAAI,GAAM,IACvB,EAAY,EAAK,GAAG,GAAG,EAAK,GAE9B,OAGF,IAAM,EAAc,EAAS,EAAM,EAAM,CAGzC,GAAI,CAAC,EAAa,OAElB,IAAM,EAAU,EAAY,EAAY,CAaxC,GATI,EAAY,KAAU,IAGtB,IAAS,gBAEX,EAAY,GAAQ,GAIlB,GAAS,OAEb,IAAI,EAAmB,GACnB,EAAa,GAEjB,GAAI,IAAS,QAAS,CACpB,IAAM,EAAsB,EAAc,EAAY,MAAM,CACtD,EAAoB,EAAc,EAAM,CAE9C,GAAI,EAAkB,SAAW,EAC/B,OAAO,EAAY,UACd,CACL,IAAM,EACJ,EAAY,OAAO,MAAQ,EAAU,EAAmB,EAAY,MAAM,KAAK,CAC3E,KACA,EAAe,EAAkB,CACnC,IACF,EAAY,MAAQ,CAAE,KAAM,EAAe,UAAW,EAAG,GAIzD,EAAoB,OAAS,GAAK,EAAkB,OAAS,KAE/D,EAAqB,IAKrB,GAAsB,IAAS,UACjC,EAAY,SAAW,EAAuB,EAAM,CACpD,EAAmB,GACnB,EAAa,IAIX,GAAyB,IAAS,aACpC,EAAmB,GACnB,EAAa,IAQf,IAAM,EAAqB,EALN,GACnB,CAAE,KAAM,EAAY,MAAO,MAAO,EAAY,MAAO,MAAO,GAAI,CAChE,EAAY,SACZ,EACD,CACsD,EAEpD,GACC,EAAY,aACZ,IAAuB,EAAY,aACpC,IAAS,eAAiB,IAAU,EAAY,eAKjD,EACE,CAAC,CAAC,EAAY,aAAgB,CAAC,EAAY,aAAe,IAAU,EACtE,EAAY,YAAc,EAAmB,EAAqB,GAGhE,IAEF,EAAY,MAAQ,EAAoB,EAAY,GAEtD,CAQS,IAEX,EAEA,IACO,CACP,IAAM,EAAO,MAAM,QAAQ,EAAS,CAAG,EAAW,GAAY,EAAU,EAAM,CAc9E,MAXI,CAAC,GAIH,EAAK,SAAW,GAEf,CAAC,EAAgB,EAAM,EAAI,CAAC,EAAS,EAAM,EAAM,CAE3C,EAGF,EAAQ,EAAO,GAAS,CAC7B,IAAM,EAAQ,EAAK,GAAG,GAAG,CACnB,EAAS,EAAS,EAAc,EAAK,CAAE,EAAM,CACnD,GAAI,GAAU,EAAY,EAAO,CAC/B,GAAI,CAAC,EAAgB,EAAO,EAAI,EAAO,MAAM,OAAS,EAAG,CACvD,IAAM,EAAiB,IAAU,EAAI,EAAI,EAAQ,EACjD,EAAO,MAAM,OAAO,EAAgB,EAAE,MAEtC,EAAO,MAAM,OAAO,EAAO,EAAE,EAGjC,EAGE,IACJ,EACA,EACA,IACS,CACT,GAAI,MAAM,QAAQ,EAAwB,CACxC,OAAO,EAGT,IAAM,EAAK,GAAkB,EAAM,CAEnC,GAAI,IAA4B,KAC9B,IAAI,GAAc,EAAa,CAAC,EAAE,CAAC,CACjC,OAAO,KACE,EAAY,GAAG,GAAG,GAAK,EAAG,CACnC,IAAM,EAAa,EAAc,EAAY,CAC7C,MAAO,CAAC,GAAG,EAAc,EAAW,CAAE,KAAK,IAAI,EAAG,EAAW,GAAG,GAAG,EAAK,EAAK,EAAI,GAAG,CAAC,KAChF,CACL,IAAM,EAAiB,CACrB,GAAG,EAAc,EAAY,CAC7B,KAAK,IAAI,EAAG,EAAY,GAAG,GAAG,EAAK,EAAK,EAAI,GAAG,CAChD,CACK,EAAiB,EAAS,EAAgB,EAAM,CAQpD,OAPE,EAAY,EAAe,CACtB,CAAC,GAAG,EAAgB,EAAe,MAAM,OAAO,CAEpC,CACjB,GAAG,EAAc,EAAY,CAC7B,KAAK,IAAI,EAAG,EAAY,GAAG,GAAG,EAAK,EAAK,EAAI,GAAG,CAChD,UAII,IAA4B,OACrC,IAAI,GAAc,CAAC,EAAM,MAAM,OAAS,EAAE,CAAE,EAAY,CACtD,OAAO,KAEP,EAAY,GAAG,GAAG,GACjB,EAAS,EAAc,EAAY,CAAE,EAAM,CAAsB,MAAM,OAAS,EACjF,CACA,IAAM,EAAa,EAAc,EAAY,CAC7C,MAAO,CAAC,GAAG,EAAc,EAAW,CAAE,EAAW,GAAG,GAAG,CAAI,EAAE,KACxD,CACL,IAAM,EAAiB,CAAC,GAAG,EAAc,EAAY,CAAE,EAAY,GAAG,GAAG,EAAK,EAAK,EAAI,GAAG,CAMxF,OAJE,EADqB,EAAS,EAAgB,EAAM,CACvB,CACxB,CAAC,GAAG,EAAgB,EAAE,CAEV,CAAC,GAAG,EAAc,EAAY,CAAE,EAAY,GAAG,GAAG,EAAK,EAAK,EAAI,GAAG,EAM5F,OAAO,GA+BI,IAEX,EAEA,EAEA,EAEA,CAAE,QAAQ,GAAO,cAAc,EAAoB,cAAc,GAA4B,EAAE,GACxF,CACP,IAAM,EAAU,MAAM,QAAQ,EAAY,CAAG,EAAc,GAAY,EAAa,EAAM,CAG1F,GAAI,CAAC,EAAS,OAAO,EAErB,IAAM,EAAW,GAAY,EAAO,EAAS,EAAQ,CAGrD,GACE,EAAQ,SAAW,GACnB,GAAc,EAAS,EAAS,EAChC,CAAC,EAAS,EAAc,EAAS,CAAE,EAAM,CAEzC,OAAO,EAGT,IAAM,EAAsB,EAAS,EAAS,EAAM,CACpD,GAAI,CAAC,EACH,OAAO,EAET,IAAM,EAAc,EAChB,GAAc,EAAyC,CAAE,cAAa,CAAC,CACvE,EAEJ,OAAO,EAAQ,EAAO,GAAS,CAC7B,IAAM,EAAyB,GAAkB,EAAM,CACjD,EAAuB,EAAS,EAAc,EAAQ,CAAE,EAAM,CAC9D,EAAoB,EAAQ,GAAG,GAAG,CAClC,EACJ,GAA0B,EAAoB,EACzC,EAAqB,MAAM,EAAoB,GAChD,KACA,EACJ,GAA0B,EAAoB,EAAqB,MAAM,OAAS,EAC7E,EAAqB,MAAM,EAAoB,GAChD,KAGN,GAAI,CAAC,EAAO,CACV,IAAM,EAAiB,EACnB,KAAK,IAAI,EAAG,EAAoB,EAAE,CAClC,EACE,EAAe,EAAyB,EAAI,EAClD,EAAqB,MAAM,OAAO,EAAgB,EAAa,CAGjE,IAAM,EAAa,CAAC,GAAG,EAAS,CAC1B,EAAqB,GAAsB,EAAS,EAAS,CAEjE,CAAC,GACD,EAAQ,SAAW,EAAmB,OAAS,GAC/C,EAAS,EAAmB,QAAU,EAAQ,EAAmB,UAKjE,EAAW,EAAmB,SAAW,EAAyB,EAAI,GAGxE,IAAM,EAAqB,EADF,EAAc,EAAW,CACI,EAAM,CACtD,EAAW,EAAW,GAAG,GAAG,CAO5B,GAAqB,GAAG,IAC5B,EAAmB,MAAM,OAAO,EAAU,EAAG,GAAG,EAAK,CAGnD,EAAmB,MAAM,SAAW,GAAK,CAAC,EAC5C,EAAkB,EAAY,CAE1B,IAAa,EACX,IAAsB,GAAK,EAC7B,EAAkB,EAAa,EAAkB,CAIjD,EAAkB,EADhB,EAAmB,MAAM,IAAM,GAAqB,EAAe,EAAY,CAChC,CAIjD,EADE,IAIA,EAAmB,MAAM,EAAW,IACpC,GACA,EAAe,EAAY,EALQ,EAMY,EAIvD,EA+CS,IAEX,EAEA,EAEA,EAEA,CACE,cAAc,EACd,sBACA,uBACA,cAAc,EACd,UAAU,IACO,EAAE,GAErB,EAAQ,EAAO,GAAS,CACtB,IAAM,EAAqB,EAAS,EAAc,EAAK,CAAE,EAAM,CAC/D,GAAI,CAAC,GAAsB,CAAC,EAAY,EAAmB,CAAE,OAE7D,IAAM,EAAO,GAAc,EAAiC,CAAE,cAAa,CAAC,CACtE,EAAyB,GAAkB,EAAM,CACjD,EAAW,EAAK,GAAG,GAAG,CAOtB,GAAqB,EAAa,GAAG,IACzC,EAAmB,MAAM,OAAO,EAAK,EAAU,EAAK,OAAS,EAAG,GAAG,EAAK,CAG1E,GAAI,EAAmB,MAAM,SAAW,GAAK,CAAC,EAC5C,EAAkB,EAAU,EAAK,SACxB,GAAW,EACpB,EAAkB,EAAY,EAAW,EAAI,EAAK,SAE9C,IAAa,EACX,EAAK,MAAM,GAAG,GAAG,GAAK,GAAK,EAC7B,EAAkB,EAAU,EAAM,EAAqB,CAIvD,EAAkB,EAAU,EAD1B,EAAmB,MAAM,IAAM,GAAuB,EAAe,EAAY,CAC/B,KAEjD,CACL,IAAM,EAAqB,EAAW,GAAM,EAAI,EAAW,EAAI,EAC3D,EACF,EAAkB,EAAoB,EAAqB,EAAK,CAMhE,EAAkB,EAHhB,EAAmB,MAAM,EAAqB,IAC9C,GACA,EAAe,EAAY,CAC4B,EAAK,GAIpE,CAgCS,IAEX,EAEA,EAEA,EAEA,CAAE,QAAQ,GAAO,cAAc,EAAoB,cAAc,GAA6B,EAAE,GACzF,CACP,IAAM,EAAa,MAAM,QAAQ,EAAe,CAC5C,EACA,GAAY,EAAgB,EAAM,CAChC,EAAa,MAAM,QAAQ,EAAe,CAC5C,EACA,GAAY,EAAgB,EAAM,CAGtC,GAAI,CAAC,GAAc,CAAC,EAAY,OAAO,EAEvC,IAAM,EAAW,GAAY,EAAO,EAAY,EAAW,CAG3D,GACE,EAAW,SAAW,GACtB,GAAc,EAAY,EAAS,EACnC,CAAC,EAAS,EAAc,EAAS,CAAE,EAAM,CAEzC,OAAO,EAGT,IAAM,EAA4B,EAAS,EAAY,EAAM,CACvD,EAAoB,EAAS,EAAY,EAAM,CACrD,GAAI,CAAC,GAA6B,CAAC,EACjC,OAAO,EAET,IAAM,EAAoB,EACtB,GAAc,EAA+C,CAAE,cAAa,CAAC,CAC7E,EAEJ,OAAO,EAAQ,EAAO,GAAS,CAC7B,IAAM,EAAyB,GAAkB,EAAM,CACjD,EAAuB,EAAS,EAAc,EAAW,CAAE,EAAM,CACjE,EAAoB,EAAW,GAAG,GAAG,CAG3C,GAAI,CAAC,EAAO,CACV,IAAM,EAAiB,EACnB,KAAK,IAAI,EAAG,EAAoB,EAAE,CAClC,EACE,EAAe,EAAyB,EAAI,EAClD,EAAqB,MAAM,OAAO,EAAgB,EAAa,CAGjE,IAAM,EAAa,CAAC,GAAG,EAAS,CAC1B,EAAqB,GAAsB,EAAY,EAAS,CAEpE,CAAC,GACD,EAAW,SAAW,EAAmB,OAAS,GAClD,EAAS,EAAmB,QAAU,EAAW,EAAmB,UAKpE,EAAW,EAAmB,SAAW,EAAyB,EAAI,GAGxE,IAAM,EAAqB,EADF,EAAc,EAAW,CACI,EAAM,CACtD,EAAkB,EAAW,GAAG,GAAG,CAGzC,EAAmB,MAAM,OACvB,EACA,EACA,GACG,EACG,CAAE,MAAO,CAAC,EAAmB,EAAe,EAAY,CAAE,EAAkB,CAAE,CAC9E,CACE,WAAY,EAAe,EAAY,CACvC,MAAO,CAAC,EAAmB,EAAkB,CAE9C,CACL,CAAE,cAAa,CAEhB,CACF,EACD"}