fmode-ng 0.0.113 → 0.0.115

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 (275) hide show
  1. package/LICENSE.md +8 -0
  2. package/README.md +37 -37
  3. package/esm2022/fmode-ng.mjs +10 -5
  4. package/esm2022/lib/aigc/agent/fm-agent-task/fm-agent-task.component.mjs +8 -92
  5. package/esm2022/lib/aigc/agent/index.mjs +10 -3
  6. package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
  7. package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
  8. package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
  9. package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
  10. package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
  11. package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -98
  12. package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -107
  13. package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -113
  14. package/esm2022/lib/aigc/avatar/index.mjs +10 -8
  15. package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
  16. package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -164
  17. package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -49
  18. package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
  19. package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -155
  20. package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
  21. package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
  22. package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
  23. package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -140
  24. package/esm2022/lib/aigc/chat/chat-message-card/duration-str.pipe.mjs +10 -29
  25. package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -3
  26. package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -3
  27. package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -193
  28. package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -331
  29. package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +8 -249
  30. package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -83
  31. package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
  32. package/esm2022/lib/aigc/chat/index.mjs +10 -8
  33. package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
  34. package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -367
  35. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
  36. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
  37. package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -115
  38. package/esm2022/lib/aigc/index.mjs +10 -14
  39. package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
  40. package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +10 -2
  41. package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -174
  42. package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
  43. package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
  44. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
  45. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
  46. package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
  47. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-func.mjs +9 -162
  48. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-work.mjs +10 -68
  49. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -313
  50. package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -4
  51. package/esm2022/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.mjs +10 -62
  52. package/esm2022/lib/aigc/story/fm-story-card/fm-story-card.component.mjs +10 -87
  53. package/esm2022/lib/aigc/story/fm-story-list/fm-story-list.component.mjs +10 -345
  54. package/esm2022/lib/aigc/story/fm-story-list/story-preview.mjs +10 -81
  55. package/esm2022/lib/aigc/story/fm-story-loader/fm-story-loader.component.mjs +10 -152
  56. package/esm2022/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.mjs +10 -42
  57. package/esm2022/lib/aigc/story/index.mjs +10 -6
  58. package/esm2022/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.mjs +10 -47
  59. package/esm2022/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.mjs +10 -95
  60. package/esm2022/lib/aigc/story/modal-chat-story/modal-chat-story.component.mjs +10 -253
  61. package/esm2022/lib/aigc/story/story.service.mjs +10 -35
  62. package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +10 -636
  63. package/esm2022/lib/aigc/voice/index.mjs +10 -7
  64. package/esm2022/lib/aigc/voice/lib/audio/audio.player.mjs +10 -55
  65. package/esm2022/lib/aigc/voice/lib/audio/audio.streamer.mjs +10 -2
  66. package/esm2022/lib/aigc/voice/lib/audio/streamer.microsoft.mjs +10 -96
  67. package/esm2022/lib/aigc/voice/lib/audio/streamer.pcm.mjs +8 -177
  68. package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
  69. package/esm2022/lib/aigc/voice/lib/recorder/extension-waveview.mjs +10 -215
  70. package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
  71. package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +10 -189
  72. package/esm2022/lib/aigc/voice/tts/index.mjs +10 -5
  73. package/esm2022/lib/aigc/voice/tts/int-tts-provider.mjs +10 -2
  74. package/esm2022/lib/aigc/voice/tts/provider-doubao.mjs +8 -346
  75. package/esm2022/lib/code/fm-codemirror/fm-codemirror.component.mjs +8 -342
  76. package/esm2022/lib/code/index.mjs +10 -2
  77. package/esm2022/lib/core/agent/chat/completion/fmode-completion.mjs +8 -430
  78. package/esm2022/lib/core/agent/chat/completion/index.mjs +10 -2
  79. package/esm2022/lib/core/agent/chat/completion/int-gpt-chat-options.mjs +10 -2
  80. package/esm2022/lib/core/agent/chat/fmode-chat.mjs +8 -617
  81. package/esm2022/lib/core/agent/chat/index.mjs +10 -4
  82. package/esm2022/lib/core/agent/chat/interface.mjs +10 -2
  83. package/esm2022/lib/core/agent/index.mjs +10 -6
  84. package/esm2022/lib/core/agent/prompt/agent.prompt.mjs +10 -133
  85. package/esm2022/lib/core/agent/prompt/index.mjs +10 -2
  86. package/esm2022/lib/core/agent/prompt/prompt-util.mjs +10 -16
  87. package/esm2022/lib/core/agent/story/agent.story.mjs +10 -64
  88. package/esm2022/lib/core/agent/story/index.mjs +10 -2
  89. package/esm2022/lib/core/agent/task/agent.task.mjs +10 -90
  90. package/esm2022/lib/core/agent/task/index.mjs +10 -2
  91. package/esm2022/lib/core/agent/waiting/index.mjs +10 -3
  92. package/esm2022/lib/core/agent/waiting/loading/loading.ctrl.mjs +10 -279
  93. package/esm2022/lib/core/agent/waiting/tips/tips.ctrl.mjs +8 -190
  94. package/esm2022/lib/core/index.mjs +10 -4
  95. package/esm2022/lib/core/parse/datatype/acl.mjs +10 -57
  96. package/esm2022/lib/core/parse/datatype/file.mjs +10 -69
  97. package/esm2022/lib/core/parse/datatype/geopoint.mjs +10 -57
  98. package/esm2022/lib/core/parse/datatype/relation.mjs +10 -56
  99. package/esm2022/lib/core/parse/fmode.cloud.mjs +10 -0
  100. package/esm2022/lib/core/parse/fmode.object.mjs +10 -232
  101. package/esm2022/lib/core/parse/fmode.parse.mjs +10 -84
  102. package/esm2022/lib/core/parse/fmode.query.mjs +8 -500
  103. package/esm2022/lib/core/parse/fmode.user.mjs +10 -275
  104. package/esm2022/lib/core/parse/index.mjs +10 -5
  105. package/esm2022/lib/core/parse/types.mjs +10 -2
  106. package/esm2022/lib/core/voice/index.mjs +10 -3
  107. package/esm2022/lib/core/voice/tts/index.mjs +10 -2
  108. package/esm2022/lib/icon/filetype/audio.svg.mjs +10 -3
  109. package/esm2022/lib/icon/filetype/avatar.svg.mjs +10 -14
  110. package/esm2022/lib/icon/filetype/chat.svg.mjs +10 -3
  111. package/esm2022/lib/icon/filetype/docx.svg.mjs +10 -3
  112. package/esm2022/lib/icon/filetype/file.svg.mjs +10 -3
  113. package/esm2022/lib/icon/filetype/filetype.pipe.mjs +10 -57
  114. package/esm2022/lib/icon/filetype/index.mjs +10 -12
  115. package/esm2022/lib/icon/filetype/md.svg.mjs +10 -3
  116. package/esm2022/lib/icon/filetype/pdf.svg.mjs +10 -3
  117. package/esm2022/lib/icon/filetype/pptx.svg.mjs +10 -3
  118. package/esm2022/lib/icon/filetype/svgtoblob.mjs +10 -8
  119. package/esm2022/lib/icon/filetype/video.svg.mjs +10 -3
  120. package/esm2022/lib/icon/filetype/xlsx.svg.mjs +10 -3
  121. package/esm2022/lib/icon/index.mjs +10 -2
  122. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -209
  123. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
  124. package/esm2022/lib/map/index.mjs +10 -4
  125. package/esm2022/lib/map/map.module.mjs +10 -61
  126. package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -132
  127. package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -115
  128. package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -118
  129. package/esm2022/lib/nova-cloud/index.mjs +10 -3
  130. package/esm2022/lib/nova-cloud/ncloud-api-func.mjs +10 -91
  131. package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -53
  132. package/esm2022/lib/payment/index.mjs +10 -2
  133. package/esm2022/lib/payment/payment/payment.component.mjs +10 -543
  134. package/esm2022/lib/payment/payment.service.mjs +10 -202
  135. package/esm2022/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.mjs +10 -48
  136. package/esm2022/lib/person/comp-person-item/comp-person-item.component.mjs +10 -29
  137. package/esm2022/lib/person/comp-person-story/comp-person-story.component.mjs +10 -211
  138. package/esm2022/lib/person/edit-upload/edit-upload.component.mjs +8 -412
  139. package/esm2022/lib/person/edit-upload/edit-upload.module.mjs +10 -50
  140. package/esm2022/lib/person/index.mjs +10 -5
  141. package/esm2022/lib/person/modal-person-select/modal-person-select.component.mjs +10 -144
  142. package/esm2022/lib/person/modal-user-verify/secret-text.pipe.mjs +10 -41
  143. package/esm2022/lib/person/modal-user-verify/user-verify.component.mjs +10 -595
  144. package/esm2022/lib/person/person-detail/person-detail.component.mjs +10 -172
  145. package/esm2022/lib/person/person.service.mjs +8 -193
  146. package/esm2022/lib/platform/cross.service.mjs +10 -62
  147. package/esm2022/lib/platform/index.mjs +10 -2
  148. package/esm2022/lib/social/index.mjs +10 -2
  149. package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -230
  150. package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
  151. package/esm2022/lib/storage/index.mjs +10 -5
  152. package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -131
  153. package/esm2022/lib/storage/service-hwobs/index.mjs +10 -3
  154. package/esm2022/lib/storage/service-hwobs/typings/esdk-obs-browser.mjs +1 -1
  155. package/esm2022/lib/storage/service-upload/index.mjs +10 -2
  156. package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -513
  157. package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
  158. package/esm2022/lib/storage/service-upload/util-file-metadata.mjs +10 -93
  159. package/esm2022/lib/storage/storage.module.mjs +10 -42
  160. package/esm2022/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.mjs +10 -72
  161. package/esm2022/lib/text/fm-article-editor/article.service.mjs +10 -237
  162. package/esm2022/lib/text/fm-article-editor/comp-upload-book-banners/comp-upload-book-banners.component.mjs +8 -72
  163. package/esm2022/lib/text/fm-article-editor/draft.service.mjs +10 -207
  164. package/esm2022/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.mjs +8 -227
  165. package/esm2022/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.mjs +10 -303
  166. package/esm2022/lib/text/fm-article-editor/fm-article-editor.component.mjs +8 -371
  167. package/esm2022/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.mjs +10 -94
  168. package/esm2022/lib/text/fm-article-editor/fm-article-outline-leftitem/fm-article-outline-leftitem.component.mjs +10 -36
  169. package/esm2022/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.mjs +10 -281
  170. package/esm2022/lib/text/fm-article-editor/fm-article-write-options/fm-article-write-options.component.mjs +10 -72
  171. package/esm2022/lib/text/fm-article-editor/outline-count.pipe.mjs +10 -22
  172. package/esm2022/lib/text/fm-article-editor/prompt/prompt-insertion-article.mjs +10 -169
  173. package/esm2022/lib/text/fm-article-editor/task-article-generation.mjs +10 -69
  174. package/esm2022/lib/text/fm-article-editor/tasks/task-article-draft-create.mjs +10 -65
  175. package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline-edit.mjs +10 -55
  176. package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline.mjs +10 -142
  177. package/esm2022/lib/text/fm-article-editor/tasks/task-article-preview.mjs +10 -35
  178. package/esm2022/lib/text/fm-article-editor/tasks/task-article-writing-options.mjs +10 -81
  179. package/esm2022/lib/text/fm-article-editor/tasks/task-document-select.mjs +10 -50
  180. package/esm2022/lib/text/fm-text-quill/fm-text-quill.component.mjs +10 -145
  181. package/esm2022/lib/text/index.mjs +10 -4
  182. package/esm2022/lib/user/account/account.service.mjs +10 -222
  183. package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
  184. package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -66
  185. package/esm2022/lib/user/index.mjs +10 -17
  186. package/esm2022/lib/user/login/auth.guard.mjs +10 -28
  187. package/esm2022/lib/user/login/auth.service.mjs +8 -433
  188. package/esm2022/lib/user/login/login.component.mjs +10 -916
  189. package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -311
  190. package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
  191. package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
  192. package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -164
  193. package/esm2022/lib/user/profile/profile-bind/profile-confirm-modal.component.mjs +10 -79
  194. package/esm2022/lib/user/profile/profile.module.mjs +10 -54
  195. package/esm2022/lib/user/staff/index.mjs +10 -4
  196. package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
  197. package/esm2022/lib/user/staff/staff.module.mjs +10 -18
  198. package/esm2022/lib/user/staff/staff.service.mjs +10 -85
  199. package/esm2022/lib/user/user-name.pipe.mjs +10 -29
  200. package/esm2022/lib/user/user.module.mjs +10 -102
  201. package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
  202. package/esm2022/lib/video/index.mjs +10 -2
  203. package/esm2022/public-api.mjs +10 -21
  204. package/fesm2022/fmode-ng.mjs +7 -19788
  205. package/fesm2022/fmode-ng.mjs.map +1 -1
  206. package/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.d.ts +2 -2
  207. package/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.d.ts +2 -2
  208. package/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.d.ts +2 -2
  209. package/lib/aigc/chat/chat-list/chat-list.component.d.ts +3 -2
  210. package/lib/aigc/chat/chat-message-card/comp-message-card.component.d.ts +3 -3
  211. package/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.d.ts +2 -2
  212. package/lib/aigc/chat/chat-modal-input/modal-input.component.d.ts +3 -3
  213. package/lib/aigc/service-fmai/service-imagine/imagine-func.d.ts +3 -3
  214. package/lib/aigc/service-fmai/service-imagine/imagine-work.d.ts +4 -4
  215. package/lib/aigc/service-fmai/service-imagine/imagine.service.d.ts +6 -6
  216. package/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.d.ts +2 -2
  217. package/lib/aigc/story/fm-story-card/fm-story-card.component.d.ts +2 -1
  218. package/lib/aigc/story/fm-story-list/fm-story-list.component.d.ts +6 -6
  219. package/lib/aigc/story/fm-story-list/story-preview.d.ts +4 -4
  220. package/lib/aigc/story/fm-story-loader/fm-story-loader.component.d.ts +3 -3
  221. package/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.d.ts +2 -2
  222. package/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.d.ts +3 -2
  223. package/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.d.ts +3 -2
  224. package/lib/aigc/story/modal-chat-story/modal-chat-story.component.d.ts +6 -6
  225. package/lib/aigc/story/story.service.d.ts +3 -2
  226. package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
  227. package/lib/core/agent/chat/fmode-chat.d.ts +11 -11
  228. package/lib/core/agent/story/agent.story.d.ts +8 -8
  229. package/lib/core/parse/datatype/geopoint.d.ts +5 -1
  230. package/lib/core/parse/fmode.cloud.d.ts +32 -0
  231. package/lib/core/parse/fmode.object.d.ts +2 -2
  232. package/lib/core/parse/fmode.parse.d.ts +15 -9
  233. package/lib/core/parse/fmode.query.d.ts +41 -2
  234. package/lib/core/parse/fmode.user.d.ts +1 -0
  235. package/lib/core/parse/index.d.ts +1 -0
  236. package/lib/core/parse/types.d.ts +2 -0
  237. package/lib/map/comp-poi-picker/comp-poi-picker.component.d.ts +5 -5
  238. package/lib/payment/payment/payment.component.d.ts +3 -3
  239. package/lib/payment/payment.service.d.ts +4 -4
  240. package/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.d.ts +2 -1
  241. package/lib/person/comp-person-item/comp-person-item.component.d.ts +2 -1
  242. package/lib/person/comp-person-story/comp-person-story.component.d.ts +13 -13
  243. package/lib/person/edit-upload/edit-upload.component.d.ts +1 -1
  244. package/lib/person/modal-person-select/modal-person-select.component.d.ts +5 -5
  245. package/lib/person/modal-user-verify/user-verify.component.d.ts +5 -5
  246. package/lib/person/person-detail/person-detail.component.d.ts +4 -4
  247. package/lib/person/person.service.d.ts +7 -7
  248. package/lib/storage/service-hwobs/hwobs.service.d.ts +4 -5
  249. package/lib/storage/service-upload/nova-upload.service.d.ts +5 -5
  250. package/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.d.ts +2 -1
  251. package/lib/text/fm-article-editor/article.service.d.ts +12 -12
  252. package/lib/text/fm-article-editor/draft.service.d.ts +5 -5
  253. package/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.d.ts +3 -2
  254. package/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.d.ts +16 -17
  255. package/lib/text/fm-article-editor/fm-article-editor.component.d.ts +3 -3
  256. package/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.d.ts +11 -10
  257. package/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.d.ts +2 -2
  258. package/lib/text/fm-article-editor/prompt/prompt-insertion-article.d.ts +3 -3
  259. package/lib/text/fm-article-editor/task-article-generation.d.ts +5 -4
  260. package/lib/text/fm-article-editor/tasks/task-article-draft-create.d.ts +3 -3
  261. package/lib/text/fm-article-editor/tasks/task-article-outline-edit.d.ts +3 -3
  262. package/lib/text/fm-article-editor/tasks/task-article-outline.d.ts +3 -3
  263. package/lib/text/fm-article-editor/tasks/task-article-preview.d.ts +2 -1
  264. package/lib/text/fm-article-editor/tasks/task-article-writing-options.d.ts +3 -3
  265. package/lib/text/fm-article-editor/tasks/task-document-select.d.ts +3 -3
  266. package/lib/user/account/account.service.d.ts +2 -2
  267. package/lib/user/comp-user-avatar/comp-user-avatar.component.d.ts +2 -2
  268. package/lib/user/login/auth.service.d.ts +5 -5
  269. package/lib/user/login/login.component.d.ts +3 -3
  270. package/lib/user/profile/auth-profile.service.d.ts +8 -8
  271. package/lib/user/profile/profile-bind/profile-bind.component.d.ts +7 -7
  272. package/lib/user/profile/profile-bind/profile-confirm-modal.component.d.ts +2 -2
  273. package/lib/user/staff/staff.service.d.ts +3 -3
  274. package/lib/user/user-name.pipe.d.ts +2 -2
  275. package/package.json +12 -18
@@ -1,435 +1,10 @@
1
- import { Injectable } from '@angular/core';
2
- import Parse from "parse";
3
- import { Router } from '@angular/router';
4
- // import { AccountService } from '../account/account.service';
5
- import { NovaCloudService } from '../../nova-cloud';
6
- import { HttpClient } from '@angular/common/http';
7
- import { ToastController } from '@ionic/angular/standalone';
8
- import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/router";
10
- import * as i2 from "@ionic/angular/standalone";
11
- import * as i3 from "../../nova-cloud";
12
- import * as i4 from "@angular/common/http";
13
- if (!Parse.applicationId) {
14
- Parse.initialize("ncloudmaster");
15
- Parse.serverURL = (Parse.serverURL?.split("parse")?.[0] || "https://server.fmode.cn/") + "parse";
16
- }
17
- export class AuthService {
18
- // set isModalShow(v){
19
- // this._isModalShow = v
20
- // this.setAc
21
- // }
22
- // get isModalShow(){
23
- // return this._isModalShow
24
- // }
25
- isGuardLock(url) {
26
- let lock = true;
27
- let user = Parse.User.current();
28
- if (user?.id) { // 用户已登录不锁定
29
- lock = false;
30
- }
31
- else { // 用户未登录且该页面需要守卫,则锁定
32
- lock = this.guardMap[url];
33
- }
34
- // console.log(this.guardMap)
35
- // console.log(lock)
36
- return lock;
37
- }
38
- get loginTypeCount() {
39
- return Object.values(this.loginOptions)?.filter(item => item)?.length;
40
- }
41
- get logoUrl() {
42
- return localStorage.getItem("LOGO_URL") || this._logoUrl || "https://file.yuban.co/img/logo-feima.png";
43
- }
44
- set logoUrl(v) {
45
- localStorage.setItem("LOGO_URL", v);
46
- this._logoUrl = this._logoUrl;
47
- }
48
- getCompanyId() {
49
- let company = localStorage.getItem("company");
50
- company = this.company || company;
51
- return company;
52
- }
53
- constructor(router,
54
- // private accServ:AccountService,
55
- toastCtrl, novaCloud, http) {
56
- this.router = router;
57
- this.toastCtrl = toastCtrl;
58
- this.novaCloud = novaCloud;
59
- this.http = http;
60
- this.guardMap = {};
61
- this.modalType = "fullscreen";
62
- this.isModalShow = false;
63
- this.showBackHome = true;
64
- //点击按钮切换对应表单
65
- this.activeButton = "账号密码"; // 默认为短信验证按钮选中
66
- this.loginOptions = {
67
- userpwd: true, // 帐号+密码
68
- mobilepwd: true, // 手机号+密码
69
- mobilecode: true, // 手机+验证码
70
- wechat: true // 微信扫码登录
71
- };
72
- /**
73
- * 企业账套:登录用户校验所在的账套
74
- */
75
- this._logoUrl = "https://file.yuban.co/img/logo-feima.png";
76
- this.wechatUrl = "https://app.fmode.cn/logo/z0qr.jpg";
77
- /**
78
- * 登录状态:默认false,登陆后为true
79
- * @description
80
- * 用于守卫弹窗锁定模块校验
81
- */
82
- this.isLoggedIn = false;
83
- this.message = {
84
- success: (msg) => {
85
- this.toast({ color: "success", message: msg });
86
- },
87
- create: (type, msg) => {
88
- if (type == "error") {
89
- type = "danger";
90
- }
91
- this.toast({ color: type, message: msg });
92
- },
93
- info: (msg) => {
94
- this.toast({ message: msg });
95
- },
96
- error: (msg) => {
97
- this.toast({ color: "danger", message: msg });
98
- },
99
- };
100
- this.LoginPage = '/pcuser/login';
101
- // 根据手机号获得帐套内用户名
102
- this.mobileUserMap = {};
103
- this.enabledLocalCode = false; // 开启验证码
104
- }
105
- async toast(options) {
106
- options.position = options?.position || "top";
107
- options.duration = options?.duration || 1500;
108
- options.color = options?.color || "primary";
109
- let toast = await this.toastCtrl.create(options);
110
- toast.present();
111
- }
112
- init(options) {
113
- this.company = options.company;
114
- this.guardType = options.guardType;
115
- this.modalType = options.modalType || this.modalType;
116
- this.appId = options.appId;
117
- this.saveParamsInvite();
118
- }
119
- checkLoginLock() {
120
- let user = Parse.User.current();
121
- if (user?.id) {
122
- return true;
123
- }
124
- else {
125
- this.isModalShow = true;
126
- this.isLoggedIn = false;
127
- return false;
128
- }
129
- }
130
- async checkLogin(url, options) {
131
- // 检测token快捷登录
132
- await this.checkAndLoginWithToken();
133
- // 将url记录在被守卫页列表中,便于后续检测弹窗锁定
134
- if (url) {
135
- this.guardMap[url] = true;
136
- }
137
- // 如果已登录,验证为true无需锁定 跳出该函数
138
- let currentUser = Parse.User.current();
139
- console.log("currentUser", currentUser);
140
- if (currentUser && currentUser.id) {
141
- // this.setCurrentUserLocalStorage(currentUser)
142
- this.setAccount(currentUser);
143
- this.isLoggedIn = true;
144
- options?.onLogin?.();
145
- return true;
146
- }
147
- // 如果未登录,判断进行两种守卫方式
148
- if (!this.guardType || this.guardType == "page") { // 守卫方式1:页面跳转
149
- // 否则重定向到login页面
150
- // console.log(this.authService.isLoggedIn)
151
- if (url) {
152
- this.redirectUrl = url;
153
- // console.log("请登录:",this.LoginPage)
154
- this.router.navigate([this.LoginPage]);
155
- }
156
- return false;
157
- }
158
- if (this.guardType == "modal") { // 守卫方式2:弹窗锁定
159
- // console.log("触发 守卫方式2:弹窗锁定")
160
- this.isModalShow = true;
161
- this.isLoggedIn = false;
162
- return true;
163
- }
164
- }
165
- // 根据token快捷登录
166
- async checkAndLoginWithToken() {
167
- console.log("checkAndLoginWithToken");
168
- // 获取当前URL的查询参数
169
- const urlParams = new URLSearchParams(window.location.search);
170
- const token = urlParams.get('token');
171
- if (token) {
172
- // 删除token参数并更新URL(不刷新页面)
173
- urlParams.delete('token');
174
- let newUrl = window.location.pathname +
175
- (urlParams.toString() ? '?' + urlParams.toString() : '') +
176
- window.location.hash;
177
- newUrl = decodeURIComponent(newUrl);
178
- console.log("newUrl", newUrl);
179
- // 使用history API更新URL
180
- window.history.replaceState({}, "", newUrl);
181
- setTimeout(() => {
182
- window.history.replaceState({}, "", newUrl);
183
- }, 1000);
184
- // 使用token登录
185
- let user = Parse.User.current();
186
- if (!user?.id) {
187
- try {
188
- user = await Parse.User.become(token);
189
- }
190
- catch (err) { }
191
- }
192
- }
193
- }
194
- async setAccount(user) {
195
- if (this.account?.id)
196
- return;
197
- let Account = Parse.Object.extend("Account");
198
- // this.account = await this.accServ.getUserAccount(user);
199
- let company = user?.get("company") || { __type: "Pointer", className: "Company", objectId: this.getCompanyId() } || null;
200
- let query = new Parse.Query("Account");
201
- query.equalTo("user", user.toPointer());
202
- let account = await query.first();
203
- if (!account?.id) {
204
- account = new Account();
205
- account.set({
206
- user: user.toPointer(),
207
- company: company,
208
- });
209
- account = await account.save();
210
- }
211
- this.account = account;
212
- return account;
213
- }
214
- login(username, password) {
215
- return new Promise((resolve, reject) => {
216
- Parse.User.logIn(username, password).then(async (data) => {
217
- // 检测邀请逻辑
218
- this.bindInvite(data);
219
- // 根据当前用户,设置帐套信息
220
- this.setCurrentUserLocalStorage(data);
221
- // 如果是modal弹窗登录则刷新当前页
222
- if (this.guardType == "modal") {
223
- await this.refreshPage();
224
- resolve(true);
225
- return;
226
- }
227
- // 如果直接进login页面,redirectUrl为undefined 导航至首页
228
- let queryCom = new Parse.Query('Company');
229
- queryCom.select('rootPage');
230
- queryCom.equalTo('objectId', data?.get('company')?.id);
231
- let com = await queryCom.first();
232
- let rootPage = com?.get("rootPage");
233
- this.redirectUrl = this.redirectUrl || rootPage || "/project/dashboard";
234
- let url = this.redirectUrl;
235
- url = decodeURIComponent(url);
236
- this.router.navigate([url]);
237
- }).catch(err => {
238
- console.error(err);
239
- reject({ message: "无此用户信息,请先在小程序登录" });
240
- });
241
- });
242
- }
243
- refreshPage() {
244
- return new Promise(resolve => {
245
- let currentUrl = this.router.url;
246
- // location.reload(); // 页面强制刷新
247
- // resolve(true)
248
- if (Parse.User.current()?.id) {
249
- this.isModalShow = false;
250
- }
251
- ;
252
- // NG路由重载
253
- this.router.navigateByUrl('/', { skipLocationChange: true }).then(() => {
254
- this.router.navigateByUrl(currentUrl).then(() => {
255
- resolve(true);
256
- });
257
- });
258
- });
259
- }
260
- // 用户登录后,更新帐套信息至本地存储
261
- setCurrentUserLocalStorage(user) {
262
- if (user.get("company")?.id) {
263
- localStorage.setItem("company", user.get("company")?.id);
264
- }
265
- }
266
- logout(type, url) {
267
- let company = localStorage.getItem("company");
268
- let WECHAT_APP_ID = localStorage.getItem("WECHAT_APP_ID");
269
- let LOGO_URL = localStorage.getItem("LOGO_URL");
270
- let NOVA_APIG_SERVER = localStorage.getItem("NOVA_APIG_SERVER");
271
- localStorage.clear();
272
- localStorage.setItem('company', company);
273
- localStorage.setItem('WECHAT_APP_ID', WECHAT_APP_ID);
274
- localStorage.setItem('LOGO_URL', LOGO_URL);
275
- localStorage.setItem('NOVA_APIG_SERVER', NOVA_APIG_SERVER);
276
- Parse.User.logOut().then(user => {
277
- });
278
- this.router.navigate([url || "/pcuser/login"]);
279
- }
1
+
280
2
  /**
281
- * 根据帐套内mobile字段登录逻辑
3
+ * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
+ * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
+ * 保留所有权利 All Rights Reserved.
6
+ * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/user/login/auth.service.mjs
282
7
  */
283
- // 手机号+密码登录
284
- async loginMobilePassword(mobile, password, msgServ) {
285
- let username = await this.getMobileUser(mobile);
286
- if (!username) {
287
- msgServ.create("error", "用户不存在,请尝试其他登录方式");
288
- return;
289
- }
290
- return new Promise((resolve, reject) => {
291
- this.login(username, password)
292
- .then(async (data) => {
293
- this.isModalShow = false;
294
- resolve(data);
295
- }).catch(err => {
296
- console.log(err);
297
- msgServ.create("error", "错误的用户名或密码");
298
- reject(err);
299
- });
300
- });
301
- }
302
- signMobilePassword(mobile, password) {
303
- return new Promise(async (resolve, reject) => {
304
- let signedUser = await this.signUpAndUpdate(mobile, password);
305
- resolve(signedUser);
306
- });
307
- }
308
- async getMobileUser(mobile) {
309
- let company = this.getCompanyId();
310
- let userMID = company + mobile;
311
- if (this.mobileUserMap[userMID])
312
- return this.mobileUserMap[userMID];
313
- let result = await this.novaCloud.api("/auth/getusername", {
314
- company: company,
315
- mobile: mobile
316
- });
317
- if (result?.username) {
318
- this.mobileUserMap[userMID] = result?.username;
319
- }
320
- return this.mobileUserMap[userMID];
321
- }
322
- signUpAndUpdate(mobile, password) {
323
- password = password || mobile + "pwd666";
324
- return new Promise(resolve => {
325
- Parse.User.signUp(this.getCompanyId() + "-" + mobile, password, "").then(async (signedUser) => {
326
- if (signedUser.id) {
327
- console.log(signedUser);
328
- signedUser.set("company", {
329
- __type: "Pointer",
330
- className: "Company",
331
- objectId: this.getCompanyId()
332
- });
333
- signedUser.set("mobile", mobile);
334
- signedUser.set("type", "user");
335
- this.bindInvite(signedUser);
336
- signedUser = await signedUser.save();
337
- resolve(signedUser);
338
- }
339
- }).catch(error => {
340
- resolve(undefined);
341
- });
342
- });
343
- }
344
- async getMobileCodeToken(mobile, code) {
345
- return new Promise((resolve, reject) => {
346
- let host = Parse.serverURL?.split("parse")?.[0] || "https://server.fmode.cn/";
347
- this.http.get(host + `api/auth/mobile?company=${this.company}&mobile=${mobile}&code=${code}`).toPromise().then(res => {
348
- resolve(res);
349
- }).catch(error => {
350
- reject(error);
351
- });
352
- });
353
- }
354
- /* 验证码登录 */
355
- async loginCode(mobile, code, msgServ, closeCallBack) {
356
- if (!code) {
357
- this.toast({ color: "primary", message: "请填写有效验证码" });
358
- return;
359
- }
360
- try {
361
- let res = await this.getMobileCodeToken(mobile, code);
362
- if (res?.code == 200) {
363
- console.log(200, res);
364
- let logUser = await Parse.User.become(res.data.token);
365
- console.log(logUser, logUser?.id);
366
- if (logUser?.id) {
367
- console.log(logUser, logUser?.id);
368
- // 检测邀请逻辑
369
- try {
370
- await this.bindInvite(logUser);
371
- }
372
- catch (errb) {
373
- console.error("bind err b", errb);
374
- }
375
- return true;
376
- }
377
- }
378
- }
379
- catch (e) {
380
- console.log("error1", e);
381
- if (e?.error?.mess?.indexOf("用户不存在") > -1) { // 自动注册
382
- let signedUser = await this.signUpAndUpdate(mobile);
383
- if (signedUser?.id) {
384
- return await this.loginCode(mobile, code);
385
- }
386
- }
387
- else {
388
- this.toast({ message: e?.error?.mess });
389
- return;
390
- }
391
- }
392
- }
393
- saveParamsInvite() {
394
- let searchParams = this.novaCloud.searchParse();
395
- console.log("saveParamsInvite", searchParams);
396
- let invite = searchParams?.get("invite");
397
- console.log(invite);
398
- if (invite)
399
- localStorage.setItem("invite", invite);
400
- }
401
- async bindInvite(current) {
402
- current = current || Parse.User.current();
403
- if (!current)
404
- return; // 当前用户必须存在
405
- if (current?.get("invite")?.id)
406
- return; // 当前用户无邀请关系
407
- let invite = localStorage.getItem("invite");
408
- if (!invite)
409
- return; // 本地存储邀请码必须存在
410
- if (current?.id == invite)
411
- return; // 不能邀请自己
412
- let res;
413
- try {
414
- res = await this.novaCloud.api("/auth/invite", {
415
- current: current?.id,
416
- invite: invite,
417
- type: "code"
418
- });
419
- console.log("bind", res);
420
- }
421
- catch (err) {
422
- console.error("bind err", err);
423
- }
424
- return;
425
- }
426
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, deps: [{ token: i1.Router }, { token: i2.ToastController }, { token: i3.NovaCloudService }, { token: i4.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable }); }
427
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, providedIn: 'root' }); }
428
- }
429
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AuthService, decorators: [{
430
- type: Injectable,
431
- args: [{
432
- providedIn: 'root',
433
- }]
434
- }], ctorParameters: () => [{ type: i1.Router }, { type: i2.ToastController }, { type: i3.NovaCloudService }, { type: i4.HttpClient }] });
435
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm1vZGUtbmcvc3JjL2xpYi91c2VyL2xvZ2luL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQU0xQixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsK0RBQStEO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVsRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7Ozs7OztBQVY1RCxJQUFHLENBQUMsS0FBSyxDQUFDLGFBQWEsRUFBQyxDQUFDO0lBQ3ZCLEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDaEMsS0FBYSxDQUFDLFNBQVMsR0FBRyxDQUFFLEtBQWEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksMEJBQTBCLENBQUMsR0FBRyxPQUFPLENBQUM7QUFDckgsQ0FBQztBQVlELE1BQU0sT0FBTyxXQUFXO0lBV3RCLHNCQUFzQjtJQUN0QiwwQkFBMEI7SUFDMUIsZUFBZTtJQUNmLElBQUk7SUFDSixxQkFBcUI7SUFDckIsNkJBQTZCO0lBQzdCLElBQUk7SUFDSixXQUFXLENBQUMsR0FBRztRQUNiLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQTtRQUNmLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEMsSUFBRyxJQUFJLEVBQUUsRUFBRSxFQUFDLENBQUMsQ0FBQyxXQUFXO1lBQ3ZC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QUMsVUFBVSxDQUFDLE9BQVk7UUFDM0IsT0FBTyxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFDLElBQUcsQ0FBQyxPQUFPO1lBQUUsT0FBTSxDQUFDLFdBQVc7UUFDL0IsSUFBRyxPQUFPLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFBRSxPQUFNLENBQUMsWUFBWTtRQUVsRCxJQUFJLE1BQU0sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzNDLElBQUcsQ0FBQyxNQUFNO1lBQUUsT0FBTSxDQUFDLGNBQWM7UUFDakMsSUFBRyxPQUFPLEVBQUUsRUFBRSxJQUFJLE1BQU07WUFBRyxPQUFNLENBQUMsU0FBUztRQUMzQyxJQUFJLEdBQUcsQ0FBQTtRQUVQLElBQUcsQ0FBQztZQUNGLEdBQUcsR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBQztnQkFDNUMsT0FBTyxFQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUNuQixNQUFNLEVBQUMsTUFBTTtnQkFDYixJQUFJLEVBQUMsTUFBTTthQUNaLENBQUMsQ0FBQTtZQUNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3pCLENBQUM7UUFBQSxPQUFNLEdBQUcsRUFBQyxDQUFDO1lBQ1YsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUMsR0FBRyxDQUFDLENBQUE7UUFDL0IsQ0FBQztRQUNELE9BQU07SUFFUixDQUFDOytHQW5jVSxXQUFXO21IQUFYLFdBQVcsY0FGVixNQUFNOzs0RkFFUCxXQUFXO2tCQUh2QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IFBhcnNlIGZyb20gXCJwYXJzZVwiO1xyXG5pZighUGFyc2UuYXBwbGljYXRpb25JZCl7XHJcbiAgUGFyc2UuaW5pdGlhbGl6ZShcIm5jbG91ZG1hc3RlclwiKTtcclxuICAoUGFyc2UgYXMgYW55KS5zZXJ2ZXJVUkwgPSAoKFBhcnNlIGFzIGFueSkuc2VydmVyVVJMPy5zcGxpdChcInBhcnNlXCIpPy5bMF0gfHwgXCJodHRwczovL3NlcnZlci5mbW9kZS5jbi9cIikgKyBcInBhcnNlXCI7XHJcbn1cclxuXHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbi8vIGltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSAnLi4vYWNjb3VudC9hY2NvdW50LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3ZhQ2xvdWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbm92YS1jbG91ZCc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IGNhdGNoRXJyb3IgfSBmcm9tIFwicnhqcy9vcGVyYXRvcnNcIjtcclxuaW1wb3J0IHsgVG9hc3RDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xyXG5cclxuICAvKipcclxuICAgKiDlrojljavmlrnlvI/vvJrmnYPpmZDpqozor4HplIHlrprmlrnlvI9cclxuICAgKiBAdHlwZSBcInBhZ2VcInxcIm1vZGFsXCIgcGFnZemhtemdoui3s+i9rCBtb2RhbOW8ueeql+mUgeWumlxyXG4gICAqL1xyXG4gIGd1YXJkVHlwZTpcInBhZ2VcInxcIm1vZGFsXCJcclxuICBndWFyZE1hcDphbnkgPSB7fVxyXG4gIG1vZGFsVHlwZTpcImZ1bGxzY3JlZW5cInxcInNoZWV0XCIgPSBcImZ1bGxzY3JlZW5cIlxyXG5cclxuICBpc01vZGFsU2hvdzpib29sZWFuID0gZmFsc2VcclxuICAvLyBzZXQgaXNNb2RhbFNob3codil7XHJcbiAgLy8gICB0aGlzLl9pc01vZGFsU2hvdyA9IHZcclxuICAvLyAgIHRoaXMuc2V0QWNcclxuICAvLyB9XHJcbiAgLy8gZ2V0IGlzTW9kYWxTaG93KCl7XHJcbiAgLy8gICByZXR1cm4gdGhpcy5faXNNb2RhbFNob3dcclxuICAvLyB9XHJcbiAgaXNHdWFyZExvY2sodXJsKXtcclxuICAgIGxldCBsb2NrID0gdHJ1ZVxyXG4gICAgbGV0IHVzZXIgPSBQYXJzZS5Vc2VyLmN1cnJlbnQoKTtcclxuICAgIGlmKHVzZXI/LmlkKXsgLy8g55So5oi35bey55m75b2V5LiN6ZSB5a6aXHJcbiAgICAgIGxvY2sgPSBmYWxzZVxyXG4gICAgfWVsc2V7IC8vIOeUqOaIt+acqueZu+W9leS4lOivpemhtemdoumcgOimgeWuiOWNq++8jOWImemUgeWumlxyXG4gICAgICBsb2NrID0gdGhpcy5ndWFyZE1hcFt1cmxdXHJcbiAgICB9XHJcbiAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmd1YXJkTWFwKVxyXG4gICAgLy8gY29uc29sZS5sb2cobG9jaylcclxuICAgIHJldHVybiBsb2NrXHJcbiAgfVxyXG5cclxuICBzaG93QmFja0hvbWU6Ym9vbGVhbiA9IHRydWU7XHJcbiAgLy/ngrnlh7vmjInpkq7liIfmjaLlr7nlupTooajljZVcclxuICBhY3RpdmVCdXR0b246IHN0cmluZyA9IFwi6LSm5Y+35a+G56CBXCI7IC8vIOm7mOiupOS4uuefreS/oemqjOivgeaMiemSrumAieS4rVxyXG4gIGxvZ2luT3B0aW9uczp7XHJcbiAgICB1c2VycHdkPzpib29sZWFuLFxyXG4gICAgbW9iaWxlcHdkPzpib29sZWFuLFxyXG4gICAgbW9iaWxlY29kZT86Ym9vbGVhbixcclxuICAgIHdlY2hhdD86Ym9vbGVhbixcclxuICB9ID0ge1xyXG4gICAgdXNlcnB3ZDp0cnVlLCAvLyDluJDlj7cr5a+G56CBXHJcbiAgICBtb2JpbGVwd2Q6dHJ1ZSwgLy8g5omL5py65Y+3K+WvhueggVxyXG4gICAgbW9iaWxlY29kZTp0cnVlLCAvLyDmiYvmnLor6aqM6K+B56CBXHJcbiAgICB3ZWNoYXQ6dHJ1ZSAvLyDlvq7kv6HmiavnoIHnmbvlvZVcclxuICB9XHJcbiAgZ2V0IGxvZ2luVHlwZUNvdW50KCl7XHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmxvZ2luT3B0aW9ucyk/LmZpbHRlcihpdGVtPT5pdGVtKT8ubGVuZ3RoXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiDkvIHkuJrotKblpZfvvJrnmbvlvZXnlKjmiLfmoKHpqozmiYDlnKjnmoTotKblpZdcclxuICAgKi9cclxuICBfbG9nb1VybCA9IFwiaHR0cHM6Ly9maWxlLnl1YmFuLmNvL2ltZy9sb2dvLWZlaW1hLnBuZ1wiXHJcbiAgZ2V0IGxvZ29VcmwoKXtcclxuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIkxPR09fVVJMXCIpIHx8IHRoaXMuX2xvZ29VcmwgfHwgXCJodHRwczovL2ZpbGUueXViYW4uY28vaW1nL2xvZ28tZmVpbWEucG5nXCJcclxuICB9XHJcbiAgc2V0IGxvZ29Vcmwodil7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcIkxPR09fVVJMXCIsdilcclxuICAgIHRoaXMuX2xvZ29VcmwgPSB0aGlzLl9sb2dvVXJsXHJcbiAgfVxyXG4gIGNvbXBhbnk6c3RyaW5nXHJcbiAgZ2V0Q29tcGFueUlkKCl7XHJcbiAgICBsZXQgY29tcGFueSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY29tcGFueVwiKTtcclxuICAgIGNvbXBhbnkgPSB0aGlzLmNvbXBhbnkgfHwgY29tcGFueVxyXG4gICAgcmV0dXJuIGNvbXBhbnlcclxuICB9XHJcbiAgXHJcbiAgd2VjaGF0VXJsOnN0cmluZyA9IFwiaHR0cHM6Ly9hcHAuZm1vZGUuY24vbG9nby96MHFyLmpwZ1wiXHJcblxyXG4gIC8qKlxyXG4gICAqIOi1hOmHkei0puaIt++8mnVzZXLoh6rliqjliJvlu7rllK/kuIDotYTph5HotKbmiLdcclxuICAgKi9cclxuICBhY2NvdW50OlBhcnNlLk9iamVjdFxyXG5cclxuICAvKipcclxuICAgKiDnmbvlvZXnirbmgIHvvJrpu5jorqRmYWxzZe+8jOeZu+mZhuWQjuS4unRydWVcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKiDnlKjkuo7lrojljavlvLnnqpfplIHlrprmqKHlnZfmoKHpqoxcclxuICAgKi9cclxuICBpc0xvZ2dlZEluID0gZmFsc2U7XHJcblxyXG4gIC8vIHN0b3JlIHRoZSBVUkwgc28gd2UgY2FuIHJlZGlyZWN0IGFmdGVyIGxvZ2dpbmcgaW5cclxuICByZWRpcmVjdFVybDogc3RyaW5nO1xyXG5cclxuICBhcHBJZDpzdHJpbmcgLy8g5b6u5L+hYXBwaWRcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICAvLyBwcml2YXRlIGFjY1NlcnY6QWNjb3VudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0Q3RybDpUb2FzdENvbnRyb2xsZXIsXHJcbiAgICBwcml2YXRlIG5vdmFDbG91ZDpOb3ZhQ2xvdWRTZXJ2aWNlLHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwpIHtcclxuICB9XHJcbiAgYXN5bmMgdG9hc3Qob3B0aW9uczphbnkpe1xyXG4gICAgb3B0aW9ucy5wb3NpdGlvbiA9IG9wdGlvbnM/LnBvc2l0aW9uIHx8IFwidG9wXCJcclxuICAgIG9wdGlvbnMuZHVyYXRpb24gPSBvcHRpb25zPy5kdXJhdGlvbiB8fCAxNTAwXHJcbiAgICBvcHRpb25zLmNvbG9yID0gb3B0aW9ucz8uY29sb3IgfHwgXCJwcmltYXJ5XCJcclxuICAgIGxldCB0b2FzdCA9IGF3YWl0IHRoaXMudG9hc3RDdHJsLmNyZWF0ZShvcHRpb25zKVxyXG4gICAgdG9hc3QucHJlc2VudCgpXHJcbiAgfVxyXG4gICAgbWVzc2FnZSA9IHtcclxuICAgICAgc3VjY2VzczoobXNnOnN0cmluZyk9PntcclxuICAgICAgICB0aGlzLnRvYXN0KHtjb2xvcjpcInN1Y2Nlc3NcIixtZXNzYWdlOm1zZ30pXHJcbiAgICAgIH0sXHJcbiAgICAgIGNyZWF0ZToodHlwZTpzdHJpbmcsbXNnOnN0cmluZyk9PntcclxuICAgICAgICBpZih0eXBlPT1cImVycm9yXCIpe3R5cGU9XCJkYW5nZXJcIn1cclxuICAgICAgICB0aGlzLnRvYXN0KHtjb2xvcjp0eXBlLG1lc3NhZ2U6bXNnfSlcclxuICAgICAgfSxcclxuICAgICAgaW5mbzoobXNnOnN0cmluZyk9PntcclxuICAgICAgICB0aGlzLnRvYXN0KHttZXNzYWdlOm1zZ30pXHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOihtc2c6c3RyaW5nKT0+e1xyXG4gICAgICAgIHRoaXMudG9hc3Qoe2NvbG9yOlwiZGFuZ2VyXCIsbWVzc2FnZTptc2d9KVxyXG4gICAgICB9LFxyXG4gICAgfVxyXG4gIGluaXQob3B0aW9uczp7XHJcbiAgICBjb21wYW55PzpzdHJpbmdcclxuICAgIGd1YXJkVHlwZT86XCJwYWdlXCJ8XCJtb2RhbFwiXHJcbiAgICBMb2dpblBhZ2U/OnN0cmluZ1xyXG4gICAgbW9kYWxUeXBlPzpcImZ1bGxzY3JlZW5cInxcInNoZWV0XCIsXHJcbiAgICBhcHBJZD86c3RyaW5nXHJcbiAgfSl7XHJcbiAgICB0aGlzLmNvbXBhbnkgPSBvcHRpb25zLmNvbXBhbnk7XHJcbiAgICB0aGlzLmd1YXJkVHlwZSA9IG9wdGlvbnMuZ3VhcmRUeXBlXHJcbiAgICB0aGlzLm1vZGFsVHlwZSA9IG9wdGlvbnMubW9kYWxUeXBlIHx8IHRoaXMubW9kYWxUeXBlXHJcbiAgICB0aGlzLmFwcElkID0gb3B0aW9ucy5hcHBJZFxyXG4gICAgdGhpcy5zYXZlUGFyYW1zSW52aXRlKClcclxuICB9XHJcbiAgY2hlY2tMb2dpbkxvY2soKXtcclxuICAgIGxldCB1c2VyID0gUGFyc2UuVXNlci5jdXJyZW50KCk7XHJcbiAgICBpZih1c2VyPy5pZCl7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5pc01vZGFsU2hvdyA9IHRydWU7XHJcbiAgICAgIHRoaXMuaXNMb2dnZWRJbiA9IGZhbHNlO1xyXG4gICAgICByZXR1cm4gZmFsc2VcclxuICAgIH1cclxuICB9XHJcbiAgTG9naW5QYWdlID0gJy9wY3VzZXIvbG9naW4nXHJcbiAgYXN5bmMgY2hlY2tMb2dpbih1cmw/OiBzdHJpbmcsb3B0aW9ucz86e1xyXG4gICAgb25Mb2dpbjpGdW5jdGlvblxyXG4gIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIC8vIOajgOa1i3Rva2Vu5b+r5o2355m75b2VXHJcbiAgICBhd2FpdCB0aGlzLmNoZWNrQW5kTG9naW5XaXRoVG9rZW4oKTtcclxuICAgIC8vIOWwhnVybOiusOW9leWcqOiiq+WuiOWNq+mhteWIl+ihqOS4re+8jOS+v+S6juWQjue7reajgOa1i+W8ueeql+mUgeWumlxyXG4gICAgaWYodXJsKXtcclxuICAgICAgdGhpcy5ndWFyZE1hcFt1cmxdID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzlt7LnmbvlvZXvvIzpqozor4HkuLp0cnVl5peg6ZyA6ZSB5a6aIOi3s+WHuuivpeWHveaVsFxyXG4gICAgbGV0IGN1cnJlbnRVc2VyID0gUGFyc2UuVXNlci5jdXJyZW50KCk7XHJcbiAgICBcclxuICAgIGNvbnNvbGUubG9nKFwiY3VycmVudFVzZXJcIixjdXJyZW50VXNlcilcclxuICAgIGlmIChjdXJyZW50VXNlciYmY3VycmVudFVzZXIuaWQpIHsgXHJcbiAgICAgIC8vIHRoaXMuc2V0Q3VycmVudFVzZXJMb2NhbFN0b3JhZ2UoY3VycmVudFVzZXIpXHJcbiAgICAgIHRoaXMuc2V0QWNjb3VudChjdXJyZW50VXNlcik7XHJcbiAgICAgIHRoaXMuaXNMb2dnZWRJbiA9IHRydWVcclxuICAgICAgb3B0aW9ucz8ub25Mb2dpbj8uKCk7XHJcbiAgICAgIHJldHVybiB0cnVlOyBcclxuICAgIH1cclxuXHJcbiAgICAvLyDlpoLmnpzmnKrnmbvlvZXvvIzliKTmlq3ov5vooYzkuKTnp43lrojljavmlrnlvI9cclxuICAgIGlmKCF0aGlzLmd1YXJkVHlwZSB8fCB0aGlzLmd1YXJkVHlwZT09XCJwYWdlXCIpeyAvLyDlrojljavmlrnlvI8x77ya6aG16Z2i6Lez6L2sXHJcbiAgICAgIC8vIOWQpuWImemHjeWumuWQkeWIsGxvZ2lu6aG16Z2iXHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuYXV0aFNlcnZpY2UuaXNMb2dnZWRJbilcclxuICAgICAgaWYodXJsKXtcclxuICAgICAgICB0aGlzLnJlZGlyZWN0VXJsID0gdXJsO1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwi6K+355m75b2V77yaXCIsdGhpcy5Mb2dpblBhZ2UpXHJcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuTG9naW5QYWdlXSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlXHJcbiAgICB9XHJcbiAgICBpZih0aGlzLmd1YXJkVHlwZT09XCJtb2RhbFwiKXsgLy8g5a6I5Y2r5pa55byPMu+8muW8ueeql+mUgeWumlxyXG4gICAgICAvLyBjb25zb2xlLmxvZyhcIuinpuWPkSDlrojljavmlrnlvI8y77ya5by556qX6ZSB5a6aXCIpXHJcbiAgICAgIHRoaXMuaXNNb2RhbFNob3cgPSB0cnVlO1xyXG4gICAgICB0aGlzLmlzTG9nZ2VkSW4gPSBmYWxzZTtcclxuICAgICAgcmV0dXJuIHRydWVcclxuICAgIH1cclxuICB9XHJcbiAgLy8g5qC55o2udG9rZW7lv6vmjbfnmbvlvZVcclxuICBhc3luYyBjaGVja0FuZExvZ2luV2l0aFRva2VuKCkge1xyXG4gICAgY29uc29sZS5sb2coXCJjaGVja0FuZExvZ2luV2l0aFRva2VuXCIpXHJcbiAgICAvLyDojrflj5blvZPliY1VUkznmoTmn6Xor6Llj4LmlbBcclxuICAgIGNvbnN0IHVybFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7XHJcbiAgICBjb25zdCB0b2tlbiA9IHVybFBhcmFtcy5nZXQoJ3Rva2VuJyk7XHJcbiAgXHJcbiAgICBpZiAodG9rZW4pIHtcclxuICAgICAgLy8g5Yig6ZmkdG9rZW7lj4LmlbDlubbmm7TmlrBVUkzvvIjkuI3liLfmlrDpobXpnaLvvIlcclxuICAgICAgdXJsUGFyYW1zLmRlbGV0ZSgndG9rZW4nKTtcclxuICAgICAgbGV0IG5ld1VybCA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArIFxyXG4gICAgICAgICAgICAgICAgICAgICh1cmxQYXJhbXMudG9TdHJpbmcoKSA/ICc/JyArIHVybFBhcmFtcy50b1N0cmluZygpIDogJycpICsgXHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhhc2g7XHJcbiAgICAgIG5ld1VybCA9IGRlY29kZVVSSUNvbXBvbmVudChuZXdVcmwpO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIm5ld1VybFwiLG5ld1VybClcclxuICAgICAgLy8g5L2/55SoaGlzdG9yeSBBUEnmm7TmlrBVUkxcclxuICAgICAgd2luZG93Lmhpc3RvcnkucmVwbGFjZVN0YXRlKHt9LCBcIlwiLCBuZXdVcmwpO1xyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIFwiXCIsIG5ld1VybCk7XHJcbiAgICAgIH0sIDEwMDApO1xyXG4gICAgICAvLyDkvb/nlKh0b2tlbueZu+W9lVxyXG4gICAgICBsZXQgdXNlciA9IFBhcnNlLlVzZXIuY3VycmVudCgpO1xyXG4gICAgICBpZighdXNlcj8uaWQpe1xyXG4gICAgICAgIHRyeXtcclxuICAgICAgICAgIHVzZXIgPSBhd2FpdCBQYXJzZS5Vc2VyLmJlY29tZSh0b2tlbilcclxuICAgICAgICB9Y2F0Y2goZXJyKXt9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgYXN5bmMgc2V0QWNjb3VudCh1c2VyKXtcclxuICAgIGlmKHRoaXMuYWNjb3VudD8uaWQpIHJldHVybjtcclxuICAgIGxldCBBY2NvdW50ID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIkFjY291bnRcIilcclxuICAgIC8vIHRoaXMuYWNjb3VudCA9IGF3YWl0IHRoaXMuYWNjU2Vydi5nZXRVc2VyQWNjb3VudCh1c2VyKTtcclxuICAgIGxldCBjb21wYW55ID0gdXNlcj8uZ2V0KFwiY29tcGFueVwiKSB8fCB7X190eXBlOlwiUG9pbnRlclwiLGNsYXNzTmFtZTpcIkNvbXBhbnlcIixvYmplY3RJZDp0aGlzLmdldENvbXBhbnlJZCgpfSB8fCBudWxsXHJcbiAgICBsZXQgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJBY2NvdW50XCIpO1xyXG4gICAgcXVlcnkuZXF1YWxUbyhcInVzZXJcIix1c2VyLnRvUG9pbnRlcigpKVxyXG4gICAgbGV0IGFjY291bnQgPSBhd2FpdCBxdWVyeS5maXJzdCgpO1xyXG4gICAgaWYoIWFjY291bnQ/LmlkKXtcclxuICAgICAgYWNjb3VudCA9IG5ldyBBY2NvdW50KCk7XHJcbiAgICAgIGFjY291bnQuc2V0KHtcclxuICAgICAgICB1c2VyOnVzZXIudG9Qb2ludGVyKCksXHJcbiAgICAgICAgY29tcGFueTpjb21wYW55LFxyXG4gICAgICB9KVxyXG4gICAgICBhY2NvdW50ID0gYXdhaXQgYWNjb3VudC5zYXZlKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFjY291bnQgPSBhY2NvdW50XHJcbiAgICByZXR1cm4gYWNjb3VudFxyXG4gIH1cclxuXHJcbiAgbG9naW4odXNlcm5hbWUsIHBhc3N3b3JkKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUscmVqZWN0KT0+e1xyXG4gICAgICBQYXJzZS5Vc2VyLmxvZ0luKHVzZXJuYW1lLCBwYXNzd29yZCkudGhlbiggYXN5bmMgZGF0YSA9PiB7XHJcblxyXG4gICAgICAvLyDmo4DmtYvpgoDor7fpgLvovpFcclxuICAgICAgdGhpcy5iaW5kSW52aXRlKGRhdGEpO1xyXG5cclxuICAgICAgLy8g5qC55o2u5b2T5YmN55So5oi377yM6K6+572u5biQ5aWX5L+h5oGvXHJcbiAgICAgIHRoaXMuc2V0Q3VycmVudFVzZXJMb2NhbFN0b3JhZ2UoZGF0YSk7XHJcbiAgICAgIFxyXG4gICAgICAvLyDlpoLmnpzmmK9tb2RhbOW8ueeql+eZu+W9leWImeWIt+aWsOW9k+WJjemhtVxyXG4gICAgICBpZih0aGlzLmd1YXJkVHlwZT09XCJtb2RhbFwiKXtcclxuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hQYWdlKCk7XHJcbiAgICAgICAgcmVzb2x2ZSh0cnVlKVxyXG4gICAgICAgIHJldHVyblxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyDlpoLmnpznm7TmjqXov5tsb2dpbumhtemdou+8jHJlZGlyZWN0VXJs5Li6dW5kZWZpbmVkIOWvvOiIquiHs+mmlumhtVxyXG4gICAgICBsZXQgcXVlcnlDb20gPSBuZXcgUGFyc2UuUXVlcnkoJ0NvbXBhbnknKVxyXG4gICAgICBxdWVyeUNvbS5zZWxlY3QoJ3Jvb3RQYWdlJylcclxuICAgICAgcXVlcnlDb20uZXF1YWxUbygnb2JqZWN0SWQnLGRhdGE/LmdldCgnY29tcGFueScpPy5pZClcclxuICAgICAgbGV0IGNvbSA9IGF3YWl0IHF1ZXJ5Q29tLmZpcnN0KClcclxuICAgICAgICBsZXQgcm9vdFBhZ2UgPSBjb20/LmdldChcInJvb3RQYWdlXCIpXHJcbiAgICAgICAgIHRoaXMucmVkaXJlY3RVcmwgPSAgdGhpcy5yZWRpcmVjdFVybCB8fCByb290UGFnZSB8fCBcIi9wcm9qZWN0L2Rhc2hib2FyZFwiXHJcbiAgICAgICBsZXQgdXJsID0gdGhpcy5yZWRpcmVjdFVybDtcclxuICAgICAgIHVybCA9IGRlY29kZVVSSUNvbXBvbmVudCh1cmwpO1xyXG4gICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3VybF0pO1xyXG4gICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICBjb25zb2xlLmVycm9yKGVycilcclxuICAgICAgIHJlamVjdCh7IG1lc3NhZ2U6IFwi5peg5q2k55So5oi35L+h5oGv77yM6K+35YWI5Zyo5bCP56iL5bqP55m75b2VXCIgfSlcclxuICAgIH0pXHJcbiAgIH0pXHJcbiB9XHJcbiByZWZyZXNoUGFnZSgpIHtcclxuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZT0+e1xyXG4gICAgbGV0IGN1cnJlbnRVcmwgPSB0aGlzLnJvdXRlci51cmw7XHJcblxyXG4gICAgLy8gbG9jYXRpb24ucmVsb2FkKCk7IC8vIOmhtemdouW8uuWItuWIt+aWsFxyXG4gICAgLy8gcmVzb2x2ZSh0cnVlKVxyXG4gICAgaWYoUGFyc2UuVXNlci5jdXJyZW50KCk/LmlkKXt0aGlzLmlzTW9kYWxTaG93PWZhbHNlfTtcclxuXHJcbiAgICAvLyBOR+i3r+eUsemHjei9vVxyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGVCeVVybCgnLycsIHsgc2tpcExvY2F0aW9uQ2hhbmdlOiB0cnVlIH0pLnRoZW4oKCkgPT4ge1xyXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKGN1cnJlbnRVcmwpLnRoZW4oKCk9PntcclxuICAgICAgICByZXNvbHZlKHRydWUpXHJcbiAgICAgIH0pXHJcbiAgICB9KTtcclxuICB9KVxyXG59XHJcblxyXG4gLy8g55So5oi355m75b2V5ZCO77yM5pu05paw5biQ5aWX5L+h5oGv6Iez5pys5Zyw5a2Y5YKoXHJcbiBzZXRDdXJyZW50VXNlckxvY2FsU3RvcmFnZSh1c2VyOlBhcnNlLlVzZXIpe1xyXG4gIGlmKHVzZXIuZ2V0KFwiY29tcGFueVwiKT8uaWQpe1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oXCJjb21wYW55XCIsdXNlci5nZXQoXCJjb21wYW55XCIpPy5pZClcclxuICB9XHJcbiB9XHJcblxyXG4gbG9nb3V0KHR5cGUsdXJsKTogdm9pZCB7XHJcbiAgICBsZXQgY29tcGFueSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiY29tcGFueVwiKTtcclxuICAgIGxldCBXRUNIQVRfQVBQX0lEID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJXRUNIQVRfQVBQX0lEXCIpO1xyXG4gICAgbGV0IExPR09fVVJMID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJMT0dPX1VSTFwiKTtcclxuICAgIGxldCBOT1ZBX0FQSUdfU0VSVkVSID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJOT1ZBX0FQSUdfU0VSVkVSXCIpO1xyXG4gICAgbG9jYWxTdG9yYWdlLmNsZWFyKCk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnY29tcGFueScsY29tcGFueSk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnV0VDSEFUX0FQUF9JRCcsV0VDSEFUX0FQUF9JRCk7XHJcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnTE9HT19VUkwnLExPR09fVVJMKTtcclxuICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdOT1ZBX0FQSUdfU0VSVkVSJyxOT1ZBX0FQSUdfU0VSVkVSKTtcclxuICAgIFxyXG4gICAgUGFyc2UuVXNlci5sb2dPdXQoKS50aGVuKHVzZXI9PntcclxuICAgIH0pO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3VybHx8XCIvcGN1c2VyL2xvZ2luXCJdKTtcclxuICB9XHJcblxyXG4gIC8qKiBcclxuICAgKiDmoLnmja7luJDlpZflhoVtb2JpbGXlrZfmrrXnmbvlvZXpgLvovpFcclxuICAgKi9cclxuICAvLyDmiYvmnLrlj7cr5a+G56CB55m75b2VXHJcbiAgYXN5bmMgbG9naW5Nb2JpbGVQYXNzd29yZChtb2JpbGU6c3RyaW5nLHBhc3N3b3JkOnN0cmluZyxtc2dTZXJ2KXtcclxuICAgIGxldCB1c2VybmFtZSA9IGF3YWl0IHRoaXMuZ2V0TW9iaWxlVXNlcihtb2JpbGUpXHJcbiAgICBpZighdXNlcm5hbWUpe1xyXG4gICAgICBtc2dTZXJ2LmNyZWF0ZShcImVycm9yXCIsIFwi55So5oi35LiN5a2Y5Zyo77yM6K+35bCd6K+V5YW25LuW55m75b2V5pa55byPXCIpO1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMubG9naW4odXNlcm5hbWUsIHBhc3N3b3JkKVxyXG4gICAgICAudGhlbihhc3luYyBkYXRhID0+IHtcclxuICAgICAgICB0aGlzLmlzTW9kYWxTaG93ID0gZmFsc2U7XHJcbiAgICAgICAgcmVzb2x2ZShkYXRhKVxyXG4gICAgICB9KS5jYXRjaChlcnIgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKGVycilcclxuICAgICAgICBtc2dTZXJ2LmNyZWF0ZShcImVycm9yXCIsIFwi6ZSZ6K+v55qE55So5oi35ZCN5oiW5a+G56CBXCIpO1xyXG4gICAgICAgIHJlamVjdChlcnIpXHJcbiAgICAgIH0pO1xyXG4gICAgfSlcclxuICB9XHJcbiAgc2lnbk1vYmlsZVBhc3N3b3JkKG1vYmlsZTpzdHJpbmcscGFzc3dvcmQ6c3RyaW5nKTpQcm9taXNlPGFueT57XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoYXN5bmMgKHJlc29sdmUscmVqZWN0KT0+e1xyXG4gICAgICBsZXQgc2lnbmVkVXNlciA9IGF3YWl0IHRoaXMuc2lnblVwQW5kVXBkYXRlKG1vYmlsZSxwYXNzd29yZCk7XHJcbiAgICAgIHJlc29sdmUoc2lnbmVkVXNlcilcclxuICAgIH0pXHJcblxyXG4gIH1cclxuICAvLyDmoLnmja7miYvmnLrlj7fojrflvpfluJDlpZflhoXnlKjmiLflkI1cclxuICBtb2JpbGVVc2VyTWFwID0ge31cclxuICBhc3luYyBnZXRNb2JpbGVVc2VyKG1vYmlsZTpzdHJpbmcpe1xyXG4gICAgbGV0IGNvbXBhbnkgPSB0aGlzLmdldENvbXBhbnlJZCgpXHJcbiAgICBsZXQgdXNlck1JRCA9IGNvbXBhbnkrbW9iaWxlXHJcbiAgICBpZih0aGlzLm1vYmlsZVVzZXJNYXBbdXNlck1JRF0pIHJldHVybiB0aGlzLm1vYmlsZVVzZXJNYXBbdXNlck1JRF1cclxuICAgIGxldCByZXN1bHQ6YW55ID0gYXdhaXQgdGhpcy5ub3ZhQ2xvdWQuYXBpKFwiL2F1dGgvZ2V0dXNlcm5hbWVcIix7XHJcbiAgICAgIGNvbXBhbnk6Y29tcGFueSxcclxuICAgICAgbW9iaWxlOm1vYmlsZVxyXG4gICAgfSlcclxuICAgIGlmKHJlc3VsdD8udXNlcm5hbWUpe1xyXG4gICAgICB0aGlzLm1vYmlsZVVzZXJNYXBbdXNlck1JRF0gPSByZXN1bHQ/LnVzZXJuYW1lXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5tb2JpbGVVc2VyTWFwW3VzZXJNSURdXHJcbiAgfVxyXG4gIGVuYWJsZWRMb2NhbENvZGU6Ym9vbGVhbiA9IGZhbHNlOyAvLyDlvIDlkK/pqozor4HnoIFcclxuXHJcbiAgc2lnblVwQW5kVXBkYXRlKG1vYmlsZSxwYXNzd29yZD86c3RyaW5nKTpQcm9taXNlPFBhcnNlLk9iamVjdHx1bmRlZmluZWQ+e1xyXG4gICAgcGFzc3dvcmQgPSBwYXNzd29yZCB8fCBtb2JpbGUrXCJwd2Q2NjZcIlxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmU9PntcclxuICAgICAgUGFyc2UuVXNlci5zaWduVXAoXHJcbiAgICAgICAgdGhpcy5nZXRDb21wYW55SWQoKStcIi1cIiArIG1vYmlsZSxcclxuICAgICAgICAgIHBhc3N3b3JkLFxyXG4gICAgICAgICAgXCJcIlxyXG4gICAgICAgICkudGhlbihhc3luYyBzaWduZWRVc2VyPT57XHJcbiAgICAgICAgICBpZiAoc2lnbmVkVXNlci5pZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhzaWduZWRVc2VyKVxyXG4gICAgICAgICAgICBzaWduZWRVc2VyLnNldChcImNvbXBhbnlcIiwge1xyXG4gICAgICAgICAgICAgIF9fdHlwZTogXCJQb2ludGVyXCIsXHJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIkNvbXBhbnlcIixcclxuICAgICAgICAgICAgICBvYmplY3RJZDogdGhpcy5nZXRDb21wYW55SWQoKVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgc2lnbmVkVXNlci5zZXQoXCJtb2JpbGVcIiwgbW9iaWxlKTtcclxuICAgICAgICAgICAgc2lnbmVkVXNlci5zZXQoXCJ0eXBlXCIsXCJ1c2VyXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmJpbmRJbnZpdGUoc2lnbmVkVXNlcik7XHJcbiAgICAgICAgICAgIHNpZ25lZFVzZXIgPSBhd2FpdCBzaWduZWRVc2VyLnNhdmUoKTtcclxuICAgICAgICAgICAgcmVzb2x2ZShzaWduZWRVc2VyKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLmNhdGNoKGVycm9yPT57XHJcbiAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZClcclxuICAgICAgICB9KVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIGFzeW5jIGdldE1vYmlsZUNvZGVUb2tlbihtb2JpbGUsY29kZSk6UHJvbWlzZTxhbnk+e1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PntcclxuICAgICAgbGV0IGhvc3QgPSAoUGFyc2UgYXMgYW55KS5zZXJ2ZXJVUkw/LnNwbGl0KFwicGFyc2VcIik/LlswXSB8fCBcImh0dHBzOi8vc2VydmVyLmZtb2RlLmNuL1wiXHJcbiAgICAgIHRoaXMuaHR0cC5nZXQoaG9zdCtgYXBpL2F1dGgvbW9iaWxlP2NvbXBhbnk9JHt0aGlzLmNvbXBhbnl9Jm1vYmlsZT0ke21vYmlsZX0mY29kZT0ke2NvZGV9YCkudG9Qcm9taXNlKCkudGhlbihyZXM9PntcclxuICAgICAgICByZXNvbHZlKHJlcyk7XHJcbiAgICAgIH0pLmNhdGNoKGVycm9yPT57XHJcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgfSlcclxuICAgIH0pXHJcbiAgICAgIFxyXG4gIH1cclxuXHJcbiAgLyog6aqM6K+B56CB55m75b2VICovXHJcbiAgYXN5bmMgbG9naW5Db2RlKG1vYmlsZTpzdHJpbmcsIGNvZGU6c3RyaW5nLCBtc2dTZXJ2PyxjbG9zZUNhbGxCYWNrPzphbnkpOiBQcm9taXNlPEJvb2xlYW4+IHtcclxuICAgICAgaWYgKCFjb2RlKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdCh7Y29sb3I6XCJwcmltYXJ5XCIsbWVzc2FnZTpcIuivt+Whq+WGmeacieaViOmqjOivgeeggVwifSlcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyeXtcclxuICAgICAgICBsZXQgcmVzID0gYXdhaXQgdGhpcy5nZXRNb2JpbGVDb2RlVG9rZW4obW9iaWxlLGNvZGUpO1xyXG4gICAgICAgIGlmIChyZXM/LmNvZGUgPT0gMjAwKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygyMDAscmVzKVxyXG5cclxuICAgICAgICAgIGxldCBsb2dVc2VyID0gYXdhaXQgUGFyc2UuVXNlci5iZWNvbWUocmVzLmRhdGEudG9rZW4pO1xyXG4gICAgICAgICAgY29uc29sZS5sb2cobG9nVXNlcixsb2dVc2VyPy5pZClcclxuICAgICAgICAgIGlmIChsb2dVc2VyPy5pZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhsb2dVc2VyLGxvZ1VzZXI/LmlkKVxyXG4gICAgICAgICAgICAvLyDmo4DmtYvpgoDor7fpgLvovpFcclxuICAgICAgICAgICAgdHJ5e1xyXG4gICAgICAgICAgICAgIGF3YWl0IHRoaXMuYmluZEludml0ZShsb2dVc2VyKTtcclxuICAgICAgICAgICAgfWNhdGNoKGVycmIpe1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJiaW5kIGVyciBiXCIsZXJyYilcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1jYXRjaChlKXtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImVycm9yMVwiLGUpO1xyXG4gICAgICAgIGlmKGU/LmVycm9yPy5tZXNzPy5pbmRleE9mKFwi55So5oi35LiN5a2Y5ZyoXCIpPi0xKXsgLy8g6Ieq5Yqo5rOo5YaMXHJcbiAgICAgICAgICBsZXQgc2lnbmVkVXNlciA9IGF3YWl0IHRoaXMuc2lnblVwQW5kVXBkYXRlKG1vYmlsZSk7XHJcbiAgICAgICAgICBpZihzaWduZWRVc2VyPy5pZCl7XHJcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmxvZ2luQ29kZShtb2JpbGUsY29kZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0KHttZXNzYWdlOmU/LmVycm9yPy5tZXNzfSlcclxuICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gIH1cclxuICBzYXZlUGFyYW1zSW52aXRlKCl7XHJcbiAgICBsZXQgc2VhcmNoUGFyYW1zID0gdGhpcy5ub3ZhQ2xvdWQuc2VhcmNoUGFyc2UoKVxyXG4gICAgY29uc29sZS5sb2coXCJzYXZlUGFyYW1zSW52aXRlXCIsc2VhcmNoUGFyYW1zKVxyXG4gICAgbGV0IGludml0ZSA9IHNlYXJjaFBhcmFtcz8uZ2V0KFwiaW52aXRlXCIpO1xyXG4gICAgY29uc29sZS5sb2coaW52aXRlKVxyXG4gICAgaWYoaW52aXRlKSBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShcImludml0ZVwiLGludml0ZSlcclxuICB9XHJcbiAgYXN5bmMgYmluZEludml0ZShjdXJyZW50Pzphbnkpe1xyXG4gICAgY3VycmVudCA9IGN1cnJlbnQgfHwgUGFyc2UuVXNlci5jdXJyZW50KCk7XHJcbiAgICBpZighY3VycmVudCkgcmV0dXJuIC8vIOW9k+WJjeeUqOaIt+W/hemhu+WtmOWcqFxyXG4gICAgaWYoY3VycmVudD8uZ2V0KFwiaW52aXRlXCIpPy5pZCkgcmV0dXJuIC8vIOW9k+WJjeeUqOaIt+aXoOmCgOivt+WFs+ezu1xyXG4gICAgXHJcbiAgICBsZXQgaW52aXRlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJpbnZpdGVcIikgXHJcbiAgICBpZighaW52aXRlKSByZXR1cm4gLy8g5pys5Zyw5a2Y5YKo6YKA6K+356CB5b+F6aG75a2Y5ZyoXHJcbiAgICBpZihjdXJyZW50Py5pZCA9PSBpbnZpdGUgKSByZXR1cm4gLy8g5LiN6IO96YKA6K+36Ieq5bexXHJcbiAgICBsZXQgcmVzIFxyXG4gICAgXHJcbiAgICB0cnl7XHJcbiAgICAgIHJlcyA9IGF3YWl0IHRoaXMubm92YUNsb3VkLmFwaShcIi9hdXRoL2ludml0ZVwiLHtcclxuICAgICAgICBjdXJyZW50OmN1cnJlbnQ/LmlkLFxyXG4gICAgICAgIGludml0ZTppbnZpdGUsXHJcbiAgICAgICAgdHlwZTpcImNvZGVcIlxyXG4gICAgICB9KVxyXG4gICAgICBjb25zb2xlLmxvZyhcImJpbmRcIixyZXMpXHJcbiAgICB9Y2F0Y2goZXJyKXtcclxuICAgICAgY29uc29sZS5lcnJvcihcImJpbmQgZXJyXCIsZXJyKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuXHJcblxyXG4gIH1cclxufSJdfQ==
8
+ import{Injectable}from"@angular/core";import{FmodeParse}from"@fmode/parse";import{Router}from"@angular/router";import{NovaCloudService}from"../../nova-cloud";import{HttpClient}from"@angular/common/http";import{ToastController}from"@ionic/angular/standalone";import*as i0 from"@angular/core";import*as i1 from"@angular/router";import*as i2 from"@ionic/angular/standalone";import*as i3 from"../../nova-cloud";import*as i4 from"@angular/common/http";const Parse=FmodeParse.with("nova");export class AuthService{isGuardLock(e){let t=!0,o=Parse.User.current();return t=!o?.id&&this.guardMap[e],t}get loginTypeCount(){return Object.values(this.loginOptions)?.filter((e=>e))?.length}get logoUrl(){return localStorage.getItem("LOGO_URL")||this._logoUrl||"https://file.yuban.co/img/logo-feima.png"}set logoUrl(e){localStorage.setItem("LOGO_URL",e),this._logoUrl=this._logoUrl}getCompanyId(){let e=localStorage.getItem("company");return e=this.company||e,e}constructor(e,t,o,r){this.router=e,this.toastCtrl=t,this.novaCloud=o,this.http=r,this.guardMap={},this.modalType="fullscreen",this.isModalShow=!1,this.showBackHome=!0,this.activeButton="账号密码",this.loginOptions={userpwd:!0,mobilepwd:!0,mobilecode:!0,wechat:!0},this._logoUrl="https://file.yuban.co/img/logo-feima.png",this.wechatUrl="https://app.fmode.cn/logo/z0qr.jpg",this.isLoggedIn=!1,this.message={success:e=>{this.toast({color:"success",message:e})},create:(e,t)=>{"error"==e&&(e="danger"),this.toast({color:e,message:t})},info:e=>{this.toast({message:e})},error:e=>{this.toast({color:"danger",message:e})}},this.LoginPage="/pcuser/login",this.mobileUserMap={},this.enabledLocalCode=!1}async toast(e){e.position=e?.position||"top",e.duration=e?.duration||1500,e.color=e?.color||"primary",(await this.toastCtrl.create(e)).present()}init(e){this.company=e.company,this.guardType=e.guardType,this.modalType=e.modalType||this.modalType,this.appId=e.appId,this.saveParamsInvite()}checkLoginLock(){let e=Parse.User.current();return!!e?.id||(this.isModalShow=!0,this.isLoggedIn=!1,!1)}async checkLogin(e,t){await this.checkAndLoginWithToken(),e&&(this.guardMap[e]=!0);let o=Parse.User.current();return console.log("currentUser",o),o&&o.id?(this.setAccount(o),this.isLoggedIn=!0,t?.onLogin?.(),!0):this.guardType&&"page"!=this.guardType?"modal"==this.guardType?(this.isModalShow=!0,this.isLoggedIn=!1,!0):void 0:(e&&(this.redirectUrl=e,this.router.navigate([this.LoginPage])),!1)}async checkAndLoginWithToken(){console.log("checkAndLoginWithToken");const e=new URLSearchParams(window.location.search),t=e.get("token");if(t){e.delete("token");let o=window.location.pathname+(e.toString()?"?"+e.toString():"")+window.location.hash;o=decodeURIComponent(o),console.log("newUrl",o),window.history.replaceState({},"",o),setTimeout((()=>{window.history.replaceState({},"",o)}),1e3);let r=Parse.User.current();if(!r?.id)try{r=await Parse.User.become(t)}catch(e){}}}async setAccount(e){if(this.account?.id)return;let t=e?.get("company")||{__type:"Pointer",className:"Company",objectId:this.getCompanyId()}||null,o=new Parse.Query("Account");o.equalTo("user",e.toPointer());let r=await o.first();return r?.id||(r=new Parse.Object("Account"),r.set({user:e.toPointer(),company:t}),r=await r.save()),this.account=r,r}login(e,t){return new Promise(((o,r)=>{Parse.User.logIn(e,t).then((async e=>{if(this.bindInvite(e),this.setCurrentUserLocalStorage(e),"modal"==this.guardType)return await this.refreshPage(),void o(!0);let t=new Parse.Query("Company");t.select("rootPage"),t.equalTo("objectId",e?.get("company")?.id);let r=await t.first(),i=r?.get("rootPage");this.redirectUrl=this.redirectUrl||i||"/project/dashboard";let a=this.redirectUrl;a=decodeURIComponent(a),this.router.navigate([a])})).catch((e=>{console.error(e),r({message:"无此用户信息,请先在小程序登录"})}))}))}refreshPage(){return new Promise((e=>{let t=this.router.url;Parse.User.current()?.id&&(this.isModalShow=!1),this.router.navigateByUrl("/",{skipLocationChange:!0}).then((()=>{this.router.navigateByUrl(t).then((()=>{e(!0)}))}))}))}setCurrentUserLocalStorage(e){e.get("company")?.id&&localStorage.setItem("company",e.get("company")?.id)}logout(e,t){let o=localStorage.getItem("company"),r=localStorage.getItem("WECHAT_APP_ID"),i=localStorage.getItem("LOGO_URL"),a=localStorage.getItem("NOVA_APIG_SERVER");localStorage.clear(),localStorage.setItem("company",o),localStorage.setItem("WECHAT_APP_ID",r),localStorage.setItem("LOGO_URL",i),localStorage.setItem("NOVA_APIG_SERVER",a),Parse.User.logOut().then((e=>{})),this.router.navigate([t||"/pcuser/login"])}async loginMobilePassword(e,t,o){let r=await this.getMobileUser(e);if(r)return new Promise(((e,i)=>{this.login(r,t).then((async t=>{this.isModalShow=!1,e(t)})).catch((e=>{console.log(e),o.create("error","错误的用户名或密码"),i(e)}))}));o.create("error","用户不存在,请尝试其他登录方式")}signMobilePassword(e,t){return new Promise((async(o,r)=>{o(await this.signUpAndUpdate(e,t))}))}async getMobileUser(e){let t=this.getCompanyId(),o=t+e;if(this.mobileUserMap[o])return this.mobileUserMap[o];let r=await this.novaCloud.api("/auth/getusername",{company:t,mobile:e});return r?.username&&(this.mobileUserMap[o]=r?.username),this.mobileUserMap[o]}signUpAndUpdate(e,t){return t=t||e+"pwd666",new Promise((o=>{Parse.User.signUp(this.getCompanyId()+"-"+e,t).then((async t=>{t.id&&(console.log(t),t.set("company",{__type:"Pointer",className:"Company",objectId:this.getCompanyId()}),t.set("mobile",e),t.set("type","user"),this.bindInvite(t),t=await t.save(),o(t))})).catch((e=>{o(void 0)}))}))}async getMobileCodeToken(e,t){return new Promise(((o,r)=>{let i=Parse.serverURL?.split("parse")?.[0]||"https://server.fmode.cn/";this.http.get(i+`api/auth/mobile?company=${this.company}&mobile=${e}&code=${t}`).toPromise().then((e=>{o(e)})).catch((e=>{r(e)}))}))}async loginCode(e,t,o,r){if(t)try{let o=await this.getMobileCodeToken(e,t);if(200==o?.code){console.log(200,o);let e=await Parse.User.become(o.data.token);if(console.log(e,e?.id),e?.id){console.log(e,e?.id);try{await this.bindInvite(e)}catch(e){console.error("bind err b",e)}return!0}}}catch(o){if(console.log("error1",o),!(o?.error?.mess?.indexOf("用户不存在")>-1))return void this.toast({message:o?.error?.mess});{let o=await this.signUpAndUpdate(e);if(o?.id)return await this.loginCode(e,t)}}else this.toast({color:"primary",message:"请填写有效验证码"})}saveParamsInvite(){let e=this.novaCloud.searchParse();console.log("saveParamsInvite",e);let t=e?.get("invite");console.log(t),t&&localStorage.setItem("invite",t)}async bindInvite(e){if(!(e=e||Parse.User.current()))return;if(e?.get("invite")?.id)return;let t,o=localStorage.getItem("invite");if(o&&e?.id!=o)try{t=await this.novaCloud.api("/auth/invite",{current:e?.id,invite:o,type:"code"}),console.log("bind",t)}catch(e){console.error("bind err",e)}}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:AuthService,deps:[{token:i1.Router},{token:i2.ToastController},{token:i3.NovaCloudService},{token:i4.HttpClient}],target:i0.ɵɵFactoryTarget.Injectable})}static{this.ɵprov=i0.ɵɵngDeclareInjectable({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:AuthService,providedIn:"root"})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:AuthService,decorators:[{type:Injectable,args:[{providedIn:"root"}]}],ctorParameters:()=>[{type:i1.Router},{type:i2.ToastController},{type:i3.NovaCloudService},{type:i4.HttpClient}]});
9
+ var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi91c2VyL2xvZ2luL2F1dGguc2VydmljZS5tanM=`
10
+