@sunbird-cb/toc 0.0.7 → 0.0.9
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/esm2022/lib/_collection/_common/attendance-card/attendance-card.component.mjs +55 -55
- package/esm2022/lib/_collection/_common/attendance-card/attendance-card.module.mjs +126 -126
- package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.component.mjs +32 -32
- package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.module.mjs +85 -85
- package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.component.mjs +100 -100
- package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.module.mjs +48 -48
- package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +120 -120
- package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +92 -92
- package/esm2022/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.mjs +48 -48
- package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.component.mjs +25 -25
- package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.module.mjs +41 -41
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover-card.component.mjs +89 -89
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.module.mjs +42 -42
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.servive.mjs +41 -41
- package/esm2022/lib/_collection/_common/connection-name/connection-name.component.mjs +78 -78
- package/esm2022/lib/_collection/_common/connection-name/connection-name.module.mjs +45 -45
- package/esm2022/lib/_collection/_common/connection-name/profile-v2.model.mjs +2 -2
- package/esm2022/lib/_collection/_common/content-progress/content-progress.component.mjs +70 -70
- package/esm2022/lib/_collection/_common/content-progress/content-progress.module.mjs +28 -28
- package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.mjs +187 -187
- package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.mjs +86 -86
- package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +31 -31
- package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +941 -941
- package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.mjs +183 -183
- package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.mjs +327 -327
- package/esm2022/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.mjs +297 -297
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +248 -225
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +1148 -1030
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.mjs +16 -16
- package/esm2022/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.mjs +43 -43
- package/esm2022/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.mjs +133 -133
- package/esm2022/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.mjs +66 -66
- package/esm2022/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.mjs +278 -278
- package/esm2022/lib/_collection/_common/content-toc/content-services/handle-claim.service.mjs +21 -21
- package/esm2022/lib/_collection/_common/content-toc/content-services/review-component-data.service.mjs +21 -21
- package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +847 -847
- package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +219 -219
- package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +209 -209
- package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.module.mjs +26 -26
- package/esm2022/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.mjs +19 -19
- package/esm2022/lib/_collection/_common/content-toc/pipes/truncate.pipe.mjs +23 -23
- package/esm2022/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.mjs +113 -113
- package/esm2022/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.mjs +110 -110
- package/esm2022/lib/_collection/_common/display-content-type/display-content-type.component.mjs +26 -26
- package/esm2022/lib/_collection/_common/display-content-type/display-content-type.module.mjs +19 -19
- package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.mjs +67 -67
- package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.mjs +28 -28
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.component.mjs +77 -77
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.model.mjs +2 -2
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.module.mjs +61 -61
- package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.module.mjs +20 -20
- package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +67 -67
- package/esm2022/lib/_collection/_common/player-brief/player-brief.component.mjs +139 -139
- package/esm2022/lib/_collection/_common/player-brief/player-brief.module.mjs +71 -71
- package/esm2022/lib/_collection/_common/rating-summary/rating-summary.component.mjs +34 -34
- package/esm2022/lib/_collection/_common/rating-summary/rating-summary.module.mjs +56 -56
- package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.component.mjs +25 -25
- package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.module.mjs +37 -37
- package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.mjs +32 -32
- package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner.module.mjs +30 -30
- package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +38 -38
- package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.mjs +51 -51
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.component.mjs +115 -115
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.model.mjs +12 -12
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.module.mjs +51 -51
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.service.mjs +61 -61
- package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.component.mjs +87 -87
- package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.module.mjs +36 -36
- package/esm2022/lib/_collection/_common/user-image/user-image.component.mjs +62 -62
- package/esm2022/lib/_collection/_common/user-image/user-image.module.mjs +24 -24
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.component.mjs +192 -192
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.module.mjs +44 -44
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.service.mjs +99 -99
- package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.component.mjs +58 -58
- package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.module.mjs +67 -67
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +112 -112
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.model.mjs +2 -2
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.module.mjs +69 -69
- package/esm2022/lib/_collection-api.mjs +57 -57
- package/esm2022/lib/_constants/widget-content.constants.mjs +19 -19
- package/esm2022/lib/_directives/tooltip.directive.mjs +68 -68
- package/esm2022/lib/_models/common.model.mjs +2 -2
- package/esm2022/lib/_models/error.model.mjs +2 -2
- package/esm2022/lib/_pipes/highlight.pipe.mjs +24 -24
- package/esm2022/lib/_services/rating.service.mjs +89 -89
- package/esm2022/lib/_services/samuhik-charcha.service.mjs +29 -29
- package/esm2022/lib/_services/viewer-route-util.mjs +103 -103
- package/esm2022/lib/_services/widget-content.model.mjs +247 -247
- package/esm2022/lib/_services/widget-content.service.mjs +594 -594
- package/esm2022/lib/_shared/translate-loader.factory.mjs +9 -9
- package/esm2022/lib/app-toc-lib.module.mjs +499 -499
- package/esm2022/lib/collection.config.mjs +161 -161
- package/esm2022/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.mjs +37 -37
- package/esm2022/lib/components/app-toc-banner/app-toc-banner.component.mjs +1436 -1436
- package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +475 -475
- package/esm2022/lib/components/app-toc-cios-home/consent-dialog.component.mjs +119 -119
- package/esm2022/lib/components/app-toc-cohorts/app-toc-cohorts.component.mjs +80 -80
- package/esm2022/lib/components/app-toc-content-card/app-toc-content-card.component.mjs +249 -249
- package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +39 -39
- package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +58 -58
- package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +2229 -2229
- package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +2907 -2905
- package/esm2022/lib/components/app-toc-overview/app-toc-overview.component.mjs +157 -157
- package/esm2022/lib/components/app-toc-session-card/app-toc-session-card.component.mjs +48 -48
- package/esm2022/lib/components/app-toc-sessions/app-toc-sessions.component.mjs +47 -47
- package/esm2022/lib/components/app-toc-single-page/app-toc-single-page.component.mjs +766 -766
- package/esm2022/lib/components/completion-survey-form/completion-survey-form.component.mjs +243 -243
- package/esm2022/lib/components/create-batch-dialog/create-batch-dialog.component.mjs +116 -116
- package/esm2022/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.mjs +44 -44
- package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +1838 -1838
- package/esm2022/lib/components/enroll-questionnaire/enroll-questionnaire.component.mjs +236 -236
- package/esm2022/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.mjs +213 -213
- package/esm2022/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.mjs +36 -36
- package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +256 -256
- package/esm2022/lib/components/survey-form-question/survey-form-question.component.mjs +133 -133
- package/esm2022/lib/components/survey-form-section/survey-form-section.component.mjs +36 -36
- package/esm2022/lib/models/app-toc-analytics.model.mjs +2 -2
- package/esm2022/lib/models/app-toc.model.mjs +38 -38
- package/esm2022/lib/models/auto-complete.model.mjs +2 -2
- package/esm2022/lib/models/card-content.model.mjs +13 -13
- package/esm2022/lib/models/content-strip-with-tabs.model.mjs +2 -2
- package/esm2022/lib/models/discussion-forum.model.mjs +14 -14
- package/esm2022/lib/models/goal.model.mjs +2 -2
- package/esm2022/lib/models/meta-tag.model.mjs +8 -8
- package/esm2022/lib/models/playlist.model.mjs +2 -2
- package/esm2022/lib/models/profile-revamp.model.mjs +2 -2
- package/esm2022/lib/models/rating.model.mjs +2 -2
- package/esm2022/lib/models/user-profile.model.mjs +21 -21
- package/esm2022/lib/resolvers/app-toc-cios-resolver.service.mjs +24 -24
- package/esm2022/lib/resolvers/app-toc-cios-user-enroll-resolver.service.mjs +24 -24
- package/esm2022/lib/resolvers/app-toc-content-read-resolver.service.mjs +60 -60
- package/esm2022/lib/resolvers/app-toc-ext-public-resolver.service.mjs +25 -25
- package/esm2022/lib/resolvers/app-toc-resolver.service.mjs +106 -106
- package/esm2022/lib/resolvers/config-resolver.service.mjs +25 -25
- package/esm2022/lib/resolvers/profile-resolver.service.mjs +25 -25
- package/esm2022/lib/resolvers/restricted-features-resolver.service.mjs +25 -25
- package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +51 -51
- package/esm2022/lib/routes/app-toc-home/app-toc-home.directive.mjs +16 -16
- package/esm2022/lib/routes/app-toc-home/app-toc-home.service.mjs +18 -18
- package/esm2022/lib/services/access-control.service.mjs +56 -56
- package/esm2022/lib/services/action.service.mjs +23 -23
- package/esm2022/lib/services/app-toc-v2.service.mjs +313 -243
- package/esm2022/lib/services/app-toc.service.mjs +1613 -1387
- package/esm2022/lib/services/certificate.service.mjs +69 -69
- package/esm2022/lib/services/discuss-utils.service.mjs +58 -58
- package/esm2022/lib/services/editor.service.mjs +34 -34
- package/esm2022/lib/services/load-check.service.mjs +21 -21
- package/esm2022/lib/services/loader.service.mjs +33 -33
- package/esm2022/lib/services/mobile-apps.service.mjs +67 -67
- package/esm2022/lib/services/netcore.service.mjs +56 -56
- package/esm2022/lib/services/nps-grid.service.mjs +31 -31
- package/esm2022/lib/services/otp.service.mjs +43 -43
- package/esm2022/lib/services/profile-v2.service.mjs +43 -43
- package/esm2022/lib/services/reset-ratings.service.mjs +19 -19
- package/esm2022/lib/services/resource-download-helper.service.mjs +64 -64
- package/esm2022/lib/services/timer.service.mjs +23 -23
- package/esm2022/lib/services/title-tag.service.mjs +71 -71
- package/esm2022/lib/services/user-profile.service.mjs +55 -55
- package/esm2022/lib/services/viewer-data.service.mjs +64 -64
- package/esm2022/lib/services/viewer-util.service.mjs +590 -500
- package/esm2022/lib/share-toc/share-toc/share-toc.component.mjs +291 -291
- package/esm2022/lib/share-toc/share-toc.module.mjs +119 -119
- package/esm2022/public-api.mjs +71 -70
- package/esm2022/sunbird-cb-toc.mjs +4 -4
- package/fesm2022/sunbird-cb-toc.mjs +24777 -24250
- package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +16 -16
- package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +31 -31
- package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +15 -15
- package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +20 -20
- package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +22 -22
- package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +15 -15
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +22 -22
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +22 -22
- package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +9 -9
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +11 -11
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +12 -12
- package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +18 -18
- package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +14 -14
- package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +11 -11
- package/lib/_collection/_common/connection-name/connection-name.component.d.ts +17 -17
- package/lib/_collection/_common/connection-name/connection-name.module.d.ts +14 -14
- package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +199 -199
- package/lib/_collection/_common/content-progress/content-progress.component.d.ts +16 -16
- package/lib/_collection/_common/content-progress/content-progress.module.d.ts +10 -10
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +38 -38
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +19 -19
- package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +11 -11
- package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +183 -183
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +41 -41
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +54 -54
- package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +47 -47
- package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +49 -48
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +171 -154
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +8 -8
- package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +16 -16
- package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +40 -40
- package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +21 -21
- package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +45 -45
- package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +10 -10
- package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +10 -10
- package/lib/_collection/_common/content-toc/content-toc.component.d.ts +128 -128
- package/lib/_collection/_common/content-toc/content-toc.module.d.ts +51 -51
- package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +29 -29
- package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +9 -9
- package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +7 -7
- package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +7 -7
- package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +28 -28
- package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +24 -24
- package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +14 -14
- package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +9 -9
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +12 -12
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +10 -10
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +22 -22
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +8 -8
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +18 -18
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +8 -8
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +15 -15
- package/lib/_collection/_common/player-brief/player-brief.component.d.ts +35 -35
- package/lib/_collection/_common/player-brief/player-brief.module.d.ts +19 -19
- package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +14 -14
- package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +13 -13
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +11 -11
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +11 -11
- package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +15 -15
- package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +10 -10
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +16 -16
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +11 -11
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +34 -34
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +17 -17
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +15 -15
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +15 -15
- package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +21 -21
- package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +12 -12
- package/lib/_collection/_common/user-image/user-image.component.d.ts +21 -21
- package/lib/_collection/_common/user-image/user-image.module.d.ts +9 -9
- package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +47 -47
- package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +14 -14
- package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +22 -22
- package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +19 -19
- package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +15 -15
- package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +25 -25
- package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +21 -21
- package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +18 -18
- package/lib/_collection-api.d.ts +34 -34
- package/lib/_constants/widget-content.constants.d.ts +7 -7
- package/lib/_directives/tooltip.directive.d.ts +17 -17
- package/lib/_models/common.model.d.ts +3 -3
- package/lib/_models/error.model.d.ts +5 -5
- package/lib/_pipes/highlight.pipe.d.ts +10 -10
- package/lib/_services/rating.service.d.ts +18 -18
- package/lib/_services/samuhik-charcha.service.d.ts +13 -13
- package/lib/_services/viewer-route-util.d.ts +8 -8
- package/lib/_services/widget-content.model.d.ts +515 -515
- package/lib/_services/widget-content.service.d.ts +101 -101
- package/lib/_shared/translate-loader.factory.d.ts +7 -7
- package/lib/app-toc-lib.module.d.ts +88 -88
- package/lib/collection.config.d.ts +159 -159
- package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +17 -17
- package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +225 -225
- package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +78 -78
- package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +22 -22
- package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +31 -31
- package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +47 -47
- package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +14 -14
- package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +21 -21
- package/lib/components/app-toc-home/app-toc-home.component.d.ts +314 -314
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +408 -408
- package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +47 -47
- package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +22 -22
- package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +14 -14
- package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +149 -149
- package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +42 -42
- package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +27 -27
- package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +15 -15
- package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +195 -195
- package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +44 -44
- package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +54 -54
- package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +18 -18
- package/lib/components/public-survey-form/public-survey-form.component.d.ts +43 -43
- package/lib/components/survey-form-question/survey-form-question.component.d.ts +20 -20
- package/lib/components/survey-form-section/survey-form-section.component.d.ts +13 -13
- package/lib/models/app-toc-analytics.model.d.ts +152 -152
- package/lib/models/app-toc.model.d.ts +84 -84
- package/lib/models/auto-complete.model.d.ts +27 -27
- package/lib/models/card-content.model.d.ts +19 -19
- package/lib/models/content-strip-with-tabs.model.d.ts +44 -44
- package/lib/models/discussion-forum.model.d.ts +40 -40
- package/lib/models/goal.model.d.ts +22 -22
- package/lib/models/meta-tag.model.d.ts +6 -6
- package/lib/models/playlist.model.d.ts +23 -23
- package/lib/models/profile-revamp.model.d.ts +14 -14
- package/lib/models/rating.model.d.ts +17 -17
- package/lib/models/user-profile.model.d.ts +37 -37
- package/lib/resolvers/app-toc-cios-resolver.service.d.ts +12 -12
- package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +12 -12
- package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +16 -16
- package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +12 -12
- package/lib/resolvers/app-toc-resolver.service.d.ts +16 -16
- package/lib/resolvers/config-resolver.service.d.ts +11 -11
- package/lib/resolvers/profile-resolver.service.d.ts +11 -11
- package/lib/resolvers/restricted-features-resolver.service.d.ts +11 -11
- package/lib/routes/app-toc-home/app-toc-home.component.d.ts +19 -19
- package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +8 -8
- package/lib/routes/app-toc-home/app-toc-home.service.d.ts +8 -8
- package/lib/services/access-control.service.d.ts +29 -29
- package/lib/services/action.service.d.ts +9 -9
- package/lib/services/app-toc-v2.service.d.ts +16 -14
- package/lib/services/app-toc.service.d.ts +235 -177
- package/lib/services/certificate.service.d.ts +42 -42
- package/lib/services/discuss-utils.service.d.ts +33 -33
- package/lib/services/editor.service.d.ts +17 -17
- package/lib/services/load-check.service.d.ts +8 -8
- package/lib/services/loader.service.d.ts +16 -16
- package/lib/services/mobile-apps.service.d.ts +38 -38
- package/lib/services/netcore.service.d.ts +33 -33
- package/lib/services/nps-grid.service.d.ts +15 -15
- package/lib/services/otp.service.d.ts +20 -20
- package/lib/services/profile-v2.service.d.ts +20 -20
- package/lib/services/reset-ratings.service.d.ts +8 -8
- package/lib/services/resource-download-helper.service.d.ts +29 -29
- package/lib/services/timer.service.d.ts +9 -9
- package/lib/services/title-tag.service.d.ts +21 -21
- package/lib/services/user-profile.service.d.ts +24 -24
- package/lib/services/viewer-data.service.d.ts +58 -58
- package/lib/services/viewer-util.service.d.ts +76 -62
- package/lib/share-toc/share-toc/share-toc.component.d.ts +56 -56
- package/lib/share-toc/share-toc.module.d.ts +32 -32
- package/package.json +1 -1
- package/public-api.d.ts +56 -55
|
@@ -1,500 +1,590 @@
|
|
|
1
|
-
import { NsContent } from '../_services/widget-content.model';
|
|
2
|
-
import { Inject, Injectable } from '@angular/core';
|
|
3
|
-
import { noop, Subject } from 'rxjs';
|
|
4
|
-
import dayjs from 'dayjs';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "@angular/common/http";
|
|
7
|
-
import * as i2 from "@sunbird-cb/utils-v2";
|
|
8
|
-
import * as i3 from "../_collection-api";
|
|
9
|
-
import * as i4 from "./app-toc.service";
|
|
10
|
-
import * as i5 from "@sunbird-cb/consumption";
|
|
11
|
-
export class ViewerUtilService {
|
|
12
|
-
constructor(http, configservice, contentSvc, tocSvc, userSvc, contentLangSvc, domainConfSvc, environment) {
|
|
13
|
-
this.http = http;
|
|
14
|
-
this.configservice = configservice;
|
|
15
|
-
this.contentSvc = contentSvc;
|
|
16
|
-
this.tocSvc = tocSvc;
|
|
17
|
-
this.userSvc = userSvc;
|
|
18
|
-
this.contentLangSvc = contentLangSvc;
|
|
19
|
-
this.domainConfSvc = domainConfSvc;
|
|
20
|
-
this.environment = environment;
|
|
21
|
-
this.API_ENDPOINTS = {
|
|
22
|
-
setS3Cookie: `/apis/v8/protected/content/setCookie`,
|
|
23
|
-
// PROGRESS_UPDATE: `/apis/protected/v8/user/realTimeProgress/update`,
|
|
24
|
-
PROGRESS_UPDATE: `/apis/proxies/v8/content-progres`,
|
|
25
|
-
ASSESSMENT_SECTION: `/apis/proxies/v8/assessment/v5/read`,
|
|
26
|
-
GET_FORM_BYID: (formId) => `apis/proxies/v8/forms/v2/getFormById?formId=${formId}`,
|
|
27
|
-
SUBMIT_FORM: `/apis/proxies/v8/forms/v2/saveFormSubmit`,
|
|
28
|
-
// GET_FORM_BYID: (formId: string) => `apis/proxies/v8/forms/getFormById?id=${formId}`,
|
|
29
|
-
// SUBMIT_FORM: `/apis/proxies/v8/forms/v1/saveFormSubmit`,
|
|
30
|
-
PRE_ASSESSMENT_STATE_UPDATE: `/apis/proxies/v8/content/v2/state/update`
|
|
31
|
-
};
|
|
32
|
-
this.downloadRegex = new RegExp(`(/content-store/.*?)(\\\)?\\\\?['"])`, 'gm');
|
|
33
|
-
this.authoringBase = '/apis/authContent/';
|
|
34
|
-
this.markAsCompleteSubject = new Subject();
|
|
35
|
-
this.autoPlayNextVideo = new Subject();
|
|
36
|
-
this.autoPlayNextAudio = new Subject();
|
|
37
|
-
this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
|
|
38
|
-
this.publicUserDetails = {};
|
|
39
|
-
this.regexDownloadReplace = (_str = '', group1, group2) => {
|
|
40
|
-
return `${this.authoringBase}${encodeURIComponent(group1)}${group2}`;
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
async fetchManifestFile(url) {
|
|
44
|
-
this.setS3Cookie(url);
|
|
45
|
-
const manifestFile = await this.http
|
|
46
|
-
.get(url)
|
|
47
|
-
.toPromise()
|
|
48
|
-
.catch((_err) => { });
|
|
49
|
-
return manifestFile;
|
|
50
|
-
}
|
|
51
|
-
async setS3Cookie(_contentId) {
|
|
52
|
-
// await this.http
|
|
53
|
-
// .post(this.API_ENDPOINTS.setS3Cookie, { contentId })
|
|
54
|
-
// .toPromise()
|
|
55
|
-
// .catch((_err: any) => { })
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
calculatePercent(current, max, mimeType) {
|
|
59
|
-
try {
|
|
60
|
-
const temp = [...current];
|
|
61
|
-
if (temp && temp.length && max) {
|
|
62
|
-
const latest = parseFloat(temp.pop() || '0');
|
|
63
|
-
const percentMilis = (latest / max) * 100;
|
|
64
|
-
let percent = parseFloat(percentMilis.toFixed(2));
|
|
65
|
-
if (mimeType === NsContent.EMimeTypes.MP4 ||
|
|
66
|
-
mimeType === NsContent.EMimeTypes.M3U8 ||
|
|
67
|
-
mimeType === NsContent.EMimeTypes.MP3 ||
|
|
68
|
-
mimeType === NsContent.EMimeTypes.M4A ||
|
|
69
|
-
mimeType === NsContent.EMimeTypes.YOUTUBE ||
|
|
70
|
-
mimeType === NsContent.EMimeTypes.SURVEY) {
|
|
71
|
-
if (percent <= 5) {
|
|
72
|
-
// if percentage is less than 5% make it 0
|
|
73
|
-
percent = 0;
|
|
74
|
-
}
|
|
75
|
-
else if (percent >= 95) {
|
|
76
|
-
// if percentage is greater than 95% make it 100
|
|
77
|
-
percent = 100;
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
return percent;
|
|
81
|
-
}
|
|
82
|
-
return 0;
|
|
83
|
-
}
|
|
84
|
-
catch (e) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
mimeType === NsContent.EMimeTypes.
|
|
96
|
-
mimeType === NsContent.EMimeTypes.
|
|
97
|
-
mimeType === NsContent.EMimeTypes.
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
//
|
|
150
|
-
// this.http
|
|
151
|
-
// .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
|
|
152
|
-
// .subscribe(noop, noop)
|
|
153
|
-
// }
|
|
154
|
-
this.http
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
this.
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
this.tocSvc.
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
const
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
// tslint:disable-next-line:max-line-length
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
return
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
this.tocSvc.hashmap[contentId][
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
//
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
}
|
|
468
|
-
if (this.
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
//
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLXV0aWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9zZXJ2aWNlcy92aWV3ZXItdXRpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVsRCxPQUFPLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNoRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7Ozs7Ozs7QUFRekIsTUFBTSxPQUFPLGlCQUFpQjtJQW9CNUIsWUFDVSxJQUFnQixFQUNoQixhQUFvQyxFQUNwQyxVQUFnQyxFQUNoQyxNQUFxQixFQUNyQixPQUE2QixFQUM3QixjQUFzQyxFQUN0QyxhQUFnQyxFQUNULFdBQWdCO1FBUHZDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsa0JBQWEsR0FBYixhQUFhLENBQXVCO1FBQ3BDLGVBQVUsR0FBVixVQUFVLENBQXNCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFDN0IsbUJBQWMsR0FBZCxjQUFjLENBQXdCO1FBQ3RDLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUNULGdCQUFXLEdBQVgsV0FBVyxDQUFLO1FBM0JqRCxrQkFBYSxHQUFHO1lBQ2QsV0FBVyxFQUFFLHNDQUFzQztZQUNuRCxzRUFBc0U7WUFDdEUsZUFBZSxFQUFFLGtDQUFrQztZQUNuRCxrQkFBa0IsRUFBRSxxQ0FBcUM7WUFDekQsYUFBYSxFQUFFLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQywrQ0FBK0MsTUFBTSxFQUFFO1lBQzFGLFdBQVcsRUFBRSwwQ0FBMEM7WUFDdkQsdUZBQXVGO1lBQ3ZG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QUFzQixDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUE7b0JBQ3JHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFBO29CQUNuRixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQTtpQkFDakQ7YUFDRjtTQUNGO2FBQU07WUFDTCxHQUFHLEdBQUcsRUFBRSxDQUFBO1lBQ1IsYUFBYTtTQUNkO0lBQ0gsQ0FBQztJQUVELDhCQUE4QixDQUFDLFVBQWtCO1FBQy9DLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN6RSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ2hFO1FBQ0QsT0FBTyxDQUFDLENBQUE7SUFDVixDQUFDOytHQWpnQlUsaUJBQWlCLDZQQTRCbEIsYUFBYTttSEE1QlosaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQTZCSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25maWd1cmF0aW9uc1NlcnZpY2UsIERvbWFpbkNvbmZTZXJ2aWNlIH0gZnJvbSAnQHN1bmJpcmQtY2IvdXRpbHMtdjInXG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICcuLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQubW9kZWwnXG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xuaW1wb3J0IHsgbm9vcCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXG5pbXBvcnQgeyBBcHBUb2NTZXJ2aWNlIH0gZnJvbSAnLi9hcHAtdG9jLnNlcnZpY2UnXG5pbXBvcnQgeyBDb250ZW50TGFuZ3VhZ2VTZXJ2aWNlLCBXaWRnZXRVc2VyU2VydmljZUxpYiB9IGZyb20gJ0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uJ1xuaW1wb3J0IHsgV2lkZ2V0Q29udGVudFNlcnZpY2UgfSBmcm9tICcuLi9fY29sbGVjdGlvbi1hcGknXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBWaWV3ZXJVdGlsU2VydmljZSB7XG4gIEFQSV9FTkRQT0lOVFMgPSB7XG4gICAgc2V0UzNDb29raWU6IGAvYXBpcy92OC9wcm90ZWN0ZWQvY29udGVudC9zZXRDb29raWVgLFxuICAgIC8vIFBST0dSRVNTX1VQREFURTogYC9hcGlzL3Byb3RlY3RlZC92OC91c2VyL3JlYWxUaW1lUHJvZ3Jlc3MvdXBkYXRlYCxcbiAgICBQUk9HUkVTU19VUERBVEU6IGAvYXBpcy9wcm94aWVzL3Y4L2NvbnRlbnQtcHJvZ3Jlc2AsXG4gICAgQVNTRVNTTUVOVF9TRUNUSU9OOiBgL2FwaXMvcHJveGllcy92OC9hc3Nlc3NtZW50L3Y1L3JlYWRgLFxuICAgIEdFVF9GT1JNX0JZSUQ6IChmb3JtSWQ6IHN0cmluZykgPT4gYGFwaXMvcHJveGllcy92OC9mb3Jtcy92Mi9nZXRGb3JtQnlJZD9mb3JtSWQ9JHtmb3JtSWR9YCxcbiAgICBTVUJNSVRfRk9STTogYC9hcGlzL3Byb3hpZXMvdjgvZm9ybXMvdjIvc2F2ZUZvcm1TdWJtaXRgLFxuICAgIC8vIEdFVF9GT1JNX0JZSUQ6IChmb3JtSWQ6IHN0cmluZykgPT4gYGFwaXMvcHJveGllcy92OC9mb3Jtcy9nZXRGb3JtQnlJZD9pZD0ke2Zvcm1JZH1gLFxuICAgIC8vIFNVQk1JVF9GT1JNOiBgL2FwaXMvcHJveGllcy92OC9mb3Jtcy92MS9zYXZlRm9ybVN1Ym1pdGAsXG4gICAgUFJFX0FTU0VTU01FTlRfU1RBVEVfVVBEQVRFOiBgL2FwaXMvcHJveGllcy92OC9jb250ZW50L3YyL3N0YXRlL3VwZGF0ZWBcblxuICB9XG4gIGRvd25sb2FkUmVnZXggPSBuZXcgUmVnRXhwKGAoL2NvbnRlbnQtc3RvcmUvLio/KShcXFxcXFwpP1xcXFxcXFxcP1snXCJdKWAsICdnbScpXG4gIGF1dGhvcmluZ0Jhc2UgPSAnL2FwaXMvYXV0aENvbnRlbnQvJ1xuICBtYXJrQXNDb21wbGV0ZVN1YmplY3QgPSBuZXcgU3ViamVjdCgpXG4gIGF1dG9QbGF5TmV4dFZpZGVvID0gbmV3IFN1YmplY3QoKVxuICBhdXRvUGxheU5leHRBdWRpbyA9IG5ldyBTdWJqZWN0KClcbiAgZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcmcHJldmlldz10cnVlJylcbiAgcHVibGljVXNlckRldGFpbHM6IGFueSA9IHt9XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGNvbmZpZ3NlcnZpY2U6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGNvbnRlbnRTdmM6IFdpZGdldENvbnRlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXNlclN2YzogV2lkZ2V0VXNlclNlcnZpY2VMaWIsXG4gICAgcHJpdmF0ZSBjb250ZW50TGFuZ1N2YzogQ29udGVudExhbmd1YWdlU2VydmljZSxcbiAgICBwcml2YXRlIGRvbWFpbkNvbmZTdmM6IERvbWFpbkNvbmZTZXJ2aWNlLFxuICAgIEBJbmplY3QoJ2Vudmlyb25tZW50JykgcHJpdmF0ZSBlbnZpcm9ubWVudDogYW55XG4gICkgeyB9XG5cbiAgYXN5bmMgZmV0Y2hNYW5pZmVzdEZpbGUodXJsOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldFMzQ29va2llKHVybClcbiAgICBjb25zdCBtYW5pZmVzdEZpbGUgPSBhd2FpdCB0aGlzLmh0dHBcbiAgICAgIC5nZXQ8YW55Pih1cmwpXG4gICAgICAudG9Qcm9taXNlKClcbiAgICAgIC5jYXRjaCgoX2VycjogYW55KSA9PiB7IH0pXG4gICAgcmV0dXJuIG1hbmlmZXN0RmlsZVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXRTM0Nvb2tpZShfY29udGVudElkOiBzdHJpbmcpIHtcbiAgICAvLyBhd2FpdCB0aGlzLmh0dHBcbiAgICAvLyAgIC5wb3N0KHRoaXMuQVBJX0VORFBPSU5UUy5zZXRTM0Nvb2tpZSwgeyBjb250ZW50SWQgfSlcbiAgICAvLyAgIC50b1Byb21pc2UoKVxuICAgIC8vICAgLmNhdGNoKChfZXJyOiBhbnkpID0+IHsgfSlcbiAgICByZXR1cm5cbiAgfVxuXG4gIGNhbGN1bGF0ZVBlcmNlbnQoY3VycmVudDogc3RyaW5nW10sIG1heDogbnVtYmVyLCBtaW1lVHlwZT86IHN0cmluZyk6IG51bWJlciB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbXAgPSBbLi4uY3VycmVudF1cbiAgICAgIGlmICh0ZW1wICYmIHRlbXAubGVuZ3RoICYmIG1heCkge1xuICAgICAgICBjb25zdCBsYXRlc3QgPSBwYXJzZUZsb2F0KHRlbXAucG9wKCkgfHwgJzAnKVxuICAgICAgICBjb25zdCBwZXJjZW50TWlsaXMgPSAobGF0ZXN0IC8gbWF4KSAqIDEwMFxuICAgICAgICBsZXQgcGVyY2VudCA9IHBhcnNlRmxvYXQocGVyY2VudE1pbGlzLnRvRml4ZWQoMikpXG4gICAgICAgIGlmIChcbiAgICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVA0IHx8XG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk0zVTggfHxcbiAgICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVAzIHx8XG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk00QSB8fFxuICAgICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5ZT1VUVUJFIHx8XG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLlNVUlZFWVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAocGVyY2VudCA8PSA1KSB7XG4gICAgICAgICAgICAvLyBpZiBwZXJjZW50YWdlIGlzIGxlc3MgdGhhbiA1JSBtYWtlIGl0IDBcbiAgICAgICAgICAgIHBlcmNlbnQgPSAwXG4gICAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50ID49IDk1KSB7XG4gICAgICAgICAgICAvLyBpZiBwZXJjZW50YWdlIGlzIGdyZWF0ZXIgdGhhbiA5NSUgbWFrZSBpdCAxMDBcbiAgICAgICAgICAgIHBlcmNlbnQgPSAxMDBcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBlcmNlbnRcbiAgICAgIH1cbiAgICAgIHJldHVybiAwXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIDBcbiAgICB9XG4gIH1cblxuICBnZXRTdGF0dXMoY3VycmVudDogc3RyaW5nW10sIG1heDogbnVtYmVyLCBtaW1lVHlwZT86IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwZXJjZW50YWdlID0gdGhpcy5jYWxjdWxhdGVQZXJjZW50KGN1cnJlbnQsIG1heCwgbWltZVR5cGUpXG4gICAgICAvLyBmb3IgdmlkZW9zIGFuZCBhdWRpb3NcbiAgICAgIGlmIChcbiAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk1QNCB8fFxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTTNVOCB8fFxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVAzIHx8XG4gICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NNEEgfHxcbiAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLlNVUlZFWSB8fFxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuUERGXG4gICAgICApIHtcbiAgICAgICAgLy8gaWYgcGVyY2VudGFnZSBpcyBsZXNzIHRoYW4gNSUgdGhlbiBtYWtlIHN0YXR1cyBzdGFydGVkXG4gICAgICAgIGlmIChNYXRoLmNlaWwocGVyY2VudGFnZSkgPD0gNSkge1xuICAgICAgICAgIHJldHVybiAxXG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgcGVyY2VudGFnZSBpcyBncmVhdGVyIHRoYW4gOTUlIHRoZW4gbWFrZSBzdGF0dXMgY29tcGxldGVcbiAgICAgICAgaWYgKE1hdGguY2VpbChwZXJjZW50YWdlKSA+PSA5NSkge1xuICAgICAgICAgIHJldHVybiAyXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChNYXRoLmNlaWwocGVyY2VudGFnZSkgPj0gMTAwKSB7XG4gICAgICAgICAgcmV0dXJuIDJcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIDFcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gMVxuICAgIH1cbiAgfVxuXG4gIHJlYWxUaW1lUHJvZ3Jlc3NVcGRhdGUoY29udGVudElkOiBzdHJpbmcsIHJlcXVlc3Q6IGFueSwgY29sbGVjdGlvbklkPzogc3RyaW5nLCBiYXRjaElkPzogc3RyaW5nKSB7XG4gICAgbGV0IHJlcTogYW55XG4gICAgaWYgKHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZSkge1xuICAgICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmdldFJlc291cmNlQ29udGVudExhbmd1YWdlKGNvbnRlbnRJZClcbiAgICAgIHJlcSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHVzZXJJZDogdGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJyxcbiAgICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb250ZW50SWQsXG4gICAgICAgICAgICAgIGJhdGNoSWQsXG4gICAgICAgICAgICAgIGxhbmd1YWdlLFxuICAgICAgICAgICAgICBzdGF0dXM6IHRoaXMuZ2V0U3RhdHVzKHJlcXVlc3QuY3VycmVudCwgcmVxdWVzdC5tYXhfc2l6ZSwgcmVxdWVzdC5taW1lX3R5cGUpLFxuICAgICAgICAgICAgICBjb3Vyc2VJZDogY29sbGVjdGlvbklkLFxuICAgICAgICAgICAgICBsYXN0QWNjZXNzVGltZTogZGF5anMobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzOlNTU1paJyksXG4gICAgICAgICAgICAgIHByb2dyZXNzZGV0YWlsczoge1xuICAgICAgICAgICAgICAgIG1heF9zaXplOiByZXF1ZXN0Lm1heF9zaXplLFxuICAgICAgICAgICAgICAgIGN1cnJlbnQ6IHJlcXVlc3QuY3VycmVudCxcbiAgICAgICAgICAgICAgICBtaW1lVHlwZTogcmVxdWVzdC5taW1lX3R5cGUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiB0aGlzLmNhbGN1bGF0ZVBlcmNlbnQocmVxdWVzdC5jdXJyZW50LCByZXF1ZXN0Lm1heF9zaXplLCByZXF1ZXN0Lm1pbWVfdHlwZSksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgICAvLyBpZiAodGhpcy5jb25maWdzZXJ2aWNlLmNzdG9rZW4gIT09ICcnKSB7XG4gICAgICAvLyAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKVxuICAgICAgLy8gICAuc2V0KCdjc3Rva2VuJywgdGhpcy5jb25maWdzZXJ2aWNlLmNzdG9rZW4pXG5cbiAgICAgIC8vICAgdGhpcy5odHRwXG4gICAgICAvLyAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCB7IGhlYWRlcnMgfSAsIHJlcSlcbiAgICAgIC8vICAgLnN1YnNjcmliZShub29wLCBub29wKVxuICAgICAgLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgdGhpcy5odHRwXG4gICAgICAvLyAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCByZXEpXG4gICAgICAvLyAgIC5zdWJzY3JpYmUobm9vcCwgbm9vcClcbiAgICAgIC8vIH1cbiAgICAgIHRoaXMuaHR0cFxuICAgICAgICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBST0dSRVNTX1VQREFURX0vJHtjb250ZW50SWR9YCwgcmVxKVxuICAgICAgICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXG4gICAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdICYmXG4gICAgICAgICghdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPCAyKSkge1xuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLnN0YXR1c1xuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFRyaWdnZXIgbWlsZXN0b25lIGxvY2sgcmVjb21wdXRhdGlvbiBmb3IgTGVhcm5pbmcgUGF0aHdheXNcbiAgICAgICAgdGhpcy50b2NTdmMudHJpZ2dlck1pbGVzdG9uZUxvY2tVcGRhdGUoKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXEgPSB7fVxuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxuXG4gIGdldEJhdGNoSWRBbmRDb3Vyc2VJZChjb3Vyc2VJZDogc3RyaW5nLCBiYXRjaElkOiBzdHJpbmcsIHJlc291cmNlSWQ6IHN0cmluZykge1xuICAgIGNvbnN0IHRlbXBEYXRhID0ge1xuICAgICAgY291cnNlSWQsXG4gICAgICBiYXRjaElkLFxuICAgIH1cbiAgICBjb25zdCB0ZW1wQ29udGVudERhdGEgPSB0aGlzLmNvbnRlbnRTdmMuY3VycmVudE1ldGFEYXRhXG4gICAgY29uc3QgdGVtcENvbnRlbnRSZWFkRGF0YSA9IHRoaXMuY29udGVudFN2Yy5jdXJyZW50Q29udGVudFJlYWRNZXRhRGF0YVxuICAgIGNvbnN0IGVucm9sbG1lbnRMaXN0ID0gdGhpcy5jb250ZW50U3ZjLmN1cnJlbnRCYXRjaEVucm9sbG1lbnRMaXN0XG4gICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgIGlmICh0ZW1wQ29udGVudERhdGEgJiYgdGVtcENvbnRlbnRSZWFkRGF0YS5jdW11bGF0aXZlVHJhY2tpbmcgJiZcbiAgICAgICAgKHRlbXBDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gfHxcbiAgICAgICAgICB0ZW1wQ29udGVudERhdGEucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU1cbiAgICAgICAgICB8fCB0ZW1wQ29udGVudERhdGEucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU1cbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRlbXBDb250ZW50RGF0YS5jaGlsZHJlbi5mb3JFYWNoKGFzeW5jIChjaGlsZExpc3Q6IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICAgIGlmIChjaGlsZExpc3QucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICBjb25zdCBjb3Vyc2VFbnJvbGxtZW50TGlzdCA9IGVucm9sbG1lbnRMaXN0ICYmIGVucm9sbG1lbnRMaXN0LmZpbHRlcigodjogTnNDb250ZW50LklDb3Vyc2UpID0+IHYuY29udGVudElkID09PSBjaGlsZExpc3QuaWRlbnRpZmllcilcbiAgICAgICAgICAgIGlmIChjaGlsZExpc3QuY2hpbGROb2RlcyAmJiBjaGlsZExpc3QuY2hpbGROb2Rlcy5pbmRleE9mKHJlc291cmNlSWQpICE9PSAtMSkge1xuICAgICAgICAgICAgICBpZiAoY291cnNlRW5yb2xsbWVudExpc3QgJiYgY291cnNlRW5yb2xsbWVudExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHRlbXBEYXRhLmJhdGNoSWQgPSBjb3Vyc2VFbnJvbGxtZW50TGlzdFtjb3Vyc2VFbnJvbGxtZW50TGlzdC5sZW5ndGggLSAxXS5iYXRjaC5iYXRjaElkXG4gICAgICAgICAgICAgICAgdGVtcERhdGEuY291cnNlSWQgPSBjaGlsZExpc3QuaWRlbnRpZmllclxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IGF3YWl0IHRoaXMuY2hlY2tGb3JDb3Vyc2VFbnJvbGxtZW50KGNoaWxkTGlzdCwgcmVzb3VyY2VJZCwgZW5yb2xsbWVudExpc3QsIHRlbXBEYXRhKVxuICAgICAgICAgICAgICAgIHRlbXBEYXRhLmNvdXJzZUlkID0gZGF0YS5jb3Vyc2VJZFxuICAgICAgICAgICAgICAgIHRlbXBEYXRhLmJhdGNoSWQgPSBkYXRhLmJhdGNoSWRcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodGVtcENvbnRlbnREYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKSB7XG4gICAgICAgICAgICBpZiAodGVtcERhdGEuY291cnNlSWQgPT09IGNvdXJzZUlkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGJQRW5yb2xsbWVudExpc3QgPSBlbnJvbGxtZW50TGlzdC5maWx0ZXIoKHY6IE5zQ29udGVudC5JQ291cnNlKSA9PiB2LmNvbnRlbnRJZCA9PT0gdGVtcENvbnRlbnREYXRhLmlkZW50aWZpZXIpXG4gICAgICAgICAgICAgIGlmICh0ZW1wQ29udGVudERhdGEuY2hpbGROb2RlcyAmJiB0ZW1wQ29udGVudERhdGEuY2hpbGROb2Rlcy5pbmRleE9mKHJlc291cmNlSWQpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmIChiUEVucm9sbG1lbnRMaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIHRlbXBEYXRhLmJhdGNoSWQgPSBiUEVucm9sbG1lbnRMaXN0W2JQRW5yb2xsbWVudExpc3QubGVuZ3RoIC0gMV0uYmF0Y2guYmF0Y2hJZFxuICAgICAgICAgICAgICAgICAgdGVtcERhdGEuY291cnNlSWQgPSB0ZW1wQ29udGVudERhdGEuaWRlbnRpZmllclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRlbXBEYXRhXG4gIH1cblxuICBnZXRSZXNvdXJjZUNvbnRlbnRMYW5ndWFnZShyZXNvdXJjZUlkOiBzdHJpbmcpIHtcblxuICAgIGxldCB0ZW1wTGFuZ3VhZ2U6IGFueSA9ICdlbmdsaXNoJ1xuICAgIGxldCBsYW5ndWFnZUZvdW5kID0gZmFsc2VcbiAgICBjb25zdCB0ZW1wQ29udGVudERhdGEgPSB0aGlzLmNvbnRlbnRTdmMuY3VycmVudE1ldGFEYXRhXG4gICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgIHRlbXBDb250ZW50RGF0YS5jaGlsZHJlbj8uZm9yRWFjaChhc3luYyAoY2hpbGRMaXN0OiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkTGlzdC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPVVJTRSkge1xuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgaWYgKGNoaWxkTGlzdC5sZWFmTm9kZXMgJiYgY2hpbGRMaXN0LmxlYWZOb2Rlcy5pbmRleE9mKHJlc291cmNlSWQpICE9PSAtMSkge1xuICAgICAgICAgICAgdGVtcExhbmd1YWdlID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRDb250ZW50TGFuZ3VhZ2UoY2hpbGRMaXN0KVxuICAgICAgICAgICAgbGFuZ3VhZ2VGb3VuZCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIClcbiAgICAgIGlmICghbGFuZ3VhZ2VGb3VuZCkge1xuICAgICAgICBpZiAodGVtcENvbnRlbnREYXRhLmxlYWZOb2RlcyAmJiB0ZW1wQ29udGVudERhdGEubGVhZk5vZGVzLmluZGV4T2YocmVzb3VyY2VJZCkgIT09IC0xKSB7XG4gICAgICAgICAgdGVtcExhbmd1YWdlID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRDb250ZW50TGFuZ3VhZ2UodGVtcENvbnRlbnREYXRhKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0ZW1wTGFuZ3VhZ2VcbiAgfVxuXG4gIGFzeW5jIGNoZWNrRm9yQ291cnNlRW5yb2xsbWVudChjaGlsZExpc3Q6IE5zQ29udGVudC5JQ29udGVudCwgX3Jlc291cmNlSWQ6IHN0cmluZywgX2Vucm9sbG1lbnRMaXN0OiBhbnksIF90ZW1wRGF0YTogYW55KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICBjb25zdCBjb3Vyc2VEYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmNvbnRlbnRTdmMuYXV0b0Fzc2lnbkJhdGNoQXBpKGNoaWxkTGlzdC5pZGVudGlmaWVyKS50b1Byb21pc2UoKS50aGVuKGFzeW5jIChkYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICBjb25zdCByZXNwb25zZURhdGEgPSBhd2FpdCB0aGlzLnVzZXJTdmMuZmV0Y2hFbnJvbGxtZW50RGF0YUJ5Q29udGVudElkKHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZT8udXNlcklkLCBjaGlsZExpc3QuaWRlbnRpZmllcikudG9Qcm9taXNlKCkudGhlbihhc3luYyAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzICYmIHJlcy5jb3Vyc2VzICYmIHJlcy5jb3Vyc2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcy5jb3Vyc2VzXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbeyBjb3Vyc2VJZDogY2hpbGRMaXN0LmlkZW50aWZpZXIsIGJhdGNoSWQ6ICcnIH1dXG5cbiAgICAgICAgfSkuY2F0Y2goKF9lcnI6IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBbeyBjb3Vyc2VJZDogY2hpbGRMaXN0LmlkZW50aWZpZXIsIGJhdGNoSWQ6ICcnIH1dXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuY29udGVudFN2Yy5jdXJyZW50QmF0Y2hFbnJvbGxtZW50TGlzdCA9IFsuLi50aGlzLmNvbnRlbnRTdmMuY3VycmVudEJhdGNoRW5yb2xsbWVudExpc3QsIC4uLnJlc3BvbnNlRGF0YV1cbiAgICAgICAgcmV0dXJuIHsgY291cnNlSWQ6IGNoaWxkTGlzdC5pZGVudGlmaWVyLCBiYXRjaElkOiByZXNwb25zZURhdGFbMF0uYmF0Y2hJZCB9XG4gICAgICB9XG4gICAgfSkuY2F0Y2goKF9lcnI6IGFueSkgPT4ge1xuICAgICAgcmV0dXJuIFt7IGNvdXJzZUlkOiBjaGlsZExpc3QuaWRlbnRpZmllciwgYmF0Y2hJZDogJycgfV1cbiAgICB9KVxuICAgIHJldHVybiBjb3Vyc2VEYXRhXG4gIH1cblxuICByZWFsVGltZVByb2dyZXNzVXBkYXRlUXVpeihjb250ZW50SWQ6IHN0cmluZywgY29sbGVjdGlvbklkPzogc3RyaW5nLCBiYXRjaElkPzogc3RyaW5nLCBzdGF0dXM/OiBudW1iZXIpIHtcbiAgICBsZXQgcmVxOiBhbnlcbiAgICBpZiAodGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlKSB7XG4gICAgICBjb25zdCBsYW5ndWFnZSA9IHRoaXMuZ2V0UmVzb3VyY2VDb250ZW50TGFuZ3VhZ2UoY29udGVudElkKVxuICAgICAgcmVxID0ge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgdXNlcklkOiB0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUudXNlcklkIHx8ICcnLFxuICAgICAgICAgIGNvbnRlbnRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNvbnRlbnRJZCxcbiAgICAgICAgICAgICAgYmF0Y2hJZCxcbiAgICAgICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzIHx8IDIsXG4gICAgICAgICAgICAgIGNvdXJzZUlkOiBjb2xsZWN0aW9uSWQsXG4gICAgICAgICAgICAgIGxhc3RBY2Nlc3NUaW1lOiBkYXlqcyhuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3M6U1NTWlonKSxcbiAgICAgICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IHN0YXR1cyA9PT0gMiA/IDEwMCA6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9XG5cbiAgICAgIHRoaXMuaHR0cFxuICAgICAgICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBST0dSRVNTX1VQREFURX0vJHtjb250ZW50SWR9YCwgcmVxKVxuICAgICAgICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXG4gICAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcCAmJiB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF0gJiYgcmVxLnJlcXVlc3QuY29udGVudHNbMF0pIHtcbiAgICAgICAgaWYgKHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJlxuICAgICAgICAgICghdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPCAyKSkge1xuICAgICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLmNvbXBsZXRpb25QZXJjZW50YWdlXG4gICAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5zdGF0dXNcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBUcmlnZ2VyIG1pbGVzdG9uZSBsb2NrIHJlY29tcHV0YXRpb24gZm9yIExlYXJuaW5nIFBhdGh3YXlzXG4gICAgICAgICAgdGhpcy50b2NTdmMudHJpZ2dlck1pbGVzdG9uZUxvY2tVcGRhdGUoKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcSA9IHt9XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgZ2V0Q29udGVudChjb250ZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50PiB7XG4gICAgY29uc3QgZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcmcHJldmlldz10cnVlJylcbiAgICBsZXQgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvcmVhZC8ke2NvbnRlbnRJZH1gXG4gICAgaWYgKCFmb3JQcmV2aWV3KSB7XG4gICAgICB1cmwgPSBgL2FwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9yZWFkLyR7Y29udGVudElkfWBcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCdlZGl0TW9kZT10cnVlJykgJiYgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ19yYycpKSB7XG4gICAgICAgIHVybCA9IGAvYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL3JlYWQvJHtjb250ZW50SWR9YFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdXJsID0gYC9hcGkvY29udGVudC92MS9yZWFkLyR7Y29udGVudElkfWBcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50PihcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgIC8vIGAvYXBpcy9hdXRoQXBpL2FjdGlvbi9jb250ZW50L2hpZXJhcmNoeS8ke2NvbnRlbnRJZH0/cm9vdE9yZz0ke3RoaXMuY29uZmlnc2VydmljZS5yb290T3JnIHx8ICdpZ290J30mb3JnPSR7dGhpcy5jb25maWdzZXJ2aWNlLmFjdGl2ZU9yZyB8fCAnZG9wdCd9YCxcbiAgICAgIHVybFxuICAgIClcbiAgfVxuXG4gIGdldEF1dGhvcmluZ1VybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHVybFxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgPyBgL2FwaXMvYXV0aENvbnRlbnQvJHt1cmwuaW5jbHVkZXMoJy9jb250ZW50LXN0b3JlLycpID8gbmV3IFVSTCh1cmwpLnBhdGhuYW1lLnNsaWNlKDEpIDogZW5jb2RlVVJJQ29tcG9uZW50KHVybCl9YFxuICAgICAgOiAnJ1xuICB9XG5cbiAgcmVnZXhEb3dubG9hZFJlcGxhY2UgPSAoX3N0ciA9ICcnLCBncm91cDE6IHN0cmluZywgZ3JvdXAyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBgJHt0aGlzLmF1dGhvcmluZ0Jhc2V9JHtlbmNvZGVVUklDb21wb25lbnQoZ3JvdXAxKX0ke2dyb3VwMn1gXG4gIH1cblxuICByZXBsYWNlVG9BdXRoVXJsKGRhdGE6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UoXG4gICAgICBKU09OLnN0cmluZ2lmeShkYXRhKS5yZXBsYWNlKFxuICAgICAgICB0aGlzLmRvd25sb2FkUmVnZXgsXG4gICAgICAgIHRoaXMucmVnZXhEb3dubG9hZFJlcGxhY2UsXG4gICAgICApLFxuICAgIClcbiAgfVxuICByZWFkU2VjdGlvbnMoYXNzZXNzbWVudElkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5BUElfRU5EUE9JTlRTfS8ke2Fzc2Vzc21lbnRJZH1gXG4gIH1cblxuICBnZXRQdWJsaWNVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1haW5VcmwgPSB1cmwuc3BsaXQoJy9jb250ZW50JykucG9wKCkgfHwgJydcbiAgICByZXR1cm4gYCR7dGhpcy5lbnZpcm9ubWVudC5jb250ZW50SG9zdH0vJHt0aGlzLmVudmlyb25tZW50LmNvbnRlbnRCdWNrZXR9L2NvbnRlbnQke21haW5Vcmx9YFxuICB9XG5cbiAgZ2V0Q2RuVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBtYWluVXJsID0gdXJsLnNwbGl0KCcvY29udGVudCcpLnBvcCgpIHx8ICcnXG4gICAgcmV0dXJuIGAke3RoaXMuZG9tYWluQ29uZlN2Yy5nZXREb21haW5DRE5Ib3N0KCl9LyR7dGhpcy5lbnZpcm9ubWVudC5jZG5Db250ZW50QnVja2V0fS9jb250ZW50JHttYWluVXJsfWBcbiAgfVxuXG4gIC8vICBmZXRjaENvbnRlbnQoXG4gIC8vICAgY29udGVudElkOiBzdHJpbmcsXG4gIC8vICAgaGllcmFyY2h5VHlwZTogJ2FsbCcgfCAnbWluaW1hbCcgfCAnZGV0YWlsJyA9ICdkZXRhaWwnXG4gIC8vICAgKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRlbnQ+IHtcbiAgLy8gICAgIGxldCB1cmwgPSAnJ1xuICAvLyAgICAgY29uc3QgZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcmcHJldmlldz10cnVlJylcbiAgLy8gICAgICAgaWYgKCFmb3JQcmV2aWV3KSB7XG4gIC8vICAgICAgICAgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvaGllcmFyY2h5LyR7Y29udGVudElkfT9oaWVyYXJjaHlUeXBlPSR7aGllcmFyY2h5VHlwZX1gXG4gIC8vICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgdXJsID0gYC9hcGkvY291cnNlL3YxL2hpZXJhcmNoeS8ke2NvbnRlbnRJZH0/aGllcmFyY2h5VHlwZT0ke2hpZXJhcmNoeVR5cGV9YFxuICAvLyAgICAgICB9XG4gIC8vICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudD4odXJsKVxuICAvLyAgIH1cblxuICBmZXRjaENvbnRlbnQoaWQ6IHN0cmluZywgdHlwZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50PihgL2FwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9oaWVyYXJjaHkvJHtpZH0/bW9kZT0ke3R5cGV9YClcbiAgfVxuXG4gIHVwZGF0ZUNvbnRlbnRIYXNoTWFwRm9yQXNzZXNzdGVudChjb250ZW50SWQ6IHN0cmluZywgY29udGVudFByb2dyZXNzOiBhbnkpIHtcbiAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdICYmXG4gICAgICAoIXRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIHx8IHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIDwgMikpIHtcbiAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IGNvbnRlbnRQcm9ncmVzcy5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSBjb250ZW50UHJvZ3Jlc3Muc3RhdHVzXG4gICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cbiAgICB9XG4gIH1cblxuICBnZXRGb3JtQnlJZChmb3JtSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuQVBJX0VORFBPSU5UUy5HRVRfRk9STV9CWUlEKGZvcm1JZCkpXG4gIH1cblxuICBzdWJtaXRGb3JtKGZvcm1EYXRhOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55Pih0aGlzLkFQSV9FTkRQT0lOVFMuU1VCTUlUX0ZPUk0sIGZvcm1EYXRhKVxuICB9XG5cbiAgcmVhbFRpbWVQcm9ncmVzc1VwZGF0ZUZvclByZUFzc2Vzc21lbnQoY29udGVudElkOiBzdHJpbmcsIHJlcXVlc3Q6IGFueSkge1xuICAgIGxldCByZXE6IGFueVxuICAgIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUpIHtcbiAgICAgIHJlcSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHVzZXJJZDogdGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJyxcbiAgICAgICAgICBjb250ZW50czogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBjb250ZW50SWQsXG4gICAgICAgICAgICAgIC8vIGJhdGNoSWQsXG4gICAgICAgICAgICAgIHN0YXR1czogdGhpcy5nZXRTdGF0dXMocmVxdWVzdC5jdXJyZW50LCByZXF1ZXN0Lm1heF9zaXplLCByZXF1ZXN0Lm1pbWVfdHlwZSksXG4gICAgICAgICAgICAgIC8vIGNvdXJzZUlkOiBjb2xsZWN0aW9uSWQsXG4gICAgICAgICAgICAgIGxhc3RBY2Nlc3NUaW1lOiBkYXlqcyhuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3M6U1NTWlonKSxcbiAgICAgICAgICAgICAgcHJvZ3Jlc3NkZXRhaWxzOiB7XG4gICAgICAgICAgICAgICAgbWF4X3NpemU6IHJlcXVlc3QubWF4X3NpemUsXG4gICAgICAgICAgICAgICAgY3VycmVudDogcmVxdWVzdC5jdXJyZW50LFxuICAgICAgICAgICAgICAgIG1pbWVUeXBlOiByZXF1ZXN0Lm1pbWVfdHlwZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IHRoaXMuY2FsY3VsYXRlUGVyY2VudChyZXF1ZXN0LmN1cnJlbnQsIHJlcXVlc3QubWF4X3NpemUsIHJlcXVlc3QubWltZV90eXBlKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICAgIC8vIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UuY3N0b2tlbiAhPT0gJycpIHtcbiAgICAgIC8vICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpXG4gICAgICAvLyAgIC5zZXQoJ2NzdG9rZW4nLCB0aGlzLmNvbmZpZ3NlcnZpY2UuY3N0b2tlbilcblxuICAgICAgLy8gICB0aGlzLmh0dHBcbiAgICAgIC8vICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHsgaGVhZGVycyB9ICwgcmVxKVxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXG4gICAgICAvLyB9IGVsc2Uge1xuICAgICAgLy8gICB0aGlzLmh0dHBcbiAgICAgIC8vICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcbiAgICAgIC8vICAgLnN1YnNjcmliZShub29wLCBub29wKVxuICAgICAgLy8gfVxuICAgICAgLy8gdGhpcy5odHRwXG4gICAgICAvLyAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCByZXEpXG4gICAgICAvLyAgIC5zdWJzY3JpYmUobm9vcCwgbm9vcClcbiAgICAgIC8vY29uc3QgY29udGVudElkTmV3PSByZXEucmVxdWVzdC5jb250ZW50c1swXS5jb250ZW50SWRcbiAgICAgIC8vIGNvbnN0IHVwZGF0ZWRDb21wbGV0aW9uUGVyY2VudGFnZSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLmNvbXBsZXRpb25QZXJjZW50YWdlXG4gICAgICAvLyBjb25zdCB1cGRhdGVkU3RhdHVzID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uc3RhdHVzXG5cbiAgICAgIC8vIC8vIENsb25lIHRoZSBpbm5lciBvYmplY3QgYW5kIHVwZGF0ZVxuICAgICAgLy8gY29uc3QgZXhpc3RpbmdDb250ZW50ID0gdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWROZXddIHx8IHt9XG5cbiAgICAgIC8vIHRoaXMudG9jU3ZjLmhhc2htYXAgPSB7XG4gICAgICAvLyAgIC4uLnRoaXMudG9jU3ZjLmhhc2htYXAsXG4gICAgICAvLyAgIFtjb250ZW50SWROZXddOiB7XG4gICAgICAvLyAgICAgLi4uZXhpc3RpbmdDb250ZW50LFxuICAgICAgLy8gICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiB1cGRhdGVkQ29tcGxldGlvblBlcmNlbnRhZ2UsXG4gICAgICAvLyAgICAgY29tcGxldGlvblN0YXR1czogdXBkYXRlZFN0YXR1c1xuICAgICAgLy8gICB9XG4gICAgICAvLyB9XG4gICAgICAvLyBjb25zb2xlLmxvZygncmVxJywgSlNPTi5zdHJpbmdpZnkocmVxKSlcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdyZXEnLCByZXEpXG5cbiAgICAgIGNvbnN0IHJlc291cmNlU3RhdHVzID0gdGhpcy5nZXRQcmVBc3Nlc3NtZW50UmVzb3VyY2VTdGF0dXMoY29udGVudElkKVxuICAgICAgaWYgKHJlc291cmNlU3RhdHVzIDwgMikge1xuICAgICAgICB0aGlzLmh0dHBcbiAgICAgICAgICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBSRV9BU1NFU1NNRU5UX1NUQVRFX1VQREFURX1gLCByZXEpXG4gICAgICAgICAgLnN1YnNjcmliZShub29wLCBub29wKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJlxuICAgICAgICAoIXRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIHx8IHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIDwgMikpIHtcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5zdGF0dXNcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydwYXJlbnQnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLmNvdXJzZUlkXG4gICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsncHJvZ3Jlc3MnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLnByb2dyZXNzZGV0YWlsc1xuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cbiAgICAgIH1cblxuICAgICAgLy8gY29uc29sZS5sb2coJ1VwZGF0ZWQgaGFzaG1hcDonLCB0aGlzLnRvY1N2Yy5oYXNobWFwKVxuXG4gICAgICAvLyBjb25zb2xlLmxvZygndGhpcy50b2NTdmMuaGFzaG1hcC0tLScsIHRoaXMudG9jU3ZjLmhhc2htYXApXG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcSA9IHt9XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgcmVhbFRpbWVQcm9ncmVzc1VwZGF0ZUZvclByZUFzc2Vzc21lbnRRdWl6KGNvbnRlbnRJZDogc3RyaW5nLCBzdGF0dXM/OiBudW1iZXIsIG1pbWVUeXBlPzogc3RyaW5nKSB7XG4gICAgbGV0IHJlcTogYW55XG4gICAgaWYgKHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZSkge1xuICAgICAgcmVxID0ge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgLy91c2VySWQ6IHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZS51c2VySWQgfHwgJycsXG4gICAgICAgICAgY29udGVudHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29udGVudElkLFxuICAgICAgICAgICAgICAvLyBiYXRjaElkLFxuICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyB8fCAyLFxuICAgICAgICAgICAgICAvLyBjb3Vyc2VJZDogY29sbGVjdGlvbklkLFxuICAgICAgICAgICAgICBsYXN0QWNjZXNzVGltZTogZGF5anMobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzOlNTU1paJyksXG4gICAgICAgICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiBzdGF0dXMgPT09IDIgPyAxMDAuMCA6IDAsXG4gICAgICAgICAgICAgIHByb2dyZXNzZGV0YWlsczoge1xuICAgICAgICAgICAgICAgIFwibWltZVR5cGVcIjogbWltZVR5cGUgfHwgXCJhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldFwiXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgICBjb25zdCByZXNvdXJjZVN0YXR1cyA9IHRoaXMuZ2V0UHJlQXNzZXNzbWVudFJlc291cmNlU3RhdHVzKGNvbnRlbnRJZClcbiAgICAgIGlmIChyZXNvdXJjZVN0YXR1cyA8IDIpIHtcbiAgICAgICAgdGhpcy5odHRwXG4gICAgICAgICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUkVfQVNTRVNTTUVOVF9TVEFURV9VUERBVEV9YCwgcmVxKVxuICAgICAgICAgIC5zdWJzY3JpYmUobm9vcCwgbm9vcClcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnRvY1N2Yy5oYXNobWFwICYmIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJiByZXEucmVxdWVzdC5jb250ZW50c1swXSkge1xuICAgICAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdICYmXG4gICAgICAgICAgKCF0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSB8fCB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSA8IDIpKSB7XG4gICAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25TdGF0dXMnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLnN0YXR1c1xuICAgICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXAgPSB7IC4uLnRoaXMudG9jU3ZjLmhhc2htYXAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcSA9IHt9XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgZ2V0UHJlQXNzZXNzbWVudFJlc291cmNlU3RhdHVzKHJlc291cmNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnRvY1N2YyAmJiB0aGlzLnRvY1N2Yy5oYXNobWFwICYmIHRoaXMudG9jU3ZjLmhhc2htYXBbcmVzb3VyY2VJZF0pIHtcbiAgICAgIHJldHVybiB0aGlzLnRvY1N2Yy5oYXNobWFwW3Jlc291cmNlSWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgMVxuICAgIH1cbiAgICByZXR1cm4gMVxuICB9XG5cblxufVxuIl19
|
|
1
|
+
import { NsContent } from '../_services/widget-content.model';
|
|
2
|
+
import { Inject, Injectable } from '@angular/core';
|
|
3
|
+
import { noop, Subject } from 'rxjs';
|
|
4
|
+
import dayjs from 'dayjs';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "@angular/common/http";
|
|
7
|
+
import * as i2 from "@sunbird-cb/utils-v2";
|
|
8
|
+
import * as i3 from "../_collection-api";
|
|
9
|
+
import * as i4 from "./app-toc.service";
|
|
10
|
+
import * as i5 from "@sunbird-cb/consumption";
|
|
11
|
+
export class ViewerUtilService {
|
|
12
|
+
constructor(http, configservice, contentSvc, tocSvc, userSvc, contentLangSvc, domainConfSvc, environment) {
|
|
13
|
+
this.http = http;
|
|
14
|
+
this.configservice = configservice;
|
|
15
|
+
this.contentSvc = contentSvc;
|
|
16
|
+
this.tocSvc = tocSvc;
|
|
17
|
+
this.userSvc = userSvc;
|
|
18
|
+
this.contentLangSvc = contentLangSvc;
|
|
19
|
+
this.domainConfSvc = domainConfSvc;
|
|
20
|
+
this.environment = environment;
|
|
21
|
+
this.API_ENDPOINTS = {
|
|
22
|
+
setS3Cookie: `/apis/v8/protected/content/setCookie`,
|
|
23
|
+
// PROGRESS_UPDATE: `/apis/protected/v8/user/realTimeProgress/update`,
|
|
24
|
+
PROGRESS_UPDATE: `/apis/proxies/v8/content-progres`,
|
|
25
|
+
ASSESSMENT_SECTION: `/apis/proxies/v8/assessment/v5/read`,
|
|
26
|
+
GET_FORM_BYID: (formId) => `apis/proxies/v8/forms/v2/getFormById?formId=${formId}`,
|
|
27
|
+
SUBMIT_FORM: `/apis/proxies/v8/forms/v2/saveFormSubmit`,
|
|
28
|
+
// GET_FORM_BYID: (formId: string) => `apis/proxies/v8/forms/getFormById?id=${formId}`,
|
|
29
|
+
// SUBMIT_FORM: `/apis/proxies/v8/forms/v1/saveFormSubmit`,
|
|
30
|
+
PRE_ASSESSMENT_STATE_UPDATE: `/apis/proxies/v8/content/v2/state/update`
|
|
31
|
+
};
|
|
32
|
+
this.downloadRegex = new RegExp(`(/content-store/.*?)(\\\)?\\\\?['"])`, 'gm');
|
|
33
|
+
this.authoringBase = '/apis/authContent/';
|
|
34
|
+
this.markAsCompleteSubject = new Subject();
|
|
35
|
+
this.autoPlayNextVideo = new Subject();
|
|
36
|
+
this.autoPlayNextAudio = new Subject();
|
|
37
|
+
this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
|
|
38
|
+
this.publicUserDetails = {};
|
|
39
|
+
this.regexDownloadReplace = (_str = '', group1, group2) => {
|
|
40
|
+
return `${this.authoringBase}${encodeURIComponent(group1)}${group2}`;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async fetchManifestFile(url) {
|
|
44
|
+
this.setS3Cookie(url);
|
|
45
|
+
const manifestFile = await this.http
|
|
46
|
+
.get(url)
|
|
47
|
+
.toPromise()
|
|
48
|
+
.catch((_err) => { });
|
|
49
|
+
return manifestFile;
|
|
50
|
+
}
|
|
51
|
+
async setS3Cookie(_contentId) {
|
|
52
|
+
// await this.http
|
|
53
|
+
// .post(this.API_ENDPOINTS.setS3Cookie, { contentId })
|
|
54
|
+
// .toPromise()
|
|
55
|
+
// .catch((_err: any) => { })
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
calculatePercent(current, max, mimeType) {
|
|
59
|
+
try {
|
|
60
|
+
const temp = [...current];
|
|
61
|
+
if (temp && temp.length && max) {
|
|
62
|
+
const latest = parseFloat(temp.pop() || '0');
|
|
63
|
+
const percentMilis = (latest / max) * 100;
|
|
64
|
+
let percent = parseFloat(percentMilis.toFixed(2));
|
|
65
|
+
if (mimeType === NsContent.EMimeTypes.MP4 ||
|
|
66
|
+
mimeType === NsContent.EMimeTypes.M3U8 ||
|
|
67
|
+
mimeType === NsContent.EMimeTypes.MP3 ||
|
|
68
|
+
mimeType === NsContent.EMimeTypes.M4A ||
|
|
69
|
+
mimeType === NsContent.EMimeTypes.YOUTUBE ||
|
|
70
|
+
mimeType === NsContent.EMimeTypes.SURVEY) {
|
|
71
|
+
if (percent <= 5) {
|
|
72
|
+
// if percentage is less than 5% make it 0
|
|
73
|
+
percent = 0;
|
|
74
|
+
}
|
|
75
|
+
else if (percent >= 95) {
|
|
76
|
+
// if percentage is greater than 95% make it 100
|
|
77
|
+
percent = 100;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return percent;
|
|
81
|
+
}
|
|
82
|
+
return 0;
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
// tslint:disable-next-line: no-console
|
|
86
|
+
console.log('Error in calculating percentage', e);
|
|
87
|
+
return 0;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
getStatus(current, max, mimeType) {
|
|
91
|
+
try {
|
|
92
|
+
const percentage = this.calculatePercent(current, max, mimeType);
|
|
93
|
+
// for videos and audios
|
|
94
|
+
if (mimeType === NsContent.EMimeTypes.MP4 ||
|
|
95
|
+
mimeType === NsContent.EMimeTypes.M3U8 ||
|
|
96
|
+
mimeType === NsContent.EMimeTypes.MP3 ||
|
|
97
|
+
mimeType === NsContent.EMimeTypes.M4A ||
|
|
98
|
+
mimeType === NsContent.EMimeTypes.SURVEY ||
|
|
99
|
+
mimeType === NsContent.EMimeTypes.PDF) {
|
|
100
|
+
// if percentage is less than 5% then make status started
|
|
101
|
+
if (Math.ceil(percentage) <= 5) {
|
|
102
|
+
return 1;
|
|
103
|
+
}
|
|
104
|
+
// if percentage is greater than 95% then make status complete
|
|
105
|
+
if (Math.ceil(percentage) >= 95) {
|
|
106
|
+
return 2;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
if (Math.ceil(percentage) >= 100) {
|
|
111
|
+
return 2;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return 1;
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
// tslint:disable-next-line: no-console
|
|
118
|
+
console.log('Error in getting completion status', e);
|
|
119
|
+
return 1;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
realTimeProgressUpdate(contentId, request, collectionId, batchId) {
|
|
123
|
+
let req;
|
|
124
|
+
if (this.configservice.userProfile) {
|
|
125
|
+
const language = this.getResourceContentLanguage(contentId);
|
|
126
|
+
req = {
|
|
127
|
+
request: {
|
|
128
|
+
userId: this.configservice.userProfile.userId || '',
|
|
129
|
+
contents: [
|
|
130
|
+
{
|
|
131
|
+
contentId,
|
|
132
|
+
batchId,
|
|
133
|
+
language,
|
|
134
|
+
status: this.getStatus(request.current, request.max_size, request.mime_type),
|
|
135
|
+
courseId: collectionId,
|
|
136
|
+
lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
|
|
137
|
+
progressdetails: {
|
|
138
|
+
max_size: request.max_size,
|
|
139
|
+
current: request.current,
|
|
140
|
+
mimeType: request.mime_type,
|
|
141
|
+
},
|
|
142
|
+
completionPercentage: this.calculatePercent(request.current, request.max_size, request.mime_type),
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
// if (this.configservice.cstoken !== '') {
|
|
148
|
+
// const headers = new HttpHeaders()
|
|
149
|
+
// .set('cstoken', this.configservice.cstoken)
|
|
150
|
+
// this.http
|
|
151
|
+
// .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, { headers } , req)
|
|
152
|
+
// .subscribe(noop, noop)
|
|
153
|
+
// } else {
|
|
154
|
+
// this.http
|
|
155
|
+
// .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
|
|
156
|
+
// .subscribe(noop, noop)
|
|
157
|
+
// }
|
|
158
|
+
this.http
|
|
159
|
+
.patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
|
|
160
|
+
.subscribe(noop, noop);
|
|
161
|
+
if (this.tocSvc.hashmap[contentId] &&
|
|
162
|
+
(!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
|
|
163
|
+
this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
|
|
164
|
+
this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
|
|
165
|
+
this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
|
|
166
|
+
// Notify UI components about hashmap changes
|
|
167
|
+
this.tocSvc.hashmapUpdated.next(this.tocSvc.hashmap);
|
|
168
|
+
// Trigger milestone lock recomputation for Learning Pathways
|
|
169
|
+
this.tocSvc.triggerMilestoneLockUpdate();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
req = {};
|
|
174
|
+
// do nothing
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
getBatchIdAndCourseId(courseId, batchId, resourceId) {
|
|
178
|
+
const tempData = {
|
|
179
|
+
courseId,
|
|
180
|
+
batchId,
|
|
181
|
+
};
|
|
182
|
+
const tempContentData = this.contentSvc.currentMetaData;
|
|
183
|
+
const tempContentReadData = this.contentSvc.currentContentReadMetaData;
|
|
184
|
+
const enrollmentList = this.contentSvc.currentBatchEnrollmentList;
|
|
185
|
+
if (!this.forPreview) {
|
|
186
|
+
if (tempContentData.courseCategory === 'Learning Pathway') {
|
|
187
|
+
// Find the course that contains the given resource ID
|
|
188
|
+
const foundCourse = this.findCourseContainingResource(tempContentData, resourceId);
|
|
189
|
+
if (foundCourse) {
|
|
190
|
+
// Always update courseId if course is found
|
|
191
|
+
tempData.courseId = foundCourse.identifier;
|
|
192
|
+
// Try to find batch ID from enrollment data for the found course
|
|
193
|
+
if (foundCourse.identifier) {
|
|
194
|
+
const enrollment = enrollmentList.find((course) => course.collectionId === foundCourse.identifier);
|
|
195
|
+
if (enrollment && enrollment.batchId) {
|
|
196
|
+
tempData.batchId = enrollment.batchId;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else if (tempContentData && tempContentReadData.cumulativeTracking &&
|
|
202
|
+
(tempContentData.primaryCategory === NsContent.EPrimaryCategory.PROGRAM ||
|
|
203
|
+
tempContentData.primaryCategory === NsContent.EPrimaryCategory.CURATED_PROGRAM
|
|
204
|
+
|| tempContentData.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM)) {
|
|
205
|
+
tempContentData.children.forEach(async (childList) => {
|
|
206
|
+
if (childList.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
|
|
207
|
+
// tslint:disable-next-line: max-line-length
|
|
208
|
+
const courseEnrollmentList = enrollmentList && enrollmentList.filter((v) => v.contentId === childList.identifier);
|
|
209
|
+
if (childList.childNodes && childList.childNodes.indexOf(resourceId) !== -1) {
|
|
210
|
+
if (courseEnrollmentList && courseEnrollmentList.length > 0) {
|
|
211
|
+
tempData.batchId = courseEnrollmentList[courseEnrollmentList.length - 1].batch.batchId;
|
|
212
|
+
tempData.courseId = childList.identifier;
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
const data = await this.checkForCourseEnrollment(childList, resourceId, enrollmentList, tempData);
|
|
216
|
+
tempData.courseId = data.courseId;
|
|
217
|
+
tempData.batchId = data.batchId;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
else if (tempContentData.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM) {
|
|
222
|
+
if (tempData.courseId === courseId) {
|
|
223
|
+
const bPEnrollmentList = enrollmentList.filter((v) => v.contentId === tempContentData.identifier);
|
|
224
|
+
if (tempContentData.childNodes && tempContentData.childNodes.indexOf(resourceId) !== -1) {
|
|
225
|
+
if (bPEnrollmentList.length > 0) {
|
|
226
|
+
tempData.batchId = bPEnrollmentList[bPEnrollmentList.length - 1].batch.batchId;
|
|
227
|
+
tempData.courseId = tempContentData.identifier;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
return tempData;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Recursively searches for a resource ID in a content's children hierarchy
|
|
239
|
+
* @param content The content object to search in
|
|
240
|
+
* @param resourceId The resource ID to find
|
|
241
|
+
* @returns true if resource is found, false otherwise
|
|
242
|
+
*/
|
|
243
|
+
findResourceInContent(content, resourceId) {
|
|
244
|
+
// Check if this content has the resource in its leafNodes
|
|
245
|
+
if (content.leafNodes && Array.isArray(content.leafNodes)) {
|
|
246
|
+
if (content.leafNodes.indexOf(resourceId) !== -1) {
|
|
247
|
+
return true;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// Check if this content's identifier matches the resource ID
|
|
251
|
+
if (content.identifier === resourceId) {
|
|
252
|
+
return true;
|
|
253
|
+
}
|
|
254
|
+
// Recursively search in children
|
|
255
|
+
if (content.children && Array.isArray(content.children)) {
|
|
256
|
+
for (const child of content.children) {
|
|
257
|
+
if (this.findResourceInContent(child, resourceId)) {
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
return false;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Finds the course that contains a given resource ID in a Learning Pathway
|
|
266
|
+
* @param learningPathwayContent The Learning Pathway content data
|
|
267
|
+
* @param resourceId The resource ID to find
|
|
268
|
+
* @returns The course object containing the resource, or null if not found
|
|
269
|
+
*/
|
|
270
|
+
findCourseContainingResource(learningPathwayContent, resourceId) {
|
|
271
|
+
// Check if milestones_v1 exists
|
|
272
|
+
if (!learningPathwayContent.milestones_v1 || !Array.isArray(learningPathwayContent.milestones_v1)) {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
// Loop through each milestone
|
|
276
|
+
for (const milestone of learningPathwayContent.milestones_v1) {
|
|
277
|
+
// Check if milestone has courses
|
|
278
|
+
if (milestone.courses && Array.isArray(milestone.courses)) {
|
|
279
|
+
// Loop through each course in the milestone
|
|
280
|
+
for (const course of milestone.courses) {
|
|
281
|
+
// Check if this course contains the resource
|
|
282
|
+
if (this.findResourceInContent(course, resourceId)) {
|
|
283
|
+
return course;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
getResourceContentLanguage(resourceId) {
|
|
291
|
+
let tempLanguage = 'english';
|
|
292
|
+
let languageFound = false;
|
|
293
|
+
const tempContentData = this.contentSvc.currentMetaData;
|
|
294
|
+
if (!this.forPreview) {
|
|
295
|
+
tempContentData.children?.forEach(async (childList) => {
|
|
296
|
+
if (childList.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
|
|
297
|
+
// tslint:disable-next-line: max-line-length
|
|
298
|
+
if (childList.leafNodes && childList.leafNodes.indexOf(resourceId) !== -1) {
|
|
299
|
+
tempLanguage = this.contentLangSvc.getContentLanguage(childList);
|
|
300
|
+
languageFound = true;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
if (!languageFound) {
|
|
305
|
+
if (tempContentData.leafNodes && tempContentData.leafNodes.indexOf(resourceId) !== -1) {
|
|
306
|
+
tempLanguage = this.contentLangSvc.getContentLanguage(tempContentData);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
return tempLanguage;
|
|
311
|
+
}
|
|
312
|
+
async checkForCourseEnrollment(childList, _resourceId, _enrollmentList, _tempData) {
|
|
313
|
+
// tslint:disable-next-line: max-line-length
|
|
314
|
+
const courseData = await this.contentSvc.autoAssignBatchApi(childList.identifier).toPromise().then(async (data) => {
|
|
315
|
+
if (data) {
|
|
316
|
+
// tslint:disable-next-line: max-line-length
|
|
317
|
+
const responseData = await this.userSvc.fetchEnrollmentDataByContentId(this.configservice.userProfile?.userId, childList.identifier).toPromise().then(async (res) => {
|
|
318
|
+
if (res && res.courses && res.courses.length) {
|
|
319
|
+
return res.courses;
|
|
320
|
+
}
|
|
321
|
+
return [{ courseId: childList.identifier, batchId: '' }];
|
|
322
|
+
}).catch((_err) => {
|
|
323
|
+
return [{ courseId: childList.identifier, batchId: '' }];
|
|
324
|
+
});
|
|
325
|
+
this.contentSvc.currentBatchEnrollmentList = [...this.contentSvc.currentBatchEnrollmentList, ...responseData];
|
|
326
|
+
return { courseId: childList.identifier, batchId: responseData[0].batchId };
|
|
327
|
+
}
|
|
328
|
+
}).catch((_err) => {
|
|
329
|
+
return [{ courseId: childList.identifier, batchId: '' }];
|
|
330
|
+
});
|
|
331
|
+
return courseData;
|
|
332
|
+
}
|
|
333
|
+
realTimeProgressUpdateQuiz(contentId, collectionId, batchId, status) {
|
|
334
|
+
let req;
|
|
335
|
+
if (this.configservice.userProfile) {
|
|
336
|
+
const language = this.getResourceContentLanguage(contentId);
|
|
337
|
+
req = {
|
|
338
|
+
request: {
|
|
339
|
+
userId: this.configservice.userProfile.userId || '',
|
|
340
|
+
contents: [
|
|
341
|
+
{
|
|
342
|
+
contentId,
|
|
343
|
+
batchId,
|
|
344
|
+
language,
|
|
345
|
+
status: status || 2,
|
|
346
|
+
courseId: collectionId,
|
|
347
|
+
lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
|
|
348
|
+
completionPercentage: status === 2 ? 100 : 0,
|
|
349
|
+
},
|
|
350
|
+
],
|
|
351
|
+
},
|
|
352
|
+
};
|
|
353
|
+
this.http
|
|
354
|
+
.patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
|
|
355
|
+
.subscribe(noop, noop);
|
|
356
|
+
if (this.tocSvc.hashmap && this.tocSvc.hashmap[contentId] && req.request.contents[0]) {
|
|
357
|
+
if (this.tocSvc.hashmap[contentId] &&
|
|
358
|
+
(!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
|
|
359
|
+
this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
|
|
360
|
+
this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
|
|
361
|
+
this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
|
|
362
|
+
// Notify UI components about hashmap changes
|
|
363
|
+
this.tocSvc.hashmapUpdated.next(this.tocSvc.hashmap);
|
|
364
|
+
// Trigger milestone lock recomputation for Learning Pathways
|
|
365
|
+
if (this.tocSvc.triggerMilestoneLockUpdate) {
|
|
366
|
+
this.tocSvc.triggerMilestoneLockUpdate();
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
req = {};
|
|
373
|
+
// do nothing
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
getContent(contentId) {
|
|
377
|
+
const forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
|
|
378
|
+
let url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
|
|
379
|
+
if (!forPreview) {
|
|
380
|
+
url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
if (window.location.href.includes('editMode=true') && window.location.href.includes('_rc')) {
|
|
384
|
+
url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
|
|
385
|
+
}
|
|
386
|
+
else {
|
|
387
|
+
url = `/api/content/v1/read/${contentId}`;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
return this.http.get(
|
|
391
|
+
// tslint:disable-next-line:max-line-length
|
|
392
|
+
// `/apis/authApi/action/content/hierarchy/${contentId}?rootOrg=${this.configservice.rootOrg || 'igot'}&org=${this.configservice.activeOrg || 'dopt'}`,
|
|
393
|
+
url);
|
|
394
|
+
}
|
|
395
|
+
getAuthoringUrl(url) {
|
|
396
|
+
return url
|
|
397
|
+
// tslint:disable-next-line:max-line-length
|
|
398
|
+
? `/apis/authContent/${url.includes('/content-store/') ? new URL(url).pathname.slice(1) : encodeURIComponent(url)}`
|
|
399
|
+
: '';
|
|
400
|
+
}
|
|
401
|
+
replaceToAuthUrl(data) {
|
|
402
|
+
return JSON.parse(JSON.stringify(data).replace(this.downloadRegex, this.regexDownloadReplace));
|
|
403
|
+
}
|
|
404
|
+
readSections(assessmentId) {
|
|
405
|
+
return `${this.API_ENDPOINTS}/${assessmentId}`;
|
|
406
|
+
}
|
|
407
|
+
getPublicUrl(url) {
|
|
408
|
+
const mainUrl = url.split('/content').pop() || '';
|
|
409
|
+
return `${this.environment.contentHost}/${this.environment.contentBucket}/content${mainUrl}`;
|
|
410
|
+
}
|
|
411
|
+
getCdnUrl(url) {
|
|
412
|
+
const mainUrl = url.split('/content').pop() || '';
|
|
413
|
+
return `${this.domainConfSvc.getDomainCDNHost()}/${this.environment.cdnContentBucket}/content${mainUrl}`;
|
|
414
|
+
}
|
|
415
|
+
// fetchContent(
|
|
416
|
+
// contentId: string,
|
|
417
|
+
// hierarchyType: 'all' | 'minimal' | 'detail' = 'detail'
|
|
418
|
+
// ): Observable<NsContent.IContent> {
|
|
419
|
+
// let url = ''
|
|
420
|
+
// const forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true')
|
|
421
|
+
// if (!forPreview) {
|
|
422
|
+
// url = `/apis/proxies/v8/action/content/v3/hierarchy/${contentId}?hierarchyType=${hierarchyType}`
|
|
423
|
+
// } else {
|
|
424
|
+
// url = `/api/course/v1/hierarchy/${contentId}?hierarchyType=${hierarchyType}`
|
|
425
|
+
// }
|
|
426
|
+
// return this.http.get<NsContent.IContent>(url)
|
|
427
|
+
// }
|
|
428
|
+
fetchContent(id, type) {
|
|
429
|
+
return this.http.get(`/apis/proxies/v8/action/content/v3/hierarchy/${id}?mode=${type}`);
|
|
430
|
+
}
|
|
431
|
+
updateContentHashMapForAssesstent(contentId, contentProgress) {
|
|
432
|
+
if (this.tocSvc.hashmap[contentId] &&
|
|
433
|
+
(!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
|
|
434
|
+
this.tocSvc.hashmap[contentId]['completionPercentage'] = contentProgress.completionPercentage;
|
|
435
|
+
this.tocSvc.hashmap[contentId]['completionStatus'] = contentProgress.status;
|
|
436
|
+
this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
getFormById(formId) {
|
|
440
|
+
return this.http.get(this.API_ENDPOINTS.GET_FORM_BYID(formId));
|
|
441
|
+
}
|
|
442
|
+
submitForm(formData) {
|
|
443
|
+
return this.http.post(this.API_ENDPOINTS.SUBMIT_FORM, formData);
|
|
444
|
+
}
|
|
445
|
+
realTimeProgressUpdateForPreAssessment(contentId, request) {
|
|
446
|
+
let req;
|
|
447
|
+
if (this.configservice.userProfile) {
|
|
448
|
+
req = {
|
|
449
|
+
request: {
|
|
450
|
+
userId: this.configservice.userProfile.userId || '',
|
|
451
|
+
contents: [
|
|
452
|
+
{
|
|
453
|
+
contentId,
|
|
454
|
+
// batchId,
|
|
455
|
+
status: this.getStatus(request.current, request.max_size, request.mime_type),
|
|
456
|
+
// courseId: collectionId,
|
|
457
|
+
lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
|
|
458
|
+
progressdetails: {
|
|
459
|
+
max_size: request.max_size,
|
|
460
|
+
current: request.current,
|
|
461
|
+
mimeType: request.mime_type,
|
|
462
|
+
},
|
|
463
|
+
completionPercentage: this.calculatePercent(request.current, request.max_size, request.mime_type),
|
|
464
|
+
},
|
|
465
|
+
],
|
|
466
|
+
},
|
|
467
|
+
};
|
|
468
|
+
// if (this.configservice.cstoken !== '') {
|
|
469
|
+
// const headers = new HttpHeaders()
|
|
470
|
+
// .set('cstoken', this.configservice.cstoken)
|
|
471
|
+
// this.http
|
|
472
|
+
// .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, { headers } , req)
|
|
473
|
+
// .subscribe(noop, noop)
|
|
474
|
+
// } else {
|
|
475
|
+
// this.http
|
|
476
|
+
// .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
|
|
477
|
+
// .subscribe(noop, noop)
|
|
478
|
+
// }
|
|
479
|
+
// this.http
|
|
480
|
+
// .patch(`${this.API_ENDPOINTS.PROGRESS_UPDATE}/${contentId}`, req)
|
|
481
|
+
// .subscribe(noop, noop)
|
|
482
|
+
//const contentIdNew= req.request.contents[0].contentId
|
|
483
|
+
// const updatedCompletionPercentage = req.request.contents[0].completionPercentage
|
|
484
|
+
// const updatedStatus = req.request.contents[0].status
|
|
485
|
+
// // Clone the inner object and update
|
|
486
|
+
// const existingContent = this.tocSvc.hashmap[contentIdNew] || {}
|
|
487
|
+
// this.tocSvc.hashmap = {
|
|
488
|
+
// ...this.tocSvc.hashmap,
|
|
489
|
+
// [contentIdNew]: {
|
|
490
|
+
// ...existingContent,
|
|
491
|
+
// completionPercentage: updatedCompletionPercentage,
|
|
492
|
+
// completionStatus: updatedStatus
|
|
493
|
+
// }
|
|
494
|
+
// }
|
|
495
|
+
// console.log('req', JSON.stringify(req))
|
|
496
|
+
// console.log('req', req)
|
|
497
|
+
const resourceStatus = this.getPreAssessmentResourceStatus(contentId);
|
|
498
|
+
if (resourceStatus < 2) {
|
|
499
|
+
this.http
|
|
500
|
+
.patch(`${this.API_ENDPOINTS.PRE_ASSESSMENT_STATE_UPDATE}`, req)
|
|
501
|
+
.subscribe(noop, noop);
|
|
502
|
+
}
|
|
503
|
+
if (this.tocSvc.hashmap[contentId] &&
|
|
504
|
+
(!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
|
|
505
|
+
this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
|
|
506
|
+
this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
|
|
507
|
+
this.tocSvc.hashmap[contentId]['parent'] = req.request.contents[0].courseId;
|
|
508
|
+
this.tocSvc.hashmap[contentId]['progress'] = req.request.contents[0].progressdetails;
|
|
509
|
+
this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
|
|
510
|
+
// Notify UI components about hashmap changes
|
|
511
|
+
this.tocSvc.hashmapUpdated.next(this.tocSvc.hashmap);
|
|
512
|
+
// Trigger milestone lock recomputation for Learning Pathways
|
|
513
|
+
if (this.tocSvc.triggerMilestoneLockUpdate) {
|
|
514
|
+
this.tocSvc.triggerMilestoneLockUpdate();
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
// console.log('Updated hashmap:', this.tocSvc.hashmap)
|
|
518
|
+
// console.log('this.tocSvc.hashmap---', this.tocSvc.hashmap)
|
|
519
|
+
}
|
|
520
|
+
else {
|
|
521
|
+
req = {};
|
|
522
|
+
// do nothing
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
realTimeProgressUpdateForPreAssessmentQuiz(contentId, status, mimeType) {
|
|
526
|
+
let req;
|
|
527
|
+
if (this.configservice.userProfile) {
|
|
528
|
+
req = {
|
|
529
|
+
request: {
|
|
530
|
+
//userId: this.configservice.userProfile.userId || '',
|
|
531
|
+
contents: [
|
|
532
|
+
{
|
|
533
|
+
contentId,
|
|
534
|
+
// batchId,
|
|
535
|
+
status: status || 2,
|
|
536
|
+
// courseId: collectionId,
|
|
537
|
+
lastAccessTime: dayjs(new Date()).format('YYYY-MM-DD HH:mm:ss:SSSZZ'),
|
|
538
|
+
completionPercentage: status === 2 ? 100.0 : 0,
|
|
539
|
+
progressdetails: {
|
|
540
|
+
"mimeType": mimeType || "application/vnd.sunbird.questionset"
|
|
541
|
+
},
|
|
542
|
+
},
|
|
543
|
+
],
|
|
544
|
+
},
|
|
545
|
+
};
|
|
546
|
+
const resourceStatus = this.getPreAssessmentResourceStatus(contentId);
|
|
547
|
+
if (resourceStatus < 2) {
|
|
548
|
+
this.http
|
|
549
|
+
.patch(`${this.API_ENDPOINTS.PRE_ASSESSMENT_STATE_UPDATE}`, req)
|
|
550
|
+
.subscribe(noop, noop);
|
|
551
|
+
}
|
|
552
|
+
if (this.tocSvc.hashmap && this.tocSvc.hashmap[contentId] && req.request.contents[0]) {
|
|
553
|
+
if (this.tocSvc.hashmap[contentId] &&
|
|
554
|
+
(!this.tocSvc.hashmap[contentId]['completionStatus'] || this.tocSvc.hashmap[contentId]['completionStatus'] < 2)) {
|
|
555
|
+
this.tocSvc.hashmap[contentId]['completionPercentage'] = req.request.contents[0].completionPercentage;
|
|
556
|
+
this.tocSvc.hashmap[contentId]['completionStatus'] = req.request.contents[0].status;
|
|
557
|
+
this.tocSvc.hashmap = { ...this.tocSvc.hashmap };
|
|
558
|
+
// Notify UI components about hashmap changes
|
|
559
|
+
this.tocSvc.hashmapUpdated.next(this.tocSvc.hashmap);
|
|
560
|
+
// Trigger milestone lock recomputation for Learning Pathways
|
|
561
|
+
if (this.tocSvc.triggerMilestoneLockUpdate) {
|
|
562
|
+
this.tocSvc.triggerMilestoneLockUpdate();
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
}
|
|
567
|
+
else {
|
|
568
|
+
req = {};
|
|
569
|
+
// do nothing
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
getPreAssessmentResourceStatus(resourceId) {
|
|
573
|
+
if (this.tocSvc && this.tocSvc.hashmap && this.tocSvc.hashmap[resourceId]) {
|
|
574
|
+
return this.tocSvc.hashmap[resourceId]['completionStatus'] || 1;
|
|
575
|
+
}
|
|
576
|
+
return 1;
|
|
577
|
+
}
|
|
578
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, deps: [{ token: i1.HttpClient }, { token: i2.ConfigurationsService }, { token: i3.WidgetContentService }, { token: i4.AppTocService }, { token: i5.WidgetUserServiceLib }, { token: i5.ContentLanguageService }, { token: i2.DomainConfService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
579
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, providedIn: 'root' }); }
|
|
580
|
+
}
|
|
581
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ViewerUtilService, decorators: [{
|
|
582
|
+
type: Injectable,
|
|
583
|
+
args: [{
|
|
584
|
+
providedIn: 'root',
|
|
585
|
+
}]
|
|
586
|
+
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ConfigurationsService }, { type: i3.WidgetContentService }, { type: i4.AppTocService }, { type: i5.WidgetUserServiceLib }, { type: i5.ContentLanguageService }, { type: i2.DomainConfService }, { type: undefined, decorators: [{
|
|
587
|
+
type: Inject,
|
|
588
|
+
args: ['environment']
|
|
589
|
+
}] }]; } });
|
|
590
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlld2VyLXV0aWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9zZXJ2aWNlcy92aWV3ZXItdXRpbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUVsRCxPQUFPLEVBQUUsSUFBSSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNoRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7Ozs7Ozs7QUFRekIsTUFBTSxPQUFPLGlCQUFpQjtJQW9CNUIsWUFDVSxJQUFnQixFQUNoQixhQUFvQyxFQUNwQyxVQUFnQyxFQUNoQyxNQUFxQixFQUNyQixPQUE2QixFQUM3QixjQUFzQyxFQUN0QyxhQUFnQyxFQUNULFdBQWdCO1FBUHZDLFNBQUksR0FBSixJQUFJLENBQVk7UUFDaEIsa0JBQWEsR0FBYixhQUFhLENBQXVCO1FBQ3BDLGVBQVUsR0FBVixVQUFVLENBQXNCO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsWUFBTyxHQUFQLE9BQU8sQ0FBc0I7UUFDN0IsbUJBQWMsR0FBZCxjQUFjLENBQXdCO1FBQ3RDLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUNULGdCQUFXLEdBQVgsV0FBVyxDQUFLO1FBM0JqRCxrQkFBYSxHQUFHO1lBQ2QsV0FBVyxFQUFFLHNDQUFzQztZQUNuRCxzRUFBc0U7WUFDdEUsZUFBZSxFQUFFLGtDQUFrQztZQUNuRCxrQkFBa0IsRUFBRSxxQ0FBcUM7WUFDekQsYUFBYSxFQUFFLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQywrQ0FBK0MsTUFBTSxFQUFFO1lBQzFGLFdBQVcsRUFBRSwwQ0FBMEM7WUFDdkQsdUZBQXVGO1lBQ3ZG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O1lBQ1IsYUFBYTtTQUNkO0lBQ0gsQ0FBQztJQUVELDhCQUE4QixDQUFDLFVBQWtCO1FBQy9DLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUN6RSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFBO1NBQ2hFO1FBQ0QsT0FBTyxDQUFDLENBQUE7SUFDVixDQUFDOytHQTVtQlUsaUJBQWlCLDZQQTRCbEIsYUFBYTttSEE1QlosaUJBQWlCLGNBRmhCLE1BQU07OzRGQUVQLGlCQUFpQjtrQkFIN0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQTZCSSxNQUFNOzJCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb25maWd1cmF0aW9uc1NlcnZpY2UsIERvbWFpbkNvbmZTZXJ2aWNlIH0gZnJvbSAnQHN1bmJpcmQtY2IvdXRpbHMtdjInXHJcbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5tb2RlbCdcclxuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xyXG5pbXBvcnQgeyBub29wLCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcydcclxuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xyXG5pbXBvcnQgeyBBcHBUb2NTZXJ2aWNlIH0gZnJvbSAnLi9hcHAtdG9jLnNlcnZpY2UnXHJcbmltcG9ydCB7IENvbnRlbnRMYW5ndWFnZVNlcnZpY2UsIFdpZGdldFVzZXJTZXJ2aWNlTGliIH0gZnJvbSAnQHN1bmJpcmQtY2IvY29uc3VtcHRpb24nXHJcbmltcG9ydCB7IFdpZGdldENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vX2NvbGxlY3Rpb24tYXBpJ1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFZpZXdlclV0aWxTZXJ2aWNlIHtcclxuICBBUElfRU5EUE9JTlRTID0ge1xyXG4gICAgc2V0UzNDb29raWU6IGAvYXBpcy92OC9wcm90ZWN0ZWQvY29udGVudC9zZXRDb29raWVgLFxyXG4gICAgLy8gUFJPR1JFU1NfVVBEQVRFOiBgL2FwaXMvcHJvdGVjdGVkL3Y4L3VzZXIvcmVhbFRpbWVQcm9ncmVzcy91cGRhdGVgLFxyXG4gICAgUFJPR1JFU1NfVVBEQVRFOiBgL2FwaXMvcHJveGllcy92OC9jb250ZW50LXByb2dyZXNgLFxyXG4gICAgQVNTRVNTTUVOVF9TRUNUSU9OOiBgL2FwaXMvcHJveGllcy92OC9hc3Nlc3NtZW50L3Y1L3JlYWRgLFxyXG4gICAgR0VUX0ZPUk1fQllJRDogKGZvcm1JZDogc3RyaW5nKSA9PiBgYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YyL2dldEZvcm1CeUlkP2Zvcm1JZD0ke2Zvcm1JZH1gLFxyXG4gICAgU1VCTUlUX0ZPUk06IGAvYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YyL3NhdmVGb3JtU3VibWl0YCxcclxuICAgIC8vIEdFVF9GT1JNX0JZSUQ6IChmb3JtSWQ6IHN0cmluZykgPT4gYGFwaXMvcHJveGllcy92OC9mb3Jtcy9nZXRGb3JtQnlJZD9pZD0ke2Zvcm1JZH1gLFxyXG4gICAgLy8gU1VCTUlUX0ZPUk06IGAvYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YxL3NhdmVGb3JtU3VibWl0YCxcclxuICAgIFBSRV9BU1NFU1NNRU5UX1NUQVRFX1VQREFURTogYC9hcGlzL3Byb3hpZXMvdjgvY29udGVudC92Mi9zdGF0ZS91cGRhdGVgXHJcblxyXG4gIH1cclxuICBkb3dubG9hZFJlZ2V4ID0gbmV3IFJlZ0V4cChgKC9jb250ZW50LXN0b3JlLy4qPykoXFxcXFxcKT9cXFxcXFxcXD9bJ1wiXSlgLCAnZ20nKVxyXG4gIGF1dGhvcmluZ0Jhc2UgPSAnL2FwaXMvYXV0aENvbnRlbnQvJ1xyXG4gIG1hcmtBc0NvbXBsZXRlU3ViamVjdCA9IG5ldyBTdWJqZWN0KClcclxuICBhdXRvUGxheU5leHRWaWRlbyA9IG5ldyBTdWJqZWN0KClcclxuICBhdXRvUGxheU5leHRBdWRpbyA9IG5ldyBTdWJqZWN0KClcclxuICBmb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9wdWJsaWMvJykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJyZwcmV2aWV3PXRydWUnKVxyXG4gIHB1YmxpY1VzZXJEZXRhaWxzOiBhbnkgPSB7fVxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LFxyXG4gICAgcHJpdmF0ZSBjb25maWdzZXJ2aWNlOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvbnRlbnRTdmM6IFdpZGdldENvbnRlbnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIHVzZXJTdmM6IFdpZGdldFVzZXJTZXJ2aWNlTGliLFxyXG4gICAgcHJpdmF0ZSBjb250ZW50TGFuZ1N2YzogQ29udGVudExhbmd1YWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgZG9tYWluQ29uZlN2YzogRG9tYWluQ29uZlNlcnZpY2UsXHJcbiAgICBASW5qZWN0KCdlbnZpcm9ubWVudCcpIHByaXZhdGUgZW52aXJvbm1lbnQ6IGFueVxyXG4gICkgeyB9XHJcblxyXG4gIGFzeW5jIGZldGNoTWFuaWZlc3RGaWxlKHVybDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnNldFMzQ29va2llKHVybClcclxuICAgIGNvbnN0IG1hbmlmZXN0RmlsZSA9IGF3YWl0IHRoaXMuaHR0cFxyXG4gICAgICAuZ2V0PGFueT4odXJsKVxyXG4gICAgICAudG9Qcm9taXNlKClcclxuICAgICAgLmNhdGNoKChfZXJyOiBhbnkpID0+IHsgfSlcclxuICAgIHJldHVybiBtYW5pZmVzdEZpbGVcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgc2V0UzNDb29raWUoX2NvbnRlbnRJZDogc3RyaW5nKSB7XHJcbiAgICAvLyBhd2FpdCB0aGlzLmh0dHBcclxuICAgIC8vICAgLnBvc3QodGhpcy5BUElfRU5EUE9JTlRTLnNldFMzQ29va2llLCB7IGNvbnRlbnRJZCB9KVxyXG4gICAgLy8gICAudG9Qcm9taXNlKClcclxuICAgIC8vICAgLmNhdGNoKChfZXJyOiBhbnkpID0+IHsgfSlcclxuICAgIHJldHVyblxyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlUGVyY2VudChjdXJyZW50OiBzdHJpbmdbXSwgbWF4OiBudW1iZXIsIG1pbWVUeXBlPzogc3RyaW5nKTogbnVtYmVyIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHRlbXAgPSBbLi4uY3VycmVudF1cclxuICAgICAgaWYgKHRlbXAgJiYgdGVtcC5sZW5ndGggJiYgbWF4KSB7XHJcbiAgICAgICAgY29uc3QgbGF0ZXN0ID0gcGFyc2VGbG9hdCh0ZW1wLnBvcCgpIHx8ICcwJylcclxuICAgICAgICBjb25zdCBwZXJjZW50TWlsaXMgPSAobGF0ZXN0IC8gbWF4KSAqIDEwMFxyXG4gICAgICAgIGxldCBwZXJjZW50ID0gcGFyc2VGbG9hdChwZXJjZW50TWlsaXMudG9GaXhlZCgyKSlcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVA0IHx8XHJcbiAgICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTTNVOCB8fFxyXG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk1QMyB8fFxyXG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk00QSB8fFxyXG4gICAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLllPVVRVQkUgfHxcclxuICAgICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5TVVJWRVlcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGlmIChwZXJjZW50IDw9IDUpIHtcclxuICAgICAgICAgICAgLy8gaWYgcGVyY2VudGFnZSBpcyBsZXNzIHRoYW4gNSUgbWFrZSBpdCAwXHJcbiAgICAgICAgICAgIHBlcmNlbnQgPSAwXHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPj0gOTUpIHtcclxuICAgICAgICAgICAgLy8gaWYgcGVyY2VudGFnZSBpcyBncmVhdGVyIHRoYW4gOTUlIG1ha2UgaXQgMTAwXHJcbiAgICAgICAgICAgIHBlcmNlbnQgPSAxMDBcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHBlcmNlbnRcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMFxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5sb2coJ0Vycm9yIGluIGNhbGN1bGF0aW5nIHBlcmNlbnRhZ2UnLCBlKVxyXG4gICAgICByZXR1cm4gMFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0U3RhdHVzKGN1cnJlbnQ6IHN0cmluZ1tdLCBtYXg6IG51bWJlciwgbWltZVR5cGU/OiBzdHJpbmcpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSB0aGlzLmNhbGN1bGF0ZVBlcmNlbnQoY3VycmVudCwgbWF4LCBtaW1lVHlwZSlcclxuICAgICAgLy8gZm9yIHZpZGVvcyBhbmQgYXVkaW9zXHJcbiAgICAgIGlmIChcclxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVA0IHx8XHJcbiAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk0zVTggfHxcclxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuTVAzIHx8XHJcbiAgICAgICAgbWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLk00QSB8fFxyXG4gICAgICAgIG1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5TVVJWRVkgfHxcclxuICAgICAgICBtaW1lVHlwZSA9PT0gTnNDb250ZW50LkVNaW1lVHlwZXMuUERGXHJcbiAgICAgICkge1xyXG4gICAgICAgIC8vIGlmIHBlcmNlbnRhZ2UgaXMgbGVzcyB0aGFuIDUlIHRoZW4gbWFrZSBzdGF0dXMgc3RhcnRlZFxyXG4gICAgICAgIGlmIChNYXRoLmNlaWwocGVyY2VudGFnZSkgPD0gNSkge1xyXG4gICAgICAgICAgcmV0dXJuIDFcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gaWYgcGVyY2VudGFnZSBpcyBncmVhdGVyIHRoYW4gOTUlIHRoZW4gbWFrZSBzdGF0dXMgY29tcGxldGVcclxuICAgICAgICBpZiAoTWF0aC5jZWlsKHBlcmNlbnRhZ2UpID49IDk1KSB7XHJcbiAgICAgICAgICByZXR1cm4gMlxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoTWF0aC5jZWlsKHBlcmNlbnRhZ2UpID49IDEwMCkge1xyXG4gICAgICAgICAgcmV0dXJuIDJcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIDFcclxuICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXHJcbiAgICAgIGNvbnNvbGUubG9nKCdFcnJvciBpbiBnZXR0aW5nIGNvbXBsZXRpb24gc3RhdHVzJywgZSlcclxuICAgICAgcmV0dXJuIDFcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlYWxUaW1lUHJvZ3Jlc3NVcGRhdGUoY29udGVudElkOiBzdHJpbmcsIHJlcXVlc3Q6IGFueSwgY29sbGVjdGlvbklkPzogc3RyaW5nLCBiYXRjaElkPzogc3RyaW5nKSB7XHJcbiAgICBsZXQgcmVxOiBhbnlcclxuICAgIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUpIHtcclxuICAgICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmdldFJlc291cmNlQ29udGVudExhbmd1YWdlKGNvbnRlbnRJZClcclxuICAgICAgcmVxID0ge1xyXG4gICAgICAgIHJlcXVlc3Q6IHtcclxuICAgICAgICAgIHVzZXJJZDogdGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJyxcclxuICAgICAgICAgIGNvbnRlbnRzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBjb250ZW50SWQsXHJcbiAgICAgICAgICAgICAgYmF0Y2hJZCxcclxuICAgICAgICAgICAgICBsYW5ndWFnZSxcclxuICAgICAgICAgICAgICBzdGF0dXM6IHRoaXMuZ2V0U3RhdHVzKHJlcXVlc3QuY3VycmVudCwgcmVxdWVzdC5tYXhfc2l6ZSwgcmVxdWVzdC5taW1lX3R5cGUpLFxyXG4gICAgICAgICAgICAgIGNvdXJzZUlkOiBjb2xsZWN0aW9uSWQsXHJcbiAgICAgICAgICAgICAgbGFzdEFjY2Vzc1RpbWU6IGRheWpzKG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzczpTU1NaWicpLFxyXG4gICAgICAgICAgICAgIHByb2dyZXNzZGV0YWlsczoge1xyXG4gICAgICAgICAgICAgICAgbWF4X3NpemU6IHJlcXVlc3QubWF4X3NpemUsXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50OiByZXF1ZXN0LmN1cnJlbnQsXHJcbiAgICAgICAgICAgICAgICBtaW1lVHlwZTogcmVxdWVzdC5taW1lX3R5cGUsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogdGhpcy5jYWxjdWxhdGVQZXJjZW50KHJlcXVlc3QuY3VycmVudCwgcmVxdWVzdC5tYXhfc2l6ZSwgcmVxdWVzdC5taW1lX3R5cGUpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9LFxyXG4gICAgICB9XHJcbiAgICAgIC8vIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UuY3N0b2tlbiAhPT0gJycpIHtcclxuICAgICAgLy8gICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKClcclxuICAgICAgLy8gICAuc2V0KCdjc3Rva2VuJywgdGhpcy5jb25maWdzZXJ2aWNlLmNzdG9rZW4pXHJcblxyXG4gICAgICAvLyAgIHRoaXMuaHR0cFxyXG4gICAgICAvLyAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCB7IGhlYWRlcnMgfSAsIHJlcSlcclxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgIC8vICAgdGhpcy5odHRwXHJcbiAgICAgIC8vICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcclxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIC8vIH1cclxuICAgICAgdGhpcy5odHRwXHJcbiAgICAgICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcclxuICAgICAgICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIGlmICh0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF0gJiZcclxuICAgICAgICAoIXRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIHx8IHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddIDwgMikpIHtcclxuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5jb21wbGV0aW9uUGVyY2VudGFnZVxyXG4gICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uc3RhdHVzXHJcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcCA9IHsgLi4udGhpcy50b2NTdmMuaGFzaG1hcCB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gTm90aWZ5IFVJIGNvbXBvbmVudHMgYWJvdXQgaGFzaG1hcCBjaGFuZ2VzXHJcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFVwZGF0ZWQubmV4dCh0aGlzLnRvY1N2Yy5oYXNobWFwKVxyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIFRyaWdnZXIgbWlsZXN0b25lIGxvY2sgcmVjb21wdXRhdGlvbiBmb3IgTGVhcm5pbmcgUGF0aHdheXNcclxuICAgICAgICB0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSgpXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJlcSA9IHt9XHJcbiAgICAgIC8vIGRvIG5vdGhpbmdcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEJhdGNoSWRBbmRDb3Vyc2VJZChjb3Vyc2VJZDogc3RyaW5nLCBiYXRjaElkOiBzdHJpbmcsIHJlc291cmNlSWQ6IHN0cmluZykge1xyXG4gICAgY29uc3QgdGVtcERhdGEgPSB7XHJcbiAgICAgIGNvdXJzZUlkLFxyXG4gICAgICBiYXRjaElkLFxyXG4gICAgfVxyXG4gICAgY29uc3QgdGVtcENvbnRlbnREYXRhID0gdGhpcy5jb250ZW50U3ZjLmN1cnJlbnRNZXRhRGF0YVxyXG4gICAgY29uc3QgdGVtcENvbnRlbnRSZWFkRGF0YSA9IHRoaXMuY29udGVudFN2Yy5jdXJyZW50Q29udGVudFJlYWRNZXRhRGF0YVxyXG4gICAgY29uc3QgZW5yb2xsbWVudExpc3QgPSB0aGlzLmNvbnRlbnRTdmMuY3VycmVudEJhdGNoRW5yb2xsbWVudExpc3RcclxuICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XHJcbiAgICAgIGlmICh0ZW1wQ29udGVudERhdGEuY291cnNlQ2F0ZWdvcnkgPT09ICdMZWFybmluZyBQYXRod2F5Jykge1xyXG4gICAgICAgIC8vIEZpbmQgdGhlIGNvdXJzZSB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiByZXNvdXJjZSBJRFxyXG4gICAgICAgIGNvbnN0IGZvdW5kQ291cnNlID0gdGhpcy5maW5kQ291cnNlQ29udGFpbmluZ1Jlc291cmNlKHRlbXBDb250ZW50RGF0YSwgcmVzb3VyY2VJZClcclxuXHJcbiAgICAgICAgaWYgKGZvdW5kQ291cnNlKSB7XHJcbiAgICAgICAgICAvLyBBbHdheXMgdXBkYXRlIGNvdXJzZUlkIGlmIGNvdXJzZSBpcyBmb3VuZFxyXG4gICAgICAgICAgdGVtcERhdGEuY291cnNlSWQgPSBmb3VuZENvdXJzZS5pZGVudGlmaWVyXHJcblxyXG4gICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgYmF0Y2ggSUQgZnJvbSBlbnJvbGxtZW50IGRhdGEgZm9yIHRoZSBmb3VuZCBjb3Vyc2VcclxuICAgICAgICAgIGlmIChmb3VuZENvdXJzZS5pZGVudGlmaWVyKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVucm9sbG1lbnQgPSBlbnJvbGxtZW50TGlzdC5maW5kKFxyXG4gICAgICAgICAgICAgIChjb3Vyc2U6IGFueSkgPT4gY291cnNlLmNvbGxlY3Rpb25JZCA9PT0gZm91bmRDb3Vyc2UuaWRlbnRpZmllclxyXG4gICAgICAgICAgICApXHJcblxyXG4gICAgICAgICAgICBpZiAoZW5yb2xsbWVudCAmJiBlbnJvbGxtZW50LmJhdGNoSWQpIHtcclxuICAgICAgICAgICAgICB0ZW1wRGF0YS5iYXRjaElkID0gZW5yb2xsbWVudC5iYXRjaElkXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAodGVtcENvbnRlbnREYXRhICYmIHRlbXBDb250ZW50UmVhZERhdGEuY3VtdWxhdGl2ZVRyYWNraW5nICYmXHJcbiAgICAgICAgKHRlbXBDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gfHxcclxuICAgICAgICAgIHRlbXBDb250ZW50RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTVxyXG4gICAgICAgICAgfHwgdGVtcENvbnRlbnREYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXHJcbiAgICAgICAgKVxyXG4gICAgICApIHtcclxuICAgICAgICB0ZW1wQ29udGVudERhdGEuY2hpbGRyZW4uZm9yRWFjaChhc3luYyAoY2hpbGRMaXN0OiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IHtcclxuICAgICAgICAgIGlmIChjaGlsZExpc3QucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcclxuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgICAgICAgICAgY29uc3QgY291cnNlRW5yb2xsbWVudExpc3QgPSBlbnJvbGxtZW50TGlzdCAmJiBlbnJvbGxtZW50TGlzdC5maWx0ZXIoKHY6IE5zQ29udGVudC5JQ291cnNlKSA9PiB2LmNvbnRlbnRJZCA9PT0gY2hpbGRMaXN0LmlkZW50aWZpZXIpXHJcbiAgICAgICAgICAgIGlmIChjaGlsZExpc3QuY2hpbGROb2RlcyAmJiBjaGlsZExpc3QuY2hpbGROb2Rlcy5pbmRleE9mKHJlc291cmNlSWQpICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgIGlmIChjb3Vyc2VFbnJvbGxtZW50TGlzdCAmJiBjb3Vyc2VFbnJvbGxtZW50TGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0ZW1wRGF0YS5iYXRjaElkID0gY291cnNlRW5yb2xsbWVudExpc3RbY291cnNlRW5yb2xsbWVudExpc3QubGVuZ3RoIC0gMV0uYmF0Y2guYmF0Y2hJZFxyXG4gICAgICAgICAgICAgICAgdGVtcERhdGEuY291cnNlSWQgPSBjaGlsZExpc3QuaWRlbnRpZmllclxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmNoZWNrRm9yQ291cnNlRW5yb2xsbWVudChjaGlsZExpc3QsIHJlc291cmNlSWQsIGVucm9sbG1lbnRMaXN0LCB0ZW1wRGF0YSlcclxuICAgICAgICAgICAgICAgIHRlbXBEYXRhLmNvdXJzZUlkID0gZGF0YS5jb3Vyc2VJZFxyXG4gICAgICAgICAgICAgICAgdGVtcERhdGEuYmF0Y2hJZCA9IGRhdGEuYmF0Y2hJZFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIGlmICh0ZW1wQ29udGVudERhdGEucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0pIHtcclxuICAgICAgICAgICAgaWYgKHRlbXBEYXRhLmNvdXJzZUlkID09PSBjb3Vyc2VJZCkge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGJQRW5yb2xsbWVudExpc3QgPSBlbnJvbGxtZW50TGlzdC5maWx0ZXIoKHY6IE5zQ29udGVudC5JQ291cnNlKSA9PiB2LmNvbnRlbnRJZCA9PT0gdGVtcENvbnRlbnREYXRhLmlkZW50aWZpZXIpXHJcbiAgICAgICAgICAgICAgaWYgKHRlbXBDb250ZW50RGF0YS5jaGlsZE5vZGVzICYmIHRlbXBDb250ZW50RGF0YS5jaGlsZE5vZGVzLmluZGV4T2YocmVzb3VyY2VJZCkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYlBFbnJvbGxtZW50TGlzdC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgIHRlbXBEYXRhLmJhdGNoSWQgPSBiUEVucm9sbG1lbnRMaXN0W2JQRW5yb2xsbWVudExpc3QubGVuZ3RoIC0gMV0uYmF0Y2guYmF0Y2hJZFxyXG4gICAgICAgICAgICAgICAgICB0ZW1wRGF0YS5jb3Vyc2VJZCA9IHRlbXBDb250ZW50RGF0YS5pZGVudGlmaWVyXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRlbXBEYXRhXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWN1cnNpdmVseSBzZWFyY2hlcyBmb3IgYSByZXNvdXJjZSBJRCBpbiBhIGNvbnRlbnQncyBjaGlsZHJlbiBoaWVyYXJjaHlcclxuICAgKiBAcGFyYW0gY29udGVudCBUaGUgY29udGVudCBvYmplY3QgdG8gc2VhcmNoIGluXHJcbiAgICogQHBhcmFtIHJlc291cmNlSWQgVGhlIHJlc291cmNlIElEIHRvIGZpbmRcclxuICAgKiBAcmV0dXJucyB0cnVlIGlmIHJlc291cmNlIGlzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2VcclxuICAgKi9cclxuICBwcml2YXRlIGZpbmRSZXNvdXJjZUluQ29udGVudChjb250ZW50OiBhbnksIHJlc291cmNlSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgLy8gQ2hlY2sgaWYgdGhpcyBjb250ZW50IGhhcyB0aGUgcmVzb3VyY2UgaW4gaXRzIGxlYWZOb2Rlc1xyXG4gICAgaWYgKGNvbnRlbnQubGVhZk5vZGVzICYmIEFycmF5LmlzQXJyYXkoY29udGVudC5sZWFmTm9kZXMpKSB7XHJcbiAgICAgIGlmIChjb250ZW50LmxlYWZOb2Rlcy5pbmRleE9mKHJlc291cmNlSWQpICE9PSAtMSkge1xyXG4gICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBDaGVjayBpZiB0aGlzIGNvbnRlbnQncyBpZGVudGlmaWVyIG1hdGNoZXMgdGhlIHJlc291cmNlIElEXHJcbiAgICBpZiAoY29udGVudC5pZGVudGlmaWVyID09PSByZXNvdXJjZUlkKSB7XHJcbiAgICAgIHJldHVybiB0cnVlXHJcbiAgICB9XHJcblxyXG4gICAgLy8gUmVjdXJzaXZlbHkgc2VhcmNoIGluIGNoaWxkcmVuXHJcbiAgICBpZiAoY29udGVudC5jaGlsZHJlbiAmJiBBcnJheS5pc0FycmF5KGNvbnRlbnQuY2hpbGRyZW4pKSB7XHJcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgY29udGVudC5jaGlsZHJlbikge1xyXG4gICAgICAgIGlmICh0aGlzLmZpbmRSZXNvdXJjZUluQ29udGVudChjaGlsZCwgcmVzb3VyY2VJZCkpIHtcclxuICAgICAgICAgIHJldHVybiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBGaW5kcyB0aGUgY291cnNlIHRoYXQgY29udGFpbnMgYSBnaXZlbiByZXNvdXJjZSBJRCBpbiBhIExlYXJuaW5nIFBhdGh3YXlcclxuICAgKiBAcGFyYW0gbGVhcm5pbmdQYXRod2F5Q29udGVudCBUaGUgTGVhcm5pbmcgUGF0aHdheSBjb250ZW50IGRhdGFcclxuICAgKiBAcGFyYW0gcmVzb3VyY2VJZCBUaGUgcmVzb3VyY2UgSUQgdG8gZmluZFxyXG4gICAqIEByZXR1cm5zIFRoZSBjb3Vyc2Ugb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHJlc291cmNlLCBvciBudWxsIGlmIG5vdCBmb3VuZFxyXG4gICAqL1xyXG4gIGZpbmRDb3Vyc2VDb250YWluaW5nUmVzb3VyY2UobGVhcm5pbmdQYXRod2F5Q29udGVudDogYW55LCByZXNvdXJjZUlkOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgLy8gQ2hlY2sgaWYgbWlsZXN0b25lc192MSBleGlzdHNcclxuICAgIGlmICghbGVhcm5pbmdQYXRod2F5Q29udGVudC5taWxlc3RvbmVzX3YxIHx8ICFBcnJheS5pc0FycmF5KGxlYXJuaW5nUGF0aHdheUNvbnRlbnQubWlsZXN0b25lc192MSkpIHtcclxuICAgICAgcmV0dXJuIG51bGxcclxuICAgIH1cclxuXHJcbiAgICAvLyBMb29wIHRocm91Z2ggZWFjaCBtaWxlc3RvbmVcclxuICAgIGZvciAoY29uc3QgbWlsZXN0b25lIG9mIGxlYXJuaW5nUGF0aHdheUNvbnRlbnQubWlsZXN0b25lc192MSkge1xyXG4gICAgICAvLyBDaGVjayBpZiBtaWxlc3RvbmUgaGFzIGNvdXJzZXNcclxuICAgICAgaWYgKG1pbGVzdG9uZS5jb3Vyc2VzICYmIEFycmF5LmlzQXJyYXkobWlsZXN0b25lLmNvdXJzZXMpKSB7XHJcbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGVhY2ggY291cnNlIGluIHRoZSBtaWxlc3RvbmVcclxuICAgICAgICBmb3IgKGNvbnN0IGNvdXJzZSBvZiBtaWxlc3RvbmUuY291cnNlcykge1xyXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBjb3Vyc2UgY29udGFpbnMgdGhlIHJlc291cmNlXHJcbiAgICAgICAgICBpZiAodGhpcy5maW5kUmVzb3VyY2VJbkNvbnRlbnQoY291cnNlLCByZXNvdXJjZUlkKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gY291cnNlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcblxyXG4gIGdldFJlc291cmNlQ29udGVudExhbmd1YWdlKHJlc291cmNlSWQ6IHN0cmluZykge1xyXG5cclxuICAgIGxldCB0ZW1wTGFuZ3VhZ2U6IGFueSA9ICdlbmdsaXNoJ1xyXG4gICAgbGV0IGxhbmd1YWdlRm91bmQgPSBmYWxzZVxyXG4gICAgY29uc3QgdGVtcENvbnRlbnREYXRhID0gdGhpcy5jb250ZW50U3ZjLmN1cnJlbnRNZXRhRGF0YVxyXG4gICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcclxuICAgICAgdGVtcENvbnRlbnREYXRhLmNoaWxkcmVuPy5mb3JFYWNoKGFzeW5jIChjaGlsZExpc3Q6IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xyXG4gICAgICAgIGlmIChjaGlsZExpc3QucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcclxuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgICAgICBpZiAoY2hpbGRMaXN0LmxlYWZOb2RlcyAmJiBjaGlsZExpc3QubGVhZk5vZGVzLmluZGV4T2YocmVzb3VyY2VJZCkgIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHRlbXBMYW5ndWFnZSA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0Q29udGVudExhbmd1YWdlKGNoaWxkTGlzdClcclxuICAgICAgICAgICAgbGFuZ3VhZ2VGb3VuZCA9IHRydWVcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgKVxyXG4gICAgICBpZiAoIWxhbmd1YWdlRm91bmQpIHtcclxuICAgICAgICBpZiAodGVtcENvbnRlbnREYXRhLmxlYWZOb2RlcyAmJiB0ZW1wQ29udGVudERhdGEubGVhZk5vZGVzLmluZGV4T2YocmVzb3VyY2VJZCkgIT09IC0xKSB7XHJcbiAgICAgICAgICB0ZW1wTGFuZ3VhZ2UgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldENvbnRlbnRMYW5ndWFnZSh0ZW1wQ29udGVudERhdGEpXHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcExhbmd1YWdlXHJcbiAgfVxyXG5cclxuICBhc3luYyBjaGVja0ZvckNvdXJzZUVucm9sbG1lbnQoY2hpbGRMaXN0OiBOc0NvbnRlbnQuSUNvbnRlbnQsIF9yZXNvdXJjZUlkOiBzdHJpbmcsIF9lbnJvbGxtZW50TGlzdDogYW55LCBfdGVtcERhdGE6IGFueSkge1xyXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcclxuICAgIGNvbnN0IGNvdXJzZURhdGE6IGFueSA9IGF3YWl0IHRoaXMuY29udGVudFN2Yy5hdXRvQXNzaWduQmF0Y2hBcGkoY2hpbGRMaXN0LmlkZW50aWZpZXIpLnRvUHJvbWlzZSgpLnRoZW4oYXN5bmMgKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpID0+IHtcclxuICAgICAgaWYgKGRhdGEpIHtcclxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxyXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IGF3YWl0IHRoaXMudXNlclN2Yy5mZXRjaEVucm9sbG1lbnREYXRhQnlDb250ZW50SWQodGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlPy51c2VySWQsIGNoaWxkTGlzdC5pZGVudGlmaWVyKS50b1Byb21pc2UoKS50aGVuKGFzeW5jIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHJlcyAmJiByZXMuY291cnNlcyAmJiByZXMuY291cnNlcy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHJlcy5jb3Vyc2VzXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gW3sgY291cnNlSWQ6IGNoaWxkTGlzdC5pZGVudGlmaWVyLCBiYXRjaElkOiAnJyB9XVxyXG5cclxuICAgICAgICB9KS5jYXRjaCgoX2VycjogYW55KSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gW3sgY291cnNlSWQ6IGNoaWxkTGlzdC5pZGVudGlmaWVyLCBiYXRjaElkOiAnJyB9XVxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy5jb250ZW50U3ZjLmN1cnJlbnRCYXRjaEVucm9sbG1lbnRMaXN0ID0gWy4uLnRoaXMuY29udGVudFN2Yy5jdXJyZW50QmF0Y2hFbnJvbGxtZW50TGlzdCwgLi4ucmVzcG9uc2VEYXRhXVxyXG4gICAgICAgIHJldHVybiB7IGNvdXJzZUlkOiBjaGlsZExpc3QuaWRlbnRpZmllciwgYmF0Y2hJZDogcmVzcG9uc2VEYXRhWzBdLmJhdGNoSWQgfVxyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoX2VycjogYW55KSA9PiB7XHJcbiAgICAgIHJldHVybiBbeyBjb3Vyc2VJZDogY2hpbGRMaXN0LmlkZW50aWZpZXIsIGJhdGNoSWQ6ICcnIH1dXHJcbiAgICB9KVxyXG4gICAgcmV0dXJuIGNvdXJzZURhdGFcclxuICB9XHJcblxyXG4gIHJlYWxUaW1lUHJvZ3Jlc3NVcGRhdGVRdWl6KGNvbnRlbnRJZDogc3RyaW5nLCBjb2xsZWN0aW9uSWQ/OiBzdHJpbmcsIGJhdGNoSWQ/OiBzdHJpbmcsIHN0YXR1cz86IG51bWJlcikge1xyXG4gICAgbGV0IHJlcTogYW55XHJcbiAgICBpZiAodGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlKSB7XHJcbiAgICAgIGNvbnN0IGxhbmd1YWdlID0gdGhpcy5nZXRSZXNvdXJjZUNvbnRlbnRMYW5ndWFnZShjb250ZW50SWQpXHJcbiAgICAgIHJlcSA9IHtcclxuICAgICAgICByZXF1ZXN0OiB7XHJcbiAgICAgICAgICB1c2VySWQ6IHRoaXMuY29uZmlnc2VydmljZS51c2VyUHJvZmlsZS51c2VySWQgfHwgJycsXHJcbiAgICAgICAgICBjb250ZW50czogW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgY29udGVudElkLFxyXG4gICAgICAgICAgICAgIGJhdGNoSWQsXHJcbiAgICAgICAgICAgICAgbGFuZ3VhZ2UsXHJcbiAgICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgfHwgMixcclxuICAgICAgICAgICAgICBjb3Vyc2VJZDogY29sbGVjdGlvbklkLFxyXG4gICAgICAgICAgICAgIGxhc3RBY2Nlc3NUaW1lOiBkYXlqcyhuZXcgRGF0ZSgpKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3M6U1NTWlonKSxcclxuICAgICAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogc3RhdHVzID09PSAyID8gMTAwIDogMCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5odHRwXHJcbiAgICAgICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcclxuICAgICAgICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIGlmICh0aGlzLnRvY1N2Yy5oYXNobWFwICYmIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJiByZXEucmVxdWVzdC5jb250ZW50c1swXSkge1xyXG4gICAgICAgIGlmICh0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF0gJiZcclxuICAgICAgICAgICghdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPCAyKSkge1xyXG4gICAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcclxuICAgICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uc3RhdHVzXHJcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgLy8gTm90aWZ5IFVJIGNvbXBvbmVudHMgYWJvdXQgaGFzaG1hcCBjaGFuZ2VzXHJcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwVXBkYXRlZC5uZXh0KHRoaXMudG9jU3ZjLmhhc2htYXApXHJcbiAgICAgICAgICBcclxuICAgICAgICAgIC8vIFRyaWdnZXIgbWlsZXN0b25lIGxvY2sgcmVjb21wdXRhdGlvbiBmb3IgTGVhcm5pbmcgUGF0aHdheXNcclxuICAgICAgICAgIGlmICh0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXEgPSB7fVxyXG4gICAgICAvLyBkbyBub3RoaW5nXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb250ZW50KGNvbnRlbnRJZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxOc0NvbnRlbnQuSUNvbnRlbnQ+IHtcclxuICAgIGNvbnN0IGZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnJnByZXZpZXc9dHJ1ZScpXHJcbiAgICBsZXQgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvcmVhZC8ke2NvbnRlbnRJZH1gXHJcbiAgICBpZiAoIWZvclByZXZpZXcpIHtcclxuICAgICAgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvcmVhZC8ke2NvbnRlbnRJZH1gXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ2VkaXRNb2RlPXRydWUnKSAmJiB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnX3JjJykpIHtcclxuICAgICAgICB1cmwgPSBgL2FwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9yZWFkLyR7Y29udGVudElkfWBcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB1cmwgPSBgL2FwaS9jb250ZW50L3YxL3JlYWQvJHtjb250ZW50SWR9YFxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnQ+KFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgIC8vIGAvYXBpcy9hdXRoQXBpL2FjdGlvbi9jb250ZW50L2hpZXJhcmNoeS8ke2NvbnRlbnRJZH0/cm9vdE9yZz0ke3RoaXMuY29uZmlnc2VydmljZS5yb290T3JnIHx8ICdpZ290J30mb3JnPSR7dGhpcy5jb25maWdzZXJ2aWNlLmFjdGl2ZU9yZyB8fCAnZG9wdCd9YCxcclxuICAgICAgdXJsXHJcbiAgICApXHJcbiAgfVxyXG5cclxuICBnZXRBdXRob3JpbmdVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHVybFxyXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXHJcbiAgICAgID8gYC9hcGlzL2F1dGhDb250ZW50LyR7dXJsLmluY2x1ZGVzKCcvY29udGVudC1zdG9yZS8nKSA/IG5ldyBVUkwodXJsKS5wYXRobmFtZS5zbGljZSgxKSA6IGVuY29kZVVSSUNvbXBvbmVudCh1cmwpfWBcclxuICAgICAgOiAnJ1xyXG4gIH1cclxuXHJcbiAgcmVnZXhEb3dubG9hZFJlcGxhY2UgPSAoX3N0ciA9ICcnLCBncm91cDE6IHN0cmluZywgZ3JvdXAyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xyXG4gICAgcmV0dXJuIGAke3RoaXMuYXV0aG9yaW5nQmFzZX0ke2VuY29kZVVSSUNvbXBvbmVudChncm91cDEpfSR7Z3JvdXAyfWBcclxuICB9XHJcblxyXG4gIHJlcGxhY2VUb0F1dGhVcmwoZGF0YTogYW55KTogYW55IHtcclxuICAgIHJldHVybiBKU09OLnBhcnNlKFxyXG4gICAgICBKU09OLnN0cmluZ2lmeShkYXRhKS5yZXBsYWNlKFxyXG4gICAgICAgIHRoaXMuZG93bmxvYWRSZWdleCxcclxuICAgICAgICB0aGlzLnJlZ2V4RG93bmxvYWRSZXBsYWNlLFxyXG4gICAgICApLFxyXG4gICAgKVxyXG4gIH1cclxuICByZWFkU2VjdGlvbnMoYXNzZXNzbWVudElkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBgJHt0aGlzLkFQSV9FTkRQT0lOVFN9LyR7YXNzZXNzbWVudElkfWBcclxuICB9XHJcblxyXG4gIGdldFB1YmxpY1VybCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBtYWluVXJsID0gdXJsLnNwbGl0KCcvY29udGVudCcpLnBvcCgpIHx8ICcnXHJcbiAgICByZXR1cm4gYCR7dGhpcy5lbnZpcm9ubWVudC5jb250ZW50SG9zdH0vJHt0aGlzLmVudmlyb25tZW50LmNvbnRlbnRCdWNrZXR9L2NvbnRlbnQke21haW5Vcmx9YFxyXG4gIH1cclxuXHJcbiAgZ2V0Q2RuVXJsKHVybDogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG1haW5VcmwgPSB1cmwuc3BsaXQoJy9jb250ZW50JykucG9wKCkgfHwgJydcclxuICAgIHJldHVybiBgJHt0aGlzLmRvbWFpbkNvbmZTdmMuZ2V0RG9tYWluQ0ROSG9zdCgpfS8ke3RoaXMuZW52aXJvbm1lbnQuY2RuQ29udGVudEJ1Y2tldH0vY29udGVudCR7bWFpblVybH1gXHJcbiAgfVxyXG5cclxuICAvLyAgZmV0Y2hDb250ZW50KFxyXG4gIC8vICAgY29udGVudElkOiBzdHJpbmcsXHJcbiAgLy8gICBoaWVyYXJjaHlUeXBlOiAnYWxsJyB8ICdtaW5pbWFsJyB8ICdkZXRhaWwnID0gJ2RldGFpbCdcclxuICAvLyAgICk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50PiB7XHJcbiAgLy8gICAgIGxldCB1cmwgPSAnJ1xyXG4gIC8vICAgICBjb25zdCBmb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9wdWJsaWMvJykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJyZwcmV2aWV3PXRydWUnKVxyXG4gIC8vICAgICAgIGlmICghZm9yUHJldmlldykge1xyXG4gIC8vICAgICAgICAgdXJsID0gYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvaGllcmFyY2h5LyR7Y29udGVudElkfT9oaWVyYXJjaHlUeXBlPSR7aGllcmFyY2h5VHlwZX1gXHJcbiAgLy8gICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgIHVybCA9IGAvYXBpL2NvdXJzZS92MS9oaWVyYXJjaHkvJHtjb250ZW50SWR9P2hpZXJhcmNoeVR5cGU9JHtoaWVyYXJjaHlUeXBlfWBcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50Pih1cmwpXHJcbiAgLy8gICB9XHJcblxyXG4gIGZldGNoQ29udGVudChpZDogc3RyaW5nLCB0eXBlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudD4oYC9hcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvaGllcmFyY2h5LyR7aWR9P21vZGU9JHt0eXBlfWApXHJcbiAgfVxyXG5cclxuICB1cGRhdGVDb250ZW50SGFzaE1hcEZvckFzc2Vzc3RlbnQoY29udGVudElkOiBzdHJpbmcsIGNvbnRlbnRQcm9ncmVzczogYW55KSB7XHJcbiAgICBpZiAodGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdICYmXHJcbiAgICAgICghdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPCAyKSkge1xyXG4gICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSBjb250ZW50UHJvZ3Jlc3MuY29tcGxldGlvblBlcmNlbnRhZ2VcclxuICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSBjb250ZW50UHJvZ3Jlc3Muc3RhdHVzXHJcbiAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXAgPSB7IC4uLnRoaXMudG9jU3ZjLmhhc2htYXAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0Rm9ybUJ5SWQoZm9ybUlkOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuQVBJX0VORFBPSU5UUy5HRVRfRk9STV9CWUlEKGZvcm1JZCkpXHJcbiAgfVxyXG5cclxuICBzdWJtaXRGb3JtKGZvcm1EYXRhOiBhbnkpIHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KHRoaXMuQVBJX0VORFBPSU5UUy5TVUJNSVRfRk9STSwgZm9ybURhdGEpXHJcbiAgfVxyXG5cclxuICByZWFsVGltZVByb2dyZXNzVXBkYXRlRm9yUHJlQXNzZXNzbWVudChjb250ZW50SWQ6IHN0cmluZywgcmVxdWVzdDogYW55KSB7XHJcbiAgICBsZXQgcmVxOiBhbnlcclxuICAgIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUpIHtcclxuICAgICAgcmVxID0ge1xyXG4gICAgICAgIHJlcXVlc3Q6IHtcclxuICAgICAgICAgIHVzZXJJZDogdGhpcy5jb25maWdzZXJ2aWNlLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJyxcclxuICAgICAgICAgIGNvbnRlbnRzOiBbXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICBjb250ZW50SWQsXHJcbiAgICAgICAgICAgICAgLy8gYmF0Y2hJZCxcclxuICAgICAgICAgICAgICBzdGF0dXM6IHRoaXMuZ2V0U3RhdHVzKHJlcXVlc3QuY3VycmVudCwgcmVxdWVzdC5tYXhfc2l6ZSwgcmVxdWVzdC5taW1lX3R5cGUpLFxyXG4gICAgICAgICAgICAgIC8vIGNvdXJzZUlkOiBjb2xsZWN0aW9uSWQsXHJcbiAgICAgICAgICAgICAgbGFzdEFjY2Vzc1RpbWU6IGRheWpzKG5ldyBEYXRlKCkpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzczpTU1NaWicpLFxyXG4gICAgICAgICAgICAgIHByb2dyZXNzZGV0YWlsczoge1xyXG4gICAgICAgICAgICAgICAgbWF4X3NpemU6IHJlcXVlc3QubWF4X3NpemUsXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50OiByZXF1ZXN0LmN1cnJlbnQsXHJcbiAgICAgICAgICAgICAgICBtaW1lVHlwZTogcmVxdWVzdC5taW1lX3R5cGUsXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogdGhpcy5jYWxjdWxhdGVQZXJjZW50KHJlcXVlc3QuY3VycmVudCwgcmVxdWVzdC5tYXhfc2l6ZSwgcmVxdWVzdC5taW1lX3R5cGUpLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXSxcclxuICAgICAgICB9LFxyXG4gICAgICB9XHJcbiAgICAgIC8vIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UuY3N0b2tlbiAhPT0gJycpIHtcclxuICAgICAgLy8gICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKClcclxuICAgICAgLy8gICAuc2V0KCdjc3Rva2VuJywgdGhpcy5jb25maWdzZXJ2aWNlLmNzdG9rZW4pXHJcblxyXG4gICAgICAvLyAgIHRoaXMuaHR0cFxyXG4gICAgICAvLyAgIC5wYXRjaChgJHt0aGlzLkFQSV9FTkRQT0lOVFMuUFJPR1JFU1NfVVBEQVRFfS8ke2NvbnRlbnRJZH1gLCB7IGhlYWRlcnMgfSAsIHJlcSlcclxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgIC8vICAgdGhpcy5odHRwXHJcbiAgICAgIC8vICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcclxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gdGhpcy5odHRwXHJcbiAgICAgIC8vICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUk9HUkVTU19VUERBVEV9LyR7Y29udGVudElkfWAsIHJlcSlcclxuICAgICAgLy8gICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIC8vY29uc3QgY29udGVudElkTmV3PSByZXEucmVxdWVzdC5jb250ZW50c1swXS5jb250ZW50SWRcclxuICAgICAgLy8gY29uc3QgdXBkYXRlZENvbXBsZXRpb25QZXJjZW50YWdlID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcclxuICAgICAgLy8gY29uc3QgdXBkYXRlZFN0YXR1cyA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLnN0YXR1c1xyXG5cclxuICAgICAgLy8gLy8gQ2xvbmUgdGhlIGlubmVyIG9iamVjdCBhbmQgdXBkYXRlXHJcbiAgICAgIC8vIGNvbnN0IGV4aXN0aW5nQ29udGVudCA9IHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkTmV3XSB8fCB7fVxyXG5cclxuICAgICAgLy8gdGhpcy50b2NTdmMuaGFzaG1hcCA9IHtcclxuICAgICAgLy8gICAuLi50aGlzLnRvY1N2Yy5oYXNobWFwLFxyXG4gICAgICAvLyAgIFtjb250ZW50SWROZXddOiB7XHJcbiAgICAgIC8vICAgICAuLi5leGlzdGluZ0NvbnRlbnQsXHJcbiAgICAgIC8vICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogdXBkYXRlZENvbXBsZXRpb25QZXJjZW50YWdlLFxyXG4gICAgICAvLyAgICAgY29tcGxldGlvblN0YXR1czogdXBkYXRlZFN0YXR1c1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICAvLyBjb25zb2xlLmxvZygncmVxJywgSlNPTi5zdHJpbmdpZnkocmVxKSlcclxuICAgICAgLy8gY29uc29sZS5sb2coJ3JlcScsIHJlcSlcclxuXHJcbiAgICAgIGNvbnN0IHJlc291cmNlU3RhdHVzID0gdGhpcy5nZXRQcmVBc3Nlc3NtZW50UmVzb3VyY2VTdGF0dXMoY29udGVudElkKVxyXG4gICAgICBpZiAocmVzb3VyY2VTdGF0dXMgPCAyKSB7XHJcbiAgICAgICAgdGhpcy5odHRwXHJcbiAgICAgICAgICAucGF0Y2goYCR7dGhpcy5BUElfRU5EUE9JTlRTLlBSRV9BU1NFU1NNRU5UX1NUQVRFX1VQREFURX1gLCByZXEpXHJcbiAgICAgICAgICAuc3Vic2NyaWJlKG5vb3AsIG5vb3ApXHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJlxyXG4gICAgICAgICghdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPCAyKSkge1xyXG4gICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IHJlcS5yZXF1ZXN0LmNvbnRlbnRzWzBdLmNvbXBsZXRpb25QZXJjZW50YWdlXHJcbiAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5zdGF0dXNcclxuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ3BhcmVudCddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY291cnNlSWRcclxuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF1bJ3Byb2dyZXNzJ10gPSByZXEucmVxdWVzdC5jb250ZW50c1swXS5wcm9ncmVzc2RldGFpbHNcclxuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cclxuICAgICAgICBcclxuICAgICAgICAvLyBOb3RpZnkgVUkgY29tcG9uZW50cyBhYm91dCBoYXNobWFwIGNoYW5nZXNcclxuICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwVXBkYXRlZC5uZXh0KHRoaXMudG9jU3ZjLmhhc2htYXApXHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gVHJpZ2dlciBtaWxlc3RvbmUgbG9jayByZWNvbXB1dGF0aW9uIGZvciBMZWFybmluZyBQYXRod2F5c1xyXG4gICAgICAgIGlmICh0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSkge1xyXG4gICAgICAgICAgdGhpcy50b2NTdmMudHJpZ2dlck1pbGVzdG9uZUxvY2tVcGRhdGUoKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gY29uc29sZS5sb2coJ1VwZGF0ZWQgaGFzaG1hcDonLCB0aGlzLnRvY1N2Yy5oYXNobWFwKVxyXG5cclxuICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMudG9jU3ZjLmhhc2htYXAtLS0nLCB0aGlzLnRvY1N2Yy5oYXNobWFwKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmVxID0ge31cclxuICAgICAgLy8gZG8gbm90aGluZ1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVhbFRpbWVQcm9ncmVzc1VwZGF0ZUZvclByZUFzc2Vzc21lbnRRdWl6KGNvbnRlbnRJZDogc3RyaW5nLCBzdGF0dXM/OiBudW1iZXIsIG1pbWVUeXBlPzogc3RyaW5nKSB7XHJcbiAgICBsZXQgcmVxOiBhbnlcclxuICAgIGlmICh0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUpIHtcclxuICAgICAgcmVxID0ge1xyXG4gICAgICAgIHJlcXVlc3Q6IHtcclxuICAgICAgICAgIC8vdXNlcklkOiB0aGlzLmNvbmZpZ3NlcnZpY2UudXNlclByb2ZpbGUudXNlcklkIHx8ICcnLFxyXG4gICAgICAgICAgY29udGVudHM6IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIGNvbnRlbnRJZCxcclxuICAgICAgICAgICAgICAvLyBiYXRjaElkLFxyXG4gICAgICAgICAgICAgIHN0YXR1czogc3RhdHVzIHx8IDIsXHJcbiAgICAgICAgICAgICAgLy8gY291cnNlSWQ6IGNvbGxlY3Rpb25JZCxcclxuICAgICAgICAgICAgICBsYXN0QWNjZXNzVGltZTogZGF5anMobmV3IERhdGUoKSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzOlNTU1paJyksXHJcbiAgICAgICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IHN0YXR1cyA9PT0gMiA/IDEwMC4wIDogMCxcclxuICAgICAgICAgICAgICBwcm9ncmVzc2RldGFpbHM6IHtcclxuICAgICAgICAgICAgICAgIFwibWltZVR5cGVcIjogbWltZVR5cGUgfHwgXCJhcHBsaWNhdGlvbi92bmQuc3VuYmlyZC5xdWVzdGlvbnNldFwiXHJcbiAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF0sXHJcbiAgICAgICAgfSxcclxuICAgICAgfVxyXG4gICAgICBjb25zdCByZXNvdXJjZVN0YXR1cyA9IHRoaXMuZ2V0UHJlQXNzZXNzbWVudFJlc291cmNlU3RhdHVzKGNvbnRlbnRJZClcclxuICAgICAgaWYgKHJlc291cmNlU3RhdHVzIDwgMikge1xyXG4gICAgICAgIHRoaXMuaHR0cFxyXG4gICAgICAgICAgLnBhdGNoKGAke3RoaXMuQVBJX0VORFBPSU5UUy5QUkVfQVNTRVNTTUVOVF9TVEFURV9VUERBVEV9YCwgcmVxKVxyXG4gICAgICAgICAgLnN1YnNjcmliZShub29wLCBub29wKVxyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnRvY1N2Yy5oYXNobWFwICYmIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXSAmJiByZXEucmVxdWVzdC5jb250ZW50c1swXSkge1xyXG4gICAgICAgIGlmICh0aGlzLnRvY1N2Yy5oYXNobWFwW2NvbnRlbnRJZF0gJiZcclxuICAgICAgICAgICghdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uU3RhdHVzJ10gPCAyKSkge1xyXG4gICAgICAgICAgdGhpcy50b2NTdmMuaGFzaG1hcFtjb250ZW50SWRdWydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uY29tcGxldGlvblBlcmNlbnRhZ2VcclxuICAgICAgICAgIHRoaXMudG9jU3ZjLmhhc2htYXBbY29udGVudElkXVsnY29tcGxldGlvblN0YXR1cyddID0gcmVxLnJlcXVlc3QuY29udGVudHNbMF0uc3RhdHVzXHJcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwID0geyAuLi50aGlzLnRvY1N2Yy5oYXNobWFwIH1cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgLy8gTm90aWZ5IFVJIGNvbXBvbmVudHMgYWJvdXQgaGFzaG1hcCBjaGFuZ2VzXHJcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5oYXNobWFwVXBkYXRlZC5uZXh0KHRoaXMudG9jU3ZjLmhhc2htYXApXHJcbiAgICAgICAgICBcclxuICAgICAgICAgIC8vIFRyaWdnZXIgbWlsZXN0b25lIGxvY2sgcmVjb21wdXRhdGlvbiBmb3IgTGVhcm5pbmcgUGF0aHdheXNcclxuICAgICAgICAgIGlmICh0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy50cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSgpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXEgPSB7fVxyXG4gICAgICAvLyBkbyBub3RoaW5nXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRQcmVBc3Nlc3NtZW50UmVzb3VyY2VTdGF0dXMocmVzb3VyY2VJZDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy50b2NTdmMgJiYgdGhpcy50b2NTdmMuaGFzaG1hcCAmJiB0aGlzLnRvY1N2Yy5oYXNobWFwW3Jlc291cmNlSWRdKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnRvY1N2Yy5oYXNobWFwW3Jlc291cmNlSWRdWydjb21wbGV0aW9uU3RhdHVzJ10gfHwgMVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIDFcclxuICB9XHJcblxyXG5cclxufVxyXG4iXX0=
|