@scion/workbench 17.0.0-beta.9 → 18.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_index.scss +7 -5
- package/design/_workbench-global-styles.scss +18 -0
- package/design/_workbench-icon-font.scss +1 -1
- package/design/_workbench-popup-global-styles.scss +1 -1
- package/design/{_workbench-view-drag-image-global-styles.scss → _workbench-view-global-styles.scss} +1 -2
- package/esm2022/lib/activation-instant.provider.mjs +3 -3
- package/esm2022/lib/common/asserts.util.mjs +1 -1
- package/esm2022/lib/common/class-list.mjs +67 -29
- package/esm2022/lib/common/coerce-observable.pipe.mjs +3 -3
- package/esm2022/lib/common/dom.util.mjs +1 -1
- package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +4 -4
- package/esm2022/lib/common/instanceof.pipe.mjs +3 -3
- package/esm2022/lib/common/map-coerce.pipe.mjs +3 -3
- package/esm2022/lib/common/math.util.mjs +16 -0
- package/esm2022/lib/common/null-if-empty.pipe.mjs +4 -4
- package/esm2022/lib/common/objects.util.mjs +7 -1
- package/esm2022/lib/common/observables.mjs +1 -1
- package/esm2022/lib/common/operators.mjs +1 -12
- package/esm2022/lib/common/stringify-error.util.mjs +1 -1
- package/esm2022/lib/common/typeof.pipe.mjs +3 -3
- package/esm2022/lib/common/uid.util.mjs +22 -0
- package/esm2022/lib/common//311/265destroy-ref.mjs +1 -1
- package/esm2022/lib/content-projection/content-as-overlay.component.mjs +87 -30
- package/esm2022/lib/content-projection/workbench-element-references.mjs +32 -0
- 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 +5 -10
- package/esm2022/lib/dialog/dialog-header/workbench-dialog-header.directive.mjs +3 -3
- package/esm2022/lib/dialog/movable.directive.mjs +6 -6
- package/esm2022/lib/dialog/resizable.directive.mjs +6 -6
- package/esm2022/lib/dialog/workbench-dialog.component.mjs +27 -25
- package/esm2022/lib/dialog/workbench-dialog.mjs +61 -1
- package/esm2022/lib/dialog/workbench-dialog.registry.mjs +4 -4
- package/esm2022/lib/dialog/workbench-dialog.service.mjs +3 -3
- package/esm2022/lib/dialog//311/265workbench-dialog.mjs +99 -61
- package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +28 -25
- package/esm2022/lib/executor/latest-task-executor.mjs +55 -0
- package/esm2022/lib/executor/single-task-executor.mjs +9 -19
- package/esm2022/lib/filter-field/filter-field.component.mjs +8 -8
- package/esm2022/lib/glass-pane/glass-pane.directive.mjs +4 -4
- package/esm2022/lib/layout/grid-element/grid-element.component.mjs +10 -20
- package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +19 -22
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v5.model.mjs +11 -0
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v6.model.mjs +11 -0
- package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +7 -7
- package/esm2022/lib/layout/migration/workbench-layout-migration-v4.service.mjs +4 -4
- package/esm2022/lib/layout/migration/workbench-layout-migration-v5.service.mjs +67 -0
- package/esm2022/lib/layout/migration/workbench-layout-migration-v6.service.mjs +59 -0
- package/esm2022/lib/layout/stringifier.mjs +70 -0
- package/esm2022/lib/layout/workbench-layout.component.mjs +19 -23
- package/esm2022/lib/layout/workbench-layout.factory.mjs +3 -3
- package/esm2022/lib/layout/workbench-layout.mjs +1 -1
- package/esm2022/lib/layout/workbench-layout.model.mjs +1 -1
- package/esm2022/lib/layout/workbench-layout.service.mjs +28 -26
- package/esm2022/lib/layout/workbench-layouts.util.mjs +1 -9
- package/esm2022/lib/layout/workench-layout-serializer.service.mjs +22 -32
- package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +6 -5
- package/esm2022/lib/layout//311/265workbench-layout.mjs +77 -66
- package/esm2022/lib/logging/console-appender.service.mjs +4 -4
- package/esm2022/lib/logging/logger.mjs +3 -3
- package/esm2022/lib/logging/logging-support.mjs +7 -13
- package/esm2022/lib/logging/logging.model.mjs +3 -3
- package/esm2022/lib/logging//311/265logger.mjs +12 -12
- package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +9 -8
- package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +5 -5
- package/esm2022/lib/message-box/workbench-message-box.component.mjs +5 -5
- package/esm2022/lib/message-box/workbench-message-box.service.mjs +3 -3
- package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +6 -5
- package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +22 -6
- package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +29 -22
- package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +6 -6
- package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +14 -4
- package/esm2022/lib/microfrontend-platform/manifest-object-cache.service.mjs +63 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +8 -7
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +4 -4
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +8 -12
- package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +21 -12
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +10 -9
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +6 -6
- package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +17 -15
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +6 -5
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.interceptor.mjs +4 -4
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-legacy-intent-translator.interceptor.mjs +4 -4
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +10 -15
- package/esm2022/lib/microfrontend-platform/microfrontend-notification/microfrontend-notification-intent-handler.service.mjs +3 -3
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.mjs +39 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.mjs +120 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.mjs +55 -0
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.mjs +19 -0
- 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 +7 -6
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +13 -14
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +14 -30
- package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +5 -5
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +13 -29
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +92 -72
- package/esm2022/lib/microfrontend-platform/public_api.mjs +2 -1
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +8 -7
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +20 -18
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +30 -8
- package/esm2022/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.mjs +32 -0
- package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +29 -11
- package/esm2022/lib/migration/workbench-migrator.mjs +1 -1
- package/esm2022/lib/notification/notification-css-classes.pipe.mjs +3 -3
- package/esm2022/lib/notification/notification-list.component.mjs +6 -10
- package/esm2022/lib/notification/notification.component.mjs +6 -7
- package/esm2022/lib/notification/notification.service.mjs +8 -7
- package/esm2022/lib/notification/text-notification.component.mjs +3 -3
- package/esm2022/lib/notification//311/265notification.mjs +1 -1
- package/esm2022/lib/page-not-found/page-not-found.component.mjs +7 -9
- package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +12 -20
- package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +7 -7
- package/esm2022/lib/part/part-bar/part-bar.component.mjs +334 -265
- package/esm2022/lib/part/part-portal.pipe.mjs +10 -10
- package/esm2022/lib/part/part.component.mjs +34 -43
- package/esm2022/lib/part/view-context-menu/accelerator-format.pipe.mjs +4 -4
- package/esm2022/lib/part/view-context-menu/text.component.mjs +17 -13
- package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +6 -8
- package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +5 -5
- package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +50 -51
- package/esm2022/lib/part/view-list/view-list.component.mjs +42 -49
- package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +23 -27
- package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +16 -18
- package/esm2022/lib/part/view-tab/view-tab.component.mjs +100 -111
- package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +5 -6
- package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +17 -18
- package/esm2022/lib/part/workbench-part-action.registry.mjs +18 -42
- package/esm2022/lib/part/workbench-part.model.mjs +10 -1
- package/esm2022/lib/part/workbench-part.registry.mjs +11 -45
- package/esm2022/lib/part//311/265workbench-part.model.mjs +71 -55
- package/esm2022/lib/perspective/migration/workbench-perspective-migration-v2.service.mjs +4 -4
- package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +6 -6
- package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +4 -4
- package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +4 -4
- package/esm2022/lib/perspective/workbench-perspective.model.mjs +1 -1
- package/esm2022/lib/perspective/workbench-perspective.registry.mjs +11 -43
- package/esm2022/lib/perspective/workbench-perspective.service.mjs +73 -64
- package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +5 -5
- package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +62 -47
- package/esm2022/lib/popup/popup.component.mjs +6 -6
- package/esm2022/lib/popup/popup.config.mjs +27 -25
- package/esm2022/lib/popup/popup.service.mjs +171 -176
- package/esm2022/lib/portal/wb-component-portal.mjs +18 -17
- package/esm2022/lib/portal/workbench-portal-outlet.directive.mjs +4 -4
- package/esm2022/lib/public_api.mjs +1 -1
- package/esm2022/lib/registry/workbench-object-registry.mjs +38 -17
- package/esm2022/lib/routing/empty-outlet/empty-outlet.component.mjs +3 -3
- package/esm2022/lib/routing/public_api.mjs +2 -2
- package/esm2022/lib/routing/routing.model.mjs +1 -1
- package/esm2022/lib/routing/routing.util.mjs +215 -0
- package/esm2022/lib/routing/url-segment-matcher.mjs +1 -1
- package/esm2022/lib/routing/workbench-auxiliary-route-installer.service.mjs +110 -0
- package/esm2022/lib/routing/workbench-dialog-differ.mjs +6 -6
- package/esm2022/lib/routing/workbench-layout-differ.mjs +6 -13
- package/esm2022/lib/routing/workbench-message-box-differ.mjs +6 -6
- package/esm2022/lib/routing/workbench-navigational-states.mjs +2 -2
- package/esm2022/lib/routing/workbench-popup-differ.mjs +6 -6
- package/esm2022/lib/routing/workbench-route-guards.mjs +57 -0
- package/esm2022/lib/routing/workbench-router-link.directive.mjs +5 -5
- package/esm2022/lib/routing/workbench-router.service.mjs +3 -3
- package/esm2022/lib/routing/workbench-url-observer.service.mjs +143 -151
- package/esm2022/lib/routing/workbench-view-outlet-differ.mjs +58 -0
- package/esm2022/lib/routing//311/265location.mjs +3 -3
- package/esm2022/lib/routing//311/265workbench-router.service.mjs +121 -76
- package/esm2022/lib/startup/splash/splash.component.mjs +5 -5
- package/esm2022/lib/startup/workbench-initializer.mjs +1 -1
- package/esm2022/lib/startup/workbench-launcher.service.mjs +28 -16
- package/esm2022/lib/storage/workbench-storage.mjs +3 -3
- package/esm2022/lib/testing/workbench-testing.module.mjs +4 -4
- package/esm2022/lib/testing/workbench.provider.mjs +5 -5
- package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +18 -22
- package/esm2022/lib/view/public_api.mjs +1 -2
- package/esm2022/lib/view/view-move-handler.service.mjs +73 -58
- package/esm2022/lib/view/view-portal.pipe.mjs +9 -9
- package/esm2022/lib/view/view.component.mjs +55 -43
- package/esm2022/lib/view/workbench-view.model.mjs +1 -1
- package/esm2022/lib/view/workbench-view.registry.mjs +11 -45
- package/esm2022/lib/view//311/265workbench-view.model.mjs +183 -153
- package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +2 -2
- package/esm2022/lib/view-dnd/requires-drop-zone.pipe.mjs +4 -4
- package/esm2022/lib/view-dnd/view-drag.service.mjs +89 -73
- package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +9 -9
- package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +9 -9
- package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +45 -58
- package/esm2022/lib/workbench-config.mjs +2 -2
- package/esm2022/lib/workbench-id.mjs +3 -3
- package/esm2022/lib/workbench.component.mjs +67 -55
- package/esm2022/lib/workbench.constants.mjs +1 -5
- package/esm2022/lib/workbench.model.mjs +1 -1
- package/esm2022/lib/workbench.module.mjs +4 -4
- package/esm2022/lib/workbench.provider.mjs +3 -9
- package/esm2022/lib/workbench.service.mjs +4 -4
- package/esm2022/lib//311/265workbench.service.mjs +40 -44
- package/fesm2022/scion-workbench.mjs +4348 -3628
- package/fesm2022/scion-workbench.mjs.map +1 -1
- package/lib/common/class-list.d.ts +35 -22
- package/lib/common/math.util.d.ts +7 -0
- package/lib/common/objects.util.d.ts +6 -2
- package/lib/common/operators.d.ts +1 -6
- package/lib/common/uid.util.d.ts +9 -0
- package/lib/content-projection/content-as-overlay.component.d.ts +39 -22
- package/lib/content-projection/workbench-element-references.d.ts +13 -0
- package/lib/dialog/workbench-dialog.component.d.ts +3 -2
- package/lib/dialog/workbench-dialog.d.ts +57 -13
- package/lib/dialog//311/265workbench-dialog.d.ts +38 -24
- package/lib/dialog//311/265workbench-dialog.service.d.ts +10 -11
- package/lib/executor/latest-task-executor.d.ts +26 -0
- package/lib/executor/single-task-executor.d.ts +5 -8
- package/lib/filter-field/filter-field.component.d.ts +1 -1
- package/lib/layout/grid-element/grid-element.component.d.ts +1 -8
- package/lib/layout/main-area-layout/main-area-layout.component.d.ts +0 -4
- package/lib/layout/migration/model/workbench-layout-migration-v5.model.d.ts +36 -0
- package/lib/layout/migration/model/workbench-layout-migration-v6.model.d.ts +35 -0
- package/lib/layout/migration/{workbench-layout-migration-v2.service.d.ts → workbench-layout-migration-v5.service.d.ts} +4 -5
- package/lib/layout/migration/workbench-layout-migration-v6.service.d.ts +12 -0
- package/lib/layout/stringifier.d.ts +26 -0
- package/lib/layout/workbench-layout.component.d.ts +4 -5
- package/lib/layout/workbench-layout.d.ts +9 -6
- package/lib/layout/workbench-layout.model.d.ts +4 -3
- package/lib/layout/workbench-layout.service.d.ts +14 -16
- package/lib/layout/workbench-layouts.util.d.ts +0 -6
- package/lib/layout/workench-layout-serializer.service.d.ts +13 -16
- package/lib/layout//311/265workbench-layout.d.ts +18 -19
- package/lib/layout//311/265workbench-layout.factory.d.ts +3 -2
- package/lib/logging//311/265logger.d.ts +2 -3
- package/lib/microfrontend-platform/common/microfrontend.util.d.ts +5 -1
- package/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.d.ts +7 -3
- package/lib/microfrontend-platform/manifest-object-cache.service.d.ts +33 -0
- package/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.d.ts +3 -6
- package/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.d.ts +2 -1
- package/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.d.ts +1 -1
- package/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.d.ts +2 -1
- package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.d.ts +10 -0
- package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.d.ts +24 -0
- package/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.d.ts +20 -0
- package/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.d.ts +9 -0
- package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.d.ts +4 -8
- package/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.d.ts +0 -4
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.d.ts +5 -12
- package/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.d.ts +23 -33
- package/lib/microfrontend-platform/public_api.d.ts +1 -0
- package/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.d.ts +1 -1
- package/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.d.ts +3 -7
- package/lib/microfrontend-platform/routing/microfrontend-view-routes.d.ts +9 -2
- package/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.d.ts +11 -0
- package/lib/notification/notification-list.component.d.ts +0 -2
- package/lib/page-not-found/page-not-found.component.d.ts +1 -0
- package/lib/part/part-action-bar/part-action-bar.component.d.ts +3 -4
- package/lib/part/part-action-bar/part-action.directive.d.ts +2 -2
- package/lib/part/part-bar/part-bar.component.d.ts +73 -63
- package/lib/part/part-portal.pipe.d.ts +3 -5
- package/lib/part/part.component.d.ts +9 -12
- package/lib/part/view-context-menu/text.component.d.ts +3 -4
- package/lib/part/view-context-menu/view-menu.directive.d.ts +1 -1
- package/lib/part/view-context-menu/view-menu.service.d.ts +13 -17
- package/lib/part/view-list/view-list.component.d.ts +8 -21
- package/lib/part/view-list-button/view-list-button.component.d.ts +8 -11
- package/lib/part/view-list-item/view-list-item.component.d.ts +3 -7
- package/lib/part/view-tab/view-tab.component.d.ts +19 -29
- package/lib/part/view-tab-drag-image/view-tab-drag-image.component.d.ts +4 -4
- package/lib/part/workbench-part-action.registry.d.ts +3 -23
- package/lib/part/workbench-part.model.d.ts +8 -27
- package/lib/part/workbench-part.registry.d.ts +3 -26
- package/lib/part//311/265workbench-part.model.d.ts +23 -17
- package/lib/perspective/workbench-perspective.model.d.ts +18 -25
- package/lib/perspective/workbench-perspective.registry.d.ts +3 -26
- package/lib/perspective/workbench-perspective.service.d.ts +16 -14
- package/lib/perspective/workench-perspective-serializer.service.d.ts +1 -1
- package/lib/perspective//311/265workbench-perspective.model.d.ts +30 -21
- package/lib/popup/popup.config.d.ts +11 -10
- package/lib/popup/popup.service.d.ts +15 -28
- package/lib/portal/wb-component-portal.d.ts +21 -5
- package/lib/public_api.d.ts +1 -1
- package/lib/registry/workbench-object-registry.d.ts +10 -6
- package/lib/routing/public_api.d.ts +2 -2
- package/lib/routing/routing.model.d.ts +25 -13
- package/lib/routing/{router.util.d.ts → routing.util.d.ts} +28 -1
- package/lib/routing/{workbench-auxiliary-routes-registrator.service.d.ts → workbench-auxiliary-route-installer.service.d.ts} +10 -3
- package/lib/routing/workbench-layout-differ.d.ts +1 -2
- package/lib/routing/workbench-navigational-states.d.ts +8 -4
- package/lib/{view/workbench-view-route-guards.d.ts → routing/workbench-route-guards.d.ts} +8 -2
- package/lib/routing/workbench-url-observer.service.d.ts +31 -55
- package/lib/routing/workbench-view-outlet-differ.d.ts +32 -0
- package/lib/routing//311/265workbench-router.service.d.ts +22 -18
- package/lib/startup/workbench-launcher.service.d.ts +4 -5
- package/lib/testing/workbench.provider.d.ts +3 -1
- package/lib/theme/workbench-theme-switcher.service.d.ts +4 -6
- package/lib/view/public_api.d.ts +0 -1
- package/lib/view/view-move-handler.service.d.ts +16 -14
- package/lib/view/view-portal.pipe.d.ts +1 -3
- package/lib/view/view.component.d.ts +21 -12
- package/lib/view/workbench-view.model.d.ts +88 -36
- package/lib/view/workbench-view.registry.d.ts +3 -27
- package/lib/view//311/265workbench-view.model.d.ts +62 -71
- package/lib/view-dnd/view-drag.service.d.ts +79 -49
- package/lib/view-dnd/view-drop-placeholder-renderer.service.d.ts +1 -1
- package/lib/view-dnd/view-tab-drag-image-renderer.service.d.ts +12 -36
- package/lib/workbench-config.d.ts +19 -7
- package/lib/workbench.component.d.ts +16 -30
- package/lib/workbench.constants.d.ts +0 -5
- package/lib/workbench.model.d.ts +31 -3
- package/lib/workbench.service.d.ts +58 -56
- package/lib//311/265workbench.service.d.ts +18 -31
- package/package.json +12 -12
- package/esm2022/lib/common/filter-by-predicate.pipe.mjs +0 -27
- package/esm2022/lib/common/filter-by-text.pipe.mjs +0 -39
- package/esm2022/lib/common/uuid.util.mjs +0 -17
- package/esm2022/lib/content-projection/content-projection.directive.mjs +0 -101
- package/esm2022/lib/content-projection/view-container.reference.mjs +0 -68
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v1.model.mjs +0 -11
- package/esm2022/lib/layout/migration/workbench-layout-migration-v2.service.mjs +0 -59
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.mjs +0 -41
- package/esm2022/lib/page-not-found/format-url.pipe.mjs +0 -26
- package/esm2022/lib/part/part-action-bar/part-action-filter.pipe.mjs +0 -26
- package/esm2022/lib/routing/router.util.mjs +0 -126
- package/esm2022/lib/routing/workbench-auxiliary-routes-registrator.service.mjs +0 -94
- package/esm2022/lib/view/workbench-view-route-guards.mjs +0 -47
- package/lib/common/filter-by-predicate.pipe.d.ts +0 -10
- package/lib/common/filter-by-text.pipe.d.ts +0 -12
- package/lib/common/uuid.util.d.ts +0 -8
- package/lib/content-projection/content-projection.directive.d.ts +0 -30
- package/lib/content-projection/view-container.reference.d.ts +0 -42
- package/lib/layout/migration/model/workbench-layout-migration-v1.model.d.ts +0 -16
- package/lib/microfrontend-platform/routing/microfrontend-view-capability-id-assigner.interceptor.d.ts +0 -10
- package/lib/page-not-found/format-url.pipe.d.ts +0 -11
- package/lib/part/part-action-bar/part-action-filter.pipe.d.ts +0 -11
|
@@ -7,22 +7,21 @@
|
|
|
7
7
|
*
|
|
8
8
|
* SPDX-License-Identifier: EPL-2.0
|
|
9
9
|
*/
|
|
10
|
-
import { Injectable, Injector, runInInjectionContext } from '@angular/core';
|
|
11
|
-
import { OverlayConfig, OverlayRef } from '@angular/cdk/overlay';
|
|
10
|
+
import { inject, Injectable, Injector, NgZone, runInInjectionContext } from '@angular/core';
|
|
11
|
+
import { Overlay, OverlayConfig, OverlayRef } from '@angular/cdk/overlay';
|
|
12
12
|
import { ComponentPortal } from '@angular/cdk/portal';
|
|
13
13
|
import { ViewMenuComponent } from './view-menu.component';
|
|
14
|
+
import { WORKBENCH_VIEW_REGISTRY } from '../../view/workbench-view.registry';
|
|
14
15
|
import { filter, map, switchMap, takeUntil } from 'rxjs/operators';
|
|
15
16
|
import { firstValueFrom, fromEvent, Observable, Subject } from 'rxjs';
|
|
16
17
|
import { coerceElement } from '@angular/cdk/coercion';
|
|
17
18
|
import { TEXT, TextComponent } from '../view-context-menu/text.component';
|
|
18
|
-
import {
|
|
19
|
+
import { WorkbenchConfig } from '../../workbench-config';
|
|
20
|
+
import { WorkbenchService } from '../../workbench.service';
|
|
21
|
+
import { filterArray, observeIn } from '@scion/toolkit/operators';
|
|
19
22
|
import { provideViewContext } from '../../view/view-context-provider';
|
|
20
23
|
import { Arrays } from '@scion/toolkit/util';
|
|
21
24
|
import * as i0 from "@angular/core";
|
|
22
|
-
import * as i1 from "@angular/cdk/overlay";
|
|
23
|
-
import * as i2 from "../../view/workbench-view.registry";
|
|
24
|
-
import * as i3 from "../../workbench.service";
|
|
25
|
-
import * as i4 from "../../workbench-config";
|
|
26
25
|
/**
|
|
27
26
|
* Shows menu items of a {@link WorkbenchView} in a menu.
|
|
28
27
|
*/
|
|
@@ -31,19 +30,19 @@ export class ViewMenuService {
|
|
|
31
30
|
static { this.TOP_RIGHT = { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'top' }; }
|
|
32
31
|
static { this.BOTTOM_LEFT = { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' }; }
|
|
33
32
|
static { this.BOTTOM_RIGHT = { originX: 'start', originY: 'top', overlayX: 'end', overlayY: 'bottom' }; }
|
|
34
|
-
constructor(
|
|
35
|
-
this._overlay =
|
|
36
|
-
this._injector =
|
|
37
|
-
this._zone =
|
|
38
|
-
this._viewRegistry =
|
|
39
|
-
this._workbenchService =
|
|
40
|
-
this._workbenchConfig =
|
|
33
|
+
constructor() {
|
|
34
|
+
this._overlay = inject(Overlay);
|
|
35
|
+
this._injector = inject(Injector);
|
|
36
|
+
this._zone = inject(NgZone);
|
|
37
|
+
this._viewRegistry = inject(WORKBENCH_VIEW_REGISTRY);
|
|
38
|
+
this._workbenchService = inject(WorkbenchService);
|
|
39
|
+
this._workbenchConfig = inject(WorkbenchConfig);
|
|
41
40
|
// Registers built-in menu items added to the context menu of every view tab.
|
|
42
|
-
this.
|
|
43
|
-
this.
|
|
44
|
-
this.
|
|
45
|
-
this.
|
|
46
|
-
this.
|
|
41
|
+
this.registerCloseMenuItem();
|
|
42
|
+
this.registerCloseOtherTabsMenuItem();
|
|
43
|
+
this.registerCloseAllTabsMenuItem();
|
|
44
|
+
this.registerCloseRightTabsMenuItem();
|
|
45
|
+
this.registerCloseLeftTabsMenuItem();
|
|
47
46
|
this.registerMoveRightMenuItem();
|
|
48
47
|
this.registerMoveLeftMenuItem();
|
|
49
48
|
this.registerMoveUpMenuItem();
|
|
@@ -89,7 +88,7 @@ export class ViewMenuService {
|
|
|
89
88
|
return new Observable(() => {
|
|
90
89
|
const unsubscribe$ = new Subject();
|
|
91
90
|
view.menuItems$
|
|
92
|
-
.pipe(
|
|
91
|
+
.pipe(observeIn(fn => this._zone.runOutsideAngular(fn)),
|
|
93
92
|
// Skip menu items which have no accelerator configured.
|
|
94
93
|
filterArray((menuItem) => !!menuItem.accelerator?.length), filter(menuItems => menuItems.length > 0),
|
|
95
94
|
// Subscribe for keyboard events.
|
|
@@ -113,7 +112,7 @@ export class ViewMenuService {
|
|
|
113
112
|
}
|
|
114
113
|
return true;
|
|
115
114
|
}),
|
|
116
|
-
})), filter(({ menuItems }) => menuItems.length > 0),
|
|
115
|
+
})), filter(({ menuItems }) => menuItems.length > 0), observeIn(fn => this._zone.run(fn)), takeUntil(unsubscribe$))
|
|
117
116
|
.subscribe(({ event, menuItems }) => {
|
|
118
117
|
event.preventDefault();
|
|
119
118
|
event.stopPropagation();
|
|
@@ -124,8 +123,8 @@ export class ViewMenuService {
|
|
|
124
123
|
return () => unsubscribe$.next();
|
|
125
124
|
});
|
|
126
125
|
}
|
|
127
|
-
|
|
128
|
-
const defaults = { visible: true, text: 'Close
|
|
126
|
+
registerCloseMenuItem() {
|
|
127
|
+
const defaults = { visible: true, text: 'Close', group: 'close', accelerator: ['ctrl', 'k'], cssClass: 'e2e-close' };
|
|
129
128
|
const appConfig = this._workbenchConfig.viewMenuItems?.close;
|
|
130
129
|
const config = { ...defaults, ...appConfig };
|
|
131
130
|
config.visible && this._workbenchService.registerViewMenuItem((view) => {
|
|
@@ -138,13 +137,13 @@ export class ViewMenuService {
|
|
|
138
137
|
accelerator: config.accelerator,
|
|
139
138
|
group: config.group,
|
|
140
139
|
cssClass: config.cssClass,
|
|
141
|
-
isDisabled: () => !view.closable,
|
|
140
|
+
isDisabled: () => !view.closable(),
|
|
142
141
|
onAction: () => void view.close().then(),
|
|
143
142
|
});
|
|
144
143
|
});
|
|
145
144
|
}
|
|
146
|
-
|
|
147
|
-
const defaults = { visible: true, text: 'Close other tabs', group: 'close', accelerator: ['ctrl', 'shift', 'k'] };
|
|
145
|
+
registerCloseOtherTabsMenuItem() {
|
|
146
|
+
const defaults = { visible: true, text: 'Close other tabs', group: 'close', accelerator: ['ctrl', 'shift', 'k'], cssClass: ' e2e-close-other-tabs' };
|
|
148
147
|
const appConfig = this._workbenchConfig.viewMenuItems?.closeOthers;
|
|
149
148
|
const config = { ...defaults, ...appConfig };
|
|
150
149
|
config.visible && this._workbenchService.registerViewMenuItem((view) => {
|
|
@@ -157,12 +156,12 @@ export class ViewMenuService {
|
|
|
157
156
|
accelerator: config.accelerator,
|
|
158
157
|
group: config.group,
|
|
159
158
|
cssClass: config.cssClass,
|
|
160
|
-
isDisabled: () => view.first && view.last,
|
|
159
|
+
isDisabled: () => view.first() && view.last(),
|
|
161
160
|
onAction: () => void view.close('other-views').then(),
|
|
162
161
|
});
|
|
163
162
|
});
|
|
164
163
|
}
|
|
165
|
-
|
|
164
|
+
registerCloseAllTabsMenuItem() {
|
|
166
165
|
const defaults = { visible: true, text: 'Close all tabs', group: 'close', accelerator: ['ctrl', 'shift', 'alt', 'k'], cssClass: 'e2e-close-all-tabs' };
|
|
167
166
|
const appConfig = this._workbenchConfig.viewMenuItems?.closeAll;
|
|
168
167
|
const config = { ...defaults, ...appConfig };
|
|
@@ -180,8 +179,8 @@ export class ViewMenuService {
|
|
|
180
179
|
});
|
|
181
180
|
});
|
|
182
181
|
}
|
|
183
|
-
|
|
184
|
-
const defaults = { visible: true, text: 'Close tabs to the right', group: 'close' };
|
|
182
|
+
registerCloseRightTabsMenuItem() {
|
|
183
|
+
const defaults = { visible: true, text: 'Close tabs to the right', group: 'close', cssClass: 'e2e-close-right-tabs' };
|
|
185
184
|
const appConfig = this._workbenchConfig.viewMenuItems?.closeToTheRight;
|
|
186
185
|
const config = { ...defaults, ...appConfig };
|
|
187
186
|
config.visible && this._workbenchService.registerViewMenuItem((view) => {
|
|
@@ -194,13 +193,13 @@ export class ViewMenuService {
|
|
|
194
193
|
accelerator: config.accelerator,
|
|
195
194
|
group: config.group,
|
|
196
195
|
cssClass: config.cssClass,
|
|
197
|
-
isDisabled: () => view.last,
|
|
196
|
+
isDisabled: () => view.last(),
|
|
198
197
|
onAction: () => void view.close('views-to-the-right').then(),
|
|
199
198
|
};
|
|
200
199
|
});
|
|
201
200
|
}
|
|
202
|
-
|
|
203
|
-
const defaults = { visible: true, text: 'Close tabs to the left', group: 'close' };
|
|
201
|
+
registerCloseLeftTabsMenuItem() {
|
|
202
|
+
const defaults = { visible: true, text: 'Close tabs to the left', group: 'close', cssClass: 'e2e-close-left-tabs' };
|
|
204
203
|
const appConfig = this._workbenchConfig.viewMenuItems?.closeToTheLeft;
|
|
205
204
|
const config = { ...defaults, ...appConfig };
|
|
206
205
|
config.visible && this._workbenchService.registerViewMenuItem((view) => {
|
|
@@ -213,13 +212,13 @@ export class ViewMenuService {
|
|
|
213
212
|
accelerator: config.accelerator,
|
|
214
213
|
group: config.group,
|
|
215
214
|
cssClass: config.cssClass,
|
|
216
|
-
isDisabled: () => view.first,
|
|
215
|
+
isDisabled: () => view.first(),
|
|
217
216
|
onAction: () => void view.close('views-to-the-left').then(),
|
|
218
217
|
};
|
|
219
218
|
});
|
|
220
219
|
}
|
|
221
220
|
registerMoveRightMenuItem() {
|
|
222
|
-
const defaults = { visible: true, text: 'Move right', group: 'move', accelerator: ['ctrl', 'alt', 'end'] };
|
|
221
|
+
const defaults = { visible: true, text: 'Move right', group: 'move', accelerator: ['ctrl', 'alt', 'end'], cssClass: 'e2e-move-right' };
|
|
223
222
|
const appConfig = this._workbenchConfig.viewMenuItems?.moveRight;
|
|
224
223
|
const config = { ...defaults, ...appConfig };
|
|
225
224
|
config.visible && this._workbenchService.registerViewMenuItem((view) => {
|
|
@@ -232,13 +231,13 @@ export class ViewMenuService {
|
|
|
232
231
|
accelerator: config.accelerator,
|
|
233
232
|
group: config.group,
|
|
234
233
|
cssClass: config.cssClass,
|
|
235
|
-
isDisabled: () => view.first && view.last,
|
|
236
|
-
onAction: () => view.move(view.part.id, { region: 'east' }),
|
|
234
|
+
isDisabled: () => view.first() && view.last(),
|
|
235
|
+
onAction: () => view.move(view.part().id, { region: 'east' }),
|
|
237
236
|
};
|
|
238
237
|
});
|
|
239
238
|
}
|
|
240
239
|
registerMoveLeftMenuItem() {
|
|
241
|
-
const defaults = { visible: true, text: 'Move left', group: 'move' };
|
|
240
|
+
const defaults = { visible: true, text: 'Move left', group: 'move', cssClass: 'e2e-move-left' };
|
|
242
241
|
const appConfig = this._workbenchConfig.viewMenuItems?.moveLeft;
|
|
243
242
|
const config = { ...defaults, ...appConfig };
|
|
244
243
|
config.visible && this._workbenchService.registerViewMenuItem((view) => {
|
|
@@ -251,13 +250,13 @@ export class ViewMenuService {
|
|
|
251
250
|
accelerator: config.accelerator,
|
|
252
251
|
group: config.group,
|
|
253
252
|
cssClass: config.cssClass,
|
|
254
|
-
isDisabled: () => view.first && view.last,
|
|
255
|
-
onAction: () => view.move(view.part.id, { region: 'west' }),
|
|
253
|
+
isDisabled: () => view.first() && view.last(),
|
|
254
|
+
onAction: () => view.move(view.part().id, { region: 'west' }),
|
|
256
255
|
};
|
|
257
256
|
});
|
|
258
257
|
}
|
|
259
258
|
registerMoveUpMenuItem() {
|
|
260
|
-
const defaults = { visible: true, text: 'Move up', group: 'move' };
|
|
259
|
+
const defaults = { visible: true, text: 'Move up', group: 'move', cssClass: 'e2e-move-up' };
|
|
261
260
|
const appConfig = this._workbenchConfig.viewMenuItems?.moveUp;
|
|
262
261
|
const config = { ...defaults, ...appConfig };
|
|
263
262
|
config.visible && this._workbenchService.registerViewMenuItem((view) => {
|
|
@@ -270,13 +269,13 @@ export class ViewMenuService {
|
|
|
270
269
|
accelerator: config.accelerator,
|
|
271
270
|
group: config.group,
|
|
272
271
|
cssClass: config.cssClass,
|
|
273
|
-
isDisabled: () => view.first && view.last,
|
|
274
|
-
onAction: () => view.move(view.part.id, { region: 'north' }),
|
|
272
|
+
isDisabled: () => view.first() && view.last(),
|
|
273
|
+
onAction: () => view.move(view.part().id, { region: 'north' }),
|
|
275
274
|
};
|
|
276
275
|
});
|
|
277
276
|
}
|
|
278
277
|
registerMoveDownMenuItem() {
|
|
279
|
-
const defaults = { visible: true, text: 'Move down', group: 'move' };
|
|
278
|
+
const defaults = { visible: true, text: 'Move down', group: 'move', cssClass: 'e2e-move-down' };
|
|
280
279
|
const appConfig = this._workbenchConfig.viewMenuItems?.moveDown;
|
|
281
280
|
const config = { ...defaults, ...appConfig };
|
|
282
281
|
config.visible && this._workbenchService.registerViewMenuItem((view) => {
|
|
@@ -289,8 +288,8 @@ export class ViewMenuService {
|
|
|
289
288
|
accelerator: config.accelerator,
|
|
290
289
|
group: config.group,
|
|
291
290
|
cssClass: config.cssClass,
|
|
292
|
-
isDisabled: () => view.first && view.last,
|
|
293
|
-
onAction: () => view.move(view.part.id, { region: 'south' }),
|
|
291
|
+
isDisabled: () => view.first() && view.last(),
|
|
292
|
+
onAction: () => view.move(view.part().id, { region: 'south' }),
|
|
294
293
|
};
|
|
295
294
|
});
|
|
296
295
|
}
|
|
@@ -312,13 +311,13 @@ export class ViewMenuService {
|
|
|
312
311
|
};
|
|
313
312
|
});
|
|
314
313
|
}
|
|
315
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
316
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
314
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewMenuService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
315
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewMenuService, providedIn: 'root' }); }
|
|
317
316
|
}
|
|
318
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
317
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: ViewMenuService, decorators: [{
|
|
319
318
|
type: Injectable,
|
|
320
319
|
args: [{ providedIn: 'root' }]
|
|
321
|
-
}], ctorParameters: () => [
|
|
320
|
+
}], ctorParameters: () => [] });
|
|
322
321
|
/**
|
|
323
322
|
* Returns the pressed modifier keys (ctrl, shift, alt, meta) as array items.
|
|
324
323
|
*/
|
|
@@ -338,4 +337,4 @@ function getModifierState(event) {
|
|
|
338
337
|
}
|
|
339
338
|
return modifierState;
|
|
340
339
|
}
|
|
341
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy1tZW51LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9wYXJ0L3ZpZXctY29udGV4dC1tZW51L3ZpZXctbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFhLFVBQVUsRUFBRSxRQUFRLEVBQVUscUJBQXFCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUE2QixhQUFhLEVBQUUsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDM0YsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3hELE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNuRixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFDLElBQUksRUFBRSxhQUFhLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUd4RSxPQUFPLEVBQUMsV0FBVyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUdyRixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUNwRSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7Ozs7OztBQUUzQzs7R0FFRztBQUVILE1BQU0sT0FBTyxlQUFlO2FBRUYsYUFBUSxHQUFzQixFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUss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QUFhLEdBQWEsRUFBRSxDQUFDO0lBQ25DLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtRQUNqQixhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFO1FBQ2xCLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDN0I7SUFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7UUFDaEIsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUMzQjtJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtRQUNqQixhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsT0FBTyxhQUFhLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMiBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtFbGVtZW50UmVmLCBJbmplY3RhYmxlLCBJbmplY3RvciwgTmdab25lLCBydW5JbkluamVjdGlvbkNvbnRleHR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb25uZWN0ZWRQb3NpdGlvbiwgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheVJlZn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHtDb21wb25lbnRQb3J0YWx9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHtWaWV3TWVudUNvbXBvbmVudH0gZnJvbSAnLi92aWV3LW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7V29ya2JlbmNoTWVudUl0ZW19IGZyb20gJy4uLy4uL3dvcmtiZW5jaC5tb2RlbCc7XG5pbXBvcnQge1dvcmtiZW5jaFZpZXdSZWdpc3RyeX0gZnJvbSAnLi4vLi4vdmlldy93b3JrYmVuY2gtdmlldy5yZWdpc3RyeSc7XG5pbXBvcnQge2ZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtmaXJzdFZhbHVlRnJvbSwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBUZWFyZG93bkxvZ2ljfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Y29lcmNlRWxlbWVudH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7VEVYVCwgVGV4dENvbXBvbmVudH0gZnJvbSAnLi4vdmlldy1jb250ZXh0LW1lbnUvdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHtNZW51SXRlbUNvbmZpZywgV29ya2JlbmNoQ29uZmlnfSBmcm9tICcuLi8uLi93b3JrYmVuY2gtY29uZmlnJztcbmltcG9ydCB7V29ya2JlbmNoU2VydmljZX0gZnJvbSAnLi4vLi4vd29ya2JlbmNoLnNlcnZpY2UnO1xuaW1wb3J0IHtmaWx0ZXJBcnJheSwgb2JzZXJ2ZUluc2lkZSwgc3Vic2NyaWJlSW5zaWRlfSBmcm9tICdAc2Npb24vdG9vbGtpdC9vcGVyYXRvcnMnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFZpZXd9IGZyb20gJy4uLy4uL3ZpZXcvybV3b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge1ZpZXdJZCwgV29ya2JlbmNoVmlld30gZnJvbSAnLi4vLi4vdmlldy93b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge3Byb3ZpZGVWaWV3Q29udGV4dH0gZnJvbSAnLi4vLi4vdmlldy92aWV3LWNvbnRleHQtcHJvdmlkZXInO1xuaW1wb3J0IHtBcnJheXN9IGZyb20gJ0BzY2lvbi90b29sa2l0L3V0aWwnO1xuXG4vKipcbiAqIFNob3dzIG1lbnUgaXRlbXMgb2YgYSB7QGxpbmsgV29ya2JlbmNoVmlld30gaW4gYSBtZW51LlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBWaWV3TWVudVNlcnZpY2Uge1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRPUF9MRUZUOiBDb25uZWN0ZWRQb3NpdGlvbiA9IHtvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJ307XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRPUF9SSUdIVDogQ29ubmVjdGVkUG9zaXRpb24gPSB7b3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICd0b3AnfTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQk9UVE9NX0xFRlQ6IENvbm5lY3RlZFBvc2l0aW9uID0ge29yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nfTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQk9UVE9NX1JJR0hUOiBDb25uZWN0ZWRQb3NpdGlvbiA9IHtvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2JvdHRvbSd9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX292ZXJsYXk6IE92ZXJsYXksXG4gICAgICAgICAgICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfem9uZTogTmdab25lLFxuICAgICAgICAgICAgICBwcml2YXRlIF92aWV3UmVnaXN0cnk6IFdvcmtiZW5jaFZpZXdSZWdpc3RyeSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoU2VydmljZTogV29ya2JlbmNoU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfd29ya2JlbmNoQ29uZmlnOiBXb3JrYmVuY2hDb25maWcpIHtcbiAgICAvLyBSZWdpc3RlcnMgYnVpbHQtaW4gbWVudSBpdGVtcyBhZGRlZCB0byB0aGUgY29udGV4dCBtZW51IG9mIGV2ZXJ5IHZpZXcgdGFiLlxuICAgIHRoaXMucmVnaXN0ZXJDbG9zZVZpZXdNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJDbG9zZU90aGVyVmlld3NNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJDbG9zZUFsbFZpZXdzTWVudUl0ZW0oKTtcbiAgICB0aGlzLnJlZ2lzdGVyQ2xvc2VWaWV3c1RvVGhlUmlnaHRNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJDbG9zZVZpZXdzVG9UaGVMZWZ0TWVudUl0ZW0oKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW92ZVJpZ2h0TWVudUl0ZW0oKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW92ZUxlZnRNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJNb3ZlVXBNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJNb3ZlRG93bk1lbnVJdGVtKCk7XG4gICAgdGhpcy5yZWdpc3Rlck1vdmVUb05ld1dpbmRvd01lbnVJdGVtKCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZW51IHdpdGggbWVudSBpdGVtcyByZWdpc3RlcmVkIGluIGdpdmVuIHtAbGluayBXb3JrYmVuY2hWaWV3fS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgV29ya2JlbmNoVmlldy5yZWdpc3RlclZpZXdNZW51SXRlbX1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzaG93TWVudShsb2NhdGlvbjogUG9pbnQsIHZpZXdJZDogVmlld0lkKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuX3ZpZXdSZWdpc3RyeS5nZXQodmlld0lkKTtcbiAgICBjb25zdCBtZW51SXRlbXMgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh2aWV3Lm1lbnVJdGVtcyQpO1xuXG4gICAgLy8gRG8gbm90IHNob3cgdGhlIG1lbnUgaWYgdGhlcmUgYXJlIG5vIG1lbnUgaXRlbXMgcmVnaXN0ZXJlZC5cbiAgICBpZiAobWVudUl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgYW5kIGRpc3BsYXkgdGhlIG1lbnUgb3ZlcmxheS5cbiAgICBjb25zdCBjb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5fb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLm5vb3AoKSxcbiAgICAgIGRpc3Bvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKClcbiAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8obG9jYXRpb24pXG4gICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxuICAgICAgICAud2l0aFBvc2l0aW9ucyhbVmlld01lbnVTZXJ2aWNlLlRPUF9MRUZULCBWaWV3TWVudVNlcnZpY2UuVE9QX1JJR0hULCBWaWV3TWVudVNlcnZpY2UuQk9UVE9NX0xFRlQsIFZpZXdNZW51U2VydmljZS5CT1RUT01fUklHSFRdKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZShjb25maWcpO1xuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHBhcmVudDogdGhpcy5faW5qZWN0b3IsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge3Byb3ZpZGU6IE92ZXJsYXlSZWYsIHVzZVZhbHVlOiBvdmVybGF5UmVmfSxcbiAgICAgICAgcHJvdmlkZVZpZXdDb250ZXh0KHZpZXcpLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBvdmVybGF5UmVmLmF0dGFjaChuZXcgQ29tcG9uZW50UG9ydGFsKFZpZXdNZW51Q29tcG9uZW50LCBudWxsLCBpbmplY3RvcikpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwb24gc3Vic2NyaXB0aW9uLCBpbnN0YWxscyBrZXlib2FyZCBhY2NlbGVyYXRvcnMgb2YgdGhlIG1lbnUgaXRlbXMgcmVnaXN0ZXJlZCBpbiB7QGxpbmsgV29ya2JlbmNoVmlld30uXG4gICAqL1xuICBwdWJsaWMgaW5zdGFsbE1lbnVJdGVtQWNjZWxlcmF0b3JzJCh0YXJnZXQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgSFRNTEVsZW1lbnQsIHZpZXc6IMm1V29ya2JlbmNoVmlldyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoKTogVGVhcmRvd25Mb2dpYyA9PiB7XG4gICAgICBjb25zdCB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgICB2aWV3Lm1lbnVJdGVtcyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgLy8gU2tpcCBtZW51IGl0ZW1zIHdoaWNoIGhhdmUgbm8gYWNjZWxlcmF0b3IgY29uZmlndXJlZC5cbiAgICAgICAgICBmaWx0ZXJBcnJheSgobWVudUl0ZW06IFdvcmtiZW5jaE1lbnVJdGVtKSA9PiAhIW1lbnVJdGVtLmFjY2VsZXJhdG9yPy5sZW5ndGgpLFxuICAgICAgICAgIGZpbHRlcihtZW51SXRlbXMgPT4gbWVudUl0ZW1zLmxlbmd0aCA+IDApLFxuICAgICAgICAgIC8vIFN1YnNjcmliZSBmb3Iga2V5Ym9hcmQgZXZlbnRzLlxuICAgICAgICAgIHN3aXRjaE1hcCgobWVudUl0ZW1zOiBXb3JrYmVuY2hNZW51SXRlbVtdKTogT2JzZXJ2YWJsZTx7ZXZlbnQ6IEtleWJvYXJkRXZlbnQ7IG1lbnVJdGVtczogV29ya2JlbmNoTWVudUl0ZW1bXX0+ID0+IHtcbiAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8S2V5Ym9hcmRFdmVudD4oY29lcmNlRWxlbWVudCh0YXJnZXQpLCAna2V5ZG93bicpLnBpcGUobWFwKGV2ZW50ID0+ICh7ZXZlbnQsIG1lbnVJdGVtc30pKSk7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgbWFwKCh7ZXZlbnQsIG1lbnVJdGVtc30pID0+ICh7XG4gICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgIG1lbnVJdGVtczogbWVudUl0ZW1zXG4gICAgICAgICAgICAgIC5maWx0ZXIobWVudUl0ZW0gPT4gIW1lbnVJdGVtLmlzRGlzYWJsZWQ/LigpKVxuICAgICAgICAgICAgICAuZmlsdGVyKG1lbnVJdGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY2NlbGVyYXRvciA9IG1lbnVJdGVtLmFjY2VsZXJhdG9yITtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBhY2NlbGVyYXRvci5hdCgtMSkhO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGlmaWVyS2V5cyA9IGFjY2VsZXJhdG9yLnNsaWNlKDAsIC0xKTtcblxuICAgICAgICAgICAgICAgIC8vIENvbXBhcmUga2V5LlxuICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXk/LnRvTG93ZXJDYXNlKCkgIT09IGtleS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENvbXBhcmUgbW9kaWZpZXJzLlxuICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmlzRXF1YWwobW9kaWZpZXJLZXlzLCBnZXRNb2RpZmllclN0YXRlKGV2ZW50KSwge2V4YWN0T3JkZXI6IGZhbHNlfSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgICBmaWx0ZXIoKHttZW51SXRlbXN9KSA9PiBtZW51SXRlbXMubGVuZ3RoID4gMCksXG4gICAgICAgICAgc3Vic2NyaWJlSW5zaWRlKGZuID0+IHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgICBvYnNlcnZlSW5zaWRlKGZuID0+IHRoaXMuX3pvbmUucnVuKGZuKSksXG4gICAgICAgICAgdGFrZVVudGlsKHVuc3Vic2NyaWJlJCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgoe2V2ZW50LCBtZW51SXRlbXN9KSA9PiB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBydW5JbkluamVjdGlvbkNvbnRleHQodGhpcy5faW5qZWN0b3IsICgpID0+IHtcbiAgICAgICAgICAgIG1lbnVJdGVtcy5mb3JFYWNoKG1lbnVJdGVtID0+IG1lbnVJdGVtLm9uQWN0aW9uKCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuICgpOiB2b2lkID0+IHVuc3Vic2NyaWJlJC5uZXh0KCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyQ2xvc2VWaWV3TWVudUl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdHM6IE1lbnVJdGVtQ29uZmlnID0ge3Zpc2libGU6IHRydWUsIHRleHQ6ICdDbG9zZSB0YWInLCBncm91cDogJ2Nsb3NlJywgYWNjZWxlcmF0b3I6IFsnY3RybCcsICdrJ10sIGNzc0NsYXNzOiAnZTJlLWNsb3NlLXRhYid9O1xuICAgIGNvbnN0IGFwcENvbmZpZzogTWVudUl0ZW1Db25maWcgfCB1bmRlZmluZWQgPSB0aGlzLl93b3JrYmVuY2hDb25maWcudmlld01lbnVJdGVtcz8uY2xvc2U7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoe1xuICAgICAgICBwb3J0YWw6IG5ldyBDb21wb25lbnRQb3J0YWwoVGV4dENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpLFxuICAgICAgICBhY2NlbGVyYXRvcjogY29uZmlnLmFjY2VsZXJhdG9yLFxuICAgICAgICBncm91cDogY29uZmlnLmdyb3VwLFxuICAgICAgICBjc3NDbGFzczogY29uZmlnLmNzc0NsYXNzLFxuICAgICAgICBpc0Rpc2FibGVkOiAoKTogYm9vbGVhbiA9PiAhdmlldy5jbG9zYWJsZSxcbiAgICAgICAgb25BY3Rpb246ICgpOiB2b2lkID0+IHZvaWQgdmlldy5jbG9zZSgpLnRoZW4oKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckNsb3NlT3RoZXJWaWV3c01lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnQ2xvc2Ugb3RoZXIgdGFicycsIGdyb3VwOiAnY2xvc2UnLCBhY2NlbGVyYXRvcjogWydjdHJsJywgJ3NoaWZ0JywgJ2snXX07XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5jbG9zZU90aGVycztcbiAgICBjb25zdCBjb25maWcgPSB7Li4uZGVmYXVsdHMsIC4uLmFwcENvbmZpZ307XG5cbiAgICBjb25maWcudmlzaWJsZSAmJiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnJlZ2lzdGVyVmlld01lbnVJdGVtKCh2aWV3OiBXb3JrYmVuY2hWaWV3KTogV29ya2JlbmNoTWVudUl0ZW0gPT4ge1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICBwYXJlbnQ6IEluamVjdG9yLk5VTEwsXG4gICAgICAgIHByb3ZpZGVyczogW3twcm92aWRlOiBURVhULCB1c2VWYWx1ZTogY29uZmlnLnRleHR9XSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICh7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIGlzRGlzYWJsZWQ6ICgpOiBib29sZWFuID0+IHZpZXcuZmlyc3QgJiYgdmlldy5sYXN0LFxuICAgICAgICBvbkFjdGlvbjogKCk6IHZvaWQgPT4gdm9pZCB2aWV3LmNsb3NlKCdvdGhlci12aWV3cycpLnRoZW4oKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckNsb3NlQWxsVmlld3NNZW51SXRlbSgpOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0czogTWVudUl0ZW1Db25maWcgPSB7dmlzaWJsZTogdHJ1ZSwgdGV4dDogJ0Nsb3NlIGFsbCB0YWJzJywgZ3JvdXA6ICdjbG9zZScsIGFjY2VsZXJhdG9yOiBbJ2N0cmwnLCAnc2hpZnQnLCAnYWx0JywgJ2snXSwgY3NzQ2xhc3M6ICdlMmUtY2xvc2UtYWxsLXRhYnMnfTtcbiAgICBjb25zdCBhcHBDb25maWc6IE1lbnVJdGVtQ29uZmlnIHwgdW5kZWZpbmVkID0gdGhpcy5fd29ya2JlbmNoQ29uZmlnLnZpZXdNZW51SXRlbXM/LmNsb3NlQWxsO1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5kZWZhdWx0cywgLi4uYXBwQ29uZmlnfTtcblxuICAgIGNvbmZpZy52aXNpYmxlICYmIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UucmVnaXN0ZXJWaWV3TWVudUl0ZW0oKHZpZXc6IFdvcmtiZW5jaFZpZXcpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHBhcmVudDogSW5qZWN0b3IuTlVMTCxcbiAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRFWFQsIHVzZVZhbHVlOiBjb25maWcudGV4dH1dLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gKHtcbiAgICAgICAgcG9ydGFsOiBuZXcgQ29tcG9uZW50UG9ydGFsKFRleHRDb21wb25lbnQsIG51bGwsIGluamVjdG9yKSxcbiAgICAgICAgYWNjZWxlcmF0b3I6IGNvbmZpZy5hY2NlbGVyYXRvcixcbiAgICAgICAgZ3JvdXA6IGNvbmZpZy5ncm91cCxcbiAgICAgICAgY3NzQ2xhc3M6IGNvbmZpZy5jc3NDbGFzcyxcbiAgICAgICAgb25BY3Rpb246ICgpOiB2b2lkID0+IHZvaWQgdmlldy5jbG9zZSgnYWxsLXZpZXdzJykudGhlbigpLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyQ2xvc2VWaWV3c1RvVGhlUmlnaHRNZW51SXRlbSgpOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0czogTWVudUl0ZW1Db25maWcgPSB7dmlzaWJsZTogdHJ1ZSwgdGV4dDogJ0Nsb3NlIHRhYnMgdG8gdGhlIHJpZ2h0JywgZ3JvdXA6ICdjbG9zZSd9O1xuICAgIGNvbnN0IGFwcENvbmZpZzogTWVudUl0ZW1Db25maWcgfCB1bmRlZmluZWQgPSB0aGlzLl93b3JrYmVuY2hDb25maWcudmlld01lbnVJdGVtcz8uY2xvc2VUb1RoZVJpZ2h0O1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5kZWZhdWx0cywgLi4uYXBwQ29uZmlnfTtcblxuICAgIGNvbmZpZy52aXNpYmxlICYmIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UucmVnaXN0ZXJWaWV3TWVudUl0ZW0oKHZpZXc6IFdvcmtiZW5jaFZpZXcpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHBhcmVudDogSW5qZWN0b3IuTlVMTCxcbiAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRFWFQsIHVzZVZhbHVlOiBjb25maWcudGV4dH1dLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwb3J0YWw6IG5ldyBDb21wb25lbnRQb3J0YWwoVGV4dENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpLFxuICAgICAgICBhY2NlbGVyYXRvcjogY29uZmlnLmFjY2VsZXJhdG9yLFxuICAgICAgICBncm91cDogY29uZmlnLmdyb3VwLFxuICAgICAgICBjc3NDbGFzczogY29uZmlnLmNzc0NsYXNzLFxuICAgICAgICBpc0Rpc2FibGVkOiAoKTogYm9vbGVhbiA9PiB2aWV3Lmxhc3QsXG4gICAgICAgIG9uQWN0aW9uOiAoKTogdm9pZCA9PiB2b2lkIHZpZXcuY2xvc2UoJ3ZpZXdzLXRvLXRoZS1yaWdodCcpLnRoZW4oKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyQ2xvc2VWaWV3c1RvVGhlTGVmdE1lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnQ2xvc2UgdGFicyB0byB0aGUgbGVmdCcsIGdyb3VwOiAnY2xvc2UnfTtcbiAgICBjb25zdCBhcHBDb25maWc6IE1lbnVJdGVtQ29uZmlnIHwgdW5kZWZpbmVkID0gdGhpcy5fd29ya2JlbmNoQ29uZmlnLnZpZXdNZW51SXRlbXM/LmNsb3NlVG9UaGVMZWZ0O1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5kZWZhdWx0cywgLi4uYXBwQ29uZmlnfTtcblxuICAgIGNvbmZpZy52aXNpYmxlICYmIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UucmVnaXN0ZXJWaWV3TWVudUl0ZW0oKHZpZXc6IFdvcmtiZW5jaFZpZXcpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHBhcmVudDogSW5qZWN0b3IuTlVMTCxcbiAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRFWFQsIHVzZVZhbHVlOiBjb25maWcudGV4dH1dLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwb3J0YWw6IG5ldyBDb21wb25lbnRQb3J0YWwoVGV4dENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpLFxuICAgICAgICBhY2NlbGVyYXRvcjogY29uZmlnLmFjY2VsZXJhdG9yLFxuICAgICAgICBncm91cDogY29uZmlnLmdyb3VwLFxuICAgICAgICBjc3NDbGFzczogY29uZmlnLmNzc0NsYXNzLFxuICAgICAgICBpc0Rpc2FibGVkOiAoKTogYm9vbGVhbiA9PiB2aWV3LmZpcnN0LFxuICAgICAgICBvbkFjdGlvbjogKCk6IHZvaWQgPT4gdm9pZCB2aWV3LmNsb3NlKCd2aWV3cy10by10aGUtbGVmdCcpLnRoZW4oKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTW92ZVJpZ2h0TWVudUl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdHM6IE1lbnVJdGVtQ29uZmlnID0ge3Zpc2libGU6IHRydWUsIHRleHQ6ICdNb3ZlIHJpZ2h0JywgZ3JvdXA6ICdtb3ZlJywgYWNjZWxlcmF0b3I6IFsnY3RybCcsICdhbHQnLCAnZW5kJ119O1xuICAgIGNvbnN0IGFwcENvbmZpZzogTWVudUl0ZW1Db25maWcgfCB1bmRlZmluZWQgPSB0aGlzLl93b3JrYmVuY2hDb25maWcudmlld01lbnVJdGVtcz8ubW92ZVJpZ2h0O1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5kZWZhdWx0cywgLi4uYXBwQ29uZmlnfTtcblxuICAgIGNvbmZpZy52aXNpYmxlICYmIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UucmVnaXN0ZXJWaWV3TWVudUl0ZW0oKHZpZXc6IFdvcmtiZW5jaFZpZXcpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHBhcmVudDogSW5qZWN0b3IuTlVMTCxcbiAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRFWFQsIHVzZVZhbHVlOiBjb25maWcudGV4dH1dLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwb3J0YWw6IG5ldyBDb21wb25lbnRQb3J0YWwoVGV4dENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpLFxuICAgICAgICBhY2NlbGVyYXRvcjogY29uZmlnLmFjY2VsZXJhdG9yLFxuICAgICAgICBncm91cDogY29uZmlnLmdyb3VwLFxuICAgICAgICBjc3NDbGFzczogY29uZmlnLmNzc0NsYXNzLFxuICAgICAgICBpc0Rpc2FibGVkOiAoKSA9PiB2aWV3LmZpcnN0ICYmIHZpZXcubGFzdCxcbiAgICAgICAgb25BY3Rpb246ICgpID0+IHZpZXcubW92ZSh2aWV3LnBhcnQuaWQsIHtyZWdpb246ICdlYXN0J30pLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJNb3ZlTGVmdE1lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnTW92ZSBsZWZ0JywgZ3JvdXA6ICdtb3ZlJ307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlTGVmdDtcbiAgICBjb25zdCBjb25maWcgPSB7Li4uZGVmYXVsdHMsIC4uLmFwcENvbmZpZ307XG5cbiAgICBjb25maWcudmlzaWJsZSAmJiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnJlZ2lzdGVyVmlld01lbnVJdGVtKCh2aWV3OiBXb3JrYmVuY2hWaWV3KTogV29ya2JlbmNoTWVudUl0ZW0gPT4ge1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICBwYXJlbnQ6IEluamVjdG9yLk5VTEwsXG4gICAgICAgIHByb3ZpZGVyczogW3twcm92aWRlOiBURVhULCB1c2VWYWx1ZTogY29uZmlnLnRleHR9XSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcG9ydGFsOiBuZXcgQ29tcG9uZW50UG9ydGFsKFRleHRDb21wb25lbnQsIG51bGwsIGluamVjdG9yKSxcbiAgICAgICAgYWNjZWxlcmF0b3I6IGNvbmZpZy5hY2NlbGVyYXRvcixcbiAgICAgICAgZ3JvdXA6IGNvbmZpZy5ncm91cCxcbiAgICAgICAgY3NzQ2xhc3M6IGNvbmZpZy5jc3NDbGFzcyxcbiAgICAgICAgaXNEaXNhYmxlZDogKCkgPT4gdmlldy5maXJzdCAmJiB2aWV3Lmxhc3QsXG4gICAgICAgIG9uQWN0aW9uOiAoKSA9PiB2aWV3Lm1vdmUodmlldy5wYXJ0LmlkLCB7cmVnaW9uOiAnd2VzdCd9KSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZ2lzdGVyTW92ZVVwTWVudUl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdHM6IE1lbnVJdGVtQ29uZmlnID0ge3Zpc2libGU6IHRydWUsIHRleHQ6ICdNb3ZlIHVwJywgZ3JvdXA6ICdtb3ZlJ307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlVXA7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIGlzRGlzYWJsZWQ6ICgpID0+IHZpZXcuZmlyc3QgJiYgdmlldy5sYXN0LFxuICAgICAgICBvbkFjdGlvbjogKCkgPT4gdmlldy5tb3ZlKHZpZXcucGFydC5pZCwge3JlZ2lvbjogJ25vcnRoJ30pLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJNb3ZlRG93bk1lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnTW92ZSBkb3duJywgZ3JvdXA6ICdtb3ZlJ307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlRG93bjtcbiAgICBjb25zdCBjb25maWcgPSB7Li4uZGVmYXVsdHMsIC4uLmFwcENvbmZpZ307XG5cbiAgICBjb25maWcudmlzaWJsZSAmJiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnJlZ2lzdGVyVmlld01lbnVJdGVtKCh2aWV3OiBXb3JrYmVuY2hWaWV3KTogV29ya2JlbmNoTWVudUl0ZW0gPT4ge1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICBwYXJlbnQ6IEluamVjdG9yLk5VTEwsXG4gICAgICAgIHByb3ZpZGVyczogW3twcm92aWRlOiBURVhULCB1c2VWYWx1ZTogY29uZmlnLnRleHR9XSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcG9ydGFsOiBuZXcgQ29tcG9uZW50UG9ydGFsKFRleHRDb21wb25lbnQsIG51bGwsIGluamVjdG9yKSxcbiAgICAgICAgYWNjZWxlcmF0b3I6IGNvbmZpZy5hY2NlbGVyYXRvcixcbiAgICAgICAgZ3JvdXA6IGNvbmZpZy5ncm91cCxcbiAgICAgICAgY3NzQ2xhc3M6IGNvbmZpZy5jc3NDbGFzcyxcbiAgICAgICAgaXNEaXNhYmxlZDogKCkgPT4gdmlldy5maXJzdCAmJiB2aWV3Lmxhc3QsXG4gICAgICAgIG9uQWN0aW9uOiAoKSA9PiB2aWV3Lm1vdmUodmlldy5wYXJ0LmlkLCB7cmVnaW9uOiAnc291dGgnfSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck1vdmVUb05ld1dpbmRvd01lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnTW92ZSB0byBuZXcgd2luZG93JywgZ3JvdXA6ICdvcGVuJywgY3NzQ2xhc3M6ICdlMmUtbW92ZS10by1uZXctd2luZG93J307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlVG9OZXdXaW5kb3c7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIG9uQWN0aW9uOiAoKSA9PiB2aWV3Lm1vdmUoJ25ldy13aW5kb3cnKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcmVzc2VkIG1vZGlmaWVyIGtleXMgKGN0cmwsIHNoaWZ0LCBhbHQsIG1ldGEpIGFzIGFycmF5IGl0ZW1zLlxuICovXG5mdW5jdGlvbiBnZXRNb2RpZmllclN0YXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogc3RyaW5nW10ge1xuICBjb25zdCBtb2RpZmllclN0YXRlOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoZXZlbnQuY3RybEtleSkge1xuICAgIG1vZGlmaWVyU3RhdGUucHVzaCgnY3RybCcpO1xuICB9XG4gIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgIG1vZGlmaWVyU3RhdGUucHVzaCgnc2hpZnQnKTtcbiAgfVxuICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgbW9kaWZpZXJTdGF0ZS5wdXNoKCdhbHQnKTtcbiAgfVxuICBpZiAoZXZlbnQubWV0YUtleSkge1xuICAgIG1vZGlmaWVyU3RhdGUucHVzaCgnbWV0YScpO1xuICB9XG4gIHJldHVybiBtb2RpZmllclN0YXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvaW50IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG59XG4iXX0=
|
|
340
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmlldy1tZW51LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9wYXJ0L3ZpZXctY29udGV4dC1tZW51L3ZpZXctbWVudS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFhLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxxQkFBcUIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQW9CLE9BQU8sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDM0YsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQzNFLE9BQU8sRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUNuRixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDcEQsT0FBTyxFQUFDLElBQUksRUFBRSxhQUFhLEVBQUMsTUFBTSxxQ0FBcUMsQ0FBQztBQUN4RSxPQUFPLEVBQWlCLGVBQWUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxXQUFXLEVBQUUsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFHaEUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHFCQUFxQixDQUFDOztBQUUzQzs7R0FFRztBQUVILE1BQU0sT0FBTyxlQUFlO2FBRUYsYUFBUSxHQUFzQixFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUMsQUFBNUYsQ0FBNkY7YUFDckcsY0FBUyxHQUFzQixFQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUMsQUFBMUYsQ0FBMkY7YUFDcEcsZ0JBQVcsR0FBc0IsRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLEFBQS9GLENBQWdHO2FBQzNHLGlCQUFZLEdBQXNCLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBQyxBQUE3RixDQUE4RjtJQVNsSTtRQVBpQixhQUFRLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNCLGNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0IsVUFBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2QixrQkFBYSxHQUFHLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ2hELHNCQUFpQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdDLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUcxRCw2RUFBNkU7UUFDN0UsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQUM7UUFDdEMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLCtCQUErQixFQUFFLENBQUM7SUFDekMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQWUsRUFBRSxNQUFjO1FBQ25ELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLE1BQU0sU0FBUyxHQUFHLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV4RCw4REFBOEQ7UUFDOUQsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELHdDQUF3QztRQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLGFBQWEsQ0FBQztZQUMvQixjQUFjLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7WUFDckQsbUJBQW1CLEVBQUUsSUFBSTtZQUN6QixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRTtpQkFDdkMsbUJBQW1CLENBQUMsUUFBUSxDQUFDO2lCQUM3QixzQkFBc0IsQ0FBQyxLQUFLLENBQUM7aUJBQzdCLGFBQWEsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLFNBQVMsRUFBRSxlQUFlLENBQUMsV0FBVyxFQUFFLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNuSSxDQUFDLENBQUM7UUFFSCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1lBQy9CLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUztZQUN0QixTQUFTLEVBQUU7Z0JBQ1QsRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUM7Z0JBQzNDLGtCQUFrQixDQUFDLElBQUksQ0FBQzthQUN6QjtTQUNGLENBQUMsQ0FBQztRQUNILFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFlLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDMUUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7O09BRUc7SUFDSSw0QkFBNEIsQ0FBQyxNQUE2QyxFQUFFLElBQW9CO1FBQ3JHLE9BQU8sSUFBSSxVQUFVLENBQUMsR0FBa0IsRUFBRTtZQUN4QyxNQUFNLFlBQVksR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1lBRXpDLElBQUksQ0FBQyxVQUFVO2lCQUNaLElBQUksQ0FDSCxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2pELHdEQUF3RDtZQUN4RCxXQUFXLENBQUMsQ0FBQyxRQUEyQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsRUFDNUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDekMsaUNBQWlDO1lBQ2pDLFNBQVMsQ0FBQyxDQUFDLFNBQThCLEVBQXNFLEVBQUU7Z0JBQy9HLE9BQU8sU0FBUyxDQUFnQixhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0csQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLENBQUMsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzNCLEtBQUs7Z0JBQ0wsU0FBUyxFQUFFLFNBQVM7cUJBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7cUJBQzVDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDakIsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVksQ0FBQztvQkFDMUMsTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBRSxDQUFDO29CQUNoQyxNQUFNLFlBQVksR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUU5QyxlQUFlO29CQUNmLElBQUksS0FBSyxDQUFDLEdBQUcsRUFBRSxXQUFXLEVBQUUsS0FBSyxHQUFHLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQzt3QkFDbkQsT0FBTyxLQUFLLENBQUM7b0JBQ2YsQ0FBQztvQkFDRCxxQkFBcUI7b0JBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ2hGLE9BQU8sS0FBSyxDQUFDO29CQUNmLENBQUM7b0JBQ0QsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQyxDQUFDO2FBQ0wsQ0FBQyxDQUFDLEVBQ0gsTUFBTSxDQUFDLENBQUMsRUFBQyxTQUFTLEVBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFDN0MsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbkMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUN4QjtpQkFDQSxTQUFTLENBQUMsQ0FBQyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUMsRUFBRSxFQUFFO2dCQUNoQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3ZCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDeEIscUJBQXFCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7b0JBQ3pDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDckQsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVMLE9BQU8sR0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHFCQUFxQjtRQUMzQixNQUFNLFFBQVEsR0FBbUIsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBQyxDQUFDO1FBQ25JLE1BQU0sU0FBUyxHQUErQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQztRQUN6RixNQUFNLE1BQU0sR0FBRyxFQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsU0FBUyxFQUFDLENBQUM7UUFFM0MsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFtQixFQUFxQixFQUFFO1lBQ3ZHLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQy9CLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDckIsU0FBUyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFDLENBQUM7YUFDcEQsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDO2dCQUNOLE1BQU0sRUFBRSxJQUFJLGVBQWUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQztnQkFDMUQsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsVUFBVSxFQUFFLEdBQVksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDM0MsUUFBUSxFQUFFLEdBQVMsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRTthQUMvQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyw4QkFBOEI7UUFDcEMsTUFBTSxRQUFRLEdBQW1CLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSx1QkFBdUIsRUFBQyxDQUFDO1FBQ25LLE1BQU0sU0FBUyxHQUErQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQztRQUMvRixNQUFNLE1BQU0sR0FBRyxFQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsU0FBUyxFQUFDLENBQUM7UUFFM0MsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFtQixFQUFxQixFQUFFO1lBQ3ZHLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQy9CLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDckIsU0FBUyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFDLENBQUM7YUFDcEQsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxDQUFDO2dCQUNOLE1BQU0sRUFBRSxJQUFJLGVBQWUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQztnQkFDMUQsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsVUFBVSxFQUFFLEdBQVksRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUN0RCxRQUFRLEVBQUUsR0FBUyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksRUFBRTthQUM1RCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyw0QkFBNEI7UUFDbEMsTUFBTSxRQUFRLEdBQW1CLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsb0JBQW9CLEVBQUMsQ0FBQztRQUNySyxNQUFNLFNBQVMsR0FBK0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUM7UUFDNUYsTUFBTSxNQUFNLEdBQUcsRUFBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLFNBQVMsRUFBQyxDQUFDO1FBRTNDLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBbUIsRUFBcUIsRUFBRTtZQUN2RyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUMvQixNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ3JCLFNBQVMsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBQyxDQUFDO2FBQ3BELENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQztnQkFDTixNQUFNLEVBQUUsSUFBSSxlQUFlLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUM7Z0JBQzFELFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztnQkFDL0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dCQUNuQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7Z0JBQ3pCLFFBQVEsRUFBRSxHQUFTLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxFQUFFO2FBQzFELENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLDhCQUE4QjtRQUNwQyxNQUFNLFFBQVEsR0FBbUIsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSx5QkFBeUIsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxzQkFBc0IsRUFBQyxDQUFDO1FBQ3BJLE1BQU0sU0FBUyxHQUErQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLGVBQWUsQ0FBQztRQUNuRyxNQUFNLE1BQU0sR0FBRyxFQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsU0FBUyxFQUFDLENBQUM7UUFFM0MsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFtQixFQUFxQixFQUFFO1lBQ3ZHLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQy9CLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDckIsU0FBUyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFDLENBQUM7YUFDcEQsQ0FBQyxDQUFDO1lBQ0gsT0FBTztnQkFDTCxNQUFNLEVBQUUsSUFBSSxlQUFlLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUM7Z0JBQzFELFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztnQkFDL0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dCQUNuQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7Z0JBQ3pCLFVBQVUsRUFBRSxHQUFZLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUN0QyxRQUFRLEVBQUUsR0FBUyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBSSxFQUFFO2FBQ25FLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyw2QkFBNkI7UUFDbkMsTUFBTSxRQUFRLEdBQW1CLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsd0JBQXdCLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUscUJBQXFCLEVBQUMsQ0FBQztRQUNsSSxNQUFNLFNBQVMsR0FBK0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxjQUFjLENBQUM7UUFDbEcsTUFBTSxNQUFNLEdBQUcsRUFBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLFNBQVMsRUFBQyxDQUFDO1FBRTNDLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBbUIsRUFBcUIsRUFBRTtZQUN2RyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUMvQixNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ3JCLFNBQVMsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBQyxDQUFDO2FBQ3BELENBQUMsQ0FBQztZQUNILE9BQU87Z0JBQ0wsTUFBTSxFQUFFLElBQUksZUFBZSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDO2dCQUMxRCxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7Z0JBQy9CLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztnQkFDbkIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2dCQUN6QixVQUFVLEVBQUUsR0FBWSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDdkMsUUFBUSxFQUFFLEdBQVMsRUFBRSxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksRUFBRTthQUNsRSxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8seUJBQXlCO1FBQy9CLE1BQU0sUUFBUSxHQUFtQixFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixFQUFDLENBQUM7UUFDckosTUFBTSxTQUFTLEdBQStCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDO1FBQzdGLE1BQU0sTUFBTSxHQUFHLEVBQUMsR0FBRyxRQUFRLEVBQUUsR0FBRyxTQUFTLEVBQUMsQ0FBQztRQUUzQyxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLElBQW1CLEVBQXFCLEVBQUU7WUFDdkcsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDL0IsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNyQixTQUFTLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUMsQ0FBQzthQUNwRCxDQUFDLENBQUM7WUFDSCxPQUFPO2dCQUNMLE1BQU0sRUFBRSxJQUFJLGVBQWUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQztnQkFDMUQsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUM3QyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBQyxDQUFDO2FBQzVELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsTUFBTSxRQUFRLEdBQW1CLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBQyxDQUFDO1FBQzlHLE1BQU0sU0FBUyxHQUErQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQztRQUM1RixNQUFNLE1BQU0sR0FBRyxFQUFDLEdBQUcsUUFBUSxFQUFFLEdBQUcsU0FBUyxFQUFDLENBQUM7UUFFM0MsTUFBTSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxJQUFtQixFQUFxQixFQUFFO1lBQ3ZHLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7Z0JBQy9CLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDckIsU0FBUyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFDLENBQUM7YUFDcEQsQ0FBQyxDQUFDO1lBQ0gsT0FBTztnQkFDTCxNQUFNLEVBQUUsSUFBSSxlQUFlLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUM7Z0JBQzFELFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztnQkFDL0IsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dCQUNuQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7Z0JBQ3pCLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtnQkFDN0MsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUMsQ0FBQzthQUM1RCxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sc0JBQXNCO1FBQzVCLE1BQU0sUUFBUSxHQUFtQixFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUMsQ0FBQztRQUMxRyxNQUFNLFNBQVMsR0FBK0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUM7UUFDMUYsTUFBTSxNQUFNLEdBQUcsRUFBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLFNBQVMsRUFBQyxDQUFDO1FBRTNDLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBbUIsRUFBcUIsRUFBRTtZQUN2RyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUMvQixNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ3JCLFNBQVMsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBQyxDQUFDO2FBQ3BELENBQUMsQ0FBQztZQUNILE9BQU87Z0JBQ0wsTUFBTSxFQUFFLElBQUksZUFBZSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDO2dCQUMxRCxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7Z0JBQy9CLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztnQkFDbkIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2dCQUN6QixVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7Z0JBQzdDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUM7YUFDN0QsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHdCQUF3QjtRQUM5QixNQUFNLFFBQVEsR0FBbUIsRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsZUFBZSxFQUFDLENBQUM7UUFDOUcsTUFBTSxTQUFTLEdBQStCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDO1FBQzVGLE1BQU0sTUFBTSxHQUFHLEVBQUMsR0FBRyxRQUFRLEVBQUUsR0FBRyxTQUFTLEVBQUMsQ0FBQztRQUUzQyxNQUFNLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLElBQW1CLEVBQXFCLEVBQUU7WUFDdkcsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDL0IsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJO2dCQUNyQixTQUFTLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUMsQ0FBQzthQUNwRCxDQUFDLENBQUM7WUFDSCxPQUFPO2dCQUNMLE1BQU0sRUFBRSxJQUFJLGVBQWUsQ0FBQyxhQUFhLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQztnQkFDMUQsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO2dCQUMvQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUM3QyxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxDQUFDO2FBQzdELENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTywrQkFBK0I7UUFDckMsTUFBTSxRQUFRLEdBQW1CLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsd0JBQXdCLEVBQUMsQ0FBQztRQUNoSSxNQUFNLFNBQVMsR0FBK0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxlQUFlLENBQUM7UUFDbkcsTUFBTSxNQUFNLEdBQUcsRUFBQyxHQUFHLFFBQVEsRUFBRSxHQUFHLFNBQVMsRUFBQyxDQUFDO1FBRTNDLE1BQU0sQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLENBQUMsSUFBbUIsRUFBcUIsRUFBRTtZQUN2RyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUMvQixNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUk7Z0JBQ3JCLFNBQVMsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBQyxDQUFDO2FBQ3BELENBQUMsQ0FBQztZQUNILE9BQU87Z0JBQ0wsTUFBTSxFQUFFLElBQUksZUFBZSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDO2dCQUMxRCxXQUFXLEVBQUUsTUFBTSxDQUFDLFdBQVc7Z0JBQy9CLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztnQkFDbkIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2dCQUN6QixRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7YUFDeEMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs4R0FuVVUsZUFBZTtrSEFBZixlQUFlLGNBREgsTUFBTTs7MkZBQ2xCLGVBQWU7a0JBRDNCLFVBQVU7bUJBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDOztBQXVVaEM7O0dBRUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLEtBQW9CO0lBQzVDLE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQztJQUNuQyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQixhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQixhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNqQixhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQixhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFDRCxPQUFPLGFBQWEsQ0FBQztBQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxOC0yMDIyIFN3aXNzIEZlZGVyYWwgUmFpbHdheXNcbiAqXG4gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlXG4gKiBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIDIuMFxuICogd2hpY2ggaXMgYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAvXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG5pbXBvcnQge0VsZW1lbnRSZWYsIGluamVjdCwgSW5qZWN0YWJsZSwgSW5qZWN0b3IsIE5nWm9uZSwgcnVuSW5JbmplY3Rpb25Db250ZXh0fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7Q29ubmVjdGVkUG9zaXRpb24sIE92ZXJsYXksIE92ZXJsYXlDb25maWcsIE92ZXJsYXlSZWZ9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7Q29tcG9uZW50UG9ydGFsfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7Vmlld01lbnVDb21wb25lbnR9IGZyb20gJy4vdmlldy1tZW51LmNvbXBvbmVudCc7XG5pbXBvcnQge1dvcmtiZW5jaE1lbnVJdGVtfSBmcm9tICcuLi8uLi93b3JrYmVuY2gubW9kZWwnO1xuaW1wb3J0IHtXT1JLQkVOQ0hfVklFV19SRUdJU1RSWX0gZnJvbSAnLi4vLi4vdmlldy93b3JrYmVuY2gtdmlldy5yZWdpc3RyeSc7XG5pbXBvcnQge2ZpbHRlciwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtmaXJzdFZhbHVlRnJvbSwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBUZWFyZG93bkxvZ2ljfSBmcm9tICdyeGpzJztcbmltcG9ydCB7Y29lcmNlRWxlbWVudH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7VEVYVCwgVGV4dENvbXBvbmVudH0gZnJvbSAnLi4vdmlldy1jb250ZXh0LW1lbnUvdGV4dC5jb21wb25lbnQnO1xuaW1wb3J0IHtNZW51SXRlbUNvbmZpZywgV29ya2JlbmNoQ29uZmlnfSBmcm9tICcuLi8uLi93b3JrYmVuY2gtY29uZmlnJztcbmltcG9ydCB7V29ya2JlbmNoU2VydmljZX0gZnJvbSAnLi4vLi4vd29ya2JlbmNoLnNlcnZpY2UnO1xuaW1wb3J0IHtmaWx0ZXJBcnJheSwgb2JzZXJ2ZUlufSBmcm9tICdAc2Npb24vdG9vbGtpdC9vcGVyYXRvcnMnO1xuaW1wb3J0IHvJtVdvcmtiZW5jaFZpZXd9IGZyb20gJy4uLy4uL3ZpZXcvybV3b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge1ZpZXdJZCwgV29ya2JlbmNoVmlld30gZnJvbSAnLi4vLi4vdmlldy93b3JrYmVuY2gtdmlldy5tb2RlbCc7XG5pbXBvcnQge3Byb3ZpZGVWaWV3Q29udGV4dH0gZnJvbSAnLi4vLi4vdmlldy92aWV3LWNvbnRleHQtcHJvdmlkZXInO1xuaW1wb3J0IHtBcnJheXN9IGZyb20gJ0BzY2lvbi90b29sa2l0L3V0aWwnO1xuXG4vKipcbiAqIFNob3dzIG1lbnUgaXRlbXMgb2YgYSB7QGxpbmsgV29ya2JlbmNoVmlld30gaW4gYSBtZW51LlxuICovXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBWaWV3TWVudVNlcnZpY2Uge1xuXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRPUF9MRUZUOiBDb25uZWN0ZWRQb3NpdGlvbiA9IHtvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJ307XG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRPUF9SSUdIVDogQ29ubmVjdGVkUG9zaXRpb24gPSB7b3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICd0b3AnfTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQk9UVE9NX0xFRlQ6IENvbm5lY3RlZFBvc2l0aW9uID0ge29yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nfTtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgQk9UVE9NX1JJR0hUOiBDb25uZWN0ZWRQb3NpdGlvbiA9IHtvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2JvdHRvbSd9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX292ZXJsYXkgPSBpbmplY3QoT3ZlcmxheSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF92aWV3UmVnaXN0cnkgPSBpbmplY3QoV09SS0JFTkNIX1ZJRVdfUkVHSVNUUlkpO1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hTZXJ2aWNlID0gaW5qZWN0KFdvcmtiZW5jaFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF93b3JrYmVuY2hDb25maWcgPSBpbmplY3QoV29ya2JlbmNoQ29uZmlnKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBSZWdpc3RlcnMgYnVpbHQtaW4gbWVudSBpdGVtcyBhZGRlZCB0byB0aGUgY29udGV4dCBtZW51IG9mIGV2ZXJ5IHZpZXcgdGFiLlxuICAgIHRoaXMucmVnaXN0ZXJDbG9zZU1lbnVJdGVtKCk7XG4gICAgdGhpcy5yZWdpc3RlckNsb3NlT3RoZXJUYWJzTWVudUl0ZW0oKTtcbiAgICB0aGlzLnJlZ2lzdGVyQ2xvc2VBbGxUYWJzTWVudUl0ZW0oKTtcbiAgICB0aGlzLnJlZ2lzdGVyQ2xvc2VSaWdodFRhYnNNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJDbG9zZUxlZnRUYWJzTWVudUl0ZW0oKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW92ZVJpZ2h0TWVudUl0ZW0oKTtcbiAgICB0aGlzLnJlZ2lzdGVyTW92ZUxlZnRNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJNb3ZlVXBNZW51SXRlbSgpO1xuICAgIHRoaXMucmVnaXN0ZXJNb3ZlRG93bk1lbnVJdGVtKCk7XG4gICAgdGhpcy5yZWdpc3Rlck1vdmVUb05ld1dpbmRvd01lbnVJdGVtKCk7XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSBtZW51IHdpdGggbWVudSBpdGVtcyByZWdpc3RlcmVkIGluIGdpdmVuIHtAbGluayBXb3JrYmVuY2hWaWV3fS5cbiAgICpcbiAgICogQHNlZSB7QGxpbmsgV29ya2JlbmNoVmlldy5yZWdpc3RlclZpZXdNZW51SXRlbX1cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzaG93TWVudShsb2NhdGlvbjogUG9pbnQsIHZpZXdJZDogVmlld0lkKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgdmlldyA9IHRoaXMuX3ZpZXdSZWdpc3RyeS5nZXQodmlld0lkKTtcbiAgICBjb25zdCBtZW51SXRlbXMgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh2aWV3Lm1lbnVJdGVtcyQpO1xuXG4gICAgLy8gRG8gbm90IHNob3cgdGhlIG1lbnUgaWYgdGhlcmUgYXJlIG5vIG1lbnUgaXRlbXMgcmVnaXN0ZXJlZC5cbiAgICBpZiAobWVudUl0ZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFByZXBhcmUgYW5kIGRpc3BsYXkgdGhlIG1lbnUgb3ZlcmxheS5cbiAgICBjb25zdCBjb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5fb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLm5vb3AoKSxcbiAgICAgIGRpc3Bvc2VPbk5hdmlnYXRpb246IHRydWUsXG4gICAgICBwb3NpdGlvblN0cmF0ZWd5OiB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKClcbiAgICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8obG9jYXRpb24pXG4gICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKVxuICAgICAgICAud2l0aFBvc2l0aW9ucyhbVmlld01lbnVTZXJ2aWNlLlRPUF9MRUZULCBWaWV3TWVudVNlcnZpY2UuVE9QX1JJR0hULCBWaWV3TWVudVNlcnZpY2UuQk9UVE9NX0xFRlQsIFZpZXdNZW51U2VydmljZS5CT1RUT01fUklHSFRdKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZShjb25maWcpO1xuICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgIHBhcmVudDogdGhpcy5faW5qZWN0b3IsXG4gICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAge3Byb3ZpZGU6IE92ZXJsYXlSZWYsIHVzZVZhbHVlOiBvdmVybGF5UmVmfSxcbiAgICAgICAgcHJvdmlkZVZpZXdDb250ZXh0KHZpZXcpLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBvdmVybGF5UmVmLmF0dGFjaChuZXcgQ29tcG9uZW50UG9ydGFsKFZpZXdNZW51Q29tcG9uZW50LCBudWxsLCBpbmplY3RvcikpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwb24gc3Vic2NyaXB0aW9uLCBpbnN0YWxscyBrZXlib2FyZCBhY2NlbGVyYXRvcnMgb2YgdGhlIG1lbnUgaXRlbXMgcmVnaXN0ZXJlZCBpbiB7QGxpbmsgV29ya2JlbmNoVmlld30uXG4gICAqL1xuICBwdWJsaWMgaW5zdGFsbE1lbnVJdGVtQWNjZWxlcmF0b3JzJCh0YXJnZXQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgSFRNTEVsZW1lbnQsIHZpZXc6IMm1V29ya2JlbmNoVmlldyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoKTogVGVhcmRvd25Mb2dpYyA9PiB7XG4gICAgICBjb25zdCB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgICB2aWV3Lm1lbnVJdGVtcyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgb2JzZXJ2ZUluKGZuID0+IHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoZm4pKSxcbiAgICAgICAgICAvLyBTa2lwIG1lbnUgaXRlbXMgd2hpY2ggaGF2ZSBubyBhY2NlbGVyYXRvciBjb25maWd1cmVkLlxuICAgICAgICAgIGZpbHRlckFycmF5KChtZW51SXRlbTogV29ya2JlbmNoTWVudUl0ZW0pID0+ICEhbWVudUl0ZW0uYWNjZWxlcmF0b3I/Lmxlbmd0aCksXG4gICAgICAgICAgZmlsdGVyKG1lbnVJdGVtcyA9PiBtZW51SXRlbXMubGVuZ3RoID4gMCksXG4gICAgICAgICAgLy8gU3Vic2NyaWJlIGZvciBrZXlib2FyZCBldmVudHMuXG4gICAgICAgICAgc3dpdGNoTWFwKChtZW51SXRlbXM6IFdvcmtiZW5jaE1lbnVJdGVtW10pOiBPYnNlcnZhYmxlPHtldmVudDogS2V5Ym9hcmRFdmVudDsgbWVudUl0ZW1zOiBXb3JrYmVuY2hNZW51SXRlbVtdfT4gPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudDxLZXlib2FyZEV2ZW50Pihjb2VyY2VFbGVtZW50KHRhcmdldCksICdrZXlkb3duJykucGlwZShtYXAoZXZlbnQgPT4gKHtldmVudCwgbWVudUl0ZW1zfSkpKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBtYXAoKHtldmVudCwgbWVudUl0ZW1zfSkgPT4gKHtcbiAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgbWVudUl0ZW1zOiBtZW51SXRlbXNcbiAgICAgICAgICAgICAgLmZpbHRlcihtZW51SXRlbSA9PiAhbWVudUl0ZW0uaXNEaXNhYmxlZD8uKCkpXG4gICAgICAgICAgICAgIC5maWx0ZXIobWVudUl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjY2VsZXJhdG9yID0gbWVudUl0ZW0uYWNjZWxlcmF0b3IhO1xuICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGFjY2VsZXJhdG9yLmF0KC0xKSE7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZXJLZXlzID0gYWNjZWxlcmF0b3Iuc2xpY2UoMCwgLTEpO1xuXG4gICAgICAgICAgICAgICAgLy8gQ29tcGFyZSBrZXkuXG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50LmtleT8udG9Mb3dlckNhc2UoKSAhPT0ga2V5LnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQ29tcGFyZSBtb2RpZmllcnMuXG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuaXNFcXVhbChtb2RpZmllcktleXMsIGdldE1vZGlmaWVyU3RhdGUoZXZlbnQpLCB7ZXhhY3RPcmRlcjogZmFsc2V9KSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSkpLFxuICAgICAgICAgIGZpbHRlcigoe21lbnVJdGVtc30pID0+IG1lbnVJdGVtcy5sZW5ndGggPiAwKSxcbiAgICAgICAgICBvYnNlcnZlSW4oZm4gPT4gdGhpcy5fem9uZS5ydW4oZm4pKSxcbiAgICAgICAgICB0YWtlVW50aWwodW5zdWJzY3JpYmUkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCh7ZXZlbnQsIG1lbnVJdGVtc30pID0+IHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJ1bkluSW5qZWN0aW9uQ29udGV4dCh0aGlzLl9pbmplY3RvciwgKCkgPT4ge1xuICAgICAgICAgICAgbWVudUl0ZW1zLmZvckVhY2gobWVudUl0ZW0gPT4gbWVudUl0ZW0ub25BY3Rpb24oKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gKCk6IHZvaWQgPT4gdW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJDbG9zZU1lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnQ2xvc2UnLCBncm91cDogJ2Nsb3NlJywgYWNjZWxlcmF0b3I6IFsnY3RybCcsICdrJ10sIGNzc0NsYXNzOiAnZTJlLWNsb3NlJ307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5jbG9zZTtcbiAgICBjb25zdCBjb25maWcgPSB7Li4uZGVmYXVsdHMsIC4uLmFwcENvbmZpZ307XG5cbiAgICBjb25maWcudmlzaWJsZSAmJiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnJlZ2lzdGVyVmlld01lbnVJdGVtKCh2aWV3OiBXb3JrYmVuY2hWaWV3KTogV29ya2JlbmNoTWVudUl0ZW0gPT4ge1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICBwYXJlbnQ6IEluamVjdG9yLk5VTEwsXG4gICAgICAgIHByb3ZpZGVyczogW3twcm92aWRlOiBURVhULCB1c2VWYWx1ZTogY29uZmlnLnRleHR9XSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuICh7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIGlzRGlzYWJsZWQ6ICgpOiBib29sZWFuID0+ICF2aWV3LmNsb3NhYmxlKCksXG4gICAgICAgIG9uQWN0aW9uOiAoKTogdm9pZCA9PiB2b2lkIHZpZXcuY2xvc2UoKS50aGVuKCksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJDbG9zZU90aGVyVGFic01lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnQ2xvc2Ugb3RoZXIgdGFicycsIGdyb3VwOiAnY2xvc2UnLCBhY2NlbGVyYXRvcjogWydjdHJsJywgJ3NoaWZ0JywgJ2snXSwgY3NzQ2xhc3M6ICcgZTJlLWNsb3NlLW90aGVyLXRhYnMnfTtcbiAgICBjb25zdCBhcHBDb25maWc6IE1lbnVJdGVtQ29uZmlnIHwgdW5kZWZpbmVkID0gdGhpcy5fd29ya2JlbmNoQ29uZmlnLnZpZXdNZW51SXRlbXM/LmNsb3NlT3RoZXJzO1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5kZWZhdWx0cywgLi4uYXBwQ29uZmlnfTtcblxuICAgIGNvbmZpZy52aXNpYmxlICYmIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UucmVnaXN0ZXJWaWV3TWVudUl0ZW0oKHZpZXc6IFdvcmtiZW5jaFZpZXcpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHBhcmVudDogSW5qZWN0b3IuTlVMTCxcbiAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRFWFQsIHVzZVZhbHVlOiBjb25maWcudGV4dH1dLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gKHtcbiAgICAgICAgcG9ydGFsOiBuZXcgQ29tcG9uZW50UG9ydGFsKFRleHRDb21wb25lbnQsIG51bGwsIGluamVjdG9yKSxcbiAgICAgICAgYWNjZWxlcmF0b3I6IGNvbmZpZy5hY2NlbGVyYXRvcixcbiAgICAgICAgZ3JvdXA6IGNvbmZpZy5ncm91cCxcbiAgICAgICAgY3NzQ2xhc3M6IGNvbmZpZy5jc3NDbGFzcyxcbiAgICAgICAgaXNEaXNhYmxlZDogKCk6IGJvb2xlYW4gPT4gdmlldy5maXJzdCgpICYmIHZpZXcubGFzdCgpLFxuICAgICAgICBvbkFjdGlvbjogKCk6IHZvaWQgPT4gdm9pZCB2aWV3LmNsb3NlKCdvdGhlci12aWV3cycpLnRoZW4oKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckNsb3NlQWxsVGFic01lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnQ2xvc2UgYWxsIHRhYnMnLCBncm91cDogJ2Nsb3NlJywgYWNjZWxlcmF0b3I6IFsnY3RybCcsICdzaGlmdCcsICdhbHQnLCAnayddLCBjc3NDbGFzczogJ2UyZS1jbG9zZS1hbGwtdGFicyd9O1xuICAgIGNvbnN0IGFwcENvbmZpZzogTWVudUl0ZW1Db25maWcgfCB1bmRlZmluZWQgPSB0aGlzLl93b3JrYmVuY2hDb25maWcudmlld01lbnVJdGVtcz8uY2xvc2VBbGw7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiAoe1xuICAgICAgICBwb3J0YWw6IG5ldyBDb21wb25lbnRQb3J0YWwoVGV4dENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpLFxuICAgICAgICBhY2NlbGVyYXRvcjogY29uZmlnLmFjY2VsZXJhdG9yLFxuICAgICAgICBncm91cDogY29uZmlnLmdyb3VwLFxuICAgICAgICBjc3NDbGFzczogY29uZmlnLmNzc0NsYXNzLFxuICAgICAgICBvbkFjdGlvbjogKCk6IHZvaWQgPT4gdm9pZCB2aWV3LmNsb3NlKCdhbGwtdmlld3MnKS50aGVuKCksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJDbG9zZVJpZ2h0VGFic01lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnQ2xvc2UgdGFicyB0byB0aGUgcmlnaHQnLCBncm91cDogJ2Nsb3NlJywgY3NzQ2xhc3M6ICdlMmUtY2xvc2UtcmlnaHQtdGFicyd9O1xuICAgIGNvbnN0IGFwcENvbmZpZzogTWVudUl0ZW1Db25maWcgfCB1bmRlZmluZWQgPSB0aGlzLl93b3JrYmVuY2hDb25maWcudmlld01lbnVJdGVtcz8uY2xvc2VUb1RoZVJpZ2h0O1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5kZWZhdWx0cywgLi4uYXBwQ29uZmlnfTtcblxuICAgIGNvbmZpZy52aXNpYmxlICYmIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UucmVnaXN0ZXJWaWV3TWVudUl0ZW0oKHZpZXc6IFdvcmtiZW5jaFZpZXcpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHBhcmVudDogSW5qZWN0b3IuTlVMTCxcbiAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRFWFQsIHVzZVZhbHVlOiBjb25maWcudGV4dH1dLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwb3J0YWw6IG5ldyBDb21wb25lbnRQb3J0YWwoVGV4dENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpLFxuICAgICAgICBhY2NlbGVyYXRvcjogY29uZmlnLmFjY2VsZXJhdG9yLFxuICAgICAgICBncm91cDogY29uZmlnLmdyb3VwLFxuICAgICAgICBjc3NDbGFzczogY29uZmlnLmNzc0NsYXNzLFxuICAgICAgICBpc0Rpc2FibGVkOiAoKTogYm9vbGVhbiA9PiB2aWV3Lmxhc3QoKSxcbiAgICAgICAgb25BY3Rpb246ICgpOiB2b2lkID0+IHZvaWQgdmlldy5jbG9zZSgndmlld3MtdG8tdGhlLXJpZ2h0JykudGhlbigpLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJDbG9zZUxlZnRUYWJzTWVudUl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdHM6IE1lbnVJdGVtQ29uZmlnID0ge3Zpc2libGU6IHRydWUsIHRleHQ6ICdDbG9zZSB0YWJzIHRvIHRoZSBsZWZ0JywgZ3JvdXA6ICdjbG9zZScsIGNzc0NsYXNzOiAnZTJlLWNsb3NlLWxlZnQtdGFicyd9O1xuICAgIGNvbnN0IGFwcENvbmZpZzogTWVudUl0ZW1Db25maWcgfCB1bmRlZmluZWQgPSB0aGlzLl93b3JrYmVuY2hDb25maWcudmlld01lbnVJdGVtcz8uY2xvc2VUb1RoZUxlZnQ7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIGlzRGlzYWJsZWQ6ICgpOiBib29sZWFuID0+IHZpZXcuZmlyc3QoKSxcbiAgICAgICAgb25BY3Rpb246ICgpOiB2b2lkID0+IHZvaWQgdmlldy5jbG9zZSgndmlld3MtdG8tdGhlLWxlZnQnKS50aGVuKCksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck1vdmVSaWdodE1lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnTW92ZSByaWdodCcsIGdyb3VwOiAnbW92ZScsIGFjY2VsZXJhdG9yOiBbJ2N0cmwnLCAnYWx0JywgJ2VuZCddLCBjc3NDbGFzczogJ2UyZS1tb3ZlLXJpZ2h0J307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlUmlnaHQ7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIGlzRGlzYWJsZWQ6ICgpID0+IHZpZXcuZmlyc3QoKSAmJiB2aWV3Lmxhc3QoKSxcbiAgICAgICAgb25BY3Rpb246ICgpID0+IHZpZXcubW92ZSh2aWV3LnBhcnQoKS5pZCwge3JlZ2lvbjogJ2Vhc3QnfSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck1vdmVMZWZ0TWVudUl0ZW0oKTogdm9pZCB7XG4gICAgY29uc3QgZGVmYXVsdHM6IE1lbnVJdGVtQ29uZmlnID0ge3Zpc2libGU6IHRydWUsIHRleHQ6ICdNb3ZlIGxlZnQnLCBncm91cDogJ21vdmUnLCBjc3NDbGFzczogJ2UyZS1tb3ZlLWxlZnQnfTtcbiAgICBjb25zdCBhcHBDb25maWc6IE1lbnVJdGVtQ29uZmlnIHwgdW5kZWZpbmVkID0gdGhpcy5fd29ya2JlbmNoQ29uZmlnLnZpZXdNZW51SXRlbXM/Lm1vdmVMZWZ0O1xuICAgIGNvbnN0IGNvbmZpZyA9IHsuLi5kZWZhdWx0cywgLi4uYXBwQ29uZmlnfTtcblxuICAgIGNvbmZpZy52aXNpYmxlICYmIHRoaXMuX3dvcmtiZW5jaFNlcnZpY2UucmVnaXN0ZXJWaWV3TWVudUl0ZW0oKHZpZXc6IFdvcmtiZW5jaFZpZXcpOiBXb3JrYmVuY2hNZW51SXRlbSA9PiB7XG4gICAgICBjb25zdCBpbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICAgIHBhcmVudDogSW5qZWN0b3IuTlVMTCxcbiAgICAgICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IFRFWFQsIHVzZVZhbHVlOiBjb25maWcudGV4dH1dLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBwb3J0YWw6IG5ldyBDb21wb25lbnRQb3J0YWwoVGV4dENvbXBvbmVudCwgbnVsbCwgaW5qZWN0b3IpLFxuICAgICAgICBhY2NlbGVyYXRvcjogY29uZmlnLmFjY2VsZXJhdG9yLFxuICAgICAgICBncm91cDogY29uZmlnLmdyb3VwLFxuICAgICAgICBjc3NDbGFzczogY29uZmlnLmNzc0NsYXNzLFxuICAgICAgICBpc0Rpc2FibGVkOiAoKSA9PiB2aWV3LmZpcnN0KCkgJiYgdmlldy5sYXN0KCksXG4gICAgICAgIG9uQWN0aW9uOiAoKSA9PiB2aWV3Lm1vdmUodmlldy5wYXJ0KCkuaWQsIHtyZWdpb246ICd3ZXN0J30pLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJNb3ZlVXBNZW51SXRlbSgpOiB2b2lkIHtcbiAgICBjb25zdCBkZWZhdWx0czogTWVudUl0ZW1Db25maWcgPSB7dmlzaWJsZTogdHJ1ZSwgdGV4dDogJ01vdmUgdXAnLCBncm91cDogJ21vdmUnLCBjc3NDbGFzczogJ2UyZS1tb3ZlLXVwJ307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlVXA7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIGlzRGlzYWJsZWQ6ICgpID0+IHZpZXcuZmlyc3QoKSAmJiB2aWV3Lmxhc3QoKSxcbiAgICAgICAgb25BY3Rpb246ICgpID0+IHZpZXcubW92ZSh2aWV3LnBhcnQoKS5pZCwge3JlZ2lvbjogJ25vcnRoJ30pLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJNb3ZlRG93bk1lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnTW92ZSBkb3duJywgZ3JvdXA6ICdtb3ZlJywgY3NzQ2xhc3M6ICdlMmUtbW92ZS1kb3duJ307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlRG93bjtcbiAgICBjb25zdCBjb25maWcgPSB7Li4uZGVmYXVsdHMsIC4uLmFwcENvbmZpZ307XG5cbiAgICBjb25maWcudmlzaWJsZSAmJiB0aGlzLl93b3JrYmVuY2hTZXJ2aWNlLnJlZ2lzdGVyVmlld01lbnVJdGVtKCh2aWV3OiBXb3JrYmVuY2hWaWV3KTogV29ya2JlbmNoTWVudUl0ZW0gPT4ge1xuICAgICAgY29uc3QgaW5qZWN0b3IgPSBJbmplY3Rvci5jcmVhdGUoe1xuICAgICAgICBwYXJlbnQ6IEluamVjdG9yLk5VTEwsXG4gICAgICAgIHByb3ZpZGVyczogW3twcm92aWRlOiBURVhULCB1c2VWYWx1ZTogY29uZmlnLnRleHR9XSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcG9ydGFsOiBuZXcgQ29tcG9uZW50UG9ydGFsKFRleHRDb21wb25lbnQsIG51bGwsIGluamVjdG9yKSxcbiAgICAgICAgYWNjZWxlcmF0b3I6IGNvbmZpZy5hY2NlbGVyYXRvcixcbiAgICAgICAgZ3JvdXA6IGNvbmZpZy5ncm91cCxcbiAgICAgICAgY3NzQ2xhc3M6IGNvbmZpZy5jc3NDbGFzcyxcbiAgICAgICAgaXNEaXNhYmxlZDogKCkgPT4gdmlldy5maXJzdCgpICYmIHZpZXcubGFzdCgpLFxuICAgICAgICBvbkFjdGlvbjogKCkgPT4gdmlldy5tb3ZlKHZpZXcucGFydCgpLmlkLCB7cmVnaW9uOiAnc291dGgnfSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3Rlck1vdmVUb05ld1dpbmRvd01lbnVJdGVtKCk6IHZvaWQge1xuICAgIGNvbnN0IGRlZmF1bHRzOiBNZW51SXRlbUNvbmZpZyA9IHt2aXNpYmxlOiB0cnVlLCB0ZXh0OiAnTW92ZSB0byBuZXcgd2luZG93JywgZ3JvdXA6ICdvcGVuJywgY3NzQ2xhc3M6ICdlMmUtbW92ZS10by1uZXctd2luZG93J307XG4gICAgY29uc3QgYXBwQ29uZmlnOiBNZW51SXRlbUNvbmZpZyB8IHVuZGVmaW5lZCA9IHRoaXMuX3dvcmtiZW5jaENvbmZpZy52aWV3TWVudUl0ZW1zPy5tb3ZlVG9OZXdXaW5kb3c7XG4gICAgY29uc3QgY29uZmlnID0gey4uLmRlZmF1bHRzLCAuLi5hcHBDb25maWd9O1xuXG4gICAgY29uZmlnLnZpc2libGUgJiYgdGhpcy5fd29ya2JlbmNoU2VydmljZS5yZWdpc3RlclZpZXdNZW51SXRlbSgodmlldzogV29ya2JlbmNoVmlldyk6IFdvcmtiZW5jaE1lbnVJdGVtID0+IHtcbiAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcGFyZW50OiBJbmplY3Rvci5OVUxMLFxuICAgICAgICBwcm92aWRlcnM6IFt7cHJvdmlkZTogVEVYVCwgdXNlVmFsdWU6IGNvbmZpZy50ZXh0fV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBvcnRhbDogbmV3IENvbXBvbmVudFBvcnRhbChUZXh0Q29tcG9uZW50LCBudWxsLCBpbmplY3RvciksXG4gICAgICAgIGFjY2VsZXJhdG9yOiBjb25maWcuYWNjZWxlcmF0b3IsXG4gICAgICAgIGdyb3VwOiBjb25maWcuZ3JvdXAsXG4gICAgICAgIGNzc0NsYXNzOiBjb25maWcuY3NzQ2xhc3MsXG4gICAgICAgIG9uQWN0aW9uOiAoKSA9PiB2aWV3Lm1vdmUoJ25ldy13aW5kb3cnKSxcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwcmVzc2VkIG1vZGlmaWVyIGtleXMgKGN0cmwsIHNoaWZ0LCBhbHQsIG1ldGEpIGFzIGFycmF5IGl0ZW1zLlxuICovXG5mdW5jdGlvbiBnZXRNb2RpZmllclN0YXRlKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogc3RyaW5nW10ge1xuICBjb25zdCBtb2RpZmllclN0YXRlOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoZXZlbnQuY3RybEtleSkge1xuICAgIG1vZGlmaWVyU3RhdGUucHVzaCgnY3RybCcpO1xuICB9XG4gIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgIG1vZGlmaWVyU3RhdGUucHVzaCgnc2hpZnQnKTtcbiAgfVxuICBpZiAoZXZlbnQuYWx0S2V5KSB7XG4gICAgbW9kaWZpZXJTdGF0ZS5wdXNoKCdhbHQnKTtcbiAgfVxuICBpZiAoZXZlbnQubWV0YUtleSkge1xuICAgIG1vZGlmaWVyU3RhdGUucHVzaCgnbWV0YScpO1xuICB9XG4gIHJldHVybiBtb2RpZmllclN0YXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBvaW50IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG59XG4iXX0=
|