veryfront 0.0.82 → 0.0.83

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 (120) hide show
  1. package/README.md +15 -1
  2. package/esm/deno.js +1 -1
  3. package/esm/proxy/cache/index.d.ts +41 -0
  4. package/esm/proxy/cache/index.d.ts.map +1 -0
  5. package/esm/proxy/cache/index.js +75 -0
  6. package/esm/proxy/cache/memory-cache.d.ts +18 -0
  7. package/esm/proxy/cache/memory-cache.d.ts.map +1 -0
  8. package/esm/proxy/cache/memory-cache.js +100 -0
  9. package/esm/proxy/cache/redis-cache.d.ts +27 -0
  10. package/esm/proxy/cache/redis-cache.d.ts.map +1 -0
  11. package/esm/proxy/cache/redis-cache.js +183 -0
  12. package/esm/proxy/cache/resilient-cache.d.ts +44 -0
  13. package/esm/proxy/cache/resilient-cache.d.ts.map +1 -0
  14. package/esm/proxy/cache/resilient-cache.js +178 -0
  15. package/esm/proxy/cache/types.d.ts +65 -0
  16. package/esm/proxy/cache/types.d.ts.map +1 -0
  17. package/esm/proxy/cache/types.js +7 -0
  18. package/esm/proxy/handler.d.ts +81 -0
  19. package/esm/proxy/handler.d.ts.map +1 -0
  20. package/esm/proxy/handler.js +417 -0
  21. package/esm/proxy/logger.d.ts +29 -0
  22. package/esm/proxy/logger.d.ts.map +1 -0
  23. package/esm/proxy/logger.js +258 -0
  24. package/esm/proxy/oauth-client.d.ts +15 -0
  25. package/esm/proxy/oauth-client.d.ts.map +1 -0
  26. package/esm/proxy/oauth-client.js +52 -0
  27. package/esm/proxy/token-manager.d.ts +59 -0
  28. package/esm/proxy/token-manager.d.ts.map +1 -0
  29. package/esm/proxy/token-manager.js +125 -0
  30. package/esm/proxy/tracing.d.ts +39 -0
  31. package/esm/proxy/tracing.d.ts.map +1 -0
  32. package/esm/proxy/tracing.js +194 -0
  33. package/esm/src/cache/backend.d.ts +2 -0
  34. package/esm/src/cache/backend.d.ts.map +1 -1
  35. package/esm/src/cache/backend.js +2 -0
  36. package/esm/src/cache/cache-key-builder.d.ts +0 -4
  37. package/esm/src/cache/cache-key-builder.d.ts.map +1 -1
  38. package/esm/src/cache/cache-key-builder.js +0 -6
  39. package/esm/src/cache/multi-tier.d.ts +0 -29
  40. package/esm/src/cache/multi-tier.d.ts.map +1 -1
  41. package/esm/src/cache/multi-tier.js +0 -26
  42. package/esm/src/cli/app/actions.d.ts +26 -0
  43. package/esm/src/cli/app/actions.d.ts.map +1 -0
  44. package/esm/src/cli/app/actions.js +152 -0
  45. package/esm/src/cli/app/components/inline-input.d.ts +35 -0
  46. package/esm/src/cli/app/components/inline-input.d.ts.map +1 -0
  47. package/esm/src/cli/app/components/inline-input.js +220 -0
  48. package/esm/src/cli/app/components/list-select.d.ts +69 -0
  49. package/esm/src/cli/app/components/list-select.d.ts.map +1 -0
  50. package/esm/src/cli/app/components/list-select.js +137 -0
  51. package/esm/src/cli/app/index.d.ts +45 -0
  52. package/esm/src/cli/app/index.d.ts.map +1 -0
  53. package/esm/src/cli/app/index.js +1252 -0
  54. package/esm/src/cli/app/state.d.ts +122 -0
  55. package/esm/src/cli/app/state.d.ts.map +1 -0
  56. package/esm/src/cli/app/state.js +232 -0
  57. package/esm/src/cli/app/views/dashboard.d.ts +19 -0
  58. package/esm/src/cli/app/views/dashboard.d.ts.map +1 -0
  59. package/esm/src/cli/app/views/dashboard.js +178 -0
  60. package/esm/src/cli/index/command-router.d.ts.map +1 -1
  61. package/esm/src/cli/index/command-router.js +9 -39
  62. package/esm/src/cli/index/start-handler.d.ts +3 -0
  63. package/esm/src/cli/index/start-handler.d.ts.map +1 -0
  64. package/esm/src/cli/index/start-handler.js +145 -0
  65. package/esm/src/cli/mcp/index.d.ts +11 -0
  66. package/esm/src/cli/mcp/index.d.ts.map +1 -0
  67. package/esm/src/cli/mcp/index.js +10 -0
  68. package/esm/src/middleware/builtin/security/redis-rate-limit.d.ts +2 -0
  69. package/esm/src/middleware/builtin/security/redis-rate-limit.d.ts.map +1 -1
  70. package/esm/src/middleware/builtin/security/redis-rate-limit.js +23 -9
  71. package/esm/src/modules/react-loader/ssr-module-loader/cache/redis.d.ts +10 -0
  72. package/esm/src/modules/react-loader/ssr-module-loader/cache/redis.d.ts.map +1 -1
  73. package/esm/src/modules/react-loader/ssr-module-loader/cache/redis.js +30 -42
  74. package/esm/src/modules/react-loader/ssr-module-loader/loader.d.ts.map +1 -1
  75. package/esm/src/modules/react-loader/ssr-module-loader/loader.js +34 -13
  76. package/esm/src/platform/adapters/fs/cache/file-cache.d.ts.map +1 -1
  77. package/esm/src/platform/adapters/fs/cache/file-cache.js +9 -3
  78. package/esm/src/server/context/cache-invalidation.d.ts.map +1 -1
  79. package/esm/src/server/context/cache-invalidation.js +4 -0
  80. package/esm/src/server/handlers/dev/dashboard/api.js +4 -0
  81. package/esm/src/server/handlers/dev/projects/ui-handler.d.ts.map +1 -1
  82. package/esm/src/server/handlers/dev/projects/ui-handler.js +6 -0
  83. package/esm/src/transforms/esm/http-cache.d.ts.map +1 -1
  84. package/esm/src/transforms/esm/http-cache.js +139 -64
  85. package/esm/src/utils/index.d.ts +1 -1
  86. package/esm/src/utils/index.d.ts.map +1 -1
  87. package/esm/src/utils/index.js +1 -1
  88. package/package.json +2 -1
  89. package/src/deno.js +1 -1
  90. package/src/proxy/cache/index.ts +93 -0
  91. package/src/proxy/cache/memory-cache.ts +120 -0
  92. package/src/proxy/cache/redis-cache.ts +203 -0
  93. package/src/proxy/cache/resilient-cache.ts +205 -0
  94. package/src/proxy/cache/types.ts +72 -0
  95. package/src/proxy/handler.ts +593 -0
  96. package/src/proxy/logger.ts +329 -0
  97. package/src/proxy/oauth-client.ts +91 -0
  98. package/src/proxy/token-manager.ts +174 -0
  99. package/src/proxy/tracing.ts +237 -0
  100. package/src/src/cache/backend.ts +3 -0
  101. package/src/src/cache/cache-key-builder.ts +0 -9
  102. package/src/src/cache/multi-tier.ts +0 -41
  103. package/src/src/cli/app/actions.ts +190 -0
  104. package/src/src/cli/app/components/inline-input.ts +255 -0
  105. package/src/src/cli/app/components/list-select.ts +215 -0
  106. package/src/src/cli/app/index.ts +1471 -0
  107. package/src/src/cli/app/state.ts +385 -0
  108. package/src/src/cli/app/views/dashboard.ts +212 -0
  109. package/src/src/cli/index/command-router.ts +9 -40
  110. package/src/src/cli/index/start-handler.ts +195 -0
  111. package/src/src/cli/mcp/index.ts +11 -0
  112. package/src/src/middleware/builtin/security/redis-rate-limit.ts +24 -11
  113. package/src/src/modules/react-loader/ssr-module-loader/cache/redis.ts +36 -50
  114. package/src/src/modules/react-loader/ssr-module-loader/loader.ts +38 -14
  115. package/src/src/platform/adapters/fs/cache/file-cache.ts +9 -3
  116. package/src/src/server/context/cache-invalidation.ts +4 -0
  117. package/src/src/server/handlers/dev/dashboard/api.ts +2 -0
  118. package/src/src/server/handlers/dev/projects/ui-handler.ts +6 -0
  119. package/src/src/transforms/esm/http-cache.ts +148 -73
  120. package/src/src/utils/index.ts +0 -1
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Resilient Token Cache
3
+ *
4
+ * Wraps a primary cache (Redis) with a fallback cache (Memory).
5
+ * Automatically falls back to memory cache when Redis operations fail.
6
+ * Provides graceful degradation instead of hard failures.
7
+ */
8
+ import { proxyLogger } from "../logger.js";
9
+ import { withSpan } from "../tracing.js";
10
+ const CIRCUIT_OPEN_DURATION_MS = 30_000; // 30 seconds
11
+ const FAILURE_THRESHOLD = 3; // failures before circuit opens
12
+ const logger = proxyLogger.child({ module: "cache" });
13
+ export class ResilientCache {
14
+ primary;
15
+ fallback;
16
+ usingFallback = false;
17
+ failureCount = 0;
18
+ circuitOpenedAt = null;
19
+ constructor(primary, fallback) {
20
+ this.primary = primary;
21
+ this.fallback = fallback;
22
+ }
23
+ /**
24
+ * Check if we should try primary again after circuit was opened.
25
+ */
26
+ shouldTryPrimary() {
27
+ if (!this.usingFallback)
28
+ return true;
29
+ // If circuit was opened, check if enough time has passed
30
+ if (this.circuitOpenedAt) {
31
+ const elapsed = Date.now() - this.circuitOpenedAt;
32
+ if (elapsed >= CIRCUIT_OPEN_DURATION_MS) {
33
+ logger.info("[ResilientCache] Circuit half-open, trying primary again");
34
+ return true;
35
+ }
36
+ }
37
+ return false;
38
+ }
39
+ /**
40
+ * Record a successful primary operation - reset failure state.
41
+ */
42
+ recordSuccess() {
43
+ if (this.usingFallback) {
44
+ logger.info("[ResilientCache] Primary recovered, switching back from fallback");
45
+ this.usingFallback = false;
46
+ this.failureCount = 0;
47
+ this.circuitOpenedAt = null;
48
+ }
49
+ }
50
+ /**
51
+ * Record a primary failure - may trigger fallback.
52
+ */
53
+ recordFailure(error) {
54
+ this.failureCount++;
55
+ logger.warn(`[ResilientCache] Primary cache error (${this.failureCount}/${FAILURE_THRESHOLD}):`, { error: error instanceof Error ? error.message : error });
56
+ if (this.failureCount >= FAILURE_THRESHOLD && !this.usingFallback) {
57
+ logger.warn("[ResilientCache] Opening circuit, switching to fallback cache");
58
+ this.usingFallback = true;
59
+ this.circuitOpenedAt = Date.now();
60
+ }
61
+ }
62
+ async get(key) {
63
+ return withSpan("cache.resilient.get", async () => {
64
+ // Try primary if circuit allows
65
+ if (this.shouldTryPrimary()) {
66
+ try {
67
+ const result = await this.primary.get(key);
68
+ this.recordSuccess();
69
+ return result;
70
+ }
71
+ catch (error) {
72
+ this.recordFailure(error);
73
+ // Don't return here - try fallback
74
+ }
75
+ }
76
+ // Use fallback
77
+ return this.fallback.get(key);
78
+ }, { "cache.key": key, "cache.usingFallback": this.usingFallback });
79
+ }
80
+ async set(key, entry) {
81
+ return withSpan("cache.resilient.set", async () => {
82
+ // Always try to set in fallback (local cache)
83
+ await this.fallback.set(key, entry);
84
+ // Try primary if circuit allows
85
+ if (this.shouldTryPrimary()) {
86
+ try {
87
+ await this.primary.set(key, entry);
88
+ this.recordSuccess();
89
+ }
90
+ catch (error) {
91
+ this.recordFailure(error);
92
+ // Fallback already set above, no need to retry
93
+ }
94
+ }
95
+ }, { "cache.key": key, "cache.usingFallback": this.usingFallback });
96
+ }
97
+ async delete(key) {
98
+ return withSpan("cache.resilient.delete", async () => {
99
+ // Delete from both
100
+ await this.fallback.delete(key);
101
+ if (this.shouldTryPrimary()) {
102
+ try {
103
+ await this.primary.delete(key);
104
+ this.recordSuccess();
105
+ }
106
+ catch (error) {
107
+ this.recordFailure(error);
108
+ }
109
+ }
110
+ }, { "cache.key": key });
111
+ }
112
+ async clear() {
113
+ return withSpan("cache.resilient.clear", async () => {
114
+ await this.fallback.clear();
115
+ if (this.shouldTryPrimary()) {
116
+ try {
117
+ await this.primary.clear();
118
+ this.recordSuccess();
119
+ }
120
+ catch (error) {
121
+ this.recordFailure(error);
122
+ }
123
+ }
124
+ });
125
+ }
126
+ async has(key) {
127
+ return withSpan("cache.resilient.has", async () => {
128
+ if (this.shouldTryPrimary()) {
129
+ try {
130
+ const result = await this.primary.has(key);
131
+ this.recordSuccess();
132
+ return result;
133
+ }
134
+ catch (error) {
135
+ this.recordFailure(error);
136
+ }
137
+ }
138
+ return this.fallback.has(key);
139
+ }, { "cache.key": key });
140
+ }
141
+ async stats() {
142
+ return withSpan("cache.resilient.stats", async () => {
143
+ const fallbackStats = await this.fallback.stats();
144
+ if (this.shouldTryPrimary()) {
145
+ try {
146
+ const primaryStats = await this.primary.stats();
147
+ this.recordSuccess();
148
+ return {
149
+ ...primaryStats,
150
+ type: this.usingFallback ? "memory" : "redis",
151
+ };
152
+ }
153
+ catch (error) {
154
+ this.recordFailure(error);
155
+ }
156
+ }
157
+ return {
158
+ ...fallbackStats,
159
+ type: "memory",
160
+ };
161
+ }, { "cache.usingFallback": this.usingFallback });
162
+ }
163
+ async close() {
164
+ return withSpan("cache.resilient.close", async () => {
165
+ await Promise.all([this.primary.close(), this.fallback.close()]);
166
+ });
167
+ }
168
+ /**
169
+ * Get current resilience status for debugging/health checks.
170
+ */
171
+ getStatus() {
172
+ return {
173
+ usingFallback: this.usingFallback,
174
+ failureCount: this.failureCount,
175
+ circuitOpenedAt: this.circuitOpenedAt,
176
+ };
177
+ }
178
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Token Cache Interface
3
+ *
4
+ * Abstraction for storing OAuth tokens with TTL support.
5
+ * Implementations: MemoryCache, RedisCache
6
+ */
7
+ export interface TokenCacheEntry {
8
+ token: string;
9
+ expiresAt: number;
10
+ scope: "preview" | "production";
11
+ projectSlug?: string;
12
+ }
13
+ export interface TokenCache {
14
+ /**
15
+ * Get a cached token entry.
16
+ */
17
+ get(key: string): Promise<TokenCacheEntry | null>;
18
+ /**
19
+ * Set a token entry with automatic TTL based on expiresAt.
20
+ */
21
+ set(key: string, entry: TokenCacheEntry): Promise<void>;
22
+ /**
23
+ * Delete a specific token entry.
24
+ */
25
+ delete(key: string): Promise<void>;
26
+ /**
27
+ * Clear all cached tokens.
28
+ */
29
+ clear(): Promise<void>;
30
+ /**
31
+ * Check if a key exists in cache.
32
+ */
33
+ has(key: string): Promise<boolean>;
34
+ /**
35
+ * Get cache statistics.
36
+ */
37
+ stats(): Promise<CacheStats>;
38
+ /**
39
+ * Close any connections (for Redis).
40
+ */
41
+ close(): Promise<void>;
42
+ }
43
+ export interface CacheStats {
44
+ hits: number;
45
+ misses: number;
46
+ size: number;
47
+ type: "memory" | "redis";
48
+ }
49
+ export interface MemoryCacheOptions {
50
+ maxSize?: number;
51
+ cleanupInterval?: number;
52
+ }
53
+ export interface RedisCacheOptions {
54
+ url: string;
55
+ prefix?: string;
56
+ connectTimeout?: number;
57
+ }
58
+ export type CacheOptions = {
59
+ type: "memory";
60
+ options?: MemoryCacheOptions;
61
+ } | {
62
+ type: "redis";
63
+ options: RedisCacheOptions;
64
+ };
65
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/proxy/cache/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,GAAG,YAAY,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IAElD;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExD;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAEnC;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,CAAC;IAE7B;;OAEG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,CAAC,EAAE,kBAAkB,CAAA;CAAE,GAChD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,iBAAiB,CAAA;CAAE,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Token Cache Interface
3
+ *
4
+ * Abstraction for storing OAuth tokens with TTL support.
5
+ * Implementations: MemoryCache, RedisCache
6
+ */
7
+ export {};
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Proxy Handler - Core Logic
3
+ *
4
+ * Extracted proxy logic that can be used in:
5
+ * - Split mode: Standalone proxy server (proxy/main.ts)
6
+ * - Combined mode: Request interceptor in renderer process
7
+ *
8
+ * Handles:
9
+ * - Domain parsing (subdomain to project slug)
10
+ * - OAuth token management
11
+ * - Local project detection
12
+ * - User auth token extraction from cookies
13
+ */
14
+ import * as dntShim from "../_dnt.shims.js";
15
+ import { type ParsedDomain } from "../src/server/utils/domain-parser.js";
16
+ import type { TokenCache } from "./cache/types.js";
17
+ export interface ProxyConfig {
18
+ apiBaseUrl: string;
19
+ clientId: string;
20
+ clientSecret: string;
21
+ previewClientId: string;
22
+ previewClientSecret: string;
23
+ apiToken?: string;
24
+ localProjects?: Record<string, string>;
25
+ }
26
+ export interface ProxyContext {
27
+ token?: string;
28
+ projectSlug?: string;
29
+ projectId?: string;
30
+ releaseId?: string;
31
+ branchId?: string;
32
+ branchName?: string;
33
+ environment: "preview" | "production";
34
+ contentSourceId: string;
35
+ localPath?: string;
36
+ host: string;
37
+ parsedDomain: ParsedDomain;
38
+ isLocalProject: boolean;
39
+ /** Error if request cannot be processed (e.g., custom domain not found) */
40
+ error?: {
41
+ status: number;
42
+ message: string;
43
+ redirectUrl?: string;
44
+ };
45
+ }
46
+ export interface ProxyLogger {
47
+ debug: (msg: string, extra?: Record<string, unknown>) => void;
48
+ info: (msg: string, extra?: Record<string, unknown>) => void;
49
+ warn: (msg: string, extra?: Record<string, unknown>) => void;
50
+ error: (msg: string, error?: Error, extra?: Record<string, unknown>) => void;
51
+ }
52
+ export interface ProxyHandlerOptions {
53
+ config: ProxyConfig;
54
+ cache?: TokenCache;
55
+ logger?: ProxyLogger;
56
+ }
57
+ /**
58
+ * Create a proxy handler that processes requests and returns context.
59
+ *
60
+ * This is the core proxy logic, usable in both split and combined modes.
61
+ */
62
+ export declare function createProxyHandler(options: ProxyHandlerOptions): {
63
+ processRequest: (req: dntShim.Request) => Promise<ProxyContext>;
64
+ getTokenForApi: (req: dntShim.Request) => Promise<string | undefined>;
65
+ getStats: () => Promise<{
66
+ hits: number;
67
+ misses: number;
68
+ size: number;
69
+ type: string;
70
+ }>;
71
+ close: () => Promise<void>;
72
+ validateConfig: () => string[];
73
+ localProjects: Record<string, string>;
74
+ };
75
+ export type ProxyHandler = ReturnType<typeof createProxyHandler>;
76
+ /**
77
+ * Inject proxy context into request headers for the renderer.
78
+ * Used by both split mode (proxy/main.ts) and combined mode (scripts/server.ts).
79
+ */
80
+ export declare function injectContextHeaders(req: dntShim.Request, ctx: ProxyContext): dntShim.Request;
81
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/proxy/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAI5C,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,sCAAsC,CAAC;AAC7F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AA0FnD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,SAAS,GAAG,YAAY,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,OAAO,CAAC;IACxB,2EAA2E;IAC3E,KAAK,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnE;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC9D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC7D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC7D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC9E;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAiBD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB;0BAkF1B,OAAO,CAAC,OAAO,KAAG,OAAO,CAAC,YAAY,CAAC;0BA8PvC,OAAO,CAAC,OAAO,KAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;;;;;;;;0BAzQrD,MAAM,EAAE;;EAmUpC;AAED,MAAM,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC;AAEjE;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAsB7F"}