@sunbird-cb/toc 0.0.2 → 0.0.3-2.1
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/ai-tutor/ai-tutor.component.mjs +1169 -0
- package/esm2022/lib/_collection/_common/ai-tutor/socket.service.mjs +121 -0
- package/esm2022/lib/_collection/_common/card-competency/card-competency.component.mjs +58 -0
- package/esm2022/lib/_collection/_common/card-competency/card-competency.module.mjs +22 -0
- package/esm2022/lib/_collection/_common/card-content-v2/card-content-v2.model.mjs +23 -0
- package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +108 -7
- package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +5 -1
- package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +3 -3
- package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +18 -8
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +88 -7
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +393 -51
- package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +16 -34
- package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +7 -2
- package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +5 -2
- package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +2 -8
- package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +3 -3
- package/esm2022/lib/_services/widget-content.model.mjs +8 -1
- package/esm2022/lib/_services/widget-content.service.mjs +3 -3
- package/esm2022/lib/app-toc-lib.module.mjs +7 -3
- package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +37 -8
- package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +3 -3
- package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +3 -3
- package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +224 -67
- package/esm2022/lib/registration-toc-lib.config.mjs +14 -0
- package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +1 -1
- package/esm2022/lib/services/app-toc-v2.service.mjs +192 -54
- package/esm2022/lib/services/app-toc.service.mjs +381 -104
- package/esm2022/lib/services/certificate.service.mjs +54 -9
- package/esm2022/lib/services/root.service.mjs +106 -0
- package/esm2022/lib/services/viewer-data.service.mjs +1 -1
- package/esm2022/lib/services/viewer-util.service.mjs +150 -23
- package/esm2022/public-api.mjs +11 -1
- package/fesm2022/sunbird-cb-toc.mjs +9093 -6348
- package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
- package/index.d.ts +0 -1
- package/lib/_collection/_common/ai-tutor/ai-tutor.component.d.ts +139 -0
- package/lib/_collection/_common/ai-tutor/socket.service.d.ts +19 -0
- package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +0 -1
- package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +0 -1
- package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +0 -1
- package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +0 -1
- package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +0 -1
- package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +0 -1
- package/lib/_collection/_common/card-competency/card-competency.component.d.ts +14 -0
- package/lib/_collection/_common/card-competency/card-competency.module.d.ts +8 -0
- package/lib/_collection/_common/card-content-v2/card-content-v2.model.d.ts +44 -0
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +8 -1
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +12 -12
- package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +0 -1
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +0 -1
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +0 -1
- package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +0 -1
- package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +0 -1
- package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +0 -1
- package/lib/_collection/_common/connection-name/connection-name.component.d.ts +0 -1
- package/lib/_collection/_common/connection-name/connection-name.module.d.ts +0 -1
- package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +0 -1
- package/lib/_collection/_common/content-progress/content-progress.component.d.ts +0 -1
- package/lib/_collection/_common/content-progress/content-progress.module.d.ts +0 -1
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +0 -1
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +0 -1
- package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +1 -2
- package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +2 -1
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +0 -1
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +0 -1
- package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +0 -1
- package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +8 -1
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +64 -5
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +0 -1
- package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +0 -1
- package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +0 -1
- package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +0 -1
- package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +0 -1
- package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +0 -1
- package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +0 -1
- package/lib/_collection/_common/content-toc/content-toc.component.d.ts +2 -2
- package/lib/_collection/_common/content-toc/content-toc.module.d.ts +29 -29
- package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +0 -1
- package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +0 -1
- package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +0 -1
- package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +0 -1
- package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +0 -1
- package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +0 -1
- package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +0 -1
- package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +0 -1
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +0 -1
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +0 -1
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +0 -1
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +0 -1
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +0 -1
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +0 -1
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +0 -2
- package/lib/_collection/_common/player-brief/player-brief.component.d.ts +0 -1
- package/lib/_collection/_common/player-brief/player-brief.module.d.ts +0 -1
- package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +0 -1
- package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +0 -1
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +0 -1
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +0 -1
- package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +0 -1
- package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +0 -1
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +0 -1
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +0 -1
- package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +0 -1
- package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +0 -1
- package/lib/_collection/_common/user-image/user-image.component.d.ts +0 -1
- package/lib/_collection/_common/user-image/user-image.module.d.ts +0 -1
- package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +0 -1
- package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +0 -1
- package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +0 -1
- package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +0 -1
- package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +0 -1
- package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +0 -1
- package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +0 -1
- package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +0 -1
- package/lib/_collection-api.d.ts +0 -1
- package/lib/_constants/widget-content.constants.d.ts +0 -1
- package/lib/_directives/tooltip.directive.d.ts +0 -1
- package/lib/_models/common.model.d.ts +0 -1
- package/lib/_models/error.model.d.ts +0 -1
- package/lib/_pipes/highlight.pipe.d.ts +0 -1
- package/lib/_services/rating.service.d.ts +0 -1
- package/lib/_services/samuhik-charcha.service.d.ts +0 -1
- package/lib/_services/viewer-route-util.d.ts +0 -1
- package/lib/_services/widget-content.model.d.ts +6 -1
- package/lib/_services/widget-content.service.d.ts +0 -1
- package/lib/_shared/translate-loader.factory.d.ts +0 -1
- package/lib/app-toc-lib.module.d.ts +2 -2
- package/lib/collection.config.d.ts +0 -1
- package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +0 -1
- package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +0 -1
- package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +3 -1
- package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +0 -1
- package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +0 -1
- package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +0 -1
- package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +0 -1
- package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +0 -1
- package/lib/components/app-toc-home/app-toc-home.component.d.ts +0 -1
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +28 -4
- package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +0 -1
- package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +0 -1
- package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +0 -1
- package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +0 -1
- package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +0 -1
- package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +0 -1
- package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +0 -1
- package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +0 -1
- package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +0 -1
- package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +0 -1
- package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +0 -1
- package/lib/components/public-survey-form/public-survey-form.component.d.ts +0 -1
- package/lib/components/survey-form-question/survey-form-question.component.d.ts +0 -1
- package/lib/components/survey-form-section/survey-form-section.component.d.ts +0 -1
- package/lib/models/app-toc-analytics.model.d.ts +0 -1
- package/lib/models/app-toc.model.d.ts +0 -1
- package/lib/models/auto-complete.model.d.ts +0 -1
- package/lib/models/card-content.model.d.ts +0 -1
- package/lib/models/content-strip-with-tabs.model.d.ts +0 -1
- package/lib/models/discussion-forum.model.d.ts +0 -1
- package/lib/models/goal.model.d.ts +0 -1
- package/lib/models/meta-tag.model.d.ts +0 -1
- package/lib/models/playlist.model.d.ts +0 -1
- package/lib/models/profile-revamp.model.d.ts +0 -1
- package/lib/models/rating.model.d.ts +0 -1
- package/lib/models/user-profile.model.d.ts +0 -1
- package/lib/registration-toc-lib.config.d.ts +4 -0
- package/lib/resolvers/app-toc-cios-resolver.service.d.ts +0 -1
- package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +0 -1
- package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +0 -1
- package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +0 -1
- package/lib/resolvers/app-toc-resolver.service.d.ts +0 -1
- package/lib/resolvers/config-resolver.service.d.ts +0 -1
- package/lib/resolvers/profile-resolver.service.d.ts +0 -1
- package/lib/resolvers/restricted-features-resolver.service.d.ts +0 -1
- package/lib/routes/app-toc-home/app-toc-home.component.d.ts +0 -1
- package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +0 -1
- package/lib/routes/app-toc-home/app-toc-home.service.d.ts +0 -1
- package/lib/services/access-control.service.d.ts +0 -1
- package/lib/services/action.service.d.ts +0 -1
- package/lib/services/app-toc-v2.service.d.ts +3 -1
- package/lib/services/app-toc.service.d.ts +41 -13
- package/lib/services/certificate.service.d.ts +5 -7
- package/lib/services/discuss-utils.service.d.ts +0 -1
- package/lib/services/editor.service.d.ts +0 -1
- package/lib/services/load-check.service.d.ts +0 -1
- package/lib/services/loader.service.d.ts +0 -1
- package/lib/services/mobile-apps.service.d.ts +0 -1
- package/lib/services/netcore.service.d.ts +0 -1
- package/lib/services/nps-grid.service.d.ts +0 -1
- package/lib/services/otp.service.d.ts +0 -1
- package/lib/services/profile-v2.service.d.ts +0 -1
- package/lib/services/reset-ratings.service.d.ts +0 -1
- package/lib/services/resource-download-helper.service.d.ts +0 -1
- package/lib/services/root.service.d.ts +26 -0
- package/lib/services/timer.service.d.ts +0 -1
- package/lib/services/title-tag.service.d.ts +0 -1
- package/lib/services/user-profile.service.d.ts +0 -1
- package/lib/services/viewer-data.service.d.ts +9 -6
- package/lib/services/viewer-util.service.d.ts +14 -1
- package/lib/share-toc/share-toc/share-toc.component.d.ts +0 -1
- package/lib/share-toc/share-toc.module.d.ts +0 -1
- package/package.json +3 -5
- package/public-api.d.ts +9 -1
- package/sunbird-cb-toc-0.0.32.1.tgz +0 -0
- package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts.map +0 -1
- package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts.map +0 -1
- package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts.map +0 -1
- package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts.map +0 -1
- package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts.map +0 -1
- package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts.map +0 -1
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts.map +0 -1
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts.map +0 -1
- package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts.map +0 -1
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts.map +0 -1
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts.map +0 -1
- package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts.map +0 -1
- package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts.map +0 -1
- package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts.map +0 -1
- package/lib/_collection/_common/connection-name/connection-name.component.d.ts.map +0 -1
- package/lib/_collection/_common/connection-name/connection-name.module.d.ts.map +0 -1
- package/lib/_collection/_common/connection-name/profile-v2.model.d.ts.map +0 -1
- package/lib/_collection/_common/content-progress/content-progress.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-progress/content-progress.module.d.ts.map +0 -1
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/content-toc.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/content-toc.module.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts.map +0 -1
- package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts.map +0 -1
- package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts.map +0 -1
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts.map +0 -1
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts.map +0 -1
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts.map +0 -1
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts.map +0 -1
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts.map +0 -1
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts.map +0 -1
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts.map +0 -1
- package/lib/_collection/_common/player-brief/player-brief.component.d.ts.map +0 -1
- package/lib/_collection/_common/player-brief/player-brief.module.d.ts.map +0 -1
- package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts.map +0 -1
- package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts.map +0 -1
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts.map +0 -1
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts.map +0 -1
- package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts.map +0 -1
- package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts.map +0 -1
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts.map +0 -1
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts.map +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts.map +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts.map +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts.map +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts.map +0 -1
- package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts.map +0 -1
- package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts.map +0 -1
- package/lib/_collection/_common/user-image/user-image.component.d.ts.map +0 -1
- package/lib/_collection/_common/user-image/user-image.module.d.ts.map +0 -1
- package/lib/_collection/btn-page-back/btn-page-back.component.d.ts.map +0 -1
- package/lib/_collection/btn-page-back/btn-page-back.module.d.ts.map +0 -1
- package/lib/_collection/btn-page-back/btn-page-back.service.d.ts.map +0 -1
- package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts.map +0 -1
- package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts.map +0 -1
- package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts.map +0 -1
- package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts.map +0 -1
- package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts.map +0 -1
- package/lib/_collection-api.d.ts.map +0 -1
- package/lib/_constants/widget-content.constants.d.ts.map +0 -1
- package/lib/_directives/tooltip.directive.d.ts.map +0 -1
- package/lib/_models/common.model.d.ts.map +0 -1
- package/lib/_models/error.model.d.ts.map +0 -1
- package/lib/_pipes/highlight.pipe.d.ts.map +0 -1
- package/lib/_services/rating.service.d.ts.map +0 -1
- package/lib/_services/samuhik-charcha.service.d.ts.map +0 -1
- package/lib/_services/viewer-route-util.d.ts.map +0 -1
- package/lib/_services/widget-content.model.d.ts.map +0 -1
- package/lib/_services/widget-content.service.d.ts.map +0 -1
- package/lib/_shared/translate-loader.factory.d.ts.map +0 -1
- package/lib/app-toc-lib.module.d.ts.map +0 -1
- package/lib/collection.config.d.ts.map +0 -1
- package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts.map +0 -1
- package/lib/components/app-toc-banner/app-toc-banner.component.d.ts.map +0 -1
- package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts.map +0 -1
- package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts.map +0 -1
- package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts.map +0 -1
- package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts.map +0 -1
- package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts.map +0 -1
- package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts.map +0 -1
- package/lib/components/app-toc-home/app-toc-home.component.d.ts.map +0 -1
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts.map +0 -1
- package/lib/components/app-toc-overview/app-toc-overview.component.d.ts.map +0 -1
- package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts.map +0 -1
- package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts.map +0 -1
- package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts.map +0 -1
- package/lib/components/completion-survey-form/completion-survey-form.component.d.ts.map +0 -1
- package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts.map +0 -1
- package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts.map +0 -1
- package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts.map +0 -1
- package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts.map +0 -1
- package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts.map +0 -1
- package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts.map +0 -1
- package/lib/components/public-survey-form/public-survey-form.component.d.ts.map +0 -1
- package/lib/components/survey-form-question/survey-form-question.component.d.ts.map +0 -1
- package/lib/components/survey-form-section/survey-form-section.component.d.ts.map +0 -1
- package/lib/models/app-toc-analytics.model.d.ts.map +0 -1
- package/lib/models/app-toc.model.d.ts.map +0 -1
- package/lib/models/auto-complete.model.d.ts.map +0 -1
- package/lib/models/card-content.model.d.ts.map +0 -1
- package/lib/models/content-strip-with-tabs.model.d.ts.map +0 -1
- package/lib/models/discussion-forum.model.d.ts.map +0 -1
- package/lib/models/goal.model.d.ts.map +0 -1
- package/lib/models/meta-tag.model.d.ts.map +0 -1
- package/lib/models/playlist.model.d.ts.map +0 -1
- package/lib/models/profile-revamp.model.d.ts.map +0 -1
- package/lib/models/rating.model.d.ts.map +0 -1
- package/lib/models/user-profile.model.d.ts.map +0 -1
- package/lib/resolvers/app-toc-cios-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/app-toc-content-read-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/app-toc-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/config-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/profile-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/restricted-features-resolver.service.d.ts.map +0 -1
- package/lib/routes/app-toc-home/app-toc-home.component.d.ts.map +0 -1
- package/lib/routes/app-toc-home/app-toc-home.directive.d.ts.map +0 -1
- package/lib/routes/app-toc-home/app-toc-home.service.d.ts.map +0 -1
- package/lib/services/access-control.service.d.ts.map +0 -1
- package/lib/services/action.service.d.ts.map +0 -1
- package/lib/services/app-toc-v2.service.d.ts.map +0 -1
- package/lib/services/app-toc.service.d.ts.map +0 -1
- package/lib/services/certificate.service.d.ts.map +0 -1
- package/lib/services/discuss-utils.service.d.ts.map +0 -1
- package/lib/services/editor.service.d.ts.map +0 -1
- package/lib/services/load-check.service.d.ts.map +0 -1
- package/lib/services/loader.service.d.ts.map +0 -1
- package/lib/services/mobile-apps.service.d.ts.map +0 -1
- package/lib/services/netcore.service.d.ts.map +0 -1
- package/lib/services/nps-grid.service.d.ts.map +0 -1
- package/lib/services/otp.service.d.ts.map +0 -1
- package/lib/services/profile-v2.service.d.ts.map +0 -1
- package/lib/services/reset-ratings.service.d.ts.map +0 -1
- package/lib/services/resource-download-helper.service.d.ts.map +0 -1
- package/lib/services/timer.service.d.ts.map +0 -1
- package/lib/services/title-tag.service.d.ts.map +0 -1
- package/lib/services/user-profile.service.d.ts.map +0 -1
- package/lib/services/viewer-data.service.d.ts.map +0 -1
- package/lib/services/viewer-util.service.d.ts.map +0 -1
- package/lib/share-toc/share-toc/share-toc.component.d.ts.map +0 -1
- package/lib/share-toc/share-toc.module.d.ts.map +0 -1
- package/public-api.d.ts.map +0 -1
- package/sunbird-cb-toc.d.ts.map +0 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ROOT_WIDGET_CONFIG } from './collection.config';
|
|
2
|
+
import { CardCompetencyComponent } from './_collection/_common/card-competency/card-competency.component';
|
|
3
|
+
import { CardCompetencyModule } from './_collection/_common/card-competency/card-competency.module';
|
|
4
|
+
export const WIDGET_REGISTERED_LIB_MODULES = [
|
|
5
|
+
CardCompetencyModule
|
|
6
|
+
];
|
|
7
|
+
export const WIDGET_REGISTRATION_TOC_LIB_CONFIG = [
|
|
8
|
+
{
|
|
9
|
+
widgetType: ROOT_WIDGET_CONFIG.card._type,
|
|
10
|
+
widgetSubType: ROOT_WIDGET_CONFIG.card.card_competency,
|
|
11
|
+
component: CardCompetencyComponent,
|
|
12
|
+
},
|
|
13
|
+
];
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cmF0aW9uLXRvYy1saWIuY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3JlZ2lzdHJhdGlvbi10b2MtbGliLmNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxpRUFBaUUsQ0FBQTtBQUN6RyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4REFBOEQsQ0FBQTtBQUduRyxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRztJQUMzQyxvQkFBb0I7Q0FDckIsQ0FBQTtBQUdELE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUEyQztJQUN4RjtRQUNFLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSztRQUN6QyxhQUFhLEVBQUUsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGVBQWU7UUFDdEQsU0FBUyxFQUFFLHVCQUF1QjtLQUNuQztDQUNGLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOc1dpZGdldFJlc29sdmVyIH0gZnJvbSAnQHN1bmJpcmQtY2IvcmVzb2x2ZXItdjInXG5pbXBvcnQgeyBST09UX1dJREdFVF9DT05GSUcgfSBmcm9tICcuL2NvbGxlY3Rpb24uY29uZmlnJ1xuaW1wb3J0IHsgQ2FyZENvbXBldGVuY3lDb21wb25lbnQgfSBmcm9tICcuL19jb2xsZWN0aW9uL19jb21tb24vY2FyZC1jb21wZXRlbmN5L2NhcmQtY29tcGV0ZW5jeS5jb21wb25lbnQnXG5pbXBvcnQgeyBDYXJkQ29tcGV0ZW5jeU1vZHVsZSB9IGZyb20gJy4vX2NvbGxlY3Rpb24vX2NvbW1vbi9jYXJkLWNvbXBldGVuY3kvY2FyZC1jb21wZXRlbmN5Lm1vZHVsZSdcblxuXG5leHBvcnQgY29uc3QgV0lER0VUX1JFR0lTVEVSRURfTElCX01PRFVMRVMgPSBbXG4gIENhcmRDb21wZXRlbmN5TW9kdWxlXG5dXG5cblxuZXhwb3J0IGNvbnN0IFdJREdFVF9SRUdJU1RSQVRJT05fVE9DX0xJQl9DT05GSUc6IE5zV2lkZ2V0UmVzb2x2ZXIuSVJlZ2lzdHJhdGlvbkNvbmZpZ1tdID0gW1xuICB7XG4gICAgd2lkZ2V0VHlwZTogUk9PVF9XSURHRVRfQ09ORklHLmNhcmQuX3R5cGUsXG4gICAgd2lkZ2V0U3ViVHlwZTogUk9PVF9XSURHRVRfQ09ORklHLmNhcmQuY2FyZF9jb21wZXRlbmN5LFxuICAgIGNvbXBvbmVudDogQ2FyZENvbXBldGVuY3lDb21wb25lbnQsXG4gIH0sXG5dXG4iXX0=
|
|
@@ -37,7 +37,7 @@ export class AppTocHomeComponent {
|
|
|
37
37
|
// this.loadComponent()
|
|
38
38
|
}
|
|
39
39
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocHomeComponent, deps: [{ token: i0.ComponentFactoryResolver }, { token: i1.AppTocHomeService }, { token: i2.TranslateService }, { token: i3.ConfigurationsService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
40
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocHomeComponent, selector: "ws-app-app-toc-home-root", inputs: { forPreview: "forPreview" }, viewQueries: [{ propertyName: "wsAppAppTocHome", first: true, predicate: AppTocHomeDirective, descendants: true, static: true }], ngImport: i0, template: "<!-- <ng-template wsAppAppTocHome></ng-template> -->\n<ws-app-app-toc-home-v2 [forPreview]=\"forPreview\"></ws-app-app-toc-home-v2>\n<!-- {{'apptochome.atGlance' | translate}} -->\n", styles: [""], dependencies: [{ kind: "component", type: i4.AppTocHomeV2Component, selector: "ws-app-app-toc-home-v2", inputs: ["forPreview"] }] }); }
|
|
40
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocHomeComponent, selector: "ws-app-app-toc-home-root", inputs: { forPreview: "forPreview" }, viewQueries: [{ propertyName: "wsAppAppTocHome", first: true, predicate: AppTocHomeDirective, descendants: true, static: true }], ngImport: i0, template: "<!-- <ng-template wsAppAppTocHome></ng-template> -->\n<ws-app-app-toc-home-v2 [forPreview]=\"forPreview\"></ws-app-app-toc-home-v2>\n<!-- {{'apptochome.atGlance' | translate}} -->\n", styles: [""], dependencies: [{ kind: "component", type: i4.AppTocHomeV2Component, selector: "ws-app-app-toc-home-v2", inputs: ["forPreview", "inputContent", "displayViewBtn"] }] }); }
|
|
41
41
|
}
|
|
42
42
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocHomeComponent, decorators: [{
|
|
43
43
|
type: Component,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core';
|
|
2
|
+
import { NsContent } from '@sunbird-cb/utils-v2';
|
|
2
3
|
import * as i0 from "@angular/core";
|
|
3
4
|
import * as i1 from "./app-toc.service";
|
|
4
5
|
export class AppTocV2Service {
|
|
@@ -29,7 +30,7 @@ export class AppTocV2Service {
|
|
|
29
30
|
"identifier": milestone.id,
|
|
30
31
|
"description": milestone.description,
|
|
31
32
|
"mimeType": "application/vnd.ekstep.content-collection",
|
|
32
|
-
"duration": "
|
|
33
|
+
"duration": "0",
|
|
33
34
|
"primaryCategory": "Milestone",
|
|
34
35
|
"courseCategory": "Milestone",
|
|
35
36
|
"createdBy": "25311a4f-fa42-4cf7-882a-5e79198edfcb",
|
|
@@ -37,7 +38,9 @@ export class AppTocV2Service {
|
|
|
37
38
|
"contentType": "Course",
|
|
38
39
|
"isLocked": shouldBeLocked,
|
|
39
40
|
"milestoneIndex": milestoneIndex,
|
|
40
|
-
"status":
|
|
41
|
+
"status": 0,
|
|
42
|
+
"completionStatus": 0,
|
|
43
|
+
"completionPercentage": 0,
|
|
41
44
|
"leafNodes": [],
|
|
42
45
|
// Pre-computed flags for performance optimization
|
|
43
46
|
"isMilestone": true,
|
|
@@ -52,8 +55,13 @@ export class AppTocV2Service {
|
|
|
52
55
|
milestone.courses.forEach((mileStoneCourse) => {
|
|
53
56
|
// Set parent reference for courses inside milestone
|
|
54
57
|
mileStoneCourse.parent = milestone.id;
|
|
55
|
-
|
|
56
|
-
mileStoneData['
|
|
58
|
+
mileStoneCourse['moduleCount'] = 0;
|
|
59
|
+
mileStoneData['duration'] = String(Number(mileStoneData['duration']) + Number(mileStoneCourse?.duration || 0));
|
|
60
|
+
this.tocSvc.mapModuleCount(mileStoneCourse);
|
|
61
|
+
if (mileStoneCourse && mileStoneCourse?.leafNodes && mileStoneCourse?.leafNodes?.length) {
|
|
62
|
+
leafNodes = [...leafNodes, ...mileStoneCourse.leafNodes];
|
|
63
|
+
mileStoneData['leafNodes'] = [...mileStoneData?.leafNodes, ...mileStoneCourse.leafNodes];
|
|
64
|
+
}
|
|
57
65
|
this.tocSvc.checkModuleWiseData(mileStoneCourse);
|
|
58
66
|
});
|
|
59
67
|
}
|
|
@@ -66,35 +74,62 @@ export class AppTocV2Service {
|
|
|
66
74
|
}
|
|
67
75
|
mileStoneData['children'] = [...milestone['courses'], ...mileStoneData['children']];
|
|
68
76
|
mileStoneData['leafNodesCount'] = mileStoneData['leafNodes'].length;
|
|
77
|
+
this.mapModuleCount(mileStoneData);
|
|
69
78
|
contentHeirarchy['children'] = contentHeirarchy['children'] ? [...contentHeirarchy['children'], mileStoneData] : [mileStoneData];
|
|
70
79
|
milestoneIndex++;
|
|
71
80
|
});
|
|
72
81
|
contentHeirarchy['leafNodes'] = [...leafNodes];
|
|
82
|
+
contentHeirarchy['leafNodesCount'] = leafNodes.length;
|
|
73
83
|
return contentHeirarchy;
|
|
74
84
|
}
|
|
85
|
+
mapModuleCount(content) {
|
|
86
|
+
if (content && content.children) {
|
|
87
|
+
content.children.map(child => {
|
|
88
|
+
if (child.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
|
|
89
|
+
if (child?.moduleCount) {
|
|
90
|
+
content['moduleCount'] = content['moduleCount'] ? content['moduleCount'] + child?.moduleCount :
|
|
91
|
+
child?.moduleCount;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
}
|
|
75
97
|
mapContentHierarchyProgressUpdate(contentHeirarchyData, enrollmentListData) {
|
|
76
98
|
if (contentHeirarchyData && contentHeirarchyData.children) {
|
|
77
99
|
let totalLeafNodes = 0;
|
|
78
100
|
let totalCompletedLeafNodes = 0;
|
|
101
|
+
let LPenrollment = this.findEnrollment(enrollmentListData, contentHeirarchyData?.identifier);
|
|
102
|
+
// First pass: Update progress for all content
|
|
79
103
|
contentHeirarchyData.children.forEach((child) => {
|
|
80
104
|
if (child.primaryCategory === 'Milestone') {
|
|
81
105
|
this.updateMilestoneProgress(child, contentHeirarchyData?.identifier, enrollmentListData);
|
|
82
|
-
|
|
83
|
-
|
|
106
|
+
// Only count mandatory course resources and milestone assessments
|
|
107
|
+
totalLeafNodes += child.mandatoryLeafNodesCount || 0;
|
|
108
|
+
totalCompletedLeafNodes += child.mandatoryCompletedLeafNodesCount || 0;
|
|
84
109
|
}
|
|
85
110
|
else {
|
|
86
|
-
// For pre-assessment and other root-level content
|
|
87
|
-
|
|
111
|
+
// For pre-assessment and other root-level content (always count these)
|
|
112
|
+
// Try to find enrollment with parent identifier first, then with child's own identifier
|
|
113
|
+
let enrollment = this.findEnrollment(enrollmentListData, contentHeirarchyData?.identifier);
|
|
114
|
+
if (!enrollment) {
|
|
115
|
+
enrollment = this.findEnrollment(enrollmentListData, child?.identifier);
|
|
116
|
+
}
|
|
88
117
|
this.updateNodeProgress(child, enrollment);
|
|
89
|
-
|
|
90
|
-
const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage === 100;
|
|
118
|
+
const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
|
|
91
119
|
totalLeafNodes += child.leafNodesCount || 1;
|
|
92
120
|
totalCompletedLeafNodes += isCompleted ? (child.leafNodesCount || 1) : 0;
|
|
93
121
|
}
|
|
94
122
|
});
|
|
95
|
-
if (
|
|
96
|
-
contentHeirarchyData.completionPercentage =
|
|
97
|
-
contentHeirarchyData.completionStatus =
|
|
123
|
+
if (LPenrollment && LPenrollment.completionPercentage === 100) {
|
|
124
|
+
contentHeirarchyData.completionPercentage = 100;
|
|
125
|
+
contentHeirarchyData.completionStatus = 2;
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
if (totalLeafNodes > 0) {
|
|
129
|
+
const calculatedPercentage = Math.round((Number(totalCompletedLeafNodes) / Number(totalLeafNodes)) * 100);
|
|
130
|
+
contentHeirarchyData.completionPercentage = isNaN(calculatedPercentage) ? 0 : calculatedPercentage;
|
|
131
|
+
contentHeirarchyData.completionStatus = Number(contentHeirarchyData.completionPercentage === 100 ? 2 : (contentHeirarchyData.completionPercentage > 0 ? 1 : 0));
|
|
132
|
+
}
|
|
98
133
|
}
|
|
99
134
|
}
|
|
100
135
|
return contentHeirarchyData;
|
|
@@ -102,89 +137,155 @@ export class AppTocV2Service {
|
|
|
102
137
|
updateMilestoneProgress(milestone, parentContentIdentifier, enrollmentListData) {
|
|
103
138
|
let totalLeafNodes = 0;
|
|
104
139
|
let totalCompletedLeafNodes = 0;
|
|
140
|
+
let mandatoryLeafNodes = 0;
|
|
141
|
+
let mandatoryCompletedLeafNodes = 0;
|
|
105
142
|
let completedCourses = 0;
|
|
106
143
|
let totalCourses = 0;
|
|
107
144
|
if (milestone.children) {
|
|
108
145
|
milestone.children.forEach((child) => {
|
|
109
146
|
if (child.primaryCategory === 'Course') {
|
|
110
147
|
totalCourses += 1;
|
|
111
|
-
debugger;
|
|
112
|
-
if (child?.identifier === "do_114482311476740096154") {
|
|
113
|
-
debugger;
|
|
114
|
-
}
|
|
115
148
|
this.updateCourseProgress(child, parentContentIdentifier, enrollmentListData);
|
|
116
|
-
|
|
117
|
-
|
|
149
|
+
const childLeafNodes = child.leafNodesCount || 1;
|
|
150
|
+
const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
|
|
151
|
+
// Count all course leaf nodes for overall tracking
|
|
152
|
+
totalLeafNodes += childLeafNodes;
|
|
153
|
+
if (isCompleted) {
|
|
118
154
|
completedCourses += 1;
|
|
155
|
+
totalCompletedLeafNodes += childLeafNodes;
|
|
156
|
+
}
|
|
157
|
+
// Only count mandatory courses for LP completion percentage
|
|
158
|
+
if (child.isMandatory === true || child.mandatory === true) {
|
|
159
|
+
mandatoryLeafNodes += childLeafNodes;
|
|
160
|
+
// Count individual completed resources within mandatory courses
|
|
161
|
+
const completedCount = this.getCompletedLeafNodesCount(child);
|
|
162
|
+
mandatoryCompletedLeafNodes += completedCount;
|
|
119
163
|
}
|
|
120
164
|
}
|
|
121
165
|
else {
|
|
122
|
-
// For assessments
|
|
123
|
-
//
|
|
166
|
+
// For assessments - always count them as mandatory
|
|
167
|
+
// Try multiple enrollment sources
|
|
124
168
|
let enrollment = this.findEnrollment(enrollmentListData, parentContentIdentifier);
|
|
125
169
|
if (!enrollment) {
|
|
126
|
-
// Try milestone enrollment
|
|
127
170
|
enrollment = this.findEnrollment(enrollmentListData, milestone?.identifier);
|
|
128
171
|
}
|
|
129
172
|
this.updateNodeProgress(child, enrollment);
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
173
|
+
const leafNodes = child.leafNodesCount || 1;
|
|
174
|
+
const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
|
|
175
|
+
// Count assessments in both total and mandatory
|
|
176
|
+
totalLeafNodes += leafNodes;
|
|
177
|
+
mandatoryLeafNodes += leafNodes;
|
|
178
|
+
if (isCompleted) {
|
|
179
|
+
totalCompletedLeafNodes += leafNodes;
|
|
180
|
+
mandatoryCompletedLeafNodes += leafNodes;
|
|
181
|
+
}
|
|
137
182
|
}
|
|
138
183
|
});
|
|
139
184
|
}
|
|
140
185
|
milestone.leafNodesCount = totalLeafNodes;
|
|
141
186
|
milestone.completedLeafNodesCount = totalCompletedLeafNodes;
|
|
187
|
+
milestone.mandatoryLeafNodesCount = mandatoryLeafNodes;
|
|
188
|
+
milestone.mandatoryCompletedLeafNodesCount = mandatoryCompletedLeafNodes;
|
|
142
189
|
milestone.totalCourses = totalCourses;
|
|
143
190
|
milestone.completedCourses = completedCourses;
|
|
144
191
|
if (totalLeafNodes > 0) {
|
|
145
|
-
|
|
146
|
-
milestone.
|
|
147
|
-
milestone.
|
|
192
|
+
const calculatedPercentage = Math.round((totalCompletedLeafNodes / totalLeafNodes) * 100);
|
|
193
|
+
milestone.completionPercentage = isNaN(calculatedPercentage) ? 0 : calculatedPercentage;
|
|
194
|
+
milestone.completionStatus = Number(milestone.completionPercentage === 100 ? 2 : (milestone.completionPercentage > 0 ? 1 : 0));
|
|
195
|
+
milestone.status = Number(milestone.completionPercentage === 100 ? 2 : (milestone.completionPercentage > 0 ? 1 : 0));
|
|
148
196
|
}
|
|
149
|
-
console.log(`Milestone ${milestone.identifier} (${milestone.name}) progress updated: ${totalCompletedLeafNodes}/${totalLeafNodes} = ${milestone.completionPercentage}%, status: ${milestone.status}, completionStatus: ${milestone.completionStatus}`);
|
|
150
197
|
}
|
|
151
198
|
updateNodeProgress(node, enrollment) {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
node.completionStatus
|
|
199
|
+
if (!enrollment) {
|
|
200
|
+
// If no enrollment data, preserve existing completion data from content hierarchy
|
|
201
|
+
// This is important for assessments that may have completion data but no enrollment entry
|
|
202
|
+
if (node.completionPercentage === undefined && node.completionStatus === undefined && node.status === undefined) {
|
|
203
|
+
node.completionPercentage = 0;
|
|
204
|
+
node.completionStatus = 0;
|
|
205
|
+
node.status = 0;
|
|
206
|
+
}
|
|
207
|
+
// Otherwise, keep the existing values from content hierarchy
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// Check if the node itself is the enrolled content (direct enrollment)
|
|
211
|
+
// This happens for pre-assessments and standalone content
|
|
212
|
+
const isDirectEnrollment = enrollment.collectionId === node.identifier ||
|
|
213
|
+
enrollment.contentId === node.identifier;
|
|
214
|
+
if (isDirectEnrollment) {
|
|
215
|
+
// Use enrollment's direct progress
|
|
216
|
+
const progress = enrollment.completionPercentage || enrollment.progress || 0;
|
|
217
|
+
const status = Number(enrollment.status) || 0;
|
|
218
|
+
node.completionPercentage = progress;
|
|
219
|
+
node.completionStatus = status;
|
|
220
|
+
node.status = status;
|
|
221
|
+
return;
|
|
156
222
|
}
|
|
157
|
-
|
|
223
|
+
if (enrollment?.status === 2) {
|
|
158
224
|
node.completionPercentage = 100;
|
|
159
225
|
node.completionStatus = 2;
|
|
226
|
+
node.status = 2;
|
|
160
227
|
}
|
|
161
228
|
else {
|
|
162
|
-
|
|
163
|
-
node.
|
|
229
|
+
// Try both contentId and collectionId as the API response may use either field
|
|
230
|
+
const nodeEnrollData = enrollment?.contentList?.find((ele) => ele?.contentId === node.identifier || ele?.collectionId === node.identifier);
|
|
231
|
+
if (enrollment && nodeEnrollData && nodeEnrollData.status < 2) {
|
|
232
|
+
node.completionPercentage = nodeEnrollData.completionPercentage || nodeEnrollData.progress || 0;
|
|
233
|
+
node.completionStatus = Number(nodeEnrollData.status) || 0;
|
|
234
|
+
node.status = Number(nodeEnrollData.status) || 0;
|
|
235
|
+
}
|
|
236
|
+
else if (enrollment && nodeEnrollData && nodeEnrollData.status === 2) {
|
|
237
|
+
node.completionPercentage = 100;
|
|
238
|
+
node.completionStatus = 2;
|
|
239
|
+
node.status = 2;
|
|
240
|
+
}
|
|
241
|
+
else if (enrollment && !nodeEnrollData) {
|
|
242
|
+
// Enrollment exists but this node is not in contentList
|
|
243
|
+
// This can happen for completed assessments - preserve their completion data from content hierarchy
|
|
244
|
+
// Only reset to 0 if there's no completion data at all
|
|
245
|
+
if (node.completionPercentage === undefined && node.completionStatus === undefined && node.status === undefined) {
|
|
246
|
+
node.completionPercentage = 0;
|
|
247
|
+
node.completionStatus = 0;
|
|
248
|
+
node.status = 0;
|
|
249
|
+
}
|
|
250
|
+
// Otherwise keep existing values from content hierarchy
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
// No enrollment at all - reset to 0
|
|
254
|
+
node.completionPercentage = 0;
|
|
255
|
+
node.completionStatus = 0;
|
|
256
|
+
node.status = 0;
|
|
257
|
+
}
|
|
164
258
|
}
|
|
165
259
|
}
|
|
166
260
|
updateCourseProgress(course, parentContentIdentifier, enrollmentListData) {
|
|
167
|
-
console.log(`Updating course progress for ${course.identifier} (${course.name})`);
|
|
168
261
|
const enrollment = this.findEnrollment(enrollmentListData, course?.identifier);
|
|
169
|
-
console.log(`Course ${course.identifier} enrollment:`, enrollment);
|
|
170
262
|
if (enrollment?.completionPercentage === 100) {
|
|
171
263
|
// Enrollment shows 100% - mark course as complete
|
|
172
264
|
course.completionPercentage = 100;
|
|
173
265
|
course.completionStatus = 2;
|
|
174
|
-
|
|
175
|
-
|
|
266
|
+
if (enrollment.issuedCertificates.length > 0) {
|
|
267
|
+
const certificate = enrollment.issuedCertificates.sort((a, b) => new Date(a.lastIssuedOn).getTime() - new Date(b.lastIssuedOn).getTime());
|
|
268
|
+
const certId = certificate[0].identifier;
|
|
269
|
+
course.issuedCertificatesId = certId;
|
|
270
|
+
}
|
|
176
271
|
this.tocSvc.mapCompletionChildPercentageProgram(course);
|
|
177
272
|
}
|
|
178
273
|
else if (enrollment && enrollment.completionPercentage > 0) {
|
|
179
274
|
// Enrollment has partial progress
|
|
180
275
|
course.completionPercentage = enrollment.completionPercentage || 0;
|
|
181
276
|
course.completionStatus = 1;
|
|
182
|
-
course.status = 1;
|
|
183
|
-
console.log(`Course ${course.identifier} has partial progress: ${course.completionPercentage}%`);
|
|
184
277
|
// Also update children
|
|
185
278
|
if (course.children && course.children.length > 0) {
|
|
186
279
|
course.children.forEach((child) => {
|
|
187
|
-
|
|
280
|
+
// If child is a module, update its children (resources) as well
|
|
281
|
+
if (child.primaryCategory === NsContent.EPrimaryCategory.MODULE && child.children && child.children.length > 0) {
|
|
282
|
+
child.children.forEach((resource) => {
|
|
283
|
+
this.updateNodeProgress(resource, enrollment);
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
this.updateNodeProgress(child, enrollment);
|
|
288
|
+
}
|
|
188
289
|
});
|
|
189
290
|
}
|
|
190
291
|
}
|
|
@@ -193,8 +294,19 @@ export class AppTocV2Service {
|
|
|
193
294
|
let totalLeafNodes = course.leafNodesCount || 0;
|
|
194
295
|
let totalCompleted = 0;
|
|
195
296
|
course.children.forEach((child) => {
|
|
196
|
-
|
|
197
|
-
if (child.
|
|
297
|
+
// If child is a module, update its children (resources) as well
|
|
298
|
+
if (child.primaryCategory === NsContent.EPrimaryCategory.MODULE && child.children && child.children.length > 0) {
|
|
299
|
+
child.children.forEach((resource) => {
|
|
300
|
+
this.updateNodeProgress(resource, enrollment);
|
|
301
|
+
if (resource.completionStatus === 2 || resource.completionPercentage === 100) {
|
|
302
|
+
totalCompleted += resource.leafNodesCount || 1;
|
|
303
|
+
}
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
this.updateNodeProgress(child, enrollment);
|
|
308
|
+
}
|
|
309
|
+
if (child.completionStatus === 2 || child.completionPercentage === 100) {
|
|
198
310
|
totalCompleted += child.leafNodesCount || 1;
|
|
199
311
|
}
|
|
200
312
|
});
|
|
@@ -204,14 +316,40 @@ export class AppTocV2Service {
|
|
|
204
316
|
totalLeafNodes = course.children.reduce((acc, curr) => acc + (curr.leafNodesCount || 1), 0);
|
|
205
317
|
}
|
|
206
318
|
if (totalLeafNodes > 0) {
|
|
207
|
-
|
|
208
|
-
course.
|
|
209
|
-
course.
|
|
319
|
+
const calculatedPercentage = Math.round((totalCompleted / totalLeafNodes) * 100);
|
|
320
|
+
course.completionPercentage = isNaN(calculatedPercentage) ? 0 : calculatedPercentage;
|
|
321
|
+
course.completionStatus = Number(course.completionPercentage === 100 ? 2 : (course.completionPercentage > 0 ? 1 : 0));
|
|
210
322
|
}
|
|
211
323
|
}
|
|
212
324
|
}
|
|
213
325
|
}
|
|
214
|
-
|
|
326
|
+
}
|
|
327
|
+
getCompletedLeafNodesCount(node) {
|
|
328
|
+
let completedCount = 0;
|
|
329
|
+
// If it's a leaf node (resource)
|
|
330
|
+
if (!node.children || node.children.length === 0) {
|
|
331
|
+
const isCompleted = node.status === 2 || node.completionStatus === 2 || node.completionPercentage >= 100;
|
|
332
|
+
return isCompleted ? (node.leafNodesCount || 1) : 0;
|
|
333
|
+
}
|
|
334
|
+
// If it has children, recursively count completed leaf nodes
|
|
335
|
+
node.children.forEach((child) => {
|
|
336
|
+
if (child.primaryCategory === NsContent.EPrimaryCategory.MODULE && child.children) {
|
|
337
|
+
// Module - recurse through its children
|
|
338
|
+
completedCount += this.getCompletedLeafNodesCount(child);
|
|
339
|
+
}
|
|
340
|
+
else if (!child.children || child.children.length === 0) {
|
|
341
|
+
// Resource (leaf node)
|
|
342
|
+
const isCompleted = child.status === 2 || child.completionStatus === 2 || child.completionPercentage >= 100;
|
|
343
|
+
if (isCompleted) {
|
|
344
|
+
completedCount += child.leafNodesCount || 1;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
else {
|
|
348
|
+
// Other collection type - recurse
|
|
349
|
+
completedCount += this.getCompletedLeafNodesCount(child);
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
return completedCount;
|
|
215
353
|
}
|
|
216
354
|
findEnrollment(enrollmentList, identifier) {
|
|
217
355
|
if (!enrollmentList || !enrollmentList.length)
|
|
@@ -227,4 +365,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
227
365
|
providedIn: 'root'
|
|
228
366
|
}]
|
|
229
367
|
}], ctorParameters: function () { return [{ type: i1.AppTocService }]; } });
|
|
230
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy12Mi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3NlcnZpY2VzL2FwcC10b2MtdjIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFLM0MsTUFBTSxPQUFPLGVBQWU7SUFFMUIsWUFBb0IsTUFBcUI7UUFBckIsV0FBTSxHQUFOLE1BQU0sQ0FBZTtJQUFJLENBQUM7SUFFOUMsc0JBQXNCLENBQUMsZUFBb0I7UUFDekMsSUFBSSxnQkFBZ0IsR0FBUSxFQUFFLEdBQUcsZUFBZSxFQUFFLENBQUE7UUFDbEQsSUFBSSxTQUFTLEdBQWEsRUFBRSxDQUFBO1FBQzVCLElBQUksZ0JBQWdCLENBQUMsNkJBQTZCLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzlILGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQTtZQUNqQyxtRUFBbUU7WUFDbkUsZ0JBQWdCLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFBO1lBQ3BGLDhEQUE4RDtZQUM5RCxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUE7WUFDdEUsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQTtZQUNsRixTQUFTLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxxQkFBcUIsSUFBSSxlQUFlLEVBQUUsMkJBQTJCLEVBQUUsVUFBVSxDQUFDLENBQUE7U0FDbkg7UUFFRCxpREFBaUQ7UUFDakQsaUZBQWlGO1FBQ2pG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QWMsQ0FBQyxjQUFtQixFQUFFLFVBQWtCO1FBQzVELElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBQzFELE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxVQUFVLElBQUksRUFBRSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsQ0FBQTtJQUN4RyxDQUFDOytHQXJPVSxlQUFlO21IQUFmLGVBQWUsY0FGZCxNQUFNOzs0RkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuL2FwcC10b2Muc2VydmljZSc7XG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBcHBUb2NWMlNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlKSB7IH1cblxuICBjb25zdHJ1Y3RIZWlyYXJjaHlEYXRhKGNvbnRlbnRSZWFkRGF0YTogYW55KTogYW55IHtcbiAgICBsZXQgY29udGVudEhlaXJhcmNoeTogYW55ID0geyAuLi5jb250ZW50UmVhZERhdGEgfVxuICAgIGxldCBsZWFmTm9kZXM6IHN0cmluZ1tdID0gW11cbiAgICBpZiAoY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10gJiYgT2JqZWN0LmtleXMoY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10pLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10gPSBbXVxuICAgICAgLy8gU2V0IHBhcmVudCByZWZlcmVuY2UgZm9yIHByZWxpbWluYXJ5IGFzc2Vzc21lbnQgKHByZS1hc3Nlc3NtZW50KVxuICAgICAgY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10ucGFyZW50ID0gY29udGVudEhlaXJhcmNoeS5pZGVudGlmaWVyXG4gICAgICAvLyBNYXJrIHRoaXMgYXMgdGhlIHByZS1hc3Nlc3NtZW50IGZvciBtaWxlc3RvbmUgbG9ja2luZyBsb2dpY1xuICAgICAgY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10uaXNQcmVBc3Nlc3NtZW50ID0gdHJ1ZVxuICAgICAgY29udGVudEhlaXJhcmNoeVsnY2hpbGRyZW4nXS5wdXNoKGNvbnRlbnRIZWlyYXJjaHlbJ3ByZWxpbWluYXJ5QXNzZXNzbWVudERldGFpbCddKVxuICAgICAgbGVhZk5vZGVzLnB1c2goY29udGVudFJlYWREYXRhPy5wcmVsaW1pbmFyeUFzc2Vzc21lbnQgfHwgY29udGVudFJlYWREYXRhPy5wcmVsaW1pbmFyeUFzc2Vzc21lbnREZXRhaWw/LmlkZW50aWZpZXIpXG4gICAgfVxuXG4gICAgLy8gVHJhY2sgbWlsZXN0b25lIGluZGV4IGZvciBwcm9wZXIgbG9ja2luZyBsb2dpY1xuICAgIC8vIEFsbCBtaWxlc3RvbmVzIGFyZSBsb2NrZWQgYnkgZGVmYXVsdCAtIHVubG9ja2luZyBpcyBjb21wdXRlZCBiYXNlZCBvbiBwcm9ncmVzc1xuICAgIGxldCBtaWxlc3RvbmVJbmRleCA9IDBcbiAgICBjb250ZW50SGVpcmFyY2h5WydtaWxlc3RvbmVzX3YxJ10uZm9yRWFjaCgobWlsZXN0b25lOiBhbnkpID0+IHtcbiAgICAgIC8vIEFsbCBtaWxlc3RvbmVzIGFyZSBsb2NrZWQgYnkgZGVmYXVsdFxuICAgICAgLy8gTTEgdW5sb2NrcyB3aGVuIHByZS1hc3Nlc3NtZW50IGlzIGNvbXBsZXRlZFxuICAgICAgLy8gTTIrIHVubG9jayB3aGVuIHByZXZpb3VzIG1pbGVzdG9uZSdzIG1hbmRhdG9yeSBjb250ZW50ICsgYXNzZXNzbWVudCBhcmUgY29tcGxldGVkXG4gICAgICBjb25zdCBzaG91bGRCZUxvY2tlZCA9IHRydWVcblxuICAgICAgbGV0IG1pbGVTdG9uZURhdGE6IGFueSA9IHtcbiAgICAgICAgXCJpZGVudGlmaWVyXCI6IG1pbGVzdG9uZS5pZCxcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBtaWxlc3RvbmUuZGVzY3JpcHRpb24sXG4gICAgICAgIFwibWltZVR5cGVcIjogXCJhcHBsaWNhdGlvbi92bmQuZWtzdGVwLmNvbnRlbnQtY29sbGVjdGlvblwiLFxuICAgICAgICBcImR1cmF0aW9uXCI6IFwiMzYwMFwiLFxuICAgICAgICBcInByaW1hcnlDYXRlZ29yeVwiOiBcIk1pbGVzdG9uZVwiLFxuICAgICAgICBcImNvdXJzZUNhdGVnb3J5XCI6IFwiTWlsZXN0b25lXCIsXG4gICAgICAgIFwiY3JlYXRlZEJ5XCI6IFwiMjUzMTFhNGYtZmE0Mi00Y2Y3LTg4MmEtNWU3OTE5OGVkZmNiXCIsXG4gICAgICAgIFwibmFtZVwiOiBtaWxlc3RvbmUubmFtZSxcbiAgICAgICAgXCJjb250ZW50VHlwZVwiOiBcIkNvdXJzZVwiLFxuICAgICAgICBcImlzTG9ja2VkXCI6IHNob3VsZEJlTG9ja2VkLFxuICAgICAgICBcIm1pbGVzdG9uZUluZGV4XCI6IG1pbGVzdG9uZUluZGV4LFxuICAgICAgICBcInN0YXR1c1wiOiBcIkxpdmVcIixcbiAgICAgICAgXCJsZWFmTm9kZXNcIjogW10sXG4gICAgICAgIC8vIFByZS1jb21wdXRlZCBmbGFncyBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uXG4gICAgICAgIFwiaXNNaWxlc3RvbmVcIjogdHJ1ZSxcbiAgICAgICAgXCJpc0NvbGxlY3Rpb25cIjogdHJ1ZSxcbiAgICAgICAgXCJpc01vZHVsZVwiOiBmYWxzZSxcbiAgICAgICAgXCJpc1Jlc291cmNlXCI6IGZhbHNlLFxuICAgICAgICBcImlzTGVhcm5pbmdQYXRod2F5XCI6IGZhbHNlLFxuICAgICAgICBcInBhcmVudFwiOiBjb250ZW50SGVpcmFyY2h5LmlkZW50aWZpZXJcbiAgICAgIH1cbiAgICAgIG1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ10gPSBbXVxuICAgICAgaWYgKG1pbGVzdG9uZT8uY291cnNlcyAmJiBtaWxlc3RvbmU/LmNvdXJzZXM/Lmxlbmd0aCkge1xuICAgICAgICBtaWxlc3RvbmUuY291cnNlcy5mb3JFYWNoKChtaWxlU3RvbmVDb3Vyc2U6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIFNldCBwYXJlbnQgcmVmZXJlbmNlIGZvciBjb3Vyc2VzIGluc2lkZSBtaWxlc3RvbmVcbiAgICAgICAgICBtaWxlU3RvbmVDb3Vyc2UucGFyZW50ID0gbWlsZXN0b25lLmlkXG4gICAgICAgICAgbGVhZk5vZGVzID0gWy4uLmxlYWZOb2RlcywgLi4ubWlsZVN0b25lQ291cnNlLmxlYWZOb2Rlc11cbiAgICAgICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXMnXSA9IFsuLi5taWxlU3RvbmVEYXRhPy5sZWFmTm9kZXMsIC4uLm1pbGVTdG9uZUNvdXJzZS5sZWFmTm9kZXNdXG4gICAgICAgICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YShtaWxlU3RvbmVDb3Vyc2UpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAobWlsZXN0b25lPy5hc3Nlc3NtZW50RGV0YWlsKSB7XG4gICAgICAgIC8vIFNldCBwYXJlbnQgcmVmZXJlbmNlIGZvciBhc3Nlc3NtZW50IGluc2lkZSBtaWxlc3RvbmVcbiAgICAgICAgbWlsZXN0b25lLmFzc2Vzc21lbnREZXRhaWwucGFyZW50ID0gbWlsZXN0b25lLmlkXG4gICAgICAgIGxlYWZOb2Rlcy5wdXNoKG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbD8uaWRlbnRpZmllcilcbiAgICAgICAgbWlsZVN0b25lRGF0YVsnbGVhZk5vZGVzJ10gPSBbLi4ubWlsZVN0b25lRGF0YT8ubGVhZk5vZGVzLCBtaWxlc3RvbmU/LmFzc2Vzc21lbnREZXRhaWw/LmlkZW50aWZpZXJdXG4gICAgICAgIG1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ10ucHVzaChtaWxlc3RvbmU/LmFzc2Vzc21lbnREZXRhaWwpXG4gICAgICB9XG4gICAgICBtaWxlU3RvbmVEYXRhWydjaGlsZHJlbiddID0gWy4uLm1pbGVzdG9uZVsnY291cnNlcyddLCAuLi5taWxlU3RvbmVEYXRhWydjaGlsZHJlbiddXVxuICAgICAgbWlsZVN0b25lRGF0YVsnbGVhZk5vZGVzQ291bnQnXSA9IG1pbGVTdG9uZURhdGFbJ2xlYWZOb2RlcyddLmxlbmd0aFxuICAgICAgY29udGVudEhlaXJhcmNoeVsnY2hpbGRyZW4nXSA9IGNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10gPyBbLi4uY29udGVudEhlaXJhcmNoeVsnY2hpbGRyZW4nXSwgbWlsZVN0b25lRGF0YV0gOiBbbWlsZVN0b25lRGF0YV1cblxuICAgICAgbWlsZXN0b25lSW5kZXgrK1xuICAgIH0pXG4gICAgY29udGVudEhlaXJhcmNoeVsnbGVhZk5vZGVzJ10gPSBbLi4ubGVhZk5vZGVzXVxuICAgIHJldHVybiBjb250ZW50SGVpcmFyY2h5XG4gIH1cblxuXG4gIG1hcENvbnRlbnRIaWVyYXJjaHlQcm9ncmVzc1VwZGF0ZShjb250ZW50SGVpcmFyY2h5RGF0YTogYW55LCBlbnJvbGxtZW50TGlzdERhdGE6IGFueSkge1xuICAgIGlmIChjb250ZW50SGVpcmFyY2h5RGF0YSAmJiBjb250ZW50SGVpcmFyY2h5RGF0YS5jaGlsZHJlbikge1xuICAgICAgbGV0IHRvdGFsTGVhZk5vZGVzID0gMFxuICAgICAgbGV0IHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzID0gMFxuXG4gICAgICBjb250ZW50SGVpcmFyY2h5RGF0YS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdNaWxlc3RvbmUnKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVNaWxlc3RvbmVQcm9ncmVzcyhjaGlsZCwgY29udGVudEhlaXJhcmNoeURhdGE/LmlkZW50aWZpZXIsIGVucm9sbG1lbnRMaXN0RGF0YSlcbiAgICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAwXG4gICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gY2hpbGQuY29tcGxldGVkTGVhZk5vZGVzQ291bnQgfHwgMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZvciBwcmUtYXNzZXNzbWVudCBhbmQgb3RoZXIgcm9vdC1sZXZlbCBjb250ZW50XG4gICAgICAgICAgY29uc3QgZW5yb2xsbWVudCA9IHRoaXMuZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3REYXRhLCBjb250ZW50SGVpcmFyY2h5RGF0YT8uaWRlbnRpZmllcilcbiAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVQcm9ncmVzcyhjaGlsZCwgZW5yb2xsbWVudClcbiAgICAgICAgICBjb25zb2xlLmxvZyhgUHJlLWFzc2Vzc21lbnQgcHJvZ3Jlc3MgdXBkYXRlZDogJHtjaGlsZC5pZGVudGlmaWVyfSAoJHtjaGlsZC5uYW1lfSksIFN0YXR1czogJHtjaGlsZC5jb21wbGV0aW9uU3RhdHVzfSwgUGVyY2VudGFnZTogJHtjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZX1gKVxuICAgICAgICAgIGNvbnN0IGlzQ29tcGxldGVkID0gY2hpbGQuc3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMFxuICAgICAgICAgIHRvdGFsTGVhZk5vZGVzICs9IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IDFcbiAgICAgICAgICB0b3RhbENvbXBsZXRlZExlYWZOb2RlcyArPSBpc0NvbXBsZXRlZCA/IChjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAxKSA6IDBcbiAgICAgICAgfVxuICAgICAgfSlcblxuICAgICAgaWYgKHRvdGFsTGVhZk5vZGVzID4gMCkge1xuICAgICAgICBjb250ZW50SGVpcmFyY2h5RGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgICBjb250ZW50SGVpcmFyY2h5RGF0YS5jb21wbGV0aW9uU3RhdHVzID0gY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAxXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50SGVpcmFyY2h5RGF0YVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNaWxlc3RvbmVQcm9ncmVzcyhtaWxlc3RvbmU6IGFueSwgcGFyZW50Q29udGVudElkZW50aWZpZXI6IHN0cmluZywgZW5yb2xsbWVudExpc3REYXRhOiBhbnkpIHtcbiAgICBsZXQgdG90YWxMZWFmTm9kZXMgPSAwXG4gICAgbGV0IHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzID0gMFxuICAgIGxldCBjb21wbGV0ZWRDb3Vyc2VzID0gMFxuICAgIGxldCB0b3RhbENvdXJzZXMgPSAwXG5cbiAgICBpZiAobWlsZXN0b25lLmNoaWxkcmVuKSB7XG4gICAgICBtaWxlc3RvbmUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlJykge1xuICAgICAgICAgIHRvdGFsQ291cnNlcyArPSAxXG4gICAgICAgICAgZGVidWdnZXJcbiAgICAgICAgICBpZiAoY2hpbGQ/LmlkZW50aWZpZXIgPT09IFwiZG9fMTE0NDgyMzExNDc2NzQwMDk2MTU0XCIpIHtcbiAgICAgICAgICAgIGRlYnVnZ2VyXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlQ291cnNlUHJvZ3Jlc3MoY2hpbGQsIHBhcmVudENvbnRlbnRJZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGEpXG4gICAgICAgICAgLy8gQ2hlY2sgYm90aCBzdGF0dXMgYW5kIGNvbXBsZXRpb25TdGF0dXMgZm9yIGNvbXBsZXRpb25cbiAgICAgICAgICBpZiAoY2hpbGQuc3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwKSB7XG4gICAgICAgICAgICBjb21wbGV0ZWRDb3Vyc2VzICs9IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRm9yIGFzc2Vzc21lbnRzIGFuZCBvdGhlciBjb250ZW50LCB0cnkgbXVsdGlwbGUgZW5yb2xsbWVudCBzb3VyY2VzXG4gICAgICAgICAgLy8gRmlyc3QgdHJ5IHBhcmVudCBMZWFybmluZyBQYXRod2F5IGVucm9sbG1lbnRcbiAgICAgICAgICBsZXQgZW5yb2xsbWVudCA9IHRoaXMuZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3REYXRhLCBwYXJlbnRDb250ZW50SWRlbnRpZmllcilcbiAgICAgICAgICBpZiAoIWVucm9sbG1lbnQpIHtcbiAgICAgICAgICAgIC8vIFRyeSBtaWxlc3RvbmUgZW5yb2xsbWVudFxuICAgICAgICAgICAgZW5yb2xsbWVudCA9IHRoaXMuZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3REYXRhLCBtaWxlc3RvbmU/LmlkZW50aWZpZXIpXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudXBkYXRlTm9kZVByb2dyZXNzKGNoaWxkLCBlbnJvbGxtZW50KVxuICAgICAgICAgIGNvbnNvbGUubG9nKGBBc3Nlc3NtZW50L090aGVyIHByb2dyZXNzIHVwZGF0ZWQ6ICR7Y2hpbGQuaWRlbnRpZmllcn0gKCR7Y2hpbGQubmFtZX0pLCBTdGF0dXM6ICR7Y2hpbGQuY29tcGxldGlvblN0YXR1c30sIFBlcmNlbnRhZ2U6ICR7Y2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2V9YClcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxlYWZOb2RlcyA9IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IDFcbiAgICAgICAgdG90YWxMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXG4gICAgICAgIC8vIENoZWNrIGJvdGggc3RhdHVzIGFuZCBjb21wbGV0aW9uU3RhdHVzIGZvciBjb21wbGV0aW9uXG4gICAgICAgIGlmIChjaGlsZC5zdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDApIHtcbiAgICAgICAgICB0b3RhbENvbXBsZXRlZExlYWZOb2RlcyArPSBsZWFmTm9kZXNcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICBtaWxlc3RvbmUubGVhZk5vZGVzQ291bnQgPSB0b3RhbExlYWZOb2Rlc1xuICAgIG1pbGVzdG9uZS5jb21wbGV0ZWRMZWFmTm9kZXNDb3VudCA9IHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzXG4gICAgbWlsZXN0b25lLnRvdGFsQ291cnNlcyA9IHRvdGFsQ291cnNlc1xuICAgIG1pbGVzdG9uZS5jb21wbGV0ZWRDb3Vyc2VzID0gY29tcGxldGVkQ291cnNlc1xuXG4gICAgaWYgKHRvdGFsTGVhZk5vZGVzID4gMCkge1xuICAgICAgbWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID0gTWF0aC5yb3VuZCgodG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgLyB0b3RhbExlYWZOb2RlcykgKiAxMDApXG4gICAgICBtaWxlc3RvbmUuY29tcGxldGlvblN0YXR1cyA9IG1pbGVzdG9uZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwID8gMiA6IDFcbiAgICAgIG1pbGVzdG9uZS5zdGF0dXMgPSBtaWxlc3RvbmUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAxXG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYE1pbGVzdG9uZSAke21pbGVzdG9uZS5pZGVudGlmaWVyfSAoJHttaWxlc3RvbmUubmFtZX0pIHByb2dyZXNzIHVwZGF0ZWQ6ICR7dG90YWxDb21wbGV0ZWRMZWFmTm9kZXN9LyR7dG90YWxMZWFmTm9kZXN9ID0gJHttaWxlc3RvbmUuY29tcGxldGlvblBlcmNlbnRhZ2V9JSwgc3RhdHVzOiAke21pbGVzdG9uZS5zdGF0dXN9LCBjb21wbGV0aW9uU3RhdHVzOiAke21pbGVzdG9uZS5jb21wbGV0aW9uU3RhdHVzfWApXG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZU5vZGVQcm9ncmVzcyhub2RlOiBhbnksIGVucm9sbG1lbnQ6IGFueSkge1xuXG4gICAgY29uc3Qgbm9kZUVucm9sbERhdGEgPSBlbnJvbGxtZW50Py5jb250ZW50TGlzdD8uZmluZCgoZWxlOiBhbnkpID0+IGVsZT8uY29udGVudElkID09PSBub2RlLmlkZW50aWZpZXIpXG4gICAgaWYgKGVucm9sbG1lbnQgJiYgbm9kZUVucm9sbERhdGEgJiYgbm9kZUVucm9sbERhdGEuc3RhdHVzIDwgMikge1xuICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IG5vZGVFbnJvbGxEYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IG5vZGVFbnJvbGxEYXRhLnByb2dyZXNzIHx8IDBcbiAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IG5vZGVFbnJvbGxEYXRhLnN0YXR1c1xuICAgIH0gZWxzZSBpZiAoZW5yb2xsbWVudCAmJiBub2RlRW5yb2xsRGF0YSAmJiBub2RlRW5yb2xsRGF0YS5zdGF0dXMgPT09IDIpIHtcbiAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IDJcbiAgICB9IGVsc2Uge1xuICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IDBcbiAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IDBcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUNvdXJzZVByb2dyZXNzKGNvdXJzZTogYW55LCBwYXJlbnRDb250ZW50SWRlbnRpZmllciwgZW5yb2xsbWVudExpc3REYXRhOiBhbnkpIHtcbiAgICBjb25zb2xlLmxvZyhgVXBkYXRpbmcgY291cnNlIHByb2dyZXNzIGZvciAke2NvdXJzZS5pZGVudGlmaWVyfSAoJHtjb3Vyc2UubmFtZX0pYClcbiAgICBjb25zdCBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIGNvdXJzZT8uaWRlbnRpZmllcilcbiAgICBjb25zb2xlLmxvZyhgQ291cnNlICR7Y291cnNlLmlkZW50aWZpZXJ9IGVucm9sbG1lbnQ6YCwgZW5yb2xsbWVudClcblxuICAgIGlmIChlbnJvbGxtZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XG4gICAgICAvLyBFbnJvbGxtZW50IHNob3dzIDEwMCUgLSBtYXJrIGNvdXJzZSBhcyBjb21wbGV0ZVxuICAgICAgY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gMTAwXG4gICAgICBjb3Vyc2UuY29tcGxldGlvblN0YXR1cyA9IDJcbiAgICAgIGNvdXJzZS5zdGF0dXMgPSAyXG4gICAgICBjb25zb2xlLmxvZyhgQ291cnNlICR7Y291cnNlLmlkZW50aWZpZXJ9IG1hcmtlZCAxMDAlIGNvbXBsZXRlIGZyb20gZW5yb2xsbWVudGApXG4gICAgICB0aGlzLnRvY1N2Yy5tYXBDb21wbGV0aW9uQ2hpbGRQZXJjZW50YWdlUHJvZ3JhbShjb3Vyc2UpXG4gICAgfSBlbHNlIGlmIChlbnJvbGxtZW50ICYmIGVucm9sbG1lbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPiAwKSB7XG4gICAgICAvLyBFbnJvbGxtZW50IGhhcyBwYXJ0aWFsIHByb2dyZXNzXG4gICAgICBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IDBcbiAgICAgIGNvdXJzZS5jb21wbGV0aW9uU3RhdHVzID0gMVxuICAgICAgY291cnNlLnN0YXR1cyA9IDFcbiAgICAgIGNvbnNvbGUubG9nKGBDb3Vyc2UgJHtjb3Vyc2UuaWRlbnRpZmllcn0gaGFzIHBhcnRpYWwgcHJvZ3Jlc3M6ICR7Y291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlfSVgKVxuICAgICAgLy8gQWxzbyB1cGRhdGUgY2hpbGRyZW5cbiAgICAgIGlmIChjb3Vyc2UuY2hpbGRyZW4gJiYgY291cnNlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY291cnNlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVQcm9ncmVzcyhjaGlsZCwgZW5yb2xsbWVudClcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGNvdXJzZS5jaGlsZHJlbiAmJiBjb3Vyc2UuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICBsZXQgdG90YWxMZWFmTm9kZXMgPSBjb3Vyc2UubGVhZk5vZGVzQ291bnQgfHwgMFxuICAgICAgICBsZXQgdG90YWxDb21wbGV0ZWQgPSAwXG5cbiAgICAgICAgY291cnNlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVQcm9ncmVzcyhjaGlsZCwgZW5yb2xsbWVudClcbiAgICAgICAgICBpZiAoY2hpbGQuc3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICAgICAgdG90YWxDb21wbGV0ZWQgKz0gY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICAvLyBJZiBpdCdzIGEgY29sbGVjdGlvbiBhbmQgZG9lc24ndCBoYXZlIGl0cyBvd24gZW5yb2xsbWVudCBwcm9ncmVzcywgY2FsY3VsYXRlIGl0XG4gICAgICAgIGlmICghZW5yb2xsbWVudCB8fCAhY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMCkge1xuICAgICAgICAgIGlmICghdG90YWxMZWFmTm9kZXMpIHtcbiAgICAgICAgICAgIHRvdGFsTGVhZk5vZGVzID0gY291cnNlLmNoaWxkcmVuLnJlZHVjZSgoYWNjOiBudW1iZXIsIGN1cnI6IGFueSkgPT4gYWNjICsgKGN1cnIubGVhZk5vZGVzQ291bnQgfHwgMSksIDApXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0b3RhbExlYWZOb2RlcyA+IDApIHtcbiAgICAgICAgICAgIGNvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgICAgICAgY291cnNlLmNvbXBsZXRpb25TdGF0dXMgPSBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAoY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKVxuICAgICAgICAgICAgY291cnNlLnN0YXR1cyA9IGNvdXJzZS5jb21wbGV0aW9uU3RhdHVzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBDb3Vyc2UgJHtjb3Vyc2UuaWRlbnRpZmllcn0gZmluYWw6IGNvbXBsZXRpb25QZXJjZW50YWdlPSR7Y291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlfSwgY29tcGxldGlvblN0YXR1cz0ke2NvdXJzZS5jb21wbGV0aW9uU3RhdHVzfSwgc3RhdHVzPSR7Y291cnNlLnN0YXR1c31gKVxuICB9XG5cbiAgcHJpdmF0ZSBmaW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdDogYW55LCBpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICBpZiAoIWVucm9sbG1lbnRMaXN0IHx8ICFlbnJvbGxtZW50TGlzdC5sZW5ndGgpIHJldHVybiBudWxsXG4gICAgcmV0dXJuIGVucm9sbG1lbnRMaXN0LmZpbmQoKGVsOiBhbnkpID0+IGVsLmNvbGxlY3Rpb25JZCA9PT0gaWRlbnRpZmllciB8fCBlbC5jb250ZW50SWQgPT09IGlkZW50aWZpZXIpXG4gIH1cblxuXG5cbn1cblxuIl19
|
|
368
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy12Mi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3NlcnZpY2VzL2FwcC10b2MtdjIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7O0FBSWpELE1BQU0sT0FBTyxlQUFlO0lBRTFCLFlBQW9CLE1BQXFCO1FBQXJCLFdBQU0sR0FBTixNQUFNLENBQWU7SUFBSSxDQUFDO0lBRTlDLHNCQUFzQixDQUFDLGVBQW9CO1FBQ3pDLElBQUksZ0JBQWdCLEdBQVEsRUFBRSxHQUFHLGVBQWUsRUFBRSxDQUFBO1FBQ2xELElBQUksU0FBUyxHQUFhLEVBQUUsQ0FBQTtRQUM1QixJQUFJLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUM5SCxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDakMsbUVBQW1FO1lBQ25FLGdCQUFnQixDQUFDLDZCQUE2QixDQUFDLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQTtZQUNwRiw4REFBOEQ7WUFDOUQsZ0JBQWdCLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO1lBR3RFLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUE7WUFDbEYsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUscUJBQXFCLElBQUksZUFBZSxFQUFFLDJCQUEyQixFQUFFLFVBQVUsQ0FB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QUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN6RCx1QkFBdUI7Z0JBQ3ZCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLEdBQUcsQ0FBQTtnQkFDM0csSUFBSSxXQUFXLEVBQUU7b0JBQ2YsY0FBYyxJQUFJLEtBQUssQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFBO2lCQUM1QzthQUNGO2lCQUFNO2dCQUNMLGtDQUFrQztnQkFDbEMsY0FBYyxJQUFJLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUN6RDtRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsT0FBTyxjQUFjLENBQUE7SUFDdkIsQ0FBQztJQUVPLGNBQWMsQ0FBQyxjQUFtQixFQUFFLFVBQWtCO1FBQzVELElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBQzFELE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxVQUFVLElBQUksRUFBRSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsQ0FBQTtJQUN4RyxDQUFDOytHQXBZVSxlQUFlO21IQUFmLGVBQWUsY0FGZCxNQUFNOzs0RkFFUCxlQUFlO2tCQUgzQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuL2FwcC10b2Muc2VydmljZSc7XG5pbXBvcnQgeyBOc0NvbnRlbnQgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12Mic7XG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBBcHBUb2NWMlNlcnZpY2Uge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlKSB7IH1cblxuICBjb25zdHJ1Y3RIZWlyYXJjaHlEYXRhKGNvbnRlbnRSZWFkRGF0YTogYW55KTogYW55IHtcbiAgICBsZXQgY29udGVudEhlaXJhcmNoeTogYW55ID0geyAuLi5jb250ZW50UmVhZERhdGEgfVxuICAgIGxldCBsZWFmTm9kZXM6IHN0cmluZ1tdID0gW11cbiAgICBpZiAoY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10gJiYgT2JqZWN0LmtleXMoY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10pLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10gPSBbXVxuICAgICAgLy8gU2V0IHBhcmVudCByZWZlcmVuY2UgZm9yIHByZWxpbWluYXJ5IGFzc2Vzc21lbnQgKHByZS1hc3Nlc3NtZW50KVxuICAgICAgY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10ucGFyZW50ID0gY29udGVudEhlaXJhcmNoeS5pZGVudGlmaWVyXG4gICAgICAvLyBNYXJrIHRoaXMgYXMgdGhlIHByZS1hc3Nlc3NtZW50IGZvciBtaWxlc3RvbmUgbG9ja2luZyBsb2dpY1xuICAgICAgY29udGVudEhlaXJhcmNoeVsncHJlbGltaW5hcnlBc3Nlc3NtZW50RGV0YWlsJ10uaXNQcmVBc3Nlc3NtZW50ID0gdHJ1ZVxuICAgICAgXG4gICAgIFxuICAgICAgY29udGVudEhlaXJhcmNoeVsnY2hpbGRyZW4nXS5wdXNoKGNvbnRlbnRIZWlyYXJjaHlbJ3ByZWxpbWluYXJ5QXNzZXNzbWVudERldGFpbCddKVxuICAgICAgbGVhZk5vZGVzLnB1c2goY29udGVudFJlYWREYXRhPy5wcmVsaW1pbmFyeUFzc2Vzc21lbnQgfHwgY29udGVudFJlYWREYXRhPy5wcmVsaW1pbmFyeUFzc2Vzc21lbnREZXRhaWw/LmlkZW50aWZpZXIpXG4gICAgfVxuXG4gICAgLy8gVHJhY2sgbWlsZXN0b25lIGluZGV4IGZvciBwcm9wZXIgbG9ja2luZyBsb2dpY1xuICAgIC8vIEFsbCBtaWxlc3RvbmVzIGFyZSBsb2NrZWQgYnkgZGVmYXVsdCAtIHVubG9ja2luZyBpcyBjb21wdXRlZCBiYXNlZCBvbiBwcm9ncmVzc1xuICAgIGxldCBtaWxlc3RvbmVJbmRleCA9IDBcbiAgICBjb250ZW50SGVpcmFyY2h5WydtaWxlc3RvbmVzX3YxJ10uZm9yRWFjaCgobWlsZXN0b25lOiBhbnkpID0+IHtcbiAgICAgIC8vIEFsbCBtaWxlc3RvbmVzIGFyZSBsb2NrZWQgYnkgZGVmYXVsdFxuICAgICAgLy8gTTEgdW5sb2NrcyB3aGVuIHByZS1hc3Nlc3NtZW50IGlzIGNvbXBsZXRlZFxuICAgICAgLy8gTTIrIHVubG9jayB3aGVuIHByZXZpb3VzIG1pbGVzdG9uZSdzIG1hbmRhdG9yeSBjb250ZW50ICsgYXNzZXNzbWVudCBhcmUgY29tcGxldGVkXG4gICAgICBjb25zdCBzaG91bGRCZUxvY2tlZCA9IHRydWVcblxuICAgICAgbGV0IG1pbGVTdG9uZURhdGE6IGFueSA9IHtcbiAgICAgICAgXCJpZGVudGlmaWVyXCI6IG1pbGVzdG9uZS5pZCxcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBtaWxlc3RvbmUuZGVzY3JpcHRpb24sXG4gICAgICAgIFwibWltZVR5cGVcIjogXCJhcHBsaWNhdGlvbi92bmQuZWtzdGVwLmNvbnRlbnQtY29sbGVjdGlvblwiLFxuICAgICAgICBcImR1cmF0aW9uXCI6IFwiMFwiLFxuICAgICAgICBcInByaW1hcnlDYXRlZ29yeVwiOiBcIk1pbGVzdG9uZVwiLFxuICAgICAgICBcImNvdXJzZUNhdGVnb3J5XCI6IFwiTWlsZXN0b25lXCIsXG4gICAgICAgIFwiY3JlYXRlZEJ5XCI6IFwiMjUzMTFhNGYtZmE0Mi00Y2Y3LTg4MmEtNWU3OTE5OGVkZmNiXCIsXG4gICAgICAgIFwibmFtZVwiOiBtaWxlc3RvbmUubmFtZSxcbiAgICAgICAgXCJjb250ZW50VHlwZVwiOiBcIkNvdXJzZVwiLFxuICAgICAgICBcImlzTG9ja2VkXCI6IHNob3VsZEJlTG9ja2VkLFxuICAgICAgICBcIm1pbGVzdG9uZUluZGV4XCI6IG1pbGVzdG9uZUluZGV4LFxuICAgICAgICBcInN0YXR1c1wiOiAwLFxuICAgICAgICBcImNvbXBsZXRpb25TdGF0dXNcIjogMCxcbiAgICAgICAgXCJjb21wbGV0aW9uUGVyY2VudGFnZVwiOiAwLFxuICAgICAgICBcImxlYWZOb2Rlc1wiOiBbXSxcbiAgICAgICAgLy8gUHJlLWNvbXB1dGVkIGZsYWdzIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICAgICAgXCJpc01pbGVzdG9uZVwiOiB0cnVlLFxuICAgICAgICBcImlzQ29sbGVjdGlvblwiOiB0cnVlLFxuICAgICAgICBcImlzTW9kdWxlXCI6IGZhbHNlLFxuICAgICAgICBcImlzUmVzb3VyY2VcIjogZmFsc2UsXG4gICAgICAgIFwiaXNMZWFybmluZ1BhdGh3YXlcIjogZmFsc2UsXG4gICAgICAgIFwicGFyZW50XCI6IGNvbnRlbnRIZWlyYXJjaHkuaWRlbnRpZmllclxuICAgICAgfVxuXG4gICAgICBtaWxlU3RvbmVEYXRhWydjaGlsZHJlbiddID0gW11cbiAgICAgIGlmIChtaWxlc3RvbmU/LmNvdXJzZXMgJiYgbWlsZXN0b25lPy5jb3Vyc2VzPy5sZW5ndGgpIHtcbiAgICAgICAgbWlsZXN0b25lLmNvdXJzZXMuZm9yRWFjaCgobWlsZVN0b25lQ291cnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBTZXQgcGFyZW50IHJlZmVyZW5jZSBmb3IgY291cnNlcyBpbnNpZGUgbWlsZXN0b25lXG4gICAgICAgICAgbWlsZVN0b25lQ291cnNlLnBhcmVudCA9IG1pbGVzdG9uZS5pZFxuICAgICAgICAgIG1pbGVTdG9uZUNvdXJzZVsnbW9kdWxlQ291bnQnXSA9IDBcbiAgICAgICAgICBtaWxlU3RvbmVEYXRhWydkdXJhdGlvbiddID0gU3RyaW5nKE51bWJlcihtaWxlU3RvbmVEYXRhWydkdXJhdGlvbiddKSArIE51bWJlcihtaWxlU3RvbmVDb3Vyc2U/LmR1cmF0aW9uIHx8IDApKVxuICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUNvdW50KG1pbGVTdG9uZUNvdXJzZSlcbiAgICAgICAgICBpZiAobWlsZVN0b25lQ291cnNlICYmIG1pbGVTdG9uZUNvdXJzZT8ubGVhZk5vZGVzICYmIG1pbGVTdG9uZUNvdXJzZT8ubGVhZk5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxlYWZOb2RlcyA9IFsuLi5sZWFmTm9kZXMsIC4uLm1pbGVTdG9uZUNvdXJzZS5sZWFmTm9kZXNdXG4gICAgICAgICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXMnXSA9IFsuLi5taWxlU3RvbmVEYXRhPy5sZWFmTm9kZXMsIC4uLm1pbGVTdG9uZUNvdXJzZS5sZWFmTm9kZXNdXG5cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YShtaWxlU3RvbmVDb3Vyc2UpXG4gICAgICAgIH0pXG5cbiAgICAgIH1cbiAgICAgIGlmIChtaWxlc3RvbmU/LmFzc2Vzc21lbnREZXRhaWwpIHtcbiAgICAgICAgLy8gU2V0IHBhcmVudCByZWZlcmVuY2UgZm9yIGFzc2Vzc21lbnQgaW5zaWRlIG1pbGVzdG9uZVxuICAgICAgICBtaWxlc3RvbmUuYXNzZXNzbWVudERldGFpbC5wYXJlbnQgPSBtaWxlc3RvbmUuaWRcbiAgICAgICAgbGVhZk5vZGVzLnB1c2gobWlsZXN0b25lPy5hc3Nlc3NtZW50RGV0YWlsPy5pZGVudGlmaWVyKVxuICAgICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXMnXSA9IFsuLi5taWxlU3RvbmVEYXRhPy5sZWFmTm9kZXMsIG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbD8uaWRlbnRpZmllcl1cbiAgICAgICAgbWlsZVN0b25lRGF0YVsnY2hpbGRyZW4nXS5wdXNoKG1pbGVzdG9uZT8uYXNzZXNzbWVudERldGFpbClcbiAgICAgIH1cbiAgICAgIG1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ10gPSBbLi4ubWlsZXN0b25lWydjb3Vyc2VzJ10sIC4uLm1pbGVTdG9uZURhdGFbJ2NoaWxkcmVuJ11dXG4gICAgICBtaWxlU3RvbmVEYXRhWydsZWFmTm9kZXNDb3VudCddID0gbWlsZVN0b25lRGF0YVsnbGVhZk5vZGVzJ10ubGVuZ3RoXG4gICAgICAgIHRoaXMubWFwTW9kdWxlQ291bnQobWlsZVN0b25lRGF0YSlcbiAgICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10gPSBjb250ZW50SGVpcmFyY2h5WydjaGlsZHJlbiddID8gWy4uLmNvbnRlbnRIZWlyYXJjaHlbJ2NoaWxkcmVuJ10sIG1pbGVTdG9uZURhdGFdIDogW21pbGVTdG9uZURhdGFdXG5cbiAgICAgIG1pbGVzdG9uZUluZGV4KytcbiAgICB9KVxuICAgIGNvbnRlbnRIZWlyYXJjaHlbJ2xlYWZOb2RlcyddID0gWy4uLmxlYWZOb2Rlc11cbiAgICBjb250ZW50SGVpcmFyY2h5WydsZWFmTm9kZXNDb3VudCddID0gbGVhZk5vZGVzLmxlbmd0aFxuICAgIHJldHVybiBjb250ZW50SGVpcmFyY2h5XG4gIH1cblxuICAgbWFwTW9kdWxlQ291bnQoY29udGVudDogTnNDb250ZW50LklDb250ZW50KSB7XG4gICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnRlbnQuY2hpbGRyZW4ubWFwKGNoaWxkID0+IHtcbiAgICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICAgIGlmKGNoaWxkPy5tb2R1bGVDb3VudCkge1xuICAgICAgICAgICAgY29udGVudFsnbW9kdWxlQ291bnQnXSA9IGNvbnRlbnRbJ21vZHVsZUNvdW50J10gPyBjb250ZW50Wydtb2R1bGVDb3VudCddICsgY2hpbGQ/Lm1vZHVsZUNvdW50IDogXG4gICAgICAgICAgICBjaGlsZD8ubW9kdWxlQ291bnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG5cbiAgbWFwQ29udGVudEhpZXJhcmNoeVByb2dyZXNzVXBkYXRlKGNvbnRlbnRIZWlyYXJjaHlEYXRhOiBhbnksIGVucm9sbG1lbnRMaXN0RGF0YTogYW55KSB7XG4gICAgaWYgKGNvbnRlbnRIZWlyYXJjaHlEYXRhICYmIGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNoaWxkcmVuKSB7XG4gICAgICBsZXQgdG90YWxMZWFmTm9kZXMgPSAwXG4gICAgICBsZXQgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgPSAwXG4gICAgICBsZXQgTFBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIGNvbnRlbnRIZWlyYXJjaHlEYXRhPy5pZGVudGlmaWVyKVxuXG4gICAgICAvLyBGaXJzdCBwYXNzOiBVcGRhdGUgcHJvZ3Jlc3MgZm9yIGFsbCBjb250ZW50XG4gICAgICBjb250ZW50SGVpcmFyY2h5RGF0YS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdNaWxlc3RvbmUnKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVNaWxlc3RvbmVQcm9ncmVzcyhjaGlsZCwgY29udGVudEhlaXJhcmNoeURhdGE/LmlkZW50aWZpZXIsIGVucm9sbG1lbnRMaXN0RGF0YSlcbiAgICAgICAgICAvLyBPbmx5IGNvdW50IG1hbmRhdG9yeSBjb3Vyc2UgcmVzb3VyY2VzIGFuZCBtaWxlc3RvbmUgYXNzZXNzbWVudHNcbiAgICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBjaGlsZC5tYW5kYXRvcnlMZWFmTm9kZXNDb3VudCB8fCAwXG4gICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gY2hpbGQubWFuZGF0b3J5Q29tcGxldGVkTGVhZk5vZGVzQ291bnQgfHwgMFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZvciBwcmUtYXNzZXNzbWVudCBhbmQgb3RoZXIgcm9vdC1sZXZlbCBjb250ZW50IChhbHdheXMgY291bnQgdGhlc2UpXG4gICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgZW5yb2xsbWVudCB3aXRoIHBhcmVudCBpZGVudGlmaWVyIGZpcnN0LCB0aGVuIHdpdGggY2hpbGQncyBvd24gaWRlbnRpZmllclxuICAgICAgICAgIGxldCBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIGNvbnRlbnRIZWlyYXJjaHlEYXRhPy5pZGVudGlmaWVyKVxuICAgICAgICAgIGlmICghZW5yb2xsbWVudCkge1xuICAgICAgICAgICAgZW5yb2xsbWVudCA9IHRoaXMuZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3REYXRhLCBjaGlsZD8uaWRlbnRpZmllcilcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXG4gICAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBjaGlsZC5zdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDBcbiAgICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAxXG4gICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gaXNDb21wbGV0ZWQgPyAoY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMSkgOiAwXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZihMUGVucm9sbG1lbnQgJiYgTFBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgICAgY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblN0YXR1cyA9IDJcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0b3RhbExlYWZOb2RlcyA+IDApIHtcbiAgICAgICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKE51bWJlcih0b3RhbENvbXBsZXRlZExlYWZOb2RlcykgLyBOdW1iZXIodG90YWxMZWFmTm9kZXMpKSAqIDEwMClcbiAgICAgICAgICBjb250ZW50SGVpcmFyY2h5RGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IGlzTmFOKGNhbGN1bGF0ZWRQZXJjZW50YWdlKSA/IDAgOiBjYWxjdWxhdGVkUGVyY2VudGFnZVxuICAgICAgICAgIGNvbnRlbnRIZWlyYXJjaHlEYXRhLmNvbXBsZXRpb25TdGF0dXMgPSBOdW1iZXIoY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAoY29udGVudEhlaXJhcmNoeURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPiAwID8gMSA6IDApKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb250ZW50SGVpcmFyY2h5RGF0YVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVNaWxlc3RvbmVQcm9ncmVzcyhtaWxlc3RvbmU6IGFueSwgcGFyZW50Q29udGVudElkZW50aWZpZXI6IHN0cmluZywgZW5yb2xsbWVudExpc3REYXRhOiBhbnkpIHtcbiAgICBsZXQgdG90YWxMZWFmTm9kZXMgPSAwXG4gICAgbGV0IHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzID0gMFxuICAgIGxldCBtYW5kYXRvcnlMZWFmTm9kZXMgPSAwXG4gICAgbGV0IG1hbmRhdG9yeUNvbXBsZXRlZExlYWZOb2RlcyA9IDBcbiAgICBsZXQgY29tcGxldGVkQ291cnNlcyA9IDBcbiAgICBsZXQgdG90YWxDb3Vyc2VzID0gMFxuXG4gICAgaWYgKG1pbGVzdG9uZS5jaGlsZHJlbikge1xuICAgICAgbWlsZXN0b25lLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZScpIHtcbiAgICAgICAgICB0b3RhbENvdXJzZXMgKz0gMVxuICAgICAgICAgIHRoaXMudXBkYXRlQ291cnNlUHJvZ3Jlc3MoY2hpbGQsIHBhcmVudENvbnRlbnRJZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGEpXG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgY2hpbGRMZWFmTm9kZXMgPSBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCAxXG4gICAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBjaGlsZC5zdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDBcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDb3VudCBhbGwgY291cnNlIGxlYWYgbm9kZXMgZm9yIG92ZXJhbGwgdHJhY2tpbmdcbiAgICAgICAgICB0b3RhbExlYWZOb2RlcyArPSBjaGlsZExlYWZOb2Rlc1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICAgICAgY29tcGxldGVkQ291cnNlcyArPSAxXG4gICAgICAgICAgICB0b3RhbENvbXBsZXRlZExlYWZOb2RlcyArPSBjaGlsZExlYWZOb2Rlc1xuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgICAvLyBPbmx5IGNvdW50IG1hbmRhdG9yeSBjb3Vyc2VzIGZvciBMUCBjb21wbGV0aW9uIHBlcmNlbnRhZ2VcbiAgICAgICAgICBpZiAoY2hpbGQuaXNNYW5kYXRvcnkgPT09IHRydWUgfHwgY2hpbGQubWFuZGF0b3J5ID09PSB0cnVlKSB7XG4gICAgICAgICAgICBtYW5kYXRvcnlMZWFmTm9kZXMgKz0gY2hpbGRMZWFmTm9kZXNcbiAgICAgICAgICAgIC8vIENvdW50IGluZGl2aWR1YWwgY29tcGxldGVkIHJlc291cmNlcyB3aXRoaW4gbWFuZGF0b3J5IGNvdXJzZXNcbiAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZENvdW50ID0gdGhpcy5nZXRDb21wbGV0ZWRMZWFmTm9kZXNDb3VudChjaGlsZClcbiAgICAgICAgICAgIG1hbmRhdG9yeUNvbXBsZXRlZExlYWZOb2RlcyArPSBjb21wbGV0ZWRDb3VudFxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3IgYXNzZXNzbWVudHMgLSBhbHdheXMgY291bnQgdGhlbSBhcyBtYW5kYXRvcnlcbiAgICAgICAgICAvLyBUcnkgbXVsdGlwbGUgZW5yb2xsbWVudCBzb3VyY2VzXG4gICAgICAgICAgbGV0IGVucm9sbG1lbnQgPSB0aGlzLmZpbmRFbnJvbGxtZW50KGVucm9sbG1lbnRMaXN0RGF0YSwgcGFyZW50Q29udGVudElkZW50aWZpZXIpXG4gICAgICAgICAgaWYgKCFlbnJvbGxtZW50KSB7XG4gICAgICAgICAgICBlbnJvbGxtZW50ID0gdGhpcy5maW5kRW5yb2xsbWVudChlbnJvbGxtZW50TGlzdERhdGEsIG1pbGVzdG9uZT8uaWRlbnRpZmllcilcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3QgbGVhZk5vZGVzID0gY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMVxuICAgICAgICAgIGNvbnN0IGlzQ29tcGxldGVkID0gY2hpbGQuc3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwXG4gICAgICAgICAgXG4gICAgICAgICAgLy8gQ291bnQgYXNzZXNzbWVudHMgaW4gYm90aCB0b3RhbCBhbmQgbWFuZGF0b3J5XG4gICAgICAgICAgdG90YWxMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXG4gICAgICAgICAgbWFuZGF0b3J5TGVhZk5vZGVzICs9IGxlYWZOb2Rlc1xuICAgICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICAgICAgdG90YWxDb21wbGV0ZWRMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXG4gICAgICAgICAgICBtYW5kYXRvcnlDb21wbGV0ZWRMZWFmTm9kZXMgKz0gbGVhZk5vZGVzXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIG1pbGVzdG9uZS5sZWFmTm9kZXNDb3VudCA9IHRvdGFsTGVhZk5vZGVzXG4gICAgbWlsZXN0b25lLmNvbXBsZXRlZExlYWZOb2Rlc0NvdW50ID0gdG90YWxDb21wbGV0ZWRMZWFmTm9kZXNcbiAgICBtaWxlc3RvbmUubWFuZGF0b3J5TGVhZk5vZGVzQ291bnQgPSBtYW5kYXRvcnlMZWFmTm9kZXNcbiAgICBtaWxlc3RvbmUubWFuZGF0b3J5Q29tcGxldGVkTGVhZk5vZGVzQ291bnQgPSBtYW5kYXRvcnlDb21wbGV0ZWRMZWFmTm9kZXNcbiAgICBtaWxlc3RvbmUudG90YWxDb3Vyc2VzID0gdG90YWxDb3Vyc2VzXG4gICAgbWlsZXN0b25lLmNvbXBsZXRlZENvdXJzZXMgPSBjb21wbGV0ZWRDb3Vyc2VzXG5cbiAgICBpZiAodG90YWxMZWFmTm9kZXMgPiAwKSB7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkTGVhZk5vZGVzIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgbWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID0gaXNOYU4oY2FsY3VsYXRlZFBlcmNlbnRhZ2UpID8gMCA6IGNhbGN1bGF0ZWRQZXJjZW50YWdlXG4gICAgICBtaWxlc3RvbmUuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihtaWxlc3RvbmUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAobWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKSlcbiAgICAgIG1pbGVzdG9uZS5zdGF0dXMgPSBOdW1iZXIobWlsZXN0b25lLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyAyIDogKG1pbGVzdG9uZS5jb21wbGV0aW9uUGVyY2VudGFnZSA+IDAgPyAxIDogMCkpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVOb2RlUHJvZ3Jlc3Mobm9kZTogYW55LCBlbnJvbGxtZW50OiBhbnkpIHtcbiAgICBpZiAoIWVucm9sbG1lbnQpIHtcbiAgICAgIC8vIElmIG5vIGVucm9sbG1lbnQgZGF0YSwgcHJlc2VydmUgZXhpc3RpbmcgY29tcGxldGlvbiBkYXRhIGZyb20gY29udGVudCBoaWVyYXJjaHlcbiAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBhc3Nlc3NtZW50cyB0aGF0IG1heSBoYXZlIGNvbXBsZXRpb24gZGF0YSBidXQgbm8gZW5yb2xsbWVudCBlbnRyeVxuICAgICAgaWYgKG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IHVuZGVmaW5lZCAmJiBub2RlLmNvbXBsZXRpb25TdGF0dXMgPT09IHVuZGVmaW5lZCAmJiBub2RlLnN0YXR1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAwXG4gICAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IDBcbiAgICAgICAgbm9kZS5zdGF0dXMgPSAwXG4gICAgICB9XG4gICAgICAvLyBPdGhlcndpc2UsIGtlZXAgdGhlIGV4aXN0aW5nIHZhbHVlcyBmcm9tIGNvbnRlbnQgaGllcmFyY2h5XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBpdHNlbGYgaXMgdGhlIGVucm9sbGVkIGNvbnRlbnQgKGRpcmVjdCBlbnJvbGxtZW50KVxuICAgIC8vIFRoaXMgaGFwcGVucyBmb3IgcHJlLWFzc2Vzc21lbnRzIGFuZCBzdGFuZGFsb25lIGNvbnRlbnRcbiAgICBjb25zdCBpc0RpcmVjdEVucm9sbG1lbnQgPSBlbnJvbGxtZW50LmNvbGxlY3Rpb25JZCA9PT0gbm9kZS5pZGVudGlmaWVyIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnJvbGxtZW50LmNvbnRlbnRJZCA9PT0gbm9kZS5pZGVudGlmaWVyXG4gICAgXG4gICAgaWYgKGlzRGlyZWN0RW5yb2xsbWVudCkge1xuICAgICAgXG4gICAgICAvLyBVc2UgZW5yb2xsbWVudCdzIGRpcmVjdCBwcm9ncmVzc1xuICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGVucm9sbG1lbnQucHJvZ3Jlc3MgfHwgMFxuICAgICAgY29uc3Qgc3RhdHVzID0gTnVtYmVyKGVucm9sbG1lbnQuc3RhdHVzKSB8fCAwXG4gICAgICBcbiAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBwcm9ncmVzc1xuICAgICAgbm9kZS5jb21wbGV0aW9uU3RhdHVzID0gc3RhdHVzXG4gICAgICBub2RlLnN0YXR1cyA9IHN0YXR1c1xuICAgICAgXG4gICAgICBcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZihlbnJvbGxtZW50Py5zdGF0dXMgPT09IDIpIHtcbiAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IDJcbiAgICAgIG5vZGUuc3RhdHVzID0gMlxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUcnkgYm90aCBjb250ZW50SWQgYW5kIGNvbGxlY3Rpb25JZCBhcyB0aGUgQVBJIHJlc3BvbnNlIG1heSB1c2UgZWl0aGVyIGZpZWxkXG4gICAgICBjb25zdCBub2RlRW5yb2xsRGF0YSA9IGVucm9sbG1lbnQ/LmNvbnRlbnRMaXN0Py5maW5kKChlbGU6IGFueSkgPT4gXG4gICAgICAgIGVsZT8uY29udGVudElkID09PSBub2RlLmlkZW50aWZpZXIgfHwgZWxlPy5jb2xsZWN0aW9uSWQgPT09IG5vZGUuaWRlbnRpZmllclxuICAgICAgKVxuICAgICAgXG4gICAgICBpZiAoZW5yb2xsbWVudCAmJiBub2RlRW5yb2xsRGF0YSAmJiBub2RlRW5yb2xsRGF0YS5zdGF0dXMgPCAyKSB7XG4gICAgICAgIG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBub2RlRW5yb2xsRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBub2RlRW5yb2xsRGF0YS5wcm9ncmVzcyB8fCAwXG4gICAgICAgIG5vZGUuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihub2RlRW5yb2xsRGF0YS5zdGF0dXMpIHx8IDBcbiAgICAgICAgbm9kZS5zdGF0dXMgPSBOdW1iZXIobm9kZUVucm9sbERhdGEuc3RhdHVzKSB8fCAwXG4gICAgICB9ZWxzZSBpZiAoZW5yb2xsbWVudCAmJiBub2RlRW5yb2xsRGF0YSAmJiBub2RlRW5yb2xsRGF0YS5zdGF0dXMgPT09IDIpIHtcbiAgICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IDEwMFxuICAgICAgICBub2RlLmNvbXBsZXRpb25TdGF0dXMgPSAyXG4gICAgICAgIG5vZGUuc3RhdHVzID0gMlxuICAgICAgfSBlbHNlIGlmIChlbnJvbGxtZW50ICYmICFub2RlRW5yb2xsRGF0YSkge1xuICAgICAgICAvLyBFbnJvbGxtZW50IGV4aXN0cyBidXQgdGhpcyBub2RlIGlzIG5vdCBpbiBjb250ZW50TGlzdFxuICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gZm9yIGNvbXBsZXRlZCBhc3Nlc3NtZW50cyAtIHByZXNlcnZlIHRoZWlyIGNvbXBsZXRpb24gZGF0YSBmcm9tIGNvbnRlbnQgaGllcmFyY2h5XG4gICAgICAgIC8vIE9ubHkgcmVzZXQgdG8gMCBpZiB0aGVyZSdzIG5vIGNvbXBsZXRpb24gZGF0YSBhdCBhbGxcbiAgICAgICAgaWYgKG5vZGUuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IHVuZGVmaW5lZCAmJiBub2RlLmNvbXBsZXRpb25TdGF0dXMgPT09IHVuZGVmaW5lZCAmJiBub2RlLnN0YXR1cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgbm9kZS5jb21wbGV0aW9uUGVyY2VudGFnZSA9IDBcbiAgICAgICAgICBub2RlLmNvbXBsZXRpb25TdGF0dXMgPSAwXG4gICAgICAgICAgbm9kZS5zdGF0dXMgPSAwXG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGtlZXAgZXhpc3RpbmcgdmFsdWVzIGZyb20gY29udGVudCBoaWVyYXJjaHlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIGVucm9sbG1lbnQgYXQgYWxsIC0gcmVzZXQgdG8gMFxuICAgICAgICBub2RlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gMFxuICAgICAgICBub2RlLmNvbXBsZXRpb25TdGF0dXMgPSAwXG4gICAgICAgIG5vZGUuc3RhdHVzID0gMFxuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICBcbiAgICBcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQ291cnNlUHJvZ3Jlc3MoY291cnNlOiBhbnksIHBhcmVudENvbnRlbnRJZGVudGlmaWVyLCBlbnJvbGxtZW50TGlzdERhdGE6IGFueSkge1xuICAgIGNvbnN0IGVucm9sbG1lbnQgPSB0aGlzLmZpbmRFbnJvbGxtZW50KGVucm9sbG1lbnRMaXN0RGF0YSwgY291cnNlPy5pZGVudGlmaWVyKVxuXG4gICAgaWYgKGVucm9sbG1lbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgIC8vIEVucm9sbG1lbnQgc2hvd3MgMTAwJSAtIG1hcmsgY291cnNlIGFzIGNvbXBsZXRlXG4gICAgICBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPSAxMDBcbiAgICAgIGNvdXJzZS5jb21wbGV0aW9uU3RhdHVzID0gMlxuICAgICAgaWYgKGVucm9sbG1lbnQuaXNzdWVkQ2VydGlmaWNhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNlcnRpZmljYXRlOiBhbnkgPSBlbnJvbGxtZW50Lmlzc3VlZENlcnRpZmljYXRlcy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgbmV3IERhdGUoYS5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSAtIG5ldyBEYXRlKGIubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkpXG4gICAgICAgICAgICAgICAgICBjb25zdCBjZXJ0SWQ6IGFueSA9IGNlcnRpZmljYXRlWzBdLmlkZW50aWZpZXJcbiAgICAgICAgICAgICAgICAgIGNvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXNJZCA9IGNlcnRJZFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgdGhpcy50b2NTdmMubWFwQ29tcGxldGlvbkNoaWxkUGVyY2VudGFnZVByb2dyYW0oY291cnNlKVxuICAgIH0gZWxzZSBpZiAoZW5yb2xsbWVudCAmJiBlbnJvbGxtZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCkge1xuICAgICAgLy8gRW5yb2xsbWVudCBoYXMgcGFydGlhbCBwcm9ncmVzc1xuICAgICAgY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gZW5yb2xsbWVudC5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCAwXG4gICAgICBjb3Vyc2UuY29tcGxldGlvblN0YXR1cyA9IDFcbiAgICAgIC8vIEFsc28gdXBkYXRlIGNoaWxkcmVuXG4gICAgICBpZiAoY291cnNlLmNoaWxkcmVuICYmIGNvdXJzZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvdXJzZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICAgICAgXG5cbiAgICAgICAgICAvLyBJZiBjaGlsZCBpcyBhIG1vZHVsZSwgdXBkYXRlIGl0cyBjaGlsZHJlbiAocmVzb3VyY2VzKSBhcyB3ZWxsXG4gICAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFICYmIGNoaWxkLmNoaWxkcmVuICYmIGNoaWxkLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNoaWxkLmNoaWxkcmVuLmZvckVhY2goKHJlc291cmNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MocmVzb3VyY2UsIGVucm9sbG1lbnQpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVOb2RlUHJvZ3Jlc3MoY2hpbGQsIGVucm9sbG1lbnQpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY291cnNlLmNoaWxkcmVuICYmIGNvdXJzZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCB0b3RhbExlYWZOb2RlcyA9IGNvdXJzZS5sZWFmTm9kZXNDb3VudCB8fCAwXG4gICAgICAgIGxldCB0b3RhbENvbXBsZXRlZCA9IDBcblxuICAgICAgICBjb3Vyc2UuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIElmIGNoaWxkIGlzIGEgbW9kdWxlLCB1cGRhdGUgaXRzIGNoaWxkcmVuIChyZXNvdXJjZXMpIGFzIHdlbGxcbiAgICAgICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUgJiYgY2hpbGQuY2hpbGRyZW4gJiYgY2hpbGQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY2hpbGQuY2hpbGRyZW4uZm9yRWFjaCgocmVzb3VyY2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU5vZGVQcm9ncmVzcyhyZXNvdXJjZSwgZW5yb2xsbWVudClcbiAgICAgICAgICAgICAgaWYgKHJlc291cmNlLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgcmVzb3VyY2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICAgICAgICAgIHRvdGFsQ29tcGxldGVkICs9IHJlc291cmNlLmxlYWZOb2Rlc0NvdW50IHx8IDFcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudXBkYXRlTm9kZVByb2dyZXNzKGNoaWxkLCBlbnJvbGxtZW50KVxuXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjaGlsZC5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGNoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgICAgIHRvdGFsQ29tcGxldGVkICs9IGNoaWxkLmxlYWZOb2Rlc0NvdW50IHx8IDFcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgLy8gSWYgaXQncyBhIGNvbGxlY3Rpb24gYW5kIGRvZXNuJ3QgaGF2ZSBpdHMgb3duIGVucm9sbG1lbnQgcHJvZ3Jlc3MsIGNhbGN1bGF0ZSBpdFxuICAgICAgICBpZiAoIWVucm9sbG1lbnQgfHwgIWNvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDApIHtcbiAgICAgICAgICBpZiAoIXRvdGFsTGVhZk5vZGVzKSB7XG4gICAgICAgICAgICB0b3RhbExlYWZOb2RlcyA9IGNvdXJzZS5jaGlsZHJlbi5yZWR1Y2UoKGFjYzogbnVtYmVyLCBjdXJyOiBhbnkpID0+IGFjYyArIChjdXJyLmxlYWZOb2Rlc0NvdW50IHx8IDEpLCAwKVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodG90YWxMZWFmTm9kZXMgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjYWxjdWxhdGVkUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKHRvdGFsQ29tcGxldGVkIC8gdG90YWxMZWFmTm9kZXMpICogMTAwKVxuICAgICAgICAgICAgY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID0gaXNOYU4oY2FsY3VsYXRlZFBlcmNlbnRhZ2UpID8gMCA6IGNhbGN1bGF0ZWRQZXJjZW50YWdlXG4gICAgICAgICAgICBjb3Vyc2UuY29tcGxldGlvblN0YXR1cyA9IE51bWJlcihjb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IDIgOiAoY291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlID4gMCA/IDEgOiAwKSlcblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29tcGxldGVkTGVhZk5vZGVzQ291bnQobm9kZTogYW55KTogbnVtYmVyIHtcbiAgICBsZXQgY29tcGxldGVkQ291bnQgPSAwXG4gICAgXG4gICAgLy8gSWYgaXQncyBhIGxlYWYgbm9kZSAocmVzb3VyY2UpXG4gICAgaWYgKCFub2RlLmNoaWxkcmVuIHx8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IG5vZGUuc3RhdHVzID09PSAyIHx8IG5vZGUuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBub2RlLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMFxuICAgICAgcmV0dXJuIGlzQ29tcGxldGVkID8gKG5vZGUubGVhZk5vZGVzQ291bnQgfHwgMSkgOiAwXG4gICAgfVxuICAgIFxuICAgIC8vIElmIGl0IGhhcyBjaGlsZHJlbiwgcmVjdXJzaXZlbHkgY291bnQgY29tcGxldGVkIGxlYWYgbm9kZXNcbiAgICBub2RlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSAmJiBjaGlsZC5jaGlsZHJlbikge1xuICAgICAgICAvLyBNb2R1bGUgLSByZWN1cnNlIHRocm91Z2ggaXRzIGNoaWxkcmVuXG4gICAgICAgIGNvbXBsZXRlZENvdW50ICs9IHRoaXMuZ2V0Q29tcGxldGVkTGVhZk5vZGVzQ291bnQoY2hpbGQpXG4gICAgICB9IGVsc2UgaWYgKCFjaGlsZC5jaGlsZHJlbiB8fCBjaGlsZC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gUmVzb3VyY2UgKGxlYWYgbm9kZSlcbiAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSBjaGlsZC5zdGF0dXMgPT09IDIgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDBcbiAgICAgICAgaWYgKGlzQ29tcGxldGVkKSB7XG4gICAgICAgICAgY29tcGxldGVkQ291bnQgKz0gY2hpbGQubGVhZk5vZGVzQ291bnQgfHwgMVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBPdGhlciBjb2xsZWN0aW9uIHR5cGUgLSByZWN1cnNlXG4gICAgICAgIGNvbXBsZXRlZENvdW50ICs9IHRoaXMuZ2V0Q29tcGxldGVkTGVhZk5vZGVzQ291bnQoY2hpbGQpXG4gICAgICB9XG4gICAgfSlcbiAgICBcbiAgICByZXR1cm4gY29tcGxldGVkQ291bnRcbiAgfVxuXG4gIHByaXZhdGUgZmluZEVucm9sbG1lbnQoZW5yb2xsbWVudExpc3Q6IGFueSwgaWRlbnRpZmllcjogc3RyaW5nKSB7XG4gICAgaWYgKCFlbnJvbGxtZW50TGlzdCB8fCAhZW5yb2xsbWVudExpc3QubGVuZ3RoKSByZXR1cm4gbnVsbFxuICAgIHJldHVybiBlbnJvbGxtZW50TGlzdC5maW5kKChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IGlkZW50aWZpZXIgfHwgZWwuY29udGVudElkID09PSBpZGVudGlmaWVyKVxuICB9XG5cblxuXG59XG5cbiJdfQ==
|