@20syldev/api 3.5.0 → 4.0.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 (180) hide show
  1. package/.prettierrc +7 -0
  2. package/README.md +32 -33
  3. package/dist/app.js +36 -0
  4. package/dist/app.js.map +1 -0
  5. package/dist/config/env.js +73 -0
  6. package/dist/config/env.js.map +1 -0
  7. package/dist/config/versions.js +72 -0
  8. package/dist/config/versions.js.map +1 -0
  9. package/dist/constants.js +42 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/middleware/cors.js +15 -0
  12. package/dist/middleware/cors.js.map +1 -0
  13. package/dist/middleware/error.js +6 -0
  14. package/dist/middleware/error.js.map +1 -0
  15. package/dist/middleware/json.js +8 -0
  16. package/dist/middleware/json.js.map +1 -0
  17. package/dist/middleware/logger.js +26 -0
  18. package/dist/middleware/logger.js.map +1 -0
  19. package/dist/middleware/ratelimit.js +58 -0
  20. package/dist/middleware/ratelimit.js.map +1 -0
  21. package/dist/middleware/version.js +30 -0
  22. package/dist/middleware/version.js.map +1 -0
  23. package/dist/modules/v3/algorithms.js +221 -0
  24. package/dist/modules/v3/algorithms.js.map +1 -0
  25. package/{modules → dist/modules}/v3/captcha.js +4 -13
  26. package/dist/modules/v3/captcha.js.map +1 -0
  27. package/dist/modules/v3/chat.js +103 -0
  28. package/dist/modules/v3/chat.js.map +1 -0
  29. package/{modules → dist/modules}/v3/color.js +12 -13
  30. package/dist/modules/v3/color.js.map +1 -0
  31. package/dist/modules/v3/convert.js +41 -0
  32. package/dist/modules/v3/convert.js.map +1 -0
  33. package/dist/modules/v3/domain.js +83 -0
  34. package/dist/modules/v3/domain.js.map +1 -0
  35. package/dist/modules/v3/hash.js +16 -0
  36. package/dist/modules/v3/hash.js.map +1 -0
  37. package/dist/modules/v3/hyperplanning.js +50 -0
  38. package/dist/modules/v3/hyperplanning.js.map +1 -0
  39. package/dist/modules/v3/levenshtein.js +38 -0
  40. package/dist/modules/v3/levenshtein.js.map +1 -0
  41. package/dist/modules/v3/personal.js +129 -0
  42. package/dist/modules/v3/personal.js.map +1 -0
  43. package/dist/modules/v3/qrcode.js +21 -0
  44. package/dist/modules/v3/qrcode.js.map +1 -0
  45. package/dist/modules/v3/tic_tac_toe.js +221 -0
  46. package/dist/modules/v3/tic_tac_toe.js.map +1 -0
  47. package/dist/modules/v3/time.js +88 -0
  48. package/dist/modules/v3/time.js.map +1 -0
  49. package/{modules → dist/modules}/v3/token.js +10 -11
  50. package/dist/modules/v3/token.js.map +1 -0
  51. package/dist/modules/v3/username.js +92 -0
  52. package/dist/modules/v3/username.js.map +1 -0
  53. package/dist/modules/v3/utils.js +70 -0
  54. package/dist/modules/v3/utils.js.map +1 -0
  55. package/dist/modules/v3.js +16 -0
  56. package/dist/modules/v3.js.map +1 -0
  57. package/dist/modules/v4/algorithms.js +200 -0
  58. package/dist/modules/v4/algorithms.js.map +1 -0
  59. package/dist/modules/v4/captcha.js +35 -0
  60. package/dist/modules/v4/captcha.js.map +1 -0
  61. package/dist/modules/v4/chat.js +92 -0
  62. package/dist/modules/v4/chat.js.map +1 -0
  63. package/dist/modules/v4/color.js +43 -0
  64. package/dist/modules/v4/color.js.map +1 -0
  65. package/dist/modules/v4/convert.js +33 -0
  66. package/dist/modules/v4/convert.js.map +1 -0
  67. package/dist/modules/v4/dice.js +30 -0
  68. package/dist/modules/v4/dice.js.map +1 -0
  69. package/dist/modules/v4/domain.js +78 -0
  70. package/dist/modules/v4/domain.js.map +1 -0
  71. package/dist/modules/v4/encode.js +165 -0
  72. package/dist/modules/v4/encode.js.map +1 -0
  73. package/dist/modules/v4/geo.js +41 -0
  74. package/dist/modules/v4/geo.js.map +1 -0
  75. package/dist/modules/v4/hash.js +9 -0
  76. package/dist/modules/v4/hash.js.map +1 -0
  77. package/dist/modules/v4/hyperplanning.js +42 -0
  78. package/dist/modules/v4/hyperplanning.js.map +1 -0
  79. package/dist/modules/v4/levenshtein.js +29 -0
  80. package/dist/modules/v4/levenshtein.js.map +1 -0
  81. package/dist/modules/v4/palette.js +89 -0
  82. package/dist/modules/v4/palette.js.map +1 -0
  83. package/dist/modules/v4/personal.js +125 -0
  84. package/dist/modules/v4/personal.js.map +1 -0
  85. package/dist/modules/v4/placeholder.js +96 -0
  86. package/dist/modules/v4/placeholder.js.map +1 -0
  87. package/dist/modules/v4/qrcode.js +12 -0
  88. package/dist/modules/v4/qrcode.js.map +1 -0
  89. package/dist/modules/v4/statistics.js +41 -0
  90. package/dist/modules/v4/statistics.js.map +1 -0
  91. package/dist/modules/v4/text.js +293 -0
  92. package/dist/modules/v4/text.js.map +1 -0
  93. package/dist/modules/v4/tic_tac_toe.js +206 -0
  94. package/dist/modules/v4/tic_tac_toe.js.map +1 -0
  95. package/dist/modules/v4/time.js +73 -0
  96. package/dist/modules/v4/time.js.map +1 -0
  97. package/dist/modules/v4/token.js +36 -0
  98. package/dist/modules/v4/token.js.map +1 -0
  99. package/dist/modules/v4/username.js +87 -0
  100. package/dist/modules/v4/username.js.map +1 -0
  101. package/dist/modules/v4/utils.js +26 -0
  102. package/dist/modules/v4/utils.js.map +1 -0
  103. package/dist/modules/v4/validate.js +54 -0
  104. package/dist/modules/v4/validate.js.map +1 -0
  105. package/dist/modules/v4.js +18 -0
  106. package/dist/modules/v4.js.map +1 -0
  107. package/dist/routes/delete.js +65 -0
  108. package/dist/routes/delete.js.map +1 -0
  109. package/dist/routes/get.js +441 -0
  110. package/dist/routes/get.js.map +1 -0
  111. package/dist/routes/index.js +50 -0
  112. package/dist/routes/index.js.map +1 -0
  113. package/dist/routes/patch.js +41 -0
  114. package/dist/routes/patch.js.map +1 -0
  115. package/dist/routes/post.js +185 -0
  116. package/dist/routes/post.js.map +1 -0
  117. package/dist/storage/index.js +13 -0
  118. package/dist/storage/index.js.map +1 -0
  119. package/dist/types/storage.js +2 -0
  120. package/dist/types/storage.js.map +1 -0
  121. package/dist/utils/response.js +10 -0
  122. package/dist/utils/response.js.map +1 -0
  123. package/dist/utils/version.js +3 -0
  124. package/dist/utils/version.js.map +1 -0
  125. package/eslint.config.js +20 -0
  126. package/package.json +30 -15
  127. package/src/app.ts +44 -0
  128. package/src/config/env.ts +81 -0
  129. package/src/config/versions.ts +80 -0
  130. package/src/constants.ts +28 -0
  131. package/src/middleware/cors.ts +17 -0
  132. package/src/middleware/error.ts +7 -0
  133. package/src/middleware/json.ts +9 -0
  134. package/src/middleware/logger.ts +31 -0
  135. package/src/middleware/ratelimit.ts +66 -0
  136. package/src/middleware/version.ts +39 -0
  137. package/{modules → src/modules}/v3/algorithms.js +1 -1
  138. package/src/modules/v3/captcha.js +60 -0
  139. package/{modules → src/modules}/v3/chat.js +6 -4
  140. package/src/modules/v3/color.js +60 -0
  141. package/{modules → src/modules}/v3/convert.js +5 -5
  142. package/{modules → src/modules}/v3/domain.js +51 -4
  143. package/{modules → src/modules}/v3/hash.js +1 -1
  144. package/{modules → src/modules}/v3/hyperplanning.js +11 -10
  145. package/{modules → src/modules}/v3/levenshtein.js +3 -3
  146. package/{modules → src/modules}/v3/personal.js +20 -8
  147. package/{modules → src/modules}/v3/qrcode.js +1 -1
  148. package/{modules → src/modules}/v3/tic_tac_toe.js +24 -18
  149. package/{modules → src/modules}/v3/time.js +22 -11
  150. package/src/modules/v3/token.js +54 -0
  151. package/src/modules/v3/username.js +94 -0
  152. package/{modules → src/modules}/v3/utils.js +2 -2
  153. package/{modules → src/modules}/v3.js +1 -1
  154. package/src/modules/v4/algorithms.ts +155 -0
  155. package/src/modules/v4/captcha.ts +49 -0
  156. package/src/modules/v4/chat.ts +99 -0
  157. package/src/modules/v4/color.ts +64 -0
  158. package/src/modules/v4/convert.ts +38 -0
  159. package/src/modules/v4/domain.ts +81 -0
  160. package/src/modules/v4/hash.ts +9 -0
  161. package/src/modules/v4/hyperplanning.ts +58 -0
  162. package/src/modules/v4/levenshtein.ts +38 -0
  163. package/src/modules/v4/personal.ts +147 -0
  164. package/src/modules/v4/qrcode.ts +11 -0
  165. package/src/modules/v4/tic_tac_toe.ts +223 -0
  166. package/src/modules/v4/time.ts +92 -0
  167. package/src/modules/v4/token.ts +43 -0
  168. package/src/modules/v4/username.ts +89 -0
  169. package/src/modules/v4/utils.ts +38 -0
  170. package/src/modules/v4.ts +15 -0
  171. package/src/routes/get.ts +461 -0
  172. package/src/routes/index.ts +58 -0
  173. package/src/routes/post.ts +200 -0
  174. package/src/storage/index.ts +16 -0
  175. package/src/types/express.d.ts +17 -0
  176. package/src/types/storage.ts +48 -0
  177. package/src/utils/response.ts +11 -0
  178. package/tsconfig.json +17 -0
  179. package/app.js +0 -865
  180. package/modules/v3/username.js +0 -32
package/.prettierrc ADDED
@@ -0,0 +1,7 @@
1
+ {
2
+ "tabWidth": 4,
3
+ "singleQuote": true,
4
+ "semi": true,
5
+ "printWidth": 120,
6
+ "trailingComma": "all"
7
+ }
package/README.md CHANGED
@@ -2,16 +2,19 @@
2
2
  <a href="https://api.sylvain.sh"><img src="https://api.sylvain.sh/favicon.ico" alt="Logo" width="25%" height="auto"/></a>
3
3
 
4
4
  # API Personnelle
5
- [![Version](https://custom-icon-badges.demolab.com/badge/Version%20:-v3.5.0-6479ee?logo=api.sylvain.sh&labelColor=23272A)](https://github.com/20syldev/api/releases/latest)
5
+ [![Version](https://custom-icon-badges.demolab.com/badge/Version%20:-v4.0.0-6479ee?logo=api.sylvain.sh&labelColor=23272A)](https://github.com/20syldev/api/releases/latest)
6
6
  </div>
7
7
 
8
8
  ---
9
9
 
10
10
  ## À propos de l'API
11
11
  Voici mon API personnelle, disponible sur le domaine [api.sylvain.sh](https://api.sylvain.sh).
12
- L'API est développée avec Node.js et hébergée **24h/7j**. Elle est **simple d'utilisation** et a une **documentation** disponible sur [docs.sylvain.sh](https://docs.sylvain.sh) !
12
+ L'API est développée avec **TypeScript** et **Node.js**, et hébergée **24h/7j**. Elle est **simple d'utilisation** et a une **documentation** disponible sur [docs.sylvain.sh](https://docs.sylvain.sh) !
13
13
  > *Une limite de **2000** requêtes **par heure** est fixée. Elle change pour certains endpoints nécessitant plus de ressources. Si vous souhaitez une **augmentation** de cette limite, n'hésitez pas à visiter la [documentation](https://docs.sylvain.sh/pricing).*
14
14
 
15
+ ## Prérequis
16
+ - **Node.js** >= 22.0.0
17
+
15
18
  ## Installer le paquet de l'API sur votre machine
16
19
  ```console
17
20
  $ sudo apt install nodejs npm
@@ -24,26 +27,34 @@ $ npm init
24
27
 
25
28
  ### Option 1 : Démarrer un serveur local
26
29
 
27
- Pour démarrer un serveur local avec tous les endpoints, créez un fichier JavaScript, par exemple `index.js` :
28
- ```js
29
- import '@20syldev/api';
30
+ Pour démarrer un serveur local avec tous les endpoints :
31
+ ```console
32
+ $ npm run build && npm start
30
33
  ```
31
-
32
- Puis, **démarrez** un serveur [Node.js](https://nodejs.org) :
33
34
  ```console
34
- $ node index.js
35
+ > @20syldev/api@4.0.0 build
36
+ > tsc
37
+
38
+ > @20syldev/api@4.0.0 start
39
+ > node dist/app.js
40
+
35
41
  API is running on
36
42
  - http://127.0.0.1:3000
37
43
  - http://localhost:3000
38
44
  ```
39
45
 
46
+ Pour le développement avec rechargement automatique :
47
+ ```console
48
+ $ npm run dev
49
+ ```
50
+
40
51
  ### Option 2 : Utiliser les modules directement dans votre code
41
52
 
42
53
  Vous pouvez également importer les modules spécifiques dont vous avez besoin :
43
54
 
44
55
  ```js
45
- // Importer des modules spécifiques depuis la v3
46
- import { color, token, username } from '@20syldev/api/v3';
56
+ // Importer des modules spécifiques depuis la v4
57
+ import { color, token, username } from '@20syldev/api/v4';
47
58
 
48
59
  // Générer une couleur aléatoire
49
60
  const couleur = color();
@@ -60,32 +71,20 @@ const jeton = token(16, 'hex');
60
71
  console.log(`Jeton: ${jeton}`);
61
72
  ```
62
73
 
63
- ## Tester l'API sur votre machine
64
- **Téléchargez** la [dernière mise à jour](https://github.com/20syldev/api/releases/latest) de l'API, puis **extrayez** le contenu du fichier `.zip` ou `.tar.gz` dans un de vos **répertoires**.
65
- Ensuite, **déplacez-vous** dans le dossier du projet, via un terminal **Linux**, **Windows** ou **macOS** :
66
- ```console
67
- $ cd /chemin/vers/le/projet
68
- ```
69
-
70
- Enfin, **exécutez** le script de build, qui installera les **dépendances** et lancera le **serveur** de l'[API](https://api.sylvain.sh) :
71
- ```console
72
- $ npm run build
73
- ```
74
- ```console
75
- > @20syldev/api@3.5.0 build
76
- > npm install && node app.js
77
-
78
- [...]
74
+ ## Scripts disponibles
79
75
 
80
- found 0 vulnerabilities
81
- API is running on
82
- - http://127.0.0.1:3000
83
- - http://localhost:3000
84
- ```
76
+ | Commande | Description |
77
+ |----------|-------------|
78
+ | `npm run dev` | Serveur de développement avec rechargement automatique (tsx watch) |
79
+ | `npm run build` | Compilation TypeScript vers `dist/` |
80
+ | `npm start` | Démarrer le serveur de production (`node dist/app.js`) |
81
+ | `npm run lint` | Vérification ESLint |
82
+ | `npm run format` | Formatage avec Prettier |
83
+ | `npm run check` | Vérification TypeScript + ESLint |
85
84
 
86
85
  ## Modules disponibles
87
86
 
88
- L'API v3 expose plusieurs modules que vous pouvez importer :
87
+ L'API v4 expose plusieurs modules que vous pouvez importer :
89
88
 
90
89
  ```js
91
90
  import {
@@ -104,7 +103,7 @@ import {
104
103
  time, // Informations temporelles
105
104
  token, // Génération de jetons sécurisés
106
105
  username // Génération de noms d'utilisateur
107
- } from '@20syldev/api/v3';
106
+ } from '@20syldev/api/v4';
108
107
  ```
109
108
 
110
109
  *Visitez la [documentation](https://docs.sylvain.sh) dédiée, vous y retrouverez des exemples de requêtes et des codes simples pour tester l'[API](https://api.sylvain.sh) !*
package/dist/app.js ADDED
@@ -0,0 +1,36 @@
1
+ import express from 'express';
2
+ import { env } from './config/env.js';
3
+ import { setupCors } from './middleware/cors.js';
4
+ import { jsonResponseMiddleware } from './middleware/json.js';
5
+ import { rateLimitMiddleware } from './middleware/ratelimit.js';
6
+ import { loggerMiddleware } from './middleware/logger.js';
7
+ import { errorHandler } from './middleware/error.js';
8
+ import { versionCheckMiddleware, endpointCheckMiddleware } from './middleware/version.js';
9
+ import indexRoutes from './routes/index.js';
10
+ import getRoutes from './routes/get.js';
11
+ import postRoutes from './routes/post.js';
12
+ const app = express();
13
+ // Setup CORS, body parsing, static files
14
+ setupCors(app);
15
+ // Custom JSON response
16
+ app.use(jsonResponseMiddleware);
17
+ // Rate limiting
18
+ app.use(rateLimitMiddleware);
19
+ // Request logging
20
+ app.use(loggerMiddleware);
21
+ // Error handling
22
+ app.use(errorHandler);
23
+ // Root routes (before version check)
24
+ app.use(indexRoutes);
25
+ // Version & endpoint validation
26
+ app.use('/:version', versionCheckMiddleware);
27
+ app.use('/:version/:endpoint', endpointCheckMiddleware);
28
+ // Versioned routes
29
+ app.use(getRoutes);
30
+ app.use(postRoutes);
31
+ // Start server
32
+ if (process.env.NODE_ENV !== 'test') {
33
+ app.listen(env.PORT, () => console.log(`API is running on\n - http://127.0.0.1:${env.PORT}\n - http://localhost:${env.PORT}`));
34
+ }
35
+ export default app;
36
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC1F,OAAO,WAAW,MAAM,mBAAmB,CAAC;AAC5C,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,UAAU,MAAM,kBAAkB,CAAC;AAE1C,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC;AAEtB,yCAAyC;AACzC,SAAS,CAAC,GAAG,CAAC,CAAC;AAEf,uBAAuB;AACvB,GAAG,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAEhC,gBAAgB;AAChB,GAAG,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AAE7B,kBAAkB;AAClB,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;AAE1B,iBAAiB;AACjB,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAEtB,qCAAqC;AACrC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;AAErB,gCAAgC;AAChC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;AAC7C,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,uBAAuB,CAAC,CAAC;AAExD,mBAAmB;AACnB,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACnB,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;AAEpB,eAAe;AACf,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,EAAE,CAAC;IAClC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CACtB,OAAO,CAAC,GAAG,CAAC,6CAA6C,GAAG,CAAC,IAAI,4BAA4B,GAAG,CAAC,IAAI,EAAE,CAAC,CAC3G,CAAC;AACN,CAAC;AAED,eAAe,GAAG,CAAC"}
@@ -0,0 +1,73 @@
1
+ import dotenv from 'dotenv';
2
+ import { DEFAULT_PORT } from '../constants.js';
3
+ dotenv.config();
4
+ function envList(key) {
5
+ const v = process.env[key];
6
+ return v && v !== 'undefined' ? v.split(' ') : null;
7
+ }
8
+ function envNumber(key, fallback) {
9
+ const v = parseInt(process.env[key] ?? '', 10);
10
+ return isNaN(v) ? fallback : v;
11
+ }
12
+ export const env = {
13
+ PORT: envNumber('PORT', DEFAULT_PORT),
14
+ GITHUB_TOKEN: process.env.GITHUB_TOKEN ?? '',
15
+ DEFAULT_LIMIT: envNumber('DEFAULT_LIMIT', 2000),
16
+ PRO_LIMIT: envNumber('PRO_LIMIT', 6000),
17
+ ADVANCED_LIMIT: envNumber('ADVANCED_LIMIT', 4000),
18
+ BUSINESS_LIMIT: envNumber('BUSINESS_LIMIT', 10000),
19
+ GLOBAL_LIMIT: envNumber('GLOBAL_LIMIT', 50000),
20
+ BUSINESS_TOKEN_LIST: envList('BUSINESS_TOKEN_LIST') ?? [],
21
+ PRO_TOKEN_LIST: envList('PRO_TOKEN_LIST') ?? [],
22
+ ADVANCED_TOKEN_LIST: envList('ADVANCED_TOKEN_LIST') ?? [],
23
+ // Website endpoint env vars
24
+ G_2048: process.env.G_2048,
25
+ API: process.env.API,
26
+ CDN: process.env.CDN,
27
+ COOP_API: process.env.COOP_API,
28
+ COOP_STATUS: process.env.COOP_STATUS,
29
+ CHAT: process.env.CHAT,
30
+ DIGIT: process.env.DIGIT,
31
+ DOC_COOPBOT: process.env.DOC_COOPBOT,
32
+ DOCS: process.env.DOCS,
33
+ DONUT: process.env.DONUT,
34
+ DRAWIO_PLUGIN: process.env.DRAWIO_PLUGIN,
35
+ FLOWERS: process.env.FLOWERS,
36
+ GEMSYNC: process.env.GEMSYNC,
37
+ GFT: process.env.GFT,
38
+ GITSITE: process.env.GITSITE,
39
+ LEBONCHAR: process.env.LEBONCHAR,
40
+ LOGGER: process.env.LOGGER,
41
+ LOGS: process.env.LOGS,
42
+ LOGVAULT: process.env.LOGVAULT,
43
+ LYAH: process.env.LYAH,
44
+ MINIFY: process.env.MINIFY,
45
+ MN: process.env.MN,
46
+ MONITORING: process.env.MONITORING,
47
+ MORPION: process.env.MORPION,
48
+ NITROGEN: process.env.NITROGEN,
49
+ OLD_DATABASE: process.env.OLD_DATABASE,
50
+ PASSWORD: process.env.PASSWORD,
51
+ PHP: process.env.PHP,
52
+ PLANNING: process.env.PLANNING,
53
+ PING: process.env.PING,
54
+ PORTFOLIO: process.env.PORTFOLIO,
55
+ PYTHON_API: process.env.PYTHON_API,
56
+ README: process.env.README,
57
+ TIMESTAMP: process.env.TIMESTAMP,
58
+ TERMINAL: process.env.TERMINAL,
59
+ VALENTINE: process.env.VALENTINE,
60
+ WRKIT: process.env.WRKIT,
61
+ ZPKI: process.env.ZPKI,
62
+ PATCH: envList('PATCH'),
63
+ RECENT: envList('RECENT'),
64
+ NEW: envList('NEW'),
65
+ DOMAINS: envList('DOMAINS'),
66
+ STATS1: process.env.STATS1,
67
+ STATS2: process.env.STATS2,
68
+ STATS3: process.env.STATS3,
69
+ STATS4: process.env.STATS4,
70
+ TAG: process.env.TAG,
71
+ ACTIVE: process.env.ACTIVE === 'true',
72
+ };
73
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import * as apiv3 from '../modules/v3.js';
2
+ import * as apiv4 from '../modules/v4.js';
3
+ /**
4
+ * Merges a base list of endpoints with additions, deduplicating by `name`.
5
+ * If an addition has the same name as a base entry, it overrides it.
6
+ */
7
+ const merge = (base, additions) => {
8
+ const map = new Map(base.map((e) => [e.name, e]));
9
+ for (const e of additions)
10
+ map.set(e.name, e);
11
+ return [...map.values()];
12
+ };
13
+ const v1 = {
14
+ get: [
15
+ { name: 'algorithms', path: '/algorithms?method={algorithm}&value={value}(&value2={value2})' },
16
+ { name: 'captcha', path: '/captcha?text={text}' },
17
+ { name: 'color', path: '/color' },
18
+ { name: 'convert', path: '/convert?value={value}&from={unit}&to={unit}' },
19
+ { name: 'domain', path: '/domain' },
20
+ { name: 'infos', path: '/infos' },
21
+ { name: 'personal', path: '/personal' },
22
+ { name: 'qrcode', path: '/qrcode?url={URL}' },
23
+ { name: 'username', path: '/username' },
24
+ { name: 'website', path: '/website' },
25
+ ],
26
+ post: [{ name: 'token', path: '/token' }],
27
+ };
28
+ const v2 = {
29
+ get: merge(v1.get, [{ name: 'chat', path: '/chat' }]),
30
+ post: merge(v1.post, [
31
+ {
32
+ name: 'chat',
33
+ children: {
34
+ chat: '/chat',
35
+ private: '/chat/private',
36
+ },
37
+ },
38
+ { name: 'hash', path: '/hash' },
39
+ {
40
+ name: 'tic_tac_toe',
41
+ children: {
42
+ tic_tac_toe: '/tic-tac-toe',
43
+ fetch: '/tic-tac-toe/fetch',
44
+ list: '/tic-tac-toe/list',
45
+ },
46
+ },
47
+ ]),
48
+ };
49
+ const v3 = {
50
+ get: merge(v2.get, [
51
+ { name: 'levenshtein', path: '/levenshtein?str1={string}&str2={string}' },
52
+ {
53
+ name: 'time',
54
+ path: '/time(?type={type}&start={timestamp}&end={timestamp}&format={format}&timezone={timezone})',
55
+ },
56
+ ]),
57
+ post: merge(v2.post, [{ name: 'hyperplanning', path: '/hyperplanning' }]),
58
+ };
59
+ const v4 = {
60
+ get: merge(v3.get, [
61
+ { name: 'dice', path: '/dice?roll={NdX+M}' },
62
+ { name: 'statistics', path: '/statistics?values={n1,n2,n3,...}' },
63
+ ]),
64
+ post: [...v3.post],
65
+ };
66
+ export const versions = {
67
+ v1: { endpoints: v1, modules: apiv3 },
68
+ v2: { endpoints: v2, modules: apiv3 },
69
+ v3: { endpoints: v3, modules: apiv3 },
70
+ v4: { endpoints: v4, modules: apiv4 },
71
+ };
72
+ //# sourceMappingURL=versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/config/versions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ export const MAX_LOG_ENTRIES = 1000;
2
+ export const RATE_LIMIT_WINDOW = 10_000;
3
+ export const RATE_LIMIT_MAX = 50;
4
+ export const SESSION_TTL = 3_600_000;
5
+ export const GAME_CLEANUP_TTL = 600_000;
6
+ export const GITHUB_CACHE_TTL = 600_000;
7
+ export const MIN_TOKEN_LENGTH = 12;
8
+ export const MAX_TOKEN_LENGTH = 4096;
9
+ export const MAX_FACTORIAL = 170;
10
+ export const MAX_GCD_VALUE = 100_000;
11
+ export const MAX_PRIME_LIST = 10_000;
12
+ export const MAX_LEVENSHTEIN_LENGTH = 1000;
13
+ export const MAX_STRING_LENGTH = 1000;
14
+ export const MIN_TEMPERATURE = -273.15;
15
+ export const MAX_TEMPERATURE = 1_000_000;
16
+ export const DOCS_URL = 'https://docs.sylvain.sh';
17
+ export const DEFAULT_PORT = 3000;
18
+ export const STATUS_MESSAGES = {
19
+ 400: 'Bad Request',
20
+ 401: 'Unauthorized',
21
+ 404: 'Not Found',
22
+ 405: 'Method Not Allowed',
23
+ 429: 'Too Many Requests',
24
+ 500: 'Internal Server Error',
25
+ };
26
+ export const START_TIME = Date.now();
27
+ export const ROMAN_VALUES = [
28
+ [1000, 'M'],
29
+ [900, 'CM'],
30
+ [500, 'D'],
31
+ [400, 'CD'],
32
+ [100, 'C'],
33
+ [90, 'XC'],
34
+ [50, 'L'],
35
+ [40, 'XL'],
36
+ [10, 'X'],
37
+ [9, 'IX'],
38
+ [5, 'V'],
39
+ [4, 'IV'],
40
+ [1, 'I'],
41
+ ];
42
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC;AACpC,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AACxC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,WAAW,GAAG,SAAS,CAAC;AACrC,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AACxC,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AACnC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AACrC,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,CAAC;AACjC,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC;AACrC,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,CAAC;AAC3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,MAAM,CAAC;AACvC,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC;AACzC,MAAM,CAAC,MAAM,QAAQ,GAAG,yBAAyB,CAAC;AAClD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC;AAEjC,MAAM,CAAC,MAAM,eAAe,GAA2B;IACnD,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,oBAAoB;IACzB,GAAG,EAAE,mBAAmB;IACxB,GAAG,EAAE,uBAAuB;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAErC,MAAM,CAAC,MAAM,YAAY,GAAuB;IAC5C,CAAC,IAAI,EAAE,GAAG,CAAC;IACX,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,GAAG,EAAE,IAAI,CAAC;IACX,CAAC,GAAG,EAAE,GAAG,CAAC;IACV,CAAC,EAAE,EAAE,IAAI,CAAC;IACV,CAAC,EAAE,EAAE,GAAG,CAAC;IACT,CAAC,EAAE,EAAE,IAAI,CAAC;IACV,CAAC,EAAE,EAAE,GAAG,CAAC;IACT,CAAC,CAAC,EAAE,IAAI,CAAC;IACT,CAAC,CAAC,EAAE,GAAG,CAAC;IACR,CAAC,CAAC,EAAE,IAAI,CAAC;IACT,CAAC,CAAC,EAAE,GAAG,CAAC;CACX,CAAC"}
@@ -0,0 +1,15 @@
1
+ import cors from 'cors';
2
+ import express from 'express';
3
+ import { dirname, join } from 'path';
4
+ import { fileURLToPath } from 'url';
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+ export function setupCors(app) {
8
+ app.set('trust proxy', 1);
9
+ app.use(cors({ methods: ['GET', 'POST', 'PATCH', 'DELETE', 'OPTIONS'] }));
10
+ app.use(express.urlencoded({ extended: true }));
11
+ app.use(express.json());
12
+ app.use('/favicon.ico', express.static(join(__dirname, '..', '..', 'src', 'favicon.ico')));
13
+ app.use('/robots.txt', express.static(join(__dirname, '..', '..', 'robots.txt')));
14
+ }
15
+ //# sourceMappingURL=cors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cors.js","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,OAAyB,MAAM,SAAS,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,UAAU,SAAS,CAAC,GAAY;IAClC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;IAC1B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAChD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAExB,GAAG,CAAC,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IAC3F,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { error } from '../utils/response.js';
2
+ export function errorHandler(err, _req, res, _next) {
3
+ console.error(err.stack);
4
+ error(res, 500, err.message);
5
+ }
6
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../src/middleware/error.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,MAAM,UAAU,YAAY,CAAC,GAAU,EAAE,IAAa,EAAE,GAAa,EAAE,KAAmB;IACtF,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export function jsonResponseMiddleware(_req, res, next) {
2
+ res.setHeader('Content-Type', 'application/json');
3
+ res.jsonResponse = (data) => {
4
+ res.send(JSON.stringify(data, null, 2));
5
+ };
6
+ next();
7
+ }
8
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/middleware/json.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,sBAAsB,CAAC,IAAa,EAAE,GAAa,EAAE,IAAkB;IACnF,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAClD,GAAG,CAAC,YAAY,GAAG,CAAC,IAAa,EAAE,EAAE;QACjC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC;IACF,IAAI,EAAE,CAAC;AACX,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { createLogger } from '@20syldev/logger.ts';
2
+ import { MAX_LOG_ENTRIES } from '../constants.js';
3
+ export const logger = createLogger({
4
+ maxEntries: MAX_LOG_ENTRIES,
5
+ console: true,
6
+ theme: 'colored',
7
+ });
8
+ export function loggerMiddleware(req, res, next) {
9
+ if (req.method === 'HEAD') {
10
+ next();
11
+ return;
12
+ }
13
+ if (req.originalUrl === '/logs') {
14
+ next();
15
+ return;
16
+ }
17
+ const startTime = Date.now();
18
+ const platform = req.headers['sec-ch-ua-platform']?.replace(/"/g, '');
19
+ res.on('finish', () => {
20
+ const status = res.statusCode === 304 ? 200 : res.statusCode;
21
+ const duration = `${Date.now() - startTime}ms`;
22
+ logger.log({ method: req.method, url: req.originalUrl, status, duration, platform });
23
+ });
24
+ next();
25
+ }
26
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/middleware/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,CAAC;IAC/B,UAAU,EAAE,eAAe;IAC3B,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,SAAS;CACnB,CAAC,CAAC;AAEH,MAAM,UAAU,gBAAgB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAC5E,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QACxB,IAAI,EAAE,CAAC;QACP,OAAO;IACX,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,KAAK,OAAO,EAAE,CAAC;QAC9B,IAAI,EAAE,CAAC;QACP,OAAO;IACX,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,QAAQ,GAAI,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAY,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAElF,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QAClB,MAAM,MAAM,GAAG,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;QAC7D,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,CAAC;QAE/C,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IACH,IAAI,EAAE,CAAC;AACX,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { env } from '../config/env.js';
2
+ import { ipLimits } from '../storage/index.js';
3
+ import { SESSION_TTL } from '../constants.js';
4
+ import { error } from '../utils/response.js';
5
+ let requests = 0;
6
+ let resetTime = Date.now() + SESSION_TTL;
7
+ export function rateLimitMiddleware(req, res, next) {
8
+ const ip = req.headers['cf-connecting-ip'] || req.socket.remoteAddress || '';
9
+ const token = req.headers.authorization?.split(' ')[1] || '';
10
+ const now = Date.now();
11
+ const minute = String(Math.floor(now / 60000) % 60);
12
+ const hour = String(Math.floor(now / 3600000) % 24);
13
+ if ((token && ![...env.BUSINESS_TOKEN_LIST, ...env.PRO_TOKEN_LIST, ...env.ADVANCED_TOKEN_LIST].includes(token)) ||
14
+ token === 'undefined') {
15
+ error(res, 401, 'Invalid token.');
16
+ return;
17
+ }
18
+ let requestLimit;
19
+ if (env.BUSINESS_TOKEN_LIST.includes(token) && !env.BUSINESS_TOKEN_LIST.includes('undefined')) {
20
+ requestLimit = env.BUSINESS_LIMIT;
21
+ }
22
+ else if (env.PRO_TOKEN_LIST.includes(token) && !env.PRO_TOKEN_LIST.includes('undefined')) {
23
+ requestLimit = env.PRO_LIMIT;
24
+ }
25
+ else if (env.ADVANCED_TOKEN_LIST.includes(token) && !env.ADVANCED_TOKEN_LIST.includes('undefined')) {
26
+ requestLimit = env.ADVANCED_LIMIT;
27
+ }
28
+ else {
29
+ requestLimit = env.DEFAULT_LIMIT;
30
+ }
31
+ if (now > resetTime) {
32
+ requests = 0;
33
+ resetTime = now + SESSION_TTL;
34
+ }
35
+ if (++requests > Math.max(env.GLOBAL_LIMIT, requestLimit)) {
36
+ error(res, 429, 'Global rate limit exceeded.');
37
+ return;
38
+ }
39
+ if (['__proto__', 'constructor', 'prototype'].includes(ip)) {
40
+ error(res, 400, 'Invalid IP address.');
41
+ return;
42
+ }
43
+ if (!ipLimits[ip])
44
+ ipLimits[ip] = {};
45
+ if (!ipLimits[ip][hour])
46
+ ipLimits[ip][hour] = {};
47
+ ipLimits[ip][hour][minute] = (ipLimits[ip][hour][minute] ?? 0) + 1;
48
+ if (ipLimits[ip][hour][minute] > requestLimit) {
49
+ error(res, 429, `You have exceeded the limit of ${requestLimit} requests per hour.`);
50
+ return;
51
+ }
52
+ Object.keys(ipLimits[ip]).forEach((h) => {
53
+ if (h != hour)
54
+ delete ipLimits[ip][h];
55
+ });
56
+ next();
57
+ }
58
+ //# sourceMappingURL=ratelimit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ratelimit.js","sourceRoot":"","sources":["../../src/middleware/ratelimit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { versions } from '../config/versions.js';
2
+ import { error } from '../utils/response.js';
3
+ export function versionCheckMiddleware(req, res, next) {
4
+ const version = req.params.version;
5
+ const latest = Object.keys(versions).pop();
6
+ req.version = version;
7
+ req.latest = latest;
8
+ if (!versions[version]) {
9
+ error(res, 404, `Invalid API version (${version}).`, latest);
10
+ return;
11
+ }
12
+ req.module = versions[version].modules;
13
+ if (!req.module) {
14
+ error(res, 404, `Module not found for version ${version}.`, latest);
15
+ return;
16
+ }
17
+ next();
18
+ }
19
+ export function endpointCheckMiddleware(req, res, next) {
20
+ const version = req.params.version;
21
+ const endpoint = req.params.endpoint;
22
+ req.version = version;
23
+ req.endpoint = endpoint;
24
+ if (!endpoint) {
25
+ error(res, 404, `Endpoint '${endpoint}' does not exist in ${req.version}.`);
26
+ return;
27
+ }
28
+ next();
29
+ }
30
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/middleware/version.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE7C,MAAM,UAAU,sBAAsB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IAClF,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAiB,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAG,CAAC;IAE5C,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;IACtB,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC;IAEpB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,wBAAwB,OAAO,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7D,OAAO;IACX,CAAC;IAED,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAE,CAAC,OAAO,CAAC;IAExC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACd,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,gCAAgC,OAAO,GAAG,EAAE,MAAM,CAAC,CAAC;QACpE,OAAO;IACX,CAAC;IAED,IAAI,EAAE,CAAC;AACX,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;IACnF,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAiB,CAAC;IAC7C,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAkB,CAAC;IAE/C,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC;IACtB,GAAG,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAExB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACZ,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,aAAa,QAAQ,uBAAuB,GAAG,CAAC,OAAO,GAAG,CAAC,CAAC;QAC5E,OAAO;IACX,CAAC;IACD,IAAI,EAAE,CAAC;AACX,CAAC"}