@scion/workbench 17.0.0-beta.6 → 17.0.0-beta.8
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/README.md +1 -1
- package/esm2022/lib/activation-instant.provider.mjs +3 -3
- package/esm2022/lib/common/asserts.util.mjs +2 -2
- package/esm2022/lib/common/class-list.mjs +61 -0
- package/esm2022/lib/common/coerce-observable.pipe.mjs +3 -3
- package/esm2022/lib/common/filter-by-predicate.pipe.mjs +3 -3
- package/esm2022/lib/common/filter-by-text.pipe.mjs +3 -3
- package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +6 -6
- package/esm2022/lib/common/instanceof.pipe.mjs +3 -3
- package/esm2022/lib/common/map-coerce.pipe.mjs +3 -3
- package/esm2022/lib/common/null-if-empty.pipe.mjs +3 -3
- package/esm2022/lib/common/objects.util.mjs +34 -0
- package/esm2022/lib/common/typeof.pipe.mjs +3 -3
- package/esm2022/lib/common/uuid.util.mjs +17 -0
- package/esm2022/lib/content-projection/content-as-overlay.component.mjs +3 -3
- package/esm2022/lib/content-projection/content-projection.directive.mjs +3 -3
- package/esm2022/lib/dialog/dialog-footer/dialog-action-filter.pipe.mjs +3 -3
- package/esm2022/lib/dialog/dialog-footer/dialog-footer.component.mjs +3 -3
- package/esm2022/lib/dialog/dialog-footer/workbench-dialog-action.directive.mjs +3 -3
- package/esm2022/lib/dialog/dialog-footer/workbench-dialog-footer.directive.mjs +3 -3
- package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +3 -3
- package/esm2022/lib/dialog/dialog-header/workbench-dialog-header.directive.mjs +3 -3
- package/esm2022/lib/dialog/movable.directive.mjs +3 -3
- package/esm2022/lib/dialog/resizable.directive.mjs +3 -3
- package/esm2022/lib/dialog/workbench-dialog.component.mjs +3 -3
- package/esm2022/lib/dialog/workbench-dialog.mjs +1 -1
- package/esm2022/lib/dialog/workbench-dialog.options.mjs +1 -1
- package/esm2022/lib/dialog/workbench-dialog.registry.mjs +4 -4
- package/esm2022/lib/dialog/workbench-dialog.service.mjs +5 -5
- package/esm2022/lib/dialog//311/265workbench-dialog.mjs +8 -26
- package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +3 -3
- package/esm2022/lib/filter-field/filter-field.component.mjs +6 -6
- package/esm2022/lib/glass-pane/glass-pane.directive.mjs +3 -3
- package/esm2022/lib/layout/grid-element/grid-element.component.mjs +10 -10
- package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +7 -4
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v1.model.mjs +11 -0
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v2.model.mjs +11 -0
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v3.model.mjs +11 -0
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v4.model.mjs +11 -0
- package/esm2022/lib/layout/migration/workbench-layout-migration-v2.service.mjs +59 -0
- package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +117 -0
- package/esm2022/lib/layout/migration/workbench-layout-migration-v4.service.mjs +57 -0
- package/esm2022/lib/layout/workbench-layout.component.mjs +7 -4
- package/esm2022/lib/layout/workbench-layout.factory.mjs +4 -4
- package/esm2022/lib/layout/workbench-layout.mjs +1 -1
- package/esm2022/lib/layout/workbench-layout.model.mjs +5 -6
- package/esm2022/lib/layout/workbench-layout.service.mjs +3 -3
- package/esm2022/lib/layout/workbench-layouts.util.mjs +53 -16
- package/esm2022/lib/layout/workench-layout-serializer.service.mjs +53 -21
- package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +8 -5
- package/esm2022/lib/layout//311/265workbench-layout.mjs +382 -195
- package/esm2022/lib/logging/console-appender.service.mjs +3 -3
- package/esm2022/lib/logging/logger-names.mjs +8 -9
- package/esm2022/lib/logging/logger.mjs +3 -3
- package/esm2022/lib/logging/logging-support.mjs +4 -4
- package/esm2022/lib/logging/logging.model.mjs +3 -3
- package/esm2022/lib/logging//311/265logger.mjs +3 -3
- package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +18 -20
- package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +3 -3
- package/esm2022/lib/message-box/workbench-message-box.component.mjs +3 -3
- package/esm2022/lib/message-box/workbench-message-box.options.mjs +1 -1
- package/esm2022/lib/message-box/workbench-message-box.service.mjs +5 -5
- package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +5 -5
- package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +55 -0
- package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +34 -22
- package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +53 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +85 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +140 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +122 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +11 -10
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.service.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-notification/microfrontend-notification-intent-handler.service.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-platform-config-loader.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +30 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +130 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +18 -30
- package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +9 -31
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +88 -144
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-workbench-view.model.mjs +23 -0
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.mjs +41 -0
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +30 -0
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +125 -0
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +103 -0
- package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +45 -47
- package/esm2022/lib/migration/workbench-migration.mjs +11 -0
- package/esm2022/lib/migration/workbench-migrator.mjs +38 -0
- package/esm2022/lib/notification/notification-css-classes.pipe.mjs +3 -3
- package/esm2022/lib/notification/notification-list.component.mjs +3 -3
- package/esm2022/lib/notification/notification.component.mjs +3 -3
- package/esm2022/lib/notification/notification.config.mjs +1 -1
- package/esm2022/lib/notification/notification.mjs +1 -1
- package/esm2022/lib/notification/notification.service.mjs +9 -9
- package/esm2022/lib/notification/text-notification.component.mjs +3 -3
- package/esm2022/lib/page-not-found/format-url.pipe.mjs +26 -0
- package/esm2022/lib/page-not-found/page-not-found.component.mjs +28 -0
- package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +3 -3
- package/esm2022/lib/part/part-action-bar/part-action-filter.pipe.mjs +3 -3
- package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +4 -4
- package/esm2022/lib/part/part-bar/part-bar.component.mjs +11 -8
- package/esm2022/lib/part/part-portal.pipe.mjs +3 -3
- package/esm2022/lib/part/part.component.mjs +7 -4
- package/esm2022/lib/part/view-context-menu/accelerator-format.pipe.mjs +3 -3
- package/esm2022/lib/part/view-context-menu/text.component.mjs +3 -3
- package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +3 -3
- package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +4 -4
- package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +19 -19
- package/esm2022/lib/part/view-list/view-list.component.mjs +3 -3
- package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +3 -3
- package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +9 -9
- package/esm2022/lib/part/view-tab/view-tab.component.mjs +16 -13
- package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +5 -5
- package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +9 -9
- package/esm2022/lib/part/workbench-part-action.registry.mjs +3 -3
- package/esm2022/lib/part/workbench-part.model.mjs +1 -1
- package/esm2022/lib/part/workbench-part.registry.mjs +3 -3
- package/esm2022/lib/part//311/265workbench-part.model.mjs +3 -3
- package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v1.model.mjs +11 -0
- package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v2.model.mjs +11 -0
- package/esm2022/lib/perspective/migration/workbench-perspective-migration-v2.service.mjs +57 -0
- package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +19 -51
- package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +23 -18
- package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +27 -42
- package/esm2022/lib/perspective/workbench-perspective.model.mjs +1 -1
- package/esm2022/lib/perspective/workbench-perspective.registry.mjs +3 -3
- package/esm2022/lib/perspective/workbench-perspective.service.mjs +15 -10
- package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +62 -0
- package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +98 -78
- package/esm2022/lib/popup/popup.component.mjs +3 -3
- package/esm2022/lib/popup/popup.config.mjs +1 -1
- package/esm2022/lib/popup/popup.service.mjs +3 -3
- package/esm2022/lib/portal/workbench-portal-outlet.directive.mjs +6 -6
- package/esm2022/lib/public_api.mjs +3 -2
- package/esm2022/lib/registry/workbench-object-registry.mjs +3 -3
- package/esm2022/lib/routing/empty-outlet/empty-outlet.component.mjs +31 -0
- package/esm2022/lib/routing/public_api.mjs +1 -1
- package/esm2022/lib/routing/router.util.mjs +96 -71
- package/esm2022/lib/routing/routing.model.mjs +11 -0
- package/esm2022/lib/routing/url-segment-matcher.mjs +46 -0
- package/esm2022/lib/routing/workbench-auxiliary-routes-registrator.service.mjs +58 -50
- package/esm2022/lib/routing/workbench-dialog-differ.mjs +51 -0
- package/esm2022/lib/routing/workbench-layout-differ.mjs +14 -17
- package/esm2022/lib/routing/workbench-navigational-states.mjs +11 -25
- package/esm2022/lib/routing/workbench-popup-differ.mjs +6 -6
- package/esm2022/lib/routing/workbench-route-data.mjs +15 -14
- package/esm2022/lib/routing/workbench-router-link.directive.mjs +24 -33
- package/esm2022/lib/routing/workbench-router.service.mjs +13 -378
- package/esm2022/lib/routing/workbench-url-observer.service.mjs +65 -36
- package/esm2022/lib/routing//311/265location.mjs +3 -3
- package/esm2022/lib/routing//311/265workbench-router.service.mjs +317 -0
- package/esm2022/lib/startup/splash/splash.component.mjs +3 -3
- package/esm2022/lib/startup/workbench-launcher.service.mjs +11 -11
- package/esm2022/lib/storage/workbench-storage.mjs +3 -3
- package/esm2022/lib/testing/public_api.mjs +2 -1
- package/esm2022/lib/testing/workbench-testing.module.mjs +13 -39
- package/esm2022/lib/testing/workbench.provider.mjs +60 -0
- package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +3 -3
- package/esm2022/lib/view/public_api.mjs +2 -1
- package/esm2022/lib/view/view-move-handler.service.mjs +42 -62
- package/esm2022/lib/view/view-portal.pipe.mjs +4 -4
- package/esm2022/lib/view/view.component.mjs +8 -38
- package/esm2022/lib/view/workbench-view-route-guards.mjs +47 -0
- package/esm2022/lib/view/workbench-view.model.mjs +6 -4
- package/esm2022/lib/view/workbench-view.registry.mjs +4 -4
- package/esm2022/lib/view//311/265workbench-view.model.mjs +135 -28
- package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +33 -32
- package/esm2022/lib/view-dnd/requires-drop-zone.pipe.mjs +7 -7
- package/esm2022/lib/view-dnd/view-drag.service.mjs +6 -6
- package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +3 -3
- package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +4 -4
- package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +11 -9
- package/esm2022/lib/workbench-config.mjs +15 -0
- package/esm2022/lib/workbench-id.mjs +3 -3
- package/esm2022/lib/workbench.component.mjs +14 -10
- package/esm2022/lib/workbench.constants.mjs +8 -10
- package/esm2022/lib/workbench.model.mjs +1 -1
- package/esm2022/lib/workbench.module.mjs +15 -86
- package/esm2022/lib/workbench.provider.mjs +117 -0
- package/esm2022/lib/workbench.service.mjs +5 -5
- package/esm2022/lib//311/265workbench.service.mjs +15 -21
- package/fesm2022/scion-workbench.mjs +5527 -4289
- package/fesm2022/scion-workbench.mjs.map +1 -1
- package/lib/common/class-list.d.ts +51 -0
- package/lib/common/objects.util.d.ts +17 -0
- package/lib/common/uuid.util.d.ts +8 -0
- package/lib/dialog/workbench-dialog.d.ts +3 -7
- package/lib/dialog/workbench-dialog.options.d.ts +5 -4
- package/lib/dialog/workbench-dialog.registry.d.ts +4 -3
- package/lib/dialog/workbench-dialog.service.d.ts +1 -1
- package/lib/dialog//311/265workbench-dialog.d.ts +4 -6
- package/lib/filter-field/filter-field.component.d.ts +1 -1
- package/lib/layout/grid-element/grid-element.component.d.ts +2 -2
- package/lib/layout/migration/model/workbench-layout-migration-v1.model.d.ts +16 -0
- package/lib/layout/migration/model/workbench-layout-migration-v2.model.d.ts +22 -0
- package/lib/layout/migration/model/workbench-layout-migration-v3.model.d.ts +30 -0
- package/lib/layout/migration/model/workbench-layout-migration-v4.model.d.ts +31 -0
- package/lib/layout/migration/workbench-layout-migration-v2.service.d.ts +13 -0
- package/lib/layout/migration/workbench-layout-migration-v3.service.d.ts +16 -0
- package/lib/layout/migration/workbench-layout-migration-v4.service.d.ts +12 -0
- package/lib/layout/workbench-layout.d.ts +61 -7
- package/lib/layout/workbench-layout.factory.d.ts +1 -1
- package/lib/layout/workbench-layout.model.d.ts +19 -9
- package/lib/layout/workbench-layouts.util.d.ts +22 -6
- package/lib/layout/workench-layout-serializer.service.d.ts +28 -7
- package/lib/layout//311/265workbench-layout.d.ts +172 -98
- package/lib/layout//311/265workbench-layout.factory.d.ts +4 -0
- package/lib/logging/logger-names.d.ts +7 -7
- package/lib/logging/logging-support.d.ts +2 -2
- package/lib/message-box/workbench-message-box.options.d.ts +4 -3
- package/lib/message-box/workbench-message-box.service.d.ts +1 -1
- package/lib/microfrontend-platform/common/microfrontend.util.d.ts +22 -0
- package/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.d.ts +15 -9
- package/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.d.ts +11 -0
- package/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.d.ts +28 -0
- package/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.d.ts +52 -0
- package/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.d.ts +37 -0
- package/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.d.ts +2 -1
- package/lib/microfrontend-platform/microfrontend-popup/{microfrontend-popup-capability-interceptor.service.d.ts → microfrontend-popup-capability-validator.interceptor.d.ts} +3 -3
- package/lib/microfrontend-platform/microfrontend-popup/{microfrontend-popup-intent-interceptor.service.d.ts → microfrontend-popup-intent-handler.interceptor.d.ts} +9 -6
- package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.d.ts +7 -10
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.d.ts +2 -9
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.d.ts +12 -23
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-workbench-view.model.d.ts +14 -0
- package/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.d.ts +10 -0
- package/lib/microfrontend-platform/routing/{microfrontend-view-capability-interceptor.service.d.ts → microfrontend-view-capability-validator.interceptor.d.ts} +3 -3
- package/lib/microfrontend-platform/routing/{microfrontend-view-intent-interceptor.service.d.ts → microfrontend-view-intent-handler.interceptor.d.ts} +6 -5
- package/lib/microfrontend-platform/routing/microfrontend-view-routes.d.ts +49 -0
- package/lib/microfrontend-platform/workbench-microfrontend-support.d.ts +3 -2
- package/lib/migration/workbench-migration.d.ts +9 -0
- package/lib/migration/workbench-migrator.d.ts +18 -0
- package/lib/notification/notification.config.d.ts +1 -1
- package/lib/notification/notification.d.ts +1 -3
- package/lib/page-not-found/format-url.pipe.d.ts +11 -0
- package/lib/page-not-found/page-not-found.component.d.ts +8 -0
- package/lib/part/part-action-bar/part-action.directive.d.ts +1 -1
- package/lib/part/part-bar/part-bar.component.d.ts +4 -3
- package/lib/part/view-context-menu/view-menu.directive.d.ts +1 -1
- package/lib/part/view-context-menu/view-menu.service.d.ts +5 -4
- package/lib/part/view-list-item/view-list-item.component.d.ts +5 -4
- package/lib/part/view-tab/view-tab.component.d.ts +6 -5
- package/lib/part/view-tab-drag-image/view-tab-drag-image.component.d.ts +3 -3
- package/lib/part/workbench-part.model.d.ts +5 -4
- package/lib/part//311/265workbench-part.model.d.ts +5 -4
- package/lib/perspective/migration/model/workbench-perspective-migration-v1.model.d.ts +8 -0
- package/lib/perspective/migration/model/workbench-perspective-migration-v2.model.d.ts +10 -0
- package/lib/perspective/migration/workbench-perspective-migration-v2.service.d.ts +13 -0
- package/lib/perspective/workbench-grid-merger.service.d.ts +9 -16
- package/lib/perspective/workbench-perspective-storage.service.d.ts +10 -28
- package/lib/perspective/workbench-perspective-view-conflict-resolver.service.d.ts +8 -25
- package/lib/perspective/workbench-perspective.model.d.ts +123 -14
- package/lib/perspective/workbench-perspective.service.d.ts +10 -3
- package/lib/perspective/workench-perspective-serializer.service.d.ts +26 -0
- package/lib/perspective//311/265workbench-perspective.model.d.ts +16 -14
- package/lib/popup/popup.config.d.ts +4 -3
- package/lib/portal/workbench-portal-outlet.directive.d.ts +2 -2
- package/lib/public_api.d.ts +4 -3
- package/lib/registry/workbench-object-registry.d.ts +2 -2
- package/lib/routing/empty-outlet/empty-outlet.component.d.ts +15 -0
- package/lib/routing/public_api.d.ts +2 -1
- package/lib/routing/router.util.d.ts +45 -31
- package/lib/routing/routing.model.d.ts +129 -0
- package/lib/routing/url-segment-matcher.d.ts +20 -0
- package/lib/routing/workbench-auxiliary-routes-registrator.service.d.ts +25 -16
- package/lib/routing/workbench-dialog-differ.d.ts +25 -0
- package/lib/routing/workbench-layout-differ.d.ts +4 -7
- package/lib/routing/workbench-navigational-states.d.ts +11 -21
- package/lib/routing/workbench-route-data.d.ts +14 -12
- package/lib/routing/workbench-router-link.directive.d.ts +22 -7
- package/lib/routing/workbench-router.service.d.ts +42 -157
- package/lib/routing/workbench-url-observer.service.d.ts +18 -6
- package/lib/routing//311/265workbench-router.service.d.ts +75 -0
- package/lib/startup/workbench-launcher.service.d.ts +4 -4
- package/lib/testing/public_api.d.ts +1 -0
- package/lib/testing/workbench-testing.module.d.ts +7 -6
- package/lib/testing/workbench.provider.d.ts +29 -0
- package/lib/view/public_api.d.ts +2 -1
- package/lib/view/view-move-handler.service.d.ts +2 -4
- package/lib/view/view-portal.pipe.d.ts +2 -1
- package/lib/view/view.component.d.ts +1 -11
- package/lib/view/workbench-view-route-guards.d.ts +36 -0
- package/lib/view/workbench-view.model.d.ts +46 -13
- package/lib/view/workbench-view.registry.d.ts +4 -3
- package/lib/view//311/265workbench-view.model.d.ts +79 -14
- package/lib/view-dnd/grid-drop-targets.util.d.ts +15 -17
- package/lib/view-dnd/view-drag.service.d.ts +12 -4
- package/lib/view-dnd/view-drop-zone.directive.d.ts +1 -1
- package/lib/{workbench-module-config.d.ts → workbench-config.d.ts} +29 -71
- package/lib/workbench.component.d.ts +2 -2
- package/lib/workbench.constants.d.ts +6 -8
- package/lib/workbench.model.d.ts +20 -8
- package/lib/workbench.module.d.ts +12 -7
- package/lib/workbench.provider.d.ts +38 -0
- package/lib/workbench.service.d.ts +32 -8
- package/lib//311/265workbench.service.d.ts +9 -3
- package/package.json +8 -8
- package/esm2022/lib/layout/migration/workbench-layout-migrator.service.mjs +0 -38
- package/esm2022/lib/layout/migration/workbench-layout-v1-migrator.service.mjs +0 -59
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-interceptor.service.mjs +0 -30
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-interceptor.service.mjs +0 -130
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-navigational-states.mjs +0 -22
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-routes.mjs +0 -71
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-interceptor.service.mjs +0 -54
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-interceptor.service.mjs +0 -123
- package/esm2022/lib/routing/navigation-state.resolver.mjs +0 -54
- package/esm2022/lib/view/workbench-view-pre-destroy.guard.mjs +0 -36
- package/esm2022/lib/workbench-module-config.mjs +0 -15
- package/lib/layout/migration/workbench-layout-migrator.service.d.ts +0 -15
- package/lib/layout/migration/workbench-layout-v1-migrator.service.d.ts +0 -12
- package/lib/microfrontend-platform/routing/microfrontend-navigational-states.d.ts +0 -11
- package/lib/microfrontend-platform/routing/microfrontend-routes.d.ts +0 -38
- package/lib/routing/navigation-state.resolver.d.ts +0 -12
- package/lib/view/workbench-view-pre-destroy.guard.d.ts +0 -5
|
@@ -1,384 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials are made
|
|
5
|
-
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
-
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
-
*
|
|
8
|
-
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
-
*/
|
|
10
|
-
import { PRIMARY_OUTLET, UrlSegment } from '@angular/router';
|
|
11
|
-
import { Defined } from '@scion/toolkit/util';
|
|
12
|
-
import { Injectable, NgZone } from '@angular/core';
|
|
13
|
-
import { MAIN_AREA_LAYOUT_QUERY_PARAM } from '../workbench.constants';
|
|
14
|
-
import { SingleTaskExecutor } from '../executor/single-task-executor';
|
|
15
|
-
import { firstValueFrom } from 'rxjs';
|
|
16
|
-
import { WorkbenchNavigationalStates, WorkbenchNavigationalViewStates } from './workbench-navigational-states';
|
|
17
|
-
import { ɵWorkbenchLayout } from '../layout/ɵworkbench-layout';
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { ɵWorkbenchRouter } from './ɵworkbench-router.service';
|
|
18
3
|
import * as i0 from "@angular/core";
|
|
19
|
-
import * as i1 from "@angular/router";
|
|
20
|
-
import * as i2 from "../view/workbench-view.registry";
|
|
21
|
-
import * as i3 from "../layout/workbench-layout.service";
|
|
22
4
|
/**
|
|
23
|
-
*
|
|
5
|
+
* Enables navigation of workbench views and modification of the workbench layout.
|
|
6
|
+
*
|
|
7
|
+
* A view is a visual workbench element for displaying content side-by-side or stacked. A view can be navigated to any route.
|
|
8
|
+
*
|
|
9
|
+
* A view can inject `ActivatedRoute` to obtain parameters passed to the navigation and/or read data associated with the route.
|
|
24
10
|
*/
|
|
25
11
|
export class WorkbenchRouter {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
this._viewRegistry = _viewRegistry;
|
|
29
|
-
this._workbenchLayoutService = _workbenchLayoutService;
|
|
30
|
-
this._zone = _zone;
|
|
31
|
-
this._singleTaskExecutor = new SingleTaskExecutor();
|
|
32
|
-
/**
|
|
33
|
-
* Holds the current navigational context during a workbench navigation, or `null` if no navigation is in progress.
|
|
34
|
-
*/
|
|
35
|
-
this._currentNavigationContext = null;
|
|
36
|
-
// Instruct the Angular router to process navigations that do not change the current URL, i.e., when only updating navigation state.
|
|
37
|
-
// For example, the workbench grid is passed to the navigation as state, not as a query parameter. Without this flag set, changes to
|
|
38
|
-
// the workbench grid would not be added to the browsing history stack.
|
|
39
|
-
// Although the `onSameUrlNavigation` flag can be set per navigation via the navigation extras, this is not sufficient because the
|
|
40
|
-
// Angular router ignores it when navigating back and forth in the browsing history.
|
|
41
|
-
// See Angular router.ts#setUpLocationChangeListener and router.ts#navigateToSyncWithBrowser
|
|
42
|
-
this._router.onSameUrlNavigation = 'reload';
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Navigates based on the provided array of commands, and is like 'Router.navigate(...)' but with a workbench view as the router outlet target.
|
|
46
|
-
* Navigation is absolute unless providing a `relativeTo` route in navigational extras.
|
|
47
|
-
*
|
|
48
|
-
* By passing navigation extras, you can control navigation. By default, the router opens a new view tab if no view is found that matches the
|
|
49
|
-
* specified path. Matrix parameters do not affect view resolution. If one (or more) view(s) match the specified path, they are navigated
|
|
50
|
-
* instead of opening the view in a new view tab, e.g., to update matrix parameters.
|
|
51
|
-
*
|
|
52
|
-
* The router supports for closing views matching the routing commands by setting `close` in navigational extras.
|
|
53
|
-
*
|
|
54
|
-
* ### Commands
|
|
55
|
-
* - Multiple static segments can be merged into one, e.g. `['/team/11/user', userName, {details: true}]`
|
|
56
|
-
* - The first segment name can be prepended with `/`, `./`, or `../`
|
|
57
|
-
* - Matrix parameters can be used to associate optional data with the URL, e.g. `['user', userName, {details: true}]`
|
|
58
|
-
* Matrix parameters are like regular URL parameters, but do not affect route and view resolution. Unlike query parameters, matrix parameters
|
|
59
|
-
* are not global but part of the routing path, which makes them suitable for auxiliary routes.
|
|
60
|
-
*
|
|
61
|
-
* ### Usage
|
|
62
|
-
*
|
|
63
|
-
* ```
|
|
64
|
-
* router.navigate(['team', 33, 'user', 11]);
|
|
65
|
-
* router.navigate(['team/11/user', userName, {details: true}]); // multiple static segments can be merged into one
|
|
66
|
-
* router.navigate(['teams', {selection: 33'}]); // matrix parameter 'selection' with the value '33'.
|
|
67
|
-
* ```
|
|
68
|
-
*
|
|
69
|
-
* @see WorkbenchRouterLinkDirective
|
|
70
|
-
*/
|
|
71
|
-
navigate(commands, extras = {}) {
|
|
72
|
-
// Ensure to run in Angular zone.
|
|
73
|
-
if (!NgZone.isInAngularZone()) {
|
|
74
|
-
return this._zone.run(() => this.navigate(commands, extras));
|
|
75
|
-
}
|
|
76
|
-
if (extras.close) {
|
|
77
|
-
return this.ɵnavigate((layout) => {
|
|
78
|
-
if (extras.target) {
|
|
79
|
-
const viewId = extras.target;
|
|
80
|
-
if (commands.length) {
|
|
81
|
-
throw Error(`[WorkbenchRouterError][IllegalArgumentError] The commands must be empty if closing a view by viewId [commands=${commands}]`);
|
|
82
|
-
}
|
|
83
|
-
if (!layout.views().some(view => view.id === viewId)) {
|
|
84
|
-
return null;
|
|
85
|
-
}
|
|
86
|
-
return removeView(viewId, layout);
|
|
87
|
-
}
|
|
88
|
-
const viewIds = this.resolvePresentViewIds(commands, { relativeTo: extras.relativeTo, matchWildcardSegments: true });
|
|
89
|
-
return viewIds.reduce((navigation, viewId) => removeView(viewId, navigation), { layout });
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
return this.ɵnavigate((layout) => {
|
|
93
|
-
switch (extras.target ?? 'auto') {
|
|
94
|
-
case 'blank': {
|
|
95
|
-
return addView(layout.computeNextViewId(), layout);
|
|
96
|
-
}
|
|
97
|
-
case 'auto': {
|
|
98
|
-
const viewIds = this.resolvePresentViewIds(commands, { relativeTo: extras.relativeTo });
|
|
99
|
-
if (viewIds.length) {
|
|
100
|
-
return viewIds.reduce((navigation, viewId) => updateView(viewId, navigation), { layout });
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
return addView(layout.computeNextViewId(), layout);
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
default: {
|
|
107
|
-
const viewId = extras.target;
|
|
108
|
-
if (layout.views().some(view => view.id === viewId)) {
|
|
109
|
-
return updateView(viewId, layout);
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
return addView(viewId, layout);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
}, extras);
|
|
117
|
-
/**
|
|
118
|
-
* Creates the navigation for adding the specified view to the workbench layout.
|
|
119
|
-
*/
|
|
120
|
-
function addView(viewId, layout) {
|
|
121
|
-
const partId = (() => {
|
|
122
|
-
if (extras.blankPartId && layout.hasPart(extras.blankPartId)) {
|
|
123
|
-
return extras.blankPartId;
|
|
124
|
-
}
|
|
125
|
-
return layout.activePart({ grid: 'mainArea' })?.id ?? layout.activePart({ grid: 'workbench' }).id;
|
|
126
|
-
})();
|
|
127
|
-
return {
|
|
128
|
-
layout: layout.addView(viewId, {
|
|
129
|
-
partId,
|
|
130
|
-
position: extras.blankInsertionIndex ?? 'after-active-view',
|
|
131
|
-
activateView: extras.activate ?? true,
|
|
132
|
-
}),
|
|
133
|
-
viewOutlets: commands.length ? { [viewId]: commands } : {},
|
|
134
|
-
viewStates: { [viewId]: { [WorkbenchNavigationalViewStates.cssClass]: extras.cssClass } },
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Creates the navigation for updating the path of the specified view.
|
|
139
|
-
*/
|
|
140
|
-
function updateView(viewId, layout) {
|
|
141
|
-
const navigation = coerceNavigation(layout);
|
|
142
|
-
const activateView = extras.activate ?? true;
|
|
143
|
-
return {
|
|
144
|
-
layout: activateView ? navigation.layout.activateView(viewId) : navigation.layout,
|
|
145
|
-
viewOutlets: { ...navigation.viewOutlets, ...(commands.length ? { [viewId]: commands } : {}) },
|
|
146
|
-
viewStates: { ...navigation.viewStates, [viewId]: { [WorkbenchNavigationalViewStates.cssClass]: extras.cssClass } },
|
|
147
|
-
};
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Creates the navigation for removing the specified view from the workbench layout.
|
|
151
|
-
*/
|
|
152
|
-
function removeView(viewId, layout) {
|
|
153
|
-
const navigation = coerceNavigation(layout);
|
|
154
|
-
return {
|
|
155
|
-
layout: navigation.layout.removeView(viewId),
|
|
156
|
-
viewOutlets: { ...navigation.viewOutlets, [viewId]: null },
|
|
157
|
-
viewStates: navigation.viewStates,
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Experimental API for modifying the workbench layout.
|
|
163
|
-
*
|
|
164
|
-
* @param onNavigate - Callback to modify the current layout.
|
|
165
|
-
* The callback is passed the current layout which can be modified and returned for navigation. Returning `null` does not perform the navigation.
|
|
166
|
-
* @param extras - Controls how to perform the navigation.
|
|
167
|
-
*/
|
|
168
|
-
ɵnavigate(onNavigate, extras) {
|
|
169
|
-
// Ensure to run in Angular zone.
|
|
170
|
-
if (!NgZone.isInAngularZone()) {
|
|
171
|
-
return this._zone.run(() => this.ɵnavigate(onNavigate, extras));
|
|
172
|
-
}
|
|
173
|
-
// Serialize navigation requests to prevent race conditions when modifying the currently active workbench layout.
|
|
174
|
-
return this._singleTaskExecutor.submit(async () => {
|
|
175
|
-
// Wait until the initial layout is available, i.e., after completion of Angular's initial navigation.
|
|
176
|
-
// Otherwise, this navigation would override the initial layout as given in the URL.
|
|
177
|
-
if (!this._workbenchLayoutService.layout) {
|
|
178
|
-
await this.waitForInitialLayout();
|
|
179
|
-
}
|
|
180
|
-
// Pass control to the navigator to compute the new workbench layout.
|
|
181
|
-
const navigation = coerceNavigation(await onNavigate(this._workbenchLayoutService.layout));
|
|
182
|
-
if (!navigation) {
|
|
183
|
-
return true;
|
|
184
|
-
}
|
|
185
|
-
// Add user-defined state from navigation extras to the view state.
|
|
186
|
-
// NOTE: We must ensure that a view state object is associated for each outlet to be navigated.
|
|
187
|
-
// Otherwise, if the state object were `null` or `undefined`, {@link NavigationStateResolver} would restore the state of the previously activated route.
|
|
188
|
-
const viewStates = Object.keys(navigation.viewOutlets || {}).reduce((viewStates, viewId) => {
|
|
189
|
-
viewStates[viewId] = { ...viewStates[viewId], ...extras?.state };
|
|
190
|
-
return viewStates;
|
|
191
|
-
}, navigation.viewStates || {});
|
|
192
|
-
// Instruct the router to process the navigation even if the URL does not change, e.g., when changing the workbench grid which is not contained in the URL.
|
|
193
|
-
extras = { ...extras, onSameUrlNavigation: 'reload' };
|
|
194
|
-
// Serialize the layout.
|
|
195
|
-
const serializedLayout = navigation.layout.serialize();
|
|
196
|
-
// Associate workbench-specific state with the navigation.
|
|
197
|
-
WorkbenchNavigationalStates.addToNavigationExtras(extras, {
|
|
198
|
-
workbenchGrid: serializedLayout.workbenchGrid,
|
|
199
|
-
maximized: navigation.layout.maximized,
|
|
200
|
-
viewStates,
|
|
201
|
-
});
|
|
202
|
-
// Compute the new URL tree.
|
|
203
|
-
const urlTree = this.__createUrlTree(navigation.viewOutlets, serializedLayout.mainAreaGrid, extras);
|
|
204
|
-
// Perform the navigation.
|
|
205
|
-
if (!(await this._router.navigateByUrl(urlTree, extras))) {
|
|
206
|
-
return false;
|
|
207
|
-
}
|
|
208
|
-
// Block subsequent navigation(s) until Angular has flushed the changed layout to the DOM.
|
|
209
|
-
await firstValueFrom(this._zone.onStable);
|
|
210
|
-
return true;
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Experimental API to replace {@link WorkbenchRouter#navigate} for navigating views and modifying the layout.
|
|
215
|
-
*
|
|
216
|
-
* @param onNavigate - Computes the new workbench layout.
|
|
217
|
-
* The callback is passed the current workbench layout which the caller can modify and return.
|
|
218
|
-
* In the callback, it is safe to access currently activated routes or the current router url.
|
|
219
|
-
* @param extras - Options to control navigation.
|
|
220
|
-
*
|
|
221
|
-
* @internal
|
|
222
|
-
*/
|
|
223
|
-
async createUrlTree(onNavigate, extras) {
|
|
224
|
-
// Ensure to run in Angular zone.
|
|
225
|
-
if (!NgZone.isInAngularZone()) {
|
|
226
|
-
return this._zone.run(() => this.createUrlTree(onNavigate, extras));
|
|
227
|
-
}
|
|
228
|
-
return this._singleTaskExecutor.submit(async () => {
|
|
229
|
-
// Wait until the initial layout is available, i.e., after completion of Angular's initial navigation.
|
|
230
|
-
// Otherwise, would override the initial layout as given in the URL.
|
|
231
|
-
if (!this._workbenchLayoutService.layout) {
|
|
232
|
-
await this.waitForInitialLayout();
|
|
233
|
-
}
|
|
234
|
-
// Pass control to the navigator to compute the new workbench layout.
|
|
235
|
-
const navigation = coerceNavigation(await onNavigate(this._workbenchLayoutService.layout));
|
|
236
|
-
// create the URL tree.
|
|
237
|
-
return this.__createUrlTree(navigation.viewOutlets, navigation.layout.serialize().mainAreaGrid, extras);
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* This method name begins with underscores to indicate that it must only be invoked from within {@link SingleTaskExecutor}.
|
|
242
|
-
*/
|
|
243
|
-
__createUrlTree(viewOutlets, serializedMainAreaGrid, extras) {
|
|
244
|
-
// Normalize commands of the outlets to their absolute form and resolve relative navigational symbols.
|
|
245
|
-
const normalizedViewOutlets = this.normalizeOutletCommands(viewOutlets, extras?.relativeTo);
|
|
246
|
-
// Add view outlets as 'outlets' fragment to be interpreted by Angular.
|
|
247
|
-
const commands = normalizedViewOutlets ? [{ outlets: normalizedViewOutlets }] : [];
|
|
248
|
-
// Let Angular Router construct the URL tree.
|
|
249
|
-
return this._router.createUrlTree(commands, {
|
|
250
|
-
...extras,
|
|
251
|
-
queryParams: { ...extras?.queryParams, [MAIN_AREA_LAYOUT_QUERY_PARAM]: serializedMainAreaGrid },
|
|
252
|
-
// Merge with existing query params unless specified an explicit strategy, e.g., for migrating an outdated layout URL.
|
|
253
|
-
// Note that `null` is a valid strategy for clearing existing query params, so do not use the nullish coalescing operator (??).
|
|
254
|
-
queryParamsHandling: Defined.orElse(extras?.queryParamsHandling, 'merge'),
|
|
255
|
-
relativeTo: null, // commands are normalized to their absolute form
|
|
256
|
-
});
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* @see normalizeCommands
|
|
260
|
-
*/
|
|
261
|
-
normalizeOutletCommands(outlets, relativeTo) {
|
|
262
|
-
if (!outlets || !Object.keys(outlets).length) {
|
|
263
|
-
return null;
|
|
264
|
-
}
|
|
265
|
-
return Object.entries(outlets).reduce((acc, [outletName, commands]) => {
|
|
266
|
-
return {
|
|
267
|
-
...acc,
|
|
268
|
-
[outletName]: commands ? this.normalizeCommands(commands, relativeTo) : null, // `null` to remove an outlet
|
|
269
|
-
};
|
|
270
|
-
}, {});
|
|
271
|
-
}
|
|
272
|
-
/**
|
|
273
|
-
* Normalizes commands to their absolute form.
|
|
274
|
-
*
|
|
275
|
-
* ---
|
|
276
|
-
* As of Angular 6.x, commands which target a named outlet (auxiliary route) are not normalized, meaning that
|
|
277
|
-
* relative navigational symbols like `/`, `./`, or `../` are not resolved (see `create_url_tree.ts` method: `computeNavigation`).
|
|
278
|
-
*
|
|
279
|
-
* Example: router.navigate([{outlets: {[outlet]: commands}}])
|
|
280
|
-
*
|
|
281
|
-
* To bypass that restriction, we first create a URL tree without specifying the target outlet. As expected, this translates into a
|
|
282
|
-
* URL with all navigational symbols resolved. Then, we extract the URL segments of the resolved route and convert it back into commands.
|
|
283
|
-
* The resulting commands are in their absolute form and may be used for the effective navigation to target a named router outlet.
|
|
284
|
-
*/
|
|
285
|
-
normalizeCommands(commands, relativeTo) {
|
|
286
|
-
if (!commands.length) {
|
|
287
|
-
return [];
|
|
288
|
-
}
|
|
289
|
-
// Ensure to run in Angular zone.
|
|
290
|
-
if (!NgZone.isInAngularZone()) {
|
|
291
|
-
return this._zone.run(() => this.normalizeCommands(commands, relativeTo));
|
|
292
|
-
}
|
|
293
|
-
const normalizeFn = (outlet, extras) => {
|
|
294
|
-
return this._router.createUrlTree(commands, extras)
|
|
295
|
-
.root.children[outlet].segments
|
|
296
|
-
.reduce((acc, p) => [...acc, p.path, ...(Object.keys(p.parameters).length ? [p.parameters] : [])], []);
|
|
297
|
-
};
|
|
298
|
-
if (!relativeTo) {
|
|
299
|
-
return normalizeFn(PRIMARY_OUTLET);
|
|
300
|
-
}
|
|
301
|
-
const targetOutlet = relativeTo.pathFromRoot[1]?.outlet;
|
|
302
|
-
if (!targetOutlet) {
|
|
303
|
-
return normalizeFn(PRIMARY_OUTLET);
|
|
304
|
-
}
|
|
305
|
-
return normalizeFn(targetOutlet, { relativeTo });
|
|
306
|
-
}
|
|
307
|
-
/**
|
|
308
|
-
* Resolves present views which match the given commands.
|
|
309
|
-
*
|
|
310
|
-
* Allows matching wildcard segments by setting the option `matchWildcardSegments` to `true`.
|
|
311
|
-
*
|
|
312
|
-
* @internal
|
|
313
|
-
*/
|
|
314
|
-
resolvePresentViewIds(commandList, options) {
|
|
315
|
-
const commands = this.normalizeCommands(commandList, options?.relativeTo);
|
|
316
|
-
const commandPath = this.serializeCommands(commands, { skipMatrixParams: true });
|
|
317
|
-
const matchWildcardSegments = options?.matchWildcardSegments ?? false;
|
|
318
|
-
return this._viewRegistry.views
|
|
319
|
-
.filter(view => {
|
|
320
|
-
const viewPath = view.urlSegments.map(segment => segment.path);
|
|
321
|
-
if (commandPath.length !== viewPath.length) {
|
|
322
|
-
return false;
|
|
323
|
-
}
|
|
324
|
-
return commandPath.every((commandSegment, index) => (matchWildcardSegments && commandSegment === '*') || commandSegment === viewPath[index]);
|
|
325
|
-
})
|
|
326
|
-
.map(view => view.id);
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Returns the context of the current workbench navigation, when being invoked during navigation, or throws an error otherwise.
|
|
330
|
-
*
|
|
331
|
-
* @internal
|
|
332
|
-
*/
|
|
333
|
-
getCurrentNavigationContext() {
|
|
334
|
-
if (!this._currentNavigationContext) {
|
|
335
|
-
throw Error('[WorkbenchRouterError] Navigation context not available as no navigation is in progress.');
|
|
336
|
-
}
|
|
337
|
-
return this._currentNavigationContext;
|
|
338
|
-
}
|
|
339
|
-
/**
|
|
340
|
-
* Sets navigational contextual data.
|
|
341
|
-
*
|
|
342
|
-
* @internal
|
|
343
|
-
*/
|
|
344
|
-
setCurrentNavigationContext(context) {
|
|
345
|
-
this._currentNavigationContext = context;
|
|
346
|
-
}
|
|
347
|
-
/**
|
|
348
|
-
* Blocks until the initial layout is available, i.e. after completion of Angular's initial navigation.
|
|
349
|
-
*/
|
|
350
|
-
async waitForInitialLayout() {
|
|
351
|
-
await firstValueFrom(this._workbenchLayoutService.layout$);
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Serializes given commands into valid URL segments.
|
|
355
|
-
*/
|
|
356
|
-
serializeCommands(commands, options) {
|
|
357
|
-
const serializedCommands = [];
|
|
358
|
-
const skipMatrixParams = options?.skipMatrixParams ?? false;
|
|
359
|
-
commands.forEach(cmd => {
|
|
360
|
-
// if matrix param, append it to the last segment
|
|
361
|
-
const isMatrixParam = typeof cmd === 'object';
|
|
362
|
-
if (!isMatrixParam) {
|
|
363
|
-
serializedCommands.push(encodeURIComponent(cmd));
|
|
364
|
-
}
|
|
365
|
-
else if (!skipMatrixParams) {
|
|
366
|
-
serializedCommands.push(new UrlSegment(serializedCommands.pop(), cmd).toString());
|
|
367
|
-
}
|
|
368
|
-
});
|
|
369
|
-
return serializedCommands;
|
|
370
|
-
}
|
|
371
|
-
ngOnDestroy() {
|
|
372
|
-
this._singleTaskExecutor.destroy();
|
|
373
|
-
}
|
|
374
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: WorkbenchRouter, deps: [{ token: i1.Router }, { token: i2.WorkbenchViewRegistry }, { token: i3.WorkbenchLayoutService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
375
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.3", ngImport: i0, type: WorkbenchRouter, providedIn: 'root' }); }
|
|
12
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: WorkbenchRouter, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
13
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: WorkbenchRouter, providedIn: 'root', useExisting: ɵWorkbenchRouter }); }
|
|
376
14
|
}
|
|
377
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.
|
|
15
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: WorkbenchRouter, decorators: [{
|
|
378
16
|
type: Injectable,
|
|
379
|
-
args: [{ providedIn: 'root' }]
|
|
380
|
-
}]
|
|
381
|
-
|
|
382
|
-
return navigation instanceof ɵWorkbenchLayout ? ({ layout: navigation }) : navigation;
|
|
383
|
-
}
|
|
384
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvcm91dGluZy93b3JrYmVuY2gtcm91dGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQW1DLGNBQWMsRUFBVSxVQUFVLEVBQVUsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RyxPQUFPLEVBQUMsT0FBTyxFQUFhLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQVksTUFBTSxlQUFlLENBQUM7QUFFNUQsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFHcEUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUMsMkJBQTJCLEVBQUUsK0JBQStCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUU3RyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQzs7Ozs7QUFFN0Q7O0dBRUc7QUFFSCxNQUFNLE9BQU8sZUFBZTtJQVMxQixZQUFvQixPQUFlLEVBQ2YsYUFBb0MsRUFDcEMsdUJBQStDLEVBQy9DLEtBQWE7UUFIYixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2Ysa0JBQWEsR0FBYixhQUFhLENBQXVCO1FBQ3BDLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBd0I7UUFDL0MsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQVZ6Qix3QkFBbUIsR0FBRyxJQUFJLGtCQUFrQixFQUFFLENBQUM7UUFFdkQ7O1dBRUc7UUFDSyw4QkFBeUIsR0FBc0MsSUFBSSxDQUFDO1FBTTFFLG9JQUFvSTtRQUNwSSxvSUFBb0k7UUFDcEksdUVB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QUFFO1lBQ3JCLGlEQUFpRDtZQUNqRCxNQUFNLGFBQWEsR0FBRyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUM7WUFFOUMsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDbEIsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDbEQ7aUJBQ0ksSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUMxQixrQkFBa0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQzthQUNwRjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxrQkFBa0IsQ0FBQztJQUM1QixDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDckMsQ0FBQzs4R0F2WVUsZUFBZTtrSEFBZixlQUFlLGNBREgsTUFBTTs7MkZBQ2xCLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDOztBQTJZaEMsU0FBUyxnQkFBZ0IsQ0FBQyxVQUF5RDtJQUNqRixPQUFPLFVBQVUsWUFBWSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDdEYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMyBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkV4dHJhcywgUFJJTUFSWV9PVVRMRVQsIFJvdXRlciwgVXJsU2VnbWVudCwgVXJsVHJlZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7RGVmaW5lZCwgRGljdGlvbmFyeX0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvdXRpbCc7XG5pbXBvcnQge0luamVjdGFibGUsIE5nWm9uZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7V29ya2JlbmNoTGF5b3V0U2VydmljZX0gZnJvbSAnLi4vbGF5b3V0L3dvcmtiZW5jaC1sYXlvdXQuc2VydmljZSc7XG5pbXBvcnQge01BSU5fQVJFQV9MQVlPVVRfUVVFUllfUEFSQU19IGZyb20gJy4uL3dvcmtiZW5jaC5jb25zdGFudHMnO1xuaW1wb3J0IHtXb3JrYmVuY2hMYXlvdXREaWZmfSBmcm9tICcuL3dvcmtiZW5jaC1sYXlvdXQtZGlmZmVyJztcbmltcG9ydCB7V29ya2JlbmNoUG9wdXBEaWZmfSBmcm9tICcuL3dvcmtiZW5jaC1wb3B1cC1kaWZmZXInO1xuaW1wb3J0IHtTaW5nbGVUYXNrRXhlY3V0b3J9IGZyb20gJy4uL2V4ZWN1dG9yL3NpbmdsZS10YXNrLWV4ZWN1dG9yJztcbmltcG9ydCB7Zmlyc3RWYWx1ZUZyb219IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtXb3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZXMsIFdvcmtiZW5jaE5hdmlnYXRpb25hbFZpZXdTdGF0ZXN9IGZyb20gJy4vd29ya2JlbmNoLW5hdmlnYXRpb25hbC1zdGF0ZXMnO1xuaW1wb3J0IHtXb3JrYmVuY2hWaWV3UmVnaXN0cnl9IGZyb20gJy4uL3ZpZXcvd29ya2JlbmNoLXZpZXcucmVnaXN0cnknO1xuaW1wb3J0IHvJtVdvcmtiZW5jaExheW91dH0gZnJvbSAnLi4vbGF5b3V0L8m1d29ya2JlbmNoLWxheW91dCc7XG5cbi8qKlxuICogUHJvdmlkZXMgd29ya2JlbmNoIHZpZXcgbmF2aWdhdGlvbiBjYXBhYmlsaXRpZXMgYmFzZWQgb24gQW5ndWxhciBSb3V0ZXIuXG4gKi9cbkBJbmplY3RhYmxlKHtwcm92aWRlZEluOiAncm9vdCd9KVxuZXhwb3J0IGNsYXNzIFdvcmtiZW5jaFJvdXRlciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgcHJpdmF0ZSBfc2luZ2xlVGFza0V4ZWN1dG9yID0gbmV3IFNpbmdsZVRhc2tFeGVjdXRvcigpO1xuXG4gIC8qKlxuICAgKiBIb2xkcyB0aGUgY3VycmVudCBuYXZpZ2F0aW9uYWwgY29udGV4dCBkdXJpbmcgYSB3b3JrYmVuY2ggbmF2aWdhdGlvbiwgb3IgYG51bGxgIGlmIG5vIG5hdmlnYXRpb24gaXMgaW4gcHJvZ3Jlc3MuXG4gICAqL1xuICBwcml2YXRlIF9jdXJyZW50TmF2aWdhdGlvbkNvbnRleHQ6IFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcm91dGVyOiBSb3V0ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3ZpZXdSZWdpc3RyeTogV29ya2JlbmNoVmlld1JlZ2lzdHJ5LFxuICAgICAgICAgICAgICBwcml2YXRlIF93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlOiBXb3JrYmVuY2hMYXlvdXRTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF96b25lOiBOZ1pvbmUpIHtcbiAgICAvLyBJbnN0cnVjdCB0aGUgQW5ndWxhciByb3V0ZXIgdG8gcHJvY2VzcyBuYXZpZ2F0aW9ucyB0aGF0IGRvIG5vdCBjaGFuZ2UgdGhlIGN1cnJlbnQgVVJMLCBpLmUuLCB3aGVuIG9ubHkgdXBkYXRpbmcgbmF2aWdhdGlvbiBzdGF0ZS5cbiAgICAvLyBGb3IgZXhhbXBsZSwgdGhlIHdvcmtiZW5jaCBncmlkIGlzIHBhc3NlZCB0byB0aGUgbmF2aWdhdGlvbiBhcyBzdGF0ZSwgbm90IGFzIGEgcXVlcnkgcGFyYW1ldGVyLiBXaXRob3V0IHRoaXMgZmxhZyBzZXQsIGNoYW5nZXMgdG9cbiAgICAvLyB0aGUgd29ya2JlbmNoIGdyaWQgd291bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBicm93c2luZyBoaXN0b3J5IHN0YWNrLlxuICAgIC8vIEFsdGhvdWdoIHRoZSBgb25TYW1lVXJsTmF2aWdhdGlvbmAgZmxhZyBjYW4gYmUgc2V0IHBlciBuYXZpZ2F0aW9uIHZpYSB0aGUgbmF2aWdhdGlvbiBleHRyYXMsIHRoaXMgaXMgbm90IHN1ZmZpY2llbnQgYmVjYXVzZSB0aGVcbiAgICAvLyBBbmd1bGFyIHJvdXRlciBpZ25vcmVzIGl0IHdoZW4gbmF2aWdhdGluZyBiYWNrIGFuZCBmb3J0aCBpbiB0aGUgYnJvd3NpbmcgaGlzdG9yeS5cbiAgICAvLyBTZWUgQW5ndWxhciByb3V0ZXIudHMjc2V0VXBMb2NhdGlvbkNoYW5nZUxpc3RlbmVyIGFuZCByb3V0ZXIudHMjbmF2aWdhdGVUb1N5bmNXaXRoQnJvd3NlclxuICAgIHRoaXMuX3JvdXRlci5vblNhbWVVcmxOYXZpZ2F0aW9uID0gJ3JlbG9hZCc7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGVzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBhcnJheSBvZiBjb21tYW5kcywgYW5kIGlzIGxpa2UgJ1JvdXRlci5uYXZpZ2F0ZSguLi4pJyBidXQgd2l0aCBhIHdvcmtiZW5jaCB2aWV3IGFzIHRoZSByb3V0ZXIgb3V0bGV0IHRhcmdldC5cbiAgICogTmF2aWdhdGlvbiBpcyBhYnNvbHV0ZSB1bmxlc3MgcHJvdmlkaW5nIGEgYHJlbGF0aXZlVG9gIHJvdXRlIGluIG5hdmlnYXRpb25hbCBleHRyYXMuXG4gICAqXG4gICAqIEJ5IHBhc3NpbmcgbmF2aWdhdGlvbiBleHRyYXMsIHlvdSBjYW4gY29udHJvbCBuYXZpZ2F0aW9uLiBCeSBkZWZhdWx0LCB0aGUgcm91dGVyIG9wZW5zIGEgbmV3IHZpZXcgdGFiIGlmIG5vIHZpZXcgaXMgZm91bmQgdGhhdCBtYXRjaGVzIHRoZVxuICAgKiBzcGVjaWZpZWQgcGF0aC4gTWF0cml4IHBhcmFtZXRlcnMgZG8gbm90IGFmZmVjdCB2aWV3IHJlc29sdXRpb24uIElmIG9uZSAob3IgbW9yZSkgdmlldyhzKSBtYXRjaCB0aGUgc3BlY2lmaWVkIHBhdGgsIHRoZXkgYXJlIG5hdmlnYXRlZFxuICAgKiBpbnN0ZWFkIG9mIG9wZW5pbmcgdGhlIHZpZXcgaW4gYSBuZXcgdmlldyB0YWIsIGUuZy4sIHRvIHVwZGF0ZSBtYXRyaXggcGFyYW1ldGVycy5cbiAgICpcbiAgICogVGhlIHJvdXRlciBzdXBwb3J0cyBmb3IgY2xvc2luZyB2aWV3cyBtYXRjaGluZyB0aGUgcm91dGluZyBjb21tYW5kcyBieSBzZXR0aW5nIGBjbG9zZWAgaW4gbmF2aWdhdGlvbmFsIGV4dHJhcy5cbiAgICpcbiAgICogIyMjIENvbW1hbmRzXG4gICAqIC0gTXVsdGlwbGUgc3RhdGljIHNlZ21lbnRzIGNhbiBiZSBtZXJnZWQgaW50byBvbmUsIGUuZy4gYFsnL3RlYW0vMTEvdXNlcicsIHVzZXJOYW1lLCB7ZGV0YWlsczogdHJ1ZX1dYFxuICAgKiAtIFRoZSBmaXJzdCBzZWdtZW50IG5hbWUgY2FuIGJlIHByZXBlbmRlZCB3aXRoIGAvYCwgYC4vYCwgb3IgYC4uL2BcbiAgICogLSBNYXRyaXggcGFyYW1ldGVycyBjYW4gYmUgdXNlZCB0byBhc3NvY2lhdGUgb3B0aW9uYWwgZGF0YSB3aXRoIHRoZSBVUkwsIGUuZy4gYFsndXNlcicsIHVzZXJOYW1lLCB7ZGV0YWlsczogdHJ1ZX1dYFxuICAgKiAgIE1hdHJpeCBwYXJhbWV0ZXJzIGFyZSBsaWtlIHJlZ3VsYXIgVVJMIHBhcmFtZXRlcnMsIGJ1dCBkbyBub3QgYWZmZWN0IHJvdXRlIGFuZCB2aWV3IHJlc29sdXRpb24uIFVubGlrZSBxdWVyeSBwYXJhbWV0ZXJzLCBtYXRyaXggcGFyYW1ldGVyc1xuICAgKiAgIGFyZSBub3QgZ2xvYmFsIGJ1dCBwYXJ0IG9mIHRoZSByb3V0aW5nIHBhdGgsIHdoaWNoIG1ha2VzIHRoZW0gc3VpdGFibGUgZm9yIGF1eGlsaWFyeSByb3V0ZXMuXG4gICAqXG4gICAqICMjIyBVc2FnZVxuICAgKlxuICAgKiBgYGBcbiAgICogcm91dGVyLm5hdmlnYXRlKFsndGVhbScsIDMzLCAndXNlcicsIDExXSk7XG4gICAqIHJvdXRlci5uYXZpZ2F0ZShbJ3RlYW0vMTEvdXNlcicsIHVzZXJOYW1lLCB7ZGV0YWlsczogdHJ1ZX1dKTsgLy8gbXVsdGlwbGUgc3RhdGljIHNlZ21lbnRzIGNhbiBiZSBtZXJnZWQgaW50byBvbmVcbiAgICogcm91dGVyLm5hdmlnYXRlKFsndGVhbXMnLCB7c2VsZWN0aW9uOiAzMyd9XSk7IC8vIG1hdHJpeCBwYXJhbWV0ZXIgJ3NlbGVjdGlvbicgd2l0aCB0aGUgdmFsdWUgJzMzJy5cbiAgICogYGBgXG4gICAqXG4gICAqIEBzZWUgV29ya2JlbmNoUm91dGVyTGlua0RpcmVjdGl2ZVxuICAgKi9cbiAgcHVibGljIG5hdmlnYXRlKGNvbW1hbmRzOiBDb21tYW5kcywgZXh0cmFzOiBXb3JrYmVuY2hOYXZpZ2F0aW9uRXh0cmFzID0ge30pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAvLyBFbnN1cmUgdG8gcnVuIGluIEFuZ3VsYXIgem9uZS5cbiAgICBpZiAoIU5nWm9uZS5pc0luQW5ndWxhclpvbmUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3pvbmUucnVuKCgpID0+IHRoaXMubmF2aWdhdGUoY29tbWFuZHMsIGV4dHJhcykpO1xuICAgIH1cblxuICAgIGlmIChleHRyYXMuY2xvc2UpIHtcbiAgICAgIHJldHVybiB0aGlzLsm1bmF2aWdhdGUoKGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpOiBXb3JrYmVuY2hOYXZpZ2F0aW9uIHwgybVXb3JrYmVuY2hMYXlvdXQgfCBudWxsID0+IHtcbiAgICAgICAgaWYgKGV4dHJhcy50YXJnZXQpIHtcbiAgICAgICAgICBjb25zdCB2aWV3SWQgPSBleHRyYXMudGFyZ2V0O1xuICAgICAgICAgIGlmIChjb21tYW5kcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKGBbV29ya2JlbmNoUm91dGVyRXJyb3JdW0lsbGVnYWxBcmd1bWVudEVycm9yXSBUaGUgY29tbWFuZHMgbXVzdCBiZSBlbXB0eSBpZiBjbG9zaW5nIGEgdmlldyBieSB2aWV3SWQgW2NvbW1hbmRzPSR7Y29tbWFuZHN9XWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWxheW91dC52aWV3cygpLnNvbWUodmlldyA9PiB2aWV3LmlkID09PSB2aWV3SWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlbW92ZVZpZXcodmlld0lkLCBsYXlvdXQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZpZXdJZHMgPSB0aGlzLnJlc29sdmVQcmVzZW50Vmlld0lkcyhjb21tYW5kcywge3JlbGF0aXZlVG86IGV4dHJhcy5yZWxhdGl2ZVRvLCBtYXRjaFdpbGRjYXJkU2VnbWVudHM6IHRydWV9KTtcbiAgICAgICAgcmV0dXJuIHZpZXdJZHMucmVkdWNlKChuYXZpZ2F0aW9uLCB2aWV3SWQpID0+IHJlbW92ZVZpZXcodmlld0lkLCBuYXZpZ2F0aW9uKSwge2xheW91dH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuybVuYXZpZ2F0ZSgobGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCk6IFdvcmtiZW5jaE5hdmlnYXRpb24gfCDJtVdvcmtiZW5jaExheW91dCB8IG51bGwgPT4ge1xuICAgICAgc3dpdGNoIChleHRyYXMudGFyZ2V0ID8/ICdhdXRvJykge1xuICAgICAgICBjYXNlICdibGFuayc6IHtcbiAgICAgICAgICByZXR1cm4gYWRkVmlldyhsYXlvdXQuY29tcHV0ZU5leHRWaWV3SWQoKSwgbGF5b3V0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdhdXRvJzoge1xuICAgICAgICAgIGNvbnN0IHZpZXdJZHMgPSB0aGlzLnJlc29sdmVQcmVzZW50Vmlld0lkcyhjb21tYW5kcywge3JlbGF0aXZlVG86IGV4dHJhcy5yZWxhdGl2ZVRvfSk7XG4gICAgICAgICAgaWYgKHZpZXdJZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdmlld0lkcy5yZWR1Y2UoKG5hdmlnYXRpb24sIHZpZXdJZCkgPT4gdXBkYXRlVmlldyh2aWV3SWQsIG5hdmlnYXRpb24pLCB7bGF5b3V0fSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGFkZFZpZXcobGF5b3V0LmNvbXB1dGVOZXh0Vmlld0lkKCksIGxheW91dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCB2aWV3SWQgPSBleHRyYXMudGFyZ2V0ITtcbiAgICAgICAgICBpZiAobGF5b3V0LnZpZXdzKCkuc29tZSh2aWV3ID0+IHZpZXcuaWQgPT09IHZpZXdJZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cGRhdGVWaWV3KHZpZXdJZCwgbGF5b3V0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gYWRkVmlldyh2aWV3SWQsIGxheW91dCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgZXh0cmFzKTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIG5hdmlnYXRpb24gZm9yIGFkZGluZyB0aGUgc3BlY2lmaWVkIHZpZXcgdG8gdGhlIHdvcmtiZW5jaCBsYXlvdXQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gYWRkVmlldyh2aWV3SWQ6IHN0cmluZywgbGF5b3V0OiDJtVdvcmtiZW5jaExheW91dCk6IFdvcmtiZW5jaE5hdmlnYXRpb24ge1xuICAgICAgY29uc3QgcGFydElkID0gKCgpOiBzdHJpbmcgPT4ge1xuICAgICAgICBpZiAoZXh0cmFzLmJsYW5rUGFydElkICYmIGxheW91dC5oYXNQYXJ0KGV4dHJhcy5ibGFua1BhcnRJZCkpIHtcbiAgICAgICAgICByZXR1cm4gZXh0cmFzLmJsYW5rUGFydElkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXlvdXQuYWN0aXZlUGFydCh7Z3JpZDogJ21haW5BcmVhJ30pPy5pZCA/PyBsYXlvdXQuYWN0aXZlUGFydCh7Z3JpZDogJ3dvcmtiZW5jaCd9KS5pZDtcbiAgICAgIH0pKCk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxheW91dDogbGF5b3V0LmFkZFZpZXcodmlld0lkLCB7XG4gICAgICAgICAgcGFydElkLFxuICAgICAgICAgIHBvc2l0aW9uOiBleHRyYXMuYmxhbmtJbnNlcnRpb25JbmRleCA/PyAnYWZ0ZXItYWN0aXZlLXZpZXcnLFxuICAgICAgICAgIGFjdGl2YXRlVmlldzogZXh0cmFzLmFjdGl2YXRlID8/IHRydWUsXG4gICAgICAgIH0pLFxuICAgICAgICB2aWV3T3V0bGV0czogY29tbWFuZHMubGVuZ3RoID8ge1t2aWV3SWRdOiBjb21tYW5kc30gOiB7fSxcbiAgICAgICAgdmlld1N0YXRlczoge1t2aWV3SWRdOiB7W1dvcmtiZW5jaE5hdmlnYXRpb25hbFZpZXdTdGF0ZXMuY3NzQ2xhc3NdOiBleHRyYXMuY3NzQ2xhc3N9fSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgbmF2aWdhdGlvbiBmb3IgdXBkYXRpbmcgdGhlIHBhdGggb2YgdGhlIHNwZWNpZmllZCB2aWV3LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHVwZGF0ZVZpZXcodmlld0lkOiBzdHJpbmcsIGxheW91dDogV29ya2JlbmNoTmF2aWdhdGlvbiB8IMm1V29ya2JlbmNoTGF5b3V0KTogV29ya2JlbmNoTmF2aWdhdGlvbiB7XG4gICAgICBjb25zdCBuYXZpZ2F0aW9uID0gY29lcmNlTmF2aWdhdGlvbihsYXlvdXQpITtcbiAgICAgIGNvbnN0IGFjdGl2YXRlVmlldyA9IGV4dHJhcy5hY3RpdmF0ZSA/PyB0cnVlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGF5b3V0OiBhY3RpdmF0ZVZpZXcgPyBuYXZpZ2F0aW9uLmxheW91dC5hY3RpdmF0ZVZpZXcodmlld0lkKSA6IG5hdmlnYXRpb24ubGF5b3V0LFxuICAgICAgICB2aWV3T3V0bGV0czogey4uLm5hdmlnYXRpb24udmlld091dGxldHMsIC4uLihjb21tYW5kcy5sZW5ndGggPyB7W3ZpZXdJZF06IGNvbW1hbmRzfSA6IHt9KX0sXG4gICAgICAgIHZpZXdTdGF0ZXM6IHsuLi5uYXZpZ2F0aW9uLnZpZXdTdGF0ZXMsIFt2aWV3SWRdOiB7W1dvcmtiZW5jaE5hdmlnYXRpb25hbFZpZXdTdGF0ZXMuY3NzQ2xhc3NdOiBleHRyYXMuY3NzQ2xhc3N9fSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyB0aGUgbmF2aWdhdGlvbiBmb3IgcmVtb3ZpbmcgdGhlIHNwZWNpZmllZCB2aWV3IGZyb20gdGhlIHdvcmtiZW5jaCBsYXlvdXQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVtb3ZlVmlldyh2aWV3SWQ6IHN0cmluZywgbGF5b3V0OiBXb3JrYmVuY2hOYXZpZ2F0aW9uIHwgybVXb3JrYmVuY2hMYXlvdXQpOiBXb3JrYmVuY2hOYXZpZ2F0aW9uIHtcbiAgICAgIGNvbnN0IG5hdmlnYXRpb24gPSBjb2VyY2VOYXZpZ2F0aW9uKGxheW91dCkhO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGF5b3V0OiBuYXZpZ2F0aW9uLmxheW91dC5yZW1vdmVWaWV3KHZpZXdJZCksXG4gICAgICAgIHZpZXdPdXRsZXRzOiB7Li4ubmF2aWdhdGlvbi52aWV3T3V0bGV0cywgW3ZpZXdJZF06IG51bGx9LFxuICAgICAgICB2aWV3U3RhdGVzOiBuYXZpZ2F0aW9uLnZpZXdTdGF0ZXMsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBlcmltZW50YWwgQVBJIGZvciBtb2RpZnlpbmcgdGhlIHdvcmtiZW5jaCBsYXlvdXQuXG4gICAqXG4gICAqIEBwYXJhbSBvbk5hdmlnYXRlIC0gQ2FsbGJhY2sgdG8gbW9kaWZ5IHRoZSBjdXJyZW50IGxheW91dC5cbiAgICogICAgICAgIFRoZSBjYWxsYmFjayBpcyBwYXNzZWQgdGhlIGN1cnJlbnQgbGF5b3V0IHdoaWNoIGNhbiBiZSBtb2RpZmllZCBhbmQgcmV0dXJuZWQgZm9yIG5hdmlnYXRpb24uIFJldHVybmluZyBgbnVsbGAgZG9lcyBub3QgcGVyZm9ybSB0aGUgbmF2aWdhdGlvbi5cbiAgICogQHBhcmFtIGV4dHJhcyAtIENvbnRyb2xzIGhvdyB0byBwZXJmb3JtIHRoZSBuYXZpZ2F0aW9uLlxuICAgKi9cbiAgcHVibGljIMm1bmF2aWdhdGUob25OYXZpZ2F0ZTogKGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpID0+IFByb21pc2U8ybVXb3JrYmVuY2hMYXlvdXQgfCBXb3JrYmVuY2hOYXZpZ2F0aW9uIHwgbnVsbD4gfCDJtVdvcmtiZW5jaExheW91dCB8IFdvcmtiZW5jaE5hdmlnYXRpb24gfCBudWxsLCBleHRyYXM/OiBOYXZpZ2F0aW9uRXh0cmFzKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgLy8gRW5zdXJlIHRvIHJ1biBpbiBBbmd1bGFyIHpvbmUuXG4gICAgaWYgKCFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl96b25lLnJ1bigoKSA9PiB0aGlzLsm1bmF2aWdhdGUob25OYXZpZ2F0ZSwgZXh0cmFzKSk7XG4gICAgfVxuXG4gICAgLy8gU2VyaWFsaXplIG5hdmlnYXRpb24gcmVxdWVzdHMgdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbnMgd2hlbiBtb2RpZnlpbmcgdGhlIGN1cnJlbnRseSBhY3RpdmUgd29ya2JlbmNoIGxheW91dC5cbiAgICByZXR1cm4gdGhpcy5fc2luZ2xlVGFza0V4ZWN1dG9yLnN1Ym1pdChhc3luYyAoKSA9PiB7XG4gICAgICAvLyBXYWl0IHVudGlsIHRoZSBpbml0aWFsIGxheW91dCBpcyBhdmFpbGFibGUsIGkuZS4sIGFmdGVyIGNvbXBsZXRpb24gb2YgQW5ndWxhcidzIGluaXRpYWwgbmF2aWdhdGlvbi5cbiAgICAgIC8vIE90aGVyd2lzZSwgdGhpcyBuYXZpZ2F0aW9uIHdvdWxkIG92ZXJyaWRlIHRoZSBpbml0aWFsIGxheW91dCBhcyBnaXZlbiBpbiB0aGUgVVJMLlxuICAgICAgaWYgKCF0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dCkge1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JJbml0aWFsTGF5b3V0KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhc3MgY29udHJvbCB0byB0aGUgbmF2aWdhdG9yIHRvIGNvbXB1dGUgdGhlIG5ldyB3b3JrYmVuY2ggbGF5b3V0LlxuICAgICAgY29uc3QgbmF2aWdhdGlvbjogV29ya2JlbmNoTmF2aWdhdGlvbiB8IG51bGwgPSBjb2VyY2VOYXZpZ2F0aW9uKGF3YWl0IG9uTmF2aWdhdGUodGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQhKSk7XG4gICAgICBpZiAoIW5hdmlnYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB1c2VyLWRlZmluZWQgc3RhdGUgZnJvbSBuYXZpZ2F0aW9uIGV4dHJhcyB0byB0aGUgdmlldyBzdGF0ZS5cbiAgICAgIC8vIE5PVEU6IFdlIG11c3QgZW5zdXJlIHRoYXQgYSB2aWV3IHN0YXRlIG9iamVjdCBpcyBhc3NvY2lhdGVkIGZvciBlYWNoIG91dGxldCB0byBiZSBuYXZpZ2F0ZWQuXG4gICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBzdGF0ZSBvYmplY3Qgd2VyZSBgbnVsbGAgb3IgYHVuZGVmaW5lZGAsIHtAbGluayBOYXZpZ2F0aW9uU3RhdGVSZXNvbHZlcn0gd291bGQgcmVzdG9yZSB0aGUgc3RhdGUgb2YgdGhlIHByZXZpb3VzbHkgYWN0aXZhdGVkIHJvdXRlLlxuICAgICAgY29uc3Qgdmlld1N0YXRlcyA9IE9iamVjdC5rZXlzKG5hdmlnYXRpb24udmlld091dGxldHMgfHwge30pLnJlZHVjZSgodmlld1N0YXRlcywgdmlld0lkKSA9PiB7XG4gICAgICAgIHZpZXdTdGF0ZXNbdmlld0lkXSA9IHsuLi52aWV3U3RhdGVzW3ZpZXdJZF0sIC4uLmV4dHJhcz8uc3RhdGV9O1xuICAgICAgICByZXR1cm4gdmlld1N0YXRlcztcbiAgICAgIH0sIG5hdmlnYXRpb24udmlld1N0YXRlcyB8fCB7fSk7XG5cbiAgICAgIC8vIEluc3RydWN0IHRoZSByb3V0ZXIgdG8gcHJvY2VzcyB0aGUgbmF2aWdhdGlvbiBldmVuIGlmIHRoZSBVUkwgZG9lcyBub3QgY2hhbmdlLCBlLmcuLCB3aGVuIGNoYW5naW5nIHRoZSB3b3JrYmVuY2ggZ3JpZCB3aGljaCBpcyBub3QgY29udGFpbmVkIGluIHRoZSBVUkwuXG4gICAgICBleHRyYXMgPSB7Li4uZXh0cmFzLCBvblNhbWVVcmxOYXZpZ2F0aW9uOiAncmVsb2FkJ307XG5cbiAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgbGF5b3V0LlxuICAgICAgY29uc3Qgc2VyaWFsaXplZExheW91dCA9IG5hdmlnYXRpb24ubGF5b3V0LnNlcmlhbGl6ZSgpO1xuXG4gICAgICAvLyBBc3NvY2lhdGUgd29ya2JlbmNoLXNwZWNpZmljIHN0YXRlIHdpdGggdGhlIG5hdmlnYXRpb24uXG4gICAgICBXb3JrYmVuY2hOYXZpZ2F0aW9uYWxTdGF0ZXMuYWRkVG9OYXZpZ2F0aW9uRXh0cmFzKGV4dHJhcywge1xuICAgICAgICB3b3JrYmVuY2hHcmlkOiBzZXJpYWxpemVkTGF5b3V0LndvcmtiZW5jaEdyaWQsXG4gICAgICAgIG1heGltaXplZDogbmF2aWdhdGlvbi5sYXlvdXQubWF4aW1pemVkLFxuICAgICAgICB2aWV3U3RhdGVzLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIENvbXB1dGUgdGhlIG5ldyBVUkwgdHJlZS5cbiAgICAgIGNvbnN0IHVybFRyZWUgPSB0aGlzLl9fY3JlYXRlVXJsVHJlZShuYXZpZ2F0aW9uLnZpZXdPdXRsZXRzLCBzZXJpYWxpemVkTGF5b3V0Lm1haW5BcmVhR3JpZCwgZXh0cmFzKTtcblxuICAgICAgLy8gUGVyZm9ybSB0aGUgbmF2aWdhdGlvbi5cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuX3JvdXRlci5uYXZpZ2F0ZUJ5VXJsKHVybFRyZWUsIGV4dHJhcykpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgLy8gQmxvY2sgc3Vic2VxdWVudCBuYXZpZ2F0aW9uKHMpIHVudGlsIEFuZ3VsYXIgaGFzIGZsdXNoZWQgdGhlIGNoYW5nZWQgbGF5b3V0IHRvIHRoZSBET00uXG4gICAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl96b25lLm9uU3RhYmxlKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4cGVyaW1lbnRhbCBBUEkgdG8gcmVwbGFjZSB7QGxpbmsgV29ya2JlbmNoUm91dGVyI25hdmlnYXRlfSBmb3IgbmF2aWdhdGluZyB2aWV3cyBhbmQgbW9kaWZ5aW5nIHRoZSBsYXlvdXQuXG4gICAqXG4gICAqIEBwYXJhbSBvbk5hdmlnYXRlIC0gQ29tcHV0ZXMgdGhlIG5ldyB3b3JrYmVuY2ggbGF5b3V0LlxuICAgKiAgICAgICAgVGhlIGNhbGxiYWNrIGlzIHBhc3NlZCB0aGUgY3VycmVudCB3b3JrYmVuY2ggbGF5b3V0IHdoaWNoIHRoZSBjYWxsZXIgY2FuIG1vZGlmeSBhbmQgcmV0dXJuLlxuICAgKiAgICAgICAgSW4gdGhlIGNhbGxiYWNrLCBpdCBpcyBzYWZlIHRvIGFjY2VzcyBjdXJyZW50bHkgYWN0aXZhdGVkIHJvdXRlcyBvciB0aGUgY3VycmVudCByb3V0ZXIgdXJsLlxuICAgKiBAcGFyYW0gZXh0cmFzIC0gT3B0aW9ucyB0byBjb250cm9sIG5hdmlnYXRpb24uXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGNyZWF0ZVVybFRyZWUob25OYXZpZ2F0ZTogKGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQpID0+IFByb21pc2U8ybVXb3JrYmVuY2hMYXlvdXQgfCBXb3JrYmVuY2hOYXZpZ2F0aW9uPiB8IMm1V29ya2JlbmNoTGF5b3V0IHwgV29ya2JlbmNoTmF2aWdhdGlvbiwgZXh0cmFzPzogTmF2aWdhdGlvbkV4dHJhcyk6IFByb21pc2U8VXJsVHJlZT4ge1xuICAgIC8vIEVuc3VyZSB0byBydW4gaW4gQW5ndWxhciB6b25lLlxuICAgIGlmICghTmdab25lLmlzSW5Bbmd1bGFyWm9uZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fem9uZS5ydW4oKCkgPT4gdGhpcy5jcmVhdGVVcmxUcmVlKG9uTmF2aWdhdGUsIGV4dHJhcykpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9zaW5nbGVUYXNrRXhlY3V0b3Iuc3VibWl0KGFzeW5jICgpID0+IHtcbiAgICAgIC8vIFdhaXQgdW50aWwgdGhlIGluaXRpYWwgbGF5b3V0IGlzIGF2YWlsYWJsZSwgaS5lLiwgYWZ0ZXIgY29tcGxldGlvbiBvZiBBbmd1bGFyJ3MgaW5pdGlhbCBuYXZpZ2F0aW9uLlxuICAgICAgLy8gT3RoZXJ3aXNlLCB3b3VsZCBvdmVycmlkZSB0aGUgaW5pdGlhbCBsYXlvdXQgYXMgZ2l2ZW4gaW4gdGhlIFVSTC5cbiAgICAgIGlmICghdGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQpIHtcbiAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9ySW5pdGlhbExheW91dCgpO1xuICAgICAgfVxuXG4gICAgICAvLyBQYXNzIGNvbnRyb2wgdG8gdGhlIG5hdmlnYXRvciB0byBjb21wdXRlIHRoZSBuZXcgd29ya2JlbmNoIGxheW91dC5cbiAgICAgIGNvbnN0IG5hdmlnYXRpb246IFdvcmtiZW5jaE5hdmlnYXRpb24gPSBjb2VyY2VOYXZpZ2F0aW9uKGF3YWl0IG9uTmF2aWdhdGUodGhpcy5fd29ya2JlbmNoTGF5b3V0U2VydmljZS5sYXlvdXQhKSkhO1xuXG4gICAgICAvLyBjcmVhdGUgdGhlIFVSTCB0cmVlLlxuICAgICAgcmV0dXJuIHRoaXMuX19jcmVhdGVVcmxUcmVlKG5hdmlnYXRpb24udmlld091dGxldHMsIG5hdmlnYXRpb24ubGF5b3V0LnNlcmlhbGl6ZSgpLm1haW5BcmVhR3JpZCwgZXh0cmFzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBuYW1lIGJlZ2lucyB3aXRoIHVuZGVyc2NvcmVzIHRvIGluZGljYXRlIHRoYXQgaXQgbXVzdCBvbmx5IGJlIGludm9rZWQgZnJvbSB3aXRoaW4ge0BsaW5rIFNpbmdsZVRhc2tFeGVjdXRvcn0uXG4gICAqL1xuICBwcml2YXRlIF9fY3JlYXRlVXJsVHJlZSh2aWV3T3V0bGV0czoge1tvdXRsZXQ6IHN0cmluZ106IENvbW1hbmRzIHwgbnVsbH0gfCB1bmRlZmluZWQsIHNlcmlhbGl6ZWRNYWluQXJlYUdyaWQ6IHN0cmluZyB8IG51bGwsIGV4dHJhcz86IE5hdmlnYXRpb25FeHRyYXMpOiBVcmxUcmVlIHtcbiAgICAvLyBOb3JtYWxpemUgY29tbWFuZHMgb2YgdGhlIG91dGxldHMgdG8gdGhlaXIgYWJzb2x1dGUgZm9ybSBhbmQgcmVzb2x2ZSByZWxhdGl2ZSBuYXZpZ2F0aW9uYWwgc3ltYm9scy5cbiAgICBjb25zdCBub3JtYWxpemVkVmlld091dGxldHMgPSB0aGlzLm5vcm1hbGl6ZU91dGxldENvbW1hbmRzKHZpZXdPdXRsZXRzLCBleHRyYXM/LnJlbGF0aXZlVG8pO1xuXG4gICAgLy8gQWRkIHZpZXcgb3V0bGV0cyBhcyAnb3V0bGV0cycgZnJhZ21lbnQgdG8gYmUgaW50ZXJwcmV0ZWQgYnkgQW5ndWxhci5cbiAgICBjb25zdCBjb21tYW5kczogQ29tbWFuZHMgPSBub3JtYWxpemVkVmlld091dGxldHMgPyBbe291dGxldHM6IG5vcm1hbGl6ZWRWaWV3T3V0bGV0c31dIDogW107XG5cbiAgICAvLyBMZXQgQW5ndWxhciBSb3V0ZXIgY29uc3RydWN0IHRoZSBVUkwgdHJlZS5cbiAgICByZXR1cm4gdGhpcy5fcm91dGVyLmNyZWF0ZVVybFRyZWUoY29tbWFuZHMsIHtcbiAgICAgIC4uLmV4dHJhcyxcbiAgICAgIHF1ZXJ5UGFyYW1zOiB7Li4uZXh0cmFzPy5xdWVyeVBhcmFtcywgW01BSU5fQVJFQV9MQVlPVVRfUVVFUllfUEFSQU1dOiBzZXJpYWxpemVkTWFpbkFyZWFHcmlkfSxcbiAgICAgIC8vIE1lcmdlIHdpdGggZXhpc3RpbmcgcXVlcnkgcGFyYW1zIHVubGVzcyBzcGVjaWZpZWQgYW4gZXhwbGljaXQgc3RyYXRlZ3ksIGUuZy4sIGZvciBtaWdyYXRpbmcgYW4gb3V0ZGF0ZWQgbGF5b3V0IFVSTC5cbiAgICAgIC8vIE5vdGUgdGhhdCBgbnVsbGAgaXMgYSB2YWxpZCBzdHJhdGVneSBmb3IgY2xlYXJpbmcgZXhpc3RpbmcgcXVlcnkgcGFyYW1zLCBzbyBkbyBub3QgdXNlIHRoZSBudWxsaXNoIGNvYWxlc2Npbmcgb3BlcmF0b3IgKD8/KS5cbiAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6IERlZmluZWQub3JFbHNlKGV4dHJhcz8ucXVlcnlQYXJhbXNIYW5kbGluZywgJ21lcmdlJyksXG4gICAgICByZWxhdGl2ZVRvOiBudWxsLCAvLyBjb21tYW5kcyBhcmUgbm9ybWFsaXplZCB0byB0aGVpciBhYnNvbHV0ZSBmb3JtXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQHNlZSBub3JtYWxpemVDb21tYW5kc1xuICAgKi9cbiAgcHJpdmF0ZSBub3JtYWxpemVPdXRsZXRDb21tYW5kcyhvdXRsZXRzPzoge1tvdXRsZXQ6IHN0cmluZ106IENvbW1hbmRzIHwgbnVsbH0sIHJlbGF0aXZlVG8/OiBBY3RpdmF0ZWRSb3V0ZSB8IG51bGwpOiB7W291dGxldDogc3RyaW5nXTogQ29tbWFuZHMgfCBudWxsfSB8IG51bGwge1xuICAgIGlmICghb3V0bGV0cyB8fCAhT2JqZWN0LmtleXMob3V0bGV0cykubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMob3V0bGV0cykucmVkdWNlKChhY2MsIFtvdXRsZXROYW1lLCBjb21tYW5kc10pID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFjYyxcbiAgICAgICAgW291dGxldE5hbWVdOiBjb21tYW5kcyA/IHRoaXMubm9ybWFsaXplQ29tbWFuZHMoY29tbWFuZHMsIHJlbGF0aXZlVG8pIDogbnVsbCwgLy8gYG51bGxgIHRvIHJlbW92ZSBhbiBvdXRsZXRcbiAgICAgIH07XG4gICAgfSwge30pO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgY29tbWFuZHMgdG8gdGhlaXIgYWJzb2x1dGUgZm9ybS5cbiAgICpcbiAgICogLS0tXG4gICAqIEFzIG9mIEFuZ3VsYXIgNi54LCBjb21tYW5kcyB3aGljaCB0YXJnZXQgYSBuYW1lZCBvdXRsZXQgKGF1eGlsaWFyeSByb3V0ZSkgYXJlIG5vdCBub3JtYWxpemVkLCBtZWFuaW5nIHRoYXRcbiAgICogcmVsYXRpdmUgbmF2aWdhdGlvbmFsIHN5bWJvbHMgbGlrZSBgL2AsIGAuL2AsIG9yIGAuLi9gIGFyZSBub3QgcmVzb2x2ZWQgKHNlZSBgY3JlYXRlX3VybF90cmVlLnRzYCBtZXRob2Q6IGBjb21wdXRlTmF2aWdhdGlvbmApLlxuICAgKlxuICAgKiBFeGFtcGxlOiByb3V0ZXIubmF2aWdhdGUoW3tvdXRsZXRzOiB7W291dGxldF06IGNvbW1hbmRzfX1dKVxuICAgKlxuICAgKiBUbyBieXBhc3MgdGhhdCByZXN0cmljdGlvbiwgd2UgZmlyc3QgY3JlYXRlIGEgVVJMIHRyZWUgd2l0aG91dCBzcGVjaWZ5aW5nIHRoZSB0YXJnZXQgb3V0bGV0LiBBcyBleHBlY3RlZCwgdGhpcyB0cmFuc2xhdGVzIGludG8gYVxuICAgKiBVUkwgd2l0aCBhbGwgbmF2aWdhdGlvbmFsIHN5bWJvbHMgcmVzb2x2ZWQuIFRoZW4sIHdlIGV4dHJhY3QgdGhlIFVSTCBzZWdtZW50cyBvZiB0aGUgcmVzb2x2ZWQgcm91dGUgYW5kIGNvbnZlcnQgaXQgYmFjayBpbnRvIGNvbW1hbmRzLlxuICAgKiBUaGUgcmVzdWx0aW5nIGNvbW1hbmRzIGFyZSBpbiB0aGVpciBhYnNvbHV0ZSBmb3JtIGFuZCBtYXkgYmUgdXNlZCBmb3IgdGhlIGVmZmVjdGl2ZSBuYXZpZ2F0aW9uIHRvIHRhcmdldCBhIG5hbWVkIHJvdXRlciBvdXRsZXQuXG4gICAqL1xuICBwcml2YXRlIG5vcm1hbGl6ZUNvbW1hbmRzKGNvbW1hbmRzOiBDb21tYW5kcywgcmVsYXRpdmVUbz86IEFjdGl2YXRlZFJvdXRlIHwgbnVsbCk6IENvbW1hbmRzIHtcbiAgICBpZiAoIWNvbW1hbmRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIEVuc3VyZSB0byBydW4gaW4gQW5ndWxhciB6b25lLlxuICAgIGlmICghTmdab25lLmlzSW5Bbmd1bGFyWm9uZSgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fem9uZS5ydW4oKCkgPT4gdGhpcy5ub3JtYWxpemVDb21tYW5kcyhjb21tYW5kcywgcmVsYXRpdmVUbykpO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZUZuID0gKG91dGxldDogc3RyaW5nLCBleHRyYXM/OiBOYXZpZ2F0aW9uRXh0cmFzKTogQ29tbWFuZHMgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuX3JvdXRlci5jcmVhdGVVcmxUcmVlKGNvbW1hbmRzLCBleHRyYXMpXG4gICAgICAgIC5yb290LmNoaWxkcmVuW291dGxldF0uc2VnbWVudHNcbiAgICAgICAgLnJlZHVjZTxDb21tYW5kcz4oKGFjYywgcCkgPT4gWy4uLmFjYywgcC5wYXRoLCAuLi4oT2JqZWN0LmtleXMocC5wYXJhbWV0ZXJzKS5sZW5ndGggPyBbcC5wYXJhbWV0ZXJzXSA6IFtdKV0sIFtdKTtcbiAgICB9O1xuXG4gICAgaWYgKCFyZWxhdGl2ZVRvKSB7XG4gICAgICByZXR1cm4gbm9ybWFsaXplRm4oUFJJTUFSWV9PVVRMRVQpO1xuICAgIH1cblxuICAgIGNvbnN0IHRhcmdldE91dGxldCA9IHJlbGF0aXZlVG8ucGF0aEZyb21Sb290WzFdPy5vdXRsZXQ7XG4gICAgaWYgKCF0YXJnZXRPdXRsZXQpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVGbihQUklNQVJZX09VVExFVCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5vcm1hbGl6ZUZuKHRhcmdldE91dGxldCwge3JlbGF0aXZlVG99KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBwcmVzZW50IHZpZXdzIHdoaWNoIG1hdGNoIHRoZSBnaXZlbiBjb21tYW5kcy5cbiAgICpcbiAgICogQWxsb3dzIG1hdGNoaW5nIHdpbGRjYXJkIHNlZ21lbnRzIGJ5IHNldHRpbmcgdGhlIG9wdGlvbiBgbWF0Y2hXaWxkY2FyZFNlZ21lbnRzYCB0byBgdHJ1ZWAuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHJlc29sdmVQcmVzZW50Vmlld0lkcyhjb21tYW5kTGlzdDogQ29tbWFuZHMsIG9wdGlvbnM/OiB7cmVsYXRpdmVUbz86IEFjdGl2YXRlZFJvdXRlIHwgbnVsbDsgbWF0Y2hXaWxkY2FyZFNlZ21lbnRzPzogYm9vbGVhbn0pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY29tbWFuZHMgPSB0aGlzLm5vcm1hbGl6ZUNvbW1hbmRzKGNvbW1hbmRMaXN0LCBvcHRpb25zPy5yZWxhdGl2ZVRvKTtcbiAgICBjb25zdCBjb21tYW5kUGF0aCA9IHRoaXMuc2VyaWFsaXplQ29tbWFuZHMoY29tbWFuZHMsIHtza2lwTWF0cml4UGFyYW1zOiB0cnVlfSk7XG4gICAgY29uc3QgbWF0Y2hXaWxkY2FyZFNlZ21lbnRzID0gb3B0aW9ucz8ubWF0Y2hXaWxkY2FyZFNlZ21lbnRzID8/IGZhbHNlO1xuXG4gICAgcmV0dXJuIHRoaXMuX3ZpZXdSZWdpc3RyeS52aWV3c1xuICAgICAgLmZpbHRlcih2aWV3ID0+IHtcbiAgICAgICAgY29uc3Qgdmlld1BhdGggPSB2aWV3LnVybFNlZ21lbnRzLm1hcChzZWdtZW50ID0+IHNlZ21lbnQucGF0aCk7XG4gICAgICAgIGlmIChjb21tYW5kUGF0aC5sZW5ndGggIT09IHZpZXdQYXRoLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbWFuZFBhdGguZXZlcnkoKGNvbW1hbmRTZWdtZW50LCBpbmRleCkgPT4gKG1hdGNoV2lsZGNhcmRTZWdtZW50cyAmJiBjb21tYW5kU2VnbWVudCA9PT0gJyonKSB8fCBjb21tYW5kU2VnbWVudCA9PT0gdmlld1BhdGhbaW5kZXhdKTtcbiAgICAgIH0pXG4gICAgICAubWFwKHZpZXcgPT4gdmlldy5pZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB3b3JrYmVuY2ggbmF2aWdhdGlvbiwgd2hlbiBiZWluZyBpbnZva2VkIGR1cmluZyBuYXZpZ2F0aW9uLCBvciB0aHJvd3MgYW4gZXJyb3Igb3RoZXJ3aXNlLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBnZXRDdXJyZW50TmF2aWdhdGlvbkNvbnRleHQoKTogV29ya2JlbmNoTmF2aWdhdGlvbkNvbnRleHQge1xuICAgIGlmICghdGhpcy5fY3VycmVudE5hdmlnYXRpb25Db250ZXh0KSB7XG4gICAgICB0aHJvdyBFcnJvcignW1dvcmtiZW5jaFJvdXRlckVycm9yXSBOYXZpZ2F0aW9uIGNvbnRleHQgbm90IGF2YWlsYWJsZSBhcyBubyBuYXZpZ2F0aW9uIGlzIGluIHByb2dyZXNzLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3VycmVudE5hdmlnYXRpb25Db250ZXh0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgbmF2aWdhdGlvbmFsIGNvbnRleHR1YWwgZGF0YS5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgc2V0Q3VycmVudE5hdmlnYXRpb25Db250ZXh0KGNvbnRleHQ6IFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0IHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuX2N1cnJlbnROYXZpZ2F0aW9uQ29udGV4dCA9IGNvbnRleHQ7XG4gIH1cblxuICAvKipcbiAgICogQmxvY2tzIHVudGlsIHRoZSBpbml0aWFsIGxheW91dCBpcyBhdmFpbGFibGUsIGkuZS4gYWZ0ZXIgY29tcGxldGlvbiBvZiBBbmd1bGFyJ3MgaW5pdGlhbCBuYXZpZ2F0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9ySW5pdGlhbExheW91dCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLl93b3JrYmVuY2hMYXlvdXRTZXJ2aWNlLmxheW91dCQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgZ2l2ZW4gY29tbWFuZHMgaW50byB2YWxpZCBVUkwgc2VnbWVudHMuXG4gICAqL1xuICBwcml2YXRlIHNlcmlhbGl6ZUNvbW1hbmRzKGNvbW1hbmRzOiBDb21tYW5kcywgb3B0aW9ucz86IHtza2lwTWF0cml4UGFyYW1zPzogYm9vbGVhbn0pOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2VyaWFsaXplZENvbW1hbmRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHNraXBNYXRyaXhQYXJhbXMgPSBvcHRpb25zPy5za2lwTWF0cml4UGFyYW1zID8/IGZhbHNlO1xuICAgIGNvbW1hbmRzLmZvckVhY2goY21kID0+IHtcbiAgICAgIC8vIGlmIG1hdHJpeCBwYXJhbSwgYXBwZW5kIGl0IHRvIHRoZSBsYXN0IHNlZ21lbnRcbiAgICAgIGNvbnN0IGlzTWF0cml4UGFyYW0gPSB0eXBlb2YgY21kID09PSAnb2JqZWN0JztcblxuICAgICAgaWYgKCFpc01hdHJpeFBhcmFtKSB7XG4gICAgICAgIHNlcmlhbGl6ZWRDb21tYW5kcy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChjbWQpKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKCFza2lwTWF0cml4UGFyYW1zKSB7XG4gICAgICAgIHNlcmlhbGl6ZWRDb21tYW5kcy5wdXNoKG5ldyBVcmxTZWdtZW50KHNlcmlhbGl6ZWRDb21tYW5kcy5wb3AoKSEsIGNtZCkudG9TdHJpbmcoKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2VyaWFsaXplZENvbW1hbmRzO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX3NpbmdsZVRhc2tFeGVjdXRvci5kZXN0cm95KCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29lcmNlTmF2aWdhdGlvbihuYXZpZ2F0aW9uOiDJtVdvcmtiZW5jaExheW91dCB8IFdvcmtiZW5jaE5hdmlnYXRpb24gfCBudWxsKTogV29ya2JlbmNoTmF2aWdhdGlvbiB8IG51bGwge1xuICByZXR1cm4gbmF2aWdhdGlvbiBpbnN0YW5jZW9mIMm1V29ya2JlbmNoTGF5b3V0ID8gKHtsYXlvdXQ6IG5hdmlnYXRpb259KSA6IG5hdmlnYXRpb247XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgZXh0cmEgb3B0aW9ucyB1c2VkIGR1cmluZyBuYXZpZ2F0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtiZW5jaE5hdmlnYXRpb25FeHRyYXMgZXh0ZW5kcyBOYXZpZ2F0aW9uRXh0cmFzIHtcbiAgLyoqXG4gICAqIEluc3RydWN0cyB0aGUgcm91dGVyIHRvIGFjdGl2YXRlIHRoZSB2aWV3LiBEZWZhdWx0cyB0byBgdHJ1ZWAgaWYgbm90IHNwZWNpZmllZC5cbiAgICovXG4gIGFjdGl2YXRlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgdmlldyhzKSB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgcGF0aC4gTWF0cml4IHBhcmFtZXRlcnMgZG8gbm90IGFmZmVjdCB2aWV3IHJlc29sdXRpb24uXG4gICAqIFRoZSBwYXRoIHN1cHBvcnRzIHRoZSBhc3RlcmlzayB3aWxkY2FyZCBzZWdtZW50IChgKmApIHRvIG1hdGNoIHZpZXcocykgd2l0aCBhbnkgdmFsdWUgaW4gdGhhdCBzZWdtZW50LlxuICAgKiBUbyBjbG9zZSBhIHNwZWNpZmljIHZpZXcsIHNldCBhIHZpZXcgdGFyZ2V0IGluc3RlYWQgb2YgYSBwYXRoLlxuICAgKi9cbiAgY2xvc2U/OiBib29sZWFuO1xuICAvKipcbiAgICogQ29udHJvbHMgd2hlcmUgdG8gb3BlbiB0aGUgdmlldy5cbiAgICpcbiAgICogT25lIG9mOlxuICAgKiAtICdhdXRvJzogICAgT3BlbnMgdGhlIHZpZXcgaW4gYSBuZXcgdmlldyB0YWIgaWYgbm8gdmlldyBpcyBmb3VuZCB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBwYXRoLiBNYXRyaXggcGFyYW1ldGVycyBkbyBub3QgYWZmZWN0XG4gICAqICAgICAgICAgICAgICB2aWV3IHJlc29sdXRpb24uIElmIG9uZSAob3IgbW9yZSkgdmlldyhzKSBtYXRjaCB0aGUgc3BlY2lmaWVkIHBhdGgsIHRoZXkgYXJlIG5hdmlnYXRlZCBpbnN0ZWFkIG9mIG9wZW5pbmcgdGhlIHZpZXdcbiAgICogICAgICAgICAgICAgIGluIGEgbmV3IHZpZXcgdGFiLCBlLmcuLCB0byB1cGRhdGUgbWF0cml4IHBhcmFtZXRlcnMuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaWYgbm90IHNldC5cbiAgICogLSAnYmxhbmsnOiAgIE9wZW5zIHRoZSB2aWV3IGluIGEgbmV3IHZpZXcgdGFiLlxuICAgKiAtIDx2aWV3LmlkPjogTmF2aWdhdGVzIHRoZSBzcGVjaWZpZWQgdmlldy4gSWYgYWxyZWFkeSBvcGVuZWQsIHJlcGxhY2VzIGl0LCBvciBvcGVucyB0aGUgdmlldyBpbiBhIG5ldyB2aWV3IHRhYiBvdGhlcndpc2UuXG4gICAqICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIHBhc3NlZCB2aWV3IGlkZW50aWZpZXIgbXVzdCBzdGFydCB3aXRoIGB2aWV3LmAsIGUuZy4sIGB2aWV3LjVgLlxuICAgKlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBgYXV0b2AuXG4gICAqL1xuICB0YXJnZXQ/OiBzdHJpbmcgfCAnYmxhbmsnIHwgJ2F1dG8nO1xuICAvKipcbiAgICogU3BlY2lmaWVzIGluIHdoaWNoIHBhcnQgdG8gb3BlbiB0aGUgdmlldy4gQnkgZGVmYXVsdCwgaWYgbm90IHNwZWNpZmllZCwgb3BlbnMgdGhlIHZpZXcgaW4gdGhlIGFjdGl2ZSBwYXJ0IG9mIHRoZSBtYWluIGFyZWEsXG4gICAqIGlmIHRoZSBsYXlvdXQgaGFzIG9uZSwgb3RoZXJ3aXNlIGluIHRoZSBhY3RpdmUgcGFydCBvZiB0aGUgbGF5b3V0LlxuICAgKi9cbiAgYmxhbmtQYXJ0SWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHBvc2l0aW9uIHdoZXJlIHRvIGluc2VydCB0aGUgdmlldyBpbnRvIHRoZSB0YWIgYmFyIHdoZW4gdXNpbmcgJ2JsYW5rJyB2aWV3IHRhcmdldCBzdHJhdGVneS5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgdGhlIHZpZXcgaXMgaW5zZXJ0ZWQgYWZ0ZXIgdGhlIGFjdGl2ZSB2aWV3LiBTZXQgdGhlIGluZGV4IHRvICdzdGFydCcgb3IgJ2VuZCcgZm9yIGluc2VydGluZ1xuICAgKiB0aGUgdmlldyBhdCB0aGUgYmVnaW5uaW5nIG9yIGF0IHRoZSBlbmQuXG4gICAqL1xuICBibGFua0luc2VydGlvbkluZGV4PzogbnVtYmVyIHwgJ3N0YXJ0JyB8ICdlbmQnO1xuICAvKipcbiAgICogU3RhdGUgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUgbmF2aWdhdGlvbi5cbiAgICpcbiAgICogU2VlIHtAbGluayBOYXZpZ2F0aW9uRXh0cmFzI3N0YXRlfSBmb3IgZGV0YWlsZWQgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBhY2Nlc3MgcGFzc2VkIHN0YXRlIGR1cmluZyBhbmQgYWZ0ZXIgdGhlIG5hdmlnYXRpb24uXG4gICAqXG4gICAqIEluIGFkZGl0aW9uLCB0aGUgd29ya2JlbmNoIHJvdXRlciBtYWtlcyBzdGF0ZSBhdmFpbGFibGUgdG8gdGhlIHJvdXRlZCBjb21wb25lbnQgYXMgcmVzb2x2ZWQgZGF0YSB1bmRlciB0aGUga2V5IHtAbGluayBXb3JrYmVuY2hSb3V0ZURhdGEuc3RhdGV9LlxuICAgKi9cbiAgc3RhdGU/OiBEaWN0aW9uYXJ5O1xuICAvKipcbiAgICogU3BlY2lmaWVzIENTUyBjbGFzcyhlcykgdG8gYmUgYWRkZWQgdG8gdGhlIHZpZXcsIHVzZWZ1bCBpbiBlbmQtdG8tZW5kIHRlc3RzIGZvciBsb2NhdGluZyB2aWV3IGFuZCB2aWV3IHRhYi5cbiAgICogQ1NTIGNsYXNzKGVzKSB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgYnJvd3NlciBVUkwsIGNvbnNlcXVlbnRseSB3aWxsIG5vdCBzdXJ2aXZlIGEgcGFnZSByZWxvYWQuXG4gICAqL1xuICBjc3NDbGFzcz86IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIENvbnRleHR1YWwgZGF0YSBvZiBhIHdvcmtiZW5jaCBuYXZpZ2F0aW9uIGF2YWlsYWJsZSBvbiB0aGUgcm91dGVyIGR1cmluZyBuYXZpZ2F0aW9uLlxuICpcbiAqIEBpbnRlcm5hbFxuICogQHNlZSBXb3JrYmVuY2hVcmxPYnNlcnZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtiZW5jaE5hdmlnYXRpb25Db250ZXh0IHtcbiAgLyoqXG4gICAqIExheW91dCB0byBiZSBhcHBsaWVkIGFmdGVyIHN1Y2Nlc3NmdWwgbmF2aWdhdGlvbi5cbiAgICovXG4gIGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQ7XG4gIC8qKlxuICAgKiBXb3JrYmVuY2ggbGF5b3V0IGVsZW1lbnRzIGFkZGVkIG9yIHJlbW92ZWQgYnkgdGhlIGN1cnJlbnQgbmF2aWdhdGlvbi5cbiAgICovXG4gIGxheW91dERpZmY6IFdvcmtiZW5jaExheW91dERpZmY7XG4gIC8qKlxuICAgKiBQb3B1cHMgYWRkZWQgb3IgcmVtb3ZlZCBieSB0aGUgY3VycmVudCBuYXZpZ2F0aW9uLlxuICAgKi9cbiAgcG9wdXBEaWZmOiBXb3JrYmVuY2hQb3B1cERpZmY7XG59XG5cbi8qKlxuICogQW4gYXJyYXkgb2YgVVJMIGZyYWdtZW50cyB3aXRoIHdoaWNoIHRvIGNvbnN0cnVjdCBhIHZpZXcncyBVUkwuXG4gKlxuICogSWYgdGhlIHBhdGggaXMgc3RhdGljLCBjYW4gYmUgdGhlIGxpdGVyYWwgVVJMIHN0cmluZy4gRm9yIGEgZHluYW1pYyBwYXRoLCBwYXNzIGFuIGFycmF5IG9mIHBhdGggc2VnbWVudHMsXG4gKiBmb2xsb3dlZCBieSB0aGUgcGFyYW1ldGVycyBmb3IgZWFjaCBzZWdtZW50LlxuICpcbiAqIFRoZSBsYXN0IHNlZ21lbnQgYWxsb3dzIGFkZGluZyBtYXRyaXggcGFyYW1ldGVycyBpbiB0aGUgZm9ybSBvZiBhIGRpY3Rpb25hcnkgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGRhdGEgYWxvbmdcbiAqIHdpdGggdGhlIFVSTC4gTWF0cml4IHBhcmFtZXRlcnMgZG8gbm90IGFmZmVjdCByb3V0ZSByZXNvbHV0aW9uLiBJbiB0aGUgcm91dGVkIGNvbXBvbmVudCwgbWF0cml4IHBhcmFtZXRlcnMgYXJlXG4gKiBhdmFpbGFibGUgaW4ge0BsaW5rIEFjdGl2YXRlZFJvdXRlI3BhcmFtc30uXG4gKlxuICogRXhhbXBsZSBjb21tYW5kIGFycmF5IHdpdGggJ2RldGFpbHMnIGFzIG1hdHJpeCBwYXJhbWV0ZXI6IGBbJ3VzZXInLCB1c2VyTmFtZSwge2RldGFpbHM6IHRydWV9XWAsXG4gKi9cbmV4cG9ydCB0eXBlIENvbW1hbmRzID0gYW55W107XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYSB3b3JrYmVuY2ggbmF2aWdhdGlvbiBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2JlbmNoTmF2aWdhdGlvbiB7XG4gIC8qKlxuICAgKiBUaGUgdGFyZ2V0IGxheW91dCB0byBhcHBseS5cbiAgICovXG4gIGxheW91dDogybVXb3JrYmVuY2hMYXlvdXQ7XG4gIC8qKlxuICAgKiBWaWV3IG91dGxldCBkZWx0YSB0byBhcHBseSB0byB0aGUgY3VycmVudCBVUkwuIEZvciBlYWNoIG91dGxldCB0byBhZGQsIHJlbW92ZSwgb3IgY2hhbmdlLFxuICAgKiBhZGQgYSBwcm9wZXJ0eSB0byB0aGlzIGRpY3Rpb25hcnkgYW5kIHNldCB0aGUgY29tbWFuZHMgdG8gY29uc3RydWN0IHRoZSBvdXRsZXQgVVJMLlxuICAgKiBUbyByZW1vdmUgYW4gb3V0bGV0IGZyb20gdGhlIFVSTCwgc2V0IGl0cyBjb21tYW5kcyB0byBgbnVsbGAuXG4gICAqL1xuICB2aWV3T3V0bGV0cz86IHtbb3V0bGV0OiBzdHJpbmddOiBDb21tYW5kcyB8IG51bGx9O1xuICAvKipcbiAgICogU3RhdGUgdG8gYmUgcGFzc2VkIHRvIHRoZSByb3V0ZWQgY29tcG9uZW50IGFzIHJlc29sdmVkIGRhdGEgdW5kZXIgdGhlIGtleSB7QGxpbmsgV29ya2JlbmNoUm91dGVEYXRhLnN0YXRlfS5cbiAgICovXG4gIHZpZXdTdGF0ZXM/OiB7W291dGxldDogc3RyaW5nXTogRGljdGlvbmFyeX07XG59XG4iXX0=
|
|
17
|
+
args: [{ providedIn: 'root', useExisting: ɵWorkbenchRouter }]
|
|
18
|
+
}] });
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2JlbmNoLXJvdXRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvcm91dGluZy93b3JrYmVuY2gtcm91dGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBV0EsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQzs7QUFFN0Q7Ozs7OztHQU1HO0FBRUgsTUFBTSxPQUFnQixlQUFlOzhHQUFmLGVBQWU7a0hBQWYsZUFBZSxjQURaLE1BQU0sZUFBZSxnQkFBZ0I7OzJGQUN4QyxlQUFlO2tCQURwQyxVQUFVO21CQUFDLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsZ0JBQWdCLEVBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDE4LTIwMjQgU3dpc3MgRmVkZXJhbCBSYWlsd2F5c1xuICpcbiAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGVcbiAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgMi4wXG4gKiB3aGljaCBpcyBhdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC9cbiAqXG4gKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbmltcG9ydCB7TmF2aWdhdGlvbkV4dHJhc30gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbW1hbmRzLCBOYXZpZ2F0ZUZuLCBXb3JrYmVuY2hOYXZpZ2F0aW9uRXh0cmFzfSBmcm9tICcuL3JvdXRpbmcubW9kZWwnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFJvdXRlcn0gZnJvbSAnLi/JtXdvcmtiZW5jaC1yb3V0ZXIuc2VydmljZSc7XG5cbi8qKlxuICogRW5hYmxlcyBuYXZpZ2F0aW9uIG9mIHdvcmtiZW5jaCB2aWV3cyBhbmQgbW9kaWZpY2F0aW9uIG9mIHRoZSB3b3JrYmVuY2ggbGF5b3V0LlxuICpcbiAqIEEgdmlldyBpcyBhIHZpc3VhbCB3b3JrYmVuY2ggZWxlbWVudCBmb3IgZGlzcGxheWluZyBjb250ZW50IHNpZGUtYnktc2lkZSBvciBzdGFja2VkLiBBIHZpZXcgY2FuIGJlIG5hdmlnYXRlZCB0byBhbnkgcm91dGUuXG4gKlxuICogQSB2aWV3IGNhbiBpbmplY3QgYEFjdGl2YXRlZFJvdXRlYCB0byBvYnRhaW4gcGFyYW1ldGVycyBwYXNzZWQgdG8gdGhlIG5hdmlnYXRpb24gYW5kL29yIHJlYWQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHJvdXRlLlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnLCB1c2VFeGlzdGluZzogybVXb3JrYmVuY2hSb3V0ZXJ9KVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFdvcmtiZW5jaFJvdXRlciB7XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYXJyYXkgb2YgY29tbWFuZHMgYW5kIGV4dHJhcy4gVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0byBBbmd1bGFyJ3MgYFJvdXRlci5uYXZpZ2F0ZSguLi4pYCwgYnV0IHdpdGggYSB2aWV3IGFzIHRoZSBuYXZpZ2F0aW9uIHRhcmdldC5cbiAgICpcbiAgICogQSBjb21tYW5kIGNhbiBiZSBhIHN0cmluZyBvciBhbiBvYmplY3QgbGl0ZXJhbC4gQSBzdHJpbmcgcmVwcmVzZW50cyBhIHBhdGggc2VnbWVudCwgYW4gb2JqZWN0IGxpdGVyYWwgYXNzb2NpYXRlcyBtYXRyaXggcGFyYW1ldGVycyB3aXRoIHRoZSBwcmVjZWRpbmcgc2VnbWVudC5cbiAgICogTXVsdGlwbGUgc2VnbWVudHMgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBzaW5nbGUgY29tbWFuZCwgc2VwYXJhdGVkIGJ5IGEgZm9yd2FyZCBzbGFzaC5cbiAgICpcbiAgICogQnkgZGVmYXVsdCwgbmF2aWdhdGVzIGV4aXN0aW5nIHZpZXdzIHRoYXQgbWF0Y2ggdGhlIHBhdGgsIG9yIG9wZW5zIGEgbmV3IHZpZXcgb3RoZXJ3aXNlLiBNYXRyaXggcGFyYW1zIGRvIG5vdCBhZmZlY3QgdmlldyByZXNvbHV0aW9uLlxuICAgKiBUaGlzIGJlaGF2aW9yIGNhbiBiZSBjaGFuZ2VkIGJ5IHNldHRpbmcgYW4gZXhwbGljaXQgbmF2aWdhdGlvbiB0YXJnZXQgaW4gbmF2aWdhdGlvbiBleHRyYXMuXG4gICAqXG4gICAqIEJ5IGRlZmF1bHQsIG5hdmlnYXRpb24gaXMgYWJzb2x1dGUuIFNldCBgcmVsYXRpdmVUb2AgaW4gZXh0cmFzIGZvciByZWxhdGl2ZSBuYXZpZ2F0aW9uLlxuICAgKlxuICAgKiBUaGUgcm91dGVyIHN1cHBvcnRzIGZvciBjbG9zaW5nIHZpZXdzIG1hdGNoaW5nIHRoZSByb3V0aW5nIGNvbW1hbmRzIGJ5IHNldHRpbmcgYGNsb3NlYCBpbiBuYXZpZ2F0aW9uIGV4dHJhcy5cbiAgICpcbiAgICogIyMjIFVzYWdlXG4gICAqIGBgYFxuICAgKiBpbmplY3QoV29ya2JlbmNoUm91dGVyKS5uYXZpZ2F0ZShbJ3RlYW0nLCAzMywgJ3VzZXInLCAxMV0pO1xuICAgKiBpbmplY3QoV29ya2JlbmNoUm91dGVyKS5uYXZpZ2F0ZShbJ3RlYW0vMTEvdXNlcicsIHVzZXJOYW1lLCB7ZGV0YWlsczogdHJ1ZX1dKTsgLy8gbXVsdGlwbGUgc3RhdGljIHNlZ21lbnRzIGNhbiBiZSBtZXJnZWQgaW50byBvbmVcbiAgICogaW5qZWN0KFdvcmtiZW5jaFJvdXRlcikubmF2aWdhdGUoWyd0ZWFtcycsIHtzZWxlY3Rpb246IDMzJ31dKTsgLy8gbWF0cml4IHBhcmFtZXRlciBgc2VsZWN0aW9uYCB3aXRoIHRoZSB2YWx1ZSBgMzNgLlxuICAgKiBgYGBcbiAgICpcbiAgICogQHNlZSBXb3JrYmVuY2hSb3V0ZXJMaW5rRGlyZWN0aXZlXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgbmF2aWdhdGUoY29tbWFuZHM6IENvbW1hbmRzLCBleHRyYXM/OiBXb3JrYmVuY2hOYXZpZ2F0aW9uRXh0cmFzKTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogUGVyZm9ybXMgY2hhbmdlcyB0byB0aGUgY3VycmVudCB3b3JrYmVuY2ggbGF5b3V0LlxuICAgKlxuICAgKiBUaGUgcm91dGVyIHdpbGwgaW52b2tlIHRoZSBwYXNzZWQgZnVuY3Rpb24gd2l0aCB0aGUgY3VycmVudCB3b3JrYmVuY2ggbGF5b3V0LiBUaGUgbGF5b3V0IGhhcyBtZXRob2RzIGZvciBtb2RpZnlpbmcgaXQuXG4gICAqIFRoZSBsYXlvdXQgaXMgaW1tdXRhYmxlLCBzbyBlYWNoIG1vZGlmaWNhdGlvbiBjcmVhdGVzIGEgbmV3IGluc3RhbmNlLiBVc2UgdGhlIGluc3RhbmNlIGZvciBmdXJ0aGVyIG1vZGlmaWNhdGlvbnMgYW5kIGZpbmFsbHkgcmV0dXJuIGl0LlxuICAgKlxuICAgKiBUaGUgZnVuY3Rpb24gY2FuIGNhbGwgYGluamVjdGAgdG8gZ2V0IGFueSByZXF1aXJlZCBkZXBlbmRlbmNpZXMuXG4gICAqXG4gICAqICMjIFdvcmtiZW5jaCBMYXlvdXRcbiAgICogVGhlIHdvcmtiZW5jaCBsYXlvdXQgaXMgYSBncmlkIG9mIHBhcnRzLiBQYXJ0cyBhcmUgYWxpZ25lZCByZWxhdGl2ZSB0byBlYWNoIG90aGVyLiBBIHBhcnQgaXMgYSBzdGFjayBvZiB2aWV3cy4gQ29udGVudCBpcyBkaXNwbGF5ZWQgaW4gdmlld3MuXG4gICAqXG4gICAqICMjIEV4YW1wbGVcbiAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGFkZHMgYSBwYXJ0IHRvIHRoZSBsZWZ0IG9mIHRoZSBtYWluIGFyZWEsIGluc2VydHMgYSB2aWV3IGFuZCBuYXZpZ2F0ZXMgaXQuXG4gICAqXG4gICAqIGBgYHRzXG4gICAqIGluamVjdChXb3JrYmVuY2hSb3V0ZXIpLm5hdmlnYXRlKGxheW91dCA9PiBsYXlvdXRcbiAgICogICAuYWRkUGFydCgnbGVmdCcsIHtyZWxhdGl2ZVRvOiBNQUlOX0FSRUEsIGFsaWduOiAnbGVmdCd9KVxuICAgKiAgIC5hZGRWaWV3KCduYXZpZ2F0b3InLCB7cGFydElkOiAnbGVmdCd9KVxuICAgKiAgIC5uYXZpZ2F0ZVZpZXcoJ25hdmlnYXRvcicsIFsncGF0aC90by92aWV3J10pXG4gICAqICAgLmFjdGl2YXRlVmlldygnbmF2aWdhdG9yJylcbiAgICogKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBvbk5hdmlnYXRlIC0gU3BlY2lmaWVzIHRoZSBjYWxsYmFjayB0byBtb2RpZnkgdGhlIGxheW91dC5cbiAgICogQHBhcmFtIGV4dHJhcyAtIENvbnRyb2xzIGhvdyB0byBwZXJmb3JtIHRoZSBuYXZpZ2F0aW9uLlxuICAgKiBAc2VlIE5hdmlnYXRlRm5cbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBuYXZpZ2F0ZShvbk5hdmlnYXRlOiBOYXZpZ2F0ZUZuLCBleHRyYXM/OiBPbWl0PE5hdmlnYXRpb25FeHRyYXMsICdyZWxhdGl2ZVRvJyB8ICdzdGF0ZSc+KTogUHJvbWlzZTxib29sZWFuPjtcbn1cbiJdfQ==
|