@sunbird-cb/cbp-ai 0.1.95 → 0.1.97

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.
Files changed (19) hide show
  1. package/esm2022/lib/components/delete-role-mapping-popup/delete-role-mapping-popup.component.mjs +3 -3
  2. package/esm2022/lib/components/role-mapping-generation/role-mapping-generation.component.mjs +68 -142
  3. package/esm2022/lib/components/role-mapping-list/role-mapping-list.component.mjs +113 -82
  4. package/esm2022/lib/components/suggest-more-courses/suggest-more-courses.component.mjs +2 -4
  5. package/esm2022/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.mjs +21 -10
  6. package/esm2022/lib/modules/shared/services/shared.service.mjs +64 -2
  7. package/fesm2022/sunbird-cb-cbp-ai.mjs +265 -237
  8. package/fesm2022/sunbird-cb-cbp-ai.mjs.map +1 -1
  9. package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts +2 -2
  10. package/lib/components/role-mapping-generation/role-mapping-generation.component.d.ts.map +1 -1
  11. package/lib/components/role-mapping-list/role-mapping-list.component.d.ts +6 -0
  12. package/lib/components/role-mapping-list/role-mapping-list.component.d.ts.map +1 -1
  13. package/lib/components/suggest-more-courses/suggest-more-courses.component.d.ts.map +1 -1
  14. package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts +4 -2
  15. package/lib/components/update-designation-hierarchy/update-designation-hierarchy.component.d.ts.map +1 -1
  16. package/lib/modules/shared/services/shared.service.d.ts +4 -0
  17. package/lib/modules/shared/services/shared.service.d.ts.map +1 -1
  18. package/package.json +1 -1
  19. package/sunbird-cb-cbp-ai-0.1.97.tgz +0 -0
@@ -10,10 +10,11 @@ import * as i6 from "@angular/material/icon";
10
10
  import * as i7 from "@angular/material/progress-spinner";
11
11
  import * as i8 from "@angular/cdk/drag-drop";
12
12
  export class UpdateDesignationHierarchyComponent {
13
- constructor(http, sharedService, snackBar) {
13
+ constructor(http, sharedService, snackBar, cdr) {
14
14
  this.http = http;
15
15
  this.sharedService = sharedService;
16
16
  this.snackBar = snackBar;
17
+ this.cdr = cdr;
17
18
  this.openDropdownId = null;
18
19
  this.isOpen = true;
19
20
  this.designations = [];
@@ -109,10 +110,12 @@ export class UpdateDesignationHierarchyComponent {
109
110
  if (ministryType === 'ministry') {
110
111
  if (this.sharedService.cbpPlanFinalObj.departments) {
111
112
  const departmentId = this.sharedService.cbpPlanFinalObj.departments;
112
- this.sharedService.getRoleMappingByStateCenterAndDepartment(ministryId, departmentId).subscribe({
113
+ this.sharedService.getRoleMappingReOrderList(ministryId, departmentId).subscribe({
113
114
  next: (res) => {
115
+ this.role_mapping_generation = res || '[]';
114
116
  this.loading = false;
115
117
  console.log('State role mapping data refreshed:', res);
118
+ this.updateDesignationHierarchyResponse(); // Update designations after fetching new data
116
119
  },
117
120
  error: (error) => {
118
121
  this.loading = false;
@@ -121,10 +124,12 @@ export class UpdateDesignationHierarchyComponent {
121
124
  });
122
125
  }
123
126
  else {
124
- this.sharedService.getRoleMappingByStateCenter(ministryId).subscribe({
127
+ this.sharedService.getRoleMappingReOrderList(ministryId, null).subscribe({
125
128
  next: (res) => {
126
129
  this.loading = false;
130
+ this.role_mapping_generation = res || '[]';
127
131
  console.log('Center role mapping data refreshed:', res);
132
+ this.updateDesignationHierarchyResponse(); // Update designations after fetching new data
128
133
  },
129
134
  error: (error) => {
130
135
  this.loading = false;
@@ -135,10 +140,12 @@ export class UpdateDesignationHierarchyComponent {
135
140
  }
136
141
  else if (ministryType === 'state') {
137
142
  const departmentId = this.sharedService.cbpPlanFinalObj.departments;
138
- this.sharedService.getRoleMappingByStateCenterAndDepartment(ministryId, departmentId).subscribe({
143
+ this.sharedService.getRoleMappingReOrderList(ministryId, departmentId).subscribe({
139
144
  next: (res) => {
140
145
  this.loading = false;
146
+ this.role_mapping_generation = res || '[]';
141
147
  console.log('State role mapping data refreshed:', res);
148
+ this.updateDesignationHierarchyResponse(); // Update designations after fetching new data
142
149
  },
143
150
  error: (error) => {
144
151
  this.loading = false;
@@ -147,6 +154,8 @@ export class UpdateDesignationHierarchyComponent {
147
154
  });
148
155
  }
149
156
  }
157
+ }
158
+ updateDesignationHierarchyResponse() {
150
159
  let cbpPlanFinalObj = this.sharedService.cbpPlanFinalObj;
151
160
  console.log('cbpPlanFinalObj--', cbpPlanFinalObj);
152
161
  if (cbpPlanFinalObj?.departments) {
@@ -155,7 +164,7 @@ export class UpdateDesignationHierarchyComponent {
155
164
  if (cbpPlanFinalObj?.ministry && cbpPlanFinalObj?.ministry.identifier) {
156
165
  this.state_center_id = cbpPlanFinalObj?.ministry.identifier;
157
166
  }
158
- this.role_mapping_generation = cbpPlanFinalObj?.role_mapping_generation || '[]';
167
+ // this.role_mapping_generation = cbpPlanFinalObj?.role_mapping_generation || '[]';
159
168
  // Map role_mapping_generation to internal designations array
160
169
  this.numbers = Array.from({ length: this.role_mapping_generation.length }, (_, i) => i + 1);
161
170
  this.designations = this.role_mapping_generation.map((r, index) => ({
@@ -166,11 +175,13 @@ export class UpdateDesignationHierarchyComponent {
166
175
  filteredNumbers: [...this.numbers],
167
176
  wing_division_section: r.wing_division_section
168
177
  }));
178
+ console.log('this.designations--', this.designations);
169
179
  this.loading = false;
170
180
  this.numbers = Array.from({ length: this.designations.length }, (_, i) => i + 1);
171
181
  // Sort by sort_order
172
182
  this.designations.sort((a, b) => a.sort_order - b.sort_order);
173
183
  this.updateSortOrderByIndex();
184
+ this.cdr.detectChanges();
174
185
  }
175
186
  toggleDropdown(item, event) {
176
187
  event.stopPropagation();
@@ -222,15 +233,15 @@ export class UpdateDesignationHierarchyComponent {
222
233
  trackById(index, item) {
223
234
  return item.id;
224
235
  }
225
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UpdateDesignationHierarchyComponent, deps: [{ token: i1.HttpClient }, { token: i2.SharedService }, { token: i3.MatSnackBar }], target: i0.ɵɵFactoryTarget.Component }); }
226
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: UpdateDesignationHierarchyComponent, selector: "app-update-designation-hierarchy", outputs: { closeDrawer: "closeDrawer", submitted: "submitted" }, ngImport: i0, template: "<div class=\"overlay\" *ngIf=\"isOpen\" (click)=\"cancel()\"></div>\n\n<div class=\"drawer\" [class.open]=\"isOpen\">\n\n <!-- HEADER -->\n <div class=\"drawer-header\">\n <h4>Update Designation Hierarchy</h4>\n <button class=\"close-btn\" (click)=\"cancel()\">\u2715</button>\n </div>\n\n <!-- BODY -->\n <div class=\"drawer-body\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\n\n <div class=\"designation-item\" *ngFor=\"let item of designations; trackBy: trackById; let i = index\" cdkDrag>\n <div class=\"drag-handle\" cdkDragHandle>\n <mat-icon>drag_indicator</mat-icon>\n </div>\n\n <div class=\"designation-name\">\n <span style=\"color:#000\">{{ item.name }}</span><br/>\n <span class=\"wing-division-font\">Wing/Division - <span *ngIf=\"item.wing_division_section\">{{ item.wing_division_section }}</span>\n <span class=\"wing-division-font\" *ngIf=\"!item.wing_division_section\">N/A</span></span>\n </div>\n\n\n <!-- Custom Select -->\n <div class=\"custom-select\">\n <div class=\"selected-value\" (click)=\"toggleDropdown(item, $event)\">\n {{ item.sort_order }}\n <span class=\"chevron\" [class.open]=\"openDropdownId === item.id\"><mat-icon>arrow_drop_down</mat-icon></span>\n </div>\n\n <div class=\"dropdown\" [id]=\"'dropdown-' + item.id\" *ngIf=\"openDropdownId === item.id\"\n (click)=\"$event.stopPropagation()\">\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"item.searchFilter\"\n (ngModelChange)=\"filterNumbers(item)\" class=\"search-box\">\n\n <div class=\"option\" *ngFor=\"let num of item.filteredNumbers\"\n (click)=\"selectNumber(item, num, $event)\">\n {{ num }}\n </div>\n </div>\n\n </div>\n\n </div>\n\n\n\n\n\n </div>\n\n <!-- FOOTER -->\n <div class=\"drawer-footer\">\n <button class=\"btn cancel\" (click)=\"cancel()\">Cancel</button>\n <button class=\"btn submit\" (click)=\"submit()\">Submit</button>\n </div>\n\n</div>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".overlay{position:fixed;inset:0;background:#0006;z-index:999}.drawer{position:fixed;top:0;right:-420px;width:600px;height:100vh;background:#fff;box-shadow:-2px 0 12px #00000026;transition:right .3s ease;z-index:1000;display:flex;flex-direction:column}.drawer.open{right:0}.drawer-header{position:sticky;top:0;padding:16px;background:#fff;border-bottom:1px solid #eee;display:flex;justify-content:space-between;align-items:center;z-index:10}.close-btn{border:none;background:transparent;font-size:18px;cursor:pointer}.drawer-body{flex:1;overflow-y:auto;padding:16px}.designation-item{display:flex;align-items:center;gap:12px;padding:12px;margin-bottom:10px;border:1px solid #eee;border-radius:8px;background:#fafafa}.drag-handle{cursor:move}.designation-name{flex:1}.drawer-footer{position:sticky;bottom:0;background:#fff;padding:16px;border-top:1px solid #eee;display:flex;justify-content:space-between}.btn{padding:8px 18px;border-radius:6px;border:none;cursor:pointer}.cancel{background:#f1f1f1}.submit{background:#1b4ca1;color:#fff}.designation-item select{padding:6px 10px;border:1px solid #ccc;border-radius:8px;background-color:#fff;font-size:14px;outline:none;cursor:pointer;transition:border-color .2s,box-shadow .2s}.designation-item select:focus{border-color:#1b4ca1;box-shadow:0 0 3px #007bff80}.custom-select{position:relative;width:120px;border:1px solid #ccc;border-radius:4px;cursor:pointer;-webkit-user-select:none;user-select:none}.selected-value{padding:6px 10px;display:flex;justify-content:space-between;align-items:center}.chevron{transition:transform .2s ease}.chevron.open{transform:rotate(180deg)}.dropdown{position:absolute;top:100%;left:0;width:100%;max-height:180px;overflow-y:auto;border:1px solid #ccc;background:#fff;z-index:1000;box-shadow:0 2px 6px #0003}.dropdown .search-box{width:90%;margin:6px auto;padding:4px 6px;display:block;border:1px solid #aaa;border-radius:4px}.option{padding:6px 10px;cursor:pointer}.option:hover{background:#f1f1f1}.wing-division-font{font-size:14px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i8.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i8.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
236
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UpdateDesignationHierarchyComponent, deps: [{ token: i1.HttpClient }, { token: i2.SharedService }, { token: i3.MatSnackBar }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
237
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: UpdateDesignationHierarchyComponent, selector: "app-update-designation-hierarchy", outputs: { closeDrawer: "closeDrawer", submitted: "submitted" }, ngImport: i0, template: "<div class=\"overlay\" *ngIf=\"isOpen\" (click)=\"cancel()\"></div>\n\n<div class=\"drawer\" [class.open]=\"isOpen\">\n\n <!-- HEADER -->\n <div class=\"drawer-header\">\n <h4>Update Designation Hierarchy</h4>\n <button class=\"close-btn\" (click)=\"cancel()\">\u2715</button>\n </div>\n\n <!-- BODY -->\n <div class=\"drawer-body\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <div class=\"designation-item\" *ngFor=\"let item of designations; trackBy: trackById; let i = index\" cdkDrag>\n <div class=\"drag-handle\" cdkDragHandle>\n <mat-icon>drag_indicator</mat-icon>\n </div>\n\n <div class=\"designation-name\">\n <span style=\"color:#000\">{{ item.name }}</span><br/>\n <span class=\"wing-division-font\">Wing/Division - <span *ngIf=\"item.wing_division_section\">{{ item.wing_division_section }}</span>\n <span class=\"wing-division-font\" *ngIf=\"!item.wing_division_section\">N/A</span></span>\n </div>\n\n\n <!-- Custom Select -->\n <div class=\"custom-select\">\n <div class=\"selected-value\" (click)=\"toggleDropdown(item, $event)\">\n {{ item.sort_order }}\n <span class=\"chevron\" [class.open]=\"openDropdownId === item.id\"><mat-icon>arrow_drop_down</mat-icon></span>\n </div>\n\n <div class=\"dropdown\" [id]=\"'dropdown-' + item.id\" *ngIf=\"openDropdownId === item.id\"\n (click)=\"$event.stopPropagation()\">\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"item.searchFilter\"\n (ngModelChange)=\"filterNumbers(item)\" class=\"search-box\">\n\n <div class=\"option\" *ngFor=\"let num of item.filteredNumbers\"\n (click)=\"selectNumber(item, num, $event)\">\n {{ num }}\n </div>\n </div>\n\n </div>\n\n </div>\n\n\n\n\n\n </div>\n\n <!-- FOOTER -->\n <div class=\"drawer-footer\">\n <button class=\"btn cancel\" (click)=\"cancel()\">Cancel</button>\n <button class=\"btn submit\" (click)=\"submit()\">Submit</button>\n </div>\n\n</div>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".overlay{position:fixed;inset:0;background:#0006;z-index:999}.drawer{position:fixed;top:0;right:-420px;width:600px;height:100vh;background:#fff;box-shadow:-2px 0 12px #00000026;transition:right .3s ease;z-index:1000;display:flex;flex-direction:column}.drawer.open{right:0}.drawer-header{position:sticky;top:0;padding:16px;background:#fff;border-bottom:1px solid #eee;display:flex;justify-content:space-between;align-items:center;z-index:10}.close-btn{border:none;background:transparent;font-size:18px;cursor:pointer}.drawer-body{flex:1;overflow-y:auto;padding:16px}.designation-item{display:flex;align-items:center;gap:12px;padding:12px;margin-bottom:10px;border:1px solid #eee;border-radius:8px;background:#fafafa}.drag-handle{cursor:move}.designation-name{flex:1}.drawer-footer{position:sticky;bottom:0;background:#fff;padding:16px;border-top:1px solid #eee;display:flex;justify-content:space-between}.btn{padding:8px 18px;border-radius:6px;border:none;cursor:pointer}.cancel{background:#f1f1f1}.submit{background:#1b4ca1;color:#fff}.designation-item select{padding:6px 10px;border:1px solid #ccc;border-radius:8px;background-color:#fff;font-size:14px;outline:none;cursor:pointer;transition:border-color .2s,box-shadow .2s}.designation-item select:focus{border-color:#1b4ca1;box-shadow:0 0 3px #007bff80}.custom-select{position:relative;width:120px;border:1px solid #ccc;border-radius:4px;cursor:pointer;-webkit-user-select:none;user-select:none}.selected-value{padding:6px 10px;display:flex;justify-content:space-between;align-items:center}.chevron{transition:transform .2s ease}.chevron.open{transform:rotate(180deg)}.dropdown{position:absolute;top:100%;left:0;width:100%;max-height:180px;overflow-y:auto;border:1px solid #ccc;background:#fff;z-index:1000;box-shadow:0 2px 6px #0003}.dropdown .search-box{width:90%;margin:6px auto;padding:4px 6px;display:block;border:1px solid #aaa;border-radius:4px}.option{padding:6px 10px;cursor:pointer}.option:hover{background:#f1f1f1}.wing-division-font{font-size:14px}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.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: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i8.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i8.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
227
238
  }
228
239
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: UpdateDesignationHierarchyComponent, decorators: [{
229
240
  type: Component,
230
- args: [{ selector: 'app-update-designation-hierarchy', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"overlay\" *ngIf=\"isOpen\" (click)=\"cancel()\"></div>\n\n<div class=\"drawer\" [class.open]=\"isOpen\">\n\n <!-- HEADER -->\n <div class=\"drawer-header\">\n <h4>Update Designation Hierarchy</h4>\n <button class=\"close-btn\" (click)=\"cancel()\">\u2715</button>\n </div>\n\n <!-- BODY -->\n <div class=\"drawer-body\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\n\n <div class=\"designation-item\" *ngFor=\"let item of designations; trackBy: trackById; let i = index\" cdkDrag>\n <div class=\"drag-handle\" cdkDragHandle>\n <mat-icon>drag_indicator</mat-icon>\n </div>\n\n <div class=\"designation-name\">\n <span style=\"color:#000\">{{ item.name }}</span><br/>\n <span class=\"wing-division-font\">Wing/Division - <span *ngIf=\"item.wing_division_section\">{{ item.wing_division_section }}</span>\n <span class=\"wing-division-font\" *ngIf=\"!item.wing_division_section\">N/A</span></span>\n </div>\n\n\n <!-- Custom Select -->\n <div class=\"custom-select\">\n <div class=\"selected-value\" (click)=\"toggleDropdown(item, $event)\">\n {{ item.sort_order }}\n <span class=\"chevron\" [class.open]=\"openDropdownId === item.id\"><mat-icon>arrow_drop_down</mat-icon></span>\n </div>\n\n <div class=\"dropdown\" [id]=\"'dropdown-' + item.id\" *ngIf=\"openDropdownId === item.id\"\n (click)=\"$event.stopPropagation()\">\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"item.searchFilter\"\n (ngModelChange)=\"filterNumbers(item)\" class=\"search-box\">\n\n <div class=\"option\" *ngFor=\"let num of item.filteredNumbers\"\n (click)=\"selectNumber(item, num, $event)\">\n {{ num }}\n </div>\n </div>\n\n </div>\n\n </div>\n\n\n\n\n\n </div>\n\n <!-- FOOTER -->\n <div class=\"drawer-footer\">\n <button class=\"btn cancel\" (click)=\"cancel()\">Cancel</button>\n <button class=\"btn submit\" (click)=\"submit()\">Submit</button>\n </div>\n\n</div>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".overlay{position:fixed;inset:0;background:#0006;z-index:999}.drawer{position:fixed;top:0;right:-420px;width:600px;height:100vh;background:#fff;box-shadow:-2px 0 12px #00000026;transition:right .3s ease;z-index:1000;display:flex;flex-direction:column}.drawer.open{right:0}.drawer-header{position:sticky;top:0;padding:16px;background:#fff;border-bottom:1px solid #eee;display:flex;justify-content:space-between;align-items:center;z-index:10}.close-btn{border:none;background:transparent;font-size:18px;cursor:pointer}.drawer-body{flex:1;overflow-y:auto;padding:16px}.designation-item{display:flex;align-items:center;gap:12px;padding:12px;margin-bottom:10px;border:1px solid #eee;border-radius:8px;background:#fafafa}.drag-handle{cursor:move}.designation-name{flex:1}.drawer-footer{position:sticky;bottom:0;background:#fff;padding:16px;border-top:1px solid #eee;display:flex;justify-content:space-between}.btn{padding:8px 18px;border-radius:6px;border:none;cursor:pointer}.cancel{background:#f1f1f1}.submit{background:#1b4ca1;color:#fff}.designation-item select{padding:6px 10px;border:1px solid #ccc;border-radius:8px;background-color:#fff;font-size:14px;outline:none;cursor:pointer;transition:border-color .2s,box-shadow .2s}.designation-item select:focus{border-color:#1b4ca1;box-shadow:0 0 3px #007bff80}.custom-select{position:relative;width:120px;border:1px solid #ccc;border-radius:4px;cursor:pointer;-webkit-user-select:none;user-select:none}.selected-value{padding:6px 10px;display:flex;justify-content:space-between;align-items:center}.chevron{transition:transform .2s ease}.chevron.open{transform:rotate(180deg)}.dropdown{position:absolute;top:100%;left:0;width:100%;max-height:180px;overflow-y:auto;border:1px solid #ccc;background:#fff;z-index:1000;box-shadow:0 2px 6px #0003}.dropdown .search-box{width:90%;margin:6px auto;padding:4px 6px;display:block;border:1px solid #aaa;border-radius:4px}.option{padding:6px 10px;cursor:pointer}.option:hover{background:#f1f1f1}.wing-division-font{font-size:14px}\n"] }]
231
- }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.SharedService }, { type: i3.MatSnackBar }]; }, propDecorators: { closeDrawer: [{
241
+ args: [{ selector: 'app-update-designation-hierarchy', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"overlay\" *ngIf=\"isOpen\" (click)=\"cancel()\"></div>\n\n<div class=\"drawer\" [class.open]=\"isOpen\">\n\n <!-- HEADER -->\n <div class=\"drawer-header\">\n <h4>Update Designation Hierarchy</h4>\n <button class=\"close-btn\" (click)=\"cancel()\">\u2715</button>\n </div>\n\n <!-- BODY -->\n <div class=\"drawer-body\" cdkDropList (cdkDropListDropped)=\"drop($event)\">\n <div class=\"designation-item\" *ngFor=\"let item of designations; trackBy: trackById; let i = index\" cdkDrag>\n <div class=\"drag-handle\" cdkDragHandle>\n <mat-icon>drag_indicator</mat-icon>\n </div>\n\n <div class=\"designation-name\">\n <span style=\"color:#000\">{{ item.name }}</span><br/>\n <span class=\"wing-division-font\">Wing/Division - <span *ngIf=\"item.wing_division_section\">{{ item.wing_division_section }}</span>\n <span class=\"wing-division-font\" *ngIf=\"!item.wing_division_section\">N/A</span></span>\n </div>\n\n\n <!-- Custom Select -->\n <div class=\"custom-select\">\n <div class=\"selected-value\" (click)=\"toggleDropdown(item, $event)\">\n {{ item.sort_order }}\n <span class=\"chevron\" [class.open]=\"openDropdownId === item.id\"><mat-icon>arrow_drop_down</mat-icon></span>\n </div>\n\n <div class=\"dropdown\" [id]=\"'dropdown-' + item.id\" *ngIf=\"openDropdownId === item.id\"\n (click)=\"$event.stopPropagation()\">\n <input type=\"text\" placeholder=\"Search...\" [(ngModel)]=\"item.searchFilter\"\n (ngModelChange)=\"filterNumbers(item)\" class=\"search-box\">\n\n <div class=\"option\" *ngFor=\"let num of item.filteredNumbers\"\n (click)=\"selectNumber(item, num, $event)\">\n {{ num }}\n </div>\n </div>\n\n </div>\n\n </div>\n\n\n\n\n\n </div>\n\n <!-- FOOTER -->\n <div class=\"drawer-footer\">\n <button class=\"btn cancel\" (click)=\"cancel()\">Cancel</button>\n <button class=\"btn submit\" (click)=\"submit()\">Submit</button>\n </div>\n\n</div>\n\n<div class=\"overlay-loader\" *ngIf=\"loading\">\n <mat-spinner diameter=\"50\"></mat-spinner>\n</div>", styles: [".overlay{position:fixed;inset:0;background:#0006;z-index:999}.drawer{position:fixed;top:0;right:-420px;width:600px;height:100vh;background:#fff;box-shadow:-2px 0 12px #00000026;transition:right .3s ease;z-index:1000;display:flex;flex-direction:column}.drawer.open{right:0}.drawer-header{position:sticky;top:0;padding:16px;background:#fff;border-bottom:1px solid #eee;display:flex;justify-content:space-between;align-items:center;z-index:10}.close-btn{border:none;background:transparent;font-size:18px;cursor:pointer}.drawer-body{flex:1;overflow-y:auto;padding:16px}.designation-item{display:flex;align-items:center;gap:12px;padding:12px;margin-bottom:10px;border:1px solid #eee;border-radius:8px;background:#fafafa}.drag-handle{cursor:move}.designation-name{flex:1}.drawer-footer{position:sticky;bottom:0;background:#fff;padding:16px;border-top:1px solid #eee;display:flex;justify-content:space-between}.btn{padding:8px 18px;border-radius:6px;border:none;cursor:pointer}.cancel{background:#f1f1f1}.submit{background:#1b4ca1;color:#fff}.designation-item select{padding:6px 10px;border:1px solid #ccc;border-radius:8px;background-color:#fff;font-size:14px;outline:none;cursor:pointer;transition:border-color .2s,box-shadow .2s}.designation-item select:focus{border-color:#1b4ca1;box-shadow:0 0 3px #007bff80}.custom-select{position:relative;width:120px;border:1px solid #ccc;border-radius:4px;cursor:pointer;-webkit-user-select:none;user-select:none}.selected-value{padding:6px 10px;display:flex;justify-content:space-between;align-items:center}.chevron{transition:transform .2s ease}.chevron.open{transform:rotate(180deg)}.dropdown{position:absolute;top:100%;left:0;width:100%;max-height:180px;overflow-y:auto;border:1px solid #ccc;background:#fff;z-index:1000;box-shadow:0 2px 6px #0003}.dropdown .search-box{width:90%;margin:6px auto;padding:4px 6px;display:block;border:1px solid #aaa;border-radius:4px}.option{padding:6px 10px;cursor:pointer}.option:hover{background:#f1f1f1}.wing-division-font{font-size:14px}\n"] }]
242
+ }], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.SharedService }, { type: i3.MatSnackBar }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { closeDrawer: [{
232
243
  type: Output
233
244
  }], submitted: [{
234
245
  type: Output
235
246
  }] } });
236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWRlc2lnbmF0aW9uLWhpZXJhcmNoeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvY29tcG9uZW50cy91cGRhdGUtZGVzaWduYXRpb24taGllcmFyY2h5L3VwZGF0ZS1kZXNpZ25hdGlvbi1oaWVyYXJjaHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvdXBkYXRlLWRlc2lnbmF0aW9uLWhpZXJhcmNoeS91cGRhdGUtZGVzaWduYXRpb24taGllcmFyY2h5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUVaLE1BQU0sRUFFTix1QkFBdUIsRUFDeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7O0FBaUJ0RSxNQUFNLE9BQU8sbUNBQW1DO0lBYTlDLFlBQW9CLElBQWdCLEVBQVMsYUFBNEIsRUFBVSxRQUFxQjtRQUFwRixTQUFJLEdBQUosSUFBSSxDQUFZO1FBQVMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFhO1FBWnhHLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUNyQyxXQUFNLEdBQUcsSUFBSSxDQUFDO1FBR2QsaUJBQVksR0FBVSxFQUFFLENBQUM7UUFFekIsWUFBTyxHQUFHLEtBQUssQ0FBQTtRQUNMLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUN2QyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUU5QyxZQUFPLEdBQWEsRUFBRSxDQUFDO0lBRXNGLENBQUM7SUFFOUcsUUFBUTtRQUdOLElBQUksQ0FB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QUFtQyx5SUN6QmhELHk0RUErRE07OzRGRHRDTyxtQ0FBbUM7a0JBTi9DLFNBQVM7K0JBQ0Usa0NBQWtDLG1CQUczQix1QkFBdUIsQ0FBQyxNQUFNO3VKQVVyQyxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgT25Jbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneVxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENka0RyYWdEcm9wLCBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBTaGFyZWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbW9kdWxlcy9zaGFyZWQvc2VydmljZXMvc2hhcmVkLnNlcnZpY2UnO1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlc2lnbmF0aW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBzb3J0X29yZGVyOiBudW1iZXI7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC11cGRhdGUtZGVzaWduYXRpb24taGllcmFyY2h5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL3VwZGF0ZS1kZXNpZ25hdGlvbi1oaWVyYXJjaHkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi91cGRhdGUtZGVzaWduYXRpb24taGllcmFyY2h5LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFVwZGF0ZURlc2lnbmF0aW9uSGllcmFyY2h5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgb3BlbkRyb3Bkb3duSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBpc09wZW4gPSB0cnVlO1xuICBzdGF0ZV9jZW50ZXJfaWQhOiBzdHJpbmc7XG4gIGRlcGFydG1lbnRfaWQhOiBzdHJpbmc7XG4gIGRlc2lnbmF0aW9uczogYW55W10gPSBbXTtcbiAgcm9sZV9tYXBwaW5nX2dlbmVyYXRpb246IGFueVxuICBsb2FkaW5nID0gZmFsc2VcbiAgQE91dHB1dCgpIGNsb3NlRHJhd2VyID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgc3VibWl0dGVkID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgbnVtYmVyczogbnVtYmVyW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsIHB1YmxpYyBzaGFyZWRTZXJ2aWNlOiBTaGFyZWRTZXJ2aWNlLCBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhciwpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG5cbiAgICB0aGlzLnJlZnJlc2hSb2xlTWFwcGluZ0RhdGEoKVxuXG5cblxuICAgIGNvbnNvbGUubG9nKCd0aGlzLmRlc2lnbmF0aW9ucy0tJywgdGhpcy5kZXNpZ25hdGlvbnMpXG5cbiAgfVxuXG4gIGRyb3AoZXZlbnQ6IENka0RyYWdEcm9wPERlc2lnbmF0aW9uW10+KSB7XG4gICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuZGVzaWduYXRpb25zLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuXG4gICAgLy8gVXBkYXRlIHNvcnRfb3JkZXIgYmFzZWQgb24gdGhlIG5ldyBhcnJheSBpbmRleFxuICAgIHRoaXMuZGVzaWduYXRpb25zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBpdGVtLnNvcnRfb3JkZXIgPSBpbmRleCArIDE7XG4gICAgfSk7XG4gIH1cblxuICAvLyBvbk9yZGVyQ2hhbmdlKGl0ZW06IGFueSkge1xuICAvLyAgIGNvbnN0IHNlbGVjdGVkT3JkZXIgPSBpdGVtLnNvcnRfb3JkZXI7XG4gIC8vICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5kZXNpZ25hdGlvbnMuZmluZEluZGV4KGQgPT4gZC5pZCA9PT0gaXRlbS5pZCk7XG5cbiAgLy8gICB0aGlzLmRlc2lnbmF0aW9ucy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgLy8gICB0aGlzLmRlc2lnbmF0aW9ucy5zcGxpY2Uoc2VsZWN0ZWRPcmRlciAtIDEsIDAsIGl0ZW0pO1xuXG4gIC8vICAgdGhpcy5kZXNpZ25hdGlvbnMuZm9yRWFjaCgoZCwgaW5kZXgpID0+IGQuc29ydF9vcmRlciA9IGluZGV4ICsgMSk7XG4gIC8vIH1cblxuICBwcml2YXRlIHVwZGF0ZVNvcnRPcmRlckJ5SW5kZXgoKSB7XG4gICAgdGhpcy5kZXNpZ25hdGlvbnMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGl0ZW0uc29ydF9vcmRlciA9IGluZGV4ICsgMTtcbiAgICB9KTtcbiAgfVxuXG4gIHN1Ym1pdCgpIHtcbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgIGRlc2lnbmF0aW9uczogdGhpcy5kZXNpZ25hdGlvbnMubWFwKGQgPT4gKHtcbiAgICAgICAgaWQ6IGQuaWQsXG4gICAgICAgIHNvcnRfb3JkZXI6IGQuc29ydF9vcmRlclxuICAgICAgfSkpXG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgdGhpcy5kZXBhcnRtZW50X2lkID09PSAnc3RyaW5nJyAmJiB0aGlzLmRlcGFydG1lbnRfaWQpIHtcbiAgICAgIHBheWxvYWRbJ2RlcGFydG1lbnRfaWQnXSA9IHRoaXMuZGVwYXJ0bWVudF9pZFxuICAgIH1cbiAgICBpZiAodGhpcy5zdGF0ZV9jZW50ZXJfaWQpIHtcbiAgICAgIHBheWxvYWRbJ3N0YXRlX2NlbnRlcl9pZCddID0gdGhpcy5zdGF0ZV9jZW50ZXJfaWRcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygncGF5bG9hZC0tJywgcGF5bG9hZClcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgLy8gRXhhbXBsZSBBUEkgY2FsbFxuICAgIHRoaXMuc2hhcmVkU2VydmljZS51cGRhdGVEZXNpZ25hdGlvbkhpZXJhcmNoeShwYXlsb2FkKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS51cGRhdGVEZXNpZ25hdGlvbkhpZXJhcmNoeVN1YmplY3QubmV4dCh0cnVlKVxuICAgICAgICB0aGlzLnN1Ym1pdHRlZC5lbWl0KHBheWxvYWQpO1xuICAgICAgICB0aGlzLmNsb3NlRHJhd2VyLmVtaXQoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnVwZGF0ZURlc2lnbmF0aW9uSGllcmFyY2h5KHBheWxvYWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgY29uc29sZS5sb2coJ1N1Y2Nlc3M6JywgcmVzKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnVwZGF0ZURlc2lnbmF0aW9uSGllcmFyY2h5U3ViamVjdC5uZXh0KHRydWUpXG4gICAgICAgIHRoaXMuc3VibWl0dGVkLmVtaXQocGF5bG9hZCk7XG4gICAgICAgIHRoaXMuY2xvc2VEcmF3ZXIuZW1pdCgpO1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0Rlc2lnbmF0aW9uIEhpZXJhcmNoeSBTYXZlZCBTdWNjZXNzZnVsbHknLCAnWCcsIHtcbiAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICB9KTtcbiAgICAgICAgLy90aGlzLnN1Y2Nlc3NSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgIC8vIEhhbmRsZSA0MDkgQ29uZmxpY3QgaGVyZVxuICAgICAgICAvLyBhbGVydCgnQ29uZmxpY3QgZGV0ZWN0ZWQ6IFRoZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBvciBhY3Rpb24gY29uZmxpY3RzLicpO1xuICAgICAgICAvL3RoaXMuZ2V0XG4gICAgICAgIC8vIE9yIHlvdSBjYW4gc2V0IGEgVUkgZXJyb3IgbWVzc2FnZSB2YXJpYWJsZVxuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZXJyb3I/LmVycm9yPy5kZXRhaWwsICdYJywge1xuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgLy90aGlzLmFscmVhZHlBdmFpbGFibGVSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2VcbiAgICB0aGlzLmNsb3NlRHJhd2VyLmVtaXQoKTtcbiAgfVxuXG4gIHJlZnJlc2hSb2xlTWFwcGluZ0RhdGEoKSB7XG4gICAgY29uc29sZS5sb2coJ1JlZnJlc2hpbmcgcm9sZSBtYXBwaW5nIGRhdGEuLi4nKTtcbiAgICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaiAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5ICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllcikge1xuICAgICAgY29uc3QgbWluaXN0cnlUeXBlID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5zYk9yZ1R5cGU7XG4gICAgICBjb25zdCBtaW5pc3RyeUlkID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyO1xuXG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAobWluaXN0cnlUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzKSB7XG4gICAgICAgICAgY29uc3QgZGVwYXJ0bWVudElkID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cztcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdCeVN0YXRlQ2VudGVyQW5kRGVwYXJ0bWVudChtaW5pc3RyeUlkLCBkZXBhcnRtZW50SWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICBjb25zb2xlLmxvZygnU3RhdGUgcm9sZSBtYXBwaW5nIGRhdGEgcmVmcmVzaGVkOicsIHJlcyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVmcmVzaGluZyBzdGF0ZSByb2xlIG1hcHBpbmcgZGF0YTonLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlcihtaW5pc3RyeUlkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHJlcykgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coJ0NlbnRlciByb2xlIG1hcHBpbmcgZGF0YSByZWZyZXNoZWQ6JywgcmVzKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWZyZXNoaW5nIGNlbnRlciByb2xlIG1hcHBpbmcgZGF0YTonLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmIChtaW5pc3RyeVR5cGUgPT09ICdzdGF0ZScpIHtcbiAgICAgICAgY29uc3QgZGVwYXJ0bWVudElkID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cztcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLmdldFJvbGVNYXBwaW5nQnlTdGF0ZUNlbnRlckFuZERlcGFydG1lbnQobWluaXN0cnlJZCwgZGVwYXJ0bWVudElkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChyZXMpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1N0YXRlIHJvbGUgbWFwcGluZyBkYXRhIHJlZnJlc2hlZDonLCByZXMpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWZyZXNoaW5nIHN0YXRlIHJvbGUgbWFwcGluZyBkYXRhOicsIGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgY2JwUGxhbkZpbmFsT2JqID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialxuICAgIGNvbnNvbGUubG9nKCdjYnBQbGFuRmluYWxPYmotLScsIGNicFBsYW5GaW5hbE9iailcbiAgICBpZiAoY2JwUGxhbkZpbmFsT2JqPy5kZXBhcnRtZW50cykge1xuICAgICAgdGhpcy5kZXBhcnRtZW50X2lkID0gY2JwUGxhbkZpbmFsT2JqPy5kZXBhcnRtZW50c1xuICAgIH1cbiAgICBpZiAoY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeSAmJiBjYnBQbGFuRmluYWxPYmo/Lm1pbmlzdHJ5LmlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMuc3RhdGVfY2VudGVyX2lkID0gY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeS5pZGVudGlmaWVyXG4gICAgfVxuXG4gICAgdGhpcy5yb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiA9IGNicFBsYW5GaW5hbE9iaj8ucm9sZV9tYXBwaW5nX2dlbmVyYXRpb24gfHwgJ1tdJztcbiAgICAvLyBNYXAgcm9sZV9tYXBwaW5nX2dlbmVyYXRpb24gdG8gaW50ZXJuYWwgZGVzaWduYXRpb25zIGFycmF5XG4gICAgdGhpcy5udW1iZXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy5yb2xlX21hcHBpbmdfZ2VuZXJhdGlvbi5sZW5ndGggfSwgKF8sIGkpID0+IGkgKyAxKTtcbiAgICB0aGlzLmRlc2lnbmF0aW9ucyA9IHRoaXMucm9sZV9tYXBwaW5nX2dlbmVyYXRpb24ubWFwKChyOiBhbnksIGluZGV4OiBudW1iZXIpID0+ICh7XG4gICAgICBpZDogci5pZCxcbiAgICAgIG5hbWU6IHIuZGVzaWduYXRpb25fbmFtZSxcbiAgICAgIHNvcnRfb3JkZXI6IHIuc29ydF9vcmRlciB8fCBpbmRleCArIDEsXG4gICAgICBzZWFyY2hGaWx0ZXI6ICcnLCAgICAgICAgICAgICAgLy8gU2VhcmNoIGlucHV0IHZhbHVlXG4gICAgICBmaWx0ZXJlZE51bWJlcnM6IFsuLi50aGlzLm51bWJlcnNdLCAvLyBOdW1iZXJzIHRvIGRpc3BsYXkgaW4gc2VsZWN0XG4gICAgICB3aW5nX2RpdmlzaW9uX3NlY3Rpb246IHIud2luZ19kaXZpc2lvbl9zZWN0aW9uXG4gICAgfSkpO1xuXG5cbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgIHRoaXMubnVtYmVycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMuZGVzaWduYXRpb25zLmxlbmd0aCB9LCAoXywgaSkgPT4gaSArIDEpO1xuICAgIC8vIFNvcnQgYnkgc29ydF9vcmRlclxuICAgIHRoaXMuZGVzaWduYXRpb25zLnNvcnQoKGEsIGIpID0+IGEuc29ydF9vcmRlciAtIGIuc29ydF9vcmRlcik7XG4gICAgdGhpcy51cGRhdGVTb3J0T3JkZXJCeUluZGV4KCk7XG4gIH1cblxudG9nZ2xlRHJvcGRvd24oaXRlbTogYW55LCBldmVudDogRXZlbnQpIHtcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIHRoaXMub3BlbkRyb3Bkb3duSWQgPSB0aGlzLm9wZW5Ecm9wZG93bklkID09PSBpdGVtLmlkID8gbnVsbCA6IGl0ZW0uaWQ7XG5cbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgY29uc3QgZHJvcGRvd25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcm9wZG93bi0nICsgaXRlbS5pZCk7XG4gICAgaWYgKCFkcm9wZG93bkVsKSByZXR1cm47XG5cbiAgICBjb25zdCByZWN0ID0gZHJvcGRvd25FbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB3aW5kb3dIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICAvLyBJZiBkcm9wZG93biBib3R0b20gZXhjZWVkcyB2aWV3cG9ydCwgb3BlbiB1cHdhcmRcbiAgICBpZiAocmVjdC5ib3R0b20gPiB3aW5kb3dIZWlnaHQpIHtcbiAgICAgIGRyb3Bkb3duRWwuc3R5bGUudG9wID0gYC0ke3JlY3QuaGVpZ2h0fXB4YDsgIC8vIG9wZW4gYWJvdmVcbiAgICB9IGVsc2Uge1xuICAgICAgZHJvcGRvd25FbC5zdHlsZS50b3AgPSBgMTAwJWA7ICAvLyBvcGVuIGJlbG93XG4gICAgfVxuICB9KTtcbn1cblxuXG4vLyBTZWxlY3QgbnVtYmVyIGZyb20gZHJvcGRvd25cbnNlbGVjdE51bWJlcihpdGVtOiBhbnksIG51bTogbnVtYmVyLCBldmVudDogRXZlbnQpIHtcbiAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IC8vIElNUE9SVEFOVDogcHJldmVudHMgcGFyZW50IHRvZ2dsZVxuXG4gIC8vIFNldCB0aGUgc2VsZWN0ZWQgdmFsdWVcbiAgaXRlbS5zb3J0X29yZGVyID0gbnVtO1xuXG4gIC8vIENsb3NlIGRyb3Bkb3duXG4gIHRoaXMub3BlbkRyb3Bkb3duSWQgPSBudWxsO1xuXG4gIC8vIFJlc2V0IHNlYXJjaFxuICBpdGVtLnNlYXJjaEZpbHRlciA9ICcnO1xuICBpdGVtLmZpbHRlcmVkTnVtYmVycyA9IFsuLi50aGlzLm51bWJlcnNdO1xuXG4gIC8vIFJlb3JkZXIgYXJyYXlcbiAgdGhpcy5vbk9yZGVyQ2hhbmdlKGl0ZW0pO1xufVxuXG5maWx0ZXJOdW1iZXJzKGl0ZW06IGFueSkge1xuICBpZiAoIWl0ZW0uc2VhcmNoRmlsdGVyKSB7XG4gICAgaXRlbS5maWx0ZXJlZE51bWJlcnMgPSBbLi4udGhpcy5udW1iZXJzXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmaWx0ZXJWYWx1ZSA9IGl0ZW0uc2VhcmNoRmlsdGVyLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpdGVtLmZpbHRlcmVkTnVtYmVycyA9IHRoaXMubnVtYmVycy5maWx0ZXIobnVtID0+XG4gICAgICBudW0udG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGZpbHRlclZhbHVlKVxuICAgICk7XG4gIH1cbn1cblxub25PcmRlckNoYW5nZShpdGVtOiBhbnkpIHtcbiAgY29uc3Qgc2VsZWN0ZWRPcmRlciA9IGl0ZW0uc29ydF9vcmRlcjtcbiAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5kZXNpZ25hdGlvbnMuZmluZEluZGV4KGQgPT4gZC5pZCA9PT0gaXRlbS5pZCk7XG5cbiAgdGhpcy5kZXNpZ25hdGlvbnMuc3BsaWNlKGN1cnJlbnRJbmRleCwgMSk7XG4gIHRoaXMuZGVzaWduYXRpb25zLnNwbGljZShzZWxlY3RlZE9yZGVyIC0gMSwgMCwgaXRlbSk7XG5cbiAgdGhpcy5kZXNpZ25hdGlvbnMuZm9yRWFjaCgoZCwgaW5kZXgpID0+IChkLnNvcnRfb3JkZXIgPSBpbmRleCArIDEpKTtcbn1cblxudHJhY2tCeUlkKGluZGV4OiBudW1iZXIsIGl0ZW06IGFueSkge1xuICByZXR1cm4gaXRlbS5pZDtcbn1cblxuXG59XG4iLCI8ZGl2IGNsYXNzPVwib3ZlcmxheVwiICpuZ0lmPVwiaXNPcGVuXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+PC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJkcmF3ZXJcIiBbY2xhc3Mub3Blbl09XCJpc09wZW5cIj5cblxuICAgIDwhLS0gSEVBREVSIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItaGVhZGVyXCI+XG4gICAgICAgIDxoND5VcGRhdGUgRGVzaWduYXRpb24gSGllcmFyY2h5PC9oND5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNsb3NlLWJ0blwiIChjbGljayk9XCJjYW5jZWwoKVwiPuKclTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBCT0RZIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItYm9keVwiIGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcCgkZXZlbnQpXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRlc2lnbmF0aW9uLWl0ZW1cIiAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkZXNpZ25hdGlvbnM7IHRyYWNrQnk6IHRyYWNrQnlJZDsgbGV0IGkgPSBpbmRleFwiIGNka0RyYWc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhZy1oYW5kbGVcIiBjZGtEcmFnSGFuZGxlPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5kcmFnX2luZGljYXRvcjwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2lnbmF0aW9uLW5hbWVcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cImNvbG9yOiMwMDBcIj57eyBpdGVtLm5hbWUgfX08L3NwYW4+PGJyLz5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIndpbmctZGl2aXNpb24tZm9udFwiPldpbmcvRGl2aXNpb24gLSA8c3BhbiAqbmdJZj1cIml0ZW0ud2luZ19kaXZpc2lvbl9zZWN0aW9uXCI+e3sgaXRlbS53aW5nX2RpdmlzaW9uX3NlY3Rpb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ3aW5nLWRpdmlzaW9uLWZvbnRcIiAqbmdJZj1cIiFpdGVtLndpbmdfZGl2aXNpb25fc2VjdGlvblwiPk4vQTwvc3Bhbj48L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICA8IS0tIEN1c3RvbSBTZWxlY3QgLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY3VzdG9tLXNlbGVjdFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RlZC12YWx1ZVwiIChjbGljayk9XCJ0b2dnbGVEcm9wZG93bihpdGVtLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGl0ZW0uc29ydF9vcmRlciB9fVxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZXZyb25cIiBbY2xhc3Mub3Blbl09XCJvcGVuRHJvcGRvd25JZCA9PT0gaXRlbS5pZFwiPjxtYXQtaWNvbj5hcnJvd19kcm9wX2Rvd248L21hdC1pY29uPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcm9wZG93blwiIFtpZF09XCInZHJvcGRvd24tJyArIGl0ZW0uaWRcIiAqbmdJZj1cIm9wZW5Ecm9wZG93bklkID09PSBpdGVtLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaC4uLlwiIFsobmdNb2RlbCldPVwiaXRlbS5zZWFyY2hGaWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiZmlsdGVyTnVtYmVycyhpdGVtKVwiIGNsYXNzPVwic2VhcmNoLWJveFwiPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvcHRpb25cIiAqbmdGb3I9XCJsZXQgbnVtIG9mIGl0ZW0uZmlsdGVyZWROdW1iZXJzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3ROdW1iZXIoaXRlbSwgbnVtLCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBudW0gfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwvZGl2PlxuXG5cblxuXG5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gRk9PVEVSIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItZm9vdGVyXCI+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gY2FuY2VsXCIgKGNsaWNrKT1cImNhbmNlbCgpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gc3VibWl0XCIgKGNsaWNrKT1cInN1Ym1pdCgpXCI+U3VibWl0PC9idXR0b24+XG4gICAgPC9kaXY+XG5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwib3ZlcmxheS1sb2FkZXJcIiAqbmdJZj1cImxvYWRpbmdcIj5cbiAgICA8bWF0LXNwaW5uZXIgZGlhbWV0ZXI9XCI1MFwiPjwvbWF0LXNwaW5uZXI+XG48L2Rpdj4iXX0=
247
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWRlc2lnbmF0aW9uLWhpZXJhcmNoeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJyYXJ5L3N1bmJpcmQtY2IvY2JwLWFpL3NyYy9saWIvY29tcG9uZW50cy91cGRhdGUtZGVzaWduYXRpb24taGllcmFyY2h5L3VwZGF0ZS1kZXNpZ25hdGlvbi1oaWVyYXJjaHkuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL2NicC1haS9zcmMvbGliL2NvbXBvbmVudHMvdXBkYXRlLWRlc2lnbmF0aW9uLWhpZXJhcmNoeS91cGRhdGUtZGVzaWduYXRpb24taGllcmFyY2h5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUVaLE1BQU0sRUFFTix1QkFBdUIsRUFFeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFlLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDOzs7Ozs7Ozs7O0FBaUJ0RSxNQUFNLE9BQU8sbUNBQW1DO0lBYTlDLFlBQW9CLElBQWdCLEVBQVMsYUFBNEIsRUFBVSxRQUFxQixFQUFVLEdBQXNCO1FBQXBILFNBQUksR0FBSixJQUFJLENBQVk7UUFBUyxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQWE7UUFBVSxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQVp4SSxtQkFBYyxHQUFrQixJQUFJLENBQUM7UUFDckMsV0FBTSxHQUFHLElBQUksQ0FBQztRQUdkLGlCQUFZLEdBQVUsRUFBRSxDQUFDO1FBRXpCLFlBQU8sR0FBRyxLQUFLLENBQUE7UUFDTCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDdkMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFFOUMsWUFBTyxHQUFhLEVBQUUsQ0FB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QUMsRUFBRSxLQUFLLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV4RSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsYUFBYSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFckQsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELFNBQVMsQ0FBQyxLQUFhLEVBQUUsSUFBUztRQUNoQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDakIsQ0FBQzsrR0F2UVksbUNBQW1DO21HQUFuQyxtQ0FBbUMseUlDMUJoRCx1NEVBOERNOzs0RkRwQ08sbUNBQW1DO2tCQU4vQyxTQUFTOytCQUNFLGtDQUFrQyxtQkFHM0IsdUJBQXVCLENBQUMsTUFBTTt1TEFVckMsV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIE9uSW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IFNoYXJlZFNlcnZpY2UgfSBmcm9tICcuLi8uLi9tb2R1bGVzL3NoYXJlZC9zZXJ2aWNlcy9zaGFyZWQuc2VydmljZSc7XG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVzaWduYXRpb24ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIHNvcnRfb3JkZXI6IG51bWJlcjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXVwZGF0ZS1kZXNpZ25hdGlvbi1oaWVyYXJjaHknLFxuICB0ZW1wbGF0ZVVybDogJy4vdXBkYXRlLWRlc2lnbmF0aW9uLWhpZXJhcmNoeS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL3VwZGF0ZS1kZXNpZ25hdGlvbi1oaWVyYXJjaHkuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgVXBkYXRlRGVzaWduYXRpb25IaWVyYXJjaHlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBvcGVuRHJvcGRvd25JZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGlzT3BlbiA9IHRydWU7XG4gIHN0YXRlX2NlbnRlcl9pZCE6IHN0cmluZztcbiAgZGVwYXJ0bWVudF9pZCE6IHN0cmluZztcbiAgZGVzaWduYXRpb25zOiBhbnlbXSA9IFtdO1xuICByb2xlX21hcHBpbmdfZ2VuZXJhdGlvbjogYW55XG4gIGxvYWRpbmcgPSBmYWxzZVxuICBAT3V0cHV0KCkgY2xvc2VEcmF3ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBzdWJtaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBudW1iZXJzOiBudW1iZXJbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgaHR0cDogSHR0cENsaWVudCwgcHVibGljIHNoYXJlZFNlcnZpY2U6IFNoYXJlZFNlcnZpY2UsIHByaXZhdGUgc25hY2tCYXI6IE1hdFNuYWNrQmFyLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG5cbiAgICB0aGlzLnJlZnJlc2hSb2xlTWFwcGluZ0RhdGEoKVxuXG5cblxuICAgIGNvbnNvbGUubG9nKCd0aGlzLmRlc2lnbmF0aW9ucy0tJywgdGhpcy5kZXNpZ25hdGlvbnMpXG5cbiAgfVxuXG4gIGRyb3AoZXZlbnQ6IENka0RyYWdEcm9wPERlc2lnbmF0aW9uW10+KSB7XG4gICAgbW92ZUl0ZW1JbkFycmF5KHRoaXMuZGVzaWduYXRpb25zLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuXG4gICAgLy8gVXBkYXRlIHNvcnRfb3JkZXIgYmFzZWQgb24gdGhlIG5ldyBhcnJheSBpbmRleFxuICAgIHRoaXMuZGVzaWduYXRpb25zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICBpdGVtLnNvcnRfb3JkZXIgPSBpbmRleCArIDE7XG4gICAgfSk7XG4gIH1cblxuICAvLyBvbk9yZGVyQ2hhbmdlKGl0ZW06IGFueSkge1xuICAvLyAgIGNvbnN0IHNlbGVjdGVkT3JkZXIgPSBpdGVtLnNvcnRfb3JkZXI7XG4gIC8vICAgY29uc3QgY3VycmVudEluZGV4ID0gdGhpcy5kZXNpZ25hdGlvbnMuZmluZEluZGV4KGQgPT4gZC5pZCA9PT0gaXRlbS5pZCk7XG5cbiAgLy8gICB0aGlzLmRlc2lnbmF0aW9ucy5zcGxpY2UoY3VycmVudEluZGV4LCAxKTtcbiAgLy8gICB0aGlzLmRlc2lnbmF0aW9ucy5zcGxpY2Uoc2VsZWN0ZWRPcmRlciAtIDEsIDAsIGl0ZW0pO1xuXG4gIC8vICAgdGhpcy5kZXNpZ25hdGlvbnMuZm9yRWFjaCgoZCwgaW5kZXgpID0+IGQuc29ydF9vcmRlciA9IGluZGV4ICsgMSk7XG4gIC8vIH1cblxuICBwcml2YXRlIHVwZGF0ZVNvcnRPcmRlckJ5SW5kZXgoKSB7XG4gICAgdGhpcy5kZXNpZ25hdGlvbnMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgIGl0ZW0uc29ydF9vcmRlciA9IGluZGV4ICsgMTtcbiAgICB9KTtcbiAgfVxuXG4gIHN1Ym1pdCgpIHtcbiAgICBsZXQgcGF5bG9hZCA9IHtcbiAgICAgIGRlc2lnbmF0aW9uczogdGhpcy5kZXNpZ25hdGlvbnMubWFwKGQgPT4gKHtcbiAgICAgICAgaWQ6IGQuaWQsXG4gICAgICAgIHNvcnRfb3JkZXI6IGQuc29ydF9vcmRlclxuICAgICAgfSkpXG4gICAgfTtcblxuICAgIGlmICh0eXBlb2YgdGhpcy5kZXBhcnRtZW50X2lkID09PSAnc3RyaW5nJyAmJiB0aGlzLmRlcGFydG1lbnRfaWQpIHtcbiAgICAgIHBheWxvYWRbJ2RlcGFydG1lbnRfaWQnXSA9IHRoaXMuZGVwYXJ0bWVudF9pZFxuICAgIH1cbiAgICBpZiAodGhpcy5zdGF0ZV9jZW50ZXJfaWQpIHtcbiAgICAgIHBheWxvYWRbJ3N0YXRlX2NlbnRlcl9pZCddID0gdGhpcy5zdGF0ZV9jZW50ZXJfaWRcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygncGF5bG9hZC0tJywgcGF5bG9hZClcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlXG4gICAgLy8gRXhhbXBsZSBBUEkgY2FsbFxuICAgIHRoaXMuc2hhcmVkU2VydmljZS51cGRhdGVEZXNpZ25hdGlvbkhpZXJhcmNoeShwYXlsb2FkKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS51cGRhdGVEZXNpZ25hdGlvbkhpZXJhcmNoeVN1YmplY3QubmV4dCh0cnVlKVxuICAgICAgICB0aGlzLnN1Ym1pdHRlZC5lbWl0KHBheWxvYWQpO1xuICAgICAgICB0aGlzLmNsb3NlRHJhd2VyLmVtaXQoKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnVwZGF0ZURlc2lnbmF0aW9uSGllcmFyY2h5KHBheWxvYWQpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgIC8vIFN1Y2Nlc3MgaGFuZGxpbmdcbiAgICAgICAgY29uc29sZS5sb2coJ1N1Y2Nlc3M6JywgcmVzKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgdGhpcy5zaGFyZWRTZXJ2aWNlLnVwZGF0ZURlc2lnbmF0aW9uSGllcmFyY2h5U3ViamVjdC5uZXh0KHRydWUpXG4gICAgICAgIHRoaXMuc3VibWl0dGVkLmVtaXQocGF5bG9hZCk7XG4gICAgICAgIHRoaXMuY2xvc2VEcmF3ZXIuZW1pdCgpO1xuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0Rlc2lnbmF0aW9uIEhpZXJhcmNoeSBTYXZlZCBTdWNjZXNzZnVsbHknLCAnWCcsIHtcbiAgICAgICAgICBkdXJhdGlvbjogMzAwMCxcbiAgICAgICAgICBwYW5lbENsYXNzOiBbJ3NuYWNrYmFyLXN1Y2Nlc3MnXVxuICAgICAgICB9KTtcbiAgICAgICAgLy90aGlzLnN1Y2Nlc3NSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yJywgZXJyb3IpXG4gICAgICAgIC8vIEhhbmRsZSA0MDkgQ29uZmxpY3QgaGVyZVxuICAgICAgICAvLyBhbGVydCgnQ29uZmxpY3QgZGV0ZWN0ZWQ6IFRoZSByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBvciBhY3Rpb24gY29uZmxpY3RzLicpO1xuICAgICAgICAvL3RoaXMuZ2V0XG4gICAgICAgIC8vIE9yIHlvdSBjYW4gc2V0IGEgVUkgZXJyb3IgbWVzc2FnZSB2YXJpYWJsZVxuICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oZXJyb3I/LmVycm9yPy5kZXRhaWwsICdYJywge1xuICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIHBhbmVsQ2xhc3M6IFsnc25hY2tiYXItZXJyb3InXVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2VcbiAgICAgICAgLy90aGlzLmFscmVhZHlBdmFpbGFibGVSb2xlTWFwcGluZy5lbWl0KHRoaXMucm9sZU1hcHBpbmdGb3JtKVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2VcbiAgICB0aGlzLmNsb3NlRHJhd2VyLmVtaXQoKTtcbiAgfVxuXG4gIHJlZnJlc2hSb2xlTWFwcGluZ0RhdGEoKSB7XG4gICAgY29uc29sZS5sb2coJ1JlZnJlc2hpbmcgcm9sZSBtYXBwaW5nIGRhdGEuLi4nKTtcbiAgICBpZiAodGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iaiAmJiB0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLm1pbmlzdHJ5ICYmIHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmoubWluaXN0cnkuaWRlbnRpZmllcikge1xuICAgICAgY29uc3QgbWluaXN0cnlUeXBlID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5zYk9yZ1R5cGU7XG4gICAgICBjb25zdCBtaW5pc3RyeUlkID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5taW5pc3RyeS5pZGVudGlmaWVyO1xuXG4gICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuXG4gICAgICBpZiAobWluaXN0cnlUeXBlID09PSAnbWluaXN0cnknKSB7XG4gICAgICAgIGlmICh0aGlzLnNoYXJlZFNlcnZpY2UuY2JwUGxhbkZpbmFsT2JqLmRlcGFydG1lbnRzKSB7XG4gICAgICAgICAgY29uc3QgZGVwYXJ0bWVudElkID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9iai5kZXBhcnRtZW50cztcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdSZU9yZGVyTGlzdChtaW5pc3RyeUlkLCBkZXBhcnRtZW50SWQpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMucm9sZV9tYXBwaW5nX2dlbmVyYXRpb24gPSByZXMgfHwgJ1tdJztcbiAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTdGF0ZSByb2xlIG1hcHBpbmcgZGF0YSByZWZyZXNoZWQ6JywgcmVzKTtcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVEZXNpZ25hdGlvbkhpZXJhcmNoeVJlc3BvbnNlKCk7IC8vIFVwZGF0ZSBkZXNpZ25hdGlvbnMgYWZ0ZXIgZmV0Y2hpbmcgbmV3IGRhdGFcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciByZWZyZXNoaW5nIHN0YXRlIHJvbGUgbWFwcGluZyBkYXRhOicsIGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNoYXJlZFNlcnZpY2UuZ2V0Um9sZU1hcHBpbmdSZU9yZGVyTGlzdChtaW5pc3RyeUlkLG51bGwpLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLnJvbGVfbWFwcGluZ19nZW5lcmF0aW9uID0gcmVzIHx8ICdbXSc7XG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdDZW50ZXIgcm9sZSBtYXBwaW5nIGRhdGEgcmVmcmVzaGVkOicsIHJlcyk7XG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlRGVzaWduYXRpb25IaWVyYXJjaHlSZXNwb25zZSgpOyAvLyBVcGRhdGUgZGVzaWduYXRpb25zIGFmdGVyIGZldGNoaW5nIG5ldyBkYXRhXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVmcmVzaGluZyBjZW50ZXIgcm9sZSBtYXBwaW5nIGRhdGE6JywgZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAobWluaXN0cnlUeXBlID09PSAnc3RhdGUnKSB7XG4gICAgICAgIGNvbnN0IGRlcGFydG1lbnRJZCA9IHRoaXMuc2hhcmVkU2VydmljZS5jYnBQbGFuRmluYWxPYmouZGVwYXJ0bWVudHM7XG4gICAgICAgIHRoaXMuc2hhcmVkU2VydmljZS5nZXRSb2xlTWFwcGluZ1JlT3JkZXJMaXN0KG1pbmlzdHJ5SWQsIGRlcGFydG1lbnRJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAocmVzKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMucm9sZV9tYXBwaW5nX2dlbmVyYXRpb24gPSByZXMgfHwgJ1tdJztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1N0YXRlIHJvbGUgbWFwcGluZyBkYXRhIHJlZnJlc2hlZDonLCByZXMpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVEZXNpZ25hdGlvbkhpZXJhcmNoeVJlc3BvbnNlKCk7IC8vIFVwZGF0ZSBkZXNpZ25hdGlvbnMgYWZ0ZXIgZmV0Y2hpbmcgbmV3IGRhdGFcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgcmVmcmVzaGluZyBzdGF0ZSByb2xlIG1hcHBpbmcgZGF0YTonLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICBcbiAgfVxuXG4gIHVwZGF0ZURlc2lnbmF0aW9uSGllcmFyY2h5UmVzcG9uc2UoKSB7IFxuICAgICBsZXQgY2JwUGxhbkZpbmFsT2JqID0gdGhpcy5zaGFyZWRTZXJ2aWNlLmNicFBsYW5GaW5hbE9ialxuICAgIGNvbnNvbGUubG9nKCdjYnBQbGFuRmluYWxPYmotLScsIGNicFBsYW5GaW5hbE9iailcbiAgICBpZiAoY2JwUGxhbkZpbmFsT2JqPy5kZXBhcnRtZW50cykge1xuICAgICAgdGhpcy5kZXBhcnRtZW50X2lkID0gY2JwUGxhbkZpbmFsT2JqPy5kZXBhcnRtZW50c1xuICAgIH1cbiAgICBpZiAoY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeSAmJiBjYnBQbGFuRmluYWxPYmo/Lm1pbmlzdHJ5LmlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMuc3RhdGVfY2VudGVyX2lkID0gY2JwUGxhbkZpbmFsT2JqPy5taW5pc3RyeS5pZGVudGlmaWVyXG4gICAgfVxuXG4gICAgLy8gdGhpcy5yb2xlX21hcHBpbmdfZ2VuZXJhdGlvbiA9IGNicFBsYW5GaW5hbE9iaj8ucm9sZV9tYXBwaW5nX2dlbmVyYXRpb24gfHwgJ1tdJztcbiAgICBcbiAgICAvLyBNYXAgcm9sZV9tYXBwaW5nX2dlbmVyYXRpb24gdG8gaW50ZXJuYWwgZGVzaWduYXRpb25zIGFycmF5XG4gICAgdGhpcy5udW1iZXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdGhpcy5yb2xlX21hcHBpbmdfZ2VuZXJhdGlvbi5sZW5ndGggfSwgKF8sIGkpID0+IGkgKyAxKTtcbiAgICB0aGlzLmRlc2lnbmF0aW9ucyA9IHRoaXMucm9sZV9tYXBwaW5nX2dlbmVyYXRpb24ubWFwKChyOiBhbnksIGluZGV4OiBudW1iZXIpID0+ICh7XG4gICAgICBpZDogci5pZCxcbiAgICAgIG5hbWU6IHIuZGVzaWduYXRpb25fbmFtZSxcbiAgICAgIHNvcnRfb3JkZXI6IHIuc29ydF9vcmRlciB8fCBpbmRleCArIDEsXG4gICAgICBzZWFyY2hGaWx0ZXI6ICcnLCAgICAgICAgICAgICAgLy8gU2VhcmNoIGlucHV0IHZhbHVlXG4gICAgICBmaWx0ZXJlZE51bWJlcnM6IFsuLi50aGlzLm51bWJlcnNdLCAvLyBOdW1iZXJzIHRvIGRpc3BsYXkgaW4gc2VsZWN0XG4gICAgICB3aW5nX2RpdmlzaW9uX3NlY3Rpb246IHIud2luZ19kaXZpc2lvbl9zZWN0aW9uXG4gICAgfSkpO1xuICAgIGNvbnNvbGUubG9nKCd0aGlzLmRlc2lnbmF0aW9ucy0tJywgdGhpcy5kZXNpZ25hdGlvbnMpXG5cbiAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZVxuICAgIHRoaXMubnVtYmVycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHRoaXMuZGVzaWduYXRpb25zLmxlbmd0aCB9LCAoXywgaSkgPT4gaSArIDEpO1xuICAgIC8vIFNvcnQgYnkgc29ydF9vcmRlclxuICAgIHRoaXMuZGVzaWduYXRpb25zLnNvcnQoKGEsIGIpID0+IGEuc29ydF9vcmRlciAtIGIuc29ydF9vcmRlcik7XG4gICAgdGhpcy51cGRhdGVTb3J0T3JkZXJCeUluZGV4KCk7XG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbnRvZ2dsZURyb3Bkb3duKGl0ZW06IGFueSwgZXZlbnQ6IEV2ZW50KSB7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB0aGlzLm9wZW5Ecm9wZG93bklkID0gdGhpcy5vcGVuRHJvcGRvd25JZCA9PT0gaXRlbS5pZCA/IG51bGwgOiBpdGVtLmlkO1xuXG4gIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgIGNvbnN0IGRyb3Bkb3duRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJvcGRvd24tJyArIGl0ZW0uaWQpO1xuICAgIGlmICghZHJvcGRvd25FbCkgcmV0dXJuO1xuXG4gICAgY29uc3QgcmVjdCA9IGRyb3Bkb3duRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3Qgd2luZG93SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuXG4gICAgLy8gSWYgZHJvcGRvd24gYm90dG9tIGV4Y2VlZHMgdmlld3BvcnQsIG9wZW4gdXB3YXJkXG4gICAgaWYgKHJlY3QuYm90dG9tID4gd2luZG93SGVpZ2h0KSB7XG4gICAgICBkcm9wZG93bkVsLnN0eWxlLnRvcCA9IGAtJHtyZWN0LmhlaWdodH1weGA7ICAvLyBvcGVuIGFib3ZlXG4gICAgfSBlbHNlIHtcbiAgICAgIGRyb3Bkb3duRWwuc3R5bGUudG9wID0gYDEwMCVgOyAgLy8gb3BlbiBiZWxvd1xuICAgIH1cbiAgfSk7XG59XG5cblxuLy8gU2VsZWN0IG51bWJlciBmcm9tIGRyb3Bkb3duXG5zZWxlY3ROdW1iZXIoaXRlbTogYW55LCBudW06IG51bWJlciwgZXZlbnQ6IEV2ZW50KSB7XG4gIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBJTVBPUlRBTlQ6IHByZXZlbnRzIHBhcmVudCB0b2dnbGVcblxuICAvLyBTZXQgdGhlIHNlbGVjdGVkIHZhbHVlXG4gIGl0ZW0uc29ydF9vcmRlciA9IG51bTtcblxuICAvLyBDbG9zZSBkcm9wZG93blxuICB0aGlzLm9wZW5Ecm9wZG93bklkID0gbnVsbDtcblxuICAvLyBSZXNldCBzZWFyY2hcbiAgaXRlbS5zZWFyY2hGaWx0ZXIgPSAnJztcbiAgaXRlbS5maWx0ZXJlZE51bWJlcnMgPSBbLi4udGhpcy5udW1iZXJzXTtcblxuICAvLyBSZW9yZGVyIGFycmF5XG4gIHRoaXMub25PcmRlckNoYW5nZShpdGVtKTtcbn1cblxuZmlsdGVyTnVtYmVycyhpdGVtOiBhbnkpIHtcbiAgaWYgKCFpdGVtLnNlYXJjaEZpbHRlcikge1xuICAgIGl0ZW0uZmlsdGVyZWROdW1iZXJzID0gWy4uLnRoaXMubnVtYmVyc107XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZmlsdGVyVmFsdWUgPSBpdGVtLnNlYXJjaEZpbHRlci50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgaXRlbS5maWx0ZXJlZE51bWJlcnMgPSB0aGlzLm51bWJlcnMuZmlsdGVyKG51bSA9PlxuICAgICAgbnVtLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhmaWx0ZXJWYWx1ZSlcbiAgICApO1xuICB9XG59XG5cbm9uT3JkZXJDaGFuZ2UoaXRlbTogYW55KSB7XG4gIGNvbnN0IHNlbGVjdGVkT3JkZXIgPSBpdGVtLnNvcnRfb3JkZXI7XG4gIGNvbnN0IGN1cnJlbnRJbmRleCA9IHRoaXMuZGVzaWduYXRpb25zLmZpbmRJbmRleChkID0+IGQuaWQgPT09IGl0ZW0uaWQpO1xuXG4gIHRoaXMuZGVzaWduYXRpb25zLnNwbGljZShjdXJyZW50SW5kZXgsIDEpO1xuICB0aGlzLmRlc2lnbmF0aW9ucy5zcGxpY2Uoc2VsZWN0ZWRPcmRlciAtIDEsIDAsIGl0ZW0pO1xuXG4gIHRoaXMuZGVzaWduYXRpb25zLmZvckVhY2goKGQsIGluZGV4KSA9PiAoZC5zb3J0X29yZGVyID0gaW5kZXggKyAxKSk7XG59XG5cbnRyYWNrQnlJZChpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpIHtcbiAgcmV0dXJuIGl0ZW0uaWQ7XG59XG5cblxufVxuIiwiPGRpdiBjbGFzcz1cIm92ZXJsYXlcIiAqbmdJZj1cImlzT3BlblwiIChjbGljayk9XCJjYW5jZWwoKVwiPjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiZHJhd2VyXCIgW2NsYXNzLm9wZW5dPVwiaXNPcGVuXCI+XG5cbiAgICA8IS0tIEhFQURFUiAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWhlYWRlclwiPlxuICAgICAgICA8aDQ+VXBkYXRlIERlc2lnbmF0aW9uIEhpZXJhcmNoeTwvaDQ+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjbG9zZS1idG5cIiAoY2xpY2spPVwiY2FuY2VsKClcIj7inJU8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gQk9EWSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWJvZHlcIiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3AoJGV2ZW50KVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzaWduYXRpb24taXRlbVwiICpuZ0Zvcj1cImxldCBpdGVtIG9mIGRlc2lnbmF0aW9uczsgdHJhY2tCeTogdHJhY2tCeUlkOyBsZXQgaSA9IGluZGV4XCIgY2RrRHJhZz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkcmFnLWhhbmRsZVwiIGNka0RyYWdIYW5kbGU+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGVzaWduYXRpb24tbmFtZVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiY29sb3I6IzAwMFwiPnt7IGl0ZW0ubmFtZSB9fTwvc3Bhbj48YnIvPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwid2luZy1kaXZpc2lvbi1mb250XCI+V2luZy9EaXZpc2lvbiAtIDxzcGFuICpuZ0lmPVwiaXRlbS53aW5nX2RpdmlzaW9uX3NlY3Rpb25cIj57eyBpdGVtLndpbmdfZGl2aXNpb25fc2VjdGlvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIndpbmctZGl2aXNpb24tZm9udFwiICpuZ0lmPVwiIWl0ZW0ud2luZ19kaXZpc2lvbl9zZWN0aW9uXCI+Ti9BPC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG5cbiAgICAgICAgICAgIDwhLS0gQ3VzdG9tIFNlbGVjdCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjdXN0b20tc2VsZWN0XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGVkLXZhbHVlXCIgKGNsaWNrKT1cInRvZ2dsZURyb3Bkb3duKGl0ZW0sICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5zb3J0X29yZGVyIH19XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hldnJvblwiIFtjbGFzcy5vcGVuXT1cIm9wZW5Ecm9wZG93bklkID09PSBpdGVtLmlkXCI+PG1hdC1pY29uPmFycm93X2Ryb3BfZG93bjwvbWF0LWljb24+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duXCIgW2lkXT1cIidkcm9wZG93bi0nICsgaXRlbS5pZFwiICpuZ0lmPVwib3BlbkRyb3Bkb3duSWQgPT09IGl0ZW0uaWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoLi4uXCIgWyhuZ01vZGVsKV09XCJpdGVtLnNlYXJjaEZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJmaWx0ZXJOdW1iZXJzKGl0ZW0pXCIgY2xhc3M9XCJzZWFyY2gtYm94XCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9wdGlvblwiICpuZ0Zvcj1cImxldCBudW0gb2YgaXRlbS5maWx0ZXJlZE51bWJlcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdE51bWJlcihpdGVtLCBudW0sICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IG51bSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPC9kaXY+XG5cblxuXG5cblxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBGT09URVIgLS0+XG4gICAgPGRpdiBjbGFzcz1cImRyYXdlci1mb290ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBjYW5jZWxcIiAoY2xpY2spPVwiY2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBzdWJtaXRcIiAoY2xpY2spPVwic3VibWl0KClcIj5TdWJtaXQ8L2J1dHRvbj5cbiAgICA8L2Rpdj5cblxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJvdmVybGF5LWxvYWRlclwiICpuZ0lmPVwibG9hZGluZ1wiPlxuICAgIDxtYXQtc3Bpbm5lciBkaWFtZXRlcj1cIjUwXCI+PC9tYXQtc3Bpbm5lcj5cbjwvZGl2PiJdfQ==