@sunbird-cb/cbp-ai 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/ai-cbp-routing.module.mjs +5 -1
- package/esm2022/lib/ai-cbp.module.mjs +10 -5
- package/esm2022/lib/components/approval-request-form/approval-request-form.component.mjs +2 -2
- package/esm2022/lib/components/dashboard/dashboard.component.mjs +3 -3
- package/esm2022/lib/components/designation-approval-request-form/designation-approval-request-form.component.mjs +392 -0
- package/esm2022/lib/components/review-request/review-request.component.mjs +7 -1
- package/esm2022/lib/components/role-mapping-generation/role-mapping-generation.component.mjs +3 -4
- package/esm2022/lib/components/role-mapping-list/role-mapping-list.component.mjs +44 -20
- package/esm2022/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.mjs +2 -1
- package/esm2022/lib/modules/shared/services/init.service.mjs +2 -2
- package/esm2022/lib/modules/shared/services/shared.service.mjs +12 -2
- package/esm2022/lib/modules/upload-document-page/upload-document-page.component.mjs +3 -1
- package/esm2022/lib/resolver/init-resolver.sevice.mjs +20 -0
- package/esm2022/public-api.mjs +19 -1
- package/fesm2022/sunbird-cb-cbp-ai.mjs +475 -33
- package/fesm2022/sunbird-cb-cbp-ai.mjs.map +1 -1
- package/lib/ai-cbp-routing.module.d.ts.map +1 -1
- package/lib/ai-cbp.module.d.ts +37 -36
- package/lib/ai-cbp.module.d.ts.map +1 -1
- package/lib/components/designation-approval-request-form/designation-approval-request-form.component.d.ts +47 -0
- package/lib/components/designation-approval-request-form/designation-approval-request-form.component.d.ts.map +1 -0
- package/lib/components/review-request/review-request.component.d.ts +2 -0
- package/lib/components/review-request/review-request.component.d.ts.map +1 -1
- package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts.map +1 -1
- package/lib/components/role-mapping-list/role-mapping-list.component.d.ts +5 -2
- package/lib/components/role-mapping-list/role-mapping-list.component.d.ts.map +1 -1
- package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts +1 -0
- package/lib/components/view-final-cbp-plan/view-final-cbp-plan.component.d.ts.map +1 -1
- package/lib/modules/shared/services/init.service.d.ts +1 -1
- package/lib/modules/shared/services/init.service.d.ts.map +1 -1
- package/lib/modules/shared/services/shared.service.d.ts +1 -0
- package/lib/modules/shared/services/shared.service.d.ts.map +1 -1
- package/lib/modules/upload-document-page/upload-document-page.component.d.ts +1 -0
- package/lib/modules/upload-document-page/upload-document-page.component.d.ts.map +1 -1
- package/lib/resolver/init-resolver.sevice.d.ts +11 -0
- package/lib/resolver/init-resolver.sevice.d.ts.map +1 -0
- package/package.json +1 -1
- package/public-api.d.ts +18 -0
- package/public-api.d.ts.map +1 -1
- package/sunbird-cb-cbp-ai-0.1.4.tgz +0 -0
- package/sunbird-cb-cbp-ai-0.1.3.tgz +0 -0
|
@@ -256,10 +256,10 @@ export class DashboardComponent {
|
|
|
256
256
|
this.router.navigate(['/ai/initial']);
|
|
257
257
|
}
|
|
258
258
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DashboardComponent, deps: [{ token: i1.FormBuilder }, { token: i2.SharedService }, { token: i3.MatSnackBar }, { token: i4.Router }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
259
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DashboardComponent, selector: "app-dashboard", ngImport: i0, template: "<div class=\"dashboard-wrapper\">\n <div class=\"header\">\n <div class=\"sub-heading mt-10 mb-10 cursor-pointer\">\n <p (click)=\"routeToInitial()\"><mat-icon style=\"vertical-align: middle;\">arrow_back</mat-icon><span\n class=\"pl-10\">Back to Role Mapping Generation</span></p>\n </div>\n\n </div>\n <div class=\"dashboard-container\">\n\n <!-- FILTERS SECTION -->\n <form [formGroup]=\"filtersForm\" class=\"filters-form\">\n\n <mat-card class=\"filters-card\">\n <div class=\"filters-header\">\n <mat-icon>filter_list</mat-icon>\n <span>Filters</span>\n </div>\n\n <div class=\"filters-row\">\n <div>\n <label>Centre / State </label>\n <!-- Centre / State -->\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n\n <mat-select formControlName=\"centreState\" [disabled]=\"!isSuperAdmin\"\n (selectionChange)=\"onMinistryTypeChange($event)\">\n <mat-option value=\"\">Select Center/State</mat-option>\n <mat-option value=\"ministry\">Center</mat-option>\n <mat-option value=\"state\">State</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <label>Ministry </label>\n <!-- Centre / State -->\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n <mat-select panelClass=\"select-with-search\" [disabled]=\"!isSuperAdmin\" multiple\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministries\"\n style=\"border-radius: 25px; background: white; width:100%\"\n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\" *ngFor=\"let item of filteredList\"\n [selected]=\"selectedMinistryId === item?.identifier\">{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <label>Department</label>\n <!-- Centre / State -->\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;border: 1px solid #ccc;\">\n <mat-select panelClass=\"select-with-search\" placeholder=\"Select Department\"\n [disabled]=\"!isSuperAdmin\" multiple formControlName=\"departments\"\n style=\"border-radius: 25px; background: white;\" (selectionChange)=\"onDepartmentChange()\"\n (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterDepartmentData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredDepartmentList\">{{item?.orgName}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- Date Range -->\n <div>\n <label>Date Range </label>\n <mat-form-field appearance=\"outline\">\n\n <input matInput ngxDaterangepickerMd formControlName=\"dateRange\" style=\"margin:10px\"\n placeholder=\"Select date range\" [autoApply]=\"true\" [linkedCalendars]=\"true\"\n [locale]=\"{ format: 'DD MMM YYYY' }\" />\n </mat-form-field>\n </div>\n\n\n </div>\n </mat-card>\n </form>\n\n <!-- OVERVIEW METRICS -->\n <h2 class=\"section-title\">\n <mat-icon>dashboard</mat-icon>\n Overview Metrics\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">States/Ministries which generated Role Mapping</p>\n <h2>{{this.dashboardData?.ministry_count}}</h2>\n <p class=\"card-subtitle\">At least 1 designation/role mapping</p>\n </div>\n <mat-icon class=\"icon primary\">public</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Departments which generated Role Mapping</p>\n <h2>{{this.dashboardData?.department_count}}</h2>\n <p class=\"card-subtitle\">At least 1 designation/role mapping</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Capacity Building Plans Created</p>\n <h2>{{this.dashboardData?.total_cbp_plan_count}}</h2>\n </div>\n <mat-icon class=\"icon green\">description</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- COMPETENCIES -->\n <h2 class=\"section-title\">\n <mat-icon>psychology</mat-icon>\n Competencies Recommended\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Behavioral Competencies</p>\n <h2>{{this.dashboardData?.behavioral_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon purple\">psychology</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Functional Competencies</p>\n <h2>{{this.dashboardData?.functional_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon teal\">settings</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Domain Competencies</p>\n <h2>{{this.dashboardData?.domain_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon orange\">tune</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- DOCUMENTS -->\n <h2 class=\"section-title\">\n <mat-icon>menu_book</mat-icon>\n Documents & Course Recommendations\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Documents Uploaded</p>\n <h2>{{this.dashboardData?.total_documents}}</h2>\n <p class=\"card-subtitle\">Min 1, Max 10 per role mapping</p>\n </div>\n <mat-icon class=\"icon amber\">upload_file</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Role Mappings with Course Recommendations</p>\n <h2>{{this.dashboardData?.role_mappings_with_recommendations}}</h2>\n <p class=\"card-subtitle\">8500 of 50,000 role mappings</p>\n </div>\n <mat-icon class=\"icon green\">menu_book</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Course Recommendations Saved</p>\n <h2>{{this.dashboardData?.saved_recommended_courses_count}}</h2>\n <p class=\"card-subtitle\">{{this.dashboardData?.saved_recommended_courses_count}} of 8500\n recommendations</p>\n </div>\n <mat-icon class=\"icon teal\">save</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- GAP ANALYSIS -->\n <div class=\"gap-section\">\n <h2 class=\"section-title warning\">\n <mat-icon>warning</mat-icon>\n Gap Analysis\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card warning-bg\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Competencies Without Courses</p>\n <h2>{{this.dashboardData?.competencies_without_courses}}</h2>\n <p class=\"card-subtitle\">Unique competencies with no identified courses</p>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <!-- <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Manually Added Courses</p>\n <h2>-</h2>\n <p class=\"card-subtitle\">Competencies with user-added courses</p>\n </div>\n <mat-icon class=\"icon green\">add_circle</mat-icon>\n </div>\n </mat-card> -->\n\n </div>\n\n <div class=\"card-grid mt-2\">\n\n <mat-card class=\"metric-card warning-bg\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Behavioral Competencies Without Courses</p>\n <h2>{{this.dashboardData?.behavioral_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Functional Competencies Without Courses</p>\n <h2>{{this.dashboardData?.functional_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Domain Competencies Without Courses</p>\n <h2>{{this.dashboardData?.domain_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n </div>\n </div>\n\n <!-- OVERVIEW METRICS -->\n <h2 class=\"section-title\">\n <mat-icon>dashboard</mat-icon>\n Users and Role Mapping Metrics\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\" *ngIf=\"!isSuperAdmin\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Users (Credentials)</p>\n <h2>{{this.dashboardData?.total_users}}</h2>\n </div>\n <mat-icon class=\"icon primary\">public</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\" *ngIf=\"!isSuperAdmin\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Users with Role Mappings</p>\n <h2>{{this.dashboardData?.users_with_role_mappings}}</h2>\n <p class=\"card-subtitle\">Generated atleast 1 role mapping</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Designation/Role Mappings Generated</p>\n <h2>{{this.dashboardData?.total_role_mappings}}</h2>\n </div>\n <mat-icon class=\"icon green\">description</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Role Mappings</p>\n <h2>{{this.dashboardData?.unique_role_mappings}}</h2>\n <p class=\"card-subtitle\">10,000 unique of 50,000 total</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n </div>\n </div>\n</div>", styles: [".dashboard-wrapper{background:transparent;min-height:100vh;padding:24px 10px;margin:0 30px 0 60px}.dashboard-container{max-width:auto;margin:0 auto}.section-title{display:flex;align-items:center;gap:10px;font-size:18px;font-weight:600;color:#000;margin:20px 0}.card-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:32px}.metric-card{padding:24px;border-radius:12px;box-shadow:none;border:1px solid #e5e7eb}.card-content{display:flex;justify-content:space-between;align-items:center}.card-title{font-size:14px;color:#6b7280;margin-bottom:6px}.metric-card h2{font-size:28px;font-weight:700;color:#000;margin:0}.card-subtitle{font-size:12px;color:#9ca3af;margin-top:6px}.icon{font-size:28px;width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center}.primary{color:#2563eb}.teal{color:#059669}.green{color:#16a34a}.purple{color:#9333ea}.orange{color:#f97316}.amber{color:#f59e0b}.red,.section-title.warning{color:#dc2626}.warning-card{background:#fdeaea;border:1px solid #f5c2c7}.filters-card{padding:20px 24px;border-radius:12px;border:1px solid #e5e7eb;box-shadow:none}.filters-header{display:flex;align-items:center;gap:8px;font-weight:600;margin-bottom:16px}.filters-row{display:flex;gap:24px;flex-wrap:wrap}.filters-row mat-form-field{flex:1;min-width:220px}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:25px;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}.dashboard-container .mat-card{background-color:#fff}.gap-title{color:#b91c1c}.gap-section{background-color:#d926621a;padding:10px;border-radius:12px;border:1px solid #f5c2c7;margin:16px 0}.gap-card{background-color:#d926621a;border:1px solid #f8d7da}.gap-card h2{color:#dc2626}@media (max-width: 1200px){.card-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.card-grid{grid-template-columns:1fr}}.mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}.mat-select-panel mat-option{padding-top:10px}::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}::ng-deep .select-with-search.mat-select-panel{padding-top:0;overflow:auto}::ng-deep .select-with-search .search-wrapper{position:sticky;top:0;z-index:10;background:#fff;padding:8px;border-bottom:1px solid #e0e0e0}::ng-deep .select-with-search .search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}::ng-deep .select-with-search mat-option:first-of-type{margin-top:4px}::ng-deep .md-drppicker.ltr{min-width:500px!important}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.mb-10{margin-bottom:10px}.cursor-pointer{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i7.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i12.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }] }); }
|
|
259
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: DashboardComponent, selector: "app-dashboard", ngImport: i0, template: "<div class=\"dashboard-wrapper\">\n <div class=\"header\">\n <div class=\"sub-heading mt-10 mb-10 cursor-pointer\">\n <p (click)=\"routeToInitial()\"><mat-icon style=\"vertical-align: middle;\">arrow_back</mat-icon><span\n class=\"pl-10\">Back to Role Mapping Generation</span></p>\n </div>\n\n </div>\n <div class=\"dashboard-container\">\n\n <!-- FILTERS SECTION -->\n <form [formGroup]=\"filtersForm\" class=\"filters-form\">\n\n <mat-card class=\"filters-card\">\n <div class=\"filters-header\">\n <mat-icon>filter_list</mat-icon>\n <span>Filters</span>\n </div>\n\n <div class=\"filters-row\">\n <div>\n <label>Centre / State </label>\n <!-- Centre / State -->\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n\n <mat-select formControlName=\"centreState\" [disabled]=\"!isSuperAdmin\"\n (selectionChange)=\"onMinistryTypeChange($event)\">\n <mat-option value=\"\">Select Center/State</mat-option>\n <mat-option value=\"ministry\">Center</mat-option>\n <mat-option value=\"state\">State</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <label>Ministry </label>\n <!-- Centre / State -->\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n <mat-select panelClass=\"select-with-search\" [disabled]=\"!isSuperAdmin\" multiple\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministries\"\n style=\"border-radius: 25px; background: white; width:100%\"\n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <!-- [selected]=\"selectedMinistryId === item?.identifier\" -->\n <mat-option [value]=\"item?.identifier\" *ngFor=\"let item of filteredList\"\n >{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <label>Department</label>\n <!-- Centre / State -->\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;border: 1px solid #ccc;\">\n <mat-select panelClass=\"select-with-search\" placeholder=\"Select Department\"\n [disabled]=\"!isSuperAdmin\" multiple formControlName=\"departments\"\n style=\"border-radius: 25px; background: white;\" (selectionChange)=\"onDepartmentChange()\"\n (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterDepartmentData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredDepartmentList\">{{item?.orgName}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- Date Range -->\n <div>\n <label>Date Range </label>\n <mat-form-field appearance=\"outline\">\n\n <input matInput ngxDaterangepickerMd formControlName=\"dateRange\" style=\"margin:10px\"\n placeholder=\"Select date range\" [autoApply]=\"true\" [linkedCalendars]=\"true\"\n [locale]=\"{ format: 'DD MMM YYYY' }\" />\n </mat-form-field>\n </div>\n\n\n </div>\n </mat-card>\n </form>\n\n <!-- OVERVIEW METRICS -->\n <h2 class=\"section-title\">\n <mat-icon>dashboard</mat-icon>\n Overview Metrics\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">States/Ministries which generated Role Mapping</p>\n <h2>{{this.dashboardData?.ministry_count}}</h2>\n <p class=\"card-subtitle\">At least 1 designation/role mapping</p>\n </div>\n <mat-icon class=\"icon primary\">public</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Departments which generated Role Mapping</p>\n <h2>{{this.dashboardData?.department_count}}</h2>\n <p class=\"card-subtitle\">At least 1 designation/role mapping</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Capacity Building Plans Created</p>\n <h2>{{this.dashboardData?.total_cbp_plan_count}}</h2>\n </div>\n <mat-icon class=\"icon green\">description</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- COMPETENCIES -->\n <h2 class=\"section-title\">\n <mat-icon>psychology</mat-icon>\n Competencies Recommended\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Behavioral Competencies</p>\n <h2>{{this.dashboardData?.behavioral_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon purple\">psychology</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Functional Competencies</p>\n <h2>{{this.dashboardData?.functional_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon teal\">settings</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Domain Competencies</p>\n <h2>{{this.dashboardData?.domain_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon orange\">tune</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- DOCUMENTS -->\n <h2 class=\"section-title\">\n <mat-icon>menu_book</mat-icon>\n Documents & Course Recommendations\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Documents Uploaded</p>\n <h2>{{this.dashboardData?.total_documents}}</h2>\n <p class=\"card-subtitle\">Min 1, Max 10 per role mapping</p>\n </div>\n <mat-icon class=\"icon amber\">upload_file</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Role Mappings with Course Recommendations</p>\n <h2>{{this.dashboardData?.role_mappings_with_recommendations}}</h2>\n <p class=\"card-subtitle\">8500 of 50,000 role mappings</p>\n </div>\n <mat-icon class=\"icon green\">menu_book</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Course Recommendations Saved</p>\n <h2>{{this.dashboardData?.saved_recommended_courses_count}}</h2>\n <p class=\"card-subtitle\">{{this.dashboardData?.saved_recommended_courses_count}} of 8500\n recommendations</p>\n </div>\n <mat-icon class=\"icon teal\">save</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- GAP ANALYSIS -->\n <div class=\"gap-section\">\n <h2 class=\"section-title warning\">\n <mat-icon>warning</mat-icon>\n Gap Analysis\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card warning-bg\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Competencies Without Courses</p>\n <h2>{{this.dashboardData?.competencies_without_courses}}</h2>\n <p class=\"card-subtitle\">Unique competencies with no identified courses</p>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <!-- <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Manually Added Courses</p>\n <h2>-</h2>\n <p class=\"card-subtitle\">Competencies with user-added courses</p>\n </div>\n <mat-icon class=\"icon green\">add_circle</mat-icon>\n </div>\n </mat-card> -->\n\n </div>\n\n <div class=\"card-grid mt-2\">\n\n <mat-card class=\"metric-card warning-bg\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Behavioral Competencies Without Courses</p>\n <h2>{{this.dashboardData?.behavioral_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Functional Competencies Without Courses</p>\n <h2>{{this.dashboardData?.functional_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Domain Competencies Without Courses</p>\n <h2>{{this.dashboardData?.domain_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n </div>\n </div>\n\n <!-- OVERVIEW METRICS -->\n <h2 class=\"section-title\">\n <mat-icon>dashboard</mat-icon>\n Users and Role Mapping Metrics\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\" *ngIf=\"!isSuperAdmin\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Users (Credentials)</p>\n <h2>{{this.dashboardData?.total_users}}</h2>\n </div>\n <mat-icon class=\"icon primary\">public</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\" *ngIf=\"!isSuperAdmin\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Users with Role Mappings</p>\n <h2>{{this.dashboardData?.users_with_role_mappings}}</h2>\n <p class=\"card-subtitle\">Generated atleast 1 role mapping</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Designation/Role Mappings Generated</p>\n <h2>{{this.dashboardData?.total_role_mappings}}</h2>\n </div>\n <mat-icon class=\"icon green\">description</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Role Mappings</p>\n <h2>{{this.dashboardData?.unique_role_mappings}}</h2>\n <p class=\"card-subtitle\">10,000 unique of 50,000 total</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n </div>\n </div>\n</div>", styles: [".dashboard-wrapper{background:transparent;min-height:100vh;padding:24px 10px;margin:0 30px 0 60px}.dashboard-container{max-width:auto;margin:0 auto}.section-title{display:flex;align-items:center;gap:10px;font-size:18px;font-weight:600;color:#000;margin:20px 0}.card-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:32px}.metric-card{padding:24px;border-radius:12px;box-shadow:none;border:1px solid #e5e7eb}.card-content{display:flex;justify-content:space-between;align-items:center}.card-title{font-size:14px;color:#6b7280;margin-bottom:6px}.metric-card h2{font-size:28px;font-weight:700;color:#000;margin:0}.card-subtitle{font-size:12px;color:#9ca3af;margin-top:6px}.icon{font-size:28px;width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center}.primary{color:#2563eb}.teal{color:#059669}.green{color:#16a34a}.purple{color:#9333ea}.orange{color:#f97316}.amber{color:#f59e0b}.red,.section-title.warning{color:#dc2626}.warning-card{background:#fdeaea;border:1px solid #f5c2c7}.filters-card{padding:20px 24px;border-radius:12px;border:1px solid #e5e7eb;box-shadow:none}.filters-header{display:flex;align-items:center;gap:8px;font-weight:600;margin-bottom:16px}.filters-row{display:flex;gap:24px;flex-wrap:wrap}.filters-row mat-form-field{flex:1;min-width:220px}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:25px;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}.dashboard-container .mat-card{background-color:#fff}.gap-title{color:#b91c1c}.gap-section{background-color:#d926621a;padding:10px;border-radius:12px;border:1px solid #f5c2c7;margin:16px 0}.gap-card{background-color:#d926621a;border:1px solid #f8d7da}.gap-card h2{color:#dc2626}@media (max-width: 1200px){.card-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.card-grid{grid-template-columns:1fr}}.mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}.mat-select-panel mat-option{padding-top:10px}::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}::ng-deep .select-with-search.mat-select-panel{padding-top:0;overflow:auto}::ng-deep .select-with-search .search-wrapper{position:sticky;top:0;z-index:10;background:#fff;padding:8px;border-bottom:1px solid #e0e0e0}::ng-deep .select-with-search .search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}::ng-deep .select-with-search mat-option:first-of-type{margin-top:4px}::ng-deep .md-drppicker.ltr{min-width:500px!important}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.mb-10{margin-bottom:10px}.cursor-pointer{cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.MatLegacyCard, selector: "mat-card", exportAs: ["matCard"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i7.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLegacyInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", exportAs: ["matInput"] }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "component", type: i11.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i12.DaterangepickerDirective, selector: "input[ngxDaterangepickerMd]", inputs: ["minDate", "maxDate", "autoApply", "alwaysShowCalendars", "showCustomRangeLabel", "linkedCalendars", "dateLimit", "singleDatePicker", "showWeekNumbers", "showISOWeekNumbers", "showDropdowns", "isInvalidDate", "isCustomDate", "isTooltipDate", "showClearButton", "customRangeDirection", "ranges", "opens", "drops", "firstMonthDayClass", "lastMonthDayClass", "emptyWeekRowClass", "emptyWeekColumnClass", "firstDayOfNextMonthClass", "lastDayOfPreviousMonthClass", "keepCalendarOpeningWithRange", "showRangeLabelOnInput", "showCancel", "lockStartDate", "timePicker", "timePicker24Hour", "timePickerIncrement", "timePickerSeconds", "closeOnAutoApply", "endKeyHolder", "startKey", "locale", "endKey"], outputs: ["change", "rangeClicked", "datesUpdated", "startDateChanged", "endDateChanged", "clearClicked"] }] }); }
|
|
260
260
|
}
|
|
261
261
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: DashboardComponent, decorators: [{
|
|
262
262
|
type: Component,
|
|
263
|
-
args: [{ selector: 'app-dashboard', template: "<div class=\"dashboard-wrapper\">\n <div class=\"header\">\n <div class=\"sub-heading mt-10 mb-10 cursor-pointer\">\n <p (click)=\"routeToInitial()\"><mat-icon style=\"vertical-align: middle;\">arrow_back</mat-icon><span\n class=\"pl-10\">Back to Role Mapping Generation</span></p>\n </div>\n\n </div>\n <div class=\"dashboard-container\">\n\n <!-- FILTERS SECTION -->\n <form [formGroup]=\"filtersForm\" class=\"filters-form\">\n\n <mat-card class=\"filters-card\">\n <div class=\"filters-header\">\n <mat-icon>filter_list</mat-icon>\n <span>Filters</span>\n </div>\n\n <div class=\"filters-row\">\n <div>\n <label>Centre / State </label>\n <!-- Centre / State -->\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n\n <mat-select formControlName=\"centreState\" [disabled]=\"!isSuperAdmin\"\n (selectionChange)=\"onMinistryTypeChange($event)\">\n <mat-option value=\"\">Select Center/State</mat-option>\n <mat-option value=\"ministry\">Center</mat-option>\n <mat-option value=\"state\">State</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <label>Ministry </label>\n <!-- Centre / State -->\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n <mat-select panelClass=\"select-with-search\" [disabled]=\"!isSuperAdmin\" multiple\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministries\"\n style=\"border-radius: 25px; background: white; width:100%\"\n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\" *ngFor=\"let item of filteredList\"\n [selected]=\"selectedMinistryId === item?.identifier\">{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <label>Department</label>\n <!-- Centre / State -->\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;border: 1px solid #ccc;\">\n <mat-select panelClass=\"select-with-search\" placeholder=\"Select Department\"\n [disabled]=\"!isSuperAdmin\" multiple formControlName=\"departments\"\n style=\"border-radius: 25px; background: white;\" (selectionChange)=\"onDepartmentChange()\"\n (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterDepartmentData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredDepartmentList\">{{item?.orgName}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- Date Range -->\n <div>\n <label>Date Range </label>\n <mat-form-field appearance=\"outline\">\n\n <input matInput ngxDaterangepickerMd formControlName=\"dateRange\" style=\"margin:10px\"\n placeholder=\"Select date range\" [autoApply]=\"true\" [linkedCalendars]=\"true\"\n [locale]=\"{ format: 'DD MMM YYYY' }\" />\n </mat-form-field>\n </div>\n\n\n </div>\n </mat-card>\n </form>\n\n <!-- OVERVIEW METRICS -->\n <h2 class=\"section-title\">\n <mat-icon>dashboard</mat-icon>\n Overview Metrics\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">States/Ministries which generated Role Mapping</p>\n <h2>{{this.dashboardData?.ministry_count}}</h2>\n <p class=\"card-subtitle\">At least 1 designation/role mapping</p>\n </div>\n <mat-icon class=\"icon primary\">public</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Departments which generated Role Mapping</p>\n <h2>{{this.dashboardData?.department_count}}</h2>\n <p class=\"card-subtitle\">At least 1 designation/role mapping</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Capacity Building Plans Created</p>\n <h2>{{this.dashboardData?.total_cbp_plan_count}}</h2>\n </div>\n <mat-icon class=\"icon green\">description</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- COMPETENCIES -->\n <h2 class=\"section-title\">\n <mat-icon>psychology</mat-icon>\n Competencies Recommended\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Behavioral Competencies</p>\n <h2>{{this.dashboardData?.behavioral_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon purple\">psychology</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Functional Competencies</p>\n <h2>{{this.dashboardData?.functional_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon teal\">settings</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Domain Competencies</p>\n <h2>{{this.dashboardData?.domain_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon orange\">tune</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- DOCUMENTS -->\n <h2 class=\"section-title\">\n <mat-icon>menu_book</mat-icon>\n Documents & Course Recommendations\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Documents Uploaded</p>\n <h2>{{this.dashboardData?.total_documents}}</h2>\n <p class=\"card-subtitle\">Min 1, Max 10 per role mapping</p>\n </div>\n <mat-icon class=\"icon amber\">upload_file</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Role Mappings with Course Recommendations</p>\n <h2>{{this.dashboardData?.role_mappings_with_recommendations}}</h2>\n <p class=\"card-subtitle\">8500 of 50,000 role mappings</p>\n </div>\n <mat-icon class=\"icon green\">menu_book</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Course Recommendations Saved</p>\n <h2>{{this.dashboardData?.saved_recommended_courses_count}}</h2>\n <p class=\"card-subtitle\">{{this.dashboardData?.saved_recommended_courses_count}} of 8500\n recommendations</p>\n </div>\n <mat-icon class=\"icon teal\">save</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- GAP ANALYSIS -->\n <div class=\"gap-section\">\n <h2 class=\"section-title warning\">\n <mat-icon>warning</mat-icon>\n Gap Analysis\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card warning-bg\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Competencies Without Courses</p>\n <h2>{{this.dashboardData?.competencies_without_courses}}</h2>\n <p class=\"card-subtitle\">Unique competencies with no identified courses</p>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <!-- <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Manually Added Courses</p>\n <h2>-</h2>\n <p class=\"card-subtitle\">Competencies with user-added courses</p>\n </div>\n <mat-icon class=\"icon green\">add_circle</mat-icon>\n </div>\n </mat-card> -->\n\n </div>\n\n <div class=\"card-grid mt-2\">\n\n <mat-card class=\"metric-card warning-bg\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Behavioral Competencies Without Courses</p>\n <h2>{{this.dashboardData?.behavioral_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Functional Competencies Without Courses</p>\n <h2>{{this.dashboardData?.functional_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Domain Competencies Without Courses</p>\n <h2>{{this.dashboardData?.domain_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n </div>\n </div>\n\n <!-- OVERVIEW METRICS -->\n <h2 class=\"section-title\">\n <mat-icon>dashboard</mat-icon>\n Users and Role Mapping Metrics\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\" *ngIf=\"!isSuperAdmin\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Users (Credentials)</p>\n <h2>{{this.dashboardData?.total_users}}</h2>\n </div>\n <mat-icon class=\"icon primary\">public</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\" *ngIf=\"!isSuperAdmin\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Users with Role Mappings</p>\n <h2>{{this.dashboardData?.users_with_role_mappings}}</h2>\n <p class=\"card-subtitle\">Generated atleast 1 role mapping</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Designation/Role Mappings Generated</p>\n <h2>{{this.dashboardData?.total_role_mappings}}</h2>\n </div>\n <mat-icon class=\"icon green\">description</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Role Mappings</p>\n <h2>{{this.dashboardData?.unique_role_mappings}}</h2>\n <p class=\"card-subtitle\">10,000 unique of 50,000 total</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n </div>\n </div>\n</div>", styles: [".dashboard-wrapper{background:transparent;min-height:100vh;padding:24px 10px;margin:0 30px 0 60px}.dashboard-container{max-width:auto;margin:0 auto}.section-title{display:flex;align-items:center;gap:10px;font-size:18px;font-weight:600;color:#000;margin:20px 0}.card-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:32px}.metric-card{padding:24px;border-radius:12px;box-shadow:none;border:1px solid #e5e7eb}.card-content{display:flex;justify-content:space-between;align-items:center}.card-title{font-size:14px;color:#6b7280;margin-bottom:6px}.metric-card h2{font-size:28px;font-weight:700;color:#000;margin:0}.card-subtitle{font-size:12px;color:#9ca3af;margin-top:6px}.icon{font-size:28px;width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center}.primary{color:#2563eb}.teal{color:#059669}.green{color:#16a34a}.purple{color:#9333ea}.orange{color:#f97316}.amber{color:#f59e0b}.red,.section-title.warning{color:#dc2626}.warning-card{background:#fdeaea;border:1px solid #f5c2c7}.filters-card{padding:20px 24px;border-radius:12px;border:1px solid #e5e7eb;box-shadow:none}.filters-header{display:flex;align-items:center;gap:8px;font-weight:600;margin-bottom:16px}.filters-row{display:flex;gap:24px;flex-wrap:wrap}.filters-row mat-form-field{flex:1;min-width:220px}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:25px;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}.dashboard-container .mat-card{background-color:#fff}.gap-title{color:#b91c1c}.gap-section{background-color:#d926621a;padding:10px;border-radius:12px;border:1px solid #f5c2c7;margin:16px 0}.gap-card{background-color:#d926621a;border:1px solid #f8d7da}.gap-card h2{color:#dc2626}@media (max-width: 1200px){.card-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.card-grid{grid-template-columns:1fr}}.mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}.mat-select-panel mat-option{padding-top:10px}::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}::ng-deep .select-with-search.mat-select-panel{padding-top:0;overflow:auto}::ng-deep .select-with-search .search-wrapper{position:sticky;top:0;z-index:10;background:#fff;padding:8px;border-bottom:1px solid #e0e0e0}::ng-deep .select-with-search .search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}::ng-deep .select-with-search mat-option:first-of-type{margin-top:4px}::ng-deep .md-drppicker.ltr{min-width:500px!important}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.mb-10{margin-bottom:10px}.cursor-pointer{cursor:pointer}\n"] }]
|
|
263
|
+
args: [{ selector: 'app-dashboard', template: "<div class=\"dashboard-wrapper\">\n <div class=\"header\">\n <div class=\"sub-heading mt-10 mb-10 cursor-pointer\">\n <p (click)=\"routeToInitial()\"><mat-icon style=\"vertical-align: middle;\">arrow_back</mat-icon><span\n class=\"pl-10\">Back to Role Mapping Generation</span></p>\n </div>\n\n </div>\n <div class=\"dashboard-container\">\n\n <!-- FILTERS SECTION -->\n <form [formGroup]=\"filtersForm\" class=\"filters-form\">\n\n <mat-card class=\"filters-card\">\n <div class=\"filters-header\">\n <mat-icon>filter_list</mat-icon>\n <span>Filters</span>\n </div>\n\n <div class=\"filters-row\">\n <div>\n <label>Centre / State </label>\n <!-- Centre / State -->\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n\n <mat-select formControlName=\"centreState\" [disabled]=\"!isSuperAdmin\"\n (selectionChange)=\"onMinistryTypeChange($event)\">\n <mat-option value=\"\">Select Center/State</mat-option>\n <mat-option value=\"ministry\">Center</mat-option>\n <mat-option value=\"state\">State</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <label>Ministry </label>\n <!-- Centre / State -->\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px; border: 1px solid #ccc;width: 100%;\">\n <mat-select panelClass=\"select-with-search\" [disabled]=\"!isSuperAdmin\" multiple\n [placeholder]=\"selectedMinistryType === 'ministry' ? 'Select Ministry/ Department':'Select State'\"\n (selectionChange)=\"onMinistryChange($event)\" formControlName=\"ministries\"\n style=\"border-radius: 25px; background: white; width:100%\"\n (openedChange)=\"onOpened($event)\">\n <div class=\"search-wrapper\" *ngIf=\"panelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <!-- [selected]=\"selectedMinistryId === item?.identifier\" -->\n <mat-option [value]=\"item?.identifier\" *ngFor=\"let item of filteredList\"\n >{{item?.orgName}}</mat-option>\n </mat-select>\n </mat-form-field>\n </div>\n <div>\n <label>Department</label>\n <!-- Centre / State -->\n <mat-form-field appearance=\"fill\"\n style=\"background: white; border-radius: 25px; padding: 0 12px;border: 1px solid #ccc;\">\n <mat-select panelClass=\"select-with-search\" placeholder=\"Select Department\"\n [disabled]=\"!isSuperAdmin\" multiple formControlName=\"departments\"\n style=\"border-radius: 25px; background: white;\" (selectionChange)=\"onDepartmentChange()\"\n (openedChange)=\"onOpenedDepartment($event)\">\n <div class=\"search-wrapper\" *ngIf=\"departmentPanelOpen\">\n <input type=\"text\" placeholder=\"Search...\" (input)=\"filterDepartmentData($event)\"\n class=\"search-input\" (keydown.space)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\">\n </div>\n <mat-option [value]=\"item?.identifier\"\n *ngFor=\"let item of filteredDepartmentList\">{{item?.orgName}}</mat-option>\n\n </mat-select>\n </mat-form-field>\n </div>\n\n <!-- Date Range -->\n <div>\n <label>Date Range </label>\n <mat-form-field appearance=\"outline\">\n\n <input matInput ngxDaterangepickerMd formControlName=\"dateRange\" style=\"margin:10px\"\n placeholder=\"Select date range\" [autoApply]=\"true\" [linkedCalendars]=\"true\"\n [locale]=\"{ format: 'DD MMM YYYY' }\" />\n </mat-form-field>\n </div>\n\n\n </div>\n </mat-card>\n </form>\n\n <!-- OVERVIEW METRICS -->\n <h2 class=\"section-title\">\n <mat-icon>dashboard</mat-icon>\n Overview Metrics\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">States/Ministries which generated Role Mapping</p>\n <h2>{{this.dashboardData?.ministry_count}}</h2>\n <p class=\"card-subtitle\">At least 1 designation/role mapping</p>\n </div>\n <mat-icon class=\"icon primary\">public</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Departments which generated Role Mapping</p>\n <h2>{{this.dashboardData?.department_count}}</h2>\n <p class=\"card-subtitle\">At least 1 designation/role mapping</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Capacity Building Plans Created</p>\n <h2>{{this.dashboardData?.total_cbp_plan_count}}</h2>\n </div>\n <mat-icon class=\"icon green\">description</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- COMPETENCIES -->\n <h2 class=\"section-title\">\n <mat-icon>psychology</mat-icon>\n Competencies Recommended\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Behavioral Competencies</p>\n <h2>{{this.dashboardData?.behavioral_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon purple\">psychology</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Functional Competencies</p>\n <h2>{{this.dashboardData?.functional_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon teal\">settings</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Domain Competencies</p>\n <h2>{{this.dashboardData?.domain_competencies_count}}</h2>\n </div>\n <mat-icon class=\"icon orange\">tune</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- DOCUMENTS -->\n <h2 class=\"section-title\">\n <mat-icon>menu_book</mat-icon>\n Documents & Course Recommendations\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Documents Uploaded</p>\n <h2>{{this.dashboardData?.total_documents}}</h2>\n <p class=\"card-subtitle\">Min 1, Max 10 per role mapping</p>\n </div>\n <mat-icon class=\"icon amber\">upload_file</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Role Mappings with Course Recommendations</p>\n <h2>{{this.dashboardData?.role_mappings_with_recommendations}}</h2>\n <p class=\"card-subtitle\">8500 of 50,000 role mappings</p>\n </div>\n <mat-icon class=\"icon green\">menu_book</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Course Recommendations Saved</p>\n <h2>{{this.dashboardData?.saved_recommended_courses_count}}</h2>\n <p class=\"card-subtitle\">{{this.dashboardData?.saved_recommended_courses_count}} of 8500\n recommendations</p>\n </div>\n <mat-icon class=\"icon teal\">save</mat-icon>\n </div>\n </mat-card>\n\n </div>\n\n <!-- GAP ANALYSIS -->\n <div class=\"gap-section\">\n <h2 class=\"section-title warning\">\n <mat-icon>warning</mat-icon>\n Gap Analysis\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card warning-bg\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Competencies Without Courses</p>\n <h2>{{this.dashboardData?.competencies_without_courses}}</h2>\n <p class=\"card-subtitle\">Unique competencies with no identified courses</p>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <!-- <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Manually Added Courses</p>\n <h2>-</h2>\n <p class=\"card-subtitle\">Competencies with user-added courses</p>\n </div>\n <mat-icon class=\"icon green\">add_circle</mat-icon>\n </div>\n </mat-card> -->\n\n </div>\n\n <div class=\"card-grid mt-2\">\n\n <mat-card class=\"metric-card warning-bg\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Behavioral Competencies Without Courses</p>\n <h2>{{this.dashboardData?.behavioral_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Functional Competencies Without Courses</p>\n <h2>{{this.dashboardData?.functional_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Domain Competencies Without Courses</p>\n <h2>{{this.dashboardData?.domain_without_courses}}</h2>\n </div>\n <mat-icon class=\"icon red\">cancel</mat-icon>\n </div>\n </mat-card>\n\n </div>\n </div>\n\n <!-- OVERVIEW METRICS -->\n <h2 class=\"section-title\">\n <mat-icon>dashboard</mat-icon>\n Users and Role Mapping Metrics\n </h2>\n\n <div class=\"card-grid\">\n\n <mat-card class=\"metric-card\" *ngIf=\"!isSuperAdmin\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Users (Credentials)</p>\n <h2>{{this.dashboardData?.total_users}}</h2>\n </div>\n <mat-icon class=\"icon primary\">public</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\" *ngIf=\"!isSuperAdmin\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Users with Role Mappings</p>\n <h2>{{this.dashboardData?.users_with_role_mappings}}</h2>\n <p class=\"card-subtitle\">Generated atleast 1 role mapping</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Total Designation/Role Mappings Generated</p>\n <h2>{{this.dashboardData?.total_role_mappings}}</h2>\n </div>\n <mat-icon class=\"icon green\">description</mat-icon>\n </div>\n </mat-card>\n\n <mat-card class=\"metric-card\">\n <div class=\"card-content\">\n <div>\n <p class=\"card-title\">Unique Role Mappings</p>\n <h2>{{this.dashboardData?.unique_role_mappings}}</h2>\n <p class=\"card-subtitle\">10,000 unique of 50,000 total</p>\n </div>\n <mat-icon class=\"icon teal\">apartment</mat-icon>\n </div>\n </mat-card>\n\n </div>\n </div>\n</div>", styles: [".dashboard-wrapper{background:transparent;min-height:100vh;padding:24px 10px;margin:0 30px 0 60px}.dashboard-container{max-width:auto;margin:0 auto}.section-title{display:flex;align-items:center;gap:10px;font-size:18px;font-weight:600;color:#000;margin:20px 0}.card-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:32px}.metric-card{padding:24px;border-radius:12px;box-shadow:none;border:1px solid #e5e7eb}.card-content{display:flex;justify-content:space-between;align-items:center}.card-title{font-size:14px;color:#6b7280;margin-bottom:6px}.metric-card h2{font-size:28px;font-weight:700;color:#000;margin:0}.card-subtitle{font-size:12px;color:#9ca3af;margin-top:6px}.icon{font-size:28px;width:40px;height:40px;border-radius:8px;display:flex;align-items:center;justify-content:center}.primary{color:#2563eb}.teal{color:#059669}.green{color:#16a34a}.purple{color:#9333ea}.orange{color:#f97316}.amber{color:#f59e0b}.red,.section-title.warning{color:#dc2626}.warning-card{background:#fdeaea;border:1px solid #f5c2c7}.filters-card{padding:20px 24px;border-radius:12px;border:1px solid #e5e7eb;box-shadow:none}.filters-header{display:flex;align-items:center;gap:8px;font-weight:600;margin-bottom:16px}.filters-row{display:flex;gap:24px;flex-wrap:wrap}.filters-row mat-form-field{flex:1;min-width:220px}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline{color:#ccc}:host ::ng-deep .mat-form-field-appearance-outline.mat-focused .mat-form-field-outline-thick{color:#1b4ca1;border-color:#1b4ca1!important}::ng-deep .select-search-panel .mat-option.mat-selected:not(.mat-option-disabled){background-color:#1b4ca1!important;color:#fff!important}:host ::ng-deep .mat-form-field-appearance-outline{border-radius:25px;border:1px solid #ccc}:host ::ng-deep .mat-form-field-focused .mat-form-field-appearance-outline{border-color:#1b4ca1!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-start{border-radius:25px 0 0 25px;border:none!important}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-end{border-right:none!important;border:none!important;border-radius:0 25px 25px 0}:host ::ng-deep .mat-form-field-appearance-outline .mat-form-field-outline-gap{border:none!important;border-radius:25px}:host::ng-deep .mat-form-field-appearance-outline .mat-form-field-infix{background-color:transparent!important}.dashboard-container .mat-card{background-color:#fff}.gap-title{color:#b91c1c}.gap-section{background-color:#d926621a;padding:10px;border-radius:12px;border:1px solid #f5c2c7;margin:16px 0}.gap-card{background-color:#d926621a;border:1px solid #f8d7da}.gap-card h2{color:#dc2626}@media (max-width: 1200px){.card-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.card-grid{grid-template-columns:1fr}}.mat-select-panel .search-wrapper{width:100%!important;box-sizing:border-box;padding:8px;position:sticky;top:0;z-index:2;background:#fff}.search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}.mat-select-panel mat-option{padding-top:10px}::ng-deep .mat-select-panel-wrap{overflow:visible!important;padding:0;margin-top:42px}::ng-deep .mat-select-panel{border:1px solid #ccc!important;box-sizing:border-box;max-height:250px}::ng-deep .select-with-search.mat-select-panel{padding-top:0;overflow:auto}::ng-deep .select-with-search .search-wrapper{position:sticky;top:0;z-index:10;background:#fff;padding:8px;border-bottom:1px solid #e0e0e0}::ng-deep .select-with-search .search-input{width:100%;padding:6px 10px;border:1px solid #ccc;border-radius:6px;outline:none;box-sizing:border-box}::ng-deep .select-with-search mat-option:first-of-type{margin-top:4px}::ng-deep .md-drppicker.ltr{min-width:500px!important}.sub-heading p{color:#000;font-family:Montserrat;font-size:18px;font-style:normal;font-weight:600;line-height:normal}.mb-10{margin-bottom:10px}.cursor-pointer{cursor:pointer}\n"] }]
|
|
264
264
|
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.SharedService }, { type: i3.MatSnackBar }, { type: i4.Router }]; } });
|
|
265
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi9jYnAtYWkvc3JjL2xpYi9jb21wb25lbnRzL2Rhc2hib2FyZC9kYXNoYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvZGFzaGJvYXJkL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBTWxELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFNNUIsTUFBTSxPQUFPLGtCQUFrQjtJQW1DN0IsWUFBb0IsRUFBZSxFQUFVLGFBQTRCLEVBQVUsUUFBcUIsRUFBUyxNQUFjO1FBQTNHLE9BQUUsR0FBRixFQUFFLENBQWE7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQWE7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBakMvSCxpQkFBWSxHQUFHLEtBQUssQ0FBQTtRQUNwQixhQUFRLEdBQVE7WUFDZCxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUM7WUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRTtTQUNsQixDQUFDO1FBRUYsbUJBQWMsR0FBRztZQUNmLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQzdCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQzdCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO1NBQzlCLENBQUM7UUFFRixvQkFBZSxHQUFHO1lBQ2hC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QUNILENBQUMsQ0FBQyxDQUFBO2FBQ0g7aUJBQU0sSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssT0FBTyxFQUFFO2dCQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ3BCLElBQUksSUFBSSxFQUFFLFNBQVMsS0FBSyxPQUFPLEVBQUU7d0JBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO3FCQUM3QjtnQkFDSCxDQUFDLENBQUMsQ0FBQTthQUNIO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFHSixDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDOytHQS9RVSxrQkFBa0I7bUdBQWxCLGtCQUFrQixxRENaL0IscXhlQWlWTTs7NEZEclVPLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNoYXJlZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9tb2R1bGVzL3NoYXJlZC9zZXJ2aWNlcy9zaGFyZWQuc2VydmljZSc7XG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZGFzaGJvYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Rhc2hib2FyZC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERhc2hib2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHVzZXJQcm9maWxlOiBhbnlcbiAgaXNTdXBlckFkbWluID0gZmFsc2VcbiAgc2VsZWN0ZWQ6IGFueSA9IHtcbiAgICBzdGFydERhdGU6IG1vbWVudCgpLnN1YnRyYWN0KDMsICdtb250aCcpLFxuICAgIGVuZERhdGU6IG1vbWVudCgpXG4gIH07XG4gIGZpbHRlcnNGb3JtITogRm9ybUdyb3VwO1xuICBtaW5pc3RyaWVzTGlzdCA9IFtcbiAgICB7IGlkOiAxLCBuYW1lOiAnTWluaXN0cnkgQScgfSxcbiAgICB7IGlkOiAyLCBuYW1lOiAnTWluaXN0cnkgQicgfSxcbiAgICB7IGlkOiAzLCBuYW1lOiAnTWluaXN0cnkgQycgfVxuICBdO1xuXG4gIGRlcGFydG1lbnRzTGlzdCA9IFtcbiAgICB7IGlkOiAxLCBuYW1lOiAnRGVwdCBYJyB9LFxuICAgIHsgaWQ6IDIsIG5hbWU6ICdEZXB0IFknIH0sXG4gICAgeyBpZDogMywgbmFtZTogJ0RlcHQgWicgfVxuICBdO1xuICBzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9ICdtaW5pc3RyeSdcbiAgc2VsZWN0ZWRNaW5pc3RyeUlkID0gJydcbiAgcGFuZWxPcGVuID0gZmFsc2U7XG4gIGRlcGFydG1lbnRQYW5lbE9wZW4gPSBmYWxzZVxuICBmaWx0ZXJlZExpc3QgPSBbXTtcbiAgZmlsdGVyZWREZXBhcnRtZW50TGlzdCA9IFtdO1xuICBtaW5pc3RyeURhdGE6IGFueSA9IFtdXG4gIG1pbmlzdHJ5RnVsbERhdGE6IGFueSA9IFtdXG4gIGRlcGFydG1lbnREYXRhID0gW11cbiAgc2VsZWN0ZWRNaW5pc3RyeU9iaiA9IHt9XG4gIGFwaUxvYWRpbmcgPSBmYWxzZVxuICBsb2dpblVzZXJPcmdJZHMgPSBbXVxuICBkYXNoYm9hcmREYXRhOiBhbnlcbiAgZ2FwQW5hbHlzaXNEYXRhOiBhbnlcbiAgZGFzaGJvYXJkUmVzcG9uc2VPYmogPSB7fVxuICBjYnBGaW5hbE9iajogYW55ID0ge31cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSwgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsIHB1YmxpYyByb3V0ZXI6IFJvdXRlcikgeyB9XG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudXNlclByb2ZpbGUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyUHJvZmlsZScpIHx8ICd7fScpO1xuICAgIHRoaXMuaXNTdXBlckFkbWluID0gdGhpcy51c2VyUHJvZmlsZT8ucm9sZV9pbmZvPy5yb2xlX25hbWUgPT09ICdTdXBlciBBZG1pbidcbiAgICAgICYmIHRoaXMudXNlclByb2ZpbGU/LnJvbGVfaW5mbz8uaXNfYWN0aXZlO1xuICAgIHRoaXMubG9naW5Vc2VyT3JnSWRzID0gdGhpcy51c2VyUHJvZmlsZT8ub3JnYW5pemF0aW9uX2lkc1xuXG4gICAgdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKClcbiAgICBjb25zb2xlLmxvZygndGhpcy5jYnBGaW5hbE9iai0tJywgdGhpcy5jYnBGaW5hbE9iailcblxuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgZm9ybSB3aXRob3V0IGRpc2FibGluZyBhbnl0aGluZ1xuICAgIHRoaXMuZmlsdGVyc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNlbnRyZVN0YXRlOiBbJyddLFxuICAgICAgbWluaXN0cmllczogW1tdXSxcbiAgICAgIGRlcGFydG1lbnRzOiBbW11dLFxuICAgICAgZGF0ZVJhbmdlOiBbeyBzdGFydERhdGU6IG1vbWVudCgpLnN1YnRyYWN0KDMsICdtb250aCcpLCBlbmREYXRlOiBtb21lbnQoKSB9XVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY2JwRmluYWxPYmopIHtcbiAgICAgIGxldCBldmVudCA9IHt2YWx1ZTp0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlfVxuICAgICAgbGV0IG1pbmlzdHJ5RXZlbnQgPSB7dmFsdWU6IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyfVxuXG4gICAgICB0aGlzLm9uTWluaXN0cnlUeXBlQ2hhbmdlKGV2ZW50KVxuICAgICAgdGhpcy5vbk1pbmlzdHJ5Q2hhbmdlKG1pbmlzdHJ5RXZlbnQpXG4gICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgIHRoaXMuZmlsdGVyc0Zvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIGNlbnRyZVN0YXRlOiB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlLFxuICAgICAgICBtaW5pc3RyaWVzOiBbdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXJdLFxuICAgICAgICBkZXBhcnRtZW50czogW3RoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzXVxuICAgICAgfSk7XG4gICAgICB9LDEwMDApXG4gICAgICBcbiAgICAgIFxuICAgIH1cblxuICAgIC8vIER5bmFtaWNhbGx5IGVuYWJsZSBjb250cm9scyBpZiBzdXBlciBhZG1pblxuICAgIGlmICh0aGlzLmlzU3VwZXJBZG1pbikge1xuICAgICAgdGhpcy5maWx0ZXJzRm9ybS5nZXQoJ2NlbnRyZVN0YXRlJyk/LmVuYWJsZSgpO1xuICAgICAgdGhpcy5maWx0ZXJzRm9ybS5nZXQoJ21pbmlzdHJpZXMnKT8uZW5hYmxlKCk7XG4gICAgICB0aGlzLmZpbHRlcnNGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uZW5hYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG9wdGlvbmFsbHkgZGlzYWJsZSBmb3Igbm9uLXN1cGVyLWFkbWluXG4gICAgICB0aGlzLmZpbHRlcnNGb3JtLmdldCgnY2VudHJlU3RhdGUnKT8uZGlzYWJsZSgpO1xuICAgICAgdGhpcy5maWx0ZXJzRm9ybS5nZXQoJ21pbmlzdHJpZXMnKT8uZGlzYWJsZSgpO1xuICAgICAgdGhpcy5maWx0ZXJzRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIEFQSSBjYWxsIG9uIGZpbHRlciBjaGFuZ2VcbiAgICB0aGlzLmZpbHRlcnNGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgIHRoaXMuZ2V0RGFzaGJvYXJkRGF0YSh2YWwpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RGFzaGJvYXJkRGF0YSh2YWwpIHtcblxuICAgIGNvbnNvbGUubG9nKCd2YWwnLCB2YWwpXG4gICAgbGV0IGRhdGVSYW5nZVBheWxvYWQgPSBudWxsO1xuICAgIGlmICh2YWwuZGF0ZVJhbmdlICYmIHZhbC5kYXRlUmFuZ2Uuc3RhcnREYXRlICYmIHZhbC5kYXRlUmFuZ2UuZW5kRGF0ZSkge1xuICAgICAgZGF0ZVJhbmdlUGF5bG9hZCA9IHtcbiAgICAgICAgZnJvbTogbW9tZW50KHZhbC5kYXRlUmFuZ2Uuc3RhcnREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgdG86IG1vbWVudCh2YWwuZGF0ZVJhbmdlLmVuZERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICB9O1xuICAgIH1cbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgIG1pbmlzdHJpZXM6IHZhbD8ubWluaXN0cmllcyxcbiAgICAgIGRhdGVfcmFuZ2U6IGRhdGVSYW5nZVBheWxvYWRcblxuICAgIH1cbiAgICBpZiAodmFsPy5kZXBhcnRtZW50cz8ubGVuZ3RoKSB7XG4gICAgICBwYXlsb2FkWydkZXBhcnRtZW50cyddID0gdmFsPy5kZXBhcnRtZW50c1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1N1cGVyQWRtaW4pIHtcbiAgICAgIHRoaXMuZGFzaGJvYXJkRGF0YSA9IHt9O1xuXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0RGFzaGJvYXJkQWRtaW4ocGF5bG9hZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ3JlcyBmcm9tIGFkbWluJywgcmVzKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmRhc2hib2FyZERhdGEsIHJlcyk7IC8vIG1lcmdlIGRhdGFcbiAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZGFzaGJvYXJkRGF0YSBhZnRlciBhZG1pbicsIHRoaXMuZGFzaGJvYXJkRGF0YSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldERhc2hib2FyZEdhcEFuYWx5c2lzQWRtaW4ocGF5bG9hZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ3JlcyBmcm9tIGdhcCBhbmFseXNpcycsIHJlcyk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kYXNoYm9hcmREYXRhLCByZXMpOyAvLyBtZXJnZSBkYXRhXG4gICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRhc2hib2FyZERhdGEgYWZ0ZXIgZ2FwIGFuYWx5c2lzJywgdGhpcy5kYXNoYm9hcmREYXRhKTtcbiAgICAgIH0pO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGFzaGJvYXJkRGF0YSA9IHt9O1xuXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0RGFzaGJvYXJkUHVibGljKHBheWxvYWQpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kYXNoYm9hcmREYXRhLCByZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXREYXNoYm9hcmRHYXBBbmFseXNpc1B1YmxpYyhwYXlsb2FkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuZGFzaGJvYXJkRGF0YSwgcmVzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygndGhpcy5kYXNoYm9hcmREYXRhJywgdGhpcy5kYXNoYm9hcmREYXRhKVxuICB9XG4gIG9uT3BlbmVkKG9wZW5lZDogYm9vbGVhbikge1xuICAgIHRoaXMucGFuZWxPcGVuID0gb3BlbmVkO1xuICB9XG5cbiAgb25PcGVuZWREZXBhcnRtZW50KG9wZW5lZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGVwYXJ0bWVudFBhbmVsT3BlbiA9IG9wZW5lZFxuICB9XG5cbiAgZmlsdGVyRGF0YShldmVudCkge1xuICAgIGlmIChldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnZhbHVlKSB7XG4gICAgICBjb25zdCBzID0gZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5taW5pc3RyeURhdGEuZmlsdGVyKHggPT5cbiAgICAgICAgeC5vcmdOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocylcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5taW5pc3RyeURhdGFcbiAgICB9XG5cbiAgfVxuXG4gIGZpbHRlckRlcGFydG1lbnREYXRhKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQudmFsdWUpIHtcbiAgICAgIGNvbnN0IHMgPSBldmVudC50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgdGhpcy5maWx0ZXJlZERlcGFydG1lbnRMaXN0ID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maWx0ZXIoeCA9PlxuICAgICAgICB4Lm9yZ05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJlZERlcGFydG1lbnRMaXN0ID0gdGhpcy5kZXBhcnRtZW50RGF0YVxuICAgIH1cblxuICB9XG5cbiAgb25NaW5pc3RyeUNoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRNaW5pc3RyeUlkID0gZXZlbnQudmFsdWU7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIE1pbmlzdHJ5IElEOicsIHNlbGVjdGVkTWluaXN0cnlJZCk7XG4gICAgdGhpcy5kZXBhcnRtZW50RGF0YSA9IFtdXG4gICAgLy8gWW91IGNhbiBhY2Nlc3MgdGhlIHNlbGVjdGVkIG9iamVjdCBpZiBuZWVkZWRcbiAgICBjb25zdCBzZWxlY3RlZE1pbmlzdHJ5ID0gdGhpcy5taW5pc3RyeURhdGEuZmluZChpdGVtID0+IGl0ZW0uaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRNaW5pc3RyeUlkKTtcbiAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlPYmogPSBzZWxlY3RlZE1pbmlzdHJ5XG4gICAgaWYgKHNlbGVjdGVkTWluaXN0cnlJZCAmJiB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnc3RhdGUnKSB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0RGVwYXJ0bWVudExpc3Qoc2VsZWN0ZWRNaW5pc3RyeUlkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmRlcGFydG1lbnREYXRhID0gcmVzXG4gICAgICAgIHRoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdCA9IHJlc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKHNlbGVjdGVkTWluaXN0cnlJZCAmJiB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Q2VudGVyQmFzZWREZXBhcnRtZW50KHNlbGVjdGVkTWluaXN0cnlJZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5kZXBhcnRtZW50RGF0YSA9IHJlc1xuICAgICAgICAgIHRoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdCA9IHJlc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignTm8gRGVwYXJ0bWVudCBGb3VuZCBmb3IgU2VsZWN0ZWQgTWluaXN0cnknLCAnWCcsIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBvbkRlcGFydG1lbnRDaGFuZ2UoKSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmZpbHRlcnNGb3JtLnZhbHVlO1xuICAgIGNvbnN0IHNlbGVjdGVkTWluaXN0cnkgPSB0aGlzLm1pbmlzdHJ5RGF0YS5maW5kKGl0ZW0gPT4gaXRlbS5pZGVudGlmaWVyID09PSBmb3JtRGF0YS5taW5pc3RyeSk7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnknXSA9IHNlbGVjdGVkTWluaXN0cnlcbiAgICBjb25zdCBkZXBhcnRtZW50TmFtZSA9IHRoaXMuZGVwYXJ0bWVudERhdGEuZmluZCh1ID0+IHUuaWRlbnRpZmllciA9PT0gZm9ybURhdGEuZGVwYXJ0bWVudHMpO1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gZGVwYXJ0bWVudE5hbWU/Lm9yZ05hbWVcbiAgfVxuXG4gIGFzeW5jIG9uTWluaXN0cnlUeXBlQ2hhbmdlKGV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coJ2V2ZW50JywgZXZlbnQpXG4gICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9IGV2ZW50LnZhbHVlXG4gICAgYXdhaXQgdGhpcy5nZXRNaW5pc3RyeURhdGEoKVxuICAgIHRoaXMubWluaXN0cnlEYXRhID0gW11cbiAgICBpZiAoZXZlbnQ/LnZhbHVlID09PSAnc3RhdGUnKSB7XG4gICAgICB0aGlzLmZpbHRlcnNGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBjZW50cmVTdGF0ZTogdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSxcbiAgICAgICAgbWluaXN0cmllczogW10sXG4gICAgICAgIGRlcGFydG1lbnRzOiBbXVxuICAgICAgfSk7XG4gICAgICB0aGlzLm1pbmlzdHJ5RnVsbERhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbT8udHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgICAgIHRoaXMubWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKGV2ZW50Py52YWx1ZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgdGhpcy5taW5pc3RyeUZ1bGxEYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0/LnR5cGUgPT09ICdjZW50cmFsJykge1xuICAgICAgICAgIHRoaXMubWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIFxuICAgIH1cbiAgICB0aGlzLmZpbHRlcnNGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBjZW50cmVTdGF0ZTogdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSxcbiAgICAgICAgbWluaXN0cmllczogW10sXG4gICAgICAgIGRlcGFydG1lbnRzOiBbXVxuICAgICAgfSk7XG4gIH1cblxuICBnZXRNaW5pc3RyeURhdGEoKSB7XG4gICAgdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRNaW5pc3RyeURhdGEodGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdkYXRhLS0nLCBkYXRhKVxuICAgICAgdGhpcy5taW5pc3RyeUZ1bGxEYXRhID0gZGF0YVxuICAgICAgdGhpcy5hcGlMb2FkaW5nID0gZmFsc2VcbiAgICAgIHRoaXMubWluaXN0cnlEYXRhID0gW11cbiAgICAgIGxldCBmaWx0ZXJlZE1pbmlzdHJ5RGF0YSA9IFtdXG4gICAgICB0aGlzLm1pbmlzdHJ5RnVsbERhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmxvZ2luVXNlck9yZ0lkcy5pbmRleE9mKGl0ZW0/LmlkZW50aWZpZXIpID4gLTEpIHtcbiAgICAgICAgICBmaWx0ZXJlZE1pbmlzdHJ5RGF0YS5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSBmaWx0ZXJlZE1pbmlzdHJ5RGF0YTtcbiAgICAgIH0pXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbT8uc2JPcmdUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgICAgICB0aGlzLm1pbmlzdHJ5RGF0YS5wdXNoKGl0ZW0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnc3RhdGUnKSB7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtPy5zYk9yZ1R5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICAgIHRoaXMubWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuXG4gIH1cblxuICByb3V0ZVRvSW5pdGlhbCgpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9haS9pbml0aWFsJ10pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGFzaGJvYXJkLXdyYXBwZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZyBtdC0xMCBtYi0xMCBjdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgPHAgKGNsaWNrKT1cInJvdXRlVG9Jbml0aWFsKClcIj48bWF0LWljb24gc3R5bGU9XCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1wiPmFycm93X2JhY2s8L21hdC1pY29uPjxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGwtMTBcIj5CYWNrIHRvIFJvbGUgTWFwcGluZyBHZW5lcmF0aW9uPC9zcGFuPjwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGFzaGJvYXJkLWNvbnRhaW5lclwiPlxuXG4gICAgICAgIDwhLS0gRklMVEVSUyBTRUNUSU9OIC0tPlxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpbHRlcnNGb3JtXCIgY2xhc3M9XCJmaWx0ZXJzLWZvcm1cIj5cblxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwiZmlsdGVycy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlcnMtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5maWx0ZXJfbGlzdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkZpbHRlcnM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVycy1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5DZW50cmUgLyBTdGF0ZSA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDZW50cmUgLyBTdGF0ZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogMjVweDsgcGFkZGluZzogMCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCAjY2NjO3dpZHRoOiAxMDAlO1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY2VudHJlU3RhdGVcIiBbZGlzYWJsZWRdPVwiIWlzU3VwZXJBZG1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25NaW5pc3RyeVR5cGVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdCBDZW50ZXIvU3RhdGU8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibWluaXN0cnlcIj5DZW50ZXI8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwic3RhdGVcIj5TdGF0ZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5NaW5pc3RyeSA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDZW50cmUgLyBTdGF0ZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogMjVweDsgcGFkZGluZzogMCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCAjY2NjO3dpZHRoOiAxMDAlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBhbmVsQ2xhc3M9XCJzZWxlY3Qtd2l0aC1zZWFyY2hcIiBbZGlzYWJsZWRdPVwiIWlzU3VwZXJBZG1pblwiIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5JyA/ICdTZWxlY3QgTWluaXN0cnkvIERlcGFydG1lbnQnOidTZWxlY3QgU3RhdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1pbmlzdHJ5Q2hhbmdlKCRldmVudClcIiBmb3JtQ29udHJvbE5hbWU9XCJtaW5pc3RyaWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXItcmFkaXVzOiAyNXB4OyBiYWNrZ3JvdW5kOiB3aGl0ZTsgd2lkdGg6MTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuZWRDaGFuZ2UpPVwib25PcGVuZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLXdyYXBwZXJcIiAqbmdJZj1cInBhbmVsT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiAoaW5wdXQpPVwiZmlsdGVyRGF0YSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiaXRlbT8uaWRlbnRpZmllclwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkTGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0ZWRdPVwic2VsZWN0ZWRNaW5pc3RyeUlkID09PSBpdGVtPy5pZGVudGlmaWVyXCI+e3tpdGVtPy5vcmdOYW1lfX08L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWw+RGVwYXJ0bWVudDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENlbnRyZSAvIFN0YXRlIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJhY2tncm91bmQ6IHdoaXRlOyBib3JkZXItcmFkaXVzOiAyNXB4OyBwYWRkaW5nOiAwIDEycHg7Ym9yZGVyOiAxcHggc29saWQgI2NjYztcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNlbGVjdCBwYW5lbENsYXNzPVwic2VsZWN0LXdpdGgtc2VhcmNoXCIgcGxhY2Vob2xkZXI9XCJTZWxlY3QgRGVwYXJ0bWVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhaXNTdXBlckFkbWluXCIgbXVsdGlwbGUgZm9ybUNvbnRyb2xOYW1lPVwiZGVwYXJ0bWVudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImJvcmRlci1yYWRpdXM6IDI1cHg7IGJhY2tncm91bmQ6IHdoaXRlO1wiIChzZWxlY3Rpb25DaGFuZ2UpPVwib25EZXBhcnRtZW50Q2hhbmdlKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3BlbmVkQ2hhbmdlKT1cIm9uT3BlbmVkRGVwYXJ0bWVudCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtd3JhcHBlclwiICpuZ0lmPVwiZGVwYXJ0bWVudFBhbmVsT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiAoaW5wdXQpPVwiZmlsdGVyRGVwYXJ0bWVudERhdGEoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIiAoa2V5ZG93bi5zcGFjZSk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW0/LmlkZW50aWZpZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWREZXBhcnRtZW50TGlzdFwiPnt7aXRlbT8ub3JnTmFtZX19PC9tYXQtb3B0aW9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEYXRlIFJhbmdlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkRhdGUgUmFuZ2UgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IG5neERhdGVyYW5nZXBpY2tlck1kIGZvcm1Db250cm9sTmFtZT1cImRhdGVSYW5nZVwiIHN0eWxlPVwibWFyZ2luOjEwcHhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjdCBkYXRlIHJhbmdlXCIgW2F1dG9BcHBseV09XCJ0cnVlXCIgW2xpbmtlZENhbGVuZGFyc109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xvY2FsZV09XCJ7IGZvcm1hdDogJ0REIE1NTSBZWVlZJyB9XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG4gICAgICAgIDwvZm9ybT5cblxuICAgICAgICA8IS0tIE9WRVJWSUVXIE1FVFJJQ1MgLS0+XG4gICAgICAgIDxoMiBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5kYXNoYm9hcmQ8L21hdC1pY29uPlxuICAgICAgICAgICAgT3ZlcnZpZXcgTWV0cmljc1xuICAgICAgICA8L2gyPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWdyaWRcIj5cblxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5TdGF0ZXMvTWluaXN0cmllcyB3aGljaCBnZW5lcmF0ZWQgUm9sZSBNYXBwaW5nPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy5taW5pc3RyeV9jb3VudH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC1zdWJ0aXRsZVwiPkF0IGxlYXN0IDEgZGVzaWduYXRpb24vcm9sZSBtYXBwaW5nPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiBwcmltYXJ5XCI+cHVibGljPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+RGVwYXJ0bWVudHMgd2hpY2ggZ2VuZXJhdGVkIFJvbGUgTWFwcGluZzwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8uZGVwYXJ0bWVudF9jb3VudH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC1zdWJ0aXRsZVwiPkF0IGxlYXN0IDEgZGVzaWduYXRpb24vcm9sZSBtYXBwaW5nPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiB0ZWFsXCI+YXBhcnRtZW50PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+VG90YWwgQ2FwYWNpdHkgQnVpbGRpbmcgUGxhbnMgQ3JlYXRlZDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8udG90YWxfY2JwX3BsYW5fY291bnR9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIGdyZWVuXCI+ZGVzY3JpcHRpb248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIENPTVBFVEVOQ0lFUyAtLT5cbiAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPnBzeWNob2xvZ3k8L21hdC1pY29uPlxuICAgICAgICAgICAgQ29tcGV0ZW5jaWVzIFJlY29tbWVuZGVkXG4gICAgICAgIDwvaDI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZ3JpZFwiPlxuXG4gICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPkJlaGF2aW9yYWwgQ29tcGV0ZW5jaWVzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy5iZWhhdmlvcmFsX2NvbXBldGVuY2llc19jb3VudH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gcHVycGxlXCI+cHN5Y2hvbG9neTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPkZ1bmN0aW9uYWwgQ29tcGV0ZW5jaWVzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy5mdW5jdGlvbmFsX2NvbXBldGVuY2llc19jb3VudH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gdGVhbFwiPnNldHRpbmdzPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+RG9tYWluIENvbXBldGVuY2llczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8uZG9tYWluX2NvbXBldGVuY2llc19jb3VudH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gb3JhbmdlXCI+dHVuZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gRE9DVU1FTlRTIC0tPlxuICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+bWVudV9ib29rPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIERvY3VtZW50cyAmIENvdXJzZSBSZWNvbW1lbmRhdGlvbnNcbiAgICAgICAgPC9oMj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ncmlkXCI+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+VG90YWwgRG9jdW1lbnRzIFVwbG9hZGVkPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy50b3RhbF9kb2N1bWVudHN9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtc3VidGl0bGVcIj5NaW4gMSwgTWF4IDEwIHBlciByb2xlIG1hcHBpbmc8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIGFtYmVyXCI+dXBsb2FkX2ZpbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5Sb2xlIE1hcHBpbmdzIHdpdGggQ291cnNlIFJlY29tbWVuZGF0aW9uczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8ucm9sZV9tYXBwaW5nc193aXRoX3JlY29tbWVuZGF0aW9uc319PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC1zdWJ0aXRsZVwiPjg1MDAgb2YgNTAsMDAwIHJvbGUgbWFwcGluZ3M8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIGdyZWVuXCI+bWVudV9ib29rPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+Q291cnNlIFJlY29tbWVuZGF0aW9ucyBTYXZlZDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8uc2F2ZWRfcmVjb21tZW5kZWRfY291cnNlc19jb3VudH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC1zdWJ0aXRsZVwiPnt7dGhpcy5kYXNoYm9hcmREYXRhPy5zYXZlZF9yZWNvbW1lbmRlZF9jb3Vyc2VzX2NvdW50fX0gb2YgODUwMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGF0aW9uczwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gdGVhbFwiPnNhdmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIEdBUCBBTkFMWVNJUyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cImdhcC1zZWN0aW9uXCI+XG4gICAgICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLXRpdGxlIHdhcm5pbmdcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+d2FybmluZzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgR2FwIEFuYWx5c2lzXG4gICAgICAgICAgICA8L2gyPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ncmlkXCI+XG5cbiAgICAgICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZCB3YXJuaW5nLWJnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+Q29tcGV0ZW5jaWVzIFdpdGhvdXQgQ291cnNlczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LmNvbXBldGVuY2llc193aXRob3V0X2NvdXJzZXN9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXN1YnRpdGxlXCI+VW5pcXVlIGNvbXBldGVuY2llcyB3aXRoIG5vIGlkZW50aWZpZWQgY291cnNlczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiByZWRcIj5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICAgICAgPCEtLSA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPk1hbnVhbGx5IEFkZGVkIENvdXJzZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPi08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC1zdWJ0aXRsZVwiPkNvbXBldGVuY2llcyB3aXRoIHVzZXItYWRkZWQgY291cnNlczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiBncmVlblwiPmFkZF9jaXJjbGU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkPiAtLT5cblxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWdyaWQgbXQtMlwiPlxuXG4gICAgICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmQgd2FybmluZy1iZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPkJlaGF2aW9yYWwgQ29tcGV0ZW5jaWVzIFdpdGhvdXQgQ291cnNlczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LmJlaGF2aW9yYWxfd2l0aG91dF9jb3Vyc2VzfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIHJlZFwiPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPkZ1bmN0aW9uYWwgQ29tcGV0ZW5jaWVzIFdpdGhvdXQgQ291cnNlczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LmZ1bmN0aW9uYWxfd2l0aG91dF9jb3Vyc2VzfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIHJlZFwiPmNhbmNlbDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPkRvbWFpbiBDb21wZXRlbmNpZXMgV2l0aG91dCBDb3Vyc2VzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8uZG9tYWluX3dpdGhvdXRfY291cnNlc319PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiByZWRcIj5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBPVkVSVklFVyBNRVRSSUNTIC0tPlxuICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+ZGFzaGJvYXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIFVzZXJzIGFuZCBSb2xlIE1hcHBpbmcgTWV0cmljc1xuICAgICAgICA8L2gyPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWdyaWRcIj5cblxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmRcIiAqbmdJZj1cIiFpc1N1cGVyQWRtaW5cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5VbmlxdWUgVXNlcnMgKENyZWRlbnRpYWxzKTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8udG90YWxfdXNlcnN9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIHByaW1hcnlcIj5wdWJsaWM8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmRcIiAqbmdJZj1cIiFpc1N1cGVyQWRtaW5cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5VbmlxdWUgVXNlcnMgd2l0aCBSb2xlIE1hcHBpbmdzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy51c2Vyc193aXRoX3JvbGVfbWFwcGluZ3N9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtc3VidGl0bGVcIj5HZW5lcmF0ZWQgYXRsZWFzdCAxIHJvbGUgbWFwcGluZzwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gdGVhbFwiPmFwYXJ0bWVudDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPlRvdGFsIERlc2lnbmF0aW9uL1JvbGUgTWFwcGluZ3MgR2VuZXJhdGVkPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy50b3RhbF9yb2xlX21hcHBpbmdzfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiBncmVlblwiPmRlc2NyaXB0aW9uPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+VW5pcXVlIFJvbGUgTWFwcGluZ3M8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LnVuaXF1ZV9yb2xlX21hcHBpbmdzfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXN1YnRpdGxlXCI+MTAsMDAwIHVuaXF1ZSBvZiA1MCwwMDAgdG90YWw8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIHRlYWxcIj5hcGFydG1lbnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PiJdfQ==
|
|
265
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi9jYnAtYWkvc3JjL2xpYi9jb21wb25lbnRzL2Rhc2hib2FyZC9kYXNoYm9hcmQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvZGFzaGJvYXJkL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBTWxELE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7QUFNNUIsTUFBTSxPQUFPLGtCQUFrQjtJQW1DN0IsWUFBb0IsRUFBZSxFQUFVLGFBQTRCLEVBQVUsUUFBcUIsRUFBUyxNQUFjO1FBQTNHLE9BQUUsR0FBRixFQUFFLENBQWE7UUFBVSxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQWE7UUFBUyxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBakMvSCxpQkFBWSxHQUFHLEtBQUssQ0FBQTtRQUNwQixhQUFRLEdBQVE7WUFDZCxTQUFTLEVBQUUsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUM7WUFDeEMsT0FBTyxFQUFFLE1BQU0sRUFBRTtTQUNsQixDQUFDO1FBRUYsbUJBQWMsR0FBRztZQUNmLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQzdCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO1lBQzdCLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFO1NBQzlCLENBQUM7UUFFRixvQkFBZSxHQUFHO1lBQ2hC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QUNILENBQUMsQ0FBQyxDQUFBO2FBQ0g7aUJBQU0sSUFBSSxJQUFJLENBQUMsb0JBQW9CLEtBQUssT0FBTyxFQUFFO2dCQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ3BCLElBQUksSUFBSSxFQUFFLFNBQVMsS0FBSyxPQUFPLEVBQUU7d0JBQy9CLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO3FCQUM3QjtnQkFDSCxDQUFDLENBQUMsQ0FBQTthQUNIO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFHSixDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDOytHQS9RVSxrQkFBa0I7bUdBQWxCLGtCQUFrQixxRENaL0IsZzBlQWtWTTs7NEZEdFVPLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNoYXJlZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9tb2R1bGVzL3NoYXJlZC9zZXJ2aWNlcy9zaGFyZWQuc2VydmljZSc7XG5pbXBvcnQgZGF5anMgZnJvbSAnZGF5anMnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZGFzaGJvYXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Rhc2hib2FyZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2Rhc2hib2FyZC5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIERhc2hib2FyZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHVzZXJQcm9maWxlOiBhbnlcbiAgaXNTdXBlckFkbWluID0gZmFsc2VcbiAgc2VsZWN0ZWQ6IGFueSA9IHtcbiAgICBzdGFydERhdGU6IG1vbWVudCgpLnN1YnRyYWN0KDMsICdtb250aCcpLFxuICAgIGVuZERhdGU6IG1vbWVudCgpXG4gIH07XG4gIGZpbHRlcnNGb3JtITogRm9ybUdyb3VwO1xuICBtaW5pc3RyaWVzTGlzdCA9IFtcbiAgICB7IGlkOiAxLCBuYW1lOiAnTWluaXN0cnkgQScgfSxcbiAgICB7IGlkOiAyLCBuYW1lOiAnTWluaXN0cnkgQicgfSxcbiAgICB7IGlkOiAzLCBuYW1lOiAnTWluaXN0cnkgQycgfVxuICBdO1xuXG4gIGRlcGFydG1lbnRzTGlzdCA9IFtcbiAgICB7IGlkOiAxLCBuYW1lOiAnRGVwdCBYJyB9LFxuICAgIHsgaWQ6IDIsIG5hbWU6ICdEZXB0IFknIH0sXG4gICAgeyBpZDogMywgbmFtZTogJ0RlcHQgWicgfVxuICBdO1xuICBzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9ICdtaW5pc3RyeSdcbiAgc2VsZWN0ZWRNaW5pc3RyeUlkID0gJydcbiAgcGFuZWxPcGVuID0gZmFsc2U7XG4gIGRlcGFydG1lbnRQYW5lbE9wZW4gPSBmYWxzZVxuICBmaWx0ZXJlZExpc3QgPSBbXTtcbiAgZmlsdGVyZWREZXBhcnRtZW50TGlzdCA9IFtdO1xuICBtaW5pc3RyeURhdGE6IGFueSA9IFtdXG4gIG1pbmlzdHJ5RnVsbERhdGE6IGFueSA9IFtdXG4gIGRlcGFydG1lbnREYXRhID0gW11cbiAgc2VsZWN0ZWRNaW5pc3RyeU9iaiA9IHt9XG4gIGFwaUxvYWRpbmcgPSBmYWxzZVxuICBsb2dpblVzZXJPcmdJZHMgPSBbXVxuICBkYXNoYm9hcmREYXRhOiBhbnlcbiAgZ2FwQW5hbHlzaXNEYXRhOiBhbnlcbiAgZGFzaGJvYXJkUmVzcG9uc2VPYmogPSB7fVxuICBjYnBGaW5hbE9iajogYW55ID0ge31cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsIHByaXZhdGUgc2hhcmVkU2VydmljZTogU2hhcmVkU2VydmljZSwgcHJpdmF0ZSBzbmFja0JhcjogTWF0U25hY2tCYXIsIHB1YmxpYyByb3V0ZXI6IFJvdXRlcikgeyB9XG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMudXNlclByb2ZpbGUgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyUHJvZmlsZScpIHx8ICd7fScpO1xuICAgIHRoaXMuaXNTdXBlckFkbWluID0gdGhpcy51c2VyUHJvZmlsZT8ucm9sZV9pbmZvPy5yb2xlX25hbWUgPT09ICdTdXBlciBBZG1pbidcbiAgICAgICYmIHRoaXMudXNlclByb2ZpbGU/LnJvbGVfaW5mbz8uaXNfYWN0aXZlO1xuICAgIHRoaXMubG9naW5Vc2VyT3JnSWRzID0gdGhpcy51c2VyUHJvZmlsZT8ub3JnYW5pemF0aW9uX2lkc1xuXG4gICAgdGhpcy5jYnBGaW5hbE9iaiA9IHRoaXMuc2hhcmVkU2VydmljZS5nZXRDQlBQbGFuTG9jYWxTdG9yYWdlKClcbiAgICBjb25zb2xlLmxvZygndGhpcy5jYnBGaW5hbE9iai0tJywgdGhpcy5jYnBGaW5hbE9iailcblxuXG4gICAgLy8gSW5pdGlhbGl6ZSB0aGUgZm9ybSB3aXRob3V0IGRpc2FibGluZyBhbnl0aGluZ1xuICAgIHRoaXMuZmlsdGVyc0Zvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGNlbnRyZVN0YXRlOiBbJyddLFxuICAgICAgbWluaXN0cmllczogW1tdXSxcbiAgICAgIGRlcGFydG1lbnRzOiBbW11dLFxuICAgICAgZGF0ZVJhbmdlOiBbeyBzdGFydERhdGU6IG1vbWVudCgpLnN1YnRyYWN0KDMsICdtb250aCcpLCBlbmREYXRlOiBtb21lbnQoKSB9XVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY2JwRmluYWxPYmopIHtcbiAgICAgIGxldCBldmVudCA9IHt2YWx1ZTp0aGlzLmNicEZpbmFsT2JqPy5taW5pc3RyeT8uc2JPcmdUeXBlfVxuICAgICAgbGV0IG1pbmlzdHJ5RXZlbnQgPSB7dmFsdWU6IHRoaXMuY2JwRmluYWxPYmo/Lm1pbmlzdHJ5Py5pZGVudGlmaWVyfVxuXG4gICAgICB0aGlzLm9uTWluaXN0cnlUeXBlQ2hhbmdlKGV2ZW50KVxuICAgICAgdGhpcy5vbk1pbmlzdHJ5Q2hhbmdlKG1pbmlzdHJ5RXZlbnQpXG4gICAgICBzZXRUaW1lb3V0KCgpPT57XG4gICAgICAgIHRoaXMuZmlsdGVyc0Zvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIGNlbnRyZVN0YXRlOiB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlLFxuICAgICAgICBtaW5pc3RyaWVzOiBbdGhpcy5jYnBGaW5hbE9iaj8ubWluaXN0cnk/LmlkZW50aWZpZXJdLFxuICAgICAgICBkZXBhcnRtZW50czogW3RoaXMuY2JwRmluYWxPYmo/LmRlcGFydG1lbnRzXVxuICAgICAgfSk7XG4gICAgICB9LDEwMDApXG4gICAgICBcbiAgICAgIFxuICAgIH1cblxuICAgIC8vIER5bmFtaWNhbGx5IGVuYWJsZSBjb250cm9scyBpZiBzdXBlciBhZG1pblxuICAgIGlmICh0aGlzLmlzU3VwZXJBZG1pbikge1xuICAgICAgdGhpcy5maWx0ZXJzRm9ybS5nZXQoJ2NlbnRyZVN0YXRlJyk/LmVuYWJsZSgpO1xuICAgICAgdGhpcy5maWx0ZXJzRm9ybS5nZXQoJ21pbmlzdHJpZXMnKT8uZW5hYmxlKCk7XG4gICAgICB0aGlzLmZpbHRlcnNGb3JtLmdldCgnZGVwYXJ0bWVudHMnKT8uZW5hYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG9wdGlvbmFsbHkgZGlzYWJsZSBmb3Igbm9uLXN1cGVyLWFkbWluXG4gICAgICB0aGlzLmZpbHRlcnNGb3JtLmdldCgnY2VudHJlU3RhdGUnKT8uZGlzYWJsZSgpO1xuICAgICAgdGhpcy5maWx0ZXJzRm9ybS5nZXQoJ21pbmlzdHJpZXMnKT8uZGlzYWJsZSgpO1xuICAgICAgdGhpcy5maWx0ZXJzRm9ybS5nZXQoJ2RlcGFydG1lbnRzJyk/LmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIEFQSSBjYWxsIG9uIGZpbHRlciBjaGFuZ2VcbiAgICB0aGlzLmZpbHRlcnNGb3JtLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodmFsID0+IHtcbiAgICAgIHRoaXMuZ2V0RGFzaGJvYXJkRGF0YSh2YWwpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0RGFzaGJvYXJkRGF0YSh2YWwpIHtcblxuICAgIGNvbnNvbGUubG9nKCd2YWwnLCB2YWwpXG4gICAgbGV0IGRhdGVSYW5nZVBheWxvYWQgPSBudWxsO1xuICAgIGlmICh2YWwuZGF0ZVJhbmdlICYmIHZhbC5kYXRlUmFuZ2Uuc3RhcnREYXRlICYmIHZhbC5kYXRlUmFuZ2UuZW5kRGF0ZSkge1xuICAgICAgZGF0ZVJhbmdlUGF5bG9hZCA9IHtcbiAgICAgICAgZnJvbTogbW9tZW50KHZhbC5kYXRlUmFuZ2Uuc3RhcnREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSxcbiAgICAgICAgdG86IG1vbWVudCh2YWwuZGF0ZVJhbmdlLmVuZERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICB9O1xuICAgIH1cbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgIG1pbmlzdHJpZXM6IHZhbD8ubWluaXN0cmllcyxcbiAgICAgIGRhdGVfcmFuZ2U6IGRhdGVSYW5nZVBheWxvYWRcblxuICAgIH1cbiAgICBpZiAodmFsPy5kZXBhcnRtZW50cz8ubGVuZ3RoKSB7XG4gICAgICBwYXlsb2FkWydkZXBhcnRtZW50cyddID0gdmFsPy5kZXBhcnRtZW50c1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1N1cGVyQWRtaW4pIHtcbiAgICAgIHRoaXMuZGFzaGJvYXJkRGF0YSA9IHt9O1xuXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0RGFzaGJvYXJkQWRtaW4ocGF5bG9hZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ3JlcyBmcm9tIGFkbWluJywgcmVzKTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLmRhc2hib2FyZERhdGEsIHJlcyk7IC8vIG1lcmdlIGRhdGFcbiAgICAgICAgY29uc29sZS5sb2coJ3RoaXMuZGFzaGJvYXJkRGF0YSBhZnRlciBhZG1pbicsIHRoaXMuZGFzaGJvYXJkRGF0YSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldERhc2hib2FyZEdhcEFuYWx5c2lzQWRtaW4ocGF5bG9hZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ3JlcyBmcm9tIGdhcCBhbmFseXNpcycsIHJlcyk7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kYXNoYm9hcmREYXRhLCByZXMpOyAvLyBtZXJnZSBkYXRhXG4gICAgICAgIGNvbnNvbGUubG9nKCd0aGlzLmRhc2hib2FyZERhdGEgYWZ0ZXIgZ2FwIGFuYWx5c2lzJywgdGhpcy5kYXNoYm9hcmREYXRhKTtcbiAgICAgIH0pO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZGFzaGJvYXJkRGF0YSA9IHt9O1xuXG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0RGFzaGJvYXJkUHVibGljKHBheWxvYWQpLnN1YnNjcmliZSgocmVzKSA9PiB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5kYXNoYm9hcmREYXRhLCByZXMpO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXREYXNoYm9hcmRHYXBBbmFseXNpc1B1YmxpYyhwYXlsb2FkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuZGFzaGJvYXJkRGF0YSwgcmVzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZygndGhpcy5kYXNoYm9hcmREYXRhJywgdGhpcy5kYXNoYm9hcmREYXRhKVxuICB9XG4gIG9uT3BlbmVkKG9wZW5lZDogYm9vbGVhbikge1xuICAgIHRoaXMucGFuZWxPcGVuID0gb3BlbmVkO1xuICB9XG5cbiAgb25PcGVuZWREZXBhcnRtZW50KG9wZW5lZDogYm9vbGVhbikge1xuICAgIHRoaXMuZGVwYXJ0bWVudFBhbmVsT3BlbiA9IG9wZW5lZFxuICB9XG5cbiAgZmlsdGVyRGF0YShldmVudCkge1xuICAgIGlmIChldmVudCAmJiBldmVudC50YXJnZXQgJiYgZXZlbnQudGFyZ2V0LnZhbHVlKSB7XG4gICAgICBjb25zdCBzID0gZXZlbnQudGFyZ2V0LnZhbHVlLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5taW5pc3RyeURhdGEuZmlsdGVyKHggPT5cbiAgICAgICAgeC5vcmdOYW1lLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMocylcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRMaXN0ID0gdGhpcy5taW5pc3RyeURhdGFcbiAgICB9XG5cbiAgfVxuXG4gIGZpbHRlckRlcGFydG1lbnREYXRhKGV2ZW50KSB7XG4gICAgaWYgKGV2ZW50ICYmIGV2ZW50LnRhcmdldCAmJiBldmVudC50YXJnZXQudmFsdWUpIHtcbiAgICAgIGNvbnN0IHMgPSBldmVudC50YXJnZXQudmFsdWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgdGhpcy5maWx0ZXJlZERlcGFydG1lbnRMaXN0ID0gdGhpcy5kZXBhcnRtZW50RGF0YS5maWx0ZXIoeCA9PlxuICAgICAgICB4Lm9yZ05hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzKVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5maWx0ZXJlZERlcGFydG1lbnRMaXN0ID0gdGhpcy5kZXBhcnRtZW50RGF0YVxuICAgIH1cblxuICB9XG5cbiAgb25NaW5pc3RyeUNoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRNaW5pc3RyeUlkID0gZXZlbnQudmFsdWU7XG4gICAgY29uc29sZS5sb2coJ1NlbGVjdGVkIE1pbmlzdHJ5IElEOicsIHNlbGVjdGVkTWluaXN0cnlJZCk7XG4gICAgdGhpcy5kZXBhcnRtZW50RGF0YSA9IFtdXG4gICAgLy8gWW91IGNhbiBhY2Nlc3MgdGhlIHNlbGVjdGVkIG9iamVjdCBpZiBuZWVkZWRcbiAgICBjb25zdCBzZWxlY3RlZE1pbmlzdHJ5ID0gdGhpcy5taW5pc3RyeURhdGEuZmluZChpdGVtID0+IGl0ZW0uaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRNaW5pc3RyeUlkKTtcbiAgICB0aGlzLnNlbGVjdGVkTWluaXN0cnlPYmogPSBzZWxlY3RlZE1pbmlzdHJ5XG4gICAgaWYgKHNlbGVjdGVkTWluaXN0cnlJZCAmJiB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnc3RhdGUnKSB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0RGVwYXJ0bWVudExpc3Qoc2VsZWN0ZWRNaW5pc3RyeUlkKS5zdWJzY3JpYmUoKHJlcykgPT4ge1xuICAgICAgICB0aGlzLmRlcGFydG1lbnREYXRhID0gcmVzXG4gICAgICAgIHRoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdCA9IHJlc1xuICAgICAgfSlcbiAgICB9XG4gICAgaWYgKHNlbGVjdGVkTWluaXN0cnlJZCAmJiB0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Q2VudGVyQmFzZWREZXBhcnRtZW50KHNlbGVjdGVkTWluaXN0cnlJZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgaWYgKHJlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgdGhpcy5kZXBhcnRtZW50RGF0YSA9IHJlc1xuICAgICAgICAgIHRoaXMuZmlsdGVyZWREZXBhcnRtZW50TGlzdCA9IHJlc1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbignTm8gRGVwYXJ0bWVudCBGb3VuZCBmb3IgU2VsZWN0ZWQgTWluaXN0cnknLCAnWCcsIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgICAgcGFuZWxDbGFzczogWydzbmFja2Jhci1lcnJvciddXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBvbkRlcGFydG1lbnRDaGFuZ2UoKSB7XG4gICAgY29uc3QgZm9ybURhdGEgPSB0aGlzLmZpbHRlcnNGb3JtLnZhbHVlO1xuICAgIGNvbnN0IHNlbGVjdGVkTWluaXN0cnkgPSB0aGlzLm1pbmlzdHJ5RGF0YS5maW5kKGl0ZW0gPT4gaXRlbS5pZGVudGlmaWVyID09PSBmb3JtRGF0YS5taW5pc3RyeSk7XG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialsnbWluaXN0cnknXSA9IHNlbGVjdGVkTWluaXN0cnlcbiAgICBjb25zdCBkZXBhcnRtZW50TmFtZSA9IHRoaXMuZGVwYXJ0bWVudERhdGEuZmluZCh1ID0+IHUuaWRlbnRpZmllciA9PT0gZm9ybURhdGEuZGVwYXJ0bWVudHMpO1xuICAgIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmpbJ2RlcGFydG1lbnRfbmFtZSddID0gZGVwYXJ0bWVudE5hbWU/Lm9yZ05hbWVcbiAgfVxuXG4gIGFzeW5jIG9uTWluaXN0cnlUeXBlQ2hhbmdlKGV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coJ2V2ZW50JywgZXZlbnQpXG4gICAgdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9IGV2ZW50LnZhbHVlXG4gICAgYXdhaXQgdGhpcy5nZXRNaW5pc3RyeURhdGEoKVxuICAgIHRoaXMubWluaXN0cnlEYXRhID0gW11cbiAgICBpZiAoZXZlbnQ/LnZhbHVlID09PSAnc3RhdGUnKSB7XG4gICAgICB0aGlzLmZpbHRlcnNGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBjZW50cmVTdGF0ZTogdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSxcbiAgICAgICAgbWluaXN0cmllczogW10sXG4gICAgICAgIGRlcGFydG1lbnRzOiBbXVxuICAgICAgfSk7XG4gICAgICB0aGlzLm1pbmlzdHJ5RnVsbERhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAoaXRlbT8udHlwZSA9PT0gJ3N0YXRlJykge1xuICAgICAgICAgIHRoaXMubWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKGV2ZW50Py52YWx1ZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgdGhpcy5taW5pc3RyeUZ1bGxEYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKGl0ZW0/LnR5cGUgPT09ICdjZW50cmFsJykge1xuICAgICAgICAgIHRoaXMubWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIFxuICAgIH1cbiAgICB0aGlzLmZpbHRlcnNGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBjZW50cmVTdGF0ZTogdGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSxcbiAgICAgICAgbWluaXN0cmllczogW10sXG4gICAgICAgIGRlcGFydG1lbnRzOiBbXVxuICAgICAgfSk7XG4gIH1cblxuICBnZXRNaW5pc3RyeURhdGEoKSB7XG4gICAgdGhpcy5hcGlMb2FkaW5nID0gdHJ1ZVxuICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRNaW5pc3RyeURhdGEodGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSkuc3Vic2NyaWJlKChkYXRhOiBhbnkpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCdkYXRhLS0nLCBkYXRhKVxuICAgICAgdGhpcy5taW5pc3RyeUZ1bGxEYXRhID0gZGF0YVxuICAgICAgdGhpcy5hcGlMb2FkaW5nID0gZmFsc2VcbiAgICAgIHRoaXMubWluaXN0cnlEYXRhID0gW11cbiAgICAgIGxldCBmaWx0ZXJlZE1pbmlzdHJ5RGF0YSA9IFtdXG4gICAgICB0aGlzLm1pbmlzdHJ5RnVsbERhdGEubWFwKChpdGVtKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmxvZ2luVXNlck9yZ0lkcy5pbmRleE9mKGl0ZW0/LmlkZW50aWZpZXIpID4gLTEpIHtcbiAgICAgICAgICBmaWx0ZXJlZE1pbmlzdHJ5RGF0YS5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5maWx0ZXJlZExpc3QgPSBmaWx0ZXJlZE1pbmlzdHJ5RGF0YTtcbiAgICAgIH0pXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5Jykge1xuICAgICAgICBkYXRhLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbT8uc2JPcmdUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgICAgICB0aGlzLm1pbmlzdHJ5RGF0YS5wdXNoKGl0ZW0pXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkTWluaXN0cnlUeXBlID09PSAnc3RhdGUnKSB7XG4gICAgICAgIGRhdGEuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtPy5zYk9yZ1R5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgICAgIHRoaXMubWluaXN0cnlEYXRhLnB1c2goaXRlbSlcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuXG4gIH1cblxuICByb3V0ZVRvSW5pdGlhbCgpIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9haS9pbml0aWFsJ10pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZGFzaGJvYXJkLXdyYXBwZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWItaGVhZGluZyBtdC0xMCBtYi0xMCBjdXJzb3ItcG9pbnRlclwiPlxuICAgICAgICAgICAgPHAgKGNsaWNrKT1cInJvdXRlVG9Jbml0aWFsKClcIj48bWF0LWljb24gc3R5bGU9XCJ2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1wiPmFycm93X2JhY2s8L21hdC1pY29uPjxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGwtMTBcIj5CYWNrIHRvIFJvbGUgTWFwcGluZyBHZW5lcmF0aW9uPC9zcGFuPjwvcD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiZGFzaGJvYXJkLWNvbnRhaW5lclwiPlxuXG4gICAgICAgIDwhLS0gRklMVEVSUyBTRUNUSU9OIC0tPlxuICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImZpbHRlcnNGb3JtXCIgY2xhc3M9XCJmaWx0ZXJzLWZvcm1cIj5cblxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwiZmlsdGVycy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZpbHRlcnMtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5maWx0ZXJfbGlzdDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPkZpbHRlcnM8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVycy1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5DZW50cmUgLyBTdGF0ZSA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDZW50cmUgLyBTdGF0ZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogMjVweDsgcGFkZGluZzogMCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCAjY2NjO3dpZHRoOiAxMDAlO1wiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwiY2VudHJlU3RhdGVcIiBbZGlzYWJsZWRdPVwiIWlzU3VwZXJBZG1pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwib25NaW5pc3RyeVR5cGVDaGFuZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdCBDZW50ZXIvU3RhdGU8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwibWluaXN0cnlcIj5DZW50ZXI8L21hdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwic3RhdGVcIj5TdGF0ZTwvbWF0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5NaW5pc3RyeSA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDZW50cmUgLyBTdGF0ZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogMjVweDsgcGFkZGluZzogMCAxMnB4OyBib3JkZXI6IDFweCBzb2xpZCAjY2NjO3dpZHRoOiAxMDAlO1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc2VsZWN0IHBhbmVsQ2xhc3M9XCJzZWxlY3Qtd2l0aC1zZWFyY2hcIiBbZGlzYWJsZWRdPVwiIWlzU3VwZXJBZG1pblwiIG11bHRpcGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWxlY3RlZE1pbmlzdHJ5VHlwZSA9PT0gJ21pbmlzdHJ5JyA/ICdTZWxlY3QgTWluaXN0cnkvIERlcGFydG1lbnQnOidTZWxlY3QgU3RhdGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbk1pbmlzdHJ5Q2hhbmdlKCRldmVudClcIiBmb3JtQ29udHJvbE5hbWU9XCJtaW5pc3RyaWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXItcmFkaXVzOiAyNXB4OyBiYWNrZ3JvdW5kOiB3aGl0ZTsgd2lkdGg6MTAwJVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuZWRDaGFuZ2UpPVwib25PcGVuZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLXdyYXBwZXJcIiAqbmdJZj1cInBhbmVsT3BlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiAoaW5wdXQpPVwiZmlsdGVyRGF0YSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInNlYXJjaC1pbnB1dFwiIChrZXlkb3duLnNwYWNlKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24pPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFtzZWxlY3RlZF09XCJzZWxlY3RlZE1pbmlzdHJ5SWQgPT09IGl0ZW0/LmlkZW50aWZpZXJcIiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIml0ZW0/LmlkZW50aWZpZXJcIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWx0ZXJlZExpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPnt7aXRlbT8ub3JnTmFtZX19PC9tYXQtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsPkRlcGFydG1lbnQ8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDZW50cmUgLyBTdGF0ZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwiZmlsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kOiB3aGl0ZTsgYm9yZGVyLXJhZGl1czogMjVweDsgcGFkZGluZzogMCAxMnB4O2JvcmRlcjogMXB4IHNvbGlkICNjY2M7XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zZWxlY3QgcGFuZWxDbGFzcz1cInNlbGVjdC13aXRoLXNlYXJjaFwiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IERlcGFydG1lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIWlzU3VwZXJBZG1pblwiIG11bHRpcGxlIGZvcm1Db250cm9sTmFtZT1cImRlcGFydG1lbnRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJib3JkZXItcmFkaXVzOiAyNXB4OyBiYWNrZ3JvdW5kOiB3aGl0ZTtcIiAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uRGVwYXJ0bWVudENoYW5nZSgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9wZW5lZENoYW5nZSk9XCJvbk9wZW5lZERlcGFydG1lbnQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLXdyYXBwZXJcIiAqbmdJZj1cImRlcGFydG1lbnRQYW5lbE9wZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgKGlucHV0KT1cImZpbHRlckRlcGFydG1lbnREYXRhKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2VhcmNoLWlucHV0XCIgKGtleWRvd24uc3BhY2UpPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJpdGVtPy5pZGVudGlmaWVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpbHRlcmVkRGVwYXJ0bWVudExpc3RcIj57e2l0ZW0/Lm9yZ05hbWV9fTwvbWF0LW9wdGlvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSBSYW5nZSAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbD5EYXRlIFJhbmdlIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBuZ3hEYXRlcmFuZ2VwaWNrZXJNZCBmb3JtQ29udHJvbE5hbWU9XCJkYXRlUmFuZ2VcIiBzdHlsZT1cIm1hcmdpbjoxMHB4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZGF0ZSByYW5nZVwiIFthdXRvQXBwbHldPVwidHJ1ZVwiIFtsaW5rZWRDYWxlbmRhcnNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsb2NhbGVdPVwieyBmb3JtYXQ6ICdERCBNTU0gWVlZWScgfVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1jYXJkPlxuICAgICAgICA8L2Zvcm0+XG5cbiAgICAgICAgPCEtLSBPVkVSVklFVyBNRVRSSUNTIC0tPlxuICAgICAgICA8aDIgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+XG4gICAgICAgICAgICA8bWF0LWljb24+ZGFzaGJvYXJkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIE92ZXJ2aWV3IE1ldHJpY3NcbiAgICAgICAgPC9oMj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ncmlkXCI+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+U3RhdGVzL01pbmlzdHJpZXMgd2hpY2ggZ2VuZXJhdGVkIFJvbGUgTWFwcGluZzwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8ubWluaXN0cnlfY291bnR9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtc3VidGl0bGVcIj5BdCBsZWFzdCAxIGRlc2lnbmF0aW9uL3JvbGUgbWFwcGluZzwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gcHJpbWFyeVwiPnB1YmxpYzwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPkRlcGFydG1lbnRzIHdoaWNoIGdlbmVyYXRlZCBSb2xlIE1hcHBpbmc8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LmRlcGFydG1lbnRfY291bnR9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtc3VidGl0bGVcIj5BdCBsZWFzdCAxIGRlc2lnbmF0aW9uL3JvbGUgbWFwcGluZzwvcD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gdGVhbFwiPmFwYXJ0bWVudDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPlRvdGFsIENhcGFjaXR5IEJ1aWxkaW5nIFBsYW5zIENyZWF0ZWQ8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LnRvdGFsX2NicF9wbGFuX2NvdW50fX08L2gyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiBncmVlblwiPmRlc2NyaXB0aW9uPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBDT01QRVRFTkNJRVMgLS0+XG4gICAgICAgIDxoMiBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbj5wc3ljaG9sb2d5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIENvbXBldGVuY2llcyBSZWNvbW1lbmRlZFxuICAgICAgICA8L2gyPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWdyaWRcIj5cblxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5CZWhhdmlvcmFsIENvbXBldGVuY2llczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8uYmVoYXZpb3JhbF9jb21wZXRlbmNpZXNfY291bnR9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIHB1cnBsZVwiPnBzeWNob2xvZ3k8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5GdW5jdGlvbmFsIENvbXBldGVuY2llczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8uZnVuY3Rpb25hbF9jb21wZXRlbmNpZXNfY291bnR9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIHRlYWxcIj5zZXR0aW5nczwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPkRvbWFpbiBDb21wZXRlbmNpZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LmRvbWFpbl9jb21wZXRlbmNpZXNfY291bnR9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIG9yYW5nZVwiPnR1bmU8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIERPQ1VNRU5UUyAtLT5cbiAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPm1lbnVfYm9vazwvbWF0LWljb24+XG4gICAgICAgICAgICBEb2N1bWVudHMgJiBDb3Vyc2UgUmVjb21tZW5kYXRpb25zXG4gICAgICAgIDwvaDI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZ3JpZFwiPlxuXG4gICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPlRvdGFsIERvY3VtZW50cyBVcGxvYWRlZDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8udG90YWxfZG9jdW1lbnRzfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXN1YnRpdGxlXCI+TWluIDEsIE1heCAxMCBwZXIgcm9sZSBtYXBwaW5nPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiBhbWJlclwiPnVwbG9hZF9maWxlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+Um9sZSBNYXBwaW5ncyB3aXRoIENvdXJzZSBSZWNvbW1lbmRhdGlvbnM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LnJvbGVfbWFwcGluZ3Nfd2l0aF9yZWNvbW1lbmRhdGlvbnN9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtc3VidGl0bGVcIj44NTAwIG9mIDUwLDAwMCByb2xlIG1hcHBpbmdzPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiBncmVlblwiPm1lbnVfYm9vazwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPkNvdXJzZSBSZWNvbW1lbmRhdGlvbnMgU2F2ZWQ8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LnNhdmVkX3JlY29tbWVuZGVkX2NvdXJzZXNfY291bnR9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtc3VidGl0bGVcIj57e3RoaXMuZGFzaGJvYXJkRGF0YT8uc2F2ZWRfcmVjb21tZW5kZWRfY291cnNlc19jb3VudH19IG9mIDg1MDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbW1lbmRhdGlvbnM8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIHRlYWxcIj5zYXZlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPCEtLSBHQVAgQU5BTFlTSVMgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJnYXAtc2VjdGlvblwiPlxuICAgICAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi10aXRsZSB3YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPndhcm5pbmc8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIEdhcCBBbmFseXNpc1xuICAgICAgICAgICAgPC9oMj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtZ3JpZFwiPlxuXG4gICAgICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmQgd2FybmluZy1iZ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPkNvbXBldGVuY2llcyBXaXRob3V0IENvdXJzZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy5jb21wZXRlbmNpZXNfd2l0aG91dF9jb3Vyc2VzfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC1zdWJ0aXRsZVwiPlVuaXF1ZSBjb21wZXRlbmNpZXMgd2l0aCBubyBpZGVudGlmaWVkIGNvdXJzZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gcmVkXCI+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5NYW51YWxseSBBZGRlZCBDb3Vyc2VzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMj4tPC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtc3VidGl0bGVcIj5Db21wZXRlbmNpZXMgd2l0aCB1c2VyLWFkZGVkIGNvdXJzZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gZ3JlZW5cIj5hZGRfY2lyY2xlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtY2FyZD4gLS0+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ncmlkIG10LTJcIj5cblxuICAgICAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkIHdhcm5pbmctYmdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5CZWhhdmlvcmFsIENvbXBldGVuY2llcyBXaXRob3V0IENvdXJzZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy5iZWhhdmlvcmFsX3dpdGhvdXRfY291cnNlc319PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiByZWRcIj5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5GdW5jdGlvbmFsIENvbXBldGVuY2llcyBXaXRob3V0IENvdXJzZXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy5mdW5jdGlvbmFsX3dpdGhvdXRfY291cnNlc319PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiByZWRcIj5jYW5jZWw8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5Eb21haW4gQ29tcGV0ZW5jaWVzIFdpdGhvdXQgQ291cnNlczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LmRvbWFpbl93aXRob3V0X2NvdXJzZXN9fTwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gcmVkXCI+Y2FuY2VsPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gT1ZFUlZJRVcgTUVUUklDUyAtLT5cbiAgICAgICAgPGgyIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uPmRhc2hib2FyZDwvbWF0LWljb24+XG4gICAgICAgICAgICBVc2VycyBhbmQgUm9sZSBNYXBwaW5nIE1ldHJpY3NcbiAgICAgICAgPC9oMj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ncmlkXCI+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCIgKm5nSWY9XCIhaXNTdXBlckFkbWluXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+VW5pcXVlIFVzZXJzIChDcmVkZW50aWFscyk8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aDI+e3t0aGlzLmRhc2hib2FyZERhdGE/LnRvdGFsX3VzZXJzfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiBwcmltYXJ5XCI+cHVibGljPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgICAgIDxtYXQtY2FyZCBjbGFzcz1cIm1ldHJpYy1jYXJkXCIgKm5nSWY9XCIhaXNTdXBlckFkbWluXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXRpdGxlXCI+VW5pcXVlIFVzZXJzIHdpdGggUm9sZSBNYXBwaW5nczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8udXNlcnNfd2l0aF9yb2xlX21hcHBpbmdzfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJjYXJkLXN1YnRpdGxlXCI+R2VuZXJhdGVkIGF0bGVhc3QgMSByb2xlIG1hcHBpbmc8L3A+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uIHRlYWxcIj5hcGFydG1lbnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tYXQtY2FyZD5cblxuICAgICAgICAgICAgPG1hdC1jYXJkIGNsYXNzPVwibWV0cmljLWNhcmRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNhcmQtdGl0bGVcIj5Ub3RhbCBEZXNpZ25hdGlvbi9Sb2xlIE1hcHBpbmdzIEdlbmVyYXRlZDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMj57e3RoaXMuZGFzaGJvYXJkRGF0YT8udG90YWxfcm9sZV9tYXBwaW5nc319PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImljb24gZ3JlZW5cIj5kZXNjcmlwdGlvbjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21hdC1jYXJkPlxuXG4gICAgICAgICAgICA8bWF0LWNhcmQgY2xhc3M9XCJtZXRyaWMtY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC10aXRsZVwiPlVuaXF1ZSBSb2xlIE1hcHBpbmdzPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7dGhpcy5kYXNoYm9hcmREYXRhPy51bmlxdWVfcm9sZV9tYXBwaW5nc319PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FyZC1zdWJ0aXRsZVwiPjEwLDAwMCB1bmlxdWUgb2YgNTAsMDAwIHRvdGFsPC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaWNvbiB0ZWFsXCI+YXBhcnRtZW50PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbWF0LWNhcmQ+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj4iXX0=
|