@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,810 +0,0 @@
|
|
|
1
|
-
import { animate, AUTO_STYLE, state, style, transition, trigger } from '@angular/animations';
|
|
2
|
-
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
3
|
-
import { ChangeDetectorRef, Component, ContentChild, ElementRef, EventEmitter, Input, Output, QueryList, TemplateRef, ViewChild, ViewChildren, ViewContainerRef } from '@angular/core';
|
|
4
|
-
import { MatMenuTrigger } from '@angular/material/menu';
|
|
5
|
-
import { MatPaginator } from '@angular/material/paginator';
|
|
6
|
-
import { MatSort } from '@angular/material/sort';
|
|
7
|
-
import { MatTable } from '@angular/material/table';
|
|
8
|
-
import { BehaviorSubject, of } from 'rxjs';
|
|
9
|
-
import { Utils } from '../../../common/functions/utils';
|
|
10
|
-
import { DynamicBuilder } from '../../../common/helpers/dynamic-builder';
|
|
11
|
-
import { ActionItem } from '../../../common/models/action-item';
|
|
12
|
-
import { Grid } from '../../enums/grid';
|
|
13
|
-
import { TableColumnType } from '../../enums/table-column-type';
|
|
14
|
-
import { getTableDefinition } from '../../functions/functions';
|
|
15
|
-
import { TableColumn } from '../../models/table-column';
|
|
16
|
-
import { TableStaticDataSource } from '../../table.static-data-source';
|
|
17
|
-
import * as i0 from "@angular/core";
|
|
18
|
-
import * as i1 from "../../../common/helpers/dynamic-builder";
|
|
19
|
-
import * as i2 from "@angular/common";
|
|
20
|
-
import * as i3 from "../../../layout/dynamic-menu/dynamic-menu.component";
|
|
21
|
-
import * as i4 from "../../../common/directives/disable-control.directive";
|
|
22
|
-
import * as i5 from "../../../common/pipes/only-number";
|
|
23
|
-
import * as i6 from "../../../select/components/select.component";
|
|
24
|
-
import * as i7 from "@angular/forms";
|
|
25
|
-
import * as i8 from "@angular/material/button";
|
|
26
|
-
import * as i9 from "@angular/material/form-field";
|
|
27
|
-
import * as i10 from "@angular/material/icon";
|
|
28
|
-
import * as i11 from "@angular/material/input";
|
|
29
|
-
import * as i12 from "@angular/material/table";
|
|
30
|
-
import * as i13 from "@angular/material/sort";
|
|
31
|
-
import * as i14 from "@angular/cdk/table";
|
|
32
|
-
import * as i15 from "@angular/material/progress-bar";
|
|
33
|
-
import * as i16 from "@angular/material/checkbox";
|
|
34
|
-
import * as i17 from "@angular/material/menu";
|
|
35
|
-
import * as i18 from "@angular/material/slide-toggle";
|
|
36
|
-
import * as i19 from "@angular/material/paginator";
|
|
37
|
-
import * as i20 from "@angular/material/tooltip";
|
|
38
|
-
import * as i21 from "@angular/material/chips";
|
|
39
|
-
import * as i22 from "../filter-input/filter-input.component";
|
|
40
|
-
import * as i23 from "../filter-select/filter-select.component";
|
|
41
|
-
import * as i24 from "../filter-clear/filter-clear.component";
|
|
42
|
-
import * as i25 from "../filter-date/filter-date.component";
|
|
43
|
-
import * as i26 from "../../directives/data-source-filter.directive";
|
|
44
|
-
import * as i27 from "../../../common/pipes/enum.pipe";
|
|
45
|
-
import * as i28 from "../../../common/pipes/form-group.pipe";
|
|
46
|
-
import * as i29 from "../../../common/pipes/func.pipe";
|
|
47
|
-
import * as i30 from "../../../common/pipes/nested-property";
|
|
48
|
-
import * as i31 from "../../../common/pipes/join.pipe";
|
|
49
|
-
import * as i32 from "../../../common/pipes/map.pipe";
|
|
50
|
-
export class VdDynamicTableComponent {
|
|
51
|
-
dynamicBuilder;
|
|
52
|
-
changeDetector;
|
|
53
|
-
/**
|
|
54
|
-
* Reference to the table component, used for accessing MatTable functionalities.
|
|
55
|
-
*/
|
|
56
|
-
table;
|
|
57
|
-
/**
|
|
58
|
-
* References to the container elements for detail templates, with ViewContainerRef
|
|
59
|
-
* allowing dynamic insertion of views.
|
|
60
|
-
*/
|
|
61
|
-
detailsTemplateRef;
|
|
62
|
-
/**
|
|
63
|
-
* Reference to a content child template (details template) of type TemplateRef,
|
|
64
|
-
* used for rendering custom templates in the table.
|
|
65
|
-
*/
|
|
66
|
-
templateRef;
|
|
67
|
-
/**
|
|
68
|
-
* Data source for the table, which can either be a custom TableDataSource
|
|
69
|
-
* implementation or a dynamic object.
|
|
70
|
-
*/
|
|
71
|
-
dataSource;
|
|
72
|
-
/**
|
|
73
|
-
* Input data for the table, which is set as a static data source.
|
|
74
|
-
* This method also initializes sorting and pagination for the table.
|
|
75
|
-
*/
|
|
76
|
-
set data(data) {
|
|
77
|
-
this.dataSource = new TableStaticDataSource(data);
|
|
78
|
-
this.dataSource.sort = this.matSort;
|
|
79
|
-
this.dataSource.paginator = this._paginator;
|
|
80
|
-
this.paginable = true;
|
|
81
|
-
this.static = true;
|
|
82
|
-
}
|
|
83
|
-
/**
|
|
84
|
-
* Reactive FormArray representing the form data, which is used to track
|
|
85
|
-
* form controls and synchronize table data with form changes.
|
|
86
|
-
*/
|
|
87
|
-
_formArray;
|
|
88
|
-
/**
|
|
89
|
-
* Input FormArray for managing form controls associated with the table.
|
|
90
|
-
* It sets the table data and subscribes to changes in the form values to
|
|
91
|
-
* update the table dynamically.
|
|
92
|
-
*/
|
|
93
|
-
get formArray() { return this._formArray; }
|
|
94
|
-
set formArray(formArray) {
|
|
95
|
-
this._formArray = formArray;
|
|
96
|
-
this.data = this._formArray?.value;
|
|
97
|
-
/* Update the table data when the form array values change */
|
|
98
|
-
this._formArray?.valueChanges?.subscribe(x => {
|
|
99
|
-
if (x.length !== this.dataSource?.data?.length) {
|
|
100
|
-
this.dataSource.data = this._formArray?.value;
|
|
101
|
-
}
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Getter for retrieving the raw value of the form, without applying any transformations.
|
|
106
|
-
*/
|
|
107
|
-
get formValue() { return this.formArray?.getRawValue(); }
|
|
108
|
-
/**
|
|
109
|
-
* Flag to enable or disable debug mode for logging and additional information.
|
|
110
|
-
*/
|
|
111
|
-
debugValue = false;
|
|
112
|
-
/**
|
|
113
|
-
* Input representing the class type used in this component,
|
|
114
|
-
* typically defining the structure or model of the data.
|
|
115
|
-
*/
|
|
116
|
-
classType;
|
|
117
|
-
/**
|
|
118
|
-
* Input for the current context or environment in which the table is being used.
|
|
119
|
-
* This allows passing additional metadata or settings.
|
|
120
|
-
*/
|
|
121
|
-
context;
|
|
122
|
-
/**
|
|
123
|
-
* Input for applying filters to the data source. It defines criteria or conditions
|
|
124
|
-
* that will be used to filter the table data.
|
|
125
|
-
*/
|
|
126
|
-
dataSourceFilter = {};
|
|
127
|
-
/**
|
|
128
|
-
* Flag indicating whether the table uses a static data source.
|
|
129
|
-
* When true, the table does not rely on dynamic data changes.
|
|
130
|
-
*/
|
|
131
|
-
static = false;
|
|
132
|
-
/**
|
|
133
|
-
* Flag to indicate whether the table data is filterable by the user.
|
|
134
|
-
* If true, filtering options are provided.
|
|
135
|
-
*/
|
|
136
|
-
filterable = true;
|
|
137
|
-
/**
|
|
138
|
-
* Flag to indicate whether the table headers or columns should stick
|
|
139
|
-
* to the viewport during scrolling.
|
|
140
|
-
*/
|
|
141
|
-
sticky = false;
|
|
142
|
-
/**
|
|
143
|
-
* Defines the overall width of the table.
|
|
144
|
-
*/
|
|
145
|
-
tableWidth;
|
|
146
|
-
/**
|
|
147
|
-
* Determines whether the filter operator is used in table filtering.
|
|
148
|
-
* If true, filtering logic will apply operators such as equals, contains, etc.
|
|
149
|
-
*/
|
|
150
|
-
useFilterOperator = true;
|
|
151
|
-
/**
|
|
152
|
-
* Determines whether the table supports pagination.
|
|
153
|
-
* If true, pagination controls will be available for navigating through the data.
|
|
154
|
-
*/
|
|
155
|
-
paginable = false;
|
|
156
|
-
/**
|
|
157
|
-
* Determines whether the 'Checkbox' column is shown for row selection.
|
|
158
|
-
* If true, a checkbox column will be displayed allowing users to select rows.
|
|
159
|
-
*/
|
|
160
|
-
selectable = false;
|
|
161
|
-
/**
|
|
162
|
-
* Specifies the active column used for sorting the table data.
|
|
163
|
-
* This input determines which column the sorting is applied to.
|
|
164
|
-
*/
|
|
165
|
-
sortActive;
|
|
166
|
-
/**
|
|
167
|
-
* Specifies the direction of sorting (ascending or descending).
|
|
168
|
-
* Default is 'asc' (ascending).
|
|
169
|
-
*/
|
|
170
|
-
sortDirection = 'asc';
|
|
171
|
-
/**
|
|
172
|
-
* Determines whether the table header should remain sticky (fixed) at the top of the viewport
|
|
173
|
-
* when the table scrolls.
|
|
174
|
-
*/
|
|
175
|
-
stickyHeader = true;
|
|
176
|
-
/**
|
|
177
|
-
* Determines whether the filter section of the table should remain sticky (fixed)
|
|
178
|
-
* at the top of the viewport when scrolling.
|
|
179
|
-
*/
|
|
180
|
-
stickyFilter = true;
|
|
181
|
-
/**
|
|
182
|
-
* Private backing field for the columnSets input property.
|
|
183
|
-
* This field stores the sets of columns to be displayed in the table,
|
|
184
|
-
* enabling control over how the value is accessed or modified through
|
|
185
|
-
* the public getter and setter.
|
|
186
|
-
* @private
|
|
187
|
-
*/
|
|
188
|
-
_columnSets;
|
|
189
|
-
/**
|
|
190
|
-
* Used to display specific columns in the table.
|
|
191
|
-
* This array defines sets of columns that can be shown
|
|
192
|
-
* based on the active configuration, allowing for dynamic table
|
|
193
|
-
* column customization.
|
|
194
|
-
* @property
|
|
195
|
-
*/
|
|
196
|
-
get columnSets() { return this._columnSets; }
|
|
197
|
-
set columnSets(value) { this._columnSets = value; }
|
|
198
|
-
/**
|
|
199
|
-
* Event emitter for row click events. It emits the clicked row's data whenever a row is clicked.
|
|
200
|
-
*/
|
|
201
|
-
rowClick = new EventEmitter();
|
|
202
|
-
/**
|
|
203
|
-
* Function used to dynamically assign CSS classes to table rows based on custom logic.
|
|
204
|
-
*/
|
|
205
|
-
rowNgClass;
|
|
206
|
-
/**
|
|
207
|
-
* Template for rendering additional details below each row.
|
|
208
|
-
* It accepts a string representing the template key or identifier.
|
|
209
|
-
*/
|
|
210
|
-
detailsTemplate;
|
|
211
|
-
/**
|
|
212
|
-
* Flag to indicate whether the table is in a readonly state.
|
|
213
|
-
* If true, no changes can be made to the table data.
|
|
214
|
-
*/
|
|
215
|
-
_readonly = false;
|
|
216
|
-
/**
|
|
217
|
-
* Input property to determine if the table is readonly.
|
|
218
|
-
* Uses `coerceBooleanProperty` to ensure the value is treated as a boolean.
|
|
219
|
-
*/
|
|
220
|
-
get readonly() { return this._readonly; }
|
|
221
|
-
set readonly(readonly) {
|
|
222
|
-
this._readonly = coerceBooleanProperty(readonly);
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* Function to filter items when selecting all rows.
|
|
226
|
-
* It takes value, index, and array as arguments and returns a boolean or unknown type.
|
|
227
|
-
*/
|
|
228
|
-
selectAllFilter;
|
|
229
|
-
/**
|
|
230
|
-
* Reference to the MatSort directive used for applying sorting on the table.
|
|
231
|
-
*/
|
|
232
|
-
matSort;
|
|
233
|
-
/**
|
|
234
|
-
* Private reference to the MatPaginator used to paginate the table data.
|
|
235
|
-
*/
|
|
236
|
-
_paginator;
|
|
237
|
-
/**
|
|
238
|
-
* Input setter for the MatPaginator. When the paginator is set, it assigns it
|
|
239
|
-
* to the data source for pagination control.
|
|
240
|
-
*/
|
|
241
|
-
set paginator(paginator) {
|
|
242
|
-
if (paginator) {
|
|
243
|
-
this.dataSource.paginator = paginator;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
/**
|
|
247
|
-
* Private array storing the columns to be displayed in the table.
|
|
248
|
-
*/
|
|
249
|
-
_columns = [];
|
|
250
|
-
/**
|
|
251
|
-
* Input getter and setter for the table columns.
|
|
252
|
-
* It allows the columns to be customized and updated dynamically.
|
|
253
|
-
*/
|
|
254
|
-
get columns() { return this._columns; }
|
|
255
|
-
set columns(columns) { this._columns = columns; }
|
|
256
|
-
/**
|
|
257
|
-
* BehaviorSubject to manage and emit changes to the columns dynamically.
|
|
258
|
-
*/
|
|
259
|
-
columnsSubject = new BehaviorSubject([]);
|
|
260
|
-
/**
|
|
261
|
-
* Observable that tracks and emits changes to the columns.
|
|
262
|
-
*/
|
|
263
|
-
columns$ = this.columnsSubject.asObservable();
|
|
264
|
-
/**
|
|
265
|
-
* Observable tracking the columns currently displayed in the table.
|
|
266
|
-
*/
|
|
267
|
-
displayedColumns$;
|
|
268
|
-
/**
|
|
269
|
-
* Observable tracking the filterable columns displayed in the table.
|
|
270
|
-
*/
|
|
271
|
-
displayedFilterColumns$;
|
|
272
|
-
/**
|
|
273
|
-
* Input property for row-specific action menu items.
|
|
274
|
-
* Defines actions available in the context menu for each row.
|
|
275
|
-
*/
|
|
276
|
-
rowMenuItems = [];
|
|
277
|
-
/**
|
|
278
|
-
* Input for a single row action to be applied when interacting with a row.
|
|
279
|
-
* @property {ActionItem} rowAction
|
|
280
|
-
*/
|
|
281
|
-
rowAction;
|
|
282
|
-
/**
|
|
283
|
-
* Input for specifying which columns should be excluded from display in the table.
|
|
284
|
-
* @property {string[]} excludedColumns
|
|
285
|
-
*/
|
|
286
|
-
excludedColumns = [];
|
|
287
|
-
/**
|
|
288
|
-
* QueryList to reference all MatMenuTriggers associated with row context menus.
|
|
289
|
-
* Used for handling the context menu interactions on table rows.
|
|
290
|
-
* @property {QueryList<MatMenuTrigger>} rowContextMenuTriggers
|
|
291
|
-
*/
|
|
292
|
-
rowContextMenuTriggers;
|
|
293
|
-
/**
|
|
294
|
-
* Column type enum reference, mapping table columns to their types for rendering.
|
|
295
|
-
* @property {typeof TableColumnType} ColumnType
|
|
296
|
-
*/
|
|
297
|
-
ColumnType = TableColumnType;
|
|
298
|
-
/**
|
|
299
|
-
* Grid enum reference, representing the type of grid used in the table.
|
|
300
|
-
* @property {typeof Grid} Grid
|
|
301
|
-
*/
|
|
302
|
-
Grid = Grid;
|
|
303
|
-
/**
|
|
304
|
-
* Reference to the currently expanded row, used for handling row expansion logic.
|
|
305
|
-
* @property {any} expandedRow
|
|
306
|
-
*/
|
|
307
|
-
expandedRow;
|
|
308
|
-
/**
|
|
309
|
-
* Input for setting the default page size for pagination.
|
|
310
|
-
* Default value is 15.
|
|
311
|
-
*/
|
|
312
|
-
pageSize = 15;
|
|
313
|
-
/**
|
|
314
|
-
* Input for setting available page size options in the paginator.
|
|
315
|
-
* Default options include [5, 10, 15, 20, 30, 50, 100, 200].
|
|
316
|
-
*/
|
|
317
|
-
pageSizeOptions = [5, 10, 15, 20, 30, 50, 100, 200];
|
|
318
|
-
/*
|
|
319
|
-
* This decorator binds the scrollable container element by its template reference.
|
|
320
|
-
* The `scrollContainer` will reference the element inside the template with `#scrollContainer`.
|
|
321
|
-
* It will allow access to the native DOM element for managing scroll operations.
|
|
322
|
-
*/
|
|
323
|
-
scrollContainer;
|
|
324
|
-
/*
|
|
325
|
-
* Indicates whether the right mouse button is actively dragging the scroll container.
|
|
326
|
-
* This flag ensures that scrolling only occurs when a drag operation is in progress,
|
|
327
|
-
* providing a smoother and more controlled user experience during interactions.
|
|
328
|
-
*/
|
|
329
|
-
startDragging = false;
|
|
330
|
-
/*
|
|
331
|
-
* Flag to indicate whether the right mouse button is actively dragging the scroll container.
|
|
332
|
-
* It ensures that scrolling occurs only during active dragging.
|
|
333
|
-
*/
|
|
334
|
-
isDragging = false;
|
|
335
|
-
/*
|
|
336
|
-
* Stores the initial X coordinate when the user presses the right mouse button.
|
|
337
|
-
* This is used to calculate the distance moved during dragging, enabling smooth scrolling.
|
|
338
|
-
*/
|
|
339
|
-
startX = 0;
|
|
340
|
-
/*
|
|
341
|
-
* Keeps track of the container’s scroll position before the drag begins.
|
|
342
|
-
* This allows updating the scroll position in real-time as the user moves the mouse.
|
|
343
|
-
*/
|
|
344
|
-
scrollLeft = 0;
|
|
345
|
-
/**
|
|
346
|
-
* Constructor for the component, injecting services needed for form building,
|
|
347
|
-
* dynamic content handling, and change detection.
|
|
348
|
-
*
|
|
349
|
-
* @param formBuilder Service for creating form controls and managing form logic.
|
|
350
|
-
* @param dynamicBuilder Service for dynamically constructing table components.
|
|
351
|
-
* @param changeDetector Service for detecting and triggering UI changes.
|
|
352
|
-
*/
|
|
353
|
-
constructor(dynamicBuilder, changeDetector) {
|
|
354
|
-
this.dynamicBuilder = dynamicBuilder;
|
|
355
|
-
this.changeDetector = changeDetector;
|
|
356
|
-
}
|
|
357
|
-
/**
|
|
358
|
-
* A callback method that is invoked immediately after the
|
|
359
|
-
* default change detector has checked the directive's
|
|
360
|
-
* data-bound properties for the first time,
|
|
361
|
-
* and before any of the view or content children have been checked.
|
|
362
|
-
* It is invoked only once when the directive is instantiated.
|
|
363
|
-
*/
|
|
364
|
-
ngOnInit() {
|
|
365
|
-
if (this.classType) {
|
|
366
|
-
/* Get the table definition using the class type */
|
|
367
|
-
var tableDefinition = getTableDefinition(this.classType);
|
|
368
|
-
if (tableDefinition) {
|
|
369
|
-
this.columns = [...tableDefinition.columns ?? []];
|
|
370
|
-
if (this.rowMenuItems?.length > 0) {
|
|
371
|
-
/* Check if the action column already exists */
|
|
372
|
-
var actionColmun = this._columns?.find(x => x.name == 'action');
|
|
373
|
-
/* If so, just add the menu items to it */
|
|
374
|
-
if (actionColmun != null) {
|
|
375
|
-
actionColmun.menu ||= { icon: 'more_vert' };
|
|
376
|
-
this.rowMenuItems.forEach(y => actionColmun.menu.items?.unshift(y));
|
|
377
|
-
}
|
|
378
|
-
/* Otherwise add a new one */
|
|
379
|
-
else {
|
|
380
|
-
this._columns.push(new TableColumn({
|
|
381
|
-
index: 2000,
|
|
382
|
-
name: 'action',
|
|
383
|
-
columnSets: ['action', 'common'],
|
|
384
|
-
type: TableColumnType.Action,
|
|
385
|
-
disabled: true,
|
|
386
|
-
menu: { icon: 'more_vert', items: this.rowMenuItems },
|
|
387
|
-
configurable: false,
|
|
388
|
-
stickyEnd: true
|
|
389
|
-
}));
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
else if (this.rowAction) {
|
|
393
|
-
this._columns.push(new TableColumn({
|
|
394
|
-
index: 2000,
|
|
395
|
-
name: 'action',
|
|
396
|
-
columnSets: ['action', 'common'],
|
|
397
|
-
type: TableColumnType.Action,
|
|
398
|
-
disabled: true,
|
|
399
|
-
menu: this.rowAction,
|
|
400
|
-
configurable: false,
|
|
401
|
-
stickyEnd: true
|
|
402
|
-
}));
|
|
403
|
-
}
|
|
404
|
-
/* Add checkbox column */
|
|
405
|
-
if (this.selectable) {
|
|
406
|
-
this.columns.unshift(new TableColumn({
|
|
407
|
-
name: 'select',
|
|
408
|
-
columnSets: ['select', 'common'],
|
|
409
|
-
type: TableColumnType.Checkbox,
|
|
410
|
-
configurable: false,
|
|
411
|
-
sticky: true
|
|
412
|
-
}));
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
/* Build displayed columns & filter */
|
|
417
|
-
this.columns$?.subscribe(x => {
|
|
418
|
-
/* Filter the columns based on the individual column's columnSets property and the global columnSets */
|
|
419
|
-
const selectedColumns = (this.columnSets?.length ?? 0) > 0
|
|
420
|
-
? this.columns?.filter(c => this.columnSets?.some(set => c.columnSets?.includes(set)))
|
|
421
|
-
: this.columns;
|
|
422
|
-
/* Build the displayed columns by filtering out the excluded columns and mapping to their names */
|
|
423
|
-
this.displayedColumns$ = of(selectedColumns
|
|
424
|
-
/* Exclude columns that are in the excludedColumns list */
|
|
425
|
-
?.filter(x => !this.excludedColumns?.includes(x.name))
|
|
426
|
-
/* Map the remaining columns to their name property */
|
|
427
|
-
?.map(c => c.name));
|
|
428
|
-
/* Build the displayed filter columns by filtering out the excluded columns and prefixing with 'filter.' */
|
|
429
|
-
this.displayedFilterColumns$ = of(selectedColumns
|
|
430
|
-
/* Exclude columns that are in the excludedColumns list */
|
|
431
|
-
?.filter(x => !this.excludedColumns?.includes(x.name))
|
|
432
|
-
/* Map the remaining columns to a filter-friendly string with 'filter.' prefix */
|
|
433
|
-
?.map(c => `filter.${(c.filter || c.name)}`));
|
|
434
|
-
});
|
|
435
|
-
/* Set the table columns */
|
|
436
|
-
this.updateColumns();
|
|
437
|
-
const container = this.scrollContainer?.nativeElement;
|
|
438
|
-
if (container) {
|
|
439
|
-
/*
|
|
440
|
-
* Disable the context menu on right-click to allow smooth scrolling
|
|
441
|
-
* without interference from the default context menu behavior.
|
|
442
|
-
*/
|
|
443
|
-
container.addEventListener('contextmenu', (e) => e.preventDefault());
|
|
444
|
-
/*
|
|
445
|
-
* Start dragging when the right mouse button is pressed (button === 2).
|
|
446
|
-
* This saves the initial position and scroll state for later use during movement.
|
|
447
|
-
*/
|
|
448
|
-
container.addEventListener('mousedown', (e) => {
|
|
449
|
-
if (e.button === 2 && this.scrollContainer) {
|
|
450
|
-
/* Prevents any default behavior associated with right-click */
|
|
451
|
-
e.preventDefault();
|
|
452
|
-
/* Activate the dragging mode, allowing horizontal scrolling */
|
|
453
|
-
this.startDragging = true;
|
|
454
|
-
/* Store the initial X position */
|
|
455
|
-
this.startX = e.pageX - container.offsetLeft;
|
|
456
|
-
/* Save the current scroll position */
|
|
457
|
-
this.scrollLeft = container.scrollLeft;
|
|
458
|
-
}
|
|
459
|
-
});
|
|
460
|
-
/*
|
|
461
|
-
* Stop dragging when the mouse leaves the container.
|
|
462
|
-
* This ensures the scrolling stops even if the user moves the cursor outside the boundaries.
|
|
463
|
-
*/
|
|
464
|
-
container.addEventListener('mouseleave', (e) => this.stopDragging(e));
|
|
465
|
-
/*
|
|
466
|
-
* Stop dragging when the mouse button is released (on mouse up).
|
|
467
|
-
* This prevents further scroll movements after the user releases the mouse.
|
|
468
|
-
*/
|
|
469
|
-
container.addEventListener('mouseup', (e) => this.stopDragging(e));
|
|
470
|
-
/*
|
|
471
|
-
* Handle the actual dragging (scrolling) when the mouse is moved.
|
|
472
|
-
* This calculates the movement and updates the scroll position accordingly.
|
|
473
|
-
*/
|
|
474
|
-
container.addEventListener('mousemove', (e) => {
|
|
475
|
-
/* If dragging is not active or scroll container is undefined, exit */
|
|
476
|
-
if (!this.startDragging || !this.scrollContainer) {
|
|
477
|
-
return;
|
|
478
|
-
}
|
|
479
|
-
/* Activate the dragging mode, allowing horizontal scrolling */
|
|
480
|
-
this.isDragging = true;
|
|
481
|
-
/* Prevent default action to ensure smooth behavior */
|
|
482
|
-
e.preventDefault();
|
|
483
|
-
/* Calculate the current mouse X position */
|
|
484
|
-
const x = e.pageX - container.offsetLeft;
|
|
485
|
-
/* Calculate the distance moved (amplified for speed) */
|
|
486
|
-
const walk = (x - this.startX) * 2;
|
|
487
|
-
/* Update the scroll position based on movement */
|
|
488
|
-
container.scrollLeft = this.scrollLeft - walk;
|
|
489
|
-
});
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
/**
|
|
493
|
-
* Updates the table columns
|
|
494
|
-
*/
|
|
495
|
-
updateColumns() {
|
|
496
|
-
/* Sort the columns by index */
|
|
497
|
-
Utils.sortArray(this.columns || [], 'index');
|
|
498
|
-
/* Trigger changes */
|
|
499
|
-
this.columnsSubject.next(this.columns);
|
|
500
|
-
}
|
|
501
|
-
/**
|
|
502
|
-
* Counts visible action menus
|
|
503
|
-
* @param row
|
|
504
|
-
* @param column
|
|
505
|
-
* @returns
|
|
506
|
-
*/
|
|
507
|
-
hasVisibleRowMenuItems(row, column) {
|
|
508
|
-
return (column?.rowMenuItems?.filter(x => !x.hide || !x.hide(row))?.length ?? -1) > 0;
|
|
509
|
-
}
|
|
510
|
-
/**
|
|
511
|
-
* A function to to compute the identity of items in an iterable.
|
|
512
|
-
* @param index
|
|
513
|
-
* @param item
|
|
514
|
-
*/
|
|
515
|
-
trackBy(index, item) {
|
|
516
|
-
return `${item.id}`;
|
|
517
|
-
}
|
|
518
|
-
/**
|
|
519
|
-
* A function to to compute the identity of items in an iterable.
|
|
520
|
-
* @param index
|
|
521
|
-
* @param item
|
|
522
|
-
*/
|
|
523
|
-
columnsTrackBy(index, item) {
|
|
524
|
-
return item.name;
|
|
525
|
-
}
|
|
526
|
-
/**
|
|
527
|
-
* Handles row click event
|
|
528
|
-
* @param index
|
|
529
|
-
* @param row
|
|
530
|
-
*/
|
|
531
|
-
handleRowClick(index, row) {
|
|
532
|
-
if (this.templateRef) {
|
|
533
|
-
this.expandedRow = this.expandedRow === row ? null : row;
|
|
534
|
-
}
|
|
535
|
-
else if (this.detailsTemplate) {
|
|
536
|
-
this.expandedRow = this.expandedRow === row ? null : row;
|
|
537
|
-
if (this.detailsTemplateRef) {
|
|
538
|
-
this.dynamicBuilder.compileHtml(this.detailsTemplateRef.get(index), this.detailsTemplate, row);
|
|
539
|
-
}
|
|
540
|
-
}
|
|
541
|
-
else {
|
|
542
|
-
this.rowClick.emit(row);
|
|
543
|
-
}
|
|
544
|
-
}
|
|
545
|
-
/**
|
|
546
|
-
* Method called when the user click with the right button
|
|
547
|
-
* @param event MouseEvent, it contains the coordinates
|
|
548
|
-
* @param item Our data contained in the row of the table
|
|
549
|
-
*/
|
|
550
|
-
handleRowRightClick(event, item) {
|
|
551
|
-
if (this.isDragging) {
|
|
552
|
-
return;
|
|
553
|
-
}
|
|
554
|
-
this.rowContextMenuTriggers?.toArray()?.forEach(x => x.closeMenu());
|
|
555
|
-
var menuTrigger = this.rowContextMenuTriggers?.toArray()?.filter(x => x['_element']?.nativeElement?.getAttribute('id') == `menu-${item.id}`)[0];
|
|
556
|
-
if (menuTrigger != null) {
|
|
557
|
-
/* Avoids to show the visualization of the right-click menu of the browser */
|
|
558
|
-
event.preventDefault();
|
|
559
|
-
/* Set the position of the menu */
|
|
560
|
-
menuTrigger['_element']?.nativeElement?.setAttribute('style', `position: fixed; left: ${event.clientX}px; top: ${event.clientY}px`);
|
|
561
|
-
/* Pass to the menu the current object */
|
|
562
|
-
menuTrigger.menuData = { item: item };
|
|
563
|
-
/* Open the menu */
|
|
564
|
-
menuTrigger.openMenu();
|
|
565
|
-
/* Handle clicks on the menu overlay */
|
|
566
|
-
document.getElementsByClassName('cdk-overlay-container')[0]?.addEventListener('contextmenu', (offEvent) => {
|
|
567
|
-
offEvent.preventDefault();
|
|
568
|
-
menuTrigger.closeMenu();
|
|
569
|
-
}, { once: true });
|
|
570
|
-
}
|
|
571
|
-
}
|
|
572
|
-
/**
|
|
573
|
-
* Handles model changes
|
|
574
|
-
* @param column
|
|
575
|
-
* @param row
|
|
576
|
-
*/
|
|
577
|
-
handleModelChange(column, row, formGroup) {
|
|
578
|
-
if (typeof column?.event === 'function') {
|
|
579
|
-
column.event(row, formGroup, column.eventArgs ?? this.context);
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
/**
|
|
583
|
-
* Handles keydown enter of <input> and <vd-select>
|
|
584
|
-
* @param $event
|
|
585
|
-
*/
|
|
586
|
-
handleKeydownEnter($event) {
|
|
587
|
-
$event?.target?.blur();
|
|
588
|
-
return false;
|
|
589
|
-
}
|
|
590
|
-
/**
|
|
591
|
-
* Patches an entity
|
|
592
|
-
* @param row
|
|
593
|
-
* @param fieldName
|
|
594
|
-
* @param path
|
|
595
|
-
*/
|
|
596
|
-
patch(row, fields, value, includes) {
|
|
597
|
-
/* Get entity by ID */
|
|
598
|
-
let entity = this.dataSource.items?.filter((x) => x.id === row.id)[0];
|
|
599
|
-
if (entity) {
|
|
600
|
-
/* Build patch methods */
|
|
601
|
-
let patches = fields.map(x => { return { op: 'replace', path: `/${x}`, value: value != undefined ? value : entity[x] }; });
|
|
602
|
-
/* Send request */
|
|
603
|
-
this.dataSource.service
|
|
604
|
-
.patch(row.id, patches, null, { headers: { 'Show-Message': 'Yes' }, params: includes ? Utils.toHttpParams({ includes: includes }) : null })
|
|
605
|
-
.subscribe((_) => this.dataSource.reload());
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
/**
|
|
609
|
-
* Renders rows based on the table's latest set of data, which was either provided directly as an
|
|
610
|
-
* input or retrieved through an Observable stream (directly or from a DataSource).
|
|
611
|
-
* Checks for differences in the data since the last diff to perform only the necessary
|
|
612
|
-
* changes (add/remove/move rows).
|
|
613
|
-
*/
|
|
614
|
-
renderRows() {
|
|
615
|
-
this.table?.renderRows();
|
|
616
|
-
}
|
|
617
|
-
/**
|
|
618
|
-
* Handles a string function expression.
|
|
619
|
-
*
|
|
620
|
-
* This method processes an input expression that can either be a string or a function.
|
|
621
|
-
* If it's a function, it will be invoked with the provided item and context.
|
|
622
|
-
* If it's a string, it will be returned as-is.
|
|
623
|
-
*
|
|
624
|
-
* @param expression - The expression to handle, which can be a string or a function.
|
|
625
|
-
* @param item - The item to pass to the function if the expression is a function.
|
|
626
|
-
* @returns - The result of invoking the function with the item and context, or the string expression itself.
|
|
627
|
-
*/
|
|
628
|
-
handleExpression(expression, item) {
|
|
629
|
-
/* Check if the expression is falsy (e.g., null, undefined, or empty) */
|
|
630
|
-
if (!expression) {
|
|
631
|
-
return undefined;
|
|
632
|
-
}
|
|
633
|
-
/* If the expression is a function, call it with the item and context */
|
|
634
|
-
if (typeof expression === 'function') {
|
|
635
|
-
return expression(item, this.context);
|
|
636
|
-
}
|
|
637
|
-
/* If the expression is not a function, assume it's a string and return it */
|
|
638
|
-
return expression;
|
|
639
|
-
}
|
|
640
|
-
/**
|
|
641
|
-
* Sets a nested property value in an object based on a dot-separated path.
|
|
642
|
-
* @param row - The object in which the property is being set.
|
|
643
|
-
* @param propertyPath - A dot-separated string representing the path to the nested property.
|
|
644
|
-
* @param value - The value to set at the specified nested property.
|
|
645
|
-
*/
|
|
646
|
-
setNestedProperty(row, propertyPath, value) {
|
|
647
|
-
/* Split the propertyPath into an array of keys */
|
|
648
|
-
const keys = propertyPath.split('.');
|
|
649
|
-
/* Use slice to get all keys except the last one and reduce to traverse to the second-to-last level */
|
|
650
|
-
keys.slice(0, -1).reduce((acc, key) => acc && acc[key], row)[keys[keys.length - 1]] = value;
|
|
651
|
-
}
|
|
652
|
-
/**
|
|
653
|
-
* Gets row classes
|
|
654
|
-
* @param column
|
|
655
|
-
* @param row
|
|
656
|
-
* @returns
|
|
657
|
-
*/
|
|
658
|
-
getRowClasses(column, row) {
|
|
659
|
-
return Object.assign({
|
|
660
|
-
'gt-xs': column.display == Grid.Xs,
|
|
661
|
-
'gt-sm': column.display == Grid.Sm,
|
|
662
|
-
'gt-md': column.display == Grid.Md,
|
|
663
|
-
'gt-lg': column.display == Grid.Lg,
|
|
664
|
-
'gt-xl': column.display == Grid.Xl,
|
|
665
|
-
'gt-xxl': column.display == Grid.Xxl,
|
|
666
|
-
'hidden': column.display == Grid.None,
|
|
667
|
-
'text-right': column.arrowBefore
|
|
668
|
-
}, column.cellNgClass ? column.cellNgClass(row, this.context) : {});
|
|
669
|
-
}
|
|
670
|
-
/**
|
|
671
|
-
* Log to console
|
|
672
|
-
* @param message
|
|
673
|
-
* @param optionalParams
|
|
674
|
-
*/
|
|
675
|
-
log(message, ...optionalParams) {
|
|
676
|
-
console.log(message, optionalParams);
|
|
677
|
-
}
|
|
678
|
-
/*
|
|
679
|
-
* Terminates the dragging action by resetting the `isDragging` flag after a brief delay.
|
|
680
|
-
* If the `scrollContainer` is defined, it also removes the 'grabbing' class
|
|
681
|
-
* from the container element, which reverts the cursor back to its default state.
|
|
682
|
-
* This ensures that the visual feedback (grabbing cursor) is only active during
|
|
683
|
-
* the drag operation and is properly removed when the user stops interacting.
|
|
684
|
-
*/
|
|
685
|
-
stopDragging(event) {
|
|
686
|
-
/* Reset dragging state to stop the scroll interaction */
|
|
687
|
-
this.startDragging = false;
|
|
688
|
-
/*
|
|
689
|
-
* Introduce a slight delay before resetting the dragging state.
|
|
690
|
-
* This allows for smoother transitions and ensures that any final scroll adjustments
|
|
691
|
-
* are applied before marking the dragging operation as complete.
|
|
692
|
-
*/
|
|
693
|
-
setTimeout(() => {
|
|
694
|
-
/* Reset dragging state to stop the scroll interaction */
|
|
695
|
-
this.isDragging = false;
|
|
696
|
-
/* Restore the default cursor */
|
|
697
|
-
if (this.scrollContainer) {
|
|
698
|
-
this.scrollContainer.nativeElement.classList.remove('grabbing');
|
|
699
|
-
}
|
|
700
|
-
}, 200);
|
|
701
|
-
}
|
|
702
|
-
/**
|
|
703
|
-
* A callback method that is invoked immediately after the
|
|
704
|
-
* default change detector has completed one change-check cycle
|
|
705
|
-
* for a component's view.
|
|
706
|
-
*/
|
|
707
|
-
ngAfterViewChecked() {
|
|
708
|
-
this.changeDetector.detectChanges();
|
|
709
|
-
}
|
|
710
|
-
/** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: VdDynamicTableComponent, deps: [{ token: i1.DynamicBuilder }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
711
|
-
/** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.7", type: VdDynamicTableComponent, selector: "vd-dynamic-table", inputs: { dataSource: "dataSource", data: "data", formArray: "formArray", debugValue: "debugValue", classType: "classType", context: "context", dataSourceFilter: "dataSourceFilter", static: "static", filterable: "filterable", sticky: "sticky", tableWidth: "tableWidth", useFilterOperator: "useFilterOperator", paginable: "paginable", selectable: "selectable", sortActive: "sortActive", sortDirection: "sortDirection", stickyHeader: "stickyHeader", stickyFilter: "stickyFilter", columnSets: "columnSets", rowNgClass: "rowNgClass", detailsTemplate: "detailsTemplate", readonly: "readonly", selectAllFilter: "selectAllFilter", columns: "columns", rowMenuItems: "rowMenuItems", rowAction: "rowAction", excludedColumns: "excludedColumns", pageSize: "pageSize", pageSizeOptions: "pageSizeOptions" }, outputs: { rowClick: "rowClick" }, queries: [{ propertyName: "templateRef", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "table", first: true, predicate: ["table"], descendants: true }, { propertyName: "matSort", first: true, predicate: MatSort, descendants: true, static: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true, static: true }, { propertyName: "detailsTemplateRef", predicate: ["detailsTemplate"], descendants: true, read: ViewContainerRef }, { propertyName: "rowContextMenuTriggers", predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<div class=\"loading-progress\" *ngIf=\"!static\">\r\n\t<mat-progress-bar mode=\"indeterminate\" *ngIf=\"dataSource?.isLoading\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- #region Data table -->\r\n<div class=\"mat-table-container scrollbar-secondary\" [ngClass]=\"{'mat-table-sticky': sticky}\" #scrollContainer>\r\n\t<table mat-table #table [dataSource]=\"dataSource\" [dataSourceFilter]=\"dataSourceFilter\" [ngClass]=\"{'table-fixed': !sticky && !detailsTemplate && !templateRef, 'table-stick': sticky}\" [trackBy]=\"trackBy\" matSort matSortDisableClear [matSortActive]=\"sortActive||'id'\" [matSortDirection]=\"sortDirection\" multiTemplateDataRows>\r\n\t\t<ng-container *ngFor=\"let column of columns$ | async; trackBy:columnsTrackBy\">\r\n\t\t\t<!-- #region Column def -->\r\n\t\t\t<ng-container [cdkColumnDef]=\"column.name\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t\t<ng-template #header [ngTemplateOutlet]=\"header\" let-headerText=\"headerText\" [ngTemplateOutletContext]=\"{headerText: column.header | func:context}\">\r\n\t\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [mat-sort-header]=\"column.sortBy || column.name\" [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [disabled]=\"column.type == ColumnType.Checkbox || column.disabled\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\" [arrowPosition]=\"column.arrowBefore?'before':'after'\">\r\n\t\t\t\t\t\t<mat-checkbox *ngIf=\"column.type == ColumnType.Checkbox\" (change)=\"$event ? dataSource.toggleSelect($event, selectAllFilter) : null\" [disabled]=\"!dataSource.paginator?.length\" [checked]=\"dataSource.selectionModel.hasValue() && dataSource.isAllSelected()\" [indeterminate]=\"dataSource.selectionModel.hasValue() && !dataSource.isAllSelected()\"></mat-checkbox>\r\n\t\t\t\t\t\t<span *ngIf=\"column.type != ColumnType.Checkbox\" [matTooltip]=\"headerText\">{{headerText}}</span>\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</ng-template>\r\n\t\t\t\t<td mat-cell *cdkCellDef=\"let row; let rowIndex = dataIndex\" [matTooltip]=\"column.tooltip?column.tooltip(row, undefined, context):null\" [matTooltipClass]=\"column.tooltipClass??''\" [hidden]=\"column.hidden\" [ngClass]=\"getRowClasses(column, row)\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\">\r\n\t\t\t\t\t<ng-template #rowVal [ngTemplateOutlet]=\"rowVal\" let-rowValue [ngTemplateOutletContext]=\"{$implicit: column?.content && column?.content(row, undefined, context)}\">\r\n\t\t\t\t\t\t<ng-container [ngSwitch]=\"column.type\">\r\n\t\t\t\t\t\t\t<!-- #region Checkbox column -->\r\n\t\t\t\t\t\t\t<mat-checkbox *ngSwitchCase=\"ColumnType.Checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"$event ? dataSource.selectionModel.toggle(row) : null\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [checked]=\"dataSource.selectionModel.isSelected(row)\"></mat-checkbox>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Enum column -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Enum\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.enumMetadata; else noEnumMetadata\">\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t\t<ng-container *ngFor=\"let item of rowValue; let i = index\">\r\n\t\t\t\t\t\t\t\t\t\t\t<ng-template [ngIf]=\"i < 2\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<ng-template let-displayValue=\"displayValue\" [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ displayValue: column.enumMetadata[item].display }\"></ng-template>\r\n\t\t\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i === 1 && rowValue?.length > 2\" [matTooltip]=\"(rowValue | slice:2 | map:column.enumMetadata | map:'display') | join:'\\n'\" matTooltipClass=\"mat-tooltip-multiline\">...</small>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t\t<ng-template #template let-displayValue=\"displayValue\">\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-chip-row disableRipple=\"true\" selectable=\"false\" [matTooltip]=\"displayValue\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ displayValue }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</mat-chip-row>\r\n\t\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" class=\"na\" [innerHtml]=\"(column.enumMetadata[rowValue]||{}).display\"></span>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #noEnumMetadata>\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t\t<div *ngFor=\"let item of rowValue; let i = index; let last = last\">\r\n\t\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i<2\" i18n=\"@@selection\">{item | enum:column.enumType:column.enumPrefix, select, type {type} other {{{item | enum:column.enumType:column.enumPrefix}}}}</small><small *ngIf=\"i==1 && rowValue?.length > 2\">, ...</small>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" i18n=\"@@selection\">{rowValue | enum:column.enumType:column.enumPrefix, select, type {type} other {{{rowValue | enum:column.enumType:column.enumPrefix}}}}</span>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<ng-template #recursiveContainer let-columnNameSegments=\"segments\" let-formGroup=\"formGroup\" let-parentFormGroup=\"parentFormGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formGroup\" [formGroup]=\"formGroup\">\r\n\t\t\t\t\t\t\t\t\t<!-- If the columnNameSegments array is empty, we're at the leaf node -->\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!columnNameSegments.length; else notLastSegment\">\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-slide-toggle [formControl]=\"formGroup\" (click)=\"$event.stopPropagation();\" (change)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):handleModelChange(column, parentFormGroup.value, parentFormGroup)\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.TextInput\" appearance=\"outline\" subscriptSizing=\"dynamic\" dense-3 layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input matInput [formControl]=\"formGroup\" type=\"{{column.inputType}}\" autocomplete=\"none\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" [min]=\"column.inputMin?column.inputMin(parentFormGroup.value, parentFormGroup, context):null\" [max]=\"column.inputMax?column.inputMax(parentFormGroup.value, parentFormGroup, context):null\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.Select\" appearance=\"outline\" subscriptSizing=\"dynamic\" dense-3 layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t\t<vd-select [formControl]=\"formGroup\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:parentFormGroup.value:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" (selectionChange)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):patch(parentFormGroup.value, [column.name], rowValue, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #notLastSegment>\r\n\t\t\t\t\t\t\t\t\t\t<!-- If not the last segment, create a nested form group -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container [formGroupName]=\"columnNameSegments[0]\">\r\n\t\t\t\t\t\t\t\t\t\t\t<!-- Recursive call to handle nested segments -->\r\n\t\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: columnNameSegments.slice(1), parentFormGroup:formGroup, formGroup: formGroup.get(columnNameSegments[0])}\"></ng-container>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\r\n\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!formArray\">\r\n\t\t\t\t\t\t\t\t\t<mat-slide-toggle [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);handleModelChange(column, row, undefined);\" (click)=\"$event.stopPropagation();\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Date column -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Date\">{{rowValue | date:column.shortDate?'dd.MM.yyyy':'dd.MM.yyyy HH:mm:ss'}}</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.TextInput\">\r\n\t\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" subscriptSizing=\"dynamic\" dense-3 (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t<input matInput *ngIf=\"!formArray\" type=\"{{column.inputType}}\" autocomplete=\"none\" name=\"{{column.name}}{{rowIndex}}\" [ngModel]=\"row | property:column.name\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [min]=\"column.inputMin?column.inputMin(row, undefined, context):null\" [max]=\"column.inputMax?column.inputMax(row, undefined, context):null\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);(column.change?column.change(row, undefined, context):patch(row, [column.name], $event, column.patchIncludes));\" [ngModelOptions]=\"{updateOn: 'blur'}\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Select\">\r\n\t\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" subscriptSizing=\"dynamic\" dense-3 (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t<vd-select *ngIf=\"!formArray\" name=\"{{column.name}}{{rowIndex}}\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column?.enumFilter | func:row:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" (change)=\"column.change?column.change(row, undefined, context):patch(row, [column.name], $event.value, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Action -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Action\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t\t<div id=\"menu-{{row.id}}\" style=\"visibility: hidden; position: fixed;\" #contextMenuTrigger=\"matMenuTrigger\" [matMenuTriggerFor]=\"menu.matMenu!\" *ngIf=\"menu?.matMenu && !row.locked && hasVisibleRowMenuItems(row, column)\"></div>\r\n\t\t\t\t\t\t\t\t\t<vd-dynamic-menu [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\" #menu></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Menu -->\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t<vd-dynamic-menu *ngSwitchCase=\"ColumnType.Menu\" [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\"></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region icon -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Icon\" layout=\"row\" layout-align=\"start center\">\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.matIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\">{{handleExpression(column.icon?.matIcon!, row)}}</mat-icon>\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.svgIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [svgIcon]=\"handleExpression(column.icon?.svgIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.fontIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [fontIcon]=\"handleExpression(column.icon?.fontIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region icon button -->\r\n\t\t\t\t\t\t\t<a mat-icon-button *ngSwitchCase=\"ColumnType.IconButton\" (click)=\"$event.stopPropagation();column.iconButton?.event?column.iconButton?.event(row, context):null\">\r\n\t\t\t\t\t\t\t\t<mat-icon fontSet=\"{{column.iconButton?.iconFontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.iconButton?.iconClass??'', row)\">{{handleExpression(column.iconButton?.icon??'radio_button_checked', row) || 'radio_button_checked'}}</mat-icon>\r\n\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Other column types -->\r\n\t\t\t\t\t\t\t<span *ngSwitchDefault [innerHtml]=\"rowValue??''\"></span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t</td>\r\n\t\t\t</ng-container>\r\n\t\t\t<!-- #endregion -->\r\n\t\t</ng-container>\r\n\r\n\t\t<!-- #region Filter row -->\r\n\t\t<ng-container *ngIf=\"dataSource && filterable\">\r\n\t\t\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t\t\t<ng-container cdkColumnDef=\"filter.{{column.filter || column.name}}\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\">\r\n\t\t\t\t\t\t<!-- #region Select filter -->\r\n\t\t\t\t\t\t<span *ngIf=\"(column.endpoint || column.enumType || column.options) else notSelectFilter\" filter-select [endpoint]=\"column.endpoint\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:{}:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [text]=\"column.filterOptionText || 'name'\"></span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Text filter -->\r\n\t\t\t\t\t\t<ng-template #notSelectFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"notSelectFilter && (column.type == ColumnType.Text || column.type == ColumnType.TextInput || column.type == ColumnType.Number) else notInputFilter\" filter-input [onlyNumber]=\"column.filterInputNumber??false\" [operator]=\"!useFilterOperator ? undefined : column.filterOperator\"></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Date filter -->\r\n\t\t\t\t\t\t<ng-template #notInputFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Date else notDateFilter\" filter-date></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Action filter (clear) -->\r\n\t\t\t\t\t\t<ng-template #notDateFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Action\" filter-clear></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</ng-container>\r\n\t\t\t</ng-container>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region Details column -->\r\n\t\t<ng-container cdkColumnDef=\"expandedDetail\">\r\n\t\t\t<td mat-cell *matCellDef=\"let row; let index = index\" [attr.colspan]=\"(displayedColumns$ | async)?.length\">\r\n\t\t\t\t<div class=\"row-detail\" [@detailExpand]=\"row == expandedRow ? 'expanded' : 'collapsed'\" #detailsTemplate>\r\n\t\t\t\t\t<ng-container *ngIf=\"templateRef && row === expandedRow\">\r\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRef; context:{row: row, index: index, context: context}\"></ng-container>\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t</div>\r\n\t\t\t</td>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region Filter header -->\r\n\t\t<ng-container *ngIf=\"filterable\">\r\n\t\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedFilterColumns$ | async\"></tr>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedColumns$ | async; sticky: stickyFilter\"></tr>\r\n\t\t<tr mat-row *cdkRowDef=\"let row; columns: displayedColumns$ | async; let index = dataIndex\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\" [class.expanded-row]=\"expandedRow === row\" (click)=\"handleRowClick(index, row)\" (contextmenu)=\"handleRowRightClick($event, row)\"></tr>\r\n\r\n\t\t<!-- #region Detrails row -->\r\n\t\t<ng-container *ngIf=\"detailsTemplate || templateRef\">\r\n\t\t\t<tr mat-row *cdkRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\"></tr>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\t</table>\r\n</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Row shown when there is no matching data.-->\r\n<div class=\"mat-cell pad table-empty txt-italic\" *ngIf=\"!dataSource?.filteredData?.length && !dataSource?.total\" i18n=\"@@noResultsFound\">No results were found.</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Debug value -->\r\n<code *ngIf=\"debugValue\">\r\n\t<pre>{{formValue | json}}</pre>\r\n</code>\r\n<!-- #endregion -->\r\n\r\n<div class=\"table-footer\" layout=\"row\">\r\n\t<ng-content select=\"[table-footer]\"></ng-content>\r\n\t<span flex></span>\r\n\t<mat-paginator *ngIf=\"paginable\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons=\"true\"></mat-paginator>\r\n</div>", styles: ["::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-form-field .mat-form-field-wrapper{width:100%}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip{height:24px;margin-top:2px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip .mdc-evolution-chip__action--primary{padding-left:9px;padding-right:9px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip:last-child{margin-bottom:2px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip *{font-size:.8rem}@media (max-width: 389px){::ng-deep .mat-mdc-table [gt-xs],::ng-deep .mat-mdc-table .gt-xs{display:none}::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 599px){::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 959px){::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1279px){::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1919px){::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1979px){::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}.mat-table-container{width:100%;max-width:100%;overflow:auto}.mat-table-container .mat-mdc-header-cell,.mat-table-container .mat-mdc-footer-cell,.mat-table-container .mat-mdc-cell{min-width:80px;box-sizing:border-box}.mat-table-container .mat-mdc-header-row,.mat-table-container .mat-mdc-footer-row,.mat-table-container .mat-mdc-row{min-width:1920px}.mat-table-container.mat-table-sticky .mat-mdc-table-sticky-border-elem-right{box-shadow:-3px 0 5px #0000001a}.mat-table-container.mat-table-sticky .mat-mdc-table-sticky-border-elem-left{box-shadow:3px 0 5px #0000001a}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i3.VdDynamicMenuComponent, selector: "vd-dynamic-menu", inputs: ["items", "data", "index", "context", "contextMenu"] }, { kind: "directive", type: i4.DisableControlDirective, selector: "[disableControl]", inputs: ["disableControl"] }, { kind: "directive", type: i5.OnlyNumberDirective, selector: "[onlyNumber]", inputs: ["onlyNumber"] }, { kind: "component", type: i6.VdSelectComponent, selector: "vd-select", inputs: ["triggerCssClass", "triggerMode"] }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i7.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i7.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: i8.MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i12.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i12.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i12.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i12.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i12.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i12.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i13.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i13.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "directive", type: i14.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i14.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i14.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i14.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: i14.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i15.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "component", type: i16.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: i17.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i18.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "component", type: i19.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "directive", type: i20.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i21.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "component", type: i22.FilterInputComponent, selector: "mat-header-cell[filter-input], [mat-header-cell][filter-input], [filter-input]", inputs: ["field", "operator", "onlyNumber", "debounce", "placeholder"] }, { kind: "component", type: i23.FilterSelectComponent, selector: "mat-header-cell[filter-select], [mat-header-cell][filter-select], [filter-select]", inputs: ["endpoint", "params", "projection", "sortBy", "sorted", "enumFilter", "enum", "enumMetadata", "key", "text", "prefix", "multiple", "options", "filteredOptions", "filterable", "field", "placeholder", "cache"] }, { kind: "component", type: i24.FilterClearComponent, selector: "mat-header-cell[filter-clear], [mat-header-cell][filter-clear], [filter-clear]" }, { kind: "component", type: i25.FilterDateComponent, selector: "mat-header-cell[filter-date], [mat-header-cell][filter-date], [filter-date]", inputs: ["field", "debounce", "placeholder"] }, { kind: "directive", type: i26.DataSourceFilterDirective, selector: "[dataSourceFilter]", inputs: ["dataSource", "dataSourceFilter"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.JsonPipe, name: "json" }, { kind: "pipe", type: i2.SlicePipe, name: "slice" }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: i27.EnumPipe, name: "enum" }, { kind: "pipe", type: i28.FormGroupPipe, name: "formGroup" }, { kind: "pipe", type: i29.FuncPipe, name: "func" }, { kind: "pipe", type: i30.PropertyPipe, name: "property" }, { kind: "pipe", type: i31.JoinPipe, name: "join" }, { kind: "pipe", type: i32.MapPipe, name: "map" }], animations: [
|
|
712
|
-
trigger('detailExpand', [
|
|
713
|
-
state('collapsed', style({ height: '0px', minHeight: '0' })),
|
|
714
|
-
state('expanded', style({ height: AUTO_STYLE })),
|
|
715
|
-
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
|
|
716
|
-
]),
|
|
717
|
-
] });
|
|
718
|
-
}
|
|
719
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: VdDynamicTableComponent, decorators: [{
|
|
720
|
-
type: Component,
|
|
721
|
-
args: [{ selector: 'vd-dynamic-table', animations: [
|
|
722
|
-
trigger('detailExpand', [
|
|
723
|
-
state('collapsed', style({ height: '0px', minHeight: '0' })),
|
|
724
|
-
state('expanded', style({ height: AUTO_STYLE })),
|
|
725
|
-
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
|
|
726
|
-
]),
|
|
727
|
-
], template: "<div class=\"loading-progress\" *ngIf=\"!static\">\r\n\t<mat-progress-bar mode=\"indeterminate\" *ngIf=\"dataSource?.isLoading\"></mat-progress-bar>\r\n</div>\r\n\r\n<!-- #region Data table -->\r\n<div class=\"mat-table-container scrollbar-secondary\" [ngClass]=\"{'mat-table-sticky': sticky}\" #scrollContainer>\r\n\t<table mat-table #table [dataSource]=\"dataSource\" [dataSourceFilter]=\"dataSourceFilter\" [ngClass]=\"{'table-fixed': !sticky && !detailsTemplate && !templateRef, 'table-stick': sticky}\" [trackBy]=\"trackBy\" matSort matSortDisableClear [matSortActive]=\"sortActive||'id'\" [matSortDirection]=\"sortDirection\" multiTemplateDataRows>\r\n\t\t<ng-container *ngFor=\"let column of columns$ | async; trackBy:columnsTrackBy\">\r\n\t\t\t<!-- #region Column def -->\r\n\t\t\t<ng-container [cdkColumnDef]=\"column.name\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t\t<ng-template #header [ngTemplateOutlet]=\"header\" let-headerText=\"headerText\" [ngTemplateOutletContext]=\"{headerText: column.header | func:context}\">\r\n\t\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [mat-sort-header]=\"column.sortBy || column.name\" [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [disabled]=\"column.type == ColumnType.Checkbox || column.disabled\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\" [arrowPosition]=\"column.arrowBefore?'before':'after'\">\r\n\t\t\t\t\t\t<mat-checkbox *ngIf=\"column.type == ColumnType.Checkbox\" (change)=\"$event ? dataSource.toggleSelect($event, selectAllFilter) : null\" [disabled]=\"!dataSource.paginator?.length\" [checked]=\"dataSource.selectionModel.hasValue() && dataSource.isAllSelected()\" [indeterminate]=\"dataSource.selectionModel.hasValue() && !dataSource.isAllSelected()\"></mat-checkbox>\r\n\t\t\t\t\t\t<span *ngIf=\"column.type != ColumnType.Checkbox\" [matTooltip]=\"headerText\">{{headerText}}</span>\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</ng-template>\r\n\t\t\t\t<td mat-cell *cdkCellDef=\"let row; let rowIndex = dataIndex\" [matTooltip]=\"column.tooltip?column.tooltip(row, undefined, context):null\" [matTooltipClass]=\"column.tooltipClass??''\" [hidden]=\"column.hidden\" [ngClass]=\"getRowClasses(column, row)\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\">\r\n\t\t\t\t\t<ng-template #rowVal [ngTemplateOutlet]=\"rowVal\" let-rowValue [ngTemplateOutletContext]=\"{$implicit: column?.content && column?.content(row, undefined, context)}\">\r\n\t\t\t\t\t\t<ng-container [ngSwitch]=\"column.type\">\r\n\t\t\t\t\t\t\t<!-- #region Checkbox column -->\r\n\t\t\t\t\t\t\t<mat-checkbox *ngSwitchCase=\"ColumnType.Checkbox\" (click)=\"$event.stopPropagation()\" (change)=\"$event ? dataSource.selectionModel.toggle(row) : null\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [checked]=\"dataSource.selectionModel.isSelected(row)\"></mat-checkbox>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Enum column -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Enum\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.enumMetadata; else noEnumMetadata\">\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t\t<ng-container *ngFor=\"let item of rowValue; let i = index\">\r\n\t\t\t\t\t\t\t\t\t\t\t<ng-template [ngIf]=\"i < 2\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<ng-template let-displayValue=\"displayValue\" [ngTemplateOutlet]=\"template\" [ngTemplateOutletContext]=\"{ displayValue: column.enumMetadata[item].display }\"></ng-template>\r\n\t\t\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i === 1 && rowValue?.length > 2\" [matTooltip]=\"(rowValue | slice:2 | map:column.enumMetadata | map:'display') | join:'\\n'\" matTooltipClass=\"mat-tooltip-multiline\">...</small>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t\t<ng-template #template let-displayValue=\"displayValue\">\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-chip-row disableRipple=\"true\" selectable=\"false\" [matTooltip]=\"displayValue\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span>{{ displayValue }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</mat-chip-row>\r\n\t\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" class=\"na\" [innerHtml]=\"(column.enumMetadata[rowValue]||{}).display\"></span>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-template #noEnumMetadata>\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.multiple; else elseTemplate\">\r\n\t\t\t\t\t\t\t\t\t\t<div *ngFor=\"let item of rowValue; let i = index; let last = last\">\r\n\t\t\t\t\t\t\t\t\t\t\t<small *ngIf=\"i<2\" i18n=\"@@selection\">{item | enum:column.enumType:column.enumPrefix, select, type {type} other {{{item | enum:column.enumType:column.enumPrefix}}}}</small><small *ngIf=\"i==1 && rowValue?.length > 2\">, ...</small>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #elseTemplate>\r\n\t\t\t\t\t\t\t\t\t\t<span *ngIf=\"rowValue >= 0\" i18n=\"@@selection\">{rowValue | enum:column.enumType:column.enumPrefix, select, type {type} other {{{rowValue | enum:column.enumType:column.enumPrefix}}}}</span>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<ng-template #recursiveContainer let-columnNameSegments=\"segments\" let-formGroup=\"formGroup\" let-parentFormGroup=\"parentFormGroup\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formGroup\" [formGroup]=\"formGroup\">\r\n\t\t\t\t\t\t\t\t\t<!-- If the columnNameSegments array is empty, we're at the leaf node -->\r\n\t\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!columnNameSegments.length; else notLastSegment\">\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t\t\t\t<mat-slide-toggle [formControl]=\"formGroup\" (click)=\"$event.stopPropagation();\" (change)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):handleModelChange(column, parentFormGroup.value, parentFormGroup)\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.TextInput\" appearance=\"outline\" subscriptSizing=\"dynamic\" dense-3 layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t\t<input matInput [formControl]=\"formGroup\" type=\"{{column.inputType}}\" autocomplete=\"none\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" [min]=\"column.inputMin?column.inputMin(parentFormGroup.value, parentFormGroup, context):null\" [max]=\"column.inputMax?column.inputMax(parentFormGroup.value, parentFormGroup, context):null\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t\t\t\t<mat-form-field *ngSwitchCase=\"ColumnType.Select\" appearance=\"outline\" subscriptSizing=\"dynamic\" dense-3 layout=\"column\" layout-align=\"center start\" (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t\t\t<vd-select [formControl]=\"formGroup\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:parentFormGroup.value:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [disableControl]=\"readonly || (column.disabled || (column.disable && column.disable(parentFormGroup.value, parentFormGroup, context)))\" (selectionChange)=\"column.change?column.change(parentFormGroup.value, parentFormGroup, context):patch(parentFormGroup.value, [column.name], rowValue, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t<ng-template #notLastSegment>\r\n\t\t\t\t\t\t\t\t\t\t<!-- If not the last segment, create a nested form group -->\r\n\t\t\t\t\t\t\t\t\t\t<ng-container [formGroupName]=\"columnNameSegments[0]\">\r\n\t\t\t\t\t\t\t\t\t\t\t<!-- Recursive call to handle nested segments -->\r\n\t\t\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: columnNameSegments.slice(1), parentFormGroup:formGroup, formGroup: formGroup.get(columnNameSegments[0])}\"></ng-container>\r\n\t\t\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-template>\r\n\r\n\t\t\t\t\t\t\t<!-- #region Toggle column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Toggle\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"!formArray\">\r\n\t\t\t\t\t\t\t\t\t<mat-slide-toggle [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);handleModelChange(column, row, undefined);\" (click)=\"$event.stopPropagation();\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" color=\"accent\"></mat-slide-toggle>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Date column -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Date\">{{rowValue | date:column.shortDate?'dd.MM.yyyy':'dd.MM.yyyy HH:mm:ss'}}</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Text Input column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.TextInput\">\r\n\t\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" subscriptSizing=\"dynamic\" dense-3 (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t<input matInput *ngIf=\"!formArray\" type=\"{{column.inputType}}\" autocomplete=\"none\" name=\"{{column.name}}{{rowIndex}}\" [ngModel]=\"row | property:column.name\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" [min]=\"column.inputMin?column.inputMin(row, undefined, context):null\" [max]=\"column.inputMax?column.inputMax(row, undefined, context):null\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);(column.change?column.change(row, undefined, context):patch(row, [column.name], $event, column.patchIncludes));\" [ngModelOptions]=\"{updateOn: 'blur'}\" (keydown.enter)=\"handleKeydownEnter($event)\">\r\n\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region VD-Select column -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Select\">\r\n\t\t\t\t\t\t\t\t<mat-form-field *ngIf=\"!formArray\" appearance=\"outline\" layout=\"column\" layout-align=\"center start\" subscriptSizing=\"dynamic\" dense-3 (click)=\"$event.stopPropagation();\">\r\n\t\t\t\t\t\t\t\t\t<vd-select *ngIf=\"!formArray\" name=\"{{column.name}}{{rowIndex}}\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column?.enumFilter | func:row:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [defaultOption]=\"column.defaultOption??true\" [ngModel]=\"row | property:column.name\" (ngModelChange)=\"setNestedProperty(row, column.name, $event);\" [disabled]=\"readonly || (column.disabled || (column.disable && column.disable(row, undefined, context)))\" (change)=\"column.change?column.change(row, undefined, context):patch(row, [column.name], $event.value, column.patchIncludes)\" (keydown.enter)=\"handleKeydownEnter($event)\"></vd-select>\r\n\t\t\t\t\t\t\t\t</mat-form-field>\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"formArray\" [formGroup]=\"$any(formArray.controls)[rowIndex] | formGroup\">\r\n\t\t\t\t\t\t\t\t\t<ng-container [ngTemplateOutlet]=\"recursiveContainer\" [ngTemplateOutletContext]=\"{segments: column.name.split('.'), formGroup: formArray.controls[rowIndex]}\"></ng-container>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Action -->\r\n\t\t\t\t\t\t\t<ng-container *ngSwitchCase=\"ColumnType.Action\">\r\n\t\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t\t<div id=\"menu-{{row.id}}\" style=\"visibility: hidden; position: fixed;\" #contextMenuTrigger=\"matMenuTrigger\" [matMenuTriggerFor]=\"menu.matMenu!\" *ngIf=\"menu?.matMenu && !row.locked && hasVisibleRowMenuItems(row, column)\"></div>\r\n\t\t\t\t\t\t\t\t\t<vd-dynamic-menu [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\" #menu></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Menu -->\r\n\t\t\t\t\t\t\t<ng-container *ngIf=\"column.menu\">\r\n\t\t\t\t\t\t\t\t<vd-dynamic-menu *ngSwitchCase=\"ColumnType.Menu\" [items]=\"[column.menu]\" [data]=\"row\" [context]=\"context\"></vd-dynamic-menu>\r\n\t\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region icon -->\r\n\t\t\t\t\t\t\t<span *ngSwitchCase=\"ColumnType.Icon\" layout=\"row\" layout-align=\"start center\">\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.matIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\">{{handleExpression(column.icon?.matIcon!, row)}}</mat-icon>\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.svgIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [svgIcon]=\"handleExpression(column.icon?.svgIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t\t<mat-icon *ngIf=\"column.icon?.fontIcon\" fontSet=\"{{column.icon?.fontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.icon?.cssClass??'', row)\" [fontIcon]=\"handleExpression(column.icon?.fontIcon!, row)!\"></mat-icon>\r\n\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region icon button -->\r\n\t\t\t\t\t\t\t<a mat-icon-button *ngSwitchCase=\"ColumnType.IconButton\" (click)=\"$event.stopPropagation();column.iconButton?.event?column.iconButton?.event(row, context):null\">\r\n\t\t\t\t\t\t\t\t<mat-icon fontSet=\"{{column.iconButton?.iconFontSet || 'material-symbols-outlined'}}\" [class]=\"handleExpression(column.iconButton?.iconClass??'', row)\">{{handleExpression(column.iconButton?.icon??'radio_button_checked', row) || 'radio_button_checked'}}</mat-icon>\r\n\t\t\t\t\t\t\t</a>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t\t<!-- #region Other column types -->\r\n\t\t\t\t\t\t\t<span *ngSwitchDefault [innerHtml]=\"rowValue??''\"></span>\r\n\t\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t\t</ng-container>\r\n\t\t\t\t\t</ng-template>\r\n\t\t\t\t</td>\r\n\t\t\t</ng-container>\r\n\t\t\t<!-- #endregion -->\r\n\t\t</ng-container>\r\n\r\n\t\t<!-- #region Filter row -->\r\n\t\t<ng-container *ngIf=\"dataSource && filterable\">\r\n\t\t\t<ng-container *ngFor=\"let column of columns$ | async\">\r\n\t\t\t\t<ng-container cdkColumnDef=\"filter.{{column.filter || column.name}}\" [sticky]=\"column.sticky\" [stickyEnd]=\"column.stickyEnd\">\r\n\t\t\t\t\t<th mat-header-cell *cdkHeaderCellDef [hidden]=\"column.hidden\" [ngStyle]=\"{maxWidth:column.maxWidth?(column.maxWidth+(column.maxWidthUnit || 'px')):null,minWidth:column.minWidth?(column.minWidth+(column.minWidthUnit || 'px')):null,width:column.width?(column.width+(column.widthUnit || 'px')):null}\" [ngClass]=\"{'gt-xs': column.display == Grid.Xs, 'gt-sm': column.display == Grid.Sm, 'gt-md': column.display == Grid.Md, 'gt-lg': column.display == Grid.Lg, 'gt-xl': column.display == Grid.Xl, 'gt-xxl': column.display == Grid.Xxl, 'hidden': column.display == Grid.None}\">\r\n\t\t\t\t\t\t<!-- #region Select filter -->\r\n\t\t\t\t\t\t<span *ngIf=\"(column.endpoint || column.enumType || column.options) else notSelectFilter\" filter-select [endpoint]=\"column.endpoint\" [enum]=\"column.enumType\" [enumMetadata]=\"column.enumMetadata\" [enumFilter]=\"column.enumFilter | func:{}:context\" [prefix]=\"column.enumPrefix\" [options]=\"column.options\" [text]=\"column.filterOptionText || 'name'\"></span>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Text filter -->\r\n\t\t\t\t\t\t<ng-template #notSelectFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"notSelectFilter && (column.type == ColumnType.Text || column.type == ColumnType.TextInput || column.type == ColumnType.Number) else notInputFilter\" filter-input [onlyNumber]=\"column.filterInputNumber??false\" [operator]=\"!useFilterOperator ? undefined : column.filterOperator\"></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Date filter -->\r\n\t\t\t\t\t\t<ng-template #notInputFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Date else notDateFilter\" filter-date></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\r\n\t\t\t\t\t\t<!-- #region Action filter (clear) -->\r\n\t\t\t\t\t\t<ng-template #notDateFilter>\r\n\t\t\t\t\t\t\t<span *ngIf=\"column.type == ColumnType.Action\" filter-clear></span>\r\n\t\t\t\t\t\t</ng-template>\r\n\t\t\t\t\t\t<!-- #endregion -->\r\n\t\t\t\t\t</th>\r\n\t\t\t\t</ng-container>\r\n\t\t\t</ng-container>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region Details column -->\r\n\t\t<ng-container cdkColumnDef=\"expandedDetail\">\r\n\t\t\t<td mat-cell *matCellDef=\"let row; let index = index\" [attr.colspan]=\"(displayedColumns$ | async)?.length\">\r\n\t\t\t\t<div class=\"row-detail\" [@detailExpand]=\"row == expandedRow ? 'expanded' : 'collapsed'\" #detailsTemplate>\r\n\t\t\t\t\t<ng-container *ngIf=\"templateRef && row === expandedRow\">\r\n\t\t\t\t\t\t<ng-container *ngTemplateOutlet=\"templateRef; context:{row: row, index: index, context: context}\"></ng-container>\r\n\t\t\t\t\t</ng-container>\r\n\t\t\t\t</div>\r\n\t\t\t</td>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<!-- #region Filter header -->\r\n\t\t<ng-container *ngIf=\"filterable\">\r\n\t\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedFilterColumns$ | async\"></tr>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\r\n\t\t<tr mat-header-row *cdkHeaderRowDef=\"displayedColumns$ | async; sticky: stickyFilter\"></tr>\r\n\t\t<tr mat-row *cdkRowDef=\"let row; columns: displayedColumns$ | async; let index = dataIndex\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\" [class.expanded-row]=\"expandedRow === row\" (click)=\"handleRowClick(index, row)\" (contextmenu)=\"handleRowRightClick($event, row)\"></tr>\r\n\r\n\t\t<!-- #region Detrails row -->\r\n\t\t<ng-container *ngIf=\"detailsTemplate || templateRef\">\r\n\t\t\t<tr mat-row *cdkRowDef=\"let row; columns: ['expandedDetail']\" class=\"detail-row\" [ngClass]=\"rowNgClass?rowNgClass(row, context):null\"></tr>\r\n\t\t</ng-container>\r\n\t\t<!-- #endregion -->\r\n\t</table>\r\n</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Row shown when there is no matching data.-->\r\n<div class=\"mat-cell pad table-empty txt-italic\" *ngIf=\"!dataSource?.filteredData?.length && !dataSource?.total\" i18n=\"@@noResultsFound\">No results were found.</div>\r\n<!-- #endregion -->\r\n\r\n<!-- #region Debug value -->\r\n<code *ngIf=\"debugValue\">\r\n\t<pre>{{formValue | json}}</pre>\r\n</code>\r\n<!-- #endregion -->\r\n\r\n<div class=\"table-footer\" layout=\"row\">\r\n\t<ng-content select=\"[table-footer]\"></ng-content>\r\n\t<span flex></span>\r\n\t<mat-paginator *ngIf=\"paginable\" [pageSize]=\"pageSize\" [pageSizeOptions]=\"pageSizeOptions\" showFirstLastButtons=\"true\"></mat-paginator>\r\n</div>", styles: ["::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-form-field .mat-form-field-wrapper{width:100%}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip{height:24px;margin-top:2px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip .mdc-evolution-chip__action--primary{padding-left:9px;padding-right:9px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip:last-child{margin-bottom:2px}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip span{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}::ng-deep .mat-mdc-table .mat-mdc-row .mat-mdc-cell .mat-mdc-chip *{font-size:.8rem}@media (max-width: 389px){::ng-deep .mat-mdc-table [gt-xs],::ng-deep .mat-mdc-table .gt-xs{display:none}::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 599px){::ng-deep .mat-mdc-table [gt-sm],::ng-deep .mat-mdc-table .gt-sm{display:none}::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 959px){::ng-deep .mat-mdc-table [gt-md],::ng-deep .mat-mdc-table .gt-md{display:none}::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1279px){::ng-deep .mat-mdc-table [gt-lg],::ng-deep .mat-mdc-table .gt-lg{display:none}::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1919px){::ng-deep .mat-mdc-table [gt-xl],::ng-deep .mat-mdc-table .gt-xl{display:none}::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}@media (max-width: 1979px){::ng-deep .mat-mdc-table [gt-xxl],::ng-deep .mat-mdc-table .gt-xxl{display:none}}.mat-table-container{width:100%;max-width:100%;overflow:auto}.mat-table-container .mat-mdc-header-cell,.mat-table-container .mat-mdc-footer-cell,.mat-table-container .mat-mdc-cell{min-width:80px;box-sizing:border-box}.mat-table-container .mat-mdc-header-row,.mat-table-container .mat-mdc-footer-row,.mat-table-container .mat-mdc-row{min-width:1920px}.mat-table-container.mat-table-sticky .mat-mdc-table-sticky-border-elem-right{box-shadow:-3px 0 5px #0000001a}.mat-table-container.mat-table-sticky .mat-mdc-table-sticky-border-elem-left{box-shadow:3px 0 5px #0000001a}\n"] }]
|
|
728
|
-
}], ctorParameters: () => [{ type: i1.DynamicBuilder }, { type: i0.ChangeDetectorRef }], propDecorators: { table: [{
|
|
729
|
-
type: ViewChild,
|
|
730
|
-
args: ['table']
|
|
731
|
-
}], detailsTemplateRef: [{
|
|
732
|
-
type: ViewChildren,
|
|
733
|
-
args: ['detailsTemplate', { read: ViewContainerRef }]
|
|
734
|
-
}], templateRef: [{
|
|
735
|
-
type: ContentChild,
|
|
736
|
-
args: [TemplateRef]
|
|
737
|
-
}], dataSource: [{
|
|
738
|
-
type: Input
|
|
739
|
-
}], data: [{
|
|
740
|
-
type: Input
|
|
741
|
-
}], formArray: [{
|
|
742
|
-
type: Input
|
|
743
|
-
}], debugValue: [{
|
|
744
|
-
type: Input
|
|
745
|
-
}], classType: [{
|
|
746
|
-
type: Input
|
|
747
|
-
}], context: [{
|
|
748
|
-
type: Input
|
|
749
|
-
}], dataSourceFilter: [{
|
|
750
|
-
type: Input
|
|
751
|
-
}], static: [{
|
|
752
|
-
type: Input
|
|
753
|
-
}], filterable: [{
|
|
754
|
-
type: Input
|
|
755
|
-
}], sticky: [{
|
|
756
|
-
type: Input
|
|
757
|
-
}], tableWidth: [{
|
|
758
|
-
type: Input
|
|
759
|
-
}], useFilterOperator: [{
|
|
760
|
-
type: Input
|
|
761
|
-
}], paginable: [{
|
|
762
|
-
type: Input
|
|
763
|
-
}], selectable: [{
|
|
764
|
-
type: Input
|
|
765
|
-
}], sortActive: [{
|
|
766
|
-
type: Input
|
|
767
|
-
}], sortDirection: [{
|
|
768
|
-
type: Input
|
|
769
|
-
}], stickyHeader: [{
|
|
770
|
-
type: Input
|
|
771
|
-
}], stickyFilter: [{
|
|
772
|
-
type: Input
|
|
773
|
-
}], columnSets: [{
|
|
774
|
-
type: Input
|
|
775
|
-
}], rowClick: [{
|
|
776
|
-
type: Output
|
|
777
|
-
}], rowNgClass: [{
|
|
778
|
-
type: Input
|
|
779
|
-
}], detailsTemplate: [{
|
|
780
|
-
type: Input
|
|
781
|
-
}], readonly: [{
|
|
782
|
-
type: Input
|
|
783
|
-
}], selectAllFilter: [{
|
|
784
|
-
type: Input
|
|
785
|
-
}], matSort: [{
|
|
786
|
-
type: ViewChild,
|
|
787
|
-
args: [MatSort, { static: true }]
|
|
788
|
-
}], paginator: [{
|
|
789
|
-
type: ViewChild,
|
|
790
|
-
args: [MatPaginator]
|
|
791
|
-
}], columns: [{
|
|
792
|
-
type: Input
|
|
793
|
-
}], rowMenuItems: [{
|
|
794
|
-
type: Input
|
|
795
|
-
}], rowAction: [{
|
|
796
|
-
type: Input
|
|
797
|
-
}], excludedColumns: [{
|
|
798
|
-
type: Input
|
|
799
|
-
}], rowContextMenuTriggers: [{
|
|
800
|
-
type: ViewChildren,
|
|
801
|
-
args: [MatMenuTrigger]
|
|
802
|
-
}], pageSize: [{
|
|
803
|
-
type: Input
|
|
804
|
-
}], pageSizeOptions: [{
|
|
805
|
-
type: Input
|
|
806
|
-
}], scrollContainer: [{
|
|
807
|
-
type: ViewChild,
|
|
808
|
-
args: ['scrollContainer', { static: true }]
|
|
809
|
-
}] } });
|
|
810
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZGsvc3JjL2xpYi90YWJsZS9jb21wb25lbnRzL2R5bmFtaWMtdGFibGUvZHluYW1pYy10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM3RixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RCxPQUFPLEVBQW9CLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVqTixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQWlCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUNB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LEtBQUs7Z0JBU0MsZUFBZTtzQkFEckIsU0FBUzt1QkFBQyxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBBVVRPX1NUWUxFLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcclxuaW1wb3J0IHsgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHsgQWZ0ZXJWaWV3Q2hlY2tlZCwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4sIFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUFycmF5LCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IE1hdE1lbnVUcmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFNvcnQsIFNvcnREaXJlY3Rpb24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcclxuaW1wb3J0IHsgTWF0VGFibGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vZnVuY3Rpb25zL3V0aWxzJztcclxuaW1wb3J0IHsgRHluYW1pY0J1aWxkZXIgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vaGVscGVycy9keW5hbWljLWJ1aWxkZXInO1xyXG5pbXBvcnQgeyBBY3Rpb25JdGVtIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL21vZGVscy9hY3Rpb24taXRlbSc7XHJcbmltcG9ydCB7IEdyaWQgfSBmcm9tICcuLi8uLi9lbnVtcy9ncmlkJztcclxuaW1wb3J0IHsgVGFibGVDb2x1bW5UeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvdGFibGUtY29sdW1uLXR5cGUnO1xyXG5pbXBvcnQgeyBnZXRUYWJsZURlZmluaXRpb24gfSBmcm9tICcuLi8uLi9mdW5jdGlvbnMvZnVuY3Rpb25zJztcclxuaW1wb3J0IHsgVGFibGVDb2x1bW4gfSBmcm9tICcuLi8uLi9tb2RlbHMvdGFibGUtY29sdW1uJztcclxuaW1wb3J0IHsgVGFibGVEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vdGFibGUuZGF0YS1zb3VyY2UnO1xyXG5pbXBvcnQgeyBUYWJsZVN0YXRpY0RhdGFTb3VyY2UgfSBmcm9tICcuLi8uLi90YWJsZS5zdGF0aWMtZGF0YS1zb3VyY2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcblx0c2VsZWN0b3I6ICd2ZC1keW5hbWljLXRhYmxlJyxcclxuXHR0ZW1wbGF0ZVVybDogJ2R5bmFtaWMtdGFibGUuY29tcG9uZW50Lmh0bWwnLFxyXG5cdHN0eWxlVXJsczogWydkeW5hbWljLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcblx0YW5pbWF0aW9uczogW1xyXG5cdFx0dHJpZ2dlcignZGV0YWlsRXhwYW5kJywgW1xyXG5cdFx0XHRzdGF0ZSgnY29sbGFwc2VkJywgc3R5bGUoeyBoZWlnaHQ6ICcwcHgnLCBtaW5IZWlnaHQ6ICcwJyB9KSksXHJcblx0XHRcdHN0YXRlKCdleHBhbmRlZCcsIHN0eWxlKHsgaGVpZ2h0OiBBVVRPX1NUWUxFIH0pKSxcclxuXHRcdFx0dHJhbnNpdGlvbignZXhwYW5kZWQgPD0+IGNvbGxhcHNlZCcsIGFuaW1hdGUoJzIyNW1zIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKScpKSxcclxuXHRcdF0pLFxyXG5cdF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBWZER5bmFtaWNUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIHRoZSB0YWJsZSBjb21wb25lbnQsIHVzZWQgZm9yIGFjY2Vzc2luZyBNYXRUYWJsZSBmdW5jdGlvbmFsaXRpZXMuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZCgndGFibGUnKVxyXG5cdHB1YmxpYyB0YWJsZT86IE1hdFRhYmxlPGFueT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZXMgdG8gdGhlIGNvbnRhaW5lciBlbGVtZW50cyBmb3IgZGV0YWlsIHRlbXBsYXRlcywgd2l0aCBWaWV3Q29udGFpbmVyUmVmIFxyXG5cdCAqIGFsbG93aW5nIGR5bmFtaWMgaW5zZXJ0aW9uIG9mIHZpZXdzLlxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGRyZW4oJ2RldGFpbHNUZW1wbGF0ZScsIHsgcmVhZDogVmlld0NvbnRhaW5lclJlZiB9KVxyXG5cdHB1YmxpYyBkZXRhaWxzVGVtcGxhdGVSZWY/OiBRdWVyeUxpc3Q8YW55PjtcclxuXHJcblx0LyoqXHJcblx0ICogUmVmZXJlbmNlIHRvIGEgY29udGVudCBjaGlsZCB0ZW1wbGF0ZSAoZGV0YWlscyB0ZW1wbGF0ZSkgb2YgdHlwZSBUZW1wbGF0ZVJlZiwgXHJcblx0ICogdXNlZCBmb3IgcmVuZGVyaW5nIGN1c3RvbSB0ZW1wbGF0ZXMgaW4gdGhlIHRhYmxlLlxyXG5cdCAqL1xyXG5cdEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpXHJcblx0cHVibGljIHRlbXBsYXRlUmVmPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcblx0LyoqXHJcblx0ICogRGF0YSBzb3VyY2UgZm9yIHRoZSB0YWJsZSwgd2hpY2ggY2FuIGVpdGhlciBiZSBhIGN1c3RvbSBUYWJsZURhdGFTb3VyY2UgXHJcblx0ICogaW1wbGVtZW50YXRpb24gb3IgYSBkeW5hbWljIG9iamVjdC5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkYXRhU291cmNlOiBUYWJsZURhdGFTb3VyY2U8YW55LCBhbnk+IHwgYW55O1xyXG5cclxuXHQvKipcclxuXHQgKiBJbnB1dCBkYXRhIGZvciB0aGUgdGFibGUsIHdoaWNoIGlzIHNldCBhcyBhIHN0YXRpYyBkYXRhIHNvdXJjZS5cclxuXHQgKiBUaGlzIG1ldGhvZCBhbHNvIGluaXRpYWxpemVzIHNvcnRpbmcgYW5kIHBhZ2luYXRpb24gZm9yIHRoZSB0YWJsZS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzZXQgZGF0YShkYXRhOiBhbnkpIHtcclxuXHRcdHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBUYWJsZVN0YXRpY0RhdGFTb3VyY2UoZGF0YSk7XHJcblx0XHR0aGlzLmRhdGFTb3VyY2Uuc29ydCA9IHRoaXMubWF0U29ydDtcclxuXHRcdHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSB0aGlzLl9wYWdpbmF0b3I7XHJcblx0XHR0aGlzLnBhZ2luYWJsZSA9IHRydWU7XHJcblx0XHR0aGlzLnN0YXRpYyA9IHRydWU7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZWFjdGl2ZSBGb3JtQXJyYXkgcmVwcmVzZW50aW5nIHRoZSBmb3JtIGRhdGEsIHdoaWNoIGlzIHVzZWQgdG8gdHJhY2sgXHJcblx0ICogZm9ybSBjb250cm9scyBhbmQgc3luY2hyb25pemUgdGFibGUgZGF0YSB3aXRoIGZvcm0gY2hhbmdlcy5cclxuXHQgKi9cclxuXHRwdWJsaWMgX2Zvcm1BcnJheT86IEZvcm1BcnJheTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgRm9ybUFycmF5IGZvciBtYW5hZ2luZyBmb3JtIGNvbnRyb2xzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFibGUuIFxyXG5cdCAqIEl0IHNldHMgdGhlIHRhYmxlIGRhdGEgYW5kIHN1YnNjcmliZXMgdG8gY2hhbmdlcyBpbiB0aGUgZm9ybSB2YWx1ZXMgdG8gXHJcblx0ICogdXBkYXRlIHRoZSB0YWJsZSBkeW5hbWljYWxseS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBnZXQgZm9ybUFycmF5KCk6IEZvcm1BcnJheSB8IHVuZGVmaW5lZCB7IHJldHVybiB0aGlzLl9mb3JtQXJyYXk7IH1cclxuXHRwdWJsaWMgc2V0IGZvcm1BcnJheShmb3JtQXJyYXk6IEZvcm1BcnJheSkge1xyXG5cdFx0dGhpcy5fZm9ybUFycmF5ID0gZm9ybUFycmF5O1xyXG5cdFx0dGhpcy5kYXRhID0gdGhpcy5fZm9ybUFycmF5Py52YWx1ZTtcclxuXHJcblx0XHQvKiBVcGRhdGUgdGhlIHRhYmxlIGRhdGEgd2hlbiB0aGUgZm9ybSBhcnJheSB2YWx1ZXMgY2hhbmdlICovXHJcblx0XHR0aGlzLl9mb3JtQXJyYXk/LnZhbHVlQ2hhbmdlcz8uc3Vic2NyaWJlKHggPT4ge1xyXG5cdFx0XHRpZiAoeC5sZW5ndGggIT09IHRoaXMuZGF0YVNvdXJjZT8uZGF0YT8ubGVuZ3RoKSB7XHJcblx0XHRcdFx0dGhpcy5kYXRhU291cmNlLmRhdGEgPSB0aGlzLl9mb3JtQXJyYXk/LnZhbHVlO1xyXG5cdFx0XHR9XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdldHRlciBmb3IgcmV0cmlldmluZyB0aGUgcmF3IHZhbHVlIG9mIHRoZSBmb3JtLCB3aXRob3V0IGFwcGx5aW5nIGFueSB0cmFuc2Zvcm1hdGlvbnMuXHJcblx0ICovXHJcblx0cHVibGljIGdldCBmb3JtVmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuZm9ybUFycmF5Py5nZXRSYXdWYWx1ZSgpOyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZsYWcgdG8gZW5hYmxlIG9yIGRpc2FibGUgZGVidWcgbW9kZSBmb3IgbG9nZ2luZyBhbmQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkZWJ1Z1ZhbHVlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IHJlcHJlc2VudGluZyB0aGUgY2xhc3MgdHlwZSB1c2VkIGluIHRoaXMgY29tcG9uZW50LCBcclxuXHQgKiB0eXBpY2FsbHkgZGVmaW5pbmcgdGhlIHN0cnVjdHVyZSBvciBtb2RlbCBvZiB0aGUgZGF0YS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBjbGFzc1R5cGU6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZm9yIHRoZSBjdXJyZW50IGNvbnRleHQgb3IgZW52aXJvbm1lbnQgaW4gd2hpY2ggdGhlIHRhYmxlIGlzIGJlaW5nIHVzZWQuXHJcblx0ICogVGhpcyBhbGxvd3MgcGFzc2luZyBhZGRpdGlvbmFsIG1ldGFkYXRhIG9yIHNldHRpbmdzLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGNvbnRleHQ6IGFueTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZm9yIGFwcGx5aW5nIGZpbHRlcnMgdG8gdGhlIGRhdGEgc291cmNlLiBJdCBkZWZpbmVzIGNyaXRlcmlhIG9yIGNvbmRpdGlvbnMgXHJcblx0ICogdGhhdCB3aWxsIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSB0YWJsZSBkYXRhLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGRhdGFTb3VyY2VGaWx0ZXI6IGFueSA9IHt9O1xyXG5cclxuXHQvKipcclxuXHQgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgdGFibGUgdXNlcyBhIHN0YXRpYyBkYXRhIHNvdXJjZS4gXHJcblx0ICogV2hlbiB0cnVlLCB0aGUgdGFibGUgZG9lcyBub3QgcmVseSBvbiBkeW5hbWljIGRhdGEgY2hhbmdlcy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzdGF0aWM6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcblx0ICogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSB0YWJsZSBkYXRhIGlzIGZpbHRlcmFibGUgYnkgdGhlIHVzZXIuXHJcblx0ICogSWYgdHJ1ZSwgZmlsdGVyaW5nIG9wdGlvbnMgYXJlIHByb3ZpZGVkLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGZpbHRlcmFibGU6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBGbGFnIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIHRhYmxlIGhlYWRlcnMgb3IgY29sdW1ucyBzaG91bGQgc3RpY2sgXHJcblx0ICogdG8gdGhlIHZpZXdwb3J0IGR1cmluZyBzY3JvbGxpbmcuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc3RpY2t5OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERlZmluZXMgdGhlIG92ZXJhbGwgd2lkdGggb2YgdGhlIHRhYmxlLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHRhYmxlV2lkdGg/OiBudW1iZXI7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgZmlsdGVyIG9wZXJhdG9yIGlzIHVzZWQgaW4gdGFibGUgZmlsdGVyaW5nLlxyXG5cdCAqIElmIHRydWUsIGZpbHRlcmluZyBsb2dpYyB3aWxsIGFwcGx5IG9wZXJhdG9ycyBzdWNoIGFzIGVxdWFscywgY29udGFpbnMsIGV0Yy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyB1c2VGaWx0ZXJPcGVyYXRvcjogYm9vbGVhbiA9IHRydWU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgdGFibGUgc3VwcG9ydHMgcGFnaW5hdGlvbi5cclxuXHQgKiBJZiB0cnVlLCBwYWdpbmF0aW9uIGNvbnRyb2xzIHdpbGwgYmUgYXZhaWxhYmxlIGZvciBuYXZpZ2F0aW5nIHRocm91Z2ggdGhlIGRhdGEuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcGFnaW5hYmxlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG5cdC8qKlxyXG5cdCAqIERldGVybWluZXMgd2hldGhlciB0aGUgJ0NoZWNrYm94JyBjb2x1bW4gaXMgc2hvd24gZm9yIHJvdyBzZWxlY3Rpb24uXHJcblx0ICogSWYgdHJ1ZSwgYSBjaGVja2JveCBjb2x1bW4gd2lsbCBiZSBkaXNwbGF5ZWQgYWxsb3dpbmcgdXNlcnMgdG8gc2VsZWN0IHJvd3MuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc2VsZWN0YWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuXHQvKipcclxuXHQgKiBTcGVjaWZpZXMgdGhlIGFjdGl2ZSBjb2x1bW4gdXNlZCBmb3Igc29ydGluZyB0aGUgdGFibGUgZGF0YS5cclxuXHQgKiBUaGlzIGlucHV0IGRldGVybWluZXMgd2hpY2ggY29sdW1uIHRoZSBzb3J0aW5nIGlzIGFwcGxpZWQgdG8uXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc29ydEFjdGl2ZT86IHN0cmluZztcclxuXHJcblx0LyoqXHJcblx0ICogU3BlY2lmaWVzIHRoZSBkaXJlY3Rpb24gb2Ygc29ydGluZyAoYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcpLlxyXG5cdCAqIERlZmF1bHQgaXMgJ2FzYycgKGFzY2VuZGluZykuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc29ydERpcmVjdGlvbjogU29ydERpcmVjdGlvbiA9ICdhc2MnO1xyXG5cclxuXHQvKipcclxuXHQgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHRhYmxlIGhlYWRlciBzaG91bGQgcmVtYWluIHN0aWNreSAoZml4ZWQpIGF0IHRoZSB0b3Agb2YgdGhlIHZpZXdwb3J0IFxyXG5cdCAqIHdoZW4gdGhlIHRhYmxlIHNjcm9sbHMuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgc3RpY2t5SGVhZGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcblx0LyoqXHJcblx0ICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmaWx0ZXIgc2VjdGlvbiBvZiB0aGUgdGFibGUgc2hvdWxkIHJlbWFpbiBzdGlja3kgKGZpeGVkKSBcclxuXHQgKiBhdCB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydCB3aGVuIHNjcm9sbGluZy5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBzdGlja3lGaWx0ZXI6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuXHQvKipcclxuXHQgKiBQcml2YXRlIGJhY2tpbmcgZmllbGQgZm9yIHRoZSBjb2x1bW5TZXRzIGlucHV0IHByb3BlcnR5LlxyXG5cdCAqIFRoaXMgZmllbGQgc3RvcmVzIHRoZSBzZXRzIG9mIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZSxcclxuXHQgKiBlbmFibGluZyBjb250cm9sIG92ZXIgaG93IHRoZSB2YWx1ZSBpcyBhY2Nlc3NlZCBvciBtb2RpZmllZCB0aHJvdWdoXHJcblx0ICogdGhlIHB1YmxpYyBnZXR0ZXIgYW5kIHNldHRlci5cclxuXHQgKiBAcHJpdmF0ZVxyXG5cdCAqL1xyXG5cdHByaXZhdGUgX2NvbHVtblNldHM/OiBzdHJpbmdbXTtcclxuXHJcblx0LyoqXHJcblx0ICogVXNlZCB0byBkaXNwbGF5IHNwZWNpZmljIGNvbHVtbnMgaW4gdGhlIHRhYmxlLlxyXG5cdCAqIFRoaXMgYXJyYXkgZGVmaW5lcyBzZXRzIG9mIGNvbHVtbnMgdGhhdCBjYW4gYmUgc2hvd25cclxuXHQgKiBiYXNlZCBvbiB0aGUgYWN0aXZlIGNvbmZpZ3VyYXRpb24sIGFsbG93aW5nIGZvciBkeW5hbWljIHRhYmxlXHJcblx0ICogY29sdW1uIGN1c3RvbWl6YXRpb24uXHJcblx0ICogQHByb3BlcnR5XHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZ2V0IGNvbHVtblNldHMoKTogc3RyaW5nW10gfCB1bmRlZmluZWQgeyByZXR1cm4gdGhpcy5fY29sdW1uU2V0czsgfVxyXG5cdHB1YmxpYyBzZXQgY29sdW1uU2V0cyh2YWx1ZTogc3RyaW5nW10gfCB1bmRlZmluZWQpIHsgdGhpcy5fY29sdW1uU2V0cyA9IHZhbHVlOyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEV2ZW50IGVtaXR0ZXIgZm9yIHJvdyBjbGljayBldmVudHMuIEl0IGVtaXRzIHRoZSBjbGlja2VkIHJvdydzIGRhdGEgd2hlbmV2ZXIgYSByb3cgaXMgY2xpY2tlZC5cclxuXHQgKi9cclxuXHRAT3V0cHV0KClcclxuXHRwdWJsaWMgcm93Q2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZ1bmN0aW9uIHVzZWQgdG8gZHluYW1pY2FsbHkgYXNzaWduIENTUyBjbGFzc2VzIHRvIHRhYmxlIHJvd3MgYmFzZWQgb24gY3VzdG9tIGxvZ2ljLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHJvd05nQ2xhc3M/OiBGdW5jdGlvbjtcclxuXHJcblx0LyoqXHJcblx0ICogVGVtcGxhdGUgZm9yIHJlbmRlcmluZyBhZGRpdGlvbmFsIGRldGFpbHMgYmVsb3cgZWFjaCByb3cuIFxyXG5cdCAqIEl0IGFjY2VwdHMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0ZW1wbGF0ZSBrZXkgb3IgaWRlbnRpZmllci5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBkZXRhaWxzVGVtcGxhdGU/OiBzdHJpbmc7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgdGFibGUgaXMgaW4gYSByZWFkb25seSBzdGF0ZS5cclxuXHQgKiBJZiB0cnVlLCBubyBjaGFuZ2VzIGNhbiBiZSBtYWRlIHRvIHRoZSB0YWJsZSBkYXRhLlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBfcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcblx0LyoqXHJcbiAqIElucHV0IHByb3BlcnR5IHRvIGRldGVybWluZSBpZiB0aGUgdGFibGUgaXMgcmVhZG9ubHkuIFxyXG4gKiBVc2VzIGBjb2VyY2VCb29sZWFuUHJvcGVydHlgIHRvIGVuc3VyZSB0aGUgdmFsdWUgaXMgdHJlYXRlZCBhcyBhIGJvb2xlYW4uXHJcbiAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGdldCByZWFkb25seSgpIHsgcmV0dXJuIHRoaXMuX3JlYWRvbmx5OyB9XHJcblx0cHVibGljIHNldCByZWFkb25seShyZWFkb25seTogYW55KSB7XHJcblx0XHR0aGlzLl9yZWFkb25seSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShyZWFkb25seSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBGdW5jdGlvbiB0byBmaWx0ZXIgaXRlbXMgd2hlbiBzZWxlY3RpbmcgYWxsIHJvd3MuIFxyXG5cdCAqIEl0IHRha2VzIHZhbHVlLCBpbmRleCwgYW5kIGFycmF5IGFzIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBhIGJvb2xlYW4gb3IgdW5rbm93biB0eXBlLlxyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIHNlbGVjdEFsbEZpbHRlcj86ICh2YWx1ZTogYW55LCBpbmRleDogbnVtYmVyLCBhcnJheTogYW55W10pID0+IHVua25vd247XHJcblxyXG5cdC8qKlxyXG5cdCAqIFJlZmVyZW5jZSB0byB0aGUgTWF0U29ydCBkaXJlY3RpdmUgdXNlZCBmb3IgYXBwbHlpbmcgc29ydGluZyBvbiB0aGUgdGFibGUuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZChNYXRTb3J0LCB7IHN0YXRpYzogdHJ1ZSB9KVxyXG5cdHB1YmxpYyBtYXRTb3J0PzogTWF0U29ydDtcclxuXHJcblx0LyoqXHJcblx0ICogUHJpdmF0ZSByZWZlcmVuY2UgdG8gdGhlIE1hdFBhZ2luYXRvciB1c2VkIHRvIHBhZ2luYXRlIHRoZSB0YWJsZSBkYXRhLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgX3BhZ2luYXRvcj86IE1hdFBhZ2luYXRvcjtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgc2V0dGVyIGZvciB0aGUgTWF0UGFnaW5hdG9yLiBXaGVuIHRoZSBwYWdpbmF0b3IgaXMgc2V0LCBpdCBhc3NpZ25zIGl0IFxyXG5cdCAqIHRvIHRoZSBkYXRhIHNvdXJjZSBmb3IgcGFnaW5hdGlvbiBjb250cm9sLlxyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGQoTWF0UGFnaW5hdG9yKVxyXG5cdHB1YmxpYyBzZXQgcGFnaW5hdG9yKHBhZ2luYXRvcjogTWF0UGFnaW5hdG9yKSB7XHJcblx0XHRpZiAocGFnaW5hdG9yKSB7XHJcblx0XHRcdHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IgPSBwYWdpbmF0b3I7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBQcml2YXRlIGFycmF5IHN0b3JpbmcgdGhlIGNvbHVtbnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0YWJsZS5cclxuXHQgKi9cclxuXHRwcml2YXRlIF9jb2x1bW5zOiBUYWJsZUNvbHVtbltdID0gW107XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IGdldHRlciBhbmQgc2V0dGVyIGZvciB0aGUgdGFibGUgY29sdW1ucy4gXHJcblx0ICogSXQgYWxsb3dzIHRoZSBjb2x1bW5zIHRvIGJlIGN1c3RvbWl6ZWQgYW5kIHVwZGF0ZWQgZHluYW1pY2FsbHkuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgZ2V0IGNvbHVtbnMoKTogVGFibGVDb2x1bW5bXSB7IHJldHVybiB0aGlzLl9jb2x1bW5zOyB9XHJcblx0cHVibGljIHNldCBjb2x1bW5zKGNvbHVtbnM6IFRhYmxlQ29sdW1uW10pIHsgdGhpcy5fY29sdW1ucyA9IGNvbHVtbnM7IH1cclxuXHJcblx0LyoqXHJcblx0ICogQmVoYXZpb3JTdWJqZWN0IHRvIG1hbmFnZSBhbmQgZW1pdCBjaGFuZ2VzIHRvIHRoZSBjb2x1bW5zIGR5bmFtaWNhbGx5LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjb2x1bW5zU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PFRhYmxlQ29sdW1uW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUYWJsZUNvbHVtbltdPihbXSk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIE9ic2VydmFibGUgdGhhdCB0cmFja3MgYW5kIGVtaXRzIGNoYW5nZXMgdG8gdGhlIGNvbHVtbnMuXHJcblx0ICovXHJcblx0cHVibGljIGNvbHVtbnMkOiBPYnNlcnZhYmxlPFRhYmxlQ29sdW1uW10+ID0gdGhpcy5jb2x1bW5zU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcblx0LyoqXHJcblx0ICogT2JzZXJ2YWJsZSB0cmFja2luZyB0aGUgY29sdW1ucyBjdXJyZW50bHkgZGlzcGxheWVkIGluIHRoZSB0YWJsZS5cclxuXHQgKi9cclxuXHRwdWJsaWMgZGlzcGxheWVkQ29sdW1ucyQ/OiBPYnNlcnZhYmxlPHN0cmluZ1tdPjtcclxuXHJcblx0LyoqXHJcblx0ICogT2JzZXJ2YWJsZSB0cmFja2luZyB0aGUgZmlsdGVyYWJsZSBjb2x1bW5zIGRpc3BsYXllZCBpbiB0aGUgdGFibGUuXHJcblx0ICovXHJcblx0cHVibGljIGRpc3BsYXllZEZpbHRlckNvbHVtbnMkPzogT2JzZXJ2YWJsZTxzdHJpbmdbXT47XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IHByb3BlcnR5IGZvciByb3ctc3BlY2lmaWMgYWN0aW9uIG1lbnUgaXRlbXMuIFxyXG5cdCAqIERlZmluZXMgYWN0aW9ucyBhdmFpbGFibGUgaW4gdGhlIGNvbnRleHQgbWVudSBmb3IgZWFjaCByb3cuXHJcblx0ICovXHJcblx0QElucHV0KClcclxuXHRwdWJsaWMgcm93TWVudUl0ZW1zOiBBY3Rpb25JdGVtW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogSW5wdXQgZm9yIGEgc2luZ2xlIHJvdyBhY3Rpb24gdG8gYmUgYXBwbGllZCB3aGVuIGludGVyYWN0aW5nIHdpdGggYSByb3cuXHJcblx0ICogQHByb3BlcnR5IHtBY3Rpb25JdGVtfSByb3dBY3Rpb25cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyByb3dBY3Rpb24/OiBBY3Rpb25JdGVtO1xyXG5cclxuXHQvKipcclxuXHQgKiBJbnB1dCBmb3Igc3BlY2lmeWluZyB3aGljaCBjb2x1bW5zIHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIGRpc3BsYXkgaW4gdGhlIHRhYmxlLlxyXG5cdCAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGV4Y2x1ZGVkQ29sdW1uc1xyXG5cdCAqL1xyXG5cdEBJbnB1dCgpXHJcblx0cHVibGljIGV4Y2x1ZGVkQ29sdW1uczogc3RyaW5nW10gPSBbXTtcclxuXHJcblx0LyoqXHJcblx0ICogUXVlcnlMaXN0IHRvIHJlZmVyZW5jZSBhbGwgTWF0TWVudVRyaWdnZXJzIGFzc29jaWF0ZWQgd2l0aCByb3cgY29udGV4dCBtZW51cy5cclxuXHQgKiBVc2VkIGZvciBoYW5kbGluZyB0aGUgY29udGV4dCBtZW51IGludGVyYWN0aW9ucyBvbiB0YWJsZSByb3dzLlxyXG5cdCAqIEBwcm9wZXJ0eSB7UXVlcnlMaXN0PE1hdE1lbnVUcmlnZ2VyPn0gcm93Q29udGV4dE1lbnVUcmlnZ2Vyc1xyXG5cdCAqL1xyXG5cdEBWaWV3Q2hpbGRyZW4oTWF0TWVudVRyaWdnZXIpXHJcblx0cHVibGljIHJvd0NvbnRleHRNZW51VHJpZ2dlcnM/OiBRdWVyeUxpc3Q8TWF0TWVudVRyaWdnZXI+O1xyXG5cclxuXHQvKipcclxuXHQgKiBDb2x1bW4gdHlwZSBlbnVtIHJlZmVyZW5jZSwgbWFwcGluZyB0YWJsZSBjb2x1bW5zIHRvIHRoZWlyIHR5cGVzIGZvciByZW5kZXJpbmcuXHJcblx0ICogQHByb3BlcnR5IHt0eXBlb2YgVGFibGVDb2x1bW5UeXBlfSBDb2x1bW5UeXBlXHJcblx0ICovXHJcblx0cHVibGljIENvbHVtblR5cGU6IHR5cGVvZiBUYWJsZUNvbHVtblR5cGUgPSBUYWJsZUNvbHVtblR5cGU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIEdyaWQgZW51bSByZWZlcmVuY2UsIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBncmlkIHVzZWQgaW4gdGhlIHRhYmxlLlxyXG5cdCAqIEBwcm9wZXJ0eSB7dHlwZW9mIEdyaWR9IEdyaWRcclxuXHQgKi9cclxuXHRwdWJsaWMgR3JpZDogdHlwZW9mIEdyaWQgPSBHcmlkO1xyXG5cclxuXHQvKipcclxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnRseSBleHBhbmRlZCByb3csIHVzZWQgZm9yIGhhbmRsaW5nIHJvdyBleHBhbnNpb24gbG9naWMuXHJcblx0ICogQHByb3BlcnR5IHthbnl9IGV4cGFuZGVkUm93XHJcblx0ICovXHJcblx0cHVibGljIGV4cGFuZGVkUm93OiBhbnk7XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IGZvciBzZXR0aW5nIHRoZSBkZWZhdWx0IHBhZ2Ugc2l6ZSBmb3IgcGFnaW5hdGlvbi4gXHJcblx0ICogRGVmYXVsdCB2YWx1ZSBpcyAxNS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBwYWdlU2l6ZTogbnVtYmVyID0gMTU7XHJcblxyXG5cdC8qKlxyXG5cdCAqIElucHV0IGZvciBzZXR0aW5nIGF2YWlsYWJsZSBwYWdlIHNpemUgb3B0aW9ucyBpbiB0aGUgcGFnaW5hdG9yLlxyXG5cdCAqIERlZmF1bHQgb3B0aW9ucyBpbmNsdWRlIFs1LCAxMCwgMTUsIDIwLCAzMCwgNTAsIDEwMCwgMjAwXS5cclxuXHQgKi9cclxuXHRASW5wdXQoKVxyXG5cdHB1YmxpYyBwYWdlU2l6ZU9wdGlvbnM6IEFycmF5PG51bWJlcj4gPSBbNSwgMTAsIDE1LCAyMCwgMzAsIDUwLCAxMDAsIDIwMF07XHJcblxyXG5cdC8qIFxyXG5cdCAqIFRoaXMgZGVjb3JhdG9yIGJpbmRzIHRoZSBzY3JvbGxhYmxlIGNvbnRhaW5lciBlbGVtZW50IGJ5IGl0cyB0ZW1wbGF0ZSByZWZlcmVuY2UuXHJcblx0ICogVGhlIGBzY3JvbGxDb250YWluZXJgIHdpbGwgcmVmZXJlbmNlIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgdGVtcGxhdGUgd2l0aCBgI3Njcm9sbENvbnRhaW5lcmAuXHJcblx0ICogSXQgd2lsbCBhbGxvdyBhY2Nlc3MgdG8gdGhlIG5hdGl2ZSBET00gZWxlbWVudCBmb3IgbWFuYWdpbmcgc2Nyb2xsIG9wZXJhdGlvbnMuXHJcblx0ICovXHJcblx0QFZpZXdDaGlsZCgnc2Nyb2xsQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuXHRwdWJsaWMgc2Nyb2xsQ29udGFpbmVyPzogRWxlbWVudFJlZjtcclxuXHJcblx0LyogXHJcblx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiBpcyBhY3RpdmVseSBkcmFnZ2luZyB0aGUgc2Nyb2xsIGNvbnRhaW5lci5cclxuXHQgKiBUaGlzIGZsYWcgZW5zdXJlcyB0aGF0IHNjcm9sbGluZyBvbmx5IG9jY3VycyB3aGVuIGEgZHJhZyBvcGVyYXRpb24gaXMgaW4gcHJvZ3Jlc3MsXHJcblx0ICogcHJvdmlkaW5nIGEgc21vb3RoZXIgYW5kIG1vcmUgY29udHJvbGxlZCB1c2VyIGV4cGVyaWVuY2UgZHVyaW5nIGludGVyYWN0aW9ucy5cclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXJ0RHJhZ2dpbmcgPSBmYWxzZTtcclxuXHJcblx0LyogXHJcblx0ICogRmxhZyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSByaWdodCBtb3VzZSBidXR0b24gaXMgYWN0aXZlbHkgZHJhZ2dpbmcgdGhlIHNjcm9sbCBjb250YWluZXIuXHJcblx0ICogSXQgZW5zdXJlcyB0aGF0IHNjcm9sbGluZyBvY2N1cnMgb25seSBkdXJpbmcgYWN0aXZlIGRyYWdnaW5nLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgaXNEcmFnZ2luZyA9IGZhbHNlO1xyXG5cclxuXHQvKiBcclxuXHQgKiBTdG9yZXMgdGhlIGluaXRpYWwgWCBjb29yZGluYXRlIHdoZW4gdGhlIHVzZXIgcHJlc3NlcyB0aGUgcmlnaHQgbW91c2UgYnV0dG9uLlxyXG5cdCAqIFRoaXMgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG1vdmVkIGR1cmluZyBkcmFnZ2luZywgZW5hYmxpbmcgc21vb3RoIHNjcm9sbGluZy5cclxuXHQgKi9cclxuXHRwcml2YXRlIHN0YXJ0WDogbnVtYmVyID0gMDtcclxuXHJcblx0LyogXHJcblx0ICogS2VlcHMgdHJhY2sgb2YgdGhlIGNvbnRhaW5lcuKAmXMgc2Nyb2xsIHBvc2l0aW9uIGJlZm9yZSB0aGUgZHJhZyBiZWdpbnMuXHJcblx0ICogVGhpcyBhbGxvd3MgdXBkYXRpbmcgdGhlIHNjcm9sbCBwb3NpdGlvbiBpbiByZWFsLXRpbWUgYXMgdGhlIHVzZXIgbW92ZXMgdGhlIG1vdXNlLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc2Nyb2xsTGVmdDogbnVtYmVyID0gMDtcclxuXHJcblx0LyoqXHJcblx0ICogQ29uc3RydWN0b3IgZm9yIHRoZSBjb21wb25lbnQsIGluamVjdGluZyBzZXJ2aWNlcyBuZWVkZWQgZm9yIGZvcm0gYnVpbGRpbmcsXHJcblx0ICogZHluYW1pYyBjb250ZW50IGhhbmRsaW5nLCBhbmQgY2hhbmdlIGRldGVjdGlvbi5cclxuXHQgKiBcclxuXHQgKiBAcGFyYW0gZm9ybUJ1aWxkZXIgU2VydmljZSBmb3IgY3JlYXRpbmcgZm9ybSBjb250cm9scyBhbmQgbWFuYWdpbmcgZm9ybSBsb2dpYy5cclxuXHQgKiBAcGFyYW0gZHluYW1pY0J1aWxkZXIgU2VydmljZSBmb3IgZHluYW1pY2FsbHkgY29uc3RydWN0aW5nIHRhYmxlIGNvbXBvbmVudHMuXHJcblx0ICogQHBhcmFtIGNoYW5nZURldGVjdG9yIFNlcnZpY2UgZm9yIGRldGVjdGluZyBhbmQgdHJpZ2dlcmluZyBVSSBjaGFuZ2VzLlxyXG5cdCAqL1xyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHJpdmF0ZSBkeW5hbWljQnVpbGRlcjogRHluYW1pY0J1aWxkZXIsXHJcblx0XHRwcml2YXRlIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG5cdCkgeyB9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciB0aGVcclxuXHQgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY2hlY2tlZCB0aGUgZGlyZWN0aXZlJ3NcclxuXHQgKiBkYXRhLWJvdW5kIHByb3BlcnRpZXMgZm9yIHRoZSBmaXJzdCB0aW1lLFxyXG5cdCAqIGFuZCBiZWZvcmUgYW55IG9mIHRoZSB2aWV3IG9yIGNvbnRlbnQgY2hpbGRyZW4gaGF2ZSBiZWVuIGNoZWNrZWQuXHJcblx0ICogSXQgaXMgaW52b2tlZCBvbmx5IG9uY2Ugd2hlbiB0aGUgZGlyZWN0aXZlIGlzIGluc3RhbnRpYXRlZC5cclxuXHQgKi9cclxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHRcdGlmICh0aGlzLmNsYXNzVHlwZSkge1xyXG5cdFx0XHQvKiBHZXQgdGhlIHRhYmxlIGRlZmluaXRpb24gdXNpbmcgdGhlIGNsYXNzIHR5cGUgKi9cclxuXHRcdFx0dmFyIHRhYmxlRGVmaW5pdGlvbiA9IGdldFRhYmxlRGVmaW5pdGlvbih0aGlzLmNsYXNzVHlwZSk7XHJcblx0XHRcdGlmICh0YWJsZURlZmluaXRpb24pIHtcclxuXHRcdFx0XHR0aGlzLmNvbHVtbnMgPSBbLi4udGFibGVEZWZpbml0aW9uIS5jb2x1bW5zID8/IFtdXTtcclxuXHRcdFx0XHRpZiAodGhpcy5yb3dNZW51SXRlbXM/Lmxlbmd0aCA+IDApIHtcclxuXHRcdFx0XHRcdC8qIENoZWNrIGlmIHRoZSBhY3Rpb24gY29sdW1uIGFscmVhZHkgZXhpc3RzICovXHJcblx0XHRcdFx0XHR2YXIgYWN0aW9uQ29sbXVuID0gdGhpcy5fY29sdW1ucz8uZmluZCh4ID0+IHgubmFtZSA9PSAnYWN0aW9uJyk7XHJcblxyXG5cdFx0XHRcdFx0LyogSWYgc28sIGp1c3QgYWRkIHRoZSBtZW51IGl0ZW1zIHRvIGl0ICovXHJcblx0XHRcdFx0XHRpZiAoYWN0aW9uQ29sbXVuICE9IG51bGwpIHtcclxuXHRcdFx0XHRcdFx0YWN0aW9uQ29sbXVuLm1lbnUgfHw9IHsgaWNvbjogJ21vcmVfdmVydCcgfTtcclxuXHRcdFx0XHRcdFx0dGhpcy5yb3dNZW51SXRlbXMuZm9yRWFjaCh5ID0+IGFjdGlvbkNvbG11biEubWVudSEuaXRlbXM/LnVuc2hpZnQoeSkpO1xyXG5cdFx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHRcdC8qIE90aGVyd2lzZSBhZGQgYSBuZXcgb25lICovXHJcblx0XHRcdFx0XHRlbHNlIHtcclxuXHRcdFx0XHRcdFx0dGhpcy5fY29sdW1ucy5wdXNoKG5ldyBUYWJsZUNvbHVtbih7XHJcblx0XHRcdFx0XHRcdFx0aW5kZXg6IDIwMDAsXHJcblx0XHRcdFx0XHRcdFx0bmFtZTogJ2FjdGlvbicsXHJcblx0XHRcdFx0XHRcdFx0Y29sdW1uU2V0czogWydhY3Rpb24nLCAnY29tbW9uJ10sXHJcblx0XHRcdFx0XHRcdFx0dHlwZTogVGFibGVDb2x1bW5UeXBlLkFjdGlvbixcclxuXHRcdFx0XHRcdFx0XHRkaXNhYmxlZDogdHJ1ZSxcclxuXHRcdFx0XHRcdFx0XHRtZW51OiB7IGljb246ICdtb3JlX3ZlcnQnLCBpdGVtczogdGhpcy5yb3dNZW51SXRlbXMgfSxcclxuXHRcdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IGZhbHNlLFxyXG5cdFx0XHRcdFx0XHRcdHN0aWNreUVuZDogdHJ1ZVxyXG5cdFx0XHRcdFx0XHR9KSk7XHJcblx0XHRcdFx0XHR9XHJcblx0XHRcdFx0fSBlbHNlIGlmICh0aGlzLnJvd0FjdGlvbikge1xyXG5cdFx0XHRcdFx0dGhpcy5fY29sdW1ucy5wdXNoKG5ldyBUYWJsZUNvbHVtbih7XHJcblx0XHRcdFx0XHRcdGluZGV4OiAyMDAwLFxyXG5cdFx0XHRcdFx0XHRuYW1lOiAnYWN0aW9uJyxcclxuXHRcdFx0XHRcdFx0Y29sdW1uU2V0czogWydhY3Rpb24nLCAnY29tbW9uJ10sXHJcblx0XHRcdFx0XHRcdHR5cGU6IFRhYmxlQ29sdW1uVHlwZS5BY3Rpb24sXHJcblx0XHRcdFx0XHRcdGRpc2FibGVkOiB0cnVlLFxyXG5cdFx0XHRcdFx0XHRtZW51OiB0aGlzLnJvd0FjdGlvbixcclxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcclxuXHRcdFx0XHRcdFx0c3RpY2t5RW5kOiB0cnVlXHJcblx0XHRcdFx0XHR9KSk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHRcdFx0XHQvKiBBZGQgY2hlY2tib3ggY29sdW1uICovXHJcblx0XHRcdFx0aWYgKHRoaXMuc2VsZWN0YWJsZSkge1xyXG5cdFx0XHRcdFx0dGhpcy5jb2x1bW5zLnVuc2hpZnQobmV3IFRhYmxlQ29sdW1uKHtcclxuXHRcdFx0XHRcdFx0bmFtZTogJ3NlbGVjdCcsXHJcblx0XHRcdFx0XHRcdGNvbHVtblNldHM6IFsnc2VsZWN0JywgJ2NvbW1vbiddLFxyXG5cdFx0XHRcdFx0XHR0eXBlOiBUYWJsZUNvbHVtblR5cGUuQ2hlY2tib3gsXHJcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogZmFsc2UsXHJcblx0XHRcdFx0XHRcdHN0aWNreTogdHJ1ZVxyXG5cdFx0XHRcdFx0fSkpO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8qIEJ1aWxkIGRpc3BsYXllZCBjb2x1bW5zICYgZmlsdGVyICovXHJcblx0XHR0aGlzLmNvbHVtbnMkPy5zdWJzY3JpYmUoeCA9PiB7XHJcblx0XHRcdC8qIEZpbHRlciB0aGUgY29sdW1ucyBiYXNlZCBvbiB0aGUgaW5kaXZpZHVhbCBjb2x1bW4ncyBjb2x1bW5TZXRzIHByb3BlcnR5IGFuZCB0aGUgZ2xvYmFsIGNvbHVtblNldHMgKi9cclxuXHRcdFx0Y29uc3Qgc2VsZWN0ZWRDb2x1bW5zID0gKHRoaXMuY29sdW1uU2V0cz8ubGVuZ3RoID8/IDApID4gMFxyXG5cdFx0XHRcdD8gdGhpcy5jb2x1bW5zPy5maWx0ZXIoYyA9PiB0aGlzLmNvbHVtblNldHM/LnNvbWUoc2V0ID0+IGMuY29sdW1uU2V0cz8uaW5jbHVkZXMoc2V0KSkpXHJcblx0XHRcdFx0OiB0aGlzLmNvbHVtbnM7XHJcblxyXG5cdFx0XHQvKiBCdWlsZCB0aGUgZGlzcGxheWVkIGNvbHVtbnMgYnkgZmlsdGVyaW5nIG91dCB0aGUgZXhjbHVkZWQgY29sdW1ucyBhbmQgbWFwcGluZyB0byB0aGVpciBuYW1lcyAqL1xyXG5cdFx0XHR0aGlzLmRpc3BsYXllZENvbHVtbnMkID0gb2Yoc2VsZWN0ZWRDb2x1bW5zXHJcblx0XHRcdFx0LyogRXhjbHVkZSBjb2x1bW5zIHRoYXQgYXJlIGluIHRoZSBleGNsdWRlZENvbHVtbnMgbGlzdCAqL1xyXG5cdFx0XHRcdD8uZmlsdGVyKHggPT4gIXRoaXMuZXhjbHVkZWRDb2x1bW5zPy5pbmNsdWRlcyh4Lm5hbWUpKVxyXG5cdFx0XHRcdC8qIE1hcCB0aGUgcmVtYWluaW5nIGNvbHVtbnMgdG8gdGhlaXIgbmFtZSBwcm9wZXJ0eSAqL1xyXG5cdFx0XHRcdD8ubWFwKGMgPT4gYy5uYW1lKVxyXG5cdFx0XHQpO1xyXG5cclxuXHRcdFx0LyogQnVpbGQgdGhlIGRpc3BsYXllZCBmaWx0ZXIgY29sdW1ucyBieSBmaWx0ZXJpbmcgb3V0IHRoZSBleGNsdWRlZCBjb2x1bW5zIGFuZCBwcmVmaXhpbmcgd2l0aCAnZmlsdGVyLicgKi9cclxuXHRcdFx0dGhpcy5kaXNwbGF5ZWRGaWx0ZXJDb2x1bW5zJCA9IG9mKHNlbGVjdGVkQ29sdW1uc1xyXG5cdFx0XHRcdC8qIEV4Y2x1ZGUgY29sdW1ucyB0aGF0IGFyZSBpbiB0aGUgZXhjbHVkZWRDb2x1bW5zIGxpc3QgKi9cclxuXHRcdFx0XHQ/LmZpbHRlcih4ID0+ICF0aGlzLmV4Y2x1ZGVkQ29sdW1ucz8uaW5jbHVkZXMoeC5uYW1lKSlcclxuXHRcdFx0XHQvKiBNYXAgdGhlIHJlbWFpbmluZyBjb2x1bW5zIHRvIGEgZmlsdGVyLWZyaWVuZGx5IHN0cmluZyB3aXRoICdmaWx0ZXIuJyBwcmVmaXggKi9cclxuXHRcdFx0XHQ/Lm1hcChjID0+IGBmaWx0ZXIuJHsoYy5maWx0ZXIgfHwgYy5uYW1lKX1gKVxyXG5cdFx0XHQpO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0LyogU2V0IHRoZSB0YWJsZSBjb2x1bW5zICovXHJcblx0XHR0aGlzLnVwZGF0ZUNvbHVtbnMoKTtcclxuXHJcblx0XHRjb25zdCBjb250YWluZXIgPSB0aGlzLnNjcm9sbENvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcclxuXHRcdGlmIChjb250YWluZXIpIHtcclxuXHRcdFx0LyogXHJcblx0XHRcdCAqIERpc2FibGUgdGhlIGNvbnRleHQgbWVudSBvbiByaWdodC1jbGljayB0byBhbGxvdyBzbW9vdGggc2Nyb2xsaW5nIFxyXG5cdFx0XHQgKiB3aXRob3V0IGludGVyZmVyZW5jZSBmcm9tIHRoZSBkZWZhdWx0IGNvbnRleHQgbWVudSBiZWhhdmlvci5cclxuXHRcdFx0ICovXHJcblx0XHRcdGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChlOiBNb3VzZUV2ZW50KSA9PiBlLnByZXZlbnREZWZhdWx0KCkpO1xyXG5cclxuXHRcdFx0LyogXHJcblx0XHRcdCAqIFN0YXJ0IGRyYWdnaW5nIHdoZW4gdGhlIHJpZ2h0IG1vdXNlIGJ1dHRvbiBpcyBwcmVzc2VkIChidXR0b24gPT09IDIpLlxyXG5cdFx0XHQgKiBUaGlzIHNhdmVzIHRoZSBpbml0aWFsIHBvc2l0aW9uIGFuZCBzY3JvbGwgc3RhdGUgZm9yIGxhdGVyIHVzZSBkdXJpbmcgbW92ZW1lbnQuXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKGU6IE1vdXNlRXZlbnQpID0+IHtcclxuXHRcdFx0XHRpZiAoZS5idXR0b24gPT09IDIgJiYgdGhpcy5zY3JvbGxDb250YWluZXIpIHtcclxuXHRcdFx0XHRcdC8qIFByZXZlbnRzIGFueSBkZWZhdWx0IGJlaGF2aW9yIGFzc29jaWF0ZWQgd2l0aCByaWdodC1jbGljayAqL1xyXG5cdFx0XHRcdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuXHRcdFx0XHRcdC8qIEFjdGl2YXRlIHRoZSBkcmFnZ2luZyBtb2RlLCBhbGxvd2luZyBob3Jpem9udGFsIHNjcm9sbGluZyAqL1xyXG5cdFx0XHRcdFx0dGhpcy5zdGFydERyYWdnaW5nID0gdHJ1ZTtcclxuXHJcblx0XHRcdFx0XHQvKiBTdG9yZSB0aGUgaW5pdGlhbCBYIHBvc2l0aW9uICovXHJcblx0XHRcdFx0XHR0aGlzLnN0YXJ0WCA9IGUucGFnZVggLSBjb250YWluZXIub2Zmc2V0TGVmdDtcclxuXHJcblx0XHRcdFx0XHQvKiBTYXZlIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiAqL1xyXG5cdFx0XHRcdFx0dGhpcy5zY3JvbGxMZWZ0ID0gY29udGFpbmVyLnNjcm9sbExlZnQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdC8qIFxyXG5cdFx0XHQgKiBTdG9wIGRyYWdnaW5nIHdoZW4gdGhlIG1vdXNlIGxlYXZlcyB0aGUgY29udGFpbmVyLlxyXG5cdFx0XHQgKiBUaGlzIGVuc3VyZXMgdGhlIHNjcm9sbGluZyBzdG9wcyBldmVuIGlmIHRoZSB1c2VyIG1vdmVzIHRoZSBjdXJzb3Igb3V0c2lkZSB0aGUgYm91bmRhcmllcy5cclxuXHRcdFx0ICovXHJcblx0XHRcdGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgKGU6IE1vdXNlRXZlbnQpID0+IHRoaXMuc3RvcERyYWdnaW5nKGUpKTtcclxuXHJcblx0XHRcdC8qIFxyXG5cdFx0XHQgKiBTdG9wIGRyYWdnaW5nIHdoZW4gdGhlIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZCAob24gbW91c2UgdXApLlxyXG5cdFx0XHQgKiBUaGlzIHByZXZlbnRzIGZ1cnRoZXIgc2Nyb2xsIG1vdmVtZW50cyBhZnRlciB0aGUgdXNlciByZWxlYXNlcyB0aGUgbW91c2UuXHJcblx0XHRcdCAqL1xyXG5cdFx0XHRjb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIChlOiBNb3VzZUV2ZW50KSA9PiB0aGlzLnN0b3BEcmFnZ2luZyhlKSk7XHJcblxyXG5cdFx0XHQvKiBcclxuXHRcdFx0ICogSGFuZGxlIHRoZSBhY3R1YWwgZHJhZ2dpbmcgKHNjcm9sbGluZykgd2hlbiB0aGUgbW91c2UgaXMgbW92ZWQuXHJcblx0XHRcdCAqIFRoaXMgY2FsY3VsYXRlcyB0aGUgbW92ZW1lbnQgYW5kIHVwZGF0ZXMgdGhlIHNjcm9sbCBwb3NpdGlvbiBhY2NvcmRpbmdseS5cclxuXHRcdFx0ICovXHJcblx0XHRcdGNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCAoZTogTW91c2VFdmVudCkgPT4ge1xyXG5cdFx0XHRcdC8qIElmIGRyYWdnaW5nIGlzIG5vdCBhY3RpdmUgb3Igc2Nyb2xsIGNvbnRhaW5lciBpcyB1bmRlZmluZWQsIGV4aXQgKi9cclxuXHRcdFx0XHRpZiAoIXRoaXMuc3RhcnREcmFnZ2luZyB8fCAhdGhpcy5zY3JvbGxDb250YWluZXIpIHtcclxuXHRcdFx0XHRcdHJldHVybjtcclxuXHRcdFx0XHR9XHJcblxyXG5cdFx0XHRcdC8qIEFjdGl2YXRlIHRoZSBkcmFnZ2luZyBtb2RlLCBhbGxvd2luZyBob3Jpem9udGFsIHNjcm9sbGluZyAqL1xyXG5cdFx0XHRcdHRoaXMuaXNEcmFnZ2luZyA9IHRydWU7XHJcblxyXG5cdFx0XHRcdC8qIFByZXZlbnQgZGVmYXVsdCBhY3Rpb24gdG8gZW5zdXJlIHNtb290aCBiZWhhdmlvciAqL1xyXG5cdFx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcblx0XHRcdFx0LyogQ2FsY3VsYXRlIHRoZSBjdXJyZW50IG1vdXNlIFggcG9zaXRpb24gKi9cclxuXHRcdFx0XHRjb25zdCB4ID0gZS5wYWdlWCAtIGNvbnRhaW5lci5vZmZzZXRMZWZ0O1xyXG5cclxuXHRcdFx0XHQvKiBDYWxjdWxhdGUgdGhlIGRpc3RhbmNlIG1vdmVkIChhbXBsaWZpZWQgZm9yIHNwZWVkKSAqL1xyXG5cdFx0XHRcdGNvbnN0IHdhbGsgPSAoeCAtIHRoaXMuc3RhcnRYKSAqIDI7XHJcblxyXG5cdFx0XHRcdC8qIFVwZGF0ZSB0aGUgc2Nyb2xsIHBvc2l0aW9uIGJhc2VkIG9uIG1vdmVtZW50ICovXHJcblx0XHRcdFx0Y29udGFpbmVyLnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbExlZnQgLSB3YWxrO1xyXG5cdFx0XHR9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIFVwZGF0ZXMgdGhlIHRhYmxlIGNvbHVtbnNcclxuXHQgKi9cclxuXHRwdWJsaWMgdXBkYXRlQ29sdW1ucygpOiB2b2lkIHtcclxuXHRcdC8qIFNvcnQgdGhlIGNvbHVtbnMgYnkgaW5kZXggKi9cclxuXHRcdFV0aWxzLnNvcnRBcnJheSh0aGlzLmNvbHVtbnMgfHwgW10sICdpbmRleCcpO1xyXG5cclxuXHRcdC8qIFRyaWdnZXIgY2hhbmdlcyAqL1xyXG5cdFx0dGhpcy5jb2x1bW5zU3ViamVjdC5uZXh0KHRoaXMuY29sdW1ucyk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBDb3VudHMgdmlzaWJsZSBhY3Rpb24gbWVudXNcclxuXHQgKiBAcGFyYW0gcm93IFxyXG5cdCAqIEBwYXJhbSBjb2x1bW4gXHJcblx0ICogQHJldHVybnMgXHJcblx0ICovXHJcblx0cHVibGljIGhhc1Zpc2libGVSb3dNZW51SXRlbXMocm93OiBhbnksIGNvbHVtbjogVGFibGVDb2x1bW4pOiBib29sZWFuIHtcclxuXHRcdHJldHVybiAoY29sdW1uPy5yb3dNZW51SXRlbXM/LmZpbHRlcih4ID0+ICF4LmhpZGUgfHwgIXguaGlkZShyb3cpKT8ubGVuZ3RoID8/IC0xKSA+IDA7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBBIGZ1bmN0aW9uIHRvIHRvIGNvbXB1dGUgdGhlIGlkZW50aXR5IG9mIGl0ZW1zIGluIGFuIGl0ZXJhYmxlLlxyXG5cdCAqIEBwYXJhbSBpbmRleCBcclxuXHQgKiBAcGFyYW0gaXRlbSBcclxuXHQgKi9cclxuXHRwdWJsaWMgdHJhY2tCeShpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGAke2l0ZW0uaWR9YDtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgZnVuY3Rpb24gdG8gdG8gY29tcHV0ZSB0aGUgaWRlbnRpdHkgb2YgaXRlbXMgaW4gYW4gaXRlcmFibGUuXHJcblx0ICogQHBhcmFtIGluZGV4IFxyXG5cdCAqIEBwYXJhbSBpdGVtIFxyXG5cdCAqL1xyXG5cdHB1YmxpYyBjb2x1bW5zVHJhY2tCeShpbmRleDogbnVtYmVyLCBpdGVtOiBhbnkpOiBzdHJpbmcge1xyXG5cdFx0cmV0dXJuIGl0ZW0ubmFtZTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhhbmRsZXMgcm93IGNsaWNrIGV2ZW50XHJcblx0ICogQHBhcmFtIGluZGV4IFxyXG5cdCAqIEBwYXJhbSByb3cgXHJcblx0ICovXHJcblx0cHVibGljIGhhbmRsZVJvd0NsaWNrKGluZGV4OiBhbnksIHJvdzogYW55KTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy50ZW1wbGF0ZVJlZikge1xyXG5cdFx0XHR0aGlzLmV4cGFuZGVkUm93ID0gdGhpcy5leHBhbmRlZFJvdyA9PT0gcm93ID8gbnVsbCA6IHJvdztcclxuXHRcdH1cclxuXHRcdGVsc2UgaWYgKHRoaXMuZGV0YWlsc1RlbXBsYXRlKSB7XHJcblx0XHRcdHRoaXMuZXhwYW5kZWRSb3cgPSB0aGlzLmV4cGFuZGVkUm93ID09PSByb3cgPyBudWxsIDogcm93O1xyXG5cdFx0XHRpZiAodGhpcy5kZXRhaWxzVGVtcGxhdGVSZWYpIHtcclxuXHRcdFx0XHR0aGlzLmR5bmFtaWNCdWlsZGVyLmNvbXBpbGVIdG1sKHRoaXMuZGV0YWlsc1RlbXBsYXRlUmVmLmdldChpbmRleCksIHRoaXMuZGV0YWlsc1RlbXBsYXRlLCByb3cpO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0dGhpcy5yb3dDbGljay5lbWl0KHJvdyk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2sgd2l0aCB0aGUgcmlnaHQgYnV0dG9uXHJcblx0ICogQHBhcmFtIGV2ZW50IE1vdXNlRXZlbnQsIGl0IGNvbnRhaW5zIHRoZSBjb29yZGluYXRlc1xyXG5cdCAqIEBwYXJhbSBpdGVtIE91ciBkYXRhIGNvbnRhaW5lZCBpbiB0aGUgcm93IG9mIHRoZSB0YWJsZVxyXG5cdCAqL1xyXG5cdHB1YmxpYyBoYW5kbGVSb3dSaWdodENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCBpdGVtOiBhbnkpIHtcclxuXHRcdGlmICh0aGlzLmlzRHJhZ2dpbmcpIHtcclxuXHRcdFx0cmV0dXJuO1xyXG5cdFx0fVxyXG5cclxuXHRcdHRoaXMucm93Q29udGV4dE1lbnVUcmlnZ2Vycz8udG9BcnJheSgpPy5mb3JFYWNoKHggPT4geC5jbG9zZU1lbnUoKSk7XHJcblx0XHR2YXIgbWVudVRyaWdnZXIgPSB0aGlzLnJvd0NvbnRleHRNZW51VHJpZ2dlcnM/LnRvQXJyYXkoKT8uZmlsdGVyKHggPT4geFsnX2VsZW1lbnQnXT8ubmF0aXZlRWxlbWVudD8uZ2V0QXR0cmlidXRlKCdpZCcpID09IGBtZW51LSR7aXRlbS5pZH1gKVswXTtcclxuXHRcdGlmIChtZW51VHJpZ2dlciAhPSBudWxsKSB7XHJcblx0XHRcdC8qIEF2b2lkcyB0byBzaG93IHRoZSB2aXN1YWxpemF0aW9uIG9mIHRoZSByaWdodC1jbGljayBtZW51IG9mIHRoZSBicm93c2VyICovXHJcblx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcblxyXG5cdFx0XHQvKiBTZXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBtZW51ICovXHJcblx0XHRcdG1lbnVUcmlnZ2VyWydfZWxlbWVudCddPy5uYXRpdmVFbGVtZW50Py5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgYHBvc2l0aW9uOiBmaXhlZDsgbGVmdDogJHtldmVudC5jbGllbnRYfXB4OyB0b3A6ICR7ZXZlbnQuY2xpZW50WX1weGApO1xyXG5cclxuXHRcdFx0LyogUGFzcyB0byB0aGUgbWVudSB0aGUgY3VycmVudCBvYmplY3QgKi9cclxuXHRcdFx0bWVudVRyaWdnZXIubWVudURhdGEgPSB7IGl0ZW06IGl0ZW0gfVxyXG5cclxuXHRcdFx0LyogT3BlbiB0aGUgbWVudSAqL1xyXG5cdFx0XHRtZW51VHJpZ2dlci5vcGVuTWVudSgpO1xyXG5cclxuXHRcdFx0LyogSGFuZGxlIGNsaWNrcyBvbiB0aGUgbWVudSBvdmVybGF5ICovXHJcblx0XHRcdGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2Nkay1vdmVybGF5LWNvbnRhaW5lcicpWzBdPy5hZGRFdmVudExpc3RlbmVyKCdjb250ZXh0bWVudScsIChvZmZFdmVudDogYW55KSA9PiB7XHJcblx0XHRcdFx0b2ZmRXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuXHRcdFx0XHRtZW51VHJpZ2dlciEuY2xvc2VNZW51KCk7XHJcblx0XHRcdH0sIHsgb25jZTogdHJ1ZSB9KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEhhbmRsZXMgbW9kZWwgY2hhbmdlc1xyXG5cdCAqIEBwYXJhbSBjb2x1bW4gXHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlTW9kZWxDaGFuZ2UoY29sdW1uOiBUYWJsZUNvbHVtbiwgcm93OiBhbnksIGZvcm1Hcm91cD86IEZvcm1Hcm91cCk6IHZvaWQge1xyXG5cdFx0aWYgKHR5cGVvZiBjb2x1bW4/LmV2ZW50ID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdGNvbHVtbi5ldmVudChyb3csIGZvcm1Hcm91cCwgY29sdW1uLmV2ZW50QXJncyA/PyB0aGlzLmNvbnRleHQpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogSGFuZGxlcyBrZXlkb3duIGVudGVyIG9mIDxpbnB1dD4gYW5kIDx2ZC1zZWxlY3Q+XHJcblx0ICogQHBhcmFtICRldmVudCBcclxuXHQgKi9cclxuXHRwdWJsaWMgaGFuZGxlS2V5ZG93bkVudGVyKCRldmVudDogRXZlbnQpOiBib29sZWFuIHtcclxuXHRcdCgkZXZlbnQ/LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50KT8uYmx1cigpO1xyXG5cdFx0cmV0dXJuIGZhbHNlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogUGF0Y2hlcyBhbiBlbnRpdHlcclxuXHQgKiBAcGFyYW0gcm93IFxyXG5cdCAqIEBwYXJhbSBmaWVsZE5hbWUgXHJcblx0ICogQHBhcmFtIHBhdGggXHJcblx0ICovXHJcblx0cHVibGljIHBhdGNoKHJvdzogYW55LCBmaWVsZHM6IEFycmF5PHN0cmluZz4sIHZhbHVlOiBhbnksIGluY2x1ZGVzOiBhbnkpOiB2b2lkIHtcclxuXHRcdC8qIEdldCBlbnRpdHkgYnkgSUQgKi9cclxuXHRcdGxldCBlbnRpdHkgPSB0aGlzLmRhdGFTb3VyY2UuaXRlbXM/LmZpbHRlcigoeDogYW55KSA9PiAoPGFueT54KS5pZCA9PT0gcm93LmlkKVswXTtcclxuXHRcdGlmIChlbnRpdHkpIHtcclxuXHRcdFx0LyogQnVpbGQgcGF0Y2ggbWV0aG9kcyAqL1xyXG5cdFx0XHRsZXQgcGF0Y2hlcyA9IGZpZWxkcy5tYXAoeCA9PiB7IHJldHVybiB7IG9wOiAncmVwbGFjZScsIHBhdGg6IGAvJHt4fWAsIHZhbHVlOiB2YWx1ZSAhPSB1bmRlZmluZWQgPyB2YWx1ZSA6IGVudGl0eVt4XSB9OyB9KTtcclxuXHJcblx0XHRcdC8qIFNlbmQgcmVxdWVzdCAqL1xyXG5cdFx0XHR0aGlzLmRhdGFTb3VyY2Uuc2VydmljZVxyXG5cdFx0XHRcdC5wYXRjaChyb3cuaWQsIHBhdGNoZXMsIG51bGwsIHsgaGVhZGVyczogeyAnU2hvdy1NZXNzYWdlJzogJ1llcycgfSwgcGFyYW1zOiBpbmNsdWRlcyA/IFV0aWxzLnRvSHR0cFBhcmFtcyh7IGluY2x1ZGVzOiBpbmNsdWRlcyB9KSA6IG51bGwgfSlcclxuXHRcdFx0XHQuc3Vic2NyaWJlKChfOiBhbnkpID0+IHRoaXMuZGF0YVNvdXJjZS5yZWxvYWQoKSk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBSZW5kZXJzIHJvd3MgYmFzZWQgb24gdGhlIHRhYmxlJ3MgbGF0ZXN0IHNldCBvZiBkYXRhLCB3aGljaCB3YXMgZWl0aGVyIHByb3ZpZGVkIGRpcmVjdGx5IGFzIGFuXHJcblx0ICogaW5wdXQgb3IgcmV0cmlldmVkIHRocm91Z2ggYW4gT2JzZXJ2YWJsZSBzdHJlYW0gKGRpcmVjdGx5IG9yIGZyb20gYSBEYXRhU291cmNlKS5cclxuXHQgKiBDaGVja3MgZm9yIGRpZmZlcmVuY2VzIGluIHRoZSBkYXRhIHNpbmNlIHRoZSBsYXN0IGRpZmYgdG8gcGVyZm9ybSBvbmx5IHRoZSBuZWNlc3NhcnlcclxuXHQgKiBjaGFuZ2VzIChhZGQvcmVtb3ZlL21vdmUgcm93cykuXHJcblx0ICovXHJcblx0cHVibGljIHJlbmRlclJvd3MoKTogdm9pZCB7XHJcblx0XHR0aGlzLnRhYmxlPy5yZW5kZXJSb3dzKCk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBIYW5kbGVzIGEgc3RyaW5nIGZ1bmN0aW9uIGV4cHJlc3Npb24uXHJcblx0ICogXHJcblx0ICogVGhpcyBtZXRob2QgcHJvY2Vzc2VzIGFuIGlucHV0IGV4cHJlc3Npb24gdGhhdCBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nIG9yIGEgZnVuY3Rpb24uIFxyXG5cdCAqIElmIGl0J3MgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIHByb3ZpZGVkIGl0ZW0gYW5kIGNvbnRleHQuIFxyXG5cdCAqIElmIGl0J3MgYSBzdHJpbmcsIGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMtaXMuXHJcblx0ICogXHJcblx0ICogQHBhcmFtIGV4cHJlc3Npb24gLSBUaGUgZXhwcmVzc2lvbiB0byBoYW5kbGUsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBvciBhIGZ1bmN0aW9uLlxyXG5cdCAqIEBwYXJhbSBpdGVtIC0gVGhlIGl0ZW0gdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24gaWYgdGhlIGV4cHJlc3Npb24gaXMgYSBmdW5jdGlvbi5cclxuXHQgKiBAcmV0dXJucyAtIFRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIGZ1bmN0aW9uIHdpdGggdGhlIGl0ZW0gYW5kIGNvbnRleHQsIG9yIHRoZSBzdHJpbmcgZXhwcmVzc2lvbiBpdHNlbGYuXHJcblx0ICovXHJcblx0cHVibGljIGhhbmRsZUV4cHJlc3Npb24oZXhwcmVzc2lvbjogc3RyaW5nIHwgRnVuY3Rpb24sIGl0ZW06IGFueSk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcblx0XHQvKiBDaGVjayBpZiB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzeSAoZS5nLiwgbnVsbCwgdW5kZWZpbmVkLCBvciBlbXB0eSkgKi9cclxuXHRcdGlmICghZXhwcmVzc2lvbikge1xyXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xyXG5cdFx0fVxyXG5cclxuXHRcdC8qIElmIHRoZSBleHByZXNzaW9uIGlzIGEgZnVuY3Rpb24sIGNhbGwgaXQgd2l0aCB0aGUgaXRlbSBhbmQgY29udGV4dCAqL1xyXG5cdFx0aWYgKHR5cGVvZiBleHByZXNzaW9uID09PSAnZnVuY3Rpb24nKSB7XHJcblx0XHRcdHJldHVybiBleHByZXNzaW9uKGl0ZW0sIHRoaXMuY29udGV4dCk7XHJcblx0XHR9XHJcblxyXG5cdFx0LyogSWYgdGhlIGV4cHJlc3Npb24gaXMgbm90IGEgZnVuY3Rpb24sIGFzc3VtZSBpdCdzIGEgc3RyaW5nIGFuZCByZXR1cm4gaXQgKi9cclxuXHRcdHJldHVybiBleHByZXNzaW9uO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogU2V0cyBhIG5lc3RlZCBwcm9wZXJ0eSB2YWx1ZSBpbiBhbiBvYmplY3QgYmFzZWQgb24gYSBkb3Qtc2VwYXJhdGVkIHBhdGguXHJcblx0ICogQHBhcmFtIHJvdyAtIFRoZSBvYmplY3QgaW4gd2hpY2ggdGhlIHByb3BlcnR5IGlzIGJlaW5nIHNldC5cclxuXHQgKiBAcGFyYW0gcHJvcGVydHlQYXRoIC0gQSBkb3Qtc2VwYXJhdGVkIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhlIG5lc3RlZCBwcm9wZXJ0eS5cclxuXHQgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gc2V0IGF0IHRoZSBzcGVjaWZpZWQgbmVzdGVkIHByb3BlcnR5LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBzZXROZXN0ZWRQcm9wZXJ0eShyb3c6IGFueSwgcHJvcGVydHlQYXRoOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcclxuXHRcdC8qIFNwbGl0IHRoZSBwcm9wZXJ0eVBhdGggaW50byBhbiBhcnJheSBvZiBrZXlzICovXHJcblx0XHRjb25zdCBrZXlzID0gcHJvcGVydHlQYXRoLnNwbGl0KCcuJyk7XHJcblxyXG5cdFx0LyogVXNlIHNsaWNlIHRvIGdldCBhbGwga2V5cyBleGNlcHQgdGhlIGxhc3Qgb25lIGFuZCByZWR1Y2UgdG8gdHJhdmVyc2UgdG8gdGhlIHNlY29uZC10by1sYXN0IGxldmVsICovXHJcblx0XHRrZXlzLnNsaWNlKDAsIC0xKS5yZWR1Y2UoKGFjYywga2V5KSA9PiBhY2MgJiYgYWNjW2tleV0sIHJvdylba2V5c1trZXlzLmxlbmd0aCAtIDFdXSA9IHZhbHVlO1xyXG5cdH1cclxuXHJcblx0LyoqXHJcblx0ICogR2V0cyByb3cgY2xhc3Nlc1xyXG5cdCAqIEBwYXJhbSBjb2x1bW4gXHJcblx0ICogQHBhcmFtIHJvdyBcclxuXHQgKiBAcmV0dXJucyBcclxuXHQgKi9cclxuXHRwdWJsaWMgZ2V0Um93Q2xhc3Nlcyhjb2x1bW46IFRhYmxlQ29sdW1uLCByb3c6IGFueSk6IGFueSB7XHJcblx0XHRyZXR1cm4gT2JqZWN0LmFzc2lnbih7XHJcblx0XHRcdCdndC14cyc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWHMsXHJcblx0XHRcdCdndC1zbSc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuU20sXHJcblx0XHRcdCdndC1tZCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTWQsXHJcblx0XHRcdCdndC1sZyc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTGcsXHJcblx0XHRcdCdndC14bCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWGwsXHJcblx0XHRcdCdndC14eGwnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlh4bCxcclxuXHRcdFx0J2hpZGRlbic6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuTm9uZSxcclxuXHRcdFx0J3RleHQtcmlnaHQnOiBjb2x1bW4uYXJyb3dCZWZvcmVcclxuXHRcdH0sIGNvbHVtbi5jZWxsTmdDbGFzcyA/IGNvbHVtbi5jZWxsTmdDbGFzcyhyb3csIHRoaXMuY29udGV4dCkgOiB7fSk7XHJcblx0fVxyXG5cclxuXHQvKipcclxuXHQgKiBMb2cgdG8gY29uc29sZVxyXG5cdCAqIEBwYXJhbSBtZXNzYWdlIFxyXG5cdCAqIEBwYXJhbSBvcHRpb25hbFBhcmFtcyBcclxuXHQgKi9cclxuXHRwdWJsaWMgbG9nKG1lc3NhZ2U6IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSB7XHJcblx0XHRjb25zb2xlLmxvZyhtZXNzYWdlLCBvcHRpb25hbFBhcmFtcyk7XHJcblx0fVxyXG5cclxuXHQvKiBcclxuXHQgKiBUZXJtaW5hdGVzIHRoZSBkcmFnZ2luZyBhY3Rpb24gYnkgcmVzZXR0aW5nIHRoZSBgaXNEcmFnZ2luZ2AgZmxhZyBhZnRlciBhIGJyaWVmIGRlbGF5LlxyXG5cdCAqIElmIHRoZSBgc2Nyb2xsQ29udGFpbmVyYCBpcyBkZWZpbmVkLCBpdCBhbHNvIHJlbW92ZXMgdGhlICdncmFiYmluZycgY2xhc3MgXHJcblx0ICogZnJvbSB0aGUgY29udGFpbmVyIGVsZW1lbnQsIHdoaWNoIHJldmVydHMgdGhlIGN1cnNvciBiYWNrIHRvIGl0cyBkZWZhdWx0IHN0YXRlLlxyXG5cdCAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSB2aXN1YWwgZmVlZGJhY2sgKGdyYWJiaW5nIGN1cnNvcikgaXMgb25seSBhY3RpdmUgZHVyaW5nIFxyXG5cdCAqIHRoZSBkcmFnIG9wZXJhdGlvbiBhbmQgaXMgcHJvcGVybHkgcmVtb3ZlZCB3aGVuIHRoZSB1c2VyIHN0b3BzIGludGVyYWN0aW5nLlxyXG5cdCAqL1xyXG5cdHByaXZhdGUgc3RvcERyYWdnaW5nKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcblx0XHQvKiBSZXNldCBkcmFnZ2luZyBzdGF0ZSB0byBzdG9wIHRoZSBzY3JvbGwgaW50ZXJhY3Rpb24gKi9cclxuXHRcdHRoaXMuc3RhcnREcmFnZ2luZyA9IGZhbHNlO1xyXG5cclxuXHRcdC8qIFxyXG5cdFx0ICogSW50cm9kdWNlIGEgc2xpZ2h0IGRlbGF5IGJlZm9yZSByZXNldHRpbmcgdGhlIGRyYWdnaW5nIHN0YXRlLlxyXG5cdFx0ICogVGhpcyBhbGxvd3MgZm9yIHNtb290aGVyIHRyYW5zaXRpb25zIGFuZCBlbnN1cmVzIHRoYXQgYW55IGZpbmFsIHNjcm9sbCBhZGp1c3RtZW50c1xyXG5cdFx0ICogYXJlIGFwcGxpZWQgYmVmb3JlIG1hcmtpbmcgdGhlIGRyYWdnaW5nIG9wZXJhdGlvbiBhcyBjb21wbGV0ZS5cclxuXHRcdCAqL1xyXG5cdFx0c2V0VGltZW91dCgoKSA9PiB7XHJcblx0XHRcdC8qIFJlc2V0IGRyYWdnaW5nIHN0YXRlIHRvIHN0b3AgdGhlIHNjcm9sbCBpbnRlcmFjdGlvbiAqL1xyXG5cdFx0XHR0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcclxuXHJcblx0XHRcdC8qIFJlc3RvcmUgdGhlIGRlZmF1bHQgY3Vyc29yICovXHJcblx0XHRcdGlmICh0aGlzLnNjcm9sbENvbnRhaW5lcikge1xyXG5cdFx0XHRcdHRoaXMuc2Nyb2xsQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZ3JhYmJpbmcnKTtcclxuXHRcdFx0fVxyXG5cdFx0fSwgMjAwKTtcclxuXHR9XHJcblxyXG5cdC8qKlxyXG5cdCAqIEEgY2FsbGJhY2sgbWV0aG9kIHRoYXQgaXMgaW52b2tlZCBpbW1lZGlhdGVseSBhZnRlciB0aGVcclxuXHQgKiBkZWZhdWx0IGNoYW5nZSBkZXRlY3RvciBoYXMgY29tcGxldGVkIG9uZSBjaGFuZ2UtY2hlY2sgY3ljbGVcclxuXHQgKiBmb3IgYSBjb21wb25lbnQncyB2aWV3LlxyXG5cdCAqL1xyXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XHJcblx0XHR0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuXHR9XHJcbn0iLCI8ZGl2IGNsYXNzPVwibG9hZGluZy1wcm9ncmVzc1wiICpuZ0lmPVwiIXN0YXRpY1wiPlxyXG5cdDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgKm5nSWY9XCJkYXRhU291cmNlPy5pc0xvYWRpbmdcIj48L21hdC1wcm9ncmVzcy1iYXI+XHJcbjwvZGl2PlxyXG5cclxuPCEtLSAjcmVnaW9uIERhdGEgdGFibGUgLS0+XHJcbjxkaXYgY2xhc3M9XCJtYXQtdGFibGUtY29udGFpbmVyIHNjcm9sbGJhci1zZWNvbmRhcnlcIiBbbmdDbGFzc109XCJ7J21hdC10YWJsZS1zdGlja3knOiBzdGlja3l9XCIgI3Njcm9sbENvbnRhaW5lcj5cclxuXHQ8dGFibGUgbWF0LXRhYmxlICN0YWJsZSBbZGF0YVNvdXJjZV09XCJkYXRhU291cmNlXCIgW2RhdGFTb3VyY2VGaWx0ZXJdPVwiZGF0YVNvdXJjZUZpbHRlclwiIFtuZ0NsYXNzXT1cInsndGFibGUtZml4ZWQnOiAhc3RpY2t5ICYmICFkZXRhaWxzVGVtcGxhdGUgJiYgIXRlbXBsYXRlUmVmLCAndGFibGUtc3RpY2snOiBzdGlja3l9XCIgW3RyYWNrQnldPVwidHJhY2tCeVwiIG1hdFNvcnQgbWF0U29ydERpc2FibGVDbGVhciBbbWF0U29ydEFjdGl2ZV09XCJzb3J0QWN0aXZlfHwnaWQnXCIgW21hdFNvcnREaXJlY3Rpb25dPVwic29ydERpcmVjdGlvblwiIG11bHRpVGVtcGxhdGVEYXRhUm93cz5cclxuXHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jOyB0cmFja0J5OmNvbHVtbnNUcmFja0J5XCI+XHJcblx0XHRcdDwhLS0gI3JlZ2lvbiBDb2x1bW4gZGVmIC0tPlxyXG5cdFx0XHQ8bmctY29udGFpbmVyIFtjZGtDb2x1bW5EZWZdPVwiY29sdW1uLm5hbWVcIiBbc3RpY2t5XT1cImNvbHVtbi5zdGlja3lcIiBbc3RpY2t5RW5kXT1cImNvbHVtbi5zdGlja3lFbmRcIj5cclxuXHRcdFx0XHQ8bmctdGVtcGxhdGUgI2hlYWRlciBbbmdUZW1wbGF0ZU91dGxldF09XCJoZWFkZXJcIiBsZXQtaGVhZGVyVGV4dD1cImhlYWRlclRleHRcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2hlYWRlclRleHQ6IGNvbHVtbi5oZWFkZXIgfCBmdW5jOmNvbnRleHR9XCI+XHJcblx0XHRcdFx0XHQ8dGggbWF0LWhlYWRlci1jZWxsICpjZGtIZWFkZXJDZWxsRGVmIFttYXQtc29ydC1oZWFkZXJdPVwiY29sdW1uLnNvcnRCeSB8fCBjb2x1bW4ubmFtZVwiIFtoaWRkZW5dPVwiY29sdW1uLmhpZGRlblwiIFtuZ1N0eWxlXT1cInttYXhXaWR0aDpjb2x1bW4ubWF4V2lkdGg/KGNvbHVtbi5tYXhXaWR0aCsoY29sdW1uLm1heFdpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCxtaW5XaWR0aDpjb2x1bW4ubWluV2lkdGg/KGNvbHVtbi5taW5XaWR0aCsoY29sdW1uLm1pbldpZHRoVW5pdCB8fCAncHgnKSk6bnVsbCx3aWR0aDpjb2x1bW4ud2lkdGg/KGNvbHVtbi53aWR0aCsoY29sdW1uLndpZHRoVW5pdCB8fCAncHgnKSk6bnVsbH1cIiBbZGlzYWJsZWRdPVwiY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5DaGVja2JveCB8fCBjb2x1bW4uZGlzYWJsZWRcIiBbbmdDbGFzc109XCJ7J2d0LXhzJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YcywgJ2d0LXNtJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5TbSwgJ2d0LW1kJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5NZCwgJ2d0LWxnJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5MZywgJ2d0LXhsJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YbCwgJ2d0LXh4bCc6IGNvbHVtbi5kaXNwbGF5ID09IEdyaWQuWHhsLCAnaGlkZGVuJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5Ob25lfVwiIFthcnJvd1Bvc2l0aW9uXT1cImNvbHVtbi5hcnJvd0JlZm9yZT8nYmVmb3JlJzonYWZ0ZXInXCI+XHJcblx0XHRcdFx0XHRcdDxtYXQtY2hlY2tib3ggKm5nSWY9XCJjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLkNoZWNrYm94XCIgKGNoYW5nZSk9XCIkZXZlbnQgPyBkYXRhU291cmNlLnRvZ2dsZVNlbGVjdCgkZXZlbnQsIHNlbGVjdEFsbEZpbHRlcikgOiBudWxsXCIgW2Rpc2FibGVkXT1cIiFkYXRhU291cmNlLnBhZ2luYXRvcj8ubGVuZ3RoXCIgW2NoZWNrZWRdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5oYXNWYWx1ZSgpICYmIGRhdGFTb3VyY2UuaXNBbGxTZWxlY3RlZCgpXCIgW2luZGV0ZXJtaW5hdGVdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5oYXNWYWx1ZSgpICYmICFkYXRhU291cmNlLmlzQWxsU2VsZWN0ZWQoKVwiPjwvbWF0LWNoZWNrYm94PlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImNvbHVtbi50eXBlICE9IENvbHVtblR5cGUuQ2hlY2tib3hcIiBbbWF0VG9vbHRpcF09XCJoZWFkZXJUZXh0XCI+e3toZWFkZXJUZXh0fX08L3NwYW4+XHJcblx0XHRcdFx0XHQ8L3RoPlxyXG5cdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0PHRkIG1hdC1jZWxsICpjZGtDZWxsRGVmPVwibGV0IHJvdzsgbGV0IHJvd0luZGV4ID0gZGF0YUluZGV4XCIgW21hdFRvb2x0aXBdPVwiY29sdW1uLnRvb2x0aXA/Y29sdW1uLnRvb2x0aXAocm93LCB1bmRlZmluZWQsIGNvbnRleHQpOm51bGxcIiBbbWF0VG9vbHRpcENsYXNzXT1cImNvbHVtbi50b29sdGlwQ2xhc3M/PycnXCIgW2hpZGRlbl09XCJjb2x1bW4uaGlkZGVuXCIgW25nQ2xhc3NdPVwiZ2V0Um93Q2xhc3Nlcyhjb2x1bW4sIHJvdylcIiBbbmdTdHlsZV09XCJ7bWF4V2lkdGg6Y29sdW1uLm1heFdpZHRoPyhjb2x1bW4ubWF4V2lkdGgrKGNvbHVtbi5tYXhXaWR0aFVuaXQgfHwgJ3B4JykpOm51bGwsbWluV2lkdGg6Y29sdW1uLm1pbldpZHRoPyhjb2x1bW4ubWluV2lkdGgrKGNvbHVtbi5taW5XaWR0aFVuaXQgfHwgJ3B4JykpOm51bGwsd2lkdGg6Y29sdW1uLndpZHRoPyhjb2x1bW4ud2lkdGgrKGNvbHVtbi53aWR0aFVuaXQgfHwgJ3B4JykpOm51bGx9XCI+XHJcblx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI3Jvd1ZhbCBbbmdUZW1wbGF0ZU91dGxldF09XCJyb3dWYWxcIiBsZXQtcm93VmFsdWUgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IGNvbHVtbj8uY29udGVudCAmJiBjb2x1bW4/LmNvbnRlbnQocm93LCB1bmRlZmluZWQsIGNvbnRleHQpfVwiPlxyXG5cdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb2x1bW4udHlwZVwiPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBDaGVja2JveCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG1hdC1jaGVja2JveCAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5DaGVja2JveFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cIiRldmVudCA/IGRhdGFTb3VyY2Uuc2VsZWN0aW9uTW9kZWwudG9nZ2xlKHJvdykgOiBudWxsXCIgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KSkpXCIgW2NoZWNrZWRdPVwiZGF0YVNvdXJjZS5zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKHJvdylcIj48L21hdC1jaGVja2JveD5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBFbnVtIGNvbHVtbiAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5FbnVtXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLmVudW1NZXRhZGF0YTsgZWxzZSBub0VudW1NZXRhZGF0YVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm11bHRpcGxlOyBlbHNlIGVsc2VUZW1wbGF0ZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm93VmFsdWU7IGxldCBpID0gaW5kZXhcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSBbbmdJZl09XCJpIDwgMlwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgbGV0LWRpc3BsYXlWYWx1ZT1cImRpc3BsYXlWYWx1ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgZGlzcGxheVZhbHVlOiBjb2x1bW4uZW51bU1ldGFkYXRhW2l0ZW1dLmRpc3BsYXkgfVwiPjwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNtYWxsICpuZ0lmPVwiaSA9PT0gMSAmJiByb3dWYWx1ZT8ubGVuZ3RoID4gMlwiIFttYXRUb29sdGlwXT1cIihyb3dWYWx1ZSB8IHNsaWNlOjIgfCBtYXA6Y29sdW1uLmVudW1NZXRhZGF0YSB8IG1hcDonZGlzcGxheScpIHwgam9pbjonXFxuJ1wiIG1hdFRvb2x0aXBDbGFzcz1cIm1hdC10b29sdGlwLW11bHRpbGluZVwiPi4uLjwvc21hbGw+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICN0ZW1wbGF0ZSBsZXQtZGlzcGxheVZhbHVlPVwiZGlzcGxheVZhbHVlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8bWF0LWNoaXAtcm93IGRpc2FibGVSaXBwbGU9XCJ0cnVlXCIgc2VsZWN0YWJsZT1cImZhbHNlXCIgW21hdFRvb2x0aXBdPVwiZGlzcGxheVZhbHVlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxzcGFuPnt7IGRpc3BsYXlWYWx1ZSB9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDwvbWF0LWNoaXAtcm93PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI2Vsc2VUZW1wbGF0ZT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cInJvd1ZhbHVlID49IDBcIiBjbGFzcz1cIm5hXCIgW2lubmVySHRtbF09XCIoY29sdW1uLmVudW1NZXRhZGF0YVtyb3dWYWx1ZV18fHt9KS5kaXNwbGF5XCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctdGVtcGxhdGUgI25vRW51bU1ldGFkYXRhPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm11bHRpcGxlOyBlbHNlIGVsc2VUZW1wbGF0ZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygcm93VmFsdWU7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNtYWxsICpuZ0lmPVwiaTwyXCIgaTE4bj1cIkBAc2VsZWN0aW9uXCI+e2l0ZW0gfCBlbnVtOmNvbHVtbi5lbnVtVHlwZTpjb2x1bW4uZW51bVByZWZpeCwgc2VsZWN0LCB0eXBlIHt0eXBlfSBvdGhlciB7e3tpdGVtIHwgZW51bTpjb2x1bW4uZW51bVR5cGU6Y29sdW1uLmVudW1QcmVmaXh9fX19PC9zbWFsbD48c21hbGwgKm5nSWY9XCJpPT0xICYmIHJvd1ZhbHVlPy5sZW5ndGggPiAyXCI+LCAuLi48L3NtYWxsPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNlbHNlVGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nSWY9XCJyb3dWYWx1ZSA+PSAwXCIgaTE4bj1cIkBAc2VsZWN0aW9uXCI+e3Jvd1ZhbHVlIHwgZW51bTpjb2x1bW4uZW51bVR5cGU6Y29sdW1uLmVudW1QcmVmaXgsIHNlbGVjdCwgdHlwZSB7dHlwZX0gb3RoZXIge3t7cm93VmFsdWUgfCBlbnVtOmNvbHVtbi5lbnVtVHlwZTpjb2x1bW4uZW51bVByZWZpeH19fX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjcmVjdXJzaXZlQ29udGFpbmVyIGxldC1jb2x1bW5OYW1lU2VnbWVudHM9XCJzZWdtZW50c1wiIGxldC1mb3JtR3JvdXA9XCJmb3JtR3JvdXBcIiBsZXQtcGFyZW50Rm9ybUdyb3VwPVwicGFyZW50Rm9ybUdyb3VwXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUdyb3VwXCIgW2Zvcm1Hcm91cF09XCJmb3JtR3JvdXBcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PCEtLSBJZiB0aGUgY29sdW1uTmFtZVNlZ21lbnRzIGFycmF5IGlzIGVtcHR5LCB3ZSdyZSBhdCB0aGUgbGVhZiBub2RlIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbk5hbWVTZWdtZW50cy5sZW5ndGg7IGVsc2Ugbm90TGFzdFNlZ21lbnRcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVG9nZ2xlIGNvbHVtbiAtLT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLlRvZ2dsZVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG1hdC1zbGlkZS10b2dnbGUgW2Zvcm1Db250cm9sXT1cImZvcm1Hcm91cFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCIgKGNoYW5nZSk9XCJjb2x1bW4uY2hhbmdlP2NvbHVtbi5jaGFuZ2UocGFyZW50Rm9ybUdyb3VwLnZhbHVlLCBwYXJlbnRGb3JtR3JvdXAsIGNvbnRleHQpOmhhbmRsZU1vZGVsQ2hhbmdlKGNvbHVtbiwgcGFyZW50Rm9ybUdyb3VwLnZhbHVlLCBwYXJlbnRGb3JtR3JvdXApXCIgW2Rpc2FibGVDb250cm9sXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwLCBjb250ZXh0KSkpXCIgY29sb3I9XCJhY2NlbnRcIj48L21hdC1zbGlkZS10b2dnbGU+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVGV4dCBJbnB1dCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PG1hdC1mb3JtLWZpZWxkICpuZ1N3aXRjaENhc2U9XCJDb2x1bW5UeXBlLlRleHRJbnB1dFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3Vic2NyaXB0U2l6aW5nPVwiZHluYW1pY1wiIGRlbnNlLTMgbGF5b3V0PVwiY29sdW1uXCIgbGF5b3V0LWFsaWduPVwiY2VudGVyIHN0YXJ0XCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZm9ybUdyb3VwXCIgdHlwZT1cInt7Y29sdW1uLmlucHV0VHlwZX19XCIgYXV0b2NvbXBsZXRlPVwibm9uZVwiIFtkaXNhYmxlQ29udHJvbF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCkpKVwiIFttaW5dPVwiY29sdW1uLmlucHV0TWluP2NvbHVtbi5pbnB1dE1pbihwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCk6bnVsbFwiIFttYXhdPVwiY29sdW1uLmlucHV0TWF4P2NvbHVtbi5pbnB1dE1heChwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCk6bnVsbFwiIChrZXlkb3duLmVudGVyKT1cImhhbmRsZUtleWRvd25FbnRlcigkZXZlbnQpXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBWRC1TZWxlY3QgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxtYXQtZm9ybS1maWVsZCAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5TZWxlY3RcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBkZW5zZS0zIGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cImNlbnRlciBzdGFydFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8dmQtc2VsZWN0IFtmb3JtQ29udHJvbF09XCJmb3JtR3JvdXBcIiBbZW51bV09XCJjb2x1bW4uZW51bVR5cGVcIiBbZW51bU1ldGFkYXRhXT1cImNvbHVtbi5lbnVtTWV0YWRhdGFcIiBbZW51bUZpbHRlcl09XCJjb2x1bW4uZW51bUZpbHRlciB8IGZ1bmM6cGFyZW50Rm9ybUdyb3VwLnZhbHVlOmNvbnRleHRcIiBbcHJlZml4XT1cImNvbHVtbi5lbnVtUHJlZml4XCIgW29wdGlvbnNdPVwiY29sdW1uLm9wdGlvbnNcIiBbZGVmYXVsdE9wdGlvbl09XCJjb2x1bW4uZGVmYXVsdE9wdGlvbj8/dHJ1ZVwiIFtkaXNhYmxlQ29udHJvbF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShwYXJlbnRGb3JtR3JvdXAudmFsdWUsIHBhcmVudEZvcm1Hcm91cCwgY29udGV4dCkpKVwiIChzZWxlY3Rpb25DaGFuZ2UpPVwiY29sdW1uLmNoYW5nZT9jb2x1bW4uY2hhbmdlKHBhcmVudEZvcm1Hcm91cC52YWx1ZSwgcGFyZW50Rm9ybUdyb3VwLCBjb250ZXh0KTpwYXRjaChwYXJlbnRGb3JtR3JvdXAudmFsdWUsIFtjb2x1bW4ubmFtZV0sIHJvd1ZhbHVlLCBjb2x1bW4ucGF0Y2hJbmNsdWRlcylcIiAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVLZXlkb3duRW50ZXIoJGV2ZW50KVwiPjwvdmQtc2VsZWN0PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvbWF0LWZvcm0tZmllbGQ+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNub3RMYXN0U2VnbWVudD5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8IS0tIElmIG5vdCB0aGUgbGFzdCBzZWdtZW50LCBjcmVhdGUgYSBuZXN0ZWQgZm9ybSBncm91cCAtLT5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtmb3JtR3JvdXBOYW1lXT1cImNvbHVtbk5hbWVTZWdtZW50c1swXVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PCEtLSBSZWN1cnNpdmUgY2FsbCB0byBoYW5kbGUgbmVzdGVkIHNlZ21lbnRzIC0tPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZWN1cnNpdmVDb250YWluZXJcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3NlZ21lbnRzOiBjb2x1bW5OYW1lU2VnbWVudHMuc2xpY2UoMSksIHBhcmVudEZvcm1Hcm91cDpmb3JtR3JvdXAsIGZvcm1Hcm91cDogZm9ybUdyb3VwLmdldChjb2x1bW5OYW1lU2VnbWVudHNbMF0pfVwiPjwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8L25nLXRlbXBsYXRlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFRvZ2dsZSBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5Ub2dnbGVcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9ybUFycmF5XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxtYXQtc2xpZGUtdG9nZ2xlIFtuZ01vZGVsXT1cInJvdyB8IHByb3BlcnR5OmNvbHVtbi5uYW1lXCIgKG5nTW9kZWxDaGFuZ2UpPVwic2V0TmVzdGVkUHJvcGVydHkocm93LCBjb2x1bW4ubmFtZSwgJGV2ZW50KTtoYW5kbGVNb2RlbENoYW5nZShjb2x1bW4sIHJvdywgdW5kZWZpbmVkKTtcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiIFtkaXNhYmxlZF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShyb3csIHVuZGVmaW5lZCwgY29udGV4dCkpKVwiIGNvbG9yPVwiYWNjZW50XCI+PC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZm9ybUFycmF5XCIgW2Zvcm1Hcm91cF09XCIkYW55KGZvcm1BcnJheS5jb250cm9scylbcm93SW5kZXhdIHwgZm9ybUdyb3VwXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicmVjdXJzaXZlQ29udGFpbmVyXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntzZWdtZW50czogY29sdW1uLm5hbWUuc3BsaXQoJy4nKSwgZm9ybUdyb3VwOiBmb3JtQXJyYXkuY29udHJvbHNbcm93SW5kZXhdfVwiPjwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gRGF0ZSBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuRGF0ZVwiPnt7cm93VmFsdWUgfCBkYXRlOmNvbHVtbi5zaG9ydERhdGU/J2RkLk1NLnl5eXknOidkZC5NTS55eXl5IEhIOm1tOnNzJ319PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFRleHQgSW5wdXQgY29sdW1uIC0tPlxyXG5cdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuVGV4dElucHV0XCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8bWF0LWZvcm0tZmllbGQgKm5nSWY9XCIhZm9ybUFycmF5XCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBsYXlvdXQ9XCJjb2x1bW5cIiBsYXlvdXQtYWxpZ249XCJjZW50ZXIgc3RhcnRcIiBzdWJzY3JpcHRTaXppbmc9XCJkeW5hbWljXCIgZGVuc2UtMyAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8aW5wdXQgbWF0SW5wdXQgKm5nSWY9XCIhZm9ybUFycmF5XCIgdHlwZT1cInt7Y29sdW1uLmlucHV0VHlwZX19XCIgYXV0b2NvbXBsZXRlPVwibm9uZVwiIG5hbWU9XCJ7e2NvbHVtbi5uYW1lfX17e3Jvd0luZGV4fX1cIiBbbmdNb2RlbF09XCJyb3cgfCBwcm9wZXJ0eTpjb2x1bW4ubmFtZVwiIFtkaXNhYmxlZF09XCJyZWFkb25seSB8fCAoY29sdW1uLmRpc2FibGVkIHx8IChjb2x1bW4uZGlzYWJsZSAmJiBjb2x1bW4uZGlzYWJsZShyb3csIHVuZGVmaW5lZCwgY29udGV4dCkpKVwiIFttaW5dPVwiY29sdW1uLmlucHV0TWluP2NvbHVtbi5pbnB1dE1pbihyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6bnVsbFwiIFttYXhdPVwiY29sdW1uLmlucHV0TWF4P2NvbHVtbi5pbnB1dE1heChyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6bnVsbFwiIChuZ01vZGVsQ2hhbmdlKT1cInNldE5lc3RlZFByb3BlcnR5KHJvdywgY29sdW1uLm5hbWUsICRldmVudCk7KGNvbHVtbi5jaGFuZ2U/Y29sdW1uLmNoYW5nZShyb3csIHVuZGVmaW5lZCwgY29udGV4dCk6cGF0Y2gocm93LCBbY29sdW1uLm5hbWVdLCAkZXZlbnQsIGNvbHVtbi5wYXRjaEluY2x1ZGVzKSk7XCIgW25nTW9kZWxPcHRpb25zXT1cInt1cGRhdGVPbjogJ2JsdXInfVwiIChrZXlkb3duLmVudGVyKT1cImhhbmRsZUtleWRvd25FbnRlcigkZXZlbnQpXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L21hdC1mb3JtLWZpZWxkPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cImZvcm1BcnJheVwiIFtmb3JtR3JvdXBdPVwiJGFueShmb3JtQXJyYXkuY29udHJvbHMpW3Jvd0luZGV4XSB8IGZvcm1Hcm91cFwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJlY3Vyc2l2ZUNvbnRhaW5lclwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7c2VnbWVudHM6IGNvbHVtbi5uYW1lLnNwbGl0KCcuJyksIGZvcm1Hcm91cDogZm9ybUFycmF5LmNvbnRyb2xzW3Jvd0luZGV4XX1cIj48L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIFZELVNlbGVjdCBjb2x1bW4gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5TZWxlY3RcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxtYXQtZm9ybS1maWVsZCAqbmdJZj1cIiFmb3JtQXJyYXlcIiBhcHBlYXJhbmNlPVwib3V0bGluZVwiIGxheW91dD1cImNvbHVtblwiIGxheW91dC1hbGlnbj1cImNlbnRlciBzdGFydFwiIHN1YnNjcmlwdFNpemluZz1cImR5bmFtaWNcIiBkZW5zZS0zIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDx2ZC1zZWxlY3QgKm5nSWY9XCIhZm9ybUFycmF5XCIgbmFtZT1cInt7Y29sdW1uLm5hbWV9fXt7cm93SW5kZXh9fVwiIFtlbnVtXT1cImNvbHVtbi5lbnVtVHlwZVwiIFtlbnVtTWV0YWRhdGFdPVwiY29sdW1uLmVudW1NZXRhZGF0YVwiIFtlbnVtRmlsdGVyXT1cImNvbHVtbj8uZW51bUZpbHRlciAgfCBmdW5jOnJvdzpjb250ZXh0XCIgW3ByZWZpeF09XCJjb2x1bW4uZW51bVByZWZpeFwiIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zXCIgW2RlZmF1bHRPcHRpb25dPVwiY29sdW1uLmRlZmF1bHRPcHRpb24/P3RydWVcIiBbbmdNb2RlbF09XCJyb3cgfCBwcm9wZXJ0eTpjb2x1bW4ubmFtZVwiIChuZ01vZGVsQ2hhbmdlKT1cInNldE5lc3RlZFByb3BlcnR5KHJvdywgY29sdW1uLm5hbWUsICRldmVudCk7XCIgW2Rpc2FibGVkXT1cInJlYWRvbmx5IHx8IChjb2x1bW4uZGlzYWJsZWQgfHwgKGNvbHVtbi5kaXNhYmxlICYmIGNvbHVtbi5kaXNhYmxlKHJvdywgdW5kZWZpbmVkLCBjb250ZXh0KSkpXCIgKGNoYW5nZSk9XCJjb2x1bW4uY2hhbmdlP2NvbHVtbi5jaGFuZ2Uocm93LCB1bmRlZmluZWQsIGNvbnRleHQpOnBhdGNoKHJvdywgW2NvbHVtbi5uYW1lXSwgJGV2ZW50LnZhbHVlLCBjb2x1bW4ucGF0Y2hJbmNsdWRlcylcIiAoa2V5ZG93bi5lbnRlcik9XCJoYW5kbGVLZXlkb3duRW50ZXIoJGV2ZW50KVwiPjwvdmQtc2VsZWN0PlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9tYXQtZm9ybS1maWVsZD5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JtQXJyYXlcIiBbZm9ybUdyb3VwXT1cIiRhbnkoZm9ybUFycmF5LmNvbnRyb2xzKVtyb3dJbmRleF0gfCBmb3JtR3JvdXBcIj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJyZWN1cnNpdmVDb250YWluZXJcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie3NlZ21lbnRzOiBjb2x1bW4ubmFtZS5zcGxpdCgnLicpLCBmb3JtR3JvdXA6IGZvcm1BcnJheS5jb250cm9sc1tyb3dJbmRleF19XCI+PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBBY3Rpb24gLS0+XHJcblx0XHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiQ29sdW1uVHlwZS5BY3Rpb25cIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW4ubWVudVwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGlkPVwibWVudS17e3Jvdy5pZH19XCIgc3R5bGU9XCJ2aXNpYmlsaXR5OiBoaWRkZW47IHBvc2l0aW9uOiBmaXhlZDtcIiAjY29udGV4dE1lbnVUcmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIiBbbWF0TWVudVRyaWdnZXJGb3JdPVwibWVudS5tYXRNZW51IVwiICpuZ0lmPVwibWVudT8ubWF0TWVudSAmJiAhcm93LmxvY2tlZCAmJiBoYXNWaXNpYmxlUm93TWVudUl0ZW1zKHJvdywgY29sdW1uKVwiPjwvZGl2PlxyXG5cdFx0XHRcdFx0XHRcdFx0XHQ8dmQtZHluYW1pYy1tZW51IFtpdGVtc109XCJbY29sdW1uLm1lbnVdXCIgW2RhdGFdPVwicm93XCIgW2NvbnRleHRdPVwiY29udGV4dFwiICNtZW51PjwvdmQtZHluYW1pYy1tZW51PlxyXG5cdFx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gTWVudSAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uLm1lbnVcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDx2ZC1keW5hbWljLW1lbnUgKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuTWVudVwiIFtpdGVtc109XCJbY29sdW1uLm1lbnVdXCIgW2RhdGFdPVwicm93XCIgW2NvbnRleHRdPVwiY29udGV4dFwiPjwvdmQtZHluYW1pYy1tZW51PlxyXG5cdFx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdFx0PCEtLSAjcmVnaW9uIGljb24gLS0+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuSWNvblwiIGxheW91dD1cInJvd1wiIGxheW91dC1hbGlnbj1cInN0YXJ0IGNlbnRlclwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24/Lm1hdEljb25cIiBmb250U2V0PVwie3tjb2x1bW4uaWNvbj8uZm9udFNldCB8fCAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCd9fVwiIFtjbGFzc109XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5jc3NDbGFzcz8/JycsIHJvdylcIj57e2hhbmRsZUV4cHJlc3Npb24oY29sdW1uLmljb24/Lm1hdEljb24hLCByb3cpfX08L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24/LnN2Z0ljb25cIiBmb250U2V0PVwie3tjb2x1bW4uaWNvbj8uZm9udFNldCB8fCAnbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCd9fVwiIFtjbGFzc109XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5jc3NDbGFzcz8/JycsIHJvdylcIiBbc3ZnSWNvbl09XCJoYW5kbGVFeHByZXNzaW9uKGNvbHVtbi5pY29uPy5zdmdJY29uISwgcm93KSFcIj48L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdFx0PG1hdC1pY29uICpuZ0lmPVwiY29sdW1uLmljb24/LmZvbnRJY29uXCIgZm9udFNldD1cInt7Y29sdW1uLmljb24/LmZvbnRTZXQgfHwgJ21hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQnfX1cIiBbY2xhc3NdPVwiaGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbj8uY3NzQ2xhc3M/PycnLCByb3cpXCIgW2ZvbnRJY29uXT1cImhhbmRsZUV4cHJlc3Npb24oY29sdW1uLmljb24/LmZvbnRJY29uISwgcm93KSFcIj48L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdDwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBpY29uIGJ1dHRvbiAtLT5cclxuXHRcdFx0XHRcdFx0XHQ8YSBtYXQtaWNvbi1idXR0b24gKm5nU3dpdGNoQ2FzZT1cIkNvbHVtblR5cGUuSWNvbkJ1dHRvblwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7Y29sdW1uLmljb25CdXR0b24/LmV2ZW50P2NvbHVtbi5pY29uQnV0dG9uPy5ldmVudChyb3csIGNvbnRleHQpOm51bGxcIj5cclxuXHRcdFx0XHRcdFx0XHRcdDxtYXQtaWNvbiBmb250U2V0PVwie3tjb2x1bW4uaWNvbkJ1dHRvbj8uaWNvbkZvbnRTZXQgfHwgJ21hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQnfX1cIiBbY2xhc3NdPVwiaGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbkJ1dHRvbj8uaWNvbkNsYXNzPz8nJywgcm93KVwiPnt7aGFuZGxlRXhwcmVzc2lvbihjb2x1bW4uaWNvbkJ1dHRvbj8uaWNvbj8/J3JhZGlvX2J1dHRvbl9jaGVja2VkJywgcm93KSB8fCAncmFkaW9fYnV0dG9uX2NoZWNrZWQnfX08L21hdC1pY29uPlxyXG5cdFx0XHRcdFx0XHRcdDwvYT5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBPdGhlciBjb2x1bW4gdHlwZXMgLS0+XHJcblx0XHRcdFx0XHRcdFx0PHNwYW4gKm5nU3dpdGNoRGVmYXVsdCBbaW5uZXJIdG1sXT1cInJvd1ZhbHVlPz8nJ1wiPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblx0XHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHQ8L3RkPlxyXG5cdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblxyXG5cdFx0PCEtLSAjcmVnaW9uIEZpbHRlciByb3cgLS0+XHJcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZGF0YVNvdXJjZSAmJiBmaWx0ZXJhYmxlXCI+XHJcblx0XHRcdDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbHVtbiBvZiBjb2x1bW5zJCB8IGFzeW5jXCI+XHJcblx0XHRcdFx0PG5nLWNvbnRhaW5lciBjZGtDb2x1bW5EZWY9XCJmaWx0ZXIue3tjb2x1bW4uZmlsdGVyIHx8IGNvbHVtbi5uYW1lfX1cIiBbc3RpY2t5XT1cImNvbHVtbi5zdGlja3lcIiBbc3RpY2t5RW5kXT1cImNvbHVtbi5zdGlja3lFbmRcIj5cclxuXHRcdFx0XHRcdDx0aCBtYXQtaGVhZGVyLWNlbGwgKmNka0hlYWRlckNlbGxEZWYgW2hpZGRlbl09XCJjb2x1bW4uaGlkZGVuXCIgW25nU3R5bGVdPVwie21heFdpZHRoOmNvbHVtbi5tYXhXaWR0aD8oY29sdW1uLm1heFdpZHRoKyhjb2x1bW4ubWF4V2lkdGhVbml0IHx8ICdweCcpKTpudWxsLG1pbldpZHRoOmNvbHVtbi5taW5XaWR0aD8oY29sdW1uLm1pbldpZHRoKyhjb2x1bW4ubWluV2lkdGhVbml0IHx8ICdweCcpKTpudWxsLHdpZHRoOmNvbHVtbi53aWR0aD8oY29sdW1uLndpZHRoKyhjb2x1bW4ud2lkdGhVbml0IHx8ICdweCcpKTpudWxsfVwiIFtuZ0NsYXNzXT1cInsnZ3QteHMnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlhzLCAnZ3Qtc20nOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlNtLCAnZ3QtbWQnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLk1kLCAnZ3QtbGcnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLkxnLCAnZ3QteGwnOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLlhsLCAnZ3QteHhsJzogY29sdW1uLmRpc3BsYXkgPT0gR3JpZC5YeGwsICdoaWRkZW4nOiBjb2x1bW4uZGlzcGxheSA9PSBHcmlkLk5vbmV9XCI+XHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBTZWxlY3QgZmlsdGVyIC0tPlxyXG5cdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cIihjb2x1bW4uZW5kcG9pbnQgfHwgY29sdW1uLmVudW1UeXBlIHx8IGNvbHVtbi5vcHRpb25zKSBlbHNlIG5vdFNlbGVjdEZpbHRlclwiIGZpbHRlci1zZWxlY3QgW2VuZHBvaW50XT1cImNvbHVtbi5lbmRwb2ludFwiIFtlbnVtXT1cImNvbHVtbi5lbnVtVHlwZVwiIFtlbnVtTWV0YWRhdGFdPVwiY29sdW1uLmVudW1NZXRhZGF0YVwiIFtlbnVtRmlsdGVyXT1cImNvbHVtbi5lbnVtRmlsdGVyIHwgZnVuYzp7fTpjb250ZXh0XCIgW3ByZWZpeF09XCJjb2x1bW4uZW51bVByZWZpeFwiIFtvcHRpb25zXT1cImNvbHVtbi5vcHRpb25zXCIgW3RleHRdPVwiY29sdW1uLmZpbHRlck9wdGlvblRleHQgfHwgJ25hbWUnXCI+PC9zcGFuPlxyXG5cdFx0XHRcdFx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0XHRcdFx0XHQ8IS0tICNyZWdpb24gVGV4dCBmaWx0ZXIgLS0+XHJcblx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjbm90U2VsZWN0RmlsdGVyPlxyXG5cdFx0XHRcdFx0XHRcdDxzcGFuICpuZ0lmPVwibm90U2VsZWN0RmlsdGVyICYmIChjb2x1bW4udHlwZSA9PSBDb2x1bW5UeXBlLlRleHQgfHwgY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5UZXh0SW5wdXQgfHwgY29sdW1uLnR5cGUgPT0gQ29sdW1uVHlwZS5OdW1iZXIpIGVsc2Ugbm90SW5wdXRGaWx0ZXJcIiBmaWx0ZXItaW5wdXQgW29ubHlOdW1iZXJdPVwiY29sdW1uLmZpbHRlcklucHV0TnVtYmVyPz9mYWxzZVwiIFtvcGVyYXRvcl09XCIhdXNlRmlsdGVyT3BlcmF0b3IgPyB1bmRlZmluZWQgOiBjb2x1bW4uZmlsdGVyT3BlcmF0b3JcIj48L3NwYW4+XHJcblx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBEYXRlIGZpbHRlciAtLT5cclxuXHRcdFx0XHRcdFx0PG5nLXRlbXBsYXRlICNub3RJbnB1dEZpbHRlcj5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImNvbHVtbi50eXBlID09IENvbHVtblR5cGUuRGF0ZSBlbHNlIG5vdERhdGVGaWx0ZXJcIiBmaWx0ZXItZGF0ZT48L3NwYW4+XHJcblx0XHRcdFx0XHRcdDwvbmctdGVtcGxhdGU+XHJcblx0XHRcdFx0XHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHRcdFx0XHRcdDwhLS0gI3JlZ2lvbiBBY3Rpb24gZmlsdGVyIChjbGVhcikgLS0+XHJcblx0XHRcdFx0XHRcdDxuZy10ZW1wbGF0ZSAjbm90RGF0ZUZpbHRlcj5cclxuXHRcdFx0XHRcdFx0XHQ8c3BhbiAqbmdJZj1cImNvbHVtbi50eXBlID09IENvbHVtblR5cGUuQWN0aW9uXCIgZmlsdGVyLWNsZWFyPjwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0PC9uZy10ZW1wbGF0ZT5cclxuXHRcdFx0XHRcdFx0PCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cdFx0XHRcdFx0PC90aD5cclxuXHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8L25nLWNvbnRhaW5lcj5cclxuXHRcdDwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcblx0XHQ8IS0tICNyZWdpb24gRGV0YWlscyBjb2x1bW4gLS0+XHJcblx0XHQ8bmctY29udGFpbmVyIGNka0NvbHVtbkRlZj1cImV4cGFuZGVkRGV0YWlsXCI+XHJcblx0XHRcdDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7IGxldCBpbmRleCA9IGluZGV4XCIgW2F0dHIuY29sc3Bhbl09XCIoZGlzcGxheWVkQ29sdW1ucyQgfCBhc3luYyk/Lmxlbmd0aFwiPlxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJyb3ctZGV0YWlsXCIgW0BkZXRhaWxFeHBhbmRdPVwicm93ID09IGV4cGFuZGVkUm93ID8gJ2V4cGFuZGVkJyA6ICdjb2xsYXBzZWQnXCIgI2RldGFpbHNUZW1wbGF0ZT5cclxuXHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJ0ZW1wbGF0ZVJlZiAmJiByb3cgPT09IGV4cGFuZGVkUm93XCI+XHJcblx0XHRcdFx0XHRcdDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0ZW1wbGF0ZVJlZjsgY29udGV4dDp7cm93OiByb3csIGluZGV4OiBpbmRleCwgY29udGV4dDogY29udGV4dH1cIj48L25nLWNvbnRhaW5lcj5cclxuXHRcdFx0XHRcdDwvbmctY29udGFpbmVyPlxyXG5cdFx0XHRcdDwvZGl2PlxyXG5cdFx0XHQ8L3RkPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0PCEtLSAjcmVnaW9uIEZpbHRlciBoZWFkZXIgLS0+XHJcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiZmlsdGVyYWJsZVwiPlxyXG5cdFx0XHQ8dHIgbWF0LWhlYWRlci1yb3cgKmNka0hlYWRlclJvd0RlZj1cImRpc3BsYXllZEZpbHRlckNvbHVtbnMkIHwgYXN5bmNcIj48L3RyPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblxyXG5cdFx0PHRyIG1hdC1oZWFkZXItcm93ICpjZGtIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zJCB8IGFzeW5jOyBzdGlja3k6IHN0aWNreUZpbHRlclwiPjwvdHI+XHJcblx0XHQ8dHIgbWF0LXJvdyAqY2RrUm93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucyQgfCBhc3luYzsgbGV0IGluZGV4ID0gZGF0YUluZGV4XCIgW25nQ2xhc3NdPVwicm93TmdDbGFzcz9yb3dOZ0NsYXNzKHJvdywgY29udGV4dCk6bnVsbFwiIFtjbGFzcy5leHBhbmRlZC1yb3ddPVwiZXhwYW5kZWRSb3cgPT09IHJvd1wiIChjbGljayk9XCJoYW5kbGVSb3dDbGljayhpbmRleCwgcm93KVwiIChjb250ZXh0bWVudSk9XCJoYW5kbGVSb3dSaWdodENsaWNrKCRldmVudCwgcm93KVwiPjwvdHI+XHJcblxyXG5cdFx0PCEtLSAjcmVnaW9uIERldHJhaWxzIHJvdyAtLT5cclxuXHRcdDxuZy1jb250YWluZXIgKm5nSWY9XCJkZXRhaWxzVGVtcGxhdGUgfHwgdGVtcGxhdGVSZWZcIj5cclxuXHRcdFx0PHRyIG1hdC1yb3cgKmNka1Jvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnZXhwYW5kZWREZXRhaWwnXVwiIGNsYXNzPVwiZGV0YWlsLXJvd1wiIFtuZ0NsYXNzXT1cInJvd05nQ2xhc3M/cm93TmdDbGFzcyhyb3csIGNvbnRleHQpOm51bGxcIj48L3RyPlxyXG5cdFx0PC9uZy1jb250YWluZXI+XHJcblx0XHQ8IS0tICNlbmRyZWdpb24gLS0+XHJcblx0PC90YWJsZT5cclxuPC9kaXY+XHJcbjwhLS0gI2VuZHJlZ2lvbiAtLT5cclxuXHJcbjwhLS0gI3JlZ2lvbiBSb3cgc2hvd24gd2hlbiB0aGVyZSBpcyBubyBtYXRjaGluZyBkYXRhLi0tPlxyXG48ZGl2IGNsYXNzPVwibWF0LWNlbGwgcGFkIHRhYmxlLWVtcHR5IHR4dC1pdGFsaWNcIiAqbmdJZj1cIiFkYXRhU291cmNlPy5maWx0ZXJlZERhdGE/Lmxlbmd0aCAmJiAhZGF0YVNvdXJjZT8udG90YWxcIiBpMThuPVwiQEBub1Jlc3VsdHNGb3VuZFwiPk5vIHJlc3VsdHMgd2VyZSBmb3VuZC48L2Rpdj5cclxuPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuPCEtLSAjcmVnaW9uIERlYnVnIHZhbHVlIC0tPlxyXG48Y29kZSAqbmdJZj1cImRlYnVnVmFsdWVcIj5cclxuXHQ8cHJlPnt7Zm9ybVZhbHVlIHwganNvbn19PC9wcmU+XHJcbjwvY29kZT5cclxuPCEtLSAjZW5kcmVnaW9uIC0tPlxyXG5cclxuPGRpdiBjbGFzcz1cInRhYmxlLWZvb3RlclwiIGxheW91dD1cInJvd1wiPlxyXG5cdDxuZy1jb250ZW50IHNlbGVjdD1cIlt0YWJsZS1mb290ZXJdXCI+PC9uZy1jb250ZW50PlxyXG5cdDxzcGFuIGZsZXg+PC9zcGFuPlxyXG5cdDxtYXQtcGFnaW5hdG9yICpuZ0lmPVwicGFnaW5hYmxlXCIgW3BhZ2VTaXplXT1cInBhZ2VTaXplXCIgW3BhZ2VTaXplT3B0aW9uc109XCJwYWdlU2l6ZU9wdGlvbnNcIiBzaG93Rmlyc3RMYXN0QnV0dG9ucz1cInRydWVcIj48L21hdC1wYWdpbmF0b3I+XHJcbjwvZGl2PiJdfQ==
|