@mediusinc/mng-commons 6.0.0-rc.5 → 6.0.0-rc.7
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/README.md +6 -6
- package/core/components/notification/notification-wrapper.component.d.ts +4 -4
- package/core/data-list/data-list-params-helpers.d.ts +1 -0
- package/core/directives/component.directive.d.ts +11 -13
- package/core/directives/rerender.directive.d.ts +1 -1
- package/core/directives/template.directive.d.ts +3 -7
- package/core/error/error.model.d.ts +4 -4
- package/core/helpers/notification.d.ts +2 -2
- package/core/i18n/i18n-common.d.ts +2 -2
- package/core/provide.d.ts +3 -3
- package/core/styles/style-constants.d.ts +9 -8
- package/core/styles/style.model.d.ts +2 -1
- package/fesm2022/mediusinc-mng-commons-core.mjs +167 -201
- package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form-api.mjs +8 -9
- package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-form.mjs +151 -52
- package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-table-column-toggle.component-a8KG1NIX.mjs +30 -0
- package/fesm2022/mediusinc-mng-commons-table-column-toggle.component-a8KG1NIX.mjs.map +1 -0
- package/fesm2022/mediusinc-mng-commons-table-mediusinc-mng-commons-table-C2vrMoNL.mjs +2130 -0
- package/fesm2022/mediusinc-mng-commons-table-mediusinc-mng-commons-table-C2vrMoNL.mjs.map +1 -0
- package/fesm2022/mediusinc-mng-commons-table.mjs +1 -2154
- package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +97 -49
- package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-tableview.mjs +332 -293
- package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
- package/form/api/index.d.ts +1 -0
- package/form/api/models/empty-value.model.d.ts +7 -0
- package/form/components/autocomplete/autocomplete.component.d.ts +1 -2
- package/form/components/date-range/date-range.component.d.ts +4 -3
- package/form/components/dropdown/dropdown.component.d.ts +3 -2
- package/form/components/number-range/number-range.component.d.ts +3 -2
- package/form/directives/input-empty-value.directive.d.ts +40 -0
- package/form/directives/input-trim.directive.d.ts +3 -5
- package/form/index.d.ts +1 -0
- package/i18n/en.json +57 -8
- package/i18n/sl.json +1 -3
- package/package.json +10 -36
- package/provide.d.ts +2 -2
- package/table/components/column-toggle/column-toggle.component.d.ts +12 -0
- package/table/components/filter/filter-form/filter-form.component.d.ts +2 -2
- package/table/components/table/table.component.d.ts +0 -1
- package/table/helpers/filters.d.ts +3 -2
- package/table/helpers/notification.d.ts +2 -2
- package/table/provide.d.ts +7 -0
- package/table/services/table-metadata.service.d.ts +3 -3
- package/tableview/action/components/action/action.component.d.ts +1 -0
- package/tableview/action/components/editor/action-editor.component.d.ts +1 -1
- package/tableview/action/components/table/action-table.component.d.ts +2 -1
- package/tableview/action/helpers/notification.d.ts +3 -3
- package/tableview/action/models/execution/action-context.model.d.ts +2 -2
- package/tableview/action/services/action-executor.service.d.ts +1 -1
- package/tableview/api/action/descriptors/action.descriptor.d.ts +3 -3
- package/tableview/api/action/models/action-confirmation.model.d.ts +4 -2
- package/tableview/api/action/models/execution/action-context.model.d.ts +2 -2
- package/tableview/api/editor/descriptors/editor.descriptor.d.ts +5 -0
- package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +14 -10
- package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +10 -0
- package/tableview/api/editor/descriptors/field.descriptor.d.ts +36 -9
- package/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.d.ts +1 -1
- package/tableview/api/editor/models/field-action-context.model.d.ts +1 -1
- package/tableview/api/editor/models/field.model.d.ts +1 -2
- package/tableview/api/editor/models/form-editor.interface.d.ts +2 -2
- package/tableview/api/editor/models/formly-custom-field.model.d.ts +1 -1
- package/tableview/api/editor/models/formly-field.model.d.ts +2 -2
- package/tableview/editor/components/editor/form-editor.component.d.ts +2 -2
- package/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.d.ts +1 -1
- package/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.d.ts +2 -1
- package/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +4 -6
- package/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.d.ts +0 -2
- package/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.d.ts +2 -2
- package/tableview/editor/components/formly/fields/formly-field-type.abstract.component.d.ts +8 -15
- package/tableview/editor/components/formly/fields/formly-group-type.abstract.component.d.ts +7 -0
- package/tableview/editor/components/formly/fields/formly-type.abstract.component.d.ts +20 -0
- package/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.d.ts +11 -4
- package/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +2 -1
- package/tableview/editor/helpers/formly-config.d.ts +1 -1
- package/tableview/editor/helpers/notification.d.ts +3 -3
- package/tableview/editor/models/formly-config.model.d.ts +10 -1
- package/tableview/editor/models/formly.model.d.ts +23 -0
- package/tableview/editor/services/form-editor.service.d.ts +2 -2
- package/tableview/tableview/router/tableview-route-builder.d.ts +10 -3
- package/tableview/tableview/services/tableview-feature-config.token.d.ts +1 -1
- package/version-info.json +3 -3
- package/esm2022/core/action/action-data.model.mjs +0 -2
- package/esm2022/core/action/action-parameters.model.mjs +0 -2
- package/esm2022/core/components/notification/notification-wrapper.component.mjs +0 -50
- package/esm2022/core/data-list/data-list-params-helpers.mjs +0 -465
- package/esm2022/core/data-list/data-list.model.mjs +0 -2
- package/esm2022/core/data-list/filter-match.model.mjs +0 -105
- package/esm2022/core/data-list/filter-metadata.model.mjs +0 -2
- package/esm2022/core/data-providers/base.data-provider.mjs +0 -16
- package/esm2022/core/data-providers/lookup.data-provider.mjs +0 -2
- package/esm2022/core/descriptors/action.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/column.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/editor.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/enum.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/filter.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/lookup.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/model.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/table.descriptor.mjs +0 -2
- package/esm2022/core/descriptors/tableview.descriptor.mjs +0 -2
- package/esm2022/core/directives/component.directive.mjs +0 -75
- package/esm2022/core/directives/rerender.directive.mjs +0 -25
- package/esm2022/core/directives/template.directive.mjs +0 -29
- package/esm2022/core/enum/enum-helpers.mjs +0 -90
- package/esm2022/core/enum/enum.model.mjs +0 -2
- package/esm2022/core/error/error-handler.mjs +0 -20
- package/esm2022/core/error/error-helpers.mjs +0 -273
- package/esm2022/core/error/error.model.mjs +0 -33
- package/esm2022/core/helpers/coercion.mjs +0 -55
- package/esm2022/core/helpers/date.mjs +0 -119
- package/esm2022/core/helpers/notification.mjs +0 -21
- package/esm2022/core/helpers/number.mjs +0 -19
- package/esm2022/core/helpers/object.mjs +0 -152
- package/esm2022/core/helpers/route.mjs +0 -58
- package/esm2022/core/helpers/string.mjs +0 -57
- package/esm2022/core/helpers/templates.mjs +0 -4
- package/esm2022/core/helpers/type-helpers.mjs +0 -2
- package/esm2022/core/i18n/i18n-common.mjs +0 -24
- package/esm2022/core/i18n/i18n-error.mjs +0 -29
- package/esm2022/core/i18n/i18n-type.mjs +0 -46
- package/esm2022/core/index.mjs +0 -107
- package/esm2022/core/log/log-publisher-console.service.mjs +0 -40
- package/esm2022/core/log/log.model.mjs +0 -10
- package/esm2022/core/log/logger.service.mjs +0 -131
- package/esm2022/core/mediusinc-mng-commons-core.mjs +0 -5
- package/esm2022/core/models/class-attribute.model.mjs +0 -2
- package/esm2022/core/models/class-service.model.mjs +0 -2
- package/esm2022/core/models/getter.model.mjs +0 -2
- package/esm2022/core/models/i18n.model.mjs +0 -2
- package/esm2022/core/models/menu.model.mjs +0 -2
- package/esm2022/core/models/user.model.mjs +0 -2
- package/esm2022/core/models/version.model.mjs +0 -2
- package/esm2022/core/pipes/boolean.pipe.mjs +0 -34
- package/esm2022/core/pipes/class-map.pipe.mjs +0 -23
- package/esm2022/core/pipes/enum.pipe.mjs +0 -38
- package/esm2022/core/pipes/enumerate-async.pipe.mjs +0 -36
- package/esm2022/core/pipes/enumerate.pipe.mjs +0 -49
- package/esm2022/core/pipes/getter.pipe.mjs +0 -21
- package/esm2022/core/pipes/i18n-property.pipe.mjs +0 -19
- package/esm2022/core/pipes/json-path.pipe.mjs +0 -25
- package/esm2022/core/pipes/parametrize.pipe.mjs +0 -86
- package/esm2022/core/pipes/template.pipe.mjs +0 -25
- package/esm2022/core/provide.mjs +0 -79
- package/esm2022/core/reactivity/effect.mjs +0 -22
- package/esm2022/core/reflect/type-enum-decorator.mjs +0 -12
- package/esm2022/core/reflect/type-enum-metadata.mjs +0 -62
- package/esm2022/core/registry/registry.model.mjs +0 -2
- package/esm2022/core/registry/type-registry.mjs +0 -106
- package/esm2022/core/router/route-builder.mjs +0 -431
- package/esm2022/core/router/router.model.mjs +0 -2
- package/esm2022/core/router/routes-builder.mjs +0 -52
- package/esm2022/core/rxjs/map-data-list-result-operator.mjs +0 -22
- package/esm2022/core/security/permission-helpers.mjs +0 -14
- package/esm2022/core/security/permission.guard.mjs +0 -15
- package/esm2022/core/security/permission.service.mjs +0 -101
- package/esm2022/core/security/permissions.model.mjs +0 -93
- package/esm2022/core/services/commons-configuration.service.mjs +0 -189
- package/esm2022/core/services/commons-init.service.mjs +0 -111
- package/esm2022/core/services/commons-router.service.mjs +0 -181
- package/esm2022/core/services/commons-storage.service.mjs +0 -31
- package/esm2022/core/services/commons.service.mjs +0 -324
- package/esm2022/core/services/providers/commons-init.provider.mjs +0 -4
- package/esm2022/core/services/tokens/browser-storage.token.mjs +0 -3
- package/esm2022/core/services/tokens/commons-init.token.mjs +0 -3
- package/esm2022/core/services/tokens/log-publisher.token.mjs +0 -3
- package/esm2022/core/services/tokens/module-config.token.mjs +0 -3
- package/esm2022/core/styles/style-constants.mjs +0 -11
- package/esm2022/core/styles/style.model.mjs +0 -20
- package/esm2022/filter/descriptors/filter-generic.descriptor.mjs +0 -31
- package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +0 -168
- package/esm2022/filter/descriptors/filter.descriptor.mjs +0 -421
- package/esm2022/filter/index.mjs +0 -8
- package/esm2022/filter/mediusinc-mng-commons-filter.mjs +0 -5
- package/esm2022/filter/models/filter-generic-property.model.mjs +0 -2
- package/esm2022/filter/models/filter.model.mjs +0 -20
- package/esm2022/form/api/data-providers/lookup-data-provider.factory.mjs +0 -15
- package/esm2022/form/api/data-providers/lookup.data-provider.mjs +0 -15
- package/esm2022/form/api/descriptors/action-button.descriptor.mjs +0 -56
- package/esm2022/form/api/descriptors/button-style.builder.mjs +0 -153
- package/esm2022/form/api/index.mjs +0 -10
- package/esm2022/form/api/mediusinc-mng-commons-form-api.mjs +0 -5
- package/esm2022/form/api/models/button.model.mjs +0 -2
- package/esm2022/form/api/models/trim.model.mjs +0 -2
- package/esm2022/form/components/autocomplete/autocomplete.component.mjs +0 -436
- package/esm2022/form/components/date-range/date-range.component.mjs +0 -147
- package/esm2022/form/components/dropdown/dropdown.component.mjs +0 -372
- package/esm2022/form/components/number-range/number-range.component.mjs +0 -123
- package/esm2022/form/directives/input-trim.directive.mjs +0 -50
- package/esm2022/form/index.mjs +0 -8
- package/esm2022/form/mediusinc-mng-commons-form.mjs +0 -5
- package/esm2022/index.mjs +0 -2
- package/esm2022/mediusinc-mng-commons.mjs +0 -5
- package/esm2022/model/class/data-providers/base-from-class-data-provider.factory.mjs +0 -5
- package/esm2022/model/class/descriptors/model-class.descriptor.mjs +0 -28
- package/esm2022/model/class/descriptors/type-class.descriptor.mjs +0 -6
- package/esm2022/model/class/helpers/model.mjs +0 -53
- package/esm2022/model/class/index.mjs +0 -8
- package/esm2022/model/class/mediusinc-mng-commons-model-class.mjs +0 -5
- package/esm2022/model/data-providers/base-from-type-data-provider.factory.mjs +0 -13
- package/esm2022/model/descriptors/enum.descriptor.mjs +0 -28
- package/esm2022/model/descriptors/model.descriptor.mjs +0 -53
- package/esm2022/model/descriptors/type.descriptor.mjs +0 -7
- package/esm2022/model/helpers/i18n.mjs +0 -47
- package/esm2022/model/index.mjs +0 -9
- package/esm2022/model/mediusinc-mng-commons-model.mjs +0 -5
- package/esm2022/provide.mjs +0 -6
- package/esm2022/table/api/class/class-table-attribute-converter.mjs +0 -80
- package/esm2022/table/api/class/class-table-attribute.model.mjs +0 -2
- package/esm2022/table/api/class/class-table-data-provider.factory.mjs +0 -5
- package/esm2022/table/api/class/class-table-descriptor-helpers.mjs +0 -99
- package/esm2022/table/api/class/class-table-descriptor.factory.mjs +0 -21
- package/esm2022/table/api/class/index.mjs +0 -6
- package/esm2022/table/api/class/mediusinc-mng-commons-table-api-class.mjs +0 -5
- package/esm2022/table/api/data-providers/table-data-provider.factory.mjs +0 -15
- package/esm2022/table/api/data-providers/table.data-provider.mjs +0 -33
- package/esm2022/table/api/descriptors/column.descriptor.mjs +0 -475
- package/esm2022/table/api/descriptors/sort.descriptor.mjs +0 -67
- package/esm2022/table/api/descriptors/table-descriptor.factory.mjs +0 -22
- package/esm2022/table/api/descriptors/table.descriptor.mjs +0 -1116
- package/esm2022/table/api/helpers/column-converter.mjs +0 -25
- package/esm2022/table/api/helpers/table-data-provider-descriptor-convert.mjs +0 -7
- package/esm2022/table/api/index.mjs +0 -19
- package/esm2022/table/api/mediusinc-mng-commons-table-api.mjs +0 -5
- package/esm2022/table/api/models/column-value.model.mjs +0 -2
- package/esm2022/table/api/models/column.model.mjs +0 -21
- package/esm2022/table/api/models/row-expandable-component.model.mjs +0 -2
- package/esm2022/table/api/models/table-columns.model.mjs +0 -2
- package/esm2022/table/api/models/table-event.model.mjs +0 -2
- package/esm2022/table/api/models/table.model.mjs +0 -21
- package/esm2022/table/components/column-filter/column-filter.component.mjs +0 -389
- package/esm2022/table/components/column-value/column-value.component.mjs +0 -78
- package/esm2022/table/components/filter/filter-active-tag/filter-active-tag.component.mjs +0 -55
- package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +0 -226
- package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +0 -219
- package/esm2022/table/components/table/table.component.mjs +0 -319
- package/esm2022/table/helpers/filters.mjs +0 -312
- package/esm2022/table/helpers/notification.mjs +0 -21
- package/esm2022/table/helpers/table-layout-prefs.mjs +0 -10
- package/esm2022/table/helpers/table.mjs +0 -24
- package/esm2022/table/index.mjs +0 -24
- package/esm2022/table/mediusinc-mng-commons-table.mjs +0 -5
- package/esm2022/table/models/column-preferences.model.mjs +0 -2
- package/esm2022/table/models/filter.model.mjs +0 -2
- package/esm2022/table/pipes/filter-value.pipe.mjs +0 -77
- package/esm2022/table/pipes/locale-default-row-class.pipe.mjs +0 -27
- package/esm2022/table/pipes/table-column-filter-class.pipe.mjs +0 -25
- package/esm2022/table/provide.mjs +0 -19
- package/esm2022/table/services/table-data.service.mjs +0 -194
- package/esm2022/table/services/table-feature-config.token.mjs +0 -3
- package/esm2022/table/services/table-metadata.service.mjs +0 -136
- package/esm2022/table/services/table-preferences.service.mjs +0 -142
- package/esm2022/tableview/action/components/action/action.component.mjs +0 -277
- package/esm2022/tableview/action/components/editor/action-editor.component.mjs +0 -86
- package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +0 -428
- package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +0 -35
- package/esm2022/tableview/action/components/route/action-route.component.mjs +0 -146
- package/esm2022/tableview/action/components/table/action-table.component.mjs +0 -102
- package/esm2022/tableview/action/guards/unsaved-changes.guard.mjs +0 -4
- package/esm2022/tableview/action/helpers/action-execution.mjs +0 -25
- package/esm2022/tableview/action/helpers/i18n.mjs +0 -102
- package/esm2022/tableview/action/helpers/notification.mjs +0 -78
- package/esm2022/tableview/action/helpers/styles.mjs +0 -32
- package/esm2022/tableview/action/models/action-editor-dialog-data.model.mjs +0 -2
- package/esm2022/tableview/action/models/can-component-deactivate.model.mjs +0 -2
- package/esm2022/tableview/action/models/execution/action-context.model.mjs +0 -64
- package/esm2022/tableview/action/models/execution/action-instance.model.mjs +0 -169
- package/esm2022/tableview/action/services/action-error-mapper.service.mjs +0 -20
- package/esm2022/tableview/action/services/action-executor.service.mjs +0 -772
- package/esm2022/tableview/action/services/component-action-executor.service.mjs +0 -19
- package/esm2022/tableview/action/services/data-provider-executor.service.mjs +0 -41
- package/esm2022/tableview/action/services/navigation.service.mjs +0 -53
- package/esm2022/tableview/action/services/providers/provide-action-executor.mjs +0 -9
- package/esm2022/tableview/action/services/providers/provide-view-container.mjs +0 -17
- package/esm2022/tableview/action/services/root-action-executor.service.mjs +0 -18
- package/esm2022/tableview/action/services/tokens/action-editor.token.mjs +0 -3
- package/esm2022/tableview/action/services/view-container.service.mjs +0 -40
- package/esm2022/tableview/api/action/descriptors/action-descriptor.factory.mjs +0 -28
- package/esm2022/tableview/api/action/descriptors/action-editor-descriptor.factory.mjs +0 -30
- package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +0 -223
- package/esm2022/tableview/api/action/descriptors/action-link-descriptor.factory.mjs +0 -32
- package/esm2022/tableview/api/action/descriptors/action-link.descriptor.mjs +0 -74
- package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +0 -302
- package/esm2022/tableview/api/action/descriptors/editor-action-descriptor.factory.mjs +0 -21
- package/esm2022/tableview/api/action/descriptors/editor-action-editor-descriptor.factory.mjs +0 -21
- package/esm2022/tableview/api/action/descriptors/table-action-descriptor.factory.mjs +0 -37
- package/esm2022/tableview/api/action/descriptors/table-action-editor-descriptor.factory.mjs +0 -40
- package/esm2022/tableview/api/action/helpers/data-provider-executors.mjs +0 -100
- package/esm2022/tableview/api/action/models/action-component.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/action-confirmation.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/action-descriptor.types.mjs +0 -2
- package/esm2022/tableview/api/action/models/action-editor.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/action-error.model.mjs +0 -14
- package/esm2022/tableview/api/action/models/action.type.mjs +0 -26
- package/esm2022/tableview/api/action/models/execution/action-context-validation.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/execution/action-context.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/execution/action-execution-error.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/execution/action-instance-state.model.mjs +0 -32
- package/esm2022/tableview/api/action/models/execution/action-instance.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/execution/view-container.model.mjs +0 -2
- package/esm2022/tableview/api/action/models/tableview-action-default-categories.model.mjs +0 -11
- package/esm2022/tableview/api/action/services/data-provider-executor.service.mjs +0 -28
- package/esm2022/tableview/api/action/services/tokens/data-language-dropdown.token.mjs +0 -3
- package/esm2022/tableview/api/class/editor/class-editor-attribute-converter.mjs +0 -85
- package/esm2022/tableview/api/class/editor/class-editor-attribute.model.mjs +0 -2
- package/esm2022/tableview/api/class/editor/class-editor-data-provider.factory.mjs +0 -5
- package/esm2022/tableview/api/class/editor/class-editor-descriptor-helpers.mjs +0 -95
- package/esm2022/tableview/api/class/editor/class-editor-descriptor.factory.mjs +0 -21
- package/esm2022/tableview/api/class/index.mjs +0 -13
- package/esm2022/tableview/api/class/mediusinc-mng-commons-tableview-api-class.mjs +0 -5
- package/esm2022/tableview/api/class/tableview/class-tableview-attribute-converter.mjs +0 -35
- package/esm2022/tableview/api/class/tableview/class-tableview-attribute.model.mjs +0 -2
- package/esm2022/tableview/api/class/tableview/class-tableview-data-provider.factory.mjs +0 -5
- package/esm2022/tableview/api/class/tableview/class-tableview-descriptor-helpers.mjs +0 -111
- package/esm2022/tableview/api/class/tableview/class-tableview-descriptor.factory.mjs +0 -26
- package/esm2022/tableview/api/editor/data-providers/editor-data-provider.factory.mjs +0 -15
- package/esm2022/tableview/api/editor/data-providers/editor.data-provider.mjs +0 -114
- package/esm2022/tableview/api/editor/descriptors/editor-descriptor.factory.mjs +0 -15
- package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +0 -437
- package/esm2022/tableview/api/editor/descriptors/field-action.descriptor.mjs +0 -51
- package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +0 -314
- package/esm2022/tableview/api/editor/descriptors/field-group.descriptor.mjs +0 -103
- package/esm2022/tableview/api/editor/descriptors/field-lookup.descriptor.mjs +0 -211
- package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +0 -142
- package/esm2022/tableview/api/editor/descriptors/field-validation.descriptor.mjs +0 -25
- package/esm2022/tableview/api/editor/descriptors/field.descriptor.mjs +0 -402
- package/esm2022/tableview/api/editor/descriptors/wrappers/editor-descriptor-nested-object-wrapper.mjs +0 -51
- package/esm2022/tableview/api/editor/models/editor-fields.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/editor.model.mjs +0 -9
- package/esm2022/tableview/api/editor/models/field-action-context.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/field-image-preview.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/field-validation.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/field.model.mjs +0 -57
- package/esm2022/tableview/api/editor/models/form-editor.event.mjs +0 -28
- package/esm2022/tableview/api/editor/models/form-editor.interface.mjs +0 -2
- package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +0 -70
- package/esm2022/tableview/api/editor/models/formly-field.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/formly-options.model.mjs +0 -2
- package/esm2022/tableview/api/editor/models/radio.model.mjs +0 -2
- package/esm2022/tableview/api/index.mjs +0 -76
- package/esm2022/tableview/api/mediusinc-mng-commons-tableview-api.mjs +0 -5
- package/esm2022/tableview/api/tableview/data-providers/tableview-data-provider.factory.mjs +0 -18
- package/esm2022/tableview/api/tableview/data-providers/tableview.data-provider.mjs +0 -84
- package/esm2022/tableview/api/tableview/descriptors/tableview-descriptor.factory.mjs +0 -34
- package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +0 -377
- package/esm2022/tableview/api/tableview/helpers/files-export.mjs +0 -34
- package/esm2022/tableview/api/tableview/helpers/tableview-create.mjs +0 -26
- package/esm2022/tableview/api/tableview/helpers/tableview-data-provider-descriptor-convert.mjs +0 -7
- package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +0 -324
- package/esm2022/tableview/api/tableview/helpers/tableview-input-builder.mjs +0 -319
- package/esm2022/tableview/api/tableview/models/tableview-descriptor-fields-manage-helper.type.mjs +0 -2
- package/esm2022/tableview/api/tableview/models/tableview-descriptor-helper.type.mjs +0 -2
- package/esm2022/tableview/api/tableview/models/tableview-input.model.mjs +0 -2
- package/esm2022/tableview/api/tableview/models/tableview-route.model.mjs +0 -2
- package/esm2022/tableview/editor/components/editor/auto-save-status/auto-save-status.component.mjs +0 -82
- package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +0 -480
- package/esm2022/tableview/editor/components/formly/constants.mjs +0 -2
- package/esm2022/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.mjs +0 -66
- package/esm2022/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +0 -47
- package/esm2022/tableview/editor/components/formly/fields/formly-field-custom/formly-field-custom.component.mjs +0 -39
- package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +0 -165
- package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +0 -42
- package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +0 -34
- package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +0 -211
- package/esm2022/tableview/editor/components/formly/fields/formly-field-label/formly-field-label.component.mjs +0 -23
- package/esm2022/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +0 -195
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +0 -239
- package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +0 -205
- package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +0 -28
- package/esm2022/tableview/editor/components/formly/fields/formly-field-type.abstract.component.mjs +0 -46
- package/esm2022/tableview/editor/components/formly/pipes/formly-field-label.pipe.mjs +0 -19
- package/esm2022/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +0 -33
- package/esm2022/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +0 -59
- package/esm2022/tableview/editor/helpers/editor-autosave.mjs +0 -49
- package/esm2022/tableview/editor/helpers/editor-field.mjs +0 -39
- package/esm2022/tableview/editor/helpers/editor-formly.mjs +0 -388
- package/esm2022/tableview/editor/helpers/editor-validators.mjs +0 -25
- package/esm2022/tableview/editor/helpers/field-create.mjs +0 -21
- package/esm2022/tableview/editor/helpers/formly-config.mjs +0 -260
- package/esm2022/tableview/editor/helpers/notification.mjs +0 -11
- package/esm2022/tableview/editor/models/editor-auto-save-preview.model.mjs +0 -2
- package/esm2022/tableview/editor/models/formly-config.model.mjs +0 -2
- package/esm2022/tableview/editor/services/form-editor.service.mjs +0 -96
- package/esm2022/tableview/editor/services/formly-config.provider.mjs +0 -31
- package/esm2022/tableview/index.mjs +0 -67
- package/esm2022/tableview/mediusinc-mng-commons-tableview.mjs +0 -5
- package/esm2022/tableview/provide.mjs +0 -105
- package/esm2022/tableview/tableview/components/route/tableview-route.component.mjs +0 -15
- package/esm2022/tableview/tableview/components/tableview/tableview.component.mjs +0 -59
- package/esm2022/tableview/tableview/router/tableview-route-builder.mjs +0 -175
- package/esm2022/tableview/tableview/services/tableview-feature-config.token.mjs +0 -3
|
@@ -1,480 +0,0 @@
|
|
|
1
|
-
import { DatePipe } from '@angular/common';
|
|
2
|
-
import { ChangeDetectionStrategy, Component, DestroyRef, ElementRef, afterNextRender, booleanAttribute, computed, effect, inject, input, model, output, signal, untracked, viewChild } from '@angular/core';
|
|
3
|
-
import { outputFromObservable, takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
|
|
4
|
-
import { FormArray, FormGroup, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';
|
|
5
|
-
import { Router } from '@angular/router';
|
|
6
|
-
import { FormlyConfig, FormlyModule } from '@ngx-formly/core';
|
|
7
|
-
import { TranslateModule, TranslateService } from '@ngx-translate/core';
|
|
8
|
-
import { ButtonModule } from 'primeng/button';
|
|
9
|
-
import { MessagesModule } from 'primeng/messages';
|
|
10
|
-
import { BehaviorSubject, debounceTime, delay, distinctUntilChanged, of, switchMap, tap } from 'rxjs';
|
|
11
|
-
import { map } from 'rxjs/operators';
|
|
12
|
-
import { CommonsService, CommonsStorageService, LoggerService, StyleLevelEnum, StyleSizeEnum, objectDeepCopy } from '@mediusinc/mng-commons/core';
|
|
13
|
-
import { ButtonStyleBuilder } from '@mediusinc/mng-commons/form/api';
|
|
14
|
-
import { FormEventTypeEnum, FormFieldEventComponentSubtype, TableviewEditorTypeEnum } from '@mediusinc/mng-commons/tableview/api';
|
|
15
|
-
import { generateAutosaveEditorKey } from '../../helpers/editor-autosave';
|
|
16
|
-
import { createFormlyConfigFromDescriptor } from '../../helpers/editor-formly';
|
|
17
|
-
import { getFormEditorInfoMessage, getFormEditorWarningMessage } from '../../helpers/notification';
|
|
18
|
-
import { FormEditorService, provideFormComponent } from '../../services/form-editor.service';
|
|
19
|
-
import { EditorAutoSaveStatusComponent } from './auto-save-status/auto-save-status.component';
|
|
20
|
-
import * as i0 from "@angular/core";
|
|
21
|
-
import * as i1 from "@ngx-formly/core";
|
|
22
|
-
import * as i2 from "@angular/forms";
|
|
23
|
-
import * as i3 from "primeng/messages";
|
|
24
|
-
import * as i4 from "primeng/api";
|
|
25
|
-
import * as i5 from "primeng/button";
|
|
26
|
-
import * as i6 from "@ngx-translate/core";
|
|
27
|
-
export class FormEditorComponent {
|
|
28
|
-
get parent() {
|
|
29
|
-
return this.formService.parent;
|
|
30
|
-
}
|
|
31
|
-
get form() {
|
|
32
|
-
return this._form;
|
|
33
|
-
}
|
|
34
|
-
get formUnsafe() {
|
|
35
|
-
return this._form;
|
|
36
|
-
}
|
|
37
|
-
get formlyOptions() {
|
|
38
|
-
return this._formlyOptions;
|
|
39
|
-
}
|
|
40
|
-
get formlyFields() {
|
|
41
|
-
return this._formlyFields;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Only used for form initialization. Further changes should be done using {resetFormModel}.
|
|
45
|
-
*/
|
|
46
|
-
get formlyInitialItem() {
|
|
47
|
-
return this._formlyInitialItem;
|
|
48
|
-
}
|
|
49
|
-
constructor() {
|
|
50
|
-
this.destroyRef = inject(DestroyRef);
|
|
51
|
-
this.elementRef = inject(ElementRef);
|
|
52
|
-
this.formlyConfig = inject(FormlyConfig);
|
|
53
|
-
this.translateService = inject(TranslateService);
|
|
54
|
-
this.commons = inject(CommonsService);
|
|
55
|
-
this.cmpTypeName = 'FormEditorComponent';
|
|
56
|
-
this.logger = inject(LoggerService).create(this.cmpTypeName);
|
|
57
|
-
this.formService = inject((FormEditorService));
|
|
58
|
-
this.commonsStorageService = inject(CommonsStorageService);
|
|
59
|
-
this.router = inject(Router);
|
|
60
|
-
this.autoSaveStorageKeyCompInit = true;
|
|
61
|
-
this.autoSaveStorageKey = computed(() => generateAutosaveEditorKey(this.descriptor(), this.item(), this.router.url, { editorId: this.editorId(), itemId: this.itemId() }));
|
|
62
|
-
this.descriptor = input.required();
|
|
63
|
-
this.submitLoading = input(false, { transform: booleanAttribute });
|
|
64
|
-
this.item = model(undefined);
|
|
65
|
-
this.isFormDisabled = input(false, { transform: booleanAttribute });
|
|
66
|
-
this.editorId = input(undefined);
|
|
67
|
-
this.itemId = input(undefined);
|
|
68
|
-
this.showAutoSaveStatus = input(true, { transform: booleanAttribute });
|
|
69
|
-
// event outputs
|
|
70
|
-
this.formSubmit = output();
|
|
71
|
-
this.valueChange = output();
|
|
72
|
-
this.autoSaveStatusSubject = new BehaviorSubject({ state: 'initial', timestamp: new Date() });
|
|
73
|
-
this.autoSaveStatus = outputFromObservable(this.autoSaveStatusSubject.asObservable());
|
|
74
|
-
// content and view queries
|
|
75
|
-
this.submitButtonElementRef = viewChild('submitButton');
|
|
76
|
-
this.focusThiefElRef = viewChild('focusThiefInput');
|
|
77
|
-
// formly specifics
|
|
78
|
-
this._form = new UntypedFormGroup({});
|
|
79
|
-
this._formlyStateDisabledSubject = new BehaviorSubject(false);
|
|
80
|
-
this._formlyStateDisabled = toSignal(this._formlyStateDisabledSubject);
|
|
81
|
-
this._formlyOptions = {
|
|
82
|
-
formState: {
|
|
83
|
-
add: false,
|
|
84
|
-
edit: false,
|
|
85
|
-
disabled: false,
|
|
86
|
-
disabled$: this._formlyStateDisabledSubject.asObservable().pipe(distinctUntilChanged())
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
this._formlyFields = []; // initialized in ngOnInit, should not be changed after
|
|
90
|
-
this._formlyInitialItem = {}; // initialized in ngOnInit, should not be changed after
|
|
91
|
-
this.setterFields = computed(() => this.descriptor().fields.filter(f => typeof f.setter === 'function'));
|
|
92
|
-
this.formMessages = signal([]);
|
|
93
|
-
// autosave
|
|
94
|
-
this.restoreLocalStateButtonStyle = ButtonStyleBuilder.from({ level: StyleLevelEnum.Success, size: StyleSizeEnum.Small }).build();
|
|
95
|
-
this.previewLocalStateButtonStyle = ButtonStyleBuilder.from({ level: StyleLevelEnum.Info, size: StyleSizeEnum.Small }).build();
|
|
96
|
-
this.clearLocalStateButtonStyle = ButtonStyleBuilder.from({ level: StyleLevelEnum.Danger, size: StyleSizeEnum.Small, rounded: false, textButton: true }).build();
|
|
97
|
-
this.autoSaveRestore = signal(null);
|
|
98
|
-
this.autoSave = toSignal(this.autoSaveStatusSubject);
|
|
99
|
-
this.autoSavePreviewButtonLabel = computed(() => {
|
|
100
|
-
switch (this.autoSave()?.state) {
|
|
101
|
-
case 'preview':
|
|
102
|
-
return 'mngEditor.autoSave.restore.previewCurrent';
|
|
103
|
-
case 'previewCurrent':
|
|
104
|
-
return 'mngEditor.autoSave.restore.previewAutosaved';
|
|
105
|
-
default:
|
|
106
|
-
return 'mngEditor.autoSave.restore.preview';
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
this.autoSaveShowRestore = computed(() => this.autoSaveRestore()?.saved != null);
|
|
110
|
-
this.autoSavePreviewDisabledForm = signal(false);
|
|
111
|
-
// autofocus
|
|
112
|
-
this.autofocusEnabled = computed(() => (this.descriptor().autofocusOnField ?? true) && !this._formlyStateDisabled());
|
|
113
|
-
this.formService.init(this);
|
|
114
|
-
effect(() => {
|
|
115
|
-
const item = this.item();
|
|
116
|
-
if (item !== this.initialItemInput) {
|
|
117
|
-
// new item is different from the one the form was initialized with. Must trigger reset of form model.
|
|
118
|
-
// should be executed in untracked mode, because it updates multiple components underneath
|
|
119
|
-
untracked(() => this.resetFormModel(item));
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
effect(() => {
|
|
123
|
-
this._formlyOptions.formState.disabled =
|
|
124
|
-
this.isFormDisabled() || this.autoSavePreviewDisabledForm() || this._formlyOptions.formState.descriptor?.disabled === true || this._formlyOptions.formState.details;
|
|
125
|
-
untracked(() => {
|
|
126
|
-
this._formlyStateDisabledSubject.next(this._formlyOptions.formState.disabled);
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
afterNextRender(() => {
|
|
130
|
-
if (this.autofocusEnabled()) {
|
|
131
|
-
setTimeout(() => {
|
|
132
|
-
const formFields = this.elementRef.nativeElement.querySelectorAll('input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [role="combobox"]:not([disabled])');
|
|
133
|
-
const activeEl = document.activeElement;
|
|
134
|
-
const activeInputIdx = activeEl ? [...formFields].findIndex(el => activeEl.isEqualNode(el)) : 0;
|
|
135
|
-
if (activeInputIdx <= 0 && this.focusThiefElRef()?.nativeElement.isEqualNode(formFields[0])) {
|
|
136
|
-
// only if focus on focus theif (or no focus), go the next field (of first on)
|
|
137
|
-
const targetIndex = (activeInputIdx <= 0 ? 1 : activeInputIdx + 1) % formFields.length;
|
|
138
|
-
formFields[targetIndex].focus();
|
|
139
|
-
}
|
|
140
|
-
}, 500);
|
|
141
|
-
}
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
ngOnInit() {
|
|
145
|
-
// init form state
|
|
146
|
-
if (this.descriptor().tableviewEditorType === TableviewEditorTypeEnum.Add) {
|
|
147
|
-
this._formlyOptions.formState.add = true;
|
|
148
|
-
}
|
|
149
|
-
else if (this.descriptor().tableviewEditorType === TableviewEditorTypeEnum.Edit) {
|
|
150
|
-
this._formlyOptions.formState.edit = true;
|
|
151
|
-
}
|
|
152
|
-
else if (this.descriptor().tableviewEditorType === TableviewEditorTypeEnum.Details) {
|
|
153
|
-
this._formlyOptions.formState.details = true;
|
|
154
|
-
}
|
|
155
|
-
this._formlyOptions.formState.descriptor = this.descriptor();
|
|
156
|
-
// init fields for formly
|
|
157
|
-
this._formlyFields = createFormlyConfigFromDescriptor(this.descriptor(), this.formlyConfig, this);
|
|
158
|
-
// int form model (only initial, no further changes to formModel should be allowed!)
|
|
159
|
-
this.initialItemInput = this.item();
|
|
160
|
-
this._formlyInitialItem = this.getFormModelFromItem(this.item());
|
|
161
|
-
// handle localizations edit/add message
|
|
162
|
-
if (this.descriptor().isLocalized &&
|
|
163
|
-
(this.descriptor().tableviewEditorType === TableviewEditorTypeEnum.Add || this.descriptor().tableviewEditorType === TableviewEditorTypeEnum.Edit)) {
|
|
164
|
-
this.formMessages.set([
|
|
165
|
-
...this.formMessages(),
|
|
166
|
-
getFormEditorInfoMessage(this.translateService, 'mngEditor.localizations.addInDefaultLanguageTitle', 'mngEditor.localizations.addInDefaultLanguageDescription', {
|
|
167
|
-
defaultLanguage: this.commons.getDefaultLocale()
|
|
168
|
-
})
|
|
169
|
-
]);
|
|
170
|
-
}
|
|
171
|
-
// emit lifecycle event
|
|
172
|
-
this.descriptor().nextEvent(FormEventTypeEnum.ComponentLifecycle, this, {
|
|
173
|
-
eventSubtype: FormFieldEventComponentSubtype.ON_INIT
|
|
174
|
-
});
|
|
175
|
-
this._form.valueChanges
|
|
176
|
-
.pipe(debounceTime(100), distinctUntilChanged(), map(() => this._form.getRawValue()), takeUntilDestroyed(this.destroyRef))
|
|
177
|
-
.subscribe(v => {
|
|
178
|
-
this.valueChange?.emit(v);
|
|
179
|
-
this.descriptor().nextEvent(FormEventTypeEnum.ValueChange, this, {
|
|
180
|
-
value: v,
|
|
181
|
-
formValue: () => this.getFormValue()
|
|
182
|
-
});
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
ngAfterViewInit() {
|
|
186
|
-
// mark form as pristine, should be done in next event hook to allow formly to initialize first
|
|
187
|
-
this._form.markAsPristine();
|
|
188
|
-
this.autoSaveLoadSavedFromStorage();
|
|
189
|
-
this.autoSaveStartEventChangeListen(this.autoSaveStorageKeyCompInit);
|
|
190
|
-
this.autoSaveStorageKeyCompInit = false;
|
|
191
|
-
}
|
|
192
|
-
ngOnDestroy() {
|
|
193
|
-
this.autoSaveStopValueChangeListen();
|
|
194
|
-
// emit lifecycle event
|
|
195
|
-
this.descriptor().nextEvent(FormEventTypeEnum.ComponentLifecycle, this, {
|
|
196
|
-
eventSubtype: FormFieldEventComponentSubtype.ON_DESTROY
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
submit() {
|
|
200
|
-
this.submitButtonElementRef()?.nativeElement.click();
|
|
201
|
-
}
|
|
202
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
203
|
-
onSubmit(event) {
|
|
204
|
-
this._formlyOptions.formState.submittedOn = Date.now();
|
|
205
|
-
this.formMessages.set([]);
|
|
206
|
-
const formSubmitItem = this.getFormValue();
|
|
207
|
-
if (this._form.valid) {
|
|
208
|
-
this.formSubmit.emit({
|
|
209
|
-
success: true,
|
|
210
|
-
formItem: formSubmitItem
|
|
211
|
-
});
|
|
212
|
-
this.descriptor().nextEvent(FormEventTypeEnum.Submit, this, {
|
|
213
|
-
submitValid: true,
|
|
214
|
-
submitValue: formSubmitItem
|
|
215
|
-
});
|
|
216
|
-
this.onAutoSaveDismiss();
|
|
217
|
-
}
|
|
218
|
-
else {
|
|
219
|
-
// find and mark invalid tabs
|
|
220
|
-
const formFields = this._formlyFields;
|
|
221
|
-
if (formFields[0].type === 'tabs' && formFields[0].fieldGroup) {
|
|
222
|
-
for (const tab of formFields[0].fieldGroup) {
|
|
223
|
-
this._formlyOptions.formState['tab_' + (tab.id ? tab.id : (tab.key ?? '')) + '_invalid'] = this.isAnyFieldInvalid(tab.fieldGroup);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
const event = { success: false, formItem: formSubmitItem };
|
|
227
|
-
event.success = false;
|
|
228
|
-
this.formMessages().push(getFormEditorWarningMessage(this.translateService, 'mngEditor.invalidFormToastTitle', 'mngEditor.invalidFormToastMessage'));
|
|
229
|
-
this.formSubmit.emit(event);
|
|
230
|
-
this.descriptor().nextEvent(FormEventTypeEnum.Submit, this, {
|
|
231
|
-
submitValid: false,
|
|
232
|
-
submitValue: formSubmitItem
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
getFormValue(opts) {
|
|
237
|
-
const formValue = objectDeepCopy(this._form.getRawValue(), { mapGettersToProperties: true });
|
|
238
|
-
if (opts?.omitSetters !== true) {
|
|
239
|
-
this.setterFields().forEach(field => {
|
|
240
|
-
const splitPath = field.property.split('.');
|
|
241
|
-
let fieldValue = formValue;
|
|
242
|
-
for (let i = 0; i < splitPath.length - 1; i++) {
|
|
243
|
-
const currentSubPath = splitPath[i];
|
|
244
|
-
if (typeof fieldValue[currentSubPath] !== 'object') {
|
|
245
|
-
fieldValue[currentSubPath] = {};
|
|
246
|
-
}
|
|
247
|
-
fieldValue = fieldValue[currentSubPath];
|
|
248
|
-
}
|
|
249
|
-
fieldValue = fieldValue[splitPath[splitPath.length - 1]];
|
|
250
|
-
field.setter?.(formValue, fieldValue);
|
|
251
|
-
});
|
|
252
|
-
}
|
|
253
|
-
return formValue;
|
|
254
|
-
}
|
|
255
|
-
resetFormModel(item, opts) {
|
|
256
|
-
// have to use formly's reset model, because _form.reset() does not reset the values correctly
|
|
257
|
-
this._formlyOptions.resetModel?.(this.getFormModelFromItem(item));
|
|
258
|
-
if (opts?.markAsPristine !== false) {
|
|
259
|
-
// mark form as pristine, should be done in next event hook to allow formly to initialize first
|
|
260
|
-
setTimeout(() => {
|
|
261
|
-
this._form.markAsPristine({ onlySelf: opts?.onlySelf });
|
|
262
|
-
});
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
getField(key) {
|
|
266
|
-
return this.getFieldUnsafe(key);
|
|
267
|
-
}
|
|
268
|
-
getFieldUnsafe(key) {
|
|
269
|
-
return this.findFormField(this._form, key.split('.'));
|
|
270
|
-
}
|
|
271
|
-
setFieldValue(key, value, opts) {
|
|
272
|
-
return this.setFieldValueUnsafe(key, value, opts);
|
|
273
|
-
}
|
|
274
|
-
setFieldValueUnsafe(key, value, opts) {
|
|
275
|
-
const control = this.getFieldUnsafe(key);
|
|
276
|
-
if (control) {
|
|
277
|
-
control.setValue(value, opts);
|
|
278
|
-
return true;
|
|
279
|
-
}
|
|
280
|
-
else {
|
|
281
|
-
this.logger.warn(`Value was not set, because field ${key} was not found.`);
|
|
282
|
-
return false;
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
patchFieldValue(key, value, opts) {
|
|
286
|
-
return this.patchFieldValueUnsafe(key, value, opts);
|
|
287
|
-
}
|
|
288
|
-
patchFieldValueUnsafe(key, value, opts) {
|
|
289
|
-
const control = this.getFieldUnsafe(key);
|
|
290
|
-
if (control) {
|
|
291
|
-
control.patchValue(value, opts);
|
|
292
|
-
return true;
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
this.logger.warn(`Value was not set, because field ${key} was not found.`);
|
|
296
|
-
return false;
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
resetFieldValue(key, value, opts) {
|
|
300
|
-
return this.resetFieldValueUnsafe(key, value, opts);
|
|
301
|
-
}
|
|
302
|
-
resetFieldValueUnsafe(key, value, opts) {
|
|
303
|
-
const control = this.getFieldUnsafe(key);
|
|
304
|
-
if (control) {
|
|
305
|
-
control.reset(value, opts);
|
|
306
|
-
return true;
|
|
307
|
-
}
|
|
308
|
-
else {
|
|
309
|
-
this.logger.warn(`Value was not set, because field ${key} was not found.`);
|
|
310
|
-
return false;
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Restores the saved local state.
|
|
315
|
-
* If local storage keys exist for local state and local timestamp, restore their corresponding values.
|
|
316
|
-
*/
|
|
317
|
-
onAutoSaveRestore() {
|
|
318
|
-
const restore = this.autoSaveRestore();
|
|
319
|
-
if (restore?.saved) {
|
|
320
|
-
this.autoSaveStopValueChangeListen();
|
|
321
|
-
this.resetFormModel(restore.saved);
|
|
322
|
-
this.autoSaveRestore.set(null);
|
|
323
|
-
this.autoSaveStatusSubject.next({ state: 'restored', timestamp: restore.savedAt ?? new Date() });
|
|
324
|
-
this.autoSavePreviewDisabledForm.set(false);
|
|
325
|
-
this.autoSaveStartEventChangeListen();
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Previews the saved local state.
|
|
330
|
-
* If local storage keys exist for local state and local timestamp, restore their corresponding values.
|
|
331
|
-
*/
|
|
332
|
-
onAutoSavePreview() {
|
|
333
|
-
if (!this.autoSaveRestore()?.saved) {
|
|
334
|
-
return;
|
|
335
|
-
}
|
|
336
|
-
this.autoSaveStopValueChangeListen();
|
|
337
|
-
this.autoSavePreviewDisabledForm.set(true);
|
|
338
|
-
const state = this.autoSaveStatusSubject.value.state;
|
|
339
|
-
if (state !== 'preview' && state !== 'previewCurrent') {
|
|
340
|
-
// must store original value from current value form
|
|
341
|
-
this.autoSaveRestore.update(i => ({ ...i, original: this.getFormValue() }));
|
|
342
|
-
}
|
|
343
|
-
const restore = this.autoSaveRestore();
|
|
344
|
-
if (state === 'preview' && restore?.original) {
|
|
345
|
-
this.resetFormModel(restore.original);
|
|
346
|
-
this.autoSaveStatusSubject.next({ state: 'previewCurrent' });
|
|
347
|
-
}
|
|
348
|
-
else if (state !== 'preview' && restore?.saved) {
|
|
349
|
-
this.resetFormModel(restore.saved);
|
|
350
|
-
this.autoSaveStatusSubject.next({ state: 'preview', timestamp: restore.savedAt ?? new Date() });
|
|
351
|
-
}
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Removes local state from local storage.
|
|
355
|
-
* If local storage keys exist for local state and local timestamp, remove their corresponding values.
|
|
356
|
-
*/
|
|
357
|
-
onAutoSaveDismiss() {
|
|
358
|
-
if (this.autoSaveStorageKey()) {
|
|
359
|
-
this.autoSaveStopValueChangeListen();
|
|
360
|
-
const restore = this.autoSaveRestore();
|
|
361
|
-
if (this.autoSaveStatusSubject.value.state === 'preview' && restore?.original) {
|
|
362
|
-
this.resetFormModel(restore.original);
|
|
363
|
-
this.autoSaveStatusSubject.next({ state: 'initial', timestamp: new Date() });
|
|
364
|
-
}
|
|
365
|
-
this.commonsStorageService.removeItem(this.cmpTypeName, this.autoSaveStorageKey());
|
|
366
|
-
this.autoSaveRestore.set(null);
|
|
367
|
-
this.autoSavePreviewDisabledForm.set(false);
|
|
368
|
-
this.autoSaveStartEventChangeListen();
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
getFormModelFromItem(item) {
|
|
372
|
-
const formModel = objectDeepCopy(item, { mapGettersToProperties: true }) ?? {};
|
|
373
|
-
const descriptor = this.descriptor();
|
|
374
|
-
descriptor.fields.forEach(field => {
|
|
375
|
-
if (field.getter && formModel) {
|
|
376
|
-
const splitPath = field.property.split('.');
|
|
377
|
-
let currentObject = formModel;
|
|
378
|
-
for (let i = 0; i < splitPath.length; i++) {
|
|
379
|
-
const currentSubPath = splitPath[i];
|
|
380
|
-
if (i === splitPath.length - 1) {
|
|
381
|
-
currentObject[currentSubPath] = field.getter(formModel?.[field.property], formModel);
|
|
382
|
-
}
|
|
383
|
-
else {
|
|
384
|
-
if (typeof currentObject[currentSubPath] !== 'object') {
|
|
385
|
-
currentObject[currentSubPath] = {};
|
|
386
|
-
}
|
|
387
|
-
currentObject = currentObject[currentSubPath];
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
});
|
|
392
|
-
return formModel;
|
|
393
|
-
}
|
|
394
|
-
findFormField(control, keyPath) {
|
|
395
|
-
if (keyPath.length === 0) {
|
|
396
|
-
return control;
|
|
397
|
-
}
|
|
398
|
-
if (keyPath.length === 1) {
|
|
399
|
-
return control.get(keyPath[0]);
|
|
400
|
-
}
|
|
401
|
-
let nextControl = null;
|
|
402
|
-
if (control instanceof FormGroup) {
|
|
403
|
-
nextControl = control.get(keyPath[0]);
|
|
404
|
-
}
|
|
405
|
-
else if (control instanceof FormArray) {
|
|
406
|
-
const idx = +keyPath[0];
|
|
407
|
-
if (!isNaN(idx)) {
|
|
408
|
-
nextControl = control.at(idx);
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
if (!control) {
|
|
412
|
-
return null;
|
|
413
|
-
}
|
|
414
|
-
return this.findFormField(nextControl, keyPath.slice(1));
|
|
415
|
-
}
|
|
416
|
-
isAnyFieldInvalid(fields = []) {
|
|
417
|
-
for (const field of fields) {
|
|
418
|
-
let fieldInvalid = false;
|
|
419
|
-
if (Array.isArray(field.fieldGroup)) {
|
|
420
|
-
fieldInvalid = this.isAnyFieldInvalid(field.fieldGroup);
|
|
421
|
-
}
|
|
422
|
-
else if (typeof field.type !== 'undefined') {
|
|
423
|
-
fieldInvalid = !field.formControl?.valid;
|
|
424
|
-
}
|
|
425
|
-
if (fieldInvalid) {
|
|
426
|
-
return true;
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
return false;
|
|
430
|
-
}
|
|
431
|
-
autoSaveStartEventChangeListen(init = false) {
|
|
432
|
-
if (!this.descriptor().autoSave) {
|
|
433
|
-
return;
|
|
434
|
-
}
|
|
435
|
-
if (!this.autoSaveEventsSubscription) {
|
|
436
|
-
this.autoSaveEventsSubscription = of(void 0)
|
|
437
|
-
.pipe(delay(init ? 0 : 500), // delay initial event listening for all the initializations to take place
|
|
438
|
-
switchMap(() => this._form.valueChanges), debounceTime(250), distinctUntilChanged(),
|
|
439
|
-
// skip first one on init
|
|
440
|
-
tap(() => {
|
|
441
|
-
if (this.autoSaveStatusSubject.value.state !== 'saved' && this.autoSaveStatusSubject.value.state !== 'preview')
|
|
442
|
-
this.autoSaveStatusSubject.next({ ...this.autoSaveStatusSubject.value, state: 'saving' });
|
|
443
|
-
}), debounceTime(750))
|
|
444
|
-
.subscribe(() => {
|
|
445
|
-
this.autoSaveSaveToStorage();
|
|
446
|
-
});
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
autoSaveStopValueChangeListen() {
|
|
450
|
-
this.autoSaveEventsSubscription?.unsubscribe();
|
|
451
|
-
this.autoSaveEventsSubscription = undefined;
|
|
452
|
-
}
|
|
453
|
-
/**
|
|
454
|
-
* Saves the form value to localStorage if autoSave is enabled and the required keys are defined.
|
|
455
|
-
* @returns {void}
|
|
456
|
-
*/
|
|
457
|
-
autoSaveSaveToStorage() {
|
|
458
|
-
if (this.descriptor().autoSave !== true || this.autoSaveStatusSubject.value.state === 'preview' || this.autoSaveStatusSubject.value.state === 'previewCurrent') {
|
|
459
|
-
return;
|
|
460
|
-
}
|
|
461
|
-
this.commonsStorageService.setItem(this.cmpTypeName, this.autoSaveStorageKey(), { saved: this.getFormValue(), savedAt: new Date() });
|
|
462
|
-
this.autoSaveStatusSubject.next({ state: 'saved', timestamp: new Date() });
|
|
463
|
-
}
|
|
464
|
-
/**
|
|
465
|
-
* Loads the value from the local storage if available
|
|
466
|
-
*/
|
|
467
|
-
autoSaveLoadSavedFromStorage() {
|
|
468
|
-
const { autoSave, model } = this.descriptor();
|
|
469
|
-
if (autoSave && model.i18nBaseKey) {
|
|
470
|
-
this.autoSaveRestore.set(this.commonsStorageService.getItem(this.cmpTypeName, this.autoSaveStorageKey()) ?? null);
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FormEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
474
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: FormEditorComponent, isStandalone: true, selector: "mng-form-editor", inputs: { descriptor: { classPropertyName: "descriptor", publicName: "descriptor", isSignal: true, isRequired: true, transformFunction: null }, submitLoading: { classPropertyName: "submitLoading", publicName: "submitLoading", isSignal: true, isRequired: false, transformFunction: null }, item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: false, transformFunction: null }, isFormDisabled: { classPropertyName: "isFormDisabled", publicName: "isFormDisabled", isSignal: true, isRequired: false, transformFunction: null }, editorId: { classPropertyName: "editorId", publicName: "editorId", isSignal: true, isRequired: false, transformFunction: null }, itemId: { classPropertyName: "itemId", publicName: "itemId", isSignal: true, isRequired: false, transformFunction: null }, showAutoSaveStatus: { classPropertyName: "showAutoSaveStatus", publicName: "showAutoSaveStatus", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { item: "itemChange", formSubmit: "formSubmit", valueChange: "valueChange", autoSaveStatus: "autoSaveStatus" }, providers: [provideFormComponent()], viewQueries: [{ propertyName: "submitButtonElementRef", first: true, predicate: ["submitButton"], descendants: true, isSignal: true }, { propertyName: "focusThiefElRef", first: true, predicate: ["focusThiefInput"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (autoSaveShowRestore()) {\n <p-messages severity=\"warn\">\n <ng-template pTemplate>\n <div class=\"flex flex-grow-1 justify-content-between align-items-center\">\n <h6 class=\"m-0 p-0\">\n <em class=\"pi pi-save mr-4\"></em>\n {{\n 'mngEditor.autoSave.restore.title'\n | translate: {lastChange: autoSaveRestore()?.savedAt ? (autoSaveRestore()?.savedAt! | date: 'dd. MM. YYYY HH:mm:ss') : ''}\n }}\n </h6>\n <div>\n <p-button\n icon=\"pi pi-sync\"\n size=\"small\"\n [label]=\"'mngEditor.autoSave.restore.restore' | translate\"\n [styleClass]=\"restoreLocalStateButtonStyle\"\n [text]=\"true\"\n (click)=\"onAutoSaveRestore()\"></p-button>\n @if (autoSave()?.state !== 'preview' || autoSave()?.state !== 'previewCurrent') {\n <p-button\n icon=\"pi pi-eye\"\n size=\"small\"\n [label]=\"autoSavePreviewButtonLabel() | translate\"\n [styleClass]=\"previewLocalStateButtonStyle\"\n [text]=\"true\"\n (click)=\"onAutoSavePreview()\"></p-button>\n }\n <p-button\n icon=\"pi pi-times\"\n size=\"small\"\n [label]=\"'mngEditor.autoSave.restore.dismiss' | translate\"\n [styleClass]=\"clearLocalStateButtonStyle\"\n (click)=\"onAutoSaveDismiss()\"></p-button>\n </div>\n </div>\n </ng-template>\n </p-messages>\n}\n\n@if (autofocusEnabled()) {\n <input type=\"hidden\" #focusThiefInput tabindex=\"0\" />\n}\n<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit($event)\">\n <formly-form [form]=\"form\" [fields]=\"formlyFields\" [options]=\"formlyOptions\" [model]=\"formlyInitialItem\"></formly-form>\n <button #submitButton pButton type=\"submit\" class=\"hidden\" [disabled]=\"form.disabled\" [loading]=\"submitLoading()\" loadingIcon=\"pi pi-spin pi-spinner\"></button>\n</form>\n<p-messages [value]=\"formMessages()\" [enableService]=\"false\"></p-messages>\n\n@if (descriptor().autoSave && showAutoSaveStatus()) {\n <mng-editor-auto-save-status [status]=\"autoSave()\"></mng-editor-auto-save-status>\n}\n", dependencies: [{ kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i1.FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MessagesModule }, { kind: "component", type: i3.Messages, selector: "p-messages", inputs: ["value", "closable", "style", "styleClass", "enableService", "key", "escape", "severity", "showTransitionOptions", "hideTransitionOptions"], outputs: ["valueChange", "onClose"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: i5.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "style", "styleClass", "badgeClass", "ariaLabel", "autofocus"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i6.TranslatePipe, name: "translate" }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "component", type: EditorAutoSaveStatusComponent, selector: "mng-editor-auto-save-status", inputs: ["status"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
475
|
-
}
|
|
476
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: FormEditorComponent, decorators: [{
|
|
477
|
-
type: Component,
|
|
478
|
-
args: [{ standalone: true, selector: 'mng-form-editor', imports: [FormlyModule, ReactiveFormsModule, MessagesModule, ButtonModule, TranslateModule, DatePipe, EditorAutoSaveStatusComponent], providers: [provideFormComponent()], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (autoSaveShowRestore()) {\n <p-messages severity=\"warn\">\n <ng-template pTemplate>\n <div class=\"flex flex-grow-1 justify-content-between align-items-center\">\n <h6 class=\"m-0 p-0\">\n <em class=\"pi pi-save mr-4\"></em>\n {{\n 'mngEditor.autoSave.restore.title'\n | translate: {lastChange: autoSaveRestore()?.savedAt ? (autoSaveRestore()?.savedAt! | date: 'dd. MM. YYYY HH:mm:ss') : ''}\n }}\n </h6>\n <div>\n <p-button\n icon=\"pi pi-sync\"\n size=\"small\"\n [label]=\"'mngEditor.autoSave.restore.restore' | translate\"\n [styleClass]=\"restoreLocalStateButtonStyle\"\n [text]=\"true\"\n (click)=\"onAutoSaveRestore()\"></p-button>\n @if (autoSave()?.state !== 'preview' || autoSave()?.state !== 'previewCurrent') {\n <p-button\n icon=\"pi pi-eye\"\n size=\"small\"\n [label]=\"autoSavePreviewButtonLabel() | translate\"\n [styleClass]=\"previewLocalStateButtonStyle\"\n [text]=\"true\"\n (click)=\"onAutoSavePreview()\"></p-button>\n }\n <p-button\n icon=\"pi pi-times\"\n size=\"small\"\n [label]=\"'mngEditor.autoSave.restore.dismiss' | translate\"\n [styleClass]=\"clearLocalStateButtonStyle\"\n (click)=\"onAutoSaveDismiss()\"></p-button>\n </div>\n </div>\n </ng-template>\n </p-messages>\n}\n\n@if (autofocusEnabled()) {\n <input type=\"hidden\" #focusThiefInput tabindex=\"0\" />\n}\n<form [formGroup]=\"form\" (ngSubmit)=\"onSubmit($event)\">\n <formly-form [form]=\"form\" [fields]=\"formlyFields\" [options]=\"formlyOptions\" [model]=\"formlyInitialItem\"></formly-form>\n <button #submitButton pButton type=\"submit\" class=\"hidden\" [disabled]=\"form.disabled\" [loading]=\"submitLoading()\" loadingIcon=\"pi pi-spin pi-spinner\"></button>\n</form>\n<p-messages [value]=\"formMessages()\" [enableService]=\"false\"></p-messages>\n\n@if (descriptor().autoSave && showAutoSaveStatus()) {\n <mng-editor-auto-save-status [status]=\"autoSave()\"></mng-editor-auto-save-status>\n}\n" }]
|
|
479
|
-
}], ctorParameters: () => [] });
|
|
480
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1lZGl0b3IuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9lZGl0b3IvY29tcG9uZW50cy9lZGl0b3IvZm9ybS1lZGl0b3IuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9lZGl0b3IvY29tcG9uZW50cy9lZGl0b3IvZm9ybS1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFVBQVUsRUFDVixVQUFVLEVBR1YsZUFBZSxFQUNmLGdCQUFnQixFQUNoQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sRUFDTixLQUFLLEVBQ0wsS0FBSyxFQUNMLE1BQU0sRUFDTixNQUFNLEVBQ04sU0FBUyxFQUNULFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsUUFBUSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDOUYsT0FBTyxFQUFrQixTQUFTLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUcsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXZDLE9BQU8sRUFBQyxZQUFZLEVBQXFCLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9FLE9BQU8sRUFBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUV0RSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxlQUFl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LFlBQVksRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLDZCQUE2QixDQUFDLGFBQ3pILENBQUMsb0JBQW9CLEVBQUUsQ0FBQyxtQkFDbEIsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RGF0ZVBpcGV9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIERlc3Ryb3lSZWYsXG4gICAgRWxlbWVudFJlZixcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIGFmdGVyTmV4dFJlbmRlcixcbiAgICBib29sZWFuQXR0cmlidXRlLFxuICAgIGNvbXB1dGVkLFxuICAgIGVmZmVjdCxcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbW9kZWwsXG4gICAgb3V0cHV0LFxuICAgIHNpZ25hbCxcbiAgICB1bnRyYWNrZWQsXG4gICAgdmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtvdXRwdXRGcm9tT2JzZXJ2YWJsZSwgdGFrZVVudGlsRGVzdHJveWVkLCB0b1NpZ25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2wsIEZvcm1BcnJheSwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBVbnR5cGVkRm9ybUdyb3VwfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1JvdXRlcn0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHtGb3JtbHlDb25maWcsIEZvcm1seUZpZWxkQ29uZmlnLCBGb3JtbHlNb2R1bGV9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtNZXNzYWdlfSBmcm9tICdwcmltZW5nL2FwaSc7XG5pbXBvcnQge0J1dHRvbk1vZHVsZX0gZnJvbSAncHJpbWVuZy9idXR0b24nO1xuaW1wb3J0IHtNZXNzYWdlc01vZHVsZX0gZnJvbSAncHJpbWVuZy9tZXNzYWdlcyc7XG5pbXBvcnQge0JlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uLCBkZWJvdW5jZVRpbWUsIGRlbGF5LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgb2YsIHN3aXRjaE1hcCwgdGFwfSBmcm9tICdyeGpzJztcbmltcG9ydCB7bWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7Q29tbW9uc1NlcnZpY2UsIENvbW1vbnNTdG9yYWdlU2VydmljZSwgSWRUeXBlLCBMb2dnZXJTZXJ2aWNlLCBTdHlsZUxldmVsRW51bSwgU3R5bGVTaXplRW51bSwgb2JqZWN0RGVlcENvcHl9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge0J1dHRvblN0eWxlQnVpbGRlcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9mb3JtL2FwaSc7XG5pbXBvcnQge1xuICAgIENvbW1vbnNGb3JtbHlGb3JtT3B0aW9ucyxcbiAgICBFZGl0b3JEZXNjcmlwdG9ySW5zdCxcbiAgICBGb3JtRWRpdG9yUGF0Y2hGaWVsZFZhbHVlT3B0cyxcbiAgICBGb3JtRWRpdG9yUmVzZXRGaWVsZFZhbHVlT3B0cyxcbiAgICBGb3JtRWRpdG9yUmVzZXRGb3JtTW9kZWxPcHRzLFxuICAgIEZvcm1FZGl0b3JTZXRGaWVsZFZhbHVlT3B0cyxcbiAgICBGb3JtRWRpdG9yU3VibWl0RXZlbnQsXG4gICAgRm9ybUV2ZW50VHlwZUVudW0sXG4gICAgRm9ybUZpZWxkRXZlbnRDb21wb25lbnRTdWJ0eXBlLFxuICAgIElGb3JtRWRpdG9yQ29tcG9uZW50LFxuICAgIFRhYmxldmlld0VkaXRvclR5cGVFbnVtXG59IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvdGFibGV2aWV3L2FwaSc7XG5cbmltcG9ydCB7Z2VuZXJhdGVBdXRvc2F2ZUVkaXRvcktleX0gZnJvbSAnLi4vLi4vaGVscGVycy9lZGl0b3ItYXV0b3NhdmUnO1xuaW1wb3J0IHtjcmVhdGVGb3JtbHlDb25maWdGcm9tRGVzY3JpcHRvcn0gZnJvbSAnLi4vLi4vaGVscGVycy9lZGl0b3ItZm9ybWx5JztcbmltcG9ydCB7Z2V0Rm9ybUVkaXRvckluZm9NZXNzYWdlLCBnZXRGb3JtRWRpdG9yV2FybmluZ01lc3NhZ2V9IGZyb20gJy4uLy4uL2hlbHBlcnMvbm90aWZpY2F0aW9uJztcbmltcG9ydCB7RWRpdG9yQXV0b1NhdmVQcmV2aWV3TW9kZWwsIEVkaXRvckF1dG9TYXZlU3RhdHVzfSBmcm9tICcuLi8uLi9tb2RlbHMvZWRpdG9yLWF1dG8tc2F2ZS1wcmV2aWV3Lm1vZGVsJztcbmltcG9ydCB7Rm9ybUVkaXRvclNlcnZpY2UsIHByb3ZpZGVGb3JtQ29tcG9uZW50fSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mb3JtLWVkaXRvci5zZXJ2aWNlJztcbmltcG9ydCB7RWRpdG9yQXV0b1NhdmVTdGF0dXNDb21wb25lbnR9IGZyb20gJy4vYXV0by1zYXZlLXN0YXR1cy9hdXRvLXNhdmUtc3RhdHVzLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdtbmctZm9ybS1lZGl0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gICAgaW1wb3J0czogW0Zvcm1seU1vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgTWVzc2FnZXNNb2R1bGUsIEJ1dHRvbk1vZHVsZSwgVHJhbnNsYXRlTW9kdWxlLCBEYXRlUGlwZSwgRWRpdG9yQXV0b1NhdmVTdGF0dXNDb21wb25lbnRdLFxuICAgIHByb3ZpZGVyczogW3Byb3ZpZGVGb3JtQ29tcG9uZW50KCldLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1FZGl0b3JDb21wb25lbnQ8SXRlbSA9IGFueSwgUGFyZW50SXRlbSA9IGFueT4gaW1wbGVtZW50cyBJRm9ybUVkaXRvckNvbXBvbmVudDxJdGVtLCBQYXJlbnRJdGVtPiwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBmb3JtbHlDb25maWcgPSBpbmplY3QoRm9ybWx5Q29uZmlnKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3QoVHJhbnNsYXRlU2VydmljZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21tb25zID0gaW5qZWN0KENvbW1vbnNTZXJ2aWNlKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgY21wVHlwZU5hbWUgPSAnRm9ybUVkaXRvckNvbXBvbmVudCc7XG4gICAgcHJpdmF0ZSByZWFkb25seSBsb2dnZXIgPSBpbmplY3QoTG9nZ2VyU2VydmljZSkuY3JlYXRlKHRoaXMuY21wVHlwZU5hbWUpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZm9ybVNlcnZpY2UgPSBpbmplY3QoRm9ybUVkaXRvclNlcnZpY2U8SXRlbSwgUGFyZW50SXRlbT4pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb21tb25zU3RvcmFnZVNlcnZpY2UgPSBpbmplY3QoQ29tbW9uc1N0b3JhZ2VTZXJ2aWNlKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xuXG4gICAgcHJpdmF0ZSBhdXRvU2F2ZVN0b3JhZ2VLZXlDb21wSW5pdCA9IHRydWU7XG4gICAgcHJpdmF0ZSBhdXRvU2F2ZVN0b3JhZ2VLZXkgPSBjb21wdXRlZCgoKSA9PiBnZW5lcmF0ZUF1dG9zYXZlRWRpdG9yS2V5KHRoaXMuZGVzY3JpcHRvcigpLCB0aGlzLml0ZW0oKSwgdGhpcy5yb3V0ZXIudXJsLCB7ZWRpdG9ySWQ6IHRoaXMuZWRpdG9ySWQoKSwgaXRlbUlkOiB0aGlzLml0ZW1JZCgpfSkpO1xuXG4gICAgcHVibGljIGRlc2NyaXB0b3IgPSBpbnB1dC5yZXF1aXJlZDxFZGl0b3JEZXNjcmlwdG9ySW5zdDxJdGVtPj4oKTtcbiAgICBwdWJsaWMgc3VibWl0TG9hZGluZyA9IGlucHV0KGZhbHNlLCB7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSk7XG4gICAgcHVibGljIGl0ZW0gPSBtb2RlbDxJdGVtIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgIHB1YmxpYyBpc0Zvcm1EaXNhYmxlZCA9IGlucHV0KGZhbHNlLCB7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSk7XG4gICAgcHVibGljIGVkaXRvcklkID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICAgIHB1YmxpYyBpdGVtSWQgPSBpbnB1dDxJZFR5cGUgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG4gICAgcHVibGljIHNob3dBdXRvU2F2ZVN0YXR1cyA9IGlucHV0KHRydWUsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcblxuICAgIC8vIGV2ZW50IG91dHB1dHNcbiAgICBwdWJsaWMgZm9ybVN1Ym1pdCA9IG91dHB1dDxGb3JtRWRpdG9yU3VibWl0RXZlbnQ8SXRlbT4+KCk7XG4gICAgcHVibGljIHZhbHVlQ2hhbmdlID0gb3V0cHV0PEl0ZW0+KCk7XG4gICAgcHJpdmF0ZSBhdXRvU2F2ZVN0YXR1c1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEVkaXRvckF1dG9TYXZlU3RhdHVzPih7c3RhdGU6ICdpbml0aWFsJywgdGltZXN0YW1wOiBuZXcgRGF0ZSgpfSk7XG4gICAgcHVibGljIGF1dG9TYXZlU3RhdHVzID0gb3V0cHV0RnJvbU9ic2VydmFibGUodGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QuYXNPYnNlcnZhYmxlKCkpO1xuXG4gICAgLy8gY29udGVudCBhbmQgdmlldyBxdWVyaWVzXG4gICAgcHVibGljIHN1Ym1pdEJ1dHRvbkVsZW1lbnRSZWYgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZiB8IHVuZGVmaW5lZD4oJ3N1Ym1pdEJ1dHRvbicpO1xuICAgIHByaXZhdGUgZm9jdXNUaGllZkVsUmVmID0gdmlld0NoaWxkPEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ+KCdmb2N1c1RoaWVmSW5wdXQnKTtcblxuICAgIC8vIGZvcm1seSBzcGVjaWZpY3NcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9mb3JtID0gbmV3IFVudHlwZWRGb3JtR3JvdXAoe30pO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Zvcm1seVN0YXRlRGlzYWJsZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBfZm9ybWx5U3RhdGVEaXNhYmxlZCA9IHRvU2lnbmFsKHRoaXMuX2Zvcm1seVN0YXRlRGlzYWJsZWRTdWJqZWN0KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9mb3JtbHlPcHRpb25zOiBDb21tb25zRm9ybWx5Rm9ybU9wdGlvbnM8SXRlbT4gPSB7XG4gICAgICAgIGZvcm1TdGF0ZToge1xuICAgICAgICAgICAgYWRkOiBmYWxzZSxcbiAgICAgICAgICAgIGVkaXQ6IGZhbHNlLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGlzYWJsZWQkOiB0aGlzLl9mb3JtbHlTdGF0ZURpc2FibGVkU3ViamVjdC5hc09ic2VydmFibGUoKS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkpXG4gICAgICAgIH1cbiAgICB9O1xuICAgIHByaXZhdGUgX2Zvcm1seUZpZWxkczogRm9ybWx5RmllbGRDb25maWdbXSA9IFtdOyAvLyBpbml0aWFsaXplZCBpbiBuZ09uSW5pdCwgc2hvdWxkIG5vdCBiZSBjaGFuZ2VkIGFmdGVyXG4gICAgcHJpdmF0ZSBfZm9ybWx5SW5pdGlhbEl0ZW0gPSB7fTsgLy8gaW5pdGlhbGl6ZWQgaW4gbmdPbkluaXQsIHNob3VsZCBub3QgYmUgY2hhbmdlZCBhZnRlclxuICAgIHByaXZhdGUgaW5pdGlhbEl0ZW1JbnB1dDogSXRlbSB8IHVuZGVmaW5lZDtcblxuICAgIHByaXZhdGUgc2V0dGVyRmllbGRzID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5kZXNjcmlwdG9yKCkuZmllbGRzLmZpbHRlcihmID0+IHR5cGVvZiBmLnNldHRlciA9PT0gJ2Z1bmN0aW9uJykpO1xuXG4gICAgcHVibGljIGZvcm1NZXNzYWdlcyA9IHNpZ25hbDxNZXNzYWdlW10+KFtdKTtcblxuICAgIC8vIGF1dG9zYXZlXG4gICAgcHVibGljIHJlYWRvbmx5IHJlc3RvcmVMb2NhbFN0YXRlQnV0dG9uU3R5bGUgPSBCdXR0b25TdHlsZUJ1aWxkZXIuZnJvbSh7bGV2ZWw6IFN0eWxlTGV2ZWxFbnVtLlN1Y2Nlc3MsIHNpemU6IFN0eWxlU2l6ZUVudW0uU21hbGx9KS5idWlsZCgpO1xuICAgIHB1YmxpYyByZWFkb25seSBwcmV2aWV3TG9jYWxTdGF0ZUJ1dHRvblN0eWxlID0gQnV0dG9uU3R5bGVCdWlsZGVyLmZyb20oe2xldmVsOiBTdHlsZUxldmVsRW51bS5JbmZvLCBzaXplOiBTdHlsZVNpemVFbnVtLlNtYWxsfSkuYnVpbGQoKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgY2xlYXJMb2NhbFN0YXRlQnV0dG9uU3R5bGUgPSBCdXR0b25TdHlsZUJ1aWxkZXIuZnJvbSh7bGV2ZWw6IFN0eWxlTGV2ZWxFbnVtLkRhbmdlciwgc2l6ZTogU3R5bGVTaXplRW51bS5TbWFsbCwgcm91bmRlZDogZmFsc2UsIHRleHRCdXR0b246IHRydWV9KS5idWlsZCgpO1xuICAgIHB1YmxpYyBhdXRvU2F2ZVJlc3RvcmUgPSBzaWduYWw8RWRpdG9yQXV0b1NhdmVQcmV2aWV3TW9kZWw8SXRlbT4gfCBudWxsPihudWxsKTtcbiAgICBwdWJsaWMgYXV0b1NhdmUgPSB0b1NpZ25hbCh0aGlzLmF1dG9TYXZlU3RhdHVzU3ViamVjdCk7XG4gICAgcHVibGljIGF1dG9TYXZlUHJldmlld0J1dHRvbkxhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuYXV0b1NhdmUoKT8uc3RhdGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3ByZXZpZXcnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnbW5nRWRpdG9yLmF1dG9TYXZlLnJlc3RvcmUucHJldmlld0N1cnJlbnQnO1xuICAgICAgICAgICAgY2FzZSAncHJldmlld0N1cnJlbnQnOlxuICAgICAgICAgICAgICAgIHJldHVybiAnbW5nRWRpdG9yLmF1dG9TYXZlLnJlc3RvcmUucHJldmlld0F1dG9zYXZlZCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnbW5nRWRpdG9yLmF1dG9TYXZlLnJlc3RvcmUucHJldmlldyc7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICBwdWJsaWMgYXV0b1NhdmVTaG93UmVzdG9yZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuYXV0b1NhdmVSZXN0b3JlKCk/LnNhdmVkICE9IG51bGwpO1xuICAgIHByaXZhdGUgYXV0b1NhdmVQcmV2aWV3RGlzYWJsZWRGb3JtID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwcml2YXRlIGF1dG9TYXZlRXZlbnRzU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gICAgLy8gYXV0b2ZvY3VzXG4gICAgcHVibGljIGF1dG9mb2N1c0VuYWJsZWQgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5kZXNjcmlwdG9yKCkuYXV0b2ZvY3VzT25GaWVsZCA/PyB0cnVlKSAmJiAhdGhpcy5fZm9ybWx5U3RhdGVEaXNhYmxlZCgpKTtcblxuICAgIGdldCBwYXJlbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1TZXJ2aWNlLnBhcmVudDtcbiAgICB9XG5cbiAgICBnZXQgZm9ybSgpOiBGb3JtR3JvdXA8e1tLIGluIGtleW9mIEl0ZW1dOiBBYnN0cmFjdENvbnRyb2w8SXRlbVtLXT59PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mb3JtO1xuICAgIH1cblxuICAgIGdldCBmb3JtVW5zYWZlKCk6IFVudHlwZWRGb3JtR3JvdXAge1xuICAgICAgICByZXR1cm4gdGhpcy5fZm9ybTtcbiAgICB9XG5cbiAgICBnZXQgZm9ybWx5T3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1seU9wdGlvbnM7XG4gICAgfVxuXG4gICAgZ2V0IGZvcm1seUZpZWxkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1seUZpZWxkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPbmx5IHVzZWQgZm9yIGZvcm0gaW5pdGlhbGl6YXRpb24uIEZ1cnRoZXIgY2hhbmdlcyBzaG91bGQgYmUgZG9uZSB1c2luZyB7cmVzZXRGb3JtTW9kZWx9LlxuICAgICAqL1xuICAgIGdldCBmb3JtbHlJbml0aWFsSXRlbSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1seUluaXRpYWxJdGVtO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmZvcm1TZXJ2aWNlLmluaXQodGhpcyk7XG5cbiAgICAgICAgZWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW0oKTtcbiAgICAgICAgICAgIGlmIChpdGVtICE9PSB0aGlzLmluaXRpYWxJdGVtSW5wdXQpIHtcbiAgICAgICAgICAgICAgICAvLyBuZXcgaXRlbSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIHRoZSBmb3JtIHdhcyBpbml0aWFsaXplZCB3aXRoLiBNdXN0IHRyaWdnZXIgcmVzZXQgb2YgZm9ybSBtb2RlbC5cbiAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgZXhlY3V0ZWQgaW4gdW50cmFja2VkIG1vZGUsIGJlY2F1c2UgaXQgdXBkYXRlcyBtdWx0aXBsZSBjb21wb25lbnRzIHVuZGVybmVhdGhcbiAgICAgICAgICAgICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5yZXNldEZvcm1Nb2RlbChpdGVtKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9mb3JtbHlPcHRpb25zLmZvcm1TdGF0ZS5kaXNhYmxlZCA9XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Zvcm1EaXNhYmxlZCgpIHx8IHRoaXMuYXV0b1NhdmVQcmV2aWV3RGlzYWJsZWRGb3JtKCkgfHwgdGhpcy5fZm9ybWx5T3B0aW9ucy5mb3JtU3RhdGUuZGVzY3JpcHRvcj8uZGlzYWJsZWQgPT09IHRydWUgfHwgdGhpcy5fZm9ybWx5T3B0aW9ucy5mb3JtU3RhdGUuZGV0YWlscztcbiAgICAgICAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZm9ybWx5U3RhdGVEaXNhYmxlZFN1YmplY3QubmV4dCh0aGlzLl9mb3JtbHlPcHRpb25zLmZvcm1TdGF0ZS5kaXNhYmxlZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9mb2N1c0VuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICAgICAgICAgICdpbnB1dDpub3QoW2Rpc2FibGVkXSksIHNlbGVjdDpub3QoW2Rpc2FibGVkXSksIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSwgW3JvbGU9XCJjb21ib2JveFwiXTpub3QoW2Rpc2FibGVkXSknXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlSW5wdXRJZHggPSBhY3RpdmVFbCA/IFsuLi5mb3JtRmllbGRzXS5maW5kSW5kZXgoZWwgPT4gYWN0aXZlRWwuaXNFcXVhbE5vZGUoZWwpKSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVJbnB1dElkeCA8PSAwICYmIHRoaXMuZm9jdXNUaGllZkVsUmVmKCk/Lm5hdGl2ZUVsZW1lbnQuaXNFcXVhbE5vZGUoZm9ybUZpZWxkc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgaWYgZm9jdXMgb24gZm9jdXMgdGhlaWYgKG9yIG5vIGZvY3VzKSwgZ28gdGhlIG5leHQgZmllbGQgKG9mIGZpcnN0IG9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSAoYWN0aXZlSW5wdXRJZHggPD0gMCA/IDEgOiBhY3RpdmVJbnB1dElkeCArIDEpICUgZm9ybUZpZWxkcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGRzW3RhcmdldEluZGV4XS5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICAvLyBpbml0IGZvcm0gc3RhdGVcbiAgICAgICAgaWYgKHRoaXMuZGVzY3JpcHRvcigpLnRhYmxldmlld0VkaXRvclR5cGUgPT09IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkFkZCkge1xuICAgICAgICAgICAgdGhpcy5fZm9ybWx5T3B0aW9ucy5mb3JtU3RhdGUuYWRkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRlc2NyaXB0b3IoKS50YWJsZXZpZXdFZGl0b3JUeXBlID09PSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5FZGl0KSB7XG4gICAgICAgICAgICB0aGlzLl9mb3JtbHlPcHRpb25zLmZvcm1TdGF0ZS5lZGl0ID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRlc2NyaXB0b3IoKS50YWJsZXZpZXdFZGl0b3JUeXBlID09PSBUYWJsZXZpZXdFZGl0b3JUeXBlRW51bS5EZXRhaWxzKSB7XG4gICAgICAgICAgICB0aGlzLl9mb3JtbHlPcHRpb25zLmZvcm1TdGF0ZS5kZXRhaWxzID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9mb3JtbHlPcHRpb25zLmZvcm1TdGF0ZS5kZXNjcmlwdG9yID0gdGhpcy5kZXNjcmlwdG9yKCk7XG5cbiAgICAgICAgLy8gaW5pdCBmaWVsZHMgZm9yIGZvcm1seVxuICAgICAgICB0aGlzLl9mb3JtbHlGaWVsZHMgPSBjcmVhdGVGb3JtbHlDb25maWdGcm9tRGVzY3JpcHRvcih0aGlzLmRlc2NyaXB0b3IoKSwgdGhpcy5mb3JtbHlDb25maWcsIHRoaXMpO1xuXG4gICAgICAgIC8vIGludCBmb3JtIG1vZGVsIChvbmx5IGluaXRpYWwsIG5vIGZ1cnRoZXIgY2hhbmdlcyB0byBmb3JtTW9kZWwgc2hvdWxkIGJlIGFsbG93ZWQhKVxuICAgICAgICB0aGlzLmluaXRpYWxJdGVtSW5wdXQgPSB0aGlzLml0ZW0oKTtcbiAgICAgICAgdGhpcy5fZm9ybWx5SW5pdGlhbEl0ZW0gPSB0aGlzLmdldEZvcm1Nb2RlbEZyb21JdGVtKHRoaXMuaXRlbSgpKTtcblxuICAgICAgICAvLyBoYW5kbGUgbG9jYWxpemF0aW9ucyBlZGl0L2FkZCBtZXNzYWdlXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcigpLmlzTG9jYWxpemVkICYmXG4gICAgICAgICAgICAodGhpcy5kZXNjcmlwdG9yKCkudGFibGV2aWV3RWRpdG9yVHlwZSA9PT0gVGFibGV2aWV3RWRpdG9yVHlwZUVudW0uQWRkIHx8IHRoaXMuZGVzY3JpcHRvcigpLnRhYmxldmlld0VkaXRvclR5cGUgPT09IFRhYmxldmlld0VkaXRvclR5cGVFbnVtLkVkaXQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5mb3JtTWVzc2FnZXMuc2V0KFtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmZvcm1NZXNzYWdlcygpLFxuICAgICAgICAgICAgICAgIGdldEZvcm1FZGl0b3JJbmZvTWVzc2FnZSh0aGlzLnRyYW5zbGF0ZVNlcnZpY2UsICdtbmdFZGl0b3IubG9jYWxpemF0aW9ucy5hZGRJbkRlZmF1bHRMYW5ndWFnZVRpdGxlJywgJ21uZ0VkaXRvci5sb2NhbGl6YXRpb25zLmFkZEluRGVmYXVsdExhbmd1YWdlRGVzY3JpcHRpb24nLCB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRMYW5ndWFnZTogdGhpcy5jb21tb25zLmdldERlZmF1bHRMb2NhbGUoKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVtaXQgbGlmZWN5Y2xlIGV2ZW50XG4gICAgICAgIHRoaXMuZGVzY3JpcHRvcigpLm5leHRFdmVudChGb3JtRXZlbnRUeXBlRW51bS5Db21wb25lbnRMaWZlY3ljbGUsIHRoaXMgYXMgSUZvcm1FZGl0b3JDb21wb25lbnQ8YW55Piwge1xuICAgICAgICAgICAgZXZlbnRTdWJ0eXBlOiBGb3JtRmllbGRFdmVudENvbXBvbmVudFN1YnR5cGUuT05fSU5JVFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9mb3JtLnZhbHVlQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDEwMCksXG4gICAgICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdGhpcy5fZm9ybS5nZXRSYXdWYWx1ZSgpKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSh2ID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlPy5lbWl0KHYpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcigpLm5leHRFdmVudChGb3JtRXZlbnRUeXBlRW51bS5WYWx1ZUNoYW5nZSwgdGhpcyBhcyBJRm9ybUVkaXRvckNvbXBvbmVudDxhbnk+LCB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2LFxuICAgICAgICAgICAgICAgICAgICBmb3JtVmFsdWU6ICgpID0+IHRoaXMuZ2V0Rm9ybVZhbHVlKClcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgLy8gbWFyayBmb3JtIGFzIHByaXN0aW5lLCBzaG91bGQgYmUgZG9uZSBpbiBuZXh0IGV2ZW50IGhvb2sgdG8gYWxsb3cgZm9ybWx5IHRvIGluaXRpYWxpemUgZmlyc3RcbiAgICAgICAgdGhpcy5fZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICB0aGlzLmF1dG9TYXZlTG9hZFNhdmVkRnJvbVN0b3JhZ2UoKTtcbiAgICAgICAgdGhpcy5hdXRvU2F2ZVN0YXJ0RXZlbnRDaGFuZ2VMaXN0ZW4odGhpcy5hdXRvU2F2ZVN0b3JhZ2VLZXlDb21wSW5pdCk7XG4gICAgICAgIHRoaXMuYXV0b1NhdmVTdG9yYWdlS2V5Q29tcEluaXQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuYXV0b1NhdmVTdG9wVmFsdWVDaGFuZ2VMaXN0ZW4oKTtcbiAgICAgICAgLy8gZW1pdCBsaWZlY3ljbGUgZXZlbnRcbiAgICAgICAgdGhpcy5kZXNjcmlwdG9yKCkubmV4dEV2ZW50KEZvcm1FdmVudFR5cGVFbnVtLkNvbXBvbmVudExpZmVjeWNsZSwgdGhpcyBhcyBJRm9ybUVkaXRvckNvbXBvbmVudDxhbnk+LCB7XG4gICAgICAgICAgICBldmVudFN1YnR5cGU6IEZvcm1GaWVsZEV2ZW50Q29tcG9uZW50U3VidHlwZS5PTl9ERVNUUk9ZXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdWJtaXQoKSB7XG4gICAgICAgIHRoaXMuc3VibWl0QnV0dG9uRWxlbWVudFJlZigpPy5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIHB1YmxpYyBvblN1Ym1pdChldmVudDogRXZlbnQpIHtcbiAgICAgICAgdGhpcy5fZm9ybWx5T3B0aW9ucy5mb3JtU3RhdGUuc3VibWl0dGVkT24gPSBEYXRlLm5vdygpO1xuICAgICAgICB0aGlzLmZvcm1NZXNzYWdlcy5zZXQoW10pO1xuXG4gICAgICAgIGNvbnN0IGZvcm1TdWJtaXRJdGVtID0gdGhpcy5nZXRGb3JtVmFsdWUoKTtcbiAgICAgICAgaWYgKHRoaXMuX2Zvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybVN1Ym1pdC5lbWl0KHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGZvcm1JdGVtOiBmb3JtU3VibWl0SXRlbVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IoKS5uZXh0RXZlbnQoRm9ybUV2ZW50VHlwZUVudW0uU3VibWl0LCB0aGlzIGFzIElGb3JtRWRpdG9yQ29tcG9uZW50PGFueT4sIHtcbiAgICAgICAgICAgICAgICBzdWJtaXRWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzdWJtaXRWYWx1ZTogZm9ybVN1Ym1pdEl0ZW1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5vbkF1dG9TYXZlRGlzbWlzcygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZmluZCBhbmQgbWFyayBpbnZhbGlkIHRhYnNcbiAgICAgICAgICAgIGNvbnN0IGZvcm1GaWVsZHMgPSB0aGlzLl9mb3JtbHlGaWVsZHM7XG4gICAgICAgICAgICBpZiAoZm9ybUZpZWxkc1swXS50eXBlID09PSAndGFicycgJiYgZm9ybUZpZWxkc1swXS5maWVsZEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YWIgb2YgZm9ybUZpZWxkc1swXS5maWVsZEdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1seU9wdGlvbnMuZm9ybVN0YXRlWyd0YWJfJyArICh0YWIuaWQgPyB0YWIuaWQgOiAodGFiLmtleSA/PyAnJykpICsgJ19pbnZhbGlkJ10gPSB0aGlzLmlzQW55RmllbGRJbnZhbGlkKHRhYi5maWVsZEdyb3VwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50OiBGb3JtRWRpdG9yU3VibWl0RXZlbnQ8SXRlbT4gPSB7c3VjY2VzczogZmFsc2UsIGZvcm1JdGVtOiBmb3JtU3VibWl0SXRlbX07XG4gICAgICAgICAgICBldmVudC5zdWNjZXNzID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmZvcm1NZXNzYWdlcygpLnB1c2goZ2V0Rm9ybUVkaXRvcldhcm5pbmdNZXNzYWdlKHRoaXMudHJhbnNsYXRlU2VydmljZSwgJ21uZ0VkaXRvci5pbnZhbGlkRm9ybVRvYXN0VGl0bGUnLCAnbW5nRWRpdG9yLmludmFsaWRGb3JtVG9hc3RNZXNzYWdlJykpO1xuXG4gICAgICAgICAgICB0aGlzLmZvcm1TdWJtaXQuZW1pdChldmVudCk7XG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IoKS5uZXh0RXZlbnQoRm9ybUV2ZW50VHlwZUVudW0uU3VibWl0LCB0aGlzIGFzIElGb3JtRWRpdG9yQ29tcG9uZW50PGFueT4sIHtcbiAgICAgICAgICAgICAgICBzdWJtaXRWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgc3VibWl0VmFsdWU6IGZvcm1TdWJtaXRJdGVtXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGb3JtVmFsdWUob3B0cz86IHtvbWl0U2V0dGVycz86IGJvb2xlYW59KTogSXRlbSB7XG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IG9iamVjdERlZXBDb3B5KHRoaXMuX2Zvcm0uZ2V0UmF3VmFsdWUoKSwge21hcEdldHRlcnNUb1Byb3BlcnRpZXM6IHRydWV9KTtcblxuICAgICAgICBpZiAob3B0cz8ub21pdFNldHRlcnMgIT09IHRydWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0dGVyRmllbGRzKCkuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3BsaXRQYXRoID0gZmllbGQucHJvcGVydHkuc3BsaXQoJy4nKTtcbiAgICAgICAgICAgICAgICBsZXQgZmllbGRWYWx1ZSA9IGZvcm1WYWx1ZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwbGl0UGF0aC5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFN1YlBhdGggPSBzcGxpdFBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmllbGRWYWx1ZVtjdXJyZW50U3ViUGF0aF0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlW2N1cnJlbnRTdWJQYXRoXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9IGZpZWxkVmFsdWVbY3VycmVudFN1YlBhdGhdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPSBmaWVsZFZhbHVlW3NwbGl0UGF0aFtzcGxpdFBhdGgubGVuZ3RoIC0gMV1dO1xuICAgICAgICAgICAgICAgIGZpZWxkLnNldHRlcj8uKGZvcm1WYWx1ZSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmb3JtVmFsdWU7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0Rm9ybU1vZGVsKGl0ZW0/OiBJdGVtLCBvcHRzPzogRm9ybUVkaXRvclJlc2V0Rm9ybU1vZGVsT3B0cykge1xuICAgICAgICAvLyBoYXZlIHRvIHVzZSBmb3JtbHkncyByZXNldCBtb2RlbCwgYmVjYXVzZSBfZm9ybS5yZXNldCgpIGRvZXMgbm90IHJlc2V0IHRoZSB2YWx1ZXMgY29ycmVjdGx5XG4gICAgICAgIHRoaXMuX2Zvcm1seU9wdGlvbnMucmVzZXRNb2RlbD8uKHRoaXMuZ2V0Rm9ybU1vZGVsRnJvbUl0ZW0oaXRlbSkpO1xuXG4gICAgICAgIGlmIChvcHRzPy5tYXJrQXNQcmlzdGluZSAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIG1hcmsgZm9ybSBhcyBwcmlzdGluZSwgc2hvdWxkIGJlIGRvbmUgaW4gbmV4dCBldmVudCBob29rIHRvIGFsbG93IGZvcm1seSB0byBpbml0aWFsaXplIGZpcnN0XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mb3JtLm1hcmtBc1ByaXN0aW5lKHtvbmx5U2VsZjogb3B0cz8ub25seVNlbGZ9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGdldEZpZWxkKGtleToga2V5b2YgSXRlbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRGaWVsZFVuc2FmZShrZXkgYXMgc3RyaW5nKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RmllbGRVbnNhZmUoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZEZvcm1GaWVsZCh0aGlzLl9mb3JtLCBrZXkuc3BsaXQoJy4nKSk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEZpZWxkVmFsdWU8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBJdGVtPihrZXk6IFByb3BlcnR5LCB2YWx1ZTogSXRlbVtQcm9wZXJ0eV0sIG9wdHM/OiBGb3JtRWRpdG9yU2V0RmllbGRWYWx1ZU9wdHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2V0RmllbGRWYWx1ZVVuc2FmZShrZXkgYXMgc3RyaW5nLCB2YWx1ZSwgb3B0cyk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldEZpZWxkVmFsdWVVbnNhZmUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdHM/OiBGb3JtRWRpdG9yU2V0RmllbGRWYWx1ZU9wdHMpIHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMuZ2V0RmllbGRVbnNhZmUoa2V5KTtcbiAgICAgICAgaWYgKGNvbnRyb2wpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIG9wdHMpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlci53YXJuKGBWYWx1ZSB3YXMgbm90IHNldCwgYmVjYXVzZSBmaWVsZCAke2tleX0gd2FzIG5vdCBmb3VuZC5gKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXRjaEZpZWxkVmFsdWU8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBJdGVtPihrZXk6IFByb3BlcnR5LCB2YWx1ZTogSXRlbVtQcm9wZXJ0eV0sIG9wdHM/OiBGb3JtRWRpdG9yUGF0Y2hGaWVsZFZhbHVlT3B0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXRjaEZpZWxkVmFsdWVVbnNhZmUoa2V5IGFzIHN0cmluZywgdmFsdWUsIG9wdHMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXRjaEZpZWxkVmFsdWVVbnNhZmUoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnksIG9wdHM/OiBGb3JtRWRpdG9yUGF0Y2hGaWVsZFZhbHVlT3B0cykge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5nZXRGaWVsZFVuc2FmZShrZXkpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgY29udHJvbC5wYXRjaFZhbHVlKHZhbHVlLCBvcHRzKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXIud2FybihgVmFsdWUgd2FzIG5vdCBzZXQsIGJlY2F1c2UgZmllbGQgJHtrZXl9IHdhcyBub3QgZm91bmQuYCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRGaWVsZFZhbHVlPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgSXRlbT4oa2V5OiBQcm9wZXJ0eSwgdmFsdWU/OiBJdGVtW1Byb3BlcnR5XSwgb3B0cz86IEZvcm1FZGl0b3JSZXNldEZpZWxkVmFsdWVPcHRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlc2V0RmllbGRWYWx1ZVVuc2FmZShrZXkgYXMgc3RyaW5nLCB2YWx1ZSwgb3B0cyk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0RmllbGRWYWx1ZVVuc2FmZShrZXk6IHN0cmluZywgdmFsdWU/OiBhbnksIG9wdHM/OiBGb3JtRWRpdG9yUmVzZXRGaWVsZFZhbHVlT3B0cykge1xuICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5nZXRGaWVsZFVuc2FmZShrZXkpO1xuICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgY29udHJvbC5yZXNldCh2YWx1ZSwgb3B0cyk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oYFZhbHVlIHdhcyBub3Qgc2V0LCBiZWNhdXNlIGZpZWxkICR7a2V5fSB3YXMgbm90IGZvdW5kLmApO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzdG9yZXMgdGhlIHNhdmVkIGxvY2FsIHN0YXRlLlxuICAgICAqIElmIGxvY2FsIHN0b3JhZ2Uga2V5cyBleGlzdCBmb3IgbG9jYWwgc3RhdGUgYW5kIGxvY2FsIHRpbWVzdGFtcCwgcmVzdG9yZSB0aGVpciBjb3JyZXNwb25kaW5nIHZhbHVlcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgb25BdXRvU2F2ZVJlc3RvcmUoKSB7XG4gICAgICAgIGNvbnN0IHJlc3RvcmUgPSB0aGlzLmF1dG9TYXZlUmVzdG9yZSgpO1xuICAgICAgICBpZiAocmVzdG9yZT8uc2F2ZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYXV0b1NhdmVTdG9wVmFsdWVDaGFuZ2VMaXN0ZW4oKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtTW9kZWwocmVzdG9yZS5zYXZlZCk7XG4gICAgICAgICAgICB0aGlzLmF1dG9TYXZlUmVzdG9yZS5zZXQobnVsbCk7XG4gICAgICAgICAgICB0aGlzLmF1dG9TYXZlU3RhdHVzU3ViamVjdC5uZXh0KHtzdGF0ZTogJ3Jlc3RvcmVkJywgdGltZXN0YW1wOiByZXN0b3JlLnNhdmVkQXQgPz8gbmV3IERhdGUoKX0pO1xuICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVByZXZpZXdEaXNhYmxlZEZvcm0uc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuYXV0b1NhdmVTdGFydEV2ZW50Q2hhbmdlTGlzdGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcmV2aWV3cyB0aGUgc2F2ZWQgbG9jYWwgc3RhdGUuXG4gICAgICogSWYgbG9jYWwgc3RvcmFnZSBrZXlzIGV4aXN0IGZvciBsb2NhbCBzdGF0ZSBhbmQgbG9jYWwgdGltZXN0YW1wLCByZXN0b3JlIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzLlxuICAgICAqL1xuICAgIHB1YmxpYyBvbkF1dG9TYXZlUHJldmlldygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmF1dG9TYXZlUmVzdG9yZSgpPy5zYXZlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hdXRvU2F2ZVN0b3BWYWx1ZUNoYW5nZUxpc3RlbigpO1xuICAgICAgICB0aGlzLmF1dG9TYXZlUHJldmlld0Rpc2FibGVkRm9ybS5zZXQodHJ1ZSk7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QudmFsdWUuc3RhdGU7XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gJ3ByZXZpZXcnICYmIHN0YXRlICE9PSAncHJldmlld0N1cnJlbnQnKSB7XG4gICAgICAgICAgICAvLyBtdXN0IHN0b3JlIG9yaWdpbmFsIHZhbHVlIGZyb20gY3VycmVudCB2YWx1ZSBmb3JtXG4gICAgICAgICAgICB0aGlzLmF1dG9TYXZlUmVzdG9yZS51cGRhdGUoaSA9PiAoey4uLmksIG9yaWdpbmFsOiB0aGlzLmdldEZvcm1WYWx1ZSgpfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdG9yZSA9IHRoaXMuYXV0b1NhdmVSZXN0b3JlKCk7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ3ByZXZpZXcnICYmIHJlc3RvcmU/Lm9yaWdpbmFsKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybU1vZGVsKHJlc3RvcmUub3JpZ2luYWwpO1xuICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QubmV4dCh7c3RhdGU6ICdwcmV2aWV3Q3VycmVudCd9KTtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSAhPT0gJ3ByZXZpZXcnICYmIHJlc3RvcmU/LnNhdmVkKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybU1vZGVsKHJlc3RvcmUuc2F2ZWQpO1xuICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QubmV4dCh7c3RhdGU6ICdwcmV2aWV3JywgdGltZXN0YW1wOiByZXN0b3JlLnNhdmVkQXQgPz8gbmV3IERhdGUoKX0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBsb2NhbCBzdGF0ZSBmcm9tIGxvY2FsIHN0b3JhZ2UuXG4gICAgICogSWYgbG9jYWwgc3RvcmFnZSBrZXlzIGV4aXN0IGZvciBsb2NhbCBzdGF0ZSBhbmQgbG9jYWwgdGltZXN0YW1wLCByZW1vdmUgdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAgICovXG4gICAgcHVibGljIG9uQXV0b1NhdmVEaXNtaXNzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5hdXRvU2F2ZVN0b3JhZ2VLZXkoKSkge1xuICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVN0b3BWYWx1ZUNoYW5nZUxpc3RlbigpO1xuICAgICAgICAgICAgY29uc3QgcmVzdG9yZSA9IHRoaXMuYXV0b1NhdmVSZXN0b3JlKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QudmFsdWUuc3RhdGUgPT09ICdwcmV2aWV3JyAmJiByZXN0b3JlPy5vcmlnaW5hbCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtTW9kZWwocmVzdG9yZS5vcmlnaW5hbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QubmV4dCh7c3RhdGU6ICdpbml0aWFsJywgdGltZXN0YW1wOiBuZXcgRGF0ZSgpfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbW1vbnNTdG9yYWdlU2VydmljZS5yZW1vdmVJdGVtKHRoaXMuY21wVHlwZU5hbWUsIHRoaXMuYXV0b1NhdmVTdG9yYWdlS2V5KCkpO1xuICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVJlc3RvcmUuc2V0KG51bGwpO1xuICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVByZXZpZXdEaXNhYmxlZEZvcm0uc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuYXV0b1NhdmVTdGFydEV2ZW50Q2hhbmdlTGlzdGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEZvcm1Nb2RlbEZyb21JdGVtKGl0ZW06IEl0ZW0gfCB1bmRlZmluZWQpOiBhbnkge1xuICAgICAgICBjb25zdCBmb3JtTW9kZWwgPSAob2JqZWN0RGVlcENvcHkoaXRlbSwge21hcEdldHRlcnNUb1Byb3BlcnRpZXM6IHRydWV9KSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA/PyB7fTtcblxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gdGhpcy5kZXNjcmlwdG9yKCk7XG4gICAgICAgIGRlc2NyaXB0b3IuZmllbGRzLmZvckVhY2goZmllbGQgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkLmdldHRlciAmJiBmb3JtTW9kZWwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBzcGxpdFBhdGggPSBmaWVsZC5wcm9wZXJ0eS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50T2JqZWN0ID0gZm9ybU1vZGVsO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFN1YlBhdGggPSBzcGxpdFBhdGhbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09PSBzcGxpdFBhdGgubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF0gPSBmaWVsZC5nZXR0ZXIoZm9ybU1vZGVsPy5bZmllbGQucHJvcGVydHkgYXMga2V5b2Ygb2JqZWN0XSwgZm9ybU1vZGVsIGFzIEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJyZW50T2JqZWN0W2N1cnJlbnRTdWJQYXRoXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0W2N1cnJlbnRTdWJQYXRoXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T2JqZWN0ID0gY3VycmVudE9iamVjdFtjdXJyZW50U3ViUGF0aF07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBmb3JtTW9kZWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kRm9ybUZpZWxkKGNvbnRyb2w6IEFic3RyYWN0Q29udHJvbCwga2V5UGF0aDogc3RyaW5nW10pOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHtcbiAgICAgICAgaWYgKGtleVBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gY29udHJvbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoa2V5UGF0aC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBjb250cm9sLmdldChrZXlQYXRoWzBdKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV4dENvbnRyb2w6IEFic3RyYWN0Q29udHJvbCB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAoY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xuICAgICAgICAgICAgbmV4dENvbnRyb2wgPSBjb250cm9sLmdldChrZXlQYXRoWzBdKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb250cm9sIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7XG4gICAgICAgICAgICBjb25zdCBpZHggPSAra2V5UGF0aFswXTtcbiAgICAgICAgICAgIGlmICghaXNOYU4oaWR4KSkge1xuICAgICAgICAgICAgICAgIG5leHRDb250cm9sID0gY29udHJvbC5hdChpZHgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb250cm9sKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5maW5kRm9ybUZpZWxkKG5leHRDb250cm9sISwga2V5UGF0aC5zbGljZSgxKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0FueUZpZWxkSW52YWxpZChmaWVsZHM6IEZvcm1seUZpZWxkQ29uZmlnW10gPSBbXSk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkIG9mIGZpZWxkcykge1xuICAgICAgICAgICAgbGV0IGZpZWxkSW52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGQuZmllbGRHcm91cCkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZEludmFsaWQgPSB0aGlzLmlzQW55RmllbGRJbnZhbGlkKGZpZWxkLmZpZWxkR3JvdXApO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgZmllbGQudHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBmaWVsZEludmFsaWQgPSAhZmllbGQuZm9ybUNvbnRyb2w/LnZhbGlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpZWxkSW52YWxpZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGF1dG9TYXZlU3RhcnRFdmVudENoYW5nZUxpc3Rlbihpbml0ID0gZmFsc2UpIHtcbiAgICAgICAgaWYgKCF0aGlzLmRlc2NyaXB0b3IoKS5hdXRvU2F2ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmF1dG9TYXZlRXZlbnRzU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmF1dG9TYXZlRXZlbnRzU3Vic2NyaXB0aW9uID0gb2Yodm9pZCAwKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgICBkZWxheShpbml0ID8gMCA6IDUwMCksIC8vIGRlbGF5IGluaXRpYWwgZXZlbnQgbGlzdGVuaW5nIGZvciBhbGwgdGhlIGluaXRpYWxpemF0aW9ucyB0byB0YWtlIHBsYWNlXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLl9mb3JtLnZhbHVlQ2hhbmdlcyksXG4gICAgICAgICAgICAgICAgICAgIGRlYm91bmNlVGltZSgyNTApLFxuICAgICAgICAgICAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgICAgICAgICAgICAvLyBza2lwIGZpcnN0IG9uZSBvbiBpbml0XG4gICAgICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QudmFsdWUuc3RhdGUgIT09ICdzYXZlZCcgJiYgdGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QudmFsdWUuc3RhdGUgIT09ICdwcmV2aWV3JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9TYXZlU3RhdHVzU3ViamVjdC5uZXh0KHsuLi50aGlzLmF1dG9TYXZlU3RhdHVzU3ViamVjdC52YWx1ZSwgc3RhdGU6ICdzYXZpbmcnfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoNzUwKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVNhdmVUb1N0b3JhZ2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYXV0b1NhdmVTdG9wVmFsdWVDaGFuZ2VMaXN0ZW4oKSB7XG4gICAgICAgIHRoaXMuYXV0b1NhdmVFdmVudHNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuYXV0b1NhdmVFdmVudHNTdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZXMgdGhlIGZvcm0gdmFsdWUgdG8gbG9jYWxTdG9yYWdlIGlmIGF1dG9TYXZlIGlzIGVuYWJsZWQgYW5kIHRoZSByZXF1aXJlZCBrZXlzIGFyZSBkZWZpbmVkLlxuICAgICAqIEByZXR1cm5zIHt2b2lkfVxuICAgICAqL1xuICAgIHByaXZhdGUgYXV0b1NhdmVTYXZlVG9TdG9yYWdlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kZXNjcmlwdG9yKCkuYXV0b1NhdmUgIT09IHRydWUgfHwgdGhpcy5hdXRvU2F2ZVN0YXR1c1N1YmplY3QudmFsdWUuc3RhdGUgPT09ICdwcmV2aWV3JyB8fCB0aGlzLmF1dG9TYXZlU3RhdHVzU3ViamVjdC52YWx1ZS5zdGF0ZSA9PT0gJ3ByZXZpZXdDdXJyZW50Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21tb25zU3RvcmFnZVNlcnZpY2Uuc2V0SXRlbTxFZGl0b3JBdXRvU2F2ZVByZXZpZXdNb2RlbDxJdGVtPj4odGhpcy5jbXBUeXBlTmFtZSwgdGhpcy5hdXRvU2F2ZVN0b3JhZ2VLZXkoKSwge3NhdmVkOiB0aGlzLmdldEZvcm1WYWx1ZSgpLCBzYXZlZEF0OiBuZXcgRGF0ZSgpfSk7XG4gICAgICAgIHRoaXMuYXV0b1NhdmVTdGF0dXNTdWJqZWN0Lm5leHQoe3N0YXRlOiAnc2F2ZWQnLCB0aW1lc3RhbXA6IG5ldyBEYXRlKCl9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkcyB0aGUgdmFsdWUgZnJvbSB0aGUgbG9jYWwgc3RvcmFnZSBpZiBhdmFpbGFibGVcbiAgICAgKi9cbiAgICBwcml2YXRlIGF1dG9TYXZlTG9hZFNhdmVkRnJvbVN0b3JhZ2UoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHthdXRvU2F2ZSwgbW9kZWx9ID0gdGhpcy5kZXNjcmlwdG9yKCk7XG4gICAgICAgIGlmIChhdXRvU2F2ZSAmJiBtb2RlbC5pMThuQmFzZUtleSkge1xuICAgICAgICAgICAgdGhpcy5hdXRvU2F2ZVJlc3RvcmUuc2V0KHRoaXMuY29tbW9uc1N0b3JhZ2VTZXJ2aWNlLmdldEl0ZW08RWRpdG9yQXV0b1NhdmVQcmV2aWV3TW9kZWw8SXRlbT4+KHRoaXMuY21wVHlwZU5hbWUsIHRoaXMuYXV0b1NhdmVTdG9yYWdlS2V5KCkpID8/IG51bGwpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGlmIChhdXRvU2F2ZVNob3dSZXN0b3JlKCkpIHtcbiAgICA8cC1tZXNzYWdlcyBzZXZlcml0eT1cIndhcm5cIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtZ3Jvdy0xIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cIm0tMCBwLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGVtIGNsYXNzPVwicGkgcGktc2F2ZSBtci00XCI+PC9lbT5cbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICdtbmdFZGl0b3IuYXV0b1NhdmUucmVzdG9yZS50aXRsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZToge2xhc3RDaGFuZ2U6IGF1dG9TYXZlUmVzdG9yZSgpPy5zYXZlZEF0ID8gKGF1dG9TYXZlUmVzdG9yZSgpPy5zYXZlZEF0ISB8IGRhdGU6ICdkZC4gTU0uIFlZWVkgSEg6bW06c3MnKSA6ICcnfVxuICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvaDY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidtbmdFZGl0b3IuYXV0b1NhdmUucmVzdG9yZS5yZXN0b3JlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVDbGFzc109XCJyZXN0b3JlTG9jYWxTdGF0ZUJ1dHRvblN0eWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQXV0b1NhdmVSZXN0b3JlKClcIj48L3AtYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKGF1dG9TYXZlKCk/LnN0YXRlICE9PSAncHJldmlldycgfHwgYXV0b1NhdmUoKT8uc3RhdGUgIT09ICdwcmV2aWV3Q3VycmVudCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS1leWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbWFsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cImF1dG9TYXZlUHJldmlld0J1dHRvbkxhYmVsKCkgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZUNsYXNzXT1cInByZXZpZXdMb2NhbFN0YXRlQnV0dG9uU3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0ZXh0XT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkF1dG9TYXZlUHJldmlldygpXCI+PC9wLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8cC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwic21hbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIidtbmdFZGl0b3IuYXV0b1NhdmUucmVzdG9yZS5kaXNtaXNzJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVDbGFzc109XCJjbGVhckxvY2FsU3RhdGVCdXR0b25TdHlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25BdXRvU2F2ZURpc21pc3MoKVwiPjwvcC1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L3AtbWVzc2FnZXM+XG59XG5cbkBpZiAoYXV0b2ZvY3VzRW5hYmxlZCgpKSB7XG4gICAgPGlucHV0IHR5cGU9XCJoaWRkZW5cIiAjZm9jdXNUaGllZklucHV0IHRhYmluZGV4PVwiMFwiIC8+XG59XG48Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAobmdTdWJtaXQpPVwib25TdWJtaXQoJGV2ZW50KVwiPlxuICAgIDxmb3JtbHktZm9ybSBbZm9ybV09XCJmb3JtXCIgW2ZpZWxkc109XCJmb3JtbHlGaWVsZHNcIiBbb3B0aW9uc109XCJmb3JtbHlPcHRpb25zXCIgW21vZGVsXT1cImZvcm1seUluaXRpYWxJdGVtXCI+PC9mb3JtbHktZm9ybT5cbiAgICA8YnV0dG9uICNzdWJtaXRCdXR0b24gcEJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJoaWRkZW5cIiBbZGlzYWJsZWRdPVwiZm9ybS5kaXNhYmxlZFwiIFtsb2FkaW5nXT1cInN1Ym1pdExvYWRpbmcoKVwiIGxvYWRpbmdJY29uPVwicGkgcGktc3BpbiBwaS1zcGlubmVyXCI+PC9idXR0b24+XG48L2Zvcm0+XG48cC1tZXNzYWdlcyBbdmFsdWVdPVwiZm9ybU1lc3NhZ2VzKClcIiBbZW5hYmxlU2VydmljZV09XCJmYWxzZVwiPjwvcC1tZXNzYWdlcz5cblxuQGlmIChkZXNjcmlwdG9yKCkuYXV0b1NhdmUgJiYgc2hvd0F1dG9TYXZlU3RhdHVzKCkpIHtcbiAgICA8bW5nLWVkaXRvci1hdXRvLXNhdmUtc3RhdHVzIFtzdGF0dXNdPVwiYXV0b1NhdmUoKVwiPjwvbW5nLWVkaXRvci1hdXRvLXNhdmUtc3RhdHVzPlxufVxuIl19
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export const labelInfoTooltipDefaultIcon = 'pi pi-info-circle';
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9lZGl0b3IvY29tcG9uZW50cy9mb3JtbHkvY29uc3RhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFHLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGxhYmVsSW5mb1Rvb2x0aXBEZWZhdWx0SWNvbiA9ICdwaSBwaS1pbmZvLWNpcmNsZSc7XG4iXX0=
|