@rebuy/rebuy 2.27.0 → 2.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1352 -366
  4. package/dist/index.js.map +4 -4
  5. package/dist/index.mjs +1351 -365
  6. package/dist/index.mjs.map +4 -4
  7. package/dist/schema/checkout-and-beyond/constants.js +1 -0
  8. package/dist/schema/checkout-and-beyond/constants.js.map +2 -2
  9. package/dist/schema/checkout-and-beyond/constants.mjs +1 -0
  10. package/dist/schema/checkout-and-beyond/constants.mjs.map +2 -2
  11. package/dist/schema/checkout-and-beyond/index.js +285 -92
  12. package/dist/schema/checkout-and-beyond/index.js.map +4 -4
  13. package/dist/schema/checkout-and-beyond/index.mjs +285 -92
  14. package/dist/schema/checkout-and-beyond/index.mjs.map +4 -4
  15. package/dist/schema/widget-data.js +165 -148
  16. package/dist/schema/widget-data.js.map +4 -4
  17. package/dist/schema/widget-data.mjs +165 -148
  18. package/dist/schema/widget-data.mjs.map +4 -4
  19. package/dist/schema/widgets/checkout-and-beyond/common.d.ts +2 -1
  20. package/dist/schema/widgets/checkout-and-beyond/common.d.ts.map +1 -1
  21. package/dist/schema/widgets/checkout-and-beyond/discount.d.ts +30 -0
  22. package/dist/schema/widgets/checkout-and-beyond/discount.d.ts.map +1 -0
  23. package/dist/schema/widgets/checkout-and-beyond/index.d.ts +2 -0
  24. package/dist/schema/widgets/checkout-and-beyond/index.d.ts.map +1 -1
  25. package/dist/schema/widgets/checkout-and-beyond/offerLabels.d.ts +178 -0
  26. package/dist/schema/widgets/checkout-and-beyond/offerLabels.d.ts.map +1 -0
  27. package/dist/schema/widgets/checkout-and-beyond/shared.d.ts +2 -1
  28. package/dist/schema/widgets/checkout-and-beyond/shared.d.ts.map +1 -1
  29. package/dist/schema/widgets/checkout-and-beyond/utils.d.ts +2 -0
  30. package/dist/schema/widgets/checkout-and-beyond/utils.d.ts.map +1 -1
  31. package/dist/server/dataSourceResults.d.ts +18 -0
  32. package/dist/server/dataSourceResults.d.ts.map +1 -0
  33. package/dist/server/index.d.ts +6 -2
  34. package/dist/server/index.d.ts.map +1 -1
  35. package/dist/server/index.js +1162 -435
  36. package/dist/server/index.js.map +4 -4
  37. package/dist/server/index.mjs +1161 -434
  38. package/dist/server/index.mjs.map +4 -4
  39. package/dist/server/userConfig.d.ts +8 -0
  40. package/dist/server/userConfig.d.ts.map +1 -0
  41. package/dist/server/widgetSettings.d.ts.map +1 -1
  42. package/dist/transforms/index.d.ts +4 -0
  43. package/dist/transforms/index.d.ts.map +1 -1
  44. package/dist/transforms/index.js +1004 -81
  45. package/dist/transforms/index.js.map +4 -4
  46. package/dist/transforms/index.mjs +1004 -81
  47. package/dist/transforms/index.mjs.map +4 -4
  48. package/dist/transforms/offerV1/buildOfferTemplate.d.ts +13 -0
  49. package/dist/transforms/offerV1/buildOfferTemplate.d.ts.map +1 -0
  50. package/dist/transforms/offerV1/convertOfferToV2.d.ts +18 -0
  51. package/dist/transforms/offerV1/convertOfferToV2.d.ts.map +1 -0
  52. package/dist/transforms/offerV1/offerCard.d.ts +17 -0
  53. package/dist/transforms/offerV1/offerCard.d.ts.map +1 -0
  54. package/dist/transforms/offerV1/offerTemplateSeed.d.ts +339 -0
  55. package/dist/transforms/offerV1/offerTemplateSeed.d.ts.map +1 -0
  56. package/dist/transforms/offerV1/types.d.ts +145 -0
  57. package/dist/transforms/offerV1/types.d.ts.map +1 -0
  58. package/package.json +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/schema/widgets/checkout-and-beyond/banner.ts", "../../src/schema/widgets/checkout-and-beyond/common.ts", "../../src/schema/widgets/checkout-and-beyond/layout.ts", "../../src/schema/widgets/checkout-and-beyond/rule.ts", "../../src/schema/widgets/checkout-and-beyond/shared.ts", "../../src/schema/widgets/checkout-and-beyond/button.ts", "../../src/schema/widgets/checkout-and-beyond/image.ts", "../../src/schema/widgets/checkout-and-beyond/regex.ts", "../../src/schema/widgets/checkout-and-beyond/utils.ts", "../../src/schema/widgets/checkout-and-beyond/text.ts", "../../src/schema/widgets/checkout-and-beyond/carousel.ts", "../../src/schema/widgets/checkout-and-beyond/offers.ts", "../../src/schema/widgets/checkout-and-beyond/dataSource.ts", "../../src/schema/widgets/checkout-and-beyond/constants.ts", "../../src/schema/widgets/checkout-and-beyond/products.ts", "../../src/schema/widgets/checkout-and-beyond/product.ts", "../../src/schema/widgets/checkout-and-beyond/cartLine.ts", "../../src/schema/widgets/checkout-and-beyond/monetize.ts", "../../src/schema/widgets/checkout-and-beyond/progressBar.ts", "../../src/schema/widgets/checkout-and-beyond/quantity.ts", "../../src/schema/widgets/checkout-and-beyond/reviews.ts", "../../src/schema/widgets/checkout-and-beyond/variants.ts", "../../src/schema/widgets/checkout-and-beyond/root.ts", "../../src/schema/widgets/checkout-and-beyond/switchLabels.ts", "../../src/server/shared.ts", "../../src/transforms/contentBlockV1/stripContentBlockHtml.ts", "../../src/transforms/contentBlockV1/convertTextToTiptapParagraph.ts", "../../src/transforms/contentBlockV1/types.ts", "../../src/transforms/contentBlockV1/convertContentBlockImageToV2.ts", "../../src/transforms/contentBlockV1/convertContentBlockTextToV2.ts", "../../src/transforms/contentBlockV1/convertContentBlockToV2.ts", "../../src/transforms/convertNumericObjects.ts", "../../src/transforms/deepCamelCase.ts", "../../src/transforms/htmlToTiptap/buildDefaultTextStyleMark.ts", "../../src/transforms/htmlToTiptap/closeTag.ts", "../../src/transforms/htmlToTiptap/constants.ts", "../../src/transforms/htmlToTiptap/makeParagraph.ts", "../../src/transforms/htmlToTiptap/flushParagraph.ts", "../../src/transforms/htmlToTiptap/isSkipping.ts", "../../src/transforms/htmlToTiptap/makeDoc.ts", "../../src/transforms/htmlToTiptap/isValidHref.ts", "../../src/transforms/htmlToTiptap/buildLinkMark.ts", "../../src/transforms/htmlToTiptap/decodeEntities.ts", "../../src/transforms/htmlToTiptap/parseAttribs.ts", "../../src/transforms/htmlToTiptap/openTag.ts", "../../src/transforms/htmlToTiptap/pushText.ts", "../../src/transforms/htmlToTiptap/stripHtmlComments.ts", "../../src/transforms/htmlToTiptap/htmlToTiptap.ts", "../../src/transforms/isCABRootSection.ts", "../../src/transforms/lineItemEditorV1/convertLineItemEditorToV2.ts", "../../src/transforms/lineItemEditorV1/types.ts", "../../src/transforms/normalizeTokens.ts", "../../src/transforms/normalizeTextContent.ts", "../../src/server/widgetSettings.ts"],
4
- "sourcesContent": ["import { z } from 'zod/v4';\n\nimport { bannerColors, buttonFields, SectionType, type BannerColor } from './common';\nimport { CABLayoutSection } from './layout';\nimport { type SectionDetails } from './shared';\n\nexport const CABBannerSection = z.lazy(() =>\n CABLayoutSection.omit({ sectionType: true }).extend({\n buttonField: z.enum(buttonFields).optional(),\n color: z.enum(bannerColors).default('info'),\n dismissible: z.boolean().default(true),\n sectionType: z.literal(SectionType.banner).default(SectionType.banner),\n })\n);\n\nexport type CABBannerSection = Omit<CABLayoutSection, 'sectionType'> & {\n color: BannerColor;\n dismissible: boolean;\n sectionType: 'banner';\n};\n\nexport type CABBannerSectionProps = CABBannerSection & SectionDetails;\n", "export const freezeEnum = <T extends readonly string[]>(values: T) =>\n Object.freeze(Object.fromEntries(values.map((v) => [v, v]))) as { readonly [K in T[number]]: K };\n\nexport const bannerColors = ['info', 'success', 'warning', 'critical'] as const;\nexport const BannerColor = freezeEnum(bannerColors);\nexport type BannerColor = (typeof bannerColors)[number];\n\nexport const borderRadii = ['none', 'small', 'base', 'large', 'fullyRounded'] as const;\nexport const BorderRadius = freezeEnum(borderRadii);\nexport type BorderRadius = (typeof borderRadii)[number];\n\nexport const borderStyles = ['none', 'base', 'dotted', 'dashed'] as const;\nexport const BorderStyle = freezeEnum(borderStyles);\nexport type BorderStyle = (typeof borderStyles)[number];\n\nexport const borderWidths = ['base', 'medium', 'thick'] as const;\nexport const BorderWidth = freezeEnum(borderWidths);\nexport type BorderWidth = (typeof borderWidths)[number];\n\nexport const buttonActions = [\n 'acceptOffer',\n 'addToOrder',\n 'declineAllOffers',\n 'declineOffer',\n 'displayContentInModal',\n 'displayContentInPopover',\n 'goToNextPage',\n 'goToPrevPage',\n 'goToURL',\n 'removeFromCart',\n 'selectVariant',\n 'showPagination',\n 'switchToSubscription',\n 'undoAddToOrder',\n] as const;\n\nexport const ButtonAction = freezeEnum(buttonActions);\nexport type ButtonAction = (typeof buttonActions)[number];\n\nexport const buttonFields = [\n 'activePage',\n 'addedToCart',\n 'addingToCart',\n 'addToCart',\n 'buttonLabel',\n 'declineAllOffers',\n 'declineOffer',\n 'destinationUrl',\n 'inactivePage',\n 'overlayContent',\n 'payNow',\n 'progressReached',\n 'progressRemaining',\n 'removeFromCart',\n 'showVariant',\n 'showVariants',\n 'soldOut',\n 'subscriptionOption',\n 'switchToOneTimePurchase',\n 'switchToSubscriptionNoDiscount',\n 'switchToSubscriptionWithDiscount',\n 'undoAddToOrder',\n] as const;\n\nexport const ButtonField = freezeEnum(buttonFields);\nexport type ButtonField = (typeof buttonFields)[number];\n\nexport const buttonStyles = ['primary', 'secondary', 'plain', 'custom'] as const;\nexport const ButtonStyle = freezeEnum(buttonStyles);\nexport type ButtonStyle = (typeof buttonStyles)[number];\n\nexport const directions = ['columns', 'rows', 'grid'] as const;\nexport const Direction = freezeEnum(directions);\nexport type Direction = (typeof directions)[number];\n\nexport const discountSources = ['price', 'compare_at_price'] as const;\nexport const DiscountSource = freezeEnum(discountSources);\nexport type DiscountSource = (typeof discountSources)[number];\n\nexport const discountTypes = ['none', 'percentage', 'fixed', 'fixed_amount'] as const;\nexport const DiscountType = freezeEnum(discountTypes);\nexport type DiscountType = (typeof discountTypes)[number];\n\nexport const editorModes = [\n 'checkoutExtension',\n 'postPurchaseOffer',\n 'thankYouPage',\n 'orderStatusPage',\n 'ordersIndexPage',\n 'customerProfilePage',\n] as const;\n\nexport const EditorMode = freezeEnum(editorModes);\nexport type EditorMode = (typeof editorModes)[number];\n\nexport const horizontalAlignments = ['start', 'center', 'end'] as const;\nexport const HorizontalAlignment = freezeEnum(horizontalAlignments);\nexport type HorizontalAlignment = (typeof horizontalAlignments)[number];\n\nexport const languageKeys = [\n 'ar',\n 'cs',\n 'da',\n 'de',\n 'en',\n 'es',\n 'fi',\n 'fr',\n 'ga',\n 'he',\n 'hi',\n 'id',\n 'it',\n 'ja',\n 'ko',\n 'nl',\n 'no',\n 'pl',\n 'pt',\n 'ru',\n 'sv',\n 'th',\n 'tr',\n 'uk',\n 'vi',\n 'zh',\n] as const;\n\nexport const LanguageKey = freezeEnum(languageKeys);\nexport type LanguageKey = (typeof languageKeys)[number];\n\nexport const objectFits = ['cover', 'contain'] as const;\nexport const ObjectFit = freezeEnum(objectFits);\nexport type ObjectFit = (typeof objectFits)[number];\n\nexport const popoverPositions = ['inlineStart', 'inlineEnd', 'blockStart', 'blockEnd'] as const;\nexport const PopoverPosition = freezeEnum(popoverPositions);\nexport type PopoverPosition = (typeof popoverPositions)[number];\n\nexport const popoverPositionMap = {\n bottom: 'blockEnd',\n left: 'inlineStart',\n right: 'inlineEnd',\n top: 'blockStart',\n} as const;\n\nexport const productTypes = ['one-time', 'subscription', 'both'] as const;\nexport const ProductType = freezeEnum(productTypes);\nexport type ProductType = (typeof productTypes)[number];\n\nexport const progressTierTypes = ['decorative', 'discount', 'product', 'shipping'] as const;\nexport const ProgressTierType = freezeEnum(progressTierTypes);\nexport type ProgressTierType = (typeof progressTierTypes)[number];\n\nexport const quantityInputs = ['select', 'number'] as const;\nexport const QuantityInput = freezeEnum(quantityInputs);\nexport type QuantityInput = (typeof quantityInputs)[number];\n\nexport const reviewsSizes = ['small', 'default', 'large'] as const;\nexport const ReviewsSize = freezeEnum(reviewsSizes);\nexport type ReviewsSize = (typeof reviewsSizes)[number];\n\nexport const sectionTypes = [\n 'banner',\n 'button',\n 'carousel',\n 'cartLine',\n 'dataSource',\n 'image',\n 'layout',\n 'monetize',\n 'offers',\n 'product',\n 'products',\n 'progressBar',\n 'quantity',\n 'reviews',\n 'text',\n 'variants',\n] as const;\n\nexport const SectionType = freezeEnum(sectionTypes);\nexport type SectionType = (typeof sectionTypes)[number];\n\nexport const spacings = ['none', 'extraTight', 'tight', 'base', 'loose', 'extraLoose'] as const;\nexport const Spacing = freezeEnum(spacings);\nexport type Spacing = (typeof spacings)[number];\n\nexport const textAlignments = ['start', 'center', 'end'] as const;\nexport const TextAlignment = freezeEnum(textAlignments);\nexport type TextAlignment = (typeof textAlignments)[number];\n\nexport const textColorNames = ['base', 'subdued', 'accent', 'decorative', 'success', 'warning', 'critical'] as const;\nexport const TextColorName = freezeEnum(textColorNames);\nexport type TextColorName = (typeof textColorNames)[number];\n\nexport const textSizeNames = ['extraSmall', 'small', 'base', 'medium', 'large', 'extraLarge'] as const;\nexport const TextSizeName = freezeEnum(textSizeNames);\nexport type TextSizeName = (typeof textSizeNames)[number];\n\nexport const variantModes = ['multiple', 'single'] as const;\nexport const VariantMode = freezeEnum(variantModes);\nexport type VariantMode = (typeof variantModes)[number];\n\nexport const variantSelectors = ['menu', 'radio', 'button'] as const;\nexport const VariantSelector = freezeEnum(variantSelectors);\nexport type VariantSelector = (typeof variantSelectors)[number];\n\nexport const verticalAlignments = ['top', 'middle', 'bottom'] as const;\nexport const VerticalAlignment = freezeEnum(verticalAlignments);\nexport type VerticalAlignment = (typeof verticalAlignments)[number];\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport {\n buttonFields,\n Direction,\n directions,\n HorizontalAlignment,\n horizontalAlignments,\n SectionType,\n Spacing,\n spacings,\n VerticalAlignment,\n verticalAlignments,\n type ButtonField,\n} from './common';\nimport { CABRule } from './rule';\nimport { CABBorder, CABSection, type SectionDetails } from './shared';\n\nexport const GridItem = z.union([z.literal('auto'), z.literal('fill'), z.string().regex(/^\\d+%$/), z.number()]);\nexport type GridItem = z.infer<typeof GridItem>;\n\nexport const CABLayoutSection = z.object({\n alignment: z\n .object({\n horizontal: z.enum(horizontalAlignments).default(HorizontalAlignment.start),\n vertical: z.enum(verticalAlignments).default(VerticalAlignment.top),\n })\n .default({\n horizontal: HorizontalAlignment.start,\n vertical: VerticalAlignment.top,\n }),\n border: z.lazy(() => CABBorder),\n buttonField: z.enum(buttonFields).optional(),\n direction: z.enum(directions).default(Direction.rows),\n grid: z\n .object({\n columns: z.union([z.array(GridItem), z.undefined()]).default(() => ['auto']),\n rows: z.union([z.array(GridItem), z.undefined()]).default(() => ['auto']),\n })\n .default({ columns: ['auto'], rows: ['auto'] })\n .optional(),\n name: z.string().optional(),\n padding: z.enum(spacings).default(Spacing.none),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sections: z.union([z.array(z.lazy(() => CABSection)), z.strictObject({}).transform(() => [])]).default(() => []),\n sectionType: z.literal(SectionType.layout).default(SectionType.layout),\n spacing: z.enum(spacings).default(Spacing.base),\n /** Fire-and-forget impression pixel POSTed once when the section is shown (e.g. a Monetize offer view). */\n viewUrl: z.string().optional(),\n width: z.number().default(100),\n});\n\nexport type CABLayoutSection = {\n alignment: {\n horizontal: HorizontalAlignment;\n vertical: VerticalAlignment;\n };\n border: CABBorder;\n buttonField?: ButtonField;\n direction: Direction;\n grid?: {\n columns: GridItem[];\n rows: GridItem[];\n };\n name?: string;\n padding: Spacing;\n rule?: CABRule;\n sectionId: string;\n sections: CABSection[];\n sectionType: 'layout';\n spacing: Spacing;\n viewUrl?: string;\n width: number;\n};\n\nexport type CABLayoutSectionProps = CABLayoutSection & SectionDetails;\n", "import { z } from 'zod/v4';\n\nexport const ruleTypes = [\n 'cart',\n 'cart_count',\n 'cart_item_count',\n 'cart_line_count',\n 'cart_subtotal',\n 'collection',\n 'customer',\n 'customer_order_count',\n 'customer_tag',\n 'customer_total_spent',\n 'date',\n 'product',\n 'product_tag',\n 'product_title',\n 'product_type',\n 'product_vendor',\n] as const;\n\nconst ruleType = z.enum(ruleTypes);\n\nexport const RuleType = ruleType.enum;\nexport type RuleType = z.infer<typeof ruleType>;\n\nexport const ruleOperators = [\n 'after',\n 'anything',\n 'before',\n 'contains',\n 'contains_any',\n 'does_not_contain',\n 'does_not_contain_any',\n 'equals',\n 'does_not_equal',\n 'greater_than',\n 'less_than',\n] as const;\n\nconst ruleOperator = z.enum(ruleOperators);\n\nexport const RuleOperator = ruleOperator.enum;\nexport type RuleOperator = z.infer<typeof ruleOperator>;\n\nexport const RuleCondition = z.object({\n operator: z.enum(ruleOperators).default(RuleOperator.anything),\n products: z.union([z.array(z.unknown()), z.strictObject({}).transform(() => [])]).default(() => []),\n type: z.enum(ruleTypes).default(RuleType.cart_subtotal),\n value: z.coerce.string().default(''),\n});\n\nexport type RuleCondition = z.infer<typeof RuleCondition>;\n\nexport const RuleLogicBlock = z.object({\n rules: z.array(RuleCondition).default(() => []),\n});\n\nexport type RuleLogicBlock = z.infer<typeof RuleLogicBlock>;\n\nexport const CABRule = z.object({\n dataSourceId: z.number().nullable().default(null),\n enabled: z.boolean().default(false),\n ruleset: z\n .union([\n z.array(\n z.object({\n exitIfMatched: z.boolean().default(true),\n logic: z.array(RuleLogicBlock).default(() => []),\n output: z\n .array(\n z.object({\n key: z.string().default('should_show'),\n type: z.literal('data_json').default('data_json'),\n value: z.string().default('true'),\n })\n )\n .default(() => [{ key: 'should_show', type: 'data_json' as const, value: 'true' }]),\n })\n ),\n z.strictObject({}).transform(() => []),\n ])\n .default(() => []),\n});\n\nexport type CABRule = z.infer<typeof CABRule>;\n", "import { type FieldArrayPath } from 'react-hook-form';\nimport { z, type ZodType } from 'zod/v4';\n\nimport { CABBannerSection } from './banner';\nimport { CABButtonSection } from './button';\nimport { CABCarouselSection } from './carousel';\nimport { CABCartLineSection } from './cartLine';\nimport { borderRadii, BorderRadius, BorderStyle, borderStyles, BorderWidth, borderWidths } from './common';\nimport { CABDataSourceSection } from './dataSource';\nimport { CABImageSection } from './image';\nimport { CABLayoutSection } from './layout';\nimport { CABMonetizeSection } from './monetize';\nimport { CABOffersSection } from './offers';\nimport { CABProductSection } from './product';\nimport { CABProductsSection } from './products';\nimport { CABProgressBarSection } from './progressBar';\nimport { CABQuantitySection } from './quantity';\nimport { CABReviewsSection } from './reviews';\nimport { type CABRootSection } from './root';\nimport { CABTextSection } from './text';\nimport { CABVariantsSection } from './variants';\n\nexport const CABBorder = z\n .object({\n radius: z.enum(borderRadii).default(BorderRadius.base),\n style: z.enum(borderStyles).default(BorderStyle.none),\n width: z.enum(borderWidths).default(BorderWidth.base),\n })\n .default({\n radius: BorderRadius.base,\n style: BorderStyle.none,\n width: BorderWidth.base,\n });\n\nexport type CABBorder = z.infer<typeof CABBorder>;\n\nexport const CABSection: ZodType<CABSection> = z.lazy(() =>\n z.discriminatedUnion('sectionType', [\n CABBannerSection,\n CABButtonSection,\n CABCarouselSection,\n CABCartLineSection,\n CABDataSourceSection,\n CABImageSection,\n CABLayoutSection,\n CABMonetizeSection,\n CABOffersSection,\n CABProductSection,\n CABProductsSection,\n CABProgressBarSection,\n CABQuantitySection,\n CABReviewsSection,\n CABTextSection,\n CABVariantsSection,\n ])\n);\n\nexport type CABSection =\n | CABBannerSection\n | CABButtonSection\n | CABCarouselSection\n | CABCartLineSection\n | CABDataSourceSection\n | CABImageSection\n | CABLayoutSection\n | CABMonetizeSection\n | CABOffersSection\n | CABProductSection\n | CABProductsSection\n | CABProgressBarSection\n | CABQuantitySection\n | CABReviewsSection\n | CABTextSection\n | CABVariantsSection;\n\nexport type SectionId = CABSection['sectionId'];\n\n/* @ts-expect-error: TS2589: Type instantiation _is_ excessively deep and infinite. */\nexport type SectionArrayPath = FieldArrayPath<CABRootSection>;\n\nexport type SectionPrefixPath = `${SectionArrayPath}.${number}` | null;\n\nexport type SectionDetails = {\n /**\n * The full React Hook Form dot-notation path to the section object itself,\n * for use with `register` or `control`, e.g. `sections.0.sections.1`.\n *\n * Returns `null` for the root section.\n */\n fieldArrayPath: SectionArrayPath | null;\n /**\n * The index of the found section within its parent `sections` array.\n *\n * Returns `null` for the root section.\n */\n index: number | null;\n /**\n * The parent `sections` object.\n *\n * Returns `null` for the root section.\n */\n parent: CABSection[] | null;\n /**\n * The parent `sectionId`.\n *\n * Returns `undefined` for the root section.\n */\n parentId: SectionId | undefined;\n /**\n * The full React Hook Form dot-notation path to the section object itself,\n * for use with `register` or `control`, e.g. `sections.0.sections.1`.\n *\n * Returns `null` for the root section.\n */\n prefixPath: SectionPrefixPath | null;\n};\n\nexport type CABSectionProps = CABSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z, type ZodType } from 'zod/v4';\n\nimport {\n buttonActions,\n ButtonStyle,\n buttonStyles,\n PopoverPosition,\n popoverPositions,\n SectionType,\n TextAlignment,\n textAlignments,\n} from './common';\nimport { CABImageSection } from './image';\nimport { CABLayoutSection } from './layout';\nimport { HEX_COLOR_REGEX } from './regex';\nimport { CABRule } from './rule';\nimport { type SectionDetails } from './shared';\nimport { CABTextSection } from './text';\n\nexport type CABButtonContent = CABImageSection | CABLayoutSection | CABTextSection;\n\nexport const CABButtonContent: ZodType<CABButtonContent> = z.lazy(() =>\n z.discriminatedUnion('sectionType', [CABImageSection, CABLayoutSection, CABTextSection])\n);\n\nexport const CABButtonSection = z.object({\n action: z.union([z.literal(''), z.enum(buttonActions)]).default(''),\n buttonStyle: z.enum(buttonStyles).default(ButtonStyle.primary),\n custom: z\n .object({\n color: z.string().regex(HEX_COLOR_REGEX).default('#005bd3'),\n height: z.number().default(52),\n width: z.number().default(300),\n })\n .default({\n color: '#005bd3',\n height: 52,\n width: 300,\n }),\n disableDowngrade: z.boolean().default(false),\n name: z.string().optional(),\n optionId: z.number().optional(),\n popover: z\n .object({\n alignment: z.enum(textAlignments).default(TextAlignment.center),\n position: z.enum(popoverPositions).default(PopoverPosition.blockStart),\n })\n .optional()\n .default(() => ({\n alignment: TextAlignment.center,\n position: PopoverPosition.blockStart,\n })),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sections: z.union([z.array(CABButtonContent), z.strictObject({}).transform(() => [])]).default(() => []),\n sectionType: z.literal(SectionType.button).default(SectionType.button),\n /** Fire-and-forget pixel POSTed when the button is clicked (e.g. a Monetize decline). */\n trackingUrl: z.string().optional(),\n});\n\nexport type CABButtonSection = z.infer<typeof CABButtonSection>;\n\nexport type CABButtonSectionProps = CABButtonSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { buttonFields, ObjectFit, objectFits, SectionType } from './common';\nimport { DYNAMIC_TOKEN_REGEX } from './regex';\nimport { CABRule } from './rule';\nimport { CABBorder, type SectionDetails } from './shared';\nimport { checkForHTML, NO_HTML } from './utils';\n\nexport const CABImageSection = z.object({\n altText: z.string().refine(checkForHTML, NO_HTML).default(''),\n aspectRatio: z.literal(1).nullable().default(null),\n border: z.lazy(() => CABBorder),\n buttonField: z.enum(buttonFields).optional(),\n category: z.enum(['gallery', 'icons', 'payment-methods', 'secure-checkout']).nullable().default(null),\n name: z.string().optional(),\n naturalHeight: z.number().default(0),\n naturalWidth: z.number().default(0),\n /**\n * `contain` (the component default): dimensionless images render in s-image's 1/1 default frame, and\n * `cover` would crop non-square art (payment badges lost their edges \u2014 15993); `contain` letterboxes.\n */\n objectFit: z.enum(objectFits).default(ObjectFit.contain),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.image).default(SectionType.image),\n source: z.union([z.url(), z.literal(''), z.string().regex(DYNAMIC_TOKEN_REGEX)]).default(''),\n width: z.number().default(100),\n});\n\nexport type CABImageSection = z.infer<typeof CABImageSection>;\n\nexport type CABImageSectionProps = CABImageSection & SectionDetails;\n", "/** Matches a valid array index string (e.g., \"0\", \"1\", \"42\"). */\nexport const ARRAY_INDEX_STRING = /^(0|[1-9]\\d*)$/;\n\n/** Matches a dynamic token. */\nexport const DYNAMIC_TOKEN_REGEX = /^\\{\\{\\s*[A-Za-z]+\\s*\\}\\}$/;\n\n/** Matches a valid hex color code. */\nexport const HEX_COLOR_REGEX = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\n\n/** Matches any HTML tags. */\nexport const HTML_TAGS_REGEX = /<\\/?[^>]+>/g;\n", "import { isPlainObject, mapValues } from 'es-toolkit';\nimport { every, get, isArray, isString, map, size, toPairs } from 'es-toolkit/compat';\n\nimport { type CABBannerSection } from './banner';\nimport { type CABButtonSection } from './button';\nimport { type CABCarouselSection } from './carousel';\nimport { type CABCartLineSection } from './cartLine';\nimport { ButtonField, SectionType } from './common';\nimport { type CABDataSourceSection } from './dataSource';\nimport { type CABImageSection } from './image';\nimport { type CABLayoutSection } from './layout';\nimport { type CABMonetizeSection } from './monetize';\nimport { type CABOffersSection } from './offers';\nimport { type CABProductSection } from './product';\nimport { type CABProductsSection } from './products';\nimport { type CABProgressBarSection } from './progressBar';\nimport { type CABQuantitySection } from './quantity';\nimport { ARRAY_INDEX_STRING, HTML_TAGS_REGEX } from './regex';\nimport { type CABReviewsSection } from './reviews';\nimport { type CABTextSection, type TiptapDocument } from './text';\nimport { type CABVariantsSection } from './variants';\n\nexport const isHTML = (html: string | undefined = ''): boolean => {\n if (typeof window !== 'undefined') {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n\n const hasHTML = (nodeList: NodeList) => Array.from(nodeList).some((node) => node.nodeType === 1);\n\n return hasHTML(doc.body.childNodes) || hasHTML(doc.head.childNodes);\n }\n\n return HTML_TAGS_REGEX.test(html);\n};\n\nexport const hasHTMLInDoc = (doc: TiptapDocument): boolean =>\n doc.content.some(({ content = [] }) => content.some(({ text }) => isHTML(text)));\n\nexport const checkForHTML = (input: string | TiptapDocument): boolean =>\n !((isString(input) && isHTML(input)) || (isPlainObject(input) && hasHTMLInDoc(input as TiptapDocument)));\n\nexport const NO_HTML = { message: 'HTML is not supported' };\n\nexport const isBannerType = (section: unknown): section is CABBannerSection =>\n get(section, 'sectionType') === SectionType.banner;\n\nexport const isButtonType = (section: unknown): section is CABButtonSection =>\n get(section, 'sectionType') === SectionType.button;\n\nexport const isCarouselType = (section: unknown): section is CABCarouselSection =>\n get(section, 'sectionType') === SectionType.carousel;\n\nexport const isCartLineType = (section: unknown): section is CABCartLineSection =>\n get(section, 'sectionType') === SectionType.cartLine;\n\nexport const isDataSourceType = (section: unknown): section is CABDataSourceSection =>\n get(section, 'sectionType') === SectionType.dataSource;\n\nexport const isImageType = (section: unknown): section is CABImageSection =>\n get(section, 'sectionType') === SectionType.image;\n\nexport const isLayoutType = (section: unknown): section is CABLayoutSection =>\n get(section, 'sectionType') === SectionType.layout;\n\nexport const isMonetizeType = (section: unknown): section is CABMonetizeSection =>\n get(section, 'sectionType') === SectionType.monetize;\n\nexport const isOffersType = (section: unknown): section is CABOffersSection =>\n get(section, 'sectionType') === SectionType.offers;\n\nexport const isOverlayType = (section: unknown): section is CABLayoutSection =>\n isLayoutType(section) && get(section, 'buttonField') === ButtonField.overlayContent;\n\nexport const isProductType = (section: unknown): section is CABProductSection =>\n get(section, 'sectionType') === SectionType.product;\n\nexport const isProductsType = (section: unknown): section is CABProductsSection =>\n get(section, 'sectionType') === SectionType.products;\n\nexport const isProgressBarType = (section: unknown): section is CABProgressBarSection =>\n get(section, 'sectionType') === SectionType.progressBar;\n\nexport const isQuantityType = (section: unknown): section is CABQuantitySection =>\n get(section, 'sectionType') === SectionType.quantity;\n\nexport const isReviewsType = (section: unknown): section is CABReviewsSection =>\n get(section, 'sectionType') === SectionType.reviews;\n\nexport const isTextType = (section: unknown): section is CABTextSection =>\n get(section, 'sectionType') === SectionType.text;\n\nexport const isVariantsType = (section: unknown): section is CABVariantsSection =>\n get(section, 'sectionType') === SectionType.variants;\n\nconst hasOnlyNumericKeys = (input: Record<string, unknown>) =>\n !!size(input) && every(input, (_, key) => ARRAY_INDEX_STRING.test(key) && Number.isSafeInteger(Number(key)));\n\nconst numericObjectToArray = (input: Record<string, unknown>) =>\n toPairs(input)\n .sort(([a], [b]) => Number(a) - Number(b))\n .map(([_, value]) => value);\n\nexport const convertNumericObjects = (input: unknown): unknown => {\n if (isArray(input)) return map(input, convertNumericObjects);\n\n if (isPlainObject(input)) {\n const obj = input as Record<string, unknown>;\n\n return hasOnlyNumericKeys(obj)\n ? map(numericObjectToArray(obj), convertNumericObjects)\n : mapValues(obj, convertNumericObjects);\n }\n\n return input;\n};\n", "import { forEach, isString } from 'es-toolkit/compat';\nimport { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport {\n ButtonField,\n buttonFields,\n progressTierTypes,\n ProgressTierType,\n SectionType,\n Spacing,\n spacings,\n TextAlignment,\n textAlignments,\n TextColorName,\n textColorNames,\n TextSizeName,\n textSizeNames,\n} from './common';\nimport { DYNAMIC_TOKEN_REGEX } from './regex';\nimport { CABRule } from './rule';\nimport { type SectionDetails } from './shared';\nimport { checkForHTML, NO_HTML } from './utils';\n\nconst enumOrOmit = <T extends readonly [string, ...string[]]>(...vals: T) =>\n z\n .string()\n .transform((val) => (vals.includes(val as T[number]) ? (val as T[number]) : undefined))\n .optional();\n\nexport const TiptapText = z.object({\n marks: z\n .union([\n z.array(\n z.discriminatedUnion('type', [\n z.object({ type: z.literal('bold') }),\n z.object({ type: z.literal('italic') }),\n z.object({\n attrs: z.object({\n class: z.string().nullable(),\n href: z.union([z.url(), z.literal('#'), z.string().regex(DYNAMIC_TOKEN_REGEX)]),\n rel: z.string().default('noopener noreferrer nofollow'),\n target: z.string().default('_blank'),\n }),\n type: z.literal('link'),\n }),\n z.object({ type: z.literal('strike') }),\n z.object({\n attrs: z.object({\n color: enumOrOmit(...textColorNames).default(TextColorName.base),\n fontSize: enumOrOmit(...textSizeNames).default(TextSizeName.base),\n }),\n type: z.literal('textStyle'),\n }),\n ])\n ),\n z.strictObject({}).transform(() => []),\n ])\n .optional(),\n text: z.string().default(''),\n type: z.literal('text').default('text'),\n});\n\nexport type TiptapText = z.infer<typeof TiptapText>;\n\nexport const TiptapParagraph = z.object({\n attrs: z\n .object({\n textAlign: enumOrOmit(...textAlignments),\n })\n .default({ textAlign: TextAlignment.start }),\n content: z.union([z.array(TiptapText), z.strictObject({}).transform(() => [])]).default(() => []),\n type: z.literal('paragraph').default('paragraph'),\n});\n\nexport type TiptapParagraph = z.infer<typeof TiptapParagraph>;\n\nexport const TiptapDocument = z.object({\n attrs: z\n .object({\n blockSpacing: enumOrOmit(...spacings),\n })\n .default({ blockSpacing: Spacing.base }),\n content: z\n .union([z.array(TiptapParagraph), z.strictObject({}).transform(() => [])])\n .default(() => [TiptapParagraph.parse({})]),\n type: z.literal('doc').default('doc'),\n});\n\nexport type TiptapDocument = z.infer<typeof TiptapDocument>;\n\nexport const CABProgressTier = z.object({\n threshold: z.number().int().nonnegative(),\n thresholds: z.record(z.string(), z.number().int().nonnegative()).default(() => ({})),\n tierType: z.enum(progressTierTypes).default(ProgressTierType.shipping),\n});\n\nexport type CABProgressTier = z.infer<typeof CABProgressTier>;\n\nexport const CABTextSection = z\n .object({\n buttonField: z.enum(buttonFields).optional(),\n content: z\n .record(z.string(), z.union([z.string(), TiptapDocument]).refine(checkForHTML, NO_HTML).optional())\n .default({ en: TiptapDocument.parse({}) })\n .optional(),\n name: z.string().optional(),\n optionId: z.number().optional(),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.text).default(SectionType.text),\n tier: CABProgressTier.optional(),\n })\n .superRefine(({ buttonField, content }, ctx) => {\n if (buttonField === ButtonField.destinationUrl && content) {\n forEach(content, (value, lang) => {\n if (value && isString(value)) {\n if (DYNAMIC_TOKEN_REGEX.test(value)) return;\n\n try {\n new URL(value);\n } catch {\n ctx.addIssue({\n code: 'custom',\n message: 'Invalid URL',\n path: ['content', lang],\n });\n }\n }\n });\n }\n });\n\nexport type CABTextSection = z.infer<typeof CABTextSection>;\n\nexport type CABTextSectionProps = CABTextSection & SectionDetails;\n", "import { z } from 'zod/v4';\n\nimport { SectionType } from './common';\nimport { CABLayoutSection } from './layout';\nimport { CABOffersSection } from './offers';\nimport { CABSection, type SectionDetails } from './shared';\n\nexport const CABCarouselSection = z.lazy(() =>\n CABLayoutSection.omit({ sections: true, sectionType: true }).extend({\n autoAdvanceInterval: z.number().default(0),\n itemsAtOnce: z.number().min(1).default(1),\n sections: z\n .union([z.array(z.lazy(() => CABSection)), z.strictObject({}).transform(() => [])])\n .default(() => [CABOffersSection.parse({})]),\n sectionType: z.literal(SectionType.carousel).default(SectionType.carousel),\n })\n);\n\nexport type CABCarouselSection = Omit<CABLayoutSection, 'sectionType'> & {\n autoAdvanceInterval: number;\n itemsAtOnce: number;\n sectionType: 'carousel';\n};\n\nexport type CABCarouselSectionProps = CABCarouselSection & SectionDetails;\n", "import { z } from 'zod/v4';\n\nimport { CABBannerSection } from './banner';\nimport { CABButtonSection } from './button';\nimport { ButtonStyle, SectionType } from './common';\nimport { CABDataSourceSection } from './dataSource';\nimport { CABLayoutSection } from './layout';\nimport { CABProductsSection } from './products';\nimport { CABSection, type SectionDetails } from './shared';\nimport { CABTextSection } from './text';\n\nexport const CABOffersSection = z.lazy(() =>\n CABLayoutSection.omit({ sections: true, sectionType: true }).extend({\n sections: z.union([z.array(z.lazy(() => CABSection)), z.strictObject({}).transform(() => [])]).default(() => [\n CABBannerSection.parse({\n buttonField: 'undoAddToOrder',\n color: 'success',\n dismissible: true,\n name: 'Success Banner',\n sections: [\n CABTextSection.parse({ content: { en: '{{quantity}} {{productTitle}} added to cart.' } }),\n CABButtonSection.parse({ action: 'undoAddToOrder', buttonStyle: ButtonStyle.plain }),\n ],\n }),\n CABDataSourceSection.parse({}),\n CABProductsSection.parse({}),\n ]),\n sectionType: z.literal(SectionType.offers).default(SectionType.offers),\n })\n);\n\nexport type CABOffersSection = Omit<CABLayoutSection, 'sectionType'> & {\n sectionType: 'offers';\n};\n\nexport type CABOffersSectionProps = CABOffersSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { discountSources, discountTypes, productTypes, SectionType } from './common';\nimport { DEFAULT_ENDPOINTS } from './constants';\nimport { type SectionDetails } from './shared';\n\nexport const CABDiscount = z.object({\n amount: z.union([z.number(), z.string()]).catch(0),\n discountedBy: z.string().optional(),\n discountedFrom: z.enum(discountSources).optional().catch(undefined),\n type: z.enum(discountTypes).catch('none'),\n});\n\nexport type CABDiscount = z.infer<typeof CABDiscount>;\n\nexport const CABIntegrations = z.object({\n judgeme: z.boolean().default(false),\n junip: z.boolean().default(false),\n klaviyo: z.boolean().default(false),\n loox: z.boolean().default(false),\n okendo: z.boolean().default(false),\n opinew: z.boolean().default(false),\n reviewsio: z.boolean().default(false),\n stamped: z.boolean().default(false),\n yotpo: z.boolean().default(false),\n});\n\nexport type CABIntegrations = z.infer<typeof CABIntegrations>;\n\nexport const CABDataSourceSection = z.object({\n dataSourceId: z.number().nullable().default(null),\n dataSourcePath: z.string().default(DEFAULT_ENDPOINTS[0].value),\n discount: CABDiscount.optional(),\n integrations: CABIntegrations.optional(),\n limit: z.number().default(1),\n matchVariant: z.boolean().default(false),\n matchVariantOutOfStock: z.boolean().default(false),\n name: z.string().default(DEFAULT_ENDPOINTS[0].label),\n productType: z.enum(productTypes).optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.dataSource).default(SectionType.dataSource),\n treatAsGwp: z.boolean().default(false),\n});\n\nexport type CABDataSourceSection = z.infer<typeof CABDataSourceSection>;\n\nexport type CABDataSourceSectionProps = CABDataSourceSection & SectionDetails;\n", "import { uniqBy } from 'es-toolkit';\n\nimport { EditorMode, freezeEnum } from './common';\nimport { type TargetArea } from './root';\n\nexport const DEFAULT_ENDPOINTS = [\n { label: 'Recommended (AI)', value: '/products/recommended' },\n { label: 'Top Sellers', value: '/products/top_sellers' },\n { label: 'Buy It Again', value: '/products/purchased' },\n { label: 'Recently Viewed', value: '/products/viewed' },\n { label: 'Products Search', value: '/products/search' },\n { label: 'Collection Products', value: '/products/collections' },\n { label: 'Similar Products (AI)', value: '/products/similar_products' },\n] as const;\n\nexport const STATIC_ENDPOINTS = [\n { label: 'Recommended (AI)', value: '/products/recommended' },\n { label: 'Top Sellers', value: '/products/top_sellers' },\n { label: 'Trending Products', value: '/products/trending_products' },\n { label: 'Buy It Again', value: '/products/purchased' },\n { label: 'Collection Products', value: '/products/collections' },\n { label: 'Recently Viewed', value: '/products/viewed' },\n { label: 'Static Products', value: '/products/static' },\n { label: 'Products Search', value: '/products/search' },\n { label: 'Similar Products (AI)', value: '/products/similar_products' },\n] as const;\n\nexport const COMBINED_ENDPOINTS = uniqBy([...DEFAULT_ENDPOINTS, ...STATIC_ENDPOINTS], (item) => item.value);\n\nexport const targetAreas = {\n [EditorMode.checkoutExtension]: [\n { icon: 'splitscreen_top', label: 'Header Area', width: '984px' },\n { icon: 'splitscreen_left', label: 'Main Column', width: '503px' },\n { icon: 'splitscreen_right', label: 'Summary Column', width: '404px' },\n ] satisfies TargetArea[],\n [EditorMode.postPurchaseOffer]: null,\n [EditorMode.thankYouPage]: [\n { icon: 'splitscreen_top', label: 'Header Area', width: '984px' },\n { icon: 'splitscreen_left', label: 'Main Column', width: '503px' },\n { icon: 'splitscreen_right', label: 'Summary Column', width: '404px' },\n ] satisfies TargetArea[],\n [EditorMode.orderStatusPage]: [\n // { fill: true, flip: 'vertical', icon: 'bottom_navigation', label: 'Announcement Bar' },\n { icon: 'splitscreen_top', label: 'Header Area', width: '1124px' },\n { fill: true, icon: 'view_column_2', label: 'Main Area', width: '646px' },\n { icon: 'splitscreen_bottom', label: 'Footer Area', width: '1124px' },\n ] satisfies TargetArea[],\n [EditorMode.ordersIndexPage]: [\n // { fill: true, flip: 'vertical', icon: 'bottom_navigation', label: 'Announcement Bar' },\n { icon: 'splitscreen_top', label: 'Main Area', width: '1124px' },\n ] satisfies TargetArea[],\n [EditorMode.customerProfilePage]: [\n // { fill: true, flip: 'vertical', icon: 'bottom_navigation', label: 'Announcement Bar' },\n { icon: 'splitscreen_top', label: 'Main Area', width: '1124px' },\n ] satisfies TargetArea[],\n} as const;\n\nexport const widgetTypes = [\n 'bundle_builder',\n 'cart',\n 'cart_subscription',\n 'dynamic_bundle',\n 'gift_with_purchase',\n 'pre_purchase',\n 'product',\n 'product_addon',\n 'product_upsell',\n 'recharge_checkout',\n 'recharge_customer_portal',\n 'recharge_post_purchase',\n 'shopify_checkout',\n 'shopify_checkout_extension',\n 'shopify_post_purchase',\n 'shopify_post_purchase_extension',\n 'switch_to_subscription',\n 'ui_extension_ad',\n 'ui_extension_button',\n 'ui_extension_content_block',\n 'ui_extension_line_item_editor',\n 'ui_extension_progress_bar',\n] as const;\n\nexport const WidgetType = freezeEnum(widgetTypes);\nexport type WidgetType = (typeof widgetTypes)[number];\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { SectionType } from './common';\nimport { CABProductSection } from './product';\nimport { type SectionDetails } from './shared';\n\nexport const CABProductsSection = z.object({\n name: z.string().optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sections: z\n .union([z.array(z.lazy(() => CABProductSection)), z.strictObject({}).transform(() => [])])\n .default(() => []),\n sectionType: z.literal(SectionType.products).default(SectionType.products),\n});\n\nexport type CABProductsSection = z.infer<typeof CABProductsSection>;\n\nexport type CABProductsSectionProps = CABProductsSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z, type ZodType } from 'zod/v4';\n\nimport { CABButtonSection } from './button';\nimport { SectionType, VariantMode, variantModes, VariantSelector, variantSelectors } from './common';\nimport { type SectionDetails } from './shared';\nimport { CABTextSection } from './text';\n\nexport type CABVariantContent = CABButtonSection | CABTextSection;\n\nexport const CABVariantContent: ZodType<CABVariantContent> = z.lazy(() =>\n z.discriminatedUnion('sectionType', [CABButtonSection, CABTextSection])\n);\n\nexport const CABProductSection = z.object({\n name: z.string().optional(),\n productId: z.number().nullable().default(null),\n sectionId: z.uuid().default(() => uuidv7()),\n sections: z.union([z.array(CABVariantContent), z.strictObject({}).transform(() => [])]).default(() => []),\n sectionType: z.literal(SectionType.product).default(SectionType.product),\n selectors: z.record(z.string(), z.enum(variantSelectors).default(VariantSelector.menu)).default(() => ({})),\n variantMode: z.enum(variantModes).default(VariantMode.multiple),\n});\n\nexport type CABProductSection = z.infer<typeof CABProductSection>;\n\nexport type CABProductSectionProps = CABProductSection & SectionDetails;\n", "import { z } from 'zod/v4';\n\nimport { CABButtonSection } from './button';\nimport { ButtonAction, SectionType } from './common';\nimport { CABLayoutSection } from './layout';\nimport { CABSection, type SectionDetails } from './shared';\n\nexport const CABCartLineSection = z.lazy(() =>\n CABLayoutSection.omit({ sections: true, sectionType: true }).extend({\n sections: z\n .union([z.array(z.lazy(() => CABSection)), z.strictObject({}).transform(() => [])])\n .default(() => [CABButtonSection.parse({ action: ButtonAction.switchToSubscription })]),\n sectionType: z.literal(SectionType.cartLine).default(SectionType.cartLine),\n })\n);\n\nexport type CABCartLineSection = Omit<CABLayoutSection, 'sectionType'> & {\n sectionType: 'cartLine';\n};\n\nexport type CABCartLineSectionProps = CABCartLineSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { SectionType } from './common';\nimport { CABRule } from './rule';\nimport { type SectionDetails } from './shared';\n\nexport const CABMonetizeSection = z.object({\n name: z.string().optional(),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.monetize).default(SectionType.monetize),\n});\n\nexport type CABMonetizeSection = z.infer<typeof CABMonetizeSection>;\n\nexport type CABMonetizeSectionProps = CABMonetizeSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { SectionType } from './common';\nimport { CABRule } from './rule';\nimport { type SectionDetails } from './shared';\nimport { CABTextSection } from './text';\n\nexport const CABProgressBarSection = z.object({\n /** Empty = shown everywhere; otherwise uppercase ISO country codes. */\n countryCodes: z.array(z.string()).default(() => []),\n name: z.string().optional(),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sections: z.union([z.array(CABTextSection), z.strictObject({}).transform(() => [])]).default(() => []),\n sectionType: z.literal(SectionType.progressBar).default(SectionType.progressBar),\n});\n\nexport type CABProgressBarSection = z.infer<typeof CABProgressBarSection>;\n\nexport type CABProgressBarSectionProps = CABProgressBarSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { QuantityInput, quantityInputs, SectionType } from './common';\nimport { CABRule } from './rule';\nimport { type SectionDetails } from './shared';\n\nexport const CABQuantitySection = z.object({\n errorMessages: z\n .record(\n z.string(),\n z.object({\n max: z.string().optional(),\n min: z.string().optional(),\n neg: z.string().optional(),\n })\n )\n .default({\n en: {\n max: 'Maximum quantity allowed is {{max}}',\n min: 'Minimum quantity required is {{min}}',\n neg: 'Quantity cannot be negative',\n },\n }),\n inputType: z.enum(quantityInputs).default(QuantityInput.select),\n max: z.number().min(1).max(100).default(10),\n min: z.number().min(1).default(1),\n name: z.string().optional(),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.quantity).default(SectionType.quantity),\n});\n\nexport type CABQuantitySection = z.infer<typeof CABQuantitySection>;\n\nexport type CABQuantitySectionProps = CABQuantitySection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { ReviewsSize, reviewsSizes, SectionType } from './common';\nimport { CABRule } from './rule';\nimport { type SectionDetails } from './shared';\n\nexport const CABReviewsSection = z.object({\n color: z.string().default('#fadb14'),\n name: z.string().optional(),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.reviews).default(SectionType.reviews),\n size: z.enum(reviewsSizes).default(ReviewsSize.default),\n});\n\nexport type CABReviewsSection = z.infer<typeof CABReviewsSection>;\n\nexport type CABReviewsSectionProps = CABReviewsSection & SectionDetails;\n", "import { slice } from 'es-toolkit/compat';\nimport { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { SectionType, VariantMode, variantModes, VariantSelector, variantSelectors } from './common';\nimport { CABRule } from './rule';\nimport { type SectionDetails } from './shared';\n\nexport const CABVariantsSection = z.object({\n hideOutOfStockVariants: z.boolean().default(false),\n name: z.string().optional(),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.variants).default(SectionType.variants),\n selector: z.enum(slice(variantSelectors, 0, 3)).default(VariantSelector.menu),\n variantMode: z.enum(variantModes).default(VariantMode.multiple),\n});\n\nexport type CABVariantsSection = z.infer<typeof CABVariantsSection>;\n\nexport type CABVariantsSectionProps = CABVariantsSection & SectionDetails;\n", "import { z } from 'zod/v4';\n\nimport { EditorMode, editorModes } from './common';\nimport { targetAreas, WidgetType, widgetTypes } from './constants';\nimport { CABLayoutSection } from './layout';\n\nconst TargetArea = z\n .object({\n fill: z.boolean().optional(),\n flip: z.enum(['both', 'horizontal', 'vertical']).optional(),\n icon: z.string(),\n label: z.string(),\n width: z.string(),\n })\n .default(targetAreas[EditorMode.checkoutExtension][1]);\n\nexport type TargetArea = {\n fill?: boolean;\n flip?: 'horizontal' | 'vertical' | 'both';\n icon: string;\n label: string;\n width: string;\n};\n\nexport const CABTracking = z\n .object({\n enableAttribution: z.boolean().default(true),\n enableSource: z.boolean().default(true),\n enableWidget: z.boolean().default(true),\n })\n .default({ enableAttribution: true, enableSource: true, enableWidget: true });\n\nexport type CABTracking = z.infer<typeof CABTracking>;\n\nexport const CABRootSection = CABLayoutSection.extend({\n editorMode: z.enum(editorModes).default(EditorMode.checkoutExtension),\n previewMode: z.boolean().default(false),\n storeId: z.number().nullable().default(null),\n targetArea: TargetArea.nullable(),\n tracking: CABTracking,\n type: z.enum(widgetTypes).default(WidgetType.ui_extension_content_block),\n version: z.literal(2).default(2),\n widgetId: z.number().nullable().default(null),\n});\n\nexport type CABRootSection = CABLayoutSection & {\n editorMode: EditorMode;\n previewMode: boolean;\n storeId: number | null;\n targetArea: TargetArea | null;\n tracking: CABTracking;\n type: WidgetType;\n version: number;\n widgetId: number | null;\n};\n", "/**\n * Default localized labels for the switch-to-subscription button content, keyed by `buttonField` then locale.\n * The single source of truth shared by the admin editor and the read-time `convertLineItemEditorToV2` transform\n * so a widget renders identically whether migrated in admin or converted on the fly. `{{subscriptionDiscount}}`\n * is substituted per-plan at render \u2014 CAB tokens are camelCase by default; a legacy snake_case token in a v1\n * merchant override still resolves (the client camelCases unknown token keys against its camelCase variables).\n * `subscriptionOption` is the frequency-select option template (legacy\n * `SwitchToSubscriptionLanguageDefaults.subscription_option_label`); the client resolves `{{interval}}`\n * through `Intl.NumberFormat` unit style, so the noun arrives in the buyer's language, pluralized per count\n * from the runtime's CLDR data (English CLDR nouns are lowercase \u2014 an accepted divergence from legacy).\n */\nexport const SWITCH_LABELS = {\n subscriptionOption: {\n ar: '\u064A\u062A\u0645 \u0627\u0644\u062A\u0648\u0635\u064A\u0644 \u0643\u0644 {{frequency}} {{interval}}',\n cs: 'Doru\u010Den\u00ED ka\u017Ed\u00FDch {{frequency}} {{interval}}',\n da: 'Leveres hver {{frequency}} {{interval}}',\n de: 'Lieferung alle {{frequency}} {{interval}}',\n en: 'Delivers every {{frequency}} {{interval}}',\n es: 'Entrega cada {{frequency}} {{interval}}',\n fi: 'Toimitus {{frequency}} {{interval}} v\u00E4lein',\n fr: 'Livraison tous les {{frequency}} {{interval}}',\n ga: 'Seachadtar gach {{frequency}} {{interval}}',\n he: '\u05DE\u05E9\u05DC\u05D5\u05D7 \u05DB\u05DC {{frequency}} {{interval}}',\n hi: '\u0939\u0930 {{frequency}} {{interval}} \u092E\u0947\u0902 \u0921\u093F\u0932\u0940\u0935\u0930\u0940',\n id: 'Dikirim setiap {{frequency}} {{interval}}',\n it: 'Consegna ogni {{frequency}} {{interval}}',\n ja: '{{frequency}} {{interval}}\u3054\u3068\u306B\u304A\u5C4A\u3051',\n ko: '{{frequency}} {{interval}}\uB9C8\uB2E4 \uBC30\uC1A1',\n nl: 'Wordt elke {{frequency}} {{interval}} geleverd',\n no: 'Leveres hver {{frequency}} {{interval}}',\n pl: 'Dostawa co {{frequency}} {{interval}}',\n pt: 'Entrega a cada {{frequency}} {{interval}}',\n ru: '\u0414\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u043A\u0430\u0436\u0434\u044B\u0435 {{frequency}} {{interval}}',\n sv: 'Levereras var {{frequency}} {{interval}}',\n th: '\u0E08\u0E31\u0E14\u0E2A\u0E48\u0E07\u0E17\u0E38\u0E01 {{frequency}} {{interval}}',\n tr: 'Her {{frequency}} {{interval}} aral\u0131\u011F\u0131nda teslimat',\n uk: '\u0414\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u043A\u043E\u0436\u043D\u0456 {{frequency}} {{interval}}',\n vi: 'Giao h\u00E0ng m\u1ED7i {{frequency}} {{interval}}',\n zh: '\u6BCF {{frequency}} {{interval}} \u914D\u9001\u4E00\u6B21',\n },\n switchToOneTimePurchase: {\n ar: '\u0627\u0644\u062A\u0628\u062F\u064A\u0644 \u0625\u0644\u0649 \u0634\u0631\u0627\u0621 \u0644\u0645\u0631\u0629 \u0648\u0627\u062D\u062F\u0629',\n cs: 'P\u0159epnout na jednor\u00E1zov\u00FD n\u00E1kup',\n da: 'Skift til engangsk\u00F8b',\n de: 'Zu einmaligem Kauf wechseln',\n en: 'Switch to One-time Purchase',\n es: 'Cambiar a compra \u00FAnica',\n fi: 'Vaihda kertaluonteiseen ostoon',\n fr: 'Passer \u00E0 un achat unique',\n ga: 'Athraigh go ceannach aonuaire',\n he: '\u05E2\u05D1\u05D5\u05E8 \u05DC\u05E8\u05DB\u05D9\u05E9\u05D4 \u05D7\u05D3-\u05E4\u05E2\u05DE\u05D9\u05EA',\n hi: '\u090F\u0915 \u092C\u093E\u0930 \u0915\u0940 \u0916\u0930\u0940\u0926 \u092A\u0930 \u0938\u094D\u0935\u093F\u091A \u0915\u0930\u0947\u0902',\n id: 'Beralih ke pembelian satu kali',\n it: 'Passa all\u2019acquisto una tantum',\n ja: '1\u56DE\u9650\u308A\u306E\u8CFC\u5165\u306B\u5207\u308A\u66FF\u3048\u308B',\n ko: '\uC77C\uD68C\uC131 \uAD6C\uB9E4\uB85C \uC804\uD658',\n nl: 'Overschakelen naar eenmalige aankoop',\n no: 'Bytt til engangskj\u00F8p',\n pl: 'Prze\u0142\u0105cz na jednorazowy zakup',\n pt: 'Mudar para compra \u00FAnica',\n ru: '\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043D\u0430 \u0440\u0430\u0437\u043E\u0432\u0443\u044E \u043F\u043E\u043A\u0443\u043F\u043A\u0443',\n sv: 'Byt till eng\u00E5ngsk\u00F6p',\n th: '\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E40\u0E1B\u0E47\u0E19\u0E01\u0E32\u0E23\u0E0B\u0E37\u0E49\u0E2D\u0E04\u0E23\u0E31\u0E49\u0E07\u0E40\u0E14\u0E35\u0E22\u0E27',\n tr: 'Tek seferlik sat\u0131n almaya ge\u00E7',\n uk: '\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u043D\u0430 \u043E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u0443 \u043F\u043E\u043A\u0443\u043F\u043A\u0443',\n vi: 'Chuy\u1EC3n sang mua m\u1ED9t l\u1EA7n',\n zh: '\u5207\u6362\u4E3A\u4E00\u6B21\u6027\u8D2D\u4E70',\n },\n switchToSubscriptionNoDiscount: {\n ar: '\u0627\u0644\u062A\u0628\u062F\u064A\u0644 \u0625\u0644\u0649 \u0627\u0634\u062A\u0631\u0627\u0643',\n cs: 'P\u0159epnout na p\u0159edplatn\u00E9',\n da: 'Skift til abonnement',\n de: 'Zu einem Abonnement wechseln',\n en: 'Switch to Subscription',\n es: 'Cambiar a suscripci\u00F3n',\n fi: 'Vaihda tilaukseen',\n fr: 'Passer \u00E0 un abonnement',\n ga: 'Athraigh go s\u00EDnti\u00FAs',\n he: '\u05E2\u05D1\u05D5\u05E8 \u05DC\u05DE\u05E0\u05D5\u05D9',\n hi: '\u0938\u0926\u0938\u094D\u092F\u0924\u093E \u092A\u0930 \u0938\u094D\u0935\u093F\u091A \u0915\u0930\u0947\u0902',\n id: 'Beralih ke langganan',\n it: 'Passa all\u2019abbonamento',\n ja: '\u5B9A\u671F\u8CFC\u5165\u306B\u5207\u308A\u66FF\u3048\u308B',\n ko: '\uAD6C\uB3C5\uC73C\uB85C \uC804\uD658',\n nl: 'Overschakelen naar abonnement',\n no: 'Bytt til abonnement',\n pl: 'Prze\u0142\u0105cz na subskrypcj\u0119',\n pt: 'Mudar para assinatura',\n ru: '\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043D\u0430 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443',\n sv: 'Byt till prenumeration',\n th: '\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E40\u0E1B\u0E47\u0E19\u0E01\u0E32\u0E23\u0E2A\u0E21\u0E31\u0E04\u0E23\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01',\n tr: 'Aboneli\u011Fe ge\u00E7',\n uk: '\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u043D\u0430 \u043F\u0456\u0434\u043F\u0438\u0441\u043A\u0443',\n vi: 'Chuy\u1EC3n sang \u0111\u0103ng k\u00FD',\n zh: '\u5207\u6362\u4E3A\u8BA2\u9605',\n },\n switchToSubscriptionWithDiscount: {\n ar: '\u0627\u0644\u062A\u0628\u062F\u064A\u0644 \u0625\u0644\u0649 \u0627\u0634\u062A\u0631\u0627\u0643 \u0648\u062A\u0648\u0641\u064A\u0631 {{subscriptionDiscount}}%',\n cs: 'P\u0159epnout na p\u0159edplatn\u00E9 a u\u0161et\u0159it {{subscriptionDiscount}} %',\n da: 'Skift til abonnement og spar {{subscriptionDiscount}}%',\n de: 'Zu einem Abonnement wechseln und {{subscriptionDiscount}} % sparen',\n en: 'Switch to Subscription & Save {{subscriptionDiscount}}%',\n es: 'Cambiar a suscripci\u00F3n y ahorrar {{subscriptionDiscount}}%',\n fi: 'Vaihda tilaukseen ja s\u00E4\u00E4st\u00E4 {{subscriptionDiscount}} %',\n fr: 'Passer \u00E0 un abonnement et \u00E9conomiser {{subscriptionDiscount}} %',\n ga: 'Athraigh go s\u00EDnti\u00FAs agus s\u00E1bh\u00E1il {{subscriptionDiscount}}%',\n he: '\u05E2\u05D1\u05D5\u05E8 \u05DC\u05DE\u05E0\u05D5\u05D9 \u05D5\u05D7\u05E1\u05D5\u05DA {{subscriptionDiscount}}%',\n hi: '\u0938\u0926\u0938\u094D\u092F\u0924\u093E \u092A\u0930 \u0938\u094D\u0935\u093F\u091A \u0915\u0930\u0947\u0902 \u0914\u0930 {{subscriptionDiscount}}% \u092C\u091A\u093E\u090F\u0902',\n id: 'Beralih ke langganan dan hemat {{subscriptionDiscount}}%',\n it: 'Passa all\u2019abbonamento e risparmia {{subscriptionDiscount}}%',\n ja: '\u5B9A\u671F\u8CFC\u5165\u306B\u5207\u308A\u66FF\u3048\u3066{{subscriptionDiscount}}%\u304A\u5F97',\n ko: '\uAD6C\uB3C5\uC73C\uB85C \uC804\uD658\uD558\uACE0 {{subscriptionDiscount}}% \uC808\uC57D',\n nl: 'Overschakelen naar abonnement en {{subscriptionDiscount}}% besparen',\n no: 'Bytt til abonnement og spar {{subscriptionDiscount}}%',\n pl: 'Prze\u0142\u0105cz na subskrypcj\u0119 i oszcz\u0119d\u017A {{subscriptionDiscount}}%',\n pt: 'Mudar para assinatura e economizar {{subscriptionDiscount}}%',\n ru: '\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043D\u0430 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443 \u0438 \u0441\u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0442\u044C {{subscriptionDiscount}}%',\n sv: 'Byt till prenumeration och spara {{subscriptionDiscount}}%',\n th: '\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E40\u0E1B\u0E47\u0E19\u0E01\u0E32\u0E23\u0E2A\u0E21\u0E31\u0E04\u0E23\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01\u0E41\u0E25\u0E30\u0E1B\u0E23\u0E30\u0E2B\u0E22\u0E31\u0E14 {{subscriptionDiscount}}%',\n tr: 'Aboneli\u011Fe ge\u00E7 ve {{subscriptionDiscount}}% tasarruf et',\n uk: '\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u043D\u0430 \u043F\u0456\u0434\u043F\u0438\u0441\u043A\u0443 \u0442\u0430 \u0437\u0430\u043E\u0449\u0430\u0434\u0438\u0442\u0438 {{subscriptionDiscount}}%',\n vi: 'Chuy\u1EC3n sang \u0111\u0103ng k\u00FD v\u00E0 ti\u1EBFt ki\u1EC7m {{subscriptionDiscount}}%',\n zh: '\u5207\u6362\u4E3A\u8BA2\u9605\u5E76\u8282\u7701 {{subscriptionDiscount}}%',\n },\n} as const satisfies Record<string, Record<string, string>>;\n", "/**\n * Server-only foundations for the widget-conversion / section-composition orchestrators. This subpath\n * (`@rebuy/rebuy/server`) is never imported by the browser extension \u2014 it owns the logic a thin API\n * service (rebuy-api) delegates to, with the actual network egress injected as {@link UpstreamFetch}.\n */\n\n/** Production engine host; any other host is a staging/ephemeral upstream. */\nexport const REBUY_ENGINE_HOST = 'rebuyengine.com';\n\n/**\n * Calls the legacy Rebuy engine at `https://<host><path>` and returns parsed JSON. Injected by the\n * caller (rebuy-api owns the egress, timeouts, and the `X-Rebuy-Upstream` proxy header); MUST throw\n * {@link UpstreamError} on a non-2xx response so orchestrators can interpret the status.\n *\n * Defaults to GET with `params`/`search` as the query string. Pass `method: 'POST'` with `body` (JSON\n * body) and optional `headers` (e.g. an auth token) for write-style calls like analytics ingest.\n */\nexport type UpstreamFetch = (\n path: string,\n params: Record<string, string>,\n options?: {\n body?: unknown;\n headers?: Record<string, string>;\n host?: string;\n method?: 'GET' | 'POST';\n search?: string;\n }\n) => Promise<unknown>;\n\n/** Request-scoped dependencies every orchestrator needs. */\nexport type ServerContext = {\n fetchUpstream: UpstreamFetch;\n host: string;\n /** Browser user-agent forwarded to the ads engine (the checkout worker can't read it). Monetize only. */\n userAgent?: string;\n};\n\n/** Thrown by the injected {@link UpstreamFetch} when the engine returns a non-2xx response. */\nexport class UpstreamError extends Error {\n readonly body: unknown;\n readonly status: number;\n\n constructor(status: number, body: unknown, message?: string) {\n super(message ?? `Upstream returned ${status}`);\n this.body = body;\n this.name = 'UpstreamError';\n this.status = status;\n }\n}\n\n/** Thrown when the requested widget / shop / data source doesn't exist; the route maps it to 404. */\nexport class NotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'NotFoundError';\n }\n}\n\n/** A cart line in the live-cart context the engine evaluates against. */\nexport type CartLineInput = {\n productId: string;\n /** Line-item properties (raw key/value pairs); the engine receives them JSON-encoded. */\n properties?: { key: string; value?: string }[];\n quantity: number;\n subscriptionId?: string;\n variantId: string;\n};\n\n/** The live cart context shared by the data-source, gift-validation, and monetize inputs. */\nexport type CartInput = {\n /** Cart-level attributes (raw key/value pairs); the engine receives them JSON-encoded. */\n attributes?: { key: string; value?: string }[];\n /** Applied discount codes; the engine evaluates `discount_code` rules against them (sent as `[{code}]`). */\n discountCodes?: string[];\n /** Presentment cents of cart-level discount allocations, subtracted from `subtotal` for the engine. */\n discountTotal?: number;\n items: CartLineInput[];\n /** Presentment subtotal in cents. */\n subtotal: number;\n};\n\n/** Input for `convertWidgetSettings`. */\nexport type WidgetSettingsInput = {\n cacheKey?: number;\n id: number;\n key?: string;\n shop: string;\n /** Stable per-buyer id; when present, enables sticky server-side A/B variant selection. */\n visitorId?: string;\n};\n\n/** Input for `fetchUserConfig`. */\nexport type UserConfigInput = { shop: string };\n\n/** Input for `fetchDataSourceResults`. */\nexport type DataSourceInput = {\n cart: CartInput;\n customerId?: string;\n dataSourcePath: string;\n integrations?: Record<string, boolean>;\n limit: number;\n productType?: 'both' | 'one-time' | 'subscription';\n shop: string;\n visitorId?: string;\n};\n\n/** A gift line the gift-validation watcher asks the server to validate. */\nexport type GiftInput = {\n cost: number;\n discounted: boolean;\n lineId: string;\n productId: number;\n widgetId: number;\n};\n\n/** Input for `validateGifts`. */\nexport type GiftValidationInput = {\n cart: CartInput;\n customerId?: string;\n gifts: GiftInput[];\n shop: string;\n visitorId?: string;\n};\n\n/** Input for `fetchMonetizeOffers`. */\nexport type MonetizeInput = {\n cart: CartInput;\n country?: string;\n currency?: string;\n customerId?: string;\n placement: 'order_status' | 'thank_you_page';\n shop: string;\n visitorId?: string;\n};\n\n/** A generic analytics event from the extension; the server maps `name` \u2192 the engine's noun/verb/subject. */\nexport type AnalyticsEventInput = {\n name: string;\n properties?: Record<string, unknown>;\n sentAt?: string;\n};\n\n/** Input for `postAnalyticsEvents`: a batch of events plus the request-scoped identity fields. */\nexport type AnalyticsInput = {\n /** Rebuy cart token (the `r_cart_token` cart attribute), when available \u2014 primary aggregation key. */\n cartToken?: string;\n /** Shopify checkout token, when available \u2014 drives cart/checkout aggregation downstream. */\n checkoutToken?: string;\n events: AnalyticsEventInput[];\n shop: string;\n visitorId: string;\n /** The widget id (smartBlockId) the events belong to. */\n widgetId?: string;\n};\n", "const HTML_COMMENT_RE = /<!--[\\s\\S]*?-->/g;\nconst STRIPPED_ELEMENT_RE = /<(script|style|iframe|object|embed|noscript|template)\\b[^>]*>[\\s\\S]*?(?:<\\/\\1\\s*>|$)/gi;\nconst HTML_TAG_RE = /<\\/?[a-zA-Z][^>]*>/g;\n\nexport const stripContentBlockHtml = (text: string): string =>\n text.replace(HTML_COMMENT_RE, '').replace(STRIPPED_ELEMENT_RE, '').replace(HTML_TAG_RE, '');\n", "import { TiptapParagraph, type TiptapText } from '~/schema/widgets/checkout-and-beyond/text';\nimport { stripContentBlockHtml } from '~/transforms/contentBlockV1/stripContentBlockHtml';\n\ntype ConvertTextToTiptapArgs = {\n color: string;\n fontSize: string;\n marks?: NonNullable<TiptapText['marks']>;\n text: string;\n textAlign: 'start' | 'center' | 'end';\n};\n\nexport const convertTextToTiptapParagraph = ({\n color,\n fontSize,\n marks = [],\n text,\n textAlign,\n}: ConvertTextToTiptapArgs): TiptapParagraph => {\n const sanitizedText = stripContentBlockHtml(text);\n\n return TiptapParagraph.parse({\n attrs: { textAlign },\n content: sanitizedText\n ? [\n {\n marks: [{ attrs: { color, fontSize }, type: 'textStyle' }, ...marks],\n text: sanitizedText,\n type: 'text',\n },\n ]\n : [],\n type: 'paragraph',\n });\n};\n", "/**\n * Minimal v1 content-block input types. The legacy `/widgets/settings` endpoint\n * returns the widget's settings object directly (no envelope), so the converter\n * input is just `{ id, settings }` \u2014 `name` / `owner` aren't in the upstream\n * response and would be set to schema defaults in the produced `CABRootSection`.\n */\n\nexport const SHOPIFY_CHECKOUT_EXTENSION_CONTENT_BLOCK = 'ui_extension_content_block' as const;\n\n/** Pixel threshold above which an aside-placed image is forced to top placement. */\nexport const CONTENT_BLOCK_MAX_IMAGE_WIDTH = 560;\n\nexport type V1ImagePlacement = 'top' | 'right' | 'bottom' | 'left';\n\nexport type V1ImageBlock = {\n altText?: string | null;\n category?: string;\n description?: string | null;\n filename?: string;\n id: string;\n imagePlacement: V1ImagePlacement;\n imageSize: number;\n imageUrl: string;\n index?: number;\n textAlignment?: 'left' | 'center' | 'right';\n textSize?: string;\n};\n\nexport type V1Language = {\n description?: string;\n superTitle?: string;\n title?: string;\n};\n\nexport type V1Settings = {\n blockSpacing?: string;\n imageBlocks?: V1ImageBlock[];\n imageLayout?: 'row' | 'column';\n language?: V1Language;\n location?: 'checkout' | 'order-status' | 'thank-you';\n previewMode?: boolean;\n type: typeof SHOPIFY_CHECKOUT_EXTENSION_CONTENT_BLOCK;\n version: 1;\n};\n\nexport type V1ConvertInput = {\n id: number;\n settings: V1Settings;\n};\n\nexport const isContentBlockV1 = (data: unknown): data is V1Settings => {\n if (!data || typeof data !== 'object') return false;\n\n const obj = data as Record<string, unknown>;\n\n return obj.version === 1 && obj.type === SHOPIFY_CHECKOUT_EXTENSION_CONTENT_BLOCK;\n};\n", "import { CABImageSection } from '~/schema/widgets/checkout-and-beyond/image';\nimport { CABLayoutSection } from '~/schema/widgets/checkout-and-beyond/layout';\nimport { CABTextSection } from '~/schema/widgets/checkout-and-beyond/text';\nimport { convertTextToTiptapParagraph } from '~/transforms/contentBlockV1/convertTextToTiptapParagraph';\nimport { stripContentBlockHtml } from '~/transforms/contentBlockV1/stripContentBlockHtml';\nimport {\n CONTENT_BLOCK_MAX_IMAGE_WIDTH,\n type V1ImageBlock,\n type V1ImagePlacement,\n} from '~/transforms/contentBlockV1/types';\n\nconst V1_TO_CAB_ALIGN = { center: 'center', left: 'start', right: 'end' } as const;\n\n/**\n * When an aside-placed image hits the max width, the legacy renderer forces\n * placement to `top` so the description doesn't get squeezed into a zero-width\n * column. Replicate here so the v2 layout matches what the legacy React widget\n * actually displayed.\n */\nconst resolveEffectivePlacement = (placement: V1ImagePlacement, imageSize: number): V1ImagePlacement => {\n const isAside = placement === 'left' || placement === 'right';\n\n return imageSize >= CONTENT_BLOCK_MAX_IMAGE_WIDTH && isAside ? 'top' : placement;\n};\n\n/**\n * The divisor is the same constant the legacy renderer clamps at (560), so an\n * `imageSize = 560` block renders at 100% \u2014 matching the legacy behavior\n * where 560 was the full layout width.\n */\nconst widthPercentForImageSize = (imageSize: number): number =>\n Math.min(Math.round((imageSize / CONTENT_BLOCK_MAX_IMAGE_WIDTH) * 100), 100);\n\nexport const convertContentBlockImageToV2 = (block: V1ImageBlock): CABImageSection | CABLayoutSection => {\n const { altText, category, description, id, imagePlacement, imageSize, imageUrl, textAlignment, textSize } = block;\n const placement = resolveEffectivePlacement(imagePlacement, imageSize);\n\n const imageSection = CABImageSection.parse({\n altText: stripContentBlockHtml(altText ?? ''),\n category,\n sectionId: id,\n sectionType: 'image',\n source: imageUrl,\n width: widthPercentForImageSize(imageSize),\n });\n\n if (!description) return imageSection;\n\n const textSection = CABTextSection.parse({\n content: {\n en: {\n attrs: { blockSpacing: 'base' },\n content: [\n convertTextToTiptapParagraph({\n color: 'base',\n fontSize: textSize ?? 'base',\n text: description,\n textAlign: textAlignment ? V1_TO_CAB_ALIGN[textAlignment] : 'start',\n }),\n ],\n type: 'doc',\n },\n },\n sectionType: 'text',\n });\n\n return CABLayoutSection.parse({\n alignment: { horizontal: 'center', vertical: 'middle' },\n direction: placement === 'left' || placement === 'right' ? 'columns' : 'rows',\n sections:\n placement === 'left' || placement === 'top' ? [imageSection, textSection] : [textSection, imageSection],\n sectionType: 'layout',\n spacing: 'tight',\n });\n};\n", "import { TiptapDocument } from '~/schema/widgets/checkout-and-beyond/text';\nimport { convertTextToTiptapParagraph } from '~/transforms/contentBlockV1/convertTextToTiptapParagraph';\nimport { type V1Language } from '~/transforms/contentBlockV1/types';\n\nexport const convertContentBlockTextToV2 = (language: V1Language | undefined): TiptapDocument => {\n const description = language?.description;\n const superTitle = language?.superTitle;\n const title = language?.title;\n\n return TiptapDocument.parse({\n attrs: { blockSpacing: 'tight' },\n content: [\n superTitle\n ? convertTextToTiptapParagraph({\n color: 'base',\n fontSize: 'extraLarge',\n marks: [{ type: 'bold' }],\n text: superTitle,\n textAlign: 'center',\n })\n : null,\n title\n ? convertTextToTiptapParagraph({\n color: 'base',\n fontSize: 'medium',\n marks: [{ type: 'bold' }],\n text: title,\n textAlign: 'center',\n })\n : null,\n description\n ? convertTextToTiptapParagraph({\n color: 'base',\n fontSize: 'base',\n text: description,\n textAlign: 'center',\n })\n : null,\n ].filter((p): p is NonNullable<typeof p> => p !== null),\n type: 'doc',\n });\n};\n", "import { CABRootSection } from '~/schema/widgets/checkout-and-beyond/root';\nimport { convertContentBlockImageToV2 } from '~/transforms/contentBlockV1/convertContentBlockImageToV2';\nimport { convertContentBlockTextToV2 } from '~/transforms/contentBlockV1/convertContentBlockTextToV2';\nimport {\n SHOPIFY_CHECKOUT_EXTENSION_CONTENT_BLOCK,\n type V1ConvertInput,\n type V1Language,\n} from '~/transforms/contentBlockV1/types';\n\nconst LOCATION_TO_EDITOR_MODE = {\n checkout: 'checkoutExtension',\n 'order-status': 'orderStatusPage',\n 'thank-you': 'thankYouPage',\n} as const;\n\nconst hasText = (language: V1Language | undefined): boolean =>\n !!language && !!(language.description || language.superTitle || language.title);\n\n/** Translates a v1 content-block widget into a fully-formed `CABRootSection`. */\nexport const convertContentBlockToV2 = ({ id, settings }: V1ConvertInput): CABRootSection => {\n const imageBlocks = settings.imageBlocks ?? [];\n\n return CABRootSection.parse({\n alignment: { horizontal: 'center', vertical: 'top' },\n direction: 'rows',\n editorMode: LOCATION_TO_EDITOR_MODE[settings.location ?? 'checkout'],\n previewMode: settings.previewMode,\n sections: [\n hasText(settings.language)\n ? {\n content: { en: convertContentBlockTextToV2(settings.language) },\n sectionType: 'text',\n }\n : null,\n imageBlocks.length > 0\n ? {\n // Legacy centers every image block (`InlineLayout inlineAlignment=\"center\"`).\n alignment: { horizontal: 'center', vertical: 'middle' },\n // Legacy: `image_layout === 'row' ? BlockStack : InlineStack` \u2014 an UNSET layout is\n // horizontal (columns), so only an explicit 'row' may stack vertically.\n direction: settings.imageLayout === 'row' ? 'rows' : 'columns',\n sections: imageBlocks.map(convertContentBlockImageToV2),\n sectionType: 'layout',\n spacing: settings.blockSpacing ?? 'extraTight',\n }\n : null,\n ].filter((section): section is NonNullable<typeof section> => section !== null),\n sectionType: 'layout',\n type: SHOPIFY_CHECKOUT_EXTENSION_CONTENT_BLOCK,\n version: 2,\n widgetId: id,\n });\n};\n", "const ARRAY_INDEX_STRING = /^(?:0|[1-9]\\d*)$/;\n\nconst isPlainObject = (input: unknown): input is Record<string, unknown> => {\n if (input === null || typeof input !== 'object') return false;\n\n const proto = Object.getPrototypeOf(input) as object | null;\n\n return proto === Object.prototype || proto === null;\n};\n\nconst hasOnlyNumericKeys = (input: Record<string, unknown>): boolean => {\n const keys = Object.keys(input);\n\n if (keys.length === 0) return false;\n\n if (!keys.every((key) => ARRAY_INDEX_STRING.test(key) && Number.isSafeInteger(Number(key)))) return false;\n\n // Require the indices to form a complete `0..n-1` sequence \u2014 `{ \"10\": \"a\", \"20\": \"b\" }`\n // would otherwise silently collapse into `[\"a\", \"b\"]` and lose its original positions.\n const sorted = keys.map(Number).sort((a, b) => a - b);\n\n return sorted.every((n, i) => n === i);\n};\n\nconst numericObjectToArray = (input: Record<string, unknown>): unknown[] =>\n Object.entries(input)\n .sort(([a], [b]) => Number(a) - Number(b))\n .map(([, value]) => value);\n\n/**\n * Recursively converts objects whose keys are a complete `0..n-1` sequence\n * (PHP-serialized \"sparse\" arrays) into real arrays. Everything else passes\n * through unchanged.\n */\nexport const convertNumericObjects = (input: unknown): unknown => {\n if (Array.isArray(input)) return input.map(convertNumericObjects);\n\n if (isPlainObject(input)) {\n if (hasOnlyNumericKeys(input)) return numericObjectToArray(input).map(convertNumericObjects);\n\n const out: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(input)) out[key] = convertNumericObjects(value);\n\n return out;\n }\n\n return input;\n};\n", "const isPlainObject = (input: unknown): input is Record<string, unknown> => {\n if (input === null || typeof input !== 'object') return false;\n\n const proto = Object.getPrototypeOf(input) as object | null;\n\n return proto === Object.prototype || proto === null;\n};\n\nconst camelCase = (key: string): string =>\n key.replace(/[-_\\s]+(.)?/g, (_, char: string | undefined) => (char ? char.toUpperCase() : ''));\n\nexport type ToCamelCase<S extends string> = S extends `${infer Head}_${infer Tail}` | `${infer Head}-${infer Tail}`\n ? `${Head}${Capitalize<ToCamelCase<Tail>>}`\n : S;\n\nexport type DeepCamelCase<T> = T extends (infer U)[]\n ? DeepCamelCase<U>[]\n : T extends object\n ? { [K in keyof T as ToCamelCase<K & string>]: DeepCamelCase<T[K]> }\n : T;\n\n/**\n * Recursively converts object keys to camelCase. Snake_case and kebab-case\n * are both handled; numeric array indices and primitives pass through\n * unchanged.\n *\n * Language keys used by the CAB schema (`text.content[<lang>]`, etc.) are\n * authored as plain lowercase tags (`en`, `de`, `fr`) by us \u2014 they have no\n * `_` or `-` to convert and survive camelCase as-is.\n */\nexport const deepCamelCase = <T>(input: T): DeepCamelCase<T> => {\n if (Array.isArray(input)) return input.map((item) => deepCamelCase(item)) as DeepCamelCase<T>;\n\n if (isPlainObject(input)) {\n const out: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(input)) {\n out[camelCase(key)] = deepCamelCase(value);\n }\n\n return out as DeepCamelCase<T>;\n }\n\n return input as DeepCamelCase<T>;\n};\n", "import { type TextColorName, type TextSizeName } from '~/schema/widgets/checkout-and-beyond/common';\nimport { type Mark } from '~/transforms/htmlToTiptap/types';\n\nexport const buildDefaultTextStyleMark = (\n style: { color?: TextColorName; fontSize?: TextSizeName } | undefined\n): Mark | null => {\n if (!style || (style.color === undefined && style.fontSize === undefined)) return null;\n\n return {\n attrs: {\n color: style.color ?? 'base',\n fontSize: style.fontSize ?? 'base',\n },\n type: 'textStyle',\n };\n};\n", "import { type StackEntry } from '~/transforms/htmlToTiptap/types';\n\nexport const closeTag = (stack: StackEntry[], name: string): void => {\n for (let index = stack.length - 1; index >= 0; index--) {\n if (stack[index].tag === name) {\n stack.length = index;\n break;\n }\n }\n};\n", "export const TAG_RE = /<(\\/)?([a-zA-Z][a-zA-Z0-9]*)((?:\\s+[^>]*?)?)\\s*(\\/)?>/g;\n\n/**\n * Tags that introduce a paragraph break on both open and close. Container tags\n * like `ul`/`ol`/`dl` are intentionally NOT here \u2014 their child `li`/`dt`/`dd`\n * elements already break, and including the containers would double-flush.\n */\nexport const BLOCK_TAGS = new Set([\n 'article',\n 'aside',\n 'blockquote',\n 'dd',\n 'div',\n 'dt',\n 'figcaption',\n 'figure',\n 'footer',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hr',\n 'li',\n 'main',\n 'nav',\n 'p',\n 'pre',\n 'section',\n]);\n", "import { TiptapParagraph, type TiptapText } from '~/schema/widgets/checkout-and-beyond/text';\n\nexport const makeParagraph = (content: TiptapText[]): TiptapParagraph => TiptapParagraph.parse({ content });\n", "import { makeParagraph } from '~/transforms/htmlToTiptap/makeParagraph';\nimport { type State } from '~/transforms/htmlToTiptap/types';\n\nexport const flushParagraph = (state: State): void => {\n state.paragraphs.push(makeParagraph(state.currentRuns));\n state.currentRuns = [];\n};\n", "import { type StackEntry } from '~/transforms/htmlToTiptap/types';\n\nexport const isSkipping = (stack: StackEntry[] = []): boolean => stack.some(({ skip }) => skip);\n", "import { type Spacing } from '~/schema/widgets/checkout-and-beyond/common';\nimport { TiptapDocument, type TiptapParagraph } from '~/schema/widgets/checkout-and-beyond/text';\n\nexport const makeDoc = (content: TiptapParagraph[], blockSpacing: Spacing): TiptapDocument =>\n TiptapDocument.parse({ attrs: { blockSpacing }, content });\n", "const DYNAMIC_TOKEN_REGEX = /^\\{\\{\\s*[A-Za-z]+\\s*\\}\\}$/;\n\n/**\n * Protocols we'll preserve on `<a href>` when converting HTML to Tiptap. Any URL\n * whose `URL.protocol` falls outside this set (e.g. `javascript:`, `data:`,\n * `file:`, `vbscript:`) is dropped from the link mark \u2014 the text content is\n * kept but the click target is not. Renderers downstream still get to do their\n * own validation, but the package shouldn't be the one preserving an XSS\n * payload through the conversion.\n */\nconst ALLOWED_PROTOCOLS = new Set(['http:', 'https:', 'mailto:', 'tel:']);\n\n/**\n * Decides whether an `<a href>` value should survive HTML \u2192 Tiptap conversion\n * as a link mark. Allows `#`, dynamic `{{token}}` placeholders, and a fixed\n * allowlist of URL schemes; everything else (including `javascript:`, `data:`,\n * relative paths, and malformed URLs) drops the link mark while keeping the\n * surrounding text.\n *\n * @param href - Raw `href` attribute from the source HTML.\n *\n * @returns `true` if the URL should be preserved as a link mark.\n */\nexport const isValidHref = (href: string): boolean => {\n if (!href) return false;\n\n if (href === '#') return true;\n\n if (DYNAMIC_TOKEN_REGEX.test(href)) return true;\n\n try {\n const url = new URL(href);\n\n return ALLOWED_PROTOCOLS.has(url.protocol);\n } catch {\n return false;\n }\n};\n", "import { isValidHref } from '~/transforms/htmlToTiptap/isValidHref';\nimport { type Mark } from '~/transforms/htmlToTiptap/types';\n\n/**\n * The schema defaults for an `<a>` mark when the source HTML omits them. Match\n * `TiptapText` in `~/schema/widgets/checkout-and-beyond/text` so the sanitizer\n * resolves the same effective values the downstream parse would have used.\n */\nconst DEFAULT_TARGET = '_blank';\nconst DEFAULT_REL = 'noopener noreferrer nofollow';\n\n/**\n * Forces `noopener noreferrer` on every `_blank` link to defend against\n * reverse-tabnabbing (window.opener attacks). When the source omits `rel`\n * entirely, fall back to the schema default (`noopener noreferrer nofollow`).\n * When source `rel` is non-empty, preserve the existing tokens, drop `opener`,\n * and ensure the safe pair is present.\n *\n * Non-`_blank` targets pass through unchanged \u2014 they can't be tabnabbed.\n */\nconst ensureSafeRel = (rel: string, target: string): string => {\n if (target !== '_blank') return rel;\n\n const sourceTokens = (rel ?? '').split(/\\s+/).filter(Boolean);\n\n if (sourceTokens.length === 0) return DEFAULT_REL;\n\n const tokens = new Set(sourceTokens.filter((token) => token.toLowerCase() !== 'opener'));\n\n tokens.add('noopener');\n tokens.add('noreferrer');\n\n return Array.from(tokens).join(' ');\n};\n\nexport const buildLinkMark = (attrs: Record<string, string> = {}): Mark | null => {\n const { href } = attrs;\n\n if (!href || !isValidHref(href)) return null;\n\n // Resolve target BEFORE sanitizing rel so the safety guard sees the same\n // value the downstream schema parse will use.\n const target = attrs.target ?? DEFAULT_TARGET;\n\n return {\n attrs: {\n class: null,\n href,\n rel: ensureSafeRel(attrs.rel, target),\n target,\n },\n type: 'link',\n };\n};\n", "const NAMED_ENTITIES: Record<string, string> = {\n amp: '&',\n apos: \"'\",\n copy: '\u00A9',\n gt: '>',\n hellip: '\u2026',\n ldquo: '\u201C',\n lsquo: '\u2018',\n lt: '<',\n mdash: '\u2014',\n nbsp: ' ',\n ndash: '\u2013',\n quot: '\"',\n rdquo: '\u201D',\n reg: '\u00AE',\n rsquo: '\u2019',\n trade: '\u2122',\n} as const;\n\nexport const decodeEntities = (input: string = ''): string =>\n input.replace(/&(#x[\\da-f]+|#\\d+|[a-z][a-z\\d]*);/gi, (match, code: string) => {\n if (code[0] !== '#') return NAMED_ENTITIES[code.toLowerCase()] ?? match;\n\n const isHex = /^#x/i.test(code);\n const cp = parseInt(code.slice(isHex ? 2 : 1), isHex ? 16 : 10);\n\n return Number.isInteger(cp) && cp >= 0 && cp <= 0x10ffff ? String.fromCodePoint(cp) : match;\n });\n", "import { decodeEntities } from '~/transforms/htmlToTiptap/decodeEntities';\n\nconst ATTRIB_RE = /([a-zA-Z_:][\\w:.-]*)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'`=<>]+)))?/g;\n\nexport const parseAttribs = (attrString: string): Record<string, string> => {\n const result: Record<string, string> = {};\n let match: RegExpExecArray | null;\n\n ATTRIB_RE.lastIndex = 0;\n\n while ((match = ATTRIB_RE.exec(attrString)) !== null) {\n result[match[1].toLowerCase()] = decodeEntities(match[2] ?? match[3] ?? match[4] ?? '');\n }\n\n return result;\n};\n", "import { type TextSizeName } from '~/schema/widgets/checkout-and-beyond/common';\nimport { buildLinkMark } from '~/transforms/htmlToTiptap/buildLinkMark';\nimport { parseAttribs } from '~/transforms/htmlToTiptap/parseAttribs';\nimport { type Mark, type StackEntry } from '~/transforms/htmlToTiptap/types';\n\nconst INLINE_MARK_TAGS: Record<string, 'bold' | 'italic' | 'strike'> = {\n b: 'bold',\n del: 'strike',\n em: 'italic',\n i: 'italic',\n s: 'strike',\n strike: 'strike',\n strong: 'bold',\n};\n\nconst HEADING_FONT_SIZE: Record<string, TextSizeName> = {\n h1: 'extraLarge',\n h2: 'large',\n h3: 'medium',\n h4: 'base',\n h5: 'small',\n h6: 'small',\n};\n\nconst STRIPPED_TAGS = ['embed', 'iframe', 'noscript', 'object', 'script', 'style', 'template'];\n\nconst marksForTag = (name: string, attrs: string): Mark[] => {\n if (INLINE_MARK_TAGS[name]) return [{ type: INLINE_MARK_TAGS[name] }];\n\n if (HEADING_FONT_SIZE[name]) {\n return [{ type: 'bold' }, { attrs: { color: 'base', fontSize: HEADING_FONT_SIZE[name] }, type: 'textStyle' }];\n }\n\n if (name === 'a') {\n const link = buildLinkMark(parseAttribs(attrs));\n\n return link ? [link] : [];\n }\n\n return [];\n};\n\nexport const openTag = (stack: StackEntry[], name: string, attrs: string): void => {\n stack.push({\n marks: marksForTag(name, attrs),\n skip: STRIPPED_TAGS.includes(name),\n tag: name,\n });\n};\n", "import { TiptapText } from '~/schema/widgets/checkout-and-beyond/text';\n\nimport { decodeEntities } from '~/transforms/htmlToTiptap/decodeEntities';\nimport { flushParagraph } from '~/transforms/htmlToTiptap/flushParagraph';\nimport { isSkipping } from '~/transforms/htmlToTiptap/isSkipping';\nimport { type Mark, type State } from '~/transforms/htmlToTiptap/types';\n\nexport const pushText = (state: State, rawText: string): void => {\n if (!rawText || isSkipping(state.stack)) return;\n\n decodeEntities(rawText)\n .split('\\n')\n .forEach((segment, index) => {\n if (index > 0) flushParagraph(state);\n\n if (!segment) return;\n\n const marks: Mark[] = state.stack.flatMap((entry) => entry.marks);\n\n if (state.defaultTextStyleMark && !marks.some((mark) => mark.type === 'textStyle')) {\n marks.push(state.defaultTextStyleMark);\n }\n\n state.currentRuns.push(TiptapText.parse(marks.length > 0 ? { marks, text: segment } : { text: segment }));\n });\n};\n", "const HTML_COMMENT_RE = /<!--[\\s\\S]*?-->/g;\n\nexport const stripHtmlComments = (html: string = ''): string => html.replace(HTML_COMMENT_RE, '');\n", "import { type Spacing, type TextColorName, type TextSizeName } from '~/schema/widgets/checkout-and-beyond/common';\nimport { type TiptapDocument } from '~/schema/widgets/checkout-and-beyond/text';\nimport { buildDefaultTextStyleMark } from '~/transforms/htmlToTiptap/buildDefaultTextStyleMark';\nimport { closeTag } from '~/transforms/htmlToTiptap/closeTag';\nimport { BLOCK_TAGS, TAG_RE } from '~/transforms/htmlToTiptap/constants';\nimport { flushParagraph } from '~/transforms/htmlToTiptap/flushParagraph';\nimport { isSkipping } from '~/transforms/htmlToTiptap/isSkipping';\nimport { makeDoc } from '~/transforms/htmlToTiptap/makeDoc';\nimport { makeParagraph } from '~/transforms/htmlToTiptap/makeParagraph';\nimport { openTag } from '~/transforms/htmlToTiptap/openTag';\nimport { pushText } from '~/transforms/htmlToTiptap/pushText';\nimport { stripHtmlComments } from '~/transforms/htmlToTiptap/stripHtmlComments';\nimport { type State } from '~/transforms/htmlToTiptap/types';\n\nexport type HtmlToTiptapOptions = {\n blockSpacing?: Spacing;\n defaultTextStyle?: { color?: TextColorName; fontSize?: TextSizeName };\n};\n\nconst maybeFlushParagraph = (state: State): void => {\n if (state.currentRuns.length > 0) flushParagraph(state);\n};\n\nexport const htmlToTiptap = (html: string, options: HtmlToTiptapOptions = {}): TiptapDocument => {\n const state: State = {\n currentRuns: [],\n defaultTextStyleMark: buildDefaultTextStyleMark(options.defaultTextStyle),\n listStack: [],\n paragraphs: [],\n stack: [],\n };\n const blockSpacing = options.blockSpacing ?? 'base';\n\n if (typeof html !== 'string' || !html) return makeDoc([makeParagraph([])], blockSpacing);\n\n const htmlWithoutComments = stripHtmlComments(html);\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n TAG_RE.lastIndex = 0;\n\n while ((match = TAG_RE.exec(htmlWithoutComments)) !== null) {\n const [full, slash, rawName, attrs, selfClose] = match;\n\n if (match.index > lastIndex) pushText(state, htmlWithoutComments.slice(lastIndex, match.index));\n\n lastIndex = match.index + full.length;\n\n const name = rawName.toLowerCase();\n\n if (slash) {\n closeTag(state.stack, name);\n\n if (name === 'ul' || name === 'ol') state.listStack.pop();\n\n if (BLOCK_TAGS.has(name) && !isSkipping(state.stack)) maybeFlushParagraph(state);\n } else if (name === 'br') {\n if (!isSkipping(state.stack)) flushParagraph(state);\n } else if (name === 'hr') {\n if (!isSkipping(state.stack)) {\n maybeFlushParagraph(state);\n pushText(state, '\u2014\u2014\u2014');\n flushParagraph(state);\n }\n } else if (!selfClose) {\n if (BLOCK_TAGS.has(name) && !isSkipping(state.stack)) maybeFlushParagraph(state);\n\n if (name === 'ul' || name === 'ol') state.listStack.push({ counter: 0, ordered: name === 'ol' });\n\n openTag(state.stack, name, attrs);\n\n if (name === 'li' && state.listStack.length > 0) {\n const top = state.listStack[state.listStack.length - 1]!;\n\n if (top.ordered) top.counter += 1;\n\n pushText(state, top.ordered ? `${top.counter}. ` : '\u2022 ');\n }\n }\n }\n\n if (lastIndex < htmlWithoutComments.length) pushText(state, htmlWithoutComments.slice(lastIndex));\n\n maybeFlushParagraph(state);\n\n if (state.paragraphs.length === 0) flushParagraph(state);\n\n return makeDoc(state.paragraphs, blockSpacing);\n};\n", "/**\n * True when the input has `version === 2` \u2014 the marker for a current-generation\n * Checkout-and-Beyond root section. The transformer for CAB (`CABRootSection.parse`)\n * should ONLY run on values that pass this check; v1 widget shapes either get\n * converted (e.g. via `convertContentBlockToV2`) or pass through unchanged.\n *\n * @param input - The post-camelCase, post-numeric-fix upstream payload.\n *\n * @returns `true` if `input.version === 2`, otherwise `false`.\n */\nexport const isCABRootSection = (input: unknown): boolean => {\n if (!input || typeof input !== 'object') return false;\n\n return (input as { version?: unknown }).version === 2;\n};\n", "import { WidgetType } from '~/schema/widgets/checkout-and-beyond/constants';\nimport { CABRootSection } from '~/schema/widgets/checkout-and-beyond/root';\nimport { SWITCH_LABELS } from '~/schema/widgets/checkout-and-beyond/switchLabels';\nimport { type LineItemEditorSwitchLanguageV1 } from '~/schema/widgets/lineItemEditor';\nimport { type V1LineItemEditorConvertInput } from '~/transforms/lineItemEditorV1/types';\n\n/** The v1 `switchToSubscription.language` key that overrides each `buttonField`'s English label. */\nconst OVERRIDE_KEY = {\n subscriptionOption: 'subscriptionOptionLabel',\n switchToOneTimePurchase: 'downgradeToOneTimeLabel',\n switchToSubscriptionNoDiscount: 'upgradeToSubscriptionWithoutDiscountLabel',\n switchToSubscriptionWithDiscount: 'upgradeToSubscriptionLabel',\n} as const satisfies Record<keyof typeof SWITCH_LABELS, keyof LineItemEditorSwitchLanguageV1>;\n\n/**\n * Translate a v1 line-item-editor widget into a `CABRootSection`: a `cartLine` section holding a\n * switch-to-subscription button, whose `buttonField`-tagged text labels use the shared localized\n * `SWITCH_LABELS` defaults with the v1 `switchToSubscription.language` value overriding `en` (same output the\n * admin editor produces, so runtime-converted and admin-migrated widgets render identically). The button is\n * omitted when the widget's switch is disabled.\n */\nconst BUTTON_KINDS = ['plain', 'primary', 'secondary'] as const;\n\nexport const convertLineItemEditorToV2 = ({ id, settings }: V1LineItemEditorConvertInput): CABRootSection => {\n const { switchToSubscription, switchToSubscriptionEnabled, tracking } = settings;\n const kind = settings.button?.kind;\n const buttonStyle = BUTTON_KINDS.includes(kind as (typeof BUTTON_KINDS)[number]) ? kind : 'plain';\n\n const labelSections = (Object.keys(SWITCH_LABELS) as (keyof typeof SWITCH_LABELS)[]).map((buttonField) => {\n // A defined v1 value ALWAYS passes through verbatim \u2014 even legacy's \"Upgrade/Downgrade\" defaults\n // saved into settings (product owner, 2026-07-02: existing widget language is never rewritten; the\n // neutral \"Switch to\u2026\" copy applies only as the default for blank values and new widgets). Blank /\n // whitespace falls back to the shared defaults (legacy `getLabelWithFallback` parity).\n const override = switchToSubscription?.language?.[OVERRIDE_KEY[buttonField]]?.trim();\n\n return {\n buttonField,\n content: override ? { ...SWITCH_LABELS[buttonField], en: override } : SWITCH_LABELS[buttonField],\n sectionType: 'text',\n };\n });\n\n return CABRootSection.parse({\n previewMode: settings.previewMode,\n sections: [\n {\n sections: switchToSubscriptionEnabled\n ? [\n {\n action: 'switchToSubscription',\n buttonStyle,\n disableDowngrade: switchToSubscription?.disableDowngrade ?? false,\n sections: labelSections,\n sectionType: 'button',\n },\n ]\n : [],\n sectionType: 'cartLine',\n },\n ],\n sectionType: 'layout',\n tracking: {\n enableAttribution: tracking?.enableAttribution ?? true,\n enableSource: tracking?.enableSource ?? true,\n enableWidget: tracking?.enableWidget ?? true,\n },\n type: WidgetType.ui_extension_line_item_editor,\n version: 2,\n widgetId: id,\n });\n};\n", "import { WidgetType } from '~/schema/widgets/checkout-and-beyond/constants';\nimport { type LineItemEditorV1 } from '~/schema/widgets/lineItemEditor';\n\n/**\n * The legacy `/widgets/settings` endpoint returns the widget's settings object directly (no envelope), so\n * the converter input is just `{ id, settings }` \u2014 the settings shape lives in the schema\n * (`LineItemEditorV1`) and is derived here, never re-declared.\n */\nexport type V1LineItemEditorConvertInput = {\n id: number;\n settings: LineItemEditorV1;\n};\n\n/** Identifies a v1 line-item-editor payload by version + type (mirrors `isContentBlockV1`). */\nexport const isLineItemEditorV1 = (data: unknown): data is LineItemEditorV1 => {\n if (!data || typeof data !== 'object') return false;\n\n const obj = data as Record<string, unknown>;\n\n return obj.version === 1 && obj.type === WidgetType.ui_extension_line_item_editor;\n};\n", "const DEFAULT_KNOWN_TOKENS = ['firstName', 'lastName', 'email'] as const;\n\nconst escapeForRegex = (literal: string): string => literal.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n/**\n * Rewrites legacy personalization tokens into the CAB-canonical `{{tokenName}}`\n * form expected by the client's `replaceVariables`. Specifically:\n *\n * - `{firstName}` (single brace) \u2192 `{{firstName}}`\n * - `{FirstName}` / `{FIRSTNAME}` (case variants) \u2192 `{{firstName}}`\n * - `{ firstName }` (internal whitespace) \u2192 `{{firstName}}`\n * - `{{firstName}}` (already canonical) \u2192 unchanged\n *\n * Pass `knownTokens` to control which names are normalized; anything not in the\n * list (e.g., an unrelated `{{foo}}` token) passes through untouched.\n */\nexport const normalizeTokens = (text: string, knownTokens: readonly string[] = DEFAULT_KNOWN_TOKENS): string => {\n if (typeof text !== 'string') return text;\n\n return knownTokens.reduce((acc, token) => {\n const pattern = new RegExp(`\\\\{{1,2}\\\\s*${escapeForRegex(token)}\\\\s*\\\\}{1,2}`, 'gi');\n\n return acc.replace(pattern, `{{${token}}}`);\n }, text);\n};\n", "import { htmlToTiptap } from '~/transforms/htmlToTiptap/htmlToTiptap';\nimport { normalizeTokens } from '~/transforms/normalizeTokens';\n\nconst HTML_TAG_RE = /<[a-zA-Z]/;\n\nconst containsHtml = (text: string): boolean => HTML_TAG_RE.test(text);\n\nconst isObject = (x: unknown): x is Record<string, unknown> => x !== null && typeof x === 'object' && !Array.isArray(x);\n\nconst normalizeLangValue = (value: unknown): unknown => {\n if (typeof value !== 'string') return value;\n\n const tokenized = normalizeTokens(value);\n\n return containsHtml(tokenized) ? htmlToTiptap(tokenized) : tokenized;\n};\n\n/**\n * Walks an untyped CABRootSection-shaped object (post deepCamelCase, pre schema\n * parse) and rewrites `text` sections' `content[lang]` strings so that:\n *\n * - `{firstName}` (single brace) becomes `{{firstName}}` (canonical), and\n * - HTML-laden strings become a fully-formed `TiptapDocument`.\n *\n * Plain strings pass through unchanged. Non-text sections only recurse into\n * their `sections` array; Tiptap docs and other nested objects are not walked.\n */\nexport const normalizeTextContent = (node: unknown): unknown => {\n if (Array.isArray(node)) return node.map(normalizeTextContent);\n\n if (!isObject(node)) return node;\n\n if (node.sectionType === 'text' && isObject(node.content)) {\n const nextContent: Record<string, unknown> = {};\n\n for (const [lang, value] of Object.entries(node.content)) {\n nextContent[lang] = normalizeLangValue(value);\n }\n\n return { ...node, content: nextContent };\n }\n\n if (Array.isArray(node.sections)) {\n return { ...node, sections: node.sections.map(normalizeTextContent) };\n }\n\n return node;\n};\n", "import { CABRootSection } from '~/schema/widgets/checkout-and-beyond';\n\nimport { NotFoundError, type ServerContext, UpstreamError, type WidgetSettingsInput } from '~/server/shared';\nimport {\n convertContentBlockToV2,\n convertLineItemEditorToV2,\n convertNumericObjects,\n deepCamelCase,\n isCABRootSection,\n isContentBlockV1,\n isLineItemEditorV1,\n normalizeTextContent,\n} from '~/transforms';\n\nconst unwrapData = (body: unknown): unknown =>\n body && typeof body === 'object' && 'data' in body ? (body as { data: unknown }).data : body;\n\n/**\n * The legacy shielded CDN returns `200 { data: null }` (or `{ data: {} }`) for deleted/missing widgets \u2014\n * it doesn't emit `404`. Treat both shapes as \"widget not found\".\n */\nconst isMissingUpstreamPayload = (data: unknown): boolean =>\n data == null || (typeof data === 'object' && !Array.isArray(data) && Object.keys(data as object).length === 0);\n\n/**\n * Routes a normalized (camelCased + numeric-fixed) upstream payload to the right transform by shape:\n * `version: 2` \u2192 CAB parse; a v1 content block \u2192 `convertContentBlockToV2`; a v1 line-item editor \u2192\n * `convertLineItemEditorToV2`. Every other widget type passes through unchanged \u2014 its converter slots in\n * here in the phase that introduces it.\n */\nconst dispatchWidgetTransform = (id: number, normalized: unknown): unknown => {\n if (isCABRootSection(normalized)) return CABRootSection.parse(normalizeTextContent(normalized));\n\n if (isContentBlockV1(normalized)) return convertContentBlockToV2({ id, settings: normalized });\n\n if (isLineItemEditorV1(normalized)) return convertLineItemEditorToV2({ id, settings: normalized });\n\n return normalized;\n};\n\n/**\n * Fetch ONE widget's raw settings from the engine and convert them to a CAB section tree (or pass a non-CAB\n * widget through). Throws {@link NotFoundError} for deleted/missing widgets; the params are shop-scoped.\n */\nexport const convertWidgetSettings = async (input: WidgetSettingsInput, ctx: ServerContext): Promise<unknown> => {\n const params: Record<string, string> = { id: String(input.id), shop: input.shop };\n\n if (input.cacheKey != null) params.cache_key = String(input.cacheKey);\n\n if (input.key) params.key = input.key;\n\n let upstream: unknown;\n\n try {\n upstream = await ctx.fetchUpstream('/api/v1/widgets/settings', params, { host: ctx.host });\n } catch (err) {\n // The legacy controller returns 4xx (e.g. 400 \"Invalid widget ID (probably deleted)\") for missing\n // widgets; treat any 4xx as \"not found\" \u2014 malformed input is already blocked upstream by Zod.\n if (err instanceof UpstreamError && err.status >= 400 && err.status < 500) {\n throw new NotFoundError(`Widget not found: ${input.id}`);\n }\n\n throw err;\n }\n\n const data = unwrapData(upstream);\n\n if (isMissingUpstreamPayload(data)) throw new NotFoundError(`Widget not found: ${input.id}`);\n\n return dispatchWidgetTransform(input.id, convertNumericObjects(deepCamelCase(data)));\n};\n"],
5
- "mappings": "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",
6
- "names": ["z", "uuidv7", "z", "z", "uuidv7", "z", "z", "z", "isString", "uuidv7", "z", "z", "uuidv7", "isString", "z", "uuidv7", "z", "z", "uuidv7", "z", "z", "uuidv7", "uuidv7", "z", "uuidv7", "z", "z", "uuidv7", "z", "uuidv7", "z", "z", "z", "z", "uuidv7", "z", "z", "uuidv7", "uuidv7", "z", "z", "uuidv7", "uuidv7", "z", "z", "uuidv7", "uuidv7", "z", "z", "uuidv7", "uuidv7", "z", "z", "uuidv7", "z", "z", "uuidv7", "z", "z", "z", "ARRAY_INDEX_STRING", "isPlainObject", "isPlainObject", "DYNAMIC_TOKEN_REGEX", "HTML_COMMENT_RE", "HTML_TAG_RE"]
3
+ "sources": ["../../src/server/shared.ts", "../../src/schema/userConfig.ts", "../../src/schema/shopConfig.ts", "../../src/schema/widgets/checkout-and-beyond/image.ts", "../../src/schema/widgets/checkout-and-beyond/common.ts", "../../src/schema/widgets/checkout-and-beyond/regex.ts", "../../src/schema/widgets/checkout-and-beyond/rule.ts", "../../src/schema/widgets/checkout-and-beyond/shared.ts", "../../src/schema/widgets/checkout-and-beyond/banner.ts", "../../src/schema/widgets/checkout-and-beyond/layout.ts", "../../src/schema/widgets/checkout-and-beyond/button.ts", "../../src/schema/widgets/checkout-and-beyond/text.ts", "../../src/schema/widgets/checkout-and-beyond/utils.ts", "../../src/schema/widgets/checkout-and-beyond/carousel.ts", "../../src/schema/widgets/checkout-and-beyond/offers.ts", "../../src/schema/widgets/checkout-and-beyond/dataSource.ts", "../../src/schema/widgets/checkout-and-beyond/constants.ts", "../../src/schema/widgets/checkout-and-beyond/products.ts", "../../src/schema/widgets/checkout-and-beyond/product.ts", "../../src/schema/widgets/checkout-and-beyond/cartLine.ts", "../../src/schema/widgets/checkout-and-beyond/discount.ts", "../../src/schema/widgets/checkout-and-beyond/monetize.ts", "../../src/schema/widgets/checkout-and-beyond/progressBar.ts", "../../src/schema/widgets/checkout-and-beyond/quantity.ts", "../../src/schema/widgets/checkout-and-beyond/reviews.ts", "../../src/schema/widgets/checkout-and-beyond/variants.ts", "../../src/transforms/contentBlockV1/stripContentBlockHtml.ts", "../../src/transforms/contentBlockV1/convertTextToTiptapParagraph.ts", "../../src/transforms/contentBlockV1/types.ts", "../../src/transforms/contentBlockV1/convertContentBlockImageToV2.ts", "../../src/transforms/contentBlockV1/convertContentBlockTextToV2.ts", "../../src/schema/widgets/checkout-and-beyond/root.ts", "../../src/transforms/contentBlockV1/convertContentBlockToV2.ts", "../../src/transforms/convertNumericObjects.ts", "../../src/transforms/deepCamelCase.ts", "../../src/transforms/htmlToTiptap/buildDefaultTextStyleMark.ts", "../../src/transforms/htmlToTiptap/closeTag.ts", "../../src/transforms/htmlToTiptap/constants.ts", "../../src/transforms/htmlToTiptap/makeParagraph.ts", "../../src/transforms/htmlToTiptap/flushParagraph.ts", "../../src/transforms/htmlToTiptap/isSkipping.ts", "../../src/transforms/htmlToTiptap/makeDoc.ts", "../../src/transforms/htmlToTiptap/isValidHref.ts", "../../src/transforms/htmlToTiptap/buildLinkMark.ts", "../../src/transforms/htmlToTiptap/decodeEntities.ts", "../../src/transforms/htmlToTiptap/parseAttribs.ts", "../../src/transforms/htmlToTiptap/openTag.ts", "../../src/transforms/htmlToTiptap/pushText.ts", "../../src/transforms/htmlToTiptap/stripHtmlComments.ts", "../../src/transforms/htmlToTiptap/htmlToTiptap.ts", "../../src/transforms/isCABRootSection.ts", "../../src/schema/widgets/checkout-and-beyond/switchLabels.ts", "../../src/transforms/lineItemEditorV1/convertLineItemEditorToV2.ts", "../../src/transforms/lineItemEditorV1/types.ts", "../../src/transforms/normalizeTokens.ts", "../../src/transforms/normalizeTextContent.ts", "../../src/transforms/offerV1/types.ts", "../../src/schema/widgets/checkout-and-beyond/offerLabels.ts", "../../src/transforms/offerV1/offerCard.ts", "../../src/transforms/offerV1/convertOfferToV2.ts", "../../src/transforms/parseShielded.ts", "../../src/server/userConfig.ts", "../../src/utilities.ts", "../../src/server/dataSourceResults.ts", "../../src/server/widgetSettings.ts"],
4
+ "sourcesContent": ["/**\n * Server-only foundations for the widget-conversion / section-composition orchestrators. This subpath\n * (`@rebuy/rebuy/server`) is never imported by the browser extension \u2014 it owns the logic a thin API\n * service (rebuy-api) delegates to, with the actual network egress injected as {@link UpstreamFetch}.\n */\n\n/** Production engine host; any other host is a staging/ephemeral upstream. */\nexport const REBUY_ENGINE_HOST = 'rebuyengine.com';\n\n/**\n * Calls the legacy Rebuy engine at `https://<host><path>` and returns parsed JSON. Injected by the\n * caller (rebuy-api owns the egress, timeouts, and the `X-Rebuy-Upstream` proxy header); MUST throw\n * {@link UpstreamError} on a non-2xx response so orchestrators can interpret the status.\n *\n * Defaults to GET with `params`/`search` as the query string. Pass `method: 'POST'` with `body` (JSON\n * body) and optional `headers` (e.g. an auth token) for write-style calls like analytics ingest.\n */\nexport type UpstreamFetch = (\n path: string,\n params: Record<string, string>,\n options?: {\n body?: unknown;\n headers?: Record<string, string>;\n host?: string;\n method?: 'GET' | 'POST';\n search?: string;\n }\n) => Promise<unknown>;\n\n/** Request-scoped dependencies every orchestrator needs. */\nexport type ServerContext = {\n fetchUpstream: UpstreamFetch;\n host: string;\n /** Browser user-agent forwarded to the ads engine (the checkout worker can't read it). Monetize only. */\n userAgent?: string;\n};\n\n/** Thrown by the injected {@link UpstreamFetch} when the engine returns a non-2xx response. */\nexport class UpstreamError extends Error {\n readonly body: unknown;\n readonly status: number;\n\n constructor(status: number, body: unknown, message?: string) {\n super(message ?? `Upstream returned ${status}`);\n this.body = body;\n this.name = 'UpstreamError';\n this.status = status;\n }\n}\n\n/** Thrown when the requested widget / shop / data source doesn't exist; the route maps it to 404. */\nexport class NotFoundError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'NotFoundError';\n }\n}\n\n/** A cart line in the live-cart context the engine evaluates against. */\nexport type CartLineInput = {\n productId: string;\n /** Line-item properties (raw key/value pairs); the engine receives them JSON-encoded. */\n properties?: { key: string; value?: string }[];\n quantity: number;\n subscriptionId?: string;\n variantId: string;\n};\n\n/** The live cart context shared by the data-source, gift-validation, and monetize inputs. */\nexport type CartInput = {\n /** Cart-level attributes (raw key/value pairs); the engine receives them JSON-encoded. */\n attributes?: { key: string; value?: string }[];\n /** Applied discount codes; the engine evaluates `discount_code` rules against them (sent as `[{code}]`). */\n discountCodes?: string[];\n /** Presentment cents of cart-level discount allocations, subtracted from `subtotal` for the engine. */\n discountTotal?: number;\n items: CartLineInput[];\n /** Presentment subtotal in cents. */\n subtotal: number;\n};\n\n/** Input for `convertWidgetSettings`. */\nexport type WidgetSettingsInput = {\n cacheKey?: number;\n id: number;\n key?: string;\n shop: string;\n /** Stable per-buyer id; when present, enables sticky server-side A/B variant selection. */\n visitorId?: string;\n};\n\n/** Input for `fetchUserConfig`. */\nexport type UserConfigInput = { shop: string };\n\n/** Input for `fetchDataSourceResults`. */\nexport type DataSourceInput = {\n cart: CartInput;\n customerId?: string;\n dataSourcePath: string;\n integrations?: Record<string, boolean>;\n limit: number;\n productType?: 'both' | 'one-time' | 'subscription';\n shop: string;\n visitorId?: string;\n};\n\n/** A gift line the gift-validation watcher asks the server to validate. */\nexport type GiftInput = {\n cost: number;\n discounted: boolean;\n lineId: string;\n productId: number;\n widgetId: number;\n};\n\n/** Input for `validateGifts`. */\nexport type GiftValidationInput = {\n cart: CartInput;\n customerId?: string;\n gifts: GiftInput[];\n shop: string;\n visitorId?: string;\n};\n\n/** Input for `fetchMonetizeOffers`. */\nexport type MonetizeInput = {\n cart: CartInput;\n country?: string;\n currency?: string;\n customerId?: string;\n placement: 'order_status' | 'thank_you_page';\n shop: string;\n visitorId?: string;\n};\n\n/** A generic analytics event from the extension; the server maps `name` \u2192 the engine's noun/verb/subject. */\nexport type AnalyticsEventInput = {\n name: string;\n properties?: Record<string, unknown>;\n sentAt?: string;\n};\n\n/** Input for `postAnalyticsEvents`: a batch of events plus the request-scoped identity fields. */\nexport type AnalyticsInput = {\n /** Rebuy cart token (the `r_cart_token` cart attribute), when available \u2014 primary aggregation key. */\n cartToken?: string;\n /** Shopify checkout token, when available \u2014 drives cart/checkout aggregation downstream. */\n checkoutToken?: string;\n events: AnalyticsEventInput[];\n shop: string;\n visitorId: string;\n /** The widget id (smartBlockId) the events belong to. */\n widgetId?: string;\n};\n", "import { z } from 'zod/v4';\n\nimport { ShopConfig } from './shopConfig';\n\nexport const UserConfig = z.object({\n shop: ShopConfig,\n smartCart: z.unknown(),\n smartFlows: z.array(z.unknown()),\n});\n\nexport type UserConfig = z.infer<typeof UserConfig>;\n", "import { z } from 'zod/v4';\n\n/** @see {@link https://bitbucket.org/rebuyengine/rebuyengine.com/src/main/application/libraries/Cache/ShopConfigCache.php#lines-143} */\nexport const ShopConfig = z.object({\n activeExperiments: z.array(\n z.object({\n data: z.array(\n z.object({\n aliasName: z.string(),\n cssInput: z.string().nullish(),\n elementId: z.coerce.number(),\n id: z.coerce.number(),\n javascriptInput: z.string().nullish(),\n traffic: z.coerce.number(),\n })\n ),\n id: z.coerce.number(),\n name: z.string(),\n pageTarget: z.string().nullable(),\n pageTargetUrl: z.string().nullable(),\n placeholderId: z.coerce.number().nullable(),\n type: z.string(),\n })\n ),\n activePackages: z.array(\n z.object({\n cancelledAt: z.string().nullable(),\n id: z.number(),\n installedAt: z.string().nullable(),\n isActive: z.boolean(),\n isBillable: z.boolean(),\n packageId: z.number(),\n packageName: z.string(),\n shortName: z.string(),\n trialDays: z.number(),\n uninstalledAt: z.string().nullable(),\n })\n ),\n apiKey: z.string(),\n billingVersion: z.string().nullable(),\n cacheKey: z.coerce.number(),\n carousel: z.enum(['flickity', 'splide']),\n currency: z.string(),\n currencySymbol: z.string(),\n domain: z.string(),\n enabledJquery: z.boolean(),\n enabledPresentmentCurrencies: z.array(z.string()),\n hasSmartCollectionsEnabled: z.boolean(),\n hasSmartSearchEnabled: z.boolean(),\n id: z.coerce.number(),\n integrations: z.record(\n z.enum([\n 'attentive',\n 'judgeme',\n 'junip',\n 'klaviyo',\n 'loox',\n 'okendo',\n 'opinew',\n 'recharge',\n 'reviewsio',\n 'stamped',\n 'yotpo',\n ]),\n z.union([z.boolean(), z.unknown()])\n ),\n markets: z.object({\n enabled: z.boolean(),\n }),\n monetize: z\n .object({\n publisherKey: z.string().nullable(),\n })\n .nullish(),\n moneyFormat: z.string(),\n myshopifyDomain: z.string(),\n primaryLocale: z.string(),\n productGroupsEnabled: z.enum(['no', 'yes']).transform((value) => value === 'yes'),\n rechargeCustomDomain: z.string().nullable(),\n sellingPlansEnabled: z.boolean(),\n shopId: z.number(),\n shopifySellingPlansEnabled: z.boolean(),\n shopName: z.string(),\n storefrontAccessToken: z.string().nullable(),\n useRebuyIcons: z.boolean(),\n});\n\nexport type ShopConfig = z.infer<typeof ShopConfig>;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { buttonFields, ObjectFit, objectFits, SectionType } from './common';\nimport { DYNAMIC_TOKEN_REGEX } from './regex';\nimport { CABRule } from './rule';\nimport { CABBorder, type SectionDetails } from './shared';\nimport { checkForHTML, NO_HTML } from './utils';\n\nexport const CABImageSection = z.object({\n altText: z.string().refine(checkForHTML, NO_HTML).default(''),\n aspectRatio: z.literal(1).nullable().default(null),\n border: z.lazy(() => CABBorder),\n buttonField: z.enum(buttonFields).optional(),\n category: z.enum(['gallery', 'icons', 'payment-methods', 'secure-checkout']).nullable().default(null),\n name: z.string().optional(),\n naturalHeight: z.number().default(0),\n naturalWidth: z.number().default(0),\n /**\n * `contain` (the component default): dimensionless images render in s-image's 1/1 default frame, and\n * `cover` would crop non-square art (payment badges lost their edges \u2014 15993); `contain` letterboxes.\n */\n objectFit: z.enum(objectFits).default(ObjectFit.contain),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.image).default(SectionType.image),\n source: z.union([z.url(), z.literal(''), z.string().regex(DYNAMIC_TOKEN_REGEX)]).default(''),\n width: z.number().default(100),\n});\n\nexport type CABImageSection = z.infer<typeof CABImageSection>;\n\nexport type CABImageSectionProps = CABImageSection & SectionDetails;\n", "export const freezeEnum = <T extends readonly string[]>(values: T) =>\n Object.freeze(Object.fromEntries(values.map((v) => [v, v]))) as { readonly [K in T[number]]: K };\n\nexport const bannerColors = ['info', 'success', 'warning', 'critical'] as const;\nexport const BannerColor = freezeEnum(bannerColors);\nexport type BannerColor = (typeof bannerColors)[number];\n\nexport const borderRadii = ['none', 'small', 'base', 'large', 'fullyRounded'] as const;\nexport const BorderRadius = freezeEnum(borderRadii);\nexport type BorderRadius = (typeof borderRadii)[number];\n\nexport const borderStyles = ['none', 'base', 'dotted', 'dashed'] as const;\nexport const BorderStyle = freezeEnum(borderStyles);\nexport type BorderStyle = (typeof borderStyles)[number];\n\nexport const borderWidths = ['base', 'medium', 'thick'] as const;\nexport const BorderWidth = freezeEnum(borderWidths);\nexport type BorderWidth = (typeof borderWidths)[number];\n\nexport const buttonActions = [\n 'acceptOffer',\n 'addToOrder',\n 'declineAllOffers',\n 'declineOffer',\n 'displayContentInModal',\n 'displayContentInPopover',\n 'goToNextPage',\n 'goToPrevPage',\n 'goToURL',\n 'removeFromCart',\n 'selectVariant',\n 'showPagination',\n 'switchToSubscription',\n 'undoAddToOrder',\n] as const;\n\nexport const ButtonAction = freezeEnum(buttonActions);\nexport type ButtonAction = (typeof buttonActions)[number];\n\nexport const buttonFields = [\n 'activePage',\n 'addedToCart',\n 'addingToCart',\n 'addToCart',\n 'buttonLabel',\n 'declineAllOffers',\n 'declineOffer',\n 'destinationUrl',\n 'inactivePage',\n 'overlayContent',\n 'payNow',\n 'progressReached',\n 'progressRemaining',\n 'removeFromCart',\n 'showVariant',\n 'showVariants',\n 'soldOut',\n 'subscriptionOption',\n 'switchToOneTimePurchase',\n 'switchToSubscriptionNoDiscount',\n 'switchToSubscriptionWithDiscount',\n 'undoAddToOrder',\n] as const;\n\nexport const ButtonField = freezeEnum(buttonFields);\nexport type ButtonField = (typeof buttonFields)[number];\n\nexport const buttonStyles = ['primary', 'secondary', 'plain', 'custom'] as const;\nexport const ButtonStyle = freezeEnum(buttonStyles);\nexport type ButtonStyle = (typeof buttonStyles)[number];\n\nexport const directions = ['columns', 'rows', 'grid'] as const;\nexport const Direction = freezeEnum(directions);\nexport type Direction = (typeof directions)[number];\n\nexport const discountSources = ['price', 'compare_at_price'] as const;\nexport const DiscountSource = freezeEnum(discountSources);\nexport type DiscountSource = (typeof discountSources)[number];\n\nexport const discountTypes = ['none', 'percentage', 'fixed', 'fixed_amount'] as const;\nexport const DiscountType = freezeEnum(discountTypes);\nexport type DiscountType = (typeof discountTypes)[number];\n\nexport const editorModes = [\n 'checkoutExtension',\n 'postPurchaseOffer',\n 'thankYouPage',\n 'orderStatusPage',\n 'ordersIndexPage',\n 'customerProfilePage',\n] as const;\n\nexport const EditorMode = freezeEnum(editorModes);\nexport type EditorMode = (typeof editorModes)[number];\n\nexport const horizontalAlignments = ['start', 'center', 'end'] as const;\nexport const HorizontalAlignment = freezeEnum(horizontalAlignments);\nexport type HorizontalAlignment = (typeof horizontalAlignments)[number];\n\nexport const languageKeys = [\n 'ar',\n 'cs',\n 'da',\n 'de',\n 'en',\n 'es',\n 'fi',\n 'fr',\n 'ga',\n 'he',\n 'hi',\n 'id',\n 'it',\n 'ja',\n 'ko',\n 'nl',\n 'no',\n 'pl',\n 'pt',\n 'ru',\n 'sv',\n 'th',\n 'tr',\n 'uk',\n 'vi',\n 'zh',\n] as const;\n\nexport const LanguageKey = freezeEnum(languageKeys);\nexport type LanguageKey = (typeof languageKeys)[number];\n\nexport const objectFits = ['cover', 'contain'] as const;\nexport const ObjectFit = freezeEnum(objectFits);\nexport type ObjectFit = (typeof objectFits)[number];\n\nexport const popoverPositions = ['inlineStart', 'inlineEnd', 'blockStart', 'blockEnd'] as const;\nexport const PopoverPosition = freezeEnum(popoverPositions);\nexport type PopoverPosition = (typeof popoverPositions)[number];\n\nexport const popoverPositionMap = {\n bottom: 'blockEnd',\n left: 'inlineStart',\n right: 'inlineEnd',\n top: 'blockStart',\n} as const;\n\nexport const productTypes = ['one-time', 'subscription', 'both'] as const;\nexport const ProductType = freezeEnum(productTypes);\nexport type ProductType = (typeof productTypes)[number];\n\nexport const progressTierTypes = ['decorative', 'discount', 'product', 'shipping'] as const;\nexport const ProgressTierType = freezeEnum(progressTierTypes);\nexport type ProgressTierType = (typeof progressTierTypes)[number];\n\nexport const quantityInputs = ['select', 'number'] as const;\nexport const QuantityInput = freezeEnum(quantityInputs);\nexport type QuantityInput = (typeof quantityInputs)[number];\n\nexport const reviewsSizes = ['small', 'default', 'large'] as const;\nexport const ReviewsSize = freezeEnum(reviewsSizes);\nexport type ReviewsSize = (typeof reviewsSizes)[number];\n\nexport const sectionTypes = [\n 'banner',\n 'button',\n 'carousel',\n 'cartLine',\n 'dataSource',\n 'discount',\n 'image',\n 'layout',\n 'monetize',\n 'offers',\n 'product',\n 'products',\n 'progressBar',\n 'quantity',\n 'reviews',\n 'text',\n 'variants',\n] as const;\n\nexport const SectionType = freezeEnum(sectionTypes);\nexport type SectionType = (typeof sectionTypes)[number];\n\nexport const spacings = ['none', 'extraTight', 'tight', 'base', 'loose', 'extraLoose'] as const;\nexport const Spacing = freezeEnum(spacings);\nexport type Spacing = (typeof spacings)[number];\n\nexport const textAlignments = ['start', 'center', 'end'] as const;\nexport const TextAlignment = freezeEnum(textAlignments);\nexport type TextAlignment = (typeof textAlignments)[number];\n\nexport const textColorNames = ['base', 'subdued', 'accent', 'decorative', 'success', 'warning', 'critical'] as const;\nexport const TextColorName = freezeEnum(textColorNames);\nexport type TextColorName = (typeof textColorNames)[number];\n\nexport const textSizeNames = ['extraSmall', 'small', 'base', 'medium', 'large', 'extraLarge'] as const;\nexport const TextSizeName = freezeEnum(textSizeNames);\nexport type TextSizeName = (typeof textSizeNames)[number];\n\nexport const variantModes = ['multiple', 'single'] as const;\nexport const VariantMode = freezeEnum(variantModes);\nexport type VariantMode = (typeof variantModes)[number];\n\nexport const variantSelectors = ['menu', 'radio', 'button'] as const;\nexport const VariantSelector = freezeEnum(variantSelectors);\nexport type VariantSelector = (typeof variantSelectors)[number];\n\nexport const verticalAlignments = ['top', 'middle', 'bottom'] as const;\nexport const VerticalAlignment = freezeEnum(verticalAlignments);\nexport type VerticalAlignment = (typeof verticalAlignments)[number];\n", "/** Matches a valid array index string (e.g., \"0\", \"1\", \"42\"). */\nexport const ARRAY_INDEX_STRING = /^(0|[1-9]\\d*)$/;\n\n/** Matches a dynamic token. */\nexport const DYNAMIC_TOKEN_REGEX = /^\\{\\{\\s*[A-Za-z]+\\s*\\}\\}$/;\n\n/** Matches a valid hex color code. */\nexport const HEX_COLOR_REGEX = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\n\n/** Matches any HTML tags. */\nexport const HTML_TAGS_REGEX = /<\\/?[^>]+>/g;\n", "import { z } from 'zod/v4';\n\nexport const ruleTypes = [\n 'cart',\n 'cart_count',\n 'cart_item_count',\n 'cart_line_count',\n 'cart_subtotal',\n 'collection',\n 'customer',\n 'customer_order_count',\n 'customer_tag',\n 'customer_total_spent',\n 'date',\n 'product',\n 'product_tag',\n 'product_title',\n 'product_type',\n 'product_vendor',\n] as const;\n\nconst ruleType = z.enum(ruleTypes);\n\nexport const RuleType = ruleType.enum;\nexport type RuleType = z.infer<typeof ruleType>;\n\nexport const ruleOperators = [\n 'after',\n 'anything',\n 'before',\n 'contains',\n 'contains_any',\n 'does_not_contain',\n 'does_not_contain_any',\n 'equals',\n 'does_not_equal',\n 'greater_than',\n 'less_than',\n] as const;\n\nconst ruleOperator = z.enum(ruleOperators);\n\nexport const RuleOperator = ruleOperator.enum;\nexport type RuleOperator = z.infer<typeof ruleOperator>;\n\nexport const RuleCondition = z.object({\n operator: z.enum(ruleOperators).default(RuleOperator.anything),\n products: z.union([z.array(z.unknown()), z.strictObject({}).transform(() => [])]).default(() => []),\n type: z.enum(ruleTypes).default(RuleType.cart_subtotal),\n value: z.coerce.string().default(''),\n});\n\nexport type RuleCondition = z.infer<typeof RuleCondition>;\n\nexport const RuleLogicBlock = z.object({\n rules: z.array(RuleCondition).default(() => []),\n});\n\nexport type RuleLogicBlock = z.infer<typeof RuleLogicBlock>;\n\nexport const CABRule = z.object({\n dataSourceId: z.number().nullable().default(null),\n enabled: z.boolean().default(false),\n ruleset: z\n .union([\n z.array(\n z.object({\n exitIfMatched: z.boolean().default(true),\n logic: z.array(RuleLogicBlock).default(() => []),\n output: z\n .array(\n z.object({\n key: z.string().default('should_show'),\n type: z.literal('data_json').default('data_json'),\n value: z.string().default('true'),\n })\n )\n .default(() => [{ key: 'should_show', type: 'data_json' as const, value: 'true' }]),\n })\n ),\n z.strictObject({}).transform(() => []),\n ])\n .default(() => []),\n});\n\nexport type CABRule = z.infer<typeof CABRule>;\n", "import { type FieldArrayPath } from 'react-hook-form';\nimport { z, type ZodType } from 'zod/v4';\n\nimport { CABBannerSection } from './banner';\nimport { CABButtonSection } from './button';\nimport { CABCarouselSection } from './carousel';\nimport { CABCartLineSection } from './cartLine';\nimport { borderRadii, BorderRadius, BorderStyle, borderStyles, BorderWidth, borderWidths } from './common';\nimport { CABDataSourceSection } from './dataSource';\nimport { CABDiscountSection } from './discount';\nimport { CABImageSection } from './image';\nimport { CABLayoutSection } from './layout';\nimport { CABMonetizeSection } from './monetize';\nimport { CABOffersSection } from './offers';\nimport { CABProductSection } from './product';\nimport { CABProductsSection } from './products';\nimport { CABProgressBarSection } from './progressBar';\nimport { CABQuantitySection } from './quantity';\nimport { CABReviewsSection } from './reviews';\nimport { type CABRootSection } from './root';\nimport { CABTextSection } from './text';\nimport { CABVariantsSection } from './variants';\n\nexport const CABBorder = z\n .object({\n radius: z.enum(borderRadii).default(BorderRadius.base),\n style: z.enum(borderStyles).default(BorderStyle.none),\n width: z.enum(borderWidths).default(BorderWidth.base),\n })\n .default({\n radius: BorderRadius.base,\n style: BorderStyle.none,\n width: BorderWidth.base,\n });\n\nexport type CABBorder = z.infer<typeof CABBorder>;\n\nexport const CABSection: ZodType<CABSection> = z.lazy(() =>\n z.discriminatedUnion('sectionType', [\n CABBannerSection,\n CABButtonSection,\n CABCarouselSection,\n CABCartLineSection,\n CABDataSourceSection,\n CABDiscountSection,\n CABImageSection,\n CABLayoutSection,\n CABMonetizeSection,\n CABOffersSection,\n CABProductSection,\n CABProductsSection,\n CABProgressBarSection,\n CABQuantitySection,\n CABReviewsSection,\n CABTextSection,\n CABVariantsSection,\n ])\n);\n\nexport type CABSection =\n | CABBannerSection\n | CABButtonSection\n | CABCarouselSection\n | CABCartLineSection\n | CABDataSourceSection\n | CABDiscountSection\n | CABImageSection\n | CABLayoutSection\n | CABMonetizeSection\n | CABOffersSection\n | CABProductSection\n | CABProductsSection\n | CABProgressBarSection\n | CABQuantitySection\n | CABReviewsSection\n | CABTextSection\n | CABVariantsSection;\n\nexport type SectionId = CABSection['sectionId'];\n\n/* @ts-expect-error: TS2589: Type instantiation _is_ excessively deep and infinite. */\nexport type SectionArrayPath = FieldArrayPath<CABRootSection>;\n\nexport type SectionPrefixPath = `${SectionArrayPath}.${number}` | null;\n\nexport type SectionDetails = {\n /**\n * The full React Hook Form dot-notation path to the section object itself,\n * for use with `register` or `control`, e.g. `sections.0.sections.1`.\n *\n * Returns `null` for the root section.\n */\n fieldArrayPath: SectionArrayPath | null;\n /**\n * The index of the found section within its parent `sections` array.\n *\n * Returns `null` for the root section.\n */\n index: number | null;\n /**\n * The parent `sections` object.\n *\n * Returns `null` for the root section.\n */\n parent: CABSection[] | null;\n /**\n * The parent `sectionId`.\n *\n * Returns `undefined` for the root section.\n */\n parentId: SectionId | undefined;\n /**\n * The full React Hook Form dot-notation path to the section object itself,\n * for use with `register` or `control`, e.g. `sections.0.sections.1`.\n *\n * Returns `null` for the root section.\n */\n prefixPath: SectionPrefixPath | null;\n};\n\nexport type CABSectionProps = CABSection & SectionDetails;\n", "import { z } from 'zod/v4';\n\nimport { bannerColors, buttonFields, SectionType, type BannerColor } from './common';\nimport { CABLayoutSection } from './layout';\nimport { type SectionDetails } from './shared';\n\nexport const CABBannerSection = z.lazy(() =>\n CABLayoutSection.omit({ sectionType: true }).extend({\n buttonField: z.enum(buttonFields).optional(),\n color: z.enum(bannerColors).default('info'),\n dismissible: z.boolean().default(true),\n sectionType: z.literal(SectionType.banner).default(SectionType.banner),\n })\n);\n\nexport type CABBannerSection = Omit<CABLayoutSection, 'sectionType'> & {\n color: BannerColor;\n dismissible: boolean;\n sectionType: 'banner';\n};\n\nexport type CABBannerSectionProps = CABBannerSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport {\n buttonFields,\n Direction,\n directions,\n HorizontalAlignment,\n horizontalAlignments,\n SectionType,\n Spacing,\n spacings,\n VerticalAlignment,\n verticalAlignments,\n type ButtonField,\n} from './common';\nimport { CABRule } from './rule';\nimport { CABBorder, CABSection, type SectionDetails } from './shared';\n\nexport const GridItem = z.union([z.literal('auto'), z.literal('fill'), z.string().regex(/^\\d+%$/), z.number()]);\nexport type GridItem = z.infer<typeof GridItem>;\n\nexport const CABLayoutSection = z.object({\n alignment: z\n .object({\n horizontal: z.enum(horizontalAlignments).default(HorizontalAlignment.start),\n vertical: z.enum(verticalAlignments).default(VerticalAlignment.top),\n })\n .default({\n horizontal: HorizontalAlignment.start,\n vertical: VerticalAlignment.top,\n }),\n border: z.lazy(() => CABBorder),\n buttonField: z.enum(buttonFields).optional(),\n direction: z.enum(directions).default(Direction.rows),\n grid: z\n .object({\n columns: z.union([z.array(GridItem), z.undefined()]).default(() => ['auto']),\n rows: z.union([z.array(GridItem), z.undefined()]).default(() => ['auto']),\n })\n .default({ columns: ['auto'], rows: ['auto'] })\n .optional(),\n name: z.string().optional(),\n padding: z.enum(spacings).default(Spacing.none),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sections: z.union([z.array(z.lazy(() => CABSection)), z.strictObject({}).transform(() => [])]).default(() => []),\n sectionType: z.literal(SectionType.layout).default(SectionType.layout),\n spacing: z.enum(spacings).default(Spacing.base),\n /** Fire-and-forget impression pixel POSTed once when the section is shown (e.g. a Monetize offer view). */\n viewUrl: z.string().optional(),\n width: z.number().default(100),\n});\n\nexport type CABLayoutSection = {\n alignment: {\n horizontal: HorizontalAlignment;\n vertical: VerticalAlignment;\n };\n border: CABBorder;\n buttonField?: ButtonField;\n direction: Direction;\n grid?: {\n columns: GridItem[];\n rows: GridItem[];\n };\n name?: string;\n padding: Spacing;\n rule?: CABRule;\n sectionId: string;\n sections: CABSection[];\n sectionType: 'layout';\n spacing: Spacing;\n viewUrl?: string;\n width: number;\n};\n\nexport type CABLayoutSectionProps = CABLayoutSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z, type ZodType } from 'zod/v4';\n\nimport {\n buttonActions,\n ButtonStyle,\n buttonStyles,\n PopoverPosition,\n popoverPositions,\n SectionType,\n TextAlignment,\n textAlignments,\n} from './common';\nimport { CABImageSection } from './image';\nimport { CABLayoutSection } from './layout';\nimport { HEX_COLOR_REGEX } from './regex';\nimport { CABRule } from './rule';\nimport { type SectionDetails } from './shared';\nimport { CABTextSection } from './text';\n\nexport type CABButtonContent = CABImageSection | CABLayoutSection | CABTextSection;\n\nexport const CABButtonContent: ZodType<CABButtonContent> = z.lazy(() =>\n z.discriminatedUnion('sectionType', [CABImageSection, CABLayoutSection, CABTextSection])\n);\n\nexport const CABButtonSection = z.object({\n action: z.union([z.literal(''), z.enum(buttonActions)]).default(''),\n buttonStyle: z.enum(buttonStyles).default(ButtonStyle.primary),\n custom: z\n .object({\n color: z.string().regex(HEX_COLOR_REGEX).default('#005bd3'),\n height: z.number().default(52),\n width: z.number().default(300),\n })\n .default({\n color: '#005bd3',\n height: 52,\n width: 300,\n }),\n disableDowngrade: z.boolean().default(false),\n name: z.string().optional(),\n optionId: z.number().optional(),\n popover: z\n .object({\n alignment: z.enum(textAlignments).default(TextAlignment.center),\n position: z.enum(popoverPositions).default(PopoverPosition.blockStart),\n })\n .optional()\n .default(() => ({\n alignment: TextAlignment.center,\n position: PopoverPosition.blockStart,\n })),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sections: z.union([z.array(CABButtonContent), z.strictObject({}).transform(() => [])]).default(() => []),\n sectionType: z.literal(SectionType.button).default(SectionType.button),\n /** Fire-and-forget pixel POSTed when the button is clicked (e.g. a Monetize decline). */\n trackingUrl: z.string().optional(),\n});\n\nexport type CABButtonSection = z.infer<typeof CABButtonSection>;\n\nexport type CABButtonSectionProps = CABButtonSection & SectionDetails;\n", "import { forEach, isString } from 'es-toolkit/compat';\nimport { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport {\n ButtonField,\n buttonFields,\n progressTierTypes,\n ProgressTierType,\n SectionType,\n Spacing,\n spacings,\n TextAlignment,\n textAlignments,\n TextColorName,\n textColorNames,\n TextSizeName,\n textSizeNames,\n} from './common';\nimport { DYNAMIC_TOKEN_REGEX } from './regex';\nimport { CABRule } from './rule';\nimport { type SectionDetails } from './shared';\nimport { checkForHTML, NO_HTML } from './utils';\n\nconst enumOrOmit = <T extends readonly [string, ...string[]]>(...vals: T) =>\n z\n .string()\n .transform((val) => (vals.includes(val as T[number]) ? (val as T[number]) : undefined))\n .optional();\n\nexport const TiptapText = z.object({\n marks: z\n .union([\n z.array(\n z.discriminatedUnion('type', [\n z.object({ type: z.literal('bold') }),\n z.object({ type: z.literal('italic') }),\n z.object({\n attrs: z.object({\n class: z.string().nullable(),\n href: z.union([z.url(), z.literal('#'), z.string().regex(DYNAMIC_TOKEN_REGEX)]),\n rel: z.string().default('noopener noreferrer nofollow'),\n target: z.string().default('_blank'),\n }),\n type: z.literal('link'),\n }),\n z.object({ type: z.literal('strike') }),\n z.object({\n attrs: z.object({\n color: enumOrOmit(...textColorNames).default(TextColorName.base),\n fontSize: enumOrOmit(...textSizeNames).default(TextSizeName.base),\n }),\n type: z.literal('textStyle'),\n }),\n ])\n ),\n z.strictObject({}).transform(() => []),\n ])\n .optional(),\n text: z.string().default(''),\n type: z.literal('text').default('text'),\n});\n\nexport type TiptapText = z.infer<typeof TiptapText>;\n\nexport const TiptapParagraph = z.object({\n attrs: z\n .object({\n textAlign: enumOrOmit(...textAlignments),\n })\n .default({ textAlign: TextAlignment.start }),\n content: z.union([z.array(TiptapText), z.strictObject({}).transform(() => [])]).default(() => []),\n type: z.literal('paragraph').default('paragraph'),\n});\n\nexport type TiptapParagraph = z.infer<typeof TiptapParagraph>;\n\nexport const TiptapDocument = z.object({\n attrs: z\n .object({\n blockSpacing: enumOrOmit(...spacings),\n })\n .default({ blockSpacing: Spacing.base }),\n content: z\n .union([z.array(TiptapParagraph), z.strictObject({}).transform(() => [])])\n .default(() => [TiptapParagraph.parse({})]),\n type: z.literal('doc').default('doc'),\n});\n\nexport type TiptapDocument = z.infer<typeof TiptapDocument>;\n\nexport const CABProgressTier = z.object({\n threshold: z.number().int().nonnegative(),\n thresholds: z.record(z.string(), z.number().int().nonnegative()).default(() => ({})),\n tierType: z.enum(progressTierTypes).default(ProgressTierType.shipping),\n});\n\nexport type CABProgressTier = z.infer<typeof CABProgressTier>;\n\nexport const CABTextSection = z\n .object({\n buttonField: z.enum(buttonFields).optional(),\n content: z\n .record(z.string(), z.union([z.string(), TiptapDocument]).refine(checkForHTML, NO_HTML).optional())\n .default({ en: TiptapDocument.parse({}) })\n .optional(),\n name: z.string().optional(),\n optionId: z.number().optional(),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.text).default(SectionType.text),\n tier: CABProgressTier.optional(),\n })\n .superRefine(({ buttonField, content }, ctx) => {\n if (buttonField === ButtonField.destinationUrl && content) {\n forEach(content, (value, lang) => {\n if (value && isString(value)) {\n if (DYNAMIC_TOKEN_REGEX.test(value)) return;\n\n try {\n new URL(value);\n } catch {\n ctx.addIssue({\n code: 'custom',\n message: 'Invalid URL',\n path: ['content', lang],\n });\n }\n }\n });\n }\n });\n\nexport type CABTextSection = z.infer<typeof CABTextSection>;\n\nexport type CABTextSectionProps = CABTextSection & SectionDetails;\n", "import { isPlainObject, mapValues } from 'es-toolkit';\nimport { every, get, isArray, isString, map, size, toPairs } from 'es-toolkit/compat';\n\nimport { type CABBannerSection } from './banner';\nimport { type CABButtonSection } from './button';\nimport { type CABCarouselSection } from './carousel';\nimport { type CABCartLineSection } from './cartLine';\nimport { ButtonField, SectionType } from './common';\nimport { type CABDataSourceSection } from './dataSource';\nimport { type CABDiscountSection } from './discount';\nimport { type CABImageSection } from './image';\nimport { type CABLayoutSection } from './layout';\nimport { type CABMonetizeSection } from './monetize';\nimport { type CABOffersSection } from './offers';\nimport { type CABProductSection } from './product';\nimport { type CABProductsSection } from './products';\nimport { type CABProgressBarSection } from './progressBar';\nimport { type CABQuantitySection } from './quantity';\nimport { ARRAY_INDEX_STRING, HTML_TAGS_REGEX } from './regex';\nimport { type CABReviewsSection } from './reviews';\nimport { type CABTextSection, type TiptapDocument } from './text';\nimport { type CABVariantsSection } from './variants';\n\nexport const isHTML = (html: string | undefined = ''): boolean => {\n if (typeof window !== 'undefined') {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n\n const hasHTML = (nodeList: NodeList) => Array.from(nodeList).some((node) => node.nodeType === 1);\n\n return hasHTML(doc.body.childNodes) || hasHTML(doc.head.childNodes);\n }\n\n return HTML_TAGS_REGEX.test(html);\n};\n\nexport const hasHTMLInDoc = (doc: TiptapDocument): boolean =>\n doc.content.some(({ content = [] }) => content.some(({ text }) => isHTML(text)));\n\nexport const checkForHTML = (input: string | TiptapDocument): boolean =>\n !((isString(input) && isHTML(input)) || (isPlainObject(input) && hasHTMLInDoc(input as TiptapDocument)));\n\nexport const NO_HTML = { message: 'HTML is not supported' };\n\nexport const isBannerType = (section: unknown): section is CABBannerSection =>\n get(section, 'sectionType') === SectionType.banner;\n\nexport const isButtonType = (section: unknown): section is CABButtonSection =>\n get(section, 'sectionType') === SectionType.button;\n\nexport const isCarouselType = (section: unknown): section is CABCarouselSection =>\n get(section, 'sectionType') === SectionType.carousel;\n\nexport const isCartLineType = (section: unknown): section is CABCartLineSection =>\n get(section, 'sectionType') === SectionType.cartLine;\n\nexport const isDataSourceType = (section: unknown): section is CABDataSourceSection =>\n get(section, 'sectionType') === SectionType.dataSource;\n\nexport const isDiscountType = (section: unknown): section is CABDiscountSection =>\n get(section, 'sectionType') === SectionType.discount;\n\nexport const isImageType = (section: unknown): section is CABImageSection =>\n get(section, 'sectionType') === SectionType.image;\n\nexport const isLayoutType = (section: unknown): section is CABLayoutSection =>\n get(section, 'sectionType') === SectionType.layout;\n\nexport const isMonetizeType = (section: unknown): section is CABMonetizeSection =>\n get(section, 'sectionType') === SectionType.monetize;\n\nexport const isOffersType = (section: unknown): section is CABOffersSection =>\n get(section, 'sectionType') === SectionType.offers;\n\nexport const isOverlayType = (section: unknown): section is CABLayoutSection =>\n isLayoutType(section) && get(section, 'buttonField') === ButtonField.overlayContent;\n\nexport const isProductType = (section: unknown): section is CABProductSection =>\n get(section, 'sectionType') === SectionType.product;\n\nexport const isProductsType = (section: unknown): section is CABProductsSection =>\n get(section, 'sectionType') === SectionType.products;\n\nexport const isProgressBarType = (section: unknown): section is CABProgressBarSection =>\n get(section, 'sectionType') === SectionType.progressBar;\n\nexport const isQuantityType = (section: unknown): section is CABQuantitySection =>\n get(section, 'sectionType') === SectionType.quantity;\n\nexport const isReviewsType = (section: unknown): section is CABReviewsSection =>\n get(section, 'sectionType') === SectionType.reviews;\n\nexport const isTextType = (section: unknown): section is CABTextSection =>\n get(section, 'sectionType') === SectionType.text;\n\nexport const isVariantsType = (section: unknown): section is CABVariantsSection =>\n get(section, 'sectionType') === SectionType.variants;\n\nconst hasOnlyNumericKeys = (input: Record<string, unknown>) =>\n !!size(input) && every(input, (_, key) => ARRAY_INDEX_STRING.test(key) && Number.isSafeInteger(Number(key)));\n\nconst numericObjectToArray = (input: Record<string, unknown>) =>\n toPairs(input)\n .sort(([a], [b]) => Number(a) - Number(b))\n .map(([_, value]) => value);\n\nexport const convertNumericObjects = (input: unknown): unknown => {\n if (isArray(input)) return map(input, convertNumericObjects);\n\n if (isPlainObject(input)) {\n const obj = input as Record<string, unknown>;\n\n return hasOnlyNumericKeys(obj)\n ? map(numericObjectToArray(obj), convertNumericObjects)\n : mapValues(obj, convertNumericObjects);\n }\n\n return input;\n};\n", "import { z } from 'zod/v4';\n\nimport { SectionType } from './common';\nimport { CABLayoutSection } from './layout';\nimport { CABOffersSection } from './offers';\nimport { CABSection, type SectionDetails } from './shared';\n\nexport const CABCarouselSection = z.lazy(() =>\n CABLayoutSection.omit({ sections: true, sectionType: true }).extend({\n autoAdvanceInterval: z.number().default(0),\n itemsAtOnce: z.number().min(1).default(1),\n sections: z\n .union([z.array(z.lazy(() => CABSection)), z.strictObject({}).transform(() => [])])\n .default(() => [CABOffersSection.parse({})]),\n sectionType: z.literal(SectionType.carousel).default(SectionType.carousel),\n })\n);\n\nexport type CABCarouselSection = Omit<CABLayoutSection, 'sectionType'> & {\n autoAdvanceInterval: number;\n itemsAtOnce: number;\n sectionType: 'carousel';\n};\n\nexport type CABCarouselSectionProps = CABCarouselSection & SectionDetails;\n", "import { z } from 'zod/v4';\n\nimport { CABBannerSection } from './banner';\nimport { CABButtonSection } from './button';\nimport { ButtonStyle, SectionType } from './common';\nimport { CABDataSourceSection } from './dataSource';\nimport { CABLayoutSection } from './layout';\nimport { CABProductsSection } from './products';\nimport { CABSection, type SectionDetails } from './shared';\nimport { CABTextSection } from './text';\n\nexport const CABOffersSection = z.lazy(() =>\n CABLayoutSection.omit({ sections: true, sectionType: true }).extend({\n sections: z.union([z.array(z.lazy(() => CABSection)), z.strictObject({}).transform(() => [])]).default(() => [\n CABBannerSection.parse({\n buttonField: 'undoAddToOrder',\n color: 'success',\n dismissible: true,\n name: 'Success Banner',\n sections: [\n CABTextSection.parse({ content: { en: '{{quantity}} {{productTitle}} added to cart.' } }),\n CABButtonSection.parse({ action: 'undoAddToOrder', buttonStyle: ButtonStyle.plain }),\n ],\n }),\n CABDataSourceSection.parse({}),\n CABProductsSection.parse({}),\n ]),\n sectionType: z.literal(SectionType.offers).default(SectionType.offers),\n })\n);\n\nexport type CABOffersSection = Omit<CABLayoutSection, 'sectionType'> & {\n sectionType: 'offers';\n};\n\nexport type CABOffersSectionProps = CABOffersSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { discountSources, discountTypes, productTypes, SectionType } from './common';\nimport { DEFAULT_ENDPOINTS } from './constants';\nimport { type SectionDetails } from './shared';\n\nexport const CABDiscount = z.object({\n amount: z.union([z.number(), z.string()]).catch(0),\n discountedBy: z.string().optional(),\n discountedFrom: z.enum(discountSources).optional().catch(undefined),\n type: z.enum(discountTypes).catch('none'),\n});\n\nexport type CABDiscount = z.infer<typeof CABDiscount>;\n\nexport const CABIntegrations = z.object({\n judgeme: z.boolean().default(false),\n junip: z.boolean().default(false),\n klaviyo: z.boolean().default(false),\n loox: z.boolean().default(false),\n okendo: z.boolean().default(false),\n opinew: z.boolean().default(false),\n reviewsio: z.boolean().default(false),\n stamped: z.boolean().default(false),\n yotpo: z.boolean().default(false),\n});\n\nexport type CABIntegrations = z.infer<typeof CABIntegrations>;\n\nexport const CABDataSourceSection = z.object({\n dataSourceId: z.number().nullable().default(null),\n dataSourcePath: z.string().default(DEFAULT_ENDPOINTS[0].value),\n discount: CABDiscount.optional(),\n integrations: CABIntegrations.optional(),\n limit: z.number().default(1),\n matchVariant: z.boolean().default(false),\n matchVariantOutOfStock: z.boolean().default(false),\n name: z.string().default(DEFAULT_ENDPOINTS[0].label),\n productType: z.enum(productTypes).optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.dataSource).default(SectionType.dataSource),\n treatAsGwp: z.boolean().default(false),\n});\n\nexport type CABDataSourceSection = z.infer<typeof CABDataSourceSection>;\n\nexport type CABDataSourceSectionProps = CABDataSourceSection & SectionDetails;\n", "import { uniqBy } from 'es-toolkit';\n\nimport { EditorMode, freezeEnum } from './common';\nimport { type TargetArea } from './root';\n\nexport const DEFAULT_ENDPOINTS = [\n { label: 'Recommended (AI)', value: '/products/recommended' },\n { label: 'Top Sellers', value: '/products/top_sellers' },\n { label: 'Buy It Again', value: '/products/purchased' },\n { label: 'Recently Viewed', value: '/products/viewed' },\n { label: 'Products Search', value: '/products/search' },\n { label: 'Collection Products', value: '/products/collections' },\n { label: 'Similar Products (AI)', value: '/products/similar_products' },\n] as const;\n\nexport const STATIC_ENDPOINTS = [\n { label: 'Recommended (AI)', value: '/products/recommended' },\n { label: 'Top Sellers', value: '/products/top_sellers' },\n { label: 'Trending Products', value: '/products/trending_products' },\n { label: 'Buy It Again', value: '/products/purchased' },\n { label: 'Collection Products', value: '/products/collections' },\n { label: 'Recently Viewed', value: '/products/viewed' },\n { label: 'Static Products', value: '/products/static' },\n { label: 'Products Search', value: '/products/search' },\n { label: 'Similar Products (AI)', value: '/products/similar_products' },\n] as const;\n\nexport const COMBINED_ENDPOINTS = uniqBy([...DEFAULT_ENDPOINTS, ...STATIC_ENDPOINTS], (item) => item.value);\n\nexport const targetAreas = {\n [EditorMode.checkoutExtension]: [\n { icon: 'splitscreen_top', label: 'Header Area', width: '984px' },\n { icon: 'splitscreen_left', label: 'Main Column', width: '503px' },\n { icon: 'splitscreen_right', label: 'Summary Column', width: '404px' },\n ] satisfies TargetArea[],\n [EditorMode.postPurchaseOffer]: null,\n [EditorMode.thankYouPage]: [\n { icon: 'splitscreen_top', label: 'Header Area', width: '984px' },\n { icon: 'splitscreen_left', label: 'Main Column', width: '503px' },\n { icon: 'splitscreen_right', label: 'Summary Column', width: '404px' },\n ] satisfies TargetArea[],\n [EditorMode.orderStatusPage]: [\n // { fill: true, flip: 'vertical', icon: 'bottom_navigation', label: 'Announcement Bar' },\n { icon: 'splitscreen_top', label: 'Header Area', width: '1124px' },\n { fill: true, icon: 'view_column_2', label: 'Main Area', width: '646px' },\n { icon: 'splitscreen_bottom', label: 'Footer Area', width: '1124px' },\n ] satisfies TargetArea[],\n [EditorMode.ordersIndexPage]: [\n // { fill: true, flip: 'vertical', icon: 'bottom_navigation', label: 'Announcement Bar' },\n { icon: 'splitscreen_top', label: 'Main Area', width: '1124px' },\n ] satisfies TargetArea[],\n [EditorMode.customerProfilePage]: [\n // { fill: true, flip: 'vertical', icon: 'bottom_navigation', label: 'Announcement Bar' },\n { icon: 'splitscreen_top', label: 'Main Area', width: '1124px' },\n ] satisfies TargetArea[],\n} as const;\n\nexport const widgetTypes = [\n 'bundle_builder',\n 'cart',\n 'cart_subscription',\n 'dynamic_bundle',\n 'gift_with_purchase',\n 'pre_purchase',\n 'product',\n 'product_addon',\n 'product_upsell',\n 'recharge_checkout',\n 'recharge_customer_portal',\n 'recharge_post_purchase',\n 'shopify_checkout',\n 'shopify_checkout_extension',\n 'shopify_post_purchase',\n 'shopify_post_purchase_extension',\n 'switch_to_subscription',\n 'ui_extension_ad',\n 'ui_extension_button',\n 'ui_extension_content_block',\n 'ui_extension_line_item_editor',\n 'ui_extension_progress_bar',\n] as const;\n\nexport const WidgetType = freezeEnum(widgetTypes);\nexport type WidgetType = (typeof widgetTypes)[number];\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { SectionType } from './common';\nimport { CABProductSection } from './product';\nimport { type SectionDetails } from './shared';\n\nexport const CABProductsSection = z.object({\n name: z.string().optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sections: z\n .union([z.array(z.lazy(() => CABProductSection)), z.strictObject({}).transform(() => [])])\n .default(() => []),\n sectionType: z.literal(SectionType.products).default(SectionType.products),\n});\n\nexport type CABProductsSection = z.infer<typeof CABProductsSection>;\n\nexport type CABProductsSectionProps = CABProductsSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z, type ZodType } from 'zod/v4';\n\nimport { CABButtonSection } from './button';\nimport { SectionType, VariantMode, variantModes, VariantSelector, variantSelectors } from './common';\nimport { type SectionDetails } from './shared';\nimport { CABTextSection } from './text';\n\nexport type CABVariantContent = CABButtonSection | CABTextSection;\n\nexport const CABVariantContent: ZodType<CABVariantContent> = z.lazy(() =>\n z.discriminatedUnion('sectionType', [CABButtonSection, CABTextSection])\n);\n\nexport const CABProductSection = z.object({\n name: z.string().optional(),\n productId: z.number().nullable().default(null),\n sectionId: z.uuid().default(() => uuidv7()),\n sections: z.union([z.array(CABVariantContent), z.strictObject({}).transform(() => [])]).default(() => []),\n sectionType: z.literal(SectionType.product).default(SectionType.product),\n selectors: z.record(z.string(), z.enum(variantSelectors).default(VariantSelector.menu)).default(() => ({})),\n variantMode: z.enum(variantModes).default(VariantMode.multiple),\n});\n\nexport type CABProductSection = z.infer<typeof CABProductSection>;\n\nexport type CABProductSectionProps = CABProductSection & SectionDetails;\n", "import { z } from 'zod/v4';\n\nimport { CABButtonSection } from './button';\nimport { ButtonAction, SectionType } from './common';\nimport { CABLayoutSection } from './layout';\nimport { CABSection, type SectionDetails } from './shared';\n\nexport const CABCartLineSection = z.lazy(() =>\n CABLayoutSection.omit({ sections: true, sectionType: true }).extend({\n sections: z\n .union([z.array(z.lazy(() => CABSection)), z.strictObject({}).transform(() => [])])\n .default(() => [CABButtonSection.parse({ action: ButtonAction.switchToSubscription })]),\n sectionType: z.literal(SectionType.cartLine).default(SectionType.cartLine),\n })\n);\n\nexport type CABCartLineSection = Omit<CABLayoutSection, 'sectionType'> & {\n sectionType: 'cartLine';\n};\n\nexport type CABCartLineSectionProps = CABCartLineSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { discountSources, discountTypes, SectionType } from './common';\nimport { type SectionDetails } from './shared';\n\n/**\n * The widget discount, modeled as its own offers child section (toggled on/off in the editor and\n * rendered nowhere \u2014 it's config-only). Discounting is Shopify Functions-only (Scripts is sunset), so a\n * configured discount always applies via Functions and the amount is in Functions (minor-unit) form for\n * fixed types. `discountedFrom` is the compare-from source; `message` is the Functions discount title.\n */\nexport const CABDiscountSection = z.object({\n amount: z.union([z.number(), z.string()]).catch(0),\n discountedBy: z.string().optional(),\n discountedFrom: z.enum(discountSources).optional().catch(undefined),\n message: z.string().optional(),\n name: z.string().optional(),\n quantity: z.number().default(1),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.discount).default(SectionType.discount),\n type: z.enum(discountTypes).catch('none'),\n});\n\nexport type CABDiscountSection = z.infer<typeof CABDiscountSection>;\n\nexport type CABDiscountSectionProps = CABDiscountSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { SectionType } from './common';\nimport { CABRule } from './rule';\nimport { type SectionDetails } from './shared';\n\nexport const CABMonetizeSection = z.object({\n name: z.string().optional(),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.monetize).default(SectionType.monetize),\n});\n\nexport type CABMonetizeSection = z.infer<typeof CABMonetizeSection>;\n\nexport type CABMonetizeSectionProps = CABMonetizeSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { SectionType } from './common';\nimport { CABRule } from './rule';\nimport { type SectionDetails } from './shared';\nimport { CABTextSection } from './text';\n\nexport const CABProgressBarSection = z.object({\n /** Empty = shown everywhere; otherwise uppercase ISO country codes. */\n countryCodes: z.array(z.string()).default(() => []),\n name: z.string().optional(),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sections: z.union([z.array(CABTextSection), z.strictObject({}).transform(() => [])]).default(() => []),\n sectionType: z.literal(SectionType.progressBar).default(SectionType.progressBar),\n});\n\nexport type CABProgressBarSection = z.infer<typeof CABProgressBarSection>;\n\nexport type CABProgressBarSectionProps = CABProgressBarSection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { QuantityInput, quantityInputs, SectionType } from './common';\nimport { CABRule } from './rule';\nimport { type SectionDetails } from './shared';\n\nexport const CABQuantitySection = z.object({\n errorMessages: z\n .record(\n z.string(),\n z.object({\n max: z.string().optional(),\n min: z.string().optional(),\n neg: z.string().optional(),\n })\n )\n .default({\n en: {\n max: 'Maximum quantity allowed is {{max}}',\n min: 'Minimum quantity required is {{min}}',\n neg: 'Quantity cannot be negative',\n },\n }),\n inputType: z.enum(quantityInputs).default(QuantityInput.select),\n max: z.number().min(1).max(100).default(10),\n min: z.number().min(1).default(1),\n name: z.string().optional(),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.quantity).default(SectionType.quantity),\n});\n\nexport type CABQuantitySection = z.infer<typeof CABQuantitySection>;\n\nexport type CABQuantitySectionProps = CABQuantitySection & SectionDetails;\n", "import { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { ReviewsSize, reviewsSizes, SectionType } from './common';\nimport { CABRule } from './rule';\nimport { type SectionDetails } from './shared';\n\nexport const CABReviewsSection = z.object({\n color: z.string().default('#fadb14'),\n name: z.string().optional(),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.reviews).default(SectionType.reviews),\n size: z.enum(reviewsSizes).default(ReviewsSize.default),\n});\n\nexport type CABReviewsSection = z.infer<typeof CABReviewsSection>;\n\nexport type CABReviewsSectionProps = CABReviewsSection & SectionDetails;\n", "import { slice } from 'es-toolkit/compat';\nimport { v7 as uuidv7 } from 'uuid';\nimport { z } from 'zod/v4';\n\nimport { SectionType, VariantMode, variantModes, VariantSelector, variantSelectors } from './common';\nimport { CABRule } from './rule';\nimport { type SectionDetails } from './shared';\n\nexport const CABVariantsSection = z.object({\n hideOutOfStockVariants: z.boolean().default(false),\n name: z.string().optional(),\n rule: CABRule.optional(),\n sectionId: z.uuid().default(() => uuidv7()),\n sectionType: z.literal(SectionType.variants).default(SectionType.variants),\n selector: z.enum(slice(variantSelectors, 0, 3)).default(VariantSelector.menu),\n variantMode: z.enum(variantModes).default(VariantMode.multiple),\n});\n\nexport type CABVariantsSection = z.infer<typeof CABVariantsSection>;\n\nexport type CABVariantsSectionProps = CABVariantsSection & SectionDetails;\n", "const HTML_COMMENT_RE = /<!--[\\s\\S]*?-->/g;\nconst STRIPPED_ELEMENT_RE = /<(script|style|iframe|object|embed|noscript|template)\\b[^>]*>[\\s\\S]*?(?:<\\/\\1\\s*>|$)/gi;\nconst HTML_TAG_RE = /<\\/?[a-zA-Z][^>]*>/g;\n\nexport const stripContentBlockHtml = (text: string): string =>\n text.replace(HTML_COMMENT_RE, '').replace(STRIPPED_ELEMENT_RE, '').replace(HTML_TAG_RE, '');\n", "import { TiptapParagraph, type TiptapText } from '~/schema/widgets/checkout-and-beyond/text';\nimport { stripContentBlockHtml } from '~/transforms/contentBlockV1/stripContentBlockHtml';\n\ntype ConvertTextToTiptapArgs = {\n color: string;\n fontSize: string;\n marks?: NonNullable<TiptapText['marks']>;\n text: string;\n textAlign: 'start' | 'center' | 'end';\n};\n\nexport const convertTextToTiptapParagraph = ({\n color,\n fontSize,\n marks = [],\n text,\n textAlign,\n}: ConvertTextToTiptapArgs): TiptapParagraph => {\n const sanitizedText = stripContentBlockHtml(text);\n\n return TiptapParagraph.parse({\n attrs: { textAlign },\n content: sanitizedText\n ? [\n {\n marks: [{ attrs: { color, fontSize }, type: 'textStyle' }, ...marks],\n text: sanitizedText,\n type: 'text',\n },\n ]\n : [],\n type: 'paragraph',\n });\n};\n", "/**\n * Minimal v1 content-block input types. The legacy `/widgets/settings` endpoint\n * returns the widget's settings object directly (no envelope), so the converter\n * input is just `{ id, settings }` \u2014 `name` / `owner` aren't in the upstream\n * response and would be set to schema defaults in the produced `CABRootSection`.\n */\n\nexport const SHOPIFY_CHECKOUT_EXTENSION_CONTENT_BLOCK = 'ui_extension_content_block' as const;\n\n/** Pixel threshold above which an aside-placed image is forced to top placement. */\nexport const CONTENT_BLOCK_MAX_IMAGE_WIDTH = 560;\n\nexport type V1ImagePlacement = 'top' | 'right' | 'bottom' | 'left';\n\nexport type V1ImageBlock = {\n altText?: string | null;\n category?: string;\n description?: string | null;\n filename?: string;\n id: string;\n imagePlacement: V1ImagePlacement;\n imageSize: number;\n imageUrl: string;\n index?: number;\n textAlignment?: 'left' | 'center' | 'right';\n textSize?: string;\n};\n\nexport type V1Language = {\n description?: string;\n superTitle?: string;\n title?: string;\n};\n\nexport type V1Settings = {\n blockSpacing?: string;\n imageBlocks?: V1ImageBlock[];\n imageLayout?: 'row' | 'column';\n language?: V1Language;\n location?: 'checkout' | 'order-status' | 'thank-you';\n previewMode?: boolean;\n type: typeof SHOPIFY_CHECKOUT_EXTENSION_CONTENT_BLOCK;\n version: 1;\n};\n\nexport type V1ConvertInput = {\n id: number;\n settings: V1Settings;\n};\n\nexport const isContentBlockV1 = (data: unknown): data is V1Settings => {\n if (!data || typeof data !== 'object') return false;\n\n const obj = data as Record<string, unknown>;\n\n return obj.version === 1 && obj.type === SHOPIFY_CHECKOUT_EXTENSION_CONTENT_BLOCK;\n};\n", "import { CABImageSection } from '~/schema/widgets/checkout-and-beyond/image';\nimport { CABLayoutSection } from '~/schema/widgets/checkout-and-beyond/layout';\nimport { CABTextSection } from '~/schema/widgets/checkout-and-beyond/text';\nimport { convertTextToTiptapParagraph } from '~/transforms/contentBlockV1/convertTextToTiptapParagraph';\nimport { stripContentBlockHtml } from '~/transforms/contentBlockV1/stripContentBlockHtml';\nimport {\n CONTENT_BLOCK_MAX_IMAGE_WIDTH,\n type V1ImageBlock,\n type V1ImagePlacement,\n} from '~/transforms/contentBlockV1/types';\n\nconst V1_TO_CAB_ALIGN = { center: 'center', left: 'start', right: 'end' } as const;\n\n/**\n * When an aside-placed image hits the max width, the legacy renderer forces\n * placement to `top` so the description doesn't get squeezed into a zero-width\n * column. Replicate here so the v2 layout matches what the legacy React widget\n * actually displayed.\n */\nconst resolveEffectivePlacement = (placement: V1ImagePlacement, imageSize: number): V1ImagePlacement => {\n const isAside = placement === 'left' || placement === 'right';\n\n return imageSize >= CONTENT_BLOCK_MAX_IMAGE_WIDTH && isAside ? 'top' : placement;\n};\n\n/**\n * The divisor is the same constant the legacy renderer clamps at (560), so an\n * `imageSize = 560` block renders at 100% \u2014 matching the legacy behavior\n * where 560 was the full layout width.\n */\nconst widthPercentForImageSize = (imageSize: number): number =>\n Math.min(Math.round((imageSize / CONTENT_BLOCK_MAX_IMAGE_WIDTH) * 100), 100);\n\nexport const convertContentBlockImageToV2 = (block: V1ImageBlock): CABImageSection | CABLayoutSection => {\n const { altText, category, description, id, imagePlacement, imageSize, imageUrl, textAlignment, textSize } = block;\n const placement = resolveEffectivePlacement(imagePlacement, imageSize);\n\n const imageSection = CABImageSection.parse({\n altText: stripContentBlockHtml(altText ?? ''),\n category,\n sectionId: id,\n sectionType: 'image',\n source: imageUrl,\n width: widthPercentForImageSize(imageSize),\n });\n\n if (!description) return imageSection;\n\n const textSection = CABTextSection.parse({\n content: {\n en: {\n attrs: { blockSpacing: 'base' },\n content: [\n convertTextToTiptapParagraph({\n color: 'base',\n fontSize: textSize ?? 'base',\n text: description,\n textAlign: textAlignment ? V1_TO_CAB_ALIGN[textAlignment] : 'start',\n }),\n ],\n type: 'doc',\n },\n },\n sectionType: 'text',\n });\n\n return CABLayoutSection.parse({\n alignment: { horizontal: 'center', vertical: 'middle' },\n direction: placement === 'left' || placement === 'right' ? 'columns' : 'rows',\n sections:\n placement === 'left' || placement === 'top' ? [imageSection, textSection] : [textSection, imageSection],\n sectionType: 'layout',\n spacing: 'tight',\n });\n};\n", "import { TiptapDocument } from '~/schema/widgets/checkout-and-beyond/text';\nimport { convertTextToTiptapParagraph } from '~/transforms/contentBlockV1/convertTextToTiptapParagraph';\nimport { type V1Language } from '~/transforms/contentBlockV1/types';\n\nexport const convertContentBlockTextToV2 = (language: V1Language | undefined): TiptapDocument => {\n const description = language?.description;\n const superTitle = language?.superTitle;\n const title = language?.title;\n\n return TiptapDocument.parse({\n attrs: { blockSpacing: 'tight' },\n content: [\n superTitle\n ? convertTextToTiptapParagraph({\n color: 'base',\n fontSize: 'extraLarge',\n marks: [{ type: 'bold' }],\n text: superTitle,\n textAlign: 'center',\n })\n : null,\n title\n ? convertTextToTiptapParagraph({\n color: 'base',\n fontSize: 'medium',\n marks: [{ type: 'bold' }],\n text: title,\n textAlign: 'center',\n })\n : null,\n description\n ? convertTextToTiptapParagraph({\n color: 'base',\n fontSize: 'base',\n text: description,\n textAlign: 'center',\n })\n : null,\n ].filter((p): p is NonNullable<typeof p> => p !== null),\n type: 'doc',\n });\n};\n", "import { z } from 'zod/v4';\n\nimport { EditorMode, editorModes } from './common';\nimport { targetAreas, WidgetType, widgetTypes } from './constants';\nimport { CABLayoutSection } from './layout';\n\nconst TargetArea = z\n .object({\n fill: z.boolean().optional(),\n flip: z.enum(['both', 'horizontal', 'vertical']).optional(),\n icon: z.string(),\n label: z.string(),\n width: z.string(),\n })\n .default(targetAreas[EditorMode.checkoutExtension][1]);\n\nexport type TargetArea = {\n fill?: boolean;\n flip?: 'horizontal' | 'vertical' | 'both';\n icon: string;\n label: string;\n width: string;\n};\n\nexport const CABTracking = z\n .object({\n enableAttribution: z.boolean().default(true),\n enableSource: z.boolean().default(true),\n enableWidget: z.boolean().default(true),\n })\n .default({ enableAttribution: true, enableSource: true, enableWidget: true });\n\nexport type CABTracking = z.infer<typeof CABTracking>;\n\nexport const CABRootSection = CABLayoutSection.extend({\n editorMode: z.enum(editorModes).default(EditorMode.checkoutExtension),\n previewMode: z.boolean().default(false),\n storeId: z.number().nullable().default(null),\n targetArea: TargetArea.nullable(),\n tracking: CABTracking,\n type: z.enum(widgetTypes).default(WidgetType.ui_extension_content_block),\n version: z.literal(2).default(2),\n widgetId: z.number().nullable().default(null),\n});\n\nexport type CABRootSection = CABLayoutSection & {\n editorMode: EditorMode;\n previewMode: boolean;\n storeId: number | null;\n targetArea: TargetArea | null;\n tracking: CABTracking;\n type: WidgetType;\n version: number;\n widgetId: number | null;\n};\n", "import { CABRootSection } from '~/schema/widgets/checkout-and-beyond/root';\nimport { convertContentBlockImageToV2 } from '~/transforms/contentBlockV1/convertContentBlockImageToV2';\nimport { convertContentBlockTextToV2 } from '~/transforms/contentBlockV1/convertContentBlockTextToV2';\nimport {\n SHOPIFY_CHECKOUT_EXTENSION_CONTENT_BLOCK,\n type V1ConvertInput,\n type V1Language,\n} from '~/transforms/contentBlockV1/types';\n\nconst LOCATION_TO_EDITOR_MODE = {\n checkout: 'checkoutExtension',\n 'order-status': 'orderStatusPage',\n 'thank-you': 'thankYouPage',\n} as const;\n\nconst hasText = (language: V1Language | undefined): boolean =>\n !!language && !!(language.description || language.superTitle || language.title);\n\n/** Translates a v1 content-block widget into a fully-formed `CABRootSection`. */\nexport const convertContentBlockToV2 = ({ id, settings }: V1ConvertInput): CABRootSection => {\n const imageBlocks = settings.imageBlocks ?? [];\n\n return CABRootSection.parse({\n alignment: { horizontal: 'center', vertical: 'top' },\n direction: 'rows',\n editorMode: LOCATION_TO_EDITOR_MODE[settings.location ?? 'checkout'],\n previewMode: settings.previewMode,\n sections: [\n hasText(settings.language)\n ? {\n content: { en: convertContentBlockTextToV2(settings.language) },\n sectionType: 'text',\n }\n : null,\n imageBlocks.length > 0\n ? {\n // Legacy centers every image block (`InlineLayout inlineAlignment=\"center\"`).\n alignment: { horizontal: 'center', vertical: 'middle' },\n // Legacy: `image_layout === 'row' ? BlockStack : InlineStack` \u2014 an UNSET layout is\n // horizontal (columns), so only an explicit 'row' may stack vertically.\n direction: settings.imageLayout === 'row' ? 'rows' : 'columns',\n sections: imageBlocks.map(convertContentBlockImageToV2),\n sectionType: 'layout',\n spacing: settings.blockSpacing ?? 'extraTight',\n }\n : null,\n ].filter((section): section is NonNullable<typeof section> => section !== null),\n sectionType: 'layout',\n type: SHOPIFY_CHECKOUT_EXTENSION_CONTENT_BLOCK,\n version: 2,\n widgetId: id,\n });\n};\n", "const ARRAY_INDEX_STRING = /^(?:0|[1-9]\\d*)$/;\n\nconst isPlainObject = (input: unknown): input is Record<string, unknown> => {\n if (input === null || typeof input !== 'object') return false;\n\n const proto = Object.getPrototypeOf(input) as object | null;\n\n return proto === Object.prototype || proto === null;\n};\n\nconst hasOnlyNumericKeys = (input: Record<string, unknown>): boolean => {\n const keys = Object.keys(input);\n\n if (keys.length === 0) return false;\n\n if (!keys.every((key) => ARRAY_INDEX_STRING.test(key) && Number.isSafeInteger(Number(key)))) return false;\n\n // Require the indices to form a complete `0..n-1` sequence \u2014 `{ \"10\": \"a\", \"20\": \"b\" }`\n // would otherwise silently collapse into `[\"a\", \"b\"]` and lose its original positions.\n const sorted = keys.map(Number).sort((a, b) => a - b);\n\n return sorted.every((n, i) => n === i);\n};\n\nconst numericObjectToArray = (input: Record<string, unknown>): unknown[] =>\n Object.entries(input)\n .sort(([a], [b]) => Number(a) - Number(b))\n .map(([, value]) => value);\n\n/**\n * Recursively converts objects whose keys are a complete `0..n-1` sequence\n * (PHP-serialized \"sparse\" arrays) into real arrays. Everything else passes\n * through unchanged.\n */\nexport const convertNumericObjects = (input: unknown): unknown => {\n if (Array.isArray(input)) return input.map(convertNumericObjects);\n\n if (isPlainObject(input)) {\n if (hasOnlyNumericKeys(input)) return numericObjectToArray(input).map(convertNumericObjects);\n\n const out: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(input)) out[key] = convertNumericObjects(value);\n\n return out;\n }\n\n return input;\n};\n", "const isPlainObject = (input: unknown): input is Record<string, unknown> => {\n if (input === null || typeof input !== 'object') return false;\n\n const proto = Object.getPrototypeOf(input) as object | null;\n\n return proto === Object.prototype || proto === null;\n};\n\nconst camelCase = (key: string): string =>\n key.replace(/[-_\\s]+(.)?/g, (_, char: string | undefined) => (char ? char.toUpperCase() : ''));\n\nexport type ToCamelCase<S extends string> = S extends `${infer Head}_${infer Tail}` | `${infer Head}-${infer Tail}`\n ? `${Head}${Capitalize<ToCamelCase<Tail>>}`\n : S;\n\nexport type DeepCamelCase<T> = T extends (infer U)[]\n ? DeepCamelCase<U>[]\n : T extends object\n ? { [K in keyof T as ToCamelCase<K & string>]: DeepCamelCase<T[K]> }\n : T;\n\n/**\n * Recursively converts object keys to camelCase. Snake_case and kebab-case\n * are both handled; numeric array indices and primitives pass through\n * unchanged.\n *\n * Language keys used by the CAB schema (`text.content[<lang>]`, etc.) are\n * authored as plain lowercase tags (`en`, `de`, `fr`) by us \u2014 they have no\n * `_` or `-` to convert and survive camelCase as-is.\n */\nexport const deepCamelCase = <T>(input: T): DeepCamelCase<T> => {\n if (Array.isArray(input)) return input.map((item) => deepCamelCase(item)) as DeepCamelCase<T>;\n\n if (isPlainObject(input)) {\n const out: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(input)) {\n out[camelCase(key)] = deepCamelCase(value);\n }\n\n return out as DeepCamelCase<T>;\n }\n\n return input as DeepCamelCase<T>;\n};\n", "import { type TextColorName, type TextSizeName } from '~/schema/widgets/checkout-and-beyond/common';\nimport { type Mark } from '~/transforms/htmlToTiptap/types';\n\nexport const buildDefaultTextStyleMark = (\n style: { color?: TextColorName; fontSize?: TextSizeName } | undefined\n): Mark | null => {\n if (!style || (style.color === undefined && style.fontSize === undefined)) return null;\n\n return {\n attrs: {\n color: style.color ?? 'base',\n fontSize: style.fontSize ?? 'base',\n },\n type: 'textStyle',\n };\n};\n", "import { type StackEntry } from '~/transforms/htmlToTiptap/types';\n\nexport const closeTag = (stack: StackEntry[], name: string): void => {\n for (let index = stack.length - 1; index >= 0; index--) {\n if (stack[index].tag === name) {\n stack.length = index;\n break;\n }\n }\n};\n", "export const TAG_RE = /<(\\/)?([a-zA-Z][a-zA-Z0-9]*)((?:\\s+[^>]*?)?)\\s*(\\/)?>/g;\n\n/**\n * Tags that introduce a paragraph break on both open and close. Container tags\n * like `ul`/`ol`/`dl` are intentionally NOT here \u2014 their child `li`/`dt`/`dd`\n * elements already break, and including the containers would double-flush.\n */\nexport const BLOCK_TAGS = new Set([\n 'article',\n 'aside',\n 'blockquote',\n 'dd',\n 'div',\n 'dt',\n 'figcaption',\n 'figure',\n 'footer',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'header',\n 'hr',\n 'li',\n 'main',\n 'nav',\n 'p',\n 'pre',\n 'section',\n]);\n", "import { TiptapParagraph, type TiptapText } from '~/schema/widgets/checkout-and-beyond/text';\n\nexport const makeParagraph = (content: TiptapText[]): TiptapParagraph => TiptapParagraph.parse({ content });\n", "import { makeParagraph } from '~/transforms/htmlToTiptap/makeParagraph';\nimport { type State } from '~/transforms/htmlToTiptap/types';\n\nexport const flushParagraph = (state: State): void => {\n state.paragraphs.push(makeParagraph(state.currentRuns));\n state.currentRuns = [];\n};\n", "import { type StackEntry } from '~/transforms/htmlToTiptap/types';\n\nexport const isSkipping = (stack: StackEntry[] = []): boolean => stack.some(({ skip }) => skip);\n", "import { type Spacing } from '~/schema/widgets/checkout-and-beyond/common';\nimport { TiptapDocument, type TiptapParagraph } from '~/schema/widgets/checkout-and-beyond/text';\n\nexport const makeDoc = (content: TiptapParagraph[], blockSpacing: Spacing): TiptapDocument =>\n TiptapDocument.parse({ attrs: { blockSpacing }, content });\n", "const DYNAMIC_TOKEN_REGEX = /^\\{\\{\\s*[A-Za-z]+\\s*\\}\\}$/;\n\n/**\n * Protocols we'll preserve on `<a href>` when converting HTML to Tiptap. Any URL\n * whose `URL.protocol` falls outside this set (e.g. `javascript:`, `data:`,\n * `file:`, `vbscript:`) is dropped from the link mark \u2014 the text content is\n * kept but the click target is not. Renderers downstream still get to do their\n * own validation, but the package shouldn't be the one preserving an XSS\n * payload through the conversion.\n */\nconst ALLOWED_PROTOCOLS = new Set(['http:', 'https:', 'mailto:', 'tel:']);\n\n/**\n * Decides whether an `<a href>` value should survive HTML \u2192 Tiptap conversion\n * as a link mark. Allows `#`, dynamic `{{token}}` placeholders, and a fixed\n * allowlist of URL schemes; everything else (including `javascript:`, `data:`,\n * relative paths, and malformed URLs) drops the link mark while keeping the\n * surrounding text.\n *\n * @param href - Raw `href` attribute from the source HTML.\n *\n * @returns `true` if the URL should be preserved as a link mark.\n */\nexport const isValidHref = (href: string): boolean => {\n if (!href) return false;\n\n if (href === '#') return true;\n\n if (DYNAMIC_TOKEN_REGEX.test(href)) return true;\n\n try {\n const url = new URL(href);\n\n return ALLOWED_PROTOCOLS.has(url.protocol);\n } catch {\n return false;\n }\n};\n", "import { isValidHref } from '~/transforms/htmlToTiptap/isValidHref';\nimport { type Mark } from '~/transforms/htmlToTiptap/types';\n\n/**\n * The schema defaults for an `<a>` mark when the source HTML omits them. Match\n * `TiptapText` in `~/schema/widgets/checkout-and-beyond/text` so the sanitizer\n * resolves the same effective values the downstream parse would have used.\n */\nconst DEFAULT_TARGET = '_blank';\nconst DEFAULT_REL = 'noopener noreferrer nofollow';\n\n/**\n * Forces `noopener noreferrer` on every `_blank` link to defend against\n * reverse-tabnabbing (window.opener attacks). When the source omits `rel`\n * entirely, fall back to the schema default (`noopener noreferrer nofollow`).\n * When source `rel` is non-empty, preserve the existing tokens, drop `opener`,\n * and ensure the safe pair is present.\n *\n * Non-`_blank` targets pass through unchanged \u2014 they can't be tabnabbed.\n */\nconst ensureSafeRel = (rel: string, target: string): string => {\n if (target !== '_blank') return rel;\n\n const sourceTokens = (rel ?? '').split(/\\s+/).filter(Boolean);\n\n if (sourceTokens.length === 0) return DEFAULT_REL;\n\n const tokens = new Set(sourceTokens.filter((token) => token.toLowerCase() !== 'opener'));\n\n tokens.add('noopener');\n tokens.add('noreferrer');\n\n return Array.from(tokens).join(' ');\n};\n\nexport const buildLinkMark = (attrs: Record<string, string> = {}): Mark | null => {\n const { href } = attrs;\n\n if (!href || !isValidHref(href)) return null;\n\n // Resolve target BEFORE sanitizing rel so the safety guard sees the same\n // value the downstream schema parse will use.\n const target = attrs.target ?? DEFAULT_TARGET;\n\n return {\n attrs: {\n class: null,\n href,\n rel: ensureSafeRel(attrs.rel, target),\n target,\n },\n type: 'link',\n };\n};\n", "const NAMED_ENTITIES: Record<string, string> = {\n amp: '&',\n apos: \"'\",\n copy: '\u00A9',\n gt: '>',\n hellip: '\u2026',\n ldquo: '\u201C',\n lsquo: '\u2018',\n lt: '<',\n mdash: '\u2014',\n nbsp: ' ',\n ndash: '\u2013',\n quot: '\"',\n rdquo: '\u201D',\n reg: '\u00AE',\n rsquo: '\u2019',\n trade: '\u2122',\n} as const;\n\nexport const decodeEntities = (input: string = ''): string =>\n input.replace(/&(#x[\\da-f]+|#\\d+|[a-z][a-z\\d]*);/gi, (match, code: string) => {\n if (code[0] !== '#') return NAMED_ENTITIES[code.toLowerCase()] ?? match;\n\n const isHex = /^#x/i.test(code);\n const cp = parseInt(code.slice(isHex ? 2 : 1), isHex ? 16 : 10);\n\n return Number.isInteger(cp) && cp >= 0 && cp <= 0x10ffff ? String.fromCodePoint(cp) : match;\n });\n", "import { decodeEntities } from '~/transforms/htmlToTiptap/decodeEntities';\n\nconst ATTRIB_RE = /([a-zA-Z_:][\\w:.-]*)(?:\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)'|([^\\s\"'`=<>]+)))?/g;\n\nexport const parseAttribs = (attrString: string): Record<string, string> => {\n const result: Record<string, string> = {};\n let match: RegExpExecArray | null;\n\n ATTRIB_RE.lastIndex = 0;\n\n while ((match = ATTRIB_RE.exec(attrString)) !== null) {\n result[match[1].toLowerCase()] = decodeEntities(match[2] ?? match[3] ?? match[4] ?? '');\n }\n\n return result;\n};\n", "import { type TextSizeName } from '~/schema/widgets/checkout-and-beyond/common';\nimport { buildLinkMark } from '~/transforms/htmlToTiptap/buildLinkMark';\nimport { parseAttribs } from '~/transforms/htmlToTiptap/parseAttribs';\nimport { type Mark, type StackEntry } from '~/transforms/htmlToTiptap/types';\n\nconst INLINE_MARK_TAGS: Record<string, 'bold' | 'italic' | 'strike'> = {\n b: 'bold',\n del: 'strike',\n em: 'italic',\n i: 'italic',\n s: 'strike',\n strike: 'strike',\n strong: 'bold',\n};\n\nconst HEADING_FONT_SIZE: Record<string, TextSizeName> = {\n h1: 'extraLarge',\n h2: 'large',\n h3: 'medium',\n h4: 'base',\n h5: 'small',\n h6: 'small',\n};\n\nconst STRIPPED_TAGS = ['embed', 'iframe', 'noscript', 'object', 'script', 'style', 'template'];\n\nconst marksForTag = (name: string, attrs: string): Mark[] => {\n if (INLINE_MARK_TAGS[name]) return [{ type: INLINE_MARK_TAGS[name] }];\n\n if (HEADING_FONT_SIZE[name]) {\n return [{ type: 'bold' }, { attrs: { color: 'base', fontSize: HEADING_FONT_SIZE[name] }, type: 'textStyle' }];\n }\n\n if (name === 'a') {\n const link = buildLinkMark(parseAttribs(attrs));\n\n return link ? [link] : [];\n }\n\n return [];\n};\n\nexport const openTag = (stack: StackEntry[], name: string, attrs: string): void => {\n stack.push({\n marks: marksForTag(name, attrs),\n skip: STRIPPED_TAGS.includes(name),\n tag: name,\n });\n};\n", "import { TiptapText } from '~/schema/widgets/checkout-and-beyond/text';\n\nimport { decodeEntities } from '~/transforms/htmlToTiptap/decodeEntities';\nimport { flushParagraph } from '~/transforms/htmlToTiptap/flushParagraph';\nimport { isSkipping } from '~/transforms/htmlToTiptap/isSkipping';\nimport { type Mark, type State } from '~/transforms/htmlToTiptap/types';\n\nexport const pushText = (state: State, rawText: string): void => {\n if (!rawText || isSkipping(state.stack)) return;\n\n decodeEntities(rawText)\n .split('\\n')\n .forEach((segment, index) => {\n if (index > 0) flushParagraph(state);\n\n if (!segment) return;\n\n const marks: Mark[] = state.stack.flatMap((entry) => entry.marks);\n\n if (state.defaultTextStyleMark && !marks.some((mark) => mark.type === 'textStyle')) {\n marks.push(state.defaultTextStyleMark);\n }\n\n state.currentRuns.push(TiptapText.parse(marks.length > 0 ? { marks, text: segment } : { text: segment }));\n });\n};\n", "const HTML_COMMENT_RE = /<!--[\\s\\S]*?-->/g;\n\nexport const stripHtmlComments = (html: string = ''): string => html.replace(HTML_COMMENT_RE, '');\n", "import { type Spacing, type TextColorName, type TextSizeName } from '~/schema/widgets/checkout-and-beyond/common';\nimport { type TiptapDocument } from '~/schema/widgets/checkout-and-beyond/text';\nimport { buildDefaultTextStyleMark } from '~/transforms/htmlToTiptap/buildDefaultTextStyleMark';\nimport { closeTag } from '~/transforms/htmlToTiptap/closeTag';\nimport { BLOCK_TAGS, TAG_RE } from '~/transforms/htmlToTiptap/constants';\nimport { flushParagraph } from '~/transforms/htmlToTiptap/flushParagraph';\nimport { isSkipping } from '~/transforms/htmlToTiptap/isSkipping';\nimport { makeDoc } from '~/transforms/htmlToTiptap/makeDoc';\nimport { makeParagraph } from '~/transforms/htmlToTiptap/makeParagraph';\nimport { openTag } from '~/transforms/htmlToTiptap/openTag';\nimport { pushText } from '~/transforms/htmlToTiptap/pushText';\nimport { stripHtmlComments } from '~/transforms/htmlToTiptap/stripHtmlComments';\nimport { type State } from '~/transforms/htmlToTiptap/types';\n\nexport type HtmlToTiptapOptions = {\n blockSpacing?: Spacing;\n defaultTextStyle?: { color?: TextColorName; fontSize?: TextSizeName };\n};\n\nconst maybeFlushParagraph = (state: State): void => {\n if (state.currentRuns.length > 0) flushParagraph(state);\n};\n\nexport const htmlToTiptap = (html: string, options: HtmlToTiptapOptions = {}): TiptapDocument => {\n const state: State = {\n currentRuns: [],\n defaultTextStyleMark: buildDefaultTextStyleMark(options.defaultTextStyle),\n listStack: [],\n paragraphs: [],\n stack: [],\n };\n const blockSpacing = options.blockSpacing ?? 'base';\n\n if (typeof html !== 'string' || !html) return makeDoc([makeParagraph([])], blockSpacing);\n\n const htmlWithoutComments = stripHtmlComments(html);\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n TAG_RE.lastIndex = 0;\n\n while ((match = TAG_RE.exec(htmlWithoutComments)) !== null) {\n const [full, slash, rawName, attrs, selfClose] = match;\n\n if (match.index > lastIndex) pushText(state, htmlWithoutComments.slice(lastIndex, match.index));\n\n lastIndex = match.index + full.length;\n\n const name = rawName.toLowerCase();\n\n if (slash) {\n closeTag(state.stack, name);\n\n if (name === 'ul' || name === 'ol') state.listStack.pop();\n\n if (BLOCK_TAGS.has(name) && !isSkipping(state.stack)) maybeFlushParagraph(state);\n } else if (name === 'br') {\n if (!isSkipping(state.stack)) flushParagraph(state);\n } else if (name === 'hr') {\n if (!isSkipping(state.stack)) {\n maybeFlushParagraph(state);\n pushText(state, '\u2014\u2014\u2014');\n flushParagraph(state);\n }\n } else if (!selfClose) {\n if (BLOCK_TAGS.has(name) && !isSkipping(state.stack)) maybeFlushParagraph(state);\n\n if (name === 'ul' || name === 'ol') state.listStack.push({ counter: 0, ordered: name === 'ol' });\n\n openTag(state.stack, name, attrs);\n\n if (name === 'li' && state.listStack.length > 0) {\n const top = state.listStack[state.listStack.length - 1]!;\n\n if (top.ordered) top.counter += 1;\n\n pushText(state, top.ordered ? `${top.counter}. ` : '\u2022 ');\n }\n }\n }\n\n if (lastIndex < htmlWithoutComments.length) pushText(state, htmlWithoutComments.slice(lastIndex));\n\n maybeFlushParagraph(state);\n\n if (state.paragraphs.length === 0) flushParagraph(state);\n\n return makeDoc(state.paragraphs, blockSpacing);\n};\n", "/**\n * True when the input has `version === 2` \u2014 the marker for a current-generation\n * Checkout-and-Beyond root section. The transformer for CAB (`CABRootSection.parse`)\n * should ONLY run on values that pass this check; v1 widget shapes either get\n * converted (e.g. via `convertContentBlockToV2`) or pass through unchanged.\n *\n * @param input - The post-camelCase, post-numeric-fix upstream payload.\n *\n * @returns `true` if `input.version === 2`, otherwise `false`.\n */\nexport const isCABRootSection = (input: unknown): boolean => {\n if (!input || typeof input !== 'object') return false;\n\n return (input as { version?: unknown }).version === 2;\n};\n", "/**\n * Default localized labels for the switch-to-subscription button content, keyed by `buttonField` then locale.\n * The single source of truth shared by the admin editor and the read-time `convertLineItemEditorToV2` transform\n * so a widget renders identically whether migrated in admin or converted on the fly. `{{subscriptionDiscount}}`\n * is substituted per-plan at render \u2014 CAB tokens are camelCase by default; a legacy snake_case token in a v1\n * merchant override still resolves (the client camelCases unknown token keys against its camelCase variables).\n * `subscriptionOption` is the frequency-select option template (legacy\n * `SwitchToSubscriptionLanguageDefaults.subscription_option_label`); the client resolves `{{interval}}`\n * through `Intl.NumberFormat` unit style, so the noun arrives in the buyer's language, pluralized per count\n * from the runtime's CLDR data (English CLDR nouns are lowercase \u2014 an accepted divergence from legacy).\n */\nexport const SWITCH_LABELS = {\n subscriptionOption: {\n ar: '\u064A\u062A\u0645 \u0627\u0644\u062A\u0648\u0635\u064A\u0644 \u0643\u0644 {{frequency}} {{interval}}',\n cs: 'Doru\u010Den\u00ED ka\u017Ed\u00FDch {{frequency}} {{interval}}',\n da: 'Leveres hver {{frequency}} {{interval}}',\n de: 'Lieferung alle {{frequency}} {{interval}}',\n en: 'Delivers every {{frequency}} {{interval}}',\n es: 'Entrega cada {{frequency}} {{interval}}',\n fi: 'Toimitus {{frequency}} {{interval}} v\u00E4lein',\n fr: 'Livraison tous les {{frequency}} {{interval}}',\n ga: 'Seachadtar gach {{frequency}} {{interval}}',\n he: '\u05DE\u05E9\u05DC\u05D5\u05D7 \u05DB\u05DC {{frequency}} {{interval}}',\n hi: '\u0939\u0930 {{frequency}} {{interval}} \u092E\u0947\u0902 \u0921\u093F\u0932\u0940\u0935\u0930\u0940',\n id: 'Dikirim setiap {{frequency}} {{interval}}',\n it: 'Consegna ogni {{frequency}} {{interval}}',\n ja: '{{frequency}} {{interval}}\u3054\u3068\u306B\u304A\u5C4A\u3051',\n ko: '{{frequency}} {{interval}}\uB9C8\uB2E4 \uBC30\uC1A1',\n nl: 'Wordt elke {{frequency}} {{interval}} geleverd',\n no: 'Leveres hver {{frequency}} {{interval}}',\n pl: 'Dostawa co {{frequency}} {{interval}}',\n pt: 'Entrega a cada {{frequency}} {{interval}}',\n ru: '\u0414\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u043A\u0430\u0436\u0434\u044B\u0435 {{frequency}} {{interval}}',\n sv: 'Levereras var {{frequency}} {{interval}}',\n th: '\u0E08\u0E31\u0E14\u0E2A\u0E48\u0E07\u0E17\u0E38\u0E01 {{frequency}} {{interval}}',\n tr: 'Her {{frequency}} {{interval}} aral\u0131\u011F\u0131nda teslimat',\n uk: '\u0414\u043E\u0441\u0442\u0430\u0432\u043A\u0430 \u043A\u043E\u0436\u043D\u0456 {{frequency}} {{interval}}',\n vi: 'Giao h\u00E0ng m\u1ED7i {{frequency}} {{interval}}',\n zh: '\u6BCF {{frequency}} {{interval}} \u914D\u9001\u4E00\u6B21',\n },\n switchToOneTimePurchase: {\n ar: '\u0627\u0644\u062A\u0628\u062F\u064A\u0644 \u0625\u0644\u0649 \u0634\u0631\u0627\u0621 \u0644\u0645\u0631\u0629 \u0648\u0627\u062D\u062F\u0629',\n cs: 'P\u0159epnout na jednor\u00E1zov\u00FD n\u00E1kup',\n da: 'Skift til engangsk\u00F8b',\n de: 'Zu einmaligem Kauf wechseln',\n en: 'Switch to One-time Purchase',\n es: 'Cambiar a compra \u00FAnica',\n fi: 'Vaihda kertaluonteiseen ostoon',\n fr: 'Passer \u00E0 un achat unique',\n ga: 'Athraigh go ceannach aonuaire',\n he: '\u05E2\u05D1\u05D5\u05E8 \u05DC\u05E8\u05DB\u05D9\u05E9\u05D4 \u05D7\u05D3-\u05E4\u05E2\u05DE\u05D9\u05EA',\n hi: '\u090F\u0915 \u092C\u093E\u0930 \u0915\u0940 \u0916\u0930\u0940\u0926 \u092A\u0930 \u0938\u094D\u0935\u093F\u091A \u0915\u0930\u0947\u0902',\n id: 'Beralih ke pembelian satu kali',\n it: 'Passa all\u2019acquisto una tantum',\n ja: '1\u56DE\u9650\u308A\u306E\u8CFC\u5165\u306B\u5207\u308A\u66FF\u3048\u308B',\n ko: '\uC77C\uD68C\uC131 \uAD6C\uB9E4\uB85C \uC804\uD658',\n nl: 'Overschakelen naar eenmalige aankoop',\n no: 'Bytt til engangskj\u00F8p',\n pl: 'Prze\u0142\u0105cz na jednorazowy zakup',\n pt: 'Mudar para compra \u00FAnica',\n ru: '\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043D\u0430 \u0440\u0430\u0437\u043E\u0432\u0443\u044E \u043F\u043E\u043A\u0443\u043F\u043A\u0443',\n sv: 'Byt till eng\u00E5ngsk\u00F6p',\n th: '\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E40\u0E1B\u0E47\u0E19\u0E01\u0E32\u0E23\u0E0B\u0E37\u0E49\u0E2D\u0E04\u0E23\u0E31\u0E49\u0E07\u0E40\u0E14\u0E35\u0E22\u0E27',\n tr: 'Tek seferlik sat\u0131n almaya ge\u00E7',\n uk: '\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u043D\u0430 \u043E\u0434\u043D\u043E\u0440\u0430\u0437\u043E\u0432\u0443 \u043F\u043E\u043A\u0443\u043F\u043A\u0443',\n vi: 'Chuy\u1EC3n sang mua m\u1ED9t l\u1EA7n',\n zh: '\u5207\u6362\u4E3A\u4E00\u6B21\u6027\u8D2D\u4E70',\n },\n switchToSubscriptionNoDiscount: {\n ar: '\u0627\u0644\u062A\u0628\u062F\u064A\u0644 \u0625\u0644\u0649 \u0627\u0634\u062A\u0631\u0627\u0643',\n cs: 'P\u0159epnout na p\u0159edplatn\u00E9',\n da: 'Skift til abonnement',\n de: 'Zu einem Abonnement wechseln',\n en: 'Switch to Subscription',\n es: 'Cambiar a suscripci\u00F3n',\n fi: 'Vaihda tilaukseen',\n fr: 'Passer \u00E0 un abonnement',\n ga: 'Athraigh go s\u00EDnti\u00FAs',\n he: '\u05E2\u05D1\u05D5\u05E8 \u05DC\u05DE\u05E0\u05D5\u05D9',\n hi: '\u0938\u0926\u0938\u094D\u092F\u0924\u093E \u092A\u0930 \u0938\u094D\u0935\u093F\u091A \u0915\u0930\u0947\u0902',\n id: 'Beralih ke langganan',\n it: 'Passa all\u2019abbonamento',\n ja: '\u5B9A\u671F\u8CFC\u5165\u306B\u5207\u308A\u66FF\u3048\u308B',\n ko: '\uAD6C\uB3C5\uC73C\uB85C \uC804\uD658',\n nl: 'Overschakelen naar abonnement',\n no: 'Bytt til abonnement',\n pl: 'Prze\u0142\u0105cz na subskrypcj\u0119',\n pt: 'Mudar para assinatura',\n ru: '\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043D\u0430 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443',\n sv: 'Byt till prenumeration',\n th: '\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E40\u0E1B\u0E47\u0E19\u0E01\u0E32\u0E23\u0E2A\u0E21\u0E31\u0E04\u0E23\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01',\n tr: 'Aboneli\u011Fe ge\u00E7',\n uk: '\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u043D\u0430 \u043F\u0456\u0434\u043F\u0438\u0441\u043A\u0443',\n vi: 'Chuy\u1EC3n sang \u0111\u0103ng k\u00FD',\n zh: '\u5207\u6362\u4E3A\u8BA2\u9605',\n },\n switchToSubscriptionWithDiscount: {\n ar: '\u0627\u0644\u062A\u0628\u062F\u064A\u0644 \u0625\u0644\u0649 \u0627\u0634\u062A\u0631\u0627\u0643 \u0648\u062A\u0648\u0641\u064A\u0631 {{subscriptionDiscount}}%',\n cs: 'P\u0159epnout na p\u0159edplatn\u00E9 a u\u0161et\u0159it {{subscriptionDiscount}} %',\n da: 'Skift til abonnement og spar {{subscriptionDiscount}}%',\n de: 'Zu einem Abonnement wechseln und {{subscriptionDiscount}} % sparen',\n en: 'Switch to Subscription & Save {{subscriptionDiscount}}%',\n es: 'Cambiar a suscripci\u00F3n y ahorrar {{subscriptionDiscount}}%',\n fi: 'Vaihda tilaukseen ja s\u00E4\u00E4st\u00E4 {{subscriptionDiscount}} %',\n fr: 'Passer \u00E0 un abonnement et \u00E9conomiser {{subscriptionDiscount}} %',\n ga: 'Athraigh go s\u00EDnti\u00FAs agus s\u00E1bh\u00E1il {{subscriptionDiscount}}%',\n he: '\u05E2\u05D1\u05D5\u05E8 \u05DC\u05DE\u05E0\u05D5\u05D9 \u05D5\u05D7\u05E1\u05D5\u05DA {{subscriptionDiscount}}%',\n hi: '\u0938\u0926\u0938\u094D\u092F\u0924\u093E \u092A\u0930 \u0938\u094D\u0935\u093F\u091A \u0915\u0930\u0947\u0902 \u0914\u0930 {{subscriptionDiscount}}% \u092C\u091A\u093E\u090F\u0902',\n id: 'Beralih ke langganan dan hemat {{subscriptionDiscount}}%',\n it: 'Passa all\u2019abbonamento e risparmia {{subscriptionDiscount}}%',\n ja: '\u5B9A\u671F\u8CFC\u5165\u306B\u5207\u308A\u66FF\u3048\u3066{{subscriptionDiscount}}%\u304A\u5F97',\n ko: '\uAD6C\uB3C5\uC73C\uB85C \uC804\uD658\uD558\uACE0 {{subscriptionDiscount}}% \uC808\uC57D',\n nl: 'Overschakelen naar abonnement en {{subscriptionDiscount}}% besparen',\n no: 'Bytt til abonnement og spar {{subscriptionDiscount}}%',\n pl: 'Prze\u0142\u0105cz na subskrypcj\u0119 i oszcz\u0119d\u017A {{subscriptionDiscount}}%',\n pt: 'Mudar para assinatura e economizar {{subscriptionDiscount}}%',\n ru: '\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u044C\u0441\u044F \u043D\u0430 \u043F\u043E\u0434\u043F\u0438\u0441\u043A\u0443 \u0438 \u0441\u044D\u043A\u043E\u043D\u043E\u043C\u0438\u0442\u044C {{subscriptionDiscount}}%',\n sv: 'Byt till prenumeration och spara {{subscriptionDiscount}}%',\n th: '\u0E40\u0E1B\u0E25\u0E35\u0E48\u0E22\u0E19\u0E40\u0E1B\u0E47\u0E19\u0E01\u0E32\u0E23\u0E2A\u0E21\u0E31\u0E04\u0E23\u0E2A\u0E21\u0E32\u0E0A\u0E34\u0E01\u0E41\u0E25\u0E30\u0E1B\u0E23\u0E30\u0E2B\u0E22\u0E31\u0E14 {{subscriptionDiscount}}%',\n tr: 'Aboneli\u011Fe ge\u00E7 ve {{subscriptionDiscount}}% tasarruf et',\n uk: '\u041F\u0435\u0440\u0435\u043A\u043B\u044E\u0447\u0438\u0442\u0438\u0441\u044F \u043D\u0430 \u043F\u0456\u0434\u043F\u0438\u0441\u043A\u0443 \u0442\u0430 \u0437\u0430\u043E\u0449\u0430\u0434\u0438\u0442\u0438 {{subscriptionDiscount}}%',\n vi: 'Chuy\u1EC3n sang \u0111\u0103ng k\u00FD v\u00E0 ti\u1EBFt ki\u1EC7m {{subscriptionDiscount}}%',\n zh: '\u5207\u6362\u4E3A\u8BA2\u9605\u5E76\u8282\u7701 {{subscriptionDiscount}}%',\n },\n} as const satisfies Record<string, Record<string, string>>;\n", "import { WidgetType } from '~/schema/widgets/checkout-and-beyond/constants';\nimport { CABRootSection } from '~/schema/widgets/checkout-and-beyond/root';\nimport { SWITCH_LABELS } from '~/schema/widgets/checkout-and-beyond/switchLabels';\nimport { type LineItemEditorSwitchLanguageV1 } from '~/schema/widgets/lineItemEditor';\nimport { type V1LineItemEditorConvertInput } from '~/transforms/lineItemEditorV1/types';\n\n/** The v1 `switchToSubscription.language` key that overrides each `buttonField`'s English label. */\nconst OVERRIDE_KEY = {\n subscriptionOption: 'subscriptionOptionLabel',\n switchToOneTimePurchase: 'downgradeToOneTimeLabel',\n switchToSubscriptionNoDiscount: 'upgradeToSubscriptionWithoutDiscountLabel',\n switchToSubscriptionWithDiscount: 'upgradeToSubscriptionLabel',\n} as const satisfies Record<keyof typeof SWITCH_LABELS, keyof LineItemEditorSwitchLanguageV1>;\n\n/**\n * Translate a v1 line-item-editor widget into a `CABRootSection`: a `cartLine` section holding a\n * switch-to-subscription button, whose `buttonField`-tagged text labels use the shared localized\n * `SWITCH_LABELS` defaults with the v1 `switchToSubscription.language` value overriding `en` (same output the\n * admin editor produces, so runtime-converted and admin-migrated widgets render identically). The button is\n * omitted when the widget's switch is disabled.\n */\nconst BUTTON_KINDS = ['plain', 'primary', 'secondary'] as const;\n\nexport const convertLineItemEditorToV2 = ({ id, settings }: V1LineItemEditorConvertInput): CABRootSection => {\n const { switchToSubscription, switchToSubscriptionEnabled, tracking } = settings;\n const kind = settings.button?.kind;\n const buttonStyle = BUTTON_KINDS.includes(kind as (typeof BUTTON_KINDS)[number]) ? kind : 'plain';\n\n const labelSections = (Object.keys(SWITCH_LABELS) as (keyof typeof SWITCH_LABELS)[]).map((buttonField) => {\n // A defined v1 value ALWAYS passes through verbatim \u2014 even legacy's \"Upgrade/Downgrade\" defaults\n // saved into settings (product owner, 2026-07-02: existing widget language is never rewritten; the\n // neutral \"Switch to\u2026\" copy applies only as the default for blank values and new widgets). Blank /\n // whitespace falls back to the shared defaults (legacy `getLabelWithFallback` parity).\n const override = switchToSubscription?.language?.[OVERRIDE_KEY[buttonField]]?.trim();\n\n return {\n buttonField,\n content: override ? { ...SWITCH_LABELS[buttonField], en: override } : SWITCH_LABELS[buttonField],\n sectionType: 'text',\n };\n });\n\n return CABRootSection.parse({\n previewMode: settings.previewMode,\n sections: [\n {\n sections: switchToSubscriptionEnabled\n ? [\n {\n action: 'switchToSubscription',\n buttonStyle,\n disableDowngrade: switchToSubscription?.disableDowngrade ?? false,\n sections: labelSections,\n sectionType: 'button',\n },\n ]\n : [],\n sectionType: 'cartLine',\n },\n ],\n sectionType: 'layout',\n tracking: {\n enableAttribution: tracking?.enableAttribution ?? true,\n enableSource: tracking?.enableSource ?? true,\n enableWidget: tracking?.enableWidget ?? true,\n },\n type: WidgetType.ui_extension_line_item_editor,\n version: 2,\n widgetId: id,\n });\n};\n", "import { WidgetType } from '~/schema/widgets/checkout-and-beyond/constants';\nimport { type LineItemEditorV1 } from '~/schema/widgets/lineItemEditor';\n\n/**\n * The legacy `/widgets/settings` endpoint returns the widget's settings object directly (no envelope), so\n * the converter input is just `{ id, settings }` \u2014 the settings shape lives in the schema\n * (`LineItemEditorV1`) and is derived here, never re-declared.\n */\nexport type V1LineItemEditorConvertInput = {\n id: number;\n settings: LineItemEditorV1;\n};\n\n/** Identifies a v1 line-item-editor payload by version + type (mirrors `isContentBlockV1`). */\nexport const isLineItemEditorV1 = (data: unknown): data is LineItemEditorV1 => {\n if (!data || typeof data !== 'object') return false;\n\n const obj = data as Record<string, unknown>;\n\n return obj.version === 1 && obj.type === WidgetType.ui_extension_line_item_editor;\n};\n", "const DEFAULT_KNOWN_TOKENS = ['firstName', 'lastName', 'email'] as const;\n\nconst escapeForRegex = (literal: string): string => literal.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n/**\n * Rewrites legacy personalization tokens into the CAB-canonical `{{tokenName}}`\n * form expected by the client's `replaceVariables`. Specifically:\n *\n * - `{firstName}` (single brace) \u2192 `{{firstName}}`\n * - `{FirstName}` / `{FIRSTNAME}` (case variants) \u2192 `{{firstName}}`\n * - `{ firstName }` (internal whitespace) \u2192 `{{firstName}}`\n * - `{{firstName}}` (already canonical) \u2192 unchanged\n *\n * Pass `knownTokens` to control which names are normalized; anything not in the\n * list (e.g., an unrelated `{{foo}}` token) passes through untouched.\n */\nexport const normalizeTokens = (text: string, knownTokens: readonly string[] = DEFAULT_KNOWN_TOKENS): string => {\n if (typeof text !== 'string') return text;\n\n return knownTokens.reduce((acc, token) => {\n const pattern = new RegExp(`\\\\{{1,2}\\\\s*${escapeForRegex(token)}\\\\s*\\\\}{1,2}`, 'gi');\n\n return acc.replace(pattern, `{{${token}}}`);\n }, text);\n};\n", "import { htmlToTiptap } from '~/transforms/htmlToTiptap/htmlToTiptap';\nimport { normalizeTokens } from '~/transforms/normalizeTokens';\n\nconst HTML_TAG_RE = /<[a-zA-Z]/;\n\nconst containsHtml = (text: string): boolean => HTML_TAG_RE.test(text);\n\nconst isObject = (x: unknown): x is Record<string, unknown> => x !== null && typeof x === 'object' && !Array.isArray(x);\n\nconst normalizeLangValue = (value: unknown): unknown => {\n if (typeof value !== 'string') return value;\n\n const tokenized = normalizeTokens(value);\n\n return containsHtml(tokenized) ? htmlToTiptap(tokenized) : tokenized;\n};\n\n/**\n * Walks an untyped CABRootSection-shaped object (post deepCamelCase, pre schema\n * parse) and rewrites `text` sections' `content[lang]` strings so that:\n *\n * - `{firstName}` (single brace) becomes `{{firstName}}` (canonical), and\n * - HTML-laden strings become a fully-formed `TiptapDocument`.\n *\n * Plain strings pass through unchanged. Non-text sections only recurse into\n * their `sections` array; Tiptap docs and other nested objects are not walked.\n */\nexport const normalizeTextContent = (node: unknown): unknown => {\n if (Array.isArray(node)) return node.map(normalizeTextContent);\n\n if (!isObject(node)) return node;\n\n if (node.sectionType === 'text' && isObject(node.content)) {\n const nextContent: Record<string, unknown> = {};\n\n for (const [lang, value] of Object.entries(node.content)) {\n nextContent[lang] = normalizeLangValue(value);\n }\n\n return { ...node, content: nextContent };\n }\n\n if (Array.isArray(node.sections)) {\n return { ...node, sections: node.sections.map(normalizeTextContent) };\n }\n\n return node;\n};\n", "/**\n * Minimal v1 Offer (Checkout Offers / product recommendations) input types.\n * The legacy widget's settings `type` is the generic `shopify_checkout_extension`\n * (the offer is the \"base\" checkout-extension type; other widgets carry\n * `ui_extension_*`), which uniquely identifies it at the settings level.\n */\nimport { type TiptapDocument } from '~/schema/widgets/checkout-and-beyond/text';\n\nexport const SHOPIFY_CHECKOUT_EXTENSION = 'shopify_checkout_extension' as const;\n\nexport type V1OfferLanguage = {\n addedToCart?: string;\n addingToCart?: string;\n addToCart?: string;\n /** Subscribe \u2192 one-time label for the offers `switchToSubscription` button. */\n cartSwitchToOnetime?: string;\n /** One-time \u2192 subscribe label (carries `{{subscription_discount}}`) for the `switchToSubscription` button. */\n cartSwitchToSubscription?: string;\n description?: string;\n /** Real payload key is `sold_out_label` \u2192 `soldOutLabel` (NOT `soldOut`). */\n soldOutLabel?: string;\n /** Opt-in undo banner shown after a buyer adds a recommended product. */\n successBannerEnabled?: boolean;\n successBannerMessageRte?: TiptapDocument | string;\n superTitle?: string;\n title?: string;\n /** Legacy \"Upgrade to Subscription and Save {{subscription_discount}}%\" upsell label. */\n upgradeToSubscription?: string;\n};\n\n/** v1 per-product text styling; `textSize` is the CAB `textSizeNames` enum verbatim. */\nexport type V1TextStyle = {\n textEmphasis?: 'base' | 'bold' | 'italic';\n textSize?: 'extraSmall' | 'small' | 'base' | 'medium' | 'large' | 'extraLarge';\n};\n\n/** v1 `displaySettings` \u2014 the controls behind product/variant/image/review presentation. */\nexport type V1OfferDisplaySettings = {\n image?: { imageFit?: 'contain' | 'cover' };\n product?: V1TextStyle;\n reviews?: { color?: string; size?: 'small' | 'default' | 'large' };\n variant?: V1TextStyle;\n};\n\n/**\n * v1 layout is per-breakpoint; CAB has no breakpoints, so the converter collapses them.\n * `style` drives orientation: list \u2192 rows, line \u2192 columns, grid \u2192 grid (none \u2192 rows).\n */\nexport type V1OfferBreakpointLayout = {\n carousel?: boolean;\n columns?: number;\n showPaginations?: boolean;\n style?: 'grid' | 'line' | 'list' | 'none';\n};\n\nexport type V1OfferSettings = {\n /** Free-form in real payloads; the converter safelists to the CAB enum (junk \u2192 'primary'). */\n button?: { kind?: string };\n /** `showSavingAmount` false hides the compare-at (sale) price; `amount`/`type`/`discountedFrom`/`discountedBy` drive the discount-setting price computation (emitted onto the offers section for the client's pricing pass). */\n discount?: {\n amount?: number | string;\n discountedBy?: string;\n discountedFrom?: string;\n /** Merchant-facing promo label (e.g. \"Enjoy 10% off!\") \u2192 carried onto the data-source discount. */\n message?: string;\n /** How many items the discount applies to (defaults to 1) \u2192 carried onto the discount section. */\n quantity?: number;\n showSavingAmount?: boolean;\n type?: string;\n };\n /** Per-product/variant/image/review presentation controls. */\n displaySettings?: V1OfferDisplaySettings;\n /** Engine path appended to `/api/v1` (e.g. '/products/recommended'). */\n endpoint?: string | null;\n images?: { source?: 'product' | 'variant' };\n integrations?: Record<string, boolean>;\n language?: V1OfferLanguage;\n layout?: { large?: V1OfferBreakpointLayout; medium?: V1OfferBreakpointLayout; small?: V1OfferBreakpointLayout };\n limit?: number;\n location?: 'checkout' | 'order-status' | 'thank-you';\n /** The legacy widget's name, present in the settings payload; carried to the converted root. */\n name?: string;\n previewMode?: boolean;\n productOptions?: {\n hideOutOfStockVariants?: boolean;\n matchVariant?: boolean;\n matchVariantOutOfStock?: boolean;\n /** 'hide' (or absent) hides the per-card product description; any other value shows it. */\n showProductDescription?: string;\n showVariantOptions?: 'always' | 'default' | 'never';\n showVariantsAsProducts?: boolean;\n /** 'hide' (or absent) hides the selected-variant title line; any other value shows it. */\n showVariantTitle?: string;\n };\n productType?: 'both' | 'one-time' | 'subscription';\n quantityInputs?: {\n enabled?: boolean;\n /** Custom over-max error copy \u2192 CAB `errorMessages.en.max`. */\n maxError?: string;\n maxValue?: number;\n /** Custom under-min error copy \u2192 CAB `errorMessages.en.min`. */\n minError?: string;\n minValue?: number;\n /** Custom negative-value error copy \u2192 CAB `errorMessages.en.neg`. */\n negativeError?: string;\n /** Stepper kind ('dropdown-select' | 'buttons-manual-input') \u2192 CAB `inputType` (select | number). */\n type?: string;\n };\n /** Default subscribe-vs-one-time when `productType` is `both`. */\n subscriptionIsDefault?: boolean;\n tracking?: { enableAttribution?: boolean; enableSource?: boolean; enableWidget?: boolean };\n treatAsGwp?: boolean;\n type: typeof SHOPIFY_CHECKOUT_EXTENSION;\n /** Absent on real checkout-offers payloads; only `type` is the reliable discriminator. */\n version?: 1;\n /** v1 `viewOptions.variantSelector` ('select' \u2192 CAB 'menu'). */\n viewOptions?: { variantSelector?: 'select' | 'radio' | 'button' };\n};\n\nexport type V1OfferConvertInput = {\n id: number;\n /** The legacy widget's name; set on the converted root (the admin save schema requires it). */\n name?: string;\n settings: V1OfferSettings;\n};\n\n/**\n * The offer's settings `type` uniquely identifies it. Unlike the `ui_extension_*` widgets, the legacy\n * checkout-offers payload carries NO top-level `version` \u2014 so we must NOT gate on it (doing so silently\n * dropped real offers to the passthrough branch). `version: 2` payloads are already claimed upstream by\n * `isCABRootSection`, so they never reach here.\n */\nexport const isOfferV1 = (data: unknown): data is V1OfferSettings => {\n if (!data || typeof data !== 'object') return false;\n\n return (data as Record<string, unknown>).type === SHOPIFY_CHECKOUT_EXTENSION;\n};\n", "/**\n * Default localized labels for the offer card's add-to-order button states and the opt-in undo banner,\n * keyed by slot then locale (same 26 locales as `SWITCH_LABELS`). The converter overlays a defined v1\n * merchant value as the `en` entry (verbatim) and falls back to these for blank/absent values, so a\n * migrated widget keeps its copy while new/unset widgets localize. `addedToCartMessage` tokens are\n * camelCase (CAB default); legacy snake_case tokens in merchant overrides still resolve client-side.\n */\nexport const OFFER_LABELS = {\n addToCart: {\n ar: '\u0623\u0636\u0641 \u0625\u0644\u0649 \u0627\u0644\u0633\u0644\u0629',\n cs: 'P\u0159idat do ko\u0161\u00EDku',\n da: 'L\u00E6g i kurv',\n de: 'In den Warenkorb',\n en: 'Add to cart',\n es: 'A\u00F1adir al carrito',\n fi: 'Lis\u00E4\u00E4 ostoskoriin',\n fr: 'Ajouter au panier',\n ga: 'Cuir sa chairt',\n he: '\u05D4\u05D5\u05E1\u05E3 \u05DC\u05E2\u05D2\u05DC\u05D4',\n hi: '\u0915\u093E\u0930\u094D\u091F \u092E\u0947\u0902 \u091C\u094B\u0921\u093C\u0947\u0902',\n id: 'Tambahkan ke keranjang',\n it: 'Aggiungi al carrello',\n ja: '\u30AB\u30FC\u30C8\u306B\u8FFD\u52A0',\n ko: '\uC7A5\uBC14\uAD6C\uB2C8\uC5D0 \uCD94\uAC00',\n nl: 'In winkelwagen',\n no: 'Legg i handlekurven',\n pl: 'Dodaj do koszyka',\n pt: 'Adicionar ao carrinho',\n ru: '\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443',\n sv: 'L\u00E4gg i varukorgen',\n th: '\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E25\u0E07\u0E15\u0E30\u0E01\u0E23\u0E49\u0E32',\n tr: 'Sepete ekle',\n uk: '\u0414\u043E\u0434\u0430\u0442\u0438 \u0432 \u043A\u043E\u0448\u0438\u043A',\n vi: 'Th\u00EAm v\u00E0o gi\u1ECF h\u00E0ng',\n zh: '\u52A0\u5165\u8D2D\u7269\u8F66',\n },\n addedToCart: {\n ar: '\u062A\u0645\u062A \u0627\u0644\u0625\u0636\u0627\u0641\u0629!',\n cs: 'P\u0159id\u00E1no!',\n da: 'Tilf\u00F8jet!',\n de: 'Hinzugef\u00FCgt!',\n en: 'Added!',\n es: '\u00A1A\u00F1adido!',\n fi: 'Lis\u00E4tty!',\n fr: 'Ajout\u00E9 !',\n ga: 'Curtha leis!',\n he: '\u05E0\u05D5\u05E1\u05E3!',\n hi: '\u091C\u094B\u0921\u093C\u093E \u0917\u092F\u093E!',\n id: 'Ditambahkan!',\n it: 'Aggiunto!',\n ja: '\u8FFD\u52A0\u3057\u307E\u3057\u305F\uFF01',\n ko: '\uCD94\uAC00\uB428!',\n nl: 'Toegevoegd!',\n no: 'Lagt til!',\n pl: 'Dodano!',\n pt: 'Adicionado!',\n ru: '\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u043E!',\n sv: 'Tillagd!',\n th: '\u0E40\u0E1E\u0E34\u0E48\u0E21\u0E41\u0E25\u0E49\u0E27!',\n tr: 'Eklendi!',\n uk: '\u0414\u043E\u0434\u0430\u043D\u043E!',\n vi: '\u0110\u00E3 th\u00EAm!',\n zh: '\u5DF2\u6DFB\u52A0\uFF01',\n },\n addedToCartMessage: {\n ar: '\u062A\u0645\u062A \u0625\u0636\u0627\u0641\u0629 {{quantity}} {{productTitle}} \u0625\u0644\u0649 \u0627\u0644\u0633\u0644\u0629.',\n cs: '{{quantity}} {{productTitle}} p\u0159id\u00E1no do ko\u0161\u00EDku.',\n da: '{{quantity}} {{productTitle}} lagt i kurven.',\n de: '{{quantity}} {{productTitle}} zum Warenkorb hinzugef\u00FCgt.',\n en: '{{quantity}} {{productTitle}} added to cart.',\n es: '{{quantity}} {{productTitle}} a\u00F1adido al carrito.',\n fi: '{{quantity}} {{productTitle}} lis\u00E4tty ostoskoriin.',\n fr: '{{quantity}} {{productTitle}} ajout\u00E9 au panier.',\n ga: 'Cuireadh {{quantity}} {{productTitle}} sa chairt.',\n he: '{{quantity}} {{productTitle}} \u05E0\u05D5\u05E1\u05E3 \u05DC\u05E2\u05D2\u05DC\u05D4.',\n hi: '{{quantity}} {{productTitle}} \u0915\u093E\u0930\u094D\u091F \u092E\u0947\u0902 \u091C\u094B\u0921\u093C\u093E \u0917\u092F\u093E\u0964',\n id: '{{quantity}} {{productTitle}} ditambahkan ke keranjang.',\n it: '{{quantity}} {{productTitle}} aggiunto al carrello.',\n ja: '{{quantity}} {{productTitle}}\u3092\u30AB\u30FC\u30C8\u306B\u8FFD\u52A0\u3057\u307E\u3057\u305F\u3002',\n ko: '{{quantity}} {{productTitle}}\uC774(\uAC00) \uC7A5\uBC14\uAD6C\uB2C8\uC5D0 \uCD94\uAC00\uB418\uC5C8\uC2B5\uB2C8\uB2E4.',\n nl: '{{quantity}} {{productTitle}} toegevoegd aan winkelwagen.',\n no: '{{quantity}} {{productTitle}} lagt i handlekurven.',\n pl: '{{quantity}} {{productTitle}} dodano do koszyka.',\n pt: '{{quantity}} {{productTitle}} adicionado ao carrinho.',\n ru: '{{quantity}} {{productTitle}} \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u043E \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443.',\n sv: '{{quantity}} {{productTitle}} har lagts i varukorgen.',\n th: '\u0E40\u0E1E\u0E34\u0E48\u0E21 {{quantity}} {{productTitle}} \u0E25\u0E07\u0E15\u0E30\u0E01\u0E23\u0E49\u0E32\u0E41\u0E25\u0E49\u0E27',\n tr: '{{quantity}} {{productTitle}} sepete eklendi.',\n uk: '{{quantity}} {{productTitle}} \u0434\u043E\u0434\u0430\u043D\u043E \u0434\u043E \u043A\u043E\u0448\u0438\u043A\u0430.',\n vi: '\u0110\u00E3 th\u00EAm {{quantity}} {{productTitle}} v\u00E0o gi\u1ECF h\u00E0ng.',\n zh: '{{quantity}} {{productTitle}} \u5DF2\u52A0\u5165\u8D2D\u7269\u8F66\u3002',\n },\n addingToCart: {\n ar: '\u062C\u0627\u0631\u064D \u0627\u0644\u0625\u0636\u0627\u0641\u0629...',\n cs: 'P\u0159id\u00E1v\u00E1n\u00ED...',\n da: 'Tilf\u00F8jer...',\n de: 'Wird hinzugef\u00FCgt...',\n en: 'Adding...',\n es: 'A\u00F1adiendo...',\n fi: 'Lis\u00E4t\u00E4\u00E4n...',\n fr: 'Ajout en cours...',\n ga: '\u00C1 chur leis...',\n he: '\u05DE\u05D5\u05E1\u05D9\u05E3...',\n hi: '\u091C\u094B\u0921\u093C\u093E \u091C\u093E \u0930\u0939\u093E \u0939\u0948...',\n id: 'Menambahkan...',\n it: 'Aggiunta in corso...',\n ja: '\u8FFD\u52A0\u4E2D...',\n ko: '\uCD94\uAC00 \uC911...',\n nl: 'Toevoegen...',\n no: 'Legger til...',\n pl: 'Dodawanie...',\n pt: 'Adicionando...',\n ru: '\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435...',\n sv: 'L\u00E4gger till...',\n th: '\u0E01\u0E33\u0E25\u0E31\u0E07\u0E40\u0E1E\u0E34\u0E48\u0E21...',\n tr: 'Ekleniyor...',\n uk: '\u0414\u043E\u0434\u0430\u0432\u0430\u043D\u043D\u044F...',\n vi: '\u0110ang th\u00EAm...',\n zh: '\u6B63\u5728\u6DFB\u52A0...',\n },\n soldOut: {\n ar: '\u0646\u0641\u062F\u062A \u0627\u0644\u0643\u0645\u064A\u0629',\n cs: 'Vyprod\u00E1no',\n da: 'Udsolgt',\n de: 'Ausverkauft',\n en: 'Sold out',\n es: 'Agotado',\n fi: 'Loppuunmyyty',\n fr: '\u00C9puis\u00E9',\n ga: 'D\u00EDolta amach',\n he: '\u05D0\u05D6\u05DC \u05DE\u05D4\u05DE\u05DC\u05D0\u05D9',\n hi: '\u0938\u094D\u091F\u0949\u0915 \u0916\u093C\u0924\u094D\u092E',\n id: 'Habis terjual',\n it: 'Esaurito',\n ja: '\u58F2\u308A\u5207\u308C',\n ko: '\uD488\uC808',\n nl: 'Uitverkocht',\n no: 'Utsolgt',\n pl: 'Wyprzedane',\n pt: 'Esgotado',\n ru: '\u0420\u0430\u0441\u043F\u0440\u043E\u0434\u0430\u043D\u043E',\n sv: 'Sluts\u00E5ld',\n th: '\u0E2A\u0E34\u0E19\u0E04\u0E49\u0E32\u0E2B\u0E21\u0E14',\n tr: 'T\u00FCkendi',\n uk: '\u0420\u043E\u0437\u043F\u0440\u043E\u0434\u0430\u043D\u043E',\n vi: 'H\u1EBFt h\u00E0ng',\n zh: '\u5DF2\u552E\u7F44',\n },\n undo: {\n ar: '\u062A\u0631\u0627\u062C\u0639',\n cs: 'Zp\u011Bt',\n da: 'Fortryd',\n de: 'R\u00FCckg\u00E4ngig',\n en: 'Undo',\n es: 'Deshacer',\n fi: 'Kumoa',\n fr: 'Annuler',\n ga: 'Cealaigh',\n he: '\u05D1\u05D8\u05DC',\n hi: '\u092A\u0942\u0930\u094D\u0935\u0935\u0924 \u0915\u0930\u0947\u0902',\n id: 'Urungkan',\n it: 'Annulla',\n ja: '\u5143\u306B\u623B\u3059',\n ko: '\uC2E4\uD589 \uCDE8\uC18C',\n nl: 'Ongedaan maken',\n no: 'Angre',\n pl: 'Cofnij',\n pt: 'Desfazer',\n ru: '\u041E\u0442\u043C\u0435\u043D\u0438\u0442\u044C',\n sv: '\u00C5ngra',\n th: '\u0E40\u0E25\u0E34\u0E01\u0E17\u0E33',\n tr: 'Geri al',\n uk: '\u0421\u043A\u0430\u0441\u0443\u0432\u0430\u0442\u0438',\n vi: 'Ho\u00E0n t\u00E1c',\n zh: '\u64A4\u9500',\n },\n} as const satisfies Record<string, Record<string, string>>;\n", "import { OFFER_LABELS } from '~/schema/widgets/checkout-and-beyond/offerLabels';\nimport { SWITCH_LABELS } from '~/schema/widgets/checkout-and-beyond/switchLabels';\nimport { type V1OfferSettings, type V1TextStyle } from '~/transforms/offerV1/types';\n\n/** v1 `viewOptions.variantSelector` \u2192 CAB `variants.selector` ('select' is the v1 name for a dropdown menu). */\nconst VARIANT_SELECTOR = { button: 'button', radio: 'radio', select: 'menu' } as const;\n\n/**\n * A defined v1 label ALWAYS passes through verbatim as the `en` entry over the localized defaults \u2014\n * existing widget language is never rewritten (product owner, 2026-07-02); blank/whitespace falls back\n * to the full default locale set (legacy `getLabelWithFallback` parity, same policy as\n * `convertLineItemEditorToV2`).\n */\nconst localizedContent = (defaults: Record<string, string>, override: string | undefined) => {\n const trimmed = override?.trim();\n\n return trimmed ? { ...defaults, en: trimmed } : defaults;\n};\n\n/**\n * A single-token Tiptap doc carrying a v1 text style: `textSize` is the CAB `fontSize`\n * verbatim (identical enums); `textEmphasis` adds a bold/italic mark ('base' adds none).\n */\nconst buildStyledText = (token: string, style: V1TextStyle | undefined, color = 'base') => {\n const marks: Record<string, unknown>[] = [\n { attrs: { color, fontSize: style?.textSize ?? 'base' }, type: 'textStyle' },\n ];\n\n if (style?.textEmphasis === 'bold') marks.push({ type: 'bold' });\n\n if (style?.textEmphasis === 'italic') marks.push({ type: 'italic' });\n\n return { content: [{ content: [{ marks, text: token, type: 'text' }], type: 'paragraph' }], type: 'doc' };\n};\n\n/**\n * The price line: the variant price, optionally followed by a strikethrough,\n * subdued compare-at price. The extension resolves `{{variantCompareAtPrice}}`\n * to '' off-sale, so the strikethrough disappears unless the variant is genuinely\n * discounted. `discount.showSavingAmount` false drops the compare-at node entirely.\n */\nconst buildPriceContent = (settings: V1OfferSettings) => {\n const content: Record<string, unknown>[] = [{ text: '{{variantPrice}}', type: 'text' }];\n\n if (settings.discount?.showSavingAmount !== false) {\n content.push(\n { text: ' ', type: 'text' },\n {\n marks: [{ type: 'strike' }, { attrs: { color: 'subdued' }, type: 'textStyle' }],\n text: '{{variantCompareAtPrice}}',\n type: 'text',\n }\n );\n }\n\n return { content: [{ content, type: 'paragraph' }], type: 'doc' };\n};\n\n/** A `reviews` star section, emitted only when the merchant has a review integration enabled. */\nconst buildReviews = (settings: V1OfferSettings): Record<string, unknown>[] => {\n if (!settings.integrations || !Object.values(settings.integrations).some(Boolean)) return [];\n\n const reviews = settings.displaySettings?.reviews;\n\n return [\n {\n ...(reviews?.color && { color: reviews.color }),\n sectionType: 'reviews',\n ...(reviews?.size && { size: reviews.size }),\n },\n ];\n};\n\n/** The recommended product's image; objectFit comes from v1 `displaySettings.image.imageFit`. */\nconst buildImage = (settings: V1OfferSettings): Record<string, unknown> => ({\n ...(settings.displaySettings?.image?.imageFit && {\n objectFit: settings.displaySettings.image.imageFit,\n }),\n sectionType: 'image',\n source: settings.images?.source === 'product' ? '{{productImage}}' : '{{variantImage}}',\n width: 100,\n});\n\n/** The product title text, styled from v1 `displaySettings.product`. */\nconst buildTitle = (settings: V1OfferSettings): Record<string, unknown> => ({\n content: { en: buildStyledText('{{productTitle}}', settings.displaySettings?.product) },\n sectionType: 'text',\n});\n\n/** The price line (variant price + on-sale compare-at strikethrough). */\nconst buildPrice = (settings: V1OfferSettings): Record<string, unknown> => ({\n content: { en: buildPriceContent(settings) },\n sectionType: 'text',\n});\n\n/** The selected-variant title line, gated by `productOptions.showVariantTitle` ('hide'/absent = off). */\nconst buildVariantTitle = (settings: V1OfferSettings): Record<string, unknown>[] => {\n const show = settings.productOptions?.showVariantTitle;\n\n if (!show || show === 'hide') return [];\n\n return [\n {\n content: { en: buildStyledText('{{variantTitle}}', settings.displaySettings?.variant) },\n sectionType: 'text',\n },\n ];\n};\n\n/** The per-card product description, gated by `productOptions.showProductDescription` ('hide'/absent = off). */\nconst buildDescription = (settings: V1OfferSettings): Record<string, unknown>[] => {\n const show = settings.productOptions?.showProductDescription;\n\n if (!show || show === 'hide') return [];\n\n return [{ content: { en: buildStyledText('{{productDescription}}', undefined) }, sectionType: 'text' }];\n};\n\n/** The variant selector, unless the merchant hid variant options. */\nconst buildVariants = (settings: V1OfferSettings): Record<string, unknown>[] => {\n if (settings.productOptions?.showVariantOptions === 'never') return [];\n\n const selector = settings.viewOptions?.variantSelector;\n\n return [\n {\n hideOutOfStockVariants: !!settings.productOptions?.hideOutOfStockVariants,\n ...(selector && { selector: VARIANT_SELECTOR[selector] }),\n sectionType: 'variants',\n },\n ];\n};\n\n/** v1 stepper kind \u2192 CAB `inputType`. Unknown/absent \u2192 omitted so the schema default ('select') applies. */\nconst QUANTITY_INPUT_TYPE: Record<string, 'number' | 'select'> = {\n 'buttons-manual-input': 'number',\n 'dropdown-select': 'select',\n};\n\n/** Custom quantity error copy \u2192 CAB `errorMessages.en.{min,max,neg}`; omitted entirely when none is set. */\nconst buildQuantityErrors = (quantity: NonNullable<V1OfferSettings['quantityInputs']>) => {\n const en = {\n ...(quantity.maxError && { max: quantity.maxError }),\n ...(quantity.minError && { min: quantity.minError }),\n ...(quantity.negativeError && { neg: quantity.negativeError }),\n };\n\n return Object.keys(en).length ? { errorMessages: { en } } : {};\n};\n\n/** The quantity stepper, when the merchant enabled quantity input. */\nconst buildQuantity = (settings: V1OfferSettings): Record<string, unknown>[] => {\n const quantity = settings.quantityInputs;\n\n if (!quantity?.enabled) return [];\n\n const inputType = quantity.type ? QUANTITY_INPUT_TYPE[quantity.type] : undefined;\n\n return [\n {\n ...buildQuantityErrors(quantity),\n ...(inputType && { inputType }),\n max: quantity.maxValue ?? 10,\n min: quantity.minValue ?? 1,\n sectionType: 'quantity',\n },\n ];\n};\n\n/**\n * The in-card subscribe / one-time toggle: a `switchToSubscription` button with its four label slots\n * (the same `SWITCH_LABELS` slot set as the line-item editor, including the `subscriptionOption`\n * frequency template, so the frequency select localizes). Emitted when the merchant offers\n * subscriptions (`productType` both/subscription); the extension shows it per-product by selling-plan\n * availability. v1 carries the with-discount upsell (`upgradeToSubscription`) plus the cart switch\n * labels; anything blank/absent falls back to the shared localized defaults.\n */\nconst buildSubscriptionButton = (settings: V1OfferSettings): Record<string, unknown>[] => {\n if (settings.productType !== 'both' && settings.productType !== 'subscription') return [];\n\n const language = settings.language;\n\n const slot = (buttonField: keyof typeof SWITCH_LABELS, override: string | undefined) => ({\n buttonField,\n content: localizedContent(SWITCH_LABELS[buttonField], override),\n sectionType: 'text',\n });\n\n return [\n {\n action: 'switchToSubscription',\n buttonStyle: 'plain',\n sections: [\n slot('subscriptionOption', undefined),\n slot('switchToOneTimePurchase', language?.cartSwitchToOnetime),\n slot('switchToSubscriptionNoDiscount', language?.cartSwitchToSubscription),\n slot('switchToSubscriptionWithDiscount', language?.upgradeToSubscription),\n ],\n sectionType: 'button',\n },\n ];\n};\n\n/** v1 stores free-form `button.kind`; anything outside the CAB enum falls back to the legacy 'primary'. */\nconst BUTTON_KINDS = ['plain', 'primary', 'secondary'] as const;\n\n/** The add-to-order button with its four label slots (add / adding / added / sold-out). */\nconst buildAddButton = (settings: V1OfferSettings): Record<string, unknown> => {\n const kind = settings.button?.kind;\n\n const slot = (buttonField: 'addedToCart' | 'addingToCart' | 'addToCart' | 'soldOut', override?: string) => ({\n buttonField,\n content: localizedContent(OFFER_LABELS[buttonField], override),\n sectionType: 'text',\n });\n\n return {\n action: 'addToOrder',\n buttonStyle: BUTTON_KINDS.includes(kind as (typeof BUTTON_KINDS)[number]) ? kind : 'primary',\n sections: [\n slot('addToCart', settings.language?.addToCart),\n slot('addingToCart', settings.language?.addingToCart),\n slot('addedToCart', settings.language?.addedToCart),\n slot('soldOut', settings.language?.soldOutLabel),\n ],\n sectionType: 'button',\n };\n};\n\n/** A `rows` layout wrapping sections into one grid cell (so they stack within a column of the card). */\nconst rowsLayout = (sections: Record<string, unknown>[]): Record<string, unknown> => ({\n direction: 'rows',\n sections,\n sectionType: 'layout',\n});\n\n/**\n * The per-offer product card: the sections rendered once per recommended product (the\n * offers renderer mounts a product context, so the `{{...}}` tokens resolve per product).\n *\n * `horizontal` mirrors the v1 layout orientation (see `convertOfferToV2`):\n * - horizontal (v1 `list`/default, vertical-stacked products): a 3-column grid card \u2014\n * image | title/price/reviews/variants | actions \u2014 matching the compact V1 row.\n * - vertical (v1 `grid`/`line`, side-by-side products): a flat top-to-bottom stack\n * (image \u2192 title \u2192 price \u2192 \u2026 \u2192 button), the narrow column card.\n *\n * Quantity is a full-width row beneath the card in the horizontal layout; in the vertical\n * layout it sits inline in the stack. NOT carried: the savings-amount badge (no live v1\n * control) and variant text styling (no CAB field).\n */\nexport const buildOfferCard = (settings: V1OfferSettings, horizontal: boolean): Record<string, unknown>[] => {\n const image = buildImage(settings);\n const title = buildTitle(settings);\n const variantTitle = buildVariantTitle(settings);\n const price = buildPrice(settings);\n const description = buildDescription(settings);\n const reviews = buildReviews(settings);\n const variants = buildVariants(settings);\n const quantity = buildQuantity(settings);\n const subscription = buildSubscriptionButton(settings);\n const addButton = buildAddButton(settings);\n\n if (!horizontal) {\n return [\n image,\n title,\n ...variantTitle,\n price,\n ...description,\n ...reviews,\n ...variants,\n ...quantity,\n ...subscription,\n addButton,\n ];\n }\n\n const info = rowsLayout([title, ...variantTitle, price, ...description, ...reviews, ...variants]);\n const actions = [...subscription, addButton];\n const actionsCell = actions.length === 1 ? actions[0] : rowsLayout(actions);\n\n const card = {\n direction: 'grid',\n grid: { columns: ['15%', 'fill', 'auto'], rows: ['auto'] },\n sections: [image, info, actionsCell],\n sectionType: 'layout',\n };\n\n return [card, ...quantity];\n};\n", "import { OFFER_LABELS } from '~/schema/widgets/checkout-and-beyond/offerLabels';\nimport { CABRootSection } from '~/schema/widgets/checkout-and-beyond/root';\nimport { convertContentBlockTextToV2 } from '~/transforms/contentBlockV1/convertContentBlockTextToV2';\nimport { buildOfferCard } from '~/transforms/offerV1/offerCard';\nimport {\n SHOPIFY_CHECKOUT_EXTENSION,\n type V1OfferBreakpointLayout,\n type V1OfferConvertInput,\n type V1OfferSettings,\n} from '~/transforms/offerV1/types';\n\nconst LOCATION_TO_EDITOR_MODE = {\n checkout: 'checkoutExtension',\n 'order-status': 'orderStatusPage',\n 'thank-you': 'thankYouPage',\n} as const;\n\n/**\n * v1 per-breakpoint `layout.style` \u2192 CAB product-list `direction`. This is the product-TO-product\n * orientation and the card orientation flips with it (see `convertOfferToV2`):\n * - `grid`/`line` \u2192 products sit side-by-side (`grid`/`columns`); each card is a vertical stack.\n * - `list`/`none`/absent \u2192 products stack vertically (`rows`); each card is a horizontal row.\n * The v1 carousel toggle writes exactly these two: VERTICAL \u2192 `list`, HORIZONTAL \u2192 `grid`.\n */\nconst STYLE_TO_DIRECTION = {\n grid: 'grid',\n line: 'columns',\n list: 'rows',\n none: 'rows',\n} as const;\n\nconst directionForStyle = (style: V1OfferBreakpointLayout['style']) => (style ? STYLE_TO_DIRECTION[style] : 'rows');\n\n/**\n * The product-to-product layout \u2014 it belongs on the CONTAINER that holds the offers (the carousel\n * wrapper), NOT on the offers section. The renderer repeats the offers layout per product into its\n * parent's stack/grid, so a `grid` direction with N `'fill'` columns lays the products out N-across;\n * `list`/`none` stay a vertical stack.\n *\n * `'fill'` (equal share) \u2014 NOT `'auto'` (sizes to content), which yields unequal columns and so\n * unequal `objectFit: contain` image heights across products.\n */\nconst buildProductListLayout = (direction: string, columns: number) =>\n direction === 'grid'\n ? { direction, grid: { columns: Array.from({ length: Math.max(columns, 1) }, () => 'fill'), rows: ['auto'] } }\n : { direction };\n\nconst hasHeaderText = (language: V1OfferSettings['language']): boolean =>\n !!(language?.title || language?.superTitle || language?.description);\n\n/**\n * v1 `discountedFrom` \u2192 CAB `discountSources`. v1's \"Discounted From\" / \"Compare Price With\" select\n * stores `price` / `compare_at_price` directly; the legacy `original_price` (written in Shopify-Functions\n * mode) is the regular price, i.e. `price`. Unknown values are omitted (the CAB enum would reject them).\n */\nconst DISCOUNTED_FROM: Record<string, 'compare_at_price' | 'price'> = {\n compare_at_price: 'compare_at_price',\n original_price: 'price',\n price: 'price',\n};\n\n/**\n * The widget-level discount, emitted as a config-only `discount` section that sits\n * just above the undo banner in the offers section. Empty when there's no active\n * discount; `showSavingAmount` is a card-display concern handled in `buildOfferCard`.\n */\nconst buildDiscountSection = (discount: V1OfferSettings['discount']): Record<string, unknown>[] => {\n if (!discount?.type || discount.type === 'none') return [];\n\n const discountedFrom = discount.discountedFrom ? DISCOUNTED_FROM[discount.discountedFrom] : undefined;\n\n return [\n {\n amount: discount.amount ?? 0,\n ...(discount.discountedBy && { discountedBy: discount.discountedBy }),\n ...(discountedFrom && { discountedFrom }),\n ...(discount.message && { message: discount.message }),\n ...(discount.quantity != null && { quantity: discount.quantity }),\n sectionType: 'discount',\n type: discount.type,\n },\n ];\n};\n\n/** The opt-in undo banner: a success `banner` of the message + a plain undo button. */\nconst buildBanner = (language: V1OfferSettings['language']): Record<string, unknown>[] =>\n language?.successBannerEnabled\n ? [\n {\n color: 'success',\n dismissible: true,\n sections: [\n {\n /**\n * A defined v1 message (RTE doc or string) passes through verbatim as `en`;\n * absent falls back to the localized defaults (P4 language policy).\n */\n content: language.successBannerMessageRte\n ? { ...OFFER_LABELS.addedToCartMessage, en: language.successBannerMessageRte }\n : OFFER_LABELS.addedToCartMessage,\n sectionType: 'text',\n },\n {\n action: 'undoAddToOrder',\n buttonStyle: 'plain',\n sections: [{ buttonField: 'buttonLabel', content: OFFER_LABELS.undo, sectionType: 'text' }],\n sectionType: 'button',\n },\n ],\n sectionType: 'banner',\n },\n ]\n : [];\n\n/**\n * Translates a v1 Offer (Checkout Offers / product recommendations) widget into\n * a `CABRootSection`: an optional header (title/superTitle/description, reusing\n * the content-block text converter) over a `carousel` wrapper that ALWAYS contains\n * the `offers` section (the carousel is the required structural parent; it only\n * paginates when the v1 layout has carousel on). The offers section's `dataSource`\n * child carries the engine fetch config; its remaining children are the\n * per-offer card (see `buildOfferCard`).\n *\n * v1 `layout` is per-breakpoint; CAB has none, so the converter collapses to\n * the largest provided breakpoint. A widget-level discount becomes a config-only\n * `discount` section and an opt-in undo `banner` is appended after the data\n * source (discount above, banner pinned last) when each is configured.\n */\nexport const convertOfferToV2 = ({ id, name, settings }: V1OfferConvertInput): CABRootSection => {\n const layout = settings.layout?.large ?? settings.layout?.medium ?? settings.layout?.small;\n const columns = layout?.columns ?? 1;\n const direction = directionForStyle(layout?.style);\n const listLayout = buildProductListLayout(direction, columns);\n\n // The card orientation is the inverse of the product-list orientation: vertically-stacked\n // products (`rows`) carry a compact horizontal card (image | info | add); side-by-side products\n // (`grid`/`columns`) carry a narrow vertical card (image \u2192 info \u2192 add).\n const horizontalCard = direction === 'rows';\n\n const dataSource = {\n ...(settings.endpoint && { dataSourcePath: settings.endpoint }),\n ...(settings.integrations && { integrations: settings.integrations }),\n ...(settings.limit !== undefined && { limit: settings.limit }),\n matchVariant: !!settings.productOptions?.matchVariant,\n matchVariantOutOfStock: !!settings.productOptions?.matchVariantOutOfStock,\n ...(settings.productType && { productType: settings.productType }),\n sectionType: 'dataSource',\n ...(settings.treatAsGwp && { treatAsGwp: true }),\n };\n\n // The visible card sections come first so their indices stay contiguous from\n // the top (the admin UI prepends newly-added visible sections). The trailing\n // config-only sections are never rendered per-card: data source (engine fetch\n // config), then the optional discount, then the undo banner pinned to the very\n // bottom. `offers` keeps the default `rows` direction; the card's own\n // orientation is baked into the sections `buildOfferCard` returns.\n const offers = {\n sections: [\n ...buildOfferCard(settings, horizontalCard),\n dataSource,\n ...buildDiscountSection(settings.discount),\n ...buildBanner(settings.language),\n ],\n sectionType: 'offers',\n };\n\n // Offers ALWAYS live inside a `carousel` section \u2014 it's the structural wrapper the CAB offers\n // architecture requires, regardless of whether the widget actually paginates (the name is\n // historical). It only shows pagination when there are more products than `itemsAtOnce`, so a\n // non-carousel v1 widget sets `itemsAtOnce` to the full limit and shows everything at once. The\n // product-list layout (direction/grid from the v1 style + columns) rides on this wrapper.\n const display = {\n autoAdvanceInterval: 0,\n itemsAtOnce: layout?.carousel ? columns : (settings.limit ?? columns),\n ...listLayout,\n sections: [offers],\n sectionType: 'carousel',\n };\n\n return CABRootSection.parse({\n direction: 'rows',\n editorMode: LOCATION_TO_EDITOR_MODE[settings.location ?? 'checkout'],\n // The widget name is required by the admin save schema; carry the legacy widget's name through.\n ...(name && { name }),\n previewMode: settings.previewMode,\n sections: [\n ...(hasHeaderText(settings.language)\n ? [{ content: { en: convertContentBlockTextToV2(settings.language) }, sectionType: 'text' }]\n : []),\n display,\n ],\n tracking: {\n enableAttribution: settings.tracking?.enableAttribution ?? true,\n enableSource: settings.tracking?.enableSource ?? true,\n enableWidget: settings.tracking?.enableWidget ?? true,\n },\n type: SHOPIFY_CHECKOUT_EXTENSION,\n version: 2,\n widgetId: id,\n });\n};\n", "import { type z } from 'zod/v4';\n\nimport { convertNumericObjects } from '~/transforms/convertNumericObjects';\nimport { deepCamelCase } from '~/transforms/deepCamelCase';\n\n/**\n * Runs the shielded-CDN response through the canonical pipeline:\n *\n * raw \u2192 deepCamelCase \u2192 convertNumericObjects \u2192 transform? \u2192 schema.parse\n *\n * `schema.parse` hydrates `.default(...)` values and surfaces any drift as a\n * ZodError. The optional `transform` step is for normalization that must run\n * before* validation \u2014 e.g. converting HTML-laden text content into Tiptap\n * documents (since the canonical CAB schema rejects HTML strings outright).\n *\n * @param schema - The canonical Zod schema to validate against.\n * @param raw - Untrusted upstream JSON.\n * @param transform - Optional pre-parse transform (defaults to identity).\n *\n * @returns The parsed-and-default-hydrated `z.infer<S>`.\n */\nexport const parseShielded = <S extends z.ZodType>(\n schema: S,\n raw: unknown,\n transform: (input: unknown) => unknown = (input) => input\n): z.infer<S> => schema.parse(transform(convertNumericObjects(deepCamelCase(raw))));\n", "import { UserConfig } from '~/schema/userConfig';\nimport { NotFoundError, type ServerContext, UpstreamError, type UserConfigInput } from '~/server/shared';\nimport { parseShielded } from '~/transforms';\n\nconst unwrapData = (body: unknown): unknown =>\n body && typeof body === 'object' && 'data' in body ? (body as { data: unknown }).data : body;\n\nconst isEmptyObject = (x: unknown): boolean =>\n x == null || (typeof x === 'object' && !Array.isArray(x) && Object.keys(x as object).length === 0);\n\n/** Inactive/missing shops come back as `{ data: { shop: null } }` or `{ data: {} }`. */\nconst isMissingShopPayload = (data: unknown): boolean => {\n if (data == null || typeof data !== 'object' || Array.isArray(data)) return true;\n\n return isEmptyObject((data as { shop?: unknown }).shop);\n};\n\n/**\n * Resolves the shop's normalized config (publishable key, currency, integrations, \u2026) from the engine's\n * `/api/v1/user/config`. Throws {@link NotFoundError} for inactive/unknown shops.\n */\nexport const fetchUserConfig = async (input: UserConfigInput, ctx: ServerContext): Promise<UserConfig> => {\n let upstream: unknown;\n\n try {\n upstream = await ctx.fetchUpstream('/api/v1/user/config', { shop: input.shop }, { host: ctx.host });\n } catch (err) {\n /** Legacy `/api/v1/user/config` returns 404 for \"Shop is not active\"; treat 410 the same. */\n if (err instanceof UpstreamError && (err.status === 404 || err.status === 410)) {\n throw new NotFoundError(`Shop config not found: ${input.shop}`);\n }\n\n throw err;\n }\n\n const data = unwrapData(upstream);\n\n if (isMissingShopPayload(data)) throw new NotFoundError(`Shop config not found: ${input.shop}`);\n\n return parseShielded(UserConfig, data);\n};\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\n/**\n * Returns true if the string is a valid base64 encoded string.\n *\n * @param {string} str - The string to check.\n *\n * @returns {boolean} True if the string is a valid base64 encoded string.\n */\nexport function isBase64Encoded(str: string): boolean {\n const base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n\n return base64Regex.test(str) ? true : false;\n}\n\n/**\n * Returns a string as a JSON object.\n *\n * @param {string} data - The string to convert to a JSON object.\n * @param {boolean} decode - Whether to decode the string. *\n *\n * @returns {any} The JSON object.\n */\nexport function stringToData(data: string, decode: boolean): any {\n let response = data;\n\n // Base64 decode\n if (decode === true) {\n response = atob(response);\n }\n\n try {\n response = JSON.parse(response);\n } catch (e) {\n // failure to parse cookie\n response = data;\n }\n\n return response;\n}\n\n/**\n * Returns a JSON object as a string.\n *\n * @param {any} data - The JSON object to convert to a string.\n * @param {boolean} encode - Whether to encode the string. *\n *\n * @returns {string} The string.\n */\nexport function dataToString(data: any, encode: boolean): string {\n let response = data;\n\n if (typeof response != 'string') {\n response = JSON.stringify(response);\n }\n\n // Base64 encode\n if (encode === true) {\n response = btoa(response);\n }\n\n return response;\n}\n\n/**\n * Returns a string with HTML tags removed.\n *\n * @param {string} str - The string to strip HTML tags from.\n *\n * @returns {string} The string with HTML tags removed.\n */\nexport function stripHtml(str: string): string {\n return str?.replace(/<(.|\\n)*?>/g, '') ?? '';\n}\n\n/**\n * Returns the ID from a GraphQL URL.\n *\n * @param {string} graphId - The GraphQL URL.\n * @param {string} objectType - The object type.\n *\n * @returns {number | null} The ID.\n */\nexport function getIdFromGraphUrl(graphId: string, objectType: string): number | null {\n let id: number | null = null;\n\n const regex = new RegExp(`gid://shopify/${objectType}/(.*)`);\n const matches = graphId.match(regex);\n\n if (matches != null) {\n const matchedId = matches[1];\n\n if (!isNaN(Number(matchedId))) {\n id = Number(matchedId);\n }\n }\n\n return id;\n}\n\n/**\n * Returns true if the variant is available.\n *\n * @param {any} variant - The variant.\n *\n * @returns {boolean} True if the variant is available.\n */\nexport function variantAvailable(variant: any): boolean {\n return !(variant.inventory_management && variant.inventory_policy === 'deny' && variant.inventory_quantity <= 0);\n}\n\n/**\n * Returns the first available variant.\n *\n * @param {any} product - The product.\n *\n * @returns {any} The first available variant.\n */\nexport function firstAvailableVariant(product: any): any {\n // Select first variant\n let selectedVariant = product.variants[0];\n\n // Upgrade to first available\n for (let i = 0; i < product.variants.length; i++) {\n if (variantAvailable(product.variants[i])) {\n selectedVariant = product.variants[i];\n break;\n }\n }\n\n return selectedVariant;\n}\n\n/**\n * Returns a UUID.\n *\n * @returns {string} The UUID.\n */\nexport function uuid(): string {\n let d = new Date().getTime();\n let d2 = (performance && performance.now && performance.now() * 1000) || 0;\n\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n let r = Math.random() * 16;\n\n if (d > 0) {\n r = ((d + r) % 16) | 0;\n d = Math.floor(d / 16);\n } else {\n r = ((d2 + r) % 16) | 0;\n d2 = Math.floor(d2 / 16);\n }\n\n return (c === 'x' ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n\n/**\n * Returns a session ID.\n *\n * @returns {string} The session ID.\n */\nexport function sessionId(): string {\n const config = {\n chars: '0123456789',\n length: 12,\n };\n\n let sessionId = '';\n const sessionStart = new Date().getTime();\n\n for (let i = config.length; i > 0; i--) {\n sessionId += config.chars[Math.floor(Math.random() * config.chars.length)];\n }\n\n return `REBUY.${sessionStart}.${sessionId}`;\n}\n\n/**\n * Converts a product to the storefront format.\n *\n * @param {any} product - The product.\n *\n * @returns {any} The product in the storefront format.\n */\nexport function convertProductToStorefrontFormat(product: any): any {\n const defaultVariant = firstAvailableVariant(product);\n const minVariantPrice = variantMinMaxPriceObject(product, 'price', 'min');\n const maxVariantPrice = variantMinMaxPriceObject(product, 'price', 'max');\n const minVariantCompareAtPrice = variantMinMaxPriceObject(product, 'compare_at_price', 'min');\n const maxVariantCompareAtPrice = variantMinMaxPriceObject(product, 'compare_at_price', 'max');\n const selectedOptions = selectedVariantOptions(product, defaultVariant);\n\n const variants = product.variants.map((variant: any) => convertVariantToStorefrontFormat(product, variant));\n\n return {\n collections: null,\n compareAtPriceRange: {\n maxVariantCompareAtPrice,\n minVariantCompareAtPrice,\n },\n description: stripHtml(product.body_html),\n descriptionHtml: product.body_html,\n featuredImage: productImageObject(product, null),\n handle: product.handle,\n id: `gid://shopify/Product/${product.id}`,\n images: null,\n media: [],\n metafields: [],\n options: [\n ...product.options.map((option: any) => {\n return { name: option.name, values: option.values };\n }),\n ],\n priceRange: {\n maxVariantPrice,\n minVariantPrice,\n },\n selectedOptions,\n selectedSellingPlan: null,\n selectedSellingPlanAllocation: null,\n sellingPlanGroups: [],\n seo: { description: null, title: null },\n title: product.title,\n variants: convertToNodes(variants),\n vendor: product.vendor,\n };\n}\n\n/**\n * Converts an array to a nodes object.\n *\n * @param {any} arr - The array to convert to a nodes object.\n *\n * @returns {any} The nodes object.\n */\nexport function convertToNodes(arr: any): any {\n return {\n edges: [\n ...arr.map((node: any) => {\n return { node };\n }),\n ],\n };\n}\n\n/**\n * Converts a variant to the storefront format.\n *\n * @param {any} product - The product.\n * @param {any} variant - The variant.\n *\n * @returns {any} The variant in the storefront format.\n */\nexport function convertVariantToStorefrontFormat(product: any, variant: any): any {\n const selectedOptions = selectedVariantOptions(product, variant);\n const image = productImageObject(product, variant.image_id);\n\n return {\n availableForSale: variantAvailable(variant),\n compareAtPriceV2: variantPriceObject(variant, 'compare_at_price'),\n id: `gid://shopify/ProductVariant/${variant.id}`,\n image: image,\n priceV2: variantPriceObject(variant, 'price'),\n product: {\n handle: product.handle,\n id: product.id,\n title: product.title,\n vendor: product.vendor,\n },\n selectedOptions: [selectedOptions],\n sku: variant.sku,\n title: variant.title,\n };\n}\n\n/**\n * Returns the minimum or maximum price object for a variant.\n *\n * @param {any} product - The product.\n * @param {string} key - The key to get the price object for.\n * @param {string} operator - The operator to use. *\n *\n * @returns {any} The price object.\n */\nexport function variantMinMaxPriceObject(product: any, key: string = 'price', operator: string = 'min'): any {\n let priceObject = variantPriceObject(product.variants[0], key);\n\n for (let i = 0; i < product.variants.length; i++) {\n const variantPrice = variantPriceObject(product.variants[i], key);\n\n if (variantPrice != null) {\n const variantPriceAmount = Number(variantPrice.amount);\n const currentPriceAmount = priceObject != null ? Number(priceObject.amount) : null;\n\n if (\n currentPriceAmount == null ||\n (operator === 'min' && variantPriceAmount < currentPriceAmount) ||\n (operator === 'max' && variantPriceAmount > currentPriceAmount)\n ) {\n priceObject = variantPrice;\n }\n }\n }\n\n return priceObject;\n}\n\n/**\n * Returns the price object for a variant.\n *\n * @param {any} variant - The variant.\n * @param {string} key - The key to get the price object for.\n *\n * @returns {any} The price object.\n */\nexport function variantPriceObject(variant: any, key: string = 'price'): any {\n if (variant[key] != null) {\n return {\n amount: variant[key],\n currencyCode: 'USD',\n };\n }\n\n return null;\n}\n\n/**\n * Returns the selected variant options.\n *\n * @param {any} product - The product.\n * @param {any} variant - The variant.\n *\n * @returns {any} The selected variant options.\n */\nexport function selectedVariantOptions(product: any, variant: any): any {\n const selectedOptions: Record<string, any> = {};\n\n if (variant.option1 != null) {\n selectedOptions[product.options[0].name] = variant.option1;\n }\n\n if (variant.option2 != null) {\n selectedOptions[product.options[1].name] = variant.option2;\n }\n\n if (variant.option3 != null) {\n selectedOptions[product.options[2].name] = variant.option3;\n }\n\n return selectedOptions;\n}\n\n/**\n * Returns the product image object.\n *\n * @param {any} product - The product.\n * @param {number | null} id - The ID of the image. *\n *\n * @returns {any} The product image object.\n */\nexport function productImageObject(product: any, id: number | null): any {\n let image = null;\n\n if (product.image) {\n image = {\n altText: product.image.alt,\n height: product.image.height,\n id: `gid://shopify/ProductImage/${product.image.id}`,\n url: product.image.src,\n width: product.image.width,\n };\n }\n\n if (product.images && product.images.length > 0 && id != null) {\n const matchingImage = product.images.find((i: any) => i.id === id);\n\n if (matchingImage) {\n image = {\n altText: matchingImage.alt,\n height: matchingImage.height,\n id: `gid://shopify/ProductImage/${matchingImage.id}`,\n url: matchingImage.src,\n width: matchingImage.width,\n };\n }\n }\n\n return image;\n}\n\n/**\n * Returns a query string as an object.\n *\n * @param {string} str - The query string to convert to an object.\n *\n * @returns {any} The object.\n */\nexport function queryStringToObject(str: string): any {\n const params = new URLSearchParams(str);\n\n return Object.fromEntries(params.entries());\n}\n\n/**\n * Returns a UTM object from a string.\n *\n * @param {string} str - The string to convert to a UTM object.\n *\n * @returns {any} The UTM object.\n */\nexport function utmObjectFromString(str: string): any {\n const utmKeys = ['utm_campaign', 'utm_medium', 'utm_source', 'utm_term', 'utm_content'];\n\n const matches: Record<string, any> = {};\n\n const url = new URL(str);\n const queryObject = queryStringToObject(url.search);\n\n for (const [key, value] of Object.entries(queryObject)) {\n if (utmKeys.includes(key)) {\n matches[key] = value;\n }\n }\n\n return Object.keys(matches).length > 0 ? matches : null;\n}\n\n/**\n * Returns the amount in cents.\n *\n * @param {number} amount - The amount to convert to cents.\n *\n * @returns {number} The amount in cents.\n */\nexport function amountToCents(amount: number | string): number {\n let normalizedAmount: number = 0;\n\n if (typeof amount === 'string') {\n if (amount.indexOf('.') !== -1) {\n normalizedAmount = Math.round(parseFloat(amount) * 100);\n } else {\n normalizedAmount = parseInt(amount, 10);\n }\n } else if (typeof amount === 'number') {\n normalizedAmount = Math.round(amount * 100);\n }\n\n if (isNaN(normalizedAmount)) {\n normalizedAmount = 0;\n }\n\n return normalizedAmount;\n}\n\n/**\n * Serializes an object.\n *\n * @param {Record<string, unknown>} obj - The object to serialize.\n *\n * @returns {string} The serialized object.\n */\nexport function serialize(obj: Record<string, unknown>): string {\n const serialized: string[] = [];\n\n const add = (key: string, value: any) => {\n value = typeof value === 'function' ? value() : value;\n value = value === null ? '' : value === undefined ? '' : value;\n serialized[serialized.length] = encodeURIComponent(key) + '=' + encodeURIComponent(value);\n };\n\n const buildParameters = (prefix: string, obj: any) => {\n let i, key, len;\n\n if (prefix) {\n if (Array.isArray(obj)) {\n for (i = 0, len = obj.length; i < len; i++) {\n buildParameters(prefix + '[' + (typeof obj[i] === 'object' && obj[i] ? i : '') + ']', obj[i]);\n }\n } else if (Object.prototype.toString.call(obj) === '[object Object]') {\n for (key in obj) {\n buildParameters(prefix + '[' + key + ']', obj[key]);\n }\n } else {\n add(prefix, obj);\n }\n } else if (Array.isArray(obj)) {\n for (i = 0, len = obj.length; i < len; i++) {\n add(obj[i].name, obj[i].value);\n }\n } else {\n for (key in obj) {\n buildParameters(key, obj[key]);\n }\n }\n\n return serialized;\n };\n\n return buildParameters('', obj).join('&');\n}\n", "import { type DataSourceInput, NotFoundError, type ServerContext, UpstreamError } from '~/server/shared';\nimport { fetchUserConfig } from '~/server/userConfig';\nimport { deepCamelCase } from '~/transforms';\nimport { serialize } from '~/utilities';\n\nexport type DataSourceResults = {\n metadata: unknown;\n products: unknown[];\n};\n\n/**\n * Encode a key/value list the way the engine expects (React `getEncodedAttributes`): a `{key: value}` object,\n * JSON-stringified, then URL-encoded ONCE here. `serialize()` URL-encodes the whole value again when it builds\n * the query string, so the wire is double-encoded \u2014 matching what the SmartCart SDK sends (`cart[attributes]=%257B%257D`).\n */\nconst encodeAttributes = (pairs: { key: string; value?: string }[] = []): string =>\n encodeURIComponent(JSON.stringify(Object.fromEntries(pairs.map(({ key, value }) => [key, value ?? '']))));\n\n/**\n * Translate the camelCase input into the legacy engine's contract: snake_case keys, PHP-bracket query\n * serialization, derived aggregates (item/line counts, id CSVs), and the shop's publishable key. The\n * extension never carries any of this.\n */\nexport const buildEngineParams = (input: DataSourceInput, key: string): Record<string, unknown> => {\n const { cart, customerId, integrations, limit, productType, shop, visitorId } = input;\n\n const items = cart.items.map(({ productId, properties, quantity, subscriptionId, variantId }) => ({\n product_id: productId,\n properties: encodeAttributes(properties),\n quantity,\n ...(subscriptionId && { subscription_id: subscriptionId }),\n variant_id: variantId,\n }));\n\n const itemCount = cart.items.reduce((total, { quantity }) => total + quantity, 0);\n /** Rule thresholds evaluate against actual spend: subtract cart-level discounts (React `useSearchParams`). */\n const subtotal = cart.subtotal - (cart.discountTotal ?? 0);\n\n return {\n cart: {\n attributes: encodeAttributes(cart.attributes),\n /** `discount_code` rules match against this; React sends raw `useDiscountCodes()` as `[{code}]`. */\n ...(cart.discountCodes?.length && { discount_codes: cart.discountCodes.map((code) => ({ code })) }),\n item_count: itemCount,\n items,\n line_count: items.length,\n subtotal,\n },\n cart_count: items.length,\n cart_item_count: itemCount,\n cart_line_count: items.length,\n cart_subtotal: subtotal,\n key,\n limit,\n metafields: Object.values(integrations ?? {}).some(Boolean) ? 'yes' : 'no',\n selling_plans: productType === 'one-time' ? 'no' : 'yes',\n shop,\n ...(customerId && { shopify_customer_id: customerId }),\n shopify_product_ids: items.map(({ product_id: id }) => id).join(','),\n shopify_variant_ids: items.map(({ variant_id: id }) => id).join(','),\n ...(visitorId && { uuid: visitorId }),\n };\n};\n\n/** Engine responses can repeat a product across rule outputs; first one wins. */\nconst dedupeById = (products: unknown[]): unknown[] => {\n const seen = new Set<unknown>();\n\n return products.filter((product) => {\n const id = (product as { id?: unknown }).id;\n\n if (seen.has(id)) return false;\n\n seen.add(id);\n\n return true;\n });\n};\n\n/**\n * Evaluates a data source against the live cart: resolves the shop's publishable key, GETs the engine\n * endpoint with the translated params, and returns camelCased, id-deduplicated products plus rule\n * metadata. `limit: 0` returns metadata only.\n */\nexport const fetchDataSourceResults = async (\n input: DataSourceInput,\n ctx: ServerContext\n): Promise<DataSourceResults> => {\n const { shop } = await fetchUserConfig({ shop: input.shop }, ctx);\n\n let upstream: unknown;\n\n try {\n upstream = await ctx.fetchUpstream(\n `/api/v1${input.dataSourcePath}`,\n {},\n { host: ctx.host, search: serialize(buildEngineParams(input, shop.apiKey)) }\n );\n } catch (err) {\n if (err instanceof UpstreamError && (err.status === 404 || err.status === 410)) {\n throw new NotFoundError(`Data source not found: ${input.dataSourcePath}`);\n }\n\n throw err;\n }\n\n const raw = upstream && typeof upstream === 'object' ? (upstream as { data?: unknown; metadata?: unknown }) : {};\n const products = Array.isArray(raw.data) ? (deepCamelCase(raw.data) as unknown[]) : [];\n\n return {\n metadata: raw.metadata == null ? null : deepCamelCase(raw.metadata),\n products: dedupeById(products),\n };\n};\n", "import { CABRootSection } from '~/schema/widgets/checkout-and-beyond';\n\nimport { NotFoundError, type ServerContext, UpstreamError, type WidgetSettingsInput } from '~/server/shared';\nimport {\n convertContentBlockToV2,\n convertLineItemEditorToV2,\n convertNumericObjects,\n convertOfferToV2,\n deepCamelCase,\n isCABRootSection,\n isContentBlockV1,\n isLineItemEditorV1,\n isOfferV1,\n normalizeTextContent,\n} from '~/transforms';\n\nconst unwrapData = (body: unknown): unknown =>\n body && typeof body === 'object' && 'data' in body ? (body as { data: unknown }).data : body;\n\n/**\n * The legacy shielded CDN returns `200 { data: null }` (or `{ data: {} }`) for deleted/missing widgets \u2014\n * it doesn't emit `404`. Treat both shapes as \"widget not found\".\n */\nconst isMissingUpstreamPayload = (data: unknown): boolean =>\n data == null || (typeof data === 'object' && !Array.isArray(data) && Object.keys(data as object).length === 0);\n\n/**\n * Routes a normalized (camelCased + numeric-fixed) upstream payload to the right transform by shape:\n * `version: 2` \u2192 CAB parse; a v1 content block \u2192 `convertContentBlockToV2`; a v1 line-item editor \u2192\n * `convertLineItemEditorToV2`; a v1 offer (`type: shopify_checkout_extension`, checked LAST \u2014 it has no\n * `version` discriminator) \u2192 `convertOfferToV2`. Every other widget type passes through unchanged \u2014 its\n * converter slots in here in the phase that introduces it.\n */\nconst dispatchWidgetTransform = (id: number, normalized: unknown): unknown => {\n if (isCABRootSection(normalized)) return CABRootSection.parse(normalizeTextContent(normalized));\n\n if (isContentBlockV1(normalized)) return convertContentBlockToV2({ id, settings: normalized });\n\n if (isLineItemEditorV1(normalized)) return convertLineItemEditorToV2({ id, settings: normalized });\n\n if (isOfferV1(normalized)) return convertOfferToV2({ id, name: normalized.name, settings: normalized });\n\n return normalized;\n};\n\n/**\n * Fetch ONE widget's raw settings from the engine and convert them to a CAB section tree (or pass a non-CAB\n * widget through). Throws {@link NotFoundError} for deleted/missing widgets; the params are shop-scoped.\n */\nexport const convertWidgetSettings = async (input: WidgetSettingsInput, ctx: ServerContext): Promise<unknown> => {\n const params: Record<string, string> = { id: String(input.id), shop: input.shop };\n\n if (input.cacheKey != null) params.cache_key = String(input.cacheKey);\n\n if (input.key) params.key = input.key;\n\n let upstream: unknown;\n\n try {\n upstream = await ctx.fetchUpstream('/api/v1/widgets/settings', params, { host: ctx.host });\n } catch (err) {\n // The legacy controller returns 4xx (e.g. 400 \"Invalid widget ID (probably deleted)\") for missing\n // widgets; treat any 4xx as \"not found\" \u2014 malformed input is already blocked upstream by Zod.\n if (err instanceof UpstreamError && err.status >= 400 && err.status < 500) {\n throw new NotFoundError(`Widget not found: ${input.id}`);\n }\n\n throw err;\n }\n\n const data = unwrapData(upstream);\n\n if (isMissingUpstreamPayload(data)) throw new NotFoundError(`Widget not found: ${input.id}`);\n\n return dispatchWidgetTransform(input.id, convertNumericObjects(deepCamelCase(data)));\n};\n"],
5
+ "mappings": ";AAOO,IAAM,oBAAoB;AA+B1B,IAAM,gBAAN,cAA4B,MAAM;AAAA,EAIrC,YAAY,QAAgB,MAAe,SAAkB;AACzD,UAAM,WAAW,qBAAqB,MAAM,EAAE;AAC9C,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,SAAS;AAAA,EAClB;AACJ;AAGO,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACrC,YAAY,SAAiB;AACzB,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EAChB;AACJ;;;ACxDA,SAAS,KAAAA,UAAS;;;ACAlB,SAAS,SAAS;AAGX,IAAM,aAAa,EAAE,OAAO;AAAA,EAC/B,mBAAmB,EAAE;AAAA,IACjB,EAAE,OAAO;AAAA,MACL,MAAM,EAAE;AAAA,QACJ,EAAE,OAAO;AAAA,UACL,WAAW,EAAE,OAAO;AAAA,UACpB,UAAU,EAAE,OAAO,EAAE,QAAQ;AAAA,UAC7B,WAAW,EAAE,OAAO,OAAO;AAAA,UAC3B,IAAI,EAAE,OAAO,OAAO;AAAA,UACpB,iBAAiB,EAAE,OAAO,EAAE,QAAQ;AAAA,UACpC,SAAS,EAAE,OAAO,OAAO;AAAA,QAC7B,CAAC;AAAA,MACL;AAAA,MACA,IAAI,EAAE,OAAO,OAAO;AAAA,MACpB,MAAM,EAAE,OAAO;AAAA,MACf,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,MAChC,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,MACnC,eAAe,EAAE,OAAO,OAAO,EAAE,SAAS;AAAA,MAC1C,MAAM,EAAE,OAAO;AAAA,IACnB,CAAC;AAAA,EACL;AAAA,EACA,gBAAgB,EAAE;AAAA,IACd,EAAE,OAAO;AAAA,MACL,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,MACjC,IAAI,EAAE,OAAO;AAAA,MACb,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,MACjC,UAAU,EAAE,QAAQ;AAAA,MACpB,YAAY,EAAE,QAAQ;AAAA,MACtB,WAAW,EAAE,OAAO;AAAA,MACpB,aAAa,EAAE,OAAO;AAAA,MACtB,WAAW,EAAE,OAAO;AAAA,MACpB,WAAW,EAAE,OAAO;AAAA,MACpB,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,IACvC,CAAC;AAAA,EACL;AAAA,EACA,QAAQ,EAAE,OAAO;AAAA,EACjB,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,UAAU,EAAE,OAAO,OAAO;AAAA,EAC1B,UAAU,EAAE,KAAK,CAAC,YAAY,QAAQ,CAAC;AAAA,EACvC,UAAU,EAAE,OAAO;AAAA,EACnB,gBAAgB,EAAE,OAAO;AAAA,EACzB,QAAQ,EAAE,OAAO;AAAA,EACjB,eAAe,EAAE,QAAQ;AAAA,EACzB,8BAA8B,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EAChD,4BAA4B,EAAE,QAAQ;AAAA,EACtC,uBAAuB,EAAE,QAAQ;AAAA,EACjC,IAAI,EAAE,OAAO,OAAO;AAAA,EACpB,cAAc,EAAE;AAAA,IACZ,EAAE,KAAK;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ,CAAC;AAAA,IACD,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,EAAE,QAAQ,CAAC,CAAC;AAAA,EACtC;AAAA,EACA,SAAS,EAAE,OAAO;AAAA,IACd,SAAS,EAAE,QAAQ;AAAA,EACvB,CAAC;AAAA,EACD,UAAU,EACL,OAAO;AAAA,IACJ,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,CAAC,EACA,QAAQ;AAAA,EACb,aAAa,EAAE,OAAO;AAAA,EACtB,iBAAiB,EAAE,OAAO;AAAA,EAC1B,eAAe,EAAE,OAAO;AAAA,EACxB,sBAAsB,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,UAAU,CAAC,UAAU,UAAU,KAAK;AAAA,EAChF,sBAAsB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1C,qBAAqB,EAAE,QAAQ;AAAA,EAC/B,QAAQ,EAAE,OAAO;AAAA,EACjB,4BAA4B,EAAE,QAAQ;AAAA,EACtC,UAAU,EAAE,OAAO;AAAA,EACnB,uBAAuB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3C,eAAe,EAAE,QAAQ;AAC7B,CAAC;;;ADjFM,IAAM,aAAaC,GAAE,OAAO;AAAA,EAC/B,MAAM;AAAA,EACN,WAAWA,GAAE,QAAQ;AAAA,EACrB,YAAYA,GAAE,MAAMA,GAAE,QAAQ,CAAC;AACnC,CAAC;;;AERD,SAAS,MAAMC,gBAAc;AAC7B,SAAS,KAAAC,WAAS;;;ACDX,IAAM,aAAa,CAA8B,WACpD,OAAO,OAAO,OAAO,YAAY,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAExD,IAAM,eAAe,CAAC,QAAQ,WAAW,WAAW,UAAU;AAC9D,IAAM,cAAc,WAAW,YAAY;AAG3C,IAAM,cAAc,CAAC,QAAQ,SAAS,QAAQ,SAAS,cAAc;AACrE,IAAM,eAAe,WAAW,WAAW;AAG3C,IAAM,eAAe,CAAC,QAAQ,QAAQ,UAAU,QAAQ;AACxD,IAAM,cAAc,WAAW,YAAY;AAG3C,IAAM,eAAe,CAAC,QAAQ,UAAU,OAAO;AAC/C,IAAM,cAAc,WAAW,YAAY;AAG3C,IAAM,gBAAgB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAEO,IAAM,eAAe,WAAW,aAAa;AAG7C,IAAM,eAAe;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAEO,IAAM,cAAc,WAAW,YAAY;AAG3C,IAAM,eAAe,CAAC,WAAW,aAAa,SAAS,QAAQ;AAC/D,IAAM,cAAc,WAAW,YAAY;AAG3C,IAAM,aAAa,CAAC,WAAW,QAAQ,MAAM;AAC7C,IAAM,YAAY,WAAW,UAAU;AAGvC,IAAM,kBAAkB,CAAC,SAAS,kBAAkB;AACpD,IAAM,iBAAiB,WAAW,eAAe;AAGjD,IAAM,gBAAgB,CAAC,QAAQ,cAAc,SAAS,cAAc;AACpE,IAAM,eAAe,WAAW,aAAa;AAG7C,IAAM,cAAc;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAEO,IAAM,aAAa,WAAW,WAAW;AAGzC,IAAM,uBAAuB,CAAC,SAAS,UAAU,KAAK;AACtD,IAAM,sBAAsB,WAAW,oBAAoB;AAG3D,IAAM,eAAe;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAEO,IAAM,cAAc,WAAW,YAAY;AAG3C,IAAM,aAAa,CAAC,SAAS,SAAS;AACtC,IAAM,YAAY,WAAW,UAAU;AAGvC,IAAM,mBAAmB,CAAC,eAAe,aAAa,cAAc,UAAU;AAC9E,IAAM,kBAAkB,WAAW,gBAAgB;AAUnD,IAAM,eAAe,CAAC,YAAY,gBAAgB,MAAM;AACxD,IAAM,cAAc,WAAW,YAAY;AAG3C,IAAM,oBAAoB,CAAC,cAAc,YAAY,WAAW,UAAU;AAC1E,IAAM,mBAAmB,WAAW,iBAAiB;AAGrD,IAAM,iBAAiB,CAAC,UAAU,QAAQ;AAC1C,IAAM,gBAAgB,WAAW,cAAc;AAG/C,IAAM,eAAe,CAAC,SAAS,WAAW,OAAO;AACjD,IAAM,cAAc,WAAW,YAAY;AAG3C,IAAM,eAAe;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAEO,IAAM,cAAc,WAAW,YAAY;AAG3C,IAAM,WAAW,CAAC,QAAQ,cAAc,SAAS,QAAQ,SAAS,YAAY;AAC9E,IAAM,UAAU,WAAW,QAAQ;AAGnC,IAAM,iBAAiB,CAAC,SAAS,UAAU,KAAK;AAChD,IAAM,gBAAgB,WAAW,cAAc;AAG/C,IAAM,iBAAiB,CAAC,QAAQ,WAAW,UAAU,cAAc,WAAW,WAAW,UAAU;AACnG,IAAM,gBAAgB,WAAW,cAAc;AAG/C,IAAM,gBAAgB,CAAC,cAAc,SAAS,QAAQ,UAAU,SAAS,YAAY;AACrF,IAAM,eAAe,WAAW,aAAa;AAG7C,IAAM,eAAe,CAAC,YAAY,QAAQ;AAC1C,IAAM,cAAc,WAAW,YAAY;AAG3C,IAAM,mBAAmB,CAAC,QAAQ,SAAS,QAAQ;AACnD,IAAM,kBAAkB,WAAW,gBAAgB;AAGnD,IAAM,qBAAqB,CAAC,OAAO,UAAU,QAAQ;AACrD,IAAM,oBAAoB,WAAW,kBAAkB;;;AC9MvD,IAAM,sBAAsB;AAG5B,IAAM,kBAAkB;AAGxB,IAAM,kBAAkB;;;ACV/B,SAAS,KAAAC,UAAS;AAEX,IAAM,YAAY;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAEA,IAAM,WAAWA,GAAE,KAAK,SAAS;AAE1B,IAAM,WAAW,SAAS;AAG1B,IAAM,gBAAgB;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAEA,IAAM,eAAeA,GAAE,KAAK,aAAa;AAElC,IAAM,eAAe,aAAa;AAGlC,IAAM,gBAAgBA,GAAE,OAAO;AAAA,EAClC,UAAUA,GAAE,KAAK,aAAa,EAAE,QAAQ,aAAa,QAAQ;AAAA,EAC7D,UAAUA,GAAE,MAAM,CAACA,GAAE,MAAMA,GAAE,QAAQ,CAAC,GAAGA,GAAE,aAAa,CAAC,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EAClG,MAAMA,GAAE,KAAK,SAAS,EAAE,QAAQ,SAAS,aAAa;AAAA,EACtD,OAAOA,GAAE,OAAO,OAAO,EAAE,QAAQ,EAAE;AACvC,CAAC;AAIM,IAAM,iBAAiBA,GAAE,OAAO;AAAA,EACnC,OAAOA,GAAE,MAAM,aAAa,EAAE,QAAQ,MAAM,CAAC,CAAC;AAClD,CAAC;AAIM,IAAM,UAAUA,GAAE,OAAO;AAAA,EAC5B,cAAcA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAChD,SAASA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAClC,SAASA,GACJ,MAAM;AAAA,IACHA,GAAE;AAAA,MACEA,GAAE,OAAO;AAAA,QACL,eAAeA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,QACvC,OAAOA,GAAE,MAAM,cAAc,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,QAC/C,QAAQA,GACH;AAAA,UACGA,GAAE,OAAO;AAAA,YACL,KAAKA,GAAE,OAAO,EAAE,QAAQ,aAAa;AAAA,YACrC,MAAMA,GAAE,QAAQ,WAAW,EAAE,QAAQ,WAAW;AAAA,YAChD,OAAOA,GAAE,OAAO,EAAE,QAAQ,MAAM;AAAA,UACpC,CAAC;AAAA,QACL,EACC,QAAQ,MAAM,CAAC,EAAE,KAAK,eAAe,MAAM,aAAsB,OAAO,OAAO,CAAC,CAAC;AAAA,MAC1F,CAAC;AAAA,IACL;AAAA,IACAA,GAAE,aAAa,CAAC,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC;AAAA,EACzC,CAAC,EACA,QAAQ,MAAM,CAAC,CAAC;AACzB,CAAC;;;AClFD,SAAS,KAAAC,WAAuB;;;ACDhC,SAAS,KAAAC,UAAS;;;ACAlB,SAAS,MAAM,cAAc;AAC7B,SAAS,KAAAC,UAAS;AAkBX,IAAM,WAAWC,GAAE,MAAM,CAACA,GAAE,QAAQ,MAAM,GAAGA,GAAE,QAAQ,MAAM,GAAGA,GAAE,OAAO,EAAE,MAAM,QAAQ,GAAGA,GAAE,OAAO,CAAC,CAAC;AAGvG,IAAM,mBAAmBA,GAAE,OAAO;AAAA,EACrC,WAAWA,GACN,OAAO;AAAA,IACJ,YAAYA,GAAE,KAAK,oBAAoB,EAAE,QAAQ,oBAAoB,KAAK;AAAA,IAC1E,UAAUA,GAAE,KAAK,kBAAkB,EAAE,QAAQ,kBAAkB,GAAG;AAAA,EACtE,CAAC,EACA,QAAQ;AAAA,IACL,YAAY,oBAAoB;AAAA,IAChC,UAAU,kBAAkB;AAAA,EAChC,CAAC;AAAA,EACL,QAAQA,GAAE,KAAK,MAAM,SAAS;AAAA,EAC9B,aAAaA,GAAE,KAAK,YAAY,EAAE,SAAS;AAAA,EAC3C,WAAWA,GAAE,KAAK,UAAU,EAAE,QAAQ,UAAU,IAAI;AAAA,EACpD,MAAMA,GACD,OAAO;AAAA,IACJ,SAASA,GAAE,MAAM,CAACA,GAAE,MAAM,QAAQ,GAAGA,GAAE,UAAU,CAAC,CAAC,EAAE,QAAQ,MAAM,CAAC,MAAM,CAAC;AAAA,IAC3E,MAAMA,GAAE,MAAM,CAACA,GAAE,MAAM,QAAQ,GAAGA,GAAE,UAAU,CAAC,CAAC,EAAE,QAAQ,MAAM,CAAC,MAAM,CAAC;AAAA,EAC5E,CAAC,EACA,QAAQ,EAAE,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAC7C,SAAS;AAAA,EACd,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,SAASA,GAAE,KAAK,QAAQ,EAAE,QAAQ,QAAQ,IAAI;AAAA,EAC9C,MAAM,QAAQ,SAAS;AAAA,EACvB,WAAWA,GAAE,KAAK,EAAE,QAAQ,MAAM,OAAO,CAAC;AAAA,EAC1C,UAAUA,GAAE,MAAM,CAACA,GAAE,MAAMA,GAAE,KAAK,MAAM,UAAU,CAAC,GAAGA,GAAE,aAAa,CAAC,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC/G,aAAaA,GAAE,QAAQ,YAAY,MAAM,EAAE,QAAQ,YAAY,MAAM;AAAA,EACrE,SAASA,GAAE,KAAK,QAAQ,EAAE,QAAQ,QAAQ,IAAI;AAAA;AAAA,EAE9C,SAASA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,OAAOA,GAAE,OAAO,EAAE,QAAQ,GAAG;AACjC,CAAC;;;AD9CM,IAAM,mBAAmBC,GAAE;AAAA,EAAK,MACnC,iBAAiB,KAAK,EAAE,aAAa,KAAK,CAAC,EAAE,OAAO;AAAA,IAChD,aAAaA,GAAE,KAAK,YAAY,EAAE,SAAS;AAAA,IAC3C,OAAOA,GAAE,KAAK,YAAY,EAAE,QAAQ,MAAM;AAAA,IAC1C,aAAaA,GAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,IACrC,aAAaA,GAAE,QAAQ,YAAY,MAAM,EAAE,QAAQ,YAAY,MAAM;AAAA,EACzE,CAAC;AACL;;;AEbA,SAAS,MAAMC,eAAc;AAC7B,SAAS,KAAAC,UAAuB;;;ACDhC,SAAS,SAAS,YAAAC,iBAAgB;AAClC,SAAS,MAAMC,eAAc;AAC7B,SAAS,KAAAC,UAAS;;;ACFlB,SAAS,eAAe,iBAAiB;AACzC,SAAS,OAAO,KAAK,SAAS,UAAU,KAAK,MAAM,eAAe;AAsB3D,IAAM,SAAS,CAAC,OAA2B,OAAgB;AAC9D,MAAI,OAAO,WAAW,aAAa;AAC/B,UAAM,SAAS,IAAI,UAAU;AAC7B,UAAM,MAAM,OAAO,gBAAgB,MAAM,WAAW;AAEpD,UAAM,UAAU,CAAC,aAAuB,MAAM,KAAK,QAAQ,EAAE,KAAK,CAAC,SAAS,KAAK,aAAa,CAAC;AAE/F,WAAO,QAAQ,IAAI,KAAK,UAAU,KAAK,QAAQ,IAAI,KAAK,UAAU;AAAA,EACtE;AAEA,SAAO,gBAAgB,KAAK,IAAI;AACpC;AAEO,IAAM,eAAe,CAAC,QACzB,IAAI,QAAQ,KAAK,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,QAAQ,KAAK,CAAC,EAAE,KAAK,MAAM,OAAO,IAAI,CAAC,CAAC;AAE5E,IAAM,eAAe,CAAC,UACzB,EAAG,SAAS,KAAK,KAAK,OAAO,KAAK,KAAO,cAAc,KAAK,KAAK,aAAa,KAAuB;AAElG,IAAM,UAAU,EAAE,SAAS,wBAAwB;;;ADlB1D,IAAM,aAAa,IAA8C,SAC7DC,GACK,OAAO,EACP,UAAU,CAAC,QAAS,KAAK,SAAS,GAAgB,IAAK,MAAoB,MAAU,EACrF,SAAS;AAEX,IAAM,aAAaA,GAAE,OAAO;AAAA,EAC/B,OAAOA,GACF,MAAM;AAAA,IACHA,GAAE;AAAA,MACEA,GAAE,mBAAmB,QAAQ;AAAA,QACzBA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,QACpCA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,QACtCA,GAAE,OAAO;AAAA,UACL,OAAOA,GAAE,OAAO;AAAA,YACZ,OAAOA,GAAE,OAAO,EAAE,SAAS;AAAA,YAC3B,MAAMA,GAAE,MAAM,CAACA,GAAE,IAAI,GAAGA,GAAE,QAAQ,GAAG,GAAGA,GAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC,CAAC;AAAA,YAC9E,KAAKA,GAAE,OAAO,EAAE,QAAQ,8BAA8B;AAAA,YACtD,QAAQA,GAAE,OAAO,EAAE,QAAQ,QAAQ;AAAA,UACvC,CAAC;AAAA,UACD,MAAMA,GAAE,QAAQ,MAAM;AAAA,QAC1B,CAAC;AAAA,QACDA,GAAE,OAAO,EAAE,MAAMA,GAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,QACtCA,GAAE,OAAO;AAAA,UACL,OAAOA,GAAE,OAAO;AAAA,YACZ,OAAO,WAAW,GAAG,cAAc,EAAE,QAAQ,cAAc,IAAI;AAAA,YAC/D,UAAU,WAAW,GAAG,aAAa,EAAE,QAAQ,aAAa,IAAI;AAAA,UACpE,CAAC;AAAA,UACD,MAAMA,GAAE,QAAQ,WAAW;AAAA,QAC/B,CAAC;AAAA,MACL,CAAC;AAAA,IACL;AAAA,IACAA,GAAE,aAAa,CAAC,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC;AAAA,EACzC,CAAC,EACA,SAAS;AAAA,EACd,MAAMA,GAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,EAC3B,MAAMA,GAAE,QAAQ,MAAM,EAAE,QAAQ,MAAM;AAC1C,CAAC;AAIM,IAAM,kBAAkBA,GAAE,OAAO;AAAA,EACpC,OAAOA,GACF,OAAO;AAAA,IACJ,WAAW,WAAW,GAAG,cAAc;AAAA,EAC3C,CAAC,EACA,QAAQ,EAAE,WAAW,cAAc,MAAM,CAAC;AAAA,EAC/C,SAASA,GAAE,MAAM,CAACA,GAAE,MAAM,UAAU,GAAGA,GAAE,aAAa,CAAC,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EAChG,MAAMA,GAAE,QAAQ,WAAW,EAAE,QAAQ,WAAW;AACpD,CAAC;AAIM,IAAM,iBAAiBA,GAAE,OAAO;AAAA,EACnC,OAAOA,GACF,OAAO;AAAA,IACJ,cAAc,WAAW,GAAG,QAAQ;AAAA,EACxC,CAAC,EACA,QAAQ,EAAE,cAAc,QAAQ,KAAK,CAAC;AAAA,EAC3C,SAASA,GACJ,MAAM,CAACA,GAAE,MAAM,eAAe,GAAGA,GAAE,aAAa,CAAC,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC,EACxE,QAAQ,MAAM,CAAC,gBAAgB,MAAM,CAAC,CAAC,CAAC,CAAC;AAAA,EAC9C,MAAMA,GAAE,QAAQ,KAAK,EAAE,QAAQ,KAAK;AACxC,CAAC;AAIM,IAAM,kBAAkBA,GAAE,OAAO;AAAA,EACpC,WAAWA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY;AAAA,EACxC,YAAYA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,QAAQ,OAAO,CAAC,EAAE;AAAA,EACnF,UAAUA,GAAE,KAAK,iBAAiB,EAAE,QAAQ,iBAAiB,QAAQ;AACzE,CAAC;AAIM,IAAM,iBAAiBA,GACzB,OAAO;AAAA,EACJ,aAAaA,GAAE,KAAK,YAAY,EAAE,SAAS;AAAA,EAC3C,SAASA,GACJ,OAAOA,GAAE,OAAO,GAAGA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAG,cAAc,CAAC,EAAE,OAAO,cAAc,OAAO,EAAE,SAAS,CAAC,EACjG,QAAQ,EAAE,IAAI,eAAe,MAAM,CAAC,CAAC,EAAE,CAAC,EACxC,SAAS;AAAA,EACd,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,MAAM,QAAQ,SAAS;AAAA,EACvB,WAAWA,GAAE,KAAK,EAAE,QAAQ,MAAMC,QAAO,CAAC;AAAA,EAC1C,aAAaD,GAAE,QAAQ,YAAY,IAAI,EAAE,QAAQ,YAAY,IAAI;AAAA,EACjE,MAAM,gBAAgB,SAAS;AACnC,CAAC,EACA,YAAY,CAAC,EAAE,aAAa,QAAQ,GAAG,QAAQ;AAC5C,MAAI,gBAAgB,YAAY,kBAAkB,SAAS;AACvD,YAAQ,SAAS,CAAC,OAAO,SAAS;AAC9B,UAAI,SAASE,UAAS,KAAK,GAAG;AAC1B,YAAI,oBAAoB,KAAK,KAAK,EAAG;AAErC,YAAI;AACA,cAAI,IAAI,KAAK;AAAA,QACjB,QAAQ;AACJ,cAAI,SAAS;AAAA,YACT,MAAM;AAAA,YACN,SAAS;AAAA,YACT,MAAM,CAAC,WAAW,IAAI;AAAA,UAC1B,CAAC;AAAA,QACL;AAAA,MACJ;AAAA,IACJ,CAAC;AAAA,EACL;AACJ,CAAC;;;AD7GE,IAAM,mBAA8CC,GAAE;AAAA,EAAK,MAC9DA,GAAE,mBAAmB,eAAe,CAAC,iBAAiB,kBAAkB,cAAc,CAAC;AAC3F;AAEO,IAAM,mBAAmBA,GAAE,OAAO;AAAA,EACrC,QAAQA,GAAE,MAAM,CAACA,GAAE,QAAQ,EAAE,GAAGA,GAAE,KAAK,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE;AAAA,EAClE,aAAaA,GAAE,KAAK,YAAY,EAAE,QAAQ,YAAY,OAAO;AAAA,EAC7D,QAAQA,GACH,OAAO;AAAA,IACJ,OAAOA,GAAE,OAAO,EAAE,MAAM,eAAe,EAAE,QAAQ,SAAS;AAAA,IAC1D,QAAQA,GAAE,OAAO,EAAE,QAAQ,EAAE;AAAA,IAC7B,OAAOA,GAAE,OAAO,EAAE,QAAQ,GAAG;AAAA,EACjC,CAAC,EACA,QAAQ;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,EACX,CAAC;AAAA,EACL,kBAAkBA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAC3C,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,UAAUA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,SAASA,GACJ,OAAO;AAAA,IACJ,WAAWA,GAAE,KAAK,cAAc,EAAE,QAAQ,cAAc,MAAM;AAAA,IAC9D,UAAUA,GAAE,KAAK,gBAAgB,EAAE,QAAQ,gBAAgB,UAAU;AAAA,EACzE,CAAC,EACA,SAAS,EACT,QAAQ,OAAO;AAAA,IACZ,WAAW,cAAc;AAAA,IACzB,UAAU,gBAAgB;AAAA,EAC9B,EAAE;AAAA,EACN,MAAM,QAAQ,SAAS;AAAA,EACvB,WAAWA,GAAE,KAAK,EAAE,QAAQ,MAAMC,QAAO,CAAC;AAAA,EAC1C,UAAUD,GAAE,MAAM,CAACA,GAAE,MAAM,gBAAgB,GAAGA,GAAE,aAAa,CAAC,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EACvG,aAAaA,GAAE,QAAQ,YAAY,MAAM,EAAE,QAAQ,YAAY,MAAM;AAAA;AAAA,EAErE,aAAaA,GAAE,OAAO,EAAE,SAAS;AACrC,CAAC;;;AG3DD,SAAS,KAAAE,WAAS;;;ACAlB,SAAS,KAAAC,WAAS;;;ACAlB,SAAS,MAAMC,eAAc;AAC7B,SAAS,KAAAC,UAAS;;;ACDlB,SAAS,cAAc;AAKhB,IAAM,oBAAoB;AAAA,EAC7B,EAAE,OAAO,oBAAoB,OAAO,wBAAwB;AAAA,EAC5D,EAAE,OAAO,eAAe,OAAO,wBAAwB;AAAA,EACvD,EAAE,OAAO,gBAAgB,OAAO,sBAAsB;AAAA,EACtD,EAAE,OAAO,mBAAmB,OAAO,mBAAmB;AAAA,EACtD,EAAE,OAAO,mBAAmB,OAAO,mBAAmB;AAAA,EACtD,EAAE,OAAO,uBAAuB,OAAO,wBAAwB;AAAA,EAC/D,EAAE,OAAO,yBAAyB,OAAO,6BAA6B;AAC1E;AAEO,IAAM,mBAAmB;AAAA,EAC5B,EAAE,OAAO,oBAAoB,OAAO,wBAAwB;AAAA,EAC5D,EAAE,OAAO,eAAe,OAAO,wBAAwB;AAAA,EACvD,EAAE,OAAO,qBAAqB,OAAO,8BAA8B;AAAA,EACnE,EAAE,OAAO,gBAAgB,OAAO,sBAAsB;AAAA,EACtD,EAAE,OAAO,uBAAuB,OAAO,wBAAwB;AAAA,EAC/D,EAAE,OAAO,mBAAmB,OAAO,mBAAmB;AAAA,EACtD,EAAE,OAAO,mBAAmB,OAAO,mBAAmB;AAAA,EACtD,EAAE,OAAO,mBAAmB,OAAO,mBAAmB;AAAA,EACtD,EAAE,OAAO,yBAAyB,OAAO,6BAA6B;AAC1E;AAEO,IAAM,qBAAqB,OAAO,CAAC,GAAG,mBAAmB,GAAG,gBAAgB,GAAG,CAAC,SAAS,KAAK,KAAK;AAEnG,IAAM,cAAc;AAAA,EACvB,CAAC,WAAW,iBAAiB,GAAG;AAAA,IAC5B,EAAE,MAAM,mBAAmB,OAAO,eAAe,OAAO,QAAQ;AAAA,IAChE,EAAE,MAAM,oBAAoB,OAAO,eAAe,OAAO,QAAQ;AAAA,IACjE,EAAE,MAAM,qBAAqB,OAAO,kBAAkB,OAAO,QAAQ;AAAA,EACzE;AAAA,EACA,CAAC,WAAW,iBAAiB,GAAG;AAAA,EAChC,CAAC,WAAW,YAAY,GAAG;AAAA,IACvB,EAAE,MAAM,mBAAmB,OAAO,eAAe,OAAO,QAAQ;AAAA,IAChE,EAAE,MAAM,oBAAoB,OAAO,eAAe,OAAO,QAAQ;AAAA,IACjE,EAAE,MAAM,qBAAqB,OAAO,kBAAkB,OAAO,QAAQ;AAAA,EACzE;AAAA,EACA,CAAC,WAAW,eAAe,GAAG;AAAA;AAAA,IAE1B,EAAE,MAAM,mBAAmB,OAAO,eAAe,OAAO,SAAS;AAAA,IACjE,EAAE,MAAM,MAAM,MAAM,iBAAiB,OAAO,aAAa,OAAO,QAAQ;AAAA,IACxE,EAAE,MAAM,sBAAsB,OAAO,eAAe,OAAO,SAAS;AAAA,EACxE;AAAA,EACA,CAAC,WAAW,eAAe,GAAG;AAAA;AAAA,IAE1B,EAAE,MAAM,mBAAmB,OAAO,aAAa,OAAO,SAAS;AAAA,EACnE;AAAA,EACA,CAAC,WAAW,mBAAmB,GAAG;AAAA;AAAA,IAE9B,EAAE,MAAM,mBAAmB,OAAO,aAAa,OAAO,SAAS;AAAA,EACnE;AACJ;AAEO,IAAM,cAAc;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ;AAEO,IAAM,aAAa,WAAW,WAAW;;;AD3EzC,IAAM,cAAcC,GAAE,OAAO;AAAA,EAChC,QAAQA,GAAE,MAAM,CAACA,GAAE,OAAO,GAAGA,GAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;AAAA,EACjD,cAAcA,GAAE,OAAO,EAAE,SAAS;AAAA,EAClC,gBAAgBA,GAAE,KAAK,eAAe,EAAE,SAAS,EAAE,MAAM,MAAS;AAAA,EAClE,MAAMA,GAAE,KAAK,aAAa,EAAE,MAAM,MAAM;AAC5C,CAAC;AAIM,IAAM,kBAAkBA,GAAE,OAAO;AAAA,EACpC,SAASA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAClC,OAAOA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAChC,SAASA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAClC,MAAMA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAC/B,QAAQA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACjC,QAAQA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACjC,WAAWA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACpC,SAASA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EAClC,OAAOA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AACpC,CAAC;AAIM,IAAM,uBAAuBA,GAAE,OAAO;AAAA,EACzC,cAAcA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAChD,gBAAgBA,GAAE,OAAO,EAAE,QAAQ,kBAAkB,CAAC,EAAE,KAAK;AAAA,EAC7D,UAAU,YAAY,SAAS;AAAA,EAC/B,cAAc,gBAAgB,SAAS;AAAA,EACvC,OAAOA,GAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC3B,cAAcA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACvC,wBAAwBA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACjD,MAAMA,GAAE,OAAO,EAAE,QAAQ,kBAAkB,CAAC,EAAE,KAAK;AAAA,EACnD,aAAaA,GAAE,KAAK,YAAY,EAAE,SAAS;AAAA,EAC3C,WAAWA,GAAE,KAAK,EAAE,QAAQ,MAAMC,QAAO,CAAC;AAAA,EAC1C,aAAaD,GAAE,QAAQ,YAAY,UAAU,EAAE,QAAQ,YAAY,UAAU;AAAA,EAC7E,YAAYA,GAAE,QAAQ,EAAE,QAAQ,KAAK;AACzC,CAAC;;;AE3CD,SAAS,MAAME,eAAc;AAC7B,SAAS,KAAAC,WAAS;;;ACDlB,SAAS,MAAMC,eAAc;AAC7B,SAAS,KAAAC,UAAuB;AASzB,IAAM,oBAAgDC,GAAE;AAAA,EAAK,MAChEA,GAAE,mBAAmB,eAAe,CAAC,kBAAkB,cAAc,CAAC;AAC1E;AAEO,IAAM,oBAAoBA,GAAE,OAAO;AAAA,EACtC,MAAMA,GAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,WAAWA,GAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC7C,WAAWA,GAAE,KAAK,EAAE,QAAQ,MAAMC,QAAO,CAAC;AAAA,EAC1C,UAAUD,GAAE,MAAM,CAACA,GAAE,MAAM,iBAAiB,GAAGA,GAAE,aAAa,CAAC,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EACxG,aAAaA,GAAE,QAAQ,YAAY,OAAO,EAAE,QAAQ,YAAY,OAAO;AAAA,EACvE,WAAWA,GAAE,OAAOA,GAAE,OAAO,GAAGA,GAAE,KAAK,gBAAgB,EAAE,QAAQ,gBAAgB,IAAI,CAAC,EAAE,QAAQ,OAAO,CAAC,EAAE;AAAA,EAC1G,aAAaA,GAAE,KAAK,YAAY,EAAE,QAAQ,YAAY,QAAQ;AAClE,CAAC;;;ADfM,IAAM,qBAAqBE,IAAE,OAAO;AAAA,EACvC,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,WAAWA,IAAE,KAAK,EAAE,QAAQ,MAAMC,QAAO,CAAC;AAAA,EAC1C,UAAUD,IACL,MAAM,CAACA,IAAE,MAAMA,IAAE,KAAK,MAAM,iBAAiB,CAAC,GAAGA,IAAE,aAAa,CAAC,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC,EACxF,QAAQ,MAAM,CAAC,CAAC;AAAA,EACrB,aAAaA,IAAE,QAAQ,YAAY,QAAQ,EAAE,QAAQ,YAAY,QAAQ;AAC7E,CAAC;;;AHHM,IAAM,mBAAmBE,IAAE;AAAA,EAAK,MACnC,iBAAiB,KAAK,EAAE,UAAU,MAAM,aAAa,KAAK,CAAC,EAAE,OAAO;AAAA,IAChE,UAAUA,IAAE,MAAM,CAACA,IAAE,MAAMA,IAAE,KAAK,MAAM,UAAU,CAAC,GAAGA,IAAE,aAAa,CAAC,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,MAAM;AAAA,MACzG,iBAAiB,MAAM;AAAA,QACnB,aAAa;AAAA,QACb,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,QACN,UAAU;AAAA,UACN,eAAe,MAAM,EAAE,SAAS,EAAE,IAAI,+CAA+C,EAAE,CAAC;AAAA,UACxF,iBAAiB,MAAM,EAAE,QAAQ,kBAAkB,aAAa,YAAY,MAAM,CAAC;AAAA,QACvF;AAAA,MACJ,CAAC;AAAA,MACD,qBAAqB,MAAM,CAAC,CAAC;AAAA,MAC7B,mBAAmB,MAAM,CAAC,CAAC;AAAA,IAC/B,CAAC;AAAA,IACD,aAAaA,IAAE,QAAQ,YAAY,MAAM,EAAE,QAAQ,YAAY,MAAM;AAAA,EACzE,CAAC;AACL;;;ADtBO,IAAM,qBAAqBC,IAAE;AAAA,EAAK,MACrC,iBAAiB,KAAK,EAAE,UAAU,MAAM,aAAa,KAAK,CAAC,EAAE,OAAO;AAAA,IAChE,qBAAqBA,IAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,IACzC,aAAaA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,IACxC,UAAUA,IACL,MAAM,CAACA,IAAE,MAAMA,IAAE,KAAK,MAAM,UAAU,CAAC,GAAGA,IAAE,aAAa,CAAC,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC,EACjF,QAAQ,MAAM,CAAC,iBAAiB,MAAM,CAAC,CAAC,CAAC,CAAC;AAAA,IAC/C,aAAaA,IAAE,QAAQ,YAAY,QAAQ,EAAE,QAAQ,YAAY,QAAQ;AAAA,EAC7E,CAAC;AACL;;;AMhBA,SAAS,KAAAC,WAAS;AAOX,IAAM,qBAAqBC,IAAE;AAAA,EAAK,MACrC,iBAAiB,KAAK,EAAE,UAAU,MAAM,aAAa,KAAK,CAAC,EAAE,OAAO;AAAA,IAChE,UAAUA,IACL,MAAM,CAACA,IAAE,MAAMA,IAAE,KAAK,MAAM,UAAU,CAAC,GAAGA,IAAE,aAAa,CAAC,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC,EACjF,QAAQ,MAAM,CAAC,iBAAiB,MAAM,EAAE,QAAQ,aAAa,qBAAqB,CAAC,CAAC,CAAC;AAAA,IAC1F,aAAaA,IAAE,QAAQ,YAAY,QAAQ,EAAE,QAAQ,YAAY,QAAQ;AAAA,EAC7E,CAAC;AACL;;;ACdA,SAAS,MAAMC,eAAc;AAC7B,SAAS,KAAAC,WAAS;AAWX,IAAM,qBAAqBC,IAAE,OAAO;AAAA,EACvC,QAAQA,IAAE,MAAM,CAACA,IAAE,OAAO,GAAGA,IAAE,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;AAAA,EACjD,cAAcA,IAAE,OAAO,EAAE,SAAS;AAAA,EAClC,gBAAgBA,IAAE,KAAK,eAAe,EAAE,SAAS,EAAE,MAAM,MAAS;AAAA,EAClE,SAASA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,UAAUA,IAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EAC9B,WAAWA,IAAE,KAAK,EAAE,QAAQ,MAAMC,QAAO,CAAC;AAAA,EAC1C,aAAaD,IAAE,QAAQ,YAAY,QAAQ,EAAE,QAAQ,YAAY,QAAQ;AAAA,EACzE,MAAMA,IAAE,KAAK,aAAa,EAAE,MAAM,MAAM;AAC5C,CAAC;;;ACtBD,SAAS,MAAME,eAAc;AAC7B,SAAS,KAAAC,WAAS;AAMX,IAAM,qBAAqBC,IAAE,OAAO;AAAA,EACvC,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,MAAM,QAAQ,SAAS;AAAA,EACvB,WAAWA,IAAE,KAAK,EAAE,QAAQ,MAAMC,QAAO,CAAC;AAAA,EAC1C,aAAaD,IAAE,QAAQ,YAAY,QAAQ,EAAE,QAAQ,YAAY,QAAQ;AAC7E,CAAC;;;ACZD,SAAS,MAAME,eAAc;AAC7B,SAAS,KAAAC,WAAS;AAOX,IAAM,wBAAwBC,IAAE,OAAO;AAAA;AAAA,EAE1C,cAAcA,IAAE,MAAMA,IAAE,OAAO,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EAClD,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,MAAM,QAAQ,SAAS;AAAA,EACvB,WAAWA,IAAE,KAAK,EAAE,QAAQ,MAAMC,QAAO,CAAC;AAAA,EAC1C,UAAUD,IAAE,MAAM,CAACA,IAAE,MAAM,cAAc,GAAGA,IAAE,aAAa,CAAC,CAAC,EAAE,UAAU,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,EACrG,aAAaA,IAAE,QAAQ,YAAY,WAAW,EAAE,QAAQ,YAAY,WAAW;AACnF,CAAC;;;AChBD,SAAS,MAAME,gBAAc;AAC7B,SAAS,KAAAC,WAAS;AAMX,IAAM,qBAAqBC,IAAE,OAAO;AAAA,EACvC,eAAeA,IACV;AAAA,IACGA,IAAE,OAAO;AAAA,IACTA,IAAE,OAAO;AAAA,MACL,KAAKA,IAAE,OAAO,EAAE,SAAS;AAAA,MACzB,KAAKA,IAAE,OAAO,EAAE,SAAS;AAAA,MACzB,KAAKA,IAAE,OAAO,EAAE,SAAS;AAAA,IAC7B,CAAC;AAAA,EACL,EACC,QAAQ;AAAA,IACL,IAAI;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,IACT;AAAA,EACJ,CAAC;AAAA,EACL,WAAWA,IAAE,KAAK,cAAc,EAAE,QAAQ,cAAc,MAAM;AAAA,EAC9D,KAAKA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,QAAQ,EAAE;AAAA,EAC1C,KAAKA,IAAE,OAAO,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;AAAA,EAChC,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,MAAM,QAAQ,SAAS;AAAA,EACvB,WAAWA,IAAE,KAAK,EAAE,QAAQ,MAAMC,SAAO,CAAC;AAAA,EAC1C,aAAaD,IAAE,QAAQ,YAAY,QAAQ,EAAE,QAAQ,YAAY,QAAQ;AAC7E,CAAC;;;AC/BD,SAAS,MAAME,gBAAc;AAC7B,SAAS,KAAAC,WAAS;AAMX,IAAM,oBAAoBC,IAAE,OAAO;AAAA,EACtC,OAAOA,IAAE,OAAO,EAAE,QAAQ,SAAS;AAAA,EACnC,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,MAAM,QAAQ,SAAS;AAAA,EACvB,WAAWA,IAAE,KAAK,EAAE,QAAQ,MAAMC,SAAO,CAAC;AAAA,EAC1C,aAAaD,IAAE,QAAQ,YAAY,OAAO,EAAE,QAAQ,YAAY,OAAO;AAAA,EACvE,MAAMA,IAAE,KAAK,YAAY,EAAE,QAAQ,YAAY,OAAO;AAC1D,CAAC;;;ACdD,SAAS,aAAa;AACtB,SAAS,MAAME,gBAAc;AAC7B,SAAS,KAAAC,WAAS;AAMX,IAAM,qBAAqBC,IAAE,OAAO;AAAA,EACvC,wBAAwBA,IAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACjD,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,MAAM,QAAQ,SAAS;AAAA,EACvB,WAAWA,IAAE,KAAK,EAAE,QAAQ,MAAMC,SAAO,CAAC;AAAA,EAC1C,aAAaD,IAAE,QAAQ,YAAY,QAAQ,EAAE,QAAQ,YAAY,QAAQ;AAAA,EACzE,UAAUA,IAAE,KAAK,MAAM,kBAAkB,GAAG,CAAC,CAAC,EAAE,QAAQ,gBAAgB,IAAI;AAAA,EAC5E,aAAaA,IAAE,KAAK,YAAY,EAAE,QAAQ,YAAY,QAAQ;AAClE,CAAC;;;AlBOM,IAAM,YAAYE,IACpB,OAAO;AAAA,EACJ,QAAQA,IAAE,KAAK,WAAW,EAAE,QAAQ,aAAa,IAAI;AAAA,EACrD,OAAOA,IAAE,KAAK,YAAY,EAAE,QAAQ,YAAY,IAAI;AAAA,EACpD,OAAOA,IAAE,KAAK,YAAY,EAAE,QAAQ,YAAY,IAAI;AACxD,CAAC,EACA,QAAQ;AAAA,EACL,QAAQ,aAAa;AAAA,EACrB,OAAO,YAAY;AAAA,EACnB,OAAO,YAAY;AACvB,CAAC;AAIE,IAAM,aAAkCA,IAAE;AAAA,EAAK,MAClDA,IAAE,mBAAmB,eAAe;AAAA,IAChC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACJ,CAAC;AACL;;;AJhDO,IAAM,kBAAkBC,IAAE,OAAO;AAAA,EACpC,SAASA,IAAE,OAAO,EAAE,OAAO,cAAc,OAAO,EAAE,QAAQ,EAAE;AAAA,EAC5D,aAAaA,IAAE,QAAQ,CAAC,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EACjD,QAAQA,IAAE,KAAK,MAAM,SAAS;AAAA,EAC9B,aAAaA,IAAE,KAAK,YAAY,EAAE,SAAS;AAAA,EAC3C,UAAUA,IAAE,KAAK,CAAC,WAAW,SAAS,mBAAmB,iBAAiB,CAAC,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EACpG,MAAMA,IAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,eAAeA,IAAE,OAAO,EAAE,QAAQ,CAAC;AAAA,EACnC,cAAcA,IAAE,OAAO,EAAE,QAAQ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKlC,WAAWA,IAAE,KAAK,UAAU,EAAE,QAAQ,UAAU,OAAO;AAAA,EACvD,MAAM,QAAQ,SAAS;AAAA,EACvB,WAAWA,IAAE,KAAK,EAAE,QAAQ,MAAMC,SAAO,CAAC;AAAA,EAC1C,aAAaD,IAAE,QAAQ,YAAY,KAAK,EAAE,QAAQ,YAAY,KAAK;AAAA,EACnE,QAAQA,IAAE,MAAM,CAACA,IAAE,IAAI,GAAGA,IAAE,QAAQ,EAAE,GAAGA,IAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE;AAAA,EAC3F,OAAOA,IAAE,OAAO,EAAE,QAAQ,GAAG;AACjC,CAAC;;;AuB5BD,IAAM,kBAAkB;AACxB,IAAM,sBAAsB;AAC5B,IAAM,cAAc;AAEb,IAAM,wBAAwB,CAAC,SAClC,KAAK,QAAQ,iBAAiB,EAAE,EAAE,QAAQ,qBAAqB,EAAE,EAAE,QAAQ,aAAa,EAAE;;;ACMvF,IAAM,+BAA+B,CAAC;AAAA,EACzC;AAAA,EACA;AAAA,EACA,QAAQ,CAAC;AAAA,EACT;AAAA,EACA;AACJ,MAAgD;AAC5C,QAAM,gBAAgB,sBAAsB,IAAI;AAEhD,SAAO,gBAAgB,MAAM;AAAA,IACzB,OAAO,EAAE,UAAU;AAAA,IACnB,SAAS,gBACH;AAAA,MACI;AAAA,QACI,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,SAAS,GAAG,MAAM,YAAY,GAAG,GAAG,KAAK;AAAA,QACnE,MAAM;AAAA,QACN,MAAM;AAAA,MACV;AAAA,IACJ,IACA,CAAC;AAAA,IACP,MAAM;AAAA,EACV,CAAC;AACL;;;AC1BO,IAAM,2CAA2C;AAGjD,IAAM,gCAAgC;AAwCtC,IAAM,mBAAmB,CAAC,SAAsC;AACnE,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAE9C,QAAM,MAAM;AAEZ,SAAO,IAAI,YAAY,KAAK,IAAI,SAAS;AAC7C;;;AC7CA,IAAM,kBAAkB,EAAE,QAAQ,UAAU,MAAM,SAAS,OAAO,MAAM;AAQxE,IAAM,4BAA4B,CAAC,WAA6B,cAAwC;AACpG,QAAM,UAAU,cAAc,UAAU,cAAc;AAEtD,SAAO,aAAa,iCAAiC,UAAU,QAAQ;AAC3E;AAOA,IAAM,2BAA2B,CAAC,cAC9B,KAAK,IAAI,KAAK,MAAO,YAAY,gCAAiC,GAAG,GAAG,GAAG;AAExE,IAAM,+BAA+B,CAAC,UAA4D;AACrG,QAAM,EAAE,SAAS,UAAU,aAAa,IAAI,gBAAgB,WAAW,UAAU,eAAe,SAAS,IAAI;AAC7G,QAAM,YAAY,0BAA0B,gBAAgB,SAAS;AAErE,QAAM,eAAe,gBAAgB,MAAM;AAAA,IACvC,SAAS,sBAAsB,WAAW,EAAE;AAAA,IAC5C;AAAA,IACA,WAAW;AAAA,IACX,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,OAAO,yBAAyB,SAAS;AAAA,EAC7C,CAAC;AAED,MAAI,CAAC,YAAa,QAAO;AAEzB,QAAM,cAAc,eAAe,MAAM;AAAA,IACrC,SAAS;AAAA,MACL,IAAI;AAAA,QACA,OAAO,EAAE,cAAc,OAAO;AAAA,QAC9B,SAAS;AAAA,UACL,6BAA6B;AAAA,YACzB,OAAO;AAAA,YACP,UAAU,YAAY;AAAA,YACtB,MAAM;AAAA,YACN,WAAW,gBAAgB,gBAAgB,aAAa,IAAI;AAAA,UAChE,CAAC;AAAA,QACL;AAAA,QACA,MAAM;AAAA,MACV;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,EACjB,CAAC;AAED,SAAO,iBAAiB,MAAM;AAAA,IAC1B,WAAW,EAAE,YAAY,UAAU,UAAU,SAAS;AAAA,IACtD,WAAW,cAAc,UAAU,cAAc,UAAU,YAAY;AAAA,IACvE,UACI,cAAc,UAAU,cAAc,QAAQ,CAAC,cAAc,WAAW,IAAI,CAAC,aAAa,YAAY;AAAA,IAC1G,aAAa;AAAA,IACb,SAAS;AAAA,EACb,CAAC;AACL;;;ACtEO,IAAM,8BAA8B,CAAC,aAAqD;AAC7F,QAAM,cAAc,UAAU;AAC9B,QAAM,aAAa,UAAU;AAC7B,QAAM,QAAQ,UAAU;AAExB,SAAO,eAAe,MAAM;AAAA,IACxB,OAAO,EAAE,cAAc,QAAQ;AAAA,IAC/B,SAAS;AAAA,MACL,aACM,6BAA6B;AAAA,QACzB,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC;AAAA,QACxB,MAAM;AAAA,QACN,WAAW;AAAA,MACf,CAAC,IACD;AAAA,MACN,QACM,6BAA6B;AAAA,QACzB,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC;AAAA,QACxB,MAAM;AAAA,QACN,WAAW;AAAA,MACf,CAAC,IACD;AAAA,MACN,cACM,6BAA6B;AAAA,QACzB,OAAO;AAAA,QACP,UAAU;AAAA,QACV,MAAM;AAAA,QACN,WAAW;AAAA,MACf,CAAC,IACD;AAAA,IACV,EAAE,OAAO,CAAC,MAAkC,MAAM,IAAI;AAAA,IACtD,MAAM;AAAA,EACV,CAAC;AACL;;;ACzCA,SAAS,KAAAE,WAAS;AAMlB,IAAM,aAAaC,IACd,OAAO;AAAA,EACJ,MAAMA,IAAE,QAAQ,EAAE,SAAS;AAAA,EAC3B,MAAMA,IAAE,KAAK,CAAC,QAAQ,cAAc,UAAU,CAAC,EAAE,SAAS;AAAA,EAC1D,MAAMA,IAAE,OAAO;AAAA,EACf,OAAOA,IAAE,OAAO;AAAA,EAChB,OAAOA,IAAE,OAAO;AACpB,CAAC,EACA,QAAQ,YAAY,WAAW,iBAAiB,EAAE,CAAC,CAAC;AAUlD,IAAM,cAAcA,IACtB,OAAO;AAAA,EACJ,mBAAmBA,IAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC3C,cAAcA,IAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EACtC,cAAcA,IAAE,QAAQ,EAAE,QAAQ,IAAI;AAC1C,CAAC,EACA,QAAQ,EAAE,mBAAmB,MAAM,cAAc,MAAM,cAAc,KAAK,CAAC;AAIzE,IAAM,iBAAiB,iBAAiB,OAAO;AAAA,EAClD,YAAYA,IAAE,KAAK,WAAW,EAAE,QAAQ,WAAW,iBAAiB;AAAA,EACpE,aAAaA,IAAE,QAAQ,EAAE,QAAQ,KAAK;AAAA,EACtC,SAASA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAAA,EAC3C,YAAY,WAAW,SAAS;AAAA,EAChC,UAAU;AAAA,EACV,MAAMA,IAAE,KAAK,WAAW,EAAE,QAAQ,WAAW,0BAA0B;AAAA,EACvE,SAASA,IAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC;AAAA,EAC/B,UAAUA,IAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,IAAI;AAChD,CAAC;;;AClCD,IAAM,0BAA0B;AAAA,EAC5B,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,aAAa;AACjB;AAEA,IAAM,UAAU,CAAC,aACb,CAAC,CAAC,YAAY,CAAC,EAAE,SAAS,eAAe,SAAS,cAAc,SAAS;AAGtE,IAAM,0BAA0B,CAAC,EAAE,IAAI,SAAS,MAAsC;AACzF,QAAM,cAAc,SAAS,eAAe,CAAC;AAE7C,SAAO,eAAe,MAAM;AAAA,IACxB,WAAW,EAAE,YAAY,UAAU,UAAU,MAAM;AAAA,IACnD,WAAW;AAAA,IACX,YAAY,wBAAwB,SAAS,YAAY,UAAU;AAAA,IACnE,aAAa,SAAS;AAAA,IACtB,UAAU;AAAA,MACN,QAAQ,SAAS,QAAQ,IACnB;AAAA,QACI,SAAS,EAAE,IAAI,4BAA4B,SAAS,QAAQ,EAAE;AAAA,QAC9D,aAAa;AAAA,MACjB,IACA;AAAA,MACN,YAAY,SAAS,IACf;AAAA;AAAA,QAEI,WAAW,EAAE,YAAY,UAAU,UAAU,SAAS;AAAA;AAAA;AAAA,QAGtD,WAAW,SAAS,gBAAgB,QAAQ,SAAS;AAAA,QACrD,UAAU,YAAY,IAAI,4BAA4B;AAAA,QACtD,aAAa;AAAA,QACb,SAAS,SAAS,gBAAgB;AAAA,MACtC,IACA;AAAA,IACV,EAAE,OAAO,CAAC,YAAoD,YAAY,IAAI;AAAA,IAC9E,aAAa;AAAA,IACb,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACd,CAAC;AACL;;;ACpDA,IAAMC,sBAAqB;AAE3B,IAAMC,iBAAgB,CAAC,UAAqD;AACxE,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AAExD,QAAM,QAAQ,OAAO,eAAe,KAAK;AAEzC,SAAO,UAAU,OAAO,aAAa,UAAU;AACnD;AAEA,IAAM,qBAAqB,CAAC,UAA4C;AACpE,QAAM,OAAO,OAAO,KAAK,KAAK;AAE9B,MAAI,KAAK,WAAW,EAAG,QAAO;AAE9B,MAAI,CAAC,KAAK,MAAM,CAAC,QAAQD,oBAAmB,KAAK,GAAG,KAAK,OAAO,cAAc,OAAO,GAAG,CAAC,CAAC,EAAG,QAAO;AAIpG,QAAM,SAAS,KAAK,IAAI,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAEpD,SAAO,OAAO,MAAM,CAAC,GAAG,MAAM,MAAM,CAAC;AACzC;AAEA,IAAM,uBAAuB,CAAC,UAC1B,OAAO,QAAQ,KAAK,EACf,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,OAAO,CAAC,CAAC,EACxC,IAAI,CAAC,CAAC,EAAE,KAAK,MAAM,KAAK;AAO1B,IAAM,wBAAwB,CAAC,UAA4B;AAC9D,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,qBAAqB;AAEhE,MAAIC,eAAc,KAAK,GAAG;AACtB,QAAI,mBAAmB,KAAK,EAAG,QAAO,qBAAqB,KAAK,EAAE,IAAI,qBAAqB;AAE3F,UAAM,MAA+B,CAAC;AAEtC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,EAAG,KAAI,GAAG,IAAI,sBAAsB,KAAK;AAExF,WAAO;AAAA,EACX;AAEA,SAAO;AACX;;;AChDA,IAAMC,iBAAgB,CAAC,UAAqD;AACxE,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AAExD,QAAM,QAAQ,OAAO,eAAe,KAAK;AAEzC,SAAO,UAAU,OAAO,aAAa,UAAU;AACnD;AAEA,IAAM,YAAY,CAAC,QACf,IAAI,QAAQ,gBAAgB,CAAC,GAAG,SAA8B,OAAO,KAAK,YAAY,IAAI,EAAG;AAqB1F,IAAM,gBAAgB,CAAI,UAA+B;AAC5D,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC;AAExE,MAAIA,eAAc,KAAK,GAAG;AACtB,UAAM,MAA+B,CAAC;AAEtC,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC9C,UAAI,UAAU,GAAG,CAAC,IAAI,cAAc,KAAK;AAAA,IAC7C;AAEA,WAAO;AAAA,EACX;AAEA,SAAO;AACX;;;ACzCO,IAAM,4BAA4B,CACrC,UACc;AACd,MAAI,CAAC,SAAU,MAAM,UAAU,UAAa,MAAM,aAAa,OAAY,QAAO;AAElF,SAAO;AAAA,IACH,OAAO;AAAA,MACH,OAAO,MAAM,SAAS;AAAA,MACtB,UAAU,MAAM,YAAY;AAAA,IAChC;AAAA,IACA,MAAM;AAAA,EACV;AACJ;;;ACbO,IAAM,WAAW,CAAC,OAAqB,SAAuB;AACjE,WAAS,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS;AACpD,QAAI,MAAM,KAAK,EAAE,QAAQ,MAAM;AAC3B,YAAM,SAAS;AACf;AAAA,IACJ;AAAA,EACJ;AACJ;;;ACTO,IAAM,SAAS;AAOf,IAAM,aAAa,oBAAI,IAAI;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACJ,CAAC;;;AC7BM,IAAM,gBAAgB,CAAC,YAA2C,gBAAgB,MAAM,EAAE,QAAQ,CAAC;;;ACCnG,IAAM,iBAAiB,CAAC,UAAuB;AAClD,QAAM,WAAW,KAAK,cAAc,MAAM,WAAW,CAAC;AACtD,QAAM,cAAc,CAAC;AACzB;;;ACJO,IAAM,aAAa,CAAC,QAAsB,CAAC,MAAe,MAAM,KAAK,CAAC,EAAE,KAAK,MAAM,IAAI;;;ACCvF,IAAM,UAAU,CAAC,SAA4B,iBAChD,eAAe,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,QAAQ,CAAC;;;ACJ7D,IAAMC,uBAAsB;AAU5B,IAAM,oBAAoB,oBAAI,IAAI,CAAC,SAAS,UAAU,WAAW,MAAM,CAAC;AAajE,IAAM,cAAc,CAAC,SAA0B;AAClD,MAAI,CAAC,KAAM,QAAO;AAElB,MAAI,SAAS,IAAK,QAAO;AAEzB,MAAIA,qBAAoB,KAAK,IAAI,EAAG,QAAO;AAE3C,MAAI;AACA,UAAM,MAAM,IAAI,IAAI,IAAI;AAExB,WAAO,kBAAkB,IAAI,IAAI,QAAQ;AAAA,EAC7C,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;;;AC7BA,IAAM,iBAAiB;AACvB,IAAM,cAAc;AAWpB,IAAM,gBAAgB,CAAC,KAAa,WAA2B;AAC3D,MAAI,WAAW,SAAU,QAAO;AAEhC,QAAM,gBAAgB,OAAO,IAAI,MAAM,KAAK,EAAE,OAAO,OAAO;AAE5D,MAAI,aAAa,WAAW,EAAG,QAAO;AAEtC,QAAM,SAAS,IAAI,IAAI,aAAa,OAAO,CAAC,UAAU,MAAM,YAAY,MAAM,QAAQ,CAAC;AAEvF,SAAO,IAAI,UAAU;AACrB,SAAO,IAAI,YAAY;AAEvB,SAAO,MAAM,KAAK,MAAM,EAAE,KAAK,GAAG;AACtC;AAEO,IAAM,gBAAgB,CAAC,QAAgC,CAAC,MAAmB;AAC9E,QAAM,EAAE,KAAK,IAAI;AAEjB,MAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAG,QAAO;AAIxC,QAAM,SAAS,MAAM,UAAU;AAE/B,SAAO;AAAA,IACH,OAAO;AAAA,MACH,OAAO;AAAA,MACP;AAAA,MACA,KAAK,cAAc,MAAM,KAAK,MAAM;AAAA,MACpC;AAAA,IACJ;AAAA,IACA,MAAM;AAAA,EACV;AACJ;;;ACrDA,IAAM,iBAAyC;AAAA,EAC3C,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AACX;AAEO,IAAM,iBAAiB,CAAC,QAAgB,OAC3C,MAAM,QAAQ,uCAAuC,CAAC,OAAO,SAAiB;AAC1E,MAAI,KAAK,CAAC,MAAM,IAAK,QAAO,eAAe,KAAK,YAAY,CAAC,KAAK;AAElE,QAAM,QAAQ,OAAO,KAAK,IAAI;AAC9B,QAAM,KAAK,SAAS,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,QAAQ,KAAK,EAAE;AAE9D,SAAO,OAAO,UAAU,EAAE,KAAK,MAAM,KAAK,MAAM,UAAW,OAAO,cAAc,EAAE,IAAI;AAC1F,CAAC;;;ACzBL,IAAM,YAAY;AAEX,IAAM,eAAe,CAAC,eAA+C;AACxE,QAAM,SAAiC,CAAC;AACxC,MAAI;AAEJ,YAAU,YAAY;AAEtB,UAAQ,QAAQ,UAAU,KAAK,UAAU,OAAO,MAAM;AAClD,WAAO,MAAM,CAAC,EAAE,YAAY,CAAC,IAAI,eAAe,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE;AAAA,EAC1F;AAEA,SAAO;AACX;;;ACVA,IAAM,mBAAiE;AAAA,EACnE,GAAG;AAAA,EACH,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,GAAG;AAAA,EACH,GAAG;AAAA,EACH,QAAQ;AAAA,EACR,QAAQ;AACZ;AAEA,IAAM,oBAAkD;AAAA,EACpD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACR;AAEA,IAAM,gBAAgB,CAAC,SAAS,UAAU,YAAY,UAAU,UAAU,SAAS,UAAU;AAE7F,IAAM,cAAc,CAAC,MAAc,UAA0B;AACzD,MAAI,iBAAiB,IAAI,EAAG,QAAO,CAAC,EAAE,MAAM,iBAAiB,IAAI,EAAE,CAAC;AAEpE,MAAI,kBAAkB,IAAI,GAAG;AACzB,WAAO,CAAC,EAAE,MAAM,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,QAAQ,UAAU,kBAAkB,IAAI,EAAE,GAAG,MAAM,YAAY,CAAC;AAAA,EAChH;AAEA,MAAI,SAAS,KAAK;AACd,UAAM,OAAO,cAAc,aAAa,KAAK,CAAC;AAE9C,WAAO,OAAO,CAAC,IAAI,IAAI,CAAC;AAAA,EAC5B;AAEA,SAAO,CAAC;AACZ;AAEO,IAAM,UAAU,CAAC,OAAqB,MAAc,UAAwB;AAC/E,QAAM,KAAK;AAAA,IACP,OAAO,YAAY,MAAM,KAAK;AAAA,IAC9B,MAAM,cAAc,SAAS,IAAI;AAAA,IACjC,KAAK;AAAA,EACT,CAAC;AACL;;;ACzCO,IAAM,WAAW,CAAC,OAAc,YAA0B;AAC7D,MAAI,CAAC,WAAW,WAAW,MAAM,KAAK,EAAG;AAEzC,iBAAe,OAAO,EACjB,MAAM,IAAI,EACV,QAAQ,CAAC,SAAS,UAAU;AACzB,QAAI,QAAQ,EAAG,gBAAe,KAAK;AAEnC,QAAI,CAAC,QAAS;AAEd,UAAM,QAAgB,MAAM,MAAM,QAAQ,CAAC,UAAU,MAAM,KAAK;AAEhE,QAAI,MAAM,wBAAwB,CAAC,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,WAAW,GAAG;AAChF,YAAM,KAAK,MAAM,oBAAoB;AAAA,IACzC;AAEA,UAAM,YAAY,KAAK,WAAW,MAAM,MAAM,SAAS,IAAI,EAAE,OAAO,MAAM,QAAQ,IAAI,EAAE,MAAM,QAAQ,CAAC,CAAC;AAAA,EAC5G,CAAC;AACT;;;ACzBA,IAAMC,mBAAkB;AAEjB,IAAM,oBAAoB,CAAC,OAAe,OAAe,KAAK,QAAQA,kBAAiB,EAAE;;;ACiBhG,IAAM,sBAAsB,CAAC,UAAuB;AAChD,MAAI,MAAM,YAAY,SAAS,EAAG,gBAAe,KAAK;AAC1D;AAEO,IAAM,eAAe,CAAC,MAAc,UAA+B,CAAC,MAAsB;AAC7F,QAAM,QAAe;AAAA,IACjB,aAAa,CAAC;AAAA,IACd,sBAAsB,0BAA0B,QAAQ,gBAAgB;AAAA,IACxE,WAAW,CAAC;AAAA,IACZ,YAAY,CAAC;AAAA,IACb,OAAO,CAAC;AAAA,EACZ;AACA,QAAM,eAAe,QAAQ,gBAAgB;AAE7C,MAAI,OAAO,SAAS,YAAY,CAAC,KAAM,QAAO,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,YAAY;AAEvF,QAAM,sBAAsB,kBAAkB,IAAI;AAClD,MAAI,YAAY;AAChB,MAAI;AAEJ,SAAO,YAAY;AAEnB,UAAQ,QAAQ,OAAO,KAAK,mBAAmB,OAAO,MAAM;AACxD,UAAM,CAAC,MAAM,OAAO,SAAS,OAAO,SAAS,IAAI;AAEjD,QAAI,MAAM,QAAQ,UAAW,UAAS,OAAO,oBAAoB,MAAM,WAAW,MAAM,KAAK,CAAC;AAE9F,gBAAY,MAAM,QAAQ,KAAK;AAE/B,UAAM,OAAO,QAAQ,YAAY;AAEjC,QAAI,OAAO;AACP,eAAS,MAAM,OAAO,IAAI;AAE1B,UAAI,SAAS,QAAQ,SAAS,KAAM,OAAM,UAAU,IAAI;AAExD,UAAI,WAAW,IAAI,IAAI,KAAK,CAAC,WAAW,MAAM,KAAK,EAAG,qBAAoB,KAAK;AAAA,IACnF,WAAW,SAAS,MAAM;AACtB,UAAI,CAAC,WAAW,MAAM,KAAK,EAAG,gBAAe,KAAK;AAAA,IACtD,WAAW,SAAS,MAAM;AACtB,UAAI,CAAC,WAAW,MAAM,KAAK,GAAG;AAC1B,4BAAoB,KAAK;AACzB,iBAAS,OAAO,oBAAK;AACrB,uBAAe,KAAK;AAAA,MACxB;AAAA,IACJ,WAAW,CAAC,WAAW;AACnB,UAAI,WAAW,IAAI,IAAI,KAAK,CAAC,WAAW,MAAM,KAAK,EAAG,qBAAoB,KAAK;AAE/E,UAAI,SAAS,QAAQ,SAAS,KAAM,OAAM,UAAU,KAAK,EAAE,SAAS,GAAG,SAAS,SAAS,KAAK,CAAC;AAE/F,cAAQ,MAAM,OAAO,MAAM,KAAK;AAEhC,UAAI,SAAS,QAAQ,MAAM,UAAU,SAAS,GAAG;AAC7C,cAAM,MAAM,MAAM,UAAU,MAAM,UAAU,SAAS,CAAC;AAEtD,YAAI,IAAI,QAAS,KAAI,WAAW;AAEhC,iBAAS,OAAO,IAAI,UAAU,GAAG,IAAI,OAAO,OAAO,SAAI;AAAA,MAC3D;AAAA,IACJ;AAAA,EACJ;AAEA,MAAI,YAAY,oBAAoB,OAAQ,UAAS,OAAO,oBAAoB,MAAM,SAAS,CAAC;AAEhG,sBAAoB,KAAK;AAEzB,MAAI,MAAM,WAAW,WAAW,EAAG,gBAAe,KAAK;AAEvD,SAAO,QAAQ,MAAM,YAAY,YAAY;AACjD;;;AC9EO,IAAM,mBAAmB,CAAC,UAA4B;AACzD,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAEhD,SAAQ,MAAgC,YAAY;AACxD;;;ACHO,IAAM,gBAAgB;AAAA,EACzB,oBAAoB;AAAA,IAChB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACR;AAAA,EACA,yBAAyB;AAAA,IACrB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACR;AAAA,EACA,gCAAgC;AAAA,IAC5B,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACR;AAAA,EACA,kCAAkC;AAAA,IAC9B,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACR;AACJ;;;ACrHA,IAAM,eAAe;AAAA,EACjB,oBAAoB;AAAA,EACpB,yBAAyB;AAAA,EACzB,gCAAgC;AAAA,EAChC,kCAAkC;AACtC;AASA,IAAM,eAAe,CAAC,SAAS,WAAW,WAAW;AAE9C,IAAM,4BAA4B,CAAC,EAAE,IAAI,SAAS,MAAoD;AACzG,QAAM,EAAE,sBAAsB,6BAA6B,SAAS,IAAI;AACxE,QAAM,OAAO,SAAS,QAAQ;AAC9B,QAAM,cAAc,aAAa,SAAS,IAAqC,IAAI,OAAO;AAE1F,QAAM,gBAAiB,OAAO,KAAK,aAAa,EAAqC,IAAI,CAAC,gBAAgB;AAKtG,UAAM,WAAW,sBAAsB,WAAW,aAAa,WAAW,CAAC,GAAG,KAAK;AAEnF,WAAO;AAAA,MACH;AAAA,MACA,SAAS,WAAW,EAAE,GAAG,cAAc,WAAW,GAAG,IAAI,SAAS,IAAI,cAAc,WAAW;AAAA,MAC/F,aAAa;AAAA,IACjB;AAAA,EACJ,CAAC;AAED,SAAO,eAAe,MAAM;AAAA,IACxB,aAAa,SAAS;AAAA,IACtB,UAAU;AAAA,MACN;AAAA,QACI,UAAU,8BACJ;AAAA,UACI;AAAA,YACI,QAAQ;AAAA,YACR;AAAA,YACA,kBAAkB,sBAAsB,oBAAoB;AAAA,YAC5D,UAAU;AAAA,YACV,aAAa;AAAA,UACjB;AAAA,QACJ,IACA,CAAC;AAAA,QACP,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,IACb,UAAU;AAAA,MACN,mBAAmB,UAAU,qBAAqB;AAAA,MAClD,cAAc,UAAU,gBAAgB;AAAA,MACxC,cAAc,UAAU,gBAAgB;AAAA,IAC5C;AAAA,IACA,MAAM,WAAW;AAAA,IACjB,SAAS;AAAA,IACT,UAAU;AAAA,EACd,CAAC;AACL;;;ACxDO,IAAM,qBAAqB,CAAC,SAA4C;AAC3E,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAE9C,QAAM,MAAM;AAEZ,SAAO,IAAI,YAAY,KAAK,IAAI,SAAS,WAAW;AACxD;;;ACpBA,IAAM,uBAAuB,CAAC,aAAa,YAAY,OAAO;AAE9D,IAAM,iBAAiB,CAAC,YAA4B,QAAQ,QAAQ,uBAAuB,MAAM;AAc1F,IAAM,kBAAkB,CAAC,MAAc,cAAiC,yBAAiC;AAC5G,MAAI,OAAO,SAAS,SAAU,QAAO;AAErC,SAAO,YAAY,OAAO,CAAC,KAAK,UAAU;AACtC,UAAM,UAAU,IAAI,OAAO,eAAe,eAAe,KAAK,CAAC,gBAAgB,IAAI;AAEnF,WAAO,IAAI,QAAQ,SAAS,KAAK,KAAK,IAAI;AAAA,EAC9C,GAAG,IAAI;AACX;;;ACrBA,IAAMC,eAAc;AAEpB,IAAM,eAAe,CAAC,SAA0BA,aAAY,KAAK,IAAI;AAErE,IAAM,WAAW,CAAC,MAA6C,MAAM,QAAQ,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AAEtH,IAAM,qBAAqB,CAAC,UAA4B;AACpD,MAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,QAAM,YAAY,gBAAgB,KAAK;AAEvC,SAAO,aAAa,SAAS,IAAI,aAAa,SAAS,IAAI;AAC/D;AAYO,IAAM,uBAAuB,CAAC,SAA2B;AAC5D,MAAI,MAAM,QAAQ,IAAI,EAAG,QAAO,KAAK,IAAI,oBAAoB;AAE7D,MAAI,CAAC,SAAS,IAAI,EAAG,QAAO;AAE5B,MAAI,KAAK,gBAAgB,UAAU,SAAS,KAAK,OAAO,GAAG;AACvD,UAAM,cAAuC,CAAC;AAE9C,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,OAAO,GAAG;AACtD,kBAAY,IAAI,IAAI,mBAAmB,KAAK;AAAA,IAChD;AAEA,WAAO,EAAE,GAAG,MAAM,SAAS,YAAY;AAAA,EAC3C;AAEA,MAAI,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,WAAO,EAAE,GAAG,MAAM,UAAU,KAAK,SAAS,IAAI,oBAAoB,EAAE;AAAA,EACxE;AAEA,SAAO;AACX;;;ACvCO,IAAM,6BAA6B;AA4HnC,IAAM,YAAY,CAAC,SAA2C;AACjE,MAAI,CAAC,QAAQ,OAAO,SAAS,SAAU,QAAO;AAE9C,SAAQ,KAAiC,SAAS;AACtD;;;ACjIO,IAAM,eAAe;AAAA,EACxB,WAAW;AAAA,IACP,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACR;AAAA,EACA,aAAa;AAAA,IACT,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACR;AAAA,EACA,oBAAoB;AAAA,IAChB,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACR;AAAA,EACA,cAAc;AAAA,IACV,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACR;AAAA,EACA,SAAS;AAAA,IACL,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACR;AAAA,EACA,MAAM;AAAA,IACF,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EACR;AACJ;;;AC3KA,IAAM,mBAAmB,EAAE,QAAQ,UAAU,OAAO,SAAS,QAAQ,OAAO;AAQ5E,IAAM,mBAAmB,CAAC,UAAkC,aAAiC;AACzF,QAAM,UAAU,UAAU,KAAK;AAE/B,SAAO,UAAU,EAAE,GAAG,UAAU,IAAI,QAAQ,IAAI;AACpD;AAMA,IAAM,kBAAkB,CAAC,OAAe,OAAgC,QAAQ,WAAW;AACvF,QAAM,QAAmC;AAAA,IACrC,EAAE,OAAO,EAAE,OAAO,UAAU,OAAO,YAAY,OAAO,GAAG,MAAM,YAAY;AAAA,EAC/E;AAEA,MAAI,OAAO,iBAAiB,OAAQ,OAAM,KAAK,EAAE,MAAM,OAAO,CAAC;AAE/D,MAAI,OAAO,iBAAiB,SAAU,OAAM,KAAK,EAAE,MAAM,SAAS,CAAC;AAEnE,SAAO,EAAE,SAAS,CAAC,EAAE,SAAS,CAAC,EAAE,OAAO,MAAM,OAAO,MAAM,OAAO,CAAC,GAAG,MAAM,YAAY,CAAC,GAAG,MAAM,MAAM;AAC5G;AAQA,IAAM,oBAAoB,CAAC,aAA8B;AACrD,QAAM,UAAqC,CAAC,EAAE,MAAM,oBAAoB,MAAM,OAAO,CAAC;AAEtF,MAAI,SAAS,UAAU,qBAAqB,OAAO;AAC/C,YAAQ;AAAA,MACJ,EAAE,MAAM,KAAK,MAAM,OAAO;AAAA,MAC1B;AAAA,QACI,OAAO,CAAC,EAAE,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,OAAO,UAAU,GAAG,MAAM,YAAY,CAAC;AAAA,QAC9E,MAAM;AAAA,QACN,MAAM;AAAA,MACV;AAAA,IACJ;AAAA,EACJ;AAEA,SAAO,EAAE,SAAS,CAAC,EAAE,SAAS,MAAM,YAAY,CAAC,GAAG,MAAM,MAAM;AACpE;AAGA,IAAM,eAAe,CAAC,aAAyD;AAC3E,MAAI,CAAC,SAAS,gBAAgB,CAAC,OAAO,OAAO,SAAS,YAAY,EAAE,KAAK,OAAO,EAAG,QAAO,CAAC;AAE3F,QAAM,UAAU,SAAS,iBAAiB;AAE1C,SAAO;AAAA,IACH;AAAA,MACI,GAAI,SAAS,SAAS,EAAE,OAAO,QAAQ,MAAM;AAAA,MAC7C,aAAa;AAAA,MACb,GAAI,SAAS,QAAQ,EAAE,MAAM,QAAQ,KAAK;AAAA,IAC9C;AAAA,EACJ;AACJ;AAGA,IAAM,aAAa,CAAC,cAAwD;AAAA,EACxE,GAAI,SAAS,iBAAiB,OAAO,YAAY;AAAA,IAC7C,WAAW,SAAS,gBAAgB,MAAM;AAAA,EAC9C;AAAA,EACA,aAAa;AAAA,EACb,QAAQ,SAAS,QAAQ,WAAW,YAAY,qBAAqB;AAAA,EACrE,OAAO;AACX;AAGA,IAAM,aAAa,CAAC,cAAwD;AAAA,EACxE,SAAS,EAAE,IAAI,gBAAgB,oBAAoB,SAAS,iBAAiB,OAAO,EAAE;AAAA,EACtF,aAAa;AACjB;AAGA,IAAM,aAAa,CAAC,cAAwD;AAAA,EACxE,SAAS,EAAE,IAAI,kBAAkB,QAAQ,EAAE;AAAA,EAC3C,aAAa;AACjB;AAGA,IAAM,oBAAoB,CAAC,aAAyD;AAChF,QAAM,OAAO,SAAS,gBAAgB;AAEtC,MAAI,CAAC,QAAQ,SAAS,OAAQ,QAAO,CAAC;AAEtC,SAAO;AAAA,IACH;AAAA,MACI,SAAS,EAAE,IAAI,gBAAgB,oBAAoB,SAAS,iBAAiB,OAAO,EAAE;AAAA,MACtF,aAAa;AAAA,IACjB;AAAA,EACJ;AACJ;AAGA,IAAM,mBAAmB,CAAC,aAAyD;AAC/E,QAAM,OAAO,SAAS,gBAAgB;AAEtC,MAAI,CAAC,QAAQ,SAAS,OAAQ,QAAO,CAAC;AAEtC,SAAO,CAAC,EAAE,SAAS,EAAE,IAAI,gBAAgB,0BAA0B,MAAS,EAAE,GAAG,aAAa,OAAO,CAAC;AAC1G;AAGA,IAAM,gBAAgB,CAAC,aAAyD;AAC5E,MAAI,SAAS,gBAAgB,uBAAuB,QAAS,QAAO,CAAC;AAErE,QAAM,WAAW,SAAS,aAAa;AAEvC,SAAO;AAAA,IACH;AAAA,MACI,wBAAwB,CAAC,CAAC,SAAS,gBAAgB;AAAA,MACnD,GAAI,YAAY,EAAE,UAAU,iBAAiB,QAAQ,EAAE;AAAA,MACvD,aAAa;AAAA,IACjB;AAAA,EACJ;AACJ;AAGA,IAAM,sBAA2D;AAAA,EAC7D,wBAAwB;AAAA,EACxB,mBAAmB;AACvB;AAGA,IAAM,sBAAsB,CAAC,aAA6D;AACtF,QAAM,KAAK;AAAA,IACP,GAAI,SAAS,YAAY,EAAE,KAAK,SAAS,SAAS;AAAA,IAClD,GAAI,SAAS,YAAY,EAAE,KAAK,SAAS,SAAS;AAAA,IAClD,GAAI,SAAS,iBAAiB,EAAE,KAAK,SAAS,cAAc;AAAA,EAChE;AAEA,SAAO,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC;AACjE;AAGA,IAAM,gBAAgB,CAAC,aAAyD;AAC5E,QAAM,WAAW,SAAS;AAE1B,MAAI,CAAC,UAAU,QAAS,QAAO,CAAC;AAEhC,QAAM,YAAY,SAAS,OAAO,oBAAoB,SAAS,IAAI,IAAI;AAEvE,SAAO;AAAA,IACH;AAAA,MACI,GAAG,oBAAoB,QAAQ;AAAA,MAC/B,GAAI,aAAa,EAAE,UAAU;AAAA,MAC7B,KAAK,SAAS,YAAY;AAAA,MAC1B,KAAK,SAAS,YAAY;AAAA,MAC1B,aAAa;AAAA,IACjB;AAAA,EACJ;AACJ;AAUA,IAAM,0BAA0B,CAAC,aAAyD;AACtF,MAAI,SAAS,gBAAgB,UAAU,SAAS,gBAAgB,eAAgB,QAAO,CAAC;AAExF,QAAM,WAAW,SAAS;AAE1B,QAAM,OAAO,CAAC,aAAyC,cAAkC;AAAA,IACrF;AAAA,IACA,SAAS,iBAAiB,cAAc,WAAW,GAAG,QAAQ;AAAA,IAC9D,aAAa;AAAA,EACjB;AAEA,SAAO;AAAA,IACH;AAAA,MACI,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,UAAU;AAAA,QACN,KAAK,sBAAsB,MAAS;AAAA,QACpC,KAAK,2BAA2B,UAAU,mBAAmB;AAAA,QAC7D,KAAK,kCAAkC,UAAU,wBAAwB;AAAA,QACzE,KAAK,oCAAoC,UAAU,qBAAqB;AAAA,MAC5E;AAAA,MACA,aAAa;AAAA,IACjB;AAAA,EACJ;AACJ;AAGA,IAAMC,gBAAe,CAAC,SAAS,WAAW,WAAW;AAGrD,IAAM,iBAAiB,CAAC,aAAuD;AAC3E,QAAM,OAAO,SAAS,QAAQ;AAE9B,QAAM,OAAO,CAAC,aAAuE,cAAuB;AAAA,IACxG;AAAA,IACA,SAAS,iBAAiB,aAAa,WAAW,GAAG,QAAQ;AAAA,IAC7D,aAAa;AAAA,EACjB;AAEA,SAAO;AAAA,IACH,QAAQ;AAAA,IACR,aAAaA,cAAa,SAAS,IAAqC,IAAI,OAAO;AAAA,IACnF,UAAU;AAAA,MACN,KAAK,aAAa,SAAS,UAAU,SAAS;AAAA,MAC9C,KAAK,gBAAgB,SAAS,UAAU,YAAY;AAAA,MACpD,KAAK,eAAe,SAAS,UAAU,WAAW;AAAA,MAClD,KAAK,WAAW,SAAS,UAAU,YAAY;AAAA,IACnD;AAAA,IACA,aAAa;AAAA,EACjB;AACJ;AAGA,IAAM,aAAa,CAAC,cAAkE;AAAA,EAClF,WAAW;AAAA,EACX;AAAA,EACA,aAAa;AACjB;AAgBO,IAAM,iBAAiB,CAAC,UAA2B,eAAmD;AACzG,QAAM,QAAQ,WAAW,QAAQ;AACjC,QAAM,QAAQ,WAAW,QAAQ;AACjC,QAAM,eAAe,kBAAkB,QAAQ;AAC/C,QAAM,QAAQ,WAAW,QAAQ;AACjC,QAAM,cAAc,iBAAiB,QAAQ;AAC7C,QAAM,UAAU,aAAa,QAAQ;AACrC,QAAM,WAAW,cAAc,QAAQ;AACvC,QAAM,WAAW,cAAc,QAAQ;AACvC,QAAM,eAAe,wBAAwB,QAAQ;AACrD,QAAM,YAAY,eAAe,QAAQ;AAEzC,MAAI,CAAC,YAAY;AACb,WAAO;AAAA,MACH;AAAA,MACA;AAAA,MACA,GAAG;AAAA,MACH;AAAA,MACA,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,IACJ;AAAA,EACJ;AAEA,QAAM,OAAO,WAAW,CAAC,OAAO,GAAG,cAAc,OAAO,GAAG,aAAa,GAAG,SAAS,GAAG,QAAQ,CAAC;AAChG,QAAM,UAAU,CAAC,GAAG,cAAc,SAAS;AAC3C,QAAM,cAAc,QAAQ,WAAW,IAAI,QAAQ,CAAC,IAAI,WAAW,OAAO;AAE1E,QAAM,OAAO;AAAA,IACT,WAAW;AAAA,IACX,MAAM,EAAE,SAAS,CAAC,OAAO,QAAQ,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE;AAAA,IACzD,UAAU,CAAC,OAAO,MAAM,WAAW;AAAA,IACnC,aAAa;AAAA,EACjB;AAEA,SAAO,CAAC,MAAM,GAAG,QAAQ;AAC7B;;;ACtRA,IAAMC,2BAA0B;AAAA,EAC5B,UAAU;AAAA,EACV,gBAAgB;AAAA,EAChB,aAAa;AACjB;AASA,IAAM,qBAAqB;AAAA,EACvB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AACV;AAEA,IAAM,oBAAoB,CAAC,UAA6C,QAAQ,mBAAmB,KAAK,IAAI;AAW5G,IAAM,yBAAyB,CAAC,WAAmB,YAC/C,cAAc,SACR,EAAE,WAAW,MAAM,EAAE,SAAS,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,SAAS,CAAC,EAAE,GAAG,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,EAAE,IAC3G,EAAE,UAAU;AAEtB,IAAM,gBAAgB,CAAC,aACnB,CAAC,EAAE,UAAU,SAAS,UAAU,cAAc,UAAU;AAO5D,IAAM,kBAAgE;AAAA,EAClE,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,OAAO;AACX;AAOA,IAAM,uBAAuB,CAAC,aAAqE;AAC/F,MAAI,CAAC,UAAU,QAAQ,SAAS,SAAS,OAAQ,QAAO,CAAC;AAEzD,QAAM,iBAAiB,SAAS,iBAAiB,gBAAgB,SAAS,cAAc,IAAI;AAE5F,SAAO;AAAA,IACH;AAAA,MACI,QAAQ,SAAS,UAAU;AAAA,MAC3B,GAAI,SAAS,gBAAgB,EAAE,cAAc,SAAS,aAAa;AAAA,MACnE,GAAI,kBAAkB,EAAE,eAAe;AAAA,MACvC,GAAI,SAAS,WAAW,EAAE,SAAS,SAAS,QAAQ;AAAA,MACpD,GAAI,SAAS,YAAY,QAAQ,EAAE,UAAU,SAAS,SAAS;AAAA,MAC/D,aAAa;AAAA,MACb,MAAM,SAAS;AAAA,IACnB;AAAA,EACJ;AACJ;AAGA,IAAM,cAAc,CAAC,aACjB,UAAU,uBACJ;AAAA,EACI;AAAA,IACI,OAAO;AAAA,IACP,aAAa;AAAA,IACb,UAAU;AAAA,MACN;AAAA;AAAA;AAAA;AAAA;AAAA,QAKI,SAAS,SAAS,0BACZ,EAAE,GAAG,aAAa,oBAAoB,IAAI,SAAS,wBAAwB,IAC3E,aAAa;AAAA,QACnB,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,QACI,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,UAAU,CAAC,EAAE,aAAa,eAAe,SAAS,aAAa,MAAM,aAAa,OAAO,CAAC;AAAA,QAC1F,aAAa;AAAA,MACjB;AAAA,IACJ;AAAA,IACA,aAAa;AAAA,EACjB;AACJ,IACA,CAAC;AAgBJ,IAAM,mBAAmB,CAAC,EAAE,IAAI,MAAM,SAAS,MAA2C;AAC7F,QAAM,SAAS,SAAS,QAAQ,SAAS,SAAS,QAAQ,UAAU,SAAS,QAAQ;AACrF,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,YAAY,kBAAkB,QAAQ,KAAK;AACjD,QAAM,aAAa,uBAAuB,WAAW,OAAO;AAK5D,QAAM,iBAAiB,cAAc;AAErC,QAAM,aAAa;AAAA,IACf,GAAI,SAAS,YAAY,EAAE,gBAAgB,SAAS,SAAS;AAAA,IAC7D,GAAI,SAAS,gBAAgB,EAAE,cAAc,SAAS,aAAa;AAAA,IACnE,GAAI,SAAS,UAAU,UAAa,EAAE,OAAO,SAAS,MAAM;AAAA,IAC5D,cAAc,CAAC,CAAC,SAAS,gBAAgB;AAAA,IACzC,wBAAwB,CAAC,CAAC,SAAS,gBAAgB;AAAA,IACnD,GAAI,SAAS,eAAe,EAAE,aAAa,SAAS,YAAY;AAAA,IAChE,aAAa;AAAA,IACb,GAAI,SAAS,cAAc,EAAE,YAAY,KAAK;AAAA,EAClD;AAQA,QAAM,SAAS;AAAA,IACX,UAAU;AAAA,MACN,GAAG,eAAe,UAAU,cAAc;AAAA,MAC1C;AAAA,MACA,GAAG,qBAAqB,SAAS,QAAQ;AAAA,MACzC,GAAG,YAAY,SAAS,QAAQ;AAAA,IACpC;AAAA,IACA,aAAa;AAAA,EACjB;AAOA,QAAM,UAAU;AAAA,IACZ,qBAAqB;AAAA,IACrB,aAAa,QAAQ,WAAW,UAAW,SAAS,SAAS;AAAA,IAC7D,GAAG;AAAA,IACH,UAAU,CAAC,MAAM;AAAA,IACjB,aAAa;AAAA,EACjB;AAEA,SAAO,eAAe,MAAM;AAAA,IACxB,WAAW;AAAA,IACX,YAAYA,yBAAwB,SAAS,YAAY,UAAU;AAAA;AAAA,IAEnE,GAAI,QAAQ,EAAE,KAAK;AAAA,IACnB,aAAa,SAAS;AAAA,IACtB,UAAU;AAAA,MACN,GAAI,cAAc,SAAS,QAAQ,IAC7B,CAAC,EAAE,SAAS,EAAE,IAAI,4BAA4B,SAAS,QAAQ,EAAE,GAAG,aAAa,OAAO,CAAC,IACzF,CAAC;AAAA,MACP;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,MACN,mBAAmB,SAAS,UAAU,qBAAqB;AAAA,MAC3D,cAAc,SAAS,UAAU,gBAAgB;AAAA,MACjD,cAAc,SAAS,UAAU,gBAAgB;AAAA,IACrD;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,EACd,CAAC;AACL;;;ACnLO,IAAM,gBAAgB,CACzB,QACA,KACA,YAAyC,CAAC,UAAU,UACvC,OAAO,MAAM,UAAU,sBAAsB,cAAc,GAAG,CAAC,CAAC,CAAC;;;ACrBlF,IAAM,aAAa,CAAC,SAChB,QAAQ,OAAO,SAAS,YAAY,UAAU,OAAQ,KAA2B,OAAO;AAE5F,IAAM,gBAAgB,CAAC,MACnB,KAAK,QAAS,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC,KAAK,OAAO,KAAK,CAAW,EAAE,WAAW;AAGpG,IAAM,uBAAuB,CAAC,SAA2B;AACrD,MAAI,QAAQ,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,EAAG,QAAO;AAE5E,SAAO,cAAe,KAA4B,IAAI;AAC1D;AAMO,IAAM,kBAAkB,OAAO,OAAwB,QAA4C;AACtG,MAAI;AAEJ,MAAI;AACA,eAAW,MAAM,IAAI,cAAc,uBAAuB,EAAE,MAAM,MAAM,KAAK,GAAG,EAAE,MAAM,IAAI,KAAK,CAAC;AAAA,EACtG,SAAS,KAAK;AAEV,QAAI,eAAe,kBAAkB,IAAI,WAAW,OAAO,IAAI,WAAW,MAAM;AAC5E,YAAM,IAAI,cAAc,0BAA0B,MAAM,IAAI,EAAE;AAAA,IAClE;AAEA,UAAM;AAAA,EACV;AAEA,QAAM,OAAO,WAAW,QAAQ;AAEhC,MAAI,qBAAqB,IAAI,EAAG,OAAM,IAAI,cAAc,0BAA0B,MAAM,IAAI,EAAE;AAE9F,SAAO,cAAc,YAAY,IAAI;AACzC;;;ACsaO,SAAS,UAAU,KAAsC;AAC5D,QAAM,aAAuB,CAAC;AAE9B,QAAM,MAAM,CAAC,KAAa,UAAe;AACrC,YAAQ,OAAO,UAAU,aAAa,MAAM,IAAI;AAChD,YAAQ,UAAU,OAAO,KAAK,UAAU,SAAY,KAAK;AACzD,eAAW,WAAW,MAAM,IAAI,mBAAmB,GAAG,IAAI,MAAM,mBAAmB,KAAK;AAAA,EAC5F;AAEA,QAAM,kBAAkB,CAAC,QAAgBC,SAAa;AAClD,QAAI,GAAG,KAAK;AAEZ,QAAI,QAAQ;AACR,UAAI,MAAM,QAAQA,IAAG,GAAG;AACpB,aAAK,IAAI,GAAG,MAAMA,KAAI,QAAQ,IAAI,KAAK,KAAK;AACxC,0BAAgB,SAAS,OAAO,OAAOA,KAAI,CAAC,MAAM,YAAYA,KAAI,CAAC,IAAI,IAAI,MAAM,KAAKA,KAAI,CAAC,CAAC;AAAA,QAChG;AAAA,MACJ,WAAW,OAAO,UAAU,SAAS,KAAKA,IAAG,MAAM,mBAAmB;AAClE,aAAK,OAAOA,MAAK;AACb,0BAAgB,SAAS,MAAM,MAAM,KAAKA,KAAI,GAAG,CAAC;AAAA,QACtD;AAAA,MACJ,OAAO;AACH,YAAI,QAAQA,IAAG;AAAA,MACnB;AAAA,IACJ,WAAW,MAAM,QAAQA,IAAG,GAAG;AAC3B,WAAK,IAAI,GAAG,MAAMA,KAAI,QAAQ,IAAI,KAAK,KAAK;AACxC,YAAIA,KAAI,CAAC,EAAE,MAAMA,KAAI,CAAC,EAAE,KAAK;AAAA,MACjC;AAAA,IACJ,OAAO;AACH,WAAK,OAAOA,MAAK;AACb,wBAAgB,KAAKA,KAAI,GAAG,CAAC;AAAA,MACjC;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AAEA,SAAO,gBAAgB,IAAI,GAAG,EAAE,KAAK,GAAG;AAC5C;;;ACreA,IAAM,mBAAmB,CAAC,QAA2C,CAAC,MAClE,mBAAmB,KAAK,UAAU,OAAO,YAAY,MAAM,IAAI,CAAC,EAAE,KAAK,MAAM,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;AAOrG,IAAM,oBAAoB,CAAC,OAAwB,QAAyC;AAC/F,QAAM,EAAE,MAAM,YAAY,cAAc,OAAO,aAAa,MAAM,UAAU,IAAI;AAEhF,QAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,EAAE,WAAW,YAAY,UAAU,gBAAgB,UAAU,OAAO;AAAA,IAC9F,YAAY;AAAA,IACZ,YAAY,iBAAiB,UAAU;AAAA,IACvC;AAAA,IACA,GAAI,kBAAkB,EAAE,iBAAiB,eAAe;AAAA,IACxD,YAAY;AAAA,EAChB,EAAE;AAEF,QAAM,YAAY,KAAK,MAAM,OAAO,CAAC,OAAO,EAAE,SAAS,MAAM,QAAQ,UAAU,CAAC;AAEhF,QAAM,WAAW,KAAK,YAAY,KAAK,iBAAiB;AAExD,SAAO;AAAA,IACH,MAAM;AAAA,MACF,YAAY,iBAAiB,KAAK,UAAU;AAAA;AAAA,MAE5C,GAAI,KAAK,eAAe,UAAU,EAAE,gBAAgB,KAAK,cAAc,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE;AAAA,MACjG,YAAY;AAAA,MACZ;AAAA,MACA,YAAY,MAAM;AAAA,MAClB;AAAA,IACJ;AAAA,IACA,YAAY,MAAM;AAAA,IAClB,iBAAiB;AAAA,IACjB,iBAAiB,MAAM;AAAA,IACvB,eAAe;AAAA,IACf;AAAA,IACA;AAAA,IACA,YAAY,OAAO,OAAO,gBAAgB,CAAC,CAAC,EAAE,KAAK,OAAO,IAAI,QAAQ;AAAA,IACtE,eAAe,gBAAgB,aAAa,OAAO;AAAA,IACnD;AAAA,IACA,GAAI,cAAc,EAAE,qBAAqB,WAAW;AAAA,IACpD,qBAAqB,MAAM,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,EAAE,KAAK,GAAG;AAAA,IACnE,qBAAqB,MAAM,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,EAAE,EAAE,KAAK,GAAG;AAAA,IACnE,GAAI,aAAa,EAAE,MAAM,UAAU;AAAA,EACvC;AACJ;AAGA,IAAM,aAAa,CAAC,aAAmC;AACnD,QAAM,OAAO,oBAAI,IAAa;AAE9B,SAAO,SAAS,OAAO,CAAC,YAAY;AAChC,UAAM,KAAM,QAA6B;AAEzC,QAAI,KAAK,IAAI,EAAE,EAAG,QAAO;AAEzB,SAAK,IAAI,EAAE;AAEX,WAAO;AAAA,EACX,CAAC;AACL;AAOO,IAAM,yBAAyB,OAClC,OACA,QAC6B;AAC7B,QAAM,EAAE,KAAK,IAAI,MAAM,gBAAgB,EAAE,MAAM,MAAM,KAAK,GAAG,GAAG;AAEhE,MAAI;AAEJ,MAAI;AACA,eAAW,MAAM,IAAI;AAAA,MACjB,UAAU,MAAM,cAAc;AAAA,MAC9B,CAAC;AAAA,MACD,EAAE,MAAM,IAAI,MAAM,QAAQ,UAAU,kBAAkB,OAAO,KAAK,MAAM,CAAC,EAAE;AAAA,IAC/E;AAAA,EACJ,SAAS,KAAK;AACV,QAAI,eAAe,kBAAkB,IAAI,WAAW,OAAO,IAAI,WAAW,MAAM;AAC5E,YAAM,IAAI,cAAc,0BAA0B,MAAM,cAAc,EAAE;AAAA,IAC5E;AAEA,UAAM;AAAA,EACV;AAEA,QAAM,MAAM,YAAY,OAAO,aAAa,WAAY,WAAsD,CAAC;AAC/G,QAAM,WAAW,MAAM,QAAQ,IAAI,IAAI,IAAK,cAAc,IAAI,IAAI,IAAkB,CAAC;AAErF,SAAO;AAAA,IACH,UAAU,IAAI,YAAY,OAAO,OAAO,cAAc,IAAI,QAAQ;AAAA,IAClE,UAAU,WAAW,QAAQ;AAAA,EACjC;AACJ;;;ACjGA,IAAMC,cAAa,CAAC,SAChB,QAAQ,OAAO,SAAS,YAAY,UAAU,OAAQ,KAA2B,OAAO;AAM5F,IAAM,2BAA2B,CAAC,SAC9B,QAAQ,QAAS,OAAO,SAAS,YAAY,CAAC,MAAM,QAAQ,IAAI,KAAK,OAAO,KAAK,IAAc,EAAE,WAAW;AAShH,IAAM,0BAA0B,CAAC,IAAY,eAAiC;AAC1E,MAAI,iBAAiB,UAAU,EAAG,QAAO,eAAe,MAAM,qBAAqB,UAAU,CAAC;AAE9F,MAAI,iBAAiB,UAAU,EAAG,QAAO,wBAAwB,EAAE,IAAI,UAAU,WAAW,CAAC;AAE7F,MAAI,mBAAmB,UAAU,EAAG,QAAO,0BAA0B,EAAE,IAAI,UAAU,WAAW,CAAC;AAEjG,MAAI,UAAU,UAAU,EAAG,QAAO,iBAAiB,EAAE,IAAI,MAAM,WAAW,MAAM,UAAU,WAAW,CAAC;AAEtG,SAAO;AACX;AAMO,IAAM,wBAAwB,OAAO,OAA4B,QAAyC;AAC7G,QAAM,SAAiC,EAAE,IAAI,OAAO,MAAM,EAAE,GAAG,MAAM,MAAM,KAAK;AAEhF,MAAI,MAAM,YAAY,KAAM,QAAO,YAAY,OAAO,MAAM,QAAQ;AAEpE,MAAI,MAAM,IAAK,QAAO,MAAM,MAAM;AAElC,MAAI;AAEJ,MAAI;AACA,eAAW,MAAM,IAAI,cAAc,4BAA4B,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC;AAAA,EAC7F,SAAS,KAAK;AAGV,QAAI,eAAe,iBAAiB,IAAI,UAAU,OAAO,IAAI,SAAS,KAAK;AACvE,YAAM,IAAI,cAAc,qBAAqB,MAAM,EAAE,EAAE;AAAA,IAC3D;AAEA,UAAM;AAAA,EACV;AAEA,QAAM,OAAOA,YAAW,QAAQ;AAEhC,MAAI,yBAAyB,IAAI,EAAG,OAAM,IAAI,cAAc,qBAAqB,MAAM,EAAE,EAAE;AAE3F,SAAO,wBAAwB,MAAM,IAAI,sBAAsB,cAAc,IAAI,CAAC,CAAC;AACvF;",
6
+ "names": ["z", "z", "uuidv7", "z", "z", "z", "z", "z", "z", "z", "uuidv7", "z", "isString", "uuidv7", "z", "z", "uuidv7", "isString", "z", "uuidv7", "z", "z", "uuidv7", "z", "z", "uuidv7", "uuidv7", "z", "uuidv7", "z", "z", "uuidv7", "z", "uuidv7", "z", "z", "z", "z", "uuidv7", "z", "z", "uuidv7", "uuidv7", "z", "z", "uuidv7", "uuidv7", "z", "z", "uuidv7", "uuidv7", "z", "z", "uuidv7", "uuidv7", "z", "z", "uuidv7", "uuidv7", "z", "z", "uuidv7", "z", "z", "uuidv7", "z", "z", "ARRAY_INDEX_STRING", "isPlainObject", "isPlainObject", "DYNAMIC_TOKEN_REGEX", "HTML_COMMENT_RE", "HTML_TAG_RE", "BUTTON_KINDS", "LOCATION_TO_EDITOR_MODE", "obj", "unwrapData"]
7
7
  }