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.
- package/LICENSE.md +8 -0
- package/README.md +37 -37
- package/esm2022/fmode-ng.mjs +10 -5
- package/esm2022/lib/aigc/agent/fm-agent-task/fm-agent-task.component.mjs +8 -92
- package/esm2022/lib/aigc/agent/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
- package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -98
- package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -107
- package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -113
- package/esm2022/lib/aigc/avatar/index.mjs +10 -8
- package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -164
- package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -49
- package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -155
- package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
- package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -140
- package/esm2022/lib/aigc/chat/chat-message-card/duration-str.pipe.mjs +10 -29
- package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -3
- package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -3
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -193
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -331
- package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +8 -249
- package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -83
- package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/index.mjs +10 -8
- package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -367
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
- package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -115
- package/esm2022/lib/aigc/index.mjs +10 -14
- package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
- package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +10 -2
- package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -174
- package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
- package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-func.mjs +9 -162
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-work.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -313
- package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -4
- package/esm2022/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.mjs +10 -62
- package/esm2022/lib/aigc/story/fm-story-card/fm-story-card.component.mjs +10 -87
- package/esm2022/lib/aigc/story/fm-story-list/fm-story-list.component.mjs +10 -345
- package/esm2022/lib/aigc/story/fm-story-list/story-preview.mjs +10 -81
- package/esm2022/lib/aigc/story/fm-story-loader/fm-story-loader.component.mjs +10 -152
- package/esm2022/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.mjs +10 -42
- package/esm2022/lib/aigc/story/index.mjs +10 -6
- package/esm2022/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.mjs +10 -47
- package/esm2022/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.mjs +10 -95
- package/esm2022/lib/aigc/story/modal-chat-story/modal-chat-story.component.mjs +10 -253
- package/esm2022/lib/aigc/story/story.service.mjs +10 -35
- package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +10 -636
- package/esm2022/lib/aigc/voice/index.mjs +10 -7
- package/esm2022/lib/aigc/voice/lib/audio/audio.player.mjs +10 -55
- package/esm2022/lib/aigc/voice/lib/audio/audio.streamer.mjs +10 -2
- package/esm2022/lib/aigc/voice/lib/audio/streamer.microsoft.mjs +10 -96
- package/esm2022/lib/aigc/voice/lib/audio/streamer.pcm.mjs +8 -177
- package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
- package/esm2022/lib/aigc/voice/lib/recorder/extension-waveview.mjs +10 -215
- package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
- package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +10 -189
- package/esm2022/lib/aigc/voice/tts/index.mjs +10 -5
- package/esm2022/lib/aigc/voice/tts/int-tts-provider.mjs +10 -2
- package/esm2022/lib/aigc/voice/tts/provider-doubao.mjs +8 -346
- package/esm2022/lib/code/fm-codemirror/fm-codemirror.component.mjs +8 -342
- package/esm2022/lib/code/index.mjs +10 -2
- package/esm2022/lib/core/agent/chat/completion/fmode-completion.mjs +8 -430
- package/esm2022/lib/core/agent/chat/completion/index.mjs +10 -2
- package/esm2022/lib/core/agent/chat/completion/int-gpt-chat-options.mjs +10 -2
- package/esm2022/lib/core/agent/chat/fmode-chat.mjs +8 -617
- package/esm2022/lib/core/agent/chat/index.mjs +10 -4
- package/esm2022/lib/core/agent/chat/interface.mjs +10 -2
- package/esm2022/lib/core/agent/index.mjs +10 -6
- package/esm2022/lib/core/agent/prompt/agent.prompt.mjs +10 -133
- package/esm2022/lib/core/agent/prompt/index.mjs +10 -2
- package/esm2022/lib/core/agent/prompt/prompt-util.mjs +10 -16
- package/esm2022/lib/core/agent/story/agent.story.mjs +10 -64
- package/esm2022/lib/core/agent/story/index.mjs +10 -2
- package/esm2022/lib/core/agent/task/agent.task.mjs +10 -90
- package/esm2022/lib/core/agent/task/index.mjs +10 -2
- package/esm2022/lib/core/agent/waiting/index.mjs +10 -3
- package/esm2022/lib/core/agent/waiting/loading/loading.ctrl.mjs +10 -279
- package/esm2022/lib/core/agent/waiting/tips/tips.ctrl.mjs +8 -190
- package/esm2022/lib/core/index.mjs +10 -4
- package/esm2022/lib/core/parse/datatype/acl.mjs +10 -57
- package/esm2022/lib/core/parse/datatype/file.mjs +10 -69
- package/esm2022/lib/core/parse/datatype/geopoint.mjs +10 -57
- package/esm2022/lib/core/parse/datatype/relation.mjs +10 -56
- package/esm2022/lib/core/parse/fmode.cloud.mjs +10 -0
- package/esm2022/lib/core/parse/fmode.object.mjs +10 -232
- package/esm2022/lib/core/parse/fmode.parse.mjs +10 -84
- package/esm2022/lib/core/parse/fmode.query.mjs +8 -500
- package/esm2022/lib/core/parse/fmode.user.mjs +10 -275
- package/esm2022/lib/core/parse/index.mjs +10 -5
- package/esm2022/lib/core/parse/types.mjs +10 -2
- package/esm2022/lib/core/voice/index.mjs +10 -3
- package/esm2022/lib/core/voice/tts/index.mjs +10 -2
- package/esm2022/lib/icon/filetype/audio.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/avatar.svg.mjs +10 -14
- package/esm2022/lib/icon/filetype/chat.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/docx.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/file.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/filetype.pipe.mjs +10 -57
- package/esm2022/lib/icon/filetype/index.mjs +10 -12
- package/esm2022/lib/icon/filetype/md.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/pdf.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/pptx.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/svgtoblob.mjs +10 -8
- package/esm2022/lib/icon/filetype/video.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/xlsx.svg.mjs +10 -3
- package/esm2022/lib/icon/index.mjs +10 -2
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -209
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
- package/esm2022/lib/map/index.mjs +10 -4
- package/esm2022/lib/map/map.module.mjs +10 -61
- package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -132
- package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -115
- package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -118
- package/esm2022/lib/nova-cloud/index.mjs +10 -3
- package/esm2022/lib/nova-cloud/ncloud-api-func.mjs +10 -91
- package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -53
- package/esm2022/lib/payment/index.mjs +10 -2
- package/esm2022/lib/payment/payment/payment.component.mjs +10 -543
- package/esm2022/lib/payment/payment.service.mjs +10 -202
- package/esm2022/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.mjs +10 -48
- package/esm2022/lib/person/comp-person-item/comp-person-item.component.mjs +10 -29
- package/esm2022/lib/person/comp-person-story/comp-person-story.component.mjs +10 -211
- package/esm2022/lib/person/edit-upload/edit-upload.component.mjs +8 -412
- package/esm2022/lib/person/edit-upload/edit-upload.module.mjs +10 -50
- package/esm2022/lib/person/index.mjs +10 -5
- package/esm2022/lib/person/modal-person-select/modal-person-select.component.mjs +10 -144
- package/esm2022/lib/person/modal-user-verify/secret-text.pipe.mjs +10 -41
- package/esm2022/lib/person/modal-user-verify/user-verify.component.mjs +10 -595
- package/esm2022/lib/person/person-detail/person-detail.component.mjs +10 -172
- package/esm2022/lib/person/person.service.mjs +8 -193
- package/esm2022/lib/platform/cross.service.mjs +10 -62
- package/esm2022/lib/platform/index.mjs +10 -2
- package/esm2022/lib/social/index.mjs +10 -2
- package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -230
- package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
- package/esm2022/lib/storage/index.mjs +10 -5
- package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -131
- package/esm2022/lib/storage/service-hwobs/index.mjs +10 -3
- package/esm2022/lib/storage/service-hwobs/typings/esdk-obs-browser.mjs +1 -1
- package/esm2022/lib/storage/service-upload/index.mjs +10 -2
- package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -513
- package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
- package/esm2022/lib/storage/service-upload/util-file-metadata.mjs +10 -93
- package/esm2022/lib/storage/storage.module.mjs +10 -42
- package/esm2022/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.mjs +10 -72
- package/esm2022/lib/text/fm-article-editor/article.service.mjs +10 -237
- package/esm2022/lib/text/fm-article-editor/comp-upload-book-banners/comp-upload-book-banners.component.mjs +8 -72
- package/esm2022/lib/text/fm-article-editor/draft.service.mjs +10 -207
- package/esm2022/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.mjs +8 -227
- package/esm2022/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.mjs +10 -303
- package/esm2022/lib/text/fm-article-editor/fm-article-editor.component.mjs +8 -371
- package/esm2022/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.mjs +10 -94
- package/esm2022/lib/text/fm-article-editor/fm-article-outline-leftitem/fm-article-outline-leftitem.component.mjs +10 -36
- package/esm2022/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.mjs +10 -281
- package/esm2022/lib/text/fm-article-editor/fm-article-write-options/fm-article-write-options.component.mjs +10 -72
- package/esm2022/lib/text/fm-article-editor/outline-count.pipe.mjs +10 -22
- package/esm2022/lib/text/fm-article-editor/prompt/prompt-insertion-article.mjs +10 -169
- package/esm2022/lib/text/fm-article-editor/task-article-generation.mjs +10 -69
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-draft-create.mjs +10 -65
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline-edit.mjs +10 -55
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline.mjs +10 -142
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-preview.mjs +10 -35
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-writing-options.mjs +10 -81
- package/esm2022/lib/text/fm-article-editor/tasks/task-document-select.mjs +10 -50
- package/esm2022/lib/text/fm-text-quill/fm-text-quill.component.mjs +10 -145
- package/esm2022/lib/text/index.mjs +10 -4
- package/esm2022/lib/user/account/account.service.mjs +10 -222
- package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
- package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -66
- package/esm2022/lib/user/index.mjs +10 -17
- package/esm2022/lib/user/login/auth.guard.mjs +10 -28
- package/esm2022/lib/user/login/auth.service.mjs +8 -433
- package/esm2022/lib/user/login/login.component.mjs +10 -916
- package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -311
- package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
- package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
- package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -164
- package/esm2022/lib/user/profile/profile-bind/profile-confirm-modal.component.mjs +10 -79
- package/esm2022/lib/user/profile/profile.module.mjs +10 -54
- package/esm2022/lib/user/staff/index.mjs +10 -4
- package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
- package/esm2022/lib/user/staff/staff.module.mjs +10 -18
- package/esm2022/lib/user/staff/staff.service.mjs +10 -85
- package/esm2022/lib/user/user-name.pipe.mjs +10 -29
- package/esm2022/lib/user/user.module.mjs +10 -102
- package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
- package/esm2022/lib/video/index.mjs +10 -2
- package/esm2022/public-api.mjs +10 -21
- package/fesm2022/fmode-ng.mjs +7 -19788
- package/fesm2022/fmode-ng.mjs.map +1 -1
- package/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.d.ts +2 -2
- package/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.d.ts +2 -2
- package/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.d.ts +2 -2
- package/lib/aigc/chat/chat-list/chat-list.component.d.ts +3 -2
- package/lib/aigc/chat/chat-message-card/comp-message-card.component.d.ts +3 -3
- package/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.d.ts +2 -2
- package/lib/aigc/chat/chat-modal-input/modal-input.component.d.ts +3 -3
- package/lib/aigc/service-fmai/service-imagine/imagine-func.d.ts +3 -3
- package/lib/aigc/service-fmai/service-imagine/imagine-work.d.ts +4 -4
- package/lib/aigc/service-fmai/service-imagine/imagine.service.d.ts +6 -6
- package/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.d.ts +2 -2
- package/lib/aigc/story/fm-story-card/fm-story-card.component.d.ts +2 -1
- package/lib/aigc/story/fm-story-list/fm-story-list.component.d.ts +6 -6
- package/lib/aigc/story/fm-story-list/story-preview.d.ts +4 -4
- package/lib/aigc/story/fm-story-loader/fm-story-loader.component.d.ts +3 -3
- package/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.d.ts +2 -2
- package/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.d.ts +3 -2
- package/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.d.ts +3 -2
- package/lib/aigc/story/modal-chat-story/modal-chat-story.component.d.ts +6 -6
- package/lib/aigc/story/story.service.d.ts +3 -2
- package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
- package/lib/core/agent/chat/fmode-chat.d.ts +11 -11
- package/lib/core/agent/story/agent.story.d.ts +8 -8
- package/lib/core/parse/datatype/geopoint.d.ts +5 -1
- package/lib/core/parse/fmode.cloud.d.ts +32 -0
- package/lib/core/parse/fmode.object.d.ts +2 -2
- package/lib/core/parse/fmode.parse.d.ts +15 -9
- package/lib/core/parse/fmode.query.d.ts +41 -2
- package/lib/core/parse/fmode.user.d.ts +1 -0
- package/lib/core/parse/index.d.ts +1 -0
- package/lib/core/parse/types.d.ts +2 -0
- package/lib/map/comp-poi-picker/comp-poi-picker.component.d.ts +5 -5
- package/lib/payment/payment/payment.component.d.ts +3 -3
- package/lib/payment/payment.service.d.ts +4 -4
- package/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.d.ts +2 -1
- package/lib/person/comp-person-item/comp-person-item.component.d.ts +2 -1
- package/lib/person/comp-person-story/comp-person-story.component.d.ts +13 -13
- package/lib/person/edit-upload/edit-upload.component.d.ts +1 -1
- package/lib/person/modal-person-select/modal-person-select.component.d.ts +5 -5
- package/lib/person/modal-user-verify/user-verify.component.d.ts +5 -5
- package/lib/person/person-detail/person-detail.component.d.ts +4 -4
- package/lib/person/person.service.d.ts +7 -7
- package/lib/storage/service-hwobs/hwobs.service.d.ts +4 -5
- package/lib/storage/service-upload/nova-upload.service.d.ts +5 -5
- package/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.d.ts +2 -1
- package/lib/text/fm-article-editor/article.service.d.ts +12 -12
- package/lib/text/fm-article-editor/draft.service.d.ts +5 -5
- package/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.d.ts +3 -2
- package/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.d.ts +16 -17
- package/lib/text/fm-article-editor/fm-article-editor.component.d.ts +3 -3
- package/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.d.ts +11 -10
- package/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.d.ts +2 -2
- package/lib/text/fm-article-editor/prompt/prompt-insertion-article.d.ts +3 -3
- package/lib/text/fm-article-editor/task-article-generation.d.ts +5 -4
- package/lib/text/fm-article-editor/tasks/task-article-draft-create.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-outline-edit.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-outline.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-preview.d.ts +2 -1
- package/lib/text/fm-article-editor/tasks/task-article-writing-options.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-document-select.d.ts +3 -3
- package/lib/user/account/account.service.d.ts +2 -2
- package/lib/user/comp-user-avatar/comp-user-avatar.component.d.ts +2 -2
- package/lib/user/login/auth.service.d.ts +5 -5
- package/lib/user/login/login.component.d.ts +3 -3
- package/lib/user/profile/auth-profile.service.d.ts +8 -8
- package/lib/user/profile/profile-bind/profile-bind.component.d.ts +7 -7
- package/lib/user/profile/profile-bind/profile-confirm-modal.component.d.ts +2 -2
- package/lib/user/staff/staff.service.d.ts +3 -3
- package/lib/user/user-name.pipe.d.ts +2 -2
- package/package.json +12 -18
|
@@ -1,435 +1,10 @@
|
|
|
1
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
285
|
-
|
|
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
|
+
|