@smartbit4all/ng-client 4.2.34 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs +12 -12
- package/fesm2022/smartbit4all-ng-client-src-lib-smart-chart.mjs.map +1 -1
- package/fesm2022/smartbit4all-ng-client.mjs +521 -501
- package/fesm2022/smartbit4all-ng-client.mjs.map +1 -1
- package/lib/smart-client/smart-component-api-client.d.ts +2 -2
- package/lib/smart-component-layout/smart-component-layout.component.d.ts +1 -1
- package/lib/smart-dialog/smartdialog.module.d.ts +2 -1
- package/lib/smart-grid/smart-grid.component.d.ts +1 -1
- package/lib/smart-grid/smart-grid.module.d.ts +21 -19
- package/lib/smart-map/abstract-map.d.ts +1 -1
- package/lib/smart-ng-client.module.d.ts +4 -3
- package/lib/view-context/smart-view-context.module.d.ts +42 -43
- package/package.json +12 -14
- package/smartbit4all-ng-client-5.0.1.tgz +0 -0
- package/esm2022/lib/component-factory-service/component-factory-service.module.mjs +0 -17
- package/esm2022/lib/component-factory-service/component-factory-service.service.mjs +0 -35
- package/esm2022/lib/component-factory-service/projects.mjs +0 -6
- package/esm2022/lib/session/api/api/api.mjs +0 -4
- package/esm2022/lib/session/api/api/session.service.mjs +0 -306
- package/esm2022/lib/session/api/configuration.mjs +0 -91
- package/esm2022/lib/session/api/encoder.mjs +0 -19
- package/esm2022/lib/session/api/index.mjs +0 -3
- package/esm2022/lib/session/api/model/accountInfo.mjs +0 -13
- package/esm2022/lib/session/api/model/apiError.mjs +0 -13
- package/esm2022/lib/session/api/model/authenticationProviderData.mjs +0 -13
- package/esm2022/lib/session/api/model/getAuthenticationProvidersResponse.mjs +0 -2
- package/esm2022/lib/session/api/model/models.mjs +0 -9
- package/esm2022/lib/session/api/model/refreshSessionRequest.mjs +0 -13
- package/esm2022/lib/session/api/model/session.mjs +0 -2
- package/esm2022/lib/session/api/model/sessionInfoData.mjs +0 -2
- package/esm2022/lib/session/api/model/userActivityLog.mjs +0 -13
- package/esm2022/lib/session/api/param.mjs +0 -2
- package/esm2022/lib/session/api/variables.mjs +0 -9
- package/esm2022/lib/session/cookie-service/smart-cookie.service.mjs +0 -225
- package/esm2022/lib/session/projects.mjs +0 -10
- package/esm2022/lib/session/smart-error-catching.interceptor.mjs +0 -95
- package/esm2022/lib/session/smart-header-maintainer.interceptor.mjs +0 -46
- package/esm2022/lib/session/smart-session-handler.service.mjs +0 -6
- package/esm2022/lib/session/smart-session.module.mjs +0 -58
- package/esm2022/lib/session/smart-session.service.mjs +0 -230
- package/esm2022/lib/session/smart-timer/smart-session-timer.component.mjs +0 -35
- package/esm2022/lib/session/smart-timer/smart-session-timer.service.mjs +0 -58
- package/esm2022/lib/shared/projects.mjs +0 -4
- package/esm2022/lib/shared/shared.module.mjs +0 -19
- package/esm2022/lib/shared/smart-tooltip.directive.mjs +0 -58
- package/esm2022/lib/shared/smarttable.date-pipe.mjs +0 -43
- package/esm2022/lib/smart-client/projects.mjs +0 -5
- package/esm2022/lib/smart-client/smart-authentication.service.mjs +0 -21
- package/esm2022/lib/smart-client/smart-component-api-client.mjs +0 -786
- package/esm2022/lib/smart-client/smart-file-uploader/smart-file-uploader.component.mjs +0 -81
- package/esm2022/lib/smart-client/smart.component.mjs +0 -84
- package/esm2022/lib/smart-client/smart.service.mjs +0 -75
- package/esm2022/lib/smart-component-layout/api/api/api.mjs +0 -4
- package/esm2022/lib/smart-component-layout/api/api/default.service.mjs +0 -133
- package/esm2022/lib/smart-component-layout/api/api.module.mjs +0 -40
- package/esm2022/lib/smart-component-layout/api/configuration.mjs +0 -91
- package/esm2022/lib/smart-component-layout/api/encoder.mjs +0 -19
- package/esm2022/lib/smart-component-layout/api/index.mjs +0 -7
- package/esm2022/lib/smart-component-layout/api/model/componentType.mjs +0 -18
- package/esm2022/lib/smart-component-layout/api/model/componentWidgetType.mjs +0 -20
- package/esm2022/lib/smart-component-layout/api/model/layoutDirection.mjs +0 -17
- package/esm2022/lib/smart-component-layout/api/model/models.mjs +0 -6
- package/esm2022/lib/smart-component-layout/api/model/smartComponentLayoutDefinition.mjs +0 -2
- package/esm2022/lib/smart-component-layout/api/model/smartComponentWidgetDefinition.mjs +0 -2
- package/esm2022/lib/smart-component-layout/api/param.mjs +0 -2
- package/esm2022/lib/smart-component-layout/api/variables.mjs +0 -9
- package/esm2022/lib/smart-component-layout/projects.mjs +0 -8
- package/esm2022/lib/smart-component-layout/smart-component-layout-utility.mjs +0 -111
- package/esm2022/lib/smart-component-layout/smart-component-layout.component.mjs +0 -307
- package/esm2022/lib/smart-component-layout/smart-component-layout.module.mjs +0 -45
- package/esm2022/lib/smart-dialog/projects.mjs +0 -8
- package/esm2022/lib/smart-dialog/smartdialog.component.mjs +0 -54
- package/esm2022/lib/smart-dialog/smartdialog.model.mjs +0 -16
- package/esm2022/lib/smart-dialog/smartdialog.module.mjs +0 -46
- package/esm2022/lib/smart-dialog/smartdialog.service.mjs +0 -90
- package/esm2022/lib/smart-expandable-section/expandable-section.component.mjs +0 -96
- package/esm2022/lib/smart-expandable-section/expandable-section.model.mjs +0 -12
- package/esm2022/lib/smart-expandable-section/projects.mjs +0 -8
- package/esm2022/lib/smart-expandable-section/smart-expandable-section.module.mjs +0 -53
- package/esm2022/lib/smart-expandable-section/smart-expandable-section.service.mjs +0 -14
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBoolOperator.mjs +0 -17
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderField.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderGroup.mjs +0 -8
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionBuilderModel.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionData.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionDataType.mjs +0 -20
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionField.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldList.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionFieldWidgetType.mjs +0 -28
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionList.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperandData.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOperation.mjs +0 -32
- package/esm2022/lib/smart-filter/api/filter/model/filterExpressionOrderBy.mjs +0 -18
- package/esm2022/lib/smart-filter/api/filter/model/model.mjs +0 -16
- package/esm2022/lib/smart-filter/api/filter/model/searchIndexObjectDefinitionData.mjs +0 -2
- package/esm2022/lib/smart-filter/api/filter/model/searchIndexPropertyDefinitionData.mjs +0 -13
- package/esm2022/lib/smart-filter/api/value/model/value.mjs +0 -13
- package/esm2022/lib/smart-filter/projects.mjs +0 -9
- package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-expression-field/smart-filter-expression-field.component.mjs +0 -14
- package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/components/smart-filter-simple-field/smart-filter-simple-field.component.mjs +0 -165
- package/esm2022/lib/smart-filter/smart-filter/components/smart-filter-simple/smart-filter-simple.component.mjs +0 -45
- package/esm2022/lib/smart-filter/smart-filter/smart-filter.component.mjs +0 -36
- package/esm2022/lib/smart-filter/smart-filter/smart-filter.service.mjs +0 -31
- package/esm2022/lib/smart-filter/smart-filter.model.mjs +0 -13
- package/esm2022/lib/smart-filter/smart-filter.module.mjs +0 -33
- package/esm2022/lib/smart-filter-editor/api/api/filter.service.mjs +0 -198
- package/esm2022/lib/smart-filter-editor/api/configuration.mjs +0 -91
- package/esm2022/lib/smart-filter-editor/api/encoder.mjs +0 -19
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBoolOperator.mjs +0 -17
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderApiConfig.mjs +0 -13
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderField.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderGroup.mjs +0 -8
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderModel.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionBuilderUiModel.mjs +0 -7
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionData.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionDataType.mjs +0 -20
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionField.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldEditor.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldList.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionFieldWidgetType.mjs +0 -28
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionList.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperandData.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOperation.mjs +0 -32
- package/esm2022/lib/smart-filter-editor/api/model/filterExpressionOrderBy.mjs +0 -19
- package/esm2022/lib/smart-filter-editor/api/model/smartFilterType.mjs +0 -17
- package/esm2022/lib/smart-filter-editor/api/param.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/api/variables.mjs +0 -9
- package/esm2022/lib/smart-filter-editor/filterExpressionBuilderApiActions.mjs +0 -15
- package/esm2022/lib/smart-filter-editor/project.mjs +0 -8
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-item/smart-filter-expression-item.component.mjs +0 -73
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/components/smart-filter-expression-items/smart-filter-expression-items.component.mjs +0 -40
- package/esm2022/lib/smart-filter-editor/smart-filter-editor-content/smart-filter-editor-content.component.mjs +0 -273
- package/esm2022/lib/smart-filter-editor/smart-filter-editor.model.mjs +0 -2
- package/esm2022/lib/smart-filter-editor/smart-filter-editor.module.mjs +0 -69
- package/esm2022/lib/smart-filter-editor/smart-filter-editor.service.mjs +0 -47
- package/esm2022/lib/smart-filter-editor/smart-filter-params/components/smart-filter-param/smart-filter-param.component.mjs +0 -24
- package/esm2022/lib/smart-filter-editor/smart-filter-params/smart-filter-params.component.mjs +0 -57
- package/esm2022/lib/smart-form/api/api/api.mjs +0 -4
- package/esm2022/lib/smart-form/api/api/default.service.mjs +0 -133
- package/esm2022/lib/smart-form/api/api.module.mjs +0 -40
- package/esm2022/lib/smart-form/api/configuration.mjs +0 -91
- package/esm2022/lib/smart-form/api/encoder.mjs +0 -19
- package/esm2022/lib/smart-form/api/index.mjs +0 -7
- package/esm2022/lib/smart-form/api/model/models.mjs +0 -12
- package/esm2022/lib/smart-form/api/model/propertyMapping.mjs +0 -13
- package/esm2022/lib/smart-form/api/model/selectionDefinition.mjs +0 -7
- package/esm2022/lib/smart-form/api/model/smartFormInputMode.mjs +0 -22
- package/esm2022/lib/smart-form/api/model/smartFormWidgetDirection.mjs +0 -17
- package/esm2022/lib/smart-form/api/model/smartFormWidgetType.mjs +0 -46
- package/esm2022/lib/smart-form/api/model/smartLayoutDefinition.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/smartMatrixModel.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/smartWidgetDefinition.mjs +0 -2
- package/esm2022/lib/smart-form/api/model/smartWidgetHint.mjs +0 -18
- package/esm2022/lib/smart-form/api/model/sortDefinition.mjs +0 -13
- package/esm2022/lib/smart-form/api/model/valueChangeMode.mjs +0 -20
- package/esm2022/lib/smart-form/api/param.mjs +0 -2
- package/esm2022/lib/smart-form/api/variables.mjs +0 -9
- package/esm2022/lib/smart-form/highlightMacthingString-pipe.mjs +0 -20
- package/esm2022/lib/smart-form/projects.mjs +0 -15
- package/esm2022/lib/smart-form/services/smartform.layout-definition.service.mjs +0 -613
- package/esm2022/lib/smart-form/services/smartform.service.mjs +0 -673
- package/esm2022/lib/smart-form/smartfileuploader/large-file-snack-bar/large-file-snack-bar.component.mjs +0 -15
- package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.component.mjs +0 -78
- package/esm2022/lib/smart-form/smartfileuploader/smartfileuploader.model.mjs +0 -2
- package/esm2022/lib/smart-form/smartform.component.mjs +0 -185
- package/esm2022/lib/smart-form/smartform.form-model.mjs +0 -2
- package/esm2022/lib/smart-form/smartform.model.mjs +0 -38
- package/esm2022/lib/smart-form/widgets/components/smart-month-picker/smart-month-picker.component.mjs +0 -84
- package/esm2022/lib/smart-form/widgets/directives/comparable-dropdown.directive.mjs +0 -36
- package/esm2022/lib/smart-form/widgets/directives/comparable-multiselect.directive.mjs +0 -79
- package/esm2022/lib/smart-form/widgets/smartformwidget/smartformwidget.component.mjs +0 -874
- package/esm2022/lib/smart-form/widgets/smartformwidget/sortable-widget/sortable-widget.component.mjs +0 -78
- package/esm2022/lib/smart-form/widgets/smartformwidget/trackCaps.directive.mjs +0 -31
- package/esm2022/lib/smart-grid/api/grid-api/api/api.mjs +0 -4
- package/esm2022/lib/smart-grid/api/grid-api/api/grid.service.mjs +0 -451
- package/esm2022/lib/smart-grid/api/grid-api/api.module.mjs +0 -40
- package/esm2022/lib/smart-grid/api/grid-api/configuration.mjs +0 -91
- package/esm2022/lib/smart-grid/api/grid-api/encoder.mjs +0 -19
- package/esm2022/lib/smart-grid/api/grid-api/index.mjs +0 -7
- package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnContentType.mjs +0 -17
- package/esm2022/lib/smart-grid/api/grid-api/model/gridColumnMeta.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridDataAccessConfig.mjs +0 -20
- package/esm2022/lib/smart-grid/api/grid-api/model/gridModel.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridPage.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridRow.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionChange.mjs +0 -13
- package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionMode.mjs +0 -18
- package/esm2022/lib/smart-grid/api/grid-api/model/gridSelectionType.mjs +0 -17
- package/esm2022/lib/smart-grid/api/grid-api/model/gridServerModel.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridUpdateData.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridView.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/model/gridViewDescriptor.mjs +0 -8
- package/esm2022/lib/smart-grid/api/grid-api/model/models.mjs +0 -14
- package/esm2022/lib/smart-grid/api/grid-api/param.mjs +0 -2
- package/esm2022/lib/smart-grid/api/grid-api/variables.mjs +0 -9
- package/esm2022/lib/smart-grid/components/expandable-grid/expandable-grid.component.mjs +0 -20
- package/esm2022/lib/smart-grid/components/smart-grid-card/smart-grid-card.component.mjs +0 -66
- package/esm2022/lib/smart-grid/components/table-layout-definer/table-layout-definer.component.mjs +0 -182
- package/esm2022/lib/smart-grid/models/model.mjs +0 -29
- package/esm2022/lib/smart-grid/projects.mjs +0 -9
- package/esm2022/lib/smart-grid/smart-grid.component.mjs +0 -934
- package/esm2022/lib/smart-grid/smart-grid.module.mjs +0 -100
- package/esm2022/lib/smart-grid/smart-grid.service.mjs +0 -80
- package/esm2022/lib/smart-icon/projects.mjs +0 -7
- package/esm2022/lib/smart-icon/smart-icon/smart-icon.component.mjs +0 -53
- package/esm2022/lib/smart-icon/smart-icon.module.mjs +0 -22
- package/esm2022/lib/smart-icon/smart-icon.service.mjs +0 -74
- package/esm2022/lib/smart-map/abstract-map.mjs +0 -112
- package/esm2022/lib/smart-map/api/api/api.mjs +0 -4
- package/esm2022/lib/smart-map/api/api/geoMap.service.mjs +0 -312
- package/esm2022/lib/smart-map/api/api.module.mjs +0 -40
- package/esm2022/lib/smart-map/api/configuration.mjs +0 -91
- package/esm2022/lib/smart-map/api/encoder.mjs +0 -19
- package/esm2022/lib/smart-map/api/index.mjs +0 -7
- package/esm2022/lib/smart-map/api/model/gPSPosition.mjs +0 -13
- package/esm2022/lib/smart-map/api/model/gPSRoute.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapChange.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapDataLoadingMode.mjs +0 -17
- package/esm2022/lib/smart-map/api/model/geoMapDataSourceDescriptor.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapDataSourceType.mjs +0 -19
- package/esm2022/lib/smart-map/api/model/geoMapEditingSession.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapInteraction.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapItem.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapItemKind.mjs +0 -18
- package/esm2022/lib/smart-map/api/model/geoMapLayer.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapLayerChange.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapLayerDescriptor.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapModel.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapOperationMode.mjs +0 -17
- package/esm2022/lib/smart-map/api/model/geoMapSelectionMode.mjs +0 -18
- package/esm2022/lib/smart-map/api/model/geoMapServerModel.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapTextType.mjs +0 -17
- package/esm2022/lib/smart-map/api/model/geoMapViewState.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/geoMapViewport.mjs +0 -2
- package/esm2022/lib/smart-map/api/model/models.mjs +0 -21
- package/esm2022/lib/smart-map/api/param.mjs +0 -2
- package/esm2022/lib/smart-map/api/variables.mjs +0 -9
- package/esm2022/lib/smart-map/api-default/api-default.mjs +0 -2
- package/esm2022/lib/smart-map/impl/google-map.mjs +0 -221
- package/esm2022/lib/smart-map/impl/leaflet-map.mjs +0 -264
- package/esm2022/lib/smart-map/projects.mjs +0 -9
- package/esm2022/lib/smart-map/smart-map.component.mjs +0 -218
- package/esm2022/lib/smart-map/smart-map.module.mjs +0 -22
- package/esm2022/lib/smart-map/smart-map.types.mjs +0 -2
- package/esm2022/lib/smart-navbar/projects.mjs +0 -8
- package/esm2022/lib/smart-navbar/smart-navbar.component.mjs +0 -61
- package/esm2022/lib/smart-navbar/smart-navbar.model.mjs +0 -6
- package/esm2022/lib/smart-navbar/smart-navbar.module.mjs +0 -63
- package/esm2022/lib/smart-navbar/smart-navbar.service.mjs +0 -14
- package/esm2022/lib/smart-navigation/projects.mjs +0 -6
- package/esm2022/lib/smart-navigation/smart-navigation.interface.mjs +0 -2
- package/esm2022/lib/smart-navigation/smart-navigation.module.mjs +0 -18
- package/esm2022/lib/smart-navigation/smart-navigation.service.mjs +0 -56
- package/esm2022/lib/smart-ng-client.module.mjs +0 -130
- package/esm2022/lib/smart-ng-client.service.mjs +0 -19
- package/esm2022/lib/smart-subject/projects.mjs +0 -5
- package/esm2022/lib/smart-subject/smart-subject.mjs +0 -21
- package/esm2022/lib/smart-tab-group/projects.mjs +0 -9
- package/esm2022/lib/smart-tab-group/smart-tab-group.component.mjs +0 -43
- package/esm2022/lib/smart-tab-group/smart-tab-group.module.mjs +0 -25
- package/esm2022/lib/smart-tab-group/smart-tab-group.service.mjs +0 -14
- package/esm2022/lib/smart-tab-group/tab-content/tab-content.component.mjs +0 -31
- package/esm2022/lib/smart-tab-group/tab-group-simplified/tab-group.component.mjs +0 -66
- package/esm2022/lib/smart-tab-group/tabTile.model.mjs +0 -2
- package/esm2022/lib/smart-table/components/default-actions-popup/default-actions-popup.component.mjs +0 -43
- package/esm2022/lib/smart-table/components/loading/loading.component.mjs +0 -15
- package/esm2022/lib/smart-table/directives/mat-context-menu-trigger-for.directive.mjs +0 -52
- package/esm2022/lib/smart-table/projects.mjs +0 -8
- package/esm2022/lib/smart-table/smarttable.component.mjs +0 -98
- package/esm2022/lib/smart-table/smarttable.model.mjs +0 -169
- package/esm2022/lib/smart-table/smarttable.module.mjs +0 -105
- package/esm2022/lib/smart-table/smarttable.service.mjs +0 -14
- package/esm2022/lib/smart-table/tables/material-table/material-table.component.mjs +0 -39
- package/esm2022/lib/smart-table/tables/mobile-table/mobile-table.component.mjs +0 -23
- package/esm2022/lib/smart-table/tables/table.mjs +0 -520
- package/esm2022/lib/smart-tree/projects.mjs +0 -9
- package/esm2022/lib/smart-tree/smarttree-generic.service.mjs +0 -288
- package/esm2022/lib/smart-tree/smarttree.component.mjs +0 -181
- package/esm2022/lib/smart-tree/smarttree.model.mjs +0 -7
- package/esm2022/lib/smart-tree/smarttree.module.mjs +0 -60
- package/esm2022/lib/smart-tree/smarttree.node.model.mjs +0 -6
- package/esm2022/lib/smart-tree/smarttree.service.interface.mjs +0 -2
- package/esm2022/lib/smart-tree/smarttree.service.mjs +0 -47
- package/esm2022/lib/smart-tree/tree-api/api/tree.service.mjs +0 -1190
- package/esm2022/lib/smart-tree/tree-api/configuration.mjs +0 -91
- package/esm2022/lib/smart-tree/tree-api/encoder.mjs +0 -19
- package/esm2022/lib/smart-tree/tree-api/param.mjs +0 -2
- package/esm2022/lib/smart-tree/tree-api/variables.mjs +0 -9
- package/esm2022/lib/smart-validation/named-validator.service.mjs +0 -115
- package/esm2022/lib/smart-validation/projects.mjs +0 -4
- package/esm2022/lib/smart-validation/smart-validation.module.mjs +0 -24
- package/esm2022/lib/smart-validation/smart-validation.types.mjs +0 -4
- package/esm2022/lib/view-context/api/api/api.mjs +0 -4
- package/esm2022/lib/view-context/api/api/view.service.mjs +0 -903
- package/esm2022/lib/view-context/api/api.module.mjs +0 -40
- package/esm2022/lib/view-context/api/configuration.mjs +0 -91
- package/esm2022/lib/view-context/api/encoder.mjs +0 -19
- package/esm2022/lib/view-context/api/index.mjs +0 -7
- package/esm2022/lib/view-context/api/model/clipboardData.mjs +0 -13
- package/esm2022/lib/view-context/api/model/closeResult.mjs +0 -18
- package/esm2022/lib/view-context/api/model/componentConstraint.mjs +0 -2
- package/esm2022/lib/view-context/api/model/componentModel.mjs +0 -2
- package/esm2022/lib/view-context/api/model/componentModelChange.mjs +0 -13
- package/esm2022/lib/view-context/api/model/dataChange.mjs +0 -2
- package/esm2022/lib/view-context/api/model/dataChangeEvent.mjs +0 -2
- package/esm2022/lib/view-context/api/model/dataChangeKind.mjs +0 -21
- package/esm2022/lib/view-context/api/model/deviceInfo.mjs +0 -13
- package/esm2022/lib/view-context/api/model/downloadedFile.mjs +0 -13
- package/esm2022/lib/view-context/api/model/iconPosition.mjs +0 -20
- package/esm2022/lib/view-context/api/model/imageResource.mjs +0 -8
- package/esm2022/lib/view-context/api/model/link.mjs +0 -20
- package/esm2022/lib/view-context/api/model/messageData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/messageOption.mjs +0 -2
- package/esm2022/lib/view-context/api/model/messageOptionType.mjs +0 -18
- package/esm2022/lib/view-context/api/model/messageResult.mjs +0 -2
- package/esm2022/lib/view-context/api/model/messageTextType.mjs +0 -17
- package/esm2022/lib/view-context/api/model/messageType.mjs +0 -19
- package/esm2022/lib/view-context/api/model/models.mjs +0 -54
- package/esm2022/lib/view-context/api/model/namedValidator.mjs +0 -19
- package/esm2022/lib/view-context/api/model/openPendingData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/serverRequestExecutionStat.mjs +0 -2
- package/esm2022/lib/view-context/api/model/serverRequestTrack.mjs +0 -2
- package/esm2022/lib/view-context/api/model/serverRequestType.mjs +0 -24
- package/esm2022/lib/view-context/api/model/smartLinkData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/statisticRecord.mjs +0 -13
- package/esm2022/lib/view-context/api/model/style.mjs +0 -13
- package/esm2022/lib/view-context/api/model/uiAction.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionButtonDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionButtonType.mjs +0 -27
- package/esm2022/lib/view-context/api/model/uiActionConstraint.mjs +0 -13
- package/esm2022/lib/view-context/api/model/uiActionDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionDialogDescriptor.mjs +0 -2
- package/esm2022/lib/view-context/api/model/uiActionFeedbackType.mjs +0 -20
- package/esm2022/lib/view-context/api/model/uiActionInputType.mjs +0 -21
- package/esm2022/lib/view-context/api/model/uiActionRequest.mjs +0 -13
- package/esm2022/lib/view-context/api/model/uiActionTooltip.mjs +0 -22
- package/esm2022/lib/view-context/api/model/uiActionUploadDescriptor.mjs +0 -13
- package/esm2022/lib/view-context/api/model/uploadedFile.mjs +0 -13
- package/esm2022/lib/view-context/api/model/valueSet.mjs +0 -2
- package/esm2022/lib/view-context/api/model/view.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewApiError.mjs +0 -13
- package/esm2022/lib/view-context/api/model/viewConstraint.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewContext.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewContextChange.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewContextData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewContextUpdate.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewData.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewEventHandler.mjs +0 -18
- package/esm2022/lib/view-context/api/model/viewPlaceholder.mjs +0 -13
- package/esm2022/lib/view-context/api/model/viewState.mjs +0 -22
- package/esm2022/lib/view-context/api/model/viewStateUpdate.mjs +0 -2
- package/esm2022/lib/view-context/api/model/viewType.mjs +0 -18
- package/esm2022/lib/view-context/api/param.mjs +0 -2
- package/esm2022/lib/view-context/api/variables.mjs +0 -9
- package/esm2022/lib/view-context/invalid-fields-snack-bar/invalid-fields-snack-bar.component.mjs +0 -20
- package/esm2022/lib/view-context/message-dialog/message-dialog.component.mjs +0 -74
- package/esm2022/lib/view-context/projects.mjs +0 -19
- package/esm2022/lib/view-context/property-definition-data.mjs +0 -2
- package/esm2022/lib/view-context/smart-ui-action/components/success-snack-bar/success-snack-bar.component.mjs +0 -30
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.component.mjs +0 -63
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-confirm-dialog/ui-action-confirm-dialog.service.mjs +0 -55
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-dialog-button/ui-action-dialog-button.component.mjs +0 -60
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.component.mjs +0 -97
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-file-upload-dialog/ui-action-file-upload-dialog.service.mjs +0 -60
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.component.mjs +0 -132
- package/esm2022/lib/view-context/smart-ui-action/dialogs/ui-action-input-dialog/ui-action-input-dialog.service.mjs +0 -59
- package/esm2022/lib/view-context/smart-ui-action/ui-action-toolbar.component.mjs +0 -192
- package/esm2022/lib/view-context/smart-ui-action/ui-action.descriptor.service.mjs +0 -183
- package/esm2022/lib/view-context/smart-ui-action/ui-action.model.mjs +0 -7
- package/esm2022/lib/view-context/smart-ui-action/ui-action.service.mjs +0 -211
- package/esm2022/lib/view-context/smart-view-context-dialog.service.mjs +0 -83
- package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.component.mjs +0 -29
- package/esm2022/lib/view-context/smart-view-context-error-dialog/smart-view-context-error-dialog.service.mjs +0 -75
- package/esm2022/lib/view-context/smart-view-context.interceptor.mjs +0 -39
- package/esm2022/lib/view-context/smart-view-context.model.mjs +0 -2
- package/esm2022/lib/view-context/smart-view-context.module.mjs +0 -327
- package/esm2022/lib/view-context/smart-view-context.service.mjs +0 -696
- package/esm2022/lib/view-context/smart-view-redirect/smart-view-redirect.mjs +0 -33
- package/esm2022/lib/view-context/utility/componentLibrary.mjs +0 -9
- package/esm2022/lib/view-context/utility/smart-object-utility.mjs +0 -44
- package/esm2022/lib/view-context/utility/smart-style-utility.mjs +0 -68
- package/esm2022/lib/view-context/value-api/api/api.mjs +0 -4
- package/esm2022/lib/view-context/value-api/api/value.service.mjs +0 -138
- package/esm2022/lib/view-context/value-api/api.module.mjs +0 -40
- package/esm2022/lib/view-context/value-api/configuration.mjs +0 -91
- package/esm2022/lib/view-context/value-api/encoder.mjs +0 -19
- package/esm2022/lib/view-context/value-api/index.mjs +0 -7
- package/esm2022/lib/view-context/value-api/model/genericValue.mjs +0 -13
- package/esm2022/lib/view-context/value-api/model/models.mjs +0 -11
- package/esm2022/lib/view-context/value-api/model/value.mjs +0 -13
- package/esm2022/lib/view-context/value-api/model/valueSetData.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetDefinition.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetDefinitionData.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetDefinitionIdentifier.mjs +0 -13
- package/esm2022/lib/view-context/value-api/model/valueSetDefinitionKind.mjs +0 -24
- package/esm2022/lib/view-context/value-api/model/valueSetExpression.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetOperand.mjs +0 -2
- package/esm2022/lib/view-context/value-api/model/valueSetOperation.mjs +0 -19
- package/esm2022/lib/view-context/value-api/param.mjs +0 -2
- package/esm2022/lib/view-context/value-api/variables.mjs +0 -9
- package/esm2022/projects.mjs +0 -28
- package/esm2022/smartbit4all-ng-client.mjs +0 -5
- package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartData.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartDescriptor.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartOrientation.mjs +0 -16
- package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartType.mjs +0 -21
- package/esm2022/src/lib/smart-chart/smart-chart/api/model/chartValue.mjs +0 -13
- package/esm2022/src/lib/smart-chart/smart-chart/api/model/models.mjs +0 -7
- package/esm2022/src/lib/smart-chart/smart-chart/api/model/pieChartLegendPosition.mjs +0 -16
- package/esm2022/src/lib/smart-chart/smart-chart/default-chart-options.provider.mjs +0 -233
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart.component.mjs +0 -285
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart.module.mjs +0 -39
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/api/api.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/api.module.mjs +0 -40
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/configuration.mjs +0 -91
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/index.mjs +0 -7
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramColor.mjs +0 -13
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataContainer.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataItem.mjs +0 -13
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSet.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDataSetConstructionInstruction.mjs +0 -13
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramDescriptor.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramShape.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/diagramUiModel.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/drawTime.mjs +0 -18
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/labelText.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/model/models.mjs +0 -11
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/param.mjs +0 -2
- package/esm2022/src/lib/smart-chart/smart-chart/smart-chart2/api/variables.mjs +0 -9
- package/esm2022/src/lib/smart-chart/smart-chart-projects.mjs +0 -9
- package/esm2022/src/lib/smart-chart/smartbit4all-ng-client-src-lib-smart-chart.mjs +0 -5
- package/esm2022/src/lib/smart-chart/view-context/utility/componentLibrary.mjs +0 -9
- package/smartbit4all-ng-client-4.2.34.tgz +0 -0
|
@@ -1,786 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectorRef } from '@angular/core';
|
|
2
|
-
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
-
import { SmartComponentLayoutUtility, } from '../smart-component-layout/projects';
|
|
4
|
-
import { SmartFilterEditorContentComponent } from '../smart-filter-editor/project';
|
|
5
|
-
import { ValueChangeMode, } from '../smart-form/projects';
|
|
6
|
-
import { SmartGridComponent } from '../smart-grid/projects';
|
|
7
|
-
import { SmartMapComponent } from '../smart-map/smart-map.component';
|
|
8
|
-
import { SmartSubject } from '../smart-subject/projects';
|
|
9
|
-
import { SmarttreeGenericService } from '../smart-tree/projects';
|
|
10
|
-
import { DataChangeKind, SmartViewContextService, UiActionDescriptorService, UiActionService, } from '../view-context/projects';
|
|
11
|
-
import { SmartStyleUtility } from '../view-context/utility/smart-style-utility';
|
|
12
|
-
export class SmartComponentApiClient {
|
|
13
|
-
get uuid() {
|
|
14
|
-
return this._uuid;
|
|
15
|
-
}
|
|
16
|
-
set uuid(uuid) {
|
|
17
|
-
if (this._uuid === uuid) {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
let firstUuid = true;
|
|
21
|
-
if (this.uuid) {
|
|
22
|
-
this.viewContext.unfollow(this.uuid);
|
|
23
|
-
firstUuid = false;
|
|
24
|
-
}
|
|
25
|
-
this._uuid = uuid;
|
|
26
|
-
this.getWidgets().forEach((ref, key) => {
|
|
27
|
-
if (ref instanceof SmartGridComponent) {
|
|
28
|
-
ref.uuid = this.componentModelLoaded ? uuid : undefined;
|
|
29
|
-
}
|
|
30
|
-
else if (ref instanceof SmartFilterEditorContentComponent) {
|
|
31
|
-
ref.service.config.uuid = this.componentModelLoaded ? uuid : undefined;
|
|
32
|
-
}
|
|
33
|
-
else if (!ref && !firstUuid) {
|
|
34
|
-
console.error(`Provided reference for ${key} is undefined on uuid change.`);
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
if (!this.uuidOfPageHasBeenChangedSubscription) {
|
|
38
|
-
this.uuidOfPageHasBeenChangedSubscription = this.viewContext.uuidOfPageHasBeenChanged
|
|
39
|
-
.pipe(takeUntil(this._destroy$))
|
|
40
|
-
.subscribe((pageName) => {
|
|
41
|
-
if (pageName === this.pageName) {
|
|
42
|
-
this.run();
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
if (uuid) {
|
|
47
|
-
this.viewContext.follow(this._uuid, this.detectChange);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
get model() {
|
|
51
|
-
return this._model;
|
|
52
|
-
}
|
|
53
|
-
set model(model) {
|
|
54
|
-
this._model = model;
|
|
55
|
-
this.initComponentByModel();
|
|
56
|
-
}
|
|
57
|
-
get data() {
|
|
58
|
-
return this._data;
|
|
59
|
-
}
|
|
60
|
-
set data(model) {
|
|
61
|
-
this._data = model;
|
|
62
|
-
this.dataChanged.next();
|
|
63
|
-
}
|
|
64
|
-
get smartTreeService() {
|
|
65
|
-
return this._smartTreeService;
|
|
66
|
-
}
|
|
67
|
-
set smartTreeService(smartTreeService) {
|
|
68
|
-
if (this._smartTreeService !== undefined) {
|
|
69
|
-
throw Error('The default tree has already set up!');
|
|
70
|
-
}
|
|
71
|
-
this._smartTreeService = smartTreeService;
|
|
72
|
-
}
|
|
73
|
-
constructor(inject, auth, pageName, _componentName, element, renderer) {
|
|
74
|
-
this.inject = inject;
|
|
75
|
-
this.auth = auth;
|
|
76
|
-
this.pageName = pageName;
|
|
77
|
-
this._componentName = _componentName;
|
|
78
|
-
this.element = element;
|
|
79
|
-
this.renderer = renderer;
|
|
80
|
-
this._destroy$ = new Subject();
|
|
81
|
-
this.detectChange = new SmartSubject(this._destroy$);
|
|
82
|
-
this.componentModelLoaded = false;
|
|
83
|
-
this.uiActionModels = [];
|
|
84
|
-
this.dataChanged = new SmartSubject(this._destroy$);
|
|
85
|
-
// Contained Widgets
|
|
86
|
-
this.widgets = new Map();
|
|
87
|
-
this.formWidgets = new Map();
|
|
88
|
-
this.useQueryLists = false;
|
|
89
|
-
this.sendModelOnWidgetAction = false;
|
|
90
|
-
this.dataChangeKeys = [];
|
|
91
|
-
this.dataChangeActionHandlers = new Map();
|
|
92
|
-
this.filterModelChangeSubjects = new Map();
|
|
93
|
-
// check and calculate pageName
|
|
94
|
-
if (!this.pageName && !this._componentName) {
|
|
95
|
-
throw new Error('pageName or componentName must be specified!');
|
|
96
|
-
}
|
|
97
|
-
this.viewContext = inject.get(SmartViewContextService);
|
|
98
|
-
if (this._componentName) {
|
|
99
|
-
let pageNameForComponent = this.viewContext.getPageNameOfComponent(this._componentName);
|
|
100
|
-
if (!this.pageName) {
|
|
101
|
-
this.pageName = pageNameForComponent;
|
|
102
|
-
}
|
|
103
|
-
else if (this.pageName !== pageNameForComponent) {
|
|
104
|
-
throw new Error(`pageName (${pageName}) and componentName (${_componentName}) doesn't match!`);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
// from this point we have this.pageName
|
|
108
|
-
this.detectChange.subscribe((change) => {
|
|
109
|
-
this.handleChanges(change);
|
|
110
|
-
});
|
|
111
|
-
this.uiActionService = inject.get(UiActionService);
|
|
112
|
-
this.uiActionDescriptorService = inject.get(UiActionDescriptorService);
|
|
113
|
-
}
|
|
114
|
-
_ngOnInit() {
|
|
115
|
-
this.run();
|
|
116
|
-
}
|
|
117
|
-
_ngOnDestroy() {
|
|
118
|
-
this.viewContext.unfollow(this.uuid);
|
|
119
|
-
this.widgets.clear();
|
|
120
|
-
this.formWidgets.clear();
|
|
121
|
-
this.dataChangeActionHandlers.clear();
|
|
122
|
-
this.filterModelChangeSubjects.clear();
|
|
123
|
-
this._destroy$.next();
|
|
124
|
-
this._destroy$.complete();
|
|
125
|
-
}
|
|
126
|
-
_ngAfterViewInit() {
|
|
127
|
-
this.changeDetector = this.inject.get(ChangeDetectorRef);
|
|
128
|
-
if (this.useQueryLists) {
|
|
129
|
-
if (!this.getSmartComponentLayoutsQL()) {
|
|
130
|
-
console.warn('SmartComponentLayoutsQL not available!');
|
|
131
|
-
}
|
|
132
|
-
else {
|
|
133
|
-
this.handleQueryList(this.getSmartComponentLayoutsQL(), (comp) => {
|
|
134
|
-
if (comp.smartComponentLayout) {
|
|
135
|
-
this.initActions();
|
|
136
|
-
}
|
|
137
|
-
if (this.uuid && this.uuid !== comp.uuid)
|
|
138
|
-
comp.uuid = this.uuid;
|
|
139
|
-
SmartComponentLayoutUtility.getGrids(comp).forEach((grid) => this.setupGridServices(grid));
|
|
140
|
-
});
|
|
141
|
-
// for handling embedded forms
|
|
142
|
-
this.handleQueryList(this.getSmartComponentLayoutsQL(), (form) => {
|
|
143
|
-
this.handleDataChangeSubscriptions();
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
if (!this.getSmartFormsQL()) {
|
|
147
|
-
console.warn('getSmartFormsQL not available!');
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
this.handleQueryList(this.getSmartFormsQL(), (form) => {
|
|
151
|
-
this.handleDataChangeSubscriptions();
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
if (!this.getSmartGridsQL()) {
|
|
155
|
-
console.warn('SmartGridsQL not available!');
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
this.handleQueryList(this.getSmartGridsQL(), (grid) => {
|
|
159
|
-
if (grid) {
|
|
160
|
-
if (grid.smartGrid) {
|
|
161
|
-
this.setupGridServices(grid);
|
|
162
|
-
grid.setupToolbar();
|
|
163
|
-
if (grid.toolbar) {
|
|
164
|
-
this.initActions();
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
if (this.uuid && this.uuid !== grid.uuid) {
|
|
168
|
-
grid.uuid = this.uuid;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
if (!this.getSmartMapQL()) {
|
|
174
|
-
console.warn('SmartMapsQL is not available!');
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
this.handleQueryList(this.getSmartMapQL(), (map) => {
|
|
178
|
-
map.viewContextService = this.viewContext;
|
|
179
|
-
if (this.uuid && this.uuid !== map.uuid) {
|
|
180
|
-
map.uuid = this.uuid;
|
|
181
|
-
}
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
if (!this.getSmartFilterEditorContentComponentsQL()) {
|
|
185
|
-
console.warn('SmartFilterEditorContentComponentsQL not available!');
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
this.handleQueryList(this.getSmartFilterEditorContentComponentsQL(), (filterComp) => {
|
|
189
|
-
if (filterComp) {
|
|
190
|
-
if (filterComp.service) {
|
|
191
|
-
this.setupFilterServices(filterComp);
|
|
192
|
-
let service = filterComp.service;
|
|
193
|
-
let identifier = service.config.identifier;
|
|
194
|
-
if (identifier && !this.filterModelChangeSubjects.has(identifier)) {
|
|
195
|
-
this.filterModelChangeSubjects.set(identifier, service.modelChanged);
|
|
196
|
-
service.modelChanged.pipe(takeUntil(this._destroy$)).subscribe(() => {
|
|
197
|
-
if (this.getAllFilterUiActionToolbars().length > 0) {
|
|
198
|
-
this.initActions();
|
|
199
|
-
}
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
setupGridServices(grid) {
|
|
209
|
-
if (grid.smartGrid) {
|
|
210
|
-
if (!grid.smartGrid.uiActionService) {
|
|
211
|
-
grid.smartGrid.uiActionService = this.uiActionService;
|
|
212
|
-
}
|
|
213
|
-
if (!grid.smartGrid.uiActionDescriptorService) {
|
|
214
|
-
grid.smartGrid.uiActionDescriptorService = this.uiActionDescriptorService;
|
|
215
|
-
}
|
|
216
|
-
if (!grid.smartGrid.serviceToUse) {
|
|
217
|
-
grid.smartGrid.serviceToUse = this;
|
|
218
|
-
}
|
|
219
|
-
if (!grid.smartGrid.viewContextService) {
|
|
220
|
-
grid.smartGrid.viewContextService = this.viewContext;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
setupFilterServices(filterComp) {
|
|
225
|
-
if (filterComp.service) {
|
|
226
|
-
let service = filterComp.service;
|
|
227
|
-
if (this.uuid && this.uuid !== service.config.uuid) {
|
|
228
|
-
service.config.uuid = this.uuid;
|
|
229
|
-
}
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
handleQueryListSimple(ql, handler) {
|
|
233
|
-
handler();
|
|
234
|
-
ql.changes.pipe(takeUntil(this._destroy$)).subscribe(() => handler());
|
|
235
|
-
}
|
|
236
|
-
handleQueryList(ql, handler) {
|
|
237
|
-
ql.forEach((el) => handler(el));
|
|
238
|
-
ql.changes
|
|
239
|
-
.pipe(takeUntil(this._destroy$))
|
|
240
|
-
.subscribe((list) => list.forEach((el) => handler(el)));
|
|
241
|
-
}
|
|
242
|
-
getWidgets() {
|
|
243
|
-
if (this.useQueryLists) {
|
|
244
|
-
let widgets = new Map();
|
|
245
|
-
this.getAllSmartGridComponents()
|
|
246
|
-
.filter((grid) => (grid?.smartGrid?.gridIdentifier ? true : false))
|
|
247
|
-
.forEach((grid) => widgets.set(grid.smartGrid.gridIdentifier, grid));
|
|
248
|
-
this.getAllSmartTreeComponents()
|
|
249
|
-
.filter((tree) => (tree?.smartTreeModel?.identifier ? true : false))
|
|
250
|
-
.forEach((tree) => widgets.set(tree.smartTreeModel.identifier, tree));
|
|
251
|
-
this.getAllSmartFilterEditorContentComponents()
|
|
252
|
-
.filter((filter) => (filter.service.config.identifier ? true : false))
|
|
253
|
-
.forEach((filter) => widgets.set(filter.service.config.identifier, filter));
|
|
254
|
-
this.getAllSmartMapComponents()
|
|
255
|
-
.filter((map) => !!map.identifier)
|
|
256
|
-
.forEach((map) => widgets.set(map.identifier, map));
|
|
257
|
-
return widgets;
|
|
258
|
-
}
|
|
259
|
-
return this.widgets;
|
|
260
|
-
}
|
|
261
|
-
initComponentByModel() {
|
|
262
|
-
SmartStyleUtility.applyStyle(this.model?.style, this.element, this.renderer);
|
|
263
|
-
SmartStyleUtility.applyStyle(this.model?.parentStyle, this.element, this.renderer, true);
|
|
264
|
-
this.initData();
|
|
265
|
-
if (this.useQueryLists) {
|
|
266
|
-
this.getAllSmartFormComponents()?.forEach((form) => {
|
|
267
|
-
if (form.smartForm) {
|
|
268
|
-
form.smartForm.componentModel = this.model;
|
|
269
|
-
// uses data, valueSets, constraints
|
|
270
|
-
form.constructForm();
|
|
271
|
-
}
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
this.changeDetector?.detectChanges();
|
|
275
|
-
this.initActions();
|
|
276
|
-
// TODO: layout, widgets
|
|
277
|
-
}
|
|
278
|
-
getAllSmartFormComponents() {
|
|
279
|
-
let forms = this.getSmartFormsQL()?.toArray() ?? [];
|
|
280
|
-
this.getSmartComponentLayoutsQL()?.forEach((comp) => {
|
|
281
|
-
forms.push(...SmartComponentLayoutUtility.getForms(comp));
|
|
282
|
-
});
|
|
283
|
-
return forms;
|
|
284
|
-
}
|
|
285
|
-
getAllSmartGridComponents() {
|
|
286
|
-
let grids = this.getSmartGridsQL()?.toArray() ?? [];
|
|
287
|
-
this.getSmartComponentLayoutsQL()?.forEach((comp) => {
|
|
288
|
-
grids.push(...SmartComponentLayoutUtility.getGrids(comp));
|
|
289
|
-
});
|
|
290
|
-
return grids;
|
|
291
|
-
}
|
|
292
|
-
getAllSmartMapComponents() {
|
|
293
|
-
const maps = this.getSmartMapQL()?.toArray() ?? [];
|
|
294
|
-
this.getSmartComponentLayoutsQL()?.forEach((comp) => {
|
|
295
|
-
maps.push(...SmartComponentLayoutUtility.getMaps(comp));
|
|
296
|
-
});
|
|
297
|
-
return maps;
|
|
298
|
-
}
|
|
299
|
-
getAllSmartTreeComponents() {
|
|
300
|
-
let trees = this.getSmartTreesQL()?.toArray() ?? [];
|
|
301
|
-
this.getSmartComponentLayoutsQL()?.forEach((comp) => {
|
|
302
|
-
trees.push(...SmartComponentLayoutUtility.getTrees(comp));
|
|
303
|
-
});
|
|
304
|
-
return trees;
|
|
305
|
-
}
|
|
306
|
-
getAllSmartFilterEditorContentComponents() {
|
|
307
|
-
let filters = this.getSmartFilterEditorContentComponentsQL()?.toArray() ?? [];
|
|
308
|
-
return filters;
|
|
309
|
-
}
|
|
310
|
-
getAllSmartUiActionToolbars() {
|
|
311
|
-
let toolbars = this.getSmartUiActionToolbarsQL()?.toArray() ?? [];
|
|
312
|
-
this.getAllSmartGridComponents()?.forEach((grid) => {
|
|
313
|
-
if (grid.toolbar) {
|
|
314
|
-
toolbars.push(grid.toolbar);
|
|
315
|
-
}
|
|
316
|
-
});
|
|
317
|
-
this.getSmartComponentLayoutsQL()?.forEach((comp) => {
|
|
318
|
-
toolbars.push(...SmartComponentLayoutUtility.getToolbars(comp));
|
|
319
|
-
});
|
|
320
|
-
this.getAllSmartFormComponents()
|
|
321
|
-
?.flatMap((form) => form.getToolbars())
|
|
322
|
-
.filter((toolbar) => toolbar !== undefined || toolbar !== null)
|
|
323
|
-
.forEach((toolbar) => toolbars.push(toolbar));
|
|
324
|
-
this.getAllFilterUiActionToolbars().forEach((toolbar) => toolbars.push(toolbar));
|
|
325
|
-
return toolbars;
|
|
326
|
-
}
|
|
327
|
-
getAllFilterUiActionToolbars() {
|
|
328
|
-
return this.getAllSmartFilterEditorContentComponents()
|
|
329
|
-
?.filter((filter) => filter.simpleFilterRef?.instance !== undefined)
|
|
330
|
-
.flatMap((filter) => filter.simpleFilterRef?.instance.getToolbars())
|
|
331
|
-
.filter((toolbar) => toolbar !== undefined || toolbar !== null)
|
|
332
|
-
.map((toolbar) => toolbar);
|
|
333
|
-
}
|
|
334
|
-
initData() {
|
|
335
|
-
if (this.model?.data) {
|
|
336
|
-
this.data = this.model?.data;
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
initActions() {
|
|
340
|
-
if (this.model?.actions) {
|
|
341
|
-
let uiActionModels = this.model?.actions.map((uiAction) => {
|
|
342
|
-
return {
|
|
343
|
-
serviceToUse: this,
|
|
344
|
-
uiAction,
|
|
345
|
-
};
|
|
346
|
-
});
|
|
347
|
-
const allToolbars = this.getAllSmartUiActionToolbars();
|
|
348
|
-
let toolbars = allToolbars.filter((toolbar) => toolbar.id);
|
|
349
|
-
let toolbarsWithoutId = this.getAllSmartUiActionToolbars().filter((toolbar) => toolbar.id === undefined || toolbar.id === null);
|
|
350
|
-
let toolbarModels = new Map();
|
|
351
|
-
toolbars.forEach((toolbar) => {
|
|
352
|
-
toolbarModels.set(toolbar.id, []);
|
|
353
|
-
});
|
|
354
|
-
let globalUiActionModels = [];
|
|
355
|
-
uiActionModels.forEach((action) => {
|
|
356
|
-
let actionModel = globalUiActionModels;
|
|
357
|
-
let toolbarId = action.uiAction.toolbar;
|
|
358
|
-
if (toolbarId && toolbarModels.has(toolbarId)) {
|
|
359
|
-
actionModel = toolbarModels.get(toolbarId);
|
|
360
|
-
}
|
|
361
|
-
if (!actionModel) {
|
|
362
|
-
actionModel = globalUiActionModels;
|
|
363
|
-
}
|
|
364
|
-
actionModel.push(action);
|
|
365
|
-
});
|
|
366
|
-
this.uiActionModels = globalUiActionModels;
|
|
367
|
-
this.setupAllToolbars(toolbars, toolbarsWithoutId, toolbarModels)
|
|
368
|
-
.then(() => {
|
|
369
|
-
this.changeDetector?.detectChanges();
|
|
370
|
-
})
|
|
371
|
-
.catch((error) => {
|
|
372
|
-
console.error('Error during setup:', error);
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
async setupAllToolbars(toolbars, toolbarsWithoutId, toolbarModels) {
|
|
377
|
-
const setupPromises = [];
|
|
378
|
-
toolbars.forEach((toolbar) => {
|
|
379
|
-
toolbar.uiActionModels = toolbarModels.get(toolbar.id);
|
|
380
|
-
setupPromises.push(toolbar.setUp());
|
|
381
|
-
});
|
|
382
|
-
toolbarsWithoutId.forEach((toolbar) => {
|
|
383
|
-
setupPromises.push(toolbar.setUp());
|
|
384
|
-
});
|
|
385
|
-
await Promise.all(setupPromises);
|
|
386
|
-
}
|
|
387
|
-
run() {
|
|
388
|
-
if (this.auth.bffApisHaveBeenSetUp) {
|
|
389
|
-
this.load();
|
|
390
|
-
}
|
|
391
|
-
else {
|
|
392
|
-
this.auth.headersUpdated.subscribe(() => {
|
|
393
|
-
this.load();
|
|
394
|
-
});
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
async load() {
|
|
398
|
-
this.componentModelLoaded = false;
|
|
399
|
-
const uuid = this.viewContext.getUuidOfPage(this.pageName);
|
|
400
|
-
// this.model = await this.viewContext.load(this.uuid);
|
|
401
|
-
const change = await this.viewContext.load2(uuid);
|
|
402
|
-
this.componentModelLoaded = true;
|
|
403
|
-
this.uuid = uuid;
|
|
404
|
-
this.model = change.result;
|
|
405
|
-
if (this.model.widgets) {
|
|
406
|
-
// grids are already loaded in setUuid()
|
|
407
|
-
this.handleChangeWidgets(this.model.widgets, true);
|
|
408
|
-
}
|
|
409
|
-
}
|
|
410
|
-
async executeUiAction(uiAction, options) {
|
|
411
|
-
this.uiActionService.uiActionModel = {
|
|
412
|
-
serviceToUse: this,
|
|
413
|
-
uiAction: uiAction,
|
|
414
|
-
};
|
|
415
|
-
await this.uiActionService.execute(uiAction, options);
|
|
416
|
-
}
|
|
417
|
-
addDataChangeActionHandler(key) {
|
|
418
|
-
if (!this.dataChangeKeys.includes(key)) {
|
|
419
|
-
this.dataChangeKeys.push(key);
|
|
420
|
-
}
|
|
421
|
-
}
|
|
422
|
-
removeDataChangeActionHandler(key) {
|
|
423
|
-
let idx = this.dataChangeKeys.indexOf(key);
|
|
424
|
-
if (idx >= 0) {
|
|
425
|
-
this.dataChangeKeys.splice(idx, 1);
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
dataChangeActionHandler(event) {
|
|
429
|
-
if (this.dataChangeKeys.includes(event.key)) {
|
|
430
|
-
this.executeUiAction({
|
|
431
|
-
code: event.key,
|
|
432
|
-
model: true,
|
|
433
|
-
params: {
|
|
434
|
-
item: event.value,
|
|
435
|
-
},
|
|
436
|
-
});
|
|
437
|
-
}
|
|
438
|
-
}
|
|
439
|
-
handleDataChangeSubscriptions() {
|
|
440
|
-
if (this.useQueryLists) {
|
|
441
|
-
let forms = this.getAllSmartFormComponents();
|
|
442
|
-
// add elements to dataChangeKeys
|
|
443
|
-
forms.forEach((form) => {
|
|
444
|
-
form.smartForm?.widgets.forEach((widget) => {
|
|
445
|
-
if (widget.key) {
|
|
446
|
-
if (widget.valueChangeMode === ValueChangeMode.IMMEDIATE_ACTION) {
|
|
447
|
-
this.addDataChangeActionHandler(widget.key);
|
|
448
|
-
}
|
|
449
|
-
else {
|
|
450
|
-
this.removeDataChangeActionHandler(widget.key);
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
});
|
|
454
|
-
});
|
|
455
|
-
// subscribe to new forms
|
|
456
|
-
forms.forEach((component) => {
|
|
457
|
-
if (!this.dataChangeActionHandlers.has(component)) {
|
|
458
|
-
let subs = component.sophisticatedValueChange
|
|
459
|
-
.pipe(takeUntil(this._destroy$))
|
|
460
|
-
.subscribe((event) => this.dataChangeActionHandler(event));
|
|
461
|
-
this.dataChangeActionHandlers.set(component, subs);
|
|
462
|
-
}
|
|
463
|
-
});
|
|
464
|
-
// unsubscribe from removed forms
|
|
465
|
-
this.dataChangeActionHandlers.forEach((subs, form) => {
|
|
466
|
-
if (!forms.find((c) => c === form)) {
|
|
467
|
-
subs.unsubscribe();
|
|
468
|
-
this.dataChangeActionHandlers.delete(form);
|
|
469
|
-
}
|
|
470
|
-
});
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
getInvalidFields() {
|
|
474
|
-
let aggregatedInvalidFields = {
|
|
475
|
-
invalidFieldKeys: [],
|
|
476
|
-
invalidFieldNames: [],
|
|
477
|
-
};
|
|
478
|
-
if (this.useQueryLists) {
|
|
479
|
-
this.getAllSmartFormComponents()?.forEach((form) => this.validateForm(form, aggregatedInvalidFields));
|
|
480
|
-
}
|
|
481
|
-
else {
|
|
482
|
-
this.formWidgets?.forEach((form) => this.validateForm(form, aggregatedInvalidFields));
|
|
483
|
-
}
|
|
484
|
-
return aggregatedInvalidFields;
|
|
485
|
-
}
|
|
486
|
-
validateForm(form, aggregatedInvalidFields) {
|
|
487
|
-
let invalidFieldsOfForm = form?.getInvalidFields();
|
|
488
|
-
if (invalidFieldsOfForm) {
|
|
489
|
-
invalidFieldsOfForm.invalidFieldKeys.forEach((key) => aggregatedInvalidFields.invalidFieldKeys.push(key));
|
|
490
|
-
invalidFieldsOfForm.invalidFieldNames.forEach((key) => aggregatedInvalidFields.invalidFieldNames.push(key));
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
//#region UseUiAction
|
|
494
|
-
getAdditionalParams(uiAction) {
|
|
495
|
-
return {
|
|
496
|
-
forTextArea: '',
|
|
497
|
-
forTextField: '',
|
|
498
|
-
};
|
|
499
|
-
}
|
|
500
|
-
getModel() {
|
|
501
|
-
return this.data;
|
|
502
|
-
}
|
|
503
|
-
submitForm(validate) {
|
|
504
|
-
this.submitForms(validate);
|
|
505
|
-
}
|
|
506
|
-
async performUiActionRequest(uiActionRequest, widgetId, nodeId) {
|
|
507
|
-
if (uiActionRequest.params['_files']) {
|
|
508
|
-
const param = uiActionRequest.params['param'];
|
|
509
|
-
const files = uiActionRequest.params['_files'];
|
|
510
|
-
const isMultiple = uiActionRequest.params['isMultiple'];
|
|
511
|
-
delete uiActionRequest.params['param'];
|
|
512
|
-
delete uiActionRequest.params['_files'];
|
|
513
|
-
delete uiActionRequest.params['isMultiple'];
|
|
514
|
-
// await this.sendModelToServer();
|
|
515
|
-
if (!isMultiple) {
|
|
516
|
-
await this.viewContext.performUploadAction(this.uuid, uiActionRequest, param, files[0]);
|
|
517
|
-
}
|
|
518
|
-
else {
|
|
519
|
-
await this.viewContext.performUploadMultipleAction(this.uuid, uiActionRequest, param, files);
|
|
520
|
-
}
|
|
521
|
-
}
|
|
522
|
-
else if (widgetId && nodeId) {
|
|
523
|
-
// await this.sendModelToServer();
|
|
524
|
-
this.addModelToWidgetAction(uiActionRequest);
|
|
525
|
-
await this.viewContext.performWidgetAction(this.uuid, widgetId, nodeId, uiActionRequest);
|
|
526
|
-
}
|
|
527
|
-
else if (widgetId) {
|
|
528
|
-
// await this.sendModelToServer();
|
|
529
|
-
this.addModelToWidgetAction(uiActionRequest);
|
|
530
|
-
await this.viewContext.performWidgetMainAction(this.uuid, widgetId, uiActionRequest);
|
|
531
|
-
}
|
|
532
|
-
else {
|
|
533
|
-
await this.viewContext.performAction(this.uuid, uiActionRequest);
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
addModelToWidgetAction(uiActionRequest) {
|
|
537
|
-
if (this.sendModelOnWidgetAction) {
|
|
538
|
-
this.submitForm(false);
|
|
539
|
-
// mimic ComponentModel
|
|
540
|
-
uiActionRequest.params['clientPageModel'] = { data: this.getModel() };
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
// private async sendModelToServer() {
|
|
544
|
-
// this.submitForms(false);
|
|
545
|
-
// let dataChange = {
|
|
546
|
-
// kind: DataChangeKind.Widget,
|
|
547
|
-
// source: '',
|
|
548
|
-
// values: [['', this.getModel()]],
|
|
549
|
-
// };
|
|
550
|
-
// await this.viewContext.dataChanged(this.uuid!, dataChange);
|
|
551
|
-
// }
|
|
552
|
-
handleSpecificDemandsAsynchronously(uiAction, uiActionRequest) {
|
|
553
|
-
throw new Error('handleSpecificDemandsAsynchronously method not implemented.');
|
|
554
|
-
}
|
|
555
|
-
//#endregion
|
|
556
|
-
/**
|
|
557
|
-
* Submits all the registered forms in the SmartComponent
|
|
558
|
-
*/
|
|
559
|
-
submitForms(validate) {
|
|
560
|
-
if (this.useQueryLists) {
|
|
561
|
-
this.getAllSmartFormComponents()?.forEach((form) => {
|
|
562
|
-
form?.submitForm(validate);
|
|
563
|
-
});
|
|
564
|
-
}
|
|
565
|
-
else {
|
|
566
|
-
this.formWidgets?.forEach((form) => {
|
|
567
|
-
form?.submitForm(validate);
|
|
568
|
-
});
|
|
569
|
-
}
|
|
570
|
-
}
|
|
571
|
-
addGrid(smartGrid, options, useAsDefaultGrid, componentReference) {
|
|
572
|
-
smartGrid.options = options;
|
|
573
|
-
smartGrid.uiActionService = this.uiActionService;
|
|
574
|
-
smartGrid.uiActionDescriptorService = this.uiActionDescriptorService;
|
|
575
|
-
smartGrid.serviceToUse = this;
|
|
576
|
-
smartGrid.viewContextService = this.viewContext;
|
|
577
|
-
if (!this.useQueryLists) {
|
|
578
|
-
this.widgets.set(smartGrid.gridIdentifier, componentReference);
|
|
579
|
-
}
|
|
580
|
-
else {
|
|
581
|
-
console.warn(`Added smartGrid when useQueryLists === true (${smartGrid.gridIdentifier})`);
|
|
582
|
-
}
|
|
583
|
-
if (useAsDefaultGrid) {
|
|
584
|
-
this.smartGrid = smartGrid;
|
|
585
|
-
return this.smartGrid;
|
|
586
|
-
}
|
|
587
|
-
return smartGrid;
|
|
588
|
-
}
|
|
589
|
-
addForm(smartFormId, smartForm, componentReference) {
|
|
590
|
-
if (!this.useQueryLists) {
|
|
591
|
-
this.formWidgets.set(smartFormId, componentReference);
|
|
592
|
-
}
|
|
593
|
-
else {
|
|
594
|
-
console.warn(`Added smartForm when useQueryLists === true (${smartFormId})`);
|
|
595
|
-
}
|
|
596
|
-
// if (this.sendDataChanges && componentReference) {
|
|
597
|
-
// smartForm.useOnValueChangeEvent = true;
|
|
598
|
-
// componentReference.sophisticatedValueChange
|
|
599
|
-
// .pipe(takeUntil(this._destroy$))
|
|
600
|
-
// .subscribe((valueChange: SophisticatedValueChange) => {
|
|
601
|
-
// this.handleValueChanges(valueChange);
|
|
602
|
-
// });
|
|
603
|
-
// }
|
|
604
|
-
return smartForm;
|
|
605
|
-
}
|
|
606
|
-
setUpDefaultTree(treeId) {
|
|
607
|
-
this.smartTreeService = this.createTreeService(treeId);
|
|
608
|
-
}
|
|
609
|
-
createTreeService(treeId) {
|
|
610
|
-
const treeService = new SmarttreeGenericService(this.inject, this.pageName, treeId);
|
|
611
|
-
if (!this.useQueryLists) {
|
|
612
|
-
this.widgets.set(treeId, treeService);
|
|
613
|
-
}
|
|
614
|
-
else {
|
|
615
|
-
console.warn(`Added smartTree when useQueryLists === true (${treeId})`);
|
|
616
|
-
}
|
|
617
|
-
return treeService;
|
|
618
|
-
}
|
|
619
|
-
addFileUploader(uiActionCode, fileFormats, maxSizeMb, isMultiple) {
|
|
620
|
-
return {
|
|
621
|
-
uiActionCode,
|
|
622
|
-
smartComponent: this,
|
|
623
|
-
fileFormats,
|
|
624
|
-
isMultiple,
|
|
625
|
-
maxSizeMb,
|
|
626
|
-
};
|
|
627
|
-
}
|
|
628
|
-
// #region handle changes
|
|
629
|
-
handleValueChanges(valueChange) {
|
|
630
|
-
let dataChange;
|
|
631
|
-
if (valueChange.key.includes('.')) {
|
|
632
|
-
const source = valueChange.key.split('.')[0];
|
|
633
|
-
const valueKey = valueChange.key.split('.')[1];
|
|
634
|
-
dataChange = {
|
|
635
|
-
kind: valueChange.kind === 'basic' ? DataChangeKind.WIDGET : DataChangeKind.SELECTION,
|
|
636
|
-
source,
|
|
637
|
-
values: [[valueKey, valueChange.value]],
|
|
638
|
-
};
|
|
639
|
-
}
|
|
640
|
-
else {
|
|
641
|
-
dataChange = {
|
|
642
|
-
kind: valueChange.kind === 'basic' ? DataChangeKind.WIDGET : DataChangeKind.SELECTION,
|
|
643
|
-
source: valueChange.key,
|
|
644
|
-
values: [[valueChange.key, valueChange.value]],
|
|
645
|
-
};
|
|
646
|
-
}
|
|
647
|
-
this.viewContext.dataChanged(this.uuid, dataChange);
|
|
648
|
-
}
|
|
649
|
-
handleChanges(change) {
|
|
650
|
-
try {
|
|
651
|
-
if (!this.componentModelLoaded) {
|
|
652
|
-
// initial load
|
|
653
|
-
return;
|
|
654
|
-
}
|
|
655
|
-
if (change.changedWidgets) {
|
|
656
|
-
this.handleChangeWidgets(change.changedWidgets);
|
|
657
|
-
}
|
|
658
|
-
let dataChangeHasBeenNexted = false;
|
|
659
|
-
if (change.changes) {
|
|
660
|
-
const changes = change.changes;
|
|
661
|
-
Object.keys(changes).map((changeKey) => {
|
|
662
|
-
if (changeKey.startsWith('data.')) {
|
|
663
|
-
this.handleDataChange(changes, changeKey);
|
|
664
|
-
}
|
|
665
|
-
else if (changeKey.startsWith('layouts.') && this.model?.layouts) {
|
|
666
|
-
this.handleLayoutChange(changes, changeKey);
|
|
667
|
-
}
|
|
668
|
-
else if (changeKey.startsWith('componentLayouts.') && this.model?.layouts) {
|
|
669
|
-
this.handleComponentLayoutChange(changes, changeKey);
|
|
670
|
-
}
|
|
671
|
-
else if (changeKey.startsWith('valueSets.') && this.model?.valueSets) {
|
|
672
|
-
this.handleValueSetChange(changes, changeKey);
|
|
673
|
-
}
|
|
674
|
-
else if (changeKey === 'actions') {
|
|
675
|
-
this.handleActionChange(changes, changeKey);
|
|
676
|
-
}
|
|
677
|
-
else if (changeKey === 'constraints') {
|
|
678
|
-
this.handleConstraintChange(changes, changeKey);
|
|
679
|
-
}
|
|
680
|
-
else if (changeKey === '') {
|
|
681
|
-
this.model = changes[''];
|
|
682
|
-
dataChangeHasBeenNexted = true;
|
|
683
|
-
}
|
|
684
|
-
});
|
|
685
|
-
if (!dataChangeHasBeenNexted) {
|
|
686
|
-
this.dataChanged.next();
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
catch (error) {
|
|
691
|
-
console.error(error);
|
|
692
|
-
this.model = change.value;
|
|
693
|
-
}
|
|
694
|
-
if (!change.changedWidgets && !change.changes && change.value) {
|
|
695
|
-
this.model = change.value;
|
|
696
|
-
}
|
|
697
|
-
}
|
|
698
|
-
handleChangeWidgets(changedWidgets, skipLoad = false) {
|
|
699
|
-
let widgets = this.getWidgets();
|
|
700
|
-
changedWidgets.forEach((key) => {
|
|
701
|
-
const reference = widgets.get(key);
|
|
702
|
-
if (reference instanceof SmartGridComponent) {
|
|
703
|
-
this.setupGridServices(reference);
|
|
704
|
-
if (!skipLoad) {
|
|
705
|
-
reference.refresh();
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
else if (reference instanceof SmarttreeGenericService) {
|
|
709
|
-
if (!skipLoad) {
|
|
710
|
-
reference.initialize();
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
else if (reference instanceof SmartFilterEditorContentComponent) {
|
|
714
|
-
this.setupFilterServices(reference);
|
|
715
|
-
//if (!skipLoad) { // filter is not loaded when setting uuid
|
|
716
|
-
reference.service.load();
|
|
717
|
-
//}
|
|
718
|
-
}
|
|
719
|
-
else if (reference instanceof SmartMapComponent) {
|
|
720
|
-
reference.load();
|
|
721
|
-
}
|
|
722
|
-
else if (!skipLoad && reference === undefined) {
|
|
723
|
-
console.error(`Provided reference for ${key} is undefined.`);
|
|
724
|
-
}
|
|
725
|
-
});
|
|
726
|
-
}
|
|
727
|
-
setValueDeeply(model, key, value) {
|
|
728
|
-
let splittedKeys = key.split('.');
|
|
729
|
-
let deepModel = [model];
|
|
730
|
-
let tempModel;
|
|
731
|
-
for (let index = 0; index < splittedKeys.length; index++) {
|
|
732
|
-
tempModel = deepModel[index];
|
|
733
|
-
if (typeof tempModel[splittedKeys[index]] !== 'string' &&
|
|
734
|
-
typeof tempModel[splittedKeys[index]] !== 'boolean' &&
|
|
735
|
-
typeof tempModel[splittedKeys[index]] !== 'number' &&
|
|
736
|
-
tempModel[splittedKeys[index]] !== undefined) {
|
|
737
|
-
deepModel.push(tempModel[splittedKeys[index]]);
|
|
738
|
-
}
|
|
739
|
-
if (index === splittedKeys.length - 1) {
|
|
740
|
-
let oldValue = tempModel[splittedKeys[index]];
|
|
741
|
-
// if (value === '' && (oldValue === null || oldValue === undefined) then don't change value.
|
|
742
|
-
if (value !== '' || (oldValue !== null && oldValue !== undefined)) {
|
|
743
|
-
tempModel[splittedKeys[index]] = value;
|
|
744
|
-
}
|
|
745
|
-
break;
|
|
746
|
-
}
|
|
747
|
-
}
|
|
748
|
-
}
|
|
749
|
-
handleDataChange(changes, changeKey) {
|
|
750
|
-
this.setValueDeeply(this.model, changeKey, changes[changeKey]);
|
|
751
|
-
if (this.useQueryLists) {
|
|
752
|
-
this.getAllSmartFormComponents()?.forEach((form) => form.refresh());
|
|
753
|
-
}
|
|
754
|
-
else {
|
|
755
|
-
this.formWidgets.forEach((formComponent, key) => {
|
|
756
|
-
if (formComponent === undefined) {
|
|
757
|
-
console.error(`Provided form reference for ${key} is undefined.`);
|
|
758
|
-
}
|
|
759
|
-
else {
|
|
760
|
-
formComponent.refresh();
|
|
761
|
-
}
|
|
762
|
-
});
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
handleLayoutChange(changes, changeKey) {
|
|
766
|
-
let layoutKey = changeKey.split('.')[1];
|
|
767
|
-
this.model.layouts[layoutKey] = changes[changeKey];
|
|
768
|
-
}
|
|
769
|
-
handleComponentLayoutChange(changes, changeKey) {
|
|
770
|
-
let layoutKey = changeKey.split('.')[1];
|
|
771
|
-
let componentLayouts = this.model.componentLayouts;
|
|
772
|
-
componentLayouts[layoutKey] = changes[changeKey];
|
|
773
|
-
}
|
|
774
|
-
handleValueSetChange(changes, changeKey) {
|
|
775
|
-
let valueSetKey = changeKey.split('.')[1];
|
|
776
|
-
this.model.valueSets[valueSetKey] = changes[changeKey];
|
|
777
|
-
}
|
|
778
|
-
handleActionChange(changes, changeKey) {
|
|
779
|
-
this.model.actions = changes[changeKey];
|
|
780
|
-
this.initActions();
|
|
781
|
-
}
|
|
782
|
-
handleConstraintChange(changes, changeKey) {
|
|
783
|
-
this.model.constraints = changes[changeKey];
|
|
784
|
-
}
|
|
785
|
-
}
|
|
786
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnQtY29tcG9uZW50LWFwaS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zbWFydC1uZy1jbGllbnQvc3JjL2xpYi9zbWFydC1jbGllbnQvc21hcnQtY29tcG9uZW50LWFwaS1jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUE4QyxNQUFNLGVBQWUsQ0FBQztBQUM5RixPQUFPLEVBQUUsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDeEQsT0FBTyxFQUVMLDJCQUEyQixHQUM1QixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ25GLE9BQU8sRUFLTCxlQUFlLEdBQ2hCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUEwQixrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRSxPQUFPLEVBSUwsY0FBYyxFQUdkLHVCQUF1QixFQUd2Qix5QkFBeUIsRUFHekIsZUFBZSxHQUloQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBR2hGLE1BQU0sT0FBZ0IsdUJBQXVCO0lBVzNDLElBQUksSUFBSTtRQUNOLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBd0I7UUFDL0IsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxTQUFTLEdBQVksSUFBSSxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDcEIsQ0FBQztRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDckMsSUFBSSxHQUFHLFlBQVksa0JBQWtCLEVBQUUsQ0FBQztnQkFDdEMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFELENBQUM7aUJBQU0sSUFBSSxHQUFHLFlBQVksaUNBQWlDLEVBQUUsQ0FBQztnQkFDNUQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDekUsQ0FBQztpQkFBTSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEdBQUcsK0JBQStCLENBQUMsQ0FBQztZQUM5RSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLG9DQUFvQyxFQUFFLENBQUM7WUFDL0MsSUFBSSxDQUFDLG9DQUFvQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsd0JBQXdCO2lCQUNsRixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztpQkFDL0IsU0FBUyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7Z0JBQ3RCLElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFTLEVBQUUsQ0FBQztvQkFDaEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNiLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFDRCxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQU0sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7SUFJRCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLEtBQWlDO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBRXBCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFJRCxJQUFJLElBQUk7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLEtBQW9CO1FBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQWtCRCxJQUFXLGdCQUFnQjtRQUN6QixPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsSUFBVyxnQkFBZ0IsQ0FBQyxnQkFBcUQ7UUFDL0UsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekMsTUFBTSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGdCQUFnQixDQUFDO0lBQzVDLENBQUM7SUFxQkQsWUFDWSxNQUFnQixFQUNoQixJQUF5QyxFQUN6QyxRQUFpQixFQUNqQixjQUF1QixFQUN2QixPQUFvQixFQUNwQixRQUFvQjtRQUxwQixXQUFNLEdBQU4sTUFBTSxDQUFVO1FBQ2hCLFNBQUksR0FBSixJQUFJLENBQXFDO1FBQ3pDLGFBQVEsR0FBUixRQUFRLENBQVM7UUFDakIsbUJBQWMsR0FBZCxjQUFjLENBQVM7UUFDdkIsWUFBTyxHQUFQLE9BQU8sQ0FBYTtRQUNwQixhQUFRLEdBQVIsUUFBUSxDQUFZO1FBdEh0QixjQUFTLEdBQWtCLElBQUksT0FBTyxFQUFFLENBQUM7UUFFM0MsaUJBQVksR0FBdUMsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBTWxGLHlCQUFvQixHQUFZLEtBQUssQ0FBQztRQTJEekMsbUJBQWMsR0FBb0IsRUFBRSxDQUFDO1FBRXJDLGdCQUFXLEdBQWtCLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQXdCckUsb0JBQW9CO1FBQ3BCLFlBQU8sR0FHSCxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWQsZ0JBQVcsR0FBZ0QsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUVyRSxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUUvQiw0QkFBdUIsR0FBWSxLQUFLLENBQUM7UUFFekMsbUJBQWMsR0FBYSxFQUFFLENBQUM7UUFDcEIsNkJBQXdCLEdBQUcsSUFBSSxHQUFHLEVBQW9DLENBQUM7UUFFdkUsOEJBQXlCLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7UUFZckUsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDdkQsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN4RixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLG9CQUFvQixDQUFDO1lBQ3ZDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLG9CQUFvQixFQUFFLENBQUM7Z0JBQ2xELE1BQU0sSUFBSSxLQUFLLENBQ2IsYUFBYSxRQUFRLHdCQUF3QixjQUFjLGtCQUFrQixDQUM5RSxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFDRCx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUE0QixFQUFFLEVBQUU7WUFDM0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMseUJBQXlCLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ2IsQ0FBQztJQUNELFlBQVk7UUFDVixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxnQkFBZ0I7UUFDZCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDekQsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLENBQUM7Z0JBQ3ZDLE9BQU8sQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQztZQUN6RCxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO29CQUNoRSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO3dCQUM5QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ3JCLENBQUM7b0JBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUk7d0JBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUNoRSwyQkFBMkIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FDMUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUM3QixDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO2dCQUNILDhCQUE4QjtnQkFDOUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUcsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO29CQUNoRSxJQUFJLENBQUMsNkJBQTZCLEVBQUUsQ0FBQztnQkFDdkMsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxDQUFDO2dCQUM1QixPQUFPLENBQUMsSUFBSSxDQUFDLGdDQUFnQyxDQUFDLENBQUM7WUFDakQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUU7b0JBQ3JELElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO2dCQUN2QyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7Z0JBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQztZQUM5QyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDckQsSUFBSSxJQUFJLEVBQUUsQ0FBQzt3QkFDVCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFDbkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUM3QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7NEJBQ3BCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dDQUNqQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7NEJBQ3JCLENBQUM7d0JBQ0gsQ0FBQzt3QkFDRCxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7NEJBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQzt3QkFDeEIsQ0FBQztvQkFDSCxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxDQUFDLElBQUksQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQ2hELENBQUM7aUJBQU0sQ0FBQztnQkFDTixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNsRCxHQUFHLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztvQkFDMUMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUN4QyxHQUFHLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ3ZCLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsRUFBRSxFQUFFLENBQUM7Z0JBQ3BELE9BQU8sQ0FBQyxJQUFJLENBQUMscURBQXFELENBQUMsQ0FBQztZQUN0RSxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsdUNBQXVDLEVBQUcsRUFBRSxDQUFDLFVBQVUsRUFBRSxFQUFFO29CQUNuRixJQUFJLFVBQVUsRUFBRSxDQUFDO3dCQUNmLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDOzRCQUN2QixJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7NEJBQ3JDLElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7NEJBQ2pDLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDOzRCQUMzQyxJQUFJLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQ0FDbEUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dDQUNyRSxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtvQ0FDbEUsSUFBSSxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0NBQ25ELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQ0FDckIsQ0FBQztnQ0FDSCxDQUFDLENBQUMsQ0FBQzs0QkFDTCxDQUFDO3dCQUNILENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLGlCQUFpQixDQUFDLElBQXdCO1FBQ2hELElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUNwQyxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3hELENBQUM7WUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO2dCQUM5QyxJQUFJLENBQUMsU0FBUyxDQUFDLHlCQUF5QixHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQztZQUM1RSxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNyQyxDQUFDO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQ3ZELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVPLG1CQUFtQixDQUFDLFVBQTZDO1FBQ3ZFLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLElBQUksT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7WUFDakMsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDbkQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNsQyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFUyxxQkFBcUIsQ0FBSSxFQUFnQixFQUFFLE9BQW1CO1FBQ3RFLE9BQU8sRUFBRSxDQUFDO1FBQ1YsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3hFLENBQUM7SUFFUyxlQUFlLENBQUksRUFBZ0IsRUFBRSxPQUF3QjtRQUNyRSxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNoQyxFQUFFLENBQUMsT0FBTzthQUNQLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQy9CLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUUsSUFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQW9CUyxVQUFVO1FBUWxCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksT0FBTyxHQU9QLElBQUksR0FBRyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMseUJBQXlCLEVBQUU7aUJBQzdCLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDbEUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFVLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDeEUsSUFBSSxDQUFDLHlCQUF5QixFQUFFO2lCQUM3QixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ25FLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFLLENBQUMsY0FBZSxDQUFDLFVBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQzNFLElBQUksQ0FBQyx3Q0FBd0MsRUFBRTtpQkFDNUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztpQkFDckUsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyx3QkFBd0IsRUFBRTtpQkFDNUIsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQztpQkFDakMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUN0RCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsaUJBQWlCLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzdFLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekYsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2hCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO2dCQUNqRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztvQkFDM0Msb0NBQW9DO29CQUNwQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3ZCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQix3QkFBd0I7SUFDMUIsQ0FBQztJQUVTLHlCQUF5QjtRQUNqQyxJQUFJLEtBQUssR0FBeUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMxRSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNsRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsMkJBQTJCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFUyx5QkFBeUI7UUFDakMsSUFBSSxLQUFLLEdBQXlCLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDMUUsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbEQsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLDJCQUEyQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRVMsd0JBQXdCO1FBQ2hDLE1BQU0sSUFBSSxHQUE2QixJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQzdFLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMxRCxDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVTLHlCQUF5QjtRQUNqQyxJQUFJLEtBQUssR0FBOEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUMvRSxJQUFJLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNsRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsMkJBQTJCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFUyx3Q0FBd0M7UUFDaEQsSUFBSSxPQUFPLEdBQ1QsSUFBSSxDQUFDLHVDQUF1QyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDO1FBQ2xFLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFUywyQkFBMkI7UUFDbkMsSUFBSSxRQUFRLEdBQStCLElBQUksQ0FBQywwQkFBMEIsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM5RixJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNqRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakIsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLDBCQUEwQixFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDbEQsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLDJCQUEyQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLHlCQUF5QixFQUFFO1lBQzlCLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7YUFDdEMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLE9BQU8sS0FBSyxJQUFJLENBQUM7YUFDOUQsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQW1DLENBQUMsQ0FBQyxDQUFDO1FBRTVFLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2pGLE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFUyw0QkFBNEI7UUFDcEMsT0FBTyxJQUFJLENBQUMsd0NBQXdDLEVBQUU7WUFDcEQsRUFBRSxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsUUFBUSxLQUFLLFNBQVMsQ0FBQzthQUNuRSxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ25FLE1BQU0sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxLQUFLLFNBQVMsSUFBSSxPQUFPLEtBQUssSUFBSSxDQUFDO2FBQzlELEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBbUMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFXLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO1lBQ3hCLElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQWtCLEVBQUUsRUFBRTtnQkFDbEUsT0FBTztvQkFDTCxZQUFZLEVBQUUsSUFBSTtvQkFDbEIsUUFBUTtpQkFDVCxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUN2RCxJQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDM0QsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxNQUFNLENBQy9ELENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxLQUFLLFNBQVMsSUFBSSxPQUFPLENBQUMsRUFBRSxLQUFLLElBQUksQ0FDN0QsQ0FBQztZQUNGLElBQUksYUFBYSxHQUFHLElBQUksR0FBRyxFQUEyQixDQUFDO1lBQ3ZELFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDM0IsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3JDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxvQkFBb0IsR0FBb0IsRUFBRSxDQUFDO1lBQy9DLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDaEMsSUFBSSxXQUFXLEdBQWdDLG9CQUFvQixDQUFDO2dCQUNwRSxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztnQkFDeEMsSUFBSSxTQUFTLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO29CQUM5QyxXQUFXLEdBQUcsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDN0MsQ0FBQztnQkFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ2pCLFdBQVcsR0FBRyxvQkFBb0IsQ0FBQztnQkFDckMsQ0FBQztnQkFDRCxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQztZQUUzQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGlCQUFpQixFQUFFLGFBQWEsQ0FBQztpQkFDOUQsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDVCxJQUFJLENBQUMsY0FBYyxFQUFFLGFBQWEsRUFBRSxDQUFDO1lBQ3ZDLENBQUMsQ0FBQztpQkFDRCxLQUFLLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlDLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCLENBQ3BCLFFBQW9DLEVBQ3BDLGlCQUE2QyxFQUM3QyxhQUEyQztRQUUzQyxNQUFNLGFBQWEsR0FBb0IsRUFBRSxDQUFDO1FBRTFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUMzQixPQUFPLENBQUMsY0FBYyxHQUFHLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUcsQ0FBQyxDQUFDO1lBQ3hELGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNwQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxHQUFHO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUN0QyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO1FBQ2xDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFTLENBQUMsQ0FBQztRQUM1RCx1REFBdUQ7UUFDdkQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTyxDQUFDLE1BQXlCLENBQUM7UUFDL0MsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3ZCLHdDQUF3QztZQUN4QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckQsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLFFBQWtCLEVBQUUsT0FBZ0M7UUFDeEUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLEdBQUc7WUFDbkMsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQztRQUNGLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxHQUFXO1FBQ3BDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRUQsNkJBQTZCLENBQUMsR0FBVztRQUN2QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUVTLHVCQUF1QixDQUFDLEtBQStCO1FBQy9ELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDNUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztnQkFDbkIsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHO2dCQUNmLEtBQUssRUFBRSxJQUFJO2dCQUNYLE1BQU0sRUFBRTtvQkFDTixJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUs7aUJBQ2xCO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFUyw2QkFBNkI7UUFDckMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDN0MsaUNBQWlDO1lBQ2pDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDckIsSUFBSSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7b0JBQ3pDLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUNmLElBQUksTUFBTSxDQUFDLGVBQWUsS0FBSyxlQUFlLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQzs0QkFDaEUsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDOUMsQ0FBQzs2QkFBTSxDQUFDOzRCQUNOLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ2pELENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBQ0gseUJBQXlCO1lBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztvQkFDbEQsSUFBSSxJQUFJLEdBQUcsU0FBUyxDQUFDLHdCQUF3Qjt5QkFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7eUJBQy9CLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7b0JBQzdELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNyRCxDQUFDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxpQ0FBaUM7WUFDakMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDbkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNuQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQ25CLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzdDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSx1QkFBdUIsR0FBMkI7WUFDcEQsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixpQkFBaUIsRUFBRSxFQUFFO1NBQ3RCLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMseUJBQXlCLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSx1QkFBdUIsQ0FBQyxDQUNqRCxDQUFDO1FBQ0osQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7UUFFRCxPQUFPLHVCQUF1QixDQUFDO0lBQ2pDLENBQUM7SUFFUyxZQUFZLENBQ3BCLElBQW9DLEVBQ3BDLHVCQUErQztRQUUvQyxJQUFJLG1CQUFtQixHQUFHLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxDQUFDO1FBQ25ELElBQUksbUJBQW1CLEVBQUUsQ0FBQztZQUN4QixtQkFBbUIsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNuRCx1QkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ25ELENBQUM7WUFDRixtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUNwRCx1QkFBdUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQ3BELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixtQkFBbUIsQ0FBQyxRQUFrQjtRQUNwQyxPQUFPO1lBQ0wsV0FBVyxFQUFFLEVBQUU7WUFDZixZQUFZLEVBQUUsRUFBRTtTQUNqQixDQUFDO0lBQ0osQ0FBQztJQUNELFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELFVBQVUsQ0FBQyxRQUFpQjtRQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCLENBQzFCLGVBQWdDLEVBQ2hDLFFBQWlCLEVBQ2pCLE1BQWU7UUFFZixJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzlDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0MsTUFBTSxVQUFVLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN4RCxPQUFPLGVBQWUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsT0FBTyxlQUFlLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sZUFBZSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUU1QyxrQ0FBa0M7WUFDbEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUssRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNGLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsMkJBQTJCLENBQ2hELElBQUksQ0FBQyxJQUFLLEVBQ1YsZUFBZSxFQUNmLEtBQUssRUFDTCxLQUFLLENBQ04sQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO2FBQU0sSUFBSSxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7WUFDOUIsa0NBQWtDO1lBQ2xDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM3QyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQzVGLENBQUM7YUFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ3BCLGtDQUFrQztZQUNsQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDN0MsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFLLEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3hGLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7SUFDSCxDQUFDO0lBRVMsc0JBQXNCLENBQUMsZUFBZ0M7UUFDL0QsSUFBSSxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZCLHVCQUF1QjtZQUN2QixlQUFlLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFDeEUsQ0FBQztJQUNILENBQUM7SUFFRCxzQ0FBc0M7SUFDdEMsNkJBQTZCO0lBQzdCLHVCQUF1QjtJQUN2QixtQ0FBbUM7SUFDbkMsa0JBQWtCO0lBQ2xCLHVDQUF1QztJQUN2QyxPQUFPO0lBQ1AsZ0VBQWdFO0lBQ2hFLElBQUk7SUFFSixtQ0FBbUMsQ0FDakMsUUFBa0IsRUFDbEIsZUFBZ0M7UUFFaEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFDRCxZQUFZO0lBRVo7O09BRUc7SUFDSSxXQUFXLENBQUMsUUFBaUI7UUFDbEMsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2pELElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ2pDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVNLE9BQU8sQ0FDWixTQUFvQixFQUNwQixPQUFvQixFQUNwQixnQkFBMEIsRUFDMUIsa0JBQXVDO1FBRXZDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQzVCLFNBQVMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUNqRCxTQUFTLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1FBQ3JFLFNBQVMsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQzlCLFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRWhELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGNBQWMsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLElBQUksQ0FBQyxnREFBZ0QsU0FBUyxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDNUYsQ0FBQztRQUVELElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztZQUMzQixPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDeEIsQ0FBQztRQUVELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTSxPQUFPLENBQ1osV0FBbUIsRUFDbkIsU0FBb0IsRUFDcEIsa0JBQXVDO1FBRXZDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDeEQsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFFRCxvREFBb0Q7UUFDcEQsNENBQTRDO1FBRTVDLGdEQUFnRDtRQUNoRCx1Q0FBdUM7UUFDdkMsOERBQThEO1FBQzlELDhDQUE4QztRQUM5QyxVQUFVO1FBQ1YsSUFBSTtRQUVKLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTSxnQkFBZ0IsQ0FBQyxNQUFjO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVNLGlCQUFpQixDQUFDLE1BQWM7UUFDckMsTUFBTSxXQUFXLEdBQUcsSUFBSSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDckYsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDeEMsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRU0sZUFBZSxDQUNwQixZQUFvQixFQUNwQixXQUFzQixFQUN0QixTQUFrQixFQUNsQixVQUFvQjtRQUVwQixPQUFPO1lBQ0wsWUFBWTtZQUNaLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLFdBQVc7WUFDWCxVQUFVO1lBQ1YsU0FBUztTQUNWLENBQUM7SUFDSixDQUFDO0lBRUQseUJBQXlCO0lBQ2pCLGtCQUFrQixDQUFDLFdBQXFDO1FBQzlELElBQUksVUFBc0IsQ0FBQztRQUMzQixJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDbEMsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0MsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsVUFBVSxHQUFHO2dCQUNYLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLFNBQVM7Z0JBQ3JGLE1BQU07Z0JBQ04sTUFBTSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3hDLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLFVBQVUsR0FBRztnQkFDWCxJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxTQUFTO2dCQUNyRixNQUFNLEVBQUUsV0FBVyxDQUFDLEdBQUc7Z0JBQ3ZCLE1BQU0sRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDL0MsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFUyxhQUFhLENBQUMsTUFBNEI7UUFDbEQsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUMvQixlQUFlO2dCQUNmLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDbEQsQ0FBQztZQUVELElBQUksdUJBQXVCLEdBQUcsS0FBSyxDQUFDO1lBQ3BDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNuQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUMvQixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQWlCLEVBQUUsRUFBRTtvQkFDN0MsSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7d0JBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQzVDLENBQUM7eUJBQU0sSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7d0JBQ25FLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7b0JBQzlDLENBQUM7eUJBQU0sSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQzt3QkFDNUUsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDdkQsQ0FBQzt5QkFBTSxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQzt3QkFDdkUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDaEQsQ0FBQzt5QkFBTSxJQUFJLFNBQVMsS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDbkMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDOUMsQ0FBQzt5QkFBTSxJQUFJLFNBQVMsS0FBSyxhQUFhLEVBQUUsQ0FBQzt3QkFDdkMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztvQkFDbEQsQ0FBQzt5QkFBTSxJQUFJLFNBQVMsS0FBSyxFQUFFLEVBQUUsQ0FBQzt3QkFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFtQixDQUFDO3dCQUMzQyx1QkFBdUIsR0FBRyxJQUFJLENBQUM7b0JBQ2pDLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7b0JBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzFCLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQXVCLENBQUM7UUFDOUMsQ0FBQztRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUQsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBdUIsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVTLG1CQUFtQixDQUFDLGNBQXdCLEVBQUUsV0FBb0IsS0FBSztRQUMvRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVcsRUFBRSxFQUFFO1lBQ3JDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFbkMsSUFBSSxTQUFTLFlBQVksa0JBQWtCLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2QsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUN0QixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxJQUFJLFNBQVMsWUFBWSx1QkFBdUIsRUFBRSxDQUFDO2dCQUN4RCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2QsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN6QixDQUFDO1lBQ0gsQ0FBQztpQkFBTSxJQUFJLFNBQVMsWUFBWSxpQ0FBaUMsRUFBRSxDQUFDO2dCQUNsRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ3BDLDREQUE0RDtnQkFDNUQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDekIsR0FBRztZQUNMLENBQUM7aUJBQU0sSUFBSSxTQUFTLFlBQVksaUJBQWlCLEVBQUUsQ0FBQztnQkFDbEQsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ25CLENBQUM7aUJBQU0sSUFBSSxDQUFDLFFBQVEsSUFBSSxTQUFTLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2hELE9BQU8sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztZQUMvRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sY0FBYyxDQUFDLEtBQVUsRUFBRSxHQUFXLEVBQUUsS0FBVTtRQUN4RCxJQUFJLFlBQVksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWxDLElBQUksU0FBUyxHQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsSUFBSSxTQUFjLENBQUM7UUFFbkIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUN6RCxTQUFTLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTdCLElBQ0UsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssUUFBUTtnQkFDbEQsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssU0FBUztnQkFDbkQsT0FBTyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssUUFBUTtnQkFDbEQsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFDNUMsQ0FBQztnQkFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pELENBQUM7WUFFRCxJQUFJLEtBQUssS0FBSyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxJQUFJLFFBQVEsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLDZGQUE2RjtnQkFDN0YsSUFBSSxLQUFLLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxLQUFLLElBQUksSUFBSSxRQUFRLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FBQztvQkFDbEUsU0FBUyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztnQkFDekMsQ0FBQztnQkFDRCxNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsT0FBK0IsRUFBRSxTQUFpQjtRQUN6RSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBRS9ELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDdEUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLGFBQTZDLEVBQUUsR0FBVyxFQUFFLEVBQUU7Z0JBQ3RGLElBQUksYUFBYSxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUNoQyxPQUFPLENBQUMsS0FBSyxDQUFDLCtCQUErQixHQUFHLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3BFLENBQUM7cUJBQU0sQ0FBQztvQkFDTixhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzFCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsT0FBK0IsRUFBRSxTQUFpQjtRQUMzRSxJQUFJLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxLQUFNLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRU8sMkJBQTJCLENBQUMsT0FBK0IsRUFBRSxTQUFpQjtRQUNwRixJQUFJLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLElBQUksZ0JBQWdCLEdBQThCLElBQUksQ0FBQyxLQUFNLENBQUMsZ0JBRTdELENBQUM7UUFDRixnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVPLG9CQUFvQixDQUFDLE9BQStCLEVBQUUsU0FBaUI7UUFDN0UsSUFBSSxXQUFXLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsS0FBTSxDQUFDLFNBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVPLGtCQUFrQixDQUFDLE9BQStCLEVBQUUsU0FBaUI7UUFDM0UsSUFBSSxDQUFDLEtBQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU8sc0JBQXNCLENBQUMsT0FBK0IsRUFBRSxTQUFpQjtRQUMvRSxJQUFJLENBQUMsS0FBTSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0MsQ0FBQztDQUdGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIEVsZW1lbnRSZWYsIEluamVjdG9yLCBRdWVyeUxpc3QsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge1xyXG4gIFNtYXJ0Q29tcG9uZW50TGF5b3V0Q29tcG9uZW50LFxyXG4gIFNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eSxcclxufSBmcm9tICcuLi9zbWFydC1jb21wb25lbnQtbGF5b3V0L3Byb2plY3RzJztcclxuaW1wb3J0IHsgU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vc21hcnQtZmlsdGVyLWVkaXRvci9wcm9qZWN0JztcclxuaW1wb3J0IHtcclxuICBTbWFydEZvcm0sXHJcbiAgU21hcnRGb3JtSW52YWxpZEZpZWxkcyxcclxuICBTbWFydGZvcm1Db21wb25lbnQsXHJcbiAgU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlLFxyXG4gIFZhbHVlQ2hhbmdlTW9kZSxcclxufSBmcm9tICcuLi9zbWFydC1mb3JtL3Byb2plY3RzJztcclxuaW1wb3J0IHsgR3JpZE9wdGlvbnMsIFNtYXJ0R3JpZCwgU21hcnRHcmlkQ29tcG9uZW50IH0gZnJvbSAnLi4vc21hcnQtZ3JpZC9wcm9qZWN0cyc7XHJcbmltcG9ydCB7IFNtYXJ0TWFwQ29tcG9uZW50IH0gZnJvbSAnLi4vc21hcnQtbWFwL3NtYXJ0LW1hcC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTbWFydFN1YmplY3QgfSBmcm9tICcuLi9zbWFydC1zdWJqZWN0L3Byb2plY3RzJztcclxuaW1wb3J0IHsgU21hcnR0cmVlR2VuZXJpY1NlcnZpY2UgfSBmcm9tICcuLi9zbWFydC10cmVlL3Byb2plY3RzJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnRNb2RlbCxcclxuICBDb21wb25lbnRNb2RlbENoYW5nZSxcclxuICBEYXRhQ2hhbmdlLFxyXG4gIERhdGFDaGFuZ2VLaW5kLFxyXG4gIEV4ZWN1dGVVaUFjdGlvbk9wdGlvbnMsXHJcbiAgU21hcnRUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gIFNtYXJ0Vmlld0NvbnRleHRTZXJ2aWNlLFxyXG4gIFVpQWN0aW9uLFxyXG4gIFVpQWN0aW9uQWRkaXRpb25hbFBhcmFtcyxcclxuICBVaUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlLFxyXG4gIFVpQWN0aW9uTW9kZWwsXHJcbiAgVWlBY3Rpb25SZXF1ZXN0LFxyXG4gIFVpQWN0aW9uU2VydmljZSxcclxuICBVaUFjdGlvblNwZWNpZmljRGVtYW5kUmVzcG9uc2UsXHJcbiAgVWlBY3Rpb25Ub29sYmFyQ29tcG9uZW50LFxyXG4gIFVzZVVpQWN0aW9uMixcclxufSBmcm9tICcuLi92aWV3LWNvbnRleHQvcHJvamVjdHMnO1xyXG5pbXBvcnQgeyBTbWFydFN0eWxlVXRpbGl0eSB9IGZyb20gJy4uL3ZpZXctY29udGV4dC91dGlsaXR5L3NtYXJ0LXN0eWxlLXV0aWxpdHknO1xyXG5pbXBvcnQgeyBTbWFydEF1dGhlbnRpY2F0aW9uU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4vc21hcnQtYXV0aGVudGljYXRpb24uc2VydmljZSc7XHJcblxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU21hcnRDb21wb25lbnRBcGlDbGllbnQ8VD4gaW1wbGVtZW50cyBVc2VVaUFjdGlvbjIge1xyXG4gIHByb3RlY3RlZCBfZGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBwcml2YXRlIGRldGVjdENoYW5nZTogU21hcnRTdWJqZWN0PENvbXBvbmVudE1vZGVsQ2hhbmdlPiA9IG5ldyBTbWFydFN1YmplY3QodGhpcy5fZGVzdHJveSQpO1xyXG5cclxuICBwcml2YXRlIF91dWlkPzogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIHV1aWRPZlBhZ2VIYXNCZWVuQ2hhbmdlZFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgcHJvdGVjdGVkIGNvbXBvbmVudE1vZGVsTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGdldCB1dWlkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fdXVpZDtcclxuICB9XHJcbiAgc2V0IHV1aWQodXVpZDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodGhpcy5fdXVpZCA9PT0gdXVpZCkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBsZXQgZmlyc3RVdWlkOiBib29sZWFuID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLnV1aWQpIHtcclxuICAgICAgdGhpcy52aWV3Q29udGV4dC51bmZvbGxvdyh0aGlzLnV1aWQpO1xyXG4gICAgICBmaXJzdFV1aWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuX3V1aWQgPSB1dWlkO1xyXG4gICAgdGhpcy5nZXRXaWRnZXRzKCkuZm9yRWFjaCgocmVmLCBrZXkpID0+IHtcclxuICAgICAgaWYgKHJlZiBpbnN0YW5jZW9mIFNtYXJ0R3JpZENvbXBvbmVudCkge1xyXG4gICAgICAgIHJlZi51dWlkID0gdGhpcy5jb21wb25lbnRNb2RlbExvYWRlZCA/IHV1aWQgOiB1bmRlZmluZWQ7XHJcbiAgICAgIH0gZWxzZSBpZiAocmVmIGluc3RhbmNlb2YgU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50KSB7XHJcbiAgICAgICAgcmVmLnNlcnZpY2UuY29uZmlnLnV1aWQgPSB0aGlzLmNvbXBvbmVudE1vZGVsTG9hZGVkID8gdXVpZCA6IHVuZGVmaW5lZDtcclxuICAgICAgfSBlbHNlIGlmICghcmVmICYmICFmaXJzdFV1aWQpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGBQcm92aWRlZCByZWZlcmVuY2UgZm9yICR7a2V5fSBpcyB1bmRlZmluZWQgb24gdXVpZCBjaGFuZ2UuYCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgaWYgKCF0aGlzLnV1aWRPZlBhZ2VIYXNCZWVuQ2hhbmdlZFN1YnNjcmlwdGlvbikge1xyXG4gICAgICB0aGlzLnV1aWRPZlBhZ2VIYXNCZWVuQ2hhbmdlZFN1YnNjcmlwdGlvbiA9IHRoaXMudmlld0NvbnRleHQudXVpZE9mUGFnZUhhc0JlZW5DaGFuZ2VkXHJcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChwYWdlTmFtZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKHBhZ2VOYW1lID09PSB0aGlzLnBhZ2VOYW1lISkge1xyXG4gICAgICAgICAgICB0aGlzLnJ1bigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHV1aWQpIHtcclxuICAgICAgdGhpcy52aWV3Q29udGV4dC5mb2xsb3codGhpcy5fdXVpZCEsIHRoaXMuZGV0ZWN0Q2hhbmdlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX21vZGVsOiBDb21wb25lbnRNb2RlbCB8IHVuZGVmaW5lZDtcclxuXHJcbiAgZ2V0IG1vZGVsKCk6IENvbXBvbmVudE1vZGVsIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9tb2RlbDtcclxuICB9XHJcbiAgc2V0IG1vZGVsKG1vZGVsOiBDb21wb25lbnRNb2RlbCB8IHVuZGVmaW5lZCkge1xyXG4gICAgdGhpcy5fbW9kZWwgPSBtb2RlbDtcclxuXHJcbiAgICB0aGlzLmluaXRDb21wb25lbnRCeU1vZGVsKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kYXRhPzogVDtcclxuXHJcbiAgZ2V0IGRhdGEoKTogVCB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0YTtcclxuICB9XHJcbiAgc2V0IGRhdGEobW9kZWw6IFQgfCB1bmRlZmluZWQpIHtcclxuICAgIHRoaXMuX2RhdGEgPSBtb2RlbDtcclxuICAgIHRoaXMuZGF0YUNoYW5nZWQubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVpQWN0aW9uTW9kZWxzOiBVaUFjdGlvbk1vZGVsW10gPSBbXTtcclxuXHJcbiAgcHVibGljIGRhdGFDaGFuZ2VkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFNtYXJ0U3ViamVjdCh0aGlzLl9kZXN0cm95JCk7XHJcblxyXG4gIC8vIEdyaWRcclxuICBzbWFydEdyaWQ/OiBTbWFydEdyaWQ7XHJcblxyXG4gIC8vIFNlcnZpY2VzXHJcbiAgcHJvdGVjdGVkIHZpZXdDb250ZXh0OiBTbWFydFZpZXdDb250ZXh0U2VydmljZTtcclxuICBwcm90ZWN0ZWQgdWlBY3Rpb25TZXJ2aWNlOiBVaUFjdGlvblNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2U6IFVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHRyYW5zbGF0ZT86IFNtYXJ0VHJhbnNsYXRlU2VydmljZTtcclxuXHJcbiAgLy8gVHJlZVxyXG4gIHByaXZhdGUgX3NtYXJ0VHJlZVNlcnZpY2U/OiBTbWFydHRyZWVHZW5lcmljU2VydmljZTtcclxuXHJcbiAgcHVibGljIGdldCBzbWFydFRyZWVTZXJ2aWNlKCk6IFNtYXJ0dHJlZUdlbmVyaWNTZXJ2aWNlIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl9zbWFydFRyZWVTZXJ2aWNlO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHNtYXJ0VHJlZVNlcnZpY2Uoc21hcnRUcmVlU2VydmljZTogU21hcnR0cmVlR2VuZXJpY1NlcnZpY2UgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICh0aGlzLl9zbWFydFRyZWVTZXJ2aWNlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgRXJyb3IoJ1RoZSBkZWZhdWx0IHRyZWUgaGFzIGFscmVhZHkgc2V0IHVwIScpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fc21hcnRUcmVlU2VydmljZSA9IHNtYXJ0VHJlZVNlcnZpY2U7XHJcbiAgfVxyXG5cclxuICAvLyBDb250YWluZWQgV2lkZ2V0c1xyXG4gIHdpZGdldHM6IE1hcDxcclxuICAgIHN0cmluZyxcclxuICAgIFNtYXJ0R3JpZENvbXBvbmVudCB8IFNtYXJ0dHJlZUdlbmVyaWNTZXJ2aWNlIHwgU21hcnRNYXBDb21wb25lbnQgfCB1bmRlZmluZWRcclxuICA+ID0gbmV3IE1hcCgpO1xyXG5cclxuICBmb3JtV2lkZ2V0czogTWFwPHN0cmluZywgU21hcnRmb3JtQ29tcG9uZW50IHwgdW5kZWZpbmVkPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgdXNlUXVlcnlMaXN0czogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBzZW5kTW9kZWxPbldpZGdldEFjdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBkYXRhQ2hhbmdlS2V5czogc3RyaW5nW10gPSBbXTtcclxuICBwcm90ZWN0ZWQgZGF0YUNoYW5nZUFjdGlvbkhhbmRsZXJzID0gbmV3IE1hcDxTbWFydGZvcm1Db21wb25lbnQsIFN1YnNjcmlwdGlvbj4oKTtcclxuXHJcbiAgcHJvdGVjdGVkIGZpbHRlck1vZGVsQ2hhbmdlU3ViamVjdHMgPSBuZXcgTWFwPHN0cmluZywgU3ViamVjdDx2b2lkPj4oKTtcclxuXHJcbiAgcHJvdGVjdGVkIGNoYW5nZURldGVjdG9yPzogQ2hhbmdlRGV0ZWN0b3JSZWY7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJvdGVjdGVkIGluamVjdDogSW5qZWN0b3IsXHJcbiAgICBwcm90ZWN0ZWQgYXV0aDogU21hcnRBdXRoZW50aWNhdGlvblNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBwcm90ZWN0ZWQgcGFnZU5hbWU/OiBzdHJpbmcsXHJcbiAgICBwcm90ZWN0ZWQgX2NvbXBvbmVudE5hbWU/OiBzdHJpbmcsXHJcbiAgICBwcm90ZWN0ZWQgZWxlbWVudD86IEVsZW1lbnRSZWYsXHJcbiAgICBwcm90ZWN0ZWQgcmVuZGVyZXI/OiBSZW5kZXJlcjJcclxuICApIHtcclxuICAgIC8vIGNoZWNrIGFuZCBjYWxjdWxhdGUgcGFnZU5hbWVcclxuICAgIGlmICghdGhpcy5wYWdlTmFtZSAmJiAhdGhpcy5fY29tcG9uZW50TmFtZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3BhZ2VOYW1lIG9yIGNvbXBvbmVudE5hbWUgbXVzdCBiZSBzcGVjaWZpZWQhJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy52aWV3Q29udGV4dCA9IGluamVjdC5nZXQoU21hcnRWaWV3Q29udGV4dFNlcnZpY2UpO1xyXG4gICAgaWYgKHRoaXMuX2NvbXBvbmVudE5hbWUpIHtcclxuICAgICAgbGV0IHBhZ2VOYW1lRm9yQ29tcG9uZW50ID0gdGhpcy52aWV3Q29udGV4dC5nZXRQYWdlTmFtZU9mQ29tcG9uZW50KHRoaXMuX2NvbXBvbmVudE5hbWUpO1xyXG4gICAgICBpZiAoIXRoaXMucGFnZU5hbWUpIHtcclxuICAgICAgICB0aGlzLnBhZ2VOYW1lID0gcGFnZU5hbWVGb3JDb21wb25lbnQ7XHJcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wYWdlTmFtZSAhPT0gcGFnZU5hbWVGb3JDb21wb25lbnQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXHJcbiAgICAgICAgICBgcGFnZU5hbWUgKCR7cGFnZU5hbWV9KSBhbmQgY29tcG9uZW50TmFtZSAoJHtfY29tcG9uZW50TmFtZX0pIGRvZXNuJ3QgbWF0Y2ghYFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIGZyb20gdGhpcyBwb2ludCB3ZSBoYXZlIHRoaXMucGFnZU5hbWVcclxuICAgIHRoaXMuZGV0ZWN0Q2hhbmdlLnN1YnNjcmliZSgoY2hhbmdlOiBDb21wb25lbnRNb2RlbENoYW5nZSkgPT4ge1xyXG4gICAgICB0aGlzLmhhbmRsZUNoYW5nZXMoY2hhbmdlKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMudWlBY3Rpb25TZXJ2aWNlID0gaW5qZWN0LmdldChVaUFjdGlvblNlcnZpY2UpO1xyXG4gICAgdGhpcy51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlID0gaW5qZWN0LmdldChVaUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlKTtcclxuICB9XHJcblxyXG4gIF9uZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMucnVuKCk7XHJcbiAgfVxyXG4gIF9uZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudmlld0NvbnRleHQudW5mb2xsb3codGhpcy51dWlkISk7XHJcbiAgICB0aGlzLndpZGdldHMuY2xlYXIoKTtcclxuICAgIHRoaXMuZm9ybVdpZGdldHMuY2xlYXIoKTtcclxuICAgIHRoaXMuZGF0YUNoYW5nZUFjdGlvbkhhbmRsZXJzLmNsZWFyKCk7XHJcbiAgICB0aGlzLmZpbHRlck1vZGVsQ2hhbmdlU3ViamVjdHMuY2xlYXIoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBfbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvciA9IHRoaXMuaW5qZWN0LmdldChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgICBpZiAodGhpcy51c2VRdWVyeUxpc3RzKSB7XHJcbiAgICAgIGlmICghdGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdTbWFydENvbXBvbmVudExheW91dHNRTCBub3QgYXZhaWxhYmxlIScpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlUXVlcnlMaXN0KHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKSEsIChjb21wKSA9PiB7XHJcbiAgICAgICAgICBpZiAoY29tcC5zbWFydENvbXBvbmVudExheW91dCkge1xyXG4gICAgICAgICAgICB0aGlzLmluaXRBY3Rpb25zKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodGhpcy51dWlkICYmIHRoaXMudXVpZCAhPT0gY29tcC51dWlkKSBjb21wLnV1aWQgPSB0aGlzLnV1aWQ7XHJcbiAgICAgICAgICBTbWFydENvbXBvbmVudExheW91dFV0aWxpdHkuZ2V0R3JpZHMoY29tcCkuZm9yRWFjaCgoZ3JpZCkgPT5cclxuICAgICAgICAgICAgdGhpcy5zZXR1cEdyaWRTZXJ2aWNlcyhncmlkKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICAvLyBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgZm9ybXNcclxuICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5TGlzdCh0aGlzLmdldFNtYXJ0Q29tcG9uZW50TGF5b3V0c1FMKCkhLCAoZm9ybSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5oYW5kbGVEYXRhQ2hhbmdlU3Vic2NyaXB0aW9ucygpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy5nZXRTbWFydEZvcm1zUUwoKSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignZ2V0U21hcnRGb3Jtc1FMIG5vdCBhdmFpbGFibGUhJyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVRdWVyeUxpc3QodGhpcy5nZXRTbWFydEZvcm1zUUwoKSEsIChmb3JtKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmhhbmRsZURhdGFDaGFuZ2VTdWJzY3JpcHRpb25zKCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmdldFNtYXJ0R3JpZHNRTCgpKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdTbWFydEdyaWRzUUwgbm90IGF2YWlsYWJsZSEnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5TGlzdCh0aGlzLmdldFNtYXJ0R3JpZHNRTCgpISwgKGdyaWQpID0+IHtcclxuICAgICAgICAgIGlmIChncmlkKSB7XHJcbiAgICAgICAgICAgIGlmIChncmlkLnNtYXJ0R3JpZCkge1xyXG4gICAgICAgICAgICAgIHRoaXMuc2V0dXBHcmlkU2VydmljZXMoZ3JpZCk7XHJcbiAgICAgICAgICAgICAgZ3JpZC5zZXR1cFRvb2xiYXIoKTtcclxuICAgICAgICAgICAgICBpZiAoZ3JpZC50b29sYmFyKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRBY3Rpb25zKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnV1aWQgJiYgdGhpcy51dWlkICE9PSBncmlkLnV1aWQpIHtcclxuICAgICAgICAgICAgICBncmlkLnV1aWQgPSB0aGlzLnV1aWQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCF0aGlzLmdldFNtYXJ0TWFwUUwoKSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignU21hcnRNYXBzUUwgaXMgbm90IGF2YWlsYWJsZSEnKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmhhbmRsZVF1ZXJ5TGlzdCh0aGlzLmdldFNtYXJ0TWFwUUwoKSEsIChtYXApID0+IHtcclxuICAgICAgICAgIG1hcC52aWV3Q29udGV4dFNlcnZpY2UgPSB0aGlzLnZpZXdDb250ZXh0O1xyXG4gICAgICAgICAgaWYgKHRoaXMudXVpZCAmJiB0aGlzLnV1aWQgIT09IG1hcC51dWlkKSB7XHJcbiAgICAgICAgICAgIG1hcC51dWlkID0gdGhpcy51dWlkO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghdGhpcy5nZXRTbWFydEZpbHRlckVkaXRvckNvbnRlbnRDb21wb25lbnRzUUwoKSkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50c1FMIG5vdCBhdmFpbGFibGUhJyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVRdWVyeUxpc3QodGhpcy5nZXRTbWFydEZpbHRlckVkaXRvckNvbnRlbnRDb21wb25lbnRzUUwoKSEsIChmaWx0ZXJDb21wKSA9PiB7XHJcbiAgICAgICAgICBpZiAoZmlsdGVyQ29tcCkge1xyXG4gICAgICAgICAgICBpZiAoZmlsdGVyQ29tcC5zZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5zZXR1cEZpbHRlclNlcnZpY2VzKGZpbHRlckNvbXApO1xyXG4gICAgICAgICAgICAgIGxldCBzZXJ2aWNlID0gZmlsdGVyQ29tcC5zZXJ2aWNlO1xyXG4gICAgICAgICAgICAgIGxldCBpZGVudGlmaWVyID0gc2VydmljZS5jb25maWcuaWRlbnRpZmllcjtcclxuICAgICAgICAgICAgICBpZiAoaWRlbnRpZmllciAmJiAhdGhpcy5maWx0ZXJNb2RlbENoYW5nZVN1YmplY3RzLmhhcyhpZGVudGlmaWVyKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJNb2RlbENoYW5nZVN1YmplY3RzLnNldChpZGVudGlmaWVyLCBzZXJ2aWNlLm1vZGVsQ2hhbmdlZCk7XHJcbiAgICAgICAgICAgICAgICBzZXJ2aWNlLm1vZGVsQ2hhbmdlZC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmdldEFsbEZpbHRlclVpQWN0aW9uVG9vbGJhcnMoKS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0QWN0aW9ucygpO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEdyaWRTZXJ2aWNlcyhncmlkOiBTbWFydEdyaWRDb21wb25lbnQpIHtcclxuICAgIGlmIChncmlkLnNtYXJ0R3JpZCkge1xyXG4gICAgICBpZiAoIWdyaWQuc21hcnRHcmlkLnVpQWN0aW9uU2VydmljZSkge1xyXG4gICAgICAgIGdyaWQuc21hcnRHcmlkLnVpQWN0aW9uU2VydmljZSA9IHRoaXMudWlBY3Rpb25TZXJ2aWNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZ3JpZC5zbWFydEdyaWQudWlBY3Rpb25EZXNjcmlwdG9yU2VydmljZSkge1xyXG4gICAgICAgIGdyaWQuc21hcnRHcmlkLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2UgPSB0aGlzLnVpQWN0aW9uRGVzY3JpcHRvclNlcnZpY2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFncmlkLnNtYXJ0R3JpZC5zZXJ2aWNlVG9Vc2UpIHtcclxuICAgICAgICBncmlkLnNtYXJ0R3JpZC5zZXJ2aWNlVG9Vc2UgPSB0aGlzO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghZ3JpZC5zbWFydEdyaWQudmlld0NvbnRleHRTZXJ2aWNlKSB7XHJcbiAgICAgICAgZ3JpZC5zbWFydEdyaWQudmlld0NvbnRleHRTZXJ2aWNlID0gdGhpcy52aWV3Q29udGV4dDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXR1cEZpbHRlclNlcnZpY2VzKGZpbHRlckNvbXA6IFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudCkge1xyXG4gICAgaWYgKGZpbHRlckNvbXAuc2VydmljZSkge1xyXG4gICAgICBsZXQgc2VydmljZSA9IGZpbHRlckNvbXAuc2VydmljZTtcclxuICAgICAgaWYgKHRoaXMudXVpZCAmJiB0aGlzLnV1aWQgIT09IHNlcnZpY2UuY29uZmlnLnV1aWQpIHtcclxuICAgICAgICBzZXJ2aWNlLmNvbmZpZy51dWlkID0gdGhpcy51dWlkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaGFuZGxlUXVlcnlMaXN0U2ltcGxlPFQ+KHFsOiBRdWVyeUxpc3Q8VD4sIGhhbmRsZXI6ICgpID0+IHZvaWQpIHtcclxuICAgIGhhbmRsZXIoKTtcclxuICAgIHFsLmNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4gaGFuZGxlcigpKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBoYW5kbGVRdWVyeUxpc3Q8VD4ocWw6IFF1ZXJ5TGlzdDxUPiwgaGFuZGxlcjogKGVsOiBUKSA9PiB2b2lkKSB7XHJcbiAgICBxbC5mb3JFYWNoKChlbCkgPT4gaGFuZGxlcihlbCkpO1xyXG4gICAgcWwuY2hhbmdlc1xyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxyXG4gICAgICAuc3Vic2NyaWJlKChsaXN0KSA9PiAobGlzdCBhcyBRdWVyeUxpc3Q8VD4pLmZvckVhY2goKGVsKSA9PiBoYW5kbGVyKGVsKSkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFNtYXJ0Rm9ybXNRTCgpOiBRdWVyeUxpc3Q8U21hcnRmb3JtQ29tcG9uZW50PiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFNtYXJ0R3JpZHNRTCgpOiBRdWVyeUxpc3Q8U21hcnRHcmlkQ29tcG9uZW50PiB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFNtYXJ0VHJlZXNRTCgpOiBRdWVyeUxpc3Q8U21hcnR0cmVlR2VuZXJpY1NlcnZpY2U+IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50c1FMKCk6XHJcbiAgICB8IFF1ZXJ5TGlzdDxTbWFydEZpbHRlckVkaXRvckNvbnRlbnRDb21wb25lbnQ+XHJcbiAgICB8IHVuZGVmaW5lZDtcclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGdldFNtYXJ0VWlBY3Rpb25Ub29sYmFyc1FMKCk6IFF1ZXJ5TGlzdDxVaUFjdGlvblRvb2xiYXJDb21wb25lbnQ+IHwgdW5kZWZpbmVkO1xyXG5cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKTpcclxuICAgIHwgUXVlcnlMaXN0PFNtYXJ0Q29tcG9uZW50TGF5b3V0Q29tcG9uZW50PlxyXG4gICAgfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBnZXRTbWFydE1hcFFMKCk6IFF1ZXJ5TGlzdDxTbWFydE1hcENvbXBvbmVudD4gfCB1bmRlZmluZWQ7XHJcblxyXG4gIHByb3RlY3RlZCBnZXRXaWRnZXRzKCk6IE1hcDxcclxuICAgIHN0cmluZyxcclxuICAgIHwgU21hcnRHcmlkQ29tcG9uZW50XHJcbiAgICB8IFNtYXJ0dHJlZUdlbmVyaWNTZXJ2aWNlXHJcbiAgICB8IFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudFxyXG4gICAgfCBTbWFydE1hcENvbXBvbmVudFxyXG4gICAgfCB1bmRlZmluZWRcclxuICA+IHtcclxuICAgIGlmICh0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcclxuICAgICAgbGV0IHdpZGdldHM6IE1hcDxcclxuICAgICAgICBzdHJpbmcsXHJcbiAgICAgICAgfCBTbWFydEdyaWRDb21wb25lbnRcclxuICAgICAgICB8IFNtYXJ0dHJlZUdlbmVyaWNTZXJ2aWNlXHJcbiAgICAgICAgfCBTbWFydEZpbHRlckVkaXRvckNvbnRlbnRDb21wb25lbnRcclxuICAgICAgICB8IFNtYXJ0TWFwQ29tcG9uZW50XHJcbiAgICAgICAgfCB1bmRlZmluZWRcclxuICAgICAgPiA9IG5ldyBNYXAoKTtcclxuICAgICAgdGhpcy5nZXRBbGxTbWFydEdyaWRDb21wb25lbnRzKClcclxuICAgICAgICAuZmlsdGVyKChncmlkKSA9PiAoZ3JpZD8uc21hcnRHcmlkPy5ncmlkSWRlbnRpZmllciA/IHRydWUgOiBmYWxzZSkpXHJcbiAgICAgICAgLmZvckVhY2goKGdyaWQpID0+IHdpZGdldHMuc2V0KGdyaWQuc21hcnRHcmlkIS5ncmlkSWRlbnRpZmllciwgZ3JpZCkpO1xyXG4gICAgICB0aGlzLmdldEFsbFNtYXJ0VHJlZUNvbXBvbmVudHMoKVxyXG4gICAgICAgIC5maWx0ZXIoKHRyZWUpID0+ICh0cmVlPy5zbWFydFRyZWVNb2RlbD8uaWRlbnRpZmllciA/IHRydWUgOiBmYWxzZSkpXHJcbiAgICAgICAgLmZvckVhY2goKHRyZWUpID0+IHdpZGdldHMuc2V0KHRyZWUhLnNtYXJ0VHJlZU1vZGVsIS5pZGVudGlmaWVyISwgdHJlZSkpO1xyXG4gICAgICB0aGlzLmdldEFsbFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudHMoKVxyXG4gICAgICAgIC5maWx0ZXIoKGZpbHRlcikgPT4gKGZpbHRlci5zZXJ2aWNlLmNvbmZpZy5pZGVudGlmaWVyID8gdHJ1ZSA6IGZhbHNlKSlcclxuICAgICAgICAuZm9yRWFjaCgoZmlsdGVyKSA9PiB3aWRnZXRzLnNldChmaWx0ZXIuc2VydmljZS5jb25maWcuaWRlbnRpZmllciwgZmlsdGVyKSk7XHJcbiAgICAgIHRoaXMuZ2V0QWxsU21hcnRNYXBDb21wb25lbnRzKClcclxuICAgICAgICAuZmlsdGVyKChtYXApID0+ICEhbWFwLmlkZW50aWZpZXIpXHJcbiAgICAgICAgLmZvckVhY2goKG1hcCkgPT4gd2lkZ2V0cy5zZXQobWFwLmlkZW50aWZpZXIsIG1hcCkpO1xyXG4gICAgICByZXR1cm4gd2lkZ2V0cztcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLndpZGdldHM7XHJcbiAgfVxyXG5cclxuICBpbml0Q29tcG9uZW50QnlNb2RlbCgpOiB2b2lkIHtcclxuICAgIFNtYXJ0U3R5bGVVdGlsaXR5LmFwcGx5U3R5bGUodGhpcy5tb2RlbD8uc3R5bGUsIHRoaXMuZWxlbWVudCwgdGhpcy5yZW5kZXJlcik7XHJcbiAgICBTbWFydFN0eWxlVXRpbGl0eS5hcHBseVN0eWxlKHRoaXMubW9kZWw/LnBhcmVudFN0eWxlLCB0aGlzLmVsZW1lbnQsIHRoaXMucmVuZGVyZXIsIHRydWUpO1xyXG4gICAgdGhpcy5pbml0RGF0YSgpO1xyXG4gICAgaWYgKHRoaXMudXNlUXVlcnlMaXN0cykge1xyXG4gICAgICB0aGlzLmdldEFsbFNtYXJ0Rm9ybUNvbXBvbmVudHMoKT8uZm9yRWFjaCgoZm9ybSkgPT4ge1xyXG4gICAgICAgIGlmIChmb3JtLnNtYXJ0Rm9ybSkge1xyXG4gICAgICAgICAgZm9ybS5zbWFydEZvcm0uY29tcG9uZW50TW9kZWwgPSB0aGlzLm1vZGVsO1xyXG4gICAgICAgICAgLy8gdXNlcyBkYXRhLCB2YWx1ZVNldHMsIGNvbnN0cmFpbnRzXHJcbiAgICAgICAgICBmb3JtLmNvbnN0cnVjdEZvcm0oKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvcj8uZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgdGhpcy5pbml0QWN0aW9ucygpO1xyXG4gICAgLy8gVE9ETzogbGF5b3V0LCB3aWRnZXRzXHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0QWxsU21hcnRGb3JtQ29tcG9uZW50cygpOiBTbWFydGZvcm1Db21wb25lbnRbXSB7XHJcbiAgICBsZXQgZm9ybXM6IFNtYXJ0Zm9ybUNvbXBvbmVudFtdID0gdGhpcy5nZXRTbWFydEZvcm1zUUwoKT8udG9BcnJheSgpID8/IFtdO1xyXG4gICAgdGhpcy5nZXRTbWFydENvbXBvbmVudExheW91dHNRTCgpPy5mb3JFYWNoKChjb21wKSA9PiB7XHJcbiAgICAgIGZvcm1zLnB1c2goLi4uU21hcnRDb21wb25lbnRMYXlvdXRVdGlsaXR5LmdldEZvcm1zKGNvbXApKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGZvcm1zO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFsbFNtYXJ0R3JpZENvbXBvbmVudHMoKTogU21hcnRHcmlkQ29tcG9uZW50W10ge1xyXG4gICAgbGV0IGdyaWRzOiBTbWFydEdyaWRDb21wb25lbnRbXSA9IHRoaXMuZ2V0U21hcnRHcmlkc1FMKCk/LnRvQXJyYXkoKSA/PyBbXTtcclxuICAgIHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKT8uZm9yRWFjaCgoY29tcCkgPT4ge1xyXG4gICAgICBncmlkcy5wdXNoKC4uLlNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eS5nZXRHcmlkcyhjb21wKSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBncmlkcztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRBbGxTbWFydE1hcENvbXBvbmVudHMoKTogQXJyYXk8U21hcnRNYXBDb21wb25lbnQ+IHtcclxuICAgIGNvbnN0IG1hcHM6IEFycmF5PFNtYXJ0TWFwQ29tcG9uZW50PiA9IHRoaXMuZ2V0U21hcnRNYXBRTCgpPy50b0FycmF5KCkgPz8gW107XHJcbiAgICB0aGlzLmdldFNtYXJ0Q29tcG9uZW50TGF5b3V0c1FMKCk/LmZvckVhY2goKGNvbXApID0+IHtcclxuICAgICAgbWFwcy5wdXNoKC4uLlNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eS5nZXRNYXBzKGNvbXApKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIG1hcHM7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0QWxsU21hcnRUcmVlQ29tcG9uZW50cygpOiBTbWFydHRyZWVHZW5lcmljU2VydmljZVtdIHtcclxuICAgIGxldCB0cmVlczogU21hcnR0cmVlR2VuZXJpY1NlcnZpY2VbXSA9IHRoaXMuZ2V0U21hcnRUcmVlc1FMKCk/LnRvQXJyYXkoKSA/PyBbXTtcclxuICAgIHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKT8uZm9yRWFjaCgoY29tcCkgPT4ge1xyXG4gICAgICB0cmVlcy5wdXNoKC4uLlNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eS5nZXRUcmVlcyhjb21wKSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiB0cmVlcztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRBbGxTbWFydEZpbHRlckVkaXRvckNvbnRlbnRDb21wb25lbnRzKCk6IFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudFtdIHtcclxuICAgIGxldCBmaWx0ZXJzOiBTbWFydEZpbHRlckVkaXRvckNvbnRlbnRDb21wb25lbnRbXSA9XHJcbiAgICAgIHRoaXMuZ2V0U21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50c1FMKCk/LnRvQXJyYXkoKSA/PyBbXTtcclxuICAgIHJldHVybiBmaWx0ZXJzO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldEFsbFNtYXJ0VWlBY3Rpb25Ub29sYmFycygpOiBVaUFjdGlvblRvb2xiYXJDb21wb25lbnRbXSB7XHJcbiAgICBsZXQgdG9vbGJhcnM6IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudFtdID0gdGhpcy5nZXRTbWFydFVpQWN0aW9uVG9vbGJhcnNRTCgpPy50b0FycmF5KCkgPz8gW107XHJcbiAgICB0aGlzLmdldEFsbFNtYXJ0R3JpZENvbXBvbmVudHMoKT8uZm9yRWFjaCgoZ3JpZCkgPT4ge1xyXG4gICAgICBpZiAoZ3JpZC50b29sYmFyKSB7XHJcbiAgICAgICAgdG9vbGJhcnMucHVzaChncmlkLnRvb2xiYXIpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ2V0U21hcnRDb21wb25lbnRMYXlvdXRzUUwoKT8uZm9yRWFjaCgoY29tcCkgPT4ge1xyXG4gICAgICB0b29sYmFycy5wdXNoKC4uLlNtYXJ0Q29tcG9uZW50TGF5b3V0VXRpbGl0eS5nZXRUb29sYmFycyhjb21wKSk7XHJcbiAgICB9KTtcclxuICAgIHRoaXMuZ2V0QWxsU21hcnRGb3JtQ29tcG9uZW50cygpXHJcbiAgICAgID8uZmxhdE1hcCgoZm9ybSkgPT4gZm9ybS5nZXRUb29sYmFycygpKVxyXG4gICAgICAuZmlsdGVyKCh0b29sYmFyKSA9PiB0b29sYmFyICE9PSB1bmRlZmluZWQgfHwgdG9vbGJhciAhPT0gbnVsbClcclxuICAgICAgLmZvckVhY2goKHRvb2xiYXIpID0+IHRvb2xiYXJzLnB1c2godG9vbGJhciBhcyBVaUFjdGlvblRvb2xiYXJDb21wb25lbnQpKTtcclxuXHJcbiAgICB0aGlzLmdldEFsbEZpbHRlclVpQWN0aW9uVG9vbGJhcnMoKS5mb3JFYWNoKCh0b29sYmFyKSA9PiB0b29sYmFycy5wdXNoKHRvb2xiYXIpKTtcclxuICAgIHJldHVybiB0b29sYmFycztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBnZXRBbGxGaWx0ZXJVaUFjdGlvblRvb2xiYXJzKCk6IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudFtdIHtcclxuICAgIHJldHVybiB0aGlzLmdldEFsbFNtYXJ0RmlsdGVyRWRpdG9yQ29udGVudENvbXBvbmVudHMoKVxyXG4gICAgICA/LmZpbHRlcigoZmlsdGVyKSA9PiBmaWx0ZXIuc2ltcGxlRmlsdGVyUmVmPy5pbnN0YW5jZSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAuZmxhdE1hcCgoZmlsdGVyKSA9PiBmaWx0ZXIuc2ltcGxlRmlsdGVyUmVmPy5pbnN0YW5jZS5nZXRUb29sYmFycygpKVxyXG4gICAgICAuZmlsdGVyKCh0b29sYmFyKSA9PiB0b29sYmFyICE9PSB1bmRlZmluZWQgfHwgdG9vbGJhciAhPT0gbnVsbClcclxuICAgICAgLm1hcCgodG9vbGJhcikgPT4gdG9vbGJhciBhcyBVaUFjdGlvblRvb2xiYXJDb21wb25lbnQpO1xyXG4gIH1cclxuXHJcbiAgaW5pdERhdGEoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5tb2RlbD8uZGF0YSkge1xyXG4gICAgICB0aGlzLmRhdGEgPSB0aGlzLm1vZGVsPy5kYXRhIGFzIGFueTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGluaXRBY3Rpb25zKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMubW9kZWw/LmFjdGlvbnMpIHtcclxuICAgICAgbGV0IHVpQWN0aW9uTW9kZWxzID0gdGhpcy5tb2RlbD8uYWN0aW9ucy5tYXAoKHVpQWN0aW9uOiBVaUFjdGlvbikgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBzZXJ2aWNlVG9Vc2U6IHRoaXMsXHJcbiAgICAgICAgICB1aUFjdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuICAgICAgY29uc3QgYWxsVG9vbGJhcnMgPSB0aGlzLmdldEFsbFNtYXJ0VWlBY3Rpb25Ub29sYmFycygpO1xyXG4gICAgICBsZXQgdG9vbGJhcnMgPSBhbGxUb29sYmFycy5maWx0ZXIoKHRvb2xiYXIpID0+IHRvb2xiYXIuaWQpO1xyXG4gICAgICBsZXQgdG9vbGJhcnNXaXRob3V0SWQgPSB0aGlzLmdldEFsbFNtYXJ0VWlBY3Rpb25Ub29sYmFycygpLmZpbHRlcihcclxuICAgICAgICAodG9vbGJhcikgPT4gdG9vbGJhci5pZCA9PT0gdW5kZWZpbmVkIHx8IHRvb2xiYXIuaWQgPT09IG51bGxcclxuICAgICAgKTtcclxuICAgICAgbGV0IHRvb2xiYXJNb2RlbHMgPSBuZXcgTWFwPHN0cmluZywgVWlBY3Rpb25Nb2RlbFtdPigpO1xyXG4gICAgICB0b29sYmFycy5mb3JFYWNoKCh0b29sYmFyKSA9PiB7XHJcbiAgICAgICAgdG9vbGJhck1vZGVscy5zZXQodG9vbGJhci5pZCEsIFtdKTtcclxuICAgICAgfSk7XHJcbiAgICAgIGxldCBnbG9iYWxVaUFjdGlvbk1vZGVsczogVWlBY3Rpb25Nb2RlbFtdID0gW107XHJcbiAgICAgIHVpQWN0aW9uTW9kZWxzLmZvckVhY2goKGFjdGlvbikgPT4ge1xyXG4gICAgICAgIGxldCBhY3Rpb25Nb2RlbDogVWlBY3Rpb25Nb2RlbFtdIHwgdW5kZWZpbmVkID0gZ2xvYmFsVWlBY3Rpb25Nb2RlbHM7XHJcbiAgICAgICAgbGV0IHRvb2xiYXJJZCA9IGFjdGlvbi51aUFjdGlvbi50b29sYmFyO1xyXG4gICAgICAgIGlmICh0b29sYmFySWQgJiYgdG9vbGJhck1vZGVscy5oYXModG9vbGJhcklkKSkge1xyXG4gICAgICAgICAgYWN0aW9uTW9kZWwgPSB0b29sYmFyTW9kZWxzLmdldCh0b29sYmFySWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoIWFjdGlvbk1vZGVsKSB7XHJcbiAgICAgICAgICBhY3Rpb25Nb2RlbCA9IGdsb2JhbFVpQWN0aW9uTW9kZWxzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBhY3Rpb25Nb2RlbC5wdXNoKGFjdGlvbik7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLnVpQWN0aW9uTW9kZWxzID0gZ2xvYmFsVWlBY3Rpb25Nb2RlbHM7XHJcblxyXG4gICAgICB0aGlzLnNldHVwQWxsVG9vbGJhcnModG9vbGJhcnMsIHRvb2xiYXJzV2l0aG91dElkLCB0b29sYmFyTW9kZWxzKVxyXG4gICAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3I/LmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGR1cmluZyBzZXR1cDonLCBlcnJvcik7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBzZXR1cEFsbFRvb2xiYXJzKFxyXG4gICAgdG9vbGJhcnM6IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudFtdLFxyXG4gICAgdG9vbGJhcnNXaXRob3V0SWQ6IFVpQWN0aW9uVG9vbGJhckNvbXBvbmVudFtdLFxyXG4gICAgdG9vbGJhck1vZGVsczogTWFwPHN0cmluZywgVWlBY3Rpb25Nb2RlbFtdPlxyXG4gICkge1xyXG4gICAgY29uc3Qgc2V0dXBQcm9taXNlczogUHJvbWlzZTx2b2lkPltdID0gW107XHJcblxyXG4gICAgdG9vbGJhcnMuZm9yRWFjaCgodG9vbGJhcikgPT4ge1xyXG4gICAgICB0b29sYmFyLnVpQWN0aW9uTW9kZWxzID0gdG9vbGJhck1vZGVscy5nZXQodG9vbGJhci5pZCEpO1xyXG4gICAgICBzZXR1cFByb21pc2VzLnB1c2godG9vbGJhci5zZXRVcCgpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRvb2xiYXJzV2l0aG91dElkLmZvckVhY2goKHRvb2xiYXIpID0+IHtcclxuICAgICAgc2V0dXBQcm9taXNlcy5wdXNoKHRvb2xiYXIuc2V0VXAoKSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBhd2FpdCBQcm9taXNlLmFsbChzZXR1cFByb21pc2VzKTtcclxuICB9XHJcblxyXG4gIHJ1bigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmF1dGguYmZmQXBpc0hhdmVCZWVuU2V0VXApIHtcclxuICAgICAgdGhpcy5sb2FkKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmF1dGguaGVhZGVyc1VwZGF0ZWQuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLmxvYWQoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBsb2FkKCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdGhpcy5jb21wb25lbnRNb2RlbExvYWRlZCA9IGZhbHNlO1xyXG4gICAgY29uc3QgdXVpZCA9IHRoaXMudmlld0NvbnRleHQuZ2V0VXVpZE9mUGFnZSh0aGlzLnBhZ2VOYW1lISk7XHJcbiAgICAvLyB0aGlzLm1vZGVsID0gYXdhaXQgdGhpcy52aWV3Q29udGV4dC5sb2FkKHRoaXMudXVpZCk7XHJcbiAgICBjb25zdCBjaGFuZ2UgPSBhd2FpdCB0aGlzLnZpZXdDb250ZXh0LmxvYWQyKHV1aWQpO1xyXG4gICAgdGhpcy5jb21wb25lbnRNb2RlbExvYWRlZCA9IHRydWU7XHJcbiAgICB0aGlzLnV1aWQgPSB1dWlkO1xyXG4gICAgdGhpcy5tb2RlbCA9IGNoYW5nZSEucmVzdWx0ISBhcyBDb21wb25lbnRNb2RlbDtcclxuICAgIGlmICh0aGlzLm1vZGVsLndpZGdldHMpIHtcclxuICAgICAgLy8gZ3JpZHMgYXJlIGFscmVhZHkgbG9hZGVkIGluIHNldFV1aWQoKVxyXG4gICAgICB0aGlzLmhhbmRsZUNoYW5nZVdpZGdldHModGhpcy5tb2RlbC53aWRnZXRzLCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGV4ZWN1dGVVaUFjdGlvbih1aUFjdGlvbjogVWlBY3Rpb24sIG9wdGlvbnM/OiBFeGVjdXRlVWlBY3Rpb25PcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLnVpQWN0aW9uU2VydmljZS51aUFjdGlvbk1vZGVsID0ge1xyXG4gICAgICBzZXJ2aWNlVG9Vc2U6IHRoaXMsXHJcbiAgICAgIHVpQWN0aW9uOiB1aUFjdGlvbixcclxuICAgIH07XHJcbiAgICBhd2FpdCB0aGlzLnVpQWN0aW9uU2VydmljZS5leGVjdXRlKHVpQWN0aW9uLCBvcHRpb25zKTtcclxuICB9XHJcblxyXG4gIGFkZERhdGFDaGFuZ2VBY3Rpb25IYW5kbGVyKGtleTogc3RyaW5nKSB7XHJcbiAgICBpZiAoIXRoaXMuZGF0YUNoYW5nZUtleXMuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICB0aGlzLmRhdGFDaGFuZ2VLZXlzLnB1c2goa2V5KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJlbW92ZURhdGFDaGFuZ2VBY3Rpb25IYW5kbGVyKGtleTogc3RyaW5nKSB7XHJcbiAgICBsZXQgaWR4ID0gdGhpcy5kYXRhQ2hhbmdlS2V5cy5pbmRleE9mKGtleSk7XHJcbiAgICBpZiAoaWR4ID49IDApIHtcclxuICAgICAgdGhpcy5kYXRhQ2hhbmdlS2V5cy5zcGxpY2UoaWR4LCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBkYXRhQ2hhbmdlQWN0aW9uSGFuZGxlcihldmVudDogU29waGlzdGljYXRlZFZhbHVlQ2hhbmdlKSB7XHJcbiAgICBpZiAodGhpcy5kYXRhQ2hhbmdlS2V5cy5pbmNsdWRlcyhldmVudC5rZXkpKSB7XHJcbiAgICAgIHRoaXMuZXhlY3V0ZVVpQWN0aW9uKHtcclxuICAgICAgICBjb2RlOiBldmVudC5rZXksXHJcbiAgICAgICAgbW9kZWw6IHRydWUsXHJcbiAgICAgICAgcGFyYW1zOiB7XHJcbiAgICAgICAgICBpdGVtOiBldmVudC52YWx1ZSxcclxuICAgICAgICB9LFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBoYW5kbGVEYXRhQ2hhbmdlU3Vic2NyaXB0aW9ucygpIHtcclxuICAgIGlmICh0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcclxuICAgICAgbGV0IGZvcm1zID0gdGhpcy5nZXRBbGxTbWFydEZvcm1Db21wb25lbnRzKCk7XHJcbiAgICAgIC8vIGFkZCBlbGVtZW50cyB0byBkYXRhQ2hhbmdlS2V5c1xyXG4gICAgICBmb3Jtcy5mb3JFYWNoKChmb3JtKSA9PiB7XHJcbiAgICAgICAgZm9ybS5zbWFydEZvcm0/LndpZGdldHMuZm9yRWFjaCgod2lkZ2V0KSA9PiB7XHJcbiAgICAgICAgICBpZiAod2lkZ2V0LmtleSkge1xyXG4gICAgICAgICAgICBpZiAod2lkZ2V0LnZhbHVlQ2hhbmdlTW9kZSA9PT0gVmFsdWVDaGFuZ2VNb2RlLklNTUVESUFURV9BQ1RJT04pIHtcclxuICAgICAgICAgICAgICB0aGlzLmFkZERhdGFDaGFuZ2VBY3Rpb25IYW5kbGVyKHdpZGdldC5rZXkpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIHRoaXMucmVtb3ZlRGF0YUNoYW5nZUFjdGlvbkhhbmRsZXIod2lkZ2V0LmtleSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICAgIC8vIHN1YnNjcmliZSB0byBuZXcgZm9ybXNcclxuICAgICAgZm9ybXMuZm9yRWFjaCgoY29tcG9uZW50KSA9PiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmRhdGFDaGFuZ2VBY3Rpb25IYW5kbGVycy5oYXMoY29tcG9uZW50KSkge1xyXG4gICAgICAgICAgbGV0IHN1YnMgPSBjb21wb25lbnQuc29waGlzdGljYXRlZFZhbHVlQ2hhbmdlXHJcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50KSA9PiB0aGlzLmRhdGFDaGFuZ2VBY3Rpb25IYW5kbGVyKGV2ZW50KSk7XHJcbiAgICAgICAgICB0aGlzLmRhdGFDaGFuZ2VBY3Rpb25IYW5kbGVycy5zZXQoY29tcG9uZW50LCBzdWJzKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgLy8gdW5zdWJzY3JpYmUgZnJvbSByZW1vdmVkIGZvcm1zXHJcbiAgICAgIHRoaXMuZGF0YUNoYW5nZUFjdGlvbkhhbmRsZXJzLmZvckVhY2goKHN1YnMsIGZvcm0pID0+IHtcclxuICAgICAgICBpZiAoIWZvcm1zLmZpbmQoKGMpID0+IGMgPT09IGZvcm0pKSB7XHJcbiAgICAgICAgICBzdWJzLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICB0aGlzLmRhdGFDaGFuZ2VBY3Rpb25IYW5kbGVycy5kZWxldGUoZm9ybSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldEludmFsaWRGaWVsZHMoKTogU21hcnRGb3JtSW52YWxpZEZpZWxkcyB7XHJcbiAgICBsZXQgYWdncmVnYXRlZEludmFsaWRGaWVsZHM6IFNtYXJ0Rm9ybUludmFsaWRGaWVsZHMgPSB7XHJcbiAgICAgIGludmFsaWRGaWVsZEtleXM6IFtdLFxyXG4gICAgICBpbnZhbGlkRmllbGROYW1lczogW10sXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcclxuICAgICAgdGhpcy5nZXRBbGxTbWFydEZvcm1Db21wb25lbnRzKCk/LmZvckVhY2goKGZvcm0pID0+XHJcbiAgICAgICAgdGhpcy52YWxpZGF0ZUZvcm0oZm9ybSwgYWdncmVnYXRlZEludmFsaWRGaWVsZHMpXHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm1XaWRnZXRzPy5mb3JFYWNoKChmb3JtKSA9PiB0aGlzLnZhbGlkYXRlRm9ybShmb3JtLCBhZ2dyZWdhdGVkSW52YWxpZEZpZWxkcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBhZ2dyZWdhdGVkSW52YWxpZEZpZWxkcztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCB2YWxpZGF0ZUZvcm0oXHJcbiAgICBmb3JtOiBTbWFydGZvcm1Db21wb25lbnQgfCB1bmRlZmluZWQsXHJcbiAgICBhZ2dyZWdhdGVkSW52YWxpZEZpZWxkczogU21hcnRGb3JtSW52YWxpZEZpZWxkc1xyXG4gICkge1xyXG4gICAgbGV0IGludmFsaWRGaWVsZHNPZkZvcm0gPSBmb3JtPy5nZXRJbnZhbGlkRmllbGRzKCk7XHJcbiAgICBpZiAoaW52YWxpZEZpZWxkc09mRm9ybSkge1xyXG4gICAgICBpbnZhbGlkRmllbGRzT2ZGb3JtLmludmFsaWRGaWVsZEtleXMuZm9yRWFjaCgoa2V5KSA9PlxyXG4gICAgICAgIGFnZ3JlZ2F0ZWRJbnZhbGlkRmllbGRzLmludmFsaWRGaWVsZEtleXMucHVzaChrZXkpXHJcbiAgICAgICk7XHJcbiAgICAgIGludmFsaWRGaWVsZHNPZkZvcm0uaW52YWxpZEZpZWxkTmFtZXMuZm9yRWFjaCgoa2V5KSA9PlxyXG4gICAgICAgIGFnZ3JlZ2F0ZWRJbnZhbGlkRmllbGRzLmludmFsaWRGaWVsZE5hbWVzLnB1c2goa2V5KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIFVzZVVpQWN0aW9uXHJcbiAgZ2V0QWRkaXRpb25hbFBhcmFtcyh1aUFjdGlvbjogVWlBY3Rpb24pOiBVaUFjdGlvbkFkZGl0aW9uYWxQYXJhbXMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgZm9yVGV4dEFyZWE6ICcnLFxyXG4gICAgICBmb3JUZXh0RmllbGQ6ICcnLFxyXG4gICAgfTtcclxuICB9XHJcbiAgZ2V0TW9kZWwoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kYXRhO1xyXG4gIH1cclxuXHJcbiAgc3VibWl0Rm9ybSh2YWxpZGF0ZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJtaXRGb3Jtcyh2YWxpZGF0ZSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBwZXJmb3JtVWlBY3Rpb25SZXF1ZXN0KFxyXG4gICAgdWlBY3Rpb25SZXF1ZXN0OiBVaUFjdGlvblJlcXVlc3QsXHJcbiAgICB3aWRnZXRJZD86IHN0cmluZyxcclxuICAgIG5vZGVJZD86IHN0cmluZ1xyXG4gICk6IFByb21pc2U8YW55PiB7XHJcbiAgICBpZiAodWlBY3Rpb25SZXF1ZXN0LnBhcmFtc1snX2ZpbGVzJ10pIHtcclxuICAgICAgY29uc3QgcGFyYW0gPSB1aUFjdGlvblJlcXVlc3QucGFyYW1zWydwYXJhbSddO1xyXG4gICAgICBjb25zdCBmaWxlcyA9IHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ19maWxlcyddO1xyXG4gICAgICBjb25zdCBpc011bHRpcGxlID0gdWlBY3Rpb25SZXF1ZXN0LnBhcmFtc1snaXNNdWx0aXBsZSddO1xyXG4gICAgICBkZWxldGUgdWlBY3Rpb25SZXF1ZXN0LnBhcmFtc1sncGFyYW0nXTtcclxuICAgICAgZGVsZXRlIHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ19maWxlcyddO1xyXG4gICAgICBkZWxldGUgdWlBY3Rpb25SZXF1ZXN0LnBhcmFtc1snaXNNdWx0aXBsZSddO1xyXG5cclxuICAgICAgLy8gYXdhaXQgdGhpcy5zZW5kTW9kZWxUb1NlcnZlcigpO1xyXG4gICAgICBpZiAoIWlzTXVsdGlwbGUpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLnZpZXdDb250ZXh0LnBlcmZvcm1VcGxvYWRBY3Rpb24odGhpcy51dWlkISwgdWlBY3Rpb25SZXF1ZXN0LCBwYXJhbSwgZmlsZXNbMF0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGF3YWl0IHRoaXMudmlld0NvbnRleHQucGVyZm9ybVVwbG9hZE11bHRpcGxlQWN0aW9uKFxyXG4gICAgICAgICAgdGhpcy51dWlkISxcclxuICAgICAgICAgIHVpQWN0aW9uUmVxdWVzdCxcclxuICAgICAgICAgIHBhcmFtLFxyXG4gICAgICAgICAgZmlsZXNcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHdpZGdldElkICYmIG5vZGVJZCkge1xyXG4gICAgICAvLyBhd2FpdCB0aGlzLnNlbmRNb2RlbFRvU2VydmVyKCk7XHJcbiAgICAgIHRoaXMuYWRkTW9kZWxUb1dpZGdldEFjdGlvbih1aUFjdGlvblJlcXVlc3QpO1xyXG4gICAgICBhd2FpdCB0aGlzLnZpZXdDb250ZXh0LnBlcmZvcm1XaWRnZXRBY3Rpb24odGhpcy51dWlkISwgd2lkZ2V0SWQsIG5vZGVJZCwgdWlBY3Rpb25SZXF1ZXN0KTtcclxuICAgIH0gZWxzZSBpZiAod2lkZ2V0SWQpIHtcclxuICAgICAgLy8gYXdhaXQgdGhpcy5zZW5kTW9kZWxUb1NlcnZlcigpO1xyXG4gICAgICB0aGlzLmFkZE1vZGVsVG9XaWRnZXRBY3Rpb24odWlBY3Rpb25SZXF1ZXN0KTtcclxuICAgICAgYXdhaXQgdGhpcy52aWV3Q29udGV4dC5wZXJmb3JtV2lkZ2V0TWFpbkFjdGlvbih0aGlzLnV1aWQhLCB3aWRnZXRJZCwgdWlBY3Rpb25SZXF1ZXN0KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGF3YWl0IHRoaXMudmlld0NvbnRleHQucGVyZm9ybUFjdGlvbih0aGlzLnV1aWQhLCB1aUFjdGlvblJlcXVlc3QpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFkZE1vZGVsVG9XaWRnZXRBY3Rpb24odWlBY3Rpb25SZXF1ZXN0OiBVaUFjdGlvblJlcXVlc3QpIHtcclxuICAgIGlmICh0aGlzLnNlbmRNb2RlbE9uV2lkZ2V0QWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuc3VibWl0Rm9ybShmYWxzZSk7XHJcbiAgICAgIC8vIG1pbWljIENvbXBvbmVudE1vZGVsXHJcbiAgICAgIHVpQWN0aW9uUmVxdWVzdC5wYXJhbXNbJ2NsaWVudFBhZ2VNb2RlbCddID0geyBkYXRhOiB0aGlzLmdldE1vZGVsKCkgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHByaXZhdGUgYXN5bmMgc2VuZE1vZGVsVG9TZXJ2ZXIoKSB7XHJcbiAgLy8gICB0aGlzLnN1Ym1pdEZvcm1zKGZhbHNlKTtcclxuICAvLyAgIGxldCBkYXRhQ2hhbmdlID0ge1xyXG4gIC8vICAgICBraW5kOiBEYXRhQ2hhbmdlS2luZC5XaWRnZXQsXHJcbiAgLy8gICAgIHNvdXJjZTogJycsXHJcbiAgLy8gICAgIHZhbHVlczogW1snJywgdGhpcy5nZXRNb2RlbCgpXV0sXHJcbiAgLy8gICB9O1xyXG4gIC8vICAgYXdhaXQgdGhpcy52aWV3Q29udGV4dC5kYXRhQ2hhbmdlZCh0aGlzLnV1aWQhLCBkYXRhQ2hhbmdlKTtcclxuICAvLyB9XHJcblxyXG4gIGhhbmRsZVNwZWNpZmljRGVtYW5kc0FzeW5jaHJvbm91c2x5KFxyXG4gICAgdWlBY3Rpb246IFVpQWN0aW9uLFxyXG4gICAgdWlBY3Rpb25SZXF1ZXN0OiBVaUFjdGlvblJlcXVlc3RcclxuICApOiBQcm9taXNlPFVpQWN0aW9uU3BlY2lmaWNEZW1hbmRSZXNwb25zZT4ge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKCdoYW5kbGVTcGVjaWZpY0RlbWFuZHNBc3luY2hyb25vdXNseSBtZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLyoqXHJcbiAgICogU3VibWl0cyBhbGwgdGhlIHJlZ2lzdGVyZWQgZm9ybXMgaW4gdGhlIFNtYXJ0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgcHVibGljIHN1Ym1pdEZvcm1zKHZhbGlkYXRlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy51c2VRdWVyeUxpc3RzKSB7XHJcbiAgICAgIHRoaXMuZ2V0QWxsU21hcnRGb3JtQ29tcG9uZW50cygpPy5mb3JFYWNoKChmb3JtKSA9PiB7XHJcbiAgICAgICAgZm9ybT8uc3VibWl0Rm9ybSh2YWxpZGF0ZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtV2lkZ2V0cz8uZm9yRWFjaCgoZm9ybSkgPT4ge1xyXG4gICAgICAgIGZvcm0/LnN1Ym1pdEZvcm0odmFsaWRhdGUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZGRHcmlkKFxyXG4gICAgc21hcnRHcmlkOiBTbWFydEdyaWQsXHJcbiAgICBvcHRpb25zOiBHcmlkT3B0aW9ucyxcclxuICAgIHVzZUFzRGVmYXVsdEdyaWQ/OiBib29sZWFuLFxyXG4gICAgY29tcG9uZW50UmVmZXJlbmNlPzogU21hcnRHcmlkQ29tcG9uZW50XHJcbiAgKTogU21hcnRHcmlkIHtcclxuICAgIHNtYXJ0R3JpZC5vcHRpb25zID0gb3B0aW9ucztcclxuICAgIHNtYXJ0R3JpZC51aUFjdGlvblNlcnZpY2UgPSB0aGlzLnVpQWN0aW9uU2VydmljZTtcclxuICAgIHNtYXJ0R3JpZC51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlID0gdGhpcy51aUFjdGlvbkRlc2NyaXB0b3JTZXJ2aWNlO1xyXG4gICAgc21hcnRHcmlkLnNlcnZpY2VUb1VzZSA9IHRoaXM7XHJcbiAgICBzbWFydEdyaWQudmlld0NvbnRleHRTZXJ2aWNlID0gdGhpcy52aWV3Q29udGV4dDtcclxuXHJcbiAgICBpZiAoIXRoaXMudXNlUXVlcnlMaXN0cykge1xyXG4gICAgICB0aGlzLndpZGdldHMuc2V0KHNtYXJ0R3JpZC5ncmlkSWRlbnRpZmllciwgY29tcG9uZW50UmVmZXJlbmNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihgQWRkZWQgc21hcnRHcmlkIHdoZW4gdXNlUXVlcnlMaXN0cyA9PT0gdHJ1ZSAoJHtzbWFydEdyaWQuZ3JpZElkZW50aWZpZXJ9KWApO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh1c2VBc0RlZmF1bHRHcmlkKSB7XHJcbiAgICAgIHRoaXMuc21hcnRHcmlkID0gc21hcnRHcmlkO1xyXG4gICAgICByZXR1cm4gdGhpcy5zbWFydEdyaWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHNtYXJ0R3JpZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZGRGb3JtKFxyXG4gICAgc21hcnRGb3JtSWQ6IHN0cmluZyxcclxuICAgIHNtYXJ0Rm9ybTogU21hcnRGb3JtLFxyXG4gICAgY29tcG9uZW50UmVmZXJlbmNlPzogU21hcnRmb3JtQ29tcG9uZW50XHJcbiAgKTogU21hcnRGb3JtIHtcclxuICAgIGlmICghdGhpcy51c2VRdWVyeUxpc3RzKSB7XHJcbiAgICAgIHRoaXMuZm9ybVdpZGdldHMuc2V0KHNtYXJ0Rm9ybUlkLCBjb21wb25lbnRSZWZlcmVuY2UpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS53YXJuKGBBZGRlZCBzbWFydEZvcm0gd2hlbiB1c2VRdWVyeUxpc3RzID09PSB0cnVlICgke3NtYXJ0Rm9ybUlkfSlgKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZiAodGhpcy5zZW5kRGF0YUNoYW5nZXMgJiYgY29tcG9uZW50UmVmZXJlbmNlKSB7XHJcbiAgICAvLyAgIHNtYXJ0Rm9ybS51c2VPblZhbHVlQ2hhbmdlRXZlbnQgPSB0cnVlO1xyXG5cclxuICAgIC8vICAgY29tcG9uZW50UmVmZXJlbmNlLnNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZVxyXG4gICAgLy8gICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCkpXHJcbiAgICAvLyAgICAgLnN1YnNjcmliZSgodmFsdWVDaGFuZ2U6IFNvcGhpc3RpY2F0ZWRWYWx1ZUNoYW5nZSkgPT4ge1xyXG4gICAgLy8gICAgICAgdGhpcy5oYW5kbGVWYWx1ZUNoYW5nZXModmFsdWVDaGFuZ2UpO1xyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIHJldHVybiBzbWFydEZvcm07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0VXBEZWZhdWx0VHJlZSh0cmVlSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zbWFydFRyZWVTZXJ2aWNlID0gdGhpcy5jcmVhdGVUcmVlU2VydmljZSh0cmVlSWQpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZVRyZWVTZXJ2aWNlKHRyZWVJZDogc3RyaW5nKTogU21hcnR0cmVlR2VuZXJpY1NlcnZpY2Uge1xyXG4gICAgY29uc3QgdHJlZVNlcnZpY2UgPSBuZXcgU21hcnR0cmVlR2VuZXJpY1NlcnZpY2UodGhpcy5pbmplY3QsIHRoaXMucGFnZU5hbWUhLCB0cmVlSWQpO1xyXG4gICAgaWYgKCF0aGlzLnVzZVF1ZXJ5TGlzdHMpIHtcclxuICAgICAgdGhpcy53aWRnZXRzLnNldCh0cmVlSWQsIHRyZWVTZXJ2aWNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihgQWRkZWQgc21hcnRUcmVlIHdoZW4gdXNlUXVlcnlMaXN0cyA9PT0gdHJ1ZSAoJHt0cmVlSWR9KWApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0cmVlU2VydmljZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZGRGaWxlVXBsb2FkZXIoXHJcbiAgICB1aUFjdGlvbkNvZGU6IHN0cmluZyxcclxuICAgIGZpbGVGb3JtYXRzPzogc3RyaW5nW10sXHJcbiAgICBtYXhTaXplTWI/OiBudW1iZXIsXHJcbiAgICBpc011bHRpcGxlPzogYm9vbGVhblxyXG4gICk6IFNtYXJ0Q29tcG9uZW50RmlsZVVwbG9hZGVyIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHVpQWN0aW9uQ29kZSxcclxuICAgICAgc21hcnRDb21wb25lbnQ6IHRoaXMsXHJcbiAgICAgIGZpbGVGb3JtYXRzLFxyXG4gICAgICBpc011bHRpcGxlLFxyXG4gICAgICBtYXhTaXplTWIsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLy8gI3JlZ2lvbiBoYW5kbGUgY2hhbmdlc1xyXG4gIHByaXZhdGUgaGFuZGxlVmFsdWVDaGFuZ2VzKHZhbHVlQ2hhbmdlOiBTb3BoaXN0aWNhdGVkVmFsdWVDaGFuZ2UpOiB2b2lkIHtcclxuICAgIGxldCBkYXRhQ2hhbmdlOiBEYXRhQ2hhbmdlO1xyXG4gICAgaWYgKHZhbHVlQ2hhbmdlLmtleS5pbmNsdWRlcygnLicpKSB7XHJcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHZhbHVlQ2hhbmdlLmtleS5zcGxpdCgnLicpWzBdO1xyXG4gICAgICBjb25zdCB2YWx1ZUtleSA9IHZhbHVlQ2hhbmdlLmtleS5zcGxpdCgnLicpWzFdO1xyXG4gICAgICBkYXRhQ2hhbmdlID0ge1xyXG4gICAgICAgIGtpbmQ6IHZhbHVlQ2hhbmdlLmtpbmQgPT09ICdiYXNpYycgPyBEYXRhQ2hhbmdlS2luZC5XSURHRVQgOiBEYXRhQ2hhbmdlS2luZC5TRUxFQ1RJT04sXHJcbiAgICAgICAgc291cmNlLFxyXG4gICAgICAgIHZhbHVlczogW1t2YWx1ZUtleSwgdmFsdWVDaGFuZ2UudmFsdWVdXSxcclxuICAgICAgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRhdGFDaGFuZ2UgPSB7XHJcbiAgICAgICAga2luZDogdmFsdWVDaGFuZ2Uua2luZCA9PT0gJ2Jhc2ljJyA/IERhdGFDaGFuZ2VLaW5kLldJREdFVCA6IERhdGFDaGFuZ2VLaW5kLlNFTEVDVElPTixcclxuICAgICAgICBzb3VyY2U6IHZhbHVlQ2hhbmdlLmtleSxcclxuICAgICAgICB2YWx1ZXM6IFtbdmFsdWVDaGFuZ2Uua2V5LCB2YWx1ZUNoYW5nZS52YWx1ZV1dLFxyXG4gICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudmlld0NvbnRleHQuZGF0YUNoYW5nZWQodGhpcy51dWlkISwgZGF0YUNoYW5nZSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaGFuZGxlQ2hhbmdlcyhjaGFuZ2U6IENvbXBvbmVudE1vZGVsQ2hhbmdlKTogdm9pZCB7XHJcbiAgICB0cnkge1xyXG4gICAgICBpZiAoIXRoaXMuY29tcG9uZW50TW9kZWxMb2FkZWQpIHtcclxuICAgICAgICAvLyBpbml0aWFsIGxvYWRcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGNoYW5nZS5jaGFuZ2VkV2lkZ2V0cykge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQ2hhbmdlV2lkZ2V0cyhjaGFuZ2UuY2hhbmdlZFdpZGdldHMpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZGF0YUNoYW5nZUhhc0JlZW5OZXh0ZWQgPSBmYWxzZTtcclxuICAgICAgaWYgKGNoYW5nZS5jaGFuZ2VzKSB7XHJcbiAgICAgICAgY29uc3QgY2hhbmdlcyA9IGNoYW5nZS5jaGFuZ2VzO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKGNoYW5nZXMpLm1hcCgoY2hhbmdlS2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIGlmIChjaGFuZ2VLZXkuc3RhcnRzV2l0aCgnZGF0YS4nKSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZURhdGFDaGFuZ2UoY2hhbmdlcywgY2hhbmdlS2V5KTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlS2V5LnN0YXJ0c1dpdGgoJ2xheW91dHMuJykgJiYgdGhpcy5tb2RlbD8ubGF5b3V0cykge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUxheW91dENoYW5nZShjaGFuZ2VzLCBjaGFuZ2VLZXkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VLZXkuc3RhcnRzV2l0aCgnY29tcG9uZW50TGF5b3V0cy4nKSAmJiB0aGlzLm1vZGVsPy5sYXlvdXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29tcG9uZW50TGF5b3V0Q2hhbmdlKGNoYW5nZXMsIGNoYW5nZUtleSk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZUtleS5zdGFydHNXaXRoKCd2YWx1ZVNldHMuJykgJiYgdGhpcy5tb2RlbD8udmFsdWVTZXRzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlVmFsdWVTZXRDaGFuZ2UoY2hhbmdlcywgY2hhbmdlS2V5KTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlS2V5ID09PSAnYWN0aW9ucycpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVBY3Rpb25DaGFuZ2UoY2hhbmdlcywgY2hhbmdlS2V5KTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoY2hhbmdlS2V5ID09PSAnY29uc3RyYWludHMnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQ29uc3RyYWludENoYW5nZShjaGFuZ2VzLCBjaGFuZ2VLZXkpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChjaGFuZ2VLZXkgPT09ICcnKSB7XHJcbiAgICAgICAgICAgIHRoaXMubW9kZWwgPSBjaGFuZ2VzWycnXSBhcyBDb21wb25lbnRNb2RlbDtcclxuICAgICAgICAgICAgZGF0YUNoYW5nZUhhc0JlZW5OZXh0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoIWRhdGFDaGFuZ2VIYXNCZWVuTmV4dGVkKSB7XHJcbiAgICAgICAgICB0aGlzLmRhdGFDaGFuZ2VkLm5leHQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB0aGlzLm1vZGVsID0gY2hhbmdlLnZhbHVlIGFzIENvbXBvbmVudE1vZGVsO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghY2hhbmdlLmNoYW5nZWRXaWRnZXRzICYmICFjaGFuZ2UuY2hhbmdlcyAmJiBjaGFuZ2UudmFsdWUpIHtcclxuICAgICAgdGhpcy5tb2RlbCA9IGNoYW5nZS52YWx1ZSBhcyBDb21wb25lbnRNb2RlbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBoYW5kbGVDaGFuZ2VXaWRnZXRzKGNoYW5nZWRXaWRnZXRzOiBzdHJpbmdbXSwgc2tpcExvYWQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xyXG4gICAgbGV0IHdpZGdldHMgPSB0aGlzLmdldFdpZGdldHMoKTtcclxuICAgIGNoYW5nZWRXaWRnZXRzLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJlZmVyZW5jZSA9IHdpZGdldHMuZ2V0KGtleSk7XHJcblxyXG4gICAgICBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgU21hcnRHcmlkQ29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXR1cEdyaWRTZXJ2aWNlcyhyZWZlcmVuY2UpO1xyXG4gICAgICAgIGlmICghc2tpcExvYWQpIHtcclxuICAgICAgICAgIHJlZmVyZW5jZS5yZWZyZXNoKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFNtYXJ0dHJlZUdlbmVyaWNTZXJ2aWNlKSB7XHJcbiAgICAgICAgaWYgKCFza2lwTG9hZCkge1xyXG4gICAgICAgICAgcmVmZXJlbmNlLmluaXRpYWxpemUoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSBpZiAocmVmZXJlbmNlIGluc3RhbmNlb2YgU21hcnRGaWx0ZXJFZGl0b3JDb250ZW50Q29tcG9uZW50KSB7XHJcbiAgICAgICAgdGhpcy5zZXR1cEZpbHRlclNlcnZpY2VzKHJlZmVyZW5jZSk7XHJcbiAgICAgICAgLy9pZiAoIXNraXBMb2FkKSB7IC8vIGZpbHRlciBpcyBub3QgbG9hZGVkIHdoZW4gc2V0dGluZyB1dWlkXHJcbiAgICAgICAgcmVmZXJlbmNlLnNlcnZpY2UubG9hZCgpO1xyXG4gICAgICAgIC8vfVxyXG4gICAgICB9IGVsc2UgaWYgKHJlZmVyZW5jZSBpbnN0YW5jZW9mIFNtYXJ0TWFwQ29tcG9uZW50KSB7XHJcbiAgICAgICAgcmVmZXJlbmNlLmxvYWQoKTtcclxuICAgICAgfSBlbHNlIGlmICghc2tpcExvYWQgJiYgcmVmZXJlbmNlID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKGBQcm92aWRlZCByZWZlcmVuY2UgZm9yICR7a2V5fSBpcyB1bmRlZmluZWQuYCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXRWYWx1ZURlZXBseShtb2RlbDogYW55LCBrZXk6IHN0cmluZywgdmFsdWU6IGFueSkge1xyXG4gICAgbGV0IHNwbGl0dGVkS2V5cyA9IGtleS5zcGxpdCgnLicpO1xyXG5cclxuICAgIGxldCBkZWVwTW9kZWw6IGFueVtdID0gW21vZGVsXTtcclxuICAgIGxldCB0ZW1wTW9kZWw6IGFueTtcclxuXHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgc3BsaXR0ZWRLZXlzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICB0ZW1wTW9kZWwgPSBkZWVwTW9kZWxbaW5kZXhdO1xyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHR5cGVvZiB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gIT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgdHlwZW9mIHRlbXBNb2RlbFtzcGxpdHRlZEtleXNbaW5kZXhdXSAhPT0gJ2Jvb2xlYW4nICYmXHJcbiAgICAgICAgdHlwZW9mIHRlbXBNb2RlbFtzcGxpdHRlZEtleXNbaW5kZXhdXSAhPT0gJ251bWJlcicgJiZcclxuICAgICAgICB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gIT09IHVuZGVmaW5lZFxyXG4gICAgICApIHtcclxuICAgICAgICBkZWVwTW9kZWwucHVzaCh0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoaW5kZXggPT09IHNwbGl0dGVkS2V5cy5sZW5ndGggLSAxKSB7XHJcbiAgICAgICAgbGV0IG9sZFZhbHVlID0gdGVtcE1vZGVsW3NwbGl0dGVkS2V5c1tpbmRleF1dO1xyXG4gICAgICAgIC8vIGlmICh2YWx1ZSA9PT0gJycgJiYgKG9sZFZhbHVlID09PSBudWxsIHx8IG9sZFZhbHVlID09PSB1bmRlZmluZWQpIHRoZW4gZG9uJ3QgY2hhbmdlIHZhbHVlLlxyXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gJycgfHwgKG9sZFZhbHVlICE9PSBudWxsICYmIG9sZFZhbHVlICE9PSB1bmRlZmluZWQpKSB7XHJcbiAgICAgICAgICB0ZW1wTW9kZWxbc3BsaXR0ZWRLZXlzW2luZGV4XV0gPSB2YWx1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgaGFuZGxlRGF0YUNoYW5nZShjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBjaGFuZ2VLZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXRWYWx1ZURlZXBseSh0aGlzLm1vZGVsLCBjaGFuZ2VLZXksIGNoYW5nZXNbY2hhbmdlS2V5XSk7XHJcblxyXG4gICAgaWYgKHRoaXMudXNlUXVlcnlMaXN0cykge1xyXG4gICAgICB0aGlzLmdldEFsbFNtYXJ0Rm9ybUNvbXBvbmVudHMoKT8uZm9yRWFjaCgoZm9ybSkgPT4gZm9ybS5yZWZyZXNoKCkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtV2lkZ2V0cy5mb3JFYWNoKChmb3JtQ29tcG9uZW50OiBTbWFydGZvcm1Db21wb25lbnQgfCB1bmRlZmluZWQsIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgaWYgKGZvcm1Db21wb25lbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgY29uc29sZS5lcnJvcihgUHJvdmlkZWQgZm9ybSByZWZlcmVuY2UgZm9yICR7a2V5fSBpcyB1bmRlZmluZWQuYCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGZvcm1Db21wb25lbnQucmVmcmVzaCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUxheW91dENoYW5nZShjaGFuZ2VzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9LCBjaGFuZ2VLZXk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbGV0IGxheW91dEtleSA9IGNoYW5nZUtleS5zcGxpdCgnLicpWzFdO1xyXG4gICAgdGhpcy5tb2RlbCEubGF5b3V0c1tsYXlvdXRLZXldID0gY2hhbmdlc1tjaGFuZ2VLZXldO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVDb21wb25lbnRMYXlvdXRDaGFuZ2UoY2hhbmdlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgY2hhbmdlS2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGxldCBsYXlvdXRLZXkgPSBjaGFuZ2VLZXkuc3BsaXQoJy4nKVsxXTtcclxuICAgIGxldCBjb21wb25lbnRMYXlvdXRzOiB7IFtrZXk6IHN0cmluZ106IE9iamVjdCB9ID0gdGhpcy5tb2RlbCEuY29tcG9uZW50TGF5b3V0cyBhcyB7XHJcbiAgICAgIFtrZXk6IHN0cmluZ106IE9iamVjdDtcclxuICAgIH07XHJcbiAgICBjb21wb25lbnRMYXlvdXRzW2xheW91dEtleV0gPSBjaGFuZ2VzW2NoYW5nZUtleV07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZVZhbHVlU2V0Q2hhbmdlKGNoYW5nZXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0sIGNoYW5nZUtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBsZXQgdmFsdWVTZXRLZXkgPSBjaGFuZ2VLZXkuc3BsaXQoJy4nKVsxXTtcclxuICAgIHRoaXMubW9kZWwhLnZhbHVlU2V0cyFbdmFsdWVTZXRLZXldID0gY2hhbmdlc1tjaGFuZ2VLZXldO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYW5kbGVBY3Rpb25DaGFuZ2UoY2hhbmdlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgY2hhbmdlS2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwhLmFjdGlvbnMgPSBjaGFuZ2VzW2NoYW5nZUtleV07XHJcbiAgICB0aGlzLmluaXRBY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZUNvbnN0cmFpbnRDaGFuZ2UoY2hhbmdlczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSwgY2hhbmdlS2V5OiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWwhLmNvbnN0cmFpbnRzID0gY2hhbmdlc1tjaGFuZ2VLZXldO1xyXG4gIH1cclxuXHJcbiAgLy8gI2VuZHJlZ2lvblxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFNtYXJ0Q29tcG9uZW50RmlsZVVwbG9hZGVyIHtcclxuICB1aUFjdGlvbkNvZGU6IHN0cmluZztcclxuICBtYXhTaXplTWI/OiBudW1iZXI7XHJcbiAgZmlsZUZvcm1hdHM/OiBzdHJpbmdbXTtcclxuICBpc011bHRpcGxlPzogYm9vbGVhbjtcclxuICBzbWFydENvbXBvbmVudDogU21hcnRDb21wb25lbnRBcGlDbGllbnQ8YW55PjtcclxufVxyXG4iXX0=
|