@sunbird-cb/toc 0.0.7 → 0.0.8-ang-17-20
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/fesm2022/sunbird-cb-toc.mjs +16738 -13830
- package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
- package/index.d.ts +5888 -3
- package/package.json +13 -12
- package/sunbird-cb-toc-0.0.8-ang-17-20.tgz +0 -0
- package/esm2022/lib/_collection/_common/attendance-card/attendance-card.component.mjs +0 -55
- package/esm2022/lib/_collection/_common/attendance-card/attendance-card.module.mjs +0 -126
- package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.component.mjs +0 -32
- package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.module.mjs +0 -85
- package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.component.mjs +0 -100
- package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.module.mjs +0 -48
- package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +0 -120
- package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +0 -92
- package/esm2022/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.mjs +0 -48
- package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.component.mjs +0 -25
- package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.module.mjs +0 -41
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover-card.component.mjs +0 -89
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.module.mjs +0 -42
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.servive.mjs +0 -41
- package/esm2022/lib/_collection/_common/connection-name/connection-name.component.mjs +0 -78
- package/esm2022/lib/_collection/_common/connection-name/connection-name.module.mjs +0 -45
- package/esm2022/lib/_collection/_common/connection-name/profile-v2.model.mjs +0 -2
- package/esm2022/lib/_collection/_common/content-progress/content-progress.component.mjs +0 -70
- package/esm2022/lib/_collection/_common/content-progress/content-progress.module.mjs +0 -28
- package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.mjs +0 -187
- package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.mjs +0 -86
- package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +0 -31
- package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +0 -941
- package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.mjs +0 -183
- package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.mjs +0 -327
- package/esm2022/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.mjs +0 -297
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +0 -225
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +0 -1030
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.mjs +0 -16
- package/esm2022/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.mjs +0 -43
- package/esm2022/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.mjs +0 -133
- package/esm2022/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.mjs +0 -66
- package/esm2022/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.mjs +0 -278
- package/esm2022/lib/_collection/_common/content-toc/content-services/handle-claim.service.mjs +0 -21
- package/esm2022/lib/_collection/_common/content-toc/content-services/review-component-data.service.mjs +0 -21
- package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +0 -847
- package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +0 -219
- package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +0 -209
- package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.module.mjs +0 -26
- package/esm2022/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.mjs +0 -19
- package/esm2022/lib/_collection/_common/content-toc/pipes/truncate.pipe.mjs +0 -23
- package/esm2022/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.mjs +0 -113
- package/esm2022/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.mjs +0 -110
- package/esm2022/lib/_collection/_common/display-content-type/display-content-type.component.mjs +0 -26
- package/esm2022/lib/_collection/_common/display-content-type/display-content-type.module.mjs +0 -19
- package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.mjs +0 -67
- package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.mjs +0 -28
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.component.mjs +0 -77
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.model.mjs +0 -2
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.module.mjs +0 -61
- package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.module.mjs +0 -20
- package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +0 -67
- package/esm2022/lib/_collection/_common/player-brief/player-brief.component.mjs +0 -139
- package/esm2022/lib/_collection/_common/player-brief/player-brief.module.mjs +0 -71
- package/esm2022/lib/_collection/_common/rating-summary/rating-summary.component.mjs +0 -34
- package/esm2022/lib/_collection/_common/rating-summary/rating-summary.module.mjs +0 -56
- package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.component.mjs +0 -25
- package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.module.mjs +0 -37
- package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.mjs +0 -32
- package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner.module.mjs +0 -30
- package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +0 -38
- package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.mjs +0 -51
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.component.mjs +0 -115
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.model.mjs +0 -12
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.module.mjs +0 -51
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.service.mjs +0 -61
- package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.component.mjs +0 -87
- package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.module.mjs +0 -36
- package/esm2022/lib/_collection/_common/user-image/user-image.component.mjs +0 -62
- package/esm2022/lib/_collection/_common/user-image/user-image.module.mjs +0 -24
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.component.mjs +0 -192
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.module.mjs +0 -44
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.service.mjs +0 -99
- package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.component.mjs +0 -58
- package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.module.mjs +0 -67
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +0 -112
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.model.mjs +0 -2
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.module.mjs +0 -69
- package/esm2022/lib/_collection-api.mjs +0 -57
- package/esm2022/lib/_constants/widget-content.constants.mjs +0 -19
- package/esm2022/lib/_directives/tooltip.directive.mjs +0 -68
- package/esm2022/lib/_models/common.model.mjs +0 -2
- package/esm2022/lib/_models/error.model.mjs +0 -2
- package/esm2022/lib/_pipes/highlight.pipe.mjs +0 -24
- package/esm2022/lib/_services/rating.service.mjs +0 -89
- package/esm2022/lib/_services/samuhik-charcha.service.mjs +0 -29
- package/esm2022/lib/_services/viewer-route-util.mjs +0 -103
- package/esm2022/lib/_services/widget-content.model.mjs +0 -247
- package/esm2022/lib/_services/widget-content.service.mjs +0 -594
- package/esm2022/lib/_shared/translate-loader.factory.mjs +0 -9
- package/esm2022/lib/app-toc-lib.module.mjs +0 -499
- package/esm2022/lib/collection.config.mjs +0 -161
- package/esm2022/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.mjs +0 -37
- package/esm2022/lib/components/app-toc-banner/app-toc-banner.component.mjs +0 -1436
- package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +0 -475
- package/esm2022/lib/components/app-toc-cios-home/consent-dialog.component.mjs +0 -119
- package/esm2022/lib/components/app-toc-cohorts/app-toc-cohorts.component.mjs +0 -80
- package/esm2022/lib/components/app-toc-content-card/app-toc-content-card.component.mjs +0 -249
- package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +0 -39
- package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +0 -58
- package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +0 -2229
- package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +0 -2905
- package/esm2022/lib/components/app-toc-overview/app-toc-overview.component.mjs +0 -157
- package/esm2022/lib/components/app-toc-session-card/app-toc-session-card.component.mjs +0 -48
- package/esm2022/lib/components/app-toc-sessions/app-toc-sessions.component.mjs +0 -47
- package/esm2022/lib/components/app-toc-single-page/app-toc-single-page.component.mjs +0 -766
- package/esm2022/lib/components/completion-survey-form/completion-survey-form.component.mjs +0 -243
- package/esm2022/lib/components/create-batch-dialog/create-batch-dialog.component.mjs +0 -116
- package/esm2022/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.mjs +0 -44
- package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +0 -1838
- package/esm2022/lib/components/enroll-questionnaire/enroll-questionnaire.component.mjs +0 -236
- package/esm2022/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.mjs +0 -213
- package/esm2022/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.mjs +0 -36
- package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +0 -256
- package/esm2022/lib/components/survey-form-question/survey-form-question.component.mjs +0 -133
- package/esm2022/lib/components/survey-form-section/survey-form-section.component.mjs +0 -36
- package/esm2022/lib/models/app-toc-analytics.model.mjs +0 -2
- package/esm2022/lib/models/app-toc.model.mjs +0 -38
- package/esm2022/lib/models/auto-complete.model.mjs +0 -2
- package/esm2022/lib/models/card-content.model.mjs +0 -13
- package/esm2022/lib/models/content-strip-with-tabs.model.mjs +0 -2
- package/esm2022/lib/models/discussion-forum.model.mjs +0 -14
- package/esm2022/lib/models/goal.model.mjs +0 -2
- package/esm2022/lib/models/meta-tag.model.mjs +0 -8
- package/esm2022/lib/models/playlist.model.mjs +0 -2
- package/esm2022/lib/models/profile-revamp.model.mjs +0 -2
- package/esm2022/lib/models/rating.model.mjs +0 -2
- package/esm2022/lib/models/user-profile.model.mjs +0 -21
- package/esm2022/lib/resolvers/app-toc-cios-resolver.service.mjs +0 -24
- package/esm2022/lib/resolvers/app-toc-cios-user-enroll-resolver.service.mjs +0 -24
- package/esm2022/lib/resolvers/app-toc-content-read-resolver.service.mjs +0 -60
- package/esm2022/lib/resolvers/app-toc-ext-public-resolver.service.mjs +0 -25
- package/esm2022/lib/resolvers/app-toc-resolver.service.mjs +0 -106
- package/esm2022/lib/resolvers/config-resolver.service.mjs +0 -25
- package/esm2022/lib/resolvers/profile-resolver.service.mjs +0 -25
- package/esm2022/lib/resolvers/restricted-features-resolver.service.mjs +0 -25
- package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +0 -51
- package/esm2022/lib/routes/app-toc-home/app-toc-home.directive.mjs +0 -16
- package/esm2022/lib/routes/app-toc-home/app-toc-home.service.mjs +0 -18
- package/esm2022/lib/services/access-control.service.mjs +0 -56
- package/esm2022/lib/services/action.service.mjs +0 -23
- package/esm2022/lib/services/app-toc-v2.service.mjs +0 -243
- package/esm2022/lib/services/app-toc.service.mjs +0 -1387
- package/esm2022/lib/services/certificate.service.mjs +0 -69
- package/esm2022/lib/services/discuss-utils.service.mjs +0 -58
- package/esm2022/lib/services/editor.service.mjs +0 -34
- package/esm2022/lib/services/load-check.service.mjs +0 -21
- package/esm2022/lib/services/loader.service.mjs +0 -33
- package/esm2022/lib/services/mobile-apps.service.mjs +0 -67
- package/esm2022/lib/services/netcore.service.mjs +0 -56
- package/esm2022/lib/services/nps-grid.service.mjs +0 -31
- package/esm2022/lib/services/otp.service.mjs +0 -43
- package/esm2022/lib/services/profile-v2.service.mjs +0 -43
- package/esm2022/lib/services/reset-ratings.service.mjs +0 -19
- package/esm2022/lib/services/resource-download-helper.service.mjs +0 -64
- package/esm2022/lib/services/timer.service.mjs +0 -23
- package/esm2022/lib/services/title-tag.service.mjs +0 -71
- package/esm2022/lib/services/user-profile.service.mjs +0 -55
- package/esm2022/lib/services/viewer-data.service.mjs +0 -64
- package/esm2022/lib/services/viewer-util.service.mjs +0 -500
- package/esm2022/lib/share-toc/share-toc/share-toc.component.mjs +0 -291
- package/esm2022/lib/share-toc/share-toc.module.mjs +0 -119
- package/esm2022/public-api.mjs +0 -70
- package/esm2022/sunbird-cb-toc.mjs +0 -5
- package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +0 -16
- package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +0 -31
- package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +0 -15
- package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +0 -20
- package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +0 -22
- package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +0 -15
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +0 -22
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +0 -22
- package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +0 -9
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +0 -11
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +0 -12
- package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +0 -18
- package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +0 -14
- package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +0 -11
- package/lib/_collection/_common/connection-name/connection-name.component.d.ts +0 -17
- package/lib/_collection/_common/connection-name/connection-name.module.d.ts +0 -14
- package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +0 -199
- package/lib/_collection/_common/content-progress/content-progress.component.d.ts +0 -16
- package/lib/_collection/_common/content-progress/content-progress.module.d.ts +0 -10
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +0 -38
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +0 -19
- package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +0 -11
- package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +0 -183
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +0 -41
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +0 -54
- package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +0 -47
- package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +0 -48
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +0 -154
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +0 -8
- package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +0 -16
- package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +0 -40
- package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +0 -21
- package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +0 -45
- package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +0 -10
- package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +0 -10
- package/lib/_collection/_common/content-toc/content-toc.component.d.ts +0 -128
- package/lib/_collection/_common/content-toc/content-toc.module.d.ts +0 -51
- package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +0 -29
- package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +0 -9
- package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +0 -7
- package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +0 -7
- package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +0 -28
- package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +0 -24
- package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +0 -14
- package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +0 -9
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +0 -12
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +0 -10
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +0 -22
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +0 -8
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +0 -18
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +0 -8
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +0 -15
- package/lib/_collection/_common/player-brief/player-brief.component.d.ts +0 -35
- package/lib/_collection/_common/player-brief/player-brief.module.d.ts +0 -19
- package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +0 -14
- package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +0 -13
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +0 -11
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +0 -11
- package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +0 -15
- package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +0 -10
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +0 -16
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +0 -11
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +0 -34
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +0 -17
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +0 -15
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +0 -15
- package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +0 -21
- package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +0 -12
- package/lib/_collection/_common/user-image/user-image.component.d.ts +0 -21
- package/lib/_collection/_common/user-image/user-image.module.d.ts +0 -9
- package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +0 -47
- package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +0 -14
- package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +0 -22
- package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +0 -19
- package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +0 -15
- package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +0 -25
- package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +0 -21
- package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +0 -18
- package/lib/_collection-api.d.ts +0 -34
- package/lib/_constants/widget-content.constants.d.ts +0 -7
- package/lib/_directives/tooltip.directive.d.ts +0 -17
- package/lib/_models/common.model.d.ts +0 -3
- package/lib/_models/error.model.d.ts +0 -5
- package/lib/_pipes/highlight.pipe.d.ts +0 -10
- package/lib/_services/rating.service.d.ts +0 -18
- package/lib/_services/samuhik-charcha.service.d.ts +0 -13
- package/lib/_services/viewer-route-util.d.ts +0 -8
- package/lib/_services/widget-content.model.d.ts +0 -515
- package/lib/_services/widget-content.service.d.ts +0 -101
- package/lib/_shared/translate-loader.factory.d.ts +0 -7
- package/lib/app-toc-lib.module.d.ts +0 -88
- package/lib/collection.config.d.ts +0 -159
- package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +0 -17
- package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +0 -225
- package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +0 -78
- package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +0 -22
- package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +0 -31
- package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +0 -47
- package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +0 -14
- package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +0 -21
- package/lib/components/app-toc-home/app-toc-home.component.d.ts +0 -314
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +0 -408
- package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +0 -47
- package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +0 -22
- package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +0 -14
- package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +0 -149
- package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +0 -42
- package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +0 -27
- package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +0 -15
- package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +0 -195
- package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +0 -44
- package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +0 -54
- package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +0 -18
- package/lib/components/public-survey-form/public-survey-form.component.d.ts +0 -43
- package/lib/components/survey-form-question/survey-form-question.component.d.ts +0 -20
- package/lib/components/survey-form-section/survey-form-section.component.d.ts +0 -13
- package/lib/models/app-toc-analytics.model.d.ts +0 -152
- package/lib/models/app-toc.model.d.ts +0 -84
- package/lib/models/auto-complete.model.d.ts +0 -27
- package/lib/models/card-content.model.d.ts +0 -19
- package/lib/models/content-strip-with-tabs.model.d.ts +0 -44
- package/lib/models/discussion-forum.model.d.ts +0 -40
- package/lib/models/goal.model.d.ts +0 -22
- package/lib/models/meta-tag.model.d.ts +0 -6
- package/lib/models/playlist.model.d.ts +0 -23
- package/lib/models/profile-revamp.model.d.ts +0 -14
- package/lib/models/rating.model.d.ts +0 -17
- package/lib/models/user-profile.model.d.ts +0 -37
- package/lib/resolvers/app-toc-cios-resolver.service.d.ts +0 -12
- package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +0 -12
- package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +0 -16
- package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +0 -12
- package/lib/resolvers/app-toc-resolver.service.d.ts +0 -16
- package/lib/resolvers/config-resolver.service.d.ts +0 -11
- package/lib/resolvers/profile-resolver.service.d.ts +0 -11
- package/lib/resolvers/restricted-features-resolver.service.d.ts +0 -11
- package/lib/routes/app-toc-home/app-toc-home.component.d.ts +0 -19
- package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +0 -8
- package/lib/routes/app-toc-home/app-toc-home.service.d.ts +0 -8
- package/lib/services/access-control.service.d.ts +0 -29
- package/lib/services/action.service.d.ts +0 -9
- package/lib/services/app-toc-v2.service.d.ts +0 -14
- package/lib/services/app-toc.service.d.ts +0 -177
- package/lib/services/certificate.service.d.ts +0 -42
- package/lib/services/discuss-utils.service.d.ts +0 -33
- package/lib/services/editor.service.d.ts +0 -17
- package/lib/services/load-check.service.d.ts +0 -8
- package/lib/services/loader.service.d.ts +0 -16
- package/lib/services/mobile-apps.service.d.ts +0 -38
- package/lib/services/netcore.service.d.ts +0 -33
- package/lib/services/nps-grid.service.d.ts +0 -15
- package/lib/services/otp.service.d.ts +0 -20
- package/lib/services/profile-v2.service.d.ts +0 -20
- package/lib/services/reset-ratings.service.d.ts +0 -8
- package/lib/services/resource-download-helper.service.d.ts +0 -29
- package/lib/services/timer.service.d.ts +0 -9
- package/lib/services/title-tag.service.d.ts +0 -21
- package/lib/services/user-profile.service.d.ts +0 -24
- package/lib/services/viewer-data.service.d.ts +0 -58
- package/lib/services/viewer-util.service.d.ts +0 -62
- package/lib/share-toc/share-toc/share-toc.component.d.ts +0 -56
- package/lib/share-toc/share-toc.module.d.ts +0 -32
- package/public-api.d.ts +0 -55
|
@@ -1,1387 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import { Subject, EMPTY, BehaviorSubject, of, throwError } from 'rxjs';
|
|
3
|
-
import { NsContent } from '../_services/widget-content.model';
|
|
4
|
-
import { NsContentConstants } from '../_constants/widget-content.constants';
|
|
5
|
-
import { NsAppToc } from '../models/app-toc.model';
|
|
6
|
-
// tslint:disable-next-line
|
|
7
|
-
import _ from 'lodash';
|
|
8
|
-
import { map, catchError } from 'rxjs/operators';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "@angular/common/http";
|
|
11
|
-
import * as i2 from "@sunbird-cb/consumption";
|
|
12
|
-
import * as i3 from "@sunbird-cb/utils-v2";
|
|
13
|
-
import * as i4 from "../_services/widget-content.service";
|
|
14
|
-
// TODO: move this in some common place
|
|
15
|
-
const PROTECTED_SLAG_V8 = '/apis/protected/v8';
|
|
16
|
-
const PROXY_SLAG_V8 = '/apis/proxies/v8';
|
|
17
|
-
const API_END_POINTS = {
|
|
18
|
-
BATCH_CREATE: `${PROXY_SLAG_V8}/learner/course/v1/batch/create`,
|
|
19
|
-
CONTENT_PARENTS: `${PROTECTED_SLAG_V8}/content/parents`,
|
|
20
|
-
CONTENT_NEXT: `${PROTECTED_SLAG_V8}/content/next`,
|
|
21
|
-
CONTENT_HISTORYV2: `/apis/proxies/v8/read/content-progres`,
|
|
22
|
-
CONTENT_PARENT: (contentId) => `${PROTECTED_SLAG_V8}/content/${contentId}/parent`,
|
|
23
|
-
CONTENT_AUTH_PARENT: (contentId, rootOrg, org) => `/apis/authApi/action/content/parent/hierarchy/${contentId}?rootOrg=${rootOrg}&org=${org}`,
|
|
24
|
-
COHORTS: (cohortType, contentId) => `${PROTECTED_SLAG_V8}/cohorts/${cohortType}/${contentId}`,
|
|
25
|
-
EXTERNAL_CONTENT: (contentId) => `${PROTECTED_SLAG_V8}/content/external-access/${contentId}`,
|
|
26
|
-
COHORTS_GROUP_USER: (groupId) => `${PROTECTED_SLAG_V8}/cohorts/${groupId}`,
|
|
27
|
-
RELATED_RESOURCE: (contentId, contentType) => `${PROTECTED_SLAG_V8}/khub/fetchRelatedResources/${contentId}/${contentType}`,
|
|
28
|
-
POST_ASSESSMENT: (contentId) => `${PROTECTED_SLAG_V8}/user/evaluate/post-assessment/${contentId}`,
|
|
29
|
-
GET_CONTENT: (contentId) => `${PROXY_SLAG_V8}/action/content/v3/read/${contentId}`,
|
|
30
|
-
CERT_DOWNLOAD: (certId) => `${PROTECTED_SLAG_V8}/cohorts/course/batch/cert/download/${certId}`,
|
|
31
|
-
SERVER_DATE: 'apis/public/v8/systemDate',
|
|
32
|
-
SHARE_CONTENT: '/apis/proxies/v8/user/v1/content/recommend',
|
|
33
|
-
GET_FORM_BYID: (formId) => `apis/proxies/v8/forms/v2/getFormById?formId=${formId}`,
|
|
34
|
-
// SUBMIT_FORM: `/apis/proxies/v8/forms/v1/saveFormSubmit`,
|
|
35
|
-
SUBMIT_FORM: `apis/proxies/v8/forms/v2/saveFormSubmit`,
|
|
36
|
-
GET_FORM_BYID_PUBLIC: (formId) => `apis/public/v8/public/forms/v2/getFormById?formId=${formId}`,
|
|
37
|
-
SUBMIT_FORM_PUBLIC: `apis/public/v8/public/forms/v2/saveFormSubmit`,
|
|
38
|
-
// get answers for form
|
|
39
|
-
GET_APPLICATIONS_BY_ID: (formId, contextId) => `/apis/proxies/v8/forms/v2/getApplicationsById?formId=${formId}&contextId=${contextId}`,
|
|
40
|
-
AI_RESOURCE_VTT_FILE: `${PROXY_SLAG_V8}/chatbot/v3/transcoder/stats`,
|
|
41
|
-
// GET_FORM_BYID: (formId: string) => `apis/proxies/v8/forms/getFormById?id=${formId}`,
|
|
42
|
-
PRE_ENROLLMENT_STATE_READ: `/apis/proxies/v8/content/v2/state/read`,
|
|
43
|
-
CREATE_RESOURCE: `apis/proxies/v8/action/content/v3/create`,
|
|
44
|
-
READ_RESOURCE: `apis/proxies/v8/action/content/v3/`,
|
|
45
|
-
UPLOAD_FILE: `apis/proxies/v8/upload/action/content/v3/`,
|
|
46
|
-
UPDATE_RESOURCE: `apis/proxies/v8/action/content/v3/update`,
|
|
47
|
-
SEARCH: `apis/proxies/v8/assignment/v1/search`,
|
|
48
|
-
SUBMIT_DRAFT_ASSIGNMENT: `apis/proxies/v8/assignment/v1/submitDraft`,
|
|
49
|
-
SUBMIT_ASSIGNMENT: `apis/proxies/v8/assignment/v1/submit`,
|
|
50
|
-
ASSIGNMENT_STATUS: `apis/proxies/v8/forms/v2/submissions/search`,
|
|
51
|
-
UPLOAD_ASSIGNMENT: `apis/proxies/v8/storage/v1/bp/assignment/answer`,
|
|
52
|
-
READ_ASSIGNMENT: `apis/proxies/v8/storage/v1/bp/assignment/answer/read/file`,
|
|
53
|
-
NOTIFY_ASSIGNMENT_SUBMISSION: `apis/proxies/v8/v1/notifyAssignment/submit`,
|
|
54
|
-
};
|
|
55
|
-
export class AppTocService {
|
|
56
|
-
constructor(http, contentLangSvc, configSvc, widgetSvc) {
|
|
57
|
-
this.http = http;
|
|
58
|
-
this.contentLangSvc = contentLangSvc;
|
|
59
|
-
this.configSvc = configSvc;
|
|
60
|
-
this.widgetSvc = widgetSvc;
|
|
61
|
-
this.analyticsReplaySubject = new Subject();
|
|
62
|
-
this.analyticsFetchStatus = 'none';
|
|
63
|
-
this.batchReplaySubject = new Subject();
|
|
64
|
-
this.setBatchDataSubject = new Subject();
|
|
65
|
-
this.getSelectedBatch = new Subject();
|
|
66
|
-
this.setWFDataSubject = new Subject();
|
|
67
|
-
this.resumeData = new Subject();
|
|
68
|
-
this.showSubtitleOnBanners = false;
|
|
69
|
-
this.canShowDescription = false;
|
|
70
|
-
this.resumeDataSubscription = null;
|
|
71
|
-
this.primaryCategory = NsContent.EPrimaryCategory;
|
|
72
|
-
this.updateReviews = new BehaviorSubject(false);
|
|
73
|
-
this.updateReviewsObservable = this.updateReviews.asObservable();
|
|
74
|
-
this.serverDate = new BehaviorSubject('');
|
|
75
|
-
this.currentServerDate = this.serverDate.asObservable();
|
|
76
|
-
this.contentLoader = new BehaviorSubject(false);
|
|
77
|
-
this.contentLoader$ = this.contentLoader.asObservable();
|
|
78
|
-
this.getPageScroll = new BehaviorSubject(true);
|
|
79
|
-
this.updatePageScroll = this.getPageScroll.asObservable();
|
|
80
|
-
this.hashmap = {};
|
|
81
|
-
this.hashmapUpdated = new BehaviorSubject(null);
|
|
82
|
-
this.hashmapUpdated$ = this.hashmapUpdated.asObservable();
|
|
83
|
-
this.transriptionDataSubject = new BehaviorSubject(null); // Start with null
|
|
84
|
-
this.transcriptionData$ = this.transriptionDataSubject.asObservable();
|
|
85
|
-
this.transriptionActiveLanguageDataObject = new BehaviorSubject(null);
|
|
86
|
-
this.transriptionActiveLanguageDataObject$ = this.transriptionActiveLanguageDataObject.asObservable();
|
|
87
|
-
this.transriptionIdentifier = new Subject(); // Start with null
|
|
88
|
-
this.changeTranscriptionLanguageEvent = new Subject();
|
|
89
|
-
this.playTranscriptionVideo = new Subject();
|
|
90
|
-
// this resume data subscription is for on load
|
|
91
|
-
this.resumeDataSubscription = this.resumeData.subscribe((_dataResult) => {
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
get subtitleOnBanners() {
|
|
95
|
-
return this.showSubtitleOnBanners;
|
|
96
|
-
}
|
|
97
|
-
set subtitleOnBanners(val) {
|
|
98
|
-
this.showSubtitleOnBanners = val;
|
|
99
|
-
}
|
|
100
|
-
get showDescription() {
|
|
101
|
-
return this.canShowDescription;
|
|
102
|
-
}
|
|
103
|
-
set showDescription(val) {
|
|
104
|
-
this.canShowDescription = val;
|
|
105
|
-
}
|
|
106
|
-
updateBatchData() {
|
|
107
|
-
this.batchReplaySubject.next();
|
|
108
|
-
}
|
|
109
|
-
setBatchData(data) {
|
|
110
|
-
this.setBatchDataSubject.next(data);
|
|
111
|
-
}
|
|
112
|
-
setWFData(data) {
|
|
113
|
-
this.setWFDataSubject.next(data);
|
|
114
|
-
}
|
|
115
|
-
updateResumaData(data) {
|
|
116
|
-
this.resumeData.next(data);
|
|
117
|
-
}
|
|
118
|
-
changeUpdateReviews(state) {
|
|
119
|
-
this.updateReviews.next(state);
|
|
120
|
-
}
|
|
121
|
-
getSelectedBatchData(data) {
|
|
122
|
-
this.getSelectedBatch.next(data);
|
|
123
|
-
}
|
|
124
|
-
changeServerDate(state) {
|
|
125
|
-
this.serverDate.next(state);
|
|
126
|
-
}
|
|
127
|
-
mapSessionCompletionPercentage(batchData, resumeDataPass) {
|
|
128
|
-
if (resumeDataPass && resumeDataPass.length) {
|
|
129
|
-
if (resumeDataPass && resumeDataPass.length && batchData.content && batchData.content.length) {
|
|
130
|
-
this.sessionCompletionPercentage(batchData, resumeDataPass);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
else {
|
|
134
|
-
this.resumeDataSubscription = this.resumeData.subscribe((dataResult) => {
|
|
135
|
-
if (dataResult && dataResult.length && batchData.content && batchData.content.length) {
|
|
136
|
-
this.sessionCompletionPercentage(batchData, dataResult);
|
|
137
|
-
}
|
|
138
|
-
}, () => {
|
|
139
|
-
this.contentLoader.next(false);
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
sessionCompletionPercentage(batchData, resumeDataPass) {
|
|
144
|
-
if (resumeDataPass && resumeDataPass.length) {
|
|
145
|
-
if (batchData && batchData.content[0] &&
|
|
146
|
-
batchData.content[0].batchAttributes &&
|
|
147
|
-
batchData.content[0].batchAttributes.sessionDetails_v2) {
|
|
148
|
-
batchData.content[0].batchAttributes.sessionDetails_v2.map((sd) => {
|
|
149
|
-
const foundContent = resumeDataPass.find((el) => el.contentId === sd.sessionId);
|
|
150
|
-
if (foundContent) {
|
|
151
|
-
sd.completionPercentage = foundContent.completionPercentage;
|
|
152
|
-
sd.completionStatus = foundContent.status;
|
|
153
|
-
sd.lastCompletedTime = foundContent.lastCompletedTime;
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
this.contentLoader.next(false);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
showStartButton(content) {
|
|
161
|
-
const status = {
|
|
162
|
-
show: false,
|
|
163
|
-
msg: '',
|
|
164
|
-
};
|
|
165
|
-
if (content) {
|
|
166
|
-
if (content.artifactUrl && content.artifactUrl.match(/youtu(.)?be/gi) &&
|
|
167
|
-
this.configSvc.userProfile &&
|
|
168
|
-
this.configSvc.userProfile.country === 'China') {
|
|
169
|
-
status.show = false;
|
|
170
|
-
status.msg = 'youtubeForbidden';
|
|
171
|
-
return status;
|
|
172
|
-
}
|
|
173
|
-
if (content.resourceType !== 'Certification') {
|
|
174
|
-
status.show = true;
|
|
175
|
-
return status;
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
return status;
|
|
179
|
-
}
|
|
180
|
-
initData(data, needResumeData = false) {
|
|
181
|
-
let content = null;
|
|
182
|
-
let errorCode = null;
|
|
183
|
-
this.contentLoader.next(true);
|
|
184
|
-
if (data.content && data.content.data && data.content.data.identifier) {
|
|
185
|
-
content = data.content.data;
|
|
186
|
-
if (needResumeData) {
|
|
187
|
-
this.resumeDataSubscription = this.resumeData.subscribe((dataResult) => {
|
|
188
|
-
if (dataResult && dataResult.length) {
|
|
189
|
-
this.contentLoader.next(true);
|
|
190
|
-
this.mapCompletionPercentage(content, dataResult);
|
|
191
|
-
}
|
|
192
|
-
}, () => {
|
|
193
|
-
// tslint:disable-next-line: no-console
|
|
194
|
-
console.log('error on resumeDataSubscription');
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
this.contentLoader.next(false);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
this.contentLoader.next(false);
|
|
203
|
-
if (data.error) {
|
|
204
|
-
errorCode = NsAppToc.EWsTocErrorCode.API_FAILURE;
|
|
205
|
-
}
|
|
206
|
-
else {
|
|
207
|
-
errorCode = NsAppToc.EWsTocErrorCode.NO_DATA;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
// this.contentLoader.next(false)
|
|
211
|
-
return {
|
|
212
|
-
content,
|
|
213
|
-
errorCode,
|
|
214
|
-
};
|
|
215
|
-
}
|
|
216
|
-
mapCompletionPercentage(content, dataResult) {
|
|
217
|
-
if (content && content.children) {
|
|
218
|
-
content.children.map(child => {
|
|
219
|
-
const foundContent = dataResult.find((el) => el.contentId === child.identifier);
|
|
220
|
-
if (foundContent) {
|
|
221
|
-
child.completionPercentage = foundContent.completionPercentage || foundContent.progress;
|
|
222
|
-
child.completionStatus = foundContent.status;
|
|
223
|
-
}
|
|
224
|
-
else {
|
|
225
|
-
this.mapCompletionPercentage(child, dataResult);
|
|
226
|
-
}
|
|
227
|
-
});
|
|
228
|
-
this.contentLoader.next(false);
|
|
229
|
-
}
|
|
230
|
-
else {
|
|
231
|
-
this.contentLoader.next(false);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
mapModuleCount(content) {
|
|
235
|
-
if (content && content.children) {
|
|
236
|
-
content.children.map(child => {
|
|
237
|
-
if (child.primaryCategory === NsContent.EPrimaryCategory.MODULE) {
|
|
238
|
-
content['moduleCount'] = content['moduleCount'] ? content['moduleCount'] + 1 : 1;
|
|
239
|
-
}
|
|
240
|
-
if (child.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
|
|
241
|
-
this.mapModuleCount(child);
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
getMimeType(content, identifier) {
|
|
247
|
-
if (content.identifier === identifier) {
|
|
248
|
-
return content.mimeType;
|
|
249
|
-
}
|
|
250
|
-
if (content && content.children) {
|
|
251
|
-
if (content.children.length === 0) {
|
|
252
|
-
// if (content.children[0].identifier === identifier) {
|
|
253
|
-
// return content.mimeType
|
|
254
|
-
// }
|
|
255
|
-
// big blunder in data
|
|
256
|
-
// this.logger.log(content.identifier, 'Wrong mimetypes for resume')
|
|
257
|
-
return content.mimeType;
|
|
258
|
-
}
|
|
259
|
-
const flatList = [];
|
|
260
|
-
const getAllItemsPerChildren = (item) => {
|
|
261
|
-
flatList.push(item);
|
|
262
|
-
if (item.children) {
|
|
263
|
-
return item.children.map((i) => getAllItemsPerChildren(i));
|
|
264
|
-
}
|
|
265
|
-
return;
|
|
266
|
-
};
|
|
267
|
-
getAllItemsPerChildren(content);
|
|
268
|
-
const chld = _.first(_.filter(flatList, { identifier }));
|
|
269
|
-
return (chld && chld.mimeType) || '';
|
|
270
|
-
}
|
|
271
|
-
// return chld.mimeType
|
|
272
|
-
return NsContent.EMimeTypes.UNKNOWN;
|
|
273
|
-
}
|
|
274
|
-
getTocStructure(content, tocStructure) {
|
|
275
|
-
if (content &&
|
|
276
|
-
!(content.primaryCategory === this.primaryCategory.RESOURCE
|
|
277
|
-
// || content.primaryCategory === this.primaryCategory.KNOWLEDGE_ARTIFACT)
|
|
278
|
-
|| content.primaryCategory === this.primaryCategory.PRACTICE_RESOURCE
|
|
279
|
-
|| content.primaryCategory === this.primaryCategory.FINAL_ASSESSMENT
|
|
280
|
-
|| content.primaryCategory === this.primaryCategory.OFFLINE_SESSION)) {
|
|
281
|
-
if (content.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
|
|
282
|
-
tocStructure.course += 1;
|
|
283
|
-
}
|
|
284
|
-
else if (content.primaryCategory === NsContent.EPrimaryCategory.MODULE) {
|
|
285
|
-
tocStructure.learningModule += 1;
|
|
286
|
-
}
|
|
287
|
-
_.each(content.children, child => {
|
|
288
|
-
// tslint:disable-next-line: no-parameter-reassignment
|
|
289
|
-
tocStructure = this.getTocStructure(child, tocStructure);
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
else if (content &&
|
|
293
|
-
(content.primaryCategory === NsContent.EPrimaryCategory.RESOURCE
|
|
294
|
-
// || content.contentType === 'Knowledge Artifact'
|
|
295
|
-
|| content.primaryCategory === NsContent.EPrimaryCategory.PRACTICE_RESOURCE
|
|
296
|
-
|| content.primaryCategory === NsContent.EPrimaryCategory.FINAL_ASSESSMENT
|
|
297
|
-
|| content.primaryCategory === NsContent.EPrimaryCategory.OFFLINE_SESSION)) {
|
|
298
|
-
switch (content.mimeType) {
|
|
299
|
-
// case NsContent.EMimeTypes.HANDS_ON:
|
|
300
|
-
// tocStructure.handsOn += 1
|
|
301
|
-
// break
|
|
302
|
-
case NsContent.EMimeTypes.MP3:
|
|
303
|
-
tocStructure.podcast += 1;
|
|
304
|
-
break;
|
|
305
|
-
case NsContent.EMimeTypes.MP4:
|
|
306
|
-
case NsContent.EMimeTypes.M3U8:
|
|
307
|
-
case NsContent.EMimeTypes.YOUTUBE:
|
|
308
|
-
tocStructure.video += 1;
|
|
309
|
-
break;
|
|
310
|
-
// case NsContent.EMimeTypes.INTERACTION:
|
|
311
|
-
// tocStructure.interactiveVideo += 1
|
|
312
|
-
// break
|
|
313
|
-
case NsContent.EMimeTypes.PDF:
|
|
314
|
-
tocStructure.pdf += 1;
|
|
315
|
-
break;
|
|
316
|
-
// case NsContent.EMimeTypes.HTML:
|
|
317
|
-
case NsContent.EMimeTypes.TEXT_WEB:
|
|
318
|
-
tocStructure.webPage += 1;
|
|
319
|
-
break;
|
|
320
|
-
case NsContent.EMimeTypes.SURVEY:
|
|
321
|
-
tocStructure.survey += 1;
|
|
322
|
-
break;
|
|
323
|
-
case NsContent.EMimeTypes.QUIZ:
|
|
324
|
-
case NsContent.EMimeTypes.APPLICATION_JSON:
|
|
325
|
-
// if (content.resourceType === 'Assessment') {
|
|
326
|
-
tocStructure.assessment += 1;
|
|
327
|
-
// } else {
|
|
328
|
-
// tocStructure.quiz += 1
|
|
329
|
-
// }
|
|
330
|
-
break;
|
|
331
|
-
case NsContent.EMimeTypes.OFFLINE_SESSION:
|
|
332
|
-
// if (content.resourceType === 'Assessment') {
|
|
333
|
-
tocStructure.offlineSession += 1;
|
|
334
|
-
// } else {
|
|
335
|
-
// tocStructure.quiz += 1
|
|
336
|
-
// }
|
|
337
|
-
break;
|
|
338
|
-
case NsContent.EMimeTypes.PRACTICE_RESOURCE:
|
|
339
|
-
if (content.primaryCategory === this.primaryCategory.PRACTICE_RESOURCE) {
|
|
340
|
-
tocStructure.practiceTest += 1;
|
|
341
|
-
}
|
|
342
|
-
else if (content.primaryCategory === this.primaryCategory.FINAL_ASSESSMENT) {
|
|
343
|
-
tocStructure.finalTest += 1;
|
|
344
|
-
}
|
|
345
|
-
break;
|
|
346
|
-
// case NsContent.EMimeTypes.WEB_MODULE:
|
|
347
|
-
// tocStructure.webModule += 1
|
|
348
|
-
// break
|
|
349
|
-
case NsContent.EMimeTypes.ZIP2:
|
|
350
|
-
case NsContent.EMimeTypes.ZIP:
|
|
351
|
-
tocStructure.interactivecontent += 1;
|
|
352
|
-
break;
|
|
353
|
-
// case NsContent.EMimeTypes.YOUTUBE:
|
|
354
|
-
// tocStructure.youtube += 1
|
|
355
|
-
// break
|
|
356
|
-
default:
|
|
357
|
-
tocStructure.other += 1;
|
|
358
|
-
break;
|
|
359
|
-
}
|
|
360
|
-
return tocStructure;
|
|
361
|
-
}
|
|
362
|
-
return tocStructure;
|
|
363
|
-
}
|
|
364
|
-
filterToc(content, filterCategory = NsContent.EFilterCategory.ALL) {
|
|
365
|
-
if (content.primaryCategory === NsContent.EPrimaryCategory.RESOURCE
|
|
366
|
-
// || content.contentType === 'Knowledge Artifact'
|
|
367
|
-
|| content.primaryCategory === NsContent.EPrimaryCategory.PRACTICE_RESOURCE
|
|
368
|
-
|| content.primaryCategory === NsContent.EPrimaryCategory.FINAL_ASSESSMENT
|
|
369
|
-
|| content.primaryCategory === NsContent.EPrimaryCategory.OFFLINE_SESSION) {
|
|
370
|
-
return this.filterUnitContent(content, filterCategory) ? content : null;
|
|
371
|
-
}
|
|
372
|
-
const filteredChildren = _.map(_.get(content, 'children'), childContent => this.filterToc(childContent, filterCategory))
|
|
373
|
-
.filter(unitContent => Boolean(unitContent));
|
|
374
|
-
if (filteredChildren && filteredChildren.length) {
|
|
375
|
-
return {
|
|
376
|
-
...content,
|
|
377
|
-
children: filteredChildren,
|
|
378
|
-
};
|
|
379
|
-
}
|
|
380
|
-
return null;
|
|
381
|
-
}
|
|
382
|
-
filterUnitContent(content, filterCategory = NsContent.EFilterCategory.ALL) {
|
|
383
|
-
switch (filterCategory) {
|
|
384
|
-
case NsContent.EFilterCategory.LEARN:
|
|
385
|
-
return (!NsContentConstants.VALID_PRACTICE_RESOURCES.has(content.resourceType) &&
|
|
386
|
-
!NsContentConstants.VALID_ASSESSMENT_RESOURCES.has(content.resourceType));
|
|
387
|
-
case NsContent.EFilterCategory.PRACTICE:
|
|
388
|
-
return NsContentConstants.VALID_PRACTICE_RESOURCES.has(content.resourceType);
|
|
389
|
-
case NsContent.EFilterCategory.ASSESS:
|
|
390
|
-
return NsContentConstants.VALID_ASSESSMENT_RESOURCES.has(content.resourceType);
|
|
391
|
-
case NsContent.EFilterCategory.ALL:
|
|
392
|
-
default:
|
|
393
|
-
return true;
|
|
394
|
-
}
|
|
395
|
-
}
|
|
396
|
-
fetchContentAnalyticsClientData(contentId) {
|
|
397
|
-
if (this.analyticsFetchStatus !== 'fetching' && this.analyticsFetchStatus !== 'done') {
|
|
398
|
-
this.getContentAnalyticsClient(contentId);
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
getContentAnalyticsClient(contentId) {
|
|
402
|
-
this.analyticsFetchStatus = 'fetching';
|
|
403
|
-
const url = `${PROXY_SLAG_V8}/LA/api/la/contentanalytics?content_id=${contentId}&type=course`;
|
|
404
|
-
this.http.get(url).subscribe((result) => {
|
|
405
|
-
this.analyticsFetchStatus = 'done';
|
|
406
|
-
this.analyticsReplaySubject.next(result);
|
|
407
|
-
}, () => {
|
|
408
|
-
this.analyticsReplaySubject.next(null);
|
|
409
|
-
this.analyticsFetchStatus = 'done';
|
|
410
|
-
});
|
|
411
|
-
}
|
|
412
|
-
fetchContentAnalyticsData(contentId) {
|
|
413
|
-
if (this.analyticsFetchStatus !== 'fetching' && this.analyticsFetchStatus !== 'done') {
|
|
414
|
-
this.getContentAnalytics(contentId);
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
getContentAnalytics(contentId) {
|
|
418
|
-
this.analyticsFetchStatus = 'fetching';
|
|
419
|
-
// tslint:disable-next-line: max-line-length
|
|
420
|
-
const url = `${PROXY_SLAG_V8}/LA/LA/api/Users?refinementfilter=${encodeURIComponent('"source":["iGot","Learning Hub"]')}$${encodeURIComponent(`"courseCode": ["${contentId}"]`)}`;
|
|
421
|
-
this.http.get(url).subscribe((result) => {
|
|
422
|
-
this.analyticsFetchStatus = 'done';
|
|
423
|
-
this.analyticsReplaySubject.next(result);
|
|
424
|
-
}, () => {
|
|
425
|
-
this.analyticsReplaySubject.next(null);
|
|
426
|
-
this.analyticsFetchStatus = 'done';
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
clearAnalyticsData() {
|
|
430
|
-
if (this.analyticsReplaySubject) {
|
|
431
|
-
this.analyticsReplaySubject.unsubscribe();
|
|
432
|
-
}
|
|
433
|
-
}
|
|
434
|
-
fetchContentParents(contentId) {
|
|
435
|
-
// return this.http.get<NsContent.IContentMinimal[]>(
|
|
436
|
-
// `${API_END_POINTS.CONTENT_PARENTS}/${contentId}`,
|
|
437
|
-
// )
|
|
438
|
-
if (contentId) { }
|
|
439
|
-
return EMPTY;
|
|
440
|
-
}
|
|
441
|
-
fetchContentWhatsNext(contentId, contentType) {
|
|
442
|
-
if (contentType) {
|
|
443
|
-
return this.http.get(`${API_END_POINTS.CONTENT_NEXT}/${contentId}?contentType=${contentType}`);
|
|
444
|
-
}
|
|
445
|
-
return this.http.get(`${API_END_POINTS.CONTENT_NEXT}/${contentId}?ts=${new Date().getTime()}`);
|
|
446
|
-
}
|
|
447
|
-
fetchMoreLikeThisPaid(contentId) {
|
|
448
|
-
return this.http.get(`${API_END_POINTS.CONTENT_NEXT}/${contentId}?exclusiveContent=true&ts=${new Date().getTime()}`);
|
|
449
|
-
}
|
|
450
|
-
fetchMoreLikeThisFree(contentId) {
|
|
451
|
-
return this.http.get(`${API_END_POINTS.CONTENT_NEXT}/${contentId}?exclusiveContent=false&ts=${new Date().getTime()}`);
|
|
452
|
-
}
|
|
453
|
-
fetchContentCohorts(cohortType, contentId) {
|
|
454
|
-
return this.http.get(API_END_POINTS.COHORTS(cohortType, contentId), {
|
|
455
|
-
headers: { rootOrg: this.configSvc.rootOrg || '', org: this.configSvc.org ? this.configSvc.org[0] : '' },
|
|
456
|
-
});
|
|
457
|
-
}
|
|
458
|
-
fetchExternalContentAccess(contentId) {
|
|
459
|
-
return this.http.get(API_END_POINTS.EXTERNAL_CONTENT(contentId));
|
|
460
|
-
}
|
|
461
|
-
fetchCohortGroupUsers(groupId) {
|
|
462
|
-
return this.http.get(API_END_POINTS.COHORTS_GROUP_USER(groupId));
|
|
463
|
-
}
|
|
464
|
-
fetchMoreLikeThis(contentId, contentType) {
|
|
465
|
-
return this.http.get(API_END_POINTS.RELATED_RESOURCE(contentId, contentType));
|
|
466
|
-
}
|
|
467
|
-
fetchPostAssessmentStatus(contentId) {
|
|
468
|
-
return this.http.get(API_END_POINTS.POST_ASSESSMENT(contentId));
|
|
469
|
-
}
|
|
470
|
-
fetchGetContentData(contentId) {
|
|
471
|
-
let url = '';
|
|
472
|
-
const forPreview = window.location.href.includes('/public/') || window.location.href.includes('&preview=true');
|
|
473
|
-
if (!forPreview) {
|
|
474
|
-
return this.http.get(API_END_POINTS.GET_CONTENT(contentId));
|
|
475
|
-
}
|
|
476
|
-
if (window.location.href.includes('editMode=true') && window.location.href.includes('_rc')) {
|
|
477
|
-
url = `/apis/proxies/v8/action/content/v3/read/${contentId}`;
|
|
478
|
-
}
|
|
479
|
-
else {
|
|
480
|
-
url = `/api/content/v1/read/${contentId}`;
|
|
481
|
-
}
|
|
482
|
-
return this.http.get(url);
|
|
483
|
-
}
|
|
484
|
-
fetchContentParent(contentId, data, forPreview = false) {
|
|
485
|
-
return this.http.post(forPreview
|
|
486
|
-
? API_END_POINTS.CONTENT_AUTH_PARENT(contentId, this.configSvc.rootOrg || '', this.configSvc.org ? this.configSvc.org[0] : '')
|
|
487
|
-
: API_END_POINTS.CONTENT_PARENT(contentId), data);
|
|
488
|
-
}
|
|
489
|
-
createBatch(batchData) {
|
|
490
|
-
return this.http.post(API_END_POINTS.BATCH_CREATE, { request: batchData });
|
|
491
|
-
}
|
|
492
|
-
async mapCompletionPercentageProgram(content, enrolmentList, collectionId) {
|
|
493
|
-
this.contentLoader.next(true);
|
|
494
|
-
let totalCount = 0;
|
|
495
|
-
let leafnodeCount = 0;
|
|
496
|
-
let completedLeafNodes = [];
|
|
497
|
-
let firstUncompleteCourse = '';
|
|
498
|
-
let inprogressDataCheck = [];
|
|
499
|
-
if (content && content.children) {
|
|
500
|
-
leafnodeCount = content.leafNodesCount;
|
|
501
|
-
this.contentLoader.next(true);
|
|
502
|
-
const foundParentContent = this.findEnrolmentByCollectionId(enrolmentList, collectionId || content.identifier);
|
|
503
|
-
if (foundParentContent && foundParentContent.completionPercentage === 100) {
|
|
504
|
-
await this.mapCompletionChildPercentageProgram(content);
|
|
505
|
-
totalCount = content.leafNodesCount;
|
|
506
|
-
}
|
|
507
|
-
else {
|
|
508
|
-
if (content?.primaryCategory !== NsContent.EPrimaryCategory.COURSE) {
|
|
509
|
-
for (let i = 0; i < content.children.length; i += 1) {
|
|
510
|
-
// content.children.forEach(async (parentChild,index) => {
|
|
511
|
-
const parentChild = content.children[i];
|
|
512
|
-
if (parentChild.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
|
|
513
|
-
const foundContent = this.findEnrolmentByCollectionId(enrolmentList, parentChild?.identifier);
|
|
514
|
-
// tslint:disable-next-line: max-line-length
|
|
515
|
-
// totalCount = foundContent && foundContent.completionPercentage ? totalCount + foundContent.completionPercentage : totalCount + 0
|
|
516
|
-
// content.completionPercentage = Math.round(totalCount / leafnodeCount)
|
|
517
|
-
if (foundContent && foundContent.completionPercentage === 100) {
|
|
518
|
-
this.contentLoader.next(true);
|
|
519
|
-
totalCount = totalCount += parentChild.leafNodesCount;
|
|
520
|
-
completedLeafNodes = [...completedLeafNodes, ...parentChild.leafNodes];
|
|
521
|
-
if (foundContent.issuedCertificates.length > 0) {
|
|
522
|
-
const certificate = foundContent.issuedCertificates.sort((a, b) => new Date(a.lastIssuedOn).getTime() - new Date(b.lastIssuedOn).getTime());
|
|
523
|
-
const certId = certificate[0].identifier;
|
|
524
|
-
parentChild.issuedCertificatesId = certId;
|
|
525
|
-
// const certData: any = await this.dowonloadCertificate(certId).toPromise().catch(_error => {
|
|
526
|
-
// this.contentLoader.next(false)
|
|
527
|
-
// })
|
|
528
|
-
// if (certData && certData.result) {
|
|
529
|
-
// parentChild.issuedCertificatesSVG = certData.result.printUri
|
|
530
|
-
// }
|
|
531
|
-
this.contentLoader.next(false);
|
|
532
|
-
}
|
|
533
|
-
parentChild.completionPercentage = 100;
|
|
534
|
-
parentChild.completionStatus = 2;
|
|
535
|
-
await this.mapCompletionChildPercentageProgram(parentChild);
|
|
536
|
-
}
|
|
537
|
-
else {
|
|
538
|
-
if (foundContent) {
|
|
539
|
-
this.contentLoader.next(true);
|
|
540
|
-
const language = this.contentLangSvc.getContentLanguage(parentChild);
|
|
541
|
-
const req = {
|
|
542
|
-
request: {
|
|
543
|
-
batchId: foundContent.batch.batchId,
|
|
544
|
-
userId: foundContent.userId,
|
|
545
|
-
language: language,
|
|
546
|
-
courseId: foundContent.collectionId,
|
|
547
|
-
contentIds: [],
|
|
548
|
-
fields: [
|
|
549
|
-
'progressdetails',
|
|
550
|
-
],
|
|
551
|
-
},
|
|
552
|
-
};
|
|
553
|
-
firstUncompleteCourse = (parentChild.completionPercentage === 0 || !parentChild.completionPercentage) &&
|
|
554
|
-
!firstUncompleteCourse ? parentChild : firstUncompleteCourse;
|
|
555
|
-
inprogressDataCheck = inprogressDataCheck;
|
|
556
|
-
await this.fetchContentHistoryV2(req).toPromise().then((progressdata) => {
|
|
557
|
-
const data = progressdata;
|
|
558
|
-
if (data.result && data?.result?.contentList?.length > 0) {
|
|
559
|
-
const completedCount = data.result.contentList.filter((ele) => ele.progress === 100);
|
|
560
|
-
this.checkCompletedLeafnodes(completedLeafNodes, completedCount);
|
|
561
|
-
totalCount = completedLeafNodes.length;
|
|
562
|
-
inprogressDataCheck = [...inprogressDataCheck, ...data.result.contentList];
|
|
563
|
-
// inprogressDataCheck = inprogressDataCheck ? inprogressDataCheck : data.result.contentList
|
|
564
|
-
this.updateResumaData(inprogressDataCheck);
|
|
565
|
-
this.mapCompletionPercentage(parentChild, data.result.contentList);
|
|
566
|
-
this.mapModuleCount(parentChild);
|
|
567
|
-
}
|
|
568
|
-
else {
|
|
569
|
-
this.mapModuleCount(parentChild);
|
|
570
|
-
}
|
|
571
|
-
return progressdata;
|
|
572
|
-
});
|
|
573
|
-
this.contentLoader.next(false);
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
// else {
|
|
578
|
-
// if (content.primaryCategory !== NsContent.EPrimaryCategory.BLENDED_PROGRAM) {
|
|
579
|
-
// this.contentLoader.next(true)
|
|
580
|
-
// const foundContent = enrolmentList && enrolmentList.find((el: any) => el.collectionId === content.identifier)
|
|
581
|
-
// if (foundContent) {
|
|
582
|
-
// const req = {
|
|
583
|
-
// request: {
|
|
584
|
-
// batchId: foundContent.batch.batchId,
|
|
585
|
-
// userId: foundContent.userId,
|
|
586
|
-
// courseId: foundContent.collectionId,
|
|
587
|
-
// contentIds: [],
|
|
588
|
-
// fields: [
|
|
589
|
-
// 'progressdetails',
|
|
590
|
-
// ],
|
|
591
|
-
// },
|
|
592
|
-
// }
|
|
593
|
-
// await this.fetchContentHistoryV2(req).toPromise().then((progressdata: any) => {
|
|
594
|
-
// const data: any = progressdata
|
|
595
|
-
// if (data.result && data.result.contentList.length > 0) {
|
|
596
|
-
// const completedCount = data.result.contentList.filter((ele: any) => ele.progress === 100)
|
|
597
|
-
// this.checkCompletedLeafnodes(completedLeafNodes, completedCount)
|
|
598
|
-
// totalCount = completedLeafNodes.length
|
|
599
|
-
// inprogressDataCheck = inprogressDataCheck ? inprogressDataCheck : data.result.contentList
|
|
600
|
-
// this.updateResumaData(inprogressDataCheck)
|
|
601
|
-
// this.mapCompletionPercentage(content, data.result.contentList)
|
|
602
|
-
// }
|
|
603
|
-
// this.contentLoader.next(false)
|
|
604
|
-
// return progressdata
|
|
605
|
-
// })
|
|
606
|
-
// }
|
|
607
|
-
// this.contentLoader.next(false)
|
|
608
|
-
// }
|
|
609
|
-
// }
|
|
610
|
-
this.contentLoader.next(false);
|
|
611
|
-
}
|
|
612
|
-
}
|
|
613
|
-
if (content.primaryCategory === NsContent.EPrimaryCategory.BLENDED_PROGRAM
|
|
614
|
-
|| content.primaryCategory === NsContent.EPrimaryCategory.COURSE
|
|
615
|
-
|| content.primaryCategory === NsContent.EPrimaryCategory.STANDALONE_ASSESSMENT
|
|
616
|
-
|| content.primaryCategory === NsContent.EPrimaryCategory.CURATED_PROGRAM) {
|
|
617
|
-
// this.mapCompletionPercentage(content, this.resumeData)
|
|
618
|
-
const foundParentContent = this.findEnrolmentByCollectionId(enrolmentList, collectionId || content?.identifier);
|
|
619
|
-
const language = this.contentLangSvc.getContentLanguage(content);
|
|
620
|
-
const req = {
|
|
621
|
-
request: {
|
|
622
|
-
batchId: foundParentContent?.batch?.batchId,
|
|
623
|
-
userId: foundParentContent?.userId,
|
|
624
|
-
courseId: foundParentContent?.collectionId,
|
|
625
|
-
language: language,
|
|
626
|
-
contentIds: [],
|
|
627
|
-
fields: [
|
|
628
|
-
'progressdetails',
|
|
629
|
-
],
|
|
630
|
-
},
|
|
631
|
-
};
|
|
632
|
-
await this.fetchContentHistoryV2(req).toPromise().then((progressdata) => {
|
|
633
|
-
const data = progressdata;
|
|
634
|
-
if (data && data.result && data.result.contentList.length > 0) {
|
|
635
|
-
const completedCount = data.result.contentList.filter((ele) => ele.progress === 100);
|
|
636
|
-
this.checkCompletedLeafnodes(completedLeafNodes, completedCount);
|
|
637
|
-
totalCount = completedLeafNodes.length;
|
|
638
|
-
inprogressDataCheck = [...inprogressDataCheck, ...data.result.contentList];
|
|
639
|
-
// inprogressDataCheck = inprogressDataCheck ? inprogressDataCheck : data.result.contentList
|
|
640
|
-
this.updateResumaData(inprogressDataCheck);
|
|
641
|
-
this.mapCompletionPercentage(content, data.result.contentList);
|
|
642
|
-
}
|
|
643
|
-
this.contentLoader.next(false);
|
|
644
|
-
return progressdata;
|
|
645
|
-
});
|
|
646
|
-
}
|
|
647
|
-
if (inprogressDataCheck && inprogressDataCheck.length === 0 && firstUncompleteCourse) {
|
|
648
|
-
const firstChildData = this.widgetSvc.getFirstChildInHierarchy(firstUncompleteCourse);
|
|
649
|
-
const childEnrollmentData = enrolmentList.find((el) => el.collectionId === firstUncompleteCourse.identifier);
|
|
650
|
-
const resumeData = [{
|
|
651
|
-
contentId: firstChildData.identifier,
|
|
652
|
-
batchId: childEnrollmentData && childEnrollmentData.batchId,
|
|
653
|
-
completedCount: 1,
|
|
654
|
-
completionPercentage: 0.0,
|
|
655
|
-
progress: 0,
|
|
656
|
-
viewCount: 1,
|
|
657
|
-
courseId: childEnrollmentData && childEnrollmentData.courseId,
|
|
658
|
-
collectionId: childEnrollmentData && childEnrollmentData.courseId,
|
|
659
|
-
status: 1,
|
|
660
|
-
}];
|
|
661
|
-
inprogressDataCheck = resumeData;
|
|
662
|
-
this.updateResumaData(inprogressDataCheck);
|
|
663
|
-
}
|
|
664
|
-
}
|
|
665
|
-
// const parentContent = enrolmentList.find((el: any) => el.collectionId === content.identifier)
|
|
666
|
-
// if (!parentContent.completionPercentage) {
|
|
667
|
-
const calculatedPct = Math.floor((totalCount / leafnodeCount) * 100);
|
|
668
|
-
content.completionPercentage = isNaN(calculatedPct) ? 0 : calculatedPct;
|
|
669
|
-
content.completionStatus = content.completionPercentage >= 100 ? 2 : (content.completionPercentage > 0 ? 1 : 0);
|
|
670
|
-
if (content.completionPercentage === 100 && inprogressDataCheck && inprogressDataCheck.length === 0 && !firstUncompleteCourse) {
|
|
671
|
-
const firstChildData = this.widgetSvc.getFirstChildInHierarchy(content);
|
|
672
|
-
const childEnrollmentData = enrolmentList.find((el) => el.collectionId === content.children[0].identifier);
|
|
673
|
-
const resumeData = [{
|
|
674
|
-
contentId: firstChildData.identifier,
|
|
675
|
-
batchId: childEnrollmentData && childEnrollmentData.batchId,
|
|
676
|
-
completedCount: 1,
|
|
677
|
-
completionPercentage: 100,
|
|
678
|
-
progress: 2,
|
|
679
|
-
viewCount: 1,
|
|
680
|
-
courseId: childEnrollmentData && childEnrollmentData.courseId,
|
|
681
|
-
collectionId: childEnrollmentData && childEnrollmentData.courseId,
|
|
682
|
-
status: 2,
|
|
683
|
-
}];
|
|
684
|
-
inprogressDataCheck = resumeData;
|
|
685
|
-
this.updateResumaData(inprogressDataCheck);
|
|
686
|
-
}
|
|
687
|
-
// // } else {
|
|
688
|
-
// content.completionPercentage = parentContent.completionPercentage
|
|
689
|
-
// // }
|
|
690
|
-
// })
|
|
691
|
-
// this.mapModuleDurationAndProgress(content, content)
|
|
692
|
-
this.callHirarchyProgressHashmap(content);
|
|
693
|
-
this.checkModuleWiseData(content);
|
|
694
|
-
// Compute milestone locking AFTER progress data is populated
|
|
695
|
-
if (content.courseCategory === 'Learning Pathway') {
|
|
696
|
-
this.computeMilestoneLockingStatus();
|
|
697
|
-
// Ensure hashmap updates are published for change detection
|
|
698
|
-
this.hashmap = { ...this.hashmap };
|
|
699
|
-
}
|
|
700
|
-
this.contentLoader.next(false);
|
|
701
|
-
}
|
|
702
|
-
}
|
|
703
|
-
checkCompletedLeafnodes(leafNodes, completedCount) {
|
|
704
|
-
if (completedCount.length > 0) {
|
|
705
|
-
completedCount.forEach((ele) => {
|
|
706
|
-
if (!leafNodes.includes(ele.contentId)) {
|
|
707
|
-
leafNodes.push(ele.contentId);
|
|
708
|
-
}
|
|
709
|
-
});
|
|
710
|
-
}
|
|
711
|
-
}
|
|
712
|
-
// async getProgressForChildCourse(request: any, content: any) {
|
|
713
|
-
// const data: any = await this.fetchContentHistoryV2(request).toPromise().catch(_error => {})
|
|
714
|
-
// if (data.result && data.result.contentList.length > 0) {
|
|
715
|
-
// this.mapCompletionPercentage(content, data.result.contentList)
|
|
716
|
-
// }
|
|
717
|
-
// }
|
|
718
|
-
findEnrolmentByCollectionId(enrolmentList, identifier) {
|
|
719
|
-
return enrolmentList && enrolmentList?.length && enrolmentList.find((el) => el?.collectionId === identifier);
|
|
720
|
-
}
|
|
721
|
-
async mapCompletionChildPercentageProgram(course) {
|
|
722
|
-
if (course && course.children) {
|
|
723
|
-
await course.children.map(async (courseChild) => {
|
|
724
|
-
if ((courseChild && courseChild.children) || courseChild.primaryCategory === NsContent.EPrimaryCategory.MODULE) {
|
|
725
|
-
this.mapCompletionChildPercentageProgram(courseChild);
|
|
726
|
-
course['moduleCount'] = course['moduleCount'] ? course['moduleCount'] + 1 : 1;
|
|
727
|
-
}
|
|
728
|
-
else {
|
|
729
|
-
courseChild['completionPercentage'] = 100;
|
|
730
|
-
courseChild['completionStatus'] = 2;
|
|
731
|
-
}
|
|
732
|
-
});
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
mapModuleDurationAndProgress(content, parent) {
|
|
736
|
-
if (content && content.children) {
|
|
737
|
-
if (content.primaryCategory === NsContent.EPrimaryCategory.MODULE) {
|
|
738
|
-
// content.children.map((item: NsContent.IContent)=> {
|
|
739
|
-
/* tslint:disable-next-line */
|
|
740
|
-
content = this.getCalculationsFromChildren(content);
|
|
741
|
-
// })
|
|
742
|
-
}
|
|
743
|
-
content.children.map((item) => {
|
|
744
|
-
// if (item.primaryCategory === NsContent.EPrimaryCategory.MODULE) {
|
|
745
|
-
// this.mapModuleDurationAndProgress(item, parent)
|
|
746
|
-
// } else {
|
|
747
|
-
// this.mapModuleDurationAndProgress(item, parent)
|
|
748
|
-
// }
|
|
749
|
-
if (item && item.children) {
|
|
750
|
-
this.mapModuleDurationAndProgress(item, parent);
|
|
751
|
-
}
|
|
752
|
-
});
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
createHirarchyProgressHashmap(hierarchyData, rootCourseCategory) {
|
|
756
|
-
if (hierarchyData && hierarchyData.children) {
|
|
757
|
-
hierarchyData.children.forEach((child) => {
|
|
758
|
-
if (child && child.children) {
|
|
759
|
-
this.createHirarchyProgressHashmap(child, rootCourseCategory);
|
|
760
|
-
}
|
|
761
|
-
const primaryCat = child.primaryCategory;
|
|
762
|
-
const courseCat = (child.courseCategory || child.primaryCategory || '');
|
|
763
|
-
const isMilestone = primaryCat === 'Milestone' || courseCat === 'Milestone';
|
|
764
|
-
const isCollection = child.mimeType === NsContent.EMimeTypes.COLLECTION;
|
|
765
|
-
const isModule = child.primaryCategory === NsContent.EPrimaryCategory.MODULE;
|
|
766
|
-
const isResource = child.primaryCategory === NsContent.EPrimaryCategory.RESOURCE ||
|
|
767
|
-
child.primaryCategory === NsContent.EPrimaryCategory.PRACTICE_RESOURCE ||
|
|
768
|
-
child.primaryCategory === NsContent.EPrimaryCategory.FINAL_ASSESSMENT ||
|
|
769
|
-
child.primaryCategory === NsContent.EPrimaryCategory.COMP_ASSESSMENT;
|
|
770
|
-
const isLearningPathway = rootCourseCategory === 'Learning Pathway';
|
|
771
|
-
// Check if content is mandatory (isMandatory flag or mandatory property)
|
|
772
|
-
const isMandatory = child.isMandatory === true || child.mandatory === true;
|
|
773
|
-
let localMap = {
|
|
774
|
-
parent: child?.parent,
|
|
775
|
-
identifier: child.identifier,
|
|
776
|
-
leafNodesCount: child.leafNodesCount || null,
|
|
777
|
-
leafNodes: child.leafNodes || [],
|
|
778
|
-
completionPercentage: child.completionPercentage || child.progress || 0,
|
|
779
|
-
completionStatus: child.completionStatus || child.status || 0,
|
|
780
|
-
status: child.status || child.completionStatus || 0,
|
|
781
|
-
progress: child.progress,
|
|
782
|
-
primaryCategory: child.primaryCategory,
|
|
783
|
-
courseCategory: courseCat,
|
|
784
|
-
duration: child.duration || 0,
|
|
785
|
-
expectedDuration: child.expectedDuration || 0,
|
|
786
|
-
// Additional metadata for performance optimization
|
|
787
|
-
mimeType: child.mimeType,
|
|
788
|
-
isLocked: child.isLocked || false,
|
|
789
|
-
artifactUrl: child.artifactUrl || null,
|
|
790
|
-
name: child.name || '',
|
|
791
|
-
contentType: child.contentType || '',
|
|
792
|
-
// Pre-computed flags for Learning Pathway
|
|
793
|
-
isMilestone: isMilestone,
|
|
794
|
-
isCollection: isCollection,
|
|
795
|
-
isModule: isModule,
|
|
796
|
-
isResource: isResource,
|
|
797
|
-
isLearningPathway: isLearningPathway,
|
|
798
|
-
isMandatory: isMandatory,
|
|
799
|
-
// Milestone specific data
|
|
800
|
-
milestoneIndex: child.milestoneIndex,
|
|
801
|
-
completedLeafNodesCount: child.completedLeafNodesCount || 0,
|
|
802
|
-
// Pre-assessment flag (for milestone gating)
|
|
803
|
-
isPreAssessment: child.isPreAssessment || false,
|
|
804
|
-
};
|
|
805
|
-
// Debug logging for milestones
|
|
806
|
-
if (isMilestone) {
|
|
807
|
-
// Progress tracked for milestone
|
|
808
|
-
}
|
|
809
|
-
this.hashmap[child.identifier] = localMap;
|
|
810
|
-
});
|
|
811
|
-
}
|
|
812
|
-
}
|
|
813
|
-
createPreAssessmentHirarchyProgressHashmap(hierarchyData) {
|
|
814
|
-
if (hierarchyData && hierarchyData.preEnrolmentResources) {
|
|
815
|
-
hierarchyData.preEnrolmentResources.forEach((child) => {
|
|
816
|
-
if (child && child.preEnrolmentResources) {
|
|
817
|
-
this.createPreAssessmentHirarchyProgressHashmap(child);
|
|
818
|
-
}
|
|
819
|
-
let localMap = {};
|
|
820
|
-
localMap = {
|
|
821
|
-
parent: child?.parent,
|
|
822
|
-
identifier: child.identifier,
|
|
823
|
-
leafNodesCount: child.leafNodesCount || null,
|
|
824
|
-
leafNodes: child.leafNodes || [],
|
|
825
|
-
completionPercentage: child.completionPercentage || child.progress,
|
|
826
|
-
completionStatus: child.completionStatus,
|
|
827
|
-
status: child.status || child.completionStatus || 0,
|
|
828
|
-
progress: child.progress,
|
|
829
|
-
primaryCategory: child.primaryCategory,
|
|
830
|
-
courseCategory: child.courseCategory || child.primaryCategory || '',
|
|
831
|
-
duration: child.duration || 0,
|
|
832
|
-
expectedDuration: child.expectedDuration || 0,
|
|
833
|
-
// Mark as pre-assessment ONLY if explicitly set - do NOT default to true
|
|
834
|
-
isPreAssessment: child.isPreAssessment || false,
|
|
835
|
-
};
|
|
836
|
-
this.hashmap[child.identifier] = localMap;
|
|
837
|
-
});
|
|
838
|
-
}
|
|
839
|
-
}
|
|
840
|
-
callHirarchyProgressHashmap(hierarchyData) {
|
|
841
|
-
if (hierarchyData) {
|
|
842
|
-
const rootCourseCategory = hierarchyData.courseCategory || hierarchyData.primaryCategory || '';
|
|
843
|
-
const isLearningPathway = rootCourseCategory === 'Learning Pathway';
|
|
844
|
-
this.hashmap[hierarchyData.identifier] = {
|
|
845
|
-
parent: hierarchyData.parent,
|
|
846
|
-
identifier: hierarchyData.identifier,
|
|
847
|
-
leafNodesCount: hierarchyData.leafNodesCount || null,
|
|
848
|
-
leafNodes: hierarchyData.leafNodes || [],
|
|
849
|
-
completionPercentage: hierarchyData.completionPercentage || hierarchyData.progress || 0,
|
|
850
|
-
completionStatus: hierarchyData.completionStatus || 0,
|
|
851
|
-
progress: hierarchyData.progress,
|
|
852
|
-
primaryCategory: hierarchyData.primaryCategory,
|
|
853
|
-
courseCategory: rootCourseCategory,
|
|
854
|
-
expectedDuration: hierarchyData.expectedDuration || 0,
|
|
855
|
-
// Additional metadata
|
|
856
|
-
mimeType: hierarchyData.mimeType,
|
|
857
|
-
isLocked: hierarchyData.isLocked || false,
|
|
858
|
-
artifactUrl: hierarchyData.artifactUrl || null,
|
|
859
|
-
name: hierarchyData.name || '',
|
|
860
|
-
contentType: hierarchyData.contentType || '',
|
|
861
|
-
isMilestone: false,
|
|
862
|
-
isCollection: hierarchyData.mimeType === NsContent.EMimeTypes.COLLECTION,
|
|
863
|
-
isModule: hierarchyData.primaryCategory === NsContent.EPrimaryCategory.MODULE,
|
|
864
|
-
isResource: false,
|
|
865
|
-
isLearningPathway: isLearningPathway,
|
|
866
|
-
};
|
|
867
|
-
if (hierarchyData.primaryCategory === NsContent.EPrimaryCategory.CURATED_PROGRAM &&
|
|
868
|
-
hierarchyData.compatibilityLevel >= 5 && hierarchyData.contextLockingType &&
|
|
869
|
-
hierarchyData.contextLockingType === NsContent.EContextLockingType.COURSE_ASSESSMENT_ONLY) {
|
|
870
|
-
this.hashmap[hierarchyData.identifier] = {
|
|
871
|
-
...this.hashmap[hierarchyData.identifier],
|
|
872
|
-
contextLockingType: hierarchyData.contextLockingType,
|
|
873
|
-
compatibilityLevel: hierarchyData.compatibilityLevel,
|
|
874
|
-
};
|
|
875
|
-
}
|
|
876
|
-
this.createHirarchyProgressHashmap(hierarchyData, rootCourseCategory);
|
|
877
|
-
// NOTE: computeMilestoneLockingStatus is called AFTER progress data is populated
|
|
878
|
-
// in mapCompletionPercentageProgram, not here where completion data is still 0
|
|
879
|
-
this.hashmap = { ...this.hashmap };
|
|
880
|
-
}
|
|
881
|
-
}
|
|
882
|
-
/**
|
|
883
|
-
* Pre-compute milestone locking status for all milestones in Learning Pathway
|
|
884
|
-
* This avoids expensive calculations in component getters
|
|
885
|
-
*
|
|
886
|
-
* Locking Rules:
|
|
887
|
-
* 0. If user is not enrolled, ALL milestones are locked
|
|
888
|
-
* 1. All milestones are locked by default
|
|
889
|
-
* 2. Milestone 1 (M1) unlocks when pre-assessment is completed
|
|
890
|
-
* 3. Milestone N (N > 1) unlocks when:
|
|
891
|
-
* - All mandatory learning items in Milestone N-1 are completed
|
|
892
|
-
* - The assessment of Milestone N-1 is completed
|
|
893
|
-
*/
|
|
894
|
-
computeMilestoneLockingStatus(isEnrolled = true) {
|
|
895
|
-
if (!this.hashmap || Object.keys(this.hashmap).length === 0) {
|
|
896
|
-
return;
|
|
897
|
-
}
|
|
898
|
-
console.log('=== computeMilestoneLockingStatus ===');
|
|
899
|
-
console.log('User enrolled:', isEnrolled);
|
|
900
|
-
// Capture initial state to detect changes
|
|
901
|
-
const initialHashmapSnapshot = JSON.stringify(this.hashmap);
|
|
902
|
-
// Get all milestone entries from hashmap sorted by their index or number
|
|
903
|
-
const milestoneEntries = Object.keys(this.hashmap)
|
|
904
|
-
.filter(key => {
|
|
905
|
-
const item = this.hashmap[key];
|
|
906
|
-
return item.isMilestone || item.primaryCategory === 'Milestone' || item.courseCategory === 'Milestone';
|
|
907
|
-
})
|
|
908
|
-
.sort((a, b) => {
|
|
909
|
-
// Sort by milestoneIndex if available, otherwise by number in ID
|
|
910
|
-
const itemA = this.hashmap[a];
|
|
911
|
-
const itemB = this.hashmap[b];
|
|
912
|
-
if (itemA.milestoneIndex !== undefined && itemB.milestoneIndex !== undefined) {
|
|
913
|
-
return itemA.milestoneIndex - itemB.milestoneIndex;
|
|
914
|
-
}
|
|
915
|
-
const numA = parseInt(a.replace(/\D/g, '')) || 0;
|
|
916
|
-
const numB = parseInt(b.replace(/\D/g, '')) || 0;
|
|
917
|
-
return numA - numB;
|
|
918
|
-
});
|
|
919
|
-
// If user is NOT enrolled, lock ALL milestones
|
|
920
|
-
if (!isEnrolled) {
|
|
921
|
-
console.log('User not enrolled - locking ALL milestones');
|
|
922
|
-
milestoneEntries.forEach(milestoneId => {
|
|
923
|
-
this.hashmap[milestoneId].computedIsLocked = true;
|
|
924
|
-
});
|
|
925
|
-
// Also lock all children
|
|
926
|
-
Object.keys(this.hashmap).forEach(key => {
|
|
927
|
-
const item = this.hashmap[key];
|
|
928
|
-
if (!item.isMilestone) {
|
|
929
|
-
this.hashmap[key].isParentMilestoneLocked = true;
|
|
930
|
-
}
|
|
931
|
-
});
|
|
932
|
-
this.hashmap = { ...this.hashmap };
|
|
933
|
-
this.hashmapUpdated.next({ timestamp: Date.now(), hashmap: this.hashmap });
|
|
934
|
-
return;
|
|
935
|
-
}
|
|
936
|
-
// Check if pre-assessment is completed (required to unlock M1)
|
|
937
|
-
const isPreAssessmentCompleted = this.checkPreAssessmentCompletion();
|
|
938
|
-
milestoneEntries.forEach((milestoneId, index) => {
|
|
939
|
-
const milestone = this.hashmap[milestoneId];
|
|
940
|
-
if (!milestone)
|
|
941
|
-
return;
|
|
942
|
-
// First milestone (M1) - unlocks when pre-assessment is completed
|
|
943
|
-
if (index === 0) {
|
|
944
|
-
this.hashmap[milestoneId].computedIsLocked = !isPreAssessmentCompleted;
|
|
945
|
-
return;
|
|
946
|
-
}
|
|
947
|
-
// For subsequent milestones (M2, M3, etc.), check if previous milestone is fully completed
|
|
948
|
-
const previousMilestoneId = milestoneEntries[index - 1];
|
|
949
|
-
const previousMilestone = this.hashmap[previousMilestoneId];
|
|
950
|
-
if (previousMilestone) {
|
|
951
|
-
// SIMPLIFIED APPROACH: Check if previous milestone is 100% complete
|
|
952
|
-
// This uses the aggregated completion percentage which is already calculated
|
|
953
|
-
// Use Number() to ensure proper numeric comparison
|
|
954
|
-
const prevCompletionPct = Number(previousMilestone.completionPercentage) || 0;
|
|
955
|
-
const prevCompletionStatus = Number(previousMilestone.completionStatus) || 0;
|
|
956
|
-
const prevStatus = Number(previousMilestone.status) || 0;
|
|
957
|
-
const prevCompletedLeafNodes = Number(previousMilestone.completedLeafNodesCount) || 0;
|
|
958
|
-
const prevLeafNodesCount = Number(previousMilestone.leafNodesCount) || 0;
|
|
959
|
-
const previousMilestoneComplete = prevCompletionPct >= 100 ||
|
|
960
|
-
prevCompletionStatus === 2 ||
|
|
961
|
-
prevStatus === 2 ||
|
|
962
|
-
(prevLeafNodesCount > 0 && prevCompletedLeafNodes >= prevLeafNodesCount);
|
|
963
|
-
// If simple check doesn't show complete, fall back to detailed check
|
|
964
|
-
let canUnlock = previousMilestoneComplete;
|
|
965
|
-
if (!canUnlock) {
|
|
966
|
-
// Fallback: Check individual items
|
|
967
|
-
const isPreviousMilestoneAssessmentComplete = this.checkMilestoneAssessmentComplete(previousMilestoneId);
|
|
968
|
-
const isPreviousMilestoneMandatoryComplete = this.checkMilestoneMandatoryContentComplete(previousMilestoneId);
|
|
969
|
-
canUnlock = isPreviousMilestoneAssessmentComplete && isPreviousMilestoneMandatoryComplete;
|
|
970
|
-
}
|
|
971
|
-
this.hashmap[milestoneId].computedIsLocked = !canUnlock;
|
|
972
|
-
}
|
|
973
|
-
else {
|
|
974
|
-
this.hashmap[milestoneId].computedIsLocked = true;
|
|
975
|
-
}
|
|
976
|
-
});
|
|
977
|
-
// Now compute parent milestone lock status for all children
|
|
978
|
-
Object.keys(this.hashmap).forEach(key => {
|
|
979
|
-
const item = this.hashmap[key];
|
|
980
|
-
if (item.isMilestone)
|
|
981
|
-
return; // Skip milestones themselves
|
|
982
|
-
// Traverse up to find if any ancestor milestone is locked
|
|
983
|
-
let currentParentId = item.parent;
|
|
984
|
-
let depth = 0;
|
|
985
|
-
const maxDepth = 5;
|
|
986
|
-
while (currentParentId && depth < maxDepth) {
|
|
987
|
-
const parentData = this.hashmap[currentParentId];
|
|
988
|
-
if (parentData) {
|
|
989
|
-
if (parentData.isMilestone && parentData.computedIsLocked) {
|
|
990
|
-
this.hashmap[key].isParentMilestoneLocked = true;
|
|
991
|
-
break;
|
|
992
|
-
}
|
|
993
|
-
currentParentId = parentData.parent;
|
|
994
|
-
}
|
|
995
|
-
else {
|
|
996
|
-
break;
|
|
997
|
-
}
|
|
998
|
-
depth++;
|
|
999
|
-
}
|
|
1000
|
-
if (!this.hashmap[key].isParentMilestoneLocked) {
|
|
1001
|
-
this.hashmap[key].isParentMilestoneLocked = false;
|
|
1002
|
-
}
|
|
1003
|
-
});
|
|
1004
|
-
// Create new hashmap reference to trigger Angular change detection
|
|
1005
|
-
this.hashmap = { ...this.hashmap };
|
|
1006
|
-
// Emit update event if hashmap changed (milestone lock status updated)
|
|
1007
|
-
const finalHashmapSnapshot = JSON.stringify(this.hashmap);
|
|
1008
|
-
if (initialHashmapSnapshot !== finalHashmapSnapshot) {
|
|
1009
|
-
this.hashmapUpdated.next({ timestamp: Date.now(), hashmap: this.hashmap });
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
/**
|
|
1013
|
-
* Trigger milestone lock update when hashmap progress is updated externally
|
|
1014
|
-
* Called from viewer-util.service.ts after progress updates
|
|
1015
|
-
*/
|
|
1016
|
-
triggerMilestoneLockUpdate() {
|
|
1017
|
-
// Check if we have a Learning Pathway in the hashmap
|
|
1018
|
-
const hasLearningPathway = Object.keys(this.hashmap).some(key => {
|
|
1019
|
-
const item = this.hashmap[key];
|
|
1020
|
-
return item.isLearningPathway && item.courseCategory === 'Learning Pathway';
|
|
1021
|
-
});
|
|
1022
|
-
if (hasLearningPathway) {
|
|
1023
|
-
console.log('🔄 Triggering milestone lock recomputation after progress update');
|
|
1024
|
-
// Assume enrolled since progress was just updated
|
|
1025
|
-
this.computeMilestoneLockingStatus(true);
|
|
1026
|
-
}
|
|
1027
|
-
}
|
|
1028
|
-
/**
|
|
1029
|
-
* Check if pre-assessment (preliminary assessment) is completed
|
|
1030
|
-
* Pre-assessment is typically a Course Assessment at the root level of Learning Pathway (before milestones)
|
|
1031
|
-
*/
|
|
1032
|
-
checkPreAssessmentCompletion() {
|
|
1033
|
-
// Find the Learning Pathway root
|
|
1034
|
-
let learningPathwayId = null;
|
|
1035
|
-
for (const key of Object.keys(this.hashmap)) {
|
|
1036
|
-
const item = this.hashmap[key];
|
|
1037
|
-
if (item.isLearningPathway && item.courseCategory === 'Learning Pathway') {
|
|
1038
|
-
learningPathwayId = key;
|
|
1039
|
-
break;
|
|
1040
|
-
}
|
|
1041
|
-
}
|
|
1042
|
-
console.log('Checking pre-assessment completion. Learning Pathway ID:', learningPathwayId);
|
|
1043
|
-
// PRIORITY 1: Look for items explicitly marked as pre-assessment
|
|
1044
|
-
for (const key of Object.keys(this.hashmap)) {
|
|
1045
|
-
const item = this.hashmap[key];
|
|
1046
|
-
if (item.isPreAssessment === true) {
|
|
1047
|
-
// Must check for actual completion - not just any value
|
|
1048
|
-
const isCompleted = (item.completionStatus === 2 || item.status === 2 ||
|
|
1049
|
-
(item.completionPercentage !== undefined && item.completionPercentage >= 100) ||
|
|
1050
|
-
(item.progress !== undefined && item.progress >= 100));
|
|
1051
|
-
console.log(`✅ Pre-assessment found (isPreAssessment flag): ${key}`, {
|
|
1052
|
-
name: item.name,
|
|
1053
|
-
completionStatus: item.completionStatus,
|
|
1054
|
-
status: item.status,
|
|
1055
|
-
completionPercentage: item.completionPercentage,
|
|
1056
|
-
progress: item.progress,
|
|
1057
|
-
isCompleted,
|
|
1058
|
-
// Show ALL fields to debug what's available
|
|
1059
|
-
allData: JSON.stringify(item, null, 2)
|
|
1060
|
-
});
|
|
1061
|
-
// Pre-assessment exists - return its completion status (true/false)
|
|
1062
|
-
return isCompleted;
|
|
1063
|
-
}
|
|
1064
|
-
}
|
|
1065
|
-
// PRIORITY 2: Find pre-assessment in hashmap - direct child of Learning Pathway that is NOT a milestone
|
|
1066
|
-
// Check for first non-milestone child of Learning Pathway
|
|
1067
|
-
for (const key of Object.keys(this.hashmap)) {
|
|
1068
|
-
const item = this.hashmap[key];
|
|
1069
|
-
// Check if this is a direct child of the Learning Pathway
|
|
1070
|
-
if (item.parent !== learningPathwayId)
|
|
1071
|
-
continue;
|
|
1072
|
-
// Skip milestones
|
|
1073
|
-
if (item.isMilestone)
|
|
1074
|
-
continue;
|
|
1075
|
-
// This is a non-milestone direct child - it's the pre-assessment
|
|
1076
|
-
// Must check for actual completion - not just any value
|
|
1077
|
-
const isCompleted = (item.completionStatus === 2 || item.status === 2 ||
|
|
1078
|
-
(item.completionPercentage !== undefined && item.completionPercentage >= 100) ||
|
|
1079
|
-
(item.progress !== undefined && item.progress >= 100));
|
|
1080
|
-
console.log(`✅ Pre-assessment found (first non-milestone child): ${key}`, {
|
|
1081
|
-
name: item.name,
|
|
1082
|
-
completionStatus: item.completionStatus,
|
|
1083
|
-
status: item.status,
|
|
1084
|
-
completionPercentage: item.completionPercentage,
|
|
1085
|
-
progress: item.progress,
|
|
1086
|
-
isCompleted,
|
|
1087
|
-
// Show ALL fields to debug what's available
|
|
1088
|
-
allData: JSON.stringify(item, null, 2)
|
|
1089
|
-
});
|
|
1090
|
-
// Pre-assessment exists - return its completion status (true/false)
|
|
1091
|
-
return isCompleted;
|
|
1092
|
-
}
|
|
1093
|
-
// CRITICAL: If we reach here, no pre-assessment was found in the hashmap
|
|
1094
|
-
// This could mean either:
|
|
1095
|
-
// 1. There IS no pre-assessment (unlock M1 by default)
|
|
1096
|
-
// 2. The hashmap hasn't been populated yet (should lock M1 until data is ready)
|
|
1097
|
-
// To be safe, check if ANY children exist at all
|
|
1098
|
-
const hasAnyChildren = Object.keys(this.hashmap).some(key => this.hashmap[key].parent === learningPathwayId);
|
|
1099
|
-
if (!hasAnyChildren) {
|
|
1100
|
-
// Hashmap not populated yet - lock M1 until data is ready
|
|
1101
|
-
console.log('⚠️ No children found in hashmap yet - locking M1 until data is ready');
|
|
1102
|
-
return false;
|
|
1103
|
-
}
|
|
1104
|
-
// Hashmap is populated but no pre-assessment found - allow M1 to unlock
|
|
1105
|
-
console.log('No pre-assessment found in fully populated hashmap - allowing M1 to be unlocked by default');
|
|
1106
|
-
return true;
|
|
1107
|
-
}
|
|
1108
|
-
/**
|
|
1109
|
-
* Check if a milestone's assessment is completed
|
|
1110
|
-
* Searches for any assessment type (Course Assessment, Final Assessment, etc.) that belongs to this milestone
|
|
1111
|
-
*/
|
|
1112
|
-
checkMilestoneAssessmentComplete(milestoneId) {
|
|
1113
|
-
const milestone = this.hashmap[milestoneId];
|
|
1114
|
-
// Check all items in hashmap that are assessments and belong to this milestone
|
|
1115
|
-
for (const key of Object.keys(this.hashmap)) {
|
|
1116
|
-
const item = this.hashmap[key];
|
|
1117
|
-
// Check if this is an assessment type
|
|
1118
|
-
const isAssessmentType = item.primaryCategory === 'Course Assessment' ||
|
|
1119
|
-
item.primaryCategory === 'Final Assessment' ||
|
|
1120
|
-
item.primaryCategory === 'Practice Question Set' ||
|
|
1121
|
-
item.courseCategory === 'Course Assessment' ||
|
|
1122
|
-
item.courseCategory === 'Final Assessment' ||
|
|
1123
|
-
(item.name && item.name.toLowerCase().includes('assessment'));
|
|
1124
|
-
if (!isAssessmentType)
|
|
1125
|
-
continue;
|
|
1126
|
-
// Check if this assessment belongs to this milestone
|
|
1127
|
-
if (this.isChildOfMilestone(key, milestoneId)) {
|
|
1128
|
-
const isCompleted = item.completionStatus === 2 || item.status === 2 || item.completionPercentage >= 100 || item.progress >= 100;
|
|
1129
|
-
if (isCompleted) {
|
|
1130
|
-
return true;
|
|
1131
|
-
}
|
|
1132
|
-
}
|
|
1133
|
-
}
|
|
1134
|
-
// If no assessment found, consider it as completed (no assessment requirement)
|
|
1135
|
-
return true;
|
|
1136
|
-
}
|
|
1137
|
-
/**
|
|
1138
|
-
* Check if a milestone's mandatory content is completed
|
|
1139
|
-
* Only checks courses/content that are marked as isMandatory
|
|
1140
|
-
*/
|
|
1141
|
-
checkMilestoneMandatoryContentComplete(milestoneId) {
|
|
1142
|
-
const milestone = this.hashmap[milestoneId];
|
|
1143
|
-
let mandatoryCount = 0;
|
|
1144
|
-
let completedMandatoryCount = 0;
|
|
1145
|
-
// Check all items in hashmap that are direct children of this milestone (courses)
|
|
1146
|
-
for (const key of Object.keys(this.hashmap)) {
|
|
1147
|
-
const item = this.hashmap[key];
|
|
1148
|
-
// Check if this item is a direct child of the milestone (course level)
|
|
1149
|
-
if (item.parent !== milestoneId)
|
|
1150
|
-
continue;
|
|
1151
|
-
// Skip if not a course or collection
|
|
1152
|
-
if (item.primaryCategory !== 'Course' && !item.isCollection)
|
|
1153
|
-
continue;
|
|
1154
|
-
// Skip assessments - they're checked separately
|
|
1155
|
-
const isAssessment = item.primaryCategory === 'Course Assessment' ||
|
|
1156
|
-
item.primaryCategory === 'Final Assessment' ||
|
|
1157
|
-
item.courseCategory === 'Course Assessment' ||
|
|
1158
|
-
(item.name && item.name.toLowerCase().includes('assessment'));
|
|
1159
|
-
if (isAssessment)
|
|
1160
|
-
continue;
|
|
1161
|
-
// Check if this content is mandatory
|
|
1162
|
-
if (item.isMandatory) {
|
|
1163
|
-
mandatoryCount++;
|
|
1164
|
-
const isCompleted = item.completionStatus === 2 || item.status === 2 || item.completionPercentage >= 100 || item.progress >= 100;
|
|
1165
|
-
if (isCompleted) {
|
|
1166
|
-
completedMandatoryCount++;
|
|
1167
|
-
}
|
|
1168
|
-
}
|
|
1169
|
-
}
|
|
1170
|
-
const allComplete = mandatoryCount === 0 || completedMandatoryCount >= mandatoryCount;
|
|
1171
|
-
return allComplete;
|
|
1172
|
-
}
|
|
1173
|
-
/**
|
|
1174
|
-
* Check if a content item is a child (direct or nested) of a milestone
|
|
1175
|
-
*/
|
|
1176
|
-
isChildOfMilestone(contentId, milestoneId) {
|
|
1177
|
-
let currentId = contentId;
|
|
1178
|
-
let depth = 0;
|
|
1179
|
-
const maxDepth = 10;
|
|
1180
|
-
while (currentId && depth < maxDepth) {
|
|
1181
|
-
const item = this.hashmap[currentId];
|
|
1182
|
-
if (!item)
|
|
1183
|
-
return false;
|
|
1184
|
-
if (item.parent === milestoneId)
|
|
1185
|
-
return true;
|
|
1186
|
-
currentId = item.parent;
|
|
1187
|
-
depth++;
|
|
1188
|
-
}
|
|
1189
|
-
return false;
|
|
1190
|
-
}
|
|
1191
|
-
getCalculationsFromChildren(item) {
|
|
1192
|
-
item['duration'] = item.children.reduce((sum, child) => {
|
|
1193
|
-
return sum + Number(child.duration || 0);
|
|
1194
|
-
}, 0);
|
|
1195
|
-
const completedItems = _.filter(item.children, r => r.completionStatus === 2 || r.completionPercentage === 100);
|
|
1196
|
-
const totalCount = _.toInteger(_.get(item, 'leafNodesCount')) || 1;
|
|
1197
|
-
item['completionPercentage'] = Number(((completedItems.length / totalCount) * 100).toFixed());
|
|
1198
|
-
item['completionStatus'] = (item.completionPercentage >= 100) ? 2 : 1;
|
|
1199
|
-
return item;
|
|
1200
|
-
}
|
|
1201
|
-
fetchContentHistoryV2(req) {
|
|
1202
|
-
req.request.fields = ['progressdetails'];
|
|
1203
|
-
if (req.request.courseId) {
|
|
1204
|
-
const reslut = this.http.post(`${API_END_POINTS.CONTENT_HISTORYV2}/${req.request.courseId}`, req);
|
|
1205
|
-
// data.subscribe((subscribeData: any) => {
|
|
1206
|
-
// this.programChildCourseResumeData.next({ resumeData: subscribeData.result.contentList, courseId: req.request.courseId })
|
|
1207
|
-
// })
|
|
1208
|
-
return reslut;
|
|
1209
|
-
}
|
|
1210
|
-
return of();
|
|
1211
|
-
}
|
|
1212
|
-
dowonloadCertificate(certId) {
|
|
1213
|
-
return this.http.get(API_END_POINTS.CERT_DOWNLOAD(certId));
|
|
1214
|
-
}
|
|
1215
|
-
getServerDate() {
|
|
1216
|
-
return this.http.get(API_END_POINTS.SERVER_DATE);
|
|
1217
|
-
}
|
|
1218
|
-
getFormById(formId) {
|
|
1219
|
-
return this.http.get(API_END_POINTS.GET_FORM_BYID(formId));
|
|
1220
|
-
}
|
|
1221
|
-
submitForm(formData) {
|
|
1222
|
-
return this.http.post(API_END_POINTS.SUBMIT_FORM, formData);
|
|
1223
|
-
}
|
|
1224
|
-
getFormByIdPublic(formId) {
|
|
1225
|
-
return this.http.get(API_END_POINTS.GET_FORM_BYID_PUBLIC(formId));
|
|
1226
|
-
}
|
|
1227
|
-
submitFormPublic(formData) {
|
|
1228
|
-
return this.http.post(API_END_POINTS.SUBMIT_FORM_PUBLIC, formData);
|
|
1229
|
-
}
|
|
1230
|
-
getApllicationsById(formId, contextId) {
|
|
1231
|
-
return this.http.get(API_END_POINTS.GET_APPLICATIONS_BY_ID(formId, contextId));
|
|
1232
|
-
}
|
|
1233
|
-
shareContent(reqBody) {
|
|
1234
|
-
return this.http.post(`${API_END_POINTS.SHARE_CONTENT}`, reqBody);
|
|
1235
|
-
}
|
|
1236
|
-
checkModuleWiseData(content) {
|
|
1237
|
-
if (content && content.children) {
|
|
1238
|
-
content.children.forEach((ele) => {
|
|
1239
|
-
if (ele.primaryCategory === NsContent.EPrimaryCategory.MODULE) {
|
|
1240
|
-
let moduleResourseCount = 0;
|
|
1241
|
-
let offlineResourseCount = 0;
|
|
1242
|
-
ele.children.forEach((childEle) => {
|
|
1243
|
-
if (childEle.primaryCategory !== NsContent.EPrimaryCategory.OFFLINE_SESSION) {
|
|
1244
|
-
moduleResourseCount = moduleResourseCount + 1;
|
|
1245
|
-
}
|
|
1246
|
-
else {
|
|
1247
|
-
offlineResourseCount = offlineResourseCount + 1;
|
|
1248
|
-
}
|
|
1249
|
-
});
|
|
1250
|
-
ele['moduleResourseCount'] = moduleResourseCount;
|
|
1251
|
-
ele['offlineResourseCount'] = offlineResourseCount;
|
|
1252
|
-
}
|
|
1253
|
-
else {
|
|
1254
|
-
if (ele.primaryCategory === NsContent.EPrimaryCategory.COURSE) {
|
|
1255
|
-
this.checkModuleWiseData(ele);
|
|
1256
|
-
}
|
|
1257
|
-
}
|
|
1258
|
-
});
|
|
1259
|
-
}
|
|
1260
|
-
}
|
|
1261
|
-
async fetchCourseHeirarchy(contentData) {
|
|
1262
|
-
if (contentData && contentData.children) {
|
|
1263
|
-
for (const ele of contentData.children) {
|
|
1264
|
-
if (ele.primaryCategory === NsContent.ECourseCategory.COURSE) {
|
|
1265
|
-
await this.widgetSvc.fetchContent(ele.identifier).toPromise().then(async (subEle) => {
|
|
1266
|
-
if (subEle.result && subEle.result.content
|
|
1267
|
-
&& subEle.result.content.children && subEle.result.content.children.length) {
|
|
1268
|
-
ele['children'] = subEle.result.content.children;
|
|
1269
|
-
}
|
|
1270
|
-
});
|
|
1271
|
-
}
|
|
1272
|
-
}
|
|
1273
|
-
}
|
|
1274
|
-
}
|
|
1275
|
-
setTranscriptionData(data) {
|
|
1276
|
-
// console.log('data--', data)
|
|
1277
|
-
this.transriptionDataSubject.next(data);
|
|
1278
|
-
}
|
|
1279
|
-
setActiveSubtitleLanguage(activeLang) {
|
|
1280
|
-
this.transriptionActiveLanguageDataObject.next(activeLang);
|
|
1281
|
-
}
|
|
1282
|
-
aiGetResourceVttFile(resourceID) {
|
|
1283
|
-
return this.http.get(`${API_END_POINTS.AI_RESOURCE_VTT_FILE}?resource_id=${resourceID}`);
|
|
1284
|
-
}
|
|
1285
|
-
readPreEnrollmentResourcesState(req) {
|
|
1286
|
-
return this.http
|
|
1287
|
-
.post(`${API_END_POINTS.PRE_ENROLLMENT_STATE_READ}`, req);
|
|
1288
|
-
}
|
|
1289
|
-
createContentV2(requestBody) {
|
|
1290
|
-
return this.http
|
|
1291
|
-
.post(`${API_END_POINTS.CREATE_RESOURCE}`, requestBody)
|
|
1292
|
-
.pipe(map((data) => {
|
|
1293
|
-
return data.result.identifier;
|
|
1294
|
-
}));
|
|
1295
|
-
}
|
|
1296
|
-
uploadAssignmentAnswer(contentId, batchId, assignmentId, file) {
|
|
1297
|
-
const formData = new FormData();
|
|
1298
|
-
formData.append('file', file, file.name);
|
|
1299
|
-
return this.http.post(`${API_END_POINTS.UPLOAD_ASSIGNMENT}/${contentId}/${batchId}/${assignmentId}`, formData);
|
|
1300
|
-
}
|
|
1301
|
-
readContentV2(id) {
|
|
1302
|
-
return this.http.get(`${API_END_POINTS.READ_RESOURCE}read/${id}?mode=edit`).pipe(map((data) => {
|
|
1303
|
-
return data.result.content;
|
|
1304
|
-
}));
|
|
1305
|
-
}
|
|
1306
|
-
upload(data, contentData, options) {
|
|
1307
|
-
const file = data.get('content');
|
|
1308
|
-
let fileName = file.name;
|
|
1309
|
-
if (['channel.json'].indexOf(fileName) < 0) {
|
|
1310
|
-
fileName = this.appendToFilename(fileName);
|
|
1311
|
-
}
|
|
1312
|
-
const newFormData = new FormData();
|
|
1313
|
-
newFormData.append('data', file, fileName);
|
|
1314
|
-
return this.http.post(`${API_END_POINTS.UPLOAD_FILE}upload/${contentData.contentId}`, newFormData, options);
|
|
1315
|
-
}
|
|
1316
|
-
appendToFilename(filename) {
|
|
1317
|
-
const timeStamp = new Date().getTime();
|
|
1318
|
-
const dotIndex = filename.lastIndexOf('.');
|
|
1319
|
-
if (dotIndex === -1) {
|
|
1320
|
-
return filename + timeStamp;
|
|
1321
|
-
}
|
|
1322
|
-
return filename.substring(0, dotIndex) + timeStamp + filename.substring(dotIndex);
|
|
1323
|
-
}
|
|
1324
|
-
updateContentWithFewFields(requestBody, identifier) {
|
|
1325
|
-
return this.http.patch(`${API_END_POINTS.UPDATE_RESOURCE}/${identifier}`, requestBody);
|
|
1326
|
-
}
|
|
1327
|
-
searchAssignments(request) {
|
|
1328
|
-
return this.http.post(API_END_POINTS.SEARCH, request);
|
|
1329
|
-
}
|
|
1330
|
-
submitDraftAssignment(request) {
|
|
1331
|
-
return this.http.put(API_END_POINTS.SUBMIT_DRAFT_ASSIGNMENT, request);
|
|
1332
|
-
}
|
|
1333
|
-
submitAssignment(request) {
|
|
1334
|
-
return this.http.post(API_END_POINTS.SUBMIT_ASSIGNMENT, request);
|
|
1335
|
-
}
|
|
1336
|
-
notifyAssignmentSubmission(payload) {
|
|
1337
|
-
return this.http.post(API_END_POINTS.NOTIFY_ASSIGNMENT_SUBMISSION, payload);
|
|
1338
|
-
}
|
|
1339
|
-
getAssignmentStatus(request) {
|
|
1340
|
-
return this.http.post(`${API_END_POINTS.ASSIGNMENT_STATUS}`, request);
|
|
1341
|
-
}
|
|
1342
|
-
readAssignmentFile(contentId, batchId, assignmentId, fileName) {
|
|
1343
|
-
// Properly encode the parameters to avoid malformed request errors
|
|
1344
|
-
const encodedParams = new URLSearchParams({
|
|
1345
|
-
contentId: contentId || '',
|
|
1346
|
-
batchId: batchId || '',
|
|
1347
|
-
formId: assignmentId || '',
|
|
1348
|
-
fileName: fileName || ''
|
|
1349
|
-
});
|
|
1350
|
-
return this.http.get(`${API_END_POINTS.READ_ASSIGNMENT}?${encodedParams.toString()}`, {
|
|
1351
|
-
responseType: 'blob',
|
|
1352
|
-
headers: {
|
|
1353
|
-
'Accept': 'application/octet-stream, application/pdf, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document'
|
|
1354
|
-
}
|
|
1355
|
-
}).pipe(catchError((error) => {
|
|
1356
|
-
return throwError(() => error);
|
|
1357
|
-
}));
|
|
1358
|
-
}
|
|
1359
|
-
/**
|
|
1360
|
-
* Generate milestone achievement
|
|
1361
|
-
* @param userId User ID
|
|
1362
|
-
* @param courseId Course identifier
|
|
1363
|
-
* @param batchId Batch ID
|
|
1364
|
-
* @param milestoneId Milestone identifier (e.g., 'm1', 'm2')
|
|
1365
|
-
*/
|
|
1366
|
-
generateMilestoneAchievement(userId, courseId, batchId, milestoneId) {
|
|
1367
|
-
const apiUrl = '/apis/proxies/v8/achievement/dynamic/v1/generate';
|
|
1368
|
-
const request = {
|
|
1369
|
-
request: {
|
|
1370
|
-
userId,
|
|
1371
|
-
courseId,
|
|
1372
|
-
batchId,
|
|
1373
|
-
milestoneId
|
|
1374
|
-
}
|
|
1375
|
-
};
|
|
1376
|
-
return this.http.post(apiUrl, request);
|
|
1377
|
-
}
|
|
1378
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocService, deps: [{ token: i1.HttpClient }, { token: i2.ContentLanguageService }, { token: i3.ConfigurationsService }, { token: i4.WidgetContentService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
1379
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocService, providedIn: 'root' }); }
|
|
1380
|
-
}
|
|
1381
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocService, decorators: [{
|
|
1382
|
-
type: Injectable,
|
|
1383
|
-
args: [{
|
|
1384
|
-
providedIn: 'root'
|
|
1385
|
-
}]
|
|
1386
|
-
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.ContentLanguageService }, { type: i3.ConfigurationsService }, { type: i4.WidgetContentService }]; } });
|
|
1387
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRTFDLE9BQU8sRUFBRSxPQUFPLEVBQWMsS0FBSyxFQUFnQixlQUFlLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUVoRyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUNBQW1DLENBQUE7QUFDN0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUE7QUFFM0UsT0FBTyxFQUFFLFFBQVEsRUFBYSxNQUFNLHlCQUF5QixDQUFBO0FBRTdELDJCQUEyQjtBQUMzQixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7QUFFdEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTs7Ozs7O0FBRWhELHVDQUF1QztBQUN2QyxNQUFNLGlCQUFpQixHQUFHLG9CQUFvQixDQUFBO0FBQzlDLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUFBO0FBRXhDLE1BQU0sY0FBYyxHQUFHO0lBQ3JCLFlBQVksRUFBRSxHQUFHLGFBQWEsaUNBQWlDO0lBQy9ELGVBQWUsRUFBRSxHQUFHLGlCQUFpQixrQkFBa0I7SUFDdkQsWUFBWSxFQUFFLEdBQUcsaUJBQWlCLGVBQWU7SUFDakQsaUJBQWlCLEVBQUUsdUNBQXVDO0lBQzFELGNBQWMsRUFBRSxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUFDLEdBQUcsaUJBQWlCLFlBQVksU0FBUyxTQUFTO0lBQ3pGLG1CQUFtQixFQUFFLENBQUMsU0FBaUIsRUFBRSxPQUFlLEVBQUUsR0FBVyxFQUFFLEVBQUUsQ0FDdkUsaURBQWlELFNBQVMs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S0FBSyxDQUFDLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCw0QkFBNEIsQ0FBQyxNQUFjLEVBQUUsUUFBZ0IsRUFBRSxPQUFlLEVBQUUsV0FBbUI7UUFDakcsTUFBTSxNQUFNLEdBQUcsa0RBQWtELENBQUE7UUFDakUsTUFBTSxPQUFPLEdBQUc7WUFDZCxPQUFPLEVBQUU7Z0JBQ1AsTUFBTTtnQkFDTixRQUFRO2dCQUNSLE9BQU87Z0JBQ1AsV0FBVzthQUNaO1NBQ0YsQ0FBQTtRQUNELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ3hDLENBQUM7K0dBNytDVSxhQUFhO21IQUFiLGFBQWEsY0FGWixNQUFNOzs0RkFFUCxhQUFhO2tCQUh6QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgRGF0YSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcidcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUsIEVNUFRZLCBTdWJzY3JpcHRpb24sIEJlaGF2aW9yU3ViamVjdCwgb2YsIHRocm93RXJyb3IgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xuaW1wb3J0IHsgTnNDb250ZW50IH0gZnJvbSAnLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50Lm1vZGVsJ1xuaW1wb3J0IHsgTnNDb250ZW50Q29uc3RhbnRzIH0gZnJvbSAnLi4vX2NvbnN0YW50cy93aWRnZXQtY29udGVudC5jb25zdGFudHMnXG5pbXBvcnQgeyBXaWRnZXRDb250ZW50U2VydmljZSB9IGZyb20gJy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5zZXJ2aWNlJ1xuaW1wb3J0IHsgTnNBcHBUb2MsIE5zQ29ob3J0cyB9IGZyb20gJy4uL21vZGVscy9hcHAtdG9jLm1vZGVsJ1xuaW1wb3J0IHsgVEZldGNoU3RhdHVzLCBDb25maWd1cmF0aW9uc1NlcnZpY2UgfSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12Midcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJ1xuaW1wb3J0IHsgQ29udGVudExhbmd1YWdlU2VydmljZSB9IGZyb20gJ0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uJ1xuaW1wb3J0IHsgbWFwLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5cbi8vIFRPRE86IG1vdmUgdGhpcyBpbiBzb21lIGNvbW1vbiBwbGFjZVxuY29uc3QgUFJPVEVDVEVEX1NMQUdfVjggPSAnL2FwaXMvcHJvdGVjdGVkL3Y4J1xuY29uc3QgUFJPWFlfU0xBR19WOCA9ICcvYXBpcy9wcm94aWVzL3Y4J1xuXG5jb25zdCBBUElfRU5EX1BPSU5UUyA9IHtcbiAgQkFUQ0hfQ1JFQVRFOiBgJHtQUk9YWV9TTEFHX1Y4fS9sZWFybmVyL2NvdXJzZS92MS9iYXRjaC9jcmVhdGVgLFxuICBDT05URU5UX1BBUkVOVFM6IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb250ZW50L3BhcmVudHNgLFxuICBDT05URU5UX05FWFQ6IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb250ZW50L25leHRgLFxuICBDT05URU5UX0hJU1RPUllWMjogYC9hcGlzL3Byb3hpZXMvdjgvcmVhZC9jb250ZW50LXByb2dyZXNgLFxuICBDT05URU5UX1BBUkVOVDogKGNvbnRlbnRJZDogc3RyaW5nKSA9PiBgJHtQUk9URUNURURfU0xBR19WOH0vY29udGVudC8ke2NvbnRlbnRJZH0vcGFyZW50YCxcbiAgQ09OVEVOVF9BVVRIX1BBUkVOVDogKGNvbnRlbnRJZDogc3RyaW5nLCByb290T3JnOiBzdHJpbmcsIG9yZzogc3RyaW5nKSA9PlxuICAgIGAvYXBpcy9hdXRoQXBpL2FjdGlvbi9jb250ZW50L3BhcmVudC9oaWVyYXJjaHkvJHtjb250ZW50SWR9P3Jvb3RPcmc9JHtyb290T3JnfSZvcmc9JHtvcmd9YCxcbiAgQ09IT1JUUzogKGNvaG9ydFR5cGU6IE5zQ29ob3J0cy5FQ29ob3J0VHlwZXMsIGNvbnRlbnRJZDogc3RyaW5nKSA9PlxuICAgIGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb2hvcnRzLyR7Y29ob3J0VHlwZX0vJHtjb250ZW50SWR9YCxcbiAgRVhURVJOQUxfQ09OVEVOVDogKGNvbnRlbnRJZDogc3RyaW5nKSA9PlxuICAgIGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb250ZW50L2V4dGVybmFsLWFjY2Vzcy8ke2NvbnRlbnRJZH1gLFxuICBDT0hPUlRTX0dST1VQX1VTRVI6IChncm91cElkOiBudW1iZXIpID0+IGAke1BST1RFQ1RFRF9TTEFHX1Y4fS9jb2hvcnRzLyR7Z3JvdXBJZH1gLFxuICBSRUxBVEVEX1JFU09VUkNFOiAoY29udGVudElkOiBzdHJpbmcsIGNvbnRlbnRUeXBlOiBzdHJpbmcpID0+XG4gICAgYCR7UFJPVEVDVEVEX1NMQUdfVjh9L2todWIvZmV0Y2hSZWxhdGVkUmVzb3VyY2VzLyR7Y29udGVudElkfS8ke2NvbnRlbnRUeXBlfWAsXG4gIFBPU1RfQVNTRVNTTUVOVDogKGNvbnRlbnRJZDogc3RyaW5nKSA9PlxuICAgIGAke1BST1RFQ1RFRF9TTEFHX1Y4fS91c2VyL2V2YWx1YXRlL3Bvc3QtYXNzZXNzbWVudC8ke2NvbnRlbnRJZH1gLFxuICBHRVRfQ09OVEVOVDogKGNvbnRlbnRJZDogc3RyaW5nKSA9PlxuICAgIGAke1BST1hZX1NMQUdfVjh9L2FjdGlvbi9jb250ZW50L3YzL3JlYWQvJHtjb250ZW50SWR9YCxcbiAgQ0VSVF9ET1dOTE9BRDogKGNlcnRJZDogYW55KSA9PiBgJHtQUk9URUNURURfU0xBR19WOH0vY29ob3J0cy9jb3Vyc2UvYmF0Y2gvY2VydC9kb3dubG9hZC8ke2NlcnRJZH1gLFxuICBTRVJWRVJfREFURTogJ2FwaXMvcHVibGljL3Y4L3N5c3RlbURhdGUnLFxuICBTSEFSRV9DT05URU5UOiAnL2FwaXMvcHJveGllcy92OC91c2VyL3YxL2NvbnRlbnQvcmVjb21tZW5kJyxcbiAgR0VUX0ZPUk1fQllJRDogKGZvcm1JZDogc3RyaW5nKSA9PiBgYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YyL2dldEZvcm1CeUlkP2Zvcm1JZD0ke2Zvcm1JZH1gLFxuICAvLyBTVUJNSVRfRk9STTogYC9hcGlzL3Byb3hpZXMvdjgvZm9ybXMvdjEvc2F2ZUZvcm1TdWJtaXRgLFxuICBTVUJNSVRfRk9STTogYGFwaXMvcHJveGllcy92OC9mb3Jtcy92Mi9zYXZlRm9ybVN1Ym1pdGAsXG4gIEdFVF9GT1JNX0JZSURfUFVCTElDOiAoZm9ybUlkOiBzdHJpbmcpID0+IGBhcGlzL3B1YmxpYy92OC9wdWJsaWMvZm9ybXMvdjIvZ2V0Rm9ybUJ5SWQ/Zm9ybUlkPSR7Zm9ybUlkfWAsXG4gIFNVQk1JVF9GT1JNX1BVQkxJQzogYGFwaXMvcHVibGljL3Y4L3B1YmxpYy9mb3Jtcy92Mi9zYXZlRm9ybVN1Ym1pdGAsXG4gIC8vIGdldCBhbnN3ZXJzIGZvciBmb3JtXG4gIEdFVF9BUFBMSUNBVElPTlNfQllfSUQ6IChmb3JtSWQ6IHN0cmluZywgY29udGV4dElkOiBzdHJpbmcpID0+IGAvYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YyL2dldEFwcGxpY2F0aW9uc0J5SWQ/Zm9ybUlkPSR7Zm9ybUlkfSZjb250ZXh0SWQ9JHtjb250ZXh0SWR9YCxcbiAgQUlfUkVTT1VSQ0VfVlRUX0ZJTEU6IGAke1BST1hZX1NMQUdfVjh9L2NoYXRib3QvdjMvdHJhbnNjb2Rlci9zdGF0c2AsXG4gIC8vIEdFVF9GT1JNX0JZSUQ6IChmb3JtSWQ6IHN0cmluZykgPT4gYGFwaXMvcHJveGllcy92OC9mb3Jtcy9nZXRGb3JtQnlJZD9pZD0ke2Zvcm1JZH1gLFxuICBQUkVfRU5ST0xMTUVOVF9TVEFURV9SRUFEOiBgL2FwaXMvcHJveGllcy92OC9jb250ZW50L3YyL3N0YXRlL3JlYWRgLFxuICBDUkVBVEVfUkVTT1VSQ0U6IGBhcGlzL3Byb3hpZXMvdjgvYWN0aW9uL2NvbnRlbnQvdjMvY3JlYXRlYCxcbiAgUkVBRF9SRVNPVVJDRTogYGFwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9gLFxuICBVUExPQURfRklMRTogYGFwaXMvcHJveGllcy92OC91cGxvYWQvYWN0aW9uL2NvbnRlbnQvdjMvYCxcbiAgVVBEQVRFX1JFU09VUkNFOiBgYXBpcy9wcm94aWVzL3Y4L2FjdGlvbi9jb250ZW50L3YzL3VwZGF0ZWAsXG4gIFNFQVJDSDogYGFwaXMvcHJveGllcy92OC9hc3NpZ25tZW50L3YxL3NlYXJjaGAsXG4gIFNVQk1JVF9EUkFGVF9BU1NJR05NRU5UOiBgYXBpcy9wcm94aWVzL3Y4L2Fzc2lnbm1lbnQvdjEvc3VibWl0RHJhZnRgLFxuICBTVUJNSVRfQVNTSUdOTUVOVDogYGFwaXMvcHJveGllcy92OC9hc3NpZ25tZW50L3YxL3N1Ym1pdGAsXG4gIEFTU0lHTk1FTlRfU1RBVFVTOiBgYXBpcy9wcm94aWVzL3Y4L2Zvcm1zL3YyL3N1Ym1pc3Npb25zL3NlYXJjaGAsXG4gIFVQTE9BRF9BU1NJR05NRU5UOiBgYXBpcy9wcm94aWVzL3Y4L3N0b3JhZ2UvdjEvYnAvYXNzaWdubWVudC9hbnN3ZXJgLFxuICBSRUFEX0FTU0lHTk1FTlQ6IGBhcGlzL3Byb3hpZXMvdjgvc3RvcmFnZS92MS9icC9hc3NpZ25tZW50L2Fuc3dlci9yZWFkL2ZpbGVgLFxuICBOT1RJRllfQVNTSUdOTUVOVF9TVUJNSVNTSU9OOiBgYXBpcy9wcm94aWVzL3Y4L3YxL25vdGlmeUFzc2lnbm1lbnQvc3VibWl0YCxcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXBwVG9jU2VydmljZSB7XG4gIGFuYWx5dGljc1JlcGxheVN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KClcbiAgYW5hbHl0aWNzRmV0Y2hTdGF0dXM6IFRGZXRjaFN0YXR1cyA9ICdub25lJ1xuICBiYXRjaFJlcGxheVN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KClcbiAgc2V0QmF0Y2hEYXRhU3ViamVjdDogU3ViamVjdDxhbnk+ID0gbmV3IFN1YmplY3QoKVxuICBnZXRTZWxlY3RlZEJhdGNoOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpXG4gIHNldFdGRGF0YVN1YmplY3Q6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0KClcbiAgcmVzdW1lRGF0YTogU3ViamVjdDxOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhIHwgbnVsbD4gPSBuZXcgU3ViamVjdDxhbnk+KClcbiAgcHJpdmF0ZSBzaG93U3VidGl0bGVPbkJhbm5lcnMgPSBmYWxzZVxuICBwcml2YXRlIGNhblNob3dEZXNjcmlwdGlvbiA9IGZhbHNlXG4gIHJlc3VtZURhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHByaW1hcnlDYXRlZ29yeSA9IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5XG4gIHByaXZhdGUgdXBkYXRlUmV2aWV3cyA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpXG4gIHVwZGF0ZVJldmlld3NPYnNlcnZhYmxlID0gdGhpcy51cGRhdGVSZXZpZXdzLmFzT2JzZXJ2YWJsZSgpXG4gIHB1YmxpYyBzZXJ2ZXJEYXRlID0gbmV3IEJlaGF2aW9yU3ViamVjdCgnJylcbiAgY3VycmVudFNlcnZlckRhdGUgPSB0aGlzLnNlcnZlckRhdGUuYXNPYnNlcnZhYmxlKClcbiAgcHVibGljIGNvbnRlbnRMb2FkZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKVxuICBjb250ZW50TG9hZGVyJCA9IHRoaXMuY29udGVudExvYWRlci5hc09ic2VydmFibGUoKVxuICBwdWJsaWMgZ2V0UGFnZVNjcm9sbCA9IG5ldyBCZWhhdmlvclN1YmplY3QodHJ1ZSlcbiAgdXBkYXRlUGFnZVNjcm9sbCA9IHRoaXMuZ2V0UGFnZVNjcm9sbC5hc09ic2VydmFibGUoKVxuICBwdWJsaWMgaGFzaG1hcDogYW55ID0ge31cbiAgcHJpdmF0ZSBoYXNobWFwVXBkYXRlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKVxuICBoYXNobWFwVXBkYXRlZCQgPSB0aGlzLmhhc2htYXBVcGRhdGVkLmFzT2JzZXJ2YWJsZSgpXG4gIHByaXZhdGUgdHJhbnNyaXB0aW9uRGF0YVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7IC8vIFN0YXJ0IHdpdGggbnVsbFxuICB0cmFuc2NyaXB0aW9uRGF0YSQgPSB0aGlzLnRyYW5zcmlwdGlvbkRhdGFTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBwdWJsaWMgdHJhbnNyaXB0aW9uQWN0aXZlTGFuZ3VhZ2VEYXRhT2JqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xuICBwdWJsaWMgdHJhbnNyaXB0aW9uQWN0aXZlTGFuZ3VhZ2VEYXRhT2JqZWN0JCA9IHRoaXMudHJhbnNyaXB0aW9uQWN0aXZlTGFuZ3VhZ2VEYXRhT2JqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICBwdWJsaWMgdHJhbnNyaXB0aW9uSWRlbnRpZmllciA9IG5ldyBTdWJqZWN0KCk7IC8vIFN0YXJ0IHdpdGggbnVsbFxuICBjaGFuZ2VUcmFuc2NyaXB0aW9uTGFuZ3VhZ2VFdmVudCA9IG5ldyBTdWJqZWN0KClcbiAgcGxheVRyYW5zY3JpcHRpb25WaWRlbyA9IG5ldyBTdWJqZWN0KClcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIGNvbnRlbnRMYW5nU3ZjOiBDb250ZW50TGFuZ3VhZ2VTZXJ2aWNlLCBwcml2YXRlIGNvbmZpZ1N2YzogQ29uZmlndXJhdGlvbnNTZXJ2aWNlLCBwcml2YXRlIHdpZGdldFN2YzogV2lkZ2V0Q29udGVudFNlcnZpY2UpIHtcbiAgICAvLyB0aGlzIHJlc3VtZSBkYXRhIHN1YnNjcmlwdGlvbiBpcyBmb3Igb24gbG9hZFxuICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMucmVzdW1lRGF0YS5zdWJzY3JpYmUoXG4gICAgICAoX2RhdGFSZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgfSlcbiAgfVxuXG4gIGdldCBzdWJ0aXRsZU9uQmFubmVycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zaG93U3VidGl0bGVPbkJhbm5lcnNcbiAgfVxuICBzZXQgc3VidGl0bGVPbkJhbm5lcnModmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5zaG93U3VidGl0bGVPbkJhbm5lcnMgPSB2YWxcbiAgfVxuICBnZXQgc2hvd0Rlc2NyaXB0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNhblNob3dEZXNjcmlwdGlvblxuICB9XG4gIHNldCBzaG93RGVzY3JpcHRpb24odmFsOiBib29sZWFuKSB7XG4gICAgdGhpcy5jYW5TaG93RGVzY3JpcHRpb24gPSB2YWxcbiAgfVxuXG4gIHVwZGF0ZUJhdGNoRGF0YSgpIHtcbiAgICB0aGlzLmJhdGNoUmVwbGF5U3ViamVjdC5uZXh0KClcbiAgfVxuXG4gIHNldEJhdGNoRGF0YShkYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlKSB7XG4gICAgdGhpcy5zZXRCYXRjaERhdGFTdWJqZWN0Lm5leHQoZGF0YSlcbiAgfVxuXG4gIHNldFdGRGF0YShkYXRhOiBhbnkpIHtcbiAgICB0aGlzLnNldFdGRGF0YVN1YmplY3QubmV4dChkYXRhKVxuICB9XG5cbiAgdXBkYXRlUmVzdW1hRGF0YShkYXRhOiBhbnkpIHtcbiAgICB0aGlzLnJlc3VtZURhdGEubmV4dChkYXRhKVxuICB9XG5cbiAgY2hhbmdlVXBkYXRlUmV2aWV3cyhzdGF0ZTogYm9vbGVhbikge1xuICAgIHRoaXMudXBkYXRlUmV2aWV3cy5uZXh0KHN0YXRlKVxuICB9XG4gIGdldFNlbGVjdGVkQmF0Y2hEYXRhKGRhdGE6IGFueSkge1xuICAgIHRoaXMuZ2V0U2VsZWN0ZWRCYXRjaC5uZXh0KGRhdGEpXG4gIH1cblxuICBjaGFuZ2VTZXJ2ZXJEYXRlKHN0YXRlOiBhbnkpIHtcbiAgICB0aGlzLnNlcnZlckRhdGUubmV4dChzdGF0ZSlcbiAgfVxuXG4gIG1hcFNlc3Npb25Db21wbGV0aW9uUGVyY2VudGFnZShiYXRjaERhdGE6IGFueSwgcmVzdW1lRGF0YVBhc3M/OiBhbnkpIHtcbiAgICBpZiAocmVzdW1lRGF0YVBhc3MgJiYgcmVzdW1lRGF0YVBhc3MubGVuZ3RoKSB7XG4gICAgICBpZiAocmVzdW1lRGF0YVBhc3MgJiYgcmVzdW1lRGF0YVBhc3MubGVuZ3RoICYmIGJhdGNoRGF0YS5jb250ZW50ICYmIGJhdGNoRGF0YS5jb250ZW50Lmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNlc3Npb25Db21wbGV0aW9uUGVyY2VudGFnZShiYXRjaERhdGEsIHJlc3VtZURhdGFQYXNzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24gPSB0aGlzLnJlc3VtZURhdGEuc3Vic2NyaWJlKFxuICAgICAgICAoZGF0YVJlc3VsdDogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGFSZXN1bHQgJiYgZGF0YVJlc3VsdC5sZW5ndGggJiYgYmF0Y2hEYXRhLmNvbnRlbnQgJiYgYmF0Y2hEYXRhLmNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNlc3Npb25Db21wbGV0aW9uUGVyY2VudGFnZShiYXRjaERhdGEsIGRhdGFSZXN1bHQpXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gIH1cbiAgc2Vzc2lvbkNvbXBsZXRpb25QZXJjZW50YWdlKGJhdGNoRGF0YTogYW55LCByZXN1bWVEYXRhUGFzczogYW55KSB7XG4gICAgaWYgKHJlc3VtZURhdGFQYXNzICYmIHJlc3VtZURhdGFQYXNzLmxlbmd0aCkge1xuICAgICAgaWYgKGJhdGNoRGF0YSAmJiBiYXRjaERhdGEuY29udGVudFswXSAmJlxuICAgICAgICBiYXRjaERhdGEuY29udGVudFswXS5iYXRjaEF0dHJpYnV0ZXMgJiZcbiAgICAgICAgYmF0Y2hEYXRhLmNvbnRlbnRbMF0uYmF0Y2hBdHRyaWJ1dGVzLnNlc3Npb25EZXRhaWxzX3YyXG4gICAgICApIHtcbiAgICAgICAgYmF0Y2hEYXRhLmNvbnRlbnRbMF0uYmF0Y2hBdHRyaWJ1dGVzLnNlc3Npb25EZXRhaWxzX3YyLm1hcCgoc2Q6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZvdW5kQ29udGVudCA9IHJlc3VtZURhdGFQYXNzLmZpbmQoKGVsOiBhbnkpID0+IGVsLmNvbnRlbnRJZCA9PT0gc2Quc2Vzc2lvbklkKVxuICAgICAgICAgIGlmIChmb3VuZENvbnRlbnQpIHtcbiAgICAgICAgICAgIHNkLmNvbXBsZXRpb25QZXJjZW50YWdlID0gZm91bmRDb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlXG4gICAgICAgICAgICBzZC5jb21wbGV0aW9uU3RhdHVzID0gZm91bmRDb250ZW50LnN0YXR1c1xuICAgICAgICAgICAgc2QubGFzdENvbXBsZXRlZFRpbWUgPSBmb3VuZENvbnRlbnQubGFzdENvbXBsZXRlZFRpbWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNob3dTdGFydEJ1dHRvbihjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsKTogeyBzaG93OiBib29sZWFuOyBtc2c6IHN0cmluZyB9IHtcbiAgICBjb25zdCBzdGF0dXMgPSB7XG4gICAgICBzaG93OiBmYWxzZSxcbiAgICAgIG1zZzogJycsXG4gICAgfVxuICAgIGlmIChjb250ZW50KSB7XG4gICAgICBpZiAoXG4gICAgICAgIGNvbnRlbnQuYXJ0aWZhY3RVcmwgJiYgY29udGVudC5hcnRpZmFjdFVybC5tYXRjaCgveW91dHUoLik/YmUvZ2kpICYmXG4gICAgICAgIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlICYmXG4gICAgICAgIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLmNvdW50cnkgPT09ICdDaGluYSdcbiAgICAgICkge1xuICAgICAgICBzdGF0dXMuc2hvdyA9IGZhbHNlXG4gICAgICAgIHN0YXR1cy5tc2cgPSAneW91dHViZUZvcmJpZGRlbidcbiAgICAgICAgcmV0dXJuIHN0YXR1c1xuICAgICAgfVxuICAgICAgaWYgKGNvbnRlbnQucmVzb3VyY2VUeXBlICE9PSAnQ2VydGlmaWNhdGlvbicpIHtcbiAgICAgICAgc3RhdHVzLnNob3cgPSB0cnVlXG4gICAgICAgIHJldHVybiBzdGF0dXNcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN0YXR1c1xuICB9XG5cbiAgaW5pdERhdGEoZGF0YTogRGF0YSwgbmVlZFJlc3VtZURhdGE6IGJvb2xlYW4gPSBmYWxzZSk6IE5zQXBwVG9jLklXc1RvY1Jlc3BvbnNlIHtcbiAgICBsZXQgY29udGVudDogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCA9IG51bGxcbiAgICBsZXQgZXJyb3JDb2RlOiBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUgfCBudWxsID0gbnVsbFxuICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgaWYgKGRhdGEuY29udGVudCAmJiBkYXRhLmNvbnRlbnQuZGF0YSAmJiBkYXRhLmNvbnRlbnQuZGF0YS5pZGVudGlmaWVyKSB7XG4gICAgICBjb250ZW50ID0gZGF0YS5jb250ZW50LmRhdGFcbiAgICAgIGlmIChuZWVkUmVzdW1lRGF0YSkge1xuICAgICAgICB0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24gPSB0aGlzLnJlc3VtZURhdGEuc3Vic2NyaWJlKFxuICAgICAgICAgIChkYXRhUmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChkYXRhUmVzdWx0ICYmIGRhdGFSZXN1bHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICAgICAgICAgIHRoaXMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudCwgZGF0YVJlc3VsdClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxuICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIG9uIHJlc3VtZURhdGFTdWJzY3JpcHRpb24nKVxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgIGVycm9yQ29kZSA9IE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZS5BUElfRkFJTFVSRVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXJyb3JDb2RlID0gTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlLk5PX0RBVEFcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQsXG4gICAgICBlcnJvckNvZGUsXG4gICAgfVxuICB9XG5cbiAgbWFwQ29tcGxldGlvblBlcmNlbnRhZ2UoY29udGVudDogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCwgZGF0YVJlc3VsdDogYW55KSB7XG4gICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC5jaGlsZHJlbikge1xuICAgICAgY29udGVudC5jaGlsZHJlbi5tYXAoY2hpbGQgPT4ge1xuICAgICAgICBjb25zdCBmb3VuZENvbnRlbnQgPSBkYXRhUmVzdWx0LmZpbmQoKGVsOiBhbnkpID0+IGVsLmNvbnRlbnRJZCA9PT0gY2hpbGQuaWRlbnRpZmllcilcbiAgICAgICAgaWYgKGZvdW5kQ29udGVudCkge1xuICAgICAgICAgIGNoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlID0gZm91bmRDb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGZvdW5kQ29udGVudC5wcm9ncmVzc1xuICAgICAgICAgIGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgPSBmb3VuZENvbnRlbnQuc3RhdHVzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZShjaGlsZCwgZGF0YVJlc3VsdClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICB9XG4gIH1cblxuICBtYXBNb2R1bGVDb3VudChjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQpIHtcbiAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICBjb250ZW50LmNoaWxkcmVuLm1hcChjaGlsZCA9PiB7XG4gICAgICAgIGlmIChjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSkge1xuICAgICAgICAgIGNvbnRlbnRbJ21vZHVsZUNvdW50J10gPSBjb250ZW50Wydtb2R1bGVDb3VudCddID8gY29udGVudFsnbW9kdWxlQ291bnQnXSArIDEgOiAxXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFKSB7XG4gICAgICAgICAgdGhpcy5tYXBNb2R1bGVDb3VudChjaGlsZClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBnZXRNaW1lVHlwZShjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQsIGlkZW50aWZpZXI6IHN0cmluZyk6IE5zQ29udGVudC5FTWltZVR5cGVzIHtcbiAgICBpZiAoY29udGVudC5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7XG4gICAgICByZXR1cm4gY29udGVudC5taW1lVHlwZVxuICAgIH1cbiAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICBpZiAoY29udGVudC5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gaWYgKGNvbnRlbnQuY2hpbGRyZW5bMF0uaWRlbnRpZmllciA9PT0gaWRlbnRpZmllcikge1xuICAgICAgICAvLyAgIHJldHVybiBjb250ZW50Lm1pbWVUeXBlXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gYmlnIGJsdW5kZXIgaW4gZGF0YVxuICAgICAgICAvLyB0aGlzLmxvZ2dlci5sb2coY29udGVudC5pZGVudGlmaWVyLCAnV3JvbmcgbWltZXR5cGVzIGZvciByZXN1bWUnKVxuICAgICAgICByZXR1cm4gY29udGVudC5taW1lVHlwZVxuICAgICAgfVxuICAgICAgY29uc3QgZmxhdExpc3Q6IGFueVtdID0gW11cbiAgICAgIGNvbnN0IGdldEFsbEl0ZW1zUGVyQ2hpbGRyZW46IGFueSA9IChpdGVtOiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IHtcbiAgICAgICAgZmxhdExpc3QucHVzaChpdGVtKVxuICAgICAgICBpZiAoaXRlbS5jaGlsZHJlbikge1xuICAgICAgICAgIHJldHVybiBpdGVtLmNoaWxkcmVuLm1hcCgoaTogTnNDb250ZW50LklDb250ZW50KSA9PiBnZXRBbGxJdGVtc1BlckNoaWxkcmVuKGkpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZ2V0QWxsSXRlbXNQZXJDaGlsZHJlbihjb250ZW50KVxuICAgICAgY29uc3QgY2hsZCA9IF8uZmlyc3QoXy5maWx0ZXIoZmxhdExpc3QsIHsgaWRlbnRpZmllciB9KSlcbiAgICAgIHJldHVybiAoY2hsZCAmJiBjaGxkLm1pbWVUeXBlKSB8fCAnJ1xuICAgIH1cbiAgICAvLyByZXR1cm4gY2hsZC5taW1lVHlwZVxuICAgIHJldHVybiBOc0NvbnRlbnQuRU1pbWVUeXBlcy5VTktOT1dOXG4gIH1cblxuICBnZXRUb2NTdHJ1Y3R1cmUoXG4gICAgY29udGVudDogTnNDb250ZW50LklDb250ZW50LFxuICAgIHRvY1N0cnVjdHVyZTogTnNBcHBUb2MuSVRvY1N0cnVjdHVyZSxcbiAgKTogTnNBcHBUb2MuSVRvY1N0cnVjdHVyZSB7XG4gICAgaWYgKFxuICAgICAgY29udGVudCAmJlxuICAgICAgIShjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0VcbiAgICAgICAgLy8gfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LktOT1dMRURHRV9BUlRJRkFDVClcbiAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlBSQUNUSUNFX1JFU09VUkNFXG4gICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UXG4gICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5PRkZMSU5FX1NFU1NJT05cbiAgICAgICkpIHtcbiAgICAgIGlmIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFKSB7XG4gICAgICAgIHRvY1N0cnVjdHVyZS5jb3Vyc2UgKz0gMVxuICAgICAgfSBlbHNlIGlmIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFKSB7XG4gICAgICAgIHRvY1N0cnVjdHVyZS5sZWFybmluZ01vZHVsZSArPSAxXG4gICAgICB9XG4gICAgICBfLmVhY2goY29udGVudC5jaGlsZHJlbiwgY2hpbGQgPT4ge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXBhcmFtZXRlci1yZWFzc2lnbm1lbnRcbiAgICAgICAgdG9jU3RydWN0dXJlID0gdGhpcy5nZXRUb2NTdHJ1Y3R1cmUoY2hpbGQsIHRvY1N0cnVjdHVyZSlcbiAgICAgIH0pXG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGNvbnRlbnQgJiZcbiAgICAgIChcbiAgICAgICAgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFXG4gICAgICAgIC8vIHx8IGNvbnRlbnQuY29udGVudFR5cGUgPT09ICdLbm93bGVkZ2UgQXJ0aWZhY3QnXG4gICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRVxuICAgICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVFxuICAgICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuT0ZGTElORV9TRVNTSU9OKVxuICAgICkge1xuICAgICAgc3dpdGNoIChjb250ZW50Lm1pbWVUeXBlKSB7XG4gICAgICAgIC8vIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuSEFORFNfT046XG4gICAgICAgIC8vICAgdG9jU3RydWN0dXJlLmhhbmRzT24gKz0gMVxuICAgICAgICAvLyAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuTVAzOlxuICAgICAgICAgIHRvY1N0cnVjdHVyZS5wb2RjYXN0ICs9IDFcbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLk1QNDpcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5NM1U4OlxuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLllPVVRVQkU6XG4gICAgICAgICAgdG9jU3RydWN0dXJlLnZpZGVvICs9IDFcbiAgICAgICAgICBicmVha1xuICAgICAgICAvLyBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLklOVEVSQUNUSU9OOlxuICAgICAgICAvLyAgIHRvY1N0cnVjdHVyZS5pbnRlcmFjdGl2ZVZpZGVvICs9IDFcbiAgICAgICAgLy8gICBicmVha1xuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLlBERjpcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUucGRmICs9IDFcbiAgICAgICAgICBicmVha1xuICAgICAgICAvLyBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLkhUTUw6XG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuVEVYVF9XRUI6XG4gICAgICAgICAgdG9jU3RydWN0dXJlLndlYlBhZ2UgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuU1VSVkVZOlxuICAgICAgICAgIHRvY1N0cnVjdHVyZS5zdXJ2ZXkgKz0gMVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuUVVJWjpcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5BUFBMSUNBVElPTl9KU09OOlxuICAgICAgICAgIC8vIGlmIChjb250ZW50LnJlc291cmNlVHlwZSA9PT0gJ0Fzc2Vzc21lbnQnKSB7XG4gICAgICAgICAgdG9jU3RydWN0dXJlLmFzc2Vzc21lbnQgKz0gMVxuICAgICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgICAgLy8gICB0b2NTdHJ1Y3R1cmUucXVpeiArPSAxXG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgTnNDb250ZW50LkVNaW1lVHlwZXMuT0ZGTElORV9TRVNTSU9OOlxuICAgICAgICAgIC8vIGlmIChjb250ZW50LnJlc291cmNlVHlwZSA9PT0gJ0Fzc2Vzc21lbnQnKSB7XG4gICAgICAgICAgdG9jU3RydWN0dXJlLm9mZmxpbmVTZXNzaW9uICs9IDFcbiAgICAgICAgICAvLyB9IGVsc2Uge1xuICAgICAgICAgIC8vICAgdG9jU3RydWN0dXJlLnF1aXogKz0gMVxuICAgICAgICAgIC8vIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLlBSQUNUSUNFX1JFU09VUkNFOlxuICAgICAgICAgIGlmIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0UpIHtcbiAgICAgICAgICAgIHRvY1N0cnVjdHVyZS5wcmFjdGljZVRlc3QgKz0gMVxuICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlQpIHtcbiAgICAgICAgICAgIHRvY1N0cnVjdHVyZS5maW5hbFRlc3QgKz0gMVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICAvLyBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLldFQl9NT0RVTEU6XG4gICAgICAgIC8vICAgdG9jU3RydWN0dXJlLndlYk1vZHVsZSArPSAxXG4gICAgICAgIC8vICAgYnJlYWtcbiAgICAgICAgY2FzZSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5aSVAyOlxuICAgICAgICBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLlpJUDpcbiAgICAgICAgICB0b2NTdHJ1Y3R1cmUuaW50ZXJhY3RpdmVjb250ZW50ICs9IDFcbiAgICAgICAgICBicmVha1xuICAgICAgICAvLyBjYXNlIE5zQ29udGVudC5FTWltZVR5cGVzLllPVVRVQkU6XG4gICAgICAgIC8vICAgdG9jU3RydWN0dXJlLnlvdXR1YmUgKz0gMVxuICAgICAgICAvLyAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdG9jU3RydWN0dXJlLm90aGVyICs9IDFcbiAgICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRvY1N0cnVjdHVyZVxuICAgIH1cbiAgICByZXR1cm4gdG9jU3RydWN0dXJlXG4gIH1cblxuICBmaWx0ZXJUb2MoXG4gICAgY29udGVudDogTnNDb250ZW50LklDb250ZW50LFxuICAgIGZpbHRlckNhdGVnb3J5OiBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5ID0gTnNDb250ZW50LkVGaWx0ZXJDYXRlZ29yeS5BTEwsXG4gICk6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwge1xuICAgIGlmIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0VcbiAgICAgIC8vICB8fCBjb250ZW50LmNvbnRlbnRUeXBlID09PSAnS25vd2xlZGdlIEFydGlmYWN0J1xuICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlBSQUNUSUNFX1JFU09VUkNFXG4gICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVFxuICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk9GRkxJTkVfU0VTU0lPTikge1xuICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyVW5pdENvbnRlbnQoY29udGVudCwgZmlsdGVyQ2F0ZWdvcnkpID8gY29udGVudCA6IG51bGxcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyZWRDaGlsZHJlbjogTnNDb250ZW50LklDb250ZW50W10gPVxuICAgICAgXy5tYXAoXy5nZXQoY29udGVudCwgJ2NoaWxkcmVuJyksIGNoaWxkQ29udGVudCA9PlxuICAgICAgICB0aGlzLmZpbHRlclRvYyhjaGlsZENvbnRlbnQsIGZpbHRlckNhdGVnb3J5KSlcbiAgICAgICAgLmZpbHRlcih1bml0Q29udGVudCA9PiBCb29sZWFuKHVuaXRDb250ZW50KSkgYXMgTnNDb250ZW50LklDb250ZW50W11cbiAgICBpZiAoZmlsdGVyZWRDaGlsZHJlbiAmJiBmaWx0ZXJlZENoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY29udGVudCxcbiAgICAgICAgY2hpbGRyZW46IGZpbHRlcmVkQ2hpbGRyZW4sXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBmaWx0ZXJVbml0Q29udGVudChcbiAgICBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQsXG4gICAgZmlsdGVyQ2F0ZWdvcnk6IE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkgPSBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LkFMTCxcbiAgKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChmaWx0ZXJDYXRlZ29yeSkge1xuICAgICAgY2FzZSBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LkxFQVJOOlxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICFOc0NvbnRlbnRDb25zdGFudHMuVkFMSURfUFJBQ1RJQ0VfUkVTT1VSQ0VTLmhhcyhjb250ZW50LnJlc291cmNlVHlwZSkgJiZcbiAgICAgICAgICAhTnNDb250ZW50Q29uc3RhbnRzLlZBTElEX0FTU0VTU01FTlRfUkVTT1VSQ0VTLmhhcyhjb250ZW50LnJlc291cmNlVHlwZSlcbiAgICAgICAgKVxuICAgICAgY2FzZSBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LlBSQUNUSUNFOlxuICAgICAgICByZXR1cm4gTnNDb250ZW50Q29uc3RhbnRzLlZBTElEX1BSQUNUSUNFX1JFU09VUkNFUy5oYXMoY29udGVudC5yZXNvdXJjZVR5cGUpXG4gICAgICBjYXNlIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuQVNTRVNTOlxuICAgICAgICByZXR1cm4gTnNDb250ZW50Q29uc3RhbnRzLlZBTElEX0FTU0VTU01FTlRfUkVTT1VSQ0VTLmhhcyhjb250ZW50LnJlc291cmNlVHlwZSlcbiAgICAgIGNhc2UgTnNDb250ZW50LkVGaWx0ZXJDYXRlZ29yeS5BTEw6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuICBmZXRjaENvbnRlbnRBbmFseXRpY3NDbGllbnREYXRhKGNvbnRlbnRJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgIT09ICdmZXRjaGluZycgJiYgdGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyAhPT0gJ2RvbmUnKSB7XG4gICAgICB0aGlzLmdldENvbnRlbnRBbmFseXRpY3NDbGllbnQoY29udGVudElkKVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldENvbnRlbnRBbmFseXRpY3NDbGllbnQoY29udGVudElkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzID0gJ2ZldGNoaW5nJ1xuICAgIGNvbnN0IHVybCA9IGAke1BST1hZX1NMQUdfVjh9L0xBL2FwaS9sYS9jb250ZW50YW5hbHl0aWNzP2NvbnRlbnRfaWQ9JHtjb250ZW50SWR9JnR5cGU9Y291cnNlYFxuICAgIHRoaXMuaHR0cC5nZXQodXJsKS5zdWJzY3JpYmUoXG4gICAgICAocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyA9ICdkb25lJ1xuICAgICAgICB0aGlzLmFuYWx5dGljc1JlcGxheVN1YmplY3QubmV4dChyZXN1bHQpXG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICB0aGlzLmFuYWx5dGljc1JlcGxheVN1YmplY3QubmV4dChudWxsKVxuICAgICAgICB0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzID0gJ2RvbmUnXG4gICAgICB9LFxuICAgIClcbiAgfVxuXG4gIGZldGNoQ29udGVudEFuYWx5dGljc0RhdGEoY29udGVudElkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5hbmFseXRpY3NGZXRjaFN0YXR1cyAhPT0gJ2ZldGNoaW5nJyAmJiB0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzICE9PSAnZG9uZScpIHtcbiAgICAgIHRoaXMuZ2V0Q29udGVudEFuYWx5dGljcyhjb250ZW50SWQpXG4gICAgfVxuICB9XG4gIHByaXZhdGUgZ2V0Q29udGVudEFuYWx5dGljcyhjb250ZW50SWQ6IHN0cmluZykge1xuICAgIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnZmV0Y2hpbmcnXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICBjb25zdCB1cmwgPSBgJHtQUk9YWV9TTEFHX1Y4fS9MQS9MQS9hcGkvVXNlcnM/cmVmaW5lbWVudGZpbHRlcj0ke2VuY29kZVVSSUNvbXBvbmVudChcbiAgICAgICdcInNvdXJjZVwiOltcImlHb3RcIixcIkxlYXJuaW5nIEh1YlwiXScsXG4gICAgKX0kJHtlbmNvZGVVUklDb21wb25lbnQoYFwiY291cnNlQ29kZVwiOiBbXCIke2NvbnRlbnRJZH1cIl1gKX1gXG4gICAgdGhpcy5odHRwLmdldCh1cmwpLnN1YnNjcmliZShcbiAgICAgIChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFuYWx5dGljc0ZldGNoU3RhdHVzID0gJ2RvbmUnXG4gICAgICAgIHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdC5uZXh0KHJlc3VsdClcbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdC5uZXh0KG51bGwpXG4gICAgICAgIHRoaXMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgIH0sXG4gICAgKVxuICB9XG5cbiAgY2xlYXJBbmFseXRpY3NEYXRhKCkge1xuICAgIGlmICh0aGlzLmFuYWx5dGljc1JlcGxheVN1YmplY3QpIHtcbiAgICAgIHRoaXMuYW5hbHl0aWNzUmVwbGF5U3ViamVjdC51bnN1YnNjcmliZSgpXG4gICAgfVxuICB9XG5cbiAgZmV0Y2hDb250ZW50UGFyZW50cyhjb250ZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPiB7XG4gICAgLy8gcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPihcbiAgICAvLyAgIGAke0FQSV9FTkRfUE9JTlRTLkNPTlRFTlRfUEFSRU5UU30vJHtjb250ZW50SWR9YCxcbiAgICAvLyApXG4gICAgaWYgKGNvbnRlbnRJZCkgeyB9XG4gICAgcmV0dXJuIEVNUFRZXG4gIH1cbiAgZmV0Y2hDb250ZW50V2hhdHNOZXh0KFxuICAgIGNvbnRlbnRJZDogc3RyaW5nLFxuICAgIGNvbnRlbnRUeXBlPzogc3RyaW5nLFxuICApOiBPYnNlcnZhYmxlPE5zQ29udGVudC5JQ29udGVudE1pbmltYWxbXT4ge1xuICAgIGlmIChjb250ZW50VHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPihcbiAgICAgICAgYCR7QVBJX0VORF9QT0lOVFMuQ09OVEVOVF9ORVhUfS8ke2NvbnRlbnRJZH0/Y29udGVudFR5cGU9JHtjb250ZW50VHlwZX1gLFxuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10+KFxuICAgICAgYCR7QVBJX0VORF9QT0lOVFMuQ09OVEVOVF9ORVhUfS8ke2NvbnRlbnRJZH0/dHM9JHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gLFxuICAgIClcbiAgfVxuXG4gIGZldGNoTW9yZUxpa2VUaGlzUGFpZChjb250ZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb250ZW50LklDb250ZW50TWluaW1hbFtdPihcbiAgICAgIGAke0FQSV9FTkRfUE9JTlRTLkNPTlRFTlRfTkVYVFxuICAgICAgfS8ke2NvbnRlbnRJZH0/ZXhjbHVzaXZlQ29udGVudD10cnVlJnRzPSR7bmV3IERhdGUoKS5nZXRUaW1lKCl9YCxcbiAgICApXG4gIH1cblxuICBmZXRjaE1vcmVMaWtlVGhpc0ZyZWUoY29udGVudElkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPE5zQ29udGVudC5JQ29udGVudE1pbmltYWxbXT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudE1pbmltYWxbXT4oXG4gICAgICBgJHtBUElfRU5EX1BPSU5UUy5DT05URU5UX05FWFRcbiAgICAgIH0vJHtjb250ZW50SWR9P2V4Y2x1c2l2ZUNvbnRlbnQ9ZmFsc2UmdHM9JHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gLFxuICAgIClcbiAgfVxuXG4gIGZldGNoQ29udGVudENvaG9ydHMoXG4gICAgY29ob3J0VHlwZTogTnNDb2hvcnRzLkVDb2hvcnRUeXBlcyxcbiAgICBjb250ZW50SWQ6IHN0cmluZyxcbiAgKTogT2JzZXJ2YWJsZTxOc0NvaG9ydHMuSUNvaG9ydHNDb250ZW50W10+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxOc0NvaG9ydHMuSUNvaG9ydHNDb250ZW50W10+KEFQSV9FTkRfUE9JTlRTLkNPSE9SVFMoY29ob3J0VHlwZSwgY29udGVudElkKSwge1xuICAgICAgaGVhZGVyczogeyByb290T3JnOiB0aGlzLmNvbmZpZ1N2Yy5yb290T3JnIHx8ICcnLCBvcmc6IHRoaXMuY29uZmlnU3ZjLm9yZyA/IHRoaXMuY29uZmlnU3ZjLm9yZ1swXSA6ICcnIH0sXG4gICAgfSlcbiAgfVxuICBmZXRjaEV4dGVybmFsQ29udGVudEFjY2Vzcyhjb250ZW50SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8eyBoYXNBY2Nlc3M6IGJvb2xlYW4gfT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHsgaGFzQWNjZXNzOiBib29sZWFuIH0+KEFQSV9FTkRfUE9JTlRTLkVYVEVSTkFMX0NPTlRFTlQoY29udGVudElkKSlcbiAgfVxuICBmZXRjaENvaG9ydEdyb3VwVXNlcnMoZ3JvdXBJZDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8TnNDb2hvcnRzLklDb2hvcnRzR3JvdXBVc2Vyc1tdPihBUElfRU5EX1BPSU5UUy5DT0hPUlRTX0dST1VQX1VTRVIoZ3JvdXBJZCkpXG4gIH1cbiAgZmV0Y2hNb3JlTGlrZVRoaXMoY29udGVudElkOiBzdHJpbmcsIGNvbnRlbnRUeXBlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PE5zQ29udGVudC5JQ29udGVudFtdPihcbiAgICAgIEFQSV9FTkRfUE9JTlRTLlJFTEFURURfUkVTT1VSQ0UoY29udGVudElkLCBjb250ZW50VHlwZSksXG4gICAgKVxuICB9XG5cbiAgZmV0Y2hQb3N0QXNzZXNzbWVudFN0YXR1cyhjb250ZW50SWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHsgcmVzdWx0OiBOc0FwcFRvYy5JUG9zdEFzc2Vzc21lbnRbXSB9PihcbiAgICAgIEFQSV9FTkRfUE9JTlRTLlBPU1RfQVNTRVNTTUVOVChjb250ZW50SWQpLFxuICAgIClcbiAgfVxuXG4gIGZldGNoR2V0Q29udGVudERhdGEoY29udGVudElkOiBzdHJpbmcpIHtcbiAgICBsZXQgdXJsID0gJydcbiAgICBjb25zdCBmb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9wdWJsaWMvJykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJyZwcmV2aWV3PXRydWUnKVxuICAgIGlmICghZm9yUHJldmlldykge1xuICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8eyByZXN1bHQ6IGFueSB9PihcbiAgICAgICAgQVBJX0VORF9QT0lOVFMuR0VUX0NPTlRFTlQoY29udGVudElkKSxcbiAgICAgIClcbiAgICB9XG4gICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCdlZGl0TW9kZT10cnVlJykgJiYgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJ19yYycpKSB7XG4gICAgICB1cmwgPSBgL2FwaXMvcHJveGllcy92OC9hY3Rpb24vY29udGVudC92My9yZWFkLyR7Y29udGVudElkfWBcbiAgICB9IGVsc2Uge1xuICAgICAgdXJsID0gYC9hcGkvY29udGVudC92MS9yZWFkLyR7Y29udGVudElkfWBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8eyByZXN1bHQ6IGFueSB9Pih1cmwpXG5cbiAgfVxuXG4gIGZldGNoQ29udGVudFBhcmVudChjb250ZW50SWQ6IHN0cmluZywgZGF0YTogTnNBcHBUb2MuSUNvbnRlbnRQYXJlbnRSZXEsIGZvclByZXZpZXcgPSBmYWxzZSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxOc0FwcFRvYy5JQ29udGVudFBhcmVudFJlc3BvbnNlPihcbiAgICAgIGZvclByZXZpZXdcbiAgICAgICAgPyBBUElfRU5EX1BPSU5UUy5DT05URU5UX0FVVEhfUEFSRU5UKFxuICAgICAgICAgIGNvbnRlbnRJZCxcbiAgICAgICAgICB0aGlzLmNvbmZpZ1N2Yy5yb290T3JnIHx8ICcnLFxuICAgICAgICAgIHRoaXMuY29uZmlnU3ZjLm9yZyA/IHRoaXMuY29uZmlnU3ZjLm9yZ1swXSA6ICcnLFxuICAgICAgICApXG4gICAgICAgIDogQVBJX0VORF9QT0lOVFMuQ09OVEVOVF9QQVJFTlQoY29udGVudElkKSxcbiAgICAgIGRhdGEsXG4gICAgKVxuICB9XG5cbiAgY3JlYXRlQmF0Y2goYmF0Y2hEYXRhOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoXG4gICAgICBBUElfRU5EX1BPSU5UUy5CQVRDSF9DUkVBVEUsXG4gICAgICB7IHJlcXVlc3Q6IGJhdGNoRGF0YSB9LFxuICAgIClcbiAgfVxuXG4gIGFzeW5jIG1hcENvbXBsZXRpb25QZXJjZW50YWdlUHJvZ3JhbShjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsLCBlbnJvbG1lbnRMaXN0OiBhbnksIGNvbGxlY3Rpb25JZD86IHN0cmluZykge1xuICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgbGV0IHRvdGFsQ291bnQgPSAwXG4gICAgbGV0IGxlYWZub2RlQ291bnQgPSAwXG4gICAgbGV0IGNvbXBsZXRlZExlYWZOb2RlczogYW55ID0gW11cbiAgICBsZXQgZmlyc3RVbmNvbXBsZXRlQ291cnNlOiBhbnkgPSAnJ1xuICAgIGxldCBpbnByb2dyZXNzRGF0YUNoZWNrOiBhbnkgPSBbXVxuICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgICAgIGxlYWZub2RlQ291bnQgPSBjb250ZW50LmxlYWZOb2Rlc0NvdW50XG4gICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dCh0cnVlKVxuICAgICAgY29uc3QgZm91bmRQYXJlbnRDb250ZW50ID0gdGhpcy5maW5kRW5yb2xtZW50QnlDb2xsZWN0aW9uSWQoZW5yb2xtZW50TGlzdCwgY29sbGVjdGlvbklkIHx8IGNvbnRlbnQuaWRlbnRpZmllcilcbiAgICAgIGlmIChmb3VuZFBhcmVudENvbnRlbnQgJiYgZm91bmRQYXJlbnRDb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5tYXBDb21wbGV0aW9uQ2hpbGRQZXJjZW50YWdlUHJvZ3JhbShjb250ZW50KVxuICAgICAgICB0b3RhbENvdW50ID0gY29udGVudC5sZWFmTm9kZXNDb3VudFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSAhPT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb250ZW50LmNoaWxkcmVuLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgICAvLyBjb250ZW50LmNoaWxkcmVuLmZvckVhY2goYXN5bmMgKHBhcmVudENoaWxkLGluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRDaGlsZCA9IGNvbnRlbnQuY2hpbGRyZW5baV1cbiAgICAgICAgICAgIGlmIChwYXJlbnRDaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPVVJTRSkge1xuICAgICAgICAgICAgICBjb25zdCBmb3VuZENvbnRlbnQgPSB0aGlzLmZpbmRFbnJvbG1lbnRCeUNvbGxlY3Rpb25JZChlbnJvbG1lbnRMaXN0LCBwYXJlbnRDaGlsZD8uaWRlbnRpZmllcilcbiAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgICAgLy8gdG90YWxDb3VudCA9IGZvdW5kQ29udGVudCAmJiBmb3VuZENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPyB0b3RhbENvdW50ICsgZm91bmRDb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIDogdG90YWxDb3VudCArIDBcbiAgICAgICAgICAgICAgLy8gY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9IE1hdGgucm91bmQodG90YWxDb3VudCAvIGxlYWZub2RlQ291bnQpXG4gICAgICAgICAgICAgIGlmIChmb3VuZENvbnRlbnQgJiYgZm91bmRDb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dCh0cnVlKVxuICAgICAgICAgICAgICAgIHRvdGFsQ291bnQgPSB0b3RhbENvdW50ICs9IHBhcmVudENoaWxkLmxlYWZOb2Rlc0NvdW50XG4gICAgICAgICAgICAgICAgY29tcGxldGVkTGVhZk5vZGVzID0gWy4uLmNvbXBsZXRlZExlYWZOb2RlcywgLi4ucGFyZW50Q2hpbGQubGVhZk5vZGVzXVxuICAgICAgICAgICAgICAgIGlmIChmb3VuZENvbnRlbnQuaXNzdWVkQ2VydGlmaWNhdGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNlcnRpZmljYXRlOiBhbnkgPSBmb3VuZENvbnRlbnQuaXNzdWVkQ2VydGlmaWNhdGVzLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PlxuICAgICAgICAgICAgICAgICAgICBuZXcgRGF0ZShhLmxhc3RJc3N1ZWRPbikuZ2V0VGltZSgpIC0gbmV3IERhdGUoYi5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSlcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNlcnRJZDogYW55ID0gY2VydGlmaWNhdGVbMF0uaWRlbnRpZmllclxuICAgICAgICAgICAgICAgICAgcGFyZW50Q2hpbGQuaXNzdWVkQ2VydGlmaWNhdGVzSWQgPSBjZXJ0SWRcbiAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGNlcnREYXRhOiBhbnkgPSBhd2FpdCB0aGlzLmRvd29ubG9hZENlcnRpZmljYXRlKGNlcnRJZCkudG9Qcm9taXNlKCkuY2F0Y2goX2Vycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgICAgICAgICAvLyB9KVxuICAgICAgICAgICAgICAgICAgLy8gaWYgKGNlcnREYXRhICYmIGNlcnREYXRhLnJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgLy8gICBwYXJlbnRDaGlsZC5pc3N1ZWRDZXJ0aWZpY2F0ZXNTVkcgPSBjZXJ0RGF0YS5yZXN1bHQucHJpbnRVcmlcbiAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJlbnRDaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSA9IDEwMFxuICAgICAgICAgICAgICAgIHBhcmVudENoaWxkLmNvbXBsZXRpb25TdGF0dXMgPSAyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5tYXBDb21wbGV0aW9uQ2hpbGRQZXJjZW50YWdlUHJvZ3JhbShwYXJlbnRDaGlsZClcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZm91bmRDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dCh0cnVlKVxuICAgICAgICAgICAgICAgICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldENvbnRlbnRMYW5ndWFnZShwYXJlbnRDaGlsZClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgICAgICAgICAgIGJhdGNoSWQ6IGZvdW5kQ29udGVudC5iYXRjaC5iYXRjaElkLFxuICAgICAgICAgICAgICAgICAgICAgIHVzZXJJZDogZm91bmRDb250ZW50LnVzZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgY291cnNlSWQ6IGZvdW5kQ29udGVudC5jb2xsZWN0aW9uSWQsXG4gICAgICAgICAgICAgICAgICAgICAgY29udGVudElkczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAncHJvZ3Jlc3NkZXRhaWxzJyxcbiAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZmlyc3RVbmNvbXBsZXRlQ291cnNlID0gKHBhcmVudENoaWxkLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAwIHx8ICFwYXJlbnRDaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWZpcnN0VW5jb21wbGV0ZUNvdXJzZSA/IHBhcmVudENoaWxkIDogZmlyc3RVbmNvbXBsZXRlQ291cnNlXG4gICAgICAgICAgICAgICAgICBpbnByb2dyZXNzRGF0YUNoZWNrID0gaW5wcm9ncmVzc0RhdGFDaGVja1xuICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5mZXRjaENvbnRlbnRIaXN0b3J5VjIocmVxKS50b1Byb21pc2UoKS50aGVuKChwcm9ncmVzc2RhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSBwcm9ncmVzc2RhdGFcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0ICYmIGRhdGE/LnJlc3VsdD8uY29udGVudExpc3Q/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRDb3VudCA9IGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0LmZpbHRlcigoZWxlOiBhbnkpID0+IGVsZS5wcm9ncmVzcyA9PT0gMTAwKVxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tDb21wbGV0ZWRMZWFmbm9kZXMoY29tcGxldGVkTGVhZk5vZGVzLCBjb21wbGV0ZWRDb3VudClcbiAgICAgICAgICAgICAgICAgICAgICB0b3RhbENvdW50ID0gY29tcGxldGVkTGVhZk5vZGVzLmxlbmd0aFxuICAgICAgICAgICAgICAgICAgICAgIGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPSBbLi4uaW5wcm9ncmVzc0RhdGFDaGVjaywgLi4uZGF0YS5yZXN1bHQuY29udGVudExpc3RdXG4gICAgICAgICAgICAgICAgICAgICAgLy8gaW5wcm9ncmVzc0RhdGFDaGVjayA9IGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPyBpbnByb2dyZXNzRGF0YUNoZWNrIDogIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSZXN1bWFEYXRhKGlucHJvZ3Jlc3NEYXRhQ2hlY2spXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZShwYXJlbnRDaGlsZCwgZGF0YS5yZXN1bHQuY29udGVudExpc3QpXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXBNb2R1bGVDb3VudChwYXJlbnRDaGlsZClcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcE1vZHVsZUNvdW50KHBhcmVudENoaWxkKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9ncmVzc2RhdGFcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vICBlbHNlIHtcbiAgICAgICAgICAgIC8vICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0pIHtcbiAgICAgICAgICAgIC8vICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dCh0cnVlKVxuICAgICAgICAgICAgLy8gICAgIGNvbnN0IGZvdW5kQ29udGVudCA9IGVucm9sbWVudExpc3QgJiYgZW5yb2xtZW50TGlzdC5maW5kKChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IGNvbnRlbnQuaWRlbnRpZmllcilcbiAgICAgICAgICAgIC8vICAgICBpZiAoZm91bmRDb250ZW50KSB7XG4gICAgICAgICAgICAvLyAgICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgICAgICAvLyAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICBiYXRjaElkOiBmb3VuZENvbnRlbnQuYmF0Y2guYmF0Y2hJZCxcbiAgICAgICAgICAgIC8vICAgICAgICAgICB1c2VySWQ6IGZvdW5kQ29udGVudC51c2VySWQsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgY291cnNlSWQ6IGZvdW5kQ29udGVudC5jb2xsZWN0aW9uSWQsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgY29udGVudElkczogW10sXG4gICAgICAgICAgICAvLyAgICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAncHJvZ3Jlc3NkZXRhaWxzJyxcbiAgICAgICAgICAgIC8vICAgICAgICAgICBdLFxuICAgICAgICAgICAgLy8gICAgICAgICB9LFxuICAgICAgICAgICAgLy8gICAgICAgfVxuICAgICAgICAgICAgLy8gICAgICAgYXdhaXQgdGhpcy5mZXRjaENvbnRlbnRIaXN0b3J5VjIocmVxKS50b1Byb21pc2UoKS50aGVuKChwcm9ncmVzc2RhdGE6IGFueSkgPT4ge1xuICAgICAgICAgICAgLy8gICAgICAgICBjb25zdCBkYXRhOiBhbnkgID0gcHJvZ3Jlc3NkYXRhXG4gICAgICAgICAgICAvLyAgICAgICAgIGlmIChkYXRhLnJlc3VsdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgY29uc3QgY29tcGxldGVkQ291bnQgPSBkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5maWx0ZXIoKGVsZTogYW55KSA9PiBlbGUucHJvZ3Jlc3MgPT09IDEwMClcbiAgICAgICAgICAgIC8vICAgICAgICAgICB0aGlzLmNoZWNrQ29tcGxldGVkTGVhZm5vZGVzKGNvbXBsZXRlZExlYWZOb2RlcywgY29tcGxldGVkQ291bnQpXG4gICAgICAgICAgICAvLyAgICAgICAgICAgdG90YWxDb3VudCA9IGNvbXBsZXRlZExlYWZOb2Rlcy5sZW5ndGhcbiAgICAgICAgICAgIC8vICAgICAgICAgICBpbnByb2dyZXNzRGF0YUNoZWNrID0gaW5wcm9ncmVzc0RhdGFDaGVjayA/IGlucHJvZ3Jlc3NEYXRhQ2hlY2sgOiAgZGF0YS5yZXN1bHQuY29udGVudExpc3RcbiAgICAgICAgICAgIC8vICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VtYURhdGEoaW5wcm9ncmVzc0RhdGFDaGVjaylcbiAgICAgICAgICAgIC8vICAgICAgICAgICB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQsIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0KVxuICAgICAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgICAgLy8gICAgICAgICByZXR1cm4gcHJvZ3Jlc3NkYXRhXG4gICAgICAgICAgICAvLyAgICAgICB9KVxuICAgICAgICAgICAgLy8gICAgIH1cbiAgICAgICAgICAgIC8vICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICAgIC8vICAgfVxuICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgdGhpcy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXG4gICAgICAgICAgfHwgY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPVVJTRVxuICAgICAgICAgIHx8IGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlRcbiAgICAgICAgICB8fCBjb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ1VSQVRFRF9QUk9HUkFNKSB7XG4gICAgICAgICAgLy8gdGhpcy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50LCB0aGlzLnJlc3VtZURhdGEpXG4gICAgICAgICAgY29uc3QgZm91bmRQYXJlbnRDb250ZW50ID0gdGhpcy5maW5kRW5yb2xtZW50QnlDb2xsZWN0aW9uSWQoZW5yb2xtZW50TGlzdCwgY29sbGVjdGlvbklkIHx8IGNvbnRlbnQ/LmlkZW50aWZpZXIpXG4gICAgICAgICAgY29uc3QgbGFuZ3VhZ2UgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldENvbnRlbnRMYW5ndWFnZShjb250ZW50KVxuICAgICAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgYmF0Y2hJZDogZm91bmRQYXJlbnRDb250ZW50Py5iYXRjaD8uYmF0Y2hJZCxcbiAgICAgICAgICAgICAgdXNlcklkOiBmb3VuZFBhcmVudENvbnRlbnQ/LnVzZXJJZCxcbiAgICAgICAgICAgICAgY291cnNlSWQ6IGZvdW5kUGFyZW50Q29udGVudD8uY29sbGVjdGlvbklkLFxuICAgICAgICAgICAgICBsYW5ndWFnZTogbGFuZ3VhZ2UsXG4gICAgICAgICAgICAgIGNvbnRlbnRJZHM6IFtdLFxuICAgICAgICAgICAgICBmaWVsZHM6IFtcbiAgICAgICAgICAgICAgICAncHJvZ3Jlc3NkZXRhaWxzJyxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50SGlzdG9yeVYyKHJlcSkudG9Qcm9taXNlKCkudGhlbigocHJvZ3Jlc3NkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGE6IGFueSA9IHByb2dyZXNzZGF0YVxuICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5yZXN1bHQgJiYgZGF0YS5yZXN1bHQuY29udGVudExpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBjb21wbGV0ZWRDb3VudCA9IGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0LmZpbHRlcigoZWxlOiBhbnkpID0+IGVsZS5wcm9ncmVzcyA9PT0gMTAwKVxuICAgICAgICAgICAgICB0aGlzLmNoZWNrQ29tcGxldGVkTGVhZm5vZGVzKGNvbXBsZXRlZExlYWZOb2RlcywgY29tcGxldGVkQ291bnQpXG4gICAgICAgICAgICAgIHRvdGFsQ291bnQgPSBjb21wbGV0ZWRMZWFmTm9kZXMubGVuZ3RoXG4gICAgICAgICAgICAgIGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPSBbLi4uaW5wcm9ncmVzc0RhdGFDaGVjaywgLi4uZGF0YS5yZXN1bHQuY29udGVudExpc3RdXG4gICAgICAgICAgICAgIC8vIGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPSBpbnByb2dyZXNzRGF0YUNoZWNrID8gaW5wcm9ncmVzc0RhdGFDaGVjayA6ICBkYXRhLnJlc3VsdC5jb250ZW50TGlzdFxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VtYURhdGEoaW5wcm9ncmVzc0RhdGFDaGVjaylcbiAgICAgICAgICAgICAgdGhpcy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZShjb250ZW50LCBkYXRhLnJlc3VsdC5jb250ZW50TGlzdClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgICAgcmV0dXJuIHByb2dyZXNzZGF0YVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5wcm9ncmVzc0RhdGFDaGVjayAmJiBpbnByb2dyZXNzRGF0YUNoZWNrLmxlbmd0aCA9PT0gMCAmJiBmaXJzdFVuY29tcGxldGVDb3Vyc2UpIHtcbiAgICAgICAgICBjb25zdCBmaXJzdENoaWxkRGF0YSA9IHRoaXMud2lkZ2V0U3ZjLmdldEZpcnN0Q2hpbGRJbkhpZXJhcmNoeShmaXJzdFVuY29tcGxldGVDb3Vyc2UpXG4gICAgICAgICAgY29uc3QgY2hpbGRFbnJvbGxtZW50RGF0YSA9IGVucm9sbWVudExpc3QuZmluZCgoZWw6IGFueSkgPT5cbiAgICAgICAgICAgIGVsLmNvbGxlY3Rpb25JZCA9PT0gZmlyc3RVbmNvbXBsZXRlQ291cnNlLmlkZW50aWZpZXIpXG4gICAgICAgICAgY29uc3QgcmVzdW1lRGF0YSA9IFt7XG4gICAgICAgICAgICBjb250ZW50SWQ6IGZpcnN0Q2hpbGREYXRhLmlkZW50aWZpZXIsXG4gICAgICAgICAgICBiYXRjaElkOiBjaGlsZEVucm9sbG1lbnREYXRhICYmIGNoaWxkRW5yb2xsbWVudERhdGEuYmF0Y2hJZCxcbiAgICAgICAgICAgIGNvbXBsZXRlZENvdW50OiAxLFxuICAgICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IDAuMCxcbiAgICAgICAgICAgIHByb2dyZXNzOiAwLFxuICAgICAgICAgICAgdmlld0NvdW50OiAxLFxuICAgICAgICAgICAgY291cnNlSWQ6IGNoaWxkRW5yb2xsbWVudERhdGEgJiYgY2hpbGRFbnJvbGxtZW50RGF0YS5jb3Vyc2VJZCxcbiAgICAgICAgICAgIGNvbGxlY3Rpb25JZDogY2hpbGRFbnJvbGxtZW50RGF0YSAmJiBjaGlsZEVucm9sbG1lbnREYXRhLmNvdXJzZUlkLFxuICAgICAgICAgICAgc3RhdHVzOiAxLFxuICAgICAgICAgIH1dXG4gICAgICAgICAgaW5wcm9ncmVzc0RhdGFDaGVjayA9IHJlc3VtZURhdGFcbiAgICAgICAgICB0aGlzLnVwZGF0ZVJlc3VtYURhdGEoaW5wcm9ncmVzc0RhdGFDaGVjaylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gY29uc3QgcGFyZW50Q29udGVudCA9IGVucm9sbWVudExpc3QuZmluZCgoZWw6IGFueSkgPT4gZWwuY29sbGVjdGlvbklkID09PSBjb250ZW50LmlkZW50aWZpZXIpXG4gICAgICAvLyBpZiAoIXBhcmVudENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UpIHtcbiAgICAgIGNvbnN0IGNhbGN1bGF0ZWRQY3QgPSBNYXRoLmZsb29yKCh0b3RhbENvdW50IC8gbGVhZm5vZGVDb3VudCkgKiAxMDApXG4gICAgICBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID0gaXNOYU4oY2FsY3VsYXRlZFBjdCkgPyAwIDogY2FsY3VsYXRlZFBjdFxuICAgICAgY29udGVudC5jb21wbGV0aW9uU3RhdHVzID0gY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDAgPyAyIDogKGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPiAwID8gMSA6IDApXG4gICAgICBpZiAoY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwICYmIGlucHJvZ3Jlc3NEYXRhQ2hlY2sgJiYgaW5wcm9ncmVzc0RhdGFDaGVjay5sZW5ndGggPT09IDAgJiYgIWZpcnN0VW5jb21wbGV0ZUNvdXJzZSkge1xuICAgICAgICBjb25zdCBmaXJzdENoaWxkRGF0YSA9IHRoaXMud2lkZ2V0U3ZjLmdldEZpcnN0Q2hpbGRJbkhpZXJhcmNoeShjb250ZW50KVxuICAgICAgICBjb25zdCBjaGlsZEVucm9sbG1lbnREYXRhID0gZW5yb2xtZW50TGlzdC5maW5kKChlbDogYW55KSA9PlxuICAgICAgICAgIGVsLmNvbGxlY3Rpb25JZCA9PT0gY29udGVudC5jaGlsZHJlblswXS5pZGVudGlmaWVyKVxuICAgICAgICBjb25zdCByZXN1bWVEYXRhID0gW3tcbiAgICAgICAgICBjb250ZW50SWQ6IGZpcnN0Q2hpbGREYXRhLmlkZW50aWZpZXIsXG4gICAgICAgICAgYmF0Y2hJZDogY2hpbGRFbnJvbGxtZW50RGF0YSAmJiBjaGlsZEVucm9sbG1lbnREYXRhLmJhdGNoSWQsXG4gICAgICAgICAgY29tcGxldGVkQ291bnQ6IDEsXG4gICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IDEwMCxcbiAgICAgICAgICBwcm9ncmVzczogMixcbiAgICAgICAgICB2aWV3Q291bnQ6IDEsXG4gICAgICAgICAgY291cnNlSWQ6IGNoaWxkRW5yb2xsbWVudERhdGEgJiYgY2hpbGRFbnJvbGxtZW50RGF0YS5jb3Vyc2VJZCxcbiAgICAgICAgICBjb2xsZWN0aW9uSWQ6IGNoaWxkRW5yb2xsbWVudERhdGEgJiYgY2hpbGRFbnJvbGxtZW50RGF0YS5jb3Vyc2VJZCxcbiAgICAgICAgICBzdGF0dXM6IDIsXG4gICAgICAgIH1dXG4gICAgICAgIGlucHJvZ3Jlc3NEYXRhQ2hlY2sgPSByZXN1bWVEYXRhXG4gICAgICAgIHRoaXMudXBkYXRlUmVzdW1hRGF0YShpbnByb2dyZXNzRGF0YUNoZWNrKVxuICAgICAgfVxuICAgICAgLy8gLy8gfSBlbHNlIHtcbiAgICAgIC8vICAgY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9IHBhcmVudENvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgIC8vIC8vIH1cbiAgICAgIC8vIH0pXG4gICAgICAvLyB0aGlzLm1hcE1vZHVsZUR1cmF0aW9uQW5kUHJvZ3Jlc3MoY29udGVudCwgY29udGVudClcbiAgICAgIHRoaXMuY2FsbEhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKGNvbnRlbnQpXG4gICAgICB0aGlzLmNoZWNrTW9kdWxlV2lzZURhdGEoY29udGVudClcbiAgICAgIC8vIENvbXB1dGUgbWlsZXN0b25lIGxvY2tpbmcgQUZURVIgcHJvZ3Jlc3MgZGF0YSBpcyBwb3B1bGF0ZWRcbiAgICAgIGlmIChjb250ZW50LmNvdXJzZUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUGF0aHdheScpIHtcbiAgICAgICAgdGhpcy5jb21wdXRlTWlsZXN0b25lTG9ja2luZ1N0YXR1cygpXG4gICAgICAgIC8vIEVuc3VyZSBoYXNobWFwIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBmb3IgY2hhbmdlIGRldGVjdGlvblxuICAgICAgICB0aGlzLmhhc2htYXAgPSB7IC4uLnRoaXMuaGFzaG1hcCB9XG4gICAgICB9XG4gICAgICB0aGlzLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICB9XG4gIH1cbiAgY2hlY2tDb21wbGV0ZWRMZWFmbm9kZXMobGVhZk5vZGVzOiBhbnksIGNvbXBsZXRlZENvdW50OiBhbnkpIHtcbiAgICBpZiAoY29tcGxldGVkQ291bnQubGVuZ3RoID4gMCkge1xuICAgICAgY29tcGxldGVkQ291bnQuZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFsZWFmTm9kZXMuaW5jbHVkZXMoZWxlLmNvbnRlbnRJZCkpIHtcbiAgICAgICAgICBsZWFmTm9kZXMucHVzaChlbGUuY29udGVudElkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8vIGFzeW5jIGdldFByb2dyZXNzRm9yQ2hpbGRDb3Vyc2UocmVxdWVzdDogYW55LCBjb250ZW50OiBhbnkpIHtcbiAgLy8gIGNvbnN0IGRhdGE6IGFueSA9ICAgYXdhaXQgdGhpcy5mZXRjaENvbnRlbnRIaXN0b3J5VjIocmVxdWVzdCkudG9Qcm9taXNlKCkuY2F0Y2goX2Vycm9yID0+IHt9KVxuICAvLyAgIGlmIChkYXRhLnJlc3VsdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5sZW5ndGggPiAwKSB7XG4gIC8vICAgICB0aGlzLm1hcENvbXBsZXRpb25QZXJjZW50YWdlKGNvbnRlbnQsIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0KVxuICAvLyB9XG4gIC8vIH1cblxuICBmaW5kRW5yb2xtZW50QnlDb2xsZWN0aW9uSWQoZW5yb2xtZW50TGlzdDogYW55LCBpZGVudGlmaWVyOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gZW5yb2xtZW50TGlzdCAmJiBlbnJvbG1lbnRMaXN0Py5sZW5ndGggJiYgZW5yb2xtZW50TGlzdC5maW5kKChlbDogYW55KSA9PiBlbD8uY29sbGVjdGlvbklkID09PSBpZGVudGlmaWVyKVxuICB9XG5cbiAgYXN5bmMgbWFwQ29tcGxldGlvbkNoaWxkUGVyY2VudGFnZVByb2dyYW0oY291cnNlOiBhbnkpIHtcbiAgICBpZiAoY291cnNlICYmIGNvdXJzZS5jaGlsZHJlbikge1xuICAgICAgYXdhaXQgY291cnNlLmNoaWxkcmVuLm1hcChhc3luYyAoY291cnNlQ2hpbGQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAoKGNvdXJzZUNoaWxkICYmIGNvdXJzZUNoaWxkLmNoaWxkcmVuKSB8fCBjb3Vyc2VDaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSkge1xuICAgICAgICAgIHRoaXMubWFwQ29tcGxldGlvbkNoaWxkUGVyY2VudGFnZVByb2dyYW0oY291cnNlQ2hpbGQpXG4gICAgICAgICAgY291cnNlWydtb2R1bGVDb3VudCddID0gY291cnNlWydtb2R1bGVDb3VudCddID8gY291cnNlWydtb2R1bGVDb3VudCddICsgMSA6IDFcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb3Vyc2VDaGlsZFsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IDEwMFxuICAgICAgICAgIGNvdXJzZUNoaWxkWydjb21wbGV0aW9uU3RhdHVzJ10gPSAyXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIG1hcE1vZHVsZUR1cmF0aW9uQW5kUHJvZ3Jlc3MoY29udGVudDogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCwgcGFyZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsKSB7XG4gICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC5jaGlsZHJlbikge1xuICAgICAgaWYgKGNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgICAgICAgLy8gY29udGVudC5jaGlsZHJlbi5tYXAoKGl0ZW06IE5zQ29udGVudC5JQ29udGVudCk9PiB7XG4gICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICBjb250ZW50ID0gdGhpcy5nZXRDYWxjdWxhdGlvbnNGcm9tQ2hpbGRyZW4oY29udGVudClcbiAgICAgICAgLy8gfSlcbiAgICAgIH1cblxuICAgICAgY29udGVudC5jaGlsZHJlbi5tYXAoKGl0ZW06IE5zQ29udGVudC5JQ29udGVudCkgPT4ge1xuICAgICAgICAvLyBpZiAoaXRlbS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSkge1xuICAgICAgICAvLyAgIHRoaXMubWFwTW9kdWxlRHVyYXRpb25BbmRQcm9ncmVzcyhpdGVtLCBwYXJlbnQpXG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vICAgdGhpcy5tYXBNb2R1bGVEdXJhdGlvbkFuZFByb2dyZXNzKGl0ZW0sIHBhcmVudClcbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAoaXRlbSAmJiBpdGVtLmNoaWxkcmVuKSB7XG4gICAgICAgICAgdGhpcy5tYXBNb2R1bGVEdXJhdGlvbkFuZFByb2dyZXNzKGl0ZW0sIHBhcmVudClcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAoaGllcmFyY2h5RGF0YTogTnNDb250ZW50LklDb250ZW50LCByb290Q291cnNlQ2F0ZWdvcnk/OiBzdHJpbmcpIHtcbiAgICBpZiAoaGllcmFyY2h5RGF0YSAmJiBoaWVyYXJjaHlEYXRhLmNoaWxkcmVuKSB7XG4gICAgICBoaWVyYXJjaHlEYXRhLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkOiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLmNoaWxkcmVuKSB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVIaXJhcmNoeVByb2dyZXNzSGFzaG1hcChjaGlsZCwgcm9vdENvdXJzZUNhdGVnb3J5KVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByaW1hcnlDYXQgPSBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgYXMgc3RyaW5nXG4gICAgICAgIGNvbnN0IGNvdXJzZUNhdCA9IChjaGlsZC5jb3Vyc2VDYXRlZ29yeSB8fCBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgfHwgJycpIGFzIHN0cmluZ1xuICAgICAgICBjb25zdCBpc01pbGVzdG9uZSA9IHByaW1hcnlDYXQgPT09ICdNaWxlc3RvbmUnIHx8IGNvdXJzZUNhdCA9PT0gJ01pbGVzdG9uZSdcbiAgICAgICAgY29uc3QgaXNDb2xsZWN0aW9uID0gY2hpbGQubWltZVR5cGUgPT09IE5zQ29udGVudC5FTWltZVR5cGVzLkNPTExFQ1RJT05cbiAgICAgICAgY29uc3QgaXNNb2R1bGUgPSBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRVxuICAgICAgICBjb25zdCBpc1Jlc291cmNlID0gY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSB8fFxuICAgICAgICAgIGNoaWxkLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0UgfHxcbiAgICAgICAgICBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkZJTkFMX0FTU0VTU01FTlQgfHxcbiAgICAgICAgICBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPTVBfQVNTRVNTTUVOVFxuICAgICAgICBjb25zdCBpc0xlYXJuaW5nUGF0aHdheSA9IHJvb3RDb3Vyc2VDYXRlZ29yeSA9PT0gJ0xlYXJuaW5nIFBhdGh3YXknXG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgY29udGVudCBpcyBtYW5kYXRvcnkgKGlzTWFuZGF0b3J5IGZsYWcgb3IgbWFuZGF0b3J5IHByb3BlcnR5KVxuICAgICAgICBjb25zdCBpc01hbmRhdG9yeSA9IGNoaWxkLmlzTWFuZGF0b3J5ID09PSB0cnVlIHx8IChjaGlsZCBhcyBhbnkpLm1hbmRhdG9yeSA9PT0gdHJ1ZVxuXG4gICAgICAgIGxldCBsb2NhbE1hcDogYW55ID0ge1xuICAgICAgICAgIHBhcmVudDogY2hpbGQ/LnBhcmVudCxcbiAgICAgICAgICBpZGVudGlmaWVyOiBjaGlsZC5pZGVudGlmaWVyLFxuICAgICAgICAgIGxlYWZOb2Rlc0NvdW50OiBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCBudWxsLFxuICAgICAgICAgIGxlYWZOb2RlczogY2hpbGQubGVhZk5vZGVzIHx8IFtdLFxuICAgICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjaGlsZC5wcm9ncmVzcyB8fCAwLFxuICAgICAgICAgIGNvbXBsZXRpb25TdGF0dXM6IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgfHwgY2hpbGQuc3RhdHVzIHx8IDAsXG4gICAgICAgICAgc3RhdHVzOiBjaGlsZC5zdGF0dXMgfHwgY2hpbGQuY29tcGxldGlvblN0YXR1cyB8fCAwLFxuICAgICAgICAgIHByb2dyZXNzOiBjaGlsZC5wcm9ncmVzcyxcbiAgICAgICAgICBwcmltYXJ5Q2F0ZWdvcnk6IGNoaWxkLnByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgICBjb3Vyc2VDYXRlZ29yeTogY291cnNlQ2F0LFxuICAgICAgICAgIGR1cmF0aW9uOiBjaGlsZC5kdXJhdGlvbiB8fCAwLFxuICAgICAgICAgIGV4cGVjdGVkRHVyYXRpb246IGNoaWxkLmV4cGVjdGVkRHVyYXRpb24gfHwgMCxcbiAgICAgICAgICAvLyBBZGRpdGlvbmFsIG1ldGFkYXRhIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25cbiAgICAgICAgICBtaW1lVHlwZTogY2hpbGQubWltZVR5cGUsXG4gICAgICAgICAgaXNMb2NrZWQ6IGNoaWxkLmlzTG9ja2VkIHx8IGZhbHNlLFxuICAgICAgICAgIGFydGlmYWN0VXJsOiBjaGlsZC5hcnRpZmFjdFVybCB8fCBudWxsLFxuICAgICAgICAgIG5hbWU6IGNoaWxkLm5hbWUgfHwgJycsXG4gICAgICAgICAgY29udGVudFR5cGU6IGNoaWxkLmNvbnRlbnRUeXBlIHx8ICcnLFxuICAgICAgICAgIC8vIFByZS1jb21wdXRlZCBmbGFncyBmb3IgTGVhcm5pbmcgUGF0aHdheVxuICAgICAgICAgIGlzTWlsZXN0b25lOiBpc01pbGVzdG9uZSxcbiAgICAgICAgICBpc0NvbGxlY3Rpb246IGlzQ29sbGVjdGlvbixcbiAgICAgICAgICBpc01vZHVsZTogaXNNb2R1bGUsXG4gICAgICAgICAgaXNSZXNvdXJjZTogaXNSZXNvdXJjZSxcbiAgICAgICAgICBpc0xlYXJuaW5nUGF0aHdheTogaXNMZWFybmluZ1BhdGh3YXksXG4gICAgICAgICAgaXNNYW5kYXRvcnk6IGlzTWFuZGF0b3J5LFxuICAgICAgICAgIC8vIE1pbGVzdG9uZSBzcGVjaWZpYyBkYXRhXG4gICAgICAgICAgbWlsZXN0b25lSW5kZXg6IChjaGlsZCBhcyBhbnkpLm1pbGVzdG9uZUluZGV4LFxuICAgICAgICAgIGNvbXBsZXRlZExlYWZOb2Rlc0NvdW50OiAoY2hpbGQgYXMgYW55KS5jb21wbGV0ZWRMZWFmTm9kZXNDb3VudCB8fCAwLFxuICAgICAgICAgIC8vIFByZS1hc3Nlc3NtZW50IGZsYWcgKGZvciBtaWxlc3RvbmUgZ2F0aW5nKVxuICAgICAgICAgIGlzUHJlQXNzZXNzbWVudDogKGNoaWxkIGFzIGFueSkuaXNQcmVBc3Nlc3NtZW50IHx8IGZhbHNlLFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVidWcgbG9nZ2luZyBmb3IgbWlsZXN0b25lc1xuICAgICAgICBpZiAoaXNNaWxlc3RvbmUpIHtcbiAgICAgICAgICAvLyBQcm9ncmVzcyB0cmFja2VkIGZvciBtaWxlc3RvbmVcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFzaG1hcFtjaGlsZC5pZGVudGlmaWVyXSA9IGxvY2FsTWFwXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVQcmVBc3Nlc3NtZW50SGlyYXJjaHlQcm9ncmVzc0hhc2htYXAoaGllcmFyY2h5RGF0YTogTnNDb250ZW50LklDb250ZW50KSB7XG4gICAgaWYgKGhpZXJhcmNoeURhdGEgJiYgaGllcmFyY2h5RGF0YS5wcmVFbnJvbG1lbnRSZXNvdXJjZXMpIHtcbiAgICAgIGhpZXJhcmNoeURhdGEucHJlRW5yb2xtZW50UmVzb3VyY2VzLmZvckVhY2goKGNoaWxkOiBOc0NvbnRlbnQuSUNvbnRlbnQpID0+IHtcbiAgICAgICAgaWYgKGNoaWxkICYmIGNoaWxkLnByZUVucm9sbWVudFJlc291cmNlcykge1xuICAgICAgICAgIHRoaXMuY3JlYXRlUHJlQXNzZXNzbWVudEhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKGNoaWxkKVxuICAgICAgICB9XG4gICAgICAgIGxldCBsb2NhbE1hcCA9IHt9XG4gICAgICAgIGxvY2FsTWFwID0ge1xuICAgICAgICAgIHBhcmVudDogY2hpbGQ/LnBhcmVudCxcbiAgICAgICAgICBpZGVudGlmaWVyOiBjaGlsZC5pZGVudGlmaWVyLFxuICAgICAgICAgIGxlYWZOb2Rlc0NvdW50OiBjaGlsZC5sZWFmTm9kZXNDb3VudCB8fCBudWxsLFxuICAgICAgICAgIGxlYWZOb2RlczogY2hpbGQubGVhZk5vZGVzIHx8IFtdLFxuICAgICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiBjaGlsZC5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjaGlsZC5wcm9ncmVzcyxcbiAgICAgICAgICBjb21wbGV0aW9uU3RhdHVzOiBjaGlsZC5jb21wbGV0aW9uU3RhdHVzLFxuICAgICAgICAgIHN0YXR1czogY2hpbGQuc3RhdHVzIHx8IGNoaWxkLmNvbXBsZXRpb25TdGF0dXMgfHwgMCxcbiAgICAgICAgICBwcm9ncmVzczogY2hpbGQucHJvZ3Jlc3MsXG4gICAgICAgICAgcHJpbWFyeUNhdGVnb3J5OiBjaGlsZC5wcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgICAgY291cnNlQ2F0ZWdvcnk6IGNoaWxkLmNvdXJzZUNhdGVnb3J5IHx8IGNoaWxkLnByaW1hcnlDYXRlZ29yeSB8fCAnJyxcbiAgICAgICAgICBkdXJhdGlvbjogY2hpbGQuZHVyYXRpb24gfHwgMCxcbiAgICAgICAgICBleHBlY3RlZER1cmF0aW9uOiBjaGlsZC5leHBlY3RlZER1cmF0aW9uIHx8IDAsXG4gICAgICAgICAgLy8gTWFyayBhcyBwcmUtYXNzZXNzbWVudCBPTkxZIGlmIGV4cGxpY2l0bHkgc2V0IC0gZG8gTk9UIGRlZmF1bHQgdG8gdHJ1ZVxuICAgICAgICAgIGlzUHJlQXNzZXNzbWVudDogY2hpbGQuaXNQcmVBc3Nlc3NtZW50IHx8IGZhbHNlLFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGFzaG1hcFtjaGlsZC5pZGVudGlmaWVyXSA9IGxvY2FsTWFwXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAoaGllcmFyY2h5RGF0YTogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCkge1xuICAgIGlmIChoaWVyYXJjaHlEYXRhKSB7XG4gICAgICBjb25zdCByb290Q291cnNlQ2F0ZWdvcnkgPSBoaWVyYXJjaHlEYXRhLmNvdXJzZUNhdGVnb3J5IHx8IGhpZXJhcmNoeURhdGEucHJpbWFyeUNhdGVnb3J5IHx8ICcnXG4gICAgICBjb25zdCBpc0xlYXJuaW5nUGF0aHdheSA9IHJvb3RDb3Vyc2VDYXRlZ29yeSA9PT0gJ0xlYXJuaW5nIFBhdGh3YXknXG5cbiAgICAgIHRoaXMuaGFzaG1hcFtoaWVyYXJjaHlEYXRhLmlkZW50aWZpZXJdID0ge1xuICAgICAgICBwYXJlbnQ6IGhpZXJhcmNoeURhdGEucGFyZW50LFxuICAgICAgICBpZGVudGlmaWVyOiBoaWVyYXJjaHlEYXRhLmlkZW50aWZpZXIsXG4gICAgICAgIGxlYWZOb2Rlc0NvdW50OiBoaWVyYXJjaHlEYXRhLmxlYWZOb2Rlc0NvdW50IHx8IG51bGwsXG4gICAgICAgIGxlYWZOb2RlczogaGllcmFyY2h5RGF0YS5sZWFmTm9kZXMgfHwgW10sXG4gICAgICAgIGNvbXBsZXRpb25QZXJjZW50YWdlOiBoaWVyYXJjaHlEYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGhpZXJhcmNoeURhdGEucHJvZ3Jlc3MgfHwgMCxcbiAgICAgICAgY29tcGxldGlvblN0YXR1czogaGllcmFyY2h5RGF0YS5jb21wbGV0aW9uU3RhdHVzIHx8IDAsXG4gICAgICAgIHByb2dyZXNzOiBoaWVyYXJjaHlEYXRhLnByb2dyZXNzLFxuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnk6IGhpZXJhcmNoeURhdGEucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICBjb3Vyc2VDYXRlZ29yeTogcm9vdENvdXJzZUNhdGVnb3J5LFxuICAgICAgICBleHBlY3RlZER1cmF0aW9uOiBoaWVyYXJjaHlEYXRhLmV4cGVjdGVkRHVyYXRpb24gfHwgMCxcbiAgICAgICAgLy8gQWRkaXRpb25hbCBtZXRhZGF0YVxuICAgICAgICBtaW1lVHlwZTogaGllcmFyY2h5RGF0YS5taW1lVHlwZSxcbiAgICAgICAgaXNMb2NrZWQ6IGhpZXJhcmNoeURhdGEuaXNMb2NrZWQgfHwgZmFsc2UsXG4gICAgICAgIGFydGlmYWN0VXJsOiBoaWVyYXJjaHlEYXRhLmFydGlmYWN0VXJsIHx8IG51bGwsXG4gICAgICAgIG5hbWU6IGhpZXJhcmNoeURhdGEubmFtZSB8fCAnJyxcbiAgICAgICAgY29udGVudFR5cGU6IGhpZXJhcmNoeURhdGEuY29udGVudFR5cGUgfHwgJycsXG4gICAgICAgIGlzTWlsZXN0b25lOiBmYWxzZSxcbiAgICAgICAgaXNDb2xsZWN0aW9uOiBoaWVyYXJjaHlEYXRhLm1pbWVUeXBlID09PSBOc0NvbnRlbnQuRU1pbWVUeXBlcy5DT0xMRUNUSU9OLFxuICAgICAgICBpc01vZHVsZTogaGllcmFyY2h5RGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSxcbiAgICAgICAgaXNSZXNvdXJjZTogZmFsc2UsXG4gICAgICAgIGlzTGVhcm5pbmdQYXRod2F5OiBpc0xlYXJuaW5nUGF0aHdheSxcbiAgICAgIH1cbiAgICAgIGlmIChoaWVyYXJjaHlEYXRhLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ1VSQVRFRF9QUk9HUkFNICYmXG4gICAgICAgIGhpZXJhcmNoeURhdGEuY29tcGF0aWJpbGl0eUxldmVsID49IDUgJiYgaGllcmFyY2h5RGF0YS5jb250ZXh0TG9ja2luZ1R5cGUgJiZcbiAgICAgICAgaGllcmFyY2h5RGF0YS5jb250ZXh0TG9ja2luZ1R5cGUgPT09IE5zQ29udGVudC5FQ29udGV4dExvY2tpbmdUeXBlLkNPVVJTRV9BU1NFU1NNRU5UX09OTFkpIHtcbiAgICAgICAgdGhpcy5oYXNobWFwW2hpZXJhcmNoeURhdGEuaWRlbnRpZmllcl0gPSB7XG4gICAgICAgICAgLi4udGhpcy5oYXNobWFwW2hpZXJhcmNoeURhdGEuaWRlbnRpZmllcl0sXG4gICAgICAgICAgY29udGV4dExvY2tpbmdUeXBlOiBoaWVyYXJjaHlEYXRhLmNvbnRleHRMb2NraW5nVHlwZSxcbiAgICAgICAgICBjb21wYXRpYmlsaXR5TGV2ZWw6IGhpZXJhcmNoeURhdGEuY29tcGF0aWJpbGl0eUxldmVsLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmNyZWF0ZUhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKGhpZXJhcmNoeURhdGEsIHJvb3RDb3Vyc2VDYXRlZ29yeSlcbiAgICAgIC8vIE5PVEU6IGNvbXB1dGVNaWxlc3RvbmVMb2NraW5nU3RhdHVzIGlzIGNhbGxlZCBBRlRFUiBwcm9ncmVzcyBkYXRhIGlzIHBvcHVsYXRlZFxuICAgICAgLy8gaW4gbWFwQ29tcGxldGlvblBlcmNlbnRhZ2VQcm9ncmFtLCBub3QgaGVyZSB3aGVyZSBjb21wbGV0aW9uIGRhdGEgaXMgc3RpbGwgMFxuICAgICAgdGhpcy5oYXNobWFwID0geyAuLi50aGlzLmhhc2htYXAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmUtY29tcHV0ZSBtaWxlc3RvbmUgbG9ja2luZyBzdGF0dXMgZm9yIGFsbCBtaWxlc3RvbmVzIGluIExlYXJuaW5nIFBhdGh3YXlcbiAgICogVGhpcyBhdm9pZHMgZXhwZW5zaXZlIGNhbGN1bGF0aW9ucyBpbiBjb21wb25lbnQgZ2V0dGVyc1xuICAgKiBcbiAgICogTG9ja2luZyBSdWxlczpcbiAgICogMC4gSWYgdXNlciBpcyBub3QgZW5yb2xsZWQsIEFMTCBtaWxlc3RvbmVzIGFyZSBsb2NrZWRcbiAgICogMS4gQWxsIG1pbGVzdG9uZXMgYXJlIGxvY2tlZCBieSBkZWZhdWx0XG4gICAqIDIuIE1pbGVzdG9uZSAxIChNMSkgdW5sb2NrcyB3aGVuIHByZS1hc3Nlc3NtZW50IGlzIGNvbXBsZXRlZFxuICAgKiAzLiBNaWxlc3RvbmUgTiAoTiA+IDEpIHVubG9ja3Mgd2hlbjpcbiAgICogICAgLSBBbGwgbWFuZGF0b3J5IGxlYXJuaW5nIGl0ZW1zIGluIE1pbGVzdG9uZSBOLTEgYXJlIGNvbXBsZXRlZFxuICAgKiAgICAtIFRoZSBhc3Nlc3NtZW50IG9mIE1pbGVzdG9uZSBOLTEgaXMgY29tcGxldGVkXG4gICAqL1xuICBwdWJsaWMgY29tcHV0ZU1pbGVzdG9uZUxvY2tpbmdTdGF0dXMoaXNFbnJvbGxlZDogYm9vbGVhbiA9IHRydWUpIHtcbiAgICBpZiAoIXRoaXMuaGFzaG1hcCB8fCBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIFxuICAgIGNvbnNvbGUubG9nKCc9PT0gY29tcHV0ZU1pbGVzdG9uZUxvY2tpbmdTdGF0dXMgPT09JylcbiAgICBjb25zb2xlLmxvZygnVXNlciBlbnJvbGxlZDonLCBpc0Vucm9sbGVkKVxuICAgIFxuICAgIC8vIENhcHR1cmUgaW5pdGlhbCBzdGF0ZSB0byBkZXRlY3QgY2hhbmdlc1xuICAgIGNvbnN0IGluaXRpYWxIYXNobWFwU25hcHNob3QgPSBKU09OLnN0cmluZ2lmeSh0aGlzLmhhc2htYXApXG4gICAgXG4gICAgLy8gR2V0IGFsbCBtaWxlc3RvbmUgZW50cmllcyBmcm9tIGhhc2htYXAgc29ydGVkIGJ5IHRoZWlyIGluZGV4IG9yIG51bWJlclxuICAgIGNvbnN0IG1pbGVzdG9uZUVudHJpZXMgPSBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApXG4gICAgICAuZmlsdGVyKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmhhc2htYXBba2V5XVxuICAgICAgICByZXR1cm4gaXRlbS5pc01pbGVzdG9uZSB8fCBpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZScgfHwgaXRlbS5jb3Vyc2VDYXRlZ29yeSA9PT0gJ01pbGVzdG9uZSdcbiAgICAgIH0pXG4gICAgICAuc29ydCgoYSwgYikgPT4ge1xuICAgICAgICAvLyBTb3J0IGJ5IG1pbGVzdG9uZUluZGV4IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGJ5IG51bWJlciBpbiBJRFxuICAgICAgICBjb25zdCBpdGVtQSA9IHRoaXMuaGFzaG1hcFthXVxuICAgICAgICBjb25zdCBpdGVtQiA9IHRoaXMuaGFzaG1hcFtiXVxuICAgICAgICBpZiAoaXRlbUEubWlsZXN0b25lSW5kZXggIT09IHVuZGVmaW5lZCAmJiBpdGVtQi5taWxlc3RvbmVJbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGl0ZW1BLm1pbGVzdG9uZUluZGV4IC0gaXRlbUIubWlsZXN0b25lSW5kZXhcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBudW1BID0gcGFyc2VJbnQoYS5yZXBsYWNlKC9cXEQvZywgJycpKSB8fCAwXG4gICAgICAgIGNvbnN0IG51bUIgPSBwYXJzZUludChiLnJlcGxhY2UoL1xcRC9nLCAnJykpIHx8IDBcbiAgICAgICAgcmV0dXJuIG51bUEgLSBudW1CXG4gICAgICB9KVxuXG4gICAgLy8gSWYgdXNlciBpcyBOT1QgZW5yb2xsZWQsIGxvY2sgQUxMIG1pbGVzdG9uZXNcbiAgICBpZiAoIWlzRW5yb2xsZWQpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdVc2VyIG5vdCBlbnJvbGxlZCAtIGxvY2tpbmcgQUxMIG1pbGVzdG9uZXMnKVxuICAgICAgbWlsZXN0b25lRW50cmllcy5mb3JFYWNoKG1pbGVzdG9uZUlkID0+IHtcbiAgICAgICAgdGhpcy5oYXNobWFwW21pbGVzdG9uZUlkXS5jb21wdXRlZElzTG9ja2VkID0gdHJ1ZVxuICAgICAgfSlcbiAgICAgIC8vIEFsc28gbG9jayBhbGwgY2hpbGRyZW5cbiAgICAgIE9iamVjdC5rZXlzKHRoaXMuaGFzaG1hcCkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cbiAgICAgICAgaWYgKCFpdGVtLmlzTWlsZXN0b25lKSB7XG4gICAgICAgICAgdGhpcy5oYXNobWFwW2tleV0uaXNQYXJlbnRNaWxlc3RvbmVMb2NrZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICB0aGlzLmhhc2htYXAgPSB7IC4uLnRoaXMuaGFzaG1hcCB9XG4gICAgICB0aGlzLmhhc2htYXBVcGRhdGVkLm5leHQoeyB0aW1lc3RhbXA6IERhdGUubm93KCksIGhhc2htYXA6IHRoaXMuaGFzaG1hcCB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgcHJlLWFzc2Vzc21lbnQgaXMgY29tcGxldGVkIChyZXF1aXJlZCB0byB1bmxvY2sgTTEpXG4gICAgY29uc3QgaXNQcmVBc3Nlc3NtZW50Q29tcGxldGVkID0gdGhpcy5jaGVja1ByZUFzc2Vzc21lbnRDb21wbGV0aW9uKClcblxuICAgIG1pbGVzdG9uZUVudHJpZXMuZm9yRWFjaCgobWlsZXN0b25lSWQsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBtaWxlc3RvbmUgPSB0aGlzLmhhc2htYXBbbWlsZXN0b25lSWRdXG4gICAgICBpZiAoIW1pbGVzdG9uZSkgcmV0dXJuXG5cbiAgICAgIC8vIEZpcnN0IG1pbGVzdG9uZSAoTTEpIC0gdW5sb2NrcyB3aGVuIHByZS1hc3Nlc3NtZW50IGlzIGNvbXBsZXRlZFxuICAgICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICAgIHRoaXMuaGFzaG1hcFttaWxlc3RvbmVJZF0uY29tcHV0ZWRJc0xvY2tlZCA9ICFpc1ByZUFzc2Vzc21lbnRDb21wbGV0ZWRcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG5cbiAgICAgIC8vIEZvciBzdWJzZXF1ZW50IG1pbGVzdG9uZXMgKE0yLCBNMywgZXRjLiksIGNoZWNrIGlmIHByZXZpb3VzIG1pbGVzdG9uZSBpcyBmdWxseSBjb21wbGV0ZWRcbiAgICAgIGNvbnN0IHByZXZpb3VzTWlsZXN0b25lSWQgPSBtaWxlc3RvbmVFbnRyaWVzW2luZGV4IC0gMV1cbiAgICAgIGNvbnN0IHByZXZpb3VzTWlsZXN0b25lID0gdGhpcy5oYXNobWFwW3ByZXZpb3VzTWlsZXN0b25lSWRdXG5cbiAgICAgIGlmIChwcmV2aW91c01pbGVzdG9uZSkge1xuICAgICAgICAvLyBTSU1QTElGSUVEIEFQUFJPQUNIOiBDaGVjayBpZiBwcmV2aW91cyBtaWxlc3RvbmUgaXMgMTAwJSBjb21wbGV0ZVxuICAgICAgICAvLyBUaGlzIHVzZXMgdGhlIGFnZ3JlZ2F0ZWQgY29tcGxldGlvbiBwZXJjZW50YWdlIHdoaWNoIGlzIGFscmVhZHkgY2FsY3VsYXRlZFxuICAgICAgICAvLyBVc2UgTnVtYmVyKCkgdG8gZW5zdXJlIHByb3BlciBudW1lcmljIGNvbXBhcmlzb25cbiAgICAgICAgY29uc3QgcHJldkNvbXBsZXRpb25QY3QgPSBOdW1iZXIocHJldmlvdXNNaWxlc3RvbmUuY29tcGxldGlvblBlcmNlbnRhZ2UpIHx8IDBcbiAgICAgICAgY29uc3QgcHJldkNvbXBsZXRpb25TdGF0dXMgPSBOdW1iZXIocHJldmlvdXNNaWxlc3RvbmUuY29tcGxldGlvblN0YXR1cykgfHwgMFxuICAgICAgICBjb25zdCBwcmV2U3RhdHVzID0gTnVtYmVyKHByZXZpb3VzTWlsZXN0b25lLnN0YXR1cykgfHwgMFxuICAgICAgICBjb25zdCBwcmV2Q29tcGxldGVkTGVhZk5vZGVzID0gTnVtYmVyKHByZXZpb3VzTWlsZXN0b25lLmNvbXBsZXRlZExlYWZOb2Rlc0NvdW50KSB8fCAwXG4gICAgICAgIGNvbnN0IHByZXZMZWFmTm9kZXNDb3VudCA9IE51bWJlcihwcmV2aW91c01pbGVzdG9uZS5sZWFmTm9kZXNDb3VudCkgfHwgMFxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzTWlsZXN0b25lQ29tcGxldGUgPVxuICAgICAgICAgIHByZXZDb21wbGV0aW9uUGN0ID49IDEwMCB8fFxuICAgICAgICAgIHByZXZDb21wbGV0aW9uU3RhdHVzID09PSAyIHx8XG4gICAgICAgICAgcHJldlN0YXR1cyA9PT0gMiB8fFxuICAgICAgICAgIChwcmV2TGVhZk5vZGVzQ291bnQgPiAwICYmIHByZXZDb21wbGV0ZWRMZWFmTm9kZXMgPj0gcHJldkxlYWZOb2Rlc0NvdW50KVxuXG4gICAgICAgIC8vIElmIHNpbXBsZSBjaGVjayBkb2Vzbid0IHNob3cgY29tcGxldGUsIGZhbGwgYmFjayB0byBkZXRhaWxlZCBjaGVja1xuICAgICAgICBsZXQgY2FuVW5sb2NrID0gcHJldmlvdXNNaWxlc3RvbmVDb21wbGV0ZVxuXG4gICAgICAgIGlmICghY2FuVW5sb2NrKSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2s6IENoZWNrIGluZGl2aWR1YWwgaXRlbXNcbiAgICAgICAgICBjb25zdCBpc1ByZXZpb3VzTWlsZXN0b25lQXNzZXNzbWVudENvbXBsZXRlID0gdGhpcy5jaGVja01pbGVzdG9uZUFzc2Vzc21lbnRDb21wbGV0ZShwcmV2aW91c01pbGVzdG9uZUlkKVxuICAgICAgICAgIGNvbnN0IGlzUHJldmlvdXNNaWxlc3RvbmVNYW5kYXRvcnlDb21wbGV0ZSA9IHRoaXMuY2hlY2tNaWxlc3RvbmVNYW5kYXRvcnlDb250ZW50Q29tcGxldGUocHJldmlvdXNNaWxlc3RvbmVJZClcbiAgICAgICAgICBjYW5VbmxvY2sgPSBpc1ByZXZpb3VzTWlsZXN0b25lQXNzZXNzbWVudENvbXBsZXRlICYmIGlzUHJldmlvdXNNaWxlc3RvbmVNYW5kYXRvcnlDb21wbGV0ZVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5oYXNobWFwW21pbGVzdG9uZUlkXS5jb21wdXRlZElzTG9ja2VkID0gIWNhblVubG9ja1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oYXNobWFwW21pbGVzdG9uZUlkXS5jb21wdXRlZElzTG9ja2VkID0gdHJ1ZVxuICAgICAgfVxuICAgIH0pXG5cbiAgICAvLyBOb3cgY29tcHV0ZSBwYXJlbnQgbWlsZXN0b25lIGxvY2sgc3RhdHVzIGZvciBhbGwgY2hpbGRyZW5cbiAgICBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLmhhc2htYXBba2V5XVxuICAgICAgaWYgKGl0ZW0uaXNNaWxlc3RvbmUpIHJldHVybiAvLyBTa2lwIG1pbGVzdG9uZXMgdGhlbXNlbHZlc1xuXG4gICAgICAvLyBUcmF2ZXJzZSB1cCB0byBmaW5kIGlmIGFueSBhbmNlc3RvciBtaWxlc3RvbmUgaXMgbG9ja2VkXG4gICAgICBsZXQgY3VycmVudFBhcmVudElkID0gaXRlbS5wYXJlbnRcbiAgICAgIGxldCBkZXB0aCA9IDBcbiAgICAgIGNvbnN0IG1heERlcHRoID0gNVxuXG4gICAgICB3aGlsZSAoY3VycmVudFBhcmVudElkICYmIGRlcHRoIDwgbWF4RGVwdGgpIHtcbiAgICAgICAgY29uc3QgcGFyZW50RGF0YSA9IHRoaXMuaGFzaG1hcFtjdXJyZW50UGFyZW50SWRdXG4gICAgICAgIGlmIChwYXJlbnREYXRhKSB7XG4gICAgICAgICAgaWYgKHBhcmVudERhdGEuaXNNaWxlc3RvbmUgJiYgcGFyZW50RGF0YS5jb21wdXRlZElzTG9ja2VkKSB7XG4gICAgICAgICAgICB0aGlzLmhhc2htYXBba2V5XS5pc1BhcmVudE1pbGVzdG9uZUxvY2tlZCA9IHRydWVcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRQYXJlbnRJZCA9IHBhcmVudERhdGEucGFyZW50XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBkZXB0aCsrXG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaGFzaG1hcFtrZXldLmlzUGFyZW50TWlsZXN0b25lTG9ja2VkKSB7XG4gICAgICAgIHRoaXMuaGFzaG1hcFtrZXldLmlzUGFyZW50TWlsZXN0b25lTG9ja2VkID0gZmFsc2VcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gQ3JlYXRlIG5ldyBoYXNobWFwIHJlZmVyZW5jZSB0byB0cmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvblxuICAgIHRoaXMuaGFzaG1hcCA9IHsgLi4udGhpcy5oYXNobWFwIH1cbiAgICBcbiAgICAvLyBFbWl0IHVwZGF0ZSBldmVudCBpZiBoYXNobWFwIGNoYW5nZWQgKG1pbGVzdG9uZSBsb2NrIHN0YXR1cyB1cGRhdGVkKVxuICAgIGNvbnN0IGZpbmFsSGFzaG1hcFNuYXBzaG90ID0gSlNPTi5zdHJpbmdpZnkodGhpcy5oYXNobWFwKVxuICAgIGlmIChpbml0aWFsSGFzaG1hcFNuYXBzaG90ICE9PSBmaW5hbEhhc2htYXBTbmFwc2hvdCkge1xuICAgICAgdGhpcy5oYXNobWFwVXBkYXRlZC5uZXh0KHsgdGltZXN0YW1wOiBEYXRlLm5vdygpLCBoYXNobWFwOiB0aGlzLmhhc2htYXAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBtaWxlc3RvbmUgbG9jayB1cGRhdGUgd2hlbiBoYXNobWFwIHByb2dyZXNzIGlzIHVwZGF0ZWQgZXh0ZXJuYWxseVxuICAgKiBDYWxsZWQgZnJvbSB2aWV3ZXItdXRpbC5zZXJ2aWNlLnRzIGFmdGVyIHByb2dyZXNzIHVwZGF0ZXNcbiAgICovXG4gIHB1YmxpYyB0cmlnZ2VyTWlsZXN0b25lTG9ja1VwZGF0ZSgpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgTGVhcm5pbmcgUGF0aHdheSBpbiB0aGUgaGFzaG1hcFxuICAgIGNvbnN0IGhhc0xlYXJuaW5nUGF0aHdheSA9IE9iamVjdC5rZXlzKHRoaXMuaGFzaG1hcCkuc29tZShrZXkgPT4ge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGFzaG1hcFtrZXldXG4gICAgICByZXR1cm4gaXRlbS5pc0xlYXJuaW5nUGF0aHdheSAmJiBpdGVtLmNvdXJzZUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUGF0aHdheSdcbiAgICB9KVxuICAgIFxuICAgIGlmIChoYXNMZWFybmluZ1BhdGh3YXkpIHtcbiAgICAgIGNvbnNvbGUubG9nKCfwn5SEIFRyaWdnZXJpbmcgbWlsZXN0b25lIGxvY2sgcmVjb21wdXRhdGlvbiBhZnRlciBwcm9ncmVzcyB1cGRhdGUnKVxuICAgICAgLy8gQXNzdW1lIGVucm9sbGVkIHNpbmNlIHByb2dyZXNzIHdhcyBqdXN0IHVwZGF0ZWRcbiAgICAgIHRoaXMuY29tcHV0ZU1pbGVzdG9uZUxvY2tpbmdTdGF0dXModHJ1ZSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgcHJlLWFzc2Vzc21lbnQgKHByZWxpbWluYXJ5IGFzc2Vzc21lbnQpIGlzIGNvbXBsZXRlZFxuICAgKiBQcmUtYXNzZXNzbWVudCBpcyB0eXBpY2FsbHkgYSBDb3Vyc2UgQXNzZXNzbWVudCBhdCB0aGUgcm9vdCBsZXZlbCBvZiBMZWFybmluZyBQYXRod2F5IChiZWZvcmUgbWlsZXN0b25lcylcbiAgICovXG4gIHByaXZhdGUgY2hlY2tQcmVBc3Nlc3NtZW50Q29tcGxldGlvbigpOiBib29sZWFuIHtcbiAgICAvLyBGaW5kIHRoZSBMZWFybmluZyBQYXRod2F5IHJvb3RcbiAgICBsZXQgbGVhcm5pbmdQYXRod2F5SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5oYXNobWFwKSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGFzaG1hcFtrZXldXG4gICAgICBpZiAoaXRlbS5pc0xlYXJuaW5nUGF0aHdheSAmJiBpdGVtLmNvdXJzZUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUGF0aHdheScpIHtcbiAgICAgICAgbGVhcm5pbmdQYXRod2F5SWQgPSBrZXlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnQ2hlY2tpbmcgcHJlLWFzc2Vzc21lbnQgY29tcGxldGlvbi4gTGVhcm5pbmcgUGF0aHdheSBJRDonLCBsZWFybmluZ1BhdGh3YXlJZClcblxuICAgIC8vIFBSSU9SSVRZIDE6IExvb2sgZm9yIGl0ZW1zIGV4cGxpY2l0bHkgbWFya2VkIGFzIHByZS1hc3Nlc3NtZW50XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXModGhpcy5oYXNobWFwKSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGFzaG1hcFtrZXldXG4gICAgICBpZiAoaXRlbS5pc1ByZUFzc2Vzc21lbnQgPT09IHRydWUpIHtcbiAgICAgICAgLy8gTXVzdCBjaGVjayBmb3IgYWN0dWFsIGNvbXBsZXRpb24gLSBub3QganVzdCBhbnkgdmFsdWVcbiAgICAgICAgY29uc3QgaXNDb21wbGV0ZWQgPSAoaXRlbS5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGl0ZW0uc3RhdHVzID09PSAyIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlICE9PSB1bmRlZmluZWQgJiYgaXRlbS5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDApIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLnByb2dyZXNzICE9PSB1bmRlZmluZWQgJiYgaXRlbS5wcm9ncmVzcyA+PSAxMDApKVxuICAgICAgICBjb25zb2xlLmxvZyhg4pyFIFByZS1hc3Nlc3NtZW50IGZvdW5kIChpc1ByZUFzc2Vzc21lbnQgZmxhZyk6ICR7a2V5fWAsIHtcbiAgICAgICAgICBuYW1lOiBpdGVtLm5hbWUsXG4gICAgICAgICAgY29tcGxldGlvblN0YXR1czogaXRlbS5jb21wbGV0aW9uU3RhdHVzLFxuICAgICAgICAgIHN0YXR1czogaXRlbS5zdGF0dXMsXG4gICAgICAgICAgY29tcGxldGlvblBlcmNlbnRhZ2U6IGl0ZW0uY29tcGxldGlvblBlcmNlbnRhZ2UsXG4gICAgICAgICAgcHJvZ3Jlc3M6IGl0ZW0ucHJvZ3Jlc3MsXG4gICAgICAgICAgaXNDb21wbGV0ZWQsXG4gICAgICAgICAgLy8gU2hvdyBBTEwgZmllbGRzIHRvIGRlYnVnIHdoYXQncyBhdmFpbGFibGVcbiAgICAgICAgICBhbGxEYXRhOiBKU09OLnN0cmluZ2lmeShpdGVtLCBudWxsLCAyKVxuICAgICAgICB9KVxuICAgICAgICAvLyBQcmUtYXNzZXNzbWVudCBleGlzdHMgLSByZXR1cm4gaXRzIGNvbXBsZXRpb24gc3RhdHVzICh0cnVlL2ZhbHNlKVxuICAgICAgICByZXR1cm4gaXNDb21wbGV0ZWRcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQUklPUklUWSAyOiBGaW5kIHByZS1hc3Nlc3NtZW50IGluIGhhc2htYXAgLSBkaXJlY3QgY2hpbGQgb2YgTGVhcm5pbmcgUGF0aHdheSB0aGF0IGlzIE5PVCBhIG1pbGVzdG9uZVxuICAgIC8vIENoZWNrIGZvciBmaXJzdCBub24tbWlsZXN0b25lIGNoaWxkIG9mIExlYXJuaW5nIFBhdGh3YXlcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgTGVhcm5pbmcgUGF0aHdheVxuICAgICAgaWYgKGl0ZW0ucGFyZW50ICE9PSBsZWFybmluZ1BhdGh3YXlJZCkgY29udGludWVcblxuICAgICAgLy8gU2tpcCBtaWxlc3RvbmVzXG4gICAgICBpZiAoaXRlbS5pc01pbGVzdG9uZSkgY29udGludWVcblxuICAgICAgLy8gVGhpcyBpcyBhIG5vbi1taWxlc3RvbmUgZGlyZWN0IGNoaWxkIC0gaXQncyB0aGUgcHJlLWFzc2Vzc21lbnRcbiAgICAgIC8vIE11c3QgY2hlY2sgZm9yIGFjdHVhbCBjb21wbGV0aW9uIC0gbm90IGp1c3QgYW55IHZhbHVlXG4gICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IChpdGVtLmNvbXBsZXRpb25TdGF0dXMgPT09IDIgfHwgaXRlbS5zdGF0dXMgPT09IDIgfHwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlICE9PSB1bmRlZmluZWQgJiYgaXRlbS5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDApIHx8IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbS5wcm9ncmVzcyAhPT0gdW5kZWZpbmVkICYmIGl0ZW0ucHJvZ3Jlc3MgPj0gMTAwKSlcbiAgICAgIGNvbnNvbGUubG9nKGDinIUgUHJlLWFzc2Vzc21lbnQgZm91bmQgKGZpcnN0IG5vbi1taWxlc3RvbmUgY2hpbGQpOiAke2tleX1gLCB7XG4gICAgICAgIG5hbWU6IGl0ZW0ubmFtZSxcbiAgICAgICAgY29tcGxldGlvblN0YXR1czogaXRlbS5jb21wbGV0aW9uU3RhdHVzLFxuICAgICAgICBzdGF0dXM6IGl0ZW0uc3RhdHVzLFxuICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZTogaXRlbS5jb21wbGV0aW9uUGVyY2VudGFnZSxcbiAgICAgICAgcHJvZ3Jlc3M6IGl0ZW0ucHJvZ3Jlc3MsXG4gICAgICAgIGlzQ29tcGxldGVkLFxuICAgICAgICAvLyBTaG93IEFMTCBmaWVsZHMgdG8gZGVidWcgd2hhdCdzIGF2YWlsYWJsZVxuICAgICAgICBhbGxEYXRhOiBKU09OLnN0cmluZ2lmeShpdGVtLCBudWxsLCAyKVxuICAgICAgfSlcbiAgICAgIC8vIFByZS1hc3Nlc3NtZW50IGV4aXN0cyAtIHJldHVybiBpdHMgY29tcGxldGlvbiBzdGF0dXMgKHRydWUvZmFsc2UpXG4gICAgICByZXR1cm4gaXNDb21wbGV0ZWRcbiAgICB9XG5cbiAgICAvLyBDUklUSUNBTDogSWYgd2UgcmVhY2ggaGVyZSwgbm8gcHJlLWFzc2Vzc21lbnQgd2FzIGZvdW5kIGluIHRoZSBoYXNobWFwXG4gICAgLy8gVGhpcyBjb3VsZCBtZWFuIGVpdGhlcjpcbiAgICAvLyAxLiBUaGVyZSBJUyBubyBwcmUtYXNzZXNzbWVudCAodW5sb2NrIE0xIGJ5IGRlZmF1bHQpXG4gICAgLy8gMi4gVGhlIGhhc2htYXAgaGFzbid0IGJlZW4gcG9wdWxhdGVkIHlldCAoc2hvdWxkIGxvY2sgTTEgdW50aWwgZGF0YSBpcyByZWFkeSlcbiAgICBcbiAgICAvLyBUbyBiZSBzYWZlLCBjaGVjayBpZiBBTlkgY2hpbGRyZW4gZXhpc3QgYXQgYWxsXG4gICAgY29uc3QgaGFzQW55Q2hpbGRyZW4gPSBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApLnNvbWUoa2V5ID0+IFxuICAgICAgdGhpcy5oYXNobWFwW2tleV0ucGFyZW50ID09PSBsZWFybmluZ1BhdGh3YXlJZFxuICAgIClcbiAgICBcbiAgICBpZiAoIWhhc0FueUNoaWxkcmVuKSB7XG4gICAgICAvLyBIYXNobWFwIG5vdCBwb3B1bGF0ZWQgeWV0IC0gbG9jayBNMSB1bnRpbCBkYXRhIGlzIHJlYWR5XG4gICAgICBjb25zb2xlLmxvZygn4pqg77iPIE5vIGNoaWxkcmVuIGZvdW5kIGluIGhhc2htYXAgeWV0IC0gbG9ja2luZyBNMSB1bnRpbCBkYXRhIGlzIHJlYWR5JylcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBcbiAgICAvLyBIYXNobWFwIGlzIHBvcHVsYXRlZCBidXQgbm8gcHJlLWFzc2Vzc21lbnQgZm91bmQgLSBhbGxvdyBNMSB0byB1bmxvY2tcbiAgICBjb25zb2xlLmxvZygnTm8gcHJlLWFzc2Vzc21lbnQgZm91bmQgaW4gZnVsbHkgcG9wdWxhdGVkIGhhc2htYXAgLSBhbGxvd2luZyBNMSB0byBiZSB1bmxvY2tlZCBieSBkZWZhdWx0JylcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIGEgbWlsZXN0b25lJ3MgYXNzZXNzbWVudCBpcyBjb21wbGV0ZWRcbiAgICogU2VhcmNoZXMgZm9yIGFueSBhc3Nlc3NtZW50IHR5cGUgKENvdXJzZSBBc3Nlc3NtZW50LCBGaW5hbCBBc3Nlc3NtZW50LCBldGMuKSB0aGF0IGJlbG9uZ3MgdG8gdGhpcyBtaWxlc3RvbmVcbiAgICovXG4gIHByaXZhdGUgY2hlY2tNaWxlc3RvbmVBc3Nlc3NtZW50Q29tcGxldGUobWlsZXN0b25lSWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG1pbGVzdG9uZSA9IHRoaXMuaGFzaG1hcFttaWxlc3RvbmVJZF1cblxuICAgIC8vIENoZWNrIGFsbCBpdGVtcyBpbiBoYXNobWFwIHRoYXQgYXJlIGFzc2Vzc21lbnRzIGFuZCBiZWxvbmcgdG8gdGhpcyBtaWxlc3RvbmVcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhbiBhc3Nlc3NtZW50IHR5cGVcbiAgICAgIGNvbnN0IGlzQXNzZXNzbWVudFR5cGUgPVxuICAgICAgICBpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0NvdXJzZSBBc3Nlc3NtZW50JyB8fFxuICAgICAgICBpdGVtLnByaW1hcnlDYXRlZ29yeSA9PT0gJ0ZpbmFsIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnUHJhY3RpY2UgUXVlc3Rpb24gU2V0JyB8fFxuICAgICAgICBpdGVtLmNvdXJzZUNhdGVnb3J5ID09PSAnQ291cnNlIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGl0ZW0uY291cnNlQ2F0ZWdvcnkgPT09ICdGaW5hbCBBc3Nlc3NtZW50JyB8fFxuICAgICAgICAoaXRlbS5uYW1lICYmIGl0ZW0ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhc3Nlc3NtZW50JykpXG5cbiAgICAgIGlmICghaXNBc3Nlc3NtZW50VHlwZSkgY29udGludWVcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBhc3Nlc3NtZW50IGJlbG9uZ3MgdG8gdGhpcyBtaWxlc3RvbmVcbiAgICAgIGlmICh0aGlzLmlzQ2hpbGRPZk1pbGVzdG9uZShrZXksIG1pbGVzdG9uZUlkKSkge1xuICAgICAgICBjb25zdCBpc0NvbXBsZXRlZCA9IGl0ZW0uY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCBpdGVtLnN0YXR1cyA9PT0gMiB8fCBpdGVtLmNvbXBsZXRpb25QZXJjZW50YWdlID49IDEwMCB8fCBpdGVtLnByb2dyZXNzID49IDEwMFxuICAgICAgICBpZiAoaXNDb21wbGV0ZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgbm8gYXNzZXNzbWVudCBmb3VuZCwgY29uc2lkZXIgaXQgYXMgY29tcGxldGVkIChubyBhc3Nlc3NtZW50IHJlcXVpcmVtZW50KVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgYSBtaWxlc3RvbmUncyBtYW5kYXRvcnkgY29udGVudCBpcyBjb21wbGV0ZWRcbiAgICogT25seSBjaGVja3MgY291cnNlcy9jb250ZW50IHRoYXQgYXJlIG1hcmtlZCBhcyBpc01hbmRhdG9yeVxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja01pbGVzdG9uZU1hbmRhdG9yeUNvbnRlbnRDb21wbGV0ZShtaWxlc3RvbmVJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3QgbWlsZXN0b25lID0gdGhpcy5oYXNobWFwW21pbGVzdG9uZUlkXVxuXG4gICAgbGV0IG1hbmRhdG9yeUNvdW50ID0gMFxuICAgIGxldCBjb21wbGV0ZWRNYW5kYXRvcnlDb3VudCA9IDBcblxuICAgIC8vIENoZWNrIGFsbCBpdGVtcyBpbiBoYXNobWFwIHRoYXQgYXJlIGRpcmVjdCBjaGlsZHJlbiBvZiB0aGlzIG1pbGVzdG9uZSAoY291cnNlcylcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmhhc2htYXApKSB7XG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5oYXNobWFwW2tleV1cblxuICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBpdGVtIGlzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBtaWxlc3RvbmUgKGNvdXJzZSBsZXZlbClcbiAgICAgIGlmIChpdGVtLnBhcmVudCAhPT0gbWlsZXN0b25lSWQpIGNvbnRpbnVlXG5cbiAgICAgIC8vIFNraXAgaWYgbm90IGEgY291cnNlIG9yIGNvbGxlY3Rpb25cbiAgICAgIGlmIChpdGVtLnByaW1hcnlDYXRlZ29yeSAhPT0gJ0NvdXJzZScgJiYgIWl0ZW0uaXNDb2xsZWN0aW9uKSBjb250aW51ZVxuXG4gICAgICAvLyBTa2lwIGFzc2Vzc21lbnRzIC0gdGhleSdyZSBjaGVja2VkIHNlcGFyYXRlbHlcbiAgICAgIGNvbnN0IGlzQXNzZXNzbWVudCA9XG4gICAgICAgIGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnQ291cnNlIEFzc2Vzc21lbnQnIHx8XG4gICAgICAgIGl0ZW0ucHJpbWFyeUNhdGVnb3J5ID09PSAnRmluYWwgQXNzZXNzbWVudCcgfHxcbiAgICAgICAgaXRlbS5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0NvdXJzZSBBc3Nlc3NtZW50JyB8fFxuICAgICAgICAoaXRlbS5uYW1lICYmIGl0ZW0ubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCdhc3Nlc3NtZW50JykpXG4gICAgICBpZiAoaXNBc3Nlc3NtZW50KSBjb250aW51ZVxuXG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGNvbnRlbnQgaXMgbWFuZGF0b3J5XG4gICAgICBpZiAoaXRlbS5pc01hbmRhdG9yeSkge1xuICAgICAgICBtYW5kYXRvcnlDb3VudCsrXG4gICAgICAgIGNvbnN0IGlzQ29tcGxldGVkID0gaXRlbS5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IGl0ZW0uc3RhdHVzID09PSAyIHx8IGl0ZW0uY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwIHx8IGl0ZW0ucHJvZ3Jlc3MgPj0gMTAwXG4gICAgICAgIGlmIChpc0NvbXBsZXRlZCkge1xuICAgICAgICAgIGNvbXBsZXRlZE1hbmRhdG9yeUNvdW50KytcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFsbENvbXBsZXRlID0gbWFuZGF0b3J5Q291bnQgPT09IDAgfHwgY29tcGxldGVkTWFuZGF0b3J5Q291bnQgPj0gbWFuZGF0b3J5Q291bnRcbiAgICByZXR1cm4gYWxsQ29tcGxldGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGNvbnRlbnQgaXRlbSBpcyBhIGNoaWxkIChkaXJlY3Qgb3IgbmVzdGVkKSBvZiBhIG1pbGVzdG9uZVxuICAgKi9cbiAgcHJpdmF0ZSBpc0NoaWxkT2ZNaWxlc3RvbmUoY29udGVudElkOiBzdHJpbmcsIG1pbGVzdG9uZUlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBsZXQgY3VycmVudElkID0gY29udGVudElkXG4gICAgbGV0IGRlcHRoID0gMFxuICAgIGNvbnN0IG1heERlcHRoID0gMTBcblxuICAgIHdoaWxlIChjdXJyZW50SWQgJiYgZGVwdGggPCBtYXhEZXB0aCkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaGFzaG1hcFtjdXJyZW50SWRdXG4gICAgICBpZiAoIWl0ZW0pIHJldHVybiBmYWxzZVxuICAgICAgaWYgKGl0ZW0ucGFyZW50ID09PSBtaWxlc3RvbmVJZCkgcmV0dXJuIHRydWVcbiAgICAgIGN1cnJlbnRJZCA9IGl0ZW0ucGFyZW50XG4gICAgICBkZXB0aCsrXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0Q2FsY3VsYXRpb25zRnJvbUNoaWxkcmVuKGl0ZW06IE5zQ29udGVudC5JQ29udGVudCkge1xuICAgIGl0ZW1bJ2R1cmF0aW9uJ10gPSBpdGVtLmNoaWxkcmVuLnJlZHVjZSgoc3VtLCBjaGlsZCkgPT4ge1xuICAgICAgcmV0dXJuIHN1bSArIE51bWJlcihjaGlsZC5kdXJhdGlvbiB8fCAwKVxuICAgIH0sIDApXG4gICAgY29uc3QgY29tcGxldGVkSXRlbXMgPSBfLmZpbHRlcihpdGVtLmNoaWxkcmVuLCByID0+IHIuY29tcGxldGlvblN0YXR1cyA9PT0gMiB8fCByLmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApXG4gICAgY29uc3QgdG90YWxDb3VudCA9IF8udG9JbnRlZ2VyKF8uZ2V0KGl0ZW0sICdsZWFmTm9kZXNDb3VudCcpKSB8fCAxXG4gICAgaXRlbVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IE51bWJlcigoKGNvbXBsZXRlZEl0ZW1zLmxlbmd0aCAvIHRvdGFsQ291bnQpICogMTAwKS50b0ZpeGVkKCkpXG4gICAgaXRlbVsnY29tcGxldGlvblN0YXR1cyddID0gKGl0ZW0uY29tcGxldGlvblBlcmNlbnRhZ2UgPj0gMTAwKSA/IDIgOiAxXG4gICAgcmV0dXJuIGl0ZW1cbiAgfVxuXG4gIGZldGNoQ29udGVudEhpc3RvcnlWMihyZXE6IE5zQ29udGVudC5JQ29udGludWVMZWFybmluZ0RhdGFSZXEpOiBPYnNlcnZhYmxlPE5zQ29udGVudC5JQ29udGludWVMZWFybmluZ0RhdGE+IHtcbiAgICByZXEucmVxdWVzdC5maWVsZHMgPSBbJ3Byb2dyZXNzZGV0YWlscyddXG5cbiAgICBpZiAocmVxLnJlcXVlc3QuY291cnNlSWQpIHtcbiAgICAgIGNvbnN0IHJlc2x1dDogYW55ID0gdGhpcy5odHRwLnBvc3Q8TnNDb250ZW50LklDb250aW51ZUxlYXJuaW5nRGF0YT4oXG4gICAgICAgIGAke0FQSV9FTkRfUE9JTlRTLkNPTlRFTlRfSElTVE9SWVYyfS8ke3JlcS5yZXF1ZXN0LmNvdXJzZUlkfWAsIHJlcVxuICAgICAgKVxuICAgICAgLy8gZGF0YS5zdWJzY3JpYmUoKHN1YnNjcmliZURhdGE6IGFueSkgPT4ge1xuICAgICAgLy8gICAgICAgdGhpcy5wcm9ncmFtQ2hpbGRDb3Vyc2VSZXN1bWVEYXRhLm5leHQoeyByZXN1bWVEYXRhOiBzdWJzY3JpYmVEYXRhLnJlc3VsdC5jb250ZW50TGlzdCwgY291cnNlSWQ6IHJlcS5yZXF1ZXN0LmNvdXJzZUlkIH0pXG4gICAgICAvLyAgICAgfSlcbiAgICAgIHJldHVybiByZXNsdXRcbiAgICB9XG4gICAgcmV0dXJuIG9mKClcblxuICB9XG5cbiAgZG93b25sb2FkQ2VydGlmaWNhdGUoY2VydElkOiBhbnkpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0PHsgcmVzdWx0OiBhbnkgfT4oXG4gICAgICBBUElfRU5EX1BPSU5UUy5DRVJUX0RPV05MT0FEKGNlcnRJZCksXG4gICAgKVxuICB9XG4gIGdldFNlcnZlckRhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8eyByZXN1bHQ6IE5zQXBwVG9jLklQb3N0QXNzZXNzbWVudFtdIH0+KFxuICAgICAgQVBJX0VORF9QT0lOVFMuU0VSVkVSX0RBVEUpXG4gIH1cblxuICBnZXRGb3JtQnlJZChmb3JtSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KEFQSV9FTkRfUE9JTlRTLkdFVF9GT1JNX0JZSUQoZm9ybUlkKSlcbiAgfVxuXG4gIHN1Ym1pdEZvcm0oZm9ybURhdGE6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KEFQSV9FTkRfUE9JTlRTLlNVQk1JVF9GT1JNLCBmb3JtRGF0YSlcbiAgfVxuXG4gIGdldEZvcm1CeUlkUHVibGljKGZvcm1JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoQVBJX0VORF9QT0lOVFMuR0VUX0ZPUk1fQllJRF9QVUJMSUMoZm9ybUlkKSlcbiAgfVxuXG4gIHN1Ym1pdEZvcm1QdWJsaWMoZm9ybURhdGE6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmh0dHAucG9zdDxhbnk+KEFQSV9FTkRfUE9JTlRTLlNVQk1JVF9GT1JNX1BVQkxJQywgZm9ybURhdGEpXG4gIH1cblxuICBnZXRBcGxsaWNhdGlvbnNCeUlkKGZvcm1JZDogc3RyaW5nLCBjb250ZXh0SWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQ8YW55PihBUElfRU5EX1BPSU5UUy5HRVRfQVBQTElDQVRJT05TX0JZX0lEKGZvcm1JZCwgY29udGV4dElkKSlcbiAgfVxuXG4gIHNoYXJlQ29udGVudChyZXFCb2R5OiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3Q8YW55PihgJHtBUElfRU5EX1BPSU5UUy5TSEFSRV9DT05URU5UfWAsIHJlcUJvZHkpXG4gIH1cbiAgY2hlY2tNb2R1bGVXaXNlRGF0YShjb250ZW50OiBhbnkpIHtcbiAgICBpZiAoY29udGVudCAmJiBjb250ZW50LmNoaWxkcmVuKSB7XG4gICAgICBjb250ZW50LmNoaWxkcmVuLmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChlbGUucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgICAgICAgICBsZXQgbW9kdWxlUmVzb3Vyc2VDb3VudCA9IDBcbiAgICAgICAgICBsZXQgb2ZmbGluZVJlc291cnNlQ291bnQgPSAwXG4gICAgICAgICAgZWxlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkRWxlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChjaGlsZEVsZS5wcmltYXJ5Q2F0ZWdvcnkgIT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk9GRkxJTkVfU0VTU0lPTikge1xuICAgICAgICAgICAgICBtb2R1bGVSZXNvdXJzZUNvdW50ID0gbW9kdWxlUmVzb3Vyc2VDb3VudCArIDFcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9mZmxpbmVSZXNvdXJzZUNvdW50ID0gb2ZmbGluZVJlc291cnNlQ291bnQgKyAxXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBlbGVbJ21vZHVsZVJlc291cnNlQ291bnQnXSA9IG1vZHVsZVJlc291cnNlQ291bnRcbiAgICAgICAgICBlbGVbJ29mZmxpbmVSZXNvdXJzZUNvdW50J10gPSBvZmZsaW5lUmVzb3Vyc2VDb3VudFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChlbGUucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tNb2R1bGVXaXNlRGF0YShlbGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuICBhc3luYyBmZXRjaENvdXJzZUhlaXJhcmNoeShjb250ZW50RGF0YTogYW55KSB7XG4gICAgaWYgKGNvbnRlbnREYXRhICYmIGNvbnRlbnREYXRhLmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGVsZSBvZiBjb250ZW50RGF0YS5jaGlsZHJlbikge1xuICAgICAgICBpZiAoZWxlLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5DT1VSU0UpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndpZGdldFN2Yy5mZXRjaENvbnRlbnQoZWxlLmlkZW50aWZpZXIpLnRvUHJvbWlzZSgpLnRoZW4oYXN5bmMgKHN1YkVsZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAoc3ViRWxlLnJlc3VsdCAmJiBzdWJFbGUucmVzdWx0LmNvbnRlbnRcbiAgICAgICAgICAgICAgJiYgc3ViRWxlLnJlc3VsdC5jb250ZW50LmNoaWxkcmVuICYmIHN1YkVsZS5yZXN1bHQuY29udGVudC5jaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgZWxlWydjaGlsZHJlbiddID0gc3ViRWxlLnJlc3VsdC5jb250ZW50LmNoaWxkcmVuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldFRyYW5zY3JpcHRpb25EYXRhKGRhdGE6IGFueSkge1xuICAgIC8vICBjb25zb2xlLmxvZygnZGF0YS0tJywgZGF0YSlcbiAgICB0aGlzLnRyYW5zcmlwdGlvbkRhdGFTdWJqZWN0Lm5leHQoZGF0YSk7XG4gIH1cblxuICBzZXRBY3RpdmVTdWJ0aXRsZUxhbmd1YWdlKGFjdGl2ZUxhbmc6IGFueSkge1xuICAgIHRoaXMudHJhbnNyaXB0aW9uQWN0aXZlTGFuZ3VhZ2VEYXRhT2JqZWN0Lm5leHQoYWN0aXZlTGFuZylcbiAgfVxuXG5cblxuICBhaUdldFJlc291cmNlVnR0RmlsZShyZXNvdXJjZUlEOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KGAke0FQSV9FTkRfUE9JTlRTLkFJX1JFU09VUkNFX1ZUVF9GSUxFfT9yZXNvdXJjZV9pZD0ke3Jlc291cmNlSUR9YClcbiAgfVxuXG4gIHJlYWRQcmVFbnJvbGxtZW50UmVzb3VyY2VzU3RhdGUocmVxOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5odHRwXG4gICAgICAucG9zdChgJHtBUElfRU5EX1BPSU5UUy5QUkVfRU5ST0xMTUVOVF9TVEFURV9SRUFEfWAsIHJlcSlcbiAgfVxuXG4gIGNyZWF0ZUNvbnRlbnRWMihyZXF1ZXN0Qm9keTogYW55KSB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoXG4gICAgICAgIGAke0FQSV9FTkRfUE9JTlRTLkNSRUFURV9SRVNPVVJDRX1gLFxuICAgICAgICByZXF1ZXN0Qm9keSxcbiAgICAgIClcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIHJldHVybiBkYXRhLnJlc3VsdC5pZGVudGlmaWVyXG4gICAgICAgIH0pLFxuICAgICAgKVxuICB9XG5cblxuICB1cGxvYWRBc3NpZ25tZW50QW5zd2VyKGNvbnRlbnRJZDogc3RyaW5nLCBiYXRjaElkOiBzdHJpbmcsIGFzc2lnbm1lbnRJZDogc3RyaW5nLCBmaWxlOiBGaWxlKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsIGZpbGUsIGZpbGUubmFtZSlcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7QVBJX0VORF9QT0lOVFMuVVBMT0FEX0FTU0lHTk1FTlR9LyR7Y29udGVudElkfS8ke2JhdGNoSWR9LyR7YXNzaWdubWVudElkfWAsIGZvcm1EYXRhKTtcbiAgfVxuXG5cbiAgcmVhZENvbnRlbnRWMihpZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KFxuICAgICAgYCR7QVBJX0VORF9QT0lOVFMuUkVBRF9SRVNPVVJDRX1yZWFkLyR7aWR9P21vZGU9ZWRpdGAsXG4gICAgKS5waXBlKFxuICAgICAgbWFwKChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGRhdGEucmVzdWx0LmNvbnRlbnRcbiAgICAgIH0pXG4gICAgKVxuICB9XG5cbiAgdXBsb2FkKFxuICAgIGRhdGE6IEZvcm1EYXRhLFxuICAgIGNvbnRlbnREYXRhOiBhbnksXG4gICAgb3B0aW9ucz86IGFueSxcbiAgKTogT2JzZXJ2YWJsZTxhbnk+IHtcblxuICAgIGNvbnN0IGZpbGUgPSBkYXRhLmdldCgnY29udGVudCcpIGFzIEZpbGVcbiAgICBsZXQgZmlsZU5hbWUgPSBmaWxlLm5hbWVcbiAgICBpZiAoWydjaGFubmVsLmpzb24nXS5pbmRleE9mKGZpbGVOYW1lKSA8IDApIHtcbiAgICAgIGZpbGVOYW1lID0gdGhpcy5hcHBlbmRUb0ZpbGVuYW1lKGZpbGVOYW1lKVxuICAgIH1cbiAgICBjb25zdCBuZXdGb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgbmV3Rm9ybURhdGEuYXBwZW5kKCdkYXRhJywgZmlsZSwgZmlsZU5hbWUpXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0PGFueT4oXG4gICAgICBgJHtBUElfRU5EX1BPSU5UUy5VUExPQURfRklMRX11cGxvYWQvJHtjb250ZW50RGF0YS5jb250ZW50SWR9YCxcbiAgICAgIG5ld0Zvcm1EYXRhLFxuICAgICAgb3B0aW9uc1xuICAgIClcbiAgfVxuXG4gIGFwcGVuZFRvRmlsZW5hbWUoZmlsZW5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHRpbWVTdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgY29uc3QgZG90SW5kZXggPSBmaWxlbmFtZS5sYXN0SW5kZXhPZignLicpXG4gICAgaWYgKGRvdEluZGV4ID09PSAtMSkge1xuICAgICAgcmV0dXJuIGZpbGVuYW1lICsgdGltZVN0YW1wXG4gICAgfVxuICAgIHJldHVybiBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZG90SW5kZXgpICsgdGltZVN0YW1wICsgZmlsZW5hbWUuc3Vic3RyaW5nKGRvdEluZGV4KVxuICB9XG5cbiAgdXBkYXRlQ29udGVudFdpdGhGZXdGaWVsZHMocmVxdWVzdEJvZHk6IGFueSwgaWRlbnRpZmllcjogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBhdGNoPGFueT4oXG4gICAgICBgJHtBUElfRU5EX1BPSU5UUy5VUERBVEVfUkVTT1VSQ0V9LyR7aWRlbnRpZmllcn1gLFxuICAgICAgcmVxdWVzdEJvZHksXG4gICAgKVxuICB9XG5cbiAgc2VhcmNoQXNzaWdubWVudHMocmVxdWVzdDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoQVBJX0VORF9QT0lOVFMuU0VBUkNILCByZXF1ZXN0KVxuICB9XG5cbiAgc3VibWl0RHJhZnRBc3NpZ25tZW50KHJlcXVlc3Q6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wdXQoQVBJX0VORF9QT0lOVFMuU1VCTUlUX0RSQUZUX0FTU0lHTk1FTlQsIHJlcXVlc3QpXG4gIH1cblxuICBzdWJtaXRBc3NpZ25tZW50KHJlcXVlc3Q6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KEFQSV9FTkRfUE9JTlRTLlNVQk1JVF9BU1NJR05NRU5ULCByZXF1ZXN0KVxuICB9XG5cbiAgbm90aWZ5QXNzaWdubWVudFN1Ym1pc3Npb24ocGF5bG9hZDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoQVBJX0VORF9QT0lOVFMuTk9USUZZX0FTU0lHTk1FTlRfU1VCTUlTU0lPTiwgcGF5bG9hZClcbiAgfVxuXG4gIGdldEFzc2lnbm1lbnRTdGF0dXMocmVxdWVzdDogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QoYCR7QVBJX0VORF9QT0lOVFMuQVNTSUdOTUVOVF9TVEFUVVN9YCwgcmVxdWVzdClcbiAgfVxuXG4gIHJlYWRBc3NpZ25tZW50RmlsZShjb250ZW50SWQ6IHN0cmluZywgYmF0Y2hJZDogc3RyaW5nLCBhc3NpZ25tZW50SWQ6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgLy8gUHJvcGVybHkgZW5jb2RlIHRoZSBwYXJhbWV0ZXJzIHRvIGF2b2lkIG1hbGZvcm1lZCByZXF1ZXN0IGVycm9yc1xuICAgIGNvbnN0IGVuY29kZWRQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHtcbiAgICAgIGNvbnRlbnRJZDogY29udGVudElkIHx8ICcnLFxuICAgICAgYmF0Y2hJZDogYmF0Y2hJZCB8fCAnJyxcbiAgICAgIGZvcm1JZDogYXNzaWdubWVudElkIHx8ICcnLFxuICAgICAgZmlsZU5hbWU6IGZpbGVOYW1lIHx8ICcnXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5odHRwLmdldChgJHtBUElfRU5EX1BPSU5UUy5SRUFEX0FTU0lHTk1FTlR9PyR7ZW5jb2RlZFBhcmFtcy50b1N0cmluZygpfWAsIHtcbiAgICAgIHJlc3BvbnNlVHlwZTogJ2Jsb2InLFxuICAgICAgaGVhZGVyczoge1xuICAgICAgICAnQWNjZXB0JzogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSwgYXBwbGljYXRpb24vcGRmLCBhcHBsaWNhdGlvbi9tc3dvcmQsIGFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC53b3JkcHJvY2Vzc2luZ21sLmRvY3VtZW50J1xuICAgICAgfVxuICAgIH0pLnBpcGUoXG4gICAgICBjYXRjaEVycm9yKChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycm9yKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBtaWxlc3RvbmUgYWNoaWV2ZW1lbnRcbiAgICogQHBhcmFtIHVzZXJJZCBVc2VyIElEXG4gICAqIEBwYXJhbSBjb3Vyc2VJZCBDb3Vyc2UgaWRlbnRpZmllclxuICAgKiBAcGFyYW0gYmF0Y2hJZCBCYXRjaCBJRFxuICAgKiBAcGFyYW0gbWlsZXN0b25lSWQgTWlsZXN0b25lIGlkZW50aWZpZXIgKGUuZy4sICdtMScsICdtMicpXG4gICAqL1xuICBnZW5lcmF0ZU1pbGVzdG9uZUFjaGlldmVtZW50KHVzZXJJZDogc3RyaW5nLCBjb3Vyc2VJZDogc3RyaW5nLCBiYXRjaElkOiBzdHJpbmcsIG1pbGVzdG9uZUlkOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IGFwaVVybCA9ICcvYXBpcy9wcm94aWVzL3Y4L2FjaGlldmVtZW50L2R5bmFtaWMvdjEvZ2VuZXJhdGUnXG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBjb3Vyc2VJZCxcbiAgICAgICAgYmF0Y2hJZCxcbiAgICAgICAgbWlsZXN0b25lSWRcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaHR0cC5wb3N0KGFwaVVybCwgcmVxdWVzdClcbiAgfVxuXG59XG4iXX0=
|