@ozdao/martyrs 0.2.430 → 0.2.431

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 (213) hide show
  1. package/dist/chats.server.js +0 -19
  2. package/dist/chats.server.mjs +0 -19
  3. package/dist/martyrs/src/components/Button/{Button.vue.cjs → Button.vue2.cjs} +2 -2
  4. package/dist/martyrs/src/components/Button/Button.vue2.cjs.map +1 -0
  5. package/dist/martyrs/src/components/Button/{Button.vue.js → Button.vue2.js} +2 -2
  6. package/dist/martyrs/src/components/Button/{Button.vue.cjs.map → Button.vue2.js.map} +1 -1
  7. package/dist/martyrs/src/components/Chips/{Chips.vue.cjs → Chips.vue2.cjs} +2 -2
  8. package/dist/martyrs/src/components/Chips/Chips.vue2.cjs.map +1 -0
  9. package/dist/martyrs/src/components/Chips/{Chips.vue.js → Chips.vue2.js} +2 -2
  10. package/dist/martyrs/src/components/Chips/Chips.vue2.js.map +1 -0
  11. package/dist/martyrs/src/components/Menu/{Menu.vue2.cjs → Menu.vue.cjs} +2 -2
  12. package/dist/martyrs/src/components/Menu/Menu.vue.cjs.map +1 -0
  13. package/dist/martyrs/src/components/Menu/{Menu.vue2.js → Menu.vue.js} +2 -2
  14. package/dist/martyrs/src/components/Menu/Menu.vue.js.map +1 -0
  15. package/dist/martyrs/src/components/Popup/{Popup.vue2.cjs → Popup.vue.cjs} +2 -2
  16. package/dist/martyrs/src/components/Popup/{Popup.vue2.js.map → Popup.vue.cjs.map} +1 -1
  17. package/dist/martyrs/src/components/Popup/{Popup.vue2.js → Popup.vue.js} +2 -2
  18. package/dist/martyrs/src/components/Popup/Popup.vue.js.map +1 -0
  19. package/dist/martyrs/src/components/Tab/{Tab.vue.cjs → Tab.vue2.cjs} +2 -2
  20. package/dist/martyrs/src/components/Tab/Tab.vue2.cjs.map +1 -0
  21. package/dist/martyrs/src/components/Tab/{Tab.vue.js → Tab.vue2.js} +2 -2
  22. package/dist/martyrs/src/components/Tab/{Tab.vue.cjs.map → Tab.vue2.js.map} +1 -1
  23. package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.cjs +2 -2
  24. package/dist/martyrs/src/modules/auth/views/components/layouts/Auth.vue.js +2 -2
  25. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +2 -2
  26. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +2 -2
  27. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +2 -2
  28. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +2 -2
  29. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +2 -2
  30. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +2 -2
  31. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.cjs +1 -1
  32. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +1 -1
  33. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.cjs +2 -2
  34. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +2 -2
  35. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +2 -2
  36. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +2 -2
  37. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +2 -2
  38. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +2 -2
  39. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +2 -2
  40. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +2 -2
  41. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.cjs +1 -1
  42. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
  43. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.cjs +1 -1
  44. package/dist/martyrs/src/modules/community/components/blocks/CardBlogpost.vue.js +1 -1
  45. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +3 -3
  46. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +3 -3
  47. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +2 -2
  48. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +2 -2
  49. package/dist/martyrs/src/modules/events/components/blocks/CardEvent.vue.cjs +1 -1
  50. package/dist/martyrs/src/modules/events/components/blocks/CardEvent.vue.js +1 -1
  51. package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.cjs +1 -1
  52. package/dist/martyrs/src/modules/events/components/elements/ButtonCheck.vue.js +1 -1
  53. package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.cjs +1 -1
  54. package/dist/martyrs/src/modules/events/components/elements/ButtonJoin.vue.js +1 -1
  55. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +2 -2
  56. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
  57. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +2 -2
  58. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +2 -2
  59. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +1 -1
  60. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
  61. package/dist/martyrs/src/modules/events/components/pages/Events.vue.cjs +1 -1
  62. package/dist/martyrs/src/modules/events/components/pages/Events.vue.js +1 -1
  63. package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.cjs +1 -1
  64. package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js +1 -1
  65. package/dist/martyrs/src/modules/gallery/components/pages/Gallery.vue.cjs +1 -1
  66. package/dist/martyrs/src/modules/gallery/components/pages/Gallery.vue.js +1 -1
  67. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +3 -3
  68. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +3 -3
  69. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +1 -1
  70. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +1 -1
  71. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs +2 -2
  72. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.js +2 -2
  73. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +5 -4
  74. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs.map +1 -1
  75. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +5 -4
  76. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js.map +1 -1
  77. package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.cjs +1 -1
  78. package/dist/martyrs/src/modules/globals/views/components/partials/Header.vue.js +1 -1
  79. package/dist/martyrs/src/modules/globals/views/components/partials/NavigationBar.vue.cjs +1 -1
  80. package/dist/martyrs/src/modules/globals/views/components/partials/NavigationBar.vue.js +1 -1
  81. package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.cjs +1 -1
  82. package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.js +1 -1
  83. package/dist/martyrs/src/modules/landing/components/sections/SectionFeaturesImages.vue.cjs +101 -0
  84. package/dist/martyrs/src/modules/landing/components/sections/SectionFeaturesImages.vue.cjs.map +1 -0
  85. package/dist/martyrs/src/modules/landing/components/sections/SectionFeaturesImages.vue.js +101 -0
  86. package/dist/martyrs/src/modules/landing/components/sections/SectionFeaturesImages.vue.js.map +1 -0
  87. package/dist/martyrs/src/modules/landing/components/sections/SectionHeroToken.vue.cjs +85 -0
  88. package/dist/martyrs/src/modules/landing/components/sections/SectionHeroToken.vue.cjs.map +1 -0
  89. package/dist/martyrs/src/modules/landing/components/sections/SectionHeroToken.vue.js +85 -0
  90. package/dist/martyrs/src/modules/landing/components/sections/SectionHeroToken.vue.js.map +1 -0
  91. package/dist/martyrs/src/modules/landing/components/sections/SectionRoadmap.vue.cjs +97 -0
  92. package/dist/martyrs/src/modules/landing/components/sections/SectionRoadmap.vue.cjs.map +1 -0
  93. package/dist/martyrs/src/modules/landing/components/sections/SectionRoadmap.vue.js +97 -0
  94. package/dist/martyrs/src/modules/landing/components/sections/SectionRoadmap.vue.js.map +1 -0
  95. package/dist/martyrs/src/modules/landing/landing.client.cjs +6 -0
  96. package/dist/martyrs/src/modules/landing/landing.client.cjs.map +1 -1
  97. package/dist/martyrs/src/modules/landing/landing.client.js +6 -0
  98. package/dist/martyrs/src/modules/landing/landing.client.js.map +1 -1
  99. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.cjs +4 -12
  100. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.cjs.map +1 -1
  101. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js +4 -12
  102. package/dist/martyrs/src/modules/notifications/components/elements/NotificationBadge.vue.js.map +1 -1
  103. package/dist/martyrs/src/modules/notifications/notifications.client.cjs +135 -248
  104. package/dist/martyrs/src/modules/notifications/notifications.client.cjs.map +1 -1
  105. package/dist/martyrs/src/modules/notifications/notifications.client.js +135 -248
  106. package/dist/martyrs/src/modules/notifications/notifications.client.js.map +1 -1
  107. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.cjs +2 -2
  108. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
  109. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs +1 -1
  110. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs.map +1 -1
  111. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +1 -1
  112. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js.map +1 -1
  113. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +3 -3
  114. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +3 -3
  115. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.cjs +1 -1
  116. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +1 -1
  117. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.cjs +1 -1
  118. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.js +1 -1
  119. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.cjs +1 -1
  120. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +1 -1
  121. package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.cjs +1 -1
  122. package/dist/martyrs/src/modules/organizations/components/elements/ButtonToggleMembership.vue.js +1 -1
  123. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +3 -3
  124. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +3 -3
  125. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +3 -3
  126. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +3 -3
  127. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +5 -5
  128. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs.map +1 -1
  129. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +5 -5
  130. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js.map +1 -1
  131. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
  132. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
  133. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +3 -3
  134. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +3 -3
  135. package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.cjs +1 -1
  136. package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
  137. package/dist/martyrs/src/modules/organizations/components/sections/DetailsTabSection.vue.cjs +1 -1
  138. package/dist/martyrs/src/modules/organizations/components/sections/DetailsTabSection.vue.js +1 -1
  139. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +2 -2
  140. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +2 -2
  141. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.cjs +1 -1
  142. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
  143. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +2 -2
  144. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +2 -2
  145. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
  146. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  147. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +1 -1
  148. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
  149. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.cjs +2 -2
  150. package/dist/martyrs/src/modules/pages/views/components/partials/SidebarPages.vue.js +2 -2
  151. package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.cjs +1 -1
  152. package/dist/martyrs/src/modules/products/components/blocks/ImagesThumbnails.vue.js +1 -1
  153. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs +1 -1
  154. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +1 -1
  155. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +1 -1
  156. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +1 -1
  157. package/dist/martyrs/src/modules/products/components/pages/EditLeftover.vue.cjs +1 -1
  158. package/dist/martyrs/src/modules/products/components/pages/EditLeftover.vue.js +1 -1
  159. package/dist/martyrs/src/modules/products/components/pages/Leftovers.vue.cjs +1 -1
  160. package/dist/martyrs/src/modules/products/components/pages/Leftovers.vue.js +1 -1
  161. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +12 -10
  162. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs.map +1 -1
  163. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +12 -10
  164. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js.map +1 -1
  165. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +3 -3
  166. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +3 -3
  167. package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs +1 -1
  168. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +1 -1
  169. package/dist/martyrs/src/modules/products/components/sections/EditProductInfo.vue.cjs +1 -1
  170. package/dist/martyrs/src/modules/products/components/sections/EditProductInfo.vue.js +1 -1
  171. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.cjs +2 -2
  172. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +2 -2
  173. package/dist/martyrs/src/modules/rents/views/components/pages/GanttChart.vue.cjs +1 -1
  174. package/dist/martyrs/src/modules/rents/views/components/pages/GanttChart.vue.js +1 -1
  175. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +1 -1
  176. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +1 -1
  177. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.cjs +1 -1
  178. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
  179. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.cjs +2 -2
  180. package/dist/martyrs/src/modules/reports/components/sections/FormReport.vue.js +2 -2
  181. package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.cjs +1 -1
  182. package/dist/martyrs/src/modules/spots/components/blocks/CardSpot.vue.js +1 -1
  183. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.cjs +1 -1
  184. package/dist/martyrs/src/modules/spots/components/pages/Map.vue.js +1 -1
  185. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +3 -3
  186. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +3 -3
  187. package/dist/notifications.server.js +85 -1
  188. package/dist/notifications.server.mjs +85 -1
  189. package/dist/orders.server.js +0 -27
  190. package/dist/orders.server.mjs +0 -27
  191. package/dist/style.css +101 -18
  192. package/package.json +1 -1
  193. package/src/builder/modes/ssr.dev.js +0 -20
  194. package/src/modules/chats/routes/chats.routes.js +19 -19
  195. package/src/modules/globals/controllers/utils/queryProcessor.js +1 -1
  196. package/src/modules/globals/views/components/layouts/Client.vue +6 -6
  197. package/src/modules/landing/components/sections/SectionHeroToken.vue +1 -1
  198. package/src/modules/landing/landing.client.js +7 -0
  199. package/src/modules/notifications/components/elements/NotificationBadge.vue +4 -13
  200. package/src/modules/notifications/notifications.client.js +166 -350
  201. package/src/modules/notifications/services/notification.service.js +4 -3
  202. package/src/modules/notifications/services/websocket.service.js +54 -56
  203. package/src/modules/orders/components/pages/OrderCreate.vue +1 -1
  204. package/src/modules/orders/controllers/orders.controller.js +1 -2
  205. package/src/modules/organizations/components/pages/Organization.vue +3 -3
  206. package/src/modules/products/components/pages/Product.vue +10 -9
  207. package/dist/martyrs/src/components/Button/Button.vue.js.map +0 -1
  208. package/dist/martyrs/src/components/Chips/Chips.vue.cjs.map +0 -1
  209. package/dist/martyrs/src/components/Chips/Chips.vue.js.map +0 -1
  210. package/dist/martyrs/src/components/Menu/Menu.vue2.cjs.map +0 -1
  211. package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +0 -1
  212. package/dist/martyrs/src/components/Popup/Popup.vue2.cjs.map +0 -1
  213. package/dist/martyrs/src/components/Tab/Tab.vue.js.map +0 -1
@@ -1,61 +1,44 @@
1
1
  // services/websocket.service.js
2
- class WebSocketService {
3
- constructor() {
4
- this.connections = new Map();
5
- this.wss = null;
6
- }
7
-
8
- initialize(wss) {
9
- this.wss = wss;
2
+ const WebSocketService = (wss) => {
3
+ const connections = new Map();
4
+
5
+ // Добавление соединения
6
+ const addConnection = (userId, ws) => {
7
+ if (!connections.has(userId)) {
8
+ connections.set(userId, new Set());
9
+ }
10
+ connections.get(userId).add(ws);
10
11
 
11
- // Setup connection handler for notifications
12
- this.wss.on('connection', (ws, req) => {
13
- // If the user ID is available from authentication
14
- if (req.userId) {
15
- // Mark this connection as a notification connection
16
- ws.type = 'notification';
17
- this.addConnection(req.userId, ws);
18
-
19
- ws.on('close', () => {
20
- this.removeConnection(req.userId, ws);
21
- });
22
- }
12
+ // Отслеживаем закрытие соединения
13
+ ws.on('close', () => {
14
+ removeConnection(userId, ws);
23
15
  });
24
- }
25
-
26
- // Store a new connection
27
- addConnection(userId, ws) {
28
- if (!this.connections.has(userId)) {
29
- this.connections.set(userId, new Set());
30
- }
31
- this.connections.get(userId).add(ws);
32
- }
16
+ };
33
17
 
34
- // Remove a connection
35
- removeConnection(userId, ws) {
36
- if (this.connections.has(userId)) {
37
- this.connections.get(userId).delete(ws);
38
- if (this.connections.get(userId).size === 0) {
39
- this.connections.delete(userId);
18
+ // Удаление соединения
19
+ const removeConnection = (userId, ws) => {
20
+ if (connections.has(userId)) {
21
+ connections.get(userId).delete(ws);
22
+ if (connections.get(userId).size === 0) {
23
+ connections.delete(userId);
40
24
  }
41
25
  }
42
- }
26
+ };
43
27
 
44
- // Send message to a specific user
45
- sendToUser(userId, data) {
28
+ // Отправка сообщения конкретному пользователю
29
+ const sendToUser = (userId, data) => {
46
30
  return new Promise((resolve) => {
47
31
  try {
48
- if (!this.connections.has(userId)) {
49
- // User not connected
32
+ if (!connections.has(userId)) {
33
+ // Пользователь не подключен
50
34
  return resolve({ delivered: false, reason: 'user-not-connected' });
51
35
  }
52
36
 
53
- const userSockets = this.connections.get(userId);
37
+ const userSockets = connections.get(userId);
54
38
  let delivered = 0;
55
39
 
56
40
  userSockets.forEach((ws) => {
57
- // Only send to notification-type connections
58
- if (ws.type === 'notification' && ws.readyState === 1) { // 1 = OPEN
41
+ if (ws.readyState === 1) { // 1 = OPEN
59
42
  ws.send(JSON.stringify({
60
43
  type: 'notification',
61
44
  data
@@ -63,23 +46,24 @@ class WebSocketService {
63
46
  delivered++;
64
47
  }
65
48
  });
49
+
50
+ console.log(userSockets)
66
51
 
67
52
  resolve({ delivered: delivered > 0, connections: delivered });
68
53
  } catch (error) {
69
- console.error('Error sending notification:', error);
54
+ console.error('Ошибка отправки уведомления:', error);
70
55
  resolve({ delivered: false, reason: 'error', error: error.message });
71
56
  }
72
57
  });
73
- }
58
+ };
74
59
 
75
- // Broadcast to all connected clients
76
- broadcast(data) {
60
+ // Рассылка всем подключенным клиентам
61
+ const broadcast = (data) => {
77
62
  return new Promise((resolve) => {
78
63
  let count = 0;
79
64
 
80
- this.wss.clients.forEach((ws) => {
81
- // Only send to notification-type connections
82
- if (ws.type === 'notification' && ws.readyState === 1) { // 1 = OPEN
65
+ wss.clients.forEach((ws) => {
66
+ if (ws.readyState === 1) { // 1 = OPEN
83
67
  try {
84
68
  ws.send(JSON.stringify({
85
69
  type: 'notification',
@@ -87,16 +71,30 @@ class WebSocketService {
87
71
  }));
88
72
  count++;
89
73
  } catch (e) {
90
- console.error('Error broadcasting to client:', e);
74
+ console.error('Ошибка рассылки клиенту:', e);
91
75
  }
92
76
  }
93
77
  });
94
78
 
95
79
  resolve({ delivered: count > 0, connections: count });
96
80
  });
97
- }
98
- }
81
+ };
82
+
83
+ // Настраиваем обработчик подключений для нашего сервиса
84
+ wss.on('connection', (ws, req) => {
85
+ // Если у соединения есть userId (аутентифицированный пользователь)
86
+ if (req.userId) {
87
+ // Просто добавляем соединение в наш трекер
88
+ addConnection(req.userId, ws);
89
+ }
90
+ });
91
+
92
+ return {
93
+ addConnection,
94
+ removeConnection,
95
+ sendToUser,
96
+ broadcast
97
+ };
98
+ };
99
99
 
100
- // Singleton instance
101
- const webSocketService = new WebSocketService();
102
- module.exports = webSocketService;
100
+ module.exports = WebSocketService;
@@ -260,7 +260,7 @@ async function handleCreate() {
260
260
  let order = await orders.actions.create(orders.state.current);
261
261
 
262
262
  if (order) {
263
- router.push({
263
+ await router.push({
264
264
  name: 'Order',
265
265
  params: {
266
266
  order: order._id
@@ -126,7 +126,6 @@ const controllerFactory = (db) => {
126
126
  }
127
127
  }
128
128
 
129
-
130
129
  console.log(orderData)
131
130
 
132
131
  // Create the order first
@@ -193,7 +192,7 @@ const controllerFactory = (db) => {
193
192
  await session.commitTransaction();
194
193
 
195
194
  // Send notification
196
- sendOrderMessage(orderData);
195
+ // sendOrderMessage(orderData);
197
196
 
198
197
  // Return the created order
199
198
  res.status(201).send(createdOrder);
@@ -82,7 +82,7 @@
82
82
  >
83
83
  <div class="w-100 gap-thin flex flex-nowrap o-x-scroll">
84
84
  <router-link
85
- class="bg-black t-nowrap t-white uppercase t-semi pd-thin radius-extra "
85
+ class="bg-black t-nowrap t-white uppercase t-semi pd-thin radius-small "
86
86
  :to="{
87
87
  name:'Organization_ProductAdd',
88
88
  params: {
@@ -94,7 +94,7 @@
94
94
  </router-link>
95
95
 
96
96
  <router-link
97
- class=" uppercase t-nowrap t-semi pd-thin radius-extra "
97
+ class=" uppercase t-nowrap t-semi pd-thin"
98
98
  :to="{
99
99
  name:'Leftovers',
100
100
  params: {
@@ -107,7 +107,7 @@
107
107
 
108
108
 
109
109
  <router-link
110
- class="d-block t-nowrap mn-l-auto uppercase t-semi bg-white pd-thin radius-extra "
110
+ class="d-block t-nowrap mn-l-auto uppercase t-semi bg-white pd-thin radius-small "
111
111
  :to="{
112
112
  name:'Backoffice',
113
113
  params: {
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <div v-if="products.state.current._id" class="h-100 w-100 mobile:pd-thin pd-big bg-white">
2
+ <div v-if="products.state.current" class="h-100 w-100 mobile:pd-thin pd-big bg-white">
3
3
  <div class="cols-2-1_2 w-100 gap-medium">
4
4
 
5
5
  <ImagesThumbnails
@@ -91,9 +91,9 @@
91
91
  </div>
92
92
  </div>
93
93
 
94
- <div class="h-max pos-relative">
95
- <h3 class="pd-medium pd-b-small">Most Popular</h3>
96
- <PopularProducts />
94
+ <div class="h-max mn-t-big pos-relative">
95
+ <h3 class="pd-b-small">Most Popular</h3>
96
+ <PopularProducts class="mn-r-big-negative mn-l-big-negative"/>
97
97
  </div>
98
98
  </div>
99
99
  </template>
@@ -144,15 +144,16 @@ function closePopup() {
144
144
  isPopupOpen.value = false
145
145
  }
146
146
 
147
-
148
- const emit = defineEmits(['page-loading', 'page-loaded']);
147
+ const emits = defineEmits(['page-loading', 'page-loaded']);
149
148
 
150
-
149
+ const pageProduct = ref(null)
150
+ products.state.current = null
151
151
  // products.mutations.resetProduct()
152
152
  onMounted(async () => {
153
- emit('page-loading');
153
+
154
+ emits('page-loading');
154
155
  await products.actions.read({ _id: route.params.product })
155
- emit('page-loaded');
156
+ emits('page-loaded');
156
157
 
157
158
 
158
159
  // route.meta.title.en = product.value.name
@@ -1 +0,0 @@
1
- {"version":3,"file":"Button.vue.js","sources":["../../../../../src/components/Button/Button.vue"],"sourcesContent":["<script setup>\n\timport { ref } from 'vue'\n\n\timport Loader from '@martyrs/src/components/Loader/Loader.vue'\n\n\tconst props = defineProps({\n\t\tsubmit: {\n\t\t\ttype: Function,\n\t\t\tdefault: async () => { console.log('Button click.') }\n\t\t},\n\t\ttext: {\n\t\t\ttype: Object,\n\t\t\tdefault: (textComponent) => {\n\t\t\t\treturn textComponent = {\n\t\t\t\t\t...textComponent.text,\n\t\t\t\t\tsuccess: '✔',\n\t\t\t\t\terror: '✖'\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcounter: {\n\t type: Object\n\t },\n\t\tcallback: {\n\t\t\ttype: Function,\n\t\t\tdefault: async () => { console.log('Button callback.') }\n\t\t},\n\t\tcallbackDelay: {\n\t\t\ttype: Number,\n\t\t\tdefault: 750\n\t\t},\n\t\tshowSucces: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tshowLoader: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: true\n\t\t},\n\t\tvalidation: {\n\t\t\ttype: Boolean,\n\t\t\tdefault: false\n\t\t},\n\t})\t\n\n\tconst emits = defineEmits(['error'])\n\n\tconst button = ref(null);\n\tconst error = ref(null);\n\tconst loading = ref(false);\n\tconst finished = ref(false);\n\n\tasync function Submit() {\n\t\t\tconsole.log('click')\n\t\t\t\n\t button.value.style['pointer-events'] = 'none';\n\t error.value = null;\n\t loading.value = true;\n\n\t // Функция для сброса состояния кнопки.\n\t const resetButton = () => {\n if (button.value) {\n button.value.classList.replace('bg-second', 'bg-main');\n button.value.style.pointerEvents = 'auto';\n loading.value = false;\n finished.value = false;\n error.value = null;\n }\n\t };\n\n\t try {\n await props.submit();\n\n button.value.classList.replace('bg-main', 'bg-second');\n\n loading.value = false;\n\n // Используем функцию сброса состояния кнопки здесь.\n if (props.showSucces) { \n\t\t\t\t\tfinished.value = true;\n setTimeout(resetButton, 500);\n } else {\n resetButton();\n }\n\n // Если есть callback, мы также установим таймер для его вызова.\n if (props.callback) setTimeout(() => props.callback(), props.callbackDelay);\n\n\t } catch (err) {\n \t\temits('error',err)\n // Если возникла ошибка, мы изменяем стили и устанавливаем сообщение об ошибке.\n button.value.classList.replace('bg-main', 'bg-fourth-nano');\n error.value = props.error;\n \n // После задержки снова сбрасываем состояние кнопки.\n setTimeout(() => {\n resetButton();\n // Так как класс кнопки был изменен, вернем его в исходное состояние.\n button.value.classList.replace('bg-fourth-nano', 'bg-main');\n }, 1330);\n\t }\n\t}\n\n</script>\n\n<template>\n\t<button @click.stop=\"Submit\" :disabled=\"validation\" ref=\"button\" class=\"button\">\n\t\t<transition name=\"FromTop\" >\n\t\t\t<!-- Slot -->\n\t\t\t<template v-if=\"!loading && !error && !finished || !showLoader\"><slot></slot></template>\n\t\t\t<!-- Loading Circle Animation -->\n\t\t\t<template v-else-if=\"loading && !error && showLoader\"><Loader class=\"pos-relative pos-t-0 pos-l-0 loading\"/></template>\n\t\t\t<!-- <Loader v-else-if=\"loading && !error && showLoader\"/> -->\n\t\t\t<!-- Success -->\n\t\t\t<span v-else-if=\"finished && showSucces\" class=\"t-semi loading t-black\">{{text.success}}</span>\n\t\t\t<!-- Error if not finished -->\n\t\t\t<span v-else-if=\"error\" class=\"error\">{{ error }}</span>\n\t\t</transition>\n\t\t<!-- Counter -->\n\t\t<p v-if=\"counter\" class=\"button-counter\">{{counter}}</p> \n\n\t</button> \n</template>\n\n\n<style lang=\"scss\">\n\t.FromTop-enter-active,\n\t.FromTop-leave-active {\n\t\ttransform: translateY(0);\n\t\topacity: 1;\n\t\ttransition: all 0.5s ease; \n\t\t\n\t}\n\t.FromTop-enter-from,\n\t.FromTop-leave-to {\n\t\tposition: absolute;\n\t\ttransform: translateY(-1rem);\n\t\topacity: 0;\n\t\ttransition: all 0.5s ease;\n\t}\n\n\tbutton[disabled] {\n\t\topacity: 0.75 !important;\n\t \tpointer-events: none !important;\n\t \tcursor: default !important;\n\t \tcolor: rgba(var(--black), 0.5) !important;\n\t\tbackground: rgba(var(--grey), 1) !important; \n\t}\n\n\t.button {\n\t\tdisplay: flex;\n\n\t\tpadding: 0.75rem 1.5rem;\n\t\tborder-radius: 3rem;\n\n\t\ttransform: scale(1);\n\t\topacity: 1;\n\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\t\n\t\tcolor: black;\n\t\ttext-align: center;\n\t\ttext-transform: uppercase;\n\t\tfont-size: 1rem;\n\t\tletter-spacing: 5%;\n\n\t\ttransition: all 0.33s ease;\n\t \n\t\t&:hover {\n\t\t\tcursor: pointer;\n\t\t\topacity: 0.9;\n\t\t}\n\n\t\t&:active {\n\t\t\ttransform: scale(0.95);\n\t\t}\n\n\t\t&-small {\n\t\t\tpadding: 0.5rem 0.75rem;\n\t\t\tborder-radius: 0.5rem;\n\t\t\theight: fit-content;\n\t\t}\n\n\t\t.button-counter {\n\t\t\tposition: absolute;\n\t\t\tright: -8px;\n\t bottom: -8px;\n\t background: yellow;\n\t height: 16px;\n\t border-radius: 16px;\n\t width: 16px;\n\t font-weight: 500;\n\t text-align: center;\n\t line-height: 16px;\n\t font-size: 10px;\n\t\t}\n\t}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKC,UAAM,QAAQ;AAwCd,UAAM,QAAQ;AAEd,UAAM,SAAS,IAAI,IAAI;AACvB,UAAM,QAAQ,IAAI,IAAI;AACtB,UAAM,UAAU,IAAI,KAAK;AACzB,UAAM,WAAW,IAAI,KAAK;AAE1B,mBAAe,SAAS;AACtB,cAAQ,IAAI,OAAO;AAEjB,aAAO,MAAM,MAAM,gBAAgB,IAAI;AACvC,YAAM,QAAQ;AACd,cAAQ,QAAQ;AAGhB,YAAM,cAAc,MAAM;AACvB,YAAI,OAAO,OAAO;AAChB,iBAAO,MAAM,UAAU,QAAQ,aAAa,SAAS;AACrD,iBAAO,MAAM,MAAM,gBAAgB;AACnC,kBAAQ,QAAQ;AAChB,mBAAS,QAAQ;AACjB,gBAAM,QAAQ;AAAA,QACxB;AAAA,MACM;AAED,UAAI;AACD,cAAM,MAAM,OAAQ;AAEpB,eAAO,MAAM,UAAU,QAAQ,WAAW,WAAW;AAErD,gBAAQ,QAAQ;AAGhB,YAAI,MAAM,YAAY;AACzB,mBAAS,QAAQ;AACZ,qBAAW,aAAa,GAAG;AAAA,QACrC,OAAe;AACL,sBAAa;AAAA,QACvB;AAGQ,YAAI,MAAM,SAAU,YAAW,MAAM,MAAM,SAAU,GAAE,MAAM,aAAa;AAAA,MAE5E,SAAQ,KAAK;AACb,cAAM,SAAQ,GAAG;AAEf,eAAO,MAAM,UAAU,QAAQ,WAAW,gBAAgB;AAC1D,cAAM,QAAQ,MAAM;AAGpB,mBAAW,MAAM;AACf,sBAAa;AAEb,iBAAO,MAAM,UAAU,QAAQ,kBAAkB,SAAS;AAAA,QAC3D,GAAE,IAAI;AAAA,MACf;AAAA,IACA;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Chips.vue.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Chips.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Menu.vue2.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Menu.vue2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Popup.vue2.cjs","sources":["../../../../../src/components/Popup/Popup.vue"],"sourcesContent":["<template>\n\t\t<transition name=\"moveFromTop\">\n\t\t\t<teleport to=\"body\" v-if=\"isPopupOpen\">\n\t\t\t\t<div v-if=\"isPopupOpen\" key=\"popup-content\" class=\"pd-small z-index-6 popup-wrapper\"\n\t\t\t\t\t:class=\"{\n \t\t\t\t\t'pd-t-extra': MOBILE_APP === 'ios', \n\t\t\t\t\t}\"\n\t\t\t\t>\n\n\t\t\t\t\t<transition name=\"TransitionTranslateY\" mode=\"out-in\">\n\t\t\t\t\t\t<section class=\"h-max-100 o-y-scroll pos-relative z-index-4\" v-bind=\"$attrs\" :class=\"$attrs.class\">\n\t\t\t\t\t\t\t\t<h4 v-if=\"title\" class=\"mn-b-small\">{{title}}</h4>\n\t\t\t\t\t\t\t\t<IconCross :fill=\"'rgb(var(--white))'\" @click=\"closePopup()\" class=\"cursor-pointer bg-second pd-micro radius-extra pos-absolute pos-t-0 pos-r-0 mn-t-semi mn-r-semi hover-scale-1 i-medium z-index-5\"/>\n\t\t\t\t\t\t\t\t<slot></slot>\n\t\t\t\t\t\t</section> \n\t\t\t\t\t</transition>\n\n\t\t\t\t\t<div \n\t\t\t\t\t\t@click=\"closePopup()\" \n\t\t\t\t :class=\"{'active':isPopupOpen === true}\" \n\t\t\t\t class=\"color-overlay z-index-3\">\n\t\t\t\t\t</div>\n\n\t\t\t\t</div>\n\t\t</teleport>\n\t</transition>\n</template>\n\n<script setup>\nimport { computed, watch, onMounted, ref, nextTick } from 'vue';\n// Import libs\nimport { useRoute, useRouter } from 'vue-router'\nimport { useI18n } from 'vue-i18n'\n// Icons\nimport IconCross from '@martyrs/src/modules/icons/navigation/IconCross.vue';\n// Define props\nconst props = defineProps({\n isPopupOpen: {\n \ttype: Boolean,\n\t default: false\n },\n style: String,\n title: String,\n});\nconst emits = defineEmits(['close-popup'])\n\nfunction closePopup() {\n emits(\"close-popup\");\n} \n\nwatch(() => props.isPopupOpen, (newVal) => {\n if (newVal) {\n document.body.classList.add('no-scroll');\n } else {\n document.body.classList.remove('no-scroll');\n }\n});\n\n// Accessing router and store\nconst route = useRoute()\nconst router = useRouter()\n// Localization\nconst text = {\n \tmessages: {\n\t en: {},\n\t ru: {}\n\t}\n}\nconst { t } = useI18n(text)\n</script>\n\n<style lang=\"scss\">\n\t.no-scroll {\n\t overflow: hidden;\n\t}\n\n\t.popup-wrapper {\n\t\tdisplay: flex;\n\t\tposition: fixed;\n\n\t\talign-items: center;\n\t\tjustify-content: center;\n\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\tleft: 0;\n\t\ttop: 0;\n\n\t\tz-index: 40;\n\n\t\t.popup {\n\t\t\tposition: absolute;\n\t\t\theight: auto;\n\t\t\tpadding: 2rem;\n\t\t\tmin-width: 24rem;\n\t\t\tborder-radius: 2rem;\n\t\t\toverflow: hidden;\n\n\t\t\tcolor: white;\n\t\t\tbackground: black;\n\n\t\t\tz-index: 40;\n\t\t}\n\t}\n\n\t.color-overlay {\n\t\tdisplay: block;\n\t\tposition: fixed;\n\n\t\tleft: 0;\n\t\ttop: 0;\n\n\t\twidth: 100%;\n\t\theight: 100%;\n\n\t\tbackground: rgba(0,0,0,0.0);\n\t\tpointer-events: none;\n\n\t\ttransform: scale(1.5);\n\n\t\ttransition: all 0.5s cubic-bezier(.31,.79,.24,.92);\n\n\t\t&.active {\n\t\t\tbackground: rgba(#000,0.25);\n\t\t\tpointer-events: all;\n\t\t}\n\t}\n</style>\n"],"names":["watch","useRoute","useRouter","useI18n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAoCA,UAAM,QAAQ;AAQd,UAAM,QAAQ;AAEd,aAAS,aAAa;AACpB,YAAM,aAAa;AAAA,IACrB;AAEAA,QAAK,MAAC,MAAM,MAAM,aAAa,CAAC,WAAW;AACzC,UAAI,QAAQ;AACV,iBAAS,KAAK,UAAU,IAAI,WAAW;AAAA,MAC3C,OAAS;AACL,iBAAS,KAAK,UAAU,OAAO,WAAW;AAAA,MAC9C;AAAA,IACA,CAAC;AAGaC,cAAQ,SAAA;AACPC,cAAS,UAAA;AAExB,UAAM,OAAO;AAAA,MACV,UAAU;AAAA,QACR,IAAI,CAAE;AAAA,QACN,IAAI,CAAA;AAAA,MACT;AAAA,IACA;AACA,UAAM,EAAE,EAAC,IAAKC,QAAAA,QAAQ,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tab.vue.js","sources":["../../../../../src/components/Tab/Tab.vue"],"sourcesContent":["<template>\n <div class=\"flex-nowrap flex-v-center flex pos-relative\">\n <button \n v-for=\"(tab, index) in tabs\" \n :key=\"index\" \n @click=\"handleTabClick(index, tab)\" \n class=\"z-index-1 t-center cursor-pointer\"\n :style=\"isSelected(index, tab) ? 'background: rgb(var(--main)) !important' : ''\"\n :class=\"[\n isSelected(index, tab) ? 'bg-main' : '',\n tabClass ? tabClass : 'pd-small pd-r-medium pd-l-medium w-max pd-small radius-small'\n ]\"\n >\n {{tab.name || tab.label}}\n </button>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, watch } from 'vue'\n\nconst emit = defineEmits(['update:selected', 'tab-click']);\n\nconst props = defineProps({\n tabs: Array,\n tabClass: String,\n selected: [String, Number],\n modelValue: [String, Number],\n callback: Function\n})\n\nconst selectedTab = ref(0)\n\n// Handle both v-model and selected prop for backward compatibility\nconst updateSelectedIndex = () => {\n if (props.modelValue !== undefined) {\n const selectedIndex = props.tabs.findIndex(tab => tab.value === props.modelValue)\n if (selectedIndex !== -1) {\n selectedTab.value = selectedIndex\n }\n } else if (props.selected !== undefined) {\n const selectedIndex = props.tabs.findIndex(tab => tab.value === props.selected)\n if (selectedIndex !== -1) {\n selectedTab.value = selectedIndex\n }\n }\n}\n\n// Initial setup\nupdateSelectedIndex()\n\n// Watch for changes in selected or modelValue props\nwatch(() => props.selected, updateSelectedIndex)\nwatch(() => props.modelValue, updateSelectedIndex)\n\n// Check if tab is selected\nconst isSelected = (index, tab) => {\n if (props.modelValue !== undefined) {\n return tab.value === props.modelValue\n } else if (props.selected !== undefined) {\n return tab.value === props.selected\n }\n return index === selectedTab.value\n}\n\n// Handle tab click\nfunction handleTabClick(index, tab) {\n selectedTab.value = index\n \n // Emit both events for flexibility\n emit('update:selected', tab.value)\n emit('tab-click', { index, tab })\n \n // For v-model support\n if (props.modelValue !== undefined) {\n emit('update:modelValue', tab.value)\n }\n \n // Call callback if provided\n if (props.callback) props.callback(tab)\n}\n</script>\n\n<style lang=\"scss\">\n.tab-selector {\n position: absolute;\n width: 50%;\n height: 100%;\n left: 0;\n top: 0;\n z-index: 0;\n transition: left 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n</style>"],"names":[],"mappings":";;;;;;;;;;;;;;;AAqBA,UAAM,OAAO;AAEb,UAAM,QAAQ;AAQd,UAAM,cAAc,IAAI,CAAC;AAGzB,UAAM,sBAAsB,MAAM;AAChC,UAAI,MAAM,eAAe,QAAW;AAClC,cAAM,gBAAgB,MAAM,KAAK,UAAU,SAAO,IAAI,UAAU,MAAM,UAAU;AAChF,YAAI,kBAAkB,IAAI;AACxB,sBAAY,QAAQ;AAAA,QAC1B;AAAA,MACA,WAAa,MAAM,aAAa,QAAW;AACvC,cAAM,gBAAgB,MAAM,KAAK,UAAU,SAAO,IAAI,UAAU,MAAM,QAAQ;AAC9E,YAAI,kBAAkB,IAAI;AACxB,sBAAY,QAAQ;AAAA,QAC1B;AAAA,MACA;AAAA,IACA;AAGA,wBAAmB;AAGnB,UAAM,MAAM,MAAM,UAAU,mBAAmB;AAC/C,UAAM,MAAM,MAAM,YAAY,mBAAmB;AAGjD,UAAM,aAAa,CAAC,OAAO,QAAQ;AACjC,UAAI,MAAM,eAAe,QAAW;AAClC,eAAO,IAAI,UAAU,MAAM;AAAA,MAC/B,WAAa,MAAM,aAAa,QAAW;AACvC,eAAO,IAAI,UAAU,MAAM;AAAA,MAC/B;AACE,aAAO,UAAU,YAAY;AAAA,IAC/B;AAGA,aAAS,eAAe,OAAO,KAAK;AAClC,kBAAY,QAAQ;AAGpB,WAAK,mBAAmB,IAAI,KAAK;AACjC,WAAK,aAAa,EAAE,OAAO,IAAK,CAAA;AAGhC,UAAI,MAAM,eAAe,QAAW;AAClC,aAAK,qBAAqB,IAAI,KAAK;AAAA,MACvC;AAGE,UAAI,MAAM,SAAU,OAAM,SAAS,GAAG;AAAA,IACxC;;;;;;;;;;;;;;;;;;"}