@colijnit/homedecorator 255.1.4 → 255.1.6

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 (89) hide show
  1. package/app/core/enum/message-type.enum.d.ts +3 -1
  2. package/app/core/interface/message-with-payload.interface.d.ts +6 -0
  3. package/app/core/model/homedecorator-settings-options.d.ts +2 -0
  4. package/app/core/service/homedecorator-app-event.service.d.ts +1 -0
  5. package/app/core/service/homedecorator-connector-adapter.service.d.ts +2 -0
  6. package/app/core/service/homedecorator-connector.service.d.ts +5 -4
  7. package/app/core/service/homedecorator-settings.service.d.ts +2 -1
  8. package/app/core/service/presets.service.d.ts +3 -1
  9. package/app/homedecorator.component.d.ts +3 -1
  10. package/app/homedecorator.module.d.ts +2 -1
  11. package/app/plugins/core3d/service/floor-pattern.service.d.ts +1 -1
  12. package/app/plugins/core3d/service/floor-tile-intersection.service.d.ts +2 -1
  13. package/app/plugins/core3d/service/floor.service.d.ts +3 -1
  14. package/app/plugins/core3d/service/post-processing.service.d.ts +21 -7
  15. package/app/plugins/core3d/service/scene.service.d.ts +1 -1
  16. package/app/plugins/core3d/service/ssr.service.d.ts +0 -1
  17. package/app/plugins/model-uploader/model-previewer/model-preview.component.d.ts +11 -2
  18. package/app/plugins/model-uploader/model-previewer/model-preview.component.scss +185 -15
  19. package/app/plugins/model-uploader/model-uploader.module.d.ts +5 -1
  20. package/app/plugins/render/render-dialog/render-dialog.component.d.ts +4 -1
  21. package/app/plugins/render/render-dialog/render-dialog.component.scss +5 -5
  22. package/app/plugins/room-planner/components/floorplanner/floorplanner.component.d.ts +3 -1
  23. package/app/plugins/room-planner/components/floorplanner/service/room.service.d.ts +1 -0
  24. package/app/plugins/room-planner/components/settings/settings.component.d.ts +5 -1
  25. package/app/plugins/room-planner/components/texture-editor/texture-editor.component.d.ts +4 -1
  26. package/app/plugins/room-planner/room-planner/room-planner.component.scss +1 -0
  27. package/app/plugins/threedselector/threedselector/service/build-furniture.service.d.ts +1 -3
  28. package/app/plugins/toolbar/draw-dialog/draw-dialog.component.d.ts +2 -0
  29. package/app/plugins/toolbar/draw-dialog/draw-dialog.component.scss +1 -1
  30. package/app/plugins/toolbar/toolbar/toolbar.component.d.ts +2 -0
  31. package/assets/icons/dash-button.svg +7 -0
  32. package/assets/icons/pen-ruler.svg +1 -0
  33. package/assets/icons/retry-button.svg +7 -0
  34. package/bundles/colijnit-homedecorator.umd.js +822 -601
  35. package/bundles/colijnit-homedecorator.umd.js.map +1 -1
  36. package/esm2015/app/app.version.js +3 -3
  37. package/esm2015/app/core/enum/message-type.enum.js +3 -1
  38. package/esm2015/app/core/interface/message-with-payload.interface.js +1 -1
  39. package/esm2015/app/core/model/homedecorator-settings-options.js +3 -1
  40. package/esm2015/app/core/service/3dm-api.js +4 -4
  41. package/esm2015/app/core/service/homedecorator-app-event.service.js +2 -1
  42. package/esm2015/app/core/service/homedecorator-connector-adapter.service.js +25 -2
  43. package/esm2015/app/core/service/homedecorator-connector.service.js +25 -22
  44. package/esm2015/app/core/service/homedecorator-settings.service.js +3 -2
  45. package/esm2015/app/core/service/presets.service.js +13 -5
  46. package/esm2015/app/core/utils/material.utils.js +3 -3
  47. package/esm2015/app/homedecorator.component.js +26 -19
  48. package/esm2015/app/homedecorator.module.js +8 -4
  49. package/esm2015/app/plugins/core3d/core3d/components/scenecontrol/scene-control.component.js +5 -5
  50. package/esm2015/app/plugins/core3d/items/custom-cylinder-floor-item.js +2 -2
  51. package/esm2015/app/plugins/core3d/items/custom-cylinder-wall-item.js +2 -2
  52. package/esm2015/app/plugins/core3d/items/custom-shape-floor-item.js +2 -2
  53. package/esm2015/app/plugins/core3d/items/custom-shape-wall-item.js +2 -2
  54. package/esm2015/app/plugins/core3d/items/factory.js +3 -2
  55. package/esm2015/app/plugins/core3d/service/ar.service.js +2 -1
  56. package/esm2015/app/plugins/core3d/service/floor-pattern.service.js +24 -18
  57. package/esm2015/app/plugins/core3d/service/floor-tile-intersection.service.js +13 -8
  58. package/esm2015/app/plugins/core3d/service/floor.service.js +9 -4
  59. package/esm2015/app/plugins/core3d/service/light-presets.service.js +10 -8
  60. package/esm2015/app/plugins/core3d/service/lights.service.js +8 -1
  61. package/esm2015/app/plugins/core3d/service/outline.service.js +4 -6
  62. package/esm2015/app/plugins/core3d/service/post-processing.service.js +148 -51
  63. package/esm2015/app/plugins/core3d/service/scene-event.service.js +14 -7
  64. package/esm2015/app/plugins/core3d/service/scene.service.js +84 -74
  65. package/esm2015/app/plugins/core3d/service/ssr.service.js +2 -53
  66. package/esm2015/app/plugins/lite-selector/lite-selector/component/answers-slideout/answers-slideout.component.js +10 -5
  67. package/esm2015/app/plugins/lite-selector/lite-selector/lite-selector.component.js +2 -2
  68. package/esm2015/app/plugins/model-uploader/model-previewer/model-preview.component.js +281 -166
  69. package/esm2015/app/plugins/model-uploader/model-uploader.module.js +22 -3
  70. package/esm2015/app/plugins/render/render-controls/render-controls.component.js +3 -2
  71. package/esm2015/app/plugins/render/render-dialog/render-dialog.component.js +19 -14
  72. package/esm2015/app/plugins/render/service/new-render.service.js +4 -2
  73. package/esm2015/app/plugins/room-planner/components/custom-cylinder-creator/custom-cylinder-creator.component.js +4 -2
  74. package/esm2015/app/plugins/room-planner/components/custome-shape-creator/custom-shape-creator.component.js +2 -2
  75. package/esm2015/app/plugins/room-planner/components/floorplanner/floorplanner.component.js +29 -15
  76. package/esm2015/app/plugins/room-planner/components/floorplanner/service/room.service.js +5 -2
  77. package/esm2015/app/plugins/room-planner/components/settings/settings.component.js +12 -5
  78. package/esm2015/app/plugins/room-planner/components/texture-editor/texture-editor.component.js +31 -15
  79. package/esm2015/app/plugins/room-planner/room-planner/room-planner.component.js +691 -683
  80. package/esm2015/app/plugins/threedselector/threedselector/service/build-furniture.service.js +43 -41
  81. package/esm2015/app/plugins/threedselector/threedselector/threedselector.component.js +1 -1
  82. package/esm2015/app/plugins/toolbar/draw-dialog/draw-dialog.component.js +26 -20
  83. package/esm2015/app/plugins/toolbar/save-dialog/save-dialog.component.js +2 -2
  84. package/esm2015/app/plugins/toolbar/toolbar/toolbar.component.js +15 -8
  85. package/esm2015/app/shared/loading-overlay/loading-overlay.component.js +4 -2
  86. package/esm2015/app/shared/model-dialog/model-dialog-furniture-list.component.js +3 -3
  87. package/fesm2015/colijnit-homedecorator.js +1656 -1322
  88. package/fesm2015/colijnit-homedecorator.js.map +1 -1
  89. package/package.json +1 -1
@@ -763,7 +763,7 @@ export class RoomPlannerComponent {
763
763
  this.showContextMenu = false;
764
764
  }
765
765
  startGroupSelection() {
766
- this.showContextMenu = false;
766
+ this.closeContextMenu();
767
767
  this.userIsGrouping = true;
768
768
  this._messageService.emit(MessageType.StartGroupObject);
769
769
  }
@@ -870,752 +870,760 @@ export class RoomPlannerComponent {
870
870
  }
871
871
  RoomPlannerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RoomPlannerComponent, deps: [{ token: i1.HomedecoratorIconCacheService }, { token: i2.ViewModeService }, { token: i3.ModelsService }, { token: i4.PresetsService }, { token: i5.HomedecoratorAppService }, { token: i6.ScreenSizeAnalysisService }, { token: i0.ChangeDetectorRef }, { token: i7.UtilsService }, { token: i8.MessageBusService }, { token: i9.MatDialog }, { token: i10.ConfigurationService }, { token: i11.FloorplanService }, { token: i12.SceneService }, { token: i13.HudService }, { token: i14.RoomService }, { token: i15.CameraService }, { token: i16.ItemService }, { token: i17.ItemSerializationService }, { token: i18.LightsService }, { token: i19.ArService }, { token: i16.ItemService }, { token: i20.HomedecoratorSettingsService }, { token: i21.GoogleTagManagerService }, { token: i22.PermanentStoreService }, { token: i23.HomedecoratorAppEventService }, { token: i24.HomedecoratorConnectorService }, { token: i25.HomedecoratorConnectorAdapterService }], target: i0.ɵɵFactoryTarget.Component });
872
872
  RoomPlannerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: RoomPlannerComponent, selector: "rp-room-planner", inputs: { isLoading: "isLoading" }, outputs: { done: "done", showPlugin: "showPlugin", focusControls: "focusControls" }, host: { listeners: { "document:keydown": "handleDocKeyDown($event)" }, properties: { "class": "this.layerClass" } }, viewQueries: [{ propertyName: "floorplanner", first: true, predicate: FloorplannerComponent, descendants: true, static: true }, { propertyName: "toolbarIconLibrary", first: true, predicate: ["toolbarIconLibrary"], descendants: true, static: true }, { propertyName: "toolbarIconAccessoires", first: true, predicate: ["toolbarIconAccessoires"], descendants: true, static: true }, { propertyName: "toolbarIconSettings", first: true, predicate: ["toolbarIconSettings"], descendants: true, static: true }, { propertyName: "toolbarIcon2dView", first: true, predicate: ["toolbarIcon2dView"], descendants: true, static: true }, { propertyName: "toolbarIcon3dView", first: true, predicate: ["toolbarIcon3dView"], descendants: true, static: true }, { propertyName: "categoriesSidebar", first: true, predicate: ["categoriesSidebar"], descendants: true, static: true }, { propertyName: "accessoiresCategoriesSidebar", first: true, predicate: ["accessoiresCategoriesSidebar"], descendants: true, static: true }, { propertyName: "customShapeCreatorSideBar", first: true, predicate: ["customShapeCreatorSideBar"], descendants: true, static: true }, { propertyName: "customCylinderCreatorSideBar", first: true, predicate: ["customCylinderCreatorSideBar"], descendants: true, static: true }, { propertyName: "settingsSidebar", first: true, predicate: ["settingsSidebar"], descendants: true, static: true }, { propertyName: "librarySidebar", first: true, predicate: ["librarySidebar"], descendants: true, static: true }, { propertyName: "selectedObjectSidebar", first: true, predicate: ["selectedObjectSidebar"], descendants: true, static: true }, { propertyName: "selectedWallSidebar", first: true, predicate: ["selectedWallSidebar"], descendants: true, static: true }, { propertyName: "selectedThreedObjectSidebar", first: true, predicate: ["selectedThreedObjectSidebar"], descendants: true, static: true }, { propertyName: "selectedFloorSidebar", first: true, predicate: ["selectedFloorSidebar"], descendants: true, static: true }, { propertyName: "toolbarIconFaq", first: true, predicate: ["toolbarIconFaq"], descendants: true, static: true }, { propertyName: "toolbarIconFeedback", first: true, predicate: ["toolbarIconFeedback"], descendants: true, static: true }, { propertyName: "toolbarIconCart", first: true, predicate: ["toolbarIconCart"], descendants: true, static: true }], ngImport: i0, template: `
873
- <div class="RoomPlanner">
874
- <floor-planner
875
- [class.hidden]="!viewModeService.is2dViewActive()"
876
- (selectedWallChange)="selectWall($event)"></floor-planner>
873
+ <div class="RoomPlanner">
874
+ <floor-planner
875
+ [class.hidden]="!viewModeService.is2dViewActive()"
876
+ (selectedWallChange)="selectWall($event)"></floor-planner>
877
+ </div>
878
+
879
+ <rp-context-menu
880
+ *ngIf="!viewModeService.is2dViewActive() && showContextMenu && selectedWall"
881
+ [openMouseEvent]="contextMenuMouseEvent">
882
+ <div class="rp-item-context-menu-wrap ">
883
+ <div (click)="showSelectedWallSidebar()" class="rp-item-context-menu-item">
884
+ <span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
885
+ <span class="label">{{ 'CONFIGURE' | localize }}</span>
886
+ </div>
877
887
  </div>
888
+ </rp-context-menu>
878
889
 
879
- <rp-context-menu
880
- *ngIf="!viewModeService.is2dViewActive() && showContextMenu && selectedWall"
881
- [openMouseEvent]="contextMenuMouseEvent">
882
- <div class="rp-item-context-menu-wrap ">
883
- <div (click)="showSelectedWallSidebar()" class="rp-item-context-menu-item">
884
- <span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
885
- <span class="label">{{ 'CONFIGURE' | localize }}</span>
886
- </div>
887
- </div>
888
- </rp-context-menu>
890
+ <rp-context-menu
891
+ *ngIf="!viewModeService.is2dViewActive() && showContextMenu && selectedFloor"
892
+ [openMouseEvent]="contextMenuMouseEvent">
893
+ <div class="rp-item-context-menu-wrap">
894
+ <div (click)="showSelectedFloorSidebar()" class="rp-item-context-menu-item ">
895
+ <span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
896
+ <span class="label">{{ 'CONFIGURE' | localize }}</span>
897
+ </div>
898
+ </div>
899
+ </rp-context-menu>
889
900
 
890
- <rp-context-menu
891
- *ngIf="!viewModeService.is2dViewActive() && showContextMenu && selectedFloor"
892
- [openMouseEvent]="contextMenuMouseEvent">
893
- <div class="rp-item-context-menu-wrap">
894
- <div (click)="showSelectedFloorSidebar()" class="rp-item-context-menu-item ">
895
- <span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
896
- <span class="label">{{ 'CONFIGURE' | localize }}</span>
897
- </div>
901
+ <rp-item-context-menu
902
+ *ngIf="!viewModeService.is2dViewActive() && showContextMenu && !showGroupMenu"
903
+ [item]="selectedObject"
904
+ (deletePressed)="handleDeleteObject()">
905
+ <div class="rp-item-context-menu-wrap">
906
+ <div class="rp-item-context-menu-close" (click)="closeContextMenu()">
907
+ <span class="close-icon"><mat-icon class="homedecorator-material-icons">close</mat-icon></span>
908
+ </div>
909
+ <div *ngIf="this.selectedObject" class="rp-item-context-menu-header">
910
+ <p>{{ this.selectedObject.name }}</p>
911
+ </div>
912
+ <div *ngIf="showSettingsButton" (click)="showSelectedObjectSidebar()"
913
+ class="rp-item-context-menu-item ">
914
+ <span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
915
+ <span class="label">{{ 'CONFIGURE' | localize }}</span>
916
+ </div>
917
+ <ng-container *ngIf="showConfigurationButton">
918
+ <div *ngFor="let customButton of modelsService.customButtons" (click)="handleConfigurationButtonClick(customButton)"
919
+ class="rp-item-context-menu-item ">
920
+ <span class="icon"><co-icon [iconData]="iconService.getIcon(icon.MagicWand)"></co-icon></span>
921
+ <span class="label">{{ 'CONFIGURE' | localize }}</span>
898
922
  </div>
899
- </rp-context-menu>
923
+ </ng-container>
924
+ <div *ngIf="showCopyButton" (click)="copySelectedObject()" class="rp-item-context-menu-item">
925
+ <span class="icon"><mat-icon class="homedecorator-material-icons">file_copy</mat-icon></span>
926
+ <span class="label">{{ 'COPY' | localize }}</span>
927
+ </div>
928
+ <div *ngIf="showDeleteButton" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
929
+ <span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
930
+ <span class="label">{{ 'REMOVE' | localize }}</span>
931
+ </div>
932
+ <div *ngIf="showConfigurationButton" (click)="showSelectedThreedObjectSidebar()"
933
+ class="rp-item-context-menu-item">
934
+ <span class="icon"><mat-icon class="homedecorator-material-icons">settings</mat-icon></span>
935
+ <span class="label">{{ 'SETTINGS' | localize }}</span>
936
+ </div>
937
+ <div *ngIf="showLockButton && selectedObject" (click)="toggleLockSelectedObject()"
938
+ class="rp-item-context-menu-item">
939
+ <span class="icon"><mat-icon class="homedecorator-material-icons"
940
+ [textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
941
+ <span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
942
+ </div>
943
+ <div *ngIf="!showGroupEditMenuButtons" (click)="startGroupSelection()" class="rp-item-context-menu-item">
944
+ <span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
945
+ <span class="label">{{ 'GROUP' | localize }}</span>
946
+ </div>
900
947
 
901
- <rp-item-context-menu
902
- *ngIf="!viewModeService.is2dViewActive() && showContextMenu && !showGroupMenu"
903
- [item]="selectedObject"
904
- (deletePressed)="handleDeleteObject()">
905
- <div class="rp-item-context-menu-wrap">
906
- <div class="rp-item-context-menu-close" (click)="closeContextMenu()">
907
- <span class="close-icon"><mat-icon class="homedecorator-material-icons">close</mat-icon></span>
908
- </div>
909
- <div *ngIf="this.selectedObject" class="rp-item-context-menu-header">
910
- <p>{{ this.selectedObject.name }}</p>
911
- </div>
912
- <div *ngIf="showSettingsButton" (click)="showSelectedObjectSidebar()"
913
- class="rp-item-context-menu-item ">
914
- <span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
915
- <span class="label">{{ 'CONFIGURE' | localize }}</span>
916
- </div>
917
- <ng-container *ngIf="showConfigurationButton">
918
- <div *ngFor="let customButton of modelsService.customButtons" (click)="handleConfigurationButtonClick(customButton)"
919
- class="rp-item-context-menu-item ">
920
- <span class="icon"><co-icon [iconData]="iconService.getIcon(icon.MagicWand)"></co-icon></span>
921
- <span class="label">{{ 'CONFIGURE' | localize }}</span>
922
- </div>
923
- </ng-container>
924
- <div *ngIf="showCopyButton" (click)="copySelectedObject()" class="rp-item-context-menu-item">
925
- <span class="icon"><mat-icon class="homedecorator-material-icons">file_copy</mat-icon></span>
926
- <span class="label">{{ 'COPY' | localize }}</span>
927
- </div>
928
- <div *ngIf="showDeleteButton" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
929
- <span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
930
- <span class="label">{{ 'REMOVE' | localize }}</span>
931
- </div>
932
- <div *ngIf="showConfigurationButton" (click)="showSelectedThreedObjectSidebar()"
933
- class="rp-item-context-menu-item">
934
- <span class="icon"><mat-icon class="homedecorator-material-icons">settings</mat-icon></span>
935
- <span class="label">{{ 'SETTINGS' | localize }}</span>
936
- </div>
937
- <div *ngIf="showLockButton && selectedObject" (click)="toggleLockSelectedObject()"
938
- class="rp-item-context-menu-item">
939
- <span class="icon"><mat-icon class="homedecorator-material-icons" [textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
940
- <span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
941
- </div>
942
- <div *ngIf="!showGroupEditMenuButtons" (click)="startGroupSelection()" class="rp-item-context-menu-item">
943
- <span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
944
- <span class="label">{{ 'GROUP' | localize }}</span>
945
- </div>
948
+ <div *ngIf="showConversionButton && settingsService.settings.showConversionButtons"
949
+ (click)="sendConversionToTagManager()"
950
+ class="rp-item-context-menu-item"
951
+ [ngClass]="addSelectedClass ? 'conversion-button-selected' : ''">
952
+ <span class="icon"><mat-icon class="homedecorator-material-icons">add_shopping_cart</mat-icon></span>
953
+ <span class="label">{{ 'CONVERSION' | localize }}</span>
954
+ <span class="icon icon-selected"><mat-icon class="homedecorator-material-icons">check_circle</mat-icon></span>
955
+ </div>
946
956
 
947
- <div *ngIf="showConversionButton && settingsService.settings.showConversionButtons"
948
- (click)="sendConversionToTagManager()"
949
- class="rp-item-context-menu-item"
950
- [ngClass]="addSelectedClass ? 'conversion-button-selected' : ''">
951
- <span class="icon"><mat-icon class="homedecorator-material-icons">add_shopping_cart</mat-icon></span>
952
- <span class="label">{{ 'CONVERSION' | localize }}</span>
953
- <span class="icon icon-selected"><mat-icon class="homedecorator-material-icons">check_circle</mat-icon></span>
954
- </div>
955
-
956
-
957
- <div *ngIf="showARButton" (click)="startARSession()" class="rp-item-context-menu-item">
958
- <span class="icon"><mat-icon class="homedecorator-material-icons">weekend</mat-icon></span>
959
- <span class="label">{{ 'AR' | localize }}</span>
960
- </div>
961
- <button-elevation
962
- *ngIf="selectedObject && selectedObject.elevationAdjustable"
963
- [item]="selectedObject">
964
- </button-elevation>
965
- <ng-container *ngIf="salableObject">
966
- <div class="toolbar__divider context-menu"></div>
967
- <div (click)="addToCart(selectedObject)" class="rp-item-context-menu-item add-to-cart-button">
968
- <span class="icon"><mat-icon class="homedecorator-material-icons" [svgIcon]="'cart-shopping-regular'"></mat-icon></span>
969
- <span class="label">{{ 'ADD_TO_CART' | localize }}</span>
970
- </div>
971
- </ng-container>
972
- </div>
973
- </rp-item-context-menu>
974
957
 
975
- <rp-item-context-menu *ngIf="!viewModeService.is2dViewActive() && showContextMenu && showGroupMenu && !userIsGrouping"
976
- [item]="selectedObject"
977
- (deletePressed)="handleDeleteObject()">
978
- <div class="rp-item-context-menu-wrap">
979
- <div *ngIf="!showGroupEditMenuButtons" (click)="onGroupClick()" class="rp-item-context-menu-item">
980
- <span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
981
- <span class="label">{{ 'GROUP' | localize }}</span>
982
- </div>
983
- <div *ngIf="showGroupEditMenuButtons" (click)="onUnGroupClick()" class="rp-item-context-menu-item">
984
- <span class="icon"><mat-icon class="homedecorator-material-icons">link_off</mat-icon></span>
985
- <span class="label">{{ 'UNGROUP' | localize }}</span>
986
- </div>
987
- <div *ngIf="showGroupEditMenuButtons" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
988
- <span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
989
- <span class="label">{{ 'REMOVE' | localize }}</span>
990
- </div>
991
- <div *ngIf="showLockButton && selectedObject && showGroupEditMenuButtons" (click)="toggleLockSelectedObject()"
992
- class="rp-item-context-menu-item">
993
- <span class="icon"><mat-icon class="homedecorator-material-icons" [textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
994
- <span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
995
- </div>
958
+ <div *ngIf="showARButton" (click)="startARSession()" class="rp-item-context-menu-item">
959
+ <span class="icon"><mat-icon class="homedecorator-material-icons">weekend</mat-icon></span>
960
+ <span class="label">{{ 'AR' | localize }}</span>
961
+ </div>
962
+ <button-elevation
963
+ *ngIf="selectedObject && selectedObject.elevationAdjustable"
964
+ [item]="selectedObject">
965
+ </button-elevation>
966
+ <ng-container *ngIf="salableObject">
967
+ <div class="toolbar__divider context-menu"></div>
968
+ <div (click)="addToCart(selectedObject)" class="rp-item-context-menu-item add-to-cart-button">
969
+ <span class="icon"><mat-icon class="homedecorator-material-icons" [svgIcon]="'cart-shopping-regular'"></mat-icon></span>
970
+ <span class="label">{{ 'ADD_TO_CART' | localize }}</span>
996
971
  </div>
997
- </rp-item-context-menu>
972
+ </ng-container>
973
+ </div>
974
+ </rp-item-context-menu>
998
975
 
999
- <ng-template #toolbarIconLibrary>
1000
- <rp-toolbar-icon
1001
- *ngIf="!phoneSizeScreen"
1002
- [disabled]="viewModeService.is2dViewActive() || viewModeService.isWalkThroughViewActive()"
1003
- matIcon="home"
1004
- tooltip="{{iconName.Architecture | localize}}"
1005
- (onClick)="showLibraryCategories()"
1006
- [showLabel]="phoneSizeScreen"
1007
- ></rp-toolbar-icon>
1008
- </ng-template>
976
+ <rp-item-context-menu *ngIf="!viewModeService.is2dViewActive() && showContextMenu && showGroupMenu && !userIsGrouping"
977
+ [item]="selectedObject"
978
+ (deletePressed)="handleDeleteObject()">
979
+ <div class="rp-item-context-menu-wrap">
980
+ <div *ngIf="!showGroupEditMenuButtons" (click)="onGroupClick()" class="rp-item-context-menu-item">
981
+ <span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
982
+ <span class="label">{{ 'GROUP' | localize }}</span>
983
+ </div>
984
+ <div *ngIf="showGroupEditMenuButtons" (click)="onUnGroupClick()" class="rp-item-context-menu-item">
985
+ <span class="icon"><mat-icon class="homedecorator-material-icons">link_off</mat-icon></span>
986
+ <span class="label">{{ 'UNGROUP' | localize }}</span>
987
+ </div>
988
+ <div *ngIf="showGroupEditMenuButtons" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
989
+ <span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
990
+ <span class="label">{{ 'REMOVE' | localize }}</span>
991
+ </div>
992
+ <div *ngIf="showLockButton && selectedObject && showGroupEditMenuButtons" (click)="toggleLockSelectedObject()"
993
+ class="rp-item-context-menu-item">
994
+ <span class="icon"><mat-icon class="homedecorator-material-icons"
995
+ [textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
996
+ <span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
997
+ </div>
998
+ </div>
999
+ </rp-item-context-menu>
1009
1000
 
1010
- <ng-template #toolbarIconAccessoires>
1011
- <rp-toolbar-icon
1012
- [disabled]="viewModeService.is2dViewActive() || viewModeService.isWalkThroughViewActive()"
1013
- matIcon="local_florist"
1014
- tooltip="{{iconName.Accessories | localize}}"
1015
- (onClick)="showAccessoireCategories()"
1016
- [showLabel]="phoneSizeScreen"
1017
- ></rp-toolbar-icon>
1018
- </ng-template>
1001
+ <ng-template #toolbarIconLibrary>
1002
+ <rp-toolbar-icon
1003
+ *ngIf="!phoneSizeScreen"
1004
+ [disabled]="viewModeService.is2dViewActive() || viewModeService.isWalkThroughViewActive()"
1005
+ matIcon="home"
1006
+ tooltip="{{iconName.Architecture | localize}}"
1007
+ (onClick)="showLibraryCategories()"
1008
+ [showLabel]="phoneSizeScreen"
1009
+ ></rp-toolbar-icon>
1010
+ </ng-template>
1019
1011
 
1020
- <ng-template #toolbarIcon2dView>
1021
- <span class="toolbar__divider"></span>
1022
- <rp-toolbar-icon
1023
- *ngIf="!phoneSizeScreen"
1024
- svgIcon="cube-unfolded"
1025
- tooltip="{{iconName.TwodFloorplan | localize}}"
1026
- [disabled]="viewModeService.is2dViewActive() || !desktopSizeScreen"
1027
- (onClick)="updateMode(viewModes.FloorPlan2D, true)"
1028
- [showLabel]="phoneSizeScreen"
1029
- ></rp-toolbar-icon>
1030
- </ng-template>
1012
+ <ng-template #toolbarIconAccessoires>
1013
+ <rp-toolbar-icon
1014
+ [disabled]="viewModeService.is2dViewActive() || viewModeService.isWalkThroughViewActive()"
1015
+ matIcon="local_florist"
1016
+ tooltip="{{iconName.Accessories | localize}}"
1017
+ (onClick)="showAccessoireCategories()"
1018
+ [showLabel]="phoneSizeScreen"
1019
+ ></rp-toolbar-icon>
1020
+ </ng-template>
1031
1021
 
1032
- <ng-template #toolbarIcon3dView>
1033
- <rp-toolbar-icon
1034
- svgIcon="cube-outline"
1035
- tooltip="{{iconName.ThreedRoomplan | localize}}"
1036
- [disabled]="viewModeService.is3dViewActive()"
1037
- (onClick)="updateMode(viewModes.RoomPlan3D, true)"
1038
- [showLabel]="phoneSizeScreen"
1039
- ></rp-toolbar-icon>
1040
- </ng-template>
1022
+ <ng-template #toolbarIcon2dView>
1023
+ <span class="toolbar__divider"></span>
1024
+ <rp-toolbar-icon
1025
+ *ngIf="!phoneSizeScreen"
1026
+ svgIcon="cube-unfolded"
1027
+ tooltip="{{iconName.TwodFloorplan | localize}}"
1028
+ [disabled]="viewModeService.is2dViewActive() || !desktopSizeScreen"
1029
+ (onClick)="updateMode(viewModes.FloorPlan2D, true)"
1030
+ [showLabel]="phoneSizeScreen"
1031
+ ></rp-toolbar-icon>
1032
+ </ng-template>
1041
1033
 
1042
- <rp-zoom-controls
1043
- [visible]="viewModeService.is2dViewActive()"
1044
- (onZoomIn)="zoomIn()"
1045
- (onZoomReset)="zoomReset()"
1046
- (onZoomOut)="zoomOut()"
1047
- ></rp-zoom-controls>
1034
+ <ng-template #toolbarIcon3dView>
1035
+ <rp-toolbar-icon
1036
+ svgIcon="cube-outline"
1037
+ tooltip="{{iconName.ThreedRoomplan | localize}}"
1038
+ [disabled]="viewModeService.is3dViewActive()"
1039
+ (onClick)="updateMode(viewModes.RoomPlan3D, true)"
1040
+ [showLabel]="phoneSizeScreen"
1041
+ ></rp-toolbar-icon>
1042
+ </ng-template>
1048
1043
 
1049
- <ng-template #toolbarIconSettings>
1050
- <span class="toolbar__divider"></span>
1051
- <rp-toolbar-icon
1052
- matIcon="settings"
1053
- tooltip="{{iconName.Settings | localize}}"
1054
- (onClick)="showSettings()"
1055
- [showLabel]="phoneSizeScreen"
1056
- ></rp-toolbar-icon>
1057
- </ng-template>
1044
+ <rp-zoom-controls
1045
+ [visible]="viewModeService.is2dViewActive()"
1046
+ (onZoomIn)="zoomIn()"
1047
+ (onZoomReset)="zoomReset()"
1048
+ (onZoomOut)="zoomOut()"
1049
+ ></rp-zoom-controls>
1058
1050
 
1059
- <ng-template #toolbarIconFaq>
1060
- <rp-toolbar-icon
1061
- *ngIf="showFaq()"
1062
- matIcon="help"
1063
- tooltip="{{iconName.Faq | localize}}"
1064
- (onClick)="openFaq(this.settingsService.settings.faqUrl)"
1065
- [showLabel]="phoneSizeScreen"
1066
- ></rp-toolbar-icon>
1067
- </ng-template>
1051
+ <ng-template #toolbarIconSettings>
1052
+ <span class="toolbar__divider"></span>
1053
+ <rp-toolbar-icon
1054
+ matIcon="settings"
1055
+ tooltip="{{iconName.Settings | localize}}"
1056
+ (onClick)="showSettings()"
1057
+ [showLabel]="phoneSizeScreen"
1058
+ ></rp-toolbar-icon>
1059
+ </ng-template>
1068
1060
 
1069
- <ng-template #toolbarIconFeedback>
1070
- <rp-toolbar-icon
1071
- *ngIf="showFeedback()"
1072
- matIcon="chat_bubble"
1073
- tooltip="{{iconName.Feedback | localize}}"
1074
- (onClick)="openFeedback(this.settingsService.settings.feedbackUrl)"
1075
- [showLabel]="phoneSizeScreen"
1076
- ></rp-toolbar-icon>
1077
- </ng-template>
1078
- <ng-template #toolbarIconCart>
1079
- <span class="toolbar__divider"></span>
1080
- <rp-toolbar-icon class="add-to-cart-button"
1081
- svgIcon="cart-shopping-regular"
1082
- tooltip="{{'ADD_TO_CART' | localize}}"
1083
- (onClick)="addAllToCart()"
1084
- [showLabel]="phoneSizeScreen"
1085
- ></rp-toolbar-icon>
1086
- <span class="toolbar__divider"></span>
1087
- </ng-template>
1061
+ <ng-template #toolbarIconFaq>
1062
+ <rp-toolbar-icon
1063
+ *ngIf="showFaq()"
1064
+ matIcon="help"
1065
+ tooltip="{{iconName.Faq | localize}}"
1066
+ (onClick)="openFaq(this.settingsService.settings.faqUrl)"
1067
+ [showLabel]="phoneSizeScreen"
1068
+ ></rp-toolbar-icon>
1069
+ </ng-template>
1088
1070
 
1089
- <ng-template #settingsSidebar>
1090
- <header class="drawer__header">
1091
- <h2 class="mat-title">{{ 'SETTINGS' | localize }}</h2>
1092
- </header>
1093
- <rp-settings
1094
- [placeCameraDisabled]="viewModeService.is2dViewActive() || itemService.getWalkthroughCamera()"
1095
- [minWallHeight]="getMinGlobalWallHeight()"
1096
- (onWallsHeightUpdate)="wallsHeightUpdated($event)"
1097
- >
1098
- </rp-settings>
1099
- </ng-template>
1071
+ <ng-template #toolbarIconFeedback>
1072
+ <rp-toolbar-icon
1073
+ *ngIf="showFeedback()"
1074
+ matIcon="chat_bubble"
1075
+ tooltip="{{iconName.Feedback | localize}}"
1076
+ (onClick)="openFeedback(this.settingsService.settings.feedbackUrl)"
1077
+ [showLabel]="phoneSizeScreen"
1078
+ ></rp-toolbar-icon>
1079
+ </ng-template>
1080
+ <ng-template #toolbarIconCart>
1081
+ <span class="toolbar__divider"></span>
1082
+ <rp-toolbar-icon class="add-to-cart-button"
1083
+ svgIcon="cart-shopping-regular"
1084
+ tooltip="{{'ADD_TO_CART' | localize}}"
1085
+ (onClick)="addAllToCart()"
1086
+ [showLabel]="phoneSizeScreen"
1087
+ ></rp-toolbar-icon>
1088
+ <span class="toolbar__divider"></span>
1089
+ </ng-template>
1100
1090
 
1101
- <ng-template #categoriesSidebar>
1102
- <header class="drawer__header">
1103
- <h2 class="mat-title">{{ 'ARCHITECTURE' | localize }}</h2>
1104
- </header>
1105
- <rp-category-library
1106
- [categories]="categories"
1107
- (categoryClick)="showLibraryCategory($event)"
1108
- >
1109
- </rp-category-library>
1110
- </ng-template>
1091
+ <ng-template #settingsSidebar>
1092
+ <header class="drawer__header">
1093
+ <h2 class="mat-title">{{ 'SETTINGS' | localize }}</h2>
1094
+ </header>
1095
+ <rp-settings
1096
+ [placeCameraDisabled]="viewModeService.is2dViewActive() || itemService.getWalkthroughCamera()"
1097
+ [minWallHeight]="getMinGlobalWallHeight()"
1098
+ (onWallsHeightUpdate)="wallsHeightUpdated($event)"
1099
+ >
1100
+ </rp-settings>
1101
+ </ng-template>
1111
1102
 
1112
- <ng-template #accessoiresCategoriesSidebar>
1113
- <header class="drawer__header">
1114
- <h2 class="mat-title">{{ 'ACCESSOIRES' | localize }}</h2>
1115
- </header>
1116
- <rp-category-library
1117
- [categories]="accessoireCategories"
1118
- (categoryClick)="showLibraryCategory($event)"
1119
- >
1120
- </rp-category-library>
1121
- </ng-template>
1103
+ <ng-template #categoriesSidebar>
1104
+ <header class="drawer__header">
1105
+ <h2 class="mat-title">{{ 'ARCHITECTURE' | localize }}</h2>
1106
+ </header>
1107
+ <rp-category-library
1108
+ [categories]="categories"
1109
+ (categoryClick)="showLibraryCategory($event)"
1110
+ >
1111
+ </rp-category-library>
1112
+ </ng-template>
1122
1113
 
1123
- <ng-template #customShapeCreatorSideBar>
1124
- <header class="drawer__header">
1125
- <h2 class="mat-title">{{ 'CUSTOM_SHAPE_CREATOR' | localize }}</h2>
1126
- </header>
1127
- <rp-custom-shape-creator [shape]="selectedObject"></rp-custom-shape-creator>
1128
- </ng-template>
1114
+ <ng-template #accessoiresCategoriesSidebar>
1115
+ <header class="drawer__header">
1116
+ <h2 class="mat-title">{{ 'ACCESSOIRES' | localize }}</h2>
1117
+ </header>
1118
+ <rp-category-library
1119
+ [categories]="accessoireCategories"
1120
+ (categoryClick)="showLibraryCategory($event)"
1121
+ >
1122
+ </rp-category-library>
1123
+ </ng-template>
1129
1124
 
1130
- <ng-template #customCylinderCreatorSideBar>
1131
- <header class="drawer__header">
1132
- <h2 class="mat-title">{{ 'CUSTOM_SHAPE_CREATOR' | localize }}</h2>
1133
- </header>
1134
- <custom-cylinder-creator [shape]="selectedObject"></custom-cylinder-creator>
1135
- </ng-template>
1125
+ <ng-template #customShapeCreatorSideBar>
1126
+ <header class="drawer__header">
1127
+ <h2 class="mat-title">{{ 'CUSTOM_SHAPE_CREATOR' | localize }}</h2>
1128
+ </header>
1129
+ <rp-custom-shape-creator [shape]="selectedObject"></rp-custom-shape-creator>
1130
+ </ng-template>
1136
1131
 
1137
- <ng-template #librarySidebar>
1138
- <div fxLayout="column" class="with-scrollable-section">
1139
- <header class="drawer__header">
1140
- <button mat-icon-button (click)="showActiveCategorySidebar()">
1141
- <mat-icon class="homedecorator-material-icons">arrow_back_ios</mat-icon>
1142
- </button>
1143
- <h2 class="mat-title">{{ selectedCategory.name | localize }}</h2>
1144
- </header>
1145
- <p class="mat-body" *ngIf="selectedCategory.description">{{ selectedCategory.description | localize }}</p>
1146
- <section fxFlex="grow" *ngIf="libraryObjects?.length > 0 || hasCustomObjects()">
1147
- <ng-container *ngIf="hasCustomObjects()">
1148
- <h3 class="mat-subheading-2">{{ 'CUSTOM' | localize }}</h3>
1149
- <rp-object-library
1150
- [objects]="customObjects"
1151
- (setDragged)="setDragged($event)"
1152
- (releaseDragged)="releaseDragged()"
1153
- (onObjectClick)="onObjectLibraryClick($event)"
1154
- >
1155
- </rp-object-library>
1156
- <mat-divider></mat-divider>
1157
- </ng-container>
1158
- <ng-container *ngIf="libraryObjects?.length > 0">
1159
- <h3 class="mat-subheading-2">{{ 'LIBRARY' | localize }}</h3>
1160
- <rp-object-library
1161
- [objects]="libraryObjects"
1162
- (setDragged)="setDragged($event)"
1163
- (releaseDragged)="releaseDragged()"
1164
- (onObjectClick)="onObjectLibraryClick($event)"
1165
- >
1166
- </rp-object-library>
1167
- </ng-container>
1168
- </section>
1169
- </div>
1170
- </ng-template>
1132
+ <ng-template #customCylinderCreatorSideBar>
1133
+ <header class="drawer__header">
1134
+ <h2 class="mat-title">{{ 'CUSTOM_SHAPE_CREATOR' | localize }}</h2>
1135
+ </header>
1136
+ <custom-cylinder-creator [shape]="selectedObject"></custom-cylinder-creator>
1137
+ </ng-template>
1171
1138
 
1172
- <ng-template #selectedObjectSidebar>
1173
- <header class="drawer__header">
1174
- <h2 class="mat-title">{{ 'OBJECT' | localize }}</h2>
1175
- </header>
1176
- <rp-selected-object
1177
- [object]="selectedObject"
1178
- (onSelectedObjectChange)="updateSelectedObjectHud()"
1179
- >
1180
- </rp-selected-object>
1181
- </ng-template>
1139
+ <ng-template #librarySidebar>
1140
+ <div fxLayout="column" class="with-scrollable-section">
1141
+ <header class="drawer__header">
1142
+ <button mat-icon-button (click)="showActiveCategorySidebar()">
1143
+ <mat-icon class="homedecorator-material-icons">arrow_back_ios</mat-icon>
1144
+ </button>
1145
+ <h2 class="mat-title">{{ selectedCategory.name | localize }}</h2>
1146
+ </header>
1147
+ <p class="mat-body" *ngIf="selectedCategory.description">{{ selectedCategory.description | localize }}</p>
1148
+ <section fxFlex="grow" *ngIf="libraryObjects?.length > 0 || hasCustomObjects()">
1149
+ <ng-container *ngIf="hasCustomObjects()">
1150
+ <h3 class="mat-subheading-2">{{ 'CUSTOM' | localize }}</h3>
1151
+ <rp-object-library
1152
+ [objects]="customObjects"
1153
+ (setDragged)="setDragged($event)"
1154
+ (releaseDragged)="releaseDragged()"
1155
+ (onObjectClick)="onObjectLibraryClick($event)"
1156
+ >
1157
+ </rp-object-library>
1158
+ <mat-divider></mat-divider>
1159
+ </ng-container>
1160
+ <ng-container *ngIf="libraryObjects?.length > 0">
1161
+ <h3 class="mat-subheading-2">{{ 'LIBRARY' | localize }}</h3>
1162
+ <rp-object-library
1163
+ [objects]="libraryObjects"
1164
+ (setDragged)="setDragged($event)"
1165
+ (releaseDragged)="releaseDragged()"
1166
+ (onObjectClick)="onObjectLibraryClick($event)"
1167
+ >
1168
+ </rp-object-library>
1169
+ </ng-container>
1170
+ </section>
1171
+ </div>
1172
+ </ng-template>
1182
1173
 
1183
- <ng-template #selectedWallSidebar>
1184
- <header class="drawer__header">
1185
- <h2 class="mat-title">{{ 'WALL'| localize }}</h2>
1186
- </header>
1187
- <rp-selected-wall
1188
- [wall]="selectedWall"
1189
- [texturePlane]="selectedEdges[0]"
1190
- [minWallHeight]="getMinWallHeight(selectedWall)"
1191
- [maxWallHeight]="maxWallHeight"
1192
- [maxWallThickness]="maxWallThickness"
1193
- [maxWallLength]="maxWallLength"
1194
- [minWallLength]="minWallLength"
1195
- (remove)="removeWall($event)"
1196
- (setLength)="setWallLength($event)"
1197
- (setHeight)="setWallHeight($event)"
1198
- (setThickness)="setWallThickness($event)"
1199
- (selectCorner)="selectCorner($event)"
1200
- (setTexture)="setWallTexture($event)"
1201
- (setColor)="setWallColor($event)"
1202
- >
1203
- </rp-selected-wall>
1204
- </ng-template>
1174
+ <ng-template #selectedObjectSidebar>
1175
+ <header class="drawer__header">
1176
+ <h2 class="mat-title">{{ 'OBJECT' | localize }}</h2>
1177
+ </header>
1178
+ <rp-selected-object
1179
+ [object]="selectedObject"
1180
+ (onSelectedObjectChange)="updateSelectedObjectHud()"
1181
+ >
1182
+ </rp-selected-object>
1183
+ </ng-template>
1205
1184
 
1206
- <ng-template #selectedThreedObjectSidebar>
1207
- <header class="drawer__header">
1208
- <h2 class="mat-title" [textContent]="'SETTINGS' | localize"></h2>
1209
- </header>
1210
- <rp-selected-threed-object
1211
- [object]="selectedObject"
1212
- [showCopy]="showCopyButton"
1213
- [showDelete]="showDeleteButton"
1214
- [showLock]="showLockButton"
1215
- (onSelectedObjectChange)="updateSelectedObjectHud()"
1216
- >
1217
- </rp-selected-threed-object>
1218
- </ng-template>
1185
+ <ng-template #selectedWallSidebar>
1186
+ <header class="drawer__header">
1187
+ <h2 class="mat-title">{{ 'WALL'| localize }}</h2>
1188
+ </header>
1189
+ <rp-selected-wall
1190
+ [wall]="selectedWall"
1191
+ [texturePlane]="selectedEdges[0]"
1192
+ [minWallHeight]="getMinWallHeight(selectedWall)"
1193
+ [maxWallHeight]="maxWallHeight"
1194
+ [maxWallThickness]="maxWallThickness"
1195
+ [maxWallLength]="maxWallLength"
1196
+ [minWallLength]="minWallLength"
1197
+ (remove)="removeWall($event)"
1198
+ (setLength)="setWallLength($event)"
1199
+ (setHeight)="setWallHeight($event)"
1200
+ (setThickness)="setWallThickness($event)"
1201
+ (selectCorner)="selectCorner($event)"
1202
+ (setTexture)="setWallTexture($event)"
1203
+ (setColor)="setWallColor($event)"
1204
+ >
1205
+ </rp-selected-wall>
1206
+ </ng-template>
1219
1207
 
1220
- <ng-template #selectedFloorSidebar>
1221
- <h2 class="mat-title">{{ 'FLOOR' | localize }}</h2>
1222
- <rp-selected-floor
1223
- [floor]="selectedFloor"
1224
- [texturePlane]="selectedFloor"
1225
- (setTexture)="setFloorTexture($event)"
1226
- (setColor)="setFloorColor($event)"
1227
- (selectedFloorClosed)="selectedFloor = undefined"
1228
- >
1229
- </rp-selected-floor>
1230
- </ng-template>
1208
+ <ng-template #selectedThreedObjectSidebar>
1209
+ <header class="drawer__header">
1210
+ <h2 class="mat-title" [textContent]="'SETTINGS' | localize"></h2>
1211
+ </header>
1212
+ <rp-selected-threed-object
1213
+ [object]="selectedObject"
1214
+ [showCopy]="showCopyButton"
1215
+ [showDelete]="showDeleteButton"
1216
+ [showLock]="showLockButton"
1217
+ (onSelectedObjectChange)="updateSelectedObjectHud()"
1218
+ >
1219
+ </rp-selected-threed-object>
1220
+ </ng-template>
1231
1221
 
1222
+ <ng-template #selectedFloorSidebar>
1223
+ <h2 class="mat-title">{{ 'FLOOR' | localize }}</h2>
1224
+ <rp-selected-floor
1225
+ [floor]="selectedFloor"
1226
+ [texturePlane]="selectedFloor"
1227
+ (setTexture)="setFloorTexture($event)"
1228
+ (setColor)="setFloorColor($event)"
1229
+ (selectedFloorClosed)="selectedFloor = undefined"
1230
+ >
1231
+ </rp-selected-floor>
1232
+ </ng-template>
1232
1233
 
1234
+ <ng-container *ngIf="userIsGrouping">
1233
1235
  <div class="rp-item-context-menu-wrap mrp-save-grouping" *ngIf="userIsGrouping">
1234
- <div class="rp-item-context-menu-item" (click)="onGroupClick()">
1235
- <span class="icon"><mat-icon class="homedecorator-material-icons">check</mat-icon></span>
1236
- <span class="label">{{ 'GROUPING' | localize }}</span>
1237
- </div>
1238
- <div class="rp-item-context-menu-item" (click)="cancelGroupSelection()">
1239
- <span class="icon"><mat-icon class="homedecorator-material-icons">cancel</mat-icon></span>
1240
- <span class="label">{{ 'CANCEL' | localize }}</span>
1241
- </div>
1236
+ <div class="rp-item-context-menu-item" (click)="onGroupClick()">
1237
+ <span class="icon"><mat-icon class="homedecorator-material-icons">check</mat-icon></span>
1238
+ <span class="label">{{ 'GROUPING' | localize }}</span>
1239
+ </div>
1240
+ <div class="rp-item-context-menu-item" (click)="cancelGroupSelection()">
1241
+ <span class="icon"><mat-icon class="homedecorator-material-icons">cancel</mat-icon></span>
1242
+ <span class="label">{{ 'CANCEL' | localize }}</span>
1243
+ </div>
1242
1244
  </div>
1243
- `, isInline: true, styles: [".with-scrollable-section{overflow:hidden;height:100%}.with-scrollable-section section{overflow-y:auto}.RoomPlanner{width:inherit;height:inherit;pointer-events:none}.RoomPlanner>*{pointer-events:all}.sidebar-toggles .mat-raised-button{width:110px;text-align:left}.logo-menu{position:absolute;top:20px;left:20px;z-index:2}.logo-menu-2nd{position:absolute;top:140px;left:84px}.logo-menu-4th{position:absolute;top:180px;left:84px}.sidebar{position:absolute;left:0;top:0;height:100vh;max-width:30%;width:400px;background:#fff;padding:0 20px;box-shadow:0 0 20px #00000040}.flex-wrap{display:flex;flex-flow:column nowrap;height:100%}.solid-background>canvas{fill:#fff;background:white}.toolbar__divider{border-bottom:1px solid black;width:100%;margin:5px 0}.toolbar__divider.context-menu{border-color:gray}.on-top{z-index:3}.rp-item-context-menu-wrap{color:#fff;background:rgba(0,0,0,.6);border-radius:5px;box-sizing:border-box;padding:5px;position:relative}.rp-item-context-menu-wrap .rp-item-context-menu-item{cursor:pointer;flex-direction:row;display:flex;padding:5px;border-radius:5px}.rp-item-context-menu-wrap .rp-item-context-menu-item span,.rp-item-context-menu-wrap .rp-item-context-menu-item label{display:flex;flex-direction:column;line-height:20px;font-size:12px;font-weight:lighter;vertical-align:middle}.rp-item-context-menu-wrap .rp-item-context-menu-item .label{width:200px}.rp-item-context-menu-wrap .rp-item-context-menu-item .icon{width:20px;margin-right:10px}.rp-item-context-menu-wrap .rp-item-context-menu-item .icon svg,.rp-item-context-menu-wrap .rp-item-context-menu-item .icon co-icon,.rp-item-context-menu-wrap .rp-item-context-menu-item .icon .mat-icon{height:15px;width:15px;font-size:18px}.rp-item-context-menu-wrap .rp-item-context-menu-item:hover{background:rgba(220,220,220,.5)}.rp-item-context-menu-wrap .rp-item-context-menu-item-highlight{color:#da9803}.rp-item-context-menu-wrap .rp-item-context-menu-item-highlight svg{fill:#da9803}.rp-item-context-menu-wrap .conversion-button-selected .icon-selected{color:#009a6d}.rp-item-context-menu-wrap .rp-item-context-menu-header{border-bottom:1px solid #808080;margin-bottom:10px;padding-left:5px;padding-right:25px;max-width:200px;overflow:hidden}.rp-item-context-menu-wrap .rp-item-context-menu-header p{color:#dda73f;font-size:13px}.rp-item-context-menu-wrap .rp-item-context-menu-close{position:absolute;right:15px;top:15px;z-index:2;cursor:pointer;width:10px;height:10px}.rp-item-context-menu-wrap .rp-item-context-menu-close .close-icon .mat-icon{height:15px;width:15px;font-size:18px}.mrp-save-grouping{position:absolute;bottom:10%;left:50%}\n"], components: [{ type: i26.FloorplannerComponent, selector: "floor-planner", outputs: ["selectedWallChange"] }, { type: i27.ContextMenuComponent, selector: "rp-context-menu", inputs: ["openMouseEvent"] }, { type: i28.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i29.ItemContextMenuComponent, selector: "rp-item-context-menu", inputs: ["item"], outputs: ["deletePressed"] }, { type: i30.ɵb, selector: "co-icon", inputs: ["icon", "iconData"] }, { type: i31.ButtonElevationComponent, selector: "button-elevation", inputs: ["item"] }, { type: i32.ToolbarIconComponent, selector: "rp-toolbar-icon", inputs: ["matIcon", "svgIcon", "tooltip", "disabled", "showLabel"], outputs: ["onClick"] }, { type: i33.ZoomControlsComponent, selector: "rp-zoom-controls", inputs: ["visible"], outputs: ["onZoomIn", "onZoomReset", "onZoomOut"] }, { type: i34.SettingsComponent, selector: "rp-settings", inputs: ["minWallHeight", "placeCameraDisabled"], outputs: ["onWallsHeightUpdate"] }, { type: i35.CategoryLibraryComponent, selector: "rp-category-library", inputs: ["categories"], outputs: ["categoryClick"] }, { type: i36.CustomShapeCreatorComponent, selector: "rp-custom-shape-creator", inputs: ["shape"] }, { type: i37.CustomCylinderCreatorComponent, selector: "custom-cylinder-creator", inputs: ["shape"] }, { type: i38.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i39.ObjectLibraryComponent, selector: "rp-object-library", inputs: ["objects"], outputs: ["setDragged", "releaseDragged", "onObjectClick"] }, { type: i40.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: i41.SelectedObjectComponent, selector: "rp-selected-object", inputs: ["object"], outputs: ["onSelectedObjectChange"] }, { type: i42.SelectedWallComponent, selector: "rp-selected-wall", inputs: ["wall", "texturePlane", "color", "minWallHeight", "maxWallHeight", "maxWallThickness", "maxWallLength", "minWallLength"], outputs: ["remove", "setLength", "setHeight", "setThickness", "selectCorner", "setTexture", "setColor"] }, { type: i43.SelectedThreedObjectComponent, selector: "rp-selected-threed-object", inputs: ["object", "showCopy", "showDelete", "showLock"], outputs: ["onSelectedObjectChange"] }, { type: i44.SelectedFloorComponent, selector: "rp-selected-floor", inputs: ["floor", "texturePlane", "color"], outputs: ["setTexture", "setColor"] }], directives: [{ type: i45.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i45.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i45.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i46.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i47.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i47.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }], pipes: { "localize": i48.LocalizePipe } });
1245
+ </ng-container>
1246
+
1247
+ `, isInline: true, styles: [".with-scrollable-section{overflow:hidden;height:100%}.with-scrollable-section section{overflow-y:auto}.RoomPlanner{width:inherit;height:inherit;pointer-events:none}.RoomPlanner>*{pointer-events:all}.sidebar-toggles .mat-raised-button{width:110px;text-align:left}.logo-menu{position:absolute;top:20px;left:20px;z-index:2}.logo-menu-2nd{position:absolute;top:140px;left:84px}.logo-menu-4th{position:absolute;top:180px;left:84px}.sidebar{position:absolute;left:0;top:0;height:100vh;max-width:30%;width:400px;background:#fff;padding:0 20px;box-shadow:0 0 20px #00000040}.flex-wrap{display:flex;flex-flow:column nowrap;height:100%}.solid-background>canvas{fill:#fff;background:white}.toolbar__divider{border-bottom:1px solid black;width:100%;margin:5px 0}.toolbar__divider.context-menu{border-color:gray}.on-top{z-index:3}.rp-item-context-menu-wrap{color:#fff;background:rgba(0,0,0,.6);border-radius:5px;box-sizing:border-box;padding:5px;position:relative}.rp-item-context-menu-wrap .rp-item-context-menu-item{cursor:pointer;flex-direction:row;display:flex;padding:5px;border-radius:5px}.rp-item-context-menu-wrap .rp-item-context-menu-item span,.rp-item-context-menu-wrap .rp-item-context-menu-item label{display:flex;flex-direction:column;line-height:20px;font-size:12px;font-weight:lighter;vertical-align:middle}.rp-item-context-menu-wrap .rp-item-context-menu-item .label{width:200px}.rp-item-context-menu-wrap .rp-item-context-menu-item .icon{width:20px;margin-right:10px}.rp-item-context-menu-wrap .rp-item-context-menu-item .icon svg,.rp-item-context-menu-wrap .rp-item-context-menu-item .icon co-icon,.rp-item-context-menu-wrap .rp-item-context-menu-item .icon .mat-icon{height:15px;width:15px;font-size:18px}.rp-item-context-menu-wrap .rp-item-context-menu-item:hover{background:rgba(220,220,220,.5)}.rp-item-context-menu-wrap .rp-item-context-menu-item-highlight{color:#da9803}.rp-item-context-menu-wrap .rp-item-context-menu-item-highlight svg{fill:#da9803}.rp-item-context-menu-wrap .conversion-button-selected .icon-selected{color:#009a6d}.rp-item-context-menu-wrap .rp-item-context-menu-header{border-bottom:1px solid #808080;margin-bottom:10px;padding-left:5px;padding-right:25px;max-width:200px;overflow:hidden}.rp-item-context-menu-wrap .rp-item-context-menu-header p{color:#dda73f;font-size:13px}.rp-item-context-menu-wrap .rp-item-context-menu-close{position:absolute;right:15px;top:15px;z-index:2;cursor:pointer;width:10px;height:10px}.rp-item-context-menu-wrap .rp-item-context-menu-close .close-icon .mat-icon{height:15px;width:15px;font-size:18px}.mrp-save-grouping{pointer-events:all;position:absolute;bottom:10%;left:50%}\n"], components: [{ type: i26.FloorplannerComponent, selector: "floor-planner", outputs: ["selectedWallChange"] }, { type: i27.ContextMenuComponent, selector: "rp-context-menu", inputs: ["openMouseEvent"] }, { type: i28.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i29.ItemContextMenuComponent, selector: "rp-item-context-menu", inputs: ["item"], outputs: ["deletePressed"] }, { type: i30.ɵb, selector: "co-icon", inputs: ["icon", "iconData"] }, { type: i31.ButtonElevationComponent, selector: "button-elevation", inputs: ["item"] }, { type: i32.ToolbarIconComponent, selector: "rp-toolbar-icon", inputs: ["matIcon", "svgIcon", "tooltip", "disabled", "showLabel"], outputs: ["onClick"] }, { type: i33.ZoomControlsComponent, selector: "rp-zoom-controls", inputs: ["visible"], outputs: ["onZoomIn", "onZoomReset", "onZoomOut"] }, { type: i34.SettingsComponent, selector: "rp-settings", inputs: ["minWallHeight", "placeCameraDisabled"], outputs: ["onWallsHeightUpdate"] }, { type: i35.CategoryLibraryComponent, selector: "rp-category-library", inputs: ["categories"], outputs: ["categoryClick"] }, { type: i36.CustomShapeCreatorComponent, selector: "rp-custom-shape-creator", inputs: ["shape"] }, { type: i37.CustomCylinderCreatorComponent, selector: "custom-cylinder-creator", inputs: ["shape"] }, { type: i38.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i39.ObjectLibraryComponent, selector: "rp-object-library", inputs: ["objects"], outputs: ["setDragged", "releaseDragged", "onObjectClick"] }, { type: i40.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { type: i41.SelectedObjectComponent, selector: "rp-selected-object", inputs: ["object"], outputs: ["onSelectedObjectChange"] }, { type: i42.SelectedWallComponent, selector: "rp-selected-wall", inputs: ["wall", "texturePlane", "color", "minWallHeight", "maxWallHeight", "maxWallThickness", "maxWallLength", "minWallLength"], outputs: ["remove", "setLength", "setHeight", "setThickness", "selectCorner", "setTexture", "setColor"] }, { type: i43.SelectedThreedObjectComponent, selector: "rp-selected-threed-object", inputs: ["object", "showCopy", "showDelete", "showLock"], outputs: ["onSelectedObjectChange"] }, { type: i44.SelectedFloorComponent, selector: "rp-selected-floor", inputs: ["floor", "texturePlane", "color"], outputs: ["setTexture", "setColor"] }], directives: [{ type: i45.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i45.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i45.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i46.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { type: i47.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i47.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }], pipes: { "localize": i48.LocalizePipe } });
1244
1248
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: RoomPlannerComponent, decorators: [{
1245
1249
  type: Component,
1246
1250
  args: [{
1247
1251
  selector: 'rp-room-planner',
1248
1252
  template: `
1249
- <div class="RoomPlanner">
1250
- <floor-planner
1251
- [class.hidden]="!viewModeService.is2dViewActive()"
1252
- (selectedWallChange)="selectWall($event)"></floor-planner>
1253
+ <div class="RoomPlanner">
1254
+ <floor-planner
1255
+ [class.hidden]="!viewModeService.is2dViewActive()"
1256
+ (selectedWallChange)="selectWall($event)"></floor-planner>
1257
+ </div>
1258
+
1259
+ <rp-context-menu
1260
+ *ngIf="!viewModeService.is2dViewActive() && showContextMenu && selectedWall"
1261
+ [openMouseEvent]="contextMenuMouseEvent">
1262
+ <div class="rp-item-context-menu-wrap ">
1263
+ <div (click)="showSelectedWallSidebar()" class="rp-item-context-menu-item">
1264
+ <span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
1265
+ <span class="label">{{ 'CONFIGURE' | localize }}</span>
1266
+ </div>
1253
1267
  </div>
1268
+ </rp-context-menu>
1254
1269
 
1255
- <rp-context-menu
1256
- *ngIf="!viewModeService.is2dViewActive() && showContextMenu && selectedWall"
1257
- [openMouseEvent]="contextMenuMouseEvent">
1258
- <div class="rp-item-context-menu-wrap ">
1259
- <div (click)="showSelectedWallSidebar()" class="rp-item-context-menu-item">
1260
- <span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
1261
- <span class="label">{{ 'CONFIGURE' | localize }}</span>
1262
- </div>
1263
- </div>
1264
- </rp-context-menu>
1270
+ <rp-context-menu
1271
+ *ngIf="!viewModeService.is2dViewActive() && showContextMenu && selectedFloor"
1272
+ [openMouseEvent]="contextMenuMouseEvent">
1273
+ <div class="rp-item-context-menu-wrap">
1274
+ <div (click)="showSelectedFloorSidebar()" class="rp-item-context-menu-item ">
1275
+ <span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
1276
+ <span class="label">{{ 'CONFIGURE' | localize }}</span>
1277
+ </div>
1278
+ </div>
1279
+ </rp-context-menu>
1265
1280
 
1266
- <rp-context-menu
1267
- *ngIf="!viewModeService.is2dViewActive() && showContextMenu && selectedFloor"
1268
- [openMouseEvent]="contextMenuMouseEvent">
1269
- <div class="rp-item-context-menu-wrap">
1270
- <div (click)="showSelectedFloorSidebar()" class="rp-item-context-menu-item ">
1271
- <span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
1272
- <span class="label">{{ 'CONFIGURE' | localize }}</span>
1273
- </div>
1281
+ <rp-item-context-menu
1282
+ *ngIf="!viewModeService.is2dViewActive() && showContextMenu && !showGroupMenu"
1283
+ [item]="selectedObject"
1284
+ (deletePressed)="handleDeleteObject()">
1285
+ <div class="rp-item-context-menu-wrap">
1286
+ <div class="rp-item-context-menu-close" (click)="closeContextMenu()">
1287
+ <span class="close-icon"><mat-icon class="homedecorator-material-icons">close</mat-icon></span>
1288
+ </div>
1289
+ <div *ngIf="this.selectedObject" class="rp-item-context-menu-header">
1290
+ <p>{{ this.selectedObject.name }}</p>
1291
+ </div>
1292
+ <div *ngIf="showSettingsButton" (click)="showSelectedObjectSidebar()"
1293
+ class="rp-item-context-menu-item ">
1294
+ <span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
1295
+ <span class="label">{{ 'CONFIGURE' | localize }}</span>
1296
+ </div>
1297
+ <ng-container *ngIf="showConfigurationButton">
1298
+ <div *ngFor="let customButton of modelsService.customButtons" (click)="handleConfigurationButtonClick(customButton)"
1299
+ class="rp-item-context-menu-item ">
1300
+ <span class="icon"><co-icon [iconData]="iconService.getIcon(icon.MagicWand)"></co-icon></span>
1301
+ <span class="label">{{ 'CONFIGURE' | localize }}</span>
1274
1302
  </div>
1275
- </rp-context-menu>
1276
-
1277
- <rp-item-context-menu
1278
- *ngIf="!viewModeService.is2dViewActive() && showContextMenu && !showGroupMenu"
1279
- [item]="selectedObject"
1280
- (deletePressed)="handleDeleteObject()">
1281
- <div class="rp-item-context-menu-wrap">
1282
- <div class="rp-item-context-menu-close" (click)="closeContextMenu()">
1283
- <span class="close-icon"><mat-icon class="homedecorator-material-icons">close</mat-icon></span>
1284
- </div>
1285
- <div *ngIf="this.selectedObject" class="rp-item-context-menu-header">
1286
- <p>{{ this.selectedObject.name }}</p>
1287
- </div>
1288
- <div *ngIf="showSettingsButton" (click)="showSelectedObjectSidebar()"
1289
- class="rp-item-context-menu-item ">
1290
- <span class="icon"><mat-icon class="homedecorator-material-icons" svgIcon="magic-wand"></mat-icon></span>
1291
- <span class="label">{{ 'CONFIGURE' | localize }}</span>
1292
- </div>
1293
- <ng-container *ngIf="showConfigurationButton">
1294
- <div *ngFor="let customButton of modelsService.customButtons" (click)="handleConfigurationButtonClick(customButton)"
1295
- class="rp-item-context-menu-item ">
1296
- <span class="icon"><co-icon [iconData]="iconService.getIcon(icon.MagicWand)"></co-icon></span>
1297
- <span class="label">{{ 'CONFIGURE' | localize }}</span>
1298
- </div>
1299
- </ng-container>
1300
- <div *ngIf="showCopyButton" (click)="copySelectedObject()" class="rp-item-context-menu-item">
1301
- <span class="icon"><mat-icon class="homedecorator-material-icons">file_copy</mat-icon></span>
1302
- <span class="label">{{ 'COPY' | localize }}</span>
1303
- </div>
1304
- <div *ngIf="showDeleteButton" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
1305
- <span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
1306
- <span class="label">{{ 'REMOVE' | localize }}</span>
1307
- </div>
1308
- <div *ngIf="showConfigurationButton" (click)="showSelectedThreedObjectSidebar()"
1309
- class="rp-item-context-menu-item">
1310
- <span class="icon"><mat-icon class="homedecorator-material-icons">settings</mat-icon></span>
1311
- <span class="label">{{ 'SETTINGS' | localize }}</span>
1312
- </div>
1313
- <div *ngIf="showLockButton && selectedObject" (click)="toggleLockSelectedObject()"
1314
- class="rp-item-context-menu-item">
1315
- <span class="icon"><mat-icon class="homedecorator-material-icons" [textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
1316
- <span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
1317
- </div>
1318
- <div *ngIf="!showGroupEditMenuButtons" (click)="startGroupSelection()" class="rp-item-context-menu-item">
1319
- <span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
1320
- <span class="label">{{ 'GROUP' | localize }}</span>
1321
- </div>
1303
+ </ng-container>
1304
+ <div *ngIf="showCopyButton" (click)="copySelectedObject()" class="rp-item-context-menu-item">
1305
+ <span class="icon"><mat-icon class="homedecorator-material-icons">file_copy</mat-icon></span>
1306
+ <span class="label">{{ 'COPY' | localize }}</span>
1307
+ </div>
1308
+ <div *ngIf="showDeleteButton" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
1309
+ <span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
1310
+ <span class="label">{{ 'REMOVE' | localize }}</span>
1311
+ </div>
1312
+ <div *ngIf="showConfigurationButton" (click)="showSelectedThreedObjectSidebar()"
1313
+ class="rp-item-context-menu-item">
1314
+ <span class="icon"><mat-icon class="homedecorator-material-icons">settings</mat-icon></span>
1315
+ <span class="label">{{ 'SETTINGS' | localize }}</span>
1316
+ </div>
1317
+ <div *ngIf="showLockButton && selectedObject" (click)="toggleLockSelectedObject()"
1318
+ class="rp-item-context-menu-item">
1319
+ <span class="icon"><mat-icon class="homedecorator-material-icons"
1320
+ [textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
1321
+ <span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
1322
+ </div>
1323
+ <div *ngIf="!showGroupEditMenuButtons" (click)="startGroupSelection()" class="rp-item-context-menu-item">
1324
+ <span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
1325
+ <span class="label">{{ 'GROUP' | localize }}</span>
1326
+ </div>
1322
1327
 
1323
- <div *ngIf="showConversionButton && settingsService.settings.showConversionButtons"
1324
- (click)="sendConversionToTagManager()"
1325
- class="rp-item-context-menu-item"
1326
- [ngClass]="addSelectedClass ? 'conversion-button-selected' : ''">
1327
- <span class="icon"><mat-icon class="homedecorator-material-icons">add_shopping_cart</mat-icon></span>
1328
- <span class="label">{{ 'CONVERSION' | localize }}</span>
1329
- <span class="icon icon-selected"><mat-icon class="homedecorator-material-icons">check_circle</mat-icon></span>
1330
- </div>
1328
+ <div *ngIf="showConversionButton && settingsService.settings.showConversionButtons"
1329
+ (click)="sendConversionToTagManager()"
1330
+ class="rp-item-context-menu-item"
1331
+ [ngClass]="addSelectedClass ? 'conversion-button-selected' : ''">
1332
+ <span class="icon"><mat-icon class="homedecorator-material-icons">add_shopping_cart</mat-icon></span>
1333
+ <span class="label">{{ 'CONVERSION' | localize }}</span>
1334
+ <span class="icon icon-selected"><mat-icon class="homedecorator-material-icons">check_circle</mat-icon></span>
1335
+ </div>
1331
1336
 
1332
1337
 
1333
- <div *ngIf="showARButton" (click)="startARSession()" class="rp-item-context-menu-item">
1334
- <span class="icon"><mat-icon class="homedecorator-material-icons">weekend</mat-icon></span>
1335
- <span class="label">{{ 'AR' | localize }}</span>
1336
- </div>
1337
- <button-elevation
1338
- *ngIf="selectedObject && selectedObject.elevationAdjustable"
1339
- [item]="selectedObject">
1340
- </button-elevation>
1341
- <ng-container *ngIf="salableObject">
1342
- <div class="toolbar__divider context-menu"></div>
1343
- <div (click)="addToCart(selectedObject)" class="rp-item-context-menu-item add-to-cart-button">
1344
- <span class="icon"><mat-icon class="homedecorator-material-icons" [svgIcon]="'cart-shopping-regular'"></mat-icon></span>
1345
- <span class="label">{{ 'ADD_TO_CART' | localize }}</span>
1346
- </div>
1347
- </ng-container>
1338
+ <div *ngIf="showARButton" (click)="startARSession()" class="rp-item-context-menu-item">
1339
+ <span class="icon"><mat-icon class="homedecorator-material-icons">weekend</mat-icon></span>
1340
+ <span class="label">{{ 'AR' | localize }}</span>
1341
+ </div>
1342
+ <button-elevation
1343
+ *ngIf="selectedObject && selectedObject.elevationAdjustable"
1344
+ [item]="selectedObject">
1345
+ </button-elevation>
1346
+ <ng-container *ngIf="salableObject">
1347
+ <div class="toolbar__divider context-menu"></div>
1348
+ <div (click)="addToCart(selectedObject)" class="rp-item-context-menu-item add-to-cart-button">
1349
+ <span class="icon"><mat-icon class="homedecorator-material-icons" [svgIcon]="'cart-shopping-regular'"></mat-icon></span>
1350
+ <span class="label">{{ 'ADD_TO_CART' | localize }}</span>
1348
1351
  </div>
1349
- </rp-item-context-menu>
1350
-
1351
- <rp-item-context-menu *ngIf="!viewModeService.is2dViewActive() && showContextMenu && showGroupMenu && !userIsGrouping"
1352
- [item]="selectedObject"
1353
- (deletePressed)="handleDeleteObject()">
1354
- <div class="rp-item-context-menu-wrap">
1355
- <div *ngIf="!showGroupEditMenuButtons" (click)="onGroupClick()" class="rp-item-context-menu-item">
1356
- <span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
1357
- <span class="label">{{ 'GROUP' | localize }}</span>
1358
- </div>
1359
- <div *ngIf="showGroupEditMenuButtons" (click)="onUnGroupClick()" class="rp-item-context-menu-item">
1360
- <span class="icon"><mat-icon class="homedecorator-material-icons">link_off</mat-icon></span>
1361
- <span class="label">{{ 'UNGROUP' | localize }}</span>
1362
- </div>
1363
- <div *ngIf="showGroupEditMenuButtons" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
1364
- <span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
1365
- <span class="label">{{ 'REMOVE' | localize }}</span>
1366
- </div>
1367
- <div *ngIf="showLockButton && selectedObject && showGroupEditMenuButtons" (click)="toggleLockSelectedObject()"
1368
- class="rp-item-context-menu-item">
1369
- <span class="icon"><mat-icon class="homedecorator-material-icons" [textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
1370
- <span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
1371
- </div>
1372
- </div>
1373
- </rp-item-context-menu>
1352
+ </ng-container>
1353
+ </div>
1354
+ </rp-item-context-menu>
1374
1355
 
1375
- <ng-template #toolbarIconLibrary>
1376
- <rp-toolbar-icon
1377
- *ngIf="!phoneSizeScreen"
1378
- [disabled]="viewModeService.is2dViewActive() || viewModeService.isWalkThroughViewActive()"
1379
- matIcon="home"
1380
- tooltip="{{iconName.Architecture | localize}}"
1381
- (onClick)="showLibraryCategories()"
1382
- [showLabel]="phoneSizeScreen"
1383
- ></rp-toolbar-icon>
1384
- </ng-template>
1356
+ <rp-item-context-menu *ngIf="!viewModeService.is2dViewActive() && showContextMenu && showGroupMenu && !userIsGrouping"
1357
+ [item]="selectedObject"
1358
+ (deletePressed)="handleDeleteObject()">
1359
+ <div class="rp-item-context-menu-wrap">
1360
+ <div *ngIf="!showGroupEditMenuButtons" (click)="onGroupClick()" class="rp-item-context-menu-item">
1361
+ <span class="icon"><mat-icon class="homedecorator-material-icons">link</mat-icon></span>
1362
+ <span class="label">{{ 'GROUP' | localize }}</span>
1363
+ </div>
1364
+ <div *ngIf="showGroupEditMenuButtons" (click)="onUnGroupClick()" class="rp-item-context-menu-item">
1365
+ <span class="icon"><mat-icon class="homedecorator-material-icons">link_off</mat-icon></span>
1366
+ <span class="label">{{ 'UNGROUP' | localize }}</span>
1367
+ </div>
1368
+ <div *ngIf="showGroupEditMenuButtons" (click)="removeSelectedObject()" class="rp-item-context-menu-item">
1369
+ <span class="icon"><mat-icon class="homedecorator-material-icons">delete</mat-icon></span>
1370
+ <span class="label">{{ 'REMOVE' | localize }}</span>
1371
+ </div>
1372
+ <div *ngIf="showLockButton && selectedObject && showGroupEditMenuButtons" (click)="toggleLockSelectedObject()"
1373
+ class="rp-item-context-menu-item">
1374
+ <span class="icon"><mat-icon class="homedecorator-material-icons"
1375
+ [textContent]="selectedObject.locked ? 'lock' : 'lock_open'"></mat-icon></span>
1376
+ <span class="label">{{ (selectedObject.locked ? 'UNLOCK' : 'LOCK') | localize }}</span>
1377
+ </div>
1378
+ </div>
1379
+ </rp-item-context-menu>
1385
1380
 
1386
- <ng-template #toolbarIconAccessoires>
1387
- <rp-toolbar-icon
1388
- [disabled]="viewModeService.is2dViewActive() || viewModeService.isWalkThroughViewActive()"
1389
- matIcon="local_florist"
1390
- tooltip="{{iconName.Accessories | localize}}"
1391
- (onClick)="showAccessoireCategories()"
1392
- [showLabel]="phoneSizeScreen"
1393
- ></rp-toolbar-icon>
1394
- </ng-template>
1381
+ <ng-template #toolbarIconLibrary>
1382
+ <rp-toolbar-icon
1383
+ *ngIf="!phoneSizeScreen"
1384
+ [disabled]="viewModeService.is2dViewActive() || viewModeService.isWalkThroughViewActive()"
1385
+ matIcon="home"
1386
+ tooltip="{{iconName.Architecture | localize}}"
1387
+ (onClick)="showLibraryCategories()"
1388
+ [showLabel]="phoneSizeScreen"
1389
+ ></rp-toolbar-icon>
1390
+ </ng-template>
1395
1391
 
1396
- <ng-template #toolbarIcon2dView>
1397
- <span class="toolbar__divider"></span>
1398
- <rp-toolbar-icon
1399
- *ngIf="!phoneSizeScreen"
1400
- svgIcon="cube-unfolded"
1401
- tooltip="{{iconName.TwodFloorplan | localize}}"
1402
- [disabled]="viewModeService.is2dViewActive() || !desktopSizeScreen"
1403
- (onClick)="updateMode(viewModes.FloorPlan2D, true)"
1404
- [showLabel]="phoneSizeScreen"
1405
- ></rp-toolbar-icon>
1406
- </ng-template>
1392
+ <ng-template #toolbarIconAccessoires>
1393
+ <rp-toolbar-icon
1394
+ [disabled]="viewModeService.is2dViewActive() || viewModeService.isWalkThroughViewActive()"
1395
+ matIcon="local_florist"
1396
+ tooltip="{{iconName.Accessories | localize}}"
1397
+ (onClick)="showAccessoireCategories()"
1398
+ [showLabel]="phoneSizeScreen"
1399
+ ></rp-toolbar-icon>
1400
+ </ng-template>
1407
1401
 
1408
- <ng-template #toolbarIcon3dView>
1409
- <rp-toolbar-icon
1410
- svgIcon="cube-outline"
1411
- tooltip="{{iconName.ThreedRoomplan | localize}}"
1412
- [disabled]="viewModeService.is3dViewActive()"
1413
- (onClick)="updateMode(viewModes.RoomPlan3D, true)"
1414
- [showLabel]="phoneSizeScreen"
1415
- ></rp-toolbar-icon>
1416
- </ng-template>
1402
+ <ng-template #toolbarIcon2dView>
1403
+ <span class="toolbar__divider"></span>
1404
+ <rp-toolbar-icon
1405
+ *ngIf="!phoneSizeScreen"
1406
+ svgIcon="cube-unfolded"
1407
+ tooltip="{{iconName.TwodFloorplan | localize}}"
1408
+ [disabled]="viewModeService.is2dViewActive() || !desktopSizeScreen"
1409
+ (onClick)="updateMode(viewModes.FloorPlan2D, true)"
1410
+ [showLabel]="phoneSizeScreen"
1411
+ ></rp-toolbar-icon>
1412
+ </ng-template>
1417
1413
 
1418
- <rp-zoom-controls
1419
- [visible]="viewModeService.is2dViewActive()"
1420
- (onZoomIn)="zoomIn()"
1421
- (onZoomReset)="zoomReset()"
1422
- (onZoomOut)="zoomOut()"
1423
- ></rp-zoom-controls>
1414
+ <ng-template #toolbarIcon3dView>
1415
+ <rp-toolbar-icon
1416
+ svgIcon="cube-outline"
1417
+ tooltip="{{iconName.ThreedRoomplan | localize}}"
1418
+ [disabled]="viewModeService.is3dViewActive()"
1419
+ (onClick)="updateMode(viewModes.RoomPlan3D, true)"
1420
+ [showLabel]="phoneSizeScreen"
1421
+ ></rp-toolbar-icon>
1422
+ </ng-template>
1424
1423
 
1425
- <ng-template #toolbarIconSettings>
1426
- <span class="toolbar__divider"></span>
1427
- <rp-toolbar-icon
1428
- matIcon="settings"
1429
- tooltip="{{iconName.Settings | localize}}"
1430
- (onClick)="showSettings()"
1431
- [showLabel]="phoneSizeScreen"
1432
- ></rp-toolbar-icon>
1433
- </ng-template>
1424
+ <rp-zoom-controls
1425
+ [visible]="viewModeService.is2dViewActive()"
1426
+ (onZoomIn)="zoomIn()"
1427
+ (onZoomReset)="zoomReset()"
1428
+ (onZoomOut)="zoomOut()"
1429
+ ></rp-zoom-controls>
1434
1430
 
1435
- <ng-template #toolbarIconFaq>
1436
- <rp-toolbar-icon
1437
- *ngIf="showFaq()"
1438
- matIcon="help"
1439
- tooltip="{{iconName.Faq | localize}}"
1440
- (onClick)="openFaq(this.settingsService.settings.faqUrl)"
1441
- [showLabel]="phoneSizeScreen"
1442
- ></rp-toolbar-icon>
1443
- </ng-template>
1431
+ <ng-template #toolbarIconSettings>
1432
+ <span class="toolbar__divider"></span>
1433
+ <rp-toolbar-icon
1434
+ matIcon="settings"
1435
+ tooltip="{{iconName.Settings | localize}}"
1436
+ (onClick)="showSettings()"
1437
+ [showLabel]="phoneSizeScreen"
1438
+ ></rp-toolbar-icon>
1439
+ </ng-template>
1444
1440
 
1445
- <ng-template #toolbarIconFeedback>
1446
- <rp-toolbar-icon
1447
- *ngIf="showFeedback()"
1448
- matIcon="chat_bubble"
1449
- tooltip="{{iconName.Feedback | localize}}"
1450
- (onClick)="openFeedback(this.settingsService.settings.feedbackUrl)"
1451
- [showLabel]="phoneSizeScreen"
1452
- ></rp-toolbar-icon>
1453
- </ng-template>
1454
- <ng-template #toolbarIconCart>
1455
- <span class="toolbar__divider"></span>
1456
- <rp-toolbar-icon class="add-to-cart-button"
1457
- svgIcon="cart-shopping-regular"
1458
- tooltip="{{'ADD_TO_CART' | localize}}"
1459
- (onClick)="addAllToCart()"
1460
- [showLabel]="phoneSizeScreen"
1461
- ></rp-toolbar-icon>
1462
- <span class="toolbar__divider"></span>
1463
- </ng-template>
1441
+ <ng-template #toolbarIconFaq>
1442
+ <rp-toolbar-icon
1443
+ *ngIf="showFaq()"
1444
+ matIcon="help"
1445
+ tooltip="{{iconName.Faq | localize}}"
1446
+ (onClick)="openFaq(this.settingsService.settings.faqUrl)"
1447
+ [showLabel]="phoneSizeScreen"
1448
+ ></rp-toolbar-icon>
1449
+ </ng-template>
1464
1450
 
1465
- <ng-template #settingsSidebar>
1466
- <header class="drawer__header">
1467
- <h2 class="mat-title">{{ 'SETTINGS' | localize }}</h2>
1468
- </header>
1469
- <rp-settings
1470
- [placeCameraDisabled]="viewModeService.is2dViewActive() || itemService.getWalkthroughCamera()"
1471
- [minWallHeight]="getMinGlobalWallHeight()"
1472
- (onWallsHeightUpdate)="wallsHeightUpdated($event)"
1473
- >
1474
- </rp-settings>
1475
- </ng-template>
1451
+ <ng-template #toolbarIconFeedback>
1452
+ <rp-toolbar-icon
1453
+ *ngIf="showFeedback()"
1454
+ matIcon="chat_bubble"
1455
+ tooltip="{{iconName.Feedback | localize}}"
1456
+ (onClick)="openFeedback(this.settingsService.settings.feedbackUrl)"
1457
+ [showLabel]="phoneSizeScreen"
1458
+ ></rp-toolbar-icon>
1459
+ </ng-template>
1460
+ <ng-template #toolbarIconCart>
1461
+ <span class="toolbar__divider"></span>
1462
+ <rp-toolbar-icon class="add-to-cart-button"
1463
+ svgIcon="cart-shopping-regular"
1464
+ tooltip="{{'ADD_TO_CART' | localize}}"
1465
+ (onClick)="addAllToCart()"
1466
+ [showLabel]="phoneSizeScreen"
1467
+ ></rp-toolbar-icon>
1468
+ <span class="toolbar__divider"></span>
1469
+ </ng-template>
1476
1470
 
1477
- <ng-template #categoriesSidebar>
1478
- <header class="drawer__header">
1479
- <h2 class="mat-title">{{ 'ARCHITECTURE' | localize }}</h2>
1480
- </header>
1481
- <rp-category-library
1482
- [categories]="categories"
1483
- (categoryClick)="showLibraryCategory($event)"
1484
- >
1485
- </rp-category-library>
1486
- </ng-template>
1471
+ <ng-template #settingsSidebar>
1472
+ <header class="drawer__header">
1473
+ <h2 class="mat-title">{{ 'SETTINGS' | localize }}</h2>
1474
+ </header>
1475
+ <rp-settings
1476
+ [placeCameraDisabled]="viewModeService.is2dViewActive() || itemService.getWalkthroughCamera()"
1477
+ [minWallHeight]="getMinGlobalWallHeight()"
1478
+ (onWallsHeightUpdate)="wallsHeightUpdated($event)"
1479
+ >
1480
+ </rp-settings>
1481
+ </ng-template>
1487
1482
 
1488
- <ng-template #accessoiresCategoriesSidebar>
1489
- <header class="drawer__header">
1490
- <h2 class="mat-title">{{ 'ACCESSOIRES' | localize }}</h2>
1491
- </header>
1492
- <rp-category-library
1493
- [categories]="accessoireCategories"
1494
- (categoryClick)="showLibraryCategory($event)"
1495
- >
1496
- </rp-category-library>
1497
- </ng-template>
1483
+ <ng-template #categoriesSidebar>
1484
+ <header class="drawer__header">
1485
+ <h2 class="mat-title">{{ 'ARCHITECTURE' | localize }}</h2>
1486
+ </header>
1487
+ <rp-category-library
1488
+ [categories]="categories"
1489
+ (categoryClick)="showLibraryCategory($event)"
1490
+ >
1491
+ </rp-category-library>
1492
+ </ng-template>
1498
1493
 
1499
- <ng-template #customShapeCreatorSideBar>
1500
- <header class="drawer__header">
1501
- <h2 class="mat-title">{{ 'CUSTOM_SHAPE_CREATOR' | localize }}</h2>
1502
- </header>
1503
- <rp-custom-shape-creator [shape]="selectedObject"></rp-custom-shape-creator>
1504
- </ng-template>
1494
+ <ng-template #accessoiresCategoriesSidebar>
1495
+ <header class="drawer__header">
1496
+ <h2 class="mat-title">{{ 'ACCESSOIRES' | localize }}</h2>
1497
+ </header>
1498
+ <rp-category-library
1499
+ [categories]="accessoireCategories"
1500
+ (categoryClick)="showLibraryCategory($event)"
1501
+ >
1502
+ </rp-category-library>
1503
+ </ng-template>
1505
1504
 
1506
- <ng-template #customCylinderCreatorSideBar>
1507
- <header class="drawer__header">
1508
- <h2 class="mat-title">{{ 'CUSTOM_SHAPE_CREATOR' | localize }}</h2>
1509
- </header>
1510
- <custom-cylinder-creator [shape]="selectedObject"></custom-cylinder-creator>
1511
- </ng-template>
1505
+ <ng-template #customShapeCreatorSideBar>
1506
+ <header class="drawer__header">
1507
+ <h2 class="mat-title">{{ 'CUSTOM_SHAPE_CREATOR' | localize }}</h2>
1508
+ </header>
1509
+ <rp-custom-shape-creator [shape]="selectedObject"></rp-custom-shape-creator>
1510
+ </ng-template>
1512
1511
 
1513
- <ng-template #librarySidebar>
1514
- <div fxLayout="column" class="with-scrollable-section">
1515
- <header class="drawer__header">
1516
- <button mat-icon-button (click)="showActiveCategorySidebar()">
1517
- <mat-icon class="homedecorator-material-icons">arrow_back_ios</mat-icon>
1518
- </button>
1519
- <h2 class="mat-title">{{ selectedCategory.name | localize }}</h2>
1520
- </header>
1521
- <p class="mat-body" *ngIf="selectedCategory.description">{{ selectedCategory.description | localize }}</p>
1522
- <section fxFlex="grow" *ngIf="libraryObjects?.length > 0 || hasCustomObjects()">
1523
- <ng-container *ngIf="hasCustomObjects()">
1524
- <h3 class="mat-subheading-2">{{ 'CUSTOM' | localize }}</h3>
1525
- <rp-object-library
1526
- [objects]="customObjects"
1527
- (setDragged)="setDragged($event)"
1528
- (releaseDragged)="releaseDragged()"
1529
- (onObjectClick)="onObjectLibraryClick($event)"
1530
- >
1531
- </rp-object-library>
1532
- <mat-divider></mat-divider>
1533
- </ng-container>
1534
- <ng-container *ngIf="libraryObjects?.length > 0">
1535
- <h3 class="mat-subheading-2">{{ 'LIBRARY' | localize }}</h3>
1536
- <rp-object-library
1537
- [objects]="libraryObjects"
1538
- (setDragged)="setDragged($event)"
1539
- (releaseDragged)="releaseDragged()"
1540
- (onObjectClick)="onObjectLibraryClick($event)"
1541
- >
1542
- </rp-object-library>
1543
- </ng-container>
1544
- </section>
1545
- </div>
1546
- </ng-template>
1512
+ <ng-template #customCylinderCreatorSideBar>
1513
+ <header class="drawer__header">
1514
+ <h2 class="mat-title">{{ 'CUSTOM_SHAPE_CREATOR' | localize }}</h2>
1515
+ </header>
1516
+ <custom-cylinder-creator [shape]="selectedObject"></custom-cylinder-creator>
1517
+ </ng-template>
1547
1518
 
1548
- <ng-template #selectedObjectSidebar>
1549
- <header class="drawer__header">
1550
- <h2 class="mat-title">{{ 'OBJECT' | localize }}</h2>
1551
- </header>
1552
- <rp-selected-object
1553
- [object]="selectedObject"
1554
- (onSelectedObjectChange)="updateSelectedObjectHud()"
1555
- >
1556
- </rp-selected-object>
1557
- </ng-template>
1519
+ <ng-template #librarySidebar>
1520
+ <div fxLayout="column" class="with-scrollable-section">
1521
+ <header class="drawer__header">
1522
+ <button mat-icon-button (click)="showActiveCategorySidebar()">
1523
+ <mat-icon class="homedecorator-material-icons">arrow_back_ios</mat-icon>
1524
+ </button>
1525
+ <h2 class="mat-title">{{ selectedCategory.name | localize }}</h2>
1526
+ </header>
1527
+ <p class="mat-body" *ngIf="selectedCategory.description">{{ selectedCategory.description | localize }}</p>
1528
+ <section fxFlex="grow" *ngIf="libraryObjects?.length > 0 || hasCustomObjects()">
1529
+ <ng-container *ngIf="hasCustomObjects()">
1530
+ <h3 class="mat-subheading-2">{{ 'CUSTOM' | localize }}</h3>
1531
+ <rp-object-library
1532
+ [objects]="customObjects"
1533
+ (setDragged)="setDragged($event)"
1534
+ (releaseDragged)="releaseDragged()"
1535
+ (onObjectClick)="onObjectLibraryClick($event)"
1536
+ >
1537
+ </rp-object-library>
1538
+ <mat-divider></mat-divider>
1539
+ </ng-container>
1540
+ <ng-container *ngIf="libraryObjects?.length > 0">
1541
+ <h3 class="mat-subheading-2">{{ 'LIBRARY' | localize }}</h3>
1542
+ <rp-object-library
1543
+ [objects]="libraryObjects"
1544
+ (setDragged)="setDragged($event)"
1545
+ (releaseDragged)="releaseDragged()"
1546
+ (onObjectClick)="onObjectLibraryClick($event)"
1547
+ >
1548
+ </rp-object-library>
1549
+ </ng-container>
1550
+ </section>
1551
+ </div>
1552
+ </ng-template>
1558
1553
 
1559
- <ng-template #selectedWallSidebar>
1560
- <header class="drawer__header">
1561
- <h2 class="mat-title">{{ 'WALL'| localize }}</h2>
1562
- </header>
1563
- <rp-selected-wall
1564
- [wall]="selectedWall"
1565
- [texturePlane]="selectedEdges[0]"
1566
- [minWallHeight]="getMinWallHeight(selectedWall)"
1567
- [maxWallHeight]="maxWallHeight"
1568
- [maxWallThickness]="maxWallThickness"
1569
- [maxWallLength]="maxWallLength"
1570
- [minWallLength]="minWallLength"
1571
- (remove)="removeWall($event)"
1572
- (setLength)="setWallLength($event)"
1573
- (setHeight)="setWallHeight($event)"
1574
- (setThickness)="setWallThickness($event)"
1575
- (selectCorner)="selectCorner($event)"
1576
- (setTexture)="setWallTexture($event)"
1577
- (setColor)="setWallColor($event)"
1578
- >
1579
- </rp-selected-wall>
1580
- </ng-template>
1554
+ <ng-template #selectedObjectSidebar>
1555
+ <header class="drawer__header">
1556
+ <h2 class="mat-title">{{ 'OBJECT' | localize }}</h2>
1557
+ </header>
1558
+ <rp-selected-object
1559
+ [object]="selectedObject"
1560
+ (onSelectedObjectChange)="updateSelectedObjectHud()"
1561
+ >
1562
+ </rp-selected-object>
1563
+ </ng-template>
1581
1564
 
1582
- <ng-template #selectedThreedObjectSidebar>
1583
- <header class="drawer__header">
1584
- <h2 class="mat-title" [textContent]="'SETTINGS' | localize"></h2>
1585
- </header>
1586
- <rp-selected-threed-object
1587
- [object]="selectedObject"
1588
- [showCopy]="showCopyButton"
1589
- [showDelete]="showDeleteButton"
1590
- [showLock]="showLockButton"
1591
- (onSelectedObjectChange)="updateSelectedObjectHud()"
1592
- >
1593
- </rp-selected-threed-object>
1594
- </ng-template>
1565
+ <ng-template #selectedWallSidebar>
1566
+ <header class="drawer__header">
1567
+ <h2 class="mat-title">{{ 'WALL'| localize }}</h2>
1568
+ </header>
1569
+ <rp-selected-wall
1570
+ [wall]="selectedWall"
1571
+ [texturePlane]="selectedEdges[0]"
1572
+ [minWallHeight]="getMinWallHeight(selectedWall)"
1573
+ [maxWallHeight]="maxWallHeight"
1574
+ [maxWallThickness]="maxWallThickness"
1575
+ [maxWallLength]="maxWallLength"
1576
+ [minWallLength]="minWallLength"
1577
+ (remove)="removeWall($event)"
1578
+ (setLength)="setWallLength($event)"
1579
+ (setHeight)="setWallHeight($event)"
1580
+ (setThickness)="setWallThickness($event)"
1581
+ (selectCorner)="selectCorner($event)"
1582
+ (setTexture)="setWallTexture($event)"
1583
+ (setColor)="setWallColor($event)"
1584
+ >
1585
+ </rp-selected-wall>
1586
+ </ng-template>
1595
1587
 
1596
- <ng-template #selectedFloorSidebar>
1597
- <h2 class="mat-title">{{ 'FLOOR' | localize }}</h2>
1598
- <rp-selected-floor
1599
- [floor]="selectedFloor"
1600
- [texturePlane]="selectedFloor"
1601
- (setTexture)="setFloorTexture($event)"
1602
- (setColor)="setFloorColor($event)"
1603
- (selectedFloorClosed)="selectedFloor = undefined"
1604
- >
1605
- </rp-selected-floor>
1606
- </ng-template>
1588
+ <ng-template #selectedThreedObjectSidebar>
1589
+ <header class="drawer__header">
1590
+ <h2 class="mat-title" [textContent]="'SETTINGS' | localize"></h2>
1591
+ </header>
1592
+ <rp-selected-threed-object
1593
+ [object]="selectedObject"
1594
+ [showCopy]="showCopyButton"
1595
+ [showDelete]="showDeleteButton"
1596
+ [showLock]="showLockButton"
1597
+ (onSelectedObjectChange)="updateSelectedObjectHud()"
1598
+ >
1599
+ </rp-selected-threed-object>
1600
+ </ng-template>
1607
1601
 
1602
+ <ng-template #selectedFloorSidebar>
1603
+ <h2 class="mat-title">{{ 'FLOOR' | localize }}</h2>
1604
+ <rp-selected-floor
1605
+ [floor]="selectedFloor"
1606
+ [texturePlane]="selectedFloor"
1607
+ (setTexture)="setFloorTexture($event)"
1608
+ (setColor)="setFloorColor($event)"
1609
+ (selectedFloorClosed)="selectedFloor = undefined"
1610
+ >
1611
+ </rp-selected-floor>
1612
+ </ng-template>
1608
1613
 
1614
+ <ng-container *ngIf="userIsGrouping">
1609
1615
  <div class="rp-item-context-menu-wrap mrp-save-grouping" *ngIf="userIsGrouping">
1610
- <div class="rp-item-context-menu-item" (click)="onGroupClick()">
1611
- <span class="icon"><mat-icon class="homedecorator-material-icons">check</mat-icon></span>
1612
- <span class="label">{{ 'GROUPING' | localize }}</span>
1613
- </div>
1614
- <div class="rp-item-context-menu-item" (click)="cancelGroupSelection()">
1615
- <span class="icon"><mat-icon class="homedecorator-material-icons">cancel</mat-icon></span>
1616
- <span class="label">{{ 'CANCEL' | localize }}</span>
1617
- </div>
1616
+ <div class="rp-item-context-menu-item" (click)="onGroupClick()">
1617
+ <span class="icon"><mat-icon class="homedecorator-material-icons">check</mat-icon></span>
1618
+ <span class="label">{{ 'GROUPING' | localize }}</span>
1619
+ </div>
1620
+ <div class="rp-item-context-menu-item" (click)="cancelGroupSelection()">
1621
+ <span class="icon"><mat-icon class="homedecorator-material-icons">cancel</mat-icon></span>
1622
+ <span class="label">{{ 'CANCEL' | localize }}</span>
1623
+ </div>
1618
1624
  </div>
1625
+ </ng-container>
1626
+
1619
1627
  `,
1620
1628
  styleUrls: ['./room-planner.component.scss'] /*,
1621
1629
  changeDetection: ChangeDetectionStrategy.OnPush*/
@@ -1692,4 +1700,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
1692
1700
  type: HostListener,
1693
1701
  args: ['document:keydown', ['$event']]
1694
1702
  }] } });
1695
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vbS1wbGFubmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL3BsdWdpbnMvcm9vbS1wbGFubmVyL3Jvb20tcGxhbm5lci9yb29tLXBsYW5uZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFckMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFDeEYsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFHM0QsT0FBTyxFQUNMLG9CQUFvQixFQUNwQix3QkFBd0IsRUFDeEIsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsVUFBVSxFQUNYLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFtQixVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBb0J4RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUMzRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFJakUsT0FBTyxFQUFD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LDhCQUE4QixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDWCxlQUFlO3NCQUE1RCxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDQyxjQUFjO3NCQUExRCxTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDUyxxQkFBcUI7c0JBQXhFLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNBLG1CQUFtQjtzQkFBcEUsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBQ1UsMkJBQTJCO3NCQUFwRixTQUFTO3VCQUFDLDZCQUE2QixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDTCxvQkFBb0I7c0JBQXRFLFNBQVM7dUJBQUMsc0JBQXNCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNKLGNBQWM7c0JBQTFELFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNPLG1CQUFtQjtzQkFBcEUsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBQ0YsZUFBZTtzQkFBNUQsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBRXRCLFVBQVU7c0JBQS9CLFdBQVc7dUJBQUMsT0FBTztnQkFDWCxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBa0ZBLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0QmluZGluZyxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7RXVsZXIsIFZlY3RvcjN9IGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtQbHVnaW5JbnRlcmZhY2V9IGZyb20gJy4uLy4uL3BsdWdpbi1pbnRlcmZhY2UnO1xyXG5pbXBvcnQge0Zsb29ycGxhbm5lckNvbXBvbmVudH0gZnJvbSAnLi4vY29tcG9uZW50cy9mbG9vcnBsYW5uZXIvZmxvb3JwbGFubmVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7SWNvbkVudW19IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bS9pY29uLmVudW0nO1xyXG5pbXBvcnQge0ljb25OYW1lfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vaWNvbi1uYW1lLmVudW0nO1xyXG5pbXBvcnQge1ZpZXdNb2RlfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vdmlldy1tb2RlLmVudW0nO1xyXG5pbXBvcnQge1RocmVlZE1vZGVsfSBmcm9tICcuLi8uLi9jb3JlM2QvbW9kZWwvdGhyZWVkLW1vZGVsJztcclxuaW1wb3J0IHtDYXRlZ29yeX0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbC9jYXRlZ29yeSc7XHJcbmltcG9ydCB7XHJcbiAgaXNDdXN0b21DeWxpbmRlclR5cGUsXHJcbiAgaXNDdXN0b21DeWxpbmRlcldhbGxUeXBlLFxyXG4gIGlzQ3VzdG9tU2hhcGVUeXBlLFxyXG4gIGlzQ3VzdG9tU2hhcGVXYWxsVHlwZSxcclxuICBpc0Z1cm5pdHVyZVR5cGUsXHJcbiAgaXNXYWxsVHlwZVxyXG59IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9mYWN0b3J5JztcclxuaW1wb3J0IHtDb3JuZXIsIEhhbGZFZGdlLCBJbldhbGxJdGVtLCBSb29tLCBXYWxsLCBXYWxsSXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL3dhbGwtb2JqZWN0cyc7XHJcbmltcG9ydCB7SXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2l0ZW0nO1xyXG5pbXBvcnQge0l0ZW1Hcm91cH0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2l0ZW0tZ3JvdXAnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JJY29uQ2FjaGVTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1pY29uLWNhY2hlLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZpZXdNb2RlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL3ZpZXctbW9kZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtNb2RlbHNTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9tb2RlbHMuc2VydmljZSc7XHJcbmltcG9ydCB7UHJlc2V0c1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9wcmVzZXRzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JBcHBTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1hcHAuc2VydmljZSc7XHJcbmltcG9ydCB7U2NyZWVuU2l6ZUFuYWx5c2lzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NjcmVlbi1zaXplLWFuYWx5c2lzL3NjcmVlbi1zaXplLWFuYWx5c2lzLnNlcnZpY2UnO1xyXG5pbXBvcnQge1V0aWxzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL3V0aWxzLnNlcnZpY2UnO1xyXG5pbXBvcnQge01lc3NhZ2VCdXNTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvbWVzc2FnZS1idXMuc2VydmljZSc7XHJcbmltcG9ydCB7Q29uZmlndXJhdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge0Zsb29ycGxhblNlcnZpY2V9IGZyb20gJy4uL2NvbXBvbmVudHMvZmxvb3JwbGFubmVyL3NlcnZpY2UvZmxvb3JwbGFuLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2Uvc2NlbmUuc2VydmljZSc7XHJcbmltcG9ydCB7SHVkU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2UvaHVkLnNlcnZpY2UnO1xyXG5pbXBvcnQge1Jvb21TZXJ2aWNlfSBmcm9tICcuLi9jb21wb25lbnRzL2Zsb29ycGxhbm5lci9zZXJ2aWNlL3Jvb20uc2VydmljZSc7XHJcbmltcG9ydCB7Q2FtZXJhU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2UvY2FtZXJhLnNlcnZpY2UnO1xyXG5pbXBvcnQge0l0ZW1TZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9pdGVtLnNlcnZpY2UnO1xyXG5pbXBvcnQge0l0ZW1TZXJpYWxpemF0aW9uU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2l0ZW0tc2VyaWFsaXphdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtMaWdodHNTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9saWdodHMuc2VydmljZSc7XHJcbmltcG9ydCB7QXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9hci5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHtDb25maWd1cmF0aW9uS2V5fSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vY29uZmlndXJhdGlvbi1rZXkuZW51bSc7XHJcbmltcG9ydCB7TWVzc2FnZVR5cGV9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bS9tZXNzYWdlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7U2VsZWN0ZWRXYWxsRXZlbnR9IGZyb20gJy4uLy4uLy4uL2NvcmUvaW50ZXJmYWNlL3NlbGVjdGVkLXdhbGwtZXZlbnQuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtTZWxlY3RlZEZsb29yRXZlbnR9IGZyb20gJy4uLy4uLy4uL2NvcmUvaW50ZXJmYWNlL3NlbGVjdGVkLWZsb29yLWV2ZW50LmludGVyZmFjZSc7XHJcbmltcG9ydCB7U2NyZWVuU2l6ZUluZm99IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zY3JlZW4tc2l6ZS1hbmFseXNpcy9zY3JlZW4tc2l6ZS1pbmZvJztcclxuaW1wb3J0IHtDdXN0b21TaGFwZUZsb29ySXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2N1c3RvbS1zaGFwZS1mbG9vci1pdGVtJztcclxuaW1wb3J0IHtDdXN0b21TaGFwZVdhbGxJdGVtfSBmcm9tICcuLi8uLi9jb3JlM2QvaXRlbXMvY3VzdG9tLXNoYXBlLXdhbGwtaXRlbSc7XHJcbmltcG9ydCB7Q3VzdG9tQ3lsaW5kZXJGbG9vckl0ZW19IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9jdXN0b20tY3lsaW5kZXItZmxvb3ItaXRlbSc7XHJcbmltcG9ydCB7Q3VzdG9tQ3lsaW5kZXJXYWxsSXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2N1c3RvbS1jeWxpbmRlci13YWxsLWl0ZW0nO1xyXG5pbXBvcnQge0RyYWdnZWREYXRhfSBmcm9tICcuLi8uLi9jb3JlM2QvaW50ZXJmYWNlL2RyYWdnZWQtZGF0YS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1RleHR1cmV9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWwvdGV4dHVyZSc7XHJcbmltcG9ydCB7SW5mb0RpYWxvZ0NvbXBvbmVudH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2luZm8tZGlhbG9nL2luZm8tZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7TW9kZWxJbnRlcmZhY2V9IGZyb20gJy4uLy4uL2NvcmUzZC9pbnRlcmZhY2UvbW9kZWwuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtLZXl9IGZyb20gJy4uL2NvbnN0L2tleSc7XHJcbmltcG9ydCB7Rmxvb3JQbGFuZUl0ZW19IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9mbG9vci1wbGFuZS1pdGVtJztcclxuaW1wb3J0IHtHb29nbGVUYWdNYW5hZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9nb29nbGUtdGFnLW1hbmFnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7UGVybWFuZW50U3RvcmVTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvcGVybWFuZW50LXN0b3JlLnNlcnZpY2UnO1xyXG5pbXBvcnQge0N1c3RvbUJ1dHRvbn0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbC9jdXN0b20tYnV0dG9uJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQXBwRXZlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1hcHAtZXZlbnQuc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci1hZGFwdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge0V4dGVybmFsU291cmNlQXJ0aWNsZUFkZEludGVyZmFjZX0gZnJvbSAnQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvaW50ZXJmYWNlL2V4dGVybmFsLXNvdXJjZS1hcnRpY2xlLWFkZC5pbnRlcmZhY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdycC1yb29tLXBsYW5uZXInLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJSb29tUGxhbm5lclwiPlxyXG4gICAgICAgICAgPGZsb29yLXBsYW5uZXJcclxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmhpZGRlbl09XCIhdmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKClcIlxyXG4gICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRXYWxsQ2hhbmdlKT1cInNlbGVjdFdhbGwoJGV2ZW50KVwiPjwvZmxvb3ItcGxhbm5lcj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8cnAtY29udGV4dC1tZW51XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhdmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkgJiYgc2hvd0NvbnRleHRNZW51ICYmIHNlbGVjdGVkV2FsbFwiXHJcbiAgICAgICAgICAgICAgW29wZW5Nb3VzZUV2ZW50XT1cImNvbnRleHRNZW51TW91c2VFdmVudFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LXdyYXAgXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwic2hvd1NlbGVjdGVkV2FsbFNpZGViYXIoKVwiIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCIgc3ZnSWNvbj1cIm1hZ2ljLXdhbmRcIj48L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdDT05GSUdVUkUnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9ycC1jb250ZXh0LW1lbnU+XHJcblxyXG4gICAgICA8cnAtY29udGV4dC1tZW51XHJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhdmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkgJiYgc2hvd0NvbnRleHRNZW51ICYmIHNlbGVjdGVkRmxvb3JcIlxyXG4gICAgICAgICAgICAgIFtvcGVuTW91c2VFdmVudF09XCJjb250ZXh0TWVudU1vdXNlRXZlbnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS13cmFwXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwic2hvd1NlbGVjdGVkRmxvb3JTaWRlYmFyKClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW0gXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIiBzdmdJY29uPVwibWFnaWMtd2FuZFwiPjwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ0NPTkZJR1VSRScgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L3JwLWNvbnRleHQtbWVudT5cclxuXHJcbiAgICAgIDxycC1pdGVtLWNvbnRleHQtbWVudVxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIXZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpICYmIHNob3dDb250ZXh0TWVudSAmJiAhc2hvd0dyb3VwTWVudVwiXHJcbiAgICAgICAgICAgICAgW2l0ZW1dPVwic2VsZWN0ZWRPYmplY3RcIlxyXG4gICAgICAgICAgICAgIChkZWxldGVQcmVzc2VkKT1cImhhbmRsZURlbGV0ZU9iamVjdCgpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtd3JhcFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1jbG9zZVwiIChjbGljayk9XCJjbG9zZUNvbnRleHRNZW51KClcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjbG9zZS1pY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmNsb3NlPC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRoaXMuc2VsZWN0ZWRPYmplY3RcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICA8cD57eyB0aGlzLnNlbGVjdGVkT2JqZWN0Lm5hbWUgfX08L3A+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dTZXR0aW5nc0J1dHRvblwiIChjbGljayk9XCJzaG93U2VsZWN0ZWRPYmplY3RTaWRlYmFyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtIFwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCIgc3ZnSWNvbj1cIm1hZ2ljLXdhbmRcIj48L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdDT05GSUdVUkUnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3dDb25maWd1cmF0aW9uQnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGN1c3RvbUJ1dHRvbiBvZiBtb2RlbHNTZXJ2aWNlLmN1c3RvbUJ1dHRvbnNcIiAoY2xpY2spPVwiaGFuZGxlQ29uZmlndXJhdGlvbkJ1dHRvbkNsaWNrKGN1c3RvbUJ1dHRvbilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbSBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxjby1pY29uIFtpY29uRGF0YV09XCJpY29uU2VydmljZS5nZXRJY29uKGljb24uTWFnaWNXYW5kKVwiPjwvY28taWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ0NPTkZJR1VSRScgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dDb3B5QnV0dG9uXCIgKGNsaWNrKT1cImNvcHlTZWxlY3RlZE9iamVjdCgpXCIgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5maWxlX2NvcHk8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdDT1BZJyB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93RGVsZXRlQnV0dG9uXCIgKGNsaWNrKT1cInJlbW92ZVNlbGVjdGVkT2JqZWN0KClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmRlbGV0ZTwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ1JFTU9WRScgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0NvbmZpZ3VyYXRpb25CdXR0b25cIiAoY2xpY2spPVwic2hvd1NlbGVjdGVkVGhyZWVkT2JqZWN0U2lkZWJhcigpXCJcclxuICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbVwiPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+c2V0dGluZ3M8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdTRVRUSU5HUycgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0xvY2tCdXR0b24gJiYgc2VsZWN0ZWRPYmplY3RcIiAoY2xpY2spPVwidG9nZ2xlTG9ja1NlbGVjdGVkT2JqZWN0KClcIlxyXG4gICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIiBbdGV4dENvbnRlbnRdPVwic2VsZWN0ZWRPYmplY3QubG9ja2VkID8gJ2xvY2snIDogJ2xvY2tfb3BlbidcIj48L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7IChzZWxlY3RlZE9iamVjdC5sb2NrZWQgPyAnVU5MT0NLJyA6ICdMT0NLJykgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dHcm91cEVkaXRNZW51QnV0dG9uc1wiIChjbGljayk9XCJzdGFydEdyb3VwU2VsZWN0aW9uKClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmxpbms8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdHUk9VUCcgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dDb252ZXJzaW9uQnV0dG9uICYmIHNldHRpbmdzU2VydmljZS5zZXR0aW5ncy5zaG93Q29udmVyc2lvbkJ1dHRvbnNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbmRDb252ZXJzaW9uVG9UYWdNYW5hZ2VyKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImFkZFNlbGVjdGVkQ2xhc3MgPyAnY29udmVyc2lvbi1idXR0b24tc2VsZWN0ZWQnIDogJydcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmFkZF9zaG9wcGluZ19jYXJ0PC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnQ09OVkVSU0lPTicgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGljb24tc2VsZWN0ZWRcIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0FSQnV0dG9uXCIgKGNsaWNrKT1cInN0YXJ0QVJTZXNzaW9uKClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPndlZWtlbmQ8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdBUicgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8YnV0dG9uLWVsZXZhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZE9iamVjdCAmJiBzZWxlY3RlZE9iamVjdC5lbGV2YXRpb25BZGp1c3RhYmxlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cInNlbGVjdGVkT2JqZWN0XCI+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24tZWxldmF0aW9uPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzYWxhYmxlT2JqZWN0XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhcl9fZGl2aWRlciBjb250ZXh0LW1lbnVcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImFkZFRvQ2FydChzZWxlY3RlZE9iamVjdClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW0gYWRkLXRvLWNhcnQtYnV0dG9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiIFtzdmdJY29uXT1cIidjYXJ0LXNob3BwaW5nLXJlZ3VsYXInXCI+PC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdBRERfVE9fQ0FSVCcgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvcnAtaXRlbS1jb250ZXh0LW1lbnU+XHJcblxyXG4gICAgICA8cnAtaXRlbS1jb250ZXh0LW1lbnUgKm5nSWY9XCIhdmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkgJiYgc2hvd0NvbnRleHRNZW51ICYmIHNob3dHcm91cE1lbnUgJiYgIXVzZXJJc0dyb3VwaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtXT1cInNlbGVjdGVkT2JqZWN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWxldGVQcmVzc2VkKT1cImhhbmRsZURlbGV0ZU9iamVjdCgpXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtd3JhcFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd0dyb3VwRWRpdE1lbnVCdXR0b25zXCIgKGNsaWNrKT1cIm9uR3JvdXBDbGljaygpXCIgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5saW5rPC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnR1JPVVAnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dHcm91cEVkaXRNZW51QnV0dG9uc1wiIChjbGljayk9XCJvblVuR3JvdXBDbGljaygpXCIgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5saW5rX29mZjwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ1VOR1JPVVAnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dHcm91cEVkaXRNZW51QnV0dG9uc1wiIChjbGljayk9XCJyZW1vdmVTZWxlY3RlZE9iamVjdCgpXCIgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5kZWxldGU8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdSRU1PVkUnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInNob3dMb2NrQnV0dG9uICYmIHNlbGVjdGVkT2JqZWN0ICYmIHNob3dHcm91cEVkaXRNZW51QnV0dG9uc1wiIChjbGljayk9XCJ0b2dnbGVMb2NrU2VsZWN0ZWRPYmplY3QoKVwiXHJcbiAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiIFt0ZXh0Q29udGVudF09XCJzZWxlY3RlZE9iamVjdC5sb2NrZWQgPyAnbG9jaycgOiAnbG9ja19vcGVuJ1wiPjwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgKHNlbGVjdGVkT2JqZWN0LmxvY2tlZCA/ICdVTkxPQ0snIDogJ0xPQ0snKSB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvcnAtaXRlbS1jb250ZXh0LW1lbnU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uTGlicmFyeT5cclxuICAgICAgICAgIDxycC10b29sYmFyLWljb25cclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhcGhvbmVTaXplU2NyZWVuXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpIHx8IHZpZXdNb2RlU2VydmljZS5pc1dhbGtUaHJvdWdoVmlld0FjdGl2ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgbWF0SWNvbj1cImhvbWVcIlxyXG4gICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3tpY29uTmFtZS5BcmNoaXRlY3R1cmUgfCBsb2NhbGl6ZX19XCJcclxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2hvd0xpYnJhcnlDYXRlZ29yaWVzKClcIlxyXG4gICAgICAgICAgICAgICAgICBbc2hvd0xhYmVsXT1cInBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgICAgICA+PC9ycC10b29sYmFyLWljb24+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uQWNjZXNzb2lyZXM+XHJcbiAgICAgICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ2aWV3TW9kZVNlcnZpY2UuaXMyZFZpZXdBY3RpdmUoKSB8fCB2aWV3TW9kZVNlcnZpY2UuaXNXYWxrVGhyb3VnaFZpZXdBY3RpdmUoKVwiXHJcbiAgICAgICAgICAgICAgICAgIG1hdEljb249XCJsb2NhbF9mbG9yaXN0XCJcclxuICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7aWNvbk5hbWUuQWNjZXNzb3JpZXMgfCBsb2NhbGl6ZX19XCJcclxuICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwic2hvd0FjY2Vzc29pcmVDYXRlZ29yaWVzKClcIlxyXG4gICAgICAgICAgICAgICAgICBbc2hvd0xhYmVsXT1cInBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgICAgICA+PC9ycC10b29sYmFyLWljb24+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uMmRWaWV3PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b29sYmFyX19kaXZpZGVyXCI+PC9zcGFuPlxyXG4gICAgICAgICAgPHJwLXRvb2xiYXItaWNvblxyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cIiFwaG9uZVNpemVTY3JlZW5cIlxyXG4gICAgICAgICAgICAgICAgICBzdmdJY29uPVwiY3ViZS11bmZvbGRlZFwiXHJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7e2ljb25OYW1lLlR3b2RGbG9vcnBsYW4gfCBsb2NhbGl6ZX19XCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpIHx8ICFkZXNrdG9wU2l6ZVNjcmVlblwiXHJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cInVwZGF0ZU1vZGUodmlld01vZGVzLkZsb29yUGxhbjJELCB0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzaG93TGFiZWxdPVwicGhvbmVTaXplU2NyZWVuXCJcclxuICAgICAgICAgID48L3JwLXRvb2xiYXItaWNvbj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjdG9vbGJhckljb24zZFZpZXc+XHJcbiAgICAgICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgICAgICAgICAgIHN2Z0ljb249XCJjdWJlLW91dGxpbmVcIlxyXG4gICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3tpY29uTmFtZS5UaHJlZWRSb29tcGxhbiB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwidmlld01vZGVTZXJ2aWNlLmlzM2RWaWV3QWN0aXZlKClcIlxyXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJ1cGRhdGVNb2RlKHZpZXdNb2Rlcy5Sb29tUGxhbjNELCB0cnVlKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzaG93TGFiZWxdPVwicGhvbmVTaXplU2NyZWVuXCJcclxuICAgICAgICAgID48L3JwLXRvb2xiYXItaWNvbj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxycC16b29tLWNvbnRyb2xzXHJcbiAgICAgICAgICAgICAgW3Zpc2libGVdPVwidmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKClcIlxyXG4gICAgICAgICAgICAgIChvblpvb21Jbik9XCJ6b29tSW4oKVwiXHJcbiAgICAgICAgICAgICAgKG9uWm9vbVJlc2V0KT1cInpvb21SZXNldCgpXCJcclxuICAgICAgICAgICAgICAob25ab29tT3V0KT1cInpvb21PdXQoKVwiXHJcbiAgICAgID48L3JwLXpvb20tY29udHJvbHM+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uU2V0dGluZ3M+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvb2xiYXJfX2RpdmlkZXJcIj48L3NwYW4+XHJcbiAgICAgICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgICAgICAgICAgIG1hdEljb249XCJzZXR0aW5nc1wiXHJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7e2ljb25OYW1lLlNldHRpbmdzIHwgbG9jYWxpemV9fVwiXHJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cInNob3dTZXR0aW5ncygpXCJcclxuICAgICAgICAgICAgICAgICAgW3Nob3dMYWJlbF09XCJwaG9uZVNpemVTY3JlZW5cIlxyXG4gICAgICAgICAgPjwvcnAtdG9vbGJhci1pY29uPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlICN0b29sYmFySWNvbkZhcT5cclxuICAgICAgICAgIDxycC10b29sYmFyLWljb25cclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93RmFxKClcIlxyXG4gICAgICAgICAgICAgICAgICBtYXRJY29uPVwiaGVscFwiXHJcbiAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7e2ljb25OYW1lLkZhcSB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvcGVuRmFxKHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmZhcVVybClcIlxyXG4gICAgICAgICAgICAgICAgICBbc2hvd0xhYmVsXT1cInBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgICAgICA+PC9ycC10b29sYmFyLWljb24+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uRmVlZGJhY2s+XHJcbiAgICAgICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0ZlZWRiYWNrKClcIlxyXG4gICAgICAgICAgICAgICAgICBtYXRJY29uPVwiY2hhdF9idWJibGVcIlxyXG4gICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3tpY29uTmFtZS5GZWVkYmFjayB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJvcGVuRmVlZGJhY2sodGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuZmVlZGJhY2tVcmwpXCJcclxuICAgICAgICAgICAgICAgICAgW3Nob3dMYWJlbF09XCJwaG9uZVNpemVTY3JlZW5cIlxyXG4gICAgICAgICAgPjwvcnAtdG9vbGJhci1pY29uPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uQ2FydD5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9vbGJhcl9fZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgICAgICAgIDxycC10b29sYmFyLWljb24gY2xhc3M9XCJhZGQtdG8tY2FydC1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICBzdmdJY29uPVwiY2FydC1zaG9wcGluZy1yZWd1bGFyXCJcclxuICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7J0FERF9UT19DQVJUJyB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgICAgICAgICAgICAob25DbGljayk9XCJhZGRBbGxUb0NhcnQoKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzaG93TGFiZWxdPVwicGhvbmVTaXplU2NyZWVuXCJcclxuICAgICAgICAgID48L3JwLXRvb2xiYXItaWNvbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9vbGJhcl9fZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2V0dGluZ3NTaWRlYmFyPlxyXG4gICAgICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3sgJ1NFVFRJTkdTJyB8IGxvY2FsaXplIH19PC9oMj5cclxuICAgICAgICAgIDwvaGVhZGVyPlxyXG4gICAgICAgICAgPHJwLXNldHRpbmdzXHJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZUNhbWVyYURpc2FibGVkXT1cInZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpIHx8IGl0ZW1TZXJ2aWNlLmdldFdhbGt0aHJvdWdoQ2FtZXJhKClcIlxyXG4gICAgICAgICAgICAgICAgICBbbWluV2FsbEhlaWdodF09XCJnZXRNaW5HbG9iYWxXYWxsSGVpZ2h0KClcIlxyXG4gICAgICAgICAgICAgICAgICAob25XYWxsc0hlaWdodFVwZGF0ZSk9XCJ3YWxsc0hlaWdodFVwZGF0ZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3JwLXNldHRpbmdzPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlICNjYXRlZ29yaWVzU2lkZWJhcj5cclxuICAgICAgICAgIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7ICdBUkNISVRFQ1RVUkUnIHwgbG9jYWxpemUgfX08L2gyPlxyXG4gICAgICAgICAgPC9oZWFkZXI+XHJcbiAgICAgICAgICA8cnAtY2F0ZWdvcnktbGlicmFyeVxyXG4gICAgICAgICAgICAgICAgICBbY2F0ZWdvcmllc109XCJjYXRlZ29yaWVzXCJcclxuICAgICAgICAgICAgICAgICAgKGNhdGVnb3J5Q2xpY2spPVwic2hvd0xpYnJhcnlDYXRlZ29yeSgkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvcnAtY2F0ZWdvcnktbGlicmFyeT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjYWNjZXNzb2lyZXNDYXRlZ29yaWVzU2lkZWJhcj5cclxuICAgICAgICAgIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7ICdBQ0NFU1NPSVJFUycgfCBsb2NhbGl6ZSB9fTwvaDI+XHJcbiAgICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICAgIDxycC1jYXRlZ29yeS1saWJyYXJ5XHJcbiAgICAgICAgICAgICAgICAgIFtjYXRlZ29yaWVzXT1cImFjY2Vzc29pcmVDYXRlZ29yaWVzXCJcclxuICAgICAgICAgICAgICAgICAgKGNhdGVnb3J5Q2xpY2spPVwic2hvd0xpYnJhcnlDYXRlZ29yeSgkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvcnAtY2F0ZWdvcnktbGlicmFyeT5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjY3VzdG9tU2hhcGVDcmVhdG9yU2lkZUJhcj5cclxuICAgICAgICAgIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7ICdDVVNUT01fU0hBUEVfQ1JFQVRPUicgfCBsb2NhbGl6ZSB9fTwvaDI+XHJcbiAgICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICAgIDxycC1jdXN0b20tc2hhcGUtY3JlYXRvciBbc2hhcGVdPVwic2VsZWN0ZWRPYmplY3RcIj48L3JwLWN1c3RvbS1zaGFwZS1jcmVhdG9yPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlICNjdXN0b21DeWxpbmRlckNyZWF0b3JTaWRlQmFyPlxyXG4gICAgICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3sgJ0NVU1RPTV9TSEFQRV9DUkVBVE9SJyB8IGxvY2FsaXplIH19PC9oMj5cclxuICAgICAgICAgIDwvaGVhZGVyPlxyXG4gICAgICAgICAgPGN1c3RvbS1jeWxpbmRlci1jcmVhdG9yIFtzaGFwZV09XCJzZWxlY3RlZE9iamVjdFwiPjwvY3VzdG9tLWN5bGluZGVyLWNyZWF0b3I+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI2xpYnJhcnlTaWRlYmFyPlxyXG4gICAgICAgICAgPGRpdiBmeExheW91dD1cImNvbHVtblwiIGNsYXNzPVwid2l0aC1zY3JvbGxhYmxlLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgICA8aGVhZGVyIGNsYXNzPVwiZHJhd2VyX19oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNob3dBY3RpdmVDYXRlZ29yeVNpZGViYXIoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmFycm93X2JhY2tfaW9zPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7IHNlbGVjdGVkQ2F0ZWdvcnkubmFtZSB8IGxvY2FsaXplIH19PC9oMj5cclxuICAgICAgICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1hdC1ib2R5XCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5LmRlc2NyaXB0aW9uXCI+e3sgc2VsZWN0ZWRDYXRlZ29yeS5kZXNjcmlwdGlvbiB8IGxvY2FsaXplIH19PC9wPlxyXG4gICAgICAgICAgICAgIDxzZWN0aW9uIGZ4RmxleD1cImdyb3dcIiAqbmdJZj1cImxpYnJhcnlPYmplY3RzPy5sZW5ndGggPiAwIHx8IGhhc0N1c3RvbU9iamVjdHMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaGFzQ3VzdG9tT2JqZWN0cygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0yXCI+e3sgJ0NVU1RPTScgfCBsb2NhbGl6ZSB9fTwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cnAtb2JqZWN0LWxpYnJhcnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29iamVjdHNdPVwiY3VzdG9tT2JqZWN0c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXREcmFnZ2VkKT1cInNldERyYWdnZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWxlYXNlRHJhZ2dlZCk9XCJyZWxlYXNlRHJhZ2dlZCgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uT2JqZWN0Q2xpY2spPVwib25PYmplY3RMaWJyYXJ5Q2xpY2soJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3JwLW9iamVjdC1saWJyYXJ5PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG1hdC1kaXZpZGVyPjwvbWF0LWRpdmlkZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGlicmFyeU9iamVjdHM/Lmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cIm1hdC1zdWJoZWFkaW5nLTJcIj57eyAnTElCUkFSWScgfCBsb2NhbGl6ZSB9fTwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8cnAtb2JqZWN0LWxpYnJhcnlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29iamVjdHNdPVwibGlicmFyeU9iamVjdHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2V0RHJhZ2dlZCk9XCJzZXREcmFnZ2VkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVsZWFzZURyYWdnZWQpPVwicmVsZWFzZURyYWdnZWQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbk9iamVjdENsaWNrKT1cIm9uT2JqZWN0TGlicmFyeUNsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9ycC1vYmplY3QtbGlicmFyeT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9zZWN0aW9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3NlbGVjdGVkT2JqZWN0U2lkZWJhcj5cclxuICAgICAgICAgIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7ICdPQkpFQ1QnIHwgbG9jYWxpemUgfX08L2gyPlxyXG4gICAgICAgICAgPC9oZWFkZXI+XHJcbiAgICAgICAgICA8cnAtc2VsZWN0ZWQtb2JqZWN0XHJcbiAgICAgICAgICAgICAgICAgIFtvYmplY3RdPVwic2VsZWN0ZWRPYmplY3RcIlxyXG4gICAgICAgICAgICAgICAgICAob25TZWxlY3RlZE9iamVjdENoYW5nZSk9XCJ1cGRhdGVTZWxlY3RlZE9iamVjdEh1ZCgpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvcnAtc2VsZWN0ZWQtb2JqZWN0PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgPG5nLXRlbXBsYXRlICNzZWxlY3RlZFdhbGxTaWRlYmFyPlxyXG4gICAgICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3sgJ1dBTEwnfCBsb2NhbGl6ZSB9fTwvaDI+XHJcbiAgICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICAgIDxycC1zZWxlY3RlZC13YWxsXHJcbiAgICAgICAgICAgICAgICAgIFt3YWxsXT1cInNlbGVjdGVkV2FsbFwiXHJcbiAgICAgICAgICAgICAgICAgIFt0ZXh0dXJlUGxhbmVdPVwic2VsZWN0ZWRFZGdlc1swXVwiXHJcbiAgICAgICAgICAgICAgICAgIFttaW5XYWxsSGVpZ2h0XT1cImdldE1pbldhbGxIZWlnaHQoc2VsZWN0ZWRXYWxsKVwiXHJcbiAgICAgICAgICAgICAgICAgIFttYXhXYWxsSGVpZ2h0XT1cIm1heFdhbGxIZWlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICBbbWF4V2FsbFRoaWNrbmVzc109XCJtYXhXYWxsVGhpY2tuZXNzXCJcclxuICAgICAgICAgICAgICAgICAgW21heFdhbGxMZW5ndGhdPVwibWF4V2FsbExlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgIFttaW5XYWxsTGVuZ3RoXT1cIm1pbldhbGxMZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAocmVtb3ZlKT1cInJlbW92ZVdhbGwoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChzZXRMZW5ndGgpPVwic2V0V2FsbExlbmd0aCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKHNldEhlaWdodCk9XCJzZXRXYWxsSGVpZ2h0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoc2V0VGhpY2tuZXNzKT1cInNldFdhbGxUaGlja25lc3MoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3RDb3JuZXIpPVwic2VsZWN0Q29ybmVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoc2V0VGV4dHVyZSk9XCJzZXRXYWxsVGV4dHVyZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKHNldENvbG9yKT1cInNldFdhbGxDb2xvcigkZXZlbnQpXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgIDwvcnAtc2VsZWN0ZWQtd2FsbD5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2VsZWN0ZWRUaHJlZWRPYmplY3RTaWRlYmFyPlxyXG4gICAgICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCIgW3RleHRDb250ZW50XT1cIidTRVRUSU5HUycgfCBsb2NhbGl6ZVwiPjwvaDI+XHJcbiAgICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICAgIDxycC1zZWxlY3RlZC10aHJlZWQtb2JqZWN0XHJcbiAgICAgICAgICAgICAgICAgIFtvYmplY3RdPVwic2VsZWN0ZWRPYmplY3RcIlxyXG4gICAgICAgICAgICAgICAgICBbc2hvd0NvcHldPVwic2hvd0NvcHlCdXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICBbc2hvd0RlbGV0ZV09XCJzaG93RGVsZXRlQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgW3Nob3dMb2NrXT1cInNob3dMb2NrQnV0dG9uXCJcclxuICAgICAgICAgICAgICAgICAgKG9uU2VsZWN0ZWRPYmplY3RDaGFuZ2UpPVwidXBkYXRlU2VsZWN0ZWRPYmplY3RIdWQoKVwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICA8L3JwLXNlbGVjdGVkLXRocmVlZC1vYmplY3Q+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3NlbGVjdGVkRmxvb3JTaWRlYmFyPlxyXG4gICAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3sgJ0ZMT09SJyB8IGxvY2FsaXplIH19PC9oMj5cclxuICAgICAgICAgIDxycC1zZWxlY3RlZC1mbG9vclxyXG4gICAgICAgICAgICAgICAgICBbZmxvb3JdPVwic2VsZWN0ZWRGbG9vclwiXHJcbiAgICAgICAgICAgICAgICAgIFt0ZXh0dXJlUGxhbmVdPVwic2VsZWN0ZWRGbG9vclwiXHJcbiAgICAgICAgICAgICAgICAgIChzZXRUZXh0dXJlKT1cInNldEZsb29yVGV4dHVyZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgKHNldENvbG9yKT1cInNldEZsb29yQ29sb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChzZWxlY3RlZEZsb29yQ2xvc2VkKT1cInNlbGVjdGVkRmxvb3IgPSB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPC9ycC1zZWxlY3RlZC1mbG9vcj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtd3JhcCBtcnAtc2F2ZS1ncm91cGluZ1wiICpuZ0lmPVwidXNlcklzR3JvdXBpbmdcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCIgKGNsaWNrKT1cIm9uR3JvdXBDbGljaygpXCI+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmNoZWNrPC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdHUk9VUElORycgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIiAoY2xpY2spPVwiY2FuY2VsR3JvdXBTZWxlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5jYW5jZWw8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ0NBTkNFTCcgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICBgLFxyXG4gIHN0eWxlVXJsczogWycuL3Jvb20tcGxhbm5lci5jb21wb25lbnQuc2NzcyddLyosXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gqL1xyXG59KVxyXG5leHBvcnQgY2xhc3MgUm9vbVBsYW5uZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgUGx1Z2luSW50ZXJmYWNlIHtcclxuICBAVmlld0NoaWxkKEZsb29ycGxhbm5lckNvbXBvbmVudCwge3N0YXRpYzogdHJ1ZX0pXHJcbiAgcHVibGljIGZsb29ycGxhbm5lcjogRmxvb3JwbGFubmVyQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJJY29uTGlicmFyeScsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvbkxpYnJhcnk6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhckljb25BY2Nlc3NvaXJlcycsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvbkFjY2Vzc29pcmVzOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJJY29uU2V0dGluZ3MnLCB7c3RhdGljOiB0cnVlfSkgdG9vbGJhckljb25TZXR0aW5nczogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCd0b29sYmFySWNvbjJkVmlldycsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvbjJkVmlldzogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCd0b29sYmFySWNvbjNkVmlldycsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvbjNkVmlldzogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdjYXRlZ29yaWVzU2lkZWJhcicsIHtzdGF0aWM6IHRydWV9KSBjYXRlZ29yaWVzU2lkZWJhcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdhY2Nlc3NvaXJlc0NhdGVnb3JpZXNTaWRlYmFyJywge3N0YXRpYzogdHJ1ZX0pIGFjY2Vzc29pcmVzQ2F0ZWdvcmllc1NpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnY3VzdG9tU2hhcGVDcmVhdG9yU2lkZUJhcicsIHtzdGF0aWM6IHRydWV9KSBjdXN0b21TaGFwZUNyZWF0b3JTaWRlQmFyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ2N1c3RvbUN5bGluZGVyQ3JlYXRvclNpZGVCYXInLCB7c3RhdGljOiB0cnVlfSkgY3VzdG9tQ3lsaW5kZXJDcmVhdG9yU2lkZUJhcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdzZXR0aW5nc1NpZGViYXInLCB7c3RhdGljOiB0cnVlfSkgc2V0dGluZ3NTaWRlYmFyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ2xpYnJhcnlTaWRlYmFyJywge3N0YXRpYzogdHJ1ZX0pIGxpYnJhcnlTaWRlYmFyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdGVkT2JqZWN0U2lkZWJhcicsIHtzdGF0aWM6IHRydWV9KSBzZWxlY3RlZE9iamVjdFNpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnc2VsZWN0ZWRXYWxsU2lkZWJhcicsIHtzdGF0aWM6IHRydWV9KSBzZWxlY3RlZFdhbGxTaWRlYmFyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdGVkVGhyZWVkT2JqZWN0U2lkZWJhcicsIHtzdGF0aWM6IHRydWV9KSBzZWxlY3RlZFRocmVlZE9iamVjdFNpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnc2VsZWN0ZWRGbG9vclNpZGViYXInLCB7c3RhdGljOiB0cnVlfSkgc2VsZWN0ZWRGbG9vclNpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhckljb25GYXEnLCB7c3RhdGljOiB0cnVlfSkgdG9vbGJhckljb25GYXE6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhckljb25GZWVkYmFjaycsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvbkZlZWRiYWNrOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJJY29uQ2FydCcsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvbkNhcnQ6IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBsYXllckNsYXNzID0gJ2xheWVyJztcclxuICBASW5wdXQoKSBpc0xvYWRpbmc6IGJvb2xlYW47XHJcblxyXG4gIEBPdXRwdXQoKSBkb25lID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBPdXRwdXQoKSBzaG93UGx1Z2luID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIGZvY3VzQ29udHJvbHMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHB1YmxpYyByZWFkb25seSBpY29uOiB0eXBlb2YgSWNvbkVudW0gPSBJY29uRW51bTtcclxuICBwdWJsaWMgcmVhZG9ubHkgaWNvbk5hbWU6IHR5cGVvZiBJY29uTmFtZSA9IEljb25OYW1lO1xyXG4gIHB1YmxpYyByZWFkb25seSB2aWV3TW9kZXM6IHR5cGVvZiBWaWV3TW9kZSA9IFZpZXdNb2RlO1xyXG5cclxuICBvYmplY3RzOiBUaHJlZWRNb2RlbFtdO1xyXG4gIGN1c3RvbU9iamVjdHM6IFRocmVlZE1vZGVsW107XHJcbiAgbGlicmFyeU9iamVjdHM6IFRocmVlZE1vZGVsW107XHJcbiAgY2F0ZWdvcmllczogQ2F0ZWdvcnlbXTtcclxuICBhY2Nlc3NvaXJlQ2F0ZWdvcmllczogQ2F0ZWdvcnlbXTtcclxuICBzZWxlY3RlZENhdGVnb3J5OiBDYXRlZ29yeTtcclxuICBzaG93Q29udGV4dE1lbnU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICBzZWxlY3RlZFdhbGw6IFdhbGw7XHJcbiAgc2VsZWN0ZWRFZGdlOiBzdHJpbmc7XHJcbiAgc2VsZWN0ZWRGbG9vcjogRmxvb3JQbGFuZUl0ZW07XHJcbiAgc2VsZWN0ZWRSb29tOiBSb29tO1xyXG4gIHNlbGVjdGVkT2JqZWN0OiBJdGVtIHwgSXRlbUdyb3VwO1xyXG5cclxuICBwdWJsaWMgd2FsbExlbmd0aEluZm9EaWFsb2dFbmFibGVkID0gdHJ1ZTtcclxuICBwdWJsaWMgbWF4V2FsbEhlaWdodDogbnVtYmVyO1xyXG4gIHB1YmxpYyBtYXhXYWxsVGhpY2tuZXNzOiBudW1iZXI7XHJcbiAgcHVibGljIG1heFdhbGxMZW5ndGg6IG51bWJlcjtcclxuICBwdWJsaWMgbWluV2FsbExlbmd0aDogbnVtYmVyO1xyXG4gIHB1YmxpYyBkZXNrdG9wU2l6ZVNjcmVlbjogYm9vbGVhbjtcclxuICBwdWJsaWMgdGFibGV0U2l6ZVNjcmVlbjogYm9vbGVhbjtcclxuICBwdWJsaWMgcGhvbmVTaXplU2NyZWVuOiBib29sZWFuO1xyXG4gIHB1YmxpYyBjb250ZXh0TWVudU1vdXNlRXZlbnQ6IE1vdXNlRXZlbnQ7XHJcbiAgcHVibGljIHNob3dTZXR0aW5nc0J1dHRvbjogYm9vbGVhbjtcclxuICBwdWJsaWMgc2hvd0NvbmZpZ3VyYXRpb25CdXR0b246IGJvb2xlYW47XHJcbiAgcHVibGljIHNob3dEZWxldGVCdXR0b246IGJvb2xlYW47XHJcbiAgcHVibGljIHNob3dMb2NrQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgc2hvd0FSQnV0dG9uOiBib29sZWFuID0gdHJ1ZTtcclxuICBwdWJsaWMgc2hvd0NvcHlCdXR0b246IGJvb2xlYW47XHJcbiAgcHVibGljIHNob3dHcm91cE1lbnU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd0dyb3VwRWRpdE1lbnVCdXR0b25zOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNob3dJY29uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHVzZXJJc0dyb3VwaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNob3dDb252ZXJzaW9uQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGFkZFNlbGVjdGVkQ2xhc3M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2FsYWJsZU9iamVjdDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIF9zdWJzOiBTdWJzY3JpcHRpb25bXSA9IFtdO1xyXG4gIHByaXZhdGUgX2FjdGl2ZUNhdGVnb3J5U2lkZWJhclRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIHByaXZhdGUgX21vZGUgPSBWaWV3TW9kZS5Sb29tUGxhbjNEO1xyXG4gIHByaXZhdGUgX2NhdGFsb2dJc1Nob3duOiBib29sZWFuO1xyXG4gIHByaXZhdGUgX2Jsb2NrTGVmdFNpZGVCYXIgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgaWNvblNlcnZpY2U6IEhvbWVkZWNvcmF0b3JJY29uQ2FjaGVTZXJ2aWNlLFxyXG4gICAgcHVibGljIHZpZXdNb2RlU2VydmljZTogVmlld01vZGVTZXJ2aWNlLFxyXG4gICAgcHVibGljIG1vZGVsc1NlcnZpY2U6IE1vZGVsc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9wcmVzZXRzU2VydmljZTogUHJlc2V0c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9hcHBTZXJ2aWNlOiBIb21lZGVjb3JhdG9yQXBwU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NjcmVlbkFuYWx5c2lzOiBTY3JlZW5TaXplQW5hbHlzaXNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBfdXRpbHNTZXJ2aWNlOiBVdGlsc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9tZXNzYWdlU2VydmljZTogTWVzc2FnZUJ1c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9kaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIHByaXZhdGUgX2NvbmZpZ3VyYXRpb25TZXJ2aWNlOiBDb25maWd1cmF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX2Zsb29ycGxhblNlcnZpY2U6IEZsb29ycGxhblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9zY2VuZVNlcnZpY2U6IFNjZW5lU2VydmljZSxcclxuICAgIHByaXZhdGUgX2h1ZFNlcnZpY2U6IEh1ZFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9yb29tU2VydmljZTogUm9vbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jYW1lcmFTZXJ2aWNlOiBDYW1lcmFTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaXRlbVNlcnZpY2U6IEl0ZW1TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaXRlbVNlcmlhbGl6YXRpb25TZXJ2aWNlOiBJdGVtU2VyaWFsaXphdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9saWdodHNTZXJ2aWNlOiBMaWdodHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfYXJTZXJ2aWNlOiBBclNlcnZpY2UsXHJcbiAgICBwdWJsaWMgaXRlbVNlcnZpY2U6IEl0ZW1TZXJ2aWNlLFxyXG4gICAgcHVibGljIHNldHRpbmdzU2VydmljZTogSG9tZWRlY29yYXRvclNldHRpbmdzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2dvb2dsZVRhZ01hbmFnZXI6IEdvb2dsZVRhZ01hbmFnZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfcGVybWFuZW50U3RvcmVTZXJ2aWNlOiBQZXJtYW5lbnRTdG9yZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9hcHBFdmVudFNlcnZpY2U6IEhvbWVkZWNvcmF0b3JBcHBFdmVudFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jb25uZWN0b3JTZXJ2aWNlOiBIb21lZGVjb3JhdG9yQ29ubmVjdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgX2Nvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlOiBIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2VcclxuICApIHtcclxuICAgIHRoaXMuX3ByZXNldHNTZXJ2aWNlLnJlZ2lzdGVyKHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5ZG93bicsIFsnJGV2ZW50J10pXHJcbiAgcHVibGljIGhhbmRsZURvY0tleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuaGFuZGxlS2V5RG93bihldmVudCk7XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRFZGdlcygpIHtcclxuICAgIHJldHVybiB0aGlzLnNlbGVjdGVkV2FsbCAmJiB0aGlzLnNlbGVjdGVkRWRnZSA/XHJcbiAgICAgIFt0aGlzLnNlbGVjdGVkV2FsbFt0aGlzLnNlbGVjdGVkRWRnZV1dIDpcclxuICAgICAgW3RoaXMuc2VsZWN0ZWRXYWxsICYmIHRoaXMuc2VsZWN0ZWRXYWxsLmJhY2tFZGdlLFxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRXYWxsICYmIHRoaXMuc2VsZWN0ZWRXYWxsLmZyb250RWRnZVxyXG4gICAgICBdLmZpbHRlcihlZGdlID0+IGVkZ2UpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLm1heFdhbGxIZWlnaHQgPSB0aGlzLl9jb25maWd1cmF0aW9uU2VydmljZS5nZXRWYWx1ZShDb25maWd1cmF0aW9uS2V5Lk1heFdhbGxIZWlnaHQpO1xyXG4gICAgdGhpcy5tYXhXYWxsVGhpY2tuZXNzID0gdGhpcy5fY29uZmlndXJhdGlvblNlcnZpY2UuZ2V0VmFsdWUoQ29uZmlndXJhdGlvbktleS5NYXhXYWxsVGhpY2tuZXNzKTtcclxuICAgIHRoaXMubWF4V2FsbExlbmd0aCA9IHRoaXMuX2NvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFZhbHVlKENvbmZpZ3VyYXRpb25LZXkuTWF4V2FsbExlbmd0aCk7XHJcbiAgICB0aGlzLm1pbldhbGxMZW5ndGggPSB0aGlzLl9jb25maWd1cmF0aW9uU2VydmljZS5nZXRWYWx1ZShDb25maWd1cmF0aW9uS2V5Lk1pbldhbGxMZW5ndGgpO1xyXG5cclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVnaXN0ZXJUb29sYmFySWNvbiwge1xyXG4gICAgICB0ZW1wbGF0ZTogdGhpcy50b29sYmFySWNvbkxpYnJhcnksXHJcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgcHJpb3JpdHk6IDIwMFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlJlZ2lzdGVyVG9vbGJhckljb24sIHtcclxuICAgICAgdGVtcGxhdGU6IHRoaXMudG9vbGJhckljb25BY2Nlc3NvaXJlcyxcclxuICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICBwcmlvcml0eTogMjAwXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVnaXN0ZXJUb29sYmFySWNvbiwge1xyXG4gICAgICB0ZW1wbGF0ZTogdGhpcy50b29sYmFySWNvbjJkVmlldyxcclxuICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICBwcmlvcml0eTogNDAwXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVnaXN0ZXJUb29sYmFySWNvbiwge1xyXG4gICAgICB0ZW1wbGF0ZTogdGhpcy50b29sYmFySWNvbjNkVmlldyxcclxuICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICBwcmlvcml0eTogNDAwXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVnaXN0ZXJUb29sYmFySWNvbiwge1xyXG4gICAgICB0ZW1wbGF0ZTogdGhpcy50b29sYmFySWNvblNldHRpbmdzLFxyXG4gICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgIHByaW9yaXR5OiA1MDBcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5SZWdpc3RlclRvb2xiYXJJY29uLCB7XHJcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnRvb2xiYXJJY29uRmFxLFxyXG4gICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgIHByaW9yaXR5OiA2MDBcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5SZWdpc3RlclRvb2xiYXJJY29uLCB7XHJcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnRvb2xiYXJJY29uRmVlZGJhY2ssXHJcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgcHJpb3JpdHk6IDcwMFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlJlZ2lzdGVyVG9vbGJhckljb24sIHtcclxuICAgICAgdGVtcGxhdGU6IHRoaXMudG9vbGJhckljb25DYXJ0LFxyXG4gICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgIHByaW9yaXR5OiAxMDAwXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMuX2FwcFNlcnZpY2UuY2F0ZWdvcmllc0xvYWRlZC5zdWJzY3JpYmUoKGNhdGVnb3JpZXM6IENhdGVnb3J5W10pID0+IHtcclxuICAgICAgICBpZiAoY2F0ZWdvcmllcykge1xyXG4gICAgICAgICAgdGhpcy5jYXRlZ29yaWVzID0gdGhpcy5fYXBwU2VydmljZS5nZXRDYXRlZ29yaWVzKCdhcmNoaXRlY3R1cmUnKTtcclxuICAgICAgICAgIHRoaXMuYWNjZXNzb2lyZUNhdGVnb3JpZXMgPSB0aGlzLl9hcHBTZXJ2aWNlLmdldENhdGVnb3JpZXMoJ2FjY2Vzc29pcmVzJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy52aWV3TW9kZVNlcnZpY2Uudmlld01vZGVDaGFuZ2VkLnN1YnNjcmliZSgobW9kZTogVmlld01vZGUpID0+IHRoaXMuX3ZpZXdNb2RlQ2hhbmdlZChtb2RlKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5TZXQyRFZpZXcsICh7c2VuZFVwZGF0ZXN9KSA9PiB0aGlzLnVwZGF0ZU1vZGUoVmlld01vZGUuRmxvb3JQbGFuMkQsIHNlbmRVcGRhdGVzKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5TZXQzRFZpZXcsICh7c2VuZFVwZGF0ZXN9KSA9PiB0aGlzLnVwZGF0ZU1vZGUoVmlld01vZGUuUm9vbVBsYW4zRCwgc2VuZFVwZGF0ZXMpKSxcclxuICAgICAgdGhpcy5faW5pdFNjcmVlblNpemVIYW5kbGluZygpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuR3JvdXBNb2RlQ2hhbmdlZCwgKHtzaG93R3JvdXBNZW51fSkgPT4ge1xyXG4gICAgICAgIHRoaXMuc2hvd0dyb3VwTWVudSA9IHNob3dHcm91cE1lbnU7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuSXRlbVNlbGVjdGVkLCAoaXRlbSkgPT4gdGhpcy5vYmplY3RTZWxlY3RlZChpdGVtKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5JdGVtVW5zZWxlY3RlZCwgKGl0ZW0pID0+IHRoaXMub2JqZWN0VW5zZWxlY3RlZCgpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLkxlZnRTaWRlYmFyQ2xvc2VDbGlja2VkLCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZsb29yID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRXYWxsID0gdW5kZWZpbmVkO1xyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmFNb3ZlbWVudENoYW5nZWQuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2UpLFxyXG4gICAgICB0aGlzLl9yb29tU2VydmljZS53YWxsU2VsZWN0ZWQuc3Vic2NyaWJlKChzZWxlY3RlZFdhbGxFdmVudDogU2VsZWN0ZWRXYWxsRXZlbnQpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEZsb29yKSB7XHJcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVMZWZ0U2lkZWJhcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vciA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RXYWxsKHNlbGVjdGVkV2FsbEV2ZW50KTtcclxuICAgICAgfSksXHJcbiAgICAgIHRoaXMuX3Jvb21TZXJ2aWNlLmZsb29yU2VsZWN0ZWQuc3Vic2NyaWJlKChzZWxlY3RlZEZsb29yRXZlbnQ6IFNlbGVjdGVkRmxvb3JFdmVudCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkV2FsbCkge1xyXG4gICAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlTGVmdFNpZGViYXIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnNlbGVjdGVkV2FsbCA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RGbG9vcihzZWxlY3RlZEZsb29yRXZlbnQpO1xyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5faXRlbVNlcnZpY2UuY29weUl0ZW0uc3Vic2NyaWJlKChpdGVtOiBJdGVtKSA9PiB0aGlzLl9jb3B5SXRlbShpdGVtKSksXHJcbiAgICAgIHRoaXMuX2l0ZW1TZXJ2aWNlLmRlbGV0ZUl0ZW0uc3Vic2NyaWJlKChpdGVtOiBJdGVtKSA9PiB0aGlzLl9yZW1vdmVPYmplY3QoaXRlbSkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuU2hvd1Byb2R1Y3RDYXRhbG9nLCAoKSA9PiB0aGlzLl9jYXRhbG9nSXNTaG93biA9IHRydWUpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nLCAoKSA9PiB0aGlzLl9jYXRhbG9nSXNTaG93biA9IGZhbHNlKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLkJsb2NrTGVmdFNpZGViYXIsIChibG9jaykgPT4gdGhpcy5fYmxvY2tMZWZ0U2lkZUJhciA9IGJsb2NrKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlNob3dGdXJuaXR1cmVTaWRlYmFyLCAoY2F0ZWdvcnk6IENhdGVnb3J5KSA9PiB0aGlzLnNob3dMaWJyYXJ5Q2F0ZWdvcnkoY2F0ZWdvcnkpKSxcclxuICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLm9iamVjdE1vdmluZ09yUm90YXRpbmcuc3Vic2NyaWJlKCgpID0+IHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2UpXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMuc2hvd0FSQnV0dG9uID0gdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Mub3B0aW9ucy5zaG93QXJCdXR0b24gJiYgYXdhaXQgdGhpcy5fYXJTZXJ2aWNlLmFyU3VwcG9ydGVkKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX3N1YnMuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XHJcbiAgICB0aGlzLnRvb2xiYXJJY29uTGlicmFyeSA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudG9vbGJhckljb25BY2Nlc3NvaXJlcyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudG9vbGJhckljb25TZXR0aW5ncyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudG9vbGJhckljb24yZFZpZXcgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnRvb2xiYXJJY29uM2RWaWV3ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5jYXRlZ29yaWVzU2lkZWJhciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuYWNjZXNzb2lyZXNDYXRlZ29yaWVzU2lkZWJhciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuY3VzdG9tU2hhcGVDcmVhdG9yU2lkZUJhciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuY3VzdG9tQ3lsaW5kZXJDcmVhdG9yU2lkZUJhciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuc2V0dGluZ3NTaWRlYmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5saWJyYXJ5U2lkZWJhciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RTaWRlYmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZWxlY3RlZFdhbGxTaWRlYmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZWxlY3RlZFRocmVlZE9iamVjdFNpZGViYXIgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmxvb3JTaWRlYmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5fYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGUgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0U2NyZWVuU2l6ZUhhbmRsaW5nKCk6IFN1YnNjcmlwdGlvbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fc2NyZWVuQW5hbHlzaXMuc2NyZWVuU2l6ZUNoYW5nZWQuc3Vic2NyaWJlKChpbmZvOiBTY3JlZW5TaXplSW5mbykgPT4ge1xyXG4gICAgICB0aGlzLmRlc2t0b3BTaXplU2NyZWVuID0gaW5mby5pc0Rlc2t0b3BTaXplO1xyXG4gICAgICB0aGlzLnRhYmxldFNpemVTY3JlZW4gPSBpbmZvLmlzVGFibGV0U2l6ZTtcclxuICAgICAgdGhpcy5waG9uZVNpemVTY3JlZW4gPSBpbmZvLmlzUGhvbmVTaXplO1xyXG5cclxuICAgICAgaWYgKCF0aGlzLmRlc2t0b3BTaXplU2NyZWVuICYmICh0aGlzLnZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpIHx8IHRoaXMudmlld01vZGVTZXJ2aWNlLmlzVlJWaWV3QWN0aXZlKCkpKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVNb2RlKFZpZXdNb2RlLlJvb21QbGFuM0QsIHRydWUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3ZpZXdNb2RlQ2hhbmdlZChtb2RlOiBWaWV3TW9kZSkge1xyXG4gICAgdGhpcy5fbW9kZSA9IG1vZGU7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgfVxyXG5cclxuICBvYmplY3RTZWxlY3RlZChvYmplY3Q6IEl0ZW0gfCBJdGVtR3JvdXApIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuc2FsYWJsZU9iamVjdCA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSB0cnVlO1xyXG4gICAgdGhpcy5zZWxlY3RlZE9iamVjdCA9IG9iamVjdDtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEl0ZW1Hcm91cCkge1xyXG4gICAgICB0aGlzLnNob3dHcm91cE1lbnUgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNob3dHcm91cEVkaXRNZW51QnV0dG9ucyA9IHRydWU7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJdGVtKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkT2JqZWN0Lm1ldGFkYXRhICYmIHRoaXMuc2VsZWN0ZWRPYmplY3QubWV0YWRhdGEuZ29vZElkKSB7XHJcbiAgICAgICAgdGhpcy5zYWxhYmxlT2JqZWN0ID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNob3dHcm91cE1lbnUgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zaG93U2V0dGluZ3NCdXR0b24gPSB0aGlzLl9oYXNTZXR0aW5ncyh0aGlzLnNlbGVjdGVkT2JqZWN0KTtcclxuICAgICAgdGhpcy5zaG93Q29uZmlndXJhdGlvbkJ1dHRvbiA9IHRoaXMuX2lzQ29uZmlndXJhYmxlKHRoaXMuc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICB0aGlzLnNob3dEZWxldGVCdXR0b24gPSB0aGlzLl9pc0RlbGV0YWJsZSh0aGlzLnNlbGVjdGVkT2JqZWN0KTtcclxuICAgICAgdGhpcy5zaG93Q29weUJ1dHRvbiA9IHRoaXMuX2lzQ29weWFibGUodGhpcy5zZWxlY3RlZE9iamVjdCk7XHJcbiAgICAgIHRoaXMuc2hvd0NvbnZlcnNpb25CdXR0b24gPSB0aGlzLl9pc0NvbnZlcnNpb25JdGVtKHRoaXMuc2VsZWN0ZWRPYmplY3QpO1xyXG5cclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRPYmplY3QubWV0YWRhdGEuY29udmVyc2lvbkdUTVNlbmQpIHtcclxuICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2xhc3MgPSB0aGlzLnNlbGVjdGVkT2JqZWN0Lm1ldGFkYXRhLmNvbnZlcnNpb25HVE1TZW5kO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDbGFzcyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fdXRpbHNTZXJ2aWNlLmZvcmNlQ2hhbmdlRGV0ZWN0aW9uKHRoaXMuX2NkLCB0aGlzLCAnc2VsZWN0ZWRPYmplY3QnKTtcclxuICAgIHRoaXMuc2VsZWN0ZWQoKTtcclxuICB9XHJcblxyXG4gIHNob3dTZWxlY3RlZE9iamVjdFNpZGViYXIoKSB7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlUHJvZHVjdENhdGFsb2cpO1xyXG5cclxuICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5zZWxlY3RlZE9iamVjdC5tZXRhZGF0YTtcclxuICAgIGlmIChtZXRhZGF0YSAmJiAoaXNDdXN0b21TaGFwZVR5cGUobWV0YWRhdGEuaXRlbVR5cGUpIHx8IGlzQ3VzdG9tU2hhcGVXYWxsVHlwZShtZXRhZGF0YS5pdGVtVHlwZSkpKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0TGVmdFNpZGViYXIsIHRoaXMuY3VzdG9tU2hhcGVDcmVhdG9yU2lkZUJhcik7XHJcbiAgICB9IGVsc2UgaWYgKG1ldGFkYXRhICYmIChpc0N1c3RvbUN5bGluZGVyVHlwZShtZXRhZGF0YS5pdGVtVHlwZSkgfHwgaXNDdXN0b21DeWxpbmRlcldhbGxUeXBlKG1ldGFkYXRhLml0ZW1UeXBlKSkpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5jdXN0b21DeWxpbmRlckNyZWF0b3JTaWRlQmFyKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0TGVmdFNpZGViYXIsIHRoaXMuc2VsZWN0ZWRPYmplY3RTaWRlYmFyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVDb25maWd1cmF0aW9uQnV0dG9uQ2xpY2soYnRuOiBDdXN0b21CdXR0b24pOiB2b2lkIHtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgICBidG4uaGFuZGxlcih0aGlzLnNlbGVjdGVkT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIG9iamVjdFVuc2VsZWN0ZWQoKSB7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLnNob3dHcm91cE1lbnUgPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd0dyb3VwRWRpdE1lbnVCdXR0b25zID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWxlY3RlZE9iamVjdEh1ZCgpIHtcclxuICAgIHRoaXMuX2h1ZFNlcnZpY2UudXBkYXRlU2VsZWN0ZWRJdGVtSHVkKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlRGVsZXRlT2JqZWN0KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRPYmplY3QgJiYgdGhpcy5faXNEZWxldGFibGUodGhpcy5zZWxlY3RlZE9iamVjdCkpIHtcclxuICAgICAgdGhpcy5yZW1vdmVTZWxlY3RlZE9iamVjdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVtb3ZlU2VsZWN0ZWRPYmplY3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fcmVtb3ZlT2JqZWN0KHRoaXMuc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgdGhpcy5vYmplY3RVbnNlbGVjdGVkKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlTG9ja1NlbGVjdGVkT2JqZWN0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkT2JqZWN0KSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3QubG9ja2VkID0gIXRoaXMuc2VsZWN0ZWRPYmplY3QubG9ja2VkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVtb3ZlT2JqZWN0KG9iamVjdDogSXRlbSB8IEl0ZW1Hcm91cCkge1xyXG4gICAgaWYgKGlzV2FsbFR5cGUob2JqZWN0LnVzZXJEYXRhLml0ZW1UeXBlKSkge1xyXG4gICAgICBjb25zdCBjdXJyZW50V2FsbCA9ICg8V2FsbEl0ZW0+b2JqZWN0KS5jdXJyZW50V2FsbDtcclxuICAgICAgaWYgKGN1cnJlbnRXYWxsKSB7XHJcbiAgICAgICAgY3VycmVudFdhbGwucmVtb3ZlSXRlbSg8SXRlbT5vYmplY3QpO1xyXG4gICAgICAgIGN1cnJlbnRXYWxsLnJlbW92ZU9uSXRlbSg8SXRlbT5vYmplY3QpO1xyXG4gICAgICAgIGN1cnJlbnRXYWxsLmZpcmVSZWRyYXcoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChpc0Z1cm5pdHVyZVR5cGUob2JqZWN0LnVzZXJEYXRhLml0ZW1UeXBlKSkge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlJlbW92ZVNlbGVjdGVkRnVybml0dXJlKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKG9iamVjdC5jYW5CZVJlbW92ZWQoKSkge1xyXG4gICAgICB0aGlzLl9yZW1vdmVJdGVtKG9iamVjdCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBvYmplY3QucmVtb3ZlZCgpO1xyXG4gICAgICB0aGlzLl9zY2VuZVNlcnZpY2UubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVtb3ZlSXRlbShvYmplY3Q6IEl0ZW0gfCBJdGVtR3JvdXApIHtcclxuICAgIHRoaXMuX2l0ZW1TZXJ2aWNlLnJlbW92ZUl0ZW0ob2JqZWN0KTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAncmVtb3ZlT2JqZWN0J30pO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY29weVNlbGVjdGVkT2JqZWN0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZTtcclxuICAgIHRoaXMuX2NvcHlJdGVtKHRoaXMuc2VsZWN0ZWRPYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhc3luYyBfY29weUl0ZW0ob3JpZ2luYWw6IEl0ZW0gfCBJdGVtR3JvdXApOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGNvbnN0IGlzQ3VzdG9tU2hhcGVJdGVtOiBib29sZWFuID0gb3JpZ2luYWwgaW5zdGFuY2VvZiBDdXN0b21TaGFwZUZsb29ySXRlbTtcclxuICAgIGNvbnN0IGlzQ3VzdG9tU2hhcGVXYWxsSXRlbTogYm9vbGVhbiA9IG9yaWdpbmFsIGluc3RhbmNlb2YgQ3VzdG9tU2hhcGVXYWxsSXRlbTtcclxuICAgIGNvbnN0IGlzQ3VzdG9tQ3lsaW5kZXJJdGVtOiBib29sZWFuID0gb3JpZ2luYWwgaW5zdGFuY2VvZiBDdXN0b21DeWxpbmRlckZsb29ySXRlbTtcclxuICAgIGNvbnN0IGlzQ3VzdG9tQ3lsaW5kZXJXYWxsSXRlbTogYm9vbGVhbiA9IG9yaWdpbmFsIGluc3RhbmNlb2YgQ3VzdG9tQ3lsaW5kZXJXYWxsSXRlbTtcclxuICAgIGNvbnN0IGlzUmVzaXphYmxlRG9vck9yV2luZG93OiBib29sZWFuID0gb3JpZ2luYWwgaW5zdGFuY2VvZiBJbldhbGxJdGVtICYmIG9yaWdpbmFsLmlzQ3VzdG9tO1xyXG4gICAgaWYgKGlzQ3VzdG9tU2hhcGVJdGVtIHx8IGlzQ3VzdG9tU2hhcGVXYWxsSXRlbSB8fCBpc0N1c3RvbUN5bGluZGVySXRlbSB8fCBpc0N1c3RvbUN5bGluZGVyV2FsbEl0ZW0gfHwgaXNSZXNpemFibGVEb29yT3JXaW5kb3cpIHtcclxuICAgICAgY29uc3QgY29weSA9IChvcmlnaW5hbCBhcyBDdXN0b21TaGFwZUZsb29ySXRlbSB8IEluV2FsbEl0ZW0pLmNsb25lSXRlbSgpO1xyXG4gICAgICB0aGlzLl9pdGVtU2VydmljZS5hZGRJdGVtKGNvcHkpO1xyXG4gICAgICBpZiAoY29weSBpbnN0YW5jZW9mIFdhbGxJdGVtKSB7XHJcbiAgICAgICAgY29uc3QgY2xvc2VzdFdhbGxFZGdlID0gdGhpcy5fcm9vbVNlcnZpY2UuZ2V0Q2xvc2VzdFdhbGxFZGdlKG9yaWdpbmFsLnBvc2l0aW9uLngsIG9yaWdpbmFsLnBvc2l0aW9uLnopO1xyXG4gICAgICAgIGNvcHkucGxhY2VPbkVkZ2UoY2xvc2VzdFdhbGxFZGdlKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldERyYWcsIGNvcHkpO1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlN0YXJ0RHJhZywgb3JpZ2luYWwucG9zaXRpb24pO1xyXG4gICAgfSBlbHNlIGlmIChvcmlnaW5hbC51c2VyRGF0YSAmJiBvcmlnaW5hbC51c2VyRGF0YS5pdGVtSWRlbnRpZmllcikge1xyXG4gICAgICBpZiAob3JpZ2luYWwubWV0YWRhdGEudGhpcmRQYXJ0eU1vZGVsKSB7XHJcbiAgICAgICAgLy8gV2hlbiBpdCdzIGEgdGhpcmQgcGFydHkgbW9kZWwsIHdlIHNob3VsZCBqdXN0IGNsb25lIHRoZSBPYmplY3QoM0QpXHJcbiAgICAgICAgLy8gY29uc3QgY2xvbmUgPSBvcmlnaW5hbC5jbG9uZSgpO1xyXG4gICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuQ2xvbmVUaGlyZFBhcnR5TW9kZWwsIG9yaWdpbmFsIGFzIEl0ZW0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuQ29weUlPbmVGdXJuaXR1cmVJbnRvU2NlbmVCeVNLVSwgb3JpZ2luYWwgYXMgSXRlbSk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGRyYWdnZWREYXRhOiBEcmFnZ2VkRGF0YSA9IHtcclxuICAgICAgICBuYW1lOiBvcmlnaW5hbC5uYW1lLFxyXG4gICAgICAgIHR5cGU6IG9yaWdpbmFsLm1ldGFkYXRhLml0ZW1UeXBlLFxyXG4gICAgICAgIGlPbmU6IGZhbHNlLFxyXG4gICAgICAgIG92ZXJyaWRlczoge1xyXG4gICAgICAgICAgcm90YXRpb246IG9yaWdpbmFsLnJvdGF0aW9uICYmIG9yaWdpbmFsLnJvdGF0aW9uLmNsb25lKCksXHJcbiAgICAgICAgICAvLyBzY2FsZTogb3JpZ2luYWwuc2NhbGUgJiYgb3JpZ2luYWwuc2NhbGUuY2xvbmUoKSxcclxuICAgICAgICAgIG9wZW5pbmc6IChvcmlnaW5hbCBhcyBhbnkpLm9wZW5pbmcsXHJcbiAgICAgICAgICB0ZXh0dXJlOiAob3JpZ2luYWwgYXMgYW55KS50ZXh0dXJlLFxyXG4gICAgICAgICAgaXNDb3B5OiB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldERyYWcsIGRyYWdnZWREYXRhKTtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TdGFydERyYWcsIG9yaWdpbmFsLnBvc2l0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHpvb21SZXNldCgpIHtcclxuICAgIHRoaXMuZmxvb3JwbGFubmVyLnpvb21SZXNldCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhbnRab29tT3V0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZmxvb3JwbGFubmVyLmNhbnRab29tT3V0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNhbnRab29tSW4oKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mbG9vcnBsYW5uZXIuY2FudFpvb21JbjtcclxuICB9XHJcblxyXG4gIHpvb21PdXQoKSB7XHJcbiAgICB0aGlzLmZsb29ycGxhbm5lci56b29tT3V0KCk7XHJcbiAgfVxyXG5cclxuICB6b29tSW4oKSB7XHJcbiAgICB0aGlzLmZsb29ycGxhbm5lci56b29tSW4oKTtcclxuICB9XHJcblxyXG4gIHVuc2VsZWN0QWxsKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEZsb29yID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRFZGdlID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRXYWxsID0gbnVsbDtcclxuICAgIHRoaXMuc2VsZWN0ZWRPYmplY3QgPSBudWxsO1xyXG4gICAgaWYgKCF0aGlzLl9ibG9ja0xlZnRTaWRlQmFyKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZUxlZnRTaWRlYmFyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB1cGRhdGVNb2RlKHZhbHVlOiBWaWV3TW9kZSwgc2VuZFVwZGF0ZXMgPSBmYWxzZSkge1xyXG4gICAgdGhpcy5fbW9kZSA9IHZhbHVlO1xyXG4gICAgaWYgKHNlbmRVcGRhdGVzKSB7XHJcbiAgICAgIHRoaXMudmlld01vZGVTZXJ2aWNlLnNldFZpZXdNb2RlKHRoaXMuX2Zsb29ycGxhblNlcnZpY2UuZ2V0U2l6ZSgpLCB0aGlzLl9mbG9vcnBsYW5TZXJ2aWNlLmdldENlbnRlcigpLCB2YWx1ZSk7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuVmlld01vZGVDaGFuZ2VkLCB2YWx1ZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93TGlicmFyeUNhdGVnb3JpZXMoKSB7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVQcm9kdWN0Q2F0YWxvZyk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLmNhdGVnb3JpZXNTaWRlYmFyKTtcclxuICAgIHRoaXMuX2FjdGl2ZUNhdGVnb3J5U2lkZWJhclRlbXBsYXRlID0gdGhpcy5jYXRlZ29yaWVzU2lkZWJhcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93QWNjZXNzb2lyZUNhdGVnb3JpZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVQcm9kdWN0Q2F0YWxvZyk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLmFjY2Vzc29pcmVzQ2F0ZWdvcmllc1NpZGViYXIpO1xyXG4gICAgdGhpcy5fYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGUgPSB0aGlzLmFjY2Vzc29pcmVzQ2F0ZWdvcmllc1NpZGViYXI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2hvd0FjdGl2ZUNhdGVnb3J5U2lkZWJhcigpOiB2b2lkIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0TGVmdFNpZGViYXIsIHRoaXMuX2FjdGl2ZUNhdGVnb3J5U2lkZWJhclRlbXBsYXRlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHNob3dMaWJyYXJ5Q2F0ZWdvcnkoY2F0ZWdvcnk6IENhdGVnb3J5KSB7XHJcbiAgICB0aGlzLm9iamVjdHMgPSBhd2FpdCB0aGlzLm1vZGVsc1NlcnZpY2UuZ2V0SXRlbXNGcm9tQ2F0ZWdvcnkoY2F0ZWdvcnkuaWQpO1xyXG4gICAgdGhpcy5jdXN0b21PYmplY3RzID0gdGhpcy5vYmplY3RzLmZpbHRlcihvYmplY3QgPT4gb2JqZWN0LmlzQ3VzdG9tKTtcclxuICAgIHRoaXMubGlicmFyeU9iamVjdHMgPSB0aGlzLm9iamVjdHMuZmlsdGVyKG9iamVjdCA9PiAhb2JqZWN0LmlzQ3VzdG9tKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9IGNhdGVnb3J5O1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5saWJyYXJ5U2lkZWJhcik7XHJcbiAgfVxyXG5cclxuICBzaG93U2V0dGluZ3MoKSB7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVQcm9kdWN0Q2F0YWxvZyk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLnNldHRpbmdzU2lkZWJhcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb3BlbkZhcSh1cmw6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIHdpbmRvdy5vcGVuKHVybCwgdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuZmFxVXJsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93RmFxKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2hvd0ljb24gPSB0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5ncy5mYXFVcmwgIT09IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcGVuRmVlZGJhY2sodXJsOiBzdHJpbmcpIHtcclxuICAgIHdpbmRvdy5vcGVuKHVybCwgdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuZmVlZGJhY2tVcmwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZEFsbFRvQ2FydCgpOiB2b2lkIHtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93RmVlZGJhY2soKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93SWNvbiA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmZlZWRiYWNrVXJsICE9PSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZCgpIHtcclxuICAgIGNvbnN0IHNlbGVjdGFibGVzID0gW1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRWRnZSAmJiB0aGlzLnNlbGVjdGVkV2FsbCAmJiB0aGlzLnNlbGVjdGVkV2FsbFt0aGlzLnNlbGVjdGVkRWRnZV0sXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRXYWxsLFxyXG4gICAgICB0aGlzLnNlbGVjdGVkRmxvb3IsXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3RcclxuICAgIF07XHJcbiAgICBjb25zdCBzZWxlY3RhYmxlID0gc2VsZWN0YWJsZXNbMF07XHJcbiAgICBpZiAoc2VsZWN0YWJsZSkge1xyXG4gICAgICB0aGlzLl9tb2RlID0gVmlld01vZGUuUm9vbVBsYW4zRDtcclxuICAgICAgdGhpcy5zaG93UGx1Z2luLmVtaXQoc2VsZWN0YWJsZSk7XHJcbiAgICB9IGVsc2UgaWYgKCFzZWxlY3RhYmxlKSB7XHJcbiAgICAgIHRoaXMuZG9uZS5lbWl0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmaW5kRWRnZVdhbGxQbGFjZW1lbnQod2FsbCwgZWRnZSkge1xyXG4gICAgY29uc3QgZWRnZVBsYWNlbWVudHMgPSBbJ2Zyb250RWRnZScsICdiYWNrRWRnZSddO1xyXG4gICAgcmV0dXJuIGVkZ2VQbGFjZW1lbnRzLnJlZHVjZSgocGxhY2VtZW50LCBwKSA9PiB7XHJcbiAgICAgIGlmICh3YWxsW3BdID09PSBlZGdlKSB7XHJcbiAgICAgICAgcGxhY2VtZW50ID0gcDtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcGxhY2VtZW50O1xyXG4gICAgfSwgbnVsbCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0V2FsbChzZWxlY3RlZFdhbGxFdmVudDogU2VsZWN0ZWRXYWxsRXZlbnQpIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRXYWxsID0gc2VsZWN0ZWRXYWxsRXZlbnQud2FsbDtcclxuICAgIHRoaXMuY29udGV4dE1lbnVNb3VzZUV2ZW50ID0gc2VsZWN0ZWRXYWxsRXZlbnQuZXZlbnQ7XHJcbiAgICBpZiAoc2VsZWN0ZWRXYWxsRXZlbnQud2FsbCkge1xyXG4gICAgICBpZiAoc2VsZWN0ZWRXYWxsRXZlbnQuZWRnZSkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRFZGdlID0gdGhpcy5maW5kRWRnZVdhbGxQbGFjZW1lbnQoc2VsZWN0ZWRXYWxsRXZlbnQud2FsbCwgc2VsZWN0ZWRXYWxsRXZlbnQuZWRnZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMudmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkpIHtcclxuICAgICAgICB0aGlzLnNob3dTZWxlY3RlZFdhbGxTaWRlYmFyKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZWxlY3RlZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd1NlbGVjdGVkV2FsbFNpZGViYXIoKSB7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5zZWxlY3RlZFdhbGxTaWRlYmFyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93U2VsZWN0ZWRUaHJlZWRPYmplY3RTaWRlYmFyKCkge1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0TGVmdFNpZGViYXIsIHRoaXMuc2VsZWN0ZWRUaHJlZWRPYmplY3RTaWRlYmFyKTtcclxuICB9XHJcblxyXG4gIHNlbGVjdEZsb29yKHNlbGVjdGVkRmxvb3JFdmVudDogU2VsZWN0ZWRGbG9vckV2ZW50KSB7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IHRydWU7XHJcbiAgICB0aGlzLnNlbGVjdGVkUm9vbSA9IHNlbGVjdGVkRmxvb3JFdmVudC5yb29tO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZsb29yID0gc2VsZWN0ZWRGbG9vckV2ZW50LnJvb20uZmxvb3JQbGFuZTtcclxuICAgIHRoaXMuY29udGV4dE1lbnVNb3VzZUV2ZW50ID0gc2VsZWN0ZWRGbG9vckV2ZW50LmV2ZW50O1xyXG4gICAgaWYgKHNlbGVjdGVkRmxvb3JFdmVudC5yb29tKSB7XHJcbiAgICAgIGlmICh0aGlzLnZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpKSB7XHJcbiAgICAgICAgdGhpcy5zaG93U2VsZWN0ZWRGbG9vclNpZGViYXIoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlbGVjdGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93U2VsZWN0ZWRGbG9vclNpZGViYXIoKSB7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5zZWxlY3RlZEZsb29yU2lkZWJhcik7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0Rmxvb3JUZXh0dXJlKHRleHR1cmU6IFRleHR1cmUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuX3Jvb21TZXJ2aWNlLnNldEZsb29yVGV4dHVyZSh0aGlzLnNlbGVjdGVkUm9vbSwgdGV4dHVyZSk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNhdmVTdGF0ZSwge2FjdGlvbjogJ2Zsb29yVGV4dHVyZScsIHBhdGNoOiBmYWxzZX0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEZsb29yQ29sb3IoY29sb3I6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fcm9vbVNlcnZpY2Uuc2V0Rmxvb3JDb2xvcih0aGlzLnNlbGVjdGVkUm9vbSwgY29sb3IpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICdmbG9vckNvbG9yJywgcGF0Y2g6IGZhbHNlfSk7XHJcbiAgfVxyXG5cclxuICByZW1vdmVXYWxsKHdhbGw6IFdhbGwpIHtcclxuICAgIHdhbGwucmVtb3ZlKCk7XHJcbiAgICB0aGlzLl9mbG9vcnBsYW5TZXJ2aWNlLnJlbW92ZVdhbGwod2FsbCk7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNhdmVTdGF0ZSwge2FjdGlvbjogJ3JlbW92ZVdhbGwnfSk7XHJcbiAgfVxyXG5cclxuICBzZXRXYWxsTGVuZ3RoKHtsZW5ndGgsIGF0RW5kLCBlZGdlfTogeyBsZW5ndGg6IG51bWJlciwgYXRFbmQ6IGJvb2xlYW4sIGVkZ2U/OiBIYWxmRWRnZSB9KSB7XHJcbiAgICBjb25zdCB3YWxsID0gdGhpcy5zZWxlY3RlZFdhbGw7XHJcbiAgICBjb25zdCBvcmlnTGVuZ3RoID0gZWRnZSA/IGVkZ2UuaW50ZXJpb3JEaXN0YW5jZSgpIDogd2FsbC5sZW5ndGg7XHJcbiAgICBjb25zdCBzdGFydCA9IGF0RW5kID8gd2FsbC5nZXRTdGFydCgpIDogd2FsbC5nZXRFbmQoKTtcclxuICAgIGNvbnN0IGVuZCA9IGF0RW5kID8gd2FsbC5nZXRFbmQoKSA6IHdhbGwuZ2V0U3RhcnQoKTtcclxuICAgIGNvbnN0IGR4ID0gZW5kLnggLSBzdGFydC54O1xyXG4gICAgY29uc3QgZHkgPSBlbmQueSAtIHN0YXJ0Lnk7XHJcbiAgICBjb25zdCBrID0gbGVuZ3RoIC8gb3JpZ0xlbmd0aDtcclxuICAgIGVuZC5tb3ZlKGsgKiBkeCArIHN0YXJ0LngsIGsgKiBkeSArIHN0YXJ0LnkpO1xyXG4gICAgdGhpcy5fZmxvb3JwbGFuU2VydmljZS51cGRhdGUoKTtcclxuICAgIHRoaXMuX3Jvb21TZXJ2aWNlLnVwZGF0ZUZsb29yc0FuZEVkZ2VzKCkudGhlbigoKSA9PiB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYU1vdmVtZW50Q2hhbmdlZC5uZXh0KCkpO1xyXG4gICAgdGhpcy5fbGlnaHRzU2VydmljZS51cGRhdGVBbGxPZmZzZXRzKCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNhdmVTdGF0ZSwge2FjdGlvbjogJ3dhbGxMZW5ndGgnfSk7XHJcblxyXG4gICAgaWYgKHRoaXMud2FsbExlbmd0aEluZm9EaWFsb2dFbmFibGVkICYmIHRoaXMuX2NvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFZhbHVlKENvbmZpZ3VyYXRpb25LZXkuU2hvd0RldGFpbGVkV2FsbE1lYXN1cmVtZW50cykpIHtcclxuICAgICAgaWYgKGVkZ2UgJiYgTWF0aC5yb3VuZChlZGdlLmludGVyaW9yRGlzdGFuY2UoKSkgIT09IGxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuc2hvd1dhbGxMZW5ndGhJbmZvRGlhbG9nKCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dXYWxsTGVuZ3RoSW5mb0RpYWxvZygpIHtcclxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuX2RpYWxvZy5vcGVuKEluZm9EaWFsb2dDb21wb25lbnQsIHtcclxuICAgICAgZGF0YToge1xyXG4gICAgICAgIHRpdGxlOiAnSW5mbycsXHJcbiAgICAgICAgbWVzc2FnZTpcclxuICAgICAgICAgIGBSZXN1bHRpbmcgbGVuZ3RoIG9mIHdhbGwgc2xpZ2h0bHkgZGlmZmVycyBmcm9tIGxlbmd0aCB5b3Ugc3BlY2lmaWVkLlxyXG4gICAgICAgICAgVG8gZnVydGhlciByZWZpbmUgbGVuZ3RoIG9mIHRoZSB3YWxsLCB1c2UgMkQgZmxvb3JwbGFuIGJsdWVwcmludC5gXHJcbiAgICAgIH0sXHJcbiAgICAgIG1heFdpZHRoOiAnNTAwcHgnXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX3N1YnMucHVzaChkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoZG9udFNob3dBZ2FpbiA9PiB7XHJcbiAgICAgIHRoaXMud2FsbExlbmd0aEluZm9EaWFsb2dFbmFibGVkID0gIWRvbnRTaG93QWdhaW47XHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBzZXRXYWxsSGVpZ2h0KGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkV2FsbC5oZWlnaHQgPSBoZWlnaHQ7XHJcbiAgICB0aGlzLl9yb29tU2VydmljZS51cGRhdGVDZWlsaW5ncygpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFdhbGwuZmlyZVJlZHJhdygpO1xyXG4gICAgdGhpcy5fZmxvb3JwbGFuU2VydmljZS51cGRhdGUoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAnd2FsbEhlaWdodCd9KTtcclxuICB9XHJcblxyXG4gIHNldFdhbGxUaGlja25lc3ModGhpY2tuZXNzOiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRXYWxsLnRoaWNrbmVzcyA9IHRoaWNrbmVzcztcclxuICAgIHRoaXMuX2Zsb29ycGxhblNlcnZpY2UudXBkYXRlKCk7XHJcbiAgICB0aGlzLl9yb29tU2VydmljZS51cGRhdGVGbG9vcnNBbmRFZGdlcygpLnRoZW4oKCkgPT4gdGhpcy5fY2FtZXJhU2VydmljZS5jYW1lcmFNb3ZlbWVudENoYW5nZWQubmV4dCgpKTtcclxuICAgIHRoaXMuc2VsZWN0ZWRXYWxsLmZpcmVSZWRyYXcoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAnd2FsbFRoaWNrbmVzcyd9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZXRXYWxsVGV4dHVyZSh0ZXh0dXJlOiBUZXh0dXJlKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAvLyB0aGlzLnNlbGVjdGVkRWRnZXMuZm9yRWFjaChhc3luYyAoZWRnZSkgPT4gYXdhaXQgZWRnZS5zZXRUZXh0dXJlKHRleHR1cmUpKTtcclxuICAgIGNvbnN0IGxlbjogbnVtYmVyID0gdGhpcy5zZWxlY3RlZEVkZ2VzLmxlbmd0aDtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBsZW47IGkrKykge1xyXG4gICAgICBhd2FpdCB0aGlzLnNlbGVjdGVkRWRnZXNbaV0uc2V0VGV4dHVyZSh0ZXh0dXJlKTtcclxuICAgIH1cclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNhdmVTdGF0ZSwge2FjdGlvbjogJ3dhbGxUZXh0dXJlJywgcGF0Y2g6IGZhbHNlfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgc2V0V2FsbENvbG9yKGNvbG9yOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMuc2VsZWN0ZWRFZGdlcy5mb3JFYWNoKGFzeW5jIChlZGdlKSA9PiBhd2FpdCBlZGdlLnNldENvbG9yKGNvbG9yKSk7XHJcbiAgICB0aGlzLl9zY2VuZVNlcnZpY2UubmVlZHNSZW5kZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICd3YWxsQ29sb3InLCBwYXRjaDogZmFsc2V9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdENvcm5lcihjb3JuZXI6IENvcm5lcikge1xyXG4gICAgdGhpcy5mbG9vcnBsYW5uZXIuc2VsZWN0Q29ybmVyKGNvcm5lcik7XHJcbiAgfVxyXG5cclxuICBnZXRNaW5XYWxsSGVpZ2h0KHdhbGw6IFdhbGwpOiBudW1iZXIge1xyXG4gICAgaWYgKCF3YWxsKSB7XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfVxyXG4gICAgbGV0IHJlc3VsdCA9IDA7XHJcbiAgICBjb25zdCBjYXN0ZWRXYWxsOiBhbnkgPSB3YWxsO1xyXG5cclxuICAgIGlmIChjYXN0ZWRXYWxsLml0ZW1zKSB7XHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjYXN0ZWRXYWxsLml0ZW1zKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gTWF0aC5tYXgocmVzdWx0LCBpdGVtLmhhbGZTaXplLnkgKyBpdGVtLnBvc2l0aW9uLnkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNhc3RlZFdhbGwub25JdGVtcykge1xyXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgY2FzdGVkV2FsbC5vbkl0ZW1zKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gTWF0aC5tYXgocmVzdWx0LCBpdGVtLmhhbGZTaXplLnkgKyBpdGVtLnBvc2l0aW9uLnkpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIE1hdGguY2VpbChyZXN1bHQpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWluR2xvYmFsV2FsbEhlaWdodCgpOiBudW1iZXIge1xyXG4gICAgY29uc3Qgd2FsbHMgPSB0aGlzLl9yb29tU2VydmljZS53YWxscztcclxuICAgIGlmICghd2FsbHMpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgLi4ud2FsbHMubWFwKHRoaXMuZ2V0TWluV2FsbEhlaWdodCkpO1xyXG4gIH1cclxuXHJcbiAgd2FsbHNIZWlnaHRVcGRhdGVkKGhlaWdodDogbnVtYmVyKSB7XHJcbiAgICB0aGlzLl9yb29tU2VydmljZS51cGRhdGVXYWxsSGVpZ2h0cyhoZWlnaHQpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICd3YWxsSGVpZ2h0J30pO1xyXG4gIH1cclxuXHJcbiAgc2V0RHJhZ2dlZChvYmplY3Q6IE1vZGVsSW50ZXJmYWNlKSB7XHJcbiAgICBjb25zdCBkcmFnZ2VkRGF0YTogRHJhZ2dlZERhdGEgPSB7XHJcbiAgICAgIG5hbWU6IG9iamVjdC5uYW1lLFxyXG4gICAgICB0eXBlOiArb2JqZWN0LnR5cGUsXHJcbiAgICAgIGlPbmU6IGZhbHNlXHJcbiAgICB9O1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXREcmFnLCBkcmFnZ2VkRGF0YSk7XHJcbiAgfVxyXG5cclxuICByZWxlYXNlRHJhZ2dlZCgpIHtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuRXhpdERyYWcpO1xyXG4gIH1cclxuXHJcbiAgbG9hZEZsb29yUGxhbihkYXRhKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnVuc2VsZWN0QWxsKCk7XHJcbiAgICByZXR1cm4gdGhpcy5fZmxvb3JwbGFuU2VydmljZS5sb2FkRmxvb3JwbGFuKGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0QVJTZXNzaW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRPYmplY3QpIHtcclxuICAgICAgY29uc3QgYXJPYmplY3QgPSB0aGlzLnNlbGVjdGVkT2JqZWN0LmNsb25lVmlzaWJsZSgpO1xyXG4gICAgICB0aGlzLl9zY2VuZVNlcnZpY2UuYXJNb2RlID0gdHJ1ZTtcclxuICAgICAgdGhpcy5fc2NlbmVTZXJ2aWNlLmFkZE9iamVjdChhck9iamVjdCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgYWRkVG9DYXJ0KG9iamVjdDogYW55KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAob2JqZWN0Lm1ldGFkYXRhKSB7XHJcbiAgICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgICAgIGF3YWl0IHRoaXMuX2Nvbm5lY3RvckFkYXB0ZXJTZXJ2aWNlLmluaXRDb25uZWN0b3IoXHJcbiAgICAgICAgb2JqZWN0Lm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MgPyBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncy5zZXR0aW5ncyA6IHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLFxyXG4gICAgICAgIG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzID8gb2JqZWN0Lm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MubmFtZSA6IHVuZGVmaW5lZCxcclxuICAgICAgICBmYWxzZSxcclxuICAgICAgICBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncyAmJiBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncy5leHRlcm5hbFNvdXJjZSA/IG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzLmV4dGVybmFsU291cmNlLnNvdXJjZUlkIDogbnVsbFxyXG4gICAgICApO1xyXG4gICAgICBjb25zdCBqc29uOiBzdHJpbmcgPSBhd2FpdCB0aGlzLl9jb25uZWN0b3JTZXJ2aWNlLmFkZFRvQ2FydChcclxuICAgICAgICArb2JqZWN0Lm1ldGFkYXRhLmdvb2RJZCwgb2JqZWN0Lm1ldGFkYXRhLmdvb2RUeXBlLCAxLCArb2JqZWN0Lm1ldGFkYXRhLml0ZW1JZCwgISEob2JqZWN0Lm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MgJiYgb2JqZWN0Lm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MuZXh0ZXJuYWxTb3VyY2UpKTtcclxuICAgICAgaWYgKG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzKSB7XHJcbiAgICAgICAgY29uc3QgZXh0ZXJuYWxTb3VyY2U6IEV4dGVybmFsU291cmNlQXJ0aWNsZUFkZEludGVyZmFjZSA9IHtcclxuICAgICAgICAgIGFydGljbGU6IGpzb24sXHJcbiAgICAgICAgICBxdWFudGl0eTogMSxcclxuICAgICAgICAgIGNhdGFsb2dEZWZpbml0aW9uOiBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncy5jYXRhbG9nRGVmaW5pdGlvbixcclxuICAgICAgICAgIGV4dGVybmFsU291cmNlOiBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncy5leHRlcm5hbFNvdXJjZVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLmFkZEV4dGVybmFsU291cmNlVG9DYXJ0Lm5leHQoZXh0ZXJuYWxTb3VyY2UpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2FwcEV2ZW50U2VydmljZS5hZGRUb0NhcnQubmV4dCh7YXJ0aWNsZToganNvbiwgcXVhbnRpdHk6IDF9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgbG9hZEl0ZW1zKGRhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChkYXRhICYmIGRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICBmb3IgKGNvbnN0IGl0ZW1Nb2RlbCBvZiBkYXRhKSB7XHJcbiAgICAgICAgY29uc3QgcG9zaXRpb24gPSBuZXcgVmVjdG9yMyhpdGVtTW9kZWwueHBvcywgaXRlbU1vZGVsLnlwb3MsIGl0ZW1Nb2RlbC56cG9zKTtcclxuICAgICAgICBjb25zdCBvdmVycmlkZXMgPSB7XHJcbiAgICAgICAgICB3aWR0aDogaXRlbU1vZGVsLndpZHRoLFxyXG4gICAgICAgICAgaGVpZ2h0OiBpdGVtTW9kZWwuaGVpZ2h0LFxyXG4gICAgICAgICAgdGV4dHVyZTogaXRlbU1vZGVsLnRleHR1cmUsXHJcbiAgICAgICAgICByb3RhdGlvbjogbmV3IEV1bGVyKDAsIGl0ZW1Nb2RlbC5yb3RhdGlvbiwgMCksXHJcbiAgICAgICAgICBvcGVuaW5nOiBpdGVtTW9kZWwub3BlbmluZyxcclxuICAgICAgICAgIGZyYW1lQ29sb3I6IGl0ZW1Nb2RlbC5mcmFtZUNvbG9yLFxyXG4gICAgICAgICAgZG9vckNvbG9yOiBpdGVtTW9kZWwuZG9vckNvbG9yLFxyXG4gICAgICAgICAgd2luZG93Q29sb3I6IGl0ZW1Nb2RlbC53aW5kb3dDb2xvcixcclxuICAgICAgICAgIGxvY2tlZDogaXRlbU1vZGVsLmxvY2tlZCxcclxuICAgICAgICAgIGlzR2xhc3M6IGl0ZW1Nb2RlbC5pc0dsYXNzXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zdCBtb2RlbERhdGEgPSBhd2FpdCB0aGlzLm1vZGVsc1NlcnZpY2UuZ2V0KGl0ZW1Nb2RlbC5pdGVtX25hbWUsIG92ZXJyaWRlcyk7XHJcbiAgICAgICAgaWYgKG1vZGVsRGF0YSkge1xyXG4gICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2l0ZW1TZXJ2aWNlLmFkZEpzb25JdGVtKG1vZGVsRGF0YSwgcG9zaXRpb24pO1xyXG4gICAgICAgICAgaWYgKGl0ZW1Nb2RlbC5pdGVtR3JvdXApIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVhdHRhY2hUb0l0ZW1Hcm91cChpdGVtTW9kZWwuaXRlbUdyb3VwLCBpdGVtKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgV2FsbEl0ZW0pIHtcclxuICAgICAgICAgICAgY29uc3QgY2xvc2VzdFdhbGxFZGdlID0gdGhpcy5fcm9vbVNlcnZpY2UuZ2V0Q2xvc2VzdFdhbGxFZGdlKHBvc2l0aW9uLngsIHBvc2l0aW9uLnopO1xyXG4gICAgICAgICAgICBpdGVtLnBsYWNlT25FZGdlKGNsb3Nlc3RXYWxsRWRnZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybihgVW5hYmxlIHRvIGdldCBtb2RlbCBmb3IgJHtpdGVtTW9kZWwuaXRlbV9uYW1lfSBmcm9tIE1vZGVsc1NlcnZpY2VgKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWRPYmplY3RzKHtpdGVtcywgZmxvb3JwbGFufSk6IFByb21pc2U8YW55PiB7XHJcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoW1xyXG4gICAgICB0aGlzLmxvYWRJdGVtcyhpdGVtcyksXHJcbiAgICAgIHRoaXMubG9hZEZsb29yUGxhbihmbG9vcnBsYW4pLFxyXG4gICAgXSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY29weVNjZW5lSW5zdGFuY2Uoc2F2ZUFzOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmU6IEZ1bmN0aW9uKSA9PiByZXNvbHZlKCkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0T2JqZWN0cygpIHtcclxuICAgIGNvbnN0IGl0ZW1zVG9TYXZlID0gdGhpcy5faXRlbVNlcnZpY2UuZ2V0Tm9uRnVybml0dXJlKCkubWFwKGkgPT4gdGhpcy5faXRlbVNlcmlhbGl6YXRpb25TZXJ2aWNlLml0ZW1Ub09iamVjdChpKSk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBmbG9vcnBsYW46IHRoaXMuX2Zsb29ycGxhblNlcnZpY2Uuc2F2ZUZsb29ycGxhbigpLFxyXG4gICAgICBpdGVtczogaXRlbXNUb1NhdmVcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBoYXNDdXN0b21PYmplY3RzKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tT2JqZWN0cy5sZW5ndGggPiAwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uT2JqZWN0TGlicmFyeUNsaWNrKG9iamVjdDogTW9kZWxJbnRlcmZhY2UpOiB2b2lkIHtcclxuICAgIHRoaXMucmVsZWFzZURyYWdnZWQoKTtcclxuICAgIHRoaXMuc2V0RHJhZ2dlZChvYmplY3QpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TdGFydERyYWcsIHt4OiAwLCB5OiAwfSk7XHJcbiAgICBpZiAob2JqZWN0Lm5hbWUgPT09ICdXYWxrdGhyb3VnaCBDYW1lcmEnKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZUxlZnRTaWRlYmFyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uR3JvdXBDbGljaygpIHtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuR3JvdXBPYmplY3RzKTtcclxuICAgIHRoaXMudXNlcklzR3JvdXBpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBjYW5jZWxHcm91cFNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMudXNlcklzR3JvdXBpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuQ2FuY2VsR3JvdXBPYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgb25Vbkdyb3VwQ2xpY2soKSB7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlVuZ3JvdXBPYmplY3RzKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZUNvbnRleHRNZW51KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdGFydEdyb3VwU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZTtcclxuICAgIHRoaXMudXNlcklzR3JvdXBpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TdGFydEdyb3VwT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZW5kQ29udmVyc2lvblRvVGFnTWFuYWdlcigpOiB2b2lkIHtcclxuICAgIGNvbnN0IGFydGljbGU6IEl0ZW0gfCBJdGVtR3JvdXAgPSB0aGlzLnNlbGVjdGVkT2JqZWN0O1xyXG4gICAgbGV0IGNvbnZlcnNpb25BY3Rpb246IHN0cmluZztcclxuICAgIGlmIChhcnRpY2xlIGluc3RhbmNlb2YgSXRlbSkge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE9iamVjdC5tZXRhZGF0YS5jb252ZXJzaW9uR1RNU2VuZCkge1xyXG4gICAgICAgIGNvbnZlcnNpb25BY3Rpb24gPSAncmVtb3ZlJztcclxuICAgICAgICB0aGlzLnNlbGVjdGVkT2JqZWN0Lm1ldGFkYXRhLmNvbnZlcnNpb25HVE1TZW5kID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5hZGRTZWxlY3RlZENsYXNzID0gZmFsc2U7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29udmVyc2lvbkFjdGlvbiA9ICdhZGQnO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3QubWV0YWRhdGEuY29udmVyc2lvbkdUTVNlbmQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDbGFzcyA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fZ29vZ2xlVGFnTWFuYWdlci5zZW5kUHJvZHVjdENvbnZlcnNpb24oYXJ0aWNsZS5tZXRhZGF0YSwgY29udmVyc2lvbkFjdGlvbik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9oYXNTZXR0aW5ncyhpdGVtOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlzQ3VzdG9tU2hhcGU6IGJvb2xlYW4gPSBpdGVtLm1ldGFkYXRhICYmIChcclxuICAgICAgaXNDdXN0b21TaGFwZVR5cGUoaXRlbS5tZXRhZGF0YS5pdGVtVHlwZSkgfHxcclxuICAgICAgaXNDdXN0b21TaGFwZVdhbGxUeXBlKGl0ZW0ubWV0YWRhdGEuaXRlbVR5cGUpIHx8XHJcbiAgICAgIGlzQ3VzdG9tQ3lsaW5kZXJUeXBlKGl0ZW0ubWV0YWRhdGEuaXRlbVR5cGUpIHx8XHJcbiAgICAgIGlzQ3VzdG9tQ3lsaW5kZXJXYWxsVHlwZShpdGVtLm1ldGFkYXRhLml0ZW1UeXBlKVxyXG4gICAgKTtcclxuICAgIGNvbnN0IGhhc0NvbmZpZ3VyYWJsZVRleHR1cmU6IGJvb2xlYW4gPSAhIWl0ZW0gJiYgISEoaXRlbS5tZXRhZGF0YSAmJiBpdGVtLm1ldGFkYXRhLnRleHR1cmUpO1xyXG4gICAgY29uc3QgaGFzT3BlbmluZ0F0dHJpYnV0ZTogYm9vbGVhbiA9ICEhaXRlbSAmJiAhIWl0ZW0ub3BlbmluZztcclxuICAgIGNvbnN0IGlzU2NhbGFibGU6IGJvb2xlYW4gPSAhIWl0ZW0gJiYgISEoaXRlbS5tZXRhZGF0YSAmJiBpdGVtLm1ldGFkYXRhLnNjYWxhYmxlKTtcclxuXHJcbiAgICByZXR1cm4gaXNDdXN0b21TaGFwZSB8fCBoYXNDb25maWd1cmFibGVUZXh0dXJlIHx8IGhhc09wZW5pbmdBdHRyaWJ1dGUgfHwgaXNTY2FsYWJsZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzQ29uZmlndXJhYmxlKGl0ZW06IEl0ZW0gfCBJdGVtR3JvdXApOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhKGl0ZW0gaW5zdGFuY2VvZiBJdGVtR3JvdXApICYmICEhaXRlbSAmJiAhIWl0ZW0ubWV0YWRhdGEgJiYgISFpdGVtLm1ldGFkYXRhLml0ZW1JZGVudGlmaWVyICYmIGl0ZW0uY29uZmlndXJhYmxlICYmXHJcbiAgICAgICFpdGVtLmFsbHdheXNDb25maWd1cmVNb2RlICYmICFpdGVtLm9ic29sZXRlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNDb252ZXJzaW9uSXRlbShpdGVtOiBJdGVtIHwgSXRlbUdyb3VwKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoaXRlbS5tZXRhZGF0YS5pb25lKSB7XHJcbiAgICAgIHJldHVybiBpdGVtLm1ldGFkYXRhLmlvbmU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0RlbGV0YWJsZShpdGVtOiBJdGVtIHwgSXRlbUdyb3VwKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIShpdGVtIGluc3RhbmNlb2YgUm9vbSB8fCBpdGVtIGluc3RhbmNlb2YgV2FsbCkgJiZcclxuICAgICAgKChpdGVtIGluc3RhbmNlb2YgSXRlbSAmJiBpdGVtLmNhbkRlbGV0ZSkgfHwgIShpdGVtIGluc3RhbmNlb2YgSXRlbSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNDb3B5YWJsZShpdGVtOiBJdGVtIHwgSXRlbUdyb3VwKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBpc05vdFJvb21PcldhbGxPckRlY29yYXRpb246IGJvb2xlYW4gPSAhKGl0ZW0gaW5zdGFuY2VvZiBSb29tIHx8IGl0ZW0gaW5zdGFuY2VvZiBXYWxsIHx8IGl0ZW0gaW5zdGFuY2VvZiBGbG9vclBsYW5lSXRlbSk7XHJcbiAgICBjb25zdCBpc0NvcHlhYmxlSXRlbTogYm9vbGVhbiA9ICgoaXRlbSBpbnN0YW5jZW9mIEl0ZW0gJiYgaXRlbS5jYW5Db3B5ICYmICFpdGVtLm9ic29sZXRlKSB8fCAhKGl0ZW0gaW5zdGFuY2VvZiBJdGVtKSkgJiZcclxuICAgICAgIXRoaXMuX2l0ZW1TZXJ2aWNlLmdldFdhbGt0aHJvdWdoQ2FtZXJhKCk7XHJcbiAgICByZXR1cm4gaXNOb3RSb29tT3JXYWxsT3JEZWNvcmF0aW9uICYmIGlzQ29weWFibGVJdGVtO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfcmVhdHRhY2hUb0l0ZW1Hcm91cChpdGVtR3JvdXAsIG9iamVjdCkge1xyXG4gICAgdGhpcy5faXRlbVNlcnZpY2UucmVtb3ZlSXRlbShvYmplY3QpO1xyXG4gICAgaXRlbUdyb3VwLmFkZEl0ZW0ob2JqZWN0KTtcclxuICAgIGl0ZW1Hcm91cC5jcmVhdGVCb3VuZGFyeUJveCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBpZiAoIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmFsdEtleSAmJiAhZXZlbnQuc2hpZnRLZXkpIHtcclxuICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7XHJcbiAgICAgICAgY2FzZSBLZXkuQzpcclxuICAgICAgICAgIGlmICh0aGlzLl9tb2RlICE9PSBWaWV3TW9kZS5GbG9vclBsYW4yRCAmJiAhdGhpcy5fdGV4dElucHV0QWN0aXZlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TaG93UHJvZHVjdENhdGFsb2cpO1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVMZWZ0U2lkZWJhcik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEtleS5BOlxyXG4gICAgICAgICAgLy8gaWYgKHRoaXMuX2FjdGl2ZUNhdGVnb3J5U2lkZWJhclRlbXBsYXRlICE9PSBudWxsICYmIHRoaXMuX2FjdGl2ZUNhdGVnb3J5U2lkZWJhclRlbXBsYXRlID09PSB0aGlzLmNhdGVnb3JpZXNTaWRlYmFyKSB7XHJcbiAgICAgICAgICAvLyAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZUxlZnRTaWRlYmFyKTtcclxuICAgICAgICAgIC8vICAgdGhpcy5fYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGUgPSBudWxsO1xyXG4gICAgICAgICAgLy8gfSBlbHNlXHJcbiAgICAgICAgICBpZiAodGhpcy5fbW9kZSAhPT0gVmlld01vZGUuRmxvb3JQbGFuMkQgJiYgIXRoaXMuX2NhdGFsb2dJc1Nob3duICYmICF0aGlzLl90ZXh0SW5wdXRBY3RpdmUoKSkge1xyXG4gICAgICAgICAgICB0aGlzLnNob3dMaWJyYXJ5Q2F0ZWdvcmllcygpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBLZXkuVjpcclxuICAgICAgICAgIGlmICghdGhpcy5fY2F0YWxvZ0lzU2hvd24gJiYgIXRoaXMuX3RleHRJbnB1dEFjdGl2ZSgpKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9tb2RlID09PSBWaWV3TW9kZS5Sb29tUGxhbjNEKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy51cGRhdGVNb2RlKFZpZXdNb2RlLkZsb29yUGxhbjJELCB0cnVlKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1vZGUoVmlld01vZGUuUm9vbVBsYW4zRCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgS2V5LkVzYzpcclxuICAgICAgICAgIGlmICh0aGlzLl9tb2RlICE9PSBWaWV3TW9kZS5GbG9vclBsYW4yRCkge1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVMZWZ0U2lkZWJhcik7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90ZXh0SW5wdXRBY3RpdmUoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBpbnB1dHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaW5wdXQnKTtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICBpZiAoaW5wdXRzWzBdLnR5cGUgPT09ICd0ZXh0JyAmJiBpbnB1dHNbaV0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuIl19
1703
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9vbS1wbGFubmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jbGllbnQvYXBwL3BsdWdpbnMvcm9vbS1wbGFubmVyL3Jvb20tcGxhbm5lci9yb29tLXBsYW5uZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFckMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFDeEYsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sbUNBQW1DLENBQUM7QUFHM0QsT0FBTyxFQUNMLG9CQUFvQixFQUNwQix3QkFBd0IsRUFDeEIsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsVUFBVSxFQUNYLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFtQixVQUFVLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBb0J4RCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUMzRSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0NBQXNDLENBQUM7QUFJakUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNENBQTRDLENBQUM7QUFDaEYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMkNBQTJDLENBQUM7QUFDOUUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sK0NBQStDLENBQUM7QUFDdEYsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sOENBQThDLENBQUM7QUFHcEYsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFFdEYsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNqQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0scUNBQXFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBc1luRSxNQUFNLE9BQU8sb0JBQW9CO0lBNEUvQixZQUNTLFdBQTBDLEVBQzFDLGVBQWdDLEVBQ2hDLGFBQTRCLEVBQzNCLGVBQStCLEVBQy9CLFdBQW9DLEVBQ3BDLGVBQTBDLEVBQzFDLEdBQXNCLEVBQ3RCLGFBQTJCLEVBQzNCLGVBQWtDLEVBQ2xDLE9BQWtCLEVBQ2xCLHFCQUEyQyxFQUMzQyxpQkFBbUMsRUFDbkMsYUFBMkIsRUFDM0IsV0FBdUIsRUFDdkIsWUFBeUIsRUFDekIsY0FBNkIsRUFDN0IsWUFBeUIsRUFDekIseUJBQW1ELEVBQ25ELGNBQTZCLEVBQzdCLFVBQXFCLEVBQ3RCLFdBQXdCLEVBQ3hCLGVBQTZDLEVBQzVDLGlCQUEwQyxFQUMxQyxzQkFBNkMsRUFDN0MsZ0JBQThDLEVBQzlDLGlCQUFnRCxFQUNoRCx3QkFBOEQ7UUExQi9ELGdCQUFXLEdBQVgsV0FBVyxDQUErQjtRQUMxQyxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDM0Isb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQy9CLGdCQUFXLEdBQVgsV0FBVyxDQUF5QjtRQUNwQyxvQkFBZSxHQUFmLGVBQWUsQ0FBMkI7UUFDMUMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQWM7UUFDM0Isb0JBQWUsR0FBZixlQUFlLENBQW1CO1FBQ2xDLFlBQU8sR0FBUCxPQUFPLENBQVc7UUFDbEIsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUFzQjtRQUMzQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ25DLGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBQzNCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1FBQ3ZCLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBQ3pCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLGlCQUFZLEdBQVosWUFBWSxDQUFhO1FBQ3pCLDhCQUF5QixHQUF6Qix5QkFBeUIsQ0FBMEI7UUFDbkQsbUJBQWMsR0FBZCxjQUFjLENBQWU7UUFDN0IsZUFBVSxHQUFWLFVBQVUsQ0FBVztRQUN0QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN4QixvQkFBZSxHQUFmLGVBQWUsQ0FBOEI7UUFDNUMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF5QjtRQUMxQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXVCO1FBQzdDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBOEI7UUFDOUMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUErQjtRQUNoRCw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQXNDO1FBakZsRCxlQUFVLEdBQUcsT0FBTyxDQUFDO1FBR2pDLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFCLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3JDLGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUU3QixTQUFJLEdBQW9CLFFBQVEsQ0FBQztRQUNqQyxhQUFRLEdBQW9CLFFBQVEsQ0FBQztRQUNyQyxjQUFTLEdBQW9CLFFBQVEsQ0FBQztRQVF0RCxvQkFBZSxHQUFZLElBQUksQ0FBQztRQVF6QixnQ0FBMkIsR0FBRyxJQUFJLENBQUM7UUFZbkMsbUJBQWMsR0FBWSxJQUFJLENBQUM7UUFDL0IsaUJBQVksR0FBWSxJQUFJLENBQUM7UUFFN0Isa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsNkJBQXdCLEdBQVksS0FBSyxDQUFDO1FBQzFDLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFDMUIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBQ3RDLHFCQUFnQixHQUFZLEtBQUssQ0FBQztRQUNsQyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUU5QixVQUFLLEdBQW1CLEVBQUUsQ0FBQztRQUUzQixVQUFLLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUU1QixzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUErQmhDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFHTSxnQkFBZ0IsQ0FBQyxLQUFvQjtRQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixPQUFPLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzdDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVE7Z0JBQzlDLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTO2FBQ2pELENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVLLFFBQVE7O1lBQ1osSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3pGLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDL0YsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3pGLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUV6RixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3pELFFBQVEsRUFBRSxJQUFJLENBQUMsa0JBQWtCO2dCQUNqQyxRQUFRLEVBQUUsS0FBSztnQkFDZixRQUFRLEVBQUUsR0FBRzthQUNkLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRTtnQkFDekQsUUFBUSxFQUFFLElBQUksQ0FBQyxzQkFBc0I7Z0JBQ3JDLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFFBQVEsRUFBRSxHQUFHO2FBQ2QsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFO2dCQUN6RCxRQUFRLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtnQkFDaEMsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsUUFBUSxFQUFFLEdBQUc7YUFDZCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3pELFFBQVEsRUFBRSxJQUFJLENBQUMsaUJBQWlCO2dCQUNoQyxRQUFRLEVBQUUsS0FBSztnQkFDZixRQUFRLEVBQUUsR0FBRzthQUNkLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRTtnQkFDekQsUUFBUSxFQUFFLElBQUksQ0FBQyxtQkFBbUI7Z0JBQ2xDLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFFBQVEsRUFBRSxHQUFHO2FBQ2QsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFO2dCQUN6RCxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0JBQzdCLFFBQVEsRUFBRSxLQUFLO2dCQUNmLFFBQVEsRUFBRSxHQUFHO2FBQ2QsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLG1CQUFtQixFQUFFO2dCQUN6RCxRQUFRLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtnQkFDbEMsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsUUFBUSxFQUFFLEdBQUc7YUFDZCxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUU7Z0JBQ3pELFFBQVEsRUFBRSxJQUFJLENBQUMsZUFBZTtnQkFDOUIsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsUUFBUSxFQUFFLElBQUk7YUFDZixDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDYixJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxDQUFDLFVBQXNCLEVBQUUsRUFBRTtnQkFDckUsSUFBSSxVQUFVLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztvQkFDakUsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO2lCQUMzRTtZQUNILENBQUMsQ0FBQyxFQUNGLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQWMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQy9GLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFDLFdBQVcsRUFBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsRUFDNUgsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUMsV0FBVyxFQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUMzSCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsRUFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUMsRUFBQyxhQUFhLEVBQUMsRUFBRSxFQUFFO2dCQUMvRSxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztZQUNyQyxDQUFDLENBQUMsRUFDRixJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQzdGLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEVBQzdGLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLEVBQUU7Z0JBQ3ZFLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO2dCQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztZQUNoQyxDQUFDLENBQUMsRUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQyxFQUN2RixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxpQkFBb0MsRUFBRSxFQUFFO2dCQUNoRixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7b0JBQ3RCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztpQkFDeEQ7Z0JBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsRUFDRixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxrQkFBc0MsRUFBRSxFQUFFO2dCQUNuRixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7b0JBQ3JCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztpQkFDeEQ7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUN2QyxDQUFDLENBQUMsRUFDRixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxJQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDMUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ2hGLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxFQUNqRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsRUFDbEcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLGdCQUFnQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDLEVBQ3ZHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQWtCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUM1SCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsc0JBQXNCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLENBQzNGLENBQUM7WUFFRixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEtBQUksTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFBLENBQUM7UUFDaEgsQ0FBQztLQUFBO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFNBQVMsQ0FBQztRQUNwQyxJQUFJLENBQUMsc0JBQXNCLEdBQUcsU0FBUyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxTQUFTLENBQUM7UUFDckMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUNuQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDO1FBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7UUFDbkMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLFNBQVMsQ0FBQztRQUM5QyxJQUFJLENBQUMseUJBQXlCLEdBQUcsU0FBUyxDQUFDO1FBQzNDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxTQUFTLENBQUM7UUFDOUMsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUM7UUFDakMsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUM7UUFDaEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLFNBQVMsQ0FBQztRQUN2QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO1FBQ3JDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxTQUFTLENBQUM7UUFDN0MsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQztRQUN0QyxJQUFJLENBQUMsOEJBQThCLEdBQUcsU0FBUyxDQUFDO0lBQ2xELENBQUM7SUFFTyx1QkFBdUI7UUFDN0IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQW9CLEVBQUUsRUFBRTtZQUMvRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUM1QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQztZQUMxQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7WUFFeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxFQUFFLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFO2dCQUMvRyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDNUM7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxJQUFjO1FBQ3JDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQsY0FBYyxDQUFDLE1BQXdCO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQztRQUU3QixJQUFJLElBQUksQ0FBQyxjQUFjLFlBQVksU0FBUyxFQUFFO1lBQzVDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxJQUFJLENBQUM7U0FDdEM7YUFBTSxJQUFJLElBQUksQ0FBQyxjQUFjLFlBQVksSUFBSSxFQUFFO1lBQzlDLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUN2RSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQzthQUMzQjtZQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNqRSxJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDekUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQy9ELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7WUFFeEUsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtnQkFDbEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDO2FBQ3hFO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7YUFDL0I7U0FDRjtRQUVELElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbEIsQ0FBQztJQUVELHlCQUF5QjtRQUN2QixJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUUxRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQztRQUM5QyxJQUFJLFFBQVEsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRTtZQUNsRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1NBQ3ZGO2FBQU0sSUFBSSxRQUFRLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksd0JBQXdCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7WUFDL0csSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQztTQUMxRjthQUFNO1lBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztTQUNuRjtJQUNILENBQUM7SUFFTSw4QkFBOEIsQ0FBQyxHQUFpQjtRQUNyRCxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUM3QixHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyx3QkFBd0IsR0FBRyxLQUFLLENBQUM7SUFDeEMsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUU7WUFDakUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDN0I7SUFDSCxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTSx3QkFBd0I7UUFDN0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7U0FDMUQ7SUFDSCxDQUFDO0lBRU8sYUFBYSxDQUFDLE1BQXdCO1FBQzVDLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDeEMsTUFBTSxXQUFXLEdBQWMsTUFBTyxDQUFDLFdBQVcsQ0FBQztZQUNuRCxJQUFJLFdBQVcsRUFBRTtnQkFDZixXQUFXLENBQUMsVUFBVSxDQUFPLE1BQU0sQ0FBQyxDQUFDO2dCQUNyQyxXQUFXLENBQUMsWUFBWSxDQUFPLE1BQU0sQ0FBQyxDQUFDO2dCQUN2QyxXQUFXLENBQUMsVUFBVSxFQUFFLENBQUM7YUFDMUI7U0FDRjthQUFNLElBQUksZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDcEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLENBQUM7WUFDL0QsT0FBTztTQUNSO1FBQ0QsSUFBSSxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMxQjthQUFNO1lBQ0wsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztTQUN2QztJQUNILENBQUM7SUFFTyxXQUFXLENBQUMsTUFBd0I7UUFDMUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFSyxrQkFBa0I7O1lBQ3RCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1lBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7S0FBQTtJQUVhLFNBQVMsQ0FBQyxRQUEwQjs7WUFDaEQsTUFBTSxpQkFBaUIsR0FBWSxRQUFRLFlBQVksb0JBQW9CLENBQUM7WUFDNUUsTUFBTSxxQkFBcUIsR0FBWSxRQUFRLFlBQVksbUJBQW1CLENBQUM7WUFDL0UsTUFBTSxvQkFBb0IsR0FBWSxRQUFRLFlBQVksdUJBQXVCLENBQUM7WUFDbEYsTUFBTSx3QkFBd0IsR0FBWSxRQUFRLFlBQVksc0JBQXNCLENBQUM7WUFDckYsTUFBTSx1QkFBdUIsR0FBWSxRQUFRLFlBQVksVUFBVSxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUM7WUFDN0YsSUFBSSxpQkFBaUIsSUFBSSxxQkFBcUIsSUFBSSxvQkFBb0IsSUFBSSx3QkFBd0IsSUFBSSx1QkFBdUIsRUFBRTtnQkFDN0gsTUFBTSxJQUFJLEdBQUksUUFBOEMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDekUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ2hDLElBQUksSUFBSSxZQUFZLFFBQVEsRUFBRTtvQkFDNUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUN2RyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2lCQUNuQztnQkFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNyRTtpQkFBTSxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUU7Z0JBQ2hFLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUU7b0JBQ3JDLHFFQUFxRTtvQkFDckUsa0NBQWtDO29CQUNsQyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsb0JBQW9CLEVBQUUsUUFBZ0IsQ0FBQyxDQUFDO2lCQUMvRTtxQkFBTTtvQkFDTCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsK0JBQStCLEVBQUUsUUFBZ0IsQ0FBQyxDQUFDO2lCQUMxRjthQUNGO2lCQUFNO2dCQUNMLE1BQU0sV0FBVyxHQUFnQjtvQkFDL0IsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJO29CQUNuQixJQUFJLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRO29CQUNoQyxJQUFJLEVBQUUsS0FBSztvQkFDWCxTQUFTLEVBQUU7d0JBQ1QsUUFBUSxFQUFFLFFBQVEsQ0FBQyxRQUFRLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7d0JBQ3hELG1EQUFtRDt3QkFDbkQsT0FBTyxFQUFHLFFBQWdCLENBQUMsT0FBTzt3QkFDbEMsT0FBTyxFQUFHLFFBQWdCLENBQUMsT0FBTzt3QkFDbEMsTUFBTSxFQUFFLElBQUk7cUJBQ2I7aUJBQ0YsQ0FBQztnQkFDRixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUM1RCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUNyRTtRQUNILENBQUM7S0FBQTtJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxJQUFJLFdBQVc7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO0lBQ3RDLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFO1lBQzNCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztTQUN4RDtJQUNILENBQUM7SUFFTSxVQUFVLENBQUMsS0FBZSxFQUFFLFdBQVcsR0FBRyxLQUFLO1FBQ3BELElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksV0FBVyxFQUFFO1lBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUM5RyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQy9EO0lBQ0gsQ0FBQztJQUVELHFCQUFxQjtRQUNuQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5RSxJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQy9ELENBQUM7SUFFTSx3QkFBd0I7UUFDN0IsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLDhCQUE4QixHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQztJQUMxRSxDQUFDO0lBRU0seUJBQXlCO1FBQzlCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO0lBQzdGLENBQUM7SUFFSyxtQkFBbUIsQ0FBQyxRQUFrQjs7WUFDMUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3RFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7WUFDakMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDN0UsQ0FBQztLQUFBO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRU0sT0FBTyxDQUFDLEdBQVc7UUFDeEIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU0sT0FBTztRQUNaLE9BQU8sSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDO0lBQzVFLENBQUM7SUFFTSxZQUFZLENBQUMsR0FBVztRQUM3QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRU0sWUFBWTtJQUNuQixDQUFDO0lBRU0sWUFBWTtRQUNqQixPQUFPLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQztJQUNqRixDQUFDO0lBRUQsUUFBUTtRQUNOLE1BQU0sV0FBVyxHQUFHO1lBQ2xCLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDOUUsSUFBSSxDQUFDLFlBQVk7WUFDakIsSUFBSSxDQUFDLGFBQWE7WUFDbEIsSUFBSSxDQUFDLGNBQWM7U0FDcEIsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxJQUFJLFVBQVUsRUFBRTtZQUNkLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztZQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNsQzthQUFNLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNsQjtJQUNILENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsSUFBSTtRQUM5QixNQUFNLGNBQWMsR0FBRyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNqRCxPQUFPLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDNUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFO2dCQUNwQixTQUFTLEdBQUcsQ0FBQyxDQUFDO2FBQ2Y7WUFDRCxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRU0sVUFBVSxDQUFDLGlCQUFvQztRQUNwRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUM7UUFDM0MsSUFBSSxDQUFDLHFCQUFxQixHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQztRQUNyRCxJQUFJLGlCQUFpQixDQUFDLElBQUksRUFBRTtZQUMxQixJQUFJLGlCQUFpQixDQUFDLElBQUksRUFBRTtnQkFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2hHO1lBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxFQUFFO2dCQUN6QyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQzthQUNoQztZQUNELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNqQjtJQUNILENBQUM7SUFFRCx1QkFBdUI7UUFDckIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNsRixDQUFDO0lBRU0sK0JBQStCO1FBQ3BDLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVELFdBQVcsQ0FBQyxrQkFBc0M7UUFDaEQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDO1FBQzVDLElBQUksQ0FBQyxhQUFhLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN4RCxJQUFJLENBQUMscUJBQXFCLEdBQUcsa0JBQWtCLENBQUMsS0FBSyxDQUFDO1FBQ3RELElBQUksa0JBQWtCLENBQUMsSUFBSSxFQUFFO1lBQzNCLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsRUFBRTtnQkFDekMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7YUFDakM7WUFDRCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDakI7SUFDSCxDQUFDO0lBRUQsd0JBQXdCO1FBQ3RCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVZLGVBQWUsQ0FBQyxPQUFnQjs7WUFDM0MsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ3BFLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQzNGLENBQUM7S0FBQTtJQUVNLGFBQWEsQ0FBQyxLQUFhO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFVO1FBQ25CLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBQyxNQUFNLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsYUFBYSxDQUFDLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQXNEO1FBQ3RGLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDL0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUNoRSxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3RELE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDcEQsTUFBTSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUMzQixNQUFNLENBQUMsR0FBRyxNQUFNLEdBQUcsVUFBVSxDQUFDO1FBQzlCLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO1FBRXpFLElBQUksSUFBSSxDQUFDLDJCQUEyQixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsNEJBQTRCLENBQUMsRUFBRTtZQUMxSCxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLEtBQUssTUFBTSxFQUFFO2dCQUMxRCxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQzthQUNqQztTQUNGO0lBQ0gsQ0FBQztJQUVELHdCQUF3QjtRQUN0QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUN2RCxJQUFJLEVBQUU7Z0JBQ0osS0FBSyxFQUFFLE1BQU07Z0JBQ2IsT0FBTyxFQUNMOzRFQUNrRTthQUNyRTtZQUNELFFBQVEsRUFBRSxPQUFPO1NBQ2xCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUU7WUFDaEUsSUFBSSxDQUFDLDJCQUEyQixHQUFHLENBQUMsYUFBYSxDQUFDO1FBQ3BELENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRUQsYUFBYSxDQUFDLE1BQWM7UUFDMUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxTQUFpQjtRQUNoQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDeEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RHLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxFQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFWSxjQUFjLENBQUMsT0FBZ0I7O1lBQzFDLDhFQUE4RTtZQUM5RSxNQUFNLEdBQUcsR0FBVyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUM5QyxLQUFLLElBQUksQ0FBQyxHQUFXLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNwQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ2pEO1lBQ0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQzFGLENBQUM7S0FBQTtJQUVZLFlBQVksQ0FBQyxLQUFhOztZQUNyQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFPLElBQUksRUFBRSxFQUFFLGdEQUFDLE9BQUEsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBLEdBQUEsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN0QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEVBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztRQUN4RixDQUFDO0tBQUE7SUFFRCxZQUFZLENBQUMsTUFBYztRQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsSUFBVTtRQUN6QixJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ1QsT0FBTyxDQUFDLENBQUM7U0FDVjtRQUNELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLE1BQU0sVUFBVSxHQUFRLElBQUksQ0FBQztRQUU3QixJQUFJLFVBQVUsQ0FBQyxLQUFLLEVBQUU7WUFDcEIsS0FBSyxNQUFNLElBQUksSUFBSSxVQUFVLENBQUMsS0FBSyxFQUFFO2dCQUNuQyxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM5RDtTQUNGO1FBRUQsSUFBSSxVQUFVLENBQUMsT0FBTyxFQUFFO1lBQ3RCLEtBQUssTUFBTSxJQUFJLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRTtnQkFDckMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDOUQ7U0FDRjtRQUVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDVixPQUFPLENBQUMsQ0FBQztTQUNWO1FBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRUQsa0JBQWtCLENBQUMsTUFBYztRQUMvQixJQUFJLENBQUMsWUFBWSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBQyxNQUFNLEVBQUUsWUFBWSxFQUFDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsVUFBVSxDQUFDLE1BQXNCO1FBQy9CLE1BQU0sV0FBVyxHQUFnQjtZQUMvQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUk7WUFDbEIsSUFBSSxFQUFFLEtBQUs7U0FDWixDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQsYUFBYSxDQUFDLElBQUk7UUFDaEIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU0sY0FBYztRQUNuQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDdkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDeEM7SUFDSCxDQUFDO0lBRVksU0FBUyxDQUFDLE1BQVc7O1lBQ2hDLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7Z0JBQzdCLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixDQUFDLGFBQWEsQ0FDL0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxFQUM1RyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUNwRixLQUFLLEVBQ0wsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ3RKLENBQUM7Z0JBQ0YsTUFBTSxJQUFJLEdBQVcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUN6RCxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO2dCQUMxSyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLEVBQUU7b0JBQ3BDLE1BQU0sY0FBYyxHQUFzQzt3QkFDeEQsT0FBTyxFQUFFLElBQUk7d0JBQ2IsUUFBUSxFQUFFLENBQUM7d0JBQ1gsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUI7d0JBQ3JFLGNBQWMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGNBQWM7cUJBQ2hFLENBQUM7b0JBQ0YsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDcEU7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO2lCQUNwRTthQUNGO1FBQ0gsQ0FBQztLQUFBO0lBRUssU0FBUyxDQUFDLElBQUk7O1lBQ2xCLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUMzQixLQUFLLE1BQU0sU0FBUyxJQUFJLElBQUksRUFBRTtvQkFDNUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDN0UsTUFBTSxTQUFTLEdBQUc7d0JBQ2hCLEtBQUssRUFBRSxTQUFTLENBQUMsS0FBSzt3QkFDdEIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNO3dCQUN4QixPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87d0JBQzFCLFFBQVEsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7d0JBQzdDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTzt3QkFDMUIsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO3dCQUNoQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7d0JBQzlCLFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVzt3QkFDbEMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNO3dCQUN4QixPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87cUJBQzNCLENBQUM7b0JBQ0YsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO29CQUMvRSxJQUFJLFNBQVMsRUFBRTt3QkFDYixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUM7d0JBQ2hFLElBQUksU0FBUyxDQUFDLFNBQVMsRUFBRTs0QkFDdkIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7eUJBQ3REO3dCQUNELElBQUksSUFBSSxZQUFZLFFBQVEsRUFBRTs0QkFDNUIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDckYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQzt5QkFDbkM7cUJBQ0Y7eUJBQU07d0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQywyQkFBMkIsU0FBUyxDQUFDLFNBQVMscUJBQXFCLENBQUMsQ0FBQztxQkFDbkY7aUJBQ0Y7YUFDRjtRQUNILENBQUM7S0FBQTtJQUVELFdBQVcsQ0FBQyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUM7UUFDNUIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDO1lBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxNQUFlO1FBQ3RDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFpQixFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxVQUFVO1FBQ1IsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakgsT0FBTztZQUNMLFNBQVMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFO1lBQ2pELEtBQUssRUFBRSxXQUFXO1NBQ25CLENBQUM7SUFDSixDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVNLG9CQUFvQixDQUFDLE1BQXNCO1FBQ2hELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxvQkFBb0IsRUFBRTtZQUN4QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDeEQ7SUFDSCxDQUFDO0lBRU0sWUFBWTtRQUNqQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVNLG9CQUFvQjtRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsY0FBYztRQUNaLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN4RCxDQUFDO0lBRU0sZ0JBQWdCO1FBQ3JCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFFTSxtQkFBbUI7UUFDeEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVNLDBCQUEwQjtRQUMvQixNQUFNLE9BQU8sR0FBcUIsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUN0RCxJQUFJLGdCQUF3QixDQUFDO1FBQzdCLElBQUksT0FBTyxZQUFZLElBQUksRUFBRTtZQUMzQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFO2dCQUNsRCxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztnQkFDdkQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQzthQUMvQjtpQkFBTTtnQkFDTCxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztnQkFDdEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQzthQUM5QjtZQUNELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7U0FDbEY7SUFDSCxDQUFDO0lBRU8sWUFBWSxDQUFDLElBQVM7UUFDNUIsTUFBTSxhQUFhLEdBQVksSUFBSSxDQUFDLFFBQVEsSUFBSSxDQUM5QyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUN6QyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUM3QyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUM1Qyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUNqRCxDQUFDO1FBQ0YsTUFBTSxzQkFBc0IsR0FBWSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3RixNQUFNLG1CQUFtQixHQUFZLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDOUQsTUFBTSxVQUFVLEdBQVksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFbEYsT0FBTyxhQUFhLElBQUksc0JBQXNCLElBQUksbUJBQW1CLElBQUksVUFBVSxDQUFDO0lBQ3RGLENBQUM7SUFFTyxlQUFlLENBQUMsSUFBc0I7UUFDNUMsT0FBTyxDQUFDLENBQUMsSUFBSSxZQUFZLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxZQUFZO1lBQ3JILENBQUMsSUFBSSxDQUFDLG9CQUFvQixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUNqRCxDQUFDO0lBRU8saUJBQWlCLENBQUMsSUFBc0I7UUFDOUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRTtZQUN0QixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDO1NBQzNCO2FBQU07WUFDTCxPQUFPLEtBQUssQ0FBQztTQUNkO0lBQ0gsQ0FBQztJQUVPLFlBQVksQ0FBQyxJQUFzQjtRQUN6QyxPQUFPLENBQUMsQ0FBQyxJQUFJLFlBQVksSUFBSSxJQUFJLElBQUksWUFBWSxJQUFJLENBQUM7WUFDcEQsQ0FBQyxDQUFDLElBQUksWUFBWSxJQUFJLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRU8sV0FBVyxDQUFDLElBQXNCO1FBQ3hDLE1BQU0sMkJBQTJCLEdBQVksQ0FBQyxDQUFDLElBQUksWUFBWSxJQUFJLElBQUksSUFBSSxZQUFZLElBQUksSUFBSSxJQUFJLFlBQVksY0FBYyxDQUFDLENBQUM7UUFDL0gsTUFBTSxjQUFjLEdBQVksQ0FBQyxDQUFDLElBQUksWUFBWSxJQUFJLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxZQUFZLElBQUksQ0FBQyxDQUFDO1lBQ25ILENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVDLE9BQU8sMkJBQTJCLElBQUksY0FBYyxDQUFDO0lBQ3ZELENBQUM7SUFFTyxvQkFBb0IsQ0FBQyxTQUFTLEVBQUUsTUFBTTtRQUM1QyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxTQUFTLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBb0I7UUFDeEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUN0RCxRQUFRLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JCLEtBQUssR0FBRyxDQUFDLENBQUM7b0JBQ1IsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTt3QkFDbkUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7d0JBQzFELElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQztxQkFDeEQ7b0JBQ0QsTUFBTTtnQkFDUixLQUFLLEdBQUcsQ0FBQyxDQUFDO29CQUNSLHdIQUF3SDtvQkFDeEgsNERBQTREO29CQUM1RCxnREFBZ0Q7b0JBQ2hELFNBQVM7b0JBQ1QsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUU7d0JBQzVGLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO3FCQUM5QjtvQkFDRCxNQUFNO2dCQUNSLEtBQUssR0FBRyxDQUFDLENBQUM7b0JBQ1IsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTt3QkFDckQsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxVQUFVLEVBQUU7NEJBQ3RDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQzt5QkFDN0M7NkJBQU07NEJBQ0wsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO3lCQUM1QztxQkFDRjtvQkFDRCxNQUFNO2dCQUNSLEtBQUssR0FBRyxDQUFDLEdBQUc7b0JBQ1YsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxXQUFXLEVBQUU7d0JBQ3ZDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQzt3QkFDdkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLENBQUM7cUJBQzNEO29CQUNELE1BQU07YUFDVDtTQUNGO0lBQ0gsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLGFBQWEsRUFBRTtnQkFDckUsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOztrSEExNkJVLG9CQUFvQjtzR0FBcEIsb0JBQW9CLG1WQUNwQixxQkFBcUIsOHZFQTVYdEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVYVDs0RkFJVSxvQkFBb0I7a0JBN1hoQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxpQkFBaUI7b0JBQzNCLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdVhUO29CQUNELFNBQVMsRUFBRSxDQUFDLCtCQUErQixDQUFDLENBQUE7cUVBQ0s7aUJBQ2xEO3U5QkFHUSxZQUFZO3NCQURsQixTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFFQyxrQkFBa0I7c0JBQWxFLFNBQVM7dUJBQUMsb0JBQW9CLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNNLHNCQUFzQjtzQkFBMUUsU0FBUzt1QkFBQyx3QkFBd0IsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBQ0QsbUJBQW1CO3NCQUFwRSxTQUFTO3VCQUFDLHFCQUFxQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDQSxpQkFBaUI7c0JBQWhFLFNBQVM7dUJBQUMsbUJBQW1CLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNFLGlCQUFpQjtzQkFBaEUsU0FBUzt1QkFBQyxtQkFBbUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBQ0UsaUJBQWlCO3NCQUFoRSxTQUFTO3VCQUFDLG1CQUFtQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDYSw0QkFBNEI7c0JBQXRGLFNBQVM7dUJBQUMsOEJBQThCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNELHlCQUF5QjtzQkFBaEYsU0FBUzt1QkFBQywyQkFBMkIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBQ0ssNEJBQTRCO3NCQUF0RixTQUFTO3VCQUFDLDhCQUE4QixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDWCxlQUFlO3NCQUE1RCxTQUFTO3VCQUFDLGlCQUFpQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDQyxjQUFjO3NCQUExRCxTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDUyxxQkFBcUI7c0JBQXhFLFNBQVM7dUJBQUMsdUJBQXVCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNBLG1CQUFtQjtzQkFBcEUsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBQ1UsMkJBQTJCO3NCQUFwRixTQUFTO3VCQUFDLDZCQUE2QixFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFDTCxvQkFBb0I7c0JBQXRFLFNBQVM7dUJBQUMsc0JBQXNCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNKLGNBQWM7c0JBQTFELFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQUNPLG1CQUFtQjtzQkFBcEUsU0FBUzt1QkFBQyxxQkFBcUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBQ0YsZUFBZTtzQkFBNUQsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUM7Z0JBRXRCLFVBQVU7c0JBQS9CLFdBQVc7dUJBQUMsT0FBTztnQkFDWCxTQUFTO3NCQUFqQixLQUFLO2dCQUVJLElBQUk7c0JBQWIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBa0ZBLGdCQUFnQjtzQkFEdEIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBIb3N0QmluZGluZyxcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TWF0RGlhbG9nfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7RXVsZXIsIFZlY3RvcjN9IGZyb20gJ3RocmVlJztcclxuaW1wb3J0IHtQbHVnaW5JbnRlcmZhY2V9IGZyb20gJy4uLy4uL3BsdWdpbi1pbnRlcmZhY2UnO1xyXG5pbXBvcnQge0Zsb29ycGxhbm5lckNvbXBvbmVudH0gZnJvbSAnLi4vY29tcG9uZW50cy9mbG9vcnBsYW5uZXIvZmxvb3JwbGFubmVyLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7SWNvbkVudW19IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bS9pY29uLmVudW0nO1xyXG5pbXBvcnQge0ljb25OYW1lfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vaWNvbi1uYW1lLmVudW0nO1xyXG5pbXBvcnQge1ZpZXdNb2RlfSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vdmlldy1tb2RlLmVudW0nO1xyXG5pbXBvcnQge1RocmVlZE1vZGVsfSBmcm9tICcuLi8uLi9jb3JlM2QvbW9kZWwvdGhyZWVkLW1vZGVsJztcclxuaW1wb3J0IHtDYXRlZ29yeX0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbC9jYXRlZ29yeSc7XHJcbmltcG9ydCB7XHJcbiAgaXNDdXN0b21DeWxpbmRlclR5cGUsXHJcbiAgaXNDdXN0b21DeWxpbmRlcldhbGxUeXBlLFxyXG4gIGlzQ3VzdG9tU2hhcGVUeXBlLFxyXG4gIGlzQ3VzdG9tU2hhcGVXYWxsVHlwZSxcclxuICBpc0Z1cm5pdHVyZVR5cGUsXHJcbiAgaXNXYWxsVHlwZVxyXG59IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9mYWN0b3J5JztcclxuaW1wb3J0IHtDb3JuZXIsIEhhbGZFZGdlLCBJbldhbGxJdGVtLCBSb29tLCBXYWxsLCBXYWxsSXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL3dhbGwtb2JqZWN0cyc7XHJcbmltcG9ydCB7SXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2l0ZW0nO1xyXG5pbXBvcnQge0l0ZW1Hcm91cH0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2l0ZW0tZ3JvdXAnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JJY29uQ2FjaGVTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1pY29uLWNhY2hlLnNlcnZpY2UnO1xyXG5pbXBvcnQge1ZpZXdNb2RlU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL3ZpZXctbW9kZS5zZXJ2aWNlJztcclxuaW1wb3J0IHtNb2RlbHNTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9tb2RlbHMuc2VydmljZSc7XHJcbmltcG9ydCB7UHJlc2V0c1NlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9wcmVzZXRzLnNlcnZpY2UnO1xyXG5pbXBvcnQge0hvbWVkZWNvcmF0b3JBcHBTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1hcHAuc2VydmljZSc7XHJcbmltcG9ydCB7U2NyZWVuU2l6ZUFuYWx5c2lzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NjcmVlbi1zaXplLWFuYWx5c2lzL3NjcmVlbi1zaXplLWFuYWx5c2lzLnNlcnZpY2UnO1xyXG5pbXBvcnQge1V0aWxzU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL3V0aWxzLnNlcnZpY2UnO1xyXG5pbXBvcnQge01lc3NhZ2VCdXNTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvbWVzc2FnZS1idXMuc2VydmljZSc7XHJcbmltcG9ydCB7Q29uZmlndXJhdGlvblNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9jb25maWd1cmF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQge0Zsb29ycGxhblNlcnZpY2V9IGZyb20gJy4uL2NvbXBvbmVudHMvZmxvb3JwbGFubmVyL3NlcnZpY2UvZmxvb3JwbGFuLnNlcnZpY2UnO1xyXG5pbXBvcnQge1NjZW5lU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2Uvc2NlbmUuc2VydmljZSc7XHJcbmltcG9ydCB7SHVkU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2UvaHVkLnNlcnZpY2UnO1xyXG5pbXBvcnQge1Jvb21TZXJ2aWNlfSBmcm9tICcuLi9jb21wb25lbnRzL2Zsb29ycGxhbm5lci9zZXJ2aWNlL3Jvb20uc2VydmljZSc7XHJcbmltcG9ydCB7Q2FtZXJhU2VydmljZX0gZnJvbSAnLi4vLi4vY29yZTNkL3NlcnZpY2UvY2FtZXJhLnNlcnZpY2UnO1xyXG5pbXBvcnQge0l0ZW1TZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9pdGVtLnNlcnZpY2UnO1xyXG5pbXBvcnQge0l0ZW1TZXJpYWxpemF0aW9uU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlL2l0ZW0tc2VyaWFsaXphdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHtMaWdodHNTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9saWdodHMuc2VydmljZSc7XHJcbmltcG9ydCB7QXJTZXJ2aWNlfSBmcm9tICcuLi8uLi9jb3JlM2Qvc2VydmljZS9hci5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1zZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHtDb25maWd1cmF0aW9uS2V5fSBmcm9tICcuLi8uLi8uLi9jb3JlL2VudW0vY29uZmlndXJhdGlvbi1rZXkuZW51bSc7XHJcbmltcG9ydCB7TWVzc2FnZVR5cGV9IGZyb20gJy4uLy4uLy4uL2NvcmUvZW51bS9tZXNzYWdlLXR5cGUuZW51bSc7XHJcbmltcG9ydCB7U2VsZWN0ZWRXYWxsRXZlbnR9IGZyb20gJy4uLy4uLy4uL2NvcmUvaW50ZXJmYWNlL3NlbGVjdGVkLXdhbGwtZXZlbnQuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtTZWxlY3RlZEZsb29yRXZlbnR9IGZyb20gJy4uLy4uLy4uL2NvcmUvaW50ZXJmYWNlL3NlbGVjdGVkLWZsb29yLWV2ZW50LmludGVyZmFjZSc7XHJcbmltcG9ydCB7U2NyZWVuU2l6ZUluZm99IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9zY3JlZW4tc2l6ZS1hbmFseXNpcy9zY3JlZW4tc2l6ZS1pbmZvJztcclxuaW1wb3J0IHtDdXN0b21TaGFwZUZsb29ySXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2N1c3RvbS1zaGFwZS1mbG9vci1pdGVtJztcclxuaW1wb3J0IHtDdXN0b21TaGFwZVdhbGxJdGVtfSBmcm9tICcuLi8uLi9jb3JlM2QvaXRlbXMvY3VzdG9tLXNoYXBlLXdhbGwtaXRlbSc7XHJcbmltcG9ydCB7Q3VzdG9tQ3lsaW5kZXJGbG9vckl0ZW19IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9jdXN0b20tY3lsaW5kZXItZmxvb3ItaXRlbSc7XHJcbmltcG9ydCB7Q3VzdG9tQ3lsaW5kZXJXYWxsSXRlbX0gZnJvbSAnLi4vLi4vY29yZTNkL2l0ZW1zL2N1c3RvbS1jeWxpbmRlci13YWxsLWl0ZW0nO1xyXG5pbXBvcnQge0RyYWdnZWREYXRhfSBmcm9tICcuLi8uLi9jb3JlM2QvaW50ZXJmYWNlL2RyYWdnZWQtZGF0YS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1RleHR1cmV9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWwvdGV4dHVyZSc7XHJcbmltcG9ydCB7SW5mb0RpYWxvZ0NvbXBvbmVudH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2luZm8tZGlhbG9nL2luZm8tZGlhbG9nLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7TW9kZWxJbnRlcmZhY2V9IGZyb20gJy4uLy4uL2NvcmUzZC9pbnRlcmZhY2UvbW9kZWwuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtLZXl9IGZyb20gJy4uL2NvbnN0L2tleSc7XHJcbmltcG9ydCB7Rmxvb3JQbGFuZUl0ZW19IGZyb20gJy4uLy4uL2NvcmUzZC9pdGVtcy9mbG9vci1wbGFuZS1pdGVtJztcclxuaW1wb3J0IHtHb29nbGVUYWdNYW5hZ2VyU2VydmljZX0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9nb29nbGUtdGFnLW1hbmFnZXIuc2VydmljZSc7XHJcbmltcG9ydCB7UGVybWFuZW50U3RvcmVTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvcGVybWFuZW50LXN0b3JlLnNlcnZpY2UnO1xyXG5pbXBvcnQge0N1c3RvbUJ1dHRvbn0gZnJvbSAnLi4vLi4vLi4vY29yZS9tb2RlbC9jdXN0b20tYnV0dG9uJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQXBwRXZlbnRTZXJ2aWNlfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2UvaG9tZWRlY29yYXRvci1hcHAtZXZlbnQuc2VydmljZSc7XHJcbmltcG9ydCB7SG9tZWRlY29yYXRvckNvbm5lY3RvclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci5zZXJ2aWNlJztcclxuaW1wb3J0IHtIb21lZGVjb3JhdG9yQ29ubmVjdG9yQWRhcHRlclNlcnZpY2V9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZS9ob21lZGVjb3JhdG9yLWNvbm5lY3Rvci1hZGFwdGVyLnNlcnZpY2UnO1xyXG5pbXBvcnQge0V4dGVybmFsU291cmNlQXJ0aWNsZUFkZEludGVyZmFjZX0gZnJvbSAnQGNvbGlqbml0L2FydGljbGVhcGkvYnVpbGQvaW50ZXJmYWNlL2V4dGVybmFsLXNvdXJjZS1hcnRpY2xlLWFkZC5pbnRlcmZhY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdycC1yb29tLXBsYW5uZXInLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IGNsYXNzPVwiUm9vbVBsYW5uZXJcIj5cclxuICAgICAgPGZsb29yLXBsYW5uZXJcclxuICAgICAgICBbY2xhc3MuaGlkZGVuXT1cIiF2aWV3TW9kZVNlcnZpY2UuaXMyZFZpZXdBY3RpdmUoKVwiXHJcbiAgICAgICAgKHNlbGVjdGVkV2FsbENoYW5nZSk9XCJzZWxlY3RXYWxsKCRldmVudClcIj48L2Zsb29yLXBsYW5uZXI+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8cnAtY29udGV4dC1tZW51XHJcbiAgICAgICpuZ0lmPVwiIXZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpICYmIHNob3dDb250ZXh0TWVudSAmJiBzZWxlY3RlZFdhbGxcIlxyXG4gICAgICBbb3Blbk1vdXNlRXZlbnRdPVwiY29udGV4dE1lbnVNb3VzZUV2ZW50XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS13cmFwIFwiPlxyXG4gICAgICAgIDxkaXYgKGNsaWNrKT1cInNob3dTZWxlY3RlZFdhbGxTaWRlYmFyKClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIiBzdmdJY29uPVwibWFnaWMtd2FuZFwiPjwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdDT05GSUdVUkUnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9ycC1jb250ZXh0LW1lbnU+XHJcblxyXG4gICAgPHJwLWNvbnRleHQtbWVudVxyXG4gICAgICAqbmdJZj1cIiF2aWV3TW9kZVNlcnZpY2UuaXMyZFZpZXdBY3RpdmUoKSAmJiBzaG93Q29udGV4dE1lbnUgJiYgc2VsZWN0ZWRGbG9vclwiXHJcbiAgICAgIFtvcGVuTW91c2VFdmVudF09XCJjb250ZXh0TWVudU1vdXNlRXZlbnRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LXdyYXBcIj5cclxuICAgICAgICA8ZGl2IChjbGljayk9XCJzaG93U2VsZWN0ZWRGbG9vclNpZGViYXIoKVwiIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbSBcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIiBzdmdJY29uPVwibWFnaWMtd2FuZFwiPjwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdDT05GSUdVUkUnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9ycC1jb250ZXh0LW1lbnU+XHJcblxyXG4gICAgPHJwLWl0ZW0tY29udGV4dC1tZW51XHJcbiAgICAgICpuZ0lmPVwiIXZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpICYmIHNob3dDb250ZXh0TWVudSAmJiAhc2hvd0dyb3VwTWVudVwiXHJcbiAgICAgIFtpdGVtXT1cInNlbGVjdGVkT2JqZWN0XCJcclxuICAgICAgKGRlbGV0ZVByZXNzZWQpPVwiaGFuZGxlRGVsZXRlT2JqZWN0KClcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LXdyYXBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VDb250ZXh0TWVudSgpXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsb3NlLWljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+Y2xvc2U8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwidGhpcy5zZWxlY3RlZE9iamVjdFwiIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaGVhZGVyXCI+XHJcbiAgICAgICAgICA8cD57eyB0aGlzLnNlbGVjdGVkT2JqZWN0Lm5hbWUgfX08L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dTZXR0aW5nc0J1dHRvblwiIChjbGljayk9XCJzaG93U2VsZWN0ZWRPYmplY3RTaWRlYmFyKClcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtIFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiIHN2Z0ljb249XCJtYWdpYy13YW5kXCI+PC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ0NPTkZJR1VSRScgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvd0NvbmZpZ3VyYXRpb25CdXR0b25cIj5cclxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGN1c3RvbUJ1dHRvbiBvZiBtb2RlbHNTZXJ2aWNlLmN1c3RvbUJ1dHRvbnNcIiAoY2xpY2spPVwiaGFuZGxlQ29uZmlndXJhdGlvbkJ1dHRvbkNsaWNrKGN1c3RvbUJ1dHRvbilcIlxyXG4gICAgICAgICAgICAgICBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW0gXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxjby1pY29uIFtpY29uRGF0YV09XCJpY29uU2VydmljZS5nZXRJY29uKGljb24uTWFnaWNXYW5kKVwiPjwvY28taWNvbj48L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnQ09ORklHVVJFJyB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dDb3B5QnV0dG9uXCIgKGNsaWNrKT1cImNvcHlTZWxlY3RlZE9iamVjdCgpXCIgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+ZmlsZV9jb3B5PC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ0NPUFknIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dEZWxldGVCdXR0b25cIiAoY2xpY2spPVwicmVtb3ZlU2VsZWN0ZWRPYmplY3QoKVwiIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmRlbGV0ZTwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdSRU1PVkUnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dDb25maWd1cmF0aW9uQnV0dG9uXCIgKGNsaWNrKT1cInNob3dTZWxlY3RlZFRocmVlZE9iamVjdFNpZGViYXIoKVwiXHJcbiAgICAgICAgICAgICBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5zZXR0aW5nczwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdTRVRUSU5HUycgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0xvY2tCdXR0b24gJiYgc2VsZWN0ZWRPYmplY3RcIiAoY2xpY2spPVwidG9nZ2xlTG9ja1NlbGVjdGVkT2JqZWN0KClcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRDb250ZW50XT1cInNlbGVjdGVkT2JqZWN0LmxvY2tlZCA/ICdsb2NrJyA6ICdsb2NrX29wZW4nXCI+PC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgKHNlbGVjdGVkT2JqZWN0LmxvY2tlZCA/ICdVTkxPQ0snIDogJ0xPQ0snKSB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCIhc2hvd0dyb3VwRWRpdE1lbnVCdXR0b25zXCIgKGNsaWNrKT1cInN0YXJ0R3JvdXBTZWxlY3Rpb24oKVwiIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmxpbms8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnR1JPVVAnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93Q29udmVyc2lvbkJ1dHRvbiAmJiBzZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3Muc2hvd0NvbnZlcnNpb25CdXR0b25zXCJcclxuICAgICAgICAgICAgIChjbGljayk9XCJzZW5kQ29udmVyc2lvblRvVGFnTWFuYWdlcigpXCJcclxuICAgICAgICAgICAgIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbVwiXHJcbiAgICAgICAgICAgICBbbmdDbGFzc109XCJhZGRTZWxlY3RlZENsYXNzID8gJ2NvbnZlcnNpb24tYnV0dG9uLXNlbGVjdGVkJyA6ICcnXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+YWRkX3Nob3BwaW5nX2NhcnQ8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnQ09OVkVSU0lPTicgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbiBpY29uLXNlbGVjdGVkXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dBUkJ1dHRvblwiIChjbGljayk9XCJzdGFydEFSU2Vzc2lvbigpXCIgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+d2Vla2VuZDwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdBUicgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8YnV0dG9uLWVsZXZhdGlvblxyXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZE9iamVjdCAmJiBzZWxlY3RlZE9iamVjdC5lbGV2YXRpb25BZGp1c3RhYmxlXCJcclxuICAgICAgICAgIFtpdGVtXT1cInNlbGVjdGVkT2JqZWN0XCI+XHJcbiAgICAgICAgPC9idXR0b24tZWxldmF0aW9uPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzYWxhYmxlT2JqZWN0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhcl9fZGl2aWRlciBjb250ZXh0LW1lbnVcIj48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImFkZFRvQ2FydChzZWxlY3RlZE9iamVjdClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW0gYWRkLXRvLWNhcnQtYnV0dG9uXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIiBbc3ZnSWNvbl09XCInY2FydC1zaG9wcGluZy1yZWd1bGFyJ1wiPjwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgJ0FERF9UT19DQVJUJyB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9ycC1pdGVtLWNvbnRleHQtbWVudT5cclxuXHJcbiAgICA8cnAtaXRlbS1jb250ZXh0LW1lbnUgKm5nSWY9XCIhdmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkgJiYgc2hvd0NvbnRleHRNZW51ICYmIHNob3dHcm91cE1lbnUgJiYgIXVzZXJJc0dyb3VwaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBbaXRlbV09XCJzZWxlY3RlZE9iamVjdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlbGV0ZVByZXNzZWQpPVwiaGFuZGxlRGVsZXRlT2JqZWN0KClcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LXdyYXBcIj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIXNob3dHcm91cEVkaXRNZW51QnV0dG9uc1wiIChjbGljayk9XCJvbkdyb3VwQ2xpY2soKVwiIGNsYXNzPVwicnAtaXRlbS1jb250ZXh0LW1lbnUtaXRlbVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmxpbms8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnR1JPVVAnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dHcm91cEVkaXRNZW51QnV0dG9uc1wiIChjbGljayk9XCJvblVuR3JvdXBDbGljaygpXCIgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+bGlua19vZmY8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnVU5HUk9VUCcgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0dyb3VwRWRpdE1lbnVCdXR0b25zXCIgKGNsaWNrKT1cInJlbW92ZVNlbGVjdGVkT2JqZWN0KClcIiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaWNvblwiPjxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5kZWxldGU8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnUkVNT1ZFJyB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93TG9ja0J1dHRvbiAmJiBzZWxlY3RlZE9iamVjdCAmJiBzaG93R3JvdXBFZGl0TWVudUJ1dHRvbnNcIiAoY2xpY2spPVwidG9nZ2xlTG9ja1NlbGVjdGVkT2JqZWN0KClcIlxyXG4gICAgICAgICAgICAgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RleHRDb250ZW50XT1cInNlbGVjdGVkT2JqZWN0LmxvY2tlZCA/ICdsb2NrJyA6ICdsb2NrX29wZW4nXCI+PC9tYXQtaWNvbj48L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsXCI+e3sgKHNlbGVjdGVkT2JqZWN0LmxvY2tlZCA/ICdVTkxPQ0snIDogJ0xPQ0snKSB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvcnAtaXRlbS1jb250ZXh0LW1lbnU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICN0b29sYmFySWNvbkxpYnJhcnk+XHJcbiAgICAgIDxycC10b29sYmFyLWljb25cclxuICAgICAgICAqbmdJZj1cIiFwaG9uZVNpemVTY3JlZW5cIlxyXG4gICAgICAgIFtkaXNhYmxlZF09XCJ2aWV3TW9kZVNlcnZpY2UuaXMyZFZpZXdBY3RpdmUoKSB8fCB2aWV3TW9kZVNlcnZpY2UuaXNXYWxrVGhyb3VnaFZpZXdBY3RpdmUoKVwiXHJcbiAgICAgICAgbWF0SWNvbj1cImhvbWVcIlxyXG4gICAgICAgIHRvb2x0aXA9XCJ7e2ljb25OYW1lLkFyY2hpdGVjdHVyZSB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgIChvbkNsaWNrKT1cInNob3dMaWJyYXJ5Q2F0ZWdvcmllcygpXCJcclxuICAgICAgICBbc2hvd0xhYmVsXT1cInBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgID48L3JwLXRvb2xiYXItaWNvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICN0b29sYmFySWNvbkFjY2Vzc29pcmVzPlxyXG4gICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgW2Rpc2FibGVkXT1cInZpZXdNb2RlU2VydmljZS5pczJkVmlld0FjdGl2ZSgpIHx8IHZpZXdNb2RlU2VydmljZS5pc1dhbGtUaHJvdWdoVmlld0FjdGl2ZSgpXCJcclxuICAgICAgICBtYXRJY29uPVwibG9jYWxfZmxvcmlzdFwiXHJcbiAgICAgICAgdG9vbHRpcD1cInt7aWNvbk5hbWUuQWNjZXNzb3JpZXMgfCBsb2NhbGl6ZX19XCJcclxuICAgICAgICAob25DbGljayk9XCJzaG93QWNjZXNzb2lyZUNhdGVnb3JpZXMoKVwiXHJcbiAgICAgICAgW3Nob3dMYWJlbF09XCJwaG9uZVNpemVTY3JlZW5cIlxyXG4gICAgICA+PC9ycC10b29sYmFyLWljb24+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjdG9vbGJhckljb24yZFZpZXc+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwidG9vbGJhcl9fZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgICAgPHJwLXRvb2xiYXItaWNvblxyXG4gICAgICAgICpuZ0lmPVwiIXBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgICAgc3ZnSWNvbj1cImN1YmUtdW5mb2xkZWRcIlxyXG4gICAgICAgIHRvb2x0aXA9XCJ7e2ljb25OYW1lLlR3b2RGbG9vcnBsYW4gfCBsb2NhbGl6ZX19XCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwidmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkgfHwgIWRlc2t0b3BTaXplU2NyZWVuXCJcclxuICAgICAgICAob25DbGljayk9XCJ1cGRhdGVNb2RlKHZpZXdNb2Rlcy5GbG9vclBsYW4yRCwgdHJ1ZSlcIlxyXG4gICAgICAgIFtzaG93TGFiZWxdPVwicGhvbmVTaXplU2NyZWVuXCJcclxuICAgICAgPjwvcnAtdG9vbGJhci1pY29uPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI3Rvb2xiYXJJY29uM2RWaWV3PlxyXG4gICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgc3ZnSWNvbj1cImN1YmUtb3V0bGluZVwiXHJcbiAgICAgICAgdG9vbHRpcD1cInt7aWNvbk5hbWUuVGhyZWVkUm9vbXBsYW4gfCBsb2NhbGl6ZX19XCJcclxuICAgICAgICBbZGlzYWJsZWRdPVwidmlld01vZGVTZXJ2aWNlLmlzM2RWaWV3QWN0aXZlKClcIlxyXG4gICAgICAgIChvbkNsaWNrKT1cInVwZGF0ZU1vZGUodmlld01vZGVzLlJvb21QbGFuM0QsIHRydWUpXCJcclxuICAgICAgICBbc2hvd0xhYmVsXT1cInBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgID48L3JwLXRvb2xiYXItaWNvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPHJwLXpvb20tY29udHJvbHNcclxuICAgICAgW3Zpc2libGVdPVwidmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKClcIlxyXG4gICAgICAob25ab29tSW4pPVwiem9vbUluKClcIlxyXG4gICAgICAob25ab29tUmVzZXQpPVwiem9vbVJlc2V0KClcIlxyXG4gICAgICAob25ab29tT3V0KT1cInpvb21PdXQoKVwiXHJcbiAgICA+PC9ycC16b29tLWNvbnRyb2xzPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjdG9vbGJhckljb25TZXR0aW5ncz5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJ0b29sYmFyX19kaXZpZGVyXCI+PC9zcGFuPlxyXG4gICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgbWF0SWNvbj1cInNldHRpbmdzXCJcclxuICAgICAgICB0b29sdGlwPVwie3tpY29uTmFtZS5TZXR0aW5ncyB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgIChvbkNsaWNrKT1cInNob3dTZXR0aW5ncygpXCJcclxuICAgICAgICBbc2hvd0xhYmVsXT1cInBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgID48L3JwLXRvb2xiYXItaWNvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICN0b29sYmFySWNvbkZhcT5cclxuICAgICAgPHJwLXRvb2xiYXItaWNvblxyXG4gICAgICAgICpuZ0lmPVwic2hvd0ZhcSgpXCJcclxuICAgICAgICBtYXRJY29uPVwiaGVscFwiXHJcbiAgICAgICAgdG9vbHRpcD1cInt7aWNvbk5hbWUuRmFxIHwgbG9jYWxpemV9fVwiXHJcbiAgICAgICAgKG9uQ2xpY2spPVwib3BlbkZhcSh0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5ncy5mYXFVcmwpXCJcclxuICAgICAgICBbc2hvd0xhYmVsXT1cInBob25lU2l6ZVNjcmVlblwiXHJcbiAgICAgID48L3JwLXRvb2xiYXItaWNvbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICN0b29sYmFySWNvbkZlZWRiYWNrPlxyXG4gICAgICA8cnAtdG9vbGJhci1pY29uXHJcbiAgICAgICAgKm5nSWY9XCJzaG93RmVlZGJhY2soKVwiXHJcbiAgICAgICAgbWF0SWNvbj1cImNoYXRfYnViYmxlXCJcclxuICAgICAgICB0b29sdGlwPVwie3tpY29uTmFtZS5GZWVkYmFjayB8IGxvY2FsaXplfX1cIlxyXG4gICAgICAgIChvbkNsaWNrKT1cIm9wZW5GZWVkYmFjayh0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5ncy5mZWVkYmFja1VybClcIlxyXG4gICAgICAgIFtzaG93TGFiZWxdPVwicGhvbmVTaXplU2NyZWVuXCJcclxuICAgICAgPjwvcnAtdG9vbGJhci1pY29uPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDxuZy10ZW1wbGF0ZSAjdG9vbGJhckljb25DYXJ0PlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInRvb2xiYXJfX2RpdmlkZXJcIj48L3NwYW4+XHJcbiAgICAgIDxycC10b29sYmFyLWljb24gY2xhc3M9XCJhZGQtdG8tY2FydC1idXR0b25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIHN2Z0ljb249XCJjYXJ0LXNob3BwaW5nLXJlZ3VsYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eydBRERfVE9fQ0FSVCcgfCBsb2NhbGl6ZX19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAob25DbGljayk9XCJhZGRBbGxUb0NhcnQoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dMYWJlbF09XCJwaG9uZVNpemVTY3JlZW5cIlxyXG4gICAgICA+PC9ycC10b29sYmFyLWljb24+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwidG9vbGJhcl9fZGl2aWRlclwiPjwvc3Bhbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICNzZXR0aW5nc1NpZGViYXI+XHJcbiAgICAgIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7ICdTRVRUSU5HUycgfCBsb2NhbGl6ZSB9fTwvaDI+XHJcbiAgICAgIDwvaGVhZGVyPlxyXG4gICAgICA8cnAtc2V0dGluZ3NcclxuICAgICAgICBbcGxhY2VDYW1lcmFEaXNhYmxlZF09XCJ2aWV3TW9kZVNlcnZpY2UuaXMyZFZpZXdBY3RpdmUoKSB8fCBpdGVtU2VydmljZS5nZXRXYWxrdGhyb3VnaENhbWVyYSgpXCJcclxuICAgICAgICBbbWluV2FsbEhlaWdodF09XCJnZXRNaW5HbG9iYWxXYWxsSGVpZ2h0KClcIlxyXG4gICAgICAgIChvbldhbGxzSGVpZ2h0VXBkYXRlKT1cIndhbGxzSGVpZ2h0VXBkYXRlZCgkZXZlbnQpXCJcclxuICAgICAgPlxyXG4gICAgICA8L3JwLXNldHRpbmdzPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI2NhdGVnb3JpZXNTaWRlYmFyPlxyXG4gICAgICA8aGVhZGVyIGNsYXNzPVwiZHJhd2VyX19oZWFkZXJcIj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJtYXQtdGl0bGVcIj57eyAnQVJDSElURUNUVVJFJyB8IGxvY2FsaXplIH19PC9oMj5cclxuICAgICAgPC9oZWFkZXI+XHJcbiAgICAgIDxycC1jYXRlZ29yeS1saWJyYXJ5XHJcbiAgICAgICAgW2NhdGVnb3JpZXNdPVwiY2F0ZWdvcmllc1wiXHJcbiAgICAgICAgKGNhdGVnb3J5Q2xpY2spPVwic2hvd0xpYnJhcnlDYXRlZ29yeSgkZXZlbnQpXCJcclxuICAgICAgPlxyXG4gICAgICA8L3JwLWNhdGVnb3J5LWxpYnJhcnk+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjYWNjZXNzb2lyZXNDYXRlZ29yaWVzU2lkZWJhcj5cclxuICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3sgJ0FDQ0VTU09JUkVTJyB8IGxvY2FsaXplIH19PC9oMj5cclxuICAgICAgPC9oZWFkZXI+XHJcbiAgICAgIDxycC1jYXRlZ29yeS1saWJyYXJ5XHJcbiAgICAgICAgW2NhdGVnb3JpZXNdPVwiYWNjZXNzb2lyZUNhdGVnb3JpZXNcIlxyXG4gICAgICAgIChjYXRlZ29yeUNsaWNrKT1cInNob3dMaWJyYXJ5Q2F0ZWdvcnkoJGV2ZW50KVwiXHJcbiAgICAgID5cclxuICAgICAgPC9ycC1jYXRlZ29yeS1saWJyYXJ5PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI2N1c3RvbVNoYXBlQ3JlYXRvclNpZGVCYXI+XHJcbiAgICAgIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7ICdDVVNUT01fU0hBUEVfQ1JFQVRPUicgfCBsb2NhbGl6ZSB9fTwvaDI+XHJcbiAgICAgIDwvaGVhZGVyPlxyXG4gICAgICA8cnAtY3VzdG9tLXNoYXBlLWNyZWF0b3IgW3NoYXBlXT1cInNlbGVjdGVkT2JqZWN0XCI+PC9ycC1jdXN0b20tc2hhcGUtY3JlYXRvcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICNjdXN0b21DeWxpbmRlckNyZWF0b3JTaWRlQmFyPlxyXG4gICAgICA8aGVhZGVyIGNsYXNzPVwiZHJhd2VyX19oZWFkZXJcIj5cclxuICAgICAgICA8aDIgY2xhc3M9XCJtYXQtdGl0bGVcIj57eyAnQ1VTVE9NX1NIQVBFX0NSRUFUT1InIHwgbG9jYWxpemUgfX08L2gyPlxyXG4gICAgICA8L2hlYWRlcj5cclxuICAgICAgPGN1c3RvbS1jeWxpbmRlci1jcmVhdG9yIFtzaGFwZV09XCJzZWxlY3RlZE9iamVjdFwiPjwvY3VzdG9tLWN5bGluZGVyLWNyZWF0b3I+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjbGlicmFyeVNpZGViYXI+XHJcbiAgICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiBjbGFzcz1cIndpdGgtc2Nyb2xsYWJsZS1zZWN0aW9uXCI+XHJcbiAgICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwic2hvd0FjdGl2ZUNhdGVnb3J5U2lkZWJhcigpXCI+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImhvbWVkZWNvcmF0b3ItbWF0ZXJpYWwtaWNvbnNcIj5hcnJvd19iYWNrX2lvczwvbWF0LWljb24+XHJcbiAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiPnt7IHNlbGVjdGVkQ2F0ZWdvcnkubmFtZSB8IGxvY2FsaXplIH19PC9oMj5cclxuICAgICAgICA8L2hlYWRlcj5cclxuICAgICAgICA8cCBjbGFzcz1cIm1hdC1ib2R5XCIgKm5nSWY9XCJzZWxlY3RlZENhdGVnb3J5LmRlc2NyaXB0aW9uXCI+e3sgc2VsZWN0ZWRDYXRlZ29yeS5kZXNjcmlwdGlvbiB8IGxvY2FsaXplIH19PC9wPlxyXG4gICAgICAgIDxzZWN0aW9uIGZ4RmxleD1cImdyb3dcIiAqbmdJZj1cImxpYnJhcnlPYmplY3RzPy5sZW5ndGggPiAwIHx8IGhhc0N1c3RvbU9iamVjdHMoKVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0N1c3RvbU9iamVjdHMoKVwiPlxyXG4gICAgICAgICAgICA8aDMgY2xhc3M9XCJtYXQtc3ViaGVhZGluZy0yXCI+e3sgJ0NVU1RPTScgfCBsb2NhbGl6ZSB9fTwvaDM+XHJcbiAgICAgICAgICAgIDxycC1vYmplY3QtbGlicmFyeVxyXG4gICAgICAgICAgICAgIFtvYmplY3RzXT1cImN1c3RvbU9iamVjdHNcIlxyXG4gICAgICAgICAgICAgIChzZXREcmFnZ2VkKT1cInNldERyYWdnZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKHJlbGVhc2VEcmFnZ2VkKT1cInJlbGVhc2VEcmFnZ2VkKClcIlxyXG4gICAgICAgICAgICAgIChvbk9iamVjdENsaWNrKT1cIm9uT2JqZWN0TGlicmFyeUNsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvcnAtb2JqZWN0LWxpYnJhcnk+XHJcbiAgICAgICAgICAgIDxtYXQtZGl2aWRlcj48L21hdC1kaXZpZGVyPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibGlicmFyeU9iamVjdHM/Lmxlbmd0aCA+IDBcIj5cclxuICAgICAgICAgICAgPGgzIGNsYXNzPVwibWF0LXN1YmhlYWRpbmctMlwiPnt7ICdMSUJSQVJZJyB8IGxvY2FsaXplIH19PC9oMz5cclxuICAgICAgICAgICAgPHJwLW9iamVjdC1saWJyYXJ5XHJcbiAgICAgICAgICAgICAgW29iamVjdHNdPVwibGlicmFyeU9iamVjdHNcIlxyXG4gICAgICAgICAgICAgIChzZXREcmFnZ2VkKT1cInNldERyYWdnZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgKHJlbGVhc2VEcmFnZ2VkKT1cInJlbGVhc2VEcmFnZ2VkKClcIlxyXG4gICAgICAgICAgICAgIChvbk9iamVjdENsaWNrKT1cIm9uT2JqZWN0TGlicmFyeUNsaWNrKCRldmVudClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDwvcnAtb2JqZWN0LWxpYnJhcnk+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L3NlY3Rpb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI3NlbGVjdGVkT2JqZWN0U2lkZWJhcj5cclxuICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3sgJ09CSkVDVCcgfCBsb2NhbGl6ZSB9fTwvaDI+XHJcbiAgICAgIDwvaGVhZGVyPlxyXG4gICAgICA8cnAtc2VsZWN0ZWQtb2JqZWN0XHJcbiAgICAgICAgW29iamVjdF09XCJzZWxlY3RlZE9iamVjdFwiXHJcbiAgICAgICAgKG9uU2VsZWN0ZWRPYmplY3RDaGFuZ2UpPVwidXBkYXRlU2VsZWN0ZWRPYmplY3RIdWQoKVwiXHJcbiAgICAgID5cclxuICAgICAgPC9ycC1zZWxlY3RlZC1vYmplY3Q+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjc2VsZWN0ZWRXYWxsU2lkZWJhcj5cclxuICAgICAgPGhlYWRlciBjbGFzcz1cImRyYXdlcl9faGVhZGVyXCI+XHJcbiAgICAgICAgPGgyIGNsYXNzPVwibWF0LXRpdGxlXCI+e3sgJ1dBTEwnfCBsb2NhbGl6ZSB9fTwvaDI+XHJcbiAgICAgIDwvaGVhZGVyPlxyXG4gICAgICA8cnAtc2VsZWN0ZWQtd2FsbFxyXG4gICAgICAgIFt3YWxsXT1cInNlbGVjdGVkV2FsbFwiXHJcbiAgICAgICAgW3RleHR1cmVQbGFuZV09XCJzZWxlY3RlZEVkZ2VzWzBdXCJcclxuICAgICAgICBbbWluV2FsbEhlaWdodF09XCJnZXRNaW5XYWxsSGVpZ2h0KHNlbGVjdGVkV2FsbClcIlxyXG4gICAgICAgIFttYXhXYWxsSGVpZ2h0XT1cIm1heFdhbGxIZWlnaHRcIlxyXG4gICAgICAgIFttYXhXYWxsVGhpY2tuZXNzXT1cIm1heFdhbGxUaGlja25lc3NcIlxyXG4gICAgICAgIFttYXhXYWxsTGVuZ3RoXT1cIm1heFdhbGxMZW5ndGhcIlxyXG4gICAgICAgIFttaW5XYWxsTGVuZ3RoXT1cIm1pbldhbGxMZW5ndGhcIlxyXG4gICAgICAgIChyZW1vdmUpPVwicmVtb3ZlV2FsbCgkZXZlbnQpXCJcclxuICAgICAgICAoc2V0TGVuZ3RoKT1cInNldFdhbGxMZW5ndGgoJGV2ZW50KVwiXHJcbiAgICAgICAgKHNldEhlaWdodCk9XCJzZXRXYWxsSGVpZ2h0KCRldmVudClcIlxyXG4gICAgICAgIChzZXRUaGlja25lc3MpPVwic2V0V2FsbFRoaWNrbmVzcygkZXZlbnQpXCJcclxuICAgICAgICAoc2VsZWN0Q29ybmVyKT1cInNlbGVjdENvcm5lcigkZXZlbnQpXCJcclxuICAgICAgICAoc2V0VGV4dHVyZSk9XCJzZXRXYWxsVGV4dHVyZSgkZXZlbnQpXCJcclxuICAgICAgICAoc2V0Q29sb3IpPVwic2V0V2FsbENvbG9yKCRldmVudClcIlxyXG4gICAgICA+XHJcbiAgICAgIDwvcnAtc2VsZWN0ZWQtd2FsbD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICNzZWxlY3RlZFRocmVlZE9iamVjdFNpZGViYXI+XHJcbiAgICAgIDxoZWFkZXIgY2xhc3M9XCJkcmF3ZXJfX2hlYWRlclwiPlxyXG4gICAgICAgIDxoMiBjbGFzcz1cIm1hdC10aXRsZVwiIFt0ZXh0Q29udGVudF09XCInU0VUVElOR1MnIHwgbG9jYWxpemVcIj48L2gyPlxyXG4gICAgICA8L2hlYWRlcj5cclxuICAgICAgPHJwLXNlbGVjdGVkLXRocmVlZC1vYmplY3RcclxuICAgICAgICBbb2JqZWN0XT1cInNlbGVjdGVkT2JqZWN0XCJcclxuICAgICAgICBbc2hvd0NvcHldPVwic2hvd0NvcHlCdXR0b25cIlxyXG4gICAgICAgIFtzaG93RGVsZXRlXT1cInNob3dEZWxldGVCdXR0b25cIlxyXG4gICAgICAgIFtzaG93TG9ja109XCJzaG93TG9ja0J1dHRvblwiXHJcbiAgICAgICAgKG9uU2VsZWN0ZWRPYmplY3RDaGFuZ2UpPVwidXBkYXRlU2VsZWN0ZWRPYmplY3RIdWQoKVwiXHJcbiAgICAgID5cclxuICAgICAgPC9ycC1zZWxlY3RlZC10aHJlZWQtb2JqZWN0PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI3NlbGVjdGVkRmxvb3JTaWRlYmFyPlxyXG4gICAgICA8aDIgY2xhc3M9XCJtYXQtdGl0bGVcIj57eyAnRkxPT1InIHwgbG9jYWxpemUgfX08L2gyPlxyXG4gICAgICA8cnAtc2VsZWN0ZWQtZmxvb3JcclxuICAgICAgICBbZmxvb3JdPVwic2VsZWN0ZWRGbG9vclwiXHJcbiAgICAgICAgW3RleHR1cmVQbGFuZV09XCJzZWxlY3RlZEZsb29yXCJcclxuICAgICAgICAoc2V0VGV4dHVyZSk9XCJzZXRGbG9vclRleHR1cmUoJGV2ZW50KVwiXHJcbiAgICAgICAgKHNldENvbG9yKT1cInNldEZsb29yQ29sb3IoJGV2ZW50KVwiXHJcbiAgICAgICAgKHNlbGVjdGVkRmxvb3JDbG9zZWQpPVwic2VsZWN0ZWRGbG9vciA9IHVuZGVmaW5lZFwiXHJcbiAgICAgID5cclxuICAgICAgPC9ycC1zZWxlY3RlZC1mbG9vcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInVzZXJJc0dyb3VwaW5nXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS13cmFwIG1ycC1zYXZlLWdyb3VwaW5nXCIgKm5nSWY9XCJ1c2VySXNHcm91cGluZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJycC1pdGVtLWNvbnRleHQtbWVudS1pdGVtXCIgKGNsaWNrKT1cIm9uR3JvdXBDbGljaygpXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImljb25cIj48bWF0LWljb24gY2xhc3M9XCJob21lZGVjb3JhdG9yLW1hdGVyaWFsLWljb25zXCI+Y2hlY2s8L21hdC1pY29uPjwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGFiZWxcIj57eyAnR1JPVVBJTkcnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJwLWl0ZW0tY29udGV4dC1tZW51LWl0ZW1cIiAoY2xpY2spPVwiY2FuY2VsR3JvdXBTZWxlY3Rpb24oKVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+PG1hdC1pY29uIGNsYXNzPVwiaG9tZWRlY29yYXRvci1tYXRlcmlhbC1pY29uc1wiPmNhbmNlbDwvbWF0LWljb24+PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFwiPnt7ICdDQU5DRUwnIHwgbG9jYWxpemUgfX08L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIGAsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcm9vbS1wbGFubmVyLmNvbXBvbmVudC5zY3NzJ10vKixcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCovXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBSb29tUGxhbm5lckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBQbHVnaW5JbnRlcmZhY2Uge1xyXG4gIEBWaWV3Q2hpbGQoRmxvb3JwbGFubmVyQ29tcG9uZW50LCB7c3RhdGljOiB0cnVlfSlcclxuICBwdWJsaWMgZmxvb3JwbGFubmVyOiBGbG9vcnBsYW5uZXJDb21wb25lbnQ7XHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhckljb25MaWJyYXJ5Jywge3N0YXRpYzogdHJ1ZX0pIHRvb2xiYXJJY29uTGlicmFyeTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCd0b29sYmFySWNvbkFjY2Vzc29pcmVzJywge3N0YXRpYzogdHJ1ZX0pIHRvb2xiYXJJY29uQWNjZXNzb2lyZXM6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhckljb25TZXR0aW5ncycsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvblNldHRpbmdzOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJJY29uMmRWaWV3Jywge3N0YXRpYzogdHJ1ZX0pIHRvb2xiYXJJY29uMmRWaWV3OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3Rvb2xiYXJJY29uM2RWaWV3Jywge3N0YXRpYzogdHJ1ZX0pIHRvb2xiYXJJY29uM2RWaWV3OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ2NhdGVnb3JpZXNTaWRlYmFyJywge3N0YXRpYzogdHJ1ZX0pIGNhdGVnb3JpZXNTaWRlYmFyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ2FjY2Vzc29pcmVzQ2F0ZWdvcmllc1NpZGViYXInLCB7c3RhdGljOiB0cnVlfSkgYWNjZXNzb2lyZXNDYXRlZ29yaWVzU2lkZWJhcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdjdXN0b21TaGFwZUNyZWF0b3JTaWRlQmFyJywge3N0YXRpYzogdHJ1ZX0pIGN1c3RvbVNoYXBlQ3JlYXRvclNpZGVCYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnY3VzdG9tQ3lsaW5kZXJDcmVhdG9yU2lkZUJhcicsIHtzdGF0aWM6IHRydWV9KSBjdXN0b21DeWxpbmRlckNyZWF0b3JTaWRlQmFyOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBWaWV3Q2hpbGQoJ3NldHRpbmdzU2lkZWJhcicsIHtzdGF0aWM6IHRydWV9KSBzZXR0aW5nc1NpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnbGlicmFyeVNpZGViYXInLCB7c3RhdGljOiB0cnVlfSkgbGlicmFyeVNpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnc2VsZWN0ZWRPYmplY3RTaWRlYmFyJywge3N0YXRpYzogdHJ1ZX0pIHNlbGVjdGVkT2JqZWN0U2lkZWJhcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdzZWxlY3RlZFdhbGxTaWRlYmFyJywge3N0YXRpYzogdHJ1ZX0pIHNlbGVjdGVkV2FsbFNpZGViYXI6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgnc2VsZWN0ZWRUaHJlZWRPYmplY3RTaWRlYmFyJywge3N0YXRpYzogdHJ1ZX0pIHNlbGVjdGVkVGhyZWVkT2JqZWN0U2lkZWJhcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCdzZWxlY3RlZEZsb29yU2lkZWJhcicsIHtzdGF0aWM6IHRydWV9KSBzZWxlY3RlZEZsb29yU2lkZWJhcjogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCd0b29sYmFySWNvbkZhcScsIHtzdGF0aWM6IHRydWV9KSB0b29sYmFySWNvbkZhcTogVGVtcGxhdGVSZWY8YW55PjtcclxuICBAVmlld0NoaWxkKCd0b29sYmFySWNvbkZlZWRiYWNrJywge3N0YXRpYzogdHJ1ZX0pIHRvb2xiYXJJY29uRmVlZGJhY2s6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQFZpZXdDaGlsZCgndG9vbGJhckljb25DYXJ0Jywge3N0YXRpYzogdHJ1ZX0pIHRvb2xiYXJJY29uQ2FydDogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIGxheWVyQ2xhc3MgPSAnbGF5ZXInO1xyXG4gIEBJbnB1dCgpIGlzTG9hZGluZzogYm9vbGVhbjtcclxuXHJcbiAgQE91dHB1dCgpIGRvbmUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHNob3dQbHVnaW4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZm9jdXNDb250cm9scyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgcHVibGljIHJlYWRvbmx5IGljb246IHR5cGVvZiBJY29uRW51bSA9IEljb25FbnVtO1xyXG4gIHB1YmxpYyByZWFkb25seSBpY29uTmFtZTogdHlwZW9mIEljb25OYW1lID0gSWNvbk5hbWU7XHJcbiAgcHVibGljIHJlYWRvbmx5IHZpZXdNb2RlczogdHlwZW9mIFZpZXdNb2RlID0gVmlld01vZGU7XHJcblxyXG4gIG9iamVjdHM6IFRocmVlZE1vZGVsW107XHJcbiAgY3VzdG9tT2JqZWN0czogVGhyZWVkTW9kZWxbXTtcclxuICBsaWJyYXJ5T2JqZWN0czogVGhyZWVkTW9kZWxbXTtcclxuICBjYXRlZ29yaWVzOiBDYXRlZ29yeVtdO1xyXG4gIGFjY2Vzc29pcmVDYXRlZ29yaWVzOiBDYXRlZ29yeVtdO1xyXG4gIHNlbGVjdGVkQ2F0ZWdvcnk6IENhdGVnb3J5O1xyXG4gIHNob3dDb250ZXh0TWVudTogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gIHNlbGVjdGVkV2FsbDogV2FsbDtcclxuICBzZWxlY3RlZEVkZ2U6IHN0cmluZztcclxuICBzZWxlY3RlZEZsb29yOiBGbG9vclBsYW5lSXRlbTtcclxuICBzZWxlY3RlZFJvb206IFJvb207XHJcbiAgc2VsZWN0ZWRPYmplY3Q6IEl0ZW0gfCBJdGVtR3JvdXA7XHJcblxyXG4gIHB1YmxpYyB3YWxsTGVuZ3RoSW5mb0RpYWxvZ0VuYWJsZWQgPSB0cnVlO1xyXG4gIHB1YmxpYyBtYXhXYWxsSGVpZ2h0OiBudW1iZXI7XHJcbiAgcHVibGljIG1heFdhbGxUaGlja25lc3M6IG51bWJlcjtcclxuICBwdWJsaWMgbWF4V2FsbExlbmd0aDogbnVtYmVyO1xyXG4gIHB1YmxpYyBtaW5XYWxsTGVuZ3RoOiBudW1iZXI7XHJcbiAgcHVibGljIGRlc2t0b3BTaXplU2NyZWVuOiBib29sZWFuO1xyXG4gIHB1YmxpYyB0YWJsZXRTaXplU2NyZWVuOiBib29sZWFuO1xyXG4gIHB1YmxpYyBwaG9uZVNpemVTY3JlZW46IGJvb2xlYW47XHJcbiAgcHVibGljIGNvbnRleHRNZW51TW91c2VFdmVudDogTW91c2VFdmVudDtcclxuICBwdWJsaWMgc2hvd1NldHRpbmdzQnV0dG9uOiBib29sZWFuO1xyXG4gIHB1YmxpYyBzaG93Q29uZmlndXJhdGlvbkJ1dHRvbjogYm9vbGVhbjtcclxuICBwdWJsaWMgc2hvd0RlbGV0ZUJ1dHRvbjogYm9vbGVhbjtcclxuICBwdWJsaWMgc2hvd0xvY2tCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBzaG93QVJCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHB1YmxpYyBzaG93Q29weUJ1dHRvbjogYm9vbGVhbjtcclxuICBwdWJsaWMgc2hvd0dyb3VwTWVudTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzaG93R3JvdXBFZGl0TWVudUJ1dHRvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd0ljb246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgdXNlcklzR3JvdXBpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd0NvbnZlcnNpb25CdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgYWRkU2VsZWN0ZWRDbGFzczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzYWxhYmxlT2JqZWN0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX3N1YnM6IFN1YnNjcmlwdGlvbltdID0gW107XHJcbiAgcHJpdmF0ZSBfYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgcHJpdmF0ZSBfbW9kZSA9IFZpZXdNb2RlLlJvb21QbGFuM0Q7XHJcbiAgcHJpdmF0ZSBfY2F0YWxvZ0lzU2hvd246IGJvb2xlYW47XHJcbiAgcHJpdmF0ZSBfYmxvY2tMZWZ0U2lkZUJhciA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBpY29uU2VydmljZTogSG9tZWRlY29yYXRvckljb25DYWNoZVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgdmlld01vZGVTZXJ2aWNlOiBWaWV3TW9kZVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgbW9kZWxzU2VydmljZTogTW9kZWxzU2VydmljZSxcclxuICAgIHByaXZhdGUgX3ByZXNldHNTZXJ2aWNlOiBQcmVzZXRzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2FwcFNlcnZpY2U6IEhvbWVkZWNvcmF0b3JBcHBTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc2NyZWVuQW5hbHlzaXM6IFNjcmVlblNpemVBbmFseXNpc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9jZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIF91dGlsc1NlcnZpY2U6IFV0aWxzU2VydmljZSxcclxuICAgIHByaXZhdGUgX21lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlQnVzU2VydmljZSxcclxuICAgIHByaXZhdGUgX2RpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSBfY29uZmlndXJhdGlvblNlcnZpY2U6IENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZmxvb3JwbGFuU2VydmljZTogRmxvb3JwbGFuU2VydmljZSxcclxuICAgIHByaXZhdGUgX3NjZW5lU2VydmljZTogU2NlbmVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfaHVkU2VydmljZTogSHVkU2VydmljZSxcclxuICAgIHByaXZhdGUgX3Jvb21TZXJ2aWNlOiBSb29tU2VydmljZSxcclxuICAgIHByaXZhdGUgX2NhbWVyYVNlcnZpY2U6IENhbWVyYVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pdGVtU2VydmljZTogSXRlbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9pdGVtU2VyaWFsaXphdGlvblNlcnZpY2U6IEl0ZW1TZXJpYWxpemF0aW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgX2xpZ2h0c1NlcnZpY2U6IExpZ2h0c1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9hclNlcnZpY2U6IEFyU2VydmljZSxcclxuICAgIHB1YmxpYyBpdGVtU2VydmljZTogSXRlbVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgc2V0dGluZ3NTZXJ2aWNlOiBIb21lZGVjb3JhdG9yU2V0dGluZ3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZ29vZ2xlVGFnTWFuYWdlcjogR29vZ2xlVGFnTWFuYWdlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIF9wZXJtYW5lbnRTdG9yZVNlcnZpY2U6IFBlcm1hbmVudFN0b3JlU2VydmljZSxcclxuICAgIHByaXZhdGUgX2FwcEV2ZW50U2VydmljZTogSG9tZWRlY29yYXRvckFwcEV2ZW50U2VydmljZSxcclxuICAgIHByaXZhdGUgX2Nvbm5lY3RvclNlcnZpY2U6IEhvbWVkZWNvcmF0b3JDb25uZWN0b3JTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfY29ubmVjdG9yQWRhcHRlclNlcnZpY2U6IEhvbWVkZWNvcmF0b3JDb25uZWN0b3JBZGFwdGVyU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5fcHJlc2V0c1NlcnZpY2UucmVnaXN0ZXIodGhpcyk7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBwdWJsaWMgaGFuZGxlRG9jS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgdGhpcy5oYW5kbGVLZXlEb3duKGV2ZW50KTtcclxuICB9XHJcblxyXG4gIGdldCBzZWxlY3RlZEVkZ2VzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRXYWxsICYmIHRoaXMuc2VsZWN0ZWRFZGdlID9cclxuICAgICAgW3RoaXMuc2VsZWN0ZWRXYWxsW3RoaXMuc2VsZWN0ZWRFZGdlXV0gOlxyXG4gICAgICBbdGhpcy5zZWxlY3RlZFdhbGwgJiYgdGhpcy5zZWxlY3RlZFdhbGwuYmFja0VkZ2UsXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFdhbGwgJiYgdGhpcy5zZWxlY3RlZFdhbGwuZnJvbnRFZGdlXHJcbiAgICAgIF0uZmlsdGVyKGVkZ2UgPT4gZWRnZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMubWF4V2FsbEhlaWdodCA9IHRoaXMuX2NvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFZhbHVlKENvbmZpZ3VyYXRpb25LZXkuTWF4V2FsbEhlaWdodCk7XHJcbiAgICB0aGlzLm1heFdhbGxUaGlja25lc3MgPSB0aGlzLl9jb25maWd1cmF0aW9uU2VydmljZS5nZXRWYWx1ZShDb25maWd1cmF0aW9uS2V5Lk1heFdhbGxUaGlja25lc3MpO1xyXG4gICAgdGhpcy5tYXhXYWxsTGVuZ3RoID0gdGhpcy5fY29uZmlndXJhdGlvblNlcnZpY2UuZ2V0VmFsdWUoQ29uZmlndXJhdGlvbktleS5NYXhXYWxsTGVuZ3RoKTtcclxuICAgIHRoaXMubWluV2FsbExlbmd0aCA9IHRoaXMuX2NvbmZpZ3VyYXRpb25TZXJ2aWNlLmdldFZhbHVlKENvbmZpZ3VyYXRpb25LZXkuTWluV2FsbExlbmd0aCk7XHJcblxyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5SZWdpc3RlclRvb2xiYXJJY29uLCB7XHJcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnRvb2xiYXJJY29uTGlicmFyeSxcclxuICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICBwcmlvcml0eTogMjAwXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVnaXN0ZXJUb29sYmFySWNvbiwge1xyXG4gICAgICB0ZW1wbGF0ZTogdGhpcy50b29sYmFySWNvbkFjY2Vzc29pcmVzLFxyXG4gICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgIHByaW9yaXR5OiAyMDBcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5SZWdpc3RlclRvb2xiYXJJY29uLCB7XHJcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnRvb2xiYXJJY29uMmRWaWV3LFxyXG4gICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgIHByaW9yaXR5OiA0MDBcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5SZWdpc3RlclRvb2xiYXJJY29uLCB7XHJcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnRvb2xiYXJJY29uM2RWaWV3LFxyXG4gICAgICBwb3NpdGlvbjogJ3RvcCcsXHJcbiAgICAgIHByaW9yaXR5OiA0MDBcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5SZWdpc3RlclRvb2xiYXJJY29uLCB7XHJcbiAgICAgIHRlbXBsYXRlOiB0aGlzLnRvb2xiYXJJY29uU2V0dGluZ3MsXHJcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgcHJpb3JpdHk6IDUwMFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlJlZ2lzdGVyVG9vbGJhckljb24sIHtcclxuICAgICAgdGVtcGxhdGU6IHRoaXMudG9vbGJhckljb25GYXEsXHJcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgcHJpb3JpdHk6IDYwMFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlJlZ2lzdGVyVG9vbGJhckljb24sIHtcclxuICAgICAgdGVtcGxhdGU6IHRoaXMudG9vbGJhckljb25GZWVkYmFjayxcclxuICAgICAgcG9zaXRpb246ICd0b3AnLFxyXG4gICAgICBwcmlvcml0eTogNzAwXHJcbiAgICB9KTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVnaXN0ZXJUb29sYmFySWNvbiwge1xyXG4gICAgICB0ZW1wbGF0ZTogdGhpcy50b29sYmFySWNvbkNhcnQsXHJcbiAgICAgIHBvc2l0aW9uOiAndG9wJyxcclxuICAgICAgcHJpb3JpdHk6IDEwMDBcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy5fYXBwU2VydmljZS5jYXRlZ29yaWVzTG9hZGVkLnN1YnNjcmliZSgoY2F0ZWdvcmllczogQ2F0ZWdvcnlbXSkgPT4ge1xyXG4gICAgICAgIGlmIChjYXRlZ29yaWVzKSB7XHJcbiAgICAgICAgICB0aGlzLmNhdGVnb3JpZXMgPSB0aGlzLl9hcHBTZXJ2aWNlLmdldENhdGVnb3JpZXMoJ2FyY2hpdGVjdHVyZScpO1xyXG4gICAgICAgICAgdGhpcy5hY2Nlc3NvaXJlQ2F0ZWdvcmllcyA9IHRoaXMuX2FwcFNlcnZpY2UuZ2V0Q2F0ZWdvcmllcygnYWNjZXNzb2lyZXMnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLnZpZXdNb2RlU2VydmljZS52aWV3TW9kZUNoYW5nZWQuc3Vic2NyaWJlKChtb2RlOiBWaWV3TW9kZSkgPT4gdGhpcy5fdmlld01vZGVDaGFuZ2VkKG1vZGUpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlNldDJEVmlldywgKHtzZW5kVXBkYXRlc30pID0+IHRoaXMudXBkYXRlTW9kZShWaWV3TW9kZS5GbG9vclBsYW4yRCwgc2VuZFVwZGF0ZXMpKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLlNldDNEVmlldywgKHtzZW5kVXBkYXRlc30pID0+IHRoaXMudXBkYXRlTW9kZShWaWV3TW9kZS5Sb29tUGxhbjNELCBzZW5kVXBkYXRlcykpLFxyXG4gICAgICB0aGlzLl9pbml0U2NyZWVuU2l6ZUhhbmRsaW5nKCksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5Hcm91cE1vZGVDaGFuZ2VkLCAoe3Nob3dHcm91cE1lbnV9KSA9PiB7XHJcbiAgICAgICAgdGhpcy5zaG93R3JvdXBNZW51ID0gc2hvd0dyb3VwTWVudTtcclxuICAgICAgfSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5JdGVtU2VsZWN0ZWQsIChpdGVtKSA9PiB0aGlzLm9iamVjdFNlbGVjdGVkKGl0ZW0pKSxcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2Uuc3Vic2NyaWJlKE1lc3NhZ2VUeXBlLkl0ZW1VbnNlbGVjdGVkLCAoaXRlbSkgPT4gdGhpcy5vYmplY3RVbnNlbGVjdGVkKCkpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuTGVmdFNpZGViYXJDbG9zZUNsaWNrZWQsICgpID0+IHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRmxvb3IgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFdhbGwgPSB1bmRlZmluZWQ7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYU1vdmVtZW50Q2hhbmdlZC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZSksXHJcbiAgICAgIHRoaXMuX3Jvb21TZXJ2aWNlLndhbGxTZWxlY3RlZC5zdWJzY3JpYmUoKHNlbGVjdGVkV2FsbEV2ZW50OiBTZWxlY3RlZFdhbGxFdmVudCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkRmxvb3IpIHtcclxuICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZUxlZnRTaWRlYmFyKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEZsb29yID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNlbGVjdFdhbGwoc2VsZWN0ZWRXYWxsRXZlbnQpO1xyXG4gICAgICB9KSxcclxuICAgICAgdGhpcy5fcm9vbVNlcnZpY2UuZmxvb3JTZWxlY3RlZC5zdWJzY3JpYmUoKHNlbGVjdGVkRmxvb3JFdmVudDogU2VsZWN0ZWRGbG9vckV2ZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRXYWxsKSB7XHJcbiAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVMZWZ0U2lkZWJhcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRXYWxsID0gbnVsbDtcclxuICAgICAgICB0aGlzLnNlbGVjdEZsb29yKHNlbGVjdGVkRmxvb3JFdmVudCk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0aGlzLl9pdGVtU2VydmljZS5jb3B5SXRlbS5zdWJzY3JpYmUoKGl0ZW06IEl0ZW0pID0+IHRoaXMuX2NvcHlJdGVtKGl0ZW0pKSxcclxuICAgICAgdGhpcy5faXRlbVNlcnZpY2UuZGVsZXRlSXRlbS5zdWJzY3JpYmUoKGl0ZW06IEl0ZW0pID0+IHRoaXMuX3JlbW92ZU9iamVjdChpdGVtKSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5TaG93UHJvZHVjdENhdGFsb2csICgpID0+IHRoaXMuX2NhdGFsb2dJc1Nob3duID0gdHJ1ZSksXHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLnN1YnNjcmliZShNZXNzYWdlVHlwZS5IaWRlUHJvZHVjdENhdGFsb2csICgpID0+IHRoaXMuX2NhdGFsb2dJc1Nob3duID0gZmFsc2UpLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuQmxvY2tMZWZ0U2lkZWJhciwgKGJsb2NrKSA9PiB0aGlzLl9ibG9ja0xlZnRTaWRlQmFyID0gYmxvY2spLFxyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5zdWJzY3JpYmUoTWVzc2FnZVR5cGUuU2hvd0Z1cm5pdHVyZVNpZGViYXIsIChjYXRlZ29yeTogQ2F0ZWdvcnkpID0+IHRoaXMuc2hvd0xpYnJhcnlDYXRlZ29yeShjYXRlZ29yeSkpLFxyXG4gICAgICB0aGlzLl9hcHBFdmVudFNlcnZpY2Uub2JqZWN0TW92aW5nT3JSb3RhdGluZy5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZSlcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5zaG93QVJCdXR0b24gPSB0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5ncy5vcHRpb25zLnNob3dBckJ1dHRvbiAmJiBhd2FpdCB0aGlzLl9hclNlcnZpY2UuYXJTdXBwb3J0ZWQoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fc3Vicy5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcclxuICAgIHRoaXMudG9vbGJhckljb25MaWJyYXJ5ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50b29sYmFySWNvbkFjY2Vzc29pcmVzID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50b29sYmFySWNvblNldHRpbmdzID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy50b29sYmFySWNvbjJkVmlldyA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudG9vbGJhckljb24zZFZpZXcgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmNhdGVnb3JpZXNTaWRlYmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5hY2Nlc3NvaXJlc0NhdGVnb3JpZXNTaWRlYmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5jdXN0b21TaGFwZUNyZWF0b3JTaWRlQmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5jdXN0b21DeWxpbmRlckNyZWF0b3JTaWRlQmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZXR0aW5nc1NpZGViYXIgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmxpYnJhcnlTaWRlYmFyID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZWxlY3RlZE9iamVjdFNpZGViYXIgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkV2FsbFNpZGViYXIgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnNlbGVjdGVkVGhyZWVkT2JqZWN0U2lkZWJhciA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMuc2VsZWN0ZWRGbG9vclNpZGViYXIgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLl9hY3RpdmVDYXRlZ29yeVNpZGViYXJUZW1wbGF0ZSA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRTY3JlZW5TaXplSGFuZGxpbmcoKTogU3Vic2NyaXB0aW9uIHtcclxuICAgIHJldHVybiB0aGlzLl9zY3JlZW5BbmFseXNpcy5zY3JlZW5TaXplQ2hhbmdlZC5zdWJzY3JpYmUoKGluZm86IFNjcmVlblNpemVJbmZvKSA9PiB7XHJcbiAgICAgIHRoaXMuZGVza3RvcFNpemVTY3JlZW4gPSBpbmZvLmlzRGVza3RvcFNpemU7XHJcbiAgICAgIHRoaXMudGFibGV0U2l6ZVNjcmVlbiA9IGluZm8uaXNUYWJsZXRTaXplO1xyXG4gICAgICB0aGlzLnBob25lU2l6ZVNjcmVlbiA9IGluZm8uaXNQaG9uZVNpemU7XHJcblxyXG4gICAgICBpZiAoIXRoaXMuZGVza3RvcFNpemVTY3JlZW4gJiYgKHRoaXMudmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkgfHwgdGhpcy52aWV3TW9kZVNlcnZpY2UuaXNWUlZpZXdBY3RpdmUoKSkpIHtcclxuICAgICAgICB0aGlzLnVwZGF0ZU1vZGUoVmlld01vZGUuUm9vbVBsYW4zRCwgdHJ1ZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdmlld01vZGVDaGFuZ2VkKG1vZGU6IFZpZXdNb2RlKSB7XHJcbiAgICB0aGlzLl9tb2RlID0gbW9kZTtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICB9XHJcblxyXG4gIG9iamVjdFNlbGVjdGVkKG9iamVjdDogSXRlbSB8IEl0ZW1Hcm91cCkge1xyXG4gICAgdGhpcy51bnNlbGVjdEFsbCgpO1xyXG4gICAgdGhpcy5zYWxhYmxlT2JqZWN0ID0gZmFsc2U7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IHRydWU7XHJcbiAgICB0aGlzLnNlbGVjdGVkT2JqZWN0ID0gb2JqZWN0O1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSXRlbUdyb3VwKSB7XHJcbiAgICAgIHRoaXMuc2hvd0dyb3VwTWVudSA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2hvd0dyb3VwRWRpdE1lbnVCdXR0b25zID0gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEl0ZW0pIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRPYmplY3QubWV0YWRhdGEgJiYgdGhpcy5zZWxlY3RlZE9iamVjdC5tZXRhZGF0YS5nb29kSWQpIHtcclxuICAgICAgICB0aGlzLnNhbGFibGVPYmplY3QgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2hvd0dyb3VwTWVudSA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNob3dTZXR0aW5nc0J1dHRvbiA9IHRoaXMuX2hhc1NldHRpbmdzKHRoaXMuc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICB0aGlzLnNob3dDb25maWd1cmF0aW9uQnV0dG9uID0gdGhpcy5faXNDb25maWd1cmFibGUodGhpcy5zZWxlY3RlZE9iamVjdCk7XHJcbiAgICAgIHRoaXMuc2hvd0RlbGV0ZUJ1dHRvbiA9IHRoaXMuX2lzRGVsZXRhYmxlKHRoaXMuc2VsZWN0ZWRPYmplY3QpO1xyXG4gICAgICB0aGlzLnNob3dDb3B5QnV0dG9uID0gdGhpcy5faXNDb3B5YWJsZSh0aGlzLnNlbGVjdGVkT2JqZWN0KTtcclxuICAgICAgdGhpcy5zaG93Q29udmVyc2lvbkJ1dHRvbiA9IHRoaXMuX2lzQ29udmVyc2lvbkl0ZW0odGhpcy5zZWxlY3RlZE9iamVjdCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE9iamVjdC5tZXRhZGF0YS5jb252ZXJzaW9uR1RNU2VuZCkge1xyXG4gICAgICAgIHRoaXMuYWRkU2VsZWN0ZWRDbGFzcyA9IHRoaXMuc2VsZWN0ZWRPYmplY3QubWV0YWRhdGEuY29udmVyc2lvbkdUTVNlbmQ7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hZGRTZWxlY3RlZENsYXNzID0gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl91dGlsc1NlcnZpY2UuZm9yY2VDaGFuZ2VEZXRlY3Rpb24odGhpcy5fY2QsIHRoaXMsICdzZWxlY3RlZE9iamVjdCcpO1xyXG4gICAgdGhpcy5zZWxlY3RlZCgpO1xyXG4gIH1cclxuXHJcbiAgc2hvd1NlbGVjdGVkT2JqZWN0U2lkZWJhcigpIHtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkhpZGVQcm9kdWN0Q2F0YWxvZyk7XHJcblxyXG4gICAgY29uc3QgbWV0YWRhdGEgPSB0aGlzLnNlbGVjdGVkT2JqZWN0Lm1ldGFkYXRhO1xyXG4gICAgaWYgKG1ldGFkYXRhICYmIChpc0N1c3RvbVNoYXBlVHlwZShtZXRhZGF0YS5pdGVtVHlwZSkgfHwgaXNDdXN0b21TaGFwZVdhbGxUeXBlKG1ldGFkYXRhLml0ZW1UeXBlKSkpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5jdXN0b21TaGFwZUNyZWF0b3JTaWRlQmFyKTtcclxuICAgIH0gZWxzZSBpZiAobWV0YWRhdGEgJiYgKGlzQ3VzdG9tQ3lsaW5kZXJUeXBlKG1ldGFkYXRhLml0ZW1UeXBlKSB8fCBpc0N1c3RvbUN5bGluZGVyV2FsbFR5cGUobWV0YWRhdGEuaXRlbVR5cGUpKSkge1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLmN1c3RvbUN5bGluZGVyQ3JlYXRvclNpZGVCYXIpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5zZWxlY3RlZE9iamVjdFNpZGViYXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZUNvbmZpZ3VyYXRpb25CdXR0b25DbGljayhidG46IEN1c3RvbUJ1dHRvbik6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZTtcclxuICAgIGJ0bi5oYW5kbGVyKHRoaXMuc2VsZWN0ZWRPYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgb2JqZWN0VW5zZWxlY3RlZCgpIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuc2hvd0dyb3VwTWVudSA9IGZhbHNlO1xyXG4gICAgdGhpcy5zaG93R3JvdXBFZGl0TWVudUJ1dHRvbnMgPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVNlbGVjdGVkT2JqZWN0SHVkKCkge1xyXG4gICAgdGhpcy5faHVkU2VydmljZS51cGRhdGVTZWxlY3RlZEl0ZW1IdWQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVEZWxldGVPYmplY3QoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZE9iamVjdCAmJiB0aGlzLl9pc0RlbGV0YWJsZSh0aGlzLnNlbGVjdGVkT2JqZWN0KSkge1xyXG4gICAgICB0aGlzLnJlbW92ZVNlbGVjdGVkT2JqZWN0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZW1vdmVTZWxlY3RlZE9iamVjdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgICB0aGlzLl9yZW1vdmVPYmplY3QodGhpcy5zZWxlY3RlZE9iamVjdCk7XHJcbiAgICB0aGlzLm9iamVjdFVuc2VsZWN0ZWQoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVMb2NrU2VsZWN0ZWRPYmplY3QoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IGZhbHNlO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRPYmplY3QpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdC5sb2NrZWQgPSAhdGhpcy5zZWxlY3RlZE9iamVjdC5sb2NrZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZW1vdmVPYmplY3Qob2JqZWN0OiBJdGVtIHwgSXRlbUdyb3VwKSB7XHJcbiAgICBpZiAoaXNXYWxsVHlwZShvYmplY3QudXNlckRhdGEuaXRlbVR5cGUpKSB7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRXYWxsID0gKDxXYWxsSXRlbT5vYmplY3QpLmN1cnJlbnRXYWxsO1xyXG4gICAgICBpZiAoY3VycmVudFdhbGwpIHtcclxuICAgICAgICBjdXJyZW50V2FsbC5yZW1vdmVJdGVtKDxJdGVtPm9iamVjdCk7XHJcbiAgICAgICAgY3VycmVudFdhbGwucmVtb3ZlT25JdGVtKDxJdGVtPm9iamVjdCk7XHJcbiAgICAgICAgY3VycmVudFdhbGwuZmlyZVJlZHJhdygpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGlzRnVybml0dXJlVHlwZShvYmplY3QudXNlckRhdGEuaXRlbVR5cGUpKSB7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuUmVtb3ZlU2VsZWN0ZWRGdXJuaXR1cmUpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAob2JqZWN0LmNhbkJlUmVtb3ZlZCgpKSB7XHJcbiAgICAgIHRoaXMuX3JlbW92ZUl0ZW0ob2JqZWN0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG9iamVjdC5yZW1vdmVkKCk7XHJcbiAgICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZW1vdmVJdGVtKG9iamVjdDogSXRlbSB8IEl0ZW1Hcm91cCkge1xyXG4gICAgdGhpcy5faXRlbVNlcnZpY2UucmVtb3ZlSXRlbShvYmplY3QpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICdyZW1vdmVPYmplY3QnfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb3B5U2VsZWN0ZWRPYmplY3QoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fY29weUl0ZW0odGhpcy5zZWxlY3RlZE9iamVjdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIF9jb3B5SXRlbShvcmlnaW5hbDogSXRlbSB8IEl0ZW1Hcm91cCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3QgaXNDdXN0b21TaGFwZUl0ZW06IGJvb2xlYW4gPSBvcmlnaW5hbCBpbnN0YW5jZW9mIEN1c3RvbVNoYXBlRmxvb3JJdGVtO1xyXG4gICAgY29uc3QgaXNDdXN0b21TaGFwZVdhbGxJdGVtOiBib29sZWFuID0gb3JpZ2luYWwgaW5zdGFuY2VvZiBDdXN0b21TaGFwZVdhbGxJdGVtO1xyXG4gICAgY29uc3QgaXNDdXN0b21DeWxpbmRlckl0ZW06IGJvb2xlYW4gPSBvcmlnaW5hbCBpbnN0YW5jZW9mIEN1c3RvbUN5bGluZGVyRmxvb3JJdGVtO1xyXG4gICAgY29uc3QgaXNDdXN0b21DeWxpbmRlcldhbGxJdGVtOiBib29sZWFuID0gb3JpZ2luYWwgaW5zdGFuY2VvZiBDdXN0b21DeWxpbmRlcldhbGxJdGVtO1xyXG4gICAgY29uc3QgaXNSZXNpemFibGVEb29yT3JXaW5kb3c6IGJvb2xlYW4gPSBvcmlnaW5hbCBpbnN0YW5jZW9mIEluV2FsbEl0ZW0gJiYgb3JpZ2luYWwuaXNDdXN0b207XHJcbiAgICBpZiAoaXNDdXN0b21TaGFwZUl0ZW0gfHwgaXNDdXN0b21TaGFwZVdhbGxJdGVtIHx8IGlzQ3VzdG9tQ3lsaW5kZXJJdGVtIHx8IGlzQ3VzdG9tQ3lsaW5kZXJXYWxsSXRlbSB8fCBpc1Jlc2l6YWJsZURvb3JPcldpbmRvdykge1xyXG4gICAgICBjb25zdCBjb3B5ID0gKG9yaWdpbmFsIGFzIEN1c3RvbVNoYXBlRmxvb3JJdGVtIHwgSW5XYWxsSXRlbSkuY2xvbmVJdGVtKCk7XHJcbiAgICAgIHRoaXMuX2l0ZW1TZXJ2aWNlLmFkZEl0ZW0oY29weSk7XHJcbiAgICAgIGlmIChjb3B5IGluc3RhbmNlb2YgV2FsbEl0ZW0pIHtcclxuICAgICAgICBjb25zdCBjbG9zZXN0V2FsbEVkZ2UgPSB0aGlzLl9yb29tU2VydmljZS5nZXRDbG9zZXN0V2FsbEVkZ2Uob3JpZ2luYWwucG9zaXRpb24ueCwgb3JpZ2luYWwucG9zaXRpb24ueik7XHJcbiAgICAgICAgY29weS5wbGFjZU9uRWRnZShjbG9zZXN0V2FsbEVkZ2UpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0RHJhZywgY29weSk7XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU3RhcnREcmFnLCBvcmlnaW5hbC5wb3NpdGlvbik7XHJcbiAgICB9IGVsc2UgaWYgKG9yaWdpbmFsLnVzZXJEYXRhICYmIG9yaWdpbmFsLnVzZXJEYXRhLml0ZW1JZGVudGlmaWVyKSB7XHJcbiAgICAgIGlmIChvcmlnaW5hbC5tZXRhZGF0YS50aGlyZFBhcnR5TW9kZWwpIHtcclxuICAgICAgICAvLyBXaGVuIGl0J3MgYSB0aGlyZCBwYXJ0eSBtb2RlbCwgd2Ugc2hvdWxkIGp1c3QgY2xvbmUgdGhlIE9iamVjdCgzRClcclxuICAgICAgICAvLyBjb25zdCBjbG9uZSA9IG9yaWdpbmFsLmNsb25lKCk7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5DbG9uZVRoaXJkUGFydHlNb2RlbCwgb3JpZ2luYWwgYXMgSXRlbSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5Db3B5SU9uZUZ1cm5pdHVyZUludG9TY2VuZUJ5U0tVLCBvcmlnaW5hbCBhcyBJdGVtKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgZHJhZ2dlZERhdGE6IERyYWdnZWREYXRhID0ge1xyXG4gICAgICAgIG5hbWU6IG9yaWdpbmFsLm5hbWUsXHJcbiAgICAgICAgdHlwZTogb3JpZ2luYWwubWV0YWRhdGEuaXRlbVR5cGUsXHJcbiAgICAgICAgaU9uZTogZmFsc2UsXHJcbiAgICAgICAgb3ZlcnJpZGVzOiB7XHJcbiAgICAgICAgICByb3RhdGlvbjogb3JpZ2luYWwucm90YXRpb24gJiYgb3JpZ2luYWwucm90YXRpb24uY2xvbmUoKSxcclxuICAgICAgICAgIC8vIHNjYWxlOiBvcmlnaW5hbC5zY2FsZSAmJiBvcmlnaW5hbC5zY2FsZS5jbG9uZSgpLFxyXG4gICAgICAgICAgb3BlbmluZzogKG9yaWdpbmFsIGFzIGFueSkub3BlbmluZyxcclxuICAgICAgICAgIHRleHR1cmU6IChvcmlnaW5hbCBhcyBhbnkpLnRleHR1cmUsXHJcbiAgICAgICAgICBpc0NvcHk6IHRydWVcclxuICAgICAgICB9XHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0RHJhZywgZHJhZ2dlZERhdGEpO1xyXG4gICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlN0YXJ0RHJhZywgb3JpZ2luYWwucG9zaXRpb24pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgem9vbVJlc2V0KCkge1xyXG4gICAgdGhpcy5mbG9vcnBsYW5uZXIuem9vbVJlc2V0KCk7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FudFpvb21PdXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mbG9vcnBsYW5uZXIuY2FudFpvb21PdXQ7XHJcbiAgfVxyXG5cclxuICBnZXQgY2FudFpvb21JbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmZsb29ycGxhbm5lci5jYW50Wm9vbUluO1xyXG4gIH1cclxuXHJcbiAgem9vbU91dCgpIHtcclxuICAgIHRoaXMuZmxvb3JwbGFubmVyLnpvb21PdXQoKTtcclxuICB9XHJcblxyXG4gIHpvb21JbigpIHtcclxuICAgIHRoaXMuZmxvb3JwbGFubmVyLnpvb21JbigpO1xyXG4gIH1cclxuXHJcbiAgdW5zZWxlY3RBbGwoKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRmxvb3IgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZEVkZ2UgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZFdhbGwgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZE9iamVjdCA9IG51bGw7XHJcbiAgICBpZiAoIXRoaXMuX2Jsb2NrTGVmdFNpZGVCYXIpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlTGVmdFNpZGViYXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZU1vZGUodmFsdWU6IFZpZXdNb2RlLCBzZW5kVXBkYXRlcyA9IGZhbHNlKSB7XHJcbiAgICB0aGlzLl9tb2RlID0gdmFsdWU7XHJcbiAgICBpZiAoc2VuZFVwZGF0ZXMpIHtcclxuICAgICAgdGhpcy52aWV3TW9kZVNlcnZpY2Uuc2V0Vmlld01vZGUodGhpcy5fZmxvb3JwbGFuU2VydmljZS5nZXRTaXplKCksIHRoaXMuX2Zsb29ycGxhblNlcnZpY2UuZ2V0Q2VudGVyKCksIHZhbHVlKTtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5WaWV3TW9kZUNoYW5nZWQsIHZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dMaWJyYXJ5Q2F0ZWdvcmllcygpIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0TGVmdFNpZGViYXIsIHRoaXMuY2F0ZWdvcmllc1NpZGViYXIpO1xyXG4gICAgdGhpcy5fYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGUgPSB0aGlzLmNhdGVnb3JpZXNTaWRlYmFyO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dBY2Nlc3NvaXJlQ2F0ZWdvcmllcygpOiB2b2lkIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0TGVmdFNpZGViYXIsIHRoaXMuYWNjZXNzb2lyZXNDYXRlZ29yaWVzU2lkZWJhcik7XHJcbiAgICB0aGlzLl9hY3RpdmVDYXRlZ29yeVNpZGViYXJUZW1wbGF0ZSA9IHRoaXMuYWNjZXNzb2lyZXNDYXRlZ29yaWVzU2lkZWJhcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzaG93QWN0aXZlQ2F0ZWdvcnlTaWRlYmFyKCk6IHZvaWQge1xyXG4gICAgdGhpcy51bnNlbGVjdEFsbCgpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlUHJvZHVjdENhdGFsb2cpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5fYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGUpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgc2hvd0xpYnJhcnlDYXRlZ29yeShjYXRlZ29yeTogQ2F0ZWdvcnkpIHtcclxuICAgIHRoaXMub2JqZWN0cyA9IGF3YWl0IHRoaXMubW9kZWxzU2VydmljZS5nZXRJdGVtc0Zyb21DYXRlZ29yeShjYXRlZ29yeS5pZCk7XHJcbiAgICB0aGlzLmN1c3RvbU9iamVjdHMgPSB0aGlzLm9iamVjdHMuZmlsdGVyKG9iamVjdCA9PiBvYmplY3QuaXNDdXN0b20pO1xyXG4gICAgdGhpcy5saWJyYXJ5T2JqZWN0cyA9IHRoaXMub2JqZWN0cy5maWx0ZXIob2JqZWN0ID0+ICFvYmplY3QuaXNDdXN0b20pO1xyXG4gICAgdGhpcy5zZWxlY3RlZENhdGVnb3J5ID0gY2F0ZWdvcnk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLmxpYnJhcnlTaWRlYmFyKTtcclxuICB9XHJcblxyXG4gIHNob3dTZXR0aW5ncygpIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZVByb2R1Y3RDYXRhbG9nKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2V0TGVmdFNpZGViYXIsIHRoaXMuc2V0dGluZ3NTaWRlYmFyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcGVuRmFxKHVybDogc3RyaW5nKSB7XHJcbiAgICByZXR1cm4gd2luZG93Lm9wZW4odXJsLCB0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5ncy5mYXFVcmwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dGYXEoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93SWNvbiA9IHRoaXMuc2V0dGluZ3NTZXJ2aWNlLnNldHRpbmdzLmZhcVVybCAhPT0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5GZWVkYmFjayh1cmw6IHN0cmluZykge1xyXG4gICAgd2luZG93Lm9wZW4odXJsLCB0aGlzLnNldHRpbmdzU2VydmljZS5zZXR0aW5ncy5mZWVkYmFja1VybCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkQWxsVG9DYXJ0KCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dGZWVkYmFjaygpIHtcclxuICAgIHJldHVybiB0aGlzLnNob3dJY29uID0gdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MuZmVlZGJhY2tVcmwgIT09IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHNlbGVjdGVkKCkge1xyXG4gICAgY29uc3Qgc2VsZWN0YWJsZXMgPSBbXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRFZGdlICYmIHRoaXMuc2VsZWN0ZWRXYWxsICYmIHRoaXMuc2VsZWN0ZWRXYWxsW3RoaXMuc2VsZWN0ZWRFZGdlXSxcclxuICAgICAgdGhpcy5zZWxlY3RlZFdhbGwsXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vcixcclxuICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdFxyXG4gICAgXTtcclxuICAgIGNvbnN0IHNlbGVjdGFibGUgPSBzZWxlY3RhYmxlc1swXTtcclxuICAgIGlmIChzZWxlY3RhYmxlKSB7XHJcbiAgICAgIHRoaXMuX21vZGUgPSBWaWV3TW9kZS5Sb29tUGxhbjNEO1xyXG4gICAgICB0aGlzLnNob3dQbHVnaW4uZW1pdChzZWxlY3RhYmxlKTtcclxuICAgIH0gZWxzZSBpZiAoIXNlbGVjdGFibGUpIHtcclxuICAgICAgdGhpcy5kb25lLmVtaXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpbmRFZGdlV2FsbFBsYWNlbWVudCh3YWxsLCBlZGdlKSB7XHJcbiAgICBjb25zdCBlZGdlUGxhY2VtZW50cyA9IFsnZnJvbnRFZGdlJywgJ2JhY2tFZGdlJ107XHJcbiAgICByZXR1cm4gZWRnZVBsYWNlbWVudHMucmVkdWNlKChwbGFjZW1lbnQsIHApID0+IHtcclxuICAgICAgaWYgKHdhbGxbcF0gPT09IGVkZ2UpIHtcclxuICAgICAgICBwbGFjZW1lbnQgPSBwO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBwbGFjZW1lbnQ7XHJcbiAgICB9LCBudWxsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RXYWxsKHNlbGVjdGVkV2FsbEV2ZW50OiBTZWxlY3RlZFdhbGxFdmVudCkge1xyXG4gICAgdGhpcy51bnNlbGVjdEFsbCgpO1xyXG4gICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSB0cnVlO1xyXG4gICAgdGhpcy5zZWxlY3RlZFdhbGwgPSBzZWxlY3RlZFdhbGxFdmVudC53YWxsO1xyXG4gICAgdGhpcy5jb250ZXh0TWVudU1vdXNlRXZlbnQgPSBzZWxlY3RlZFdhbGxFdmVudC5ldmVudDtcclxuICAgIGlmIChzZWxlY3RlZFdhbGxFdmVudC53YWxsKSB7XHJcbiAgICAgIGlmIChzZWxlY3RlZFdhbGxFdmVudC5lZGdlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEVkZ2UgPSB0aGlzLmZpbmRFZGdlV2FsbFBsYWNlbWVudChzZWxlY3RlZFdhbGxFdmVudC53YWxsLCBzZWxlY3RlZFdhbGxFdmVudC5lZGdlKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy52aWV3TW9kZVNlcnZpY2UuaXMyZFZpZXdBY3RpdmUoKSkge1xyXG4gICAgICAgIHRoaXMuc2hvd1NlbGVjdGVkV2FsbFNpZGViYXIoKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNlbGVjdGVkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzaG93U2VsZWN0ZWRXYWxsU2lkZWJhcigpIHtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLnNlbGVjdGVkV2FsbFNpZGViYXIpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dTZWxlY3RlZFRocmVlZE9iamVjdFNpZGViYXIoKSB7XHJcbiAgICB0aGlzLnNob3dDb250ZXh0TWVudSA9IGZhbHNlO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TZXRMZWZ0U2lkZWJhciwgdGhpcy5zZWxlY3RlZFRocmVlZE9iamVjdFNpZGViYXIpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Rmxvb3Ioc2VsZWN0ZWRGbG9vckV2ZW50OiBTZWxlY3RlZEZsb29yRXZlbnQpIHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRSb29tID0gc2VsZWN0ZWRGbG9vckV2ZW50LnJvb207XHJcbiAgICB0aGlzLnNlbGVjdGVkRmxvb3IgPSBzZWxlY3RlZEZsb29yRXZlbnQucm9vbS5mbG9vclBsYW5lO1xyXG4gICAgdGhpcy5jb250ZXh0TWVudU1vdXNlRXZlbnQgPSBzZWxlY3RlZEZsb29yRXZlbnQuZXZlbnQ7XHJcbiAgICBpZiAoc2VsZWN0ZWRGbG9vckV2ZW50LnJvb20pIHtcclxuICAgICAgaWYgKHRoaXMudmlld01vZGVTZXJ2aWNlLmlzMmRWaWV3QWN0aXZlKCkpIHtcclxuICAgICAgICB0aGlzLnNob3dTZWxlY3RlZEZsb29yU2lkZWJhcigpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNob3dTZWxlY3RlZEZsb29yU2lkZWJhcigpIHtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldExlZnRTaWRlYmFyLCB0aGlzLnNlbGVjdGVkRmxvb3JTaWRlYmFyKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZXRGbG9vclRleHR1cmUodGV4dHVyZTogVGV4dHVyZSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5fcm9vbVNlcnZpY2Uuc2V0Rmxvb3JUZXh0dXJlKHRoaXMuc2VsZWN0ZWRSb29tLCB0ZXh0dXJlKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAnZmxvb3JUZXh0dXJlJywgcGF0Y2g6IGZhbHNlfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0Rmxvb3JDb2xvcihjb2xvcjogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9yb29tU2VydmljZS5zZXRGbG9vckNvbG9yKHRoaXMuc2VsZWN0ZWRSb29tLCBjb2xvcik7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNhdmVTdGF0ZSwge2FjdGlvbjogJ2Zsb29yQ29sb3InLCBwYXRjaDogZmFsc2V9KTtcclxuICB9XHJcblxyXG4gIHJlbW92ZVdhbGwod2FsbDogV2FsbCkge1xyXG4gICAgd2FsbC5yZW1vdmUoKTtcclxuICAgIHRoaXMuX2Zsb29ycGxhblNlcnZpY2UucmVtb3ZlV2FsbCh3YWxsKTtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAncmVtb3ZlV2FsbCd9KTtcclxuICB9XHJcblxyXG4gIHNldFdhbGxMZW5ndGgoe2xlbmd0aCwgYXRFbmQsIGVkZ2V9OiB7IGxlbmd0aDogbnVtYmVyLCBhdEVuZDogYm9vbGVhbiwgZWRnZT86IEhhbGZFZGdlIH0pIHtcclxuICAgIGNvbnN0IHdhbGwgPSB0aGlzLnNlbGVjdGVkV2FsbDtcclxuICAgIGNvbnN0IG9yaWdMZW5ndGggPSBlZGdlID8gZWRnZS5pbnRlcmlvckRpc3RhbmNlKCkgOiB3YWxsLmxlbmd0aDtcclxuICAgIGNvbnN0IHN0YXJ0ID0gYXRFbmQgPyB3YWxsLmdldFN0YXJ0KCkgOiB3YWxsLmdldEVuZCgpO1xyXG4gICAgY29uc3QgZW5kID0gYXRFbmQgPyB3YWxsLmdldEVuZCgpIDogd2FsbC5nZXRTdGFydCgpO1xyXG4gICAgY29uc3QgZHggPSBlbmQueCAtIHN0YXJ0Lng7XHJcbiAgICBjb25zdCBkeSA9IGVuZC55IC0gc3RhcnQueTtcclxuICAgIGNvbnN0IGsgPSBsZW5ndGggLyBvcmlnTGVuZ3RoO1xyXG4gICAgZW5kLm1vdmUoayAqIGR4ICsgc3RhcnQueCwgayAqIGR5ICsgc3RhcnQueSk7XHJcbiAgICB0aGlzLl9mbG9vcnBsYW5TZXJ2aWNlLnVwZGF0ZSgpO1xyXG4gICAgdGhpcy5fcm9vbVNlcnZpY2UudXBkYXRlRmxvb3JzQW5kRWRnZXMoKS50aGVuKCgpID0+IHRoaXMuX2NhbWVyYVNlcnZpY2UuY2FtZXJhTW92ZW1lbnRDaGFuZ2VkLm5leHQoKSk7XHJcbiAgICB0aGlzLl9saWdodHNTZXJ2aWNlLnVwZGF0ZUFsbE9mZnNldHMoKTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAnd2FsbExlbmd0aCd9KTtcclxuXHJcbiAgICBpZiAodGhpcy53YWxsTGVuZ3RoSW5mb0RpYWxvZ0VuYWJsZWQgJiYgdGhpcy5fY29uZmlndXJhdGlvblNlcnZpY2UuZ2V0VmFsdWUoQ29uZmlndXJhdGlvbktleS5TaG93RGV0YWlsZWRXYWxsTWVhc3VyZW1lbnRzKSkge1xyXG4gICAgICBpZiAoZWRnZSAmJiBNYXRoLnJvdW5kKGVkZ2UuaW50ZXJpb3JEaXN0YW5jZSgpKSAhPT0gbGVuZ3RoKSB7XHJcbiAgICAgICAgdGhpcy5zaG93V2FsbExlbmd0aEluZm9EaWFsb2coKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2hvd1dhbGxMZW5ndGhJbmZvRGlhbG9nKCkge1xyXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5fZGlhbG9nLm9wZW4oSW5mb0RpYWxvZ0NvbXBvbmVudCwge1xyXG4gICAgICBkYXRhOiB7XHJcbiAgICAgICAgdGl0bGU6ICdJbmZvJyxcclxuICAgICAgICBtZXNzYWdlOlxyXG4gICAgICAgICAgYFJlc3VsdGluZyBsZW5ndGggb2Ygd2FsbCBzbGlnaHRseSBkaWZmZXJzIGZyb20gbGVuZ3RoIHlvdSBzcGVjaWZpZWQuXHJcbiAgICAgICAgICBUbyBmdXJ0aGVyIHJlZmluZSBsZW5ndGggb2YgdGhlIHdhbGwsIHVzZSAyRCBmbG9vcnBsYW4gYmx1ZXByaW50LmBcclxuICAgICAgfSxcclxuICAgICAgbWF4V2lkdGg6ICc1MDBweCdcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fc3Vicy5wdXNoKGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShkb250U2hvd0FnYWluID0+IHtcclxuICAgICAgdGhpcy53YWxsTGVuZ3RoSW5mb0RpYWxvZ0VuYWJsZWQgPSAhZG9udFNob3dBZ2FpbjtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHNldFdhbGxIZWlnaHQoaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRXYWxsLmhlaWdodCA9IGhlaWdodDtcclxuICAgIHRoaXMuX3Jvb21TZXJ2aWNlLnVwZGF0ZUNlaWxpbmdzKCk7XHJcbiAgICB0aGlzLnNlbGVjdGVkV2FsbC5maXJlUmVkcmF3KCk7XHJcbiAgICB0aGlzLl9mbG9vcnBsYW5TZXJ2aWNlLnVwZGF0ZSgpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICd3YWxsSGVpZ2h0J30pO1xyXG4gIH1cclxuXHJcbiAgc2V0V2FsbFRoaWNrbmVzcyh0aGlja25lc3M6IG51bWJlcikge1xyXG4gICAgdGhpcy5zZWxlY3RlZFdhbGwudGhpY2tuZXNzID0gdGhpY2tuZXNzO1xyXG4gICAgdGhpcy5fZmxvb3JwbGFuU2VydmljZS51cGRhdGUoKTtcclxuICAgIHRoaXMuX3Jvb21TZXJ2aWNlLnVwZGF0ZUZsb29yc0FuZEVkZ2VzKCkudGhlbigoKSA9PiB0aGlzLl9jYW1lcmFTZXJ2aWNlLmNhbWVyYU1vdmVtZW50Q2hhbmdlZC5uZXh0KCkpO1xyXG4gICAgdGhpcy5zZWxlY3RlZFdhbGwuZmlyZVJlZHJhdygpO1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5TYXZlU3RhdGUsIHthY3Rpb246ICd3YWxsVGhpY2tuZXNzJ30pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIHNldFdhbGxUZXh0dXJlKHRleHR1cmU6IFRleHR1cmUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIC8vIHRoaXMuc2VsZWN0ZWRFZGdlcy5mb3JFYWNoKGFzeW5jIChlZGdlKSA9PiBhd2FpdCBlZGdlLnNldFRleHR1cmUodGV4dHVyZSkpO1xyXG4gICAgY29uc3QgbGVuOiBudW1iZXIgPSB0aGlzLnNlbGVjdGVkRWRnZXMubGVuZ3RoO1xyXG4gICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGxlbjsgaSsrKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuc2VsZWN0ZWRFZGdlc1tpXS5zZXRUZXh0dXJlKHRleHR1cmUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc2NlbmVTZXJ2aWNlLm5lZWRzUmVuZGVyID0gdHJ1ZTtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuU2F2ZVN0YXRlLCB7YWN0aW9uOiAnd2FsbFRleHR1cmUnLCBwYXRjaDogZmFsc2V9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBzZXRXYWxsQ29sb3IoY29sb3I6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5zZWxlY3RlZEVkZ2VzLmZvckVhY2goYXN5bmMgKGVkZ2UpID0+IGF3YWl0IGVkZ2Uuc2V0Q29sb3IoY29sb3IpKTtcclxuICAgIHRoaXMuX3NjZW5lU2VydmljZS5uZWVkc1JlbmRlciA9IHRydWU7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNhdmVTdGF0ZSwge2FjdGlvbjogJ3dhbGxDb2xvcicsIHBhdGNoOiBmYWxzZX0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0Q29ybmVyKGNvcm5lcjogQ29ybmVyKSB7XHJcbiAgICB0aGlzLmZsb29ycGxhbm5lci5zZWxlY3RDb3JuZXIoY29ybmVyKTtcclxuICB9XHJcblxyXG4gIGdldE1pbldhbGxIZWlnaHQod2FsbDogV2FsbCk6IG51bWJlciB7XHJcbiAgICBpZiAoIXdhbGwpIHtcclxuICAgICAgcmV0dXJuIDA7XHJcbiAgICB9XHJcbiAgICBsZXQgcmVzdWx0ID0gMDtcclxuICAgIGNvbnN0IGNhc3RlZFdhbGw6IGFueSA9IHdhbGw7XHJcblxyXG4gICAgaWYgKGNhc3RlZFdhbGwuaXRlbXMpIHtcclxuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGNhc3RlZFdhbGwuaXRlbXMpIHtcclxuICAgICAgICByZXN1bHQgPSBNYXRoLm1heChyZXN1bHQsIGl0ZW0uaGFsZlNpemUueSArIGl0ZW0ucG9zaXRpb24ueSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoY2FzdGVkV2FsbC5vbkl0ZW1zKSB7XHJcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBjYXN0ZWRXYWxsLm9uSXRlbXMpIHtcclxuICAgICAgICByZXN1bHQgPSBNYXRoLm1heChyZXN1bHQsIGl0ZW0uaGFsZlNpemUueSArIGl0ZW0ucG9zaXRpb24ueSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gTWF0aC5jZWlsKHJlc3VsdCk7XHJcbiAgfVxyXG5cclxuICBnZXRNaW5HbG9iYWxXYWxsSGVpZ2h0KCk6IG51bWJlciB7XHJcbiAgICBjb25zdCB3YWxscyA9IHRoaXMuX3Jvb21TZXJ2aWNlLndhbGxzO1xyXG4gICAgaWYgKCF3YWxscykge1xyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH1cclxuICAgIHJldHVybiBNYXRoLm1heCgwLCAuLi53YWxscy5tYXAodGhpcy5nZXRNaW5XYWxsSGVpZ2h0KSk7XHJcbiAgfVxyXG5cclxuICB3YWxsc0hlaWdodFVwZGF0ZWQoaGVpZ2h0OiBudW1iZXIpIHtcclxuICAgIHRoaXMuX3Jvb21TZXJ2aWNlLnVwZGF0ZVdhbGxIZWlnaHRzKGhlaWdodCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNhdmVTdGF0ZSwge2FjdGlvbjogJ3dhbGxIZWlnaHQnfSk7XHJcbiAgfVxyXG5cclxuICBzZXREcmFnZ2VkKG9iamVjdDogTW9kZWxJbnRlcmZhY2UpIHtcclxuICAgIGNvbnN0IGRyYWdnZWREYXRhOiBEcmFnZ2VkRGF0YSA9IHtcclxuICAgICAgbmFtZTogb2JqZWN0Lm5hbWUsXHJcbiAgICAgIHR5cGU6ICtvYmplY3QudHlwZSxcclxuICAgICAgaU9uZTogZmFsc2VcclxuICAgIH07XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNldERyYWcsIGRyYWdnZWREYXRhKTtcclxuICB9XHJcblxyXG4gIHJlbGVhc2VEcmFnZ2VkKCkge1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5FeGl0RHJhZyk7XHJcbiAgfVxyXG5cclxuICBsb2FkRmxvb3JQbGFuKGRhdGEpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHRoaXMudW5zZWxlY3RBbGwoKTtcclxuICAgIHJldHVybiB0aGlzLl9mbG9vcnBsYW5TZXJ2aWNlLmxvYWRGbG9vcnBsYW4oZGF0YSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRBUlNlc3Npb24oKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZE9iamVjdCkge1xyXG4gICAgICBjb25zdCBhck9iamVjdCA9IHRoaXMuc2VsZWN0ZWRPYmplY3QuY2xvbmVWaXNpYmxlKCk7XHJcbiAgICAgIHRoaXMuX3NjZW5lU2VydmljZS5hck1vZGUgPSB0cnVlO1xyXG4gICAgICB0aGlzLl9zY2VuZVNlcnZpY2UuYWRkT2JqZWN0KGFyT2JqZWN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBhZGRUb0NhcnQob2JqZWN0OiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmIChvYmplY3QubWV0YWRhdGEpIHtcclxuICAgICAgdGhpcy5zaG93Q29udGV4dE1lbnUgPSBmYWxzZTtcclxuICAgICAgYXdhaXQgdGhpcy5fY29ubmVjdG9yQWRhcHRlclNlcnZpY2UuaW5pdENvbm5lY3RvcihcclxuICAgICAgICBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncyA/IG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzLnNldHRpbmdzIDogdGhpcy5zZXR0aW5nc1NlcnZpY2Uuc2V0dGluZ3MsXHJcbiAgICAgICAgb2JqZWN0Lm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MgPyBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncy5uYW1lIDogdW5kZWZpbmVkLFxyXG4gICAgICAgIGZhbHNlLFxyXG4gICAgICAgIG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzICYmIG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzLmV4dGVybmFsU291cmNlID8gb2JqZWN0Lm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MuZXh0ZXJuYWxTb3VyY2Uuc291cmNlSWQgOiBudWxsXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGF3YWl0IHRoaXMuX2Nvbm5lY3RvclNlcnZpY2UuYWRkVG9DYXJ0KFxyXG4gICAgICAgICtvYmplY3QubWV0YWRhdGEuZ29vZElkLCBvYmplY3QubWV0YWRhdGEuZ29vZFR5cGUsIDEsICtvYmplY3QubWV0YWRhdGEuaXRlbUlkLCAhIShvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncyAmJiBvYmplY3QubWV0YWRhdGEuZXh0ZXJuYWxTZXR0aW5ncy5leHRlcm5hbFNvdXJjZSkpO1xyXG4gICAgICBpZiAob2JqZWN0Lm1ldGFkYXRhLmV4dGVybmFsU2V0dGluZ3MpIHtcclxuICAgICAgICBjb25zdCBleHRlcm5hbFNvdXJjZTogRXh0ZXJuYWxTb3VyY2VBcnRpY2xlQWRkSW50ZXJmYWNlID0ge1xyXG4gICAgICAgICAgYXJ0aWNsZToganNvbixcclxuICAgICAgICAgIHF1YW50aXR5OiAxLFxyXG4gICAgICAgICAgY2F0YWxvZ0RlZmluaXRpb246IG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzLmNhdGFsb2dEZWZpbml0aW9uLFxyXG4gICAgICAgICAgZXh0ZXJuYWxTb3VyY2U6IG9iamVjdC5tZXRhZGF0YS5leHRlcm5hbFNldHRpbmdzLmV4dGVybmFsU291cmNlXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLl9hcHBFdmVudFNlcnZpY2UuYWRkRXh0ZXJuYWxTb3VyY2VUb0NhcnQubmV4dChleHRlcm5hbFNvdXJjZSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fYXBwRXZlbnRTZXJ2aWNlLmFkZFRvQ2FydC5uZXh0KHthcnRpY2xlOiBqc29uLCBxdWFudGl0eTogMX0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBsb2FkSXRlbXMoZGF0YSk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgaWYgKGRhdGEgJiYgZGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZvciAoY29uc3QgaXRlbU1vZGVsIG9mIGRhdGEpIHtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKGl0ZW1Nb2RlbC54cG9zLCBpdGVtTW9kZWwueXBvcywgaXRlbU1vZGVsLnpwb3MpO1xyXG4gICAgICAgIGNvbnN0IG92ZXJyaWRlcyA9IHtcclxuICAgICAgICAgIHdpZHRoOiBpdGVtTW9kZWwud2lkdGgsXHJcbiAgICAgICAgICBoZWlnaHQ6IGl0ZW1Nb2RlbC5oZWlnaHQsXHJcbiAgICAgICAgICB0ZXh0dXJlOiBpdGVtTW9kZWwudGV4dHVyZSxcclxuICAgICAgICAgIHJvdGF0aW9uOiBuZXcgRXVsZXIoMCwgaXRlbU1vZGVsLnJvdGF0aW9uLCAwKSxcclxuICAgICAgICAgIG9wZW5pbmc6IGl0ZW1Nb2RlbC5vcGVuaW5nLFxyXG4gICAgICAgICAgZnJhbWVDb2xvcjogaXRlbU1vZGVsLmZyYW1lQ29sb3IsXHJcbiAgICAgICAgICBkb29yQ29sb3I6IGl0ZW1Nb2RlbC5kb29yQ29sb3IsXHJcbiAgICAgICAgICB3aW5kb3dDb2xvcjogaXRlbU1vZGVsLndpbmRvd0NvbG9yLFxyXG4gICAgICAgICAgbG9ja2VkOiBpdGVtTW9kZWwubG9ja2VkLFxyXG4gICAgICAgICAgaXNHbGFzczogaXRlbU1vZGVsLmlzR2xhc3NcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IG1vZGVsRGF0YSA9IGF3YWl0IHRoaXMubW9kZWxzU2VydmljZS5nZXQoaXRlbU1vZGVsLml0ZW1fbmFtZSwgb3ZlcnJpZGVzKTtcclxuICAgICAgICBpZiAobW9kZWxEYXRhKSB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5faXRlbVNlcnZpY2UuYWRkSnNvbkl0ZW0obW9kZWxEYXRhLCBwb3NpdGlvbik7XHJcbiAgICAgICAgICBpZiAoaXRlbU1vZGVsLml0ZW1Hcm91cCkge1xyXG4gICAgICAgICAgICB0aGlzLl9yZWF0dGFjaFRvSXRlbUdyb3VwKGl0ZW1Nb2RlbC5pdGVtR3JvdXAsIGl0ZW0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBXYWxsSXRlbSkge1xyXG4gICAgICAgICAgICBjb25zdCBjbG9zZXN0V2FsbEVkZ2UgPSB0aGlzLl9yb29tU2VydmljZS5nZXRDbG9zZXN0V2FsbEVkZ2UocG9zaXRpb24ueCwgcG9zaXRpb24ueik7XHJcbiAgICAgICAgICAgIGl0ZW0ucGxhY2VPbkVkZ2UoY2xvc2VzdFdhbGxFZGdlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKGBVbmFibGUgdG8gZ2V0IG1vZGVsIGZvciAke2l0ZW1Nb2RlbC5pdGVtX25hbWV9IGZyb20gTW9kZWxzU2VydmljZWApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZE9iamVjdHMoe2l0ZW1zLCBmbG9vcnBsYW59KTogUHJvbWlzZTxhbnk+IHtcclxuICAgIHJldHVybiBQcm9taXNlLmFsbChbXHJcbiAgICAgIHRoaXMubG9hZEl0ZW1zKGl0ZW1zKSxcclxuICAgICAgdGhpcy5sb2FkRmxvb3JQbGFuKGZsb29ycGxhbiksXHJcbiAgICBdKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjb3B5U2NlbmVJbnN0YW5jZShzYXZlQXM6IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZTogRnVuY3Rpb24pID0+IHJlc29sdmUoKSk7XHJcbiAgfVxyXG5cclxuICBnZXRPYmplY3RzKCkge1xyXG4gICAgY29uc3QgaXRlbXNUb1NhdmUgPSB0aGlzLl9pdGVtU2VydmljZS5nZXROb25GdXJuaXR1cmUoKS5tYXAoaSA9PiB0aGlzLl9pdGVtU2VyaWFsaXphdGlvblNlcnZpY2UuaXRlbVRvT2JqZWN0KGkpKTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIGZsb29ycGxhbjogdGhpcy5fZmxvb3JwbGFuU2VydmljZS5zYXZlRmxvb3JwbGFuKCksXHJcbiAgICAgIGl0ZW1zOiBpdGVtc1RvU2F2ZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIGhhc0N1c3RvbU9iamVjdHMoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jdXN0b21PYmplY3RzLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25PYmplY3RMaWJyYXJ5Q2xpY2sob2JqZWN0OiBNb2RlbEludGVyZmFjZSk6IHZvaWQge1xyXG4gICAgdGhpcy5yZWxlYXNlRHJhZ2dlZCgpO1xyXG4gICAgdGhpcy5zZXREcmFnZ2VkKG9iamVjdCk7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlN0YXJ0RHJhZywge3g6IDAsIHk6IDB9KTtcclxuICAgIGlmIChvYmplY3QubmFtZSA9PT0gJ1dhbGt0aHJvdWdoIENhbWVyYScpIHtcclxuICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlTGVmdFNpZGViYXIpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uR3JvdXBDbGljaygpIHtcclxuICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuR3JvdXBPYmplY3RzKTtcclxuICAgIHRoaXMudXNlcklzR3JvdXBpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FuY2VsR3JvdXBTZWxlY3Rpb24oKTogdm9pZCB7XHJcbiAgICB0aGlzLnVzZXJJc0dyb3VwaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLkNhbmNlbEdyb3VwT2JqZWN0KTtcclxuICB9XHJcblxyXG4gIG9uVW5Hcm91cENsaWNrKCkge1xyXG4gICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5Vbmdyb3VwT2JqZWN0cyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VDb250ZXh0TWVudSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2hvd0NvbnRleHRNZW51ID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRHcm91cFNlbGVjdGlvbigpOiB2b2lkIHtcclxuICAgIHRoaXMuY2xvc2VDb250ZXh0TWVudSgpO1xyXG4gICAgdGhpcy51c2VySXNHcm91cGluZyA9IHRydWU7XHJcbiAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlN0YXJ0R3JvdXBPYmplY3QpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNlbmRDb252ZXJzaW9uVG9UYWdNYW5hZ2VyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgYXJ0aWNsZTogSXRlbSB8IEl0ZW1Hcm91cCA9IHRoaXMuc2VsZWN0ZWRPYmplY3Q7XHJcbiAgICBsZXQgY29udmVyc2lvbkFjdGlvbjogc3RyaW5nO1xyXG4gICAgaWYgKGFydGljbGUgaW5zdGFuY2VvZiBJdGVtKSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkT2JqZWN0Lm1ldGFkYXRhLmNvbnZlcnNpb25HVE1TZW5kKSB7XHJcbiAgICAgICAgY29udmVyc2lvbkFjdGlvbiA9ICdyZW1vdmUnO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRPYmplY3QubWV0YWRhdGEuY29udmVyc2lvbkdUTVNlbmQgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmFkZFNlbGVjdGVkQ2xhc3MgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb252ZXJzaW9uQWN0aW9uID0gJ2FkZCc7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9iamVjdC5tZXRhZGF0YS5jb252ZXJzaW9uR1RNU2VuZCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5hZGRTZWxlY3RlZENsYXNzID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLl9nb29nbGVUYWdNYW5hZ2VyLnNlbmRQcm9kdWN0Q29udmVyc2lvbihhcnRpY2xlLm1ldGFkYXRhLCBjb252ZXJzaW9uQWN0aW9uKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2hhc1NldHRpbmdzKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgaXNDdXN0b21TaGFwZTogYm9vbGVhbiA9IGl0ZW0ubWV0YWRhdGEgJiYgKFxyXG4gICAgICBpc0N1c3RvbVNoYXBlVHlwZShpdGVtLm1ldGFkYXRhLml0ZW1UeXBlKSB8fFxyXG4gICAgICBpc0N1c3RvbVNoYXBlV2FsbFR5cGUoaXRlbS5tZXRhZGF0YS5pdGVtVHlwZSkgfHxcclxuICAgICAgaXNDdXN0b21DeWxpbmRlclR5cGUoaXRlbS5tZXRhZGF0YS5pdGVtVHlwZSkgfHxcclxuICAgICAgaXNDdXN0b21DeWxpbmRlcldhbGxUeXBlKGl0ZW0ubWV0YWRhdGEuaXRlbVR5cGUpXHJcbiAgICApO1xyXG4gICAgY29uc3QgaGFzQ29uZmlndXJhYmxlVGV4dHVyZTogYm9vbGVhbiA9ICEhaXRlbSAmJiAhIShpdGVtLm1ldGFkYXRhICYmIGl0ZW0ubWV0YWRhdGEudGV4dHVyZSk7XHJcbiAgICBjb25zdCBoYXNPcGVuaW5nQXR0cmlidXRlOiBib29sZWFuID0gISFpdGVtICYmICEhaXRlbS5vcGVuaW5nO1xyXG4gICAgY29uc3QgaXNTY2FsYWJsZTogYm9vbGVhbiA9ICEhaXRlbSAmJiAhIShpdGVtLm1ldGFkYXRhICYmIGl0ZW0ubWV0YWRhdGEuc2NhbGFibGUpO1xyXG5cclxuICAgIHJldHVybiBpc0N1c3RvbVNoYXBlIHx8IGhhc0NvbmZpZ3VyYWJsZVRleHR1cmUgfHwgaGFzT3BlbmluZ0F0dHJpYnV0ZSB8fCBpc1NjYWxhYmxlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaXNDb25maWd1cmFibGUoaXRlbTogSXRlbSB8IEl0ZW1Hcm91cCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEoaXRlbSBpbnN0YW5jZW9mIEl0ZW1Hcm91cCkgJiYgISFpdGVtICYmICEhaXRlbS5tZXRhZGF0YSAmJiAhIWl0ZW0ubWV0YWRhdGEuaXRlbUlkZW50aWZpZXIgJiYgaXRlbS5jb25maWd1cmFibGUgJiZcclxuICAgICAgIWl0ZW0uYWxsd2F5c0NvbmZpZ3VyZU1vZGUgJiYgIWl0ZW0ub2Jzb2xldGU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0NvbnZlcnNpb25JdGVtKGl0ZW06IEl0ZW0gfCBJdGVtR3JvdXApOiBib29sZWFuIHtcclxuICAgIGlmIChpdGVtLm1ldGFkYXRhLmlvbmUpIHtcclxuICAgICAgcmV0dXJuIGl0ZW0ubWV0YWRhdGEuaW9uZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzRGVsZXRhYmxlKGl0ZW06IEl0ZW0gfCBJdGVtR3JvdXApOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhKGl0ZW0gaW5zdGFuY2VvZiBSb29tIHx8IGl0ZW0gaW5zdGFuY2VvZiBXYWxsKSAmJlxyXG4gICAgICAoKGl0ZW0gaW5zdGFuY2VvZiBJdGVtICYmIGl0ZW0uY2FuRGVsZXRlKSB8fCAhKGl0ZW0gaW5zdGFuY2VvZiBJdGVtKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc0NvcHlhYmxlKGl0ZW06IEl0ZW0gfCBJdGVtR3JvdXApOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlzTm90Um9vbU9yV2FsbE9yRGVjb3JhdGlvbjogYm9vbGVhbiA9ICEoaXRlbSBpbnN0YW5jZW9mIFJvb20gfHwgaXRlbSBpbnN0YW5jZW9mIFdhbGwgfHwgaXRlbSBpbnN0YW5jZW9mIEZsb29yUGxhbmVJdGVtKTtcclxuICAgIGNvbnN0IGlzQ29weWFibGVJdGVtOiBib29sZWFuID0gKChpdGVtIGluc3RhbmNlb2YgSXRlbSAmJiBpdGVtLmNhbkNvcHkgJiYgIWl0ZW0ub2Jzb2xldGUpIHx8ICEoaXRlbSBpbnN0YW5jZW9mIEl0ZW0pKSAmJlxyXG4gICAgICAhdGhpcy5faXRlbVNlcnZpY2UuZ2V0V2Fsa3Rocm91Z2hDYW1lcmEoKTtcclxuICAgIHJldHVybiBpc05vdFJvb21PcldhbGxPckRlY29yYXRpb24gJiYgaXNDb3B5YWJsZUl0ZW07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9yZWF0dGFjaFRvSXRlbUdyb3VwKGl0ZW1Hcm91cCwgb2JqZWN0KSB7XHJcbiAgICB0aGlzLl9pdGVtU2VydmljZS5yZW1vdmVJdGVtKG9iamVjdCk7XHJcbiAgICBpdGVtR3JvdXAuYWRkSXRlbShvYmplY3QpO1xyXG4gICAgaXRlbUdyb3VwLmNyZWF0ZUJvdW5kYXJ5Qm94KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmICghZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5zaGlmdEtleSkge1xyXG4gICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHtcclxuICAgICAgICBjYXNlIEtleS5DOlxyXG4gICAgICAgICAgaWYgKHRoaXMuX21vZGUgIT09IFZpZXdNb2RlLkZsb29yUGxhbjJEICYmICF0aGlzLl90ZXh0SW5wdXRBY3RpdmUoKSkge1xyXG4gICAgICAgICAgICB0aGlzLl9tZXNzYWdlU2VydmljZS5lbWl0KE1lc3NhZ2VUeXBlLlNob3dQcm9kdWN0Q2F0YWxvZyk7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZUxlZnRTaWRlYmFyKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgS2V5LkE6XHJcbiAgICAgICAgICAvLyBpZiAodGhpcy5fYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGUgIT09IG51bGwgJiYgdGhpcy5fYWN0aXZlQ2F0ZWdvcnlTaWRlYmFyVGVtcGxhdGUgPT09IHRoaXMuY2F0ZWdvcmllc1NpZGViYXIpIHtcclxuICAgICAgICAgIC8vICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlTGVmdFNpZGViYXIpO1xyXG4gICAgICAgICAgLy8gICB0aGlzLl9hY3RpdmVDYXRlZ29yeVNpZGViYXJUZW1wbGF0ZSA9IG51bGw7XHJcbiAgICAgICAgICAvLyB9IGVsc2VcclxuICAgICAgICAgIGlmICh0aGlzLl9tb2RlICE9PSBWaWV3TW9kZS5GbG9vclBsYW4yRCAmJiAhdGhpcy5fY2F0YWxvZ0lzU2hvd24gJiYgIXRoaXMuX3RleHRJbnB1dEFjdGl2ZSgpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2hvd0xpYnJhcnlDYXRlZ29yaWVzKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIEtleS5WOlxyXG4gICAgICAgICAgaWYgKCF0aGlzLl9jYXRhbG9nSXNTaG93biAmJiAhdGhpcy5fdGV4dElucHV0QWN0aXZlKCkpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX21vZGUgPT09IFZpZXdNb2RlLlJvb21QbGFuM0QpIHtcclxuICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU1vZGUoVmlld01vZGUuRmxvb3JQbGFuMkQsIHRydWUpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMudXBkYXRlTW9kZShWaWV3TW9kZS5Sb29tUGxhbjNELCB0cnVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSBLZXkuRXNjOlxyXG4gICAgICAgICAgaWYgKHRoaXMuX21vZGUgIT09IFZpZXdNb2RlLkZsb29yUGxhbjJEKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21lc3NhZ2VTZXJ2aWNlLmVtaXQoTWVzc2FnZVR5cGUuSGlkZUxlZnRTaWRlYmFyKTtcclxuICAgICAgICAgICAgdGhpcy5fbWVzc2FnZVNlcnZpY2UuZW1pdChNZXNzYWdlVHlwZS5IaWRlUHJvZHVjdENhdGFsb2cpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3RleHRJbnB1dEFjdGl2ZSgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGlucHV0cyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbnB1dCcpO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGlmIChpbnB1dHNbMF0udHlwZSA9PT0gJ3RleHQnICYmIGlucHV0c1tpXSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXX0=