@sumaris-net/ngx-components 1.23.44 → 2.0.0-rc3
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/doc/build.md +2 -2
- package/doc/changelog.md +8 -0
- package/esm2020/public_api.mjs +278 -0
- package/esm2020/public_test_api.mjs +46 -0
- package/esm2020/src/app/admin/admin-routing.module.mjs +41 -0
- package/esm2020/src/app/admin/admin.module.mjs +34 -0
- package/esm2020/src/app/admin/services/filter/person.filter.mjs +59 -0
- package/esm2020/src/app/admin/services/person.service.mjs +161 -0
- package/esm2020/src/app/admin/services/validator/person.validator.mjs +34 -0
- package/esm2020/src/app/admin/users/list/users.mjs +233 -0
- package/esm2020/src/app/admin/users/list/users.module.mjs +58 -0
- package/esm2020/src/app/core/about/modal-about.mjs +71 -0
- package/esm2020/src/app/core/account/account.mjs +230 -0
- package/esm2020/src/app/core/auth/form/form-auth.mjs +131 -0
- package/esm2020/src/app/core/auth/modal/modal-auth.mjs +72 -0
- package/esm2020/src/app/core/core.module.mjs +223 -0
- package/esm2020/src/app/core/core.testing.module.mjs +86 -0
- package/esm2020/src/app/core/form/editor.class.mjs +672 -0
- package/esm2020/src/app/core/form/entity-editor-modal.class.mjs +407 -0
- package/esm2020/src/app/core/form/entity-editor.class.mjs +646 -0
- package/esm2020/src/app/core/form/entity-metadata.component.mjs +25 -0
- package/esm2020/src/app/core/form/form-buttons-bar.component.mjs +71 -0
- package/esm2020/src/app/core/form/form.class.mjs +337 -0
- package/esm2020/src/app/core/form/form.utils.mjs +299 -0
- package/esm2020/src/app/core/form/list.form.mjs +222 -0
- package/esm2020/src/app/core/form/properties/properties.form.mjs +129 -0
- package/esm2020/src/app/core/form/properties/property.validator.mjs +23 -0
- package/esm2020/src/app/core/form/properties/testing/properties-form.test.mjs +90 -0
- package/esm2020/src/app/core/form/properties/testing/properties-form.testing.module.mjs +39 -0
- package/esm2020/src/app/core/graphql/graphql.module.mjs +22 -0
- package/esm2020/src/app/core/graphql/graphql.service.mjs +730 -0
- package/esm2020/src/app/core/graphql/graphql.utils.mjs +117 -0
- package/esm2020/src/app/core/home/home.mjs +257 -0
- package/esm2020/src/app/core/icon/icon.component.mjs +41 -0
- package/esm2020/src/app/core/icon/icon.module.mjs +29 -0
- package/esm2020/src/app/core/install/install-upgrade-card.component.mjs +337 -0
- package/esm2020/src/app/core/install/install-upgrade-card.module.mjs +33 -0
- package/esm2020/src/app/core/menu/menu.component.mjs +317 -0
- package/{esm2015/src/app/core/menu/menu.model.js → esm2020/src/app/core/menu/menu.model.mjs} +0 -0
- package/esm2020/src/app/core/menu/menu.module.mjs +45 -0
- package/{esm2015/src/app/core/menu/menu.service.js → esm2020/src/app/core/menu/menu.service.mjs} +9 -7
- package/esm2020/src/app/core/offline/update-offline-mode-card.component.mjs +27 -0
- package/esm2020/src/app/core/peer/select-peer.modal.mjs +130 -0
- package/esm2020/src/app/core/peer/select-peer.module.mjs +35 -0
- package/esm2020/src/app/core/register/confirm/confirm.mjs +81 -0
- package/esm2020/src/app/core/register/form/form-register.mjs +181 -0
- package/esm2020/src/app/core/register/modal/modal-register.mjs +52 -0
- package/esm2020/src/app/core/register/register.module.mjs +42 -0
- package/esm2020/src/app/core/services/account.service.mjs +1112 -0
- package/esm2020/src/app/core/services/auth-guard.service.mjs +71 -0
- package/esm2020/src/app/core/services/base-entity-service.class.mjs +432 -0
- package/esm2020/src/app/core/services/base-graphql-service.class.mjs +219 -0
- package/{esm2015/src/app/core/services/base58.js → esm2020/src/app/core/services/base58.mjs} +0 -0
- package/{esm2015/src/app/core/services/config/core.config.js → esm2020/src/app/core/services/config/core.config.mjs} +0 -0
- package/esm2020/src/app/core/services/config.service.mjs +354 -0
- package/{esm2015/src/app/core/services/crypto.service.js → esm2020/src/app/core/services/crypto.service.mjs} +7 -5
- package/{esm2015/src/app/core/services/errors.js → esm2020/src/app/core/services/errors.mjs} +0 -0
- package/esm2020/src/app/core/services/local-settings.service.mjs +442 -0
- package/esm2020/src/app/core/services/model/account.model.mjs +50 -0
- package/esm2020/src/app/core/services/model/config.model.mjs +89 -0
- package/esm2020/src/app/core/services/model/department.model.mjs +30 -0
- package/esm2020/src/app/core/services/model/entity.decorators.mjs +107 -0
- package/esm2020/src/app/core/services/model/entity.model.mjs +242 -0
- package/{esm2015/src/app/core/services/model/filter.model.js → esm2020/src/app/core/services/model/filter.model.mjs} +0 -0
- package/{esm2015/src/app/core/services/model/history.model.js → esm2020/src/app/core/services/model/history.model.mjs} +0 -0
- package/{esm2015/src/app/core/services/model/model.enum.js → esm2020/src/app/core/services/model/model.enum.mjs} +0 -0
- package/esm2020/src/app/core/services/model/peer.model.mjs +68 -0
- package/esm2020/src/app/core/services/model/person.model.mjs +83 -0
- package/esm2020/src/app/core/services/model/referential.model.mjs +145 -0
- package/esm2020/src/app/core/services/model/settings.model.mjs +75 -0
- package/esm2020/src/app/core/services/network.service.mjs +595 -0
- package/esm2020/src/app/core/services/network.utils.mjs +16 -0
- package/esm2020/src/app/core/services/pipes/account.pipes.mjs +38 -0
- package/esm2020/src/app/core/services/pipes/department-to-string.pipe.mjs +23 -0
- package/esm2020/src/app/core/services/pipes/person-to-string.pipe.mjs +23 -0
- package/esm2020/src/app/core/services/pipes/usage-mode.pipes.mjs +37 -0
- package/esm2020/src/app/core/services/platform.service.mjs +476 -0
- package/esm2020/src/app/core/services/storage/entities-storage.service.mjs +422 -0
- package/esm2020/src/app/core/services/storage/entity-store.class.mjs +449 -0
- package/esm2020/src/app/core/services/testing/referential-filter.model.mjs +23 -0
- package/esm2020/src/app/core/services/testing/referential.validator.mjs +45 -0
- package/esm2020/src/app/core/services/validator/account.validator.mjs +52 -0
- package/esm2020/src/app/core/services/validator/base.validator.class.mjs +47 -0
- package/esm2020/src/app/core/services/validator/local-settings.validator.mjs +66 -0
- package/esm2020/src/app/core/services/validator/user-settings.validator.mjs +29 -0
- package/esm2020/src/app/core/settings/settings.page.mjs +290 -0
- package/esm2020/src/app/core/table/actions-column.component.mjs +96 -0
- package/esm2020/src/app/core/table/entities-table-datasource.class.mjs +394 -0
- package/esm2020/src/app/core/table/memory-table.class.mjs +53 -0
- package/esm2020/src/app/core/table/table-select-columns.component.mjs +43 -0
- package/esm2020/src/app/core/table/table.class.mjs +1666 -0
- package/esm2020/src/app/core/table/table.utils.mjs +13 -0
- package/esm2020/src/app/core/table/testing/table.testing.mjs +264 -0
- package/esm2020/src/app/core/table/testing/table.testing.module.mjs +38 -0
- package/esm2020/src/app/core/text-popover/testing/text-popover.testing.mjs +37 -0
- package/esm2020/src/app/core/text-popover/testing/text-popover.testing.module.mjs +45 -0
- package/esm2020/src/app/core/text-popover/text-form.component.mjs +84 -0
- package/esm2020/src/app/core/text-popover/text-popover.component.mjs +92 -0
- package/esm2020/src/app/shared/alerts.mjs +238 -0
- package/esm2020/src/app/shared/audio/audio.mjs +201 -0
- package/esm2020/src/app/shared/audio/audio.testing.mjs +31 -0
- package/esm2020/src/app/shared/audio/audio.testing.module.mjs +45 -0
- package/esm2020/src/app/shared/capacitor/keyboard.mjs +40 -0
- package/esm2020/src/app/shared/capacitor/plugins.mjs +9 -0
- package/{esm2015/src/app/shared/constants.js → esm2020/src/app/shared/constants.mjs} +2 -1
- package/esm2020/src/app/shared/dates.mjs +134 -0
- package/esm2020/src/app/shared/debug/debug.component.mjs +39 -0
- package/esm2020/src/app/shared/debug/debug.module.mjs +44 -0
- package/esm2020/src/app/shared/directives/autofocus.directive.mjs +92 -0
- package/esm2020/src/app/shared/directives/autotitle.directive.mjs +30 -0
- package/esm2020/src/app/shared/directives/directives.module.mjs +43 -0
- package/esm2020/src/app/shared/directives/drag-and-drop.directive.mjs +53 -0
- package/esm2020/src/app/shared/directives/ng-var.directive.mjs +31 -0
- package/esm2020/src/app/shared/directives/resizable/resizable.component.mjs +59 -0
- package/esm2020/src/app/shared/directives/resizable/resizable.directive.mjs +40 -0
- package/esm2020/src/app/shared/directives/resizable/resizable.module.mjs +17 -0
- package/esm2020/src/app/shared/events.mjs +64 -0
- package/esm2020/src/app/shared/file/csv.utils.mjs +74 -0
- package/esm2020/src/app/shared/file/file.service.mjs +117 -0
- package/esm2020/src/app/shared/file/file.utils.mjs +113 -0
- package/esm2020/src/app/shared/file/images.utils.mjs +161 -0
- package/{esm2015/src/app/shared/file/uri.utils.js → esm2020/src/app/shared/file/uri.utils.mjs} +0 -0
- package/{esm2015/src/app/shared/focusable.js → esm2020/src/app/shared/focusable.mjs} +0 -0
- package/esm2020/src/app/shared/form/field.component.mjs +244 -0
- package/{esm2015/src/app/shared/form/field.model.js → esm2020/src/app/shared/form/field.model.mjs} +1 -1
- package/esm2020/src/app/shared/form/loading-spinner.mjs +36 -0
- package/esm2020/src/app/shared/forms.mjs +374 -0
- package/esm2020/src/app/shared/functions.mjs +430 -0
- package/{esm2015/src/app/shared/gesture/gesture-config.js → esm2020/src/app/shared/gesture/gesture-config.mjs} +7 -5
- package/esm2020/src/app/shared/gesture/hammer.utils.mjs +2 -0
- package/{esm2015/src/app/shared/graph/colors.utils.js → esm2020/src/app/shared/graph/colors.utils.mjs} +0 -0
- package/esm2020/src/app/shared/graph/graph-colors.mjs +254 -0
- package/esm2020/src/app/shared/guard/component-dirty.guard.mjs +57 -0
- package/esm2020/src/app/shared/help/help.modal.mjs +53 -0
- package/esm2020/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +23 -0
- package/esm2020/src/app/shared/hotkeys/hotkeys.service.mjs +84 -0
- package/esm2020/src/app/shared/hotkeys/shared-hotkeys.module.mjs +42 -0
- package/esm2020/src/app/shared/http/http.utils.mjs +52 -0
- package/esm2020/src/app/shared/image/gallery/image-gallery.component.mjs +279 -0
- package/esm2020/src/app/shared/image/gallery/image-gallery.module.mjs +46 -0
- package/esm2020/src/app/shared/image/gallery/testing/gallegry.model.testing.mjs +27 -0
- package/esm2020/src/app/shared/image/gallery/testing/gallery.service.testing.mjs +89 -0
- package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.mjs +33 -0
- package/esm2020/src/app/shared/image/gallery/testing/gallery.testing.module.mjs +56 -0
- package/esm2020/src/app/shared/image/image.model.mjs +2 -0
- package/esm2020/src/app/shared/image/image.module.mjs +29 -0
- package/esm2020/src/app/shared/image/image.service.mjs +99 -0
- package/{esm2015/src/app/shared/inputs.js → esm2020/src/app/shared/inputs.mjs} +4 -4
- package/{esm2015/src/app/shared/interceptors/progess.interceptor.js → esm2020/src/app/shared/interceptors/progess.interceptor.mjs} +0 -0
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +47 -0
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.mjs +836 -0
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +78 -0
- package/esm2020/src/app/shared/material/autocomplete/material.autocomplete.utils.mjs +19 -0
- package/esm2020/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +205 -0
- package/esm2020/src/app/shared/material/badge/badge.directive.mjs +157 -0
- package/esm2020/src/app/shared/material/badge/badge.module.mjs +32 -0
- package/esm2020/src/app/shared/material/badge/badge.test.mjs +26 -0
- package/esm2020/src/app/shared/material/boolean/boolean.module.mjs +68 -0
- package/esm2020/src/app/shared/material/boolean/material.boolean.mjs +253 -0
- package/esm2020/src/app/shared/material/chips/chips.module.mjs +76 -0
- package/esm2020/src/app/shared/material/chips/material.chips.mjs +691 -0
- package/esm2020/src/app/shared/material/chips/testing/chips.test.mjs +136 -0
- package/esm2020/src/app/shared/material/datetime/datetime.module.mjs +91 -0
- package/esm2020/src/app/shared/material/datetime/material.date.mjs +388 -0
- package/esm2020/src/app/shared/material/datetime/material.dateshort.mjs +327 -0
- package/esm2020/src/app/shared/material/datetime/material.datetime.mjs +434 -0
- package/esm2020/src/app/shared/material/datetime/testing/mat-date-time.test.mjs +110 -0
- package/esm2020/src/app/shared/material/datetime/testing/mat-date.test.mjs +111 -0
- package/esm2020/src/app/shared/material/duration/duration.module.mjs +67 -0
- package/{esm2015/src/app/shared/material/duration/duration.utils.js → esm2020/src/app/shared/material/duration/duration.utils.mjs} +0 -0
- package/esm2020/src/app/shared/material/duration/material.duration.mjs +257 -0
- package/esm2020/src/app/shared/material/latlong/latlong.utils.mjs +266 -0
- package/esm2020/src/app/shared/material/latlong/material.latlong.mjs +381 -0
- package/esm2020/src/app/shared/material/latlong/material.latlong.module.mjs +67 -0
- package/esm2020/src/app/shared/material/latlong/testing/latlong.test.mjs +74 -0
- package/{esm2015/src/app/shared/material/material.animations.js → esm2020/src/app/shared/material/material.animations.mjs} +0 -0
- package/esm2020/src/app/shared/material/material.module.mjs +224 -0
- package/esm2020/src/app/shared/material/material.testing.module.mjs +145 -0
- package/esm2020/src/app/shared/material/numpad/numpad.append-to-input.directive.mjs +98 -0
- package/esm2020/src/app/shared/material/numpad/numpad.component.mjs +80 -0
- package/esm2020/src/app/shared/material/numpad/numpad.container.mjs +190 -0
- package/esm2020/src/app/shared/material/numpad/numpad.content.mjs +17 -0
- package/esm2020/src/app/shared/material/numpad/numpad.directive.mjs +162 -0
- package/esm2020/src/app/shared/material/numpad/numpad.dom-service.mjs +37 -0
- package/{esm2015/src/app/shared/material/numpad/numpad.model.js → esm2020/src/app/shared/material/numpad/numpad.model.mjs} +1 -1
- package/esm2020/src/app/shared/material/numpad/numpad.module.mjs +60 -0
- package/esm2020/src/app/shared/material/numpad/testing/numpad.test.mjs +46 -0
- package/esm2020/src/app/shared/material/paginator/material.paginator-i18n.mjs +42 -0
- package/esm2020/src/app/shared/material/stepper/material.stepper-i18n.mjs +22 -0
- package/esm2020/src/app/shared/material/swipe/material.swipe.mjs +334 -0
- package/esm2020/src/app/shared/material/swipe/swipe.module.mjs +51 -0
- package/esm2020/src/app/shared/material/swipe/testing/swipe.test.mjs +65 -0
- package/esm2020/src/app/shared/observables.mjs +96 -0
- package/esm2020/src/app/shared/pipes/arrays.pipe.mjs +135 -0
- package/esm2020/src/app/shared/pipes/colors.pipe.mjs +23 -0
- package/esm2020/src/app/shared/pipes/date-diff-duration.pipe.mjs +49 -0
- package/esm2020/src/app/shared/pipes/date-format.pipe.mjs +42 -0
- package/{esm2015/src/app/shared/pipes/date-from-now.pipe.js → esm2020/src/app/shared/pipes/date-from-now.pipe.mjs} +13 -12
- package/{esm2015/src/app/shared/pipes/duration.pipe.js → esm2020/src/app/shared/pipes/duration.pipe.mjs} +13 -12
- package/esm2020/src/app/shared/pipes/file-size.pipe.mjs +62 -0
- package/esm2020/src/app/shared/pipes/form.pipes.mjs +187 -0
- package/esm2020/src/app/shared/pipes/highlight.pipe.mjs +48 -0
- package/esm2020/src/app/shared/pipes/latlong-format.pipe.mjs +46 -0
- package/esm2020/src/app/shared/pipes/maps.pipe.mjs +63 -0
- package/esm2020/src/app/shared/pipes/math.pipes.mjs +59 -0
- package/esm2020/src/app/shared/pipes/ng-init.pipe.mjs +21 -0
- package/{esm2015/src/app/shared/pipes/number-format.pipe.js → esm2020/src/app/shared/pipes/number-format.pipe.mjs} +14 -9
- package/esm2020/src/app/shared/pipes/pipes.module.mjs +210 -0
- package/esm2020/src/app/shared/pipes/property.pipes.mjs +96 -0
- package/esm2020/src/app/shared/pipes/string.pipes.mjs +69 -0
- package/esm2020/src/app/shared/pipes/translate-context.pipe.mjs +43 -0
- package/esm2020/src/app/shared/platforms.mjs +49 -0
- package/esm2020/src/app/shared/services/entity-service.class.mjs +7 -0
- package/esm2020/src/app/shared/services/job.utils.mjs +92 -0
- package/esm2020/src/app/shared/services/memory-entity-service.class.mjs +331 -0
- package/esm2020/src/app/shared/services/progress-bar.service.mjs +32 -0
- package/esm2020/src/app/shared/services/startable-observable-service.class.mjs +119 -0
- package/esm2020/src/app/shared/services/startable-service.class.mjs +105 -0
- package/esm2020/src/app/shared/services/storage/storage.service.mjs +132 -0
- package/esm2020/src/app/shared/services/storage/storage.utils.mjs +13 -0
- package/esm2020/src/app/shared/services/translate-context.service.mjs +81 -0
- package/esm2020/src/app/shared/services/validator-service.class.mjs +2 -0
- package/esm2020/src/app/shared/services.mjs +62 -0
- package/esm2020/src/app/shared/shared-routing.module.mjs +63 -0
- package/esm2020/src/app/shared/shared.module.mjs +208 -0
- package/esm2020/src/app/shared/shared.testing.module.mjs +76 -0
- package/esm2020/src/app/shared/testing/tests.page.mjs +33 -0
- package/esm2020/src/app/shared/toast/toast.testing.mjs +51 -0
- package/esm2020/src/app/shared/toast/toast.testing.module.mjs +45 -0
- package/esm2020/src/app/shared/toast/toasts.mjs +144 -0
- package/esm2020/src/app/shared/toolbar/modal-toolbar.mjs +58 -0
- package/esm2020/src/app/shared/toolbar/toolbar.mjs +226 -0
- package/esm2020/src/app/shared/toolbar/toolbar.module.mjs +53 -0
- package/{esm2015/src/app/shared/types.js → esm2020/src/app/shared/types.mjs} +0 -0
- package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.mjs +57 -0
- package/esm2020/src/app/shared/upload-file/testing/upload-file.testing.module.mjs +45 -0
- package/esm2020/src/app/shared/upload-file/upload-file-popover.component.mjs +97 -0
- package/esm2020/src/app/shared/upload-file/upload-file.component.mjs +204 -0
- package/esm2020/src/app/shared/upload-file/upload-file.model.mjs +20 -0
- package/esm2020/src/app/shared/validator/form-error-adapter.class.mjs +104 -0
- package/esm2020/src/app/shared/validator/validators.mjs +544 -0
- package/{esm2015/src/app/shared/version/versions.js → esm2020/src/app/shared/version/versions.mjs} +0 -0
- package/esm2020/src/app/social/job/job.model.mjs +26 -0
- package/esm2020/src/app/social/job/job.module.mjs +35 -0
- package/esm2020/src/app/social/job/job.service.mjs +71 -0
- package/esm2020/src/app/social/job/progression/job-progression.icon.mjs +210 -0
- package/esm2020/src/app/social/job/progression/job-progression.list.mjs +22 -0
- package/esm2020/src/app/social/job/testing/job-progression.testing.mjs +53 -0
- package/esm2020/src/app/social/job/testing/job-progression.testing.service.mjs +55 -0
- package/esm2020/src/app/social/job/testing/job.testing.module.mjs +35 -0
- package/esm2020/src/app/social/message/message.form.mjs +81 -0
- package/esm2020/src/app/social/message/message.modal.mjs +93 -0
- package/esm2020/src/app/social/message/message.model.mjs +65 -0
- package/esm2020/src/app/social/message/message.module.mjs +35 -0
- package/esm2020/src/app/social/message/message.service.mjs +84 -0
- package/{esm2015/src/app/social/social.errors.js → esm2020/src/app/social/social.errors.mjs} +0 -0
- package/esm2020/src/app/social/social.module.mjs +47 -0
- package/esm2020/src/app/social/social.testing.module.mjs +51 -0
- package/esm2020/src/app/social/user-event/notification/user-event-notification.icon.mjs +108 -0
- package/esm2020/src/app/social/user-event/notification/user-event-notification.list.mjs +212 -0
- package/esm2020/src/app/social/user-event/testing/user-event.testing.mjs +228 -0
- package/esm2020/src/app/social/user-event/testing/user-event.testing.model.mjs +107 -0
- package/esm2020/src/app/social/user-event/testing/user-event.testing.module.mjs +35 -0
- package/esm2020/src/app/social/user-event/testing/user-event.testing.service.mjs +111 -0
- package/esm2020/src/app/social/user-event/user-event.model.mjs +2 -0
- package/esm2020/src/app/social/user-event/user-event.module.mjs +39 -0
- package/esm2020/src/app/social/user-event/user-event.service.mjs +486 -0
- package/{esm2015/src/app/vendor.js → esm2020/src/app/vendor.mjs} +3 -3
- package/esm2020/src/environments/environment.class.mjs +5 -0
- package/esm2020/src/environments/environment.mjs +86 -0
- package/esm2020/sumaris-net.ngx-components.mjs +5 -0
- package/fesm2015/sumaris-net.ngx-components.mjs +33173 -0
- package/fesm2015/sumaris-net.ngx-components.mjs.map +1 -0
- package/fesm2020/sumaris-net.ngx-components.mjs +32440 -0
- package/fesm2020/sumaris-net.ngx-components.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/package.json +27 -32
- package/public_api.d.ts +29 -31
- package/public_test_api.d.ts +37 -0
- package/resources/README.md +8 -0
- package/src/app/admin/admin-routing.module.d.ts +7 -0
- package/src/app/admin/admin.module.d.ts +7 -0
- package/src/app/admin/services/person.service.d.ts +3 -0
- package/src/app/admin/services/validator/person.validator.d.ts +8 -5
- package/src/app/admin/users/list/users.d.ts +11 -7
- package/src/app/admin/users/list/users.module.d.ts +14 -0
- package/src/app/core/about/modal-about.d.ts +3 -0
- package/src/app/core/account/account.d.ts +11 -8
- package/src/app/core/auth/form/form-auth.d.ts +6 -3
- package/src/app/core/auth/modal/modal-auth.d.ts +3 -0
- package/src/app/core/core.module.d.ts +36 -0
- package/src/app/core/core.testing.module.d.ts +10 -0
- package/src/app/core/form/editor.class.d.ts +6 -1
- package/src/app/core/form/entity-editor-modal.class.d.ts +7 -4
- package/src/app/core/form/entity-editor.class.d.ts +4 -1
- package/src/app/core/form/entity-metadata.component.d.ts +3 -0
- package/src/app/core/form/form-buttons-bar.component.d.ts +3 -0
- package/src/app/core/form/form.class.d.ts +12 -9
- package/src/app/core/form/form.utils.d.ts +5 -5
- package/src/app/core/form/list.form.d.ts +10 -7
- package/src/app/core/form/properties/properties.form.d.ts +43 -0
- package/src/app/core/form/properties/property.validator.d.ts +13 -0
- package/src/app/core/form/properties/testing/properties-form.test.d.ts +19 -0
- package/src/app/core/form/properties/testing/properties-form.testing.module.d.ts +12 -0
- package/src/app/core/graphql/graphql.module.d.ts +5 -0
- package/src/app/core/graphql/graphql.service.d.ts +9 -2
- package/src/app/core/graphql/graphql.utils.d.ts +8 -0
- package/src/app/core/home/home.d.ts +4 -1
- package/src/app/core/icon/icon.component.d.ts +5 -2
- package/src/app/core/icon/icon.module.d.ts +7 -0
- package/src/app/core/install/install-upgrade-card.component.d.ts +5 -2
- package/src/app/core/install/install-upgrade-card.module.d.ts +10 -0
- package/src/app/core/menu/menu.component.d.ts +7 -5
- package/src/app/core/menu/menu.module.d.ts +8 -0
- package/src/app/core/menu/menu.service.d.ts +3 -0
- package/src/app/core/offline/update-offline-mode-card.component.d.ts +3 -0
- package/src/app/core/peer/select-peer.modal.d.ts +7 -4
- package/src/app/core/peer/select-peer.module.d.ts +9 -0
- package/src/app/core/register/confirm/confirm.d.ts +3 -0
- package/src/app/core/register/form/form-register.d.ts +10 -7
- package/src/app/core/register/modal/modal-register.d.ts +3 -0
- package/src/app/core/register/register.module.d.ts +12 -0
- package/src/app/core/services/account.service.d.ts +5 -2
- package/src/app/core/services/auth-guard.service.d.ts +3 -0
- package/src/app/core/services/base-entity-service.class.d.ts +3 -0
- package/src/app/core/services/base-graphql-service.class.d.ts +3 -0
- package/src/app/core/services/config.service.d.ts +4 -1
- package/src/app/core/services/crypto.service.d.ts +3 -0
- package/src/app/core/services/local-settings.service.d.ts +5 -1
- package/src/app/core/services/model/referential.model.d.ts +1 -1
- package/src/app/core/services/network.service.d.ts +6 -5
- package/src/app/core/services/pipes/account.pipes.d.ts +7 -0
- package/src/app/core/services/pipes/department-to-string.pipe.d.ts +4 -0
- package/src/app/core/services/pipes/person-to-string.pipe.d.ts +4 -0
- package/src/app/core/services/pipes/usage-mode.pipes.d.ts +7 -0
- package/src/app/core/services/platform.service.d.ts +22 -21
- package/src/app/core/services/storage/entities-storage.service.d.ts +5 -2
- package/src/app/core/services/storage/entity-store.class.d.ts +3 -3
- package/src/app/core/services/testing/referential.validator.d.ts +8 -5
- package/src/app/core/services/validator/account.validator.d.ts +6 -3
- package/src/app/core/services/validator/base.validator.class.d.ts +8 -5
- package/src/app/core/services/validator/local-settings.validator.d.ts +8 -5
- package/src/app/core/services/validator/user-settings.validator.d.ts +6 -3
- package/src/app/core/settings/settings.page.d.ts +8 -5
- package/src/app/core/table/actions-column.component.d.ts +3 -0
- package/src/app/core/table/entities-table-datasource.class.d.ts +16 -15
- package/src/app/core/table/memory-table.class.d.ts +3 -0
- package/src/app/core/table/table-select-columns.component.d.ts +4 -5
- package/src/app/core/table/table.class.d.ts +52 -34
- package/src/app/core/table/table.utils.d.ts +2 -1
- package/src/app/core/table/testing/table.testing.d.ts +13 -15
- package/src/app/core/table/testing/table.testing.module.d.ts +9 -0
- package/src/app/core/text-popover/testing/text-popover.testing.d.ts +4 -1
- package/src/app/core/text-popover/testing/text-popover.testing.module.d.ts +9 -0
- package/src/app/core/text-popover/text-form.component.d.ts +7 -4
- package/src/app/core/text-popover/text-popover.component.d.ts +3 -0
- package/src/app/shared/alerts.d.ts +4 -4
- package/src/app/shared/audio/audio.d.ts +20 -11
- package/src/app/shared/audio/audio.testing.d.ts +13 -0
- package/src/app/shared/audio/audio.testing.module.d.ts +11 -0
- package/src/app/shared/capacitor/keyboard.d.ts +16 -0
- package/src/app/shared/capacitor/plugins.d.ts +7 -0
- package/src/app/shared/constants.d.ts +1 -0
- package/src/app/shared/debug/debug.component.d.ts +13 -0
- package/src/app/shared/debug/debug.module.d.ts +12 -0
- package/src/app/shared/directives/autofocus.directive.d.ts +9 -7
- package/src/app/shared/directives/autotitle.directive.d.ts +3 -0
- package/src/app/shared/directives/directives.module.d.ts +10 -0
- package/src/app/shared/directives/drag-and-drop.directive.d.ts +3 -0
- package/src/app/shared/directives/ng-var.directive.d.ts +3 -0
- package/src/app/shared/directives/resizable/resizable.component.d.ts +3 -0
- package/src/app/shared/directives/resizable/resizable.directive.d.ts +3 -0
- package/src/app/shared/directives/resizable/resizable.module.d.ts +6 -0
- package/src/app/shared/file/file.service.d.ts +3 -0
- package/src/app/shared/file/file.utils.d.ts +1 -1
- package/src/app/shared/form/field.component.d.ts +12 -3
- package/src/app/shared/form/field.model.d.ts +2 -2
- package/src/app/shared/form/loading-spinner.d.ts +3 -0
- package/src/app/shared/forms.d.ts +13 -13
- package/src/app/shared/gesture/gesture-config.d.ts +3 -0
- package/src/app/shared/gesture/hammer.utils.d.ts +11 -11
- package/src/app/shared/graph/graph-colors.d.ts +8 -7
- package/src/app/shared/guard/component-dirty.guard.d.ts +3 -0
- package/src/app/shared/help/help.modal.d.ts +4 -1
- package/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.d.ts +3 -0
- package/src/app/shared/hotkeys/hotkeys.service.d.ts +4 -1
- package/src/app/shared/hotkeys/shared-hotkeys.module.d.ts +9 -0
- package/src/app/shared/image/gallery/image-gallery.component.d.ts +77 -0
- package/src/app/shared/image/gallery/image-gallery.module.d.ts +12 -0
- package/src/app/shared/image/gallery/testing/gallegry.model.testing.d.ts +12 -0
- package/src/app/shared/image/gallery/testing/gallery.service.testing.d.ts +33 -0
- package/src/app/shared/image/gallery/testing/gallery.testing.d.ts +15 -0
- package/src/app/shared/image/gallery/testing/gallery.testing.module.d.ts +12 -0
- package/src/app/shared/image/image.model.d.ts +5 -0
- package/src/app/shared/image/image.module.d.ts +8 -0
- package/src/app/shared/image/image.service.d.ts +32 -0
- package/src/app/shared/inputs.d.ts +3 -3
- package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +36 -0
- package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +11 -40
- package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +19 -0
- package/src/app/shared/material/autocomplete/material.autocomplete.utils.d.ts +4 -0
- package/src/app/shared/material/autocomplete/testing/autocomplete.test.d.ts +12 -9
- package/src/app/shared/material/badge/badge.directive.d.ts +28 -0
- package/src/app/shared/material/badge/badge.module.d.ts +10 -0
- package/src/app/shared/material/badge/badge.test.d.ts +12 -0
- package/src/app/shared/material/boolean/boolean.module.d.ts +17 -0
- package/src/app/shared/material/boolean/material.boolean.d.ts +7 -4
- package/src/app/shared/material/chips/chips.module.d.ts +19 -0
- package/src/app/shared/material/chips/material.chips.d.ts +11 -8
- package/src/app/shared/material/chips/testing/chips.test.d.ts +8 -5
- package/src/app/shared/material/datetime/datetime.module.d.ts +22 -0
- package/src/app/shared/material/datetime/material.date.d.ts +19 -18
- package/src/app/shared/material/datetime/material.dateshort.d.ts +10 -9
- package/src/app/shared/material/datetime/material.datetime.d.ts +21 -20
- package/src/app/shared/material/datetime/testing/mat-date-time.test.d.ts +11 -9
- package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +11 -9
- package/src/app/shared/material/duration/duration.module.d.ts +16 -0
- package/src/app/shared/material/duration/material.duration.d.ts +8 -5
- package/src/app/shared/material/latlong/material.latlong.d.ts +8 -5
- package/src/app/shared/material/latlong/material.latlong.module.d.ts +17 -0
- package/src/app/shared/material/latlong/testing/latlong.test.d.ts +10 -7
- package/src/app/shared/material/material.module.d.ts +43 -0
- package/src/app/shared/material/material.testing.module.d.ts +19 -0
- package/src/app/shared/material/numpad/numpad.append-to-input.directive.d.ts +3 -0
- package/src/app/shared/material/numpad/numpad.component.d.ts +4 -1
- package/src/app/shared/material/numpad/numpad.container.d.ts +5 -2
- package/src/app/shared/material/numpad/numpad.content.d.ts +3 -0
- package/src/app/shared/material/numpad/numpad.directive.d.ts +4 -1
- package/src/app/shared/material/numpad/numpad.dom-service.d.ts +3 -0
- package/src/app/shared/material/numpad/numpad.model.d.ts +1 -1
- package/src/app/shared/material/numpad/numpad.module.d.ts +14 -0
- package/src/app/shared/material/numpad/testing/numpad.test.d.ts +7 -4
- package/src/app/shared/material/paginator/material.paginator-i18n.d.ts +3 -0
- package/src/app/shared/material/stepper/material.stepper-i18n.d.ts +3 -0
- package/src/app/shared/material/swipe/material.swipe.d.ts +6 -3
- package/src/app/shared/material/swipe/swipe.module.d.ts +13 -0
- package/src/app/shared/material/swipe/testing/swipe.test.d.ts +7 -4
- package/src/app/shared/pipes/arrays.pipe.d.ts +17 -0
- package/src/app/shared/pipes/colors.pipe.d.ts +9 -0
- package/src/app/shared/pipes/date-diff-duration.pipe.d.ts +4 -0
- package/src/app/shared/pipes/date-format.pipe.d.ts +4 -0
- package/src/app/shared/pipes/date-from-now.pipe.d.ts +4 -0
- package/src/app/shared/pipes/duration.pipe.d.ts +4 -0
- package/src/app/shared/pipes/file-size.pipe.d.ts +3 -0
- package/src/app/shared/pipes/form.pipes.d.ts +18 -5
- package/src/app/shared/pipes/highlight.pipe.d.ts +4 -0
- package/src/app/shared/pipes/latlong-format.pipe.d.ts +7 -0
- package/src/app/shared/pipes/maps.pipe.d.ts +10 -0
- package/src/app/shared/pipes/math.pipes.d.ts +10 -0
- package/src/app/shared/pipes/ng-init.pipe.d.ts +3 -0
- package/src/app/shared/pipes/number-format.pipe.d.ts +4 -0
- package/src/app/shared/pipes/pipes.module.d.ts +24 -0
- package/src/app/shared/pipes/property.pipes.d.ts +6 -0
- package/src/app/shared/pipes/string.pipes.d.ts +11 -0
- package/src/app/shared/pipes/translate-context.pipe.d.ts +7 -0
- package/src/app/shared/platforms.d.ts +1 -0
- package/src/app/shared/services/memory-entity-service.class.d.ts +3 -0
- package/src/app/shared/services/progress-bar.service.d.ts +4 -1
- package/src/app/shared/services/startable-observable-service.class.d.ts +1 -1
- package/src/app/shared/services/startable-service.class.d.ts +1 -1
- package/src/app/shared/services/storage/storage.service.d.ts +23 -0
- package/src/app/shared/services/storage/storage.utils.d.ts +19 -0
- package/src/app/shared/services/translate-context.service.d.ts +3 -0
- package/src/app/shared/services/validator-service.class.d.ts +2 -2
- package/src/app/shared/shared-routing.module.d.ts +7 -0
- package/src/app/shared/shared.module.d.ts +23 -0
- package/src/app/shared/shared.testing.module.d.ts +12 -0
- package/src/app/shared/testing/tests.page.d.ts +3 -0
- package/src/app/shared/toast/toast.testing.d.ts +6 -5
- package/src/app/shared/toast/toast.testing.module.d.ts +9 -0
- package/src/app/shared/toast/toasts.d.ts +5 -2
- package/src/app/shared/toolbar/modal-toolbar.d.ts +5 -2
- package/src/app/shared/toolbar/toolbar.d.ts +9 -5
- package/src/app/shared/toolbar/toolbar.module.d.ts +15 -0
- package/src/app/shared/upload-file/testing/upload-file.testing.d.ts +4 -1
- package/src/app/shared/upload-file/testing/upload-file.testing.module.d.ts +9 -0
- package/src/app/shared/upload-file/upload-file-popover.component.d.ts +3 -0
- package/src/app/shared/upload-file/upload-file.component.d.ts +3 -0
- package/src/app/shared/validator/form-error-adapter.class.d.ts +3 -0
- package/src/app/shared/validator/validators.d.ts +9 -9
- package/src/app/social/job/job.module.d.ts +9 -0
- package/src/app/social/job/job.service.d.ts +3 -0
- package/src/app/social/job/progression/job-progression.icon.d.ts +4 -1
- package/src/app/social/job/progression/job-progression.list.d.ts +3 -0
- package/src/app/social/job/testing/job-progression.testing.d.ts +3 -0
- package/src/app/social/job/testing/job-progression.testing.service.d.ts +3 -0
- package/src/app/social/job/testing/job.testing.module.d.ts +9 -0
- package/src/app/social/message/message.form.d.ts +5 -2
- package/src/app/social/message/message.modal.d.ts +5 -2
- package/src/app/social/message/message.module.d.ts +9 -0
- package/src/app/social/message/message.service.d.ts +3 -0
- package/src/app/social/social.module.d.ts +10 -0
- package/src/app/social/social.testing.module.d.ts +9 -0
- package/src/app/social/user-event/notification/user-event-notification.icon.d.ts +4 -1
- package/src/app/social/user-event/notification/user-event-notification.list.d.ts +7 -4
- package/src/app/social/user-event/testing/user-event.testing.d.ts +3 -0
- package/src/app/social/user-event/testing/user-event.testing.model.d.ts +1 -0
- package/src/app/social/user-event/testing/user-event.testing.module.d.ts +9 -0
- package/src/app/social/user-event/testing/user-event.testing.service.d.ts +5 -1
- package/src/app/social/user-event/user-event.model.d.ts +3 -2
- package/src/app/social/user-event/user-event.module.d.ts +10 -0
- package/src/app/social/user-event/user-event.service.d.ts +16 -11
- package/src/assets/audio/beep-notification.mp3 +0 -0
- package/src/assets/i18n/fr.json +9 -2
- package/src/environments/environment.class.d.ts +2 -0
- package/src/environments/environment.d.ts +1 -1
- package/src/theme/_icons.scss +1 -1
- package/src/theme/_material.globals.scss +29 -31
- package/src/theme/_material.scss +32 -6
- package/src/theme/_mixins.scss +4 -4
- package/src/theme/_ngx-components.scss +27 -0
- package/src/theme/_print.scss +24 -0
- package/bundles/sumaris-net.ngx-components.umd.js +0 -35755
- package/bundles/sumaris-net.ngx-components.umd.js.map +0 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js +0 -25
- package/bundles/sumaris-net.ngx-components.umd.min.js.map +0 -1
- package/esm2015/public_api.js +0 -245
- package/esm2015/src/app/admin/admin-routing.module.js +0 -34
- package/esm2015/src/app/admin/admin.module.js +0 -34
- package/esm2015/src/app/admin/services/filter/person.filter.js +0 -59
- package/esm2015/src/app/admin/services/person.service.js +0 -175
- package/esm2015/src/app/admin/services/validator/person.validator.js +0 -37
- package/esm2015/src/app/admin/users/list/users.js +0 -216
- package/esm2015/src/app/core/about/modal-about.js +0 -63
- package/esm2015/src/app/core/account/account.js +0 -240
- package/esm2015/src/app/core/auth/form/form-auth.js +0 -134
- package/esm2015/src/app/core/auth/modal/modal-auth.js +0 -78
- package/esm2015/src/app/core/core.module.js +0 -127
- package/esm2015/src/app/core/core.testing.module.js +0 -51
- package/esm2015/src/app/core/form/editor.class.js +0 -698
- package/esm2015/src/app/core/form/entity-editor-modal.class.js +0 -422
- package/esm2015/src/app/core/form/entity-editor.class.js +0 -676
- package/esm2015/src/app/core/form/entity-metadata.component.js +0 -22
- package/esm2015/src/app/core/form/form-buttons-bar.component.js +0 -63
- package/esm2015/src/app/core/form/form.class.js +0 -342
- package/esm2015/src/app/core/form/form.utils.js +0 -299
- package/esm2015/src/app/core/form/list.form.js +0 -219
- package/esm2015/src/app/core/form/properties.form.js +0 -119
- package/esm2015/src/app/core/graphql/graphql.module.js +0 -18
- package/esm2015/src/app/core/graphql/graphql.service.js +0 -734
- package/esm2015/src/app/core/graphql/graphql.utils.js +0 -106
- package/esm2015/src/app/core/home/home.js +0 -265
- package/esm2015/src/app/core/icon/icon.component.js +0 -32
- package/esm2015/src/app/core/icon/icon.module.js +0 -26
- package/esm2015/src/app/core/install/install-upgrade-card.component.js +0 -358
- package/esm2015/src/app/core/menu/menu.component.js +0 -329
- package/esm2015/src/app/core/menu/menu.module.js +0 -28
- package/esm2015/src/app/core/offline/update-offline-mode-card.component.js +0 -26
- package/esm2015/src/app/core/peer/select-peer.modal.js +0 -134
- package/esm2015/src/app/core/register/confirm/confirm.js +0 -86
- package/esm2015/src/app/core/register/form/form-register.js +0 -172
- package/esm2015/src/app/core/register/modal/modal-register.js +0 -55
- package/esm2015/src/app/core/services/account.service.js +0 -1165
- package/esm2015/src/app/core/services/auth-guard.service.js +0 -77
- package/esm2015/src/app/core/services/base-entity-service.class.js +0 -454
- package/esm2015/src/app/core/services/base-graphql-service.class.js +0 -221
- package/esm2015/src/app/core/services/config.service.js +0 -385
- package/esm2015/src/app/core/services/local-settings.service.js +0 -460
- package/esm2015/src/app/core/services/model/account.model.js +0 -50
- package/esm2015/src/app/core/services/model/config.model.js +0 -89
- package/esm2015/src/app/core/services/model/department.model.js +0 -30
- package/esm2015/src/app/core/services/model/entity.decorators.js +0 -104
- package/esm2015/src/app/core/services/model/entity.model.js +0 -245
- package/esm2015/src/app/core/services/model/peer.model.js +0 -68
- package/esm2015/src/app/core/services/model/person.model.js +0 -83
- package/esm2015/src/app/core/services/model/referential.model.js +0 -147
- package/esm2015/src/app/core/services/model/settings.model.js +0 -75
- package/esm2015/src/app/core/services/network.service.js +0 -631
- package/esm2015/src/app/core/services/network.utils.js +0 -19
- package/esm2015/src/app/core/services/pipes/account.pipes.js +0 -28
- package/esm2015/src/app/core/services/pipes/department-to-string.pipe.js +0 -18
- package/esm2015/src/app/core/services/pipes/person-to-string.pipe.js +0 -18
- package/esm2015/src/app/core/services/pipes/usage-mode.pipes.js +0 -27
- package/esm2015/src/app/core/services/platform.service.js +0 -549
- package/esm2015/src/app/core/services/storage/entities-storage.service.js +0 -452
- package/esm2015/src/app/core/services/storage/entity-store.class.js +0 -461
- package/esm2015/src/app/core/services/testing/referential-filter.model.js +0 -23
- package/esm2015/src/app/core/services/testing/referential.validator.js +0 -44
- package/esm2015/src/app/core/services/validator/account.validator.js +0 -55
- package/esm2015/src/app/core/services/validator/base.validator.class.js +0 -48
- package/esm2015/src/app/core/services/validator/local-settings.validator.js +0 -72
- package/esm2015/src/app/core/services/validator/user-settings.validator.js +0 -30
- package/esm2015/src/app/core/settings/settings.page.js +0 -305
- package/esm2015/src/app/core/table/actions-column.component.js +0 -74
- package/esm2015/src/app/core/table/entities-table-datasource.class.js +0 -405
- package/esm2015/src/app/core/table/memory-table.class.js +0 -59
- package/esm2015/src/app/core/table/table-select-columns.component.js +0 -44
- package/esm2015/src/app/core/table/table.class.js +0 -1677
- package/esm2015/src/app/core/table/table.utils.js +0 -13
- package/esm2015/src/app/core/table/testing/table.testing.js +0 -242
- package/esm2015/src/app/core/table/testing/table.testing.module.js +0 -26
- package/esm2015/src/app/core/text-popover/testing/text-popover.testing.js +0 -37
- package/esm2015/src/app/core/text-popover/testing/text-popover.testing.module.js +0 -33
- package/esm2015/src/app/core/text-popover/text-form.component.js +0 -72
- package/esm2015/src/app/core/text-popover/text-popover.component.js +0 -90
- package/esm2015/src/app/shared/alerts.js +0 -251
- package/esm2015/src/app/shared/audio/audio.js +0 -178
- package/esm2015/src/app/shared/dates.js +0 -134
- package/esm2015/src/app/shared/directives/autofocus.directive.js +0 -90
- package/esm2015/src/app/shared/directives/autotitle.directive.js +0 -27
- package/esm2015/src/app/shared/directives/directives.module.js +0 -30
- package/esm2015/src/app/shared/directives/drag-and-drop.directive.js +0 -43
- package/esm2015/src/app/shared/directives/ng-var.directive.js +0 -32
- package/esm2015/src/app/shared/directives/resizable/resizable.component.js +0 -54
- package/esm2015/src/app/shared/directives/resizable/resizable.directive.js +0 -34
- package/esm2015/src/app/shared/directives/resizable/resizable.module.js +0 -12
- package/esm2015/src/app/shared/events.js +0 -61
- package/esm2015/src/app/shared/file/csv.utils.js +0 -70
- package/esm2015/src/app/shared/file/file.service.js +0 -120
- package/esm2015/src/app/shared/file/file.utils.js +0 -116
- package/esm2015/src/app/shared/file/images.utils.js +0 -166
- package/esm2015/src/app/shared/form/field.component.js +0 -206
- package/esm2015/src/app/shared/form/loading-spinner.js +0 -24
- package/esm2015/src/app/shared/forms.js +0 -358
- package/esm2015/src/app/shared/functions.js +0 -431
- package/esm2015/src/app/shared/gesture/hammer.utils.js +0 -2
- package/esm2015/src/app/shared/graph/graph-colors.js +0 -205
- package/esm2015/src/app/shared/guard/component-dirty.guard.js +0 -61
- package/esm2015/src/app/shared/help/help.modal.js +0 -56
- package/esm2015/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.js +0 -20
- package/esm2015/src/app/shared/hotkeys/hotkeys.service.js +0 -91
- package/esm2015/src/app/shared/hotkeys/shared-hotkeys.module.js +0 -29
- package/esm2015/src/app/shared/http/http.utils.js +0 -57
- package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.js +0 -825
- package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.module.js +0 -46
- package/esm2015/src/app/shared/material/autocomplete/testing/autocomplete.test.js +0 -200
- package/esm2015/src/app/shared/material/badge/badge-icon.directive.js +0 -135
- package/esm2015/src/app/shared/material/badge/badge-icon.module.js +0 -23
- package/esm2015/src/app/shared/material/badge/badge-icon.test.js +0 -17
- package/esm2015/src/app/shared/material/boolean/boolean.module.js +0 -41
- package/esm2015/src/app/shared/material/boolean/material.boolean.js +0 -223
- package/esm2015/src/app/shared/material/chips/chips.module.js +0 -45
- package/esm2015/src/app/shared/material/chips/material.chips.js +0 -636
- package/esm2015/src/app/shared/material/chips/testing/chips.test.js +0 -138
- package/esm2015/src/app/shared/material/datetime/datetime.module.js +0 -54
- package/esm2015/src/app/shared/material/datetime/material.date.js +0 -375
- package/esm2015/src/app/shared/material/datetime/material.dateshort.js +0 -316
- package/esm2015/src/app/shared/material/datetime/material.datetime.js +0 -398
- package/esm2015/src/app/shared/material/datetime/testing/mat-date-time.test.js +0 -110
- package/esm2015/src/app/shared/material/datetime/testing/mat-date.test.js +0 -108
- package/esm2015/src/app/shared/material/duration/duration.module.js +0 -40
- package/esm2015/src/app/shared/material/duration/material.duration.js +0 -246
- package/esm2015/src/app/shared/material/latlong/latlong.utils.js +0 -249
- package/esm2015/src/app/shared/material/latlong/material.latlong.js +0 -350
- package/esm2015/src/app/shared/material/latlong/material.latlong.module.js +0 -41
- package/esm2015/src/app/shared/material/latlong/testing/latlong.test.js +0 -70
- package/esm2015/src/app/shared/material/material.module.js +0 -93
- package/esm2015/src/app/shared/material/material.testing.module.js +0 -111
- package/esm2015/src/app/shared/material/numpad/numpad.append-to-input.directive.js +0 -96
- package/esm2015/src/app/shared/material/numpad/numpad.component.js +0 -73
- package/esm2015/src/app/shared/material/numpad/numpad.container.js +0 -149
- package/esm2015/src/app/shared/material/numpad/numpad.content.js +0 -14
- package/esm2015/src/app/shared/material/numpad/numpad.directive.js +0 -148
- package/esm2015/src/app/shared/material/numpad/numpad.dom-service.js +0 -37
- package/esm2015/src/app/shared/material/numpad/numpad.module.js +0 -39
- package/esm2015/src/app/shared/material/numpad/testing/numpad.test.js +0 -44
- package/esm2015/src/app/shared/material/paginator/material.paginator-i18n.js +0 -44
- package/esm2015/src/app/shared/material/stepper/material.stepper-i18n.js +0 -24
- package/esm2015/src/app/shared/material/swipe/material.swipe.js +0 -308
- package/esm2015/src/app/shared/material/swipe/swipe.module.js +0 -33
- package/esm2015/src/app/shared/material/swipe/testing/swipe.test.js +0 -68
- package/esm2015/src/app/shared/observables.js +0 -99
- package/esm2015/src/app/shared/pipes/arrays.pipe.js +0 -110
- package/esm2015/src/app/shared/pipes/date-diff-duration.pipe.js +0 -50
- package/esm2015/src/app/shared/pipes/date-format.pipe.js +0 -43
- package/esm2015/src/app/shared/pipes/file-size.pipe.js +0 -58
- package/esm2015/src/app/shared/pipes/form.pipes.js +0 -177
- package/esm2015/src/app/shared/pipes/highlight.pipe.js +0 -43
- package/esm2015/src/app/shared/pipes/latlong-format.pipe.js +0 -36
- package/esm2015/src/app/shared/pipes/maps.pipe.js +0 -48
- package/esm2015/src/app/shared/pipes/math.pipes.js +0 -44
- package/esm2015/src/app/shared/pipes/ng-init.pipe.js +0 -18
- package/esm2015/src/app/shared/pipes/pipes.module.js +0 -117
- package/esm2015/src/app/shared/pipes/property.pipes.js +0 -98
- package/esm2015/src/app/shared/pipes/string.pipes.js +0 -53
- package/esm2015/src/app/shared/pipes/translate-context.pipe.js +0 -36
- package/esm2015/src/app/shared/platforms.js +0 -45
- package/esm2015/src/app/shared/services/entity-service.class.js +0 -8
- package/esm2015/src/app/shared/services/job.utils.js +0 -96
- package/esm2015/src/app/shared/services/memory-entity-service.class.js +0 -342
- package/esm2015/src/app/shared/services/progress-bar.service.js +0 -30
- package/esm2015/src/app/shared/services/startable-observable-service.class.js +0 -124
- package/esm2015/src/app/shared/services/startable-service.class.js +0 -110
- package/esm2015/src/app/shared/services/storage.utils.js +0 -41
- package/esm2015/src/app/shared/services/translate-context.service.js +0 -83
- package/esm2015/src/app/shared/services/validator-service.class.js +0 -2
- package/esm2015/src/app/shared/services.js +0 -61
- package/esm2015/src/app/shared/shared-routing.module.js +0 -54
- package/esm2015/src/app/shared/shared.module.js +0 -135
- package/esm2015/src/app/shared/shared.testing.module.js +0 -33
- package/esm2015/src/app/shared/testing/tests.page.js +0 -34
- package/esm2015/src/app/shared/toast/toast.testing.js +0 -39
- package/esm2015/src/app/shared/toast/toast.testing.module.js +0 -33
- package/esm2015/src/app/shared/toast/toasts.js +0 -119
- package/esm2015/src/app/shared/toolbar/modal-toolbar.js +0 -53
- package/esm2015/src/app/shared/toolbar/toolbar.js +0 -213
- package/esm2015/src/app/shared/upload-file/testing/upload-file.testing.js +0 -59
- package/esm2015/src/app/shared/upload-file/testing/upload-file.testing.module.js +0 -33
- package/esm2015/src/app/shared/upload-file/upload-file-popover.component.js +0 -98
- package/esm2015/src/app/shared/upload-file/upload-file.component.js +0 -202
- package/esm2015/src/app/shared/upload-file/upload-file.model.js +0 -20
- package/esm2015/src/app/shared/validator/form-error-adapter.class.js +0 -99
- package/esm2015/src/app/shared/validator/validators.js +0 -537
- package/esm2015/src/app/social/job/job.model.js +0 -26
- package/esm2015/src/app/social/job/job.module.js +0 -25
- package/esm2015/src/app/social/job/job.service.js +0 -66
- package/esm2015/src/app/social/job/progression/job-progression.icon.js +0 -208
- package/esm2015/src/app/social/job/progression/job-progression.list.js +0 -20
- package/esm2015/src/app/social/job/testing/job-progression.testing.js +0 -49
- package/esm2015/src/app/social/job/testing/job-progression.testing.service.js +0 -52
- package/esm2015/src/app/social/job/testing/job.testing.module.js +0 -25
- package/esm2015/src/app/social/message/message.form.js +0 -73
- package/esm2015/src/app/social/message/message.modal.js +0 -96
- package/esm2015/src/app/social/message/message.model.js +0 -65
- package/esm2015/src/app/social/message/message.module.js +0 -25
- package/esm2015/src/app/social/message/message.service.js +0 -87
- package/esm2015/src/app/social/social.module.js +0 -28
- package/esm2015/src/app/social/social.testing.module.js +0 -39
- package/esm2015/src/app/social/user-event/notification/user-event-notification.icon.js +0 -106
- package/esm2015/src/app/social/user-event/notification/user-event-notification.list.js +0 -203
- package/esm2015/src/app/social/user-event/testing/user-event.testing.js +0 -230
- package/esm2015/src/app/social/user-event/testing/user-event.testing.model.js +0 -103
- package/esm2015/src/app/social/user-event/testing/user-event.testing.module.js +0 -25
- package/esm2015/src/app/social/user-event/testing/user-event.testing.service.js +0 -117
- package/esm2015/src/app/social/user-event/user-event.model.js +0 -2
- package/esm2015/src/app/social/user-event/user-event.module.js +0 -27
- package/esm2015/src/app/social/user-event/user-event.service.js +0 -509
- package/esm2015/src/environments/environment.class.js +0 -5
- package/esm2015/src/environments/environment.js +0 -81
- package/esm2015/sumaris-net.ngx-components.js +0 -21
- package/fesm2015/sumaris-net.ngx-components.js +0 -30297
- package/fesm2015/sumaris-net.ngx-components.js.map +0 -1
- package/src/app/core/form/properties.form.d.ts +0 -40
- package/src/app/shared/material/badge/badge-icon.directive.d.ts +0 -28
- package/src/app/shared/material/badge/badge-icon.module.d.ts +0 -2
- package/src/app/shared/material/badge/badge-icon.test.d.ts +0 -9
- package/src/app/shared/services/storage.utils.d.ts +0 -13
- package/sumaris-net.ngx-components.d.ts +0 -20
- package/sumaris-net.ngx-components.metadata.json +0 -1
|
@@ -1,698 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { Directive, EventEmitter, Input, Optional, Output, ViewChild } from '@angular/core';
|
|
3
|
-
import { ActivatedRoute, Router } from '@angular/router';
|
|
4
|
-
import { AlertController, IonContent } from '@ionic/angular';
|
|
5
|
-
import { TranslateService } from '@ngx-translate/core';
|
|
6
|
-
import { BehaviorSubject, Subject, Subscription } from 'rxjs';
|
|
7
|
-
import { AppTable } from '../table/table.class';
|
|
8
|
-
import { AppForm } from './form.class';
|
|
9
|
-
import { FormButtonsBarToken } from './form-buttons-bar.component';
|
|
10
|
-
import { AppFormProvider, AppFormUtils } from './form.utils';
|
|
11
|
-
import { Toasts } from '../../shared/toast/toasts';
|
|
12
|
-
import { ToolbarToken } from '../../shared/toolbar/toolbar';
|
|
13
|
-
import { isNotNil, toNumber } from '../../shared/functions';
|
|
14
|
-
import { AbstractControl } from '@angular/forms';
|
|
15
|
-
import { waitForFalse, waitForTrue } from '../../shared/observables';
|
|
16
|
-
export class AppTabEditorOptions {
|
|
17
|
-
}
|
|
18
|
-
// eslint-disable-next-line @angular-eslint/directive-class-suffix
|
|
19
|
-
export class AppEditor {
|
|
20
|
-
constructor(route, router, alertCtrl, translate) {
|
|
21
|
-
this.route = route;
|
|
22
|
-
this.router = router;
|
|
23
|
-
this.alertCtrl = alertCtrl;
|
|
24
|
-
this.translate = translate;
|
|
25
|
-
this._subscription = new Subscription();
|
|
26
|
-
this._enabled = false;
|
|
27
|
-
this.destroySubject = new Subject();
|
|
28
|
-
this.readySubject = new BehaviorSubject(false);
|
|
29
|
-
this.dirtySubject = new BehaviorSubject(false);
|
|
30
|
-
this.loadingSubject = new BehaviorSubject(true);
|
|
31
|
-
this.errorSubject = new BehaviorSubject(undefined);
|
|
32
|
-
this.savingSubject = new BehaviorSubject(false);
|
|
33
|
-
this.touchedSubject = new BehaviorSubject(false);
|
|
34
|
-
this.debug = false;
|
|
35
|
-
this.submitted = false;
|
|
36
|
-
this.toolbar = null;
|
|
37
|
-
this.formButtonsBar = null;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* @deprecated
|
|
41
|
-
*/
|
|
42
|
-
set _loading(value) {
|
|
43
|
-
this.loadingSubject.next(value);
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* @deprecated
|
|
47
|
-
*/
|
|
48
|
-
get _loading() {
|
|
49
|
-
return this.loadingSubject.value;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* @deprecated
|
|
53
|
-
*/
|
|
54
|
-
get _$ready() {
|
|
55
|
-
return this.readySubject;
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* @deprecated
|
|
59
|
-
*/
|
|
60
|
-
get _$loading() {
|
|
61
|
-
return this.loadingSubject;
|
|
62
|
-
}
|
|
63
|
-
get error() {
|
|
64
|
-
return this.errorSubject.value;
|
|
65
|
-
}
|
|
66
|
-
set error(error) {
|
|
67
|
-
this.setError(error);
|
|
68
|
-
}
|
|
69
|
-
get saving() {
|
|
70
|
-
var _a;
|
|
71
|
-
return this.savingSubject.value || ((_a = this.editors) === null || _a === void 0 ? void 0 : _a.some(e => e.saving));
|
|
72
|
-
}
|
|
73
|
-
get tables() {
|
|
74
|
-
return this._children && this._children.filter(c => c instanceof AppTable);
|
|
75
|
-
}
|
|
76
|
-
get forms() {
|
|
77
|
-
return this._children && this._children.filter(c => c instanceof AppForm);
|
|
78
|
-
}
|
|
79
|
-
get editors() {
|
|
80
|
-
return this._children && this._children.filter(c => c instanceof AppEditor);
|
|
81
|
-
}
|
|
82
|
-
get dirty() {
|
|
83
|
-
return this.dirtySubject.value || (this._children && this._children.findIndex(c => c.enabled && c.dirty) !== -1) || false;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Is valid (tables and forms)
|
|
87
|
-
*/
|
|
88
|
-
get valid() {
|
|
89
|
-
// Important: Should be not invalid AND not pending, so use '!valid' (DO NOT use 'invalid')
|
|
90
|
-
return !this._children || this._children.findIndex(c => c.enabled && !c.valid) === -1;
|
|
91
|
-
}
|
|
92
|
-
get invalid() {
|
|
93
|
-
return (this._children && this._children.findIndex(c => c.enabled && c.invalid) !== -1) || false;
|
|
94
|
-
}
|
|
95
|
-
get pending() {
|
|
96
|
-
return (this._children && this._children.findIndex(c => c.enabled && c.pending) !== -1) || false;
|
|
97
|
-
}
|
|
98
|
-
get loading() {
|
|
99
|
-
return this.loadingSubject.value || (this._children && this._children.findIndex(c => c.enabled && c.loading) !== -1) || false;
|
|
100
|
-
}
|
|
101
|
-
get loaded() {
|
|
102
|
-
return !this.loadingSubject.value && (!this._children || this._children.findIndex(c => c.enabled && c.loading) === -1) || false;
|
|
103
|
-
}
|
|
104
|
-
get touched() {
|
|
105
|
-
return this.touchedSubject.value || (this._children && this._children.findIndex(c => c.enabled && c.touched) !== -1) || false;
|
|
106
|
-
}
|
|
107
|
-
get untouched() {
|
|
108
|
-
return !this.touchedSubject.value && (!this._children || this._children.findIndex(c => c.enabled && c.touched) === -1) || false;
|
|
109
|
-
}
|
|
110
|
-
get enabled() {
|
|
111
|
-
return this._enabled;
|
|
112
|
-
}
|
|
113
|
-
get disabled() {
|
|
114
|
-
return !this._enabled;
|
|
115
|
-
}
|
|
116
|
-
get children() {
|
|
117
|
-
return this._children;
|
|
118
|
-
}
|
|
119
|
-
get empty() {
|
|
120
|
-
return !this._enabled;
|
|
121
|
-
}
|
|
122
|
-
ngOnInit() {
|
|
123
|
-
if (this.formButtonsBar) {
|
|
124
|
-
this.registerSubscription(this.formButtonsBar.onBack.subscribe(event => this.goBack(event)));
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
ngAfterViewInit() {
|
|
128
|
-
// Can be overridden by subclasses
|
|
129
|
-
}
|
|
130
|
-
ngOnDestroy() {
|
|
131
|
-
this._subscription.unsubscribe();
|
|
132
|
-
this.readySubject.unsubscribe();
|
|
133
|
-
this.loadingSubject.unsubscribe();
|
|
134
|
-
this.errorSubject.unsubscribe();
|
|
135
|
-
this.destroySubject.next();
|
|
136
|
-
this.destroySubject.unsubscribe();
|
|
137
|
-
}
|
|
138
|
-
addChildForm(form) {
|
|
139
|
-
if (!form)
|
|
140
|
-
throw new Error('Trying to register an undefined child form');
|
|
141
|
-
this._children = this._children || [];
|
|
142
|
-
if (typeof form === 'function') {
|
|
143
|
-
this._children.push(new AppFormProvider(form));
|
|
144
|
-
}
|
|
145
|
-
else {
|
|
146
|
-
this._children.push(form);
|
|
147
|
-
}
|
|
148
|
-
return this;
|
|
149
|
-
}
|
|
150
|
-
addChildForms(forms) {
|
|
151
|
-
(forms || []).forEach(form => this.addChildForm(form));
|
|
152
|
-
}
|
|
153
|
-
removeChildForm(form) {
|
|
154
|
-
if (!form)
|
|
155
|
-
throw new Error('Trying to remove an undefined child form');
|
|
156
|
-
const index = (this._children || []).findIndex(c => c === form);
|
|
157
|
-
if (index !== -1) {
|
|
158
|
-
return this._children.splice(index, 1)[0];
|
|
159
|
-
}
|
|
160
|
-
return undefined;
|
|
161
|
-
}
|
|
162
|
-
disable(opts) {
|
|
163
|
-
var _a;
|
|
164
|
-
this._enabled = false;
|
|
165
|
-
(_a = this._children) === null || _a === void 0 ? void 0 : _a.forEach(c => c.disable(opts));
|
|
166
|
-
if (!this.loading && (!opts || opts.emitEvent !== false))
|
|
167
|
-
this.markForCheck();
|
|
168
|
-
}
|
|
169
|
-
enable(opts) {
|
|
170
|
-
var _a;
|
|
171
|
-
this._enabled = true;
|
|
172
|
-
(_a = this._children) === null || _a === void 0 ? void 0 : _a.forEach(c => c.enable(opts));
|
|
173
|
-
if (!this.loading && (!opts || opts.emitEvent !== false))
|
|
174
|
-
this.markForCheck();
|
|
175
|
-
}
|
|
176
|
-
markAsPristine(opts) {
|
|
177
|
-
var _a;
|
|
178
|
-
this.error = null;
|
|
179
|
-
this.submitted = false;
|
|
180
|
-
if (this.dirtySubject.value !== false) {
|
|
181
|
-
this.dirtySubject.next(false);
|
|
182
|
-
}
|
|
183
|
-
(_a = this._children) === null || _a === void 0 ? void 0 : _a.forEach(c => c.markAsPristine(opts));
|
|
184
|
-
if (!this.loading && (!opts || opts.emitEvent !== false))
|
|
185
|
-
this.markForCheck();
|
|
186
|
-
}
|
|
187
|
-
markAsUntouched(opts) {
|
|
188
|
-
var _a;
|
|
189
|
-
if (this.touchedSubject.value !== false) {
|
|
190
|
-
this.touchedSubject.next(false);
|
|
191
|
-
}
|
|
192
|
-
(_a = this._children) === null || _a === void 0 ? void 0 : _a.forEach(c => c.markAsUntouched());
|
|
193
|
-
if (!this.loading && (!opts || opts.emitEvent !== false))
|
|
194
|
-
this.markForCheck();
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* @deprecated prefer to use markAllAsTouched()
|
|
198
|
-
* @param opts
|
|
199
|
-
*/
|
|
200
|
-
markAsTouched(opts) {
|
|
201
|
-
var _a;
|
|
202
|
-
if (!this.touchedSubject.value !== true) {
|
|
203
|
-
this.touchedSubject.next(true);
|
|
204
|
-
}
|
|
205
|
-
(_a = this._children) === null || _a === void 0 ? void 0 : _a.forEach(c => c.markAsTouched(opts));
|
|
206
|
-
if (!this.loading && (!opts || opts.emitEvent !== false))
|
|
207
|
-
this.markForCheck();
|
|
208
|
-
}
|
|
209
|
-
markAllAsTouched(opts) {
|
|
210
|
-
var _a;
|
|
211
|
-
if (this.touchedSubject.value !== true) {
|
|
212
|
-
this.touchedSubject.next(true);
|
|
213
|
-
}
|
|
214
|
-
(_a = this._children) === null || _a === void 0 ? void 0 : _a.forEach(c => c.markAllAsTouched(opts));
|
|
215
|
-
if (!this.loading && (!opts || opts.emitEvent !== false))
|
|
216
|
-
this.markForCheck();
|
|
217
|
-
}
|
|
218
|
-
markAsDirty(opts) {
|
|
219
|
-
if (!this.dirtySubject.value) {
|
|
220
|
-
this.dirtySubject.next(true);
|
|
221
|
-
if (!this.loading && (!opts || opts.emitEvent !== false))
|
|
222
|
-
this.markForCheck();
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
markAsLoading(opts) {
|
|
226
|
-
if (!this.loadingSubject.value) {
|
|
227
|
-
this.loadingSubject.next(true);
|
|
228
|
-
if (!opts || opts.emitEvent !== false)
|
|
229
|
-
this.markForCheck();
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
markAsLoaded(opts) {
|
|
233
|
-
var _a, _b;
|
|
234
|
-
if (this.loadingSubject.value) {
|
|
235
|
-
this.loadingSubject.next(false);
|
|
236
|
-
if (!opts || opts.onlySelf !== true) {
|
|
237
|
-
// Emit to children forms and editors
|
|
238
|
-
// note: tables should be changed by parent
|
|
239
|
-
(_a = this.forms) === null || _a === void 0 ? void 0 : _a.forEach(f => f.markAsLoaded(opts));
|
|
240
|
-
(_b = this.editors) === null || _b === void 0 ? void 0 : _b.forEach(e => e.markAsLoaded(opts));
|
|
241
|
-
}
|
|
242
|
-
if (!opts || opts.emitEvent !== false) {
|
|
243
|
-
this.markForCheck();
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
markAsReady(opts) {
|
|
248
|
-
var _a;
|
|
249
|
-
(_a = this._children) === null || _a === void 0 ? void 0 : _a.forEach(c => c.markAsReady(opts));
|
|
250
|
-
this.readySubject.next(true);
|
|
251
|
-
}
|
|
252
|
-
ready(opts) {
|
|
253
|
-
if (this.readySubject.value)
|
|
254
|
-
return Promise.resolve();
|
|
255
|
-
return waitForTrue(this.readySubject, opts);
|
|
256
|
-
}
|
|
257
|
-
waitIdle(opts) {
|
|
258
|
-
if (!this.loadingSubject.value)
|
|
259
|
-
return Promise.resolve();
|
|
260
|
-
return waitForFalse(this.loadingSubject, opts);
|
|
261
|
-
}
|
|
262
|
-
markAsSaving(opts) {
|
|
263
|
-
if (this.savingSubject.value !== true) {
|
|
264
|
-
this.savingSubject.next(true);
|
|
265
|
-
if (!opts || opts.emitEvent !== false)
|
|
266
|
-
this.markForCheck();
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
markAsSaved(opts) {
|
|
270
|
-
if (this.savingSubject.value !== false) {
|
|
271
|
-
this.savingSubject.next(false);
|
|
272
|
-
if (!opts || opts.emitEvent !== false)
|
|
273
|
-
this.markForCheck();
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
cancel(event) {
|
|
277
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
278
|
-
if (this.isNewData) {
|
|
279
|
-
yield this.unload(); // async reset
|
|
280
|
-
}
|
|
281
|
-
else if (this.dirty) {
|
|
282
|
-
yield this.reload(); // async reload
|
|
283
|
-
}
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* Unload the page (remove all data). Useful when reusing angular cache a cancelled page
|
|
288
|
-
*
|
|
289
|
-
* @param opts
|
|
290
|
-
*/
|
|
291
|
-
unload(opts) {
|
|
292
|
-
var _a;
|
|
293
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
294
|
-
console.debug('[editor] Unloading data...');
|
|
295
|
-
this.markAsLoading();
|
|
296
|
-
(_a = this._children) === null || _a === void 0 ? void 0 : _a.forEach(f => {
|
|
297
|
-
if (f instanceof AppForm) {
|
|
298
|
-
f.reset(null, opts);
|
|
299
|
-
}
|
|
300
|
-
else if (f instanceof AppTable) {
|
|
301
|
-
f.dataSource.disconnect();
|
|
302
|
-
}
|
|
303
|
-
else if (f instanceof AppEditor) {
|
|
304
|
-
f.unload(opts);
|
|
305
|
-
}
|
|
306
|
-
});
|
|
307
|
-
this.markAsPristine(opts);
|
|
308
|
-
this.markAsSaved(opts);
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
reloadWithConfirmation(confirm) {
|
|
312
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
313
|
-
const needConfirm = this.dirty;
|
|
314
|
-
// if not confirm yet: ask confirmation
|
|
315
|
-
if (!confirm && needConfirm) {
|
|
316
|
-
const translations = this.translate.instant(['COMMON.BTN_ABORT_CHANGES', 'COMMON.BTN_CANCEL', 'CONFIRM.CANCEL_CHANGES', 'CONFIRM.ALERT_HEADER']);
|
|
317
|
-
const alert = yield this.alertCtrl.create({
|
|
318
|
-
header: translations['CONFIRM.ALERT_HEADER'],
|
|
319
|
-
message: translations['CONFIRM.CANCEL_CHANGES'],
|
|
320
|
-
buttons: [
|
|
321
|
-
{
|
|
322
|
-
text: translations['COMMON.BTN_ABORT_CHANGES'],
|
|
323
|
-
cssClass: 'secondary',
|
|
324
|
-
handler: () => {
|
|
325
|
-
confirm = true; // update upper value
|
|
326
|
-
}
|
|
327
|
-
},
|
|
328
|
-
{
|
|
329
|
-
text: translations['COMMON.BTN_CANCEL'],
|
|
330
|
-
role: 'cancel',
|
|
331
|
-
handler: () => {
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
]
|
|
335
|
-
});
|
|
336
|
-
yield alert.present();
|
|
337
|
-
yield alert.onDidDismiss();
|
|
338
|
-
}
|
|
339
|
-
// If confirm: execute the reload
|
|
340
|
-
if (confirm || !needConfirm) {
|
|
341
|
-
this.scrollToTop();
|
|
342
|
-
this.disable();
|
|
343
|
-
return yield this.reload();
|
|
344
|
-
}
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
goBack(event) {
|
|
348
|
-
var _a;
|
|
349
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
350
|
-
// Go back
|
|
351
|
-
if ((_a = this.toolbar) === null || _a === void 0 ? void 0 : _a.canGoBack) {
|
|
352
|
-
return this.toolbar.goBack();
|
|
353
|
-
}
|
|
354
|
-
else {
|
|
355
|
-
// Back to home
|
|
356
|
-
return this.router.navigateByUrl('/');
|
|
357
|
-
}
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
logFormErrors(prefix) {
|
|
361
|
-
var _a;
|
|
362
|
-
if (this.debug)
|
|
363
|
-
console.debug('[editor] Editor not valid. Checking where (forms, tables)...');
|
|
364
|
-
(_a = this._children) === null || _a === void 0 ? void 0 : _a.forEach(c => this.logChildrenErrors(c, prefix));
|
|
365
|
-
}
|
|
366
|
-
/* -- protected methods -- */
|
|
367
|
-
scrollToTop(duration) {
|
|
368
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
369
|
-
duration = toNumber(duration, 500);
|
|
370
|
-
if (!this.content) {
|
|
371
|
-
console.warn(`[tab-editor] Cannot scroll to top. (no 'ion-content' tag found ${this.constructor.name}`);
|
|
372
|
-
// TODO: FIXME (not working as the page is not the window)
|
|
373
|
-
const scrollToTop = window.setInterval(() => {
|
|
374
|
-
const pos = window.pageYOffset;
|
|
375
|
-
if (pos > 0) {
|
|
376
|
-
window.scrollTo(0, pos - 20); // how far to scroll on each step
|
|
377
|
-
}
|
|
378
|
-
else {
|
|
379
|
-
window.clearInterval(scrollToTop);
|
|
380
|
-
}
|
|
381
|
-
}, 16);
|
|
382
|
-
return;
|
|
383
|
-
}
|
|
384
|
-
return this.content.scrollToTop(duration);
|
|
385
|
-
});
|
|
386
|
-
}
|
|
387
|
-
registerSubscription(sub) {
|
|
388
|
-
this._subscription.add(sub);
|
|
389
|
-
}
|
|
390
|
-
unregisterSubscription(sub) {
|
|
391
|
-
this._subscription.remove(sub);
|
|
392
|
-
}
|
|
393
|
-
saveIfDirtyAndConfirm(event, opts) {
|
|
394
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
395
|
-
if (!this.dirty)
|
|
396
|
-
return true;
|
|
397
|
-
let confirmed = (opts === null || opts === void 0 ? void 0 : opts.confirmed) || false;
|
|
398
|
-
if (!confirmed) {
|
|
399
|
-
let cancel = false;
|
|
400
|
-
const translations = this.translate.instant(['COMMON.BTN_SAVE', 'COMMON.BTN_CANCEL', 'COMMON.BTN_ABORT_CHANGES', 'CONFIRM.SAVE', 'CONFIRM.ALERT_HEADER']);
|
|
401
|
-
const alert = yield this.alertCtrl.create({
|
|
402
|
-
header: translations['CONFIRM.ALERT_HEADER'],
|
|
403
|
-
message: translations['CONFIRM.SAVE'],
|
|
404
|
-
buttons: [
|
|
405
|
-
{
|
|
406
|
-
text: translations['COMMON.BTN_CANCEL'],
|
|
407
|
-
role: 'cancel',
|
|
408
|
-
cssClass: 'secondary',
|
|
409
|
-
handler: () => {
|
|
410
|
-
cancel = true;
|
|
411
|
-
}
|
|
412
|
-
},
|
|
413
|
-
{
|
|
414
|
-
text: translations['COMMON.BTN_ABORT_CHANGES'],
|
|
415
|
-
cssClass: 'secondary',
|
|
416
|
-
handler: () => {
|
|
417
|
-
}
|
|
418
|
-
},
|
|
419
|
-
{
|
|
420
|
-
text: translations['COMMON.BTN_SAVE'],
|
|
421
|
-
handler: () => {
|
|
422
|
-
confirmed = true; // update upper value
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
]
|
|
426
|
-
});
|
|
427
|
-
yield alert.present();
|
|
428
|
-
yield alert.onDidDismiss();
|
|
429
|
-
if (!confirmed) {
|
|
430
|
-
return !cancel;
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
return yield this.save(event, opts);
|
|
434
|
-
});
|
|
435
|
-
}
|
|
436
|
-
showToast(opts) {
|
|
437
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
438
|
-
if (!this.toastController)
|
|
439
|
-
throw new Error('Missing toastController in component\'s constructor');
|
|
440
|
-
yield Toasts.show(this.toastController, this.translate, opts);
|
|
441
|
-
});
|
|
442
|
-
}
|
|
443
|
-
logChildrenErrors(c, prefix, path) {
|
|
444
|
-
prefix = prefix || '[app-tab-editor] ';
|
|
445
|
-
// If editor
|
|
446
|
-
if (c instanceof AppEditor) {
|
|
447
|
-
c.logFormErrors();
|
|
448
|
-
}
|
|
449
|
-
// Angular form control
|
|
450
|
-
else if (c instanceof AbstractControl) {
|
|
451
|
-
AppFormUtils.logFormErrors(c, prefix, path);
|
|
452
|
-
}
|
|
453
|
-
// If form provider: get delegate
|
|
454
|
-
else if (c instanceof AppFormProvider) {
|
|
455
|
-
if (!c.empty && !c.valid) {
|
|
456
|
-
c.waitDelegate({ timeout: 1000 }).then(delegate => this.logChildrenErrors(delegate, prefix, 'provider'));
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
// If table
|
|
460
|
-
else if (c instanceof AppTable) {
|
|
461
|
-
if (c.invalid && c.editedRow && c.editedRow.validator) {
|
|
462
|
-
const path = c.constructor.name.toLowerCase();
|
|
463
|
-
AppFormUtils.logFormErrors(c.editedRow.validator, prefix, path);
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
// If form
|
|
467
|
-
else if (c instanceof AppForm) {
|
|
468
|
-
if (!c.empty && !c.valid) {
|
|
469
|
-
if (c.pending) {
|
|
470
|
-
const path = c.constructor.name.toLowerCase();
|
|
471
|
-
console.warn(`${prefix} -> ${path}: waiting while pending...`);
|
|
472
|
-
AppFormUtils.waitWhilePending(c, { timeout: 1000 })
|
|
473
|
-
.then(() => this.logChildrenErrors(c.form, prefix, path));
|
|
474
|
-
}
|
|
475
|
-
else {
|
|
476
|
-
AppFormUtils.logFormErrors(c.form, prefix);
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
}
|
|
480
|
-
// If editor
|
|
481
|
-
else if (c instanceof AppEditor) {
|
|
482
|
-
if (!c.empty && !c.valid) {
|
|
483
|
-
if (c.pending) {
|
|
484
|
-
const path = c.constructor.name.toLowerCase();
|
|
485
|
-
console.warn(`${prefix} -> ${path}: waiting while pending...`);
|
|
486
|
-
AppFormUtils.waitWhilePending(c, { timeout: 1000 })
|
|
487
|
-
.then(() => c.logFormErrors(prefix));
|
|
488
|
-
}
|
|
489
|
-
else {
|
|
490
|
-
c.logFormErrors(prefix);
|
|
491
|
-
}
|
|
492
|
-
}
|
|
493
|
-
}
|
|
494
|
-
else {
|
|
495
|
-
console.warn(`${prefix} Unknown children sub-form: `, c);
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
setError(value, opts) {
|
|
499
|
-
if (this.errorSubject.value !== value) {
|
|
500
|
-
this.errorSubject.next(value);
|
|
501
|
-
if (!opts || opts.emitEvent !== false)
|
|
502
|
-
this.markForCheck();
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
resetError(opts) {
|
|
506
|
-
this.setError(undefined, opts);
|
|
507
|
-
}
|
|
508
|
-
markForCheck() {
|
|
509
|
-
// Should be override by subclasses, if change detection is Push
|
|
510
|
-
}
|
|
511
|
-
}
|
|
512
|
-
AppEditor.decorators = [
|
|
513
|
-
{ type: Directive }
|
|
514
|
-
];
|
|
515
|
-
AppEditor.ctorParameters = () => [
|
|
516
|
-
{ type: ActivatedRoute },
|
|
517
|
-
{ type: Router },
|
|
518
|
-
{ type: AlertController },
|
|
519
|
-
{ type: TranslateService }
|
|
520
|
-
];
|
|
521
|
-
AppEditor.propDecorators = {
|
|
522
|
-
toolbar: [{ type: ViewChild, args: [ToolbarToken,] }],
|
|
523
|
-
formButtonsBar: [{ type: ViewChild, args: [FormButtonsBarToken, { static: true },] }],
|
|
524
|
-
content: [{ type: ViewChild, args: [IonContent, { static: true },] }]
|
|
525
|
-
};
|
|
526
|
-
// eslint-disable-next-line @angular-eslint/directive-class-suffix
|
|
527
|
-
export class AppTabEditor extends AppEditor {
|
|
528
|
-
constructor(route, // Modal editor give 'null'
|
|
529
|
-
router, alertCtrl, translate, options) {
|
|
530
|
-
super(route, router, alertCtrl, translate);
|
|
531
|
-
this.route = route;
|
|
532
|
-
this.router = router;
|
|
533
|
-
this.alertCtrl = alertCtrl;
|
|
534
|
-
this.translate = translate;
|
|
535
|
-
this._selectedTabIndex = 0;
|
|
536
|
-
this.selectedTabIndexChange = new EventEmitter();
|
|
537
|
-
options = Object.assign({ tabCount: 1, enableSwipe: true, tabGroupAnimationDuration: '200ms' }, options);
|
|
538
|
-
this.tabCount = options.tabCount;
|
|
539
|
-
this.enableSwipe = options.enableSwipe;
|
|
540
|
-
this.tabGroupAnimationDuration = options.tabGroupAnimationDuration;
|
|
541
|
-
this.queryTabIndexParamName = 'tab';
|
|
542
|
-
}
|
|
543
|
-
set selectedTabIndex(value) {
|
|
544
|
-
this.setSelectedTabIndex(value);
|
|
545
|
-
}
|
|
546
|
-
get selectedTabIndex() {
|
|
547
|
-
return this._selectedTabIndex;
|
|
548
|
-
}
|
|
549
|
-
ngOnInit() {
|
|
550
|
-
super.ngOnInit();
|
|
551
|
-
// Read the selected tab index, from path query params
|
|
552
|
-
if (this.tabGroup && this.route && this.queryTabIndexParamName) {
|
|
553
|
-
this.registerSubscription(this.route.queryParams
|
|
554
|
-
.subscribe(queryParams => {
|
|
555
|
-
this.queryParams = Object.assign({}, queryParams);
|
|
556
|
-
// Parse tab param
|
|
557
|
-
if (this.tabCount > 1 && this.queryTabIndexParamName) {
|
|
558
|
-
const tabIndex = queryParams[this.queryTabIndexParamName];
|
|
559
|
-
this.queryParams[this.queryTabIndexParamName] = tabIndex && parseInt(tabIndex) || undefined;
|
|
560
|
-
if (isNotNil(this.queryParams[this.queryTabIndexParamName])) {
|
|
561
|
-
this.selectedTabIndex = this.queryParams[this.queryTabIndexParamName];
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
// Realign tab, after a delay because the tab can be disabled when component is created
|
|
565
|
-
setTimeout(() => this.tabGroup.realignInkBar(), 500);
|
|
566
|
-
}));
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
ngOnDestroy() {
|
|
570
|
-
super.ngOnDestroy();
|
|
571
|
-
this.selectedTabIndexChange.complete();
|
|
572
|
-
this.loadingSubject.unsubscribe();
|
|
573
|
-
this.errorSubject.unsubscribe();
|
|
574
|
-
}
|
|
575
|
-
setSelectedTabIndex(value, opts) {
|
|
576
|
-
// Fix value
|
|
577
|
-
if (value < 0) {
|
|
578
|
-
value = 0;
|
|
579
|
-
}
|
|
580
|
-
else if (value > this.tabCount - 1) {
|
|
581
|
-
console.warn(`[tab-editor] Invalid tab index ${value}. Max value is ${this.tabCount - 1}`);
|
|
582
|
-
value = this._selectedTabIndex;
|
|
583
|
-
}
|
|
584
|
-
this._selectedTabIndex = value;
|
|
585
|
-
this.selectedTabIndexChange.next(value);
|
|
586
|
-
if (this.tabGroup && (!opts || opts.realignInkBar !== false)) {
|
|
587
|
-
this.tabGroup.selectedIndex = value;
|
|
588
|
-
this.markForCheck();
|
|
589
|
-
// Wait tab change in UI, before realign ink tab
|
|
590
|
-
setTimeout(() => this.tabGroup.realignInkBar(), 200);
|
|
591
|
-
}
|
|
592
|
-
else if (!opts || opts.emitEvent !== false) {
|
|
593
|
-
this.markForCheck();
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
realignInkBar() {
|
|
597
|
-
var _a;
|
|
598
|
-
(_a = this.tabGroup) === null || _a === void 0 ? void 0 : _a.realignInkBar();
|
|
599
|
-
}
|
|
600
|
-
onTabChange(event, queryTabIndexParamName) {
|
|
601
|
-
queryTabIndexParamName = queryTabIndexParamName || this.queryTabIndexParamName;
|
|
602
|
-
if (!queryTabIndexParamName || !this.route)
|
|
603
|
-
return true; // Skip if tab query param not set, or no route
|
|
604
|
-
if (!this.queryParams || +this.queryParams[queryTabIndexParamName] !== event.index) {
|
|
605
|
-
this.queryParams = this.queryParams || {};
|
|
606
|
-
this.queryParams[queryTabIndexParamName] = event.index;
|
|
607
|
-
if (queryTabIndexParamName === 'tab' && isNotNil(this.queryParams['subtab'])) {
|
|
608
|
-
delete this.queryParams.subtab; // clean subtab
|
|
609
|
-
}
|
|
610
|
-
this.router.navigate(['.'], {
|
|
611
|
-
relativeTo: this.route,
|
|
612
|
-
queryParams: this.queryParams,
|
|
613
|
-
replaceUrl: true
|
|
614
|
-
});
|
|
615
|
-
return true;
|
|
616
|
-
}
|
|
617
|
-
return false;
|
|
618
|
-
}
|
|
619
|
-
/**
|
|
620
|
-
* Action triggered when user swipes
|
|
621
|
-
*/
|
|
622
|
-
onSwipeTab(event) {
|
|
623
|
-
// DEBUG
|
|
624
|
-
// if (this.debug) console.debug("[tab-page] onSwipeTab()");
|
|
625
|
-
// Skip, if not a valid swipe event
|
|
626
|
-
if (!this.enableSwipe || !event
|
|
627
|
-
|| event.defaultPrevented || (event.srcEvent && event.srcEvent.defaultPrevented)
|
|
628
|
-
|| event.pointerType !== 'touch') {
|
|
629
|
-
return false;
|
|
630
|
-
}
|
|
631
|
-
// DEBUG
|
|
632
|
-
//if (this.debug)
|
|
633
|
-
//console.debug("[tab-page] Detected swipe: " + event.type, event);
|
|
634
|
-
let selectTabIndex = this.selectedTabIndex;
|
|
635
|
-
switch (event.type) {
|
|
636
|
-
// Open next tab
|
|
637
|
-
case 'swipeleft':
|
|
638
|
-
const isLast = selectTabIndex >= (this.tabCount - 1);
|
|
639
|
-
selectTabIndex = isLast ? 0 : selectTabIndex + 1;
|
|
640
|
-
break;
|
|
641
|
-
// Open previous tab
|
|
642
|
-
case 'swiperight':
|
|
643
|
-
const isFirst = selectTabIndex <= 0;
|
|
644
|
-
selectTabIndex = isFirst ? this.tabCount : selectTabIndex - 1;
|
|
645
|
-
break;
|
|
646
|
-
// Other case
|
|
647
|
-
default:
|
|
648
|
-
console.error('[tab-page] Unknown swipe action: ' + event.type);
|
|
649
|
-
return false;
|
|
650
|
-
}
|
|
651
|
-
setTimeout(() => {
|
|
652
|
-
this.selectedTabIndex = selectTabIndex;
|
|
653
|
-
this.markForCheck();
|
|
654
|
-
});
|
|
655
|
-
return true;
|
|
656
|
-
}
|
|
657
|
-
onSubTabChange(event) {
|
|
658
|
-
this.onTabChange(event, 'subtab');
|
|
659
|
-
}
|
|
660
|
-
unload(opts) {
|
|
661
|
-
const _super = Object.create(null, {
|
|
662
|
-
unload: { get: () => super.unload }
|
|
663
|
-
});
|
|
664
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
665
|
-
this.selectedTabIndex = 0;
|
|
666
|
-
yield _super.unload.call(this, opts);
|
|
667
|
-
});
|
|
668
|
-
}
|
|
669
|
-
saveDirtyChildren() {
|
|
670
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
671
|
-
// Save all dirty tables
|
|
672
|
-
const results = yield Promise.all([
|
|
673
|
-
...this.tables,
|
|
674
|
-
...this.editors
|
|
675
|
-
]
|
|
676
|
-
.filter(c => c.dirty)
|
|
677
|
-
.map(c => c.save()));
|
|
678
|
-
return !results.some(saved => saved !== true);
|
|
679
|
-
});
|
|
680
|
-
}
|
|
681
|
-
}
|
|
682
|
-
AppTabEditor.decorators = [
|
|
683
|
-
{ type: Directive }
|
|
684
|
-
];
|
|
685
|
-
AppTabEditor.ctorParameters = () => [
|
|
686
|
-
{ type: ActivatedRoute, decorators: [{ type: Optional }] },
|
|
687
|
-
{ type: Router },
|
|
688
|
-
{ type: AlertController },
|
|
689
|
-
{ type: TranslateService },
|
|
690
|
-
{ type: AppTabEditorOptions, decorators: [{ type: Optional }] }
|
|
691
|
-
];
|
|
692
|
-
AppTabEditor.propDecorators = {
|
|
693
|
-
queryTabIndexParamName: [{ type: Input }],
|
|
694
|
-
selectedTabIndex: [{ type: Input }],
|
|
695
|
-
selectedTabIndexChange: [{ type: Output }],
|
|
696
|
-
tabGroup: [{ type: ViewChild, args: ['tabGroup', { static: true },] }]
|
|
697
|
-
};
|
|
698
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2Zvcm0vZWRpdG9yLmNsYXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQWdCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM1SCxPQUFPLEVBQUMsY0FBYyxFQUFVLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRS9ELE9BQU8sRUFBQyxlQUFlLEVBQUUsVUFBVSxFQUFrQixNQUFNLGdCQUFnQixDQUFDO0FBQzVFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxlQUFlLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDM0UsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDckMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFDLGVBQWUsRUFBRSxZQUFZLEVBQTJCLE1BQU0sY0FBYyxDQUFDO0FBQ3JGLE9BQU8sRUFBbUIsTUFBTSxFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFFbkUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzFELE9BQU8sRUFBQyxRQUFRLEVBQUUsUUFBUSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFMUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxZQUFZLEVBQWtCLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBZW5GLE1BQU0sT0FBTyxtQkFBbUI7Q0FnQi9CO0FB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QUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUM1SCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLEtBQUs7UUFDUCwyRkFBMkY7UUFDM0YsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ25HLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ25HLENBQUM7SUFFRCxJQUFJLE9BQU87UUFDVCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDO0lBQ2hJLENBQUM7SUFFRCxJQUFJLE1B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UUFBUSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVLLE1BQU0sQ0FBQyxJQUE4Qjs7Ozs7WUFDekMsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUMxQixNQUFNLE9BQU0sTUFBTSxZQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUM7S0FBQTtJQUllLGlCQUFpQjs7WUFDL0Isd0JBQXdCO1lBQ3hCLE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDaEMsR0FBRyxJQUFJLENBQUMsTUFBTTtnQkFDZCxHQUFHLElBQUksQ0FBQyxPQUFPO2FBQ2hCO2lCQUNFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7aUJBQ3BCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFdkIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDaEQsQ0FBQztLQUFBOzs7WUF0TUYsU0FBUzs7O1lBbGxCRixjQUFjLHVCQTZtQmpCLFFBQVE7WUE3bUJtQixNQUFNO1lBRTlCLGVBQWU7WUFDZixnQkFBZ0I7WUE4bUJFLG1CQUFtQix1QkFBeEMsUUFBUTs7O3FDQWxCVixLQUFLOytCQUVMLEtBQUs7cUNBT0wsTUFBTTt1QkFFTixTQUFTLFNBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7QWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIE91dHB1dCwgVmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIFBhcmFtcywgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtNYXRUYWJDaGFuZ2VFdmVudCwgTWF0VGFiR3JvdXB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xuaW1wb3J0IHtBbGVydENvbnRyb2xsZXIsIElvbkNvbnRlbnQsIFRvYXN0Q29udHJvbGxlcn0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7QmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIFRlYXJkb3duTG9naWN9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtBcHBUYWJsZX0gZnJvbSAnLi4vdGFibGUvdGFibGUuY2xhc3MnO1xuaW1wb3J0IHtBcHBGb3JtfSBmcm9tICcuL2Zvcm0uY2xhc3MnO1xuaW1wb3J0IHtGb3JtQnV0dG9uc0JhclRva2VufSBmcm9tICcuL2Zvcm0tYnV0dG9ucy1iYXIuY29tcG9uZW50JztcbmltcG9ydCB7QXBwRm9ybVByb3ZpZGVyLCBBcHBGb3JtVXRpbHMsIElBcHBGb3JtLCBJQXBwRm9ybUdldHRlcn0gZnJvbSAnLi9mb3JtLnV0aWxzJztcbmltcG9ydCB7U2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzfSBmcm9tICcuLi8uLi9zaGFyZWQvdG9hc3QvdG9hc3RzJztcbmltcG9ydCB7SGFtbWVyU3dpcGVFdmVudH0gZnJvbSAnLi4vLi4vc2hhcmVkL2dlc3R1cmUvaGFtbWVyLnV0aWxzJztcbmltcG9ydCB7VG9vbGJhclRva2VufSBmcm9tICcuLi8uLi9zaGFyZWQvdG9vbGJhci90b29sYmFyJztcbmltcG9ydCB7aXNOb3ROaWwsIHRvTnVtYmVyfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7Q2FuTGVhdmV9IGZyb20gJy4uLy4uL3NoYXJlZC9ndWFyZC9jb21wb25lbnQtZGlydHkuZ3VhcmQnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2x9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7d2FpdEZvckZhbHNlLCBXYWl0Rm9yT3B0aW9ucywgd2FpdEZvclRydWV9IGZyb20gJy4uLy4uL3NoYXJlZC9vYnNlcnZhYmxlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFwcEVkaXRvciBleHRlbmRzIENhbkxlYXZlLCBJQXBwRm9ybSB7XG4gIHNhdmUoZXZlbnQ/OiBFdmVudCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8Ym9vbGVhbj47XG4gIGNhbmNlbChldmVudD86IEV2ZW50KTogUHJvbWlzZTx2b2lkPjtcbiAgYWRkQ2hpbGRGb3JtKGZvcm06IElBcHBGb3JtIHwgSUFwcEZvcm1HZXR0ZXIpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBcHBUYWJFZGl0b3IgZXh0ZW5kcyBJQXBwRWRpdG9yIHtcbiAgc2VsZWN0ZWRUYWJJbmRleDogbnVtYmVyO1xuICBzZXRTZWxlY3RlZFRhYkluZGV4KHZhbHVlOiBudW1iZXIsIG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbjsgcmVhbGlnbklua0Jhcj86IGJvb2xlYW47fSk6IHZvaWQ7XG4gIHVubG9hZChvcHRzPzoge2VtaXRFdmVudD86IGJvb2xlYW59KTogUHJvbWlzZTx2b2lkPjtcbiAgcmVhbGlnbklua0JhcigpO1xufVxuXG5leHBvcnQgY2xhc3MgQXBwVGFiRWRpdG9yT3B0aW9ucyB7XG5cbiAgLyoqXG4gICAqIE51bWJlciBvZiB0YWIuIDEgYnkgZGVmYXVsdFxuICAgKi9cbiAgdGFiQ291bnQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqICcyMDBtcycgYnkgZGVmYXVsdFxuICAgKi9cbiAgdGFiR3JvdXBBbmltYXRpb25EdXJhdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogU2hvdWxkIGVuYWJsZSBzd2lwZSBiZXR3ZWVuIHRhYiwgb24gdG91Y2ggc2NyZWVuXG4gICAqL1xuICBlbmFibGVTd2lwZT86IGJvb2xlYW47IC8vIHRydWUgYnkgZGVmYXVsdFxufVxuXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFwcEVkaXRvcjxUID0gYW55LCBJRCA9IG51bWJlciwgTyA9IGFueT5cbiAgaW1wbGVtZW50cyBJQXBwRWRpdG9yLCBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgcHJpdmF0ZSBfY2hpbGRyZW46IElBcHBGb3JtW107XG4gIHByaXZhdGUgX3N1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBwcm90ZWN0ZWQgX2VuYWJsZWQgPSBmYWxzZTtcbiAgcHJvdGVjdGVkIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVzdHJveVN1YmplY3QgPSBuZXcgU3ViamVjdCgpO1xuXG4gIHJlYWRvbmx5IHJlYWR5U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSBkaXJ0eVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbG9hZGluZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSBlcnJvclN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odW5kZWZpbmVkKTtcbiAgcmVhZG9ubHkgc2F2aW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICByZWFkb25seSB0b3VjaGVkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIGRlYnVnID0gZmFsc2U7XG4gIHByZXZpb3VzRGF0YUlkOiBJRDtcbiAgc3VibWl0dGVkID0gZmFsc2U7XG4gIHF1ZXJ5UGFyYW1zOiBQYXJhbXM7XG4gIGkxOG5Db250ZXh0OiB7XG4gICAgcHJlZml4OiBzdHJpbmc7XG4gICAgc3VmZml4OiBzdHJpbmc7XG4gIH07XG5cbiAgLyoqXG4gICAqICBAZGVwcmVjYXRlZFxuICAgKi9cbiAgcHJvdGVjdGVkIHNldCBfbG9hZGluZyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMubG9hZGluZ1N1YmplY3QubmV4dCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogIEBkZXByZWNhdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IF9sb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiAgQGRlcHJlY2F0ZWRcbiAgICovXG4gIHByb3RlY3RlZCBnZXQgXyRyZWFkeSgpOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLnJlYWR5U3ViamVjdDtcbiAgfVxuICAvKipcbiAgICogIEBkZXByZWNhdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IF8kbG9hZGluZygpOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTdWJqZWN0O1xuICB9XG5cbiAgZ2V0IGVycm9yKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZXJyb3JTdWJqZWN0LnZhbHVlO1xuICB9XG5cbiAgc2V0IGVycm9yKGVycm9yOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNldEVycm9yKGVycm9yKTtcbiAgfVxuXG4gIGdldCBzYXZpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc2F2aW5nU3ViamVjdC52YWx1ZSB8fCB0aGlzLmVkaXRvcnM/LnNvbWUoZSA9PiBlLnNhdmluZyk7XG4gIH1cblxuICBAVmlld0NoaWxkKFRvb2xiYXJUb2tlbikgdG9vbGJhcjogVG9vbGJhclRva2VufG51bGwgPSBudWxsO1xuICBAVmlld0NoaWxkKEZvcm1CdXR0b25zQmFyVG9rZW4sIHsgc3RhdGljOiB0cnVlIH0pIGZvcm1CdXR0b25zQmFyOiBGb3JtQnV0dG9uc0JhclRva2VufG51bGwgPSBudWxsO1xuICBAVmlld0NoaWxkKElvbkNvbnRlbnQsIHtzdGF0aWM6IHRydWV9KSBjb250ZW50OiBJb25Db250ZW50O1xuXG4gIGdldCB0YWJsZXMoKTogQXBwVGFibGU8YW55PltdIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW4gJiYgKHRoaXMuX2NoaWxkcmVuLmZpbHRlcihjID0+IGMgaW5zdGFuY2VvZiBBcHBUYWJsZSkgYXMgQXBwVGFibGU8YW55PltdKTtcbiAgfVxuICBnZXQgZm9ybXMoKTogQXBwRm9ybTxhbnk+W10ge1xuICAgIHJldHVybiB0aGlzLl9jaGlsZHJlbiAmJiAodGhpcy5fY2hpbGRyZW4uZmlsdGVyKGMgPT4gYyBpbnN0YW5jZW9mIEFwcEZvcm0pIGFzIEFwcEZvcm08YW55PltdKTtcbiAgfVxuICBnZXQgZWRpdG9ycygpOiBBcHBFZGl0b3I8YW55PltdIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRyZW4gJiYgKHRoaXMuX2NoaWxkcmVuLmZpbHRlcihjID0+IGMgaW5zdGFuY2VvZiBBcHBFZGl0b3IpIGFzIEFwcEVkaXRvcltdKTtcbiAgfVxuICBnZXQgZGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGlydHlTdWJqZWN0LnZhbHVlIHx8ICh0aGlzLl9jaGlsZHJlbiAmJiB0aGlzLl9jaGlsZHJlbi5maW5kSW5kZXgoYyA9PiBjLmVuYWJsZWQgJiYgYy5kaXJ0eSkgIT09IC0xKSB8fCBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJcyB2YWxpZCAodGFibGVzIGFuZCBmb3JtcylcbiAgICovXG4gIGdldCB2YWxpZCgpOiBib29sZWFuIHtcbiAgICAvLyBJbXBvcnRhbnQ6IFNob3VsZCBiZSBub3QgaW52YWxpZCBBTkQgbm90IHBlbmRpbmcsIHNvIHVzZSAnIXZhbGlkJyAoRE8gTk9UIHVzZSAnaW52YWxpZCcpXG4gICAgcmV0dXJuICF0aGlzLl9jaGlsZHJlbiB8fCB0aGlzLl9jaGlsZHJlbi5maW5kSW5kZXgoYyA9PiBjLmVuYWJsZWQgJiYgIWMudmFsaWQpID09PSAtMTtcbiAgfVxuXG4gIGdldCBpbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5fY2hpbGRyZW4gJiYgdGhpcy5fY2hpbGRyZW4uZmluZEluZGV4KGMgPT4gYy5lbmFibGVkICYmIGMuaW52YWxpZCkgIT09IC0xKSB8fCBmYWxzZTtcbiAgfVxuXG4gIGdldCBwZW5kaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5fY2hpbGRyZW4gJiYgdGhpcy5fY2hpbGRyZW4uZmluZEluZGV4KGMgPT4gYy5lbmFibGVkICYmIGMucGVuZGluZykgIT09IC0xKSB8fCBmYWxzZTtcbiAgfVxuXG4gIGdldCBsb2FkaW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlIHx8ICh0aGlzLl9jaGlsZHJlbiAmJiB0aGlzLl9jaGlsZHJlbi5maW5kSW5kZXgoYyA9PiBjLmVuYWJsZWQgJiYgYy5sb2FkaW5nKSAhPT0gLTEpIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0IGxvYWRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMubG9hZGluZ1N1YmplY3QudmFsdWUgJiYgKCF0aGlzLl9jaGlsZHJlbiB8fCB0aGlzLl9jaGlsZHJlbi5maW5kSW5kZXgoYyA9PiBjLmVuYWJsZWQgJiYgYy5sb2FkaW5nKSA9PT0gLTEpIHx8IGZhbHNlO1xuICB9XG5cbiAgZ2V0IHRvdWNoZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudG91Y2hlZFN1YmplY3QudmFsdWUgfHwgKHRoaXMuX2NoaWxkcmVuICYmIHRoaXMuX2NoaWxkcmVuLmZpbmRJbmRleChjID0+IGMuZW5hYmxlZCAmJiBjLnRvdWNoZWQpICE9PSAtMSkgfHwgZmFsc2U7XG4gIH1cblxuICBnZXQgdW50b3VjaGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy50b3VjaGVkU3ViamVjdC52YWx1ZSAmJiAoIXRoaXMuX2NoaWxkcmVuIHx8IHRoaXMuX2NoaWxkcmVuLmZpbmRJbmRleChjID0+IGMuZW5hYmxlZCAmJiBjLnRvdWNoZWQpID09PSAtMSkgfHwgZmFsc2U7XG4gIH1cblxuICBnZXQgZW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZW5hYmxlZDtcbiAgfVxuXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuX2VuYWJsZWQ7XG4gIH1cblxuICBnZXQgY2hpbGRyZW4oKTogSUFwcEZvcm1bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuO1xuICB9XG5cbiAgZ2V0IGVtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fZW5hYmxlZDtcbiAgfVxuXG4gIGFic3RyYWN0IGdldCBpc05ld0RhdGEoKTogYm9vbGVhbjtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcm90ZWN0ZWQgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJvdGVjdGVkIGFsZXJ0Q3RybDogQWxlcnRDb250cm9sbGVyLFxuICAgIHByb3RlY3RlZCB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2VcbiAgKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcblxuICAgIGlmICh0aGlzLmZvcm1CdXR0b25zQmFyKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHRoaXMuZm9ybUJ1dHRvbnNCYXIub25CYWNrLnN1YnNjcmliZShldmVudCA9PiB0aGlzLmdvQmFjayhldmVudCkpKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgLy8gQ2FuIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlc1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLnJlYWR5U3ViamVjdC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMubG9hZGluZ1N1YmplY3QudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmVycm9yU3ViamVjdC51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5kZXN0cm95U3ViamVjdC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95U3ViamVjdC51bnN1YnNjcmliZSgpO1xuICB9XG5cbiAgYWRkQ2hpbGRGb3JtKGZvcm06IElBcHBGb3JtIHwgSUFwcEZvcm1HZXR0ZXIpIHtcbiAgICBpZiAoIWZvcm0pIHRocm93IG5ldyBFcnJvcignVHJ5aW5nIHRvIHJlZ2lzdGVyIGFuIHVuZGVmaW5lZCBjaGlsZCBmb3JtJyk7XG4gICAgdGhpcy5fY2hpbGRyZW4gPSB0aGlzLl9jaGlsZHJlbiB8fCBbXTtcbiAgICBpZiAodHlwZW9mIGZvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRoaXMuX2NoaWxkcmVuLnB1c2gobmV3IEFwcEZvcm1Qcm92aWRlcihmb3JtKSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgdGhpcy5fY2hpbGRyZW4ucHVzaChmb3JtKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBhZGRDaGlsZEZvcm1zKGZvcm1zOiAoSUFwcEZvcm0gfCBJQXBwRm9ybUdldHRlcilbXSkge1xuICAgIChmb3JtcyB8fCBbXSkuZm9yRWFjaChmb3JtID0+IHRoaXMuYWRkQ2hpbGRGb3JtKGZvcm0pKTtcbiAgfVxuXG4gIHJlbW92ZUNoaWxkRm9ybShmb3JtOiBJQXBwRm9ybSB8IElBcHBGb3JtR2V0dGVyKTogSUFwcEZvcm0gfCBJQXBwRm9ybUdldHRlciB7XG4gICAgaWYgKCFmb3JtKSB0aHJvdyBuZXcgRXJyb3IoJ1RyeWluZyB0byByZW1vdmUgYW4gdW5kZWZpbmVkIGNoaWxkIGZvcm0nKTtcbiAgICBjb25zdCBpbmRleCA9ICh0aGlzLl9jaGlsZHJlbiB8fCBbXSkuZmluZEluZGV4KGMgPT4gYyA9PT0gZm9ybSk7XG4gICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkcmVuLnNwbGljZShpbmRleCwgMSlbMF07XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBkaXNhYmxlKG9wdHM/OiB7b25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLl9lbmFibGVkID0gZmFsc2U7XG4gICAgdGhpcy5fY2hpbGRyZW4/LmZvckVhY2goYyA9PiBjLmRpc2FibGUob3B0cykpO1xuICAgIGlmICghdGhpcy5sb2FkaW5nICYmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZW5hYmxlKG9wdHM/OiB7b25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTtcbiAgICB0aGlzLl9jaGlsZHJlbj8uZm9yRWFjaChjID0+IGMuZW5hYmxlKG9wdHMpKTtcbiAgICBpZiAoIXRoaXMubG9hZGluZyAmJiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG1hcmtBc1ByaXN0aW5lKG9wdHM/OiB7b25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLmVycm9yID0gbnVsbDtcbiAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmRpcnR5U3ViamVjdC52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuZGlydHlTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgIH1cbiAgICB0aGlzLl9jaGlsZHJlbj8uZm9yRWFjaChjID0+IGMubWFya0FzUHJpc3RpbmUob3B0cykpO1xuICAgIGlmICghdGhpcy5sb2FkaW5nICYmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbWFya0FzVW50b3VjaGVkKG9wdHM/OiB7b25seVNlbGY/OiBib29sZWFuOyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICBpZiAodGhpcy50b3VjaGVkU3ViamVjdC52YWx1ZSAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMudG91Y2hlZFN1YmplY3QubmV4dChmYWxzZSk7XG4gICAgfVxuICAgIHRoaXMuX2NoaWxkcmVuPy5mb3JFYWNoKGMgPT4gYy5tYXJrQXNVbnRvdWNoZWQoKSk7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmcgJiYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkpIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgcHJlZmVyIHRvIHVzZSBtYXJrQWxsQXNUb3VjaGVkKClcbiAgICogQHBhcmFtIG9wdHNcbiAgICovXG4gIG1hcmtBc1RvdWNoZWQob3B0cz86IHtvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW4gfSkge1xuICAgIGlmICghdGhpcy50b3VjaGVkU3ViamVjdC52YWx1ZSAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy50b3VjaGVkU3ViamVjdC5uZXh0KHRydWUpO1xuICAgIH1cbiAgICB0aGlzLl9jaGlsZHJlbj8uZm9yRWFjaChjID0+IGMubWFya0FzVG91Y2hlZChvcHRzKSk7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmcgJiYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkpIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBtYXJrQWxsQXNUb3VjaGVkKG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbiB9KSB7XG4gICAgaWYgKHRoaXMudG91Y2hlZFN1YmplY3QudmFsdWUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMudG91Y2hlZFN1YmplY3QubmV4dCh0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5fY2hpbGRyZW4/LmZvckVhY2goYyA9PiBjLm1hcmtBbGxBc1RvdWNoZWQob3B0cykpO1xuICAgIGlmICghdGhpcy5sb2FkaW5nICYmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgbWFya0FzRGlydHkob3B0cz86IHtvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW47fSl7XG4gICAgaWYgKCF0aGlzLmRpcnR5U3ViamVjdC52YWx1ZSkge1xuICAgICAgdGhpcy5kaXJ0eVN1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgIGlmICghdGhpcy5sb2FkaW5nICYmICghb3B0cyB8fCBvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc0xvYWRpbmcob3B0cz86IHtvbmx5U2VsZj86IGJvb2xlYW47IGVtaXRFdmVudD86IGJvb2xlYW47fSl7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlKSB7XG4gICAgICB0aGlzLmxvYWRpbmdTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIG1hcmtBc0xvYWRlZChvcHRzPzoge1xuICAgIG9ubHlTZWxmPzogYm9vbGVhbjtcbiAgICBlbWl0RXZlbnQ/OiBib29sZWFuO1xuICB9KXtcbiAgICBpZiAodGhpcy5sb2FkaW5nU3ViamVjdC52YWx1ZSkge1xuICAgICAgdGhpcy5sb2FkaW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgIGlmICghb3B0cyB8fCBvcHRzLm9ubHlTZWxmICE9PSB0cnVlKSB7XG4gICAgICAgIC8vIEVtaXQgdG8gY2hpbGRyZW4gZm9ybXMgYW5kIGVkaXRvcnNcbiAgICAgICAgLy8gbm90ZTogdGFibGVzIHNob3VsZCBiZSBjaGFuZ2VkIGJ5IHBhcmVudFxuICAgICAgICB0aGlzLmZvcm1zPy5mb3JFYWNoKGYgPT4gZi5tYXJrQXNMb2FkZWQob3B0cykpO1xuICAgICAgICB0aGlzLmVkaXRvcnM/LmZvckVhY2goZSA9PiBlLm1hcmtBc0xvYWRlZChvcHRzKSk7XG4gICAgICB9XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbWFya0FzUmVhZHkob3B0cz86IHtlbWl0RXZlbnQ/OiBib29sZWFuIH0pIHtcbiAgICB0aGlzLl9jaGlsZHJlbj8uZm9yRWFjaChjID0+IGMubWFya0FzUmVhZHkob3B0cykpO1xuICAgIHRoaXMucmVhZHlTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gIH1cblxuICByZWFkeShvcHRzPzogV2FpdEZvck9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5yZWFkeVN1YmplY3QudmFsdWUpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICByZXR1cm4gd2FpdEZvclRydWUodGhpcy5yZWFkeVN1YmplY3QsIG9wdHMpO1xuICB9XG5cbiAgd2FpdElkbGUob3B0cz86IFdhaXRGb3JPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0aGlzLmxvYWRpbmdTdWJqZWN0LnZhbHVlKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgcmV0dXJuIHdhaXRGb3JGYWxzZSh0aGlzLmxvYWRpbmdTdWJqZWN0LCBvcHRzKTtcbiAgfVxuXG4gIG1hcmtBc1NhdmluZyhvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pe1xuICAgIGlmICh0aGlzLnNhdmluZ1N1YmplY3QudmFsdWUgIT09IHRydWUpIHtcbiAgICAgIHRoaXMuc2F2aW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgaWYgKCFvcHRzIHx8IG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG4gIH1cblxuICBtYXJrQXNTYXZlZChvcHRzPzogeyBlbWl0RXZlbnQ/OiBib29sZWFuIH0pe1xuICAgIGlmICh0aGlzLnNhdmluZ1N1YmplY3QudmFsdWUgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLnNhdmluZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGNhbmNlbChldmVudD86IEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNOZXdEYXRhKSB7XG4gICAgICBhd2FpdCB0aGlzLnVubG9hZCgpOyAvLyBhc3luYyByZXNldFxuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLmRpcnR5KXtcbiAgICAgIGF3YWl0IHRoaXMucmVsb2FkKCk7IC8vIGFzeW5jIHJlbG9hZFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbmxvYWQgdGhlIHBhZ2UgKHJlbW92ZSBhbGwgZGF0YSkuIFVzZWZ1bCB3aGVuIHJldXNpbmcgYW5ndWxhciBjYWNoZSBhIGNhbmNlbGxlZCBwYWdlXG4gICAqXG4gICAqIEBwYXJhbSBvcHRzXG4gICAqL1xuICBhc3luYyB1bmxvYWQob3B0cz86IHtlbWl0RXZlbnQ/OiBib29sZWFuIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmRlYnVnKCdbZWRpdG9yXSBVbmxvYWRpbmcgZGF0YS4uLicpO1xuICAgIHRoaXMubWFya0FzTG9hZGluZygpO1xuICAgIHRoaXMuX2NoaWxkcmVuPy5mb3JFYWNoKGYgPT4ge1xuICAgICAgaWYgKGYgaW5zdGFuY2VvZiBBcHBGb3JtKSB7XG4gICAgICAgIGYucmVzZXQobnVsbCwgb3B0cyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChmIGluc3RhbmNlb2YgQXBwVGFibGUpIHtcbiAgICAgICAgZi5kYXRhU291cmNlLmRpc2Nvbm5lY3QoKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGYgaW5zdGFuY2VvZiBBcHBFZGl0b3IpIHtcbiAgICAgICAgZi51bmxvYWQob3B0cyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLm1hcmtBc1ByaXN0aW5lKG9wdHMpO1xuICAgIHRoaXMubWFya0FzU2F2ZWQob3B0cyk7XG4gIH1cblxuICBhc3luYyByZWxvYWRXaXRoQ29uZmlybWF0aW9uKGNvbmZpcm0/OiBib29sZWFuKSB7XG4gICAgY29uc3QgbmVlZENvbmZpcm0gPSB0aGlzLmRpcnR5O1xuICAgIC8vIGlmIG5vdCBjb25maXJtIHlldDogYXNrIGNvbmZpcm1hdGlvblxuICAgIGlmICghY29uZmlybSAmJiBuZWVkQ29uZmlybSkge1xuICAgICAgY29uc3QgdHJhbnNsYXRpb25zID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChbJ0NPTU1PTi5CVE5fQUJPUlRfQ0hBTkdFUycsICdDT01NT04uQlROX0NBTkNFTCcsICdDT05GSVJNLkNBTkNFTF9DSEFOR0VTJywgJ0NPTkZJUk0uQUxFUlRfSEVBREVSJ10pO1xuICAgICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLmFsZXJ0Q3RybC5jcmVhdGUoe1xuICAgICAgICBoZWFkZXI6IHRyYW5zbGF0aW9uc1snQ09ORklSTS5BTEVSVF9IRUFERVInXSxcbiAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRpb25zWydDT05GSVJNLkNBTkNFTF9DSEFOR0VTJ10sXG4gICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0OiB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5CVE5fQUJPUlRfQ0hBTkdFUyddLFxuICAgICAgICAgICAgY3NzQ2xhc3M6ICdzZWNvbmRhcnknLFxuICAgICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgICAgICBjb25maXJtID0gdHJ1ZTsgLy8gdXBkYXRlIHVwcGVyIHZhbHVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB0ZXh0OiB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5CVE5fQ0FOQ0VMJ10sXG4gICAgICAgICAgICByb2xlOiAnY2FuY2VsJyxcbiAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0pO1xuICAgICAgYXdhaXQgYWxlcnQucHJlc2VudCgpO1xuICAgICAgYXdhaXQgYWxlcnQub25EaWREaXNtaXNzKCk7XG4gICAgfVxuXG4gICAgLy8gSWYgY29uZmlybTogZXhlY3V0ZSB0aGUgcmVsb2FkXG4gICAgaWYgKGNvbmZpcm0gfHwgIW5lZWRDb25maXJtKSB7XG4gICAgICB0aGlzLnNjcm9sbFRvVG9wKCk7XG4gICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJlbG9hZCgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdvQmFjayhldmVudD86IEV2ZW50KTogUHJvbWlzZTx2b2lkIHwgYm9vbGVhbj4ge1xuICAgIC8vIEdvIGJhY2tcbiAgICBpZiAodGhpcy50b29sYmFyPy5jYW5Hb0JhY2spIHtcbiAgICAgIHJldHVybiB0aGlzLnRvb2xiYXIuZ29CYWNrKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJhY2sgdG8gaG9tZVxuICAgICAgcmV0dXJuIHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwoJy8nKTtcbiAgICB9XG4gIH1cblxuXG5cbiAgYWJzdHJhY3QgbG9hZChpZD86IElELCBvcHRpb25zPzogTyk6IFByb21pc2U8dm9pZD47XG5cbiAgYWJzdHJhY3Qgc2F2ZShldmVudD86IEV2ZW50LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxib29sZWFuPjtcblxuICBhYnN0cmFjdCByZWxvYWQoKTogUHJvbWlzZTx2b2lkPjtcblxuICBsb2dGb3JtRXJyb3JzKHByZWZpeD86IHN0cmluZykge1xuICAgIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKCdbZWRpdG9yXSBFZGl0b3Igbm90IHZhbGlkLiBDaGVja2luZyB3aGVyZSAoZm9ybXMsIHRhYmxlcykuLi4nKTtcbiAgICB0aGlzLl9jaGlsZHJlbj8uZm9yRWFjaChjID0+IHRoaXMubG9nQ2hpbGRyZW5FcnJvcnMoYywgcHJlZml4KSk7XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBhc3luYyBzY3JvbGxUb1RvcChkdXJhdGlvbj86IG51bWJlcikge1xuICAgIGR1cmF0aW9uID0gdG9OdW1iZXIoZHVyYXRpb24sIDUwMCk7XG5cbiAgICBpZiAoIXRoaXMuY29udGVudCkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFiLWVkaXRvcl0gQ2Fubm90IHNjcm9sbCB0byB0b3AuIChubyAnaW9uLWNvbnRlbnQnIHRhZyBmb3VuZCAke3RoaXMuY29uc3RydWN0b3IubmFtZX1gKTtcblxuICAgICAgLy8gVE9ETzogRklYTUUgKG5vdCB3b3JraW5nIGFzIHRoZSBwYWdlIGlzIG5vdCB0aGUgd2luZG93KVxuICAgICAgY29uc3Qgc2Nyb2xsVG9Ub3AgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBjb25zdCBwb3MgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gICAgICAgIGlmIChwb3MgPiAwKSB7XG4gICAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHBvcyAtIDIwKTsgLy8gaG93IGZhciB0byBzY3JvbGwgb24gZWFjaCBzdGVwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2luZG93LmNsZWFySW50ZXJ2YWwoc2Nyb2xsVG9Ub3ApO1xuICAgICAgICB9XG4gICAgICB9LCAxNik7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuY29udGVudC5zY3JvbGxUb1RvcChkdXJhdGlvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVnaXN0ZXJTdWJzY3JpcHRpb24oc3ViOiBTdWJzY3JpcHRpb258VGVhcmRvd25Mb2dpYykge1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoc3ViKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB1bnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHN1YjogU3Vic2NyaXB0aW9uKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnJlbW92ZShzdWIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHNhdmVJZkRpcnR5QW5kQ29uZmlybShldmVudD86IFVJRXZlbnQsIG9wdHM/OiB7XG4gICAgZW1pdEV2ZW50PzogYm9vbGVhbjtcbiAgICBjb25maXJtZWQ/OiBib29sZWFuXG4gIH0pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoIXRoaXMuZGlydHkpIHJldHVybiB0cnVlO1xuXG4gICAgbGV0IGNvbmZpcm1lZCA9IG9wdHM/LmNvbmZpcm1lZCB8fCBmYWxzZTtcbiAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgbGV0IGNhbmNlbCA9IGZhbHNlO1xuICAgICAgY29uc3QgdHJhbnNsYXRpb25zID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChbJ0NPTU1PTi5CVE5fU0FWRScsICdDT01NT04uQlROX0NBTkNFTCcsICdDT01NT04uQlROX0FCT1JUX0NIQU5HRVMnLCAnQ09ORklSTS5TQVZFJywgJ0NPTkZJUk0uQUxFUlRfSEVBREVSJ10pO1xuICAgICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLmFsZXJ0Q3RybC5jcmVhdGUoe1xuICAgICAgICBoZWFkZXI6IHRyYW5zbGF0aW9uc1snQ09ORklSTS5BTEVSVF9IRUFERVInXSxcbiAgICAgICAgbWVzc2FnZTogdHJhbnNsYXRpb25zWydDT05GSVJNLlNBVkUnXSxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9DQU5DRUwnXSxcbiAgICAgICAgICAgIHJvbGU6ICdjYW5jZWwnLFxuICAgICAgICAgICAgY3NzQ2xhc3M6ICdzZWNvbmRhcnknLFxuICAgICAgICAgICAgaGFuZGxlcjogKCkgPT4ge1xuICAgICAgICAgICAgICBjYW5jZWwgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgdGV4dDogdHJhbnNsYXRpb25zWydDT01NT04uQlROX0FCT1JUX0NIQU5HRVMnXSxcbiAgICAgICAgICAgIGNzc0NsYXNzOiAnc2Vjb25kYXJ5JyxcbiAgICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9TQVZFJ10sXG4gICAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbmZpcm1lZCA9IHRydWU7IC8vIHVwZGF0ZSB1cHBlciB2YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSk7XG4gICAgICBhd2FpdCBhbGVydC5wcmVzZW50KCk7XG4gICAgICBhd2FpdCBhbGVydC5vbkRpZERpc21pc3MoKTtcblxuICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgcmV0dXJuICFjYW5jZWw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuc2F2ZShldmVudCwgb3B0cyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc2hvd1RvYXN0KG9wdHM6IFNob3dUb2FzdE9wdGlvbnMpIHtcbiAgICBpZiAoIXRoaXMudG9hc3RDb250cm9sbGVyKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgdG9hc3RDb250cm9sbGVyIGluIGNvbXBvbmVudFxcJ3MgY29uc3RydWN0b3InKTtcbiAgICBhd2FpdCBUb2FzdHMuc2hvdyh0aGlzLnRvYXN0Q29udHJvbGxlciwgdGhpcy50cmFuc2xhdGUsIG9wdHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxvZ0NoaWxkcmVuRXJyb3JzKGM6IElBcHBGb3JtIHwgQWJzdHJhY3RDb250cm9sLCBwcmVmaXg/OiBzdHJpbmcsIHBhdGg/OiBzdHJpbmcpIHtcbiAgICBwcmVmaXggPSBwcmVmaXggfHwgJ1thcHAtdGFiLWVkaXRvcl0gJztcbiAgICAvLyBJZiBlZGl0b3JcbiAgICBpZiAoYyBpbnN0YW5jZW9mIEFwcEVkaXRvcikge1xuICAgICAgYy5sb2dGb3JtRXJyb3JzKCk7XG4gICAgfVxuICAgIC8vIEFuZ3VsYXIgZm9ybSBjb250cm9sXG4gICAgZWxzZSBpZiAoYyBpbnN0YW5jZW9mIEFic3RyYWN0Q29udHJvbCkge1xuICAgICAgQXBwRm9ybVV0aWxzLmxvZ0Zvcm1FcnJvcnMoYywgcHJlZml4LCBwYXRoKTtcbiAgICB9XG4gICAgLy8gSWYgZm9ybSBwcm92aWRlcjogZ2V0IGRlbGVnYXRlXG4gICAgZWxzZSBpZiAoYyBpbnN0YW5jZW9mIEFwcEZvcm1Qcm92aWRlcikge1xuICAgICAgaWYgKCFjLmVtcHR5ICYmICFjLnZhbGlkKSB7XG4gICAgICAgIGMud2FpdERlbGVnYXRlKHt0aW1lb3V0OiAxMDAwfSkudGhlbihkZWxlZ2F0ZSA9PiB0aGlzLmxvZ0NoaWxkcmVuRXJyb3JzKGRlbGVnYXRlLCBwcmVmaXgsICdwcm92aWRlcicpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gSWYgdGFibGVcbiAgICBlbHNlIGlmIChjIGluc3RhbmNlb2YgQXBwVGFibGUpIHtcbiAgICAgIGlmIChjLmludmFsaWQgJiYgYy5lZGl0ZWRSb3cgJiYgYy5lZGl0ZWRSb3cudmFsaWRhdG9yKSB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBjLmNvbnN0cnVjdG9yLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgQXBwRm9ybVV0aWxzLmxvZ0Zvcm1FcnJvcnMoYy5lZGl0ZWRSb3cudmFsaWRhdG9yLCBwcmVmaXgsIHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBJZiBmb3JtXG4gICAgZWxzZSBpZiAoYyBpbnN0YW5jZW9mIEFwcEZvcm0pIHtcbiAgICAgIGlmICghYy5lbXB0eSAmJiAhYy52YWxpZCkge1xuICAgICAgICBpZiAoYy5wZW5kaW5nKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IGMuY29uc3RydWN0b3IubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGNvbnNvbGUud2FybiggYCR7cHJlZml4fSAtPiAke3BhdGh9OiB3YWl0aW5nIHdoaWxlIHBlbmRpbmcuLi5gKTtcbiAgICAgICAgICBBcHBGb3JtVXRpbHMud2FpdFdoaWxlUGVuZGluZyhjLCB7dGltZW91dDogMTAwMH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmxvZ0NoaWxkcmVuRXJyb3JzKGMuZm9ybSwgcHJlZml4LCBwYXRoKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgQXBwRm9ybVV0aWxzLmxvZ0Zvcm1FcnJvcnMoYy5mb3JtLCBwcmVmaXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8vIElmIGVkaXRvclxuICAgIGVsc2UgaWYgKGMgaW5zdGFuY2VvZiBBcHBFZGl0b3IpIHtcbiAgICAgIGlmICghYy5lbXB0eSAmJiAhYy52YWxpZCkge1xuICAgICAgICBpZiAoYy5wZW5kaW5nKSB7XG4gICAgICAgICAgY29uc3QgcGF0aCA9IGMuY29uc3RydWN0b3IubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIGNvbnNvbGUud2FybiggYCR7cHJlZml4fSAtPiAke3BhdGh9OiB3YWl0aW5nIHdoaWxlIHBlbmRpbmcuLi5gKTtcbiAgICAgICAgICBBcHBGb3JtVXRpbHMud2FpdFdoaWxlUGVuZGluZyhjLCB7dGltZW91dDogMTAwMH0pXG4gICAgICAgICAgICAudGhlbigoKSA9PiBjLmxvZ0Zvcm1FcnJvcnMocHJlZml4KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgYy5sb2dGb3JtRXJyb3JzKHByZWZpeCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zb2xlLndhcm4oIGAke3ByZWZpeH0gVW5rbm93biBjaGlsZHJlbiBzdWItZm9ybTogYCwgYyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNldEVycm9yKHZhbHVlOiBzdHJpbmcsIG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbjt9KSB7XG4gICAgaWYgKHRoaXMuZXJyb3JTdWJqZWN0LnZhbHVlICE9PSB2YWx1ZSkge1xuICAgICAgdGhpcy5lcnJvclN1YmplY3QubmV4dCh2YWx1ZSk7XG4gICAgICBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCByZXNldEVycm9yKG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbn0pIHtcbiAgICB0aGlzLnNldEVycm9yKHVuZGVmaW5lZCwgb3B0cyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWFya0ZvckNoZWNrKCkge1xuICAgIC8vIFNob3VsZCBiZSBvdmVycmlkZSBieSBzdWJjbGFzc2VzLCBpZiBjaGFuZ2UgZGV0ZWN0aW9uIGlzIFB1c2hcbiAgfVxufVxuXG5ARGlyZWN0aXZlKClcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvZGlyZWN0aXZlLWNsYXNzLXN1ZmZpeFxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFwcFRhYkVkaXRvcjxUID0gYW55LCBJRCA9IG51bWJlciwgTyA9IGFueT5cbiAgZXh0ZW5kcyBBcHBFZGl0b3I8VCwgSUQsIE8+XG4gIGltcGxlbWVudHMgSUFwcFRhYkVkaXRvciB7XG5cbiAgcHJvdGVjdGVkIF9zZWxlY3RlZFRhYkluZGV4ID0gMDtcblxuICAvLyBFZGl0b3Igb3B0aW9uc1xuICB0YWJDb3VudDogbnVtYmVyO1xuICBlbmFibGVTd2lwZTogYm9vbGVhbjtcbiAgdGFiR3JvdXBBbmltYXRpb25EdXJhdGlvbjogc3RyaW5nO1xuXG4gIEBJbnB1dCgpIHF1ZXJ5VGFiSW5kZXhQYXJhbU5hbWU6IHN0cmluZztcblxuICBASW5wdXQoKSBzZXQgc2VsZWN0ZWRUYWJJbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRTZWxlY3RlZFRhYkluZGV4KHZhbHVlKTtcbiAgfVxuICBnZXQgc2VsZWN0ZWRUYWJJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFRhYkluZGV4O1xuICB9XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkVGFiSW5kZXhDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBAVmlld0NoaWxkKCd0YWJHcm91cCcsIHsgc3RhdGljOiB0cnVlIH0pIHRhYkdyb3VwOiBNYXRUYWJHcm91cDtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSwgLy8gTW9kYWwgZWRpdG9yIGdpdmUgJ251bGwnXG4gICAgcHJvdGVjdGVkIHJvdXRlcjogUm91dGVyLFxuICAgIHByb3RlY3RlZCBhbGVydEN0cmw6IEFsZXJ0Q29udHJvbGxlcixcbiAgICBwcm90ZWN0ZWQgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIG9wdGlvbnM/OiBBcHBUYWJFZGl0b3JPcHRpb25zKSB7XG4gICAgc3VwZXIocm91dGUsIHJvdXRlciwgYWxlcnRDdHJsLCB0cmFuc2xhdGUpO1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICB0YWJDb3VudDogMSxcbiAgICAgIGVuYWJsZVN3aXBlOiB0cnVlLFxuICAgICAgdGFiR3JvdXBBbmltYXRpb25EdXJhdGlvbjogJzIwMG1zJyxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9XG4gICAgdGhpcy50YWJDb3VudCA9IG9wdGlvbnMudGFiQ291bnQ7XG4gICAgdGhpcy5lbmFibGVTd2lwZSA9IG9wdGlvbnMuZW5hYmxlU3dpcGU7XG4gICAgdGhpcy50YWJHcm91cEFuaW1hdGlvbkR1cmF0aW9uID0gb3B0aW9ucy50YWJHcm91cEFuaW1hdGlvbkR1cmF0aW9uO1xuICAgIHRoaXMucXVlcnlUYWJJbmRleFBhcmFtTmFtZSA9ICd0YWInO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcblxuICAgIC8vIFJlYWQgdGhlIHNlbGVjdGVkIHRhYiBpbmRleCwgZnJvbSBwYXRoIHF1ZXJ5IHBhcmFtc1xuICAgIGlmICh0aGlzLnRhYkdyb3VwICYmIHRoaXMucm91dGUgJiYgdGhpcy5xdWVyeVRhYkluZGV4UGFyYW1OYW1lKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyU3Vic2NyaXB0aW9uKHRoaXMucm91dGUucXVlcnlQYXJhbXNcbiAgICAgICAgLnN1YnNjcmliZShxdWVyeVBhcmFtcyA9PiB7XG4gICAgICAgICAgdGhpcy5xdWVyeVBhcmFtcyA9IHsuLi5xdWVyeVBhcmFtc307XG5cbiAgICAgICAgICAvLyBQYXJzZSB0YWIgcGFyYW1cbiAgICAgICAgICBpZiAodGhpcy50YWJDb3VudCA+IDEgJiYgdGhpcy5xdWVyeVRhYkluZGV4UGFyYW1OYW1lKSB7XG4gICAgICAgICAgICBjb25zdCB0YWJJbmRleCA9IHF1ZXJ5UGFyYW1zW3RoaXMucXVlcnlUYWJJbmRleFBhcmFtTmFtZV07XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zW3RoaXMucXVlcnlUYWJJbmRleFBhcmFtTmFtZV0gPSB0YWJJbmRleCAmJiBwYXJzZUludCh0YWJJbmRleCkgfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKGlzTm90TmlsKHRoaXMucXVlcnlQYXJhbXNbdGhpcy5xdWVyeVRhYkluZGV4UGFyYW1OYW1lXSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gdGhpcy5xdWVyeVBhcmFtc1t0aGlzLnF1ZXJ5VGFiSW5kZXhQYXJhbU5hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlYWxpZ24gdGFiLCBhZnRlciBhIGRlbGF5IGJlY2F1c2UgdGhlIHRhYiBjYW4gYmUgZGlzYWJsZWQgd2hlbiBjb21wb25lbnQgaXMgY3JlYXRlZFxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy50YWJHcm91cC5yZWFsaWduSW5rQmFyKCksIDUwMCk7XG4gICAgICAgIH0pKTtcbiAgICB9XG4gIH1cblxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4Q2hhbmdlLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5sb2FkaW5nU3ViamVjdC51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZXJyb3JTdWJqZWN0LnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBzZXRTZWxlY3RlZFRhYkluZGV4KHZhbHVlOiBudW1iZXIsIG9wdHM/OiB7ZW1pdEV2ZW50PzogYm9vbGVhbjsgcmVhbGlnbklua0Jhcj86IGJvb2xlYW4gfSkge1xuICAgIC8vIEZpeCB2YWx1ZVxuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHZhbHVlID0gMDtcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsdWUgPiB0aGlzLnRhYkNvdW50IC0gMSkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFiLWVkaXRvcl0gSW52YWxpZCB0YWIgaW5kZXggJHt2YWx1ZX0uIE1heCB2YWx1ZSBpcyAke3RoaXMudGFiQ291bnQtMX1gKVxuICAgICAgdmFsdWUgPSB0aGlzLl9zZWxlY3RlZFRhYkluZGV4O1xuICAgIH1cblxuICAgIHRoaXMuX3NlbGVjdGVkVGFiSW5kZXggPSB2YWx1ZTtcbiAgICB0aGlzLnNlbGVjdGVkVGFiSW5kZXhDaGFuZ2UubmV4dCh2YWx1ZSk7XG5cbiAgICBpZiAodGhpcy50YWJHcm91cCAmJiAoIW9wdHMgfHwgb3B0cy5yZWFsaWduSW5rQmFyICE9PSBmYWxzZSkpIHtcbiAgICAgIHRoaXMudGFiR3JvdXAuc2VsZWN0ZWRJbmRleCA9IHZhbHVlO1xuICAgICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIC8vIFdhaXQgdGFiIGNoYW5nZSBpbiBVSSwgYmVmb3JlIHJlYWxpZ24gaW5rIHRhYlxuICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnRhYkdyb3VwLnJlYWxpZ25JbmtCYXIoKSwgMjAwKTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIW9wdHMgfHwgb3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHJlYWxpZ25JbmtCYXIoKSB7XG4gICAgdGhpcy50YWJHcm91cD8ucmVhbGlnbklua0JhcigpO1xuICB9XG5cblxuICBvblRhYkNoYW5nZShldmVudDogTWF0VGFiQ2hhbmdlRXZlbnQsIHF1ZXJ5VGFiSW5kZXhQYXJhbU5hbWU/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBxdWVyeVRhYkluZGV4UGFyYW1OYW1lID0gcXVlcnlUYWJJbmRleFBhcmFtTmFtZSB8fCB0aGlzLnF1ZXJ5VGFiSW5kZXhQYXJhbU5hbWU7XG5cbiAgICBpZiAoIXF1ZXJ5VGFiSW5kZXhQYXJhbU5hbWUgfHwgIXRoaXMucm91dGUpIHJldHVybiB0cnVlOyAvLyBTa2lwIGlmIHRhYiBxdWVyeSBwYXJhbSBub3Qgc2V0LCBvciBubyByb3V0ZVxuXG4gICAgaWYgKCF0aGlzLnF1ZXJ5UGFyYW1zIHx8ICt0aGlzLnF1ZXJ5UGFyYW1zW3F1ZXJ5VGFiSW5kZXhQYXJhbU5hbWVdICE9PSBldmVudC5pbmRleCkge1xuXG4gICAgICB0aGlzLnF1ZXJ5UGFyYW1zID0gdGhpcy5xdWVyeVBhcmFtcyB8fCB7fTtcbiAgICAgIHRoaXMucXVlcnlQYXJhbXNbcXVlcnlUYWJJbmRleFBhcmFtTmFtZV0gPSBldmVudC5pbmRleDtcblxuICAgICAgaWYgKHF1ZXJ5VGFiSW5kZXhQYXJhbU5hbWUgPT09ICd0YWInICYmIGlzTm90TmlsKHRoaXMucXVlcnlQYXJhbXNbJ3N1YnRhYiddKSkge1xuICAgICAgICBkZWxldGUgdGhpcy5xdWVyeVBhcmFtcy5zdWJ0YWI7IC8vIGNsZWFuIHN1YnRhYlxuICAgICAgfVxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycuJ10sIHtcbiAgICAgICAgcmVsYXRpdmVUbzogdGhpcy5yb3V0ZSxcbiAgICAgICAgcXVlcnlQYXJhbXM6IHRoaXMucXVlcnlQYXJhbXMsXG4gICAgICAgIHJlcGxhY2VVcmw6IHRydWVcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3Rpb24gdHJpZ2dlcmVkIHdoZW4gdXNlciBzd2lwZXNcbiAgICovXG4gIG9uU3dpcGVUYWIoZXZlbnQ6IEhhbW1lclN3aXBlRXZlbnQpOiBib29sZWFuIHtcbiAgICAvLyBERUJVR1xuICAgIC8vIGlmICh0aGlzLmRlYnVnKSBjb25zb2xlLmRlYnVnKFwiW3RhYi1wYWdlXSBvblN3aXBlVGFiKClcIik7XG5cbiAgICAvLyBTa2lwLCBpZiBub3QgYSB2YWxpZCBzd2lwZSBldmVudFxuICAgIGlmICghdGhpcy5lbmFibGVTd2lwZSB8fCAhZXZlbnRcbiAgICAgIHx8IGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgfHwgKGV2ZW50LnNyY0V2ZW50ICYmIGV2ZW50LnNyY0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpXG4gICAgICB8fCBldmVudC5wb2ludGVyVHlwZSAhPT0gJ3RvdWNoJ1xuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIERFQlVHXG4gICAgLy9pZiAodGhpcy5kZWJ1ZylcbiAgICAvL2NvbnNvbGUuZGVidWcoXCJbdGFiLXBhZ2VdIERldGVjdGVkIHN3aXBlOiBcIiArIGV2ZW50LnR5cGUsIGV2ZW50KTtcblxuICAgIGxldCBzZWxlY3RUYWJJbmRleCA9IHRoaXMuc2VsZWN0ZWRUYWJJbmRleDtcbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgIC8vIE9wZW4gbmV4dCB0YWJcbiAgICAgIGNhc2UgJ3N3aXBlbGVmdCc6XG4gICAgICAgIGNvbnN0IGlzTGFzdCA9IHNlbGVjdFRhYkluZGV4ID49ICh0aGlzLnRhYkNvdW50IC0gMSk7XG4gICAgICAgIHNlbGVjdFRhYkluZGV4ID0gaXNMYXN0ID8gMCA6IHNlbGVjdFRhYkluZGV4ICsgMTtcbiAgICAgICAgYnJlYWs7XG5cblxuICAgICAgLy8gT3BlbiBwcmV2aW91cyB0YWJcbiAgICAgIGNhc2UgJ3N3aXBlcmlnaHQnOlxuICAgICAgICBjb25zdCBpc0ZpcnN0ID0gc2VsZWN0VGFiSW5kZXggPD0gMDtcbiAgICAgICAgc2VsZWN0VGFiSW5kZXggPSBpc0ZpcnN0ID8gdGhpcy50YWJDb3VudCA6IHNlbGVjdFRhYkluZGV4IC0gMTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIC8vIE90aGVyIGNhc2VcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1t0YWItcGFnZV0gVW5rbm93biBzd2lwZSBhY3Rpb246ICcgKyBldmVudC50eXBlKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gc2VsZWN0VGFiSW5kZXg7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBvblN1YlRhYkNoYW5nZShldmVudDogTWF0VGFiQ2hhbmdlRXZlbnQpIHtcbiAgICB0aGlzLm9uVGFiQ2hhbmdlKGV2ZW50LCAnc3VidGFiJyk7XG4gIH1cblxuICBhc3luYyB1bmxvYWQob3B0cz86IHsgZW1pdEV2ZW50PzogYm9vbGVhbiB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zZWxlY3RlZFRhYkluZGV4ID0gMDtcbiAgICBhd2FpdCBzdXBlci51bmxvYWQob3B0cyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0Rmlyc3RJbnZhbGlkVGFiSW5kZXgoKTogbnVtYmVyO1xuXG4gIHByb3RlY3RlZCBhc3luYyBzYXZlRGlydHlDaGlsZHJlbigpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBTYXZlIGFsbCBkaXJ0eSB0YWJsZXNcbiAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgLi4udGhpcy50YWJsZXMsXG4gICAgICAuLi50aGlzLmVkaXRvcnNcbiAgICBdXG4gICAgICAuZmlsdGVyKGMgPT4gYy5kaXJ0eSlcbiAgICAgIC5tYXAoYyA9PiBjLnNhdmUoKSkpO1xuXG4gICAgcmV0dXJuICFyZXN1bHRzLnNvbWUoc2F2ZWQgPT4gc2F2ZWQgIT09IHRydWUpO1xuICB9XG59XG4iXX0=
|