@veloceapps/sdk 12.0.0-13 → 12.0.0-14
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/cms/index.d.ts +921 -15
- package/core/index.d.ts +525 -8
- package/fesm2022/veloceapps-sdk-cms.mjs +2617 -0
- package/fesm2022/veloceapps-sdk-cms.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/veloceapps-sdk-core.mjs +117 -112
- package/fesm2022/veloceapps-sdk-core.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/veloceapps-sdk.mjs +170 -170
- package/fesm2022/veloceapps-sdk.mjs.map +1 -0
- package/index.d.ts +330 -1
- package/package.json +17 -34
- package/cms/cms.actions.d.ts +0 -154
- package/cms/cms.default.d.ts +0 -5
- package/cms/cms.elements.d.ts +0 -4
- package/cms/cms.layouts.d.ts +0 -4
- package/cms/components/element-children/element-children.component.d.ts +0 -22
- package/cms/components/element-children/element-children.module.d.ts +0 -11
- package/cms/components/element-drop-handle/element-drop-handle.component.d.ts +0 -12
- package/cms/components/element-drop-handle/element-drop-handle.module.d.ts +0 -9
- package/cms/components/element-renderer/element-renderer.component.d.ts +0 -29
- package/cms/components/element-renderer/element-renderer.module.d.ts +0 -7
- package/cms/components/element-tools-panel/element-tools-panel.component.d.ts +0 -14
- package/cms/components/element.component.d.ts +0 -17
- package/cms/components/index.d.ts +0 -1
- package/cms/components/plugin.component.d.ts +0 -15
- package/cms/components/preview/index.d.ts +0 -3
- package/cms/components/preview/preview.component.d.ts +0 -32
- package/cms/components/preview/preview.module.d.ts +0 -13
- package/cms/components/preview/preview.types.d.ts +0 -20
- package/cms/decorators/element.decorator.d.ts +0 -2
- package/cms/decorators/index.d.ts +0 -1
- package/cms/definitions/index.d.ts +0 -1
- package/cms/definitions/ui-builder.definitions.d.ts +0 -6
- package/cms/directives/custom-template.directive.d.ts +0 -17
- package/cms/engine/models/entity.d.ts +0 -11
- package/cms/engine/models/plugin.d.ts +0 -5
- package/cms/injection-tokens.d.ts +0 -9
- package/cms/launcher.module.d.ts +0 -12
- package/cms/modules/federated/default-options.d.ts +0 -4
- package/cms/modules/federated/export.d.ts +0 -1
- package/cms/modules/federated/federated-host.directive.d.ts +0 -8
- package/cms/modules/federated/federated.component.d.ts +0 -25
- package/cms/modules/federated/federated.module.d.ts +0 -10
- package/cms/modules/federated/federated.types.d.ts +0 -26
- package/cms/modules/migrations/index.d.ts +0 -2
- package/cms/modules/migrations/migrations.d.ts +0 -2
- package/cms/modules/migrations/migrations.module.d.ts +0 -6
- package/cms/modules/migrations/services/migrations.service.d.ts +0 -10
- package/cms/modules/migrations/types/migrations.types.d.ts +0 -2
- package/cms/modules/runtime/index.d.ts +0 -3
- package/cms/modules/runtime/runtime.module.d.ts +0 -8
- package/cms/modules/runtime/services/compilation.service.d.ts +0 -19
- package/cms/modules/runtime/services/runtime-editor.service.d.ts +0 -20
- package/cms/modules/runtime/services/runtime.service.d.ts +0 -33
- package/cms/modules/runtime/tokens.d.ts +0 -3
- package/cms/modules/runtime/types/compilation.types.d.ts +0 -8
- package/cms/modules/runtime/types/runtime.actions.d.ts +0 -12
- package/cms/plugins/element-hover.plugin.d.ts +0 -33
- package/cms/plugins/io.plugin.d.ts +0 -9
- package/cms/plugins/page.plugin.d.ts +0 -15
- package/cms/plugins/region.plugin.d.ts +0 -17
- package/cms/plugins/script.plugin.d.ts +0 -10
- package/cms/services/element-context.service.d.ts +0 -7
- package/cms/services/index.d.ts +0 -2
- package/cms/services/io-provider.service.d.ts +0 -15
- package/cms/services/resources.service.d.ts +0 -21
- package/cms/services/templates.service.d.ts +0 -14
- package/cms/types/common.types.d.ts +0 -130
- package/cms/types/elements.types.d.ts +0 -2
- package/cms/types/index.d.ts +0 -6
- package/cms/types/layouts.types.d.ts +0 -102
- package/cms/types/pages.types.d.ts +0 -1
- package/cms/types/path.types.d.ts +0 -11
- package/cms/utils/element-metadata-worker.d.ts +0 -11
- package/cms/utils/element.utils.d.ts +0 -20
- package/cms/utils/elements-resolver.d.ts +0 -28
- package/cms/utils/encoding.utils.d.ts +0 -2
- package/cms/utils/index.d.ts +0 -9
- package/cms/utils/inject.d.ts +0 -1
- package/cms/utils/path.utils.d.ts +0 -3
- package/cms/utils/script.utils.d.ts +0 -2
- package/cms/utils/transpilation-worker.d.ts +0 -13
- package/cms/utils/ui-builder-layout.utils.d.ts +0 -4
- package/cms/utils/ui-definition.utils.d.ts +0 -6
- package/cms/vendor-map.d.ts +0 -86
- package/core/core.module.d.ts +0 -10
- package/core/directives/directives.module.d.ts +0 -7
- package/core/directives/index.d.ts +0 -2
- package/core/directives/primeng-calendar.directive.d.ts +0 -14
- package/core/modules/configuration/configuration.module.d.ts +0 -8
- package/core/modules/configuration/index.d.ts +0 -6
- package/core/modules/configuration/services/configuration-runtime.service.d.ts +0 -19
- package/core/modules/configuration/services/configuration-state.service.d.ts +0 -60
- package/core/modules/configuration/services/configuration.service.d.ts +0 -38
- package/core/modules/configuration/services/guided-selling.service.d.ts +0 -15
- package/core/modules/configuration/services/test-mode-configuration.service.d.ts +0 -26
- package/core/modules/configuration/types/configuration-runtime.types.d.ts +0 -3
- package/core/modules/configuration/types/configuration.types.d.ts +0 -20
- package/core/modules/configuration/types/index.d.ts +0 -2
- package/core/modules/flow-configuration/flow-configuration.module.d.ts +0 -7
- package/core/modules/flow-configuration/index.d.ts +0 -1
- package/core/modules/flow-configuration/services/flow-configuration.service.d.ts +0 -23
- package/core/modules/index.d.ts +0 -2
- package/core/operators/filter-successful-execute.operator.d.ts +0 -3
- package/core/operators/index.d.ts +0 -1
- package/core/pipes/action-code.pipe.d.ts +0 -8
- package/core/pipes/date.pipe.d.ts +0 -13
- package/core/pipes/index.d.ts +0 -5
- package/core/pipes/number.pipe.d.ts +0 -10
- package/core/pipes/pipes.module.d.ts +0 -10
- package/core/pipes/price.pipe.d.ts +0 -10
- package/core/services/catalog-products.service.d.ts +0 -11
- package/core/services/flow-info.service.d.ts +0 -44
- package/core/services/flow-state-configuration.service.d.ts +0 -25
- package/core/services/flow-state.service.d.ts +0 -70
- package/core/services/index.d.ts +0 -8
- package/core/services/integration.state.d.ts +0 -16
- package/core/services/product-images.service.d.ts +0 -12
- package/core/services/runtime-settings.service.d.ts +0 -24
- package/core/services/sales-transaction.service.d.ts +0 -27
- package/core/types/flow-customization.types.d.ts +0 -10
- package/core/types/flow-state.types.d.ts +0 -12
- package/core/types/formatting-settings.types.d.ts +0 -13
- package/core/types/index.d.ts +0 -5
- package/core/types/integration.types.d.ts +0 -10
- package/core/types/pipe.types.d.ts +0 -1
- package/core/types/ui-definition.types.d.ts +0 -1
- package/core/utils/index.d.ts +0 -4
- package/core/utils/pcm.utils.d.ts +0 -5
- package/core/utils/transaction-item.utils.d.ts +0 -10
- package/core/utils/transaction-item.worker.d.ts +0 -8
- package/core/utils/ui-definition.utils.d.ts +0 -2
- package/esm2020/cms/cms.actions.mjs +0 -151
- package/esm2020/cms/cms.default.mjs +0 -5
- package/esm2020/cms/cms.elements.mjs +0 -52
- package/esm2020/cms/cms.layouts.mjs +0 -239
- package/esm2020/cms/components/element-children/element-children.component.mjs +0 -41
- package/esm2020/cms/components/element-children/element-children.module.mjs +0 -21
- package/esm2020/cms/components/element-drop-handle/element-drop-handle.component.mjs +0 -28
- package/esm2020/cms/components/element-drop-handle/element-drop-handle.module.mjs +0 -19
- package/esm2020/cms/components/element-renderer/element-renderer.component.mjs +0 -117
- package/esm2020/cms/components/element-renderer/element-renderer.module.mjs +0 -16
- package/esm2020/cms/components/element-tools-panel/element-tools-panel.component.mjs +0 -35
- package/esm2020/cms/components/element.component.mjs +0 -45
- package/esm2020/cms/components/index.mjs +0 -2
- package/esm2020/cms/components/plugin.component.mjs +0 -17
- package/esm2020/cms/components/preview/index.mjs +0 -4
- package/esm2020/cms/components/preview/preview.component.mjs +0 -75
- package/esm2020/cms/components/preview/preview.module.mjs +0 -42
- package/esm2020/cms/components/preview/preview.types.mjs +0 -2
- package/esm2020/cms/decorators/element.decorator.mjs +0 -6
- package/esm2020/cms/decorators/index.mjs +0 -2
- package/esm2020/cms/definitions/index.mjs +0 -2
- package/esm2020/cms/definitions/ui-builder.definitions.mjs +0 -18
- package/esm2020/cms/directives/custom-template.directive.mjs +0 -38
- package/esm2020/cms/engine/models/entity.mjs +0 -17
- package/esm2020/cms/engine/models/plugin.mjs +0 -6
- package/esm2020/cms/index.mjs +0 -16
- package/esm2020/cms/injection-tokens.mjs +0 -7
- package/esm2020/cms/launcher.module.mjs +0 -24
- package/esm2020/cms/modules/federated/default-options.mjs +0 -5
- package/esm2020/cms/modules/federated/export.mjs +0 -2
- package/esm2020/cms/modules/federated/federated-host.directive.mjs +0 -16
- package/esm2020/cms/modules/federated/federated.component.mjs +0 -74
- package/esm2020/cms/modules/federated/federated.module.mjs +0 -20
- package/esm2020/cms/modules/federated/federated.types.mjs +0 -2
- package/esm2020/cms/modules/migrations/index.mjs +0 -3
- package/esm2020/cms/modules/migrations/migrations.mjs +0 -22
- package/esm2020/cms/modules/migrations/migrations.module.mjs +0 -15
- package/esm2020/cms/modules/migrations/services/migrations.service.mjs +0 -47
- package/esm2020/cms/modules/migrations/types/migrations.types.mjs +0 -2
- package/esm2020/cms/modules/runtime/index.mjs +0 -4
- package/esm2020/cms/modules/runtime/runtime.module.mjs +0 -32
- package/esm2020/cms/modules/runtime/services/compilation.service.mjs +0 -93
- package/esm2020/cms/modules/runtime/services/runtime-editor.service.mjs +0 -30
- package/esm2020/cms/modules/runtime/services/runtime.service.mjs +0 -117
- package/esm2020/cms/modules/runtime/tokens.mjs +0 -3
- package/esm2020/cms/modules/runtime/types/compilation.types.mjs +0 -2
- package/esm2020/cms/modules/runtime/types/runtime.actions.mjs +0 -2
- package/esm2020/cms/plugins/element-hover.plugin.mjs +0 -121
- package/esm2020/cms/plugins/io.plugin.mjs +0 -45
- package/esm2020/cms/plugins/page.plugin.mjs +0 -37
- package/esm2020/cms/plugins/region.plugin.mjs +0 -59
- package/esm2020/cms/plugins/script.plugin.mjs +0 -31
- package/esm2020/cms/services/element-context.service.mjs +0 -10
- package/esm2020/cms/services/index.mjs +0 -3
- package/esm2020/cms/services/io-provider.service.mjs +0 -53
- package/esm2020/cms/services/resources.service.mjs +0 -71
- package/esm2020/cms/services/templates.service.mjs +0 -32
- package/esm2020/cms/types/common.types.mjs +0 -2
- package/esm2020/cms/types/elements.types.mjs +0 -2
- package/esm2020/cms/types/index.mjs +0 -7
- package/esm2020/cms/types/layouts.types.mjs +0 -71
- package/esm2020/cms/types/pages.types.mjs +0 -2
- package/esm2020/cms/types/path.types.mjs +0 -2
- package/esm2020/cms/utils/element-metadata-worker.mjs +0 -31
- package/esm2020/cms/utils/element.utils.mjs +0 -182
- package/esm2020/cms/utils/elements-resolver.mjs +0 -206
- package/esm2020/cms/utils/encoding.utils.mjs +0 -29
- package/esm2020/cms/utils/index.mjs +0 -10
- package/esm2020/cms/utils/inject.mjs +0 -27
- package/esm2020/cms/utils/path.utils.mjs +0 -44
- package/esm2020/cms/utils/script.utils.mjs +0 -46
- package/esm2020/cms/utils/transpilation-worker.mjs +0 -52
- package/esm2020/cms/utils/ui-builder-layout.utils.mjs +0 -46
- package/esm2020/cms/utils/ui-definition.utils.mjs +0 -85
- package/esm2020/cms/veloceapps-sdk-cms.mjs +0 -5
- package/esm2020/cms/vendor-map.mjs +0 -83
- package/esm2020/core/core.module.mjs +0 -54
- package/esm2020/core/directives/directives.module.mjs +0 -16
- package/esm2020/core/directives/index.mjs +0 -3
- package/esm2020/core/directives/primeng-calendar.directive.mjs +0 -41
- package/esm2020/core/index.mjs +0 -9
- package/esm2020/core/modules/configuration/configuration.module.mjs +0 -34
- package/esm2020/core/modules/configuration/index.mjs +0 -7
- package/esm2020/core/modules/configuration/services/configuration-runtime.service.mjs +0 -38
- package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +0 -381
- package/esm2020/core/modules/configuration/services/configuration.service.mjs +0 -172
- package/esm2020/core/modules/configuration/services/guided-selling.service.mjs +0 -62
- package/esm2020/core/modules/configuration/services/test-mode-configuration.service.mjs +0 -97
- package/esm2020/core/modules/configuration/types/configuration-runtime.types.mjs +0 -2
- package/esm2020/core/modules/configuration/types/configuration.types.mjs +0 -2
- package/esm2020/core/modules/configuration/types/index.mjs +0 -3
- package/esm2020/core/modules/flow-configuration/flow-configuration.module.mjs +0 -17
- package/esm2020/core/modules/flow-configuration/index.mjs +0 -2
- package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +0 -80
- package/esm2020/core/modules/index.mjs +0 -3
- package/esm2020/core/operators/filter-successful-execute.operator.mjs +0 -5
- package/esm2020/core/operators/index.mjs +0 -2
- package/esm2020/core/pipes/action-code.pipe.mjs +0 -20
- package/esm2020/core/pipes/date.pipe.mjs +0 -44
- package/esm2020/core/pipes/index.mjs +0 -6
- package/esm2020/core/pipes/number.pipe.mjs +0 -27
- package/esm2020/core/pipes/pipes.module.mjs +0 -19
- package/esm2020/core/pipes/price.pipe.mjs +0 -30
- package/esm2020/core/services/catalog-products.service.mjs +0 -25
- package/esm2020/core/services/flow-info.service.mjs +0 -146
- package/esm2020/core/services/flow-state-configuration.service.mjs +0 -120
- package/esm2020/core/services/flow-state.service.mjs +0 -417
- package/esm2020/core/services/index.mjs +0 -9
- package/esm2020/core/services/integration.state.mjs +0 -36
- package/esm2020/core/services/product-images.service.mjs +0 -30
- package/esm2020/core/services/runtime-settings.service.mjs +0 -112
- package/esm2020/core/services/sales-transaction.service.mjs +0 -67
- package/esm2020/core/types/flow-customization.types.mjs +0 -3
- package/esm2020/core/types/flow-state.types.mjs +0 -2
- package/esm2020/core/types/formatting-settings.types.mjs +0 -3
- package/esm2020/core/types/index.mjs +0 -6
- package/esm2020/core/types/integration.types.mjs +0 -2
- package/esm2020/core/types/pipe.types.mjs +0 -2
- package/esm2020/core/types/ui-definition.types.mjs +0 -2
- package/esm2020/core/utils/index.mjs +0 -5
- package/esm2020/core/utils/pcm.utils.mjs +0 -15
- package/esm2020/core/utils/transaction-item.utils.mjs +0 -144
- package/esm2020/core/utils/transaction-item.worker.mjs +0 -16
- package/esm2020/core/utils/ui-definition.utils.mjs +0 -9
- package/esm2020/core/veloceapps-sdk-core.mjs +0 -5
- package/esm2020/index.mjs +0 -2
- package/esm2020/src/components/dialog/dialog.component.mjs +0 -36
- package/esm2020/src/components/dialog/dialog.module.mjs +0 -19
- package/esm2020/src/components/dialog/dialog.types.mjs +0 -2
- package/esm2020/src/components/flow-header/flow-header.component.mjs +0 -107
- package/esm2020/src/components/flow-header/flow-header.module.mjs +0 -19
- package/esm2020/src/components/flow-header/index.mjs +0 -2
- package/esm2020/src/components/guided-selling/guided-selling.component.mjs +0 -107
- package/esm2020/src/components/guided-selling/guided-selling.module.mjs +0 -19
- package/esm2020/src/configure-primeng.mjs +0 -33
- package/esm2020/src/constants.mjs +0 -2
- package/esm2020/src/flow-routing.module.mjs +0 -97
- package/esm2020/src/flow.component.mjs +0 -39
- package/esm2020/src/flow.module.mjs +0 -60
- package/esm2020/src/guards/flow.guard.mjs +0 -35
- package/esm2020/src/guards/product-unload.guard.mjs +0 -49
- package/esm2020/src/guards/root.guard.mjs +0 -46
- package/esm2020/src/index.mjs +0 -5
- package/esm2020/src/pages/assets/assets.component.mjs +0 -106
- package/esm2020/src/pages/assets/assets.module.mjs +0 -20
- package/esm2020/src/pages/catalog/catalog.component.mjs +0 -106
- package/esm2020/src/pages/catalog/catalog.module.mjs +0 -20
- package/esm2020/src/pages/debug/debug.component.mjs +0 -49
- package/esm2020/src/pages/debug/debug.module.mjs +0 -46
- package/esm2020/src/pages/product/product.component.mjs +0 -55
- package/esm2020/src/pages/product/product.module.mjs +0 -20
- package/esm2020/src/pages/record-not-found/record-not-found.component.mjs +0 -27
- package/esm2020/src/pages/record-not-found/record-not-found.module.mjs +0 -20
- package/esm2020/src/pages/shopping-cart/shopping-cart.component.mjs +0 -106
- package/esm2020/src/pages/shopping-cart/shopping-cart.module.mjs +0 -20
- package/esm2020/src/resolvers/flow.resolver.mjs +0 -50
- package/esm2020/src/resolvers/pcm-model.resolver.mjs +0 -12
- package/esm2020/src/resolvers/sales-transaction.resolver.mjs +0 -64
- package/esm2020/src/resolvers/ui-definition.resolver.mjs +0 -44
- package/esm2020/src/services/flow-dialog.service.mjs +0 -91
- package/esm2020/src/services/flow-router.service.mjs +0 -173
- package/esm2020/src/services/flow.service.mjs +0 -102
- package/esm2020/src/services/guided-selling.service.mjs +0 -34
- package/esm2020/src/services/index.mjs +0 -4
- package/esm2020/src/types/index.mjs +0 -2
- package/esm2020/src/types/route.types.mjs +0 -2
- package/esm2020/veloceapps-sdk.mjs +0 -5
- package/fesm2015/veloceapps-sdk-cms.mjs +0 -2514
- package/fesm2015/veloceapps-sdk-cms.mjs.map +0 -1
- package/fesm2015/veloceapps-sdk-core.mjs +0 -2104
- package/fesm2015/veloceapps-sdk-core.mjs.map +0 -1
- package/fesm2015/veloceapps-sdk.mjs +0 -1598
- package/fesm2015/veloceapps-sdk.mjs.map +0 -1
- package/fesm2020/veloceapps-sdk-cms.mjs +0 -2613
- package/fesm2020/veloceapps-sdk-cms.mjs.map +0 -1
- package/fesm2020/veloceapps-sdk-core.mjs.map +0 -1
- package/fesm2020/veloceapps-sdk.mjs.map +0 -1
- package/src/components/dialog/dialog.component.d.ts +0 -13
- package/src/components/dialog/dialog.module.d.ts +0 -9
- package/src/components/dialog/dialog.types.d.ts +0 -7
- package/src/components/flow-header/flow-header.component.d.ts +0 -25
- package/src/components/flow-header/flow-header.module.d.ts +0 -9
- package/src/components/flow-header/index.d.ts +0 -1
- package/src/components/guided-selling/guided-selling.component.d.ts +0 -25
- package/src/components/guided-selling/guided-selling.module.d.ts +0 -9
- package/src/configure-primeng.d.ts +0 -1
- package/src/constants.d.ts +0 -1
- package/src/flow-routing.module.d.ts +0 -11
- package/src/flow.component.d.ts +0 -21
- package/src/flow.module.d.ts +0 -16
- package/src/guards/flow.guard.d.ts +0 -2
- package/src/guards/product-unload.guard.d.ts +0 -16
- package/src/guards/root.guard.d.ts +0 -14
- package/src/index.d.ts +0 -4
- package/src/pages/assets/assets.component.d.ts +0 -31
- package/src/pages/assets/assets.module.d.ts +0 -10
- package/src/pages/catalog/catalog.component.d.ts +0 -31
- package/src/pages/catalog/catalog.module.d.ts +0 -10
- package/src/pages/debug/debug.component.d.ts +0 -21
- package/src/pages/debug/debug.module.d.ts +0 -14
- package/src/pages/product/product.component.d.ts +0 -24
- package/src/pages/product/product.module.d.ts +0 -10
- package/src/pages/record-not-found/record-not-found.component.d.ts +0 -12
- package/src/pages/record-not-found/record-not-found.module.d.ts +0 -9
- package/src/pages/shopping-cart/shopping-cart.component.d.ts +0 -31
- package/src/pages/shopping-cart/shopping-cart.module.d.ts +0 -10
- package/src/resolvers/flow.resolver.d.ts +0 -14
- package/src/resolvers/pcm-model.resolver.d.ts +0 -3
- package/src/resolvers/sales-transaction.resolver.d.ts +0 -18
- package/src/resolvers/ui-definition.resolver.d.ts +0 -3
- package/src/services/flow-dialog.service.d.ts +0 -23
- package/src/services/flow-router.service.d.ts +0 -42
- package/src/services/flow.service.d.ts +0 -21
- package/src/services/guided-selling.service.d.ts +0 -13
- package/src/services/index.d.ts +0 -3
- package/src/types/index.d.ts +0 -1
- package/src/types/route.types.d.ts +0 -4
@@ -1,381 +0,0 @@
|
|
1
|
-
import { Injectable } from '@angular/core';
|
2
|
-
import { FlowStateApiService } from '@veloceapps/api';
|
3
|
-
import { PCMApiService, SalesTransactionApiService, } from '@veloceapps/api/v2';
|
4
|
-
import { ToastService, ToastType } from '@veloceapps/components';
|
5
|
-
import { EntityUtil, isDefined, UUID, } from '@veloceapps/core';
|
6
|
-
import { assign, cloneDeep } from 'lodash';
|
7
|
-
import { BehaviorSubject, buffer, catchError, combineLatest, debounceTime, distinctUntilChanged, filter, finalize, first, map, of, share, shareReplay, Subject, switchMap, take, takeUntil, tap, throwError, } from 'rxjs';
|
8
|
-
import { FlowInfoService, FlowStateService, SalesTransactionService } from '../../../services';
|
9
|
-
import { FlowConfigurationService } from '../../flow-configuration';
|
10
|
-
import { ConfigurationRuntimeService } from './configuration-runtime.service';
|
11
|
-
import { ConfigurationService } from './configuration.service';
|
12
|
-
import { generateTransactionItem } from '../../../utils';
|
13
|
-
import * as i0 from "@angular/core";
|
14
|
-
import * as i1 from "./configuration-runtime.service";
|
15
|
-
import * as i2 from "./configuration.service";
|
16
|
-
import * as i3 from "../../../services";
|
17
|
-
import * as i4 from "../../flow-configuration";
|
18
|
-
import * as i5 from "@veloceapps/api";
|
19
|
-
import * as i6 from "@veloceapps/api/v2";
|
20
|
-
import * as i7 from "@veloceapps/components";
|
21
|
-
export class ConfigurationStateService {
|
22
|
-
constructor(configurationRuntimeService, configurationService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, salesTransactionService, salesTransactionApiService, toastService, pcmApiService) {
|
23
|
-
this.configurationRuntimeService = configurationRuntimeService;
|
24
|
-
this.configurationService = configurationService;
|
25
|
-
this.flowStateService = flowStateService;
|
26
|
-
this.flowInfoService = flowInfoService;
|
27
|
-
this.flowConfigurationService = flowConfigurationService;
|
28
|
-
this.flowStateApiService = flowStateApiService;
|
29
|
-
this.salesTransactionService = salesTransactionService;
|
30
|
-
this.salesTransactionApiService = salesTransactionApiService;
|
31
|
-
this.toastService = toastService;
|
32
|
-
this.pcmApiService = pcmApiService;
|
33
|
-
this.isInitialized$ = new BehaviorSubject(false);
|
34
|
-
this.canceledConfiguration$ = new Subject();
|
35
|
-
this.NOT_INITIALIZED = Symbol();
|
36
|
-
this.EXECUTION_BUFFER_TIME = 100;
|
37
|
-
this.executedFunctions = {};
|
38
|
-
this.stateId = null;
|
39
|
-
this.ownerId = '';
|
40
|
-
this.subscriptions = {};
|
41
|
-
this.configurationStore = {};
|
42
|
-
this.executionInProgress$ = new BehaviorSubject(false);
|
43
|
-
this.statefulRequestStream$ = new Subject();
|
44
|
-
this.statelessExecutionRequest$ = null;
|
45
|
-
this.statefulExecutionRequest$ = this.initBufferedRequest$();
|
46
|
-
}
|
47
|
-
get isExecutionInProgress$() {
|
48
|
-
return this.executionInProgress$.asObservable();
|
49
|
-
}
|
50
|
-
init$() {
|
51
|
-
let request$;
|
52
|
-
if (this.flowStateService.stateId && this.isStatefulConfiguration) {
|
53
|
-
request$ = this.initStateful$();
|
54
|
-
}
|
55
|
-
else {
|
56
|
-
request$ = this.configurationService.init$();
|
57
|
-
}
|
58
|
-
return request$.pipe(take(1), tap(() => {
|
59
|
-
this.isInitialized$.next(true);
|
60
|
-
this.canceledConfiguration$ = new Subject();
|
61
|
-
}));
|
62
|
-
}
|
63
|
-
cleanup() {
|
64
|
-
Object.values(this.subscriptions).forEach(({ data$ }) => data$.complete());
|
65
|
-
this.subscriptions = {};
|
66
|
-
if (this.stateId) {
|
67
|
-
this.cancelConfiguration();
|
68
|
-
}
|
69
|
-
this.configurationStore = {};
|
70
|
-
this.executedFunctions = {};
|
71
|
-
this.configurationService.reset();
|
72
|
-
this.configurationRuntimeService.reset();
|
73
|
-
}
|
74
|
-
execute$(exec) {
|
75
|
-
const request = this.execToRequest(exec);
|
76
|
-
return this.executeRequest$(request).pipe(map(result => {
|
77
|
-
// Keep only requested results
|
78
|
-
const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
|
79
|
-
if (exec.selectors?.[requestId]) {
|
80
|
-
trunk[requestId] = result;
|
81
|
-
}
|
82
|
-
return trunk;
|
83
|
-
}, {});
|
84
|
-
return actualSelectors;
|
85
|
-
}));
|
86
|
-
}
|
87
|
-
dispatch$(actionName, inputData = {}) {
|
88
|
-
const exec = {
|
89
|
-
actions: [{ name: actionName, inputData }],
|
90
|
-
};
|
91
|
-
const request = this.execToRequest(exec);
|
92
|
-
const executionRequest$ = this.executeRequest$(request);
|
93
|
-
if (this.isStatefulConfiguration) {
|
94
|
-
return executionRequest$;
|
95
|
-
}
|
96
|
-
// prevent parallel configuration requests in stateless mode
|
97
|
-
if (!this.statelessExecutionRequest$) {
|
98
|
-
this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay(), take(1), finalize(() => (this.statelessExecutionRequest$ = null)));
|
99
|
-
}
|
100
|
-
return this.statelessExecutionRequest$;
|
101
|
-
}
|
102
|
-
select$(selectorName, inputData = {}) {
|
103
|
-
const requestId = UUID.UUID();
|
104
|
-
const request = this.execToRequest({
|
105
|
-
selectors: {
|
106
|
-
[requestId]: {
|
107
|
-
name: selectorName,
|
108
|
-
inputData,
|
109
|
-
},
|
110
|
-
},
|
111
|
-
});
|
112
|
-
return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
|
113
|
-
}
|
114
|
-
subscribe$(selectorName, inputData = {}, options) {
|
115
|
-
const requestId = UUID.UUID();
|
116
|
-
let subscription = this.subscriptions[requestId];
|
117
|
-
if (!subscription) {
|
118
|
-
const request = this.execToRequest({
|
119
|
-
selectors: {
|
120
|
-
[requestId]: {
|
121
|
-
name: selectorName,
|
122
|
-
inputData,
|
123
|
-
},
|
124
|
-
},
|
125
|
-
});
|
126
|
-
subscription = {
|
127
|
-
request,
|
128
|
-
data$: new BehaviorSubject(this.NOT_INITIALIZED),
|
129
|
-
};
|
130
|
-
this.subscriptions[requestId] = subscription;
|
131
|
-
if (!options?.cold) {
|
132
|
-
this.executeRequest$(request).subscribe();
|
133
|
-
}
|
134
|
-
}
|
135
|
-
return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), distinctUntilChanged(), finalize(() => {
|
136
|
-
if (!this.subscriptions[requestId]?.data$.observed) {
|
137
|
-
delete this.subscriptions[requestId];
|
138
|
-
}
|
139
|
-
}), takeUntil(this.canceledConfiguration$));
|
140
|
-
}
|
141
|
-
saveConfiguration() {
|
142
|
-
if (this.isStatefulConfiguration) {
|
143
|
-
return this.flowStateApiService.saveConfiguration(this.flowStateService.stateId ?? '', this.stateId ?? '').pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map(() => r))), map(r => ({ id: r.quoteId })));
|
144
|
-
}
|
145
|
-
const state = this.salesTransactionService.state;
|
146
|
-
if (!state) {
|
147
|
-
return of({ id: '' });
|
148
|
-
}
|
149
|
-
const { standalone } = this.flowInfoService.flow.properties;
|
150
|
-
const transactionContext = this.salesTransactionService.state;
|
151
|
-
const configurationRoot = this.configurationService.root;
|
152
|
-
if (!transactionContext || !configurationRoot) {
|
153
|
-
return of({ id: '' });
|
154
|
-
}
|
155
|
-
const stateItems = transactionContext.salesTransaction.salesTransactionItems;
|
156
|
-
const isNewTransactionItem = stateItems.every(ti => ti.id !== configurationRoot.id);
|
157
|
-
let salesTransactionItems;
|
158
|
-
if (isNewTransactionItem) {
|
159
|
-
salesTransactionItems = [...stateItems, configurationRoot];
|
160
|
-
}
|
161
|
-
else {
|
162
|
-
salesTransactionItems = stateItems.map(ti => (ti.id === configurationRoot.id ? configurationRoot : ti));
|
163
|
-
}
|
164
|
-
const newState = {
|
165
|
-
...transactionContext,
|
166
|
-
salesTransaction: {
|
167
|
-
...transactionContext.salesTransaction,
|
168
|
-
salesTransactionItems,
|
169
|
-
},
|
170
|
-
};
|
171
|
-
if (standalone) {
|
172
|
-
const request = {
|
173
|
-
transactionContext: newState,
|
174
|
-
flowId: this.flowInfoService.flow.id,
|
175
|
-
};
|
176
|
-
return this.salesTransactionApiService.save(request).pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map(() => r))), map(id => ({ id })));
|
177
|
-
}
|
178
|
-
return this.flowConfigurationService.calculate$(newState).pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map(() => ({ id: '' })));
|
179
|
-
}
|
180
|
-
cancelConfiguration() {
|
181
|
-
if (!this.isInitialized$.value) {
|
182
|
-
return of(undefined);
|
183
|
-
}
|
184
|
-
this.canceledConfiguration$.next();
|
185
|
-
this.canceledConfiguration$.complete();
|
186
|
-
this.subscriptions = {};
|
187
|
-
this.isInitialized$.next(false);
|
188
|
-
if (!this.isInitialized$.value || !this.isStatefulConfiguration) {
|
189
|
-
return of(undefined);
|
190
|
-
}
|
191
|
-
return this.flowStateApiService.cancelConfiguration(this.flowStateService.stateId ?? '', this.stateId ?? '');
|
192
|
-
}
|
193
|
-
get isStatefulConfiguration() {
|
194
|
-
return this.flowInfoService.flow?.properties.stateful ?? false;
|
195
|
-
}
|
196
|
-
initStateful$() {
|
197
|
-
this.ownerId = this.configurationRuntimeService.uiDefinitionContainer?.id ?? '';
|
198
|
-
const { productId, transactionItemId } = this.flowInfoService.context;
|
199
|
-
if (!productId || !this.flowStateService.stateId) {
|
200
|
-
return of(undefined);
|
201
|
-
}
|
202
|
-
const container = this.configurationRuntimeService.uiDefinitionContainer;
|
203
|
-
let request$;
|
204
|
-
if (!transactionItemId) {
|
205
|
-
request$ = this.pcmApiService.fetchPCMByProductId(productId).pipe(switchMap(pcm => {
|
206
|
-
return this.flowStateApiService.newConfiguration(this.flowStateService.stateId || '', {
|
207
|
-
transactionItem: generateTransactionItem(pcm, this.configurationService.state?.salesTransaction.id),
|
208
|
-
actionsOverride: container?.actions?.map(processor => ({ ...processor, ownerId: this.ownerId })),
|
209
|
-
selectorsOverride: container?.selectors?.map(processor => ({ ...processor, ownerId: this.ownerId })),
|
210
|
-
});
|
211
|
-
}));
|
212
|
-
}
|
213
|
-
else {
|
214
|
-
request$ = this.flowStateApiService.startConfiguration(this.flowStateService.stateId, {
|
215
|
-
transactionItemId,
|
216
|
-
actionsOverride: container?.actions?.map(processor => ({ ...processor, ownerId: this.ownerId })),
|
217
|
-
selectorsOverride: container?.selectors?.map(processor => ({ ...processor, ownerId: this.ownerId })),
|
218
|
-
});
|
219
|
-
}
|
220
|
-
return request$.pipe(map(r => {
|
221
|
-
this.stateId = r.stateId;
|
222
|
-
return undefined;
|
223
|
-
}));
|
224
|
-
}
|
225
|
-
execToRequest(exec) {
|
226
|
-
return {
|
227
|
-
actions: exec.actions?.map(action => ({
|
228
|
-
apiName: action.name,
|
229
|
-
ownerId: this.ownerId,
|
230
|
-
inputData: action.inputData ?? {},
|
231
|
-
})),
|
232
|
-
selectors: exec.selectors &&
|
233
|
-
Object.entries(exec.selectors).reduce((trunk, [key, selector]) => ({
|
234
|
-
...trunk,
|
235
|
-
[key]: { apiName: selector.name, ownerId: this.ownerId, inputData: selector.inputData ?? {} },
|
236
|
-
}), {}),
|
237
|
-
};
|
238
|
-
}
|
239
|
-
handleSelectorsResponse(selectors) {
|
240
|
-
Object.entries(selectors).forEach(([requestId, selectorResult]) => {
|
241
|
-
if (!selectorResult.success) {
|
242
|
-
this.toastService.add({ severity: ToastType.error, summary: selectorResult.errorMessage });
|
243
|
-
}
|
244
|
-
const subscription$ = this.subscriptions[requestId]?.data$;
|
245
|
-
if (subscription$) {
|
246
|
-
subscription$.next(selectorResult);
|
247
|
-
}
|
248
|
-
});
|
249
|
-
}
|
250
|
-
executeRequest$(req, forceSubscriptions) {
|
251
|
-
const fullRequest = cloneDeep(req);
|
252
|
-
if (fullRequest.actions?.length || forceSubscriptions) {
|
253
|
-
for (const subscription of Object.values(this.subscriptions)) {
|
254
|
-
fullRequest.selectors = assign(fullRequest.selectors, subscription.request.selectors);
|
255
|
-
}
|
256
|
-
}
|
257
|
-
let execution$;
|
258
|
-
if (this.isStatefulConfiguration) {
|
259
|
-
execution$ = this.executeStateful$(fullRequest);
|
260
|
-
}
|
261
|
-
else {
|
262
|
-
execution$ = this.executeStateless$(fullRequest);
|
263
|
-
}
|
264
|
-
return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
|
265
|
-
}
|
266
|
-
executeStateless$(request) {
|
267
|
-
this.executionInProgress$.next(true);
|
268
|
-
return this.configurationService.state$.pipe(first(), switchMap(state => {
|
269
|
-
// Apply actions and execute configuration/price call
|
270
|
-
// No need to run configuration if no actions in the request
|
271
|
-
if (!request.actions?.length) {
|
272
|
-
return of(undefined);
|
273
|
-
}
|
274
|
-
request.actions.forEach(action => {
|
275
|
-
state = this.executeActionScript(state, action) ?? state;
|
276
|
-
});
|
277
|
-
return this.configurationService.configure$(state);
|
278
|
-
}), map(() => {
|
279
|
-
// Run selectors and apply them to the state
|
280
|
-
const configurationState = this.configurationService.state;
|
281
|
-
if (!configurationState) {
|
282
|
-
return { stateId: '', selectors: {} };
|
283
|
-
}
|
284
|
-
return this.runStatelessSelectors(request, configurationState);
|
285
|
-
}), tap(() => this.executionInProgress$.next(false)), catchError(error => {
|
286
|
-
const configurationState = this.configurationService.previousState;
|
287
|
-
if (configurationState) {
|
288
|
-
const selectorsResult = this.runStatelessSelectors(request, configurationState);
|
289
|
-
this.handleSelectorsResponse(selectorsResult.selectors);
|
290
|
-
}
|
291
|
-
this.executionInProgress$.next(false);
|
292
|
-
if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
|
293
|
-
this.toastService.add({ severity: ToastType.error, summary: String(error) });
|
294
|
-
}
|
295
|
-
return throwError(() => error);
|
296
|
-
}));
|
297
|
-
}
|
298
|
-
initBufferedRequest$() {
|
299
|
-
return this.statefulRequestStream$.pipe(buffer(this.statefulRequestStream$.pipe(debounceTime(this.EXECUTION_BUFFER_TIME))), switchMap(requests => {
|
300
|
-
if (!this.flowStateService.stateId || !this.stateId) {
|
301
|
-
throw 'Stateful session is not initialized';
|
302
|
-
}
|
303
|
-
// merge buffered requests
|
304
|
-
const request = {
|
305
|
-
actions: requests.flatMap(({ actions }) => actions).filter(isDefined),
|
306
|
-
selectors: requests
|
307
|
-
.map(({ selectors }) => selectors)
|
308
|
-
.filter(isDefined)
|
309
|
-
.reduce((acc, selectorsMap) => Object.assign(acc, selectorsMap), {}),
|
310
|
-
};
|
311
|
-
this.executionInProgress$.next(true);
|
312
|
-
return this.flowStateApiService.executeConfiguration(this.flowStateService.stateId, this.stateId, request);
|
313
|
-
}), tap(({ stateId }) => (this.stateId = stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
314
|
-
this.executionInProgress$.next(false);
|
315
|
-
return throwError(() => e);
|
316
|
-
}));
|
317
|
-
}
|
318
|
-
executeStateful$(request) {
|
319
|
-
return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
|
320
|
-
// make sure stream switches to statefulExecutionRequest$ before pushing an execution request
|
321
|
-
combineLatest([
|
322
|
-
this.statefulExecutionRequest$,
|
323
|
-
of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
|
324
|
-
])), map(([response]) => response), take(1));
|
325
|
-
}
|
326
|
-
executeActionScript(request, processor) {
|
327
|
-
const { actions } = this.configurationRuntimeService.uiDefinitionContainer ?? {};
|
328
|
-
const configurationProcessor = actions?.find(action => action.apiName === processor.apiName);
|
329
|
-
if (!configurationProcessor?.script) {
|
330
|
-
throw `ConfigurationProcessor ${processor.apiName} not found`;
|
331
|
-
}
|
332
|
-
return this.executeProcessorScript(request, configurationProcessor, processor.inputData);
|
333
|
-
}
|
334
|
-
executeSelectorScript(request, processor) {
|
335
|
-
const { selectors } = this.configurationRuntimeService.uiDefinitionContainer ?? {};
|
336
|
-
const configurationProcessor = selectors?.find(selector => selector.apiName === processor.apiName);
|
337
|
-
if (!configurationProcessor?.script) {
|
338
|
-
throw `ConfigurationProcessor ${processor.apiName} not found`;
|
339
|
-
}
|
340
|
-
return this.executeProcessorScript(request, configurationProcessor, processor.inputData);
|
341
|
-
}
|
342
|
-
executeProcessorScript(request, configurationProcessor, inputData) {
|
343
|
-
let functionToExecute = this.executedFunctions[configurationProcessor.apiName];
|
344
|
-
if (!functionToExecute) {
|
345
|
-
const script = `${configurationProcessor.script}\nreturn transform;`;
|
346
|
-
const sourceMap = `\n//# sourceURL=${configurationProcessor.apiName}.js`;
|
347
|
-
functionToExecute = new Function(script + sourceMap)();
|
348
|
-
this.executedFunctions[configurationProcessor.apiName] = functionToExecute;
|
349
|
-
}
|
350
|
-
return functionToExecute({
|
351
|
-
request,
|
352
|
-
inputData,
|
353
|
-
flowStore: this.flowStateService.getFlowStore(),
|
354
|
-
configurationStore: this.configurationStore,
|
355
|
-
});
|
356
|
-
}
|
357
|
-
runStatelessSelectors(request, configurationState) {
|
358
|
-
return EntityUtil.entries(request.selectors ?? {}).reduce((result, [key, selector]) => {
|
359
|
-
try {
|
360
|
-
result.selectors[key] = {
|
361
|
-
success: true,
|
362
|
-
result: this.executeSelectorScript(configurationState, selector),
|
363
|
-
};
|
364
|
-
}
|
365
|
-
catch (e) {
|
366
|
-
console.error(e);
|
367
|
-
result.selectors[key] = {
|
368
|
-
success: false,
|
369
|
-
errorMessage: String(e),
|
370
|
-
};
|
371
|
-
}
|
372
|
-
return result;
|
373
|
-
}, { stateId: '', selectors: {} });
|
374
|
-
}
|
375
|
-
}
|
376
|
-
ConfigurationStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, deps: [{ token: i1.ConfigurationRuntimeService }, { token: i2.ConfigurationService }, { token: i3.FlowStateService }, { token: i3.FlowInfoService }, { token: i4.FlowConfigurationService }, { token: i5.FlowStateApiService }, { token: i3.SalesTransactionService }, { token: i6.SalesTransactionApiService }, { token: i7.ToastService }, { token: i6.PCMApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
377
|
-
ConfigurationStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService });
|
378
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, decorators: [{
|
379
|
-
type: Injectable
|
380
|
-
}], ctorParameters: function () { return [{ type: i1.ConfigurationRuntimeService }, { type: i2.ConfigurationService }, { type: i3.FlowStateService }, { type: i3.FlowInfoService }, { type: i4.FlowConfigurationService }, { type: i5.FlowStateApiService }, { type: i3.SalesTransactionService }, { type: i6.SalesTransactionApiService }, { type: i7.ToastService }, { type: i6.PCMApiService }]; } });
|
381
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9zZGsvY29yZS9tb2R1bGVzL2NvbmZpZ3VyYXRpb24vc2VydmljZXMvY29uZmlndXJhdGlvbi1zdGF0ZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEQsT0FBTyxFQUNMLGFBQWEsRUFDYiwwQkFBMEIsR0FHM0IsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pFLE9BQU8sRUFHTCxVQUFVLEVBTVYsU0FBUyxFQUdULElBQUksR0FDTCxNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFjLE1BQU0sUUFBUSxDQUFDO0FBQ3ZELE9BQU8sRUFDTCxlQUFlLEVBQ2YsTUFBTSxFQUNOLFVBQVUsRUFDVixhQUFhLEVBQ2IsWUFBWSxFQUNaLG9CQUFvQixFQUNwQixNQUFNLEVBQ04sUUFBUSxFQUNSLEtBQUssRUFDTCxHQUFHLEVBRUgsRUFBRSxFQUNGLEtBQUssRUFDTCxXQUFXLEVBQ1gsT0FBTyxFQUNQLFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsRUFDSCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFL0YsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEUsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUUs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QUNULFNBQVMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxFQUFFO1lBQy9DLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0I7U0FDNUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHFCQUFxQixDQUMzQixPQUFxQyxFQUNyQyxrQkFBc0M7UUFFdEMsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUN2RCxDQUFDLE1BQWdDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUNwRCxJQUFJO2dCQUNGLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUc7b0JBQ3RCLE9BQU8sRUFBRSxJQUFJO29CQUNiLE1BQU0sRUFBRSxJQUFJLENBQUMscUJBQXFCLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDO2lCQUNqRSxDQUFDO2FBQ0g7WUFBQyxPQUFPLENBQUMsRUFBRTtnQkFDVixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqQixNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHO29CQUN0QixPQUFPLEVBQUUsS0FBSztvQkFDZCxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztpQkFDeEIsQ0FBQzthQUNIO1lBRUQsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxFQUNELEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQy9CLENBQUM7SUFDSixDQUFDOztzSEFqZlUseUJBQXlCOzBIQUF6Qix5QkFBeUI7MkZBQXpCLHlCQUF5QjtrQkFEckMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZsb3dTdGF0ZUFwaVNlcnZpY2UgfSBmcm9tICdAdmVsb2NlYXBwcy9hcGknO1xuaW1wb3J0IHtcbiAgUENNQXBpU2VydmljZSxcbiAgU2FsZXNUcmFuc2FjdGlvbkFwaVNlcnZpY2UsXG4gIFNhbGVzVHJhbnNhY3Rpb25VcHNlcnRSZXF1ZXN0LFxuICBTYWxlc1RyYW5zYWN0aW9uVXBzZXJ0UmVzcG9uc2UsXG59IGZyb20gJ0B2ZWxvY2VhcHBzL2FwaS92Mic7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UsIFRvYXN0VHlwZSB9IGZyb20gJ0B2ZWxvY2VhcHBzL2NvbXBvbmVudHMnO1xuaW1wb3J0IHtcbiAgQ29uZmlndXJhdGlvblByb2Nlc3NvcixcbiAgQ29uZmlndXJhdGlvblByb2Nlc3NvclNjcmlwdEZuLFxuICBFbnRpdHlVdGlsLFxuICBGbG93U3RhdGVFeGVjdXRhYmxlRFRPLFxuICBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0LFxuICBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPLFxuICBGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQsXG4gIEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2UsXG4gIGlzRGVmaW5lZCxcbiAgU2FsZXNUcmFuc2FjdGlvbkl0ZW0sXG4gIFRyYW5zYWN0aW9uQ29udGV4dCxcbiAgVVVJRCxcbn0gZnJvbSAnQHZlbG9jZWFwcHMvY29yZSc7XG5pbXBvcnQgeyBhc3NpZ24sIGNsb25lRGVlcCwgRGljdGlvbmFyeSB9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGJ1ZmZlcixcbiAgY2F0Y2hFcnJvcixcbiAgY29tYmluZUxhdGVzdCxcbiAgZGVib3VuY2VUaW1lLFxuICBkaXN0aW5jdFVudGlsQ2hhbmdlZCxcbiAgZmlsdGVyLFxuICBmaW5hbGl6ZSxcbiAgZmlyc3QsXG4gIG1hcCxcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHNoYXJlLFxuICBzaGFyZVJlcGxheSxcbiAgU3ViamVjdCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YWtlVW50aWwsXG4gIHRhcCxcbiAgdGhyb3dFcnJvcixcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGbG93SW5mb1NlcnZpY2UsIEZsb3dTdGF0ZVNlcnZpY2UsIFNhbGVzVHJhbnNhY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMnO1xuaW1wb3J0IHsgRmxvd1N0YXRlU3Vic2NyaXB0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL3R5cGVzL2Zsb3ctc3RhdGUudHlwZXMnO1xuaW1wb3J0IHsgRmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZmxvdy1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25SdW50aW1lU2VydmljZSB9IGZyb20gJy4vY29uZmlndXJhdGlvbi1ydW50aW1lLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuL2NvbmZpZ3VyYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBnZW5lcmF0ZVRyYW5zYWN0aW9uSXRlbSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzJztcblxudHlwZSBTdGF0ZVN1YnNjcmlwdGlvbiA9IHtcbiAgcmVxdWVzdDogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdERUTztcbiAgZGF0YSQ6IEJlaGF2aW9yU3ViamVjdDx1bmtub3duPjtcbn07XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb25maWd1cmF0aW9uU3RhdGVTZXJ2aWNlIHtcbiAgcHVibGljIGlzSW5pdGlhbGl6ZWQkOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIGNhbmNlbGVkQ29uZmlndXJhdGlvbiQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgTk9UX0lOSVRJQUxJWkVEID0gU3ltYm9sKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgRVhFQ1VUSU9OX0JVRkZFUl9USU1FID0gMTAwO1xuXG4gIHByaXZhdGUgZXhlY3V0ZWRGdW5jdGlvbnM6IERpY3Rpb25hcnk8Q29uZmlndXJhdGlvblByb2Nlc3NvclNjcmlwdEZuPiA9IHt9O1xuICBwcml2YXRlIHN0YXRlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG93bmVySWQgPSAnJztcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBTdGF0ZVN1YnNjcmlwdGlvbj4gPSB7fTtcbiAgcHJpdmF0ZSBjb25maWd1cmF0aW9uU3RvcmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgcHJpdmF0ZSBleGVjdXRpb25JblByb2dyZXNzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICBwcml2YXRlIHN0YXRlZnVsUmVxdWVzdFN0cmVhbSQgPSBuZXcgU3ViamVjdDxGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPPigpO1xuICBwcml2YXRlIHN0YXRlZnVsRXhlY3V0aW9uUmVxdWVzdCQ6IE9ic2VydmFibGU8Rmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0PjtcbiAgcHJpdmF0ZSBzdGF0ZWxlc3NFeGVjdXRpb25SZXF1ZXN0JDogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2U6IENvbmZpZ3VyYXRpb25SdW50aW1lU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ3VyYXRpb25TZXJ2aWNlOiBDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGZsb3dTdGF0ZVNlcnZpY2U6IEZsb3dTdGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmbG93SW5mb1NlcnZpY2U6IEZsb3dJbmZvU2VydmljZSxcbiAgICBwcml2YXRlIGZsb3dDb25maWd1cmF0aW9uU2VydmljZTogRmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgZmxvd1N0YXRlQXBpU2VydmljZTogRmxvd1N0YXRlQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHNhbGVzVHJhbnNhY3Rpb25TZXJ2aWNlOiBTYWxlc1RyYW5zYWN0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIHNhbGVzVHJhbnNhY3Rpb25BcGlTZXJ2aWNlOiBTYWxlc1RyYW5zYWN0aW9uQXBpU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcGNtQXBpU2VydmljZTogUENNQXBpU2VydmljZSxcbiAgKSB7XG4gICAgdGhpcy5zdGF0ZWZ1bEV4ZWN1dGlvblJlcXVlc3QkID0gdGhpcy5pbml0QnVmZmVyZWRSZXF1ZXN0JCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0V4ZWN1dGlvbkluUHJvZ3Jlc3MkKCkge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGlvbkluUHJvZ3Jlc3MkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGluaXQkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGxldCByZXF1ZXN0JDtcbiAgICBpZiAodGhpcy5mbG93U3RhdGVTZXJ2aWNlLnN0YXRlSWQgJiYgdGhpcy5pc1N0YXRlZnVsQ29uZmlndXJhdGlvbikge1xuICAgICAgcmVxdWVzdCQgPSB0aGlzLmluaXRTdGF0ZWZ1bCQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVxdWVzdCQgPSB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLmluaXQkKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3QkLnBpcGUoXG4gICAgICB0YWtlKDEpLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0luaXRpYWxpemVkJC5uZXh0KHRydWUpO1xuICAgICAgICB0aGlzLmNhbmNlbGVkQ29uZmlndXJhdGlvbiQgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhbnVwKCk6IHZvaWQge1xuICAgIE9iamVjdC52YWx1ZXModGhpcy5zdWJzY3JpcHRpb25zKS5mb3JFYWNoKCh7IGRhdGEkIH0pID0+IGRhdGEkLmNvbXBsZXRlKCkpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucyA9IHt9O1xuXG4gICAgaWYgKHRoaXMuc3RhdGVJZCkge1xuICAgICAgdGhpcy5jYW5jZWxDb25maWd1cmF0aW9uKCk7XG4gICAgfVxuXG4gICAgdGhpcy5jb25maWd1cmF0aW9uU3RvcmUgPSB7fTtcbiAgICB0aGlzLmV4ZWN1dGVkRnVuY3Rpb25zID0ge307XG4gICAgdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5yZXNldCgpO1xuICAgIHRoaXMuY29uZmlndXJhdGlvblJ1bnRpbWVTZXJ2aWNlLnJlc2V0KCk7XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZSQoZXhlYzogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdCk6IE9ic2VydmFibGU8Rmxvd1N0YXRlRXhlY3V0aW9uUmVzdWx0WydzZWxlY3RvcnMnXT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmV4ZWNUb1JlcXVlc3QoZXhlYyk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmVxdWVzdCQocmVxdWVzdCkucGlwZShcbiAgICAgIG1hcChyZXN1bHQgPT4ge1xuICAgICAgICAvLyBLZWVwIG9ubHkgcmVxdWVzdGVkIHJlc3VsdHNcbiAgICAgICAgY29uc3QgYWN0dWFsU2VsZWN0b3JzID0gT2JqZWN0LmVudHJpZXMocmVzdWx0LnNlbGVjdG9ycykucmVkdWNlKFxuICAgICAgICAgICh0cnVuazogUmVjb3JkPHN0cmluZywgRmxvd1N0YXRlU2VsZWN0b3JSZXNwb25zZT4sIFtyZXF1ZXN0SWQsIHJlc3VsdF0pID0+IHtcbiAgICAgICAgICAgIGlmIChleGVjLnNlbGVjdG9ycz8uW3JlcXVlc3RJZF0pIHtcbiAgICAgICAgICAgICAgdHJ1bmtbcmVxdWVzdElkXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVuaztcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9LFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBhY3R1YWxTZWxlY3RvcnM7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGRpc3BhdGNoJChhY3Rpb25OYW1lOiBzdHJpbmcsIGlucHV0RGF0YTogdW5rbm93biA9IHt9KTogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBleGVjOiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0ID0ge1xuICAgICAgYWN0aW9uczogW3sgbmFtZTogYWN0aW9uTmFtZSwgaW5wdXREYXRhIH1dLFxuICAgIH07XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZXhlY1RvUmVxdWVzdChleGVjKTtcblxuICAgIGNvbnN0IGV4ZWN1dGlvblJlcXVlc3QkID0gdGhpcy5leGVjdXRlUmVxdWVzdCQocmVxdWVzdCk7XG5cbiAgICBpZiAodGhpcy5pc1N0YXRlZnVsQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIGV4ZWN1dGlvblJlcXVlc3QkO1xuICAgIH1cblxuICAgIC8vIHByZXZlbnQgcGFyYWxsZWwgY29uZmlndXJhdGlvbiByZXF1ZXN0cyBpbiBzdGF0ZWxlc3MgbW9kZVxuICAgIGlmICghdGhpcy5zdGF0ZWxlc3NFeGVjdXRpb25SZXF1ZXN0JCkge1xuICAgICAgdGhpcy5zdGF0ZWxlc3NFeGVjdXRpb25SZXF1ZXN0JCA9IGV4ZWN1dGlvblJlcXVlc3QkLnBpcGUoXG4gICAgICAgIHNoYXJlUmVwbGF5KCksXG4gICAgICAgIHRha2UoMSksXG4gICAgICAgIGZpbmFsaXplKCgpID0+ICh0aGlzLnN0YXRlbGVzc0V4ZWN1dGlvblJlcXVlc3QkID0gbnVsbCkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhdGVsZXNzRXhlY3V0aW9uUmVxdWVzdCQ7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0JDxSZXNwb25zZSA9IHVua25vd24+KFxuICAgIHNlbGVjdG9yTmFtZTogc3RyaW5nLFxuICAgIGlucHV0RGF0YTogdW5rbm93biA9IHt9LFxuICApOiBPYnNlcnZhYmxlPEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2U8UmVzcG9uc2U+PiB7XG4gICAgY29uc3QgcmVxdWVzdElkID0gVVVJRC5VVUlEKCk7XG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuZXhlY1RvUmVxdWVzdCh7XG4gICAgICBzZWxlY3RvcnM6IHtcbiAgICAgICAgW3JlcXVlc3RJZF06IHtcbiAgICAgICAgICBuYW1lOiBzZWxlY3Rvck5hbWUsXG4gICAgICAgICAgaW5wdXREYXRhLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSZXF1ZXN0JChyZXF1ZXN0KS5waXBlKFxuICAgICAgbWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlLnNlbGVjdG9yc1tyZXF1ZXN0SWRdIGFzIEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2U8UmVzcG9uc2U+KSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHN1YnNjcmliZSQ8UmVzcG9uc2UgPSB1bmtub3duPihcbiAgICBzZWxlY3Rvck5hbWU6IHN0cmluZyxcbiAgICBpbnB1dERhdGE6IHVua25vd24gPSB7fSxcbiAgICBvcHRpb25zPzogRmxvd1N0YXRlU3Vic2NyaXB0aW9uT3B0aW9ucyxcbiAgKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVTZWxlY3RvclJlc3BvbnNlPFJlc3BvbnNlPj4ge1xuICAgIGNvbnN0IHJlcXVlc3RJZCA9IFVVSUQuVVVJRCgpO1xuXG4gICAgbGV0IHN1YnNjcmlwdGlvbiA9IHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdO1xuICAgIGlmICghc3Vic2NyaXB0aW9uKSB7XG4gICAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5leGVjVG9SZXF1ZXN0KHtcbiAgICAgICAgc2VsZWN0b3JzOiB7XG4gICAgICAgICAgW3JlcXVlc3RJZF06IHtcbiAgICAgICAgICAgIG5hbWU6IHNlbGVjdG9yTmFtZSxcbiAgICAgICAgICAgIGlucHV0RGF0YSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHN1YnNjcmlwdGlvbiA9IHtcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgZGF0YSQ6IG5ldyBCZWhhdmlvclN1YmplY3Q8dW5rbm93bj4odGhpcy5OT1RfSU5JVElBTElaRUQpLFxuICAgICAgfTtcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdID0gc3Vic2NyaXB0aW9uO1xuXG4gICAgICBpZiAoIW9wdGlvbnM/LmNvbGQpIHtcbiAgICAgICAgdGhpcy5leGVjdXRlUmVxdWVzdCQocmVxdWVzdCkuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1YnNjcmlwdGlvbi5kYXRhJC5waXBlKFxuICAgICAgZmlsdGVyKGRhdGEgPT4gZGF0YSAhPSB0aGlzLk5PVF9JTklUSUFMSVpFRCksXG4gICAgICBtYXAoZGF0YSA9PiBkYXRhIGFzIEZsb3dTdGF0ZVNlbGVjdG9yUmVzcG9uc2U8UmVzcG9uc2U+KSxcbiAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zdWJzY3JpcHRpb25zW3JlcXVlc3RJZF0/LmRhdGEkLm9ic2VydmVkKSB7XG4gICAgICAgICAgZGVsZXRlIHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHRha2VVbnRpbCh0aGlzLmNhbmNlbGVkQ29uZmlndXJhdGlvbiQpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUNvbmZpZ3VyYXRpb24oKTogT2JzZXJ2YWJsZTxTYWxlc1RyYW5zYWN0aW9uVXBzZXJ0UmVzcG9uc2U+IHtcbiAgICBpZiAodGhpcy5pc1N0YXRlZnVsQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMuZmxvd1N0YXRlQXBpU2VydmljZS5zYXZlQ29uZmlndXJhdGlvbih0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCA/PyAnJywgdGhpcy5zdGF0ZUlkID8/ICcnKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAociA9PiB0aGlzLmZsb3dTdGF0ZVNlcnZpY2UuZXhlY3V0ZVJlcXVlc3QkKHt9LCB0cnVlKS5waXBlKG1hcCgoKSA9PiByKSkpLFxuICAgICAgICBtYXAociA9PiAoeyBpZDogci5xdW90ZUlkIH0pKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnNhbGVzVHJhbnNhY3Rpb25TZXJ2aWNlLnN0YXRlO1xuICAgIGlmICghc3RhdGUpIHtcbiAgICAgIHJldHVybiBvZih7IGlkOiAnJyB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHN0YW5kYWxvbmUgfSA9IHRoaXMuZmxvd0luZm9TZXJ2aWNlLmZsb3cucHJvcGVydGllcztcbiAgICBjb25zdCB0cmFuc2FjdGlvbkNvbnRleHQgPSB0aGlzLnNhbGVzVHJhbnNhY3Rpb25TZXJ2aWNlLnN0YXRlO1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25Sb290ID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5yb290O1xuICAgIGlmICghdHJhbnNhY3Rpb25Db250ZXh0IHx8ICFjb25maWd1cmF0aW9uUm9vdCkge1xuICAgICAgcmV0dXJuIG9mKHsgaWQ6ICcnIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXRlSXRlbXMgPSB0cmFuc2FjdGlvbkNvbnRleHQuc2FsZXNUcmFuc2FjdGlvbi5zYWxlc1RyYW5zYWN0aW9uSXRlbXM7XG4gICAgY29uc3QgaXNOZXdUcmFuc2FjdGlvbkl0ZW0gPSBzdGF0ZUl0ZW1zLmV2ZXJ5KHRpID0+IHRpLmlkICE9PSBjb25maWd1cmF0aW9uUm9vdC5pZCk7XG5cbiAgICBsZXQgc2FsZXNUcmFuc2FjdGlvbkl0ZW1zOiBTYWxlc1RyYW5zYWN0aW9uSXRlbVtdO1xuICAgIGlmIChpc05ld1RyYW5zYWN0aW9uSXRlbSkge1xuICAgICAgc2FsZXNUcmFuc2FjdGlvbkl0ZW1zID0gWy4uLnN0YXRlSXRlbXMsIGNvbmZpZ3VyYXRpb25Sb290XTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2FsZXNUcmFuc2FjdGlvbkl0ZW1zID0gc3RhdGVJdGVtcy5tYXAodGkgPT4gKHRpLmlkID09PSBjb25maWd1cmF0aW9uUm9vdC5pZCA/IGNvbmZpZ3VyYXRpb25Sb290IDogdGkpKTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdTdGF0ZTogVHJhbnNhY3Rpb25Db250ZXh0ID0ge1xuICAgICAgLi4udHJhbnNhY3Rpb25Db250ZXh0LFxuICAgICAgc2FsZXNUcmFuc2FjdGlvbjoge1xuICAgICAgICAuLi50cmFuc2FjdGlvbkNvbnRleHQuc2FsZXNUcmFuc2FjdGlvbixcbiAgICAgICAgc2FsZXNUcmFuc2FjdGlvbkl0ZW1zLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgaWYgKHN0YW5kYWxvbmUpIHtcbiAgICAgIGNvbnN0IHJlcXVlc3Q6IFNhbGVzVHJhbnNhY3Rpb25VcHNlcnRSZXF1ZXN0ID0ge1xuICAgICAgICB0cmFuc2FjdGlvbkNvbnRleHQ6IG5ld1N0YXRlLFxuICAgICAgICBmbG93SWQ6IHRoaXMuZmxvd0luZm9TZXJ2aWNlLmZsb3cuaWQsXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcy5zYWxlc1RyYW5zYWN0aW9uQXBpU2VydmljZS5zYXZlKHJlcXVlc3QpLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcChyID0+IHRoaXMuZmxvd1N0YXRlU2VydmljZS5leGVjdXRlUmVxdWVzdCQoe30sIHRydWUpLnBpcGUobWFwKCgpID0+IHIpKSksXG4gICAgICAgIG1hcChpZCA9PiAoeyBpZCB9KSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZsb3dDb25maWd1cmF0aW9uU2VydmljZS5jYWxjdWxhdGUkKG5ld1N0YXRlKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZmxvd1N0YXRlU2VydmljZS5leGVjdXRlUmVxdWVzdCQoe30sIHRydWUpKSxcbiAgICAgIG1hcCgoKSA9PiAoeyBpZDogJycgfSkpLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2FuY2VsQ29uZmlndXJhdGlvbigpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXplZCQudmFsdWUpIHtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIHRoaXMuY2FuY2VsZWRDb25maWd1cmF0aW9uJC5uZXh0KCk7XG4gICAgdGhpcy5jYW5jZWxlZENvbmZpZ3VyYXRpb24kLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0ge307XG5cbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQkLm5leHQoZmFsc2UpO1xuICAgIGlmICghdGhpcy5pc0luaXRpYWxpemVkJC52YWx1ZSB8fCAhdGhpcy5pc1N0YXRlZnVsQ29uZmlndXJhdGlvbikge1xuICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZsb3dTdGF0ZUFwaVNlcnZpY2UuY2FuY2VsQ29uZmlndXJhdGlvbih0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCA/PyAnJywgdGhpcy5zdGF0ZUlkID8/ICcnKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGlzU3RhdGVmdWxDb25maWd1cmF0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmZsb3dJbmZvU2VydmljZS5mbG93Py5wcm9wZXJ0aWVzLnN0YXRlZnVsID8/IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0U3RhdGVmdWwkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHRoaXMub3duZXJJZCA9IHRoaXMuY29uZmlndXJhdGlvblJ1bnRpbWVTZXJ2aWNlLnVpRGVmaW5pdGlvbkNvbnRhaW5lcj8uaWQgPz8gJyc7XG4gICAgY29uc3QgeyBwcm9kdWN0SWQsIHRyYW5zYWN0aW9uSXRlbUlkIH0gPSB0aGlzLmZsb3dJbmZvU2VydmljZS5jb250ZXh0O1xuICAgIGlmICghcHJvZHVjdElkIHx8ICF0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCkge1xuICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2UudWlEZWZpbml0aW9uQ29udGFpbmVyO1xuXG4gICAgbGV0IHJlcXVlc3QkOiBPYnNlcnZhYmxlPEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdD47XG5cbiAgICBpZiAoIXRyYW5zYWN0aW9uSXRlbUlkKSB7XG4gICAgICByZXF1ZXN0JCA9IHRoaXMucGNtQXBpU2VydmljZS5mZXRjaFBDTUJ5UHJvZHVjdElkKHByb2R1Y3RJZCkucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKHBjbSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmxvd1N0YXRlQXBpU2VydmljZS5uZXdDb25maWd1cmF0aW9uKHRoaXMuZmxvd1N0YXRlU2VydmljZS5zdGF0ZUlkIHx8ICcnLCB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbkl0ZW06IGdlbmVyYXRlVHJhbnNhY3Rpb25JdGVtKHBjbSwgdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5zdGF0ZT8uc2FsZXNUcmFuc2FjdGlvbi5pZCksXG4gICAgICAgICAgICBhY3Rpb25zT3ZlcnJpZGU6IGNvbnRhaW5lcj8uYWN0aW9ucz8ubWFwKHByb2Nlc3NvciA9PiAoeyAuLi5wcm9jZXNzb3IsIG93bmVySWQ6IHRoaXMub3duZXJJZCB9KSksXG4gICAgICAgICAgICBzZWxlY3RvcnNPdmVycmlkZTogY29udGFpbmVyPy5zZWxlY3RvcnM/Lm1hcChwcm9jZXNzb3IgPT4gKHsgLi4ucHJvY2Vzc29yLCBvd25lcklkOiB0aGlzLm93bmVySWQgfSkpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcXVlc3QkID0gdGhpcy5mbG93U3RhdGVBcGlTZXJ2aWNlLnN0YXJ0Q29uZmlndXJhdGlvbih0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCwge1xuICAgICAgICB0cmFuc2FjdGlvbkl0ZW1JZCxcbiAgICAgICAgYWN0aW9uc092ZXJyaWRlOiBjb250YWluZXI/LmFjdGlvbnM/Lm1hcChwcm9jZXNzb3IgPT4gKHsgLi4ucHJvY2Vzc29yLCBvd25lcklkOiB0aGlzLm93bmVySWQgfSkpLFxuICAgICAgICBzZWxlY3RvcnNPdmVycmlkZTogY29udGFpbmVyPy5zZWxlY3RvcnM/Lm1hcChwcm9jZXNzb3IgPT4gKHsgLi4ucHJvY2Vzc29yLCBvd25lcklkOiB0aGlzLm93bmVySWQgfSkpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3QkLnBpcGUoXG4gICAgICBtYXAociA9PiB7XG4gICAgICAgIHRoaXMuc3RhdGVJZCA9IHIuc3RhdGVJZDtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWNUb1JlcXVlc3QoZXhlYzogRmxvd1N0YXRlRXhlY3V0aW9uUmVxdWVzdCk6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8ge1xuICAgIHJldHVybiB7XG4gICAgICBhY3Rpb25zOiBleGVjLmFjdGlvbnM/Lm1hcChhY3Rpb24gPT4gKHtcbiAgICAgICAgYXBpTmFtZTogYWN0aW9uLm5hbWUsXG4gICAgICAgIG93bmVySWQ6IHRoaXMub3duZXJJZCxcbiAgICAgICAgaW5wdXREYXRhOiBhY3Rpb24uaW5wdXREYXRhID8/IHt9LFxuICAgICAgfSkpLFxuICAgICAgc2VsZWN0b3JzOlxuICAgICAgICBleGVjLnNlbGVjdG9ycyAmJlxuICAgICAgICBPYmplY3QuZW50cmllcyhleGVjLnNlbGVjdG9ycykucmVkdWNlKFxuICAgICAgICAgICh0cnVuazogUmVjb3JkPHN0cmluZywgRmxvd1N0YXRlRXhlY3V0YWJsZURUTz4sIFtrZXksIHNlbGVjdG9yXSkgPT4gKHtcbiAgICAgICAgICAgIC4uLnRydW5rLFxuICAgICAgICAgICAgW2tleV06IHsgYXBpTmFtZTogc2VsZWN0b3IubmFtZSwgb3duZXJJZDogdGhpcy5vd25lcklkLCBpbnB1dERhdGE6IHNlbGVjdG9yLmlucHV0RGF0YSA/PyB7fSB9LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHt9LFxuICAgICAgICApLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVNlbGVjdG9yc1Jlc3BvbnNlKHNlbGVjdG9yczogUmVjb3JkPHN0cmluZywgRmxvd1N0YXRlU2VsZWN0b3JSZXNwb25zZTx1bmtub3duPj4pOiB2b2lkIHtcbiAgICBPYmplY3QuZW50cmllcyhzZWxlY3RvcnMpLmZvckVhY2goKFtyZXF1ZXN0SWQsIHNlbGVjdG9yUmVzdWx0XSkgPT4ge1xuICAgICAgaWYgKCFzZWxlY3RvclJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiBUb2FzdFR5cGUuZXJyb3IsIHN1bW1hcnk6IHNlbGVjdG9yUmVzdWx0LmVycm9yTWVzc2FnZSB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uJCA9IHRoaXMuc3Vic2NyaXB0aW9uc1tyZXF1ZXN0SWRdPy5kYXRhJDtcbiAgICAgIGlmIChzdWJzY3JpcHRpb24kKSB7XG4gICAgICAgIHN1YnNjcmlwdGlvbiQubmV4dChzZWxlY3RvclJlc3VsdCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVSZXF1ZXN0JChcbiAgICByZXE6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8sXG4gICAgZm9yY2VTdWJzY3JpcHRpb25zPzogYm9vbGVhbixcbiAgKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+IHtcbiAgICBjb25zdCBmdWxsUmVxdWVzdCA9IGNsb25lRGVlcChyZXEpO1xuICAgIGlmIChmdWxsUmVxdWVzdC5hY3Rpb25zPy5sZW5ndGggfHwgZm9yY2VTdWJzY3JpcHRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IHN1YnNjcmlwdGlvbiBvZiBPYmplY3QudmFsdWVzKHRoaXMuc3Vic2NyaXB0aW9ucykpIHtcbiAgICAgICAgZnVsbFJlcXVlc3Quc2VsZWN0b3JzID0gYXNzaWduKGZ1bGxSZXF1ZXN0LnNlbGVjdG9ycywgc3Vic2NyaXB0aW9uLnJlcXVlc3Quc2VsZWN0b3JzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgZXhlY3V0aW9uJDtcblxuICAgIGlmICh0aGlzLmlzU3RhdGVmdWxDb25maWd1cmF0aW9uKSB7XG4gICAgICBleGVjdXRpb24kID0gdGhpcy5leGVjdXRlU3RhdGVmdWwkKGZ1bGxSZXF1ZXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXhlY3V0aW9uJCA9IHRoaXMuZXhlY3V0ZVN0YXRlbGVzcyQoZnVsbFJlcXVlc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBleGVjdXRpb24kLnBpcGUodGFwKHJlc3VsdCA9PiB0aGlzLmhhbmRsZVNlbGVjdG9yc1Jlc3BvbnNlKHJlc3VsdC5zZWxlY3RvcnMpKSk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVTdGF0ZWxlc3MkKHJlcXVlc3Q6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8pOiBPYnNlcnZhYmxlPEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdD4ge1xuICAgIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQubmV4dCh0cnVlKTtcblxuICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLnN0YXRlJC5waXBlKFxuICAgICAgZmlyc3QoKSxcbiAgICAgIHN3aXRjaE1hcChzdGF0ZSA9PiB7XG4gICAgICAgIC8vIEFwcGx5IGFjdGlvbnMgYW5kIGV4ZWN1dGUgY29uZmlndXJhdGlvbi9wcmljZSBjYWxsXG4gICAgICAgIC8vIE5vIG5lZWQgdG8gcnVuIGNvbmZpZ3VyYXRpb24gaWYgbm8gYWN0aW9ucyBpbiB0aGUgcmVxdWVzdFxuICAgICAgICBpZiAoIXJlcXVlc3QuYWN0aW9ucz8ubGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXF1ZXN0LmFjdGlvbnMuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgICAgIHN0YXRlID0gdGhpcy5leGVjdXRlQWN0aW9uU2NyaXB0KHN0YXRlLCBhY3Rpb24pID8/IHN0YXRlO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5jb25maWd1cmUkKHN0YXRlKTtcbiAgICAgIH0pLFxuICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgLy8gUnVuIHNlbGVjdG9ycyBhbmQgYXBwbHkgdGhlbSB0byB0aGUgc3RhdGVcbiAgICAgICAgY29uc3QgY29uZmlndXJhdGlvblN0YXRlID0gdGhpcy5jb25maWd1cmF0aW9uU2VydmljZS5zdGF0ZTtcbiAgICAgICAgaWYgKCFjb25maWd1cmF0aW9uU3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4geyBzdGF0ZUlkOiAnJywgc2VsZWN0b3JzOiB7fSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMucnVuU3RhdGVsZXNzU2VsZWN0b3JzKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25TdGF0ZSk7XG4gICAgICB9KSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmV4ZWN1dGlvbkluUHJvZ3Jlc3MkLm5leHQoZmFsc2UpKSxcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICBjb25zdCBjb25maWd1cmF0aW9uU3RhdGUgPSB0aGlzLmNvbmZpZ3VyYXRpb25TZXJ2aWNlLnByZXZpb3VzU3RhdGU7XG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uU3RhdGUpIHtcbiAgICAgICAgICBjb25zdCBzZWxlY3RvcnNSZXN1bHQgPSB0aGlzLnJ1blN0YXRlbGVzc1NlbGVjdG9ycyhyZXF1ZXN0LCBjb25maWd1cmF0aW9uU3RhdGUpO1xuICAgICAgICAgIHRoaXMuaGFuZGxlU2VsZWN0b3JzUmVzcG9uc2Uoc2VsZWN0b3JzUmVzdWx0LnNlbGVjdG9ycyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5leGVjdXRpb25JblByb2dyZXNzJC5uZXh0KGZhbHNlKTtcblxuICAgICAgICBpZiAoIXRoaXMuY29uZmlndXJhdGlvblJ1bnRpbWVTZXJ2aWNlLnVpRGVmaW5pdGlvblByb3BzLnN1cHByZXNzVG9hc3RNZXNzYWdlcykge1xuICAgICAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiBUb2FzdFR5cGUuZXJyb3IsIHN1bW1hcnk6IFN0cmluZyhlcnJvcikgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnJvcik7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0QnVmZmVyZWRSZXF1ZXN0JCgpIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZWZ1bFJlcXVlc3RTdHJlYW0kLnBpcGUoXG4gICAgICBidWZmZXIodGhpcy5zdGF0ZWZ1bFJlcXVlc3RTdHJlYW0kLnBpcGUoZGVib3VuY2VUaW1lKHRoaXMuRVhFQ1VUSU9OX0JVRkZFUl9USU1FKSkpLFxuICAgICAgc3dpdGNoTWFwKHJlcXVlc3RzID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLmZsb3dTdGF0ZVNlcnZpY2Uuc3RhdGVJZCB8fCAhdGhpcy5zdGF0ZUlkKSB7XG4gICAgICAgICAgdGhyb3cgJ1N0YXRlZnVsIHNlc3Npb24gaXMgbm90IGluaXRpYWxpemVkJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG1lcmdlIGJ1ZmZlcmVkIHJlcXVlc3RzXG4gICAgICAgIGNvbnN0IHJlcXVlc3Q6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlcXVlc3REVE8gPSB7XG4gICAgICAgICAgYWN0aW9uczogcmVxdWVzdHMuZmxhdE1hcCgoeyBhY3Rpb25zIH0pID0+IGFjdGlvbnMpLmZpbHRlcihpc0RlZmluZWQpLFxuICAgICAgICAgIHNlbGVjdG9yczogcmVxdWVzdHNcbiAgICAgICAgICAgIC5tYXAoKHsgc2VsZWN0b3JzIH0pID0+IHNlbGVjdG9ycylcbiAgICAgICAgICAgIC5maWx0ZXIoaXNEZWZpbmVkKVxuICAgICAgICAgICAgLnJlZHVjZSgoYWNjLCBzZWxlY3RvcnNNYXApID0+IE9iamVjdC5hc3NpZ24oYWNjLCBzZWxlY3RvcnNNYXApLCB7fSksXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5leGVjdXRpb25JblByb2dyZXNzJC5uZXh0KHRydWUpO1xuICAgICAgICByZXR1cm4gdGhpcy5mbG93U3RhdGVBcGlTZXJ2aWNlLmV4ZWN1dGVDb25maWd1cmF0aW9uKHRoaXMuZmxvd1N0YXRlU2VydmljZS5zdGF0ZUlkLCB0aGlzLnN0YXRlSWQsIHJlcXVlc3QpO1xuICAgICAgfSksXG4gICAgICB0YXAoKHsgc3RhdGVJZCB9KSA9PiAodGhpcy5zdGF0ZUlkID0gc3RhdGVJZCkpLFxuICAgICAgc2hhcmUoKSxcbiAgICAgIHRhcCgoKSA9PiB0aGlzLmV4ZWN1dGlvbkluUHJvZ3Jlc3MkLm5leHQoZmFsc2UpKSxcbiAgICAgIGNhdGNoRXJyb3IoZSA9PiB7XG4gICAgICAgIHRoaXMuZXhlY3V0aW9uSW5Qcm9ncmVzcyQubmV4dChmYWxzZSk7XG4gICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGUpO1xuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZXhlY3V0ZVN0YXRlZnVsJChyZXF1ZXN0OiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPKTogT2JzZXJ2YWJsZTxGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRpb25JblByb2dyZXNzJC5waXBlKFxuICAgICAgZmlsdGVyKGluUHJvZ3Jlc3MgPT4gIWluUHJvZ3Jlc3MpLFxuICAgICAgdGFrZSgxKSxcbiAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAvLyBtYWtlIHN1cmUgc3RyZWFtIHN3aXRjaGVzIHRvIHN0YXRlZnVsRXhlY3V0aW9uUmVxdWVzdCQgYmVmb3JlIHB1c2hpbmcgYW4gZXhlY3V0aW9uIHJlcXVlc3RcbiAgICAgICAgY29tYmluZUxhdGVzdChbXG4gICAgICAgICAgdGhpcy5zdGF0ZWZ1bEV4ZWN1dGlvblJlcXVlc3QkLFxuICAgICAgICAgIG9mKHVuZGVmaW5lZCkucGlwZSh0YXAoKCkgPT4gdGhpcy5zdGF0ZWZ1bFJlcXVlc3RTdHJlYW0kLm5leHQocmVxdWVzdCkpKSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICAgbWFwKChbcmVzcG9uc2VdKSA9PiByZXNwb25zZSksXG4gICAgICB0YWtlKDEpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVBY3Rpb25TY3JpcHQocmVxdWVzdDogVHJhbnNhY3Rpb25Db250ZXh0LCBwcm9jZXNzb3I6IEZsb3dTdGF0ZUV4ZWN1dGFibGVEVE8pOiBUcmFuc2FjdGlvbkNvbnRleHQge1xuICAgIGNvbnN0IHsgYWN0aW9ucyB9ID0gdGhpcy5jb25maWd1cmF0aW9uUnVudGltZVNlcnZpY2UudWlEZWZpbml0aW9uQ29udGFpbmVyID8/IHt9O1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb25Qcm9jZXNzb3IgPSBhY3Rpb25zPy5maW5kKGFjdGlvbiA9PiBhY3Rpb24uYXBpTmFtZSA9PT0gcHJvY2Vzc29yLmFwaU5hbWUpO1xuXG4gICAgaWYgKCFjb25maWd1cmF0aW9uUHJvY2Vzc29yPy5zY3JpcHQpIHtcbiAgICAgIHRocm93IGBDb25maWd1cmF0aW9uUHJvY2Vzc29yICR7cHJvY2Vzc29yLmFwaU5hbWV9IG5vdCBmb3VuZGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVByb2Nlc3NvclNjcmlwdChyZXF1ZXN0LCBjb25maWd1cmF0aW9uUHJvY2Vzc29yLCBwcm9jZXNzb3IuaW5wdXREYXRhKSBhcyBUcmFuc2FjdGlvbkNvbnRleHQ7XG4gIH1cblxuICBwcml2YXRlIGV4ZWN1dGVTZWxlY3RvclNjcmlwdChyZXF1ZXN0OiBUcmFuc2FjdGlvbkNvbnRleHQsIHByb2Nlc3NvcjogRmxvd1N0YXRlRXhlY3V0YWJsZURUTyk6IHVua25vd24ge1xuICAgIGNvbnN0IHsgc2VsZWN0b3JzIH0gPSB0aGlzLmNvbmZpZ3VyYXRpb25SdW50aW1lU2VydmljZS51aURlZmluaXRpb25Db250YWluZXIgPz8ge307XG4gICAgY29uc3QgY29uZmlndXJhdGlvblByb2Nlc3NvciA9IHNlbGVjdG9ycz8uZmluZChzZWxlY3RvciA9PiBzZWxlY3Rvci5hcGlOYW1lID09PSBwcm9jZXNzb3IuYXBpTmFtZSk7XG5cbiAgICBpZiAoIWNvbmZpZ3VyYXRpb25Qcm9jZXNzb3I/LnNjcmlwdCkge1xuICAgICAgdGhyb3cgYENvbmZpZ3VyYXRpb25Qcm9jZXNzb3IgJHtwcm9jZXNzb3IuYXBpTmFtZX0gbm90IGZvdW5kYDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUHJvY2Vzc29yU2NyaXB0KHJlcXVlc3QsIGNvbmZpZ3VyYXRpb25Qcm9jZXNzb3IsIHByb2Nlc3Nvci5pbnB1dERhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBleGVjdXRlUHJvY2Vzc29yU2NyaXB0KFxuICAgIHJlcXVlc3Q6IFRyYW5zYWN0aW9uQ29udGV4dCxcbiAgICBjb25maWd1cmF0aW9uUHJvY2Vzc29yOiBDb25maWd1cmF0aW9uUHJvY2Vzc29yLFxuICAgIGlucHV0RGF0YTogdW5rbm93bixcbiAgKTogdW5rbm93biB7XG4gICAgbGV0IGZ1bmN0aW9uVG9FeGVjdXRlID0gdGhpcy5leGVjdXRlZEZ1bmN0aW9uc1tjb25maWd1cmF0aW9uUHJvY2Vzc29yLmFwaU5hbWVdO1xuICAgIGlmICghZnVuY3Rpb25Ub0V4ZWN1dGUpIHtcbiAgICAgIGNvbnN0IHNjcmlwdCA9IGAke2NvbmZpZ3VyYXRpb25Qcm9jZXNzb3Iuc2NyaXB0fVxcbnJldHVybiB0cmFuc2Zvcm07YDtcbiAgICAgIGNvbnN0IHNvdXJjZU1hcCA9IGBcXG4vLyMgc291cmNlVVJMPSR7Y29uZmlndXJhdGlvblByb2Nlc3Nvci5hcGlOYW1lfS5qc2A7XG4gICAgICBmdW5jdGlvblRvRXhlY3V0ZSA9IG5ldyBGdW5jdGlvbihzY3JpcHQgKyBzb3VyY2VNYXApKCkgYXMgQ29uZmlndXJhdGlvblByb2Nlc3NvclNjcmlwdEZuO1xuICAgICAgdGhpcy5leGVjdXRlZEZ1bmN0aW9uc1tjb25maWd1cmF0aW9uUHJvY2Vzc29yLmFwaU5hbWVdID0gZnVuY3Rpb25Ub0V4ZWN1dGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uVG9FeGVjdXRlKHtcbiAgICAgIHJlcXVlc3QsXG4gICAgICBpbnB1dERhdGEsXG4gICAgICBmbG93U3RvcmU6IHRoaXMuZmxvd1N0YXRlU2VydmljZS5nZXRGbG93U3RvcmUoKSxcbiAgICAgIGNvbmZpZ3VyYXRpb25TdG9yZTogdGhpcy5jb25maWd1cmF0aW9uU3RvcmUsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJ1blN0YXRlbGVzc1NlbGVjdG9ycyhcbiAgICByZXF1ZXN0OiBGbG93U3RhdGVFeGVjdXRpb25SZXF1ZXN0RFRPLFxuICAgIGNvbmZpZ3VyYXRpb25TdGF0ZTogVHJhbnNhY3Rpb25Db250ZXh0LFxuICApOiBGbG93U3RhdGVFeGVjdXRpb25SZXN1bHQge1xuICAgIHJldHVybiBFbnRpdHlVdGlsLmVudHJpZXMocmVxdWVzdC5zZWxlY3RvcnMgPz8ge30pLnJlZHVjZShcbiAgICAgIChyZXN1bHQ6IEZsb3dTdGF0ZUV4ZWN1dGlvblJlc3VsdCwgW2tleSwgc2VsZWN0b3JdKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmVzdWx0LnNlbGVjdG9yc1trZXldID0ge1xuICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgIHJlc3VsdDogdGhpcy5leGVjdXRlU2VsZWN0b3JTY3JpcHQoY29uZmlndXJhdGlvblN0YXRlLCBzZWxlY3RvciksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVzdWx0LnNlbGVjdG9yc1trZXldID0ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IFN0cmluZyhlKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0sXG4gICAgICB7IHN0YXRlSWQ6ICcnLCBzZWxlY3RvcnM6IHt9IH0sXG4gICAgKTtcbiAgfVxufVxuIl19
|