@sync-in/server 1.3.9 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/README.md +5 -3
  3. package/environment/environment.dist.yaml +2 -0
  4. package/package.json +6 -6
  5. package/server/app.bootstrap.js +9 -0
  6. package/server/app.bootstrap.js.map +1 -1
  7. package/server/app.service.spec.js +44 -19
  8. package/server/app.service.spec.js.map +1 -1
  9. package/server/applications/comments/comments.controller.spec.js +103 -4
  10. package/server/applications/comments/comments.controller.spec.js.map +1 -1
  11. package/server/applications/comments/services/comments-manager.service.spec.js +409 -9
  12. package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
  13. package/server/applications/files/adapters/files-indexer-mysql.service.spec.js +333 -0
  14. package/server/applications/files/adapters/files-indexer-mysql.service.spec.js.map +1 -0
  15. package/server/applications/files/constants/files.js +0 -23
  16. package/server/applications/files/constants/files.js.map +1 -1
  17. package/server/applications/files/constants/only-office.js +8 -0
  18. package/server/applications/files/constants/only-office.js.map +1 -1
  19. package/server/applications/files/constants/routes.js +6 -1
  20. package/server/applications/files/constants/routes.js.map +1 -1
  21. package/server/applications/files/files-only-office.controller.js +11 -0
  22. package/server/applications/files/files-only-office.controller.js.map +1 -1
  23. package/server/applications/files/files-only-office.controller.spec.js +97 -3
  24. package/server/applications/files/files-only-office.controller.spec.js.map +1 -1
  25. package/server/applications/files/files-tasks.controller.spec.js +91 -1
  26. package/server/applications/files/files-tasks.controller.spec.js.map +1 -1
  27. package/server/applications/files/files.config.js +5 -0
  28. package/server/applications/files/files.config.js.map +1 -1
  29. package/server/applications/files/files.controller.spec.js +268 -46
  30. package/server/applications/files/files.controller.spec.js.map +1 -1
  31. package/server/applications/files/guards/files-only-office.guard.spec.js +77 -1
  32. package/server/applications/files/guards/files-only-office.guard.spec.js.map +1 -1
  33. package/server/applications/files/guards/files-only-office.strategy.js +0 -1
  34. package/server/applications/files/guards/files-only-office.strategy.js.map +1 -1
  35. package/server/applications/files/services/files-only-office-manager.service.js +5 -0
  36. package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
  37. package/server/applications/links/links.controller.spec.js +91 -58
  38. package/server/applications/links/links.controller.spec.js.map +1 -1
  39. package/server/applications/links/services/links-manager.service.js +4 -6
  40. package/server/applications/links/services/links-manager.service.js.map +1 -1
  41. package/server/applications/links/services/links-manager.service.spec.js +378 -14
  42. package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
  43. package/server/applications/links/services/links-queries.service.js +1 -1
  44. package/server/applications/links/services/links-queries.service.js.map +1 -1
  45. package/server/applications/notifications/notifications.controller.spec.js +56 -1
  46. package/server/applications/notifications/notifications.controller.spec.js.map +1 -1
  47. package/server/applications/notifications/services/notifications-manager.service.spec.js +461 -5
  48. package/server/applications/notifications/services/notifications-manager.service.spec.js.map +1 -1
  49. package/server/applications/shares/services/shares-manager.service.spec.js +590 -14
  50. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  51. package/server/applications/spaces/guards/space.guard.spec.js +153 -18
  52. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  53. package/server/applications/spaces/services/spaces-browser.service.js +7 -7
  54. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  55. package/server/applications/spaces/services/spaces-manager.service.js +17 -17
  56. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  57. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js +120 -0
  58. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js.map +1 -0
  59. package/server/applications/sync/services/sync-clients-manager.service.spec.js +548 -8
  60. package/server/applications/sync/services/sync-clients-manager.service.spec.js.map +1 -1
  61. package/server/applications/sync/services/sync-manager.service.spec.js +837 -5
  62. package/server/applications/sync/services/sync-manager.service.spec.js.map +1 -1
  63. package/server/applications/sync/services/sync-paths-manager.service.spec.js +900 -7
  64. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  65. package/server/applications/sync/utils/routes.js +1 -1
  66. package/server/applications/sync/utils/routes.js.map +1 -1
  67. package/server/applications/users/guards/permissions.guard.js +4 -4
  68. package/server/applications/users/guards/permissions.guard.js.map +1 -1
  69. package/server/applications/users/guards/permissions.guard.spec.js +6 -6
  70. package/server/applications/users/guards/permissions.guard.spec.js.map +1 -1
  71. package/server/applications/users/guards/roles.guard.js +1 -1
  72. package/server/applications/users/guards/roles.guard.js.map +1 -1
  73. package/server/applications/users/models/user.model.js +1 -1
  74. package/server/applications/users/models/user.model.js.map +1 -1
  75. package/server/applications/users/services/admin-users-manager.service.js +22 -24
  76. package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
  77. package/server/applications/users/services/admin-users-manager.service.spec.js +763 -17
  78. package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
  79. package/server/applications/users/services/users-manager.service.js +1 -1
  80. package/server/applications/users/services/users-manager.service.js.map +1 -1
  81. package/server/applications/users/services/users-manager.service.spec.js +938 -49
  82. package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
  83. package/server/applications/webdav/decorators/if-header.decorator.js +4 -1
  84. package/server/applications/webdav/decorators/if-header.decorator.js.map +1 -1
  85. package/server/applications/webdav/filters/webdav.filter.spec.js +77 -0
  86. package/server/applications/webdav/filters/webdav.filter.spec.js.map +1 -0
  87. package/server/applications/webdav/guards/webdav-protocol.guard.js +3 -7
  88. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  89. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +580 -0
  90. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -0
  91. package/server/applications/webdav/services/webdav-methods.service.spec.js +1582 -3
  92. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  93. package/server/applications/webdav/services/webdav-spaces.service.spec.js +390 -2
  94. package/server/applications/webdav/services/webdav-spaces.service.spec.js.map +1 -1
  95. package/server/applications/webdav/webdav.controller.js +2 -2
  96. package/server/applications/webdav/webdav.controller.js.map +1 -1
  97. package/server/authentication/guards/auth-basic.guard.js.map +1 -1
  98. package/server/authentication/guards/auth-basic.guard.spec.js +38 -2
  99. package/server/authentication/guards/auth-basic.guard.spec.js.map +1 -1
  100. package/server/authentication/guards/auth-basic.strategy.js +0 -1
  101. package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
  102. package/server/authentication/guards/auth-digest.guard.js +1 -2
  103. package/server/authentication/guards/auth-digest.guard.js.map +1 -1
  104. package/server/authentication/guards/auth-local.guard.js.map +1 -1
  105. package/server/authentication/guards/auth-local.guard.spec.js +7 -5
  106. package/server/authentication/guards/auth-local.guard.spec.js.map +1 -1
  107. package/server/authentication/guards/auth-local.strategy.js +0 -1
  108. package/server/authentication/guards/auth-local.strategy.js.map +1 -1
  109. package/server/authentication/guards/auth-token-access.guard.spec.js +30 -0
  110. package/server/authentication/guards/auth-token-access.guard.spec.js.map +1 -1
  111. package/server/authentication/guards/auth-token-access.strategy.js +0 -1
  112. package/server/authentication/guards/auth-token-access.strategy.js.map +1 -1
  113. package/server/authentication/guards/auth-token-refresh.strategy.js +0 -1
  114. package/server/authentication/guards/auth-token-refresh.strategy.js.map +1 -1
  115. package/server/authentication/services/auth-methods/auth-method-database.service.js +1 -1
  116. package/server/authentication/services/auth-methods/auth-method-database.service.js.map +1 -1
  117. package/server/authentication/services/auth-methods/auth-method-database.service.spec.js +8 -6
  118. package/server/authentication/services/auth-methods/auth-method-database.service.spec.js.map +1 -1
  119. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +2 -2
  120. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
  121. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js +500 -5
  122. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js.map +1 -1
  123. package/server/configuration/config.loader.js +0 -3
  124. package/server/configuration/config.loader.js.map +1 -1
  125. package/server/infrastructure/context/interceptors/context.interceptor.spec.js +135 -0
  126. package/server/infrastructure/context/interceptors/context.interceptor.spec.js.map +1 -0
  127. package/server/infrastructure/context/services/context-manager.service.spec.js +98 -0
  128. package/server/infrastructure/context/services/context-manager.service.spec.js.map +1 -0
  129. package/server/infrastructure/database/constants.js +0 -1
  130. package/server/infrastructure/database/constants.js.map +1 -1
  131. package/server/infrastructure/database/scripts/seed/usersgroups.js +3 -3
  132. package/server/infrastructure/database/scripts/seed/usersgroups.js.map +1 -1
  133. package/server/infrastructure/mailer/mailer.service.js +20 -19
  134. package/server/infrastructure/mailer/mailer.service.js.map +1 -1
  135. package/server/infrastructure/mailer/mailer.service.spec.js +176 -0
  136. package/server/infrastructure/mailer/mailer.service.spec.js.map +1 -0
  137. package/static/3rdpartylicenses.txt +26 -26
  138. package/static/assets/pdfjs/build/pdf.mjs +1177 -255
  139. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  140. package/static/assets/pdfjs/build/pdf.sandbox.mjs +25 -2
  141. package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
  142. package/static/assets/pdfjs/build/pdf.worker.mjs +140 -16
  143. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  144. package/static/assets/pdfjs/version +1 -1
  145. package/static/assets/pdfjs/web/debugger.css +31 -0
  146. package/static/assets/pdfjs/web/debugger.mjs +144 -2
  147. package/static/assets/pdfjs/web/images/comment-editButton.svg +6 -1
  148. package/static/assets/pdfjs/web/locale/ach/viewer.ftl +0 -63
  149. package/static/assets/pdfjs/web/locale/af/viewer.ftl +0 -71
  150. package/static/assets/pdfjs/web/locale/an/viewer.ftl +0 -63
  151. package/static/assets/pdfjs/web/locale/ast/viewer.ftl +0 -60
  152. package/static/assets/pdfjs/web/locale/az/viewer.ftl +0 -63
  153. package/static/assets/pdfjs/web/locale/be/viewer.ftl +38 -0
  154. package/static/assets/pdfjs/web/locale/bg/viewer.ftl +0 -37
  155. package/static/assets/pdfjs/web/locale/bn/viewer.ftl +0 -63
  156. package/static/assets/pdfjs/web/locale/bo/viewer.ftl +0 -63
  157. package/static/assets/pdfjs/web/locale/br/viewer.ftl +0 -37
  158. package/static/assets/pdfjs/web/locale/brx/viewer.ftl +0 -63
  159. package/static/assets/pdfjs/web/locale/bs/viewer.ftl +22 -0
  160. package/static/assets/pdfjs/web/locale/ca/viewer.ftl +0 -54
  161. package/static/assets/pdfjs/web/locale/cak/viewer.ftl +0 -54
  162. package/static/assets/pdfjs/web/locale/ckb/viewer.ftl +0 -63
  163. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +38 -0
  164. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +38 -0
  165. package/static/assets/pdfjs/web/locale/da/viewer.ftl +38 -0
  166. package/static/assets/pdfjs/web/locale/de/viewer.ftl +38 -0
  167. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +38 -0
  168. package/static/assets/pdfjs/web/locale/el/viewer.ftl +38 -0
  169. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +38 -0
  170. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +38 -0
  171. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +25 -0
  172. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +38 -0
  173. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +38 -0
  174. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +38 -0
  175. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +0 -6
  176. package/static/assets/pdfjs/web/locale/et/viewer.ftl +0 -57
  177. package/static/assets/pdfjs/web/locale/fa/viewer.ftl +0 -37
  178. package/static/assets/pdfjs/web/locale/ff/viewer.ftl +0 -63
  179. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +38 -0
  180. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +38 -0
  181. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +38 -0
  182. package/static/assets/pdfjs/web/locale/ga-IE/viewer.ftl +0 -71
  183. package/static/assets/pdfjs/web/locale/gd/viewer.ftl +0 -54
  184. package/static/assets/pdfjs/web/locale/gl/viewer.ftl +8 -0
  185. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +38 -0
  186. package/static/assets/pdfjs/web/locale/gu-IN/viewer.ftl +0 -63
  187. package/static/assets/pdfjs/web/locale/he/viewer.ftl +38 -0
  188. package/static/assets/pdfjs/web/locale/hi-IN/viewer.ftl +0 -60
  189. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +38 -0
  190. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +38 -0
  191. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +0 -49
  192. package/static/assets/pdfjs/web/locale/hye/viewer.ftl +0 -60
  193. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +38 -0
  194. package/static/assets/pdfjs/web/locale/is/viewer.ftl +0 -3
  195. package/static/assets/pdfjs/web/locale/it/viewer.ftl +31 -0
  196. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +8 -0
  197. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +48 -10
  198. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +5 -0
  199. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +8 -0
  200. package/static/assets/pdfjs/web/locale/km/viewer.ftl +0 -63
  201. package/static/assets/pdfjs/web/locale/kn/viewer.ftl +0 -71
  202. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -0
  203. package/static/assets/pdfjs/web/locale/lij/viewer.ftl +0 -63
  204. package/static/assets/pdfjs/web/locale/lo/viewer.ftl +0 -54
  205. package/static/assets/pdfjs/web/locale/lt/viewer.ftl +0 -60
  206. package/static/assets/pdfjs/web/locale/ltg/viewer.ftl +0 -63
  207. package/static/assets/pdfjs/web/locale/lv/viewer.ftl +0 -63
  208. package/static/assets/pdfjs/web/locale/meh/viewer.ftl +0 -75
  209. package/static/assets/pdfjs/web/locale/mk/viewer.ftl +0 -63
  210. package/static/assets/pdfjs/web/locale/ml/viewer.ftl +0 -3
  211. package/static/assets/pdfjs/web/locale/mr/viewer.ftl +0 -63
  212. package/static/assets/pdfjs/web/locale/ms/viewer.ftl +0 -63
  213. package/static/assets/pdfjs/web/locale/my/viewer.ftl +0 -71
  214. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +44 -6
  215. package/static/assets/pdfjs/web/locale/ne-NP/viewer.ftl +0 -71
  216. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +38 -0
  217. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +45 -1
  218. package/static/assets/pdfjs/web/locale/oc/viewer.ftl +0 -31
  219. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +38 -0
  220. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -1
  221. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +38 -0
  222. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +355 -1
  223. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +38 -0
  224. package/static/assets/pdfjs/web/locale/sat/viewer.ftl +0 -54
  225. package/static/assets/pdfjs/web/locale/sc/viewer.ftl +0 -38
  226. package/static/assets/pdfjs/web/locale/scn/viewer.ftl +0 -92
  227. package/static/assets/pdfjs/web/locale/sco/viewer.ftl +0 -60
  228. package/static/assets/pdfjs/web/locale/si/viewer.ftl +0 -51
  229. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +38 -0
  230. package/static/assets/pdfjs/web/locale/skr/viewer.ftl +0 -27
  231. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +8 -0
  232. package/static/assets/pdfjs/web/locale/son/viewer.ftl +0 -71
  233. package/static/assets/pdfjs/web/locale/sr/viewer.ftl +0 -33
  234. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +38 -0
  235. package/static/assets/pdfjs/web/locale/szl/viewer.ftl +0 -63
  236. package/static/assets/pdfjs/web/locale/ta/viewer.ftl +0 -63
  237. package/static/assets/pdfjs/web/locale/te/viewer.ftl +0 -60
  238. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +38 -0
  239. package/static/assets/pdfjs/web/locale/tl/viewer.ftl +0 -63
  240. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +40 -2
  241. package/static/assets/pdfjs/web/locale/trs/viewer.ftl +0 -72
  242. package/static/assets/pdfjs/web/locale/ur/viewer.ftl +0 -60
  243. package/static/assets/pdfjs/web/locale/uz/viewer.ftl +0 -71
  244. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +38 -0
  245. package/static/assets/pdfjs/web/locale/wo/viewer.ftl +0 -77
  246. package/static/assets/pdfjs/web/locale/xh/viewer.ftl +0 -71
  247. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +38 -0
  248. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +38 -0
  249. package/static/assets/pdfjs/web/viewer.css +649 -120
  250. package/static/assets/pdfjs/web/viewer.html +19 -0
  251. package/static/assets/pdfjs/web/viewer.mjs +489 -38
  252. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  253. package/static/chunk-22EANI6R.js +1 -0
  254. package/static/{chunk-KFM544CA.js → chunk-2UWN7IQF.js} +1 -1
  255. package/static/{chunk-N3T57OCA.js → chunk-2VSPDSJS.js} +1 -1
  256. package/static/{chunk-HUWQHCUX.js → chunk-34UZ7SYI.js} +1 -1
  257. package/static/{chunk-MWFRZBJD.js → chunk-45UQJGGY.js} +1 -1
  258. package/static/{chunk-LYTD6AJE.js → chunk-5TEXH3LJ.js} +1 -1
  259. package/static/{chunk-4KESSWTF.js → chunk-66FMKVJX.js} +1 -1
  260. package/static/{chunk-XE5YHU5J.js → chunk-BIUNUYZ5.js} +1 -1
  261. package/static/chunk-CK4BY2NX.js +27 -0
  262. package/static/{chunk-QTW62OKJ.js → chunk-CSBDAY77.js} +1 -1
  263. package/static/{chunk-XUZSYWRF.js → chunk-CXXPLBDZ.js} +1 -1
  264. package/static/{chunk-ZTXJC5IC.js → chunk-EILQG525.js} +1 -1
  265. package/static/{chunk-FJFNDK67.js → chunk-ENWABUR4.js} +1 -1
  266. package/static/{chunk-WL65GYD5.js → chunk-FR4AOLYL.js} +4 -4
  267. package/static/chunk-HW2H3ISM.js +559 -0
  268. package/static/{chunk-BW5PQAKK.js → chunk-HYMDGBZL.js} +1 -1
  269. package/static/{chunk-WLPYIJFI.js → chunk-IML5UYQG.js} +1 -1
  270. package/static/{chunk-Z5X7LVMZ.js → chunk-IPSMJHMQ.js} +1 -1
  271. package/static/{chunk-3S4WNZ2T.js → chunk-JVCWYSNP.js} +1 -1
  272. package/static/{chunk-CLSVDV7J.js → chunk-KGPCIUD2.js} +1 -1
  273. package/static/{chunk-O4AQBQBF.js → chunk-KQZJSEM3.js} +1 -1
  274. package/static/{chunk-MK7WZG3F.js → chunk-NPEMJJIU.js} +1 -1
  275. package/static/{chunk-4TEHM3AS.js → chunk-OEFBC4GG.js} +1 -1
  276. package/static/{chunk-O67RFAWU.js → chunk-P734A3XZ.js} +1 -1
  277. package/static/{chunk-SRLMFJ7C.js → chunk-RASR4CK6.js} +1 -1
  278. package/static/{chunk-S5WXHO6D.js → chunk-RFMOUC22.js} +1 -1
  279. package/static/{chunk-TTQ37MUV.js → chunk-RSS6GYNE.js} +1 -1
  280. package/static/{chunk-3FX6ISDY.js → chunk-SBOQGGZX.js} +1 -1
  281. package/static/{chunk-NV2MEIWP.js → chunk-SJAFPXQV.js} +1 -1
  282. package/static/{chunk-PYSFXLMV.js → chunk-XTYGMF2V.js} +1 -1
  283. package/static/{chunk-ZFKCGL6X.js → chunk-YCWMV2YR.js} +1 -1
  284. package/static/{chunk-LB7B5RIV.js → chunk-YGD22MWQ.js} +1 -1
  285. package/static/{chunk-MTRNPGS4.js → chunk-ZC5NIT55.js} +1 -1
  286. package/static/{chunk-SKDQM65G.js → chunk-ZVY37DKS.js} +1 -1
  287. package/static/index.html +2 -2
  288. package/static/main-N5CZRHAO.js +7 -0
  289. package/static/styles-FYUSO6OJ.css +1 -0
  290. package/static/chunk-AY2GOSJ2.js +0 -24
  291. package/static/chunk-RSNLYAN6.js +0 -560
  292. package/static/chunk-ZZ3LHYOY.js +0 -1
  293. package/static/main-RREKR34B.js +0 -10
  294. package/static/styles-3DONJ2Z4.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-manager.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { FilesManager } from '../../files/services/files-manager.service'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { SyncManager } from './sync-manager.service'\nimport { SyncQueries } from './sync-queries.service'\n\ndescribe(SyncManager.name, () => {\n let service: SyncManager\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n SyncManager,\n { provide: SpacesManager, useValue: {} },\n { provide: FilesManager, useValue: {} },\n {\n provide: SyncQueries,\n useValue: {}\n }\n ]\n }).compile()\n\n service = module.get<SyncManager>(SyncManager)\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n})\n"],"names":["describe","SyncManager","name","service","beforeAll","module","Test","createTestingModule","providers","provide","SpacesManager","useValue","FilesManager","SyncQueries","compile","get","it","expect","toBeDefined"],"mappings":"AAAA;;;;CAIC;;;;yBAEmC;qCACP;sCACC;oCACF;oCACA;AAE5BA,SAASC,+BAAW,CAACC,IAAI,EAAE;IACzB,IAAIC;IAEJC,UAAU;QACR,MAAMC,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,WAAW;gBACTP,+BAAW;gBACX;oBAAEQ,SAASC,mCAAa;oBAAEC,UAAU,CAAC;gBAAE;gBACvC;oBAAEF,SAASG,iCAAY;oBAAED,UAAU,CAAC;gBAAE;gBACtC;oBACEF,SAASI,+BAAW;oBACpBF,UAAU,CAAC;gBACb;aACD;QACH,GAAGG,OAAO;QAEVX,UAAUE,OAAOU,GAAG,CAAcd,+BAAW;IAC/C;IAEAe,GAAG,qBAAqB;QACtBC,OAAOd,SAASe,WAAW;IAC7B;AACF"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-manager.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, HttpStatus, StreamableFile } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\n// Helpers to access mocked fs/promises\nimport fsPromisesModule from 'fs/promises'\nimport path from 'node:path'\nimport { FILE_OPERATION } from '../../files/constants/operations'\nimport { FileError } from '../../files/models/file-error'\nimport { LockConflict } from '../../files/models/file-lock-error'\nimport { FilesManager } from '../../files/services/files-manager.service'\nimport { checksumFile, isPathExists, isPathIsDir, removeFiles, touchFile } from '../../files/utils/files'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { F_SPECIAL_STAT, F_STAT, SYNC_CHECKSUM_ALG, SYNC_DIFF_DONE } from '../constants/sync'\nimport { SyncManager } from './sync-manager.service'\nimport { SyncQueries } from './sync-queries.service'\n\n// Mock fs/promises used internally by the service\njest.mock('fs/promises', () => ({\n __esModule: true,\n default: {\n stat: jest.fn(),\n readdir: jest.fn()\n }\n}))\n\n// Mock helper functions used in service\njest.mock('../../files/utils/files', () => ({\n __esModule: true,\n checksumFile: jest.fn(),\n isPathExists: jest.fn(),\n isPathIsDir: jest.fn(),\n removeFiles: jest.fn(),\n touchFile: jest.fn(),\n sanitizePath: jest.fn((p: string) => p)\n}))\n\n// Mock regExpPathPattern to a simple, predictable behavior\njest.mock('../../../common/functions', () => ({\n __esModule: true,\n regExpPathPattern: (base: string) => new RegExp('^' + base.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n}))\n\n// Mock routes helper used by copyMove to bypass repo validation\njest.mock('../utils/routes', () => ({\n __esModule: true,\n SYNC_PATH_TO_SPACE_SEGMENTS: jest.fn((dst: string) => dst)\n}))\n\n// Mock heavy providers to avoid configuration side-effects on import\njest.mock('../../files/services/files-manager.service', () => ({\n __esModule: true,\n FilesManager: class FilesManager {}\n}))\njest.mock('../../spaces/services/spaces-manager.service', () => ({\n __esModule: true,\n SpacesManager: class SpacesManager {}\n}))\njest.mock('./sync-queries.service', () => ({\n __esModule: true,\n SyncQueries: class SyncQueries {}\n}))\n\nconst fsPromises = fsPromisesModule as unknown as { stat: jest.Mock; readdir: jest.Mock }\n\n// small helper to collect async generators\nconst collect = async <T>(iter: AsyncIterable<T>): Promise<T[]> => {\n const out: T[] = []\n for await (const i of iter) out.push(i)\n return out\n}\n\ndescribe(SyncManager.name, () => {\n let service: SyncManager\n let filesManager: {\n sendFileFromSpace: jest.Mock\n saveStream: jest.Mock\n delete: jest.Mock\n touch: jest.Mock\n mkDir: jest.Mock\n mkFile: jest.Mock\n copyMove: jest.Mock\n }\n let spacesManager: { spaceEnv: jest.Mock }\n let syncQueries: { getPathSettings: jest.Mock }\n\n beforeAll(async () => {\n filesManager = {\n sendFileFromSpace: jest.fn(),\n saveStream: jest.fn(),\n delete: jest.fn(),\n touch: jest.fn(),\n mkDir: jest.fn(),\n mkFile: jest.fn(),\n copyMove: jest.fn()\n }\n spacesManager = { spaceEnv: jest.fn() }\n syncQueries = { getPathSettings: jest.fn() }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n SyncManager,\n { provide: SpacesManager, useValue: spacesManager },\n { provide: FilesManager, useValue: filesManager },\n { provide: SyncQueries, useValue: syncQueries }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<SyncManager>(SyncManager)\n })\n\n beforeEach(() => jest.clearAllMocks())\n\n const makeReq = (over?: Partial<any>) => ({\n method: 'PUT',\n user: { id: 1, clientId: 42 },\n space: { realPath: '/base/file.txt', url: '/space/file.txt' },\n ...over\n })\n\n const makeReply = () => {\n const raw = { writeHead: jest.fn(), write: jest.fn(), end: jest.fn() }\n return { raw, status: jest.fn().mockReturnThis() }\n }\n\n describe('download', () => {\n it('should stream file successfully', async () => {\n const req = makeReq()\n const res = makeReply()\n const checks = jest.fn().mockResolvedValue(undefined)\n const stream = jest.fn().mockResolvedValue(new StreamableFile(Buffer.from('abc')))\n filesManager.sendFileFromSpace.mockReturnValue({ checks, stream })\n\n const result = await service.download(req as any, res as any)\n\n expect(filesManager.sendFileFromSpace).toHaveBeenCalledWith(req.space)\n expect(checks).toHaveBeenCalled()\n expect(stream).toHaveBeenCalledWith(req, res)\n expect(result).toBeInstanceOf(StreamableFile)\n })\n\n it.each([\n ['LockConflict maps to 423', new LockConflict(null, 'locked'), HttpStatus.LOCKED],\n ['FileError maps to its http code', new FileError(HttpStatus.BAD_REQUEST, 'bad'), HttpStatus.BAD_REQUEST],\n ['generic Error maps to 500', new Error('oops'), HttpStatus.INTERNAL_SERVER_ERROR]\n ])('should map errors (%s)', async (_title, thrown, expectedStatus) => {\n const req = makeReq()\n const res = makeReply()\n const checks = jest.fn().mockRejectedValue(thrown)\n const stream = jest.fn()\n filesManager.sendFileFromSpace.mockReturnValue({ checks, stream })\n\n await expect(service.download(req as any, res as any)).rejects.toMatchObject({ status: expectedStatus })\n })\n })\n\n describe('upload', () => {\n it('should upload with checksum OK and return ino', async () => {\n const req = makeReq({ space: { realPath: '/tmp/up.bin', url: '/space/up.bin' } })\n const dto = { checksum: 'abc', size: 10, mtime: 1710000000 }\n filesManager.saveStream.mockResolvedValue('abc')\n fsPromises.stat.mockResolvedValue({ size: 10, ino: 123, mtime: new Date(1710000000 * 1000) })\n ;(touchFile as jest.Mock).mockResolvedValue(undefined)\n\n const r = await service.upload(req as any, dto as any)\n expect(filesManager.saveStream).toHaveBeenCalledWith(req.user, req.space, req, { tmpPath: expect.any(String), checksumAlg: SYNC_CHECKSUM_ALG })\n expect(touchFile).toHaveBeenCalledWith('/tmp/up.bin', 1710000000)\n expect(r).toEqual({ ino: 123 })\n expect(removeFiles).not.toHaveBeenCalled()\n })\n\n it('should reject when checksum mismatches and remove tmp', async () => {\n const req = makeReq()\n const dto = { checksum: 'abc', size: 10, mtime: 1710000000 }\n filesManager.saveStream.mockResolvedValue('bad')\n fsPromises.stat.mockResolvedValue({ size: 10, ino: 123, mtime: new Date(1710000000 * 1000) })\n\n await expect(service.upload(req as any, dto as any)).rejects.toBeInstanceOf(HttpException)\n expect(removeFiles).toHaveBeenCalledWith(expect.any(String))\n })\n\n it('should upload without checksum', async () => {\n const req = makeReq({ space: { realPath: '/tmp/up2.bin', url: '/space/up2.bin' } })\n const dto = { size: 5, mtime: 1710000100 }\n filesManager.saveStream.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ size: 5, ino: 321, mtime: new Date(1710000100 * 1000) })\n\n const r = await service.upload(req as any, dto as any)\n expect(filesManager.saveStream).toHaveBeenCalledWith(req.user, req.space, req, { tmpPath: expect.any(String) })\n expect(touchFile).toHaveBeenCalledWith('/tmp/up2.bin', 1710000100)\n expect(r).toEqual({ ino: 321 })\n })\n\n it('should reject when size mismatches and remove tmp', async () => {\n const req = makeReq()\n const dto = { size: 10, mtime: 1710000100 }\n filesManager.saveStream.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ size: 99, ino: 321, mtime: new Date(1710000100 * 1000) })\n\n await expect(service.upload(req as any, dto as any)).rejects.toBeInstanceOf(HttpException)\n expect(removeFiles).toHaveBeenCalledWith(expect.any(String))\n })\n })\n\n describe('delete', () => {\n it('should delete successfully', async () => {\n const req = makeReq()\n filesManager.delete.mockResolvedValue(undefined)\n\n await expect(service.delete(req as any)).resolves.toBeUndefined()\n expect(filesManager.delete).toHaveBeenCalledWith(req.user, req.space)\n })\n\n it('should map errors via handleError', async () => {\n const req = makeReq()\n filesManager.delete.mockRejectedValue(new LockConflict(null, 'locked'))\n\n await expect(service.delete(req as any)).rejects.toMatchObject({ status: HttpStatus.LOCKED })\n })\n })\n\n describe('props', () => {\n it('should touch successfully', async () => {\n const req = makeReq()\n filesManager.touch.mockResolvedValue(undefined)\n\n await expect(service.props(req as any, { mtime: 1710000200 } as any)).resolves.toBeUndefined()\n expect(filesManager.touch).toHaveBeenCalledWith(req.user, req.space, 1710000200, false)\n })\n\n it('should map errors via handleError', async () => {\n const req = makeReq()\n filesManager.touch.mockRejectedValue(new FileError(HttpStatus.BAD_REQUEST, 'bad'))\n\n await expect(service.props(req as any, { mtime: 123 } as any)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST })\n })\n })\n\n describe('make', () => {\n it('should create directory and return ino', async () => {\n const req = makeReq({ space: { realPath: '/tmp/newdir', url: '/space/newdir' } })\n filesManager.mkDir.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ ino: 555 })\n ;(touchFile as jest.Mock).mockResolvedValue(undefined)\n\n const r = await service.make(req as any, { type: 'directory', mtime: 1710000300 } as any)\n expect(filesManager.mkDir).toHaveBeenCalledWith(req.user, req.space, true)\n expect(touchFile).toHaveBeenCalledWith('/tmp/newdir', 1710000300)\n expect(r).toEqual({ ino: 555 })\n })\n\n it('should create file and return ino', async () => {\n const req = makeReq({ space: { realPath: '/tmp/newfile', url: '/space/newfile' } })\n filesManager.mkFile.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ ino: 777 })\n\n const r = await service.make(req as any, { type: 'file', mtime: 1710000400 } as any)\n expect(filesManager.mkFile).toHaveBeenCalledWith(req.user, req.space, true)\n expect(touchFile).toHaveBeenCalledWith('/tmp/newfile', 1710000400)\n expect(r).toEqual({ ino: 777 })\n })\n\n it('should map errors via handleError', async () => {\n const req = makeReq()\n filesManager.mkDir.mockRejectedValue(new LockConflict(null, 'locked'))\n\n await expect(service.make(req as any, { type: 'directory', mtime: 0 } as any)).rejects.toMatchObject({ status: HttpStatus.LOCKED })\n })\n })\n\n describe('copyMove', () => {\n it('should move (no return) and not touch mtime', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/moved', url: '/space/dst/moved' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockResolvedValue(undefined)\n\n const r = await service.copyMove(req as any, { destination: '/dst/moved' } as any, true)\n expect(spacesManager.spaceEnv).toHaveBeenCalled()\n expect(filesManager.copyMove).toHaveBeenCalledWith(req.user, req.space, dstSpace, true, true, true)\n expect(touchFile).not.toHaveBeenCalled()\n expect(r).toBeUndefined()\n })\n\n it('should copy, touch mtime when provided, and return ino/mtime', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/copied', url: '/space/dst/copied' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ ino: 999, mtime: new Date(1710000500 * 1000) })\n\n const r = await service.copyMove(req as any, { destination: '/dst/copied', mtime: 1710000500 } as any, false)\n expect(filesManager.copyMove).toHaveBeenCalledWith(req.user, req.space, dstSpace, false, true, true)\n expect(touchFile).toHaveBeenCalledWith('/dst/copied', 1710000500)\n expect(r).toEqual({ ino: 999, mtime: 1710000500 })\n })\n\n it('should copy without mtime and still return ino/mtime', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/copied2', url: '/space/dst/copied2' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ ino: 1001, mtime: new Date(1710000600 * 1000) })\n\n const r = await service.copyMove(req as any, { destination: '/dst/copied2' } as any, false)\n expect(touchFile).not.toHaveBeenCalled()\n expect(r).toEqual({ ino: 1001, mtime: 1710000600 })\n })\n\n it('should map errors via handleError', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/err', url: '/space/dst/err' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockRejectedValue(new FileError(HttpStatus.BAD_REQUEST, 'bad'))\n\n await expect(service.copyMove(req as any, { destination: '/dst/err' } as any, false)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST })\n })\n\n it('should map errors via handleError for move (isMove=true)', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/err-move', url: '/space/dst/err-move' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockRejectedValue(new LockConflict(null, 'locked'))\n\n const spy = jest.spyOn(service as any, 'handleError')\n\n await expect(service.copyMove(req as any, { destination: '/dst/err-move' } as any, true)).rejects.toMatchObject({\n status: HttpStatus.LOCKED\n })\n\n expect(spy).toHaveBeenCalledWith(req.space, FILE_OPERATION.MOVE, expect.anything(), dstSpace)\n })\n })\n\n describe('parseSyncPath', () => {\n it('should delegate to parseFiles and yield file stats from the base directory', async () => {\n const base = '/base-sync'\n const space = { realPath: base, url: '/space-sync', quotaIsExceeded: false }\n const dirent = { name: 'afile', parentPath: base, isDirectory: () => false, isFile: () => true }\n fsPromises.readdir.mockResolvedValue([dirent])\n fsPromises.stat.mockResolvedValue({ isDirectory: () => false, isFile: () => true, size: 42, ino: 7, mtime: new Date(1234 * 1000) })\n\n const syncDiff: any = { defaultFilters: new Set(), secureDiff: false, firstSync: true, snapshot: new Map() }\n\n const out = await collect<Record<string, any>>((service as any).parseSyncPath(space, syncDiff))\n\n expect(out.length).toBe(1)\n expect(out[0]).toHaveProperty('/afile')\n const stats = out[0]['/afile']\n expect(Array.isArray(stats)).toBe(true)\n expect(stats[F_STAT.IS_DIR]).toBe(false)\n expect(stats[F_STAT.SIZE]).toBe(42)\n expect(stats[F_STAT.MTIME]).toBe(1234)\n expect(stats[F_STAT.INO]).toBe(7)\n expect(stats[F_STAT.CHECKSUM]).toBeNull()\n })\n })\n\n describe('diff', () => {\n it('should fail when clientId is missing', async () => {\n const res = makeReply()\n await expect(service.diff({ id: 1 } as any, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST })\n })\n\n it('should fail when path settings not found', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue(undefined)\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.NOT_FOUND })\n })\n\n it('should map spaceEnv thrown error to BAD_REQUEST', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockRejectedValue(new Error('boom'))\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST, message: 'boom' })\n })\n\n it('should fail when space not found', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockResolvedValue(undefined)\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.NOT_FOUND })\n })\n\n it('should fail when space quota exceeded', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockResolvedValue({ realPath: '/base', url: '/space', quotaIsExceeded: true })\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.INSUFFICIENT_STORAGE })\n })\n\n it('should fail when remote path does not exist', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockResolvedValue({ realPath: '/base', url: '/space', quotaIsExceeded: false })\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({\n status: HttpStatus.NOT_FOUND,\n message: 'Remote path not found : /base'\n })\n })\n\n it('should fail when remote path is not a directory', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockResolvedValue({ realPath: '/base', url: '/space', quotaIsExceeded: false })\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(isPathIsDir as jest.Mock).mockResolvedValue(false)\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Remote path must be a directory'\n })\n })\n\n it('should stream diff results successfully', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n const space = { realPath: '/base', url: '/space', quotaIsExceeded: false }\n spacesManager.spaceEnv.mockResolvedValue(space)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(isPathIsDir as jest.Mock).mockResolvedValue(true)\n\n const gen = async function* () {\n yield { '/file1': [false, 1, 2, 3, 'x'] }\n yield { '/file2': [true, 0, 2, 4, null] }\n }\n jest.spyOn(service as any, 'parseSyncPath').mockImplementation(() => gen())\n\n await service.diff(user, 1, { secureDiff: false } as any, res as any)\n\n expect(res.raw.writeHead).toHaveBeenCalledWith(200, {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Transfer-Encoding': 'chunked'\n })\n expect(res.raw.write).toHaveBeenCalledWith(`${JSON.stringify({ '/file1': [false, 1, 2, 3, 'x'] })}\\n`)\n expect(res.raw.write).toHaveBeenCalledWith(`${JSON.stringify({ '/file2': [true, 0, 2, 4, null] })}\\n`)\n expect(res.raw.write).toHaveBeenCalledWith(SYNC_DIFF_DONE)\n expect(res.raw.end).toHaveBeenCalled()\n })\n\n it('should handle error during streaming and set status 500', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n const space = { realPath: '/base', url: '/space', quotaIsExceeded: false }\n spacesManager.spaceEnv.mockResolvedValue(space)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(isPathIsDir as jest.Mock).mockResolvedValue(true)\n\n jest.spyOn(service as any, 'parseSyncPath').mockImplementation(() => {\n throw new Error('parse error')\n })\n\n await service.diff(user, 1, {} as any, res as any)\n\n expect(res.raw.write).toHaveBeenCalledWith('parse error\\n')\n expect(res.status).toHaveBeenCalledWith(HttpStatus.INTERNAL_SERVER_ERROR)\n expect(res.raw.end).toHaveBeenCalled()\n })\n })\n\n describe('internal parseFiles/analyzeFile coverage', () => {\n const makeDirent = (name: string, parentPath: string, kind: 'dir' | 'file' | 'other') => ({\n name,\n parentPath,\n isDirectory: () => kind === 'dir',\n isFile: () => kind === 'file'\n })\n\n it('should walk directory, ignore special files, filter by name/path, reuse snapshot checksum, and compute checksum when needed', async () => {\n const base = '/base'\n const ctx: any = {\n regexBasePath: new RegExp('^/base'),\n syncDiff: {\n defaultFilters: new Set<string>(['ignoredName']),\n pathFilters: /file2/,\n secureDiff: true,\n firstSync: false,\n snapshot: new Map<string, any>([['/file3', [false, 100, 1000, 33, 'snaphash']]])\n }\n }\n\n fsPromises.readdir.mockImplementation(async (dir: string) => {\n if (dir === base) {\n return [\n makeDirent('special', base, 'other'),\n makeDirent('dir1', base, 'dir'),\n makeDirent('ignoredName', base, 'file'),\n makeDirent('fileStatError', base, 'file'),\n makeDirent('file2', base, 'file'),\n makeDirent('file3', base, 'file'),\n makeDirent('file4', base, 'file')\n ]\n }\n if (dir === path.join(base, 'dir1')) return []\n return []\n })\n\n const mtimeDate = new Date(1000 * 1000)\n fsPromises.stat.mockImplementation(async (p: string) => {\n switch (p) {\n case path.join(base, 'dir1'):\n return { isDirectory: () => true, isFile: () => false, size: 0, ino: 11, mtime: mtimeDate }\n case path.join(base, 'fileStatError'):\n throw new Error('stat fail')\n case path.join(base, 'file2'):\n return { isDirectory: () => false, isFile: () => true, size: 10, ino: 22, mtime: mtimeDate }\n case path.join(base, 'file3'):\n return { isDirectory: () => false, isFile: () => true, size: 100, ino: 33, mtime: new Date(1000 * 1000) }\n case path.join(base, 'file4'):\n return { isDirectory: () => false, isFile: () => true, size: 200, ino: 44, mtime: new Date(2000 * 1000) }\n default:\n return { isDirectory: () => false, isFile: () => false, size: 0, ino: 0, mtime: new Date() }\n }\n })\n ;(checksumFile as jest.Mock).mockResolvedValue('computed-hash')\n\n const results = await collect<Record<string, any>>((service as any).parseFiles(base, ctx))\n\n const keys = results.map((o) => Object.keys(o)[0]).sort()\n expect(keys).toEqual(['/dir1', '/file2', '/file3', '/file4', '/fileStatError'])\n\n const fileStatError = results.find((o) => o['/fileStatError'])\n expect(fileStatError?.['/fileStatError'][0]).toBe(F_SPECIAL_STAT.ERROR)\n expect(fileStatError?.['/fileStatError'][1]).toContain('stat fail')\n\n const filtered = results.find((o) => o['/file2'])\n expect(filtered?.['/file2'][0]).toBe(F_SPECIAL_STAT.FILTERED)\n\n const reused = results.find((o) => o['/file3'])?.['/file3']\n expect(reused[F_STAT.CHECKSUM]).toBe('snaphash')\n expect(checksumFile).toHaveBeenCalledTimes(1)\n\n const computed = results.find((o) => o['/file4'])?.['/file4']\n expect(computed[F_STAT.CHECKSUM]).toBe('computed-hash')\n })\n\n it('should throw a generic error when readdir fails', async () => {\n fsPromises.readdir.mockRejectedValue(new Error('readdir fail'))\n\n const ctx: any = { regexBasePath: /./, syncDiff: { defaultFilters: new Set(), secureDiff: false } }\n const iter = (service as any).parseFiles('/any', ctx)\n\n await expect(\n (async () => {\n for await (const _ of iter) {\n /* consume */\n }\n })()\n ).rejects.toThrow('Unable to parse path')\n })\n\n it('should return ERROR when checkSumFile throws during analyzeFile', async () => {\n const base = '/base'\n const dirent = { name: 'badfile', parentPath: base, isDirectory: () => false, isFile: () => true }\n\n fsPromises.readdir.mockImplementation(async (dir: string) => (dir === base ? [dirent] : []))\n fsPromises.stat.mockResolvedValue({ isDirectory: () => false, isFile: () => true, size: 10, ino: 42, mtime: new Date(1234 * 1000) })\n\n jest.spyOn(service as any, 'checkSumFile').mockRejectedValue(new Error('checksum fail'))\n\n const ctx: any = {\n regexBasePath: new RegExp('^/base'),\n syncDiff: { defaultFilters: new Set<string>(), pathFilters: undefined, secureDiff: true, firstSync: false, snapshot: new Map<string, any>() }\n }\n\n const results = await collect<Record<string, any>>((service as any).parseFiles(base, ctx))\n\n expect(results).toHaveLength(1)\n expect(results[0]).toHaveProperty('/badfile')\n const out = results[0]['/badfile']\n expect(Array.isArray(out)).toBe(true)\n expect(out[0]).toBe(F_SPECIAL_STAT.ERROR)\n expect(String(out[1])).toContain('checksum fail')\n })\n })\n})\n"],"names":["jest","mock","__esModule","default","stat","fn","readdir","checksumFile","isPathExists","isPathIsDir","removeFiles","touchFile","sanitizePath","p","regExpPathPattern","base","RegExp","replace","SYNC_PATH_TO_SPACE_SEGMENTS","dst","FilesManager","SpacesManager","SyncQueries","fsPromises","fsPromisesModule","collect","iter","out","i","push","describe","SyncManager","name","service","filesManager","spacesManager","syncQueries","beforeAll","sendFileFromSpace","saveStream","delete","touch","mkDir","mkFile","copyMove","spaceEnv","getPathSettings","module","Test","createTestingModule","providers","provide","useValue","compile","useLogger","get","beforeEach","clearAllMocks","makeReq","over","method","user","id","clientId","space","realPath","url","makeReply","raw","writeHead","write","end","status","mockReturnThis","it","req","res","checks","mockResolvedValue","undefined","stream","StreamableFile","Buffer","from","mockReturnValue","result","download","expect","toHaveBeenCalledWith","toHaveBeenCalled","toBeInstanceOf","each","LockConflict","HttpStatus","LOCKED","FileError","BAD_REQUEST","Error","INTERNAL_SERVER_ERROR","_title","thrown","expectedStatus","mockRejectedValue","rejects","toMatchObject","dto","checksum","size","mtime","ino","Date","r","upload","tmpPath","any","String","checksumAlg","SYNC_CHECKSUM_ALG","toEqual","not","HttpException","resolves","toBeUndefined","props","make","type","dstSpace","destination","spy","spyOn","FILE_OPERATION","MOVE","anything","quotaIsExceeded","dirent","parentPath","isDirectory","isFile","syncDiff","defaultFilters","Set","secureDiff","firstSync","snapshot","Map","parseSyncPath","length","toBe","toHaveProperty","stats","Array","isArray","F_STAT","IS_DIR","SIZE","MTIME","INO","CHECKSUM","toBeNull","diff","NOT_FOUND","remotePath","message","INSUFFICIENT_STORAGE","gen","mockImplementation","JSON","stringify","SYNC_DIFF_DONE","makeDirent","kind","ctx","regexBasePath","pathFilters","dir","path","join","mtimeDate","results","parseFiles","keys","map","o","Object","sort","fileStatError","find","F_SPECIAL_STAT","ERROR","toContain","filtered","FILTERED","reused","toHaveBeenCalledTimes","computed","_","toThrow","toHaveLength"],"mappings":"AAAA;;;;CAIC;;;;wBAEyD;yBACtB;iEAEP;iEACZ;4BACc;2BACL;+BACG;qCACA;uBACmD;sCAClD;sBAC4C;oCAC9C;oCACA;;;;;;AAE5B,kDAAkD;AAClDA,KAAKC,IAAI,CAAC,eAAe,IAAO,CAAA;QAC9BC,YAAY;QACZC,SAAS;YACPC,MAAMJ,KAAKK,EAAE;YACbC,SAASN,KAAKK,EAAE;QAClB;IACF,CAAA;AAEA,wCAAwC;AACxCL,KAAKC,IAAI,CAAC,2BAA2B,IAAO,CAAA;QAC1CC,YAAY;QACZK,cAAcP,KAAKK,EAAE;QACrBG,cAAcR,KAAKK,EAAE;QACrBI,aAAaT,KAAKK,EAAE;QACpBK,aAAaV,KAAKK,EAAE;QACpBM,WAAWX,KAAKK,EAAE;QAClBO,cAAcZ,KAAKK,EAAE,CAAC,CAACQ,IAAcA;IACvC,CAAA;AAEA,2DAA2D;AAC3Db,KAAKC,IAAI,CAAC,6BAA6B,IAAO,CAAA;QAC5CC,YAAY;QACZY,mBAAmB,CAACC,OAAiB,IAAIC,OAAO,MAAMD,KAAKE,OAAO,CAAC,uBAAuB;IAC5F,CAAA;AAEA,gEAAgE;AAChEjB,KAAKC,IAAI,CAAC,mBAAmB,IAAO,CAAA;QAClCC,YAAY;QACZgB,6BAA6BlB,KAAKK,EAAE,CAAC,CAACc,MAAgBA;IACxD,CAAA;AAEA,qEAAqE;AACrEnB,KAAKC,IAAI,CAAC,8CAA8C,IAAO,CAAA;QAC7DC,YAAY;QACZkB,cAAc,MAAMA;QAAc;IACpC,CAAA;AACApB,KAAKC,IAAI,CAAC,gDAAgD,IAAO,CAAA;QAC/DC,YAAY;QACZmB,eAAe,MAAMA;QAAe;IACtC,CAAA;AACArB,KAAKC,IAAI,CAAC,0BAA0B,IAAO,CAAA;QACzCC,YAAY;QACZoB,aAAa,MAAMA;QAAa;IAClC,CAAA;AAEA,MAAMC,aAAaC,iBAAgB;AAEnC,2CAA2C;AAC3C,MAAMC,UAAU,OAAUC;IACxB,MAAMC,MAAW,EAAE;IACnB,WAAW,MAAMC,KAAKF,KAAMC,IAAIE,IAAI,CAACD;IACrC,OAAOD;AACT;AAEAG,SAASC,+BAAW,CAACC,IAAI,EAAE;IACzB,IAAIC;IACJ,IAAIC;IASJ,IAAIC;IACJ,IAAIC;IAEJC,UAAU;QACRH,eAAe;YACbI,mBAAmBtC,KAAKK,EAAE;YAC1BkC,YAAYvC,KAAKK,EAAE;YACnBmC,QAAQxC,KAAKK,EAAE;YACfoC,OAAOzC,KAAKK,EAAE;YACdqC,OAAO1C,KAAKK,EAAE;YACdsC,QAAQ3C,KAAKK,EAAE;YACfuC,UAAU5C,KAAKK,EAAE;QACnB;QACA8B,gBAAgB;YAAEU,UAAU7C,KAAKK,EAAE;QAAG;QACtC+B,cAAc;YAAEU,iBAAiB9C,KAAKK,EAAE;QAAG;QAE3C,MAAM0C,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,WAAW;gBACTnB,+BAAW;gBACX;oBAAEoB,SAAS9B,mCAAa;oBAAE+B,UAAUjB;gBAAc;gBAClD;oBAAEgB,SAAS/B,iCAAY;oBAAEgC,UAAUlB;gBAAa;gBAChD;oBAAEiB,SAAS7B,+BAAW;oBAAE8B,UAAUhB;gBAAY;aAC/C;QACH,GAAGiB,OAAO;QAEVN,OAAOO,SAAS,CAAC;YAAC;SAAQ;QAC1BrB,UAAUc,OAAOQ,GAAG,CAAcxB,+BAAW;IAC/C;IAEAyB,WAAW,IAAMxD,KAAKyD,aAAa;IAEnC,MAAMC,UAAU,CAACC,OAAyB,CAAA;YACxCC,QAAQ;YACRC,MAAM;gBAAEC,IAAI;gBAAGC,UAAU;YAAG;YAC5BC,OAAO;gBAAEC,UAAU;gBAAkBC,KAAK;YAAkB;YAC5D,GAAGP,IAAI;QACT,CAAA;IAEA,MAAMQ,YAAY;QAChB,MAAMC,MAAM;YAAEC,WAAWrE,KAAKK,EAAE;YAAIiE,OAAOtE,KAAKK,EAAE;YAAIkE,KAAKvE,KAAKK,EAAE;QAAG;QACrE,OAAO;YAAE+D;YAAKI,QAAQxE,KAAKK,EAAE,GAAGoE,cAAc;QAAG;IACnD;IAEA3C,SAAS,YAAY;QACnB4C,GAAG,mCAAmC;YACpC,MAAMC,MAAMjB;YACZ,MAAMkB,MAAMT;YACZ,MAAMU,SAAS7E,KAAKK,EAAE,GAAGyE,iBAAiB,CAACC;YAC3C,MAAMC,SAAShF,KAAKK,EAAE,GAAGyE,iBAAiB,CAAC,IAAIG,sBAAc,CAACC,OAAOC,IAAI,CAAC;YAC1EjD,aAAaI,iBAAiB,CAAC8C,eAAe,CAAC;gBAAEP;gBAAQG;YAAO;YAEhE,MAAMK,SAAS,MAAMpD,QAAQqD,QAAQ,CAACX,KAAYC;YAElDW,OAAOrD,aAAaI,iBAAiB,EAAEkD,oBAAoB,CAACb,IAAIX,KAAK;YACrEuB,OAAOV,QAAQY,gBAAgB;YAC/BF,OAAOP,QAAQQ,oBAAoB,CAACb,KAAKC;YACzCW,OAAOF,QAAQK,cAAc,CAACT,sBAAc;QAC9C;QAEAP,GAAGiB,IAAI,CAAC;YACN;gBAAC;gBAA4B,IAAIC,2BAAY,CAAC,MAAM;gBAAWC,kBAAU,CAACC,MAAM;aAAC;YACjF;gBAAC;gBAAmC,IAAIC,oBAAS,CAACF,kBAAU,CAACG,WAAW,EAAE;gBAAQH,kBAAU,CAACG,WAAW;aAAC;YACzG;gBAAC;gBAA6B,IAAIC,MAAM;gBAASJ,kBAAU,CAACK,qBAAqB;aAAC;SACnF,EAAE,0BAA0B,OAAOC,QAAQC,QAAQC;YAClD,MAAM1B,MAAMjB;YACZ,MAAMkB,MAAMT;YACZ,MAAMU,SAAS7E,KAAKK,EAAE,GAAGiG,iBAAiB,CAACF;YAC3C,MAAMpB,SAAShF,KAAKK,EAAE;YACtB6B,aAAaI,iBAAiB,CAAC8C,eAAe,CAAC;gBAAEP;gBAAQG;YAAO;YAEhE,MAAMO,OAAOtD,QAAQqD,QAAQ,CAACX,KAAYC,MAAa2B,OAAO,CAACC,aAAa,CAAC;gBAAEhC,QAAQ6B;YAAe;QACxG;IACF;IAEAvE,SAAS,UAAU;QACjB4C,GAAG,iDAAiD;YAClD,MAAMC,MAAMjB,QAAQ;gBAAEM,OAAO;oBAAEC,UAAU;oBAAeC,KAAK;gBAAgB;YAAE;YAC/E,MAAMuC,MAAM;gBAAEC,UAAU;gBAAOC,MAAM;gBAAIC,OAAO;YAAW;YAC3D1E,aAAaK,UAAU,CAACuC,iBAAiB,CAAC;YAC1CvD,WAAWnB,IAAI,CAAC0E,iBAAiB,CAAC;gBAAE6B,MAAM;gBAAIE,KAAK;gBAAKD,OAAO,IAAIE,KAAK,aAAa;YAAM;YACzFnG,gBAAS,CAAemE,iBAAiB,CAACC;YAE5C,MAAMgC,IAAI,MAAM9E,QAAQ+E,MAAM,CAACrC,KAAY8B;YAC3ClB,OAAOrD,aAAaK,UAAU,EAAEiD,oBAAoB,CAACb,IAAId,IAAI,EAAEc,IAAIX,KAAK,EAAEW,KAAK;gBAAEsC,SAAS1B,OAAO2B,GAAG,CAACC;gBAASC,aAAaC,uBAAiB;YAAC;YAC7I9B,OAAO5E,gBAAS,EAAE6E,oBAAoB,CAAC,eAAe;YACtDD,OAAOwB,GAAGO,OAAO,CAAC;gBAAET,KAAK;YAAI;YAC7BtB,OAAO7E,kBAAW,EAAE6G,GAAG,CAAC9B,gBAAgB;QAC1C;QAEAf,GAAG,yDAAyD;YAC1D,MAAMC,MAAMjB;YACZ,MAAM+C,MAAM;gBAAEC,UAAU;gBAAOC,MAAM;gBAAIC,OAAO;YAAW;YAC3D1E,aAAaK,UAAU,CAACuC,iBAAiB,CAAC;YAC1CvD,WAAWnB,IAAI,CAAC0E,iBAAiB,CAAC;gBAAE6B,MAAM;gBAAIE,KAAK;gBAAKD,OAAO,IAAIE,KAAK,aAAa;YAAM;YAE3F,MAAMvB,OAAOtD,QAAQ+E,MAAM,CAACrC,KAAY8B,MAAaF,OAAO,CAACb,cAAc,CAAC8B,qBAAa;YACzFjC,OAAO7E,kBAAW,EAAE8E,oBAAoB,CAACD,OAAO2B,GAAG,CAACC;QACtD;QAEAzC,GAAG,kCAAkC;YACnC,MAAMC,MAAMjB,QAAQ;gBAAEM,OAAO;oBAAEC,UAAU;oBAAgBC,KAAK;gBAAiB;YAAE;YACjF,MAAMuC,MAAM;gBAAEE,MAAM;gBAAGC,OAAO;YAAW;YACzC1E,aAAaK,UAAU,CAACuC,iBAAiB,CAACC;YAC1CxD,WAAWnB,IAAI,CAAC0E,iBAAiB,CAAC;gBAAE6B,MAAM;gBAAGE,KAAK;gBAAKD,OAAO,IAAIE,KAAK,aAAa;YAAM;YAE1F,MAAMC,IAAI,MAAM9E,QAAQ+E,MAAM,CAACrC,KAAY8B;YAC3ClB,OAAOrD,aAAaK,UAAU,EAAEiD,oBAAoB,CAACb,IAAId,IAAI,EAAEc,IAAIX,KAAK,EAAEW,KAAK;gBAAEsC,SAAS1B,OAAO2B,GAAG,CAACC;YAAQ;YAC7G5B,OAAO5E,gBAAS,EAAE6E,oBAAoB,CAAC,gBAAgB;YACvDD,OAAOwB,GAAGO,OAAO,CAAC;gBAAET,KAAK;YAAI;QAC/B;QAEAnC,GAAG,qDAAqD;YACtD,MAAMC,MAAMjB;YACZ,MAAM+C,MAAM;gBAAEE,MAAM;gBAAIC,OAAO;YAAW;YAC1C1E,aAAaK,UAAU,CAACuC,iBAAiB,CAACC;YAC1CxD,WAAWnB,IAAI,CAAC0E,iBAAiB,CAAC;gBAAE6B,MAAM;gBAAIE,KAAK;gBAAKD,OAAO,IAAIE,KAAK,aAAa;YAAM;YAE3F,MAAMvB,OAAOtD,QAAQ+E,MAAM,CAACrC,KAAY8B,MAAaF,OAAO,CAACb,cAAc,CAAC8B,qBAAa;YACzFjC,OAAO7E,kBAAW,EAAE8E,oBAAoB,CAACD,OAAO2B,GAAG,CAACC;QACtD;IACF;IAEArF,SAAS,UAAU;QACjB4C,GAAG,8BAA8B;YAC/B,MAAMC,MAAMjB;YACZxB,aAAaM,MAAM,CAACsC,iBAAiB,CAACC;YAEtC,MAAMQ,OAAOtD,QAAQO,MAAM,CAACmC,MAAa8C,QAAQ,CAACC,aAAa;YAC/DnC,OAAOrD,aAAaM,MAAM,EAAEgD,oBAAoB,CAACb,IAAId,IAAI,EAAEc,IAAIX,KAAK;QACtE;QAEAU,GAAG,qCAAqC;YACtC,MAAMC,MAAMjB;YACZxB,aAAaM,MAAM,CAAC8D,iBAAiB,CAAC,IAAIV,2BAAY,CAAC,MAAM;YAE7D,MAAML,OAAOtD,QAAQO,MAAM,CAACmC,MAAa4B,OAAO,CAACC,aAAa,CAAC;gBAAEhC,QAAQqB,kBAAU,CAACC,MAAM;YAAC;QAC7F;IACF;IAEAhE,SAAS,SAAS;QAChB4C,GAAG,6BAA6B;YAC9B,MAAMC,MAAMjB;YACZxB,aAAaO,KAAK,CAACqC,iBAAiB,CAACC;YAErC,MAAMQ,OAAOtD,QAAQ0F,KAAK,CAAChD,KAAY;gBAAEiC,OAAO;YAAW,IAAWa,QAAQ,CAACC,aAAa;YAC5FnC,OAAOrD,aAAaO,KAAK,EAAE+C,oBAAoB,CAACb,IAAId,IAAI,EAAEc,IAAIX,KAAK,EAAE,YAAY;QACnF;QAEAU,GAAG,qCAAqC;YACtC,MAAMC,MAAMjB;YACZxB,aAAaO,KAAK,CAAC6D,iBAAiB,CAAC,IAAIP,oBAAS,CAACF,kBAAU,CAACG,WAAW,EAAE;YAE3E,MAAMT,OAAOtD,QAAQ0F,KAAK,CAAChD,KAAY;gBAAEiC,OAAO;YAAI,IAAWL,OAAO,CAACC,aAAa,CAAC;gBAAEhC,QAAQqB,kBAAU,CAACG,WAAW;YAAC;QACxH;IACF;IAEAlE,SAAS,QAAQ;QACf4C,GAAG,0CAA0C;YAC3C,MAAMC,MAAMjB,QAAQ;gBAAEM,OAAO;oBAAEC,UAAU;oBAAeC,KAAK;gBAAgB;YAAE;YAC/EhC,aAAaQ,KAAK,CAACoC,iBAAiB,CAACC;YACrCxD,WAAWnB,IAAI,CAAC0E,iBAAiB,CAAC;gBAAE+B,KAAK;YAAI;YAC3ClG,gBAAS,CAAemE,iBAAiB,CAACC;YAE5C,MAAMgC,IAAI,MAAM9E,QAAQ2F,IAAI,CAACjD,KAAY;gBAAEkD,MAAM;gBAAajB,OAAO;YAAW;YAChFrB,OAAOrD,aAAaQ,KAAK,EAAE8C,oBAAoB,CAACb,IAAId,IAAI,EAAEc,IAAIX,KAAK,EAAE;YACrEuB,OAAO5E,gBAAS,EAAE6E,oBAAoB,CAAC,eAAe;YACtDD,OAAOwB,GAAGO,OAAO,CAAC;gBAAET,KAAK;YAAI;QAC/B;QAEAnC,GAAG,qCAAqC;YACtC,MAAMC,MAAMjB,QAAQ;gBAAEM,OAAO;oBAAEC,UAAU;oBAAgBC,KAAK;gBAAiB;YAAE;YACjFhC,aAAaS,MAAM,CAACmC,iBAAiB,CAACC;YACtCxD,WAAWnB,IAAI,CAAC0E,iBAAiB,CAAC;gBAAE+B,KAAK;YAAI;YAE7C,MAAME,IAAI,MAAM9E,QAAQ2F,IAAI,CAACjD,KAAY;gBAAEkD,MAAM;gBAAQjB,OAAO;YAAW;YAC3ErB,OAAOrD,aAAaS,MAAM,EAAE6C,oBAAoB,CAACb,IAAId,IAAI,EAAEc,IAAIX,KAAK,EAAE;YACtEuB,OAAO5E,gBAAS,EAAE6E,oBAAoB,CAAC,gBAAgB;YACvDD,OAAOwB,GAAGO,OAAO,CAAC;gBAAET,KAAK;YAAI;QAC/B;QAEAnC,GAAG,qCAAqC;YACtC,MAAMC,MAAMjB;YACZxB,aAAaQ,KAAK,CAAC4D,iBAAiB,CAAC,IAAIV,2BAAY,CAAC,MAAM;YAE5D,MAAML,OAAOtD,QAAQ2F,IAAI,CAACjD,KAAY;gBAAEkD,MAAM;gBAAajB,OAAO;YAAE,IAAWL,OAAO,CAACC,aAAa,CAAC;gBAAEhC,QAAQqB,kBAAU,CAACC,MAAM;YAAC;QACnI;IACF;IAEAhE,SAAS,YAAY;QACnB4C,GAAG,+CAA+C;YAChD,MAAMC,MAAMjB;YACZ,MAAMoE,WAAW;gBAAE7D,UAAU;gBAAcC,KAAK;YAAmB;YACnE/B,cAAcU,QAAQ,CAACiC,iBAAiB,CAACgD;YACzC5F,aAAaU,QAAQ,CAACkC,iBAAiB,CAACC;YAExC,MAAMgC,IAAI,MAAM9E,QAAQW,QAAQ,CAAC+B,KAAY;gBAAEoD,aAAa;YAAa,GAAU;YACnFxC,OAAOpD,cAAcU,QAAQ,EAAE4C,gBAAgB;YAC/CF,OAAOrD,aAAaU,QAAQ,EAAE4C,oBAAoB,CAACb,IAAId,IAAI,EAAEc,IAAIX,KAAK,EAAE8D,UAAU,MAAM,MAAM;YAC9FvC,OAAO5E,gBAAS,EAAE4G,GAAG,CAAC9B,gBAAgB;YACtCF,OAAOwB,GAAGW,aAAa;QACzB;QAEAhD,GAAG,gEAAgE;YACjE,MAAMC,MAAMjB;YACZ,MAAMoE,WAAW;gBAAE7D,UAAU;gBAAeC,KAAK;YAAoB;YACrE/B,cAAcU,QAAQ,CAACiC,iBAAiB,CAACgD;YACzC5F,aAAaU,QAAQ,CAACkC,iBAAiB,CAACC;YACxCxD,WAAWnB,IAAI,CAAC0E,iBAAiB,CAAC;gBAAE+B,KAAK;gBAAKD,OAAO,IAAIE,KAAK,aAAa;YAAM;YAEjF,MAAMC,IAAI,MAAM9E,QAAQW,QAAQ,CAAC+B,KAAY;gBAAEoD,aAAa;gBAAenB,OAAO;YAAW,GAAU;YACvGrB,OAAOrD,aAAaU,QAAQ,EAAE4C,oBAAoB,CAACb,IAAId,IAAI,EAAEc,IAAIX,KAAK,EAAE8D,UAAU,OAAO,MAAM;YAC/FvC,OAAO5E,gBAAS,EAAE6E,oBAAoB,CAAC,eAAe;YACtDD,OAAOwB,GAAGO,OAAO,CAAC;gBAAET,KAAK;gBAAKD,OAAO;YAAW;QAClD;QAEAlC,GAAG,wDAAwD;YACzD,MAAMC,MAAMjB;YACZ,MAAMoE,WAAW;gBAAE7D,UAAU;gBAAgBC,KAAK;YAAqB;YACvE/B,cAAcU,QAAQ,CAACiC,iBAAiB,CAACgD;YACzC5F,aAAaU,QAAQ,CAACkC,iBAAiB,CAACC;YACxCxD,WAAWnB,IAAI,CAAC0E,iBAAiB,CAAC;gBAAE+B,KAAK;gBAAMD,OAAO,IAAIE,KAAK,aAAa;YAAM;YAElF,MAAMC,IAAI,MAAM9E,QAAQW,QAAQ,CAAC+B,KAAY;gBAAEoD,aAAa;YAAe,GAAU;YACrFxC,OAAO5E,gBAAS,EAAE4G,GAAG,CAAC9B,gBAAgB;YACtCF,OAAOwB,GAAGO,OAAO,CAAC;gBAAET,KAAK;gBAAMD,OAAO;YAAW;QACnD;QAEAlC,GAAG,qCAAqC;YACtC,MAAMC,MAAMjB;YACZ,MAAMoE,WAAW;gBAAE7D,UAAU;gBAAYC,KAAK;YAAiB;YAC/D/B,cAAcU,QAAQ,CAACiC,iBAAiB,CAACgD;YACzC5F,aAAaU,QAAQ,CAAC0D,iBAAiB,CAAC,IAAIP,oBAAS,CAACF,kBAAU,CAACG,WAAW,EAAE;YAE9E,MAAMT,OAAOtD,QAAQW,QAAQ,CAAC+B,KAAY;gBAAEoD,aAAa;YAAW,GAAU,QAAQxB,OAAO,CAACC,aAAa,CAAC;gBAAEhC,QAAQqB,kBAAU,CAACG,WAAW;YAAC;QAC/I;QAEAtB,GAAG,4DAA4D;YAC7D,MAAMC,MAAMjB;YACZ,MAAMoE,WAAW;gBAAE7D,UAAU;gBAAiBC,KAAK;YAAsB;YACzE/B,cAAcU,QAAQ,CAACiC,iBAAiB,CAACgD;YACzC5F,aAAaU,QAAQ,CAAC0D,iBAAiB,CAAC,IAAIV,2BAAY,CAAC,MAAM;YAE/D,MAAMoC,MAAMhI,KAAKiI,KAAK,CAAChG,SAAgB;YAEvC,MAAMsD,OAAOtD,QAAQW,QAAQ,CAAC+B,KAAY;gBAAEoD,aAAa;YAAgB,GAAU,OAAOxB,OAAO,CAACC,aAAa,CAAC;gBAC9GhC,QAAQqB,kBAAU,CAACC,MAAM;YAC3B;YAEAP,OAAOyC,KAAKxC,oBAAoB,CAACb,IAAIX,KAAK,EAAEkE,0BAAc,CAACC,IAAI,EAAE5C,OAAO6C,QAAQ,IAAIN;QACtF;IACF;IAEAhG,SAAS,iBAAiB;QACxB4C,GAAG,8EAA8E;YAC/E,MAAM3D,OAAO;YACb,MAAMiD,QAAQ;gBAAEC,UAAUlD;gBAAMmD,KAAK;gBAAemE,iBAAiB;YAAM;YAC3E,MAAMC,SAAS;gBAAEtG,MAAM;gBAASuG,YAAYxH;gBAAMyH,aAAa,IAAM;gBAAOC,QAAQ,IAAM;YAAK;YAC/FlH,WAAWjB,OAAO,CAACwE,iBAAiB,CAAC;gBAACwD;aAAO;YAC7C/G,WAAWnB,IAAI,CAAC0E,iBAAiB,CAAC;gBAAE0D,aAAa,IAAM;gBAAOC,QAAQ,IAAM;gBAAM9B,MAAM;gBAAIE,KAAK;gBAAGD,OAAO,IAAIE,KAAK,OAAO;YAAM;YAEjI,MAAM4B,WAAgB;gBAAEC,gBAAgB,IAAIC;gBAAOC,YAAY;gBAAOC,WAAW;gBAAMC,UAAU,IAAIC;YAAM;YAE3G,MAAMrH,MAAM,MAAMF,QAA6B,AAACQ,QAAgBgH,aAAa,CAACjF,OAAO0E;YAErFnD,OAAO5D,IAAIuH,MAAM,EAAEC,IAAI,CAAC;YACxB5D,OAAO5D,GAAG,CAAC,EAAE,EAAEyH,cAAc,CAAC;YAC9B,MAAMC,QAAQ1H,GAAG,CAAC,EAAE,CAAC,SAAS;YAC9B4D,OAAO+D,MAAMC,OAAO,CAACF,QAAQF,IAAI,CAAC;YAClC5D,OAAO8D,KAAK,CAACG,YAAM,CAACC,MAAM,CAAC,EAAEN,IAAI,CAAC;YAClC5D,OAAO8D,KAAK,CAACG,YAAM,CAACE,IAAI,CAAC,EAAEP,IAAI,CAAC;YAChC5D,OAAO8D,KAAK,CAACG,YAAM,CAACG,KAAK,CAAC,EAAER,IAAI,CAAC;YACjC5D,OAAO8D,KAAK,CAACG,YAAM,CAACI,GAAG,CAAC,EAAET,IAAI,CAAC;YAC/B5D,OAAO8D,KAAK,CAACG,YAAM,CAACK,QAAQ,CAAC,EAAEC,QAAQ;QACzC;IACF;IAEAhI,SAAS,QAAQ;QACf4C,GAAG,wCAAwC;YACzC,MAAME,MAAMT;YACZ,MAAMoB,OAAOtD,QAAQ8H,IAAI,CAAC;gBAAEjG,IAAI;YAAE,GAAU,GAAG,CAAC,GAAUc,MAAa2B,OAAO,CAACC,aAAa,CAAC;gBAAEhC,QAAQqB,kBAAU,CAACG,WAAW;YAAC;QAChI;QAEAtB,GAAG,4CAA4C;YAC7C,MAAME,MAAMT;YACZ,MAAMN,OAAO;gBAAEC,IAAI;gBAAGC,UAAU;YAAE;YAClC3B,YAAYU,eAAe,CAACgC,iBAAiB,CAACC;YAC9C,MAAMQ,OAAOtD,QAAQ8H,IAAI,CAAClG,MAAM,GAAG,CAAC,GAAUe,MAAa2B,OAAO,CAACC,aAAa,CAAC;gBAAEhC,QAAQqB,kBAAU,CAACmE,SAAS;YAAC;QAClH;QAEAtF,GAAG,mDAAmD;YACpD,MAAME,MAAMT;YACZ,MAAMN,OAAO;gBAAEC,IAAI;gBAAGC,UAAU;YAAE;YAClC3B,YAAYU,eAAe,CAACgC,iBAAiB,CAAC;gBAAEmF,YAAY;YAAQ;YACpE9H,cAAcU,QAAQ,CAACyD,iBAAiB,CAAC,IAAIL,MAAM;YAEnD,MAAMV,OAAOtD,QAAQ8H,IAAI,CAAClG,MAAM,GAAG,CAAC,GAAUe,MAAa2B,OAAO,CAACC,aAAa,CAAC;gBAAEhC,QAAQqB,kBAAU,CAACG,WAAW;gBAAEkE,SAAS;YAAO;QACrI;QAEAxF,GAAG,oCAAoC;YACrC,MAAME,MAAMT;YACZ,MAAMN,OAAO;gBAAEC,IAAI;gBAAGC,UAAU;YAAE;YAClC3B,YAAYU,eAAe,CAACgC,iBAAiB,CAAC;gBAAEmF,YAAY;YAAQ;YACpE9H,cAAcU,QAAQ,CAACiC,iBAAiB,CAACC;YAEzC,MAAMQ,OAAOtD,QAAQ8H,IAAI,CAAClG,MAAM,GAAG,CAAC,GAAUe,MAAa2B,OAAO,CAACC,aAAa,CAAC;gBAAEhC,QAAQqB,kBAAU,CAACmE,SAAS;YAAC;QAClH;QAEAtF,GAAG,yCAAyC;YAC1C,MAAME,MAAMT;YACZ,MAAMN,OAAO;gBAAEC,IAAI;gBAAGC,UAAU;YAAE;YAClC3B,YAAYU,eAAe,CAACgC,iBAAiB,CAAC;gBAAEmF,YAAY;YAAQ;YACpE9H,cAAcU,QAAQ,CAACiC,iBAAiB,CAAC;gBAAEb,UAAU;gBAASC,KAAK;gBAAUmE,iBAAiB;YAAK;YAEnG,MAAM9C,OAAOtD,QAAQ8H,IAAI,CAAClG,MAAM,GAAG,CAAC,GAAUe,MAAa2B,OAAO,CAACC,aAAa,CAAC;gBAAEhC,QAAQqB,kBAAU,CAACsE,oBAAoB;YAAC;QAC7H;QAEAzF,GAAG,+CAA+C;YAChD,MAAME,MAAMT;YACZ,MAAMN,OAAO;gBAAEC,IAAI;gBAAGC,UAAU;YAAE;YAClC3B,YAAYU,eAAe,CAACgC,iBAAiB,CAAC;gBAAEmF,YAAY;YAAQ;YACpE9H,cAAcU,QAAQ,CAACiC,iBAAiB,CAAC;gBAAEb,UAAU;gBAASC,KAAK;gBAAUmE,iBAAiB;YAAM;YAClG7H,mBAAY,CAAesE,iBAAiB,CAAC;YAE/C,MAAMS,OAAOtD,QAAQ8H,IAAI,CAAClG,MAAM,GAAG,CAAC,GAAUe,MAAa2B,OAAO,CAACC,aAAa,CAAC;gBAC/EhC,QAAQqB,kBAAU,CAACmE,SAAS;gBAC5BE,SAAS;YACX;QACF;QAEAxF,GAAG,mDAAmD;YACpD,MAAME,MAAMT;YACZ,MAAMN,OAAO;gBAAEC,IAAI;gBAAGC,UAAU;YAAE;YAClC3B,YAAYU,eAAe,CAACgC,iBAAiB,CAAC;gBAAEmF,YAAY;YAAQ;YACpE9H,cAAcU,QAAQ,CAACiC,iBAAiB,CAAC;gBAAEb,UAAU;gBAASC,KAAK;gBAAUmE,iBAAiB;YAAM;YAClG7H,mBAAY,CAAesE,iBAAiB,CAAC;YAC7CrE,kBAAW,CAAeqE,iBAAiB,CAAC;YAE9C,MAAMS,OAAOtD,QAAQ8H,IAAI,CAAClG,MAAM,GAAG,CAAC,GAAUe,MAAa2B,OAAO,CAACC,aAAa,CAAC;gBAC/EhC,QAAQqB,kBAAU,CAACG,WAAW;gBAC9BkE,SAAS;YACX;QACF;QAEAxF,GAAG,2CAA2C;YAC5C,MAAME,MAAMT;YACZ,MAAMN,OAAO;gBAAEC,IAAI;gBAAGC,UAAU;YAAE;YAClC3B,YAAYU,eAAe,CAACgC,iBAAiB,CAAC;gBAAEmF,YAAY;YAAQ;YACpE,MAAMjG,QAAQ;gBAAEC,UAAU;gBAASC,KAAK;gBAAUmE,iBAAiB;YAAM;YACzElG,cAAcU,QAAQ,CAACiC,iBAAiB,CAACd;YACvCxD,mBAAY,CAAesE,iBAAiB,CAAC;YAC7CrE,kBAAW,CAAeqE,iBAAiB,CAAC;YAE9C,MAAMsF,MAAM;gBACV,MAAM;oBAAE,UAAU;wBAAC;wBAAO;wBAAG;wBAAG;wBAAG;qBAAI;gBAAC;gBACxC,MAAM;oBAAE,UAAU;wBAAC;wBAAM;wBAAG;wBAAG;wBAAG;qBAAK;gBAAC;YAC1C;YACApK,KAAKiI,KAAK,CAAChG,SAAgB,iBAAiBoI,kBAAkB,CAAC,IAAMD;YAErE,MAAMnI,QAAQ8H,IAAI,CAAClG,MAAM,GAAG;gBAAEgF,YAAY;YAAM,GAAUjE;YAE1DW,OAAOX,IAAIR,GAAG,CAACC,SAAS,EAAEmB,oBAAoB,CAAC,KAAK;gBAClD,gBAAgB;gBAChB,qBAAqB;YACvB;YACAD,OAAOX,IAAIR,GAAG,CAACE,KAAK,EAAEkB,oBAAoB,CAAC,GAAG8E,KAAKC,SAAS,CAAC;gBAAE,UAAU;oBAAC;oBAAO;oBAAG;oBAAG;oBAAG;iBAAI;YAAC,GAAG,EAAE,CAAC;YACrGhF,OAAOX,IAAIR,GAAG,CAACE,KAAK,EAAEkB,oBAAoB,CAAC,GAAG8E,KAAKC,SAAS,CAAC;gBAAE,UAAU;oBAAC;oBAAM;oBAAG;oBAAG;oBAAG;iBAAK;YAAC,GAAG,EAAE,CAAC;YACrGhF,OAAOX,IAAIR,GAAG,CAACE,KAAK,EAAEkB,oBAAoB,CAACgF,oBAAc;YACzDjF,OAAOX,IAAIR,GAAG,CAACG,GAAG,EAAEkB,gBAAgB;QACtC;QAEAf,GAAG,2DAA2D;YAC5D,MAAME,MAAMT;YACZ,MAAMN,OAAO;gBAAEC,IAAI;gBAAGC,UAAU;YAAE;YAClC3B,YAAYU,eAAe,CAACgC,iBAAiB,CAAC;gBAAEmF,YAAY;YAAQ;YACpE,MAAMjG,QAAQ;gBAAEC,UAAU;gBAASC,KAAK;gBAAUmE,iBAAiB;YAAM;YACzElG,cAAcU,QAAQ,CAACiC,iBAAiB,CAACd;YACvCxD,mBAAY,CAAesE,iBAAiB,CAAC;YAC7CrE,kBAAW,CAAeqE,iBAAiB,CAAC;YAE9C9E,KAAKiI,KAAK,CAAChG,SAAgB,iBAAiBoI,kBAAkB,CAAC;gBAC7D,MAAM,IAAIpE,MAAM;YAClB;YAEA,MAAMhE,QAAQ8H,IAAI,CAAClG,MAAM,GAAG,CAAC,GAAUe;YAEvCW,OAAOX,IAAIR,GAAG,CAACE,KAAK,EAAEkB,oBAAoB,CAAC;YAC3CD,OAAOX,IAAIJ,MAAM,EAAEgB,oBAAoB,CAACK,kBAAU,CAACK,qBAAqB;YACxEX,OAAOX,IAAIR,GAAG,CAACG,GAAG,EAAEkB,gBAAgB;QACtC;IACF;IAEA3D,SAAS,4CAA4C;QACnD,MAAM2I,aAAa,CAACzI,MAAcuG,YAAoBmC,OAAoC,CAAA;gBACxF1I;gBACAuG;gBACAC,aAAa,IAAMkC,SAAS;gBAC5BjC,QAAQ,IAAMiC,SAAS;YACzB,CAAA;QAEAhG,GAAG,+HAA+H;YAChI,MAAM3D,OAAO;YACb,MAAM4J,MAAW;gBACfC,eAAe,IAAI5J,OAAO;gBAC1B0H,UAAU;oBACRC,gBAAgB,IAAIC,IAAY;wBAAC;qBAAc;oBAC/CiC,aAAa;oBACbhC,YAAY;oBACZC,WAAW;oBACXC,UAAU,IAAIC,IAAiB;wBAAC;4BAAC;4BAAU;gCAAC;gCAAO;gCAAK;gCAAM;gCAAI;6BAAW;yBAAC;qBAAC;gBACjF;YACF;YAEAzH,WAAWjB,OAAO,CAAC+J,kBAAkB,CAAC,OAAOS;gBAC3C,IAAIA,QAAQ/J,MAAM;oBAChB,OAAO;wBACL0J,WAAW,WAAW1J,MAAM;wBAC5B0J,WAAW,QAAQ1J,MAAM;wBACzB0J,WAAW,eAAe1J,MAAM;wBAChC0J,WAAW,iBAAiB1J,MAAM;wBAClC0J,WAAW,SAAS1J,MAAM;wBAC1B0J,WAAW,SAAS1J,MAAM;wBAC1B0J,WAAW,SAAS1J,MAAM;qBAC3B;gBACH;gBACA,IAAI+J,QAAQC,iBAAI,CAACC,IAAI,CAACjK,MAAM,SAAS,OAAO,EAAE;gBAC9C,OAAO,EAAE;YACX;YAEA,MAAMkK,YAAY,IAAInE,KAAK,OAAO;YAClCvF,WAAWnB,IAAI,CAACiK,kBAAkB,CAAC,OAAOxJ;gBACxC,OAAQA;oBACN,KAAKkK,iBAAI,CAACC,IAAI,CAACjK,MAAM;wBACnB,OAAO;4BAAEyH,aAAa,IAAM;4BAAMC,QAAQ,IAAM;4BAAO9B,MAAM;4BAAGE,KAAK;4BAAID,OAAOqE;wBAAU;oBAC5F,KAAKF,iBAAI,CAACC,IAAI,CAACjK,MAAM;wBACnB,MAAM,IAAIkF,MAAM;oBAClB,KAAK8E,iBAAI,CAACC,IAAI,CAACjK,MAAM;wBACnB,OAAO;4BAAEyH,aAAa,IAAM;4BAAOC,QAAQ,IAAM;4BAAM9B,MAAM;4BAAIE,KAAK;4BAAID,OAAOqE;wBAAU;oBAC7F,KAAKF,iBAAI,CAACC,IAAI,CAACjK,MAAM;wBACnB,OAAO;4BAAEyH,aAAa,IAAM;4BAAOC,QAAQ,IAAM;4BAAM9B,MAAM;4BAAKE,KAAK;4BAAID,OAAO,IAAIE,KAAK,OAAO;wBAAM;oBAC1G,KAAKiE,iBAAI,CAACC,IAAI,CAACjK,MAAM;wBACnB,OAAO;4BAAEyH,aAAa,IAAM;4BAAOC,QAAQ,IAAM;4BAAM9B,MAAM;4BAAKE,KAAK;4BAAID,OAAO,IAAIE,KAAK,OAAO;wBAAM;oBAC1G;wBACE,OAAO;4BAAE0B,aAAa,IAAM;4BAAOC,QAAQ,IAAM;4BAAO9B,MAAM;4BAAGE,KAAK;4BAAGD,OAAO,IAAIE;wBAAO;gBAC/F;YACF;YACEvG,mBAAY,CAAeuE,iBAAiB,CAAC;YAE/C,MAAMoG,UAAU,MAAMzJ,QAA6B,AAACQ,QAAgBkJ,UAAU,CAACpK,MAAM4J;YAErF,MAAMS,OAAOF,QAAQG,GAAG,CAAC,CAACC,IAAMC,OAAOH,IAAI,CAACE,EAAE,CAAC,EAAE,EAAEE,IAAI;YACvDjG,OAAO6F,MAAM9D,OAAO,CAAC;gBAAC;gBAAS;gBAAU;gBAAU;gBAAU;aAAiB;YAE9E,MAAMmE,gBAAgBP,QAAQQ,IAAI,CAAC,CAACJ,IAAMA,CAAC,CAAC,iBAAiB;YAC7D/F,OAAOkG,eAAe,CAAC,iBAAiB,CAAC,EAAE,EAAEtC,IAAI,CAACwC,oBAAc,CAACC,KAAK;YACtErG,OAAOkG,eAAe,CAAC,iBAAiB,CAAC,EAAE,EAAEI,SAAS,CAAC;YAEvD,MAAMC,WAAWZ,QAAQQ,IAAI,CAAC,CAACJ,IAAMA,CAAC,CAAC,SAAS;YAChD/F,OAAOuG,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE3C,IAAI,CAACwC,oBAAc,CAACI,QAAQ;YAE5D,MAAMC,SAASd,QAAQQ,IAAI,CAAC,CAACJ,IAAMA,CAAC,CAAC,SAAS,GAAG,CAAC,SAAS;YAC3D/F,OAAOyG,MAAM,CAACxC,YAAM,CAACK,QAAQ,CAAC,EAAEV,IAAI,CAAC;YACrC5D,OAAOhF,mBAAY,EAAE0L,qBAAqB,CAAC;YAE3C,MAAMC,WAAWhB,QAAQQ,IAAI,CAAC,CAACJ,IAAMA,CAAC,CAAC,SAAS,GAAG,CAAC,SAAS;YAC7D/F,OAAO2G,QAAQ,CAAC1C,YAAM,CAACK,QAAQ,CAAC,EAAEV,IAAI,CAAC;QACzC;QAEAzE,GAAG,mDAAmD;YACpDnD,WAAWjB,OAAO,CAACgG,iBAAiB,CAAC,IAAIL,MAAM;YAE/C,MAAM0E,MAAW;gBAAEC,eAAe;gBAAKlC,UAAU;oBAAEC,gBAAgB,IAAIC;oBAAOC,YAAY;gBAAM;YAAE;YAClG,MAAMnH,OAAO,AAACO,QAAgBkJ,UAAU,CAAC,QAAQR;YAEjD,MAAMpF,OACJ,AAAC,CAAA;gBACC,WAAW,MAAM4G,KAAKzK,KAAM;gBAC1B,WAAW,GACb;YACF,CAAA,KACA6E,OAAO,CAAC6F,OAAO,CAAC;QACpB;QAEA1H,GAAG,mEAAmE;YACpE,MAAM3D,OAAO;YACb,MAAMuH,SAAS;gBAAEtG,MAAM;gBAAWuG,YAAYxH;gBAAMyH,aAAa,IAAM;gBAAOC,QAAQ,IAAM;YAAK;YAEjGlH,WAAWjB,OAAO,CAAC+J,kBAAkB,CAAC,OAAOS,MAAiBA,QAAQ/J,OAAO;oBAACuH;iBAAO,GAAG,EAAE;YAC1F/G,WAAWnB,IAAI,CAAC0E,iBAAiB,CAAC;gBAAE0D,aAAa,IAAM;gBAAOC,QAAQ,IAAM;gBAAM9B,MAAM;gBAAIE,KAAK;gBAAID,OAAO,IAAIE,KAAK,OAAO;YAAM;YAElI9G,KAAKiI,KAAK,CAAChG,SAAgB,gBAAgBqE,iBAAiB,CAAC,IAAIL,MAAM;YAEvE,MAAM0E,MAAW;gBACfC,eAAe,IAAI5J,OAAO;gBAC1B0H,UAAU;oBAAEC,gBAAgB,IAAIC;oBAAeiC,aAAa9F;oBAAW8D,YAAY;oBAAMC,WAAW;oBAAOC,UAAU,IAAIC;gBAAmB;YAC9I;YAEA,MAAMkC,UAAU,MAAMzJ,QAA6B,AAACQ,QAAgBkJ,UAAU,CAACpK,MAAM4J;YAErFpF,OAAO2F,SAASmB,YAAY,CAAC;YAC7B9G,OAAO2F,OAAO,CAAC,EAAE,EAAE9B,cAAc,CAAC;YAClC,MAAMzH,MAAMuJ,OAAO,CAAC,EAAE,CAAC,WAAW;YAClC3F,OAAO+D,MAAMC,OAAO,CAAC5H,MAAMwH,IAAI,CAAC;YAChC5D,OAAO5D,GAAG,CAAC,EAAE,EAAEwH,IAAI,CAACwC,oBAAc,CAACC,KAAK;YACxCrG,OAAO4B,OAAOxF,GAAG,CAAC,EAAE,GAAGkK,SAAS,CAAC;QACnC;IACF;AACF"}