reddy-api-srm 1.0.1

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 (131) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +299 -0
  3. package/dist/src/auth/validatePassword.d.ts +3 -0
  4. package/dist/src/auth/validatePassword.d.ts.map +1 -0
  5. package/dist/src/auth/validatePassword.js +56 -0
  6. package/dist/src/auth/validatePassword.js.map +1 -0
  7. package/dist/src/auth/validateUser.d.ts +3 -0
  8. package/dist/src/auth/validateUser.d.ts.map +1 -0
  9. package/dist/src/auth/validateUser.js +42 -0
  10. package/dist/src/auth/validateUser.js.map +1 -0
  11. package/dist/src/fetch/fetchAttendance.d.ts +2 -0
  12. package/dist/src/fetch/fetchAttendance.d.ts.map +1 -0
  13. package/dist/src/fetch/fetchAttendance.js +42 -0
  14. package/dist/src/fetch/fetchAttendance.js.map +1 -0
  15. package/dist/src/fetch/fetchCalender.d.ts +2 -0
  16. package/dist/src/fetch/fetchCalender.d.ts.map +1 -0
  17. package/dist/src/fetch/fetchCalender.js +46 -0
  18. package/dist/src/fetch/fetchCalender.js.map +1 -0
  19. package/dist/src/fetch/fetchCourseDetails.d.ts +2 -0
  20. package/dist/src/fetch/fetchCourseDetails.d.ts.map +1 -0
  21. package/dist/src/fetch/fetchCourseDetails.js +49 -0
  22. package/dist/src/fetch/fetchCourseDetails.js.map +1 -0
  23. package/dist/src/fetch/fetchDayOrder.d.ts +2 -0
  24. package/dist/src/fetch/fetchDayOrder.d.ts.map +1 -0
  25. package/dist/src/fetch/fetchDayOrder.js +42 -0
  26. package/dist/src/fetch/fetchDayOrder.js.map +1 -0
  27. package/dist/src/fetch/fetchLogout.d.ts +5 -0
  28. package/dist/src/fetch/fetchLogout.d.ts.map +1 -0
  29. package/dist/src/fetch/fetchLogout.js +15 -0
  30. package/dist/src/fetch/fetchLogout.js.map +1 -0
  31. package/dist/src/fetch/fetchMarks.d.ts +2 -0
  32. package/dist/src/fetch/fetchMarks.d.ts.map +1 -0
  33. package/dist/src/fetch/fetchMarks.js +42 -0
  34. package/dist/src/fetch/fetchMarks.js.map +1 -0
  35. package/dist/src/fetch/fetchTimetable.d.ts +2 -0
  36. package/dist/src/fetch/fetchTimetable.d.ts.map +1 -0
  37. package/dist/src/fetch/fetchTimetable.js +49 -0
  38. package/dist/src/fetch/fetchTimetable.js.map +1 -0
  39. package/dist/src/fetch/fetchUserInfo.d.ts +2 -0
  40. package/dist/src/fetch/fetchUserInfo.d.ts.map +1 -0
  41. package/dist/src/fetch/fetchUserInfo.js +43 -0
  42. package/dist/src/fetch/fetchUserInfo.js.map +1 -0
  43. package/dist/src/index.d.ts +13 -0
  44. package/dist/src/index.d.ts.map +1 -0
  45. package/dist/src/index.js +112 -0
  46. package/dist/src/index.js.map +1 -0
  47. package/dist/src/parser/parseAttendance.d.ts +3 -0
  48. package/dist/src/parser/parseAttendance.d.ts.map +1 -0
  49. package/dist/src/parser/parseAttendance.js +85 -0
  50. package/dist/src/parser/parseAttendance.js.map +1 -0
  51. package/dist/src/parser/parseCalender.d.ts +3 -0
  52. package/dist/src/parser/parseCalender.d.ts.map +1 -0
  53. package/dist/src/parser/parseCalender.js +98 -0
  54. package/dist/src/parser/parseCalender.js.map +1 -0
  55. package/dist/src/parser/parseCourse.d.ts +3 -0
  56. package/dist/src/parser/parseCourse.d.ts.map +1 -0
  57. package/dist/src/parser/parseCourse.js +88 -0
  58. package/dist/src/parser/parseCourse.js.map +1 -0
  59. package/dist/src/parser/parseDayOrder.d.ts +3 -0
  60. package/dist/src/parser/parseDayOrder.d.ts.map +1 -0
  61. package/dist/src/parser/parseDayOrder.js +71 -0
  62. package/dist/src/parser/parseDayOrder.js.map +1 -0
  63. package/dist/src/parser/parseMarks.d.ts +3 -0
  64. package/dist/src/parser/parseMarks.d.ts.map +1 -0
  65. package/dist/src/parser/parseMarks.js +100 -0
  66. package/dist/src/parser/parseMarks.js.map +1 -0
  67. package/dist/src/parser/parseTimetable.d.ts +3 -0
  68. package/dist/src/parser/parseTimetable.d.ts.map +1 -0
  69. package/dist/src/parser/parseTimetable.js +123 -0
  70. package/dist/src/parser/parseTimetable.js.map +1 -0
  71. package/dist/src/parser/parseUserInfo.d.ts +3 -0
  72. package/dist/src/parser/parseUserInfo.d.ts.map +1 -0
  73. package/dist/src/parser/parseUserInfo.js +75 -0
  74. package/dist/src/parser/parseUserInfo.js.map +1 -0
  75. package/dist/src/type/attendance.d.ts +21 -0
  76. package/dist/src/type/attendance.d.ts.map +1 -0
  77. package/dist/src/type/attendance.js +3 -0
  78. package/dist/src/type/attendance.js.map +1 -0
  79. package/dist/src/type/auth.d.ts +48 -0
  80. package/dist/src/type/auth.d.ts.map +1 -0
  81. package/dist/src/type/auth.js +3 -0
  82. package/dist/src/type/auth.js.map +1 -0
  83. package/dist/src/type/calendar.d.ts +16 -0
  84. package/dist/src/type/calendar.d.ts.map +1 -0
  85. package/dist/src/type/calendar.js +3 -0
  86. package/dist/src/type/calendar.js.map +1 -0
  87. package/dist/src/type/common.d.ts +31 -0
  88. package/dist/src/type/common.d.ts.map +1 -0
  89. package/dist/src/type/common.js +3 -0
  90. package/dist/src/type/common.js.map +1 -0
  91. package/dist/src/type/course.d.ts +17 -0
  92. package/dist/src/type/course.d.ts.map +1 -0
  93. package/dist/src/type/course.js +3 -0
  94. package/dist/src/type/course.js.map +1 -0
  95. package/dist/src/type/dayOrder.d.ts +6 -0
  96. package/dist/src/type/dayOrder.d.ts.map +1 -0
  97. package/dist/src/type/dayOrder.js +3 -0
  98. package/dist/src/type/dayOrder.js.map +1 -0
  99. package/dist/src/type/index.d.ts +11 -0
  100. package/dist/src/type/index.d.ts.map +1 -0
  101. package/dist/src/type/index.js +27 -0
  102. package/dist/src/type/index.js.map +1 -0
  103. package/dist/src/type/marks.d.ts +20 -0
  104. package/dist/src/type/marks.d.ts.map +1 -0
  105. package/dist/src/type/marks.js +3 -0
  106. package/dist/src/type/marks.js.map +1 -0
  107. package/dist/src/type/timetable.d.ts +27 -0
  108. package/dist/src/type/timetable.d.ts.map +1 -0
  109. package/dist/src/type/timetable.js +3 -0
  110. package/dist/src/type/timetable.js.map +1 -0
  111. package/dist/src/type/types.d.ts +2 -0
  112. package/dist/src/type/types.d.ts.map +1 -0
  113. package/dist/src/type/types.js +20 -0
  114. package/dist/src/type/types.js.map +1 -0
  115. package/dist/src/type/user.d.ts +16 -0
  116. package/dist/src/type/user.d.ts.map +1 -0
  117. package/dist/src/type/user.js +3 -0
  118. package/dist/src/type/user.js.map +1 -0
  119. package/dist/utils/attendanceStatus.d.ts +6 -0
  120. package/dist/utils/attendanceStatus.d.ts.map +1 -0
  121. package/dist/utils/attendanceStatus.js +26 -0
  122. package/dist/utils/attendanceStatus.js.map +1 -0
  123. package/dist/utils/data.d.ts +18 -0
  124. package/dist/utils/data.d.ts.map +1 -0
  125. package/dist/utils/data.js +77 -0
  126. package/dist/utils/data.js.map +1 -0
  127. package/dist/utils/dynamicUrl.d.ts +3 -0
  128. package/dist/utils/dynamicUrl.d.ts.map +1 -0
  129. package/dist/utils/dynamicUrl.js +45 -0
  130. package/dist/utils/dynamicUrl.js.map +1 -0
  131. package/package.json +54 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 jackwaghan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,299 @@
1
+ # Reddy API SRM
2
+
3
+ A robust TypeScript/JavaScript client for interacting with the SRMIST KTR Academia portal. This package provides easy-to-use functions to fetch student data including timetables, attendance, marks, user information, and course details.
4
+
5
+ ## Features
6
+
7
+ - 🔐 **Authentication**: User verification and Password validation
8
+ - 📅 **Timetable**: Get timetable data
9
+ - 📊 **Attendance**: Get attendance data
10
+ - 📈 **Marks**: Get marks data
11
+ - 📚 **Course Details**: Get course information data
12
+ - 🗓️ **Calendar**: Get academic calendar data
13
+ - 👤 **User Info**: Get user information data
14
+ - 🛡️ **TypeScript Support**: Full TypeScript definitions included
15
+ - ⚡ **Modern ES Modules**: Built with modern JavaScript standards
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ npm install reddy-api-srm@latest
21
+ ```
22
+
23
+ ## Quick Start
24
+
25
+ ```typescript
26
+ import {
27
+ verifyUser,
28
+ verifyPassword,
29
+ getTimetable,
30
+ getAttendance,
31
+ getMarks,
32
+ getUserInfo,
33
+ getCalendar,
34
+ getCourse,
35
+ } from "reddy-api-srm";
36
+ ```
37
+
38
+ ## Authentication
39
+
40
+ ```typescript
41
+
42
+ // VerifyUser
43
+
44
+ const { data, error, errorReason} = await verifyUser("USERNAME");
45
+
46
+ // error will be true if there is any Internal Server Error
47
+ // errorReason will have reason if there is error
48
+ // data provide the response data
49
+
50
+ // Types
51
+
52
+ data?: {
53
+ lookup?: {
54
+ identifier: string ;
55
+ digest: string
56
+ };
57
+ }
58
+ status_code: number;
59
+ message: string;;
60
+ error?: string;
61
+ errorReason?: unknown;
62
+
63
+
64
+ // VerifyPassword
65
+
66
+ const {data , error , errorReason , isAuthenticated} = await verifyPassword({
67
+ digest: "DIGEST",
68
+ identifier: "IDENTIFIER",
69
+ password: "PASSWORD",
70
+ });
71
+
72
+ // error will be true if there is any Internal Server Error
73
+ // errorReason will have reason if there is error
74
+ // data provide the response data
75
+ // isAuthenticated will be true if user has been authenticated
76
+
77
+ // Types
78
+
79
+ data?: {
80
+ cookies?: string;
81
+ statusCode: number;
82
+ message?: string;
83
+ captcha?: {
84
+ required: boolean;
85
+ digest: string | null | undefined;
86
+ };
87
+ };
88
+ isAuthenticated?: boolean;
89
+ error?: string;
90
+ errorReason?: unknown;
91
+
92
+
93
+
94
+ // Logout
95
+
96
+ const {message , status } = await logoutUser("COOKIES");
97
+
98
+ // Types
99
+
100
+ message: string;
101
+ status: number;
102
+
103
+ ```
104
+
105
+ ## Timetable
106
+
107
+ ```typescript
108
+
109
+ const { timetable, status, error } = await getTimetable('COOKIES');
110
+
111
+ // error will be true if there is any Error with fetch or parsing or even if the cookies wrong
112
+ // timetable provide the response data
113
+ // status will give the response status { 200 : success , 404 : unauthorized , 500 : internal server Error}
114
+
115
+ // Types
116
+
117
+ timetable?: {
118
+ dayOrder: string;
119
+ class: {
120
+ slot: string;
121
+ isClass: boolean;
122
+ courseTitle?: string;
123
+ courseCode?: string;
124
+ courseType?: string;
125
+ courseCategory?: string;
126
+ courseRoomNo?: string;
127
+ time: string;
128
+ }[] ;
129
+ }[] ;
130
+ error?: string;
131
+ status: number;
132
+
133
+ ```
134
+
135
+ ## Attendance
136
+
137
+ ```typescript
138
+
139
+ const { attendance , status, error } = await getAttendance('COOKIES');
140
+
141
+ // error will be true if there is any Error with fetch or parsing or even if the cookies wrong
142
+ // attendance provide the response data
143
+ // status will give the response status { 200 : success , 404 : unauthorized , 500 : internal server Error}
144
+
145
+
146
+ // Types
147
+
148
+ attendance?: {
149
+ courseCode: string;
150
+ courseTitle: string;
151
+ courseCategory: string;
152
+ courseFaculty: string;
153
+ courseSlot: string;
154
+ courseConducted: number;
155
+ courseAbsent: number;
156
+ courseAttendance: string;
157
+ }[] ;
158
+ error?: string;
159
+ status: number;
160
+
161
+ ```
162
+
163
+ ## Marks
164
+
165
+ ```typescript
166
+
167
+ const { markList , status, error } = await getMarks('COOKIES');
168
+
169
+ // error will be true if there is any Error with fetch or parsing or even if the cookies wrong
170
+ // markList provide the response data
171
+ // status will give the response status { 200 : success , 404 : unauthorized , 500 : internal server Error}
172
+
173
+
174
+ // Types
175
+
176
+ markList?: {
177
+ course: string;
178
+ category: string;
179
+ marks: {
180
+ exam: string;
181
+ obtained: number;
182
+ maxMark: number;
183
+ }[] ;
184
+ total: { obtained: number; maxMark: number };
185
+ }[] ;
186
+ error?: string;
187
+ status: number;
188
+
189
+ ```
190
+
191
+ ## Course
192
+
193
+ ```typescript
194
+
195
+ const { courseList , status, error } = await getCourse('COOKIES');
196
+
197
+ // error will be true if there is any Error with fetch or parsing or even if the cookies wrong
198
+ // courseList provide the response data
199
+ // status will give the response status { 200 : success , 404 : unauthorized , 500 : internal server Error}
200
+
201
+
202
+ // Types
203
+
204
+ courseList?: {
205
+ courseCode: string;
206
+ courseTitle: string;
207
+ courseCredit: string;
208
+ courseCategory: string;
209
+ courseType: string;
210
+ courseFaculty: string;
211
+ courseSlot: string[];
212
+ courseRoomNo: string;
213
+ }[] ;
214
+ batch?: string;
215
+ error?: string;
216
+ status: number;
217
+
218
+ ```
219
+
220
+ ## Calendar
221
+
222
+ ```typescript
223
+
224
+ const { calendar , status, error } = await getCalendar('COOKIES');
225
+
226
+ // error will be true if there is any Error with fetch or parsing or even if the cookies wrong
227
+ // calendar provide the response data
228
+ // status will give the response status { 200 : success , 404 : unauthorized , 500 : internal server Error}
229
+
230
+
231
+ // Types
232
+
233
+ calendar?: {
234
+ month: string;
235
+ days: {
236
+ date: string;
237
+ day: string;
238
+ event: string;
239
+ dayOrder: string;
240
+ }[] ;
241
+ }[] ;
242
+ error?: string;
243
+ status: number;
244
+
245
+ ```
246
+
247
+ ## User Info
248
+
249
+ ```typescript
250
+
251
+ const { userInfo , status, error } = await getUserInfo('COOKIES');
252
+
253
+ // error will be true if there is any Error with fetch or parsing or even if the cookies wrong
254
+ // userInfo provide the response data
255
+ // status will give the response status { 200 : success , 404 : unauthorized , 500 : internal server Error}
256
+
257
+
258
+ // Types
259
+ userInfo?: {
260
+ regNumber: string;
261
+ name: string;
262
+ mobile: string;
263
+ section: string;
264
+ program: string;
265
+ department: string;
266
+ semester: string;
267
+ batch: string;
268
+ } ;
269
+ error?: string;
270
+ status: number;
271
+
272
+ ```
273
+
274
+ ## Day Order
275
+
276
+ ```typescript
277
+
278
+ const { dayOrder , status, error } = await getDayOrder('COOKIES');
279
+
280
+ // error will be true if there is any Error with fetch or parsing or even if the cookies wrong
281
+ // dayOrder provide the response data
282
+ // status will give the response status { 200 : success , 404 : unauthorized , 500 : internal server Error}
283
+
284
+ // Types
285
+
286
+ dayOrder?: string;
287
+ error?: string;
288
+ status: number;
289
+
290
+
291
+ ```
292
+
293
+ ## License
294
+
295
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
296
+
297
+ ## Disclaimer
298
+
299
+ This package is not officially affiliated with SRM Institute of Science and Technology. Use responsibly and in accordance with the institution's terms of service.
@@ -0,0 +1,3 @@
1
+ import { PasswordInput, AuthResult } from "../type/auth";
2
+ export declare function validatePassword({ identifier, digest, password, }: PasswordInput): Promise<AuthResult>;
3
+ //# sourceMappingURL=validatePassword.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validatePassword.d.ts","sourceRoot":"","sources":["../../../src/auth/validatePassword.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAoB,UAAU,EAAE,MAAM,cAAc,CAAC;AAE3E,wBAAsB,gBAAgB,CAAC,EACrC,UAAU,EACV,MAAM,EACN,QAAQ,GACT,EAAE,aAAa,GAAG,OAAO,CAAC,UAAU,CAAC,CA8DrC"}
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validatePassword = validatePassword;
4
+ async function validatePassword({ identifier, digest, password, }) {
5
+ try {
6
+ const res = await fetch(`https://academia.srmist.edu.in/accounts/p/40-10002227248/signin/v2/primary/${identifier}/password?digest=${digest}&cli_time=${Date.now()}&servicename=ZohoCreator&service_language=en&serviceurl=https%3A%2F%2Facademia.srmist.edu.in%2Fportal%2Facademia-academic-services%2FredirectFromLogin`, {
7
+ headers: {
8
+ accept: "*/*",
9
+ "accept-language": "en-US,en;q=0.9",
10
+ "content-type": "application/x-www-form-urlencoded;charset=UTF-8",
11
+ "sec-fetch-dest": "empty",
12
+ "sec-fetch-mode": "cors",
13
+ "sec-fetch-site": "same-origin",
14
+ "x-zcsrf-token": "iamcsrcoo=fae2d8fa-e5a1-4cb0-a5ee-cc40af87e89f",
15
+ cookie: "zalb_74c3a1eecc=4cad43ac9848cc7edd20d2313fcde774; zccpn=a6fa7bc8-11c7-44ad-8be8-0aa6b04fad8a; JSESSIONID=3BD0053672AF3D628D983A15AA469D07; cli_rgn=IN; _ga=GA1.3.2061081340.1748689001; _gid=GA1.3.1677956689.1748689001; _ga_HQWPLLNMKY=GS2.3.s1748689001$o1$g0$t1748689001$j60$l0$h0; zalb_f0e8db9d3d=7ad3232c36fdd9cc324fb86c2c0a58ad; iamcsr=fae2d8fa-e5a1-4cb0-a5ee-cc40af87e89f; _zcsr_tmp=fae2d8fa-e5a1-4cb0-a5ee-cc40af87e89f; stk=d6559e9a58e77dbea9e24adf3bb57941",
16
+ Referer: "https://academia.srmist.edu.in/accounts/p/10002227248/signin?hide_fp=true&servicename=ZohoCreator&service_language=en&css_url=/49910842/academia-academic-services/downloadPortalCustomCss/login&dcc=true&serviceurl=https%3A%2F%2Facademia.srmist.edu.in%2Fportal%2Facademia-academic-services%2FredirectFromLogin",
17
+ "Referrer-Policy": "strict-origin-when-cross-origin",
18
+ },
19
+ body: `{"passwordauth":{"password":"${password}"}}`,
20
+ method: "POST",
21
+ });
22
+ const response = (await res.json());
23
+ if (response.status_code === 201) {
24
+ // Use filterCookies to process set-cookie header
25
+ const setCookieHeader = res.headers.get("set-cookie");
26
+ if (!setCookieHeader)
27
+ throw new Error("Couldn't able to get cookie from response header ");
28
+ const matches = [
29
+ ...setCookieHeader.matchAll(/(_(?:iamadt|iambdt)_client_\d+|_z_identity)=[^;]+/g),
30
+ ];
31
+ const extractedCookies = matches.map((m) => m[0]).join("; ") + ";";
32
+ const data = {
33
+ cookies: extractedCookies,
34
+ statusCode: 201,
35
+ };
36
+ return { data, isAuthenticated: true };
37
+ }
38
+ const captchaRequired = response.localized_message
39
+ ?.toLowerCase()
40
+ ?.includes("captcha")
41
+ ? true
42
+ : false;
43
+ const data = {
44
+ statusCode: response.status_code,
45
+ message: response.localized_message,
46
+ captcha: captchaRequired
47
+ ? { required: true, digest: response.cdigest }
48
+ : { required: false, digest: null },
49
+ };
50
+ return { data, isAuthenticated: false };
51
+ }
52
+ catch (e) {
53
+ return { error: "Internal Server Error", errorReason: e };
54
+ }
55
+ }
56
+ //# sourceMappingURL=validatePassword.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validatePassword.js","sourceRoot":"","sources":["../../../src/auth/validatePassword.ts"],"names":[],"mappings":";;AAEA,4CAkEC;AAlEM,KAAK,UAAU,gBAAgB,CAAC,EACrC,UAAU,EACV,MAAM,EACN,QAAQ,GACM;IACd,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,8EAA8E,UAAU,oBAAoB,MAAM,aAAa,IAAI,CAAC,GAAG,EAAE,wJAAwJ,EACjS;YACE,OAAO,EAAE;gBACP,MAAM,EAAE,KAAK;gBACb,iBAAiB,EAAE,gBAAgB;gBACnC,cAAc,EAAE,iDAAiD;gBACjE,gBAAgB,EAAE,OAAO;gBACzB,gBAAgB,EAAE,MAAM;gBACxB,gBAAgB,EAAE,aAAa;gBAC/B,eAAe,EAAE,gDAAgD;gBACjE,MAAM,EACJ,6cAA6c;gBAC/c,OAAO,EACL,qTAAqT;gBACvT,iBAAiB,EAAE,iCAAiC;aACrD;YACD,IAAI,EAAE,gCAAgC,QAAQ,KAAK;YACnD,MAAM,EAAE,MAAM;SACf,CACF,CAAC;QAEF,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAqB,CAAC;QAExD,IAAI,QAAQ,CAAC,WAAW,KAAK,GAAG,EAAE,CAAC;YACjC,iDAAiD;YACjD,MAAM,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YACtD,IAAI,CAAC,eAAe;gBAClB,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;YACvE,MAAM,OAAO,GAAG;gBACd,GAAG,eAAe,CAAC,QAAQ,CACzB,oDAAoD,CACrD;aACF,CAAC;YACF,MAAM,gBAAgB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;YACnE,MAAM,IAAI,GAAG;gBACX,OAAO,EAAE,gBAAgB;gBACzB,UAAU,EAAE,GAAG;aAChB,CAAC;YACF,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;QACzC,CAAC;QAED,MAAM,eAAe,GAAG,QAAQ,CAAC,iBAAiB;YAChD,EAAE,WAAW,EAAE;YACf,EAAE,QAAQ,CAAC,SAAS,CAAC;YACrB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,KAAK,CAAC;QAEV,MAAM,IAAI,GAAG;YACX,UAAU,EAAE,QAAQ,CAAC,WAAW;YAChC,OAAO,EAAE,QAAQ,CAAC,iBAAiB;YACnC,OAAO,EAAE,eAAe;gBACtB,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,EAAE;gBAC9C,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;SACtC,CAAC;QAEF,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;IAC1C,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,KAAK,EAAE,uBAAuB,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAC5D,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { UserValidationResult } from "../type/auth";
2
+ export declare function validateUser(username: string): Promise<UserValidationResult>;
3
+ //# sourceMappingURL=validateUser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateUser.d.ts","sourceRoot":"","sources":["../../../src/auth/validateUser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAA6B,MAAM,cAAc,CAAC;AAE/E,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,oBAAoB,CAAC,CA4C/B"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateUser = validateUser;
4
+ async function validateUser(username) {
5
+ try {
6
+ const res = await fetch(`https://academia.srmist.edu.in/accounts/p/40-10002227248/signin/v2/lookup/${username}`, {
7
+ headers: {
8
+ accept: "*/*",
9
+ "accept-language": "en-US,en;q=0.9",
10
+ "content-type": "application/x-www-form-urlencoded;charset=UTF-8",
11
+ "sec-ch-ua": '"Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"',
12
+ "sec-ch-ua-mobile": "?1",
13
+ "sec-ch-ua-platform": '"Android"',
14
+ "sec-fetch-dest": "empty",
15
+ "sec-fetch-mode": "cors",
16
+ "sec-fetch-site": "same-origin",
17
+ "x-zcsrf-token": "iamcsrcoo=3dea6395-0540-44ea-8de7-544256dd7549",
18
+ cookie: "zalb_74c3a1eecc=50830239914cba1225506e915a665a91; zccpn=68703e7d-ccf0-42ba-92b2-9c87c7a0c8ae; JSESSIONID=739937C3826C1F58C37186170B4F4B36; cli_rgn=IN; _ga=GA1.3.1846200817.1748679237; _gid=GA1.3.734795940.1748679237; _gat=1; _ga_HQWPLLNMKY=GS2.3.s1748679237$o1$g0$t1748679237$j60$l0$h0; zalb_f0e8db9d3d=983d6a65b2f29022f18db52385bfc639; iamcsr=3dea6395-0540-44ea-8de7-544256dd7549; _zcsr_tmp=3dea6395-0540-44ea-8de7-544256dd7549; stk=4ec13d42454007681bd4337cf126baec",
19
+ Referer: "https://academia.srmist.edu.in/accounts/p/10002227248/signin?hide_fp=true&servicename=ZohoCreator&service_language=en&css_url=/49910842/academia-academic-services/downloadPortalCustomCss/login&dcc=true&serviceurl=https%3A%2F%2Facademia.srmist.edu.in%2Fportal%2Facademia-academic-services%2FredirectFromLogin",
20
+ "Referrer-Policy": "strict-origin-when-cross-origin",
21
+ },
22
+ body: `mode=primary&cli_time=${Date.now()}&servicename=ZohoCreator&service_language=en&serviceurl=https%3A%2F%2Facademia.srmist.edu.in%2Fportal%2Facademia-academic-services%2FredirectFromLogin`,
23
+ method: "POST",
24
+ });
25
+ const response = (await res.json());
26
+ const data = {
27
+ identifier: response.lookup?.identifier,
28
+ digest: response.lookup?.digest,
29
+ status_code: response.status_code,
30
+ message: response.message,
31
+ };
32
+ return { data };
33
+ }
34
+ catch (e) {
35
+ console.error(e);
36
+ return {
37
+ error: "Internal Server Error",
38
+ errorReason: e,
39
+ };
40
+ }
41
+ }
42
+ //# sourceMappingURL=validateUser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateUser.js","sourceRoot":"","sources":["../../../src/auth/validateUser.ts"],"names":[],"mappings":";;AAEA,oCA8CC;AA9CM,KAAK,UAAU,YAAY,CAChC,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,6EAA6E,QAAQ,EAAE,EACvF;YACE,OAAO,EAAE;gBACP,MAAM,EAAE,KAAK;gBACb,iBAAiB,EAAE,gBAAgB;gBACnC,cAAc,EAAE,iDAAiD;gBACjE,WAAW,EACT,mEAAmE;gBACrE,kBAAkB,EAAE,IAAI;gBACxB,oBAAoB,EAAE,WAAW;gBACjC,gBAAgB,EAAE,OAAO;gBACzB,gBAAgB,EAAE,MAAM;gBACxB,gBAAgB,EAAE,aAAa;gBAC/B,eAAe,EAAE,gDAAgD;gBACjE,MAAM,EACJ,odAAod;gBACtd,OAAO,EACL,qTAAqT;gBACvT,iBAAiB,EAAE,iCAAiC;aACrD;YACD,IAAI,EAAE,yBAAyB,IAAI,CAAC,GAAG,EAAE,wJAAwJ;YACjM,MAAM,EAAE,MAAM;SACf,CACF,CAAC;QACF,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAgB,CAAC;QAEnD,MAAM,IAAI,GAAiB;YACzB,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU;YACvC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM;YAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B,CAAC;QAEF,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACjB,OAAO;YACL,KAAK,EAAE,uBAAuB;YAC9B,WAAW,EAAE,CAAC;SACf,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function fetchAttendance(cookie: string): Promise<any>;
2
+ //# sourceMappingURL=fetchAttendance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchAttendance.d.ts","sourceRoot":"","sources":["../../../src/fetch/fetchAttendance.ts"],"names":[],"mappings":"AAEA,wBAAsB,eAAe,CAAC,MAAM,EAAE,MAAM,gBAwCnD"}
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fetchAttendance = fetchAttendance;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ async function fetchAttendance(cookie) {
9
+ try {
10
+ const request = await (0, axios_1.default)("https://academia.srmist.edu.in/srm_university/academia-academic-services/page/My_Attendance", {
11
+ headers: {
12
+ accept: "*/*",
13
+ "accept-language": "en-US,en;q=0.9",
14
+ "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
15
+ "sec-fetch-dest": "empty",
16
+ "sec-fetch-mode": "cors",
17
+ "sec-fetch-site": "same-origin",
18
+ "x-requested-with": "XMLHttpRequest",
19
+ cookie,
20
+ Referer: "https://academia.srmist.edu.in/",
21
+ "Referrer-Policy": "strict-origin-when-cross-origin",
22
+ },
23
+ method: "GET",
24
+ });
25
+ return request.data;
26
+ }
27
+ catch (error) {
28
+ if (error &&
29
+ typeof error === "object" &&
30
+ "status" in error &&
31
+ error.status === 500) {
32
+ return { error: "Unauthorized", status: 401 };
33
+ }
34
+ return {
35
+ error: error instanceof Error ? error.message : "Failed to fetch attendance",
36
+ status: error && typeof error === "object" && "status" in error
37
+ ? error.status
38
+ : 500,
39
+ };
40
+ }
41
+ }
42
+ //# sourceMappingURL=fetchAttendance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchAttendance.js","sourceRoot":"","sources":["../../../src/fetch/fetchAttendance.ts"],"names":[],"mappings":";;;;;AAEA,0CAwCC;AA1CD,kDAA0B;AAEnB,KAAK,UAAU,eAAe,CAAC,MAAc;IAClD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,eAAK,EACzB,6FAA6F,EAC7F;YACE,OAAO,EAAE;gBACP,MAAM,EAAE,KAAK;gBACb,iBAAiB,EAAE,gBAAgB;gBACnC,cAAc,EAAE,kDAAkD;gBAClE,gBAAgB,EAAE,OAAO;gBACzB,gBAAgB,EAAE,MAAM;gBACxB,gBAAgB,EAAE,aAAa;gBAC/B,kBAAkB,EAAE,gBAAgB;gBACpC,MAAM;gBACN,OAAO,EAAE,iCAAiC;gBAC1C,iBAAiB,EAAE,iCAAiC;aACrD;YACD,MAAM,EAAE,KAAK;SACd,CACF,CAAC;QACF,OAAO,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK;YACL,OAAO,KAAK,KAAK,QAAQ;YACzB,QAAQ,IAAI,KAAK;YACjB,KAAK,CAAC,MAAM,KAAK,GAAG,EACpB,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAChD,CAAC;QAED,OAAO;YACL,KAAK,EACH,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,4BAA4B;YACvE,MAAM,EACJ,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK;gBACrD,CAAC,CAAC,KAAK,CAAC,MAAM;gBACd,CAAC,CAAC,GAAG;SACV,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function fetchCalendar(cookie: string): Promise<any>;
2
+ //# sourceMappingURL=fetchCalender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchCalender.d.ts","sourceRoot":"","sources":["../../../src/fetch/fetchCalender.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,gBAyCjD"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fetchCalendar = fetchCalendar;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const dynamicUrl_1 = require("../../utils/dynamicUrl");
9
+ async function fetchCalendar(cookie) {
10
+ const url = await (0, dynamicUrl_1.calendarDynamicUrl)();
11
+ try {
12
+ const response = await (0, axios_1.default)(url, {
13
+ headers: {
14
+ accept: "*/*",
15
+ "accept-language": "en-US,en;q=0.9",
16
+ "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
17
+ "sec-ch-ua": '"Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"',
18
+ "sec-ch-ua-mobile": "?1",
19
+ "sec-ch-ua-platform": '"Android"',
20
+ "sec-fetch-dest": "empty",
21
+ "sec-fetch-mode": "cors",
22
+ "sec-fetch-site": "same-origin",
23
+ "x-requested-with": "XMLHttpRequest",
24
+ cookie,
25
+ Referer: "https://academia.srmist.edu.in/",
26
+ "Referrer-Policy": "strict-origin-when-cross-origin",
27
+ },
28
+ });
29
+ return response.data;
30
+ }
31
+ catch (error) {
32
+ if (error &&
33
+ typeof error === "object" &&
34
+ "status" in error &&
35
+ error.status === 500) {
36
+ return { error: "Unauthorized", status: 401 };
37
+ }
38
+ return {
39
+ error: error instanceof Error ? error.message : "Failed to fetch calendar",
40
+ status: error && typeof error === "object" && "status" in error
41
+ ? error.status
42
+ : 500,
43
+ };
44
+ }
45
+ }
46
+ //# sourceMappingURL=fetchCalender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchCalender.js","sourceRoot":"","sources":["../../../src/fetch/fetchCalender.ts"],"names":[],"mappings":";;;;;AAGA,sCAyCC;AA5CD,kDAA0B;AAC1B,uDAA4D;AAErD,KAAK,UAAU,aAAa,CAAC,MAAc;IAChD,MAAM,GAAG,GAAG,MAAM,IAAA,+BAAkB,GAAE,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,IAAA,eAAK,EAAC,GAAG,EAAE;YAChC,OAAO,EAAE;gBACP,MAAM,EAAE,KAAK;gBACb,iBAAiB,EAAE,gBAAgB;gBACnC,cAAc,EAAE,kDAAkD;gBAClE,WAAW,EACT,mEAAmE;gBACrE,kBAAkB,EAAE,IAAI;gBACxB,oBAAoB,EAAE,WAAW;gBACjC,gBAAgB,EAAE,OAAO;gBACzB,gBAAgB,EAAE,MAAM;gBACxB,gBAAgB,EAAE,aAAa;gBAC/B,kBAAkB,EAAE,gBAAgB;gBACpC,MAAM;gBACN,OAAO,EAAE,iCAAiC;gBAC1C,iBAAiB,EAAE,iCAAiC;aACrD;SACF,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK;YACL,OAAO,KAAK,KAAK,QAAQ;YACzB,QAAQ,IAAI,KAAK;YACjB,KAAK,CAAC,MAAM,KAAK,GAAG,EACpB,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAChD,CAAC;QAED,OAAO;YACL,KAAK,EACH,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,0BAA0B;YACrE,MAAM,EACJ,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK;gBACrD,CAAC,CAAC,KAAK,CAAC,MAAM;gBACd,CAAC,CAAC,GAAG;SACV,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function fetchCourseDetails(cookie: string): Promise<any>;
2
+ //# sourceMappingURL=fetchCourseDetails.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchCourseDetails.d.ts","sourceRoot":"","sources":["../../../src/fetch/fetchCourseDetails.ts"],"names":[],"mappings":"AAGA,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,gBA4CtD"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fetchCourseDetails = fetchCourseDetails;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const dynamicUrl_1 = require("../../utils/dynamicUrl");
9
+ async function fetchCourseDetails(cookie) {
10
+ const url = await (0, dynamicUrl_1.courseDynamicUrl)();
11
+ try {
12
+ const request = await (0, axios_1.default)(url, {
13
+ headers: {
14
+ accept: "*/*",
15
+ "accept-language": "en-US,en;q=0.9",
16
+ "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
17
+ "sec-ch-ua": '"Chromium";v="136", "Google Chrome";v="136", "Not.A/Brand";v="99"',
18
+ "sec-ch-ua-mobile": "?1",
19
+ "sec-ch-ua-platform": '"Android"',
20
+ "sec-fetch-dest": "empty",
21
+ "sec-fetch-mode": "cors",
22
+ "sec-fetch-site": "same-origin",
23
+ "x-requested-with": "XMLHttpRequest",
24
+ cookie,
25
+ Referer: "https://academia.srmist.edu.in/",
26
+ "Referrer-Policy": "strict-origin-when-cross-origin",
27
+ },
28
+ method: "GET",
29
+ });
30
+ return request.data;
31
+ }
32
+ catch (error) {
33
+ if (error &&
34
+ typeof error === "object" &&
35
+ "status" in error &&
36
+ error.status === 500) {
37
+ return { error: "Unauthorized", status: 401 };
38
+ }
39
+ return {
40
+ error: error instanceof Error
41
+ ? error.message
42
+ : "Failed to fetch course details",
43
+ status: error && typeof error === "object" && "status" in error
44
+ ? error.status
45
+ : 500,
46
+ };
47
+ }
48
+ }
49
+ //# sourceMappingURL=fetchCourseDetails.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchCourseDetails.js","sourceRoot":"","sources":["../../../src/fetch/fetchCourseDetails.ts"],"names":[],"mappings":";;;;;AAGA,gDA4CC;AA/CD,kDAA0B;AAC1B,uDAA0D;AAEnD,KAAK,UAAU,kBAAkB,CAAC,MAAc;IACrD,MAAM,GAAG,GAAG,MAAM,IAAA,6BAAgB,GAAE,CAAC;IACrC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,eAAK,EAAC,GAAG,EAAE;YAC/B,OAAO,EAAE;gBACP,MAAM,EAAE,KAAK;gBACb,iBAAiB,EAAE,gBAAgB;gBACnC,cAAc,EAAE,kDAAkD;gBAClE,WAAW,EACT,mEAAmE;gBACrE,kBAAkB,EAAE,IAAI;gBACxB,oBAAoB,EAAE,WAAW;gBACjC,gBAAgB,EAAE,OAAO;gBACzB,gBAAgB,EAAE,MAAM;gBACxB,gBAAgB,EAAE,aAAa;gBAC/B,kBAAkB,EAAE,gBAAgB;gBACpC,MAAM;gBACN,OAAO,EAAE,iCAAiC;gBAC1C,iBAAiB,EAAE,iCAAiC;aACrD;YACD,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QACH,OAAO,OAAO,CAAC,IAAI,CAAC;IACtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK;YACL,OAAO,KAAK,KAAK,QAAQ;YACzB,QAAQ,IAAI,KAAK;YACjB,KAAK,CAAC,MAAM,KAAK,GAAG,EACpB,CAAC;YACD,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QAChD,CAAC;QAED,OAAO;YACL,KAAK,EACH,KAAK,YAAY,KAAK;gBACpB,CAAC,CAAC,KAAK,CAAC,OAAO;gBACf,CAAC,CAAC,gCAAgC;YACtC,MAAM,EACJ,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK;gBACrD,CAAC,CAAC,KAAK,CAAC,MAAM;gBACd,CAAC,CAAC,GAAG;SACV,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function fetchDayOrder(cookie: string): Promise<any>;
2
+ //# sourceMappingURL=fetchDayOrder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchDayOrder.d.ts","sourceRoot":"","sources":["../../../src/fetch/fetchDayOrder.ts"],"names":[],"mappings":"AAEA,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,gBAwCjD"}