@sumaris-net/ngx-components 4.0.0-rc1 → 4.0.0-rc10
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/esm2022/public_api.mjs +5 -2
- package/esm2022/src/app/admin/admin-routing.module.mjs +5 -5
- package/esm2022/src/app/admin/admin.module.mjs +6 -6
- package/esm2022/src/app/admin/services/filter/person.filter.mjs +3 -2
- package/esm2022/src/app/admin/services/person.service.mjs +5 -5
- package/esm2022/src/app/admin/services/validator/person.validator.mjs +5 -5
- package/esm2022/src/app/admin/users/users.mjs +19 -28
- package/esm2022/src/app/admin/users/users.module.mjs +5 -5
- package/esm2022/src/app/core/about/about.modal.mjs +6 -6
- package/esm2022/src/app/core/about/about.module.mjs +5 -5
- package/esm2022/src/app/core/account/account.module.mjs +5 -5
- package/esm2022/src/app/core/account/account.page.mjs +23 -21
- package/esm2022/src/app/core/account/new-token.modal.mjs +20 -15
- package/esm2022/src/app/core/account/token.table.mjs +25 -20
- package/esm2022/src/app/core/auth/auth.form.mjs +6 -6
- package/esm2022/src/app/core/auth/auth.modal.mjs +5 -5
- package/esm2022/src/app/core/auth/auth.module.mjs +5 -5
- package/esm2022/src/app/core/core.module.mjs +5 -5
- package/esm2022/src/app/core/core.testing.module.mjs +5 -5
- package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +6 -6
- package/esm2022/src/app/core/form/buttons/form-buttons-bar.module.mjs +5 -5
- package/esm2022/src/app/core/form/entity/editor.class.mjs +18 -13
- package/esm2022/src/app/core/form/entity/entity-editor-modal.class.mjs +6 -6
- package/esm2022/src/app/core/form/entity/entity-editor.class.mjs +17 -11
- package/esm2022/src/app/core/form/entity/entity-metadata.component.mjs +5 -5
- package/esm2022/src/app/core/form/entity/entity.module.mjs +5 -5
- package/esm2022/src/app/core/form/form.class.mjs +5 -5
- package/esm2022/src/app/core/form/form.module.mjs +5 -5
- package/esm2022/src/app/core/form/list/list.form.mjs +6 -6
- package/esm2022/src/app/core/form/list/list.module.mjs +5 -5
- package/esm2022/src/app/core/form/properties/properties.form.mjs +7 -7
- package/esm2022/src/app/core/form/properties/properties.module.mjs +5 -5
- package/esm2022/src/app/core/form/properties/properties.table.mjs +12 -12
- package/esm2022/src/app/core/form/properties/property.validator.mjs +5 -5
- package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +5 -5
- package/esm2022/src/app/core/form/properties/testing/properties-form.testing.module.mjs +5 -5
- package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.mjs +5 -5
- package/esm2022/src/app/core/form/text-popover/testing/text-popover.testing.module.mjs +5 -5
- package/esm2022/src/app/core/form/text-popover/text-popover.component.mjs +7 -7
- package/esm2022/src/app/core/form/text-popover/text-popover.module.mjs +6 -11
- package/esm2022/src/app/core/graphql/graphql.module.mjs +6 -6
- package/esm2022/src/app/core/graphql/graphql.service.mjs +19 -18
- package/esm2022/src/app/core/home/home.mjs +7 -8
- package/esm2022/src/app/core/home/home.module.mjs +5 -5
- package/esm2022/src/app/core/icon/icon.component.mjs +4 -4
- package/esm2022/src/app/core/icon/icon.module.mjs +5 -5
- package/esm2022/src/app/core/install/install-upgrade-card.component.mjs +6 -6
- package/esm2022/src/app/core/install/install-upgrade-card.module.mjs +5 -5
- package/esm2022/src/app/core/menu/menu.component.mjs +16 -12
- package/esm2022/src/app/core/menu/menu.model.mjs +3 -2
- package/esm2022/src/app/core/menu/menu.module.mjs +5 -5
- package/esm2022/src/app/core/menu/menu.service.mjs +13 -7
- package/esm2022/src/app/core/menu/sub-menu-tab.directive.mjs +5 -5
- package/esm2022/src/app/core/menu/testing/menu-other.testing.mjs +5 -5
- package/esm2022/src/app/core/menu/testing/menu.testing.mjs +5 -5
- package/esm2022/src/app/core/menu/testing/menu.testing.module.mjs +5 -5
- package/esm2022/src/app/core/offline/update-offline-mode-card.component.mjs +5 -5
- package/esm2022/src/app/core/offline/update-offline-mode-card.module.mjs +5 -5
- package/esm2022/src/app/core/peer/select-peer.modal.mjs +8 -7
- package/esm2022/src/app/core/peer/select-peer.module.mjs +5 -5
- package/esm2022/src/app/core/register/register-confirm.page.mjs +5 -5
- package/esm2022/src/app/core/register/register.form.mjs +6 -6
- package/esm2022/src/app/core/register/register.modal.mjs +5 -5
- package/esm2022/src/app/core/register/register.module.mjs +5 -5
- package/esm2022/src/app/core/services/account.service.mjs +52 -26
- package/esm2022/src/app/core/services/auth-guard.service.mjs +6 -6
- package/esm2022/src/app/core/services/base-entity-service.class.mjs +5 -5
- package/esm2022/src/app/core/services/base-graphql-service.class.mjs +6 -6
- package/esm2022/src/app/core/services/config/core.config.mjs +7 -7
- package/esm2022/src/app/core/services/config.service.mjs +15 -13
- package/esm2022/src/app/core/services/crypto.service.mjs +4 -4
- package/esm2022/src/app/core/services/local-settings.service.mjs +6 -6
- package/esm2022/src/app/core/services/model/account.model.mjs +5 -3
- package/esm2022/src/app/core/services/model/config.model.mjs +8 -6
- package/esm2022/src/app/core/services/model/department.model.mjs +3 -2
- package/esm2022/src/app/core/services/model/peer.model.mjs +3 -2
- package/esm2022/src/app/core/services/model/person.model.mjs +3 -2
- package/esm2022/src/app/core/services/model/referential.model.mjs +7 -3
- package/esm2022/src/app/core/services/model/token.model.mjs +8 -3
- package/esm2022/src/app/core/services/network.service.mjs +60 -42
- package/esm2022/src/app/core/services/network.types.mjs +1 -1
- package/esm2022/src/app/core/services/pipes/account.pipes.mjs +9 -9
- package/esm2022/src/app/core/services/pipes/department-to-string.pipe.mjs +5 -5
- package/esm2022/src/app/core/services/pipes/person-to-string.pipe.mjs +5 -5
- package/esm2022/src/app/core/services/pipes/usage-mode.pipes.mjs +9 -9
- package/esm2022/src/app/core/services/platform.service.mjs +23 -12
- package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +6 -6
- package/esm2022/src/app/core/services/testing/referential-filter.model.mjs +1 -1
- package/esm2022/src/app/core/services/testing/referential.validator.mjs +5 -5
- package/esm2022/src/app/core/services/validator/account.validator.mjs +5 -5
- package/esm2022/src/app/core/services/validator/base.validator.class.mjs +5 -5
- package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +5 -5
- package/esm2022/src/app/core/services/validator/user-settings.validator.mjs +5 -5
- package/esm2022/src/app/core/services/validator/user-token.validator.mjs +5 -5
- package/esm2022/src/app/core/settings/settings.module.mjs +5 -5
- package/esm2022/src/app/core/settings/settings.page.mjs +7 -7
- package/esm2022/src/app/core/table/actions-column.component.mjs +5 -5
- package/esm2022/src/app/core/table/async-table.class.mjs +5 -5
- package/esm2022/src/app/core/table/entities-async-table-datasource.class.mjs +5 -5
- package/esm2022/src/app/core/table/entities-table-datasource.class.mjs +5 -5
- package/esm2022/src/app/core/table/memory-table.class.mjs +5 -5
- package/esm2022/src/app/core/table/table-select-columns.component.mjs +5 -5
- package/esm2022/src/app/core/table/table.class.mjs +9 -5
- package/esm2022/src/app/core/table/table.module.mjs +5 -5
- package/esm2022/src/app/core/table/testing/table-validator.service.mjs +5 -5
- package/esm2022/src/app/core/table/testing/table.testing.mjs +7 -7
- package/esm2022/src/app/core/table/testing/table.testing.module.mjs +5 -5
- package/esm2022/src/app/core/table/testing/table2-validator.service.mjs +5 -5
- package/esm2022/src/app/core/table/testing/table2.testing.mjs +7 -7
- package/esm2022/src/app/shared/audio/audio.mjs +6 -6
- package/esm2022/src/app/shared/audio/audio.testing.mjs +5 -5
- package/esm2022/src/app/shared/audio/audio.testing.module.mjs +5 -5
- package/esm2022/src/app/shared/capacitor/keyboard.mjs +5 -5
- package/esm2022/src/app/shared/debug/debug.component.mjs +6 -6
- package/esm2022/src/app/shared/debug/debug.module.mjs +5 -5
- package/esm2022/src/app/shared/directives/autofocus.directive.mjs +5 -5
- package/esm2022/src/app/shared/directives/autotitle.directive.mjs +6 -6
- package/esm2022/src/app/shared/directives/directives.module.mjs +5 -5
- package/esm2022/src/app/shared/directives/drag-and-drop.directive.mjs +4 -4
- package/esm2022/src/app/shared/directives/ng-var.directive.mjs +5 -5
- package/esm2022/src/app/shared/directives/resizable/resizable.component.mjs +6 -6
- package/esm2022/src/app/shared/directives/resizable/resizable.directive.mjs +6 -6
- package/esm2022/src/app/shared/directives/resizable/resizable.module.mjs +5 -5
- package/esm2022/src/app/shared/file/file.service.mjs +6 -6
- package/esm2022/src/app/shared/form/field.component.mjs +7 -7
- package/esm2022/src/app/shared/form/loading-spinner.mjs +4 -4
- package/esm2022/src/app/shared/gesture/gesture-config.mjs +4 -4
- package/esm2022/src/app/shared/guard/component-dirty.guard.mjs +5 -5
- package/esm2022/src/app/shared/help/help.modal.mjs +5 -5
- package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +8 -9
- package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +5 -5
- package/esm2022/src/app/shared/hotkeys/shared-hotkeys.module.mjs +5 -5
- package/esm2022/src/app/shared/http/http.utils.mjs +15 -11
- package/esm2022/src/app/shared/image/gallery/image-gallery.component.mjs +6 -6
- package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +5 -5
- package/esm2022/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +1 -1
- package/esm2022/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +5 -5
- package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +5 -5
- package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +5 -5
- package/esm2022/src/app/shared/image/image.module.mjs +5 -5
- package/esm2022/src/app/shared/image/image.service.mjs +6 -6
- package/esm2022/src/app/shared/interceptors/progess.interceptor.mjs +1 -1
- package/esm2022/src/app/shared/logging/logging-service.class.mjs +6 -6
- package/esm2022/src/app/shared/logging/logging-service.module.mjs +5 -5
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +9 -9
- package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +5 -5
- package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +6 -6
- package/esm2022/src/app/shared/material/badge/badge.directive.mjs +6 -6
- package/esm2022/src/app/shared/material/badge/badge.module.mjs +5 -5
- package/esm2022/src/app/shared/material/badge/badge.test.mjs +5 -5
- package/esm2022/src/app/shared/material/boolean/boolean.module.mjs +5 -5
- package/esm2022/src/app/shared/material/boolean/material-boolean2.mjs +6 -6
- package/esm2022/src/app/shared/material/boolean/material.boolean.mjs +7 -7
- package/esm2022/src/app/shared/material/boolean/testing/boolean.test.page.mjs +5 -5
- package/esm2022/src/app/shared/material/chips/chips.module.mjs +5 -5
- package/esm2022/src/app/shared/material/chips/material.chips.mjs +7 -7
- package/esm2022/src/app/shared/material/chips/testing/chips.test.mjs +5 -5
- package/esm2022/src/app/shared/material/datetime/datetime.module.mjs +5 -5
- package/esm2022/src/app/shared/material/datetime/material.date.mjs +8 -8
- package/esm2022/src/app/shared/material/datetime/material.dateshort.mjs +7 -7
- package/esm2022/src/app/shared/material/datetime/material.datetime.mjs +36 -10
- package/esm2022/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +15 -8
- package/esm2022/src/app/shared/material/datetime/testing/mat-date.test.mjs +8 -7
- package/esm2022/src/app/shared/material/datetime/testing/mat-dateshort.test.mjs +5 -5
- package/esm2022/src/app/shared/material/duration/duration.module.mjs +5 -5
- package/esm2022/src/app/shared/material/duration/material.duration.mjs +6 -6
- package/esm2022/src/app/shared/material/duration/testing/mat-duration.test.mjs +5 -5
- package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +35 -10
- package/esm2022/src/app/shared/material/latlong/material.latlong.module.mjs +5 -5
- package/esm2022/src/app/shared/material/latlong/testing/latlong.test.mjs +5 -5
- package/esm2022/src/app/shared/material/material.module.mjs +14 -9
- package/esm2022/src/app/shared/material/material.testing.module.mjs +16 -5
- package/esm2022/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +5 -5
- package/esm2022/src/app/shared/material/numpad/numpad.component.mjs +5 -5
- package/esm2022/src/app/shared/material/numpad/numpad.container.mjs +5 -5
- package/esm2022/src/app/shared/material/numpad/numpad.content.mjs +4 -4
- package/esm2022/src/app/shared/material/numpad/numpad.directive.mjs +5 -5
- package/esm2022/src/app/shared/material/numpad/numpad.dom-service.mjs +5 -5
- package/esm2022/src/app/shared/material/numpad/numpad.module.mjs +5 -5
- package/esm2022/src/app/shared/material/numpad/testing/numpad.test.mjs +5 -5
- package/esm2022/src/app/shared/material/paginator/material.paginator-i18n.mjs +5 -5
- package/esm2022/src/app/shared/material/stepper/material.stepper-i18n.mjs +5 -5
- package/esm2022/src/app/shared/material/swipe/material.swipe.mjs +6 -6
- package/esm2022/src/app/shared/material/swipe/swipe.module.mjs +5 -5
- package/esm2022/src/app/shared/material/swipe/testing/swipe.test.mjs +5 -5
- package/esm2022/src/app/shared/material/testing/common.test.mjs +5 -5
- package/esm2022/src/app/shared/material/text/testing/text-form.testing.mjs +31 -0
- package/esm2022/src/app/shared/material/text/text-form.component.mjs +97 -0
- package/esm2022/src/app/shared/material/text/text-form.module.mjs +63 -0
- package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +41 -17
- package/esm2022/src/app/shared/named-filter/named-filter.model.mjs +1 -1
- package/esm2022/src/app/shared/named-filter/named-filter.module.mjs +5 -5
- package/esm2022/src/app/shared/named-filter/named-filter.service.mjs +5 -5
- package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +25 -25
- package/esm2022/src/app/shared/pipes/colors.pipe.mjs +4 -4
- package/esm2022/src/app/shared/pipes/date-diff-duration.pipe.mjs +6 -6
- package/esm2022/src/app/shared/pipes/date-format.pipe.mjs +9 -9
- package/esm2022/src/app/shared/pipes/date-from-now.pipe.mjs +6 -6
- package/esm2022/src/app/shared/pipes/duration.pipe.mjs +6 -6
- package/esm2022/src/app/shared/pipes/file-size.pipe.mjs +4 -4
- package/esm2022/src/app/shared/pipes/form.pipes.mjs +21 -21
- package/esm2022/src/app/shared/pipes/highlight.pipe.mjs +5 -5
- package/esm2022/src/app/shared/pipes/latlong-format.pipe.mjs +10 -10
- package/esm2022/src/app/shared/pipes/maps.pipe.mjs +13 -13
- package/esm2022/src/app/shared/pipes/maskito.pipe.mjs +7 -7
- package/esm2022/src/app/shared/pipes/math.pipes.mjs +13 -13
- package/esm2022/src/app/shared/pipes/ng-init.pipe.mjs +4 -4
- package/esm2022/src/app/shared/pipes/number-format.pipe.mjs +5 -5
- package/esm2022/src/app/shared/pipes/pipes.module.mjs +5 -5
- package/esm2022/src/app/shared/pipes/property.pipes.mjs +9 -9
- package/esm2022/src/app/shared/pipes/string.pipes.mjs +31 -31
- package/esm2022/src/app/shared/pipes/translate-context.pipe.mjs +10 -10
- package/esm2022/src/app/shared/pipes/types.pipes.mjs +13 -13
- package/esm2022/src/app/shared/rx-state.module.mjs +5 -5
- package/esm2022/src/app/shared/services/entity-service.class.mjs +1 -1
- package/esm2022/src/app/shared/services/memory-entity-service.class.mjs +13 -13
- package/esm2022/src/app/shared/services/progress-bar.service.mjs +4 -4
- package/esm2022/src/app/shared/services/startable-observable-service.class.mjs +6 -6
- package/esm2022/src/app/shared/services/startable-service.class.mjs +7 -7
- package/esm2022/src/app/shared/services/translate-context.service.mjs +5 -5
- package/esm2022/src/app/shared/services.mjs +2 -2
- package/esm2022/src/app/shared/shared-routing.module.mjs +9 -9
- package/esm2022/src/app/shared/shared.module.mjs +27 -13
- package/esm2022/src/app/shared/shared.testing.module.mjs +5 -5
- package/esm2022/src/app/shared/storage/storage-explorer.component.mjs +6 -6
- package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +5 -5
- package/esm2022/src/app/shared/storage/storage-explorer.testing-routing.module.mjs +5 -5
- package/esm2022/src/app/shared/storage/storage-explorer.testing.module.mjs +5 -5
- package/esm2022/src/app/shared/storage/storage.service.mjs +6 -6
- package/esm2022/src/app/shared/testing/observable.test.mjs +5 -5
- package/esm2022/src/app/shared/testing/tests.page.mjs +6 -6
- package/esm2022/src/app/shared/toast/toast.testing.mjs +5 -5
- package/esm2022/src/app/shared/toast/toast.testing.module.mjs +5 -5
- package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +5 -5
- package/esm2022/src/app/shared/toolbar/toolbar.mjs +7 -7
- package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +5 -5
- package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.mjs +5 -5
- package/esm2022/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +5 -5
- package/esm2022/src/app/shared/upload-file/upload-file-popover.component.mjs +5 -5
- package/esm2022/src/app/shared/upload-file/upload-file.component.mjs +5 -5
- package/esm2022/src/app/shared/validator/form-error-adapter.class.mjs +6 -6
- package/esm2022/src/app/social/job/job.module.mjs +5 -5
- package/esm2022/src/app/social/job/progression/job-progression.component.mjs +5 -5
- package/esm2022/src/app/social/job/progression/job-progression.icon.mjs +6 -6
- package/esm2022/src/app/social/job/progression/job-progression.list.mjs +5 -5
- package/esm2022/src/app/social/job/progression/job-progression.model.mjs +3 -2
- package/esm2022/src/app/social/job/progression/job-progression.service.mjs +6 -6
- package/esm2022/src/app/social/job/testing/job-progression.testing.mjs +6 -6
- package/esm2022/src/app/social/job/testing/job-progression.testing.service.mjs +4 -4
- package/esm2022/src/app/social/job/testing/job.testing.module.mjs +5 -5
- package/esm2022/src/app/social/message/message.form.mjs +59 -7
- package/esm2022/src/app/social/message/message.modal.mjs +21 -13
- package/esm2022/src/app/social/message/message.model.mjs +5 -1
- package/esm2022/src/app/social/message/message.module.mjs +9 -22
- package/esm2022/src/app/social/message/message.service.mjs +33 -11
- package/esm2022/src/app/social/social.module.mjs +5 -5
- package/esm2022/src/app/social/social.testing.module.mjs +5 -5
- package/esm2022/src/app/social/user-event/notification/user-event-notification.icon.mjs +6 -6
- package/esm2022/src/app/social/user-event/notification/user-event-notification.list.mjs +6 -6
- package/esm2022/src/app/social/user-event/testing/user-event.testing.mjs +6 -6
- package/esm2022/src/app/social/user-event/testing/user-event.testing.model.mjs +3 -2
- package/esm2022/src/app/social/user-event/testing/user-event.testing.module.mjs +5 -5
- package/esm2022/src/app/social/user-event/testing/user-event.testing.service.mjs +6 -6
- package/esm2022/src/app/social/user-event/user-event.module.mjs +5 -5
- package/esm2022/src/app/social/user-event/user-event.service.mjs +40 -26
- package/esm2022/src/environments/environment.class.mjs +4 -1
- package/esm2022/src/environments/environment.loader.mjs +83 -0
- package/esm2022/src/environments/environment.mjs +18 -15
- package/fesm2022/sumaris-net.ngx-components.mjs +4422 -3975
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +31 -6
- package/public_api.d.ts +4 -1
- package/src/app/core/account/account.page.d.ts +3 -2
- package/src/app/core/account/new-token.modal.d.ts +1 -3
- package/src/app/core/account/token.table.d.ts +5 -3
- package/src/app/core/form/buttons/form-buttons-bar.component.d.ts +1 -1
- package/src/app/core/form/entity/editor.class.d.ts +1 -1
- package/src/app/core/form/entity/entity-editor.class.d.ts +10 -6
- package/src/app/core/form/entity/entity-metadata.component.d.ts +1 -1
- package/src/app/core/form/text-popover/text-popover.component.d.ts +1 -1
- package/src/app/core/form/text-popover/text-popover.module.d.ts +4 -5
- package/src/app/core/graphql/graphql.service.d.ts +2 -4
- package/src/app/core/graphql/graphql.utils.d.ts +1 -1
- package/src/app/core/menu/menu.component.d.ts +6 -2
- package/src/app/core/menu/menu.service.d.ts +2 -0
- package/src/app/core/services/account.service.d.ts +4 -0
- package/src/app/core/services/config/core.config.d.ts +2 -2
- package/src/app/core/services/model/referential.model.d.ts +2 -1
- package/src/app/core/services/model/token.model.d.ts +1 -0
- package/src/app/core/services/network.service.d.ts +11 -7
- package/src/app/core/table/table.class.d.ts +1 -0
- package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +2 -4
- package/src/app/shared/http/http.utils.d.ts +1 -0
- package/src/app/shared/inputs.d.ts +1 -1
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +1 -1
- package/src/app/shared/material/datetime/material.datetime.d.ts +10 -4
- package/src/app/shared/material/latlong/material.latlong.d.ts +10 -4
- package/src/app/shared/material/material.module.d.ts +2 -1
- package/src/app/shared/material/material.testing.module.d.ts +14 -13
- package/src/app/shared/material/text/testing/text-form.testing.d.ts +13 -0
- package/src/app/{core/form/text-popover → shared/material/text}/text-form.component.d.ts +2 -2
- package/src/app/shared/material/text/text-form.module.d.ts +16 -0
- package/src/app/shared/named-filter/named-filter-selector.component.d.ts +9 -3
- package/src/app/shared/services/entity-service.class.d.ts +1 -1
- package/src/app/shared/services/memory-entity-service.class.d.ts +7 -3
- package/src/app/shared/services.d.ts +1 -0
- package/src/app/shared/shared.module.d.ts +5 -3
- package/src/app/social/message/message.form.d.ts +8 -2
- package/src/app/social/message/message.modal.d.ts +5 -1
- package/src/app/social/message/message.model.d.ts +2 -0
- package/src/app/social/message/message.module.d.ts +2 -1
- package/src/app/social/message/message.service.d.ts +8 -3
- package/src/app/social/user-event/user-event.service.d.ts +5 -0
- package/src/assets/environments/environment-test.json +6 -0
- package/src/assets/i18n/en-US.json +25 -23
- package/src/assets/i18n/en.json +25 -23
- package/src/assets/i18n/fr.json +8 -5
- package/src/assets/manifest.json +1 -1
- package/src/environments/environment.class.d.ts +2 -0
- package/src/environments/environment.loader.d.ts +26 -0
- package/src/theme/_material.scss +20 -4
- package/src/theme/_ngx-components.globals.scss +2 -2
- package/src/theme/_ngx-components.scss +1 -1
- package/src/theme/_ngx-components.table.scss +9 -3
- package/esm2022/src/app/core/form/text-popover/text-form.component.mjs +0 -97
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import { AppEntityEditorModal } from '../form/entity/entity-editor-modal.class';
|
|
2
2
|
import { UserToken } from '../services/model/token.model';
|
|
3
3
|
import { Component, Input } from '@angular/core';
|
|
4
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
4
5
|
import { AppForm } from '../form/form.class';
|
|
5
6
|
import { isNilOrBlank, isNotNilOrBlank } from '../../shared/functions';
|
|
6
7
|
import { now } from 'moment';
|
|
7
8
|
import { Clipboard } from '@capacitor/clipboard';
|
|
8
9
|
import { fromUnixMsTimestamp } from '../../shared/dates';
|
|
10
|
+
import { Toasts } from '../../shared/toast/toasts';
|
|
11
|
+
import { ToastController } from '@ionic/angular';
|
|
9
12
|
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "
|
|
11
|
-
import * as i2 from "../services/
|
|
12
|
-
import * as i3 from "
|
|
13
|
-
import * as i4 from "@angular
|
|
14
|
-
import * as i5 from "@
|
|
13
|
+
import * as i1 from "../services/validator/user-token.validator";
|
|
14
|
+
import * as i2 from "../services/account.service";
|
|
15
|
+
import * as i3 from "@angular/common";
|
|
16
|
+
import * as i4 from "@ionic/angular";
|
|
17
|
+
import * as i5 from "@ngx-translate/core";
|
|
15
18
|
import * as i6 from "@angular/forms";
|
|
16
19
|
import * as i7 from "@angular/material/form-field";
|
|
17
20
|
import * as i8 from "@angular/material/input";
|
|
@@ -25,7 +28,6 @@ import * as i15 from "../../shared/pipes/string.pipes";
|
|
|
25
28
|
import * as i16 from "../../shared/pipes/form.pipes";
|
|
26
29
|
export class NewTokenModal extends AppEntityEditorModal {
|
|
27
30
|
injector;
|
|
28
|
-
translate;
|
|
29
31
|
validator;
|
|
30
32
|
accountService;
|
|
31
33
|
tokenForm;
|
|
@@ -34,12 +36,13 @@ export class NewTokenModal extends AppEntityEditorModal {
|
|
|
34
36
|
copiedLabel;
|
|
35
37
|
tokenScopes;
|
|
36
38
|
existingNames;
|
|
37
|
-
constructor(injector,
|
|
39
|
+
constructor(injector, validator, accountService) {
|
|
38
40
|
super(injector, UserToken, { tabCount: 1 });
|
|
39
41
|
this.injector = injector;
|
|
40
|
-
this.translate = translate;
|
|
41
42
|
this.validator = validator;
|
|
42
43
|
this.accountService = accountService;
|
|
44
|
+
this.translate = injector.get(TranslateService);
|
|
45
|
+
this.toastController = injector.get(ToastController);
|
|
43
46
|
this.tokenForm = validator.getFormGroup();
|
|
44
47
|
this.tokenAppForm = new AppForm(this.injector, this.tokenForm);
|
|
45
48
|
}
|
|
@@ -102,7 +105,9 @@ export class NewTokenModal extends AppEntityEditorModal {
|
|
|
102
105
|
async copy(event) {
|
|
103
106
|
event?.stopPropagation();
|
|
104
107
|
await Clipboard.write({ string: this.form.value.token });
|
|
105
|
-
this.
|
|
108
|
+
await Toasts.show(this.toastController, this.translate, {
|
|
109
|
+
type: 'info', message: 'ACCOUNT.TOKENS.CREATE.COPIED'
|
|
110
|
+
});
|
|
106
111
|
}
|
|
107
112
|
getFlags(scopes) {
|
|
108
113
|
let flags = 0;
|
|
@@ -111,15 +116,15 @@ export class NewTokenModal extends AppEntityEditorModal {
|
|
|
111
116
|
});
|
|
112
117
|
return flags;
|
|
113
118
|
}
|
|
114
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
115
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NewTokenModal, selector: "app-new-token-modal", inputs: { tokenScopes: "tokenScopes", existingNames: "existingNames" }, usesInheritance: true, ngImport: i0, template: "<app-modal-toolbar modalName=\"NewTokenModal\"\n [title]=\"$title | async\"\n [color]=\"'secondary'\"\n [showSpinner]=\"loading\"\n [canValidate]=\"!loading && valid\"\n (cancel)=\"close($event)\"\n (validate)=\"saveAndClose($event)\"\n></app-modal-toolbar>\n\n<ion-content>\n\n <!-- error -->\n <ion-item *ngIf=\"error\" lines=\"none\" class=\"ion-padding\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <h6 class=\"ion-padding\">{{ 'ACCOUNT.TOKENS.CREATE.DESCRIPTION' | translate }}</h6>\n\n <form class=\"form-container ion-no-padding\" [formGroup]=\"tokenForm\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <mat-form-field>\n <mat-label>{{'ACCOUNT.TOKENS.CREATE.NAME'|translate}}</mat-label>\n <input matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"name\"\n autocomplete=\"off\"\n required\n [readonly]=\"tokenForm | formGetValue: 'token' | isNotNilOrBlank\"\n >\n <mat-error *ngIf=\"form.controls.name.hasError('required') && form.controls.name.dirty\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"form.controls.name.hasError('notAlreadyExists') && form.controls.name.dirty\" translate>ACCOUNT.TOKENS.CREATE.NAME_ALREADY_EXISTS</mat-error>\n </mat-form-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <mat-chips-field\n formControlName=\"scopes\"\n appearance=\"fill\"\n chipColor=\"primary\"\n [placeholder]=\"'ACCOUNT.TOKENS.CREATE.SCOPES' | translate\"\n [config]=\"tokenConfig\"\n [mobile]=\"mobile\"\n [debug]=\"false\"\n [required]=\"true\"\n [readonly]=\"tokenForm | formGetValue: 'token' | isNotNilOrBlank\"\n ></mat-chips-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <mat-date-field\n formControlName=\"expirationDate\"\n [placeholder]=\"'ACCOUNT.TOKENS.CREATE.EXPIRATION_DATE' | translate\"\n [mobile]=\"mobile\"\n [required]=\"true\"\n [readonly]=\"tokenForm | formGetValue: 'token' | isNotNilOrBlank\"\n ></mat-date-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <ion-button\n *ngIf=\"tokenForm | formGetValue: 'token' | isNilOrBlank; else showToken\"\n [title]=\"'ACCOUNT.TOKENS.CREATE.BTN_GENERATE_TITLE' | translate\"\n (click)=\"generate($event)\"\n [disabled]=\"tokenForm.invalid\"\n >\n {{ 'ACCOUNT.TOKENS.CREATE.BTN_GENERATE' | translate}}\n </ion-button>\n <ng-template #showToken>\n <h6>{{ 'ACCOUNT.TOKENS.CREATE.COPY_HELP' | translate }}</h6>\n <ion-text style=\"display: block; background-color: lightgray\">{{ tokenForm | formGetValue: 'token' }}</ion-text>\n <button\n mat-icon-button\n [title]=\"'ACCOUNT.TOKENS.CREATE.BTN_COPY_TITLE' | translate\"\n (click)=\"copy($event)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n <ion-text>{{ copiedLabel | translate }}</ion-text>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </form>\n\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col>\n <ng-content></ng-content>\n </ion-col>\n\n <ion-col size=\"auto\">\n\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close($event)\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n\n <ion-button [fill]=\"invalid ? 'clear' : 'solid'\"\n [disabled]=\"disabled || loading || invalid\"\n (click)=\"saveAndClose($event)\"\n (keyup.enter)=\"saveAndClose($event)\"\n color=\"tertiary\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n\n</ion-footer>\n", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i5.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i5.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i5.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i5.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i5.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i5.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i5.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i5.IonRow, selector: "ion-row" }, { kind: "component", type: i5.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "component", type: i5.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.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: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i11.MatDate, selector: "mat-date-field", inputs: ["mobile", "formControl", "formControlName", "placeholder", "floatLabel", "appearance", "required", "compact", "placeholderChar", "autofocus", "startDate", "clearable", "timezone", "datePickerFilter", "readonly", "tabindex"] }, { kind: "component", type: i12.MatChipsField, selector: "mat-chips-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "appearance", "placeholder", "suggestFn", "required", "mobile", "readonly", "clearable", "debounceTime", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "autofocus", "config", "i18nPrefix", "noResultMessage", "class", "panelWidth", "matAutocompletePosition", "itemSize", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "chipColor", "debug", "filter", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keyup.enter"] }, { kind: "directive", type: i13.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i14.ModalToolbarComponent, selector: "app-modal-toolbar", inputs: ["modalName", "title", "color", "showSpinner", "canValidate", "validateIcon"], outputs: ["cancel", "validate"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "pipe", type: i15.IsNilOrBlankPipe, name: "isNilOrBlank" }, { kind: "pipe", type: i15.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }, { kind: "pipe", type: i16.FormGetValuePipe, name: "formGetValue" }] });
|
|
119
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: NewTokenModal, deps: [{ token: i0.Injector }, { token: i1.UserTokenValidatorService }, { token: i2.AccountService }], target: i0.ɵɵFactoryTarget.Component });
|
|
120
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: NewTokenModal, selector: "app-new-token-modal", inputs: { tokenScopes: "tokenScopes", existingNames: "existingNames" }, usesInheritance: true, ngImport: i0, template: "<app-modal-toolbar modalName=\"NewTokenModal\"\n [title]=\"$title | async\"\n [color]=\"'secondary'\"\n [showSpinner]=\"loading\"\n [canValidate]=\"!loading && valid\"\n (cancel)=\"close($event)\"\n (validate)=\"saveAndClose($event)\"\n></app-modal-toolbar>\n\n<ion-content class=\"ion-padding\">\n\n <!-- error -->\n <ion-item *ngIf=\"error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <p><b translate>ACCOUNT.TOKENS.CREATE.DESCRIPTION</b></p>\n\n <form class=\"form-container\" [formGroup]=\"tokenForm\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-form-field>\n <mat-label>{{'ACCOUNT.TOKENS.CREATE.NAME'|translate}}</mat-label>\n <input matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"name\"\n autocomplete=\"off\"\n required\n [readonly]=\"tokenForm | formGetValue: 'token' | isNotNilOrBlank\"\n >\n <mat-error *ngIf=\"form.controls.name.hasError('required') && form.controls.name.touched\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"form.controls.name.hasError('notAlreadyExists') && form.controls.name.touched\" translate>ACCOUNT.TOKENS.CREATE.NAME_ALREADY_EXISTS</mat-error>\n </mat-form-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <mat-chips-field\n formControlName=\"scopes\"\n appearance=\"fill\"\n chipColor=\"primary\"\n [placeholder]=\"'ACCOUNT.TOKENS.CREATE.SCOPES' | translate\"\n [config]=\"tokenConfig\"\n [mobile]=\"mobile\"\n [debug]=\"false\"\n [required]=\"true\"\n [readonly]=\"tokenForm | formGetValue: 'token' | isNotNilOrBlank\"\n >\n <mat-error *ngIf=\"form.controls.name.hasError('notEmptyArray') && form.controls.name.touched\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-chips-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <mat-date-field\n formControlName=\"expirationDate\"\n [placeholder]=\"'ACCOUNT.TOKENS.CREATE.EXPIRATION_DATE' | translate\"\n [mobile]=\"mobile\"\n [required]=\"true\"\n [readonly]=\"tokenForm | formGetValue: 'token' | isNotNilOrBlank\"\n ></mat-date-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <ion-button\n *ngIf=\"tokenForm | formGetValue: 'token' | isNilOrBlank; else showToken\"\n [title]=\"'ACCOUNT.TOKENS.CREATE.BTN_GENERATE_TITLE' | translate\"\n (click)=\"generate($event)\"\n [disabled]=\"tokenForm.invalid\"\n >\n {{ 'ACCOUNT.TOKENS.CREATE.BTN_GENERATE' | translate}}\n </ion-button>\n <ng-template #showToken>\n <p><b translate>ACCOUNT.TOKENS.CREATE.COPY_HELP</b></p>\n <mat-form-field>\n <textarea matInput formControlName=\"token\" readonly style=\"height: auto; background-color: lightgray;\" rows=\"4\"></textarea>\n <button matSuffix\n mat-icon-button\n [title]=\"'ACCOUNT.TOKENS.CREATE.BTN_COPY_TITLE' | translate\"\n (click)=\"copy($event)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n </mat-form-field>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </form>\n\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col>\n <ng-content></ng-content>\n </ion-col>\n\n <ion-col size=\"auto\">\n\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close($event)\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n\n <ion-button [fill]=\"invalid ? 'clear' : 'solid'\"\n [disabled]=\"disabled || loading || invalid\"\n (click)=\"saveAndClose($event)\"\n (keyup.enter)=\"saveAndClose($event)\"\n color=\"tertiary\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n\n</ion-footer>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i4.IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "directive", type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.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: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i6.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i8.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: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i10.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i11.MatDate, selector: "mat-date-field", inputs: ["mobile", "formControl", "formControlName", "placeholder", "floatLabel", "appearance", "required", "compact", "placeholderChar", "autofocus", "startDate", "clearable", "timezone", "datePickerFilter", "readonly", "tabindex"] }, { kind: "component", type: i12.MatChipsField, selector: "mat-chips-field", inputs: ["equals", "logPrefix", "formControl", "formControlName", "floatLabel", "appearance", "placeholder", "suggestFn", "required", "mobile", "readonly", "clearable", "debounceTime", "displayWith", "displayAttributes", "displayColumnSizes", "displayColumnNames", "highlightAccent", "showAllOnFocus", "showPanelOnFocus", "autofocus", "config", "i18nPrefix", "noResultMessage", "class", "panelWidth", "matAutocompletePosition", "itemSize", "fetchMoreThreshold", "suggestLengthThreshold", "showLoadingSpinner", "chipColor", "debug", "filter", "tabindex", "items"], outputs: ["click", "blur", "focus", "dropButtonClick", "keydown.escape", "keyup.enter"] }, { kind: "directive", type: i13.AutofocusDirective, selector: "[autofocus], input[appAutofocus]", inputs: ["appAutofocus", "autofocusDelay"] }, { kind: "component", type: i14.ModalToolbarComponent, selector: "app-modal-toolbar", inputs: ["modalName", "title", "color", "showSpinner", "canValidate", "validateIcon"], outputs: ["cancel", "validate"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i15.IsNilOrBlankPipe, name: "isNilOrBlank" }, { kind: "pipe", type: i15.IsNotNilOrBlankPipe, name: "isNotNilOrBlank" }, { kind: "pipe", type: i16.FormGetValuePipe, name: "formGetValue" }] });
|
|
116
121
|
}
|
|
117
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
122
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: NewTokenModal, decorators: [{
|
|
118
123
|
type: Component,
|
|
119
|
-
args: [{ selector: 'app-new-token-modal', template: "<app-modal-toolbar modalName=\"NewTokenModal\"\n [title]=\"$title | async\"\n [color]=\"'secondary'\"\n [showSpinner]=\"loading\"\n [canValidate]=\"!loading && valid\"\n (cancel)=\"close($event)\"\n (validate)=\"saveAndClose($event)\"\n></app-modal-toolbar>\n\n<ion-content>\n\n <!-- error -->\n <ion-item *ngIf=\"error\" lines=\"none\"
|
|
120
|
-
}], ctorParameters:
|
|
124
|
+
args: [{ selector: 'app-new-token-modal', template: "<app-modal-toolbar modalName=\"NewTokenModal\"\n [title]=\"$title | async\"\n [color]=\"'secondary'\"\n [showSpinner]=\"loading\"\n [canValidate]=\"!loading && valid\"\n (cancel)=\"close($event)\"\n (validate)=\"saveAndClose($event)\"\n></app-modal-toolbar>\n\n<ion-content class=\"ion-padding\">\n\n <!-- error -->\n <ion-item *ngIf=\"error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" class=\"error\" [innerHTML]=\"error | translate\"></ion-label>\n </ion-item>\n\n <p><b translate>ACCOUNT.TOKENS.CREATE.DESCRIPTION</b></p>\n\n <form class=\"form-container\" [formGroup]=\"tokenForm\">\n <ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col>\n <mat-form-field>\n <mat-label>{{'ACCOUNT.TOKENS.CREATE.NAME'|translate}}</mat-label>\n <input matInput\n [appAutofocus]=\"true\"\n [autofocusDelay]=\"500\"\n formControlName=\"name\"\n autocomplete=\"off\"\n required\n [readonly]=\"tokenForm | formGetValue: 'token' | isNotNilOrBlank\"\n >\n <mat-error *ngIf=\"form.controls.name.hasError('required') && form.controls.name.touched\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"form.controls.name.hasError('notAlreadyExists') && form.controls.name.touched\" translate>ACCOUNT.TOKENS.CREATE.NAME_ALREADY_EXISTS</mat-error>\n </mat-form-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <mat-chips-field\n formControlName=\"scopes\"\n appearance=\"fill\"\n chipColor=\"primary\"\n [placeholder]=\"'ACCOUNT.TOKENS.CREATE.SCOPES' | translate\"\n [config]=\"tokenConfig\"\n [mobile]=\"mobile\"\n [debug]=\"false\"\n [required]=\"true\"\n [readonly]=\"tokenForm | formGetValue: 'token' | isNotNilOrBlank\"\n >\n <mat-error *ngIf=\"form.controls.name.hasError('notEmptyArray') && form.controls.name.touched\" translate>ERROR.FIELD_REQUIRED</mat-error>\n </mat-chips-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <mat-date-field\n formControlName=\"expirationDate\"\n [placeholder]=\"'ACCOUNT.TOKENS.CREATE.EXPIRATION_DATE' | translate\"\n [mobile]=\"mobile\"\n [required]=\"true\"\n [readonly]=\"tokenForm | formGetValue: 'token' | isNotNilOrBlank\"\n ></mat-date-field>\n </ion-col>\n </ion-row>\n <ion-row>\n <ion-col>\n <ion-button\n *ngIf=\"tokenForm | formGetValue: 'token' | isNilOrBlank; else showToken\"\n [title]=\"'ACCOUNT.TOKENS.CREATE.BTN_GENERATE_TITLE' | translate\"\n (click)=\"generate($event)\"\n [disabled]=\"tokenForm.invalid\"\n >\n {{ 'ACCOUNT.TOKENS.CREATE.BTN_GENERATE' | translate}}\n </ion-button>\n <ng-template #showToken>\n <p><b translate>ACCOUNT.TOKENS.CREATE.COPY_HELP</b></p>\n <mat-form-field>\n <textarea matInput formControlName=\"token\" readonly style=\"height: auto; background-color: lightgray;\" rows=\"4\"></textarea>\n <button matSuffix\n mat-icon-button\n [title]=\"'ACCOUNT.TOKENS.CREATE.BTN_COPY_TITLE' | translate\"\n (click)=\"copy($event)\"\n >\n <mat-icon>content_copy</mat-icon>\n </button>\n </mat-form-field>\n </ng-template>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </form>\n\n</ion-content>\n\n<ion-footer hidden-xs hidden-sm hidden-mobile>\n\n <ion-toolbar>\n <ion-row class=\"ion-no-padding\" nowrap>\n <ion-col>\n <ng-content></ng-content>\n </ion-col>\n\n <ion-col size=\"auto\">\n\n <ion-button fill=\"clear\" color=\"dark\" (click)=\"close($event)\">\n <ion-label translate>COMMON.BTN_CANCEL</ion-label>\n </ion-button>\n\n <ion-button [fill]=\"invalid ? 'clear' : 'solid'\"\n [disabled]=\"disabled || loading || invalid\"\n (click)=\"saveAndClose($event)\"\n (keyup.enter)=\"saveAndClose($event)\"\n color=\"tertiary\">\n <ion-label translate>COMMON.BTN_VALIDATE</ion-label>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-toolbar>\n\n</ion-footer>\n" }]
|
|
125
|
+
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.UserTokenValidatorService }, { type: i2.AccountService }], propDecorators: { tokenScopes: [{
|
|
121
126
|
type: Input
|
|
122
127
|
}], existingNames: [{
|
|
123
128
|
type: Input
|
|
124
129
|
}] } });
|
|
125
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXRva2VuLm1vZGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2FjY291bnQvbmV3LXRva2VuLm1vZGFsLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2FjY291bnQvbmV3LXRva2VuLm1vZGFsLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUE0QixNQUFNLDBDQUEwQyxDQUFDO0FBQ3pHLE9BQU8sRUFBYSxTQUFTLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUVwRSxPQUFPLEVBQUMsU0FBUyxFQUFZLEtBQUssRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUtqRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFM0MsT0FBTyxFQUFDLFlBQVksRUFBRSxlQUFlLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRSxPQUFPLEVBQVMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMvQyxPQUFPLEVBQVksbUJBQW1CLEVBQW9CLE1BQU0sb0JBQW9CLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVdyRixNQUFNLE9BQU8sYUFBYyxTQUFRLG9CQUErQjtJQVV0RDtJQUNFO0lBQ0E7SUFDQTtJQVhaLFNBQVMsQ0FBbUI7SUFDNUIsWUFBWSxDQUFXO0lBQ3ZCLFdBQVcsQ0FBNkI7SUFDeEMsV0FBVyxDQUFTO0lBQ1gsV0FBVyxDQUFlO0lBQzFCLGFBQWEsQ0FBVztJQUVqQyxZQUNVLFFBQWtCLEVBQ2hCLFNBQTJCLEVBQzNCLFNBQW9DLEVBQ3BDLGNBQThCO1FBRXhDLEtBQUssQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLEVBQUMsUUFBUSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUM7UUFMbEMsYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNo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QUFJLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUM7YUFDdkM7WUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUM7WUFFOUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBRXJCO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xCO0lBRUgsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBYztRQUN2QixLQUFLLEVBQUUsZUFBZSxFQUFFLENBQUM7UUFDekIsTUFBTSxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLFdBQVcsR0FBRyw4QkFBOEIsQ0FBQztJQUNwRCxDQUFDO0lBRVMsUUFBUSxDQUFDLE1BQW9CO1FBQ3JDLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNkLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDckIsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7d0dBL0dVLGFBQWE7NEZBQWIsYUFBYSwwSkN4QjFCLHM5SUF3SEE7OzRGRGhHYSxhQUFhO2tCQUp6QixTQUFTOytCQUNFLHFCQUFxQjttTUFTdEIsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcHBFbnRpdHlFZGl0b3JNb2RhbCwgSUVudGl0eUVkaXRvck1vZGFsT3B0aW9uc30gZnJvbSAnLi4vZm9ybS9lbnRpdHkvZW50aXR5LWVkaXRvci1tb2RhbC5jbGFzcyc7XG5pbXBvcnQge1Rva2VuU2NvcGUsIFVzZXJUb2tlbn0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvdG9rZW4ubW9kZWwnO1xuaW1wb3J0IHtVbnR5cGVkRm9ybUdyb3VwfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge0NvbXBvbmVudCwgSW5qZWN0b3IsIElucHV0LCBPbkluaXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtVc2VyVG9rZW5WYWxpZGF0b3JTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy92YWxpZGF0b3IvdXNlci10b2tlbi52YWxpZGF0b3InO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7TWF0QXV0b2NvbXBsZXRlQ29uZmlnSG9sZGVyLCBNYXRBdXRvY29tcGxldGVGaWVsZENvbmZpZ30gZnJvbSAnLi4vLi4vc2hhcmVkL21hdGVyaWFsL2F1dG9jb21wbGV0ZS9tYXRlcmlhbC5hdXRvY29tcGxldGUuY29uZmlnJztcbmltcG9ydCB7SUFwcEZvcm19IGZyb20gJy4uL2Zvcm0vZm9ybS51dGlscyc7XG5pbXBvcnQge0FwcEZvcm19IGZyb20gJy4uL2Zvcm0vZm9ybS5jbGFzcyc7XG5pbXBvcnQge0FjY291bnRTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHtpc05pbE9yQmxhbmssIGlzTm90TmlsT3JCbGFua30gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge01vbWVudCwgbm93fSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtDbGlwYm9hcmR9IGZyb20gJ0BjYXBhY2l0b3IvY2xpcGJvYXJkJztcbmltcG9ydCB7RGF0ZVV0aWxzLCBmcm9tVW5peE1zVGltZXN0YW1wLCBmcm9tVW5peFRpbWVzdGFtcH0gZnJvbSAnLi4vLi4vc2hhcmVkL2RhdGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBJTmV3VG9rZW5Nb2RhbE9wdGlvbnMgZXh0ZW5kcyBJRW50aXR5RWRpdG9yTW9kYWxPcHRpb25zPFVzZXJUb2tlbj4ge1xuICB0b2tlblNjb3BlczogVG9rZW5TY29wZVtdO1xuICBleGlzdGluZ05hbWVzOiBzdHJpbmdbXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLW5ldy10b2tlbi1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZXctdG9rZW4ubW9kYWwuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgTmV3VG9rZW5Nb2RhbCBleHRlbmRzIEFwcEVudGl0eUVkaXRvck1vZGFsPFVzZXJUb2tlbj4gaW1wbGVtZW50cyBPbkluaXQsIElOZXdUb2tlbk1vZGFsT3B0aW9ucyB7XG5cbiAgdG9rZW5Gb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuICB0b2tlbkFwcEZvcm06IElBcHBGb3JtO1xuICB0b2tlbkNvbmZpZzogTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc7XG4gIGNvcGllZExhYmVsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRva2VuU2NvcGVzOiBUb2tlblNjb3BlW107XG4gIEBJbnB1dCgpIGV4aXN0aW5nTmFtZXM6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRvcjogVXNlclRva2VuVmFsaWRhdG9yU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgYWNjb3VudFNlcnZpY2U6IEFjY291bnRTZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGluamVjdG9yLCBVc2VyVG9rZW4sIHt0YWJDb3VudDogMX0pO1xuXG4gICAgdGhpcy50b2tlbkZvcm0gPSB2YWxpZGF0b3IuZ2V0Rm9ybUdyb3VwKCk7XG4gICAgdGhpcy50b2tlbkFwcEZvcm0gPSBuZXcgQXBwRm9ybSh0aGlzLmluamVjdG9yLCB0aGlzLnRva2VuRm9ybSk7XG5cbiAgfVxuXG4gIGdldCB2YWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIudmFsaWQgJiYgaXNOb3ROaWxPckJsYW5rKHRoaXMuZm9ybS52YWx1ZS50b2tlbik7XG4gIH1cblxuICBnZXQgaW52YWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gc3VwZXIuaW52YWxpZCB8fCBpc05pbE9yQmxhbmsodGhpcy5mb3JtLnZhbHVlLnRva2VuKTtcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICB0aGlzLnRva2VuQ29uZmlnID0ge1xuICAgICAgaXRlbXM6IHRoaXMudG9rZW5TY29wZXMuc2xpY2UoKS5tYXAodmFsdWUgPT4ge1xuICAgICAgICB2YWx1ZS5uYW1lID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh2YWx1ZS5uYW1lKTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfSksXG4gICAgICBhdHRyaWJ1dGVzOiBbJ25hbWUnXSxcbiAgICB9O1xuXG4gICAgdGhpcy52YWxpZGF0b3IudXBkYXRlRm9ybUdyb3VwKHRoaXMuZm9ybSwgdGhpcy5leGlzdGluZ05hbWVzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb21wdXRlVGl0bGUoZGF0YTogVXNlclRva2VuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnQUNDT1VOVC5UT0tFTlMuQ1JFQVRFLlRJVExFJyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0IGZvcm0oKTogVW50eXBlZEZvcm1Hcm91cCB7XG4gICAgcmV0dXJuIHRoaXMudG9rZW5Gb3JtO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEZpcnN0SW52YWxpZFRhYkluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJGb3JtcygpIHtcbiAgICB0aGlzLmFkZENoaWxkRm9ybSh0aGlzLnRva2VuQXBwRm9ybSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2V0VmFsdWUoZGF0YTogVXNlclRva2VuKTogUHJvbWlzZTx2b2lkPiB8IHZvaWQge1xuXG4gICAgLy8gQWZmZWN0IHB1YmtleSBmcm9tIGN1cnJlbnQgYWNjb3VudFxuICAgIGRhdGEucHVia2V5ID0gdGhpcy5hY2NvdW50U2VydmljZS5hY2NvdW50LnB1YmtleTtcblxuICAgIC8vIERlZmF1bHQgZXhwaXJhdGlvbiBkYXRlXG4gICAgZGF0YS5leHBpcmF0aW9uRGF0ZSA9IGZyb21Vbml4TXNUaW1lc3RhbXAobm93KCkpLmFkZCgxLCAnbW9udGgnKTtcblxuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKGRhdGEuYXNPYmplY3QoKSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VmFsdWUoKTogUHJvbWlzZTxVc2VyVG9rZW4+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHN1cGVyLmdldFZhbHVlKCk7XG5cbiAgICAvLyBTZXQgZmxhZ3MgZnJvbSBzY29wZXNcbiAgICB2YWx1ZS5mbGFncyA9IHRoaXMuZ2V0RmxhZ3ModmFsdWUuc2NvcGVzKTtcblxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlKGV2ZW50OiBVSUV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRva2VuID0gYXdhaXQgdGhpcy5hY2NvdW50U2VydmljZS5nZW5lcmF0ZVRva2VuKHRoaXMuZ2V0RmxhZ3ModGhpcy5mb3JtLnZhbHVlLnNjb3BlcykpO1xuICAgICAgaWYgKCF0b2tlbikge1xuICAgICAgICB0aGlzLnNldEVycm9yKCdObyB0b2tlbiBnZW5lcmF0ZWQgIScpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7dG9rZW59KTtcblxuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcblxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuc2V0RXJyb3IoZSk7XG4gICAgfVxuXG4gIH1cblxuICBhc3luYyBjb3B5KGV2ZW50OiBVSUV2ZW50KSB7XG4gICAgZXZlbnQ/LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGF3YWl0IENsaXBib2FyZC53cml0ZSh7c3RyaW5nOiB0aGlzLmZvcm0udmFsdWUudG9rZW59KTtcbiAgICB0aGlzLmNvcGllZExhYmVsID0gJ0FDQ09VTlQuVE9LRU5TLkNSRUFURS5DT1BJRUQnO1xuICB9XG5cbiAgcHJvdGVjdGVkIGdldEZsYWdzKHNjb3BlczogVG9rZW5TY29wZVtdKTogbnVtYmVyIHtcbiAgICBsZXQgZmxhZ3MgPSAwO1xuICAgIHNjb3Blcy5mb3JFYWNoKHNjb3BlID0+IHtcbiAgICAgIGZsYWdzICs9IHNjb3BlLmZsYWc7XG4gICAgfSk7XG4gICAgcmV0dXJuIGZsYWdzO1xuICB9XG5cbn1cbiIsIjxhcHAtbW9kYWwtdG9vbGJhciBtb2RhbE5hbWU9XCJOZXdUb2tlbk1vZGFsXCJcbiAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJHRpdGxlIHwgYXN5bmNcIlxuICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCInc2Vjb25kYXJ5J1wiXG4gICAgICAgICAgICAgICAgICAgW3Nob3dTcGlubmVyXT1cImxvYWRpbmdcIlxuICAgICAgICAgICAgICAgICAgIFtjYW5WYWxpZGF0ZV09XCIhbG9hZGluZyAmJiB2YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgKGNhbmNlbCk9XCJjbG9zZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAodmFsaWRhdGUpPVwic2F2ZUFuZENsb3NlKCRldmVudClcIlxuPjwvYXBwLW1vZGFsLXRvb2xiYXI+XG5cbjxpb24tY29udGVudD5cblxuICA8IS0tIGVycm9yIC0tPlxuICA8aW9uLWl0ZW0gKm5nSWY9XCJlcnJvclwiIGxpbmVzPVwibm9uZVwiIGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgICA8aW9uLWljb24gY29sb3I9XCJkYW5nZXJcIiBzbG90PVwic3RhcnRcIiBuYW1lPVwiYWxlcnQtY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICA8aW9uLWxhYmVsIGNvbG9yPVwiZGFuZ2VyXCIgY2xhc3M9XCJlcnJvclwiIFtpbm5lckhUTUxdPVwiZXJyb3IgfCB0cmFuc2xhdGVcIj48L2lvbi1sYWJlbD5cbiAgPC9pb24taXRlbT5cblxuICA8aDYgY2xhc3M9XCJpb24tcGFkZGluZ1wiPnt7ICdBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuREVTQ1JJUFRJT04nIHwgdHJhbnNsYXRlIH19PC9oNj5cblxuICA8Zm9ybSBjbGFzcz1cImZvcm0tY29udGFpbmVyIGlvbi1uby1wYWRkaW5nXCIgW2Zvcm1Hcm91cF09XCJ0b2tlbkZvcm1cIj5cbiAgICA8aW9uLWdyaWQ+XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPG1hdC1sYWJlbD57eydBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuTkFNRSd8dHJhbnNsYXRlfX08L21hdC1sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dFxuICAgICAgICAgICAgICAgICAgIFthcHBBdXRvZm9jdXNdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgW2F1dG9mb2N1c0RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibmFtZVwiXG4gICAgICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgIFtyZWFkb25seV09XCJ0b2tlbkZvcm0gfCBmb3JtR2V0VmFsdWU6ICd0b2tlbicgfCBpc05vdE5pbE9yQmxhbmtcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImZvcm0uY29udHJvbHMubmFtZS5oYXNFcnJvcigncmVxdWlyZWQnKSAmJiBmb3JtLmNvbnRyb2xzLm5hbWUuZGlydHlcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJmb3JtLmNvbnRyb2xzLm5hbWUuaGFzRXJyb3IoJ25vdEFscmVhZHlFeGlzdHMnKSAmJiBmb3JtLmNvbnRyb2xzLm5hbWUuZGlydHlcIiB0cmFuc2xhdGU+QUNDT1VOVC5UT0tFTlMuQ1JFQVRFLk5BTUVfQUxSRUFEWV9FWElTVFM8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgPG1hdC1jaGlwcy1maWVsZFxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2NvcGVzXCJcbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJmaWxsXCJcbiAgICAgICAgICAgIGNoaXBDb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuU0NPUEVTJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cInRva2VuQ29uZmlnXCJcbiAgICAgICAgICAgIFttb2JpbGVdPVwibW9iaWxlXCJcbiAgICAgICAgICAgIFtkZWJ1Z109XCJmYWxzZVwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwidG9rZW5Gb3JtIHwgZm9ybUdldFZhbHVlOiAndG9rZW4nIHwgaXNOb3ROaWxPckJsYW5rXCJcbiAgICAgICAgICA+PC9tYXQtY2hpcHMtZmllbGQ+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDxpb24tcm93PlxuICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICA8bWF0LWRhdGUtZmllbGRcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImV4cGlyYXRpb25EYXRlXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInQUNDT1VOVC5UT0tFTlMuQ1JFQVRFLkVYUElSQVRJT05fREFURScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgW21vYmlsZV09XCJtb2JpbGVcIlxuICAgICAgICAgICAgW3JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInRva2VuRm9ybSB8IGZvcm1HZXRWYWx1ZTogJ3Rva2VuJyB8IGlzTm90TmlsT3JCbGFua1wiXG4gICAgICAgICAgPjwvbWF0LWRhdGUtZmllbGQ+XG4gICAgICAgIDwvaW9uLWNvbD5cbiAgICAgIDwvaW9uLXJvdz5cbiAgICAgIDxpb24tcm93PlxuICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICA8aW9uLWJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJ0b2tlbkZvcm0gfCBmb3JtR2V0VmFsdWU6ICd0b2tlbicgfCBpc05pbE9yQmxhbms7IGVsc2Ugc2hvd1Rva2VuXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInQUNDT1VOVC5UT0tFTlMuQ1JFQVRFLkJUTl9HRU5FUkFURV9USVRMRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImdlbmVyYXRlKCRldmVudClcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRva2VuRm9ybS5pbnZhbGlkXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyAnQUNDT1VOVC5UT0tFTlMuQ1JFQVRFLkJUTl9HRU5FUkFURScgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3Nob3dUb2tlbj5cbiAgICAgICAgICAgIDxoNj57eyAnQUNDT1VOVC5UT0tFTlMuQ1JFQVRFLkNPUFlfSEVMUCcgfCB0cmFuc2xhdGUgfX08L2g2PlxuICAgICAgICAgICAgPGlvbi10ZXh0IHN0eWxlPVwiZGlzcGxheTogYmxvY2s7IGJhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JheVwiPnt7IHRva2VuRm9ybSB8IGZvcm1HZXRWYWx1ZTogJ3Rva2VuJyB9fTwvaW9uLXRleHQ+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0FDQ09VTlQuVE9LRU5TLkNSRUFURS5CVE5fQ09QWV9USVRMRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiY29weSgkZXZlbnQpXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG1hdC1pY29uPmNvbnRlbnRfY29weTwvbWF0LWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxpb24tdGV4dD57eyBjb3BpZWRMYWJlbCB8IHRyYW5zbGF0ZSB9fTwvaW9uLXRleHQ+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgIDwvaW9uLWdyaWQ+XG5cbiAgPC9mb3JtPlxuXG48L2lvbi1jb250ZW50PlxuXG48aW9uLWZvb3RlciBoaWRkZW4teHMgaGlkZGVuLXNtIGhpZGRlbi1tb2JpbGU+XG5cbiAgPGlvbi10b29sYmFyPlxuICAgIDxpb24tcm93IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIiBub3dyYXA+XG4gICAgICA8aW9uLWNvbD5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9pb24tY29sPlxuXG4gICAgICA8aW9uLWNvbCBzaXplPVwiYXV0b1wiPlxuXG4gICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJjbGVhclwiIGNvbG9yPVwiZGFya1wiIChjbGljayk9XCJjbG9zZSgkZXZlbnQpXCI+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9DQU5DRUw8L2lvbi1sYWJlbD5cbiAgICAgICAgPC9pb24tYnV0dG9uPlxuXG4gICAgICAgIDxpb24tYnV0dG9uIFtmaWxsXT1cImludmFsaWQgPyAnY2xlYXInIDogJ3NvbGlkJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBsb2FkaW5nIHx8IGludmFsaWRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2F2ZUFuZENsb3NlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2F2ZUFuZENsb3NlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInRlcnRpYXJ5XCI+XG4gICAgICAgICAgPGlvbi1sYWJlbCB0cmFuc2xhdGU+Q09NTU9OLkJUTl9WQUxJREFURTwvaW9uLWxhYmVsPlxuICAgICAgICA8L2lvbi1idXR0b24+XG4gICAgICA8L2lvbi1jb2w+XG4gICAgPC9pb24tcm93PlxuICA8L2lvbi10b29sYmFyPlxuXG48L2lvbi1mb290ZXI+XG4iXX0=
|
|
130
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV3LXRva2VuLm1vZGFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2FjY291bnQvbmV3LXRva2VuLm1vZGFsLnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2FjY291bnQvbmV3LXRva2VuLm1vZGFsLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUE2QixNQUFNLDBDQUEwQyxDQUFDO0FBQzNHLE9BQU8sRUFBYyxTQUFTLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV0RSxPQUFPLEVBQUUsU0FBUyxFQUFZLEtBQUssRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUVuRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUd2RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFN0MsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXakQsTUFBTSxPQUFPLGFBQWMsU0FBUSxvQkFBK0I7SUFVdEQ7SUFDRTtJQUNBO0lBVlosU0FBUyxDQUFtQjtJQUM1QixZQUFZLENBQVc7SUFDdkIsV0FBVyxDQUE2QjtJQUN4QyxXQUFXLENBQVM7SUFDWCxXQUFXLENBQWU7SUFDMUIsYUFBYSxDQUFXO0lBRWpDLFlBQ1UsUUFBa0IsRUFDaEIsU0FBb0Ms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O3VHQWhIVSxhQUFhOzJGQUFiLGFBQWEsMEpDMUIxQiw4b0pBMkhBOzsyRkRqR2EsYUFBYTtrQkFKekIsU0FBUzsrQkFDRSxxQkFBcUI7a0pBU3RCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcEVudGl0eUVkaXRvck1vZGFsLCBJRW50aXR5RWRpdG9yTW9kYWxPcHRpb25zIH0gZnJvbSAnLi4vZm9ybS9lbnRpdHkvZW50aXR5LWVkaXRvci1tb2RhbC5jbGFzcyc7XG5pbXBvcnQgeyBUb2tlblNjb3BlLCBVc2VyVG9rZW4gfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC90b2tlbi5tb2RlbCc7XG5pbXBvcnQgeyBVbnR5cGVkRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVXNlclRva2VuVmFsaWRhdG9yU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3ZhbGlkYXRvci91c2VyLXRva2VuLnZhbGlkYXRvcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVGaWVsZENvbmZpZyB9IGZyb20gJy4uLy4uL3NoYXJlZC9tYXRlcmlhbC9hdXRvY29tcGxldGUvbWF0ZXJpYWwuYXV0b2NvbXBsZXRlLmNvbmZpZyc7XG5pbXBvcnQgeyBJQXBwRm9ybSB9IGZyb20gJy4uL2Zvcm0vZm9ybS51dGlscyc7XG5pbXBvcnQgeyBBcHBGb3JtIH0gZnJvbSAnLi4vZm9ybS9mb3JtLmNsYXNzJztcbmltcG9ydCB7IEFjY291bnRTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7IGlzTmlsT3JCbGFuaywgaXNOb3ROaWxPckJsYW5rIH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBub3cgfSBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgQ2xpcGJvYXJkIH0gZnJvbSAnQGNhcGFjaXRvci9jbGlwYm9hcmQnO1xuaW1wb3J0IHsgZnJvbVVuaXhNc1RpbWVzdGFtcCB9IGZyb20gJy4uLy4uL3NoYXJlZC9kYXRlcyc7XG5pbXBvcnQgeyBUb2FzdHMgfSBmcm9tICcuLi8uLi9zaGFyZWQvdG9hc3QvdG9hc3RzJztcbmltcG9ydCB7IFRvYXN0Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcblxuZXhwb3J0IGludGVyZmFjZSBJTmV3VG9rZW5Nb2RhbE9wdGlvbnMgZXh0ZW5kcyBJRW50aXR5RWRpdG9yTW9kYWxPcHRpb25zPFVzZXJUb2tlbj4ge1xuICB0b2tlblNjb3BlczogVG9rZW5TY29wZVtdO1xuICBleGlzdGluZ05hbWVzOiBzdHJpbmdbXTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLW5ldy10b2tlbi1tb2RhbCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9uZXctdG9rZW4ubW9kYWwuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgTmV3VG9rZW5Nb2RhbCBleHRlbmRzIEFwcEVudGl0eUVkaXRvck1vZGFsPFVzZXJUb2tlbj4gaW1wbGVtZW50cyBPbkluaXQsIElOZXdUb2tlbk1vZGFsT3B0aW9ucyB7XG5cbiAgdG9rZW5Gb3JtOiBVbnR5cGVkRm9ybUdyb3VwO1xuICB0b2tlbkFwcEZvcm06IElBcHBGb3JtO1xuICB0b2tlbkNvbmZpZzogTWF0QXV0b2NvbXBsZXRlRmllbGRDb25maWc7XG4gIGNvcGllZExhYmVsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHRva2VuU2NvcGVzOiBUb2tlblNjb3BlW107XG4gIEBJbnB1dCgpIGV4aXN0aW5nTmFtZXM6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByb3RlY3RlZCB2YWxpZGF0b3I6IFVzZXJUb2tlblZhbGlkYXRvclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZVxuICApIHtcbiAgICBzdXBlcihpbmplY3RvciwgVXNlclRva2VuLCB7dGFiQ291bnQ6IDF9KTtcbiAgICB0aGlzLnRyYW5zbGF0ZSA9IGluamVjdG9yLmdldChUcmFuc2xhdGVTZXJ2aWNlKTtcbiAgICB0aGlzLnRvYXN0Q29udHJvbGxlciA9IGluamVjdG9yLmdldChUb2FzdENvbnRyb2xsZXIpO1xuICAgIHRoaXMudG9rZW5Gb3JtID0gdmFsaWRhdG9yLmdldEZvcm1Hcm91cCgpO1xuICAgIHRoaXMudG9rZW5BcHBGb3JtID0gbmV3IEFwcEZvcm0odGhpcy5pbmplY3RvciwgdGhpcy50b2tlbkZvcm0pO1xuICB9XG5cbiAgZ2V0IHZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci52YWxpZCAmJiBpc05vdE5pbE9yQmxhbmsodGhpcy5mb3JtLnZhbHVlLnRva2VuKTtcbiAgfVxuXG4gIGdldCBpbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBzdXBlci5pbnZhbGlkIHx8IGlzTmlsT3JCbGFuayh0aGlzLmZvcm0udmFsdWUudG9rZW4pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIHRoaXMudG9rZW5Db25maWcgPSB7XG4gICAgICBpdGVtczogdGhpcy50b2tlblNjb3Blcy5zbGljZSgpLm1hcCh2YWx1ZSA9PiB7XG4gICAgICAgIHZhbHVlLm5hbWUgPSB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KHZhbHVlLm5hbWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9KSxcbiAgICAgIGF0dHJpYnV0ZXM6IFsnbmFtZSddLFxuICAgIH07XG5cbiAgICB0aGlzLnZhbGlkYXRvci51cGRhdGVGb3JtR3JvdXAodGhpcy5mb3JtLCB0aGlzLmV4aXN0aW5nTmFtZXMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbXB1dGVUaXRsZShkYXRhOiBVc2VyVG9rZW4pOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuVElUTEUnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXQgZm9ybSgpOiBVbnR5cGVkRm9ybUdyb3VwIHtcbiAgICByZXR1cm4gdGhpcy50b2tlbkZvcm07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Rmlyc3RJbnZhbGlkVGFiSW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlckZvcm1zKCkge1xuICAgIHRoaXMuYWRkQ2hpbGRGb3JtKHRoaXMudG9rZW5BcHBGb3JtKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZXRWYWx1ZShkYXRhOiBVc2VyVG9rZW4pOiBQcm9taXNlPHZvaWQ+IHwgdm9pZCB7XG5cbiAgICAvLyBBZmZlY3QgcHVia2V5IGZyb20gY3VycmVudCBhY2NvdW50XG4gICAgZGF0YS5wdWJrZXkgPSB0aGlzLmFjY291bnRTZXJ2aWNlLmFjY291bnQucHVia2V5O1xuXG4gICAgLy8gRGVmYXVsdCBleHBpcmF0aW9uIGRhdGVcbiAgICBkYXRhLmV4cGlyYXRpb25EYXRlID0gZnJvbVVuaXhNc1RpbWVzdGFtcChub3coKSkuYWRkKDEsICdtb250aCcpO1xuXG4gICAgdGhpcy5mb3JtLnBhdGNoVmFsdWUoZGF0YS5hc09iamVjdCgpKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBnZXRWYWx1ZSgpOiBQcm9taXNlPFVzZXJUb2tlbj4ge1xuICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgc3VwZXIuZ2V0VmFsdWUoKTtcblxuICAgIC8vIFNldCBmbGFncyBmcm9tIHNjb3Blc1xuICAgIHZhbHVlLmZsYWdzID0gdGhpcy5nZXRGbGFncyh2YWx1ZS5zY29wZXMpO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgYXN5bmMgZ2VuZXJhdGUoZXZlbnQ6IFVJRXZlbnQpIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdG9rZW4gPSBhd2FpdCB0aGlzLmFjY291bnRTZXJ2aWNlLmdlbmVyYXRlVG9rZW4odGhpcy5nZXRGbGFncyh0aGlzLmZvcm0udmFsdWUuc2NvcGVzKSk7XG4gICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgIHRoaXMuc2V0RXJyb3IoJ05vIHRva2VuIGdlbmVyYXRlZCAhJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHt0b2tlbn0pO1xuXG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5zZXRFcnJvcihlKTtcbiAgICB9XG5cbiAgfVxuXG4gIGFzeW5jIGNvcHkoZXZlbnQ6IFVJRXZlbnQpIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgYXdhaXQgQ2xpcGJvYXJkLndyaXRlKHtzdHJpbmc6IHRoaXMuZm9ybS52YWx1ZS50b2tlbn0pO1xuICAgIGF3YWl0IFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwge1xuICAgICAgdHlwZTogJ2luZm8nLCBtZXNzYWdlOiAnQUNDT1VOVC5UT0tFTlMuQ1JFQVRFLkNPUElFRCdcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXRGbGFncyhzY29wZXM6IFRva2VuU2NvcGVbXSk6IG51bWJlciB7XG4gICAgbGV0IGZsYWdzID0gMDtcbiAgICBzY29wZXMuZm9yRWFjaChzY29wZSA9PiB7XG4gICAgICBmbGFncyArPSBzY29wZS5mbGFnO1xuICAgIH0pO1xuICAgIHJldHVybiBmbGFncztcbiAgfVxuXG59XG4iLCI8YXBwLW1vZGFsLXRvb2xiYXIgbW9kYWxOYW1lPVwiTmV3VG9rZW5Nb2RhbFwiXG4gICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIiR0aXRsZSB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICBbY29sb3JdPVwiJ3NlY29uZGFyeSdcIlxuICAgICAgICAgICAgICAgICAgIFtzaG93U3Bpbm5lcl09XCJsb2FkaW5nXCJcbiAgICAgICAgICAgICAgICAgICBbY2FuVmFsaWRhdGVdPVwiIWxvYWRpbmcgJiYgdmFsaWRcIlxuICAgICAgICAgICAgICAgICAgIChjYW5jZWwpPVwiY2xvc2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgKHZhbGlkYXRlKT1cInNhdmVBbmRDbG9zZSgkZXZlbnQpXCJcbj48L2FwcC1tb2RhbC10b29sYmFyPlxuXG48aW9uLWNvbnRlbnQgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuXG4gIDwhLS0gZXJyb3IgLS0+XG4gIDxpb24taXRlbSAqbmdJZj1cImVycm9yXCIgbGluZXM9XCJub25lXCI+XG4gICAgPGlvbi1pY29uIGNvbG9yPVwiZGFuZ2VyXCIgc2xvdD1cInN0YXJ0XCIgbmFtZT1cImFsZXJ0LWNpcmNsZVwiPjwvaW9uLWljb24+XG4gICAgPGlvbi1sYWJlbCBjb2xvcj1cImRhbmdlclwiIGNsYXNzPVwiZXJyb3JcIiBbaW5uZXJIVE1MXT1cImVycm9yIHwgdHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gIDwvaW9uLWl0ZW0+XG5cbiAgPHA+PGIgdHJhbnNsYXRlPkFDQ09VTlQuVE9LRU5TLkNSRUFURS5ERVNDUklQVElPTjwvYj48L3A+XG5cbiAgPGZvcm0gY2xhc3M9XCJmb3JtLWNvbnRhaW5lclwiIFtmb3JtR3JvdXBdPVwidG9rZW5Gb3JtXCI+XG4gICAgPGlvbi1ncmlkIGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cbiAgICAgIDxpb24tcm93PlxuICAgICAgICA8aW9uLWNvbD5cbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7J0FDQ09VTlQuVE9LRU5TLkNSRUFURS5OQU1FJ3x0cmFuc2xhdGV9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgPGlucHV0IG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgW2FwcEF1dG9mb2N1c109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICBbYXV0b2ZvY3VzRGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCJcbiAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInRva2VuRm9ybSB8IGZvcm1HZXRWYWx1ZTogJ3Rva2VuJyB8IGlzTm90TmlsT3JCbGFua1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5jb250cm9scy5uYW1lLmhhc0Vycm9yKCdyZXF1aXJlZCcpICYmIGZvcm0uY29udHJvbHMubmFtZS50b3VjaGVkXCIgdHJhbnNsYXRlPkVSUk9SLkZJRUxEX1JFUVVJUkVEPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5jb250cm9scy5uYW1lLmhhc0Vycm9yKCdub3RBbHJlYWR5RXhpc3RzJykgJiYgZm9ybS5jb250cm9scy5uYW1lLnRvdWNoZWRcIiB0cmFuc2xhdGU+QUNDT1VOVC5UT0tFTlMuQ1JFQVRFLk5BTUVfQUxSRUFEWV9FWElTVFM8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgICA8aW9uLXJvdz5cbiAgICAgICAgPGlvbi1jb2w+XG4gICAgICAgICAgPG1hdC1jaGlwcy1maWVsZFxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2NvcGVzXCJcbiAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJmaWxsXCJcbiAgICAgICAgICAgIGNoaXBDb2xvcj1cInByaW1hcnlcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuU0NPUEVTJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbY29uZmlnXT1cInRva2VuQ29uZmlnXCJcbiAgICAgICAgICAgIFttb2JpbGVdPVwibW9iaWxlXCJcbiAgICAgICAgICAgIFtkZWJ1Z109XCJmYWxzZVwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwidG9rZW5Gb3JtIHwgZm9ybUdldFZhbHVlOiAndG9rZW4nIHwgaXNOb3ROaWxPckJsYW5rXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiZm9ybS5jb250cm9scy5uYW1lLmhhc0Vycm9yKCdub3RFbXB0eUFycmF5JykgJiYgZm9ybS5jb250cm9scy5uYW1lLnRvdWNoZWRcIiB0cmFuc2xhdGU+RVJST1IuRklFTERfUkVRVUlSRUQ8L21hdC1lcnJvcj5cbiAgICAgICAgICA8L21hdC1jaGlwcy1maWVsZD5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgICAgPGlvbi1yb3c+XG4gICAgICAgIDxpb24tY29sPlxuICAgICAgICAgIDxtYXQtZGF0ZS1maWVsZFxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiZXhwaXJhdGlvbkRhdGVcIlxuICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuRVhQSVJBVElPTl9EQVRFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbbW9iaWxlXT1cIm1vYmlsZVwiXG4gICAgICAgICAgICBbcmVxdWlyZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwidG9rZW5Gb3JtIHwgZm9ybUdldFZhbHVlOiAndG9rZW4nIHwgaXNOb3ROaWxPckJsYW5rXCJcbiAgICAgICAgICA+PC9tYXQtZGF0ZS1maWVsZD5cbiAgICAgICAgPC9pb24tY29sPlxuICAgICAgPC9pb24tcm93PlxuICAgICAgPGlvbi1yb3c+XG4gICAgICAgIDxpb24tY29sPlxuICAgICAgICAgIDxpb24tYnV0dG9uXG4gICAgICAgICAgICAqbmdJZj1cInRva2VuRm9ybSB8IGZvcm1HZXRWYWx1ZTogJ3Rva2VuJyB8IGlzTmlsT3JCbGFuazsgZWxzZSBzaG93VG9rZW5cIlxuICAgICAgICAgICAgW3RpdGxlXT1cIidBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuQlROX0dFTkVSQVRFX1RJVExFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZ2VuZXJhdGUoJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwidG9rZW5Gb3JtLmludmFsaWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdBQ0NPVU5ULlRPS0VOUy5DUkVBVEUuQlROX0dFTkVSQVRFJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjc2hvd1Rva2VuPlxuICAgICAgICAgICAgPHA+PGIgdHJhbnNsYXRlPkFDQ09VTlQuVE9LRU5TLkNSRUFURS5DT1BZX0hFTFA8L2I+PC9wPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgZm9ybUNvbnRyb2xOYW1lPVwidG9rZW5cIiByZWFkb25seSBzdHlsZT1cImhlaWdodDogYXV0bzsgYmFja2dyb3VuZC1jb2xvcjogbGlnaHRncmF5O1wiIHJvd3M9XCI0XCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBtYXRTdWZmaXhcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICAgICBbdGl0bGVdPVwiJ0FDQ09VTlQuVE9LRU5TLkNSRUFURS5CVE5fQ09QWV9USVRMRScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5KCRldmVudClcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNvbnRlbnRfY29weTwvbWF0LWljb24+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2lvbi1jb2w+XG4gICAgICA8L2lvbi1yb3c+XG4gICAgPC9pb24tZ3JpZD5cblxuICA8L2Zvcm0+XG5cbjwvaW9uLWNvbnRlbnQ+XG5cbjxpb24tZm9vdGVyIGhpZGRlbi14cyBoaWRkZW4tc20gaGlkZGVuLW1vYmlsZT5cblxuICA8aW9uLXRvb2xiYXI+XG4gICAgPGlvbi1yb3cgY2xhc3M9XCJpb24tbm8tcGFkZGluZ1wiIG5vd3JhcD5cbiAgICAgIDxpb24tY29sPlxuICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICA8L2lvbi1jb2w+XG5cbiAgICAgIDxpb24tY29sIHNpemU9XCJhdXRvXCI+XG5cbiAgICAgICAgPGlvbi1idXR0b24gZmlsbD1cImNsZWFyXCIgY29sb3I9XCJkYXJrXCIgKGNsaWNrKT1cImNsb3NlKCRldmVudClcIj5cbiAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX0NBTkNFTDwvaW9uLWxhYmVsPlxuICAgICAgICA8L2lvbi1idXR0b24+XG5cbiAgICAgICAgPGlvbi1idXR0b24gW2ZpbGxdPVwiaW52YWxpZCA/ICdjbGVhcicgOiAnc29saWQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IGxvYWRpbmcgfHwgaW52YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlQW5kQ2xvc2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJzYXZlQW5kQ2xvc2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yPVwidGVydGlhcnlcIj5cbiAgICAgICAgICA8aW9uLWxhYmVsIHRyYW5zbGF0ZT5DT01NT04uQlROX1ZBTElEQVRFPC9pb24tbGFiZWw+XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIDwvaW9uLWNvbD5cbiAgICA8L2lvbi1yb3c+XG4gIDwvaW9uLXRvb2xiYXI+XG5cbjwvaW9uLWZvb3Rlcj5cbiJdfQ==
|
|
@@ -29,18 +29,21 @@ export class UserTokenTable extends AppInMemoryTable {
|
|
|
29
29
|
injector;
|
|
30
30
|
formBuilder;
|
|
31
31
|
validatorService;
|
|
32
|
+
cd;
|
|
32
33
|
tokenScopes;
|
|
33
34
|
useSticky = false;
|
|
34
|
-
constructor(injector, formBuilder, validatorService, environment, tokenScopes) {
|
|
35
|
-
super(injector, [...RESERVED_START_COLUMNS, 'name',
|
|
36
|
-
filterFnFactory: () => () => true
|
|
35
|
+
constructor(injector, formBuilder, validatorService, cd, environment, tokenScopes) {
|
|
36
|
+
super(injector, [...RESERVED_START_COLUMNS, 'name', 'scopes', 'lastUsedDate', 'expirationDate', 'creationDate', ...RESERVED_END_COLUMNS], UserToken, new InMemoryEntitiesService(UserToken, undefined, {
|
|
37
|
+
filterFnFactory: () => () => true,
|
|
38
|
+
equals: UserToken.equals,
|
|
37
39
|
}), validatorService);
|
|
38
40
|
this.injector = injector;
|
|
39
41
|
this.formBuilder = formBuilder;
|
|
40
42
|
this.validatorService = validatorService;
|
|
43
|
+
this.cd = cd;
|
|
41
44
|
this.tokenScopes = tokenScopes;
|
|
42
45
|
// this.readOnly = true;
|
|
43
|
-
this.inlineEdition =
|
|
46
|
+
this.inlineEdition = false;
|
|
44
47
|
this.defaultSortBy = 'creationDate';
|
|
45
48
|
this.defaultSortDirection = 'asc';
|
|
46
49
|
this.i18nColumnPrefix = 'ACCOUNT.TOKENS.TABLE.';
|
|
@@ -63,10 +66,10 @@ export class UserTokenTable extends AppInMemoryTable {
|
|
|
63
66
|
}
|
|
64
67
|
setValue(value, opts) {
|
|
65
68
|
// Set scopes from flags
|
|
66
|
-
value?.forEach(userToken => {
|
|
69
|
+
value?.forEach((userToken) => {
|
|
67
70
|
const scopes = [];
|
|
68
71
|
if (userToken.flags) {
|
|
69
|
-
this.tokenScopes.forEach(scope => {
|
|
72
|
+
this.tokenScopes.forEach((scope) => {
|
|
70
73
|
// eslint-disable-next-line no-bitwise
|
|
71
74
|
if (userToken.flags & scope.flag) {
|
|
72
75
|
scopes.push(scope);
|
|
@@ -78,6 +81,9 @@ export class UserTokenTable extends AppInMemoryTable {
|
|
|
78
81
|
super.setValue(value, opts);
|
|
79
82
|
}
|
|
80
83
|
async addToken(event) {
|
|
84
|
+
if (event?.defaultPrevented)
|
|
85
|
+
return; // Avoid multiple call
|
|
86
|
+
event?.preventDefault();
|
|
81
87
|
event?.stopPropagation();
|
|
82
88
|
const modal = await this.modalCtrl.create({
|
|
83
89
|
component: NewTokenModal,
|
|
@@ -86,9 +92,9 @@ export class UserTokenTable extends AppInMemoryTable {
|
|
|
86
92
|
isNew: true,
|
|
87
93
|
data: new UserToken(),
|
|
88
94
|
tokenScopes: this.tokenScopes || [],
|
|
89
|
-
existingNames: this.value?.map(v => v.name)
|
|
95
|
+
existingNames: this.value?.map((v) => v.name),
|
|
90
96
|
},
|
|
91
|
-
backdropDismiss: false
|
|
97
|
+
backdropDismiss: false,
|
|
92
98
|
});
|
|
93
99
|
await modal.present();
|
|
94
100
|
const { data } = await modal.onDidDismiss();
|
|
@@ -115,19 +121,18 @@ export class UserTokenTable extends AppInMemoryTable {
|
|
|
115
121
|
// // this.markAsDirty();
|
|
116
122
|
// }
|
|
117
123
|
display(scopes) {
|
|
118
|
-
return scopes?.map(value => this.translate.instant(value.name)).join(', ');
|
|
124
|
+
return scopes?.map((value) => this.translate.instant(value.name)).join(', ');
|
|
119
125
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
], usesInheritance: true, ngImport: i0, template: "<mat-toolbar>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <ng-container *ngIf=\"selection.isEmpty(); else hasSelection\">\n\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addToken($event)\">\n <mat-icon>add</mat-icon>\n </button>\n\n </ng-container>\n\n <ng-template #hasSelection>\n\n <button mat-icon-button\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n </ng-template>\n\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData.id }}</td>\n </ng-container>\n\n <!-- name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'NAME' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ (row.currentData | propertyGet : 'name') || (i18nColumnPrefix + 'UNKNOWN' | translate) }}\n </td>\n </ng-container>\n\n<!-- <ng-container matColumnDef=\"flags\">-->\n<!-- <th mat-header-cell *matHeaderCellDef mat-sort-header>-->\n<!-- <ion-label>{{ i18nColumnPrefix + 'FLAGS' | translate }}</ion-label>-->\n<!-- </th>-->\n<!-- <td mat-cell *matCellDef=\"let row\">-->\n<!-- {{ row.currentData | propertyGet : 'flags' }}-->\n<!-- </td>-->\n<!-- </ng-container>-->\n\n <ng-container matColumnDef=\"scopes\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'SCOPES' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ display(row.currentData | propertyGet : 'scopes') }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"creationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'CREATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet : 'creationDate' | dateFormat : {time: true} }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"expirationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'EXPIRATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet : 'expirationDate' | dateFormat : {time: true} }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastUsedDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'LAST_USED_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet : 'lastUsedDate' | dateFormat : {time: true} }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"updateDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'UPDATE_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet : 'updateDate' | dateFormat : {time: true} }}\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\">\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n </div>\n</ion-content>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addToken($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".mat-cell-date-time{width:180px}.mat-column-id{width:90px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i4.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i4.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i4.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: i4.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i4.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i7.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["disableRipple", "color", "tabIndex"], exportAs: ["matCheckbox"] }, { kind: "component", type: i9.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "directive", type: i12.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i13.ActionsColumnComponent, selector: "app-actions-column", inputs: ["stickyEnd", "canCancel", "canConfirm", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmEditCreateClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i14.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i15.DateFormatPipe, name: "dateFormat" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
126
|
+
markForCheck() {
|
|
127
|
+
this.cd.markForCheck();
|
|
128
|
+
}
|
|
129
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: UserTokenTable, deps: [{ token: i0.Injector }, { token: i1.UntypedFormBuilder }, { token: i2.ValidatorService }, { token: i0.ChangeDetectorRef }, { token: ENVIRONMENT }, { token: APP_USER_TOKEN_SCOPES, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
130
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: UserTokenTable, selector: "app-user-token-table", inputs: { useSticky: "useSticky" }, providers: [{ provide: ValidatorService, useClass: UserTokenValidatorService }], usesInheritance: true, ngImport: i0, template: "<mat-toolbar>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <ng-container *ngIf=\"selection.isEmpty(); else hasSelection\">\n\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addToken($event)\">\n <mat-icon>add</mat-icon>\n </button>\n\n </ng-container>\n\n <ng-template #hasSelection>\n\n <button mat-icon-button\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n </ng-template>\n\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (click)=\"toggleSelectRow($event, row)\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"cdk-visually-hidden\">\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"cdk-visually-hidden\">{{ row.currentData.id }}</td>\n </ng-container>\n\n <!-- name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'NAME' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ (row.currentData | propertyGet : 'name') || (i18nColumnPrefix + 'UNKNOWN' | translate) }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"scopes\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'SCOPES' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ display(row.currentData | propertyGet : 'scopes') }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"creationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'CREATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet : 'creationDate' | dateFormat : {time: true} }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"expirationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'EXPIRATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet : 'expirationDate' | dateFormat : {time: true} }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastUsedDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'LAST_USED_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet : 'lastUsedDate' | dateFormat : {time: true} }}\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\">\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n </div>\n</ion-content>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addToken($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".mat-cell-date-time{width:180px}.mat-column-id{width:90px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IonContent, selector: "ion-content", inputs: ["color", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: i4.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i4.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonItem, selector: "ion-item", inputs: ["button", "color", "counter", "counterFormatter", "detail", "detailIcon", "disabled", "download", "fill", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "shape", "target", "type"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonRefresher, selector: "ion-refresher", inputs: ["closeDuration", "disabled", "pullFactor", "pullMax", "pullMin", "snapbackDuration"] }, { kind: "component", type: i4.IonRefresherContent, selector: "ion-refresher-content", inputs: ["pullingIcon", "pullingText", "refreshingSpinner", "refreshingText"] }, { kind: "component", type: i4.IonSkeletonText, selector: "ion-skeleton-text", inputs: ["animated"] }, { kind: "component", type: i4.IonText, selector: "ion-text", inputs: ["color", "mode"] }, { kind: "directive", type: i5.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: i6.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i6.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i6.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i6.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i6.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i6.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i6.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i6.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i6.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i6.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i7.MatSort, selector: "[matSort]", inputs: ["matSortDisabled", "matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i7.MatSortHeader, selector: "[mat-sort-header]", inputs: ["disabled", "mat-sort-header", "arrowPosition", "start", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: i8.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i9.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: i12.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i13.ActionsColumnComponent, selector: "app-actions-column", inputs: ["stickyEnd", "canCancel", "canConfirm", "canDelete", "canBackward", "canForward", "canConfirmAndAdd", "dirtyIcon", "optionsTitle", "class", "cellTemplate"], outputs: ["optionsClick", "cancelOrDeleteClick", "confirmEditCreateClick", "confirmAndAddClick", "backward", "forward"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "pipe", type: i14.PropertyGetPipe, name: "propertyGet" }, { kind: "pipe", type: i15.DateFormatPipe, name: "dateFormat" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
124
131
|
}
|
|
125
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
132
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: UserTokenTable, decorators: [{
|
|
126
133
|
type: Component,
|
|
127
|
-
args: [{ selector: 'app-user-token-table', providers: [
|
|
128
|
-
|
|
129
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-toolbar>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <ng-container *ngIf=\"selection.isEmpty(); else hasSelection\">\n\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addToken($event)\">\n <mat-icon>add</mat-icon>\n </button>\n\n </ng-container>\n\n <ng-template #hasSelection>\n\n <button mat-icon-button\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n </ng-template>\n\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!inlineEdition\">\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">{{ row.currentData.id }}</td>\n </ng-container>\n\n <!-- name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'NAME' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ (row.currentData | propertyGet : 'name') || (i18nColumnPrefix + 'UNKNOWN' | translate) }}\n </td>\n </ng-container>\n\n<!-- <ng-container matColumnDef=\"flags\">-->\n<!-- <th mat-header-cell *matHeaderCellDef mat-sort-header>-->\n<!-- <ion-label>{{ i18nColumnPrefix + 'FLAGS' | translate }}</ion-label>-->\n<!-- </th>-->\n<!-- <td mat-cell *matCellDef=\"let row\">-->\n<!-- {{ row.currentData | propertyGet : 'flags' }}-->\n<!-- </td>-->\n<!-- </ng-container>-->\n\n <ng-container matColumnDef=\"scopes\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'SCOPES' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ display(row.currentData | propertyGet : 'scopes') }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"creationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'CREATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet : 'creationDate' | dateFormat : {time: true} }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"expirationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'EXPIRATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet : 'expirationDate' | dateFormat : {time: true} }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastUsedDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'LAST_USED_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet : 'lastUsedDate' | dateFormat : {time: true} }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"updateDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'UPDATE_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet : 'updateDate' | dateFormat : {time: true} }}\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\">\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n </div>\n</ion-content>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addToken($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".mat-cell-date-time{width:180px}.mat-column-id{width:90px}\n"] }]
|
|
130
|
-
}], ctorParameters: function () { return [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: i2.ValidatorService }, { type: i16.Environment, decorators: [{
|
|
134
|
+
args: [{ selector: 'app-user-token-table', providers: [{ provide: ValidatorService, useClass: UserTokenValidatorService }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mat-toolbar>\n\n <!-- Refresh -->\n <button mat-icon-button *ngIf=\"!mobile\"\n [title]=\"'COMMON.BTN_REFRESH'|translate\"\n (click)=\"onRefresh.emit()\">\n <mat-icon>refresh</mat-icon>\n </button>\n\n <ion-item *ngIf=\"!mobile && error; let error\" lines=\"none\">\n <ion-icon color=\"danger\" slot=\"start\" name=\"alert-circle\"></ion-icon>\n <ion-label color=\"danger\" [innerHTML]=\"error|translate\"></ion-label>\n </ion-item>\n\n <div class=\"toolbar-spacer\"></div>\n\n <ng-container *ngIf=\"selection.isEmpty(); else hasSelection\">\n\n <button mat-icon-button\n *ngIf=\"canEdit && !mobile\"\n [title]=\"'COMMON.BTN_ADD'|translate\"\n (click)=\"addToken($event)\">\n <mat-icon>add</mat-icon>\n </button>\n\n </ng-container>\n\n <ng-template #hasSelection>\n\n <button mat-icon-button\n [title]=\"'COMMON.BTN_DELETE' | translate\"\n (click)=\"deleteSelection($event)\">\n <mat-icon>delete_outline</mat-icon>\n </button>\n\n </ng-template>\n\n</mat-toolbar>\n\n<ion-content class=\"ion-no-padding\">\n\n <ion-refresher slot=\"fixed\" *ngIf=\"mobile\" (ionRefresh)=\"doRefresh($event)\">\n <ion-refresher-content></ion-refresher-content>\n </ion-refresher>\n\n <!-- table -->\n <div class=\"table-container\">\n <table #table mat-table matSort matSortDisableClear\n [dataSource]=\"dataSource\"\n [matSortActive]=\"defaultSortBy\"\n [matSortDirection]=\"defaultSortDirection\"\n [trackBy]=\"trackByFn\">\n\n <ng-container matColumnDef=\"select\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\n </mat-checkbox>\n </th>\n <td mat-cell *matCellDef=\"let row\" [class.cdk-visually-hidden]=\"!canEdit\">\n <mat-checkbox (click)=\"toggleSelectRow($event, row)\" [checked]=\"selection.isSelected(row)\">\n </mat-checkbox>\n </td>\n </ng-container>\n\n <!-- Id Column -->\n <ng-container matColumnDef=\"id\" [sticky]=\"useSticky\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"cdk-visually-hidden\">\n <ion-label>#</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"cdk-visually-hidden\">{{ row.currentData.id }}</td>\n </ng-container>\n\n <!-- name column -->\n <ng-container matColumnDef=\"name\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'NAME' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ (row.currentData | propertyGet : 'name') || (i18nColumnPrefix + 'UNKNOWN' | translate) }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"scopes\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header>\n <ion-label>{{ i18nColumnPrefix + 'SCOPES' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\">\n {{ display(row.currentData | propertyGet : 'scopes') }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"creationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'CREATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet : 'creationDate' | dateFormat : {time: true} }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"expirationDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'EXPIRATION_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet : 'expirationDate' | dateFormat : {time: true} }}\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"lastUsedDate\">\n <th mat-header-cell *matHeaderCellDef mat-sort-header class=\"mat-cell-date-time\">\n <ion-label>{{ i18nColumnPrefix + 'LAST_USED_DATE' | translate }}</ion-label>\n </th>\n <td mat-cell *matCellDef=\"let row\" class=\"mat-cell-date-time\">\n {{ row.currentData | propertyGet : 'lastUsedDate' | dateFormat : {time: true} }}\n </td>\n </ng-container>\n\n <!-- Actions buttons column -->\n <app-actions-column [stickyEnd]=\"useSticky\"\n (optionsClick)=\"openSelectColumnsModal($event)\"\n (cancelOrDeleteClick)=\"cancelOrDelete($event.event, $event.row)\"\n (confirmAndAddClick)=\"confirmAndAdd($event.event, $event.row)\"\n (backward)=\"confirmAndBackward($event.event, $event.row)\"\n (forward)=\"confirmAndForward($event.event, $event.row)\"\n [canCancel]=\"false\">\n </app-actions-column>\n\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns;\"\n [class.mat-row-selected]=\"row.editing\"\n [class.mat-row-error]=\"row.validator?.invalid\"\n [class.mat-row-dirty]=\"row.validator?.dirty\"\n (click)=\"clickRow($event, row)\"\n (keydown.escape)=\"escapeEditingRow($event)\"\n [cdkTrapFocus]=\"row.validator?.invalid\"></tr>\n </table>\n\n <ng-container *ngIf=\"loadingSubject|async; else noResult\">\n <ion-item>\n <ion-skeleton-text animated></ion-skeleton-text>\n </ion-item>\n </ng-container>\n\n <ng-template #noResult>\n <ion-item *ngIf=\"totalRowCount === 0\">\n <ion-text color=\"danger\" class=\"text-italic\" translate>COMMON.NO_RESULT</ion-text>\n </ion-item>\n </ng-template>\n\n </div>\n</ion-content>\n\n<ion-fab slot=\"fixed\" vertical=\"bottom\" horizontal=\"end\" *ngIf=\"mobile\">\n <ion-fab-button color=\"tertiary\" (click)=\"addToken($event)\">\n <ion-icon name=\"add\"></ion-icon>\n </ion-fab-button>\n</ion-fab>\n", styles: [".mat-cell-date-time{width:180px}.mat-column-id{width:90px}\n"] }]
|
|
135
|
+
}], ctorParameters: () => [{ type: i0.Injector }, { type: i1.UntypedFormBuilder }, { type: i2.ValidatorService }, { type: i0.ChangeDetectorRef }, { type: i16.Environment, decorators: [{
|
|
131
136
|
type: Inject,
|
|
132
137
|
args: [ENVIRONMENT]
|
|
133
138
|
}] }, { type: undefined, decorators: [{
|
|
@@ -135,7 +140,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
135
140
|
}, {
|
|
136
141
|
type: Inject,
|
|
137
142
|
args: [APP_USER_TOKEN_SCOPES]
|
|
138
|
-
}] }]
|
|
143
|
+
}] }], propDecorators: { useSticky: [{
|
|
139
144
|
type: Input
|
|
140
145
|
}] } });
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4udGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvYWNjb3VudC90b2tlbi50YWJsZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9hY2NvdW50L3Rva2VuLnRhYmxlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVksS0FBSyxFQUFVLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUU1RyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRCxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUNyRixPQUFPLEVBQWEsU0FBUyxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDN0QsT0FBTyxFQUFDLG9CQUFvQixFQUFFLHNCQUFzQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEYsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sbURBQW1ELENBQUM7QUFDMUYsT0FBTyxFQUFjLFdBQVcsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBQ2pGLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ2xFLE9BQU8sRUFBd0IsYUFBYSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVl2RSxNQUFNLE9BQU8sY0FBZSxTQUFRLGdCQUEyQjtJQUtqRDtJQUNBO0lBQ0E7SUFFMkM7SUFQOUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUUzQixZQUNZLFFBQWtCLEVBQ2xCLFdBQStCLEVBQy9CLGdCQUFrQyxFQUN2QixXQUF3QixFQUNRLFdBQXlCO1FBRTlFLEtBQUssQ0FDSCxRQUFRLEVBQ1IsQ0FBQyxHQUFHLHNCQUFz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RUFBQztxQkFDakUsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU07OzBCQVU1QyxNQUFNOzJCQUFDLFdBQVc7OzBCQUNsQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLHFCQUFxQjs0Q0FQbEMsU0FBUztzQkFBakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5qZWN0LCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWx9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtVbnR5cGVkRm9ybUJ1aWxkZXJ9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7VmFsaWRhdG9yU2VydmljZX0gZnJvbSAnQGUtaXMvbmd4LW1hdGVyaWFsLXRhYmxlJztcbmltcG9ydCB7VXNlclRva2VuVmFsaWRhdG9yU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvdmFsaWRhdG9yL3VzZXItdG9rZW4udmFsaWRhdG9yJztcbmltcG9ydCB7VG9rZW5TY29wZSwgVXNlclRva2VufSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC90b2tlbi5tb2RlbCc7XG5pbXBvcnQge0FwcEluTWVtb3J5VGFibGV9IGZyb20gJy4uL3RhYmxlL21lbW9yeS10YWJsZS5jbGFzcyc7XG5pbXBvcnQge1JFU0VSVkVEX0VORF9DT0xVTU5TLCBSRVNFUlZFRF9TVEFSVF9DT0xVTU5TfSBmcm9tICcuLi90YWJsZS90YWJsZS5tb2RlbCc7XG5pbXBvcnQge0luTWVtb3J5RW50aXRpZXNTZXJ2aWNlfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7RW52aXJvbm1lbnQsIEVOVklST05NRU5UfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHtBUFBfVVNFUl9UT0tFTl9TQ09QRVN9IGZyb20gJy4uL3NlcnZpY2VzL2FjY291bnQuc2VydmljZSc7XG5pbXBvcnQge0lOZXdUb2tlbk1vZGFsT3B0aW9ucywgTmV3VG9rZW5Nb2RhbH0gZnJvbSAnLi9uZXctdG9rZW4ubW9kYWwnO1xuXG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC11c2VyLXRva2VuLXRhYmxlJyxcbiAgdGVtcGxhdGVVcmw6ICd0b2tlbi50YWJsZS5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJ3Rva2VuLnRhYmxlLnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge3Byb3ZpZGU6IFZhbGlkYXRvclNlcnZpY2UsIHVzZUNsYXNzOiBVc2VyVG9rZW5WYWxpZGF0b3JTZXJ2aWNlfVxuICBdLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBVc2VyVG9rZW5UYWJsZSBleHRlbmRzIEFwcEluTWVtb3J5VGFibGU8VXNlclRva2VuPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG5cbiAgQElucHV0KCkgdXNlU3RpY2t5ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3RvcixcbiAgICBwcm90ZWN0ZWQgZm9ybUJ1aWxkZXI6IFVudHlwZWRGb3JtQnVpbGRlcixcbiAgICBwcm90ZWN0ZWQgdmFsaWRhdG9yU2VydmljZTogVmFsaWRhdG9yU2VydmljZSxcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfVVNFUl9UT0tFTl9TQ09QRVMpIHByb3RlY3RlZCB0b2tlblNjb3BlczogVG9rZW5TY29wZVtdXG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgaW5qZWN0b3IsXG4gICAgICBbLi4uUkVTRVJWRURfU1RBUlRfQ09MVU1OUywgJ25hbWUnLCAvKidmbGFncycsKi8gJ3Njb3BlcycsICdsYXN0VXNlZERhdGUnLCAnZXhwaXJhdGlvbkRhdGUnLCAnY3JlYXRpb25EYXRlJywgJ3VwZGF0ZURhdGUnLCAuLi5SRVNFUlZFRF9FTkRfQ09MVU1OU10sXG4gICAgICBVc2VyVG9rZW4sXG4gICAgICBuZXcgSW5NZW1vcnlFbnRpdGllc1NlcnZpY2UoVXNlclRva2VuLCB1bmRlZmluZWQsIHtcbiAgICAgICAgZmlsdGVyRm5GYWN0b3J5OiAoKSA9PiAoKSA9PiB0cnVlXG4gICAgICB9KSxcbiAgICAgIHZhbGlkYXRvclNlcnZpY2VcbiAgICApO1xuXG4gICAgLy8gdGhpcy5yZWFkT25seSA9IHRydWU7XG4gICAgdGhpcy5pbmxpbmVFZGl0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLmRlZmF1bHRTb3J0QnkgPSAnY3JlYXRpb25EYXRlJztcbiAgICB0aGlzLmRlZmF1bHRTb3J0RGlyZWN0aW9uID0gJ2FzYyc7XG4gICAgdGhpcy5pMThuQ29sdW1uUHJlZml4ID0gJ0FDQ09VTlQuVE9LRU5TLlRBQkxFLic7XG4gICAgdGhpcy5kZWJ1ZyA9ICFlbnZpcm9ubWVudD8ucHJvZHVjdGlvbjtcblxuICAgIHRoaXMuYXV0b0xvYWQgPSBmYWxzZTtcblxuICAgIGlmICghdG9rZW5TY29wZXMpIHtcbiAgICAgIGNvbnNvbGUud2FybignTm8gVG9rZW5TY29wZXMgcHJvdmlkZWQuIFBsZWFzZSBwcm92aWRlIHRoZSB0b2tlbiBBUFBfVVNFUl9UT0tFTl9TQ09QRVMgd2l0aCB2YWxpZCBUb2tlblNjb3BlIGFycmF5Jyk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIHRoaXMubWFya0FzUmVhZHkoKTtcbiAgfVxuXG4gIGdldCB2YWx1ZSgpOiBVc2VyVG9rZW5bXSB7XG4gICAgY29uc3QgdmFsdWVzID0gc3VwZXIudmFsdWUgfHwgW107XG5cblxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICBzZXQgdmFsdWUoZGF0YTogVXNlclRva2VuW10pIHtcbiAgICBzdXBlci52YWx1ZSA9IGRhdGE7XG4gIH1cblxuICBzZXRWYWx1ZSh2YWx1ZTogVXNlclRva2VuW10sIG9wdHM/OiB7IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuXG4gICAgLy8gU2V0IHNjb3BlcyBmcm9tIGZsYWdzXG4gICAgdmFsdWU/LmZvckVhY2godXNlclRva2VuID0+IHtcbiAgICAgIGNvbnN0IHNjb3BlczogVG9rZW5TY29wZVtdID0gW107XG4gICAgICBpZiAodXNlclRva2VuLmZsYWdzKSB7XG4gICAgICAgIHRoaXMudG9rZW5TY29wZXMuZm9yRWFjaChzY29wZSA9PiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWJpdHdpc2VcbiAgICAgICAgICBpZiAodXNlclRva2VuLmZsYWdzICYgc2NvcGUuZmxhZykge1xuICAgICAgICAgICAgc2NvcGVzLnB1c2goc2NvcGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB1c2VyVG9rZW4uc2NvcGVzID0gc2NvcGVzO1xuICAgIH0pO1xuXG4gICAgc3VwZXIuc2V0VmFsdWUodmFsdWUsIG9wdHMpO1xuICB9XG5cbiAgYXN5bmMgYWRkVG9rZW4oZXZlbnQ6IFVJRXZlbnQpIHtcbiAgICBldmVudD8uc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxDdHJsLmNyZWF0ZSh7XG4gICAgICBjb21wb25lbnQ6IE5ld1Rva2VuTW9kYWwsXG4gICAgICBjb21wb25lbnRQcm9wczogPElOZXdUb2tlbk1vZGFsT3B0aW9ucz57XG4gICAgICAgIG1vYmlsZTogdGhpcy5tb2JpbGUsXG4gICAgICAgIGlzTmV3OiB0cnVlLFxuICAgICAgICBkYXRhOiBuZXcgVXNlclRva2VuKCksXG4gICAgICAgIHRva2VuU2NvcGVzOiB0aGlzLnRva2VuU2NvcGVzIHx8IFtdLFxuICAgICAgICBleGlzdGluZ05hbWVzOiB0aGlzLnZhbHVlPy5tYXAodiA9PiB2Lm5hbWUpXG4gICAgICB9LFxuICAgICAgYmFja2Ryb3BEaXNtaXNzOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgYXdhaXQgbW9kYWwucHJlc2VudCgpO1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgbW9kYWwub25EaWREaXNtaXNzKCk7XG5cbiAgICBpZiAoZGF0YT8ubmFtZSkge1xuICAgICAgLy8gQWRkIHRoaXMgdG9rZW4gaW4gdGhlIGxpc3RcbiAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuYWRkUm93VG9UYWJsZSh1bmRlZmluZWQsIHtlZGl0aW5nOiBmYWxzZX0pO1xuICAgICAgcm93LnZhbGlkYXRvci5wYXRjaFZhbHVlKGRhdGEpO1xuXG4gICAgICB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gICAgfVxuICB9XG5cbiAgLy8gYXN5bmMgcmV2b2NhdGUoZXZlbnQ6IFVJRXZlbnQpIHtcbiAgLy8gICBpZiAodGhpcy5zZWxlY3Rpb24uaXNFbXB0eSgpKSByZXR1cm47XG4gIC8vXG4gIC8vICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgQWxlcnRzLmFza0NvbmZpcm1hdGlvbih0aGlzLmkxOG5Db2x1bW5QcmVmaXggKyAnQ09ORklSTS5SRVZPQ0FURScsIHRoaXMuYWxlcnRDdHJsLCB0aGlzLnRyYW5zbGF0ZSk7XG4gIC8vICAgaWYgKCFjb25maXJtZWQpIHJldHVybjtcbiAgLy9cbiAgLy8gICBjb25zdCBub3cgPSBtb21lbnQoKTtcbiAgLy8gICB0aGlzLnNlbGVjdGlvbi5zZWxlY3RlZC5mb3JFYWNoKHJvdyA9PiB7XG4gIC8vICAgICByb3cudmFsaWRhdG9yLnBhdGNoVmFsdWUoe3Jldm9jYXRpb25EYXRlOiBub3d9LCB7ZW1pdEV2ZW50OnRydWV9KTtcbiAgLy8gICAgIC8vIHJvdy52YWxpZGF0b3IudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAvLyAgIH0pO1xuICAvL1xuICAvLyAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIC8vICAgLy8gdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAvLyB9XG5cblxuICBkaXNwbGF5KHNjb3BlczogVG9rZW5TY29wZVtdKSB7XG4gICAgcmV0dXJuIHNjb3Blcz8ubWFwKHZhbHVlID0+IHRoaXMudHJhbnNsYXRlLmluc3RhbnQodmFsdWUubmFtZSkpLmpvaW4oJywgJyk7XG4gIH1cbn1cbiIsIjxtYXQtdG9vbGJhcj5cblxuICA8IS0tIFJlZnJlc2ggLS0+XG4gIDxidXR0b24gbWF0LWljb24tYnV0dG9uICpuZ0lmPVwiIW1vYmlsZVwiXG4gICAgICAgICAgW3RpdGxlXT1cIidDT01NT04uQlROX1JFRlJFU0gnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9uUmVmcmVzaC5lbWl0KClcIj5cbiAgICA8bWF0LWljb24+cmVmcmVzaDwvbWF0LWljb24+XG4gIDwvYnV0dG9uPlxuXG4gIDxpb24taXRlbSAqbmdJZj1cIiFtb2JpbGUgJiYgZXJyb3I7IGxldCBlcnJvclwiIGxpbmVzPVwibm9uZVwiPlxuICAgIDxpb24taWNvbiBjb2xvcj1cImRhbmdlclwiIHNsb3Q9XCJzdGFydFwiIG5hbWU9XCJhbGVydC1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgIDxpb24tbGFiZWwgY29sb3I9XCJkYW5nZXJcIiBbaW5uZXJIVE1MXT1cImVycm9yfHRyYW5zbGF0ZVwiPjwvaW9uLWxhYmVsPlxuICA8L2lvbi1pdGVtPlxuXG4gIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXNwYWNlclwiPjwvZGl2PlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb24uaXNFbXB0eSgpOyBlbHNlIGhhc1NlbGVjdGlvblwiPlxuXG4gICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgICpuZ0lmPVwiY2FuRWRpdCAmJiAhbW9iaWxlXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCInQ09NTU9OLkJUTl9BREQnfHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiYWRkVG9rZW4oJGV2ZW50KVwiPlxuICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLXRlbXBsYXRlICNoYXNTZWxlY3Rpb24+XG5cbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgW3RpdGxlXT1cIidDT01NT04uQlROX0RFTEVURScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVNlbGVjdGlvbigkZXZlbnQpXCI+XG4gICAgICA8bWF0LWljb24+ZGVsZXRlX291dGxpbmU8L21hdC1pY29uPlxuICAgIDwvYnV0dG9uPlxuXG4gIDwvbmctdGVtcGxhdGU+XG5cbjwvbWF0LXRvb2xiYXI+XG5cbjxpb24tY29udGVudCBjbGFzcz1cImlvbi1uby1wYWRkaW5nXCI+XG5cbiAgPGlvbi1yZWZyZXNoZXIgc2xvdD1cImZpeGVkXCIgKm5nSWY9XCJtb2JpbGVcIiAoaW9uUmVmcmVzaCk9XCJkb1JlZnJlc2goJGV2ZW50KVwiPlxuICAgIDxpb24tcmVmcmVzaGVyLWNvbnRlbnQ+PC9pb24tcmVmcmVzaGVyLWNvbnRlbnQ+XG4gIDwvaW9uLXJlZnJlc2hlcj5cblxuICA8IS0tIHRhYmxlIC0tPlxuICA8ZGl2IGNsYXNzPVwidGFibGUtY29udGFpbmVyXCI+XG4gICAgPHRhYmxlICN0YWJsZSBtYXQtdGFibGUgbWF0U29ydCBtYXRTb3J0RGlzYWJsZUNsZWFyXG4gICAgICAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxuICAgICAgICAgICBbbWF0U29ydEFjdGl2ZV09XCJkZWZhdWx0U29ydEJ5XCJcbiAgICAgICAgICAgW21hdFNvcnREaXJlY3Rpb25dPVwiZGVmYXVsdFNvcnREaXJlY3Rpb25cIlxuICAgICAgICAgICBbdHJhY2tCeV09XCJ0cmFja0J5Rm5cIj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3RcIiBbc3RpY2t5XT1cInVzZVN0aWNreVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFpbmxpbmVFZGl0aW9uXCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveCAoY2hhbmdlKT1cIiRldmVudCA/IG1hc3RlclRvZ2dsZSgpIDogbnVsbFwiIFtjaGVja2VkXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmIGlzQWxsU2VsZWN0ZWQoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaW5kZXRlcm1pbmF0ZV09XCJzZWxlY3Rpb24uaGFzVmFsdWUoKSAmJiAhaXNBbGxTZWxlY3RlZCgpXCI+XG4gICAgICAgICAgPC9tYXQtY2hlY2tib3g+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBbY2xhc3MuY2RrLXZpc3VhbGx5LWhpZGRlbl09XCIhaW5saW5lRWRpdGlvblwiPlxuICAgICAgICAgIDxtYXQtY2hlY2tib3ggKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwiJGV2ZW50ID8gc2VsZWN0aW9uLnRvZ2dsZShyb3cpIDogbnVsbFwiIFtjaGVja2VkXT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIElkIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaWRcIiBbc3RpY2t5XT1cInVzZVN0aWNreVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICA8aW9uLWxhYmVsPiM8L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPnt7IHJvdy5jdXJyZW50RGF0YS5pZCB9fTwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBuYW1lIGNvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibmFtZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICA8aW9uLWxhYmVsPnt7IGkxOG5Db2x1bW5QcmVmaXggKyAnTkFNRScgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgIHt7IChyb3cuY3VycmVudERhdGEgfCBwcm9wZXJ0eUdldCA6ICduYW1lJykgfHwgKGkxOG5Db2x1bW5QcmVmaXggKyAnVU5LTk9XTicgfCB0cmFuc2xhdGUpIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuPCEtLSAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZmxhZ3NcIj4tLT5cbjwhLS0gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPi0tPlxuPCEtLSAgICAgICAgICA8aW9uLWxhYmVsPnt7IGkxOG5Db2x1bW5QcmVmaXggKyAnRkxBR1MnIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+LS0+XG48IS0tICAgICAgICA8L3RoPi0tPlxuPCEtLSAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPi0tPlxuPCEtLSAgICAgICAgICB7eyByb3cuY3VycmVudERhdGEgfCBwcm9wZXJ0eUdldCA6ICdmbGFncycgfX0tLT5cbjwhLS0gICAgICAgIDwvdGQ+LS0+XG48IS0tICAgICAgPC9uZy1jb250YWluZXI+LS0+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwic2NvcGVzXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyPlxuICAgICAgICAgIDxpb24tbGFiZWw+e3sgaTE4bkNvbHVtblByZWZpeCArICdTQ09QRVMnIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cbiAgICAgICAgICB7eyBkaXNwbGF5KHJvdy5jdXJyZW50RGF0YSB8IHByb3BlcnR5R2V0IDogJ3Njb3BlcycpIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJjcmVhdGlvbkRhdGVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXIgY2xhc3M9XCJtYXQtY2VsbC1kYXRlLXRpbWVcIj5cbiAgICAgICAgICA8aW9uLWxhYmVsPnt7IGkxOG5Db2x1bW5QcmVmaXggKyAnQ1JFQVRJT05fREFURScgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIGNsYXNzPVwibWF0LWNlbGwtZGF0ZS10aW1lXCI+XG4gICAgICAgICAge3sgcm93LmN1cnJlbnREYXRhIHwgcHJvcGVydHlHZXQgOiAnY3JlYXRpb25EYXRlJyB8IGRhdGVGb3JtYXQgOiB7dGltZTogdHJ1ZX0gfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImV4cGlyYXRpb25EYXRlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyIGNsYXNzPVwibWF0LWNlbGwtZGF0ZS10aW1lXCI+XG4gICAgICAgICAgPGlvbi1sYWJlbD57eyBpMThuQ29sdW1uUHJlZml4ICsgJ0VYUElSQVRJT05fREFURScgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIGNsYXNzPVwibWF0LWNlbGwtZGF0ZS10aW1lXCI+XG4gICAgICAgICAge3sgcm93LmN1cnJlbnREYXRhIHwgcHJvcGVydHlHZXQgOiAnZXhwaXJhdGlvbkRhdGUnIHwgZGF0ZUZvcm1hdCA6IHt0aW1lOiB0cnVlfSB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibGFzdFVzZWREYXRlXCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0LXNvcnQtaGVhZGVyIGNsYXNzPVwibWF0LWNlbGwtZGF0ZS10aW1lXCI+XG4gICAgICAgICAgPGlvbi1sYWJlbD57eyBpMThuQ29sdW1uUHJlZml4ICsgJ0xBU1RfVVNFRF9EQVRFJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgY2xhc3M9XCJtYXQtY2VsbC1kYXRlLXRpbWVcIj5cbiAgICAgICAgICB7eyByb3cuY3VycmVudERhdGEgfCBwcm9wZXJ0eUdldCA6ICdsYXN0VXNlZERhdGUnIHwgZGF0ZUZvcm1hdCA6IHt0aW1lOiB0cnVlfSB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwidXBkYXRlRGF0ZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciBjbGFzcz1cIm1hdC1jZWxsLWRhdGUtdGltZVwiPlxuICAgICAgICAgIDxpb24tbGFiZWw+e3sgaTE4bkNvbHVtblByZWZpeCArICdVUERBVEVfREFURScgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIGNsYXNzPVwibWF0LWNlbGwtZGF0ZS10aW1lXCI+XG4gICAgICAgICAge3sgcm93LmN1cnJlbnREYXRhIHwgcHJvcGVydHlHZXQgOiAndXBkYXRlRGF0ZScgfCBkYXRlRm9ybWF0IDoge3RpbWU6IHRydWV9IH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBBY3Rpb25zIGJ1dHRvbnMgY29sdW1uIC0tPlxuICAgICAgPGFwcC1hY3Rpb25zLWNvbHVtbiBbc3RpY2t5RW5kXT1cInVzZVN0aWNreVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zQ2xpY2spPVwib3BlblNlbGVjdENvbHVtbnNNb2RhbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbmNlbE9yRGVsZXRlQ2xpY2spPVwiY2FuY2VsT3JEZWxldGUoJGV2ZW50LmV2ZW50LCAkZXZlbnQucm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maXJtQW5kQWRkQ2xpY2spPVwiY29uZmlybUFuZEFkZCgkZXZlbnQuZXZlbnQsICRldmVudC5yb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhY2t3YXJkKT1cImNvbmZpcm1BbmRCYWNrd2FyZCgkZXZlbnQuZXZlbnQsICRldmVudC5yb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcndhcmQpPVwiY29uZmlybUFuZEZvcndhcmQoJGV2ZW50LmV2ZW50LCAkZXZlbnQucm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5DYW5jZWxdPVwiZmFsc2VcIj5cbiAgICAgIDwvYXBwLWFjdGlvbnMtY29sdW1uPlxuXG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnM7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIlxuICAgICAgICAgIFtjbGFzcy5tYXQtcm93LXNlbGVjdGVkXT1cInJvdy5lZGl0aW5nXCJcbiAgICAgICAgICBbY2xhc3MubWF0LXJvdy1lcnJvcl09XCJyb3cudmFsaWRhdG9yPy5pbnZhbGlkXCJcbiAgICAgICAgICBbY2xhc3MubWF0LXJvdy1kaXJ0eV09XCJyb3cudmFsaWRhdG9yPy5kaXJ0eVwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsaWNrUm93KCRldmVudCwgcm93KVwiXG4gICAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImVzY2FwZUVkaXRpbmdSb3coJGV2ZW50KVwiXG4gICAgICAgICAgW2Nka1RyYXBGb2N1c109XCJyb3cudmFsaWRhdG9yPy5pbnZhbGlkXCI+PC90cj5cbiAgICA8L3RhYmxlPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdTdWJqZWN0fGFzeW5jOyBlbHNlIG5vUmVzdWx0XCI+XG4gICAgICA8aW9uLWl0ZW0+XG4gICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBhbmltYXRlZD48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgPC9pb24taXRlbT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjbm9SZXN1bHQ+XG4gICAgICA8aW9uLWl0ZW0gKm5nSWY9XCJ0b3RhbFJvd0NvdW50ID09PSAwXCI+XG4gICAgICAgIDxpb24tdGV4dCBjb2xvcj1cImRhbmdlclwiIGNsYXNzPVwidGV4dC1pdGFsaWNcIiB0cmFuc2xhdGU+Q09NTU9OLk5PX1JFU1VMVDwvaW9uLXRleHQ+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgPC9kaXY+XG48L2lvbi1jb250ZW50PlxuXG48aW9uLWZhYiBzbG90PVwiZml4ZWRcIiB2ZXJ0aWNhbD1cImJvdHRvbVwiIGhvcml6b250YWw9XCJlbmRcIiAqbmdJZj1cIm1vYmlsZVwiPlxuICA8aW9uLWZhYi1idXR0b24gY29sb3I9XCJ0ZXJ0aWFyeVwiIChjbGljayk9XCJhZGRUb2tlbigkZXZlbnQpXCI+XG4gICAgPGlvbi1pY29uIG5hbWU9XCJhZGRcIj48L2lvbi1pY29uPlxuICA8L2lvbi1mYWItYnV0dG9uPlxuPC9pb24tZmFiPlxuIl19
|
|
146
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4udGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2NvcmUvYWNjb3VudC90b2tlbi50YWJsZS50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9hY2NvdW50L3Rva2VuLnRhYmxlLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFxQixTQUFTLEVBQUUsTUFBTSxFQUFZLEtBQUssRUFBVSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFakksT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDdkYsT0FBTyxFQUFjLFNBQVMsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1EQUFtRCxDQUFDO0FBQzVGLE9BQU8sRUFBZSxXQUFXLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQXlCLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTekUsTUFBTSxPQUFPLGNBQWUsU0FBUSxnQkFBMkI7SUFJakQ7SUFDQTtJQUNBO0lBQ0E7SUFFMkM7SUFSOUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUUzQixZQUNZLFFBQWtCLEVBQ2xCLFdBQStCLEVBQy9CLGdCQUFrQyxFQUNsQyxFQUFxQixFQUNWLFdBQXdCLEVBQ1EsV0FBeUI7UUFFOUUsS0FBSyxDQUNILFFBQVEsRUFD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QTFIVSxjQUFjLDZJQVFmLFdBQVcsYUFDQyxxQkFBcUI7MkZBVGhDLGNBQWMsbUZBSGQsQ0FBQyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUseUJBQXlCLEVBQUUsQ0FBQyxpRENoQmpGLCszTUErSkE7OzJGRDVJYSxjQUFjO2tCQVAxQixTQUFTOytCQUNFLHNCQUFzQixhQUdyQixDQUFDLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSx5QkFBeUIsRUFBRSxDQUFDLG1CQUM5RCx1QkFBdUIsQ0FBQyxNQUFNOzswQkFVNUMsTUFBTTsyQkFBQyxXQUFXOzswQkFDbEIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxxQkFBcUI7eUNBUmxDLFNBQVM7c0JBQWpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgSW5qZWN0LCBJbmplY3RvciwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFVudHlwZWRGb3JtQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFZhbGlkYXRvclNlcnZpY2UgfSBmcm9tICdAZS1pcy9uZ3gtbWF0ZXJpYWwtdGFibGUnO1xuaW1wb3J0IHsgVXNlclRva2VuVmFsaWRhdG9yU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3ZhbGlkYXRvci91c2VyLXRva2VuLnZhbGlkYXRvcic7XG5pbXBvcnQgeyBUb2tlblNjb3BlLCBVc2VyVG9rZW4gfSBmcm9tICcuLi9zZXJ2aWNlcy9tb2RlbC90b2tlbi5tb2RlbCc7XG5pbXBvcnQgeyBBcHBJbk1lbW9yeVRhYmxlIH0gZnJvbSAnLi4vdGFibGUvbWVtb3J5LXRhYmxlLmNsYXNzJztcbmltcG9ydCB7IFJFU0VSVkVEX0VORF9DT0xVTU5TLCBSRVNFUlZFRF9TVEFSVF9DT0xVTU5TIH0gZnJvbSAnLi4vdGFibGUvdGFibGUubW9kZWwnO1xuaW1wb3J0IHsgSW5NZW1vcnlFbnRpdGllc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvbWVtb3J5LWVudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IEVudmlyb25tZW50LCBFTlZJUk9OTUVOVCB9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBBUFBfVVNFUl9UT0tFTl9TQ09QRVMgfSBmcm9tICcuLi9zZXJ2aWNlcy9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSU5ld1Rva2VuTW9kYWxPcHRpb25zLCBOZXdUb2tlbk1vZGFsIH0gZnJvbSAnLi9uZXctdG9rZW4ubW9kYWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtdXNlci10b2tlbi10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAndG9rZW4udGFibGUuaHRtbCcsXG4gIHN0eWxlVXJsczogWyd0b2tlbi50YWJsZS5zY3NzJ10sXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVmFsaWRhdG9yU2VydmljZSwgdXNlQ2xhc3M6IFVzZXJUb2tlblZhbGlkYXRvclNlcnZpY2UgfV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBVc2VyVG9rZW5UYWJsZSBleHRlbmRzIEFwcEluTWVtb3J5VGFibGU8VXNlclRva2VuPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHVzZVN0aWNreSA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgcHJvdGVjdGVkIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRvclNlcnZpY2U6IFZhbGlkYXRvclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBASW5qZWN0KEVOVklST05NRU5UKSBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfVVNFUl9UT0tFTl9TQ09QRVMpIHByb3RlY3RlZCB0b2tlblNjb3BlczogVG9rZW5TY29wZVtdXG4gICkge1xuICAgIHN1cGVyKFxuICAgICAgaW5qZWN0b3IsXG4gICAgICBbLi4uUkVTRVJWRURfU1RBUlRfQ09MVU1OUywgJ25hbWUnLCAnc2NvcGVzJywgJ2xhc3RVc2VkRGF0ZScsICdleHBpcmF0aW9uRGF0ZScsICdjcmVhdGlvbkRhdGUnLCAuLi5SRVNFUlZFRF9FTkRfQ09MVU1OU10sXG4gICAgICBVc2VyVG9rZW4sXG4gICAgICBuZXcgSW5NZW1vcnlFbnRpdGllc1NlcnZpY2UoVXNlclRva2VuLCB1bmRlZmluZWQsIHtcbiAgICAgICAgZmlsdGVyRm5GYWN0b3J5OiAoKSA9PiAoKSA9PiB0cnVlLFxuICAgICAgICBlcXVhbHM6IFVzZXJUb2tlbi5lcXVhbHMsXG4gICAgICB9KSxcbiAgICAgIHZhbGlkYXRvclNlcnZpY2VcbiAgICApO1xuXG4gICAgLy8gdGhpcy5yZWFkT25seSA9IHRydWU7XG4gICAgdGhpcy5pbmxpbmVFZGl0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5kZWZhdWx0U29ydEJ5ID0gJ2NyZWF0aW9uRGF0ZSc7XG4gICAgdGhpcy5kZWZhdWx0U29ydERpcmVjdGlvbiA9ICdhc2MnO1xuICAgIHRoaXMuaTE4bkNvbHVtblByZWZpeCA9ICdBQ0NPVU5ULlRPS0VOUy5UQUJMRS4nO1xuICAgIHRoaXMuZGVidWcgPSAhZW52aXJvbm1lbnQ/LnByb2R1Y3Rpb247XG5cbiAgICB0aGlzLmF1dG9Mb2FkID0gZmFsc2U7XG5cbiAgICBpZiAoIXRva2VuU2NvcGVzKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ05vIFRva2VuU2NvcGVzIHByb3ZpZGVkLiBQbGVhc2UgcHJvdmlkZSB0aGUgdG9rZW4gQVBQX1VTRVJfVE9LRU5fU0NPUEVTIHdpdGggdmFsaWQgVG9rZW5TY29wZSBhcnJheScpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG5cbiAgICB0aGlzLm1hcmtBc1JlYWR5KCk7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogVXNlclRva2VuW10ge1xuICAgIGNvbnN0IHZhbHVlcyA9IHN1cGVyLnZhbHVlIHx8IFtdO1xuXG4gICAgcmV0dXJuIHZhbHVlcztcbiAgfVxuXG4gIHNldCB2YWx1ZShkYXRhOiBVc2VyVG9rZW5bXSkge1xuICAgIHN1cGVyLnZhbHVlID0gZGF0YTtcbiAgfVxuXG4gIHNldFZhbHVlKHZhbHVlOiBVc2VyVG9rZW5bXSwgb3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgLy8gU2V0IHNjb3BlcyBmcm9tIGZsYWdzXG4gICAgdmFsdWU/LmZvckVhY2goKHVzZXJUb2tlbikgPT4ge1xuICAgICAgY29uc3Qgc2NvcGVzOiBUb2tlblNjb3BlW10gPSBbXTtcbiAgICAgIGlmICh1c2VyVG9rZW4uZmxhZ3MpIHtcbiAgICAgICAgdGhpcy50b2tlblNjb3Blcy5mb3JFYWNoKChzY29wZSkgPT4ge1xuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICAgICAgaWYgKHVzZXJUb2tlbi5mbGFncyAmIHNjb3BlLmZsYWcpIHtcbiAgICAgICAgICAgIHNjb3Blcy5wdXNoKHNjb3BlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgdXNlclRva2VuLnNjb3BlcyA9IHNjb3BlcztcbiAgICB9KTtcblxuICAgIHN1cGVyLnNldFZhbHVlKHZhbHVlLCBvcHRzKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFRva2VuKGV2ZW50OiBVSUV2ZW50KSB7XG4gICAgaWYgKGV2ZW50Py5kZWZhdWx0UHJldmVudGVkKSByZXR1cm47IC8vIEF2b2lkIG11bHRpcGxlIGNhbGxcblxuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50Py5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5tb2RhbEN0cmwuY3JlYXRlKHtcbiAgICAgIGNvbXBvbmVudDogTmV3VG9rZW5Nb2RhbCxcbiAgICAgIGNvbXBvbmVudFByb3BzOiA8SU5ld1Rva2VuTW9kYWxPcHRpb25zPntcbiAgICAgICAgbW9iaWxlOiB0aGlzLm1vYmlsZSxcbiAgICAgICAgaXNOZXc6IHRydWUsXG4gICAgICAgIGRhdGE6IG5ldyBVc2VyVG9rZW4oKSxcbiAgICAgICAgdG9rZW5TY29wZXM6IHRoaXMudG9rZW5TY29wZXMgfHwgW10sXG4gICAgICAgIGV4aXN0aW5nTmFtZXM6IHRoaXMudmFsdWU/Lm1hcCgodikgPT4gdi5uYW1lKSxcbiAgICAgIH0sXG4gICAgICBiYWNrZHJvcERpc21pc3M6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgbW9kYWwucHJlc2VudCgpO1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgbW9kYWwub25EaWREaXNtaXNzKCk7XG5cbiAgICBpZiAoZGF0YT8ubmFtZSkge1xuICAgICAgLy8gQWRkIHRoaXMgdG9rZW4gaW4gdGhlIGxpc3RcbiAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuYWRkUm93VG9UYWJsZSh1bmRlZmluZWQsIHsgZWRpdGluZzogZmFsc2UgfSk7XG4gICAgICByb3cudmFsaWRhdG9yLnBhdGNoVmFsdWUoZGF0YSk7XG5cbiAgICAgIHRoaXMubWFya0FzRGlydHkoKTtcbiAgICB9XG4gIH1cblxuICAvLyBhc3luYyByZXZvY2F0ZShldmVudDogVUlFdmVudCkge1xuICAvLyAgIGlmICh0aGlzLnNlbGVjdGlvbi5pc0VtcHR5KCkpIHJldHVybjtcbiAgLy9cbiAgLy8gICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBBbGVydHMuYXNrQ29uZmlybWF0aW9uKHRoaXMuaTE4bkNvbHVtblByZWZpeCArICdDT05GSVJNLlJFVk9DQVRFJywgdGhpcy5hbGVydEN0cmwsIHRoaXMudHJhbnNsYXRlKTtcbiAgLy8gICBpZiAoIWNvbmZpcm1lZCkgcmV0dXJuO1xuICAvL1xuICAvLyAgIGNvbnN0IG5vdyA9IG1vbWVudCgpO1xuICAvLyAgIHRoaXMuc2VsZWN0aW9uLnNlbGVjdGVkLmZvckVhY2gocm93ID0+IHtcbiAgLy8gICAgIHJvdy52YWxpZGF0b3IucGF0Y2hWYWx1ZSh7cmV2b2NhdGlvbkRhdGU6IG5vd30sIHtlbWl0RXZlbnQ6dHJ1ZX0pO1xuICAvLyAgICAgLy8gcm93LnZhbGlkYXRvci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIC8vICAgfSk7XG4gIC8vXG4gIC8vICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgLy8gICAvLyB0aGlzLm1hcmtBc0RpcnR5KCk7XG4gIC8vIH1cblxuICBkaXNwbGF5KHNjb3BlczogVG9rZW5TY29wZVtdKSB7XG4gICAgcmV0dXJuIHNjb3Blcz8ubWFwKCh2YWx1ZSkgPT4gdGhpcy50cmFuc2xhdGUuaW5zdGFudCh2YWx1ZS5uYW1lKSkuam9pbignLCAnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtYXJrRm9yQ2hlY2soKSB7XG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIiwiPG1hdC10b29sYmFyPlxuXG4gIDwhLS0gUmVmcmVzaCAtLT5cbiAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKm5nSWY9XCIhbW9iaWxlXCJcbiAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fUkVGUkVTSCd8dHJhbnNsYXRlXCJcbiAgICAgICAgICAoY2xpY2spPVwib25SZWZyZXNoLmVtaXQoKVwiPlxuICAgIDxtYXQtaWNvbj5yZWZyZXNoPC9tYXQtaWNvbj5cbiAgPC9idXR0b24+XG5cbiAgPGlvbi1pdGVtICpuZ0lmPVwiIW1vYmlsZSAmJiBlcnJvcjsgbGV0IGVycm9yXCIgbGluZXM9XCJub25lXCI+XG4gICAgPGlvbi1pY29uIGNvbG9yPVwiZGFuZ2VyXCIgc2xvdD1cInN0YXJ0XCIgbmFtZT1cImFsZXJ0LWNpcmNsZVwiPjwvaW9uLWljb24+XG4gICAgPGlvbi1sYWJlbCBjb2xvcj1cImRhbmdlclwiIFtpbm5lckhUTUxdPVwiZXJyb3J8dHJhbnNsYXRlXCI+PC9pb24tbGFiZWw+XG4gIDwvaW9uLWl0ZW0+XG5cbiAgPGRpdiBjbGFzcz1cInRvb2xiYXItc3BhY2VyXCI+PC9kaXY+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGlvbi5pc0VtcHR5KCk7IGVsc2UgaGFzU2VsZWN0aW9uXCI+XG5cbiAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvblxuICAgICAgICAgICAgKm5nSWY9XCJjYW5FZGl0ICYmICFtb2JpbGVcIlxuICAgICAgICAgICAgW3RpdGxlXT1cIidDT01NT04uQlROX0FERCd8dHJhbnNsYXRlXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZGRUb2tlbigkZXZlbnQpXCI+XG4gICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cblxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8bmctdGVtcGxhdGUgI2hhc1NlbGVjdGlvbj5cblxuICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICBbdGl0bGVdPVwiJ0NPTU1PTi5CVE5fREVMRVRFJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlU2VsZWN0aW9uKCRldmVudClcIj5cbiAgICAgIDxtYXQtaWNvbj5kZWxldGVfb3V0bGluZTwvbWF0LWljb24+XG4gICAgPC9idXR0b24+XG5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuPC9tYXQtdG9vbGJhcj5cblxuPGlvbi1jb250ZW50IGNsYXNzPVwiaW9uLW5vLXBhZGRpbmdcIj5cblxuICA8aW9uLXJlZnJlc2hlciBzbG90PVwiZml4ZWRcIiAqbmdJZj1cIm1vYmlsZVwiIChpb25SZWZyZXNoKT1cImRvUmVmcmVzaCgkZXZlbnQpXCI+XG4gICAgPGlvbi1yZWZyZXNoZXItY29udGVudD48L2lvbi1yZWZyZXNoZXItY29udGVudD5cbiAgPC9pb24tcmVmcmVzaGVyPlxuXG4gIDwhLS0gdGFibGUgLS0+XG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIj5cbiAgICA8dGFibGUgI3RhYmxlIG1hdC10YWJsZSBtYXRTb3J0IG1hdFNvcnREaXNhYmxlQ2xlYXJcbiAgICAgICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXG4gICAgICAgICAgIFttYXRTb3J0QWN0aXZlXT1cImRlZmF1bHRTb3J0QnlcIlxuICAgICAgICAgICBbbWF0U29ydERpcmVjdGlvbl09XCJkZWZhdWx0U29ydERpcmVjdGlvblwiXG4gICAgICAgICAgIFt0cmFja0J5XT1cInRyYWNrQnlGblwiPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cInNlbGVjdFwiIFtzdGlja3ldPVwidXNlU3RpY2t5XCI+XG4gICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgW2NsYXNzLmNkay12aXN1YWxseS1oaWRkZW5dPVwiIWNhbkVkaXRcIj5cbiAgICAgICAgICA8bWF0LWNoZWNrYm94IChjaGFuZ2UpPVwiJGV2ZW50ID8gbWFzdGVyVG9nZ2xlKCkgOiBudWxsXCIgW2NoZWNrZWRdPVwic2VsZWN0aW9uLmhhc1ZhbHVlKCkgJiYgaXNBbGxTZWxlY3RlZCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpbmRldGVybWluYXRlXT1cInNlbGVjdGlvbi5oYXNWYWx1ZSgpICYmICFpc0FsbFNlbGVjdGVkKClcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIFtjbGFzcy5jZGstdmlzdWFsbHktaGlkZGVuXT1cIiFjYW5FZGl0XCI+XG4gICAgICAgICAgPG1hdC1jaGVja2JveCAoY2xpY2spPVwidG9nZ2xlU2VsZWN0Um93KCRldmVudCwgcm93KVwiIFtjaGVja2VkXT1cInNlbGVjdGlvbi5pc1NlbGVjdGVkKHJvdylcIj5cbiAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8IS0tIElkIENvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiaWRcIiBbc3RpY2t5XT1cInVzZVN0aWNreVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciBjbGFzcz1cImNkay12aXN1YWxseS1oaWRkZW5cIj5cbiAgICAgICAgICA8aW9uLWxhYmVsPiM8L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiIGNsYXNzPVwiY2RrLXZpc3VhbGx5LWhpZGRlblwiPnt7IHJvdy5jdXJyZW50RGF0YS5pZCB9fTwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBuYW1lIGNvbHVtbiAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibmFtZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlcj5cbiAgICAgICAgICA8aW9uLWxhYmVsPnt7IGkxOG5Db2x1bW5QcmVmaXggKyAnTkFNRScgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgIHt7IChyb3cuY3VycmVudERhdGEgfCBwcm9wZXJ0eUdldCA6ICduYW1lJykgfHwgKGkxOG5Db2x1bW5QcmVmaXggKyAnVU5LTk9XTicgfCB0cmFuc2xhdGUpIH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzY29wZXNcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXI+XG4gICAgICAgICAgPGlvbi1sYWJlbD57eyBpMThuQ29sdW1uUHJlZml4ICsgJ1NDT1BFUycgfCB0cmFuc2xhdGUgfX08L2lvbi1sYWJlbD5cbiAgICAgICAgPC90aD5cbiAgICAgICAgPHRkIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxuICAgICAgICAgIHt7IGRpc3BsYXkocm93LmN1cnJlbnREYXRhIHwgcHJvcGVydHlHZXQgOiAnc2NvcGVzJykgfX1cbiAgICAgICAgPC90ZD5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyIG1hdENvbHVtbkRlZj1cImNyZWF0aW9uRGF0ZVwiPlxuICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdC1zb3J0LWhlYWRlciBjbGFzcz1cIm1hdC1jZWxsLWRhdGUtdGltZVwiPlxuICAgICAgICAgIDxpb24tbGFiZWw+e3sgaTE4bkNvbHVtblByZWZpeCArICdDUkVBVElPTl9EQVRFJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgY2xhc3M9XCJtYXQtY2VsbC1kYXRlLXRpbWVcIj5cbiAgICAgICAgICB7eyByb3cuY3VycmVudERhdGEgfCBwcm9wZXJ0eUdldCA6ICdjcmVhdGlvbkRhdGUnIHwgZGF0ZUZvcm1hdCA6IHt0aW1lOiB0cnVlfSB9fVxuICAgICAgICA8L3RkPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwiZXhwaXJhdGlvbkRhdGVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXIgY2xhc3M9XCJtYXQtY2VsbC1kYXRlLXRpbWVcIj5cbiAgICAgICAgICA8aW9uLWxhYmVsPnt7IGkxOG5Db2x1bW5QcmVmaXggKyAnRVhQSVJBVElPTl9EQVRFJyB8IHRyYW5zbGF0ZSB9fTwvaW9uLWxhYmVsPlxuICAgICAgICA8L3RoPlxuICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCIgY2xhc3M9XCJtYXQtY2VsbC1kYXRlLXRpbWVcIj5cbiAgICAgICAgICB7eyByb3cuY3VycmVudERhdGEgfCBwcm9wZXJ0eUdldCA6ICdleHBpcmF0aW9uRGF0ZScgfCBkYXRlRm9ybWF0IDoge3RpbWU6IHRydWV9IH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJsYXN0VXNlZERhdGVcIj5cbiAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXQtc29ydC1oZWFkZXIgY2xhc3M9XCJtYXQtY2VsbC1kYXRlLXRpbWVcIj5cbiAgICAgICAgICA8aW9uLWxhYmVsPnt7IGkxOG5Db2x1bW5QcmVmaXggKyAnTEFTVF9VU0VEX0RBVEUnIHwgdHJhbnNsYXRlIH19PC9pb24tbGFiZWw+XG4gICAgICAgIDwvdGg+XG4gICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3dcIiBjbGFzcz1cIm1hdC1jZWxsLWRhdGUtdGltZVwiPlxuICAgICAgICAgIHt7IHJvdy5jdXJyZW50RGF0YSB8IHByb3BlcnR5R2V0IDogJ2xhc3RVc2VkRGF0ZScgfCBkYXRlRm9ybWF0IDoge3RpbWU6IHRydWV9IH19XG4gICAgICAgIDwvdGQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBBY3Rpb25zIGJ1dHRvbnMgY29sdW1uIC0tPlxuICAgICAgPGFwcC1hY3Rpb25zLWNvbHVtbiBbc3RpY2t5RW5kXT1cInVzZVN0aWNreVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChvcHRpb25zQ2xpY2spPVwib3BlblNlbGVjdENvbHVtbnNNb2RhbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbmNlbE9yRGVsZXRlQ2xpY2spPVwiY2FuY2VsT3JEZWxldGUoJGV2ZW50LmV2ZW50LCAkZXZlbnQucm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb25maXJtQW5kQWRkQ2xpY2spPVwiY29uZmlybUFuZEFkZCgkZXZlbnQuZXZlbnQsICRldmVudC5yb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGJhY2t3YXJkKT1cImNvbmZpcm1BbmRCYWNrd2FyZCgkZXZlbnQuZXZlbnQsICRldmVudC5yb3cpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvcndhcmQpPVwiY29uZmlybUFuZEZvcndhcmQoJGV2ZW50LmV2ZW50LCAkZXZlbnQucm93KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5DYW5jZWxdPVwiZmFsc2VcIj5cbiAgICAgIDwvYXBwLWFjdGlvbnMtY29sdW1uPlxuXG4gICAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImRpc3BsYXllZENvbHVtbnM7IHN0aWNreTogdHJ1ZVwiPjwvdHI+XG4gICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1ucztcIlxuICAgICAgICAgIFtjbGFzcy5tYXQtcm93LXNlbGVjdGVkXT1cInJvdy5lZGl0aW5nXCJcbiAgICAgICAgICBbY2xhc3MubWF0LXJvdy1lcnJvcl09XCJyb3cudmFsaWRhdG9yPy5pbnZhbGlkXCJcbiAgICAgICAgICBbY2xhc3MubWF0LXJvdy1kaXJ0eV09XCJyb3cudmFsaWRhdG9yPy5kaXJ0eVwiXG4gICAgICAgICAgKGNsaWNrKT1cImNsaWNrUm93KCRldmVudCwgcm93KVwiXG4gICAgICAgICAgKGtleWRvd24uZXNjYXBlKT1cImVzY2FwZUVkaXRpbmdSb3coJGV2ZW50KVwiXG4gICAgICAgICAgW2Nka1RyYXBGb2N1c109XCJyb3cudmFsaWRhdG9yPy5pbnZhbGlkXCI+PC90cj5cbiAgICA8L3RhYmxlPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdTdWJqZWN0fGFzeW5jOyBlbHNlIG5vUmVzdWx0XCI+XG4gICAgICA8aW9uLWl0ZW0+XG4gICAgICAgIDxpb24tc2tlbGV0b24tdGV4dCBhbmltYXRlZD48L2lvbi1za2VsZXRvbi10ZXh0PlxuICAgICAgPC9pb24taXRlbT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy10ZW1wbGF0ZSAjbm9SZXN1bHQ+XG4gICAgICA8aW9uLWl0ZW0gKm5nSWY9XCJ0b3RhbFJvd0NvdW50ID09PSAwXCI+XG4gICAgICAgIDxpb24tdGV4dCBjb2xvcj1cImRhbmdlclwiIGNsYXNzPVwidGV4dC1pdGFsaWNcIiB0cmFuc2xhdGU+Q09NTU9OLk5PX1JFU1VMVDwvaW9uLXRleHQ+XG4gICAgICA8L2lvbi1pdGVtPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgPC9kaXY+XG48L2lvbi1jb250ZW50PlxuXG48aW9uLWZhYiBzbG90PVwiZml4ZWRcIiB2ZXJ0aWNhbD1cImJvdHRvbVwiIGhvcml6b250YWw9XCJlbmRcIiAqbmdJZj1cIm1vYmlsZVwiPlxuICA8aW9uLWZhYi1idXR0b24gY29sb3I9XCJ0ZXJ0aWFyeVwiIChjbGljayk9XCJhZGRUb2tlbigkZXZlbnQpXCI+XG4gICAgPGlvbi1pY29uIG5hbWU9XCJhZGRcIj48L2lvbi1pY29uPlxuICA8L2lvbi1mYWItYnV0dG9uPlxuPC9pb24tZmFiPlxuIl19
|