sidechat.js 2.4.1 → 2.4.4

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 (50) hide show
  1. package/dist/classes/SidechatAPIClient.d.ts +37 -0
  2. package/dist/classes/SidechatAPIClient.d.ts.map +1 -1
  3. package/dist/index.cjs +301 -1
  4. package/dist/index.d.mts +2 -1
  5. package/dist/index.d.ts +2 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.mjs +301 -2
  8. package/dist/types/SidechatTypes.d.ts +74 -0
  9. package/dist/types/SidechatTypes.d.ts.map +1 -1
  10. package/docs/sidechat.js/2.4.4/SidechatAPIClient.html +3 -0
  11. package/docs/sidechat.js/2.4.4/SidechatAPIError.html +3 -0
  12. package/docs/sidechat.js/2.4.4/SidechatColorList.html +3 -0
  13. package/docs/sidechat.js/2.4.4/classes_SidechatAPIClient.js.html +1100 -0
  14. package/docs/sidechat.js/2.4.4/classes_SidechatAPIError.js.html +16 -0
  15. package/docs/sidechat.js/2.4.4/classes_SidechatColorList.js.html +79 -0
  16. package/docs/sidechat.js/2.4.4/data/search.json +1 -0
  17. package/docs/sidechat.js/2.4.4/fonts/Inconsolata-Regular.ttf +0 -0
  18. package/docs/sidechat.js/2.4.4/fonts/OpenSans-Regular.ttf +0 -0
  19. package/docs/sidechat.js/2.4.4/fonts/WorkSans-Bold.ttf +0 -0
  20. package/docs/sidechat.js/2.4.4/global.html +3 -0
  21. package/docs/sidechat.js/2.4.4/index.html +4 -0
  22. package/docs/sidechat.js/2.4.4/scripts/core.js +726 -0
  23. package/docs/sidechat.js/2.4.4/scripts/core.min.js +23 -0
  24. package/docs/sidechat.js/2.4.4/scripts/resize.js +90 -0
  25. package/docs/sidechat.js/2.4.4/scripts/search.js +265 -0
  26. package/docs/sidechat.js/2.4.4/scripts/search.min.js +6 -0
  27. package/docs/sidechat.js/2.4.4/scripts/third-party/Apache-License-2.0.txt +202 -0
  28. package/docs/sidechat.js/2.4.4/scripts/third-party/fuse.js +9 -0
  29. package/docs/sidechat.js/2.4.4/scripts/third-party/hljs-line-num-original.js +369 -0
  30. package/docs/sidechat.js/2.4.4/scripts/third-party/hljs-line-num.js +1 -0
  31. package/docs/sidechat.js/2.4.4/scripts/third-party/hljs-original.js +5171 -0
  32. package/docs/sidechat.js/2.4.4/scripts/third-party/hljs.js +1 -0
  33. package/docs/sidechat.js/2.4.4/scripts/third-party/popper.js +5 -0
  34. package/docs/sidechat.js/2.4.4/scripts/third-party/tippy.js +1 -0
  35. package/docs/sidechat.js/2.4.4/scripts/third-party/tocbot.js +672 -0
  36. package/docs/sidechat.js/2.4.4/scripts/third-party/tocbot.min.js +1 -0
  37. package/docs/sidechat.js/2.4.4/styles/clean-jsdoc-theme-base.css +1161 -0
  38. package/docs/sidechat.js/2.4.4/styles/clean-jsdoc-theme-dark.css +412 -0
  39. package/docs/sidechat.js/2.4.4/styles/clean-jsdoc-theme-light.css +482 -0
  40. package/docs/sidechat.js/2.4.4/styles/clean-jsdoc-theme-scrollbar.css +30 -0
  41. package/docs/sidechat.js/2.4.4/styles/clean-jsdoc-theme-without-scrollbar.min.css +1 -0
  42. package/docs/sidechat.js/2.4.4/styles/clean-jsdoc-theme.min.css +1 -0
  43. package/docs/sidechat.js/2.4.4/tutorial-Authentication.html +14 -0
  44. package/docs/sidechat.js/2.4.4/tutorial-Email Registration.html +6 -0
  45. package/docs/sidechat.js/2.4.4/types_SidechatTypes.js.html +160 -0
  46. package/package.json +1 -1
  47. package/src/classes/SidechatAPIClient.js +142 -1
  48. package/src/index.js +7 -2
  49. package/src/tests/directMessageTest.js +23 -0
  50. package/src/types/SidechatTypes.js +26 -0
package/dist/index.mjs CHANGED
@@ -1,3 +1,161 @@
1
+ /**
2
+ * A user-created post or comment, depending on the "type" prop
3
+ * @typedef {Object} SidechatPostOrComment
4
+ * @prop {"post"|"comment"} type - whether this object represents a post or a comment on a post
5
+ * @prop {String} id - alphanumeric ID of post or comment
6
+ * @prop {Boolean} authored_by_user - undocumented
7
+ * @prop {String} alias - post creator's name in-app
8
+ * @prop {String} group_id - alphanumeric ID of group
9
+ * @prop {SidechatGroup} group - group in which post or comment was created
10
+ * @prop {String} text - text content of post or comment
11
+ * @prop {String} created_at - date string of post or comment creation time
12
+ * @prop {Number} vote_total - sum of upvotes and downvotes
13
+ * @prop {SidechatVoteString} vote_status - current user's vote on post or comment
14
+ * @prop {SidechatSimpleAsset[]} assets - array of simple assets attached to post or comment
15
+ * @prop {Array} attachments - undocumented
16
+ * @prop {Boolean} dms_disabled - whether or not you can send a DM to creator of post
17
+ * @prop {Array} tags - undocumented
18
+ * @prop {SidechatIdentity} identity - creator's identity information
19
+ * @prop {Boolean} pinned - undocumented
20
+ * @prop {Boolean} is_saved - undocumented
21
+ * @prop {"following"|"not_following"} follow_status - undocumented
22
+ * @prop {"group"} [destination] - undocumented
23
+ * @prop {Number} [comment_count] - number of comments on post (only if type=post)
24
+ * @prop {Boolean} [comments_disabled] - whether or not you can comment on post (only if type=post)
25
+ * @prop {String} [parent_post_id] - alphanumeric ID of parent post (only if type=comment)
26
+ * @prop {String} [reply_post_id] - alphanumeric ID of comment being replied to, falls back to parent_post_id (only if type=comment)
27
+ * @prop {String} [context] - text content of comment being replied to, falls back to text (only if type=comment)
28
+ */
29
+
30
+ /**
31
+ * A group object, containing metadata about a group as well as its join conditions and states. Some properties vary based on the endpoint the object came from.
32
+ * @typedef {Object} SidechatGroup
33
+ * @prop {String} id - alphanumeric ID of group
34
+ * @prop {String} name - human-readable name of group
35
+ * @prop {String} analytics_name - name to file group under
36
+ * @prop {"non_member"|"member"} membership_type - whether or not current user is a member of group
37
+ * @prop {String} color - group's theme color as hex code (e.g., #FFFFFF)
38
+ * @prop {"open"|"closed"|"email_domain"} group_join_type - basis on which group accepts new members
39
+ * @prop {"private"|"public_to_all"|"public_to_schools"} group_visibility - group's visibility setting
40
+ * @prop {"show"|"hide"} asset_library_visibility - whether or not group's asset library is visible
41
+ * @prop {Array} [roles] - undocumented
42
+ * @prop {String} [description] - description of group
43
+ * @prop {SidechatPrivateAssetURL} [icon_url] - image URL for group icon
44
+ * @prop {Number} [member_count] - number of users in group
45
+ * @prop {Boolean} [should_show_leaderboard] - undocumented
46
+ */
47
+
48
+ /**
49
+ * An asset object, containing information about an image within a post or comment
50
+ * @typedef {Object} SidechatSimpleAsset
51
+ * @prop {String} id - alphanumeric ID of asset
52
+ * @prop {"image"} type - undocumented
53
+ * @prop {"jpeg"|"png"|"gif"} content_type - file type of asset
54
+ * @prop {Number} width - width of asset
55
+ * @prop {Number} height - height of asset
56
+ * @prop {SidechatPrivateAssetURL} [url] - URL string of asset's location
57
+ */
58
+
59
+ /**
60
+ * An asset object, containing information about an image from the asset library
61
+ * @typedef {Object} SidechatLibraryAsset
62
+ * @prop {String} id - alphanumeric ID of asset
63
+ * @prop {String} created_at - date string of asset creation time
64
+ * @prop {SidechatAssetMetadata} metadata - metadata associated with asset
65
+ * @prop {SidechatPrivateAssetURL} url - URL string of asset's location
66
+ */
67
+
68
+ /**
69
+ * An asset object, containing information about an image from the asset library
70
+ * @typedef {Object} SidechatAssetMetadata
71
+ * @prop {Number} width - width of asset
72
+ * @prop {Number} height - height of asset
73
+ * @prop {"image"} type - undocumented
74
+ * @prop {"jpeg"|"png"|"gif"} content_type - file type of asset
75
+ */
76
+
77
+ /**
78
+ * A user's anonymous identity information
79
+ * @typedef {Object} SidechatIdentity
80
+ * @prop {String} name - representation of user's name (varies across app)
81
+ * @prop {Boolean} posted_with_username - undocumented
82
+ */
83
+
84
+ /**
85
+ * The current user's information
86
+ * @typedef {Object} SidechatCurrentUser
87
+ * @prop {String} id - alphanumeric ID of current user
88
+ * @prop {String} hashedVerifiedEmail - verified email of current user in an unreadable hashed form
89
+ * @prop {Boolean} isGlobalModerator - whether or not user is a moderator
90
+ * @prop {Boolean} isGlobalAdmin - whether or not user is an admin
91
+ * @prop {SidechatMembership[]} memberships
92
+ * @prop {Array} roles - undocumented
93
+ * @prop {String} emailDomain - domain of verified email address on account
94
+ * @prop {String} wildcardEmailDomain - domain of verified email address on account, preceeded by *. to support subdomains
95
+ */
96
+
97
+ /**
98
+ * Representation of a group membership
99
+ * @typedef {Object} SidechatMembership
100
+ * @prop {String} groupId - alphanumeric ID of group
101
+ * @prop {String} type - role of current user in group
102
+ */
103
+
104
+ /**
105
+ * An asset URL that can only be accessed by making a request with a user's bearer token attached in the Authorization header
106
+ * @typedef {String} SidechatPrivateAssetURL
107
+ */
108
+
109
+ /**
110
+ * A cursor for paginating through post lists
111
+ * @typedef {String} SidechatCursorString
112
+ */
113
+
114
+ /**
115
+ * A vote on a comment or post
116
+ * @typedef {"upvote"|"downvote"|"none"} SidechatVoteString
117
+ */
118
+
119
+ /**
120
+ * A user's bearer authentication token needed for most requests
121
+ * @typedef {String} SidechatAuthToken
122
+ */
123
+
124
+ /**
125
+ * A list of posts and the associated cursor
126
+ * @typedef {Object} SidechatPostsAndCursor
127
+ * @prop {SidechatPostOrComment[]} posts
128
+ * @prop {SidechatCursorString} cursor
129
+ */
130
+
131
+ var SidechatTypes = {};
132
+
133
+ /**
134
+ * A direct message thread
135
+ * @typedef {Object} SidechatDirectThread
136
+ * @prop {String} id - alphanumeric ID of thread
137
+ * @prop {String} group_id - alphanumeric ID of group in which the thread exists
138
+ * @prop {String} updated_at - date string of when the last message in the chat was sent
139
+ * @prop {String} post_id - post or comment from which the thread was originally sent
140
+ * @prop {String} post_context - the context of the DM thread (only "feed" is known at the moment)
141
+ * @prop {"accepted"} accept_status - whether or not the other user has accepted this DM
142
+ * @prop {"post"|"comment"} type - the type of the content from which the DM was originally sent
143
+ * @prop {SidechatDirectMessage[]} messages - array of direct message objects
144
+ */
145
+
146
+ /**
147
+ * A single direct message
148
+ * @typedef {Object} SidechatDirectMessage
149
+ * @prop {String} created_at - time at which the message was sent
150
+ * @prop {String} client_id - alphanumeric ID of the device the message was sent on
151
+ * @prop {String} obfuscatedUserId - obfuscated version of the sender's alphanumeric ID
152
+ * @prop {String} text - body text of the message
153
+ * @prop {String} id - alphanumeric ID of the message
154
+ * @prop {String} chat_id - alphanumeric ID of the thread in which the message resides
155
+ * @prop {Boolean} authored_by_user - whether or not the current user sent the message
156
+ * @prop {"message"} type - undocumented
157
+ */
158
+
1
159
  /**
2
160
  * Throwable error caused by the Sidechat API
3
161
  * @class
@@ -938,7 +1096,7 @@ class SidechatAPIClient {
938
1096
  }
939
1097
  try {
940
1098
  const res = await fetch(`${this.apiRoot}/v1/chats/groups/join`, {
941
- method: "GET",
1099
+ method: "POST",
942
1100
  headers: {
943
1101
  ...this.defaultHeaders,
944
1102
  Authorization: `Bearer ${this.userToken}`,
@@ -960,6 +1118,147 @@ class SidechatAPIClient {
960
1118
  throw new SidechatAPIError(`Failed to join groupchat.`);
961
1119
  }
962
1120
  };
1121
+
1122
+ /**
1123
+ * Gets a list of the user's direct messages
1124
+ * @method
1125
+ * @returns {SidechatDirectThread[]}
1126
+ * @since 2.4.4
1127
+ */
1128
+ getDMs = async () => {
1129
+ if (!this.userToken) {
1130
+ throw new SidechatAPIError("User is not authenticated.");
1131
+ }
1132
+ try {
1133
+ const res = await fetch(`${this.apiRoot}/v1/chats`, {
1134
+ method: "GET",
1135
+ headers: {
1136
+ ...this.defaultHeaders,
1137
+ Authorization: `Bearer ${this.userToken}`,
1138
+ },
1139
+ });
1140
+ const json = await res.json();
1141
+ const list = await json.chats;
1142
+ let r = [];
1143
+ list.forEach((o) => {
1144
+ r.push(o.chat);
1145
+ });
1146
+ return await r;
1147
+ } catch (err) {
1148
+ console.error(err);
1149
+ throw new SidechatAPIError(`Failed to fetch DMs.`);
1150
+ }
1151
+ };
1152
+
1153
+ /**
1154
+ * Gets a single direct message thread
1155
+ * @method
1156
+ * @param {String} id - alphanumeric ID of the chat to fetch
1157
+ * @returns {SidechatDirectThread}
1158
+ * @since 2.4.4
1159
+ */
1160
+ getDMThread = async (id) => {
1161
+ if (!this.userToken) {
1162
+ throw new SidechatAPIError("User is not authenticated.");
1163
+ }
1164
+ try {
1165
+ const res = await fetch(
1166
+ `${this.apiRoot}/v1/chats/messages?chat_id=${id}`,
1167
+ {
1168
+ method: "GET",
1169
+ headers: {
1170
+ ...this.defaultHeaders,
1171
+ Authorization: `Bearer ${this.userToken}`,
1172
+ },
1173
+ }
1174
+ );
1175
+ const json = await res.json();
1176
+ return await json.chat;
1177
+ } catch (err) {
1178
+ console.error(err);
1179
+ throw new SidechatAPIError(`Failed to fetch DM thread.`);
1180
+ }
1181
+ };
1182
+
1183
+ /**
1184
+ * Sends a message to an existing direct message thread - note that you must first use startDM() to start a thread.
1185
+ * @method
1186
+ * @param {String} chatID - alphanumeric ID of the chat to send to
1187
+ * @param {String} text - text content of message
1188
+ * @param {String} clientID - alphanumeric device ID
1189
+ * @param {SidechatAsset[]} - array of assets to send
1190
+ * @param {Boolean} anonymous - whether the DM should be sent anonymously
1191
+ * @since 2.4.4
1192
+ */
1193
+ sendDM = async (chatID, text, clientID, assets = [], anonymous = false) => {
1194
+ if (!this.userToken) {
1195
+ throw new SidechatAPIError("User is not authenticated.");
1196
+ }
1197
+ try {
1198
+ const res = await fetch(`${this.apiRoot}/v1/chats/send`, {
1199
+ method: "POST",
1200
+ headers: {
1201
+ ...this.defaultHeaders,
1202
+ Authorization: `Bearer ${this.userToken}`,
1203
+ },
1204
+ body: JSON.stringify({
1205
+ chat_id: chatID,
1206
+ text: text,
1207
+ client_id: clientID,
1208
+ anonymous: anonymous,
1209
+ assets: assets,
1210
+ }),
1211
+ });
1212
+ const json = await res.json();
1213
+ return await json;
1214
+ } catch (err) {
1215
+ console.error(err);
1216
+ throw new SidechatAPIError(`Failed to fetch DMs.`);
1217
+ }
1218
+ };
1219
+
1220
+ /**
1221
+ * Creates a new direct message thread
1222
+ * @method
1223
+ * @param {String} text - text content of message
1224
+ * @param {String} clientID - alphanumeric ID of devide
1225
+ * @param {String} postID - alphanumeric ID of post or comment
1226
+ * @param {Boolean} anonymous - whether the DM should be sent anonymously
1227
+ * @param {"feed"} postContext - context of post (mostly undocumented, defaults to "feed")
1228
+ * @since 2.4.4
1229
+ */
1230
+ startDM = async (
1231
+ text,
1232
+ clientID,
1233
+ postID,
1234
+ anonymous = false,
1235
+ postContext = "feed"
1236
+ ) => {
1237
+ if (!this.userToken) {
1238
+ throw new SidechatAPIError("User is not authenticated.");
1239
+ }
1240
+ try {
1241
+ const res = await fetch(`${this.apiRoot}/v1/chats/send`, {
1242
+ method: "POST",
1243
+ headers: {
1244
+ ...this.defaultHeaders,
1245
+ Authorization: `Bearer ${this.userToken}`,
1246
+ },
1247
+ body: JSON.stringify({
1248
+ text: text,
1249
+ client_id: clientID,
1250
+ post_id: postID,
1251
+ anonymous: anonymous,
1252
+ post_context: postContext,
1253
+ }),
1254
+ });
1255
+ const json = await res.json();
1256
+ return await json;
1257
+ } catch (err) {
1258
+ console.error(err);
1259
+ throw new SidechatAPIError(`Failed to fetch DMs.`);
1260
+ }
1261
+ };
963
1262
  }
964
1263
 
965
1264
  /**
@@ -1037,4 +1336,4 @@ class SidechatColorList {
1037
1336
  ];
1038
1337
  }
1039
1338
 
1040
- export { SidechatAPIClient, SidechatAPIError, SidechatColorList };
1339
+ export { SidechatAPIClient, SidechatAPIError, SidechatColorList, SidechatTypes };
@@ -312,4 +312,78 @@ export type SidechatPostsAndCursor = {
312
312
  posts: SidechatPostOrComment[];
313
313
  cursor: SidechatCursorString;
314
314
  };
315
+ /**
316
+ * A direct message thread
317
+ */
318
+ export type SidechatDirectThread = {
319
+ /**
320
+ * - alphanumeric ID of thread
321
+ */
322
+ id: string;
323
+ /**
324
+ * - alphanumeric ID of group in which the thread exists
325
+ */
326
+ group_id: string;
327
+ /**
328
+ * - date string of when the last message in the chat was sent
329
+ */
330
+ updated_at: string;
331
+ /**
332
+ * - post or comment from which the thread was originally sent
333
+ */
334
+ post_id: string;
335
+ /**
336
+ * - the context of the DM thread (only "feed" is known at the moment)
337
+ */
338
+ post_context: string;
339
+ /**
340
+ * - whether or not the other user has accepted this DM
341
+ */
342
+ accept_status: "accepted";
343
+ /**
344
+ * - the type of the content from which the DM was originally sent
345
+ */
346
+ type: "post" | "comment";
347
+ /**
348
+ * - array of direct message objects
349
+ */
350
+ messages: SidechatDirectMessage[];
351
+ };
352
+ /**
353
+ * A single direct message
354
+ */
355
+ export type SidechatDirectMessage = {
356
+ /**
357
+ * - time at which the message was sent
358
+ */
359
+ created_at: string;
360
+ /**
361
+ * - alphanumeric ID of the device the message was sent on
362
+ */
363
+ client_id: string;
364
+ /**
365
+ * - obfuscated version of the sender's alphanumeric ID
366
+ */
367
+ obfuscatedUserId: string;
368
+ /**
369
+ * - body text of the message
370
+ */
371
+ text: string;
372
+ /**
373
+ * - alphanumeric ID of the message
374
+ */
375
+ id: string;
376
+ /**
377
+ * - alphanumeric ID of the thread in which the message resides
378
+ */
379
+ chat_id: string;
380
+ /**
381
+ * - whether or not the current user sent the message
382
+ */
383
+ authored_by_user: boolean;
384
+ /**
385
+ * - undocumented
386
+ */
387
+ type: "message";
388
+ };
315
389
  //# sourceMappingURL=SidechatTypes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SidechatTypes.d.ts","sourceRoot":"","sources":["../../src/types/SidechatTypes.js"],"names":[],"mappings":";;;;;;;;;UAGU,MAAM,GAAC,SAAS;;;;;;;;;;;;;;;;;;;;WAKhB,aAAa;;;;;;;;;;;;;;;;iBAIb,kBAAkB;;;;YAClB,mBAAmB,EAAE;;;;;;;;;;;;;;;;cAIrB,gBAAgB;;;;;;;;;;;;mBAGhB,WAAW,GAAC,eAAe;;;;kBAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAcP,YAAY,GAAC,QAAQ;;;;;;;;qBAErB,MAAM,GAAC,QAAQ,GAAC,cAAc;;;;sBAC9B,SAAS,GAAC,eAAe,GAAC,mBAAmB;;;;8BAC7C,MAAM,GAAC,MAAM;;;;;;;;;;;;eAGb,uBAAuB;;;;;;;;;;;;;;;;;;;;;UASvB,OAAO;;;;kBACP,MAAM,GAAC,KAAK,GAAC,KAAK;;;;;;;;;;;;UAGlB,uBAAuB;;;;;;;;;;;;;;;;;cAQvB,qBAAqB;;;;SACrB,uBAAuB;;;;;;;;;;;;;;;;;UAQvB,OAAO;;;;kBACP,MAAM,GAAC,KAAK,GAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiBlB,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAyBjB,QAAQ,GAAC,UAAU,GAAC,MAAM;;;;;;;;;WAW7B,qBAAqB,EAAE;YACvB,oBAAoB"}
1
+ {"version":3,"file":"SidechatTypes.d.ts","sourceRoot":"","sources":["../../src/types/SidechatTypes.js"],"names":[],"mappings":";;;;;;;;;UAGU,MAAM,GAAC,SAAS;;;;;;;;;;;;;;;;;;;;WAKhB,aAAa;;;;;;;;;;;;;;;;iBAIb,kBAAkB;;;;YAClB,mBAAmB,EAAE;;;;;;;;;;;;;;;;cAIrB,gBAAgB;;;;;;;;;;;;mBAGhB,WAAW,GAAC,eAAe;;;;kBAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAcP,YAAY,GAAC,QAAQ;;;;;;;;qBAErB,MAAM,GAAC,QAAQ,GAAC,cAAc;;;;sBAC9B,SAAS,GAAC,eAAe,GAAC,mBAAmB;;;;8BAC7C,MAAM,GAAC,MAAM;;;;;;;;;;;;eAGb,uBAAuB;;;;;;;;;;;;;;;;;;;;;UASvB,OAAO;;;;kBACP,MAAM,GAAC,KAAK,GAAC,KAAK;;;;;;;;;;;;UAGlB,uBAAuB;;;;;;;;;;;;;;;;;cAQvB,qBAAqB;;;;SACrB,uBAAuB;;;;;;;;;;;;;;;;;UAQvB,OAAO;;;;kBACP,MAAM,GAAC,KAAK,GAAC,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiBlB,kBAAkB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iCAyBjB,QAAQ,GAAC,UAAU,GAAC,MAAM;;;;;;;;;WAW7B,qBAAqB,EAAE;YACvB,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAapB,UAAU;;;;UACV,MAAM,GAAC,SAAS;;;;cAChB,qBAAqB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAavB,SAAS"}