@messaia/cdk 18.2.3 → 19.0.0-rc02
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/messaia-cdk.mjs +1592 -1239
- package/fesm2022/messaia-cdk.mjs.map +1 -1
- package/lib/base/base.module.d.ts +14 -13
- package/lib/base/components/base.component.d.ts +1 -1
- package/lib/base/components/generic-embedded-list.component.d.ts +1 -1
- package/lib/base/components/generic-form-base.component.d.ts +3 -2
- package/lib/base/components/generic-form.component.d.ts +1 -1
- package/lib/base/components/generic-list.component.d.ts +23 -3
- package/lib/base/components/generic-reactive-form.component.d.ts +1 -1
- package/lib/base/constants/common.d.ts +2 -0
- package/lib/base/helpers/auth-helper.d.ts +1 -1
- package/lib/chips/components/chips.component.d.ts +5 -16
- package/lib/common/functions/utils.d.ts +1 -1
- package/lib/common/helpers/app-storage.d.ts +1 -1
- package/lib/common/styles/_layout.scss +1 -1
- package/lib/common/styles/_variables.scss +4 -25
- package/lib/common/styles/colors/_colors-dark.scss +2 -0
- package/lib/common/styles/colors/_colors.scss +34 -4
- package/lib/common/styles/core/_button.scss +7 -21
- package/lib/common/styles/core/_card.scss +19 -88
- package/lib/common/styles/core/_core.scss +10 -21
- package/lib/common/styles/core/_overrides.scss +45 -0
- package/lib/common/styles/core/_sidenav.scss +9 -7
- package/lib/common/styles/core/_structure.scss +4 -11
- package/lib/common/styles/font/_font.scss +5 -13
- package/lib/common/styles/m2/_common-theme.scss +10 -10
- package/lib/common/styles/m2/platform.scss +13 -0
- package/lib/common/styles/m3/_common-theme.scss +27 -10
- package/lib/common/styles/m3/platform.scss +13 -0
- package/lib/common/styles/utilities/_general.scss +522 -492
- package/lib/common/styles/utilities/_pull.scss +23 -30
- package/lib/common/styles/utilities/_push.scss +23 -30
- package/lib/common/styles/utilities/_size.scss +3 -3
- package/lib/common/styles/utilities/_utilities.scss +14 -14
- package/lib/common/theming/_m2-all-theme.scss +4 -11
- package/lib/form-validators/directives/base-directive.d.ts +1 -1
- package/lib/form-validators/directives/template-validations/base-validator.directive.d.ts +1 -1
- package/lib/form-validators/directives/template-validations/control-expression-process.d.ts +1 -1
- package/lib/form-validators/services/rx-form-array.d.ts +2 -2
- package/lib/form-validators/util/reset-form.d.ts +3 -3
- package/lib/forms/directives/mat-form-field-editor.directive.d.ts +31 -28
- package/lib/forms/forms.module.d.ts +4 -3
- package/lib/forms/helpers/abstract-mat-form-field.d.ts +147 -91
- package/lib/forms/helpers/abstract-select-form-field.component.d.ts +144 -67
- package/lib/forms/helpers/value-accessor-base.d.ts +1 -1
- package/lib/layout/_m2-layout-theme.scss +14 -50
- package/lib/layout/layout-nav/layout-nav.component.d.ts +7 -1
- package/lib/layout/layout-toggle.class.d.ts +1 -1
- package/lib/list/components/list.component.d.ts +3 -15
- package/lib/menu/components/menu.component.d.ts +16 -1
- package/lib/menu/menu.module.d.ts +3 -2
- package/lib/select/components/select.component.d.ts +3 -16
- package/lib/table/components/dynamic-table/dynamic-table.component.d.ts +5 -1
- package/lib/table/components/filter-select/filter-select.component.d.ts +2 -3
- package/lib/table/models/table-definition.d.ts +69 -20
- package/package.json +3 -5
- package/esm2022/lib/base/base.module.mjs +0 -114
- package/esm2022/lib/base/components/base.component.mjs +0 -904
- package/esm2022/lib/base/components/dynamic-table-config-dialog/dynamic-table-config-dialog.comnponent.mjs +0 -123
- package/esm2022/lib/base/components/generic-embedded-list.component.mjs +0 -197
- package/esm2022/lib/base/components/generic-form-base.component.mjs +0 -891
- package/esm2022/lib/base/components/generic-form.component.mjs +0 -44
- package/esm2022/lib/base/components/generic-list.component.mjs +0 -966
- package/esm2022/lib/base/components/generic-reactive-form.component.mjs +0 -101
- package/esm2022/lib/base/components/task-dialog/task-dialog.component.mjs +0 -147
- package/esm2022/lib/base/constants/common.mjs +0 -92
- package/esm2022/lib/base/constants/global-roles.mjs +0 -9
- package/esm2022/lib/base/enums/message-type.mjs +0 -7
- package/esm2022/lib/base/helpers/auth-helper.mjs +0 -53
- package/esm2022/lib/base/interceptors/base.interceptor.mjs +0 -168
- package/esm2022/lib/base/interceptors/caching-interceptor.mjs +0 -67
- package/esm2022/lib/base/interceptors/loading.interceptor.mjs +0 -64
- package/esm2022/lib/base/interfaces/ibase-component.mjs +0 -2
- package/esm2022/lib/base/interfaces/igeneric-form-base.mjs +0 -2
- package/esm2022/lib/base/interfaces/igeneric-list-component.mjs +0 -2
- package/esm2022/lib/base/interfaces/igeneric-reactive-form-base.mjs +0 -2
- package/esm2022/lib/base/models/auth-user.mjs +0 -18
- package/esm2022/lib/base/models/task-dialog-data.mjs +0 -85
- package/esm2022/lib/base/public_api.mjs +0 -2
- package/esm2022/lib/base/services/file.service.mjs +0 -18
- package/esm2022/lib/base/services/loading-screen.service.mjs +0 -45
- package/esm2022/lib/base/services/print.service.mjs +0 -41
- package/esm2022/lib/chips/chips.module.mjs +0 -77
- package/esm2022/lib/chips/components/chips.component.mjs +0 -702
- package/esm2022/lib/chips/directives/autocomplete-option.directive.mjs +0 -18
- package/esm2022/lib/chips/directives/chip.directive.mjs +0 -18
- package/esm2022/lib/chips/public_api.mjs +0 -3
- package/esm2022/lib/common/animations/collapse/collapse.animation.mjs +0 -33
- package/esm2022/lib/common/animations/common/interfaces.mjs +0 -2
- package/esm2022/lib/common/behaviors/constructor.mjs +0 -2
- package/esm2022/lib/common/behaviors/control-value-accesor.mixin.mjs +0 -41
- package/esm2022/lib/common/behaviors/disabled.mixin.mjs +0 -24
- package/esm2022/lib/common/common.module.mjs +0 -176
- package/esm2022/lib/common/constants/constants.mjs +0 -3
- package/esm2022/lib/common/directives/autofocus.directive.mjs +0 -62
- package/esm2022/lib/common/directives/delayed-hover.directive.mjs +0 -133
- package/esm2022/lib/common/directives/disable-control.directive.mjs +0 -35
- package/esm2022/lib/common/enums/app-event-type.mjs +0 -6
- package/esm2022/lib/common/enums/filter-glue.mjs +0 -16
- package/esm2022/lib/common/enums/filter-operator.mjs +0 -15
- package/esm2022/lib/common/enums/salutation.mjs +0 -7
- package/esm2022/lib/common/functions/decorators.mjs +0 -22
- package/esm2022/lib/common/functions/functions.mjs +0 -22
- package/esm2022/lib/common/functions/utils.mjs +0 -271
- package/esm2022/lib/common/helpers/app-storage.mjs +0 -77
- package/esm2022/lib/common/helpers/delegate.mjs +0 -2
- package/esm2022/lib/common/helpers/dynamic-builder.mjs +0 -52
- package/esm2022/lib/common/helpers/dynamic-component-compiler.mjs +0 -11
- package/esm2022/lib/common/models/action-item.mjs +0 -77
- package/esm2022/lib/common/models/app-event.mjs +0 -21
- package/esm2022/lib/common/models/app-setting.mjs +0 -92
- package/esm2022/lib/common/models/audit-entity.mjs +0 -53
- package/esm2022/lib/common/models/audit-user.mjs +0 -24
- package/esm2022/lib/common/models/base-entity.mjs +0 -40
- package/esm2022/lib/common/models/common-error.mjs +0 -29
- package/esm2022/lib/common/models/common-handler-context.mjs +0 -45
- package/esm2022/lib/common/models/displayname-number-projection.mjs +0 -56
- package/esm2022/lib/common/models/displayname-projection.mjs +0 -38
- package/esm2022/lib/common/models/entity.mjs +0 -2
- package/esm2022/lib/common/models/enum-item.mjs +0 -2
- package/esm2022/lib/common/models/enum-metadata.mjs +0 -44
- package/esm2022/lib/common/models/filter-field.mjs +0 -2
- package/esm2022/lib/common/models/filter.mjs +0 -2
- package/esm2022/lib/common/models/icommon-handler-context.mjs +0 -2
- package/esm2022/lib/common/models/icon.mjs +0 -42
- package/esm2022/lib/common/models/key-value.mjs +0 -11
- package/esm2022/lib/common/models/modifiable-entity.mjs +0 -22
- package/esm2022/lib/common/models/name-number-projection.mjs +0 -35
- package/esm2022/lib/common/models/name-projection.mjs +0 -25
- package/esm2022/lib/common/models/permission.mjs +0 -29
- package/esm2022/lib/common/models/save-action.mjs +0 -7
- package/esm2022/lib/common/models/suffix-button.mjs +0 -15
- package/esm2022/lib/common/models/title-projection.mjs +0 -25
- package/esm2022/lib/common/pipes/bind.mjs +0 -31
- package/esm2022/lib/common/pipes/data-source.pipe.mjs +0 -15
- package/esm2022/lib/common/pipes/enum.pipe.mjs +0 -41
- package/esm2022/lib/common/pipes/file-size.pipe.mjs +0 -35
- package/esm2022/lib/common/pipes/filter.pipe.mjs +0 -54
- package/esm2022/lib/common/pipes/first-letter.mjs +0 -24
- package/esm2022/lib/common/pipes/form-array.pipe.mjs +0 -14
- package/esm2022/lib/common/pipes/form-control.pipe.mjs +0 -14
- package/esm2022/lib/common/pipes/form-group.pipe.mjs +0 -14
- package/esm2022/lib/common/pipes/func.pipe.mjs +0 -14
- package/esm2022/lib/common/pipes/join.pipe.mjs +0 -26
- package/esm2022/lib/common/pipes/keys.mjs +0 -18
- package/esm2022/lib/common/pipes/map.pipe.mjs +0 -48
- package/esm2022/lib/common/pipes/month-name.pipe.mjs +0 -25
- package/esm2022/lib/common/pipes/nested-property.mjs +0 -29
- package/esm2022/lib/common/pipes/only-number.mjs +0 -58
- package/esm2022/lib/common/pipes/order.pipe.mjs +0 -269
- package/esm2022/lib/common/pipes/placeholder.pipe.mjs +0 -26
- package/esm2022/lib/common/pipes/property-join.pipe.mjs +0 -27
- package/esm2022/lib/common/pipes/safe-html.pipe.mjs +0 -32
- package/esm2022/lib/common/pipes/split.pipe.mjs +0 -25
- package/esm2022/lib/common/pipes/time.pipe.mjs +0 -21
- package/esm2022/lib/common/pipes/titlecase.pipe.mjs +0 -14
- package/esm2022/lib/common/pipes/truncate.pipe.mjs +0 -15
- package/esm2022/lib/common/pipes/values.mjs +0 -14
- package/esm2022/lib/common/public_api.mjs +0 -41
- package/esm2022/lib/common/services/base.service.mjs +0 -19
- package/esm2022/lib/common/services/context-helper.mjs +0 -17
- package/esm2022/lib/common/services/enum.service.mjs +0 -81
- package/esm2022/lib/common/services/event-queue.service.mjs +0 -31
- package/esm2022/lib/common/services/service-locator.mjs +0 -25
- package/esm2022/lib/common/templates/templates.mjs +0 -87
- package/esm2022/lib/dialogs/alert-dialog/alert-dialog.component.mjs +0 -46
- package/esm2022/lib/dialogs/confirm-dialog/confirm-dialog.component.mjs +0 -60
- package/esm2022/lib/dialogs/dialog.component.mjs +0 -59
- package/esm2022/lib/dialogs/dialogs.module.mjs +0 -72
- package/esm2022/lib/dialogs/prompt-dialog/prompt-dialog.component.mjs +0 -44
- package/esm2022/lib/dialogs/public_api.mjs +0 -2
- package/esm2022/lib/dialogs/services/dialog.service.mjs +0 -154
- package/esm2022/lib/file/file-input.component.mjs +0 -334
- package/esm2022/lib/file/file.module.mjs +0 -37
- package/esm2022/lib/file/public_api.mjs +0 -2
- package/esm2022/lib/form-validators/abstract/typed-form.mjs +0 -13
- package/esm2022/lib/form-validators/algorithm/luhn-algorithm.mjs +0 -33
- package/esm2022/lib/form-validators/const/app-validators.const.mjs +0 -68
- package/esm2022/lib/form-validators/const/app.const.mjs +0 -65
- package/esm2022/lib/form-validators/const/config-names.const.mjs +0 -33
- package/esm2022/lib/form-validators/const/config-required-fields.const.mjs +0 -35
- package/esm2022/lib/form-validators/const/decorators.const.mjs +0 -23
- package/esm2022/lib/form-validators/const/events.const.mjs +0 -53
- package/esm2022/lib/form-validators/const/html-elements.const.mjs +0 -25
- package/esm2022/lib/form-validators/const/iban-country-wise-regex.const.mjs +0 -80
- package/esm2022/lib/form-validators/const/index.mjs +0 -6
- package/esm2022/lib/form-validators/const/operators.const.mjs +0 -7
- package/esm2022/lib/form-validators/const/validation-alphabet-locale.const.mjs +0 -9
- package/esm2022/lib/form-validators/const/validator.const.mjs +0 -29
- package/esm2022/lib/form-validators/core/annotation-types.mjs +0 -75
- package/esm2022/lib/form-validators/core/default-container.mjs +0 -500
- package/esm2022/lib/form-validators/decorators/allOf.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/alpha.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/alphaNumeric.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/and.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/ascii.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/async.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/base-decorator.function.mjs +0 -7
- package/esm2022/lib/form-validators/decorators/choice.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/compare.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/compose.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/contains.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/credit-card.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/cusip.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/custom.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/dataUri.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/date.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/different.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/digit.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/email.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/endsWith.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/even.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/extension.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/factor.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/file.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/fileSize.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/greater-than-equal-to.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/greater-than.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/grid.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/hexColor.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/image.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/index.mjs +0 -93
- package/esm2022/lib/form-validators/decorators/json.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/latLong.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/latitude.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/leapYear.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/less-than-equal-to.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/less-than.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/longitude.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/lowercase.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/mac.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/mask.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/maxDate.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/maxLength.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/maxNumber.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/maxTime.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/minDate.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/minLength.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/minNumber.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/minTime.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/model.decorator.mjs +0 -7
- package/esm2022/lib/form-validators/decorators/non-validation-decorators/disable.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/non-validation-decorators/elementClass.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/non-validation-decorators/error.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/non-validation-decorators/update-on.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/noneOf.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/not.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/notEmpty.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/numeric.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/odd.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/oneOf.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/or.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/password.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/pattern.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/port.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/primeNumber.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/prop-array.decorator.mjs +0 -18
- package/esm2022/lib/form-validators/decorators/prop-object.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/prop.decorator.mjs +0 -18
- package/esm2022/lib/form-validators/decorators/range.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/required.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/requiredTrue.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/rule.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/sanitize/blacklist.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/escape.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/ltrim.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/prefix.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/rtrim.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/sanitize.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/stripLow.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/suffix.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/toBoolean.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/toDate.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/toDouble.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/toFloat.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/toInt.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/toString.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/trim.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/sanitize/whitelist.decorator.mjs +0 -8
- package/esm2022/lib/form-validators/decorators/startsWith.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/time.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/decorators/unique.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/uppercase.decorator.mjs +0 -6
- package/esm2022/lib/form-validators/decorators/url.decorator.mjs +0 -10
- package/esm2022/lib/form-validators/directives/base-directive.mjs +0 -75
- package/esm2022/lib/form-validators/directives/control-host.directive.mjs +0 -55
- package/esm2022/lib/form-validators/directives/html-control-template.directive.mjs +0 -36
- package/esm2022/lib/form-validators/directives/rx-form.directive.mjs +0 -234
- package/esm2022/lib/form-validators/directives/template-validations/async-validation.directive.mjs +0 -40
- package/esm2022/lib/form-validators/directives/template-validations/base-validator.directive.mjs +0 -76
- package/esm2022/lib/form-validators/directives/template-validations/control-expression-process.mjs +0 -60
- package/esm2022/lib/form-validators/directives/template-validations/file-control.directive.mjs +0 -122
- package/esm2022/lib/form-validators/directives/template-validations/image-file-control.directive.mjs +0 -74
- package/esm2022/lib/form-validators/directives/template-validations/rxformcontrol.directive.mjs +0 -394
- package/esm2022/lib/form-validators/domain/disable-provider.mjs +0 -198
- package/esm2022/lib/form-validators/domain/element-processor/decimal.provider.mjs +0 -134
- package/esm2022/lib/form-validators/domain/element-processor/mask.provider.mjs +0 -453
- package/esm2022/lib/form-validators/domain/form-data.mjs +0 -93
- package/esm2022/lib/form-validators/enums/error-message-binding-strategy.mjs +0 -11
- package/esm2022/lib/form-validators/enums/index.mjs +0 -5
- package/esm2022/lib/form-validators/enums/ip-version.mjs +0 -7
- package/esm2022/lib/form-validators/enums/numeric-value-type.mjs +0 -7
- package/esm2022/lib/form-validators/enums/reset-type.mjs +0 -10
- package/esm2022/lib/form-validators/enums/url-validation-type.mjs +0 -7
- package/esm2022/lib/form-validators/models/config/alpha-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/array-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/base-config-fn.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/base-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/base-date-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/choice-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/compare-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/component-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/compose-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/contains-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/credit-card-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/custom-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/date-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/default-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/digit-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/disable-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/element-class-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/email-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/error-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/extension-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/factor-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/field-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/file-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/hex-color-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/iban-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/image-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/index.mjs +0 -35
- package/esm2022/lib/form-validators/models/config/ip-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/logical-operator-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/mask-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/max-date-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/message-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/min-date-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/model-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/number-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/numeric-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/password-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/pattern-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/prop-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/props-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/range-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/relational-operator-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/required-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/rule-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/sanitize-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/size-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/string-comparison-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/string-value-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/time-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/todate-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/unique-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/update-on-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/config/url-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/control-info.mjs +0 -2
- package/esm2022/lib/form-validators/models/data-sanitizer.mjs +0 -2
- package/esm2022/lib/form-validators/models/decorator-configuration.mjs +0 -2
- package/esm2022/lib/form-validators/models/form-builder-configuration.mjs +0 -58
- package/esm2022/lib/form-validators/models/index.mjs +0 -3
- package/esm2022/lib/form-validators/models/instance-container.mjs +0 -2
- package/esm2022/lib/form-validators/models/interface/array-prop-instance-config.interface.mjs +0 -2
- package/esm2022/lib/form-validators/models/interface/auto-instance-config.interface.mjs +0 -2
- package/esm2022/lib/form-validators/models/interface/form-data-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/interface/i-abstract-control.mjs +0 -30
- package/esm2022/lib/form-validators/models/interface/i-form-group.mjs +0 -2
- package/esm2022/lib/form-validators/models/interface/instance-argument.interface.mjs +0 -2
- package/esm2022/lib/form-validators/models/interface/object-prop-instance-config.interface.mjs +0 -2
- package/esm2022/lib/form-validators/models/interface/options.mjs +0 -2
- package/esm2022/lib/form-validators/models/password-validation.model.mjs +0 -2
- package/esm2022/lib/form-validators/models/prop-validation-config.mjs +0 -2
- package/esm2022/lib/form-validators/models/property-info.mjs +0 -2
- package/esm2022/lib/form-validators/public_api.mjs +0 -26
- package/esm2022/lib/form-validators/reactive-form-validators/allOf.validator.mjs +0 -33
- package/esm2022/lib/form-validators/reactive-form-validators/alpha.validator.mjs +0 -15
- package/esm2022/lib/form-validators/reactive-form-validators/alphaNumeric.validator.mjs +0 -15
- package/esm2022/lib/form-validators/reactive-form-validators/and.validator.mjs +0 -38
- package/esm2022/lib/form-validators/reactive-form-validators/ascii.validator.mjs +0 -15
- package/esm2022/lib/form-validators/reactive-form-validators/async/base.async.validator.mjs +0 -45
- package/esm2022/lib/form-validators/reactive-form-validators/choice.validator.mjs +0 -31
- package/esm2022/lib/form-validators/reactive-form-validators/compare.validator.mjs +0 -32
- package/esm2022/lib/form-validators/reactive-form-validators/compose.validator.mjs +0 -34
- package/esm2022/lib/form-validators/reactive-form-validators/conditional-change.validator.mjs +0 -63
- package/esm2022/lib/form-validators/reactive-form-validators/contains.validator.mjs +0 -22
- package/esm2022/lib/form-validators/reactive-form-validators/credit-card.validator.mjs +0 -48
- package/esm2022/lib/form-validators/reactive-form-validators/cusip.validator.mjs +0 -38
- package/esm2022/lib/form-validators/reactive-form-validators/custom.validator.mjs +0 -25
- package/esm2022/lib/form-validators/reactive-form-validators/dataUri.validator.mjs +0 -9
- package/esm2022/lib/form-validators/reactive-form-validators/date.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/different.validator.mjs +0 -19
- package/esm2022/lib/form-validators/reactive-form-validators/digit.validator.mjs +0 -9
- package/esm2022/lib/form-validators/reactive-form-validators/email.validator.mjs +0 -9
- package/esm2022/lib/form-validators/reactive-form-validators/endsWith.validator.mjs +0 -23
- package/esm2022/lib/form-validators/reactive-form-validators/even.validator.mjs +0 -15
- package/esm2022/lib/form-validators/reactive-form-validators/extension.validator.mjs +0 -40
- package/esm2022/lib/form-validators/reactive-form-validators/factor.validator.mjs +0 -37
- package/esm2022/lib/form-validators/reactive-form-validators/file.validator.mjs +0 -26
- package/esm2022/lib/form-validators/reactive-form-validators/fileSize.validator.mjs +0 -34
- package/esm2022/lib/form-validators/reactive-form-validators/greater-than-equal-to.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/greater-than.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/grid.validator.mjs +0 -31
- package/esm2022/lib/form-validators/reactive-form-validators/hexcolor.validator.mjs +0 -9
- package/esm2022/lib/form-validators/reactive-form-validators/iban.validator.mjs +0 -28
- package/esm2022/lib/form-validators/reactive-form-validators/image.validator.mjs +0 -52
- package/esm2022/lib/form-validators/reactive-form-validators/index.mjs +0 -66
- package/esm2022/lib/form-validators/reactive-form-validators/ip.validator.mjs +0 -28
- package/esm2022/lib/form-validators/reactive-form-validators/json.validator.mjs +0 -26
- package/esm2022/lib/form-validators/reactive-form-validators/latLong.validator.mjs +0 -18
- package/esm2022/lib/form-validators/reactive-form-validators/latitude.validator.mjs +0 -9
- package/esm2022/lib/form-validators/reactive-form-validators/leapYear.validator.mjs +0 -16
- package/esm2022/lib/form-validators/reactive-form-validators/less-than-equal-to.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/less-than.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/longitude.validator.mjs +0 -9
- package/esm2022/lib/form-validators/reactive-form-validators/lowercase.validator.mjs +0 -15
- package/esm2022/lib/form-validators/reactive-form-validators/mac.validator.mjs +0 -9
- package/esm2022/lib/form-validators/reactive-form-validators/mask.validator.mjs +0 -14
- package/esm2022/lib/form-validators/reactive-form-validators/maxDate.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/maxLength.validator.mjs +0 -17
- package/esm2022/lib/form-validators/reactive-form-validators/maxNumber.validator.mjs +0 -17
- package/esm2022/lib/form-validators/reactive-form-validators/maxTime.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/minDate.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/minLength.validator.mjs +0 -16
- package/esm2022/lib/form-validators/reactive-form-validators/minNumber.validator.mjs +0 -16
- package/esm2022/lib/form-validators/reactive-form-validators/minTime.validator.mjs +0 -8
- package/esm2022/lib/form-validators/reactive-form-validators/noneOf.validator.mjs +0 -24
- package/esm2022/lib/form-validators/reactive-form-validators/not.validator.mjs +0 -25
- package/esm2022/lib/form-validators/reactive-form-validators/notEmpty.validator.mjs +0 -17
- package/esm2022/lib/form-validators/reactive-form-validators/numeric.validator.mjs +0 -22
- package/esm2022/lib/form-validators/reactive-form-validators/odd.validator.mjs +0 -17
- package/esm2022/lib/form-validators/reactive-form-validators/oneOf.validator.mjs +0 -26
- package/esm2022/lib/form-validators/reactive-form-validators/or.validator.mjs +0 -25
- package/esm2022/lib/form-validators/reactive-form-validators/password.validator.mjs +0 -35
- package/esm2022/lib/form-validators/reactive-form-validators/pattern.validator.mjs +0 -19
- package/esm2022/lib/form-validators/reactive-form-validators/port.validator.mjs +0 -19
- package/esm2022/lib/form-validators/reactive-form-validators/primeNumber.validator.mjs +0 -27
- package/esm2022/lib/form-validators/reactive-form-validators/range.validator.mjs +0 -17
- package/esm2022/lib/form-validators/reactive-form-validators/required.validator.mjs +0 -17
- package/esm2022/lib/form-validators/reactive-form-validators/requiredTrue.validator.mjs +0 -16
- package/esm2022/lib/form-validators/reactive-form-validators/rule.validator.mjs +0 -22
- package/esm2022/lib/form-validators/reactive-form-validators/startsWith.validator.mjs +0 -25
- package/esm2022/lib/form-validators/reactive-form-validators/time.validator.mjs +0 -19
- package/esm2022/lib/form-validators/reactive-form-validators/unique.validator.mjs +0 -77
- package/esm2022/lib/form-validators/reactive-form-validators/uppercase.validator.mjs +0 -16
- package/esm2022/lib/form-validators/reactive-form-validators/url.validator.mjs +0 -28
- package/esm2022/lib/form-validators/services/base-form-builder.mjs +0 -220
- package/esm2022/lib/form-validators/services/entity.service.mjs +0 -76
- package/esm2022/lib/form-validators/services/form-control.mjs +0 -370
- package/esm2022/lib/form-validators/services/form-group.mjs +0 -2
- package/esm2022/lib/form-validators/services/reactive-form.module.mjs +0 -52
- package/esm2022/lib/form-validators/services/rx-form-array.mjs +0 -114
- package/esm2022/lib/form-validators/services/rx-form-builder.mjs +0 -1035
- package/esm2022/lib/form-validators/services/rx-form-group.mjs +0 -451
- package/esm2022/lib/form-validators/services/typed-form-builder.mjs +0 -25
- package/esm2022/lib/form-validators/util/alphabet-regex.locale.mjs +0 -29
- package/esm2022/lib/form-validators/util/app-util.mjs +0 -161
- package/esm2022/lib/form-validators/util/check-length.mjs +0 -11
- package/esm2022/lib/form-validators/util/config-provider.mjs +0 -37
- package/esm2022/lib/form-validators/util/date-checker.function.mjs +0 -52
- package/esm2022/lib/form-validators/util/date-provider.mjs +0 -108
- package/esm2022/lib/form-validators/util/form-const.mjs +0 -3
- package/esm2022/lib/form-validators/util/form-provider.mjs +0 -87
- package/esm2022/lib/form-validators/util/index.mjs +0 -7
- package/esm2022/lib/form-validators/util/instance-provider.function.mjs +0 -63
- package/esm2022/lib/form-validators/util/ip-checker.mjs +0 -19
- package/esm2022/lib/form-validators/util/linq.mjs +0 -157
- package/esm2022/lib/form-validators/util/object-maker.mjs +0 -68
- package/esm2022/lib/form-validators/util/reactive-form-config.mjs +0 -25
- package/esm2022/lib/form-validators/util/regex-rules.mjs +0 -37
- package/esm2022/lib/form-validators/util/regex-validator.mjs +0 -74
- package/esm2022/lib/form-validators/util/relational-checker.function.mjs +0 -92
- package/esm2022/lib/form-validators/util/reset-form.mjs +0 -57
- package/esm2022/lib/form-validators/util/sanitizers.mjs +0 -140
- package/esm2022/lib/form-validators/util/time-checker.function.mjs +0 -50
- package/esm2022/lib/form-validators/util/type.mjs +0 -2
- package/esm2022/lib/form-validators/util/validator-value-checker.mjs +0 -21
- package/esm2022/lib/form-validators/validators-extension/allOf-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/alpha-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/alphaNumeric-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/and-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/ascii-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/base-validator.function.mjs +0 -34
- package/esm2022/lib/form-validators/validators-extension/choice-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/compare-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/compose-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/contains-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/credit-card-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/cusip-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/custom-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/dataUri-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/date-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/different-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/digit-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/email-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/endsWith-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/even-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/extension-validator.extension.mjs +0 -10
- package/esm2022/lib/form-validators/validators-extension/factor-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/file-validator.extension.mjs +0 -10
- package/esm2022/lib/form-validators/validators-extension/fileSize-validator.extension.mjs +0 -10
- package/esm2022/lib/form-validators/validators-extension/greater-than-equal-to-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/greater-than-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/grid-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/hexcolor-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/iban-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/image-validator.extension.mjs +0 -10
- package/esm2022/lib/form-validators/validators-extension/index.mjs +0 -68
- package/esm2022/lib/form-validators/validators-extension/ip-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/json-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/latLong-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/latitude-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/leapYear-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/less-than-equal-to-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/less-than-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/longitude-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/lowercase-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/mac-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/mask-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/maxDate-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/maxLength-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/maxNumber-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/maxTime-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/minDate-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/minLength-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/minNumber-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/minTime-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/noneOf-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/not-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/notEmpty-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/numeric-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/odd-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/oneOf-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/or-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/password-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/pattern-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/port-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/primeNumber-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/range-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/required-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/requiredTrue-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/rxweb-validators.mjs +0 -108
- package/esm2022/lib/form-validators/validators-extension/startsWith-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/time-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-extension/unique-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/uppercase-validator.extension.mjs +0 -7
- package/esm2022/lib/form-validators/validators-extension/url-validator.extension.mjs +0 -11
- package/esm2022/lib/form-validators/validators-function/alpha-validation.function.mjs +0 -71
- package/esm2022/lib/form-validators/validators-function/regex-validation.function.mjs +0 -33
- package/esm2022/lib/forms/components/datepicker/datepicker-header.component.mjs +0 -84
- package/esm2022/lib/forms/components/generic-form/generic-form.component.mjs +0 -602
- package/esm2022/lib/forms/constants/constants.mjs +0 -4
- package/esm2022/lib/forms/directives/mat-form-field-editor.directive.mjs +0 -197
- package/esm2022/lib/forms/directives/mat-form-field-readonly.directive.mjs +0 -34
- package/esm2022/lib/forms/directives/parse-decimal-directive.mjs +0 -87
- package/esm2022/lib/forms/directives/vd-generic-form-custom-field.directive.mjs +0 -35
- package/esm2022/lib/forms/enums/form-field-type.mjs +0 -23
- package/esm2022/lib/forms/forms.module.mjs +0 -168
- package/esm2022/lib/forms/functions/decorators.mjs +0 -136
- package/esm2022/lib/forms/functions/functions.mjs +0 -72
- package/esm2022/lib/forms/helpers/abstract-mat-form-field.mjs +0 -308
- package/esm2022/lib/forms/helpers/abstract-select-form-field.component.mjs +0 -492
- package/esm2022/lib/forms/helpers/value-accessor-base.mjs +0 -146
- package/esm2022/lib/forms/models/form-definition.mjs +0 -63
- package/esm2022/lib/forms/models/form-field-definition.mjs +0 -468
- package/esm2022/lib/forms/models/form-field-group-definition.mjs +0 -55
- package/esm2022/lib/forms/pipes/field-func.pipe.mjs +0 -23
- package/esm2022/lib/forms/pipes/group-filter.pipe.mjs +0 -34
- package/esm2022/lib/forms/public_api.mjs +0 -5
- package/esm2022/lib/forms/validators/empty-string-reset.directive.mjs +0 -25
- package/esm2022/lib/forms/validators/equal-validator.directive.mjs +0 -69
- package/esm2022/lib/forms/validators/native-element-injector.directive.mjs +0 -41
- package/esm2022/lib/forms/validators/unique-validator-directive.mjs +0 -88
- package/esm2022/lib/http/http.module.mjs +0 -15
- package/esm2022/lib/http/models/response.mjs +0 -24
- package/esm2022/lib/http/public_api.mjs +0 -2
- package/esm2022/lib/http/services/generic.service.mjs +0 -331
- package/esm2022/lib/layout/dynamic-menu/dynamic-menu.component.mjs +0 -103
- package/esm2022/lib/layout/layout-card-over/layout-card-over.component.mjs +0 -49
- package/esm2022/lib/layout/layout-compact/layout-compact.component.mjs +0 -193
- package/esm2022/lib/layout/layout-footer/layout-footer.component.mjs +0 -37
- package/esm2022/lib/layout/layout-manage-list/layout-manage-list.component.mjs +0 -150
- package/esm2022/lib/layout/layout-manage-list/layout-manage-list.directives.mjs +0 -108
- package/esm2022/lib/layout/layout-nav/layout-nav.component.mjs +0 -146
- package/esm2022/lib/layout/layout-nav-list/layout-nav-list.component.mjs +0 -141
- package/esm2022/lib/layout/layout-nav-list/layout-nav-list.directives.mjs +0 -105
- package/esm2022/lib/layout/layout-toggle.class.mjs +0 -89
- package/esm2022/lib/layout/layout.component.mjs +0 -230
- package/esm2022/lib/layout/layout.directives.mjs +0 -81
- package/esm2022/lib/layout/layout.module.mjs +0 -144
- package/esm2022/lib/layout/list-toolbar/list-toolbar.component.mjs +0 -47
- package/esm2022/lib/layout/navigation-drawer/navigation-drawer.component.mjs +0 -275
- package/esm2022/lib/layout/public_api.mjs +0 -2
- package/esm2022/lib/list/components/list.component.mjs +0 -78
- package/esm2022/lib/list/directives/vd-list-option.directive.mjs +0 -23
- package/esm2022/lib/list/list.module.mjs +0 -36
- package/esm2022/lib/list/public_api.mjs +0 -3
- package/esm2022/lib/media/directives/media-toggle.directive.mjs +0 -154
- package/esm2022/lib/media/media.module.mjs +0 -35
- package/esm2022/lib/media/public_api.mjs +0 -2
- package/esm2022/lib/media/services/media.service.mjs +0 -110
- package/esm2022/lib/menu/components/menu.component.mjs +0 -95
- package/esm2022/lib/menu/enums/menu-scope.mjs +0 -6
- package/esm2022/lib/menu/menu.module.mjs +0 -64
- package/esm2022/lib/menu/models/menu-client.mjs +0 -39
- package/esm2022/lib/menu/models/menu-department.mjs +0 -39
- package/esm2022/lib/menu/models/menu-item-client.mjs +0 -39
- package/esm2022/lib/menu/models/menu-item-department.mjs +0 -39
- package/esm2022/lib/menu/models/menu-item.mjs +0 -351
- package/esm2022/lib/menu/models/menu-settings.mjs +0 -13
- package/esm2022/lib/menu/models/menu.mjs +0 -224
- package/esm2022/lib/menu/public_api.mjs +0 -3
- package/esm2022/lib/menu/resolvers/menu-form-includes.resolve.mjs +0 -50
- package/esm2022/lib/menu/resolvers/menu-item-form-includes.resolve.mjs +0 -50
- package/esm2022/lib/menu/resolvers/menu-list-projection.resolve.mjs +0 -51
- package/esm2022/lib/menu/resolvers/menu-settings.resolve.mjs +0 -24
- package/esm2022/lib/menu/services/menu-items.service.mjs +0 -19
- package/esm2022/lib/menu/services/menu.resolve.mjs +0 -68
- package/esm2022/lib/menu/services/menu.service.mjs +0 -19
- package/esm2022/lib/search/public_api.mjs +0 -2
- package/esm2022/lib/search/search.module.mjs +0 -33
- package/esm2022/lib/select/components/select.component.mjs +0 -215
- package/esm2022/lib/select/directives/vd-select-option.directive.mjs +0 -23
- package/esm2022/lib/select/directives/vd-select-trigger.directive.mjs +0 -23
- package/esm2022/lib/select/public_api.mjs +0 -4
- package/esm2022/lib/select/select.module.mjs +0 -48
- package/esm2022/lib/table/components/dynamic-table/dynamic-table.component.mjs +0 -810
- package/esm2022/lib/table/components/filter-clear/filter-clear.component.mjs +0 -36
- package/esm2022/lib/table/components/filter-date/filter-date.component.mjs +0 -146
- package/esm2022/lib/table/components/filter-input/filter-input.component.mjs +0 -198
- package/esm2022/lib/table/components/filter-select/filter-select.component.mjs +0 -375
- package/esm2022/lib/table/constants/constants.mjs +0 -3
- package/esm2022/lib/table/directives/data-source-filter.directive.mjs +0 -49
- package/esm2022/lib/table/directives/vd-table-field.directive.mjs +0 -35
- package/esm2022/lib/table/enums/grid.mjs +0 -12
- package/esm2022/lib/table/enums/table-column-type.mjs +0 -17
- package/esm2022/lib/table/functions/decorators.mjs +0 -163
- package/esm2022/lib/table/functions/functions.mjs +0 -28
- package/esm2022/lib/table/models/facet-value.mjs +0 -47
- package/esm2022/lib/table/models/facet.mjs +0 -48
- package/esm2022/lib/table/models/pagination.mjs +0 -27
- package/esm2022/lib/table/models/table-column-config.mjs +0 -128
- package/esm2022/lib/table/models/table-column.mjs +0 -270
- package/esm2022/lib/table/models/table-config.mjs +0 -41
- package/esm2022/lib/table/models/table-definition.mjs +0 -110
- package/esm2022/lib/table/models/table-query-config.mjs +0 -26
- package/esm2022/lib/table/paginator-intl.mjs +0 -41
- package/esm2022/lib/table/public_api.mjs +0 -2
- package/esm2022/lib/table/table.data-source.mjs +0 -326
- package/esm2022/lib/table/table.module.mjs +0 -165
- package/esm2022/lib/table/table.static-data-source.mjs +0 -198
- package/esm2022/messaia-cdk.mjs +0 -5
- package/esm2022/public_api.mjs +0 -19
- package/lib/common/styles/_elevation.scss +0 -147
- package/lib/common/styles/_rtl.scss +0 -28
- package/lib/common/styles/_styles.scss +0 -12
- package/lib/common/styles/_theme-functions.scss +0 -4
- package/lib/common/styles/_typography.scss +0 -76
- package/lib/common/styles/core/_content.scss +0 -42
- package/lib/common/styles/core/_divider.scss +0 -14
- package/lib/common/styles/core/_icons.scss +0 -27
- package/lib/common/styles/core/_list.scss +0 -8
- package/lib/common/styles/core/_toolbar.scss +0 -31
- package/lib/common/styles/core/_whiteframe.scss +0 -111
- package/lib/common/styles/m2/_theme-functions.scss +0 -21
- package/lib/common/styles/m3/_theme-functions.scss +0 -21
- package/lib/common/styles/platform.scss +0 -11
- package/lib/common/theming/_all-theme.scss +0 -27
- package/lib/common/typography/_all-typography.scss +0 -33
|
@@ -1,891 +0,0 @@
|
|
|
1
|
-
import { ChangeDetectorRef, Directive, HostListener, Input, Type, ViewChild, ViewChildren } from '@angular/core';
|
|
2
|
-
import { FormGroup } from '@angular/forms';
|
|
3
|
-
import { MatStepper } from '@angular/material/stepper';
|
|
4
|
-
import { ActivatedRoute } from '@angular/router';
|
|
5
|
-
import { Observable, map, tap } from 'rxjs';
|
|
6
|
-
import { Utils } from '../../common/functions/utils';
|
|
7
|
-
import { Permission } from '../../common/models/permission';
|
|
8
|
-
import { SaveAction } from '../../common/models/save-action';
|
|
9
|
-
import { getFormDefinition } from '../../forms/functions/functions';
|
|
10
|
-
import { BaseComponent } from './base.component';
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "@angular/router";
|
|
13
|
-
// @dynamic
|
|
14
|
-
export class GenericFormBaseComponent extends BaseComponent {
|
|
15
|
-
entityCtor;
|
|
16
|
-
service;
|
|
17
|
-
route;
|
|
18
|
-
changeDetectorRef;
|
|
19
|
-
/**
|
|
20
|
-
* The action of the form (add | edit).
|
|
21
|
-
*/
|
|
22
|
-
action = 'add';
|
|
23
|
-
/**
|
|
24
|
-
* Indicates if the form is in edit mode.
|
|
25
|
-
*/
|
|
26
|
-
isEditMode = false;
|
|
27
|
-
/**
|
|
28
|
-
* Save action enumeration.
|
|
29
|
-
*/
|
|
30
|
-
SaveAction = SaveAction;
|
|
31
|
-
/**
|
|
32
|
-
* Navigation routes.
|
|
33
|
-
*/
|
|
34
|
-
editSaveAndCloseRoute = '../../';
|
|
35
|
-
addSaveAndCloseRoute = '../';
|
|
36
|
-
addSaveAndEditRoute = '../edit/';
|
|
37
|
-
addSaveAndNewRoute = '../add';
|
|
38
|
-
listRoute = this.addSaveAndCloseRoute;
|
|
39
|
-
/**
|
|
40
|
-
* The ID of the item to load.
|
|
41
|
-
*/
|
|
42
|
-
_id;
|
|
43
|
-
/**
|
|
44
|
-
* The ID of the item to load.
|
|
45
|
-
*/
|
|
46
|
-
get id() { return this._id; }
|
|
47
|
-
set id(id) {
|
|
48
|
-
if (this._id != id) {
|
|
49
|
-
this._id = id;
|
|
50
|
-
this.action = 'edit';
|
|
51
|
-
this.isEditMode = true;
|
|
52
|
-
this.listRoute = this.editSaveAndCloseRoute;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* The current item to add or edit.
|
|
57
|
-
*/
|
|
58
|
-
_item;
|
|
59
|
-
/**
|
|
60
|
-
* The current item to add or edit.
|
|
61
|
-
*/
|
|
62
|
-
get item() { return this._item; }
|
|
63
|
-
set item(item) {
|
|
64
|
-
if (this._item !== item) {
|
|
65
|
-
this._item = item;
|
|
66
|
-
this.id ??= item?.id;
|
|
67
|
-
this.buildFields();
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
/**
|
|
71
|
-
* Represents the request errors.
|
|
72
|
-
*/
|
|
73
|
-
errors = new Array();
|
|
74
|
-
/**
|
|
75
|
-
* Includes fields for query.
|
|
76
|
-
*/
|
|
77
|
-
includes = [];
|
|
78
|
-
/**
|
|
79
|
-
* Update includes fields for query.
|
|
80
|
-
*/
|
|
81
|
-
updateIncludes = [];
|
|
82
|
-
/**
|
|
83
|
-
* Projection fields for query.
|
|
84
|
-
*/
|
|
85
|
-
projection;
|
|
86
|
-
/**
|
|
87
|
-
* Query parameters.
|
|
88
|
-
*/
|
|
89
|
-
query = {};
|
|
90
|
-
/**
|
|
91
|
-
* Read-only flag.
|
|
92
|
-
*/
|
|
93
|
-
readonly = false;
|
|
94
|
-
/**
|
|
95
|
-
* Disabled flag.
|
|
96
|
-
*/
|
|
97
|
-
disabled = false;
|
|
98
|
-
/**
|
|
99
|
-
* The current date.
|
|
100
|
-
*/
|
|
101
|
-
currentDate = new Date();
|
|
102
|
-
/**
|
|
103
|
-
* Date & time input mask.
|
|
104
|
-
*/
|
|
105
|
-
dateTimeMask = [/[0-3]/, /[0-9]/, '.', /[0-1]/, /[0-9]/, '.', 2, 0, /[1-2]/, /[0-9]/, ' ', /[0-2]/, /[0-9]/, ':', /[0-5]/, /[0-9]/];
|
|
106
|
-
/**
|
|
107
|
-
* Date input mask.
|
|
108
|
-
*/
|
|
109
|
-
dateMask = [/[0-3]/, /[0-9]/, '.', /[0-1]/, /[0-9]/, '.', 2, 0, /[1-2]/, /[0-9]/];
|
|
110
|
-
/**
|
|
111
|
-
* Time input mask.
|
|
112
|
-
*/
|
|
113
|
-
timeMask = [/[0-2]/, /[0-9]/, ':', /[0-5]/, /[0-9]/];
|
|
114
|
-
/**
|
|
115
|
-
* Date validation pattern.
|
|
116
|
-
*/
|
|
117
|
-
datePattern = `(?:(?:31(\\/|-|\\.)(?:0?[13578]|1[02]))\\1|(?:(?:29|30)(\\/|-|\\.)(?:0?[1,3-9]|1[0-2])\\2))(?:(?:1[6-9]|[2-9]\\d)?\\d{2})$|^(?:29(\\/|-|\\.)0?2\\3(?:(?:(?:1[6-9]|[2-9]\\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\\d|2[0-8])(\\/|-|\\.)(?:(?:0?[1-9])|(?:1[0-2]))\\4(?:(?:1[6-9]|[2-9]\\d)?\\d{2})`;
|
|
118
|
-
/**
|
|
119
|
-
* Phone prefix validation pattern.
|
|
120
|
-
*/
|
|
121
|
-
phonePrefixPattern = '^(0\\d{2,6})$';
|
|
122
|
-
/**
|
|
123
|
-
* Phone number validation pattern.
|
|
124
|
-
*/
|
|
125
|
-
phoneNumberPattern = '^(\\d{3,30})$';
|
|
126
|
-
/**
|
|
127
|
-
* Password validation pattern.
|
|
128
|
-
*/
|
|
129
|
-
passwordPattern = '^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[$@$!%*?&#.])[A-Za-z\\d$@$!%*?&#.]{6,}$';
|
|
130
|
-
/**
|
|
131
|
-
* Editor options including default modules and toolbar configuration.
|
|
132
|
-
*/
|
|
133
|
-
editorOptions = {
|
|
134
|
-
modules: {
|
|
135
|
-
toolbar: [
|
|
136
|
-
['bold', 'italic', 'underline'],
|
|
137
|
-
[{ 'list': 'ordered' }, { 'list': 'bullet' }],
|
|
138
|
-
[{ 'indent': '-1' }, { 'indent': '+1' }],
|
|
139
|
-
[{ 'size': ['small', false, 'large', 'huge'] }],
|
|
140
|
-
[{ 'header': [1, 2, 3, 4, 5, 6, false] }],
|
|
141
|
-
[{ 'color': new Array() }, { 'background': new Array() }],
|
|
142
|
-
['link', 'image']
|
|
143
|
-
],
|
|
144
|
-
clipboard: {
|
|
145
|
-
matchVisual: false
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
/**
|
|
150
|
-
* If true, shows the 'Delete' menu.
|
|
151
|
-
*/
|
|
152
|
-
deletable = true;
|
|
153
|
-
/**
|
|
154
|
-
* Toolbar menu items.
|
|
155
|
-
*/
|
|
156
|
-
toolbarMenuItems = [];
|
|
157
|
-
/**
|
|
158
|
-
* Toolbar action buttons.
|
|
159
|
-
*/
|
|
160
|
-
toolbarActions = [{
|
|
161
|
-
icon: 'refresh',
|
|
162
|
-
tooltip: $localize `:@@refreshPage:Refresh the page`,
|
|
163
|
-
event: () => this.reloadPage(),
|
|
164
|
-
}];
|
|
165
|
-
/**
|
|
166
|
-
* MatStepper reference.
|
|
167
|
-
*/
|
|
168
|
-
matStepper;
|
|
169
|
-
/**
|
|
170
|
-
* Reference to the input elements.
|
|
171
|
-
*/
|
|
172
|
-
input;
|
|
173
|
-
/**
|
|
174
|
-
* Form group instance.
|
|
175
|
-
*/
|
|
176
|
-
_form;
|
|
177
|
-
/**
|
|
178
|
-
* Form group.
|
|
179
|
-
*/
|
|
180
|
-
get form() { return this._form; }
|
|
181
|
-
set form(form) {
|
|
182
|
-
this._form = form;
|
|
183
|
-
this.onAfterFormBuild();
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Form definition.
|
|
187
|
-
*/
|
|
188
|
-
formDefinition;
|
|
189
|
-
/**
|
|
190
|
-
* Field groups definition.
|
|
191
|
-
*/
|
|
192
|
-
fieldGroups;
|
|
193
|
-
/**
|
|
194
|
-
* Constructor.
|
|
195
|
-
* @param service The service to manage the entity.
|
|
196
|
-
* @param route The activated route.
|
|
197
|
-
* @param changeDetectorRef The change detector reference.
|
|
198
|
-
*/
|
|
199
|
-
constructor(entityCtor, service, route, changeDetectorRef) {
|
|
200
|
-
super(route, changeDetectorRef);
|
|
201
|
-
this.entityCtor = entityCtor;
|
|
202
|
-
this.service = service;
|
|
203
|
-
this.route = route;
|
|
204
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
205
|
-
this.listRoute = this.addSaveAndCloseRoute;
|
|
206
|
-
}
|
|
207
|
-
/**
|
|
208
|
-
* Called after the constructor, initializing input properties,
|
|
209
|
-
* and the first call to ngOnChanges.
|
|
210
|
-
*/
|
|
211
|
-
ngOnInit() {
|
|
212
|
-
super.ngOnInit();
|
|
213
|
-
this.init();
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Lifecycle hook that is called after a component's view has been fully initialized.
|
|
217
|
-
*/
|
|
218
|
-
ngAfterViewInit() {
|
|
219
|
-
this.handleExpansionPanelChanges = this.isEditMode;
|
|
220
|
-
super.ngAfterViewInit();
|
|
221
|
-
/* Set page title */
|
|
222
|
-
this.title = this.titleService.getTitle();
|
|
223
|
-
/* Set focus */
|
|
224
|
-
this.focus();
|
|
225
|
-
/*
|
|
226
|
-
* Force a new change detection cycle since change detections
|
|
227
|
-
* have finished when `ngAfterViewInit` is executed.
|
|
228
|
-
*/
|
|
229
|
-
this.changeDetectorRef.detectChanges();
|
|
230
|
-
/* Listen for stepper selection changes */
|
|
231
|
-
this.matStepper?.selectionChange?.subscribe((event) => this.onAfterStepChange(event));
|
|
232
|
-
/* Select the appropriate step based on the URL hash and mark previous steps as completed */
|
|
233
|
-
this.selectStepBasedOnUrlHash();
|
|
234
|
-
}
|
|
235
|
-
/**
|
|
236
|
-
* Called before any other lifecycle hook. Use it to inject dependencies,
|
|
237
|
-
* but avoid any serious work here.
|
|
238
|
-
* @param changes The changes object.
|
|
239
|
-
*/
|
|
240
|
-
ngOnChanges(changes) {
|
|
241
|
-
if ((changes?.id?.currentValue && changes.id.currentValue !== changes.id.previousValue) ||
|
|
242
|
-
(changes?.item?.currentValue && changes.item.currentValue !== changes.item.previousValue)) {
|
|
243
|
-
this.loadItem();
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Loads an item by ID.
|
|
248
|
-
* This method fetches the item if the component is in edit mode and the service endpoint is defined.
|
|
249
|
-
*
|
|
250
|
-
* @param callback - A function to be called after the item has been successfully loaded.
|
|
251
|
-
* This function will receive the loaded item as an argument.
|
|
252
|
-
*/
|
|
253
|
-
loadItem(callback) {
|
|
254
|
-
if (this.isEditMode && this.service?.endpoint) {
|
|
255
|
-
/* Set loading state to true to indicate that an item is being loaded */
|
|
256
|
-
this.isLoading = true;
|
|
257
|
-
/* Trigger change detection to update the view with the loading state */
|
|
258
|
-
this.changeDetectorRef.detectChanges();
|
|
259
|
-
/* Call the asynchronous method to load the item */
|
|
260
|
-
this.loadItemAsync().subscribe({
|
|
261
|
-
/* Handle the response when the item is successfully loaded */
|
|
262
|
-
next: (item) => {
|
|
263
|
-
/* Set loading state to false to indicate that loading has completed */
|
|
264
|
-
this.isLoading = false;
|
|
265
|
-
/* Execute the callback if provided, passing the loaded item */
|
|
266
|
-
if (callback) {
|
|
267
|
-
callback(item);
|
|
268
|
-
}
|
|
269
|
-
},
|
|
270
|
-
/* Handle any errors that occur during the loading process */
|
|
271
|
-
error: (error) => this.parseErrors(error)
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
/**
|
|
276
|
-
* Loads an item by ID asynchronously.
|
|
277
|
-
* @returns An Observable of the loaded entity.
|
|
278
|
-
*/
|
|
279
|
-
loadItemAsync() {
|
|
280
|
-
if (this.id) {
|
|
281
|
-
return this.service.get(this.id, Object.assign(this.query || {}, {
|
|
282
|
-
includes: this.includes?.length ? this.includes : this.updateIncludes,
|
|
283
|
-
projection: this.projection?.join(','),
|
|
284
|
-
observe: 'response'
|
|
285
|
-
}), { 'Disable-Cache': 'Yes' }, true, true).pipe(map((response) => {
|
|
286
|
-
/* Read permissions from the http headers */
|
|
287
|
-
const permissions = response?.headers?.get('Permissions')?.split(';') ?? [];
|
|
288
|
-
return {
|
|
289
|
-
entity: Object.assign(this.newInstance(), response.body),
|
|
290
|
-
permissions: new Permission({
|
|
291
|
-
canCreate: permissions.includes('Create'),
|
|
292
|
-
canRead: permissions.includes('Read'),
|
|
293
|
-
canUpdate: permissions.includes('Update'),
|
|
294
|
-
canDelete: permissions.includes('Delete'),
|
|
295
|
-
}),
|
|
296
|
-
};
|
|
297
|
-
}), tap(x => {
|
|
298
|
-
/* Set the loaded item */
|
|
299
|
-
this.item = Object.assign(this.newInstance(), x.entity);
|
|
300
|
-
/* Check if the user has permission to create, read, update, and delete */
|
|
301
|
-
this.canCreate ||= x.permissions.canCreate;
|
|
302
|
-
this.canRead ||= x.permissions.canRead;
|
|
303
|
-
this.canUpdate ||= x.permissions.canUpdate;
|
|
304
|
-
this.canDelete ||= x.permissions.canDelete;
|
|
305
|
-
/* Build the form */
|
|
306
|
-
this.buildForm();
|
|
307
|
-
/* Trigger event afterItemLoaded */
|
|
308
|
-
this.onAfterItemLoaded();
|
|
309
|
-
}));
|
|
310
|
-
}
|
|
311
|
-
return new Observable();
|
|
312
|
-
}
|
|
313
|
-
/**
|
|
314
|
-
* Saves data into the database.
|
|
315
|
-
* This method validates the form, checks if it's valid, and sends data to the server to either update or create a new record.
|
|
316
|
-
* @param action The save action to perform.
|
|
317
|
-
* @param form The form to validate and save.
|
|
318
|
-
*/
|
|
319
|
-
save(action = SaveAction.SaveAndClose, form) {
|
|
320
|
-
/* Validate the form data before proceeding */
|
|
321
|
-
this.validateForm(form);
|
|
322
|
-
/* Ensure that the form reference is set and validated */
|
|
323
|
-
form = this.form || form;
|
|
324
|
-
/* Exit if the form is invalid */
|
|
325
|
-
if (form && !this.isFormValid(form)) {
|
|
326
|
-
return;
|
|
327
|
-
}
|
|
328
|
-
/* Set a flag to prevent duplicate form submissions */
|
|
329
|
-
this.isSaving = true;
|
|
330
|
-
/* If in edit mode, update the record */
|
|
331
|
-
if (this.isEditMode) {
|
|
332
|
-
/* The data has not changed? */
|
|
333
|
-
if (form && form.pristine) {
|
|
334
|
-
this.onAfterSubmit(action);
|
|
335
|
-
return;
|
|
336
|
-
}
|
|
337
|
-
/* Send the data to the server */
|
|
338
|
-
this.update({ params: Utils.toHttpParams({ includes: this.updateIncludes }) }).subscribe({
|
|
339
|
-
next: (response) => {
|
|
340
|
-
/* Apply saved data to the form */
|
|
341
|
-
this.onAfterSubmit(action, response);
|
|
342
|
-
/* If the user clicks 'apply' reload the page */
|
|
343
|
-
if (action == SaveAction.SaveAndEdit) {
|
|
344
|
-
if (this.reload.observed) {
|
|
345
|
-
this.reload.emit(this.formValue);
|
|
346
|
-
}
|
|
347
|
-
else {
|
|
348
|
-
this.reloadPage();
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
},
|
|
352
|
-
/* Process any errors from the server response */
|
|
353
|
-
error: (error) => this.parseErrors(error)
|
|
354
|
-
});
|
|
355
|
-
}
|
|
356
|
-
/* Otherwise, create a new one */
|
|
357
|
-
else {
|
|
358
|
-
/* Send the data to the server */
|
|
359
|
-
this.create().subscribe({
|
|
360
|
-
next: (response) => {
|
|
361
|
-
this.id = response?.value?.id;
|
|
362
|
-
this.onAfterSubmit(action, response);
|
|
363
|
-
if (form) {
|
|
364
|
-
Object.keys(form.controls).forEach(key => {
|
|
365
|
-
let ctr = form.controls[key];
|
|
366
|
-
ctr.markAsPristine();
|
|
367
|
-
ctr.markAsUntouched();
|
|
368
|
-
ctr.updateValueAndValidity();
|
|
369
|
-
});
|
|
370
|
-
}
|
|
371
|
-
},
|
|
372
|
-
/* Process any errors from the server response */
|
|
373
|
-
error: (error) => this.parseErrors(error)
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
/* Detect changes */
|
|
377
|
-
this.changeDetectorRef.detectChanges();
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* Saves data and navigates to the edit view.
|
|
381
|
-
*/
|
|
382
|
-
apply() {
|
|
383
|
-
this.save(SaveAction.SaveAndEdit);
|
|
384
|
-
}
|
|
385
|
-
/**
|
|
386
|
-
* Deletes the current record.
|
|
387
|
-
* This method shows a confirmation dialog and deletes the record if the user confirms.
|
|
388
|
-
* @param httpHeaders Optional HTTP headers to include in the delete request.
|
|
389
|
-
*/
|
|
390
|
-
delete(httpHeaders) {
|
|
391
|
-
this.showDeleteItemDialog().subscribe((accept) => {
|
|
392
|
-
if (accept && this.id) {
|
|
393
|
-
this.service.delete(this.id, undefined, { headers: httpHeaders ?? this.toHttpHeaders({ 'Show-Message': 'yes' }) })
|
|
394
|
-
.subscribe(response => {
|
|
395
|
-
this.back();
|
|
396
|
-
}, error => {
|
|
397
|
-
console.debug(error);
|
|
398
|
-
});
|
|
399
|
-
}
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
|
-
/**
|
|
403
|
-
* Initializes the form.
|
|
404
|
-
* This method sets up the form by extracting query parameters, setting the entity ID, and building the form.
|
|
405
|
-
*/
|
|
406
|
-
init() {
|
|
407
|
-
/* Get the entity ID from the query */
|
|
408
|
-
if (!this.id && !this.item) {
|
|
409
|
-
/* Assign query params into query object */
|
|
410
|
-
let ignoredParams = ['id', 'returnurl', 'panelId'];
|
|
411
|
-
Object.assign(this.query, this.sanitizeObject(this.route.snapshot.params || {}, ...ignoredParams), this.sanitizeObject(this.route.snapshot.data?.query || {}, ...ignoredParams), this.sanitizeObject(this.route.snapshot.queryParams || {}, ...ignoredParams));
|
|
412
|
-
/* Get id from the url */
|
|
413
|
-
let id = this.route.snapshot.paramMap.get('id');
|
|
414
|
-
if (id > 0) {
|
|
415
|
-
this.id = id;
|
|
416
|
-
}
|
|
417
|
-
else if (!this.id && this.route.snapshot?.data?.id) {
|
|
418
|
-
this.id = this.route.snapshot?.data?.id;
|
|
419
|
-
}
|
|
420
|
-
this.onAfterSetId();
|
|
421
|
-
}
|
|
422
|
-
/* Create a new instance of the TEntity */
|
|
423
|
-
if (!this.isEditMode && !this.form) {
|
|
424
|
-
this.item = Object.assign(this.newInstance(), this.item || {}, this.query || {});
|
|
425
|
-
this.buildForm();
|
|
426
|
-
}
|
|
427
|
-
/* Set panel ID from query */
|
|
428
|
-
this.subtitle ||= this.route.snapshot?.data?.subtitle;
|
|
429
|
-
}
|
|
430
|
-
/**
|
|
431
|
-
* Builds the form fields.
|
|
432
|
-
* This method constructs form fields based on the entity's form definition and includes necessary navigation and menu items.
|
|
433
|
-
*/
|
|
434
|
-
buildFields() {
|
|
435
|
-
/* Get form definition */
|
|
436
|
-
this.formDefinition = getFormDefinition(this.newInstance());
|
|
437
|
-
/* Set includes from form definition, if any */
|
|
438
|
-
this.formDefinition?.includes?.forEach(x => this.include(x.entity, x.update));
|
|
439
|
-
/* Add toolbar menu items, if any */
|
|
440
|
-
if (this.formDefinition?.toolbarMenuItems?.length) {
|
|
441
|
-
this.toolbarMenuItems ??= [];
|
|
442
|
-
this.toolbarMenuItems = this.toolbarMenuItems.concat(...this.formDefinition?.toolbarMenuItems);
|
|
443
|
-
this.toolbarMenuItems.forEach((x, i) => x.index ??= i);
|
|
444
|
-
}
|
|
445
|
-
/*
|
|
446
|
-
Assign a value to `this.deletable` only if it is currently falsy.
|
|
447
|
-
Use the `deletable` property from `formDefinition`, defaulting to `false` if undefined.
|
|
448
|
-
*/
|
|
449
|
-
this.deletable &&= (this.formDefinition.deletable ?? false);
|
|
450
|
-
/* Create the form fields using the entity type */
|
|
451
|
-
this.fieldGroups = this.formDefinition?.fieldGroups?.filter(x => !x.hidden);
|
|
452
|
-
/* Add list menu items */
|
|
453
|
-
this.addToolbarMenuItems();
|
|
454
|
-
}
|
|
455
|
-
/**
|
|
456
|
-
* Builds a new form.
|
|
457
|
-
* This method should be implemented to construct the form for the specific entity.
|
|
458
|
-
*/
|
|
459
|
-
buildForm() { }
|
|
460
|
-
/**
|
|
461
|
-
* Validates the form.
|
|
462
|
-
* This method sets the form as submitted, updates its validity, and optionally logs debug information.
|
|
463
|
-
* @param form The form to validate.
|
|
464
|
-
*/
|
|
465
|
-
validateForm(form) {
|
|
466
|
-
var form = form || this.form;
|
|
467
|
-
/* Set the form as submitted */
|
|
468
|
-
if (form && form instanceof FormGroup) {
|
|
469
|
-
/* Set form as submitted */
|
|
470
|
-
form['submitted'] = true;
|
|
471
|
-
/* Update value and validity */
|
|
472
|
-
form.updateValueAndValidity();
|
|
473
|
-
}
|
|
474
|
-
/* Print some debug information */
|
|
475
|
-
this.debugForm(form);
|
|
476
|
-
}
|
|
477
|
-
/**
|
|
478
|
-
* Checks if the form is valid.
|
|
479
|
-
* This method validates the form, marks invalid controls, and shows error messages if any.
|
|
480
|
-
* @param form The form to check for validity.
|
|
481
|
-
* @returns A boolean indicating whether the form is valid.
|
|
482
|
-
*/
|
|
483
|
-
isFormValid(form) {
|
|
484
|
-
/* Print some debug information */
|
|
485
|
-
this.debugForm(form);
|
|
486
|
-
/* If the form is not valid */
|
|
487
|
-
if (form && !form.valid) {
|
|
488
|
-
/* Mark invalid controls as dirty and touched */
|
|
489
|
-
Object.keys(form.controls)
|
|
490
|
-
.filter(x => !form.controls[x].valid)
|
|
491
|
-
.forEach(key => this.invalidateControl(form.controls[key]));
|
|
492
|
-
/* Show error messages */
|
|
493
|
-
(async () => {
|
|
494
|
-
/* Wait until 'mat-error' is displayed */
|
|
495
|
-
await new Promise(y => setTimeout(y, 200));
|
|
496
|
-
/* Parse the error messages */
|
|
497
|
-
var errors = Array();
|
|
498
|
-
Object.keys(form.controls)
|
|
499
|
-
.filter(x => !form.controls[x].valid)
|
|
500
|
-
.forEach(key => {
|
|
501
|
-
/* Get error text */
|
|
502
|
-
var error = this.getElementError(form.controls[key]?.nativeElement);
|
|
503
|
-
if (error) {
|
|
504
|
-
errors.push(error);
|
|
505
|
-
}
|
|
506
|
-
});
|
|
507
|
-
/* Build error message */
|
|
508
|
-
var message = errors.length ? errors.slice(0, 3).join('\n') : $localize `:@@snackbar.error.required-fields:All fields marked with an asterisk (*) are required.`;
|
|
509
|
-
/* Show a notice */
|
|
510
|
-
this.snackBarService.open(message, 'Ok', { duration: 3000, panelClass: ['error'] });
|
|
511
|
-
return false;
|
|
512
|
-
})();
|
|
513
|
-
return false;
|
|
514
|
-
}
|
|
515
|
-
return true;
|
|
516
|
-
}
|
|
517
|
-
/**
|
|
518
|
-
* Resets form controls.
|
|
519
|
-
* This method marks all controls in the form as pristine, untouched, and updates their validity.
|
|
520
|
-
* @param form The form to reset.
|
|
521
|
-
*/
|
|
522
|
-
resetForm(form) {
|
|
523
|
-
if (!form) {
|
|
524
|
-
return;
|
|
525
|
-
}
|
|
526
|
-
Object.keys(form.controls).forEach(key => {
|
|
527
|
-
let ctr = form.controls[key];
|
|
528
|
-
ctr.markAsPristine();
|
|
529
|
-
ctr.markAsUntouched();
|
|
530
|
-
ctr.updateValueAndValidity();
|
|
531
|
-
});
|
|
532
|
-
}
|
|
533
|
-
/**
|
|
534
|
-
* Invalidates controls recursively.
|
|
535
|
-
* This method marks all controls in the group as dirty and touched if they are invalid.
|
|
536
|
-
* @param control The control or group of controls to invalidate.
|
|
537
|
-
*/
|
|
538
|
-
invalidateControl(control) {
|
|
539
|
-
/* Check the control against null */
|
|
540
|
-
if (!control) {
|
|
541
|
-
return;
|
|
542
|
-
}
|
|
543
|
-
/* Check if the control is a group */
|
|
544
|
-
let formGroup = control;
|
|
545
|
-
if (formGroup?.controls) {
|
|
546
|
-
Object.keys(formGroup.controls)
|
|
547
|
-
.filter(x => !formGroup.controls[x].valid)
|
|
548
|
-
.forEach(x => this.invalidateControl(formGroup.controls[x]));
|
|
549
|
-
}
|
|
550
|
-
else {
|
|
551
|
-
control.markAsDirty();
|
|
552
|
-
control.markAsTouched();
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
/**
|
|
556
|
-
* Shows form errors.
|
|
557
|
-
* This method logs form control errors to the console if debugging is enabled.
|
|
558
|
-
* @param form The form to debug.
|
|
559
|
-
*/
|
|
560
|
-
debugForm(form) {
|
|
561
|
-
if (form && this.debug) {
|
|
562
|
-
console.log('Form:', form);
|
|
563
|
-
Object.keys(form.controls).forEach(key => {
|
|
564
|
-
const controlErrors = form.controls[key].errors;
|
|
565
|
-
if (controlErrors != null) {
|
|
566
|
-
Object.keys(controlErrors).forEach(keyError => {
|
|
567
|
-
console.log('Key control: ' + key + ', keyError: ' + keyError + ', err value: ', controlErrors[keyError]);
|
|
568
|
-
});
|
|
569
|
-
}
|
|
570
|
-
});
|
|
571
|
-
}
|
|
572
|
-
}
|
|
573
|
-
/**
|
|
574
|
-
* Adds toolbar menu items.
|
|
575
|
-
* This method adds the 'Delete' menu item to the toolbar if the entity is deletable.
|
|
576
|
-
*/
|
|
577
|
-
addToolbarMenuItems() {
|
|
578
|
-
/* Add 'Delete' menu item */
|
|
579
|
-
if (this.deletable) {
|
|
580
|
-
this.toolbarMenuItems.push({
|
|
581
|
-
title: $localize `:@@delete:Delete`,
|
|
582
|
-
icon: 'delete_forever',
|
|
583
|
-
iconClass: 'tc-orange-800',
|
|
584
|
-
event: () => this.delete(),
|
|
585
|
-
disable: () => !this.id,
|
|
586
|
-
hide: () => !this.canDeleteItem(),
|
|
587
|
-
index: 1000
|
|
588
|
-
});
|
|
589
|
-
}
|
|
590
|
-
if (this.toolbarMenuItems.length) {
|
|
591
|
-
/* Sort the menu items by index */
|
|
592
|
-
Utils.sortArray(this.toolbarMenuItems, 'index');
|
|
593
|
-
/* Add the toolbar menu items to the the toolbar actions */
|
|
594
|
-
this.toolbarActions.push({ icon: 'more_vert', items: this.toolbarMenuItems });
|
|
595
|
-
}
|
|
596
|
-
}
|
|
597
|
-
/**
|
|
598
|
-
* Loads the previous URL in the history list.
|
|
599
|
-
* This method navigates back to the previous URL or performs specific actions based on the save action.
|
|
600
|
-
* @param action The save action that determines the navigation behavior.
|
|
601
|
-
*/
|
|
602
|
-
back(action = SaveAction.SaveAndClose) {
|
|
603
|
-
if (this.reload.observed) {
|
|
604
|
-
/* If there are observers for the reload event, emit the current form value */
|
|
605
|
-
this.reload.emit(this.formValue);
|
|
606
|
-
}
|
|
607
|
-
else {
|
|
608
|
-
/* No observers, proceed with navigation logic */
|
|
609
|
-
if (action == SaveAction.SaveAndClose && this.returnUrl) {
|
|
610
|
-
/* Navigate to the return URL if action is SaveAndClose and returnUrl is set */
|
|
611
|
-
this.navigateToReturnUrl();
|
|
612
|
-
}
|
|
613
|
-
else {
|
|
614
|
-
/* No returnUrl, continue with other actions */
|
|
615
|
-
if (action == SaveAction.SaveAndClose) {
|
|
616
|
-
/* Go back to the previous page in history */
|
|
617
|
-
this.location.back();
|
|
618
|
-
}
|
|
619
|
-
else if (action == SaveAction.SaveAndEdit && parseInt(this.id?.toString() ?? '0') > 0) {
|
|
620
|
-
/* For SaveAndEdit action with a valid ID */
|
|
621
|
-
if (!this.currentBaseRoute?.endsWith('/add')) {
|
|
622
|
-
/* Reload the page if the current route does not end with '/add' */
|
|
623
|
-
this.reloadPage();
|
|
624
|
-
}
|
|
625
|
-
else {
|
|
626
|
-
/* Navigate to the edit route */
|
|
627
|
-
this.router.navigate([`${this.addSaveAndEditRoute}${this.id}`], { relativeTo: this.route });
|
|
628
|
-
/* Replace the current history entry to remove this page from the history */
|
|
629
|
-
this.location.replaceState(this.router.createUrlTree([`${this.addSaveAndEditRoute}${this.id}`], { relativeTo: this.route }).toString());
|
|
630
|
-
}
|
|
631
|
-
}
|
|
632
|
-
else if (action == SaveAction.SaveAndNew) {
|
|
633
|
-
/* Handle SaveAndNew action */
|
|
634
|
-
this.afterReload();
|
|
635
|
-
}
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
}
|
|
639
|
-
/**
|
|
640
|
-
* Sets the return URL.
|
|
641
|
-
* This method sets the return URL and updates the list route accordingly.
|
|
642
|
-
* @param returnUrl The URL to return to after the current action is complete.
|
|
643
|
-
*/
|
|
644
|
-
setReturnUrl(returnUrl) {
|
|
645
|
-
super.setReturnUrl(returnUrl);
|
|
646
|
-
this.listRoute = this.returnUrl || this.listRoute;
|
|
647
|
-
}
|
|
648
|
-
/**
|
|
649
|
-
* Creates a new instance of TEntity.
|
|
650
|
-
* This method initializes a new entity using the provided constructor.
|
|
651
|
-
* @param init Optional partial initialization object.
|
|
652
|
-
* @returns A new instance of TEntity.
|
|
653
|
-
*/
|
|
654
|
-
newInstance(init) {
|
|
655
|
-
return new this.entityCtor(init);
|
|
656
|
-
}
|
|
657
|
-
/**
|
|
658
|
-
* Creates the entity.
|
|
659
|
-
* This method sends a request to create a new entity on the server.
|
|
660
|
-
* @param httpOptions Optional HTTP options for the request.
|
|
661
|
-
* @param httpHeaders Optional HTTP headers for the request.
|
|
662
|
-
* @returns An Observable of the created TEntity.
|
|
663
|
-
*/
|
|
664
|
-
create(httpOptions, httpHeaders) {
|
|
665
|
-
this.onBeforeCreate();
|
|
666
|
-
return this.service.create(this.formValue, undefined, Object.assign(httpOptions || {}, { headers: httpHeaders ?? this.toHttpHeaders({ 'Show-Message': 'yes' }) }), false);
|
|
667
|
-
}
|
|
668
|
-
/**
|
|
669
|
-
* Updates the entity.
|
|
670
|
-
* This method sends a request to update an existing entity on the server.
|
|
671
|
-
* @param httpOptions Optional HTTP options for the request.
|
|
672
|
-
* @param httpHeaders Optional HTTP headers for the request.
|
|
673
|
-
* @returns An Observable of the updated TEntity.
|
|
674
|
-
*/
|
|
675
|
-
update(httpOptions, httpHeaders) {
|
|
676
|
-
this.onBeforeUpdate();
|
|
677
|
-
return this.service.update(this.id, Object.assign(this.item, this.formValue), undefined, Object.assign(httpOptions || {}, { headers: httpHeaders ?? this.toHttpHeaders({ 'Show-Message': 'yes' }), }), false);
|
|
678
|
-
}
|
|
679
|
-
/**
|
|
680
|
-
* Includes specified navigations.
|
|
681
|
-
* This method adds specified navigation properties to the includes array,
|
|
682
|
-
* optionally adding them to the updateIncludes array as well.
|
|
683
|
-
* @param inc The navigation property to include.
|
|
684
|
-
* @param update Whether to include in updateIncludes array.
|
|
685
|
-
*/
|
|
686
|
-
include(inc, update = false) {
|
|
687
|
-
this.includes.push(inc);
|
|
688
|
-
if (update) {
|
|
689
|
-
this.updateIncludes.push(inc);
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
/**
|
|
693
|
-
* Checks if the item is deletable.
|
|
694
|
-
* This method determines if the current item can be deleted based on its properties.
|
|
695
|
-
* @returns True if the item can be deleted, false otherwise.
|
|
696
|
-
*/
|
|
697
|
-
canDeleteItem() { return this.canDelete && (!this.item?.hasOwnProperty('deletable') || this.item['deletable']); }
|
|
698
|
-
/**
|
|
699
|
-
* Event emitted when the ID is set.
|
|
700
|
-
* This method triggers the loading of the item when the ID is set.
|
|
701
|
-
*/
|
|
702
|
-
onAfterSetId() {
|
|
703
|
-
if (this.id) {
|
|
704
|
-
this.loadItem();
|
|
705
|
-
}
|
|
706
|
-
}
|
|
707
|
-
/**
|
|
708
|
-
* Event emitted when the selected step has changed.
|
|
709
|
-
* This method handles actions to be taken when the stepper selection changes.
|
|
710
|
-
* @param $event The stepper selection event.
|
|
711
|
-
*/
|
|
712
|
-
onAfterStepChange($event) { }
|
|
713
|
-
/**
|
|
714
|
-
* Sets the selected step in the stepper based on the URL hash.
|
|
715
|
-
* Marks all previous steps as completed.
|
|
716
|
-
*/
|
|
717
|
-
selectStepBasedOnUrlHash() {
|
|
718
|
-
/* Ensure we are not in edit mode, and that both the stepper and URL hash are available */
|
|
719
|
-
if (!this.isEditMode && this.matStepper && this.urlHash) {
|
|
720
|
-
/* Find the step that matches the state from the URL hash */
|
|
721
|
-
const matchedStep = this.matStepper.steps.find((step) => step.state === this.urlHash);
|
|
722
|
-
if (matchedStep) {
|
|
723
|
-
/* Get the index of the matched step */
|
|
724
|
-
const matchedIndex = this.matStepper.steps.toArray().indexOf(matchedStep);
|
|
725
|
-
/* Mark all previous steps as completed */
|
|
726
|
-
this.matStepper.steps.forEach((step, index) => {
|
|
727
|
-
if (index < matchedIndex) {
|
|
728
|
-
step.completed = true;
|
|
729
|
-
}
|
|
730
|
-
});
|
|
731
|
-
/* Set the selected step based on the matched state */
|
|
732
|
-
this.matStepper.selectedIndex = matchedIndex;
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
}
|
|
736
|
-
/**
|
|
737
|
-
* Event emitted when the entity has been loaded.
|
|
738
|
-
* This method handles actions to be taken after the entity is loaded.
|
|
739
|
-
*/
|
|
740
|
-
onAfterItemLoaded() { }
|
|
741
|
-
/**
|
|
742
|
-
* Event emitted before the form is built.
|
|
743
|
-
* This method allows performing operations before the form is constructed.
|
|
744
|
-
*/
|
|
745
|
-
onBeforeFormBuild() { }
|
|
746
|
-
/**
|
|
747
|
-
* Event emitted when the form has been built.
|
|
748
|
-
* This method handles actions to be taken after the form is constructed,
|
|
749
|
-
* such as disabling form controls if the form is set to be disabled.
|
|
750
|
-
*/
|
|
751
|
-
onAfterFormBuild() {
|
|
752
|
-
if (this.form && this.disabled) {
|
|
753
|
-
Object.keys(this.form.controls).forEach(key => {
|
|
754
|
-
let control = this.form.controls[key];
|
|
755
|
-
control?.disable({ emitEvent: false });
|
|
756
|
-
});
|
|
757
|
-
}
|
|
758
|
-
}
|
|
759
|
-
/**
|
|
760
|
-
* Event emitted when the entity has been created.
|
|
761
|
-
*/
|
|
762
|
-
onBeforeCreate() { }
|
|
763
|
-
/**
|
|
764
|
-
* Event emitted when the entity has been updated.
|
|
765
|
-
*/
|
|
766
|
-
onBeforeUpdate() { }
|
|
767
|
-
/**
|
|
768
|
-
* Called before data submission.
|
|
769
|
-
* This method allows performing operations before submitting data.
|
|
770
|
-
*/
|
|
771
|
-
beforeSubmit(_ = SaveAction.SaveAndClose) { }
|
|
772
|
-
/**
|
|
773
|
-
* Event emitted after data submission.
|
|
774
|
-
* This method handles post-submission actions such as resetting the saving state,
|
|
775
|
-
* updating the change detector, and navigating back based on the save action.
|
|
776
|
-
* @param action The save action taken (e.g., SaveAndClose, SaveAndNew).
|
|
777
|
-
* @param response The response received after submission.
|
|
778
|
-
*/
|
|
779
|
-
onAfterSubmit(action = SaveAction.SaveAndClose, response = null) {
|
|
780
|
-
/* Reset the saving flag once data is successfully sent */
|
|
781
|
-
this.isSaving = false;
|
|
782
|
-
this.changeDetectorRef.detectChanges();
|
|
783
|
-
this.back(action);
|
|
784
|
-
}
|
|
785
|
-
/**
|
|
786
|
-
* Called after the page is reloaded.
|
|
787
|
-
* This method reinitializes the item with a new instance and applies any query parameters.
|
|
788
|
-
*/
|
|
789
|
-
afterReload() {
|
|
790
|
-
this.item = Object.assign(this.newInstance(), this.query);
|
|
791
|
-
}
|
|
792
|
-
/**
|
|
793
|
-
* Sets focus to the first input element.
|
|
794
|
-
* Ensures the first input element in the form is focused for user convenience.
|
|
795
|
-
*/
|
|
796
|
-
focus() {
|
|
797
|
-
if (this.input && this.input.first && this.input.first.nativeElement) {
|
|
798
|
-
this.input.first.nativeElement.focus();
|
|
799
|
-
}
|
|
800
|
-
}
|
|
801
|
-
/**
|
|
802
|
-
* Retrieves the error message for a given native element.
|
|
803
|
-
* This method navigates through the DOM structure to find error messages associated with form fields.
|
|
804
|
-
* @param nativeElement The DOM element to check for errors.
|
|
805
|
-
* @returns The error message associated with the element, or undefined if no error is found.
|
|
806
|
-
*/
|
|
807
|
-
getElementError(nativeElement) {
|
|
808
|
-
/* Get parent element 'mat-form-field' */
|
|
809
|
-
var matFormField = nativeElement?.closest('.mat-form-field');
|
|
810
|
-
if (!matFormField) {
|
|
811
|
-
return undefined;
|
|
812
|
-
}
|
|
813
|
-
/* Get child element 'mat-error' */
|
|
814
|
-
var matErrors = matFormField.querySelectorAll('.mat-error');
|
|
815
|
-
if (!matErrors) {
|
|
816
|
-
return undefined;
|
|
817
|
-
}
|
|
818
|
-
/* Get child element 'mat-label' */
|
|
819
|
-
var matLabel = matFormField.querySelector('mat-label');
|
|
820
|
-
if (!matLabel) {
|
|
821
|
-
return undefined;
|
|
822
|
-
}
|
|
823
|
-
/* Get error texts */
|
|
824
|
-
var errorsArray = Array.prototype.slice.call(matErrors)
|
|
825
|
-
?.filter((x) => x.textContent)
|
|
826
|
-
?.map((x) => x.textContent);
|
|
827
|
-
return `'${matLabel.textContent}': ${errorsArray?.join(', ')}`;
|
|
828
|
-
}
|
|
829
|
-
/**
|
|
830
|
-
* Responds to user-initiated keyboard events.
|
|
831
|
-
* This method listens for specific key combinations and triggers save actions or form cancellation.
|
|
832
|
-
* @param event The keyboard event triggered by the user.
|
|
833
|
-
*/
|
|
834
|
-
handleKeyboardEvent(event) {
|
|
835
|
-
if (event.ctrlKey || event.metaKey) {
|
|
836
|
-
switch (event.key) {
|
|
837
|
-
case 's':
|
|
838
|
-
event.preventDefault();
|
|
839
|
-
this.save(SaveAction.SaveAndClose);
|
|
840
|
-
break;
|
|
841
|
-
case 'd':
|
|
842
|
-
event.preventDefault();
|
|
843
|
-
this.save(SaveAction.SaveAndNew);
|
|
844
|
-
break;
|
|
845
|
-
case 'e':
|
|
846
|
-
event.preventDefault();
|
|
847
|
-
this.save(SaveAction.SaveAndEdit);
|
|
848
|
-
break;
|
|
849
|
-
}
|
|
850
|
-
}
|
|
851
|
-
/* Cancel the form if the user presses the ESC key */
|
|
852
|
-
if (event.keyCode == 27) {
|
|
853
|
-
this.back();
|
|
854
|
-
}
|
|
855
|
-
}
|
|
856
|
-
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GenericFormBaseComponent, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive });
|
|
857
|
-
/** @nocollapse */ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: GenericFormBaseComponent, inputs: { id: "id", _item: "_item", item: "item", includes: "includes", updateIncludes: "updateIncludes", projection: "projection", query: "query", readonly: "readonly", disabled: "disabled", form: "form" }, host: { listeners: { "document:keydown": "handleKeyboardEvent($event)" } }, viewQueries: [{ propertyName: "matStepper", first: true, predicate: MatStepper, descendants: true }, { propertyName: "input", predicate: ["focus"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
|
|
858
|
-
}
|
|
859
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: GenericFormBaseComponent, decorators: [{
|
|
860
|
-
type: Directive
|
|
861
|
-
}], ctorParameters: () => [{ type: i0.Type }, { type: undefined }, { type: i1.ActivatedRoute }, { type: i0.ChangeDetectorRef }], propDecorators: { id: [{
|
|
862
|
-
type: Input
|
|
863
|
-
}], _item: [{
|
|
864
|
-
type: Input
|
|
865
|
-
}], item: [{
|
|
866
|
-
type: Input
|
|
867
|
-
}], includes: [{
|
|
868
|
-
type: Input
|
|
869
|
-
}], updateIncludes: [{
|
|
870
|
-
type: Input
|
|
871
|
-
}], projection: [{
|
|
872
|
-
type: Input
|
|
873
|
-
}], query: [{
|
|
874
|
-
type: Input
|
|
875
|
-
}], readonly: [{
|
|
876
|
-
type: Input
|
|
877
|
-
}], disabled: [{
|
|
878
|
-
type: Input
|
|
879
|
-
}], matStepper: [{
|
|
880
|
-
type: ViewChild,
|
|
881
|
-
args: [MatStepper]
|
|
882
|
-
}], input: [{
|
|
883
|
-
type: ViewChildren,
|
|
884
|
-
args: ['focus']
|
|
885
|
-
}], form: [{
|
|
886
|
-
type: Input
|
|
887
|
-
}], handleKeyboardEvent: [{
|
|
888
|
-
type: HostListener,
|
|
889
|
-
args: ['document:keydown', ['$event']]
|
|
890
|
-
}] } });
|
|
891
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy1mb3JtLWJhc2UuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2RrL3NyYy9saWIvYmFzZS9jb21wb25lbnRzL2dlbmVyaWMtZm9ybS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQTRCLElBQUksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNJLE9BQU8sRUFBbUIsU0FBUyxFQUE0QixNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDakQsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUdyRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBTXBFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7O0FBRWpELFdBQVc7QUFFWCxNQUFNLE9BQWdCLHdCQUE0RixTQUFRLGFBQWE7SUF3TzlIO0lBQ0c7SUFDQTtJQUNBO0lBMU9YOztHQUVFO0lBQ0ssTUFBTSxHQUFXLEtBQUssQ0FBQztJQUU5Qjs7T0FFRztJQUNJLFVBQVUsR0FBWSxLQUFLLENBQUM7SUFFbkM7O09BRUc7SUFDSSxVQUFVLEdBQXNCLFVBQVUsQ0FBQztJQUVsRDs7T0FFRztJQUNJ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QUFDLGNBQWMsRUFBRSxDQUFDO29CQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDakMsTUFBTTtnQkFFUCxLQUFLLEdBQUc7b0JBQ1AsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO29CQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztvQkFDbEMsTUFBTTtZQUNSLENBQUM7UUFDRixDQUFDO1FBRUQscURBQXFEO1FBQ3JELElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDYixDQUFDO0lBQ0YsQ0FBQzswSEFwK0JvQix3QkFBd0I7OEdBQXhCLHdCQUF3QixrV0EwTGxDLFVBQVU7OzJGQTFMQSx3QkFBd0I7a0JBRDdDLFNBQVM7MkpBbUNFLEVBQUU7c0JBRFosS0FBSztnQkFlSSxLQUFLO3NCQURkLEtBQUs7Z0JBT0ssSUFBSTtzQkFEZCxLQUFLO2dCQW1CQyxRQUFRO3NCQURkLEtBQUs7Z0JBT0MsY0FBYztzQkFEcEIsS0FBSztnQkFPQyxVQUFVO3NCQURoQixLQUFLO2dCQU9DLEtBQUs7c0JBRFgsS0FBSztnQkFPQyxRQUFRO3NCQURkLEtBQUs7Z0JBT0MsUUFBUTtzQkFEZCxLQUFLO2dCQXNGSSxVQUFVO3NCQURuQixTQUFTO3VCQUFDLFVBQVU7Z0JBT2QsS0FBSztzQkFEWCxZQUFZO3VCQUFDLE9BQU87Z0JBWVYsSUFBSTtzQkFEZCxLQUFLO2dCQWl3QkMsbUJBQW1CO3NCQUR6QixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU3RlcHBlclNlbGVjdGlvbkV2ZW50IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3N0ZXBwZXInO1xyXG5pbXBvcnQgeyBIdHRwSGVhZGVycyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzLCBUeXBlLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIEZvcm1Hcm91cCwgTmdGb3JtLCBWYWxpZGF0aW9uRXJyb3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRTdGVwcGVyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc3RlcHBlcic7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgbWFwLCB0YXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi9jb21tb24vZnVuY3Rpb25zL3V0aWxzJztcclxuaW1wb3J0IHsgQWN0aW9uSXRlbSB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RlbHMvYWN0aW9uLWl0ZW0nO1xyXG5pbXBvcnQgeyBJRW50aXR5IH0gZnJvbSAnLi4vLi4vY29tbW9uL21vZGVscy9lbnRpdHknO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uIH0gZnJvbSAnLi4vLi4vY29tbW9uL21vZGVscy9wZXJtaXNzaW9uJztcclxuaW1wb3J0IHsgU2F2ZUFjdGlvbiB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RlbHMvc2F2ZS1hY3Rpb24nO1xyXG5pbXBvcnQgeyBnZXRGb3JtRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Zvcm1zL2Z1bmN0aW9ucy9mdW5jdGlvbnMnO1xyXG5pbXBvcnQgeyBGb3JtRGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2Zvcm1zL21vZGVscy9mb3JtLWRlZmluaXRpb24nO1xyXG5pbXBvcnQgeyBGb3JtRmllbGRHcm91cERlZmluaXRpb24gfSBmcm9tICcuLi8uLi9mb3Jtcy9tb2RlbHMvZm9ybS1maWVsZC1ncm91cC1kZWZpbml0aW9uJztcclxuaW1wb3J0IHsgQXBpUmVzcG9uc2UgfSBmcm9tICcuLi8uLi9odHRwL21vZGVscy9yZXNwb25zZSc7XHJcbmltcG9ydCB7IEdlbmVyaWNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaHR0cC9zZXJ2aWNlcy9nZW5lcmljLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9pZ2VuZXJpYy1mb3JtLWJhc2UnO1xyXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50IH0gZnJvbSAnLi9iYXNlLmNvbXBvbmVudCc7XHJcblxyXG4vLyBAZHluYW1pY1xyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEdlbmVyaWNGb3JtQmFzZUNvbXBvbmVudDxURW50aXR5IGV4dGVuZHMgSUVudGl0eSwgVFNlcnZpY2UgZXh0ZW5kcyBHZW5lcmljU2VydmljZTxURW50aXR5Pj4gZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgSUdlbmVyaWNGb3JtQmFzZUNvbXBvbmVudDxURW50aXR5PiwgT25DaGFuZ2VzIHtcclxuXHQvKipcclxuICogVGhlIGFjdGlvbiBvZiB0aGUgZm9ybSAoYWRkIHwgZWRpdCkuXHJcbiAqL1xyXG5cdHB1YmxpYyBhY3Rpb246IHN0cmluZyA9ICdhZGQnO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbmRpY2F0ZXMgaWYgdGhlIGZvcm0gaXMgaW4gZWRpdCBtb2RlLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBpc0VkaXRNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNhdmUgYWN0aW9uIGVudW1lcmF0aW9uLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBTYXZlQWN0aW9uOiB0eXBlb2YgU2F2ZUFjdGlvbiA9IFNhdmVBY3Rpb247XHJcblxyXG5cdC8qKlxyXG5cdCAqIE5hdmlnYXRpb24gcm91dGVzLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBlZGl0U2F2ZUFuZENsb3NlUm91dGU6IHN0cmluZyA9ICcuLi8uLi8nO1xyXG5cdHB1YmxpYyBhZGRTYXZlQW5kQ2xvc2VSb3V0ZTogc3RyaW5nID0gJy4uLyc7XHJcblx0cHVibGljIGFkZFNhdmVBbmRFZGl0Um91dGU6IHN0cmluZyA9ICcuLi9lZGl0Lyc7XHJcblx0cHVibGljIGFkZFNhdmVBbmROZXdSb3V0ZTogc3RyaW5nID0gJy4uL2FkZCc7XHJcblx0cHVibGljIGxpc3RSb3V0ZTogc3RyaW5nID0gdGhpcy5hZGRTYXZlQW5kQ2xvc2VSb3V0ZTtcclxuXHJcblx0LyoqXHJcblx0ICogVGhlIElEIG9mIHRoZSBpdGVtIHRvIGxvYWQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIF9pZD86IG51bWJlciB8IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogVGhlIElEIG9mIHRoZSBpdGVtIHRvIGxvYWQuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZ2V0IGlkKCk6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9pZDsgfVxyXG5cdHB1YmxpYyBzZXQgaWQoaWQ6IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCkge1xyXG5cdFx0aWYgKHRoaXMuX2lkICE9IGlkKSB7XHJcblx0XHRcdHRoaXMuX2lkID0gaWQ7XHJcblx0XHRcdHRoaXMuYWN0aW9uID0gJ2VkaXQnO1xyXG5cdFx0XHR0aGlzLmlzRWRpdE1vZGUgPSB0cnVlO1xyXG5cdFx0XHR0aGlzLmxpc3RSb3V0ZSA9IHRoaXMuZWRpdFNhdmVBbmRDbG9zZVJvdXRlO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogVGhlIGN1cnJlbnQgaXRlbSB0byBhZGQgb3IgZWRpdC5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHByb3RlY3RlZCBfaXRlbT86IFRFbnRpdHk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIFRoZSBjdXJyZW50IGl0ZW0gdG8gYWRkIG9yIGVkaXQuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZ2V0IGl0ZW0oKTogVEVudGl0eSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9pdGVtOyB9XHJcblx0cHVibGljIHNldCBpdGVtKGl0ZW06IFRFbnRpdHkgfCB1bmRlZmluZWQpIHtcclxuXHRcdGlmICh0aGlzLl9pdGVtICE9PSBpdGVtKSB7XHJcblx0XHRcdHRoaXMuX2l0ZW0gPSBpdGVtO1xyXG5cdFx0XHR0aGlzLmlkID8/PSBpdGVtPy5pZDtcclxuXHRcdFx0dGhpcy5idWlsZEZpZWxkcygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmVwcmVzZW50cyB0aGUgcmVxdWVzdCBlcnJvcnMuXHJcblx0ICovXHJcblx0cHVibGljIGVycm9yczogQXJyYXk8c3RyaW5nPiA9IG5ldyBBcnJheTxzdHJpbmc+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEluY2x1ZGVzIGZpZWxkcyBmb3IgcXVlcnkuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgaW5jbHVkZXM6IHN0cmluZ1tdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZSBpbmNsdWRlcyBmaWVsZHMgZm9yIHF1ZXJ5LlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHVwZGF0ZUluY2x1ZGVzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBQcm9qZWN0aW9uIGZpZWxkcyBmb3IgcXVlcnkuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcHJvamVjdGlvbj86IHN0cmluZ1tdO1xyXG5cclxuXHQvKipcclxuXHQgKiBRdWVyeSBwYXJhbWV0ZXJzLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHF1ZXJ5OiBhbnkgPSB7fTtcclxuXHJcblx0LyoqXHJcblx0ICogUmVhZC1vbmx5IGZsYWcuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogRGlzYWJsZWQgZmxhZy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBUaGUgY3VycmVudCBkYXRlLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjdXJyZW50RGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERhdGUgJiB0aW1lIGlucHV0IG1hc2suXHJcblx0ICovXHJcblx0cHVibGljIGRhdGVUaW1lTWFzayA9IFsvWzAtM10vLCAvWzAtOV0vLCAnLicsIC9bMC0xXS8sIC9bMC05XS8sICcuJywgMiwgMCwgL1sxLTJdLywgL1swLTldLywgJyAnLCAvWzAtMl0vLCAvWzAtOV0vLCAnOicsIC9bMC01XS8sIC9bMC05XS9dO1xyXG5cclxuXHQvKipcclxuXHQgKiBEYXRlIGlucHV0IG1hc2suXHJcblx0ICovXHJcblx0cHVibGljIGRhdGVNYXNrID0gWy9bMC0zXS8sIC9bMC05XS8sICcuJywgL1swLTFdLywgL1swLTldLywgJy4nLCAyLCAwLCAvWzEtMl0vLCAvWzAtOV0vXTtcclxuXHJcblx0LyoqXHJcblx0ICogVGltZSBpbnB1dCBtYXNrLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0aW1lTWFzayA9IFsvWzAtMl0vLCAvWzAtOV0vLCAnOicsIC9bMC01XS8sIC9bMC05XS9dO1xyXG5cclxuXHQvKipcclxuXHQgKiBEYXRlIHZhbGlkYXRpb24gcGF0dGVybi5cclxuXHQgKi9cclxuXHRwdWJsaWMgZGF0ZVBhdHRlcm46IHN0cmluZyA9IGAoPzooPzozMShcXFxcL3wtfFxcXFwuKSg/OjA/WzEzNTc4XXwxWzAyXSkpXFxcXDF8KD86KD86Mjl8MzApKFxcXFwvfC18XFxcXC4pKD86MD9bMSwzLTldfDFbMC0yXSlcXFxcMikpKD86KD86MVs2LTldfFsyLTldXFxcXGQpP1xcXFxkezJ9KSR8Xig/OjI5KFxcXFwvfC18XFxcXC4pMD8yXFxcXDMoPzooPzooPzoxWzYtOV18WzItOV1cXFxcZCk/KD86MFs0OF18WzI0NjhdWzA0OF18WzEzNTc5XVsyNl0pfCg/Oig/OjE2fFsyNDY4XVswNDhdfFszNTc5XVsyNl0pMDApKSkpJHxeKD86MD9bMS05XXwxXFxcXGR8MlswLThdKShcXFxcL3wtfFxcXFwuKSg/Oig/OjA/WzEtOV0pfCg/OjFbMC0yXSkpXFxcXDQoPzooPzoxWzYtOV18WzItOV1cXFxcZCk/XFxcXGR7Mn0pYDtcclxuXHJcblx0LyoqXHJcblx0ICogUGhvbmUgcHJlZml4IHZhbGlkYXRpb24gcGF0dGVybi5cclxuXHQgKi9cclxuXHRwdWJsaWMgcGhvbmVQcmVmaXhQYXR0ZXJuOiBzdHJpbmcgPSAnXigwXFxcXGR7Miw2fSkkJztcclxuXHJcblx0LyoqXHJcblx0ICogUGhvbmUgbnVtYmVyIHZhbGlkYXRpb24gcGF0dGVybi5cclxuXHQgKi9cclxuXHRwdWJsaWMgcGhvbmVOdW1iZXJQYXR0ZXJuOiBzdHJpbmcgPSAnXihcXFxcZHszLDMwfSkkJztcclxuXHJcblx0LyoqXHJcblx0ICogUGFzc3dvcmQgdmFsaWRhdGlvbiBwYXR0ZXJuLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBwYXNzd29yZFBhdHRlcm46IHN0cmluZyA9ICdeKD89LipbYS16XSkoPz0uKltBLVpdKSg/PS4qXFxcXGQpKD89LipbJEAkISUqPyYjLl0pW0EtWmEtelxcXFxkJEAkISUqPyYjLl17Nix9JCc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEVkaXRvciBvcHRpb25zIGluY2x1ZGluZyBkZWZhdWx0IG1vZHVsZXMgYW5kIHRvb2xiYXIgY29uZmlndXJhdGlvbi5cclxuXHQgKi9cclxuXHRwdWJsaWMgZWRpdG9yT3B0aW9ucyA9IHtcclxuXHRcdG1vZHVsZXM6IHtcclxuXHRcdFx0dG9vbGJhcjogW1xyXG5cdFx0XHRcdFsnYm9sZCcsICdpdGFsaWMnLCAndW5kZXJsaW5lJ10sXHJcblx0XHRcdFx0W3sgJ2xpc3QnOiAnb3JkZXJlZCcgfSwgeyAnbGlzdCc6ICdidWxsZXQnIH1dLFxyXG5cdFx0XHRcdFt7ICdpbmRlbnQnOiAnLTEnIH0sIHsgJ2luZGVudCc6ICcrMScgfV0sXHJcblx0XHRcdFx0W3sgJ3NpemUnOiBbJ3NtYWxsJywgZmFsc2UsICdsYXJnZScsICdodWdlJ10gfV0sXHJcblx0XHRcdFx0W3sgJ2hlYWRlcic6IFsxLCAyLCAzLCA0LCA1LCA2LCBmYWxzZV0gfV0sXHJcblx0XHRcdFx0W3sgJ2NvbG9yJzogbmV3IEFycmF5PGFueT4oKSB9LCB7ICdiYWNrZ3JvdW5kJzogbmV3IEFycmF5PGFueT4oKSB9XSxcclxuXHRcdFx0XHRbJ2xpbmsnLCAnaW1hZ2UnXVxyXG5cdFx0XHRdLFxyXG5cdFx0XHRjbGlwYm9hcmQ6IHtcclxuXHRcdFx0XHRtYXRjaFZpc3VhbDogZmFsc2VcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH07XHJcblxyXG5cdC8qKlxyXG5cdCAqIElmIHRydWUsIHNob3dzIHRoZSAnRGVsZXRlJyBtZW51LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBkZWxldGFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBUb29sYmFyIG1lbnUgaXRlbXMuXHJcblx0ICovXHJcblx0cHVibGljIHRvb2xiYXJNZW51SXRlbXM6IEFjdGlvbkl0ZW1bXSA9IFtdO1xyXG5cclxuXHQvKipcclxuXHQgKiBUb29sYmFyIGFjdGlvbiBidXR0b25zLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyB0b29sYmFyQWN0aW9uczogQWN0aW9uSXRlbTxURW50aXR5LCBJR2VuZXJpY0Zvcm1CYXNlQ29tcG9uZW50PFRFbnRpdHk+PltdID0gW3tcclxuXHRcdGljb246ICdyZWZyZXNoJyxcclxuXHRcdHRvb2x0aXA6ICRsb2NhbGl6ZWA6QEByZWZyZXNoUGFnZTpSZWZyZXNoIHRoZSBwYWdlYCxcclxuXHRcdGV2ZW50OiAoKSA9PiB0aGlzLnJlbG9hZFBhZ2UoKSxcclxuXHR9XTtcclxuXHJcblx0LyoqXHJcblx0ICogTWF0U3RlcHBlciByZWZlcmVuY2UuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRTdGVwcGVyKVxyXG5cdHByb3RlY3RlZCBtYXRTdGVwcGVyPzogTWF0U3RlcHBlcjtcclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBlbGVtZW50cy5cclxuXHQgKi9cclxuXHRAVmlld0NoaWxkcmVuKCdmb2N1cycpXHJcblx0cHVibGljIGlucHV0OiBhbnk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZvcm0gZ3JvdXAgaW5zdGFuY2UuXHJcblx0ICovXHJcblx0cHVibGljIF9mb3JtPzogTmdGb3JtIHwgRm9ybUdyb3VwO1xyXG5cclxuXHQvKipcclxuXHQgKiBGb3JtIGdyb3VwLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGdldCBmb3JtKCk6IE5nRm9ybSB8IEZvcm1Hcm91cCB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9mb3JtOyB9XHJcblx0cHVibGljIHNldCBmb3JtKGZvcm06IE5nRm9ybSB8IEZvcm1Hcm91cCB8IHVuZGVmaW5lZCkge1xyXG5cdFx0dGhpcy5fZm9ybSA9IGZvcm07XHJcblx0XHR0aGlzLm9uQWZ0ZXJGb3JtQnVpbGQoKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHMgdGhlIGZvcm0gdmFsdWUuXHJcblx0ICovXHJcblx0cHVibGljIGFic3RyYWN0IGdldCBmb3JtVmFsdWUoKTogVEVudGl0eSB8IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogRm9ybSBkZWZpbml0aW9uLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBmb3JtRGVmaW5pdGlvbj86IEZvcm1EZWZpbml0aW9uO1xyXG5cclxuXHQvKipcclxuXHQgKiBGaWVsZCBncm91cHMgZGVmaW5pdGlvbi5cclxuXHQgKi9cclxuXHRwdWJsaWMgZmllbGRHcm91cHM/OiBGb3JtRmllbGRHcm91cERlZmluaXRpb25bXTtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0b3IuXHJcblx0ICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UgdG8gbWFuYWdlIHRoZSBlbnRpdHkuXHJcblx0ICogQHBhcmFtIHJvdXRlIFRoZSBhY3RpdmF0ZWQgcm91dGUuXHJcblx0ICogQHBhcmFtIGNoYW5nZURldGVjdG9yUmVmIFRoZSBjaGFuZ2UgZGV0ZWN0b3IgcmVmZXJlbmNlLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHVibGljIGVudGl0eUN0b3I6IFR5cGU8VEVudGl0eT4sXHJcblx0XHRwcm90ZWN0ZWQgc2VydmljZTogVFNlcnZpY2UsXHJcblx0XHRwcm90ZWN0ZWQgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG5cdFx0cHJvdGVjdGVkIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG5cdCkge1xyXG5cdFx0c3VwZXIocm91dGUsIGNoYW5nZURldGVjdG9yUmVmKTtcclxuXHRcdHRoaXMubGlzdFJvdXRlID0gdGhpcy5hZGRTYXZlQW5kQ2xvc2VSb3V0ZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENhbGxlZCBhZnRlciB0aGUgY29uc3RydWN0b3IsIGluaXRpYWxpemluZyBpbnB1dCBwcm9wZXJ0aWVzLCBcclxuXHQgKiBhbmQgdGhlIGZpcnN0IGNhbGwgdG8gbmdPbkNoYW5nZXMuXHJcblx0ICovXHJcblx0cHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG5cdFx0c3VwZXIubmdPbkluaXQoKTtcclxuXHRcdHRoaXMuaW5pdCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTGlmZWN5Y2xlIGhvb2sgdGhhdCBpcyBjYWxsZWQgYWZ0ZXIgYSBjb21wb25lbnQncyB2aWV3IGhhcyBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcblx0XHR0aGlzLmhhbmRsZUV4cGFuc2lvblBhbmVsQ2hhbmdlcyA9IHRoaXMuaXNFZGl0TW9kZTtcclxuXHRcdHN1cGVyLm5nQWZ0ZXJWaWV3SW5pdCgpO1xyXG5cclxuXHRcdC8qIFNldCBwYWdlIHRpdGxlICovXHJcblx0XHR0aGlzLnRpdGxlID0gdGhpcy50aXRsZVNlcnZpY2UuZ2V0VGl0bGUoKTtcclxuXHJcblx0XHQvKiBTZXQgZm9jdXMgKi9cclxuXHRcdHRoaXMuZm9jdXMoKTtcclxuXHJcblx0XHQvKiBcclxuXHRcdCAqIEZvcmNlIGEgbmV3IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGUgc2luY2UgY2hhbmdlIGRldGVjdGlvbnMgXHJcblx0XHQgKiBoYXZlIGZpbmlzaGVkIHdoZW4gYG5nQWZ0ZXJWaWV3SW5pdGAgaXMgZXhlY3V0ZWQuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuXHRcdC8qIExpc3RlbiBmb3Igc3RlcHBlciBzZWxlY3Rpb24gY2hhbmdlcyAqL1xyXG5cdFx0dGhpcy5tYXRTdGVwcGVyPy5zZWxlY3Rpb25DaGFuZ2U/LnN1YnNjcmliZSgoZXZlbnQ6IFN0ZXBwZXJTZWxlY3Rpb25FdmVudCkgPT4gdGhpcy5vbkFmdGVyU3RlcENoYW5nZShldmVudCkpO1xyXG5cclxuXHRcdC8qIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgc3RlcCBiYXNlZCBvbiB0aGUgVVJMIGhhc2ggYW5kIG1hcmsgcHJldmlvdXMgc3RlcHMgYXMgY29tcGxldGVkICovXHJcblx0XHR0aGlzLnNlbGVjdFN0ZXBCYXNlZE9uVXJsSGFzaCgpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgbGlmZWN5Y2xlIGhvb2suIFVzZSBpdCB0byBpbmplY3QgZGVwZW5kZW5jaWVzLCBcclxuXHQgKiBidXQgYXZvaWQgYW55IHNlcmlvdXMgd29yayBoZXJlLlxyXG5cdCAqIEBwYXJhbSBjaGFuZ2VzIFRoZSBjaGFuZ2VzIG9iamVjdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG5cdFx0aWYgKFxyXG5cdFx0XHQoY2hhbmdlcz8uaWQ/LmN1cnJlbnRWYWx1ZSAmJiBjaGFuZ2VzLmlkLmN1cnJlbnRWYWx1ZSAhPT0gY2hhbmdlcy5pZC5wcmV2aW91c1ZhbHVlKSB8fFxyXG5cdFx0XHQoY2hhbmdlcz8uaXRlbT8uY3VycmVudFZhbHVlICYmIGNoYW5nZXMuaXRlbS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXMuaXRlbS5wcmV2aW91c1ZhbHVlKVxyXG5cdFx0KSB7XHJcblx0XHRcdHRoaXMubG9hZEl0ZW0oKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIExvYWRzIGFuIGl0ZW0gYnkgSUQuXHJcblx0ICogVGhpcyBtZXRob2QgZmV0Y2hlcyB0aGUgaXRlbSBpZiB0aGUgY29tcG9uZW50IGlzIGluIGVkaXQgbW9kZSBhbmQgdGhlIHNlcnZpY2UgZW5kcG9pbnQgaXMgZGVmaW5lZC5cclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gY2FsbGJhY2sgLSBBIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBhZnRlciB0aGUgaXRlbSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkLlxyXG5cdCAqICAgICAgICAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gd2lsbCByZWNlaXZlIHRoZSBsb2FkZWQgaXRlbSBhcyBhbiBhcmd1bWVudC5cclxuXHQgKi9cclxuXHRwdWJsaWMgbG9hZEl0ZW0oY2FsbGJhY2s/OiAoaXRlbTogeyBlbnRpdHk6IFRFbnRpdHksIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uIH0pID0+IHZvaWQpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmlzRWRpdE1vZGUgJiYgdGhpcy5zZXJ2aWNlPy5lbmRwb2ludCkge1xyXG5cdFx0XHQvKiBTZXQgbG9hZGluZyBzdGF0ZSB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQgYW4gaXRlbSBpcyBiZWluZyBsb2FkZWQgKi9cclxuXHRcdFx0dGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG5cclxuXHRcdFx0LyogVHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSB0aGUgdmlldyB3aXRoIHRoZSBsb2FkaW5nIHN0YXRlICovXHJcblx0XHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuXHRcdFx0LyogQ2FsbCB0aGUgYXN5bmNocm9ub3VzIG1ldGhvZCB0byBsb2FkIHRoZSBpdGVtICovXHJcblx0XHRcdHRoaXMubG9hZEl0ZW1Bc3luYygpLnN1YnNjcmliZSh7XHJcblx0XHRcdFx0LyogSGFuZGxlIHRoZSByZXNwb25zZSB3aGVuIHRoZSBpdGVtIGlzIHN1Y2Nlc3NmdWxseSBsb2FkZWQgKi9cclxuXHRcdFx0XHRuZXh0OiAoaXRlbSkgPT4ge1xyXG5cdFx0XHRcdFx0LyogU2V0IGxvYWRpbmcgc3RhdGUgdG8gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCBsb2FkaW5nIGhhcyBjb21wbGV0ZWQgKi9cclxuXHRcdFx0XHRcdHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcblxyXG5cdFx0XHRcdFx0LyogRXhlY3V0ZSB0aGUgY2FsbGJhY2sgaWYgcHJvdmlkZWQsIHBhc3NpbmcgdGhlIGxvYWRlZCBpdGVtICovXHJcblx0XHRcdFx0XHRpZiAoY2FsbGJhY2spIHtcclxuXHRcdFx0XHRcdFx0Y2FsbGJhY2soaXRlbSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSxcclxuXHRcdFx0XHQvKiBIYW5kbGUgYW55IGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyB0aGUgbG9hZGluZyBwcm9jZXNzICovXHJcblx0XHRcdFx0ZXJyb3I6IChlcnJvcikgPT4gdGhpcy5wYXJzZUVycm9ycyhlcnJvcilcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMb2FkcyBhbiBpdGVtIGJ5IElEIGFzeW5jaHJvbm91c2x5LlxyXG5cdCAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgb2YgdGhlIGxvYWRlZCBlbnRpdHkuXHJcblx0ICovXHJcblx0cHVibGljIGxvYWRJdGVtQXN5bmMoKTogT2JzZXJ2YWJsZTx7IGVudGl0eTogVEVudGl0eSwgcGVybWlzc2lvbnM6IFBlcm1pc3Npb24gfT4ge1xyXG5cdFx0aWYgKHRoaXMuaWQpIHtcclxuXHRcdFx0cmV0dXJuIHRoaXMuc2VydmljZS5nZXQodGhpcy5pZCwgT2JqZWN0LmFzc2lnbih0aGlzLnF1ZXJ5IHx8IHt9LCB7XHJcblx0XHRcdFx0aW5jbHVkZXM6IHRoaXMuaW5jbHVkZXM/Lmxlbmd0aCA/IHRoaXMuaW5jbHVkZXMgOiB0aGlzLnVwZGF0ZUluY2x1ZGVzLFxyXG5cdFx0XHRcdHByb2plY3Rpb246IHRoaXMucHJvamVjdGlvbj8uam9pbignLCcpLFxyXG5cdFx0XHRcdG9ic2VydmU6ICdyZXNwb25zZSdcclxuXHRcdFx0fSksIHsgJ0Rpc2FibGUtQ2FjaGUnOiAnWWVzJyB9LCB0cnVlLCB0cnVlKS5waXBlKFxyXG5cdFx0XHRcdG1hcCgocmVzcG9uc2UpID0+IHtcclxuXHRcdFx0XHRcdC8qIFJlYWQgcGVybWlzc2lvbnMgZnJvbSB0aGUgaHR0cCBoZWFkZXJzICovXHJcblx0XHRcdFx0XHRjb25zdCBwZXJtaXNzaW9ucyA9IHJlc3BvbnNlPy5oZWFkZXJzPy5nZXQoJ1Blcm1pc3Npb25zJyk/LnNwbGl0KCc7JykgPz8gW107XHJcblxyXG5cdFx0XHRcdFx0cmV0dXJuIHtcclxuXHRcdFx0XHRcdFx0ZW50aXR5OiBPYmplY3QuYXNzaWduKHRoaXMubmV3SW5zdGFuY2UoKSwgcmVzcG9uc2UuYm9keSBhcyBURW50aXR5KSxcclxuXHRcdFx0XHRcdFx0cGVybWlzc2lvbnM6IG5ldyBQZXJtaXNzaW9uKHtcclxuXHRcdFx0XHRcdFx0XHRjYW5DcmVhdGU6IHBlcm1pc3Npb25zLmluY2x1ZGVzKCdDcmVhdGUnKSxcclxuXHRcdFx0XHRcdFx0XHRjYW5SZWFkOiBwZXJtaXNzaW9ucy5pbmNsdWRlcygnUmVhZCcpLFxyXG5cdFx0XHRcdFx0XHRcdGNhblVwZGF0ZTogcGVybWlzc2lvbnMuaW5jbHVkZXMoJ1VwZGF0ZScpLFxyXG5cdFx0XHRcdFx0XHRcdGNhbkRlbGV0ZTogcGVybWlzc2lvbnMuaW5jbHVkZXMoJ0RlbGV0ZScpLFxyXG5cdFx0XHRcdFx0XHR9KSxcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KSxcclxuXHRcdFx0XHR0YXAoeCA9PiB7XHJcblx0XHRcdFx0XHQvKiBTZXQgdGhlIGxvYWRlZCBpdGVtICovXHJcblx0XHRcdFx0XHR0aGlzLml0ZW0gPSBPYmplY3QuYXNzaWduKHRoaXMubmV3SW5zdGFuY2UoKSwgPFRFbnRpdHk+eC5lbnRpdHkpO1xyXG5cclxuXHRcdFx0XHRcdC8qIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIGNyZWF0ZSwgcmVhZCwgdXBkYXRlLCBhbmQgZGVsZXRlICovXHJcblx0XHRcdFx0XHR0aGlzLmNhbkNyZWF0ZSB8fD0geC5wZXJtaXNzaW9ucy5jYW5DcmVhdGU7XHJcblx0XHRcdFx0XHR0aGlzLmNhblJlYWQgfHw9IHgucGVybWlzc2lvbnMuY2FuUmVhZDtcclxuXHRcdFx0XHRcdHRoaXMuY2FuVXBkYXRlIHx8PSB4LnBlcm1pc3Npb25zLmNhblVwZGF0ZTtcclxuXHRcdFx0XHRcdHRoaXMuY2FuRGVsZXRlIHx8PSB4LnBlcm1pc3Npb25zLmNhbkRlbGV0ZTtcclxuXHJcblx0XHRcdFx0XHQvKiBCdWlsZCB0aGUgZm9ybSAqL1xyXG5cdFx0XHRcdFx0dGhpcy5idWlsZEZvcm0oKTtcclxuXHJcblx0XHRcdFx0XHQvKiBUcmlnZ2VyIGV2ZW50IGFmdGVySXRlbUxvYWRlZCAqL1xyXG5cdFx0XHRcdFx0dGhpcy5vbkFmdGVySXRlbUxvYWRlZCgpO1xyXG5cdFx0XHRcdH0pXHJcblx0XHRcdCk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG5ldyBPYnNlcnZhYmxlKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTYXZlcyBkYXRhIGludG8gdGhlIGRhdGFiYXNlLlxyXG5cdCAqIFRoaXMgbWV0aG9kIHZhbGlkYXRlcyB0aGUgZm9ybSwgY2hlY2tzIGlmIGl0J3MgdmFsaWQsIGFuZCBzZW5kcyBkYXRhIHRvIHRoZSBzZXJ2ZXIgdG8gZWl0aGVyIHVwZGF0ZSBvciBjcmVhdGUgYSBuZXcgcmVjb3JkLlxyXG5cdCAqIEBwYXJhbSBhY3Rpb24gVGhlIHNhdmUgYWN0aW9uIHRvIHBlcmZvcm0uXHJcblx0ICogQHBhcmFtIGZvcm0gVGhlIGZvcm0gdG8gdmFsaWRhdGUgYW5kIHNhdmUuXHJcblx0ICovXHJcblx0cHVibGljIHNhdmUoYWN0aW9uOiBTYXZlQWN0aW9uID0gU2F2ZUFjdGlvbi5TYXZlQW5kQ2xvc2UsIGZvcm0/OiBOZ0Zvcm0gfCBGb3JtR3JvdXApOiB2b2lkIHtcclxuXHRcdC8qIFZhbGlkYXRlIHRoZSBmb3JtIGRhdGEgYmVmb3JlIHByb2NlZWRpbmcgKi9cclxuXHRcdHRoaXMudmFsaWRhdGVGb3JtKGZvcm0pO1xyXG5cclxuXHRcdC8qIEVuc3VyZSB0aGF0IHRoZSBmb3JtIHJlZmVyZW5jZSBpcyBzZXQgYW5kIHZhbGlkYXRlZCAqL1xyXG5cdFx0Zm9ybSA9IHRoaXMuZm9ybSB8fCBmb3JtO1xyXG5cclxuXHRcdC8qIEV4aXQgaWYgdGhlIGZvcm0gaXMgaW52YWxpZCAqL1xyXG5cdFx0aWYgKGZvcm0gJiYgIXRoaXMuaXNGb3JtVmFsaWQoZm9ybSkpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFNldCBhIGZsYWcgdG8gcHJldmVudCBkdXBsaWNhdGUgZm9ybSBzdWJtaXNzaW9ucyAqL1xyXG5cdFx0dGhpcy5pc1NhdmluZyA9IHRydWU7XHJcblxyXG5cdFx0LyogSWYgaW4gZWRpdCBtb2RlLCB1cGRhdGUgdGhlIHJlY29yZCAqL1xyXG5cdFx0aWYgKHRoaXMuaXNFZGl0TW9kZSkge1xyXG5cdFx0XHQvKiBUaGUgZGF0YSBoYXMgbm90IGNoYW5nZWQ/ICovXHJcblx0XHRcdGlmIChmb3JtICYmIGZvcm0ucHJpc3RpbmUpIHtcclxuXHRcdFx0XHR0aGlzLm9uQWZ0ZXJTdWJtaXQoYWN0aW9uKTtcclxuXHRcdFx0XHRyZXR1cm47XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdC8qIFNlbmQgdGhlIGRhdGEgdG8gdGhlIHNlcnZlciAqL1xyXG5cdFx0XHR0aGlzLnVwZGF0ZSh7IHBhcmFtczogVXRpbHMudG9IdHRwUGFyYW1zKHsgaW5jbHVkZXM6IHRoaXMudXBkYXRlSW5jbHVkZXMgfSkgfSkuc3Vic2NyaWJlKHtcclxuXHRcdFx0XHRuZXh0OiAocmVzcG9uc2UpID0+IHtcclxuXHRcdFx0XHRcdC8qIEFwcGx5IHNhdmVkIGRhdGEgdG8gdGhlIGZvcm0gKi9cclxuXHRcdFx0XHRcdHRoaXMub25BZnRlclN1Ym1pdChhY3Rpb24sIHJlc3BvbnNlKTtcclxuXHJcblx0XHRcdFx0XHQvKiBJZiB0aGUgdXNlciBjbGlja3MgJ2FwcGx5JyByZWxvYWQgdGhlIHBhZ2UgKi9cclxuXHRcdFx0XHRcdGlmIChhY3Rpb24gPT0gU2F2ZUFjdGlvbi5TYXZlQW5kRWRpdCkge1xyXG5cdFx0XHRcdFx0XHRpZiAodGhpcy5yZWxvYWQub2JzZXJ2ZWQpIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnJlbG9hZC5lbWl0KHRoaXMuZm9ybVZhbHVlKTtcclxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0XHR0aGlzLnJlbG9hZFBhZ2UoKTtcclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0sXHJcblxyXG5cdFx0XHRcdC8qIFByb2Nlc3MgYW55IGVycm9ycyBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgKi9cclxuXHRcdFx0XHRlcnJvcjogKGVycm9yKSA9PiB0aGlzLnBhcnNlRXJyb3JzKGVycm9yKVxyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHRcdC8qIE90aGVyd2lzZSwgY3JlYXRlIGEgbmV3IG9uZSAqL1xyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdC8qIFNlbmQgdGhlIGRhdGEgdG8gdGhlIHNlcnZlciAqL1xyXG5cdFx0XHR0aGlzLmNyZWF0ZTxBcGlSZXNwb25zZTxURW50aXR5Pj4oKS5zdWJzY3JpYmUoe1xyXG5cdFx0XHRcdG5leHQ6IChyZXNwb25zZSkgPT4ge1xyXG5cdFx0XHRcdFx0dGhpcy5pZCA9IHJlc3BvbnNlPy52YWx1ZT8uaWQ7XHJcblx0XHRcdFx0XHR0aGlzLm9uQWZ0ZXJTdWJtaXQoYWN0aW9uLCByZXNwb25zZSk7XHJcblxyXG5cdFx0XHRcdFx0aWYgKGZvcm0pIHtcclxuXHRcdFx0XHRcdFx0T2JqZWN0LmtleXMoZm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG5cdFx0XHRcdFx0XHRcdGxldCBjdHIgPSBmb3JtIS5jb250cm9sc1trZXldO1xyXG5cdFx0XHRcdFx0XHRcdGN0ci5tYXJrQXNQcmlzdGluZSgpO1xyXG5cdFx0XHRcdFx0XHRcdGN0ci5tYXJrQXNVbnRvdWNoZWQoKTtcclxuXHRcdFx0XHRcdFx0XHRjdHIudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cdFx0XHRcdFx0XHR9KTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9LFxyXG5cclxuXHRcdFx0XHQvKiBQcm9jZXNzIGFueSBlcnJvcnMgZnJvbSB0aGUgc2VydmVyIHJlc3BvbnNlICovXHJcblx0XHRcdFx0ZXJyb3I6IChlcnJvcikgPT4gdGhpcy5wYXJzZUVycm9ycyhlcnJvcilcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogRGV0ZWN0IGNoYW5nZXMgKi9cclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2F2ZXMgZGF0YSBhbmQgbmF2aWdhdGVzIHRvIHRoZSBlZGl0IHZpZXcuXHJcblx0ICovXHJcblx0cHVibGljIGFwcGx5KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5zYXZlKFNhdmVBY3Rpb24uU2F2ZUFuZEVkaXQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRGVsZXRlcyB0aGUgY3VycmVudCByZWNvcmQuXHJcblx0ICogVGhpcyBtZXRob2Qgc2hvd3MgYSBjb25maXJtYXRpb24gZGlhbG9nIGFuZCBkZWxldGVzIHRoZSByZWNvcmQgaWYgdGhlIHVzZXIgY29uZmlybXMuXHJcblx0ICogQHBhcmFtIGh0dHBIZWFkZXJzIE9wdGlvbmFsIEhUVFAgaGVhZGVycyB0byBpbmNsdWRlIGluIHRoZSBkZWxldGUgcmVxdWVzdC5cclxuXHQgKi9cclxuXHRwdWJsaWMgZGVsZXRlKGh0dHBIZWFkZXJzPzogSHR0cEhlYWRlcnMpOiB2b2lkIHtcclxuXHRcdHRoaXMuc2hvd0RlbGV0ZUl0ZW1EaWFsb2coKS5zdWJzY3JpYmUoKGFjY2VwdDogYm9vbGVhbikgPT4ge1xyXG5cdFx0XHRpZiAoYWNjZXB0ICYmIHRoaXMuaWQpIHtcclxuXHRcdFx0XHR0aGlzLnNlcnZpY2UuZGVsZXRlKHRoaXMuaWQhLCB1bmRlZmluZWQsIHsgaGVhZGVyczogaHR0cEhlYWRlcnMgPz8gdGhpcy50b0h0dHBIZWFkZXJzKHsgJ1Nob3ctTWVzc2FnZSc6ICd5ZXMnIH0pIH0pXHJcblx0XHRcdFx0XHQuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcclxuXHRcdFx0XHRcdFx0dGhpcy5iYWNrKCk7XHJcblx0XHRcdFx0XHR9LCBlcnJvciA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUuZGVidWcoZXJyb3IpO1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSW5pdGlhbGl6ZXMgdGhlIGZvcm0uXHJcblx0ICogVGhpcyBtZXRob2Qgc2V0cyB1cCB0aGUgZm9ybSBieSBleHRyYWN0aW5nIHF1ZXJ5IHBhcmFtZXRlcnMsIHNldHRpbmcgdGhlIGVudGl0eSBJRCwgYW5kIGJ1aWxkaW5nIHRoZSBmb3JtLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBpbml0KCk6IHZvaWQge1xyXG5cdFx0LyogR2V0IHRoZSBlbnRpdHkgSUQgZnJvbSB0aGUgcXVlcnkgKi9cclxuXHRcdGlmICghdGhpcy5pZCAmJiAhdGhpcy5pdGVtKSB7XHJcblx0XHRcdC8qIEFzc2lnbiBxdWVyeSBwYXJhbXMgaW50byBxdWVyeSBvYmplY3QgKi9cclxuXHRcdFx0bGV0IGlnbm9yZWRQYXJhbXM6IHN0cmluZ1tdID0gWydpZCcsICdyZXR1cm51cmwnLCAncGFuZWxJZCddO1xyXG5cdFx0XHRPYmplY3QuYXNzaWduKHRoaXMucXVlcnksXHJcblx0XHRcdFx0dGhpcy5zYW5pdGl6ZU9iamVjdCh0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtcyB8fCB7fSwgLi4uaWdub3JlZFBhcmFtcyksXHJcblx0XHRcdFx0dGhpcy5zYW5pdGl6ZU9iamVjdCh0aGlzLnJvdXRlLnNuYXBzaG90LmRhdGE/LnF1ZXJ5IHx8IHt9LCAuLi5pZ25vcmVkUGFyYW1zKSxcclxuXHRcdFx0XHR0aGlzLnNhbml0aXplT2JqZWN0KHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMgfHwge30sIC4uLmlnbm9yZWRQYXJhbXMpXHJcblx0XHRcdCk7XHJcblxyXG5cdFx0XHQvKiBHZXQgaWQgZnJvbSB0aGUgdXJsICovXHJcblx0XHRcdGxldCBpZCA9IDxhbnk+dGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoJ2lkJyk7XHJcblx0XHRcdGlmIChpZCA+IDApIHtcclxuXHRcdFx0XHR0aGlzLmlkID0gaWQ7XHJcblx0XHRcdH0gZWxzZSBpZiAoIXRoaXMuaWQgJiYgdGhpcy5yb3V0ZS5zbmFwc2hvdD8uZGF0YT8uaWQpIHtcclxuXHRcdFx0XHR0aGlzLmlkID0gdGhpcy5yb3V0ZS5zbmFwc2hvdD8uZGF0YT8uaWQ7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdHRoaXMub25BZnRlclNldElkKCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBURW50aXR5ICovXHJcblx0XHRpZiAoIXRoaXMuaXNFZGl0TW9kZSAmJiAhdGhpcy5mb3JtKSB7XHJcblx0XHRcdHRoaXMuaXRlbSA9IE9iamVjdC5hc3NpZ24odGhpcy5uZXdJbnN0YW5jZSgpLCB0aGlzLml0ZW0gfHwge30sIHRoaXMucXVlcnkgfHwge30pO1xyXG5cdFx0XHR0aGlzLmJ1aWxkRm9ybSgpO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIFNldCBwYW5lbCBJRCBmcm9tIHF1ZXJ5ICovXHJcblx0XHR0aGlzLnN1YnRpdGxlIHx8PSB0aGlzLnJvdXRlLnNuYXBzaG90Py5kYXRhPy5zdWJ0aXRsZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEJ1aWxkcyB0aGUgZm9ybSBmaWVsZHMuXHJcblx0ICogVGhpcyBtZXRob2QgY29uc3RydWN0cyBmb3JtIGZpZWxkcyBiYXNlZCBvbiB0aGUgZW50aXR5J3MgZm9ybSBkZWZpbml0aW9uIGFuZCBpbmNsdWRlcyBuZWNlc3NhcnkgbmF2aWdhdGlvbiBhbmQgbWVudSBpdGVtcy5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgYnVpbGRGaWVsZHMoKTogdm9pZCB7XHJcblx0XHQvKiBHZXQgZm9ybSBkZWZpbml0aW9uICovXHJcblx0XHR0aGlzLmZvcm1EZWZpbml0aW9uID0gZ2V0Rm9ybURlZmluaXRpb24odGhpcy5uZXdJbnN0YW5jZSgpKTtcclxuXHJcblx0XHQvKiBTZXQgaW5jbHVkZXMgZnJvbSBmb3JtIGRlZmluaXRpb24sIGlmIGFueSAqL1xyXG5cdFx0dGhpcy5mb3JtRGVmaW5pdGlvbj8uaW5jbHVkZXM/LmZvckVhY2goeCA9PiB0aGlzLmluY2x1ZGUoeC5lbnRpdHksIHgudXBkYXRlKSk7XHJcblxyXG5cdFx0LyogQWRkIHRvb2xiYXIgbWVudSBpdGVtcywgaWYgYW55ICovXHJcblx0XHRpZiAodGhpcy5mb3JtRGVmaW5pdGlvbj8udG9vbGJhck1lbnVJdGVtcz8ubGVuZ3RoKSB7XHJcblx0XHRcdHRoaXMudG9vbGJhck1lbnVJdGVtcyA/Pz0gW107XHJcblx0XHRcdHRoaXMudG9vbGJhck1lbnVJdGVtcyA9IHRoaXMudG9vbGJhck1lbnVJdGVtcy5jb25jYXQoLi4udGhpcy5mb3JtRGVmaW5pdGlvbj8udG9vbGJhck1lbnVJdGVtcyk7XHJcblx0XHRcdHRoaXMudG9vbGJhck1lbnVJdGVtcy5mb3JFYWNoKCh4LCBpKSA9PiB4LmluZGV4ID8/PSBpKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBcclxuXHRcdEFzc2lnbiBhIHZhbHVlIHRvIGB0aGlzLmRlbGV0YWJsZWAgb25seSBpZiBpdCBpcyBjdXJyZW50bHkgZmFsc3kuIFxyXG5cdFx0VXNlIHRoZSBgZGVsZXRhYmxlYCBwcm9wZXJ0eSBmcm9tIGBmb3JtRGVmaW5pdGlvbmAsIGRlZmF1bHRpbmcgdG8gYGZhbHNlYCBpZiB1bmRlZmluZWQuXHJcblx0XHQgKi9cclxuXHRcdHRoaXMuZGVsZXRhYmxlICYmPSAodGhpcy5mb3JtRGVmaW5pdGlvbi5kZWxldGFibGUgPz8gZmFsc2UpO1xyXG5cclxuXHRcdC8qIENyZWF0ZSB0aGUgZm9ybSBmaWVsZHMgdXNpbmcgdGhlIGVudGl0eSB0eXBlICovXHJcblx0XHR0aGlzLmZpZWxkR3JvdXBzID0gdGhpcy5mb3JtRGVmaW5pdGlvbj8uZmllbGRHcm91cHM/LmZpbHRlcih4ID0+ICF4LmhpZGRlbik7XHJcblxyXG5cdFx0LyogQWRkIGxpc3QgbWVudSBpdGVtcyAqL1xyXG5cdFx0dGhpcy5hZGRUb29sYmFyTWVudUl0ZW1zKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBCdWlsZHMgYSBuZXcgZm9ybS5cclxuXHQgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgdG8gY29uc3RydWN0IHRoZSBmb3JtIGZvciB0aGUgc3BlY2lmaWMgZW50aXR5LlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBidWlsZEZvcm0oKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogVmFsaWRhdGVzIHRoZSBmb3JtLlxyXG5cdCAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGZvcm0gYXMgc3VibWl0dGVkLCB1cGRhdGVzIGl0cyB2YWxpZGl0eSwgYW5kIG9wdGlvbmFsbHkgbG9ncyBkZWJ1ZyBpbmZvcm1hdGlvbi5cclxuXHQgKiBAcGFyYW0gZm9ybSBUaGUgZm9ybSB0byB2YWxpZGF0ZS5cclxuXHQgKi9cclxuXHRwdWJsaWMgdmFsaWRhdGVGb3JtKGZvcm0/OiBOZ0Zvcm0gfCBGb3JtR3JvdXApOiB2b2lkIHtcclxuXHRcdHZhciBmb3JtID0gZm9ybSB8fCB0aGlzLmZvcm07XHJcblxyXG5cdFx0LyogU2V0IHRoZSBmb3JtIGFzIHN1Ym1pdHRlZCAqL1xyXG5cdFx0aWYgKGZvcm0gJiYgZm9ybSBpbnN0YW5jZW9mIEZvcm1Hcm91cCkge1xyXG5cdFx0XHQvKiBTZXQgZm9ybSBhcyBzdWJtaXR0ZWQgKi9cclxuXHRcdFx0KGZvcm0gYXMgYW55KVsnc3VibWl0dGVkJ10gPSB0cnVlO1xyXG5cclxuXHRcdFx0LyogVXBkYXRlIHZhbHVlIGFuZCB2YWxpZGl0eSAqL1xyXG5cdFx0XHRmb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBQcmludCBzb21lIGRlYnVnIGluZm9ybWF0aW9uICovXHJcblx0XHR0aGlzLmRlYnVnRm9ybShmb3JtKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgZm9ybSBpcyB2YWxpZC5cclxuXHQgKiBUaGlzIG1ldGhvZCB2YWxpZGF0ZXMgdGhlIGZvcm0sIG1hcmtzIGludmFsaWQgY29udHJvbHMsIGFuZCBzaG93cyBlcnJvciBtZXNzYWdlcyBpZiBhbnkuXHJcblx0ICogQHBhcmFtIGZvcm0gVGhlIGZvcm0gdG8gY2hlY2sgZm9yIHZhbGlkaXR5LlxyXG5cdCAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZvcm0gaXMgdmFsaWQuXHJcblx0ICovXHJcblx0cHVibGljIGlzRm9ybVZhbGlkKGZvcm0/OiBOZ0Zvcm0gfCBGb3JtR3JvdXApOiBib29sZWFuIHtcclxuXHRcdC8qIFByaW50IHNvbWUgZGVidWcgaW5mb3JtYXRpb24gKi9cclxuXHRcdHRoaXMuZGVidWdGb3JtKGZvcm0pO1xyXG5cclxuXHRcdC8qIElmIHRoZSBmb3JtIGlzIG5vdCB2YWxpZCAqL1xyXG5cdFx0aWYgKGZvcm0gJiYgIWZvcm0udmFsaWQpIHtcclxuXHRcdFx0LyogTWFyayBpbnZhbGlkIGNvbnRyb2xzIGFzIGRpcnR5IGFuZCB0b3VjaGVkICovXHJcblx0XHRcdE9iamVjdC5rZXlzKGZvcm0uY29udHJvbHMpXHJcblx0XHRcdFx0LmZpbHRlcih4ID0+ICFmb3JtLmNvbnRyb2xzW3hdLnZhbGlkKVxyXG5cdFx0XHRcdC5mb3JFYWNoKGtleSA9PiB0aGlzLmludmFsaWRhdGVDb250cm9sKGZvcm0uY29udHJvbHNba2V5XSkpO1xyXG5cclxuXHRcdFx0LyogU2hvdyBlcnJvciBtZXNzYWdlcyAqL1xyXG5cdFx0XHQoYXN5bmMgKCkgPT4ge1xyXG5cdFx0XHRcdC8qIFdhaXQgdW50aWwgJ21hdC1lcnJvcicgaXMgZGlzcGxheWVkICovXHJcblx0XHRcdFx0YXdhaXQgbmV3IFByb21pc2UoeSA9PiBzZXRUaW1lb3V0KHksIDIwMCkpO1xyXG5cclxuXHRcdFx0XHQvKiBQYXJzZSB0aGUgZXJyb3IgbWVzc2FnZXMgKi9cclxuXHRcdFx0XHR2YXIgZXJyb3JzID0gQXJyYXk8c3RyaW5nPigpO1xyXG5cdFx0XHRcdE9iamVjdC5rZXlzKGZvcm0uY29udHJvbHMpXHJcblx0XHRcdFx0XHQuZmlsdGVyKHggPT4gIWZvcm0uY29udHJvbHNbeF0udmFsaWQpXHJcblx0XHRcdFx0XHQuZm9yRWFjaChrZXkgPT4ge1xyXG5cdFx0XHRcdFx0XHQvKiBHZXQgZXJyb3IgdGV4dCAqL1xyXG5cdFx0XHRcdFx0XHR2YXIgZXJyb3IgPSB0aGlzLmdldEVsZW1lbnRFcnJvcigoZm9ybS5jb250cm9sc1trZXldIGFzIGFueSk/Lm5hdGl2ZUVsZW1lbnQpO1xyXG5cdFx0XHRcdFx0XHRpZiAoZXJyb3IpIHtcclxuXHRcdFx0XHRcdFx0XHRlcnJvcnMucHVzaChlcnJvcik7XHJcblx0XHRcdFx0XHRcdH1cclxuXHRcdFx0XHRcdH0pO1xyXG5cclxuXHRcdFx0XHQvKiBCdWlsZCBlcnJvciBtZXNzYWdlICovXHJcblx0XHRcdFx0dmFyIG1lc3NhZ2UgPSBlcnJvcnMubGVuZ3RoID8gZXJyb3JzLnNsaWNlKDAsIDMpLmpvaW4oJ1xcbicpIDogJGxvY2FsaXplYDpAQHNuYWNrYmFyLmVycm9yLnJlcXVpcmVkLWZpZWxkczpBbGwgZmllbGRzIG1hcmtlZCB3aXRoIGFuIGFzdGVyaXNrICgqKSBhcmUgcmVxdWlyZWQuYDtcclxuXHJcblx0XHRcdFx0LyogU2hvdyBhIG5vdGljZSAqL1xyXG5cdFx0XHRcdHRoaXMuc25hY2tCYXJTZXJ2aWNlLm9wZW4obWVzc2FnZSwgJ09rJywgeyBkdXJhdGlvbjogMzAwMCwgcGFuZWxDbGFzczogWydlcnJvciddIH0pO1xyXG5cdFx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdFx0fSkoKTtcclxuXHJcblx0XHRcdHJldHVybiBmYWxzZTtcclxuXHRcdH1cclxuXHJcblx0XHRyZXR1cm4gdHJ1ZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlc2V0cyBmb3JtIGNvbnRyb2xzLlxyXG5cdCAqIFRoaXMgbWV0aG9kIG1hcmtzIGFsbCBjb250cm9scyBpbiB0aGUgZm9ybSBhcyBwcmlzdGluZSwgdW50b3VjaGVkLCBhbmQgdXBkYXRlcyB0aGVpciB2YWxpZGl0eS5cclxuXHQgKiBAcGFyYW0gZm9ybSBUaGUgZm9ybSB0byByZXNldC5cclxuXHQgKi9cclxuXHRwdWJsaWMgcmVzZXRGb3JtKGZvcm06IE5nRm9ybSk6IHZvaWQge1xyXG5cdFx0aWYgKCFmb3JtKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRPYmplY3Qua2V5cyhmb3JtLmNvbnRyb2xzKS5mb3JFYWNoKGtleSA9PiB7XHJcblx0XHRcdGxldCBjdHIgPSBmb3JtLmNvbnRyb2xzW2tleV07XHJcblx0XHRcdGN0ci5tYXJrQXNQcmlzdGluZSgpO1xyXG5cdFx0XHRjdHIubWFya0FzVW50b3VjaGVkKCk7XHJcblx0XHRcdGN0ci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEludmFsaWRhdGVzIGNvbnRyb2xzIHJlY3Vyc2l2ZWx5LlxyXG5cdCAqIFRoaXMgbWV0aG9kIG1hcmtzIGFsbCBjb250cm9scyBpbiB0aGUgZ3JvdXAgYXMgZGlydHkgYW5kIHRvdWNoZWQgaWYgdGhleSBhcmUgaW52YWxpZC5cclxuXHQgKiBAcGFyYW0gY29udHJvbCBUaGUgY29udHJvbCBvciBncm91cCBvZiBjb250cm9scyB0byBpbnZhbGlkYXRlLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBpbnZhbGlkYXRlQ29udHJvbChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiB2b2lkIHtcclxuXHRcdC8qIENoZWNrIHRoZSBjb250cm9sIGFnYWluc3QgbnVsbCAqL1xyXG5cdFx0aWYgKCFjb250cm9sKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBDaGVjayBpZiB0aGUgY29udHJvbCBpcyBhIGdyb3VwICovXHJcblx0XHRsZXQgZm9ybUdyb3VwID0gY29udHJvbCBhcyBGb3JtR3JvdXA7XHJcblx0XHRpZiAoZm9ybUdyb3VwPy5jb250cm9scykge1xyXG5cdFx0XHRPYmplY3Qua2V5cyhmb3JtR3JvdXAuY29udHJvbHMpXHJcblx0XHRcdFx0LmZpbHRlcih4ID0+ICFmb3JtR3JvdXAuY29udHJvbHNbeF0udmFsaWQpXHJcblx0XHRcdFx0LmZvckVhY2goeCA9PiB0aGlzLmludmFsaWRhdGVDb250cm9sKGZvcm1Hcm91cC5jb250cm9sc1t4XSkpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Y29udHJvbC5tYXJrQXNEaXJ0eSgpO1xyXG5cdFx0XHRjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNob3dzIGZvcm0gZXJyb3JzLlxyXG5cdCAqIFRoaXMgbWV0aG9kIGxvZ3MgZm9ybSBjb250cm9sIGVycm9ycyB0byB0aGUgY29uc29sZSBpZiBkZWJ1Z2dpbmcgaXMgZW5hYmxlZC5cclxuXHQgKiBAcGFyYW0gZm9ybSBUaGUgZm9ybSB0byBkZWJ1Zy5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgZGVidWdGb3JtKGZvcm0/OiBOZ0Zvcm0gfCBGb3JtR3JvdXApOiB2b2lkIHtcclxuXHRcdGlmIChmb3JtICYmIHRoaXMuZGVidWcpIHtcclxuXHRcdFx0Y29uc29sZS5sb2coJ0Zvcm06JywgZm9ybSk7XHJcblx0XHRcdE9iamVjdC5rZXlzKGZvcm0uY29udHJvbHMpLmZvckVhY2goa2V5ID0+IHtcclxuXHRcdFx0XHRjb25zdCBjb250cm9sRXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IGZvcm0uY29udHJvbHNba2V5XS5lcnJvcnM7XHJcblx0XHRcdFx0aWYgKGNvbnRyb2xFcnJvcnMgIT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0T2JqZWN0LmtleXMoY29udHJvbEVycm9ycykuZm9yRWFjaChrZXlFcnJvciA9PiB7XHJcblx0XHRcdFx0XHRcdGNvbnNvbGUubG9nKCdLZXkgY29udHJvbDogJyArIGtleSArICcsIGtleUVycm9yOiAnICsga2V5RXJyb3IgKyAnLCBlcnIgdmFsdWU6ICcsIGNvbnRyb2xFcnJvcnNba2V5RXJyb3JdKTtcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBZGRzIHRvb2xiYXIgbWVudSBpdGVtcy5cclxuXHQgKiBUaGlzIG1ldGhvZCBhZGRzIHRoZSAnRGVsZXRlJyBtZW51IGl0ZW0gdG8gdGhlIHRvb2xiYXIgaWYgdGhlIGVudGl0eSBpcyBkZWxldGFibGUuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIGFkZFRvb2xiYXJNZW51SXRlbXMoKTogdm9pZCB7XHJcblx0XHQvKiBBZGQgJ0RlbGV0ZScgbWVudSBpdGVtICovXHJcblx0XHRpZiAodGhpcy5kZWxldGFibGUpIHtcclxuXHRcdFx0dGhpcy50b29sYmFyTWVudUl0ZW1zLnB1c2goe1xyXG5cdFx0XHRcdHRpdGxlOiAkbG9jYWxpemVgOkBAZGVsZXRlOkRlbGV0ZWAsXHJcblx0XHRcdFx0aWNvbjogJ2RlbGV0ZV9mb3JldmVyJyxcclxuXHRcdFx0XHRpY29uQ2xhc3M6ICd0Yy1vcmFuZ2UtODAwJyxcclxuXHRcdFx0XHRldmVudDogKCkgPT4gdGhpcy5kZWxldGUoKSxcclxuXHRcdFx0XHRkaXNhYmxlOiAoKSA9PiAhdGhpcy5pZCxcclxuXHRcdFx0XHRoaWRlOiAoKSA9PiAhdGhpcy5jYW5EZWxldGVJdGVtKCksXHJcblx0XHRcdFx0aW5kZXg6IDEwMDBcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYgKHRoaXMudG9vbGJhck1lbnVJdGVtcy5sZW5ndGgpIHtcclxuXHRcdFx0LyogU29ydCB0aGUgbWVudSBpdGVtcyBieSBpbmRleCAqL1xyXG5cdFx0XHRVdGlscy5zb3J0QXJyYXkodGhpcy50b29sYmFyTWVudUl0ZW1zLCAnaW5kZXgnKTtcclxuXHJcblx0XHRcdC8qIEFkZCB0aGUgdG9vbGJhciBtZW51IGl0ZW1zIHRvIHRoZSB0aGUgdG9vbGJhciBhY3Rpb25zICovXHJcblx0XHRcdHRoaXMudG9vbGJhckFjdGlvbnMucHVzaCh7IGljb246ICdtb3JlX3ZlcnQnLCBpdGVtczogdGhpcy50b29sYmFyTWVudUl0ZW1zIH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogTG9hZHMgdGhlIHByZXZpb3VzIFVSTCBpbiB0aGUgaGlzdG9yeSBsaXN0LlxyXG5cdCAqIFRoaXMgbWV0aG9kIG5hdmlnYXRlcyBiYWNrIHRvIHRoZSBwcmV2aW91cyBVUkwgb3IgcGVyZm9ybXMgc3BlY2lmaWMgYWN0aW9ucyBiYXNlZCBvbiB0aGUgc2F2ZSBhY3Rpb24uXHJcblx0ICogQHBhcmFtIGFjdGlvbiBUaGUgc2F2ZSBhY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHRoZSBuYXZpZ2F0aW9uIGJlaGF2aW9yLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBiYWNrKGFjdGlvbjogU2F2ZUFjdGlvbiA9IFNhdmVBY3Rpb24uU2F2ZUFuZENsb3NlKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5yZWxvYWQub2JzZXJ2ZWQpIHtcclxuXHRcdFx0LyogSWYgdGhlcmUgYXJlIG9ic2VydmVycyBmb3IgdGhlIHJlbG9hZCBldmVudCwgZW1pdCB0aGUgY3VycmVudCBmb3JtIHZhbHVlICovXHJcblx0XHRcdHRoaXMucmVsb2FkLmVtaXQodGhpcy5mb3JtVmFsdWUpO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0LyogTm8gb2JzZXJ2ZXJzLCBwcm9jZWVkIHdpdGggbmF2aWdhdGlvbiBsb2dpYyAqL1xyXG5cdFx0XHRpZiAoYWN0aW9uID09IFNhdmVBY3Rpb24uU2F2ZUFuZENsb3NlICYmIHRoaXMucmV0dXJuVXJsKSB7XHJcblx0XHRcdFx0LyogTmF2aWdhdGUgdG8gdGhlIHJldHVybiBVUkwgaWYgYWN0aW9uIGlzIFNhdmVBbmRDbG9zZSBhbmQgcmV0dXJuVXJsIGlzIHNldCAqL1xyXG5cdFx0XHRcdHRoaXMubmF2aWdhdGVUb1JldHVyblVybCgpO1xyXG5cdFx0XHR9IGVsc2Uge1xyXG5cdFx0XHRcdC8qIE5vIHJldHVyblVybCwgY29udGludWUgd2l0aCBvdGhlciBhY3Rpb25zICovXHJcblx0XHRcdFx0aWYgKGFjdGlvbiA9PSBTYXZlQWN0aW9uLlNhdmVBbmRDbG9zZSkge1xyXG5cdFx0XHRcdFx0LyogR28gYmFjayB0byB0aGUgcHJldmlvdXMgcGFnZSBpbiBoaXN0b3J5ICovXHJcblx0XHRcdFx0XHR0aGlzLmxvY2F0aW9uLmJhY2soKTtcclxuXHRcdFx0XHR9IGVsc2UgaWYgKGFjdGlvbiA9PSBTYXZlQWN0aW9uLlNhdmVBbmRFZGl0ICYmIHBhcnNlSW50KHRoaXMuaWQ/LnRvU3RyaW5nKCkgPz8gJzAnKSA+IDApIHtcclxuXHRcdFx0XHRcdC8qIEZvciBTYXZlQW5kRWRpdCBhY3Rpb24gd2l0aCBhIHZhbGlkIElEICovXHJcblx0XHRcdFx0XHRpZiAoIXRoaXMuY3VycmVudEJhc2VSb3V0ZT8uZW5kc1dpdGgoJy9hZGQnKSkge1xyXG5cdFx0XHRcdFx0XHQvKiBSZWxvYWQgdGhlIHBhZ2UgaWYgdGhlIGN1cnJlbnQgcm91dGUgZG9lcyBub3QgZW5kIHdpdGggJy9hZGQnICovXHJcblx0XHRcdFx0XHRcdHRoaXMucmVsb2FkUGFnZSgpO1xyXG5cdFx0XHRcdFx0fSBlbHNlIHtcclxuXHRcdFx0XHRcdFx0LyogTmF2aWdhdGUgdG8gdGhlIGVkaXQgcm91dGUgKi9cclxuXHRcdFx0XHRcdFx0dGhpcy5yb3V0ZXIubmF2aWdhdGUoW2Ake3RoaXMuYWRkU2F2ZUFuZEVkaXRSb3V0ZX0ke3RoaXMuaWR9YF0sIHsgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSB9KTtcclxuXHJcblx0XHRcdFx0XHRcdC8qIFJlcGxhY2UgdGhlIGN1cnJlbnQgaGlzdG9yeSBlbnRyeSB0byByZW1vdmUgdGhpcyBwYWdlIGZyb20gdGhlIGhpc3RvcnkgKi9cclxuXHRcdFx0XHRcdFx0dGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUodGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbYCR7dGhpcy5hZGRTYXZlQW5kRWRpdFJvdXRlfSR7dGhpcy5pZH1gXSwgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlIH0pLnRvU3RyaW5nKCkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cdFx0XHRcdH0gZWxzZSBpZiAoYWN0aW9uID09IFNhdmVBY3Rpb24uU2F2ZUFuZE5ldykge1xyXG5cdFx0XHRcdFx0LyogSGFuZGxlIFNhdmVBbmROZXcgYWN0aW9uICovXHJcblx0XHRcdFx0XHR0aGlzLmFmdGVyUmVsb2FkKCk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBTZXRzIHRoZSByZXR1cm4gVVJMLlxyXG5cdCAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIHJldHVybiBVUkwgYW5kIHVwZGF0ZXMgdGhlIGxpc3Qgcm91dGUgYWNjb3JkaW5nbHkuXHJcblx0ICogQHBhcmFtIHJldHVyblVybCBUaGUgVVJMIHRvIHJldHVybiB0byBhZnRlciB0aGUgY3VycmVudCBhY3Rpb24gaXMgY29tcGxldGUuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHNldFJldHVyblVybChyZXR1cm5Vcmw6IHN0cmluZyk6IHZvaWQge1xyXG5cdFx0c3VwZXIuc2V0UmV0dXJuVXJsKHJldHVyblVybCk7XHJcblx0XHR0aGlzLmxpc3RSb3V0ZSA9IHRoaXMucmV0dXJuVXJsIHx8IHRoaXMubGlzdFJvdXRlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBURW50aXR5LlxyXG5cdCAqIFRoaXMgbWV0aG9kIGluaXRpYWxpemVzIGEgbmV3IGVudGl0eSB1c2luZyB0aGUgcHJvdmlkZWQgY29uc3RydWN0b3IuXHJcblx0ICogQHBhcmFtIGluaXQgT3B0aW9uYWwgcGFydGlhbCBpbml0aWFsaXphdGlvbiBvYmplY3QuXHJcblx0ICogQHJldHVybnMgQSBuZXcgaW5zdGFuY2Ugb2YgVEVudGl0eS5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgbmV3SW5zdGFuY2UoaW5pdD86IFBhcnRpYWw8VEVudGl0eT4pOiBURW50aXR5IHtcclxuXHRcdHJldHVybiBuZXcgdGhpcy5lbnRpdHlDdG9yKGluaXQpO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogQ3JlYXRlcyB0aGUgZW50aXR5LlxyXG5cdCAqIFRoaXMgbWV0aG9kIHNlbmRzIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBuZXcgZW50aXR5IG9uIHRoZSBzZXJ2ZXIuXHJcblx0ICogQHBhcmFtIGh0dHBPcHRpb25zIE9wdGlvbmFsIEhUVFAgb3B0aW9ucyBmb3IgdGhlIHJlcXVlc3QuXHJcblx0ICogQHBhcmFtIGh0dHBIZWFkZXJzIE9wdGlvbmFsIEhUVFAgaGVhZGVycyBmb3IgdGhlIHJlcXVlc3QuXHJcblx0ICogQHJldHVybnMgQW4gT2JzZXJ2YWJsZSBvZiB0aGUgY3JlYXRlZCBURW50aXR5LlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBjcmVhdGU8VEVudGl0eT4oaHR0cE9wdGlvbnM/OiBPYmplY3QsIGh0dHBIZWFkZXJzPzogSHR0cEhlYWRlcnMpOiBPYnNlcnZhYmxlPFRFbnRpdHk+IHtcclxuXHRcdHRoaXMub25CZWZvcmVDcmVhdGUoKTtcclxuXHRcdHJldHVybiB0aGlzLnNlcnZpY2UuY3JlYXRlPFRFbnRpdHk+KFxyXG5cdFx0XHR0aGlzLmZvcm1WYWx1ZSxcclxuXHRcdFx0dW5kZWZpbmVkLFxyXG5cdFx0XHRPYmplY3QuYXNzaWduKGh0dHBPcHRpb25zIHx8IHt9LCB7IGhlYWRlcnM6IGh0dHBIZWFkZXJzID8/IHRoaXMudG9IdHRwSGVhZGVycyh7ICdTaG93LU1lc3NhZ2UnOiAneWVzJyB9KSB9KSxcclxuXHRcdFx0ZmFsc2VcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBVcGRhdGVzIHRoZSBlbnRpdHkuXHJcblx0ICogVGhpcyBtZXRob2Qgc2VuZHMgYSByZXF1ZXN0IHRvIHVwZGF0ZSBhbiBleGlzdGluZyBlbnRpdHkgb24gdGhlIHNlcnZlci5cclxuXHQgKiBAcGFyYW0gaHR0cE9wdGlvbnMgT3B0aW9uYWwgSFRUUCBvcHRpb25zIGZvciB0aGUgcmVxdWVzdC5cclxuXHQgKiBAcGFyYW0gaHR0cEhlYWRlcnMgT3B0aW9uYWwgSFRUUCBoZWFkZXJzIGZvciB0aGUgcmVxdWVzdC5cclxuXHQgKiBAcmV0dXJucyBBbiBPYnNlcnZhYmxlIG9mIHRoZSB1cGRhdGVkIFRFbnRpdHkuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIHVwZGF0ZShodHRwT3B0aW9ucz86IE9iamVjdCwgaHR0cEhlYWRlcnM/OiBIdHRwSGVhZGVycyk6IE9ic2VydmFibGU8VEVudGl0eT4ge1xyXG5cdFx0dGhpcy5vbkJlZm9yZVVwZGF0ZSgpO1xyXG5cdFx0cmV0dXJuIHRoaXMuc2VydmljZS51cGRhdGUodGhpcy5pZCEsXHJcblx0XHRcdE9iamVjdC5hc3NpZ24odGhpcy5pdGVtISwgdGhpcy5mb3JtVmFsdWUpLFxyXG5cdFx0XHR1bmRlZmluZWQsXHJcblx0XHRcdE9iamVjdC5hc3NpZ24oaHR0cE9wdGlvbnMgfHwge30sIHsgaGVhZGVyczogaHR0cEhlYWRlcnMgPz8gdGhpcy50b0h0dHBIZWFkZXJzKHsgJ1Nob3ctTWVzc2FnZSc6ICd5ZXMnIH0pLCB9KSxcclxuXHRcdFx0ZmFsc2VcclxuXHRcdCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBJbmNsdWRlcyBzcGVjaWZpZWQgbmF2aWdhdGlvbnMuXHJcblx0ICogVGhpcyBtZXRob2QgYWRkcyBzcGVjaWZpZWQgbmF2aWdhdGlvbiBwcm9wZXJ0aWVzIHRvIHRoZSBpbmNsdWRlcyBhcnJheSxcclxuXHQgKiBvcHRpb25hbGx5IGFkZGluZyB0aGVtIHRvIHRoZSB1cGRhdGVJbmNsdWRlcyBhcnJheSBhcyB3ZWxsLlxyXG5cdCAqIEBwYXJhbSBpbmMgVGhlIG5hdmlnYXRpb24gcHJvcGVydHkgdG8gaW5jbHVkZS5cclxuXHQgKiBAcGFyYW0gdXBkYXRlIFdoZXRoZXIgdG8gaW5jbHVkZSBpbiB1cGRhdGVJbmNsdWRlcyBhcnJheS5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgaW5jbHVkZShpbmM6IHN0cmluZywgdXBkYXRlOiBib29sZWFuID0gZmFsc2UpIHtcclxuXHRcdHRoaXMuaW5jbHVkZXMucHVzaChpbmMpO1xyXG5cdFx0aWYgKHVwZGF0ZSkge1xyXG5cdFx0XHR0aGlzLnVwZGF0ZUluY2x1ZGVzLnB1c2goaW5jKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIENoZWNrcyBpZiB0aGUgaXRlbSBpcyBkZWxldGFibGUuXHJcblx0ICogVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyBpZiB0aGUgY3VycmVudCBpdGVtIGNhbiBiZSBkZWxldGVkIGJhc2VkIG9uIGl0cyBwcm9wZXJ0aWVzLlxyXG5cdCAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGl0ZW0gY2FuIGJlIGRlbGV0ZWQsIGZhbHNlIG90aGVyd2lzZS5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgY2FuRGVsZXRlSXRlbSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuY2FuRGVsZXRlICYmICghdGhpcy5pdGVtPy5oYXNPd25Qcm9wZXJ0eSgnZGVsZXRhYmxlJykgfHwgKHRoaXMuaXRlbSBhcyBhbnkpWydkZWxldGFibGUnXSk7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBJRCBpcyBzZXQuXHJcblx0ICogVGhpcyBtZXRob2QgdHJpZ2dlcnMgdGhlIGxvYWRpbmcgb2YgdGhlIGl0ZW0gd2hlbiB0aGUgSUQgaXMgc2V0LlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBvbkFmdGVyU2V0SWQoKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5pZCkge1xyXG5cdFx0XHR0aGlzLmxvYWRJdGVtKCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHNlbGVjdGVkIHN0ZXAgaGFzIGNoYW5nZWQuXHJcblx0ICogVGhpcyBtZXRob2QgaGFuZGxlcyBhY3Rpb25zIHRvIGJlIHRha2VuIHdoZW4gdGhlIHN0ZXBwZXIgc2VsZWN0aW9uIGNoYW5nZXMuXHJcblx0ICogQHBhcmFtICRldmVudCBUaGUgc3RlcHBlciBzZWxlY3Rpb24gZXZlbnQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIG9uQWZ0ZXJTdGVwQ2hhbmdlKCRldmVudDogU3RlcHBlclNlbGVjdGlvbkV2ZW50KTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyB0aGUgc2VsZWN0ZWQgc3RlcCBpbiB0aGUgc3RlcHBlciBiYXNlZCBvbiB0aGUgVVJMIGhhc2guXHJcblx0ICogTWFya3MgYWxsIHByZXZpb3VzIHN0ZXBzIGFzIGNvbXBsZXRlZC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgc2VsZWN0U3RlcEJhc2VkT25VcmxIYXNoKCk6IHZvaWQge1xyXG5cdFx0LyogRW5zdXJlIHdlIGFyZSBub3QgaW4gZWRpdCBtb2RlLCBhbmQgdGhhdCBib3RoIHRoZSBzdGVwcGVyIGFuZCBVUkwgaGFzaCBhcmUgYXZhaWxhYmxlICovXHJcblx0XHRpZiAoIXRoaXMuaXNFZGl0TW9kZSAmJiB0aGlzLm1hdFN0ZXBwZXIgJiYgdGhpcy51cmxIYXNoKSB7XHJcblxyXG5cdFx0XHQvKiBGaW5kIHRoZSBzdGVwIHRoYXQgbWF0Y2hlcyB0aGUgc3RhdGUgZnJvbSB0aGUgVVJMIGhhc2ggKi9cclxuXHRcdFx0Y29uc3QgbWF0Y2hlZFN0ZXAgPSB0aGlzLm1hdFN0ZXBwZXIuc3RlcHMuZmluZCgoc3RlcCkgPT4gc3RlcC5zdGF0ZSA9PT0gdGhpcy51cmxIYXNoKTtcclxuXHJcblx0XHRcdGlmIChtYXRjaGVkU3RlcCkge1xyXG5cdFx0XHRcdC8qIEdldCB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgc3RlcCAqL1xyXG5cdFx0XHRcdGNvbnN0IG1hdGNoZWRJbmRleCA9IHRoaXMubWF0U3RlcHBlci5zdGVwcy50b0FycmF5KCkuaW5kZXhPZihtYXRjaGVkU3RlcCk7XHJcblxyXG5cdFx0XHRcdC8qIE1hcmsgYWxsIHByZXZpb3VzIHN0ZXBzIGFzIGNvbXBsZXRlZCAqL1xyXG5cdFx0XHRcdHRoaXMubWF0U3RlcHBlci5zdGVwcy5mb3JFYWNoKChzdGVwLCBpbmRleCkgPT4ge1xyXG5cdFx0XHRcdFx0aWYgKGluZGV4IDwgbWF0Y2hlZEluZGV4KSB7XHJcblx0XHRcdFx0XHRcdHN0ZXAuY29tcGxldGVkID0gdHJ1ZTtcclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHR9KTtcclxuXHJcblx0XHRcdFx0LyogU2V0IHRoZSBzZWxlY3RlZCBzdGVwIGJhc2VkIG9uIHRoZSBtYXRjaGVkIHN0YXRlICovXHJcblx0XHRcdFx0dGhpcy5tYXRTdGVwcGVyLnNlbGVjdGVkSW5kZXggPSBtYXRjaGVkSW5kZXg7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZW50aXR5IGhhcyBiZWVuIGxvYWRlZC5cclxuXHQgKiBUaGlzIG1ldGhvZCBoYW5kbGVzIGFjdGlvbnMgdG8gYmUgdGFrZW4gYWZ0ZXIgdGhlIGVudGl0eSBpcyBsb2FkZWQuXHJcblx0ICovXHJcblx0cHJvdGVjdGVkIG9uQWZ0ZXJJdGVtTG9hZGVkKCk6IHZvaWQgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGVtaXR0ZWQgYmVmb3JlIHRoZSBmb3JtIGlzIGJ1aWx0LlxyXG5cdCAqIFRoaXMgbWV0aG9kIGFsbG93cyBwZXJmb3JtaW5nIG9wZXJhdGlvbnMgYmVmb3JlIHRoZSBmb3JtIGlzIGNvbnN0cnVjdGVkLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBvbkJlZm9yZUZvcm1CdWlsZCgpOiB2b2lkIHsgfVxyXG5cclxuXHQvKipcclxuXHQgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGZvcm0gaGFzIGJlZW4gYnVpbHQuXHJcblx0ICogVGhpcyBtZXRob2QgaGFuZGxlcyBhY3Rpb25zIHRvIGJlIHRha2VuIGFmdGVyIHRoZSBmb3JtIGlzIGNvbnN0cnVjdGVkLFxyXG5cdCAqIHN1Y2ggYXMgZGlzYWJsaW5nIGZvcm0gY29udHJvbHMgaWYgdGhlIGZvcm0gaXMgc2V0IHRvIGJlIGRpc2FibGVkLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBvbkFmdGVyRm9ybUJ1aWxkKCk6IHZvaWQge1xyXG5cdFx0aWYgKHRoaXMuZm9ybSAmJiB0aGlzLmRpc2FibGVkKSB7XHJcblx0XHRcdE9iamVjdC5rZXlzKHRoaXMuZm9ybS5jb250cm9scykuZm9yRWFjaChrZXkgPT4ge1xyXG5cdFx0XHRcdGxldCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgPSB0aGlzLmZvcm0hLmNvbnRyb2xzW2tleV07XHJcblx0XHRcdFx0Y29udHJvbD8uZGlzYWJsZSh7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBlbnRpdHkgaGFzIGJlZW4gY3JlYXRlZC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgb25CZWZvcmVDcmVhdGUoKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBlbnRpdHkgaGFzIGJlZW4gdXBkYXRlZC5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgb25CZWZvcmVVcGRhdGUoKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogQ2FsbGVkIGJlZm9yZSBkYXRhIHN1Ym1pc3Npb24uXHJcblx0ICogVGhpcyBtZXRob2QgYWxsb3dzIHBlcmZvcm1pbmcgb3BlcmF0aW9ucyBiZWZvcmUgc3VibWl0dGluZyBkYXRhLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBiZWZvcmVTdWJtaXQoXzogU2F2ZUFjdGlvbiA9IFNhdmVBY3Rpb24uU2F2ZUFuZENsb3NlKTogdm9pZCB7IH1cclxuXHJcblx0LyoqXHJcblx0ICogRXZlbnQgZW1pdHRlZCBhZnRlciBkYXRhIHN1Ym1pc3Npb24uXHJcblx0ICogVGhpcyBtZXRob2QgaGFuZGxlcyBwb3N0LXN1Ym1pc3Npb24gYWN0aW9ucyBzdWNoIGFzIHJlc2V0dGluZyB0aGUgc2F2aW5nIHN0YXRlLFxyXG5cdCAqIHVwZGF0aW5nIHRoZSBjaGFuZ2UgZGV0ZWN0b3IsIGFuZCBuYXZpZ2F0aW5nIGJhY2sgYmFzZWQgb24gdGhlIHNhdmUgYWN0aW9uLlxyXG5cdCAqIEBwYXJhbSBhY3Rpb24gVGhlIHNhdmUgYWN0aW9uIHRha2VuIChlLmcuLCBTYXZlQW5kQ2xvc2UsIFNhdmVBbmROZXcpLlxyXG5cdCAqIEBwYXJhbSByZXNwb25zZSBUaGUgcmVzcG9uc2UgcmVjZWl2ZWQgYWZ0ZXIgc3VibWlzc2lvbi5cclxuXHQgKi9cclxuXHRwcm90ZWN0ZWQgb25BZnRlclN1Ym1pdChhY3Rpb246IFNhdmVBY3Rpb24gPSBTYXZlQWN0aW9uLlNhdmVBbmRDbG9zZSwgcmVzcG9uc2U6IGFueSA9IG51bGwpOiB2b2lkIHtcclxuXHRcdC8qIFJlc2V0IHRoZSBzYXZpbmcgZmxhZyBvbmNlIGRhdGEgaXMgc3VjY2Vzc2Z1bGx5IHNlbnQgKi9cclxuXHRcdHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcclxuXHRcdHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cdFx0dGhpcy5iYWNrKGFjdGlvbik7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDYWxsZWQgYWZ0ZXIgdGhlIHBhZ2UgaXMgcmVsb2FkZWQuXHJcblx0ICogVGhpcyBtZXRob2QgcmVpbml0aWFsaXplcyB0aGUgaXRlbSB3aXRoIGEgbmV3IGluc3RhbmNlIGFuZCBhcHBsaWVzIGFueSBxdWVyeSBwYXJhbWV0ZXJzLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBhZnRlclJlbG9hZCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuaXRlbSA9IE9iamVjdC5hc3NpZ24odGhpcy5uZXdJbnN0YW5jZSgpLCB0aGlzLnF1ZXJ5KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFNldHMgZm9jdXMgdG8gdGhlIGZpcnN0IGlucHV0IGVsZW1lbnQuXHJcblx0ICogRW5zdXJlcyB0aGUgZmlyc3QgaW5wdXQgZWxlbWVudCBpbiB0aGUgZm9ybSBpcyBmb2N1c2VkIGZvciB1c2VyIGNvbnZlbmllbmNlLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBmb2N1cygpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmlucHV0ICYmIHRoaXMuaW5wdXQuZmlyc3QgJiYgdGhpcy5pbnB1dC5maXJzdC5uYXRpdmVFbGVtZW50KSB7XHJcblx0XHRcdHRoaXMuaW5wdXQuZmlyc3QubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUmV0cmlldmVzIHRoZSBlcnJvciBtZXNzYWdlIGZvciBhIGdpdmVuIG5hdGl2ZSBlbGVtZW50LlxyXG5cdCAqIFRoaXMgbWV0aG9kIG5hdmlnYXRlcyB0aHJvdWdoIHRoZSBET00gc3RydWN0dXJlIHRvIGZpbmQgZXJyb3IgbWVzc2FnZXMgYXNzb2NpYXRlZCB3aXRoIGZvcm0gZmllbGRzLlxyXG5cdCAqIEBwYXJhbSBuYXRpdmVFbGVtZW50IFRoZSBET00gZWxlbWVudCB0byBjaGVjayBmb3IgZXJyb3JzLlxyXG5cdCAqIEByZXR1cm5zIFRoZSBlcnJvciBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudCwgb3IgdW5kZWZpbmVkIGlmIG5vIGVycm9yIGlzIGZvdW5kLlxyXG5cdCAqL1xyXG5cdHByb3RlY3RlZCBnZXRFbGVtZW50RXJyb3IobmF0aXZlRWxlbWVudDogYW55KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuXHRcdC8qIEdldCBwYXJlbnQgZWxlbWVudCAnbWF0LWZvcm0tZmllbGQnICovXHJcblx0XHR2YXIgbWF0Rm9ybUZpZWxkID0gbmF0aXZlRWxlbWVudD8uY2xvc2VzdCgnLm1hdC1mb3JtLWZpZWxkJyk7XHJcblx0XHRpZiAoIW1hdEZvcm1GaWVsZCkge1xyXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIEdldCBjaGlsZCBlbGVtZW50ICdtYXQtZXJyb3InICovXHJcblx0XHR2YXIgbWF0RXJyb3JzID0gbWF0Rm9ybUZpZWxkLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXQtZXJyb3InKTtcclxuXHRcdGlmICghbWF0RXJyb3JzKSB7XHJcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogR2V0IGNoaWxkIGVsZW1lbnQgJ21hdC1sYWJlbCcgKi9cclxuXHRcdHZhciBtYXRMYWJlbCA9IG1hdEZvcm1GaWVsZC5xdWVyeVNlbGVjdG9yKCdtYXQtbGFiZWwnKTtcclxuXHRcdGlmICghbWF0TGFiZWwpIHtcclxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcclxuXHRcdH1cclxuXHJcblx0XHQvKiBHZXQgZXJyb3IgdGV4dHMgKi9cclxuXHRcdHZhciBlcnJvcnNBcnJheSA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG1hdEVycm9ycylcclxuXHRcdFx0Py5maWx0ZXIoKHg6IGFueSkgPT4geC50ZXh0Q29udGVudClcclxuXHRcdFx0Py5tYXAoKHg6IGFueSkgPT4geC50ZXh0Q29udGVudCk7XHJcblxyXG5cdFx0cmV0dXJuIGAnJHttYXRMYWJlbC50ZXh0Q29udGVudH0nOiAke2Vycm9yc0FycmF5Py5qb2luKCcsICcpfWA7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZXNwb25kcyB0byB1c2VyLWluaXRpYXRlZCBrZXlib2FyZCBldmVudHMuXHJcblx0ICogVGhpcyBtZXRob2QgbGlzdGVucyBmb3Igc3BlY2lmaWMga2V5IGNvbWJpbmF0aW9ucyBhbmQgdHJpZ2dlcnMgc2F2ZSBhY3Rpb25zIG9yIGZvcm0gY2FuY2VsbGF0aW9uLlxyXG5cdCAqIEBwYXJhbSBldmVudCBUaGUga2V5Ym9hcmQgZXZlbnQgdHJpZ2dlcmVkIGJ5IHRoZSB1c2VyLlxyXG5cdCAqL1xyXG5cdEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKVxyXG5cdHB1YmxpYyBoYW5kbGVLZXlib2FyZEV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcblx0XHRpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7XHJcblx0XHRcdHN3aXRjaCAoZXZlbnQua2V5KSB7XHJcblx0XHRcdFx0Y2FzZSAncyc6XHJcblx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cdFx0XHRcdFx0dGhpcy5zYXZlKFNhdmVBY3Rpb24uU2F2ZUFuZENsb3NlKTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdkJzpcclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHR0aGlzLnNhdmUoU2F2ZUFjdGlvbi5TYXZlQW5kTmV3KTtcclxuXHRcdFx0XHRcdGJyZWFrO1xyXG5cclxuXHRcdFx0XHRjYXNlICdlJzpcclxuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblx0XHRcdFx0XHR0aGlzLnNhdmUoU2F2ZUFjdGlvbi5TYXZlQW5kRWRpdCk7XHJcblx0XHRcdFx0XHRicmVhaztcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qIENhbmNlbCB0aGUgZm9ybSBpZiB0aGUgdXNlciBwcmVzc2VzIHRoZSBFU0Mga2V5ICovXHJcblx0XHRpZiAoZXZlbnQua2V5Q29kZSA9PSAyNykge1xyXG5cdFx0XHR0aGlzLmJhY2soKTtcclxuXHRcdH1cclxuXHR9XHJcbn0iXX0=
|