@dsivd/prestations-ng 17.10.9 → 18.0.0-beta.10
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/CHANGELOG.md +2478 -2466
- package/CONTRIBUTING.md +66 -66
- package/ESLINT_MIGRATION_GUIDE.md +19 -33
- package/MODULES.md +88 -88
- package/MULTI_ETAPES.md +9 -9
- package/README.md +25 -24
- package/README_COMMON.md +10 -10
- package/UPGRADING_V12.md +36 -36
- package/UPGRADING_V13.md +3 -3
- package/UPGRADING_V14.md +2 -2
- package/UPGRADING_V15.md +4 -4
- package/UPGRADING_V16.md +38 -38
- package/UPGRADING_V17.md +51 -51
- package/UPGRADING_V18.md +596 -8
- package/UPGRADING_V8.md +5 -5
- package/abstract-page-component.d.ts +1 -1
- package/dsivd-prestations-ng-18.0.0-beta.10.tgz +0 -0
- package/fesm2022/dsivd-prestations-ng.mjs +903 -868
- package/fesm2022/dsivd-prestations-ng.mjs.map +1 -1
- package/foehn-checkables/foehn-checkable-group.component.d.ts +1 -1
- package/foehn-checkables/foehn-checkables.module.d.ts +6 -7
- package/foehn-date-picker/date-picker.helper.d.ts +1 -1
- package/foehn-icons/abstract-icon-component.d.ts +1 -1
- package/foehn-input/foehn-input-string.component.d.ts +1 -1
- package/foehn-input/foehn-input.component.d.ts +1 -1
- package/foehn-menu-prestation/abstract-list-item-detail-page.component.d.ts +1 -1
- package/foehn-menu-prestation/abstract-menu-page.component.d.ts +1 -1
- package/foehn-menu-prestation/abstract-page-from-menu.component.d.ts +1 -1
- package/foehn-navigation/abstract-foehn-navigation.component.d.ts +1 -1
- package/foehn-table/foehn-table.component.d.ts +1 -6
- package/foehn-upload/abstract-foehn-uploader.component.d.ts +1 -2
- package/foehn-upload/foehn-picture-upload/foehn-picture-upload.component.d.ts +1 -3
- package/foehn-upload/foehn-picture-upload/foehn-picture-upload.module.d.ts +1 -1
- package/index.d.ts +1 -1
- package/index.html +1 -1
- package/package.json +15 -17
- package/prestations-ng-core.module.d.ts +5 -4
- package/sdk-appinfo/application-info.service.d.ts +1 -0
- package/sdk-drafts/drafts.module.d.ts +7 -8
- package/sdk-support-alert/support-alert.module.d.ts +2 -3
- package/dsivd-prestations-ng-17.10.9.tgz +0 -0
- package/esm2022/abstract-page-component.mjs +0 -232
- package/esm2022/directives/currency-formatter.directive.mjs +0 -143
- package/esm2022/directives/formatter.module.mjs +0 -37
- package/esm2022/directives/iban-formatter.directive.mjs +0 -29
- package/esm2022/directives/ide-formatter.directive.mjs +0 -37
- package/esm2022/directives/ndc-formatter.directive.mjs +0 -75
- package/esm2022/dsivd-prestations-ng.mjs +0 -5
- package/esm2022/foehn-address/address.type.mjs +0 -10
- package/esm2022/foehn-address/foehn-address.module.mjs +0 -55
- package/esm2022/foehn-address/foehn-display-address.component.mjs +0 -69
- package/esm2022/foehn-address/foehn-input-address.component.mjs +0 -498
- package/esm2022/foehn-address/foehn-input-foreign-locality.component.mjs +0 -66
- package/esm2022/foehn-address/foehn-input-foreign-street.component.mjs +0 -56
- package/esm2022/foehn-agenda/calendar.type.mjs +0 -3
- package/esm2022/foehn-agenda/current-week.type.mjs +0 -4
- package/esm2022/foehn-agenda/day-slots.type.mjs +0 -3
- package/esm2022/foehn-agenda/foehn-agenda-navigation/foehn-agenda-navigation.component.mjs +0 -75
- package/esm2022/foehn-agenda/foehn-agenda-timeslot-panel/foehn-agenda-timeslot-panel.component.mjs +0 -242
- package/esm2022/foehn-agenda/foehn-agenda.component.mjs +0 -95
- package/esm2022/foehn-agenda/foehn-agenda.module.mjs +0 -62
- package/esm2022/foehn-agenda/pagination-week.type.mjs +0 -3
- package/esm2022/foehn-agenda/selected-slot.type.mjs +0 -3
- package/esm2022/foehn-autocomplete/foehn-autocomplete.component.mjs +0 -684
- package/esm2022/foehn-autocomplete/foehn-autocomplete.module.mjs +0 -40
- package/esm2022/foehn-boolean/foehn-boolean-checkbox.component.mjs +0 -28
- package/esm2022/foehn-boolean/foehn-boolean-radio.component.mjs +0 -40
- package/esm2022/foehn-boolean/foehn-boolean.module.mjs +0 -33
- package/esm2022/foehn-breadcrumb/breadcrumb-event.service.mjs +0 -177
- package/esm2022/foehn-breadcrumb/breadcrumb.mjs +0 -5
- package/esm2022/foehn-breadcrumb/foehn-breadcrumb.component.mjs +0 -106
- package/esm2022/foehn-breadcrumb/foehn-breadcrumb.module.mjs +0 -20
- package/esm2022/foehn-checkables/foehn-checkable-group.component.mjs +0 -291
- package/esm2022/foehn-checkables/foehn-checkables.module.mjs +0 -68
- package/esm2022/foehn-checkables/foehn-checkbox.component.mjs +0 -37
- package/esm2022/foehn-checkables/foehn-radio.component.mjs +0 -64
- package/esm2022/foehn-checkables/foehn-select.component.mjs +0 -55
- package/esm2022/foehn-checkables/form-select-option-group.mjs +0 -3
- package/esm2022/foehn-checkables/form-select-option.mjs +0 -3
- package/esm2022/foehn-confirm-modal/foehn-confirm-modal-content.mjs +0 -7
- package/esm2022/foehn-confirm-modal/foehn-confirm-modal.component.mjs +0 -40
- package/esm2022/foehn-confirm-modal/foehn-confirm-modal.module.mjs +0 -19
- package/esm2022/foehn-confirm-modal/foehn-confirm-modal.service.mjs +0 -53
- package/esm2022/foehn-date-picker/date-picker-navigation.helper.mjs +0 -168
- package/esm2022/foehn-date-picker/date-picker.helper.mjs +0 -132
- package/esm2022/foehn-date-picker/day-month.type.mjs +0 -3
- package/esm2022/foehn-date-picker/focused-day.type.mjs +0 -3
- package/esm2022/foehn-date-picker/foehn-date-picker.component.mjs +0 -392
- package/esm2022/foehn-date-picker/foehn-date-picker.module.mjs +0 -40
- package/esm2022/foehn-date-picker/month-year.type.mjs +0 -3
- package/esm2022/foehn-date-picker-button/foehn-date-picker-button.component.mjs +0 -97
- package/esm2022/foehn-date-picker-button/foehn-date-picker-button.module.mjs +0 -36
- package/esm2022/foehn-debug-summary/foehn-debug-summary.component.mjs +0 -84
- package/esm2022/foehn-debug-summary/foehn-debug-summary.component.module.mjs +0 -20
- package/esm2022/foehn-decision-electronique/foehn-decision-electronique.component.mjs +0 -37
- package/esm2022/foehn-decision-electronique/foehn-decision-electronique.module.mjs +0 -32
- package/esm2022/foehn-dropdown-menu/dropdown-menu-group.type.mjs +0 -3
- package/esm2022/foehn-dropdown-menu/dropdown-menu-item.type.mjs +0 -6
- package/esm2022/foehn-dropdown-menu/foehn-dropdown-menu.component.mjs +0 -212
- package/esm2022/foehn-dropdown-menu/foehn-dropdown-menu.module.mjs +0 -21
- package/esm2022/foehn-feedback-notification/foehn-feedback-notification.component.mjs +0 -113
- package/esm2022/foehn-feedback-notification/foehn-feedback-notification.module.mjs +0 -32
- package/esm2022/foehn-feedback-notification/foehn-feedback-notification.type.mjs +0 -3
- package/esm2022/foehn-footer/foehn-footer.component.mjs +0 -130
- package/esm2022/foehn-footer/foehn-footer.module.mjs +0 -19
- package/esm2022/foehn-footer/footer-link.type.mjs +0 -3
- package/esm2022/foehn-form/foehn-form.component.mjs +0 -136
- package/esm2022/foehn-form/foehn-form.module.mjs +0 -32
- package/esm2022/foehn-form/register-ng-model.service.mjs +0 -23
- package/esm2022/foehn-growl/foehn-growl.component.mjs +0 -45
- package/esm2022/foehn-growl/foehn-growl.module.mjs +0 -18
- package/esm2022/foehn-growl/growl-broker.service.mjs +0 -37
- package/esm2022/foehn-growl/growl-message.mjs +0 -9
- package/esm2022/foehn-growl/growl-types.mjs +0 -7
- package/esm2022/foehn-header/foehn-header.component.mjs +0 -159
- package/esm2022/foehn-header/foehn-header.module.mjs +0 -40
- package/esm2022/foehn-header/foehn-skip-link.component.mjs +0 -51
- package/esm2022/foehn-help-modal/foehn-help-modal.component.mjs +0 -44
- package/esm2022/foehn-help-modal/foehn-help-modal.module.mjs +0 -20
- package/esm2022/foehn-help-modal/foehn-help-modal.type.mjs +0 -2
- package/esm2022/foehn-icons/abstract-icon-component.mjs +0 -12
- package/esm2022/foehn-icons/foehn-icon-calendar.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-check-square-o.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-check.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-chevron-down.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-chevron-left.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-chevron-right.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-chevron-up.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-clock.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-comment-dots.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-edit.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-external-link-alt.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-file-pdf.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-info-circle.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-lock.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-map-marker.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-minus-circle.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-pencil.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-plus-circle.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-plus-square.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-search.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-times.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-trash-alt.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-unlock-alt.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icon-user.component.mjs +0 -19
- package/esm2022/foehn-icons/foehn-icons.module.mjs +0 -139
- package/esm2022/foehn-input/foehn-input-email.component.mjs +0 -74
- package/esm2022/foehn-input/foehn-input-hidden.component.mjs +0 -54
- package/esm2022/foehn-input/foehn-input-number.component.mjs +0 -319
- package/esm2022/foehn-input/foehn-input-password.component.mjs +0 -51
- package/esm2022/foehn-input/foehn-input-phone.component.mjs +0 -99
- package/esm2022/foehn-input/foehn-input-prefixed-text.component.mjs +0 -116
- package/esm2022/foehn-input/foehn-input-string.component.mjs +0 -27
- package/esm2022/foehn-input/foehn-input-text.component.mjs +0 -69
- package/esm2022/foehn-input/foehn-input-textarea.component.mjs +0 -97
- package/esm2022/foehn-input/foehn-input.component.mjs +0 -418
- package/esm2022/foehn-input/foehn-input.module.mjs +0 -98
- package/esm2022/foehn-input/pattern.const.mjs +0 -16
- package/esm2022/foehn-input-date/foehn-input-date.component.mjs +0 -163
- package/esm2022/foehn-input-date-time/foehn-input-date-time.component.mjs +0 -201
- package/esm2022/foehn-input-time/foehn-input-time.component.mjs +0 -89
- package/esm2022/foehn-list/foehn-list.component.mjs +0 -127
- package/esm2022/foehn-list/foehn-list.module.mjs +0 -19
- package/esm2022/foehn-list/page-change-event.mjs +0 -3
- package/esm2022/foehn-menu-prestation/abstract-list-item-detail-page.component.mjs +0 -122
- package/esm2022/foehn-menu-prestation/abstract-menu-page.component.mjs +0 -31
- package/esm2022/foehn-menu-prestation/abstract-page-from-menu.component.mjs +0 -87
- package/esm2022/foehn-menu-prestation/foehn-error-pill/foehn-error-pill.component.mjs +0 -25
- package/esm2022/foehn-menu-prestation/foehn-list-summary/foehn-list-item-description.mjs +0 -2
- package/esm2022/foehn-menu-prestation/foehn-list-summary/foehn-list-item.mjs +0 -3
- package/esm2022/foehn-menu-prestation/foehn-list-summary/foehn-list-summary.component.mjs +0 -161
- package/esm2022/foehn-menu-prestation/foehn-menu-items/foehn-menu-item/foehn-menu-item.component.mjs +0 -38
- package/esm2022/foehn-menu-prestation/foehn-menu-items/foehn-menu-item-transmit/foehn-menu-item-transmit.component.mjs +0 -58
- package/esm2022/foehn-menu-prestation/foehn-menu-prestation.module.mjs +0 -67
- package/esm2022/foehn-misc/foehn-abbr.component.mjs +0 -15
- package/esm2022/foehn-misc/foehn-misc.module.mjs +0 -17
- package/esm2022/foehn-modal/foehn-modal.component.mjs +0 -94
- package/esm2022/foehn-modal/foehn-modal.module.mjs +0 -21
- package/esm2022/foehn-multiselect-autocomplete/foehn-multiselect-autocomplete.component.mjs +0 -287
- package/esm2022/foehn-multiselect-autocomplete/foehn-multiselect-autocomplete.module.mjs +0 -40
- package/esm2022/foehn-nav13/foehn-input-nav13.component.mjs +0 -114
- package/esm2022/foehn-nav13/foehn-input-nav13.module.mjs +0 -32
- package/esm2022/foehn-navigation/abstract-foehn-navigation.component.mjs +0 -55
- package/esm2022/foehn-navigation/foehn-navigation/foehn-navigation.component.mjs +0 -67
- package/esm2022/foehn-navigation/foehn-navigation.module.mjs +0 -37
- package/esm2022/foehn-navigation/foehn-navigation.service.mjs +0 -322
- package/esm2022/foehn-navigation/foehn-simple-navigation/foehn-simple-navigation.component.mjs +0 -26
- package/esm2022/foehn-notfound/foehn-notfound.component.mjs +0 -61
- package/esm2022/foehn-notfound/foehn-notfound.module.mjs +0 -20
- package/esm2022/foehn-page/foehn-page-counter.component.mjs +0 -31
- package/esm2022/foehn-page/foehn-page-expiration-timer/current-session-expiration.mjs +0 -3
- package/esm2022/foehn-page/foehn-page-expiration-timer/demande-expiration-interceptor.mjs +0 -68
- package/esm2022/foehn-page/foehn-page-expiration-timer/demande-expiration.service.mjs +0 -53
- package/esm2022/foehn-page/foehn-page-expiration-timer/foehn-page-expiration-timer.component.mjs +0 -175
- package/esm2022/foehn-page/foehn-page-expiration-timer/interval.helper.mjs +0 -29
- package/esm2022/foehn-page/foehn-page-modal.component.mjs +0 -54
- package/esm2022/foehn-page/foehn-page-modal.service.mjs +0 -38
- package/esm2022/foehn-page/foehn-page.component.mjs +0 -223
- package/esm2022/foehn-page/foehn-page.module.mjs +0 -101
- package/esm2022/foehn-page/foehn-page.service.mjs +0 -54
- package/esm2022/foehn-page/foehn-transmit-waiting-modal/demande-transmit-interceptor.mjs +0 -52
- package/esm2022/foehn-page/foehn-transmit-waiting-modal/foehn-transmit-waiting-modal.component.mjs +0 -23
- package/esm2022/foehn-page/foehn-transmit-waiting-modal/foehn-transmit-waiting-modal.service.mjs +0 -32
- package/esm2022/foehn-recap-section/foehn-recap-section.component.mjs +0 -98
- package/esm2022/foehn-recap-section/foehn-recap-section.module.mjs +0 -20
- package/esm2022/foehn-recap-section/foehn-recap-section.type.mjs +0 -2
- package/esm2022/foehn-remaining-alerts-summary/foehn-remaining-alerts-summary.component.mjs +0 -50
- package/esm2022/foehn-remaining-alerts-summary/foehn-remaining-alerts-summary.module.mjs +0 -18
- package/esm2022/foehn-status-progress-bar/foehn-status-progress-bar.component.mjs +0 -56
- package/esm2022/foehn-status-progress-bar/foehn-status-progress-bar.module.mjs +0 -20
- package/esm2022/foehn-table/foehn-table-column-configuration.mjs +0 -3
- package/esm2022/foehn-table/foehn-table-page-change-event.mjs +0 -3
- package/esm2022/foehn-table/foehn-table.component.mjs +0 -190
- package/esm2022/foehn-table/foehn-table.module.mjs +0 -40
- package/esm2022/foehn-table/row-element.type.mjs +0 -3
- package/esm2022/foehn-table/tableSort.mjs +0 -3
- package/esm2022/foehn-upload/abstract-foehn-uploader.component.mjs +0 -242
- package/esm2022/foehn-upload/document-reference.mjs +0 -6
- package/esm2022/foehn-upload/foehn-bo-multi-upload/bo-multi-upload.service.mjs +0 -116
- package/esm2022/foehn-upload/foehn-bo-multi-upload/bo-multi-upload.type.mjs +0 -6
- package/esm2022/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.component.mjs +0 -199
- package/esm2022/foehn-upload/foehn-bo-multi-upload/foehn-bo-multi-upload.module.mjs +0 -40
- package/esm2022/foehn-upload/foehn-multi-upload/foehn-multi-upload.component.mjs +0 -250
- package/esm2022/foehn-upload/foehn-multi-upload/foehn-multi-upload.module.mjs +0 -40
- package/esm2022/foehn-upload/foehn-multi-upload/multi-upload.service.mjs +0 -125
- package/esm2022/foehn-upload/foehn-multi-upload/multi-upload.type.mjs +0 -6
- package/esm2022/foehn-upload/foehn-multi-upload/pending-upload.service.mjs +0 -163
- package/esm2022/foehn-upload/foehn-picture-upload/foehn-picture-upload.component.mjs +0 -178
- package/esm2022/foehn-upload/foehn-picture-upload/foehn-picture-upload.module.mjs +0 -44
- package/esm2022/foehn-upload/foehn-upload-progress-bar/foehn-upload-progress-bar.component.mjs +0 -83
- package/esm2022/foehn-upload/foehn-upload-progress-bar/foehn-upload-progress-bar.module.mjs +0 -21
- package/esm2022/foehn-upload/foehn-upload-progress-bar/upload-progress.service.mjs +0 -66
- package/esm2022/foehn-upload/foehn-upload-progress-bar/upload-progress.type.mjs +0 -7
- package/esm2022/foehn-upload/page-upload-limit.service.mjs +0 -80
- package/esm2022/foehn-upload/pending-upload.type.mjs +0 -3
- package/esm2022/foehn-upload/uploader.helper.mjs +0 -329
- package/esm2022/foehn-user-connected-as/foehn-user-connected-as.component.mjs +0 -21
- package/esm2022/foehn-user-connected-as/foehn-user-connected-as.module.mjs +0 -19
- package/esm2022/foehn-validation-alert-summary/foehn-validation-alert-summary.component.mjs +0 -96
- package/esm2022/foehn-validation-alert-summary/foehn-validation-alert-summary.module.mjs +0 -19
- package/esm2022/foehn-validation-alerts/foehn-validation-alerts.component.mjs +0 -29
- package/esm2022/foehn-validation-alerts/foehn-validation-alerts.module.mjs +0 -18
- package/esm2022/form-error.mjs +0 -2
- package/esm2022/form-post-response.mjs +0 -10
- package/esm2022/gesdem/gesdem-error-handler.service.mjs +0 -85
- package/esm2022/gesdem/gesdem-event.service.mjs +0 -38
- package/esm2022/gesdem/gesdem-handler.service.mjs +0 -201
- package/esm2022/gesdem/gesdem-loader.guard.mjs +0 -25
- package/esm2022/gesdem/gesdem-statut-utils.mjs +0 -25
- package/esm2022/gesdem-action-recovery/gesdem-action-recovery-login/gesdem-action-recovery-login.component.mjs +0 -170
- package/esm2022/gesdem-action-recovery/gesdem-action-recovery-registration/gesdem-action-recovery-registration.component.mjs +0 -227
- package/esm2022/gesdem-action-recovery/gesdem-action-recovery.module.mjs +0 -62
- package/esm2022/gesdem-action-recovery/gesdem-action-recovery.service.mjs +0 -97
- package/esm2022/gesdem-action-recovery/reprise-info.mjs +0 -4
- package/esm2022/gesdem-confirmation/gesdem-confirmation.component.mjs +0 -241
- package/esm2022/gesdem-confirmation/gesdem-confirmation.module.mjs +0 -36
- package/esm2022/gesdem-error/gesdem-error.component.mjs +0 -96
- package/esm2022/gesdem-error/gesdem-error.module.mjs +0 -36
- package/esm2022/global.const.mjs +0 -5
- package/esm2022/helpers/demande.helper.mjs +0 -19
- package/esm2022/helpers/object.helper.mjs +0 -124
- package/esm2022/i18n-form.mjs +0 -7
- package/esm2022/pipes/currency.pipe.mjs +0 -18
- package/esm2022/pipes/date.pipe.mjs +0 -43
- package/esm2022/pipes/formatIde.pipe.mjs +0 -22
- package/esm2022/pipes/pipes.module.mjs +0 -18
- package/esm2022/prestations-ng-core.module.mjs +0 -31
- package/esm2022/public_api.mjs +0 -288
- package/esm2022/refinf/model/address-type-light.mjs +0 -3
- package/esm2022/refinf/model/canton.mjs +0 -3
- package/esm2022/refinf/model/district.mjs +0 -3
- package/esm2022/refinf/model/municipality.mjs +0 -3
- package/esm2022/refinf/model/place-of-origin.mjs +0 -3
- package/esm2022/refinf/model/postal-locality.mjs +0 -3
- package/esm2022/sdk-appinfo/application-info.mjs +0 -22
- package/esm2022/sdk-appinfo/application-info.service.mjs +0 -146
- package/esm2022/sdk-currency/currency.helper.mjs +0 -34
- package/esm2022/sdk-date/date.helper.mjs +0 -109
- package/esm2022/sdk-dictionary/default-dictionary.mjs +0 -312
- package/esm2022/sdk-dictionary/sdk-dictionary.module.mjs +0 -16
- package/esm2022/sdk-dictionary/sdk-dictionary.pipe.mjs +0 -28
- package/esm2022/sdk-dictionary/sdk-dictionary.service.mjs +0 -122
- package/esm2022/sdk-drafts/draft.model.mjs +0 -2
- package/esm2022/sdk-drafts/drafts-container.component.mjs +0 -99
- package/esm2022/sdk-drafts/drafts.module.mjs +0 -47
- package/esm2022/sdk-drafts/drafts.service.mjs +0 -51
- package/esm2022/sdk-epayment/model/EPaymentParameters.mjs +0 -2
- package/esm2022/sdk-epayment/pending-payment/pending-payment.component.mjs +0 -24
- package/esm2022/sdk-epayment/sdk-epayment.component.mjs +0 -76
- package/esm2022/sdk-epayment/sdk-epayment.module.mjs +0 -23
- package/esm2022/sdk-epayment/sdk-epayment.service.mjs +0 -51
- package/esm2022/sdk-events-logger/sdk-event-type.mjs +0 -14
- package/esm2022/sdk-events-logger/sdk-event.mjs +0 -3
- package/esm2022/sdk-events-logger/sdk-events-logger.service.mjs +0 -43
- package/esm2022/sdk-recaptcha/grecaptcha/grecaptcha.component.mjs +0 -113
- package/esm2022/sdk-recaptcha/recaptcha.service.mjs +0 -180
- package/esm2022/sdk-recaptcha/sdk-recaptcha.component.mjs +0 -75
- package/esm2022/sdk-recaptcha/sdk-recaptcha.module.mjs +0 -19
- package/esm2022/sdk-redirect/iam-expired-interceptor.service.mjs +0 -62
- package/esm2022/sdk-redirect/redirect.component.mjs +0 -55
- package/esm2022/sdk-redirect/sdk-redirect.module.mjs +0 -19
- package/esm2022/sdk-session-info/session-info-data.mjs +0 -6
- package/esm2022/sdk-session-info/session-info-with-application.service.mjs +0 -68
- package/esm2022/sdk-session-info/session-info.service.mjs +0 -50
- package/esm2022/sdk-statistics/sdk-statistics.service.mjs +0 -74
- package/esm2022/sdk-support-alert/support-alert-container.component.mjs +0 -49
- package/esm2022/sdk-support-alert/support-alert.component.mjs +0 -32
- package/esm2022/sdk-support-alert/support-alert.model.mjs +0 -7
- package/esm2022/sdk-support-alert/support-alert.module.mjs +0 -21
- package/esm2022/sdk-support-alert/support-alert.service.mjs +0 -139
- package/esm2022/service-locator.mjs +0 -4
- package/esm2022/supported-browser.mjs +0 -2
- package/esm2022/validation/validation-handler.service.mjs +0 -44
- /package/{public_api.d.ts → public-api.d.ts} +0 -0
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
import { Directive, ViewChild } from '@angular/core';
|
|
2
|
-
import { ActivatedRoute } from '@angular/router';
|
|
3
|
-
import { EMPTY, of } from 'rxjs';
|
|
4
|
-
import { catchError, first, mergeMap, share, tap, throttleTime } from 'rxjs/operators';
|
|
5
|
-
import { BreadcrumbEventService } from './foehn-breadcrumb/breadcrumb-event.service';
|
|
6
|
-
import { FoehnFormComponent } from './foehn-form/foehn-form.component';
|
|
7
|
-
import { GrowlBrokerService } from './foehn-growl/growl-broker.service';
|
|
8
|
-
import { FoehnNavigationService } from './foehn-navigation/foehn-navigation.service';
|
|
9
|
-
import { FoehnPageService } from './foehn-page/foehn-page.service';
|
|
10
|
-
import { PendingUploadService } from './foehn-upload/foehn-multi-upload/pending-upload.service';
|
|
11
|
-
import { GesdemEventService } from './gesdem/gesdem-event.service';
|
|
12
|
-
import { GesdemHandlerService } from './gesdem/gesdem-handler.service';
|
|
13
|
-
import { ActionStatut, GesdemStatutUtils } from './gesdem/gesdem-statut-utils';
|
|
14
|
-
import { SdkDictionaryService } from './sdk-dictionary/sdk-dictionary.service';
|
|
15
|
-
import { SdkEventType } from './sdk-events-logger/sdk-event-type';
|
|
16
|
-
import { SdkEventsLoggerService } from './sdk-events-logger/sdk-events-logger.service';
|
|
17
|
-
import { ServiceLocator } from './service-locator';
|
|
18
|
-
import { ValidationHandlerService } from './validation/validation-handler.service';
|
|
19
|
-
import * as i0 from "@angular/core";
|
|
20
|
-
import * as i1 from "@angular/router";
|
|
21
|
-
/**
|
|
22
|
-
* Ensures that a call is only subscribed and send one at the time.
|
|
23
|
-
* @param fn function to be called as concurrent safe
|
|
24
|
-
* @returns Observable
|
|
25
|
-
*/
|
|
26
|
-
function getConcurrentSafeCall(fn) {
|
|
27
|
-
return of(true).pipe(
|
|
28
|
-
// To guard against double-click
|
|
29
|
-
throttleTime(200),
|
|
30
|
-
// flatmap(fn, 1) ensures that only one query is ran at the same time
|
|
31
|
-
mergeMap(fn, 1),
|
|
32
|
-
// As this observable is used as a Promise (with subscribe), this ensures that
|
|
33
|
-
// the operators above can be shared between each subscribe.
|
|
34
|
-
share());
|
|
35
|
-
}
|
|
36
|
-
export class AbstractPageComponent {
|
|
37
|
-
constructor(activatedRoute) {
|
|
38
|
-
this.activatedRoute = activatedRoute;
|
|
39
|
-
this._gesdemService = ServiceLocator.injector.get(GesdemHandlerService);
|
|
40
|
-
this._gesdemEventService =
|
|
41
|
-
ServiceLocator.injector.get(GesdemEventService);
|
|
42
|
-
this._navigation = ServiceLocator.injector.get(FoehnNavigationService);
|
|
43
|
-
this._activatedRoute = ServiceLocator.injector.get(ActivatedRoute);
|
|
44
|
-
this._growlService = ServiceLocator.injector.get(GrowlBrokerService);
|
|
45
|
-
this._validationHandlerService = ServiceLocator.injector.get(ValidationHandlerService);
|
|
46
|
-
this._pendingUploadService =
|
|
47
|
-
ServiceLocator.injector.get(PendingUploadService);
|
|
48
|
-
this._breadcrumbEventService = ServiceLocator.injector.get(BreadcrumbEventService);
|
|
49
|
-
this._foehnPageService = ServiceLocator.injector.get(FoehnPageService);
|
|
50
|
-
this._dictionaryService =
|
|
51
|
-
ServiceLocator.injector.get(SdkDictionaryService);
|
|
52
|
-
this._eventsLoggerService = ServiceLocator.injector.get(SdkEventsLoggerService);
|
|
53
|
-
const route = FoehnNavigationService.getRootRouteRecursive(activatedRoute.snapshot);
|
|
54
|
-
this._navigation.initRoute(route);
|
|
55
|
-
this._formInitSubscription = this._gesdemEventService
|
|
56
|
-
.formInitializationObservable()
|
|
57
|
-
.subscribe(() => {
|
|
58
|
-
this.reference =
|
|
59
|
-
this._gesdemService.lastResponse &&
|
|
60
|
-
this._gesdemService.lastResponse.meta.reference;
|
|
61
|
-
const statut = this._gesdemService.lastResponse &&
|
|
62
|
-
this._gesdemService.lastResponse.meta.statut;
|
|
63
|
-
const shouldPreventNavigationToLast = activatedRoute.snapshot.data
|
|
64
|
-
.preventNavigationToLastOnTransferred === true;
|
|
65
|
-
const languageCode = this._gesdemService.lastResponse &&
|
|
66
|
-
this._gesdemService.lastResponse.form &&
|
|
67
|
-
this._gesdemService.lastResponse.form.language;
|
|
68
|
-
this._dictionaryService.changeLanguage(languageCode);
|
|
69
|
-
if (!shouldPreventNavigationToLast &&
|
|
70
|
-
this.reference &&
|
|
71
|
-
GesdemStatutUtils.isFinal(ActionStatut[statut])) {
|
|
72
|
-
this._navigation.last();
|
|
73
|
-
}
|
|
74
|
-
if (this.reference &&
|
|
75
|
-
ActionStatut[statut] ===
|
|
76
|
-
ActionStatut.PENDING_PAYMENT) {
|
|
77
|
-
this._navigation.recap();
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
// Protects the transmit method on the GesdemService from concurrent access.
|
|
81
|
-
this._transmitConcurrentSafe = getConcurrentSafeCall(() => this._gesdemService.transmit());
|
|
82
|
-
}
|
|
83
|
-
ngOnInit() {
|
|
84
|
-
this.gotToTop();
|
|
85
|
-
this.form = this.newForm();
|
|
86
|
-
this._currentLangSubscription = this._dictionaryService
|
|
87
|
-
.getCurrentLanguageCode()
|
|
88
|
-
.subscribe(languageCode => {
|
|
89
|
-
this.form.language = languageCode;
|
|
90
|
-
});
|
|
91
|
-
this._validationHandlerService.shouldDisplayErrors(false);
|
|
92
|
-
this.updateFormDataSubjectSubscription =
|
|
93
|
-
this._gesdemService.updateFormDataSubject.subscribe(form => {
|
|
94
|
-
this.form = form;
|
|
95
|
-
this._gesdemEventService.formInitializationSubject.next(form);
|
|
96
|
-
});
|
|
97
|
-
this.attachmentsMultiUploadedSubscription =
|
|
98
|
-
this._pendingUploadService.attachmentsUploaded.subscribe(form => {
|
|
99
|
-
this.form = form;
|
|
100
|
-
// PRESTAKIT-309: set back shouldDisplayErrors to true once files have been uploaded
|
|
101
|
-
this._validationHandlerService.shouldDisplayErrors(true);
|
|
102
|
-
this.onFormSent(true);
|
|
103
|
-
});
|
|
104
|
-
this.saveFormRequestSubscription = this._foehnPageService
|
|
105
|
-
.saveFormRequest()
|
|
106
|
-
.subscribe(displaySuccessMessage => this.send(false, displaySuccessMessage));
|
|
107
|
-
}
|
|
108
|
-
ngAfterViewInit() {
|
|
109
|
-
// @see https://github.com/angular/angular/issues/17572#issuecomment-323465737
|
|
110
|
-
Promise.resolve(null).then(() => {
|
|
111
|
-
this._gesdemService.require().subscribe();
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
ngOnDestroy() {
|
|
115
|
-
this._currentLangSubscription?.unsubscribe();
|
|
116
|
-
this.pageTitleSubscription?.unsubscribe();
|
|
117
|
-
this.updateFormDataSubjectSubscription?.unsubscribe();
|
|
118
|
-
this.attachmentsSingleUploadedSubscription?.unsubscribe();
|
|
119
|
-
this.attachmentsMultiUploadedSubscription?.unsubscribe();
|
|
120
|
-
this._formInitSubscription?.unsubscribe();
|
|
121
|
-
this.saveFormRequestSubscription?.unsubscribe();
|
|
122
|
-
}
|
|
123
|
-
send(goToNextPage = true, displaySuccessMessage = true) {
|
|
124
|
-
if (this._pendingUploadService.hasPendingFiles()) {
|
|
125
|
-
goToNextPage = false;
|
|
126
|
-
// PRESTAKIT-309: shouldDisplayErrors will be set back to true in 'attachmentsUploaded' subscription
|
|
127
|
-
}
|
|
128
|
-
else {
|
|
129
|
-
this._validationHandlerService.shouldDisplayErrors(true);
|
|
130
|
-
}
|
|
131
|
-
if (!this._gesdemSaveSubscription) {
|
|
132
|
-
// Protects the save method on the GesdemService from concurrent access.
|
|
133
|
-
const canCreateDemande = this._navigation.isFirstFormPage() &&
|
|
134
|
-
!this._gesdemService.lastResponse?.meta?.reference?.length;
|
|
135
|
-
this._gesdemSaveSubscription = this._gesdemService
|
|
136
|
-
.save(this.form, canCreateDemande, displaySuccessMessage)
|
|
137
|
-
.subscribe(() => {
|
|
138
|
-
this._gesdemSaveSubscription = null;
|
|
139
|
-
this.onFormSent(goToNextPage);
|
|
140
|
-
});
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
transmit() {
|
|
144
|
-
this._validationHandlerService.shouldDisplayErrors(true);
|
|
145
|
-
this._transmitConcurrentSafe
|
|
146
|
-
.pipe(tap(() => this._eventsLoggerService.addEvent(SdkEventType.TRANSMIT)), catchError((error) => {
|
|
147
|
-
console.error(error);
|
|
148
|
-
return EMPTY;
|
|
149
|
-
}))
|
|
150
|
-
.subscribe(() => {
|
|
151
|
-
if (!this._gesdemService.lastResponse.errors.length) {
|
|
152
|
-
this._gesdemEventService.formTransmittedSubject.next(this._gesdemService.lastResponse);
|
|
153
|
-
this._navigation.next();
|
|
154
|
-
}
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
sendAndTransmit(displaySuccessMessage = true) {
|
|
158
|
-
this._gesdemEventService
|
|
159
|
-
.formSentObservable()
|
|
160
|
-
.pipe(first())
|
|
161
|
-
.subscribe(response => {
|
|
162
|
-
if (!response.errors.length && !response.meta.critical) {
|
|
163
|
-
if (!this.checkHasPendingsFilesBeforeTransmit()) {
|
|
164
|
-
this.transmit();
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
this.send(false, displaySuccessMessage);
|
|
169
|
-
}
|
|
170
|
-
previous() {
|
|
171
|
-
this._navigation.previous();
|
|
172
|
-
}
|
|
173
|
-
setPageTitle(pageTitle) {
|
|
174
|
-
this._foehnPageService.setPageTitle(pageTitle);
|
|
175
|
-
this._breadcrumbEventService.setCurrentBreadcrumb({
|
|
176
|
-
url: null,
|
|
177
|
-
routerLink: null,
|
|
178
|
-
label: pageTitle
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
setPageTitleAsync(pageTitle) {
|
|
182
|
-
if (this.pageTitleSubscription) {
|
|
183
|
-
this.pageTitleSubscription.unsubscribe();
|
|
184
|
-
}
|
|
185
|
-
this.pageTitleSubscription = pageTitle.subscribe(title => this.setPageTitle(title));
|
|
186
|
-
}
|
|
187
|
-
onFormSent(goToNextPage) {
|
|
188
|
-
if (this.foehnFormComponent) {
|
|
189
|
-
// Some pages don't have a form.
|
|
190
|
-
this.foehnFormComponent.reset();
|
|
191
|
-
}
|
|
192
|
-
this._navigation.current().then(() => {
|
|
193
|
-
const isValid =
|
|
194
|
-
// Some pages don't have a form.
|
|
195
|
-
this.foehnFormComponent &&
|
|
196
|
-
this.foehnFormComponent.isValid() &&
|
|
197
|
-
!this._gesdemService.lastResponse.meta.critical;
|
|
198
|
-
if (isValid) {
|
|
199
|
-
this._validationHandlerService.shouldDisplayErrors(false);
|
|
200
|
-
}
|
|
201
|
-
this._gesdemEventService.formSentSubject.next(this._gesdemService.lastResponse);
|
|
202
|
-
if (isValid && goToNextPage) {
|
|
203
|
-
this._navigation.next();
|
|
204
|
-
}
|
|
205
|
-
else if (!isValid && this.foehnFormComponent) {
|
|
206
|
-
this.foehnFormComponent.focusErrorSummary();
|
|
207
|
-
}
|
|
208
|
-
}, console.error);
|
|
209
|
-
}
|
|
210
|
-
checkHasPendingsFilesBeforeTransmit() {
|
|
211
|
-
if (this._pendingUploadService.hasPendingFiles()) {
|
|
212
|
-
const multiUploadAttachmentSubscription = this._pendingUploadService.attachmentsUploaded.subscribe(() => {
|
|
213
|
-
multiUploadAttachmentSubscription.unsubscribe();
|
|
214
|
-
this.transmit();
|
|
215
|
-
});
|
|
216
|
-
return true;
|
|
217
|
-
}
|
|
218
|
-
return false;
|
|
219
|
-
}
|
|
220
|
-
gotToTop() {
|
|
221
|
-
window.scrollTo(0, 0);
|
|
222
|
-
}
|
|
223
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractPageComponent, deps: [{ token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
224
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AbstractPageComponent, viewQueries: [{ propertyName: "foehnFormComponent", first: true, predicate: FoehnFormComponent, descendants: true, static: true }], ngImport: i0 }); }
|
|
225
|
-
}
|
|
226
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AbstractPageComponent, decorators: [{
|
|
227
|
-
type: Directive
|
|
228
|
-
}], ctorParameters: () => [{ type: i1.ActivatedRoute }], propDecorators: { foehnFormComponent: [{
|
|
229
|
-
type: ViewChild,
|
|
230
|
-
args: [FoehnFormComponent, { static: true }]
|
|
231
|
-
}] } });
|
|
232
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtcGFnZS1jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9wcmVzdGF0aW9ucy1uZy9zcmMvYWJzdHJhY3QtcGFnZS1jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFHVCxTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxLQUFLLEVBQWMsRUFBRSxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUMzRCxPQUFPLEVBQ0gsVUFBVSxFQUNWLEtBQUssRUFDTCxRQUFRLEVBQ1IsS0FBSyxFQUNMLEdBQUcsRUFDSCxZQUFZLEVBQ2YsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNyRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNyRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUNoRyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNuRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFL0UsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDL0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG9DQUFv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QUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIERpcmVjdGl2ZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7IEVNUFRZLCBPYnNlcnZhYmxlLCBvZiwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICAgIGNhdGNoRXJyb3IsXG4gICAgZmlyc3QsXG4gICAgbWVyZ2VNYXAsXG4gICAgc2hhcmUsXG4gICAgdGFwLFxuICAgIHRocm90dGxlVGltZVxufSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEJyZWFkY3J1bWJFdmVudFNlcnZpY2UgfSBmcm9tICcuL2ZvZWhuLWJyZWFkY3J1bWIvYnJlYWRjcnVtYi1ldmVudC5zZXJ2aWNlJztcbmltcG9ydCB7IEZvZWhuRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vZm9laG4tZm9ybS9mb2Vobi1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHcm93bEJyb2tlclNlcnZpY2UgfSBmcm9tICcuL2ZvZWhuLWdyb3dsL2dyb3dsLWJyb2tlci5zZXJ2aWNlJztcbmltcG9ydCB7IEZvZWhuTmF2aWdhdGlvblNlcnZpY2UgfSBmcm9tICcuL2ZvZWhuLW5hdmlnYXRpb24vZm9laG4tbmF2aWdhdGlvbi5zZXJ2aWNlJztcbmltcG9ydCB7IEZvZWhuUGFnZVNlcnZpY2UgfSBmcm9tICcuL2ZvZWhuLXBhZ2UvZm9laG4tcGFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IFBlbmRpbmdVcGxvYWRTZXJ2aWNlIH0gZnJvbSAnLi9mb2Vobi11cGxvYWQvZm9laG4tbXVsdGktdXBsb2FkL3BlbmRpbmctdXBsb2FkLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2VzZGVtRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi9nZXNkZW0vZ2VzZGVtLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgR2VzZGVtSGFuZGxlclNlcnZpY2UgfSBmcm9tICcuL2dlc2RlbS9nZXNkZW0taGFuZGxlci5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGlvblN0YXR1dCwgR2VzZGVtU3RhdHV0VXRpbHMgfSBmcm9tICcuL2dlc2RlbS9nZXNkZW0tc3RhdHV0LXV0aWxzJztcbmltcG9ydCB7IEkxOG5Gb3JtIH0gZnJvbSAnLi9pMThuLWZvcm0nO1xuaW1wb3J0IHsgU2RrRGljdGlvbmFyeVNlcnZpY2UgfSBmcm9tICcuL3Nkay1kaWN0aW9uYXJ5L3Nkay1kaWN0aW9uYXJ5LnNlcnZpY2UnO1xuaW1wb3J0IHsgU2RrRXZlbnRUeXBlIH0gZnJvbSAnLi9zZGstZXZlbnRzLWxvZ2dlci9zZGstZXZlbnQtdHlwZSc7XG5pbXBvcnQgeyBTZGtFdmVudHNMb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi9zZGstZXZlbnRzLWxvZ2dlci9zZGstZXZlbnRzLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VMb2NhdG9yIH0gZnJvbSAnLi9zZXJ2aWNlLWxvY2F0b3InO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkhhbmRsZXJTZXJ2aWNlIH0gZnJvbSAnLi92YWxpZGF0aW9uL3ZhbGlkYXRpb24taGFuZGxlci5zZXJ2aWNlJztcblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgYSBjYWxsIGlzIG9ubHkgc3Vic2NyaWJlZCBhbmQgc2VuZCBvbmUgYXQgdGhlIHRpbWUuXG4gKiBAcGFyYW0gZm4gZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGFzIGNvbmN1cnJlbnQgc2FmZVxuICogQHJldHVybnMgT2JzZXJ2YWJsZVxuICovXG5mdW5jdGlvbiBnZXRDb25jdXJyZW50U2FmZUNhbGw8VD4oZm46ICgpID0+IE9ic2VydmFibGU8VD4pOiBPYnNlcnZhYmxlPFQ+IHtcbiAgICByZXR1cm4gb2YodHJ1ZSkucGlwZShcbiAgICAgICAgLy8gVG8gZ3VhcmQgYWdhaW5zdCBkb3VibGUtY2xpY2tcbiAgICAgICAgdGhyb3R0bGVUaW1lKDIwMCksXG4gICAgICAgIC8vIGZsYXRtYXAoZm4sIDEpIGVuc3VyZXMgdGhhdCBvbmx5IG9uZSBxdWVyeSBpcyByYW4gYXQgdGhlIHNhbWUgdGltZVxuICAgICAgICBtZXJnZU1hcChmbiwgMSksXG4gICAgICAgIC8vIEFzIHRoaXMgb2JzZXJ2YWJsZSBpcyB1c2VkIGFzIGEgUHJvbWlzZSAod2l0aCBzdWJzY3JpYmUpLCB0aGlzIGVuc3VyZXMgdGhhdFxuICAgICAgICAvLyB0aGUgb3BlcmF0b3JzIGFib3ZlIGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBlYWNoIHN1YnNjcmliZS5cbiAgICAgICAgc2hhcmUoKVxuICAgICk7XG59XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UGFnZUNvbXBvbmVudDxUIGV4dGVuZHMgSTE4bkZvcm0+XG4gICAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdFxue1xuICAgIEBWaWV3Q2hpbGQoRm9laG5Gb3JtQ29tcG9uZW50LCB7IHN0YXRpYzogdHJ1ZSB9KVxuICAgIGZvZWhuRm9ybUNvbXBvbmVudDogRm9laG5Gb3JtQ29tcG9uZW50O1xuXG4gICAgZm9ybTogVDtcbiAgICByZWZlcmVuY2U6IHN0cmluZztcblxuICAgIHByb3RlY3RlZCBwYWdlVGl0bGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICBwcm90ZWN0ZWQgdXBkYXRlRm9ybURhdGFTdWJqZWN0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJvdGVjdGVkIGF0dGFjaG1lbnRzU2luZ2xlVXBsb2FkZWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICBwcm90ZWN0ZWQgYXR0YWNobWVudHNNdWx0aVVwbG9hZGVkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJvdGVjdGVkIHNhdmVGb3JtUmVxdWVzdFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuICAgIHByb3RlY3RlZCBfZ2VzZGVtU2VydmljZTogR2VzZGVtSGFuZGxlclNlcnZpY2U7XG4gICAgcHJvdGVjdGVkIF9nZXNkZW1FdmVudFNlcnZpY2U6IEdlc2RlbUV2ZW50U2VydmljZTtcbiAgICBwcm90ZWN0ZWQgX25hdmlnYXRpb246IEZvZWhuTmF2aWdhdGlvblNlcnZpY2U7XG4gICAgcHJvdGVjdGVkIF9hY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGU7XG4gICAgcHJvdGVjdGVkIF9ncm93bFNlcnZpY2U6IEdyb3dsQnJva2VyU2VydmljZTtcbiAgICBwcm90ZWN0ZWQgX3ZhbGlkYXRpb25IYW5kbGVyU2VydmljZTogVmFsaWRhdGlvbkhhbmRsZXJTZXJ2aWNlO1xuICAgIHByb3RlY3RlZCBfYnJlYWRjcnVtYkV2ZW50U2VydmljZTogQnJlYWRjcnVtYkV2ZW50U2VydmljZTtcbiAgICBwcm90ZWN0ZWQgX2ZvZWhuUGFnZVNlcnZpY2U6IEZvZWhuUGFnZVNlcnZpY2U7XG4gICAgcHJvdGVjdGVkIF9kaWN0aW9uYXJ5U2VydmljZTogU2RrRGljdGlvbmFyeVNlcnZpY2U7XG4gICAgcHJvdGVjdGVkIF9ldmVudHNMb2dnZXJTZXJ2aWNlOiBTZGtFdmVudHNMb2dnZXJTZXJ2aWNlO1xuXG4gICAgcHJpdmF0ZSBfcGVuZGluZ1VwbG9hZFNlcnZpY2U6IFBlbmRpbmdVcGxvYWRTZXJ2aWNlO1xuICAgIHByaXZhdGUgX2Zvcm1Jbml0U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBfY3VycmVudExhbmdTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByaXZhdGUgX3RyYW5zbWl0Q29uY3VycmVudFNhZmU6IE9ic2VydmFibGU8YW55PjtcbiAgICBwcml2YXRlIF9nZXNkZW1TYXZlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlKSB7XG4gICAgICAgIHRoaXMuX2dlc2RlbVNlcnZpY2UgPSBTZXJ2aWNlTG9jYXRvci5pbmplY3Rvci5nZXQoR2VzZGVtSGFuZGxlclNlcnZpY2UpO1xuICAgICAgICB0aGlzLl9nZXNkZW1FdmVudFNlcnZpY2UgPVxuICAgICAgICAgICAgU2VydmljZUxvY2F0b3IuaW5qZWN0b3IuZ2V0KEdlc2RlbUV2ZW50U2VydmljZSk7XG4gICAgICAgIHRoaXMuX25hdmlnYXRpb24gPSBTZXJ2aWNlTG9jYXRvci5pbmplY3Rvci5nZXQoRm9laG5OYXZpZ2F0aW9uU2VydmljZSk7XG4gICAgICAgIHRoaXMuX2FjdGl2YXRlZFJvdXRlID0gU2VydmljZUxvY2F0b3IuaW5qZWN0b3IuZ2V0KEFjdGl2YXRlZFJvdXRlKTtcbiAgICAgICAgdGhpcy5fZ3Jvd2xTZXJ2aWNlID0gU2VydmljZUxvY2F0b3IuaW5qZWN0b3IuZ2V0KEdyb3dsQnJva2VyU2VydmljZSk7XG4gICAgICAgIHRoaXMuX3ZhbGlkYXRpb25IYW5kbGVyU2VydmljZSA9IFNlcnZpY2VMb2NhdG9yLmluamVjdG9yLmdldChcbiAgICAgICAgICAgIFZhbGlkYXRpb25IYW5kbGVyU2VydmljZVxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9wZW5kaW5nVXBsb2FkU2VydmljZSA9XG4gICAgICAgICAgICBTZXJ2aWNlTG9jYXRvci5pbmplY3Rvci5nZXQoUGVuZGluZ1VwbG9hZFNlcnZpY2UpO1xuICAgICAgICB0aGlzLl9icmVhZGNydW1iRXZlbnRTZXJ2aWNlID0gU2VydmljZUxvY2F0b3IuaW5qZWN0b3IuZ2V0KFxuICAgICAgICAgICAgQnJlYWRjcnVtYkV2ZW50U2VydmljZVxuICAgICAgICApO1xuICAgICAgICB0aGlzLl9mb2VoblBhZ2VTZXJ2aWNlID0gU2VydmljZUxvY2F0b3IuaW5qZWN0b3IuZ2V0KEZvZWhuUGFnZVNlcnZpY2UpO1xuXG4gICAgICAgIHRoaXMuX2RpY3Rpb25hcnlTZXJ2aWNlID1cbiAgICAgICAgICAgIFNlcnZpY2VMb2NhdG9yLmluamVjdG9yLmdldChTZGtEaWN0aW9uYXJ5U2VydmljZSk7XG4gICAgICAgIHRoaXMuX2V2ZW50c0xvZ2dlclNlcnZpY2UgPSBTZXJ2aWNlTG9jYXRvci5pbmplY3Rvci5nZXQoXG4gICAgICAgICAgICBTZGtFdmVudHNMb2dnZXJTZXJ2aWNlXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3Qgcm91dGUgPSBGb2Vobk5hdmlnYXRpb25TZXJ2aWNlLmdldFJvb3RSb3V0ZVJlY3Vyc2l2ZShcbiAgICAgICAgICAgIGFjdGl2YXRlZFJvdXRlLnNuYXBzaG90XG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuX25hdmlnYXRpb24uaW5pdFJvdXRlKHJvdXRlKTtcbiAgICAgICAgdGhpcy5fZm9ybUluaXRTdWJzY3JpcHRpb24gPSB0aGlzLl9nZXNkZW1FdmVudFNlcnZpY2VcbiAgICAgICAgICAgIC5mb3JtSW5pdGlhbGl6YXRpb25PYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VzZGVtU2VydmljZS5sYXN0UmVzcG9uc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VzZGVtU2VydmljZS5sYXN0UmVzcG9uc2UubWV0YS5yZWZlcmVuY2U7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhdHV0ID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VzZGVtU2VydmljZS5sYXN0UmVzcG9uc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VzZGVtU2VydmljZS5sYXN0UmVzcG9uc2UubWV0YS5zdGF0dXQ7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkUHJldmVudE5hdmlnYXRpb25Ub0xhc3QgPVxuICAgICAgICAgICAgICAgICAgICBhY3RpdmF0ZWRSb3V0ZS5zbmFwc2hvdC5kYXRhXG4gICAgICAgICAgICAgICAgICAgICAgICAucHJldmVudE5hdmlnYXRpb25Ub0xhc3RPblRyYW5zZmVycmVkID09PSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgbGFuZ3VhZ2VDb2RlID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VzZGVtU2VydmljZS5sYXN0UmVzcG9uc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VzZGVtU2VydmljZS5sYXN0UmVzcG9uc2UuZm9ybSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZXNkZW1TZXJ2aWNlLmxhc3RSZXNwb25zZS5mb3JtLmxhbmd1YWdlO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5fZGljdGlvbmFyeVNlcnZpY2UuY2hhbmdlTGFuZ3VhZ2UobGFuZ3VhZ2VDb2RlKTtcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIXNob3VsZFByZXZlbnROYXZpZ2F0aW9uVG9MYXN0ICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlICYmXG4gICAgICAgICAgICAgICAgICAgIEdlc2RlbVN0YXR1dFV0aWxzLmlzRmluYWwoXG4gICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25TdGF0dXRbc3RhdHV0IGFzIEFjdGlvblN0YXR1dF1cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9uYXZpZ2F0aW9uLmxhc3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZSAmJlxuICAgICAgICAgICAgICAgICAgICBBY3Rpb25TdGF0dXRbc3RhdHV0IGFzIEFjdGlvblN0YXR1dF0gPT09XG4gICAgICAgICAgICAgICAgICAgICAgICBBY3Rpb25TdGF0dXQuUEVORElOR19QQVlNRU5UXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX25hdmlnYXRpb24ucmVjYXAoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAvLyBQcm90ZWN0cyB0aGUgdHJhbnNtaXQgbWV0aG9kIG9uIHRoZSBHZXNkZW1TZXJ2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuXG4gICAgICAgIHRoaXMuX3RyYW5zbWl0Q29uY3VycmVudFNhZmUgPSBnZXRDb25jdXJyZW50U2FmZUNhbGwoKCkgPT5cbiAgICAgICAgICAgIHRoaXMuX2dlc2RlbVNlcnZpY2UudHJhbnNtaXQoKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmdvdFRvVG9wKCk7XG4gICAgICAgIHRoaXMuZm9ybSA9IHRoaXMubmV3Rm9ybSgpO1xuICAgICAgICB0aGlzLl9jdXJyZW50TGFuZ1N1YnNjcmlwdGlvbiA9IHRoaXMuX2RpY3Rpb25hcnlTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0Q3VycmVudExhbmd1YWdlQ29kZSgpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGxhbmd1YWdlQ29kZSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JtLmxhbmd1YWdlID0gbGFuZ3VhZ2VDb2RlO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5fdmFsaWRhdGlvbkhhbmRsZXJTZXJ2aWNlLnNob3VsZERpc3BsYXlFcnJvcnMoZmFsc2UpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlRm9ybURhdGFTdWJqZWN0U3Vic2NyaXB0aW9uID1cbiAgICAgICAgICAgIHRoaXMuX2dlc2RlbVNlcnZpY2UudXBkYXRlRm9ybURhdGFTdWJqZWN0LnN1YnNjcmliZShmb3JtID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0gPSBmb3JtO1xuICAgICAgICAgICAgICAgIHRoaXMuX2dlc2RlbUV2ZW50U2VydmljZS5mb3JtSW5pdGlhbGl6YXRpb25TdWJqZWN0Lm5leHQoZm9ybSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmF0dGFjaG1lbnRzTXVsdGlVcGxvYWRlZFN1YnNjcmlwdGlvbiA9XG4gICAgICAgICAgICB0aGlzLl9wZW5kaW5nVXBsb2FkU2VydmljZS5hdHRhY2htZW50c1VwbG9hZGVkLnN1YnNjcmliZShmb3JtID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZvcm0gPSBmb3JtO1xuICAgICAgICAgICAgICAgIC8vIFBSRVNUQUtJVC0zMDk6IHNldCBiYWNrIHNob3VsZERpc3BsYXlFcnJvcnMgdG8gdHJ1ZSBvbmNlIGZpbGVzIGhhdmUgYmVlbiB1cGxvYWRlZFxuICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRpb25IYW5kbGVyU2VydmljZS5zaG91bGREaXNwbGF5RXJyb3JzKHRydWUpO1xuICAgICAgICAgICAgICAgIHRoaXMub25Gb3JtU2VudCh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2F2ZUZvcm1SZXF1ZXN0U3Vic2NyaXB0aW9uID0gdGhpcy5fZm9laG5QYWdlU2VydmljZVxuICAgICAgICAgICAgLnNhdmVGb3JtUmVxdWVzdCgpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGRpc3BsYXlTdWNjZXNzTWVzc2FnZSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuc2VuZChmYWxzZSwgZGlzcGxheVN1Y2Nlc3NNZXNzYWdlKVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIC8vIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMTc1NzIjaXNzdWVjb21tZW50LTMyMzQ2NTczN1xuICAgICAgICBQcm9taXNlLnJlc29sdmUobnVsbCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9nZXNkZW1TZXJ2aWNlLnJlcXVpcmUoKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2N1cnJlbnRMYW5nU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLnBhZ2VUaXRsZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy51cGRhdGVGb3JtRGF0YVN1YmplY3RTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuYXR0YWNobWVudHNTaW5nbGVVcGxvYWRlZFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgdGhpcy5hdHRhY2htZW50c011bHRpVXBsb2FkZWRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX2Zvcm1Jbml0U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICB0aGlzLnNhdmVGb3JtUmVxdWVzdFN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICBzZW5kKFxuICAgICAgICBnb1RvTmV4dFBhZ2U6IGJvb2xlYW4gPSB0cnVlLFxuICAgICAgICBkaXNwbGF5U3VjY2Vzc01lc3NhZ2U6IGJvb2xlYW4gPSB0cnVlXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9wZW5kaW5nVXBsb2FkU2VydmljZS5oYXNQZW5kaW5nRmlsZXMoKSkge1xuICAgICAgICAgICAgZ29Ub05leHRQYWdlID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBQUkVTVEFLSVQtMzA5OiBzaG91bGREaXNwbGF5RXJyb3JzIHdpbGwgYmUgc2V0IGJhY2sgdG8gdHJ1ZSBpbiAnYXR0YWNobWVudHNVcGxvYWRlZCcgc3Vic2NyaXB0aW9uXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uSGFuZGxlclNlcnZpY2Uuc2hvdWxkRGlzcGxheUVycm9ycyh0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fZ2VzZGVtU2F2ZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgLy8gUHJvdGVjdHMgdGhlIHNhdmUgbWV0aG9kIG9uIHRoZSBHZXNkZW1TZXJ2aWNlIGZyb20gY29uY3VycmVudCBhY2Nlc3MuXG5cbiAgICAgICAgICAgIGNvbnN0IGNhbkNyZWF0ZURlbWFuZGUgPVxuICAgICAgICAgICAgICAgIHRoaXMuX25hdmlnYXRpb24uaXNGaXJzdEZvcm1QYWdlKCkgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5fZ2VzZGVtU2VydmljZS5sYXN0UmVzcG9uc2U/Lm1ldGE/LnJlZmVyZW5jZT8ubGVuZ3RoO1xuXG4gICAgICAgICAgICB0aGlzLl9nZXNkZW1TYXZlU3Vic2NyaXB0aW9uID0gdGhpcy5fZ2VzZGVtU2VydmljZVxuICAgICAgICAgICAgICAgIC5zYXZlKHRoaXMuZm9ybSwgY2FuQ3JlYXRlRGVtYW5kZSwgZGlzcGxheVN1Y2Nlc3NNZXNzYWdlKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZXNkZW1TYXZlU3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZvcm1TZW50KGdvVG9OZXh0UGFnZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0cmFuc21pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdmFsaWRhdGlvbkhhbmRsZXJTZXJ2aWNlLnNob3VsZERpc3BsYXlFcnJvcnModHJ1ZSk7XG4gICAgICAgIHRoaXMuX3RyYW5zbWl0Q29uY3VycmVudFNhZmVcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PlxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudHNMb2dnZXJTZXJ2aWNlLmFkZEV2ZW50KFNka0V2ZW50VHlwZS5UUkFOU01JVClcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZ2VzZGVtU2VydmljZS5sYXN0UmVzcG9uc2UuZXJyb3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9nZXNkZW1FdmVudFNlcnZpY2UuZm9ybVRyYW5zbWl0dGVkU3ViamVjdC5uZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2VzZGVtU2VydmljZS5sYXN0UmVzcG9uc2VcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGlvbi5uZXh0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2VuZEFuZFRyYW5zbWl0KGRpc3BsYXlTdWNjZXNzTWVzc2FnZTogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZ2VzZGVtRXZlbnRTZXJ2aWNlXG4gICAgICAgICAgICAuZm9ybVNlbnRPYnNlcnZhYmxlKClcbiAgICAgICAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLmVycm9ycy5sZW5ndGggJiYgIXJlc3BvbnNlLm1ldGEuY3JpdGljYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNoZWNrSGFzUGVuZGluZ3NGaWxlc0JlZm9yZVRyYW5zbWl0KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2VuZChmYWxzZSwgZGlzcGxheVN1Y2Nlc3NNZXNzYWdlKTtcbiAgICB9XG5cbiAgICBwcmV2aW91cygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbmF2aWdhdGlvbi5wcmV2aW91cygpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBzZXRQYWdlVGl0bGUocGFnZVRpdGxlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9laG5QYWdlU2VydmljZS5zZXRQYWdlVGl0bGUocGFnZVRpdGxlKTtcbiAgICAgICAgdGhpcy5fYnJlYWRjcnVtYkV2ZW50U2VydmljZS5zZXRDdXJyZW50QnJlYWRjcnVtYih7XG4gICAgICAgICAgICB1cmw6IG51bGwsXG4gICAgICAgICAgICByb3V0ZXJMaW5rOiBudWxsLFxuICAgICAgICAgICAgbGFiZWw6IHBhZ2VUaXRsZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgc2V0UGFnZVRpdGxlQXN5bmMocGFnZVRpdGxlOiBPYnNlcnZhYmxlPHN0cmluZz4pOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucGFnZVRpdGxlU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnBhZ2VUaXRsZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucGFnZVRpdGxlU3Vic2NyaXB0aW9uID0gcGFnZVRpdGxlLnN1YnNjcmliZSh0aXRsZSA9PlxuICAgICAgICAgICAgdGhpcy5zZXRQYWdlVGl0bGUodGl0bGUpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG9uRm9ybVNlbnQoZ29Ub05leHRQYWdlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmZvZWhuRm9ybUNvbXBvbmVudCkge1xuICAgICAgICAgICAgLy8gU29tZSBwYWdlcyBkb24ndCBoYXZlIGEgZm9ybS5cbiAgICAgICAgICAgIHRoaXMuZm9laG5Gb3JtQ29tcG9uZW50LnJlc2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9uYXZpZ2F0aW9uLmN1cnJlbnQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzVmFsaWQgPVxuICAgICAgICAgICAgICAgIC8vIFNvbWUgcGFnZXMgZG9uJ3QgaGF2ZSBhIGZvcm0uXG4gICAgICAgICAgICAgICAgdGhpcy5mb2VobkZvcm1Db21wb25lbnQgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmZvZWhuRm9ybUNvbXBvbmVudC5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICAgICAhdGhpcy5fZ2VzZGVtU2VydmljZS5sYXN0UmVzcG9uc2UubWV0YS5jcml0aWNhbDtcblxuICAgICAgICAgICAgaWYgKGlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl92YWxpZGF0aW9uSGFuZGxlclNlcnZpY2Uuc2hvdWxkRGlzcGxheUVycm9ycyhmYWxzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuX2dlc2RlbUV2ZW50U2VydmljZS5mb3JtU2VudFN1YmplY3QubmV4dChcbiAgICAgICAgICAgICAgICB0aGlzLl9nZXNkZW1TZXJ2aWNlLmxhc3RSZXNwb25zZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKGlzVmFsaWQgJiYgZ29Ub05leHRQYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbmF2aWdhdGlvbi5uZXh0KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1ZhbGlkICYmIHRoaXMuZm9laG5Gb3JtQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb2VobkZvcm1Db21wb25lbnQuZm9jdXNFcnJvclN1bW1hcnkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgY29uc29sZS5lcnJvcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0hhc1BlbmRpbmdzRmlsZXNCZWZvcmVUcmFuc21pdCgpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdVcGxvYWRTZXJ2aWNlLmhhc1BlbmRpbmdGaWxlcygpKSB7XG4gICAgICAgICAgICBjb25zdCBtdWx0aVVwbG9hZEF0dGFjaG1lbnRTdWJzY3JpcHRpb24gPVxuICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdVcGxvYWRTZXJ2aWNlLmF0dGFjaG1lbnRzVXBsb2FkZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlVcGxvYWRBdHRhY2htZW50U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNtaXQoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdvdFRvVG9wKCk6IHZvaWQge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgMCk7XG4gICAgfVxuXG4gICAgYWJzdHJhY3QgbmV3Rm9ybSgpOiBUO1xufVxuIl19
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import { Directive, HostListener } from '@angular/core';
|
|
2
|
-
import { first } from 'rxjs/operators';
|
|
3
|
-
import { CURRENCY_REGEXP, DECIMALS_SEPARATOR, THOUSANDS_SEPARATOR } from '../sdk-currency/currency.helper';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "../foehn-input/foehn-input-number.component";
|
|
6
|
-
// eslint-disable max-classes-per-file
|
|
7
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
8
|
-
function removeFormatting(value) {
|
|
9
|
-
if (value === undefined || value === null) {
|
|
10
|
-
// It's important to return null as the backend will consider this as no value.
|
|
11
|
-
return null;
|
|
12
|
-
}
|
|
13
|
-
return value
|
|
14
|
-
.toString()
|
|
15
|
-
.trim()
|
|
16
|
-
.replace(new RegExp(THOUSANDS_SEPARATOR, 'g'), '');
|
|
17
|
-
}
|
|
18
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
19
|
-
function formatWithThousandSeparators(value) {
|
|
20
|
-
return value.replace(CURRENCY_REGEXP, THOUSANDS_SEPARATOR);
|
|
21
|
-
}
|
|
22
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
23
|
-
export function formatNumberAsGiven(value) {
|
|
24
|
-
if (value === undefined || value === null || value === '') {
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
const [intg, dec] = removeFormatting(value).split(DECIMALS_SEPARATOR);
|
|
28
|
-
if (!!dec?.length && dec !== undefined) {
|
|
29
|
-
return formatWithThousandSeparators(intg) + DECIMALS_SEPARATOR + dec;
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
return formatWithThousandSeparators(intg);
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
36
|
-
export function formatDecimalCurrency(value, maxDecimalCount, maxLength, allowFreeInput) {
|
|
37
|
-
if (value === undefined || value === null || value === '') {
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
const [intg, dec] = removeFormatting(value).split(DECIMALS_SEPARATOR);
|
|
41
|
-
if (allowFreeInput) {
|
|
42
|
-
return (formatWithThousandSeparators(intg) +
|
|
43
|
-
DECIMALS_SEPARATOR +
|
|
44
|
-
(dec || '0').padEnd(maxDecimalCount, '0'));
|
|
45
|
-
}
|
|
46
|
-
if (maxDecimalCount === 0 || !maxDecimalCount) {
|
|
47
|
-
return formatWithThousandSeparators(intg);
|
|
48
|
-
}
|
|
49
|
-
const validEmptyEnd = '0'.repeat(maxDecimalCount);
|
|
50
|
-
let newEnd = dec ? dec + validEmptyEnd : validEmptyEnd;
|
|
51
|
-
if (newEnd && newEnd.length >= maxDecimalCount) {
|
|
52
|
-
newEnd = newEnd.substring(0, maxDecimalCount);
|
|
53
|
-
}
|
|
54
|
-
let newDecimal = intg + DECIMALS_SEPARATOR + newEnd;
|
|
55
|
-
if (newDecimal.length > maxLength) {
|
|
56
|
-
newDecimal = newDecimal.substring(0, maxLength);
|
|
57
|
-
}
|
|
58
|
-
[, newEnd] = newDecimal.split(DECIMALS_SEPARATOR);
|
|
59
|
-
if (!newEnd) {
|
|
60
|
-
return formatWithThousandSeparators(intg);
|
|
61
|
-
}
|
|
62
|
-
return formatWithThousandSeparators(intg) + DECIMALS_SEPARATOR + newEnd;
|
|
63
|
-
}
|
|
64
|
-
// eslint-disable-next-line jsdoc/require-jsdoc
|
|
65
|
-
export function formatNonDecimalCurrency(value) {
|
|
66
|
-
if (value === undefined || value === null) {
|
|
67
|
-
return null;
|
|
68
|
-
}
|
|
69
|
-
return formatWithThousandSeparators(removeFormatting(value));
|
|
70
|
-
}
|
|
71
|
-
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
72
|
-
export class NumberCurrencyFormatterDirective {
|
|
73
|
-
constructor(host, ngZone) {
|
|
74
|
-
this.host = host;
|
|
75
|
-
this.ngZone = ngZone;
|
|
76
|
-
this.hasFocus = false;
|
|
77
|
-
}
|
|
78
|
-
onBlur(value) {
|
|
79
|
-
this.hasFocus = false;
|
|
80
|
-
this.setFormatting(value);
|
|
81
|
-
}
|
|
82
|
-
onFocus(value) {
|
|
83
|
-
this.hasFocus = true;
|
|
84
|
-
this.host.forceUpdateNgModel(removeFormatting(value));
|
|
85
|
-
}
|
|
86
|
-
onModelChange(value) {
|
|
87
|
-
if (!!value && !this.hasFocus) {
|
|
88
|
-
this.setFormatting(value);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
ngOnInit() {
|
|
92
|
-
// sometimes, when the view is "simple" and doesn't require lot a processing
|
|
93
|
-
// we arrive in this method with this.host.model not already initialized, so the formatting is not working
|
|
94
|
-
this.ngZone.onMicrotaskEmpty.pipe(first()).subscribe(() => {
|
|
95
|
-
this.setFormatting(this.host.model);
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
setFormatting(value) {
|
|
99
|
-
// Hooks on the inputs of the component to customize the behavior
|
|
100
|
-
let formattedValue = null;
|
|
101
|
-
if (this.host.allowFreeInput && !this.host.allowDecimal) {
|
|
102
|
-
formattedValue = formatNumberAsGiven(value);
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
formattedValue = this.host.allowDecimal
|
|
106
|
-
? formatDecimalCurrency(value, this.host.maxDecimalCount, this.host.maxlength, this.host.allowFreeInput)
|
|
107
|
-
: formatNonDecimalCurrency(value);
|
|
108
|
-
}
|
|
109
|
-
const newValueWithoutFormatting = removeFormatting(formattedValue);
|
|
110
|
-
if (this.hasValueChanged(newValueWithoutFormatting)) {
|
|
111
|
-
// Since we have altered the model (i.e. by removing some decimals), we have to update it
|
|
112
|
-
this.host.updateNgModel(newValueWithoutFormatting);
|
|
113
|
-
}
|
|
114
|
-
// Due to ngModel being possibly updated, we need to wait for a micro task empty
|
|
115
|
-
this.ngZone.onMicrotaskEmpty.pipe(first()).subscribe(() => {
|
|
116
|
-
// We're injection non-decimal characters, hence the force.
|
|
117
|
-
this.host.forceUpdateNgModel(formattedValue);
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
hasValueChanged(newValueWithoutFormatting) {
|
|
121
|
-
if (this.host.model?.toString()?.trim() === '-') {
|
|
122
|
-
return false;
|
|
123
|
-
}
|
|
124
|
-
return (!this.host.model ||
|
|
125
|
-
this.host.model.toString() !== newValueWithoutFormatting);
|
|
126
|
-
}
|
|
127
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberCurrencyFormatterDirective, deps: [{ token: i1.FoehnInputNumberComponent }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
128
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: NumberCurrencyFormatterDirective, selector: "[numberCurrencyFormatter]", host: { listeners: { "blur": "onBlur($event.target.value)", "focus": "onFocus($event.target.value)", "modelChange": "onModelChange($event)" } }, ngImport: i0 }); }
|
|
129
|
-
}
|
|
130
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NumberCurrencyFormatterDirective, decorators: [{
|
|
131
|
-
type: Directive,
|
|
132
|
-
args: [{ selector: '[numberCurrencyFormatter]' }]
|
|
133
|
-
}], ctorParameters: () => [{ type: i1.FoehnInputNumberComponent }, { type: i0.NgZone }], propDecorators: { onBlur: [{
|
|
134
|
-
type: HostListener,
|
|
135
|
-
args: ['blur', ['$event.target.value']]
|
|
136
|
-
}], onFocus: [{
|
|
137
|
-
type: HostListener,
|
|
138
|
-
args: ['focus', ['$event.target.value']]
|
|
139
|
-
}], onModelChange: [{
|
|
140
|
-
type: HostListener,
|
|
141
|
-
args: ['modelChange', ['$event']]
|
|
142
|
-
}] } });
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VycmVuY3ktZm9ybWF0dGVyLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9kaXJlY3RpdmVzL2N1cnJlbmN5LWZvcm1hdHRlci5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQWtCLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUl2QyxPQUFPLEVBQ0gsZUFBZSxFQUNmLGtCQUFrQixFQUNsQixtQkFBbUIsRUFDdEIsTUFBTSxpQ0FBaUMsQ0FBQzs7O0FBRXpDLHNDQUFzQztBQUN0QywrQ0FBK0M7QUFDL0MsU0FBUyxnQkFBZ0IsQ0FBQyxLQUFhO0lBQ25DLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDeEMsK0VBQStFO1FBQy9FLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxPQUFPLEtBQUs7U0FDUCxRQUFRLEVBQUU7U0FDVixJQUFJLEVBQUU7U0FDTixPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsbUJBQW1CLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVELCtDQUErQztBQUMvQyxTQUFTLDRCQUE0QixDQUFDLEtBQWE7SUFDL0MsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCwrQ0FBK0M7QUFDL0MsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEtBQWE7SUFDN0MsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3hELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRXRFLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxNQUFNLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3JDLE9BQU8sNEJBQTRCLENBQUMsSUFBSSxDQUFDLEdBQUcsa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0lBQ3pFLENBQUM7U0FBTSxDQUFDO1FBQ0osT0FBTyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QyxDQUFDO0FBQ0wsQ0FBQztBQUVELCtDQUErQztBQUMvQyxNQUFNLFVBQVUscUJBQXFCLENBQ2pDLEtBQWEsRUFDYixlQUF1QixFQUN2QixTQUFpQixFQUNqQixjQUF1QjtJQUV2QixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDeEQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFFdEUsSUFBSSxjQUFjLEVBQUUsQ0FBQztRQUNqQixPQUFPLENBQ0gsNEJBQTRCLENBQUMsSUFBSSxDQUFDO1lBQ2xDLGtCQUFrQjtZQUNsQixDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUM1QyxDQUFDO0lBQ04sQ0FBQztJQUVELElBQUksZUFBZSxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQzVDLE9BQU8sNEJBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFbEQsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDdkQsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUM3QyxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELElBQUksVUFBVSxHQUFHLElBQUksR0FBRyxrQkFBa0IsR0FBRyxNQUFNLENBQUM7SUFDcEQsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLFVBQVUsR0FBRyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDVixPQUFPLDRCQUE0QixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxPQUFPLDRCQUE0QixDQUFDLElBQUksQ0FBQyxHQUFHLGtCQUFrQixHQUFHLE1BQU0sQ0FBQztBQUM1RSxDQUFDO0FBRUQsK0NBQStDO0FBQy9DLE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxLQUFhO0lBQ2xELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELE9BQU8sNEJBQTRCLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQsOERBQThEO0FBRTlELE1BQU0sT0FBTyxnQ0FBZ0M7SUFHekMsWUFDWSxJQUErQixFQUMvQixNQUFjO1FBRGQsU0FBSSxHQUFKLElBQUksQ0FBMkI7UUFDL0IsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUpsQixhQUFRLEdBQUcsS0FBSyxDQUFDO0lBS3RCLENBQUM7SUFHSixNQUFNLENBQUMsS0FBYTtRQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFHRCxPQUFPLENBQUMsS0FBYTtRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUdELGFBQWEsQ0FBQyxLQUFhO1FBQ3ZCLElBQUksQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDTCxDQUFDO0lBRUQsUUFBUTtRQUNKLDRFQUE0RTtRQUM1RSwwR0FBMEc7UUFDMUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFTyxhQUFhLENBQUMsS0FBYTtRQUMvQixpRUFBaUU7UUFFakUsSUFBSSxjQUFjLEdBQVcsSUFBSSxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RELGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxDQUFDO2FBQU0sQ0FBQztZQUNKLGNBQWMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVk7Z0JBQ25DLENBQUMsQ0FBQyxxQkFBcUIsQ0FDakIsS0FBSyxFQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQzNCO2dCQUNILENBQUMsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBRUQsTUFBTSx5QkFBeUIsR0FBRyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNuRSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDO1lBQ2xELHlGQUF5RjtZQUN6RixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFFRCxnRkFBZ0Y7UUFDaEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3RELDJEQUEyRDtZQUMzRCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2pELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGVBQWUsQ0FBQyx5QkFBaUM7UUFDckQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUM5QyxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO1FBQ0QsT0FBTyxDQUNILENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLO1lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLHlCQUF5QixDQUMzRCxDQUFDO0lBQ04sQ0FBQzsrR0F6RVEsZ0NBQWdDO21HQUFoQyxnQ0FBZ0M7OzRGQUFoQyxnQ0FBZ0M7a0JBRDVDLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsMkJBQTJCLEVBQUU7bUhBVWhELE1BQU07c0JBREwsWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQztnQkFPN0MsT0FBTztzQkFETixZQUFZO3VCQUFDLE9BQU8sRUFBRSxDQUFDLHFCQUFxQixDQUFDO2dCQU85QyxhQUFhO3NCQURaLFlBQVk7dUJBQUMsYUFBYSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0TGlzdGVuZXIsIE5nWm9uZSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1jeWNsZVxuaW1wb3J0IHsgRm9laG5JbnB1dE51bWJlckNvbXBvbmVudCB9IGZyb20gJy4uL2ZvZWhuLWlucHV0L2ZvZWhuLWlucHV0LW51bWJlci5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgICBDVVJSRU5DWV9SRUdFWFAsXG4gICAgREVDSU1BTFNfU0VQQVJBVE9SLFxuICAgIFRIT1VTQU5EU19TRVBBUkFUT1Jcbn0gZnJvbSAnLi4vc2RrLWN1cnJlbmN5L2N1cnJlbmN5LmhlbHBlcic7XG5cbi8vIGVzbGludC1kaXNhYmxlIG1heC1jbGFzc2VzLXBlci1maWxlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gcmVtb3ZlRm9ybWF0dGluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICAvLyBJdCdzIGltcG9ydGFudCB0byByZXR1cm4gbnVsbCBhcyB0aGUgYmFja2VuZCB3aWxsIGNvbnNpZGVyIHRoaXMgYXMgbm8gdmFsdWUuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICAgICAgICAudG9TdHJpbmcoKVxuICAgICAgICAudHJpbSgpXG4gICAgICAgIC5yZXBsYWNlKG5ldyBSZWdFeHAoVEhPVVNBTkRTX1NFUEFSQVRPUiwgJ2cnKSwgJycpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZnVuY3Rpb24gZm9ybWF0V2l0aFRob3VzYW5kU2VwYXJhdG9ycyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZShDVVJSRU5DWV9SRUdFWFAsIFRIT1VTQU5EU19TRVBBUkFUT1IpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1qc2RvY1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdE51bWJlckFzR2l2ZW4odmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IFtpbnRnLCBkZWNdID0gcmVtb3ZlRm9ybWF0dGluZyh2YWx1ZSkuc3BsaXQoREVDSU1BTFNfU0VQQVJBVE9SKTtcblxuICAgIGlmICghIWRlYz8ubGVuZ3RoICYmIGRlYyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBmb3JtYXRXaXRoVGhvdXNhbmRTZXBhcmF0b3JzKGludGcpICsgREVDSU1BTFNfU0VQQVJBVE9SICsgZGVjO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmb3JtYXRXaXRoVGhvdXNhbmRTZXBhcmF0b3JzKGludGcpO1xuICAgIH1cbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtanNkb2NcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXREZWNpbWFsQ3VycmVuY3koXG4gICAgdmFsdWU6IHN0cmluZyxcbiAgICBtYXhEZWNpbWFsQ291bnQ6IG51bWJlcixcbiAgICBtYXhMZW5ndGg6IG51bWJlcixcbiAgICBhbGxvd0ZyZWVJbnB1dDogYm9vbGVhblxuKTogc3RyaW5nIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgW2ludGcsIGRlY10gPSByZW1vdmVGb3JtYXR0aW5nKHZhbHVlKS5zcGxpdChERUNJTUFMU19TRVBBUkFUT1IpO1xuXG4gICAgaWYgKGFsbG93RnJlZUlucHV0KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBmb3JtYXRXaXRoVGhvdXNhbmRTZXBhcmF0b3JzKGludGcpICtcbiAgICAgICAgICAgIERFQ0lNQUxTX1NFUEFSQVRPUiArXG4gICAgICAgICAgICAoZGVjIHx8ICcwJykucGFkRW5kKG1heERlY2ltYWxDb3VudCwgJzAnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGlmIChtYXhEZWNpbWFsQ291bnQgPT09IDAgfHwgIW1heERlY2ltYWxDb3VudCkge1xuICAgICAgICByZXR1cm4gZm9ybWF0V2l0aFRob3VzYW5kU2VwYXJhdG9ycyhpbnRnKTtcbiAgICB9XG4gICAgY29uc3QgdmFsaWRFbXB0eUVuZCA9ICcwJy5yZXBlYXQobWF4RGVjaW1hbENvdW50KTtcblxuICAgIGxldCBuZXdFbmQgPSBkZWMgPyBkZWMgKyB2YWxpZEVtcHR5RW5kIDogdmFsaWRFbXB0eUVuZDtcbiAgICBpZiAobmV3RW5kICYmIG5ld0VuZC5sZW5ndGggPj0gbWF4RGVjaW1hbENvdW50KSB7XG4gICAgICAgIG5ld0VuZCA9IG5ld0VuZC5zdWJzdHJpbmcoMCwgbWF4RGVjaW1hbENvdW50KTtcbiAgICB9XG5cbiAgICBsZXQgbmV3RGVjaW1hbCA9IGludGcgKyBERUNJTUFMU19TRVBBUkFUT1IgKyBuZXdFbmQ7XG4gICAgaWYgKG5ld0RlY2ltYWwubGVuZ3RoID4gbWF4TGVuZ3RoKSB7XG4gICAgICAgIG5ld0RlY2ltYWwgPSBuZXdEZWNpbWFsLnN1YnN0cmluZygwLCBtYXhMZW5ndGgpO1xuICAgIH1cblxuICAgIFssIG5ld0VuZF0gPSBuZXdEZWNpbWFsLnNwbGl0KERFQ0lNQUxTX1NFUEFSQVRPUik7XG4gICAgaWYgKCFuZXdFbmQpIHtcbiAgICAgICAgcmV0dXJuIGZvcm1hdFdpdGhUaG91c2FuZFNlcGFyYXRvcnMoaW50Zyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZvcm1hdFdpdGhUaG91c2FuZFNlcGFyYXRvcnMoaW50ZykgKyBERUNJTUFMU19TRVBBUkFUT1IgKyBuZXdFbmQ7XG59XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9yZXF1aXJlLWpzZG9jXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Tm9uRGVjaW1hbEN1cnJlbmN5KHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBmb3JtYXRXaXRoVGhvdXNhbmRTZXBhcmF0b3JzKHJlbW92ZUZvcm1hdHRpbmcodmFsdWUpKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tudW1iZXJDdXJyZW5jeUZvcm1hdHRlcl0nIH0pXG5leHBvcnQgY2xhc3MgTnVtYmVyQ3VycmVuY3lGb3JtYXR0ZXJEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIHByaXZhdGUgaGFzRm9jdXMgPSBmYWxzZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGhvc3Q6IEZvZWhuSW5wdXROdW1iZXJDb21wb25lbnQsXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcbiAgICApIHt9XG5cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJywgWyckZXZlbnQudGFyZ2V0LnZhbHVlJ10pXG4gICAgb25CbHVyKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5oYXNGb2N1cyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldEZvcm1hdHRpbmcodmFsdWUpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2ZvY3VzJywgWyckZXZlbnQudGFyZ2V0LnZhbHVlJ10pXG4gICAgb25Gb2N1cyh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaGFzRm9jdXMgPSB0cnVlO1xuICAgICAgICB0aGlzLmhvc3QuZm9yY2VVcGRhdGVOZ01vZGVsKHJlbW92ZUZvcm1hdHRpbmcodmFsdWUpKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdtb2RlbENoYW5nZScsIFsnJGV2ZW50J10pXG4gICAgb25Nb2RlbENoYW5nZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmICghIXZhbHVlICYmICF0aGlzLmhhc0ZvY3VzKSB7XG4gICAgICAgICAgICB0aGlzLnNldEZvcm1hdHRpbmcodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIC8vIHNvbWV0aW1lcywgd2hlbiB0aGUgdmlldyBpcyBcInNpbXBsZVwiIGFuZCBkb2Vzbid0IHJlcXVpcmUgbG90IGEgcHJvY2Vzc2luZ1xuICAgICAgICAvLyB3ZSBhcnJpdmUgaW4gdGhpcyBtZXRob2Qgd2l0aCB0aGlzLmhvc3QubW9kZWwgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQsIHNvIHRoZSBmb3JtYXR0aW5nIGlzIG5vdCB3b3JraW5nXG4gICAgICAgIHRoaXMubmdab25lLm9uTWljcm90YXNrRW1wdHkucGlwZShmaXJzdCgpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRGb3JtYXR0aW5nKHRoaXMuaG9zdC5tb2RlbCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0Rm9ybWF0dGluZyh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIC8vIEhvb2tzIG9uIHRoZSBpbnB1dHMgb2YgdGhlIGNvbXBvbmVudCB0byBjdXN0b21pemUgdGhlIGJlaGF2aW9yXG5cbiAgICAgICAgbGV0IGZvcm1hdHRlZFZhbHVlOiBzdHJpbmcgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5ob3N0LmFsbG93RnJlZUlucHV0ICYmICF0aGlzLmhvc3QuYWxsb3dEZWNpbWFsKSB7XG4gICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZSA9IGZvcm1hdE51bWJlckFzR2l2ZW4odmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUgPSB0aGlzLmhvc3QuYWxsb3dEZWNpbWFsXG4gICAgICAgICAgICAgICAgPyBmb3JtYXREZWNpbWFsQ3VycmVuY3koXG4gICAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5ob3N0Lm1heERlY2ltYWxDb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhvc3QubWF4bGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaG9zdC5hbGxvd0ZyZWVJbnB1dFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogZm9ybWF0Tm9uRGVjaW1hbEN1cnJlbmN5KHZhbHVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlV2l0aG91dEZvcm1hdHRpbmcgPSByZW1vdmVGb3JtYXR0aW5nKGZvcm1hdHRlZFZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWVDaGFuZ2VkKG5ld1ZhbHVlV2l0aG91dEZvcm1hdHRpbmcpKSB7XG4gICAgICAgICAgICAvLyBTaW5jZSB3ZSBoYXZlIGFsdGVyZWQgdGhlIG1vZGVsIChpLmUuIGJ5IHJlbW92aW5nIHNvbWUgZGVjaW1hbHMpLCB3ZSBoYXZlIHRvIHVwZGF0ZSBpdFxuICAgICAgICAgICAgdGhpcy5ob3N0LnVwZGF0ZU5nTW9kZWwobmV3VmFsdWVXaXRob3V0Rm9ybWF0dGluZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEdWUgdG8gbmdNb2RlbCBiZWluZyBwb3NzaWJseSB1cGRhdGVkLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGEgbWljcm8gdGFzayBlbXB0eVxuICAgICAgICB0aGlzLm5nWm9uZS5vbk1pY3JvdGFza0VtcHR5LnBpcGUoZmlyc3QoKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIFdlJ3JlIGluamVjdGlvbiBub24tZGVjaW1hbCBjaGFyYWN0ZXJzLCBoZW5jZSB0aGUgZm9yY2UuXG4gICAgICAgICAgICB0aGlzLmhvc3QuZm9yY2VVcGRhdGVOZ01vZGVsKGZvcm1hdHRlZFZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYXNWYWx1ZUNoYW5nZWQobmV3VmFsdWVXaXRob3V0Rm9ybWF0dGluZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmhvc3QubW9kZWw/LnRvU3RyaW5nKCk/LnRyaW0oKSA9PT0gJy0nKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICF0aGlzLmhvc3QubW9kZWwgfHxcbiAgICAgICAgICAgIHRoaXMuaG9zdC5tb2RlbC50b1N0cmluZygpICE9PSBuZXdWYWx1ZVdpdGhvdXRGb3JtYXR0aW5nXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { NgModule } from '@angular/core';
|
|
2
|
-
import { FoehnInputModule } from '../foehn-input/foehn-input.module';
|
|
3
|
-
import { NumberCurrencyFormatterDirective } from './currency-formatter.directive';
|
|
4
|
-
import { IbanFormatterDirective } from './iban-formatter.directive';
|
|
5
|
-
import { IdeFormatterDirective } from './ide-formatter.directive';
|
|
6
|
-
import { NDCFormatterDirective } from './ndc-formatter.directive';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
export class FormatterModule {
|
|
9
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormatterModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
10
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.12", ngImport: i0, type: FormatterModule, declarations: [NDCFormatterDirective,
|
|
11
|
-
NumberCurrencyFormatterDirective,
|
|
12
|
-
IdeFormatterDirective,
|
|
13
|
-
IbanFormatterDirective], imports: [FoehnInputModule], exports: [NDCFormatterDirective,
|
|
14
|
-
NumberCurrencyFormatterDirective,
|
|
15
|
-
IdeFormatterDirective,
|
|
16
|
-
IbanFormatterDirective] }); }
|
|
17
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormatterModule, imports: [FoehnInputModule] }); }
|
|
18
|
-
}
|
|
19
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FormatterModule, decorators: [{
|
|
20
|
-
type: NgModule,
|
|
21
|
-
args: [{
|
|
22
|
-
imports: [FoehnInputModule],
|
|
23
|
-
declarations: [
|
|
24
|
-
NDCFormatterDirective,
|
|
25
|
-
NumberCurrencyFormatterDirective,
|
|
26
|
-
IdeFormatterDirective,
|
|
27
|
-
IbanFormatterDirective
|
|
28
|
-
],
|
|
29
|
-
exports: [
|
|
30
|
-
NDCFormatterDirective,
|
|
31
|
-
NumberCurrencyFormatterDirective,
|
|
32
|
-
IdeFormatterDirective,
|
|
33
|
-
IbanFormatterDirective
|
|
34
|
-
]
|
|
35
|
-
}]
|
|
36
|
-
}] });
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0dGVyLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9kaXJlY3RpdmVzL2Zvcm1hdHRlci5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFpQmxFLE1BQU0sT0FBTyxlQUFlOytHQUFmLGVBQWU7Z0hBQWYsZUFBZSxpQkFacEIscUJBQXFCO1lBQ3JCLGdDQUFnQztZQUNoQyxxQkFBcUI7WUFDckIsc0JBQXNCLGFBTGhCLGdCQUFnQixhQVF0QixxQkFBcUI7WUFDckIsZ0NBQWdDO1lBQ2hDLHFCQUFxQjtZQUNyQixzQkFBc0I7Z0hBR2pCLGVBQWUsWUFkZCxnQkFBZ0I7OzRGQWNqQixlQUFlO2tCQWYzQixRQUFRO21CQUFDO29CQUNOLE9BQU8sRUFBRSxDQUFDLGdCQUFnQixDQUFDO29CQUMzQixZQUFZLEVBQUU7d0JBQ1YscUJBQXFCO3dCQUNyQixnQ0FBZ0M7d0JBQ2hDLHFCQUFxQjt3QkFDckIsc0JBQXNCO3FCQUN6QjtvQkFDRCxPQUFPLEVBQUU7d0JBQ0wscUJBQXFCO3dCQUNyQixnQ0FBZ0M7d0JBQ2hDLHFCQUFxQjt3QkFDckIsc0JBQXNCO3FCQUN6QjtpQkFDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZvZWhuSW5wdXRNb2R1bGUgfSBmcm9tICcuLi9mb2Vobi1pbnB1dC9mb2Vobi1pbnB1dC5tb2R1bGUnO1xuaW1wb3J0IHsgTnVtYmVyQ3VycmVuY3lGb3JtYXR0ZXJEaXJlY3RpdmUgfSBmcm9tICcuL2N1cnJlbmN5LWZvcm1hdHRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgSWJhbkZvcm1hdHRlckRpcmVjdGl2ZSB9IGZyb20gJy4vaWJhbi1mb3JtYXR0ZXIuZGlyZWN0aXZlJztcbmltcG9ydCB7IElkZUZvcm1hdHRlckRpcmVjdGl2ZSB9IGZyb20gJy4vaWRlLWZvcm1hdHRlci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTkRDRm9ybWF0dGVyRGlyZWN0aXZlIH0gZnJvbSAnLi9uZGMtZm9ybWF0dGVyLmRpcmVjdGl2ZSc7XG5cbkBOZ01vZHVsZSh7XG4gICAgaW1wb3J0czogW0ZvZWhuSW5wdXRNb2R1bGVdLFxuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICBORENGb3JtYXR0ZXJEaXJlY3RpdmUsXG4gICAgICAgIE51bWJlckN1cnJlbmN5Rm9ybWF0dGVyRGlyZWN0aXZlLFxuICAgICAgICBJZGVGb3JtYXR0ZXJEaXJlY3RpdmUsXG4gICAgICAgIEliYW5Gb3JtYXR0ZXJEaXJlY3RpdmVcbiAgICBdLFxuICAgIGV4cG9ydHM6IFtcbiAgICAgICAgTkRDRm9ybWF0dGVyRGlyZWN0aXZlLFxuICAgICAgICBOdW1iZXJDdXJyZW5jeUZvcm1hdHRlckRpcmVjdGl2ZSxcbiAgICAgICAgSWRlRm9ybWF0dGVyRGlyZWN0aXZlLFxuICAgICAgICBJYmFuRm9ybWF0dGVyRGlyZWN0aXZlXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBGb3JtYXR0ZXJNb2R1bGUge31cbiJdfQ==
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { Directive, HostListener } from '@angular/core';
|
|
2
|
-
import * as iban from 'iban';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "../foehn-input/foehn-input-text.component";
|
|
5
|
-
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
6
|
-
export class IbanFormatterDirective {
|
|
7
|
-
constructor(host) {
|
|
8
|
-
this.host = host;
|
|
9
|
-
}
|
|
10
|
-
onBlur(value) {
|
|
11
|
-
this.host.updateNgModel(this.formatIban(value));
|
|
12
|
-
}
|
|
13
|
-
formatIban(value) {
|
|
14
|
-
if (!value) {
|
|
15
|
-
return value;
|
|
16
|
-
}
|
|
17
|
-
return iban.printFormat(value, ' ');
|
|
18
|
-
}
|
|
19
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IbanFormatterDirective, deps: [{ token: i1.FoehnInputTextComponent }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
20
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: IbanFormatterDirective, selector: "[ibanFormatter]", host: { listeners: { "blur": "onBlur($event.target.value)" } }, ngImport: i0 }); }
|
|
21
|
-
}
|
|
22
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IbanFormatterDirective, decorators: [{
|
|
23
|
-
type: Directive,
|
|
24
|
-
args: [{ selector: '[ibanFormatter]' }]
|
|
25
|
-
}], ctorParameters: () => [{ type: i1.FoehnInputTextComponent }], propDecorators: { onBlur: [{
|
|
26
|
-
type: HostListener,
|
|
27
|
-
args: ['blur', ['$event.target.value']]
|
|
28
|
-
}] } });
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWJhbi1mb3JtYXR0ZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJlc3RhdGlvbnMtbmcvc3JjL2RpcmVjdGl2ZXMvaWJhbi1mb3JtYXR0ZXIuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hELE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDOzs7QUFJN0IsOERBQThEO0FBRTlELE1BQU0sT0FBTyxzQkFBc0I7SUFDL0IsWUFBb0IsSUFBNkI7UUFBN0IsU0FBSSxHQUFKLElBQUksQ0FBeUI7SUFBRyxDQUFDO0lBR3JELE1BQU0sQ0FBQyxLQUFhO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRU8sVUFBVSxDQUFDLEtBQWE7UUFDNUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1QsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEMsQ0FBQzsrR0FiUSxzQkFBc0I7bUdBQXRCLHNCQUFzQjs7NEZBQXRCLHNCQUFzQjtrQkFEbEMsU0FBUzttQkFBQyxFQUFFLFFBQVEsRUFBRSxpQkFBaUIsRUFBRTs0RkFLdEMsTUFBTTtzQkFETCxZQUFZO3VCQUFDLE1BQU0sRUFBRSxDQUFDLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCAqIGFzIGliYW4gZnJvbSAnaWJhbic7XG5cbmltcG9ydCB7IEZvZWhuSW5wdXRUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi4vZm9laG4taW5wdXQvZm9laG4taW5wdXQtdGV4dC5jb21wb25lbnQnO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2RpcmVjdGl2ZS1zZWxlY3RvclxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW2liYW5Gb3JtYXR0ZXJdJyB9KVxuZXhwb3J0IGNsYXNzIEliYW5Gb3JtYXR0ZXJEaXJlY3RpdmUge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaG9zdDogRm9laG5JbnB1dFRleHRDb21wb25lbnQpIHt9XG5cbiAgICBASG9zdExpc3RlbmVyKCdibHVyJywgWyckZXZlbnQudGFyZ2V0LnZhbHVlJ10pXG4gICAgb25CbHVyKHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3N0LnVwZGF0ZU5nTW9kZWwodGhpcy5mb3JtYXRJYmFuKHZhbHVlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb3JtYXRJYmFuKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGliYW4ucHJpbnRGb3JtYXQodmFsdWUsICcgJyk7XG4gICAgfVxufVxuIl19
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import { Directive, HostListener } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "../foehn-input/foehn-input-text.component";
|
|
4
|
-
const IDE_PATTERN = '^CHE-?(\\d{3})\\.?(\\d{3})\\.?(\\d{3})$';
|
|
5
|
-
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
6
|
-
export class IdeFormatterDirective {
|
|
7
|
-
constructor(host) {
|
|
8
|
-
this.host = host;
|
|
9
|
-
}
|
|
10
|
-
onBlur(value) {
|
|
11
|
-
this.host.updateNgModel(this.formatIde(value));
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Formats ide
|
|
15
|
-
*
|
|
16
|
-
* CHE123456789 >> CHE-123.456.789
|
|
17
|
-
* @param value as ide
|
|
18
|
-
* @returns string
|
|
19
|
-
*/
|
|
20
|
-
formatIde(value) {
|
|
21
|
-
if (!value) {
|
|
22
|
-
return '';
|
|
23
|
-
}
|
|
24
|
-
const trimmedValue = value.trim();
|
|
25
|
-
return trimmedValue.replace(new RegExp(IDE_PATTERN, 'g'), 'CHE-$1.$2.$3');
|
|
26
|
-
}
|
|
27
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IdeFormatterDirective, deps: [{ token: i1.FoehnInputTextComponent }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
28
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: IdeFormatterDirective, selector: "[ideFormatter]", host: { listeners: { "blur": "onBlur($event.target.value)" } }, ngImport: i0 }); }
|
|
29
|
-
}
|
|
30
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IdeFormatterDirective, decorators: [{
|
|
31
|
-
type: Directive,
|
|
32
|
-
args: [{ selector: '[ideFormatter]' }]
|
|
33
|
-
}], ctorParameters: () => [{ type: i1.FoehnInputTextComponent }], propDecorators: { onBlur: [{
|
|
34
|
-
type: HostListener,
|
|
35
|
-
args: ['blur', ['$event.target.value']]
|
|
36
|
-
}] } });
|
|
37
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWRlLWZvcm1hdHRlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmVzdGF0aW9ucy1uZy9zcmMvZGlyZWN0aXZlcy9pZGUtZm9ybWF0dGVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQzs7O0FBSXhELE1BQU0sV0FBVyxHQUFHLHlDQUF5QyxDQUFDO0FBRTlELDhEQUE4RDtBQUU5RCxNQUFNLE9BQU8scUJBQXFCO0lBQzlCLFlBQW9CLElBQTZCO1FBQTdCLFNBQUksR0FBSixJQUFJLENBQXlCO0lBQUcsQ0FBQztJQUdyRCxNQUFNLENBQUMsS0FBYTtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLFNBQVMsQ0FBQyxLQUFhO1FBQzNCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNULE9BQU8sRUFBRSxDQUFDO1FBQ2QsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVsQyxPQUFPLFlBQVksQ0FBQyxPQUFPLENBQ3ZCLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsRUFDNUIsY0FBYyxDQUNqQixDQUFDO0lBQ04sQ0FBQzsrR0ExQlEscUJBQXFCO21HQUFyQixxQkFBcUI7OzRGQUFyQixxQkFBcUI7a0JBRGpDLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsZ0JBQWdCLEVBQUU7NEZBS3JDLE1BQU07c0JBREwsWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERpcmVjdGl2ZSwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEZvZWhuSW5wdXRUZXh0Q29tcG9uZW50IH0gZnJvbSAnLi4vZm9laG4taW5wdXQvZm9laG4taW5wdXQtdGV4dC5jb21wb25lbnQnO1xuXG5jb25zdCBJREVfUEFUVEVSTiA9ICdeQ0hFLT8oXFxcXGR7M30pXFxcXC4/KFxcXFxkezN9KVxcXFwuPyhcXFxcZHszfSkkJztcblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tpZGVGb3JtYXR0ZXJdJyB9KVxuZXhwb3J0IGNsYXNzIElkZUZvcm1hdHRlckRpcmVjdGl2ZSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBob3N0OiBGb2VobklucHV0VGV4dENvbXBvbmVudCkge31cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2JsdXInLCBbJyRldmVudC50YXJnZXQudmFsdWUnXSlcbiAgICBvbkJsdXIodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvc3QudXBkYXRlTmdNb2RlbCh0aGlzLmZvcm1hdElkZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZvcm1hdHMgaWRlXG4gICAgICpcbiAgICAgKiBDSEUxMjM0NTY3ODkgPj4gQ0hFLTEyMy40NTYuNzg5XG4gICAgICogQHBhcmFtIHZhbHVlIGFzIGlkZVxuICAgICAqIEByZXR1cm5zIHN0cmluZ1xuICAgICAqL1xuICAgIHByaXZhdGUgZm9ybWF0SWRlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmltbWVkVmFsdWUgPSB2YWx1ZS50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHRyaW1tZWRWYWx1ZS5yZXBsYWNlKFxuICAgICAgICAgICAgbmV3IFJlZ0V4cChJREVfUEFUVEVSTiwgJ2cnKSxcbiAgICAgICAgICAgICdDSEUtJDEuJDIuJDMnXG4gICAgICAgICk7XG4gICAgfVxufVxuIl19
|