shared-ui-test-2 1.0.0
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/constants/breadcrumbs.const.d.ts +1 -0
- package/constants/class-name.constant.d.ts +1 -0
- package/constants/query-design-custom-class.constant.d.ts +1 -0
- package/core/auth-providers.module.d.ts +7 -0
- package/core/blank/blank.component.d.ts +5 -0
- package/core/components/horizontal-navigation/horizontal-navigation-menu-item/horizontal-navigation-menu-item.component.d.ts +9 -0
- package/core/components/horizontal-navigation/horizontal-navigation.component.d.ts +7 -0
- package/core/components/not-authorized/not-authorized.component.d.ts +6 -0
- package/core/components/sidebar/main-navigation/main-navigation.component.d.ts +28 -0
- package/core/components/sidebar/sidebar.component.d.ts +5 -0
- package/core/components/top-navigation/top-navigation.component.d.ts +6 -0
- package/core/components/user-info-menu/user-info-menu.component.d.ts +32 -0
- package/core/constants/active-statuses.d.ts +2 -0
- package/core/constants/availability.d.ts +2 -0
- package/core/constants/dashboard-portal-url.d.ts +1 -0
- package/core/constants/full-width-modal-config.d.ts +2 -0
- package/core/constants/horizontal-navigation.config.d.ts +2 -0
- package/core/constants/local-constants.d.ts +13 -0
- package/core/constants/pagination.const.d.ts +6 -0
- package/core/constants/privacy.d.ts +2 -0
- package/core/constants/request-context.d.ts +7 -0
- package/core/constants/yes-no.d.ts +2 -0
- package/core/core.module.d.ts +18 -0
- package/core/directive/authorize.directive.d.ts +14 -0
- package/core/enums/client-name.enum.d.ts +4 -0
- package/core/enums/object-properties.enum.d.ts +57 -0
- package/core/interceptors/error.interceptor.d.ts +13 -0
- package/core/interceptors/health-check-header.interceptor.d.ts +10 -0
- package/core/interfaces/business-rule.interface.d.ts +54 -0
- package/core/interfaces/filters.api.interface.d.ts +32 -0
- package/core/interfaces/horizontal-navigation.interface.d.ts +11 -0
- package/core/interfaces/navigation.interface.d.ts +5 -0
- package/core/interfaces/response-headers.interface.d.ts +5 -0
- package/core/models/auth-service-configuration.d.ts +4 -0
- package/core/models/menu-elements-dto.d.ts +21 -0
- package/core/models/refresh-tokens-response.d.ts +5 -0
- package/core/models/version-data.d.ts +3 -0
- package/core/resolvers/policy.resolver.d.ts +18 -0
- package/core/services/http.service.d.ts +75 -0
- package/core/services/loading.service.d.ts +10 -0
- package/core/services/local-storage.service.d.ts +35 -0
- package/core/services/nav-menu-data.service.d.ts +13 -0
- package/core/services/user-management.service.d.ts +39 -0
- package/core/services/user-policy.service.d.ts +15 -0
- package/core/site/services/support-util.service.d.ts +18 -0
- package/core/token/app-auth-config-injection-token.d.ts +9 -0
- package/core/token/app-env-injection.token.d.ts +8 -0
- package/core/token/policy-injection-token.d.ts +2 -0
- package/core/utils/service-url.util.d.ts +1 -0
- package/core/utils/sql-to-filter-datatype-converter.d.ts +2 -0
- package/core/utils/type-checks.utils.d.ts +10 -0
- package/core/utils/uuid-generator.utils.d.ts +1 -0
- package/directives/let.directive.d.ts +25 -0
- package/directives/remove-cancel-button.directive.d.ts +10 -0
- package/enums/access-types.enum.d.ts +5 -0
- package/enums/action-types.enum.d.ts +16 -0
- package/enums/active-status.enum.d.ts +4 -0
- package/enums/sort-direction.enum.d.ts +4 -0
- package/enums/source-types.enum.d.ts +4 -0
- package/enums/tooltips-prop.enum.d.ts +31 -0
- package/esm2022/constants/breadcrumbs.const.mjs +2 -0
- package/esm2022/constants/class-name.constant.mjs +2 -0
- package/esm2022/constants/query-design-custom-class.constant.mjs +2 -0
- package/esm2022/core/auth-providers.module.mjs +131 -0
- package/esm2022/core/blank/blank.component.mjs +12 -0
- package/esm2022/core/components/horizontal-navigation/horizontal-navigation-menu-item/horizontal-navigation-menu-item.component.mjs +29 -0
- package/esm2022/core/components/horizontal-navigation/horizontal-navigation.component.mjs +17 -0
- package/esm2022/core/components/not-authorized/not-authorized.component.mjs +17 -0
- package/esm2022/core/components/sidebar/main-navigation/main-navigation.component.mjs +88 -0
- package/esm2022/core/components/sidebar/sidebar.component.mjs +12 -0
- package/esm2022/core/components/top-navigation/top-navigation.component.mjs +15 -0
- package/esm2022/core/components/user-info-menu/user-info-menu.component.mjs +96 -0
- package/esm2022/core/constants/active-statuses.mjs +9 -0
- package/esm2022/core/constants/availability.mjs +9 -0
- package/esm2022/core/constants/dashboard-portal-url.mjs +2 -0
- package/esm2022/core/constants/full-width-modal-config.mjs +10 -0
- package/esm2022/core/constants/horizontal-navigation.config.mjs +29 -0
- package/esm2022/core/constants/local-constants.mjs +28 -0
- package/esm2022/core/constants/pagination.const.mjs +10 -0
- package/esm2022/core/constants/privacy.mjs +9 -0
- package/esm2022/core/constants/request-context.mjs +9 -0
- package/esm2022/core/constants/yes-no.mjs +5 -0
- package/esm2022/core/core.module.mjs +81 -0
- package/esm2022/core/directive/authorize.directive.mjs +37 -0
- package/esm2022/core/enums/client-name.enum.mjs +6 -0
- package/esm2022/core/enums/object-properties.enum.mjs +67 -0
- package/esm2022/core/interceptors/error.interceptor.mjs +61 -0
- package/esm2022/core/interceptors/health-check-header.interceptor.mjs +25 -0
- package/esm2022/core/interfaces/business-rule.interface.mjs +18 -0
- package/esm2022/core/interfaces/filters.api.interface.mjs +12 -0
- package/esm2022/core/interfaces/horizontal-navigation.interface.mjs +2 -0
- package/esm2022/core/interfaces/navigation.interface.mjs +2 -0
- package/esm2022/core/interfaces/response-headers.interface.mjs +2 -0
- package/esm2022/core/models/auth-service-configuration.mjs +3 -0
- package/esm2022/core/models/menu-elements-dto.mjs +2 -0
- package/esm2022/core/models/refresh-tokens-response.mjs +3 -0
- package/esm2022/core/models/version-data.mjs +2 -0
- package/esm2022/core/resolvers/policy.resolver.mjs +52 -0
- package/esm2022/core/services/http.service.mjs +111 -0
- package/esm2022/core/services/loading.service.mjs +24 -0
- package/esm2022/core/services/local-storage.service.mjs +55 -0
- package/esm2022/core/services/nav-menu-data.service.mjs +21 -0
- package/esm2022/core/services/user-management.service.mjs +97 -0
- package/esm2022/core/services/user-policy.service.mjs +31 -0
- package/esm2022/core/site/services/support-util.service.mjs +55 -0
- package/esm2022/core/token/app-auth-config-injection-token.mjs +3 -0
- package/esm2022/core/token/app-env-injection.token.mjs +3 -0
- package/esm2022/core/token/policy-injection-token.mjs +3 -0
- package/esm2022/core/utils/service-url.util.mjs +7 -0
- package/esm2022/core/utils/sql-to-filter-datatype-converter.mjs +37 -0
- package/esm2022/core/utils/type-checks.utils.mjs +34 -0
- package/esm2022/core/utils/uuid-generator.utils.mjs +8 -0
- package/esm2022/directives/let.directive.mjs +48 -0
- package/esm2022/directives/remove-cancel-button.directive.mjs +23 -0
- package/esm2022/enums/access-types.enum.mjs +7 -0
- package/esm2022/enums/action-types.enum.mjs +18 -0
- package/esm2022/enums/active-status.enum.mjs +6 -0
- package/esm2022/enums/sort-direction.enum.mjs +6 -0
- package/esm2022/enums/source-types.enum.mjs +6 -0
- package/esm2022/enums/tooltips-prop.enum.mjs +33 -0
- package/esm2022/models/auth-token.mjs +2 -0
- package/esm2022/modules/dynamic-cards/directives/flip-card.directive.mjs +44 -0
- package/esm2022/modules/dynamic-cards/dynamic-card/card-list-container/card-list-container.component.mjs +20 -0
- package/esm2022/modules/dynamic-cards/dynamic-card/dynamic-card/dynamic-card.component.mjs +19 -0
- package/esm2022/modules/dynamic-cards/dynamic-card/dynamic-card-back/dynamic-card-back.component.mjs +16 -0
- package/esm2022/modules/dynamic-cards/dynamic-card/dynamic-card-footer/dynamic-card-footer.component.mjs +21 -0
- package/esm2022/modules/dynamic-cards/dynamic-card/dynamic-card-front/dynamic-card-front.component.mjs +18 -0
- package/esm2022/modules/dynamic-cards/dynamic-cards.module.mjs +60 -0
- package/esm2022/modules/dynamic-cards/interface/card-list.interface.mjs +2 -0
- package/esm2022/modules/dynamic-cards/interface/card.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-button-control/dynamic-form-button-control.component.mjs +27 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-checkbox-control/dynamic-form-checkbox-control.component.mjs +19 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-control-label/dynamic-form-control-label.component.mjs +14 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-counter-control/dynamic-form-counter-control.component.mjs +43 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-datepicker-control/dynamic-form-datepicker-control.component.mjs +48 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-field-control/dynamic-form-field-control.component.mjs +96 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-field-control/dynamic-form-field.matcher.mjs +9 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-input-control/dynamic-form-input-control.component.mjs +22 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ng-select-control/dynamic-form-ng-select-control.component.mjs +27 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-radio-group/dynamic-form-radio-group.component.mjs +31 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-radio-group/enum/radio-group-orientation.enum.mjs +6 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-select-control/dynamic-form-select-control.component.mjs +29 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-switch-control/dynamic-form-switch-control.component.mjs +18 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-text-area-control/dynamic-form-text-area-control.component.mjs +22 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ui-control/dynamic-form-ui-control-list/dynamic-form-ui-control-list.component.mjs +74 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ui-control/dynamic-form-ui-control.component.mjs +30 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/base-form-actions.component.mjs +47 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/enums/base-form-action-types.mjs +7 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/interfaces/base-form-action.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/dynamic-form-ui.component.mjs +64 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-array/dynamic-form-ui-array.component.mjs +26 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-group/dynamic-form-group.component.mjs +26 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-layout/dynamic-form-layout-item/dynamic-form-layout-item.component.mjs +65 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-layout/dynamic-form-layout.component.mjs +33 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/enums/form-field-css-class.enum.mjs +9 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/components/errors-block/errors-block.component.mjs +25 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/dynamic-form-ui.module.mjs +117 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/index.mjs +6 -0
- package/esm2022/modules/dynamic-forms/dynamic-form-UI/providers/ui-form-control-map.provider.mjs +47 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-array.component.mjs +16 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-component.mjs +82 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-control-container.component.mjs +189 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-control.component.mjs +112 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-layout.component.mjs +34 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/constants/form-errors.constant.mjs +34 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/constants/matchers/matchers.constant.mjs +27 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/constants/reg-exp-error.constant.mjs +10 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-id.directive.mjs +24 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-list.directive.mjs +26 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-template.directive.mjs +29 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/dynamic-form-core.module.mjs +49 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/autocomplete.enum.mjs +6 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/control-types.enum.mjs +22 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/form-control-events.enum.mjs +8 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/form-control-statuses.enum.mjs +8 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/form-hooks.enum.mjs +7 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/input-types.enum.mjs +20 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/matcher-operators.enum.mjs +6 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/matcher-types.enum.mjs +10 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/template-directive-alignment.mjs +6 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/textarea-wrap.enum.mjs +6 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/enums/validation-states.enum.mjs +6 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/index.mjs +39 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/components/dynamic-templateable-form-control.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/components/form-control/dynamic-form-control-event.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/components/form-control/dynamic-form-control.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/dynamic-form/dynamic-form-model.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-control-layout.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-layout-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-layout.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/layout-render-template.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/matchers/form-control-matcher.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-array/form-array-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-button-control/button-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-check-control/check-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-control/form-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-control/form-control-relation.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-date-control/date-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-file-control/file-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-group/form-group-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-input-control/form-input-control-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-number-control/form-number-control-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-option/form-option-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-option-control/form-option-control-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/button-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/checkbox-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/colorpicker-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/datepicker-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/fileupload-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/input-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/radio-group-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/rating-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/select-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/slider-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/switch-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/textarea-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/timepicker-control-model-config.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-value-control/form-value-control.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/interfaces/validators/validators.interface.mjs +2 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-array/dynamic-form-array.model.mjs +51 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-array/form-array-group/dynamic-form-array-group.model.mjs +15 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-button-control/dynamic-button-control.model.mjs +19 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-check-control/dynamic-check-control.model.mjs +19 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-control/dynamic-form-control.model.mjs +23 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-date-control/dynamic-date-control.model.mjs +11 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-file-control/dynamic-file-control.model.mjs +9 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-group/dynamic-form-group.model.mjs +37 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-input-control/dynamic-input-control.model.mjs +20 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-number-control/dynamic-number-control.model.mjs +15 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-option/form-option.model.mjs +15 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-option-control/dynamic-option-control.model.mjs +52 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-static-control/static-control.model.mjs +7 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/button/dynamic-button.model.mjs +13 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/checkbox/dynamic-checkbox-group.model.mjs +21 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/checkbox/dynamic-checkbox.model.mjs +12 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/colorpicker/dynamic-colorpicker.model.mjs +12 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/counter/dynamic-counter.model.mjs +11 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/datepicker/dynamic-datepicker.model.mjs +18 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/file-upload/dynamic-file-upload.model.mjs +17 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/input/dynamic-input.model.mjs +13 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/radio/dynamic-radio-group.model.mjs +13 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/rating/dynamic-rating.model.mjs +11 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/select/dynamic-select.model.mjs +18 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/slider/dynamic-slider.model.mjs +14 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/switch/dynamic-switch.model.mjs +11 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/textarea/dynamic-textarea.model.mjs +14 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/timepicker/dynamic-timepicker.model.mjs +12 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/form-value-control/form-value-control.model.mjs +25 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/layout/col-control.model.mjs +10 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/layout/enums/FormLayoutControlTypes.enum.mjs +7 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/layout/layout-control.model.mjs +8 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/layout/layout-group-control.mjs +9 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/layout/row-control.model.mjs +10 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/models/ng-select-control/dynamic-ng-select.model.mjs +19 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/pipes/find-dynamic-control-model/find-dynamic-control-model.mock.mjs +20 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/pipes/find-dynamic-control-model/find-dynamic-control-model.pipe.mjs +38 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/pipes/get-error-from-key-value.pipe.mjs +20 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-component.service.mjs +37 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-layout.service.mjs +35 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-relation.service.mjs +22 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-validation.service.mjs +35 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form.service.mjs +239 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/service/static-form-service.mjs +111 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/tokens/dynamic-matchers.token.mjs +3 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/tokens/form-control-map.token.mjs +3 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/tokens/validators.token.mjs +3 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/utils/events/form-control-events.utils.mjs +5 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms-core/utils/json/json.utils.mjs +30 -0
- package/esm2022/modules/dynamic-forms/dynamic-forms.module.mjs +32 -0
- package/esm2022/modules/material/mat-cdk-module.mjs +17 -0
- package/esm2022/modules/material/material.module.mjs +201 -0
- package/esm2022/modules/query-builder/components/query-design/query-design.component.mjs +103 -0
- package/esm2022/modules/query-builder/components/query-design/rule-line/components/alphanumeric-control/alphanumeric-control.component.mjs +150 -0
- package/esm2022/modules/query-builder/components/query-design/rule-line/components/boolean-control/boolean-control.component.mjs +102 -0
- package/esm2022/modules/query-builder/components/query-design/rule-line/components/date-control/date-control.component.mjs +76 -0
- package/esm2022/modules/query-builder/components/query-design/rule-line/components/numeric-control/numeric-control.component.mjs +168 -0
- package/esm2022/modules/query-builder/components/query-design/rule-line/constants/operators-sets.mjs +108 -0
- package/esm2022/modules/query-builder/components/query-design/rule-line/helpers/condition-operators.mapper.mjs +8 -0
- package/esm2022/modules/query-builder/components/query-design/rule-line/helpers/control-values-mapper.mjs +78 -0
- package/esm2022/modules/query-builder/components/query-design/rule-line/rule-line.component.mjs +234 -0
- package/esm2022/modules/query-builder/directive/auto-complete-position.directive.mjs +30 -0
- package/esm2022/modules/query-builder/interfaces/query-builder.interface.mjs +39 -0
- package/esm2022/modules/query-builder/interfaces/select-custom-css-object.mjs +2 -0
- package/esm2022/modules/query-builder/query-builder.module.mjs +66 -0
- package/esm2022/modules/ui-kit/components/accordion/accordion-content/accordion-content.component.mjs +16 -0
- package/esm2022/modules/ui-kit/components/accordion/accordion-trigger.directive.mjs +30 -0
- package/esm2022/modules/ui-kit/components/accordion/accordion.directive.mjs +19 -0
- package/esm2022/modules/ui-kit/components/banner/banner.component.mjs +53 -0
- package/esm2022/modules/ui-kit/components/banner/banner.service.mjs +64 -0
- package/esm2022/modules/ui-kit/components/breadcrumbs/breadcrumbs.component.mjs +25 -0
- package/esm2022/modules/ui-kit/components/breadcrumbs/model/breadCrumbItem.mjs +2 -0
- package/esm2022/modules/ui-kit/components/breadcrumbs/service/breadcrumb.service.mjs +63 -0
- package/esm2022/modules/ui-kit/components/breadcrumbs/utils/crumb-service.enum.mjs +8 -0
- package/esm2022/modules/ui-kit/components/buttons/button-control/button-control.component.mjs +46 -0
- package/esm2022/modules/ui-kit/components/buttons/buttons-list/buttons-list.component.mjs +11 -0
- package/esm2022/modules/ui-kit/components/buttons/circle-button/circle-button.component.mjs +37 -0
- package/esm2022/modules/ui-kit/components/card-container/card-container.component.mjs +11 -0
- package/esm2022/modules/ui-kit/components/common-breadcrumbs/common-breadcrumbs.component.mjs +30 -0
- package/esm2022/modules/ui-kit/components/common-breadcrumbs/interface/breadcrumb.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/components/common-breadcrumbs/service/breadcrumb.service.mjs +65 -0
- package/esm2022/modules/ui-kit/components/data-pagination/data-pagination.component.mjs +155 -0
- package/esm2022/modules/ui-kit/components/data-table/api-classes/filter-manager.mjs +50 -0
- package/esm2022/modules/ui-kit/components/data-table/api-classes/grid-api.mjs +73 -0
- package/esm2022/modules/ui-kit/components/data-table/base-data-table-container/base-data-table-container.component.mjs +10 -0
- package/esm2022/modules/ui-kit/components/data-table/constants/change-type.enum.mjs +8 -0
- package/esm2022/modules/ui-kit/components/data-table/constants/column-id.mjs +13 -0
- package/esm2022/modules/ui-kit/components/data-table/constants/row.mjs +4 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col/base-data-col/base-data-col.component.mjs +93 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col/data-col/data-col.component.mjs +17 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-action-button/data-col-action-button.component.mjs +27 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-boolean/data-col-boolean.component.mjs +20 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-multivalue/data-col-multivalue.component.mjs +18 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-nested/data-col-nested.component.mjs +31 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-reference/data-col-reference.component.mjs +96 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col/data-col-view/data-col-view.component.mjs +75 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col-disp/data-col-disp.component.mjs +248 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col-filter/data-col-filter.component.mjs +323 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-between-value.mjs +68 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-contains-value.mjs +25 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-in-value.mjs +64 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-slider-value.mjs +42 -0
- package/esm2022/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/filter-value-executor-provider.mjs +42 -0
- package/esm2022/modules/ui-kit/components/data-table/data-column-filter/data-column-filter.component.mjs +69 -0
- package/esm2022/modules/ui-kit/components/data-table/data-row/data-row.component.mjs +251 -0
- package/esm2022/modules/ui-kit/components/data-table/data-table/data-table.component.mjs +1534 -0
- package/esm2022/modules/ui-kit/components/data-table/data-table-actions/data-table-actions.component.mjs +153 -0
- package/esm2022/modules/ui-kit/components/data-table/data-table-body/data-table-body.component.mjs +205 -0
- package/esm2022/modules/ui-kit/components/data-table/data-table-check-rows/data-table-check-rows.component.mjs +61 -0
- package/esm2022/modules/ui-kit/components/data-table/data-table-row-actions/const/data-table-actions.enum.mjs +8 -0
- package/esm2022/modules/ui-kit/components/data-table/data-table-row-actions/data-table-row-actions.component.mjs +120 -0
- package/esm2022/modules/ui-kit/components/data-table/enums/col-filter-types.mjs +17 -0
- package/esm2022/modules/ui-kit/components/data-table/header-row/header-row.component.mjs +14 -0
- package/esm2022/modules/ui-kit/components/data-table/interfaces/data-table-component.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/components/data-table/interfaces/filter-value-executor.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/components/data-table/services/data-table-context.service.mjs +26 -0
- package/esm2022/modules/ui-kit/components/data-table-wrap/data-table-wrap.component.mjs +38 -0
- package/esm2022/modules/ui-kit/components/excel-table/excel-table.component.mjs +164 -0
- package/esm2022/modules/ui-kit/components/excel-table/interface/excel-table.interface.mjs +44 -0
- package/esm2022/modules/ui-kit/components/form/base-form-control/base-form-control.component.mjs +41 -0
- package/esm2022/modules/ui-kit/components/form/base-form-page/base-form-page.component.mjs +8 -0
- package/esm2022/modules/ui-kit/components/form/checkbox-form-control/checkbox-form-control.component.mjs +21 -0
- package/esm2022/modules/ui-kit/components/form/counter-form-control/counter-form-control.component.mjs +66 -0
- package/esm2022/modules/ui-kit/components/form/form-container/form-container.component.mjs +133 -0
- package/esm2022/modules/ui-kit/components/form/form-group-container/form-group-container.component.mjs +11 -0
- package/esm2022/modules/ui-kit/components/form/input-form-control/input-form-control.component.mjs +20 -0
- package/esm2022/modules/ui-kit/components/form/multivalue-form-control/custom-input/custom-input.component.mjs +35 -0
- package/esm2022/modules/ui-kit/components/form/multivalue-form-control/custom-input/old-new-value.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/components/form/multivalue-form-control/multivalue-form-control.component.mjs +66 -0
- package/esm2022/modules/ui-kit/components/form/radio-form-control/radio-form-control.component.mjs +19 -0
- package/esm2022/modules/ui-kit/components/form/select-form-control/select-form-control.component.mjs +78 -0
- package/esm2022/modules/ui-kit/components/form/selection-group-container/selection-group-container.component.mjs +18 -0
- package/esm2022/modules/ui-kit/components/form/textarea-form-control/textarea-form-control.component.mjs +20 -0
- package/esm2022/modules/ui-kit/components/icon/expand-collapse-icon/expand-collapse-icon.component.mjs +26 -0
- package/esm2022/modules/ui-kit/components/icon/icon/icon.component.mjs +35 -0
- package/esm2022/modules/ui-kit/components/icon/text-icon/text-icon.component.mjs +22 -0
- package/esm2022/modules/ui-kit/components/layouts/form-layout/form-layout.component.mjs +56 -0
- package/esm2022/modules/ui-kit/components/layouts/primary-layout/primary-layout.component.mjs +11 -0
- package/esm2022/modules/ui-kit/components/loader/loader.component.mjs +27 -0
- package/esm2022/modules/ui-kit/components/mat-actions-button/mat-actions-button.mjs +34 -0
- package/esm2022/modules/ui-kit/components/modals/common-confirm-modal/common-confirm-modal.component.mjs +53 -0
- package/esm2022/modules/ui-kit/components/modals/confirm-modal/confirm-modal.component.mjs +37 -0
- package/esm2022/modules/ui-kit/components/modals/delete-modal/delete-modal.component.mjs +41 -0
- package/esm2022/modules/ui-kit/components/modals/enums/confirmation-modal.enum.mjs +13 -0
- package/esm2022/modules/ui-kit/components/snackbar/snackbar.component.mjs +21 -0
- package/esm2022/modules/ui-kit/components/tabs/constants/index.mjs +2 -0
- package/esm2022/modules/ui-kit/components/tabs/interfaces/index.mjs +2 -0
- package/esm2022/modules/ui-kit/components/tabs/tab-group/tab-group.component.mjs +77 -0
- package/esm2022/modules/ui-kit/components/tabs/tab.directive.mjs +60 -0
- package/esm2022/modules/ui-kit/components/tree-view/tree-view.component.mjs +374 -0
- package/esm2022/modules/ui-kit/constants/data-table-icon-class.constant.mjs +2 -0
- package/esm2022/modules/ui-kit/constants/data-table.constants.mjs +7 -0
- package/esm2022/modules/ui-kit/constants/date-separator.constant.mjs +2 -0
- package/esm2022/modules/ui-kit/constants/snackbar.constants.mjs +4 -0
- package/esm2022/modules/ui-kit/enums/action-type.enum.mjs +14 -0
- package/esm2022/modules/ui-kit/enums/coderefs-prop.enum.mjs +26 -0
- package/esm2022/modules/ui-kit/enums/color-schemes.enum.mjs +13 -0
- package/esm2022/modules/ui-kit/enums/column-disable-mode.enum.mjs +7 -0
- package/esm2022/modules/ui-kit/enums/column-types.enum.mjs +10 -0
- package/esm2022/modules/ui-kit/enums/component-sizes.enum.mjs +6 -0
- package/esm2022/modules/ui-kit/enums/data-type.enum.mjs +13 -0
- package/esm2022/modules/ui-kit/enums/form-item-type.mjs +7 -0
- package/esm2022/modules/ui-kit/enums/form-types.enum.mjs +7 -0
- package/esm2022/modules/ui-kit/enums/form-url-params.enum.mjs +6 -0
- package/esm2022/modules/ui-kit/enums/icons.enum.mjs +24 -0
- package/esm2022/modules/ui-kit/enums/operator.enum.mjs +21 -0
- package/esm2022/modules/ui-kit/enums/position.enum.mjs +6 -0
- package/esm2022/modules/ui-kit/enums/select-option.enum.mjs +10 -0
- package/esm2022/modules/ui-kit/enums/snackbar.enum.mjs +8 -0
- package/esm2022/modules/ui-kit/enums/url-param-action.enum.mjs +6 -0
- package/esm2022/modules/ui-kit/enums/utils.enum.mjs +6 -0
- package/esm2022/modules/ui-kit/enums/viewType.enum.mjs +7 -0
- package/esm2022/modules/ui-kit/interfaces/api.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/interfaces/confirm-modal-data.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/interfaces/constants.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/interfaces/data-table.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/interfaces/form.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/interfaces/generic.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/interfaces/list-item.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/interfaces/mat-action-buttons.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/interfaces/row-selection-info.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/interfaces/select.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/interfaces/snackbar.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/interfaces/tree-view.interface.mjs +2 -0
- package/esm2022/modules/ui-kit/models/storage-object.model.mjs +3 -0
- package/esm2022/modules/ui-kit/pipes/column-filter.pipe.mjs +21 -0
- package/esm2022/modules/ui-kit/pipes/filter-by-prop.pipe.mjs +27 -0
- package/esm2022/modules/ui-kit/pipes/first-letter-text.pipe.mjs +17 -0
- package/esm2022/modules/ui-kit/pipes/keys.pipe.mjs +17 -0
- package/esm2022/modules/ui-kit/pipes/paginate.pipe.mjs +29 -0
- package/esm2022/modules/ui-kit/pipes/search.pipe.mjs +50 -0
- package/esm2022/modules/ui-kit/services/api/api.service.mjs +72 -0
- package/esm2022/modules/ui-kit/services/api/rest-api.service.mjs +62 -0
- package/esm2022/modules/ui-kit/services/data-table.service.mjs +202 -0
- package/esm2022/modules/ui-kit/services/form.service.mjs +91 -0
- package/esm2022/modules/ui-kit/services/formatters/date-formatter.service.mjs +48 -0
- package/esm2022/modules/ui-kit/services/mappers/form-data-table-mapper.service.mjs +19 -0
- package/esm2022/modules/ui-kit/services/select.service.mjs +19 -0
- package/esm2022/modules/ui-kit/services/snackbar.service.mjs +43 -0
- package/esm2022/modules/ui-kit/services/url.service.mjs +17 -0
- package/esm2022/modules/ui-kit/types/basic.type.mjs +2 -0
- package/esm2022/modules/ui-kit/types/function.type.mjs +2 -0
- package/esm2022/modules/ui-kit/types/select.type.mjs +2 -0
- package/esm2022/modules/ui-kit/ui-kit.module.mjs +370 -0
- package/esm2022/public-api.mjs +373 -0
- package/esm2022/resolvers/null-value.resolver.mjs +16 -0
- package/esm2022/services/api/common-crud-api.service.mjs +59 -0
- package/esm2022/services/api/filter-api.service.mjs +30 -0
- package/esm2022/services/selectable.service.mjs +23 -0
- package/esm2022/shared-pipes/pipes/search.pipe.mjs +48 -0
- package/esm2022/shared-ui-test-2.mjs +5 -0
- package/esm2022/shared.module.mjs +57 -0
- package/esm2022/validators/debounce-async.validator.mjs +12 -0
- package/fesm2022/shared-ui-test-2.mjs +12538 -0
- package/fesm2022/shared-ui-test-2.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/models/auth-token.d.ts +3 -0
- package/modules/dynamic-cards/directives/flip-card.directive.d.ts +15 -0
- package/modules/dynamic-cards/dynamic-card/card-list-container/card-list-container.component.d.ts +10 -0
- package/modules/dynamic-cards/dynamic-card/dynamic-card/dynamic-card.component.d.ts +7 -0
- package/modules/dynamic-cards/dynamic-card/dynamic-card-back/dynamic-card-back.component.d.ts +7 -0
- package/modules/dynamic-cards/dynamic-card/dynamic-card-footer/dynamic-card-footer.component.d.ts +10 -0
- package/modules/dynamic-cards/dynamic-card/dynamic-card-front/dynamic-card-front.component.d.ts +8 -0
- package/modules/dynamic-cards/dynamic-cards.module.d.ts +18 -0
- package/modules/dynamic-cards/interface/card-list.interface.d.ts +9 -0
- package/modules/dynamic-cards/interface/card.interface.d.ts +12 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-button-control/dynamic-form-button-control.component.d.ts +11 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-checkbox-control/dynamic-form-checkbox-control.component.d.ts +9 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-control-label/dynamic-form-control-label.component.d.ts +7 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-counter-control/dynamic-form-counter-control.component.d.ts +13 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-datepicker-control/dynamic-form-datepicker-control.component.d.ts +13 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-field-control/dynamic-form-field-control.component.d.ts +34 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-field-control/dynamic-form-field.matcher.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-input-control/dynamic-form-input-control.component.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ng-select-control/dynamic-form-ng-select-control.component.d.ts +11 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-radio-group/dynamic-form-radio-group.component.d.ts +12 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-radio-group/enum/radio-group-orientation.enum.d.ts +4 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-select-control/dynamic-form-select-control.component.d.ts +10 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-switch-control/dynamic-form-switch-control.component.d.ts +9 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-text-area-control/dynamic-form-text-area-control.component.d.ts +9 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ui-control/dynamic-form-ui-control-list/dynamic-form-ui-control-list.component.d.ts +26 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/controls/dynamic-form-ui-control/dynamic-form-ui-control.component.d.ts +14 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/base-form-actions.component.d.ts +19 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/enums/base-form-action-types.d.ts +5 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/base-form-actions/interfaces/base-form-action.interface.d.ts +5 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form/dynamic-form-ui.component.d.ts +26 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-array/dynamic-form-ui-array.component.d.ts +9 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-group/dynamic-form-group.component.d.ts +11 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-layout/dynamic-form-layout-item/dynamic-form-layout-item.component.d.ts +23 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/dynamic-form-layout/dynamic-form-layout.component.d.ts +21 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/enums/form-field-css-class.enum.d.ts +7 -0
- package/modules/dynamic-forms/dynamic-form-UI/components/errors-block/errors-block.component.d.ts +11 -0
- package/modules/dynamic-forms/dynamic-form-UI/dynamic-form-ui.module.d.ts +32 -0
- package/modules/dynamic-forms/dynamic-form-UI/index.d.ts +3 -0
- package/modules/dynamic-forms/dynamic-form-UI/providers/ui-form-control-map.provider.d.ts +6 -0
- package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-array.component.d.ts +10 -0
- package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-component.d.ts +26 -0
- package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-control-container.component.d.ts +57 -0
- package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-control.component.d.ts +42 -0
- package/modules/dynamic-forms/dynamic-forms-core/components/dynamic-form-layout.component.d.ts +28 -0
- package/modules/dynamic-forms/dynamic-forms-core/constants/form-errors.constant.d.ts +6 -0
- package/modules/dynamic-forms/dynamic-forms-core/constants/matchers/matchers.constant.d.ts +6 -0
- package/modules/dynamic-forms/dynamic-forms-core/constants/reg-exp-error.constant.d.ts +9 -0
- package/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-id.directive.d.ts +11 -0
- package/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-list.directive.d.ts +11 -0
- package/modules/dynamic-forms/dynamic-forms-core/directives/dynamic-template.directive.d.ts +13 -0
- package/modules/dynamic-forms/dynamic-forms-core/dynamic-form-core.module.d.ts +12 -0
- package/modules/dynamic-forms/dynamic-forms-core/enums/autocomplete.enum.d.ts +4 -0
- package/modules/dynamic-forms/dynamic-forms-core/enums/control-types.enum.d.ts +20 -0
- package/modules/dynamic-forms/dynamic-forms-core/enums/form-control-events.enum.d.ts +6 -0
- package/modules/dynamic-forms/dynamic-forms-core/enums/form-control-statuses.enum.d.ts +6 -0
- package/modules/dynamic-forms/dynamic-forms-core/enums/form-hooks.enum.d.ts +5 -0
- package/modules/dynamic-forms/dynamic-forms-core/enums/input-types.enum.d.ts +18 -0
- package/modules/dynamic-forms/dynamic-forms-core/enums/matcher-operators.enum.d.ts +4 -0
- package/modules/dynamic-forms/dynamic-forms-core/enums/matcher-types.enum.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-forms-core/enums/template-directive-alignment.d.ts +4 -0
- package/modules/dynamic-forms/dynamic-forms-core/enums/textarea-wrap.enum.d.ts +4 -0
- package/modules/dynamic-forms/dynamic-forms-core/enums/validation-states.enum.d.ts +4 -0
- package/modules/dynamic-forms/dynamic-forms-core/index.d.ts +38 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/components/dynamic-templateable-form-control.interface.d.ts +5 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/components/form-control/dynamic-form-control-event.interface.d.ts +15 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/components/form-control/dynamic-form-control.interface.d.ts +19 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/dynamic-form/dynamic-form-model.interface.d.ts +4 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-control-layout.interface.d.ts +3 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-layout-config.interface.d.ts +6 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/form-layout.interface.d.ts +2 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/layout/layout-render-template.interface.d.ts +9 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/matchers/form-control-matcher.interface.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-array/form-array-model-config.interface.d.ts +7 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-button-control/button-control-model-config.interface.d.ts +4 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-check-control/check-control-model-config.interface.d.ts +4 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-control/form-control-model-config.interface.d.ts +16 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-control/form-control-relation.interface.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-date-control/date-control-model-config.interface.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-file-control/file-control-model-config.interface.d.ts +4 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-group/form-group-model-config.interface.d.ts +6 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-input-control/form-input-control-config.interface.d.ts +14 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-number-control/form-number-control-config.interface.d.ts +7 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-option/form-option-config.interface.d.ts +5 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-option-control/form-option-control-config.interface.d.ts +6 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/button-control-model-config.interface.d.ts +6 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/checkbox-control-model-config.interface.d.ts +5 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/colorpicker-control-model-config.interface.d.ts +5 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/datepicker-control-model-config.interface.d.ts +11 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/fileupload-control-model-config.interface.d.ts +10 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/input-control-model-config.interface.d.ts +9 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/radio-group-model-config.interface.d.ts +4 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/rating-control-model-config.interface.d.ts +4 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/select-control-model-config.interface.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/slider-control-model-config.interface.d.ts +7 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/switch-control-model-config.interface.d.ts +5 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/textarea-control-model-config.interface.d.ts +6 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-ui-models/timepicker-control-model-config.interface.d.ts +5 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/models/form-value-control/form-value-control.interface.d.ts +10 -0
- package/modules/dynamic-forms/dynamic-forms-core/interfaces/validators/validators.interface.d.ts +5 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-array/dynamic-form-array.model.d.ts +19 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-array/form-array-group/dynamic-form-array-group.model.d.ts +12 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-button-control/dynamic-button-control.model.d.ts +9 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-check-control/dynamic-check-control.model.d.ts +9 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-control/dynamic-form-control.model.d.ts +24 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-date-control/dynamic-date-control.model.d.ts +9 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-file-control/dynamic-file-control.model.d.ts +6 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-group/dynamic-form-group.model.d.ts +17 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-input-control/dynamic-input-control.model.d.ts +16 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-number-control/dynamic-number-control.model.d.ts +12 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-option/form-option.model.d.ts +9 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-option-control/dynamic-option-control.model.d.ts +19 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-static-control/static-control.model.d.ts +7 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/button/dynamic-button.model.d.ts +10 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/checkbox/dynamic-checkbox-group.model.d.ts +12 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/checkbox/dynamic-checkbox.model.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/colorpicker/dynamic-colorpicker.model.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/counter/dynamic-counter.model.d.ts +7 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/datepicker/dynamic-datepicker.model.d.ts +15 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/file-upload/dynamic-file-upload.model.d.ts +13 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/input/dynamic-input.model.d.ts +10 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/radio/dynamic-radio-group.model.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/rating/dynamic-rating.model.d.ts +7 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/select/dynamic-select.model.d.ts +11 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/slider/dynamic-slider.model.d.ts +10 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/switch/dynamic-switch.model.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/textarea/dynamic-textarea.model.d.ts +9 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-ui-models/timepicker/dynamic-timepicker.model.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/form-value-control/form-value-control.model.d.ts +17 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/layout/col-control.model.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/layout/enums/FormLayoutControlTypes.enum.d.ts +5 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/layout/layout-control.model.d.ts +9 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/layout/layout-group-control.d.ts +7 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/layout/row-control.model.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-forms-core/models/ng-select-control/dynamic-ng-select.model.d.ts +12 -0
- package/modules/dynamic-forms/dynamic-forms-core/pipes/find-dynamic-control-model/find-dynamic-control-model.mock.d.ts +11 -0
- package/modules/dynamic-forms/dynamic-forms-core/pipes/find-dynamic-control-model/find-dynamic-control-model.pipe.d.ts +20 -0
- package/modules/dynamic-forms/dynamic-forms-core/pipes/get-error-from-key-value.pipe.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-component.service.d.ts +14 -0
- package/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-layout.service.d.ts +14 -0
- package/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-relation.service.d.ts +8 -0
- package/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form-validation.service.d.ts +11 -0
- package/modules/dynamic-forms/dynamic-forms-core/service/dynamic-form.service.d.ts +30 -0
- package/modules/dynamic-forms/dynamic-forms-core/service/static-form-service.d.ts +17 -0
- package/modules/dynamic-forms/dynamic-forms-core/tokens/dynamic-matchers.token.d.ts +3 -0
- package/modules/dynamic-forms/dynamic-forms-core/tokens/form-control-map.token.d.ts +3 -0
- package/modules/dynamic-forms/dynamic-forms-core/tokens/validators.token.d.ts +3 -0
- package/modules/dynamic-forms/dynamic-forms-core/utils/events/form-control-events.utils.d.ts +2 -0
- package/modules/dynamic-forms/dynamic-forms-core/utils/json/json.utils.d.ts +5 -0
- package/modules/dynamic-forms/dynamic-forms.module.d.ts +9 -0
- package/modules/material/mat-cdk-module.d.ts +7 -0
- package/modules/material/material.module.d.ts +50 -0
- package/modules/query-builder/components/query-design/query-design.component.d.ts +35 -0
- package/modules/query-builder/components/query-design/rule-line/components/alphanumeric-control/alphanumeric-control.component.d.ts +46 -0
- package/modules/query-builder/components/query-design/rule-line/components/boolean-control/boolean-control.component.d.ts +29 -0
- package/modules/query-builder/components/query-design/rule-line/components/date-control/date-control.component.d.ts +21 -0
- package/modules/query-builder/components/query-design/rule-line/components/numeric-control/numeric-control.component.d.ts +46 -0
- package/modules/query-builder/components/query-design/rule-line/constants/operators-sets.d.ts +12 -0
- package/modules/query-builder/components/query-design/rule-line/helpers/condition-operators.mapper.d.ts +6 -0
- package/modules/query-builder/components/query-design/rule-line/helpers/control-values-mapper.d.ts +7 -0
- package/modules/query-builder/components/query-design/rule-line/rule-line.component.d.ts +64 -0
- package/modules/query-builder/directive/auto-complete-position.directive.d.ts +11 -0
- package/modules/query-builder/interfaces/query-builder.interface.d.ts +61 -0
- package/modules/query-builder/interfaces/select-custom-css-object.d.ts +7 -0
- package/modules/query-builder/query-builder.module.d.ts +18 -0
- package/modules/ui-kit/components/accordion/accordion-content/accordion-content.component.d.ts +8 -0
- package/modules/ui-kit/components/accordion/accordion-trigger.directive.d.ts +10 -0
- package/modules/ui-kit/components/accordion/accordion.directive.d.ts +7 -0
- package/modules/ui-kit/components/banner/banner.component.d.ts +14 -0
- package/modules/ui-kit/components/banner/banner.service.d.ts +27 -0
- package/modules/ui-kit/components/breadcrumbs/breadcrumbs.component.d.ts +15 -0
- package/modules/ui-kit/components/breadcrumbs/model/breadCrumbItem.d.ts +4 -0
- package/modules/ui-kit/components/breadcrumbs/service/breadcrumb.service.d.ts +19 -0
- package/modules/ui-kit/components/breadcrumbs/utils/crumb-service.enum.d.ts +6 -0
- package/modules/ui-kit/components/buttons/button-control/button-control.component.d.ts +16 -0
- package/modules/ui-kit/components/buttons/buttons-list/buttons-list.component.d.ts +5 -0
- package/modules/ui-kit/components/buttons/circle-button/circle-button.component.d.ts +20 -0
- package/modules/ui-kit/components/card-container/card-container.component.d.ts +5 -0
- package/modules/ui-kit/components/common-breadcrumbs/common-breadcrumbs.component.d.ts +20 -0
- package/modules/ui-kit/components/common-breadcrumbs/interface/breadcrumb.interface.d.ts +6 -0
- package/modules/ui-kit/components/common-breadcrumbs/service/breadcrumb.service.d.ts +21 -0
- package/modules/ui-kit/components/data-pagination/data-pagination.component.d.ts +54 -0
- package/modules/ui-kit/components/data-table/api-classes/filter-manager.d.ts +13 -0
- package/modules/ui-kit/components/data-table/api-classes/grid-api.d.ts +31 -0
- package/modules/ui-kit/components/data-table/base-data-table-container/base-data-table-container.component.d.ts +7 -0
- package/modules/ui-kit/components/data-table/constants/change-type.enum.d.ts +6 -0
- package/modules/ui-kit/components/data-table/constants/column-id.d.ts +2 -0
- package/modules/ui-kit/components/data-table/constants/row.d.ts +2 -0
- package/modules/ui-kit/components/data-table/data-col/base-data-col/base-data-col.component.d.ts +28 -0
- package/modules/ui-kit/components/data-table/data-col/data-col/data-col.component.d.ts +7 -0
- package/modules/ui-kit/components/data-table/data-col/data-col-action-button/data-col-action-button.component.d.ts +12 -0
- package/modules/ui-kit/components/data-table/data-col/data-col-boolean/data-col-boolean.component.d.ts +8 -0
- package/modules/ui-kit/components/data-table/data-col/data-col-multivalue/data-col-multivalue.component.d.ts +8 -0
- package/modules/ui-kit/components/data-table/data-col/data-col-nested/data-col-nested.component.d.ts +13 -0
- package/modules/ui-kit/components/data-table/data-col/data-col-reference/data-col-reference.component.d.ts +29 -0
- package/modules/ui-kit/components/data-table/data-col/data-col-view/data-col-view.component.d.ts +27 -0
- package/modules/ui-kit/components/data-table/data-col-disp/data-col-disp.component.d.ts +60 -0
- package/modules/ui-kit/components/data-table/data-col-filter/data-col-filter.component.d.ts +85 -0
- package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-between-value.d.ts +12 -0
- package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-contains-value.d.ts +9 -0
- package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-in-value.d.ts +13 -0
- package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/col-filter-slider-value.d.ts +10 -0
- package/modules/ui-kit/components/data-table/data-col-filter/filter-value-helpers/filter-value-executor-provider.d.ts +11 -0
- package/modules/ui-kit/components/data-table/data-column-filter/data-column-filter.component.d.ts +29 -0
- package/modules/ui-kit/components/data-table/data-row/data-row.component.d.ts +81 -0
- package/modules/ui-kit/components/data-table/data-table/data-table.component.d.ts +302 -0
- package/modules/ui-kit/components/data-table/data-table-actions/data-table-actions.component.d.ts +53 -0
- package/modules/ui-kit/components/data-table/data-table-body/data-table-body.component.d.ts +75 -0
- package/modules/ui-kit/components/data-table/data-table-check-rows/data-table-check-rows.component.d.ts +25 -0
- package/modules/ui-kit/components/data-table/data-table-row-actions/const/data-table-actions.enum.d.ts +6 -0
- package/modules/ui-kit/components/data-table/data-table-row-actions/data-table-row-actions.component.d.ts +42 -0
- package/modules/ui-kit/components/data-table/enums/col-filter-types.d.ts +14 -0
- package/modules/ui-kit/components/data-table/header-row/header-row.component.d.ts +7 -0
- package/modules/ui-kit/components/data-table/interfaces/data-table-component.interface.d.ts +28 -0
- package/modules/ui-kit/components/data-table/interfaces/filter-value-executor.interface.d.ts +12 -0
- package/modules/ui-kit/components/data-table/services/data-table-context.service.d.ts +12 -0
- package/modules/ui-kit/components/data-table-wrap/data-table-wrap.component.d.ts +13 -0
- package/modules/ui-kit/components/excel-table/excel-table.component.d.ts +28 -0
- package/modules/ui-kit/components/excel-table/interface/excel-table.interface.d.ts +29 -0
- package/modules/ui-kit/components/form/base-form-control/base-form-control.component.d.ts +17 -0
- package/modules/ui-kit/components/form/base-form-page/base-form-page.component.d.ts +14 -0
- package/modules/ui-kit/components/form/checkbox-form-control/checkbox-form-control.component.d.ts +8 -0
- package/modules/ui-kit/components/form/counter-form-control/counter-form-control.component.d.ts +21 -0
- package/modules/ui-kit/components/form/form-container/form-container.component.d.ts +45 -0
- package/modules/ui-kit/components/form/form-group-container/form-group-container.component.d.ts +5 -0
- package/modules/ui-kit/components/form/input-form-control/input-form-control.component.d.ts +8 -0
- package/modules/ui-kit/components/form/multivalue-form-control/custom-input/custom-input.component.d.ts +15 -0
- package/modules/ui-kit/components/form/multivalue-form-control/custom-input/old-new-value.interface.d.ts +4 -0
- package/modules/ui-kit/components/form/multivalue-form-control/multivalue-form-control.component.d.ts +26 -0
- package/modules/ui-kit/components/form/radio-form-control/radio-form-control.component.d.ts +8 -0
- package/modules/ui-kit/components/form/select-form-control/select-form-control.component.d.ts +32 -0
- package/modules/ui-kit/components/form/selection-group-container/selection-group-container.component.d.ts +7 -0
- package/modules/ui-kit/components/form/textarea-form-control/textarea-form-control.component.d.ts +8 -0
- package/modules/ui-kit/components/icon/expand-collapse-icon/expand-collapse-icon.component.d.ts +11 -0
- package/modules/ui-kit/components/icon/icon/icon.component.d.ts +14 -0
- package/modules/ui-kit/components/icon/text-icon/text-icon.component.d.ts +10 -0
- package/modules/ui-kit/components/layouts/form-layout/form-layout.component.d.ts +29 -0
- package/modules/ui-kit/components/layouts/primary-layout/primary-layout.component.d.ts +5 -0
- package/modules/ui-kit/components/loader/loader.component.d.ts +12 -0
- package/modules/ui-kit/components/mat-actions-button/mat-actions-button.d.ts +14 -0
- package/modules/ui-kit/components/modals/common-confirm-modal/common-confirm-modal.component.d.ts +17 -0
- package/modules/ui-kit/components/modals/confirm-modal/confirm-modal.component.d.ts +13 -0
- package/modules/ui-kit/components/modals/delete-modal/delete-modal.component.d.ts +17 -0
- package/modules/ui-kit/components/modals/enums/confirmation-modal.enum.d.ts +11 -0
- package/modules/ui-kit/components/snackbar/snackbar.component.d.ts +10 -0
- package/modules/ui-kit/components/tabs/constants/index.d.ts +1 -0
- package/modules/ui-kit/components/tabs/interfaces/index.d.ts +3 -0
- package/modules/ui-kit/components/tabs/tab-group/tab-group.component.d.ts +25 -0
- package/modules/ui-kit/components/tabs/tab.directive.d.ts +16 -0
- package/modules/ui-kit/components/tree-view/tree-view.component.d.ts +67 -0
- package/modules/ui-kit/constants/data-table-icon-class.constant.d.ts +1 -0
- package/modules/ui-kit/constants/data-table.constants.d.ts +6 -0
- package/modules/ui-kit/constants/date-separator.constant.d.ts +1 -0
- package/modules/ui-kit/constants/snackbar.constants.d.ts +3 -0
- package/modules/ui-kit/enums/action-type.enum.d.ts +12 -0
- package/modules/ui-kit/enums/coderefs-prop.enum.d.ts +24 -0
- package/modules/ui-kit/enums/color-schemes.enum.d.ts +11 -0
- package/modules/ui-kit/enums/column-disable-mode.enum.d.ts +5 -0
- package/modules/ui-kit/enums/column-types.enum.d.ts +8 -0
- package/modules/ui-kit/enums/component-sizes.enum.d.ts +4 -0
- package/modules/ui-kit/enums/data-type.enum.d.ts +10 -0
- package/modules/ui-kit/enums/form-item-type.d.ts +5 -0
- package/modules/ui-kit/enums/form-types.enum.d.ts +5 -0
- package/modules/ui-kit/enums/form-url-params.enum.d.ts +4 -0
- package/modules/ui-kit/enums/icons.enum.d.ts +22 -0
- package/modules/ui-kit/enums/operator.enum.d.ts +19 -0
- package/modules/ui-kit/enums/position.enum.d.ts +4 -0
- package/modules/ui-kit/enums/select-option.enum.d.ts +8 -0
- package/modules/ui-kit/enums/snackbar.enum.d.ts +6 -0
- package/modules/ui-kit/enums/url-param-action.enum.d.ts +4 -0
- package/modules/ui-kit/enums/utils.enum.d.ts +4 -0
- package/modules/ui-kit/enums/viewType.enum.d.ts +5 -0
- package/modules/ui-kit/interfaces/api.interface.d.ts +45 -0
- package/modules/ui-kit/interfaces/confirm-modal-data.interface.d.ts +7 -0
- package/modules/ui-kit/interfaces/constants.interface.d.ts +4 -0
- package/modules/ui-kit/interfaces/data-table.interface.d.ts +253 -0
- package/modules/ui-kit/interfaces/form.interface.d.ts +21 -0
- package/modules/ui-kit/interfaces/generic.interface.d.ts +7 -0
- package/modules/ui-kit/interfaces/list-item.interface.d.ts +5 -0
- package/modules/ui-kit/interfaces/mat-action-buttons.interface.d.ts +14 -0
- package/modules/ui-kit/interfaces/row-selection-info.interface.d.ts +7 -0
- package/modules/ui-kit/interfaces/select.interface.d.ts +8 -0
- package/modules/ui-kit/interfaces/snackbar.interface.d.ts +4 -0
- package/modules/ui-kit/interfaces/tree-view.interface.d.ts +49 -0
- package/modules/ui-kit/models/storage-object.model.d.ts +6 -0
- package/modules/ui-kit/pipes/column-filter.pipe.d.ts +12 -0
- package/modules/ui-kit/pipes/filter-by-prop.pipe.d.ts +9 -0
- package/modules/ui-kit/pipes/first-letter-text.pipe.d.ts +7 -0
- package/modules/ui-kit/pipes/keys.pipe.d.ts +7 -0
- package/modules/ui-kit/pipes/paginate.pipe.d.ts +12 -0
- package/modules/ui-kit/pipes/search.pipe.d.ts +16 -0
- package/modules/ui-kit/services/api/api.service.d.ts +50 -0
- package/modules/ui-kit/services/api/rest-api.service.d.ts +28 -0
- package/modules/ui-kit/services/data-table.service.d.ts +37 -0
- package/modules/ui-kit/services/form.service.d.ts +26 -0
- package/modules/ui-kit/services/formatters/date-formatter.service.d.ts +13 -0
- package/modules/ui-kit/services/mappers/form-data-table-mapper.service.d.ts +8 -0
- package/modules/ui-kit/services/select.service.d.ts +7 -0
- package/modules/ui-kit/services/snackbar.service.d.ts +15 -0
- package/modules/ui-kit/services/url.service.d.ts +7 -0
- package/modules/ui-kit/types/basic.type.d.ts +2 -0
- package/modules/ui-kit/types/function.type.d.ts +20 -0
- package/modules/ui-kit/types/select.type.d.ts +2 -0
- package/modules/ui-kit/ui-kit.module.d.ts +79 -0
- package/package.json +45 -0
- package/public-api.d.ts +367 -0
- package/resolvers/null-value.resolver.d.ts +7 -0
- package/services/api/common-crud-api.service.d.ts +28 -0
- package/services/api/filter-api.service.d.ts +19 -0
- package/services/selectable.service.d.ts +10 -0
- package/shared-pipes/pipes/search.pipe.d.ts +15 -0
- package/shared.module.d.ts +13 -0
- package/validators/debounce-async.validator.d.ts +9 -0
|
@@ -0,0 +1,1534 @@
|
|
|
1
|
+
/* eslint-disable @angular-eslint/no-output-on-prefix */
|
|
2
|
+
/* eslint-disable sort-class-members/sort-class-members */
|
|
3
|
+
import { SelectionModel } from '@angular/cdk/collections';
|
|
4
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, TemplateRef, ViewChild, } from '@angular/core';
|
|
5
|
+
import { FormControl } from '@angular/forms';
|
|
6
|
+
import { MatDialogConfig } from '@angular/material/dialog';
|
|
7
|
+
import { ActionTypesEnum } from 'idp-apps-shared-ui/enums/action-types.enum';
|
|
8
|
+
import { SortDirectionEnum } from 'idp-apps-shared-ui/enums/sort-direction.enum';
|
|
9
|
+
import { SourceTypesEnum } from 'idp-apps-shared-ui/enums/source-types.enum';
|
|
10
|
+
import { ToolTipsProp, tooltipsDefaultValue } from 'idp-apps-shared-ui/enums/tooltips-prop.enum';
|
|
11
|
+
import { CommonConfirmModalComponent } from 'idp-apps-shared-ui/modules/ui-kit/components/modals/common-confirm-modal/common-confirm-modal.component';
|
|
12
|
+
import { clone, isFunction, isUndefined, merge } from 'lodash';
|
|
13
|
+
import cloneDeep from 'lodash/cloneDeep';
|
|
14
|
+
import { BehaviorSubject, Subject } from 'rxjs';
|
|
15
|
+
import { debounceTime, distinctUntilChanged, filter, first, takeUntil } from 'rxjs/operators';
|
|
16
|
+
import { ChangeType } from '../../../../../modules/ui-kit/components/data-table/constants/change-type.enum';
|
|
17
|
+
import { DataTableConstants } from '../../../constants/data-table.constants';
|
|
18
|
+
import { ColumnDisableModes } from '../../../enums/column-disable-mode.enum';
|
|
19
|
+
import { ColumnTypes } from '../../../enums/column-types.enum';
|
|
20
|
+
import { FormTypes } from '../../../enums/form-types.enum';
|
|
21
|
+
import { Icons } from '../../../enums/icons.enum';
|
|
22
|
+
import { SnackbarTypes } from '../../../enums/snackbar.enum';
|
|
23
|
+
import { DeleteModalComponent } from '../../modals/delete-modal/delete-modal.component';
|
|
24
|
+
import { FilterManager } from '../api-classes/filter-manager';
|
|
25
|
+
import { GridApi } from '../api-classes/grid-api';
|
|
26
|
+
import { COLUMN_ID } from '../constants/column-id';
|
|
27
|
+
import { ROW } from '../constants/row';
|
|
28
|
+
import { DataColDispComponent } from '../data-col-disp/data-col-disp.component';
|
|
29
|
+
import { DataTableBodyComponent } from '../data-table-body/data-table-body.component';
|
|
30
|
+
import { DATA_TABLE_CONTEXT } from '../services/data-table-context.service';
|
|
31
|
+
import * as i0 from "@angular/core";
|
|
32
|
+
import * as i1 from "../../../services/data-table.service";
|
|
33
|
+
import * as i2 from "@angular/router";
|
|
34
|
+
import * as i3 from "@angular/material/dialog";
|
|
35
|
+
import * as i4 from "../../../services/snackbar.service";
|
|
36
|
+
import * as i5 from "idp-apps-shared-ui/core/services/user-management.service";
|
|
37
|
+
import * as i6 from "idp-apps-shared-ui/modules/ui-kit/pipes/column-filter.pipe";
|
|
38
|
+
import * as i7 from "idp-apps-shared-ui/modules/ui-kit/pipes/search.pipe";
|
|
39
|
+
import * as i8 from "idp-apps-shared-ui/core/services/local-storage.service";
|
|
40
|
+
import * as i9 from "../../../services/form.service";
|
|
41
|
+
import * as i10 from "../services/data-table-context.service";
|
|
42
|
+
import * as i11 from "@angular/common";
|
|
43
|
+
import * as i12 from "@angular/material/input";
|
|
44
|
+
import * as i13 from "@angular/material/button";
|
|
45
|
+
import * as i14 from "@angular/material/card";
|
|
46
|
+
import * as i15 from "@angular/material/checkbox";
|
|
47
|
+
import * as i16 from "@angular/material/expansion";
|
|
48
|
+
import * as i17 from "@angular/material/progress-spinner";
|
|
49
|
+
import * as i18 from "@angular/forms";
|
|
50
|
+
import * as i19 from "@angular/flex-layout/extended";
|
|
51
|
+
import * as i20 from "../../data-pagination/data-pagination.component";
|
|
52
|
+
import * as i21 from "../../loader/loader.component";
|
|
53
|
+
import * as i22 from "../data-table-actions/data-table-actions.component";
|
|
54
|
+
import * as i23 from "../../icon/icon/icon.component";
|
|
55
|
+
import * as i24 from "../data-table-body/data-table-body.component";
|
|
56
|
+
import * as i25 from "../data-col-filter/data-col-filter.component";
|
|
57
|
+
import * as i26 from "../../../../../core/directive/authorize.directive";
|
|
58
|
+
import * as i27 from "../../../pipes/column-filter.pipe";
|
|
59
|
+
export class DataTableComponent {
|
|
60
|
+
// Inline edit settings
|
|
61
|
+
get canInlineEdit() {
|
|
62
|
+
return this.gridOptions.canInlineEdit;
|
|
63
|
+
}
|
|
64
|
+
set setDataTableBody(tableBody) {
|
|
65
|
+
this.dataTableBody = tableBody;
|
|
66
|
+
}
|
|
67
|
+
get columnShowhideStoragekey() {
|
|
68
|
+
return this.gridOptions.columnShowhideStoragekey;
|
|
69
|
+
}
|
|
70
|
+
get allowSaveColumnVisibilitySettings() {
|
|
71
|
+
return this.gridOptions.allowSaveColumnVisibilitySettings;
|
|
72
|
+
}
|
|
73
|
+
get addActionTitle() {
|
|
74
|
+
return `${this.gridOptions.actionAddTitle}`;
|
|
75
|
+
}
|
|
76
|
+
get isViewActionVisible() {
|
|
77
|
+
return this.gridOptions.isRowLevelViewActionVisible;
|
|
78
|
+
}
|
|
79
|
+
get searchPlaceholder() {
|
|
80
|
+
return this.gridOptions.searchboxPlaceholder ? this.gridOptions.searchboxPlaceholder : this.header;
|
|
81
|
+
}
|
|
82
|
+
get isTableInEditState() {
|
|
83
|
+
return this.isEditing || this.hasEmptyRow;
|
|
84
|
+
}
|
|
85
|
+
get apiReqParams() {
|
|
86
|
+
return {
|
|
87
|
+
page: this.currentPage,
|
|
88
|
+
itemsOnPage: this.pageSize,
|
|
89
|
+
filterParams: this.populateFilterParams(),
|
|
90
|
+
searchText: this.searchValue.value,
|
|
91
|
+
...this.getSortParams,
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
get getSortParams() {
|
|
95
|
+
const parmas = [];
|
|
96
|
+
Object.keys(this.sortedColumn).forEach((x) => {
|
|
97
|
+
parmas.push({ sortBy: x, sortDirection: this.sortedColumn[x] });
|
|
98
|
+
});
|
|
99
|
+
return parmas.length ? parmas[0] : {};
|
|
100
|
+
}
|
|
101
|
+
constructor(dataTableService, router, activatedRoute, matDialog, changeDetectorRef, snackbarService, userManagementService, filterPipe, searchPipe, localStorageService, dialog, formService, dataTableContext) {
|
|
102
|
+
this.dataTableService = dataTableService;
|
|
103
|
+
this.router = router;
|
|
104
|
+
this.activatedRoute = activatedRoute;
|
|
105
|
+
this.matDialog = matDialog;
|
|
106
|
+
this.changeDetectorRef = changeDetectorRef;
|
|
107
|
+
this.snackbarService = snackbarService;
|
|
108
|
+
this.userManagementService = userManagementService;
|
|
109
|
+
this.filterPipe = filterPipe;
|
|
110
|
+
this.searchPipe = searchPipe;
|
|
111
|
+
this.localStorageService = localStorageService;
|
|
112
|
+
this.dialog = dialog;
|
|
113
|
+
this.formService = formService;
|
|
114
|
+
this.dataTableContext = dataTableContext;
|
|
115
|
+
this.ICONS = Icons;
|
|
116
|
+
this.sortDirectionEnum = SortDirectionEnum;
|
|
117
|
+
this.toolTips = ToolTipsProp;
|
|
118
|
+
this.actionTypes = ActionTypesEnum;
|
|
119
|
+
this.DEFAULT_PAGE_SIZE = DataTableConstants.DEFAULT_PAGE_SIZE;
|
|
120
|
+
this.DEFAULT_INIT_PAGE = DataTableConstants.DEFAULT_INIT_PAGE;
|
|
121
|
+
this.confirmationMsgPagination = `Selected checkbox will be lost `;
|
|
122
|
+
this.defaultRowValues = {};
|
|
123
|
+
this.header = '';
|
|
124
|
+
this.isIdColVisible = false;
|
|
125
|
+
this.hasPagination = true;
|
|
126
|
+
this.isOnlyView = false;
|
|
127
|
+
this.isEditable = true;
|
|
128
|
+
this.isCloneVisible = true;
|
|
129
|
+
this.isLazyInitialization = false;
|
|
130
|
+
this.isRowSelectionEnable = false;
|
|
131
|
+
this.isSaveDataLocal = false;
|
|
132
|
+
// Tree grid settings
|
|
133
|
+
this.isTreeGrid = false;
|
|
134
|
+
this.changeLocalData = new EventEmitter();
|
|
135
|
+
this.actionClick = new EventEmitter();
|
|
136
|
+
this.onInitCompleted = new EventEmitter();
|
|
137
|
+
this.onComplexDetailClicked = new EventEmitter();
|
|
138
|
+
this.onEditClicked = new EventEmitter();
|
|
139
|
+
this.onAddClicked = new EventEmitter();
|
|
140
|
+
this.onRowClicked = new EventEmitter();
|
|
141
|
+
this.onPageChanged = new EventEmitter();
|
|
142
|
+
this.matExpansionPanelClicked = new EventEmitter();
|
|
143
|
+
this.onUpdateCompleted = new EventEmitter();
|
|
144
|
+
this.onDeleteCompleted = new EventEmitter();
|
|
145
|
+
this.onScrolled = new EventEmitter();
|
|
146
|
+
this.CheckboxSelect = new EventEmitter();
|
|
147
|
+
this.isTableDataLoad = new EventEmitter();
|
|
148
|
+
this.searchValue = new FormControl();
|
|
149
|
+
this.isSearchDisabled = false;
|
|
150
|
+
this.sourceTypes = SourceTypesEnum;
|
|
151
|
+
this.masterSelection = new FormControl(false);
|
|
152
|
+
this.paginationParams = {
|
|
153
|
+
currentPage: this.DEFAULT_INIT_PAGE,
|
|
154
|
+
pageSize: this.DEFAULT_PAGE_SIZE,
|
|
155
|
+
};
|
|
156
|
+
this.searchedRowCount$ = new Subject();
|
|
157
|
+
this.isClearFilter$ = new BehaviorSubject(false);
|
|
158
|
+
this.isFilterView = false;
|
|
159
|
+
this.excludedRows = [];
|
|
160
|
+
this.sortedColumn = {};
|
|
161
|
+
this.count = 0;
|
|
162
|
+
this.isLoading$ = new BehaviorSubject(false);
|
|
163
|
+
this.hasEmptyRow = false;
|
|
164
|
+
this.isEditing = false;
|
|
165
|
+
this.isSaving = false;
|
|
166
|
+
this.map = new Map();
|
|
167
|
+
this.numberOfTableRefresh = 0;
|
|
168
|
+
this.clearSubs$ = new Subject();
|
|
169
|
+
this.totalItems = 0;
|
|
170
|
+
this.startX = 0;
|
|
171
|
+
this.startWidth = 0;
|
|
172
|
+
this.resizingTh = null;
|
|
173
|
+
this.apolloDataTable = null;
|
|
174
|
+
this.resizingTd = null;
|
|
175
|
+
this.defaultGridOptions = {
|
|
176
|
+
addIdColumn: true,
|
|
177
|
+
actionAddTitle: '',
|
|
178
|
+
allowSaveColumnVisibilitySettings: false,
|
|
179
|
+
isRowLevelViewActionVisible: true,
|
|
180
|
+
isOnlyView: false,
|
|
181
|
+
isRowSelectionEnable: false,
|
|
182
|
+
idProperty: COLUMN_ID.PROP,
|
|
183
|
+
isClientSidePagination: true,
|
|
184
|
+
canInlineAdd: true,
|
|
185
|
+
canInlineEdit: true,
|
|
186
|
+
isSaveDataLocal: false,
|
|
187
|
+
isSearchBoxVisible: true,
|
|
188
|
+
isFilterEnabled: false,
|
|
189
|
+
filterableColumns: [],
|
|
190
|
+
defaultSortProperty: {},
|
|
191
|
+
cloneOptions: {
|
|
192
|
+
copyOfClonableProperties: [],
|
|
193
|
+
emptyValueProperties: [],
|
|
194
|
+
},
|
|
195
|
+
searchableProperties: [],
|
|
196
|
+
sortableProperties: [],
|
|
197
|
+
isRowActionVisible: true,
|
|
198
|
+
topRightActions: [],
|
|
199
|
+
deleteOptions: {},
|
|
200
|
+
searchboxPlaceholder: this.header,
|
|
201
|
+
refreshOnAdd: true,
|
|
202
|
+
topLeftAdditionalActions: [],
|
|
203
|
+
isSortEnabled: false,
|
|
204
|
+
disableIcons: {
|
|
205
|
+
add: false,
|
|
206
|
+
edit: false,
|
|
207
|
+
delete: false,
|
|
208
|
+
clone: false,
|
|
209
|
+
add$: new BehaviorSubject(false),
|
|
210
|
+
edit$: new BehaviorSubject(false),
|
|
211
|
+
delete$: new BehaviorSubject(false),
|
|
212
|
+
copy$: new BehaviorSubject(false),
|
|
213
|
+
},
|
|
214
|
+
gridMenuOptions: {
|
|
215
|
+
isMenuEnabled: false,
|
|
216
|
+
menuItems: [],
|
|
217
|
+
},
|
|
218
|
+
actionLoading$: {
|
|
219
|
+
copy$: new BehaviorSubject(false),
|
|
220
|
+
edit$: new BehaviorSubject(false),
|
|
221
|
+
delete$: new BehaviorSubject(false),
|
|
222
|
+
},
|
|
223
|
+
};
|
|
224
|
+
this.onMouseMove = (event) => {
|
|
225
|
+
const width = this.startWidth + (event.pageX - this.startX);
|
|
226
|
+
if (this.resizingTh) {
|
|
227
|
+
this.setWidthToElement(width, width, this.resizingTh.offsetWidth);
|
|
228
|
+
}
|
|
229
|
+
};
|
|
230
|
+
this.onMouseUp = () => {
|
|
231
|
+
document.removeEventListener('mousemove', this.onMouseMove);
|
|
232
|
+
document.removeEventListener('mouseup', this.onMouseUp);
|
|
233
|
+
document.body.classList.remove('no-select-resize');
|
|
234
|
+
this.resizingTh = null;
|
|
235
|
+
this.resizingTd = null;
|
|
236
|
+
};
|
|
237
|
+
this.filterManager = new FilterManager();
|
|
238
|
+
this.gridApi = new GridApi(this, this.formService);
|
|
239
|
+
this.dataTableContext.setDataTableComponent(this);
|
|
240
|
+
}
|
|
241
|
+
get getSelectedRows() {
|
|
242
|
+
return this.getFilteredDataRow(this.selection.selected);
|
|
243
|
+
}
|
|
244
|
+
get getAllCheckedRows() {
|
|
245
|
+
return this.selection.selected;
|
|
246
|
+
}
|
|
247
|
+
get isActionsDisabled() {
|
|
248
|
+
return this.filteredRows.length === 0;
|
|
249
|
+
}
|
|
250
|
+
get getRows() {
|
|
251
|
+
return this.getFilteredDataRow(this.rows);
|
|
252
|
+
}
|
|
253
|
+
get getCustomTableStyle() {
|
|
254
|
+
if (this.gridOptions.isInnerScroll) {
|
|
255
|
+
return this.gridOptions.customTableStyle ? this.gridOptions.customTableStyle : { height: '30vh' };
|
|
256
|
+
}
|
|
257
|
+
return {};
|
|
258
|
+
}
|
|
259
|
+
onTableScrolled(e) {
|
|
260
|
+
const htmlElement = this.customDataTable.nativeElement;
|
|
261
|
+
const event = {
|
|
262
|
+
...e,
|
|
263
|
+
currentElement: this.customDataTable,
|
|
264
|
+
currentScrollPosition: { x: htmlElement.scrollLeft, y: htmlElement.scrollTop },
|
|
265
|
+
};
|
|
266
|
+
this.onScrolled.emit(event);
|
|
267
|
+
}
|
|
268
|
+
changeScrollPosition(position) {
|
|
269
|
+
const htmlElement = this.customDataTable.nativeElement;
|
|
270
|
+
htmlElement.scroll(position.x, position.y);
|
|
271
|
+
}
|
|
272
|
+
ngOnInit() {
|
|
273
|
+
if (!this.isLazyInitialization) {
|
|
274
|
+
this.init();
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
this.isLoading$.next(true);
|
|
278
|
+
}
|
|
279
|
+
if (!this.gridOptions.isClientSidePagination) {
|
|
280
|
+
this.searchTable();
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
isDisabledMainAction(actionProp) {
|
|
284
|
+
return this.gridOptions.disableIcons && this.gridOptions.disableIcons[actionProp];
|
|
285
|
+
}
|
|
286
|
+
nonFilterClassName(columnProp) {
|
|
287
|
+
if (!this.isFilterEnable(columnProp) && this.isRowSelectionEnable) {
|
|
288
|
+
return 'row-selection-non-filter-cell';
|
|
289
|
+
}
|
|
290
|
+
if (!this.isFilterEnable(columnProp)) {
|
|
291
|
+
return 'non-filter-cell';
|
|
292
|
+
}
|
|
293
|
+
return '';
|
|
294
|
+
}
|
|
295
|
+
isFilterEnable(columnProp) {
|
|
296
|
+
if (this.isTableInEditState) {
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
return this.gridOptions.isFilterEnabled && (!this.gridOptions.filterableColumns.length || this.isFilterableColumn(columnProp));
|
|
300
|
+
}
|
|
301
|
+
isFilterableColumn(columnProp) {
|
|
302
|
+
return this.gridOptions.filterableColumns.findIndex((item) => item === columnProp) !== -1;
|
|
303
|
+
}
|
|
304
|
+
get isFilterApplied() {
|
|
305
|
+
return this.filterManager.getFilterParams().length > 0;
|
|
306
|
+
}
|
|
307
|
+
get nonDisabledRows() {
|
|
308
|
+
if (this.gridOptions.rowDisableFn && isFunction(this.gridOptions.rowDisableFn)) {
|
|
309
|
+
return this.rows.filter((row) => !this.gridOptions.rowDisableFn(row));
|
|
310
|
+
}
|
|
311
|
+
return this.rows;
|
|
312
|
+
}
|
|
313
|
+
ngAfterViewInit() {
|
|
314
|
+
this.fireInitCompleted();
|
|
315
|
+
if (this.scrollPosition) {
|
|
316
|
+
const htmlElement = this.customDataTable.nativeElement;
|
|
317
|
+
htmlElement.scrollTop = this.scrollPosition.y;
|
|
318
|
+
htmlElement.scrollLeft = this.scrollPosition.x;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
checkDeleteDisabled() {
|
|
322
|
+
if (isFunction(this.isDeleteDisabled) && !isUndefined(this.selectedRow)) {
|
|
323
|
+
return this.isDeleteDisabled(this.selectedRow);
|
|
324
|
+
}
|
|
325
|
+
if (this.isDeleteDisabled && typeof this.isDeleteDisabled !== 'function') {
|
|
326
|
+
return true;
|
|
327
|
+
}
|
|
328
|
+
return false;
|
|
329
|
+
}
|
|
330
|
+
isAllSelected() {
|
|
331
|
+
if (this.gridOptions.isClientSidePagination) {
|
|
332
|
+
return this.nonDisabledRows.length === this.selection.selected.length;
|
|
333
|
+
}
|
|
334
|
+
return (this.masterSelection.value && this.excludedRows.length === 0) || this.totalItems === this.selection.selected.length;
|
|
335
|
+
}
|
|
336
|
+
isSortColumn(viewColumn) {
|
|
337
|
+
return !!(this.gridOptions.sortableProperties && this.gridOptions.sortableProperties.find((x) => x === viewColumn.prop));
|
|
338
|
+
}
|
|
339
|
+
openColumnShowHideDialogue() {
|
|
340
|
+
let dialogConfig = new MatDialogConfig();
|
|
341
|
+
dialogConfig = this.configureDialog(dialogConfig);
|
|
342
|
+
const dialogRef = this.dialog.open(DataColDispComponent, dialogConfig);
|
|
343
|
+
dialogRef.afterClosed().subscribe((result) => {
|
|
344
|
+
if (result && result.status === 'OK') {
|
|
345
|
+
this.viewColumns = result.columns;
|
|
346
|
+
this.changeDetectorRef.detectChanges();
|
|
347
|
+
}
|
|
348
|
+
});
|
|
349
|
+
}
|
|
350
|
+
masterToggle() {
|
|
351
|
+
this.excludedRows = [];
|
|
352
|
+
if (!this.masterSelection.pristine && !this.masterSelection.value) {
|
|
353
|
+
this.selection.clear();
|
|
354
|
+
this.changeDetectorRef.detectChanges();
|
|
355
|
+
this.gridApi.detectRowChanges();
|
|
356
|
+
this.masterSelection.reset();
|
|
357
|
+
this.CheckboxSelect.emit({ rows: [], gridApi: this.getGridApi(), checked: false });
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
if (!this.gridOptions.isClientSidePagination) {
|
|
361
|
+
this.checkedAllExceptExcludedRows();
|
|
362
|
+
this.changeDetectorRef.detectChanges();
|
|
363
|
+
this.gridApi.detectRowChanges();
|
|
364
|
+
this.CheckboxSelect.emit({ rows: [], gridApi: this.getGridApi(), checked: true });
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
this.masterToggleClientSide();
|
|
368
|
+
this.CheckboxSelect.emit({ rows: this.rows, gridApi: this.getGridApi(), checked: true });
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
isCheckboxSelect(row) {
|
|
372
|
+
const isSelected = this.selection.isSelected(row);
|
|
373
|
+
if (this.masterSelection.value && !isSelected) {
|
|
374
|
+
this.excludedRows.push(row);
|
|
375
|
+
}
|
|
376
|
+
else if (this.masterSelection.value && isSelected) {
|
|
377
|
+
const findIndex = this.excludedRows.findIndex((x) => JSON.stringify(x) === JSON.stringify(row));
|
|
378
|
+
if (findIndex > -1) {
|
|
379
|
+
this.excludedRows.splice(findIndex, 1);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
this.CheckboxSelect.emit({ rows: [row], gridApi: this.getGridApi(), checked: isSelected });
|
|
383
|
+
if (isSelected) {
|
|
384
|
+
this.rows.forEach((row) => (row.isSelected = false));
|
|
385
|
+
}
|
|
386
|
+
const checkedRows = this.gridApi.getAllCheckedRows();
|
|
387
|
+
if (!this.selectedRow && checkedRows.length > 0) {
|
|
388
|
+
this.selectedRow = checkedRows[checkedRows.length - 1];
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
refresh() {
|
|
392
|
+
this.setData();
|
|
393
|
+
}
|
|
394
|
+
onClickAction(action) {
|
|
395
|
+
this.actionClick.emit(action);
|
|
396
|
+
}
|
|
397
|
+
onClickAdd() {
|
|
398
|
+
this.onAddClicked.emit();
|
|
399
|
+
if (isFunction(this.onAddClick) && !this.onAddClick(undefined, undefined)) {
|
|
400
|
+
return;
|
|
401
|
+
}
|
|
402
|
+
this.addActionHandler();
|
|
403
|
+
}
|
|
404
|
+
addActionHandler() {
|
|
405
|
+
this.setIdColumn();
|
|
406
|
+
this.setPaginationData({ currentPage: this.DEFAULT_INIT_PAGE, pageSize: this.pageSize });
|
|
407
|
+
this.isSearchDisabled = true;
|
|
408
|
+
this.searchValue.setValue(DataTableConstants.EMPTY);
|
|
409
|
+
if (this.gridOptions.canInlineAdd) {
|
|
410
|
+
if (!this.hasEmptyRow) {
|
|
411
|
+
this.addEmptyRow();
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
else {
|
|
415
|
+
this.navigatePage(FormTypes.Add);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
onClickRow(eventData) {
|
|
419
|
+
const checkedRows = this.gridApi.getAllCheckedRows();
|
|
420
|
+
if (checkedRows?.length > 0) {
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
if (this.isDefaultFirstRowSelected()) {
|
|
424
|
+
this.rows.forEach((x) => (x.isSelected = false));
|
|
425
|
+
}
|
|
426
|
+
if (this.selectedRow) {
|
|
427
|
+
this.selectedRow.isSelected = false;
|
|
428
|
+
}
|
|
429
|
+
this.selectedRow = eventData.row;
|
|
430
|
+
eventData.row.isSelected = true;
|
|
431
|
+
const emitIndex = this.gridOptions.isClientSidePagination
|
|
432
|
+
? eventData.row.rowIndex + this.pageSize * (this.currentPage - 1)
|
|
433
|
+
: eventData.row.rowIndex;
|
|
434
|
+
this.selectedRow.rowIndex = emitIndex;
|
|
435
|
+
this.onRowClicked.emit(eventData.row);
|
|
436
|
+
}
|
|
437
|
+
onClickRowAdd(eventData) {
|
|
438
|
+
if (this.gridOptions.canInlineAdd && !this.hasEmptyRow) {
|
|
439
|
+
this.addEmptyRow(eventData.row.depth + 1, this.dataTableService.getRowId(eventData.row));
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
onClickEdit(eventData) {
|
|
443
|
+
if (isFunction(this.onBeforeEdit) && !this.onBeforeEdit(this.dataTableService.getRowsDataFromRows(this.rows), eventData)) {
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
this.onEditClicked.emit(eventData);
|
|
447
|
+
if (this.gridOptions.canInlineEdit) {
|
|
448
|
+
if (!this.isEditing) {
|
|
449
|
+
this.toggleRowEditing(eventData.row, true);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
this.navigateToItem(FormTypes.Edit, this.dataTableService.getRowId(eventData.row));
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
onClickClone(eventData) {
|
|
457
|
+
if (this.gridOptions.canInlineAdd && !this.hasEmptyRow) {
|
|
458
|
+
const newEventData = cloneDeep(eventData);
|
|
459
|
+
this.addCloneRow(newEventData.row);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
onClickView(eventData) {
|
|
463
|
+
this.navigateToItem(FormTypes.View, this.getNavigateItemValue(eventData));
|
|
464
|
+
}
|
|
465
|
+
ComplexDetailClicked(eventData) {
|
|
466
|
+
this.onComplexDetailClicked.emit(eventData);
|
|
467
|
+
}
|
|
468
|
+
ActionClickHandler(action) {
|
|
469
|
+
if (action.clicked) {
|
|
470
|
+
action.clicked(this.selectedRow);
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
showHideFilterView() {
|
|
474
|
+
this.isFilterView = !this.isFilterView;
|
|
475
|
+
}
|
|
476
|
+
clearGlobalFilter() {
|
|
477
|
+
this.isClearFilter$.next(true);
|
|
478
|
+
this.searchValue.setValue('');
|
|
479
|
+
this.changeDetectorRef.detectChanges();
|
|
480
|
+
this.filterManager.clearFilterParams();
|
|
481
|
+
this.setData();
|
|
482
|
+
}
|
|
483
|
+
onChangePage(paginationParams, selectableIndex) {
|
|
484
|
+
this.setPaginationData(paginationParams);
|
|
485
|
+
if (!this.isClientSidePagination()) {
|
|
486
|
+
this.setData(selectableIndex);
|
|
487
|
+
}
|
|
488
|
+
else if (this.isDefaultFirstRowSelected() && this.isClientSidePagination()) {
|
|
489
|
+
if (selectableIndex) {
|
|
490
|
+
this.emitNextRow(this.pageSize * (this.currentPage - 1) + this.getSelectableValidIndex(selectableIndex));
|
|
491
|
+
}
|
|
492
|
+
else {
|
|
493
|
+
this.emitNextRow(this.pageSize * (this.currentPage - 1));
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
this.onPageChanged.emit();
|
|
497
|
+
}
|
|
498
|
+
onExpansionPanelClick(eventData) {
|
|
499
|
+
this.matExpansionPanelClicked.emit(eventData);
|
|
500
|
+
}
|
|
501
|
+
onChangePageSize(pageSize) {
|
|
502
|
+
this.setPaginationDataOnSizeChanged(pageSize);
|
|
503
|
+
if (!this.isClientSidePagination()) {
|
|
504
|
+
this.setData();
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
getFilterParam(column) {
|
|
508
|
+
return this.filterManager.getFilterParam(column);
|
|
509
|
+
}
|
|
510
|
+
isFilteredColumn(columnProp) {
|
|
511
|
+
return this.filterManager.getFilterParams().findIndex((item) => item.filterColumn.prop === columnProp) !== -1;
|
|
512
|
+
}
|
|
513
|
+
onFilterClicked(filterParam) {
|
|
514
|
+
this.filterManager.setFilterParams(filterParam);
|
|
515
|
+
this.filteredRows = this.filterPipe.transform(this.rows, this.filterManager.getFilterParams(), this.columns, this.gridOptions.isClientSidePagination);
|
|
516
|
+
this.setPaginationData({ currentPage: this.DEFAULT_INIT_PAGE, pageSize: this.pageSize });
|
|
517
|
+
if (!this.isClientSidePagination()) {
|
|
518
|
+
this.setData();
|
|
519
|
+
}
|
|
520
|
+
else {
|
|
521
|
+
// this.numberOfTableRefresh = 1.5; // to skip init filter value assign
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
onClickEditCancel(eventData) {
|
|
525
|
+
this.isSearchDisabled = false;
|
|
526
|
+
if (this.dataTableService.isEmptyRow(eventData.row)) {
|
|
527
|
+
this.removeEmptyRow();
|
|
528
|
+
}
|
|
529
|
+
else {
|
|
530
|
+
this.toggleRowEditing(eventData.row, false);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
onClickEditSave(eventData) {
|
|
534
|
+
this.isSearchDisabled = false;
|
|
535
|
+
if (isFunction(this.beforeSaveFn) && !this.beforeSaveFn(this.dataTableService.getRowsDataFromRows(this.rows), eventData)) {
|
|
536
|
+
return;
|
|
537
|
+
}
|
|
538
|
+
if (this.isSaveDataLocal) {
|
|
539
|
+
this.onSaveLocalRow(eventData);
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
this.saveRow(eventData);
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
onChangeExpandCollapse(eventData) {
|
|
546
|
+
this.toggleRowExpandCollapse(eventData.row, eventData.shouldExpand);
|
|
547
|
+
}
|
|
548
|
+
getNavigateItemValue(eventData) {
|
|
549
|
+
if (this.gridOptions && this.gridOptions.rowNavigationProperty) {
|
|
550
|
+
return this.dataTableService.getValueByPropertyName(eventData.row, this.gridOptions.rowNavigationProperty);
|
|
551
|
+
}
|
|
552
|
+
return this.dataTableService.getRowId(eventData.row);
|
|
553
|
+
}
|
|
554
|
+
navigateToItem(type, id) {
|
|
555
|
+
const url = this.gridOptions.editExtraRouteParam ? `${type}/${id}/${this.gridOptions.editExtraRouteParam}` : `${type}/${id}`;
|
|
556
|
+
this.navigatePage(url);
|
|
557
|
+
}
|
|
558
|
+
onClickDeleteRow(eventData) {
|
|
559
|
+
this.openDeleteModal(eventData.row);
|
|
560
|
+
}
|
|
561
|
+
onClickDeleteModal(shouldDelete) {
|
|
562
|
+
if (shouldDelete) {
|
|
563
|
+
this.gridOptions?.actionLoading$?.delete$.next(true);
|
|
564
|
+
if (this.isSaveDataLocal) {
|
|
565
|
+
this.removeLocalRow(this.dataTableService.getRowId(this.rowToDelete));
|
|
566
|
+
this.onChangeLocalData(ChangeType.ROW_DELETED);
|
|
567
|
+
this.gridOptions?.actionLoading$?.delete$.next(false);
|
|
568
|
+
}
|
|
569
|
+
else {
|
|
570
|
+
this.deleteRow(this.rowToDelete);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
VisibleColumnListChanged(columnList) {
|
|
575
|
+
this.viewColumns = columnList;
|
|
576
|
+
}
|
|
577
|
+
ngOnDestroy() {
|
|
578
|
+
this.clearSubs$.next(null);
|
|
579
|
+
this.clearSubs$.complete();
|
|
580
|
+
this.isClearFilter$.next(false);
|
|
581
|
+
this.isClearFilter$.complete();
|
|
582
|
+
this.dataTableContext.clearDataTableComponent();
|
|
583
|
+
}
|
|
584
|
+
init() {
|
|
585
|
+
this.gridOptions = merge(this.defaultGridOptions, this.gridOptions);
|
|
586
|
+
this.setPaginationData({
|
|
587
|
+
currentPage: isUndefined(this.initialPage) ? this.DEFAULT_INIT_PAGE : this.initialPage,
|
|
588
|
+
pageSize: this.pageSize,
|
|
589
|
+
});
|
|
590
|
+
this.selection = new SelectionModel(!this.isSingleSelect, []);
|
|
591
|
+
if (!this.gridOptions.isAutoColumn) {
|
|
592
|
+
this.setIdColumn();
|
|
593
|
+
this.initColumns();
|
|
594
|
+
this.defaultSortedColumns = clone(this.viewColumns);
|
|
595
|
+
}
|
|
596
|
+
this.getConfiguredColumns();
|
|
597
|
+
this.setData();
|
|
598
|
+
}
|
|
599
|
+
sortTable(viewColumn) {
|
|
600
|
+
if (this.isTableInEditState) {
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
if (!this.gridOptions.sortableProperties.find((item) => item === viewColumn.prop) && !this.gridOptions.isSortEnabled) {
|
|
604
|
+
return;
|
|
605
|
+
}
|
|
606
|
+
if (this.sortedColumn[viewColumn.prop] === undefined) {
|
|
607
|
+
this.sortedColumn = {};
|
|
608
|
+
this.sortedColumn[viewColumn.prop] = SortDirectionEnum.ASC;
|
|
609
|
+
this.sortData(viewColumn, true);
|
|
610
|
+
}
|
|
611
|
+
else if (this.sortedColumn[viewColumn.prop] === SortDirectionEnum.ASC) {
|
|
612
|
+
this.sortedColumn[viewColumn.prop] = SortDirectionEnum.DESC;
|
|
613
|
+
this.sortData(viewColumn, false);
|
|
614
|
+
}
|
|
615
|
+
else {
|
|
616
|
+
this.sortedColumn = {};
|
|
617
|
+
this.sortData(viewColumn, false, true);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
deleteRow(row) {
|
|
621
|
+
this.setIdColumn();
|
|
622
|
+
const rowId = this.dataTableService.getRowId(row);
|
|
623
|
+
this.deleteItemFn(rowId, row.data)
|
|
624
|
+
.pipe(first(), takeUntil(this.clearSubs$))
|
|
625
|
+
.subscribe({
|
|
626
|
+
next: () => {
|
|
627
|
+
this.gridOptions?.actionLoading$?.delete$.next(false);
|
|
628
|
+
this.snackbarService.success(SnackbarTypes.Deleted, SnackbarTypes.Deleted);
|
|
629
|
+
if (this.isClientSidePagination()) {
|
|
630
|
+
this.removeLocalRow(rowId);
|
|
631
|
+
}
|
|
632
|
+
else {
|
|
633
|
+
this.setData();
|
|
634
|
+
}
|
|
635
|
+
if (!this.isDefaultFirstRowSelected()) {
|
|
636
|
+
this.selectedRow = undefined;
|
|
637
|
+
}
|
|
638
|
+
this.onDeleteCompleted.emit({ row: this.selectedRow });
|
|
639
|
+
},
|
|
640
|
+
error: () => {
|
|
641
|
+
// Empty method block.
|
|
642
|
+
},
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
searchModelChanged() {
|
|
646
|
+
if (this.gridOptions.isClientSidePagination) {
|
|
647
|
+
this.filteredRows = this.searchPipe.transform(this.rows, this.searchValue.value, this.searchColumns, this.gridOptions.isClientSidePagination, this.searchedRowCount$);
|
|
648
|
+
this.setPaginationData({ currentPage: this.DEFAULT_INIT_PAGE, pageSize: this.pageSize });
|
|
649
|
+
this.changeDetectorRef.detectChanges();
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
getTooltipText(text) {
|
|
653
|
+
if (this.gridOptions.iconTooltips && this.gridOptions.iconTooltips[text]) {
|
|
654
|
+
return this.gridOptions.iconTooltips[text];
|
|
655
|
+
}
|
|
656
|
+
return tooltipsDefaultValue[text];
|
|
657
|
+
}
|
|
658
|
+
getActionName(prop) {
|
|
659
|
+
return this.userManagementService.getActionName(this.gridOptions, prop);
|
|
660
|
+
}
|
|
661
|
+
getLeftActionName(prop) {
|
|
662
|
+
return this.userManagementService.getLeftActionName(this.gridOptions, prop);
|
|
663
|
+
}
|
|
664
|
+
getLeftRightActionText(data) {
|
|
665
|
+
if (data.title) {
|
|
666
|
+
return data.title;
|
|
667
|
+
}
|
|
668
|
+
return tooltipsDefaultValue[data.title];
|
|
669
|
+
}
|
|
670
|
+
get isSingleSelect() {
|
|
671
|
+
return this.gridOptions && this.gridOptions.isSingleSelect === true;
|
|
672
|
+
}
|
|
673
|
+
get pageSize() {
|
|
674
|
+
return this.paginationParams.pageSize;
|
|
675
|
+
}
|
|
676
|
+
get currentPage() {
|
|
677
|
+
return this.paginationParams.currentPage;
|
|
678
|
+
}
|
|
679
|
+
detectChange() {
|
|
680
|
+
this.changeDetectorRef.detectChanges();
|
|
681
|
+
}
|
|
682
|
+
selectNextRow() {
|
|
683
|
+
if (this.isLastRowInPage()) {
|
|
684
|
+
this.paginationParams.currentPage = this.isLastRowInLastPage() ? 1 : this.paginationParams.currentPage + 1;
|
|
685
|
+
this.onChangePage(this.paginationParams);
|
|
686
|
+
}
|
|
687
|
+
else {
|
|
688
|
+
this.emitNextRow(this.selectedRow.rowIndex + 1);
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
selectPreviousRow() {
|
|
692
|
+
if (this.isFirstRowInPage()) {
|
|
693
|
+
this.paginationParams.currentPage = this.isFirstRowInFirstPage() ? this.pagesCount : this.paginationParams.currentPage - 1;
|
|
694
|
+
this.onChangePage(this.paginationParams, 'last');
|
|
695
|
+
}
|
|
696
|
+
else {
|
|
697
|
+
this.emitNextRow(this.selectedRow.rowIndex - 1);
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
uncheckSelectedSource() {
|
|
701
|
+
this.selection.clear();
|
|
702
|
+
this.changeDetectorRef.detectChanges();
|
|
703
|
+
this.gridApi.detectRowChanges();
|
|
704
|
+
}
|
|
705
|
+
onDoubleClickSeparator(index, viewColumn) {
|
|
706
|
+
if (!this.gridOptions.draggable || !viewColumn.draggable) {
|
|
707
|
+
return;
|
|
708
|
+
}
|
|
709
|
+
clearTimeout(this.clickTimeout);
|
|
710
|
+
this.resizingTh = this.getSelectedHtml(`th[data-column-prop="${viewColumn.prop}"] div`);
|
|
711
|
+
this.resizingTd = this.getSelectedHtml(`td[data-column-prop="${viewColumn.prop}"]`, true);
|
|
712
|
+
if (!this.resizingTh || !this.resizingTd) {
|
|
713
|
+
return;
|
|
714
|
+
}
|
|
715
|
+
viewColumn.doubleClicked = !viewColumn.doubleClicked;
|
|
716
|
+
viewColumn.dragged = false;
|
|
717
|
+
this.formatTableData(viewColumn);
|
|
718
|
+
this.formatTableHeader();
|
|
719
|
+
}
|
|
720
|
+
getHeaderStyle(index, viewColumn) {
|
|
721
|
+
let classes = [];
|
|
722
|
+
if (this.viewColumns[index].dragged || viewColumn?.doubleClicked === true) {
|
|
723
|
+
classes.push('drag-column');
|
|
724
|
+
}
|
|
725
|
+
else if (this.gridOptions.fixedWidthData) {
|
|
726
|
+
classes.push('header-max-width');
|
|
727
|
+
}
|
|
728
|
+
return classes;
|
|
729
|
+
}
|
|
730
|
+
onSeparatorMouseDown(event, index, viewColumn) {
|
|
731
|
+
clearTimeout(this.clickTimeout);
|
|
732
|
+
this.clickTimeout = setTimeout(() => {
|
|
733
|
+
if (!this.gridOptions.draggable || !viewColumn.draggable) {
|
|
734
|
+
return;
|
|
735
|
+
}
|
|
736
|
+
if (!viewColumn.dragged) {
|
|
737
|
+
viewColumn.dragged = true;
|
|
738
|
+
this.changeDetectorRef.detectChanges();
|
|
739
|
+
}
|
|
740
|
+
this.resizingTh = this.getSelectedHtml(`th[data-column-prop="${viewColumn.prop}"] div`);
|
|
741
|
+
this.resizingTd = this.getSelectedHtml(`td[data-column-prop="${viewColumn.prop}"]`, true);
|
|
742
|
+
const tdDiv = this.getSelectedHtml(`td[data-column-prop="${viewColumn.prop}"] div`);
|
|
743
|
+
this.apolloDataTable = document.querySelector('.apollo-design-new-data-table');
|
|
744
|
+
if (this.resizingTh) {
|
|
745
|
+
this.startX = event.pageX;
|
|
746
|
+
this.startWidth = this.getActualWidth(this.resizingTh, this.startX);
|
|
747
|
+
const tdDivWidth = this.getActualWidth(tdDiv, this.startX);
|
|
748
|
+
if (this.resizingTd) {
|
|
749
|
+
this.resizingTd.forEach((cell) => {
|
|
750
|
+
const tdDiv = cell.querySelector('div');
|
|
751
|
+
tdDiv.classList.remove('data-max-width');
|
|
752
|
+
tdDiv.classList.add('drag-column');
|
|
753
|
+
});
|
|
754
|
+
}
|
|
755
|
+
this.setWidthToElement(this.startWidth, tdDivWidth, this.resizingTh.offsetWidth);
|
|
756
|
+
}
|
|
757
|
+
}, 250);
|
|
758
|
+
document.body.classList.add('no-select-resize');
|
|
759
|
+
if (this.gridOptions.draggable && viewColumn.draggable) {
|
|
760
|
+
document.addEventListener('mousemove', this.onMouseMove);
|
|
761
|
+
}
|
|
762
|
+
document.addEventListener('mouseup', this.onMouseUp);
|
|
763
|
+
}
|
|
764
|
+
getSelectedHtml(selector, isSelectAll = false) {
|
|
765
|
+
if (isSelectAll) {
|
|
766
|
+
return this.customDataTable.nativeElement.querySelectorAll(selector);
|
|
767
|
+
}
|
|
768
|
+
return this.customDataTable.nativeElement.querySelector(selector);
|
|
769
|
+
}
|
|
770
|
+
formatTableData(viewColumn) {
|
|
771
|
+
if (!viewColumn.doubleClicked) {
|
|
772
|
+
this.resizingTd.forEach((cell) => {
|
|
773
|
+
const tdDiv = cell.querySelector('div');
|
|
774
|
+
tdDiv.classList.remove('drag-column');
|
|
775
|
+
if (this.gridOptions.fixedWidthData) {
|
|
776
|
+
tdDiv.classList.add('data-max-width');
|
|
777
|
+
}
|
|
778
|
+
});
|
|
779
|
+
}
|
|
780
|
+
else {
|
|
781
|
+
this.resizingTd.forEach((cell) => {
|
|
782
|
+
const tdDiv = cell.querySelector('div');
|
|
783
|
+
tdDiv.classList.remove('data-max-width');
|
|
784
|
+
tdDiv.classList.add('drag-column');
|
|
785
|
+
});
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
formatTableHeader() {
|
|
789
|
+
this.resizingTh.style.width = '';
|
|
790
|
+
this.resizingTd.forEach((cell) => {
|
|
791
|
+
const tdDiv = cell.querySelector('div');
|
|
792
|
+
tdDiv.style.width = '';
|
|
793
|
+
});
|
|
794
|
+
}
|
|
795
|
+
setWidthToElement(thWidth, tdWidth, previousThWidth) {
|
|
796
|
+
if (this.resizingTh) {
|
|
797
|
+
this.resizingTh.style.width = `${thWidth}px`;
|
|
798
|
+
}
|
|
799
|
+
if (this.resizingTd) {
|
|
800
|
+
this.resizingTd.forEach((cell) => {
|
|
801
|
+
const div = cell.querySelector('div.drag-column');
|
|
802
|
+
if (div) {
|
|
803
|
+
div.style.width = `${tdWidth}px`;
|
|
804
|
+
}
|
|
805
|
+
});
|
|
806
|
+
}
|
|
807
|
+
if (this.resizingTh && this.apolloDataTable) {
|
|
808
|
+
const updatedTableWidth = this.apolloDataTable.offsetWidth + (this.resizingTh.offsetWidth - previousThWidth);
|
|
809
|
+
this.apolloDataTable.style.width = `${updatedTableWidth}px`;
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
getActualWidth(element, startX) {
|
|
813
|
+
let width;
|
|
814
|
+
const boundingRect = element.getBoundingClientRect();
|
|
815
|
+
width = boundingRect.width;
|
|
816
|
+
const offset = startX - boundingRect.left;
|
|
817
|
+
if (offset < boundingRect.width) {
|
|
818
|
+
width = offset;
|
|
819
|
+
}
|
|
820
|
+
return width;
|
|
821
|
+
}
|
|
822
|
+
get pagesCount() {
|
|
823
|
+
return Math.ceil(this.count / this.pageSize);
|
|
824
|
+
}
|
|
825
|
+
get rowsCountInCurrentPage() {
|
|
826
|
+
if (!this.gridOptions.isClientSidePagination) {
|
|
827
|
+
return this.rows.length;
|
|
828
|
+
}
|
|
829
|
+
const leftRows = this.rows.length - this.pageSize * (this.currentPage - 1);
|
|
830
|
+
return leftRows >= this.pageSize ? this.pageSize : leftRows;
|
|
831
|
+
}
|
|
832
|
+
isLastRowInPage() {
|
|
833
|
+
if (this.selectedRow && this.gridOptions.isClientSidePagination) {
|
|
834
|
+
return ((this.selectedRow.rowIndex + 1) / this.currentPage === this.rowsCountInCurrentPage || this.selectedRow.rowIndex + 1 === this.count);
|
|
835
|
+
}
|
|
836
|
+
return this.selectedRow && this.selectedRow.rowIndex + 1 === this.rowsCountInCurrentPage;
|
|
837
|
+
}
|
|
838
|
+
isFirstRowInPage() {
|
|
839
|
+
return this.selectedRow && this.selectedRow.rowIndex % this.pageSize === 0;
|
|
840
|
+
}
|
|
841
|
+
isFirstRowInFirstPage() {
|
|
842
|
+
return this.isFirstRowInPage() && this.currentPage === 1;
|
|
843
|
+
}
|
|
844
|
+
isLastRowInLastPage() {
|
|
845
|
+
return this.isLastRowInPage() && this.currentPage === this.pagesCount;
|
|
846
|
+
}
|
|
847
|
+
detectRowChange() {
|
|
848
|
+
this.rows = clone(this.rows);
|
|
849
|
+
this.changeDetectorRef.detectChanges();
|
|
850
|
+
}
|
|
851
|
+
isClientSidePagination() {
|
|
852
|
+
return this.gridOptions.isClientSidePagination;
|
|
853
|
+
}
|
|
854
|
+
setIdColumn() {
|
|
855
|
+
// To do improve
|
|
856
|
+
if (this.gridOptions && this.gridOptions.idProperty) {
|
|
857
|
+
COLUMN_ID.PROP = this.gridOptions.idProperty;
|
|
858
|
+
}
|
|
859
|
+
else {
|
|
860
|
+
COLUMN_ID.PROP = 'id';
|
|
861
|
+
}
|
|
862
|
+
}
|
|
863
|
+
initColumns() {
|
|
864
|
+
this.initViewColumns();
|
|
865
|
+
if (this.gridOptions && this.gridOptions.addIdColumn) {
|
|
866
|
+
this.addIdColumn();
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
configureDialog(dialogConfig) {
|
|
870
|
+
dialogConfig.position = {
|
|
871
|
+
top: '15vh',
|
|
872
|
+
left: '20vw',
|
|
873
|
+
};
|
|
874
|
+
dialogConfig.height = '80vh';
|
|
875
|
+
dialogConfig.width = '60vw';
|
|
876
|
+
dialogConfig.panelClass = 'columnshowhide-panel';
|
|
877
|
+
dialogConfig.data = {
|
|
878
|
+
defaultSortedColumns: this.defaultSortedColumns,
|
|
879
|
+
columns: this.viewColumns,
|
|
880
|
+
storageKey: this.storageKey,
|
|
881
|
+
metaDataColumns: this.gridOptions.metaDataColumns,
|
|
882
|
+
};
|
|
883
|
+
dialogConfig.disableClose = false;
|
|
884
|
+
return dialogConfig;
|
|
885
|
+
}
|
|
886
|
+
initViewColumns() {
|
|
887
|
+
this.viewColumns = clone(this.columns.filter((x) => x != undefined));
|
|
888
|
+
this.viewColumns.forEach((viewColumn) => {
|
|
889
|
+
if (viewColumn.isVisible === undefined) {
|
|
890
|
+
viewColumn.isVisible = true;
|
|
891
|
+
}
|
|
892
|
+
if (viewColumn.isDisplayValueAsFormControl === undefined) {
|
|
893
|
+
viewColumn.isDisplayValueAsFormControl = false;
|
|
894
|
+
}
|
|
895
|
+
});
|
|
896
|
+
this.searchColumns = this.getSearchableColumns(this.viewColumns);
|
|
897
|
+
}
|
|
898
|
+
addIdColumn() {
|
|
899
|
+
this.viewColumns.unshift({
|
|
900
|
+
header: COLUMN_ID.HEADER,
|
|
901
|
+
prop: COLUMN_ID.PROP,
|
|
902
|
+
type: ColumnTypes.Integer,
|
|
903
|
+
isReadOnly: true,
|
|
904
|
+
isVisible: false, // this.isIdColVisible,
|
|
905
|
+
isDisplayValueAsFormControl: false,
|
|
906
|
+
editDisabledMode: ColumnDisableModes.AlwaysDisabled,
|
|
907
|
+
});
|
|
908
|
+
}
|
|
909
|
+
setData(selectableIndex) {
|
|
910
|
+
this.numberOfTableRefresh += 1;
|
|
911
|
+
this.isLoading$.next(true);
|
|
912
|
+
if (!this.gridOptions.isAutoColumn) {
|
|
913
|
+
this.setInitApiParams();
|
|
914
|
+
}
|
|
915
|
+
this.applyDefaultSortingParams();
|
|
916
|
+
this.getListFn(this.apiReqParams)
|
|
917
|
+
.pipe(first(), takeUntil(this.clearSubs$))
|
|
918
|
+
.subscribe((response) => {
|
|
919
|
+
// TODO: add error handling
|
|
920
|
+
this.totalItems = response.itemsTotal;
|
|
921
|
+
this.initGetFunc(response, selectableIndex);
|
|
922
|
+
if (this.gridOptions.isDefaultAllRowSelected && this.gridOptions.isClientSidePagination) {
|
|
923
|
+
this.masterSelection.setValue(true);
|
|
924
|
+
this.masterToggle();
|
|
925
|
+
}
|
|
926
|
+
this.isTableDataLoad.emit(true);
|
|
927
|
+
}, (err) => {
|
|
928
|
+
if (err) {
|
|
929
|
+
this.isLoading$.next(false);
|
|
930
|
+
this.rows = this.rows || [];
|
|
931
|
+
this.changeDetectorRef.detectChanges();
|
|
932
|
+
}
|
|
933
|
+
}, () => {
|
|
934
|
+
// Empty Method block
|
|
935
|
+
});
|
|
936
|
+
}
|
|
937
|
+
setInitApiParams() {
|
|
938
|
+
if (this.numberOfTableRefresh > 1) {
|
|
939
|
+
return;
|
|
940
|
+
}
|
|
941
|
+
this.setInitFilterParams();
|
|
942
|
+
}
|
|
943
|
+
setInitFilterParams() {
|
|
944
|
+
this.filterManager.setInitFilterParams(this.columns);
|
|
945
|
+
}
|
|
946
|
+
initGetFunc(response, selectableIndex) {
|
|
947
|
+
this.count = this.gridOptions.isClientSidePagination ? response.resultSet.length : response.itemsTotal;
|
|
948
|
+
this.searchedRowCount$.next(response.itemsTotal);
|
|
949
|
+
if (this.gridOptions.isAutoColumn) {
|
|
950
|
+
this.generateColumns(response.resultSet);
|
|
951
|
+
}
|
|
952
|
+
this.rows = this.dataTableService.getRowsFromRowsData(response.resultSet);
|
|
953
|
+
if (this.gridOptions.editable) {
|
|
954
|
+
this.rows.forEach((x) => (x.isEditing = true));
|
|
955
|
+
}
|
|
956
|
+
if (this.gridOptions.isClientSidePagination) {
|
|
957
|
+
this.originalUnsortedRows = cloneDeep(this.rows);
|
|
958
|
+
}
|
|
959
|
+
this.filteredRows = cloneDeep(this.rows);
|
|
960
|
+
this.selectedRow = undefined;
|
|
961
|
+
this.isLoading$.next(false);
|
|
962
|
+
this.isClearFilter$.next(false);
|
|
963
|
+
this.isEditing = false;
|
|
964
|
+
this.hasEmptyRow = false;
|
|
965
|
+
if (this.gridOptions.defaultSortProperty.prop) {
|
|
966
|
+
this.applyDefaultSort();
|
|
967
|
+
}
|
|
968
|
+
if (this.isEligibleForAllCheck()) {
|
|
969
|
+
this.checkedAllExceptExcludedRows();
|
|
970
|
+
}
|
|
971
|
+
else if (this.isRowSelectionEnable && !this.gridOptions.isClientSidePagination) {
|
|
972
|
+
this.setRowChecked();
|
|
973
|
+
}
|
|
974
|
+
if (this.isDefaultFirstRowSelected()) {
|
|
975
|
+
// TODO - refactor
|
|
976
|
+
this.emitNextRow(this.getSelectableValidIndex(selectableIndex));
|
|
977
|
+
}
|
|
978
|
+
this.changeDetectorRef.detectChanges();
|
|
979
|
+
}
|
|
980
|
+
isEligibleForAllCheck() {
|
|
981
|
+
return (this.isRowSelectionEnable && !this.gridOptions.isClientSidePagination && !this.masterSelection.pristine && this.masterSelection.value);
|
|
982
|
+
}
|
|
983
|
+
getSelectableValidIndex(selectableIndex) {
|
|
984
|
+
if (selectableIndex === 'last') {
|
|
985
|
+
selectableIndex = this.pageSize;
|
|
986
|
+
}
|
|
987
|
+
return Number(selectableIndex) > this.rowsCountInCurrentPage - 1 ? this.rowsCountInCurrentPage - 1 : selectableIndex;
|
|
988
|
+
}
|
|
989
|
+
setPaginationData(paginationParams) {
|
|
990
|
+
this.paginationParams = paginationParams;
|
|
991
|
+
}
|
|
992
|
+
checkedAllExceptExcludedRows() {
|
|
993
|
+
this.clearPropertyWhenSelectionEnable(this.excludedRows);
|
|
994
|
+
this.selection.clear();
|
|
995
|
+
const excludedCurrentPageRows = this.rows.filter((x) => this.excludedRows.map((e) => JSON.stringify(e)).includes(JSON.stringify(x)));
|
|
996
|
+
this.rows
|
|
997
|
+
.filter((x) => !excludedCurrentPageRows.some((y) => JSON.stringify(x) === JSON.stringify(y)))
|
|
998
|
+
.forEach((row) => {
|
|
999
|
+
if (this.gridOptions.rowDisableFn && isFunction(this.gridOptions.rowDisableFn) && !this.gridOptions.rowDisableFn(row)) {
|
|
1000
|
+
this.selection.select(row);
|
|
1001
|
+
}
|
|
1002
|
+
else if (!this.gridOptions.rowDisableFn) {
|
|
1003
|
+
this.selection.select(row);
|
|
1004
|
+
}
|
|
1005
|
+
});
|
|
1006
|
+
}
|
|
1007
|
+
applyDefaultSort() {
|
|
1008
|
+
if (this.gridOptions.defaultSortProperty.order === SortDirectionEnum.DESC) {
|
|
1009
|
+
this.downSort(this.gridOptions.defaultSortProperty);
|
|
1010
|
+
}
|
|
1011
|
+
else {
|
|
1012
|
+
this.upSort(this.gridOptions.defaultSortProperty);
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
applyDefaultSortingParams() {
|
|
1016
|
+
if (!this.gridOptions.defaultSortProperty.prop) {
|
|
1017
|
+
return;
|
|
1018
|
+
}
|
|
1019
|
+
this.sortedColumn = {};
|
|
1020
|
+
if (this.gridOptions.defaultSortProperty.order === SortDirectionEnum.DESC) {
|
|
1021
|
+
this.sortedColumn[this.gridOptions.defaultSortProperty.prop] = SortDirectionEnum.DESC;
|
|
1022
|
+
}
|
|
1023
|
+
else {
|
|
1024
|
+
this.sortedColumn[this.gridOptions.defaultSortProperty.prop] = SortDirectionEnum.ASC;
|
|
1025
|
+
}
|
|
1026
|
+
}
|
|
1027
|
+
setPaginationDataOnSizeChanged(pageSize) {
|
|
1028
|
+
this.paginationParams.pageSize = pageSize;
|
|
1029
|
+
}
|
|
1030
|
+
navigatePage(url) {
|
|
1031
|
+
this.router.navigate([url], { relativeTo: this.activatedRoute });
|
|
1032
|
+
}
|
|
1033
|
+
openDeleteModal(row) {
|
|
1034
|
+
this.rowToDelete = row;
|
|
1035
|
+
const dialogConfig = new MatDialogConfig();
|
|
1036
|
+
dialogConfig.data = {
|
|
1037
|
+
message: this.gridOptions.deleteOptions.confirmationMessage,
|
|
1038
|
+
};
|
|
1039
|
+
dialogConfig.position = {
|
|
1040
|
+
top: '7%',
|
|
1041
|
+
};
|
|
1042
|
+
dialogConfig.panelClass = 'delete-modal-panel';
|
|
1043
|
+
const dialogRef = this.matDialog.open(DeleteModalComponent, dialogConfig);
|
|
1044
|
+
dialogRef
|
|
1045
|
+
.afterClosed()
|
|
1046
|
+
.pipe(first(), takeUntil(this.clearSubs$))
|
|
1047
|
+
.subscribe((result) => this.onClickDeleteModal(result));
|
|
1048
|
+
this.changeDetectorRef.detectChanges();
|
|
1049
|
+
}
|
|
1050
|
+
saveRow(eventData) {
|
|
1051
|
+
this.setIdColumn();
|
|
1052
|
+
const row = eventData.row, saveData = eventData.saveData;
|
|
1053
|
+
if (saveData[COLUMN_ID.PROP] === COLUMN_ID.EMPTY_ROW_VAL) {
|
|
1054
|
+
this.postDataForAdd(saveData, row);
|
|
1055
|
+
}
|
|
1056
|
+
else {
|
|
1057
|
+
this.putDataForEdit(saveData, row);
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
postDataForAdd(saveData, row) {
|
|
1061
|
+
this.isSaving = true;
|
|
1062
|
+
row.isSaving = true;
|
|
1063
|
+
this.postItemFn(saveData)
|
|
1064
|
+
.pipe(first(), takeUntil(this.clearSubs$))
|
|
1065
|
+
.subscribe((result) => {
|
|
1066
|
+
this.isSaving = false;
|
|
1067
|
+
row.isSaving = false;
|
|
1068
|
+
this.snackbarService.success(SnackbarTypes.Success, SnackbarTypes.Success);
|
|
1069
|
+
if (this.gridOptions.refreshOnAdd) {
|
|
1070
|
+
this.setData();
|
|
1071
|
+
}
|
|
1072
|
+
else {
|
|
1073
|
+
this.hasEmptyRow = false;
|
|
1074
|
+
saveData[COLUMN_ID.PROP] = result[COLUMN_ID.PROP];
|
|
1075
|
+
this.saveLocalRow(row, saveData);
|
|
1076
|
+
}
|
|
1077
|
+
}, () => {
|
|
1078
|
+
this.isSaving = false;
|
|
1079
|
+
row.isSaving = false;
|
|
1080
|
+
this.changeDetectorRef.detectChanges();
|
|
1081
|
+
});
|
|
1082
|
+
}
|
|
1083
|
+
putDataForEdit(saveData, row) {
|
|
1084
|
+
this.isSaving = true;
|
|
1085
|
+
row.isSaving = true;
|
|
1086
|
+
this.putItemFn(this.dataTableService.getRowId(row), saveData)
|
|
1087
|
+
.pipe(first(), takeUntil(this.clearSubs$))
|
|
1088
|
+
.subscribe((returnData) => {
|
|
1089
|
+
if (returnData) {
|
|
1090
|
+
saveData = merge(saveData, returnData);
|
|
1091
|
+
}
|
|
1092
|
+
this.isSaving = false;
|
|
1093
|
+
row.isSaving = false;
|
|
1094
|
+
this.snackbarService.info(SnackbarTypes.Update, SnackbarTypes.Update);
|
|
1095
|
+
if (!this.isClientSidePagination()) {
|
|
1096
|
+
this.setData();
|
|
1097
|
+
}
|
|
1098
|
+
else {
|
|
1099
|
+
this.saveLocalRow(row, saveData);
|
|
1100
|
+
this.onUpdateCompleted.emit({ row });
|
|
1101
|
+
}
|
|
1102
|
+
}, () => {
|
|
1103
|
+
this.isSaving = false;
|
|
1104
|
+
row.isSaving = false;
|
|
1105
|
+
this.changeDetectorRef.detectChanges();
|
|
1106
|
+
});
|
|
1107
|
+
}
|
|
1108
|
+
downSort(viewColumn) {
|
|
1109
|
+
this.rows.sort((item1, item2) => {
|
|
1110
|
+
return item1.data[viewColumn.prop] <= item2.data[viewColumn.prop] ? 1 : -1;
|
|
1111
|
+
});
|
|
1112
|
+
this.detectRowChange();
|
|
1113
|
+
}
|
|
1114
|
+
upSort(viewColumn) {
|
|
1115
|
+
this.rows.sort((item1, item2) => {
|
|
1116
|
+
return item1.data[viewColumn.prop] >= item2.data[viewColumn.prop] ? 1 : -1;
|
|
1117
|
+
});
|
|
1118
|
+
this.detectRowChange();
|
|
1119
|
+
}
|
|
1120
|
+
unsort() {
|
|
1121
|
+
this.rows = this.originalUnsortedRows.filter((original) => {
|
|
1122
|
+
return this.rows.filter((row) => JSON.stringify(row.data) === JSON.stringify(original.data));
|
|
1123
|
+
});
|
|
1124
|
+
}
|
|
1125
|
+
sortData(viewColumn, isAscending, isUnsort = false) {
|
|
1126
|
+
if (!this.gridOptions.isClientSidePagination) {
|
|
1127
|
+
this.setData();
|
|
1128
|
+
return;
|
|
1129
|
+
}
|
|
1130
|
+
if (isUnsort) {
|
|
1131
|
+
this.unsort();
|
|
1132
|
+
}
|
|
1133
|
+
else {
|
|
1134
|
+
isAscending ? this.upSort(viewColumn) : this.downSort(viewColumn);
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
addEmptyRow(depth = ROW.ROOT_DEPTH, parentId = COLUMN_ID.NO_PARENT_VAL) {
|
|
1138
|
+
this.hasEmptyRow = true;
|
|
1139
|
+
this.filterManager.clearFilterParams();
|
|
1140
|
+
const newRow = this.getEmptyRow(depth, parentId);
|
|
1141
|
+
this.selectedRow = newRow;
|
|
1142
|
+
this.rows = this.dataTableService.getRowsWithInsertedRow(parentId, this.rows, newRow);
|
|
1143
|
+
}
|
|
1144
|
+
removeEmptyRow() {
|
|
1145
|
+
this.hasEmptyRow = false;
|
|
1146
|
+
this.selectedRow = undefined;
|
|
1147
|
+
this.removeLocalRow(COLUMN_ID.EMPTY_ROW_VAL);
|
|
1148
|
+
}
|
|
1149
|
+
onSaveLocalRow(eventData) {
|
|
1150
|
+
if (this.dataTableService.isEmptyRow(eventData.row)) {
|
|
1151
|
+
this.addLocalRow(eventData.row, eventData.saveData);
|
|
1152
|
+
this.onChangeLocalData(ChangeType.ROW_ADDED);
|
|
1153
|
+
}
|
|
1154
|
+
else {
|
|
1155
|
+
this.editLocalRow(eventData.row, eventData.saveData);
|
|
1156
|
+
this.onChangeLocalData(ChangeType.ROW_UPDATED);
|
|
1157
|
+
}
|
|
1158
|
+
}
|
|
1159
|
+
addLocalRow(row, saveData) {
|
|
1160
|
+
this.hasEmptyRow = false;
|
|
1161
|
+
this.saveLocalRow(row, { ...saveData, id: this.dataTableService.getNewRowId() });
|
|
1162
|
+
}
|
|
1163
|
+
editLocalRow(row, saveData) {
|
|
1164
|
+
this.saveLocalRow(row, saveData);
|
|
1165
|
+
}
|
|
1166
|
+
saveLocalRow(row, saveData) {
|
|
1167
|
+
this.isEditing = false;
|
|
1168
|
+
this.updateRowData(row, saveData);
|
|
1169
|
+
row.isEditing = false;
|
|
1170
|
+
this.detectRowChange();
|
|
1171
|
+
}
|
|
1172
|
+
updateRowData(row, saveData) {
|
|
1173
|
+
Object.assign(row.data, saveData);
|
|
1174
|
+
if (!isUndefined(row.formGroup)) {
|
|
1175
|
+
this.formService.fillForm(row.formGroup, row.data);
|
|
1176
|
+
}
|
|
1177
|
+
}
|
|
1178
|
+
removeLocalRow(removeRowId) {
|
|
1179
|
+
const index = this.rows.findIndex((x) => x.data[COLUMN_ID.PROP] === removeRowId);
|
|
1180
|
+
this.rows = this.dataTableService.getRowsWithRemovedRow(removeRowId, this.rows);
|
|
1181
|
+
if (this.isDefaultFirstRowSelected()) {
|
|
1182
|
+
this.selectAutoNextRow(index);
|
|
1183
|
+
}
|
|
1184
|
+
else if (this.gridOptions.defaultFirstRowSelection && this.rows.length === 0) {
|
|
1185
|
+
this.onRowClicked.emit();
|
|
1186
|
+
}
|
|
1187
|
+
if (this.rows.length && this.rows.length % this.paginationParams.pageSize === 0) {
|
|
1188
|
+
this.paginationParams.currentPage--;
|
|
1189
|
+
this.searchedRowCount$.next(this.rows.length);
|
|
1190
|
+
}
|
|
1191
|
+
this.changeDetectorRef.detectChanges();
|
|
1192
|
+
}
|
|
1193
|
+
selectAutoNextRow(index) {
|
|
1194
|
+
if (index !== -1) {
|
|
1195
|
+
this.emitNextRow(this.rows.length === index ? this.rows.length - 1 : index);
|
|
1196
|
+
}
|
|
1197
|
+
}
|
|
1198
|
+
isDefaultFirstRowSelected() {
|
|
1199
|
+
return this.gridOptions.defaultFirstRowSelection;
|
|
1200
|
+
}
|
|
1201
|
+
emitNextRow(index = 0) {
|
|
1202
|
+
if (this.rows.length > 0) {
|
|
1203
|
+
this.rows.forEach((x) => (x.isSelected = false));
|
|
1204
|
+
this.selectedRow = this.rows[index];
|
|
1205
|
+
this.selectedRow.rowIndex = index;
|
|
1206
|
+
this.rows[index].isSelected = true;
|
|
1207
|
+
this.changeDetectorRef.detectChanges();
|
|
1208
|
+
this.dataTableBody.detectChange();
|
|
1209
|
+
this.onRowClicked.emit(this.rows[index]);
|
|
1210
|
+
}
|
|
1211
|
+
else {
|
|
1212
|
+
this.onRowClicked.emit();
|
|
1213
|
+
}
|
|
1214
|
+
}
|
|
1215
|
+
toggleRowEditing(row, isEditing) {
|
|
1216
|
+
this.isEditing = isEditing;
|
|
1217
|
+
row.isEditing = isEditing;
|
|
1218
|
+
this.rows = [...this.rows];
|
|
1219
|
+
this.changeDetectorRef.detectChanges();
|
|
1220
|
+
}
|
|
1221
|
+
toggleRowExpandCollapse(row, shouldExpand) {
|
|
1222
|
+
row.isExpanded = shouldExpand;
|
|
1223
|
+
this.rows = [...this.rows];
|
|
1224
|
+
this.changeDetectorRef.detectChanges();
|
|
1225
|
+
}
|
|
1226
|
+
getEmptyRow(depth, parentId) {
|
|
1227
|
+
return this.dataTableService.getRow(this.dataTableService.getEmptyRowData(this.viewColumns, this.defaultRowValues), depth, parentId, true);
|
|
1228
|
+
}
|
|
1229
|
+
onChangeLocalData(changeType = ChangeType.OTHER) {
|
|
1230
|
+
this.changeLocalData.emit({
|
|
1231
|
+
rowsData: this.dataTableService.getRowsDataFromRows(this.rows),
|
|
1232
|
+
changeType,
|
|
1233
|
+
});
|
|
1234
|
+
}
|
|
1235
|
+
fireInitCompleted() {
|
|
1236
|
+
this.onInitCompleted.emit(this.getGridApi());
|
|
1237
|
+
}
|
|
1238
|
+
addCloneRow(row, depth = ROW.ROOT_DEPTH, parentId = COLUMN_ID.NO_PARENT_VAL) {
|
|
1239
|
+
this.hasEmptyRow = true;
|
|
1240
|
+
row.data[COLUMN_ID.PROP] = COLUMN_ID.EMPTY_ROW_VAL;
|
|
1241
|
+
this.gridOptions.cloneOptions.copyOfClonableProperties.forEach((property) => {
|
|
1242
|
+
row.data[property] = DataTableConstants.COPY_OF + row.data[property];
|
|
1243
|
+
});
|
|
1244
|
+
const emptyValueColumns = this.viewColumns.filter((col) => {
|
|
1245
|
+
return this.gridOptions.cloneOptions.emptyValueProperties.includes(col.prop);
|
|
1246
|
+
});
|
|
1247
|
+
this.dataTableService.setEmptyValuesInRowData(row, emptyValueColumns);
|
|
1248
|
+
const clonedRow = this.dataTableService.getRow(row.data, depth, parentId, true);
|
|
1249
|
+
this.rows = this.dataTableService.getRowsWithInsertedRow(parentId, this.rows, clonedRow);
|
|
1250
|
+
this.selectedRow = clonedRow;
|
|
1251
|
+
}
|
|
1252
|
+
getGridApi() {
|
|
1253
|
+
return this.gridApi;
|
|
1254
|
+
}
|
|
1255
|
+
getSearchableColumns(columns) {
|
|
1256
|
+
const searchableColumns = columns.filter((item) => Object.hasOwnProperty.call(item, 'prop') && this.gridOptions.searchableProperties.includes(item.prop));
|
|
1257
|
+
return searchableColumns.length === 0 ? columns : searchableColumns;
|
|
1258
|
+
}
|
|
1259
|
+
masterToggleClientSide() {
|
|
1260
|
+
this.isAllSelected() ? this.selection.clear() : this.nonDisabledRows.forEach((row) => this.selection.select(row));
|
|
1261
|
+
this.changeDetectorRef.detectChanges();
|
|
1262
|
+
this.gridApi.detectRowChanges();
|
|
1263
|
+
}
|
|
1264
|
+
clearPropertyWhenSelectionEnable(checkedRows) {
|
|
1265
|
+
if (this.isRowSelectionEnable && checkedRows.length) {
|
|
1266
|
+
checkedRows.forEach((s) => {
|
|
1267
|
+
if (s.hasOwnProperty('isSelected')) {
|
|
1268
|
+
delete s.isSelected;
|
|
1269
|
+
}
|
|
1270
|
+
if (s.hasOwnProperty('rowIndex')) {
|
|
1271
|
+
delete s.rowIndex;
|
|
1272
|
+
}
|
|
1273
|
+
});
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
getCheckedRows() {
|
|
1277
|
+
const checkedRows = this.selection.selected;
|
|
1278
|
+
this.clearPropertyWhenSelectionEnable(checkedRows);
|
|
1279
|
+
const pageMatchedPreviousCheckedRows = this.rows.filter((row) => {
|
|
1280
|
+
return checkedRows.some((item) => JSON.stringify(row) === JSON.stringify(item));
|
|
1281
|
+
});
|
|
1282
|
+
const pageUnmatchedCheckedRows = checkedRows.filter((e) => {
|
|
1283
|
+
return pageMatchedPreviousCheckedRows.findIndex((m) => JSON.stringify(e) === JSON.stringify(m)) < 0;
|
|
1284
|
+
});
|
|
1285
|
+
return { pageMatchedPreviousCheckedRows: pageMatchedPreviousCheckedRows, pageUnmatchedCheckedRows: pageUnmatchedCheckedRows };
|
|
1286
|
+
}
|
|
1287
|
+
masterToggleServerSide() {
|
|
1288
|
+
const previousCheckedRows = this.getCheckedRows();
|
|
1289
|
+
this.selection.clear();
|
|
1290
|
+
this.addUnmatchedRowToSelection(previousCheckedRows.pageUnmatchedCheckedRows);
|
|
1291
|
+
if (this.rows.length !== previousCheckedRows.pageMatchedPreviousCheckedRows.length) {
|
|
1292
|
+
this.rows.forEach((row) => this.selection.select(row));
|
|
1293
|
+
}
|
|
1294
|
+
this.changeDetectorRef.detectChanges();
|
|
1295
|
+
this.gridApi.detectRowChanges();
|
|
1296
|
+
}
|
|
1297
|
+
addUnmatchedRowToSelection(rows) {
|
|
1298
|
+
rows.forEach((row) => this.selection.select(row));
|
|
1299
|
+
}
|
|
1300
|
+
setRowChecked() {
|
|
1301
|
+
const previousCheckedRows = this.getCheckedRows();
|
|
1302
|
+
this.selection.clear();
|
|
1303
|
+
this.addUnmatchedRowToSelection(previousCheckedRows.pageUnmatchedCheckedRows);
|
|
1304
|
+
this.rows
|
|
1305
|
+
.filter((e) => {
|
|
1306
|
+
return previousCheckedRows.pageMatchedPreviousCheckedRows.some((item) => JSON.stringify(e) === JSON.stringify(item));
|
|
1307
|
+
})
|
|
1308
|
+
.forEach((row) => {
|
|
1309
|
+
this.selection.select(row);
|
|
1310
|
+
});
|
|
1311
|
+
this.changeDetectorRef.detectChanges();
|
|
1312
|
+
this.gridApi.detectRowChanges();
|
|
1313
|
+
}
|
|
1314
|
+
getFilteredDataRow(dataRows) {
|
|
1315
|
+
return dataRows.filter((e) => {
|
|
1316
|
+
return this.filteredRows.some((item) => JSON.stringify(e.data) === JSON.stringify(item.data));
|
|
1317
|
+
});
|
|
1318
|
+
}
|
|
1319
|
+
setColumnSource(property) {
|
|
1320
|
+
let source;
|
|
1321
|
+
const index = this.gridOptions.metaDataColumns.findIndex((value) => value === property);
|
|
1322
|
+
if (index > -1) {
|
|
1323
|
+
source = this.sourceTypes.METADATA;
|
|
1324
|
+
}
|
|
1325
|
+
else {
|
|
1326
|
+
source = this.sourceTypes.DATA_SOURCE;
|
|
1327
|
+
}
|
|
1328
|
+
return source;
|
|
1329
|
+
}
|
|
1330
|
+
setColumnsUsingStoredData(defaultColumns) {
|
|
1331
|
+
let tempCollection = [];
|
|
1332
|
+
tempCollection = defaultColumns.filter((x) => x != undefined);
|
|
1333
|
+
if (!this.storageKey) {
|
|
1334
|
+
return tempCollection;
|
|
1335
|
+
}
|
|
1336
|
+
let storedColumns = this.localStorageService.getItem(this.storageKey);
|
|
1337
|
+
if (storedColumns && storedColumns.length) {
|
|
1338
|
+
var index = 0;
|
|
1339
|
+
storedColumns
|
|
1340
|
+
.filter((x) => x != undefined)
|
|
1341
|
+
.forEach((item) => {
|
|
1342
|
+
const existingColumnIndex = tempCollection.findIndex((x) => x.prop === item.prop);
|
|
1343
|
+
if (existingColumnIndex > -1) {
|
|
1344
|
+
const existingColumn = tempCollection.find((x) => x.prop === item.prop);
|
|
1345
|
+
if (existingColumn) {
|
|
1346
|
+
existingColumn.isVisible = true;
|
|
1347
|
+
var tempcolumn = tempCollection[index];
|
|
1348
|
+
tempCollection[index] = existingColumn;
|
|
1349
|
+
tempCollection[existingColumnIndex] = tempcolumn;
|
|
1350
|
+
}
|
|
1351
|
+
}
|
|
1352
|
+
index++;
|
|
1353
|
+
});
|
|
1354
|
+
// added invisible columns at the end to complete the set
|
|
1355
|
+
tempCollection
|
|
1356
|
+
.filter((item) => item && storedColumns.findIndex((x) => x.prop === item.prop) < 0)
|
|
1357
|
+
.forEach((item) => {
|
|
1358
|
+
if (item) {
|
|
1359
|
+
item.isVisible = false;
|
|
1360
|
+
}
|
|
1361
|
+
});
|
|
1362
|
+
}
|
|
1363
|
+
return tempCollection;
|
|
1364
|
+
}
|
|
1365
|
+
selectedCheckboxPagingConfirmation(selectableIndex) {
|
|
1366
|
+
const dialogRef = this.matDialog.open(CommonConfirmModalComponent, {
|
|
1367
|
+
width: '450px',
|
|
1368
|
+
data: {
|
|
1369
|
+
body: this.confirmationMsgPagination,
|
|
1370
|
+
},
|
|
1371
|
+
});
|
|
1372
|
+
dialogRef
|
|
1373
|
+
.afterClosed()
|
|
1374
|
+
.pipe()
|
|
1375
|
+
.subscribe((confirmation) => {
|
|
1376
|
+
if (confirmation) {
|
|
1377
|
+
this.setData(selectableIndex);
|
|
1378
|
+
}
|
|
1379
|
+
});
|
|
1380
|
+
}
|
|
1381
|
+
isSelectedRow() {
|
|
1382
|
+
return this.gridApi.getSelectedRows().map((x) => x.data).length;
|
|
1383
|
+
}
|
|
1384
|
+
searchTable() {
|
|
1385
|
+
this.searchValue.valueChanges
|
|
1386
|
+
.pipe(filter((res) => res.length >= 2 || res === ''), debounceTime(500), distinctUntilChanged(), takeUntil(this.clearSubs$))
|
|
1387
|
+
.subscribe(() => {
|
|
1388
|
+
if (!this.isSearchDisabled) {
|
|
1389
|
+
this.paginationParams.currentPage = 1;
|
|
1390
|
+
this.changeDetectorRef.detectChanges();
|
|
1391
|
+
this.setData();
|
|
1392
|
+
}
|
|
1393
|
+
});
|
|
1394
|
+
}
|
|
1395
|
+
populateFilterParams() {
|
|
1396
|
+
if (!this.gridOptions.isClientSidePagination && this.gridOptions.isSearchBoxVisible && !this.gridOptions.isUpdatedTableDesign) {
|
|
1397
|
+
return [{ columnName: 'searchText', filterValue: this.searchValue.value }, ...this.filterManager.getFilterParams()];
|
|
1398
|
+
}
|
|
1399
|
+
return this.filterManager.getFilterParams();
|
|
1400
|
+
}
|
|
1401
|
+
getConfiguredColumns() {
|
|
1402
|
+
if (isFunction(this.gridOptions.storageFn)) {
|
|
1403
|
+
this.storageKey = this.gridOptions.storageFn();
|
|
1404
|
+
let columns = this.setColumnsUsingStoredData(this.columns);
|
|
1405
|
+
this.viewColumns = columns.filter((x) => x != undefined);
|
|
1406
|
+
}
|
|
1407
|
+
}
|
|
1408
|
+
generateColumns(rowData) {
|
|
1409
|
+
this.columns = Object.keys(rowData[0]).map((x) => {
|
|
1410
|
+
return {
|
|
1411
|
+
header: x.toUpperCase(),
|
|
1412
|
+
prop: x,
|
|
1413
|
+
type: ColumnTypes.String,
|
|
1414
|
+
rendererTemplate: this.gridOptions.renderTemplatesProp ? this.gridOptions.renderTemplatesProp[x] : undefined,
|
|
1415
|
+
};
|
|
1416
|
+
});
|
|
1417
|
+
this.initColumns();
|
|
1418
|
+
this.defaultSortedColumns = clone(this.viewColumns);
|
|
1419
|
+
this.changeDetectorRef.detectChanges();
|
|
1420
|
+
}
|
|
1421
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DataTableComponent, deps: [{ token: i1.DataTableService }, { token: i2.Router }, { token: i2.ActivatedRoute }, { token: i3.MatDialog }, { token: i0.ChangeDetectorRef }, { token: i4.SnackbarService }, { token: i5.UserManagementService }, { token: i6.ColumnFilterPipe }, { token: i7.SearchPipe }, { token: i8.LocalStorageService }, { token: i3.MatDialog }, { token: i9.FormService }, { token: i10.DataTableContextService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1422
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: DataTableComponent, selector: "app-data-table", inputs: { defaultRowValues: "defaultRowValues", columns: "columns", getListFn: "getListFn", postItemFn: "postItemFn", putItemFn: "putItemFn", deleteItemFn: "deleteItemFn", header: "header", description: "description", actionAddTitle: "actionAddTitle", isIdColVisible: "isIdColVisible", hasPagination: "hasPagination", isOnlyView: "isOnlyView", isOnlyViewRow: "isOnlyViewRow", isDeleteDisabled: "isDeleteDisabled", isEditable: "isEditable", isCloneVisible: "isCloneVisible", isLazyInitialization: "isLazyInitialization", objectName: "objectName", gridOptions: "gridOptions", isRowSelectionEnable: "isRowSelectionEnable", beforeSaveFn: "beforeSaveFn", onBeforeEdit: "onBeforeEdit", onAddClick: "onAddClick", isRowUnchecked: "isRowUnchecked", isSaveDataLocal: "isSaveDataLocal", scrollPosition: "scrollPosition", isTreeGrid: "isTreeGrid", initialPage: "initialPage" }, outputs: { changeLocalData: "changeLocalData", actionClick: "actionClick", onInitCompleted: "onInitCompleted", onComplexDetailClicked: "onComplexDetailClicked", onEditClicked: "onEditClicked", onAddClicked: "onAddClicked", onRowClicked: "onRowClicked", onPageChanged: "onPageChanged", matExpansionPanelClicked: "matExpansionPanelClicked", onUpdateCompleted: "onUpdateCompleted", onDeleteCompleted: "onDeleteCompleted", onScrolled: "onScrolled", CheckboxSelect: "CheckboxSelect", isTableDataLoad: "isTableDataLoad" }, providers: [
|
|
1423
|
+
{
|
|
1424
|
+
provide: DATA_TABLE_CONTEXT,
|
|
1425
|
+
useExisting: DataTableComponent,
|
|
1426
|
+
},
|
|
1427
|
+
], viewQueries: [{ propertyName: "setDataTableBody", first: true, predicate: DataTableBodyComponent, descendants: true }, { propertyName: "deleteModal", first: true, predicate: ["deleteModal"], descendants: true, read: TemplateRef, static: true }, { propertyName: "customDataTable", first: true, predicate: ["customDataTable"], descendants: true }, { propertyName: "sliderTemplate", first: true, predicate: ["sliderTemplate"], descendants: true }], ngImport: i0, template: "<div>\n <section class=\"actions\">\n <section class=\"search\" *ngIf=\"gridOptions.isSearchBoxVisible && !gridOptions.isUpdatedTableDesign\">\n <form ngForm>\n <div class=\"searchbar-wrapper\">\n <i class=\"svg-icon fa-solid fa-magnifying-glass\"></i>\n <input matInput type=\"text\" placeholder=\"Search {{ searchPlaceholder }}\" name=\"search\"\n [formControl]=\"searchValue\" [disabled]=\"isSearchDisabled\"\n (ngModelChange)=\"searchModelChanged()\" />\n </div>\n </form>\n </section>\n <div class=\"toolbar\" *ngIf=\"!gridOptions.hideTopToolbar\">\n <section *ngIf=\"!isOnlyView\" class=\"adding\">\n <ul class=\"row-actions\">\n <ng-container *hasPermission=\"getActionName(actionTypes.ADD)\">\n <li *ngIf=\"!gridOptions.addButtonTemplate\">\n <span *ngIf=\"!isTableInEditState\">\n <a (click)=\"onClickAdd()\"\n [ngClass]=\"{'disabled': isDisabledMainAction(actionTypes.ADD) || (gridOptions.disableIcons && gridOptions.disableIcons.add$ |async)}\">\n <span title=\"{{getTooltipText(toolTips.ADD)}}\" class=\"toolbar-icon icon-plus\"\n [ngClass]=\"(isDisabledMainAction(actionTypes.ADD) || (gridOptions.disableIcons && gridOptions.disableIcons.add$ |async))? 'icon-inactive': 'icon-active'\"></span>\n </a>\n </span>\n </li>\n </ng-container>\n <ng-container *ngIf=\"gridOptions.addButtonTemplate\">\n <li>\n <ng-container *ngTemplateOutlet=\"gridOptions.addButtonTemplate;\"></ng-container>\n </li>\n </ng-container>\n </ul>\n <ng-container *ngIf=\"!isLoading$.getValue()\">\n <app-data-table-actions\n *ngIf=\"!(isOnlyView && !isViewActionVisible) && !gridOptions.isRowActionVisible\"\n [gridApi]=\"gridApi\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [gridOptions]=\"gridOptions\" [selectedRow]=\"selectedRow\" [isIconsDisabled]=\"isActionsDisabled\"\n [isEditing]=\"selectedRow?.isEditing\" [isSaving]=\"selectedRow?.isSaving\"\n [isOnlyView]=\"isOnlyView\" [isEditable]=\"isEditable\" (clickAdd)=\"onClickAdd()\"\n [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\" [isSaving]=\"isSaving\"\n [isCloneVisible]=\"isCloneVisible\" [isDeleteVisible]=\"!checkDeleteDisabled()\">\n </app-data-table-actions>\n </ng-container>\n </section>\n <ul class=\"row-actions\" *ngIf=\"!isOnlyView || gridOptions.isTopLeftActionsForceDisply\">\n <ng-container *ngFor=\"let action of gridOptions.topLeftAdditionalActions\">\n <li>\n <a *hasPermission=\"getLeftActionName(action.actionName)\"\n [ngClass]=\"{'disabled': action.isDisabled}\" (click)=\"ActionClickHandler(action)\"\n class=\"fontIco\">\n <app-icon *ngIf=\"!action.isClass\" [title]=\"getLeftRightActionText(action)\"\n [name]=\"action.iconOrClassName\"></app-icon>\n <span *ngIf=\"action.isClass\" title=\"{{getLeftRightActionText(action)}}\"\n class=\"toolbar-icon {{ action.iconOrClassName }}\"\n [ngClass]=\"(action.actionName===actionTypes.UPLOAD && action.isDisabled)? 'icon-inactive': ''\"></span>\n </a>\n </li>\n <li *ngIf=\"action.loading$ | async\">\n <mat-spinner class=\"mr-1 action-loader\" [diameter]=\"25\"></mat-spinner>\n </li>\n </ng-container>\n\n </ul>\n <ng-container *ngIf=\"gridOptions.leftActionBtnTemplate\">\n <ng-container *ngTemplateOutlet=\"gridOptions.leftActionBtnTemplate\"></ng-container>\n </ng-container>\n <span class=\"toolbar-spacer\"></span>\n\n <ul class=\"row-actions\">\n\n <ng-container *ngFor=\"let action of gridOptions.topRightActions\">\n <li>\n <a (click)=\"ActionClickHandler(action)\" class=\"fontIco\">\n <app-icon [title]=\"getLeftRightActionText(action)\" [name]=\"action.icon\"></app-icon>\n </a>\n </li>\n </ng-container>\n\n </ul>\n <ng-container *ngIf=\"gridOptions.isUpdatedTableDesign\">\n <ng-container *ngIf=\"gridOptions.newTableButtontemplate\">\n <ng-container *ngTemplateOutlet=\"gridOptions.newTableButtontemplate\"></ng-container>\n </ng-container>\n <section class=\"search\" *ngIf=\"gridOptions.isSearchBoxVisible\">\n <form ngForm>\n <div class=\"searchbar-wrapper\">\n <i class=\"svg-icon fa-solid fa-magnifying-glass\"></i>\n <input matInput type=\"text\" placeholder=\"Search\" name=\"search\" [formControl]=\"searchValue\"\n [disabled]=\"isSearchDisabled\" (ngModelChange)=\"searchModelChanged()\" />\n </div>\n </form>\n </section>\n <ng-container *ngIf=\"gridOptions.isFilterEnabled\">\n <button mat-stroked-button color=\"primary\" (click)=\"showHideFilterView()\">\n <em class=\"fas fa-filter inactive-filter\" [ngClass]=\"{'active-filter': isFilterApplied }\"></em>\n Filter\n </button>\n <button [title]=\"'Clear'\" (click)=\"clearGlobalFilter()\" mat-stroked-button color=\"primary\">\n <em class=\"fas fa-broom\"></em>\n </button>\n </ng-container>\n </ng-container>\n\n <ul class=\"row-actions\">\n <li *ngIf=\"!gridOptions.hideColumnConfiguration\">\n <a (click)=\"openColumnShowHideDialogue()\" class=\"fontIco\">\n <app-icon [title]=\"getTooltipText(toolTips.COLUMN_CONFIGURATION)\" [name]=\"ICONS.ColumnSelector\">\n </app-icon>\n </a>\n </li>\n </ul>\n\n </div>\n </section>\n</div>\n\n<mat-card class=\"table-card\" [ngClass]=\"{'transparent-table-design': gridOptions.isTransparentTableDesign}\">\n <app-loader *ngIf=\"isLoading$ | async\" class=\"loader-middle\"></app-loader>\n\n <mat-card-content>\n <div class=\"custom-data-table\" [ngClass]=\"{'default-table-height': isLoading$.getValue(), 'overflow-visible': gridOptions.isAccordionTable }\"\n (scroll)=\"onTableScrolled($event)\" #customDataTable [ngStyle]=\"getCustomTableStyle\">\n <table aria-describedby=\"Generic data table\" *ngIf=\"!gridOptions.isAccordionTable\"\n class=\"table apollo-design-new-data-table\" [ngClass]=\"{ '-tree': isTreeGrid }\" mdbTable>\n <thead *ngIf=\"!gridOptions.hideTableHeader\" class=\"sticky-header\">\n <tr *ngIf=\"gridOptions.isUpdatedTableDesign && isFilterView\" class=\"table-first-header\">\n <th *ngIf=\"isRowSelectionEnable\" scope=\"col\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <th *ngIf=\"viewColumn.isVisible\" scope=\"col\" class=\"header\"\n [ngClass]=\"{'transparent': !viewColumn.isMetaDataColumn && gridOptions.isUpdatedTableDesign}\">\n <app-data-col-filter *ngIf=\"isFilterEnable(viewColumn.prop)\" [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\" [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\" [isUpdatedFilterDesign]=\"true\"\n [isClearFilter$]=\"isClearFilter$\" [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n </th>\n </ng-container>\n </tr>\n <tr class=\"table-second-header\">\n <th *ngIf=\"isRowSelectionEnable && !isSingleSelect\" scope=\"col\" class=\"hasSelection\">\n <mat-checkbox class=\"table-header-checkbox\" (change)=\"$event ? masterToggle() : null\"\n [formControl]=\"masterSelection\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <th scope=\"col\" *ngIf=\"isRowSelectionEnable && isSingleSelect\" class=\"hasSelection\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns; let i = index\">\n <th *ngIf=\"viewColumn.isVisible\" scope=\"col\" class=\"header\" [attr.data-column-prop]=\"viewColumn.prop\"\n [ngClass]=\"{'transparent': !viewColumn.isMetaDataColumn && gridOptions.isUpdatedTableDesign}\">\n <div [ngClass]=\"getHeaderStyle(i, viewColumn)\">\n <app-data-col-filter\n *ngIf=\"isFilterEnable(viewColumn.prop) && !gridOptions.isUpdatedTableDesign\"\n [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\"\n [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\" [isClearFilter$]=\"isClearFilter$\"\n [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n\n <span class=\"header\" [ngClass]=\"{'sort-column': isSortColumn(viewColumn)}\"\n (click)=\"sortTable(viewColumn)\">{{ viewColumn.header }}\n <ng-container *ngIf=\"viewColumn.headerIconClass\">\n <span class=\"header-icon\" [ngClass]=\"viewColumn.headerIconClass\"></span>\n </ng-container>\n <span class=\"sort-icon\"\n *ngIf=\"sortedColumn[viewColumn.prop]=== sortDirectionEnum.DESC\">\n <em class=\"material-icons\">\n arrow_downward\n </em>\n </span>\n <span class=\"sort-icon\"\n *ngIf=\"sortedColumn[viewColumn.prop]=== sortDirectionEnum.ASC\">\n <em class=\"material-icons\">\n arrow_upward\n </em>\n </span>\n </span>\n <ng-container\n *ngIf=\"gridOptions.isUpdatedTableDesign && isFilteredColumn(viewColumn.prop)\">\n <em class=\"fas fa-filter active-filter\"></em>\n </ng-container>\n <div *ngIf=\"gridOptions.draggable\"\n [ngClass]=\"{ 'header-separator': true, 'col-resize-cursor': viewColumn.draggable }\"\n (mousedown)=\"onSeparatorMouseDown($event, i, viewColumn)\"\n (dblclick)=\"onDoubleClickSeparator(i, viewColumn)\">\n </div>\n </div>\n </th>\n </ng-container>\n <th *ngIf=\"!(isOnlyView && !isViewActionVisible) && gridOptions.isRowActionVisible\" scope=\"col\">\n Actions</th>\n <th [ngClass]=\"{'transparent': gridOptions.isUpdatedTableDesign}\"\n *ngIf=\"gridOptions.gridMenuOptions && gridOptions.gridMenuOptions.isMenuEnabled\"></th>\n </tr>\n <ng-container *ngIf=\"gridOptions.hasFixedFirstRow\">\n <tr *ngIf=\"!(isLoading$ | async)\">\n <th *ngIf=\"isRowSelectionEnable && !isSingleSelect\" class=\"transparent\"></th>\n <th *ngIf=\"isRowSelectionEnable && isSingleSelect\" class=\"transparent\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <th class=\"transparent\">\n <ng-container\n *ngTemplateOutlet=\"viewColumn.fixedFirstRowTemplate; context: { $implicit: { col: viewColumn } }\"></ng-container>\n </th>\n </ng-container>\n </tr>\n </ng-container>\n </thead>\n <tbody *ngIf=\"!isLoading$.getValue()\" app-data-table-body [gridOptions]=\"gridOptions\"\n [selection]=\"selection\"\n [rows]=\"rows | columnFilter : filterManager.getFilterParams() : columns: gridOptions.isClientSidePagination\"\n [viewColumns]=\"viewColumns\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [isOnlyView]=\"isOnlyView\" [searchedRowCount$]=\"searchedRowCount$\" [onAddClick]=\"onAddClick\"\n [isOnlyViewRow]=\"isOnlyViewRow\" [isDeleteDisabled]=\"isDeleteDisabled\" [search]=\"searchValue.value\"\n [paginationParams]=\"paginationParams\" [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\"\n [isRowSelectionEnable]=\"isRowSelectionEnable\" [searchColumns]=\"searchColumns\"\n [isCloneVisible]=\"isCloneVisible\" (clickEdit)=\"onClickEdit($event)\"\n (clickClone)=\"onClickClone($event)\" (clickAction)=\"onClickAction($event)\"\n (clickEditCancel)=\"onClickEditCancel($event)\" (clickEditSave)=\"onClickEditSave($event)\"\n (clickDelete)=\"onClickDeleteRow($event)\" (clickView)=\"onClickView($event)\"\n (clickAdd)=\"onClickRowAdd($event)\" (clickRow)=\"onClickRow($event)\"\n (changeExpandCollapse)=\"onChangeExpandCollapse($event)\"\n (complexDetailClicked)=\"ComplexDetailClicked($event)\" [isRowUnchecked]=\"isRowUnchecked\"\n (CheckboxSelect)=\"isCheckboxSelect($event)\">\n </tbody>\n\n </table>\n\n <ng-container *ngIf=\"gridOptions.isAccordionTable\">\n <mat-accordion displayMode=\"flat\" multi class=\"mat-table\" *ngIf=\"gridOptions.isAccordionTable\">\n <mat-expansion-panel *ngIf=\"!gridOptions.hideTableHeader\" class=\"mask-body header-panel\" hideToggle>\n <mat-expansion-panel-header (keydown.Enter)=\"$event.stopImmediatePropagation();\"\n [collapsedHeight]=\"'auto'\" [expandedHeight]=\"'auto'\" class=\"mat-row header-row\">\n <div class=\"mat-checkboxRow\" *ngIf=\"isRowSelectionEnable && !isSingleSelect\"\n (click)=\"$event.stopPropagation()\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [(ngModel)]=\"masterSelection\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </div>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <div *ngIf=\"viewColumn.isVisible\" scope=\"col\" (click)=\"$event.stopPropagation()\"\n class=\"mat-cell d-inline-block\" [ngClass]=\"viewColumn.customCssClass\">\n <app-data-col-filter class=\"filter-column\" *ngIf=\"isFilterEnable(viewColumn.prop)\"\n [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\"\n [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\"\n [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n \n <span [ngClass]=\"nonFilterClassName(viewColumn.prop)\" class=\"table .header\"\n (click)=\"sortTable(viewColumn)\">{{ viewColumn.header }}\n <span class=\"sort-icon\" *ngIf=\"sortedColumn[viewColumn.prop]=='DownSorted'\">\n <em class=\"material-icons\">\n arrow_downward\n </em>\n </span>\n <span class=\"sort-icon\" *ngIf=\"sortedColumn[viewColumn.prop]=='UpSorted'\">\n <em class=\"material-icons\">\n arrow_upward\n </em>\n </span>\n </span>\n </div>\n </ng-container>\n </mat-expansion-panel-header>\n </mat-expansion-panel>\n <ng-container>\n <div *ngIf=\"!isLoading$.getValue()\" app-data-table-body [gridOptions]=\"gridOptions\"\n [selection]=\"selection\"\n [rows]=\"rows | columnFilter : filterManager.getFilterParams() : columns: gridOptions.isClientSidePagination\"\n [viewColumns]=\"viewColumns\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [isOnlyView]=\"isOnlyView\" [searchedRowCount$]=\"searchedRowCount$\"\n [isOnlyViewRow]=\"isOnlyViewRow\" [isDeleteDisabled]=\"isDeleteDisabled\"\n [search]=\"searchValue.value\" [paginationParams]=\"paginationParams\"\n [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\"\n [isRowSelectionEnable]=\"isRowSelectionEnable\" [searchColumns]=\"searchColumns\"\n [isCloneVisible]=\"isCloneVisible\" (clickEdit)=\"onClickEdit($event)\"\n (matExpansionPanelClicked)=\"onExpansionPanelClick($event)\"\n (clickClone)=\"onClickClone($event)\" (clickAction)=\"onClickAction($event)\"\n (clickEditCancel)=\"onClickEditCancel($event)\" (clickEditSave)=\"onClickEditSave($event)\"\n (clickDelete)=\"onClickDeleteRow($event)\" (clickView)=\"onClickView($event)\"\n (clickAdd)=\"onClickRowAdd($event)\" (clickRow)=\"onClickRow($event)\"\n (changeExpandCollapse)=\"onChangeExpandCollapse($event)\"\n (complexDetailClicked)=\"ComplexDetailClicked($event)\"\n (CheckboxSelect)=\"isCheckboxSelect($event)\"></div>\n\n </ng-container>\n </mat-accordion>\n </ng-container>\n </div>\n <section *ngIf=\"hasPagination && selection\" class=\"pagination\">\n <app-data-pagination [selectionCount]=\"selection.selected.length\" class=\"table-pagination-container\" [ngClass]=\"{'transparent-table-design': gridOptions.isTransparentTableDesign}\" [totalRowCount$]=\"this.searchedRowCount$\"\n [count]=\"count\" [page]=\"paginationParams.currentPage\" [size]=\"paginationParams.pageSize\" [hasDropdownStylePageSize]=\"gridOptions.hasDropdownStylePageSize ?? true\"\n (changePage)=\"onChangePage($event)\">\n </app-data-pagination>\n </section>\n </mat-card-content>\n</mat-card>", styles: [".show-hide{float:right}::-webkit-input-placeholder{color:#000;font-size:11px}::-moz-placeholder{color:#000;font-size:11px}:-ms-input-placeholder{color:#000;font-size:11px}::placeholder{color:#000;font-size:11px}.custom-data-table{margin:0!important;overflow-x:auto;position:relative}.table-card{padding:0}.custom-data-table .table thead th:first-child{border-top-left-radius:4px}.custom-data-table .table thead th:last-child{border-top-right-radius:4px}.custom-data-table .table thead th{padding:.5rem .8rem;text-align:left;white-space:nowrap;font-weight:400;color:#393939;font-size:.9rem;vertical-align:middle;position:relative}.hasSelection{width:20px}.search{margin:1px 0 22px}.sort-icon .material-icons{color:#2371fc;font-size:18px;position:relative;top:4px;left:10px;padding-right:14px}.table-card-hidden{visibility:hidden}.disabled{pointer-events:none!important;color:gray!important}.table-card{margin-bottom:14px;border-radius:4px;border:1px solid rgb(233,233,233);box-shadow:0 4px 16px #0000000a;opacity:1;background-color:#fff}::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#0768fd}::ng-deep .filteredColumn>a:hover{color:#0768fd!important}::ng-deep .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background,.mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#0768fd}:host ::ng-deep app-data-col-filter.filteredColumn>a{color:#0768fd}:host ::ng-deep app-data-col-filter a{color:#999}.table-pagination-container{width:100%;padding:12px 16px;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid rgb(233,233,233);opacity:1;background-color:#f6f7fb}.text-link-with-ico{color:#0768fd!important}.text-link-with-ico img{position:relative;top:-2px;padding-right:12px}a.text-link-with-ico{margin-right:0}.search-icon{margin-right:5px;position:absolute;top:10px;left:10px;font-size:16px;color:#bbb;z-index:1000}.fontIco{font-size:20px}.mat-checkboxRow{margin-right:6px}.filter-column{color:#ccc;margin-left:2px}.empty-row{width:auto;margin:0;font-size:15px;line-height:5rem;text-align:center}.non-filter-cell{margin-left:-8px}.row-selection-non-filter-cell{margin-left:-2px}.table-header-checkbox{margin-left:0}.toolbar .adding{display:flex;align-items:center}.sticky-header{position:sticky;top:0;z-index:100}.inactive-filter{color:#ccc!important}.active-filter,.header-icon{color:#0768fd!important}.clear-button{padding:4px 15px!important;font-weight:700}.transparent{background-color:#fff;opacity:1}.loader-middle{position:absolute;z-index:99;left:45%;margin-left:-28px;top:40%;margin-top:-28px}.default-table-height{height:300px}.no-records-found{width:auto;font-size:15px;position:absolute;top:40%;left:45%}.sort-column{cursor:pointer}.icon-inactive{filter:grayscale(1)}.header-separator{position:absolute;top:7px;right:0;height:60%;width:3px;background-color:#1c1a1a33;transition:background-color .3s ease;z-index:1}.header-separator:before{content:\"\";position:absolute;inset:0 0 0 -10px}.col-resize-cursor{cursor:col-resize}.header-separator:hover{background-color:#00000080}.drag-column{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:50px}.header-max-width{max-width:170px;overflow:hidden;text-overflow:ellipsis}.overflow-visible{overflow:visible}:host ::ng-deep .mat-expansion-panel.header-panel{overflow:visible}\n"], dependencies: [{ kind: "directive", type: i11.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i11.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i11.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i11.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i12.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i13.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i14.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i14.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i15.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i16.MatAccordion, selector: "mat-accordion", inputs: ["hideToggle", "displayMode", "togglePosition"], exportAs: ["matAccordion"] }, { kind: "component", type: i16.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i16.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "component", type: i17.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i18.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i18.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i18.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i18.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i18.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i18.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i18.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i19.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }, { kind: "directive", type: i19.DefaultStyleDirective, selector: " [ngStyle], [ngStyle.xs], [ngStyle.sm], [ngStyle.md], [ngStyle.lg], [ngStyle.xl], [ngStyle.lt-sm], [ngStyle.lt-md], [ngStyle.lt-lg], [ngStyle.lt-xl], [ngStyle.gt-xs], [ngStyle.gt-sm], [ngStyle.gt-md], [ngStyle.gt-lg]", inputs: ["ngStyle", "ngStyle.xs", "ngStyle.sm", "ngStyle.md", "ngStyle.lg", "ngStyle.xl", "ngStyle.lt-sm", "ngStyle.lt-md", "ngStyle.lt-lg", "ngStyle.lt-xl", "ngStyle.gt-xs", "ngStyle.gt-sm", "ngStyle.gt-md", "ngStyle.gt-lg"] }, { kind: "component", type: i20.DataPaginationComponent, selector: "app-data-pagination", inputs: ["totalRowCount$", "count", "page", "pageSizeOptions", "size", "selectionCount", "numberOfLinks", "hasDropdownStylePageSize"], outputs: ["changePage", "changePageSize"] }, { kind: "component", type: i21.LoaderComponent, selector: "app-loader", inputs: ["colorScheme", "componentSize"] }, { kind: "component", type: i22.DataTableActionsComponent, selector: "app-data-table-actions", inputs: ["canInlineEdit", "isEditable", "isEditing", "isSaving", "isTreeGrid", "isOnlyView", "hasEmptyRow", "isCloneVisible", "isDeleteVisible", "selectedRow", "gridApi", "gridOptions", "isIconsDisabled"], outputs: ["clickAdd"] }, { kind: "component", type: i23.IconComponent, selector: "app-icon", inputs: ["name", "title", "colorScheme", "hasStyleOnHover", "isDisabled"] }, { kind: "component", type: i24.DataTableBodyComponent, selector: "[app-data-table-body]", inputs: ["rows", "viewColumns", "canInlineEdit", "isTreeGrid", "isOnlyView", "isOnlyViewRow", "isDeleteDisabled", "isEditable", "searchedRowCount$", "gridOptions", "search", "paginationParams", "hasEmptyRow", "isEditing", "isSaving", "isRowSelectionEnable", "isCloneVisible", "searchColumns", "selection", "isRowUnchecked", "onAddClick"], outputs: ["clickAction", "clickEdit", "clickEditCancel", "clickEditSave", "clickView", "clickDelete", "clickAdd", "clickRow", "changeExpandCollapse", "complexDetailClicked", "clickClone", "matExpansionPanelClicked", "CheckboxSelect"] }, { kind: "component", type: i25.DataColFilterComponent, selector: "app-data-col-filter", inputs: ["isClearFilter$", "isUpdatedFilterDesign", "columnName", "filterParam", "numberOfTableRefresh", "filterOption"], outputs: ["onFilterClicked"] }, { kind: "directive", type: i26.AuthorizedDirective, selector: "[hasPermission]", inputs: ["hasPermission", "hasPermissionElse"] }, { kind: "pipe", type: i11.AsyncPipe, name: "async" }, { kind: "pipe", type: i27.ColumnFilterPipe, name: "columnFilter" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1428
|
+
}
|
|
1429
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: DataTableComponent, decorators: [{
|
|
1430
|
+
type: Component,
|
|
1431
|
+
args: [{ selector: 'app-data-table', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
1432
|
+
{
|
|
1433
|
+
provide: DATA_TABLE_CONTEXT,
|
|
1434
|
+
useExisting: DataTableComponent,
|
|
1435
|
+
},
|
|
1436
|
+
], template: "<div>\n <section class=\"actions\">\n <section class=\"search\" *ngIf=\"gridOptions.isSearchBoxVisible && !gridOptions.isUpdatedTableDesign\">\n <form ngForm>\n <div class=\"searchbar-wrapper\">\n <i class=\"svg-icon fa-solid fa-magnifying-glass\"></i>\n <input matInput type=\"text\" placeholder=\"Search {{ searchPlaceholder }}\" name=\"search\"\n [formControl]=\"searchValue\" [disabled]=\"isSearchDisabled\"\n (ngModelChange)=\"searchModelChanged()\" />\n </div>\n </form>\n </section>\n <div class=\"toolbar\" *ngIf=\"!gridOptions.hideTopToolbar\">\n <section *ngIf=\"!isOnlyView\" class=\"adding\">\n <ul class=\"row-actions\">\n <ng-container *hasPermission=\"getActionName(actionTypes.ADD)\">\n <li *ngIf=\"!gridOptions.addButtonTemplate\">\n <span *ngIf=\"!isTableInEditState\">\n <a (click)=\"onClickAdd()\"\n [ngClass]=\"{'disabled': isDisabledMainAction(actionTypes.ADD) || (gridOptions.disableIcons && gridOptions.disableIcons.add$ |async)}\">\n <span title=\"{{getTooltipText(toolTips.ADD)}}\" class=\"toolbar-icon icon-plus\"\n [ngClass]=\"(isDisabledMainAction(actionTypes.ADD) || (gridOptions.disableIcons && gridOptions.disableIcons.add$ |async))? 'icon-inactive': 'icon-active'\"></span>\n </a>\n </span>\n </li>\n </ng-container>\n <ng-container *ngIf=\"gridOptions.addButtonTemplate\">\n <li>\n <ng-container *ngTemplateOutlet=\"gridOptions.addButtonTemplate;\"></ng-container>\n </li>\n </ng-container>\n </ul>\n <ng-container *ngIf=\"!isLoading$.getValue()\">\n <app-data-table-actions\n *ngIf=\"!(isOnlyView && !isViewActionVisible) && !gridOptions.isRowActionVisible\"\n [gridApi]=\"gridApi\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [gridOptions]=\"gridOptions\" [selectedRow]=\"selectedRow\" [isIconsDisabled]=\"isActionsDisabled\"\n [isEditing]=\"selectedRow?.isEditing\" [isSaving]=\"selectedRow?.isSaving\"\n [isOnlyView]=\"isOnlyView\" [isEditable]=\"isEditable\" (clickAdd)=\"onClickAdd()\"\n [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\" [isSaving]=\"isSaving\"\n [isCloneVisible]=\"isCloneVisible\" [isDeleteVisible]=\"!checkDeleteDisabled()\">\n </app-data-table-actions>\n </ng-container>\n </section>\n <ul class=\"row-actions\" *ngIf=\"!isOnlyView || gridOptions.isTopLeftActionsForceDisply\">\n <ng-container *ngFor=\"let action of gridOptions.topLeftAdditionalActions\">\n <li>\n <a *hasPermission=\"getLeftActionName(action.actionName)\"\n [ngClass]=\"{'disabled': action.isDisabled}\" (click)=\"ActionClickHandler(action)\"\n class=\"fontIco\">\n <app-icon *ngIf=\"!action.isClass\" [title]=\"getLeftRightActionText(action)\"\n [name]=\"action.iconOrClassName\"></app-icon>\n <span *ngIf=\"action.isClass\" title=\"{{getLeftRightActionText(action)}}\"\n class=\"toolbar-icon {{ action.iconOrClassName }}\"\n [ngClass]=\"(action.actionName===actionTypes.UPLOAD && action.isDisabled)? 'icon-inactive': ''\"></span>\n </a>\n </li>\n <li *ngIf=\"action.loading$ | async\">\n <mat-spinner class=\"mr-1 action-loader\" [diameter]=\"25\"></mat-spinner>\n </li>\n </ng-container>\n\n </ul>\n <ng-container *ngIf=\"gridOptions.leftActionBtnTemplate\">\n <ng-container *ngTemplateOutlet=\"gridOptions.leftActionBtnTemplate\"></ng-container>\n </ng-container>\n <span class=\"toolbar-spacer\"></span>\n\n <ul class=\"row-actions\">\n\n <ng-container *ngFor=\"let action of gridOptions.topRightActions\">\n <li>\n <a (click)=\"ActionClickHandler(action)\" class=\"fontIco\">\n <app-icon [title]=\"getLeftRightActionText(action)\" [name]=\"action.icon\"></app-icon>\n </a>\n </li>\n </ng-container>\n\n </ul>\n <ng-container *ngIf=\"gridOptions.isUpdatedTableDesign\">\n <ng-container *ngIf=\"gridOptions.newTableButtontemplate\">\n <ng-container *ngTemplateOutlet=\"gridOptions.newTableButtontemplate\"></ng-container>\n </ng-container>\n <section class=\"search\" *ngIf=\"gridOptions.isSearchBoxVisible\">\n <form ngForm>\n <div class=\"searchbar-wrapper\">\n <i class=\"svg-icon fa-solid fa-magnifying-glass\"></i>\n <input matInput type=\"text\" placeholder=\"Search\" name=\"search\" [formControl]=\"searchValue\"\n [disabled]=\"isSearchDisabled\" (ngModelChange)=\"searchModelChanged()\" />\n </div>\n </form>\n </section>\n <ng-container *ngIf=\"gridOptions.isFilterEnabled\">\n <button mat-stroked-button color=\"primary\" (click)=\"showHideFilterView()\">\n <em class=\"fas fa-filter inactive-filter\" [ngClass]=\"{'active-filter': isFilterApplied }\"></em>\n Filter\n </button>\n <button [title]=\"'Clear'\" (click)=\"clearGlobalFilter()\" mat-stroked-button color=\"primary\">\n <em class=\"fas fa-broom\"></em>\n </button>\n </ng-container>\n </ng-container>\n\n <ul class=\"row-actions\">\n <li *ngIf=\"!gridOptions.hideColumnConfiguration\">\n <a (click)=\"openColumnShowHideDialogue()\" class=\"fontIco\">\n <app-icon [title]=\"getTooltipText(toolTips.COLUMN_CONFIGURATION)\" [name]=\"ICONS.ColumnSelector\">\n </app-icon>\n </a>\n </li>\n </ul>\n\n </div>\n </section>\n</div>\n\n<mat-card class=\"table-card\" [ngClass]=\"{'transparent-table-design': gridOptions.isTransparentTableDesign}\">\n <app-loader *ngIf=\"isLoading$ | async\" class=\"loader-middle\"></app-loader>\n\n <mat-card-content>\n <div class=\"custom-data-table\" [ngClass]=\"{'default-table-height': isLoading$.getValue(), 'overflow-visible': gridOptions.isAccordionTable }\"\n (scroll)=\"onTableScrolled($event)\" #customDataTable [ngStyle]=\"getCustomTableStyle\">\n <table aria-describedby=\"Generic data table\" *ngIf=\"!gridOptions.isAccordionTable\"\n class=\"table apollo-design-new-data-table\" [ngClass]=\"{ '-tree': isTreeGrid }\" mdbTable>\n <thead *ngIf=\"!gridOptions.hideTableHeader\" class=\"sticky-header\">\n <tr *ngIf=\"gridOptions.isUpdatedTableDesign && isFilterView\" class=\"table-first-header\">\n <th *ngIf=\"isRowSelectionEnable\" scope=\"col\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <th *ngIf=\"viewColumn.isVisible\" scope=\"col\" class=\"header\"\n [ngClass]=\"{'transparent': !viewColumn.isMetaDataColumn && gridOptions.isUpdatedTableDesign}\">\n <app-data-col-filter *ngIf=\"isFilterEnable(viewColumn.prop)\" [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\" [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\" [isUpdatedFilterDesign]=\"true\"\n [isClearFilter$]=\"isClearFilter$\" [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n </th>\n </ng-container>\n </tr>\n <tr class=\"table-second-header\">\n <th *ngIf=\"isRowSelectionEnable && !isSingleSelect\" scope=\"col\" class=\"hasSelection\">\n <mat-checkbox class=\"table-header-checkbox\" (change)=\"$event ? masterToggle() : null\"\n [formControl]=\"masterSelection\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <th scope=\"col\" *ngIf=\"isRowSelectionEnable && isSingleSelect\" class=\"hasSelection\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns; let i = index\">\n <th *ngIf=\"viewColumn.isVisible\" scope=\"col\" class=\"header\" [attr.data-column-prop]=\"viewColumn.prop\"\n [ngClass]=\"{'transparent': !viewColumn.isMetaDataColumn && gridOptions.isUpdatedTableDesign}\">\n <div [ngClass]=\"getHeaderStyle(i, viewColumn)\">\n <app-data-col-filter\n *ngIf=\"isFilterEnable(viewColumn.prop) && !gridOptions.isUpdatedTableDesign\"\n [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\"\n [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\" [isClearFilter$]=\"isClearFilter$\"\n [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n\n <span class=\"header\" [ngClass]=\"{'sort-column': isSortColumn(viewColumn)}\"\n (click)=\"sortTable(viewColumn)\">{{ viewColumn.header }}\n <ng-container *ngIf=\"viewColumn.headerIconClass\">\n <span class=\"header-icon\" [ngClass]=\"viewColumn.headerIconClass\"></span>\n </ng-container>\n <span class=\"sort-icon\"\n *ngIf=\"sortedColumn[viewColumn.prop]=== sortDirectionEnum.DESC\">\n <em class=\"material-icons\">\n arrow_downward\n </em>\n </span>\n <span class=\"sort-icon\"\n *ngIf=\"sortedColumn[viewColumn.prop]=== sortDirectionEnum.ASC\">\n <em class=\"material-icons\">\n arrow_upward\n </em>\n </span>\n </span>\n <ng-container\n *ngIf=\"gridOptions.isUpdatedTableDesign && isFilteredColumn(viewColumn.prop)\">\n <em class=\"fas fa-filter active-filter\"></em>\n </ng-container>\n <div *ngIf=\"gridOptions.draggable\"\n [ngClass]=\"{ 'header-separator': true, 'col-resize-cursor': viewColumn.draggable }\"\n (mousedown)=\"onSeparatorMouseDown($event, i, viewColumn)\"\n (dblclick)=\"onDoubleClickSeparator(i, viewColumn)\">\n </div>\n </div>\n </th>\n </ng-container>\n <th *ngIf=\"!(isOnlyView && !isViewActionVisible) && gridOptions.isRowActionVisible\" scope=\"col\">\n Actions</th>\n <th [ngClass]=\"{'transparent': gridOptions.isUpdatedTableDesign}\"\n *ngIf=\"gridOptions.gridMenuOptions && gridOptions.gridMenuOptions.isMenuEnabled\"></th>\n </tr>\n <ng-container *ngIf=\"gridOptions.hasFixedFirstRow\">\n <tr *ngIf=\"!(isLoading$ | async)\">\n <th *ngIf=\"isRowSelectionEnable && !isSingleSelect\" class=\"transparent\"></th>\n <th *ngIf=\"isRowSelectionEnable && isSingleSelect\" class=\"transparent\"></th>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <th class=\"transparent\">\n <ng-container\n *ngTemplateOutlet=\"viewColumn.fixedFirstRowTemplate; context: { $implicit: { col: viewColumn } }\"></ng-container>\n </th>\n </ng-container>\n </tr>\n </ng-container>\n </thead>\n <tbody *ngIf=\"!isLoading$.getValue()\" app-data-table-body [gridOptions]=\"gridOptions\"\n [selection]=\"selection\"\n [rows]=\"rows | columnFilter : filterManager.getFilterParams() : columns: gridOptions.isClientSidePagination\"\n [viewColumns]=\"viewColumns\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [isOnlyView]=\"isOnlyView\" [searchedRowCount$]=\"searchedRowCount$\" [onAddClick]=\"onAddClick\"\n [isOnlyViewRow]=\"isOnlyViewRow\" [isDeleteDisabled]=\"isDeleteDisabled\" [search]=\"searchValue.value\"\n [paginationParams]=\"paginationParams\" [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\"\n [isRowSelectionEnable]=\"isRowSelectionEnable\" [searchColumns]=\"searchColumns\"\n [isCloneVisible]=\"isCloneVisible\" (clickEdit)=\"onClickEdit($event)\"\n (clickClone)=\"onClickClone($event)\" (clickAction)=\"onClickAction($event)\"\n (clickEditCancel)=\"onClickEditCancel($event)\" (clickEditSave)=\"onClickEditSave($event)\"\n (clickDelete)=\"onClickDeleteRow($event)\" (clickView)=\"onClickView($event)\"\n (clickAdd)=\"onClickRowAdd($event)\" (clickRow)=\"onClickRow($event)\"\n (changeExpandCollapse)=\"onChangeExpandCollapse($event)\"\n (complexDetailClicked)=\"ComplexDetailClicked($event)\" [isRowUnchecked]=\"isRowUnchecked\"\n (CheckboxSelect)=\"isCheckboxSelect($event)\">\n </tbody>\n\n </table>\n\n <ng-container *ngIf=\"gridOptions.isAccordionTable\">\n <mat-accordion displayMode=\"flat\" multi class=\"mat-table\" *ngIf=\"gridOptions.isAccordionTable\">\n <mat-expansion-panel *ngIf=\"!gridOptions.hideTableHeader\" class=\"mask-body header-panel\" hideToggle>\n <mat-expansion-panel-header (keydown.Enter)=\"$event.stopImmediatePropagation();\"\n [collapsedHeight]=\"'auto'\" [expandedHeight]=\"'auto'\" class=\"mat-row header-row\">\n <div class=\"mat-checkboxRow\" *ngIf=\"isRowSelectionEnable && !isSingleSelect\"\n (click)=\"$event.stopPropagation()\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [(ngModel)]=\"masterSelection\"\n [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </div>\n <ng-container *ngFor=\"let viewColumn of viewColumns\">\n <div *ngIf=\"viewColumn.isVisible\" scope=\"col\" (click)=\"$event.stopPropagation()\"\n class=\"mat-cell d-inline-block\" [ngClass]=\"viewColumn.customCssClass\">\n <app-data-col-filter class=\"filter-column\" *ngIf=\"isFilterEnable(viewColumn.prop)\"\n [columnName]=\"viewColumn\"\n [ngClass]=\"{'filteredColumn': isFilteredColumn(viewColumn.prop)}\"\n (onFilterClicked)=\"onFilterClicked($event)\"\n [filterOption]=\"viewColumn.filterOption\"\n [numberOfTableRefresh]=\"numberOfTableRefresh\"\n [filterParam]=\"getFilterParam(viewColumn)\">\n </app-data-col-filter>\n \n <span [ngClass]=\"nonFilterClassName(viewColumn.prop)\" class=\"table .header\"\n (click)=\"sortTable(viewColumn)\">{{ viewColumn.header }}\n <span class=\"sort-icon\" *ngIf=\"sortedColumn[viewColumn.prop]=='DownSorted'\">\n <em class=\"material-icons\">\n arrow_downward\n </em>\n </span>\n <span class=\"sort-icon\" *ngIf=\"sortedColumn[viewColumn.prop]=='UpSorted'\">\n <em class=\"material-icons\">\n arrow_upward\n </em>\n </span>\n </span>\n </div>\n </ng-container>\n </mat-expansion-panel-header>\n </mat-expansion-panel>\n <ng-container>\n <div *ngIf=\"!isLoading$.getValue()\" app-data-table-body [gridOptions]=\"gridOptions\"\n [selection]=\"selection\"\n [rows]=\"rows | columnFilter : filterManager.getFilterParams() : columns: gridOptions.isClientSidePagination\"\n [viewColumns]=\"viewColumns\" [canInlineEdit]=\"canInlineEdit\" [isTreeGrid]=\"isTreeGrid\"\n [isOnlyView]=\"isOnlyView\" [searchedRowCount$]=\"searchedRowCount$\"\n [isOnlyViewRow]=\"isOnlyViewRow\" [isDeleteDisabled]=\"isDeleteDisabled\"\n [search]=\"searchValue.value\" [paginationParams]=\"paginationParams\"\n [hasEmptyRow]=\"hasEmptyRow\" [isEditing]=\"isEditing\"\n [isRowSelectionEnable]=\"isRowSelectionEnable\" [searchColumns]=\"searchColumns\"\n [isCloneVisible]=\"isCloneVisible\" (clickEdit)=\"onClickEdit($event)\"\n (matExpansionPanelClicked)=\"onExpansionPanelClick($event)\"\n (clickClone)=\"onClickClone($event)\" (clickAction)=\"onClickAction($event)\"\n (clickEditCancel)=\"onClickEditCancel($event)\" (clickEditSave)=\"onClickEditSave($event)\"\n (clickDelete)=\"onClickDeleteRow($event)\" (clickView)=\"onClickView($event)\"\n (clickAdd)=\"onClickRowAdd($event)\" (clickRow)=\"onClickRow($event)\"\n (changeExpandCollapse)=\"onChangeExpandCollapse($event)\"\n (complexDetailClicked)=\"ComplexDetailClicked($event)\"\n (CheckboxSelect)=\"isCheckboxSelect($event)\"></div>\n\n </ng-container>\n </mat-accordion>\n </ng-container>\n </div>\n <section *ngIf=\"hasPagination && selection\" class=\"pagination\">\n <app-data-pagination [selectionCount]=\"selection.selected.length\" class=\"table-pagination-container\" [ngClass]=\"{'transparent-table-design': gridOptions.isTransparentTableDesign}\" [totalRowCount$]=\"this.searchedRowCount$\"\n [count]=\"count\" [page]=\"paginationParams.currentPage\" [size]=\"paginationParams.pageSize\" [hasDropdownStylePageSize]=\"gridOptions.hasDropdownStylePageSize ?? true\"\n (changePage)=\"onChangePage($event)\">\n </app-data-pagination>\n </section>\n </mat-card-content>\n</mat-card>", styles: [".show-hide{float:right}::-webkit-input-placeholder{color:#000;font-size:11px}::-moz-placeholder{color:#000;font-size:11px}:-ms-input-placeholder{color:#000;font-size:11px}::placeholder{color:#000;font-size:11px}.custom-data-table{margin:0!important;overflow-x:auto;position:relative}.table-card{padding:0}.custom-data-table .table thead th:first-child{border-top-left-radius:4px}.custom-data-table .table thead th:last-child{border-top-right-radius:4px}.custom-data-table .table thead th{padding:.5rem .8rem;text-align:left;white-space:nowrap;font-weight:400;color:#393939;font-size:.9rem;vertical-align:middle;position:relative}.hasSelection{width:20px}.search{margin:1px 0 22px}.sort-icon .material-icons{color:#2371fc;font-size:18px;position:relative;top:4px;left:10px;padding-right:14px}.table-card-hidden{visibility:hidden}.disabled{pointer-events:none!important;color:gray!important}.table-card{margin-bottom:14px;border-radius:4px;border:1px solid rgb(233,233,233);box-shadow:0 4px 16px #0000000a;opacity:1;background-color:#fff}::ng-deep .mat-checkbox-checked.mat-accent .mat-checkbox-background,.mat-checkbox-indeterminate.mat-accent .mat-checkbox-background{background-color:#0768fd}::ng-deep .filteredColumn>a:hover{color:#0768fd!important}::ng-deep .mat-checkbox-indeterminate.mat-accent .mat-checkbox-background,.mat-checkbox-checked.mat-accent .mat-checkbox-background{background-color:#0768fd}:host ::ng-deep app-data-col-filter.filteredColumn>a{color:#0768fd}:host ::ng-deep app-data-col-filter a{color:#999}.table-pagination-container{width:100%;padding:12px 16px;border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-top:1px solid rgb(233,233,233);opacity:1;background-color:#f6f7fb}.text-link-with-ico{color:#0768fd!important}.text-link-with-ico img{position:relative;top:-2px;padding-right:12px}a.text-link-with-ico{margin-right:0}.search-icon{margin-right:5px;position:absolute;top:10px;left:10px;font-size:16px;color:#bbb;z-index:1000}.fontIco{font-size:20px}.mat-checkboxRow{margin-right:6px}.filter-column{color:#ccc;margin-left:2px}.empty-row{width:auto;margin:0;font-size:15px;line-height:5rem;text-align:center}.non-filter-cell{margin-left:-8px}.row-selection-non-filter-cell{margin-left:-2px}.table-header-checkbox{margin-left:0}.toolbar .adding{display:flex;align-items:center}.sticky-header{position:sticky;top:0;z-index:100}.inactive-filter{color:#ccc!important}.active-filter,.header-icon{color:#0768fd!important}.clear-button{padding:4px 15px!important;font-weight:700}.transparent{background-color:#fff;opacity:1}.loader-middle{position:absolute;z-index:99;left:45%;margin-left:-28px;top:40%;margin-top:-28px}.default-table-height{height:300px}.no-records-found{width:auto;font-size:15px;position:absolute;top:40%;left:45%}.sort-column{cursor:pointer}.icon-inactive{filter:grayscale(1)}.header-separator{position:absolute;top:7px;right:0;height:60%;width:3px;background-color:#1c1a1a33;transition:background-color .3s ease;z-index:1}.header-separator:before{content:\"\";position:absolute;inset:0 0 0 -10px}.col-resize-cursor{cursor:col-resize}.header-separator:hover{background-color:#00000080}.drag-column{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:50px}.header-max-width{max-width:170px;overflow:hidden;text-overflow:ellipsis}.overflow-visible{overflow:visible}:host ::ng-deep .mat-expansion-panel.header-panel{overflow:visible}\n"] }]
|
|
1437
|
+
}], ctorParameters: () => [{ type: i1.DataTableService }, { type: i2.Router }, { type: i2.ActivatedRoute }, { type: i3.MatDialog }, { type: i0.ChangeDetectorRef }, { type: i4.SnackbarService }, { type: i5.UserManagementService }, { type: i6.ColumnFilterPipe }, { type: i7.SearchPipe }, { type: i8.LocalStorageService }, { type: i3.MatDialog }, { type: i9.FormService }, { type: i10.DataTableContextService }], propDecorators: { setDataTableBody: [{
|
|
1438
|
+
type: ViewChild,
|
|
1439
|
+
args: [DataTableBodyComponent, { static: false }]
|
|
1440
|
+
}], defaultRowValues: [{
|
|
1441
|
+
type: Input
|
|
1442
|
+
}], columns: [{
|
|
1443
|
+
type: Input
|
|
1444
|
+
}], getListFn: [{
|
|
1445
|
+
type: Input
|
|
1446
|
+
}], postItemFn: [{
|
|
1447
|
+
type: Input
|
|
1448
|
+
}], putItemFn: [{
|
|
1449
|
+
type: Input
|
|
1450
|
+
}], deleteItemFn: [{
|
|
1451
|
+
type: Input
|
|
1452
|
+
}], header: [{
|
|
1453
|
+
type: Input
|
|
1454
|
+
}], description: [{
|
|
1455
|
+
type: Input
|
|
1456
|
+
}], actionAddTitle: [{
|
|
1457
|
+
type: Input
|
|
1458
|
+
}], isIdColVisible: [{
|
|
1459
|
+
type: Input
|
|
1460
|
+
}], hasPagination: [{
|
|
1461
|
+
type: Input
|
|
1462
|
+
}], isOnlyView: [{
|
|
1463
|
+
type: Input
|
|
1464
|
+
}], isOnlyViewRow: [{
|
|
1465
|
+
type: Input
|
|
1466
|
+
}], isDeleteDisabled: [{
|
|
1467
|
+
type: Input
|
|
1468
|
+
}], isEditable: [{
|
|
1469
|
+
type: Input
|
|
1470
|
+
}], isCloneVisible: [{
|
|
1471
|
+
type: Input
|
|
1472
|
+
}], isLazyInitialization: [{
|
|
1473
|
+
type: Input
|
|
1474
|
+
}], objectName: [{
|
|
1475
|
+
type: Input
|
|
1476
|
+
}], gridOptions: [{
|
|
1477
|
+
type: Input
|
|
1478
|
+
}], isRowSelectionEnable: [{
|
|
1479
|
+
type: Input
|
|
1480
|
+
}], beforeSaveFn: [{
|
|
1481
|
+
type: Input
|
|
1482
|
+
}], onBeforeEdit: [{
|
|
1483
|
+
type: Input
|
|
1484
|
+
}], onAddClick: [{
|
|
1485
|
+
type: Input
|
|
1486
|
+
}], isRowUnchecked: [{
|
|
1487
|
+
type: Input
|
|
1488
|
+
}], isSaveDataLocal: [{
|
|
1489
|
+
type: Input
|
|
1490
|
+
}], scrollPosition: [{
|
|
1491
|
+
type: Input
|
|
1492
|
+
}], isTreeGrid: [{
|
|
1493
|
+
type: Input
|
|
1494
|
+
}], initialPage: [{
|
|
1495
|
+
type: Input
|
|
1496
|
+
}], changeLocalData: [{
|
|
1497
|
+
type: Output
|
|
1498
|
+
}], actionClick: [{
|
|
1499
|
+
type: Output
|
|
1500
|
+
}], onInitCompleted: [{
|
|
1501
|
+
type: Output
|
|
1502
|
+
}], onComplexDetailClicked: [{
|
|
1503
|
+
type: Output
|
|
1504
|
+
}], onEditClicked: [{
|
|
1505
|
+
type: Output
|
|
1506
|
+
}], onAddClicked: [{
|
|
1507
|
+
type: Output
|
|
1508
|
+
}], onRowClicked: [{
|
|
1509
|
+
type: Output
|
|
1510
|
+
}], onPageChanged: [{
|
|
1511
|
+
type: Output
|
|
1512
|
+
}], matExpansionPanelClicked: [{
|
|
1513
|
+
type: Output
|
|
1514
|
+
}], onUpdateCompleted: [{
|
|
1515
|
+
type: Output
|
|
1516
|
+
}], onDeleteCompleted: [{
|
|
1517
|
+
type: Output
|
|
1518
|
+
}], onScrolled: [{
|
|
1519
|
+
type: Output
|
|
1520
|
+
}], CheckboxSelect: [{
|
|
1521
|
+
type: Output
|
|
1522
|
+
}], isTableDataLoad: [{
|
|
1523
|
+
type: Output
|
|
1524
|
+
}], deleteModal: [{
|
|
1525
|
+
type: ViewChild,
|
|
1526
|
+
args: ['deleteModal', { read: TemplateRef, static: true }]
|
|
1527
|
+
}], customDataTable: [{
|
|
1528
|
+
type: ViewChild,
|
|
1529
|
+
args: ['customDataTable']
|
|
1530
|
+
}], sliderTemplate: [{
|
|
1531
|
+
type: ViewChild,
|
|
1532
|
+
args: ['sliderTemplate']
|
|
1533
|
+
}] } });
|
|
1534
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvc3JjL21vZHVsZXMvdWkta2l0L2NvbXBvbmVudHMvZGF0YS10YWJsZS9kYXRhLXRhYmxlL2RhdGEtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGliL3NyYy9tb2R1bGVzL3VpLWtpdC9jb21wb25lbnRzL2RhdGEtdGFibGUvZGF0YS10YWJsZS9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHdEQUF3RDtBQUN4RCwwREFBMEQ7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFFTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEdBRVYsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBYSxlQUFlLEVBQWdCLE1BQU0sMEJBQTBCLENBQUM7QUFJcEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDakcsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0seUdBQXlHLENBQUM7QUFJdEosT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUMvRCxPQUFPLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztB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QkFDVSxvQkFBb0I7c0JBQW5DLEtBQUs7Z0JBQ1UsWUFBWTtzQkFBM0IsS0FBSztnQkFDVSxZQUFZO3NCQUEzQixLQUFLO2dCQUNVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBQ1UsY0FBYztzQkFBN0IsS0FBSztnQkFDVSxlQUFlO3NCQUE5QixLQUFLO2dCQUNVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBR1UsVUFBVTtzQkFBekIsS0FBSztnQkFFVSxXQUFXO3NCQUExQixLQUFLO2dCQUVXLGVBQWU7c0JBQS9CLE1BQU07Z0JBQ1UsV0FBVztzQkFBM0IsTUFBTTtnQkFDVSxlQUFlO3NCQUEvQixNQUFNO2dCQUNVLHNCQUFzQjtzQkFBdEMsTUFBTTtnQkFDVSxhQUFhO3NCQUE3QixNQUFNO2dCQUNVLFlBQVk7c0JBQTVCLE1BQU07Z0JBQ1UsWUFBWTtzQkFBNUIsTUFBTTtnQkFDVSxhQUFhO3NCQUE3QixNQUFNO2dCQUNVLHdCQUF3QjtzQkFBeEMsTUFBTTtnQkFDVSxpQkFBaUI7c0JBQWpDLE1BQU07Z0JBQ1UsaUJBQWlCO3NCQUFqQyxNQUFNO2dCQUNVLFVBQVU7c0JBQTFCLE1BQU07Z0JBQ1UsY0FBYztzQkFBOUIsTUFBTTtnQkFDVSxlQUFlO3NCQUEvQixNQUFNO2dCQU9BLFdBQVc7c0JBRGpCLFNBQVM7dUJBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUd0RCxlQUFlO3NCQURyQixTQUFTO3VCQUFDLGlCQUFpQjtnQkFHckIsY0FBYztzQkFEcEIsU0FBUzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBAYW5ndWxhci1lc2xpbnQvbm8tb3V0cHV0LW9uLXByZWZpeCAqL1xuLyogZXNsaW50LWRpc2FibGUgc29ydC1jbGFzcy1tZW1iZXJzL3NvcnQtY2xhc3MtbWVtYmVycyAqL1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWwgfSBmcm9tICdAYW5ndWxhci9jZGsvY29sbGVjdGlvbnMnO1xuaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ0NvbmZpZywgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTG9jYWxTdG9yYWdlU2VydmljZSB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9jb3JlL3NlcnZpY2VzL2xvY2FsLXN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBVc2VyTWFuYWdlbWVudFNlcnZpY2UgfSBmcm9tICdpZHAtYXBwcy1zaGFyZWQtdWkvY29yZS9zZXJ2aWNlcy91c2VyLW1hbmFnZW1lbnQuc2VydmljZSc7XG5pbXBvcnQgeyBBY3Rpb25UeXBlc0VudW0gfSBmcm9tICdpZHAtYXBwcy1zaGFyZWQtdWkvZW51bXMvYWN0aW9uLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgU29ydERpcmVjdGlvbkVudW0gfSBmcm9tICdpZHAtYXBwcy1zaGFyZWQtdWkvZW51bXMvc29ydC1kaXJlY3Rpb24uZW51bSc7XG5pbXBvcnQgeyBTb3VyY2VUeXBlc0VudW0gfSBmcm9tICdpZHAtYXBwcy1zaGFyZWQtdWkvZW51bXMvc291cmNlLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgVG9vbFRpcHNQcm9wLCB0b29sdGlwc0RlZmF1bHRWYWx1ZSB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9lbnVtcy90b29sdGlwcy1wcm9wLmVudW0nO1xuaW1wb3J0IHsgQ29tbW9uQ29uZmlybU1vZGFsQ29tcG9uZW50IH0gZnJvbSAnaWRwLWFwcHMtc2hhcmVkLXVpL21vZHVsZXMvdWkta2l0L2NvbXBvbmVudHMvbW9kYWxzL2NvbW1vbi1jb25maXJtLW1vZGFsL2NvbW1vbi1jb25maXJtLW1vZGFsLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJUm93U2VsZWN0aW9uSW5mbyB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9tb2R1bGVzL3VpLWtpdC9pbnRlcmZhY2VzL3Jvdy1zZWxlY3Rpb24taW5mby5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29sdW1uRmlsdGVyUGlwZSB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9tb2R1bGVzL3VpLWtpdC9waXBlcy9jb2x1bW4tZmlsdGVyLnBpcGUnO1xuaW1wb3J0IHsgU2VhcmNoUGlwZSB9IGZyb20gJ2lkcC1hcHBzLXNoYXJlZC11aS9tb2R1bGVzL3VpLWtpdC9waXBlcy9zZWFyY2gucGlwZSc7XG5pbXBvcnQgeyBjbG9uZSwgaXNGdW5jdGlvbiwgaXNVbmRlZmluZWQsIG1lcmdlIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoL2Nsb25lRGVlcCc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbHRlciwgZmlyc3QsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IENoYW5nZVR5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9tb2R1bGVzL3VpLWtpdC9jb21wb25lbnRzL2RhdGEtdGFibGUvY29uc3RhbnRzL2NoYW5nZS10eXBlLmVudW0nO1xuaW1wb3J0IHsgRGF0YVRhYmxlQ29uc3RhbnRzIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL2RhdGEtdGFibGUuY29uc3RhbnRzJztcbmltcG9ydCB7IENvbHVtbkRpc2FibGVNb2RlcyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2NvbHVtbi1kaXNhYmxlLW1vZGUuZW51bSc7XG5pbXBvcnQgeyBDb2x1bW5UeXBlcyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2NvbHVtbi10eXBlcy5lbnVtJztcbmltcG9ydCB7IEZvcm1UeXBlcyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2Zvcm0tdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBJY29ucyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL2ljb25zLmVudW0nO1xuaW1wb3J0IHsgU25hY2tiYXJUeXBlcyB9IGZyb20gJy4uLy4uLy4uL2VudW1zL3NuYWNrYmFyLmVudW0nO1xuaW1wb3J0IHsgSUZpbHRlclBhcmFtLCBJTGlzdFJlcVBhcmFtc0FwaSwgSUxpc3RSZXNBcGkgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL2FwaS5pbnRlcmZhY2UnO1xuaW1wb3J0IHtcbiAgR3JpZE9wdGlvbnMsXG4gIElDaGVja2VkUm93RXZlbnQsXG4gIElDbGlja2VkRXZlbnREYXRhLFxuICBJRGF0YVRhYmxlQWN0aW9uLFxuICBJRGF0YVRhYmxlQ2hhbmdlTG9jYWxEYXRhRXZlbnQsXG4gIElEYXRhVGFibGVDb2x1bW4sXG4gIElEYXRhVGFibGVFeHBhbmRDb2xsYXBzZUV2ZW50LFxuICBJRGF0YVRhYmxlUm93LFxuICBJRGF0YVRhYmxlUm93RXZlbnQsXG4gIElEYXRhVGFibGVSb3dTYXZlRXZlbnQsXG4gIElSb3dEYXRhLFxuICBJVG9wUmlnaHRBY3Rpb24sXG59IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZGF0YS10YWJsZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUtleVZhbHVlLCBJUGFnaW5hdGlvblBhcmFtcyB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvZ2VuZXJpYy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTGlzdEl0ZW0gfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL2xpc3QtaXRlbS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGF0YVRhYmxlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2RhdGEtdGFibGUuc2VydmljZSc7XG5pbXBvcnQgeyBGb3JtU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Zvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBTbmFja2JhclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9zbmFja2Jhci5zZXJ2aWNlJztcbmltcG9ydCB7IERlbGV0ZUl0ZW1GbiwgR2V0TGlzdEZuLCBQb3N0SXRlbUZuLCBQdXRJdGVtRm4gfSBmcm9tICcuLi8uLi8uLi90eXBlcy9mdW5jdGlvbi50eXBlJztcbmltcG9ydCB7IERlbGV0ZU1vZGFsQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9kYWxzL2RlbGV0ZS1tb2RhbC9kZWxldGUtbW9kYWwuY29tcG9uZW50JztcbmltcG9ydCB7IEZpbHRlck1hbmFnZXIgfSBmcm9tICcuLi9hcGktY2xhc3Nlcy9maWx0ZXItbWFuYWdlcic7XG5pbXBvcnQgeyBHcmlkQXBpIH0gZnJvbSAnLi4vYXBpLWNsYXNzZXMvZ3JpZC1hcGknO1xuaW1wb3J0IHsgQ09MVU1OX0lEIH0gZnJvbSAnLi4vY29uc3RhbnRzL2NvbHVtbi1pZCc7XG5pbXBvcnQgeyBST1cgfSBmcm9tICcuLi9jb25zdGFudHMvcm93JztcbmltcG9ydCB7IERhdGFDb2xEaXNwQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0YS1jb2wtZGlzcC9kYXRhLWNvbC1kaXNwLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRhVGFibGVCb2R5Q29tcG9uZW50IH0gZnJvbSAnLi4vZGF0YS10YWJsZS1ib2R5L2RhdGEtdGFibGUtYm9keS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSURhdGFUYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uL2ludGVyZmFjZXMvZGF0YS10YWJsZS1jb21wb25lbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IERBVEFfVEFCTEVfQ09OVEVYVCwgRGF0YVRhYmxlQ29udGV4dFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9kYXRhLXRhYmxlLWNvbnRleHQuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsUG9zaXRpb24ge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxFdmVudCBleHRlbmRzIEV2ZW50IHtcbiAgaXNUcnVzdGVkOiBib29sZWFuO1xuICBjdXJyZW50U2Nyb2xsUG9zaXRpb246IFNjcm9sbFBvc2l0aW9uO1xuICBjdXJyZW50RWxlbWVudDogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1kYXRhLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGEtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBEQVRBX1RBQkxFX0NPTlRFWFQsXG4gICAgICB1c2VFeGlzdGluZzogRGF0YVRhYmxlQ29tcG9uZW50LFxuICAgIH0sXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERhdGFUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBJRGF0YVRhYmxlQ29tcG9uZW50IHtcbiAgLy8gSW5saW5lIGVkaXQgc2V0dGluZ3NcbiAgcHVibGljIGdldCBjYW5JbmxpbmVFZGl0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmNhbklubGluZUVkaXQ7XG4gIH1cblxuICBAVmlld0NoaWxkKERhdGFUYWJsZUJvZHlDb21wb25lbnQsIHsgc3RhdGljOiBmYWxzZSB9KVxuICBwdWJsaWMgc2V0IHNldERhdGFUYWJsZUJvZHkodGFibGVCb2R5OiBEYXRhVGFibGVCb2R5Q29tcG9uZW50KSB7XG4gICAgdGhpcy5kYXRhVGFibGVCb2R5ID0gdGFibGVCb2R5O1xuICB9XG5cbiAgcHVibGljIGdldCBjb2x1bW5TaG93aGlkZVN0b3JhZ2VrZXkoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5TaG93aGlkZVN0b3JhZ2VrZXk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93U2F2ZUNvbHVtblZpc2liaWxpdHlTZXR0aW5ncygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5hbGxvd1NhdmVDb2x1bW5WaXNpYmlsaXR5U2V0dGluZ3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFkZEFjdGlvblRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMuZ3JpZE9wdGlvbnMuYWN0aW9uQWRkVGl0bGV9YDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNWaWV3QWN0aW9uVmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5pc1Jvd0xldmVsVmlld0FjdGlvblZpc2libGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlYXJjaFBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZE9wdGlvbnMuc2VhcmNoYm94UGxhY2Vob2xkZXIgPyB0aGlzLmdyaWRPcHRpb25zLnNlYXJjaGJveFBsYWNlaG9sZGVyIDogdGhpcy5oZWFkZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVGFibGVJbkVkaXRTdGF0ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0VkaXRpbmcgfHwgdGhpcy5oYXNFbXB0eVJvdztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGFwaVJlcVBhcmFtcygpOiBJTGlzdFJlcVBhcmFtc0FwaSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhZ2U6IHRoaXMuY3VycmVudFBhZ2UsXG4gICAgICBpdGVtc09uUGFnZTogdGhpcy5wYWdlU2l6ZSxcbiAgICAgIGZpbHRlclBhcmFtczogdGhpcy5wb3B1bGF0ZUZpbHRlclBhcmFtcygpLFxuICAgICAgc2VhcmNoVGV4dDogdGhpcy5zZWFyY2hWYWx1ZS52YWx1ZSxcbiAgICAgIC4uLnRoaXMuZ2V0U29ydFBhcmFtcyxcbiAgICB9O1xuICB9XG5cbiAgZ2V0IGdldFNvcnRQYXJhbXMoKTogeyBzb3J0Qnk6IHN0cmluZzsgc29ydERpcmVjdGlvbjogU29ydERpcmVjdGlvbkVudW0gfSB7XG4gICAgY29uc3QgcGFybWFzID0gW107XG4gICAgT2JqZWN0LmtleXModGhpcy5zb3J0ZWRDb2x1bW4pLmZvckVhY2goKHgpID0+IHtcbiAgICAgIHBhcm1hcy5wdXNoKHsgc29ydEJ5OiB4LCBzb3J0RGlyZWN0aW9uOiB0aGlzLnNvcnRlZENvbHVtblt4XSB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gcGFybWFzLmxlbmd0aCA/IHBhcm1hc1swXSA6IHt9O1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IElDT05TOiB0eXBlb2YgSWNvbnMgPSBJY29ucztcbiAgcHVibGljIHJlYWRvbmx5IHNvcnREaXJlY3Rpb25FbnVtOiB0eXBlb2YgU29ydERpcmVjdGlvbkVudW0gPSBTb3J0RGlyZWN0aW9uRW51bTtcbiAgcHVibGljIHJlYWRvbmx5IHRvb2xUaXBzOiB0eXBlb2YgVG9vbFRpcHNQcm9wID0gVG9vbFRpcHNQcm9wO1xuICBwdWJsaWMgcmVhZG9ubHkgYWN0aW9uVHlwZXM6IHR5cGVvZiBBY3Rpb25UeXBlc0VudW0gPSBBY3Rpb25UeXBlc0VudW07XG4gIHB1YmxpYyByZWFkb25seSBERUZBVUxUX1BBR0VfU0laRTogbnVtYmVyID0gRGF0YVRhYmxlQ29uc3RhbnRzLkRFRkFVTFRfUEFHRV9TSVpFO1xuICBwdWJsaWMgcmVhZG9ubHkgREVGQVVMVF9JTklUX1BBR0U6IG51bWJlciA9IERhdGFUYWJsZUNvbnN0YW50cy5ERUZBVUxUX0lOSVRfUEFHRTtcblxuICBwdWJsaWMgcmVhZG9ubHkgY29uZmlybWF0aW9uTXNnUGFnaW5hdGlvbjogc3RyaW5nID0gYFNlbGVjdGVkIGNoZWNrYm94IHdpbGwgYmUgbG9zdCBgO1xuICBASW5wdXQoKSBwdWJsaWMgZGVmYXVsdFJvd1ZhbHVlczogSUtleVZhbHVlID0ge307XG4gIEBJbnB1dCgpIHB1YmxpYyBjb2x1bW5zOiBJRGF0YVRhYmxlQ29sdW1uW107XG4gIEBJbnB1dCgpIHB1YmxpYyBnZXRMaXN0Rm46IEdldExpc3RGbjtcbiAgQElucHV0KCkgcHVibGljIHBvc3RJdGVtRm46IFBvc3RJdGVtRm47XG4gIEBJbnB1dCgpIHB1YmxpYyBwdXRJdGVtRm46IFB1dEl0ZW1GbjtcbiAgQElucHV0KCkgcHVibGljIGRlbGV0ZUl0ZW1GbjogRGVsZXRlSXRlbUZuO1xuICBASW5wdXQoKSBwdWJsaWMgaGVhZGVyOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgcHVibGljIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyBhY3Rpb25BZGRUaXRsZTogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgaXNJZENvbFZpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIGhhc1BhZ2luYXRpb246IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgaXNPbmx5VmlldzogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgaXNPbmx5Vmlld1Jvdz86IChyb3c6IElEYXRhVGFibGVSb3cpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIHB1YmxpYyBpc0RlbGV0ZURpc2FibGVkPzogKHJvdzogSURhdGFUYWJsZVJvdykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIGlzRWRpdGFibGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgaXNDbG9uZVZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgaXNMYXp5SW5pdGlhbGl6YXRpb246IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIG9iamVjdE5hbWU6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIGdyaWRPcHRpb25zOiBHcmlkT3B0aW9ucztcbiAgQElucHV0KCkgcHVibGljIGlzUm93U2VsZWN0aW9uRW5hYmxlOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBiZWZvcmVTYXZlRm4/OiAocm93c0RhdGE6IElSb3dEYXRhW10sIHNhdmVFdmVudERhdGE6IElEYXRhVGFibGVSb3dTYXZlRXZlbnQpID0+IGJvb2xlYW47XG4gIEBJbnB1dCgpIHB1YmxpYyBvbkJlZm9yZUVkaXQ/OiAocm93c0RhdGE6IElSb3dEYXRhW10sIHNhdmVFdmVudERhdGE6IElEYXRhVGFibGVSb3dFdmVudCkgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIG9uQWRkQ2xpY2s/OiAocm93c0RhdGE6IElSb3dEYXRhW10sIHNhdmVFdmVudERhdGE6IElEYXRhVGFibGVSb3dFdmVudCkgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIGlzUm93VW5jaGVja2VkPzogKHJvdzogSURhdGFUYWJsZVJvdykgPT4gYm9vbGVhbjtcbiAgQElucHV0KCkgcHVibGljIGlzU2F2ZURhdGFMb2NhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgc2Nyb2xsUG9zaXRpb246IFNjcm9sbFBvc2l0aW9uO1xuXG4gIC8vIFRyZWUgZ3JpZCBzZXR0aW5nc1xuICBASW5wdXQoKSBwdWJsaWMgaXNUcmVlR3JpZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBpbml0aWFsUGFnZTogbnVtYmVyO1xuXG4gIEBPdXRwdXQoKSBwdWJsaWMgY2hhbmdlTG9jYWxEYXRhOiBFdmVudEVtaXR0ZXI8SURhdGFUYWJsZUNoYW5nZUxvY2FsRGF0YUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBhY3Rpb25DbGljazogRXZlbnRFbWl0dGVyPElEYXRhVGFibGVBY3Rpb24+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9uSW5pdENvbXBsZXRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25Db21wbGV4RGV0YWlsQ2xpY2tlZDogRXZlbnRFbWl0dGVyPElDbGlja2VkRXZlbnREYXRhPiA9IG5ldyBFdmVudEVtaXR0ZXI8SUNsaWNrZWRFdmVudERhdGE+KCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25FZGl0Q2xpY2tlZDogRXZlbnRFbWl0dGVyPElEYXRhVGFibGVSb3dFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPElEYXRhVGFibGVSb3dFdmVudD4oKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBvbkFkZENsaWNrZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9uUm93Q2xpY2tlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25QYWdlQ2hhbmdlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgbWF0RXhwYW5zaW9uUGFuZWxDbGlja2VkOiBFdmVudEVtaXR0ZXI8SURhdGFUYWJsZVJvd0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dCgpIHB1YmxpYyBvblVwZGF0ZUNvbXBsZXRlZDogRXZlbnRFbWl0dGVyPElEYXRhVGFibGVSb3dFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBwdWJsaWMgb25EZWxldGVDb21wbGV0ZWQ6IEV2ZW50RW1pdHRlcjxJRGF0YVRhYmxlUm93RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIG9uU2Nyb2xsZWQ6IEV2ZW50RW1pdHRlcjxTY3JvbGxFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPFNjcm9sbEV2ZW50PigpO1xuICBAT3V0cHV0KCkgcHVibGljIENoZWNrYm94U2VsZWN0OiBFdmVudEVtaXR0ZXI8SVJvd1NlbGVjdGlvbkluZm8+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgcHVibGljIGlzVGFibGVEYXRhTG9hZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgcHVibGljIHNlYXJjaFZhbHVlOiBGb3JtQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpO1xuICBwdWJsaWMgc2VhcmNoQ29sdW1uczogSURhdGFUYWJsZUNvbHVtbltdO1xuICBwdWJsaWMgaXNTZWFyY2hEaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgc2VsZWN0ZWRSb3c6IElEYXRhVGFibGVSb3c7XG4gIHB1YmxpYyBmaWx0ZXJlZFJvd3M6IElEYXRhVGFibGVSb3dbXTtcbiAgQFZpZXdDaGlsZCgnZGVsZXRlTW9kYWwnLCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSlcbiAgcHVibGljIGRlbGV0ZU1vZGFsOiBUZW1wbGF0ZVJlZjxEZWxldGVNb2RhbENvbXBvbmVudD47XG4gIEBWaWV3Q2hpbGQoJ2N1c3RvbURhdGFUYWJsZScpXG4gIHB1YmxpYyBjdXN0b21EYXRhVGFibGU6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBAVmlld0NoaWxkKCdzbGlkZXJUZW1wbGF0ZScpXG4gIHB1YmxpYyBzbGlkZXJUZW1wbGF0ZTogVmlld0NvbnRhaW5lclJlZjtcbiAgcHVibGljIHJlYWRvbmx5IHNvdXJjZVR5cGVzOiB0eXBlb2YgU291cmNlVHlwZXNFbnVtID0gU291cmNlVHlwZXNFbnVtO1xuICBwdWJsaWMgZGF0YVRhYmxlQm9keTogRGF0YVRhYmxlQm9keUNvbXBvbmVudDtcbiAgcHVibGljIGdyaWRBcGk6IEdyaWRBcGk7XG4gIHB1YmxpYyBtYXN0ZXJTZWxlY3Rpb246IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKGZhbHNlKTtcbiAgcHVibGljIHBhZ2luYXRpb25QYXJhbXM6IElQYWdpbmF0aW9uUGFyYW1zID0ge1xuICAgIGN1cnJlbnRQYWdlOiB0aGlzLkRFRkFVTFRfSU5JVF9QQUdFLFxuICAgIHBhZ2VTaXplOiB0aGlzLkRFRkFVTFRfUEFHRV9TSVpFLFxuICB9O1xuICBwdWJsaWMgc2VhcmNoZWRSb3dDb3VudCQgPSBuZXcgU3ViamVjdDxudW1iZXI+KCk7XG4gIHB1YmxpYyBpc0NsZWFyRmlsdGVyJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gIHB1YmxpYyBpc0ZpbHRlclZpZXcgPSBmYWxzZTtcbiAgcHVibGljIHZpZXdDb2x1bW5zOiBJRGF0YVRhYmxlQ29sdW1uW107XG4gIHB1YmxpYyByb3dzOiBJRGF0YVRhYmxlUm93W107XG4gIHB1YmxpYyBleGNsdWRlZFJvd3M6IElEYXRhVGFibGVSb3dbXSA9IFtdO1xuICBwdWJsaWMgc29ydGVkQ29sdW1uID0ge307XG4gIHB1YmxpYyBjb3VudDogbnVtYmVyID0gMDtcblxuICBwdWJsaWMgZmlsdGVyTWFuYWdlcjogRmlsdGVyTWFuYWdlcjtcblxuICBwdWJsaWMgaXNMb2FkaW5nJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyBoYXNFbXB0eVJvdzogYm9vbGVhbiA9IGZhbHNlO1xuICBwdWJsaWMgaXNFZGl0aW5nID0gZmFsc2U7XG4gIHB1YmxpYyBpc1NhdmluZyA9IGZhbHNlO1xuXG4gIHB1YmxpYyByb3dUb0RlbGV0ZTogSURhdGFUYWJsZVJvdztcbiAgcHVibGljIHNlbGVjdGlvbjogU2VsZWN0aW9uTW9kZWw8SURhdGFUYWJsZVJvdz47XG5cbiAgcHVibGljIG1hcCA9IG5ldyBNYXAoKTtcblxuICBwdWJsaWMgbnVtYmVyT2ZUYWJsZVJlZnJlc2ggPSAwO1xuICBwcml2YXRlIGRlZmF1bHRTb3J0ZWRDb2x1bW5zOiBJRGF0YVRhYmxlQ29sdW1uW107XG4gIHByaXZhdGUgb3JpZ2luYWxVbnNvcnRlZFJvd3M6IElEYXRhVGFibGVSb3dbXTtcbiAgcHJpdmF0ZSBjbGVhclN1YnMkID0gbmV3IFN1YmplY3QoKTtcbiAgcHJpdmF0ZSBzdG9yYWdlS2V5OiBzdHJpbmc7XG4gIHByaXZhdGUgdG90YWxJdGVtczogbnVtYmVyID0gMDtcblxuICBwcml2YXRlIHN0YXJ0WDogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBzdGFydFdpZHRoOiBudW1iZXIgPSAwO1xuICBwcml2YXRlIHJlc2l6aW5nVGg6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYXBvbGxvRGF0YVRhYmxlOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlc2l6aW5nVGQ6IE5vZGVMaXN0IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY2xpY2tUaW1lb3V0OiBhbnk7XG5cbiAgcHJpdmF0ZSBkZWZhdWx0R3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zID0ge1xuICAgIGFkZElkQ29sdW1uOiB0cnVlLFxuICAgIGFjdGlvbkFkZFRpdGxlOiAnJyxcbiAgICBhbGxvd1NhdmVDb2x1bW5WaXNpYmlsaXR5U2V0dGluZ3M6IGZhbHNlLFxuICAgIGlzUm93TGV2ZWxWaWV3QWN0aW9uVmlzaWJsZTogdHJ1ZSxcbiAgICBpc09ubHlWaWV3OiBmYWxzZSxcbiAgICBpc1Jvd1NlbGVjdGlvbkVuYWJsZTogZmFsc2UsXG4gICAgaWRQcm9wZXJ0eTogQ09MVU1OX0lELlBST1AsXG4gICAgaXNDbGllbnRTaWRlUGFnaW5hdGlvbjogdHJ1ZSxcbiAgICBjYW5JbmxpbmVBZGQ6IHRydWUsXG4gICAgY2FuSW5saW5lRWRpdDogdHJ1ZSxcbiAgICBpc1NhdmVEYXRhTG9jYWw6IGZhbHNlLFxuICAgIGlzU2VhcmNoQm94VmlzaWJsZTogdHJ1ZSxcbiAgICBpc0ZpbHRlckVuYWJsZWQ6IGZhbHNlLFxuICAgIGZpbHRlcmFibGVDb2x1bW5zOiBbXSxcbiAgICBkZWZhdWx0U29ydFByb3BlcnR5OiB7fSxcbiAgICBjbG9uZU9wdGlvbnM6IHtcbiAgICAgIGNvcHlPZkNsb25hYmxlUHJvcGVydGllczogW10sXG4gICAgICBlbXB0eVZhbHVlUHJvcGVydGllczogW10sXG4gICAgfSxcbiAgICBzZWFyY2hhYmxlUHJvcGVydGllczogW10sXG4gICAgc29ydGFibGVQcm9wZXJ0aWVzOiBbXSxcbiAgICBpc1Jvd0FjdGlvblZpc2libGU6IHRydWUsXG4gICAgdG9wUmlnaHRBY3Rpb25zOiBbXSxcbiAgICBkZWxldGVPcHRpb25zOiB7fSxcbiAgICBzZWFyY2hib3hQbGFjZWhvbGRlcjogdGhpcy5oZWFkZXIsXG4gICAgcmVmcmVzaE9uQWRkOiB0cnVlLFxuICAgIHRvcExlZnRBZGRpdGlvbmFsQWN0aW9uczogW10sXG4gICAgaXNTb3J0RW5hYmxlZDogZmFsc2UsXG4gICAgZGlzYWJsZUljb25zOiB7XG4gICAgICBhZGQ6IGZhbHNlLFxuICAgICAgZWRpdDogZmFsc2UsXG4gICAgICBkZWxldGU6IGZhbHNlLFxuICAgICAgY2xvbmU6IGZhbHNlLFxuICAgICAgYWRkJDogbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSksXG4gICAgICBlZGl0JDogbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSksXG4gICAgICBkZWxldGUkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgIGNvcHkkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICB9LFxuICAgIGdyaWRNZW51T3B0aW9uczoge1xuICAgICAgaXNNZW51RW5hYmxlZDogZmFsc2UsXG4gICAgICBtZW51SXRlbXM6IFtdLFxuICAgIH0sXG4gICAgYWN0aW9uTG9hZGluZyQ6IHtcbiAgICAgIGNvcHkkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgIGVkaXQkOiBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKSxcbiAgICAgIGRlbGV0ZSQ6IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpLFxuICAgIH0sXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRhdGFUYWJsZVNlcnZpY2U6IERhdGFUYWJsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIG1hdERpYWxvZzogTWF0RGlhbG9nLFxuICAgIHB1YmxpYyBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJpdmF0ZSBzbmFja2JhclNlcnZpY2U6IFNuYWNrYmFyU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJNYW5hZ2VtZW50U2VydmljZTogVXNlck1hbmFnZW1lbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmlsdGVyUGlwZTogQ29sdW1uRmlsdGVyUGlwZSxcbiAgICBwcml2YXRlIHNlYXJjaFBpcGU6IFNlYXJjaFBpcGUsXG4gICAgcHJpdmF0ZSBsb2NhbFN0b3JhZ2VTZXJ2aWNlOiBMb2NhbFN0b3JhZ2VTZXJ2aWNlLFxuICAgIHB1YmxpYyBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwdWJsaWMgZm9ybVNlcnZpY2U6IEZvcm1TZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0YVRhYmxlQ29udGV4dDogRGF0YVRhYmxlQ29udGV4dFNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy5maWx0ZXJNYW5hZ2VyID0gbmV3IEZpbHRlck1hbmFnZXIoKTtcbiAgICB0aGlzLmdyaWRBcGkgPSBuZXcgR3JpZEFwaSh0aGlzLCB0aGlzLmZvcm1TZXJ2aWNlKTtcbiAgICB0aGlzLmRhdGFUYWJsZUNvbnRleHQuc2V0RGF0YVRhYmxlQ29tcG9uZW50KHRoaXMpO1xuICB9XG5cbiAgcHVibGljIGdldCBnZXRTZWxlY3RlZFJvd3MoKTogSURhdGFUYWJsZVJvd1tdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJlZERhdGFSb3codGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBnZXRBbGxDaGVja2VkUm93cygpOiBJRGF0YVRhYmxlUm93W10ge1xuICAgIHJldHVybiB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBY3Rpb25zRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZmlsdGVyZWRSb3dzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZ2V0Um93cygpOiBJRGF0YVRhYmxlUm93W10ge1xuICAgIHJldHVybiB0aGlzLmdldEZpbHRlcmVkRGF0YVJvdyh0aGlzLnJvd3MpO1xuICB9XG5cbiAgcHVibGljIGdldCBnZXRDdXN0b21UYWJsZVN0eWxlKCk6IElLZXlWYWx1ZSB7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuaXNJbm5lclNjcm9sbCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ3JpZE9wdGlvbnMuY3VzdG9tVGFibGVTdHlsZSA/IHRoaXMuZ3JpZE9wdGlvbnMuY3VzdG9tVGFibGVTdHlsZSA6IHsgaGVpZ2h0OiAnMzB2aCcgfTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcHVibGljIG9uVGFibGVTY3JvbGxlZChlOiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gdGhpcy5jdXN0b21EYXRhVGFibGUubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCBldmVudDogU2Nyb2xsRXZlbnQgPSB7XG4gICAgICAuLi5lLFxuICAgICAgY3VycmVudEVsZW1lbnQ6IHRoaXMuY3VzdG9tRGF0YVRhYmxlLFxuICAgICAgY3VycmVudFNjcm9sbFBvc2l0aW9uOiB7IHg6IGh0bWxFbGVtZW50LnNjcm9sbExlZnQsIHk6IGh0bWxFbGVtZW50LnNjcm9sbFRvcCB9LFxuICAgIH07XG4gICAgdGhpcy5vblNjcm9sbGVkLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVNjcm9sbFBvc2l0aW9uKHBvc2l0aW9uOiBTY3JvbGxQb3NpdGlvbik6IHZvaWQge1xuICAgIGNvbnN0IGh0bWxFbGVtZW50ID0gdGhpcy5jdXN0b21EYXRhVGFibGUubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICBodG1sRWxlbWVudC5zY3JvbGwocG9zaXRpb24ueCwgcG9zaXRpb24ueSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzTGF6eUluaXRpYWxpemF0aW9uKSB7XG4gICAgICB0aGlzLmluaXQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQodHJ1ZSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLnNlYXJjaFRhYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGlzRGlzYWJsZWRNYWluQWN0aW9uKGFjdGlvblByb3A6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmRpc2FibGVJY29ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmRpc2FibGVJY29uc1thY3Rpb25Qcm9wXTtcbiAgfVxuXG4gIHB1YmxpYyBub25GaWx0ZXJDbGFzc05hbWUoY29sdW1uUHJvcDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaXNGaWx0ZXJFbmFibGUoY29sdW1uUHJvcCkgJiYgdGhpcy5pc1Jvd1NlbGVjdGlvbkVuYWJsZSkge1xuICAgICAgcmV0dXJuICdyb3ctc2VsZWN0aW9uLW5vbi1maWx0ZXItY2VsbCc7XG4gICAgfVxuICAgIGlmICghdGhpcy5pc0ZpbHRlckVuYWJsZShjb2x1bW5Qcm9wKSkge1xuICAgICAgcmV0dXJuICdub24tZmlsdGVyLWNlbGwnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICBwdWJsaWMgaXNGaWx0ZXJFbmFibGUoY29sdW1uUHJvcDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNUYWJsZUluRWRpdFN0YXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmlzRmlsdGVyRW5hYmxlZCAmJiAoIXRoaXMuZ3JpZE9wdGlvbnMuZmlsdGVyYWJsZUNvbHVtbnMubGVuZ3RoIHx8IHRoaXMuaXNGaWx0ZXJhYmxlQ29sdW1uKGNvbHVtblByb3ApKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0ZpbHRlcmFibGVDb2x1bW4oY29sdW1uUHJvcDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZE9wdGlvbnMuZmlsdGVyYWJsZUNvbHVtbnMuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtID09PSBjb2x1bW5Qcm9wKSAhPT0gLTE7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRmlsdGVyQXBwbGllZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5maWx0ZXJNYW5hZ2VyLmdldEZpbHRlclBhcmFtcygpLmxlbmd0aCA+IDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5vbkRpc2FibGVkUm93cygpOiBJRGF0YVRhYmxlUm93W10ge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnJvd0Rpc2FibGVGbiAmJiBpc0Z1bmN0aW9uKHRoaXMuZ3JpZE9wdGlvbnMucm93RGlzYWJsZUZuKSkge1xuICAgICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIoKHJvdykgPT4gIXRoaXMuZ3JpZE9wdGlvbnMucm93RGlzYWJsZUZuKHJvdykpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnJvd3M7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZmlyZUluaXRDb21wbGV0ZWQoKTtcbiAgICBpZiAodGhpcy5zY3JvbGxQb3NpdGlvbikge1xuICAgICAgY29uc3QgaHRtbEVsZW1lbnQgPSB0aGlzLmN1c3RvbURhdGFUYWJsZS5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgICAgaHRtbEVsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxQb3NpdGlvbi55O1xuICAgICAgaHRtbEVsZW1lbnQuc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsUG9zaXRpb24ueDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgY2hlY2tEZWxldGVEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoaXNGdW5jdGlvbih0aGlzLmlzRGVsZXRlRGlzYWJsZWQpICYmICFpc1VuZGVmaW5lZCh0aGlzLnNlbGVjdGVkUm93KSkge1xuICAgICAgcmV0dXJuIHRoaXMuaXNEZWxldGVEaXNhYmxlZCh0aGlzLnNlbGVjdGVkUm93KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNEZWxldGVEaXNhYmxlZCAmJiB0eXBlb2YgdGhpcy5pc0RlbGV0ZURpc2FibGVkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMubm9uRGlzYWJsZWRSb3dzLmxlbmd0aCA9PT0gdGhpcy5zZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gKHRoaXMubWFzdGVyU2VsZWN0aW9uLnZhbHVlICYmIHRoaXMuZXhjbHVkZWRSb3dzLmxlbmd0aCA9PT0gMCkgfHwgdGhpcy50b3RhbEl0ZW1zID09PSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5sZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgaXNTb3J0Q29sdW1uKHZpZXdDb2x1bW46IElEYXRhVGFibGVDb2x1bW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gISEodGhpcy5ncmlkT3B0aW9ucy5zb3J0YWJsZVByb3BlcnRpZXMgJiYgdGhpcy5ncmlkT3B0aW9ucy5zb3J0YWJsZVByb3BlcnRpZXMuZmluZCgoeCkgPT4geCA9PT0gdmlld0NvbHVtbi5wcm9wKSk7XG4gIH1cblxuICBwdWJsaWMgb3BlbkNvbHVtblNob3dIaWRlRGlhbG9ndWUoKTogdm9pZCB7XG4gICAgbGV0IGRpYWxvZ0NvbmZpZyA9IG5ldyBNYXREaWFsb2dDb25maWcoKTtcbiAgICBkaWFsb2dDb25maWcgPSB0aGlzLmNvbmZpZ3VyZURpYWxvZyhkaWFsb2dDb25maWcpO1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRGF0YUNvbERpc3BDb21wb25lbnQsIGRpYWxvZ0NvbmZpZyk7XG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LnN0YXR1cyA9PT0gJ09LJykge1xuICAgICAgICB0aGlzLnZpZXdDb2x1bW5zID0gcmVzdWx0LmNvbHVtbnM7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1hc3RlclRvZ2dsZSgpOiB2b2lkIHtcbiAgICB0aGlzLmV4Y2x1ZGVkUm93cyA9IFtdO1xuICAgIGlmICghdGhpcy5tYXN0ZXJTZWxlY3Rpb24ucHJpc3RpbmUgJiYgIXRoaXMubWFzdGVyU2VsZWN0aW9uLnZhbHVlKSB7XG4gICAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB0aGlzLmdyaWRBcGkuZGV0ZWN0Um93Q2hhbmdlcygpO1xuICAgICAgdGhpcy5tYXN0ZXJTZWxlY3Rpb24ucmVzZXQoKTtcbiAgICAgIHRoaXMuQ2hlY2tib3hTZWxlY3QuZW1pdCh7IHJvd3M6IFtdLCBncmlkQXBpOiB0aGlzLmdldEdyaWRBcGkoKSwgY2hlY2tlZDogZmFsc2UgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKSB7XG4gICAgICB0aGlzLmNoZWNrZWRBbGxFeGNlcHRFeGNsdWRlZFJvd3MoKTtcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgdGhpcy5ncmlkQXBpLmRldGVjdFJvd0NoYW5nZXMoKTtcbiAgICAgIHRoaXMuQ2hlY2tib3hTZWxlY3QuZW1pdCh7IHJvd3M6IFtdLCBncmlkQXBpOiB0aGlzLmdldEdyaWRBcGkoKSwgY2hlY2tlZDogdHJ1ZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXN0ZXJUb2dnbGVDbGllbnRTaWRlKCk7XG4gICAgICB0aGlzLkNoZWNrYm94U2VsZWN0LmVtaXQoeyByb3dzOiB0aGlzLnJvd3MsIGdyaWRBcGk6IHRoaXMuZ2V0R3JpZEFwaSgpLCBjaGVja2VkOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpc0NoZWNrYm94U2VsZWN0KHJvdzogSURhdGFUYWJsZVJvdyk6IHZvaWQge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdyk7XG4gICAgaWYgKHRoaXMubWFzdGVyU2VsZWN0aW9uLnZhbHVlICYmICFpc1NlbGVjdGVkKSB7XG4gICAgICB0aGlzLmV4Y2x1ZGVkUm93cy5wdXNoKHJvdyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm1hc3RlclNlbGVjdGlvbi52YWx1ZSAmJiBpc1NlbGVjdGVkKSB7XG4gICAgICBjb25zdCBmaW5kSW5kZXggPSB0aGlzLmV4Y2x1ZGVkUm93cy5maW5kSW5kZXgoKHgpID0+IEpTT04uc3RyaW5naWZ5KHgpID09PSBKU09OLnN0cmluZ2lmeShyb3cpKTtcbiAgICAgIGlmIChmaW5kSW5kZXggPiAtMSkge1xuICAgICAgICB0aGlzLmV4Y2x1ZGVkUm93cy5zcGxpY2UoZmluZEluZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5DaGVja2JveFNlbGVjdC5lbWl0KHsgcm93czogW3Jvd10sIGdyaWRBcGk6IHRoaXMuZ2V0R3JpZEFwaSgpLCBjaGVja2VkOiBpc1NlbGVjdGVkIH0pO1xuXG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMucm93cy5mb3JFYWNoKChyb3cpID0+IChyb3cuaXNTZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgfVxuICAgIGNvbnN0IGNoZWNrZWRSb3dzID0gdGhpcy5ncmlkQXBpLmdldEFsbENoZWNrZWRSb3dzKCk7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkUm93ICYmIGNoZWNrZWRSb3dzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cgPSBjaGVja2VkUm93c1tjaGVja2VkUm93cy5sZW5ndGggLSAxXTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaCgpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGEoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrQWN0aW9uKGFjdGlvbjogSURhdGFUYWJsZUFjdGlvbik6IHZvaWQge1xuICAgIHRoaXMuYWN0aW9uQ2xpY2suZW1pdChhY3Rpb24pO1xuICB9XG5cbiAgcHVibGljIG9uQ2xpY2tBZGQoKTogdm9pZCB7XG4gICAgdGhpcy5vbkFkZENsaWNrZWQuZW1pdCgpO1xuICAgIGlmIChpc0Z1bmN0aW9uKHRoaXMub25BZGRDbGljaykgJiYgIXRoaXMub25BZGRDbGljayh1bmRlZmluZWQsIHVuZGVmaW5lZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRBY3Rpb25IYW5kbGVyKCk7XG4gIH1cblxuICBwdWJsaWMgYWRkQWN0aW9uSGFuZGxlcigpOiB2b2lkIHtcbiAgICB0aGlzLnNldElkQ29sdW1uKCk7XG4gICAgdGhpcy5zZXRQYWdpbmF0aW9uRGF0YSh7IGN1cnJlbnRQYWdlOiB0aGlzLkRFRkFVTFRfSU5JVF9QQUdFLCBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSB9KTtcbiAgICB0aGlzLmlzU2VhcmNoRGlzYWJsZWQgPSB0cnVlO1xuICAgIHRoaXMuc2VhcmNoVmFsdWUuc2V0VmFsdWUoRGF0YVRhYmxlQ29uc3RhbnRzLkVNUFRZKTtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5jYW5JbmxpbmVBZGQpIHtcbiAgICAgIGlmICghdGhpcy5oYXNFbXB0eVJvdykge1xuICAgICAgICB0aGlzLmFkZEVtcHR5Um93KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmF2aWdhdGVQYWdlKEZvcm1UeXBlcy5BZGQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrUm93KGV2ZW50RGF0YTogSURhdGFUYWJsZVJvd0V2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgY2hlY2tlZFJvd3MgPSB0aGlzLmdyaWRBcGkuZ2V0QWxsQ2hlY2tlZFJvd3MoKTtcbiAgICBpZiAoY2hlY2tlZFJvd3M/Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNEZWZhdWx0Rmlyc3RSb3dTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnJvd3MuZm9yRWFjaCgoeCkgPT4gKHguaXNTZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNlbGVjdGVkUm93KSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93LmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3RlZFJvdyA9IGV2ZW50RGF0YS5yb3c7XG4gICAgZXZlbnREYXRhLnJvdy5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICBjb25zdCBlbWl0SW5kZXggPSB0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb25cbiAgICAgID8gZXZlbnREYXRhLnJvdy5yb3dJbmRleCArIHRoaXMucGFnZVNpemUgKiAodGhpcy5jdXJyZW50UGFnZSAtIDEpXG4gICAgICA6IGV2ZW50RGF0YS5yb3cucm93SW5kZXg7XG5cbiAgICB0aGlzLnNlbGVjdGVkUm93LnJvd0luZGV4ID0gZW1pdEluZGV4O1xuICAgIHRoaXMub25Sb3dDbGlja2VkLmVtaXQoZXZlbnREYXRhLnJvdyk7XG4gIH1cblxuICBwdWJsaWMgb25DbGlja1Jvd0FkZChldmVudERhdGE6IElEYXRhVGFibGVSb3dFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmNhbklubGluZUFkZCAmJiAhdGhpcy5oYXNFbXB0eVJvdykge1xuICAgICAgdGhpcy5hZGRFbXB0eVJvdyhldmVudERhdGEucm93LmRlcHRoICsgMSwgdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd0lkKGV2ZW50RGF0YS5yb3cpKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25DbGlja0VkaXQoZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoaXNGdW5jdGlvbih0aGlzLm9uQmVmb3JlRWRpdCkgJiYgIXRoaXMub25CZWZvcmVFZGl0KHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dzRGF0YUZyb21Sb3dzKHRoaXMucm93cyksIGV2ZW50RGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uRWRpdENsaWNrZWQuZW1pdChldmVudERhdGEpO1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmNhbklubGluZUVkaXQpIHtcbiAgICAgIGlmICghdGhpcy5pc0VkaXRpbmcpIHtcbiAgICAgICAgdGhpcy50b2dnbGVSb3dFZGl0aW5nKGV2ZW50RGF0YS5yb3csIHRydWUpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hdmlnYXRlVG9JdGVtKEZvcm1UeXBlcy5FZGl0LCB0aGlzLmRhdGFUYWJsZVNlcnZpY2UuZ2V0Um93SWQoZXZlbnREYXRhLnJvdykpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrQ2xvbmUoZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5jYW5JbmxpbmVBZGQgJiYgIXRoaXMuaGFzRW1wdHlSb3cpIHtcbiAgICAgIGNvbnN0IG5ld0V2ZW50RGF0YSA9IGNsb25lRGVlcChldmVudERhdGEpO1xuICAgICAgdGhpcy5hZGRDbG9uZVJvdyhuZXdFdmVudERhdGEucm93KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25DbGlja1ZpZXcoZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm5hdmlnYXRlVG9JdGVtKEZvcm1UeXBlcy5WaWV3LCB0aGlzLmdldE5hdmlnYXRlSXRlbVZhbHVlKGV2ZW50RGF0YSkpO1xuICB9XG5cbiAgcHVibGljIENvbXBsZXhEZXRhaWxDbGlja2VkKGV2ZW50RGF0YTogSUNsaWNrZWRFdmVudERhdGEpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ29tcGxleERldGFpbENsaWNrZWQuZW1pdChldmVudERhdGEpO1xuICB9XG5cbiAgcHVibGljIEFjdGlvbkNsaWNrSGFuZGxlcihhY3Rpb246IElUb3BSaWdodEFjdGlvbik6IHZvaWQge1xuICAgIGlmIChhY3Rpb24uY2xpY2tlZCkge1xuICAgICAgYWN0aW9uLmNsaWNrZWQodGhpcy5zZWxlY3RlZFJvdyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNob3dIaWRlRmlsdGVyVmlldygpOiB2b2lkIHtcbiAgICB0aGlzLmlzRmlsdGVyVmlldyA9ICF0aGlzLmlzRmlsdGVyVmlldztcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckdsb2JhbEZpbHRlcigpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ2xlYXJGaWx0ZXIkLm5leHQodHJ1ZSk7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZS5zZXRWYWx1ZSgnJyk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5maWx0ZXJNYW5hZ2VyLmNsZWFyRmlsdGVyUGFyYW1zKCk7XG4gICAgdGhpcy5zZXREYXRhKCk7XG4gIH1cblxuICBwdWJsaWMgb25DaGFuZ2VQYWdlKHBhZ2luYXRpb25QYXJhbXM6IElQYWdpbmF0aW9uUGFyYW1zLCBzZWxlY3RhYmxlSW5kZXg/OiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNldFBhZ2luYXRpb25EYXRhKHBhZ2luYXRpb25QYXJhbXMpO1xuICAgIGlmICghdGhpcy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuc2V0RGF0YShzZWxlY3RhYmxlSW5kZXgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0RlZmF1bHRGaXJzdFJvd1NlbGVjdGVkKCkgJiYgdGhpcy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKCkpIHtcbiAgICAgIGlmIChzZWxlY3RhYmxlSW5kZXgpIHtcbiAgICAgICAgdGhpcy5lbWl0TmV4dFJvdyh0aGlzLnBhZ2VTaXplICogKHRoaXMuY3VycmVudFBhZ2UgLSAxKSArIHRoaXMuZ2V0U2VsZWN0YWJsZVZhbGlkSW5kZXgoc2VsZWN0YWJsZUluZGV4KSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVtaXROZXh0Um93KHRoaXMucGFnZVNpemUgKiAodGhpcy5jdXJyZW50UGFnZSAtIDEpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vblBhZ2VDaGFuZ2VkLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkV4cGFuc2lvblBhbmVsQ2xpY2soZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm1hdEV4cGFuc2lvblBhbmVsQ2xpY2tlZC5lbWl0KGV2ZW50RGF0YSk7XG4gIH1cblxuICBwdWJsaWMgb25DaGFuZ2VQYWdlU2l6ZShwYWdlU2l6ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXRQYWdpbmF0aW9uRGF0YU9uU2l6ZUNoYW5nZWQocGFnZVNpemUpO1xuICAgIGlmICghdGhpcy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uKCkpIHtcbiAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJQYXJhbShjb2x1bW46IElEYXRhVGFibGVDb2x1bW4pOiBJRmlsdGVyUGFyYW0ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW0oY29sdW1uKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0ZpbHRlcmVkQ29sdW1uKGNvbHVtblByb3A6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW1zKCkuZmluZEluZGV4KChpdGVtKSA9PiBpdGVtLmZpbHRlckNvbHVtbi5wcm9wID09PSBjb2x1bW5Qcm9wKSAhPT0gLTE7XG4gIH1cblxuICBwdWJsaWMgb25GaWx0ZXJDbGlja2VkKGZpbHRlclBhcmFtOiBJRmlsdGVyUGFyYW0pOiB2b2lkIHtcbiAgICB0aGlzLmZpbHRlck1hbmFnZXIuc2V0RmlsdGVyUGFyYW1zKGZpbHRlclBhcmFtKTtcbiAgICB0aGlzLmZpbHRlcmVkUm93cyA9IHRoaXMuZmlsdGVyUGlwZS50cmFuc2Zvcm0oXG4gICAgICB0aGlzLnJvd3MsXG4gICAgICB0aGlzLmZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW1zKCksXG4gICAgICB0aGlzLmNvbHVtbnMsXG4gICAgICB0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb25cbiAgICApO1xuICAgIHRoaXMuc2V0UGFnaW5hdGlvbkRhdGEoeyBjdXJyZW50UGFnZTogdGhpcy5ERUZBVUxUX0lOSVRfUEFHRSwgcGFnZVNpemU6IHRoaXMucGFnZVNpemUgfSk7XG4gICAgaWYgKCF0aGlzLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24oKSkge1xuICAgICAgdGhpcy5zZXREYXRhKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoaXMubnVtYmVyT2ZUYWJsZVJlZnJlc2ggPSAxLjU7IC8vIHRvIHNraXAgaW5pdCBmaWx0ZXIgdmFsdWUgYXNzaWduXG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ2xpY2tFZGl0Q2FuY2VsKGV2ZW50RGF0YTogSURhdGFUYWJsZVJvd0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5pc1NlYXJjaERpc2FibGVkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlU2VydmljZS5pc0VtcHR5Um93KGV2ZW50RGF0YS5yb3cpKSB7XG4gICAgICB0aGlzLnJlbW92ZUVtcHR5Um93KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudG9nZ2xlUm93RWRpdGluZyhldmVudERhdGEucm93LCBmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ2xpY2tFZGl0U2F2ZShldmVudERhdGE6IElEYXRhVGFibGVSb3dTYXZlRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmlzU2VhcmNoRGlzYWJsZWQgPSBmYWxzZTtcbiAgICBpZiAoaXNGdW5jdGlvbih0aGlzLmJlZm9yZVNhdmVGbikgJiYgIXRoaXMuYmVmb3JlU2F2ZUZuKHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dzRGF0YUZyb21Sb3dzKHRoaXMucm93cyksIGV2ZW50RGF0YSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1NhdmVEYXRhTG9jYWwpIHtcbiAgICAgIHRoaXMub25TYXZlTG9jYWxSb3coZXZlbnREYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zYXZlUm93KGV2ZW50RGF0YSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQ2hhbmdlRXhwYW5kQ29sbGFwc2UoZXZlbnREYXRhOiBJRGF0YVRhYmxlRXhwYW5kQ29sbGFwc2VFdmVudCk6IHZvaWQge1xuICAgIHRoaXMudG9nZ2xlUm93RXhwYW5kQ29sbGFwc2UoZXZlbnREYXRhLnJvdywgZXZlbnREYXRhLnNob3VsZEV4cGFuZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TmF2aWdhdGVJdGVtVmFsdWUoZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMucm93TmF2aWdhdGlvblByb3BlcnR5KSB7XG4gICAgICByZXR1cm4gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFZhbHVlQnlQcm9wZXJ0eU5hbWUoZXZlbnREYXRhLnJvdywgdGhpcy5ncmlkT3B0aW9ucy5yb3dOYXZpZ2F0aW9uUHJvcGVydHkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd0lkKGV2ZW50RGF0YS5yb3cpO1xuICB9XG5cbiAgcHVibGljIG5hdmlnYXRlVG9JdGVtKHR5cGU6IHN0cmluZywgaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHVybDogc3RyaW5nID0gdGhpcy5ncmlkT3B0aW9ucy5lZGl0RXh0cmFSb3V0ZVBhcmFtID8gYCR7dHlwZX0vJHtpZH0vJHt0aGlzLmdyaWRPcHRpb25zLmVkaXRFeHRyYVJvdXRlUGFyYW19YCA6IGAke3R5cGV9LyR7aWR9YDtcbiAgICB0aGlzLm5hdmlnYXRlUGFnZSh1cmwpO1xuICB9XG5cbiAgcHVibGljIG9uQ2xpY2tEZWxldGVSb3coZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93RXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5EZWxldGVNb2RhbChldmVudERhdGEucm93KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNsaWNrRGVsZXRlTW9kYWwoc2hvdWxkRGVsZXRlKTogdm9pZCB7XG4gICAgaWYgKHNob3VsZERlbGV0ZSkge1xuICAgICAgdGhpcy5ncmlkT3B0aW9ucz8uYWN0aW9uTG9hZGluZyQ/LmRlbGV0ZSQubmV4dCh0cnVlKTtcbiAgICAgIGlmICh0aGlzLmlzU2F2ZURhdGFMb2NhbCkge1xuICAgICAgICB0aGlzLnJlbW92ZUxvY2FsUm93KHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dJZCh0aGlzLnJvd1RvRGVsZXRlKSk7XG4gICAgICAgIHRoaXMub25DaGFuZ2VMb2NhbERhdGEoQ2hhbmdlVHlwZS5ST1dfREVMRVRFRCk7XG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnM/LmFjdGlvbkxvYWRpbmckPy5kZWxldGUkLm5leHQoZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kZWxldGVSb3codGhpcy5yb3dUb0RlbGV0ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIFZpc2libGVDb2x1bW5MaXN0Q2hhbmdlZChjb2x1bW5MaXN0OiBJRGF0YVRhYmxlQ29sdW1uW10pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdDb2x1bW5zID0gY29sdW1uTGlzdDtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyU3VicyQubmV4dChudWxsKTtcbiAgICB0aGlzLmNsZWFyU3VicyQuY29tcGxldGUoKTtcbiAgICB0aGlzLmlzQ2xlYXJGaWx0ZXIkLm5leHQoZmFsc2UpO1xuICAgIHRoaXMuaXNDbGVhckZpbHRlciQuY29tcGxldGUoKTtcbiAgICB0aGlzLmRhdGFUYWJsZUNvbnRleHQuY2xlYXJEYXRhVGFibGVDb21wb25lbnQoKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0KCk6IHZvaWQge1xuICAgIHRoaXMuZ3JpZE9wdGlvbnMgPSBtZXJnZSh0aGlzLmRlZmF1bHRHcmlkT3B0aW9ucywgdGhpcy5ncmlkT3B0aW9ucyk7XG4gICAgdGhpcy5zZXRQYWdpbmF0aW9uRGF0YSh7XG4gICAgICBjdXJyZW50UGFnZTogaXNVbmRlZmluZWQodGhpcy5pbml0aWFsUGFnZSkgPyB0aGlzLkRFRkFVTFRfSU5JVF9QQUdFIDogdGhpcy5pbml0aWFsUGFnZSxcbiAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLFxuICAgIH0pO1xuICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IFNlbGVjdGlvbk1vZGVsPElEYXRhVGFibGVSb3c+KCF0aGlzLmlzU2luZ2xlU2VsZWN0LCBbXSk7XG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmlzQXV0b0NvbHVtbikge1xuICAgICAgdGhpcy5zZXRJZENvbHVtbigpO1xuICAgICAgdGhpcy5pbml0Q29sdW1ucygpO1xuICAgICAgdGhpcy5kZWZhdWx0U29ydGVkQ29sdW1ucyA9IGNsb25lKHRoaXMudmlld0NvbHVtbnMpO1xuICAgIH1cbiAgICB0aGlzLmdldENvbmZpZ3VyZWRDb2x1bW5zKCk7XG4gICAgdGhpcy5zZXREYXRhKCk7XG4gIH1cblxuICBwdWJsaWMgc29ydFRhYmxlKHZpZXdDb2x1bW46IElEYXRhVGFibGVDb2x1bW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc1RhYmxlSW5FZGl0U3RhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMuc29ydGFibGVQcm9wZXJ0aWVzLmZpbmQoKGl0ZW0pID0+IGl0ZW0gPT09IHZpZXdDb2x1bW4ucHJvcCkgJiYgIXRoaXMuZ3JpZE9wdGlvbnMuaXNTb3J0RW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNvcnRlZENvbHVtblt2aWV3Q29sdW1uLnByb3BdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc29ydGVkQ29sdW1uID0ge307XG4gICAgICB0aGlzLnNvcnRlZENvbHVtblt2aWV3Q29sdW1uLnByb3BdID0gU29ydERpcmVjdGlvbkVudW0uQVNDO1xuICAgICAgdGhpcy5zb3J0RGF0YSh2aWV3Q29sdW1uLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuc29ydGVkQ29sdW1uW3ZpZXdDb2x1bW4ucHJvcF0gPT09IFNvcnREaXJlY3Rpb25FbnVtLkFTQykge1xuICAgICAgdGhpcy5zb3J0ZWRDb2x1bW5bdmlld0NvbHVtbi5wcm9wXSA9IFNvcnREaXJlY3Rpb25FbnVtLkRFU0M7XG4gICAgICB0aGlzLnNvcnREYXRhKHZpZXdDb2x1bW4sIGZhbHNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zb3J0ZWRDb2x1bW4gPSB7fTtcbiAgICAgIHRoaXMuc29ydERhdGEodmlld0NvbHVtbiwgZmFsc2UsIHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBkZWxldGVSb3cocm93OiBJRGF0YVRhYmxlUm93KTogdm9pZCB7XG4gICAgdGhpcy5zZXRJZENvbHVtbigpO1xuICAgIGNvbnN0IHJvd0lkID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd0lkKHJvdyk7XG4gICAgdGhpcy5kZWxldGVJdGVtRm4ocm93SWQsIHJvdy5kYXRhKVxuICAgICAgLnBpcGUoZmlyc3QoKSwgdGFrZVVudGlsKHRoaXMuY2xlYXJTdWJzJCkpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZ3JpZE9wdGlvbnM/LmFjdGlvbkxvYWRpbmckPy5kZWxldGUkLm5leHQoZmFsc2UpO1xuICAgICAgICAgIHRoaXMuc25hY2tiYXJTZXJ2aWNlLnN1Y2Nlc3MoU25hY2tiYXJUeXBlcy5EZWxldGVkLCBTbmFja2JhclR5cGVzLkRlbGV0ZWQpO1xuICAgICAgICAgIGlmICh0aGlzLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24oKSkge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVMb2NhbFJvdyhyb3dJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuaXNEZWZhdWx0Rmlyc3RSb3dTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUm93ID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLm9uRGVsZXRlQ29tcGxldGVkLmVtaXQoeyByb3c6IHRoaXMuc2VsZWN0ZWRSb3cgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgICAgLy8gRW1wdHkgbWV0aG9kIGJsb2NrLlxuICAgICAgICB9LFxuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VhcmNoTW9kZWxDaGFuZ2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gdGhpcy5zZWFyY2hQaXBlLnRyYW5zZm9ybShcbiAgICAgICAgdGhpcy5yb3dzLFxuICAgICAgICB0aGlzLnNlYXJjaFZhbHVlLnZhbHVlLFxuICAgICAgICB0aGlzLnNlYXJjaENvbHVtbnMsXG4gICAgICAgIHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbixcbiAgICAgICAgdGhpcy5zZWFyY2hlZFJvd0NvdW50JFxuICAgICAgKTtcbiAgICAgIHRoaXMuc2V0UGFnaW5hdGlvbkRhdGEoeyBjdXJyZW50UGFnZTogdGhpcy5ERUZBVUxUX0lOSVRfUEFHRSwgcGFnZVNpemU6IHRoaXMucGFnZVNpemUgfSk7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0VG9vbHRpcFRleHQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5pY29uVG9vbHRpcHMgJiYgdGhpcy5ncmlkT3B0aW9ucy5pY29uVG9vbHRpcHNbdGV4dF0pIHtcbiAgICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zLmljb25Ub29sdGlwc1t0ZXh0XTtcbiAgICB9XG4gICAgcmV0dXJuIHRvb2x0aXBzRGVmYXVsdFZhbHVlW3RleHRdO1xuICB9XG5cbiAgcHVibGljIGdldEFjdGlvbk5hbWUocHJvcDogQWN0aW9uVHlwZXNFbnVtKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy51c2VyTWFuYWdlbWVudFNlcnZpY2UuZ2V0QWN0aW9uTmFtZSh0aGlzLmdyaWRPcHRpb25zLCBwcm9wKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMZWZ0QWN0aW9uTmFtZShwcm9wOiBBY3Rpb25UeXBlc0VudW0pOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnVzZXJNYW5hZ2VtZW50U2VydmljZS5nZXRMZWZ0QWN0aW9uTmFtZSh0aGlzLmdyaWRPcHRpb25zLCBwcm9wKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMZWZ0UmlnaHRBY3Rpb25UZXh0KGRhdGE6IElLZXlWYWx1ZSk6IHN0cmluZyB7XG4gICAgaWYgKGRhdGEudGl0bGUpIHtcbiAgICAgIHJldHVybiBkYXRhLnRpdGxlO1xuICAgIH1cbiAgICByZXR1cm4gdG9vbHRpcHNEZWZhdWx0VmFsdWVbZGF0YS50aXRsZV07XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzU2luZ2xlU2VsZWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuaXNTaW5nbGVTZWxlY3QgPT09IHRydWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhZ2VTaXplKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGFnaW5hdGlvblBhcmFtcy5wYWdlU2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VycmVudFBhZ2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wYWdpbmF0aW9uUGFyYW1zLmN1cnJlbnRQYWdlO1xuICB9XG5cbiAgcHVibGljIGRldGVjdENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3ROZXh0Um93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTGFzdFJvd0luUGFnZSgpKSB7XG4gICAgICB0aGlzLnBhZ2luYXRpb25QYXJhbXMuY3VycmVudFBhZ2UgPSB0aGlzLmlzTGFzdFJvd0luTGFzdFBhZ2UoKSA/IDEgOiB0aGlzLnBhZ2luYXRpb25QYXJhbXMuY3VycmVudFBhZ2UgKyAxO1xuICAgICAgdGhpcy5vbkNoYW5nZVBhZ2UodGhpcy5wYWdpbmF0aW9uUGFyYW1zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbWl0TmV4dFJvdyh0aGlzLnNlbGVjdGVkUm93LnJvd0luZGV4ICsgMSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlbGVjdFByZXZpb3VzUm93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRmlyc3RSb3dJblBhZ2UoKSkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uUGFyYW1zLmN1cnJlbnRQYWdlID0gdGhpcy5pc0ZpcnN0Um93SW5GaXJzdFBhZ2UoKSA/IHRoaXMucGFnZXNDb3VudCA6IHRoaXMucGFnaW5hdGlvblBhcmFtcy5jdXJyZW50UGFnZSAtIDE7XG4gICAgICB0aGlzLm9uQ2hhbmdlUGFnZSh0aGlzLnBhZ2luYXRpb25QYXJhbXMsICdsYXN0Jyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZW1pdE5leHRSb3codGhpcy5zZWxlY3RlZFJvdy5yb3dJbmRleCAtIDEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1bmNoZWNrU2VsZWN0ZWRTb3VyY2UoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3Rpb24uY2xlYXIoKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLmdyaWRBcGkuZGV0ZWN0Um93Q2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIG9uRG91YmxlQ2xpY2tTZXBhcmF0b3IoaW5kZXg6IG51bWJlciwgdmlld0NvbHVtbjogSURhdGFUYWJsZUNvbHVtbikge1xuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5kcmFnZ2FibGUgfHwgIXZpZXdDb2x1bW4uZHJhZ2dhYmxlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xpY2tUaW1lb3V0KTtcbiAgICB0aGlzLnJlc2l6aW5nVGggPSB0aGlzLmdldFNlbGVjdGVkSHRtbChgdGhbZGF0YS1jb2x1bW4tcHJvcD1cIiR7dmlld0NvbHVtbi5wcm9wfVwiXSBkaXZgKSBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLnJlc2l6aW5nVGQgPSB0aGlzLmdldFNlbGVjdGVkSHRtbChgdGRbZGF0YS1jb2x1bW4tcHJvcD1cIiR7dmlld0NvbHVtbi5wcm9wfVwiXWAsIHRydWUpIGFzIE5vZGVMaXN0O1xuICAgIGlmICghdGhpcy5yZXNpemluZ1RoIHx8ICF0aGlzLnJlc2l6aW5nVGQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2aWV3Q29sdW1uLmRvdWJsZUNsaWNrZWQgPSAhdmlld0NvbHVtbi5kb3VibGVDbGlja2VkO1xuICAgIHZpZXdDb2x1bW4uZHJhZ2dlZCA9IGZhbHNlO1xuICAgIHRoaXMuZm9ybWF0VGFibGVEYXRhKHZpZXdDb2x1bW4pO1xuICAgIHRoaXMuZm9ybWF0VGFibGVIZWFkZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIZWFkZXJTdHlsZShpbmRleDogbnVtYmVyLCB2aWV3Q29sdW1uOiBJRGF0YVRhYmxlQ29sdW1uKTogc3RyaW5nW10ge1xuICAgIGxldCBjbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGlmICh0aGlzLnZpZXdDb2x1bW5zW2luZGV4XS5kcmFnZ2VkIHx8IHZpZXdDb2x1bW4/LmRvdWJsZUNsaWNrZWQgPT09IHRydWUpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnZHJhZy1jb2x1bW4nKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZml4ZWRXaWR0aERhdGEpIHtcbiAgICAgIGNsYXNzZXMucHVzaCgnaGVhZGVyLW1heC13aWR0aCcpO1xuICAgIH1cblxuICAgIHJldHVybiBjbGFzc2VzO1xuICB9XG5cbiAgcHVibGljIG9uU2VwYXJhdG9yTW91c2VEb3duKGV2ZW50OiBNb3VzZUV2ZW50LCBpbmRleDogbnVtYmVyLCB2aWV3Q29sdW1uOiBJRGF0YVRhYmxlQ29sdW1uKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xpY2tUaW1lb3V0KTtcbiAgICB0aGlzLmNsaWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmRyYWdnYWJsZSB8fCAhdmlld0NvbHVtbi5kcmFnZ2FibGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXZpZXdDb2x1bW4uZHJhZ2dlZCkge1xuICAgICAgICB2aWV3Q29sdW1uLmRyYWdnZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5yZXNpemluZ1RoID0gdGhpcy5nZXRTZWxlY3RlZEh0bWwoYHRoW2RhdGEtY29sdW1uLXByb3A9XCIke3ZpZXdDb2x1bW4ucHJvcH1cIl0gZGl2YCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICB0aGlzLnJlc2l6aW5nVGQgPSB0aGlzLmdldFNlbGVjdGVkSHRtbChgdGRbZGF0YS1jb2x1bW4tcHJvcD1cIiR7dmlld0NvbHVtbi5wcm9wfVwiXWAsIHRydWUpIGFzIE5vZGVMaXN0O1xuICAgICAgY29uc3QgdGREaXYgPSB0aGlzLmdldFNlbGVjdGVkSHRtbChgdGRbZGF0YS1jb2x1bW4tcHJvcD1cIiR7dmlld0NvbHVtbi5wcm9wfVwiXSBkaXZgKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHRoaXMuYXBvbGxvRGF0YVRhYmxlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFwb2xsby1kZXNpZ24tbmV3LWRhdGEtdGFibGUnKSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgaWYgKHRoaXMucmVzaXppbmdUaCkge1xuICAgICAgICB0aGlzLnN0YXJ0WCA9IGV2ZW50LnBhZ2VYO1xuICAgICAgICB0aGlzLnN0YXJ0V2lkdGggPSB0aGlzLmdldEFjdHVhbFdpZHRoKHRoaXMucmVzaXppbmdUaCwgdGhpcy5zdGFydFgpO1xuICAgICAgICBjb25zdCB0ZERpdldpZHRoID0gdGhpcy5nZXRBY3R1YWxXaWR0aCh0ZERpdiwgdGhpcy5zdGFydFgpO1xuXG4gICAgICAgIGlmICh0aGlzLnJlc2l6aW5nVGQpIHtcbiAgICAgICAgICB0aGlzLnJlc2l6aW5nVGQuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdGREaXYgPSAoPEhUTUxFbGVtZW50PmNlbGwpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgdGREaXYuY2xhc3NMaXN0LnJlbW92ZSgnZGF0YS1tYXgtd2lkdGgnKTtcbiAgICAgICAgICAgIHRkRGl2LmNsYXNzTGlzdC5hZGQoJ2RyYWctY29sdW1uJyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNldFdpZHRoVG9FbGVtZW50KHRoaXMuc3RhcnRXaWR0aCwgdGREaXZXaWR0aCwgdGhpcy5yZXNpemluZ1RoLm9mZnNldFdpZHRoKTtcbiAgICAgIH1cbiAgICB9LCAyNTApO1xuXG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCduby1zZWxlY3QtcmVzaXplJyk7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZHJhZ2dhYmxlICYmIHZpZXdDb2x1bW4uZHJhZ2dhYmxlKSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5vbk1vdXNlVXApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RlZEh0bWwoc2VsZWN0b3I6IHN0cmluZywgaXNTZWxlY3RBbGw6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmIChpc1NlbGVjdEFsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuY3VzdG9tRGF0YVRhYmxlLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY3VzdG9tRGF0YVRhYmxlLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gIH1cblxuICBwcml2YXRlIGZvcm1hdFRhYmxlRGF0YSh2aWV3Q29sdW1uOiBJRGF0YVRhYmxlQ29sdW1uKSB7XG4gICAgaWYgKCF2aWV3Q29sdW1uLmRvdWJsZUNsaWNrZWQpIHtcbiAgICAgIHRoaXMucmVzaXppbmdUZC5mb3JFYWNoKChjZWxsKSA9PiB7XG4gICAgICAgIGNvbnN0IHRkRGl2ID0gKDxIVE1MRWxlbWVudD5jZWxsKS5xdWVyeVNlbGVjdG9yKCdkaXYnKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgdGREaXYuY2xhc3NMaXN0LnJlbW92ZSgnZHJhZy1jb2x1bW4nKTtcbiAgICAgICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZml4ZWRXaWR0aERhdGEpIHtcbiAgICAgICAgICB0ZERpdi5jbGFzc0xpc3QuYWRkKCdkYXRhLW1heC13aWR0aCcpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXNpemluZ1RkLmZvckVhY2goKGNlbGwpID0+IHtcbiAgICAgICAgY29uc3QgdGREaXYgPSAoPEhUTUxFbGVtZW50PmNlbGwpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0ZERpdi5jbGFzc0xpc3QucmVtb3ZlKCdkYXRhLW1heC13aWR0aCcpO1xuICAgICAgICB0ZERpdi5jbGFzc0xpc3QuYWRkKCdkcmFnLWNvbHVtbicpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRUYWJsZUhlYWRlcigpIHtcbiAgICB0aGlzLnJlc2l6aW5nVGguc3R5bGUud2lkdGggPSAnJztcbiAgICB0aGlzLnJlc2l6aW5nVGQuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgY29uc3QgdGREaXYgPSAoPEhUTUxFbGVtZW50PmNlbGwpLnF1ZXJ5U2VsZWN0b3IoJ2RpdicpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgdGREaXYuc3R5bGUud2lkdGggPSAnJztcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMuc3RhcnRXaWR0aCArIChldmVudC5wYWdlWCAtIHRoaXMuc3RhcnRYKTtcbiAgICBpZiAodGhpcy5yZXNpemluZ1RoKSB7XG4gICAgICB0aGlzLnNldFdpZHRoVG9FbGVtZW50KHdpZHRoLCB3aWR0aCwgdGhpcy5yZXNpemluZ1RoLm9mZnNldFdpZHRoKTtcbiAgICB9XG4gIH07XG5cbiAgcHJpdmF0ZSBvbk1vdXNlVXAgPSAoKTogdm9pZCA9PiB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25Nb3VzZVVwKTtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ25vLXNlbGVjdC1yZXNpemUnKTtcbiAgICB0aGlzLnJlc2l6aW5nVGggPSBudWxsO1xuICAgIHRoaXMucmVzaXppbmdUZCA9IG51bGw7XG4gIH07XG5cbiAgcHJpdmF0ZSBzZXRXaWR0aFRvRWxlbWVudCh0aFdpZHRoOiBudW1iZXIsIHRkV2lkdGg6IG51bWJlciwgcHJldmlvdXNUaFdpZHRoOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5yZXNpemluZ1RoKSB7XG4gICAgICB0aGlzLnJlc2l6aW5nVGguc3R5bGUud2lkdGggPSBgJHt0aFdpZHRofXB4YDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yZXNpemluZ1RkKSB7XG4gICAgICB0aGlzLnJlc2l6aW5nVGQuZm9yRWFjaCgoY2VsbCkgPT4ge1xuICAgICAgICBjb25zdCBkaXYgPSAoPEhUTUxFbGVtZW50PmNlbGwpLnF1ZXJ5U2VsZWN0b3IoJ2Rpdi5kcmFnLWNvbHVtbicpIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmIChkaXYpIHtcbiAgICAgICAgICBkaXYuc3R5bGUud2lkdGggPSBgJHt0ZFdpZHRofXB4YDtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzaXppbmdUaCAmJiB0aGlzLmFwb2xsb0RhdGFUYWJsZSkge1xuICAgICAgY29uc3QgdXBkYXRlZFRhYmxlV2lkdGggPSB0aGlzLmFwb2xsb0RhdGFUYWJsZS5vZmZzZXRXaWR0aCArICh0aGlzLnJlc2l6aW5nVGgub2Zmc2V0V2lkdGggLSBwcmV2aW91c1RoV2lkdGgpO1xuICAgICAgdGhpcy5hcG9sbG9EYXRhVGFibGUuc3R5bGUud2lkdGggPSBgJHt1cGRhdGVkVGFibGVXaWR0aH1weGA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRBY3R1YWxXaWR0aChlbGVtZW50OiBIVE1MRWxlbWVudCwgc3RhcnRYOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGxldCB3aWR0aDogbnVtYmVyO1xuICAgIGNvbnN0IGJvdW5kaW5nUmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgd2lkdGggPSBib3VuZGluZ1JlY3Qud2lkdGg7XG4gICAgY29uc3Qgb2Zmc2V0ID0gc3RhcnRYIC0gYm91bmRpbmdSZWN0LmxlZnQ7XG5cbiAgICBpZiAob2Zmc2V0IDwgYm91bmRpbmdSZWN0LndpZHRoKSB7XG4gICAgICB3aWR0aCA9IG9mZnNldDtcbiAgICB9XG5cbiAgICByZXR1cm4gd2lkdGg7XG4gIH1cblxuICBwcml2YXRlIGdldCBwYWdlc0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLmNvdW50IC8gdGhpcy5wYWdlU2l6ZSk7XG4gIH1cblxuICBwcml2YXRlIGdldCByb3dzQ291bnRJbkN1cnJlbnRQYWdlKCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnJvd3MubGVuZ3RoO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0Um93cyA9IHRoaXMucm93cy5sZW5ndGggLSB0aGlzLnBhZ2VTaXplICogKHRoaXMuY3VycmVudFBhZ2UgLSAxKTtcbiAgICByZXR1cm4gbGVmdFJvd3MgPj0gdGhpcy5wYWdlU2l6ZSA/IHRoaXMucGFnZVNpemUgOiBsZWZ0Um93cztcbiAgfVxuXG4gIHByaXZhdGUgaXNMYXN0Um93SW5QYWdlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkUm93ICYmIHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbikge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHRoaXMuc2VsZWN0ZWRSb3cucm93SW5kZXggKyAxKSAvIHRoaXMuY3VycmVudFBhZ2UgPT09IHRoaXMucm93c0NvdW50SW5DdXJyZW50UGFnZSB8fCB0aGlzLnNlbGVjdGVkUm93LnJvd0luZGV4ICsgMSA9PT0gdGhpcy5jb3VudFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRSb3cgJiYgdGhpcy5zZWxlY3RlZFJvdy5yb3dJbmRleCArIDEgPT09IHRoaXMucm93c0NvdW50SW5DdXJyZW50UGFnZTtcbiAgfVxuXG4gIHByaXZhdGUgaXNGaXJzdFJvd0luUGFnZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFJvdyAmJiB0aGlzLnNlbGVjdGVkUm93LnJvd0luZGV4ICUgdGhpcy5wYWdlU2l6ZSA9PT0gMDtcbiAgfVxuXG4gIHByaXZhdGUgaXNGaXJzdFJvd0luRmlyc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRmlyc3RSb3dJblBhZ2UoKSAmJiB0aGlzLmN1cnJlbnRQYWdlID09PSAxO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xhc3RSb3dJbkxhc3RQYWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzTGFzdFJvd0luUGFnZSgpICYmIHRoaXMuY3VycmVudFBhZ2UgPT09IHRoaXMucGFnZXNDb3VudDtcbiAgfVxuXG4gIHByaXZhdGUgZGV0ZWN0Um93Q2hhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMucm93cyA9IGNsb25lKHRoaXMucm93cyk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIGlzQ2xpZW50U2lkZVBhZ2luYXRpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgc2V0SWRDb2x1bW4oKTogdm9pZCB7XG4gICAgLy8gVG8gZG8gaW1wcm92ZVxuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuaWRQcm9wZXJ0eSkge1xuICAgICAgQ09MVU1OX0lELlBST1AgPSB0aGlzLmdyaWRPcHRpb25zLmlkUHJvcGVydHk7XG4gICAgfSBlbHNlIHtcbiAgICAgIENPTFVNTl9JRC5QUk9QID0gJ2lkJztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXRDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMuaW5pdFZpZXdDb2x1bW5zKCk7XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMgJiYgdGhpcy5ncmlkT3B0aW9ucy5hZGRJZENvbHVtbikge1xuICAgICAgdGhpcy5hZGRJZENvbHVtbigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uZmlndXJlRGlhbG9nKGRpYWxvZ0NvbmZpZzogTWF0RGlhbG9nQ29uZmlnKTogTWF0RGlhbG9nQ29uZmlnIHtcbiAgICBkaWFsb2dDb25maWcucG9zaXRpb24gPSB7XG4gICAgICB0b3A6ICcxNXZoJyxcbiAgICAgIGxlZnQ6ICcyMHZ3JyxcbiAgICB9O1xuICAgIGRpYWxvZ0NvbmZpZy5oZWlnaHQgPSAnODB2aCc7XG4gICAgZGlhbG9nQ29uZmlnLndpZHRoID0gJzYwdncnO1xuICAgIGRpYWxvZ0NvbmZpZy5wYW5lbENsYXNzID0gJ2NvbHVtbnNob3doaWRlLXBhbmVsJztcbiAgICBkaWFsb2dDb25maWcuZGF0YSA9IHtcbiAgICAgIGRlZmF1bHRTb3J0ZWRDb2x1bW5zOiB0aGlzLmRlZmF1bHRTb3J0ZWRDb2x1bW5zLFxuICAgICAgY29sdW1uczogdGhpcy52aWV3Q29sdW1ucyxcbiAgICAgIHN0b3JhZ2VLZXk6IHRoaXMuc3RvcmFnZUtleSxcbiAgICAgIG1ldGFEYXRhQ29sdW1uczogdGhpcy5ncmlkT3B0aW9ucy5tZXRhRGF0YUNvbHVtbnMsXG4gICAgfTtcbiAgICBkaWFsb2dDb25maWcuZGlzYWJsZUNsb3NlID0gZmFsc2U7XG4gICAgcmV0dXJuIGRpYWxvZ0NvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgaW5pdFZpZXdDb2x1bW5zKCk6IHZvaWQge1xuICAgIHRoaXMudmlld0NvbHVtbnMgPSBjbG9uZSh0aGlzLmNvbHVtbnMuZmlsdGVyKCh4KSA9PiB4ICE9IHVuZGVmaW5lZCkpO1xuICAgIHRoaXMudmlld0NvbHVtbnMuZm9yRWFjaCgodmlld0NvbHVtbjogSURhdGFUYWJsZUNvbHVtbikgPT4ge1xuICAgICAgaWYgKHZpZXdDb2x1bW4uaXNWaXNpYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmlld0NvbHVtbi5pc1Zpc2libGUgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHZpZXdDb2x1bW4uaXNEaXNwbGF5VmFsdWVBc0Zvcm1Db250cm9sID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmlld0NvbHVtbi5pc0Rpc3BsYXlWYWx1ZUFzRm9ybUNvbnRyb2wgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnNlYXJjaENvbHVtbnMgPSB0aGlzLmdldFNlYXJjaGFibGVDb2x1bW5zKHRoaXMudmlld0NvbHVtbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRJZENvbHVtbigpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdDb2x1bW5zLnVuc2hpZnQoe1xuICAgICAgaGVhZGVyOiBDT0xVTU5fSUQuSEVBREVSLFxuICAgICAgcHJvcDogQ09MVU1OX0lELlBST1AsXG4gICAgICB0eXBlOiBDb2x1bW5UeXBlcy5JbnRlZ2VyLFxuICAgICAgaXNSZWFkT25seTogdHJ1ZSxcbiAgICAgIGlzVmlzaWJsZTogZmFsc2UsIC8vIHRoaXMuaXNJZENvbFZpc2libGUsXG4gICAgICBpc0Rpc3BsYXlWYWx1ZUFzRm9ybUNvbnRyb2w6IGZhbHNlLFxuICAgICAgZWRpdERpc2FibGVkTW9kZTogQ29sdW1uRGlzYWJsZU1vZGVzLkFsd2F5c0Rpc2FibGVkLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXREYXRhKHNlbGVjdGFibGVJbmRleD86IG51bWJlciB8IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubnVtYmVyT2ZUYWJsZVJlZnJlc2ggKz0gMTtcbiAgICB0aGlzLmlzTG9hZGluZyQubmV4dCh0cnVlKTtcbiAgICBpZiAoIXRoaXMuZ3JpZE9wdGlvbnMuaXNBdXRvQ29sdW1uKSB7XG4gICAgICB0aGlzLnNldEluaXRBcGlQYXJhbXMoKTtcbiAgICB9XG4gICAgdGhpcy5hcHBseURlZmF1bHRTb3J0aW5nUGFyYW1zKCk7XG4gICAgdGhpcy5nZXRMaXN0Rm4odGhpcy5hcGlSZXFQYXJhbXMpXG4gICAgICAucGlwZShmaXJzdCgpLCB0YWtlVW50aWwodGhpcy5jbGVhclN1YnMkKSlcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgICAgLy8gVE9ETzogYWRkIGVycm9yIGhhbmRsaW5nXG4gICAgICAgICAgdGhpcy50b3RhbEl0ZW1zID0gcmVzcG9uc2UuaXRlbXNUb3RhbDtcbiAgICAgICAgICB0aGlzLmluaXRHZXRGdW5jKHJlc3BvbnNlLCBzZWxlY3RhYmxlSW5kZXgpO1xuICAgICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmlzRGVmYXVsdEFsbFJvd1NlbGVjdGVkICYmIHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbikge1xuICAgICAgICAgICAgdGhpcy5tYXN0ZXJTZWxlY3Rpb24uc2V0VmFsdWUodHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLm1hc3RlclRvZ2dsZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmlzVGFibGVEYXRhTG9hZC5lbWl0KHRydWUpO1xuICAgICAgICB9LFxuICAgICAgICAoZXJyKSA9PiB7XG4gICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgdGhpcy5pc0xvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy5yb3dzID0gdGhpcy5yb3dzIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgLy8gRW1wdHkgTWV0aG9kIGJsb2NrXG4gICAgICAgIH1cbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIHNldEluaXRBcGlQYXJhbXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubnVtYmVyT2ZUYWJsZVJlZnJlc2ggPiAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuc2V0SW5pdEZpbHRlclBhcmFtcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRJbml0RmlsdGVyUGFyYW1zKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsdGVyTWFuYWdlci5zZXRJbml0RmlsdGVyUGFyYW1zKHRoaXMuY29sdW1ucyk7XG4gIH1cblxuICBwcml2YXRlIGluaXRHZXRGdW5jKHJlc3BvbnNlOiBJTGlzdFJlc0FwaTxJS2V5VmFsdWU+LCBzZWxlY3RhYmxlSW5kZXg/OiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmNvdW50ID0gdGhpcy5ncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uID8gcmVzcG9uc2UucmVzdWx0U2V0Lmxlbmd0aCA6IHJlc3BvbnNlLml0ZW1zVG90YWw7XG4gICAgdGhpcy5zZWFyY2hlZFJvd0NvdW50JC5uZXh0KHJlc3BvbnNlLml0ZW1zVG90YWwpO1xuICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLmlzQXV0b0NvbHVtbikge1xuICAgICAgdGhpcy5nZW5lcmF0ZUNvbHVtbnMocmVzcG9uc2UucmVzdWx0U2V0KTtcbiAgICB9XG4gICAgdGhpcy5yb3dzID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd3NGcm9tUm93c0RhdGEocmVzcG9uc2UucmVzdWx0U2V0KTtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5lZGl0YWJsZSkge1xuICAgICAgdGhpcy5yb3dzLmZvckVhY2goKHgpID0+ICh4LmlzRWRpdGluZyA9IHRydWUpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbikge1xuICAgICAgdGhpcy5vcmlnaW5hbFVuc29ydGVkUm93cyA9IGNsb25lRGVlcCh0aGlzLnJvd3MpO1xuICAgIH1cblxuICAgIHRoaXMuZmlsdGVyZWRSb3dzID0gY2xvbmVEZWVwKHRoaXMucm93cyk7XG4gICAgdGhpcy5zZWxlY3RlZFJvdyA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmlzTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgdGhpcy5pc0NsZWFyRmlsdGVyJC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLmlzRWRpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuaGFzRW1wdHlSb3cgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0U29ydFByb3BlcnR5LnByb3ApIHtcbiAgICAgIHRoaXMuYXBwbHlEZWZhdWx0U29ydCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0VsaWdpYmxlRm9yQWxsQ2hlY2soKSkge1xuICAgICAgdGhpcy5jaGVja2VkQWxsRXhjZXB0RXhjbHVkZWRSb3dzKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzUm93U2VsZWN0aW9uRW5hYmxlICYmICF0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuc2V0Um93Q2hlY2tlZCgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc0RlZmF1bHRGaXJzdFJvd1NlbGVjdGVkKCkpIHtcbiAgICAgIC8vIFRPRE8gLSByZWZhY3RvclxuXG4gICAgICB0aGlzLmVtaXROZXh0Um93KHRoaXMuZ2V0U2VsZWN0YWJsZVZhbGlkSW5kZXgoc2VsZWN0YWJsZUluZGV4KSk7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0VsaWdpYmxlRm9yQWxsQ2hlY2soKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuaXNSb3dTZWxlY3Rpb25FbmFibGUgJiYgIXRoaXMuZ3JpZE9wdGlvbnMuaXNDbGllbnRTaWRlUGFnaW5hdGlvbiAmJiAhdGhpcy5tYXN0ZXJTZWxlY3Rpb24ucHJpc3RpbmUgJiYgdGhpcy5tYXN0ZXJTZWxlY3Rpb24udmFsdWVcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZWxlY3RhYmxlVmFsaWRJbmRleChzZWxlY3RhYmxlSW5kZXg6IG51bWJlciB8IHN0cmluZyk6IGFueSB7XG4gICAgaWYgKHNlbGVjdGFibGVJbmRleCA9PT0gJ2xhc3QnKSB7XG4gICAgICBzZWxlY3RhYmxlSW5kZXggPSB0aGlzLnBhZ2VTaXplO1xuICAgIH1cbiAgICByZXR1cm4gTnVtYmVyKHNlbGVjdGFibGVJbmRleCkgPiB0aGlzLnJvd3NDb3VudEluQ3VycmVudFBhZ2UgLSAxID8gdGhpcy5yb3dzQ291bnRJbkN1cnJlbnRQYWdlIC0gMSA6IHNlbGVjdGFibGVJbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGFnaW5hdGlvbkRhdGEocGFnaW5hdGlvblBhcmFtczogSVBhZ2luYXRpb25QYXJhbXMpOiB2b2lkIHtcbiAgICB0aGlzLnBhZ2luYXRpb25QYXJhbXMgPSBwYWdpbmF0aW9uUGFyYW1zO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja2VkQWxsRXhjZXB0RXhjbHVkZWRSb3dzKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJQcm9wZXJ0eVdoZW5TZWxlY3Rpb25FbmFibGUodGhpcy5leGNsdWRlZFJvd3MpO1xuICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgY29uc3QgZXhjbHVkZWRDdXJyZW50UGFnZVJvd3MgPSB0aGlzLnJvd3MuZmlsdGVyKCh4KSA9PiB0aGlzLmV4Y2x1ZGVkUm93cy5tYXAoKGUpID0+IEpTT04uc3RyaW5naWZ5KGUpKS5pbmNsdWRlcyhKU09OLnN0cmluZ2lmeSh4KSkpO1xuICAgIHRoaXMucm93c1xuICAgICAgLmZpbHRlcigoeCkgPT4gIWV4Y2x1ZGVkQ3VycmVudFBhZ2VSb3dzLnNvbWUoKHkpID0+IEpTT04uc3RyaW5naWZ5KHgpID09PSBKU09OLnN0cmluZ2lmeSh5KSkpXG4gICAgICAuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmdyaWRPcHRpb25zLnJvd0Rpc2FibGVGbiAmJiBpc0Z1bmN0aW9uKHRoaXMuZ3JpZE9wdGlvbnMucm93RGlzYWJsZUZuKSAmJiAhdGhpcy5ncmlkT3B0aW9ucy5yb3dEaXNhYmxlRm4ocm93KSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmdyaWRPcHRpb25zLnJvd0Rpc2FibGVGbikge1xuICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlEZWZhdWx0U29ydCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0U29ydFByb3BlcnR5Lm9yZGVyID09PSBTb3J0RGlyZWN0aW9uRW51bS5ERVNDKSB7XG4gICAgICB0aGlzLmRvd25Tb3J0KHRoaXMuZ3JpZE9wdGlvbnMuZGVmYXVsdFNvcnRQcm9wZXJ0eSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBTb3J0KHRoaXMuZ3JpZE9wdGlvbnMuZGVmYXVsdFNvcnRQcm9wZXJ0eSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhcHBseURlZmF1bHRTb3J0aW5nUGFyYW1zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0U29ydFByb3BlcnR5LnByb3ApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zb3J0ZWRDb2x1bW4gPSB7fTtcbiAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0U29ydFByb3BlcnR5Lm9yZGVyID09PSBTb3J0RGlyZWN0aW9uRW51bS5ERVNDKSB7XG4gICAgICB0aGlzLnNvcnRlZENvbHVtblt0aGlzLmdyaWRPcHRpb25zLmRlZmF1bHRTb3J0UHJvcGVydHkucHJvcF0gPSBTb3J0RGlyZWN0aW9uRW51bS5ERVNDO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNvcnRlZENvbHVtblt0aGlzLmdyaWRPcHRpb25zLmRlZmF1bHRTb3J0UHJvcGVydHkucHJvcF0gPSBTb3J0RGlyZWN0aW9uRW51bS5BU0M7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRQYWdpbmF0aW9uRGF0YU9uU2l6ZUNoYW5nZWQocGFnZVNpemU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucGFnaW5hdGlvblBhcmFtcy5wYWdlU2l6ZSA9IHBhZ2VTaXplO1xuICB9XG5cbiAgcHJpdmF0ZSBuYXZpZ2F0ZVBhZ2UodXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdXJsXSwgeyByZWxhdGl2ZVRvOiB0aGlzLmFjdGl2YXRlZFJvdXRlIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuRGVsZXRlTW9kYWwocm93OiBJRGF0YVRhYmxlUm93KTogdm9pZCB7XG4gICAgdGhpcy5yb3dUb0RlbGV0ZSA9IHJvdztcbiAgICBjb25zdCBkaWFsb2dDb25maWcgPSBuZXcgTWF0RGlhbG9nQ29uZmlnKCk7XG4gICAgZGlhbG9nQ29uZmlnLmRhdGEgPSB7XG4gICAgICBtZXNzYWdlOiB0aGlzLmdyaWRPcHRpb25zLmRlbGV0ZU9wdGlvbnMuY29uZmlybWF0aW9uTWVzc2FnZSxcbiAgICB9O1xuICAgIGRpYWxvZ0NvbmZpZy5wb3NpdGlvbiA9IHtcbiAgICAgIHRvcDogJzclJyxcbiAgICB9O1xuICAgIGRpYWxvZ0NvbmZpZy5wYW5lbENsYXNzID0gJ2RlbGV0ZS1tb2RhbC1wYW5lbCc7XG4gICAgY29uc3QgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8RGVsZXRlTW9kYWxDb21wb25lbnQ+ID0gdGhpcy5tYXREaWFsb2cub3BlbihEZWxldGVNb2RhbENvbXBvbmVudCwgZGlhbG9nQ29uZmlnKTtcbiAgICBkaWFsb2dSZWZcbiAgICAgIC5hZnRlckNsb3NlZCgpXG4gICAgICAucGlwZShmaXJzdCgpLCB0YWtlVW50aWwodGhpcy5jbGVhclN1YnMkKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4gdGhpcy5vbkNsaWNrRGVsZXRlTW9kYWwocmVzdWx0KSk7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIHNhdmVSb3coZXZlbnREYXRhOiBJRGF0YVRhYmxlUm93U2F2ZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5zZXRJZENvbHVtbigpO1xuICAgIGNvbnN0IHJvdyA9IGV2ZW50RGF0YS5yb3csXG4gICAgICBzYXZlRGF0YSA9IGV2ZW50RGF0YS5zYXZlRGF0YTtcbiAgICBpZiAoc2F2ZURhdGFbQ09MVU1OX0lELlBST1BdID09PSBDT0xVTU5fSUQuRU1QVFlfUk9XX1ZBTCkge1xuICAgICAgdGhpcy5wb3N0RGF0YUZvckFkZChzYXZlRGF0YSwgcm93KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wdXREYXRhRm9yRWRpdChzYXZlRGF0YSwgcm93KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvc3REYXRhRm9yQWRkKHNhdmVEYXRhOiBJUm93RGF0YSwgcm93OiBJRGF0YVRhYmxlUm93KTogdm9pZCB7XG4gICAgdGhpcy5pc1NhdmluZyA9IHRydWU7XG4gICAgcm93LmlzU2F2aW5nID0gdHJ1ZTtcbiAgICB0aGlzLnBvc3RJdGVtRm4oc2F2ZURhdGEpXG4gICAgICAucGlwZShmaXJzdCgpLCB0YWtlVW50aWwodGhpcy5jbGVhclN1YnMkKSlcbiAgICAgIC5zdWJzY3JpYmUoXG4gICAgICAgIChyZXN1bHQ6IElLZXlWYWx1ZSkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICByb3cuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnNuYWNrYmFyU2VydmljZS5zdWNjZXNzKFNuYWNrYmFyVHlwZXMuU3VjY2VzcywgU25hY2tiYXJUeXBlcy5TdWNjZXNzKTtcbiAgICAgICAgICBpZiAodGhpcy5ncmlkT3B0aW9ucy5yZWZyZXNoT25BZGQpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhc0VtcHR5Um93ID0gZmFsc2U7XG4gICAgICAgICAgICBzYXZlRGF0YVtDT0xVTU5fSUQuUFJPUF0gPSByZXN1bHRbQ09MVU1OX0lELlBST1BdO1xuICAgICAgICAgICAgdGhpcy5zYXZlTG9jYWxSb3cocm93LCBzYXZlRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pc1NhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHJvdy5pc1NhdmluZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBwdXREYXRhRm9yRWRpdChzYXZlRGF0YTogSVJvd0RhdGEsIHJvdzogSURhdGFUYWJsZVJvdyk6IHZvaWQge1xuICAgIHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xuICAgIHJvdy5pc1NhdmluZyA9IHRydWU7XG4gICAgdGhpcy5wdXRJdGVtRm4odGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd0lkKHJvdyksIHNhdmVEYXRhKVxuICAgICAgLnBpcGUoZmlyc3QoKSwgdGFrZVVudGlsKHRoaXMuY2xlYXJTdWJzJCkpXG4gICAgICAuc3Vic2NyaWJlKFxuICAgICAgICAocmV0dXJuRGF0YTogSVJvd0RhdGEpID0+IHtcbiAgICAgICAgICBpZiAocmV0dXJuRGF0YSkge1xuICAgICAgICAgICAgc2F2ZURhdGEgPSBtZXJnZShzYXZlRGF0YSwgcmV0dXJuRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICByb3cuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLnNuYWNrYmFyU2VydmljZS5pbmZvKFNuYWNrYmFyVHlwZXMuVXBkYXRlLCBTbmFja2JhclR5cGVzLlVwZGF0ZSk7XG4gICAgICAgICAgaWYgKCF0aGlzLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24oKSkge1xuICAgICAgICAgICAgdGhpcy5zZXREYXRhKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2F2ZUxvY2FsUm93KHJvdywgc2F2ZURhdGEpO1xuICAgICAgICAgICAgdGhpcy5vblVwZGF0ZUNvbXBsZXRlZC5lbWl0KHsgcm93IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICByb3cuaXNTYXZpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZG93blNvcnQodmlld0NvbHVtbjogSURhdGFUYWJsZUNvbHVtbik6IHZvaWQge1xuICAgIHRoaXMucm93cy5zb3J0KChpdGVtMSwgaXRlbTIpID0+IHtcbiAgICAgIHJldHVybiBpdGVtMS5kYXRhW3ZpZXdDb2x1bW4ucHJvcF0gPD0gaXRlbTIuZGF0YVt2aWV3Q29sdW1uLnByb3BdID8gMSA6IC0xO1xuICAgIH0pO1xuICAgIHRoaXMuZGV0ZWN0Um93Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwU29ydCh2aWV3Q29sdW1uOiBJRGF0YVRhYmxlQ29sdW1uKTogdm9pZCB7XG4gICAgdGhpcy5yb3dzLnNvcnQoKGl0ZW0xLCBpdGVtMikgPT4ge1xuICAgICAgcmV0dXJuIGl0ZW0xLmRhdGFbdmlld0NvbHVtbi5wcm9wXSA+PSBpdGVtMi5kYXRhW3ZpZXdDb2x1bW4ucHJvcF0gPyAxIDogLTE7XG4gICAgfSk7XG4gICAgdGhpcy5kZXRlY3RSb3dDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5zb3J0KCk6IHZvaWQge1xuICAgIHRoaXMucm93cyA9IHRoaXMub3JpZ2luYWxVbnNvcnRlZFJvd3MuZmlsdGVyKChvcmlnaW5hbCkgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMucm93cy5maWx0ZXIoKHJvdykgPT4gSlNPTi5zdHJpbmdpZnkocm93LmRhdGEpID09PSBKU09OLnN0cmluZ2lmeShvcmlnaW5hbC5kYXRhKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNvcnREYXRhKHZpZXdDb2x1bW46IElEYXRhVGFibGVDb2x1bW4sIGlzQXNjZW5kaW5nOiBib29sZWFuLCBpc1Vuc29ydDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb24pIHtcbiAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpc1Vuc29ydCkge1xuICAgICAgdGhpcy51bnNvcnQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNBc2NlbmRpbmcgPyB0aGlzLnVwU29ydCh2aWV3Q29sdW1uKSA6IHRoaXMuZG93blNvcnQodmlld0NvbHVtbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRFbXB0eVJvdyhkZXB0aDogbnVtYmVyID0gUk9XLlJPT1RfREVQVEgsIHBhcmVudElkOiBzdHJpbmcgPSBDT0xVTU5fSUQuTk9fUEFSRU5UX1ZBTCk6IHZvaWQge1xuICAgIHRoaXMuaGFzRW1wdHlSb3cgPSB0cnVlO1xuICAgIHRoaXMuZmlsdGVyTWFuYWdlci5jbGVhckZpbHRlclBhcmFtcygpO1xuICAgIGNvbnN0IG5ld1JvdyA9IHRoaXMuZ2V0RW1wdHlSb3coZGVwdGgsIHBhcmVudElkKTtcbiAgICB0aGlzLnNlbGVjdGVkUm93ID0gbmV3Um93O1xuICAgIHRoaXMucm93cyA9IHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dzV2l0aEluc2VydGVkUm93KHBhcmVudElkLCB0aGlzLnJvd3MsIG5ld1Jvdyk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUVtcHR5Um93KCk6IHZvaWQge1xuICAgIHRoaXMuaGFzRW1wdHlSb3cgPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkUm93ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmVtb3ZlTG9jYWxSb3coQ09MVU1OX0lELkVNUFRZX1JPV19WQUwpO1xuICB9XG5cbiAgcHJpdmF0ZSBvblNhdmVMb2NhbFJvdyhldmVudERhdGE6IElEYXRhVGFibGVSb3dTYXZlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kYXRhVGFibGVTZXJ2aWNlLmlzRW1wdHlSb3coZXZlbnREYXRhLnJvdykpIHtcbiAgICAgIHRoaXMuYWRkTG9jYWxSb3coZXZlbnREYXRhLnJvdywgZXZlbnREYXRhLnNhdmVEYXRhKTtcbiAgICAgIHRoaXMub25DaGFuZ2VMb2NhbERhdGEoQ2hhbmdlVHlwZS5ST1dfQURERUQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVkaXRMb2NhbFJvdyhldmVudERhdGEucm93LCBldmVudERhdGEuc2F2ZURhdGEpO1xuICAgICAgdGhpcy5vbkNoYW5nZUxvY2FsRGF0YShDaGFuZ2VUeXBlLlJPV19VUERBVEVEKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZExvY2FsUm93KHJvdzogSURhdGFUYWJsZVJvdywgc2F2ZURhdGE6IElLZXlWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuaGFzRW1wdHlSb3cgPSBmYWxzZTtcbiAgICB0aGlzLnNhdmVMb2NhbFJvdyhyb3csIHsgLi4uc2F2ZURhdGEsIGlkOiB0aGlzLmRhdGFUYWJsZVNlcnZpY2UuZ2V0TmV3Um93SWQoKSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZWRpdExvY2FsUm93KHJvdzogSURhdGFUYWJsZVJvdywgc2F2ZURhdGE6IElLZXlWYWx1ZSk6IHZvaWQge1xuICAgIHRoaXMuc2F2ZUxvY2FsUm93KHJvdywgc2F2ZURhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBzYXZlTG9jYWxSb3cocm93OiBJRGF0YVRhYmxlUm93LCBzYXZlRGF0YTogSUtleVZhbHVlKTogdm9pZCB7XG4gICAgdGhpcy5pc0VkaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnVwZGF0ZVJvd0RhdGEocm93LCBzYXZlRGF0YSk7XG4gICAgcm93LmlzRWRpdGluZyA9IGZhbHNlO1xuICAgIHRoaXMuZGV0ZWN0Um93Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVJvd0RhdGEocm93OiBJRGF0YVRhYmxlUm93LCBzYXZlRGF0YTogSUtleVZhbHVlKTogdm9pZCB7XG4gICAgT2JqZWN0LmFzc2lnbihyb3cuZGF0YSwgc2F2ZURhdGEpO1xuICAgIGlmICghaXNVbmRlZmluZWQocm93LmZvcm1Hcm91cCkpIHtcbiAgICAgIHRoaXMuZm9ybVNlcnZpY2UuZmlsbEZvcm0ocm93LmZvcm1Hcm91cCwgcm93LmRhdGEpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlTG9jYWxSb3cocmVtb3ZlUm93SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5yb3dzLmZpbmRJbmRleCgoeCkgPT4geC5kYXRhW0NPTFVNTl9JRC5QUk9QXSA9PT0gcmVtb3ZlUm93SWQpO1xuICAgIHRoaXMucm93cyA9IHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3dzV2l0aFJlbW92ZWRSb3cocmVtb3ZlUm93SWQsIHRoaXMucm93cyk7XG4gICAgaWYgKHRoaXMuaXNEZWZhdWx0Rmlyc3RSb3dTZWxlY3RlZCgpKSB7XG4gICAgICB0aGlzLnNlbGVjdEF1dG9OZXh0Um93KGluZGV4KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuZ3JpZE9wdGlvbnMuZGVmYXVsdEZpcnN0Um93U2VsZWN0aW9uICYmIHRoaXMucm93cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMub25Sb3dDbGlja2VkLmVtaXQoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucm93cy5sZW5ndGggJiYgdGhpcy5yb3dzLmxlbmd0aCAlIHRoaXMucGFnaW5hdGlvblBhcmFtcy5wYWdlU2l6ZSA9PT0gMCkge1xuICAgICAgdGhpcy5wYWdpbmF0aW9uUGFyYW1zLmN1cnJlbnRQYWdlLS07XG4gICAgICB0aGlzLnNlYXJjaGVkUm93Q291bnQkLm5leHQodGhpcy5yb3dzLmxlbmd0aCk7XG4gICAgfVxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWxlY3RBdXRvTmV4dFJvdyhpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgdGhpcy5lbWl0TmV4dFJvdyh0aGlzLnJvd3MubGVuZ3RoID09PSBpbmRleCA/IHRoaXMucm93cy5sZW5ndGggLSAxIDogaW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNEZWZhdWx0Rmlyc3RSb3dTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5kZWZhdWx0Rmlyc3RSb3dTZWxlY3Rpb247XG4gIH1cblxuICBwcml2YXRlIGVtaXROZXh0Um93KGluZGV4OiBudW1iZXIgPSAwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucm93cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJvd3MuZm9yRWFjaCgoeCkgPT4gKHguaXNTZWxlY3RlZCA9IGZhbHNlKSk7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93ID0gdGhpcy5yb3dzW2luZGV4XTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3cucm93SW5kZXggPSBpbmRleDtcbiAgICAgIHRoaXMucm93c1tpbmRleF0uaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIHRoaXMuZGF0YVRhYmxlQm9keS5kZXRlY3RDaGFuZ2UoKTtcbiAgICAgIHRoaXMub25Sb3dDbGlja2VkLmVtaXQodGhpcy5yb3dzW2luZGV4XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25Sb3dDbGlja2VkLmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZVJvd0VkaXRpbmcocm93OiBJRGF0YVRhYmxlUm93LCBpc0VkaXRpbmc6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmlzRWRpdGluZyA9IGlzRWRpdGluZztcbiAgICByb3cuaXNFZGl0aW5nID0gaXNFZGl0aW5nO1xuICAgIHRoaXMucm93cyA9IFsuLi50aGlzLnJvd3NdO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSB0b2dnbGVSb3dFeHBhbmRDb2xsYXBzZShyb3c6IElEYXRhVGFibGVSb3csIHNob3VsZEV4cGFuZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHJvdy5pc0V4cGFuZGVkID0gc2hvdWxkRXhwYW5kO1xuICAgIHRoaXMucm93cyA9IFsuLi50aGlzLnJvd3NdO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbXB0eVJvdyhkZXB0aDogbnVtYmVyLCBwYXJlbnRJZDogc3RyaW5nKTogSURhdGFUYWJsZVJvdyB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3coXG4gICAgICB0aGlzLmRhdGFUYWJsZVNlcnZpY2UuZ2V0RW1wdHlSb3dEYXRhKHRoaXMudmlld0NvbHVtbnMsIHRoaXMuZGVmYXVsdFJvd1ZhbHVlcyksXG4gICAgICBkZXB0aCxcbiAgICAgIHBhcmVudElkLFxuICAgICAgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIG9uQ2hhbmdlTG9jYWxEYXRhKGNoYW5nZVR5cGU6IENoYW5nZVR5cGUgPSBDaGFuZ2VUeXBlLk9USEVSKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2VMb2NhbERhdGEuZW1pdCh7XG4gICAgICByb3dzRGF0YTogdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd3NEYXRhRnJvbVJvd3ModGhpcy5yb3dzKSxcbiAgICAgIGNoYW5nZVR5cGUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGZpcmVJbml0Q29tcGxldGVkKCk6IHZvaWQge1xuICAgIHRoaXMub25Jbml0Q29tcGxldGVkLmVtaXQodGhpcy5nZXRHcmlkQXBpKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDbG9uZVJvdyhyb3c6IElEYXRhVGFibGVSb3csIGRlcHRoOiBudW1iZXIgPSBST1cuUk9PVF9ERVBUSCwgcGFyZW50SWQ6IHN0cmluZyA9IENPTFVNTl9JRC5OT19QQVJFTlRfVkFMKTogdm9pZCB7XG4gICAgdGhpcy5oYXNFbXB0eVJvdyA9IHRydWU7XG4gICAgcm93LmRhdGFbQ09MVU1OX0lELlBST1BdID0gQ09MVU1OX0lELkVNUFRZX1JPV19WQUw7XG4gICAgdGhpcy5ncmlkT3B0aW9ucy5jbG9uZU9wdGlvbnMuY29weU9mQ2xvbmFibGVQcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5OiBzdHJpbmcpID0+IHtcbiAgICAgIHJvdy5kYXRhW3Byb3BlcnR5XSA9IERhdGFUYWJsZUNvbnN0YW50cy5DT1BZX09GICsgcm93LmRhdGFbcHJvcGVydHldO1xuICAgIH0pO1xuXG4gICAgY29uc3QgZW1wdHlWYWx1ZUNvbHVtbnMgPSB0aGlzLnZpZXdDb2x1bW5zLmZpbHRlcigoY29sKSA9PiB7XG4gICAgICByZXR1cm4gdGhpcy5ncmlkT3B0aW9ucy5jbG9uZU9wdGlvbnMuZW1wdHlWYWx1ZVByb3BlcnRpZXMuaW5jbHVkZXMoY29sLnByb3ApO1xuICAgIH0pO1xuICAgIHRoaXMuZGF0YVRhYmxlU2VydmljZS5zZXRFbXB0eVZhbHVlc0luUm93RGF0YShyb3csIGVtcHR5VmFsdWVDb2x1bW5zKTtcblxuICAgIGNvbnN0IGNsb25lZFJvdyA9IHRoaXMuZGF0YVRhYmxlU2VydmljZS5nZXRSb3cocm93LmRhdGEsIGRlcHRoLCBwYXJlbnRJZCwgdHJ1ZSk7XG4gICAgdGhpcy5yb3dzID0gdGhpcy5kYXRhVGFibGVTZXJ2aWNlLmdldFJvd3NXaXRoSW5zZXJ0ZWRSb3cocGFyZW50SWQsIHRoaXMucm93cywgY2xvbmVkUm93KTtcbiAgICB0aGlzLnNlbGVjdGVkUm93ID0gY2xvbmVkUm93O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRHcmlkQXBpKCk6IEdyaWRBcGkge1xuICAgIHJldHVybiB0aGlzLmdyaWRBcGk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlYXJjaGFibGVDb2x1bW5zKGNvbHVtbnM6IElEYXRhVGFibGVDb2x1bW5bXSk6IElEYXRhVGFibGVDb2x1bW5bXSB7XG4gICAgY29uc3Qgc2VhcmNoYWJsZUNvbHVtbnMgPSBjb2x1bW5zLmZpbHRlcihcbiAgICAgIChpdGVtKSA9PiBPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChpdGVtLCAncHJvcCcpICYmIHRoaXMuZ3JpZE9wdGlvbnMuc2VhcmNoYWJsZVByb3BlcnRpZXMuaW5jbHVkZXMoaXRlbS5wcm9wKVxuICAgICk7XG4gICAgcmV0dXJuIHNlYXJjaGFibGVDb2x1bW5zLmxlbmd0aCA9PT0gMCA/IGNvbHVtbnMgOiBzZWFyY2hhYmxlQ29sdW1ucztcbiAgfVxuXG4gIHByaXZhdGUgbWFzdGVyVG9nZ2xlQ2xpZW50U2lkZSgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQWxsU2VsZWN0ZWQoKSA/IHRoaXMuc2VsZWN0aW9uLmNsZWFyKCkgOiB0aGlzLm5vbkRpc2FibGVkUm93cy5mb3JFYWNoKChyb3cpID0+IHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLmdyaWRBcGkuZGV0ZWN0Um93Q2hhbmdlcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhclByb3BlcnR5V2hlblNlbGVjdGlvbkVuYWJsZShjaGVja2VkUm93czogSURhdGFUYWJsZVJvd1tdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNSb3dTZWxlY3Rpb25FbmFibGUgJiYgY2hlY2tlZFJvd3MubGVuZ3RoKSB7XG4gICAgICBjaGVja2VkUm93cy5mb3JFYWNoKChzKSA9PiB7XG4gICAgICAgIGlmIChzLmhhc093blByb3BlcnR5KCdpc1NlbGVjdGVkJykpIHtcbiAgICAgICAgICBkZWxldGUgcy5pc1NlbGVjdGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzLmhhc093blByb3BlcnR5KCdyb3dJbmRleCcpKSB7XG4gICAgICAgICAgZGVsZXRlIHMucm93SW5kZXg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2hlY2tlZFJvd3MoKTogSUNoZWNrZWRSb3dFdmVudCB7XG4gICAgY29uc3QgY2hlY2tlZFJvd3MgPSB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZDtcbiAgICB0aGlzLmNsZWFyUHJvcGVydHlXaGVuU2VsZWN0aW9uRW5hYmxlKGNoZWNrZWRSb3dzKTtcbiAgICBjb25zdCBwYWdlTWF0Y2hlZFByZXZpb3VzQ2hlY2tlZFJvd3MgPSB0aGlzLnJvd3MuZmlsdGVyKChyb3cpID0+IHtcbiAgICAgIHJldHVybiBjaGVja2VkUm93cy5zb21lKChpdGVtKSA9PiBKU09OLnN0cmluZ2lmeShyb3cpID09PSBKU09OLnN0cmluZ2lmeShpdGVtKSk7XG4gICAgfSk7XG4gICAgY29uc3QgcGFnZVVubWF0Y2hlZENoZWNrZWRSb3dzID0gY2hlY2tlZFJvd3MuZmlsdGVyKChlKSA9PiB7XG4gICAgICByZXR1cm4gcGFnZU1hdGNoZWRQcmV2aW91c0NoZWNrZWRSb3dzLmZpbmRJbmRleCgobSkgPT4gSlNPTi5zdHJpbmdpZnkoZSkgPT09IEpTT04uc3RyaW5naWZ5KG0pKSA8IDA7XG4gICAgfSk7XG4gICAgcmV0dXJuIHsgcGFnZU1hdGNoZWRQcmV2aW91c0NoZWNrZWRSb3dzOiBwYWdlTWF0Y2hlZFByZXZpb3VzQ2hlY2tlZFJvd3MsIHBhZ2VVbm1hdGNoZWRDaGVja2VkUm93czogcGFnZVVubWF0Y2hlZENoZWNrZWRSb3dzIH07XG4gIH1cblxuICBwcml2YXRlIG1hc3RlclRvZ2dsZVNlcnZlclNpZGUoKTogdm9pZCB7XG4gICAgY29uc3QgcHJldmlvdXNDaGVja2VkUm93czogSUNoZWNrZWRSb3dFdmVudCA9IHRoaXMuZ2V0Q2hlY2tlZFJvd3MoKTtcbiAgICB0aGlzLnNlbGVjdGlvbi5jbGVhcigpO1xuICAgIHRoaXMuYWRkVW5tYXRjaGVkUm93VG9TZWxlY3Rpb24ocHJldmlvdXNDaGVja2VkUm93cy5wYWdlVW5tYXRjaGVkQ2hlY2tlZFJvd3MpO1xuICAgIGlmICh0aGlzLnJvd3MubGVuZ3RoICE9PSBwcmV2aW91c0NoZWNrZWRSb3dzLnBhZ2VNYXRjaGVkUHJldmlvdXNDaGVja2VkUm93cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucm93cy5mb3JFYWNoKChyb3cpID0+IHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpKTtcbiAgICB9XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5ncmlkQXBpLmRldGVjdFJvd0NoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVW5tYXRjaGVkUm93VG9TZWxlY3Rpb24ocm93czogSURhdGFUYWJsZVJvd1tdKTogdm9pZCB7XG4gICAgcm93cy5mb3JFYWNoKChyb3cpID0+IHRoaXMuc2VsZWN0aW9uLnNlbGVjdChyb3cpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Um93Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91c0NoZWNrZWRSb3dzOiBJQ2hlY2tlZFJvd0V2ZW50ID0gdGhpcy5nZXRDaGVja2VkUm93cygpO1xuICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyKCk7XG4gICAgdGhpcy5hZGRVbm1hdGNoZWRSb3dUb1NlbGVjdGlvbihwcmV2aW91c0NoZWNrZWRSb3dzLnBhZ2VVbm1hdGNoZWRDaGVja2VkUm93cyk7XG5cbiAgICB0aGlzLnJvd3NcbiAgICAgIC5maWx0ZXIoKGUpID0+IHtcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzQ2hlY2tlZFJvd3MucGFnZU1hdGNoZWRQcmV2aW91c0NoZWNrZWRSb3dzLnNvbWUoKGl0ZW0pID0+IEpTT04uc3RyaW5naWZ5KGUpID09PSBKU09OLnN0cmluZ2lmeShpdGVtKSk7XG4gICAgICB9KVxuICAgICAgLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICB0aGlzLnNlbGVjdGlvbi5zZWxlY3Qocm93KTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgdGhpcy5ncmlkQXBpLmRldGVjdFJvd0NoYW5nZXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmlsdGVyZWREYXRhUm93KGRhdGFSb3dzOiBJRGF0YVRhYmxlUm93W10pOiBJRGF0YVRhYmxlUm93W10ge1xuICAgIHJldHVybiBkYXRhUm93cy5maWx0ZXIoKGUpID0+IHtcbiAgICAgIHJldHVybiB0aGlzLmZpbHRlcmVkUm93cy5zb21lKChpdGVtKSA9PiBKU09OLnN0cmluZ2lmeShlLmRhdGEpID09PSBKU09OLnN0cmluZ2lmeShpdGVtLmRhdGEpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29sdW1uU291cmNlKHByb3BlcnR5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBzb3VyY2U6IHN0cmluZztcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ3JpZE9wdGlvbnMubWV0YURhdGFDb2x1bW5zLmZpbmRJbmRleCgodmFsdWU6IHN0cmluZykgPT4gdmFsdWUgPT09IHByb3BlcnR5KTtcbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgc291cmNlID0gdGhpcy5zb3VyY2VUeXBlcy5NRVRBREFUQTtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlID0gdGhpcy5zb3VyY2VUeXBlcy5EQVRBX1NPVVJDRTtcbiAgICB9XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29sdW1uc1VzaW5nU3RvcmVkRGF0YShkZWZhdWx0Q29sdW1uczogSURhdGFUYWJsZUNvbHVtbltdKTogSURhdGFUYWJsZUNvbHVtbltdIHtcbiAgICBsZXQgdGVtcENvbGxlY3Rpb246IElEYXRhVGFibGVDb2x1bW5bXSA9IFtdO1xuICAgIHRlbXBDb2xsZWN0aW9uID0gZGVmYXVsdENvbHVtbnMuZmlsdGVyKCh4KSA9PiB4ICE9IHVuZGVmaW5lZCk7XG4gICAgaWYgKCF0aGlzLnN0b3JhZ2VLZXkpIHtcbiAgICAgIHJldHVybiB0ZW1wQ29sbGVjdGlvbjtcbiAgICB9XG4gICAgbGV0IHN0b3JlZENvbHVtbnMgPSB0aGlzLmxvY2FsU3RvcmFnZVNlcnZpY2UuZ2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXkpO1xuICAgIGlmIChzdG9yZWRDb2x1bW5zICYmIHN0b3JlZENvbHVtbnMubGVuZ3RoKSB7XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgc3RvcmVkQ29sdW1uc1xuICAgICAgICAuZmlsdGVyKCh4KSA9PiB4ICE9IHVuZGVmaW5lZClcbiAgICAgICAgLmZvckVhY2goKGl0ZW06IExpc3RJdGVtKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdDb2x1bW5JbmRleCA9IHRlbXBDb2xsZWN0aW9uLmZpbmRJbmRleCgoeCkgPT4geC5wcm9wID09PSBpdGVtLnByb3ApO1xuICAgICAgICAgIGlmIChleGlzdGluZ0NvbHVtbkluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ29sdW1uID0gdGVtcENvbGxlY3Rpb24uZmluZCgoeCkgPT4geC5wcm9wID09PSBpdGVtLnByb3ApO1xuICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ29sdW1uKSB7XG4gICAgICAgICAgICAgIGV4aXN0aW5nQ29sdW1uLmlzVmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgIHZhciB0ZW1wY29sdW1uID0gdGVtcENvbGxlY3Rpb25baW5kZXhdO1xuICAgICAgICAgICAgICB0ZW1wQ29sbGVjdGlvbltpbmRleF0gPSBleGlzdGluZ0NvbHVtbjtcbiAgICAgICAgICAgICAgdGVtcENvbGxlY3Rpb25bZXhpc3RpbmdDb2x1bW5JbmRleF0gPSB0ZW1wY29sdW1uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9KTtcbiAgICAgIC8vIGFkZGVkIGludmlzaWJsZSBjb2x1bW5zIGF0IHRoZSBlbmQgdG8gY29tcGxldGUgdGhlIHNldFxuICAgICAgdGVtcENvbGxlY3Rpb25cbiAgICAgICAgLmZpbHRlcigoaXRlbSkgPT4gaXRlbSAmJiBzdG9yZWRDb2x1bW5zLmZpbmRJbmRleCgoeCkgPT4geC5wcm9wID09PSBpdGVtLnByb3ApIDwgMClcbiAgICAgICAgLmZvckVhY2goKGl0ZW06IElEYXRhVGFibGVDb2x1bW4pID0+IHtcbiAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgaXRlbS5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0ZW1wQ29sbGVjdGlvbjtcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0ZWRDaGVja2JveFBhZ2luZ0NvbmZpcm1hdGlvbihzZWxlY3RhYmxlSW5kZXg/OiBudW1iZXIgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxDb21tb25Db25maXJtTW9kYWxDb21wb25lbnQ+ID0gdGhpcy5tYXREaWFsb2cub3BlbihDb21tb25Db25maXJtTW9kYWxDb21wb25lbnQsIHtcbiAgICAgIHdpZHRoOiAnNDUwcHgnLFxuICAgICAgZGF0YToge1xuICAgICAgICBib2R5OiB0aGlzLmNvbmZpcm1hdGlvbk1zZ1BhZ2luYXRpb24sXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGRpYWxvZ1JlZlxuICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5waXBlKClcbiAgICAgIC5zdWJzY3JpYmUoKGNvbmZpcm1hdGlvbikgPT4ge1xuICAgICAgICBpZiAoY29uZmlybWF0aW9uKSB7XG4gICAgICAgICAgdGhpcy5zZXREYXRhKHNlbGVjdGFibGVJbmRleCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NlbGVjdGVkUm93KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ3JpZEFwaS5nZXRTZWxlY3RlZFJvd3MoKS5tYXAoKHgpID0+IHguZGF0YSkubGVuZ3RoO1xuICB9XG5cbiAgcHJpdmF0ZSBzZWFyY2hUYWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbHRlcigocmVzOiBzdHJpbmcpID0+IHJlcy5sZW5ndGggPj0gMiB8fCByZXMgPT09ICcnKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKDUwMCksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmNsZWFyU3VicyQpXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmlzU2VhcmNoRGlzYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLnBhZ2luYXRpb25QYXJhbXMuY3VycmVudFBhZ2UgPSAxO1xuICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgIHRoaXMuc2V0RGF0YSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcG9wdWxhdGVGaWx0ZXJQYXJhbXMoKTogSUZpbHRlclBhcmFtW10ge1xuICAgIGlmICghdGhpcy5ncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uICYmIHRoaXMuZ3JpZE9wdGlvbnMuaXNTZWFyY2hCb3hWaXNpYmxlICYmICF0aGlzLmdyaWRPcHRpb25zLmlzVXBkYXRlZFRhYmxlRGVzaWduKSB7XG4gICAgICByZXR1cm4gW3sgY29sdW1uTmFtZTogJ3NlYXJjaFRleHQnLCBmaWx0ZXJWYWx1ZTogdGhpcy5zZWFyY2hWYWx1ZS52YWx1ZSB9LCAuLi50aGlzLmZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW1zKCldO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5maWx0ZXJNYW5hZ2VyLmdldEZpbHRlclBhcmFtcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb25maWd1cmVkQ29sdW1ucygpOiB2b2lkIHtcbiAgICBpZiAoaXNGdW5jdGlvbih0aGlzLmdyaWRPcHRpb25zLnN0b3JhZ2VGbikpIHtcbiAgICAgIHRoaXMuc3RvcmFnZUtleSA9IHRoaXMuZ3JpZE9wdGlvbnMuc3RvcmFnZUZuKCk7XG4gICAgICBsZXQgY29sdW1ucyA9IHRoaXMuc2V0Q29sdW1uc1VzaW5nU3RvcmVkRGF0YSh0aGlzLmNvbHVtbnMpO1xuICAgICAgdGhpcy52aWV3Q29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKCh4KSA9PiB4ICE9IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUNvbHVtbnMocm93RGF0YTogSUtleVZhbHVlW10pOiB2b2lkIHtcbiAgICB0aGlzLmNvbHVtbnMgPSBPYmplY3Qua2V5cyhyb3dEYXRhWzBdKS5tYXAoKHgpID0+IHtcbiAgICAgIHJldHVybiA8SURhdGFUYWJsZUNvbHVtbj57XG4gICAgICAgIGhlYWRlcjogeC50b1VwcGVyQ2FzZSgpLFxuICAgICAgICBwcm9wOiB4LFxuICAgICAgICB0eXBlOiBDb2x1bW5UeXBlcy5TdHJpbmcsXG4gICAgICAgIHJlbmRlcmVyVGVtcGxhdGU6IHRoaXMuZ3JpZE9wdGlvbnMucmVuZGVyVGVtcGxhdGVzUHJvcCA/IHRoaXMuZ3JpZE9wdGlvbnMucmVuZGVyVGVtcGxhdGVzUHJvcFt4XSA6IHVuZGVmaW5lZCxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5pbml0Q29sdW1ucygpO1xuICAgIHRoaXMuZGVmYXVsdFNvcnRlZENvbHVtbnMgPSBjbG9uZSh0aGlzLnZpZXdDb2x1bW5zKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxufVxuIiwiPGRpdj5cbiAgICA8c2VjdGlvbiBjbGFzcz1cImFjdGlvbnNcIj5cbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzZWFyY2hcIiAqbmdJZj1cImdyaWRPcHRpb25zLmlzU2VhcmNoQm94VmlzaWJsZSAmJiAhZ3JpZE9wdGlvbnMuaXNVcGRhdGVkVGFibGVEZXNpZ25cIj5cbiAgICAgICAgICAgIDxmb3JtIG5nRm9ybT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoYmFyLXdyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzdmctaWNvbiBmYS1zb2xpZCBmYS1tYWduaWZ5aW5nLWdsYXNzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cIlNlYXJjaCB7eyBzZWFyY2hQbGFjZWhvbGRlciB9fVwiIG5hbWU9XCJzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInNlYXJjaFZhbHVlXCIgW2Rpc2FibGVkXT1cImlzU2VhcmNoRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoTW9kZWxDaGFuZ2VkKClcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyXCIgKm5nSWY9XCIhZ3JpZE9wdGlvbnMuaGlkZVRvcFRvb2xiYXJcIj5cbiAgICAgICAgICAgIDxzZWN0aW9uICpuZ0lmPVwiIWlzT25seVZpZXdcIiBjbGFzcz1cImFkZGluZ1wiPlxuICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInJvdy1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKmhhc1Blcm1pc3Npb249XCJnZXRBY3Rpb25OYW1lKGFjdGlvblR5cGVzLkFERClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cIiFncmlkT3B0aW9ucy5hZGRCdXR0b25UZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzVGFibGVJbkVkaXRTdGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwib25DbGlja0FkZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnOiBpc0Rpc2FibGVkTWFpbkFjdGlvbihhY3Rpb25UeXBlcy5BREQpIHx8IChncmlkT3B0aW9ucy5kaXNhYmxlSWNvbnMgJiYgZ3JpZE9wdGlvbnMuZGlzYWJsZUljb25zLmFkZCQgfGFzeW5jKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHRpdGxlPVwie3tnZXRUb29sdGlwVGV4dCh0b29sVGlwcy5BREQpfX1cIiBjbGFzcz1cInRvb2xiYXItaWNvbiBpY29uLXBsdXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIihpc0Rpc2FibGVkTWFpbkFjdGlvbihhY3Rpb25UeXBlcy5BREQpIHx8IChncmlkT3B0aW9ucy5kaXNhYmxlSWNvbnMgJiYgZ3JpZE9wdGlvbnMuZGlzYWJsZUljb25zLmFkZCQgfGFzeW5jKSk/ICdpY29uLWluYWN0aXZlJzogJ2ljb24tYWN0aXZlJ1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZE9wdGlvbnMuYWRkQnV0dG9uVGVtcGxhdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ3JpZE9wdGlvbnMuYWRkQnV0dG9uVGVtcGxhdGU7XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNMb2FkaW5nJC5nZXRWYWx1ZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtZGF0YS10YWJsZS1hY3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiEoaXNPbmx5VmlldyAmJiAhaXNWaWV3QWN0aW9uVmlzaWJsZSkgJiYgIWdyaWRPcHRpb25zLmlzUm93QWN0aW9uVmlzaWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZ3JpZEFwaV09XCJncmlkQXBpXCIgW2NhbklubGluZUVkaXRdPVwiY2FuSW5saW5lRWRpdFwiIFtpc1RyZWVHcmlkXT1cImlzVHJlZUdyaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCIgW3NlbGVjdGVkUm93XT1cInNlbGVjdGVkUm93XCIgW2lzSWNvbnNEaXNhYmxlZF09XCJpc0FjdGlvbnNEaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNFZGl0aW5nXT1cInNlbGVjdGVkUm93Py5pc0VkaXRpbmdcIiBbaXNTYXZpbmddPVwic2VsZWN0ZWRSb3c/LmlzU2F2aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc09ubHlWaWV3XT1cImlzT25seVZpZXdcIiBbaXNFZGl0YWJsZV09XCJpc0VkaXRhYmxlXCIgKGNsaWNrQWRkKT1cIm9uQ2xpY2tBZGQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaGFzRW1wdHlSb3ddPVwiaGFzRW1wdHlSb3dcIiBbaXNFZGl0aW5nXT1cImlzRWRpdGluZ1wiIFtpc1NhdmluZ109XCJpc1NhdmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNDbG9uZVZpc2libGVdPVwiaXNDbG9uZVZpc2libGVcIiBbaXNEZWxldGVWaXNpYmxlXT1cIiFjaGVja0RlbGV0ZURpc2FibGVkKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9hcHAtZGF0YS10YWJsZS1hY3Rpb25zPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwicm93LWFjdGlvbnNcIiAqbmdJZj1cIiFpc09ubHlWaWV3IHx8IGdyaWRPcHRpb25zLmlzVG9wTGVmdEFjdGlvbnNGb3JjZURpc3BseVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBncmlkT3B0aW9ucy50b3BMZWZ0QWRkaXRpb25hbEFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKmhhc1Blcm1pc3Npb249XCJnZXRMZWZ0QWN0aW9uTmFtZShhY3Rpb24uYWN0aW9uTmFtZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnOiBhY3Rpb24uaXNEaXNhYmxlZH1cIiAoY2xpY2spPVwiQWN0aW9uQ2xpY2tIYW5kbGVyKGFjdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9udEljb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHAtaWNvbiAqbmdJZj1cIiFhY3Rpb24uaXNDbGFzc1wiIFt0aXRsZV09XCJnZXRMZWZ0UmlnaHRBY3Rpb25UZXh0KGFjdGlvbilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmFtZV09XCJhY3Rpb24uaWNvbk9yQ2xhc3NOYW1lXCI+PC9hcHAtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImFjdGlvbi5pc0NsYXNzXCIgdGl0bGU9XCJ7e2dldExlZnRSaWdodEFjdGlvblRleHQoYWN0aW9uKX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0b29sYmFyLWljb24ge3sgYWN0aW9uLmljb25PckNsYXNzTmFtZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIihhY3Rpb24uYWN0aW9uTmFtZT09PWFjdGlvblR5cGVzLlVQTE9BRCAmJiBhY3Rpb24uaXNEaXNhYmxlZCk/ICdpY29uLWluYWN0aXZlJzogJydcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cImFjdGlvbi5sb2FkaW5nJCB8IGFzeW5jXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgY2xhc3M9XCJtci0xIGFjdGlvbi1sb2FkZXJcIiBbZGlhbWV0ZXJdPVwiMjVcIj48L21hdC1zcGlubmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWRPcHRpb25zLmxlZnRBY3Rpb25CdG5UZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJncmlkT3B0aW9ucy5sZWZ0QWN0aW9uQnRuVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b29sYmFyLXNwYWNlclwiPjwvc3Bhbj5cblxuICAgICAgICAgICAgPHVsIGNsYXNzPVwicm93LWFjdGlvbnNcIj5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGFjdGlvbiBvZiBncmlkT3B0aW9ucy50b3BSaWdodEFjdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgKGNsaWNrKT1cIkFjdGlvbkNsaWNrSGFuZGxlcihhY3Rpb24pXCIgY2xhc3M9XCJmb250SWNvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pY29uIFt0aXRsZV09XCJnZXRMZWZ0UmlnaHRBY3Rpb25UZXh0KGFjdGlvbilcIiBbbmFtZV09XCJhY3Rpb24uaWNvblwiPjwvYXBwLWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZE9wdGlvbnMuaXNVcGRhdGVkVGFibGVEZXNpZ25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZE9wdGlvbnMubmV3VGFibGVCdXR0b250ZW1wbGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZ3JpZE9wdGlvbnMubmV3VGFibGVCdXR0b250ZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDxzZWN0aW9uIGNsYXNzPVwic2VhcmNoXCIgKm5nSWY9XCJncmlkT3B0aW9ucy5pc1NlYXJjaEJveFZpc2libGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGZvcm0gbmdGb3JtPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaGJhci13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJzdmctaWNvbiBmYS1zb2xpZCBmYS1tYWduaWZ5aW5nLWdsYXNzXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwiU2VhcmNoXCIgbmFtZT1cInNlYXJjaFwiIFtmb3JtQ29udHJvbF09XCJzZWFyY2hWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc1NlYXJjaERpc2FibGVkXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoTW9kZWxDaGFuZ2VkKClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICA8L3NlY3Rpb24+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdyaWRPcHRpb25zLmlzRmlsdGVyRW5hYmxlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwic2hvd0hpZGVGaWx0ZXJWaWV3KClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxlbSBjbGFzcz1cImZhcyBmYS1maWx0ZXIgaW5hY3RpdmUtZmlsdGVyXCIgW25nQ2xhc3NdPVwieydhY3RpdmUtZmlsdGVyJzogaXNGaWx0ZXJBcHBsaWVkIH1cIj48L2VtPlxuICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIFt0aXRsZV09XCInQ2xlYXInXCIgKGNsaWNrKT1cImNsZWFyR2xvYmFsRmlsdGVyKClcIiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJmYXMgZmEtYnJvb21cIj48L2VtPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJyb3ctYWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgIDxsaSAqbmdJZj1cIiFncmlkT3B0aW9ucy5oaWRlQ29sdW1uQ29uZmlndXJhdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8YSAoY2xpY2spPVwib3BlbkNvbHVtblNob3dIaWRlRGlhbG9ndWUoKVwiIGNsYXNzPVwiZm9udEljb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1pY29uIFt0aXRsZV09XCJnZXRUb29sdGlwVGV4dCh0b29sVGlwcy5DT0xVTU5fQ09ORklHVVJBVElPTilcIiBbbmFtZV09XCJJQ09OUy5Db2x1bW5TZWxlY3RvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuXG4gICAgICAgIDwvZGl2PlxuICAgIDwvc2VjdGlvbj5cbjwvZGl2PlxuXG48bWF0LWNhcmQgY2xhc3M9XCJ0YWJsZS1jYXJkXCIgW25nQ2xhc3NdPVwieyd0cmFuc3BhcmVudC10YWJsZS1kZXNpZ24nOiBncmlkT3B0aW9ucy5pc1RyYW5zcGFyZW50VGFibGVEZXNpZ259XCI+XG4gICAgPGFwcC1sb2FkZXIgKm5nSWY9XCJpc0xvYWRpbmckIHwgYXN5bmNcIiBjbGFzcz1cImxvYWRlci1taWRkbGVcIj48L2FwcC1sb2FkZXI+XG5cbiAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgICAgPGRpdiBjbGFzcz1cImN1c3RvbS1kYXRhLXRhYmxlXCIgW25nQ2xhc3NdPVwieydkZWZhdWx0LXRhYmxlLWhlaWdodCc6IGlzTG9hZGluZyQuZ2V0VmFsdWUoKSwgJ292ZXJmbG93LXZpc2libGUnOiBncmlkT3B0aW9ucy5pc0FjY29yZGlvblRhYmxlIH1cIlxuICAgICAgICAgICAgKHNjcm9sbCk9XCJvblRhYmxlU2Nyb2xsZWQoJGV2ZW50KVwiICNjdXN0b21EYXRhVGFibGUgW25nU3R5bGVdPVwiZ2V0Q3VzdG9tVGFibGVTdHlsZVwiPlxuICAgICAgICAgICAgPHRhYmxlIGFyaWEtZGVzY3JpYmVkYnk9XCJHZW5lcmljIGRhdGEgdGFibGVcIiAqbmdJZj1cIiFncmlkT3B0aW9ucy5pc0FjY29yZGlvblRhYmxlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInRhYmxlIGFwb2xsby1kZXNpZ24tbmV3LWRhdGEtdGFibGVcIiBbbmdDbGFzc109XCJ7ICctdHJlZSc6IGlzVHJlZUdyaWQgfVwiIG1kYlRhYmxlPlxuICAgICAgICAgICAgICAgIDx0aGVhZCAqbmdJZj1cIiFncmlkT3B0aW9ucy5oaWRlVGFibGVIZWFkZXJcIiBjbGFzcz1cInN0aWNreS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiZ3JpZE9wdGlvbnMuaXNVcGRhdGVkVGFibGVEZXNpZ24gJiYgaXNGaWx0ZXJWaWV3XCIgY2xhc3M9XCJ0YWJsZS1maXJzdC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImlzUm93U2VsZWN0aW9uRW5hYmxlXCIgc2NvcGU9XCJjb2xcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmlld0NvbHVtbiBvZiB2aWV3Q29sdW1uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cInZpZXdDb2x1bW4uaXNWaXNpYmxlXCIgc2NvcGU9XCJjb2xcIiBjbGFzcz1cImhlYWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsndHJhbnNwYXJlbnQnOiAhdmlld0NvbHVtbi5pc01ldGFEYXRhQ29sdW1uICYmIGdyaWRPcHRpb25zLmlzVXBkYXRlZFRhYmxlRGVzaWdufVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwLWRhdGEtY29sLWZpbHRlciAqbmdJZj1cImlzRmlsdGVyRW5hYmxlKHZpZXdDb2x1bW4ucHJvcClcIiBbY29sdW1uTmFtZV09XCJ2aWV3Q29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZmlsdGVyZWRDb2x1bW4nOiBpc0ZpbHRlcmVkQ29sdW1uKHZpZXdDb2x1bW4ucHJvcCl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkZpbHRlckNsaWNrZWQpPVwib25GaWx0ZXJDbGlja2VkKCRldmVudClcIiBbZmlsdGVyT3B0aW9uXT1cInZpZXdDb2x1bW4uZmlsdGVyT3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtudW1iZXJPZlRhYmxlUmVmcmVzaF09XCJudW1iZXJPZlRhYmxlUmVmcmVzaFwiIFtpc1VwZGF0ZWRGaWx0ZXJEZXNpZ25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaXNDbGVhckZpbHRlciRdPVwiaXNDbGVhckZpbHRlciRcIiBbZmlsdGVyUGFyYW1dPVwiZ2V0RmlsdGVyUGFyYW0odmlld0NvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtZGF0YS1jb2wtZmlsdGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwidGFibGUtc2Vjb25kLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiaXNSb3dTZWxlY3Rpb25FbmFibGUgICYmICFpc1NpbmdsZVNlbGVjdFwiIHNjb3BlPVwiY29sXCIgY2xhc3M9XCJoYXNTZWxlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNoZWNrYm94IGNsYXNzPVwidGFibGUtaGVhZGVyLWNoZWNrYm94XCIgKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwibWFzdGVyU2VsZWN0aW9uXCIgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0aCBzY29wZT1cImNvbFwiICpuZ0lmPVwiaXNSb3dTZWxlY3Rpb25FbmFibGUgJiYgaXNTaW5nbGVTZWxlY3RcIiBjbGFzcz1cImhhc1NlbGVjdGlvblwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2aWV3Q29sdW1uIG9mIHZpZXdDb2x1bW5zOyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwidmlld0NvbHVtbi5pc1Zpc2libGVcIiBzY29wZT1cImNvbFwiIGNsYXNzPVwiaGVhZGVyXCIgW2F0dHIuZGF0YS1jb2x1bW4tcHJvcF09XCJ2aWV3Q29sdW1uLnByb3BcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3RyYW5zcGFyZW50JzogIXZpZXdDb2x1bW4uaXNNZXRhRGF0YUNvbHVtbiAmJiBncmlkT3B0aW9ucy5pc1VwZGF0ZWRUYWJsZURlc2lnbn1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJnZXRIZWFkZXJTdHlsZShpLCB2aWV3Q29sdW1uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1kYXRhLWNvbC1maWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzRmlsdGVyRW5hYmxlKHZpZXdDb2x1bW4ucHJvcCkgJiYgIWdyaWRPcHRpb25zLmlzVXBkYXRlZFRhYmxlRGVzaWduXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uTmFtZV09XCJ2aWV3Q29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZpbHRlcmVkQ29sdW1uJzogaXNGaWx0ZXJlZENvbHVtbih2aWV3Q29sdW1uLnByb3ApfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRmlsdGVyQ2xpY2tlZCk9XCJvbkZpbHRlckNsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlck9wdGlvbl09XCJ2aWV3Q29sdW1uLmZpbHRlck9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW251bWJlck9mVGFibGVSZWZyZXNoXT1cIm51bWJlck9mVGFibGVSZWZyZXNoXCIgW2lzQ2xlYXJGaWx0ZXIkXT1cImlzQ2xlYXJGaWx0ZXIkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyUGFyYW1dPVwiZ2V0RmlsdGVyUGFyYW0odmlld0NvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWRhdGEtY29sLWZpbHRlcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJoZWFkZXJcIiBbbmdDbGFzc109XCJ7J3NvcnQtY29sdW1uJzogaXNTb3J0Q29sdW1uKHZpZXdDb2x1bW4pfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNvcnRUYWJsZSh2aWV3Q29sdW1uKVwiPnt7IHZpZXdDb2x1bW4uaGVhZGVyIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdDb2x1bW4uaGVhZGVySWNvbkNsYXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaGVhZGVyLWljb25cIiBbbmdDbGFzc109XCJ2aWV3Q29sdW1uLmhlYWRlckljb25DbGFzc1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvcnQtaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic29ydGVkQ29sdW1uW3ZpZXdDb2x1bW4ucHJvcF09PT0gc29ydERpcmVjdGlvbkVudW0uREVTQ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3dfZG93bndhcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzb3J0LWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNvcnRlZENvbHVtblt2aWV3Q29sdW1uLnByb3BdPT09IHNvcnREaXJlY3Rpb25FbnVtLkFTQ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW0gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyb3dfdXB3YXJkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiZ3JpZE9wdGlvbnMuaXNVcGRhdGVkVGFibGVEZXNpZ24gJiYgaXNGaWx0ZXJlZENvbHVtbih2aWV3Q29sdW1uLnByb3ApXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtIGNsYXNzPVwiZmFzIGZhLWZpbHRlciBhY3RpdmUtZmlsdGVyXCI+PC9lbT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdyaWRPcHRpb25zLmRyYWdnYWJsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnaGVhZGVyLXNlcGFyYXRvcic6IHRydWUsICdjb2wtcmVzaXplLWN1cnNvcic6IHZpZXdDb2x1bW4uZHJhZ2dhYmxlIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25TZXBhcmF0b3JNb3VzZURvd24oJGV2ZW50LCBpLCB2aWV3Q29sdW1uKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRibGNsaWNrKT1cIm9uRG91YmxlQ2xpY2tTZXBhcmF0b3IoaSwgdmlld0NvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggKm5nSWY9XCIhKGlzT25seVZpZXcgJiYgIWlzVmlld0FjdGlvblZpc2libGUpICYmIGdyaWRPcHRpb25zLmlzUm93QWN0aW9uVmlzaWJsZVwiIHNjb3BlPVwiY29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uczwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGggW25nQ2xhc3NdPVwieyd0cmFuc3BhcmVudCc6IGdyaWRPcHRpb25zLmlzVXBkYXRlZFRhYmxlRGVzaWdufVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJncmlkT3B0aW9ucy5ncmlkTWVudU9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMuZ3JpZE1lbnVPcHRpb25zLmlzTWVudUVuYWJsZWRcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ3JpZE9wdGlvbnMuaGFzRml4ZWRGaXJzdFJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0lmPVwiIShpc0xvYWRpbmckIHwgYXN5bmMpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoICpuZ0lmPVwiaXNSb3dTZWxlY3Rpb25FbmFibGUgICYmICFpc1NpbmdsZVNlbGVjdFwiIGNsYXNzPVwidHJhbnNwYXJlbnRcIj48L3RoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImlzUm93U2VsZWN0aW9uRW5hYmxlICYmIGlzU2luZ2xlU2VsZWN0XCIgY2xhc3M9XCJ0cmFuc3BhcmVudFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdmlld0NvbHVtbiBvZiB2aWV3Q29sdW1uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ0cmFuc3BhcmVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwidmlld0NvbHVtbi5maXhlZEZpcnN0Um93VGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGNvbDogdmlld0NvbHVtbiB9IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgPHRib2R5ICpuZ0lmPVwiIWlzTG9hZGluZyQuZ2V0VmFsdWUoKVwiIGFwcC1kYXRhLXRhYmxlLWJvZHkgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGlvbl09XCJzZWxlY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICBbcm93c109XCJyb3dzIHwgY29sdW1uRmlsdGVyIDogZmlsdGVyTWFuYWdlci5nZXRGaWx0ZXJQYXJhbXMoKSA6IGNvbHVtbnM6IGdyaWRPcHRpb25zLmlzQ2xpZW50U2lkZVBhZ2luYXRpb25cIlxuICAgICAgICAgICAgICAgICAgICBbdmlld0NvbHVtbnNdPVwidmlld0NvbHVtbnNcIiBbY2FuSW5saW5lRWRpdF09XCJjYW5JbmxpbmVFZGl0XCIgW2lzVHJlZUdyaWRdPVwiaXNUcmVlR3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIFtpc09ubHlWaWV3XT1cImlzT25seVZpZXdcIiBbc2VhcmNoZWRSb3dDb3VudCRdPVwic2VhcmNoZWRSb3dDb3VudCRcIiBbb25BZGRDbGlja109XCJvbkFkZENsaWNrXCJcbiAgICAgICAgICAgICAgICAgICAgW2lzT25seVZpZXdSb3ddPVwiaXNPbmx5Vmlld1Jvd1wiIFtpc0RlbGV0ZURpc2FibGVkXT1cImlzRGVsZXRlRGlzYWJsZWRcIiBbc2VhcmNoXT1cInNlYXJjaFZhbHVlLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3BhZ2luYXRpb25QYXJhbXNdPVwicGFnaW5hdGlvblBhcmFtc1wiIFtoYXNFbXB0eVJvd109XCJoYXNFbXB0eVJvd1wiIFtpc0VkaXRpbmddPVwiaXNFZGl0aW5nXCJcbiAgICAgICAgICAgICAgICAgICAgW2lzUm93U2VsZWN0aW9uRW5hYmxlXT1cImlzUm93U2VsZWN0aW9uRW5hYmxlXCIgW3NlYXJjaENvbHVtbnNdPVwic2VhcmNoQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgIFtpc0Nsb25lVmlzaWJsZV09XCJpc0Nsb25lVmlzaWJsZVwiIChjbGlja0VkaXQpPVwib25DbGlja0VkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja0Nsb25lKT1cIm9uQ2xpY2tDbG9uZSgkZXZlbnQpXCIgKGNsaWNrQWN0aW9uKT1cIm9uQ2xpY2tBY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja0VkaXRDYW5jZWwpPVwib25DbGlja0VkaXRDYW5jZWwoJGV2ZW50KVwiIChjbGlja0VkaXRTYXZlKT1cIm9uQ2xpY2tFZGl0U2F2ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrRGVsZXRlKT1cIm9uQ2xpY2tEZWxldGVSb3coJGV2ZW50KVwiIChjbGlja1ZpZXcpPVwib25DbGlja1ZpZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGlja0FkZCk9XCJvbkNsaWNrUm93QWRkKCRldmVudClcIiAoY2xpY2tSb3cpPVwib25DbGlja1JvdygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV4cGFuZENvbGxhcHNlKT1cIm9uQ2hhbmdlRXhwYW5kQ29sbGFwc2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjb21wbGV4RGV0YWlsQ2xpY2tlZCk9XCJDb21wbGV4RGV0YWlsQ2xpY2tlZCgkZXZlbnQpXCIgW2lzUm93VW5jaGVja2VkXT1cImlzUm93VW5jaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgKENoZWNrYm94U2VsZWN0KT1cImlzQ2hlY2tib3hTZWxlY3QoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XG5cbiAgICAgICAgICAgIDwvdGFibGU+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJncmlkT3B0aW9ucy5pc0FjY29yZGlvblRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1hY2NvcmRpb24gZGlzcGxheU1vZGU9XCJmbGF0XCIgbXVsdGkgY2xhc3M9XCJtYXQtdGFibGVcIiAqbmdJZj1cImdyaWRPcHRpb25zLmlzQWNjb3JkaW9uVGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgKm5nSWY9XCIhZ3JpZE9wdGlvbnMuaGlkZVRhYmxlSGVhZGVyXCIgY2xhc3M9XCJtYXNrLWJvZHkgaGVhZGVyLXBhbmVsXCIgaGlkZVRvZ2dsZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlciAoa2V5ZG93bi5FbnRlcik9XCIkZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sbGFwc2VkSGVpZ2h0XT1cIidhdXRvJ1wiIFtleHBhbmRlZEhlaWdodF09XCInYXV0bydcIiBjbGFzcz1cIm1hdC1yb3cgaGVhZGVyLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYXQtY2hlY2tib3hSb3dcIiAqbmdJZj1cImlzUm93U2VsZWN0aW9uRW5hYmxlICAmJiAhaXNTaW5nbGVTZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNoYW5nZSk9XCIkZXZlbnQgPyBtYXN0ZXJUb2dnbGUoKSA6IG51bGxcIiBbKG5nTW9kZWwpXT1cIm1hc3RlclNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiBpc0FsbFNlbGVjdGVkKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgIWlzQWxsU2VsZWN0ZWQoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB2aWV3Q29sdW1uIG9mIHZpZXdDb2x1bW5zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJ2aWV3Q29sdW1uLmlzVmlzaWJsZVwiIHNjb3BlPVwiY29sXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1jZWxsIGQtaW5saW5lLWJsb2NrXCIgW25nQ2xhc3NdPVwidmlld0NvbHVtbi5jdXN0b21Dc3NDbGFzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1kYXRhLWNvbC1maWx0ZXIgY2xhc3M9XCJmaWx0ZXItY29sdW1uXCIgKm5nSWY9XCJpc0ZpbHRlckVuYWJsZSh2aWV3Q29sdW1uLnByb3ApXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uTmFtZV09XCJ2aWV3Q29sdW1uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2ZpbHRlcmVkQ29sdW1uJzogaXNGaWx0ZXJlZENvbHVtbih2aWV3Q29sdW1uLnByb3ApfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uRmlsdGVyQ2xpY2tlZCk9XCJvbkZpbHRlckNsaWNrZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpbHRlck9wdGlvbl09XCJ2aWV3Q29sdW1uLmZpbHRlck9wdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW251bWJlck9mVGFibGVSZWZyZXNoXT1cIm51bWJlck9mVGFibGVSZWZyZXNoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlsdGVyUGFyYW1dPVwiZ2V0RmlsdGVyUGFyYW0odmlld0NvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYXBwLWRhdGEtY29sLWZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwibm9uRmlsdGVyQ2xhc3NOYW1lKHZpZXdDb2x1bW4ucHJvcClcIiBjbGFzcz1cInRhYmxlIC5oZWFkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzb3J0VGFibGUodmlld0NvbHVtbilcIj57eyB2aWV3Q29sdW1uLmhlYWRlciB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29ydC1pY29uXCIgKm5nSWY9XCJzb3J0ZWRDb2x1bW5bdmlld0NvbHVtbi5wcm9wXT09J0Rvd25Tb3J0ZWQnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbSBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJvd19kb3dud2FyZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvcnQtaWNvblwiICpuZ0lmPVwic29ydGVkQ29sdW1uW3ZpZXdDb2x1bW4ucHJvcF09PSdVcFNvcnRlZCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycm93X3Vwd2FyZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VtPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxuICAgICAgICAgICAgICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzTG9hZGluZyQuZ2V0VmFsdWUoKVwiIGFwcC1kYXRhLXRhYmxlLWJvZHkgW2dyaWRPcHRpb25zXT1cImdyaWRPcHRpb25zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZWN0aW9uXT1cInNlbGVjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwicm93cyB8IGNvbHVtbkZpbHRlciA6IGZpbHRlck1hbmFnZXIuZ2V0RmlsdGVyUGFyYW1zKCkgOiBjb2x1bW5zOiBncmlkT3B0aW9ucy5pc0NsaWVudFNpZGVQYWdpbmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmlld0NvbHVtbnNdPVwidmlld0NvbHVtbnNcIiBbY2FuSW5saW5lRWRpdF09XCJjYW5JbmxpbmVFZGl0XCIgW2lzVHJlZUdyaWRdPVwiaXNUcmVlR3JpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzT25seVZpZXddPVwiaXNPbmx5Vmlld1wiIFtzZWFyY2hlZFJvd0NvdW50JF09XCJzZWFyY2hlZFJvd0NvdW50JFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzT25seVZpZXdSb3ddPVwiaXNPbmx5Vmlld1Jvd1wiIFtpc0RlbGV0ZURpc2FibGVkXT1cImlzRGVsZXRlRGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hdPVwic2VhcmNoVmFsdWUudmFsdWVcIiBbcGFnaW5hdGlvblBhcmFtc109XCJwYWdpbmF0aW9uUGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaGFzRW1wdHlSb3ddPVwiaGFzRW1wdHlSb3dcIiBbaXNFZGl0aW5nXT1cImlzRWRpdGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzUm93U2VsZWN0aW9uRW5hYmxlXT1cImlzUm93U2VsZWN0aW9uRW5hYmxlXCIgW3NlYXJjaENvbHVtbnNdPVwic2VhcmNoQ29sdW1uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lzQ2xvbmVWaXNpYmxlXT1cImlzQ2xvbmVWaXNpYmxlXCIgKGNsaWNrRWRpdCk9XCJvbkNsaWNrRWRpdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0RXhwYW5zaW9uUGFuZWxDbGlja2VkKT1cIm9uRXhwYW5zaW9uUGFuZWxDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tDbG9uZSk9XCJvbkNsaWNrQ2xvbmUoJGV2ZW50KVwiIChjbGlja0FjdGlvbik9XCJvbkNsaWNrQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGlja0VkaXRDYW5jZWwpPVwib25DbGlja0VkaXRDYW5jZWwoJGV2ZW50KVwiIChjbGlja0VkaXRTYXZlKT1cIm9uQ2xpY2tFZGl0U2F2ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tEZWxldGUpPVwib25DbGlja0RlbGV0ZVJvdygkZXZlbnQpXCIgKGNsaWNrVmlldyk9XCJvbkNsaWNrVmlldygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tBZGQpPVwib25DbGlja1Jvd0FkZCgkZXZlbnQpXCIgKGNsaWNrUm93KT1cIm9uQ2xpY2tSb3coJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZUV4cGFuZENvbGxhcHNlKT1cIm9uQ2hhbmdlRXhwYW5kQ29sbGFwc2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBsZXhEZXRhaWxDbGlja2VkKT1cIkNvbXBsZXhEZXRhaWxDbGlja2VkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDaGVja2JveFNlbGVjdCk9XCJpc0NoZWNrYm94U2VsZWN0KCRldmVudClcIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L21hdC1hY2NvcmRpb24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzZWN0aW9uICpuZ0lmPVwiaGFzUGFnaW5hdGlvbiAmJiBzZWxlY3Rpb25cIiBjbGFzcz1cInBhZ2luYXRpb25cIj5cbiAgICAgICAgICAgIDxhcHAtZGF0YS1wYWdpbmF0aW9uIFtzZWxlY3Rpb25Db3VudF09XCJzZWxlY3Rpb24uc2VsZWN0ZWQubGVuZ3RoXCIgY2xhc3M9XCJ0YWJsZS1wYWdpbmF0aW9uLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cInsndHJhbnNwYXJlbnQtdGFibGUtZGVzaWduJzogZ3JpZE9wdGlvbnMuaXNUcmFuc3BhcmVudFRhYmxlRGVzaWdufVwiICBbdG90YWxSb3dDb3VudCRdPVwidGhpcy5zZWFyY2hlZFJvd0NvdW50JFwiXG4gICAgICAgICAgICAgICAgW2NvdW50XT1cImNvdW50XCIgW3BhZ2VdPVwicGFnaW5hdGlvblBhcmFtcy5jdXJyZW50UGFnZVwiIFtzaXplXT1cInBhZ2luYXRpb25QYXJhbXMucGFnZVNpemVcIiBbaGFzRHJvcGRvd25TdHlsZVBhZ2VTaXplXT1cImdyaWRPcHRpb25zLmhhc0Ryb3Bkb3duU3R5bGVQYWdlU2l6ZSA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAoY2hhbmdlUGFnZSk9XCJvbkNoYW5nZVBhZ2UoJGV2ZW50KVwiPlxuICAgICAgICAgICAgPC9hcHAtZGF0YS1wYWdpbmF0aW9uPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD4iXX0=
|