@getmicdrop/venue-calendar 3.5.5 → 3.7.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 (46) hide show
  1. package/dist/api/api.cjs +1 -1
  2. package/dist/api/api.cjs.map +1 -1
  3. package/dist/api/api.mjs +275 -260
  4. package/dist/api/api.mjs.map +1 -1
  5. package/dist/api/client.d.ts +0 -1
  6. package/dist/api/orders.d.ts +1 -2
  7. package/dist/venue-calendar.css +1 -1
  8. package/dist/venue-calendar.es.js +33632 -37
  9. package/dist/venue-calendar.es.js.map +1 -1
  10. package/dist/venue-calendar.iife.js +30 -46
  11. package/dist/venue-calendar.iife.js.map +1 -1
  12. package/dist/venue-calendar.umd.js +30 -46
  13. package/dist/venue-calendar.umd.js.map +1 -1
  14. package/package.json +15 -16
  15. package/src/lib/theme.js +46 -38
  16. package/dist/CarouselView.legacy-C9QYS3av.js +0 -64
  17. package/dist/CarouselView.legacy-C9QYS3av.js.map +0 -1
  18. package/dist/Checkout.legacy-CyiqW4Im.js +0 -1217
  19. package/dist/Checkout.legacy-CyiqW4Im.js.map +0 -1
  20. package/dist/CollectionView.legacy-CQeXXMOU.js +0 -374
  21. package/dist/CollectionView.legacy-CQeXXMOU.js.map +0 -1
  22. package/dist/FeaturedView.legacy-C3td2GLq.js +0 -128
  23. package/dist/FeaturedView.legacy-C3td2GLq.js.map +0 -1
  24. package/dist/GalleryView.legacy-BJwdUDNJ.js +0 -51
  25. package/dist/GalleryView.legacy-BJwdUDNJ.js.map +0 -1
  26. package/dist/GroupedListView.legacy-DWU0K8XY.js +0 -144
  27. package/dist/GroupedListView.legacy-DWU0K8XY.js.map +0 -1
  28. package/dist/SeriesPage.legacy-D-ZoVrPE.js +0 -187
  29. package/dist/SeriesPage.legacy-D-ZoVrPE.js.map +0 -1
  30. package/dist/Success.legacy-D9zlNOn7.js +0 -191
  31. package/dist/Success.legacy-D9zlNOn7.js.map +0 -1
  32. package/dist/VenueCalendar-DX2HF1GE.js +0 -37103
  33. package/dist/VenueCalendar-DX2HF1GE.js.map +0 -1
  34. package/dist/colors-BZoMuXdh.js +0 -62
  35. package/dist/colors-BZoMuXdh.js.map +0 -1
  36. package/dist/seo/HostSeoController.d.ts +0 -59
  37. package/dist/seo/buildCollectionJsonLd.d.ts +0 -7
  38. package/dist/seo/buildEventJsonLd.d.ts +0 -9
  39. package/dist/seo/buildSeriesJsonLd.d.ts +0 -6
  40. package/dist/seo/helpers.d.ts +0 -40
  41. package/dist/seo/index.d.ts +0 -9
  42. package/dist/seo/seo.cjs +0 -2
  43. package/dist/seo/seo.cjs.map +0 -1
  44. package/dist/seo/seo.mjs +0 -460
  45. package/dist/seo/seo.mjs.map +0 -1
  46. package/dist/seo/types.d.ts +0 -135
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@getmicdrop/venue-calendar",
3
- "version": "3.5.5",
3
+ "version": "3.7.0",
4
4
  "description": "A customizable Svelte calendar component for displaying comedy events",
5
5
  "type": "module",
6
6
  "types": "./dist/types/index.d.ts",
@@ -20,12 +20,6 @@
20
20
  "require": "./dist/api/api.cjs",
21
21
  "default": "./dist/api/api.mjs"
22
22
  },
23
- "./seo": {
24
- "types": "./dist/seo/index.d.ts",
25
- "import": "./dist/seo/seo.mjs",
26
- "require": "./dist/seo/seo.cjs",
27
- "default": "./dist/seo/seo.mjs"
28
- },
29
23
  "./theme": {
30
24
  "import": "./src/lib/theme.js",
31
25
  "default": "./src/lib/theme.js"
@@ -42,10 +36,9 @@
42
36
  "build": "vite build",
43
37
  "build:lib": "vite build --config vite.config.lib.js",
44
38
  "build:api": "vite build --config vite.config.api.js",
45
- "build:seo": "vite build --config vite.config.seo.js",
46
- "build:all": "npm run build:lib && npm run build:api && npm run build:seo",
39
+ "build:all": "npm run build:lib && npm run build:api",
47
40
  "preview": "vite preview",
48
- "prepare": "svelte-kit sync || echo ''",
41
+ "prepare": "svelte-kit sync || echo '' && husky",
49
42
  "prepublishOnly": "npm run build:all",
50
43
  "lint": "eslint src",
51
44
  "lint:fix": "eslint src --fix",
@@ -78,8 +71,7 @@
78
71
  "svelte": "^5.0.0"
79
72
  },
80
73
  "devDependencies": {
81
- "@eslint/js": "^9.39.1",
82
- "@getmicdrop/svelte-components": "^5.21.2",
74
+ "@eslint/js": "^10.0.1",
83
75
  "@sveltejs/adapter-auto": "^6.1.0",
84
76
  "@sveltejs/kit": "^2.49.4",
85
77
  "@sveltejs/vite-plugin-svelte": "^6.2.4",
@@ -88,9 +80,13 @@
88
80
  "@testing-library/svelte": "^5.3.1",
89
81
  "@vitest/coverage-v8": "^4.0.16",
90
82
  "baseline-browser-mapping": "^2.9.11",
91
- "eslint": "^9.7.0",
83
+ "eslint": "^10.2.0",
92
84
  "globals": "^16.5.0",
85
+ "husky": "^9.1.7",
93
86
  "jsdom": "^28.0.0",
87
+ "lint-staged": "^16.4.0",
88
+ "prettier": "^3.8.3",
89
+ "prettier-plugin-svelte": "^3.5.1",
94
90
  "svelte": "^5.46.1",
95
91
  "svelte-check": "^4.3.5",
96
92
  "tailwindcss": "^4.0.0",
@@ -100,13 +96,16 @@
100
96
  "vitest": "^4.0.16"
101
97
  },
102
98
  "dependencies": {
99
+ "@getmicdrop/svelte-components": "^5.28.3",
103
100
  "@stripe/stripe-js": "^8.0.0",
104
101
  "carbon-icons-svelte": "^13.7.0",
105
- "date-fns": "^4.1.0",
106
102
  "esbuild": "^0.27.2",
107
103
  "js-cookie": "^3.0.5",
108
- "libphonenumber-js": "^1.12.40",
109
- "qrcode": "^1.5.4",
110
104
  "svelte-stripe": "^2.0.0"
105
+ },
106
+ "lint-staged": {
107
+ "*.{js,ts,svelte,json,css,md}": [
108
+ "prettier --write"
109
+ ]
111
110
  }
112
111
  }
package/src/lib/theme.js CHANGED
@@ -131,31 +131,35 @@ export const themes = {
131
131
  */
132
132
  export function applyTheme(theme, container = document.documentElement) {
133
133
  const cssVarMap = {
134
- brandPrimary: '--brand-primary',
135
- textPrimary: '--text-primary',
136
- textSecondary: '--text-secondary',
137
- textTertiary: '--text-tertiary',
138
- bgPrimary: '--bg-primary',
139
- bgSecondary: '--bg-secondary',
140
- bgQuaternary: '--bg-quaternary',
141
- strokePrimary: '--stroke-primary',
142
- strokeSecondary: '--stroke-secondary',
143
- statusOnSale: '--status-on-sale',
144
- statusSellingFast: '--status-selling-fast',
145
- statusSoldOut: '--status-sold-out',
146
- todayBg: '--today-bg',
147
- todayText: '--today-text',
148
- eventDotOnSale: '--event-dot-on-sale',
149
- eventDotSellingFast: '--event-dot-selling-fast',
150
- eventDotSoldOut: '--event-dot-sold-out',
151
- hoverBg: '--hover-bg',
152
- focusRing: '--focus-ring',
134
+ brandPrimary: '--Brand-Primary',
135
+ textPrimary: '--Text-Primary',
136
+ textSecondary: '--Text-Secondary',
137
+ textTertiary: '--Text-Tertiary',
138
+ bgPrimary: '--BG-Primary',
139
+ bgSecondary: '--BG-Secondary',
140
+ bgQuaternary: '--BG-Quaternary',
141
+ strokePrimary: '--Stroke-Primary',
142
+ strokeSecondary: '--Stroke-Secondary',
143
+ statusOnSale: '--Status-OnSale',
144
+ statusSellingFast: '--Status-SellingFast',
145
+ statusSoldOut: '--Status-SoldOut',
146
+ todayBg: '--Today-BG',
147
+ todayText: '--Today-Text',
148
+ eventDotOnSale: '--EventDot-OnSale',
149
+ eventDotSellingFast: '--EventDot-SellingFast',
150
+ eventDotSoldOut: '--EventDot-SoldOut',
151
+ hoverBg: '--Hover-BG',
152
+ focusRing: '--Focus-Ring',
153
153
  };
154
154
 
155
155
  Object.entries(theme).forEach(([key, value]) => {
156
156
  const cssVar = cssVarMap[key];
157
157
  if (cssVar) {
158
158
  container.style.setProperty(cssVar, value);
159
+ // Backwards compat: also set the typo'd variable name
160
+ if (key === 'textTertiary') {
161
+ container.style.setProperty('--Text-Tartiary', value);
162
+ }
159
163
  }
160
164
  });
161
165
  }
@@ -167,25 +171,25 @@ export function applyTheme(theme, container = document.documentElement) {
167
171
  */
168
172
  export function generateThemeCSS(theme) {
169
173
  const cssVarMap = {
170
- brandPrimary: '--brand-primary',
171
- textPrimary: '--text-primary',
172
- textSecondary: '--text-secondary',
173
- textTertiary: '--text-tertiary',
174
- bgPrimary: '--bg-primary',
175
- bgSecondary: '--bg-secondary',
176
- bgQuaternary: '--bg-quaternary',
177
- strokePrimary: '--stroke-primary',
178
- strokeSecondary: '--stroke-secondary',
179
- statusOnSale: '--status-on-sale',
180
- statusSellingFast: '--status-selling-fast',
181
- statusSoldOut: '--status-sold-out',
182
- todayBg: '--today-bg',
183
- todayText: '--today-text',
184
- eventDotOnSale: '--event-dot-on-sale',
185
- eventDotSellingFast: '--event-dot-selling-fast',
186
- eventDotSoldOut: '--event-dot-sold-out',
187
- hoverBg: '--hover-bg',
188
- focusRing: '--focus-ring',
174
+ brandPrimary: '--Brand-Primary',
175
+ textPrimary: '--Text-Primary',
176
+ textSecondary: '--Text-Secondary',
177
+ textTertiary: '--Text-Tertiary',
178
+ bgPrimary: '--BG-Primary',
179
+ bgSecondary: '--BG-Secondary',
180
+ bgQuaternary: '--BG-Quaternary',
181
+ strokePrimary: '--Stroke-Primary',
182
+ strokeSecondary: '--Stroke-Secondary',
183
+ statusOnSale: '--Status-OnSale',
184
+ statusSellingFast: '--Status-SellingFast',
185
+ statusSoldOut: '--Status-SoldOut',
186
+ todayBg: '--Today-BG',
187
+ todayText: '--Today-Text',
188
+ eventDotOnSale: '--EventDot-OnSale',
189
+ eventDotSellingFast: '--EventDot-SellingFast',
190
+ eventDotSoldOut: '--EventDot-SoldOut',
191
+ hoverBg: '--Hover-BG',
192
+ focusRing: '--Focus-Ring',
189
193
  };
190
194
 
191
195
  const lines = [];
@@ -193,6 +197,10 @@ export function generateThemeCSS(theme) {
193
197
  const cssVar = cssVarMap[key];
194
198
  if (cssVar) {
195
199
  lines.push(` ${cssVar}: ${value};`);
200
+ // Backwards compat: also emit the typo'd variable name
201
+ if (key === 'textTertiary') {
202
+ lines.push(` --Text-Tartiary: ${value};`);
203
+ }
196
204
  }
197
205
  });
198
206
 
@@ -1,64 +0,0 @@
1
- import "svelte/internal/disclose-version";
2
- import * as e from "svelte/internal/client";
3
- import { onMount as _ } from "svelte";
4
- import { f as k, G as C } from "./VenueCalendar-DX2HF1GE.js";
5
- var S = e.from_html('<button class="carousel-arrow absolute top-1/2 -translate-y-1/2 z-10 w-10 h-10 rounded-full flex items-center justify-center bg-card/90 border border-border shadow-lg cursor-pointer transition-opacity duration-200 hover:bg-card hover: focus-visible:outline-2 focus-visible:outline-brand-primary:outline-brand-primary focus-visible:outline-offset-2 svelte-1lcnwer" style="left: 8px" aria-label="Scroll left"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 text-text-secondary"><polyline points="15 18 9 12 15 6"></polyline></svg></button>'), j = e.from_html('<div class="carousel-item svelte-1lcnwer" role="listitem"><!></div>'), B = e.from_html('<button class="carousel-arrow absolute top-1/2 -translate-y-1/2 z-10 w-10 h-10 rounded-full flex items-center justify-center bg-card/90 border border-border shadow-lg cursor-pointer transition-opacity duration-200 hover:bg-card hover: focus-visible:outline-2 focus-visible:outline-brand-primary:outline-brand-primary focus-visible:outline-offset-2 svelte-1lcnwer" style="right: 8px" aria-label="Scroll right"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="w-5 h-5 text-text-secondary"><polyline points="9 18 15 12 9 6"></polyline></svg></button>'), W = e.from_html('<section class="w-full" aria-label="Events carousel"><h2 class="sr-only svelte-1lcnwer">Upcoming events</h2> <div class="relative"><!> <div class="carousel-scroll flex gap-4 overflow-x-auto p-2 sm:p-3 lg:p-4 svelte-1lcnwer" role="list"></div> <!></div></section>');
6
- function G(b, i) {
7
- e.push(i, !0);
8
- let h = e.prop(i, "events", 19, () => []), o, d = e.state(!1), u = e.state(!1), n = e.state(!1), g = e.derived(() => k(h()));
9
- function a() {
10
- if (!o) return;
11
- const { scrollLeft: t, scrollWidth: r, clientWidth: l } = o;
12
- e.set(d, t > 1), e.set(u, t + l < r - 1), e.set(n, r > l + 1);
13
- }
14
- function v(t) {
15
- if (!o) return;
16
- const r = o.querySelector(".carousel-item");
17
- if (!r) return;
18
- const l = r.offsetWidth + 16;
19
- o.scrollBy({ left: t * l, behavior: "smooth" });
20
- }
21
- _(() => {
22
- a();
23
- const t = new ResizeObserver(() => a());
24
- return o && t.observe(o), () => t.disconnect();
25
- });
26
- var c = W(), f = e.sibling(e.child(c), 2), p = e.child(f);
27
- {
28
- var w = (t) => {
29
- var r = S();
30
- e.delegated("click", r, () => v(-1)), e.append(t, r);
31
- };
32
- e.if(p, (t) => {
33
- e.get(n) && e.get(d) && t(w);
34
- });
35
- }
36
- var s = e.sibling(p, 2);
37
- e.each(s, 21, () => e.get(g), e.index, (t, r) => {
38
- var l = j(), x = e.child(l);
39
- C(x, {
40
- get event() {
41
- return e.get(r);
42
- },
43
- get oneventClick() {
44
- return i.oneventClick;
45
- }
46
- }), e.reset(l), e.append(t, l);
47
- }), e.reset(s), e.bind_this(s, (t) => o = t, () => o);
48
- var m = e.sibling(s, 2);
49
- {
50
- var y = (t) => {
51
- var r = B();
52
- e.delegated("click", r, () => v(1)), e.append(t, r);
53
- };
54
- e.if(m, (t) => {
55
- e.get(n) && e.get(u) && t(y);
56
- });
57
- }
58
- e.reset(f), e.reset(c), e.event("scroll", s, a), e.append(b, c), e.pop();
59
- }
60
- e.delegate(["click"]);
61
- export {
62
- G as default
63
- };
64
- //# sourceMappingURL=CarouselView.legacy-C9QYS3av.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CarouselView.legacy-C9QYS3av.js","sources":["../src/components/Calendar/CarouselView.legacy.svelte"],"sourcesContent":["<script>\r\n import { onMount } from \"svelte\";\r\n import GalleryCard from \"./GalleryCard.svelte\";\r\n import { filterTodayAndFuture } from \"$lib/utils/browse-status.js\";\r\n\r\n let { events = [], oneventClick } = $props();\r\n\r\n let scrollContainer;\r\n let canScrollLeft = $state(false);\r\n let canScrollRight = $state(false);\r\n let showArrows = $state(false);\r\n\r\n // Filter to today and future, sorted chronologically\r\n let futureEvents = $derived(filterTodayAndFuture(events));\r\n\r\n function updateScrollState() {\r\n if (!scrollContainer) return;\r\n const { scrollLeft, scrollWidth, clientWidth } = scrollContainer;\r\n canScrollLeft = scrollLeft > 1;\r\n canScrollRight = scrollLeft + clientWidth < scrollWidth - 1;\r\n showArrows = scrollWidth > clientWidth + 1;\r\n }\r\n\r\n function scrollByCard(direction) {\r\n if (!scrollContainer) return;\r\n // Get the width of the first card item\r\n const firstCard = scrollContainer.querySelector('.carousel-item');\r\n if (!firstCard) return;\r\n const cardWidth = firstCard.offsetWidth + 16; // card width + gap\r\n scrollContainer.scrollBy({ left: direction * cardWidth, behavior: 'smooth' });\r\n }\r\n\r\n onMount(() => {\r\n updateScrollState();\r\n // Use ResizeObserver to update on container resize\r\n const observer = new ResizeObserver(() => updateScrollState());\r\n if (scrollContainer) {\r\n observer.observe(scrollContainer);\r\n }\r\n return () => observer.disconnect();\r\n });\r\n</script>\r\n\r\n<section class=\"w-full\" aria-label=\"Events carousel\">\r\n <h2 class=\"sr-only\">Upcoming events</h2>\r\n\r\n <div class=\"relative\">\r\n <!-- Left arrow -->\r\n {#if showArrows && canScrollLeft}\r\n <button\r\n class=\"carousel-arrow absolute top-1/2 -translate-y-1/2 z-10 w-10 h-10 rounded-full flex items-center justify-center bg-card/90 border border-border shadow-lg cursor-pointer transition-opacity duration-200 hover:bg-card hover: focus-visible:outline-2 focus-visible:outline-brand-primary:outline-brand-primary focus-visible:outline-offset-2\"\r\n style=\"left: 8px\"\r\n onclick={() => scrollByCard(-1)}\r\n aria-label=\"Scroll left\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"w-5 h-5 text-text-secondary\"><polyline points=\"15 18 9 12 15 6\"></polyline></svg>\r\n </button>\r\n {/if}\r\n\r\n <!-- Scroll container -->\r\n <div\r\n class=\"carousel-scroll flex gap-4 overflow-x-auto p-2 sm:p-3 lg:p-4\"\r\n bind:this={scrollContainer}\r\n onscroll={updateScrollState}\r\n role=\"list\"\r\n >\r\n {#each futureEvents as event}\r\n <div class=\"carousel-item\" role=\"listitem\">\r\n <GalleryCard {event} {oneventClick} />\r\n </div>\r\n {/each}\r\n </div>\r\n\r\n <!-- Right arrow -->\r\n {#if showArrows && canScrollRight}\r\n <button\r\n class=\"carousel-arrow absolute top-1/2 -translate-y-1/2 z-10 w-10 h-10 rounded-full flex items-center justify-center bg-card/90 border border-border shadow-lg cursor-pointer transition-opacity duration-200 hover:bg-card hover: focus-visible:outline-2 focus-visible:outline-brand-primary:outline-brand-primary focus-visible:outline-offset-2\"\r\n style=\"right: 8px\"\r\n onclick={() => scrollByCard(1)}\r\n aria-label=\"Scroll right\"\r\n >\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"w-5 h-5 text-text-secondary\"><polyline points=\"9 18 15 12 9 6\"></polyline></svg>\r\n </button>\r\n {/if}\r\n </div>\r\n</section>\r\n\r\n<style>\r\n .carousel-scroll {\r\n scroll-snap-type: x mandatory;\r\n -webkit-overflow-scrolling: touch;\r\n scrollbar-width: none;\r\n }\r\n\r\n .carousel-scroll::-webkit-scrollbar {\r\n display: none;\r\n }\r\n\r\n .carousel-item {\r\n scroll-snap-align: start;\r\n flex: 0 0 85%;\r\n }\r\n\r\n /* Tablet: 2 visible cards with peek */\r\n @media (min-width: 640px) {\r\n .carousel-item {\r\n flex: 0 0 calc(50% - 8px);\r\n }\r\n }\r\n\r\n /* Desktop: 3 visible cards with peek */\r\n @media (min-width: 1024px) {\r\n .carousel-item {\r\n flex: 0 0 calc(33.333% - 11px);\r\n }\r\n }\r\n\r\n /* Hide arrows on mobile -- touch scrolling is natural */\r\n @media (max-width: 639px) {\r\n .carousel-arrow {\r\n display: none;\r\n }\r\n }\r\n\r\n /* Reduced motion */\r\n @media (prefers-reduced-motion: reduce) {\r\n .carousel-scroll {\r\n scroll-behavior: auto;\r\n }\r\n }\r\n\r\n /* Screen reader only text */\r\n .sr-only {\r\n position: absolute;\r\n width: 1px;\r\n height: 1px;\r\n padding: 0;\r\n margin: -1px;\r\n overflow: hidden;\r\n clip: rect(0, 0, 0, 0);\r\n white-space: nowrap;\r\n border-width: 0;\r\n }\r\n</style>\r\n"],"names":["events","$","$$props","scrollContainer","canScrollLeft","canScrollRight","showArrows","futureEvents","filterTodayAndFuture","updateScrollState","scrollLeft","scrollWidth","clientWidth","scrollByCard","direction","firstCard","cardWidth","onMount","observer","section","root","div","button","root_1","$$render","consequent","div_1","node","$$anchor","event","div_2","root_2","GalleryCard","node_1","$$value","button_1","root_3","consequent_1"],"mappings":";;;;;iBAAA;;MAKQA,IAAMC,EAAA,KAAAC,GAAA,UAAA,IAAA,MAAA,EAAA,GAERC,GACAC,IAAgBH,EAAA,MAAO,EAAK,GAC5BI,IAAiBJ,EAAA,MAAO,EAAK,GAC7BK,IAAaL,EAAA,MAAO,EAAK,GAGzBM,IAAYN,EAAA,QAAA,MAAYO,EAAqBR,EAAM,CAAA,CAAA;AAE9C,WAAAS,IAAoB;SACtBN,EAAe;AACZ,UAAA,EAAA,YAAAO,GAAY,aAAAC,GAAa,aAAAC,EAAW,IAAKT;UACjDC,GAAgBM,IAAa,CAAC,GAC9BT,EAAA,IAAAI,GAAiBK,IAAaE,IAAcD,IAAc,CAAC,GAC3DV,EAAA,IAAAK,GAAaK,IAAcC,IAAc,CAAC;AAAA,EAC5C;WAESC,EAAaC,GAAW;SAC1BX,EAAe;AAEd,UAAAY,IAAYZ,EAAgB,cAAc,gBAAgB;SAC3DY,EAAS;AACR,UAAAC,IAAYD,EAAU,cAAc;AAC1C,IAAAZ,EAAgB,SAAQ,EAAG,MAAMW,IAAYE,GAAW,UAAU,UAAQ;AAAA,EAC5E;AAEA,EAAAC,QAAc;AACZ,IAAAR,EAAiB;UAEXS,IAAQ,IAAO,eAAc,MAAOT,EAAiB,CAAA;AACvD,WAAAN,KACFe,EAAS,QAAQf,CAAe,GAErB,MAAAe,EAAS,WAAU;AAAA,EAClC,CAAC;MAGFC,IAAOC,EAAA,GAGLC,sBAHFF,CAAO,GAAA,CAAA,eAGLE,CAAG;;;UAGCC,IAAMC,EAAA;2BAAND,GAAM,MAGUT,EAAY,EAAG,CAAA,eAH/BS,CAAM;AAAA;;AADJ,MAAArB,EAAA,IAAAK,CAAU,WAAIF,CAAa,KAAAoB,EAAAC,CAAA;AAAA;;MAY/BC,IAAGzB,EAAA,QAAA0B,GAAA,CAAA;SAAHD,GAAG,IAAA,MAAAzB,EAAA,IAMKM,CAAY,GAAAN,EAAA,OAAA,CAAA2B,GAAIC,MAAK;QACzBC,IAAGC,EAAA,eAAHD,CAAG;AACD,IAAAE,EAAWC,GAAA;AAAA;qBAAEJ,CAAK;AAAA;;;;gBADpBC,CAAG,eAAHA,CAAG;AAAA,cAPPJ,CAAG,eAAHA,GAAG,CAAAQ,MAES/B,IAAe+B,GAAA,MAAf/B,CAAe;oBAF3BuB,GAAG,CAAA;;;UAeDS,IAAMC,EAAA;2BAAND,GAAM,MAGUtB,EAAa,CAAC,CAAA,eAH9BsB,CAAM;AAAA;;AADJ,MAAAlC,EAAA,IAAAK,CAAU,WAAID,CAAc,KAAAmB,EAAAa,CAAA;AAAA;;UA5BlChB,CAAG,WAHLF,CAAO,GAiBHlB,EAAA,MAAA,UAAAyB,GAGWjB,CAAiB,eApBhCU,CAAO;AAFA;;"}