@sunbird-cb/toc 0.0.33 → 0.0.35-mauritius

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.
@@ -83,7 +83,7 @@ export class AppTocHomeComponent {
83
83
  }
84
84
  constructor(route, router, contentSvc, tocSvc, loggerSvc, configSvc, domSanitizer, authAccessControlSvc, snackBar, dialog, mobileAppsSvc, utilitySvc,
85
85
  // private progressSvc: ContentProgressService,
86
- actionSVC, viewerSvc, ratingSvc, telemetryService, translate, langtranslations, events, matSnackBar, loadCheckService, handleClaimService, resetRatingsService, timerService, enrollSvc, contentLibSvc, dataTransferSvc, matSnackbarNew, userServiceLib, netCoreService, environment) {
86
+ actionSVC, viewerSvc, ratingSvc, telemetryService, translate, langtranslations, events, matSnackBar, loadCheckService, handleClaimService, resetRatingsService, timerService, enrollSvc, contentLibSvc, dataTransferSvc, matSnackbarNew, userServiceLib, netCoreService, domainConfService, environment) {
87
87
  this.route = route;
88
88
  this.router = router;
89
89
  this.contentSvc = contentSvc;
@@ -114,6 +114,7 @@ export class AppTocHomeComponent {
114
114
  this.matSnackbarNew = matSnackbarNew;
115
115
  this.userServiceLib = userServiceLib;
116
116
  this.netCoreService = netCoreService;
117
+ this.domainConfService = domainConfService;
117
118
  this.show = false;
118
119
  this.changeTab = false;
119
120
  this.skeletonLoader = true;
@@ -2199,13 +2200,13 @@ export class AppTocHomeComponent {
2199
2200
  console.log('Selected language:', lang);
2200
2201
  // Add your language change logic here
2201
2202
  }
2202
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocHomeComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.WidgetContentService }, { token: i3.AppTocService }, { token: i4.LoggerService }, { token: i4.ConfigurationsService }, { token: i5.DomSanitizer }, { token: i6.AccessControlService }, { token: i7.MatLegacySnackBar }, { token: i8.MatLegacyDialog }, { token: i9.MobileAppsService }, { token: i4.UtilityService }, { token: i10.ActionService }, { token: i11.ViewerUtilService }, { token: i12.RatingService }, { token: i4.TelemetryService }, { token: i13.TranslateService }, { token: i4.MultilingualTranslationsService }, { token: i4.EventService }, { token: i7.MatLegacySnackBar }, { token: i14.LoadCheckService }, { token: i15.HandleClaimService }, { token: i16.ResetRatingsService }, { token: i17.TimerService }, { token: i4.WidgetEnrollService }, { token: i18.WidgetContentLibService }, { token: i4.DataTransferService }, { token: i19.MatSnackBar }, { token: i18.WidgetUserServiceLib }, { token: i20.NetCoreService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component }); }
2203
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocHomeComponent, selector: "ws-app-app-toc-home", inputs: { forPreview: "forPreview" }, host: { listeners: { "window:scroll": "handleScroll($event)" } }, viewQueries: [{ propertyName: "menuElement", first: true, predicate: ["stickyMenu"], descendants: true, static: true }, { propertyName: "rcElement", first: true, predicate: ["rightContainer"], descendants: true }, { propertyName: "bannerElem", first: true, predicate: ["bannerDetails"], descendants: true, static: true }, { propertyName: "contentSource", first: true, predicate: ["contentSource"], descendants: true }], ngImport: i0, template: "<!-- \n Main Container - Displays course/content details with enrollment functionality\n Only displays content if courseID is available, otherwise shows \"not found\" message\n-->\n<ng-container *ngIf=\"courseID else noDataFound\">\n <!-- \n ENROLLMENT TEMPLATE - Handles all enrollment/start/resume button functionality\n Used in multiple places throughout the template\n -->\n <ng-template #enrollFunctionality>\n <div [hidden]=\"isResource && !content?.artifactUrl?.length\" class=\"flex flex-col gap-4 text-center\">\n <!-- SECTION: Regular course enrollment buttons -->\n <ng-container *ngIf=\"content?.primaryCategory !== primaryCategory.PROGRAM\n && content?.primaryCategory !== primaryCategory.CURATED_PROGRAM\n && content?.primaryCategory !== primaryCategory.STANDALONE_ASSESSMENT &&\n content?.primaryCategory !== primaryCategory.BLENDED_PROGRAM\">\n <!-- START/RESUME button for granted courses -->\n <ng-container *ngIf=\"(actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !(content?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 &&\n !content?.artifactUrl?.length) &&\n !(content?.primaryCategory === primaryCategory.COURSE && !batchData?.enrolled) &&\n !(content?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl) &&\n !(content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)) &&\n !(content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId)\">\n <a *ngIf=\"showStart.show && !isPostAssessment && !forPreview\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"(!content.completionPercentage || content.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData ? translateLabels('resume', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100 || certData\">\n {{ resumeData ? translateLabels('Start again', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n\n <!-- TAKE ASSESSMENT button (for post assessments) -->\n <button *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" (click)=\"raiseTelemetryForPublic()\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >{{ 'apptochome.takeAssessment' | translate }}</ng-container>\n </button>\n\n <!-- Commented karma points panel functionality -->\n </ng-container>\n \n <!-- ENROLL button for courses that require enrollment -->\n <ng-container *ngIf=\" (actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) && \n !( content?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 && !content?.artifactUrl?.length ) &&\n !( content?.primaryCategory === primaryCategory.COURSE && batchData?.enrolled ) &&\n !(content?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl)) &&\n !(content?.primaryCategory === primaryCategory.PROGRAM) &&\n !(content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)\">\n <ng-container *ngIf=\"content?.primaryCategory !== primaryCategory.RESOURCE && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\" (click)=\"handleAutoBatchAssign()\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL - Used across multiple sections -->\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: BLENDED_PROGRAM pre-enrollment functionality -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && !preAssessmentCompletionStatus\">\n <a class=\"flex action-button enroll-btn justify-center resume\" *ngIf=\"contentReadData?.preEnrolmentResources?.length\" (click)=\"routeToPreAssessent()\">\n <ng-container >\n {{ 'apptochome.preEnroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n \n <!-- SECTION: BLENDED_PROGRAM pre-enrollment completion message -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && preAssessmentCompletionStatus\">\n <a class=\"flex preenrolldone-btn justify-center resume\">\n <ng-container >\n {{ 'apptochome.preEnrollDone' | translate }}<img src=\"/assets/icons/Accept_icon.png\" alt=\"tick\" class=\"tick-icon\">\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: PROGRAM & MANDATORY_COURSE_GOAL handling -->\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.PROGRAM || content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL\">\n \n <!-- SECTION: Moderated program enrollment handling -->\n <ng-container *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && (contentReadData?.batches && !batchData?.enrolled)\">\n <ng-container *ngIf=\"((content?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && !contentReadData?.batches[0].endDate\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleAutoBatchAssign()\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >\n <!-- ENROLL BUTTON LABEL -->\n {{'apptochome.enroll' | translate}}\n </ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n <ng-container *ngIf=\"((content?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && contentReadData?.batches[0].endDate\">\n \n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" [analytics]=\"analytics\" (programEnrollCall)=\"programEnrollCall($event)\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: No batches message -->\n <ng-container *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && !contentReadData?.batches && !batchData?.enrolled && !enrollBtnLoading\">\n No Batches\n </ng-container>\n\n <!-- SECTION: Status messages for non-moderated programs -->\n <ng-container *ngIf=\"courseCategory?.MODERATED_PROGRAM !== contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container\n *ngIf=\"!(content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) && content?.primaryCategory !== primaryCategory.MANDATORY_COURSE_GOAL\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.youAreNotInvited' | translate }} </span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: Batch status messages for moderated programs -->\n <ng-container *ngIf=\"!isBatchInProgress && courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: In-progress batch with resume/start functionality -->\n <ng-container *ngIf=\"isBatchInProgress &&\n ( actionBtnStatus === 'grant' &&\n !(isMobile && content?.isInIntranet) &&\n (content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) ||\n (content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL && currentCourseBatchId)\n )\">\n <a *ngIf=\"showStart.show && !isPostAssessment\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content.completionPercentage || content.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100\">\n {{ resumeData || content.completionPercentage === 100 ? \"Start again\" : \"Start\" }}\n </ng-container>\n </a>\n <a *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >{{ 'apptochome.takeAssessment' | translate }}</ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: CURATED_PROGRAM in-progress handling -->\n <ng-container\n *ngIf=\"isBatchInProgress && (content?.primaryCategory === primaryCategory.CURATED_PROGRAM && batchData?.enrolled) && !enrollBtnLoading\">\n <a *ngIf=\"showStart.show && !isPostAssessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content.completionPercentage || content.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100\">\n {{ resumeData || content.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: Loading state for enrollment button -->\n <ng-container *ngIf=\"enrollBtnLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'36px'\"\n [bindingClass]=\"'flex rounded h-8'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <!-- SECTION: CURATED_PROGRAM enrollment button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.CURATED_PROGRAM && !batchData?.enrolled && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"(click)=\"handleAutoBatchAssign()\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL -->\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: STANDALONE_ASSESSMENT enrollment button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && content?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleAutoBatchAssign()\" *ngIf=\"!forPreview || isInIFrame\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL -->\n {{ 'apptochome.enroll' | translate }} \n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: INVITE-ONLY STANDALONE_ASSESSMENT message --> \n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && content?.courseCategory === 'Invite-Only Assessment'\">\n \n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewForInviteOnlyAssessment\" >\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.youAreNotInvitedForAssessment' | translate }} </span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: Enrolled INVITE-ONLY STANDALONE_ASSESSMENT take test button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && isBatchInProgress && !enrollBtnLoading && content?.courseCategory === 'Invite-Only Assessment'\"> \n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate }}</ng-container>\n <ng-container *ngIf=\"content.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: Status messages for INVITE-ONLY STANDALONE_ASSESSMENT -->\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA' && content?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA' && content?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n \n <!-- SECTION: Regular STANDALONE_ASSESSMENT enrolled take test button -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && !enrollBtnLoading && content?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate }}</ng-container>\n <ng-container *ngIf=\"content.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: BLENDED_PROGRAM workflow status -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <!-- Review status message -->\n <ng-container *ngIf=\"batchData?.workFlow?.wfInitiated &&\n !(batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN)\">\n <div class=\"ws-mat-accent-text ws-mat-accent-light-bg flex items-center justify-center statusMsg\">\n <p class=\"margin-remove-bottom font-bold\">\n {{ 'apptochome.requestUnderReview' | translate }}\n </p>\n </div>\n </ng-container>\n\n <!-- Approved BLENDED_PROGRAM start/resume button -->\n <ng-container>\n <a\n *ngIf=\"showStart.show && batchData?.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED\"\n [routerLink]=\"isBatchInProgress? (resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url : '' \" (click)=\"raiseTelemetryForPublic()\"\n [queryParams]=\"isBatchInProgress ? (resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START') : '' \"\n class=\"flex action-button justify-center resume\" [ngClass]=\"{'disable-start-btn': !isBatchInProgress}\">\n <ng-container *ngIf=\"(!content.completionPercentage || content.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100 || certData\">\n {{ resumeData || content.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') : translateLabels('start', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: External registration link -->\n <ng-container *ngIf=\"actionBtnStatus == 'reject' && content?.registrationUrl\">\n <a [href]=\"content?.registrationUrl\" target=\"_blank\" class=\"flex action-button justify-center\" >{{ 'apptochome.register' | translate }}</a>\n </ng-container>\n\n </div>\n </ng-template>\n\n <!-- \n PROGRESS FUNCTIONALITY TEMPLATE\n Displays progress bar and rating button functionality\n -->\n <ng-template #progressFunctionality>\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row gap-4 text-sm\">\n <div class=\"flex-1 text-xs\">{{ 'apptocsinglepage.overallProgress' | translate }}</div>\n <div class=\"text-xs\" *ngIf=\"content?.completionPercentage > 0\"> {{ content?.completionPercentage }} %</div>\n </div>\n <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" [progress]=\"content?.completionPercentage\" [progressType]=\"'percentage'\"\n [customClassName]=\"'content-progress'\" >\n </ws-widget-content-progress>\n </div>\n </div>\n\n <ng-container *ngIf=\"content?.completionPercentage >= 50\">\n <button mat-stroked-button color=\"accent\" type=\"button\" class=\"rate-button\" (click)=\"openFeedbackDialog(content)\">\n <mat-icon class=\"nodtranslate\">star_purple500</mat-icon>\n <ng-container *ngIf=\"!userRating\">\n <div>{{ 'apptocsinglepage.rateNow' | translate }}</div>\n </ng-container>\n <ng-container *ngIf=\"userRating\">\n <div>{{ 'apptocsinglepage.editRating' | translate }}</div>\n </ng-container>\n </button>\n </ng-container>\n </div>\n </ng-template>\n\n <!-- \n MAIN CONTENT DISPLAY SECTION\n Banner, details, and content layout\n -->\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\" [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{ translateLabel(content?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n \n <div class=\"flex items-center\" *ngIf=\"cbPlanEndDate\">\n <div class=\"flex items-center due-tag text-xs leading-3\" [ngClass]=\"{'due-warning': cbPlanDuration === nsCardContentData.UPCOMING, 'due-overdue': cbPlanDuration === nsCardContentData.OVERDUE, 'due-success': cbPlanDuration === nsCardContentData.SUCCESS}\" >\n {{ 'common.dueBy' | translate }} - &nbsp;<span class=\"font-bold\">{{ cbPlanEndDate | date: 'd MMM, y'}}</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex items-center text-white mob-share\" *ngIf=\"canShare\">\n <mat-icon class=\"nodtranslate\" (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold nodtranslate\">{{ handleCapitalize(content?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words nodtranslate\" #contentSource [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">{{ 'cardcontentv2.by' | translate }} {{ content?.source }}</div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex gap-4 items-center\" *ngIf=\"content?.averageRating || content?.additionalTags?.length\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\" (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon class=\"nodtranslate\">grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}</div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' | translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' | translate }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && content?.sYS_INTERNAL_LAST_UPDATED_ON\">\n <div class=\"text-xs leading-4 source-text nodtranslate\">({{ 'apptoc.lastUpdatedOn' | translate }} {{ content?.sYS_INTERNAL_LAST_UPDATED_ON | date: 'MMM d, y' }})</div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\">\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM &&\n selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails &&\n selectedBatchData?.content[0]?.enrollmentEndDate\">\n <div class=\"location-details mt-6\">\n <div class=\"flex items-center gap-4 pb-3\">\n <mat-icon class=\"location-icon nodtranslate\">\n location_on\n </mat-icon>\n <div class=\"loc-desc\">\n {{selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n <div class=\"flex items-center gap-4\">\n <mat-icon class=\"event-icon nodtranslate\">\n event</mat-icon>\n <div class=\"loc-desc\">\n Last date of enrollment - {{selectedBatchData?.content[0]?.enrollmentEndDate | date: 'dd/MM/yyyy'}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"recommendedCoursesId && !feedbackGiven\">\n <div class=\"px-4 py-3 mt-6 relevent-wrapper\">\n <div class=\"flex gap-4 items-center flex-wrap flex justify-center md:justify-start\">\n <img src=\"/assets/images/sakshamAI/lady-greet.svg\" alt=\"greet\" width=\"56.89\" height=\"64\">\n <div class=\"relevent-info\">\n <span class=\"font-bolder text-sm relevent-heading block mb-1\">{{ 'home.tocReleventHeading' | translate }}</span>\n <span class=\"relevent-subinfo font-normal text-sm block\">{{ 'home.tocReleventSubHeading' | translate }}</span>\n </div>\n <div class=\"flex flex-middle relevant-container\">\n <div class=\"flex flex-middle relevent-normal relevent-btn py-2 px-4 relevant-box\"\n (mouseenter)=\"isReleventBtnHovered = true\"\n (mouseleave)=\"isReleventBtnHovered = false\" (click)=\"handleAcceptRelevent()\">\n <img\n [src]=\"isReleventBtnHovered && !isRelevent ? SAKSHAMAI_ICON_LOADER : SAKSHAMAI_ICON_NORMAL\"\n alt=\"loader\" width=\"16\" height=\"16\" class=\"mr-2\">\n <span class=\"text-relevent ff-lato text-sm font-bold\">{{ 'home.relevent' | translate }}</span>\n </div>\n \n <div class=\"flex flex-middle no-button ml-8\" (click)=\"handleDeclineRelevent()\">\n <mat-icon class=\"mat-icon text-no mr-1 nodtranslate\">thumb_down</mat-icon>\n <span class=\"text-no ff-lato text-sm font-bold\">{{ 'home.no' | translate }}</span>\n </div> \n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"pb-4 lg:py-4\">\n <!-- Overall progress functionality -->\n <div class=\"mobile-progress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </div>\n <!-- Overall progress functionality -->\n\n <ws-widget-content-toc [content]=\"content\" [componentName]=\"'toc'\" [pathSet]=\"pathSet\" [tocStructure]=\"tocStructure\" \n [forPreview]=\"forPreview\" [isEnrolled]=\"batchData?.enrolled\" [resumeData]=\"resumeData\" [batchData]=\"selectedBatchData\" [skeletonLoader]=\"skeletonLoader\" \n [changeTab]=\"changeTab\" [hierarchyMapData]=\"tocSvc?.hashmap\" [selectedBatchData]=\"selectedBatchData\" [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\" [kparray]=\"kparray\"\n (playResumeForAI)=\"playResumeForAI()\" (enrollUserToAI)=\"enrollUserToAI()\" [contentReadData]=\"contentReadData\"></ws-widget-content-toc>\n <div class=\"mob-tip-for-learner\">\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n </div>\n </div>\n \n\n <div class=\"right-container\" >\n <!-- if needed sticky of right container add this to below div => #rightContainer -->\n <div class=\"right-content\">\n <div class=\"right-content-inner\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\" [ngStyle]=\"{\n 'background-image': 'url(' + content?.posterImage + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\" [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-between\" [ngClass]=\"{'justify-between': scrolled, 'justify-end': !scrolled}\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\" *ngIf=\"scrolled\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ translateLabel(content?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div (click)=\"onClickOfShare()\" class=\"flex flex-row items-center justify-end gap-2 share-tag\" *ngIf=\"canShare && !forPreview\">\n <mat-icon class=\"nodtranslate\">share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold\">{{ handleCapitalize(content?.name) }}\n </div>\n <div class=\"text-sm source-text font-semibold break-words\" #contentSource [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">{{ 'cardcontentv2.by' | translate }} {{ content?.source }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-col gap-4 p-5 border-bottom\">\n <div class=\"flex flex-col gap-4\" *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n <ng-container *ngIf=\"timer && timer.days >= 0 && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 batch-timer\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container *ngIf=\"!mobile1200 && preAssessmentCompletionStatus\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\" [analytics]=\"analytics\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'68px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"content?.isInIntranet && showIntranetMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>\n <ng-container >{{ 'apptochome.viewedInIntranet' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showInstructorLedMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container >{{ 'apptochome.notAvailableOnline' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showStart.msg === 'youtubeForbidden'\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container >{{ 'apptochome.youtubeContentBlocked' | translate }}</ng-container>\n </div>\n <div *ngIf=\"showBtn\">\n <a href=\"{{ cscmsUrl }}\" target=\"_blank\" class=\"flex action-button justify-center\">\n {{ 'apptochome.applyForPhysicalTraining' | translate }}</a>\n </div>\n\n <!-- Overall progress functionality -->\n <ng-container *ngIf=\"content?.completionStatus <= 2 && isBatchInProgress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </ng-container>\n <!-- Overall progress functionality -->\n\n <!-- <div *ngIf=\"resumeData && !userRating\"> -->\n <!-- <ws-app-karmapoints-panel [btntype]=\"'Rate this course'\" [data]=\"kparray\"\n [pCategory]=\"content?.primaryCategory\"></ws-app-karmapoints-panel> -->\n <!-- </div> -->\n\n <!-- <div *ngIf=\"resumeData && userRating\">\n <ws-app-karmapoints-panel [btntype]=\"'Edit rating'\" [data]=\"kparray\"\n [pCategory]=\"content?.primaryCategory\"></ws-app-karmapoints-panel>\n </div> -->\n\n <ng-container *ngIf=\"actionBtnStatus !== 'wait' && content?.status !== 'Deleted' && content?.status !== 'Expired'\">\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </ng-container>\n </div>\n\n <div class=\"karma-points-div\">\n <ws-widget-karma-points [data]=\"kparray\" (clickClaimKarmaPoints)=\"onClickOfClaim($event)\" [content] = \"content\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"></ws-widget-karma-points>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-wrap gap-6\">\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'40px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\" [showInstructorLedMsg]=\"showInstructorLedMsg\" [contentReadData]=\"contentReadData\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col gap-8 p-5\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\" [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorDetails)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authors' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\" [photoUrl]=\"author?.photo || ''\"\n [name]=\"author?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n </div>\n <!-- <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(content?.creatorContacts)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.curators' | translate }}</div>\n <div class=\"flex flex-row gap-4\" *ngFor=\"let creator of handleParseJsonData(content?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\" [photoUrl]=\"author?.photo || ''\"\n [name]=\"creator?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creator?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.curator' | translate }}</div>\n </div>\n </div>\n </div> -->\n <div class=\"flex flex-col gap-3\" *ngIf=\"content?.source && (contentCreatorData && contentCreatorData?.length)\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let creator of contentCreatorData\">\n <div class=\"flex provider-logo-div\">\n <img *ngIf=\"content?.creatorLogo\" [src]=\"content?.creatorLogo\" alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!content?.creatorLogo\" class=\"mat-icon\" src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\" alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm word-break cursor-pointer\" *ngIf=\"content?.createdFor?.length\" (click)=\"raiseTelemeteryForProvider(content?.source, content?.createdFor[0])\"\n [routerLink]=\"['/app/learn/browse-by/provider', content?.source, content?.createdFor[0], 'micro-sites']\">{{ handleCapitalize(content?.source, 'source') }}\n </div>\n <div class=\"text-sm word-break\" *ngIf=\"!content?.createdFor?.length\">{{ handleCapitalize(content?.source, 'source') }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n\n \n\n </div>\n</div>\n\n <!-- Mobile enrollment button container -->\n <div class=\"mobile-enroll-div\" [ngClass]=\"{'bg-white': content?.primaryCategory === primaryCategory.BLENDED_PROGRAM }\">\n <ng-container *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM \">\n <div class=\"mb-2\" *ngIf=\"mobile1200 && !forPreview || isInIFrame; else authViewBtn\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\" [analytics]=\"analytics\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </div>\n </ng-container>\n <!-- Reuse enrollment functionality template for mobile -->\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </div>\n\n <ws-app-share-toc *ngIf=\"enableShare\" [rootOrgId]=\"rootOrgId\" [content]=\"content\" (resetEnableShare)=\"resetEnableShare($event)\"></ws-app-share-toc>\n</ng-container>\n\n<!-- Template for when no data is found -->\n<ng-template #noDataFound>\n <div class=\"error-not-found flex flex-wrapped margin-left-m margin-top-xl margin-right-m flex-col justify-center align-items-center text-center\">\n <div class=\"error-logo\">\n <div class=\"error-message ws-mat-primary-text font-weight-bold\" >\n The page you requested cannot be found\n </div>\n </div>\n </div>\n</ng-template>\n\n<!-- Authentication view templates -->\n<ng-template #authView>{{'apptochome.view' | translate}}</ng-template>\n\n<ng-template #authViewBtn i18n>\n <a (click)=\"raiseTelemetryForPublic()\" [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\" [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n {{'apptochome.view' | translate}}\n </a>\n</ng-template>\n\n<ng-template #authViewForInviteOnlyAssessment>\n <ng-container\n *ngIf=\"forPreview && content?.courseCategory === 'Invite-Only Assessment'\"> \n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"> \n <ng-container>{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n</ng-template>\n", styles: [".source-text{color:#ffffffb3}.preenrolldone-btn{opacity:1;color:#1d8923;font-family:Lato-Bold,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:2px solid #1D8923;cursor:pointer;height:40px;box-sizing:border-box}.preenrolldone-btn img{margin-left:8px;margin-top:-2px}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{position:absolute;z-index:10;top:132px;padding-bottom:1rem}.right-container .right-content-inner{background-color:#fff;border-radius:12px;width:384px;margin-bottom:1rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.right-container .view-more:hover{background-color:#dcdfe5}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#000000de;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.mob-tip-for-learner{display:none}@media screen and (max-width: 1000px){.mob-tip-for-learner{display:block;width:100%;padding:0 16px;overflow:hidden;box-sizing:border-box}}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto;box-sizing:border-box;height:40px;line-height:24px!important}.rate-button{color:#000000de!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button,.mobile-enroll-div .preenrolldone-btn{min-width:320px;max-width:400px;margin:auto}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#0074b6!important}.tab:focus{outline:1px solid!important}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.blue-border{border:2px solid #0074b6!important}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}.location-details{background-color:#1b4ca114;padding:16px;border-radius:4px}.location-details .location-icon,.location-details .event-icon{color:#1b4ca1;height:20px;width:14px;font-size:22px}.location-details .loc-desc{font-family:Lato;font-weight:700;font-size:14px;line-height:20px;letter-spacing:.25}.location-details .mat-icon{overflow:visible!important}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.relevent-wrapper{background:#1b4ca129;border-radius:12px}.relevent-wrapper .relevent-info{max-width:400px;margin-right:auto}.relevent-wrapper .relevent-info .relevent-heading{font-family:Montserrat;line-height:17.07px;font-weight:600;color:#000!important}.relevent-wrapper .relevent-info .relevent-subinfo{font-family:Lato;line-height:16.8px;color:#545454}.relevent-normal.relevent-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#276de5;background-color:#fff;border-radius:21px;text-decoration:none;overflow:hidden;transition:all .3s ease-in-out}.relevent-normal.relevent-btn:hover{box-shadow:0 1px 10px #276de599}.relevent-normal.relevent-btn{cursor:pointer}.relevent-normal.relevent-btn:before{content:\"\";position:absolute;inset:0;padding:2px 2.5px;border-radius:21px;background:linear-gradient(89.96deg,#f3962f .04%,#276de5 99.96%);-webkit-mask:linear-gradient(white,white) content-box,linear-gradient(white,white);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease-in-out;cursor:pointer}.relevent-normal.relevent-btn:hover:before{opacity:1}.relevant-container{width:max-content}.no-button{opacity:1;transform:scale(1);transition:opacity .3s ease-in-out,transform .3s ease-in-out;color:#1b4ca1;cursor:pointer}\n"], encapsulation: i0.ViewEncapsulation.None }); }
2203
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocHomeComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.WidgetContentService }, { token: i3.AppTocService }, { token: i4.LoggerService }, { token: i4.ConfigurationsService }, { token: i5.DomSanitizer }, { token: i6.AccessControlService }, { token: i7.MatLegacySnackBar }, { token: i8.MatLegacyDialog }, { token: i9.MobileAppsService }, { token: i4.UtilityService }, { token: i10.ActionService }, { token: i11.ViewerUtilService }, { token: i12.RatingService }, { token: i4.TelemetryService }, { token: i13.TranslateService }, { token: i4.MultilingualTranslationsService }, { token: i4.EventService }, { token: i7.MatLegacySnackBar }, { token: i14.LoadCheckService }, { token: i15.HandleClaimService }, { token: i16.ResetRatingsService }, { token: i17.TimerService }, { token: i4.WidgetEnrollService }, { token: i18.WidgetContentLibService }, { token: i4.DataTransferService }, { token: i19.MatSnackBar }, { token: i18.WidgetUserServiceLib }, { token: i20.NetCoreService }, { token: i4.DomainConfService }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component }); }
2204
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocHomeComponent, selector: "ws-app-app-toc-home", inputs: { forPreview: "forPreview" }, host: { listeners: { "window:scroll": "handleScroll($event)" } }, viewQueries: [{ propertyName: "menuElement", first: true, predicate: ["stickyMenu"], descendants: true, static: true }, { propertyName: "rcElement", first: true, predicate: ["rightContainer"], descendants: true }, { propertyName: "bannerElem", first: true, predicate: ["bannerDetails"], descendants: true, static: true }, { propertyName: "contentSource", first: true, predicate: ["contentSource"], descendants: true }], ngImport: i0, template: "<!-- \n Main Container - Displays course/content details with enrollment functionality\n Only displays content if courseID is available, otherwise shows \"not found\" message\n-->\n<ng-container *ngIf=\"courseID else noDataFound\">\n <!-- \n ENROLLMENT TEMPLATE - Handles all enrollment/start/resume button functionality\n Used in multiple places throughout the template\n -->\n <ng-template #enrollFunctionality>\n <div [hidden]=\"isResource && !content?.artifactUrl?.length\" class=\"flex flex-col gap-4 text-center\">\n <!-- SECTION: Regular course enrollment buttons -->\n <ng-container *ngIf=\"content?.primaryCategory !== primaryCategory.PROGRAM\n && content?.primaryCategory !== primaryCategory.CURATED_PROGRAM\n && content?.primaryCategory !== primaryCategory.STANDALONE_ASSESSMENT &&\n content?.primaryCategory !== primaryCategory.BLENDED_PROGRAM\">\n <!-- START/RESUME button for granted courses -->\n <ng-container *ngIf=\"(actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !(content?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 &&\n !content?.artifactUrl?.length) &&\n !(content?.primaryCategory === primaryCategory.COURSE && !batchData?.enrolled) &&\n !(content?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl) &&\n !(content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)) &&\n !(content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId)\">\n <a *ngIf=\"showStart.show && !isPostAssessment && !forPreview\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"(!content.completionPercentage || content.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData ? translateLabels('resume', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100 || certData\">\n {{ resumeData ? translateLabels('Start again', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n\n <!-- TAKE ASSESSMENT button (for post assessments) -->\n <button *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" (click)=\"raiseTelemetryForPublic()\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >{{ 'apptochome.takeAssessment' | translate }}</ng-container>\n </button>\n\n <!-- Commented karma points panel functionality -->\n </ng-container>\n \n <!-- ENROLL button for courses that require enrollment -->\n <ng-container *ngIf=\" (actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) && \n !( content?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 && !content?.artifactUrl?.length ) &&\n !( content?.primaryCategory === primaryCategory.COURSE && batchData?.enrolled ) &&\n !(content?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl)) &&\n !(content?.primaryCategory === primaryCategory.PROGRAM) &&\n !(content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)\">\n <ng-container *ngIf=\"content?.primaryCategory !== primaryCategory.RESOURCE && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\" (click)=\"handleAutoBatchAssign()\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL - Used across multiple sections -->\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: BLENDED_PROGRAM pre-enrollment functionality -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && !preAssessmentCompletionStatus\">\n <a class=\"flex action-button enroll-btn justify-center resume\" *ngIf=\"contentReadData?.preEnrolmentResources?.length\" (click)=\"routeToPreAssessent()\">\n <ng-container >\n {{ 'apptochome.preEnroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n \n <!-- SECTION: BLENDED_PROGRAM pre-enrollment completion message -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && preAssessmentCompletionStatus\">\n <a class=\"flex preenrolldone-btn justify-center resume\">\n <ng-container >\n {{ 'apptochome.preEnrollDone' | translate }}<img src=\"/assets/icons/Accept_icon.png\" alt=\"tick\" class=\"tick-icon\">\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: PROGRAM & MANDATORY_COURSE_GOAL handling -->\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.PROGRAM || content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL\">\n \n <!-- SECTION: Moderated program enrollment handling -->\n <ng-container *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && (contentReadData?.batches && !batchData?.enrolled)\">\n <ng-container *ngIf=\"((content?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && !contentReadData?.batches[0].endDate\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleAutoBatchAssign()\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >\n <!-- ENROLL BUTTON LABEL -->\n {{'apptochome.enroll' | translate}}\n </ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n <ng-container *ngIf=\"((content?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && contentReadData?.batches[0].endDate\">\n \n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" [analytics]=\"analytics\" (programEnrollCall)=\"programEnrollCall($event)\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: No batches message -->\n <ng-container *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && !contentReadData?.batches && !batchData?.enrolled && !enrollBtnLoading\">\n No Batches\n </ng-container>\n\n <!-- SECTION: Status messages for non-moderated programs -->\n <ng-container *ngIf=\"courseCategory?.MODERATED_PROGRAM !== contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container\n *ngIf=\"!(content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) && content?.primaryCategory !== primaryCategory.MANDATORY_COURSE_GOAL\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.youAreNotInvited' | translate }} </span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: Batch status messages for moderated programs -->\n <ng-container *ngIf=\"!isBatchInProgress && courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: In-progress batch with resume/start functionality -->\n <ng-container *ngIf=\"isBatchInProgress &&\n ( actionBtnStatus === 'grant' &&\n !(isMobile && content?.isInIntranet) &&\n (content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) ||\n (content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL && currentCourseBatchId)\n )\">\n <a *ngIf=\"showStart.show && !isPostAssessment\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content.completionPercentage || content.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100\">\n {{ resumeData || content.completionPercentage === 100 ? \"Start again\" : \"Start\" }}\n </ng-container>\n </a>\n <a *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >{{ 'apptochome.takeAssessment' | translate }}</ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: CURATED_PROGRAM in-progress handling -->\n <ng-container\n *ngIf=\"isBatchInProgress && (content?.primaryCategory === primaryCategory.CURATED_PROGRAM && batchData?.enrolled) && !enrollBtnLoading\">\n <a *ngIf=\"showStart.show && !isPostAssessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content.completionPercentage || content.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100\">\n {{ resumeData || content.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: Loading state for enrollment button -->\n <ng-container *ngIf=\"enrollBtnLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'36px'\"\n [bindingClass]=\"'flex rounded h-8'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <!-- SECTION: CURATED_PROGRAM enrollment button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.CURATED_PROGRAM && !batchData?.enrolled && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"(click)=\"handleAutoBatchAssign()\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL -->\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: STANDALONE_ASSESSMENT enrollment button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && content?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleAutoBatchAssign()\" *ngIf=\"!forPreview || isInIFrame\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL -->\n {{ 'apptochome.enroll' | translate }} \n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: INVITE-ONLY STANDALONE_ASSESSMENT message --> \n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && content?.courseCategory === 'Invite-Only Assessment'\">\n \n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewForInviteOnlyAssessment\" >\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.youAreNotInvitedForAssessment' | translate }} </span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: Enrolled INVITE-ONLY STANDALONE_ASSESSMENT take test button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && isBatchInProgress && !enrollBtnLoading && content?.courseCategory === 'Invite-Only Assessment'\"> \n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate }}</ng-container>\n <ng-container *ngIf=\"content.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: Status messages for INVITE-ONLY STANDALONE_ASSESSMENT -->\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA' && content?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA' && content?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n \n <!-- SECTION: Regular STANDALONE_ASSESSMENT enrolled take test button -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && !enrollBtnLoading && content?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate }}</ng-container>\n <ng-container *ngIf=\"content.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: BLENDED_PROGRAM workflow status -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <!-- Review status message -->\n <ng-container *ngIf=\"batchData?.workFlow?.wfInitiated &&\n !(batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN)\">\n <div class=\"ws-mat-accent-text ws-mat-accent-light-bg flex items-center justify-center statusMsg\">\n <p class=\"margin-remove-bottom font-bold\">\n {{ 'apptochome.requestUnderReview' | translate }}\n </p>\n </div>\n </ng-container>\n\n <!-- Approved BLENDED_PROGRAM start/resume button -->\n <ng-container>\n <a\n *ngIf=\"showStart.show && batchData?.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED\"\n [routerLink]=\"isBatchInProgress? (resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url : '' \" (click)=\"raiseTelemetryForPublic()\"\n [queryParams]=\"isBatchInProgress ? (resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START') : '' \"\n class=\"flex action-button justify-center resume\" [ngClass]=\"{'disable-start-btn': !isBatchInProgress}\">\n <ng-container *ngIf=\"(!content.completionPercentage || content.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100 || certData\">\n {{ resumeData || content.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') : translateLabels('start', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: External registration link -->\n <ng-container *ngIf=\"actionBtnStatus == 'reject' && content?.registrationUrl\">\n <a [href]=\"content?.registrationUrl\" target=\"_blank\" class=\"flex action-button justify-center\" >{{ 'apptochome.register' | translate }}</a>\n </ng-container>\n\n </div>\n </ng-template>\n\n <!-- \n PROGRESS FUNCTIONALITY TEMPLATE\n Displays progress bar and rating button functionality\n -->\n <ng-template #progressFunctionality>\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row gap-4 text-sm\">\n <div class=\"flex-1 text-xs\">{{ 'apptocsinglepage.overallProgress' | translate }}</div>\n <div class=\"text-xs\" *ngIf=\"content?.completionPercentage > 0\"> {{ content?.completionPercentage }} %</div>\n </div>\n <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" [progress]=\"content?.completionPercentage\" [progressType]=\"'percentage'\"\n [customClassName]=\"'content-progress'\" >\n </ws-widget-content-progress>\n </div>\n </div>\n\n <ng-container *ngIf=\"content?.completionPercentage >= 50\">\n <button mat-stroked-button color=\"accent\" type=\"button\" class=\"rate-button\" (click)=\"openFeedbackDialog(content)\">\n <mat-icon class=\"nodtranslate\">star_purple500</mat-icon>\n <ng-container *ngIf=\"!userRating\">\n <div>{{ 'apptocsinglepage.rateNow' | translate }}</div>\n </ng-container>\n <ng-container *ngIf=\"userRating\">\n <div>{{ 'apptocsinglepage.editRating' | translate }}</div>\n </ng-container>\n </button>\n </ng-container>\n </div>\n </ng-template>\n\n <!-- \n MAIN CONTENT DISPLAY SECTION\n Banner, details, and content layout\n -->\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\" [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{ translateLabel(content?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n \n <div class=\"flex items-center\" *ngIf=\"cbPlanEndDate\">\n <div class=\"flex items-center due-tag text-xs leading-3\" [ngClass]=\"{'due-warning': cbPlanDuration === nsCardContentData.UPCOMING, 'due-overdue': cbPlanDuration === nsCardContentData.OVERDUE, 'due-success': cbPlanDuration === nsCardContentData.SUCCESS}\" >\n {{ 'common.dueBy' | translate }} - &nbsp;<span class=\"font-bold\">{{ cbPlanEndDate | date: 'd MMM, y'}}</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex items-center text-white mob-share\" *ngIf=\"canShare\">\n <mat-icon class=\"nodtranslate\" (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold nodtranslate\">{{ handleCapitalize(content?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words nodtranslate\" #contentSource [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">{{ 'cardcontentv2.by' | translate }} {{ content?.source }}</div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex gap-4 items-center\" *ngIf=\"content?.averageRating || content?.additionalTags?.length\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\" (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon class=\"nodtranslate\">grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}</div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' | translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' | translate }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && content?.sYS_INTERNAL_LAST_UPDATED_ON\">\n <div class=\"text-xs leading-4 source-text nodtranslate\">({{ 'apptoc.lastUpdatedOn' | translate }} {{ content?.sYS_INTERNAL_LAST_UPDATED_ON | date: 'MMM d, y' }})</div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\">\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM &&\n selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails &&\n selectedBatchData?.content[0]?.enrollmentEndDate\">\n <div class=\"location-details mt-6\">\n <div class=\"flex items-center gap-4 pb-3\">\n <mat-icon class=\"location-icon nodtranslate\">\n location_on\n </mat-icon>\n <div class=\"loc-desc\">\n {{selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n <div class=\"flex items-center gap-4\">\n <mat-icon class=\"event-icon nodtranslate\">\n event</mat-icon>\n <div class=\"loc-desc\">\n Last date of enrollment - {{selectedBatchData?.content[0]?.enrollmentEndDate | date: 'dd/MM/yyyy'}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"recommendedCoursesId && !feedbackGiven\">\n <div class=\"px-4 py-3 mt-6 relevent-wrapper\">\n <div class=\"flex gap-4 items-center flex-wrap flex justify-center md:justify-start\">\n <img src=\"/assets/images/sakshamAI/lady-greet.svg\" alt=\"greet\" width=\"56.89\" height=\"64\">\n <div class=\"relevent-info\">\n <span class=\"font-bolder text-sm relevent-heading block mb-1\">{{ 'home.tocReleventHeading' | translate }}</span>\n <span class=\"relevent-subinfo font-normal text-sm block\">{{ 'home.tocReleventSubHeading' | translate }}</span>\n </div>\n <div class=\"flex flex-middle relevant-container\">\n <div class=\"flex flex-middle relevent-normal relevent-btn py-2 px-4 relevant-box\"\n (mouseenter)=\"isReleventBtnHovered = true\"\n (mouseleave)=\"isReleventBtnHovered = false\" (click)=\"handleAcceptRelevent()\">\n <img\n [src]=\"isReleventBtnHovered && !isRelevent ? SAKSHAMAI_ICON_LOADER : SAKSHAMAI_ICON_NORMAL\"\n alt=\"loader\" width=\"16\" height=\"16\" class=\"mr-2\">\n <span class=\"text-relevent ff-lato text-sm font-bold\">{{ 'home.relevent' | translate }}</span>\n </div>\n \n <div class=\"flex flex-middle no-button ml-8\" (click)=\"handleDeclineRelevent()\">\n <mat-icon class=\"mat-icon text-no mr-1 nodtranslate\">thumb_down</mat-icon>\n <span class=\"text-no ff-lato text-sm font-bold\">{{ 'home.no' | translate }}</span>\n </div> \n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"pb-4 lg:py-4\">\n <!-- Overall progress functionality -->\n <div class=\"mobile-progress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </div>\n <!-- Overall progress functionality -->\n\n <ws-widget-content-toc [content]=\"content\" [componentName]=\"'toc'\" [pathSet]=\"pathSet\" [tocStructure]=\"tocStructure\" \n [forPreview]=\"forPreview\" [isEnrolled]=\"batchData?.enrolled\" [resumeData]=\"resumeData\" [batchData]=\"selectedBatchData\" [skeletonLoader]=\"skeletonLoader\" \n [changeTab]=\"changeTab\" [hierarchyMapData]=\"tocSvc?.hashmap\" [selectedBatchData]=\"selectedBatchData\" [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\" [kparray]=\"kparray\"\n (playResumeForAI)=\"playResumeForAI()\" (enrollUserToAI)=\"enrollUserToAI()\" [contentReadData]=\"contentReadData\"></ws-widget-content-toc>\n <div class=\"mob-tip-for-learner\">\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n </div>\n </div>\n \n\n <div class=\"right-container\" >\n <!-- if needed sticky of right container add this to below div => #rightContainer -->\n <div class=\"right-content\">\n <div class=\"right-content-inner\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\" [ngStyle]=\"{\n 'background-image': 'url(' + content?.posterImage + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\" [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-between\" [ngClass]=\"{'justify-between': scrolled, 'justify-end': !scrolled}\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\" *ngIf=\"scrolled\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ translateLabel(content?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div (click)=\"onClickOfShare()\" class=\"flex flex-row items-center justify-end gap-2 share-tag\" *ngIf=\"canShare && !forPreview && (domainConfService?.isFeatureByPageEnabled('toc','shareToc'))\">\n <mat-icon class=\"nodtranslate\">share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold\">{{ handleCapitalize(content?.name) }}\n </div>\n <div class=\"text-sm source-text font-semibold break-words\" #contentSource [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">{{ 'cardcontentv2.by' | translate }} {{ content?.source }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-col gap-4 p-5 border-bottom\">\n <div class=\"flex flex-col gap-4\" *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n <ng-container *ngIf=\"timer && timer.days >= 0 && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 batch-timer\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container *ngIf=\"!mobile1200 && preAssessmentCompletionStatus\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\" [analytics]=\"analytics\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'68px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"content?.isInIntranet && showIntranetMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>\n <ng-container >{{ 'apptochome.viewedInIntranet' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showInstructorLedMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container >{{ 'apptochome.notAvailableOnline' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showStart.msg === 'youtubeForbidden'\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container >{{ 'apptochome.youtubeContentBlocked' | translate }}</ng-container>\n </div>\n <div *ngIf=\"showBtn\">\n <a href=\"{{ cscmsUrl }}\" target=\"_blank\" class=\"flex action-button justify-center\">\n {{ 'apptochome.applyForPhysicalTraining' | translate }}</a>\n </div>\n\n <!-- Overall progress functionality -->\n <ng-container *ngIf=\"content?.completionStatus <= 2 && isBatchInProgress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </ng-container>\n <!-- Overall progress functionality -->\n\n <!-- <div *ngIf=\"resumeData && !userRating\"> -->\n <!-- <ws-app-karmapoints-panel [btntype]=\"'Rate this course'\" [data]=\"kparray\"\n [pCategory]=\"content?.primaryCategory\"></ws-app-karmapoints-panel> -->\n <!-- </div> -->\n\n <!-- <div *ngIf=\"resumeData && userRating\">\n <ws-app-karmapoints-panel [btntype]=\"'Edit rating'\" [data]=\"kparray\"\n [pCategory]=\"content?.primaryCategory\"></ws-app-karmapoints-panel>\n </div> -->\n\n <ng-container *ngIf=\"actionBtnStatus !== 'wait' && content?.status !== 'Deleted' && content?.status !== 'Expired'\">\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </ng-container>\n </div>\n\n <div class=\"karma-points-div\">\n <ws-widget-karma-points [data]=\"kparray\" (clickClaimKarmaPoints)=\"onClickOfClaim($event)\" [content] = \"content\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"></ws-widget-karma-points>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-wrap gap-6\">\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'40px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\" [showInstructorLedMsg]=\"showInstructorLedMsg\" [contentReadData]=\"contentReadData\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col gap-8 p-5\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\" [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorDetails)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authors' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\" [photoUrl]=\"author?.photo || ''\"\n [name]=\"author?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n </div>\n <!-- <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(content?.creatorContacts)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.curators' | translate }}</div>\n <div class=\"flex flex-row gap-4\" *ngFor=\"let creator of handleParseJsonData(content?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\" [photoUrl]=\"author?.photo || ''\"\n [name]=\"creator?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creator?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.curator' | translate }}</div>\n </div>\n </div>\n </div> -->\n <div class=\"flex flex-col gap-3\" *ngIf=\"content?.source && (contentCreatorData && contentCreatorData?.length)\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let creator of contentCreatorData\">\n <div class=\"flex provider-logo-div\">\n <img *ngIf=\"content?.creatorLogo\" [src]=\"content?.creatorLogo\" alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!content?.creatorLogo\" class=\"mat-icon\" src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\" alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm word-break cursor-pointer\" *ngIf=\"content?.createdFor?.length\" (click)=\"raiseTelemeteryForProvider(content?.source, content?.createdFor[0])\"\n [routerLink]=\"['/app/learn/browse-by/provider', content?.source, content?.createdFor[0], 'micro-sites']\">{{ handleCapitalize(content?.source, 'source') }}\n </div>\n <div class=\"text-sm word-break\" *ngIf=\"!content?.createdFor?.length\">{{ handleCapitalize(content?.source, 'source') }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n\n \n\n </div>\n</div>\n\n <!-- Mobile enrollment button container -->\n <div class=\"mobile-enroll-div\" [ngClass]=\"{'bg-white': content?.primaryCategory === primaryCategory.BLENDED_PROGRAM }\">\n <ng-container *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM \">\n <div class=\"mb-2\" *ngIf=\"mobile1200 && !forPreview || isInIFrame; else authViewBtn\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\" [analytics]=\"analytics\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </div>\n </ng-container>\n <!-- Reuse enrollment functionality template for mobile -->\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </div>\n\n <ws-app-share-toc *ngIf=\"enableShare\" [rootOrgId]=\"rootOrgId\" [content]=\"content\" (resetEnableShare)=\"resetEnableShare($event)\"></ws-app-share-toc>\n</ng-container>\n\n<!-- Template for when no data is found -->\n<ng-template #noDataFound>\n <div class=\"error-not-found flex flex-wrapped margin-left-m margin-top-xl margin-right-m flex-col justify-center align-items-center text-center\">\n <div class=\"error-logo\">\n <div class=\"error-message ws-mat-primary-text font-weight-bold\" >\n The page you requested cannot be found\n </div>\n </div>\n </div>\n</ng-template>\n\n<!-- Authentication view templates -->\n<ng-template #authView>{{'apptochome.view' | translate}}</ng-template>\n\n<ng-template #authViewBtn i18n>\n <a (click)=\"raiseTelemetryForPublic()\" [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\" [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n {{'apptochome.view' | translate}}\n </a>\n</ng-template>\n\n<ng-template #authViewForInviteOnlyAssessment>\n <ng-container\n *ngIf=\"forPreview && content?.courseCategory === 'Invite-Only Assessment'\"> \n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"> \n <ng-container>{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n</ng-template>\n", styles: [".source-text{color:#ffffffb3}.preenrolldone-btn{opacity:1;color:#1d8923;font-family:Lato-Bold,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:2px solid #1D8923;cursor:pointer;height:40px;box-sizing:border-box}.preenrolldone-btn img{margin-left:8px;margin-top:-2px}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{position:absolute;z-index:10;top:132px;padding-bottom:1rem}.right-container .right-content-inner{background-color:#fff;border-radius:12px;width:384px;margin-bottom:1rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.right-container .view-more:hover{background-color:#dcdfe5}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#000000de;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.mob-tip-for-learner{display:none}@media screen and (max-width: 1000px){.mob-tip-for-learner{display:block;width:100%;padding:0 16px;overflow:hidden;box-sizing:border-box}}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto;box-sizing:border-box;height:40px;line-height:24px!important}.rate-button{color:#000000de!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button,.mobile-enroll-div .preenrolldone-btn{min-width:320px;max-width:400px;margin:auto}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#0074b6!important}.tab:focus{outline:1px solid!important}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.blue-border{border:2px solid #0074b6!important}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}.location-details{background-color:#1b4ca114;padding:16px;border-radius:4px}.location-details .location-icon,.location-details .event-icon{color:#1b4ca1;height:20px;width:14px;font-size:22px}.location-details .loc-desc{font-family:Lato;font-weight:700;font-size:14px;line-height:20px;letter-spacing:.25}.location-details .mat-icon{overflow:visible!important}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.relevent-wrapper{background:#1b4ca129;border-radius:12px}.relevent-wrapper .relevent-info{max-width:400px;margin-right:auto}.relevent-wrapper .relevent-info .relevent-heading{font-family:Montserrat;line-height:17.07px;font-weight:600;color:#000!important}.relevent-wrapper .relevent-info .relevent-subinfo{font-family:Lato;line-height:16.8px;color:#545454}.relevent-normal.relevent-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#276de5;background-color:#fff;border-radius:21px;text-decoration:none;overflow:hidden;transition:all .3s ease-in-out}.relevent-normal.relevent-btn:hover{box-shadow:0 1px 10px #276de599}.relevent-normal.relevent-btn{cursor:pointer}.relevent-normal.relevent-btn:before{content:\"\";position:absolute;inset:0;padding:2px 2.5px;border-radius:21px;background:linear-gradient(89.96deg,#f3962f .04%,#276de5 99.96%);-webkit-mask:linear-gradient(white,white) content-box,linear-gradient(white,white);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease-in-out;cursor:pointer}.relevent-normal.relevent-btn:hover:before{opacity:1}.relevant-container{width:max-content}.no-button{opacity:1;transform:scale(1);transition:opacity .3s ease-in-out,transform .3s ease-in-out;color:#1b4ca1;cursor:pointer}\n"], encapsulation: i0.ViewEncapsulation.None }); }
2204
2205
  }
2205
2206
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocHomeComponent, decorators: [{
2206
2207
  type: Component,
2207
- args: [{ selector: 'ws-app-app-toc-home', encapsulation: ViewEncapsulation.None, template: "<!-- \n Main Container - Displays course/content details with enrollment functionality\n Only displays content if courseID is available, otherwise shows \"not found\" message\n-->\n<ng-container *ngIf=\"courseID else noDataFound\">\n <!-- \n ENROLLMENT TEMPLATE - Handles all enrollment/start/resume button functionality\n Used in multiple places throughout the template\n -->\n <ng-template #enrollFunctionality>\n <div [hidden]=\"isResource && !content?.artifactUrl?.length\" class=\"flex flex-col gap-4 text-center\">\n <!-- SECTION: Regular course enrollment buttons -->\n <ng-container *ngIf=\"content?.primaryCategory !== primaryCategory.PROGRAM\n && content?.primaryCategory !== primaryCategory.CURATED_PROGRAM\n && content?.primaryCategory !== primaryCategory.STANDALONE_ASSESSMENT &&\n content?.primaryCategory !== primaryCategory.BLENDED_PROGRAM\">\n <!-- START/RESUME button for granted courses -->\n <ng-container *ngIf=\"(actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !(content?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 &&\n !content?.artifactUrl?.length) &&\n !(content?.primaryCategory === primaryCategory.COURSE && !batchData?.enrolled) &&\n !(content?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl) &&\n !(content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)) &&\n !(content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId)\">\n <a *ngIf=\"showStart.show && !isPostAssessment && !forPreview\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"(!content.completionPercentage || content.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData ? translateLabels('resume', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100 || certData\">\n {{ resumeData ? translateLabels('Start again', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n\n <!-- TAKE ASSESSMENT button (for post assessments) -->\n <button *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" (click)=\"raiseTelemetryForPublic()\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >{{ 'apptochome.takeAssessment' | translate }}</ng-container>\n </button>\n\n <!-- Commented karma points panel functionality -->\n </ng-container>\n \n <!-- ENROLL button for courses that require enrollment -->\n <ng-container *ngIf=\" (actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) && \n !( content?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 && !content?.artifactUrl?.length ) &&\n !( content?.primaryCategory === primaryCategory.COURSE && batchData?.enrolled ) &&\n !(content?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl)) &&\n !(content?.primaryCategory === primaryCategory.PROGRAM) &&\n !(content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)\">\n <ng-container *ngIf=\"content?.primaryCategory !== primaryCategory.RESOURCE && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\" (click)=\"handleAutoBatchAssign()\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL - Used across multiple sections -->\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: BLENDED_PROGRAM pre-enrollment functionality -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && !preAssessmentCompletionStatus\">\n <a class=\"flex action-button enroll-btn justify-center resume\" *ngIf=\"contentReadData?.preEnrolmentResources?.length\" (click)=\"routeToPreAssessent()\">\n <ng-container >\n {{ 'apptochome.preEnroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n \n <!-- SECTION: BLENDED_PROGRAM pre-enrollment completion message -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && preAssessmentCompletionStatus\">\n <a class=\"flex preenrolldone-btn justify-center resume\">\n <ng-container >\n {{ 'apptochome.preEnrollDone' | translate }}<img src=\"/assets/icons/Accept_icon.png\" alt=\"tick\" class=\"tick-icon\">\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: PROGRAM & MANDATORY_COURSE_GOAL handling -->\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.PROGRAM || content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL\">\n \n <!-- SECTION: Moderated program enrollment handling -->\n <ng-container *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && (contentReadData?.batches && !batchData?.enrolled)\">\n <ng-container *ngIf=\"((content?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && !contentReadData?.batches[0].endDate\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleAutoBatchAssign()\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >\n <!-- ENROLL BUTTON LABEL -->\n {{'apptochome.enroll' | translate}}\n </ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n <ng-container *ngIf=\"((content?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && contentReadData?.batches[0].endDate\">\n \n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" [analytics]=\"analytics\" (programEnrollCall)=\"programEnrollCall($event)\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: No batches message -->\n <ng-container *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && !contentReadData?.batches && !batchData?.enrolled && !enrollBtnLoading\">\n No Batches\n </ng-container>\n\n <!-- SECTION: Status messages for non-moderated programs -->\n <ng-container *ngIf=\"courseCategory?.MODERATED_PROGRAM !== contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container\n *ngIf=\"!(content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) && content?.primaryCategory !== primaryCategory.MANDATORY_COURSE_GOAL\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.youAreNotInvited' | translate }} </span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: Batch status messages for moderated programs -->\n <ng-container *ngIf=\"!isBatchInProgress && courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: In-progress batch with resume/start functionality -->\n <ng-container *ngIf=\"isBatchInProgress &&\n ( actionBtnStatus === 'grant' &&\n !(isMobile && content?.isInIntranet) &&\n (content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) ||\n (content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL && currentCourseBatchId)\n )\">\n <a *ngIf=\"showStart.show && !isPostAssessment\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content.completionPercentage || content.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100\">\n {{ resumeData || content.completionPercentage === 100 ? \"Start again\" : \"Start\" }}\n </ng-container>\n </a>\n <a *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >{{ 'apptochome.takeAssessment' | translate }}</ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: CURATED_PROGRAM in-progress handling -->\n <ng-container\n *ngIf=\"isBatchInProgress && (content?.primaryCategory === primaryCategory.CURATED_PROGRAM && batchData?.enrolled) && !enrollBtnLoading\">\n <a *ngIf=\"showStart.show && !isPostAssessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content.completionPercentage || content.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100\">\n {{ resumeData || content.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: Loading state for enrollment button -->\n <ng-container *ngIf=\"enrollBtnLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'36px'\"\n [bindingClass]=\"'flex rounded h-8'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <!-- SECTION: CURATED_PROGRAM enrollment button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.CURATED_PROGRAM && !batchData?.enrolled && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"(click)=\"handleAutoBatchAssign()\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL -->\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: STANDALONE_ASSESSMENT enrollment button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && content?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleAutoBatchAssign()\" *ngIf=\"!forPreview || isInIFrame\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL -->\n {{ 'apptochome.enroll' | translate }} \n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: INVITE-ONLY STANDALONE_ASSESSMENT message --> \n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && content?.courseCategory === 'Invite-Only Assessment'\">\n \n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewForInviteOnlyAssessment\" >\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.youAreNotInvitedForAssessment' | translate }} </span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: Enrolled INVITE-ONLY STANDALONE_ASSESSMENT take test button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && isBatchInProgress && !enrollBtnLoading && content?.courseCategory === 'Invite-Only Assessment'\"> \n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate }}</ng-container>\n <ng-container *ngIf=\"content.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: Status messages for INVITE-ONLY STANDALONE_ASSESSMENT -->\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA' && content?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA' && content?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n \n <!-- SECTION: Regular STANDALONE_ASSESSMENT enrolled take test button -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && !enrollBtnLoading && content?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate }}</ng-container>\n <ng-container *ngIf=\"content.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: BLENDED_PROGRAM workflow status -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <!-- Review status message -->\n <ng-container *ngIf=\"batchData?.workFlow?.wfInitiated &&\n !(batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN)\">\n <div class=\"ws-mat-accent-text ws-mat-accent-light-bg flex items-center justify-center statusMsg\">\n <p class=\"margin-remove-bottom font-bold\">\n {{ 'apptochome.requestUnderReview' | translate }}\n </p>\n </div>\n </ng-container>\n\n <!-- Approved BLENDED_PROGRAM start/resume button -->\n <ng-container>\n <a\n *ngIf=\"showStart.show && batchData?.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED\"\n [routerLink]=\"isBatchInProgress? (resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url : '' \" (click)=\"raiseTelemetryForPublic()\"\n [queryParams]=\"isBatchInProgress ? (resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START') : '' \"\n class=\"flex action-button justify-center resume\" [ngClass]=\"{'disable-start-btn': !isBatchInProgress}\">\n <ng-container *ngIf=\"(!content.completionPercentage || content.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100 || certData\">\n {{ resumeData || content.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') : translateLabels('start', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: External registration link -->\n <ng-container *ngIf=\"actionBtnStatus == 'reject' && content?.registrationUrl\">\n <a [href]=\"content?.registrationUrl\" target=\"_blank\" class=\"flex action-button justify-center\" >{{ 'apptochome.register' | translate }}</a>\n </ng-container>\n\n </div>\n </ng-template>\n\n <!-- \n PROGRESS FUNCTIONALITY TEMPLATE\n Displays progress bar and rating button functionality\n -->\n <ng-template #progressFunctionality>\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row gap-4 text-sm\">\n <div class=\"flex-1 text-xs\">{{ 'apptocsinglepage.overallProgress' | translate }}</div>\n <div class=\"text-xs\" *ngIf=\"content?.completionPercentage > 0\"> {{ content?.completionPercentage }} %</div>\n </div>\n <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" [progress]=\"content?.completionPercentage\" [progressType]=\"'percentage'\"\n [customClassName]=\"'content-progress'\" >\n </ws-widget-content-progress>\n </div>\n </div>\n\n <ng-container *ngIf=\"content?.completionPercentage >= 50\">\n <button mat-stroked-button color=\"accent\" type=\"button\" class=\"rate-button\" (click)=\"openFeedbackDialog(content)\">\n <mat-icon class=\"nodtranslate\">star_purple500</mat-icon>\n <ng-container *ngIf=\"!userRating\">\n <div>{{ 'apptocsinglepage.rateNow' | translate }}</div>\n </ng-container>\n <ng-container *ngIf=\"userRating\">\n <div>{{ 'apptocsinglepage.editRating' | translate }}</div>\n </ng-container>\n </button>\n </ng-container>\n </div>\n </ng-template>\n\n <!-- \n MAIN CONTENT DISPLAY SECTION\n Banner, details, and content layout\n -->\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\" [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{ translateLabel(content?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n \n <div class=\"flex items-center\" *ngIf=\"cbPlanEndDate\">\n <div class=\"flex items-center due-tag text-xs leading-3\" [ngClass]=\"{'due-warning': cbPlanDuration === nsCardContentData.UPCOMING, 'due-overdue': cbPlanDuration === nsCardContentData.OVERDUE, 'due-success': cbPlanDuration === nsCardContentData.SUCCESS}\" >\n {{ 'common.dueBy' | translate }} - &nbsp;<span class=\"font-bold\">{{ cbPlanEndDate | date: 'd MMM, y'}}</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex items-center text-white mob-share\" *ngIf=\"canShare\">\n <mat-icon class=\"nodtranslate\" (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold nodtranslate\">{{ handleCapitalize(content?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words nodtranslate\" #contentSource [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">{{ 'cardcontentv2.by' | translate }} {{ content?.source }}</div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex gap-4 items-center\" *ngIf=\"content?.averageRating || content?.additionalTags?.length\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\" (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon class=\"nodtranslate\">grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}</div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' | translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' | translate }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && content?.sYS_INTERNAL_LAST_UPDATED_ON\">\n <div class=\"text-xs leading-4 source-text nodtranslate\">({{ 'apptoc.lastUpdatedOn' | translate }} {{ content?.sYS_INTERNAL_LAST_UPDATED_ON | date: 'MMM d, y' }})</div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\">\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM &&\n selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails &&\n selectedBatchData?.content[0]?.enrollmentEndDate\">\n <div class=\"location-details mt-6\">\n <div class=\"flex items-center gap-4 pb-3\">\n <mat-icon class=\"location-icon nodtranslate\">\n location_on\n </mat-icon>\n <div class=\"loc-desc\">\n {{selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n <div class=\"flex items-center gap-4\">\n <mat-icon class=\"event-icon nodtranslate\">\n event</mat-icon>\n <div class=\"loc-desc\">\n Last date of enrollment - {{selectedBatchData?.content[0]?.enrollmentEndDate | date: 'dd/MM/yyyy'}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"recommendedCoursesId && !feedbackGiven\">\n <div class=\"px-4 py-3 mt-6 relevent-wrapper\">\n <div class=\"flex gap-4 items-center flex-wrap flex justify-center md:justify-start\">\n <img src=\"/assets/images/sakshamAI/lady-greet.svg\" alt=\"greet\" width=\"56.89\" height=\"64\">\n <div class=\"relevent-info\">\n <span class=\"font-bolder text-sm relevent-heading block mb-1\">{{ 'home.tocReleventHeading' | translate }}</span>\n <span class=\"relevent-subinfo font-normal text-sm block\">{{ 'home.tocReleventSubHeading' | translate }}</span>\n </div>\n <div class=\"flex flex-middle relevant-container\">\n <div class=\"flex flex-middle relevent-normal relevent-btn py-2 px-4 relevant-box\"\n (mouseenter)=\"isReleventBtnHovered = true\"\n (mouseleave)=\"isReleventBtnHovered = false\" (click)=\"handleAcceptRelevent()\">\n <img\n [src]=\"isReleventBtnHovered && !isRelevent ? SAKSHAMAI_ICON_LOADER : SAKSHAMAI_ICON_NORMAL\"\n alt=\"loader\" width=\"16\" height=\"16\" class=\"mr-2\">\n <span class=\"text-relevent ff-lato text-sm font-bold\">{{ 'home.relevent' | translate }}</span>\n </div>\n \n <div class=\"flex flex-middle no-button ml-8\" (click)=\"handleDeclineRelevent()\">\n <mat-icon class=\"mat-icon text-no mr-1 nodtranslate\">thumb_down</mat-icon>\n <span class=\"text-no ff-lato text-sm font-bold\">{{ 'home.no' | translate }}</span>\n </div> \n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"pb-4 lg:py-4\">\n <!-- Overall progress functionality -->\n <div class=\"mobile-progress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </div>\n <!-- Overall progress functionality -->\n\n <ws-widget-content-toc [content]=\"content\" [componentName]=\"'toc'\" [pathSet]=\"pathSet\" [tocStructure]=\"tocStructure\" \n [forPreview]=\"forPreview\" [isEnrolled]=\"batchData?.enrolled\" [resumeData]=\"resumeData\" [batchData]=\"selectedBatchData\" [skeletonLoader]=\"skeletonLoader\" \n [changeTab]=\"changeTab\" [hierarchyMapData]=\"tocSvc?.hashmap\" [selectedBatchData]=\"selectedBatchData\" [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\" [kparray]=\"kparray\"\n (playResumeForAI)=\"playResumeForAI()\" (enrollUserToAI)=\"enrollUserToAI()\" [contentReadData]=\"contentReadData\"></ws-widget-content-toc>\n <div class=\"mob-tip-for-learner\">\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n </div>\n </div>\n \n\n <div class=\"right-container\" >\n <!-- if needed sticky of right container add this to below div => #rightContainer -->\n <div class=\"right-content\">\n <div class=\"right-content-inner\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\" [ngStyle]=\"{\n 'background-image': 'url(' + content?.posterImage + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\" [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-between\" [ngClass]=\"{'justify-between': scrolled, 'justify-end': !scrolled}\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\" *ngIf=\"scrolled\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ translateLabel(content?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div (click)=\"onClickOfShare()\" class=\"flex flex-row items-center justify-end gap-2 share-tag\" *ngIf=\"canShare && !forPreview\">\n <mat-icon class=\"nodtranslate\">share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold\">{{ handleCapitalize(content?.name) }}\n </div>\n <div class=\"text-sm source-text font-semibold break-words\" #contentSource [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">{{ 'cardcontentv2.by' | translate }} {{ content?.source }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-col gap-4 p-5 border-bottom\">\n <div class=\"flex flex-col gap-4\" *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n <ng-container *ngIf=\"timer && timer.days >= 0 && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 batch-timer\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container *ngIf=\"!mobile1200 && preAssessmentCompletionStatus\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\" [analytics]=\"analytics\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'68px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"content?.isInIntranet && showIntranetMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>\n <ng-container >{{ 'apptochome.viewedInIntranet' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showInstructorLedMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container >{{ 'apptochome.notAvailableOnline' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showStart.msg === 'youtubeForbidden'\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container >{{ 'apptochome.youtubeContentBlocked' | translate }}</ng-container>\n </div>\n <div *ngIf=\"showBtn\">\n <a href=\"{{ cscmsUrl }}\" target=\"_blank\" class=\"flex action-button justify-center\">\n {{ 'apptochome.applyForPhysicalTraining' | translate }}</a>\n </div>\n\n <!-- Overall progress functionality -->\n <ng-container *ngIf=\"content?.completionStatus <= 2 && isBatchInProgress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </ng-container>\n <!-- Overall progress functionality -->\n\n <!-- <div *ngIf=\"resumeData && !userRating\"> -->\n <!-- <ws-app-karmapoints-panel [btntype]=\"'Rate this course'\" [data]=\"kparray\"\n [pCategory]=\"content?.primaryCategory\"></ws-app-karmapoints-panel> -->\n <!-- </div> -->\n\n <!-- <div *ngIf=\"resumeData && userRating\">\n <ws-app-karmapoints-panel [btntype]=\"'Edit rating'\" [data]=\"kparray\"\n [pCategory]=\"content?.primaryCategory\"></ws-app-karmapoints-panel>\n </div> -->\n\n <ng-container *ngIf=\"actionBtnStatus !== 'wait' && content?.status !== 'Deleted' && content?.status !== 'Expired'\">\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </ng-container>\n </div>\n\n <div class=\"karma-points-div\">\n <ws-widget-karma-points [data]=\"kparray\" (clickClaimKarmaPoints)=\"onClickOfClaim($event)\" [content] = \"content\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"></ws-widget-karma-points>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-wrap gap-6\">\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'40px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\" [showInstructorLedMsg]=\"showInstructorLedMsg\" [contentReadData]=\"contentReadData\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col gap-8 p-5\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\" [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorDetails)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authors' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\" [photoUrl]=\"author?.photo || ''\"\n [name]=\"author?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n </div>\n <!-- <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(content?.creatorContacts)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.curators' | translate }}</div>\n <div class=\"flex flex-row gap-4\" *ngFor=\"let creator of handleParseJsonData(content?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\" [photoUrl]=\"author?.photo || ''\"\n [name]=\"creator?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creator?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.curator' | translate }}</div>\n </div>\n </div>\n </div> -->\n <div class=\"flex flex-col gap-3\" *ngIf=\"content?.source && (contentCreatorData && contentCreatorData?.length)\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let creator of contentCreatorData\">\n <div class=\"flex provider-logo-div\">\n <img *ngIf=\"content?.creatorLogo\" [src]=\"content?.creatorLogo\" alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!content?.creatorLogo\" class=\"mat-icon\" src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\" alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm word-break cursor-pointer\" *ngIf=\"content?.createdFor?.length\" (click)=\"raiseTelemeteryForProvider(content?.source, content?.createdFor[0])\"\n [routerLink]=\"['/app/learn/browse-by/provider', content?.source, content?.createdFor[0], 'micro-sites']\">{{ handleCapitalize(content?.source, 'source') }}\n </div>\n <div class=\"text-sm word-break\" *ngIf=\"!content?.createdFor?.length\">{{ handleCapitalize(content?.source, 'source') }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n\n \n\n </div>\n</div>\n\n <!-- Mobile enrollment button container -->\n <div class=\"mobile-enroll-div\" [ngClass]=\"{'bg-white': content?.primaryCategory === primaryCategory.BLENDED_PROGRAM }\">\n <ng-container *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM \">\n <div class=\"mb-2\" *ngIf=\"mobile1200 && !forPreview || isInIFrame; else authViewBtn\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\" [analytics]=\"analytics\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </div>\n </ng-container>\n <!-- Reuse enrollment functionality template for mobile -->\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </div>\n\n <ws-app-share-toc *ngIf=\"enableShare\" [rootOrgId]=\"rootOrgId\" [content]=\"content\" (resetEnableShare)=\"resetEnableShare($event)\"></ws-app-share-toc>\n</ng-container>\n\n<!-- Template for when no data is found -->\n<ng-template #noDataFound>\n <div class=\"error-not-found flex flex-wrapped margin-left-m margin-top-xl margin-right-m flex-col justify-center align-items-center text-center\">\n <div class=\"error-logo\">\n <div class=\"error-message ws-mat-primary-text font-weight-bold\" >\n The page you requested cannot be found\n </div>\n </div>\n </div>\n</ng-template>\n\n<!-- Authentication view templates -->\n<ng-template #authView>{{'apptochome.view' | translate}}</ng-template>\n\n<ng-template #authViewBtn i18n>\n <a (click)=\"raiseTelemetryForPublic()\" [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\" [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n {{'apptochome.view' | translate}}\n </a>\n</ng-template>\n\n<ng-template #authViewForInviteOnlyAssessment>\n <ng-container\n *ngIf=\"forPreview && content?.courseCategory === 'Invite-Only Assessment'\"> \n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"> \n <ng-container>{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n</ng-template>\n", styles: [".source-text{color:#ffffffb3}.preenrolldone-btn{opacity:1;color:#1d8923;font-family:Lato-Bold,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:2px solid #1D8923;cursor:pointer;height:40px;box-sizing:border-box}.preenrolldone-btn img{margin-left:8px;margin-top:-2px}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{position:absolute;z-index:10;top:132px;padding-bottom:1rem}.right-container .right-content-inner{background-color:#fff;border-radius:12px;width:384px;margin-bottom:1rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.right-container .view-more:hover{background-color:#dcdfe5}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#000000de;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.mob-tip-for-learner{display:none}@media screen and (max-width: 1000px){.mob-tip-for-learner{display:block;width:100%;padding:0 16px;overflow:hidden;box-sizing:border-box}}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto;box-sizing:border-box;height:40px;line-height:24px!important}.rate-button{color:#000000de!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button,.mobile-enroll-div .preenrolldone-btn{min-width:320px;max-width:400px;margin:auto}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#0074b6!important}.tab:focus{outline:1px solid!important}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.blue-border{border:2px solid #0074b6!important}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}.location-details{background-color:#1b4ca114;padding:16px;border-radius:4px}.location-details .location-icon,.location-details .event-icon{color:#1b4ca1;height:20px;width:14px;font-size:22px}.location-details .loc-desc{font-family:Lato;font-weight:700;font-size:14px;line-height:20px;letter-spacing:.25}.location-details .mat-icon{overflow:visible!important}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.relevent-wrapper{background:#1b4ca129;border-radius:12px}.relevent-wrapper .relevent-info{max-width:400px;margin-right:auto}.relevent-wrapper .relevent-info .relevent-heading{font-family:Montserrat;line-height:17.07px;font-weight:600;color:#000!important}.relevent-wrapper .relevent-info .relevent-subinfo{font-family:Lato;line-height:16.8px;color:#545454}.relevent-normal.relevent-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#276de5;background-color:#fff;border-radius:21px;text-decoration:none;overflow:hidden;transition:all .3s ease-in-out}.relevent-normal.relevent-btn:hover{box-shadow:0 1px 10px #276de599}.relevent-normal.relevent-btn{cursor:pointer}.relevent-normal.relevent-btn:before{content:\"\";position:absolute;inset:0;padding:2px 2.5px;border-radius:21px;background:linear-gradient(89.96deg,#f3962f .04%,#276de5 99.96%);-webkit-mask:linear-gradient(white,white) content-box,linear-gradient(white,white);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease-in-out;cursor:pointer}.relevent-normal.relevent-btn:hover:before{opacity:1}.relevant-container{width:max-content}.no-button{opacity:1;transform:scale(1);transition:opacity .3s ease-in-out,transform .3s ease-in-out;color:#1b4ca1;cursor:pointer}\n"] }]
2208
- }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.WidgetContentService }, { type: i3.AppTocService }, { type: i4.LoggerService }, { type: i4.ConfigurationsService }, { type: i5.DomSanitizer }, { type: i6.AccessControlService }, { type: i7.MatLegacySnackBar }, { type: i8.MatLegacyDialog }, { type: i9.MobileAppsService }, { type: i4.UtilityService }, { type: i10.ActionService }, { type: i11.ViewerUtilService }, { type: i12.RatingService }, { type: i4.TelemetryService }, { type: i13.TranslateService }, { type: i4.MultilingualTranslationsService }, { type: i4.EventService }, { type: i7.MatLegacySnackBar }, { type: i14.LoadCheckService }, { type: i15.HandleClaimService }, { type: i16.ResetRatingsService }, { type: i17.TimerService }, { type: i4.WidgetEnrollService }, { type: i18.WidgetContentLibService }, { type: i4.DataTransferService }, { type: i19.MatSnackBar }, { type: i18.WidgetUserServiceLib }, { type: i20.NetCoreService }, { type: undefined, decorators: [{
2208
+ args: [{ selector: 'ws-app-app-toc-home', encapsulation: ViewEncapsulation.None, template: "<!-- \n Main Container - Displays course/content details with enrollment functionality\n Only displays content if courseID is available, otherwise shows \"not found\" message\n-->\n<ng-container *ngIf=\"courseID else noDataFound\">\n <!-- \n ENROLLMENT TEMPLATE - Handles all enrollment/start/resume button functionality\n Used in multiple places throughout the template\n -->\n <ng-template #enrollFunctionality>\n <div [hidden]=\"isResource && !content?.artifactUrl?.length\" class=\"flex flex-col gap-4 text-center\">\n <!-- SECTION: Regular course enrollment buttons -->\n <ng-container *ngIf=\"content?.primaryCategory !== primaryCategory.PROGRAM\n && content?.primaryCategory !== primaryCategory.CURATED_PROGRAM\n && content?.primaryCategory !== primaryCategory.STANDALONE_ASSESSMENT &&\n content?.primaryCategory !== primaryCategory.BLENDED_PROGRAM\">\n <!-- START/RESUME button for granted courses -->\n <ng-container *ngIf=\"(actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !(content?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 &&\n !content?.artifactUrl?.length) &&\n !(content?.primaryCategory === primaryCategory.COURSE && !batchData?.enrolled) &&\n !(content?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl) &&\n !(content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)) &&\n !(content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId)\">\n <a *ngIf=\"showStart.show && !isPostAssessment && !forPreview\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"(!content.completionPercentage || content.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData ? translateLabels('resume', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100 || certData\">\n {{ resumeData ? translateLabels('Start again', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n\n <!-- TAKE ASSESSMENT button (for post assessments) -->\n <button *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" (click)=\"raiseTelemetryForPublic()\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >{{ 'apptochome.takeAssessment' | translate }}</ng-container>\n </button>\n\n <!-- Commented karma points panel functionality -->\n </ng-container>\n \n <!-- ENROLL button for courses that require enrollment -->\n <ng-container *ngIf=\" (actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) && \n !( content?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 && !content?.artifactUrl?.length ) &&\n !( content?.primaryCategory === primaryCategory.COURSE && batchData?.enrolled ) &&\n !(content?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl)) &&\n !(content?.primaryCategory === primaryCategory.PROGRAM) &&\n !(content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)\">\n <ng-container *ngIf=\"content?.primaryCategory !== primaryCategory.RESOURCE && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\" (click)=\"handleAutoBatchAssign()\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL - Used across multiple sections -->\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: BLENDED_PROGRAM pre-enrollment functionality -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && !preAssessmentCompletionStatus\">\n <a class=\"flex action-button enroll-btn justify-center resume\" *ngIf=\"contentReadData?.preEnrolmentResources?.length\" (click)=\"routeToPreAssessent()\">\n <ng-container >\n {{ 'apptochome.preEnroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n \n <!-- SECTION: BLENDED_PROGRAM pre-enrollment completion message -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM && preAssessmentCompletionStatus\">\n <a class=\"flex preenrolldone-btn justify-center resume\">\n <ng-container >\n {{ 'apptochome.preEnrollDone' | translate }}<img src=\"/assets/icons/Accept_icon.png\" alt=\"tick\" class=\"tick-icon\">\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: PROGRAM & MANDATORY_COURSE_GOAL handling -->\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.PROGRAM || content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL\">\n \n <!-- SECTION: Moderated program enrollment handling -->\n <ng-container *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && (contentReadData?.batches && !batchData?.enrolled)\">\n <ng-container *ngIf=\"((content?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && !contentReadData?.batches[0].endDate\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleAutoBatchAssign()\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >\n <!-- ENROLL BUTTON LABEL -->\n {{'apptochome.enroll' | translate}}\n </ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n <ng-container *ngIf=\"((content?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && contentReadData?.batches[0].endDate\">\n \n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" [analytics]=\"analytics\" (programEnrollCall)=\"programEnrollCall($event)\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: No batches message -->\n <ng-container *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && !contentReadData?.batches && !batchData?.enrolled && !enrollBtnLoading\">\n No Batches\n </ng-container>\n\n <!-- SECTION: Status messages for non-moderated programs -->\n <ng-container *ngIf=\"courseCategory?.MODERATED_PROGRAM !== contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container\n *ngIf=\"!(content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) && content?.primaryCategory !== primaryCategory.MANDATORY_COURSE_GOAL\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.youAreNotInvited' | translate }} </span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: Batch status messages for moderated programs -->\n <ng-container *ngIf=\"!isBatchInProgress && courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: In-progress batch with resume/start functionality -->\n <ng-container *ngIf=\"isBatchInProgress &&\n ( actionBtnStatus === 'grant' &&\n !(isMobile && content?.isInIntranet) &&\n (content?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) ||\n (content?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL && currentCourseBatchId)\n )\">\n <a *ngIf=\"showStart.show && !isPostAssessment\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content.completionPercentage || content.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100\">\n {{ resumeData || content.completionPercentage === 100 ? \"Start again\" : \"Start\" }}\n </ng-container>\n </a>\n <a *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\" >{{ 'apptochome.takeAssessment' | translate }}</ng-container>\n </a>\n <!-- Commented karma points panel functionality -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: CURATED_PROGRAM in-progress handling -->\n <ng-container\n *ngIf=\"isBatchInProgress && (content?.primaryCategory === primaryCategory.CURATED_PROGRAM && batchData?.enrolled) && !enrollBtnLoading\">\n <a *ngIf=\"showStart.show && !isPostAssessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content.completionPercentage || content.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100\">\n {{ resumeData || content.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') : translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: Loading state for enrollment button -->\n <ng-container *ngIf=\"enrollBtnLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'36px'\"\n [bindingClass]=\"'flex rounded h-8'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <!-- SECTION: CURATED_PROGRAM enrollment button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.CURATED_PROGRAM && !batchData?.enrolled && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"(click)=\"handleAutoBatchAssign()\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL -->\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: STANDALONE_ASSESSMENT enrollment button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && content?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleAutoBatchAssign()\" *ngIf=\"!forPreview || isInIFrame\">\n <ng-container >\n <!-- ENROLL BUTTON LABEL -->\n {{ 'apptochome.enroll' | translate }} \n </ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: INVITE-ONLY STANDALONE_ASSESSMENT message --> \n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && content?.courseCategory === 'Invite-Only Assessment'\">\n \n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewForInviteOnlyAssessment\" >\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.youAreNotInvitedForAssessment' | translate }} </span>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: Enrolled INVITE-ONLY STANDALONE_ASSESSMENT take test button -->\n <ng-container\n *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && isBatchInProgress && !enrollBtnLoading && content?.courseCategory === 'Invite-Only Assessment'\"> \n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate }}</ng-container>\n <ng-container *ngIf=\"content.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: Status messages for INVITE-ONLY STANDALONE_ASSESSMENT -->\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA' && content?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA' && content?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\" >{{ 'apptochome.batchWillStart' | translate }} {{getStartDate}}!</span>\n </ng-container>\n \n <!-- SECTION: Regular STANDALONE_ASSESSMENT enrolled take test button -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && !enrollBtnLoading && content?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate }}</ng-container>\n <ng-container *ngIf=\"content.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n\n <!-- SECTION: BLENDED_PROGRAM workflow status -->\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <!-- Review status message -->\n <ng-container *ngIf=\"batchData?.workFlow?.wfInitiated &&\n !(batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED || batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN)\">\n <div class=\"ws-mat-accent-text ws-mat-accent-light-bg flex items-center justify-center statusMsg\">\n <p class=\"margin-remove-bottom font-bold\">\n {{ 'apptochome.requestUnderReview' | translate }}\n </p>\n </div>\n </ng-container>\n\n <!-- Approved BLENDED_PROGRAM start/resume button -->\n <ng-container>\n <a\n *ngIf=\"showStart.show && batchData?.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED\"\n [routerLink]=\"isBatchInProgress? (resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url : '' \" (click)=\"raiseTelemetryForPublic()\"\n [queryParams]=\"isBatchInProgress ? (resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START') : '' \"\n class=\"flex action-button justify-center resume\" [ngClass]=\"{'disable-start-btn': !isBatchInProgress}\">\n <ng-container *ngIf=\"(!content.completionPercentage || content.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\" >\n {{ resumeData && (content.completionPercentage < 100 && content.completionPercentage> 0) ? translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content.completionPercentage === 100 || certData\">\n {{ resumeData || content.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') : translateLabels('start', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n </ng-container>\n\n <!-- SECTION: External registration link -->\n <ng-container *ngIf=\"actionBtnStatus == 'reject' && content?.registrationUrl\">\n <a [href]=\"content?.registrationUrl\" target=\"_blank\" class=\"flex action-button justify-center\" >{{ 'apptochome.register' | translate }}</a>\n </ng-container>\n\n </div>\n </ng-template>\n\n <!-- \n PROGRESS FUNCTIONALITY TEMPLATE\n Displays progress bar and rating button functionality\n -->\n <ng-template #progressFunctionality>\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row gap-4 text-sm\">\n <div class=\"flex-1 text-xs\">{{ 'apptocsinglepage.overallProgress' | translate }}</div>\n <div class=\"text-xs\" *ngIf=\"content?.completionPercentage > 0\"> {{ content?.completionPercentage }} %</div>\n </div>\n <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" [progress]=\"content?.completionPercentage\" [progressType]=\"'percentage'\"\n [customClassName]=\"'content-progress'\" >\n </ws-widget-content-progress>\n </div>\n </div>\n\n <ng-container *ngIf=\"content?.completionPercentage >= 50\">\n <button mat-stroked-button color=\"accent\" type=\"button\" class=\"rate-button\" (click)=\"openFeedbackDialog(content)\">\n <mat-icon class=\"nodtranslate\">star_purple500</mat-icon>\n <ng-container *ngIf=\"!userRating\">\n <div>{{ 'apptocsinglepage.rateNow' | translate }}</div>\n </ng-container>\n <ng-container *ngIf=\"userRating\">\n <div>{{ 'apptocsinglepage.editRating' | translate }}</div>\n </ng-container>\n </button>\n </ng-container>\n </div>\n </ng-template>\n\n <!-- \n MAIN CONTENT DISPLAY SECTION\n Banner, details, and content layout\n -->\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\" [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{ translateLabel(content?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n \n <div class=\"flex items-center\" *ngIf=\"cbPlanEndDate\">\n <div class=\"flex items-center due-tag text-xs leading-3\" [ngClass]=\"{'due-warning': cbPlanDuration === nsCardContentData.UPCOMING, 'due-overdue': cbPlanDuration === nsCardContentData.OVERDUE, 'due-success': cbPlanDuration === nsCardContentData.SUCCESS}\" >\n {{ 'common.dueBy' | translate }} - &nbsp;<span class=\"font-bold\">{{ cbPlanEndDate | date: 'd MMM, y'}}</span>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex items-center text-white mob-share\" *ngIf=\"canShare\">\n <mat-icon class=\"nodtranslate\" (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold nodtranslate\">{{ handleCapitalize(content?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words nodtranslate\" #contentSource [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">{{ 'cardcontentv2.by' | translate }} {{ content?.source }}</div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex gap-4 items-center\" *ngIf=\"content?.averageRating || content?.additionalTags?.length\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\" (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon class=\"nodtranslate\">grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}</div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' | translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' | translate }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && content?.sYS_INTERNAL_LAST_UPDATED_ON\">\n <div class=\"text-xs leading-4 source-text nodtranslate\">({{ 'apptoc.lastUpdatedOn' | translate }} {{ content?.sYS_INTERNAL_LAST_UPDATED_ON | date: 'MMM d, y' }})</div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\">\n <ng-container *ngIf=\"content?.primaryCategory === primaryCategory.BLENDED_PROGRAM &&\n selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails &&\n selectedBatchData?.content[0]?.enrollmentEndDate\">\n <div class=\"location-details mt-6\">\n <div class=\"flex items-center gap-4 pb-3\">\n <mat-icon class=\"location-icon nodtranslate\">\n location_on\n </mat-icon>\n <div class=\"loc-desc\">\n {{selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n <div class=\"flex items-center gap-4\">\n <mat-icon class=\"event-icon nodtranslate\">\n event</mat-icon>\n <div class=\"loc-desc\">\n Last date of enrollment - {{selectedBatchData?.content[0]?.enrollmentEndDate | date: 'dd/MM/yyyy'}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"recommendedCoursesId && !feedbackGiven\">\n <div class=\"px-4 py-3 mt-6 relevent-wrapper\">\n <div class=\"flex gap-4 items-center flex-wrap flex justify-center md:justify-start\">\n <img src=\"/assets/images/sakshamAI/lady-greet.svg\" alt=\"greet\" width=\"56.89\" height=\"64\">\n <div class=\"relevent-info\">\n <span class=\"font-bolder text-sm relevent-heading block mb-1\">{{ 'home.tocReleventHeading' | translate }}</span>\n <span class=\"relevent-subinfo font-normal text-sm block\">{{ 'home.tocReleventSubHeading' | translate }}</span>\n </div>\n <div class=\"flex flex-middle relevant-container\">\n <div class=\"flex flex-middle relevent-normal relevent-btn py-2 px-4 relevant-box\"\n (mouseenter)=\"isReleventBtnHovered = true\"\n (mouseleave)=\"isReleventBtnHovered = false\" (click)=\"handleAcceptRelevent()\">\n <img\n [src]=\"isReleventBtnHovered && !isRelevent ? SAKSHAMAI_ICON_LOADER : SAKSHAMAI_ICON_NORMAL\"\n alt=\"loader\" width=\"16\" height=\"16\" class=\"mr-2\">\n <span class=\"text-relevent ff-lato text-sm font-bold\">{{ 'home.relevent' | translate }}</span>\n </div>\n \n <div class=\"flex flex-middle no-button ml-8\" (click)=\"handleDeclineRelevent()\">\n <mat-icon class=\"mat-icon text-no mr-1 nodtranslate\">thumb_down</mat-icon>\n <span class=\"text-no ff-lato text-sm font-bold\">{{ 'home.no' | translate }}</span>\n </div> \n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"pb-4 lg:py-4\">\n <!-- Overall progress functionality -->\n <div class=\"mobile-progress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </div>\n <!-- Overall progress functionality -->\n\n <ws-widget-content-toc [content]=\"content\" [componentName]=\"'toc'\" [pathSet]=\"pathSet\" [tocStructure]=\"tocStructure\" \n [forPreview]=\"forPreview\" [isEnrolled]=\"batchData?.enrolled\" [resumeData]=\"resumeData\" [batchData]=\"selectedBatchData\" [skeletonLoader]=\"skeletonLoader\" \n [changeTab]=\"changeTab\" [hierarchyMapData]=\"tocSvc?.hashmap\" [selectedBatchData]=\"selectedBatchData\" [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\" [kparray]=\"kparray\"\n (playResumeForAI)=\"playResumeForAI()\" (enrollUserToAI)=\"enrollUserToAI()\" [contentReadData]=\"contentReadData\"></ws-widget-content-toc>\n <div class=\"mob-tip-for-learner\">\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n </div>\n </div>\n \n\n <div class=\"right-container\" >\n <!-- if needed sticky of right container add this to below div => #rightContainer -->\n <div class=\"right-content\">\n <div class=\"right-content-inner\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\" [ngStyle]=\"{\n 'background-image': 'url(' + content?.posterImage + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\" [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-between\" [ngClass]=\"{'justify-between': scrolled, 'justify-end': !scrolled}\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\" *ngIf=\"scrolled\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ translateLabel(content?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!content?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{ translateLabel(content?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div (click)=\"onClickOfShare()\" class=\"flex flex-row items-center justify-end gap-2 share-tag\" *ngIf=\"canShare && !forPreview && (domainConfService?.isFeatureByPageEnabled('toc','shareToc'))\">\n <mat-icon class=\"nodtranslate\">share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold\">{{ handleCapitalize(content?.name) }}\n </div>\n <div class=\"text-sm source-text font-semibold break-words\" #contentSource [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{content?.source}}\">{{ 'cardcontentv2.by' | translate }} {{ content?.source }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n <div class=\"flex flex-col gap-4 p-5 border-bottom\">\n <div class=\"flex flex-col gap-4\" *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n <ng-container *ngIf=\"timer && timer.days >= 0 && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 batch-timer\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container *ngIf=\"!mobile1200 && preAssessmentCompletionStatus\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\" [analytics]=\"analytics\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'68px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"content?.isInIntranet && showIntranetMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>\n <ng-container >{{ 'apptochome.viewedInIntranet' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showInstructorLedMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container >{{ 'apptochome.notAvailableOnline' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showStart.msg === 'youtubeForbidden'\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>&nbsp;\n <ng-container >{{ 'apptochome.youtubeContentBlocked' | translate }}</ng-container>\n </div>\n <div *ngIf=\"showBtn\">\n <a href=\"{{ cscmsUrl }}\" target=\"_blank\" class=\"flex action-button justify-center\">\n {{ 'apptochome.applyForPhysicalTraining' | translate }}</a>\n </div>\n\n <!-- Overall progress functionality -->\n <ng-container *ngIf=\"content?.completionStatus <= 2 && isBatchInProgress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </ng-container>\n <!-- Overall progress functionality -->\n\n <!-- <div *ngIf=\"resumeData && !userRating\"> -->\n <!-- <ws-app-karmapoints-panel [btntype]=\"'Rate this course'\" [data]=\"kparray\"\n [pCategory]=\"content?.primaryCategory\"></ws-app-karmapoints-panel> -->\n <!-- </div> -->\n\n <!-- <div *ngIf=\"resumeData && userRating\">\n <ws-app-karmapoints-panel [btntype]=\"'Edit rating'\" [data]=\"kparray\"\n [pCategory]=\"content?.primaryCategory\"></ws-app-karmapoints-panel>\n </div> -->\n\n <ng-container *ngIf=\"actionBtnStatus !== 'wait' && content?.status !== 'Deleted' && content?.status !== 'Expired'\">\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </ng-container>\n </div>\n\n <div class=\"karma-points-div\">\n <ws-widget-karma-points [data]=\"kparray\" (clickClaimKarmaPoints)=\"onClickOfClaim($event)\" [content] = \"content\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"></ws-widget-karma-points>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-wrap gap-6\">\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'40px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\" [showInstructorLedMsg]=\"showInstructorLedMsg\" [contentReadData]=\"contentReadData\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col gap-8 p-5\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\" [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\" [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorDetails)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authors' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\" [photoUrl]=\"author?.photo || ''\"\n [name]=\"author?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n </div>\n <!-- <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(content?.creatorContacts)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.curators' | translate }}</div>\n <div class=\"flex flex-row gap-4\" *ngFor=\"let creator of handleParseJsonData(content?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\" [photoUrl]=\"author?.photo || ''\"\n [name]=\"creator?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creator?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.curator' | translate }}</div>\n </div>\n </div>\n </div> -->\n <div class=\"flex flex-col gap-3\" *ngIf=\"content?.source && (contentCreatorData && contentCreatorData?.length)\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let creator of contentCreatorData\">\n <div class=\"flex provider-logo-div\">\n <img *ngIf=\"content?.creatorLogo\" [src]=\"content?.creatorLogo\" alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!content?.creatorLogo\" class=\"mat-icon\" src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\" alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm word-break cursor-pointer\" *ngIf=\"content?.createdFor?.length\" (click)=\"raiseTelemeteryForProvider(content?.source, content?.createdFor[0])\"\n [routerLink]=\"['/app/learn/browse-by/provider', content?.source, content?.createdFor[0], 'micro-sites']\">{{ handleCapitalize(content?.source, 'source') }}\n </div>\n <div class=\"text-sm word-break\" *ngIf=\"!content?.createdFor?.length\">{{ handleCapitalize(content?.source, 'source') }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n\n \n\n </div>\n</div>\n\n <!-- Mobile enrollment button container -->\n <div class=\"mobile-enroll-div\" [ngClass]=\"{'bg-white': content?.primaryCategory === primaryCategory.BLENDED_PROGRAM }\">\n <ng-container *ngIf=\"content && content?.primaryCategory === primaryCategory.BLENDED_PROGRAM \">\n <div class=\"mb-2\" *ngIf=\"mobile1200 && !forPreview || isInIFrame; else authViewBtn\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\" [analytics]=\"analytics\"\n [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </div>\n </ng-container>\n <!-- Reuse enrollment functionality template for mobile -->\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </div>\n\n <ws-app-share-toc *ngIf=\"enableShare\" [rootOrgId]=\"rootOrgId\" [content]=\"content\" (resetEnableShare)=\"resetEnableShare($event)\"></ws-app-share-toc>\n</ng-container>\n\n<!-- Template for when no data is found -->\n<ng-template #noDataFound>\n <div class=\"error-not-found flex flex-wrapped margin-left-m margin-top-xl margin-right-m flex-col justify-center align-items-center text-center\">\n <div class=\"error-logo\">\n <div class=\"error-message ws-mat-primary-text font-weight-bold\" >\n The page you requested cannot be found\n </div>\n </div>\n </div>\n</ng-template>\n\n<!-- Authentication view templates -->\n<ng-template #authView>{{'apptochome.view' | translate}}</ng-template>\n\n<ng-template #authViewBtn i18n>\n <a (click)=\"raiseTelemetryForPublic()\" [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\" [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n {{'apptochome.view' | translate}}\n </a>\n</ng-template>\n\n<ng-template #authViewForInviteOnlyAssessment>\n <ng-container\n *ngIf=\"forPreview && content?.courseCategory === 'Invite-Only Assessment'\"> \n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"> \n <ng-container>{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n</ng-template>\n", styles: [".source-text{color:#ffffffb3}.preenrolldone-btn{opacity:1;color:#1d8923;font-family:Lato-Bold,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:2px solid #1D8923;cursor:pointer;height:40px;box-sizing:border-box}.preenrolldone-btn img{margin-left:8px;margin-top:-2px}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{position:absolute;z-index:10;top:132px;padding-bottom:1rem}.right-container .right-content-inner{background-color:#fff;border-radius:12px;width:384px;margin-bottom:1rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.right-container .view-more:hover{background-color:#dcdfe5}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#000000de;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.mob-tip-for-learner{display:none}@media screen and (max-width: 1000px){.mob-tip-for-learner{display:block;width:100%;padding:0 16px;overflow:hidden;box-sizing:border-box}}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto;box-sizing:border-box;height:40px;line-height:24px!important}.rate-button{color:#000000de!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button,.mobile-enroll-div .preenrolldone-btn{min-width:320px;max-width:400px;margin:auto}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#0074b6!important}.tab:focus{outline:1px solid!important}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.blue-border{border:2px solid #0074b6!important}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}.location-details{background-color:#1b4ca114;padding:16px;border-radius:4px}.location-details .location-icon,.location-details .event-icon{color:#1b4ca1;height:20px;width:14px;font-size:22px}.location-details .loc-desc{font-family:Lato;font-weight:700;font-size:14px;line-height:20px;letter-spacing:.25}.location-details .mat-icon{overflow:visible!important}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.relevent-wrapper{background:#1b4ca129;border-radius:12px}.relevent-wrapper .relevent-info{max-width:400px;margin-right:auto}.relevent-wrapper .relevent-info .relevent-heading{font-family:Montserrat;line-height:17.07px;font-weight:600;color:#000!important}.relevent-wrapper .relevent-info .relevent-subinfo{font-family:Lato;line-height:16.8px;color:#545454}.relevent-normal.relevent-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#276de5;background-color:#fff;border-radius:21px;text-decoration:none;overflow:hidden;transition:all .3s ease-in-out}.relevent-normal.relevent-btn:hover{box-shadow:0 1px 10px #276de599}.relevent-normal.relevent-btn{cursor:pointer}.relevent-normal.relevent-btn:before{content:\"\";position:absolute;inset:0;padding:2px 2.5px;border-radius:21px;background:linear-gradient(89.96deg,#f3962f .04%,#276de5 99.96%);-webkit-mask:linear-gradient(white,white) content-box,linear-gradient(white,white);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease-in-out;cursor:pointer}.relevent-normal.relevent-btn:hover:before{opacity:1}.relevant-container{width:max-content}.no-button{opacity:1;transform:scale(1);transition:opacity .3s ease-in-out,transform .3s ease-in-out;color:#1b4ca1;cursor:pointer}\n"] }]
2209
+ }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.WidgetContentService }, { type: i3.AppTocService }, { type: i4.LoggerService }, { type: i4.ConfigurationsService }, { type: i5.DomSanitizer }, { type: i6.AccessControlService }, { type: i7.MatLegacySnackBar }, { type: i8.MatLegacyDialog }, { type: i9.MobileAppsService }, { type: i4.UtilityService }, { type: i10.ActionService }, { type: i11.ViewerUtilService }, { type: i12.RatingService }, { type: i4.TelemetryService }, { type: i13.TranslateService }, { type: i4.MultilingualTranslationsService }, { type: i4.EventService }, { type: i7.MatLegacySnackBar }, { type: i14.LoadCheckService }, { type: i15.HandleClaimService }, { type: i16.ResetRatingsService }, { type: i17.TimerService }, { type: i4.WidgetEnrollService }, { type: i18.WidgetContentLibService }, { type: i4.DataTransferService }, { type: i19.MatSnackBar }, { type: i18.WidgetUserServiceLib }, { type: i20.NetCoreService }, { type: i4.DomainConfService }, { type: undefined, decorators: [{
2209
2210
  type: Inject,
2210
2211
  args: ['environment']
2211
2212
  }] }]; }, propDecorators: { forPreview: [{
@@ -2226,4 +2227,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
2226
2227
  type: HostListener,
2227
2228
  args: ['window:scroll', ['$event']]
2228
2229
  }] } });
2229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1ob21lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9jb21wb25lbnRzL2FwcC10b2MtaG9tZS9hcHAtdG9jLWhvbWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1ob21lL2FwcC10b2MtaG9tZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFBYyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FDdEUsTUFBTSxlQUFlLENBQUE7QUFFdEIsT0FBTyxFQUF1QyxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNwRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFHL0QsT0FBTyxFQUE0QixPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDeEQsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNqRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7QUFDekIsMkJBQTJCO0FBQzNCLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQTtBQUV0QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUE7QUFDM0IsT0FBTyxjQUFjLE1BQU0sNkJBQTZCLENBQUE7QUFFeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBRWhFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFBO0FBRXhFLE9BQU8sRUFJZ0MsUUFBUSxHQUM5QyxNQUFNLHNCQUFzQixDQUFBO0FBRzdCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQVdyRCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxvRUFBb0UsQ0FBQTtBQUNwSCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSx1RkFBdUYsQ0FBQTtBQU10SSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUNBQWlDLENBQUE7QUFHL0QsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sd0VBQXdFLENBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFyQzNILEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUE7QUF1QzVCLE1BQU0sQ0FBTixJQUFZLFNBSVg7QUFKRCxXQUFZLFNBQVM7SUFDbkIsOENBQWlDLENBQUE7SUFDakMsc0RBQXlDLENBQUE7SUFDekMsOENBQWlDLENBQUE7QUFDbkMsQ0FBQyxFQUpXLFNBQVMsS0FBVCxTQUFTLFFBSXBCO0FBRUQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFZLEVBQUUsR0FBb0IsRUFBRSxFQUFFO0lBQzFELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUMzQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3pCLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUM1QiwyQkFBMkI7WUFDM0IsY0FBYyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFBO1NBQ3JFO1FBQ0QsT0FBTyxjQUFjLENBQUE7UUFDckIsMkJBQTJCO0lBQzdCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUNSLENBQUMsQ0FBQTtBQUNELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFBO0FBUzlCLE1BQU0sT0FBTyxtQkFBbUI7SUFrTDlCLFlBQVk7UUFDVixNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFBO1FBQ3ZDLElBQUksWUFBWSxJQUFJLElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxFQUFFO1lBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFBO1NBQ25CO2FBQU07WUFDTCxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQTtTQUNwQjtRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ2hFLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFBO2FBQ3ZEO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFBO2FBQ3REO1NBQ0Y7UUFFRCw4Q0FBOEM7UUFDOUMsSUFBSSxNQUFNLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLEVBQUU7WUFDbEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7U0FDckI7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFBO1NBQ3RCO0lBQ0gsQ0FBQztJQUVELFlBQ1UsS0FBcUIsRUFDckIsTUFBYyxFQUNkLFVBQWdDLEVBQ2pDLE1BQXFCLEVBQ3BCLFNBQXdCLEVBQ3hCLFNBQWdDLEVBQ2hDLFlBQTBCLEVBQzFCLG9CQUEwQyxFQUMxQyxRQUFxQixFQUNyQixNQUFpQixFQUNqQixhQUFnQyxFQUNoQyxVQUEwQjtJQUNsQywrQ0FBK0M7SUFDdkMsU0FBd0IsRUFDeEIsU0FBNEIsRUFDNUIsU0FBd0IsRUFDeEIsZ0JBQWtDLEVBQ2xDLFNBQTJCLEVBQzNCLGdCQUFpRCxFQUNqRCxNQUFvQixFQUNwQixXQUF3QixFQUN4QixnQkFBa0MsRUFDbEMsa0JBQXNDLEVBQ3RDLG1CQUF3QyxFQUN4QyxZQUEwQixFQUMzQixTQUE4QixFQUM5QixhQUFzQyxFQUN0QyxlQUFvQyxFQUNuQyxjQUE4QixFQUM5QixjQUFvQyxFQUNyQyxjQUE4QixFQUNkLFdBQWdCO1FBL0IvQixVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsZUFBVSxHQUFWLFVBQVUsQ0FBc0I7UUFDakMsV0FBTSxHQUFOLE1BQU0sQ0FBZTtRQUNwQixjQUFTLEdBQVQsU0FBUyxDQUFlO1FBQ3hCLGNBQVMsR0FBVCxTQUFTLENBQXVCO1FBQ2hDLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBc0I7UUFDMUMsYUFBUSxHQUFSLFFBQVEsQ0FBYTtRQUNyQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLGtCQUFhLEdBQWIsYUFBYSxDQUFtQjtRQUNoQyxlQUFVLEdBQVYsVUFBVSxDQUFnQjtRQUUxQixjQUFTLEdBQVQsU0FBUyxDQUFlO1FBQ3hCLGNBQVMsR0FBVCxTQUFTLENBQW1CO1FBQzVCLGNBQVMsR0FBVCxTQUFTLENBQWU7UUFDeEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWlDO1FBQ2pELFdBQU0sR0FBTixNQUFNLENBQWM7UUFDcEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyx1QkFBa0IsR0FBbEIsa0JBQWtCLENBQW9CO1FBQ3RDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDM0IsY0FBUyxHQUFULFNBQVMsQ0FBcUI7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQXlCO1FBQ3RDLG9CQUFlLEdBQWYsZUFBZSxDQUFxQjtRQUNuQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsbUJBQWMsR0FBZCxjQUFjLENBQXNCO1FBQ3JDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQXhPdkMsU0FBSSxHQUFHLEtBQUssQ0FBQTtRQUNaLGNBQVMsR0FBRyxLQUFLLENBQUE7UUFDakIsbUJBQWMsR0FBRyxJQUFJLENBQUE7UUFDckIsWUFBTyxHQUErQixJQUFJLENBQUE7UUFDMUMsbUJBQWMsR0FBRyxLQUFLLENBQUE7UUFDdEIsWUFBTyxHQUE4QixJQUFJLENBQUE7UUFDekMsb0JBQWUsR0FBOEIsSUFBSSxDQUFBO1FBQ2pELGNBQVMsR0FBb0MsSUFBSSxDQUFBO1FBQ2pELGVBQVUsR0FBUSxJQUFJLENBQUE7UUFDdEIsc0JBQWlCLEdBQVEsYUFBYSxDQUFDLFNBQVMsQ0FBQTtRQUNoRCxjQUFTLEdBQXdDLElBQUksQ0FBQTtRQUNyRCx5QkFBb0IsR0FBa0IsSUFBSSxDQUFBO1FBRTFDLHNCQUFpQixHQUF3QixJQUFJLENBQUE7UUFDN0MsZUFBVSxHQUFtQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQTtRQUN0RSx3QkFBbUIsR0FBRyxLQUFLLENBQUE7UUFDM0IsV0FBTSxHQUFHLEtBQUssQ0FBQTtRQUNkLGVBQVUsR0FBRyxLQUFLLENBQUE7UUFJVCxlQUFVLEdBQVEsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUNqSCx5REFBeUQ7UUFDekQsY0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQTtRQUM3RCxvQkFBZSxHQUFxRDtZQUNsRSxVQUFVLEVBQUUsZUFBZTtZQUMzQixhQUFhLEVBQUUsZUFBZTtZQUM5QixVQUFVLEVBQUU7Z0JBQ1YsU0FBUyxFQUFFLGdCQUFnQjthQUM1QjtTQUNGLENBQUE7UUFDRCxhQUFRLEdBQUcsS0FBSyxDQUFBO1FBQ2hCLG9CQUFlLEdBQW9CO1lBQ2pDLFdBQVcsRUFBRSxtQkFBbUI7WUFDaEMsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxZQUFZO2FBQ25CO1NBQ0YsQ0FBQTtRQUNELGNBQVMsR0FBUSxJQUFJLENBQUE7UUFDckIsb0JBQWUsR0FBRyxTQUFTLENBQUMsZ0JBQWdCLENBQUE7UUFDNUMsbUJBQWMsR0FBRyxTQUFTLENBQUMsZUFBZSxDQUFBO1FBQzFDLDJCQUFzQixHQUFHLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQTtRQUN6RCxxQkFBZ0IsR0FBRyxJQUFJLENBQUE7UUFDdkIsd0JBQW1CLEdBQUcsS0FBSyxDQUFBO1FBRTNCLFNBQUksR0FBb0IsSUFBSSxDQUFBO1FBQzVCLDBCQUFxQixHQUFHLEtBQUssQ0FBQTtRQUM3QixvQkFBZSxHQUFHLEtBQUssQ0FBQTtRQUN2QixpQkFBWSxHQUFrQyxJQUFJLENBQUE7UUFDbEQsbUJBQWMsR0FBeUQsRUFBRSxDQUFBO1FBQ3pFLFlBQU8sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFBO1FBRXJCLG1CQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDbEQsb0JBQWUsR0FBRyxVQUFVLENBQUE7UUFFNUIscUJBQWdCLEdBQUcsR0FBRyxDQUFBO1FBQ3RCLHFCQUFnQixHQUFHLEVBQUUsQ0FBQTtRQUVyQixzQkFBaUIsR0FBd0IsSUFBSSxDQUFBO1FBQzdDLDBCQUFxQixHQUF3QixJQUFJLENBQUE7UUFDakQsMkJBQXNCLEdBQXdCLElBQUksQ0FBQTtRQUVsRCxpQkFBWSxHQUFHLElBQUksa0JBQWtCLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQTtRQUM5RCxvQkFBZSxHQUFHLENBQUMsQ0FBQTtRQUNuQixjQUFTLEdBQXFCLElBQUksQ0FBQTtRQUNsQyxjQUFTLEdBQUcsVUFBVSxDQUFBO1FBQ3RCLGVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQTtRQUMzRCw0QkFBdUIsR0FBd0IsSUFBSSxDQUFBO1FBRW5ELG9CQUFlLEdBQUcsTUFBTSxDQUFBO1FBQ3hCLDRCQUF1QixHQUFHLEtBQUssQ0FBQTtRQUMvQix3QkFBbUIsR0FBRyxLQUFLLENBQUE7UUFDM0Isc0JBQWlCLEdBQWdFLElBQUksQ0FBQTtRQUNyRixtQkFBYyxHQUFnRSxJQUFJLENBQUE7UUFDbEYsdUJBQWtCLEdBQW9DLElBQUksQ0FBQTtRQUMxRCw2QkFBd0IsR0FBZ0IsSUFBSSxHQUFHLENBQUM7WUFDOUMsMEJBQTBCO1lBQzFCLHNCQUFzQjtZQUN0QixhQUFhO1NBQ2QsQ0FBQyxDQUFBO1FBQ0Ysc0JBQWlCLEdBQW1DLElBQUksQ0FBQTtRQUN4RCxtQkFBYyxHQUEyQixJQUFJLENBQUE7UUFDN0MsK0JBQTBCLEdBQWlCLE1BQU0sQ0FBQTtRQUNqRCx3QkFBbUIsR0FBRyxLQUFLLENBQUE7UUFDM0IsbUJBQWMsR0FBRyxLQUFLLENBQUE7UUFHdEIsaUJBQVksR0FBRyxFQUFFLENBQUE7UUFDakIscUJBQWdCLEdBQUcsS0FBSyxDQUFBO1FBQ3hCLG9CQUFlLEdBQUcsS0FBSyxDQUFBO1FBQ3ZCLHNCQUFpQixHQUFHLEtBQUssQ0FBQTtRQUN6QixvQkFBZSxHQUFHLEtBQUssQ0FBQTtRQUd2Qix3QkFBbUIsR0FBRyxDQUFDLENBQUE7UUFJdkIsZ0JBQVcsR0FBRyxFQUFFLENBQUE7UUFDaEIsYUFBUSxHQUFHLEVBQUUsQ0FBQTtRQUNiLFlBQU8sR0FBRyxLQUFLLENBQUE7UUFNZixZQUFPLEdBQVEsRUFBRSxDQUFBO1FBQ2pCLHFCQUFnQixHQUFHLEtBQUssQ0FBQTtRQUN4QixpQkFBWSxHQUFHLEtBQUssQ0FBQTtRQUNwQixnQkFBVyxHQUFHLEtBQUssQ0FBQTtRQUVuQixjQUFTLEdBQUcsS0FBSyxDQUFBO1FBQ2pCLHFCQUFnQixHQUFHLEtBQUssQ0FBQTtRQUN4Qix5QkFBb0IsR0FBRyxLQUFLLENBQUE7UUFRNUIsbUJBQWMsR0FBRyxLQUFLLENBQUE7UUFDdEIsZ0JBQVcsR0FBRyxDQUFDLENBQUE7UUFDZixXQUFNLEdBQUc7WUFDUCxTQUFTLEVBQUUsQ0FBQztZQUNaLFNBQVMsRUFBRSxDQUFDO1NBQ2IsQ0FBQTtRQUNELGFBQVEsR0FBRyxLQUFLLENBQUE7UUFDaEIsWUFBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7UUFDbkIsYUFBUSxHQUFHLEtBQUssQ0FBQTtRQUNoQixnQkFBVyxHQUFHLEtBQUssQ0FBQTtRQU1uQix1QkFBa0IsR0FBUSxFQUFFLENBQUE7UUFDNUIsOEJBQThCO1FBQzlCLCtCQUErQjtRQUV2QixvQkFBZSxHQUFHLElBQUksT0FBTyxFQUFPLENBQUE7UUFHNUMseUJBQW9CLEdBQUcsS0FBSyxDQUFBO1FBQzVCLDBCQUFxQixHQUFHLHNDQUFzQyxDQUFBO1FBQzlELDBCQUFxQixHQUFHLGdEQUFnRCxDQUFBO1FBQ3hFLHlCQUFvQixHQUFHLEVBQUUsQ0FBQTtRQUV6QixrQ0FBNkIsR0FBRyxLQUFLLENBQUE7UUFDckMsZ0JBQVcsR0FBRyxLQUFLLENBQUE7UUFFbkIsaUJBQVksR0FBRztZQUNiLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1lBQ3JDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDN0MsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRTtZQUM1QyxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtZQUN6QyxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFO1lBQ2xELEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO1lBQ3pDLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7WUFDakQsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtZQUM3QyxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1lBQ2pELEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUU7WUFDN0MsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7WUFDdEMsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRTtZQUM5QyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1lBQzlDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFO1lBQ3RDLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFO1lBQ3pDLEVBQUUsSUFBSSxFQUFFLDZCQUE2QixFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUU7WUFDMUQsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTtZQUNoRCxFQUFFLElBQUksRUFBRSx1QkFBdUIsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFO1lBQ3BELEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDNUMsRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRTtZQUNuRCxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFO1lBQy9DLEVBQUUsSUFBSSxFQUFFLHVCQUF1QixFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUU7WUFDbEQsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7U0FDekMsQ0FBQTtRQTREQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFBO1FBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUE7UUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFBO1FBQ2hDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsK0JBQStCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQzdELElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQzNDLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ25DLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUUsQ0FBQTtZQUNyRCxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtTQUN6QjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDaEUscUNBQXFDO1lBQ3JDLElBQUksUUFBUSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDekMsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDZCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBUSxDQUFBO29CQUMvRCxJQUFJLFVBQVUsRUFBRTt3QkFDZCxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE1BQWEsQ0FBQTtxQkFDcEU7Z0JBQ0gsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO2FBQ1I7WUFFRCxJQUFJLFFBQVEsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsRUFBRTtnQkFDL0MsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBUSxDQUFBO2dCQUNyRSxJQUFJLFVBQVUsRUFBRTtvQkFDZCxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLE1BQWEsQ0FBQTtpQkFDcEU7YUFDRjtRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLFVBQWUsRUFBRSxFQUFFO1lBQ25FLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDakMsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3hDLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7UUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUM3RCxJQUFJLElBQUksRUFBRTtnQkFDUixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFBRTtvQkFDM0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQ25DLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUUsQ0FBQTtvQkFDckQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUE7aUJBQ3pCO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUMvRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFBO1lBQy9FLCtEQUErRDtTQUVoRTtRQUVELElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1FBQ3hCLHdDQUF3QztRQUV4QyxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDbEYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQTtRQUNwQyxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDMUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUE7UUFDOUIsQ0FBQyxDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFDM0csSUFBSTtZQUNGLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFBO1NBQzdDO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQTtTQUN4QjtRQUVELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNkLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFBO1lBQzFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQVUsRUFBRSxFQUFFO2dCQUN0RSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtvQkFDN0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUE7b0JBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUM1RSxJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFBO3dCQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQTt3QkFDekQsSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUE7b0JBQ3pDLENBQUMsRUFBRSxDQUFDLEtBQXdCLEVBQUUsRUFBRTt3QkFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUU7NEJBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsa0RBQWtELENBQUMsQ0FBQTt5QkFDMUU7b0JBQ0gsQ0FBQyxDQUFDLENBQUE7b0JBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFBO29CQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUE7b0JBQy9CLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTt3QkFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO3dCQUNwQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO3dCQUNwRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7d0JBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO3dCQUM3QyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQTtxQkFDNUI7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7cUJBRWhDO29CQUNELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUE7b0JBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFBO29CQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLEtBQUssQ0FBQTtvQkFDN0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQTtvQkFDekUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQTtvQkFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQTtvQkFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQTtvQkFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQTtvQkFDekMsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTt3QkFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRTs0QkFDN0UsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQTs0QkFDakMsS0FBSyxNQUFNLENBQUMsSUFBSSxjQUFjLEVBQUU7Z0NBQzlCLElBQUksQ0FBQyxDQUFDLFNBQVMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtvQ0FDN0QsSUFBSSxDQUFDLGtCQUFrQixHQUFHLENBQUMsQ0FBQTtvQ0FDM0IsTUFBSztpQ0FDTjs2QkFDRjt3QkFDSCxDQUFDLENBQUMsQ0FBQTtxQkFDSDtvQkFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO2lCQUNwQjtZQUNILENBQUMsQ0FBQyxDQUFBO1NBQ0g7UUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsQ0FBQTtRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTtZQUM5QyxJQUFJLENBQUMsZUFBZSxHQUFHLFFBQVEsSUFBSSxVQUFVLENBQUE7UUFDL0MsQ0FBQyxDQUFDLENBQUE7UUFFRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQy9ELEdBQUcsRUFBRTtZQUNILElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO1lBQ3hCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0JBQzNGLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO2FBQzdCO1FBQ0gsQ0FBQyxFQUNELEdBQUcsRUFBRTtZQUNILHVDQUF1QztZQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLDRCQUE0QixDQUFDLENBQUE7UUFDM0MsQ0FBQyxDQUNGLENBQUE7UUFFRCxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQ3BFLEdBQUcsRUFBRTtZQUNILElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLEVBQUU7Z0JBQzNGLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO2FBQzdCO1FBQ0gsQ0FBQyxFQUNELEdBQUcsRUFBRTtZQUNILHVDQUF1QztZQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxDQUFDLENBQUE7UUFDL0MsQ0FBQyxDQUNGLENBQUE7UUFFRCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQTtRQUNwRCxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsS0FBSyxJQUFJLGNBQWMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUU7WUFDcEYsSUFBSSxDQUFDLFlBQVksR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFBO1NBQzNEO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFO1lBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtTQUN0RTtRQUVELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFDLFVBQVUsRUFBQyxFQUFFO1lBQzdFLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDN0MsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUNqRCxNQUFNLG9CQUFvQixHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtZQUMvRCxJQUFJLFNBQVMsSUFBSSxXQUFXLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO2dCQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTthQUMvQjtZQUNELElBQUksb0JBQW9CLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQTtnQkFDaEQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLDhCQUE4QixDQUFDLG9CQUFvQixDQUFDLENBQUMsU0FBUyxFQUFFLENBQUE7Z0JBQzNHLElBQUksUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7b0JBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLEtBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO2lCQUN2RzthQUNGO1lBQ0QsSUFBSSxvQkFBb0IsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLG9CQUFvQixDQUFBO2dCQUNoRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsOEJBQThCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQTtnQkFDM0csSUFBSSxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtvQkFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLFNBQVMsS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7aUJBQ3ZHO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRTtZQUNyQyxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsQ0FBQTtZQUM1RixJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FDL0QsNEJBQTRCLENBQzdCLENBQUE7U0FDRjtRQUVELElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFBO1FBQzlCLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxXQUFrQixFQUFFLEVBQUU7WUFDakYsSUFBSSxXQUFXLFlBQVksYUFBYSxFQUFFO2dCQUN4QyxJQUFJLENBQUMseUJBQXlCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2FBQ2hEO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFFRixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUE7WUFDNUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFBO2FBQ2pGO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQ2xFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFBO2FBQ3BCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFBO2FBQ3JCO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHO2dCQUN2QixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO2dCQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJO2dCQUM5QixXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXO2dCQUNyQyxlQUFlLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlO2dCQUM3QyxJQUFJLEVBQUUsUUFBUTthQUNmLENBQUE7WUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHO2dCQUNwQixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO2dCQUNsQyxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJO2dCQUM5QixXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXO2dCQUNyQyxlQUFlLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlO2FBQzlDLENBQUE7U0FDRjtRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDO1lBQ25CLFNBQVMsQ0FBQyxlQUFlLENBQUMsZ0JBQWdCO1lBQzFDLFNBQVMsQ0FBQyxlQUFlLENBQUMscUJBQXFCO1lBQy9DLFNBQVMsQ0FBQyxlQUFlLENBQUMsaUJBQWlCO1lBQzNDLFNBQVMsQ0FBQyxlQUFlLENBQUMsbUJBQW1CO1NBQzlDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDdkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7WUFDcEIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUE7YUFDdEQ7U0FDRjtJQUdILENBQUM7SUFFRCwyQ0FBMkM7SUFDM0Msa0ZBQWtGO0lBQ2xGLHNFQUFzRTtJQUN0RSxJQUFJO0lBRUosbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7Z0JBQ3ZELElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUU7b0JBQ3JCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFBO29CQUMvQixJQUFJLElBQUksRUFBRTt3QkFDUixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLENBQUE7cUJBQzdFO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUE7U0FDSDtJQUNILENBQUM7SUFFRCw0QkFBNEI7UUFDMUIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDeEQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQTtZQUMxQyxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsb0JBQW9CLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUU7Z0JBQ25GLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO2dCQUN2RSxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO2dCQUNoRSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO2dCQUN0RCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsY0FBYyxLQUFLLFlBQVksQ0FBQTtnQkFDM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUE7Z0JBQ2hDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQTthQUNyRDtTQUNGO0lBQ0gsQ0FBQztJQUVELGdCQUFnQixDQUFDLEdBQVE7UUFDdkIsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMvRCxDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDaEQsSUFBSSxRQUFRLEVBQUU7WUFDWixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1lBQ3hDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQTtZQUM5QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUU7Z0JBQ2QsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFBO2dCQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUE7Z0JBQ25DLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFBO2dCQUN6RCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFBO2dCQUN4RSxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsRUFBRTtvQkFDcEYsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQTtnQkFDdEUsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLEtBQUssUUFBUSxFQUFFO29CQUNuRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQTtvQkFDeEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7b0JBQzVELElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsRUFBRTt3QkFDdEMsTUFBTSxVQUFVLEdBQUc7NEJBQ2pCLE9BQU8sRUFBRTtnQ0FDUCxPQUFPLEVBQUU7b0NBQ1AsV0FBVyxFQUFFLFFBQVE7b0NBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMsUUFBUTtpQ0FDekI7NkJBQ0Y7eUJBQ0YsQ0FBQTt3QkFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFOzRCQUN0RSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO2dDQUNyQixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFBO2dDQUN0QixJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUU7b0NBQ2YsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUU7d0NBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO3dDQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtxQ0FDdEI7eUNBQU07d0NBQ0wsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUE7cUNBQ3hCO2lDQUNGO3FDQUFNO29DQUNMLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO2lDQUN4Qjs2QkFDRjtpQ0FBTTtnQ0FDTCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQTs2QkFDeEI7d0JBQ0gsQ0FBQyxDQUFDLENBQUE7cUJBQ0g7aUJBQ0Y7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVELDBCQUEwQixDQUFDLFlBQW9CLEVBQUUsVUFBa0I7UUFDakUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FDaEM7WUFDRSxJQUFJLEVBQUUsT0FBTztZQUNiLEVBQUUsRUFBRSxjQUFjO1NBQ25CLEVBQ0Q7WUFDRSxFQUFFLEVBQUUsWUFBWTtZQUNoQixJQUFJLEVBQUUsVUFBVTtTQUNqQixFQUNEO1lBQ0UsU0FBUyxFQUFFLGNBQWM7WUFDekIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPO1NBQzlDLENBQUMsQ0FBQTtJQUVOLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FDaEM7WUFDRSxJQUFJLEVBQUUsT0FBTztZQUNiLE9BQU8sRUFBRSxtQkFBbUI7WUFDNUIsRUFBRSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ2xCLEVBQ0Q7WUFDRSxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDakIsSUFBSSxFQUFFLFFBQVE7U0FDZixFQUNEO1lBQ0UsU0FBUyxFQUFFLGdCQUFnQjtZQUMzQixNQUFNLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLFdBQVc7U0FDbEQsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELGNBQWMsQ0FBQyxLQUFVO1FBQ3ZCLDRCQUE0QjtRQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ2xCLE1BQU0sT0FBTyxHQUFHO1lBQ2QsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVU7WUFDOUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3hCLENBQUE7UUFDRCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUE7UUFDckIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUMvRCw0QkFBNEI7WUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQTtZQUNyQixJQUFJLENBQUMsWUFBWSxDQUFDLHdDQUF3QyxDQUFDLENBQUE7WUFDM0QsK0JBQStCO1lBQy9CLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO1FBQzVCLENBQUMsRUFBRSxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ2hCLDRCQUE0QjtZQUM1QixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsdUJBQXVCLENBQUMsQ0FBQTtRQUM1QyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUE7WUFDMUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFBO1NBQy9EO1FBQ0QseUJBQXlCO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRTthQUNyRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQzthQUNyQyxTQUFTLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQTtRQUNyQixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxRQUFRLEVBQUU7Z0JBQ3RDLE1BQU0sU0FBUyxHQUFHLG1CQUFtQixDQUFBO2dCQUNyQyxNQUFNLE1BQU0sR0FBRztvQkFDYixDQUFDLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLO2lCQUMxQixDQUFBO2dCQUNELDJDQUEyQztnQkFDM0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFBO2FBQzFJO2lCQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssb0JBQW9CLEVBQUU7Z0JBQ3pELE1BQU0sUUFBUSxHQUFHLG1DQUFtQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFBO2dCQUM1RSw0Q0FBNEM7Z0JBQzVDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQTthQUNsSTtpQkFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtnQkFDOUMsTUFBTSxRQUFRLEdBQUcsaUNBQWlDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUE7Z0JBQzFFLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUE7YUFDdkg7aUJBQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxrQkFBa0IsRUFBRTtnQkFDdkQsTUFBTSxRQUFRLEdBQUcsa0RBQWtELENBQUE7Z0JBQ25FLDRDQUE0QztnQkFDNUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFBO2FBQzlIO2lCQUFNLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssb0JBQW9CLEVBQUU7Z0JBQ3pELE1BQU0sUUFBUSxHQUFHLDhCQUE4QixDQUFBO2dCQUMvQyw0Q0FBNEM7Z0JBQzVDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQTthQUNqSTtpQkFBTTtnQkFDTCwyQ0FBMkM7Z0JBQzNDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQTthQUN4STtTQUNGO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJO1lBQ0YsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNqQixrREFBa0Q7Z0JBQ2xELFFBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQ3JELEdBQUcsRUFBRSxFQUFFO29CQUNQLFFBQVEsRUFBRSxRQUFRO2lCQUNuQixDQUFDLENBQUE7YUFDSDtTQUNGO1FBQUMsT0FBTyxDQUFDLEVBQUUsR0FBRztJQUNqQixDQUFDO0lBRUQsSUFBSSxlQUFlO1FBQ2pCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsRUFBRTtZQUNyQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUE7U0FDOUQ7UUFDRCxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQjtnQkFDL0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDLGdCQUFnQixDQUFDLFFBQVE7bUJBQ2pFLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUI7bUJBQzdFLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0I7bUJBQzVFLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlO21CQUMzRSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsS0FBSyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsZUFBZTttQkFDM0UsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQzdELElBQUksVUFBVSxFQUFFO2dCQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTthQUNoRDtZQUNELE9BQU8sVUFBVSxDQUFBO1NBQ2xCO1FBQ0QsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUNoQyx5R0FBeUc7WUFDekcsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQTtZQUMzQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQTtZQUN6QyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFBO2dCQUM1Qyw2Q0FBNkM7Z0JBQzdDLHNEQUFzRDtnQkFDdEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUE7Z0JBQzFFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxhQUFhLEdBQUcsR0FBRyxDQUFBO2dCQUM5QyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxFQUFFO29CQUM1RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUE7b0JBQ3pFLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFBO29CQUMvRixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUE7b0JBQ3ZGLE9BQU8sQ0FBQyxHQUFHLElBQUksV0FBVyxLQUFLLFlBQVksT0FBTyxVQUFVLENBQUMsQ0FBQTtpQkFDOUQ7Z0JBQ0QsT0FBTyxJQUFJLENBQUE7YUFDWjtZQUNELE9BQU8sSUFBSSxDQUFBO1lBQ1gsa0ZBQWtGO1lBQ2xGLHVEQUF1RDtZQUN2RCxJQUFJO1lBQ0osK0VBQStFO1lBQy9FLGdCQUFnQjtZQUNoQixJQUFJO1lBQ0osMkRBQTJEO1lBQzNELDJDQUEyQztZQUMzQyxJQUFJO1lBQ0osdURBQXVEO1lBQ3ZELGtCQUFrQjtZQUNsQixNQUFNO1lBQ04sY0FBYztTQUNmO1FBQUMsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsaURBQWlEO1FBQ2pELDhEQUE4RDtRQUM5RCxtQ0FBbUM7UUFDbkMsMERBQTBEO1FBQzFELHFDQUFxQztRQUNyQyxvREFBb0Q7UUFDcEQsNEdBQTRHO1FBQzVHLG1CQUFtQjtRQUNuQixtRkFBbUY7UUFDbkYscUdBQXFHO1FBQ3JHLG9CQUFvQjtRQUNwQixnQ0FBZ0M7UUFDaEMsbURBQW1EO1FBQ25ELG1EQUFtRDtRQUNuRCxhQUFhO1FBQ2IsOERBQThEO1FBQzlELDBEQUEwRDtRQUMxRCw2REFBNkQ7UUFDN0QsbURBQW1EO1FBQ25ELHlDQUF5QztRQUN6Qyw2QkFBNkI7UUFDN0IsVUFBVTtRQUNWLFFBQVE7UUFDUixtQkFBbUI7UUFDbkIsTUFBTTtRQUNOLGlCQUFpQjtRQUNqQixpQkFBaUI7UUFFakIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsTUFBTSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtZQUNoQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFBO1lBQzNDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFBO1lBQ3pDLElBQUksS0FBSyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtnQkFDdEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUE7Z0JBQzVDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFBO2dCQUN4QyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7b0JBQ2hCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFBO29CQUMxRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtvQkFDcEQsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQTtvQkFDakMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFBO29CQUNyQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsR0FBRyxHQUFHLGFBQWEsQ0FBQTtvQkFDOUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFdBQVcsR0FBRyxHQUFHLENBQUE7b0JBQzFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO3dCQUNwRixPQUFPLElBQUksQ0FBQTtxQkFDWjtvQkFDRCxPQUFPLEtBQUssQ0FBQTtpQkFDYjtnQkFDRCxPQUFPLElBQUksQ0FBQTthQUNaO1lBQ0QsT0FBTyxLQUFLLENBQUE7U0FDYjtRQUNELE9BQU8sS0FBSyxDQUFBO0lBQ2QsQ0FBQztJQUVPLFFBQVEsQ0FBQyxJQUFVO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUNqRCxJQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUE7UUFDbkMsUUFBUSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3RCLEtBQUssUUFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUE7Z0JBQ3BFLE1BQUs7YUFDTjtZQUNELEtBQUssUUFBUSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDMUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUE7Z0JBQ3BFLE1BQUs7YUFDTjtZQUNELEtBQUssUUFBUSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxjQUFjLENBQUE7Z0JBQ3BFLE1BQUs7YUFDTjtZQUNELE9BQU8sQ0FBQyxDQUFDO2dCQUNQLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsY0FBYyxDQUFBO2dCQUNwRSxNQUFLO2FBQ047U0FDRjtRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDekIsK0JBQStCO1NBQ2hDO1FBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLHVCQUF1QixDQUNuRCxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtZQUMvQixDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVU7Z0JBQ2YsQ0FBQyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDbEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtZQUNyQixDQUFDLENBQUMsRUFBRSxDQUNQLENBQUE7UUFFRCxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQTtRQUN4QixJQUFJLENBQUMsWUFBWSxHQUFHO1lBQ2xCLFVBQVUsRUFBRSxDQUFDO1lBQ2IsTUFBTSxFQUFFLENBQUM7WUFDVCxPQUFPLEVBQUUsQ0FBQztZQUNWLGdCQUFnQixFQUFFLENBQUM7WUFDbkIsY0FBYyxFQUFFLENBQUM7WUFDakIsS0FBSyxFQUFFLENBQUM7WUFDUixHQUFHLEVBQUUsQ0FBQztZQUNOLE1BQU0sRUFBRSxDQUFDO1lBQ1QsT0FBTyxFQUFFLENBQUM7WUFDVixZQUFZLEVBQUUsQ0FBQztZQUNmLFNBQVMsRUFBRSxDQUFDO1lBQ1osSUFBSSxFQUFFLENBQUM7WUFDUCxLQUFLLEVBQUUsQ0FBQztZQUNSLFNBQVMsRUFBRSxDQUFDO1lBQ1osT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLEVBQUUsQ0FBQztZQUNWLGtCQUFrQixFQUFFLENBQUM7WUFDckIsY0FBYyxFQUFFLENBQUM7U0FDbEIsQ0FBQTtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQTtZQUM1QixJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUN4RyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNoRyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1lBQ2hGLEtBQUssTUFBTSxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtnQkFDeEMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDbkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUE7b0JBQzNCLE1BQUs7aUJBQ047YUFDRjtZQUVELG1CQUFtQjtZQUNuQixJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQTtZQUNqQyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQTtZQUNsQyxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUMvQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7U0FDdkI7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3hELElBQUksQ0FBQyxjQUFjLEdBQUcsR0FBRyxDQUFBO1FBQzNCLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUM3RSxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFBO2dCQUNqQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLGNBQWMsRUFBRTtvQkFDOUIsSUFBSSxDQUFDLENBQUMsU0FBUyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO3dCQUM3RCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFBO3dCQUMzQixNQUFLO3FCQUNOO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUE7U0FDSDtRQUVELG1CQUFtQjtRQUNuQixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUF1QixFQUFFLEVBQUU7WUFDbkUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQTtZQUM1QixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUE7WUFDZixJQUFJLEtBQUssRUFBRTtnQkFDVCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFO29CQUM5QixNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQTtpQkFDakQ7Z0JBRUQsTUFBTSxHQUFHLEdBQUc7b0JBQ1YsT0FBTyxFQUFFO3dCQUNQLE1BQU07d0JBQ04sUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO3dCQUN4QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87cUJBQ3ZCO2lCQUNGLENBQUE7Z0JBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRTtvQkFDekQsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUU7d0JBQ2hFLElBQUksQ0FBQyxTQUFTLEdBQUc7NEJBQ2YsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDOzRCQUNoQixRQUFRLEVBQUUsSUFBSTt5QkFDZixDQUFBO3dCQUNELElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO3dCQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTt3QkFDMUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ2xCLEVBQUUsRUFDRjs0QkFDRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUs7NEJBQ3RCLFdBQVcsRUFBRSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFOzRCQUN2QyxtQkFBbUIsRUFBRSxPQUFPO3lCQUM3QixDQUFDLENBQUE7d0JBQ0osSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFBO3dCQUMzQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFBO3FCQUM5Qjt5QkFBTTt3QkFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLCtDQUErQyxDQUFDLENBQUE7d0JBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUE7cUJBQzlCO2dCQUNILENBQUMsQ0FBQyxDQUFBO2FBQ0g7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUVGLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUV2QyxDQUFDO0lBRUQsYUFBYSxDQUFDLFVBQW1CO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQTthQUN0RDtZQUNELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRTtnQkFDM0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFNBQVMsQ0FDcEcsQ0FBQyxHQUFRLEVBQUUsRUFBRTtvQkFFWCxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO3dCQUM1QyxJQUFJLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFBO3dCQUNyQyxJQUFJLFVBQVUsRUFBRTs0QkFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFBO3lCQUN0QztxQkFDRjtvQkFDRCxJQUFJLENBQUMsMEJBQTBCLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQ3pDLENBQUMsRUFDRCxDQUFDLEdBQVEsRUFBRSxFQUFFO29CQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLDJCQUEyQixFQUFFLEdBQUcsQ0FBQyxDQUFBO2dCQUN4RCxDQUFDLENBQ0YsQ0FBQTthQUNGO1NBQ0Y7UUFFRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFlBQVksR0FBRyxFQUFFLEVBQUU7Z0JBQzVFLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFBO2FBQzNCO1FBQ0gsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQ1QsQ0FBQztJQUVELG9DQUFvQztJQUNwQyxpQ0FBaUM7SUFDakMseUNBQXlDO0lBQ3pDLGdDQUFnQztJQUNoQyxtSEFBbUg7SUFDbkgsdUVBQXVFO0lBQ3ZFLHFGQUFxRjtJQUNyRixxRkFBcUY7SUFDckYsK0VBQStFO0lBQy9FLCtFQUErRTtJQUMvRSw2RUFBNkU7SUFDN0UsbUVBQW1FO0lBQ25FLE1BQU07SUFFTixpQ0FBaUM7SUFDakMsb0JBQW9CO0lBRXBCLHNDQUFzQztJQUN0Qyx1REFBdUQ7SUFDdkQsTUFBTTtJQUVOLDhEQUE4RDtJQUM5RCwrQkFBK0I7SUFDL0Isc0VBQXNFO0lBQ3RFLDBDQUEwQztJQUMxQywwREFBMEQ7SUFDMUQsMkVBQTJFO0lBQzNFLDJDQUEyQztJQUMzQyw2REFBNkQ7SUFDN0QsK0VBQStFO0lBQy9FLG9EQUFvRDtJQUNwRCxpQ0FBaUM7SUFDakMsZ0JBQWdCO0lBQ2hCLDRCQUE0QjtJQUM1QixlQUFlO0lBQ2YsWUFBWTtJQUVaLDhFQUE4RTtJQUM5RSwwREFBMEQ7SUFDMUQsMkZBQTJGO0lBQzNGLHlCQUF5QjtJQUN6QixzQ0FBc0M7SUFDdEMsNkNBQTZDO0lBQzdDLGlEQUFpRDtJQUNqRCxnQkFBZ0I7SUFDaEIsZUFBZTtJQUNmLDBEQUEwRDtJQUMxRCxxREFBcUQ7SUFDckQsZ0RBQWdEO0lBQ2hELCtEQUErRDtJQUMvRCxvRUFBb0U7SUFDcEUsdUVBQXVFO0lBQ3ZFLDBEQUEwRDtJQUMxRCxrR0FBa0c7SUFDbEcsMEZBQTBGO0lBQzFGLHVEQUF1RDtJQUN2RCxtQ0FBbUM7SUFDbkMsa0NBQWtDO0lBQ2xDLG1EQUFtRDtJQUNuRCwwQkFBMEI7SUFDMUIsZ0NBQWdDO0lBQ2hDLGtCQUFrQjtJQUNsQixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLHlGQUF5RjtJQUN6Rix1RUFBdUU7SUFDdkUsbUZBQW1GO0lBQ25GLHNHQUFzRztJQUN0Ryw2RkFBNkY7SUFDN0YsMkJBQTJCO0lBQzNCLHdDQUF3QztJQUN4QywrQ0FBK0M7SUFDL0MsbURBQW1EO0lBQ25ELGtCQUFrQjtJQUNsQixpQkFBaUI7SUFFakIsNENBQTRDO0lBQzVDLHVEQUF1RDtJQUN2RCxxQkFBcUI7SUFDckIsNEZBQTRGO0lBQzVGLHlGQUF5RjtJQUN6Riw0Q0FBNEM7SUFDNUMsdURBQXVEO0lBQ3ZELHVEQUF1RDtJQUN2RCxjQUFjO0lBQ2QsK0JBQStCO0lBQy9CLCtDQUErQztJQUMvQyw4QkFBOEI7SUFDOUIsY0FBYztJQUNkLHFEQUFxRDtJQUNyRCw2REFBNkQ7SUFDN0Qsd0ZBQXdGO0lBQ3hGLHFDQUFxQztJQUNyQyxvQ0FBb0M7SUFDcEMsb0JBQW9CO0lBQ3BCLGtCQUFrQjtJQUNsQiwwQ0FBMEM7SUFDMUMsK0RBQStEO0lBQy9ELGdEQUFnRDtJQUNoRCxtQkFBbUI7SUFDbkIsY0FBYztJQUNkLG1CQUFtQjtJQUNuQiwwREFBMEQ7SUFDMUQscURBQXFEO0lBQ3JELGlFQUFpRTtJQUNqRSwrREFBK0Q7SUFDL0QsNkVBQTZFO0lBQzdFLGtGQUFrRjtJQUNsRixvREFBb0Q7SUFDcEQsMkZBQTJGO0lBQzNGLHlDQUF5QztJQUN6QyxnQkFBZ0I7SUFDaEIscUJBQXFCO0lBQ3JCLHVDQUF1QztJQUN2QyxjQUFjO0lBQ2Qsa0VBQWtFO0lBQ2xFLDBDQUEwQztJQUMxQyxxREFBcUQ7SUFDckQsWUFBWTtJQUNaLFVBQVU7SUFDViw2REFBNkQ7SUFDN0Qsd0NBQXdDO0lBQ3hDLFNBQVM7SUFDVCx3QkFBd0I7SUFDeEIscUVBQXFFO0lBQ3JFLFNBQVM7SUFDVCxNQUFNO0lBQ04sSUFBSTtJQUVHLHFCQUFxQjtRQUMxQixNQUFNLGNBQWMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO1FBQ3JILE1BQU0sR0FBRyxHQUFHO1lBQ1YsY0FBYztZQUNkLFdBQVcsRUFBRSxnQkFBZ0I7WUFDN0IsS0FBSyxFQUFFLEdBQUc7WUFDVixNQUFNLEVBQUUsQ0FBQztTQUNWLENBQUE7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FDMUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUNaLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNsRCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQU8sRUFBRSxFQUFFO29CQUMvRCxPQUFPLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQTtnQkFDN0MsQ0FBQyxDQUFDLENBQUE7Z0JBQ0YsZ0VBQWdFO2dCQUNoRSw4QkFBOEI7Z0JBQzlCLElBQUksQ0FBQyxTQUFVLENBQUMsUUFBUSxHQUFHO29CQUN6QixXQUFXLEVBQUUsSUFBSTtvQkFDakIsOEJBQThCO29CQUM5QixLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssUUFBUSxDQUFDLGFBQWEsQ0FBQztvQkFDaEksTUFBTSxFQUFFLFFBQVE7aUJBQ2pCLENBQUE7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO2FBQ3RDO1lBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsNkJBQTZCLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDMUQsQ0FBQyxFQUNELENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQywrQkFBK0IsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUM5RCxDQUFDLENBQ0YsQ0FBQTtJQUNILENBQUM7SUFFTSxrQkFBa0IsQ0FBQyxNQUFXO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDOUMsT0FBTyxLQUFLLENBQUE7U0FDYjtRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDdkUsQ0FBQztJQUVNLFVBQVU7UUFDZixJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUE7UUFDaEIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFO1lBQzVDLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUU7Z0JBQzFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFBO2FBQ3hCO1NBQ0Y7UUFDRCxPQUFPLE9BQU8sQ0FBQTtJQUNoQixDQUFDO0lBRUQsaUNBQWlDO0lBQ2pDLGlFQUFpRTtJQUNqRSxrSEFBa0g7SUFDbEgsNkNBQTZDO0lBQzdDLDJCQUEyQjtJQUUzQixtRUFBbUU7SUFDbkUsNEJBQTRCO0lBQzVCLDZDQUE2QztJQUM3QyxnREFBZ0Q7SUFDaEQsaUNBQWlDO0lBQ2pDLFlBQVk7SUFDWixVQUFVO0lBQ1YsU0FBUztJQUNULE1BQU07SUFDTixJQUFJO0lBRUcscUJBQXFCO1FBQzFCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUE7U0FDOUI7YUFBTTtZQUNMLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUE7WUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUE7WUFDaEMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUE7WUFDM0IsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzdCLElBQUksQ0FBQywwQ0FBMEMsRUFBRSxDQUFBO2FBQ2xEO1lBQ0QsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzdCLElBQUksQ0FBQywwQ0FBMEMsRUFBRSxDQUFBO2FBQ2xEO1lBQ0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUN6RyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsRUFBRTtnQkFDL0YsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFBO2FBQ3BGO2lCQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsS0FBSyxTQUFTLENBQUMsZUFBZSxDQUFDLGlCQUFpQixFQUFFO2dCQUN0RyxJQUFJLGtCQUF1QixDQUFBO2dCQUMzQixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDakYsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtpQkFDbkg7cUJBQU07b0JBQ0wsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQTtpQkFDM0Y7Z0JBQ0QsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQTthQUMvRjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQTthQUN4QjtTQUNGO1FBQ0QsSUFBSSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxDQUFBO0lBQzNDLENBQUM7SUFFTSx3QkFBd0IsQ0FBQyxXQUFnQixFQUFFLFNBQWM7UUFDOUQsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQzNDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQTtZQUNmLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO2dCQUNuRSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFBO2FBQzNDO1lBQ0QsTUFBTSxHQUFHLEdBQUc7Z0JBQ1YsT0FBTyxFQUFFO29CQUNQLE1BQU07b0JBQ04sU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVTtvQkFDbEMsOEVBQThFO29CQUM5RSxPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87aUJBQzNCO2FBQ0YsQ0FBQTtZQUNELElBQUksQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDLFNBQVMsQ0FDbkUsQ0FBQyxJQUFrQyxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksSUFBSSxFQUFFO29CQUNSLElBQUksV0FBVyxLQUFLLFNBQVMsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRTt3QkFDcEYsSUFBSSxDQUFDLFNBQVMsR0FBRzs0QkFDZixPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUM7NEJBQ3BCLFFBQVEsRUFBRSxJQUFJO3lCQUNmLENBQUE7d0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ2xCLEVBQUUsRUFDRjs0QkFDRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUs7NEJBQ3RCLFdBQVcsRUFBRSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxFQUFFOzRCQUMzQyxtQkFBbUIsRUFBRSxPQUFPO3lCQUM3QixDQUFDLENBQUE7d0JBQ0osVUFBVSxDQUFDLEdBQUcsRUFBRTs0QkFDZCwrQkFBK0I7NEJBQy9CLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFBO3dCQUM1QixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7cUJBQ1Q7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7cUJBQy9DO2lCQUNGO1lBQ0gsQ0FBQyxFQUNELENBQUMsTUFBVyxFQUFFLEVBQUU7Z0JBQ2QsZ0NBQWdDO2dCQUNoQyxtSEFBbUg7Z0JBQ2pILElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLHFCQUFxQixDQUFDLElBQUksd0JBQXdCLENBQUMsQ0FBQztnQkFDdkYsSUFBSTtnQkFDSixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFBO1lBQy9CLENBQUMsQ0FDRixDQUFBO1NBQ0Y7SUFDSCxDQUFDO0lBRU0sZ0JBQWdCO1FBQ3JCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRTtZQUMzQyxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUNuRSxDQUFDLElBQWtDLEVBQUUsRUFBRTtnQkFDckMsSUFBSSxDQUFDLFNBQVMsR0FBRztvQkFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87b0JBQ3JCLFFBQVEsRUFBRSxJQUFJO2lCQUNmLENBQUE7Z0JBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFBO2dCQUNqQyxJQUFJLE9BQU8sRUFBRTtvQkFDWCxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUE7aUJBQ25DO1lBQ0gsQ0FBQyxFQUNELENBQUMsTUFBVyxFQUFFLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUscUJBQXFCLENBQUMsSUFBSSx3QkFBd0IsQ0FBQyxDQUFDO2dCQUNyRixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsS0FBSyxDQUFBO1lBQy9CLENBQUMsQ0FDRixDQUFBO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsT0FBZTtRQUNsQyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQTtZQUM1QixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ25GLElBQUksZUFBZSxDQUFBO1lBQ25CLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFO2dCQUM3QyxlQUFlLEdBQUcsbUJBQW1CLENBQUE7YUFDdEM7aUJBQU07Z0JBQ0wsZUFBZSxHQUFHLG9CQUFvQixDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQTthQUN2RjtZQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FDM0Msb0JBQW9CLENBQUMsVUFBVSxFQUMvQixvQkFBb0IsQ0FBQyxRQUFRLEVBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQ3JELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQ3RELElBQUksQ0FBQyxVQUFVLEVBQ2YsZUFBZSxFQUNmLE9BQU8sQ0FDUixDQUFBO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsV0FBVyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1NBQ25KO0lBQ0gsQ0FBQztJQUVNLGlCQUFpQjtRQUN0QixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFDM0MsTUFBTSxHQUFHLEdBQUc7Z0JBQ1YsT0FBTyxFQUFFO29CQUNQLE9BQU8sRUFBRTt3QkFDUCxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVO3dCQUNqQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQzt3QkFDdkIscURBQXFEO3FCQUN0RDtvQkFDRCxPQUFPLEVBQUUsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFO2lCQUNqQzthQUNGLENBQUE7WUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FDL0MsQ0FBQyxJQUFrQyxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFBO2dCQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUE7Z0JBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtnQkFDeEMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNsQixFQUFFLEVBQ0Y7d0JBQ0UsVUFBVSxFQUFFLElBQUksQ0FBQyxLQUFLO3dCQUN0QiwrQ0FBK0M7d0JBQy9DLG1CQUFtQixFQUFFLE9BQU87cUJBQzdCLENBQUMsQ0FBQTtpQkFDTDtZQUNILENBQUMsRUFDRCxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLCtCQUErQixFQUFFLEtBQUssQ0FBQyxDQUFBO1lBQzlELENBQUMsQ0FDRixDQUFBO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsU0FBaUIsRUFBRSxPQUFnQjtRQUNqRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDcEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUE7UUFDdEIsSUFBSSxNQUFNLENBQUE7UUFDVixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFO1lBQzlCLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFBO1NBQ2pEO1FBRUQsTUFBTSxHQUFHLEdBQXVDO1lBQzlDLE9BQU8sRUFBRTtnQkFDUCxPQUFPO2dCQUNQLE1BQU07Z0JBQ04sUUFBUSxFQUFFLFNBQVMsSUFBSSxFQUFFO2dCQUN6QixVQUFVLEVBQUUsRUFBRTtnQkFDZCxNQUFNLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQzthQUM1QjtTQUNGLENBQUE7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEtBQUssU0FBUyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRTtZQUN4RixJQUFJLENBQUMsVUFBVSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FDbEQsSUFBSSxDQUFDLEVBQUU7Z0JBQ0wsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7b0JBQ3BGLE1BQU0sY0FBYyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLENBQUE7b0JBQ3hELElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsRUFBRSxDQUFDLEVBQUU7d0JBQzNDLDJCQUEyQjt3QkFDM0IsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxDQUFDLENBQUE7d0JBQzdKLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLDBCQUEwQixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFBO3dCQUN4RSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsc0JBQXNCLENBQUMsRUFBRTs0QkFDdEMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0NBQzdCLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFBOzZCQUN2QztpQ0FBTTtnQ0FDTCxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxzQkFBc0IsRUFBRSxDQUFDLENBQUMsQ0FBQTs2QkFDckM7eUJBQ0Y7d0JBQ0QsT0FBTyxFQUFFLENBQUE7b0JBQ1gsQ0FBQyxDQUFDLENBQUE7b0JBQ0YsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLHNCQUFzQixDQUFDLENBQUE7b0JBQy9ELE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUE7b0JBQzFFLElBQUksUUFBUSxDQUFDLE1BQU0sR0FBRyxVQUFVLEVBQUU7d0JBQ2hDLE1BQU0sSUFBSSxHQUFHLFVBQVUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFBO3dCQUN6QyxJQUFJLElBQUksRUFBRTs0QkFDUiwyQkFBMkI7NEJBQzNCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFO2dDQUMzQixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBOzRCQUNsQixDQUFDLENBQUMsQ0FBQTt5QkFDSDtxQkFDRjtvQkFDRCxJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQTtvQkFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7b0JBQzdDLHVFQUF1RTtvQkFDdkUsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUE7b0JBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7b0JBQ2xFLElBQUksQ0FBQyxNQUFNLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7aUJBQ3RDO3FCQUFNO29CQUNMLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFBO29CQUN0QixJQUFJLENBQUMsTUFBTSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtvQkFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO2lCQUN0QztnQkFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUE7WUFDdkUsQ0FBQyxFQUNELENBQUMsS0FBVSxFQUFFLEVBQUU7Z0JBQ2IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsK0JBQStCLEVBQUUsS0FBSyxDQUFDLENBQUE7WUFDOUQsQ0FBQyxDQUNGLENBQUE7U0FDRjtJQUNILENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbkMsSUFBSSxZQUFpQixDQUFBO1lBQ3JCLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsS0FBSyxHQUFHLEVBQUU7Z0JBQzdDLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUE7YUFDbkQ7aUJBQU07Z0JBQ0wsWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO2FBQzVDO1lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUU7Z0JBQzFCLFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUE7YUFDdkY7WUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHLG9CQUFvQixDQUN4QyxZQUFZLENBQUMsVUFBVSxFQUN2QixZQUFZLENBQUMsUUFBUSxFQUNyQixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUNyRCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUN0RCxJQUFJLENBQUMsVUFBVSxFQUNmLG1CQUFtQixFQUNuQixJQUFJLENBQUMsVUFBVSxFQUFFLEVBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNsQixDQUFBO1lBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFBO1lBQ3hELDhCQUE4QjtTQUMvQjtJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsQ0FBQyxTQUFTLFlBQVk7WUFDcEIsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxTQUFTLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUE7WUFDbkYsSUFBSSxhQUFhLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQiw2Q0FBNkM7Z0JBQzdDLDBEQUEwRDtnQkFDMUQsTUFBTSxDQUFDLFFBQVEsQ0FBQztvQkFDZCxHQUFHLEVBQUUsQ0FBQztvQkFDTixRQUFRLEVBQUUsUUFBUTtpQkFDbkIsQ0FBQyxDQUFBO2FBQ0g7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFBO0lBQ04sQ0FBQztJQUVNLGVBQWUsQ0FBQyxZQUFpQjtRQUN0QyxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDbEQsTUFBTSxxQkFBcUIsR0FBVSxFQUFFLENBQUE7UUFDdkMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUU7WUFDL0IscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNwQyxDQUFDLENBQUMsQ0FBQTtRQUNGLE9BQU8scUJBQXFCLENBQUE7SUFDOUIsQ0FBQztJQUVELElBQUksZUFBZTtRQUNqQixJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUE7U0FDWjtRQUNELE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFBO0lBQ2pDLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbEIsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ3RELE9BQU8sS0FBSyxDQUFBO1NBQ2I7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsT0FBTyxDQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNO2dCQUNsRSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksS0FBSyxnQkFBZ0IsQ0FDL0MsQ0FBQTtTQUNGO1FBQ0QsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQTtJQUNqQyxDQUFDO0lBRUQsSUFBSSxvQkFBb0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFBO0lBQ3RDLENBQUM7SUFFTSx1QkFBdUIsQ0FBQyxLQUFVO1FBQ3ZDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDdkYsTUFBTSxVQUFVLEdBQUcsS0FBSyxFQUFFLENBQUE7UUFDMUIsT0FBTyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7SUFDbEYsQ0FBQztJQUVPLFlBQVksQ0FBQyxVQUFrQixFQUFFLFdBQW1CLElBQUk7UUFDOUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEdBQUcsRUFBRTtZQUNsQyxRQUFRO1NBQ1QsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELElBQUksb0JBQW9CO1FBQ3RCLE9BQU8sQ0FDTCxJQUFJLENBQUMsaUJBQWlCO1lBQ3RCLElBQUksQ0FBQyxPQUFPO1lBQ1osSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEtBQUssZ0JBQWdCO1lBQzlDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTTtZQUM3QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUMxQixDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksY0FBYztRQUNoQixPQUFPLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQTtJQUM1RSxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxDQUNMLElBQUksQ0FBQyxlQUFlLEtBQUssTUFBTTtZQUMvQixJQUFJLENBQUMsT0FBTztZQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFNBQVM7WUFDakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUNsQyxDQUFBO0lBQ0gsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sQ0FDTCxJQUFJLENBQUMsZUFBZSxLQUFLLE9BQU87WUFDaEMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztZQUM3RCxDQUFDLENBQ0MsSUFBSSxDQUFDLE9BQU87Z0JBQ1osSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssUUFBUTtnQkFDckMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQ2xDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQzFCO1lBQ0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEtBQUssVUFBVSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FDeEYsQ0FBQTtJQUNILENBQUM7SUFFTyxxQkFBcUIsQ0FBQyxJQUFhO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7UUFDdkMsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUNuQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUNULDJDQUEyQztnQkFFM0MsTUFBTSxRQUFRLEdBQUcsVUFBVSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFNLEVBQUUsQ0FBTSxFQUFFLEVBQUUsQ0FDaEUsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFBO2dCQUN0RixPQUFPO29CQUNMLFVBQVUsRUFBRSxRQUFRLENBQUMsU0FBUztvQkFDOUIsUUFBUSxFQUFFLFFBQVEsQ0FBQyxlQUFlLElBQUksUUFBUSxDQUFDLGVBQWUsQ0FBQyxRQUFRO2lCQUN4RSxDQUFBO2FBQ0Y7WUFDRCxNQUFNLFNBQVMsR0FBRyxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDbEUsT0FBTztnQkFDTCxVQUFVLEVBQUUsU0FBUyxDQUFDLFNBQVM7Z0JBQy9CLFFBQVEsRUFBRSxTQUFTLENBQUMsZUFBZSxJQUFJLFNBQVMsQ0FBQyxlQUFlLENBQUMsUUFBUTthQUMxRSxDQUFBO1NBQ0Y7UUFDRCxPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7SUFFTywyQkFBMkI7UUFDakMsSUFDRSxJQUFJLENBQUMsT0FBTztZQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYTtZQUMxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxLQUFLLFFBQVEsRUFDOUM7WUFDQSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsR0FBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQXFCLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUE7U0FDL0Y7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQUU7WUFDNUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1NBQzNGO0lBQ0gsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQzlCLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FDeEUsQ0FBQTtZQUVELElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQ3RFLENBQUE7WUFFRCxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQ25GLElBQUksZUFBZSxDQUFBO1lBQ25CLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFO2dCQUM3QyxlQUFlLEdBQUcsbUJBQW1CLENBQUE7YUFDdEM7aUJBQU07Z0JBQ0wsZUFBZSxHQUFHLG9CQUFvQixDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQTthQUN2RjtZQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FDM0Msb0JBQW9CLENBQUMsVUFBVSxFQUMvQixvQkFBb0IsQ0FBQyxRQUFRLEVBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQ3JELElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQ3RELElBQUksQ0FBQyxVQUFVLEVBQ2YsZUFBZSxFQUNmLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FDbEIsQ0FBQTtZQUVELDhCQUE4QjtZQUU5QixJQUFJLG9CQUFvQixDQUFDLGVBQWUsSUFBSSxvQkFBb0IsQ0FBQyxlQUFlLEtBQUssbUJBQW1CLEVBQUU7Z0JBQ3hHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLFVBQVUsQ0FBQyxDQUFBO2FBQ3hEO1NBQ0Y7SUFDSCxDQUFDO0lBRU8seUJBQXlCLENBQUMsR0FBVztRQUMzQyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ2pDLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFBO1lBQ3JCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQTtTQUN2QjtJQUNILENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQ3pELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FDdkMsQ0FBQTtTQUNGO0lBQ0gsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUU7Z0JBQ2hELElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQjtnQkFDcEMsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsS0FBSyxFQUFFLE9BQU87YUFDZixDQUFDLENBQUE7U0FDSDtJQUNILENBQUM7SUFFRCxJQUFJLDhCQUE4QjtRQUNoQyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsRUFBRTtZQUN0RCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLHFCQUFxQixHQUFHLENBQUMsQ0FBQTtTQUNoRztRQUNELE9BQU8sSUFBSSxDQUFBO0lBQ2IsQ0FBQztJQUVPLDBCQUEwQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUU7WUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQywwQkFBMEIsR0FBRyxVQUFVLENBQUE7Z0JBQzVDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUE7Z0JBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxTQUFTLENBQ3ZFLElBQUksQ0FBQyxFQUFFO29CQUNMLElBQUksQ0FBQywwQkFBMEIsR0FBRyxNQUFNLENBQUE7b0JBQ3hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFBO2dCQUMzQyxDQUFDLEVBQ0QsTUFBTSxDQUFDLEVBQUU7b0JBQ1AsSUFBSSxDQUFDLDBCQUEwQixHQUFHLE1BQU0sQ0FBQTtvQkFDeEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQTtnQkFDbEMsQ0FBQyxDQUNGLENBQUE7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsMEJBQTBCLEdBQUcsTUFBTSxDQUFBO2dCQUN4QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFBO2FBQ2hDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLFdBQW1CO1FBQy9CLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRTtZQUM5QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQTtZQUM1QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ3pDLElBQUksV0FBVyxJQUFJLFdBQVcsRUFBRTtnQkFDOUIsT0FBTyxNQUFNLENBQUE7YUFDZDtZQUNELElBQUksV0FBVyxLQUFLLFdBQVcsR0FBRyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3hELE9BQU8sV0FBVyxDQUFBO2FBQ25CO1NBQ0Y7UUFDRCxPQUFPLGFBQWEsQ0FBQTtJQUN0QixDQUFDO0lBRU8sdUJBQXVCO1FBQzdCLE1BQU0sTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtRQUNuRSxJQUNFLENBQUMsSUFBSSxDQUFDLFVBQVU7WUFDaEIsQ0FBQyxJQUFJLENBQUMsdUJBQXVCO1lBQzdCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQ3pDO1lBQ0EsSUFBSSxDQUFDLFVBQVU7aUJBQ1oscUJBQXFCLENBQUMsTUFBTSxDQUFDO2lCQUM3QixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ1YsSUFBSSxHQUFHLENBQUMsU0FBUyxFQUFFO29CQUNqQixJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQTtpQkFDL0I7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGVBQWUsR0FBRyxRQUFRLENBQUE7b0JBQy9CLElBQUksR0FBRyxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO3dCQUN2QyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFBO3FCQUNuRDtpQkFDRjtZQUNILENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQTtTQUN0QjthQUFNO1lBQ0wsSUFBSSxDQUFDLGVBQWUsR0FBRyxPQUFPLENBQUE7U0FDL0I7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLElBQXVDO1FBQ25ELElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sSUFBSSxJQUFJLEtBQUssWUFBWSxDQUFDLEVBQUU7WUFDekUsSUFBSSxPQUFPLEdBQThCO2dCQUN2QyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXO2dCQUNyQyxRQUFRLEVBQUUsSUFBSTtnQkFDZCxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTthQUMzQixDQUFBO1lBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3RDLE9BQU8sR0FBRztvQkFDUixHQUFHLE9BQU87b0JBQ1YsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTO29CQUM1QixjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVc7aUJBQ2pDLENBQUE7YUFDRjtZQUNELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbkIsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFBO2FBQ3hCO1lBQ0QsT0FBTyxHQUFHO2dCQUNSLEdBQUcsT0FBTztnQkFDVixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDMUIsQ0FBQTtZQUNELE9BQU8sT0FBTyxDQUFBO1NBQ2Y7UUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxLQUFLLFFBQVEsRUFBRTtZQUM1QyxJQUFJLE9BQU8sR0FBOEI7Z0JBQ3ZDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXO2dCQUNsQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDMUIsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLHFEQUFxRDthQUN0RCxDQUFBO1lBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQ3RDLE9BQU8sR0FBRztvQkFDUixHQUFHLE9BQU87b0JBQ1YsWUFBWSxFQUFFLElBQUksQ0FBQyxTQUFTO29CQUM1QixjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVc7aUJBQ2pDLENBQUE7YUFDRjtZQUNELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbkIsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFBO2FBQ3hCO1lBQ0QsT0FBTyxHQUFHO2dCQUNSLEdBQUcsT0FBTztnQkFDVixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDMUIsQ0FBQTtZQUNELE9BQU8sT0FBTyxDQUFBO1NBQ2Y7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsT0FBTyxFQUFFLENBQUE7U0FDVjtRQUNELE9BQU87WUFDTCxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUMxQixRQUFRLEVBQUUsSUFBSTtTQUNmLENBQUE7SUFDSCxDQUFDO0lBRUQsSUFBSSxVQUFVO1FBQ1osSUFBSTtZQUNGLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsR0FBRyxDQUFBO1NBQ2xDO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLElBQUksQ0FBQTtTQUNaO0lBQ0gsQ0FBQztJQUVELGtCQUFrQixDQUFDLE9BQVk7UUFDN0IsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUU7WUFDakUsS0FBSyxFQUFFLE9BQU87WUFDZCxJQUFJLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7U0FDcEUsQ0FBQyxDQUFBO1FBRUYsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQ2hELElBQUksTUFBTSxFQUFFO2dCQUNWLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7Z0JBQ3hCLCtCQUErQjtnQkFDL0IsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUE7Z0JBQzFCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTthQUN0RDtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUFjLEVBQUUsVUFBZTtRQUM1QyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7UUFDOUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQTtRQUNyRSxJQUFHLGVBQWUsRUFBRTtZQUNoQixPQUFPLElBQUksQ0FBQyxTQUFTO2lCQUNsQiwwQ0FBMEMsQ0FBQyxVQUFVLEVBQUcsTUFBTSxDQUFDLENBQUE7U0FFckU7UUFDRCxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsMEJBQTBCLENBQUMsVUFBVSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUVELGtCQUFrQixDQUFDLFNBQWM7UUFDL0IsSUFBSSxTQUFTLEVBQUU7WUFDYixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQTtZQUN4RSxNQUFNLE9BQU8sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQTtZQUNwRSxxQ0FBcUM7WUFDckMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO1NBQzdDO1FBQ0QsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBWTtRQUMzQixJQUFJLElBQUksS0FBSyxTQUFTLENBQUMsc0JBQXNCLENBQUMsUUFBUSxFQUFFO1lBQ3RELElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO1NBQzdCO0lBQ0gsQ0FBQztJQUVELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7WUFDdEQsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLFVBQVUsRUFBRTtnQkFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUE7Z0JBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFBO2dCQUNqRCxJQUFJLENBQUMsVUFBVSxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUE7YUFDdEM7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7YUFDbkQ7WUFDRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7WUFDZixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtRQUM1QixDQUFDLEVBQUUsQ0FBQyxJQUFTLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQ3BELENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELGdCQUFnQixDQUFDLEdBQVcsRUFBRSxJQUFhO1FBQ3pDLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQTtRQUNwQixJQUFJLEdBQUcsRUFBRTtZQUNQLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtnQkFDbkIsV0FBVyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN0QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtnQkFDckQsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2FBQ2I7aUJBQU07Z0JBRUwsV0FBVyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO2FBQ2xFO1NBQ0Y7UUFDRCxPQUFPLFdBQVcsQ0FBQTtJQUNwQixDQUFDO0lBRU0sbUJBQW1CLENBQUMsQ0FBTTtRQUMvQixJQUFJO1lBQ0YsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUNsQyxPQUFPLFlBQVksQ0FBQTtTQUNwQjtRQUFDLE1BQU07WUFDTixPQUFPLEVBQUUsQ0FBQTtTQUNWO0lBQ0gsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFRLENBQUE7UUFFdkUsSUFBSSxhQUFhLEVBQUU7WUFDakIsTUFBTSxDQUFDLFFBQVEsQ0FBQztnQkFDZCxHQUFHLEVBQUUsYUFBYSxDQUFDLFNBQVM7Z0JBQzVCLFFBQVEsRUFBRSxRQUFRO2FBQ25CLENBQUMsQ0FBQTtTQUNIO0lBQ0gsQ0FBQztJQUVELDBCQUEwQjtRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUNoQztZQUNFLElBQUksRUFBRSxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSztZQUN0QyxFQUFFLEVBQUUsa0JBQWtCO1lBQ3RCLE9BQU8sRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsV0FBVztTQUNuRCxFQUNEO1lBQ0UsRUFBRSxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQ2YsSUFBSSxFQUFFLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXO1NBQ2hELENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBYSxFQUFFLElBQVM7UUFDdEMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDOUQsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixpREFBaUQ7SUFDakQsb0RBQW9EO0lBQ3BELHlFQUF5RTtJQUN6RSxzQ0FBc0M7SUFDdEMsdUNBQXVDO0lBQ3ZDLG9EQUFvRDtJQUNwRCwyRkFBMkY7SUFDM0YsNERBQTREO0lBQzVELHFCQUFxQjtJQUNyQiw4REFBOEQ7SUFDOUQsY0FBYztJQUNkLGFBQWE7SUFDYiwyREFBMkQ7SUFDM0QsNkRBQTZEO0lBQzdELFVBQVU7SUFDVixTQUFTO0lBQ1QsTUFBTTtJQUNOLElBQUk7SUFFSixxQkFBcUI7UUFDbkIsSUFBSSxvQkFBb0IsQ0FBQTtRQUN4QixJQUFJLFlBQWlCLENBQUE7UUFDckIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2pFLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsS0FBSyxHQUFHLEVBQUU7Z0JBQzdDLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUE7YUFDbkQ7aUJBQU07Z0JBQ0wsWUFBWSxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO2FBQzVDO1lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUE7U0FDNUM7YUFBTTtZQUNMLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDaEIsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBQzdFLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUE7YUFFcEQ7U0FDRjtJQUNILENBQUM7SUFFRCxhQUFhLENBQUMsVUFBa0I7UUFDOUIsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLFVBQVUsRUFBRTtZQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1lBQzlELHFDQUFxQztZQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFzQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQTtZQUMxRSw0Q0FBNEM7WUFDNUMsMkNBQTJDO1lBQzNDLHdDQUF3QztZQUN4QyxLQUFLO1NBQ047SUFDSCxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQ2hDO1lBQ0UsSUFBSSxFQUFFLE9BQU87WUFDYixPQUFPLEVBQUUsUUFBUTtZQUNqQixFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDaEQsRUFDRDtZQUNFLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDdkQsRUFDRDtZQUNFLFNBQVMsRUFBRSxZQUFZO1lBQ3ZCLE1BQU0sRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsT0FBTztTQUM5QyxDQUNGLENBQUE7SUFDSCxDQUFDO0lBRUQsMENBQTBDO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQ2hDO1lBQ0UsSUFBSSxFQUFFLE9BQU87WUFDYixPQUFPLEVBQUUsUUFBUTtZQUNqQixFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDL0MsTUFBTSxFQUFFO2dCQUNOLEVBQUUsRUFBRSxJQUFJLENBQUMsb0JBQW9CO2dCQUM3QixHQUFHLEVBQUUsS0FBSztnQkFDVixJQUFJLEVBQUUsU0FBUzthQUNoQjtTQUNLLEVBQ1I7WUFDRSxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQ3ZELEVBQ0Q7WUFDRSxNQUFNLEVBQUUsWUFBWSxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsc0JBQXNCO1lBQ2xFLE1BQU0sRUFBRSxRQUFRLENBQUMsb0JBQW9CLENBQUMsT0FBTztTQUM5QyxDQUNGLENBQUE7SUFDSCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUM3QyxDQUFDO0lBRUQsb0JBQW9CO0lBQ3BCLHNCQUFzQixDQUFDLE9BQVk7UUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FDaEM7WUFDRSxJQUFJLEVBQUUsT0FBTztZQUNiLE9BQU87WUFDUCxFQUFFLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDaEQsRUFDRDtZQUNFLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDdkQsRUFDRDtZQUNFLFNBQVMsRUFBRSxPQUFPLE9BQU8sRUFBRTtZQUMzQixNQUFNLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE9BQU87U0FDOUMsQ0FDRixDQUFBO0lBQ0gsQ0FBQztJQUVELGdCQUFnQjtRQUNkLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFBO0lBQzFCLENBQUM7SUFFRCxjQUFjLENBQUMsS0FBYSxFQUFFLElBQVM7UUFDckMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ2pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1NBQzdEO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDckM7UUFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDckM7UUFDRCxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM5QixJQUFJLENBQUMscUJBQXFCLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDekM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLG9CQUFvQixHQUFHLE1BQU0sQ0FBQTtRQUN6QyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRTtZQUNoQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDM0M7UUFDRCxJQUFJLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtZQUNsQyxJQUFJLENBQUMseUJBQXlCLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDN0M7UUFDRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMvQixJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDMUM7UUFDRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN6QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDcEM7SUFDSCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsU0FBYztRQUM5QixJQUFJLENBQUMsd0JBQXdCLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUN2RixDQUFDO0lBRUQsdUJBQXVCO1FBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsc0JBQXNCLENBQ2hDO1lBQ0UsSUFBSSxFQUFFLE9BQU87WUFDYixFQUFFLEVBQUUsaUJBQWlCO1lBQ3JCLE9BQU8sRUFBRSxzQkFBc0I7U0FDaEMsRUFBRSxFQUFFLEVBQ0w7WUFDRSxNQUFNLEVBQUUsY0FBYztTQUN2QixDQUFDLENBQUE7SUFDTixDQUFDO0lBR0QsdUJBQXVCO1FBQ3JCLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFBO1FBQzlELElBQUksT0FBTyxHQUFRO1lBQ2pCLFNBQVMsRUFBRTtnQkFDVCx1QkFBdUIsRUFBRSxJQUFJO2dCQUM3QixVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUM7YUFDekI7U0FDRixDQUFBO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQVEsRUFBRSxFQUFFO1lBRzFFLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFO2dCQUN4RSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUE7Z0JBRTVDLElBQUksd0JBQXdCLEdBQVEsSUFBSSxDQUFDLGtCQUFrQjtvQkFDekQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFBO2dCQUN6RixJQUFJLHdCQUF3QixJQUFJLHdCQUF3QixDQUFDLG9CQUFvQixJQUFJLHdCQUF3QixDQUFDLG9CQUFvQixLQUFLLEdBQUcsRUFBRTtvQkFDdEksSUFBSSxDQUFDLDBCQUEwQixDQUFDLFVBQVUsQ0FBQyxDQUFBO2lCQUM1QztnQkFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQTtnQkFDM0QsSUFBSSxJQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLEVBQUU7b0JBQ2hFLHNHQUFzRztvQkFFdEcsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGtCQUFrQjt3QkFDMUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFBO29CQUN6RixJQUFJLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTtvQkFFMUYsc0dBQXNHO29CQUN0RyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsR0FBRyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO3dCQUM3RCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtxQkFDM0I7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUE7d0JBQzlDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxHQUFHLEVBQUU7NEJBQzFCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUNsQixDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFDYjtnQ0FDRSxXQUFXLEVBQUUsT0FBTyxDQUFDLFdBQVc7NkJBQ2pDLENBQUMsQ0FBQTt5QkFDTDtxQkFDRjtpQkFFRjtxQkFBTTtvQkFDTCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTtpQkFDM0I7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsa0JBQWtCLEdBQUcsRUFBRSxDQUFBO2dCQUM1QixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTthQUMzQjtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUdELEtBQUssQ0FBQyxtQkFBbUI7UUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUE7UUFDOUMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQTtRQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDcEMsMkJBQTJCO1FBQzNCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU07WUFDekcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPO1lBQzdELElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCO1lBQzNFLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCO1lBQzNFLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZTtZQUNyRSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRTtZQUN2RSxzRUFBc0U7WUFDdEUsT0FBTyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtTQUM3RDtRQUVELElBQUksY0FBNkMsQ0FBQTtRQUNqRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQy9ELElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUU7Z0JBQzdELGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7b0JBQzVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLElBQUksRUFBRSxDQUFBO29CQUNoRSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFO3dCQUNsQyxPQUFPLFNBQVMsQ0FBQTtxQkFDakI7b0JBQ0QsT0FBTyxNQUFNLENBQUE7Z0JBQ2YsQ0FBQyxDQUFDLENBQUE7YUFDSDtZQUVELG1FQUFtRTtZQUNuRSxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsT0FBTyxFQUFFO2dCQUM1QyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7b0JBQzFFLElBQUksR0FBRyxFQUFFO3dCQUNQLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFBO3dCQUNyQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQTt3QkFDNUIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUE7cUJBQ2pDO2dCQUNILENBQUMsQ0FBQyxDQUFBO2dCQUNGLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUM3QyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsY0FBYyxDQUFBO2dCQUN4QyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQTtnQkFDbkMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLGNBQWMsQ0FBQyxPQUFPLENBQUE7Z0JBQ2xELHVEQUF1RDtnQkFDdkQsSUFBSSxjQUFjLElBQUksY0FBYyxDQUFDLGtCQUFrQjtvQkFDckQsY0FBYyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRTtvQkFDMUMsTUFBTSxXQUFXLEdBQVEsY0FBYyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxDQUFNLEVBQUUsRUFBRSxDQUNqRixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7b0JBQzFFLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUE7b0JBQ3hDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO29CQUNwQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7d0JBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsR0FBRzs0QkFDL0IsTUFBTTs0QkFDTixRQUFRLEVBQUUsRUFBRTt5QkFDYixDQUFBO3FCQUNGO2lCQUNGO2dCQUNELElBQUksQ0FBQyxPQUFPLENBQUMsb0JBQW9CLEdBQUcsY0FBYyxDQUFDLG9CQUFvQixJQUFJLENBQUMsQ0FBQTtnQkFDNUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQTtnQkFDMUQsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLEVBQUU7b0JBQ25FLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFBO29CQUN2RixJQUFJLENBQUMsc0JBQXNCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7d0JBQzFFLElBQUksR0FBRyxFQUFFOzRCQUNQLElBQUksQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFBOzRCQUNyQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQTs0QkFDNUIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUE7eUJBQ2pDO29CQUNILENBQUMsQ0FBQyxDQUFBO29CQUVGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUE7b0JBQzdCLHdDQUF3QztpQkFDekM7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtvQkFDN0UsSUFBSSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQTtvQkFDMUUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQTtvQkFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUN4Qyx3Q0FBd0M7aUJBQ3pDO2dCQUNELElBQUksQ0FBQyxTQUFTLEdBQUc7b0JBQ2YsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztvQkFDL0IsUUFBUSxFQUFFLElBQUk7aUJBQ2YsQ0FBQTtnQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7Z0JBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO2dCQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO2dCQUMzRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRTtvQkFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQ2xCLEVBQUUsRUFDRjt3QkFDRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUs7d0JBQ3RCLFdBQVcsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLEVBQUU7d0JBQzNDLG1CQUFtQixFQUFFLE9BQU87cUJBQzdCLENBQUMsQ0FBQTtpQkFDTDthQUNGO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7Z0JBQ3hDLG9EQUFvRDtnQkFDcEQsa0RBQWtEO2dCQUNsRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTTt1QkFDM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEtBQUssSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUU7b0JBQ2xFLHFDQUFxQztvQkFDckMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRTt3QkFDekUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7cUJBQ3pCO2lCQUNGO3FCQUFNO29CQUNMLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFBO2lCQUN6QjtnQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtnQkFDckQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQTtnQkFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO2FBQ3RDO1NBR0Y7UUFFRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQTtJQUM3QixDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxxQkFBcUI7UUFDbkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0NBQWtDLEVBQUU7WUFDckUsWUFBWSxFQUFFLElBQUk7WUFDbEIsS0FBSyxFQUFFLE9BQU87WUFDZCxVQUFVLEVBQUUsQ0FBQywwQkFBMEIsQ0FBQztTQUN6QyxDQUFDLENBQUE7UUFDRixTQUFTLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBVyxFQUFFLEVBQUU7WUFDaEQsSUFBSSxNQUFNLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzdCLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUNuQjtpQkFBTTtnQkFDTCxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDbkI7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxTQUFjO1FBQ3ZDLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUUsVUFBVTtlQUN4RixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsVUFBVTtlQUNqRSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsVUFBVTtlQUMvRCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFVBQVU7ZUFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsVUFBVTtVQUN4RjtZQUNBLElBQUksT0FBTyxHQUFRLEVBQUUsQ0FBQTtZQUNyQiw0R0FBNEc7WUFDNUcsdUZBQXVGO1lBQ3ZGLElBQUk7WUFDSixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUU7Z0JBQ3JDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQTthQUM1QztZQUNELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRTtnQkFDL0MsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUE7YUFDMUQ7WUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUU7Z0JBQzNDLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQTthQUNoRDtZQUNELDBDQUEwQztZQUMxQyxPQUFPLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUE7WUFDN0MsSUFBSTtZQUNKLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRTtnQkFDeEMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFBO2FBQ2hEO1lBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO2dCQUN6QyxPQUFPLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7YUFDN0g7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFBO2FBQ2hDO1lBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUN4QztnQkFDQSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQTtnQkFDbEQsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUE7YUFDbkQ7WUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLEVBQUU7Z0JBQ2hELE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFBO2FBQ3pEO1lBQ0QsMENBQTBDO1lBQzFDLE9BQU8sQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQTtZQUMzRyxPQUFPLENBQUMsdUJBQXVCLENBQUMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7WUFDM0csSUFBSTtZQUNKLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFDdkMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUE7YUFDdkQ7WUFDRCxrQ0FBa0M7WUFDbEMsSUFBSSxTQUFTLEtBQUssTUFBTSxFQUFFO2dCQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLDRCQUE0QixDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUE7YUFDdkk7aUJBQU0sSUFBSSxTQUFTLEtBQUssUUFBUSxFQUFFO2dCQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLDRCQUE0QixDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTthQUM1STtpQkFBTSxJQUFJLFNBQVMsS0FBSyxVQUFVLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxjQUFjLENBQUMsNEJBQTRCLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFBO2FBQzdJO1NBRUY7SUFDSCxDQUFDO0lBRUQsYUFBYSxDQUFDLENBQU07UUFDbEIsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFFbEMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2xFLElBQUksUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUN0RSxJQUFJLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEUsT0FBTyxRQUFRLEdBQUcsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUN4QyxDQUFDO0lBR0QsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFlLEVBQUUsTUFBTSxHQUFHLENBQUM7UUFDNUMsTUFBTSxPQUFPLEdBQUc7WUFDZCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsb0JBQW9CO1lBQzlDLFdBQVcsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUMxQixRQUFRLEVBQUUsTUFBTTtZQUNoQixVQUFVLEVBQUUsT0FBTztZQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLEVBQUU7U0FDcEQsQ0FBQTtRQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUE7UUFDckcsSUFBSSxRQUFRLElBQUksUUFBUSxFQUFFLE9BQU8sRUFBRTtZQUNqQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FDdEIsOEJBQThCLEVBQUUsR0FBRyxFQUNuQyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUN6RCxDQUFDO1lBQ0Ysd0ZBQXdGO1lBQ3hGLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQTtTQUVyRjthQUFNLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQ3RCLDZDQUE2QyxFQUFFLEdBQUcsRUFDbEQsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FDdkQsQ0FBQztTQUNIO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFHLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDZixJQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUMsRUFBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBQyxDQUFFLENBQUE7YUFDdEc7WUFFRix3REFBd0Q7U0FDeEQ7SUFFSCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFBO1FBQ3ZCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFBO0lBQzlCLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxJQUF1QztRQUNoRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLElBQUksS0FBSyxPQUFPLElBQUksSUFBSSxLQUFLLFlBQVksQ0FBQyxFQUFFO1lBQ3pFLElBQUksT0FBTyxHQUE4QjtnQkFDdkMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVztnQkFDckMsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7YUFDM0IsQ0FBQTtZQUNELElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUN0QyxPQUFPLEdBQUc7b0JBQ1IsR0FBRyxPQUFPO29CQUNWLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDNUIsY0FBYyxFQUFFLElBQUksQ0FBQyxXQUFXO2lCQUNqQyxDQUFBO2FBQ0Y7WUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQTthQUN4QjtZQUNELE9BQU8sR0FBRztnQkFDUixHQUFHLE9BQU87Z0JBQ1YsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQzFCLENBQUE7WUFDRCxPQUFPLE9BQU8sQ0FBQTtTQUNmO1FBRUQsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksS0FBSyxRQUFRLEVBQUU7WUFDNUMsSUFBSSxPQUFPLEdBQThCO2dCQUN2QyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVztnQkFDbEMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQzFCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixxREFBcUQ7YUFDdEQsQ0FBQTtZQUNELElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUN0QyxPQUFPLEdBQUc7b0JBQ1IsR0FBRyxPQUFPO29CQUNWLFlBQVksRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDNUIsY0FBYyxFQUFFLElBQUksQ0FBQyxXQUFXO2lCQUNqQyxDQUFBO2FBQ0Y7WUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQTthQUN4QjtZQUNELE9BQU8sR0FBRztnQkFDUixHQUFHLE9BQU87Z0JBQ1YsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2FBQzFCLENBQUE7WUFDRCxPQUFPLE9BQU8sQ0FBQTtTQUNmO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLE9BQU8sRUFBRSxDQUFBO1NBQ1Y7UUFDRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDMUIsUUFBUSxFQUFFLElBQUk7U0FDZixDQUFBO0lBQ0gsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFBO1lBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMscUJBQXFCLENBQUMsQ0FBQTtZQUN2RSwyQ0FBMkM7WUFDM0MsSUFBSSxhQUFhLEdBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUVsRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsb0JBQW9CLENBQzNDLGFBQWEsQ0FBQyxVQUFVLEVBQ3hCLGFBQWEsQ0FBQyxRQUFRLEVBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQUUsVUFBVSxFQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLGNBQWMsRUFDcEMsSUFBSSxDQUFDLFVBQVUsRUFDZixJQUFJLENBQUMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFDOUQsRUFBRSxDQUNILENBQUE7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1lBQzdELElBQUksVUFBVSxHQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUE7WUFDN0MsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQzFELFdBQVcsR0FBRyxFQUFFLEdBQUcsV0FBVyxFQUFHLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQTtZQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUE7U0FDekQ7SUFDSCxDQUFDO0lBRUQsZ0NBQWdDO1FBQzlCLElBQUksQ0FBQyw2QkFBNkIsR0FBRyxLQUFLLENBQUE7UUFDMUMsSUFBSSx5QkFBeUIsR0FBTyxFQUFFLENBQUE7UUFDdEMsSUFBRyxJQUFJLENBQUMsZUFBZSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sRUFBRTtZQUN0RCxJQUFJLENBQUMsZUFBZSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQVEsRUFBQyxFQUFFO2dCQUMvRCxJQUFHLElBQUksSUFBSSxJQUFJLEVBQUUsV0FBVyxFQUFFO29CQUM1Qix5QkFBeUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFBO2lCQUNqRDtZQUNILENBQUMsQ0FBQyxDQUFBO1NBQ0g7UUFDRCxJQUFHLHlCQUF5QixJQUFJLHlCQUF5QixDQUFDLE1BQU0sRUFBRTtZQUNoRSxJQUFJLEdBQUcsR0FBRTtnQkFDUCxTQUFTLEVBQUU7b0JBQ1QsWUFBWSxFQUFFLHlCQUF5QjtvQkFDdkMsUUFBUSxFQUFFO29CQUNOLG9CQUFvQjtvQkFDcEIseUJBQXlCO3FCQUM1QjtpQkFDSjthQUNBLENBQUE7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLCtCQUErQixDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVEsRUFBQyxFQUFFO2dCQUNyRSxJQUFHLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFO29CQUNqRCxLQUFJLElBQUksQ0FBQyxHQUFDLENBQUMsRUFBRSxDQUFDLEdBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUNsRCxJQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEtBQUssR0FBRzs0QkFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUMxQzs0QkFDQSxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSxDQUFBO3lCQUMxQztxQkFDRjtpQkFDRjtZQUNILENBQUMsQ0FBQyxDQUFBO1NBQ0g7SUFFSCxDQUFDO0lBR0QsZ0JBQWdCLENBQUMsSUFBUztRQUN4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEMsc0NBQXNDO0lBQ3hDLENBQUM7K0dBcDRFVSxtQkFBbUIscytCQTBPcEIsYUFBYTttR0ExT1osbUJBQW1CLHVrQkMvRWhDLDBua0RBaXhCQTs7NEZEbHNCYSxtQkFBbUI7a0JBUi9CLFNBQVM7K0JBQ0UscUJBQXFCLGlCQUloQixpQkFBaUIsQ0FBQyxJQUFJOzswQkE2T2xDLE1BQU07MkJBQUMsYUFBYTs0Q0FwTmQsVUFBVTtzQkFBbEIsS0FBSztnQkF3Q3FDLFdBQVc7c0JBQXJELFNBQVM7dUJBQUMsWUFBWSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkF5RFosU0FBUztzQkFBckMsU0FBUzt1QkFBQyxnQkFBZ0I7Z0JBQ21CLFVBQVU7c0JBQXZELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDaEIsYUFBYTtzQkFBeEMsU0FBUzt1QkFBQyxlQUFlO2dCQXlEMUIsWUFBWTtzQkFEWCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQsIEFmdGVyVmlld0luaXQsIEFmdGVyVmlld0NoZWNrZWQsXG4gIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBWaWV3RW5jYXBzdWxhdGlvbiwgSW5wdXQsIEluamVjdCwgT3B0aW9uYWwsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnXG5pbXBvcnQgeyBTYWZlSHRtbCwgRG9tU2FuaXRpemVyLCBTYWZlU3R5bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJ1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIEV2ZW50LCBEYXRhLCBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInXG5pbXBvcnQgeyBVbnR5cGVkRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3JtcydcbmltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSdcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBzaGFyZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnXG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCdcbmRheWpzLmV4dGVuZChpc1NhbWVPckJlZm9yZSlcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50J1xuaW1wb3J0IGlzU2FtZU9yQmVmb3JlIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckJlZm9yZSdcblxuaW1wb3J0IHsgTnNDb250ZW50IH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50Lm1vZGVsJ1xuaW1wb3J0IHsgV2lkZ2V0Q29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9fc2VydmljZXMvd2lkZ2V0LWNvbnRlbnQuc2VydmljZSdcbmltcG9ydCB7IHZpZXdlclJvdXRlR2VuZXJhdG9yIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3ZpZXdlci1yb3V0ZS11dGlsJ1xuaW1wb3J0IHsgTnNXaWRnZXRSZXNvbHZlciB9IGZyb20gJ0BzdW5iaXJkLWNiL3Jlc29sdmVyLXYyJ1xuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvbnNTZXJ2aWNlLCBEYXRhVHJhbnNmZXJTZXJ2aWNlLCBFdmVudFNlcnZpY2UsXG4gIExvZ2dlclNlcnZpY2UsIE11bHRpbGluZ3VhbFRyYW5zbGF0aW9uc1NlcnZpY2UsXG4gIE5zUGFnZSwgVEZldGNoU3RhdHVzLCBUZWxlbWV0cnlTZXJ2aWNlLFxuICBVdGlsaXR5U2VydmljZSwgV2lkZ2V0RW5yb2xsU2VydmljZSwgV3NFdmVudHMsXG59IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuXG5pbXBvcnQgeyBXaWRnZXRDb250ZW50TGliU2VydmljZSwgV2lkZ2V0VXNlclNlcnZpY2VMaWIgfSBmcm9tICdAc3VuYmlyZC1jYi9jb25zdW1wdGlvbidcbmltcG9ydCB7IE5zQXBwVG9jIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2FwcC10b2MubW9kZWwnXG5pbXBvcnQgeyBBcHBUb2NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYXBwLXRvYy5zZXJ2aWNlJ1xuaW1wb3J0IHsgQWNjZXNzQ29udHJvbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hY2Nlc3MtY29udHJvbC5zZXJ2aWNlJ1xuaW1wb3J0IHsgTW9iaWxlQXBwc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9tb2JpbGUtYXBwcy5zZXJ2aWNlJ1xuaW1wb3J0IHsgSGFuZGxlQ2xhaW1TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX2NvbGxlY3Rpb24vX2NvbW1vbi9jb250ZW50LXRvYy9jb250ZW50LXNlcnZpY2VzL2hhbmRsZS1jbGFpbS5zZXJ2aWNlJ1xuaW1wb3J0IHsgQWN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FjdGlvbi5zZXJ2aWNlJ1xuaW1wb3J0IHsgUmF0aW5nU2VydmljZSB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy9yYXRpbmcuc2VydmljZSdcbmltcG9ydCB7IFZpZXdlclV0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdmlld2VyLXV0aWwuc2VydmljZSdcbmltcG9ydCB7IExvYWRDaGVja1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9sb2FkLWNoZWNrLnNlcnZpY2UnXG5pbXBvcnQgeyBSZXNldFJhdGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi8uLi8uLi9zZXJ2aWNlcy9yZXNldC1yYXRpbmdzLnNlcnZpY2UnXG5cbmltcG9ydCB7IEFwcFRvY0RpYWxvZ0ludHJvVmlkZW9Db21wb25lbnQgfSBmcm9tICcuLi9hcHAtdG9jLWRpYWxvZy1pbnRyby12aWRlby9hcHAtdG9jLWRpYWxvZy1pbnRyby12aWRlby5jb21wb25lbnQnXG5pbXBvcnQgeyBDb250ZW50UmF0aW5nVjJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9fY29sbGVjdGlvbi9fY29tbW9uL2NvbnRlbnQtcmF0aW5nLXYyLWRpYWxvZy9jb250ZW50LXJhdGluZy12Mi1kaWFsb2cuY29tcG9uZW50J1xuaW1wb3J0IHsgVGltZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGltZXIuc2VydmljZSdcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgYXMgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJ1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgYXMgTWF0U25hY2tiYXJOZXcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInXG5pbXBvcnQgeyBOZXRDb3JlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25ldGNvcmUuc2VydmljZSdcbmltcG9ydCB7IE5zQ2FyZENvbnRlbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FyZC1jb250ZW50Lm1vZGVsJ1xuaW1wb3J0IHsgTnNQbGF5bGlzdCB9IGZyb20gJy4uLy4uL21vZGVscy9wbGF5bGlzdC5tb2RlbCdcbmltcG9ydCB7IE5zR29hbCB9IGZyb20gJy4uLy4uL21vZGVscy9nb2FsLm1vZGVsJ1xuaW1wb3J0IHsgTm9uUmVsZXZlbnRGZWVkYmFja0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL25vbi1yZWxldmVudC1mZWVkYmFjay1kaWFsb2cvbm9uLXJlbGV2ZW50LWZlZWRiYWNrLWRpYWxvZy5jb21wb25lbnQnXG5cbmV4cG9ydCBlbnVtIEVycm9yVHlwZSB7XG4gIGludGVybmFsU2VydmVyID0gJ2ludGVybmFsU2VydmVyJyxcbiAgc2VydmljZVVuYXZhaWxhYmxlID0gJ3NlcnZpY2VVbmF2YWlsYWJsZScsXG4gIHNvbWV0aGluZ1dyb25nID0gJ3NvbWV0aGluZ1dyb25nJyxcbn1cblxuY29uc3QgZmxhdHRlbkl0ZW1zID0gKGl0ZW1zOiBhbnlbXSwga2V5OiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoZmxhdHRlbmVkSXRlbXMsIGl0ZW0pID0+IHtcbiAgICBmbGF0dGVuZWRJdGVtcy5wdXNoKGl0ZW0pXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbVtrZXldKSkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICBmbGF0dGVuZWRJdGVtcyA9IGZsYXR0ZW5lZEl0ZW1zLmNvbmNhdChmbGF0dGVuSXRlbXMoaXRlbVtrZXldLCBrZXkpKVxuICAgIH1cbiAgICByZXR1cm4gZmxhdHRlbmVkSXRlbXNcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgfSwgW10pXG59XG5jb25zdCBTTkFDS0JBUl9EVVJBVElPTiA9IDMwMDBcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dzLWFwcC1hcHAtdG9jLWhvbWUnLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy1ob21lLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXBwLXRvYy1ob21lLmNvbXBvbmVudC5zY3NzJ10sXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdXNlLWNvbXBvbmVudC12aWV3LWVuY2Fwc3VsYXRpb25cbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5cbmV4cG9ydCBjbGFzcyBBcHBUb2NIb21lQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQge1xuICBzaG93ID0gZmFsc2VcbiAgY2hhbmdlVGFiID0gZmFsc2VcbiAgc2tlbGV0b25Mb2FkZXIgPSB0cnVlXG4gIGJhbm5lcnM6IE5zQXBwVG9jLklUb2NCYW5uZXIgfCBudWxsID0gbnVsbFxuICBzaG93TW9yZUdsYW5jZSA9IGZhbHNlXG4gIGNvbnRlbnQ6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXG4gIGNvbnRlbnRSZWFkRGF0YTogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCA9IG51bGxcbiAgZXJyb3JDb2RlOiBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUgfCBudWxsID0gbnVsbFxuICByZXN1bWVEYXRhOiBhbnkgPSBudWxsXG4gIG5zQ2FyZENvbnRlbnREYXRhOiBhbnkgPSBOc0NhcmRDb250ZW50LkFDQlBDb25zdFxuICBiYXRjaERhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UgfCBudWxsID0gbnVsbFxuICBjdXJyZW50Q291cnNlQmF0Y2hJZDogc3RyaW5nIHwgbnVsbCA9IG51bGxcbiAgdXNlckVucm9sbG1lbnRMaXN0ITogTnNDb250ZW50LklDb3Vyc2VbXVxuICByb3V0ZVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgcGFnZU5hdmJhcjogUGFydGlhbDxOc1BhZ2UuSU5hdkJhY2tncm91bmQ+ID0gdGhpcy5jb25maWdTdmMucGFnZU5hdkJhclxuICBpc0NvaG9ydHNSZXN0cmljdGVkID0gZmFsc2VcbiAgc3RpY2t5ID0gZmFsc2VcbiAgaXNJbklmcmFtZSA9IGZhbHNlXG4gIGNiUGxhbkVuZERhdGU6IGFueVxuICBjYlBsYW5EdXJhdGlvbjogYW55XG4gIGVucm9sbGVkQ291cnNlRGF0YTogYW55XG4gIEBJbnB1dCgpIGZvclByZXZpZXc6IGFueSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvcHVibGljLycpIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvYXV0aG9yLycpXG4gIC8vIGZvclByZXZpZXcgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL2F1dGhvci8nKVxuICBhbmFseXRpY3MgPSB0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEucGFnZURhdGEuZGF0YT8uYW5hbHl0aWNzXG4gIGVycm9yV2lkZ2V0RGF0YTogTnNXaWRnZXRSZXNvbHZlci5JUmVuZGVyQ29uZmlnV2l0aFR5cGVkRGF0YTxhbnk+ID0ge1xuICAgIHdpZGdldFR5cGU6ICdlcnJvclJlc29sdmVyJyxcbiAgICB3aWRnZXRTdWJUeXBlOiAnZXJyb3JSZXNvbHZlcicsXG4gICAgd2lkZ2V0RGF0YToge1xuICAgICAgZXJyb3JUeXBlOiAnaW50ZXJuYWxTZXJ2ZXInLFxuICAgIH0sXG4gIH1cbiAgaXNBdXRob3IgPSBmYWxzZVxuICBhdXRob3JCdG5XaWRnZXQ6IE5zUGFnZS5JTmF2TGluayA9IHtcbiAgICBhY3Rpb25CdG5JZDogJ2ZlYXR1cmVfYXV0aG9yaW5nJyxcbiAgICBjb25maWc6IHtcbiAgICAgIHR5cGU6ICdtYXQtYnV0dG9uJyxcbiAgICB9LFxuICB9XG4gIHRvY0NvbmZpZzogYW55ID0gbnVsbFxuICBwcmltYXJ5Q2F0ZWdvcnkgPSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeVxuICBjb3Vyc2VDYXRlZ29yeSA9IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnlcbiAgV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cyA9IE5zQ29udGVudC5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzXG4gIGFza0F1dGhvckVuYWJsZWQgPSB0cnVlXG4gIHRyYWluaW5nTEh1YkVuYWJsZWQgPSBmYWxzZVxuICB0cmFpbmluZ0xIdWJDb3VudCQ/OiBPYnNlcnZhYmxlPG51bWJlcj5cbiAgYm9keTogU2FmZUh0bWwgfCBudWxsID0gbnVsbFxuICB2aWV3TW9yZVJlbGF0ZWRUb3BpY3MgPSBmYWxzZVxuICBoYXNUb2NTdHJ1Y3R1cmUgPSBmYWxzZVxuICB0b2NTdHJ1Y3R1cmU6IE5zQXBwVG9jLklUb2NTdHJ1Y3R1cmUgfCBudWxsID0gbnVsbFxuICBjb250ZW50UGFyZW50czogeyBba2V5OiBzdHJpbmddOiBOc0FwcFRvYy5JQ29udGVudFBhcmVudFJlc3BvbnNlW10gfSA9IHt9XG4gIG9iaktleXMgPSBPYmplY3Qua2V5c1xuICBmcmFnbWVudCE6IHN0cmluZ1xuICBhY3RpdmVGcmFnbWVudCA9IHRoaXMucm91dGUuZnJhZ21lbnQucGlwZShzaGFyZSgpKVxuICBjdXJyZW50RnJhZ21lbnQgPSAnb3ZlcnZpZXcnXG4gIHNob3dTY3JvbGwhOiBib29sZWFuXG4gIHNob3dTY3JvbGxIZWlnaHQgPSAzMDBcbiAgaGlkZVNjcm9sbEhlaWdodCA9IDEwXG4gIGVsZW1lbnRQb3NpdGlvbjogYW55XG4gIGJhdGNoU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBiYXRjaERhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHJlc3VtZURhdGFTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIEBWaWV3Q2hpbGQoJ3N0aWNreU1lbnUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBtZW51RWxlbWVudCE6IEVsZW1lbnRSZWZcbiAgYmF0Y2hDb250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZClcbiAgY29udGVudFByb2dyZXNzID0gMFxuICBiYW5uZXJVcmw6IFNhZmVTdHlsZSB8IG51bGwgPSBudWxsXG4gIHJvdXRlUGF0aCA9ICdvdmVydmlldydcbiAgdmFsaWRQYXRocyA9IG5ldyBTZXQoWydvdmVydmlldycsICdjb250ZW50cycsICdhbmFseXRpY3MnXSlcbiAgcm91dGVyUGFyYW1TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIGluaXRpYWxyb3V0ZURhdGE6IGFueVxuICBhY3Rpb25CdG5TdGF0dXMgPSAnd2FpdCdcbiAgaXNSZWdpc3RyYXRpb25TdXBwb3J0ZWQgPSBmYWxzZVxuICBzaG93SW50cmFuZXRNZXNzYWdlID0gZmFsc2VcbiAgZmlyc3RSZXNvdXJjZUxpbms6IHsgdXJsOiBzdHJpbmc7IHF1ZXJ5UGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IH0gfCBudWxsID0gbnVsbFxuICByZXN1bWVEYXRhTGluazogeyB1cmw6IHN0cmluZzsgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfSB8IG51bGwgPSBudWxsXG4gIHNob3dUYWtlQXNzZXNzbWVudDogTnNBcHBUb2MuSVBvc3RBc3Nlc3NtZW50IHwgbnVsbCA9IG51bGxcbiAgY2hlY2tSZWdpc3RyYXRpb25Tb3VyY2VzOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoW1xuICAgICdTa2lsbFNvZnQgRGlnaXRhbGl6YXRpb24nLFxuICAgICdTa2lsbFNvZnQgTGVhZGVyc2hpcCcsXG4gICAgJ1BsdXJhbHNpZ2h0JyxcbiAgXSlcbiAgYnRuUGxheWxpc3RDb25maWc6IE5zUGxheWxpc3QuSUJ0blBsYXlsaXN0IHwgbnVsbCA9IG51bGxcbiAgYnRuR29hbHNDb25maWc6IE5zR29hbC5JQnRuR29hbCB8IG51bGwgPSBudWxsXG4gIGV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzOiBURmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgcmVnaXN0ZXJGb3JFeHRlcm5hbCA9IGZhbHNlXG4gIGlzR29hbHNFbmFibGVkID0gZmFsc2VcbiAgY29udGV4dElkPzogc3RyaW5nXG4gIGNvbnRleHRQYXRoPzogc3RyaW5nXG4gIGRlZmF1bHRTTG9nbyA9ICcnXG4gIGRpc2FibGVFbnJvbGxCdG4gPSBmYWxzZVxuICBpc0Fzc2Vzc1Zpc2libGUgPSBmYWxzZVxuICBpc1ByYWN0aWNlVmlzaWJsZSA9IGZhbHNlXG4gIGNlcnRpZmljYXRlT3BlbiA9IGZhbHNlXG4gIGJyZWFkY3J1bWJzOiBhbnlcbiAgaGlzdG9yeURhdGE6IGFueVxuICBjb3Vyc2VDb21wbGV0ZVN0YXRlID0gMlxuICB1c2VySWQ6IGFueVxuICB1c2VyUmF0aW5nOiBhbnlcbiAgZW52aXJvbm1lbnQhOiBhbnlcbiAgZGFrc2h0YU5hbWUgPSAnJ1xuICBjc2Ntc1VybCA9ICcnXG4gIHNob3dCdG4gPSBmYWxzZVxuICBjaGFubmVsSWQ6IGFueVxuICBzZWxlY3RlZEJhdGNoRGF0YTogYW55XG4gIHNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb246IGFueVxuICBzZXJ2ZXJEYXRlU3Vic2NyaXB0aW9uOiBhbnlcbiAgc2VydmVyRGF0ZTogYW55XG4gIGtwYXJyYXk6IGFueSA9IFtdXG4gIGVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICBpc0FjYnBDb3Vyc2UgPSBmYWxzZVxuICBpc0FjYnBDbGFpbSA9IGZhbHNlXG4gIGNvdXJzZUlEOiBhbnlcbiAgaXNDbGFpbWVkID0gZmFsc2VcbiAgbW9udGhseUNhcEV4Y2VlZCA9IGZhbHNlXG4gIGlzQ29tcGxldGVkVGhpc01vbnRoID0gZmFsc2VcbiAgc3RhcnREYXRlOiBhbnlcbiAgZW5kRGF0ZTogYW55XG4gIHN0YXJ0RGF0ZURpZmZlcmVuY2U6IGFueVxuICBlbmREYXRlRGlmZmVyZW5jZTogYW55XG4gIEBWaWV3Q2hpbGQoJ3JpZ2h0Q29udGFpbmVyJykgcmNFbGVtZW50ITogRWxlbWVudFJlZlxuICBAVmlld0NoaWxkKCdiYW5uZXJEZXRhaWxzJywgeyBzdGF0aWM6IHRydWUgfSkgYmFubmVyRWxlbSE6IEVsZW1lbnRSZWZcbiAgQFZpZXdDaGlsZCgnY29udGVudFNvdXJjZScpIGNvbnRlbnRTb3VyY2UhOiBFbGVtZW50UmVmXG4gIHNvdXJjZUVsbGlwc2lzID0gZmFsc2VcbiAgc2Nyb2xsTGltaXQgPSAwXG4gIHJjRWxlbSA9IHtcbiAgICBvZmZTZXRUb3A6IDAsXG4gICAgQm90dG9tUG9zOiAwLFxuICB9XG4gIHNjcm9sbGVkID0gZmFsc2VcbiAgcGF0aFNldCA9IG5ldyBTZXQoKVxuICBjYW5TaGFyZSA9IGZhbHNlXG4gIGVuYWJsZVNoYXJlID0gZmFsc2VcbiAgcm9vdE9yZ0lkOiBhbnlcbiAgY2VydElkOiBhbnlcbiAgbW9iaWxlMTIwMDogYW55XG4gIGFzc2Vzc21lbnRTdHJpcDogYW55XG4gIGxlYXJuQWR2aXNvcnlEYXRhOiBhbnlcbiAgY29udGVudENyZWF0b3JEYXRhOiBhbnkgPSBbXVxuICAvLyByYW5kb21sZWFybkFkdmlzb3J5T2JqOiBhbnlcbiAgLy8gbGVhcm5BZHZpc29yeURhdGFMZW5ndGg6IGFueVxuXG4gIHByaXZhdGUgZGVzdHJveVN1YmplY3QkID0gbmV3IFN1YmplY3Q8YW55PigpXG4gIHRpbWVyVW5zdWJzY3JpYmU6IGFueVxuICB0aW1lcjogYW55XG4gIGlzUmVsZXZlbnRCdG5Ib3ZlcmVkID0gZmFsc2VcbiAgU0FLU0hBTUFJX0lDT05fTk9STUFMID0gJy9hc3NldHMvaW1hZ2VzL3Nha3NoYW1BSS9haS1pY29uLnN2ZydcbiAgU0FLU0hBTUFJX0lDT05fTE9BREVSID0gJy9hc3NldHMvaW1hZ2VzL3Nha3NoYW1BSS9zYWtzaGFtX2FpX2xvYWRlci5naWYnXG4gIHJlY29tbWVuZGVkQ291cnNlc0lkID0gJydcbiAgZmVlZGJhY2tHaXZlbjogYW55XG4gIHByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzID0gZmFsc2VcbiAgZnJvbUFJVHV0b3IgPSBmYWxzZVxuICBzZWxlY3RlZExhbmd1YWdlOiBhbnk7IC8vIFNldCB0aGlzIHRvIHRoZSBkZWZhdWx0L2luaXRpYWwgbGFuZ3VhZ2VcbiAgbGFuZ3VhZ2VMaXN0ID0gW1xuICAgIHsgbmFtZTogXCJFbmdsaXNoXCIsIHZhbHVlOiBcIkVuZ2xpc2hcIiB9LFxuICAgIHsgbmFtZTogXCLgspXgsqjgs43gsqjgsqEgKEthbm5hZGEpXCIsIHZhbHVlOiBcIkthbm5hZGFcIiB9LFxuICAgIHsgbmFtZTogXCLgsKTgsYbgsLLgsYHgsJfgsYEgKFRlbHVndSlcIiwgdmFsdWU6IFwiVGVsdWd1XCIgfSxcbiAgICB7IG5hbWU6IFwi4K6k4K6u4K6/4K604K+NIChUYW1pbClcIiwgdmFsdWU6IFwiVGFtaWxcIiB9LFxuICAgIHsgbmFtZTogXCLgtK7gtLLgtK/gtL7gtLPgtIIgKE1hbGF5YWxhbSlcIiwgdmFsdWU6IFwiTWFsYXlhbGFtXCIgfSxcbiAgICB7IG5hbWU6IFwi4KS54KS/4KSC4KSm4KWAIChIaW5kaSlcIiwgdmFsdWU6IFwiSGluZGlcIiB9LFxuICAgIHsgbmFtZTogXCLgpoXgprjgpq7gp4Dgpq/gprzgpr4gKEFzc2FtZXNlKVwiLCB2YWx1ZTogXCJBc3NhbWVzZVwiIH0sXG4gICAgeyBuYW1lOiBcIuCmrOCmvuCmguCmsuCmviAoQmVuZ2FsaSlcIiwgdmFsdWU6IFwiQmVuZ2FsaVwiIH0sXG4gICAgeyBuYW1lOiBcIuCql+CrgeCqnOCqsOCqvuCqpOCrgCAoR3VqYXJhdGkpXCIsIHZhbHVlOiBcIkd1amFyYXRpXCIgfSxcbiAgICB7IG5hbWU6IFwi4KSu4KSw4KS+4KSg4KWAIChNYXJhdGhpKVwiLCB2YWx1ZTogXCJNYXJhdGhpXCIgfSxcbiAgICB7IG5hbWU6IFwi4KyT4Kyh4Ky/4KyGIChPZGlhKVwiLCB2YWx1ZTogXCJPZGlhXCIgfSxcbiAgICB7IG5hbWU6IFwi4Kiq4Kmw4Kic4Ki+4Kis4KmAIChQdW5qYWJpKVwiLCB2YWx1ZTogXCJQdW5qYWJpXCIgfSxcbiAgICB7IG5hbWU6IFwi4KSV4KWL4KSC4KSV4KSj4KWAIChLb25rYW5pKVwiLCB2YWx1ZTogXCJLb25rYW5pXCIgfSxcbiAgICB7IG5hbWU6IFwi4KSs4KSh4KS84KWLIChCb2RvKVwiLCB2YWx1ZTogXCJCb2RvXCIgfSxcbiAgICB7IG5hbWU6IFwi4KSh4KWL4KSX4KSw4KWAIChEb2dyaSlcIiwgdmFsdWU6IFwiRG9ncmlcIiB9LFxuICAgIHsgbmFtZTogXCLZg9i02YXZitix2YogLyDgpJXgpLbgpY3gpK7gpYDgpLDgpYAgKEthc2htaXJpKVwiLCB2YWx1ZTogXCJLYXNobWlyaVwiIH0sXG4gICAgeyBuYW1lOiBcIuCkruCliOCkpeCkv+CksuClgCAoTWFpdGhpbGkpXCIsIHZhbHVlOiBcIk1haXRoaWxpXCIgfSxcbiAgICB7IG5hbWU6IFwi4Kau4KeI4Kak4KeI4Kay4KeL4Kao4KeNICAoTWFuaXB1cmkgKVwiLCB2YWx1ZTogXCJNYW5pcHVyaVwiIH0sXG4gICAgeyBuYW1lOiBcIuCkqOClh+CkquCkvuCksuClgCAoTmVwYWxpKVwiLCB2YWx1ZTogXCJOZXBhbGlcIiB9LFxuICAgIHsgbmFtZTogXCLgpLjgpILgpLjgpY3gpJXgpYPgpKTgpK7gpY0gKFNhbnNrcml0KVwiLCB2YWx1ZTogXCJTYW5za3JpdFwiIH0sXG4gICAgeyBuYW1lOiBcIuGxpeGxn+GxseGxm+Gxn+GxsuGxpCAoU2FudGFsaSlcIiwgdmFsdWU6IFwiU2FudGFsaVwiIH0sXG4gICAgeyBuYW1lOiBcItiz2YbajNmKIC8g4KS44KS/4KSC4KSn4KWAIChTaW5kaGkpXCIsIHZhbHVlOiBcIlNpbmRoaVwiIH0sXG4gICAgeyBuYW1lOiBcItin2Y/Ysdiv2Y/ZiCAoVXJkdSlcIiwgdmFsdWU6IFwiVXJkdVwiIH1cbiAgXVxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlU2Nyb2xsKCkge1xuICAgIGNvbnN0IHdpbmRvd1Njcm9sbCA9IHdpbmRvdy5wYWdlWU9mZnNldFxuICAgIGlmICh3aW5kb3dTY3JvbGwgPj0gdGhpcy5lbGVtZW50UG9zaXRpb24gLSAxMDApIHtcbiAgICAgIHRoaXMuc3RpY2t5ID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0aWNreSA9IGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2Nyb2xsTGltaXQpIHtcbiAgICAgIGlmICgod2luZG93LnNjcm9sbFkgKyB0aGlzLnJjRWxlbS5Cb3R0b21Qb3MpID49IHRoaXMuc2Nyb2xsTGltaXQpIHtcbiAgICAgICAgdGhpcy5yY0VsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdzdGlja3knXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJ1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIDIzNi4uLiAoT2Zmc2V0VG9wIG9mIHJpZ2h0IGNvbnRhaW5lciArIDEwNClcbiAgICBpZiAod2luZG93LnNjcm9sbFkgPiAodGhpcy5yY0VsZW0ub2ZmU2V0VG9wICsgMTA0KSkge1xuICAgICAgdGhpcy5zY3JvbGxlZCA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGxlZCA9IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGNvbnRlbnRTdmM6IFdpZGdldENvbnRlbnRTZXJ2aWNlLFxuICAgIHB1YmxpYyB0b2NTdmM6IEFwcFRvY1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBsb2dnZXJTdmM6IExvZ2dlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTdmM6IENvbmZpZ3VyYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGRvbVNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgIHByaXZhdGUgYXV0aEFjY2Vzc0NvbnRyb2xTdmM6IEFjY2Vzc0NvbnRyb2xTZXJ2aWNlLFxuICAgIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBtb2JpbGVBcHBzU3ZjOiBNb2JpbGVBcHBzU2VydmljZSxcbiAgICBwcml2YXRlIHV0aWxpdHlTdmM6IFV0aWxpdHlTZXJ2aWNlLFxuICAgIC8vIHByaXZhdGUgcHJvZ3Jlc3NTdmM6IENvbnRlbnRQcm9ncmVzc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3Rpb25TVkM6IEFjdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB2aWV3ZXJTdmM6IFZpZXdlclV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmF0aW5nU3ZjOiBSYXRpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGVsZW1ldHJ5U2VydmljZTogVGVsZW1ldHJ5U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGxhbmd0cmFuc2xhdGlvbnM6IE11bHRpbGluZ3VhbFRyYW5zbGF0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudHM6IEV2ZW50U2VydmljZSxcbiAgICBwcml2YXRlIG1hdFNuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwcml2YXRlIGxvYWRDaGVja1NlcnZpY2U6IExvYWRDaGVja1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBoYW5kbGVDbGFpbVNlcnZpY2U6IEhhbmRsZUNsYWltU2VydmljZSxcbiAgICBwcml2YXRlIHJlc2V0UmF0aW5nc1NlcnZpY2U6IFJlc2V0UmF0aW5nc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0aW1lclNlcnZpY2U6IFRpbWVyU2VydmljZSxcbiAgICBwdWJsaWMgZW5yb2xsU3ZjOiBXaWRnZXRFbnJvbGxTZXJ2aWNlLFxuICAgIHB1YmxpYyBjb250ZW50TGliU3ZjOiBXaWRnZXRDb250ZW50TGliU2VydmljZSxcbiAgICBwdWJsaWMgZGF0YVRyYW5zZmVyU3ZjOiBEYXRhVHJhbnNmZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWF0U25hY2tiYXJOZXc6IE1hdFNuYWNrYmFyTmV3LFxuICAgIHByaXZhdGUgdXNlclNlcnZpY2VMaWI6IFdpZGdldFVzZXJTZXJ2aWNlTGliLFxuICAgIHB1YmxpYyBuZXRDb3JlU2VydmljZTogTmV0Q29yZVNlcnZpY2UsXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBlbnZpcm9ubWVudDogYW55XG4gICkge1xuICAgIHRoaXMuZW52aXJvbm1lbnQgPSBlbnZpcm9ubWVudFxuICAgIHRoaXMuZGFrc2h0YU5hbWUgPSB0aGlzLmVudmlyb25tZW50LmRha3NodGFOYW1lXG4gICAgdGhpcy5jc2Ntc1VybCA9IHRoaXMuZW52aXJvbm1lbnQuY3NjbXNVcmxcbiAgICB0aGlzLmhpc3RvcnlEYXRhID0gaGlzdG9yeS5zdGF0ZVxuICAgIHRoaXMuaGFuZGxlQnJlYWRjcnVtYnMoKVxuICAgIHRoaXMubW9iaWxlQXBwc1N2Yy5tb2JpbGVUb3BIZWFkZXJWaXNpYmlsaXR5U3RhdHVzLm5leHQodHJ1ZSlcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dlYnNpdGVMYW5ndWFnZScpKSB7XG4gICAgICB0aGlzLnRyYW5zbGF0ZS5zZXREZWZhdWx0TGFuZygnZW4nKVxuICAgICAgY29uc3QgbGFuZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKSFcbiAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShsYW5nKVxuICAgIH1cblxuICAgIHRoaXMubG9hZENoZWNrU2VydmljZS5jaGlsZENvbXBvbmVudExvYWRlZCQuc3Vic2NyaWJlKF9pc0xvYWRlZCA9PiB7XG4gICAgICAvLyBQcmVzZW50IGluIGFwcC10b2MtYWJvdXQuY29tcG9uZW50XG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhdGluZ3NEaXYnKSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCByYXRpbmdzRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhdGluZ3NEaXYnKSBhcyBhbnlcbiAgICAgICAgICBpZiAocmF0aW5nc0Rpdikge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxMaW1pdCA9IHJhdGluZ3NEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIGFzIGFueVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgNTAwKVxuICAgICAgfVxuXG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRlbnRDb250YWluZXInKSkge1xuICAgICAgICBjb25zdCBjb250ZW50RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRlbnRDb250YWluZXInKSBhcyBhbnlcbiAgICAgICAgaWYgKGNvbnRlbnREaXYpIHtcbiAgICAgICAgICB0aGlzLnNjcm9sbExpbWl0ID0gY29udGVudERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gYXMgYW55XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5oYW5kbGVDbGFpbVNlcnZpY2UuZ2V0Q2xhaW1EYXRhKCkuc3Vic2NyaWJlKChfZXZlbnREYXRhOiBhbnkpID0+IHtcbiAgICAgIHRoaXMub25DbGlja09mQ2xhaW0oX2V2ZW50RGF0YSlcbiAgICB9KVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5kYXRhVHJhbnNmZXJTdmMuc2V0RW5yb2xsRGF0YShudWxsKVxuICAgIHRoaXMubW9iaWxlMTIwMCA9IHdpbmRvdy5pbm5lcldpZHRoIDwgMTIwMVxuICAgIHRoaXMuY29uZmlnU3ZjLmxhbmd1YWdlVHJhbnNsYXRpb25GbGFnLnN1YnNjcmliZSgoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoZGF0YSkge1xuICAgICAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dlYnNpdGVMYW5ndWFnZScpKSB7XG4gICAgICAgICAgdGhpcy50cmFuc2xhdGUuc2V0RGVmYXVsdExhbmcoJ2VuJylcbiAgICAgICAgICBjb25zdCBsYW5nID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dlYnNpdGVMYW5ndWFnZScpIVxuICAgICAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShsYW5nKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEucGFnZURhdGEgJiYgdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhLmRhdGEpIHtcbiAgICAgIHRoaXMubGVhcm5BZHZpc29yeURhdGEgPSB0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGEucGFnZURhdGEuZGF0YS5sZWFybmVyQWR2aXNvcnlcbiAgICAgIC8vIHRoaXMubGVhcm5BZHZpc29yeURhdGFMZW5ndGggPSB0aGlzLmxlYXJuQWR2aXNvcnlEYXRhLmxlbmd0aFxuXG4gICAgfVxuXG4gICAgdGhpcy5nZXRTZXJ2ZXJEYXRlVGltZSgpXG4gICAgLy8gdGhpcy5kaXNwbGF5UmFuZG9tbGVhcm5BZHZpc29yeURhdGEoKVxuXG4gICAgdGhpcy5zZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuZ2V0U2VsZWN0ZWRCYXRjaC5zdWJzY3JpYmUoYmF0Y2hEYXRhID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgPSBiYXRjaERhdGFcbiAgICB9KVxuXG4gICAgdGhpcy5zZXJ2ZXJEYXRlU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuc2VydmVyRGF0ZS5zdWJzY3JpYmUoc2VydmVyRGF0ZSA9PiB7XG4gICAgICB0aGlzLnNlcnZlckRhdGUgPSBzZXJ2ZXJEYXRlXG4gICAgfSlcblxuICAgIHRoaXMuY2hhbm5lbElkID0gdGhpcy50ZWxlbWV0cnlTZXJ2aWNlLnRlbGVtZXRyeUNvbmZpZyA/IHRoaXMudGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlDb25maWcuY2hhbm5lbCA6ICcnXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaXNJbklmcmFtZSA9IHdpbmRvdy5zZWxmICE9PSB3aW5kb3cudG9wXG4gICAgfSBjYXRjaCAoX2V4KSB7XG4gICAgICB0aGlzLmlzSW5JZnJhbWUgPSBmYWxzZVxuICAgIH1cblxuICAgIGlmICh0aGlzLnJvdXRlKSB7XG4gICAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gdHJ1ZVxuICAgICAgdGhpcy5yb3V0ZVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGUuZGF0YS5zdWJzY3JpYmUoYXN5bmMgKGRhdGE6IERhdGEpID0+IHtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5jb250ZW50ICYmIGRhdGEuY29udGVudC5kYXRhICYmIGRhdGEuY29udGVudC5kYXRhLmlkZW50aWZpZXIpIHtcbiAgICAgICAgICB0aGlzLmNvdXJzZUlEID0gZGF0YS5jb250ZW50LmRhdGEuaWRlbnRpZmllclxuICAgICAgICAgIHRoaXMudG9jU3ZjLmZldGNoR2V0Q29udGVudERhdGEoZGF0YS5jb250ZW50LmRhdGEuaWRlbnRpZmllcikuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YSA9IHJlcy5yZXN1bHQuY29udGVudFxuICAgICAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuY29udGVudFJlYWREYXRhJywgdGhpcy5jb250ZW50UmVhZERhdGEpXG4gICAgICAgICAgICB0aGlzLmdldFByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzKClcbiAgICAgICAgICB9LCAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWVycm9yLm9rKSB7XG4gICAgICAgICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbignVW5hYmxlIHRvIGZldGNoIGNvbnRlbnQgZGF0YSwgZHVlIHRvIHNvbWUgZXJyb3IhJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIGNvbnN0IGluaXREYXRhID0gdGhpcy50b2NTdmMuaW5pdERhdGEoZGF0YSwgdHJ1ZSlcbiAgICAgICAgICB0aGlzLmNvbnRlbnQgPSBpbml0RGF0YS5jb250ZW50XG4gICAgICAgICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgICAgICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnRvY1N2Yy5mZXRjaENvdXJzZUhlaXJhcmNoeSh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jaGVja01vZHVsZVdpc2VEYXRhKHRoaXMuY29udGVudClcbiAgICAgICAgICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZldGNoVXNlckVucm9sbG1lbnREYXRhKCk7XG5cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pbml0aWFscm91dGVEYXRhID0gZGF0YVxuICAgICAgICAgIHRoaXMuYmFubmVycyA9IGRhdGEucGFnZURhdGEuZGF0YS5iYW5uZXJzXG4gICAgICAgICAgdGhpcy50b2NTdmMuc3VidGl0bGVPbkJhbm5lcnMgPSBkYXRhLnBhZ2VEYXRhLmRhdGEuc3VidGl0bGVPbkJhbm5lcnMgfHwgZmFsc2VcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5zaG93RGVzY3JpcHRpb24gPSBkYXRhLnBhZ2VEYXRhLmRhdGEuc2hvd0Rlc2NyaXB0aW9uIHx8IGZhbHNlXG4gICAgICAgICAgdGhpcy50b2NDb25maWcgPSBkYXRhLnBhZ2VEYXRhLmRhdGFcbiAgICAgICAgICB0aGlzLmtwYXJyYXkgPSB0aGlzLnRvY0NvbmZpZy5rYXJtYVBvaW50c1xuICAgICAgICAgIHRoaXMudG9jQ29uZmlnID0gZGF0YS5wYWdlRGF0YS5kYXRhXG4gICAgICAgICAgdGhpcy5rcGFycmF5ID0gdGhpcy50b2NDb25maWcua2FybWFQb2ludHNcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuaXNQb3N0QXNzZXNzbWVudCkge1xuICAgICAgICAgICAgdGhpcy50b2NTdmMuZmV0Y2hQb3N0QXNzZXNzbWVudFN0YXR1cyh0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IGFzc2Vzc21lbnREYXRhID0gcmVzLnJlc3VsdFxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG8gb2YgYXNzZXNzbWVudERhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoby5jb250ZW50SWQgPT09ICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNob3dUYWtlQXNzZXNzbWVudCA9IG9cbiAgICAgICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmluaXREYXRhKGRhdGEpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuXG4gICAgdGhpcy5jdXJyZW50RnJhZ21lbnQgPSAnb3ZlcnZpZXcnXG4gICAgdGhpcy5yb3V0ZS5mcmFnbWVudC5zdWJzY3JpYmUoKGZyYWdtZW50OiBhbnkpID0+IHtcbiAgICAgIHRoaXMuY3VycmVudEZyYWdtZW50ID0gZnJhZ21lbnQgfHwgJ292ZXJ2aWV3J1xuICAgIH0pXG5cbiAgICB0aGlzLmJhdGNoU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuYmF0Y2hSZXBsYXlTdWJqZWN0LnN1YnNjcmliZShcbiAgICAgICgpID0+IHtcbiAgICAgICAgdGhpcy5mZXRjaEJhdGNoRGV0YWlscygpXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgKHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSkpIHtcbiAgICAgICAgICB0aGlzLmZldGNoVXNlcldGRm9yQmxlbmRlZCgpXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoKSA9PiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLmxvZygnZXJyb3Igb24gYmF0Y2hTdWJzY3JpcHRpb24nKVxuICAgICAgfSxcbiAgICApXG5cbiAgICB0aGlzLmJhdGNoRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLnNldEJhdGNoRGF0YVN1YmplY3Quc3Vic2NyaWJlKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jb250ZW50ICYmICh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0pKSB7XG4gICAgICAgICAgdGhpcy5mZXRjaFVzZXJXRkZvckJsZW5kZWQoKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIG9uIGJhdGNoRGF0YVN1YnNjcmlwdGlvbicpXG4gICAgICB9LFxuICAgIClcblxuICAgIGNvbnN0IGluc3RhbmNlQ29uZmlnID0gdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWdcbiAgICBpZiAoaW5zdGFuY2VDb25maWcgJiYgaW5zdGFuY2VDb25maWcubG9nb3MgJiYgaW5zdGFuY2VDb25maWcubG9nb3MuZGVmYXVsdFNvdXJjZUxvZ28pIHtcbiAgICAgIHRoaXMuZGVmYXVsdFNMb2dvID0gaW5zdGFuY2VDb25maWcubG9nb3MuZGVmYXVsdFNvdXJjZUxvZ29cbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzKSB7XG4gICAgICB0aGlzLmlzR29hbHNFbmFibGVkID0gIXRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ2dvYWxzJylcbiAgICB9XG5cbiAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZS5xdWVyeVBhcmFtTWFwLnN1YnNjcmliZShhc3luYyBxUGFyYW1zTWFwID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHRJZCA9IHFQYXJhbXNNYXAuZ2V0KCdjb250ZXh0SWQnKVxuICAgICAgY29uc3QgY29udGV4dFBhdGggPSBxUGFyYW1zTWFwLmdldCgnY29udGV4dFBhdGgnKVxuICAgICAgY29uc3QgcmVjb21tZW5kZWRDb3Vyc2VzSWQgPSBxUGFyYW1zTWFwLmdldCgncmVjb21tZW5kYXRpb25JZCcpXG4gICAgICBpZiAoY29udGV4dElkICYmIGNvbnRleHRQYXRoKSB7XG4gICAgICAgIHRoaXMuY29udGV4dElkID0gY29udGV4dElkXG4gICAgICAgIHRoaXMuY29udGV4dFBhdGggPSBjb250ZXh0UGF0aFxuICAgICAgfVxuICAgICAgaWYgKHJlY29tbWVuZGVkQ291cnNlc0lkKSB7XG4gICAgICAgIHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQgPSByZWNvbW1lbmRlZENvdXJzZXNJZFxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2VMaWIuZ2V0UmVjb21tZW5kZWRDb3Vyc2VzU2Frc2hhbUFJKHJlY29tbWVuZGVkQ291cnNlc0lkKS50b1Byb21pc2UoKVxuICAgICAgICBpZiAocmVzcG9uc2UuZmVlZGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZmVlZGJhY2tHaXZlbiA9IHJlc3BvbnNlLmZlZWRiYWNrcy5maW5kKChmZWVkYmFjazogYW55KSA9PiBmZWVkYmFjaz8uY291cnNlX2lkID09PSB0aGlzLmNvdXJzZUlEKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAocmVjb21tZW5kZWRDb3Vyc2VzSWQpIHtcbiAgICAgICAgdGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCA9IHJlY29tbWVuZGVkQ291cnNlc0lkXG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy51c2VyU2VydmljZUxpYi5nZXRSZWNvbW1lbmRlZENvdXJzZXNTYWtzaGFtQUkocmVjb21tZW5kZWRDb3Vyc2VzSWQpLnRvUHJvbWlzZSgpXG4gICAgICAgIGlmIChyZXNwb25zZS5mZWVkYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5mZWVkYmFja0dpdmVuID0gcmVzcG9uc2UuZmVlZGJhY2tzLmZpbmQoKGZlZWRiYWNrOiBhbnkpID0+IGZlZWRiYWNrPy5jb3Vyc2VfaWQgPT09IHRoaXMuY291cnNlSUQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcykge1xuICAgICAgdGhpcy5pc1JlZ2lzdHJhdGlvblN1cHBvcnRlZCA9IHRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ3JlZ2lzdHJhdGlvbkV4dGVybmFsJylcbiAgICAgIHRoaXMuc2hvd0ludHJhbmV0TWVzc2FnZSA9ICF0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMuaGFzKFxuICAgICAgICAnc2hvd0ludHJhbmV0TWVzc2FnZURlc2t0b3AnLFxuICAgICAgKVxuICAgIH1cblxuICAgIHRoaXMuY2hlY2tSZWdpc3RyYXRpb25TdGF0dXMoKVxuICAgIHRoaXMucm91dGVyUGFyYW1TdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlci5ldmVudHMuc3Vic2NyaWJlKChyb3V0ZXJFdmVudDogRXZlbnQpID0+IHtcbiAgICAgIGlmIChyb3V0ZXJFdmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpIHtcbiAgICAgICAgdGhpcy5hc3NpZ25QYXRoQW5kVXBkYXRlQmFubmVyKHJvdXRlckV2ZW50LnVybClcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgY29uc3QgY29udGVudE5hbWUgPSB0aGlzLmNvbnRlbnQubmFtZS50cmltKClcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuY3JlYXRvckNvbnRhY3RzKSB7XG4gICAgICAgIHRoaXMuY29udGVudENyZWF0b3JEYXRhID0gdGhpcy5oYW5kbGVQYXJzZUpzb25EYXRhKHRoaXMuY29udGVudC5jcmVhdG9yQ29udGFjdHMpXG4gICAgICB9XG4gICAgICBpZiAoKGNvbnRlbnROYW1lKS50b0xvd2VyQ2FzZSgpID09PSB0aGlzLmRha3NodGFOYW1lLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgdGhpcy5zaG93QnRuID0gdHJ1ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93QnRuID0gZmFsc2VcbiAgICAgIH1cbiAgICAgIHRoaXMuYnRuUGxheWxpc3RDb25maWcgPSB7XG4gICAgICAgIGNvbnRlbnRJZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgIGNvbnRlbnROYW1lOiB0aGlzLmNvbnRlbnQubmFtZSxcbiAgICAgICAgY29udGVudFR5cGU6IHRoaXMuY29udGVudC5jb250ZW50VHlwZSxcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5OiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICBtb2RlOiAnZGlhbG9nJyxcbiAgICAgIH1cbiAgICAgIHRoaXMuYnRuR29hbHNDb25maWcgPSB7XG4gICAgICAgIGNvbnRlbnRJZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgIGNvbnRlbnROYW1lOiB0aGlzLmNvbnRlbnQubmFtZSxcbiAgICAgICAgY29udGVudFR5cGU6IHRoaXMuY29udGVudC5jb250ZW50VHlwZSxcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5OiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYmICFbXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9DT1VSU0UsXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9BU1NFU1NFTUVOVCxcbiAgICAgIE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0sXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LklOVklURV9PTkxZX1BST0dSQU0sXG4gICAgXS5pbmNsdWRlcyh0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkpKSB7XG4gICAgICB0aGlzLmNhblNoYXJlID0gdHJ1ZVxuICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gICAgICAgIHRoaXMucm9vdE9yZ0lkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUucm9vdE9yZ0lkXG4gICAgICB9XG4gICAgfVxuXG5cbiAgfVxuXG4gIC8vIGRpc3BsYXlSYW5kb21sZWFybkFkdmlzb3J5RGF0YSgpOiB2b2lkIHtcbiAgLy8gICBjb25zdCByYW5kb21JbmRleCA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIHRoaXMubGVhcm5BZHZpc29yeURhdGEubGVuZ3RoKVxuICAvLyAgIHRoaXMucmFuZG9tbGVhcm5BZHZpc29yeU9iaiA9IHRoaXMubGVhcm5BZHZpc29yeURhdGFbcmFuZG9tSW5kZXhdXG4gIC8vIH1cblxuICBnZXRLYXJtYXBvaW50c0xpbWl0KCkge1xuICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmMudXNlckthcm1hUG9pbnRzKCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICBpZiAocmVzICYmIHJlcy5rcExpc3QpIHtcbiAgICAgICAgICBjb25zdCBpbmZvID0gcmVzLmtwTGlzdC5hZGRpbmZvXG4gICAgICAgICAgaWYgKGluZm8pIHtcbiAgICAgICAgICAgIHRoaXMubW9udGhseUNhcEV4Y2VlZCA9IEpTT04ucGFyc2UoaW5mbykuY2xhaW1lZE5vbkFDQlBDb3Vyc2VLYXJtYVF1b3RhID49IDRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgaXNDb3Vyc2VDb21wbGV0ZWRPblRoaXNNb250aCgpIHtcbiAgICBjb25zdCBub3cgPSBtb21lbnQodGhpcy5zZXJ2ZXJEYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGNvdXJzZURhdGEgPSB0aGlzLmVucm9sbGVkQ291cnNlRGF0YVxuICAgICAgaWYgKGNvdXJzZURhdGEgJiYgY291cnNlRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwICYmIGNvdXJzZURhdGEuY29tcGxldGVkT24pIHtcbiAgICAgICAgY29uc3QgY29tcGxldGVkT24gPSBtb21lbnQoY291cnNlRGF0YS5jb21wbGV0ZWRPbikuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICAgICAgY29uc3QgY29tcGxldGVkTW9udGggPSBtb21lbnQoY29tcGxldGVkT24sICdZWVlZLU1NLUREJykubW9udGgoKVxuICAgICAgICBjb25zdCBjdXJyZW50TW9udGggPSBtb21lbnQobm93LCAnWVlZWS1NTS1ERCcpLm1vbnRoKClcbiAgICAgICAgdGhpcy5pc0NvbXBsZXRlZFRoaXNNb250aCA9IGNvbXBsZXRlZE1vbnRoID09PSBjdXJyZW50TW9udGhcbiAgICAgICAgdGhpcy5jb250ZW50Wyd2aWV3TW9yZSddID0gZmFsc2VcbiAgICAgICAgdGhpcy5jb250ZW50Wydjb21wbGV0ZWRPbiddID0gY291cnNlRGF0YS5jb21wbGV0ZWRPblxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZpbHRlcmVkQWNicExpc3QocmVzOiBhbnkpIHtcbiAgICByZXR1cm4gcmVzLmZpbHRlcigodjogYW55KSA9PiB2LmlkZW50aWZpZXIgPT09IHRoaXMuY291cnNlSUQpXG4gIH1cblxuICBmaW5kQUNQQigpIHtcbiAgICBjb25zdCBsb2NhbENicCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdjYnBEYXRhJylcbiAgICBpZiAobG9jYWxDYnApIHtcbiAgICAgIGNvbnN0IHN0b3JlYWdlQ2JwID0gSlNPTi5wYXJzZShsb2NhbENicClcbiAgICAgIGNvbnN0IGNicCA9IHRoaXMuZmlsdGVyZWRBY2JwTGlzdChzdG9yZWFnZUNicClcbiAgICAgIGlmIChjYnAubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGFjYnAgPSAnY2JQbGFuJ1xuICAgICAgICB0aGlzLmNiUGxhbkVuZERhdGUgPSBjYnBbMF0uZW5kRGF0ZVxuICAgICAgICBjb25zdCBzRGF0ZSA9IGRheWpzKHRoaXMuc2VydmVyRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICAgICAgY29uc3QgZGF5c0NvdW50ID0gZGF5anModGhpcy5jYlBsYW5FbmREYXRlKS5kaWZmKHRoaXMuc2VydmVyRGF0ZSwgJ2RheScpXG4gICAgICAgIHRoaXMuY2JQbGFuRHVyYXRpb24gPSBkYXlzQ291bnQgPCAwID8gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuT1ZFUkRVRSA6IGRheXNDb3VudCA+IDI5XG4gICAgICAgICAgPyBOc0NhcmRDb250ZW50LkFDQlBDb25zdC5TVUNDRVNTIDogTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuVVBDT01JTkdcbiAgICAgICAgaWYgKGFjYnAgJiYgdGhpcy5jYlBsYW5FbmREYXRlICYmIGFjYnAgPT09ICdjYlBsYW4nKSB7XG4gICAgICAgICAgdGhpcy5pc0FjYnBDb3Vyc2UgPSB0cnVlXG4gICAgICAgICAgY29uc3QgZURhdGUgPSBkYXlqcyh0aGlzLmNiUGxhbkVuZERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICAgICAgaWYgKGRheWpzKHNEYXRlKS5pc1NhbWVPckJlZm9yZShlRGF0ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RPYmogPSB7XG4gICAgICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICBjb250ZXh0VHlwZTogJ0NvdXJzZScsXG4gICAgICAgICAgICAgICAgICBjb250ZXh0SWQ6IHRoaXMuY291cnNlSUQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udGVudFN2Yy5nZXRDb3Vyc2VLYXJtYVBvaW50cyhyZXF1ZXN0T2JqKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmtwTGlzdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHJlcy5rcExpc3RcbiAgICAgICAgICAgICAgICBpZiAocm93LmFkZGluZm8pIHtcbiAgICAgICAgICAgICAgICAgIGlmIChKU09OLnBhcnNlKHJvdy5hZGRpbmZvKS5BQ0JQKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2xhaW1lZCA9IHRydWVcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSB0cnVlXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSB0cnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNBY2JwQ2xhaW0gPSB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmFpc2VUZWxlbWV0ZXJ5Rm9yUHJvdmlkZXIocHJvdmlkZXJOYW1lOiBzdHJpbmcsIHByaXZpZGVySWQ6IHN0cmluZykge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIGlkOiAnYnRuLXByb3ZpZGVyJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiBwcm92aWRlck5hbWUsXG4gICAgICAgIHR5cGU6IHByaXZpZGVySWQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYWdlSWRFeHQ6ICdidG4tcHJvdmlkZXInLFxuICAgICAgICBtb2R1bGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnltb2R1bGVzLkNPTlRFTlQsXG4gICAgICB9KVxuXG4gIH1cblxuICByYWlzZVRlbGVtZXRyeSgpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBzdWJUeXBlOiAna2FybWFwb2ludHMtY2xhaW0nLFxuICAgICAgICBpZDogdGhpcy5jb3Vyc2VJRCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNvdXJzZUlELFxuICAgICAgICB0eXBlOiAnY291cnNlJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhZ2VJZEV4dDogJ2J0bi1hY2JwLWNsYWltJyxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5LQVJNQVBPSU5UUyxcbiAgICAgIH0pXG4gIH1cblxuICBvbkNsaWNrT2ZDbGFpbShldmVudDogYW55KSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGU6bm8tY29uc29sZVxuICAgIGNvbnNvbGUubG9nKGV2ZW50KVxuICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICB1c2VySWQ6IHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLFxuICAgICAgY291cnNlSWQ6IHRoaXMuY291cnNlSUQsXG4gICAgfVxuICAgIHRoaXMucmFpc2VUZWxlbWV0cnkoKVxuICAgIHRoaXMuY29udGVudFN2Yy5jbGFpbUthcm1hcG9pbnRzKHJlcXVlc3QpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKHJlcylcbiAgICAgIHRoaXMuaXNDbGFpbWVkID0gdHJ1ZVxuICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ0thcm1hIHBvaW50cyBhcmUgc3VjY2Vzc2Z1bGx5IGNsYWltZWQuJylcbiAgICAgIC8vIHRoaXMuZ2V0VXNlckVucm9sbG1lbnRMaXN0KClcbiAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgfSwgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUubG9nKGVycm9yKVxuICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ3NvbWV0aGluZyB3ZW50IHdyb25nLicpXG4gICAgfSlcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy5yY0VsZW1lbnQpIHtcbiAgICAgIHRoaXMucmNFbGVtLkJvdHRvbVBvcyA9IHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wICsgdGhpcy5yY0VsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcbiAgICAgIHRoaXMucmNFbGVtLm9mZlNldFRvcCA9IHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0VG9wXG4gICAgfVxuICAgIC8vIEdldCBUaW1lIGZvciB0aGUgYmF0Y2hcbiAgICB0aGlzLnRpbWVyVW5zdWJzY3JpYmUgPSB0aGlzLnRpbWVyU2VydmljZS5nZXRUaW1lckRhdGEoKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveVN1YmplY3QkKSlcbiAgICAgIC5zdWJzY3JpYmUoKF90aW1lcjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMudGltZXIgPSBfdGltZXJcbiAgICAgIH0pXG4gIH1cblxuICBoYW5kbGVCcmVhZGNydW1icygpIHtcbiAgICBpZiAodGhpcy5oaXN0b3J5RGF0YSkge1xuICAgICAgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ1NlYXJjaCcpIHtcbiAgICAgICAgY29uc3Qgc2VhcmNodXJsID0gYC9hcHAvZ2xvYmFsc2VhcmNoYFxuICAgICAgICBjb25zdCBxUGFyYW0gPSB7XG4gICAgICAgICAgcTogdGhpcy5oaXN0b3J5RGF0YS5wYXJhbSxcbiAgICAgICAgfVxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiAnU2VhcmNoJywgdXJsOiBzZWFyY2h1cmwsIHF1ZXJ5UGFyYW1zOiBxUGFyYW0gfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ2NvbXBldGVuY3ktZGV0YWlscycpIHtcbiAgICAgICAgY29uc3QgZmluYWxVcmwgPSBgL2FwcC9sZWFybi9icm93c2UtYnkvY29tcGV0ZW5jeS8ke3RoaXMuaGlzdG9yeURhdGEucGFyYW19YFxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICB0aGlzLmJyZWFkY3J1bWJzID0geyB1cmw6ICdob21lJywgdGl0bGVzOiBbeyB0aXRsZTogdGhpcy5oaXN0b3J5RGF0YS5wYXJhbSwgdXJsOiBmaW5hbFVybCB9LCB7IHRpdGxlOiAnRGV0YWlscycsIHVybDogJ25vbmUnIH1dIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5oaXN0b3J5RGF0YS5wYXRoID09PSAnYWxsLUNCUCcpIHtcbiAgICAgICAgY29uc3QgZmluYWxVUkwgPSBgL2FwcC9sZWFybi9icm93c2UtYnkvcHJvdmlkZXIvJHt0aGlzLmhpc3RvcnlEYXRhLnBhcmFtfWBcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6IGBhbGwgQ0JQJ3NgLCB1cmw6IGZpbmFsVVJMIH0sIHsgdGl0bGU6ICdEZXRhaWxzJywgdXJsOiAnbm9uZScgfV0gfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmhpc3RvcnlEYXRhLnBhdGggPT09ICdhbGwtY29tcGV0ZW5jaWVzJykge1xuICAgICAgICBjb25zdCBmaW5hbFVybCA9IGAvYXBwL2xlYXJuL2Jyb3dzZS1ieS9jb21wZXRlbmN5L2FsbC1jb21wZXRlbmNpZXNgXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiAnYWxsIGNvbXBldGVuY2llcycsIHVybDogZmluYWxVcmwgfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ2N1cmF0ZWRDb2xsZWN0aW9ucycpIHtcbiAgICAgICAgY29uc3QgZmluYWxVcmwgPSBgL2FwcC9jdXJhdGVkQ29sbGVjdGlvbnMvaG9tZWBcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6ICdjdXJhdGVkIGNvbGxlY3Rpb25zJywgdXJsOiBmaW5hbFVybCB9LCB7IHRpdGxlOiAnRGV0YWlscycsIHVybDogJ25vbmUnIH1dIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6ICdMZWFybicsIHVybDogJy9wYWdlL2xlYXJuJywgaWNvbjogJ3NjaG9vbCcgfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5mcmFnbWVudCkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLW5vbi1udWxsLWFzc2VydGlvblxuICAgICAgICBkb2N1bWVudCEucXVlcnlTZWxlY3RvcihgIyR7dGhpcy5mcmFnbWVudH1gKSEuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogODAsXG4gICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHsgfVxuICB9XG5cbiAgZ2V0IGVuYWJsZUFuYWx5dGljcygpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzKSB7XG4gICAgICByZXR1cm4gIXRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ3RvY0FuYWx5dGljcycpXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IGlzUmVzb3VyY2UoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgY29uc3QgaXNSZXNvdXJjZSA9IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LktOT1dMRURHRV9BUlRJRkFDVCB8fFxuICAgICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRVxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5QUkFDVElDRV9SRVNPVVJDRVxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5GSU5BTF9BU1NFU1NNRU5UXG4gICAgICAgIHx8IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPTVBfQVNTRVNTTUVOVFxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5PRkZMSU5FX1NFU1NJT05cbiAgICAgICAgfHwgISh0aGlzLmNvbnRlbnQuY2hpbGRyZW4gJiYgdGhpcy5jb250ZW50LmNoaWxkcmVuLmxlbmd0aClcbiAgICAgIGlmIChpc1Jlc291cmNlKSB7XG4gICAgICAgIHRoaXMubW9iaWxlQXBwc1N2Yy5zZW5kVmlld2VyRGF0YSh0aGlzLmNvbnRlbnQpXG4gICAgICB9XG4gICAgICByZXR1cm4gaXNSZXNvdXJjZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBnZXRTdGFydERhdGUoKSB7XG4gICAgaWYgKHRoaXMuZW5yb2xsZWRDb3Vyc2VEYXRhKSB7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgLy8gY29uc3QgYmF0Y2ggPSBfLmZpcnN0KF8uZmlsdGVyKHRoaXMuY29udGVudFsnYmF0Y2hlcyddLCB7IGJhdGNoSWQ6IHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQgfSkgfHwgW10pXG4gICAgICBjb25zdCBiYXRjaCA9IHRoaXMuZW5yb2xsZWRDb3Vyc2VEYXRhLmJhdGNoXG4gICAgICB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkID0gYmF0Y2guYmF0Y2hJZFxuICAgICAgaWYgKGJhdGNoICYmIHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQpIHtcbiAgICAgICAgdGhpcy5zdGFydERhdGUgPSAoXy5nZXQoYmF0Y2gsICdzdGFydERhdGUnKSlcbiAgICAgICAgLy8gY29uc3QgcGFyc2VkRGF0ZSA9IG1vbWVudCh0aGlzLnN0YXJ0RGF0ZSk7XG4gICAgICAgIC8vIGNvbnN0IGRhdGVPbmx5ID0gcGFyc2VkRGF0ZS5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICBjb25zdCBzdGFydERhdGVUaW1lID0gdGhpcy5zdGFydERhdGUgJiYgbmV3IERhdGUodGhpcy5zdGFydERhdGUpLmdldFRpbWUoKVxuICAgICAgICB0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgPSBzdGFydERhdGVUaW1lIC0gbm93XG4gICAgICAgIGlmICh0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgJiYgdGhpcy5zdGFydERhdGVEaWZmZXJlbmNlID4gMCkge1xuICAgICAgICAgIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSAvICgxMDAwICogNjAgKiA2MCAqIDI0KSlcbiAgICAgICAgICBjb25zdCBob3VycyA9IE1hdGguZmxvb3IoKHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSAlICgxMDAwICogNjAgKiA2MCAqIDI0KSkgLyAoMTAwMCAqIDYwICogNjApKVxuICAgICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKCh0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgJSAoMTAwMCAqIDYwICogNjApKSAvICgxMDAwICogNjApKVxuICAgICAgICAgIHJldHVybiAoYCR7ZGF5c30gRGF5cyA6ICR7aG91cnN9IEhvdXJzIDogJHttaW51dGVzfSBNaW51dGVzYClcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ05BJ1xuICAgICAgfVxuICAgICAgcmV0dXJuICdOQSdcbiAgICAgIC8vIGlmIChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpICYmIG1vbWVudChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpKS5pc0FmdGVyKCkpIHtcbiAgICAgIC8vICAgcmV0dXJuIG1vbWVudChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpKS5mcm9tKG5vdylcbiAgICAgIC8vIH1cbiAgICAgIC8vIGlmIChfLmdldChiYXRjaCwgJ2VuZERhdGUnKSAmJiBtb21lbnQoXy5nZXQoYmF0Y2gsICdlbmREYXRlJykpLmlzQmVmb3JlKCkpIHtcbiAgICAgIC8vICAgcmV0dXJuICdOQSdcbiAgICAgIC8vIH1cbiAgICAgIC8vIGlmIChzdGFydERhdGVUaW1lICYmIG1vbWVudChzdGFydERhdGVUaW1lKS5pc0FmdGVyKCkpICB7XG4gICAgICAvLyAgIHJldHVybiBtb21lbnQoc3RhcnREYXRlVGltZSkuZnJvbShub3cpXG4gICAgICAvLyB9XG4gICAgICAvLyBpZiAoZW5kRGF0ZVRpbWUgJiYgbW9tZW50KGVuZERhdGVUaW1lKS5pc0JlZm9yZSgpKSB7XG4gICAgICAvLyAgICAgcmV0dXJuICdOQSdcbiAgICAgIC8vICAgfVxuICAgICAgLy8gcmV0dXJuICdOQSdcbiAgICB9IHJldHVybiAnTkEnXG4gIH1cblxuICBnZXQgaXNCYXRjaEluUHJvZ3Jlc3MoKSB7XG4gICAgLy8gaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnRbJ2JhdGNoZXMnXSkge1xuICAgIC8vIGNvbnN0IGJhdGNoZXMgPSB0aGlzLmNvbnRlbnRbJ2JhdGNoZXMnXSBhcyBOc0NvbnRlbnQuSUJhdGNoXG4gICAgLy8gaWYgKHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQpIHtcbiAgICAvLyAgIC8vIGNvbnN0IG5vdyA9IG1vbWVudCgpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpXG4gICAgLy8gICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgIC8vICAgaWYgKHRoaXMuYmF0Y2hEYXRhICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQpIHtcbiAgICAvLyAgICAgY29uc3QgYmF0Y2ggPSBfLmZpcnN0KF8uZmlsdGVyKHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQsIHsgYmF0Y2hJZDogdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCB9KSB8fCBbXSlcbiAgICAvLyAgICAgaWYgKGJhdGNoKSB7XG4gICAgLy8gICAgICAgLy8gY29uc3Qgc3RhcnREYXRlID0gbW9tZW50KGJhdGNoLnN0YXJ0RGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJylcbiAgICAvLyAgICAgICAvLyBjb25zdCBlbmREYXRlID0gYmF0Y2guZW5kRGF0ZSA/IG1vbWVudChiYXRjaC5lbmREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKSA6IG5vd1xuICAgIC8vICAgICAgIC8vIHJldHVybiAoXG4gICAgLy8gICAgICAgLy8gICAvLyBiYXRjaC5zdGF0dXMgJiZcbiAgICAvLyAgICAgICAvLyAgIG1vbWVudChzdGFydERhdGUpLmlzU2FtZU9yQmVmb3JlKG5vdylcbiAgICAvLyAgICAgICAvLyAgICYmIG1vbWVudChlbmREYXRlKS5pc1NhbWVPckFmdGVyKG5vdylcbiAgICAvLyAgICAgICAvLyApXG4gICAgLy8gICAgICAgdGhpcy5zdGFydERhdGUgPSBiYXRjaCAmJiAoXy5nZXQoYmF0Y2gsICdzdGFydFRpbWUnKSlcbiAgICAvLyAgICAgICB0aGlzLmVuZERhdGUgPSBiYXRjaCAmJiAoXy5nZXQoYmF0Y2gsICdlbmRUaW1lJykpXG4gICAgLy8gICAgICAgY29uc3QgZW5kRGF0ZVRpbWUgPSBuZXcgRGF0ZSh0aGlzLmVuZERhdGUpLmdldFRpbWUoKVxuICAgIC8vICAgICAgIHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPSBlbmREYXRlVGltZSAtIG5vd1xuICAgIC8vICAgICAgIGlmKHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPiAwKSB7XG4gICAgLy8gICAgICAgcmV0dXJuICBiYXRjaC5zdGF0dXNcbiAgICAvLyAgICAgICB9XG4gICAgLy8gICAgIH1cbiAgICAvLyAgICAgcmV0dXJuIGZhbHNlXG4gICAgLy8gICB9XG4gICAgLy8gICByZXR1cm4gZmFsc2VcbiAgICAvLyB9IHJldHVybiBmYWxzZVxuXG4gICAgaWYgKHRoaXMuZW5yb2xsZWRDb3Vyc2VEYXRhKSB7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKVxuICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLmVucm9sbGVkQ291cnNlRGF0YS5iYXRjaFxuICAgICAgdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCA9IGJhdGNoLmJhdGNoSWRcbiAgICAgIGlmIChiYXRjaCAmJiB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkKSB7XG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gKF8uZ2V0KGJhdGNoLCAnc3RhcnREYXRlJykpXG4gICAgICAgIHRoaXMuZW5kRGF0ZSA9IChfLmdldChiYXRjaCwgJ2VuZERhdGUnKSlcbiAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZSkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZVRpbWUgPSB0aGlzLnN0YXJ0RGF0ZSAmJiBuZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZSkuZ2V0VGltZSgpXG4gICAgICAgICAgbGV0IGVuZERhdGUgPSB0aGlzLmVuZERhdGUgJiYgbmV3IERhdGUodGhpcy5lbmREYXRlKVxuICAgICAgICAgIGVuZERhdGUuc2V0SG91cnMoMjMsIDU5LCA1OSwgOTk5KVxuICAgICAgICAgIGNvbnN0IGVuZERhdGVUaW1lID0gZW5kRGF0ZS5nZXRUaW1lKClcbiAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgPSBub3cgLSBzdGFydERhdGVUaW1lXG4gICAgICAgICAgdGhpcy5lbmREYXRlRGlmZmVyZW5jZSA9IGVuZERhdGVUaW1lIC0gbm93XG4gICAgICAgICAgaWYgKHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPiAwICYmIHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSA+IDAgJiYgYmF0Y2guc3RhdHVzICE9PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0RGF0YShkYXRhOiBEYXRhKSB7XG4gICAgY29uc3QgaW5pdERhdGEgPSB0aGlzLnRvY1N2Yy5pbml0RGF0YShkYXRhLCB0cnVlKVxuICAgIHRoaXMuZXJyb3JDb2RlID0gaW5pdERhdGEuZXJyb3JDb2RlXG4gICAgc3dpdGNoICh0aGlzLmVycm9yQ29kZSkge1xuICAgICAgY2FzZSBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUuQVBJX0ZBSUxVUkU6IHtcbiAgICAgICAgdGhpcy5lcnJvcldpZGdldERhdGEud2lkZ2V0RGF0YS5lcnJvclR5cGUgPSBFcnJvclR5cGUuaW50ZXJuYWxTZXJ2ZXJcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlLklOVkFMSURfREFUQToge1xuICAgICAgICB0aGlzLmVycm9yV2lkZ2V0RGF0YS53aWRnZXREYXRhLmVycm9yVHlwZSA9IEVycm9yVHlwZS5pbnRlcm5hbFNlcnZlclxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUuTk9fREFUQToge1xuICAgICAgICB0aGlzLmVycm9yV2lkZ2V0RGF0YS53aWRnZXREYXRhLmVycm9yVHlwZSA9IEVycm9yVHlwZS5pbnRlcm5hbFNlcnZlclxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aGlzLmVycm9yV2lkZ2V0RGF0YS53aWRnZXREYXRhLmVycm9yVHlwZSA9IEVycm9yVHlwZS5zb21ldGhpbmdXcm9uZ1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgdGhpcy5nZXRVc2VyUmF0aW5nKGZhbHNlKVxuICAgICAgLy8gdGhpcy5nZXRVc2VyRW5yb2xsbWVudExpc3QoKVxuICAgIH1cbiAgICB0aGlzLmJvZHkgPSB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbChcbiAgICAgIHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuYm9keVxuICAgICAgICA/IHRoaXMuZm9yUHJldmlld1xuICAgICAgICAgID8gdGhpcy5hdXRoQWNjZXNzQ29udHJvbFN2Yy5wcm94eVRvQXV0aG9yaW5nVXJsKHRoaXMuY29udGVudC5ib2R5KVxuICAgICAgICAgIDogdGhpcy5jb250ZW50LmJvZHlcbiAgICAgICAgOiAnJyxcbiAgICApXG5cbiAgICB0aGlzLmNvbnRlbnRQYXJlbnRzID0ge31cbiAgICB0aGlzLnRvY1N0cnVjdHVyZSA9IHtcbiAgICAgIGFzc2Vzc21lbnQ6IDAsXG4gICAgICBjb3Vyc2U6IDAsXG4gICAgICBoYW5kc09uOiAwLFxuICAgICAgaW50ZXJhY3RpdmVWaWRlbzogMCxcbiAgICAgIGxlYXJuaW5nTW9kdWxlOiAwLFxuICAgICAgb3RoZXI6IDAsXG4gICAgICBwZGY6IDAsXG4gICAgICBzdXJ2ZXk6IDAsXG4gICAgICBwb2RjYXN0OiAwLFxuICAgICAgcHJhY3RpY2VUZXN0OiAwLFxuICAgICAgZmluYWxUZXN0OiAwLFxuICAgICAgcXVpejogMCxcbiAgICAgIHZpZGVvOiAwLFxuICAgICAgd2ViTW9kdWxlOiAwLFxuICAgICAgd2ViUGFnZTogMCxcbiAgICAgIHlvdXR1YmU6IDAsXG4gICAgICBpbnRlcmFjdGl2ZWNvbnRlbnQ6IDAsXG4gICAgICBvZmZsaW5lU2Vzc2lvbjogMCxcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmhhc1RvY1N0cnVjdHVyZSA9IGZhbHNlXG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZS5sZWFybmluZ01vZHVsZSA9IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSA/IC0xIDogMFxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUuY291cnNlID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFID8gLTEgOiAwXG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZSA9IHRoaXMudG9jU3ZjLmdldFRvY1N0cnVjdHVyZSh0aGlzLmNvbnRlbnQsIHRoaXMudG9jU3RydWN0dXJlKVxuICAgICAgZm9yIChjb25zdCBwcm9nVHlwZSBpbiB0aGlzLnRvY1N0cnVjdHVyZSkge1xuICAgICAgICBpZiAodGhpcy50b2NTdHJ1Y3R1cmVbcHJvZ1R5cGVdID4gMCkge1xuICAgICAgICAgIHRoaXMuaGFzVG9jU3RydWN0dXJlID0gdHJ1ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZnJvbSBuZ09uQ2hhbmdlc1xuICAgICAgdGhpcy5mZXRjaEV4dGVybmFsQ29udGVudEFjY2VzcygpXG4gICAgICB0aGlzLm1vZGlmeVNlbnNpYmxlQ29udGVudFJhdGluZygpXG4gICAgICB0aGlzLmFzc2lnblBhdGhBbmRVcGRhdGVCYW5uZXIodGhpcy5yb3V0ZXIudXJsKVxuICAgICAgdGhpcy5nZXRMZWFybmluZ1VybHMoKVxuICAgIH1cblxuICAgIHRoaXMuYWN0aW9uU1ZDLmdldFVwZGF0ZUNvbXBHcm91cE8uc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZXN1bWVEYXRhTGluayA9IHJlc1xuICAgIH0pXG5cbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuaXNQb3N0QXNzZXNzbWVudCkge1xuICAgICAgdGhpcy50b2NTdmMuZmV0Y2hQb3N0QXNzZXNzbWVudFN0YXR1cyh0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIGNvbnN0IGFzc2Vzc21lbnREYXRhID0gcmVzLnJlc3VsdFxuICAgICAgICBmb3IgKGNvbnN0IG8gb2YgYXNzZXNzbWVudERhdGEpIHtcbiAgICAgICAgICBpZiAoby5jb250ZW50SWQgPT09ICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dUYWtlQXNzZXNzbWVudCA9IG9cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIC8vIGZyb20gbmdPbkNoYW5nZXNcbiAgICB0aGlzLmJhdGNoQ29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChiYXRjaDogTnNDb250ZW50LklCYXRjaCkgPT4ge1xuICAgICAgdGhpcy5kaXNhYmxlRW5yb2xsQnRuID0gdHJ1ZVxuICAgICAgbGV0IHVzZXJJZCA9ICcnXG4gICAgICBpZiAoYmF0Y2gpIHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gICAgICAgICAgdXNlcklkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkIHx8ICcnXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgICAgdXNlcklkLFxuICAgICAgICAgICAgY291cnNlSWQ6IGJhdGNoLmNvdXJzZUlkLFxuICAgICAgICAgICAgYmF0Y2hJZDogYmF0Y2guYmF0Y2hJZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGVudFN2Yy5lbnJvbGxVc2VyVG9CYXRjaChyZXEpLnRoZW4oKGRhdGFiOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YWIgJiYgZGF0YWIucmVzdWx0ICYmIGRhdGFiLnJlc3VsdC5yZXNwb25zZSA9PT0gJ1NVQ0NFU1MnKSB7XG4gICAgICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IHtcbiAgICAgICAgICAgICAgY29udGVudDogW2JhdGNoXSxcbiAgICAgICAgICAgICAgZW5yb2xsZWQ6IHRydWUsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5nZXRTZWxlY3RlZEJhdGNoRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcFNlc3Npb25Db21wbGV0aW9uUGVyY2VudGFnZSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxuICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgYmF0Y2hJZDogYmF0Y2guYmF0Y2hJZCB9LFxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB0aGlzLm9wZW5TbmFja2JhcignRW5yb2xsZWQgU3VjY2Vzc2Z1bGx5IScpXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVFbnJvbGxCdG4gPSBmYWxzZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW5TbmFja2JhcignU29tZXRoaW5nIHdlbnQgd3JvbmcsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIhJylcbiAgICAgICAgICAgIHRoaXMuZGlzYWJsZUVucm9sbEJ0biA9IGZhbHNlXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG5cbiAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG5cbiAgfVxuXG4gIGdldFVzZXJSYXRpbmcoZmlyZVVwZGF0ZTogYm9vbGVhbikge1xuICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUpIHtcbiAgICAgICAgdGhpcy51c2VySWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQgfHwgJydcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSkge1xuICAgICAgICB0aGlzLnJhdGluZ1N2Yy5nZXRSYXRpbmcodGhpcy5jb250ZW50LmlkZW50aWZpZXIsIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnksIHRoaXMudXNlcklkKS5zdWJzY3JpYmUoXG4gICAgICAgICAgKHJlczogYW55KSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LnJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgIHRoaXMudXNlclJhdGluZyA9IHJlcy5yZXN1bHQucmVzcG9uc2VcbiAgICAgICAgICAgICAgaWYgKGZpcmVVcGRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvY1N2Yy5jaGFuZ2VVcGRhdGVSZXZpZXdzKHRydWUpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29udGVudFZpZXdFdmVudEZvck5ldENvcmUoJ3ZpZXcnKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycjogYW55KSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignVVNFUiBSQVRJTkcgRkVUQ0ggRVJST1IgPicsIGVycilcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRTb3VyY2UgJiYgdGhpcy5jb250ZW50U291cmNlLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gNDQpIHtcbiAgICAgICAgdGhpcy5zb3VyY2VFbGxpcHNpcyA9IHRydWVcbiAgICAgIH1cbiAgICB9LCAyNTApXG4gIH1cblxuICAvLyBwcml2YXRlIGdldFVzZXJFbnJvbGxtZW50TGlzdCgpIHtcbiAgLy8gICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSB0cnVlXG4gIC8vICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gIC8vICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gIC8vICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciAmJiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiZcbiAgLy8gICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gJiZcbiAgLy8gICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTCAmJlxuICAvLyAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UICYmXG4gIC8vICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gJiZcbiAgLy8gICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSkge1xuICAvLyAgICAgLy8gY29uc3QgY29sbGVjdGlvbklkID0gdGhpcy5pc1Jlc291cmNlID8gJycgOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllclxuICAvLyAgICAgcmV0dXJuIHRoaXMuZ2V0Q29udGludWVMZWFybmluZ0RhdGEodGhpcy5jb250ZW50LmlkZW50aWZpZXIpXG4gIC8vICAgfVxuXG4gIC8vICAgdGhpcy51c2VyRW5yb2xsbWVudExpc3QgPSBbXVxuICAvLyAgIGxldCB1c2VySWQ6IGFueVxuXG4gIC8vICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gIC8vICAgICB1c2VySWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWQgfHwgJydcbiAgLy8gICB9XG5cbiAgLy8gICB0aGlzLnVzZXJTdmMuZmV0Y2hVc2VyQmF0Y2hMaXN0KHVzZXJJZCkudG9Qcm9taXNlKCkudGhlbihcbiAgLy8gICAgIGFzeW5jIChyZXN1bHQ6IGFueSkgPT4ge1xuICAvLyAgICAgICBjb25zdCBjb3Vyc2VzOiBOc0NvbnRlbnQuSUNvdXJzZVtdID0gcmVzdWx0ICYmIHJlc3VsdC5jb3Vyc2VzXG4gIC8vICAgICAgIHRoaXMudXNlckVucm9sbG1lbnRMaXN0ID0gY291cnNlc1xuICAvLyAgICAgICBsZXQgZW5yb2xsZWRDb3Vyc2U6IE5zQ29udGVudC5JQ291cnNlIHwgdW5kZWZpbmVkXG4gIC8vICAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgJiYgIXRoaXMuZm9yUHJldmlldykge1xuICAvLyAgICAgICAgIGlmIChjb3Vyc2VzICYmIGNvdXJzZXMubGVuZ3RoKSB7XG4gIC8vICAgICAgICAgICBlbnJvbGxlZENvdXJzZSA9IGNvdXJzZXMuZmluZCgoY291cnNlOiBhbnkpID0+IHtcbiAgLy8gICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciB8fCAnJ1xuICAvLyAgICAgICAgICAgICBpZiAoY291cnNlLmNvdXJzZUlkICE9PSBpZGVudGlmaWVyKSB7XG4gIC8vICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAvLyAgICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICAgIHJldHVybiBjb3Vyc2VcbiAgLy8gICAgICAgICAgIH0pXG4gIC8vICAgICAgICAgfVxuXG4gIC8vICAgICAgICAgLy8gSWYgY3VycmVudCBjb3Vyc2UgaXMgcHJlc2VudCBpbiB0aGUgbGlzdCBvZiB1c2VyIGVucm9sbGVkIGNvdXJzZVxuICAvLyAgICAgICAgIGlmIChlbnJvbGxlZENvdXJzZSAmJiBlbnJvbGxlZENvdXJzZS5iYXRjaElkKSB7XG4gIC8vICAgICAgICAgICB0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24gPSB0aGlzLnRvY1N2Yy5yZXN1bWVEYXRhLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgLy8gICAgICAgICAgICAgaWYgKHJlcykge1xuICAvLyAgICAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YSA9IHJlc1xuICAvLyAgICAgICAgICAgICAgIHRoaXMuZ2V0TGFzdFBsYXllZFJlc291cmNlKClcbiAgLy8gICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKVxuICAvLyAgICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICB9KVxuICAvLyAgICAgICAgICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YSh0aGlzLmNvbnRlbnQpXG4gIC8vICAgICAgICAgICB0aGlzLmVucm9sbGVkQ291cnNlRGF0YSA9IGVucm9sbGVkQ291cnNlXG4gIC8vICAgICAgICAgICB0aGlzLmlzQ291cnNlQ29tcGxldGVkT25UaGlzTW9udGgoKVxuICAvLyAgICAgICAgICAgdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCA9IGVucm9sbGVkQ291cnNlLmJhdGNoSWRcbiAgLy8gICAgICAgICAgIC8vIHRoaXMuZG93bmxvYWRDZXJ0KGVucm9sbGVkQ291cnNlLmlzc3VlZENlcnRpZmljYXRlcylcbiAgLy8gICAgICAgICAgIGlmIChlbnJvbGxlZENvdXJzZSAmJiBlbnJvbGxlZENvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXMgJiZcbiAgLy8gICAgICAgICAgICAgZW5yb2xsZWRDb3Vyc2UuaXNzdWVkQ2VydGlmaWNhdGVzLmxlbmd0aCkge1xuICAvLyAgICAgICAgICAgICBjb25zdCBjZXJ0aWZpY2F0ZTogYW55ID0gZW5yb2xsZWRDb3Vyc2UuaXNzdWVkQ2VydGlmaWNhdGVzLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PlxuICAvLyAgICAgICAgICAgICAgICBuZXcgRGF0ZShiLmxhc3RJc3N1ZWRPbikuZ2V0VGltZSgpIC0gbmV3IERhdGUoYS5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSlcbiAgLy8gICAgICAgICAgICAgY29uc3QgY2VydElkID0gY2VydGlmaWNhdGVbMF0uaWRlbnRpZmllclxuICAvLyAgICAgICAgICAgICB0aGlzLmNlcnRJZCA9IGNlcnRJZFxuICAvLyAgICAgICAgICAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gIC8vICAgICAgICAgICAgICAgdGhpcy5jb250ZW50WydjZXJ0aWZpY2F0ZU9iaiddID0ge1xuICAvLyAgICAgICAgICAgICAgICAgY2VydElkLFxuICAvLyAgICAgICAgICAgICAgICAgY2VydERhdGE6ICcnLFxuICAvLyAgICAgICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgdGhpcy5jb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID0gZW5yb2xsZWRDb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgMFxuICAvLyAgICAgICAgICAgdGhpcy5jb250ZW50LmNvbXBsZXRpb25TdGF0dXMgPSBlbnJvbGxlZENvdXJzZS5zdGF0dXMgfHwgMFxuICAvLyAgICAgICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhICYmIHRoaXMuY29udGVudFJlYWREYXRhLmN1bXVsYXRpdmVUcmFja2luZykge1xuICAvLyAgICAgICAgICAgICBhd2FpdCB0aGlzLnRvY1N2Yy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZVByb2dyYW0odGhpcy5jb250ZW50LCB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdClcbiAgLy8gICAgICAgICAgICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMucmVzdW1lRGF0YS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gIC8vICAgICAgICAgICAgICAgaWYgKHJlcykge1xuICAvLyAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bWVEYXRhID0gcmVzXG4gIC8vICAgICAgICAgICAgICAgICB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gIC8vICAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKVxuICAvLyAgICAgICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgICAgfSlcblxuICAvLyAgICAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAvLyAgICAgICAgICAgICAvLyB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAgICAgICB0aGlzLmdldENvbnRpbnVlTGVhcm5pbmdEYXRhKHRoaXMuY29udGVudC5pZGVudGlmaWVyLCBlbnJvbGxlZENvdXJzZS5iYXRjaElkKVxuICAvLyAgICAgICAgICAgICB0aGlzLmNvbnRlbnRbJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSBlbnJvbGxlZENvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAvLyAgICAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAvLyAgICAgICAgICAgICB0aGlzLnRvY1N2Yy5tYXBNb2R1bGVDb3VudCh0aGlzLmNvbnRlbnQpXG4gIC8vICAgICAgICAgICAgIC8vIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgLy8gICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgIHRoaXMuYmF0Y2hEYXRhID0ge1xuICAvLyAgICAgICAgICAgICBjb250ZW50OiBbZW5yb2xsZWRDb3Vyc2UuYmF0Y2hdLFxuICAvLyAgICAgICAgICAgICBlbnJvbGxlZDogdHJ1ZSxcbiAgLy8gICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgIHRoaXMudG9jU3ZjLnNldEJhdGNoRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgLy8gICAgICAgICAgIHRoaXMudG9jU3ZjLmdldFNlbGVjdGVkQmF0Y2hEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAvLyAgICAgICAgICAgdGhpcy50b2NTdmMubWFwU2Vzc2lvbkNvbXBsZXRpb25QZXJjZW50YWdlKHRoaXMuYmF0Y2hEYXRhLCB0aGlzLnJlc3VtZURhdGEpXG4gIC8vICAgICAgICAgICBpZiAodGhpcy5nZXRCYXRjaElkKCkpIHtcbiAgLy8gICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gIC8vICAgICAgICAgICAgICAgW10sXG4gIC8vICAgICAgICAgICAgICAge1xuICAvLyAgICAgICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgLy8gICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpIH0sXG4gIC8vICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAvLyAgICAgICAgICAgICAgIH0pXG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICAgIHRoaXMudG9jU3ZjLmNoZWNrTW9kdWxlV2lzZURhdGEodGhpcy5jb250ZW50KVxuICAvLyAgICAgICAgICAgdGhpcy50b2NTdmMubWFwTW9kdWxlQ291bnQodGhpcy5jb250ZW50KVxuICAvLyAgICAgICAgICAgLy8gSXQncyB1bmRlcnN0b29kIHRoYXQgdXNlciBpcyBub3QgYWxyZWFkeSBlbnJvbGxlZFxuICAvLyAgICAgICAgICAgLy8gRmV0Y2ggdGhlIGF2YWlsYWJsZSBiYXRjaGVzIGFuZCBwcmVzZW50IHRvIHVzZXJcbiAgLy8gICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DT1VSU0VcbiAgLy8gICAgICAgICAgICAgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSkge1xuICAvLyAgICAgICAgICAgICAvLyBEaXNhYmxpbmcgYXV0byBlbnJvbGxtZW50IHRvIGJhdGNoXG4gIC8vICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0pIHtcbiAgLy8gICAgICAgICAgICAgICB0aGlzLmZldGNoQmF0Y2hEZXRhaWxzKClcbiAgLy8gICAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICAgICAgdGhpcy5mZXRjaEJhdGNoRGV0YWlscygpXG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICB0aGlzLnRvY1N2Yy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAodGhpcy5jb250ZW50KVxuICAvLyAgICAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgLy8gICAgICAgICAgIC8vIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH1cbiAgLy8gICAgICAgLy8gY29uc29sZS5sb2coJ2NhbGxpbmcgLS0tLS0tLS0tLS0tLS0tLSA9PT09PT09PT0nKVxuICAvLyAgICAgICAvLyB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gIC8vICAgICB9LFxuICAvLyAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgLy8gICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0NPTlRFTlQgSElTVE9SWSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpXG4gIC8vICAgICB9LFxuICAvLyAgIClcbiAgLy8gfVxuXG4gIHB1YmxpYyBmZXRjaFVzZXJXRkZvckJsZW5kZWQoKSB7XG4gICAgY29uc3QgYXBwbGljYXRpb25JZHMgPSAodGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50Lm1hcChlID0+IGUuYmF0Y2hJZCkpIHx8IFtdXG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgYXBwbGljYXRpb25JZHMsXG4gICAgICBzZXJ2aWNlTmFtZTogJ2JsZW5kZWRwcm9ncmFtJyxcbiAgICAgIGxpbWl0OiAxMDAsXG4gICAgICBvZmZzZXQ6IDAsXG4gICAgfVxuXG4gICAgdGhpcy5jb250ZW50U3ZjLmZldGNoQmxlbmRlZFVzZXJXRihyZXEpLnRoZW4oXG4gICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgbGF0ZXN0V0YgPSBfLm1heEJ5KGRhdGEucmVzdWx0LmRhdGFbMF0ud2ZJbmZvLCAoZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGVsLmxhc3RVcGRhdGVkT24pLmdldFRpbWUoKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLy8gbGF0ZXN0V0YuY3VycmVudFN0YXR1cyA9IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRUpFQ1RFRFxuICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgIHRoaXMuYmF0Y2hEYXRhIS53b3JrRmxvdyA9IHtcbiAgICAgICAgICAgIHdmSW5pdGlhdGVkOiB0cnVlLFxuICAgICAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICBiYXRjaDogdGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50LmZpbmQoKGU6IGFueSkgPT4gZS5iYXRjaElkID09PSBsYXRlc3RXRi5hcHBsaWNhdGlvbklkKSxcbiAgICAgICAgICAgIHdmSXRlbTogbGF0ZXN0V0YsXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudG9jU3ZjLnNldFdGRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLmluZm8oJ2ZldGNoQmxlbmRlZFVzZXJXRiBkYXRhID09ICcsIGRhdGEpXG4gICAgICB9LFxuICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0NPTlRFTlQgSElTVE9SWSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpXG4gICAgICB9LFxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0lmQmF0Y2hFeGlzdHMobGF0ZXN0OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuYmF0Y2hEYXRhIHx8ICF0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQuZmluZChiID0+IGIuYmF0Y2hJZCA9PT0gbGF0ZXN0LmJhdGNoSWQpXG4gIH1cblxuICBwdWJsaWMgZ2V0QmF0Y2hJZCgpOiBzdHJpbmcge1xuICAgIGxldCBiYXRjaElkID0gJydcbiAgICBpZiAodGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCkge1xuICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiB0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgICAgIGJhdGNoSWQgPSBiYXRjaC5iYXRjaElkXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYXRjaElkXG4gIH1cblxuICAvLyBkb3dubG9hZENlcnQoY2VydElkQXJyOiBhbnkpIHtcbiAgLy8gICBpZiAoY2VydElkQXJyICYmIGNlcnRJZEFyci5sZW5ndGggJiYgY2VydElkQXJyLmxlbmd0aCA+IDApIHtcbiAgLy8gICAgIGNlcnRJZEFyci5zb3J0KChhOiBhbnksIGI6IGFueSkgPT4gbmV3IERhdGUoYi5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkpXG4gIC8vICAgICBjb25zdCBjZXJ0SWQgPSBjZXJ0SWRBcnJbMF0uaWRlbnRpZmllclxuICAvLyAgICAgdGhpcy5jZXJ0SWQgPSBjZXJ0SWRcblxuICAvLyAgICAgdGhpcy5jb250ZW50U3ZjLmRvd25sb2FkQ2VydChjZXJ0SWQpLnN1YnNjcmliZShyZXNwb25zZSA9PiB7XG4gIC8vICAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgLy8gICAgICAgICB0aGlzLmNvbnRlbnRbJ2NlcnRpZmljYXRlT2JqJ10gPSB7XG4gIC8vICAgICAgICAgICBjZXJ0RGF0YTogcmVzcG9uc2UucmVzdWx0LnByaW50VXJpLFxuICAvLyAgICAgICAgICAgY2VydElkOiB0aGlzLmNlcnRJZCxcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgIH1cbiAgLy8gICAgIH0pXG4gIC8vICAgfVxuICAvLyB9XG5cbiAgcHVibGljIGhhbmRsZUF1dG9CYXRjaEFzc2lnbigpIHtcbiAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICB0aGlzLm5hdmlnYXRlVG9QbGF5ZXJQYWdlKCcnKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSB0cnVlXG4gICAgICB0aGlzLmNoYW5nZVRhYiA9ICF0aGlzLmNoYW5nZVRhYlxuICAgICAgdGhpcy5yYWlzZUVucm9sbFRlbGVtZXRyeSgpXG4gICAgICBpZiAodGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCkge1xuICAgICAgICB0aGlzLnJhaXNlRW5yb2xsVGVsZW1lbnRyeUZvclNha3NoYW1BSUdlbmVyYXRlZCgpXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCkge1xuICAgICAgICB0aGlzLnJhaXNlRW5yb2xsVGVsZW1lbnRyeUZvclNha3NoYW1BSUdlbmVyYXRlZCgpXG4gICAgICB9XG4gICAgICBjb25zdCBiYXRjaERhdGEgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5iYXRjaGVzICYmIHRoaXMuY29udGVudFJlYWREYXRhLmJhdGNoZXNbMF1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuQ1VSQVRFRF9QUk9HUkFNKSB7XG4gICAgICAgIHRoaXMuYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuQ1VSQVRFRF9QUk9HUkFNLCBiYXRjaERhdGEpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0pIHtcbiAgICAgICAgbGV0IG1vZGVyYXRlZEJhdGNoRGF0YTogYW55XG4gICAgICAgIGlmICh0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQubGVuZ3RoID4gMSkge1xuICAgICAgICAgIG1vZGVyYXRlZEJhdGNoRGF0YSA9IHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgJiYgdGhpcy5zZWxlY3RlZEJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudFswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1vZGVyYXRlZEJhdGNoRGF0YSA9IHRoaXMuYmF0Y2hEYXRhICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudFswXVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0sIG1vZGVyYXRlZEJhdGNoRGF0YSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYXV0b0Fzc2lnbkVucm9sbCgpXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY29udGVudFZpZXdFdmVudEZvck5ldENvcmUoJ2Vucm9sbCcpXG4gIH1cblxuICBwdWJsaWMgYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKHByb2dyYW1UeXBlOiBhbnksIGJhdGNoRGF0YTogYW55KSB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikge1xuICAgICAgbGV0IHVzZXJJZCA9ICcnXG4gICAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUgJiYgdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkKSB7XG4gICAgICAgIHVzZXJJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZFxuICAgICAgfVxuICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgdXNlcklkLFxuICAgICAgICAgIHByb2dyYW1JZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgICAgLy8gYXMgb2Ygbm93IGN1cmF0ZWQgcHJvZ3JhbSBvbmx5IG9uZSBiYXRjaCBpcyBjb21pbmcgbmVlZCB0byBjaGVjayBhbmQgbW9kaWZ5XG4gICAgICAgICAgYmF0Y2hJZDogYmF0Y2hEYXRhLmJhdGNoSWQsXG4gICAgICAgIH0sXG4gICAgICB9XG4gICAgICB0aGlzLmNvbnRlbnRTdmMuYXV0b0Fzc2lnbkN1cmF0ZWRCYXRjaEFwaShyZXEsIHByb2dyYW1UeXBlKS5zdWJzY3JpYmUoXG4gICAgICAgIChkYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChwcm9ncmFtVHlwZSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5NT0RFUkFURURfUFJPR1JBTSAmJiBiYXRjaERhdGEuZW5kRGF0ZSkge1xuICAgICAgICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IHtcbiAgICAgICAgICAgICAgICBjb250ZW50OiBbYmF0Y2hEYXRhXSxcbiAgICAgICAgICAgICAgICBlbnJvbGxlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgYmF0Y2hJZDogYmF0Y2hEYXRhLmJhdGNoSWQgfSxcbiAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRVc2VyRW5yb2xsbWVudExpc3QoKVxuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgICAgICAgICAgIH0sIDIwMDApXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG9QbGF5ZXJQYWdlKHJlcS5yZXF1ZXN0LmJhdGNoSWQpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoX2Vycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZygnX2Vycm9yJywgX2Vycm9yKVxuICAgICAgICAgIC8vIGlmKF9lcnJvciAmJiBfZXJyb3IuZXJyb3IgJiYgX2Vycm9yLmVycm9yLnBhcmFtcyAmJiBfZXJyb3IuZXJyb3IucGFyYW1zLmVyciAmJiBfZXJyb3IuZXJyb3IucGFyYW1zLmVyci5lcnJtc2cpIHtcbiAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihfLmdldChfZXJyb3IsICdlcnJvci5wYXJhbXMuZXJybXNnJykgfHwgJ1BsZWFzZSB0cnkgYWdhaW4gbGF0ZXInKTtcbiAgICAgICAgICAvLyB9XG4gICAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBhdXRvQXNzaWduRW5yb2xsKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMuY29udGVudFN2Yy5hdXRvQXNzaWduQmF0Y2hBcGkodGhpcy5jb250ZW50LmlkZW50aWZpZXIpLnN1YnNjcmliZShcbiAgICAgICAgKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IGRhdGEuY29udGVudCxcbiAgICAgICAgICAgIGVucm9sbGVkOiB0cnVlLFxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBiYXRjaElkID0gdGhpcy5nZXRCYXRjaElkKClcbiAgICAgICAgICBpZiAoYmF0Y2hJZCkge1xuICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUGxheWVyUGFnZShiYXRjaElkKVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKF9lcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKF8uZ2V0KF9lcnJvciwgJ2Vycm9yLnBhcmFtcy5lcnJtc2cnKSB8fCAnUGxlYXNlIHRyeSBhZ2FpbiBsYXRlcicpO1xuICAgICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBuYXZpZ2F0ZVRvUGxheWVyUGFnZShiYXRjaElkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSB0cnVlXG4gICAgICBjb25zdCBmaXJzdFBsYXlhYmxlQ29udGVudCA9IHRoaXMuY29udGVudFN2Yy5nZXRGaXJzdENoaWxkSW5IaWVyYXJjaHkodGhpcy5jb250ZW50KVxuICAgICAgbGV0IHByaW1hcnlDYXRlZ29yeVxuICAgICAgaWYgKHRoaXMuY29udGVudC5zZWN1cmVTZXR0aW5ncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHByaW1hcnlDYXRlZ29yeSA9ICdMZWFybmluZyBSZXNvdXJjZSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByaW1hcnlDYXRlZ29yeSA9IGZpcnN0UGxheWFibGVDb250ZW50LnByaW1hcnlDYXRlZ29yeSB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5XG4gICAgICB9XG4gICAgICB0aGlzLmZpcnN0UmVzb3VyY2VMaW5rID0gdmlld2VyUm91dGVHZW5lcmF0b3IoXG4gICAgICAgIGZpcnN0UGxheWFibGVDb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgIGZpcnN0UGxheWFibGVDb250ZW50Lm1pbWVUeXBlLFxuICAgICAgICB0aGlzLmlzUmVzb3VyY2UgPyB1bmRlZmluZWQgOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcixcbiAgICAgICAgdGhpcy5pc1Jlc291cmNlID8gdW5kZWZpbmVkIDogdGhpcy5jb250ZW50LmNvbnRlbnRUeXBlLFxuICAgICAgICB0aGlzLmZvclByZXZpZXcsXG4gICAgICAgIHByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgYmF0Y2hJZCxcbiAgICAgIClcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHt0aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnVybH1gXSwgeyBxdWVyeVBhcmFtczogeyAuLi50aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnF1ZXJ5UGFyYW1zLCBmcm9tQUlUdXRvcjogdGhpcy5mcm9tQUlUdXRvciB9IH0pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGZldGNoQmF0Y2hEZXRhaWxzKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcbiAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgIGNvdXJzZUlkOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcixcbiAgICAgICAgICAgIHN0YXR1czogWycwJywgJzEnLCAnMiddLFxuICAgICAgICAgICAgLy8gY3JlYXRlZEJ5OiAnZmNhMjkyNWYtMWVlZS00NjU0LTkxNzctZmVjZTNmZDZhZmM5JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNvcnRfYnk6IHsgY3JlYXRlZERhdGU6ICdkZXNjJyB9LFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICAgdGhpcy5jb250ZW50U3ZjLmZldGNoQ291cnNlQmF0Y2hlcyhyZXEpLnN1YnNjcmliZShcbiAgICAgICAgKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IGRhdGFcbiAgICAgICAgICB0aGlzLmJhdGNoRGF0YS5lbnJvbGxlZCA9IGZhbHNlXG4gICAgICAgICAgdGhpcy50b2NTdmMuc2V0QmF0Y2hEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAgICAgICAgIGlmICh0aGlzLmdldEJhdGNoSWQoKSkge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICAgICAgICAvLyBxdWVyeVBhcmFtczogeyBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSB9LFxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdDT05URU5UIEhJU1RPUlkgRkVUQ0ggRVJST1IgPicsIGVycm9yKVxuICAgICAgICB9LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29udGludWVMZWFybmluZ0RhdGEoY29udGVudElkOiBzdHJpbmcsIGJhdGNoSWQ/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQodHJ1ZSlcbiAgICB0aGlzLnJlc3VtZURhdGEgPSBudWxsXG4gICAgbGV0IHVzZXJJZFxuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSkge1xuICAgICAgdXNlcklkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkIHx8ICcnXG4gICAgfVxuXG4gICAgY29uc3QgcmVxOiBOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhUmVxID0ge1xuICAgICAgcmVxdWVzdDoge1xuICAgICAgICBiYXRjaElkLFxuICAgICAgICB1c2VySWQsXG4gICAgICAgIGNvdXJzZUlkOiBjb250ZW50SWQgfHwgJycsXG4gICAgICAgIGNvbnRlbnRJZHM6IFtdLFxuICAgICAgICBmaWVsZHM6IFsncHJvZ3Jlc3NkZXRhaWxzJ10sXG4gICAgICB9LFxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmMuZmV0Y2hDb250ZW50SGlzdG9yeVYyKHJlcSkuc3Vic2NyaWJlKFxuICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJlc3VsdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdCAmJiBkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBSZXN1bWVEYXRhID0gXy5nZXQoZGF0YSwgJ3Jlc3VsdC5jb250ZW50TGlzdCcpXG4gICAgICAgICAgICB0aGlzLnJlc3VtZURhdGEgPSBfLm1hcCh0ZW1wUmVzdW1lRGF0YSwgcnIgPT4ge1xuICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBfLmZpbHRlcihmbGF0dGVuSXRlbXMoXy5nZXQodGhpcy5jb250ZW50LCAnY2hpbGRyZW4nKSB8fCBbXSwgJ2NoaWxkcmVuJyksIHsgJ2lkZW50aWZpZXInOiByci5jb250ZW50SWQsIHByaW1hcnlDYXRlZ29yeTogJ0xlYXJuaW5nIFJlc291cmNlJyB9KVxuICAgICAgICAgICAgICBfLnNldChyciwgJ3Byb2dyZXNzZGV0YWlscy5taW1lVHlwZScsIF8uZ2V0KF8uZmlyc3QoaXRlbXMpLCAnbWltZVR5cGUnKSlcbiAgICAgICAgICAgICAgaWYgKCFfLmdldChyciwgJ2NvbXBsZXRpb25QZXJjZW50YWdlJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoXy5nZXQocnIsICdzdGF0dXMnKSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgXy5zZXQocnIsICdjb21wbGV0aW9uUGVyY2VudGFnZScsIDEwMClcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgXy5zZXQocnIsICdjb21wbGV0aW9uUGVyY2VudGFnZScsIDApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByclxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGNvbnN0IHByb2dyZXNzID0gXy5tYXAodGhpcy5yZXN1bWVEYXRhLCAnY29tcGxldGlvblBlcmNlbnRhZ2UnKVxuICAgICAgICAgICAgY29uc3QgdG90YWxDb3VudCA9IF8udG9JbnRlZ2VyKF8uZ2V0KHRoaXMuY29udGVudCwgJ2xlYWZOb2Rlc0NvdW50JykpIHx8IDFcbiAgICAgICAgICAgIGlmIChwcm9ncmVzcy5sZW5ndGggPCB0b3RhbENvdW50KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB0b3RhbENvdW50IC0gcHJvZ3Jlc3MubGVuZ3RoXG4gICAgICAgICAgICAgIGlmIChkaWZmKSB7XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgICAgXy5lYWNoKG5ldyBBcnJheShkaWZmKSwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcHJvZ3Jlc3MucHVzaCgwKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy51cGRhdGVSZXN1bWFEYXRhKHRoaXMucmVzdW1lRGF0YSlcbiAgICAgICAgICAgIC8vIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUR1cmF0aW9uQW5kUHJvZ3Jlc3ModGhpcy5jb250ZW50LCB0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5tYXBDb21wbGV0aW9uUGVyY2VudGFnZSh0aGlzLmNvbnRlbnQsIHRoaXMucmVzdW1lRGF0YSlcbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcCh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YSA9IG51bGxcbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcCh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5jb250ZW50U3ZjLnNldFByb2dyYW1DaGlsZFJlc3VtZURhdGEodGhpcy5yZXN1bWVEYXRhLCBjb250ZW50SWQpXG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0NPTlRFTlQgSElTVE9SWSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpIHtcbiAgICBpZiAodGhpcy5yZXN1bWVEYXRhICYmIHRoaXMuY29udGVudCkge1xuICAgICAgbGV0IHJlc3VtZURhdGFWMjogYW55XG4gICAgICBpZiAodGhpcy5jb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgcmVzdW1lRGF0YVYyID0gdGhpcy5nZXRSZXN1bWVEYXRhRnJvbUxpc3QoJ3N0YXJ0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KClcbiAgICAgIH1cbiAgICAgIGlmICghcmVzdW1lRGF0YVYyLm1pbWVUeXBlKSB7XG4gICAgICAgIHJlc3VtZURhdGFWMi5taW1lVHlwZSA9IHRoaXMudG9jU3ZjLmdldE1pbWVUeXBlKHRoaXMuY29udGVudCwgcmVzdW1lRGF0YVYyLmlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgICB0aGlzLnJlc3VtZURhdGFMaW5rID0gdmlld2VyUm91dGVHZW5lcmF0b3IoXG4gICAgICAgIHJlc3VtZURhdGFWMi5pZGVudGlmaWVyLFxuICAgICAgICByZXN1bWVEYXRhVjIubWltZVR5cGUsXG4gICAgICAgIHRoaXMuaXNSZXNvdXJjZSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICB0aGlzLmlzUmVzb3VyY2UgPyB1bmRlZmluZWQgOiB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUsXG4gICAgICAgIHRoaXMuZm9yUHJldmlldyxcbiAgICAgICAgJ0xlYXJuaW5nIFJlc291cmNlJyxcbiAgICAgICAgdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICAgIHRoaXMuY29udGVudC5uYW1lLFxuICAgICAgKVxuICAgICAgdGhpcy5hY3Rpb25TVkMuc2V0VXBkYXRlQ29tcEdyb3VwTyA9IHRoaXMucmVzdW1lRGF0YUxpbmtcbiAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgIH1cbiAgfVxuXG4gIHNjcm9sbFRvVG9wKCkge1xuICAgIChmdW5jdGlvbiBzbW9vdGhzY3JvbGwoKSB7XG4gICAgICBjb25zdCBjdXJyZW50U2Nyb2xsID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcFxuICAgICAgaWYgKGN1cnJlbnRTY3JvbGwgPiAwKSB7XG4gICAgICAgIC8vIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoc21vb3Roc2Nyb2xsKVxuICAgICAgICAvLyB3aW5kb3cuc2Nyb2xsVG8oMCwgY3VycmVudFNjcm9sbCAtIChjdXJyZW50U2Nyb2xsIC8gNSkpXG4gICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgICAgdG9wOiAwLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KSgpXG4gIH1cblxuICBwdWJsaWMgZ2V0Q29tcGV0ZW5jaWVzKGNvbXBldGVuY2llczogYW55KSB7XG4gICAgY29uc3QgY29tcGV0ZW5jaWVzQXJyYXkgPSBKU09OLnBhcnNlKGNvbXBldGVuY2llcylcbiAgICBjb25zdCBjb21wZXRlbmN5U3RyaW5nQXJyYXk6IGFueVtdID0gW11cbiAgICBjb21wZXRlbmNpZXNBcnJheS5tYXAoKGM6IGFueSkgPT4ge1xuICAgICAgY29tcGV0ZW5jeVN0cmluZ0FycmF5LnB1c2goYy5uYW1lKVxuICAgIH0pXG4gICAgcmV0dXJuIGNvbXBldGVuY3lTdHJpbmdBcnJheVxuICB9XG5cbiAgZ2V0IHNob3dJbnRyYW5ldE1zZygpIHtcbiAgICBpZiAodGhpcy5pc01vYmlsZSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2hvd0ludHJhbmV0TWVzc2FnZVxuICB9XG5cbiAgZ2V0IHNob3dTdGFydCgpIHtcbiAgICByZXR1cm4gdGhpcy50b2NTdmMuc2hvd1N0YXJ0QnV0dG9uKHRoaXMuY29udGVudClcbiAgfVxuXG4gIGdldCBpc1Bvc3RBc3Nlc3NtZW50KCk6IGJvb2xlYW4ge1xuICAgIGlmICghKHRoaXMudG9jQ29uZmlnICYmIHRoaXMudG9jQ29uZmlnLnBvc3RBc3Nlc3NtZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNPVVJTRSAmJlxuICAgICAgICB0aGlzLmNvbnRlbnQubGVhcm5pbmdNb2RlID09PSAnSW5zdHJ1Y3Rvci1MZWQnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgZ2V0IGlzTW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnV0aWxpdHlTdmMuaXNNb2JpbGVcbiAgfVxuXG4gIGdldCBzaG93U3VidGl0bGVPbkJhbm5lcigpIHtcbiAgICByZXR1cm4gdGhpcy50b2NTdmMuc3VidGl0bGVPbkJhbm5lcnNcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVFbnJvbGxtZW50RW5kRGF0ZShiYXRjaDogYW55KSB7XG4gICAgY29uc3QgZW5yb2xsbWVudEVuZERhdGUgPSBkYXlqcyhfLmdldChiYXRjaCwgJ2Vucm9sbG1lbnRFbmREYXRlJykpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgY29uc3Qgc3lzdGVtRGF0ZSA9IGRheWpzKClcbiAgICByZXR1cm4gZW5yb2xsbWVudEVuZERhdGUgPyBkYXlqcyhlbnJvbGxtZW50RW5kRGF0ZSkuaXNCZWZvcmUoc3lzdGVtRGF0ZSkgOiBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBvcGVuU25hY2tiYXIocHJpbWFyeU1zZzogc3RyaW5nLCBkdXJhdGlvbjogbnVtYmVyID0gNTAwMCkge1xuICAgIHRoaXMuc25hY2tCYXIub3BlbihwcmltYXJ5TXNnLCAnWCcsIHtcbiAgICAgIGR1cmF0aW9uLFxuICAgIH0pXG4gIH1cblxuICBnZXQgc2hvd0luc3RydWN0b3JMZWRNc2coKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc2hvd0FjdGlvbkJ1dHRvbnMgJiZcbiAgICAgIHRoaXMuY29udGVudCAmJlxuICAgICAgdGhpcy5jb250ZW50LmxlYXJuaW5nTW9kZSA9PT0gJ0luc3RydWN0b3ItTGVkJyAmJlxuICAgICAgIXRoaXMuY29udGVudC5jaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICF0aGlzLmNvbnRlbnQuYXJ0aWZhY3RVcmxcbiAgICApXG4gIH1cblxuICBnZXQgaXNIZWFkZXJIaWRkZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNSZXNvdXJjZSAmJiB0aGlzLmNvbnRlbnQgJiYgIXRoaXMuY29udGVudC5hcnRpZmFjdFVybC5sZW5ndGhcbiAgfVxuXG4gIGdldCBzaG93QWN0aW9uQnV0dG9ucygpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgIT09ICd3YWl0JyAmJlxuICAgICAgdGhpcy5jb250ZW50ICYmXG4gICAgICB0aGlzLmNvbnRlbnQuc3RhdHVzICE9PSAnRGVsZXRlZCcgJiZcbiAgICAgIHRoaXMuY29udGVudC5zdGF0dXMgIT09ICdFeHBpcmVkJ1xuICAgIClcbiAgfVxuXG4gIGdldCBzaG93QnV0dG9uQ29udGFpbmVyKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLmFjdGlvbkJ0blN0YXR1cyA9PT0gJ2dyYW50JyAmJlxuICAgICAgISh0aGlzLmlzTW9iaWxlICYmIHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaXNJbkludHJhbmV0KSAmJlxuICAgICAgIShcbiAgICAgICAgdGhpcy5jb250ZW50ICYmXG4gICAgICAgIHRoaXMuY29udGVudC5jb250ZW50VHlwZSA9PT0gJ0NvdXJzZScgJiZcbiAgICAgICAgdGhpcy5jb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAhdGhpcy5jb250ZW50LmFydGlmYWN0VXJsXG4gICAgICApICYmXG4gICAgICAhKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUgPT09ICdSZXNvdXJjZScgJiYgIXRoaXMuY29udGVudC5hcnRpZmFjdFVybClcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGdldFJlc3VtZURhdGFGcm9tTGlzdCh0eXBlPzogc3RyaW5nKTogYW55IHwgdm9pZCB7XG4gICAgY29uc3QgcmVzdW1lQ29weSA9IFsuLi50aGlzLnJlc3VtZURhdGFdXG4gICAgaWYgKHJlc3VtZUNvcHkgJiYgcmVzdW1lQ29weS5sZW5ndGgpIHtcbiAgICAgIGlmICghdHlwZSkge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG5cbiAgICAgICAgY29uc3QgbGFzdEl0ZW0gPSByZXN1bWVDb3B5ICYmIHJlc3VtZUNvcHkuc29ydCgoYTogYW55LCBiOiBhbnkpID0+XG4gICAgICAgICAgbmV3IERhdGUoYi5sYXN0QWNjZXNzVGltZSkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYS5sYXN0QWNjZXNzVGltZSkuZ2V0VGltZSgpKS5zaGlmdCgpXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWRlbnRpZmllcjogbGFzdEl0ZW0uY29udGVudElkLFxuICAgICAgICAgIG1pbWVUeXBlOiBsYXN0SXRlbS5wcm9ncmVzc2RldGFpbHMgJiYgbGFzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzLm1pbWVUeXBlLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBmaXJzdEl0ZW0gPSByZXN1bWVDb3B5ICYmIHJlc3VtZUNvcHkubGVuZ3RoICYmIHJlc3VtZUNvcHlbMF1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkZW50aWZpZXI6IGZpcnN0SXRlbS5jb250ZW50SWQsXG4gICAgICAgIG1pbWVUeXBlOiBmaXJzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzICYmIGZpcnN0SXRlbS5wcm9ncmVzc2RldGFpbHMubWltZVR5cGUsXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fVxuICB9XG5cbiAgcHJpdmF0ZSBtb2RpZnlTZW5zaWJsZUNvbnRlbnRSYXRpbmcoKSB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5jb250ZW50ICYmXG4gICAgICB0aGlzLmNvbnRlbnQuYXZlcmFnZVJhdGluZyAmJlxuICAgICAgdHlwZW9mIHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nICE9PSAnbnVtYmVyJ1xuICAgICkge1xuICAgICAgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgPSAodGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgYXMgYW55KVt0aGlzLmNvbmZpZ1N2Yy5yb290T3JnIHx8ICcnXVxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC50b3RhbFJhdGluZyAmJiB0eXBlb2YgdGhpcy5jb250ZW50LnRvdGFsUmF0aW5nICE9PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5jb250ZW50LnRvdGFsUmF0aW5nID0gKHRoaXMuY29udGVudC50b3RhbFJhdGluZyBhcyBhbnkpW3RoaXMuY29uZmlnU3ZjLnJvb3RPcmcgfHwgJyddXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRMZWFybmluZ1VybHMoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5pc1ByYWN0aWNlVmlzaWJsZSA9IEJvb2xlYW4oXG4gICAgICAgIHRoaXMudG9jU3ZjLmZpbHRlclRvYyh0aGlzLmNvbnRlbnQsIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuUFJBQ1RJQ0UpLFxuICAgICAgKVxuXG4gICAgICB0aGlzLmlzQXNzZXNzVmlzaWJsZSA9IEJvb2xlYW4oXG4gICAgICAgIHRoaXMudG9jU3ZjLmZpbHRlclRvYyh0aGlzLmNvbnRlbnQsIE5zQ29udGVudC5FRmlsdGVyQ2F0ZWdvcnkuQVNTRVNTKSxcbiAgICAgIClcblxuICAgICAgY29uc3QgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgICAgIGxldCBwcmltYXJ5Q2F0ZWdvcnlcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2VjdXJlU2V0dGluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSAnTGVhcm5pbmcgUmVzb3VyY2UnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSBmaXJzdFBsYXlhYmxlQ29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeVxuICAgICAgfVxuICAgICAgdGhpcy5maXJzdFJlc291cmNlTGluayA9IHZpZXdlclJvdXRlR2VuZXJhdG9yKFxuICAgICAgICBmaXJzdFBsYXlhYmxlQ29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICBmaXJzdFBsYXlhYmxlQ29udGVudC5taW1lVHlwZSxcbiAgICAgICAgdGhpcy5pc1Jlc291cmNlID8gdW5kZWZpbmVkIDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgIHRoaXMuaXNSZXNvdXJjZSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudC5jb250ZW50VHlwZSxcbiAgICAgICAgdGhpcy5mb3JQcmV2aWV3LFxuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgIHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgKVxuXG4gICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cblxuICAgICAgaWYgKGZpcnN0UGxheWFibGVDb250ZW50Lm9wdGlvbmFsUmVhZGluZyAmJiBmaXJzdFBsYXlhYmxlQ29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdMZWFybmluZyBSZXNvdXJjZScpIHtcbiAgICAgICAgdGhpcy51cGRhdGVQcm9ncmVzcygyLCBmaXJzdFBsYXlhYmxlQ29udGVudC5pZGVudGlmaWVyKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXNzaWduUGF0aEFuZFVwZGF0ZUJhbm5lcih1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IHBhdGggPSB1cmwuc3BsaXQoJy8nKS5wb3AoKVxuICAgIGlmIChwYXRoICYmIHRoaXMudmFsaWRQYXRocy5oYXMocGF0aCkpIHtcbiAgICAgIHRoaXMucm91dGVQYXRoID0gcGF0aFxuICAgICAgdGhpcy51cGRhdGVCYW5uZXJVcmwoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQmFubmVyVXJsKCkge1xuICAgIGlmICh0aGlzLmJhbm5lcnMpIHtcbiAgICAgIHRoaXMuYmFubmVyVXJsID0gdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFN0eWxlKFxuICAgICAgICBgdXJsKCR7dGhpcy5iYW5uZXJzW3RoaXMucm91dGVQYXRoXX0pYCxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwbGF5SW50cm9WaWRlbygpIHtcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICB0aGlzLmRpYWxvZy5vcGVuKEFwcFRvY0RpYWxvZ0ludHJvVmlkZW9Db21wb25lbnQsIHtcbiAgICAgICAgZGF0YTogdGhpcy5jb250ZW50LmludHJvZHVjdG9yeVZpZGVvLFxuICAgICAgICBoZWlnaHQ6ICczNTBweCcsXG4gICAgICAgIHdpZHRoOiAnNjIwcHgnLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBnZXQgc2FuaXRpemVkSW50cm9kdWN0b3J5VmlkZW9JY29uKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmludHJvZHVjdG9yeVZpZGVvSWNvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShgdXJsKCR7dGhpcy5jb250ZW50LmludHJvZHVjdG9yeVZpZGVvSWNvbn0pYClcbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hFeHRlcm5hbENvbnRlbnRBY2Nlc3MoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQucmVnaXN0cmF0aW9uVXJsKSB7XG4gICAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgICB0aGlzLmV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzID0gJ2ZldGNoaW5nJ1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSBmYWxzZVxuICAgICAgICB0aGlzLnRvY1N2Yy5mZXRjaEV4dGVybmFsQ29udGVudEFjY2Vzcyh0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikuc3Vic2NyaWJlKFxuICAgICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1cyA9ICdkb25lJ1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gZGF0YS5oYXNBY2Nlc3NcbiAgICAgICAgICB9LFxuICAgICAgICAgIF9lcnJvciA9PiB7XG4gICAgICAgICAgICB0aGlzLmV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzID0gJ2RvbmUnXG4gICAgICAgICAgICB0aGlzLnJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSBmYWxzZVxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxDb250ZW50RmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldFJhdGluZ0ljb24ocmF0aW5nSW5kZXg6IG51bWJlcik6ICdzdGFyJyB8ICdzdGFyX2JvcmRlcicgfCAnc3Rhcl9oYWxmJyB7XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuYXZlcmFnZVJhdGluZykge1xuICAgICAgY29uc3QgYXZnUmF0aW5nID0gdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmdcbiAgICAgIGNvbnN0IHJhdGluZ0Zsb29yID0gTWF0aC5mbG9vcihhdmdSYXRpbmcpXG4gICAgICBpZiAocmF0aW5nSW5kZXggPD0gcmF0aW5nRmxvb3IpIHtcbiAgICAgICAgcmV0dXJuICdzdGFyJ1xuICAgICAgfVxuICAgICAgaWYgKHJhdGluZ0Zsb29yID09PSByYXRpbmdJbmRleCAtIDEgJiYgYXZnUmF0aW5nICUgMSA+IDApIHtcbiAgICAgICAgcmV0dXJuICdzdGFyX2hhbGYnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnc3Rhcl9ib3JkZXInXG4gIH1cblxuICBwcml2YXRlIGNoZWNrUmVnaXN0cmF0aW9uU3RhdHVzKCkge1xuICAgIGNvbnN0IHNvdXJjZSA9ICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnNvdXJjZVNob3J0TmFtZSkgfHwgJydcbiAgICBpZiAoXG4gICAgICAhdGhpcy5mb3JQcmV2aWV3ICYmXG4gICAgICAhdGhpcy5pc1JlZ2lzdHJhdGlvblN1cHBvcnRlZCAmJlxuICAgICAgdGhpcy5jaGVja1JlZ2lzdHJhdGlvblNvdXJjZXMuaGFzKHNvdXJjZSlcbiAgICApIHtcbiAgICAgIHRoaXMuY29udGVudFN2Y1xuICAgICAgICAuZ2V0UmVnaXN0cmF0aW9uU3RhdHVzKHNvdXJjZSlcbiAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICBpZiAocmVzLmhhc0FjY2Vzcykge1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgPSAnZ3JhbnQnXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnRuU3RhdHVzID0gJ3JlamVjdCdcbiAgICAgICAgICAgIGlmIChyZXMucmVnaXN0cmF0aW9uVXJsICYmIHRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgICB0aGlzLmNvbnRlbnQucmVnaXN0cmF0aW9uVXJsID0gcmVzLnJlZ2lzdHJhdGlvblVybFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKF9lcnIgPT4geyB9KVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGlvbkJ0blN0YXR1cyA9ICdncmFudCdcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZVF1ZXJ5KHR5cGU6ICdSRVNVTUUnIHwgJ1NUQVJUX09WRVInIHwgJ1NUQVJUJyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGlmICh0aGlzLmZpcnN0UmVzb3VyY2VMaW5rICYmICh0eXBlID09PSAnU1RBUlQnIHx8IHR5cGUgPT09ICdTVEFSVF9PVkVSJykpIHtcbiAgICAgIGxldCBxUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAuLi50aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnF1ZXJ5UGFyYW1zLFxuICAgICAgICB2aWV3TW9kZTogdHlwZSxcbiAgICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZXh0SWQgJiYgdGhpcy5jb250ZXh0UGF0aCkge1xuICAgICAgICBxUGFyYW1zID0ge1xuICAgICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgICAgY29sbGVjdGlvbklkOiB0aGlzLmNvbnRleHRJZCxcbiAgICAgICAgICBjb2xsZWN0aW9uVHlwZTogdGhpcy5jb250ZXh0UGF0aCxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgICBkZWxldGUgcVBhcmFtcy52aWV3TW9kZVxuICAgICAgfVxuICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgY2hhbm5lbElkOiB0aGlzLmNoYW5uZWxJZCxcbiAgICAgIH1cbiAgICAgIHJldHVybiBxUGFyYW1zXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YUxpbmsgJiYgdHlwZSA9PT0gJ1JFU1VNRScpIHtcbiAgICAgIGxldCBxUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAuLi50aGlzLnJlc3VtZURhdGFMaW5rLnF1ZXJ5UGFyYW1zLFxuICAgICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgICAgdmlld01vZGU6ICdSRVNVTUUnLFxuICAgICAgICAvLyBjb3Vyc2VOYW1lOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQubmFtZSA6ICcnLFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXG4gICAgICAgICAgY29sbGVjdGlvblR5cGU6IHRoaXMuY29udGV4dFBhdGgsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcbiAgICAgIH1cbiAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5jaGFubmVsSWQsXG4gICAgICB9XG4gICAgICByZXR1cm4gcVBhcmFtc1xuICAgIH1cbiAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgdmlld01vZGU6IHR5cGUsXG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzSW5JRnJhbWUoKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB3aW5kb3cuc2VsZiAhPT0gd2luZG93LnRvcFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG5cbiAgb3BlbkZlZWRiYWNrRGlhbG9nKGNvbnRlbnQ6IGFueSk6IHZvaWQge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29udGVudFJhdGluZ1YyRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzc2OHB4JyxcbiAgICAgIGRhdGE6IHsgY29udGVudCwgdXNlcklkOiB0aGlzLnVzZXJJZCwgdXNlclJhdGluZzogdGhpcy51c2VyUmF0aW5nIH0sXG4gICAgfSlcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5nZXRVc2VyUmF0aW5nKHRydWUpXG4gICAgICAgIC8vIHRoaXMuZ2V0VXNlckVucm9sbG1lbnRMaXN0KClcbiAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgICAgdGhpcy5yZXNldFJhdGluZ3NTZXJ2aWNlLnNldFJhdGluZ1NlcnZpY2VVcGRhdGUodHJ1ZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgdXBkYXRlUHJvZ3Jlc3Moc3RhdHVzOiBudW1iZXIsIHJlc291cmNlSWQ6IGFueSkge1xuICAgIGNvbnN0IGNvbGxlY3Rpb25JZCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zLmlkID9cbiAgICAgIHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zLmlkIDogJydcbiAgICBjb25zdCBiYXRjaElkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5iYXRjaElkID9cbiAgICAgIHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuYmF0Y2hJZCA6ICcnXG4gICAgY29uc3QgaXNQcmVBc3Nlc3NtZW50ID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtcy5wcmVBc3Nlc3NtZW50XG4gICAgaWYoaXNQcmVBc3Nlc3NtZW50KSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXdlclN2Y1xuICAgICAgICAgIC5yZWFsVGltZVByb2dyZXNzVXBkYXRlRm9yUHJlQXNzZXNzbWVudFF1aXoocmVzb3VyY2VJZCwgIHN0YXR1cylcbiAgICAgIFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aWV3ZXJTdmMucmVhbFRpbWVQcm9ncmVzc1VwZGF0ZVF1aXoocmVzb3VyY2VJZCwgY29sbGVjdGlvbklkLCBiYXRjaElkLCBzdGF0dXMpXG4gIH1cblxuICBnZXRQcm9ncmFtRHVyYXRpb24oYmF0Y2hEYXRhOiBhbnkpIHtcbiAgICBpZiAoYmF0Y2hEYXRhKSB7XG4gICAgICBjb25zdCBzdGFydERhdGUgPSBkYXlqcyhkYXlqcyhiYXRjaERhdGEuc3RhcnREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSlcbiAgICAgIGNvbnN0IGVuZERhdGUgPSBkYXlqcyhkYXlqcyhiYXRjaERhdGEuZW5kRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJykpXG4gICAgICAvLyBhZGRpbmcgMSB0byBpbmNsdWRlIHRoZSBzdGFydCBkYXRlXG4gICAgICByZXR1cm4gKGVuZERhdGUuZGlmZihzdGFydERhdGUsICdkYXlzJykgKyAxKVxuICAgIH1cbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHdpdGhkcmF3T3JFbnJvbGwoZGF0YTogc3RyaW5nKSB7XG4gICAgaWYgKGRhdGEgPT09IE5zQ29udGVudC5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLklOSVRJQVRFKSB7XG4gICAgICB0aGlzLmZldGNoVXNlcldGRm9yQmxlbmRlZCgpXG4gICAgfVxuICB9XG5cbiAgZ2V0U2VydmVyRGF0ZVRpbWUoKSB7XG4gICAgdGhpcy50b2NTdmMuZ2V0U2VydmVyRGF0ZSgpLnN1YnNjcmliZSgocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN5c3RlbURhdGUpIHtcbiAgICAgICAgdGhpcy50b2NTdmMuY2hhbmdlU2VydmVyRGF0ZShyZXNwb25zZS5zeXN0ZW1EYXRlKVxuICAgICAgICB0aGlzLnRvY1N2Yy5jaGFuZ2VTZXJ2ZXJEYXRlKHJlc3BvbnNlLnN5c3RlbURhdGUpXG4gICAgICAgIHRoaXMuc2VydmVyRGF0ZSA9IHJlc3BvbnNlLnN5c3RlbURhdGVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9jU3ZjLmNoYW5nZVNlcnZlckRhdGUobmV3IERhdGUoKS5nZXRUaW1lKCkpXG4gICAgICB9XG4gICAgICB0aGlzLmZpbmRBQ1BCKClcbiAgICAgIHRoaXMuZ2V0S2FybWFwb2ludHNMaW1pdCgpXG4gICAgfSwgKF9lcnI6IGFueSkgPT4ge1xuICAgICAgdGhpcy50b2NTdmMuY2hhbmdlU2VydmVyRGF0ZShuZXcgRGF0ZSgpLmdldFRpbWUoKSlcbiAgICB9KVxuICB9XG5cbiAgaGFuZGxlQ2FwaXRhbGl6ZShzdHI6IHN0cmluZywgdHlwZT86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgbGV0IHJldHVyblZhbHVlID0gJydcbiAgICBpZiAoc3RyKSB7XG4gICAgICBpZiAodHlwZSA9PT0gJ25hbWUnKSB7XG4gICAgICAgIHJldHVyblZhbHVlID0gc3RyLnNwbGl0KCcgJykubWFwKF9zdHIgPT4ge1xuICAgICAgICAgIHJldHVybiBfc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgX3N0ci5zbGljZSgxKVxuICAgICAgICB9KS5qb2luKCcgJylcbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgcmV0dXJuVmFsdWUgPSBzdHIgJiYgKHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVyblZhbHVlXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlUGFyc2VKc29uRGF0YShzOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGFyc2VkU3RyaW5nID0gSlNPTi5wYXJzZShzKVxuICAgICAgcmV0dXJuIHBhcnNlZFN0cmluZ1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuICB9XG5cbiAgaGFuZGxlTmF2aWdhdGVUb1Jldmlld3MoKTogdm9pZCB7XG4gICAgY29uc3QgZWxlbWVudFRvVmlldyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyZXZpZXdDb250YWluZXInKSBhcyBhbnlcblxuICAgIGlmIChlbGVtZW50VG9WaWV3KSB7XG4gICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICB0b3A6IGVsZW1lbnRUb1ZpZXcub2Zmc2V0VG9wLFxuICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJhaXNlQ2VydEludHJlYWN0VGVsZW1ldHJ5KCkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6IFdzRXZlbnRzLkVudW1JbnRlcmFjdFR5cGVzLkNMSUNLLFxuICAgICAgICBpZDogJ3ZpZXctY2VydGlmaWNhdGUnLFxuICAgICAgICBzdWJUeXBlOiBXc0V2ZW50cy5FbnVtSW50ZXJhY3RTdWJUeXBlcy5DRVJUSUZJQ0FURSxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNlcnRJZCwgICAvLyBpZCBvZiB0aGUgY2VydGlmaWNhdGVcbiAgICAgICAgdHlwZTogV3NFdmVudHMuRW51bUludGVyYWN0U3ViVHlwZXMuQ0VSVElGSUNBVEUsXG4gICAgICB9KVxuICB9XG5cbiAgdHJhbnNsYXRlTGFiZWxzKGxhYmVsOiBzdHJpbmcsIHR5cGU6IGFueSkge1xuICAgIHJldHVybiB0aGlzLmxhbmd0cmFuc2xhdGlvbnMudHJhbnNsYXRlTGFiZWwobGFiZWwsIHR5cGUsICcnKVxuICB9XG5cbiAgLy8gY2hlY2tNb2R1bGVXaXNlRGF0YSgpIHtcbiAgLy8gICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jaGlsZHJlbikge1xuICAvLyAgICAgdGhpcy5jb250ZW50LmNoaWxkcmVuLmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gIC8vICAgICAgIGlmIChlbGUucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5NT0RVTEUpIHtcbiAgLy8gICAgICAgICBsZXQgbW9kdWxlUmVzb3Vyc2VDb3VudCA9IDBcbiAgLy8gICAgICAgICBsZXQgb2ZmbGluZVJlc291cnNlQ291bnQgPSAwXG4gIC8vICAgICAgICAgZWxlLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkRWxlOiBhbnkpID0+IHtcbiAgLy8gICAgICAgICAgIGlmIChjaGlsZEVsZS5wcmltYXJ5Q2F0ZWdvcnkgIT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk9GRkxJTkVfU0VTU0lPTikge1xuICAvLyAgICAgICAgICAgICBtb2R1bGVSZXNvdXJzZUNvdW50ID0gbW9kdWxlUmVzb3Vyc2VDb3VudCArIDFcbiAgLy8gICAgICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgICAgIG9mZmxpbmVSZXNvdXJzZUNvdW50ID0gb2ZmbGluZVJlc291cnNlQ291bnQgKyAxXG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgfSlcbiAgLy8gICAgICAgICBlbGVbJ21vZHVsZVJlc291cnNlQ291bnQnXSA9IG1vZHVsZVJlc291cnNlQ291bnRcbiAgLy8gICAgICAgICBlbGVbJ29mZmxpbmVSZXNvdXJzZUNvdW50J10gPSBvZmZsaW5lUmVzb3Vyc2VDb3VudFxuICAvLyAgICAgICB9XG4gIC8vICAgICB9KVxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIGdldExhc3RQbGF5ZWRSZXNvdXJjZSgpIHtcbiAgICBsZXQgZmlyc3RQbGF5YWJsZUNvbnRlbnRcbiAgICBsZXQgcmVzdW1lRGF0YVYyOiBhbnlcbiAgICBpZiAodGhpcy5yZXN1bWVEYXRhICYmIHRoaXMucmVzdW1lRGF0YS5sZW5ndGggPiAwICYmIHRoaXMuY29udGVudCkge1xuICAgICAgaWYgKHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XG4gICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KCdzdGFydCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgpXG4gICAgICB9XG4gICAgICB0aGlzLmV4cGFuZFRoZVBhdGgocmVzdW1lRGF0YVYyLmlkZW50aWZpZXIpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgICAgICAgdGhpcy5leHBhbmRUaGVQYXRoKGZpcnN0UGxheWFibGVDb250ZW50LmlkZW50aWZpZXIpXG5cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBleHBhbmRUaGVQYXRoKHJlc291cmNlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgcmVzb3VyY2VJZCkge1xuICAgICAgY29uc3QgcGF0aCA9IHRoaXMudXRpbGl0eVN2Yy5nZXRQYXRoKHRoaXMuY29udGVudCwgcmVzb3VyY2VJZClcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdQYXRoIDo6IDo6IDogJywgcGF0aClcbiAgICAgIHRoaXMucGF0aFNldCA9IG5ldyBTZXQocGF0aC5tYXAoKHU6IHsgaWRlbnRpZmllcjogYW55IH0pID0+IHUuaWRlbnRpZmllcikpXG4gICAgICAvLyBjb25zb2xlLmxvZygncGF0aFNldCA6OjogJywgdGhpcy5wYXRoU2V0KVxuICAgICAgLy8gcGF0aC5mb3JFYWNoKChub2RlOiBJVmlld2VyVG9jQ2FyZCkgPT4ge1xuICAgICAgLy8gICB0aGlzLm5lc3RlZFRyZWVDb250cm9sLmV4cGFuZChub2RlKVxuICAgICAgLy8gfSlcbiAgICB9XG4gIH1cblxuICByYWlzZUVucm9sbFRlbGVtZXRyeSgpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBzdWJUeXBlOiAnZW5yb2xsJyxcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgICAgICAgdHlwZTogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA6ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcGFnZUlkRXh0OiBgYnRuLWVucm9sbGAsXG4gICAgICAgIG1vZHVsZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeW1vZHVsZXMuQ09OVEVOVCxcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICByYWlzZUVucm9sbFRlbGVtZW50cnlGb3JTYWtzaGFtQUlHZW5lcmF0ZWQoKSB7XG4gICAgdGhpcy5ldmVudHMucmFpc2VJbnRlcmFjdFRlbGVtZXRyeShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgc3ViVHlwZTogJ2Vucm9sbCcsXG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICBpZDogdGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCxcbiAgICAgICAgICB2ZXI6IFwiMS4wXCIsXG4gICAgICAgICAgdHlwZTogXCJpZ290LWFpXCJcbiAgICAgICAgfSxcbiAgICAgIH0gYXMgYW55LFxuICAgICAge1xuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgICAgICAgdHlwZTogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA6ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcGFnZUlkOiBgL2FwcC90b2MvJHt0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXJ9L292ZXJ2aWV3X2J0bi1lbnJvbGxgLFxuICAgICAgICBtb2R1bGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnltb2R1bGVzLkNPTlRFTlQsXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgb25DbGlja09mU2hhcmUoKSB7XG4gICAgdGhpcy5lbmFibGVTaGFyZSA9IHRydWVcbiAgICB0aGlzLnJhaXNlVGVsZW1ldHJ5Rm9yU2hhcmUoJ3NoYXJlQ29udGVudCcpXG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuICByYWlzZVRlbGVtZXRyeUZvclNoYXJlKHN1YlR5cGU6IGFueSkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIHN1YlR5cGUsXG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICAgIHR5cGU6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhZ2VJZEV4dDogYGJ0bi0ke3N1YlR5cGV9YCxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5DT05URU5ULFxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHJlc2V0RW5hYmxlU2hhcmUoKSB7XG4gICAgdGhpcy5lbmFibGVTaGFyZSA9IGZhbHNlXG4gIH1cblxuICB0cmFuc2xhdGVMYWJlbChsYWJlbDogc3RyaW5nLCB0eXBlOiBhbnkpIHtcbiAgICBpZiAobGFiZWwgJiYgdHlwZSkge1xuICAgICAgcmV0dXJuIHRoaXMubGFuZ3RyYW5zbGF0aW9ucy50cmFuc2xhdGVMYWJlbChsYWJlbCwgdHlwZSwgJycpXG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMucm91dGVTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucm91dGVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy5iYXRjaFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5iYXRjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLmJhdGNoRGF0YVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5iYXRjaERhdGFTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICB0aGlzLnRvY1N2Yy5hbmFseXRpY3NGZXRjaFN0YXR1cyA9ICdub25lJ1xuICAgIGlmICh0aGlzLnJvdXRlclBhcmFtU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvdXRlclBhcmFtU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRCYXRjaFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5zZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMudGltZXJVbnN1YnNjcmliZSkge1xuICAgICAgdGhpcy50aW1lclVuc3Vic2NyaWJlLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gIH1cblxuICBwcm9ncmFtRW5yb2xsQ2FsbChiYXRjaERhdGE6IGFueSkge1xuICAgIHRoaXMuYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0sIGJhdGNoRGF0YSlcbiAgfVxuXG4gIHJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKCkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIGlkOiBcInZpZXctYXNzZXNzbWVudFwiLFxuICAgICAgICBzdWJUeXBlOiBcImFub255bW91cy1hc3Nlc3NtZW50XCIsXG4gICAgICB9LCB7fSxcbiAgICAgIHtcbiAgICAgICAgbW9kdWxlOiAnTGFuZGluZyBQYWdlJyxcbiAgICAgIH0pXG4gIH1cblxuXG4gIGZldGNoVXNlckVucm9sbG1lbnREYXRhKCkge1xuICAgIGxldCBpZGVudGlmaWVyID0gdGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyIHx8ICcnXG4gICAgbGV0IHJlcXVlc3Q6IGFueSA9IHtcbiAgICAgIFwicmVxdWVzdFwiOiB7XG4gICAgICAgIFwicmV0aXJlZENvdXJzZXNFbmFibGVkXCI6IHRydWUsXG4gICAgICAgIFwiY291cnNlSWRcIjogW2lkZW50aWZpZXJdXG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuZW5yb2xsU3ZjLmZldGNoRW5yb2xsQ29udGVudERhdGEocmVxdWVzdCkuc3Vic2NyaWJlKGFzeW5jIChyZXM6IGFueSkgPT4ge1xuXG5cbiAgICAgIGlmIChyZXMgJiYgcmVzLnJlc3VsdCAmJiByZXMucmVzdWx0LmNvdXJzZXMgJiYgcmVzLnJlc3VsdC5jb3Vyc2VzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCA9IHJlcy5yZXN1bHQuY291cnNlc1xuXG4gICAgICAgIGxldCBjb21wbGV0ZWRDb250ZW50RmxhZ0RhdGE6IGFueSA9IHRoaXMudXNlckVucm9sbG1lbnRMaXN0ICYmXG4gICAgICAgICAgdGhpcy51c2VyRW5yb2xsbWVudExpc3QuZmluZCgoZWw6IGFueSkgPT4gZWwuY29sbGVjdGlvbklkID09PSB0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXIpXG4gICAgICAgIGlmIChjb21wbGV0ZWRDb250ZW50RmxhZ0RhdGEgJiYgY29tcGxldGVkQ29udGVudEZsYWdEYXRhLmNvbXBsZXRpb25QZXJjZW50YWdlICYmIGNvbXBsZXRlZENvbnRlbnRGbGFnRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XG4gICAgICAgICAgdGhpcy5jb250ZW50Vmlld0V2ZW50Rm9yTmV0Q29yZSgnY29tcGxldGUnKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVRyYW5zZmVyU3ZjLnNldEVucm9sbERhdGEodGhpcy51c2VyRW5yb2xsbWVudExpc3QpXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnRMaWJTdmMgJiYgdGhpcy5jb250ZW50TGliU3ZjLm9uZVN0ZXBSZXN1bWVFbmFibGUpIHtcbiAgICAgICAgICAvLyBsZXQgdXJsRGF0YSA9IGF3YWl0IHRoaXMuY29udGVudExpYlN2Yy5nZXRSZXNvdXJzZUxpbmsodGhpcy5jb250ZW50LCB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCwgdHJ1ZSlcblxuICAgICAgICAgIGNvbnN0IGZvdW5kQ29udGVudCA9IHRoaXMudXNlckVucm9sbG1lbnRMaXN0ICYmXG4gICAgICAgICAgICB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5maW5kKChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IHRoaXMuY29udGVudD8uaWRlbnRpZmllcilcbiAgICAgICAgICBsZXQgdXJsRGF0YSA9IGF3YWl0IHRoaXMuY29udGVudExpYlN2Yy5nZXRSZXNvdXJzZUxpbmsodGhpcy5jb250ZW50LCBbZm91bmRDb250ZW50XSwgdHJ1ZSlcblxuICAgICAgICAgIC8vIGxldCB1cmxEYXRhID0gYXdhaXQgdGhpcy5jb250ZW50TGliU3ZjLmdldFJlc291cnNlTGluayh0aGlzLmNvbnRlbnQsIHRoaXMudXNlckVucm9sbG1lbnRMaXN0LCB0cnVlKVxuICAgICAgICAgIGlmICh1cmxEYXRhICYmIHVybERhdGEudXJsICYmIHVybERhdGEudXJsLmluY2x1ZGVzKCdhcHAvdG9jJykpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudExpYlN2Yy5vbmVTdGVwUmVzdW1lRW5hYmxlID0gZmFsc2VcbiAgICAgICAgICAgIGlmICh1cmxEYXRhICYmIHVybERhdGEudXJsKSB7XG4gICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxuICAgICAgICAgICAgICAgIFt1cmxEYXRhLnVybF0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHVybERhdGEucXVlcnlQYXJhbXNcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudXNlckVucm9sbG1lbnRMaXN0ID0gW11cbiAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxuICBhc3luYyBjaGVja0lmVXNlckVucm9sbGVkKCkge1xuICAgIHRoaXMuY29udGVudExpYlN2Yy5vbmVTdGVwUmVzdW1lRW5hYmxlID0gZmFsc2VcbiAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSB0cnVlXG4gICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciAmJiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiZcbiAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gJiZcbiAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTCAmJlxuICAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UICYmXG4gICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gJiZcbiAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSkge1xuICAgICAgLy8gY29uc3QgY29sbGVjdGlvbklkID0gdGhpcy5pc1Jlc291cmNlID8gJycgOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q29udGludWVMZWFybmluZ0RhdGEodGhpcy5jb250ZW50LmlkZW50aWZpZXIpXG4gICAgfVxuXG4gICAgbGV0IGVucm9sbGVkQ291cnNlOiBOc0NvbnRlbnQuSUNvdXJzZSB8IHVuZGVmaW5lZFxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgJiYgIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgaWYgKHRoaXMudXNlckVucm9sbG1lbnRMaXN0ICYmIHRoaXMudXNlckVucm9sbG1lbnRMaXN0Lmxlbmd0aCkge1xuICAgICAgICBlbnJvbGxlZENvdXJzZSA9IHRoaXMudXNlckVucm9sbG1lbnRMaXN0LmZpbmQoKGNvdXJzZTogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3QgaWRlbnRpZmllciA9IHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciB8fCAnJ1xuICAgICAgICAgIGlmIChjb3Vyc2UuY291cnNlSWQgIT09IGlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGNvdXJzZVxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBjdXJyZW50IGNvdXJzZSBpcyBwcmVzZW50IGluIHRoZSBsaXN0IG9mIHVzZXIgZW5yb2xsZWQgY291cnNlXG4gICAgICBpZiAoZW5yb2xsZWRDb3Vyc2UgJiYgZW5yb2xsZWRDb3Vyc2UuYmF0Y2hJZCkge1xuICAgICAgICB0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24gPSB0aGlzLnRvY1N2Yy5yZXN1bWVEYXRhLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VtZURhdGEgPSByZXNcbiAgICAgICAgICAgIHRoaXMuZ2V0TGFzdFBsYXllZFJlc291cmNlKClcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICB0aGlzLnRvY1N2Yy5jaGVja01vZHVsZVdpc2VEYXRhKHRoaXMuY29udGVudClcbiAgICAgICAgdGhpcy5lbnJvbGxlZENvdXJzZURhdGEgPSBlbnJvbGxlZENvdXJzZVxuICAgICAgICB0aGlzLmlzQ291cnNlQ29tcGxldGVkT25UaGlzTW9udGgoKVxuICAgICAgICB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkID0gZW5yb2xsZWRDb3Vyc2UuYmF0Y2hJZFxuICAgICAgICAvLyB0aGlzLmRvd25sb2FkQ2VydChlbnJvbGxlZENvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXMpXG4gICAgICAgIGlmIChlbnJvbGxlZENvdXJzZSAmJiBlbnJvbGxlZENvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXMgJiZcbiAgICAgICAgICBlbnJvbGxlZENvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgY2VydGlmaWNhdGU6IGFueSA9IGVucm9sbGVkQ291cnNlLmlzc3VlZENlcnRpZmljYXRlcy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT5cbiAgICAgICAgICAgIG5ldyBEYXRlKGIubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShhLmxhc3RJc3N1ZWRPbikuZ2V0VGltZSgpKVxuICAgICAgICAgIGNvbnN0IGNlcnRJZCA9IGNlcnRpZmljYXRlWzBdLmlkZW50aWZpZXJcbiAgICAgICAgICB0aGlzLmNlcnRJZCA9IGNlcnRJZFxuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGVudFsnY2VydGlmaWNhdGVPYmonXSA9IHtcbiAgICAgICAgICAgICAgY2VydElkLFxuICAgICAgICAgICAgICBjZXJ0RGF0YTogJycsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9IGVucm9sbGVkQ291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IDBcbiAgICAgICAgdGhpcy5jb250ZW50LmNvbXBsZXRpb25TdGF0dXMgPSBlbnJvbGxlZENvdXJzZS5zdGF0dXMgfHwgMFxuICAgICAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGEgJiYgdGhpcy5jb250ZW50UmVhZERhdGEuY3VtdWxhdGl2ZVRyYWNraW5nKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy50b2NTdmMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2VQcm9ncmFtKHRoaXMuY29udGVudCwgdGhpcy51c2VyRW5yb2xsbWVudExpc3QpXG4gICAgICAgICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMucmVzdW1lRGF0YS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YSA9IHJlc1xuICAgICAgICAgICAgICB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgLy8gdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZ2V0Q29udGludWVMZWFybmluZ0RhdGEodGhpcy5jb250ZW50LmlkZW50aWZpZXIsIGVucm9sbGVkQ291cnNlLmJhdGNoSWQpXG4gICAgICAgICAgdGhpcy5jb250ZW50Wydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gZW5yb2xsZWRDb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUNvdW50KHRoaXMuY29udGVudClcbiAgICAgICAgICAvLyB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYXRjaERhdGEgPSB7XG4gICAgICAgICAgY29udGVudDogW2Vucm9sbGVkQ291cnNlLmJhdGNoXSxcbiAgICAgICAgICBlbnJvbGxlZDogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvY1N2Yy5zZXRCYXRjaERhdGEodGhpcy5iYXRjaERhdGEpXG4gICAgICAgIHRoaXMudG9jU3ZjLmdldFNlbGVjdGVkQmF0Y2hEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAgICAgICB0aGlzLnRvY1N2Yy5tYXBTZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UodGhpcy5iYXRjaERhdGEsIHRoaXMucmVzdW1lRGF0YSlcbiAgICAgICAgaWYgKHRoaXMuZ2V0QmF0Y2hJZCgpKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHsgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCkgfSxcbiAgICAgICAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9jU3ZjLmNoZWNrTW9kdWxlV2lzZURhdGEodGhpcy5jb250ZW50KVxuICAgICAgICB0aGlzLnRvY1N2Yy5tYXBNb2R1bGVDb3VudCh0aGlzLmNvbnRlbnQpXG4gICAgICAgIC8vIEl0J3MgdW5kZXJzdG9vZCB0aGF0IHVzZXIgaXMgbm90IGFscmVhZHkgZW5yb2xsZWRcbiAgICAgICAgLy8gRmV0Y2ggdGhlIGF2YWlsYWJsZSBiYXRjaGVzIGFuZCBwcmVzZW50IHRvIHVzZXJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkNPVVJTRVxuICAgICAgICAgIHx8IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlBST0dSQU0pIHtcbiAgICAgICAgICAvLyBEaXNhYmxpbmcgYXV0byBlbnJvbGxtZW50IHRvIGJhdGNoXG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSkge1xuICAgICAgICAgICAgdGhpcy5mZXRjaEJhdGNoRGV0YWlscygpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZmV0Y2hCYXRjaERldGFpbHMoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9jU3ZjLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcCh0aGlzLmNvbnRlbnQpXG4gICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgIH1cblxuXG4gICAgfVxuXG4gICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlXG4gIH1cblxuICBoYW5kbGVBY2NlcHRSZWxldmVudCgpIHtcbiAgICB0aGlzLnNhdmVGZWVkYmFjaygnJywgMSk7XG4gIH1cblxuICBoYW5kbGVEZWNsaW5lUmVsZXZlbnQoKSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihOb25SZWxldmVudEZlZWRiYWNrRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICB3aWR0aDogJzUwMnB4JyxcbiAgICAgIHBhbmVsQ2xhc3M6IFsncmVsZXZlbnQtZmVlZGJhY2stZGlhbG9nJ10sXG4gICAgfSlcbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuc2F2ZUZlZWRiYWNrKHJlc3VsdCwgMCk7XG4gICAgICAgIGRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlhbG9nUmVmLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGNvbnRlbnRWaWV3RXZlbnRGb3JOZXRDb3JlKGV2ZW50VHlwZTogYW55KSB7XG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLm5ldGNvcmVDb25maWcgJiYgdGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZy5uZXRjb3JlV2ViQ29uZmlnICAvLyBOT1NPTkFSXG4gICAgICAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcuaXNBY3RpdmUgLy8gTk9TT05BUlxuICAgICAgJiYgdGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZy5uZXRjb3JlV2ViQ29uZmlnLmV2ZW50cyAvLyBOT1NPTkFSXG4gICAgICAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcuZXZlbnRzLmNvbnRlbnRfdmlldyAvLyBOT1NPTkFSXG4gICAgICAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcuZXZlbnRzLmNvbnRlbnRfdmlldy5pc0FjdGl2ZSAvLyBOT1NPTkFSXG4gICAgKSB7XG4gICAgICBsZXQgcGF5bG9hZDogYW55ID0ge31cbiAgICAgIC8vIGlmICh0aGlzLmNvbmZpZ1N2YyAmJiB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIgJiYgdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIpIHsgLy8gTk9TT05BUlxuICAgICAgLy8gICBwYXlsb2FkWydwa151c2VyaWQnXSA9IHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpXG4gICAgICAvLyB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5uYW1lKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfbmFtZSddID0gdGhpcy5jb250ZW50Lm5hbWVcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5KSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfY2F0ZWdvcnknXSA9IHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X2lkJ10gPSB0aGlzLmNvbnRlbnQuaWRlbnRpZmllclxuICAgICAgfVxuICAgICAgLy8gaWYodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5uYW1lKSB7XG4gICAgICBwYXlsb2FkWydjb250ZW50X3VybCddID0gd2luZG93LmxvY2F0aW9uLmhyZWZcbiAgICAgIC8vIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmFwcEljb24pIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9pbWFnZSddID0gdGhpcy5jb250ZW50LmFwcEljb25cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmR1cmF0aW9uKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfZHVyYXRpb24nXSA9IHRoaXMuY29udGVudC5kdXJhdGlvbiAmJiBOdW1iZXIodGhpcy5jb250ZW50LmR1cmF0aW9uKSA+IDAgPyBOdW1iZXIodGhpcy5jb250ZW50LmR1cmF0aW9uKSA6IDBcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfZHVyYXRpb24nXSA9IDBcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmF2Z1JhdGluZ1xuICAgICAgKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfcmF0aW5nJ10gPSB0aGlzLmNvbnRlbnQuYXZnUmF0aW5nXG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnQgcmF0aW5nJ10gPSB0aGlzLmNvbnRlbnQuYXZnUmF0aW5nXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC50b3RhbE5vT2ZSYXRpbmcpIHtcbiAgICAgICAgcGF5bG9hZFsnbm9fdXNlcnNfcmF0ZWQnXSA9IHRoaXMuY29udGVudC50b3RhbE5vT2ZSYXRpbmdcbiAgICAgIH1cbiAgICAgIC8vIGlmKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQubmFtZSkge1xuICAgICAgcGF5bG9hZFsnbGVhcm5pbmdfcGF0aF9jb250ZW50J10gPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCAmJiB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGggPyB0cnVlIDogZmFsc2VcbiAgICAgIHBheWxvYWRbJ2xlYXJuaW5nIHBhdGggY29udGVudCddID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXG4gICAgICAvLyB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5zb3VyY2UpIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9wcm92aWRlcl9uYW1lJ10gPSB0aGlzLmNvbnRlbnQuc291cmNlXG4gICAgICB9XG4gICAgICAvLyBjb25zb2xlLmxvZygncGF5bG9hZCcsIHBheWxvYWQpXG4gICAgICBpZiAoZXZlbnRUeXBlID09PSAndmlldycpIHtcbiAgICAgICAgdGhpcy5uZXRDb3JlU2VydmljZS50cmFja0V2ZW50Rm9yQ29udGVudEFuZEV2ZW50KCdjb250ZW50X3ZpZXcnLCB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIuaWRlbnRpZmllci50cmltKCkudG9Mb3dlckNhc2UoKSwgcGF5bG9hZClcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnZW5yb2xsJykge1xuICAgICAgICB0aGlzLm5ldENvcmVTZXJ2aWNlLnRyYWNrRXZlbnRGb3JDb250ZW50QW5kRXZlbnQoJ2NvbnRlbnRfZW5yb2xtZW50JywgdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIudHJpbSgpLnRvTG93ZXJDYXNlKCksIHBheWxvYWQpXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ2NvbXBsZXRlJykge1xuICAgICAgICB0aGlzLm5ldENvcmVTZXJ2aWNlLnRyYWNrRXZlbnRGb3JDb250ZW50QW5kRXZlbnQoJ2NvbnRlbnRfY29tcGxldGlvbicsIHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCBwYXlsb2FkKVxuICAgICAgfVxuXG4gICAgfVxuICB9XG5cbiAgc2Vjb25kc1RvVGltZShkOiBhbnkpIHtcbiAgICBkID0gTnVtYmVyKGQpO1xuICAgIHZhciBoID0gTWF0aC5mbG9vcihkIC8gMzYwMCk7XG4gICAgdmFyIG0gPSBNYXRoLmZsb29yKGQgJSAzNjAwIC8gNjApO1xuICAgIHZhciBzID0gTWF0aC5mbG9vcihkICUgMzYwMCAlIDYwKTtcblxuICAgIHZhciBoRGlzcGxheSA9IGggPiAwID8gaCArIChoID09IDEgPyBcIiBob3VyLCBcIiA6IFwiIGhvdXJzLCBcIikgOiBcIlwiO1xuICAgIHZhciBtRGlzcGxheSA9IG0gPiAwID8gbSArIChtID09IDEgPyBcIiBtaW51dGUsIFwiIDogXCIgbWludXRlcywgXCIpIDogXCJcIjtcbiAgICB2YXIgc0Rpc3BsYXkgPSBzID4gMCA/IHMgKyAocyA9PSAxID8gXCIgc2Vjb25kXCIgOiBcIiBzZWNvbmRzXCIpIDogXCJcIjtcbiAgICByZXR1cm4gaERpc3BsYXkgKyBtRGlzcGxheSArIHNEaXNwbGF5O1xuICB9XG5cblxuICBhc3luYyBzYXZlRmVlZGJhY2soY29tbWVudDogc3RyaW5nLCByYXRpbmcgPSAwKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIFwicmVjb21tZW5kYXRpb25faWRcIjogdGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCxcbiAgICAgIFwiY291cnNlX2lkXCI6IHRoaXMuY291cnNlSUQsXG4gICAgICBcInJhdGluZ1wiOiByYXRpbmcsXG4gICAgICBcImNvbW1lbnRzXCI6IGNvbW1lbnQsXG4gICAgICBcInVzZXJfaWRcIjogdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGU/LnVzZXJJZCB8fCAnJ1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29udGVudExpYlN2Yy5zYXZlRmVlZGJhY2tTYWtzaGFtQUkocGF5bG9hZCkudG9Qcm9taXNlKCkuY2F0Y2goKCkgPT4geyB9KVxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZT8ubWVzc2FnZSkge1xuICAgICAgdGhpcy5tYXRTbmFja2Jhck5ldy5vcGVuKFxuICAgICAgICAnVGhhbmsgeW91IGZvciB5b3VyIGZlZWRiYWNrLicsICdYJyxcbiAgICAgICAgeyBkdXJhdGlvbjogU05BQ0tCQVJfRFVSQVRJT04sIHBhbmVsQ2xhc3M6IFsnc3VjY2VzcyddIH1cbiAgICAgICk7XG4gICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbXSwgeyBxdWVyeVBhcmFtczogeyBnOiBudWxsIH0sIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScgfSk7XG4gICAgICB0aGlzLmZlZWRiYWNrR2l2ZW4gPSB7IGNvdXJzZV9pZDogdGhpcy5jb3Vyc2VJRCwgcmF0aW5nOiByYXRpbmcsIGNvbW1lbnRzOiBjb21tZW50IH1cblxuICAgIH0gZWxzZSBpZiAoIXJlc3BvbnNlKSB7XG4gICAgICB0aGlzLm1hdFNuYWNrYmFyTmV3Lm9wZW4oXG4gICAgICAgICdTb21ldGhpbmcgaXMgd3JvbmcuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuJywgJ1gnLFxuICAgICAgICB7IGR1cmF0aW9uOiBTTkFDS0JBUl9EVVJBVElPTiwgcGFuZWxDbGFzczogWydlcnJvciddIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcGxheVJlc3VtZUZvckFJKCkge1xuICAgIGlmKHRoaXMuY29udGVudCkge1xuICAgICAgaWYodGhpcy5maXJzdFJlc291cmNlTGluaykge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5maXJzdFJlc291cmNlTGluay51cmxdLHtxdWVyeVBhcmFtczogdGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtc30gKVxuICAgICAgfVxuICAgICAgXG4gICAgIC8vIHRoaXMuZ2V0Q29udGludWVMZWFybmluZ0RhdGEodGhpcy5jb250ZW50LmlkZW50aWZpZXIpXG4gICAgfVxuICAgIFxuICB9XG5cbiAgZW5yb2xsVXNlclRvQUkoKSB7XG4gICAgdGhpcy5mcm9tQUlUdXRvciA9IHRydWVcbiAgICB0aGlzLmhhbmRsZUF1dG9CYXRjaEFzc2lnbigpXG4gIH1cblxuICBnZW5lcmF0ZVByZUFzc2Vzc21lbnRRdWVyeSh0eXBlOiAnUkVTVU1FJyB8ICdTVEFSVF9PVkVSJyB8ICdTVEFSVCcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodGhpcy5maXJzdFJlc291cmNlTGluayAmJiAodHlwZSA9PT0gJ1NUQVJUJyB8fCB0eXBlID09PSAnU1RBUlRfT1ZFUicpKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgdmlld01vZGU6IHR5cGUsXG4gICAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXG4gICAgICAgICAgY29sbGVjdGlvblR5cGU6IHRoaXMuY29udGV4dFBhdGgsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcbiAgICAgIH1cbiAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5jaGFubmVsSWQsXG4gICAgICB9XG4gICAgICByZXR1cm4gcVBhcmFtc1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc3VtZURhdGFMaW5rICYmIHR5cGUgPT09ICdSRVNVTUUnKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5yZXN1bWVEYXRhTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICAgIHZpZXdNb2RlOiAnUkVTVU1FJyxcbiAgICAgICAgLy8gY291cnNlTmFtZTogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50Lm5hbWUgOiAnJyxcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRleHRJZCAmJiB0aGlzLmNvbnRleHRQYXRoKSB7XG4gICAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgICBjb2xsZWN0aW9uSWQ6IHRoaXMuY29udGV4dElkLFxuICAgICAgICAgIGNvbGxlY3Rpb25UeXBlOiB0aGlzLmNvbnRleHRQYXRoLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgIGRlbGV0ZSBxUGFyYW1zLnZpZXdNb2RlXG4gICAgICB9XG4gICAgICBxUGFyYW1zID0ge1xuICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbElkLFxuICAgICAgfVxuICAgICAgcmV0dXJuIHFQYXJhbXNcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgIHZpZXdNb2RlOiB0eXBlLFxuICAgIH1cbiAgfVxuXG4gIHJvdXRlVG9QcmVBc3Nlc3NlbnQoKSB7XG4gICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhKSB7IFxuICAgICAgY29uc29sZS5sb2coJ3RoaXMuY29udGVudCcsdGhpcy5jb250ZW50UmVhZERhdGEpICBcbiAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmNvbnRlbnQnLCB0aGlzLmNvbnRlbnRSZWFkRGF0YS5wcmVFbnJvbG1lbnRSZXNvdXJjZXMpIFxuICAgICAgLy8gdGhpcy5nZW5lcmF0ZVByZUFzc2Vzc21lbnRRdWVyeSgnU1RBUlQnKVxuICAgICAgbGV0IGZpcnN0UmVzb3VyY2UgID0gdGhpcy5jb250ZW50UmVhZERhdGEucHJlRW5yb2xtZW50UmVzb3VyY2VzWzBdXG5cbiAgICAgIHRoaXMuZmlyc3RSZXNvdXJjZUxpbmsgPSB2aWV3ZXJSb3V0ZUdlbmVyYXRvcihcbiAgICAgICAgZmlyc3RSZXNvdXJjZS5pZGVudGlmaWVyLFxuICAgICAgICBmaXJzdFJlc291cmNlLm1pbWVUeXBlLFxuICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllcixcbiAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5LFxuICAgICAgICB0aGlzLmZvclByZXZpZXcsXG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhLnByZUVucm9sbWVudFJlc291cmNlc1swXT8ucHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICAnJyxcbiAgICAgIClcbiAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmZpcnN0UmVzb3VyY2VMaW5rJywgdGhpcy5maXJzdFJlc291cmNlTGluaylcbiAgICAgIGxldCByb3V0ZXJMaW5rID0gIHRoaXMuZmlyc3RSZXNvdXJjZUxpbms/LnVybCAgXG4gICAgICBsZXQgcXVlcnlQYXJhbXMgPSB0aGlzLmdlbmVyYXRlUHJlQXNzZXNzbWVudFF1ZXJ5KCdTVEFSVCcpXG4gICAgICBxdWVyeVBhcmFtcyA9IHsgLi4ucXVlcnlQYXJhbXMsICBwcmVBc3Nlc3NtZW50OiAndHJ1ZScgfVxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3JvdXRlckxpbmt9YF0sIHsgcXVlcnlQYXJhbXMgfSlcbiAgICB9XG4gIH1cblxuICBnZXRQcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cygpIHtcbiAgICB0aGlzLnByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzID0gZmFsc2VcbiAgICBsZXQgcHJlRW5yb2xsbWVudFJlc291cmNlc0FycjphbnkgPSBbXVxuICAgIGlmKHRoaXMuY29udGVudFJlYWREYXRhPy5wcmVFbnJvbG1lbnRSZXNvdXJjZXM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LnByZUVucm9sbWVudFJlc291cmNlcz8uZm9yRWFjaCgoaXRlbTphbnkpPT57XG4gICAgICAgIGlmKGl0ZW0gJiYgaXRlbT8uaXNNYW5kYXRvcnkpIHtcbiAgICAgICAgICBwcmVFbnJvbGxtZW50UmVzb3VyY2VzQXJyLnB1c2goaXRlbT8uaWRlbnRpZmllcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgaWYocHJlRW5yb2xsbWVudFJlc291cmNlc0FyciAmJiBwcmVFbnJvbGxtZW50UmVzb3VyY2VzQXJyLmxlbmd0aCkge1xuICAgICAgbGV0IHJlcSA9e1xuICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgIFwiY29udGVudElkc1wiOiBwcmVFbnJvbGxtZW50UmVzb3VyY2VzQXJyLFxuICAgICAgICAgIFwiZmllbGRzXCI6IFtcbiAgICAgICAgICAgICAgLy8gXCJsYXN0QWNjZXNzVGltZVwiLFxuICAgICAgICAgICAgICAvLyBcImNvbXBsZXRpb25QZXJjZW50YWdlXCJcbiAgICAgICAgICBdXG4gICAgICB9XG4gICAgICB9IFxuICAgICAgdGhpcy50b2NTdmMucmVhZFByZUVucm9sbG1lbnRSZXNvdXJjZXNTdGF0ZShyZXEpLnN1YnNjcmliZSgoZGF0YTphbnkpPT57XG4gICAgICAgIGlmKGRhdGEgJiYgZGF0YS5yZXN1bHQgJiYgZGF0YS5yZXN1bHQuY29udGVudExpc3QpIHtcbiAgICAgICAgICBmb3IobGV0IGk9MDsgaTxkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYoTnVtYmVyKGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0W2ldWydjb21wbGV0aW9uUGVyY2VudGFnZSddKSA9PT0gMTAwIHx8IFxuICAgICAgICAgICAgICBkYXRhLnJlc3VsdC5jb250ZW50TGlzdFtpXVsnc3RhdHVzJ10gPT09IDIgXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgdGhpcy5wcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyA9IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIFxuICB9XG5cblxuICBvbkxhbmd1YWdlU2VsZWN0KGxhbmc6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSA9IGxhbmc7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIGxhbmd1YWdlOicsIGxhbmcpO1xuICAgIC8vIEFkZCB5b3VyIGxhbmd1YWdlIGNoYW5nZSBsb2dpYyBoZXJlXG4gIH1cblxufVxuIiwiPCEtLSBcbiAgTWFpbiBDb250YWluZXIgLSBEaXNwbGF5cyBjb3Vyc2UvY29udGVudCBkZXRhaWxzIHdpdGggZW5yb2xsbWVudCBmdW5jdGlvbmFsaXR5XG4gIE9ubHkgZGlzcGxheXMgY29udGVudCBpZiBjb3Vyc2VJRCBpcyBhdmFpbGFibGUsIG90aGVyd2lzZSBzaG93cyBcIm5vdCBmb3VuZFwiIG1lc3NhZ2Vcbi0tPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvdXJzZUlEIGVsc2Ugbm9EYXRhRm91bmRcIj5cbiAgPCEtLSBcbiAgICBFTlJPTExNRU5UIFRFTVBMQVRFIC0gSGFuZGxlcyBhbGwgZW5yb2xsbWVudC9zdGFydC9yZXN1bWUgYnV0dG9uIGZ1bmN0aW9uYWxpdHlcbiAgICBVc2VkIGluIG11bHRpcGxlIHBsYWNlcyB0aHJvdWdob3V0IHRoZSB0ZW1wbGF0ZVxuICAtLT5cbiAgPG5nLXRlbXBsYXRlICNlbnJvbGxGdW5jdGlvbmFsaXR5PlxuICAgIDxkaXYgW2hpZGRlbl09XCJpc1Jlc291cmNlICYmICFjb250ZW50Py5hcnRpZmFjdFVybD8ubGVuZ3RoXCIgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00IHRleHQtY2VudGVyXCI+XG4gICAgICA8IS0tIFNFQ1RJT046IFJlZ3VsYXIgY291cnNlIGVucm9sbG1lbnQgYnV0dG9ucyAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5QUk9HUkFNXG4gICAgICAgICAgICAgICAgICAgICYmIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTVxuICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgJiZcbiAgICAgICAgICAgICAgICAgICAgY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgIDwhLS0gU1RBUlQvUkVTVU1FIGJ1dHRvbiBmb3IgZ3JhbnRlZCBjb3Vyc2VzIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGFjdGlvbkJ0blN0YXR1cyA9PT0gJ2dyYW50JyAmJiAhKGlzTW9iaWxlICYmIGNvbnRlbnQ/LmlzSW5JbnRyYW5ldCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPVVJTRSAmJiBjb250ZW50Py5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhY29udGVudD8uYXJ0aWZhY3RVcmw/Lmxlbmd0aCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPVVJTRSAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFICYmICFjb250ZW50Py5hcnRpZmFjdFVybCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTCkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5QUk9HUkFNICYmIGN1cnJlbnRDb3Vyc2VCYXRjaElkKVwiPlxuICAgICAgICAgIDxhICpuZ0lmPVwic2hvd1N0YXJ0LnNob3cgJiYgIWlzUG9zdEFzc2Vzc21lbnQgJiYgIWZvclByZXZpZXdcIiAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiXG4gICAgICAgICAgICBbcm91dGVyTGlua109XCIocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gcmVzdW1lRGF0YUxpbms/LnVybCA6IGZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cIihyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIWNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCIgPlxuICAgICAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgPyB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgOiB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgfHwgY2VydERhdGFcIj5cbiAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSA/IHRyYW5zbGF0ZUxhYmVscygnU3RhcnQgYWdhaW4nLCAnYXBwdG9jaG9tZScpIDogdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIH19XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2E+XG5cbiAgICAgICAgICA8IS0tIFRBS0UgQVNTRVNTTUVOVCBidXR0b24gKGZvciBwb3N0IGFzc2Vzc21lbnRzKSAtLT5cbiAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaXNQb3N0QXNzZXNzbWVudCAmJiBzaG93VGFrZUFzc2Vzc21lbnQ/LnBvc3RfYXNzZXNzbWVudFwiICAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiIFtyb3V0ZXJMaW5rXT1cImZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCIgPnt7ICdhcHB0b2Nob21lLnRha2VBc3Nlc3NtZW50JyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPCEtLSBDb21tZW50ZWQga2FybWEgcG9pbnRzIHBhbmVsIGZ1bmN0aW9uYWxpdHkgLS0+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICBcbiAgICAgICAgPCEtLSBFTlJPTEwgYnV0dG9uIGZvciBjb3Vyc2VzIHRoYXQgcmVxdWlyZSBlbnJvbGxtZW50IC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIChhY3Rpb25CdG5TdGF0dXMgPT09ICdncmFudCcgJiYgIShpc01vYmlsZSAmJiBjb250ZW50Py5pc0luSW50cmFuZXQpICYmIFxuICAgICAgICAgICAgICAgICAgICAgICEoIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPVVJTRSAmJiBjb250ZW50Py5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgIWNvbnRlbnQ/LmFydGlmYWN0VXJsPy5sZW5ndGggKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNPVVJTRSAmJiBiYXRjaERhdGE/LmVucm9sbGVkICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFICYmICFjb250ZW50Py5hcnRpZmFjdFVybCkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5QUk9HUkFNKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMKVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSAgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZVwiICAoY2xpY2spPVwiaGFuZGxlQXV0b0JhdGNoQXNzaWduKClcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+XG4gICAgICAgICAgICAgICAgPCEtLSBFTlJPTEwgQlVUVE9OIExBQkVMIC0gVXNlZCBhY3Jvc3MgbXVsdGlwbGUgc2VjdGlvbnMgLS0+XG4gICAgICAgICAgICAgICAge3sgJ2FwcHRvY2hvbWUuZW5yb2xsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwhLS0gQ29tbWVudGVkIGthcm1hIHBvaW50cyBwYW5lbCBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFNFQ1RJT046IEJMRU5ERURfUFJPR1JBTSBwcmUtZW5yb2xsbWVudCBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSAmJiAhcHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXNcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24gZW5yb2xsLWJ0biBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJlRW5yb2xtZW50UmVzb3VyY2VzPy5sZW5ndGhcIiAoY2xpY2spPVwicm91dGVUb1ByZUFzc2Vzc2VudCgpXCI+XG4gICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+XG4gICAgICAgICAgICAgICB7eyAnYXBwdG9jaG9tZS5wcmVFbnJvbGwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgIDwvYT5cbiAgICAgPC9uZy1jb250YWluZXI+XG4gICAgIFxuICAgICAgPCEtLSBTRUNUSU9OOiBCTEVOREVEX1BST0dSQU0gcHJlLWVucm9sbG1lbnQgY29tcGxldGlvbiBtZXNzYWdlIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSAmJiBwcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1c1wiPlxuICAgICAgICA8YSBjbGFzcz1cImZsZXggcHJlZW5yb2xsZG9uZS1idG4ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCI+XG4gICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+XG4gICAgICAgICAgICAgICB7eyAnYXBwdG9jaG9tZS5wcmVFbnJvbGxEb25lJyB8IHRyYW5zbGF0ZSB9fTxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9BY2NlcHRfaWNvbi5wbmdcIiBhbHQ9XCJ0aWNrXCIgY2xhc3M9XCJ0aWNrLWljb25cIj5cbiAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgPC9hPlxuICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBQUk9HUkFNICYgTUFOREFUT1JZX0NPVVJTRV9HT0FMIGhhbmRsaW5nIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWU7IGVsc2UgYXV0aFZpZXdCdG5cIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSB8fCBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5NQU5EQVRPUllfQ09VUlNFX0dPQUxcIj5cbiAgICAgICAgICBcbiAgICAgICAgICA8IS0tIFNFQ1RJT046IE1vZGVyYXRlZCBwcm9ncmFtIGVucm9sbG1lbnQgaGFuZGxpbmcgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihjb3Vyc2VDYXRlZ29yeT8uTU9ERVJBVEVEX1BST0dSQU0gPT09IGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkpICYmIChjb250ZW50UmVhZERhdGE/LmJhdGNoZXMgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKChjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSkgICYmICFlbnJvbGxCdG5Mb2FkaW5nKSAmJiAhY29udGVudFJlYWREYXRhPy5iYXRjaGVzWzBdLmVuZERhdGVcIj5cbiAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgKGNsaWNrKT1cImhhbmRsZUF1dG9CYXRjaEFzc2lnbigpXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIiA+XG4gICAgICAgICAgICAgICAgICA8IS0tIEVOUk9MTCBCVVRUT04gTEFCRUwgLS0+XG4gICAgICAgICAgICAgICAgICB7eydhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDwhLS0gQ29tbWVudGVkIGthcm1hIHBvaW50cyBwYW5lbCBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKChjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSkgICYmICFlbnJvbGxCdG5Mb2FkaW5nKSAmJiBjb250ZW50UmVhZERhdGE/LmJhdGNoZXNbMF0uZW5kRGF0ZVwiPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICAgICAgICBbdXNlckVucm9sbG1lbnRMaXN0XT1cInVzZXJFbnJvbGxtZW50TGlzdFwiICBbYW5hbHl0aWNzXT1cImFuYWx5dGljc1wiIChwcm9ncmFtRW5yb2xsQ2FsbCk9XCJwcm9ncmFtRW5yb2xsQ2FsbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbY29udGVudFJlYWREYXRhXT1cImNvbnRlbnRSZWFkRGF0YVwiPlxuICAgICAgICAgICAgICAgIDwvd3MtYXBwLXRvYy1iYW5uZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8IS0tIFNFQ1RJT046IE5vIGJhdGNoZXMgbWVzc2FnZSAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGNvdXJzZUNhdGVnb3J5Py5NT0RFUkFURURfUFJPR1JBTSA9PT0gY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSkgJiYgIWNvbnRlbnRSZWFkRGF0YT8uYmF0Y2hlcyAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICAgICAgTm8gQmF0Y2hlc1xuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPCEtLSBTRUNUSU9OOiBTdGF0dXMgbWVzc2FnZXMgZm9yIG5vbi1tb2RlcmF0ZWQgcHJvZ3JhbXMgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvdXJzZUNhdGVnb3J5Py5NT0RFUkFURURfUFJPR1JBTSAhPT0gY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAqbmdJZj1cIiEoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCkgJiYgY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCIgPnt7ICdhcHB0b2Nob21lLnlvdUFyZU5vdEludml0ZWQnIHwgdHJhbnNsYXRlIH19IDwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiAhIWN1cnJlbnRDb3Vyc2VCYXRjaElkICYmIGdldFN0YXJ0RGF0ZSA9PT0gJ05BJ1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCBzaGFkb3ctbGcgdGV4dC1pbmZvLWRpdlwiID57eyAnYXBwdG9jaG9tZS5ub0FjdGl2ZUJhdGNoZXMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQmF0Y2hJblByb2dyZXNzICYmIGN1cnJlbnRDb3Vyc2VCYXRjaElkICYmIGdldFN0YXJ0RGF0ZSAhPT0gJ05BJ1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCBzaGFkb3ctbGcgdGV4dC1pbmZvLWRpdlwiID57eyAnYXBwdG9jaG9tZS5iYXRjaFdpbGxTdGFydCcgfCB0cmFuc2xhdGUgfX0ge3tnZXRTdGFydERhdGV9fSE8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDwhLS0gU0VDVElPTjogQmF0Y2ggc3RhdHVzIG1lc3NhZ2VzIGZvciBtb2RlcmF0ZWQgcHJvZ3JhbXMgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjb3Vyc2VDYXRlZ29yeT8uTU9ERVJBVEVEX1BST0dSQU0gPT09IGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNCYXRjaEluUHJvZ3Jlc3MgJiYgY3VycmVudENvdXJzZUJhdGNoSWQgJiYgZ2V0U3RhcnREYXRlICE9PSAnTkEnXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCIgPnt7ICdhcHB0b2Nob21lLmJhdGNoV2lsbFN0YXJ0JyB8IHRyYW5zbGF0ZSB9fSB7e2dldFN0YXJ0RGF0ZX19ITwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPCEtLSBTRUNUSU9OOiBJbi1wcm9ncmVzcyBiYXRjaCB3aXRoIHJlc3VtZS9zdGFydCBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0JhdGNoSW5Qcm9ncmVzcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCBhY3Rpb25CdG5TdGF0dXMgPT09ICdncmFudCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIShpc01vYmlsZSAmJiBjb250ZW50Py5pc0luSW50cmFuZXQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5QUk9HUkFNICYmIGN1cnJlbnRDb3Vyc2VCYXRjaElkKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMICYmIGN1cnJlbnRDb3Vyc2VCYXRjaElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVwiPlxuICAgICAgICAgICAgPGEgKm5nSWY9XCJzaG93U3RhcnQuc2hvdyAmJiAhaXNQb3N0QXNzZXNzbWVudFwiXG4gICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cInJlc3VtZURhdGEgPyByZXN1bWVEYXRhTGluaz8udXJsIDogZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJyZXN1bWVEYXRhID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIiA+XG4gICAgICAgICAgICAgICAgICB7eyByZXN1bWVEYXRhICYmIChjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwICYmIGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2U+IDApID8gdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIDpcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlTGFiZWxzKCdzdGFydCcsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDBcIj5cbiAgICAgICAgICAgICAgICB7eyByZXN1bWVEYXRhIHx8IGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IFwiU3RhcnQgYWdhaW5cIiA6IFwiU3RhcnRcIiB9fVxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDxhICpuZ0lmPVwiaXNQb3N0QXNzZXNzbWVudCAmJiBzaG93VGFrZUFzc2Vzc21lbnQ/LnBvc3RfYXNzZXNzbWVudFwiIFtyb3V0ZXJMaW5rXT1cImZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgICAgICAgICBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIiA+e3sgJ2FwcHRvY2hvbWUudGFrZUFzc2Vzc21lbnQnIHwgdHJhbnNsYXRlIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8IS0tIENvbW1lbnRlZCBrYXJtYSBwb2ludHMgcGFuZWwgZnVuY3Rpb25hbGl0eSAtLT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBDVVJBVEVEX1BST0dSQU0gaW4tcHJvZ3Jlc3MgaGFuZGxpbmcgLS0+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiaXNCYXRjaEluUHJvZ3Jlc3MgJiYgKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSAmJiBiYXRjaERhdGE/LmVucm9sbGVkKSAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICA8YSAqbmdJZj1cInNob3dTdGFydC5zaG93ICYmICFpc1Bvc3RBc3Nlc3NtZW50XCIgIChjbGljayk9XCJyYWlzZVRlbGVtZXRyeUZvclB1YmxpYygpXCJcbiAgICAgICAgICBbcm91dGVyTGlua109XCJyZXN1bWVEYXRhID8gcmVzdW1lRGF0YUxpbms/LnVybCA6IGZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJyZXN1bWVEYXRhID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCJcbiAgICAgICAgICBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWU7IGVsc2UgYXV0aFZpZXdcIiA+XG4gICAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgJiYgKGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPCAxMDAgJiYgY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZT4gMCkgPyB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgOlxuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMFwiPlxuICAgICAgICAgICAge3sgcmVzdW1lRGF0YSB8fCBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyB0cmFuc2xhdGVMYWJlbHMoJ1N0YXJ0IGFnYWluJywgJ2FwcHRvY2hvbWUnKSA6IHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBMb2FkaW5nIHN0YXRlIGZvciBlbnJvbGxtZW50IGJ1dHRvbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbnJvbGxCdG5Mb2FkaW5nXCI+XG4gICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIiczNnB4J1wiXG4gICAgICAgICAgW2JpbmRpbmdDbGFzc109XCInZmxleCByb3VuZGVkIGgtOCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBDVVJBVEVEX1BST0dSQU0gZW5yb2xsbWVudCBidXR0b24gLS0+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ1VSQVRFRF9QUk9HUkFNICYmICFiYXRjaERhdGE/LmVucm9sbGVkICYmICFlbnJvbGxCdG5Mb2FkaW5nXCI+XG4gICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZVwiKGNsaWNrKT1cImhhbmRsZUF1dG9CYXRjaEFzc2lnbigpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciA+XG4gICAgICAgICAgICA8IS0tIEVOUk9MTCBCVVRUT04gTEFCRUwgLS0+XG4gICAgICAgICAgICB7eyAnYXBwdG9jaG9tZS5lbnJvbGwnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFNFQ1RJT046IFNUQU5EQUxPTkVfQVNTRVNTTUVOVCBlbnJvbGxtZW50IGJ1dHRvbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQgJiYgIWVucm9sbEJ0bkxvYWRpbmcgJiYgY29udGVudD8uY291cnNlQ2F0ZWdvcnkgIT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiAoY2xpY2spPVwiaGFuZGxlQXV0b0JhdGNoQXNzaWduKClcIiAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyID5cbiAgICAgICAgICAgIDwhLS0gRU5ST0xMIEJVVFRPTiBMQUJFTCAtLT5cbiAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX0gXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFNFQ1RJT046IElOVklURS1PTkxZIFNUQU5EQUxPTkVfQVNTRVNTTUVOVCBtZXNzYWdlIC0tPiAgICAgIFxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZyAmJiBjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+XG4gICAgXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWU7IGVsc2UgYXV0aFZpZXdGb3JJbnZpdGVPbmx5QXNzZXNzbWVudFwiID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCIgPnt7ICdhcHB0b2Nob21lLnlvdUFyZU5vdEludml0ZWRGb3JBc3Nlc3NtZW50JyB8IHRyYW5zbGF0ZSB9fSA8L3NwYW4+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBFbnJvbGxlZCBJTlZJVEUtT05MWSBTVEFOREFMT05FX0FTU0VTU01FTlQgdGFrZSB0ZXN0IGJ1dHRvbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgJiYgYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiBpc0JhdGNoSW5Qcm9ncmVzcyAmJiAhZW5yb2xsQnRuTG9hZGluZyAmJiBjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+ICAgICAgICBcbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgW3JvdXRlckxpbmtdPVwiZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cIihyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXCI+e3sgJ2FwcHRvY2hvbWUudGFrZVRlc3RBZ2FpbicgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMFwiPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0JyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBTdGF0dXMgbWVzc2FnZXMgZm9yIElOVklURS1PTkxZIFNUQU5EQUxPTkVfQVNTRVNTTUVOVCAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNCYXRjaEluUHJvZ3Jlc3MgJiYgISFjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgPT09ICdOQScgJiYgY29udGVudD8uY291cnNlQ2F0ZWdvcnkgPT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCBzaGFkb3ctbGcgdGV4dC1pbmZvLWRpdlwiID57eyAnYXBwdG9jaG9tZS5ub0FjdGl2ZUJhdGNoZXMnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQmF0Y2hJblByb2dyZXNzICYmIGN1cnJlbnRDb3Vyc2VCYXRjaElkICYmIGdldFN0YXJ0RGF0ZSAhPT0gJ05BJyAmJiBjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCIgPnt7ICdhcHB0b2Nob21lLmJhdGNoV2lsbFN0YXJ0JyB8IHRyYW5zbGF0ZSB9fSB7e2dldFN0YXJ0RGF0ZX19ITwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgXG4gICAgICA8IS0tIFNFQ1RJT046IFJlZ3VsYXIgU1RBTkRBTE9ORV9BU1NFU1NNRU5UIGVucm9sbGVkIHRha2UgdGVzdCBidXR0b24gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UICYmIGJhdGNoRGF0YT8uZW5yb2xsZWQgJiYgIWVucm9sbEJ0bkxvYWRpbmcgJiYgY29udGVudD8uY291cnNlQ2F0ZWdvcnkgIT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDBcIj57eyAnYXBwdG9jaG9tZS50YWtlVGVzdEFnYWluJyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwXCI+e3sgJ2FwcHRvY2hvbWUudGFrZVRlc3QnIHwgdHJhbnNsYXRlIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIFNFQ1RJT046IEJMRU5ERURfUFJPR1JBTSB3b3JrZmxvdyBzdGF0dXMgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgIDwhLS0gUmV2aWV3IHN0YXR1cyBtZXNzYWdlIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJbml0aWF0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGJhdGNoRGF0YT8ud29ya0Zsb3c/LndmSXRlbT8uY3VycmVudFN0YXR1cyA9PT0gV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5BUFBST1ZFRCB8fCBiYXRjaERhdGE/LndvcmtGbG93Py53Zkl0ZW0/LmN1cnJlbnRTdGF0dXMgPT09IFdGQmxlbmRlZFByb2dyYW1TdGF0dXMuUkVKRUNURUQgfHwgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLldJVEhEUkFXTilcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwid3MtbWF0LWFjY2VudC10ZXh0IHdzLW1hdC1hY2NlbnQtbGlnaHQtYmcgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgc3RhdHVzTXNnXCI+XG4gICAgICAgICAgICA8cCBjbGFzcz1cIm1hcmdpbi1yZW1vdmUtYm90dG9tIGZvbnQtYm9sZFwiPlxuICAgICAgICAgICAgICB7eyAnYXBwdG9jaG9tZS5yZXF1ZXN0VW5kZXJSZXZpZXcnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDwhLS0gQXBwcm92ZWQgQkxFTkRFRF9QUk9HUkFNIHN0YXJ0L3Jlc3VtZSBidXR0b24gLS0+XG4gICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgPGFcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd1N0YXJ0LnNob3cgJiYgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJbml0aWF0ZWQgJiYgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLkFQUFJPVkVEXCJcbiAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cImlzQmF0Y2hJblByb2dyZXNzPyAocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gcmVzdW1lRGF0YUxpbms/LnVybCA6IGZpcnN0UmVzb3VyY2VMaW5rPy51cmwgOiAnJyBcIiAgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKClcIlxuICAgICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cImlzQmF0Y2hJblByb2dyZXNzID8gKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKSA6ICcnIFwiXG4gICAgICAgICAgICBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiBbbmdDbGFzc109XCJ7J2Rpc2FibGUtc3RhcnQtYnRuJzogIWlzQmF0Y2hJblByb2dyZXNzfVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIighY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwKSAmJiAhY2VydERhdGFcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWU7IGVsc2UgYXV0aFZpZXdcIiA+XG4gICAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSAmJiAoY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCAmJiBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlPiAwKSA/IHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3N0YXJ0JywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCB8fCBjZXJ0RGF0YVwiPlxuICAgICAgICAgICAgICB7eyByZXN1bWVEYXRhIHx8IGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCA/IHRyYW5zbGF0ZUxhYmVscygnU3RhcnQgYWdhaW4nLCAnYXBwdG9jaG9tZScpIDogdHJhbnNsYXRlTGFiZWxzKCdzdGFydCcsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBFeHRlcm5hbCByZWdpc3RyYXRpb24gbGluayAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25CdG5TdGF0dXMgPT0gJ3JlamVjdCcgJiYgY29udGVudD8ucmVnaXN0cmF0aW9uVXJsXCI+XG4gICAgICAgIDxhIFtocmVmXT1cImNvbnRlbnQ/LnJlZ2lzdHJhdGlvblVybFwiIHRhcmdldD1cIl9ibGFua1wiIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyXCIgPnt7ICdhcHB0b2Nob21lLnJlZ2lzdGVyJyB8IHRyYW5zbGF0ZSB9fTwvYT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPCEtLSBcbiAgICBQUk9HUkVTUyBGVU5DVElPTkFMSVRZIFRFTVBMQVRFXG4gICAgRGlzcGxheXMgcHJvZ3Jlc3MgYmFyIGFuZCByYXRpbmcgYnV0dG9uIGZ1bmN0aW9uYWxpdHlcbiAgLS0+XG4gIDxuZy10ZW1wbGF0ZSAjcHJvZ3Jlc3NGdW5jdGlvbmFsaXR5PlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQgdGV4dC1zbVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMSB0ZXh0LXhzXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2Uub3ZlcmFsbFByb2dyZXNzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHNcIiAqbmdJZj1cImNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID4gMFwiPiB7eyBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB9fSAlPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHdzLXdpZGdldC1jb250ZW50LXByb2dyZXNzICpuZ0lmPVwiY29udGVudD8uaWRlbnRpZmllclwiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIlxuICAgICAgICAgICAgW2NvbnRlbnRJZF09XCJjb250ZW50Py5pZGVudGlmaWVyXCIgW3Byb2dyZXNzXT1cImNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlXCIgW3Byb2dyZXNzVHlwZV09XCIncGVyY2VudGFnZSdcIlxuICAgICAgICAgICAgW2N1c3RvbUNsYXNzTmFtZV09XCInY29udGVudC1wcm9ncmVzcydcIiA+XG4gICAgICAgICAgPC93cy13aWRnZXQtY29udGVudC1wcm9ncmVzcz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID49IDUwXCI+XG4gICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwiYWNjZW50XCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwicmF0ZS1idXR0b25cIiAoY2xpY2spPVwib3BlbkZlZWRiYWNrRGlhbG9nKGNvbnRlbnQpXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+c3Rhcl9wdXJwbGU1MDA8L21hdC1pY29uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdXNlclJhdGluZ1wiPlxuICAgICAgICAgICAgPGRpdj57eyAnYXBwdG9jc2luZ2xlcGFnZS5yYXRlTm93JyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VyUmF0aW5nXCI+XG4gICAgICAgICAgICA8ZGl2Pnt7ICdhcHB0b2NzaW5nbGVwYWdlLmVkaXRSYXRpbmcnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPCEtLSBcbiAgICBNQUlOIENPTlRFTlQgRElTUExBWSBTRUNUSU9OXG4gICAgQmFubmVyLCBkZXRhaWxzLCBhbmQgY29udGVudCBsYXlvdXRcbiAgLS0+XG4gIDxkaXYgY2xhc3M9XCJ0b2MtYmFubmVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTYgZml4ZWQtd2lkdGhcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJiYW5uZXItZGV0YWlscyB0b2MtY29udGVudFwiICNiYW5uZXJEZXRhaWxzPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEzMnB4J1wiIFtoZWlnaHRdPVwiJzMycHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzE0MHB4J1wiIFtoZWlnaHRdPVwiJzI0cHgnXCIgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCBibHVlLTItbG9hZGVyJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgdGFnLWRpdiByb3VuZGVkLTJ4bCBnYXAtMSBpdGVtcy1jZW50ZXIgcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ3cy1tYXQtb3JhbmdlLXRleHQgbm9kdHJhbnNsYXRlXCI+dmlkZW9fbGlicmFyeTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY291cnNlQ2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgZm9udC1ib2xkIHRleHQtd2hpdGUgbGVhZGluZy0zIG5vZHRyYW5zbGF0ZVwiPnt7IHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5LCAnc2VhcmNoZmlsdGVycycpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudD8uY291cnNlQ2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgZm9udC1ib2xkIHRleHQtd2hpdGUgbGVhZGluZy0zIG5vZHRyYW5zbGF0ZVwiPnt7IHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSwgJ3NlYXJjaGZpbHRlcnMnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjYlBsYW5FbmREYXRlXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZHVlLXRhZyB0ZXh0LXhzIGxlYWRpbmctM1wiIFtuZ0NsYXNzXT1cInsnZHVlLXdhcm5pbmcnOiBjYlBsYW5EdXJhdGlvbiA9PT0gbnNDYXJkQ29udGVudERhdGEuVVBDT01JTkcsICdkdWUtb3ZlcmR1ZSc6IGNiUGxhbkR1cmF0aW9uID09PSBuc0NhcmRDb250ZW50RGF0YS5PVkVSRFVFLCAnZHVlLXN1Y2Nlc3MnOiBjYlBsYW5EdXJhdGlvbiA9PT0gbnNDYXJkQ29udGVudERhdGEuU1VDQ0VTU31cIiA+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdjb21tb24uZHVlQnknIHwgdHJhbnNsYXRlIH19IC0gJm5ic3A7PHNwYW4gY2xhc3M9XCJmb250LWJvbGRcIj57eyBjYlBsYW5FbmREYXRlIHwgZGF0ZTogJ2QgTU1NLCB5J319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LXdoaXRlIG1vYi1zaGFyZVwiICpuZ0lmPVwiY2FuU2hhcmVcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCIgKGNsaWNrKT1cIm9uQ2xpY2tPZlNoYXJlKClcIj5zaGFyZTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInOTAlJ1wiIFtoZWlnaHRdPVwiJzMycHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzcwJSdcIiBbaGVpZ2h0XT1cIiczMnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCBibHVlLTItbG9hZGVyJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFubmVyLXRleHQgdGV4dC1iYXNlIHNtOnRleHQtNHhsIGxlYWRpbmctNiBzbTpsZWFkaW5nLTEwIGZvbnQtYm9sZCBub2R0cmFuc2xhdGVcIj57eyBoYW5kbGVDYXBpdGFsaXplKGNvbnRlbnQ/Lm5hbWUpIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHNtOnRleHQtYmFzZSBzb3VyY2UtdGV4dCBmb250LXNlbWlib2xkIGJyZWFrLXdvcmRzIG5vZHRyYW5zbGF0ZVwiICNjb250ZW50U291cmNlIFtuZ0NsYXNzXT1cInsnc291cmNlRWxsaXBzaXMnOiBzb3VyY2VFbGxpcHNpc31cIiB0aXRsZT1cInt7Y29udGVudD8uc291cmNlfX1cIj57eyAnY2FyZGNvbnRlbnR2Mi5ieScgfCB0cmFuc2xhdGUgfX0ge3sgY29udGVudD8uc291cmNlIH19PC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTIwcHgnXCIgW2hlaWdodF09XCInNDBweCdcIlxuICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODhweCdcIiBbaGVpZ2h0XT1cIicyNHB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCBibHVlLTItbG9hZGVyJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBpdGVtcy1jZW50ZXJcIiAqbmdJZj1cImNvbnRlbnQ/LmF2ZXJhZ2VSYXRpbmcgfHwgY29udGVudD8uYWRkaXRpb25hbFRhZ3M/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHJhdGluZy1jaGlwIHB5LTIgaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImhhbmRsZU5hdmlnYXRlVG9SZXZpZXdzKClcIiAqbmdJZj1cImNvbnRlbnQ/LmF2ZXJhZ2VSYXRpbmdcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIG1hcmdpbi1sZWZ0LXMgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPmdyYWRlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtd2hpdGUgdGV4dC1zbSBsZWFkaW5nLTRcIj57eyBjb250ZW50Py5hdmVyYWdlUmF0aW5nIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXBhcmF0b3JcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXdoaXRlIHRleHQtc20gbGVhZGluZy00IG1hcmdpbi1yaWdodC1tXCI+e3sgY29udGVudD8udG90YWxSYXRpbmcgfCBwaXBlQ291bnRUcmFuc2Zvcm0gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIiAqbmdJZj1cImNvbnRlbnQ/LmFkZGl0aW9uYWxUYWdzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb3N0LWVucm9sbGVkLWNoaXAgdGV4dC14cyBsZWFkaW5nLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb250ZW50Py5hZGRpdGlvbmFsVGFncz8uaW5jbHVkZXMoJ21vc3RUcmVuZGluZycpXCI+e3sgJ2NhcmRjb250ZW50djIubW9zdFRyZW5kaW5nJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb250ZW50Py5hZGRpdGlvbmFsVGFncz8uaW5jbHVkZXMoJ21vc3RFbnJvbGxlZCcpXCI+e3sgJ2NhcmRjb250ZW50djIubW9zdEVucm9sbGVkJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxODBweCdcIiBbaGVpZ2h0XT1cIicyMHB4J1wiXG4gICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiBjb250ZW50Py5zWVNfSU5URVJOQUxfTEFTVF9VUERBVEVEX09OXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBsZWFkaW5nLTQgc291cmNlLXRleHQgbm9kdHJhbnNsYXRlXCI+KHt7ICdhcHB0b2MubGFzdFVwZGF0ZWRPbicgfCB0cmFuc2xhdGUgfX0ge3sgY29udGVudD8uc1lTX0lOVEVSTkFMX0xBU1RfVVBEQVRFRF9PTiB8IGRhdGU6ICdNTU0gZCwgeScgfX0pPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC02IGZpeGVkLXdpZHRoXCI+XG4gICAgPGRpdiBjbGFzcz1cInRvYy1jb250ZW50XCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNICYmXG4gICAgICAgIHNlbGVjdGVkQmF0Y2hEYXRhPy5jb250ZW50WzBdPy5iYXRjaEF0dHJpYnV0ZXM/LmJhdGNoTG9jYXRpb25EZXRhaWxzICYmXG4gICAgICAgIHNlbGVjdGVkQmF0Y2hEYXRhPy5jb250ZW50WzBdPy5lbnJvbGxtZW50RW5kRGF0ZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tZGV0YWlscyBtdC02XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC00IHBiLTNcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImxvY2F0aW9uLWljb24gbm9kdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAgbG9jYXRpb25fb25cbiAgICAgICAgICAgIDwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jLWRlc2NcIj5cbiAgICAgICAgICAgICAge3tzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uYmF0Y2hBdHRyaWJ1dGVzPy5iYXRjaExvY2F0aW9uRGV0YWlsc319XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiZXZlbnQtaWNvbiBub2R0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgICBldmVudDwvbWF0LWljb24+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jLWRlc2NcIj5cbiAgICAgICAgICAgICAgTGFzdCBkYXRlIG9mIGVucm9sbG1lbnQgLSB7e3NlbGVjdGVkQmF0Y2hEYXRhPy5jb250ZW50WzBdPy5lbnJvbGxtZW50RW5kRGF0ZSB8IGRhdGU6ICdkZC9NTS95eXl5J319XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJyZWNvbW1lbmRlZENvdXJzZXNJZCAmJiAhZmVlZGJhY2tHaXZlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHgtNCBweS0zIG10LTYgcmVsZXZlbnQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGdhcC00IGl0ZW1zLWNlbnRlciBmbGV4LXdyYXAgZmxleCBqdXN0aWZ5LWNlbnRlciBtZDpqdXN0aWZ5LXN0YXJ0XCI+XG4gICAgICAgICAgICA8aW1nIHNyYz1cIi9hc3NldHMvaW1hZ2VzL3Nha3NoYW1BSS9sYWR5LWdyZWV0LnN2Z1wiIGFsdD1cImdyZWV0XCIgd2lkdGg9XCI1Ni44OVwiIGhlaWdodD1cIjY0XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVsZXZlbnQtaW5mb1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZGVyIHRleHQtc20gcmVsZXZlbnQtaGVhZGluZyBibG9jayBtYi0xXCI+e3sgJ2hvbWUudG9jUmVsZXZlbnRIZWFkaW5nJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWxldmVudC1zdWJpbmZvIGZvbnQtbm9ybWFsIHRleHQtc20gYmxvY2tcIj57eyAnaG9tZS50b2NSZWxldmVudFN1YkhlYWRpbmcnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LW1pZGRsZSByZWxldmFudC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1taWRkbGUgcmVsZXZlbnQtbm9ybWFsIHJlbGV2ZW50LWJ0biBweS0yIHB4LTQgcmVsZXZhbnQtYm94XCJcbiAgICAgICAgICAgICAgICAobW91c2VlbnRlcik9XCJpc1JlbGV2ZW50QnRuSG92ZXJlZCA9IHRydWVcIlxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cImlzUmVsZXZlbnRCdG5Ib3ZlcmVkID0gZmFsc2VcIiAoY2xpY2spPVwiaGFuZGxlQWNjZXB0UmVsZXZlbnQoKVwiPlxuICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgIFtzcmNdPVwiaXNSZWxldmVudEJ0bkhvdmVyZWQgJiYgIWlzUmVsZXZlbnQgPyBTQUtTSEFNQUlfSUNPTl9MT0FERVIgOiBTQUtTSEFNQUlfSUNPTl9OT1JNQUxcIlxuICAgICAgICAgICAgICAgICAgYWx0PVwibG9hZGVyXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgY2xhc3M9XCJtci0yXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXJlbGV2ZW50IGZmLWxhdG8gdGV4dC1zbSBmb250LWJvbGRcIj57eyAnaG9tZS5yZWxldmVudCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICBcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1taWRkbGUgbm8tYnV0dG9uIG1sLThcIiAoY2xpY2spPVwiaGFuZGxlRGVjbGluZVJlbGV2ZW50KClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtaWNvbiB0ZXh0LW5vIG1yLTEgbm9kdHJhbnNsYXRlXCI+dGh1bWJfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LW5vIGZmLWxhdG8gdGV4dC1zbSBmb250LWJvbGRcIj57eyAnaG9tZS5ubycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PiAgXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYi00IGxnOnB5LTRcIj5cbiAgICAgICAgPCEtLSBPdmVyYWxsIHByb2dyZXNzIGZ1bmN0aW9uYWxpdHkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtcHJvZ3Jlc3NcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInByb2dyZXNzRnVuY3Rpb25hbGl0eVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBPdmVyYWxsIHByb2dyZXNzIGZ1bmN0aW9uYWxpdHkgLS0+XG5cbiAgICAgICAgPHdzLXdpZGdldC1jb250ZW50LXRvYyBbY29udGVudF09XCJjb250ZW50XCIgW2NvbXBvbmVudE5hbWVdPVwiJ3RvYydcIiAgW3BhdGhTZXRdPVwicGF0aFNldFwiIFt0b2NTdHJ1Y3R1cmVdPVwidG9jU3RydWN0dXJlXCIgXG4gICAgICAgIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiAgW2lzRW5yb2xsZWRdPVwiYmF0Y2hEYXRhPy5lbnJvbGxlZFwiIFtyZXN1bWVEYXRhXT1cInJlc3VtZURhdGFcIiBbYmF0Y2hEYXRhXT1cInNlbGVjdGVkQmF0Y2hEYXRhXCIgW3NrZWxldG9uTG9hZGVyXT1cInNrZWxldG9uTG9hZGVyXCIgXG4gICAgICAgIFtjaGFuZ2VUYWJdPVwiY2hhbmdlVGFiXCIgW2hpZXJhcmNoeU1hcERhdGFdPVwidG9jU3ZjPy5oYXNobWFwXCIgW3NlbGVjdGVkQmF0Y2hEYXRhXT1cInNlbGVjdGVkQmF0Y2hEYXRhXCIgW2NvbmRpdGlvbl09XCJ7aXNQb3N0QXNzZXNzbWVudDogaXNQb3N0QXNzZXNzbWVudCwgY29udGVudDogY29udGVudCwgaXNBY2JwQ291cnNlOiBpc0FjYnBDb3Vyc2UsIGlzQ2xhaW1lZDogaXNDbGFpbWVkLCBtb250aGx5Q2FwRXhjZWVkOiBtb250aGx5Q2FwRXhjZWVkLCBpc0NvbXBsZXRlZFRoaXNNb250aDogaXNDb21wbGV0ZWRUaGlzTW9udGgsIHNob3dUYWtlQXNzZXNzbWVudDogc2hvd1Rha2VBc3Nlc3NtZW50LCB1c2VyRW5yb2xsbWVudExpc3Q6IHVzZXJFbnJvbGxtZW50TGlzdCwgcmVzdW1lRGF0YTogcmVzdW1lRGF0YSwgdXNlclJhdGluZzogdXNlclJhdGluZywgZW5yb2xsQnRuTG9hZGluZzogZW5yb2xsQnRuTG9hZGluZywgcHJpbWFyeUNhdGVnb3J5OiBwcmltYXJ5Q2F0ZWdvcnksIGN1cnJlbnRDb3Vyc2VCYXRjaElkOiBjdXJyZW50Q291cnNlQmF0Y2hJZCwgaXNBY2JwQ2xhaW06IGlzQWNicENsYWltfVwiIFtrcGFycmF5XT1cImtwYXJyYXlcIlxuICAgICAgICAocGxheVJlc3VtZUZvckFJKT1cInBsYXlSZXN1bWVGb3JBSSgpXCIgKGVucm9sbFVzZXJUb0FJKT1cImVucm9sbFVzZXJUb0FJKClcIiBbY29udGVudFJlYWREYXRhXT1cImNvbnRlbnRSZWFkRGF0YVwiPjwvd3Mtd2lkZ2V0LWNvbnRlbnQtdG9jPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9iLXRpcC1mb3ItbGVhcm5lclwiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJsZWFybkFkdmlzb3J5RGF0YSAmJiBsZWFybkFkdmlzb3J5RGF0YT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXRpcHMtZm9yLWxlYXJuZXItY2FyZCBbbGVhcm5BZHZpc29yeURhdGFdPVwibGVhcm5BZHZpc29yeURhdGFcIj48L3dzLXdpZGdldC10aXBzLWZvci1sZWFybmVyLWNhcmQ+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIFxuXG4gICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRhaW5lclwiID5cbiAgICAgIDwhLS0gaWYgbmVlZGVkIHN0aWNreSBvZiByaWdodCBjb250YWluZXIgYWRkIHRoaXMgdG8gYmVsb3cgZGl2ID0+ICNyaWdodENvbnRhaW5lciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250ZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250ZW50LWlubmVyXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMzg0cHgnXCIgW2hlaWdodF09XCInMjI0cHgnXCJcbiAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGltYWdlLWRpdlwiIFtuZ1N0eWxlXT1cIntcbiAgICAgICAgJ2JhY2tncm91bmQtaW1hZ2UnOiAndXJsKCcgKyBjb250ZW50Py5wb3N0ZXJJbWFnZSArICcpJywgJ2JhY2tncm91bmQtcmVwZWF0JzogJ25vLXJlcGVhdCcsICdiYWNrZ3JvdW5kLXNpemUnOiAnY292ZXInfVwiIFtuZ0NsYXNzXT1cInsnaW1hZ2UtYmFja2Ryb3AnOiBzY3JvbGxlZH1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGp1c3RpZnktYmV0d2VlbiB0ZXh0LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTQganVzdGlmeS1iZXR3ZWVuXCIgW25nQ2xhc3NdPVwieydqdXN0aWZ5LWJldHdlZW4nOiBzY3JvbGxlZCwgJ2p1c3RpZnktZW5kJzogIXNjcm9sbGVkfVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHRhZy1kaXYgcm91bmRlZC0yeGwgZ2FwLTEgaXRlbXMtY2VudGVyIHAtMlwiICpuZ0lmPVwic2Nyb2xsZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIndzLW1hdC1vcmFuZ2UtdGV4dCBub2R0cmFuc2xhdGVcIj52aWRlb19saWJyYXJ5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb3Vyc2VDYXRlZ29yeVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBmb250LWJvbGQgdGV4dC13aGl0ZSBsZWFkaW5nLTNcIj57eyB0cmFuc2xhdGVMYWJlbChjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSwgJ3NlYXJjaGZpbHRlcnMnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctM1wiPnt7IHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSwgJ3NlYXJjaGZpbHRlcnMnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwib25DbGlja09mU2hhcmUoKVwiIGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmQgZ2FwLTIgc2hhcmUtdGFnXCIgKm5nSWY9XCJjYW5TaGFyZSAmJiAhZm9yUHJldmlld1wiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+c2hhcmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPGRpdj57eyAnYXBwdG9jc2luZ2xlcGFnZS5zaGFyZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xXCIgKm5nSWY9XCJzY3JvbGxlZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhsIGxlYWRpbmctNiB0ZXh0LXdoaXRlIGZvbnQtYm9sZFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY29udGVudD8ubmFtZSkgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBzb3VyY2UtdGV4dCBmb250LXNlbWlib2xkIGJyZWFrLXdvcmRzXCIgI2NvbnRlbnRTb3VyY2UgW25nQ2xhc3NdPVwieydzb3VyY2VFbGxpcHNpcyc6IHNvdXJjZUVsbGlwc2lzfVwiIHRpdGxlPVwie3tjb250ZW50Py5zb3VyY2V9fVwiPnt7ICdjYXJkY29udGVudHYyLmJ5JyB8IHRyYW5zbGF0ZSB9fSB7eyBjb250ZW50Py5zb3VyY2UgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgcC01IGJvcmRlci1ib3R0b21cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiICpuZ0lmPVwiY29udGVudCAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0zIGp1c3RpZnktYXJvdW5kXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uYmF0Y2hBdHRyaWJ1dGVzPy5jdXJyZW50QmF0Y2hTaXplIHx8ICcwJyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1sYWJlbFwiPnt7ICdhcHB0b2MuYmF0Y2hTaXplJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhdGNoLWluZm9cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1iYXNlIGZvbnQtYm9sZFwiPnt7IHNlbGVjdGVkQmF0Y2hEYXRhPy51c2VyQ291bnQ/LnRvdGFsQXBwbGllZCB8fCAnMCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLnRvdGFsQXBwbGllZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8udXNlckNvdW50Py5lbnJvbGxlZCB8fCAnMCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLnRvdGFsRW5yb2xsZWQnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGltZXIgJiYgdGltZXIuZGF5cyA+PSAwICYmIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNiBiYXRjaC10aW1lclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHVuZGVybGluZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmJhdGNoU3RhcnRzSW4nIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB1bmRlcmxpbmVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtNHhsIGxlYWRpbmctMTAgY291bnRlclwiPnt7IHRpbWVyLmRheXMgfHwgMCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmRheXMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvdW50ZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIubWluID09PSA2MCA/IHRpbWVyLmhvdXJzICsgMSA6IHRpbWVyLmhvdXJzIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuaG91cnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvdW50ZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIubWluID09PSA2MCA/IDAwIDogdGltZXIubWluIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UubWludXRlcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWU7IGVsc2UgYXV0aFZpZXdCdG5cIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2JpbGUxMjAwICYmIHByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgPHdzLWFwcC10b2MtYmFubmVyIHJvbGU9XCJiYW5uZXJcIiBbYmFubmVyc109XCJiYW5uZXJzXCIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIFtjb250ZW50XT1cImNvbnRlbnRcIlxuICAgICAgICAgICAgICAgIFt1c2VyRW5yb2xsbWVudExpc3RdPVwidXNlckVucm9sbG1lbnRMaXN0XCIgKHdpdGhkcmF3T3JFbnJvbGwpPVwid2l0aGRyYXdPckVucm9sbCgkZXZlbnQpXCIgW2FuYWx5dGljc109XCJhbmFseXRpY3NcIlxuICAgICAgICAgICAgICAgIFtyZXN1bWVEYXRhXT1cInJlc3VtZURhdGFcIiBbYmF0Y2hEYXRhXT1cImJhdGNoRGF0YVwiIFtjb250ZW50UmVhZERhdGFdPVwiY29udGVudFJlYWREYXRhXCI+XG4gICAgICAgICAgICAgICAgPC93cy1hcHAtdG9jLWJhbm5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczMzZweCdcIiBbaGVpZ2h0XT1cIic0MHB4J1wiXG4gICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczMzZweCdcIiBbaGVpZ2h0XT1cIic2OHB4J1wiXG4gICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGdhcC0yIGluZm8tZGl2XCIgKm5nSWY9XCJjb250ZW50Py5pc0luSW50cmFuZXQgJiYgc2hvd0ludHJhbmV0TXNnXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+e3sgJ2FwcHRvY2hvbWUudmlld2VkSW5JbnRyYW5ldCcgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtMiBpbmZvLWRpdlwiICpuZ0lmPVwic2hvd0luc3RydWN0b3JMZWRNc2dcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5pbmZvPC9tYXQtaWNvbj4mbmJzcDtcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyID57eyAnYXBwdG9jaG9tZS5ub3RBdmFpbGFibGVPbmxpbmUnIHwgdHJhbnNsYXRlIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIgZ2FwLTIgaW5mby1kaXZcIiAqbmdJZj1cInNob3dTdGFydC5tc2cgPT09ICd5b3V0dWJlRm9yYmlkZGVuJ1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPmluZm88L21hdC1pY29uPiZuYnNwO1xuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgPnt7ICdhcHB0b2Nob21lLnlvdXR1YmVDb250ZW50QmxvY2tlZCcgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93QnRuXCI+XG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cInt7IGNzY21zVXJsIH19XCIgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmFwcGx5Rm9yUGh5c2ljYWxUcmFpbmluZycgfCB0cmFuc2xhdGUgfX08L2E+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblN0YXR1cyA8PSAyICYmIGlzQmF0Y2hJblByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJwcm9ncmVzc0Z1bmN0aW9uYWxpdHlcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuXG4gICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInJlc3VtZURhdGEgJiYgIXVzZXJSYXRpbmdcIj4gLS0+XG4gICAgICAgICAgICAgICAgPCEtLSA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidSYXRlIHRoaXMgY291cnNlJ1wiIFtkYXRhXT1cImtwYXJyYXlcIlxuICAgICAgICAgICAgICAgICAgW3BDYXRlZ29yeV09XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD4gLS0+XG4gICAgICAgICAgICAgIDwhLS0gPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInJlc3VtZURhdGEgJiYgdXNlclJhdGluZ1wiPlxuICAgICAgICAgICAgICAgIDx3cy1hcHAta2FybWFwb2ludHMtcGFuZWwgW2J0bnR5cGVdPVwiJ0VkaXQgcmF0aW5nJ1wiIFtkYXRhXT1cImtwYXJyYXlcIlxuICAgICAgICAgICAgICAgICAgW3BDYXRlZ29yeV09XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25CdG5TdGF0dXMgIT09ICd3YWl0JyAmJiBjb250ZW50Py5zdGF0dXMgIT09ICdEZWxldGVkJyAmJiBjb250ZW50Py5zdGF0dXMgIT09ICdFeHBpcmVkJ1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZW5yb2xsRnVuY3Rpb25hbGl0eVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2FybWEtcG9pbnRzLWRpdlwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWthcm1hLXBvaW50cyBbZGF0YV09XCJrcGFycmF5XCIgKGNsaWNrQ2xhaW1LYXJtYVBvaW50cyk9XCJvbkNsaWNrT2ZDbGFpbSgkZXZlbnQpXCIgW2NvbnRlbnRdID0gXCJjb250ZW50XCJcbiAgICAgICAgICAgICAgICBbY29uZGl0aW9uXT1cIntpc1Bvc3RBc3Nlc3NtZW50OiBpc1Bvc3RBc3Nlc3NtZW50LCBjb250ZW50OiBjb250ZW50LCBpc0FjYnBDb3Vyc2U6IGlzQWNicENvdXJzZSwgaXNDbGFpbWVkOiBpc0NsYWltZWQsIG1vbnRobHlDYXBFeGNlZWQ6IG1vbnRobHlDYXBFeGNlZWQsIGlzQ29tcGxldGVkVGhpc01vbnRoOiBpc0NvbXBsZXRlZFRoaXNNb250aCwgc2hvd1Rha2VBc3Nlc3NtZW50OiBzaG93VGFrZUFzc2Vzc21lbnQsIHVzZXJFbnJvbGxtZW50TGlzdDogdXNlckVucm9sbG1lbnRMaXN0LCBpc0NvbXBsZXRlZFRoaXNNb250aDogaXNDb21wbGV0ZWRUaGlzTW9udGgsIHJlc3VtZURhdGE6IHJlc3VtZURhdGEsIHVzZXJSYXRpbmc6IHVzZXJSYXRpbmcsIGVucm9sbEJ0bkxvYWRpbmc6IGVucm9sbEJ0bkxvYWRpbmcsIHByaW1hcnlDYXRlZ29yeTogcHJpbWFyeUNhdGVnb3J5LCBjdXJyZW50Q291cnNlQmF0Y2hJZDogY3VycmVudENvdXJzZUJhdGNoSWQsIGlzQWNicENsYWltOiBpc0FjYnBDbGFpbX1cIj48L3dzLXdpZGdldC1rYXJtYS1wb2ludHM+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC02XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMiBrcGktbG9hZGVyLWRpdlwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzQ4cHgnXCIgW2hlaWdodF09XCInOHB4J1wiIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0yIGtwaS1sb2FkZXItZGl2XCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyOHB4J1wiIFtoZWlnaHRdPVwiJzI4cHgnXCJcbiAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNDhweCdcIiBbaGVpZ2h0XT1cIic4cHgnXCIgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzI4cHgnXCIgW2hlaWdodF09XCInMjhweCdcIlxuICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIiBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMiBrcGktbG9hZGVyLWRpdlwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzQ4cHgnXCIgW2hlaWdodF09XCInOHB4J1wiIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0yIGtwaS1sb2FkZXItZGl2XCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyOHB4J1wiIFtoZWlnaHRdPVwiJzI4cHgnXCJcbiAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNDBweCdcIiBbaGVpZ2h0XT1cIic4cHgnXCIgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIiBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtdG9jLWtwaS12YWx1ZXMgW2NvbnRlbnRdPVwiY29udGVudFwiIFt0b2NTdHJ1Y3R1cmVdPVwidG9jU3RydWN0dXJlXCIgW3Nob3dJbnN0cnVjdG9yTGVkTXNnXT1cInNob3dJbnN0cnVjdG9yTGVkTXNnXCIgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIj48L3dzLXdpZGdldC10b2Mta3BpLXZhbHVlcz5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTggcC01XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiICpuZ0Zvcj1cImxldCBpIG9mIFsxLCAyXVwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzcycHgnXCIgW2hlaWdodF09XCInMjBweCdcIiBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzM2cHgnXCIgW2hlaWdodF09XCInMzZweCdcIiBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkLWZ1bGwnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyNHB4J1wiIFtoZWlnaHRdPVwiJzIwcHgnXCIgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyNHB4J1wiIFtoZWlnaHRdPVwiJzEycHgnXCIgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiICpuZ0lmPVwiaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50UmVhZERhdGE/LmNyZWF0b3JEZXRhaWxzKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1ib2xkXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuYXV0aG9ycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQgaXRlbXMtY2VudGVyXCIgKm5nRm9yPVwibGV0IGF1dGhvciBvZiBoYW5kbGVQYXJzZUpzb25EYXRhKGNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckRldGFpbHMpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBbcmFuZG9tQ29sb3JdPVwidHJ1ZVwiIFtkYXRhbGVuXT1cIjFcIiBbc2l6ZV09XCIncm91bmQtbSdcIiBbcGhvdG9VcmxdPVwiYXV0aG9yPy5waG90byB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImF1dGhvcj8ubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtYXZhdGFyLXBob3RvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShhdXRob3I/Lm5hbWUsICduYW1lJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGxlYWRpbmctM1wiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmF1dGhvcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTNcIiAqbmdJZj1cImhhbmRsZVBhcnNlSnNvbkRhdGEoY29udGVudD8uY3JlYXRvckNvbnRhY3RzKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1ib2xkXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY3VyYXRvcnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00XCIgKm5nRm9yPVwibGV0IGNyZWF0b3Igb2YgaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50Py5jcmVhdG9yQ29udGFjdHMpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBbcmFuZG9tQ29sb3JdPVwidHJ1ZVwiIFtkYXRhbGVuXT1cIjFcIiBbc2l6ZV09XCIncm91bmQtbSdcIiBbcGhvdG9VcmxdPVwiYXV0aG9yPy5waG90byB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImNyZWF0b3I/Lm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWF2YXRhci1waG90bz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY3JlYXRvcj8ubmFtZSwgJ25hbWUnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbGVhZGluZy0zXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY3VyYXRvcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiICpuZ0lmPVwiY29udGVudD8uc291cmNlICAmJiAoY29udGVudENyZWF0b3JEYXRhICYmIGNvbnRlbnRDcmVhdG9yRGF0YT8ubGVuZ3RoKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1iYXNlIGZvbnQtYm9sZFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLnByb3ZpZGVyJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBpdGVtcy1jZW50ZXJcIiAqbmdGb3I9XCJsZXQgY3JlYXRvciBvZiBjb250ZW50Q3JlYXRvckRhdGFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBwcm92aWRlci1sb2dvLWRpdlwiPlxuICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImNvbnRlbnQ/LmNyZWF0b3JMb2dvXCIgW3NyY109XCJjb250ZW50Py5jcmVhdG9yTG9nb1wiIGFsdD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLnByb3ZpZGVyJyB8IHRyYW5zbGF0ZSB9fVwiIC8+XG4gICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiIWNvbnRlbnQ/LmNyZWF0b3JMb2dvXCIgY2xhc3M9XCJtYXQtaWNvblwiIHNyYz1cIi9hc3NldHMvaW5zdGFuY2VzL2VhZ2xlL2FwcF9sb2dvcy9LYXJtYXlvZ2lCaGFyYXRfTG9nby5zdmdcIiBhbHQ9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX1cIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHdvcmQtYnJlYWsgY3Vyc29yLXBvaW50ZXJcIiAqbmdJZj1cImNvbnRlbnQ/LmNyZWF0ZWRGb3I/Lmxlbmd0aFwiIChjbGljayk9XCJyYWlzZVRlbGVtZXRlcnlGb3JQcm92aWRlcihjb250ZW50Py5zb3VyY2UsIGNvbnRlbnQ/LmNyZWF0ZWRGb3JbMF0pXCJcbiAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnL2FwcC9sZWFybi9icm93c2UtYnkvcHJvdmlkZXInLCBjb250ZW50Py5zb3VyY2UsIGNvbnRlbnQ/LmNyZWF0ZWRGb3JbMF0sICdtaWNyby1zaXRlcyddXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShjb250ZW50Py5zb3VyY2UsICdzb3VyY2UnKSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHdvcmQtYnJlYWtcIiAqbmdJZj1cIiFjb250ZW50Py5jcmVhdGVkRm9yPy5sZW5ndGhcIj57eyBoYW5kbGVDYXBpdGFsaXplKGNvbnRlbnQ/LnNvdXJjZSwgJ3NvdXJjZScpIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwibGVhcm5BZHZpc29yeURhdGEgJiYgbGVhcm5BZHZpc29yeURhdGE/Lmxlbmd0aFwiPlxuICAgICAgPHdzLXdpZGdldC10aXBzLWZvci1sZWFybmVyLWNhcmQgW2xlYXJuQWR2aXNvcnlEYXRhXT1cImxlYXJuQWR2aXNvcnlEYXRhXCI+PC93cy13aWRnZXQtdGlwcy1mb3ItbGVhcm5lci1jYXJkPlxuICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgIFxuXG4gIDwvZGl2PlxuPC9kaXY+XG5cbiAgPCEtLSBNb2JpbGUgZW5yb2xsbWVudCBidXR0b24gY29udGFpbmVyIC0tPlxuICA8ZGl2IGNsYXNzPVwibW9iaWxlLWVucm9sbC1kaXZcIiBbbmdDbGFzc109XCJ7J2JnLXdoaXRlJzogY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNIH1cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudCAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwibW9iaWxlMTIwMCAmJiAhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3QnRuXCI+XG4gICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICBbdXNlckVucm9sbG1lbnRMaXN0XT1cInVzZXJFbnJvbGxtZW50TGlzdFwiICh3aXRoZHJhd09yRW5yb2xsKT1cIndpdGhkcmF3T3JFbnJvbGwoJGV2ZW50KVwiIFthbmFseXRpY3NdPVwiYW5hbHl0aWNzXCJcbiAgICAgICAgICBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbY29udGVudFJlYWREYXRhXT1cImNvbnRlbnRSZWFkRGF0YVwiPlxuICAgICAgICA8L3dzLWFwcC10b2MtYmFubmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBSZXVzZSBlbnJvbGxtZW50IGZ1bmN0aW9uYWxpdHkgdGVtcGxhdGUgZm9yIG1vYmlsZSAtLT5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImVucm9sbEZ1bmN0aW9uYWxpdHlcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPHdzLWFwcC1zaGFyZS10b2MgKm5nSWY9XCJlbmFibGVTaGFyZVwiIFtyb290T3JnSWRdPVwicm9vdE9yZ0lkXCIgW2NvbnRlbnRdPVwiY29udGVudFwiIChyZXNldEVuYWJsZVNoYXJlKT1cInJlc2V0RW5hYmxlU2hhcmUoJGV2ZW50KVwiPjwvd3MtYXBwLXNoYXJlLXRvYz5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIFRlbXBsYXRlIGZvciB3aGVuIG5vIGRhdGEgaXMgZm91bmQgLS0+XG48bmctdGVtcGxhdGUgI25vRGF0YUZvdW5kPlxuICA8ZGl2IGNsYXNzPVwiZXJyb3Itbm90LWZvdW5kIGZsZXggZmxleC13cmFwcGVkIG1hcmdpbi1sZWZ0LW0gbWFyZ2luLXRvcC14bCBtYXJnaW4tcmlnaHQtbSBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZXJyb3ItbG9nb1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImVycm9yLW1lc3NhZ2Ugd3MtbWF0LXByaW1hcnktdGV4dCBmb250LXdlaWdodC1ib2xkXCIgPlxuICAgICAgICBUaGUgcGFnZSB5b3UgcmVxdWVzdGVkIGNhbm5vdCBiZSBmb3VuZFxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBBdXRoZW50aWNhdGlvbiB2aWV3IHRlbXBsYXRlcyAtLT5cbjxuZy10ZW1wbGF0ZSAjYXV0aFZpZXc+e3snYXBwdG9jaG9tZS52aWV3JyB8IHRyYW5zbGF0ZX19PC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhdXRoVmlld0J0biBpMThuPlxuICA8YSAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiIFtyb3V0ZXJMaW5rXT1cIihyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyByZXN1bWVEYXRhTGluaz8udXJsIDogZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiIFtxdWVyeVBhcmFtc109XCIocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCJcbiAgICBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlclwiPlxuICAgIHt7J2FwcHRvY2hvbWUudmlldycgfCB0cmFuc2xhdGV9fVxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2F1dGhWaWV3Rm9ySW52aXRlT25seUFzc2Vzc21lbnQ+XG4gIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJmb3JQcmV2aWV3ICYmIGNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5ID09PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj4gICAgICAgIFxuICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiPiAgICAgICAgICBcbiAgICAgICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0JyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
2230
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1ob21lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9jb21wb25lbnRzL2FwcC10b2MtaG9tZS9hcHAtdG9jLWhvbWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1ob21lL2FwcC10b2MtaG9tZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFBYyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FDdEUsTUFBTSxlQUFlLENBQUE7QUFFdEIsT0FBTyxFQUF1QyxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNwRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFHL0QsT0FBTyxFQUE0QixPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDeEQsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNqRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUE7QUFDekIsMkJBQTJCO0FBQzNCLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQTtBQUV0QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUE7QUFDM0IsT0FBTyxjQUFjLE1BQU0sNkJBQTZCLENBQUE7QUFFeEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFBO0FBRWhFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFBO0FBRXhFLE9BQU8sRUFJZ0MsUUFBUSxHQUM5QyxNQUFNLHNCQUFzQixDQUFBO0FBRzdCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0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SUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxLQUFLLEdBQUc7NEJBQ25FLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDMUM7NEJBQ0EsSUFBSSxDQUFDLDZCQUE2QixHQUFHLElBQUksQ0FBQTt5QkFDMUM7cUJBQ0Y7aUJBQ0Y7WUFDSCxDQUFDLENBQUMsQ0FBQTtTQUNIO0lBRUgsQ0FBQztJQUdELGdCQUFnQixDQUFDLElBQVM7UUFDeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUM3QixPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hDLHNDQUFzQztJQUN4QyxDQUFDOytHQXI0RVUsbUJBQW1CLHVnQ0EyT3BCLGFBQWE7bUdBM09aLG1CQUFtQix1a0JDL0VoQywycmtEQWl4QkE7OzRGRGxzQmEsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLHFCQUFxQixpQkFJaEIsaUJBQWlCLENBQUMsSUFBSTs7MEJBOE9sQyxNQUFNOzJCQUFDLGFBQWE7NENBck5kLFVBQVU7c0JBQWxCLEtBQUs7Z0JBd0NxQyxXQUFXO3NCQUFyRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBeURaLFNBQVM7c0JBQXJDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNtQixVQUFVO3NCQUF2RCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ2hCLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZTtnQkF5RDFCLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkLFxuICBIb3N0TGlzdGVuZXIsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgVmlld0VuY2Fwc3VsYXRpb24sIElucHV0LCBJbmplY3QsIE9wdGlvbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgU2FmZUh0bWwsIERvbVNhbml0aXplciwgU2FmZVN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlcidcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBFdmVudCwgRGF0YSwgUm91dGVyLCBOYXZpZ2F0aW9uRW5kIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJ1xuaW1wb3J0IHsgc2hhcmUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5kYXlqcy5leHRlbmQoaXNTYW1lT3JCZWZvcmUpXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCdcbmltcG9ydCBpc1NhbWVPckJlZm9yZSBmcm9tICdkYXlqcy9wbHVnaW4vaXNTYW1lT3JCZWZvcmUnXG5cbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5tb2RlbCdcbmltcG9ydCB7IFdpZGdldENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50LnNlcnZpY2UnXG5pbXBvcnQgeyB2aWV3ZXJSb3V0ZUdlbmVyYXRvciB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy92aWV3ZXItcm91dGUtdXRpbCdcbmltcG9ydCB7IE5zV2lkZ2V0UmVzb2x2ZXIgfSBmcm9tICdAc3VuYmlyZC1jYi9yZXNvbHZlci12MidcbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25zU2VydmljZSwgRGF0YVRyYW5zZmVyU2VydmljZSwgRG9tYWluQ29uZlNlcnZpY2UsIEV2ZW50U2VydmljZSxcbiAgTG9nZ2VyU2VydmljZSwgTXVsdGlsaW5ndWFsVHJhbnNsYXRpb25zU2VydmljZSxcbiAgTnNQYWdlLCBURmV0Y2hTdGF0dXMsIFRlbGVtZXRyeVNlcnZpY2UsXG4gIFV0aWxpdHlTZXJ2aWNlLCBXaWRnZXRFbnJvbGxTZXJ2aWNlLCBXc0V2ZW50cyxcbn0gZnJvbSAnQHN1bmJpcmQtY2IvdXRpbHMtdjInXG5cbmltcG9ydCB7IFdpZGdldENvbnRlbnRMaWJTZXJ2aWNlLCBXaWRnZXRVc2VyU2VydmljZUxpYiB9IGZyb20gJ0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uJ1xuaW1wb3J0IHsgTnNBcHBUb2MgfSBmcm9tICcuLi8uLi9tb2RlbHMvYXBwLXRvYy5tb2RlbCdcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHAtdG9jLnNlcnZpY2UnXG5pbXBvcnQgeyBBY2Nlc3NDb250cm9sU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2FjY2Vzcy1jb250cm9sLnNlcnZpY2UnXG5pbXBvcnQgeyBNb2JpbGVBcHBzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vYmlsZS1hcHBzLnNlcnZpY2UnXG5pbXBvcnQgeyBIYW5kbGVDbGFpbVNlcnZpY2UgfSBmcm9tICcuLi8uLi9fY29sbGVjdGlvbi9fY29tbW9uL2NvbnRlbnQtdG9jL2NvbnRlbnQtc2VydmljZXMvaGFuZGxlLWNsYWltLnNlcnZpY2UnXG5pbXBvcnQgeyBBY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWN0aW9uLnNlcnZpY2UnXG5pbXBvcnQgeyBSYXRpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3JhdGluZy5zZXJ2aWNlJ1xuaW1wb3J0IHsgVmlld2VyVXRpbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92aWV3ZXItdXRpbC5zZXJ2aWNlJ1xuaW1wb3J0IHsgTG9hZENoZWNrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xvYWQtY2hlY2suc2VydmljZSdcbmltcG9ydCB7IFJlc2V0UmF0aW5nc1NlcnZpY2UgfSBmcm9tICcuLy4uLy4uL3NlcnZpY2VzL3Jlc2V0LXJhdGluZ3Muc2VydmljZSdcblxuaW1wb3J0IHsgQXBwVG9jRGlhbG9nSW50cm9WaWRlb0NvbXBvbmVudCB9IGZyb20gJy4uL2FwcC10b2MtZGlhbG9nLWludHJvLXZpZGVvL2FwcC10b2MtZGlhbG9nLWludHJvLXZpZGVvLmNvbXBvbmVudCdcbmltcG9ydCB7IENvbnRlbnRSYXRpbmdWMkRpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC1yYXRpbmctdjItZGlhbG9nL2NvbnRlbnQtcmF0aW5nLXYyLWRpYWxvZy5jb21wb25lbnQnXG5pbXBvcnQgeyBUaW1lclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90aW1lci5zZXJ2aWNlJ1xuaW1wb3J0IHsgTWF0TGVnYWN5RGlhbG9nIGFzIE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1kaWFsb2cnXG5pbXBvcnQgeyBNYXRMZWdhY3lTbmFja0JhciBhcyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1zbmFjay1iYXInXG5pbXBvcnQgeyBNYXRTbmFja0JhciBhcyBNYXRTbmFja2Jhck5ldyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcidcbmltcG9ydCB7IE5ldENvcmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbmV0Y29yZS5zZXJ2aWNlJ1xuaW1wb3J0IHsgTnNDYXJkQ29udGVudCB9IGZyb20gJy4uLy4uL21vZGVscy9jYXJkLWNvbnRlbnQubW9kZWwnXG5pbXBvcnQgeyBOc1BsYXlsaXN0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3BsYXlsaXN0Lm1vZGVsJ1xuaW1wb3J0IHsgTnNHb2FsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2dvYWwubW9kZWwnXG5pbXBvcnQgeyBOb25SZWxldmVudEZlZWRiYWNrRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vbm9uLXJlbGV2ZW50LWZlZWRiYWNrLWRpYWxvZy9ub24tcmVsZXZlbnQtZmVlZGJhY2stZGlhbG9nLmNvbXBvbmVudCdcblxuZXhwb3J0IGVudW0gRXJyb3JUeXBlIHtcbiAgaW50ZXJuYWxTZXJ2ZXIgPSAnaW50ZXJuYWxTZXJ2ZXInLFxuICBzZXJ2aWNlVW5hdmFpbGFibGUgPSAnc2VydmljZVVuYXZhaWxhYmxlJyxcbiAgc29tZXRoaW5nV3JvbmcgPSAnc29tZXRoaW5nV3JvbmcnLFxufVxuXG5jb25zdCBmbGF0dGVuSXRlbXMgPSAoaXRlbXM6IGFueVtdLCBrZXk6IHN0cmluZyB8IG51bWJlcikgPT4ge1xuICByZXR1cm4gaXRlbXMucmVkdWNlKChmbGF0dGVuZWRJdGVtcywgaXRlbSkgPT4ge1xuICAgIGZsYXR0ZW5lZEl0ZW1zLnB1c2goaXRlbSlcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtW2tleV0pKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgIGZsYXR0ZW5lZEl0ZW1zID0gZmxhdHRlbmVkSXRlbXMuY29uY2F0KGZsYXR0ZW5JdGVtcyhpdGVtW2tleV0sIGtleSkpXG4gICAgfVxuICAgIHJldHVybiBmbGF0dGVuZWRJdGVtc1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICB9LCBbXSlcbn1cbmNvbnN0IFNOQUNLQkFSX0RVUkFUSU9OID0gMzAwMFxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd3MtYXBwLWFwcC10b2MtaG9tZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHAtdG9jLWhvbWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9hcHAtdG9jLWhvbWUuY29tcG9uZW50LnNjc3MnXSxcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB1c2UtY29tcG9uZW50LXZpZXctZW5jYXBzdWxhdGlvblxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcblxuZXhwb3J0IGNsYXNzIEFwcFRvY0hvbWVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIHNob3cgPSBmYWxzZVxuICBjaGFuZ2VUYWIgPSBmYWxzZVxuICBza2VsZXRvbkxvYWRlciA9IHRydWVcbiAgYmFubmVyczogTnNBcHBUb2MuSVRvY0Jhbm5lciB8IG51bGwgPSBudWxsXG4gIHNob3dNb3JlR2xhbmNlID0gZmFsc2VcbiAgY29udGVudDogTnNDb250ZW50LklDb250ZW50IHwgbnVsbCA9IG51bGxcbiAgY29udGVudFJlYWREYXRhOiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICBlcnJvckNvZGU6IE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZSB8IG51bGwgPSBudWxsXG4gIHJlc3VtZURhdGE6IGFueSA9IG51bGxcbiAgbnNDYXJkQ29udGVudERhdGE6IGFueSA9IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0XG4gIGJhdGNoRGF0YTogTnNDb250ZW50LklCYXRjaExpc3RSZXNwb25zZSB8IG51bGwgPSBudWxsXG4gIGN1cnJlbnRDb3Vyc2VCYXRjaElkOiBzdHJpbmcgfCBudWxsID0gbnVsbFxuICB1c2VyRW5yb2xsbWVudExpc3QhOiBOc0NvbnRlbnQuSUNvdXJzZVtdXG4gIHJvdXRlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBwYWdlTmF2YmFyOiBQYXJ0aWFsPE5zUGFnZS5JTmF2QmFja2dyb3VuZD4gPSB0aGlzLmNvbmZpZ1N2Yy5wYWdlTmF2QmFyXG4gIGlzQ29ob3J0c1Jlc3RyaWN0ZWQgPSBmYWxzZVxuICBzdGlja3kgPSBmYWxzZVxuICBpc0luSWZyYW1lID0gZmFsc2VcbiAgY2JQbGFuRW5kRGF0ZTogYW55XG4gIGNiUGxhbkR1cmF0aW9uOiBhbnlcbiAgZW5yb2xsZWRDb3Vyc2VEYXRhOiBhbnlcbiAgQElucHV0KCkgZm9yUHJldmlldzogYW55ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9wdWJsaWMvJykgfHwgd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9hdXRob3IvJylcbiAgLy8gZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvYXV0aG9yLycpXG4gIGFuYWx5dGljcyA9IHRoaXMucm91dGUuc25hcHNob3QuZGF0YS5wYWdlRGF0YS5kYXRhPy5hbmFseXRpY3NcbiAgZXJyb3JXaWRnZXREYXRhOiBOc1dpZGdldFJlc29sdmVyLklSZW5kZXJDb25maWdXaXRoVHlwZWREYXRhPGFueT4gPSB7XG4gICAgd2lkZ2V0VHlwZTogJ2Vycm9yUmVzb2x2ZXInLFxuICAgIHdpZGdldFN1YlR5cGU6ICdlcnJvclJlc29sdmVyJyxcbiAgICB3aWRnZXREYXRhOiB7XG4gICAgICBlcnJvclR5cGU6ICdpbnRlcm5hbFNlcnZlcicsXG4gICAgfSxcbiAgfVxuICBpc0F1dGhvciA9IGZhbHNlXG4gIGF1dGhvckJ0bldpZGdldDogTnNQYWdlLklOYXZMaW5rID0ge1xuICAgIGFjdGlvbkJ0bklkOiAnZmVhdHVyZV9hdXRob3JpbmcnLFxuICAgIGNvbmZpZzoge1xuICAgICAgdHlwZTogJ21hdC1idXR0b24nLFxuICAgIH0sXG4gIH1cbiAgdG9jQ29uZmlnOiBhbnkgPSBudWxsXG4gIHByaW1hcnlDYXRlZ29yeSA9IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5XG4gIGNvdXJzZUNhdGVnb3J5ID0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeVxuICBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzID0gTnNDb250ZW50LldGQmxlbmRlZFByb2dyYW1TdGF0dXNcbiAgYXNrQXV0aG9yRW5hYmxlZCA9IHRydWVcbiAgdHJhaW5pbmdMSHViRW5hYmxlZCA9IGZhbHNlXG4gIHRyYWluaW5nTEh1YkNvdW50JD86IE9ic2VydmFibGU8bnVtYmVyPlxuICBib2R5OiBTYWZlSHRtbCB8IG51bGwgPSBudWxsXG4gIHZpZXdNb3JlUmVsYXRlZFRvcGljcyA9IGZhbHNlXG4gIGhhc1RvY1N0cnVjdHVyZSA9IGZhbHNlXG4gIHRvY1N0cnVjdHVyZTogTnNBcHBUb2MuSVRvY1N0cnVjdHVyZSB8IG51bGwgPSBudWxsXG4gIGNvbnRlbnRQYXJlbnRzOiB7IFtrZXk6IHN0cmluZ106IE5zQXBwVG9jLklDb250ZW50UGFyZW50UmVzcG9uc2VbXSB9ID0ge31cbiAgb2JqS2V5cyA9IE9iamVjdC5rZXlzXG4gIGZyYWdtZW50ITogc3RyaW5nXG4gIGFjdGl2ZUZyYWdtZW50ID0gdGhpcy5yb3V0ZS5mcmFnbWVudC5waXBlKHNoYXJlKCkpXG4gIGN1cnJlbnRGcmFnbWVudCA9ICdvdmVydmlldydcbiAgc2hvd1Njcm9sbCE6IGJvb2xlYW5cbiAgc2hvd1Njcm9sbEhlaWdodCA9IDMwMFxuICBoaWRlU2Nyb2xsSGVpZ2h0ID0gMTBcbiAgZWxlbWVudFBvc2l0aW9uOiBhbnlcbiAgYmF0Y2hTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIGJhdGNoRGF0YVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgcmVzdW1lRGF0YVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgQFZpZXdDaGlsZCgnc3RpY2t5TWVudScsIHsgc3RhdGljOiB0cnVlIH0pIG1lbnVFbGVtZW50ITogRWxlbWVudFJlZlxuICBiYXRjaENvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICBjb250ZW50UHJvZ3Jlc3MgPSAwXG4gIGJhbm5lclVybDogU2FmZVN0eWxlIHwgbnVsbCA9IG51bGxcbiAgcm91dGVQYXRoID0gJ292ZXJ2aWV3J1xuICB2YWxpZFBhdGhzID0gbmV3IFNldChbJ292ZXJ2aWV3JywgJ2NvbnRlbnRzJywgJ2FuYWx5dGljcyddKVxuICByb3V0ZXJQYXJhbVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgaW5pdGlhbHJvdXRlRGF0YTogYW55XG4gIGFjdGlvbkJ0blN0YXR1cyA9ICd3YWl0J1xuICBpc1JlZ2lzdHJhdGlvblN1cHBvcnRlZCA9IGZhbHNlXG4gIHNob3dJbnRyYW5ldE1lc3NhZ2UgPSBmYWxzZVxuICBmaXJzdFJlc291cmNlTGluazogeyB1cmw6IHN0cmluZzsgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfSB8IG51bGwgPSBudWxsXG4gIHJlc3VtZURhdGFMaW5rOiB7IHVybDogc3RyaW5nOyBxdWVyeVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB9IHwgbnVsbCA9IG51bGxcbiAgc2hvd1Rha2VBc3Nlc3NtZW50OiBOc0FwcFRvYy5JUG9zdEFzc2Vzc21lbnQgfCBudWxsID0gbnVsbFxuICBjaGVja1JlZ2lzdHJhdGlvblNvdXJjZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gICAgJ1NraWxsU29mdCBEaWdpdGFsaXphdGlvbicsXG4gICAgJ1NraWxsU29mdCBMZWFkZXJzaGlwJyxcbiAgICAnUGx1cmFsc2lnaHQnLFxuICBdKVxuICBidG5QbGF5bGlzdENvbmZpZzogTnNQbGF5bGlzdC5JQnRuUGxheWxpc3QgfCBudWxsID0gbnVsbFxuICBidG5Hb2Fsc0NvbmZpZzogTnNHb2FsLklCdG5Hb2FsIHwgbnVsbCA9IG51bGxcbiAgZXh0ZXJuYWxDb250ZW50RmV0Y2hTdGF0dXM6IFRGZXRjaFN0YXR1cyA9ICdkb25lJ1xuICByZWdpc3RlckZvckV4dGVybmFsID0gZmFsc2VcbiAgaXNHb2Fsc0VuYWJsZWQgPSBmYWxzZVxuICBjb250ZXh0SWQ/OiBzdHJpbmdcbiAgY29udGV4dFBhdGg/OiBzdHJpbmdcbiAgZGVmYXVsdFNMb2dvID0gJydcbiAgZGlzYWJsZUVucm9sbEJ0biA9IGZhbHNlXG4gIGlzQXNzZXNzVmlzaWJsZSA9IGZhbHNlXG4gIGlzUHJhY3RpY2VWaXNpYmxlID0gZmFsc2VcbiAgY2VydGlmaWNhdGVPcGVuID0gZmFsc2VcbiAgYnJlYWRjcnVtYnM6IGFueVxuICBoaXN0b3J5RGF0YTogYW55XG4gIGNvdXJzZUNvbXBsZXRlU3RhdGUgPSAyXG4gIHVzZXJJZDogYW55XG4gIHVzZXJSYXRpbmc6IGFueVxuICBlbnZpcm9ubWVudCE6IGFueVxuICBkYWtzaHRhTmFtZSA9ICcnXG4gIGNzY21zVXJsID0gJydcbiAgc2hvd0J0biA9IGZhbHNlXG4gIGNoYW5uZWxJZDogYW55XG4gIHNlbGVjdGVkQmF0Y2hEYXRhOiBhbnlcbiAgc2VsZWN0ZWRCYXRjaFN1YnNjcmlwdGlvbjogYW55XG4gIHNlcnZlckRhdGVTdWJzY3JpcHRpb246IGFueVxuICBzZXJ2ZXJEYXRlOiBhbnlcbiAga3BhcnJheTogYW55ID0gW11cbiAgZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gIGlzQWNicENvdXJzZSA9IGZhbHNlXG4gIGlzQWNicENsYWltID0gZmFsc2VcbiAgY291cnNlSUQ6IGFueVxuICBpc0NsYWltZWQgPSBmYWxzZVxuICBtb250aGx5Q2FwRXhjZWVkID0gZmFsc2VcbiAgaXNDb21wbGV0ZWRUaGlzTW9udGggPSBmYWxzZVxuICBzdGFydERhdGU6IGFueVxuICBlbmREYXRlOiBhbnlcbiAgc3RhcnREYXRlRGlmZmVyZW5jZTogYW55XG4gIGVuZERhdGVEaWZmZXJlbmNlOiBhbnlcbiAgQFZpZXdDaGlsZCgncmlnaHRDb250YWluZXInKSByY0VsZW1lbnQhOiBFbGVtZW50UmVmXG4gIEBWaWV3Q2hpbGQoJ2Jhbm5lckRldGFpbHMnLCB7IHN0YXRpYzogdHJ1ZSB9KSBiYW5uZXJFbGVtITogRWxlbWVudFJlZlxuICBAVmlld0NoaWxkKCdjb250ZW50U291cmNlJykgY29udGVudFNvdXJjZSE6IEVsZW1lbnRSZWZcbiAgc291cmNlRWxsaXBzaXMgPSBmYWxzZVxuICBzY3JvbGxMaW1pdCA9IDBcbiAgcmNFbGVtID0ge1xuICAgIG9mZlNldFRvcDogMCxcbiAgICBCb3R0b21Qb3M6IDAsXG4gIH1cbiAgc2Nyb2xsZWQgPSBmYWxzZVxuICBwYXRoU2V0ID0gbmV3IFNldCgpXG4gIGNhblNoYXJlID0gZmFsc2VcbiAgZW5hYmxlU2hhcmUgPSBmYWxzZVxuICByb290T3JnSWQ6IGFueVxuICBjZXJ0SWQ6IGFueVxuICBtb2JpbGUxMjAwOiBhbnlcbiAgYXNzZXNzbWVudFN0cmlwOiBhbnlcbiAgbGVhcm5BZHZpc29yeURhdGE6IGFueVxuICBjb250ZW50Q3JlYXRvckRhdGE6IGFueSA9IFtdXG4gIC8vIHJhbmRvbWxlYXJuQWR2aXNvcnlPYmo6IGFueVxuICAvLyBsZWFybkFkdmlzb3J5RGF0YUxlbmd0aDogYW55XG5cbiAgcHJpdmF0ZSBkZXN0cm95U3ViamVjdCQgPSBuZXcgU3ViamVjdDxhbnk+KClcbiAgdGltZXJVbnN1YnNjcmliZTogYW55XG4gIHRpbWVyOiBhbnlcbiAgaXNSZWxldmVudEJ0bkhvdmVyZWQgPSBmYWxzZVxuICBTQUtTSEFNQUlfSUNPTl9OT1JNQUwgPSAnL2Fzc2V0cy9pbWFnZXMvc2Frc2hhbUFJL2FpLWljb24uc3ZnJ1xuICBTQUtTSEFNQUlfSUNPTl9MT0FERVIgPSAnL2Fzc2V0cy9pbWFnZXMvc2Frc2hhbUFJL3Nha3NoYW1fYWlfbG9hZGVyLmdpZidcbiAgcmVjb21tZW5kZWRDb3Vyc2VzSWQgPSAnJ1xuICBmZWVkYmFja0dpdmVuOiBhbnlcbiAgcHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMgPSBmYWxzZVxuICBmcm9tQUlUdXRvciA9IGZhbHNlXG4gIHNlbGVjdGVkTGFuZ3VhZ2U6IGFueTsgLy8gU2V0IHRoaXMgdG8gdGhlIGRlZmF1bHQvaW5pdGlhbCBsYW5ndWFnZVxuICBsYW5ndWFnZUxpc3QgPSBbXG4gICAgeyBuYW1lOiBcIkVuZ2xpc2hcIiwgdmFsdWU6IFwiRW5nbGlzaFwiIH0sXG4gICAgeyBuYW1lOiBcIuCyleCyqOCzjeCyqOCyoSAoS2FubmFkYSlcIiwgdmFsdWU6IFwiS2FubmFkYVwiIH0sXG4gICAgeyBuYW1lOiBcIuCwpOCxhuCwsuCxgeCwl+CxgSAoVGVsdWd1KVwiLCB2YWx1ZTogXCJUZWx1Z3VcIiB9LFxuICAgIHsgbmFtZTogXCLgrqTgrq7grr/grrTgr40gKFRhbWlsKVwiLCB2YWx1ZTogXCJUYW1pbFwiIH0sXG4gICAgeyBuYW1lOiBcIuC0ruC0suC0r+C0vuC0s+C0giAoTWFsYXlhbGFtKVwiLCB2YWx1ZTogXCJNYWxheWFsYW1cIiB9LFxuICAgIHsgbmFtZTogXCLgpLngpL/gpILgpKbgpYAgKEhpbmRpKVwiLCB2YWx1ZTogXCJIaW5kaVwiIH0sXG4gICAgeyBuYW1lOiBcIuCmheCmuOCmruCngOCmr+CmvOCmviAoQXNzYW1lc2UpXCIsIHZhbHVlOiBcIkFzc2FtZXNlXCIgfSxcbiAgICB7IG5hbWU6IFwi4Kas4Ka+4KaC4Kay4Ka+IChCZW5nYWxpKVwiLCB2YWx1ZTogXCJCZW5nYWxpXCIgfSxcbiAgICB7IG5hbWU6IFwi4KqX4KuB4Kqc4Kqw4Kq+4Kqk4KuAIChHdWphcmF0aSlcIiwgdmFsdWU6IFwiR3VqYXJhdGlcIiB9LFxuICAgIHsgbmFtZTogXCLgpK7gpLDgpL7gpKDgpYAgKE1hcmF0aGkpXCIsIHZhbHVlOiBcIk1hcmF0aGlcIiB9LFxuICAgIHsgbmFtZTogXCLgrJPgrKHgrL/grIYgKE9kaWEpXCIsIHZhbHVlOiBcIk9kaWFcIiB9LFxuICAgIHsgbmFtZTogXCLgqKrgqbDgqJzgqL7gqKzgqYAgKFB1bmphYmkpXCIsIHZhbHVlOiBcIlB1bmphYmlcIiB9LFxuICAgIHsgbmFtZTogXCLgpJXgpYvgpILgpJXgpKPgpYAgKEtvbmthbmkpXCIsIHZhbHVlOiBcIktvbmthbmlcIiB9LFxuICAgIHsgbmFtZTogXCLgpKzgpKHgpLzgpYsgKEJvZG8pXCIsIHZhbHVlOiBcIkJvZG9cIiB9LFxuICAgIHsgbmFtZTogXCLgpKHgpYvgpJfgpLDgpYAgKERvZ3JpKVwiLCB2YWx1ZTogXCJEb2dyaVwiIH0sXG4gICAgeyBuYW1lOiBcItmD2LTZhdmK2LHZiiAvIOCkleCktuCljeCkruClgOCksOClgCAoS2FzaG1pcmkpXCIsIHZhbHVlOiBcIkthc2htaXJpXCIgfSxcbiAgICB7IG5hbWU6IFwi4KSu4KWI4KSl4KS/4KSy4KWAIChNYWl0aGlsaSlcIiwgdmFsdWU6IFwiTWFpdGhpbGlcIiB9LFxuICAgIHsgbmFtZTogXCLgpq7gp4jgpqTgp4jgprLgp4vgpqjgp40gIChNYW5pcHVyaSApXCIsIHZhbHVlOiBcIk1hbmlwdXJpXCIgfSxcbiAgICB7IG5hbWU6IFwi4KSo4KWH4KSq4KS+4KSy4KWAIChOZXBhbGkpXCIsIHZhbHVlOiBcIk5lcGFsaVwiIH0sXG4gICAgeyBuYW1lOiBcIuCkuOCkguCkuOCljeCkleClg+CkpOCkruCljSAoU2Fuc2tyaXQpXCIsIHZhbHVlOiBcIlNhbnNrcml0XCIgfSxcbiAgICB7IG5hbWU6IFwi4bGl4bGf4bGx4bGb4bGf4bGy4bGkIChTYW50YWxpKVwiLCB2YWx1ZTogXCJTYW50YWxpXCIgfSxcbiAgICB7IG5hbWU6IFwi2LPZhtqM2YogLyDgpLjgpL/gpILgpKfgpYAgKFNpbmRoaSlcIiwgdmFsdWU6IFwiU2luZGhpXCIgfSxcbiAgICB7IG5hbWU6IFwi2KfZj9ix2K/Zj9mIIChVcmR1KVwiLCB2YWx1ZTogXCJVcmR1XCIgfVxuICBdXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpzY3JvbGwnLCBbJyRldmVudCddKVxuICBoYW5kbGVTY3JvbGwoKSB7XG4gICAgY29uc3Qgd2luZG93U2Nyb2xsID0gd2luZG93LnBhZ2VZT2Zmc2V0XG4gICAgaWYgKHdpbmRvd1Njcm9sbCA+PSB0aGlzLmVsZW1lbnRQb3NpdGlvbiAtIDEwMCkge1xuICAgICAgdGhpcy5zdGlja3kgPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RpY2t5ID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zY3JvbGxMaW1pdCkge1xuICAgICAgaWYgKCh3aW5kb3cuc2Nyb2xsWSArIHRoaXMucmNFbGVtLkJvdHRvbVBvcykgPj0gdGhpcy5zY3JvbGxMaW1pdCkge1xuICAgICAgICB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ3N0aWNreSdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnZml4ZWQnXG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMjM2Li4uIChPZmZzZXRUb3Agb2YgcmlnaHQgY29udGFpbmVyICsgMTA0KVxuICAgIGlmICh3aW5kb3cuc2Nyb2xsWSA+ICh0aGlzLnJjRWxlbS5vZmZTZXRUb3AgKyAxMDQpKSB7XG4gICAgICB0aGlzLnNjcm9sbGVkID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjcm9sbGVkID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgY29udGVudFN2YzogV2lkZ2V0Q29udGVudFNlcnZpY2UsXG4gICAgcHVibGljIHRvY1N2YzogQXBwVG9jU2VydmljZSxcbiAgICBwcml2YXRlIGxvZ2dlclN2YzogTG9nZ2VyU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ1N2YzogQ29uZmlndXJhdGlvbnNTZXJ2aWNlLFxuICAgIHByaXZhdGUgZG9tU2FuaXRpemVyOiBEb21TYW5pdGl6ZXIsXG4gICAgcHJpdmF0ZSBhdXRoQWNjZXNzQ29udHJvbFN2YzogQWNjZXNzQ29udHJvbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIG1vYmlsZUFwcHNTdmM6IE1vYmlsZUFwcHNTZXJ2aWNlLFxuICAgIHByaXZhdGUgdXRpbGl0eVN2YzogVXRpbGl0eVNlcnZpY2UsXG4gICAgLy8gcHJpdmF0ZSBwcm9ncmVzc1N2YzogQ29udGVudFByb2dyZXNzU2VydmljZSxcbiAgICBwcml2YXRlIGFjdGlvblNWQzogQWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHZpZXdlclN2YzogVmlld2VyVXRpbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByYXRpbmdTdmM6IFJhdGluZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0ZWxlbWV0cnlTZXJ2aWNlOiBUZWxlbWV0cnlTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgbGFuZ3RyYW5zbGF0aW9uczogTXVsdGlsaW5ndWFsVHJhbnNsYXRpb25zU2VydmljZSxcbiAgICBwcml2YXRlIGV2ZW50czogRXZlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWF0U25hY2tCYXI6IE1hdFNuYWNrQmFyLFxuICAgIHByaXZhdGUgbG9hZENoZWNrU2VydmljZTogTG9hZENoZWNrU2VydmljZSxcbiAgICBwcml2YXRlIGhhbmRsZUNsYWltU2VydmljZTogSGFuZGxlQ2xhaW1TZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVzZXRSYXRpbmdzU2VydmljZTogUmVzZXRSYXRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIHRpbWVyU2VydmljZTogVGltZXJTZXJ2aWNlLFxuICAgIHB1YmxpYyBlbnJvbGxTdmM6IFdpZGdldEVucm9sbFNlcnZpY2UsXG4gICAgcHVibGljIGNvbnRlbnRMaWJTdmM6IFdpZGdldENvbnRlbnRMaWJTZXJ2aWNlLFxuICAgIHB1YmxpYyBkYXRhVHJhbnNmZXJTdmM6IERhdGFUcmFuc2ZlclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtYXRTbmFja2Jhck5ldzogTWF0U25hY2tiYXJOZXcsXG4gICAgcHJpdmF0ZSB1c2VyU2VydmljZUxpYjogV2lkZ2V0VXNlclNlcnZpY2VMaWIsXG4gICAgcHVibGljIG5ldENvcmVTZXJ2aWNlOiBOZXRDb3JlU2VydmljZSxcbiAgICBwdWJsaWMgZG9tYWluQ29uZlNlcnZpY2U6IERvbWFpbkNvbmZTZXJ2aWNlLFxuICAgIEBJbmplY3QoJ2Vudmlyb25tZW50JykgZW52aXJvbm1lbnQ6IGFueVxuICApIHtcbiAgICB0aGlzLmVudmlyb25tZW50ID0gZW52aXJvbm1lbnRcbiAgICB0aGlzLmRha3NodGFOYW1lID0gdGhpcy5lbnZpcm9ubWVudC5kYWtzaHRhTmFtZVxuICAgIHRoaXMuY3NjbXNVcmwgPSB0aGlzLmVudmlyb25tZW50LmNzY21zVXJsXG4gICAgdGhpcy5oaXN0b3J5RGF0YSA9IGhpc3Rvcnkuc3RhdGVcbiAgICB0aGlzLmhhbmRsZUJyZWFkY3J1bWJzKClcbiAgICB0aGlzLm1vYmlsZUFwcHNTdmMubW9iaWxlVG9wSGVhZGVyVmlzaWJpbGl0eVN0YXR1cy5uZXh0KHRydWUpXG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKSkge1xuICAgICAgdGhpcy50cmFuc2xhdGUuc2V0RGVmYXVsdExhbmcoJ2VuJylcbiAgICAgIGNvbnN0IGxhbmcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnd2Vic2l0ZUxhbmd1YWdlJykhXG4gICAgICB0aGlzLnRyYW5zbGF0ZS51c2UobGFuZylcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRDaGVja1NlcnZpY2UuY2hpbGRDb21wb25lbnRMb2FkZWQkLnN1YnNjcmliZShfaXNMb2FkZWQgPT4ge1xuICAgICAgLy8gUHJlc2VudCBpbiBhcHAtdG9jLWFib3V0LmNvbXBvbmVudFxuICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYXRpbmdzRGl2JykpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmF0aW5nc0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdyYXRpbmdzRGl2JykgYXMgYW55XG4gICAgICAgICAgaWYgKHJhdGluZ3NEaXYpIHtcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsTGltaXQgPSByYXRpbmdzRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSBhcyBhbnlcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDUwMClcbiAgICAgIH1cblxuICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50Q29udGFpbmVyJykpIHtcbiAgICAgICAgY29uc3QgY29udGVudERpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250ZW50Q29udGFpbmVyJykgYXMgYW55XG4gICAgICAgIGlmIChjb250ZW50RGl2KSB7XG4gICAgICAgICAgdGhpcy5zY3JvbGxMaW1pdCA9IGNvbnRlbnREaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIGFzIGFueVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIHRoaXMuaGFuZGxlQ2xhaW1TZXJ2aWNlLmdldENsYWltRGF0YSgpLnN1YnNjcmliZSgoX2V2ZW50RGF0YTogYW55KSA9PiB7XG4gICAgICB0aGlzLm9uQ2xpY2tPZkNsYWltKF9ldmVudERhdGEpXG4gICAgfSlcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZGF0YVRyYW5zZmVyU3ZjLnNldEVucm9sbERhdGEobnVsbClcbiAgICB0aGlzLm1vYmlsZTEyMDAgPSB3aW5kb3cuaW5uZXJXaWR0aCA8IDEyMDFcbiAgICB0aGlzLmNvbmZpZ1N2Yy5sYW5ndWFnZVRyYW5zbGF0aW9uRmxhZy5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKSkge1xuICAgICAgICAgIHRoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKCdlbicpXG4gICAgICAgICAgY29uc3QgbGFuZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKSFcbiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZS51c2UobGFuZylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBpZiAodGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhICYmIHRoaXMucm91dGUuc25hcHNob3QuZGF0YS5wYWdlRGF0YS5kYXRhKSB7XG4gICAgICB0aGlzLmxlYXJuQWR2aXNvcnlEYXRhID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhLmRhdGEubGVhcm5lckFkdmlzb3J5XG4gICAgICAvLyB0aGlzLmxlYXJuQWR2aXNvcnlEYXRhTGVuZ3RoID0gdGhpcy5sZWFybkFkdmlzb3J5RGF0YS5sZW5ndGhcblxuICAgIH1cblxuICAgIHRoaXMuZ2V0U2VydmVyRGF0ZVRpbWUoKVxuICAgIC8vIHRoaXMuZGlzcGxheVJhbmRvbWxlYXJuQWR2aXNvcnlEYXRhKClcblxuICAgIHRoaXMuc2VsZWN0ZWRCYXRjaFN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLmdldFNlbGVjdGVkQmF0Y2guc3Vic2NyaWJlKGJhdGNoRGF0YSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhID0gYmF0Y2hEYXRhXG4gICAgfSlcblxuICAgIHRoaXMuc2VydmVyRGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLnNlcnZlckRhdGUuc3Vic2NyaWJlKHNlcnZlckRhdGUgPT4ge1xuICAgICAgdGhpcy5zZXJ2ZXJEYXRlID0gc2VydmVyRGF0ZVxuICAgIH0pXG5cbiAgICB0aGlzLmNoYW5uZWxJZCA9IHRoaXMudGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlDb25maWcgPyB0aGlzLnRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5Q29uZmlnLmNoYW5uZWwgOiAnJ1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmlzSW5JZnJhbWUgPSB3aW5kb3cuc2VsZiAhPT0gd2luZG93LnRvcFxuICAgIH0gY2F0Y2ggKF9leCkge1xuICAgICAgdGhpcy5pc0luSWZyYW1lID0gZmFsc2VcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yb3V0ZSkge1xuICAgICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IHRydWVcbiAgICAgIHRoaXMucm91dGVTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlLmRhdGEuc3Vic2NyaWJlKGFzeW5jIChkYXRhOiBEYXRhKSA9PiB7XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEuY29udGVudCAmJiBkYXRhLmNvbnRlbnQuZGF0YSAmJiBkYXRhLmNvbnRlbnQuZGF0YS5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgdGhpcy5jb3Vyc2VJRCA9IGRhdGEuY29udGVudC5kYXRhLmlkZW50aWZpZXJcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5mZXRjaEdldENvbnRlbnREYXRhKGRhdGEuY29udGVudC5kYXRhLmlkZW50aWZpZXIpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGEgPSByZXMucmVzdWx0LmNvbnRlbnRcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmNvbnRlbnRSZWFkRGF0YScsIHRoaXMuY29udGVudFJlYWREYXRhKVxuICAgICAgICAgICAgdGhpcy5nZXRQcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cygpXG4gICAgICAgICAgfSwgKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFlcnJvci5vaykge1xuICAgICAgICAgICAgICB0aGlzLm1hdFNuYWNrQmFyLm9wZW4oJ1VuYWJsZSB0byBmZXRjaCBjb250ZW50IGRhdGEsIGR1ZSB0byBzb21lIGVycm9yIScpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICBjb25zdCBpbml0RGF0YSA9IHRoaXMudG9jU3ZjLmluaXREYXRhKGRhdGEsIHRydWUpXG4gICAgICAgICAgdGhpcy5jb250ZW50ID0gaW5pdERhdGEuY29udGVudFxuICAgICAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dCh0cnVlKVxuICAgICAgICAgICAgYXdhaXQgdGhpcy50b2NTdmMuZmV0Y2hDb3Vyc2VIZWlyYXJjaHkodGhpcy5jb250ZW50KVxuICAgICAgICAgICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YSh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gZmFsc2VcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mZXRjaFVzZXJFbnJvbGxtZW50RGF0YSgpO1xuXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaW5pdGlhbHJvdXRlRGF0YSA9IGRhdGFcbiAgICAgICAgICB0aGlzLmJhbm5lcnMgPSBkYXRhLnBhZ2VEYXRhLmRhdGEuYmFubmVyc1xuICAgICAgICAgIHRoaXMudG9jU3ZjLnN1YnRpdGxlT25CYW5uZXJzID0gZGF0YS5wYWdlRGF0YS5kYXRhLnN1YnRpdGxlT25CYW5uZXJzIHx8IGZhbHNlXG4gICAgICAgICAgdGhpcy50b2NTdmMuc2hvd0Rlc2NyaXB0aW9uID0gZGF0YS5wYWdlRGF0YS5kYXRhLnNob3dEZXNjcmlwdGlvbiB8fCBmYWxzZVxuICAgICAgICAgIHRoaXMudG9jQ29uZmlnID0gZGF0YS5wYWdlRGF0YS5kYXRhXG4gICAgICAgICAgdGhpcy5rcGFycmF5ID0gdGhpcy50b2NDb25maWcua2FybWFQb2ludHNcbiAgICAgICAgICB0aGlzLnRvY0NvbmZpZyA9IGRhdGEucGFnZURhdGEuZGF0YVxuICAgICAgICAgIHRoaXMua3BhcnJheSA9IHRoaXMudG9jQ29uZmlnLmthcm1hUG9pbnRzXG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmlzUG9zdEFzc2Vzc21lbnQpIHtcbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLmZldGNoUG9zdEFzc2Vzc21lbnRTdGF0dXModGhpcy5jb250ZW50LmlkZW50aWZpZXIpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBhc3Nlc3NtZW50RGF0YSA9IHJlcy5yZXN1bHRcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBvIG9mIGFzc2Vzc21lbnREYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKG8uY29udGVudElkID09PSAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zaG93VGFrZUFzc2Vzc21lbnQgPSBvXG4gICAgICAgICAgICAgICAgICBicmVha1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pbml0RGF0YShkYXRhKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cblxuICAgIHRoaXMuY3VycmVudEZyYWdtZW50ID0gJ292ZXJ2aWV3J1xuICAgIHRoaXMucm91dGUuZnJhZ21lbnQuc3Vic2NyaWJlKChmcmFnbWVudDogYW55KSA9PiB7XG4gICAgICB0aGlzLmN1cnJlbnRGcmFnbWVudCA9IGZyYWdtZW50IHx8ICdvdmVydmlldydcbiAgICB9KVxuXG4gICAgdGhpcy5iYXRjaFN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLmJhdGNoUmVwbGF5U3ViamVjdC5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIHRoaXMuZmV0Y2hCYXRjaERldGFpbHMoKVxuICAgICAgICBpZiAodGhpcy5jb250ZW50ICYmICh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0pKSB7XG4gICAgICAgICAgdGhpcy5mZXRjaFVzZXJXRkZvckJsZW5kZWQoKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWNvbnNvbGVcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIG9uIGJhdGNoU3Vic2NyaXB0aW9uJylcbiAgICAgIH0sXG4gICAgKVxuXG4gICAgdGhpcy5iYXRjaERhdGFTdWJzY3JpcHRpb24gPSB0aGlzLnRvY1N2Yy5zZXRCYXRjaERhdGFTdWJqZWN0LnN1YnNjcmliZShcbiAgICAgICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29udGVudCAmJiAodGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKSkge1xuICAgICAgICAgIHRoaXMuZmV0Y2hVc2VyV0ZGb3JCbGVuZGVkKClcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciBvbiBiYXRjaERhdGFTdWJzY3JpcHRpb24nKVxuICAgICAgfSxcbiAgICApXG5cbiAgICBjb25zdCBpbnN0YW5jZUNvbmZpZyA9IHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnXG4gICAgaWYgKGluc3RhbmNlQ29uZmlnICYmIGluc3RhbmNlQ29uZmlnLmxvZ29zICYmIGluc3RhbmNlQ29uZmlnLmxvZ29zLmRlZmF1bHRTb3VyY2VMb2dvKSB7XG4gICAgICB0aGlzLmRlZmF1bHRTTG9nbyA9IGluc3RhbmNlQ29uZmlnLmxvZ29zLmRlZmF1bHRTb3VyY2VMb2dvXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcykge1xuICAgICAgdGhpcy5pc0dvYWxzRW5hYmxlZCA9ICF0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMuaGFzKCdnb2FscycpXG4gICAgfVxuXG4gICAgdGhpcy5yb3V0ZVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGUucXVlcnlQYXJhbU1hcC5zdWJzY3JpYmUoYXN5bmMgcVBhcmFtc01hcCA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0SWQgPSBxUGFyYW1zTWFwLmdldCgnY29udGV4dElkJylcbiAgICAgIGNvbnN0IGNvbnRleHRQYXRoID0gcVBhcmFtc01hcC5nZXQoJ2NvbnRleHRQYXRoJylcbiAgICAgIGNvbnN0IHJlY29tbWVuZGVkQ291cnNlc0lkID0gcVBhcmFtc01hcC5nZXQoJ3JlY29tbWVuZGF0aW9uSWQnKVxuICAgICAgaWYgKGNvbnRleHRJZCAmJiBjb250ZXh0UGF0aCkge1xuICAgICAgICB0aGlzLmNvbnRleHRJZCA9IGNvbnRleHRJZFxuICAgICAgICB0aGlzLmNvbnRleHRQYXRoID0gY29udGV4dFBhdGhcbiAgICAgIH1cbiAgICAgIGlmIChyZWNvbW1lbmRlZENvdXJzZXNJZCkge1xuICAgICAgICB0aGlzLnJlY29tbWVuZGVkQ291cnNlc0lkID0gcmVjb21tZW5kZWRDb3Vyc2VzSWRcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnVzZXJTZXJ2aWNlTGliLmdldFJlY29tbWVuZGVkQ291cnNlc1Nha3NoYW1BSShyZWNvbW1lbmRlZENvdXJzZXNJZCkudG9Qcm9taXNlKClcbiAgICAgICAgaWYgKHJlc3BvbnNlLmZlZWRiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLmZlZWRiYWNrR2l2ZW4gPSByZXNwb25zZS5mZWVkYmFja3MuZmluZCgoZmVlZGJhY2s6IGFueSkgPT4gZmVlZGJhY2s/LmNvdXJzZV9pZCA9PT0gdGhpcy5jb3Vyc2VJRClcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHJlY29tbWVuZGVkQ291cnNlc0lkKSB7XG4gICAgICAgIHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQgPSByZWNvbW1lbmRlZENvdXJzZXNJZFxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMudXNlclNlcnZpY2VMaWIuZ2V0UmVjb21tZW5kZWRDb3Vyc2VzU2Frc2hhbUFJKHJlY29tbWVuZGVkQ291cnNlc0lkKS50b1Byb21pc2UoKVxuICAgICAgICBpZiAocmVzcG9uc2UuZmVlZGJhY2tzLmxlbmd0aCkge1xuICAgICAgICAgIHRoaXMuZmVlZGJhY2tHaXZlbiA9IHJlc3BvbnNlLmZlZWRiYWNrcy5maW5kKChmZWVkYmFjazogYW55KSA9PiBmZWVkYmFjaz8uY291cnNlX2lkID09PSB0aGlzLmNvdXJzZUlEKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMpIHtcbiAgICAgIHRoaXMuaXNSZWdpc3RyYXRpb25TdXBwb3J0ZWQgPSB0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMuaGFzKCdyZWdpc3RyYXRpb25FeHRlcm5hbCcpXG4gICAgICB0aGlzLnNob3dJbnRyYW5ldE1lc3NhZ2UgPSAhdGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzLmhhcyhcbiAgICAgICAgJ3Nob3dJbnRyYW5ldE1lc3NhZ2VEZXNrdG9wJyxcbiAgICAgIClcbiAgICB9XG5cbiAgICB0aGlzLmNoZWNrUmVnaXN0cmF0aW9uU3RhdHVzKClcbiAgICB0aGlzLnJvdXRlclBhcmFtU3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZXIuZXZlbnRzLnN1YnNjcmliZSgocm91dGVyRXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBpZiAocm91dGVyRXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSB7XG4gICAgICAgIHRoaXMuYXNzaWduUGF0aEFuZFVwZGF0ZUJhbm5lcihyb3V0ZXJFdmVudC51cmwpXG4gICAgICB9XG4gICAgfSlcblxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGNvbnRlbnROYW1lID0gdGhpcy5jb250ZW50Lm5hbWUudHJpbSgpXG4gICAgICBpZiAodGhpcy5jb250ZW50LmNyZWF0b3JDb250YWN0cykge1xuICAgICAgICB0aGlzLmNvbnRlbnRDcmVhdG9yRGF0YSA9IHRoaXMuaGFuZGxlUGFyc2VKc29uRGF0YSh0aGlzLmNvbnRlbnQuY3JlYXRvckNvbnRhY3RzKVxuICAgICAgfVxuICAgICAgaWYgKChjb250ZW50TmFtZSkudG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5kYWtzaHRhTmFtZS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIHRoaXMuc2hvd0J0biA9IHRydWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvd0J0biA9IGZhbHNlXG4gICAgICB9XG4gICAgICB0aGlzLmJ0blBsYXlsaXN0Q29uZmlnID0ge1xuICAgICAgICBjb250ZW50SWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICBjb250ZW50TmFtZTogdGhpcy5jb250ZW50Lm5hbWUsXG4gICAgICAgIGNvbnRlbnRUeXBlOiB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUsXG4gICAgICAgIHByaW1hcnlDYXRlZ29yeTogdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgbW9kZTogJ2RpYWxvZycsXG4gICAgICB9XG4gICAgICB0aGlzLmJ0bkdvYWxzQ29uZmlnID0ge1xuICAgICAgICBjb250ZW50SWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICBjb250ZW50TmFtZTogdGhpcy5jb250ZW50Lm5hbWUsXG4gICAgICAgIGNvbnRlbnRUeXBlOiB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUsXG4gICAgICAgIHByaW1hcnlDYXRlZ29yeTogdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSxcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiAhW1xuICAgICAgTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5NT0RFUkFURURfQ09VUlNFLFxuICAgICAgTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5NT0RFUkFURURfQVNTRVNTRU1FTlQsXG4gICAgICBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNLFxuICAgICAgTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5JTlZJVEVfT05MWV9QUk9HUkFNLFxuICAgIF0uaW5jbHVkZXModGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5KSkge1xuICAgICAgdGhpcy5jYW5TaGFyZSA9IHRydWVcbiAgICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSkge1xuICAgICAgICB0aGlzLnJvb3RPcmdJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnJvb3RPcmdJZFxuICAgICAgfVxuICAgIH1cblxuXG4gIH1cblxuICAvLyBkaXNwbGF5UmFuZG9tbGVhcm5BZHZpc29yeURhdGEoKTogdm9pZCB7XG4gIC8vICAgY29uc3QgcmFuZG9tSW5kZXggPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiB0aGlzLmxlYXJuQWR2aXNvcnlEYXRhLmxlbmd0aClcbiAgLy8gICB0aGlzLnJhbmRvbWxlYXJuQWR2aXNvcnlPYmogPSB0aGlzLmxlYXJuQWR2aXNvcnlEYXRhW3JhbmRvbUluZGV4XVxuICAvLyB9XG5cbiAgZ2V0S2FybWFwb2ludHNMaW1pdCgpIHtcbiAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgdGhpcy5jb250ZW50U3ZjLnVzZXJLYXJtYVBvaW50cygpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcyAmJiByZXMua3BMaXN0KSB7XG4gICAgICAgICAgY29uc3QgaW5mbyA9IHJlcy5rcExpc3QuYWRkaW5mb1xuICAgICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICB0aGlzLm1vbnRobHlDYXBFeGNlZWQgPSBKU09OLnBhcnNlKGluZm8pLmNsYWltZWROb25BQ0JQQ291cnNlS2FybWFRdW90YSA+PSA0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlzQ291cnNlQ29tcGxldGVkT25UaGlzTW9udGgoKSB7XG4gICAgY29uc3Qgbm93ID0gbW9tZW50KHRoaXMuc2VydmVyRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICBjb25zdCBjb3Vyc2VEYXRhID0gdGhpcy5lbnJvbGxlZENvdXJzZURhdGFcbiAgICAgIGlmIChjb3Vyc2VEYXRhICYmIGNvdXJzZURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCAmJiBjb3Vyc2VEYXRhLmNvbXBsZXRlZE9uKSB7XG4gICAgICAgIGNvbnN0IGNvbXBsZXRlZE9uID0gbW9tZW50KGNvdXJzZURhdGEuY29tcGxldGVkT24pLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICAgIGNvbnN0IGNvbXBsZXRlZE1vbnRoID0gbW9tZW50KGNvbXBsZXRlZE9uLCAnWVlZWS1NTS1ERCcpLm1vbnRoKClcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gbW9tZW50KG5vdywgJ1lZWVktTU0tREQnKS5tb250aCgpXG4gICAgICAgIHRoaXMuaXNDb21wbGV0ZWRUaGlzTW9udGggPSBjb21wbGV0ZWRNb250aCA9PT0gY3VycmVudE1vbnRoXG4gICAgICAgIHRoaXMuY29udGVudFsndmlld01vcmUnXSA9IGZhbHNlXG4gICAgICAgIHRoaXMuY29udGVudFsnY29tcGxldGVkT24nXSA9IGNvdXJzZURhdGEuY29tcGxldGVkT25cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmaWx0ZXJlZEFjYnBMaXN0KHJlczogYW55KSB7XG4gICAgcmV0dXJuIHJlcy5maWx0ZXIoKHY6IGFueSkgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmNvdXJzZUlEKVxuICB9XG5cbiAgZmluZEFDUEIoKSB7XG4gICAgY29uc3QgbG9jYWxDYnAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2JwRGF0YScpXG4gICAgaWYgKGxvY2FsQ2JwKSB7XG4gICAgICBjb25zdCBzdG9yZWFnZUNicCA9IEpTT04ucGFyc2UobG9jYWxDYnApXG4gICAgICBjb25zdCBjYnAgPSB0aGlzLmZpbHRlcmVkQWNicExpc3Qoc3RvcmVhZ2VDYnApXG4gICAgICBpZiAoY2JwLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBhY2JwID0gJ2NiUGxhbidcbiAgICAgICAgdGhpcy5jYlBsYW5FbmREYXRlID0gY2JwWzBdLmVuZERhdGVcbiAgICAgICAgY29uc3Qgc0RhdGUgPSBkYXlqcyh0aGlzLnNlcnZlckRhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICAgIGNvbnN0IGRheXNDb3VudCA9IGRheWpzKHRoaXMuY2JQbGFuRW5kRGF0ZSkuZGlmZih0aGlzLnNlcnZlckRhdGUsICdkYXknKVxuICAgICAgICB0aGlzLmNiUGxhbkR1cmF0aW9uID0gZGF5c0NvdW50IDwgMCA/IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0Lk9WRVJEVUUgOiBkYXlzQ291bnQgPiAyOVxuICAgICAgICAgID8gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuU1VDQ0VTUyA6IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0LlVQQ09NSU5HXG4gICAgICAgIGlmIChhY2JwICYmIHRoaXMuY2JQbGFuRW5kRGF0ZSAmJiBhY2JwID09PSAnY2JQbGFuJykge1xuICAgICAgICAgIHRoaXMuaXNBY2JwQ291cnNlID0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IGVEYXRlID0gZGF5anModGhpcy5jYlBsYW5FbmREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgICAgICAgIGlmIChkYXlqcyhzRGF0ZSkuaXNTYW1lT3JCZWZvcmUoZURhdGUpKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0T2JqID0ge1xuICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgICAgICAgICAgY29udGV4dFR5cGU6ICdDb3Vyc2UnLFxuICAgICAgICAgICAgICAgICAgY29udGV4dElkOiB0aGlzLmNvdXJzZUlELFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRTdmMuZ2V0Q291cnNlS2FybWFQb2ludHMocmVxdWVzdE9iaikuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5rcExpc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSByZXMua3BMaXN0XG4gICAgICAgICAgICAgICAgaWYgKHJvdy5hZGRpbmZvKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoSlNPTi5wYXJzZShyb3cuYWRkaW5mbykuQUNCUCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWNicENsYWltID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NsYWltZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWNicENsYWltID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmlzQWNicENsYWltID0gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzQWNicENsYWltID0gdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJhaXNlVGVsZW1ldGVyeUZvclByb3ZpZGVyKHByb3ZpZGVyTmFtZTogc3RyaW5nLCBwcml2aWRlcklkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBpZDogJ2J0bi1wcm92aWRlcicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogcHJvdmlkZXJOYW1lLFxuICAgICAgICB0eXBlOiBwcml2aWRlcklkLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcGFnZUlkRXh0OiAnYnRuLXByb3ZpZGVyJyxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5DT05URU5ULFxuICAgICAgfSlcblxuICB9XG5cbiAgcmFpc2VUZWxlbWV0cnkoKSB7XG4gICAgdGhpcy5ldmVudHMucmFpc2VJbnRlcmFjdFRlbGVtZXRyeShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgc3ViVHlwZTogJ2thcm1hcG9pbnRzLWNsYWltJyxcbiAgICAgICAgaWQ6IHRoaXMuY291cnNlSUQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogdGhpcy5jb3Vyc2VJRCxcbiAgICAgICAgdHlwZTogJ2NvdXJzZScsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYWdlSWRFeHQ6ICdidG4tYWNicC1jbGFpbScsXG4gICAgICAgIG1vZHVsZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeW1vZHVsZXMuS0FSTUFQT0lOVFMsXG4gICAgICB9KVxuICB9XG5cbiAgb25DbGlja09mQ2xhaW0oZXZlbnQ6IGFueSkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZyhldmVudClcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgdXNlcklkOiB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIuaWRlbnRpZmllcixcbiAgICAgIGNvdXJzZUlkOiB0aGlzLmNvdXJzZUlELFxuICAgIH1cbiAgICB0aGlzLnJhaXNlVGVsZW1ldHJ5KClcbiAgICB0aGlzLmNvbnRlbnRTdmMuY2xhaW1LYXJtYXBvaW50cyhyZXF1ZXN0KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmxvZyhyZXMpXG4gICAgICB0aGlzLmlzQ2xhaW1lZCA9IHRydWVcbiAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdLYXJtYSBwb2ludHMgYXJlIHN1Y2Nlc3NmdWxseSBjbGFpbWVkLicpXG4gICAgICAvLyB0aGlzLmdldFVzZXJFbnJvbGxtZW50TGlzdCgpXG4gICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgIH0sIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdzb21ldGhpbmcgd2VudCB3cm9uZy4nKVxuICAgIH0pXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMucmNFbGVtZW50KSB7XG4gICAgICB0aGlzLnJjRWxlbS5Cb3R0b21Qb3MgPSB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCArIHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0XG4gICAgICB0aGlzLnJjRWxlbS5vZmZTZXRUb3AgPSB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcFxuICAgIH1cbiAgICAvLyBHZXQgVGltZSBmb3IgdGhlIGJhdGNoXG4gICAgdGhpcy50aW1lclVuc3Vic2NyaWJlID0gdGhpcy50aW1lclNlcnZpY2UuZ2V0VGltZXJEYXRhKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3lTdWJqZWN0JCkpXG4gICAgICAuc3Vic2NyaWJlKChfdGltZXI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRpbWVyID0gX3RpbWVyXG4gICAgICB9KVxuICB9XG5cbiAgaGFuZGxlQnJlYWRjcnVtYnMoKSB7XG4gICAgaWYgKHRoaXMuaGlzdG9yeURhdGEpIHtcbiAgICAgIGlmICh0aGlzLmhpc3RvcnlEYXRhLnBhdGggPT09ICdTZWFyY2gnKSB7XG4gICAgICAgIGNvbnN0IHNlYXJjaHVybCA9IGAvYXBwL2dsb2JhbHNlYXJjaGBcbiAgICAgICAgY29uc3QgcVBhcmFtID0ge1xuICAgICAgICAgIHE6IHRoaXMuaGlzdG9yeURhdGEucGFyYW0sXG4gICAgICAgIH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICB0aGlzLmJyZWFkY3J1bWJzID0geyB1cmw6ICdob21lJywgdGl0bGVzOiBbeyB0aXRsZTogJ1NlYXJjaCcsIHVybDogc2VhcmNodXJsLCBxdWVyeVBhcmFtczogcVBhcmFtIH0sIHsgdGl0bGU6ICdEZXRhaWxzJywgdXJsOiAnbm9uZScgfV0gfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmhpc3RvcnlEYXRhLnBhdGggPT09ICdjb21wZXRlbmN5LWRldGFpbHMnKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsVXJsID0gYC9hcHAvbGVhcm4vYnJvd3NlLWJ5L2NvbXBldGVuY3kvJHt0aGlzLmhpc3RvcnlEYXRhLnBhcmFtfWBcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6IHRoaXMuaGlzdG9yeURhdGEucGFyYW0sIHVybDogZmluYWxVcmwgfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ2FsbC1DQlAnKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsVVJMID0gYC9hcHAvbGVhcm4vYnJvd3NlLWJ5L3Byb3ZpZGVyLyR7dGhpcy5oaXN0b3J5RGF0YS5wYXJhbX1gXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiBgYWxsIENCUCdzYCwgdXJsOiBmaW5hbFVSTCB9LCB7IHRpdGxlOiAnRGV0YWlscycsIHVybDogJ25vbmUnIH1dIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5oaXN0b3J5RGF0YS5wYXRoID09PSAnYWxsLWNvbXBldGVuY2llcycpIHtcbiAgICAgICAgY29uc3QgZmluYWxVcmwgPSBgL2FwcC9sZWFybi9icm93c2UtYnkvY29tcGV0ZW5jeS9hbGwtY29tcGV0ZW5jaWVzYFxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICB0aGlzLmJyZWFkY3J1bWJzID0geyB1cmw6ICdob21lJywgdGl0bGVzOiBbeyB0aXRsZTogJ2FsbCBjb21wZXRlbmNpZXMnLCB1cmw6IGZpbmFsVXJsIH0sIHsgdGl0bGU6ICdEZXRhaWxzJywgdXJsOiAnbm9uZScgfV0gfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmhpc3RvcnlEYXRhLnBhdGggPT09ICdjdXJhdGVkQ29sbGVjdGlvbnMnKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsVXJsID0gYC9hcHAvY3VyYXRlZENvbGxlY3Rpb25zL2hvbWVgXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiAnY3VyYXRlZCBjb2xsZWN0aW9ucycsIHVybDogZmluYWxVcmwgfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiAnTGVhcm4nLCB1cmw6ICcvcGFnZS9sZWFybicsIGljb246ICdzY2hvb2wnIH0sIHsgdGl0bGU6ICdEZXRhaWxzJywgdXJsOiAnbm9uZScgfV0gfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZnJhZ21lbnQpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgZG9jdW1lbnQhLnF1ZXJ5U2VsZWN0b3IoYCMke3RoaXMuZnJhZ21lbnR9YCkhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IDgwLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IH1cbiAgfVxuXG4gIGdldCBlbmFibGVBbmFseXRpY3MoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcykge1xuICAgICAgcmV0dXJuICF0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMuaGFzKCd0b2NBbmFseXRpY3MnKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBpc1Jlc291cmNlKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGlzUmVzb3VyY2UgPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5LTk9XTEVER0VfQVJUSUZBQ1QgfHxcbiAgICAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0VcbiAgICAgICAgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcbiAgICAgICAgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVFxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT01QX0FTU0VTU01FTlRcbiAgICAgICAgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuT0ZGTElORV9TRVNTSU9OXG4gICAgICAgIHx8ICEodGhpcy5jb250ZW50LmNoaWxkcmVuICYmIHRoaXMuY29udGVudC5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICBpZiAoaXNSZXNvdXJjZSkge1xuICAgICAgICB0aGlzLm1vYmlsZUFwcHNTdmMuc2VuZFZpZXdlckRhdGEodGhpcy5jb250ZW50KVxuICAgICAgfVxuICAgICAgcmV0dXJuIGlzUmVzb3VyY2VcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnZXQgZ2V0U3RhcnREYXRlKCkge1xuICAgIGlmICh0aGlzLmVucm9sbGVkQ291cnNlRGF0YSkge1xuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgIC8vIGNvbnN0IGJhdGNoID0gXy5maXJzdChfLmZpbHRlcih0aGlzLmNvbnRlbnRbJ2JhdGNoZXMnXSwgeyBiYXRjaElkOiB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkIH0pIHx8IFtdKVxuICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLmVucm9sbGVkQ291cnNlRGF0YS5iYXRjaFxuICAgICAgdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCA9IGJhdGNoLmJhdGNoSWRcbiAgICAgIGlmIChiYXRjaCAmJiB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkKSB7XG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gKF8uZ2V0KGJhdGNoLCAnc3RhcnREYXRlJykpXG4gICAgICAgIC8vIGNvbnN0IHBhcnNlZERhdGUgPSBtb21lbnQodGhpcy5zdGFydERhdGUpO1xuICAgICAgICAvLyBjb25zdCBkYXRlT25seSA9IHBhcnNlZERhdGUuY2xvbmUoKS5zdGFydE9mKCdkYXknKTtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlVGltZSA9IHRoaXMuc3RhcnREYXRlICYmIG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlKS5nZXRUaW1lKClcbiAgICAgICAgdGhpcy5zdGFydERhdGVEaWZmZXJlbmNlID0gc3RhcnREYXRlVGltZSAtIG5vd1xuICAgICAgICBpZiAodGhpcy5zdGFydERhdGVEaWZmZXJlbmNlICYmIHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSA+IDApIHtcbiAgICAgICAgICBjb25zdCBkYXlzID0gTWF0aC5mbG9vcih0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpXG4gICAgICAgICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKCh0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgJSAoMTAwMCAqIDYwICogNjAgKiAyNCkpIC8gKDEwMDAgKiA2MCAqIDYwKSlcbiAgICAgICAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcigodGhpcy5zdGFydERhdGVEaWZmZXJlbmNlICUgKDEwMDAgKiA2MCAqIDYwKSkgLyAoMTAwMCAqIDYwKSlcbiAgICAgICAgICByZXR1cm4gKGAke2RheXN9IERheXMgOiAke2hvdXJzfSBIb3VycyA6ICR7bWludXRlc30gTWludXRlc2ApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdOQSdcbiAgICAgIH1cbiAgICAgIHJldHVybiAnTkEnXG4gICAgICAvLyBpZiAoXy5nZXQoYmF0Y2gsICdzdGFydERhdGUnKSAmJiBtb21lbnQoXy5nZXQoYmF0Y2gsICdzdGFydERhdGUnKSkuaXNBZnRlcigpKSB7XG4gICAgICAvLyAgIHJldHVybiBtb21lbnQoXy5nZXQoYmF0Y2gsICdzdGFydERhdGUnKSkuZnJvbShub3cpXG4gICAgICAvLyB9XG4gICAgICAvLyBpZiAoXy5nZXQoYmF0Y2gsICdlbmREYXRlJykgJiYgbW9tZW50KF8uZ2V0KGJhdGNoLCAnZW5kRGF0ZScpKS5pc0JlZm9yZSgpKSB7XG4gICAgICAvLyAgIHJldHVybiAnTkEnXG4gICAgICAvLyB9XG4gICAgICAvLyBpZiAoc3RhcnREYXRlVGltZSAmJiBtb21lbnQoc3RhcnREYXRlVGltZSkuaXNBZnRlcigpKSAge1xuICAgICAgLy8gICByZXR1cm4gbW9tZW50KHN0YXJ0RGF0ZVRpbWUpLmZyb20obm93KVxuICAgICAgLy8gfVxuICAgICAgLy8gaWYgKGVuZERhdGVUaW1lICYmIG1vbWVudChlbmREYXRlVGltZSkuaXNCZWZvcmUoKSkge1xuICAgICAgLy8gICAgIHJldHVybiAnTkEnXG4gICAgICAvLyAgIH1cbiAgICAgIC8vIHJldHVybiAnTkEnXG4gICAgfSByZXR1cm4gJ05BJ1xuICB9XG5cbiAgZ2V0IGlzQmF0Y2hJblByb2dyZXNzKCkge1xuICAgIC8vIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50WydiYXRjaGVzJ10pIHtcbiAgICAvLyBjb25zdCBiYXRjaGVzID0gdGhpcy5jb250ZW50WydiYXRjaGVzJ10gYXMgTnNDb250ZW50LklCYXRjaFxuICAgIC8vIGlmICh0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkKSB7XG4gICAgLy8gICAvLyBjb25zdCBub3cgPSBtb21lbnQoKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKVxuICAgIC8vICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAvLyAgIGlmICh0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgLy8gICAgIGNvbnN0IGJhdGNoID0gXy5maXJzdChfLmZpbHRlcih0aGlzLmJhdGNoRGF0YS5jb250ZW50LCB7IGJhdGNoSWQ6IHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQgfSkgfHwgW10pXG4gICAgLy8gICAgIGlmIChiYXRjaCkge1xuICAgIC8vICAgICAgIC8vIGNvbnN0IHN0YXJ0RGF0ZSA9IG1vbWVudChiYXRjaC5zdGFydERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpXG4gICAgLy8gICAgICAgLy8gY29uc3QgZW5kRGF0ZSA9IGJhdGNoLmVuZERhdGUgPyBtb21lbnQoYmF0Y2guZW5kRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJykgOiBub3dcbiAgICAvLyAgICAgICAvLyByZXR1cm4gKFxuICAgIC8vICAgICAgIC8vICAgLy8gYmF0Y2guc3RhdHVzICYmXG4gICAgLy8gICAgICAgLy8gICBtb21lbnQoc3RhcnREYXRlKS5pc1NhbWVPckJlZm9yZShub3cpXG4gICAgLy8gICAgICAgLy8gICAmJiBtb21lbnQoZW5kRGF0ZSkuaXNTYW1lT3JBZnRlcihub3cpXG4gICAgLy8gICAgICAgLy8gKVxuICAgIC8vICAgICAgIHRoaXMuc3RhcnREYXRlID0gYmF0Y2ggJiYgKF8uZ2V0KGJhdGNoLCAnc3RhcnRUaW1lJykpXG4gICAgLy8gICAgICAgdGhpcy5lbmREYXRlID0gYmF0Y2ggJiYgKF8uZ2V0KGJhdGNoLCAnZW5kVGltZScpKVxuICAgIC8vICAgICAgIGNvbnN0IGVuZERhdGVUaW1lID0gbmV3IERhdGUodGhpcy5lbmREYXRlKS5nZXRUaW1lKClcbiAgICAvLyAgICAgICB0aGlzLmVuZERhdGVEaWZmZXJlbmNlID0gZW5kRGF0ZVRpbWUgLSBub3dcbiAgICAvLyAgICAgICBpZih0aGlzLmVuZERhdGVEaWZmZXJlbmNlID4gMCkge1xuICAgIC8vICAgICAgIHJldHVybiAgYmF0Y2guc3RhdHVzXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gICAgIHJldHVybiBmYWxzZVxuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuIGZhbHNlXG4gICAgLy8gfSByZXR1cm4gZmFsc2VcblxuICAgIGlmICh0aGlzLmVucm9sbGVkQ291cnNlRGF0YSkge1xuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgIGNvbnN0IGJhdGNoID0gdGhpcy5lbnJvbGxlZENvdXJzZURhdGEuYmF0Y2hcbiAgICAgIHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQgPSBiYXRjaC5iYXRjaElkXG4gICAgICBpZiAoYmF0Y2ggJiYgdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCkge1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpKVxuICAgICAgICB0aGlzLmVuZERhdGUgPSAoXy5nZXQoYmF0Y2gsICdlbmREYXRlJykpXG4gICAgICAgIGlmICh0aGlzLmVuZERhdGUpIHtcbiAgICAgICAgICBjb25zdCBzdGFydERhdGVUaW1lID0gdGhpcy5zdGFydERhdGUgJiYgbmV3IERhdGUodGhpcy5zdGFydERhdGUpLmdldFRpbWUoKVxuICAgICAgICAgIGxldCBlbmREYXRlID0gdGhpcy5lbmREYXRlICYmIG5ldyBEYXRlKHRoaXMuZW5kRGF0ZSlcbiAgICAgICAgICBlbmREYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSlcbiAgICAgICAgICBjb25zdCBlbmREYXRlVGltZSA9IGVuZERhdGUuZ2V0VGltZSgpXG4gICAgICAgICAgdGhpcy5zdGFydERhdGVEaWZmZXJlbmNlID0gbm93IC0gc3RhcnREYXRlVGltZVxuICAgICAgICAgIHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPSBlbmREYXRlVGltZSAtIG5vd1xuICAgICAgICAgIGlmICh0aGlzLmVuZERhdGVEaWZmZXJlbmNlID4gMCAmJiB0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgPiAwICYmIGJhdGNoLnN0YXR1cyAhPT0gMikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgaW5pdERhdGEoZGF0YTogRGF0YSkge1xuICAgIGNvbnN0IGluaXREYXRhID0gdGhpcy50b2NTdmMuaW5pdERhdGEoZGF0YSwgdHJ1ZSlcbiAgICB0aGlzLmVycm9yQ29kZSA9IGluaXREYXRhLmVycm9yQ29kZVxuICAgIHN3aXRjaCAodGhpcy5lcnJvckNvZGUpIHtcbiAgICAgIGNhc2UgTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlLkFQSV9GQUlMVVJFOiB7XG4gICAgICAgIHRoaXMuZXJyb3JXaWRnZXREYXRhLndpZGdldERhdGEuZXJyb3JUeXBlID0gRXJyb3JUeXBlLmludGVybmFsU2VydmVyXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlIE5zQXBwVG9jLkVXc1RvY0Vycm9yQ29kZS5JTlZBTElEX0RBVEE6IHtcbiAgICAgICAgdGhpcy5lcnJvcldpZGdldERhdGEud2lkZ2V0RGF0YS5lcnJvclR5cGUgPSBFcnJvclR5cGUuaW50ZXJuYWxTZXJ2ZXJcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlLk5PX0RBVEE6IHtcbiAgICAgICAgdGhpcy5lcnJvcldpZGdldERhdGEud2lkZ2V0RGF0YS5lcnJvclR5cGUgPSBFcnJvclR5cGUuaW50ZXJuYWxTZXJ2ZXJcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhpcy5lcnJvcldpZGdldERhdGEud2lkZ2V0RGF0YS5lcnJvclR5cGUgPSBFcnJvclR5cGUuc29tZXRoaW5nV3JvbmdcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgIHRoaXMuZ2V0VXNlclJhdGluZyhmYWxzZSlcbiAgICAgIC8vIHRoaXMuZ2V0VXNlckVucm9sbG1lbnRMaXN0KClcbiAgICB9XG4gICAgdGhpcy5ib2R5ID0gdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoXG4gICAgICB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmJvZHlcbiAgICAgICAgPyB0aGlzLmZvclByZXZpZXdcbiAgICAgICAgICA/IHRoaXMuYXV0aEFjY2Vzc0NvbnRyb2xTdmMucHJveHlUb0F1dGhvcmluZ1VybCh0aGlzLmNvbnRlbnQuYm9keSlcbiAgICAgICAgICA6IHRoaXMuY29udGVudC5ib2R5XG4gICAgICAgIDogJycsXG4gICAgKVxuXG4gICAgdGhpcy5jb250ZW50UGFyZW50cyA9IHt9XG4gICAgdGhpcy50b2NTdHJ1Y3R1cmUgPSB7XG4gICAgICBhc3Nlc3NtZW50OiAwLFxuICAgICAgY291cnNlOiAwLFxuICAgICAgaGFuZHNPbjogMCxcbiAgICAgIGludGVyYWN0aXZlVmlkZW86IDAsXG4gICAgICBsZWFybmluZ01vZHVsZTogMCxcbiAgICAgIG90aGVyOiAwLFxuICAgICAgcGRmOiAwLFxuICAgICAgc3VydmV5OiAwLFxuICAgICAgcG9kY2FzdDogMCxcbiAgICAgIHByYWN0aWNlVGVzdDogMCxcbiAgICAgIGZpbmFsVGVzdDogMCxcbiAgICAgIHF1aXo6IDAsXG4gICAgICB2aWRlbzogMCxcbiAgICAgIHdlYk1vZHVsZTogMCxcbiAgICAgIHdlYlBhZ2U6IDAsXG4gICAgICB5b3V0dWJlOiAwLFxuICAgICAgaW50ZXJhY3RpdmVjb250ZW50OiAwLFxuICAgICAgb2ZmbGluZVNlc3Npb246IDAsXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5oYXNUb2NTdHJ1Y3R1cmUgPSBmYWxzZVxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUubGVhcm5pbmdNb2R1bGUgPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5NT0RVTEUgPyAtMSA6IDBcbiAgICAgIHRoaXMudG9jU3RydWN0dXJlLmNvdXJzZSA9IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkNPVVJTRSA/IC0xIDogMFxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUgPSB0aGlzLnRvY1N2Yy5nZXRUb2NTdHJ1Y3R1cmUodGhpcy5jb250ZW50LCB0aGlzLnRvY1N0cnVjdHVyZSlcbiAgICAgIGZvciAoY29uc3QgcHJvZ1R5cGUgaW4gdGhpcy50b2NTdHJ1Y3R1cmUpIHtcbiAgICAgICAgaWYgKHRoaXMudG9jU3RydWN0dXJlW3Byb2dUeXBlXSA+IDApIHtcbiAgICAgICAgICB0aGlzLmhhc1RvY1N0cnVjdHVyZSA9IHRydWVcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGZyb20gbmdPbkNoYW5nZXNcbiAgICAgIHRoaXMuZmV0Y2hFeHRlcm5hbENvbnRlbnRBY2Nlc3MoKVxuICAgICAgdGhpcy5tb2RpZnlTZW5zaWJsZUNvbnRlbnRSYXRpbmcoKVxuICAgICAgdGhpcy5hc3NpZ25QYXRoQW5kVXBkYXRlQmFubmVyKHRoaXMucm91dGVyLnVybClcbiAgICAgIHRoaXMuZ2V0TGVhcm5pbmdVcmxzKClcbiAgICB9XG5cbiAgICB0aGlzLmFjdGlvblNWQy5nZXRVcGRhdGVDb21wR3JvdXBPLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVzdW1lRGF0YUxpbmsgPSByZXNcbiAgICB9KVxuXG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmlzUG9zdEFzc2Vzc21lbnQpIHtcbiAgICAgIHRoaXMudG9jU3ZjLmZldGNoUG9zdEFzc2Vzc21lbnRTdGF0dXModGhpcy5jb250ZW50LmlkZW50aWZpZXIpLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICBjb25zdCBhc3Nlc3NtZW50RGF0YSA9IHJlcy5yZXN1bHRcbiAgICAgICAgZm9yIChjb25zdCBvIG9mIGFzc2Vzc21lbnREYXRhKSB7XG4gICAgICAgICAgaWYgKG8uY29udGVudElkID09PSAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgdGhpcy5zaG93VGFrZUFzc2Vzc21lbnQgPSBvXG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyBmcm9tIG5nT25DaGFuZ2VzXG4gICAgdGhpcy5iYXRjaENvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoYmF0Y2g6IE5zQ29udGVudC5JQmF0Y2gpID0+IHtcbiAgICAgIHRoaXMuZGlzYWJsZUVucm9sbEJ0biA9IHRydWVcbiAgICAgIGxldCB1c2VySWQgPSAnJ1xuICAgICAgaWYgKGJhdGNoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSkge1xuICAgICAgICAgIHVzZXJJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJ1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVxID0ge1xuICAgICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICAgIGNvdXJzZUlkOiBiYXRjaC5jb3Vyc2VJZCxcbiAgICAgICAgICAgIGJhdGNoSWQ6IGJhdGNoLmJhdGNoSWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRlbnRTdmMuZW5yb2xsVXNlclRvQmF0Y2gocmVxKS50aGVuKChkYXRhYjogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGFiICYmIGRhdGFiLnJlc3VsdCAmJiBkYXRhYi5yZXN1bHQucmVzcG9uc2UgPT09ICdTVUNDRVNTJykge1xuICAgICAgICAgICAgdGhpcy5iYXRjaERhdGEgPSB7XG4gICAgICAgICAgICAgIGNvbnRlbnQ6IFtiYXRjaF0sXG4gICAgICAgICAgICAgIGVucm9sbGVkOiB0cnVlLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50b2NTdmMuZ2V0U2VsZWN0ZWRCYXRjaERhdGEodGhpcy5iYXRjaERhdGEpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5tYXBTZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UodGhpcy5iYXRjaERhdGEpXG4gICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLFxuICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGJhdGNoSWQ6IGJhdGNoLmJhdGNoSWQgfSxcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ0Vucm9sbGVkIFN1Y2Nlc3NmdWxseSEnKVxuICAgICAgICAgICAgdGhpcy5kaXNhYmxlRW5yb2xsQnRuID0gZmFsc2VcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuU25hY2tiYXIoJ1NvbWV0aGluZyB3ZW50IHdyb25nLCBwbGVhc2UgdHJ5IGFnYWluIGxhdGVyIScpXG4gICAgICAgICAgICB0aGlzLmRpc2FibGVFbnJvbGxCdG4gPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuXG4gIH1cblxuICBnZXRVc2VyUmF0aW5nKGZpcmVVcGRhdGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkIHx8ICcnXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyICYmIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkpIHtcbiAgICAgICAgdGhpcy5yYXRpbmdTdmMuZ2V0UmF0aW5nKHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LCB0aGlzLnVzZXJJZCkuc3Vic2NyaWJlKFxuICAgICAgICAgIChyZXM6IGFueSkgPT4ge1xuXG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5yZXN1bHQgJiYgcmVzLnJlc3VsdC5yZXNwb25zZSkge1xuICAgICAgICAgICAgICB0aGlzLnVzZXJSYXRpbmcgPSByZXMucmVzdWx0LnJlc3BvbnNlXG4gICAgICAgICAgICAgIGlmIChmaXJlVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2NTdmMuY2hhbmdlVXBkYXRlUmV2aWV3cyh0cnVlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRWaWV3RXZlbnRGb3JOZXRDb3JlKCd2aWV3JylcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ1VTRVIgUkFUSU5HIEZFVENIIEVSUk9SID4nLCBlcnIpXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jb250ZW50U291cmNlICYmIHRoaXMuY29udGVudFNvdXJjZS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IDQ0KSB7XG4gICAgICAgIHRoaXMuc291cmNlRWxsaXBzaXMgPSB0cnVlXG4gICAgICB9XG4gICAgfSwgMjUwKVxuICB9XG5cbiAgLy8gcHJpdmF0ZSBnZXRVc2VyRW5yb2xsbWVudExpc3QoKSB7XG4gIC8vICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gdHJ1ZVxuICAvLyAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dCh0cnVlKVxuICAvLyAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAvLyAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFICYmXG4gIC8vICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5QUk9HUkFNICYmXG4gIC8vICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5NQU5EQVRPUllfQ09VUlNFX0dPQUwgJiZcbiAgLy8gICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJlxuICAvLyAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNICYmXG4gIC8vICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0pIHtcbiAgLy8gICAgIC8vIGNvbnN0IGNvbGxlY3Rpb25JZCA9IHRoaXMuaXNSZXNvdXJjZSA/ICcnIDogdGhpcy5jb250ZW50LmlkZW50aWZpZXJcbiAgLy8gICAgIHJldHVybiB0aGlzLmdldENvbnRpbnVlTGVhcm5pbmdEYXRhKHRoaXMuY29udGVudC5pZGVudGlmaWVyKVxuICAvLyAgIH1cblxuICAvLyAgIHRoaXMudXNlckVucm9sbG1lbnRMaXN0ID0gW11cbiAgLy8gICBsZXQgdXNlcklkOiBhbnlcblxuICAvLyAgIGlmICh0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZSkge1xuICAvLyAgICAgdXNlcklkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkIHx8ICcnXG4gIC8vICAgfVxuXG4gIC8vICAgdGhpcy51c2VyU3ZjLmZldGNoVXNlckJhdGNoTGlzdCh1c2VySWQpLnRvUHJvbWlzZSgpLnRoZW4oXG4gIC8vICAgICBhc3luYyAocmVzdWx0OiBhbnkpID0+IHtcbiAgLy8gICAgICAgY29uc3QgY291cnNlczogTnNDb250ZW50LklDb3Vyc2VbXSA9IHJlc3VsdCAmJiByZXN1bHQuY291cnNlc1xuICAvLyAgICAgICB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCA9IGNvdXJzZXNcbiAgLy8gICAgICAgbGV0IGVucm9sbGVkQ291cnNlOiBOc0NvbnRlbnQuSUNvdXJzZSB8IHVuZGVmaW5lZFxuICAvLyAgICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyICYmICF0aGlzLmZvclByZXZpZXcpIHtcbiAgLy8gICAgICAgICBpZiAoY291cnNlcyAmJiBjb3Vyc2VzLmxlbmd0aCkge1xuICAvLyAgICAgICAgICAgZW5yb2xsZWRDb3Vyc2UgPSBjb3Vyc2VzLmZpbmQoKGNvdXJzZTogYW55KSA9PiB7XG4gIC8vICAgICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgfHwgJydcbiAgLy8gICAgICAgICAgICAgaWYgKGNvdXJzZS5jb3Vyc2VJZCAhPT0gaWRlbnRpZmllcikge1xuICAvLyAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgLy8gICAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgICByZXR1cm4gY291cnNlXG4gIC8vICAgICAgICAgICB9KVxuICAvLyAgICAgICAgIH1cblxuICAvLyAgICAgICAgIC8vIElmIGN1cnJlbnQgY291cnNlIGlzIHByZXNlbnQgaW4gdGhlIGxpc3Qgb2YgdXNlciBlbnJvbGxlZCBjb3Vyc2VcbiAgLy8gICAgICAgICBpZiAoZW5yb2xsZWRDb3Vyc2UgJiYgZW5yb2xsZWRDb3Vyc2UuYmF0Y2hJZCkge1xuICAvLyAgICAgICAgICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMucmVzdW1lRGF0YS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gIC8vICAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgLy8gICAgICAgICAgICAgICB0aGlzLnJlc3VtZURhdGEgPSByZXNcbiAgLy8gICAgICAgICAgICAgICB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gIC8vICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVJlc3VtZURhdGFMaW5rTmV3KClcbiAgLy8gICAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgfSlcbiAgLy8gICAgICAgICAgIHRoaXMudG9jU3ZjLmNoZWNrTW9kdWxlV2lzZURhdGEodGhpcy5jb250ZW50KVxuICAvLyAgICAgICAgICAgdGhpcy5lbnJvbGxlZENvdXJzZURhdGEgPSBlbnJvbGxlZENvdXJzZVxuICAvLyAgICAgICAgICAgdGhpcy5pc0NvdXJzZUNvbXBsZXRlZE9uVGhpc01vbnRoKClcbiAgLy8gICAgICAgICAgIHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQgPSBlbnJvbGxlZENvdXJzZS5iYXRjaElkXG4gIC8vICAgICAgICAgICAvLyB0aGlzLmRvd25sb2FkQ2VydChlbnJvbGxlZENvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXMpXG4gIC8vICAgICAgICAgICBpZiAoZW5yb2xsZWRDb3Vyc2UgJiYgZW5yb2xsZWRDb3Vyc2UuaXNzdWVkQ2VydGlmaWNhdGVzICYmXG4gIC8vICAgICAgICAgICAgIGVucm9sbGVkQ291cnNlLmlzc3VlZENlcnRpZmljYXRlcy5sZW5ndGgpIHtcbiAgLy8gICAgICAgICAgICAgY29uc3QgY2VydGlmaWNhdGU6IGFueSA9IGVucm9sbGVkQ291cnNlLmlzc3VlZENlcnRpZmljYXRlcy5zb3J0KChhOiBhbnksIGI6IGFueSkgPT5cbiAgLy8gICAgICAgICAgICAgICAgbmV3IERhdGUoYi5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkpXG4gIC8vICAgICAgICAgICAgIGNvbnN0IGNlcnRJZCA9IGNlcnRpZmljYXRlWzBdLmlkZW50aWZpZXJcbiAgLy8gICAgICAgICAgICAgdGhpcy5jZXJ0SWQgPSBjZXJ0SWRcbiAgLy8gICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAvLyAgICAgICAgICAgICAgIHRoaXMuY29udGVudFsnY2VydGlmaWNhdGVPYmonXSA9IHtcbiAgLy8gICAgICAgICAgICAgICAgIGNlcnRJZCxcbiAgLy8gICAgICAgICAgICAgICAgIGNlcnREYXRhOiAnJyxcbiAgLy8gICAgICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgIHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9IGVucm9sbGVkQ291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IDBcbiAgLy8gICAgICAgICAgIHRoaXMuY29udGVudC5jb21wbGV0aW9uU3RhdHVzID0gZW5yb2xsZWRDb3Vyc2Uuc3RhdHVzIHx8IDBcbiAgLy8gICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5jdW11bGF0aXZlVHJhY2tpbmcpIHtcbiAgLy8gICAgICAgICAgICAgYXdhaXQgdGhpcy50b2NTdmMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2VQcm9ncmFtKHRoaXMuY29udGVudCwgdGhpcy51c2VyRW5yb2xsbWVudExpc3QpXG4gIC8vICAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLnJlc3VtZURhdGEuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAvLyAgICAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgLy8gICAgICAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YSA9IHJlc1xuICAvLyAgICAgICAgICAgICAgICAgdGhpcy5nZXRMYXN0UGxheWVkUmVzb3VyY2UoKVxuICAvLyAgICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVJlc3VtZURhdGFMaW5rTmV3KClcbiAgLy8gICAgICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICAgIH0pXG5cbiAgLy8gICAgICAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgLy8gICAgICAgICAgICAgLy8gdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAvLyAgICAgICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICAgICAgdGhpcy5nZXRDb250aW51ZUxlYXJuaW5nRGF0YSh0aGlzLmNvbnRlbnQuaWRlbnRpZmllciwgZW5yb2xsZWRDb3Vyc2UuYmF0Y2hJZClcbiAgLy8gICAgICAgICAgICAgdGhpcy5jb250ZW50Wydjb21wbGV0aW9uUGVyY2VudGFnZSddID0gZW5yb2xsZWRDb3Vyc2UuY29tcGxldGlvblBlcmNlbnRhZ2VcbiAgLy8gICAgICAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgLy8gICAgICAgICAgICAgdGhpcy50b2NTdmMubWFwTW9kdWxlQ291bnQodGhpcy5jb250ZW50KVxuICAvLyAgICAgICAgICAgICAvLyB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICB0aGlzLmJhdGNoRGF0YSA9IHtcbiAgLy8gICAgICAgICAgICAgY29udGVudDogW2Vucm9sbGVkQ291cnNlLmJhdGNoXSxcbiAgLy8gICAgICAgICAgICAgZW5yb2xsZWQ6IHRydWUsXG4gIC8vICAgICAgICAgICB9XG4gIC8vICAgICAgICAgICB0aGlzLnRvY1N2Yy5zZXRCYXRjaERhdGEodGhpcy5iYXRjaERhdGEpXG4gIC8vICAgICAgICAgICB0aGlzLnRvY1N2Yy5nZXRTZWxlY3RlZEJhdGNoRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgLy8gICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcFNlc3Npb25Db21wbGV0aW9uUGVyY2VudGFnZSh0aGlzLmJhdGNoRGF0YSwgdGhpcy5yZXN1bWVEYXRhKVxuICAvLyAgICAgICAgICAgaWYgKHRoaXMuZ2V0QmF0Y2hJZCgpKSB7XG4gIC8vICAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxuICAvLyAgICAgICAgICAgICAgIFtdLFxuICAvLyAgICAgICAgICAgICAgIHtcbiAgLy8gICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gIC8vICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtczogeyBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSB9LFxuICAvLyAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXNIYW5kbGluZzogJ21lcmdlJyxcbiAgLy8gICAgICAgICAgICAgICB9KVxuICAvLyAgICAgICAgICAgfVxuICAvLyAgICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgICB0aGlzLnRvY1N2Yy5jaGVja01vZHVsZVdpc2VEYXRhKHRoaXMuY29udGVudClcbiAgLy8gICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUNvdW50KHRoaXMuY29udGVudClcbiAgLy8gICAgICAgICAgIC8vIEl0J3MgdW5kZXJzdG9vZCB0aGF0IHVzZXIgaXMgbm90IGFscmVhZHkgZW5yb2xsZWRcbiAgLy8gICAgICAgICAgIC8vIEZldGNoIHRoZSBhdmFpbGFibGUgYmF0Y2hlcyBhbmQgcHJlc2VudCB0byB1c2VyXG4gIC8vICAgICAgICAgICBpZiAodGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFXG4gIC8vICAgICAgICAgICAgIHx8IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlBST0dSQU0pIHtcbiAgLy8gICAgICAgICAgICAgLy8gRGlzYWJsaW5nIGF1dG8gZW5yb2xsbWVudCB0byBiYXRjaFxuICAvLyAgICAgICAgICAgICBpZiAodGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKSB7XG4gIC8vICAgICAgICAgICAgICAgdGhpcy5mZXRjaEJhdGNoRGV0YWlscygpXG4gIC8vICAgICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgICAgIHRoaXMuZmV0Y2hCYXRjaERldGFpbHMoKVxuICAvLyAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgdGhpcy50b2NTdmMuY2FsbEhpcmFyY2h5UHJvZ3Jlc3NIYXNobWFwKHRoaXMuY29udGVudClcbiAgLy8gICAgICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gIC8vICAgICAgICAgICAvLyB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gIC8vICAgICAgICAgfVxuICAvLyAgICAgICB9XG4gIC8vICAgICAgIC8vIGNvbnNvbGUubG9nKCdjYWxsaW5nIC0tLS0tLS0tLS0tLS0tLS0gPT09PT09PT09JylcbiAgLy8gICAgICAgLy8gdGhpcy5nZXRMYXN0UGxheWVkUmVzb3VyY2UoKVxuICAvLyAgICAgfSxcbiAgLy8gICAgIChlcnJvcjogYW55KSA9PiB7XG4gIC8vICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdDT05URU5UIEhJU1RPUlkgRkVUQ0ggRVJST1IgPicsIGVycm9yKVxuICAvLyAgICAgfSxcbiAgLy8gICApXG4gIC8vIH1cblxuICBwdWJsaWMgZmV0Y2hVc2VyV0ZGb3JCbGVuZGVkKCkge1xuICAgIGNvbnN0IGFwcGxpY2F0aW9uSWRzID0gKHRoaXMuYmF0Y2hEYXRhICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudC5tYXAoZSA9PiBlLmJhdGNoSWQpKSB8fCBbXVxuICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgIGFwcGxpY2F0aW9uSWRzLFxuICAgICAgc2VydmljZU5hbWU6ICdibGVuZGVkcHJvZ3JhbScsXG4gICAgICBsaW1pdDogMTAwLFxuICAgICAgb2Zmc2V0OiAwLFxuICAgIH1cblxuICAgIHRoaXMuY29udGVudFN2Yy5mZXRjaEJsZW5kZWRVc2VyV0YocmVxKS50aGVuKFxuICAgICAgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLnJlc3VsdCAmJiBkYXRhLnJlc3VsdC5kYXRhLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGxhdGVzdFdGID0gXy5tYXhCeShkYXRhLnJlc3VsdC5kYXRhWzBdLndmSW5mbywgKGVsOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShlbC5sYXN0VXBkYXRlZE9uKS5nZXRUaW1lKClcbiAgICAgICAgICB9KVxuICAgICAgICAgIC8vIGxhdGVzdFdGLmN1cnJlbnRTdGF0dXMgPSB0aGlzLldGQmxlbmRlZFByb2dyYW1TdGF0dXMuUkVKRUNURURcbiAgICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgICAgICB0aGlzLmJhdGNoRGF0YSEud29ya0Zsb3cgPSB7XG4gICAgICAgICAgICB3ZkluaXRpYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgICAgYmF0Y2g6IHRoaXMuYmF0Y2hEYXRhICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudC5maW5kKChlOiBhbnkpID0+IGUuYmF0Y2hJZCA9PT0gbGF0ZXN0V0YuYXBwbGljYXRpb25JZCksXG4gICAgICAgICAgICB3Zkl0ZW06IGxhdGVzdFdGLFxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLnRvY1N2Yy5zZXRXRkRhdGEodGhpcy5iYXRjaERhdGEpXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5pbmZvKCdmZXRjaEJsZW5kZWRVc2VyV0YgZGF0YSA9PSAnLCBkYXRhKVxuICAgICAgfSxcbiAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdDT05URU5UIEhJU1RPUlkgRkVUQ0ggRVJST1IgPicsIGVycm9yKVxuICAgICAgfSxcbiAgICApXG4gIH1cblxuICBwdWJsaWMgY2hlY2tJZkJhdGNoRXhpc3RzKGxhdGVzdDogYW55KSB7XG4gICAgaWYgKCF0aGlzLmJhdGNoRGF0YSB8fCAhdGhpcy5iYXRjaERhdGEuY29udGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLmJhdGNoRGF0YS5jb250ZW50LmZpbmQoYiA9PiBiLmJhdGNoSWQgPT09IGxhdGVzdC5iYXRjaElkKVxuICB9XG5cbiAgcHVibGljIGdldEJhdGNoSWQoKTogc3RyaW5nIHtcbiAgICBsZXQgYmF0Y2hJZCA9ICcnXG4gICAgaWYgKHRoaXMuYmF0Y2hEYXRhICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQpIHtcbiAgICAgIGZvciAoY29uc3QgYmF0Y2ggb2YgdGhpcy5iYXRjaERhdGEuY29udGVudCkge1xuICAgICAgICBiYXRjaElkID0gYmF0Y2guYmF0Y2hJZFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYmF0Y2hJZFxuICB9XG5cbiAgLy8gZG93bmxvYWRDZXJ0KGNlcnRJZEFycjogYW55KSB7XG4gIC8vICAgaWYgKGNlcnRJZEFyciAmJiBjZXJ0SWRBcnIubGVuZ3RoICYmIGNlcnRJZEFyci5sZW5ndGggPiAwKSB7XG4gIC8vICAgICBjZXJ0SWRBcnIuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IG5ldyBEYXRlKGIubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShhLmxhc3RJc3N1ZWRPbikuZ2V0VGltZSgpKVxuICAvLyAgICAgY29uc3QgY2VydElkID0gY2VydElkQXJyWzBdLmlkZW50aWZpZXJcbiAgLy8gICAgIHRoaXMuY2VydElkID0gY2VydElkXG5cbiAgLy8gICAgIHRoaXMuY29udGVudFN2Yy5kb3dubG9hZENlcnQoY2VydElkKS5zdWJzY3JpYmUocmVzcG9uc2UgPT4ge1xuICAvLyAgICAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gIC8vICAgICAgICAgdGhpcy5jb250ZW50WydjZXJ0aWZpY2F0ZU9iaiddID0ge1xuICAvLyAgICAgICAgICAgY2VydERhdGE6IHJlc3BvbnNlLnJlc3VsdC5wcmludFVyaSxcbiAgLy8gICAgICAgICAgIGNlcnRJZDogdGhpcy5jZXJ0SWQsXG4gIC8vICAgICAgICAgfVxuICAvLyAgICAgICB9XG4gIC8vICAgICB9KVxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIHB1YmxpYyBoYW5kbGVBdXRvQmF0Y2hBc3NpZ24oKSB7XG4gICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgdGhpcy5uYXZpZ2F0ZVRvUGxheWVyUGFnZSgnJylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gdHJ1ZVxuICAgICAgdGhpcy5jaGFuZ2VUYWIgPSAhdGhpcy5jaGFuZ2VUYWJcbiAgICAgIHRoaXMucmFpc2VFbnJvbGxUZWxlbWV0cnkoKVxuICAgICAgaWYgKHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQpIHtcbiAgICAgICAgdGhpcy5yYWlzZUVucm9sbFRlbGVtZW50cnlGb3JTYWtzaGFtQUlHZW5lcmF0ZWQoKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQpIHtcbiAgICAgICAgdGhpcy5yYWlzZUVucm9sbFRlbGVtZW50cnlGb3JTYWtzaGFtQUlHZW5lcmF0ZWQoKVxuICAgICAgfVxuICAgICAgY29uc3QgYmF0Y2hEYXRhID0gdGhpcy5jb250ZW50UmVhZERhdGEgJiYgdGhpcy5jb250ZW50UmVhZERhdGEuYmF0Y2hlcyAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5iYXRjaGVzWzBdXG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSkge1xuICAgICAgICB0aGlzLmF1dG9FbnJvbGxDdXJhdGVkUHJvZ3JhbShOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSwgYmF0Y2hEYXRhKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNKSB7XG4gICAgICAgIGxldCBtb2RlcmF0ZWRCYXRjaERhdGE6IGFueVxuICAgICAgICBpZiAodGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBtb2RlcmF0ZWRCYXRjaERhdGEgPSB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhICYmIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudCAmJiB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhLmNvbnRlbnRbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtb2RlcmF0ZWRCYXRjaERhdGEgPSB0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnRbMF1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF1dG9FbnJvbGxDdXJhdGVkUHJvZ3JhbShOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNLCBtb2RlcmF0ZWRCYXRjaERhdGEpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmF1dG9Bc3NpZ25FbnJvbGwoKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbnRlbnRWaWV3RXZlbnRGb3JOZXRDb3JlKCdlbnJvbGwnKVxuICB9XG5cbiAgcHVibGljIGF1dG9FbnJvbGxDdXJhdGVkUHJvZ3JhbShwcm9ncmFtVHlwZTogYW55LCBiYXRjaERhdGE6IGFueSkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcbiAgICAgIGxldCB1c2VySWQgPSAnJ1xuICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZCkge1xuICAgICAgICB1c2VySWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWRcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBwcm9ncmFtSWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICAgIC8vIGFzIG9mIG5vdyBjdXJhdGVkIHByb2dyYW0gb25seSBvbmUgYmF0Y2ggaXMgY29taW5nIG5lZWQgdG8gY2hlY2sgYW5kIG1vZGlmeVxuICAgICAgICAgIGJhdGNoSWQ6IGJhdGNoRGF0YS5iYXRjaElkLFxuICAgICAgICB9LFxuICAgICAgfVxuICAgICAgdGhpcy5jb250ZW50U3ZjLmF1dG9Bc3NpZ25DdXJhdGVkQmF0Y2hBcGkocmVxLCBwcm9ncmFtVHlwZSkuc3Vic2NyaWJlKFxuICAgICAgICAoZGF0YTogTnNDb250ZW50LklCYXRjaExpc3RSZXNwb25zZSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICBpZiAocHJvZ3JhbVR5cGUgPT09IE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX1BST0dSQU0gJiYgYmF0Y2hEYXRhLmVuZERhdGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5iYXRjaERhdGEgPSB7XG4gICAgICAgICAgICAgICAgY29udGVudDogW2JhdGNoRGF0YV0sXG4gICAgICAgICAgICAgICAgZW5yb2xsZWQ6IHRydWUsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgICAgICAgW10sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGJhdGNoSWQ6IGJhdGNoRGF0YS5iYXRjaElkIH0sXG4gICAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0VXNlckVucm9sbG1lbnRMaXN0KClcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgICAgICAgICAgICB9LCAyMDAwKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVRvUGxheWVyUGFnZShyZXEucmVxdWVzdC5iYXRjaElkKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKF9lcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coJ19lcnJvcicsIF9lcnJvcilcbiAgICAgICAgICAvLyBpZihfZXJyb3IgJiYgX2Vycm9yLmVycm9yICYmIF9lcnJvci5lcnJvci5wYXJhbXMgJiYgX2Vycm9yLmVycm9yLnBhcmFtcy5lcnIgJiYgX2Vycm9yLmVycm9yLnBhcmFtcy5lcnIuZXJybXNnKSB7XG4gICAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oXy5nZXQoX2Vycm9yLCAnZXJyb3IucGFyYW1zLmVycm1zZycpIHx8ICdQbGVhc2UgdHJ5IGFnYWluIGxhdGVyJyk7XG4gICAgICAgICAgLy8gfVxuICAgICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgYXV0b0Fzc2lnbkVucm9sbCgpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmMuYXV0b0Fzc2lnbkJhdGNoQXBpKHRoaXMuY29udGVudC5pZGVudGlmaWVyKS5zdWJzY3JpYmUoXG4gICAgICAgIChkYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5iYXRjaERhdGEgPSB7XG4gICAgICAgICAgICBjb250ZW50OiBkYXRhLmNvbnRlbnQsXG4gICAgICAgICAgICBlbnJvbGxlZDogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYmF0Y2hJZCA9IHRoaXMuZ2V0QmF0Y2hJZCgpXG4gICAgICAgICAgaWYgKGJhdGNoSWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb1BsYXllclBhZ2UoYmF0Y2hJZClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChfZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihfLmdldChfZXJyb3IsICdlcnJvci5wYXJhbXMuZXJybXNnJykgfHwgJ1BsZWFzZSB0cnkgYWdhaW4gbGF0ZXInKTtcbiAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgbmF2aWdhdGVUb1BsYXllclBhZ2UoYmF0Y2hJZDogc3RyaW5nKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gdHJ1ZVxuICAgICAgY29uc3QgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgICAgIGxldCBwcmltYXJ5Q2F0ZWdvcnlcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2VjdXJlU2V0dGluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSAnTGVhcm5pbmcgUmVzb3VyY2UnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSBmaXJzdFBsYXlhYmxlQ29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeVxuICAgICAgfVxuICAgICAgdGhpcy5maXJzdFJlc291cmNlTGluayA9IHZpZXdlclJvdXRlR2VuZXJhdG9yKFxuICAgICAgICBmaXJzdFBsYXlhYmxlQ29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICBmaXJzdFBsYXlhYmxlQ29udGVudC5taW1lVHlwZSxcbiAgICAgICAgdGhpcy5pc1Jlc291cmNlID8gdW5kZWZpbmVkIDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgIHRoaXMuaXNSZXNvdXJjZSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudC5jb250ZW50VHlwZSxcbiAgICAgICAgdGhpcy5mb3JQcmV2aWV3LFxuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnksXG4gICAgICAgIGJhdGNoSWQsXG4gICAgICApXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7dGhpcy5maXJzdFJlc291cmNlTGluay51cmx9YF0sIHsgcXVlcnlQYXJhbXM6IHsgLi4udGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtcywgZnJvbUFJVHV0b3I6IHRoaXMuZnJvbUFJVHV0b3IgfSB9KVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmZXRjaEJhdGNoRGV0YWlscygpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyKSB7XG4gICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgICBjb3Vyc2VJZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgICAgICBzdGF0dXM6IFsnMCcsICcxJywgJzInXSxcbiAgICAgICAgICAgIC8vIGNyZWF0ZWRCeTogJ2ZjYTI5MjVmLTFlZWUtNDY1NC05MTc3LWZlY2UzZmQ2YWZjOScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzb3J0X2J5OiB7IGNyZWF0ZWREYXRlOiAnZGVzYycgfSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudFN2Yy5mZXRjaENvdXJzZUJhdGNoZXMocmVxKS5zdWJzY3JpYmUoXG4gICAgICAgIChkYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5iYXRjaERhdGEgPSBkYXRhXG4gICAgICAgICAgdGhpcy5iYXRjaERhdGEuZW5yb2xsZWQgPSBmYWxzZVxuICAgICAgICAgIHRoaXMudG9jU3ZjLnNldEJhdGNoRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgICBpZiAodGhpcy5nZXRCYXRjaElkKCkpIHtcbiAgICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxuICAgICAgICAgICAgICBbXSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICAgICAgICAgICAgLy8gcXVlcnlQYXJhbXM6IHsgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCkgfSxcbiAgICAgICAgICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignQ09OVEVOVCBISVNUT1JZIEZFVENIIEVSUk9SID4nLCBlcnJvcilcbiAgICAgICAgfSxcbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRpbnVlTGVhcm5pbmdEYXRhKGNvbnRlbnRJZDogc3RyaW5nLCBiYXRjaElkPzogc3RyaW5nKSB7XG4gICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgdGhpcy5yZXN1bWVEYXRhID0gbnVsbFxuICAgIGxldCB1c2VySWRcbiAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUpIHtcbiAgICAgIHVzZXJJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJ1xuICAgIH1cblxuICAgIGNvbnN0IHJlcTogTnNDb250ZW50LklDb250aW51ZUxlYXJuaW5nRGF0YVJlcSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgYmF0Y2hJZCxcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBjb3Vyc2VJZDogY29udGVudElkIHx8ICcnLFxuICAgICAgICBjb250ZW50SWRzOiBbXSxcbiAgICAgICAgZmllbGRzOiBbJ3Byb2dyZXNzZGV0YWlscyddLFxuICAgICAgfSxcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSkge1xuICAgICAgdGhpcy5jb250ZW50U3ZjLmZldGNoQ29udGVudEhpc3RvcnlWMihyZXEpLnN1YnNjcmliZShcbiAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5yZXN1bHQgJiYgZGF0YS5yZXN1bHQuY29udGVudExpc3QgJiYgZGF0YS5yZXN1bHQuY29udGVudExpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wUmVzdW1lRGF0YSA9IF8uZ2V0KGRhdGEsICdyZXN1bHQuY29udGVudExpc3QnKVxuICAgICAgICAgICAgdGhpcy5yZXN1bWVEYXRhID0gXy5tYXAodGVtcFJlc3VtZURhdGEsIHJyID0+IHtcbiAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gXy5maWx0ZXIoZmxhdHRlbkl0ZW1zKF8uZ2V0KHRoaXMuY29udGVudCwgJ2NoaWxkcmVuJykgfHwgW10sICdjaGlsZHJlbicpLCB7ICdpZGVudGlmaWVyJzogcnIuY29udGVudElkLCBwcmltYXJ5Q2F0ZWdvcnk6ICdMZWFybmluZyBSZXNvdXJjZScgfSlcbiAgICAgICAgICAgICAgXy5zZXQocnIsICdwcm9ncmVzc2RldGFpbHMubWltZVR5cGUnLCBfLmdldChfLmZpcnN0KGl0ZW1zKSwgJ21pbWVUeXBlJykpXG4gICAgICAgICAgICAgIGlmICghXy5nZXQocnIsICdjb21wbGV0aW9uUGVyY2VudGFnZScpKSB7XG4gICAgICAgICAgICAgICAgaWYgKF8uZ2V0KHJyLCAnc3RhdHVzJykgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgIF8uc2V0KHJyLCAnY29tcGxldGlvblBlcmNlbnRhZ2UnLCAxMDApXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIF8uc2V0KHJyLCAnY29tcGxldGlvblBlcmNlbnRhZ2UnLCAwKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gcnJcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IF8ubWFwKHRoaXMucmVzdW1lRGF0YSwgJ2NvbXBsZXRpb25QZXJjZW50YWdlJylcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsQ291bnQgPSBfLnRvSW50ZWdlcihfLmdldCh0aGlzLmNvbnRlbnQsICdsZWFmTm9kZXNDb3VudCcpKSB8fCAxXG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3MubGVuZ3RoIDwgdG90YWxDb3VudCkge1xuICAgICAgICAgICAgICBjb25zdCBkaWZmID0gdG90YWxDb3VudCAtIHByb2dyZXNzLmxlbmd0aFxuICAgICAgICAgICAgICBpZiAoZGlmZikge1xuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICAgIF8uZWFjaChuZXcgQXJyYXkoZGlmZiksICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHByb2dyZXNzLnB1c2goMClcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKVxuICAgICAgICAgICAgdGhpcy50b2NTdmMudXBkYXRlUmVzdW1hRGF0YSh0aGlzLnJlc3VtZURhdGEpXG4gICAgICAgICAgICAvLyB0aGlzLnRvY1N2Yy5tYXBNb2R1bGVEdXJhdGlvbkFuZFByb2dyZXNzKHRoaXMuY29udGVudCwgdGhpcy5jb250ZW50KVxuICAgICAgICAgICAgdGhpcy5nZXRMYXN0UGxheWVkUmVzb3VyY2UoKVxuICAgICAgICAgICAgdGhpcy50b2NTdmMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2UodGhpcy5jb250ZW50LCB0aGlzLnJlc3VtZURhdGEpXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAodGhpcy5jb250ZW50KVxuICAgICAgICAgICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VtZURhdGEgPSBudWxsXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAodGhpcy5jb250ZW50KVxuICAgICAgICAgICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY29udGVudFN2Yy5zZXRQcm9ncmFtQ2hpbGRSZXN1bWVEYXRhKHRoaXMucmVzdW1lRGF0YSwgY29udGVudElkKVxuICAgICAgICB9LFxuICAgICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdDT05URU5UIEhJU1RPUlkgRkVUQ0ggRVJST1IgPicsIGVycm9yKVxuICAgICAgICB9LFxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKSB7XG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YSAmJiB0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGxldCByZXN1bWVEYXRhVjI6IGFueVxuICAgICAgaWYgKHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSB7XG4gICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KCdzdGFydCcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgpXG4gICAgICB9XG4gICAgICBpZiAoIXJlc3VtZURhdGFWMi5taW1lVHlwZSkge1xuICAgICAgICByZXN1bWVEYXRhVjIubWltZVR5cGUgPSB0aGlzLnRvY1N2Yy5nZXRNaW1lVHlwZSh0aGlzLmNvbnRlbnQsIHJlc3VtZURhdGFWMi5pZGVudGlmaWVyKVxuICAgICAgfVxuICAgICAgdGhpcy5yZXN1bWVEYXRhTGluayA9IHZpZXdlclJvdXRlR2VuZXJhdG9yKFxuICAgICAgICByZXN1bWVEYXRhVjIuaWRlbnRpZmllcixcbiAgICAgICAgcmVzdW1lRGF0YVYyLm1pbWVUeXBlLFxuICAgICAgICB0aGlzLmlzUmVzb3VyY2UgPyB1bmRlZmluZWQgOiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllcixcbiAgICAgICAgdGhpcy5pc1Jlc291cmNlID8gdW5kZWZpbmVkIDogdGhpcy5jb250ZW50LmNvbnRlbnRUeXBlLFxuICAgICAgICB0aGlzLmZvclByZXZpZXcsXG4gICAgICAgICdMZWFybmluZyBSZXNvdXJjZScsXG4gICAgICAgIHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgICB0aGlzLmNvbnRlbnQubmFtZSxcbiAgICAgIClcbiAgICAgIHRoaXMuYWN0aW9uU1ZDLnNldFVwZGF0ZUNvbXBHcm91cE8gPSB0aGlzLnJlc3VtZURhdGFMaW5rXG4gICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICB9XG4gIH1cblxuICBzY3JvbGxUb1RvcCgpIHtcbiAgICAoZnVuY3Rpb24gc21vb3Roc2Nyb2xsKCkge1xuICAgICAgY29uc3QgY3VycmVudFNjcm9sbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3BcbiAgICAgIGlmIChjdXJyZW50U2Nyb2xsID4gMCkge1xuICAgICAgICAvLyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHNtb290aHNjcm9sbClcbiAgICAgICAgLy8gd2luZG93LnNjcm9sbFRvKDAsIGN1cnJlbnRTY3JvbGwgLSAoY3VycmVudFNjcm9sbCAvIDUpKVxuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSkoKVxuICB9XG5cbiAgcHVibGljIGdldENvbXBldGVuY2llcyhjb21wZXRlbmNpZXM6IGFueSkge1xuICAgIGNvbnN0IGNvbXBldGVuY2llc0FycmF5ID0gSlNPTi5wYXJzZShjb21wZXRlbmNpZXMpXG4gICAgY29uc3QgY29tcGV0ZW5jeVN0cmluZ0FycmF5OiBhbnlbXSA9IFtdXG4gICAgY29tcGV0ZW5jaWVzQXJyYXkubWFwKChjOiBhbnkpID0+IHtcbiAgICAgIGNvbXBldGVuY3lTdHJpbmdBcnJheS5wdXNoKGMubmFtZSlcbiAgICB9KVxuICAgIHJldHVybiBjb21wZXRlbmN5U3RyaW5nQXJyYXlcbiAgfVxuXG4gIGdldCBzaG93SW50cmFuZXRNc2coKSB7XG4gICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3dJbnRyYW5ldE1lc3NhZ2VcbiAgfVxuXG4gIGdldCBzaG93U3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9jU3ZjLnNob3dTdGFydEJ1dHRvbih0aGlzLmNvbnRlbnQpXG4gIH1cblxuICBnZXQgaXNQb3N0QXNzZXNzbWVudCgpOiBib29sZWFuIHtcbiAgICBpZiAoISh0aGlzLnRvY0NvbmZpZyAmJiB0aGlzLnRvY0NvbmZpZy5wb3N0QXNzZXNzbWVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiZcbiAgICAgICAgdGhpcy5jb250ZW50LmxlYXJuaW5nTW9kZSA9PT0gJ0luc3RydWN0b3ItTGVkJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBpc01vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51dGlsaXR5U3ZjLmlzTW9iaWxlXG4gIH1cblxuICBnZXQgc2hvd1N1YnRpdGxlT25CYW5uZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9jU3ZjLnN1YnRpdGxlT25CYW5uZXJzXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRW5yb2xsbWVudEVuZERhdGUoYmF0Y2g6IGFueSkge1xuICAgIGNvbnN0IGVucm9sbG1lbnRFbmREYXRlID0gZGF5anMoXy5nZXQoYmF0Y2gsICdlbnJvbGxtZW50RW5kRGF0ZScpKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgIGNvbnN0IHN5c3RlbURhdGUgPSBkYXlqcygpXG4gICAgcmV0dXJuIGVucm9sbG1lbnRFbmREYXRlID8gZGF5anMoZW5yb2xsbWVudEVuZERhdGUpLmlzQmVmb3JlKHN5c3RlbURhdGUpIDogZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgb3BlblNuYWNrYmFyKHByaW1hcnlNc2c6IHN0cmluZywgZHVyYXRpb246IG51bWJlciA9IDUwMDApIHtcbiAgICB0aGlzLnNuYWNrQmFyLm9wZW4ocHJpbWFyeU1zZywgJ1gnLCB7XG4gICAgICBkdXJhdGlvbixcbiAgICB9KVxuICB9XG5cbiAgZ2V0IHNob3dJbnN0cnVjdG9yTGVkTXNnKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnNob3dBY3Rpb25CdXR0b25zICYmXG4gICAgICB0aGlzLmNvbnRlbnQgJiZcbiAgICAgIHRoaXMuY29udGVudC5sZWFybmluZ01vZGUgPT09ICdJbnN0cnVjdG9yLUxlZCcgJiZcbiAgICAgICF0aGlzLmNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAhdGhpcy5jb250ZW50LmFydGlmYWN0VXJsXG4gICAgKVxuICB9XG5cbiAgZ2V0IGlzSGVhZGVySGlkZGVuKCkge1xuICAgIHJldHVybiB0aGlzLmlzUmVzb3VyY2UgJiYgdGhpcy5jb250ZW50ICYmICF0aGlzLmNvbnRlbnQuYXJ0aWZhY3RVcmwubGVuZ3RoXG4gIH1cblxuICBnZXQgc2hvd0FjdGlvbkJ1dHRvbnMoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWN0aW9uQnRuU3RhdHVzICE9PSAnd2FpdCcgJiZcbiAgICAgIHRoaXMuY29udGVudCAmJlxuICAgICAgdGhpcy5jb250ZW50LnN0YXR1cyAhPT0gJ0RlbGV0ZWQnICYmXG4gICAgICB0aGlzLmNvbnRlbnQuc3RhdHVzICE9PSAnRXhwaXJlZCdcbiAgICApXG4gIH1cblxuICBnZXQgc2hvd0J1dHRvbkNvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgPT09ICdncmFudCcgJiZcbiAgICAgICEodGhpcy5pc01vYmlsZSAmJiB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlzSW5JbnRyYW5ldCkgJiZcbiAgICAgICEoXG4gICAgICAgIHRoaXMuY29udGVudCAmJlxuICAgICAgICB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUgPT09ICdDb3Vyc2UnICYmXG4gICAgICAgIHRoaXMuY29udGVudC5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgIXRoaXMuY29udGVudC5hcnRpZmFjdFVybFxuICAgICAgKSAmJlxuICAgICAgISh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvbnRlbnRUeXBlID09PSAnUmVzb3VyY2UnICYmICF0aGlzLmNvbnRlbnQuYXJ0aWZhY3RVcmwpXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXN1bWVEYXRhRnJvbUxpc3QodHlwZT86IHN0cmluZyk6IGFueSB8IHZvaWQge1xuICAgIGNvbnN0IHJlc3VtZUNvcHkgPSBbLi4udGhpcy5yZXN1bWVEYXRhXVxuICAgIGlmIChyZXN1bWVDb3B5ICYmIHJlc3VtZUNvcHkubGVuZ3RoKSB7XG4gICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuXG4gICAgICAgIGNvbnN0IGxhc3RJdGVtID0gcmVzdW1lQ29weSAmJiByZXN1bWVDb3B5LnNvcnQoKGE6IGFueSwgYjogYW55KSA9PlxuICAgICAgICAgIG5ldyBEYXRlKGIubGFzdEFjY2Vzc1RpbWUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEubGFzdEFjY2Vzc1RpbWUpLmdldFRpbWUoKSkuc2hpZnQoKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkZW50aWZpZXI6IGxhc3RJdGVtLmNvbnRlbnRJZCxcbiAgICAgICAgICBtaW1lVHlwZTogbGFzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzICYmIGxhc3RJdGVtLnByb2dyZXNzZGV0YWlscy5taW1lVHlwZSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZmlyc3RJdGVtID0gcmVzdW1lQ29weSAmJiByZXN1bWVDb3B5Lmxlbmd0aCAmJiByZXN1bWVDb3B5WzBdXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZGVudGlmaWVyOiBmaXJzdEl0ZW0uY29udGVudElkLFxuICAgICAgICBtaW1lVHlwZTogZmlyc3RJdGVtLnByb2dyZXNzZGV0YWlscyAmJiBmaXJzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzLm1pbWVUeXBlLFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIHByaXZhdGUgbW9kaWZ5U2Vuc2libGVDb250ZW50UmF0aW5nKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29udGVudCAmJlxuICAgICAgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgJiZcbiAgICAgIHR5cGVvZiB0aGlzLmNvbnRlbnQuYXZlcmFnZVJhdGluZyAhPT0gJ251bWJlcidcbiAgICApIHtcbiAgICAgIHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nID0gKHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nIGFzIGFueSlbdGhpcy5jb25maWdTdmMucm9vdE9yZyB8fCAnJ11cbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQudG90YWxSYXRpbmcgJiYgdHlwZW9mIHRoaXMuY29udGVudC50b3RhbFJhdGluZyAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuY29udGVudC50b3RhbFJhdGluZyA9ICh0aGlzLmNvbnRlbnQudG90YWxSYXRpbmcgYXMgYW55KVt0aGlzLmNvbmZpZ1N2Yy5yb290T3JnIHx8ICcnXVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGVhcm5pbmdVcmxzKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuaXNQcmFjdGljZVZpc2libGUgPSBCb29sZWFuKFxuICAgICAgICB0aGlzLnRvY1N2Yy5maWx0ZXJUb2ModGhpcy5jb250ZW50LCBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LlBSQUNUSUNFKSxcbiAgICAgIClcblxuICAgICAgdGhpcy5pc0Fzc2Vzc1Zpc2libGUgPSBCb29sZWFuKFxuICAgICAgICB0aGlzLnRvY1N2Yy5maWx0ZXJUb2ModGhpcy5jb250ZW50LCBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LkFTU0VTUyksXG4gICAgICApXG5cbiAgICAgIGNvbnN0IGZpcnN0UGxheWFibGVDb250ZW50ID0gdGhpcy5jb250ZW50U3ZjLmdldEZpcnN0Q2hpbGRJbkhpZXJhcmNoeSh0aGlzLmNvbnRlbnQpXG4gICAgICBsZXQgcHJpbWFyeUNhdGVnb3J5XG4gICAgICBpZiAodGhpcy5jb250ZW50LnNlY3VyZVNldHRpbmdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5ID0gJ0xlYXJuaW5nIFJlc291cmNlJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5ID0gZmlyc3RQbGF5YWJsZUNvbnRlbnQucHJpbWFyeUNhdGVnb3J5IHx8IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnlcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlyc3RSZXNvdXJjZUxpbmsgPSB2aWV3ZXJSb3V0ZUdlbmVyYXRvcihcbiAgICAgICAgZmlyc3RQbGF5YWJsZUNvbnRlbnQuaWRlbnRpZmllcixcbiAgICAgICAgZmlyc3RQbGF5YWJsZUNvbnRlbnQubWltZVR5cGUsXG4gICAgICAgIHRoaXMuaXNSZXNvdXJjZSA/IHVuZGVmaW5lZCA6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICB0aGlzLmlzUmVzb3VyY2UgPyB1bmRlZmluZWQgOiB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUsXG4gICAgICAgIHRoaXMuZm9yUHJldmlldyxcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5LFxuICAgICAgICB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgIClcblxuICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG5cbiAgICAgIGlmIChmaXJzdFBsYXlhYmxlQ29udGVudC5vcHRpb25hbFJlYWRpbmcgJiYgZmlyc3RQbGF5YWJsZUNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUmVzb3VyY2UnKSB7XG4gICAgICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3MoMiwgZmlyc3RQbGF5YWJsZUNvbnRlbnQuaWRlbnRpZmllcilcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzc2lnblBhdGhBbmRVcGRhdGVCYW5uZXIodXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXRoID0gdXJsLnNwbGl0KCcvJykucG9wKClcbiAgICBpZiAocGF0aCAmJiB0aGlzLnZhbGlkUGF0aHMuaGFzKHBhdGgpKSB7XG4gICAgICB0aGlzLnJvdXRlUGF0aCA9IHBhdGhcbiAgICAgIHRoaXMudXBkYXRlQmFubmVyVXJsKClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUJhbm5lclVybCgpIHtcbiAgICBpZiAodGhpcy5iYW5uZXJzKSB7XG4gICAgICB0aGlzLmJhbm5lclVybCA9IHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShcbiAgICAgICAgYHVybCgke3RoaXMuYmFubmVyc1t0aGlzLnJvdXRlUGF0aF19KWAsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcGxheUludHJvVmlkZW8oKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5kaWFsb2cub3BlbihBcHBUb2NEaWFsb2dJbnRyb1ZpZGVvQ29tcG9uZW50LCB7XG4gICAgICAgIGRhdGE6IHRoaXMuY29udGVudC5pbnRyb2R1Y3RvcnlWaWRlbyxcbiAgICAgICAgaGVpZ2h0OiAnMzUwcHgnLFxuICAgICAgICB3aWR0aDogJzYyMHB4JyxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZ2V0IHNhbml0aXplZEludHJvZHVjdG9yeVZpZGVvSWNvbigpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pbnRyb2R1Y3RvcnlWaWRlb0ljb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoYHVybCgke3RoaXMuY29udGVudC5pbnRyb2R1Y3RvcnlWaWRlb0ljb259KWApXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBwcml2YXRlIGZldGNoRXh0ZXJuYWxDb250ZW50QWNjZXNzKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnJlZ2lzdHJhdGlvblVybCkge1xuICAgICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgdGhpcy5leHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1cyA9ICdmZXRjaGluZydcbiAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gZmFsc2VcbiAgICAgICAgdGhpcy50b2NTdmMuZmV0Y2hFeHRlcm5hbENvbnRlbnRBY2Nlc3ModGhpcy5jb250ZW50LmlkZW50aWZpZXIpLnN1YnNjcmliZShcbiAgICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXh0ZXJuYWxDb250ZW50RmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJGb3JFeHRlcm5hbCA9IGRhdGEuaGFzQWNjZXNzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBfZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1cyA9ICdkb25lJ1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gZmFsc2VcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzID0gJ2RvbmUnXG4gICAgICAgIHRoaXMucmVnaXN0ZXJGb3JFeHRlcm5hbCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRSYXRpbmdJY29uKHJhdGluZ0luZGV4OiBudW1iZXIpOiAnc3RhcicgfCAnc3Rhcl9ib3JkZXInIHwgJ3N0YXJfaGFsZicge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcpIHtcbiAgICAgIGNvbnN0IGF2Z1JhdGluZyA9IHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nXG4gICAgICBjb25zdCByYXRpbmdGbG9vciA9IE1hdGguZmxvb3IoYXZnUmF0aW5nKVxuICAgICAgaWYgKHJhdGluZ0luZGV4IDw9IHJhdGluZ0Zsb29yKSB7XG4gICAgICAgIHJldHVybiAnc3RhcidcbiAgICAgIH1cbiAgICAgIGlmIChyYXRpbmdGbG9vciA9PT0gcmF0aW5nSW5kZXggLSAxICYmIGF2Z1JhdGluZyAlIDEgPiAwKSB7XG4gICAgICAgIHJldHVybiAnc3Rhcl9oYWxmJ1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJ3N0YXJfYm9yZGVyJ1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1JlZ2lzdHJhdGlvblN0YXR1cygpIHtcbiAgICBjb25zdCBzb3VyY2UgPSAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5zb3VyY2VTaG9ydE5hbWUpIHx8ICcnXG4gICAgaWYgKFxuICAgICAgIXRoaXMuZm9yUHJldmlldyAmJlxuICAgICAgIXRoaXMuaXNSZWdpc3RyYXRpb25TdXBwb3J0ZWQgJiZcbiAgICAgIHRoaXMuY2hlY2tSZWdpc3RyYXRpb25Tb3VyY2VzLmhhcyhzb3VyY2UpXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmNcbiAgICAgICAgLmdldFJlZ2lzdHJhdGlvblN0YXR1cyhzb3VyY2UpXG4gICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5oYXNBY2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnRuU3RhdHVzID0gJ2dyYW50J1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbkJ0blN0YXR1cyA9ICdyZWplY3QnXG4gICAgICAgICAgICBpZiAocmVzLnJlZ2lzdHJhdGlvblVybCAmJiB0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50LnJlZ2lzdHJhdGlvblVybCA9IHJlcy5yZWdpc3RyYXRpb25VcmxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChfZXJyID0+IHsgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgPSAnZ3JhbnQnXG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVRdWVyeSh0eXBlOiAnUkVTVU1FJyB8ICdTVEFSVF9PVkVSJyB8ICdTVEFSVCcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodGhpcy5maXJzdFJlc291cmNlTGluayAmJiAodHlwZSA9PT0gJ1NUQVJUJyB8fCB0eXBlID09PSAnU1RBUlRfT1ZFUicpKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgdmlld01vZGU6IHR5cGUsXG4gICAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXG4gICAgICAgICAgY29sbGVjdGlvblR5cGU6IHRoaXMuY29udGV4dFBhdGgsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcbiAgICAgIH1cbiAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5jaGFubmVsSWQsXG4gICAgICB9XG4gICAgICByZXR1cm4gcVBhcmFtc1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc3VtZURhdGFMaW5rICYmIHR5cGUgPT09ICdSRVNVTUUnKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5yZXN1bWVEYXRhTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICAgIHZpZXdNb2RlOiAnUkVTVU1FJyxcbiAgICAgICAgLy8gY291cnNlTmFtZTogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50Lm5hbWUgOiAnJyxcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRleHRJZCAmJiB0aGlzLmNvbnRleHRQYXRoKSB7XG4gICAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgICBjb2xsZWN0aW9uSWQ6IHRoaXMuY29udGV4dElkLFxuICAgICAgICAgIGNvbGxlY3Rpb25UeXBlOiB0aGlzLmNvbnRleHRQYXRoLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgIGRlbGV0ZSBxUGFyYW1zLnZpZXdNb2RlXG4gICAgICB9XG4gICAgICBxUGFyYW1zID0ge1xuICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbElkLFxuICAgICAgfVxuICAgICAgcmV0dXJuIHFQYXJhbXNcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgIHZpZXdNb2RlOiB0eXBlLFxuICAgIH1cbiAgfVxuXG4gIGdldCBpc0luSUZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gd2luZG93LnNlbGYgIT09IHdpbmRvdy50b3BcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIG9wZW5GZWVkYmFja0RpYWxvZyhjb250ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbnRlbnRSYXRpbmdWMkRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc3NjhweCcsXG4gICAgICBkYXRhOiB7IGNvbnRlbnQsIHVzZXJJZDogdGhpcy51c2VySWQsIHVzZXJSYXRpbmc6IHRoaXMudXNlclJhdGluZyB9LFxuICAgIH0pXG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuZ2V0VXNlclJhdGluZyh0cnVlKVxuICAgICAgICAvLyB0aGlzLmdldFVzZXJFbnJvbGxtZW50TGlzdCgpXG4gICAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgICAgIHRoaXMucmVzZXRSYXRpbmdzU2VydmljZS5zZXRSYXRpbmdTZXJ2aWNlVXBkYXRlKHRydWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHVwZGF0ZVByb2dyZXNzKHN0YXR1czogbnVtYmVyLCByZXNvdXJjZUlkOiBhbnkpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uSWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtcy5pZCA/XG4gICAgICB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtcy5pZCA6ICcnXG4gICAgY29uc3QgYmF0Y2hJZCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuYmF0Y2hJZCA/XG4gICAgICB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLmJhdGNoSWQgOiAnJ1xuICAgIGNvbnN0IGlzUHJlQXNzZXNzbWVudCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMucHJlQXNzZXNzbWVudFxuICAgIGlmKGlzUHJlQXNzZXNzbWVudCkge1xuICAgICAgICByZXR1cm4gdGhpcy52aWV3ZXJTdmNcbiAgICAgICAgICAucmVhbFRpbWVQcm9ncmVzc1VwZGF0ZUZvclByZUFzc2Vzc21lbnRRdWl6KHJlc291cmNlSWQsICBzdGF0dXMpXG4gICAgICBcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmlld2VyU3ZjLnJlYWxUaW1lUHJvZ3Jlc3NVcGRhdGVRdWl6KHJlc291cmNlSWQsIGNvbGxlY3Rpb25JZCwgYmF0Y2hJZCwgc3RhdHVzKVxuICB9XG5cbiAgZ2V0UHJvZ3JhbUR1cmF0aW9uKGJhdGNoRGF0YTogYW55KSB7XG4gICAgaWYgKGJhdGNoRGF0YSkge1xuICAgICAgY29uc3Qgc3RhcnREYXRlID0gZGF5anMoZGF5anMoYmF0Y2hEYXRhLnN0YXJ0RGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJykpXG4gICAgICBjb25zdCBlbmREYXRlID0gZGF5anMoZGF5anMoYmF0Y2hEYXRhLmVuZERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpKVxuICAgICAgLy8gYWRkaW5nIDEgdG8gaW5jbHVkZSB0aGUgc3RhcnQgZGF0ZVxuICAgICAgcmV0dXJuIChlbmREYXRlLmRpZmYoc3RhcnREYXRlLCAnZGF5cycpICsgMSlcbiAgICB9XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICB3aXRoZHJhd09yRW5yb2xsKGRhdGE6IHN0cmluZykge1xuICAgIGlmIChkYXRhID09PSBOc0NvbnRlbnQuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5JTklUSUFURSkge1xuICAgICAgdGhpcy5mZXRjaFVzZXJXRkZvckJsZW5kZWQoKVxuICAgIH1cbiAgfVxuXG4gIGdldFNlcnZlckRhdGVUaW1lKCkge1xuICAgIHRoaXMudG9jU3ZjLmdldFNlcnZlckRhdGUoKS5zdWJzY3JpYmUoKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZS5zeXN0ZW1EYXRlKSB7XG4gICAgICAgIHRoaXMudG9jU3ZjLmNoYW5nZVNlcnZlckRhdGUocmVzcG9uc2Uuc3lzdGVtRGF0ZSlcbiAgICAgICAgdGhpcy50b2NTdmMuY2hhbmdlU2VydmVyRGF0ZShyZXNwb25zZS5zeXN0ZW1EYXRlKVxuICAgICAgICB0aGlzLnNlcnZlckRhdGUgPSByZXNwb25zZS5zeXN0ZW1EYXRlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRvY1N2Yy5jaGFuZ2VTZXJ2ZXJEYXRlKG5ldyBEYXRlKCkuZ2V0VGltZSgpKVxuICAgICAgfVxuICAgICAgdGhpcy5maW5kQUNQQigpXG4gICAgICB0aGlzLmdldEthcm1hcG9pbnRzTGltaXQoKVxuICAgIH0sIChfZXJyOiBhbnkpID0+IHtcbiAgICAgIHRoaXMudG9jU3ZjLmNoYW5nZVNlcnZlckRhdGUobmV3IERhdGUoKS5nZXRUaW1lKCkpXG4gICAgfSlcbiAgfVxuXG4gIGhhbmRsZUNhcGl0YWxpemUoc3RyOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9ICcnXG4gICAgaWYgKHN0cikge1xuICAgICAgaWYgKHR5cGUgPT09ICduYW1lJykge1xuICAgICAgICByZXR1cm5WYWx1ZSA9IHN0ci5zcGxpdCgnICcpLm1hcChfc3RyID0+IHtcbiAgICAgICAgICByZXR1cm4gX3N0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIF9zdHIuc2xpY2UoMSlcbiAgICAgICAgfSkuam9pbignICcpXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIHJldHVyblZhbHVlID0gc3RyICYmIChzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZVxuICB9XG5cbiAgcHVibGljIGhhbmRsZVBhcnNlSnNvbkRhdGEoczogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZFN0cmluZyA9IEpTT04ucGFyc2UocylcbiAgICAgIHJldHVybiBwYXJzZWRTdHJpbmdcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU5hdmlnYXRlVG9SZXZpZXdzKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnRUb1ZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aWV3Q29udGFpbmVyJykgYXMgYW55XG5cbiAgICBpZiAoZWxlbWVudFRvVmlldykge1xuICAgICAgd2luZG93LnNjcm9sbFRvKHtcbiAgICAgICAgdG9wOiBlbGVtZW50VG9WaWV3Lm9mZnNldFRvcCxcbiAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByYWlzZUNlcnRJbnRyZWFjdFRlbGVtZXRyeSgpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiBXc0V2ZW50cy5FbnVtSW50ZXJhY3RUeXBlcy5DTElDSyxcbiAgICAgICAgaWQ6ICd2aWV3LWNlcnRpZmljYXRlJyxcbiAgICAgICAgc3ViVHlwZTogV3NFdmVudHMuRW51bUludGVyYWN0U3ViVHlwZXMuQ0VSVElGSUNBVEUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogdGhpcy5jZXJ0SWQsICAgLy8gaWQgb2YgdGhlIGNlcnRpZmljYXRlXG4gICAgICAgIHR5cGU6IFdzRXZlbnRzLkVudW1JbnRlcmFjdFN1YlR5cGVzLkNFUlRJRklDQVRFLFxuICAgICAgfSlcbiAgfVxuXG4gIHRyYW5zbGF0ZUxhYmVscyhsYWJlbDogc3RyaW5nLCB0eXBlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5sYW5ndHJhbnNsYXRpb25zLnRyYW5zbGF0ZUxhYmVsKGxhYmVsLCB0eXBlLCAnJylcbiAgfVxuXG4gIC8vIGNoZWNrTW9kdWxlV2lzZURhdGEoKSB7XG4gIC8vICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY2hpbGRyZW4pIHtcbiAgLy8gICAgIHRoaXMuY29udGVudC5jaGlsZHJlbi5mb3JFYWNoKChlbGU6IGFueSkgPT4ge1xuICAvLyAgICAgICBpZiAoZWxlLnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuTU9EVUxFKSB7XG4gIC8vICAgICAgICAgbGV0IG1vZHVsZVJlc291cnNlQ291bnQgPSAwXG4gIC8vICAgICAgICAgbGV0IG9mZmxpbmVSZXNvdXJzZUNvdW50ID0gMFxuICAvLyAgICAgICAgIGVsZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZEVsZTogYW55KSA9PiB7XG4gIC8vICAgICAgICAgICBpZiAoY2hpbGRFbGUucHJpbWFyeUNhdGVnb3J5ICE9PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5PRkZMSU5FX1NFU1NJT04pIHtcbiAgLy8gICAgICAgICAgICAgbW9kdWxlUmVzb3Vyc2VDb3VudCA9IG1vZHVsZVJlc291cnNlQ291bnQgKyAxXG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAgICAgICBvZmZsaW5lUmVzb3Vyc2VDb3VudCA9IG9mZmxpbmVSZXNvdXJzZUNvdW50ICsgMVxuICAvLyAgICAgICAgICAgfVxuICAvLyAgICAgICAgIH0pXG4gIC8vICAgICAgICAgZWxlWydtb2R1bGVSZXNvdXJzZUNvdW50J10gPSBtb2R1bGVSZXNvdXJzZUNvdW50XG4gIC8vICAgICAgICAgZWxlWydvZmZsaW5lUmVzb3Vyc2VDb3VudCddID0gb2ZmbGluZVJlc291cnNlQ291bnRcbiAgLy8gICAgICAgfVxuICAvLyAgICAgfSlcbiAgLy8gICB9XG4gIC8vIH1cblxuICBnZXRMYXN0UGxheWVkUmVzb3VyY2UoKSB7XG4gICAgbGV0IGZpcnN0UGxheWFibGVDb250ZW50XG4gICAgbGV0IHJlc3VtZURhdGFWMjogYW55XG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YSAmJiB0aGlzLnJlc3VtZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgnc3RhcnQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdW1lRGF0YVYyID0gdGhpcy5nZXRSZXN1bWVEYXRhRnJvbUxpc3QoKVxuICAgICAgfVxuICAgICAgdGhpcy5leHBhbmRUaGVQYXRoKHJlc3VtZURhdGFWMi5pZGVudGlmaWVyKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICAgIGZpcnN0UGxheWFibGVDb250ZW50ID0gdGhpcy5jb250ZW50U3ZjLmdldEZpcnN0Q2hpbGRJbkhpZXJhcmNoeSh0aGlzLmNvbnRlbnQpXG4gICAgICAgIHRoaXMuZXhwYW5kVGhlUGF0aChmaXJzdFBsYXlhYmxlQ29udGVudC5pZGVudGlmaWVyKVxuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXhwYW5kVGhlUGF0aChyZXNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHJlc291cmNlSWQpIHtcbiAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnV0aWxpdHlTdmMuZ2V0UGF0aCh0aGlzLmNvbnRlbnQsIHJlc291cmNlSWQpXG4gICAgICAvLyBjb25zb2xlLmxvZygnUGF0aCA6OiA6OiA6ICcsIHBhdGgpXG4gICAgICB0aGlzLnBhdGhTZXQgPSBuZXcgU2V0KHBhdGgubWFwKCh1OiB7IGlkZW50aWZpZXI6IGFueSB9KSA9PiB1LmlkZW50aWZpZXIpKVxuICAgICAgLy8gY29uc29sZS5sb2coJ3BhdGhTZXQgOjo6ICcsIHRoaXMucGF0aFNldClcbiAgICAgIC8vIHBhdGguZm9yRWFjaCgobm9kZTogSVZpZXdlclRvY0NhcmQpID0+IHtcbiAgICAgIC8vICAgdGhpcy5uZXN0ZWRUcmVlQ29udHJvbC5leHBhbmQobm9kZSlcbiAgICAgIC8vIH0pXG4gICAgfVxuICB9XG5cbiAgcmFpc2VFbnJvbGxUZWxlbWV0cnkoKSB7XG4gICAgdGhpcy5ldmVudHMucmFpc2VJbnRlcmFjdFRlbGVtZXRyeShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgc3ViVHlwZTogJ2Vucm9sbCcsXG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICAgIHR5cGU6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhZ2VJZEV4dDogYGJ0bi1lbnJvbGxgLFxuICAgICAgICBtb2R1bGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnltb2R1bGVzLkNPTlRFTlQsXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgcmFpc2VFbnJvbGxUZWxlbWVudHJ5Rm9yU2Frc2hhbUFJR2VuZXJhdGVkKCkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIHN1YlR5cGU6ICdlbnJvbGwnLFxuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgaWQ6IHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQsXG4gICAgICAgICAgdmVyOiBcIjEuMFwiLFxuICAgICAgICAgIHR5cGU6IFwiaWdvdC1haVwiXG4gICAgICAgIH0sXG4gICAgICB9IGFzIGFueSxcbiAgICAgIHtcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICAgIHR5cGU6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBhZ2VJZDogYC9hcHAvdG9jLyR7dGhpcy5jb250ZW50Py5pZGVudGlmaWVyfS9vdmVydmlld19idG4tZW5yb2xsYCxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5DT05URU5ULFxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIG9uQ2xpY2tPZlNoYXJlKCkge1xuICAgIHRoaXMuZW5hYmxlU2hhcmUgPSB0cnVlXG4gICAgdGhpcy5yYWlzZVRlbGVtZXRyeUZvclNoYXJlKCdzaGFyZUNvbnRlbnQnKVxuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUgKi9cbiAgcmFpc2VUZWxlbWV0cnlGb3JTaGFyZShzdWJUeXBlOiBhbnkpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBzdWJUeXBlLFxuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgICB0eXBlOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5IDogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYWdlSWRFeHQ6IGBidG4tJHtzdWJUeXBlfWAsXG4gICAgICAgIG1vZHVsZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeW1vZHVsZXMuQ09OVEVOVCxcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICByZXNldEVuYWJsZVNoYXJlKCkge1xuICAgIHRoaXMuZW5hYmxlU2hhcmUgPSBmYWxzZVxuICB9XG5cbiAgdHJhbnNsYXRlTGFiZWwobGFiZWw6IHN0cmluZywgdHlwZTogYW55KSB7XG4gICAgaWYgKGxhYmVsICYmIHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLmxhbmd0cmFuc2xhdGlvbnMudHJhbnNsYXRlTGFiZWwobGFiZWwsIHR5cGUsICcnKVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnJvdXRlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMuYmF0Y2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYmF0Y2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy5iYXRjaERhdGFTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYmF0Y2hEYXRhU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgdGhpcy50b2NTdmMuYW5hbHl0aWNzRmV0Y2hTdGF0dXMgPSAnbm9uZSdcbiAgICBpZiAodGhpcy5yb3V0ZXJQYXJhbVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yb3V0ZXJQYXJhbVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLnRpbWVyVW5zdWJzY3JpYmUpIHtcbiAgICAgIHRoaXMudGltZXJVbnN1YnNjcmliZS51bnN1YnNjcmliZSgpXG4gICAgfVxuICB9XG5cbiAgcHJvZ3JhbUVucm9sbENhbGwoYmF0Y2hEYXRhOiBhbnkpIHtcbiAgICB0aGlzLmF1dG9FbnJvbGxDdXJhdGVkUHJvZ3JhbShOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNLCBiYXRjaERhdGEpXG4gIH1cblxuICByYWlzZVRlbGVtZXRyeUZvclB1YmxpYygpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBpZDogXCJ2aWV3LWFzc2Vzc21lbnRcIixcbiAgICAgICAgc3ViVHlwZTogXCJhbm9ueW1vdXMtYXNzZXNzbWVudFwiLFxuICAgICAgfSwge30sXG4gICAgICB7XG4gICAgICAgIG1vZHVsZTogJ0xhbmRpbmcgUGFnZScsXG4gICAgICB9KVxuICB9XG5cblxuICBmZXRjaFVzZXJFbnJvbGxtZW50RGF0YSgpIHtcbiAgICBsZXQgaWRlbnRpZmllciA9IHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciB8fCAnJ1xuICAgIGxldCByZXF1ZXN0OiBhbnkgPSB7XG4gICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICBcInJldGlyZWRDb3Vyc2VzRW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICBcImNvdXJzZUlkXCI6IFtpZGVudGlmaWVyXVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVucm9sbFN2Yy5mZXRjaEVucm9sbENvbnRlbnREYXRhKHJlcXVlc3QpLnN1YnNjcmliZShhc3luYyAocmVzOiBhbnkpID0+IHtcblxuXG4gICAgICBpZiAocmVzICYmIHJlcy5yZXN1bHQgJiYgcmVzLnJlc3VsdC5jb3Vyc2VzICYmIHJlcy5yZXN1bHQuY291cnNlcy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51c2VyRW5yb2xsbWVudExpc3QgPSByZXMucmVzdWx0LmNvdXJzZXNcblxuICAgICAgICBsZXQgY29tcGxldGVkQ29udGVudEZsYWdEYXRhOiBhbnkgPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCAmJlxuICAgICAgICAgIHRoaXMudXNlckVucm9sbG1lbnRMaXN0LmZpbmQoKGVsOiBhbnkpID0+IGVsLmNvbGxlY3Rpb25JZCA9PT0gdGhpcy5jb250ZW50Py5pZGVudGlmaWVyKVxuICAgICAgICBpZiAoY29tcGxldGVkQ29udGVudEZsYWdEYXRhICYmIGNvbXBsZXRlZENvbnRlbnRGbGFnRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSAmJiBjb21wbGV0ZWRDb250ZW50RmxhZ0RhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICAgIHRoaXMuY29udGVudFZpZXdFdmVudEZvck5ldENvcmUoJ2NvbXBsZXRlJylcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFUcmFuc2ZlclN2Yy5zZXRFbnJvbGxEYXRhKHRoaXMudXNlckVucm9sbG1lbnRMaXN0KVxuICAgICAgICBpZiAodGhpcy5jb250ZW50TGliU3ZjICYmIHRoaXMuY29udGVudExpYlN2Yy5vbmVTdGVwUmVzdW1lRW5hYmxlKSB7XG4gICAgICAgICAgLy8gbGV0IHVybERhdGEgPSBhd2FpdCB0aGlzLmNvbnRlbnRMaWJTdmMuZ2V0UmVzb3Vyc2VMaW5rKHRoaXMuY29udGVudCwgdGhpcy51c2VyRW5yb2xsbWVudExpc3QsIHRydWUpXG5cbiAgICAgICAgICBjb25zdCBmb3VuZENvbnRlbnQgPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCAmJlxuICAgICAgICAgICAgdGhpcy51c2VyRW5yb2xsbWVudExpc3QuZmluZCgoZWw6IGFueSkgPT4gZWwuY29sbGVjdGlvbklkID09PSB0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXIpXG4gICAgICAgICAgbGV0IHVybERhdGEgPSBhd2FpdCB0aGlzLmNvbnRlbnRMaWJTdmMuZ2V0UmVzb3Vyc2VMaW5rKHRoaXMuY29udGVudCwgW2ZvdW5kQ29udGVudF0sIHRydWUpXG5cbiAgICAgICAgICAvLyBsZXQgdXJsRGF0YSA9IGF3YWl0IHRoaXMuY29udGVudExpYlN2Yy5nZXRSZXNvdXJzZUxpbmsodGhpcy5jb250ZW50LCB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCwgdHJ1ZSlcbiAgICAgICAgICBpZiAodXJsRGF0YSAmJiB1cmxEYXRhLnVybCAmJiB1cmxEYXRhLnVybC5pbmNsdWRlcygnYXBwL3RvYycpKSB7XG4gICAgICAgICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRMaWJTdmMub25lU3RlcFJlc3VtZUVuYWJsZSA9IGZhbHNlXG4gICAgICAgICAgICBpZiAodXJsRGF0YSAmJiB1cmxEYXRhLnVybCkge1xuICAgICAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShcbiAgICAgICAgICAgICAgICBbdXJsRGF0YS51cmxdLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB1cmxEYXRhLnF1ZXJ5UGFyYW1zXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCA9IFtdXG4gICAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG5cbiAgYXN5bmMgY2hlY2tJZlVzZXJFbnJvbGxlZCgpIHtcbiAgICB0aGlzLmNvbnRlbnRMaWJTdmMub25lU3RlcFJlc3VtZUVuYWJsZSA9IGZhbHNlXG4gICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gdHJ1ZVxuICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dCh0cnVlKVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgJiYgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFICYmXG4gICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5QUk9HUkFNICYmXG4gICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5NQU5EQVRPUllfQ09VUlNFX0dPQUwgJiZcbiAgICAgIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJlxuICAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNICYmXG4gICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0pIHtcbiAgICAgIC8vIGNvbnN0IGNvbGxlY3Rpb25JZCA9IHRoaXMuaXNSZXNvdXJjZSA/ICcnIDogdGhpcy5jb250ZW50LmlkZW50aWZpZXJcbiAgICAgIHJldHVybiB0aGlzLmdldENvbnRpbnVlTGVhcm5pbmdEYXRhKHRoaXMuY29udGVudC5pZGVudGlmaWVyKVxuICAgIH1cblxuICAgIGxldCBlbnJvbGxlZENvdXJzZTogTnNDb250ZW50LklDb3Vyc2UgfCB1bmRlZmluZWRcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyICYmICF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgIGlmICh0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCAmJiB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGgpIHtcbiAgICAgICAgZW5yb2xsZWRDb3Vyc2UgPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5maW5kKChjb3Vyc2U6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIgfHwgJydcbiAgICAgICAgICBpZiAoY291cnNlLmNvdXJzZUlkICE9PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb3Vyc2VcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgLy8gSWYgY3VycmVudCBjb3Vyc2UgaXMgcHJlc2VudCBpbiB0aGUgbGlzdCBvZiB1c2VyIGVucm9sbGVkIGNvdXJzZVxuICAgICAgaWYgKGVucm9sbGVkQ291cnNlICYmIGVucm9sbGVkQ291cnNlLmJhdGNoSWQpIHtcbiAgICAgICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMucmVzdW1lRGF0YS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgdGhpcy5yZXN1bWVEYXRhID0gcmVzXG4gICAgICAgICAgICB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy50b2NTdmMuY2hlY2tNb2R1bGVXaXNlRGF0YSh0aGlzLmNvbnRlbnQpXG4gICAgICAgIHRoaXMuZW5yb2xsZWRDb3Vyc2VEYXRhID0gZW5yb2xsZWRDb3Vyc2VcbiAgICAgICAgdGhpcy5pc0NvdXJzZUNvbXBsZXRlZE9uVGhpc01vbnRoKClcbiAgICAgICAgdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCA9IGVucm9sbGVkQ291cnNlLmJhdGNoSWRcbiAgICAgICAgLy8gdGhpcy5kb3dubG9hZENlcnQoZW5yb2xsZWRDb3Vyc2UuaXNzdWVkQ2VydGlmaWNhdGVzKVxuICAgICAgICBpZiAoZW5yb2xsZWRDb3Vyc2UgJiYgZW5yb2xsZWRDb3Vyc2UuaXNzdWVkQ2VydGlmaWNhdGVzICYmXG4gICAgICAgICAgZW5yb2xsZWRDb3Vyc2UuaXNzdWVkQ2VydGlmaWNhdGVzLmxlbmd0aCkge1xuICAgICAgICAgIGNvbnN0IGNlcnRpZmljYXRlOiBhbnkgPSBlbnJvbGxlZENvdXJzZS5pc3N1ZWRDZXJ0aWZpY2F0ZXMuc29ydCgoYTogYW55LCBiOiBhbnkpID0+XG4gICAgICAgICAgICBuZXcgRGF0ZShiLmxhc3RJc3N1ZWRPbikuZ2V0VGltZSgpIC0gbmV3IERhdGUoYS5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSlcbiAgICAgICAgICBjb25zdCBjZXJ0SWQgPSBjZXJ0aWZpY2F0ZVswXS5pZGVudGlmaWVyXG4gICAgICAgICAgdGhpcy5jZXJ0SWQgPSBjZXJ0SWRcbiAgICAgICAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRbJ2NlcnRpZmljYXRlT2JqJ10gPSB7XG4gICAgICAgICAgICAgIGNlcnRJZCxcbiAgICAgICAgICAgICAgY2VydERhdGE6ICcnLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPSBlbnJvbGxlZENvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCAwXG4gICAgICAgIHRoaXMuY29udGVudC5jb21wbGV0aW9uU3RhdHVzID0gZW5yb2xsZWRDb3Vyc2Uuc3RhdHVzIHx8IDBcbiAgICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhICYmIHRoaXMuY29udGVudFJlYWREYXRhLmN1bXVsYXRpdmVUcmFja2luZykge1xuICAgICAgICAgIGF3YWl0IHRoaXMudG9jU3ZjLm1hcENvbXBsZXRpb25QZXJjZW50YWdlUHJvZ3JhbSh0aGlzLmNvbnRlbnQsIHRoaXMudXNlckVucm9sbG1lbnRMaXN0KVxuICAgICAgICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLnJlc3VtZURhdGEuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlcykge1xuICAgICAgICAgICAgICB0aGlzLnJlc3VtZURhdGEgPSByZXNcbiAgICAgICAgICAgICAgdGhpcy5nZXRMYXN0UGxheWVkUmVzb3VyY2UoKVxuICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlUmVzdW1lRGF0YUxpbmtOZXcoKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICAgIC8vIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmdldENvbnRpbnVlTGVhcm5pbmdEYXRhKHRoaXMuY29udGVudC5pZGVudGlmaWVyLCBlbnJvbGxlZENvdXJzZS5iYXRjaElkKVxuICAgICAgICAgIHRoaXMuY29udGVudFsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSA9IGVucm9sbGVkQ291cnNlLmNvbXBsZXRpb25QZXJjZW50YWdlXG4gICAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5tYXBNb2R1bGVDb3VudCh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgLy8gdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYmF0Y2hEYXRhID0ge1xuICAgICAgICAgIGNvbnRlbnQ6IFtlbnJvbGxlZENvdXJzZS5iYXRjaF0sXG4gICAgICAgICAgZW5yb2xsZWQ6IHRydWUsXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50b2NTdmMuc2V0QmF0Y2hEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAgICAgICB0aGlzLnRvY1N2Yy5nZXRTZWxlY3RlZEJhdGNoRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgdGhpcy50b2NTdmMubWFwU2Vzc2lvbkNvbXBsZXRpb25QZXJjZW50YWdlKHRoaXMuYmF0Y2hEYXRhLCB0aGlzLnJlc3VtZURhdGEpXG4gICAgICAgIGlmICh0aGlzLmdldEJhdGNoSWQoKSkge1xuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxuICAgICAgICAgICAgW10sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB7IGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpIH0sXG4gICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRvY1N2Yy5jaGVja01vZHVsZVdpc2VEYXRhKHRoaXMuY29udGVudClcbiAgICAgICAgdGhpcy50b2NTdmMubWFwTW9kdWxlQ291bnQodGhpcy5jb250ZW50KVxuICAgICAgICAvLyBJdCdzIHVuZGVyc3Rvb2QgdGhhdCB1c2VyIGlzIG5vdCBhbHJlYWR5IGVucm9sbGVkXG4gICAgICAgIC8vIEZldGNoIHRoZSBhdmFpbGFibGUgYmF0Y2hlcyBhbmQgcHJlc2VudCB0byB1c2VyXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DT1VSU0VcbiAgICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5QUk9HUkFNKSB7XG4gICAgICAgICAgLy8gRGlzYWJsaW5nIGF1dG8gZW5yb2xsbWVudCB0byBiYXRjaFxuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0pIHtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2hCYXRjaERldGFpbHMoKVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmZldGNoQmF0Y2hEZXRhaWxzKClcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvY1N2Yy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAodGhpcy5jb250ZW50KVxuICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyLm5leHQoZmFsc2UpXG4gICAgICB9XG5cblxuICAgIH1cblxuICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZVxuICB9XG5cbiAgaGFuZGxlQWNjZXB0UmVsZXZlbnQoKSB7XG4gICAgdGhpcy5zYXZlRmVlZGJhY2soJycsIDEpO1xuICB9XG5cbiAgaGFuZGxlRGVjbGluZVJlbGV2ZW50KCkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oTm9uUmVsZXZlbnRGZWVkYmFja0RpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgd2lkdGg6ICc1MDJweCcsXG4gICAgICBwYW5lbENsYXNzOiBbJ3JlbGV2ZW50LWZlZWRiYWNrLWRpYWxvZyddLFxuICAgIH0pXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQ6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICB0aGlzLnNhdmVGZWVkYmFjayhyZXN1bHQsIDApO1xuICAgICAgICBkaWFsb2dSZWYuY2xvc2UoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRpYWxvZ1JlZi5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBjb250ZW50Vmlld0V2ZW50Rm9yTmV0Q29yZShldmVudFR5cGU6IGFueSkge1xuICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnICYmIHRoaXMuY29uZmlnU3ZjLm5ldGNvcmVDb25maWcubmV0Y29yZVdlYkNvbmZpZyAgLy8gTk9TT05BUlxuICAgICAgJiYgdGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZy5uZXRjb3JlV2ViQ29uZmlnLmlzQWN0aXZlIC8vIE5PU09OQVJcbiAgICAgICYmIHRoaXMuY29uZmlnU3ZjLm5ldGNvcmVDb25maWcubmV0Y29yZVdlYkNvbmZpZy5ldmVudHMgLy8gTk9TT05BUlxuICAgICAgJiYgdGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZy5uZXRjb3JlV2ViQ29uZmlnLmV2ZW50cy5jb250ZW50X3ZpZXcgLy8gTk9TT05BUlxuICAgICAgJiYgdGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZy5uZXRjb3JlV2ViQ29uZmlnLmV2ZW50cy5jb250ZW50X3ZpZXcuaXNBY3RpdmUgLy8gTk9TT05BUlxuICAgICkge1xuICAgICAgbGV0IHBheWxvYWQ6IGFueSA9IHt9XG4gICAgICAvLyBpZiAodGhpcy5jb25maWdTdmMgJiYgdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyICYmIHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyKSB7IC8vIE5PU09OQVJcbiAgICAgIC8vICAgcGF5bG9hZFsncGtedXNlcmlkJ10gPSB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIuaWRlbnRpZmllci50cmltKCkudG9Mb3dlckNhc2UoKVxuICAgICAgLy8gfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQubmFtZSkge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X25hbWUnXSA9IHRoaXMuY29udGVudC5uYW1lXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeSkge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X2NhdGVnb3J5J10gPSB0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnlcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9pZCddID0gdGhpcy5jb250ZW50LmlkZW50aWZpZXJcbiAgICAgIH1cbiAgICAgIC8vIGlmKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQubmFtZSkge1xuICAgICAgcGF5bG9hZFsnY29udGVudF91cmwnXSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmXG4gICAgICAvLyB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5hcHBJY29uKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfaW1hZ2UnXSA9IHRoaXMuY29udGVudC5hcHBJY29uXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5kdXJhdGlvbikge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X2R1cmF0aW9uJ10gPSB0aGlzLmNvbnRlbnQuZHVyYXRpb24gJiYgTnVtYmVyKHRoaXMuY29udGVudC5kdXJhdGlvbikgPiAwID8gTnVtYmVyKHRoaXMuY29udGVudC5kdXJhdGlvbikgOiAwXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X2R1cmF0aW9uJ10gPSAwXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5hdmdSYXRpbmdcbiAgICAgICkge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X3JhdGluZyddID0gdGhpcy5jb250ZW50LmF2Z1JhdGluZ1xuICAgICAgICBwYXlsb2FkWydjb250ZW50IHJhdGluZyddID0gdGhpcy5jb250ZW50LmF2Z1JhdGluZ1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQudG90YWxOb09mUmF0aW5nKSB7XG4gICAgICAgIHBheWxvYWRbJ25vX3VzZXJzX3JhdGVkJ10gPSB0aGlzLmNvbnRlbnQudG90YWxOb09mUmF0aW5nXG4gICAgICB9XG4gICAgICAvLyBpZih0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50Lm5hbWUpIHtcbiAgICAgIHBheWxvYWRbJ2xlYXJuaW5nX3BhdGhfY29udGVudCddID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QubGVuZ3RoID8gdHJ1ZSA6IGZhbHNlXG4gICAgICBwYXlsb2FkWydsZWFybmluZyBwYXRoIGNvbnRlbnQnXSA9IHRoaXMudXNlckVucm9sbG1lbnRMaXN0ICYmIHRoaXMudXNlckVucm9sbG1lbnRMaXN0Lmxlbmd0aCA/IHRydWUgOiBmYWxzZVxuICAgICAgLy8gfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuc291cmNlKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfcHJvdmlkZXJfbmFtZSddID0gdGhpcy5jb250ZW50LnNvdXJjZVxuICAgICAgfVxuICAgICAgLy8gY29uc29sZS5sb2coJ3BheWxvYWQnLCBwYXlsb2FkKVxuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gJ3ZpZXcnKSB7XG4gICAgICAgIHRoaXMubmV0Q29yZVNlcnZpY2UudHJhY2tFdmVudEZvckNvbnRlbnRBbmRFdmVudCgnY29udGVudF92aWV3JywgdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIudHJpbSgpLnRvTG93ZXJDYXNlKCksIHBheWxvYWQpXG4gICAgICB9IGVsc2UgaWYgKGV2ZW50VHlwZSA9PT0gJ2Vucm9sbCcpIHtcbiAgICAgICAgdGhpcy5uZXRDb3JlU2VydmljZS50cmFja0V2ZW50Rm9yQ29udGVudEFuZEV2ZW50KCdjb250ZW50X2Vucm9sbWVudCcsIHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCBwYXlsb2FkKVxuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgICAgdGhpcy5uZXRDb3JlU2VydmljZS50cmFja0V2ZW50Rm9yQ29udGVudEFuZEV2ZW50KCdjb250ZW50X2NvbXBsZXRpb24nLCB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIuaWRlbnRpZmllci50cmltKCkudG9Mb3dlckNhc2UoKSwgcGF5bG9hZClcbiAgICAgIH1cblxuICAgIH1cbiAgfVxuXG4gIHNlY29uZHNUb1RpbWUoZDogYW55KSB7XG4gICAgZCA9IE51bWJlcihkKTtcbiAgICB2YXIgaCA9IE1hdGguZmxvb3IoZCAvIDM2MDApO1xuICAgIHZhciBtID0gTWF0aC5mbG9vcihkICUgMzYwMCAvIDYwKTtcbiAgICB2YXIgcyA9IE1hdGguZmxvb3IoZCAlIDM2MDAgJSA2MCk7XG5cbiAgICB2YXIgaERpc3BsYXkgPSBoID4gMCA/IGggKyAoaCA9PSAxID8gXCIgaG91ciwgXCIgOiBcIiBob3VycywgXCIpIDogXCJcIjtcbiAgICB2YXIgbURpc3BsYXkgPSBtID4gMCA/IG0gKyAobSA9PSAxID8gXCIgbWludXRlLCBcIiA6IFwiIG1pbnV0ZXMsIFwiKSA6IFwiXCI7XG4gICAgdmFyIHNEaXNwbGF5ID0gcyA+IDAgPyBzICsgKHMgPT0gMSA/IFwiIHNlY29uZFwiIDogXCIgc2Vjb25kc1wiKSA6IFwiXCI7XG4gICAgcmV0dXJuIGhEaXNwbGF5ICsgbURpc3BsYXkgKyBzRGlzcGxheTtcbiAgfVxuXG5cbiAgYXN5bmMgc2F2ZUZlZWRiYWNrKGNvbW1lbnQ6IHN0cmluZywgcmF0aW5nID0gMCkge1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBcInJlY29tbWVuZGF0aW9uX2lkXCI6IHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQsXG4gICAgICBcImNvdXJzZV9pZFwiOiB0aGlzLmNvdXJzZUlELFxuICAgICAgXCJyYXRpbmdcIjogcmF0aW5nLFxuICAgICAgXCJjb21tZW50c1wiOiBjb21tZW50LFxuICAgICAgXCJ1c2VyX2lkXCI6IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlPy51c2VySWQgfHwgJydcbiAgICB9XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbnRlbnRMaWJTdmMuc2F2ZUZlZWRiYWNrU2Frc2hhbUFJKHBheWxvYWQpLnRvUHJvbWlzZSgpLmNhdGNoKCgpID0+IHsgfSlcbiAgICBpZiAocmVzcG9uc2UgJiYgcmVzcG9uc2U/Lm1lc3NhZ2UpIHtcbiAgICAgIHRoaXMubWF0U25hY2tiYXJOZXcub3BlbihcbiAgICAgICAgJ1RoYW5rIHlvdSBmb3IgeW91ciBmZWVkYmFjay4nLCAnWCcsXG4gICAgICAgIHsgZHVyYXRpb246IFNOQUNLQkFSX0RVUkFUSU9OLCBwYW5lbENsYXNzOiBbJ3N1Y2Nlc3MnXSB9XG4gICAgICApO1xuICAgICAgLy8gdGhpcy5yb3V0ZXIubmF2aWdhdGUoW10sIHsgcXVlcnlQYXJhbXM6IHsgZzogbnVsbCB9LCBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnIH0pO1xuICAgICAgdGhpcy5mZWVkYmFja0dpdmVuID0geyBjb3Vyc2VfaWQ6IHRoaXMuY291cnNlSUQsIHJhdGluZzogcmF0aW5nLCBjb21tZW50czogY29tbWVudCB9XG5cbiAgICB9IGVsc2UgaWYgKCFyZXNwb25zZSkge1xuICAgICAgdGhpcy5tYXRTbmFja2Jhck5ldy5vcGVuKFxuICAgICAgICAnU29tZXRoaW5nIGlzIHdyb25nLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLicsICdYJyxcbiAgICAgICAgeyBkdXJhdGlvbjogU05BQ0tCQVJfRFVSQVRJT04sIHBhbmVsQ2xhc3M6IFsnZXJyb3InXSB9XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHBsYXlSZXN1bWVGb3JBSSgpIHtcbiAgICBpZih0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGlmKHRoaXMuZmlyc3RSZXNvdXJjZUxpbmspIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMuZmlyc3RSZXNvdXJjZUxpbmsudXJsXSx7cXVlcnlQYXJhbXM6IHRoaXMuZmlyc3RSZXNvdXJjZUxpbmsucXVlcnlQYXJhbXN9IClcbiAgICAgIH1cbiAgICAgIFxuICAgICAvLyB0aGlzLmdldENvbnRpbnVlTGVhcm5pbmdEYXRhKHRoaXMuY29udGVudC5pZGVudGlmaWVyKVxuICAgIH1cbiAgICBcbiAgfVxuXG4gIGVucm9sbFVzZXJUb0FJKCkge1xuICAgIHRoaXMuZnJvbUFJVHV0b3IgPSB0cnVlXG4gICAgdGhpcy5oYW5kbGVBdXRvQmF0Y2hBc3NpZ24oKVxuICB9XG5cbiAgZ2VuZXJhdGVQcmVBc3Nlc3NtZW50UXVlcnkodHlwZTogJ1JFU1VNRScgfCAnU1RBUlRfT1ZFUicgfCAnU1RBUlQnKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgaWYgKHRoaXMuZmlyc3RSZXNvdXJjZUxpbmsgJiYgKHR5cGUgPT09ICdTVEFSVCcgfHwgdHlwZSA9PT0gJ1NUQVJUX09WRVInKSkge1xuICAgICAgbGV0IHFQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgIC4uLnRoaXMuZmlyc3RSZXNvdXJjZUxpbmsucXVlcnlQYXJhbXMsXG4gICAgICAgIHZpZXdNb2RlOiB0eXBlLFxuICAgICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRleHRJZCAmJiB0aGlzLmNvbnRleHRQYXRoKSB7XG4gICAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgICBjb2xsZWN0aW9uSWQ6IHRoaXMuY29udGV4dElkLFxuICAgICAgICAgIGNvbGxlY3Rpb25UeXBlOiB0aGlzLmNvbnRleHRQYXRoLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgIGRlbGV0ZSBxUGFyYW1zLnZpZXdNb2RlXG4gICAgICB9XG4gICAgICBxUGFyYW1zID0ge1xuICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbElkLFxuICAgICAgfVxuICAgICAgcmV0dXJuIHFQYXJhbXNcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXN1bWVEYXRhTGluayAmJiB0eXBlID09PSAnUkVTVU1FJykge1xuICAgICAgbGV0IHFQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgICAgIC4uLnRoaXMucmVzdW1lRGF0YUxpbmsucXVlcnlQYXJhbXMsXG4gICAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgICB2aWV3TW9kZTogJ1JFU1VNRScsXG4gICAgICAgIC8vIGNvdXJzZU5hbWU6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5uYW1lIDogJycsXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZXh0SWQgJiYgdGhpcy5jb250ZXh0UGF0aCkge1xuICAgICAgICBxUGFyYW1zID0ge1xuICAgICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgICAgY29sbGVjdGlvbklkOiB0aGlzLmNvbnRleHRJZCxcbiAgICAgICAgICBjb2xsZWN0aW9uVHlwZTogdGhpcy5jb250ZXh0UGF0aCxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgICBkZWxldGUgcVBhcmFtcy52aWV3TW9kZVxuICAgICAgfVxuICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgY2hhbm5lbElkOiB0aGlzLmNoYW5uZWxJZCxcbiAgICAgIH1cbiAgICAgIHJldHVybiBxUGFyYW1zXG4gICAgfVxuICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgIHJldHVybiB7fVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICB2aWV3TW9kZTogdHlwZSxcbiAgICB9XG4gIH1cblxuICByb3V0ZVRvUHJlQXNzZXNzZW50KCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YSkgeyBcbiAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmNvbnRlbnQnLHRoaXMuY29udGVudFJlYWREYXRhKSAgXG4gICAgICBjb25zb2xlLmxvZygndGhpcy5jb250ZW50JywgdGhpcy5jb250ZW50UmVhZERhdGEucHJlRW5yb2xtZW50UmVzb3VyY2VzKSBcbiAgICAgIC8vIHRoaXMuZ2VuZXJhdGVQcmVBc3Nlc3NtZW50UXVlcnkoJ1NUQVJUJylcbiAgICAgIGxldCBmaXJzdFJlc291cmNlICA9IHRoaXMuY29udGVudFJlYWREYXRhLnByZUVucm9sbWVudFJlc291cmNlc1swXVxuXG4gICAgICB0aGlzLmZpcnN0UmVzb3VyY2VMaW5rID0gdmlld2VyUm91dGVHZW5lcmF0b3IoXG4gICAgICAgIGZpcnN0UmVzb3VyY2UuaWRlbnRpZmllcixcbiAgICAgICAgZmlyc3RSZXNvdXJjZS5taW1lVHlwZSxcbiAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIsXG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSxcbiAgICAgICAgdGhpcy5mb3JQcmV2aWV3LFxuICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YS5wcmVFbnJvbG1lbnRSZXNvdXJjZXNbMF0/LnByaW1hcnlDYXRlZ29yeSxcbiAgICAgICAgJycsXG4gICAgICApXG4gICAgICBjb25zb2xlLmxvZygndGhpcy5maXJzdFJlc291cmNlTGluaycsIHRoaXMuZmlyc3RSZXNvdXJjZUxpbmspXG4gICAgICBsZXQgcm91dGVyTGluayA9ICB0aGlzLmZpcnN0UmVzb3VyY2VMaW5rPy51cmwgIFxuICAgICAgbGV0IHF1ZXJ5UGFyYW1zID0gdGhpcy5nZW5lcmF0ZVByZUFzc2Vzc21lbnRRdWVyeSgnU1RBUlQnKVxuICAgICAgcXVlcnlQYXJhbXMgPSB7IC4uLnF1ZXJ5UGFyYW1zLCAgcHJlQXNzZXNzbWVudDogJ3RydWUnIH1cbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHtyb3V0ZXJMaW5rfWBdLCB7IHF1ZXJ5UGFyYW1zIH0pXG4gICAgfVxuICB9XG5cbiAgZ2V0UHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMoKSB7XG4gICAgdGhpcy5wcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyA9IGZhbHNlXG4gICAgbGV0IHByZUVucm9sbG1lbnRSZXNvdXJjZXNBcnI6YW55ID0gW11cbiAgICBpZih0aGlzLmNvbnRlbnRSZWFkRGF0YT8ucHJlRW5yb2xtZW50UmVzb3VyY2VzPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29udGVudFJlYWREYXRhPy5wcmVFbnJvbG1lbnRSZXNvdXJjZXM/LmZvckVhY2goKGl0ZW06YW55KT0+e1xuICAgICAgICBpZihpdGVtICYmIGl0ZW0/LmlzTWFuZGF0b3J5KSB7XG4gICAgICAgICAgcHJlRW5yb2xsbWVudFJlc291cmNlc0Fyci5wdXNoKGl0ZW0/LmlkZW50aWZpZXIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGlmKHByZUVucm9sbG1lbnRSZXNvdXJjZXNBcnIgJiYgcHJlRW5yb2xsbWVudFJlc291cmNlc0Fyci5sZW5ndGgpIHtcbiAgICAgIGxldCByZXEgPXtcbiAgICAgICAgXCJyZXF1ZXN0XCI6IHtcbiAgICAgICAgICBcImNvbnRlbnRJZHNcIjogcHJlRW5yb2xsbWVudFJlc291cmNlc0FycixcbiAgICAgICAgICBcImZpZWxkc1wiOiBbXG4gICAgICAgICAgICAgIC8vIFwibGFzdEFjY2Vzc1RpbWVcIixcbiAgICAgICAgICAgICAgLy8gXCJjb21wbGV0aW9uUGVyY2VudGFnZVwiXG4gICAgICAgICAgXVxuICAgICAgfVxuICAgICAgfSBcbiAgICAgIHRoaXMudG9jU3ZjLnJlYWRQcmVFbnJvbGxtZW50UmVzb3VyY2VzU3RhdGUocmVxKS5zdWJzY3JpYmUoKGRhdGE6YW55KT0+e1xuICAgICAgICBpZihkYXRhICYmIGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0KSB7XG4gICAgICAgICAgZm9yKGxldCBpPTA7IGk8ZGF0YS5yZXN1bHQuY29udGVudExpc3QubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmKE51bWJlcihkYXRhLnJlc3VsdC5jb250ZW50TGlzdFtpXVsnY29tcGxldGlvblBlcmNlbnRhZ2UnXSkgPT09IDEwMCB8fCBcbiAgICAgICAgICAgICAgZGF0YS5yZXN1bHQuY29udGVudExpc3RbaV1bJ3N0YXR1cyddID09PSAyIFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIHRoaXMucHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMgPSB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICBcbiAgfVxuXG5cbiAgb25MYW5ndWFnZVNlbGVjdChsYW5nOiBhbnkpIHtcbiAgICB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgPSBsYW5nO1xuICAgIGNvbnNvbGUubG9nKCdTZWxlY3RlZCBsYW5ndWFnZTonLCBsYW5nKTtcbiAgICAvLyBBZGQgeW91ciBsYW5ndWFnZSBjaGFuZ2UgbG9naWMgaGVyZVxuICB9XG5cbn1cbiIsIjwhLS0gXG4gIE1haW4gQ29udGFpbmVyIC0gRGlzcGxheXMgY291cnNlL2NvbnRlbnQgZGV0YWlscyB3aXRoIGVucm9sbG1lbnQgZnVuY3Rpb25hbGl0eVxuICBPbmx5IGRpc3BsYXlzIGNvbnRlbnQgaWYgY291cnNlSUQgaXMgYXZhaWxhYmxlLCBvdGhlcndpc2Ugc2hvd3MgXCJub3QgZm91bmRcIiBtZXNzYWdlXG4tLT5cbjxuZy1jb250YWluZXIgKm5nSWY9XCJjb3Vyc2VJRCBlbHNlIG5vRGF0YUZvdW5kXCI+XG4gIDwhLS0gXG4gICAgRU5ST0xMTUVOVCBURU1QTEFURSAtIEhhbmRsZXMgYWxsIGVucm9sbG1lbnQvc3RhcnQvcmVzdW1lIGJ1dHRvbiBmdW5jdGlvbmFsaXR5XG4gICAgVXNlZCBpbiBtdWx0aXBsZSBwbGFjZXMgdGhyb3VnaG91dCB0aGUgdGVtcGxhdGVcbiAgLS0+XG4gIDxuZy10ZW1wbGF0ZSAjZW5yb2xsRnVuY3Rpb25hbGl0eT5cbiAgICA8ZGl2IFtoaWRkZW5dPVwiaXNSZXNvdXJjZSAmJiAhY29udGVudD8uYXJ0aWZhY3RVcmw/Lmxlbmd0aFwiIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNCB0ZXh0LWNlbnRlclwiPlxuICAgICAgPCEtLSBTRUNUSU9OOiBSZWd1bGFyIGNvdXJzZSBlbnJvbGxtZW50IGJ1dHRvbnMgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTVxuICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU1cbiAgICAgICAgICAgICAgICAgICAgJiYgY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UICYmXG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICA8IS0tIFNUQVJUL1JFU1VNRSBidXR0b24gZm9yIGdyYW50ZWQgY291cnNlcyAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihhY3Rpb25CdG5TdGF0dXMgPT09ICdncmFudCcgJiYgIShpc01vYmlsZSAmJiBjb250ZW50Py5pc0luSW50cmFuZXQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiYgY29udGVudD8uY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgIWNvbnRlbnQ/LmFydGlmYWN0VXJsPy5sZW5ndGgpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSAmJiAhY29udGVudD8uYXJ0aWZhY3RVcmwpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5NQU5EQVRPUllfQ09VUlNFX0dPQUwpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZClcIj5cbiAgICAgICAgICA8YSAqbmdJZj1cInNob3dTdGFydC5zaG93ICYmICFpc1Bvc3RBc3Nlc3NtZW50ICYmICFmb3JQcmV2aWV3XCIgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKClcIlxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IHJlc3VtZURhdGFMaW5rPy51cmwgOiBmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCIocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPCAxMDApICYmICFjZXJ0RGF0YVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZTsgZWxzZSBhdXRoVmlld1wiID5cbiAgICAgICAgICAgICAgICB7eyByZXN1bWVEYXRhID8gdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIDogdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIH19XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwIHx8IGNlcnREYXRhXCI+XG4gICAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgPyB0cmFuc2xhdGVMYWJlbHMoJ1N0YXJ0IGFnYWluJywgJ2FwcHRvY2hvbWUnKSA6IHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9hPlxuXG4gICAgICAgICAgPCEtLSBUQUtFIEFTU0VTU01FTlQgYnV0dG9uIChmb3IgcG9zdCBhc3Nlc3NtZW50cykgLS0+XG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzUG9zdEFzc2Vzc21lbnQgJiYgc2hvd1Rha2VBc3Nlc3NtZW50Py5wb3N0X2Fzc2Vzc21lbnRcIiAgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKClcIiBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZTsgZWxzZSBhdXRoVmlld1wiID57eyAnYXBwdG9jaG9tZS50YWtlQXNzZXNzbWVudCcgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDwhLS0gQ29tbWVudGVkIGthcm1hIHBvaW50cyBwYW5lbCBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgXG4gICAgICAgIDwhLS0gRU5ST0xMIGJ1dHRvbiBmb3IgY291cnNlcyB0aGF0IHJlcXVpcmUgZW5yb2xsbWVudCAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiAoYWN0aW9uQnRuU3RhdHVzID09PSAnZ3JhbnQnICYmICEoaXNNb2JpbGUgJiYgY29udGVudD8uaXNJbkludHJhbmV0KSAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAhKCBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiYgY29udGVudD8uY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICFjb250ZW50Py5hcnRpZmFjdFVybD8ubGVuZ3RoICkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKCBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiYgYmF0Y2hEYXRhPy5lbnJvbGxlZCApICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSAmJiAhY29udGVudD8uYXJ0aWZhY3RVcmwpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTClcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0UgICYmICFlbnJvbGxCdG5Mb2FkaW5nXCI+XG4gICAgICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIiAgKGNsaWNrKT1cImhhbmRsZUF1dG9CYXRjaEFzc2lnbigpXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgPlxuICAgICAgICAgICAgICAgIDwhLS0gRU5ST0xMIEJVVFRPTiBMQUJFTCAtIFVzZWQgYWNyb3NzIG11bHRpcGxlIHNlY3Rpb25zIC0tPlxuICAgICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8IS0tIENvbW1lbnRlZCBrYXJtYSBwb2ludHMgcGFuZWwgZnVuY3Rpb25hbGl0eSAtLT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBCTEVOREVEX1BST0dSQU0gcHJlLWVucm9sbG1lbnQgZnVuY3Rpb25hbGl0eSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gJiYgIXByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzXCI+XG4gICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGVucm9sbC1idG4ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByZUVucm9sbWVudFJlc291cmNlcz8ubGVuZ3RoXCIgKGNsaWNrKT1cInJvdXRlVG9QcmVBc3Nlc3NlbnQoKVwiPlxuICAgICAgICAgICAgIDxuZy1jb250YWluZXIgPlxuICAgICAgICAgICAgICAge3sgJ2FwcHRvY2hvbWUucHJlRW5yb2xsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICA8L2E+XG4gICAgIDwvbmctY29udGFpbmVyPlxuICAgICBcbiAgICAgIDwhLS0gU0VDVElPTjogQkxFTkRFRF9QUk9HUkFNIHByZS1lbnJvbGxtZW50IGNvbXBsZXRpb24gbWVzc2FnZSAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gJiYgcHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXNcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IHByZWVucm9sbGRvbmUtYnRuIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgICAgIDxuZy1jb250YWluZXIgPlxuICAgICAgICAgICAgICAge3sgJ2FwcHRvY2hvbWUucHJlRW5yb2xsRG9uZScgfCB0cmFuc2xhdGUgfX08aW1nIHNyYz1cIi9hc3NldHMvaWNvbnMvQWNjZXB0X2ljb24ucG5nXCIgYWx0PVwidGlja1wiIGNsYXNzPVwidGljay1pY29uXCI+XG4gICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgIDwvYT5cbiAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gU0VDVElPTjogUFJPR1JBTSAmIE1BTkRBVE9SWV9DT1VSU0VfR09BTCBoYW5kbGluZyAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3QnRuXCI+XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gfHwgY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMXCI+XG4gICAgICAgICAgXG4gICAgICAgICAgPCEtLSBTRUNUSU9OOiBNb2RlcmF0ZWQgcHJvZ3JhbSBlbnJvbGxtZW50IGhhbmRsaW5nIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoY291cnNlQ2F0ZWdvcnk/Lk1PREVSQVRFRF9QUk9HUkFNID09PSBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5KSAmJiAoY29udGVudFJlYWREYXRhPy5iYXRjaGVzICYmICFiYXRjaERhdGE/LmVucm9sbGVkKVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIigoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0UpICAmJiAhZW5yb2xsQnRuTG9hZGluZykgJiYgIWNvbnRlbnRSZWFkRGF0YT8uYmF0Y2hlc1swXS5lbmREYXRlXCI+XG4gICAgICAgICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiIChjbGljayk9XCJoYW5kbGVBdXRvQmF0Y2hBc3NpZ24oKVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCIgPlxuICAgICAgICAgICAgICAgICAgPCEtLSBFTlJPTEwgQlVUVE9OIExBQkVMIC0tPlxuICAgICAgICAgICAgICAgICAge3snYXBwdG9jaG9tZS5lbnJvbGwnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8IS0tIENvbW1lbnRlZCBrYXJtYSBwb2ludHMgcGFuZWwgZnVuY3Rpb25hbGl0eSAtLT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIigoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0UpICAmJiAhZW5yb2xsQnRuTG9hZGluZykgJiYgY29udGVudFJlYWREYXRhPy5iYXRjaGVzWzBdLmVuZERhdGVcIj5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8d3MtYXBwLXRvYy1iYW5uZXIgcm9sZT1cImJhbm5lclwiIFtiYW5uZXJzXT1cImJhbm5lcnNcIiBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCIgW2NvbnRlbnRdPVwiY29udGVudFwiXG4gICAgICAgICAgICAgICAgW3VzZXJFbnJvbGxtZW50TGlzdF09XCJ1c2VyRW5yb2xsbWVudExpc3RcIiAgW2FuYWx5dGljc109XCJhbmFseXRpY3NcIiAocHJvZ3JhbUVucm9sbENhbGwpPVwicHJvZ3JhbUVucm9sbENhbGwoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW3Jlc3VtZURhdGFdPVwicmVzdW1lRGF0YVwiIFtiYXRjaERhdGFdPVwiYmF0Y2hEYXRhXCIgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIj5cbiAgICAgICAgICAgICAgICA8L3dzLWFwcC10b2MtYmFubmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPCEtLSBTRUNUSU9OOiBObyBiYXRjaGVzIG1lc3NhZ2UgLS0+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihjb3Vyc2VDYXRlZ29yeT8uTU9ERVJBVEVEX1BST0dSQU0gPT09IGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkpICYmICFjb250ZW50UmVhZERhdGE/LmJhdGNoZXMgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgICAgIE5vIEJhdGNoZXNcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDwhLS0gU0VDVElPTjogU3RhdHVzIG1lc3NhZ2VzIGZvciBub24tbW9kZXJhdGVkIHByb2dyYW1zIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb3Vyc2VDYXRlZ29yeT8uTU9ERVJBVEVEX1BST0dSQU0gIT09IGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gJiYgY3VycmVudENvdXJzZUJhdGNoSWQpICYmIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTFwiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCBzaGFkb3ctbGcgdGV4dC1pbmZvLWRpdlwiID57eyAnYXBwdG9jaG9tZS55b3VBcmVOb3RJbnZpdGVkJyB8IHRyYW5zbGF0ZSB9fSA8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNCYXRjaEluUHJvZ3Jlc3MgJiYgISFjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgPT09ICdOQSdcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgc2hhZG93LWxnIHRleHQtaW5mby1kaXZcIiA+e3sgJ2FwcHRvY2hvbWUubm9BY3RpdmVCYXRjaGVzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgIT09ICdOQSdcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgc2hhZG93LWxnIHRleHQtaW5mby1kaXZcIiA+e3sgJ2FwcHRvY2hvbWUuYmF0Y2hXaWxsU3RhcnQnIHwgdHJhbnNsYXRlIH19IHt7Z2V0U3RhcnREYXRlfX0hPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8IS0tIFNFQ1RJT046IEJhdGNoIHN0YXR1cyBtZXNzYWdlcyBmb3IgbW9kZXJhdGVkIHByb2dyYW1zIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNCYXRjaEluUHJvZ3Jlc3MgJiYgY291cnNlQ2F0ZWdvcnk/Lk1PREVSQVRFRF9QUk9HUkFNID09PSBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ICYmICFlbnJvbGxCdG5Mb2FkaW5nXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQmF0Y2hJblByb2dyZXNzICYmIGN1cnJlbnRDb3Vyc2VCYXRjaElkICYmIGdldFN0YXJ0RGF0ZSAhPT0gJ05BJ1wiPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCBzaGFkb3ctbGcgdGV4dC1pbmZvLWRpdlwiID57eyAnYXBwdG9jaG9tZS5iYXRjaFdpbGxTdGFydCcgfCB0cmFuc2xhdGUgfX0ge3tnZXRTdGFydERhdGV9fSE8L3NwYW4+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDwhLS0gU0VDVElPTjogSW4tcHJvZ3Jlc3MgYmF0Y2ggd2l0aCByZXN1bWUvc3RhcnQgZnVuY3Rpb25hbGl0eSAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNCYXRjaEluUHJvZ3Jlc3MgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICggYWN0aW9uQnRuU3RhdHVzID09PSAnZ3JhbnQnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICEoaXNNb2JpbGUgJiYgY29udGVudD8uaXNJbkludHJhbmV0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTCAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcIj5cbiAgICAgICAgICAgIDxhICpuZ0lmPVwic2hvd1N0YXJ0LnNob3cgJiYgIWlzUG9zdEFzc2Vzc21lbnRcIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJyZXN1bWVEYXRhID8gcmVzdW1lRGF0YUxpbms/LnVybCA6IGZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwicmVzdW1lRGF0YSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCIgPlxuICAgICAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSAmJiAoY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCAmJiBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlPiAwKSA/IHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygnc3RhcnQnLCAnYXBwdG9jaG9tZScpIH19XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXCI+XG4gICAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSB8fCBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyBcIlN0YXJ0IGFnYWluXCIgOiBcIlN0YXJ0XCIgfX1cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8YSAqbmdJZj1cImlzUG9zdEFzc2Vzc21lbnQgJiYgc2hvd1Rha2VBc3Nlc3NtZW50Py5wb3N0X2Fzc2Vzc21lbnRcIiBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCIgPnt7ICdhcHB0b2Nob21lLnRha2VBc3Nlc3NtZW50JyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPCEtLSBDb21tZW50ZWQga2FybWEgcG9pbnRzIHBhbmVsIGZ1bmN0aW9uYWxpdHkgLS0+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gU0VDVElPTjogQ1VSQVRFRF9QUk9HUkFNIGluLXByb2dyZXNzIGhhbmRsaW5nIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImlzQmF0Y2hJblByb2dyZXNzICYmIChjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0gJiYgYmF0Y2hEYXRhPy5lbnJvbGxlZCkgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgPGEgKm5nSWY9XCJzaG93U3RhcnQuc2hvdyAmJiAhaXNQb3N0QXNzZXNzbWVudFwiICAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiXG4gICAgICAgICAgW3JvdXRlckxpbmtdPVwicmVzdW1lRGF0YSA/IHJlc3VtZURhdGFMaW5rPy51cmwgOiBmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwicmVzdW1lRGF0YSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiXG4gICAgICAgICAgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPCAxMDBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCIgPlxuICAgICAgICAgICAgICB7eyByZXN1bWVEYXRhICYmIChjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwICYmIGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2U+IDApID8gdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIDpcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDBcIj5cbiAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgfHwgY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwID8gdHJhbnNsYXRlTGFiZWxzKCdTdGFydCBhZ2FpbicsICdhcHB0b2Nob21lJykgOiB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gU0VDVElPTjogTG9hZGluZyBzdGF0ZSBmb3IgZW5yb2xsbWVudCBidXR0b24gLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEwMCUnXCIgW2hlaWdodF09XCInMzZweCdcIlxuICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ2ZsZXggcm91bmRlZCBoLTgnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gU0VDVElPTjogQ1VSQVRFRF9QUk9HUkFNIGVucm9sbG1lbnQgYnV0dG9uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIihjbGljayk9XCJoYW5kbGVBdXRvQmF0Y2hBc3NpZ24oKVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgPlxuICAgICAgICAgICAgPCEtLSBFTlJPTEwgQlVUVE9OIExBQkVMIC0tPlxuICAgICAgICAgICAge3sgJ2FwcHRvY2hvbWUuZW5yb2xsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBTVEFOREFMT05FX0FTU0VTU01FTlQgZW5yb2xsbWVudCBidXR0b24gLS0+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UICYmICFiYXRjaERhdGE/LmVucm9sbGVkICYmICFlbnJvbGxCdG5Mb2FkaW5nICYmIGNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5ICE9PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgKGNsaWNrKT1cImhhbmRsZUF1dG9CYXRjaEFzc2lnbigpXCIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciA+XG4gICAgICAgICAgICA8IS0tIEVOUk9MTCBCVVRUT04gTEFCRUwgLS0+XG4gICAgICAgICAgICB7eyAnYXBwdG9jaG9tZS5lbnJvbGwnIHwgdHJhbnNsYXRlIH19IFxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBJTlZJVEUtT05MWSBTVEFOREFMT05FX0FTU0VTU01FTlQgbWVzc2FnZSAtLT4gICAgICBcbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQgJiYgIWVucm9sbEJ0bkxvYWRpbmcgJiYgY29udGVudD8uY291cnNlQ2F0ZWdvcnkgPT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuICAgIFxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3Rm9ySW52aXRlT25seUFzc2Vzc21lbnRcIiA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCBzaGFkb3ctbGcgdGV4dC1pbmZvLWRpdlwiID57eyAnYXBwdG9jaG9tZS55b3VBcmVOb3RJbnZpdGVkRm9yQXNzZXNzbWVudCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gU0VDVElPTjogRW5yb2xsZWQgSU5WSVRFLU9OTFkgU1RBTkRBTE9ORV9BU1NFU1NNRU5UIHRha2UgdGVzdCBidXR0b24gLS0+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UICYmIGJhdGNoRGF0YT8uZW5yb2xsZWQgJiYgaXNCYXRjaEluUHJvZ3Jlc3MgJiYgIWVucm9sbEJ0bkxvYWRpbmcgJiYgY29udGVudD8uY291cnNlQ2F0ZWdvcnkgPT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPiAgICAgICAgXG4gICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiIFtyb3V0ZXJMaW5rXT1cImZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgICAgIFtxdWVyeVBhcmFtc109XCIocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMFwiPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0QWdhaW4nIHwgdHJhbnNsYXRlIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPCAxMDBcIj57eyAnYXBwdG9jaG9tZS50YWtlVGVzdCcgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gU0VDVElPTjogU3RhdHVzIG1lc3NhZ2VzIGZvciBJTlZJVEUtT05MWSBTVEFOREFMT05FX0FTU0VTU01FTlQgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQmF0Y2hJblByb2dyZXNzICYmICEhY3VycmVudENvdXJzZUJhdGNoSWQgJiYgZ2V0U3RhcnREYXRlID09PSAnTkEnICYmIGNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5ID09PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgc2hhZG93LWxnIHRleHQtaW5mby1kaXZcIiA+e3sgJ2FwcHRvY2hvbWUubm9BY3RpdmVCYXRjaGVzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgIT09ICdOQScgJiYgY29udGVudD8uY291cnNlQ2F0ZWdvcnkgPT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCBzaGFkb3ctbGcgdGV4dC1pbmZvLWRpdlwiID57eyAnYXBwdG9jaG9tZS5iYXRjaFdpbGxTdGFydCcgfCB0cmFuc2xhdGUgfX0ge3tnZXRTdGFydERhdGV9fSE8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIFxuICAgICAgPCEtLSBTRUNUSU9OOiBSZWd1bGFyIFNUQU5EQUxPTkVfQVNTRVNTTUVOVCBlbnJvbGxlZCB0YWtlIHRlc3QgYnV0dG9uIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJiBiYXRjaERhdGE/LmVucm9sbGVkICYmICFlbnJvbGxCdG5Mb2FkaW5nICYmIGNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5ICE9PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgW3JvdXRlckxpbmtdPVwiZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cIihyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXCI+e3sgJ2FwcHRvY2hvbWUudGFrZVRlc3RBZ2FpbicgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMFwiPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0JyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTRUNUSU9OOiBCTEVOREVEX1BST0dSQU0gd29ya2Zsb3cgc3RhdHVzIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICA8IS0tIFJldmlldyBzdGF0dXMgbWVzc2FnZSAtLT5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImJhdGNoRGF0YT8ud29ya0Zsb3c/LndmSW5pdGlhdGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShiYXRjaERhdGE/LndvcmtGbG93Py53Zkl0ZW0/LmN1cnJlbnRTdGF0dXMgPT09IFdGQmxlbmRlZFByb2dyYW1TdGF0dXMuQVBQUk9WRUQgfHwgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFSkVDVEVEIHx8IGJhdGNoRGF0YT8ud29ya0Zsb3c/LndmSXRlbT8uY3VycmVudFN0YXR1cyA9PT0gV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5XSVRIRFJBV04pXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIndzLW1hdC1hY2NlbnQtdGV4dCB3cy1tYXQtYWNjZW50LWxpZ2h0LWJnIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHN0YXR1c01zZ1wiPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJtYXJnaW4tcmVtb3ZlLWJvdHRvbSBmb250LWJvbGRcIj5cbiAgICAgICAgICAgICAge3sgJ2FwcHRvY2hvbWUucmVxdWVzdFVuZGVyUmV2aWV3JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8IS0tIEFwcHJvdmVkIEJMRU5ERURfUFJPR1JBTSBzdGFydC9yZXN1bWUgYnV0dG9uIC0tPlxuICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgIDxhXG4gICAgICAgICAgICAqbmdJZj1cInNob3dTdGFydC5zaG93ICYmIGJhdGNoRGF0YT8ud29ya0Zsb3c/LndmSW5pdGlhdGVkICYmIGJhdGNoRGF0YT8ud29ya0Zsb3c/LndmSXRlbT8uY3VycmVudFN0YXR1cyA9PT0gV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5BUFBST1ZFRFwiXG4gICAgICAgICAgICBbcm91dGVyTGlua109XCJpc0JhdGNoSW5Qcm9ncmVzcz8gKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IHJlc3VtZURhdGFMaW5rPy51cmwgOiBmaXJzdFJlc291cmNlTGluaz8udXJsIDogJycgXCIgIChjbGljayk9XCJyYWlzZVRlbGVtZXRyeUZvclB1YmxpYygpXCJcbiAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCJpc0JhdGNoSW5Qcm9ncmVzcyA/IChyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJykgOiAnJyBcIlxuICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgW25nQ2xhc3NdPVwieydkaXNhYmxlLXN0YXJ0LWJ0bic6ICFpc0JhdGNoSW5Qcm9ncmVzc31cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIoIWNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCIgPlxuICAgICAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgJiYgKGNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPCAxMDAgJiYgY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZT4gMCkgPyB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgOlxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlTGFiZWxzKCdzdGFydCcsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgfHwgY2VydERhdGFcIj5cbiAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSB8fCBjb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyB0cmFuc2xhdGVMYWJlbHMoJ1N0YXJ0IGFnYWluJywgJ2FwcHRvY2hvbWUnKSA6IHRyYW5zbGF0ZUxhYmVscygnc3RhcnQnLCAnYXBwdG9jaG9tZScpIH19XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDwhLS0gU0VDVElPTjogRXh0ZXJuYWwgcmVnaXN0cmF0aW9uIGxpbmsgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQnRuU3RhdHVzID09ICdyZWplY3QnICYmIGNvbnRlbnQ/LnJlZ2lzdHJhdGlvblVybFwiPlxuICAgICAgICA8YSBbaHJlZl09XCJjb250ZW50Py5yZWdpc3RyYXRpb25VcmxcIiB0YXJnZXQ9XCJfYmxhbmtcIiBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlclwiID57eyAnYXBwdG9jaG9tZS5yZWdpc3RlcicgfCB0cmFuc2xhdGUgfX08L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDwhLS0gXG4gICAgUFJPR1JFU1MgRlVOQ1RJT05BTElUWSBURU1QTEFURVxuICAgIERpc3BsYXlzIHByb2dyZXNzIGJhciBhbmQgcmF0aW5nIGJ1dHRvbiBmdW5jdGlvbmFsaXR5XG4gIC0tPlxuICA8bmctdGVtcGxhdGUgI3Byb2dyZXNzRnVuY3Rpb25hbGl0eT5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00IHRleHQtc21cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgdGV4dC14c1wiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLm92ZXJhbGxQcm9ncmVzcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzXCIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA+IDBcIj4ge3sgY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgfX0gJTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDx3cy13aWRnZXQtY29udGVudC1wcm9ncmVzcyAqbmdJZj1cImNvbnRlbnQ/LmlkZW50aWZpZXJcIiBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCJcbiAgICAgICAgICAgIFtjb250ZW50SWRdPVwiY29udGVudD8uaWRlbnRpZmllclwiIFtwcm9ncmVzc109XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZVwiIFtwcm9ncmVzc1R5cGVdPVwiJ3BlcmNlbnRhZ2UnXCJcbiAgICAgICAgICAgIFtjdXN0b21DbGFzc05hbWVdPVwiJ2NvbnRlbnQtcHJvZ3Jlc3MnXCIgPlxuICAgICAgICAgIDwvd3Mtd2lkZ2V0LWNvbnRlbnQtcHJvZ3Jlc3M+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSA1MFwiPlxuICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cImFjY2VudFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJhdGUtYnV0dG9uXCIgKGNsaWNrKT1cIm9wZW5GZWVkYmFja0RpYWxvZyhjb250ZW50KVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPnN0YXJfcHVycGxlNTAwPC9tYXQtaWNvbj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXVzZXJSYXRpbmdcIj5cbiAgICAgICAgICAgIDxkaXY+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UucmF0ZU5vdycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlclJhdGluZ1wiPlxuICAgICAgICAgICAgPGRpdj57eyAnYXBwdG9jc2luZ2xlcGFnZS5lZGl0UmF0aW5nJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDwhLS0gXG4gICAgTUFJTiBDT05URU5UIERJU1BMQVkgU0VDVElPTlxuICAgIEJhbm5lciwgZGV0YWlscywgYW5kIGNvbnRlbnQgbGF5b3V0XG4gIC0tPlxuICA8ZGl2IGNsYXNzPVwidG9jLWJhbm5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC02IGZpeGVkLXdpZHRoXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYmFubmVyLWRldGFpbHMgdG9jLWNvbnRlbnRcIiAjYmFubmVyRGV0YWlscz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMzJweCdcIiBbaGVpZ2h0XT1cIiczMnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCBibHVlLTItbG9hZGVyJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxNDBweCdcIiBbaGVpZ2h0XT1cIicyNHB4J1wiIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHRhZy1kaXYgcm91bmRlZC0yeGwgZ2FwLTEgaXRlbXMtY2VudGVyIHAtMlwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwid3MtbWF0LW9yYW5nZS10ZXh0IG5vZHRyYW5zbGF0ZVwiPnZpZGVvX2xpYnJhcnk8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctMyBub2R0cmFuc2xhdGVcIj57eyB0cmFuc2xhdGVMYWJlbChjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSwgJ3NlYXJjaGZpbHRlcnMnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctMyBub2R0cmFuc2xhdGVcIj57eyB0cmFuc2xhdGVMYWJlbChjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnksICdzZWFyY2hmaWx0ZXJzJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiICpuZ0lmPVwiY2JQbGFuRW5kRGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGR1ZS10YWcgdGV4dC14cyBsZWFkaW5nLTNcIiBbbmdDbGFzc109XCJ7J2R1ZS13YXJuaW5nJzogY2JQbGFuRHVyYXRpb24gPT09IG5zQ2FyZENvbnRlbnREYXRhLlVQQ09NSU5HLCAnZHVlLW92ZXJkdWUnOiBjYlBsYW5EdXJhdGlvbiA9PT0gbnNDYXJkQ29udGVudERhdGEuT1ZFUkRVRSwgJ2R1ZS1zdWNjZXNzJzogY2JQbGFuRHVyYXRpb24gPT09IG5zQ2FyZENvbnRlbnREYXRhLlNVQ0NFU1N9XCIgPlxuICAgICAgICAgICAgICAgICAgICB7eyAnY29tbW9uLmR1ZUJ5JyB8IHRyYW5zbGF0ZSB9fSAtICZuYnNwOzxzcGFuIGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgY2JQbGFuRW5kRGF0ZSB8IGRhdGU6ICdkIE1NTSwgeSd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgdGV4dC13aGl0ZSBtb2Itc2hhcmVcIiAqbmdJZj1cImNhblNoYXJlXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiIChjbGljayk9XCJvbkNsaWNrT2ZTaGFyZSgpXCI+c2hhcmU8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzkwJSdcIiBbaGVpZ2h0XT1cIiczMnB4J1wiXG4gICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCBibHVlLTItbG9hZGVyJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic3MCUnXCIgW2hlaWdodF09XCInMzJweCdcIlxuICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhbm5lci10ZXh0IHRleHQtYmFzZSBzbTp0ZXh0LTR4bCBsZWFkaW5nLTYgc206bGVhZGluZy0xMCBmb250LWJvbGQgbm9kdHJhbnNsYXRlXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShjb250ZW50Py5uYW1lKSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBzbTp0ZXh0LWJhc2Ugc291cmNlLXRleHQgZm9udC1zZW1pYm9sZCBicmVhay13b3JkcyBub2R0cmFuc2xhdGVcIiAjY29udGVudFNvdXJjZSBbbmdDbGFzc109XCJ7J3NvdXJjZUVsbGlwc2lzJzogc291cmNlRWxsaXBzaXN9XCIgdGl0bGU9XCJ7e2NvbnRlbnQ/LnNvdXJjZX19XCI+e3sgJ2NhcmRjb250ZW50djIuYnknIHwgdHJhbnNsYXRlIH19IHt7IGNvbnRlbnQ/LnNvdXJjZSB9fTwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyMHB4J1wiIFtoZWlnaHRdPVwiJzQwcHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzg4cHgnXCIgW2hlaWdodF09XCInMjRweCdcIlxuICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTQgaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjb250ZW50Py5hdmVyYWdlUmF0aW5nIHx8IGNvbnRlbnQ/LmFkZGl0aW9uYWxUYWdzPy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyByYXRpbmctY2hpcCBweS0yIGl0ZW1zLWNlbnRlciBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJoYW5kbGVOYXZpZ2F0ZVRvUmV2aWV3cygpXCIgKm5nSWY9XCJjb250ZW50Py5hdmVyYWdlUmF0aW5nXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBtYXJnaW4tbGVmdC1zIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5ncmFkZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXdoaXRlIHRleHQtc20gbGVhZGluZy00XCI+e3sgY29udGVudD8uYXZlcmFnZVJhdGluZyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VwYXJhdG9yXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC13aGl0ZSB0ZXh0LXNtIGxlYWRpbmctNCBtYXJnaW4tcmlnaHQtbVwiPnt7IGNvbnRlbnQ/LnRvdGFsUmF0aW5nIHwgcGlwZUNvdW50VHJhbnNmb3JtIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjb250ZW50Py5hZGRpdGlvbmFsVGFncz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9zdC1lbnJvbGxlZC1jaGlwIHRleHQteHMgbGVhZGluZy0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29udGVudD8uYWRkaXRpb25hbFRhZ3M/LmluY2x1ZGVzKCdtb3N0VHJlbmRpbmcnKVwiPnt7ICdjYXJkY29udGVudHYyLm1vc3RUcmVuZGluZycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29udGVudD8uYWRkaXRpb25hbFRhZ3M/LmluY2x1ZGVzKCdtb3N0RW5yb2xsZWQnKVwiPnt7ICdjYXJkY29udGVudHYyLm1vc3RFbnJvbGxlZCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTgwcHgnXCIgW2hlaWdodF09XCInMjBweCdcIlxuICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgY29udGVudD8uc1lTX0lOVEVSTkFMX0xBU1RfVVBEQVRFRF9PTlwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbGVhZGluZy00IHNvdXJjZS10ZXh0IG5vZHRyYW5zbGF0ZVwiPih7eyAnYXBwdG9jLmxhc3RVcGRhdGVkT24nIHwgdHJhbnNsYXRlIH19IHt7IGNvbnRlbnQ/LnNZU19JTlRFUk5BTF9MQVNUX1VQREFURURfT04gfCBkYXRlOiAnTU1NIGQsIHknIH19KTwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNiBmaXhlZC13aWR0aFwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0b2MtY29udGVudFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSAmJlxuICAgICAgICBzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uYmF0Y2hBdHRyaWJ1dGVzPy5iYXRjaExvY2F0aW9uRGV0YWlscyAmJlxuICAgICAgICBzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uZW5yb2xsbWVudEVuZERhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWRldGFpbHMgbXQtNlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNCBwYi0zXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJsb2NhdGlvbi1pY29uIG5vZHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICAgIGxvY2F0aW9uX29uXG4gICAgICAgICAgICA8L21hdC1pY29uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYy1kZXNjXCI+XG4gICAgICAgICAgICAgIHt7c2VsZWN0ZWRCYXRjaERhdGE/LmNvbnRlbnRbMF0/LmJhdGNoQXR0cmlidXRlcz8uYmF0Y2hMb2NhdGlvbkRldGFpbHN9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC00XCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImV2ZW50LWljb24gbm9kdHJhbnNsYXRlXCI+XG4gICAgICAgICAgICAgICAgZXZlbnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYy1kZXNjXCI+XG4gICAgICAgICAgICAgIExhc3QgZGF0ZSBvZiBlbnJvbGxtZW50IC0ge3tzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uZW5yb2xsbWVudEVuZERhdGUgfCBkYXRlOiAnZGQvTU0veXl5eSd9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVjb21tZW5kZWRDb3Vyc2VzSWQgJiYgIWZlZWRiYWNrR2l2ZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInB4LTQgcHktMyBtdC02IHJlbGV2ZW50LXdyYXBwZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBpdGVtcy1jZW50ZXIgZmxleC13cmFwIGZsZXgganVzdGlmeS1jZW50ZXIgbWQ6anVzdGlmeS1zdGFydFwiPlxuICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ltYWdlcy9zYWtzaGFtQUkvbGFkeS1ncmVldC5zdmdcIiBhbHQ9XCJncmVldFwiIHdpZHRoPVwiNTYuODlcIiBoZWlnaHQ9XCI2NFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGV2ZW50LWluZm9cIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGRlciB0ZXh0LXNtIHJlbGV2ZW50LWhlYWRpbmcgYmxvY2sgbWItMVwiPnt7ICdob21lLnRvY1JlbGV2ZW50SGVhZGluZycgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVsZXZlbnQtc3ViaW5mbyBmb250LW5vcm1hbCB0ZXh0LXNtIGJsb2NrXCI+e3sgJ2hvbWUudG9jUmVsZXZlbnRTdWJIZWFkaW5nJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1taWRkbGUgcmVsZXZhbnQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbWlkZGxlIHJlbGV2ZW50LW5vcm1hbCByZWxldmVudC1idG4gcHktMiBweC00IHJlbGV2YW50LWJveFwiXG4gICAgICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwiaXNSZWxldmVudEJ0bkhvdmVyZWQgPSB0cnVlXCJcbiAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJpc1JlbGV2ZW50QnRuSG92ZXJlZCA9IGZhbHNlXCIgKGNsaWNrKT1cImhhbmRsZUFjY2VwdFJlbGV2ZW50KClcIj5cbiAgICAgICAgICAgICAgICA8aW1nXG4gICAgICAgICAgICAgICAgICBbc3JjXT1cImlzUmVsZXZlbnRCdG5Ib3ZlcmVkICYmICFpc1JlbGV2ZW50ID8gU0FLU0hBTUFJX0lDT05fTE9BREVSIDogU0FLU0hBTUFJX0lDT05fTk9STUFMXCJcbiAgICAgICAgICAgICAgICAgIGFsdD1cImxvYWRlclwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGNsYXNzPVwibXItMlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1yZWxldmVudCBmZi1sYXRvIHRleHQtc20gZm9udC1ib2xkXCI+e3sgJ2hvbWUucmVsZXZlbnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbWlkZGxlIG5vLWJ1dHRvbiBtbC04XCIgKGNsaWNrKT1cImhhbmRsZURlY2xpbmVSZWxldmVudCgpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LWljb24gdGV4dC1ubyBtci0xIG5vZHRyYW5zbGF0ZVwiPnRodW1iX2Rvd248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ubyBmZi1sYXRvIHRleHQtc20gZm9udC1ib2xkXCI+e3sgJ2hvbWUubm8nIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj4gIFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGItNCBsZzpweS00XCI+XG4gICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLXByb2dyZXNzXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJwcm9ncmVzc0Z1bmN0aW9uYWxpdHlcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuXG4gICAgICAgIDx3cy13aWRnZXQtY29udGVudC10b2MgW2NvbnRlbnRdPVwiY29udGVudFwiIFtjb21wb25lbnROYW1lXT1cIid0b2MnXCIgIFtwYXRoU2V0XT1cInBhdGhTZXRcIiBbdG9jU3RydWN0dXJlXT1cInRvY1N0cnVjdHVyZVwiIFxuICAgICAgICBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCIgIFtpc0Vucm9sbGVkXT1cImJhdGNoRGF0YT8uZW5yb2xsZWRcIiBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJzZWxlY3RlZEJhdGNoRGF0YVwiIFtza2VsZXRvbkxvYWRlcl09XCJza2VsZXRvbkxvYWRlclwiIFxuICAgICAgICBbY2hhbmdlVGFiXT1cImNoYW5nZVRhYlwiIFtoaWVyYXJjaHlNYXBEYXRhXT1cInRvY1N2Yz8uaGFzaG1hcFwiIFtzZWxlY3RlZEJhdGNoRGF0YV09XCJzZWxlY3RlZEJhdGNoRGF0YVwiIFtjb25kaXRpb25dPVwie2lzUG9zdEFzc2Vzc21lbnQ6IGlzUG9zdEFzc2Vzc21lbnQsIGNvbnRlbnQ6IGNvbnRlbnQsIGlzQWNicENvdXJzZTogaXNBY2JwQ291cnNlLCBpc0NsYWltZWQ6IGlzQ2xhaW1lZCwgbW9udGhseUNhcEV4Y2VlZDogbW9udGhseUNhcEV4Y2VlZCwgaXNDb21wbGV0ZWRUaGlzTW9udGg6IGlzQ29tcGxldGVkVGhpc01vbnRoLCBzaG93VGFrZUFzc2Vzc21lbnQ6IHNob3dUYWtlQXNzZXNzbWVudCwgdXNlckVucm9sbG1lbnRMaXN0OiB1c2VyRW5yb2xsbWVudExpc3QsIHJlc3VtZURhdGE6IHJlc3VtZURhdGEsIHVzZXJSYXRpbmc6IHVzZXJSYXRpbmcsIGVucm9sbEJ0bkxvYWRpbmc6IGVucm9sbEJ0bkxvYWRpbmcsIHByaW1hcnlDYXRlZ29yeTogcHJpbWFyeUNhdGVnb3J5LCBjdXJyZW50Q291cnNlQmF0Y2hJZDogY3VycmVudENvdXJzZUJhdGNoSWQsIGlzQWNicENsYWltOiBpc0FjYnBDbGFpbX1cIiBba3BhcnJheV09XCJrcGFycmF5XCJcbiAgICAgICAgKHBsYXlSZXN1bWVGb3JBSSk9XCJwbGF5UmVzdW1lRm9yQUkoKVwiIChlbnJvbGxVc2VyVG9BSSk9XCJlbnJvbGxVc2VyVG9BSSgpXCIgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIj48L3dzLXdpZGdldC1jb250ZW50LXRvYz5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vYi10aXAtZm9yLWxlYXJuZXJcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwibGVhcm5BZHZpc29yeURhdGEgJiYgbGVhcm5BZHZpc29yeURhdGE/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC10aXBzLWZvci1sZWFybmVyLWNhcmQgW2xlYXJuQWR2aXNvcnlEYXRhXT1cImxlYXJuQWR2aXNvcnlEYXRhXCI+PC93cy13aWRnZXQtdGlwcy1mb3ItbGVhcm5lci1jYXJkPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBcblxuICAgIDxkaXYgY2xhc3M9XCJyaWdodC1jb250YWluZXJcIiA+XG4gICAgICA8IS0tIGlmIG5lZWRlZCBzdGlja3kgb2YgcmlnaHQgY29udGFpbmVyIGFkZCB0aGlzIHRvIGJlbG93IGRpdiA9PiAjcmlnaHRDb250YWluZXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtY29udGVudC1pbm5lclwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzM4NHB4J1wiIFtoZWlnaHRdPVwiJzIyNHB4J1wiXG4gICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpbWFnZS1kaXZcIiBbbmdTdHlsZV09XCJ7XG4gICAgICAgICdiYWNrZ3JvdW5kLWltYWdlJzogJ3VybCgnICsgY29udGVudD8ucG9zdGVySW1hZ2UgKyAnKScsICdiYWNrZ3JvdW5kLXJlcGVhdCc6ICduby1yZXBlYXQnLCAnYmFja2dyb3VuZC1zaXplJzogJ2NvdmVyJ31cIiBbbmdDbGFzc109XCJ7J2ltYWdlLWJhY2tkcm9wJzogc2Nyb2xsZWR9XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBqdXN0aWZ5LWJldHdlZW4gdGV4dC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC00IGp1c3RpZnktYmV0d2VlblwiIFtuZ0NsYXNzXT1cInsnanVzdGlmeS1iZXR3ZWVuJzogc2Nyb2xsZWQsICdqdXN0aWZ5LWVuZCc6ICFzY3JvbGxlZH1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyB0YWctZGl2IHJvdW5kZWQtMnhsIGdhcC0xIGl0ZW1zLWNlbnRlciBwLTJcIiAqbmdJZj1cInNjcm9sbGVkXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJ3cy1tYXQtb3JhbmdlLXRleHQgbm9kdHJhbnNsYXRlXCI+dmlkZW9fbGlicmFyeTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY291cnNlQ2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgZm9udC1ib2xkIHRleHQtd2hpdGUgbGVhZGluZy0zXCI+e3sgdHJhbnNsYXRlTGFiZWwoY29udGVudD8uY291cnNlQ2F0ZWdvcnksICdzZWFyY2hmaWx0ZXJzJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb250ZW50Py5jb3Vyc2VDYXRlZ29yeVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBmb250LWJvbGQgdGV4dC13aGl0ZSBsZWFkaW5nLTNcIj57eyB0cmFuc2xhdGVMYWJlbChjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnksICdzZWFyY2hmaWx0ZXJzJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cIm9uQ2xpY2tPZlNoYXJlKClcIiBjbGFzcz1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIGdhcC0yIHNoYXJlLXRhZ1wiICpuZ0lmPVwiY2FuU2hhcmUgJiYgIWZvclByZXZpZXcgJiYgKGRvbWFpbkNvbmZTZXJ2aWNlPy5pc0ZlYXR1cmVCeVBhZ2VFbmFibGVkKCd0b2MnLCdzaGFyZVRvYycpKVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+c2hhcmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPGRpdj57eyAnYXBwdG9jc2luZ2xlcGFnZS5zaGFyZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xXCIgKm5nSWY9XCJzY3JvbGxlZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhsIGxlYWRpbmctNiB0ZXh0LXdoaXRlIGZvbnQtYm9sZFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY29udGVudD8ubmFtZSkgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSBzb3VyY2UtdGV4dCBmb250LXNlbWlib2xkIGJyZWFrLXdvcmRzXCIgI2NvbnRlbnRTb3VyY2UgW25nQ2xhc3NdPVwieydzb3VyY2VFbGxpcHNpcyc6IHNvdXJjZUVsbGlwc2lzfVwiIHRpdGxlPVwie3tjb250ZW50Py5zb3VyY2V9fVwiPnt7ICdjYXJkY29udGVudHYyLmJ5JyB8IHRyYW5zbGF0ZSB9fSB7eyBjb250ZW50Py5zb3VyY2UgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgcC01IGJvcmRlci1ib3R0b21cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiICpuZ0lmPVwiY29udGVudCAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0zIGp1c3RpZnktYXJvdW5kXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uYmF0Y2hBdHRyaWJ1dGVzPy5jdXJyZW50QmF0Y2hTaXplIHx8ICcwJyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1sYWJlbFwiPnt7ICdhcHB0b2MuYmF0Y2hTaXplJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhdGNoLWluZm9cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1iYXNlIGZvbnQtYm9sZFwiPnt7IHNlbGVjdGVkQmF0Y2hEYXRhPy51c2VyQ291bnQ/LnRvdGFsQXBwbGllZCB8fCAnMCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLnRvdGFsQXBwbGllZCcgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYmFzZSBmb250LWJvbGRcIj57eyBzZWxlY3RlZEJhdGNoRGF0YT8udXNlckNvdW50Py5lbnJvbGxlZCB8fCAnMCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmF0Y2gtbGFiZWxcIj57eyAnYXBwdG9jLnRvdGFsRW5yb2xsZWQnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGltZXIgJiYgdGltZXIuZGF5cyA+PSAwICYmIGNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNiBiYXRjaC10aW1lclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IHVuZGVybGluZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmJhdGNoU3RhcnRzSW4nIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB1bmRlcmxpbmVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtNHhsIGxlYWRpbmctMTAgY291bnRlclwiPnt7IHRpbWVyLmRheXMgfHwgMCB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmRheXMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvdW50ZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIubWluID09PSA2MCA/IHRpbWVyLmhvdXJzICsgMSA6IHRpbWVyLmhvdXJzIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuaG91cnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvdW50ZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgOlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIubWluID09PSA2MCA/IDAwIDogdGltZXIubWluIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UubWludXRlcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWU7IGVsc2UgYXV0aFZpZXdCdG5cIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFtb2JpbGUxMjAwICYmIHByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgPHdzLWFwcC10b2MtYmFubmVyIHJvbGU9XCJiYW5uZXJcIiBbYmFubmVyc109XCJiYW5uZXJzXCIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIFtjb250ZW50XT1cImNvbnRlbnRcIlxuICAgICAgICAgICAgICAgIFt1c2VyRW5yb2xsbWVudExpc3RdPVwidXNlckVucm9sbG1lbnRMaXN0XCIgKHdpdGhkcmF3T3JFbnJvbGwpPVwid2l0aGRyYXdPckVucm9sbCgkZXZlbnQpXCIgW2FuYWx5dGljc109XCJhbmFseXRpY3NcIlxuICAgICAgICAgICAgICAgIFtyZXN1bWVEYXRhXT1cInJlc3VtZURhdGFcIiBbYmF0Y2hEYXRhXT1cImJhdGNoRGF0YVwiIFtjb250ZW50UmVhZERhdGFdPVwiY29udGVudFJlYWREYXRhXCI+XG4gICAgICAgICAgICAgICAgPC93cy1hcHAtdG9jLWJhbm5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczMzZweCdcIiBbaGVpZ2h0XT1cIic0MHB4J1wiXG4gICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczMzZweCdcIiBbaGVpZ2h0XT1cIic2OHB4J1wiXG4gICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGdhcC0yIGluZm8tZGl2XCIgKm5nSWY9XCJjb250ZW50Py5pc0luSW50cmFuZXQgJiYgc2hvd0ludHJhbmV0TXNnXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+aW5mbzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciA+e3sgJ2FwcHRvY2hvbWUudmlld2VkSW5JbnRyYW5ldCcgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtMiBpbmZvLWRpdlwiICpuZ0lmPVwic2hvd0luc3RydWN0b3JMZWRNc2dcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5pbmZvPC9tYXQtaWNvbj4mbmJzcDtcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyID57eyAnYXBwdG9jaG9tZS5ub3RBdmFpbGFibGVPbmxpbmUnIHwgdHJhbnNsYXRlIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIgZ2FwLTIgaW5mby1kaXZcIiAqbmdJZj1cInNob3dTdGFydC5tc2cgPT09ICd5b3V0dWJlRm9yYmlkZGVuJ1wiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPmluZm88L21hdC1pY29uPiZuYnNwO1xuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgPnt7ICdhcHB0b2Nob21lLnlvdXR1YmVDb250ZW50QmxvY2tlZCcgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93QnRuXCI+XG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cInt7IGNzY21zVXJsIH19XCIgdGFyZ2V0PVwiX2JsYW5rXCIgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmFwcGx5Rm9yUGh5c2ljYWxUcmFpbmluZycgfCB0cmFuc2xhdGUgfX08L2E+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblN0YXR1cyA8PSAyICYmIGlzQmF0Y2hJblByb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJwcm9ncmVzc0Z1bmN0aW9uYWxpdHlcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwhLS0gT3ZlcmFsbCBwcm9ncmVzcyBmdW5jdGlvbmFsaXR5IC0tPlxuXG4gICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInJlc3VtZURhdGEgJiYgIXVzZXJSYXRpbmdcIj4gLS0+XG4gICAgICAgICAgICAgICAgPCEtLSA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidSYXRlIHRoaXMgY291cnNlJ1wiIFtkYXRhXT1cImtwYXJyYXlcIlxuICAgICAgICAgICAgICAgICAgW3BDYXRlZ29yeV09XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD4gLS0+XG4gICAgICAgICAgICAgIDwhLS0gPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInJlc3VtZURhdGEgJiYgdXNlclJhdGluZ1wiPlxuICAgICAgICAgICAgICAgIDx3cy1hcHAta2FybWFwb2ludHMtcGFuZWwgW2J0bnR5cGVdPVwiJ0VkaXQgcmF0aW5nJ1wiIFtkYXRhXT1cImtwYXJyYXlcIlxuICAgICAgICAgICAgICAgICAgW3BDYXRlZ29yeV09XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgICAgPC9kaXY+IC0tPlxuXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhY3Rpb25CdG5TdGF0dXMgIT09ICd3YWl0JyAmJiBjb250ZW50Py5zdGF0dXMgIT09ICdEZWxldGVkJyAmJiBjb250ZW50Py5zdGF0dXMgIT09ICdFeHBpcmVkJ1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZW5yb2xsRnVuY3Rpb25hbGl0eVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwia2FybWEtcG9pbnRzLWRpdlwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWthcm1hLXBvaW50cyBbZGF0YV09XCJrcGFycmF5XCIgKGNsaWNrQ2xhaW1LYXJtYVBvaW50cyk9XCJvbkNsaWNrT2ZDbGFpbSgkZXZlbnQpXCIgW2NvbnRlbnRdID0gXCJjb250ZW50XCJcbiAgICAgICAgICAgICAgICBbY29uZGl0aW9uXT1cIntpc1Bvc3RBc3Nlc3NtZW50OiBpc1Bvc3RBc3Nlc3NtZW50LCBjb250ZW50OiBjb250ZW50LCBpc0FjYnBDb3Vyc2U6IGlzQWNicENvdXJzZSwgaXNDbGFpbWVkOiBpc0NsYWltZWQsIG1vbnRobHlDYXBFeGNlZWQ6IG1vbnRobHlDYXBFeGNlZWQsIGlzQ29tcGxldGVkVGhpc01vbnRoOiBpc0NvbXBsZXRlZFRoaXNNb250aCwgc2hvd1Rha2VBc3Nlc3NtZW50OiBzaG93VGFrZUFzc2Vzc21lbnQsIHVzZXJFbnJvbGxtZW50TGlzdDogdXNlckVucm9sbG1lbnRMaXN0LCBpc0NvbXBsZXRlZFRoaXNNb250aDogaXNDb21wbGV0ZWRUaGlzTW9udGgsIHJlc3VtZURhdGE6IHJlc3VtZURhdGEsIHVzZXJSYXRpbmc6IHVzZXJSYXRpbmcsIGVucm9sbEJ0bkxvYWRpbmc6IGVucm9sbEJ0bkxvYWRpbmcsIHByaW1hcnlDYXRlZ29yeTogcHJpbWFyeUNhdGVnb3J5LCBjdXJyZW50Q291cnNlQmF0Y2hJZDogY3VycmVudENvdXJzZUJhdGNoSWQsIGlzQWNicENsYWltOiBpc0FjYnBDbGFpbX1cIj48L3dzLXdpZGdldC1rYXJtYS1wb2ludHM+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC13cmFwIGdhcC02XCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMiBrcGktbG9hZGVyLWRpdlwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzQ4cHgnXCIgW2hlaWdodF09XCInOHB4J1wiIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0yIGtwaS1sb2FkZXItZGl2XCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyOHB4J1wiIFtoZWlnaHRdPVwiJzI4cHgnXCJcbiAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNDhweCdcIiBbaGVpZ2h0XT1cIic4cHgnXCIgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpdGVtcy1jZW50ZXIgZ2FwLTIga3BpLWxvYWRlci1kaXZcIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzI4cHgnXCIgW2hlaWdodF09XCInMjhweCdcIlxuICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIiBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMiBrcGktbG9hZGVyLWRpdlwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMjhweCdcIiBbaGVpZ2h0XT1cIicyOHB4J1wiXG4gICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzQ4cHgnXCIgW2hlaWdodF09XCInOHB4J1wiIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0yIGtwaS1sb2FkZXItZGl2XCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyOHB4J1wiIFtoZWlnaHRdPVwiJzI4cHgnXCJcbiAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNDBweCdcIiBbaGVpZ2h0XT1cIic4cHgnXCIgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIiBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtdG9jLWtwaS12YWx1ZXMgW2NvbnRlbnRdPVwiY29udGVudFwiIFt0b2NTdHJ1Y3R1cmVdPVwidG9jU3RydWN0dXJlXCIgW3Nob3dJbnN0cnVjdG9yTGVkTXNnXT1cInNob3dJbnN0cnVjdG9yTGVkTXNnXCIgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIj48L3dzLXdpZGdldC10b2Mta3BpLXZhbHVlcz5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTggcC01XCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiICpuZ0Zvcj1cImxldCBpIG9mIFsxLCAyXVwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzcycHgnXCIgW2hlaWdodF09XCInMjBweCdcIiBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzM2cHgnXCIgW2hlaWdodF09XCInMzZweCdcIiBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkLWZ1bGwnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyNHB4J1wiIFtoZWlnaHRdPVwiJzIwcHgnXCIgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyNHB4J1wiIFtoZWlnaHRdPVwiJzEycHgnXCIgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiICpuZ0lmPVwiaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50UmVhZERhdGE/LmNyZWF0b3JEZXRhaWxzKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1ib2xkXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuYXV0aG9ycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTQgaXRlbXMtY2VudGVyXCIgKm5nRm9yPVwibGV0IGF1dGhvciBvZiBoYW5kbGVQYXJzZUpzb25EYXRhKGNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckRldGFpbHMpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBbcmFuZG9tQ29sb3JdPVwidHJ1ZVwiIFtkYXRhbGVuXT1cIjFcIiBbc2l6ZV09XCIncm91bmQtbSdcIiBbcGhvdG9VcmxdPVwiYXV0aG9yPy5waG90byB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImF1dGhvcj8ubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtYXZhdGFyLXBob3RvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShhdXRob3I/Lm5hbWUsICduYW1lJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGxlYWRpbmctM1wiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmF1dGhvcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTNcIiAqbmdJZj1cImhhbmRsZVBhcnNlSnNvbkRhdGEoY29udGVudD8uY3JlYXRvckNvbnRhY3RzKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1ib2xkXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY3VyYXRvcnMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00XCIgKm5nRm9yPVwibGV0IGNyZWF0b3Igb2YgaGFuZGxlUGFyc2VKc29uRGF0YShjb250ZW50Py5jcmVhdG9yQ29udGFjdHMpXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LWF2YXRhci1waG90byBbcmFuZG9tQ29sb3JdPVwidHJ1ZVwiIFtkYXRhbGVuXT1cIjFcIiBbc2l6ZV09XCIncm91bmQtbSdcIiBbcGhvdG9VcmxdPVwiYXV0aG9yPy5waG90byB8fCAnJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtuYW1lXT1cImNyZWF0b3I/Lm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgIDwvd3Mtd2lkZ2V0LWF2YXRhci1waG90bz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IGhhbmRsZUNhcGl0YWxpemUoY3JlYXRvcj8ubmFtZSwgJ25hbWUnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgbGVhZGluZy0zXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuY3VyYXRvcicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiICpuZ0lmPVwiY29udGVudD8uc291cmNlICAmJiAoY29udGVudENyZWF0b3JEYXRhICYmIGNvbnRlbnRDcmVhdG9yRGF0YT8ubGVuZ3RoKVwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1iYXNlIGZvbnQtYm9sZFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLnByb3ZpZGVyJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBpdGVtcy1jZW50ZXJcIiAqbmdGb3I9XCJsZXQgY3JlYXRvciBvZiBjb250ZW50Q3JlYXRvckRhdGFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBwcm92aWRlci1sb2dvLWRpdlwiPlxuICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImNvbnRlbnQ/LmNyZWF0b3JMb2dvXCIgW3NyY109XCJjb250ZW50Py5jcmVhdG9yTG9nb1wiIGFsdD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLnByb3ZpZGVyJyB8IHRyYW5zbGF0ZSB9fVwiIC8+XG4gICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwiIWNvbnRlbnQ/LmNyZWF0b3JMb2dvXCIgY2xhc3M9XCJtYXQtaWNvblwiIHNyYz1cIi9hc3NldHMvaW5zdGFuY2VzL2VhZ2xlL2FwcF9sb2dvcy9LYXJtYXlvZ2lCaGFyYXRfTG9nby5zdmdcIiBhbHQ9XCJ7eyAnYXBwdG9jc2luZ2xlcGFnZS5wcm92aWRlcicgfCB0cmFuc2xhdGUgfX1cIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHdvcmQtYnJlYWsgY3Vyc29yLXBvaW50ZXJcIiAqbmdJZj1cImNvbnRlbnQ/LmNyZWF0ZWRGb3I/Lmxlbmd0aFwiIChjbGljayk9XCJyYWlzZVRlbGVtZXRlcnlGb3JQcm92aWRlcihjb250ZW50Py5zb3VyY2UsIGNvbnRlbnQ/LmNyZWF0ZWRGb3JbMF0pXCJcbiAgICAgICAgICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cIlsnL2FwcC9sZWFybi9icm93c2UtYnkvcHJvdmlkZXInLCBjb250ZW50Py5zb3VyY2UsIGNvbnRlbnQ/LmNyZWF0ZWRGb3JbMF0sICdtaWNyby1zaXRlcyddXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShjb250ZW50Py5zb3VyY2UsICdzb3VyY2UnKSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHdvcmQtYnJlYWtcIiAqbmdJZj1cIiFjb250ZW50Py5jcmVhdGVkRm9yPy5sZW5ndGhcIj57eyBoYW5kbGVDYXBpdGFsaXplKGNvbnRlbnQ/LnNvdXJjZSwgJ3NvdXJjZScpIH19XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwibGVhcm5BZHZpc29yeURhdGEgJiYgbGVhcm5BZHZpc29yeURhdGE/Lmxlbmd0aFwiPlxuICAgICAgPHdzLXdpZGdldC10aXBzLWZvci1sZWFybmVyLWNhcmQgW2xlYXJuQWR2aXNvcnlEYXRhXT1cImxlYXJuQWR2aXNvcnlEYXRhXCI+PC93cy13aWRnZXQtdGlwcy1mb3ItbGVhcm5lci1jYXJkPlxuICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgIFxuXG4gIDwvZGl2PlxuPC9kaXY+XG5cbiAgPCEtLSBNb2JpbGUgZW5yb2xsbWVudCBidXR0b24gY29udGFpbmVyIC0tPlxuICA8ZGl2IGNsYXNzPVwibW9iaWxlLWVucm9sbC1kaXZcIiBbbmdDbGFzc109XCJ7J2JnLXdoaXRlJzogY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNIH1cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudCAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItMlwiICpuZ0lmPVwibW9iaWxlMTIwMCAmJiAhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3QnRuXCI+XG4gICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICBbdXNlckVucm9sbG1lbnRMaXN0XT1cInVzZXJFbnJvbGxtZW50TGlzdFwiICh3aXRoZHJhd09yRW5yb2xsKT1cIndpdGhkcmF3T3JFbnJvbGwoJGV2ZW50KVwiIFthbmFseXRpY3NdPVwiYW5hbHl0aWNzXCJcbiAgICAgICAgICBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbY29udGVudFJlYWREYXRhXT1cImNvbnRlbnRSZWFkRGF0YVwiPlxuICAgICAgICA8L3dzLWFwcC10b2MtYmFubmVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBSZXVzZSBlbnJvbGxtZW50IGZ1bmN0aW9uYWxpdHkgdGVtcGxhdGUgZm9yIG1vYmlsZSAtLT5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImVucm9sbEZ1bmN0aW9uYWxpdHlcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPHdzLWFwcC1zaGFyZS10b2MgKm5nSWY9XCJlbmFibGVTaGFyZVwiIFtyb290T3JnSWRdPVwicm9vdE9yZ0lkXCIgW2NvbnRlbnRdPVwiY29udGVudFwiIChyZXNldEVuYWJsZVNoYXJlKT1cInJlc2V0RW5hYmxlU2hhcmUoJGV2ZW50KVwiPjwvd3MtYXBwLXNoYXJlLXRvYz5cbjwvbmctY29udGFpbmVyPlxuXG48IS0tIFRlbXBsYXRlIGZvciB3aGVuIG5vIGRhdGEgaXMgZm91bmQgLS0+XG48bmctdGVtcGxhdGUgI25vRGF0YUZvdW5kPlxuICA8ZGl2IGNsYXNzPVwiZXJyb3Itbm90LWZvdW5kIGZsZXggZmxleC13cmFwcGVkIG1hcmdpbi1sZWZ0LW0gbWFyZ2luLXRvcC14bCBtYXJnaW4tcmlnaHQtbSBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZXJyb3ItbG9nb1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImVycm9yLW1lc3NhZ2Ugd3MtbWF0LXByaW1hcnktdGV4dCBmb250LXdlaWdodC1ib2xkXCIgPlxuICAgICAgICBUaGUgcGFnZSB5b3UgcmVxdWVzdGVkIGNhbm5vdCBiZSBmb3VuZFxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBBdXRoZW50aWNhdGlvbiB2aWV3IHRlbXBsYXRlcyAtLT5cbjxuZy10ZW1wbGF0ZSAjYXV0aFZpZXc+e3snYXBwdG9jaG9tZS52aWV3JyB8IHRyYW5zbGF0ZX19PC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhdXRoVmlld0J0biBpMThuPlxuICA8YSAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiIFtyb3V0ZXJMaW5rXT1cIihyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyByZXN1bWVEYXRhTGluaz8udXJsIDogZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiIFtxdWVyeVBhcmFtc109XCIocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCJcbiAgICBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlclwiPlxuICAgIHt7J2FwcHRvY2hvbWUudmlldycgfCB0cmFuc2xhdGV9fVxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2F1dGhWaWV3Rm9ySW52aXRlT25seUFzc2Vzc21lbnQ+XG4gIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJmb3JQcmV2aWV3ICYmIGNvbnRlbnQ/LmNvdXJzZUNhdGVnb3J5ID09PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj4gICAgICAgIFxuICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiPiAgICAgICAgICBcbiAgICAgICAgICA8bmctY29udGFpbmVyPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0JyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=