@flowselections/ai-authenticatie 1.0.2

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 (159) hide show
  1. package/dist-lib/_core-safelist.d.ts +2 -0
  2. package/dist-lib/_core-safelist.d.ts.map +1 -0
  3. package/dist-lib/_core-safelist.js +15 -0
  4. package/dist-lib/components/AiAuthenticatieLogo.d.ts +3 -0
  5. package/dist-lib/components/AiAuthenticatieLogo.d.ts.map +1 -0
  6. package/dist-lib/components/AiAuthenticatieLogo.js +4 -0
  7. package/dist-lib/components/AiAuthenticatiePage.d.ts +4 -0
  8. package/dist-lib/components/AiAuthenticatiePage.d.ts.map +1 -0
  9. package/dist-lib/components/AiAuthenticatiePage.js +145 -0
  10. package/dist-lib/components/AiModuleDetailPage.d.ts +2 -0
  11. package/dist-lib/components/AiModuleDetailPage.d.ts.map +1 -0
  12. package/dist-lib/components/AiModuleDetailPage.js +43 -0
  13. package/dist-lib/components/AiModuleTestPanel.d.ts +4 -0
  14. package/dist-lib/components/AiModuleTestPanel.d.ts.map +1 -0
  15. package/dist-lib/components/AiModuleTestPanel.js +38 -0
  16. package/dist-lib/components/AiPeriodFilter.d.ts +7 -0
  17. package/dist-lib/components/AiPeriodFilter.d.ts.map +1 -0
  18. package/dist-lib/components/AiPeriodFilter.js +14 -0
  19. package/dist-lib/components/AiStatTile.d.ts +6 -0
  20. package/dist-lib/components/AiStatTile.d.ts.map +1 -0
  21. package/dist-lib/components/AiStatTile.js +5 -0
  22. package/dist-lib/components/ModuleAgentsDialog.d.ts +14 -0
  23. package/dist-lib/components/ModuleAgentsDialog.d.ts.map +1 -0
  24. package/dist-lib/components/ModuleAgentsDialog.js +78 -0
  25. package/dist-lib/components/ProviderLogo.d.ts +8 -0
  26. package/dist-lib/components/ProviderLogo.d.ts.map +1 -0
  27. package/dist-lib/components/ProviderLogo.js +24 -0
  28. package/dist-lib/components/ProviderManageDialog.d.ts +11 -0
  29. package/dist-lib/components/ProviderManageDialog.d.ts.map +1 -0
  30. package/dist-lib/components/ProviderManageDialog.js +173 -0
  31. package/dist-lib/components/settings/AiAuthenticatieSettingsCard.d.ts +2 -0
  32. package/dist-lib/components/settings/AiAuthenticatieSettingsCard.d.ts.map +1 -0
  33. package/dist-lib/components/settings/AiAuthenticatieSettingsCard.js +7 -0
  34. package/dist-lib/components/settings/MijnModuleSettingsCard.d.ts +2 -0
  35. package/dist-lib/components/settings/MijnModuleSettingsCard.d.ts.map +1 -0
  36. package/dist-lib/components/settings/MijnModuleSettingsCard.js +42 -0
  37. package/dist-lib/hooks/useAdminCredentials.d.ts +14 -0
  38. package/dist-lib/hooks/useAdminCredentials.d.ts.map +1 -0
  39. package/dist-lib/hooks/useAdminCredentials.js +17 -0
  40. package/dist-lib/hooks/useAiAdmin.d.ts +44 -0
  41. package/dist-lib/hooks/useAiAdmin.d.ts.map +1 -0
  42. package/dist-lib/hooks/useAiAdmin.js +32 -0
  43. package/dist-lib/hooks/useAiCostOverview.d.ts +7 -0
  44. package/dist-lib/hooks/useAiCostOverview.d.ts.map +1 -0
  45. package/dist-lib/hooks/useAiCostOverview.js +28 -0
  46. package/dist-lib/hooks/useAiForGoal.d.ts +21 -0
  47. package/dist-lib/hooks/useAiForGoal.d.ts.map +1 -0
  48. package/dist-lib/hooks/useAiForGoal.js +40 -0
  49. package/dist-lib/hooks/useAiForModule.d.ts +11 -0
  50. package/dist-lib/hooks/useAiForModule.d.ts.map +1 -0
  51. package/dist-lib/hooks/useAiForModule.js +11 -0
  52. package/dist-lib/hooks/useAiGoals.d.ts +8 -0
  53. package/dist-lib/hooks/useAiGoals.d.ts.map +1 -0
  54. package/dist-lib/hooks/useAiGoals.js +22 -0
  55. package/dist-lib/hooks/useAiModules.d.ts +15 -0
  56. package/dist-lib/hooks/useAiModules.d.ts.map +1 -0
  57. package/dist-lib/hooks/useAiModules.js +59 -0
  58. package/dist-lib/hooks/useAiPricing.d.ts +20 -0
  59. package/dist-lib/hooks/useAiPricing.d.ts.map +1 -0
  60. package/dist-lib/hooks/useAiPricing.js +97 -0
  61. package/dist-lib/hooks/useAiUsage.d.ts +12 -0
  62. package/dist-lib/hooks/useAiUsage.d.ts.map +1 -0
  63. package/dist-lib/hooks/useAiUsage.js +90 -0
  64. package/dist-lib/hooks/useAiUsageByModule.d.ts +8 -0
  65. package/dist-lib/hooks/useAiUsageByModule.d.ts.map +1 -0
  66. package/dist-lib/hooks/useAiUsageByModule.js +22 -0
  67. package/dist-lib/hooks/useIsAiAdmin.d.ts +6 -0
  68. package/dist-lib/hooks/useIsAiAdmin.d.ts.map +1 -0
  69. package/dist-lib/hooks/useIsAiAdmin.js +5 -0
  70. package/dist-lib/hooks/useMijnModuleData.d.ts +13 -0
  71. package/dist-lib/hooks/useMijnModuleData.d.ts.map +1 -0
  72. package/dist-lib/hooks/useMijnModuleData.js +49 -0
  73. package/dist-lib/hooks/useModules.d.ts +14 -0
  74. package/dist-lib/hooks/useModules.d.ts.map +1 -0
  75. package/dist-lib/hooks/useModules.js +47 -0
  76. package/dist-lib/index.d.ts +29 -0
  77. package/dist-lib/index.d.ts.map +1 -0
  78. package/dist-lib/index.js +33 -0
  79. package/dist-lib/integrations/supabase/auth-attacher.d.ts +2 -0
  80. package/dist-lib/integrations/supabase/auth-attacher.d.ts.map +1 -0
  81. package/dist-lib/integrations/supabase/auth-attacher.js +12 -0
  82. package/dist-lib/integrations/supabase/auth-middleware.d.ts +15971 -0
  83. package/dist-lib/integrations/supabase/auth-middleware.d.ts.map +1 -0
  84. package/dist-lib/integrations/supabase/auth-middleware.js +49 -0
  85. package/dist-lib/integrations/supabase/client.d.ts +15967 -0
  86. package/dist-lib/integrations/supabase/client.d.ts.map +1 -0
  87. package/dist-lib/integrations/supabase/client.js +13 -0
  88. package/dist-lib/integrations/supabase/client.server.d.ts +15967 -0
  89. package/dist-lib/integrations/supabase/client.server.d.ts.map +1 -0
  90. package/dist-lib/integrations/supabase/client.server.js +30 -0
  91. package/dist-lib/integrations/supabase/types.d.ts +16477 -0
  92. package/dist-lib/integrations/supabase/types.d.ts.map +1 -0
  93. package/dist-lib/integrations/supabase/types.js +78 -0
  94. package/dist-lib/lib/aiChat.functions.d.ts +31948 -0
  95. package/dist-lib/lib/aiChat.functions.d.ts.map +1 -0
  96. package/dist-lib/lib/aiChat.functions.js +51 -0
  97. package/dist-lib/lib/aiChat.server.d.ts +8 -0
  98. package/dist-lib/lib/aiChat.server.d.ts.map +1 -0
  99. package/dist-lib/lib/aiChat.server.js +347 -0
  100. package/dist-lib/lib/aiChat.stream.d.ts +33 -0
  101. package/dist-lib/lib/aiChat.stream.d.ts.map +1 -0
  102. package/dist-lib/lib/aiChat.stream.js +77 -0
  103. package/dist-lib/lib/aiChat.stream.server.d.ts +38 -0
  104. package/dist-lib/lib/aiChat.stream.server.d.ts.map +1 -0
  105. package/dist-lib/lib/aiChat.stream.server.js +259 -0
  106. package/dist-lib/lib/aiChat.types.d.ts +63 -0
  107. package/dist-lib/lib/aiChat.types.d.ts.map +1 -0
  108. package/dist-lib/lib/aiChat.types.js +1 -0
  109. package/dist-lib/lib/aiCredentialTest.functions.d.ts +31959 -0
  110. package/dist-lib/lib/aiCredentialTest.functions.d.ts.map +1 -0
  111. package/dist-lib/lib/aiCredentialTest.functions.js +714 -0
  112. package/dist-lib/lib/aiGoals.functions.d.ts +12912 -0
  113. package/dist-lib/lib/aiGoals.functions.d.ts.map +1 -0
  114. package/dist-lib/lib/aiGoals.functions.js +14 -0
  115. package/dist-lib/lib/aiModules.functions.d.ts +95851 -0
  116. package/dist-lib/lib/aiModules.functions.d.ts.map +1 -0
  117. package/dist-lib/lib/aiModules.functions.js +41 -0
  118. package/dist-lib/lib/aiModules.server.d.ts +65 -0
  119. package/dist-lib/lib/aiModules.server.d.ts.map +1 -0
  120. package/dist-lib/lib/aiModules.server.js +119 -0
  121. package/dist-lib/lib/aiPeriod.d.ts +11 -0
  122. package/dist-lib/lib/aiPeriod.d.ts.map +1 -0
  123. package/dist-lib/lib/aiPeriod.js +53 -0
  124. package/dist-lib/lib/aiPricing.functions.d.ts +31943 -0
  125. package/dist-lib/lib/aiPricing.functions.d.ts.map +1 -0
  126. package/dist-lib/lib/aiPricing.functions.js +13 -0
  127. package/dist-lib/lib/aiPricing.server.d.ts +19 -0
  128. package/dist-lib/lib/aiPricing.server.d.ts.map +1 -0
  129. package/dist-lib/lib/aiPricing.server.js +97 -0
  130. package/dist-lib/lib/aiUsage.functions.d.ts +5 -0
  131. package/dist-lib/lib/aiUsage.functions.d.ts.map +1 -0
  132. package/dist-lib/lib/aiUsage.functions.js +12 -0
  133. package/dist-lib/lib/aiUsage.server.d.ts +3 -0
  134. package/dist-lib/lib/aiUsage.server.d.ts.map +1 -0
  135. package/dist-lib/lib/aiUsage.server.js +229 -0
  136. package/dist-lib/lib/aiUsage.types.d.ts +21 -0
  137. package/dist-lib/lib/aiUsage.types.d.ts.map +1 -0
  138. package/dist-lib/lib/aiUsage.types.js +1 -0
  139. package/dist-lib/lib/aiUsageByModule.functions.d.ts +31952 -0
  140. package/dist-lib/lib/aiUsageByModule.functions.d.ts.map +1 -0
  141. package/dist-lib/lib/aiUsageByModule.functions.js +37 -0
  142. package/dist-lib/lib/modules.functions.d.ts +47924 -0
  143. package/dist-lib/lib/modules.functions.d.ts.map +1 -0
  144. package/dist-lib/lib/modules.functions.js +21 -0
  145. package/dist-lib/lib/modules.server.d.ts +23 -0
  146. package/dist-lib/lib/modules.server.d.ts.map +1 -0
  147. package/dist-lib/lib/modules.server.js +52 -0
  148. package/dist-lib/lib/utils.d.ts +3 -0
  149. package/dist-lib/lib/utils.d.ts.map +1 -0
  150. package/dist-lib/lib/utils.js +5 -0
  151. package/dist-lib/lib/validationSchemas.d.ts +15 -0
  152. package/dist-lib/lib/validationSchemas.d.ts.map +1 -0
  153. package/dist-lib/lib/validationSchemas.js +25 -0
  154. package/dist-lib/styles.css +1 -0
  155. package/package.json +92 -0
  156. package/public/flowselections-assets/ai-authenticatie/claude.png +0 -0
  157. package/public/flowselections-assets/ai-authenticatie/gemini.png +0 -0
  158. package/public/flowselections-assets/ai-authenticatie/openai.png +0 -0
  159. package/public/logo.png +0 -0
@@ -0,0 +1,229 @@
1
+ import { createClient } from '@supabase/supabase-js';
2
+ import { getRequest } from '@tanstack/react-start/server';
3
+ function startOfMonthISO() {
4
+ const d = new Date();
5
+ return new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), 1)).toISOString();
6
+ }
7
+ function nowISO() {
8
+ return new Date().toISOString();
9
+ }
10
+ function empty(providerSlug, message, supported = true) {
11
+ return {
12
+ ok: false,
13
+ supported,
14
+ provider_slug: providerSlug,
15
+ total_cost_usd: 0,
16
+ currency: 'USD',
17
+ input_tokens: 0,
18
+ output_tokens: 0,
19
+ lines: [],
20
+ period_start: startOfMonthISO(),
21
+ period_end: nowISO(),
22
+ fetched_at: nowISO(),
23
+ message,
24
+ };
25
+ }
26
+ async function createAuthenticatedSupabase() {
27
+ const SUPABASE_URL = process.env.SUPABASE_URL;
28
+ const SUPABASE_PUBLISHABLE_KEY = process.env.SUPABASE_PUBLISHABLE_KEY;
29
+ if (!SUPABASE_URL || !SUPABASE_PUBLISHABLE_KEY) {
30
+ return { message: 'Supabase-configuratie ontbreekt voor verbruik ophalen.' };
31
+ }
32
+ const authHeader = getRequest()?.headers?.get('authorization') ?? '';
33
+ if (!authHeader.startsWith('Bearer ')) {
34
+ return { message: 'Meld je opnieuw aan om actuele kosten op te halen.' };
35
+ }
36
+ const token = authHeader.replace('Bearer ', '').trim();
37
+ if (!token) {
38
+ return { message: 'Meld je opnieuw aan om actuele kosten op te halen.' };
39
+ }
40
+ const supabase = createClient(SUPABASE_URL, SUPABASE_PUBLISHABLE_KEY, {
41
+ global: { headers: { Authorization: `Bearer ${token}` } },
42
+ auth: {
43
+ storage: undefined,
44
+ persistSession: false,
45
+ autoRefreshToken: false,
46
+ },
47
+ });
48
+ const { data, error } = await supabase.auth.getUser(token);
49
+ if (error || !data?.user) {
50
+ return { message: 'Je sessie is verlopen of ongeldig. Meld je opnieuw aan.' };
51
+ }
52
+ return { supabase };
53
+ }
54
+ async function fetchOpenAiUsage(adminKey) {
55
+ const start = startOfMonthISO();
56
+ const startUnix = Math.floor(new Date(start).getTime() / 1000);
57
+ const linesByModel = new Map();
58
+ let totalCost = 0;
59
+ try {
60
+ const url = `https://api.openai.com/v1/organization/costs?start_time=${startUnix}&group_by=line_item&limit=180`;
61
+ const res = await fetch(url, { headers: { Authorization: `Bearer ${adminKey}` } });
62
+ if (!res.ok) {
63
+ const body = await res.text();
64
+ return empty('openai', `OpenAI kostenoproep faalde (${res.status}): ${body.slice(0, 200)}`);
65
+ }
66
+ const json = (await res.json());
67
+ for (const bucket of json.data ?? []) {
68
+ for (const r of bucket.results ?? []) {
69
+ const v = r.amount?.value ?? 0;
70
+ totalCost += v;
71
+ const model = r.line_item ?? 'overig';
72
+ const cur = linesByModel.get(model) ?? { model, input_tokens: 0, output_tokens: 0, cost_usd: 0 };
73
+ cur.cost_usd += v;
74
+ linesByModel.set(model, cur);
75
+ }
76
+ }
77
+ }
78
+ catch (e) {
79
+ return empty('openai', `OpenAI onbereikbaar: ${e.message}`);
80
+ }
81
+ try {
82
+ const url = `https://api.openai.com/v1/organization/usage/completions?start_time=${startUnix}&group_by=model&limit=180`;
83
+ const res = await fetch(url, { headers: { Authorization: `Bearer ${adminKey}` } });
84
+ if (res.ok) {
85
+ const json = (await res.json());
86
+ for (const bucket of json.data ?? []) {
87
+ for (const r of bucket.results ?? []) {
88
+ const model = r.model ?? 'overig';
89
+ const cur = linesByModel.get(model) ?? { model, input_tokens: 0, output_tokens: 0, cost_usd: 0 };
90
+ cur.input_tokens += r.input_tokens ?? 0;
91
+ cur.output_tokens += r.output_tokens ?? 0;
92
+ linesByModel.set(model, cur);
93
+ }
94
+ }
95
+ }
96
+ }
97
+ catch {
98
+ // Token-totalen zijn optioneel; kosten blijven bruikbaar.
99
+ }
100
+ const lines = Array.from(linesByModel.values()).sort((a, b) => b.cost_usd - a.cost_usd);
101
+ const inputTokens = lines.reduce((sum, line) => sum + line.input_tokens, 0);
102
+ const outputTokens = lines.reduce((sum, line) => sum + line.output_tokens, 0);
103
+ return {
104
+ ok: true,
105
+ supported: true,
106
+ provider_slug: 'openai',
107
+ total_cost_usd: totalCost,
108
+ currency: 'USD',
109
+ input_tokens: inputTokens,
110
+ output_tokens: outputTokens,
111
+ lines,
112
+ period_start: start,
113
+ period_end: nowISO(),
114
+ fetched_at: nowISO(),
115
+ };
116
+ }
117
+ async function fetchAnthropicUsage(adminKey) {
118
+ const start = startOfMonthISO();
119
+ const startingAt = `${start.slice(0, 10)}T00:00:00Z`;
120
+ const linesByModel = new Map();
121
+ let totalCost = 0;
122
+ const headers = {
123
+ 'x-api-key': adminKey,
124
+ 'anthropic-version': '2023-06-01',
125
+ };
126
+ try {
127
+ const url = `https://api.anthropic.com/v1/organizations/cost_report?starting_at=${encodeURIComponent(startingAt)}&group_by[]=model`;
128
+ const res = await fetch(url, { headers });
129
+ if (!res.ok) {
130
+ const body = await res.text();
131
+ return empty('anthropic', `Anthropic kostenoproep faalde (${res.status}): ${body.slice(0, 200)}`);
132
+ }
133
+ const json = (await res.json());
134
+ for (const bucket of json.data ?? []) {
135
+ for (const r of bucket.results ?? []) {
136
+ const v = r.amount ?? 0;
137
+ totalCost += v;
138
+ const model = r.model ?? 'overig';
139
+ const cur = linesByModel.get(model) ?? { model, input_tokens: 0, output_tokens: 0, cost_usd: 0 };
140
+ cur.cost_usd += v;
141
+ linesByModel.set(model, cur);
142
+ }
143
+ }
144
+ }
145
+ catch (e) {
146
+ return empty('anthropic', `Anthropic onbereikbaar: ${e.message}`);
147
+ }
148
+ try {
149
+ const url = `https://api.anthropic.com/v1/organizations/usage_report/messages?starting_at=${encodeURIComponent(startingAt)}&group_by[]=model`;
150
+ const res = await fetch(url, { headers });
151
+ if (res.ok) {
152
+ const json = (await res.json());
153
+ for (const bucket of json.data ?? []) {
154
+ for (const r of bucket.results ?? []) {
155
+ const model = r.model ?? 'overig';
156
+ const cur = linesByModel.get(model) ?? { model, input_tokens: 0, output_tokens: 0, cost_usd: 0 };
157
+ const inputTokens = r.input_tokens
158
+ ?? (r.uncached_input_tokens ?? 0) + (r.cache_read_input_tokens ?? 0) + (r.cache_creation_input_tokens ?? 0);
159
+ cur.input_tokens += inputTokens;
160
+ cur.output_tokens += r.output_tokens ?? 0;
161
+ linesByModel.set(model, cur);
162
+ }
163
+ }
164
+ }
165
+ }
166
+ catch {
167
+ // Token-totalen zijn optioneel; kosten blijven bruikbaar.
168
+ }
169
+ const lines = Array.from(linesByModel.values()).sort((a, b) => b.cost_usd - a.cost_usd);
170
+ const inputTokens = lines.reduce((sum, line) => sum + line.input_tokens, 0);
171
+ const outputTokens = lines.reduce((sum, line) => sum + line.output_tokens, 0);
172
+ return {
173
+ ok: true,
174
+ supported: true,
175
+ provider_slug: 'anthropic',
176
+ total_cost_usd: totalCost,
177
+ currency: 'USD',
178
+ input_tokens: inputTokens,
179
+ output_tokens: outputTokens,
180
+ lines,
181
+ period_start: start,
182
+ period_end: nowISO(),
183
+ fetched_at: nowISO(),
184
+ };
185
+ }
186
+ async function loadAdminCred(supabase, providerSlug) {
187
+ const { data: provider, error: providerError } = await supabase
188
+ .from('ai_providers')
189
+ .select('id, slug')
190
+ .eq('slug', providerSlug)
191
+ .maybeSingle();
192
+ if (providerError)
193
+ return { message: `Provider ophalen mislukt: ${providerError.message}` };
194
+ if (!provider)
195
+ return null;
196
+ const { data: cred, error: credError } = await supabase
197
+ .from('ai_admin_credentials')
198
+ .select('admin_key, active')
199
+ .eq('provider_id', provider.id)
200
+ .eq('active', true)
201
+ .maybeSingle();
202
+ if (credError)
203
+ return { message: `Admin-sleutel ophalen mislukt: ${credError.message}` };
204
+ if (!cred?.admin_key)
205
+ return null;
206
+ return { admin_key: cred.admin_key, provider_slug: providerSlug };
207
+ }
208
+ export async function fetchProviderUsageForRequest(providerSlug) {
209
+ const slug = providerSlug.toLowerCase();
210
+ if (slug === 'gemini' || slug === 'google') {
211
+ return {
212
+ ...empty(slug, 'Google biedt geen API voor actueel verbruik. Bekijk het in Google Cloud Billing.', false),
213
+ supported: false,
214
+ };
215
+ }
216
+ const auth = await createAuthenticatedSupabase();
217
+ if ('message' in auth)
218
+ return empty(slug, auth.message);
219
+ const cred = await loadAdminCred(auth.supabase, slug);
220
+ if (cred && 'message' in cred)
221
+ return empty(slug, cred.message);
222
+ if (!cred)
223
+ return empty(slug, 'Nog geen admin-sleutel opgegeven voor deze provider.');
224
+ if (slug === 'openai')
225
+ return fetchOpenAiUsage(cred.admin_key);
226
+ if (slug === 'anthropic')
227
+ return fetchAnthropicUsage(cred.admin_key);
228
+ return empty(slug, `Verbruik ophalen wordt niet ondersteund voor ${slug}.`, false);
229
+ }
@@ -0,0 +1,21 @@
1
+ export type ProviderUsageLine = {
2
+ model: string;
3
+ input_tokens: number;
4
+ output_tokens: number;
5
+ cost_usd: number;
6
+ };
7
+ export type ProviderUsageResult = {
8
+ ok: boolean;
9
+ supported: boolean;
10
+ provider_slug: string;
11
+ total_cost_usd: number;
12
+ currency: string;
13
+ input_tokens: number;
14
+ output_tokens: number;
15
+ lines: ProviderUsageLine[];
16
+ period_start: string;
17
+ period_end: string;
18
+ fetched_at: string;
19
+ message?: string;
20
+ };
21
+ //# sourceMappingURL=aiUsage.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aiUsage.types.d.ts","sourceRoot":"","sources":["../../src/lib/aiUsage.types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC"}
@@ -0,0 +1 @@
1
+ export {};