@pega/angular-sdk-components 0.23.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/_shared/styles.scss +28 -0
- package/esm2022/lib/_bridge/angular-pconnect.mjs +416 -0
- package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +114 -0
- package/esm2022/lib/_bridge/helpers/sdk-pega-component-map.mjs +228 -0
- package/esm2022/lib/_bridge/helpers/sdk_component_map.mjs +142 -0
- package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +50 -0
- package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +29 -0
- package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +31 -0
- package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +51 -0
- package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +80 -0
- package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +37 -0
- package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +31 -0
- package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +36 -0
- package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +25 -0
- package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +28 -0
- package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +42 -0
- package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +136 -0
- package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +33 -0
- package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +93 -0
- package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +18 -0
- package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +286 -0
- package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +98 -0
- package/esm2022/lib/_components/field/check-box/check-box.component.mjs +157 -0
- package/esm2022/lib/_components/field/currency/currency.component.mjs +160 -0
- package/esm2022/lib/_components/field/date/date.component.mjs +219 -0
- package/esm2022/lib/_components/field/date-time/date-time.component.mjs +200 -0
- package/esm2022/lib/_components/field/decimal/decimal.component.mjs +157 -0
- package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +197 -0
- package/esm2022/lib/_components/field/email/email.component.mjs +150 -0
- package/esm2022/lib/_components/field/integer/integer.component.mjs +155 -0
- package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +44 -0
- package/esm2022/lib/_components/field/percentage/percentage.component.mjs +155 -0
- package/esm2022/lib/_components/field/phone/phone.component.mjs +167 -0
- package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +189 -0
- package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +103 -0
- package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +95 -0
- package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +57 -0
- package/esm2022/lib/_components/field/text/text.component.mjs +138 -0
- package/esm2022/lib/_components/field/text-area/text-area.component.mjs +155 -0
- package/esm2022/lib/_components/field/text-content/text-content.component.mjs +69 -0
- package/esm2022/lib/_components/field/text-input/text-input.component.mjs +152 -0
- package/esm2022/lib/_components/field/time/time.component.mjs +151 -0
- package/esm2022/lib/_components/field/url/url.component.mjs +150 -0
- package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +175 -0
- package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +491 -0
- package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +68 -0
- package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +24 -0
- package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +314 -0
- package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +32 -0
- package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +219 -0
- package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +31 -0
- package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +387 -0
- package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +47 -0
- package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +88 -0
- package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +144 -0
- package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +18 -0
- package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +80 -0
- package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +132 -0
- package/esm2022/lib/_components/infra/reference/reference.component.mjs +133 -0
- package/esm2022/lib/_components/infra/region/region.component.mjs +33 -0
- package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +228 -0
- package/esm2022/lib/_components/infra/stages/stages.component.mjs +62 -0
- package/esm2022/lib/_components/infra/view/view.component.mjs +173 -0
- package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +140 -0
- package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +43 -0
- package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +72 -0
- package/esm2022/lib/_components/template/case-view/case-view.component.mjs +196 -0
- package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +68 -0
- package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +239 -0
- package/esm2022/lib/_components/template/default-form/default-form.component.mjs +61 -0
- package/esm2022/lib/_components/template/details/details.component.mjs +102 -0
- package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +72 -0
- package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +71 -0
- package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +66 -0
- package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +80 -0
- package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +77 -0
- package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +77 -0
- package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +65 -0
- package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +23 -0
- package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +134 -0
- package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +19 -0
- package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +22 -0
- package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +40 -0
- package/esm2022/lib/_components/template/list-page/list-page.component.mjs +14 -0
- package/esm2022/lib/_components/template/list-view/DefaultViewMeta.mjs +208 -0
- package/esm2022/lib/_components/template/list-view/list-view.component.mjs +1198 -0
- package/esm2022/lib/_components/template/list-view/listViewHelpers.mjs +61 -0
- package/esm2022/lib/_components/template/list-view/utils.mjs +660 -0
- package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +44 -0
- package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +30 -0
- package/esm2022/lib/_components/template/one-column/one-column.component.mjs +30 -0
- package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +16 -0
- package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +30 -0
- package/esm2022/lib/_components/template/page/page.component.mjs +52 -0
- package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +149 -0
- package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +139 -0
- package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +106 -0
- package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +270 -0
- package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +760 -0
- package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +131 -0
- package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +16 -0
- package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +67 -0
- package/esm2022/lib/_components/template/three-column/three-column.component.mjs +30 -0
- package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +16 -0
- package/esm2022/lib/_components/template/two-column/two-column.component.mjs +30 -0
- package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +40 -0
- package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +30 -0
- package/esm2022/lib/_components/template/utils.mjs +22 -0
- package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +30 -0
- package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +53 -0
- package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +135 -0
- package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +24 -0
- package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +588 -0
- package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +81 -0
- package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +525 -0
- package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +631 -0
- package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +57 -0
- package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +75 -0
- package/esm2022/lib/_components/widget/todo/todo.component.mjs +213 -0
- package/esm2022/lib/_components/widget/utility/utility.component.mjs +34 -0
- package/esm2022/lib/_directives/thousand-seperator.directive.mjs +28 -0
- package/esm2022/lib/_helpers/case-utils.mjs +71 -0
- package/esm2022/lib/_helpers/common.mjs +20 -0
- package/esm2022/lib/_helpers/currency-utils.mjs +57 -0
- package/esm2022/lib/_helpers/date-format-utils.mjs +68 -0
- package/esm2022/lib/_helpers/event-util.mjs +19 -0
- package/esm2022/lib/_helpers/field-group-utils.mjs +47 -0
- package/esm2022/lib/_helpers/filter-utils.mjs +106 -0
- package/esm2022/lib/_helpers/formatters/currency-map.mjs +903 -0
- package/esm2022/lib/_helpers/formatters/format-utils.mjs +68 -0
- package/esm2022/lib/_helpers/tab-utils.mjs +59 -0
- package/esm2022/lib/_helpers/template-utils.mjs +56 -0
- package/esm2022/lib/_helpers/utils.mjs +386 -0
- package/esm2022/lib/_helpers/versionHelpers.mjs +12 -0
- package/esm2022/lib/_messages/error-messages.service.mjs +31 -0
- package/esm2022/lib/_messages/get-login-status.service.mjs +26 -0
- package/esm2022/lib/_messages/oauth-response.service.mjs +30 -0
- package/esm2022/lib/_messages/progress-spinner.service.mjs +30 -0
- package/esm2022/lib/_messages/reset-pconnect.service.mjs +31 -0
- package/esm2022/lib/_messages/update-worklist.service.mjs +30 -0
- package/esm2022/lib/_services/case.service.mjs +32 -0
- package/esm2022/lib/_services/datapage.service.mjs +52 -0
- package/esm2022/lib/_services/endpoints.mjs +61 -0
- package/esm2022/lib/_services/server-config.service.mjs +52 -0
- package/esm2022/lib/_types/PConnProps.interface.mjs +2 -0
- package/esm2022/pega-angular-sdk-components.mjs +5 -0
- package/esm2022/public-api.mjs +138 -0
- package/esm2022/sdk-local-component-map.mjs +9 -0
- package/fesm2022/pega-angular-sdk-components.mjs +17380 -0
- package/fesm2022/pega-angular-sdk-components.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/_bridge/angular-pconnect.d.ts +140 -0
- package/lib/_bridge/component-mapper/component-mapper.component.d.ts +20 -0
- package/lib/_bridge/helpers/sdk-pega-component-map.d.ts +213 -0
- package/lib/_bridge/helpers/sdk_component_map.d.ts +3 -0
- package/lib/_components/designSystemExtension/alert/alert.component.d.ts +12 -0
- package/lib/_components/designSystemExtension/alert-banner/alert-banner.component.d.ts +13 -0
- package/lib/_components/designSystemExtension/banner/banner.component.d.ts +15 -0
- package/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.d.ts +20 -0
- package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +18 -0
- package/lib/_components/designSystemExtension/material-details/material-details.component.d.ts +15 -0
- package/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.d.ts +12 -0
- package/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.d.ts +15 -0
- package/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.d.ts +9 -0
- package/lib/_components/designSystemExtension/material-utility/material-utility.component.d.ts +16 -0
- package/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.d.ts +11 -0
- package/lib/_components/designSystemExtension/operator/operator.component.d.ts +25 -0
- package/lib/_components/designSystemExtension/pulse/pulse.component.d.ts +16 -0
- package/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.d.ts +23 -0
- package/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.d.ts +7 -0
- package/lib/_components/field/auto-complete/auto-complete.component.d.ts +74 -0
- package/lib/_components/field/cancel-alert/cancel-alert.component.d.ts +24 -0
- package/lib/_components/field/check-box/check-box.component.d.ts +48 -0
- package/lib/_components/field/currency/currency.component.d.ts +50 -0
- package/lib/_components/field/date/date.component.d.ts +65 -0
- package/lib/_components/field/date-time/date-time.component.d.ts +55 -0
- package/lib/_components/field/decimal/decimal.component.d.ts +46 -0
- package/lib/_components/field/dropdown/dropdown.component.d.ts +60 -0
- package/lib/_components/field/email/email.component.d.ts +44 -0
- package/lib/_components/field/integer/integer.component.d.ts +44 -0
- package/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.d.ts +15 -0
- package/lib/_components/field/percentage/percentage.component.d.ts +44 -0
- package/lib/_components/field/phone/phone.component.d.ts +48 -0
- package/lib/_components/field/radio-buttons/radio-buttons.component.d.ts +60 -0
- package/lib/_components/field/rich-text/rich-text.component.d.ts +42 -0
- package/lib/_components/field/scalar-list/scalar-list.component.d.ts +37 -0
- package/lib/_components/field/semantic-link/semantic-link.component.d.ts +30 -0
- package/lib/_components/field/text/text.component.d.ts +40 -0
- package/lib/_components/field/text-area/text-area.component.d.ts +45 -0
- package/lib/_components/field/text-content/text-content.component.d.ts +30 -0
- package/lib/_components/field/text-input/text-input.component.d.ts +45 -0
- package/lib/_components/field/time/time.component.d.ts +43 -0
- package/lib/_components/field/url/url.component.d.ts +43 -0
- package/lib/_components/field/user-reference/user-reference.component.d.ts +39 -0
- package/lib/_components/infra/Containers/flow-container/flow-container.component.d.ts +85 -0
- package/lib/_components/infra/Containers/flow-container/helpers.d.ts +2 -0
- package/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.d.ts +15 -0
- package/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.d.ts +71 -0
- package/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.d.ts +15 -0
- package/lib/_components/infra/Containers/view-container/view-container.component.d.ts +51 -0
- package/lib/_components/infra/action-buttons/action-buttons.component.d.ts +12 -0
- package/lib/_components/infra/assignment/assignment.component.d.ts +72 -0
- package/lib/_components/infra/assignment-card/assignment-card.component.d.ts +18 -0
- package/lib/_components/infra/dashboard-filter/dashboard-filter.component.d.ts +20 -0
- package/lib/_components/infra/defer-load/defer-load.component.d.ts +46 -0
- package/lib/_components/infra/error-boundary/error-boundary.component.d.ts +8 -0
- package/lib/_components/infra/multi-step/multi-step.component.d.ts +31 -0
- package/lib/_components/infra/navbar/navbar.component.d.ts +51 -0
- package/lib/_components/infra/reference/reference.component.d.ts +16 -0
- package/lib/_components/infra/region/region.component.d.ts +14 -0
- package/lib/_components/infra/root-container/root-container.component.d.ts +35 -0
- package/lib/_components/infra/stages/stages.component.d.ts +29 -0
- package/lib/_components/infra/view/view.component.d.ts +40 -0
- package/lib/_components/template/app-shell/app-shell.component.d.ts +55 -0
- package/lib/_components/template/banner-page/banner-page.component.d.ts +27 -0
- package/lib/_components/template/case-summary/case-summary.component.d.ts +34 -0
- package/lib/_components/template/case-view/case-view.component.d.ts +56 -0
- package/lib/_components/template/confirmation/confirmation.component.d.ts +38 -0
- package/lib/_components/template/data-reference/data-reference.component.d.ts +41 -0
- package/lib/_components/template/default-form/default-form.component.d.ts +21 -0
- package/lib/_components/template/details/details.component.d.ts +20 -0
- package/lib/_components/template/details-narrow-wide/details-narrow-wide.component.d.ts +21 -0
- package/lib/_components/template/details-one-column/details-one-column.component.d.ts +22 -0
- package/lib/_components/template/details-sub-tabs/details-sub-tabs.component.d.ts +24 -0
- package/lib/_components/template/details-three-column/details-three-column.component.d.ts +25 -0
- package/lib/_components/template/details-two-column/details-two-column.component.d.ts +25 -0
- package/lib/_components/template/details-wide-narrow/details-wide-narrow.component.d.ts +24 -0
- package/lib/_components/template/dynamic-tabs/dynamic-tabs.component.d.ts +20 -0
- package/lib/_components/template/field-group-list/field-group-list.component.d.ts +9 -0
- package/lib/_components/template/field-group-template/field-group-template.component.d.ts +52 -0
- package/lib/_components/template/field-value-list/field-value-list.component.d.ts +8 -0
- package/lib/_components/template/inline-dashboard/inline-dashboard.component.d.ts +16 -0
- package/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.d.ts +25 -0
- package/lib/_components/template/list-page/list-page.component.d.ts +7 -0
- package/lib/_components/template/list-view/DefaultViewMeta.d.ts +1 -0
- package/lib/_components/template/list-view/list-view.component.d.ts +157 -0
- package/lib/_components/template/list-view/listViewHelpers.d.ts +1 -0
- package/lib/_components/template/list-view/utils.d.ts +118 -0
- package/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.d.ts +25 -0
- package/lib/_components/template/narrow-wide-form/narrow-wide-form.component.d.ts +14 -0
- package/lib/_components/template/one-column/one-column.component.d.ts +14 -0
- package/lib/_components/template/one-column-page/one-column-page.component.d.ts +9 -0
- package/lib/_components/template/one-column-tab/one-column-tab.component.d.ts +14 -0
- package/lib/_components/template/page/page.component.d.ts +25 -0
- package/lib/_components/template/promoted-filters/promoted-filters.component.d.ts +35 -0
- package/lib/_components/template/repeating-structures/repeating-structures.component.d.ts +37 -0
- package/lib/_components/template/simple-table/simple-table.component.d.ts +43 -0
- package/lib/_components/template/simple-table-manual/helpers.d.ts +81 -0
- package/lib/_components/template/simple-table-manual/simple-table-manual.component.d.ts +159 -0
- package/lib/_components/template/simple-table-select/simple-table-select.component.d.ts +32 -0
- package/lib/_components/template/single-reference-readonly/single-reference-readonly.component.d.ts +9 -0
- package/lib/_components/template/sub-tabs/sub-tabs.component.d.ts +26 -0
- package/lib/_components/template/three-column/three-column.component.d.ts +14 -0
- package/lib/_components/template/three-column-page/three-column-page.component.d.ts +9 -0
- package/lib/_components/template/two-column/two-column.component.d.ts +14 -0
- package/lib/_components/template/two-column-page/two-column-page.component.d.ts +17 -0
- package/lib/_components/template/two-column-tab/two-column-tab.component.d.ts +14 -0
- package/lib/_components/template/utils.d.ts +2 -0
- package/lib/_components/template/wide-narrow-form/wide-narrow-form.component.d.ts +14 -0
- package/lib/_components/template/wide-narrow-page/wide-narrow-page.component.d.ts +20 -0
- package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +50 -0
- package/lib/_components/widget/app-announcement/app-announcement.component.d.ts +19 -0
- package/lib/_components/widget/attachment/attachment.component.d.ts +99 -0
- package/lib/_components/widget/case-history/case-history.component.d.ts +24 -0
- package/lib/_components/widget/feed-container/feed-container.component.d.ts +49 -0
- package/lib/_components/widget/file-utility/file-utility.component.d.ts +150 -0
- package/lib/_components/widget/list-utility/list-utility.component.d.ts +23 -0
- package/lib/_components/widget/quick-create/quick-create.component.d.ts +29 -0
- package/lib/_components/widget/todo/todo.component.d.ts +64 -0
- package/lib/_components/widget/utility/utility.component.d.ts +25 -0
- package/lib/_directives/thousand-seperator.directive.d.ts +9 -0
- package/lib/_helpers/case-utils.d.ts +19 -0
- package/lib/_helpers/common.d.ts +3 -0
- package/lib/_helpers/currency-utils.d.ts +10 -0
- package/lib/_helpers/date-format-utils.d.ts +12 -0
- package/lib/_helpers/event-util.d.ts +2 -0
- package/lib/_helpers/field-group-utils.d.ts +16 -0
- package/lib/_helpers/filter-utils.d.ts +46 -0
- package/lib/_helpers/formatters/currency-map.d.ts +1132 -0
- package/lib/_helpers/formatters/format-utils.d.ts +8 -0
- package/lib/_helpers/tab-utils.d.ts +4 -0
- package/lib/_helpers/template-utils.d.ts +16 -0
- package/lib/_helpers/utils.d.ts +32 -0
- package/lib/_helpers/versionHelpers.d.ts +8 -0
- package/lib/_messages/error-messages.service.d.ts +15 -0
- package/lib/_messages/get-login-status.service.d.ts +10 -0
- package/lib/_messages/oauth-response.service.d.ts +14 -0
- package/lib/_messages/progress-spinner.service.d.ts +14 -0
- package/lib/_messages/reset-pconnect.service.d.ts +15 -0
- package/lib/_messages/update-worklist.service.d.ts +14 -0
- package/lib/_services/case.service.d.ts +12 -0
- package/lib/_services/datapage.service.d.ts +14 -0
- package/lib/_services/endpoints.d.ts +39 -0
- package/lib/_services/server-config.service.d.ts +31 -0
- package/lib/_types/PConnProps.interface.d.ts +17 -0
- package/package.json +28 -0
- package/public-api.d.ts +133 -0
- package/sdk-local-component-map.d.ts +2 -0
- package/sdk-local-component-map.ts +12 -0
|
@@ -0,0 +1,660 @@
|
|
|
1
|
+
import { getDefaultViewMeta } from './DefaultViewMeta';
|
|
2
|
+
const USER_REFERENCE = 'UserReference';
|
|
3
|
+
const PAGE = '!P!';
|
|
4
|
+
const PAGELIST = '!PL!';
|
|
5
|
+
export const formatConstants = {
|
|
6
|
+
WorkStatus: 'WorkStatus',
|
|
7
|
+
Integer: 'Integer',
|
|
8
|
+
WorkLink: 'WorkLink'
|
|
9
|
+
};
|
|
10
|
+
class DataApi {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.originalPropertyToMappedProperty = {};
|
|
13
|
+
this.mappedPropertyToOriginalProperty = {};
|
|
14
|
+
this.setPropertyMaps = this.setPropertyMaps.bind(this);
|
|
15
|
+
this.getMappedProperty = this.getMappedProperty.bind(this);
|
|
16
|
+
this.getOriginalProperty = this.getOriginalProperty.bind(this);
|
|
17
|
+
}
|
|
18
|
+
setPropertyMaps(originalToMappedPropertyObj = {}, mappedToOriginalPropertyObj = {}) {
|
|
19
|
+
this.originalPropertyToMappedProperty = {
|
|
20
|
+
...this.originalPropertyToMappedProperty,
|
|
21
|
+
...originalToMappedPropertyObj
|
|
22
|
+
};
|
|
23
|
+
this.mappedPropertyToOriginalProperty = {
|
|
24
|
+
...this.mappedPropertyToOriginalProperty,
|
|
25
|
+
...mappedToOriginalPropertyObj
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
getMappedProperty(propertyName) {
|
|
29
|
+
return this.originalPropertyToMappedProperty[propertyName] ?? propertyName;
|
|
30
|
+
}
|
|
31
|
+
getOriginalProperty(propertyName) {
|
|
32
|
+
return this.mappedPropertyToOriginalProperty[propertyName] ?? propertyName;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function getContext(componentConfig) {
|
|
36
|
+
const { promisesArray = [] // array of promises which can be invoked paralelly,
|
|
37
|
+
} = componentConfig;
|
|
38
|
+
const promisesResponseArray = await Promise.all(promisesArray);
|
|
39
|
+
const dataApi = new DataApi();
|
|
40
|
+
return {
|
|
41
|
+
promisesResponseArray,
|
|
42
|
+
setPropertyMaps: dataApi.setPropertyMaps,
|
|
43
|
+
getMappedProperty: dataApi.getMappedProperty,
|
|
44
|
+
getOriginalProperty: dataApi.getOriginalProperty
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* [getFieldNameFromEmbeddedFieldName]
|
|
49
|
+
* Description - converting embeddedField name starting with !P! or !PL! to normal field
|
|
50
|
+
* @ignore
|
|
51
|
+
* @param {string} propertyName EmbeddedField name starting with !P! or !PL!
|
|
52
|
+
* @returns {string} returns converted string without !P! or !PL! and :
|
|
53
|
+
*
|
|
54
|
+
* @example <caption>Example for getFieldNameFromEmbeddedFieldName </caption>
|
|
55
|
+
* getFieldNameFromEmbeddedFieldName('!P!Organisation:Name') return 'Organisation.Name'
|
|
56
|
+
* getFieldNameFromEmbeddedFieldName('!PL!Employees:Name') return 'Employees.Name'
|
|
57
|
+
*/
|
|
58
|
+
export function getFieldNameFromEmbeddedFieldName(propertyName) {
|
|
59
|
+
let value = propertyName;
|
|
60
|
+
if (value.startsWith(PAGE) || value.startsWith(PAGELIST)) {
|
|
61
|
+
value = value.substring(value.lastIndexOf('!') + 1);
|
|
62
|
+
value = value.replace(/:/g, '.');
|
|
63
|
+
}
|
|
64
|
+
return value;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* [updateMetaEmbeddedFieldID]
|
|
68
|
+
* Description - If the fieldID in meta starts with '!P!' or '!PL!' and contains ':' then replace them with .(dot)
|
|
69
|
+
* @ignore
|
|
70
|
+
* @param {Array} metaFields Fields metadata Array. Contains metadata of all the fields.
|
|
71
|
+
*/
|
|
72
|
+
export function updateMetaEmbeddedFieldID(metaFields) {
|
|
73
|
+
return metaFields.forEach(metaField => {
|
|
74
|
+
if (metaField.fieldID?.startsWith(PAGE) || metaField.fieldID?.startsWith(PAGELIST)) {
|
|
75
|
+
metaField.fieldID = getFieldNameFromEmbeddedFieldName(metaField.fieldID);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
export const isEmbeddedField = field => {
|
|
80
|
+
if (field?.startsWith('@')) {
|
|
81
|
+
field = field.substring(field.indexOf(' ') + 1);
|
|
82
|
+
if (field[0] === '.')
|
|
83
|
+
field = field.substring(1);
|
|
84
|
+
}
|
|
85
|
+
return field?.indexOf('.') > 0;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* [isPageListProperty]
|
|
89
|
+
* Description - checking if propertyName is pageList or not
|
|
90
|
+
* @ignore
|
|
91
|
+
* @param {string} propertyName PropertyName
|
|
92
|
+
* @returns {boolean} true if property is pageList else false
|
|
93
|
+
*
|
|
94
|
+
* @example <caption>Example for isPageListProperty </caption>
|
|
95
|
+
* isPageListProperty('!PL!Employees.Name') return true
|
|
96
|
+
* isPageListProperty('!P!Employees.Name') return false
|
|
97
|
+
* isPageListProperty('Name') return false
|
|
98
|
+
*/
|
|
99
|
+
export function isPageListProperty(propertyName) {
|
|
100
|
+
return propertyName.startsWith(PAGELIST);
|
|
101
|
+
}
|
|
102
|
+
export const isPageListInPath = (propertyName, currentClassID) => {
|
|
103
|
+
if (!propertyName.includes('.')) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
const [first, ...rest] = propertyName.split('.');
|
|
107
|
+
const metadata = PCore.getMetadataUtils().getPropertyMetadata(first, currentClassID);
|
|
108
|
+
if (metadata?.type === 'Page List') {
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
return isPageListInPath(rest.join('.'), metadata?.pageClass);
|
|
112
|
+
};
|
|
113
|
+
/**
|
|
114
|
+
* [getEmbeddedFieldName]
|
|
115
|
+
* Description - converting normal field name to embedded field starting with !P! or !PL!
|
|
116
|
+
* @ignore
|
|
117
|
+
* @param {string} propertyName Field name
|
|
118
|
+
* @param {string} classID classID of datapage
|
|
119
|
+
* @returns {string} returns converted string with !P! or !PL! and :
|
|
120
|
+
*
|
|
121
|
+
* @example <caption>Example for getEmbeddedFieldName </caption>
|
|
122
|
+
* For page property, getEmbeddedFieldName('Organisation.Name') return '!P!Organisation:Name'
|
|
123
|
+
* For pageList property, getEmbeddedFieldName('Employees.Name') return '!PL!Employees:Name'
|
|
124
|
+
*/
|
|
125
|
+
export function getEmbeddedFieldName(propertyName, classID) {
|
|
126
|
+
let value = propertyName;
|
|
127
|
+
if (isPageListInPath(value, classID)) {
|
|
128
|
+
value = `!PL!${value.replace(/\./g, ':')}`;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
value = `!P!${value.replace(/\./g, ':')}`;
|
|
132
|
+
}
|
|
133
|
+
return value;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* [preparePropertyMaps]
|
|
137
|
+
* Description - preparing maps for property names and set it in dataApi context
|
|
138
|
+
* @ignore
|
|
139
|
+
* @param {Array} fields fields array
|
|
140
|
+
* @param {string} classID classID of datapage
|
|
141
|
+
* @param {string} context dataApi context
|
|
142
|
+
* @returns {boolean} true if pageListProperty is present
|
|
143
|
+
*/
|
|
144
|
+
export function preparePropertyMaps(fields, classID, context) {
|
|
145
|
+
const { setPropertyMaps } = context;
|
|
146
|
+
const maps = fields.reduce((acc, field) => {
|
|
147
|
+
let { value } = field.config;
|
|
148
|
+
if (value.startsWith('@')) {
|
|
149
|
+
value = value.substring(value.indexOf(' ') + 1);
|
|
150
|
+
if (value[0] === '.')
|
|
151
|
+
value = value.substring(1);
|
|
152
|
+
}
|
|
153
|
+
let name = value;
|
|
154
|
+
// Preparing name for embedded property
|
|
155
|
+
if (isEmbeddedField(name)) {
|
|
156
|
+
name = getEmbeddedFieldName(name, classID);
|
|
157
|
+
}
|
|
158
|
+
if (isPageListProperty(name) && !acc[2]) {
|
|
159
|
+
acc[2] = true;
|
|
160
|
+
}
|
|
161
|
+
acc[0][value] = name;
|
|
162
|
+
acc[1][name] = value;
|
|
163
|
+
return acc;
|
|
164
|
+
}, [{}, {}, false]);
|
|
165
|
+
setPropertyMaps(maps[0], maps[1]);
|
|
166
|
+
return maps[2];
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* [getConfigEmbeddedFieldsMeta]
|
|
170
|
+
* Description - Get the metadata for configured embedded fields
|
|
171
|
+
* @ignore
|
|
172
|
+
* @param {Set} configFields Set of config fields
|
|
173
|
+
* @param {string} classID clasID of datapage
|
|
174
|
+
* @returns {Array} Metadata of configured embedded fields
|
|
175
|
+
*/
|
|
176
|
+
export function getConfigEmbeddedFieldsMeta(configFields, classID) {
|
|
177
|
+
const configEmbeddedFieldsMeta = [];
|
|
178
|
+
configFields.forEach(field => {
|
|
179
|
+
let value = field;
|
|
180
|
+
if (isEmbeddedField(value)) {
|
|
181
|
+
// conversion Page.PageList[].property => Page.PageList.property
|
|
182
|
+
if (value.includes('[')) {
|
|
183
|
+
value = value.substring(0, value.indexOf('[')) + value.substring(value.indexOf(']') + 1);
|
|
184
|
+
}
|
|
185
|
+
const meta = PCore.getMetadataUtils().getEmbeddedPropertyMetadata(value, classID);
|
|
186
|
+
meta.fieldID = field;
|
|
187
|
+
configEmbeddedFieldsMeta.push(meta);
|
|
188
|
+
}
|
|
189
|
+
});
|
|
190
|
+
return configEmbeddedFieldsMeta;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* [mergeConfigEmbeddedFieldsMeta]
|
|
194
|
+
* Description - Get the metadata for configured embedded fields
|
|
195
|
+
* @ignore
|
|
196
|
+
* @param {Array} configEmbeddedFieldsMeta config fields metadata.
|
|
197
|
+
* @param {Array} metaFields Fields metadata Array. Contains metadata of all the fields
|
|
198
|
+
*/
|
|
199
|
+
export function mergeConfigEmbeddedFieldsMeta(configEmbeddedFieldsMeta, metaFields) {
|
|
200
|
+
const mergedMetaFields = [...metaFields];
|
|
201
|
+
configEmbeddedFieldsMeta.forEach(configFieldMeta => {
|
|
202
|
+
const fieldMeta = metaFields.find(metaField => metaField.fieldID === configFieldMeta.fieldID);
|
|
203
|
+
if (!fieldMeta)
|
|
204
|
+
mergedMetaFields.push(configFieldMeta);
|
|
205
|
+
});
|
|
206
|
+
return mergedMetaFields;
|
|
207
|
+
}
|
|
208
|
+
const oldToNewFieldTypeMapping = {
|
|
209
|
+
'Date Time': 'Date & time',
|
|
210
|
+
Date: 'Date only'
|
|
211
|
+
};
|
|
212
|
+
/**
|
|
213
|
+
* [updateFieldType]
|
|
214
|
+
* Description - Updates the field type if its changed in the new implementation. Such mapping is maintained in oldToNewFieldTypeMapping.
|
|
215
|
+
* @ignore
|
|
216
|
+
* @param {Array} metaFields Fields metadata Array. Contains metadata of all the fields.
|
|
217
|
+
*/
|
|
218
|
+
function updateFieldType(metaFields) {
|
|
219
|
+
metaFields.forEach(metaField => {
|
|
220
|
+
if (metaField.type)
|
|
221
|
+
metaField.type = oldToNewFieldTypeMapping[metaField.type] || metaField.type;
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
function getPresetMetaAttribute(attribute) {
|
|
225
|
+
const { type, config: { label, value } } = attribute;
|
|
226
|
+
return {
|
|
227
|
+
type,
|
|
228
|
+
name: value.startsWith('@') ? value.substring(4) : value,
|
|
229
|
+
label: label.startsWith('@') ? label.substring(3) : label
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* [generateViewMetaData]
|
|
234
|
+
* Description - Returns a list of metaobjects of the fields provided.
|
|
235
|
+
* @ignore
|
|
236
|
+
* @param {Array} rawFields List of fields to update meta for
|
|
237
|
+
* @param {string} classID Class ID from the response
|
|
238
|
+
* @returns {Array} List of fields with updated meta objects.
|
|
239
|
+
*/
|
|
240
|
+
function generateViewMetaData(rawFields, classID, showField) {
|
|
241
|
+
return rawFields.map(item => getDefaultViewMeta(item, classID, showField));
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* [getConfigFields]
|
|
245
|
+
* Description - Returns list of config fields with primary fields meta updated.
|
|
246
|
+
* @ignore
|
|
247
|
+
* @param {Array} configFields List of Authored fields
|
|
248
|
+
* @param {Array} primaryFields List of Primary Fields
|
|
249
|
+
* @param {Array} metaFields Metadata of all fields
|
|
250
|
+
* @param {string} classID Class ID from the response
|
|
251
|
+
* @returns {Array} List of all fields with their meta updated.
|
|
252
|
+
*/
|
|
253
|
+
function getConfigFields(configFields, primaryFields, metaFields, classID) {
|
|
254
|
+
const presetConfigFields = configFields;
|
|
255
|
+
const primaryFieldsViewIndex = presetConfigFields.findIndex(field => field.config.value === 'pyPrimaryFields');
|
|
256
|
+
if (!primaryFields || !primaryFields.length) {
|
|
257
|
+
if (primaryFieldsViewIndex < 0)
|
|
258
|
+
return presetConfigFields;
|
|
259
|
+
presetConfigFields.splice(primaryFieldsViewIndex, 1);
|
|
260
|
+
return presetConfigFields;
|
|
261
|
+
}
|
|
262
|
+
if (primaryFieldsViewIndex > -1) {
|
|
263
|
+
// list of uncommon fields - non overlap of primary fields grouped view and independent entity columns of primary type
|
|
264
|
+
const uncommonFieldsList = primaryFields.filter(primaryField => !presetConfigFields.some(presetConfigField => presetConfigField.config.value.split('.')[1] === primaryField));
|
|
265
|
+
const uncommonFieldsRawMeta = [];
|
|
266
|
+
uncommonFieldsList.forEach(uncommonField => {
|
|
267
|
+
const uncommonFieldMeta = metaFields.find(metaField => metaField.fieldID === uncommonField);
|
|
268
|
+
if (uncommonFieldMeta)
|
|
269
|
+
uncommonFieldsRawMeta.push(uncommonFieldMeta);
|
|
270
|
+
});
|
|
271
|
+
const uncommonFieldsConfigMeta = generateViewMetaData(uncommonFieldsRawMeta, classID, true);
|
|
272
|
+
presetConfigFields.splice(primaryFieldsViewIndex, 1, ...uncommonFieldsConfigMeta);
|
|
273
|
+
}
|
|
274
|
+
return presetConfigFields;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* [getTableConfigFromPresetMeta]
|
|
278
|
+
* Description - Get the table config from the presets meta.
|
|
279
|
+
* @ignore
|
|
280
|
+
* @param {object} presetMeta Presets meta
|
|
281
|
+
* @param {boolean} isMetaWithPresets true if meta has presets else false
|
|
282
|
+
* @param {Function} getPConnect Callback to get the PConnect object
|
|
283
|
+
* @param {string} classID Class ID from the response
|
|
284
|
+
* @param {Array} primaryFields List of Primary Fields
|
|
285
|
+
* @param {Array} metaFields List of all metafields
|
|
286
|
+
* @returns {object} Table config object
|
|
287
|
+
*/
|
|
288
|
+
export function getTableConfigFromPresetMeta(presetMeta, isMetaWithPresets, pConn$, classID, primaryFields, metaFields) {
|
|
289
|
+
let presetId;
|
|
290
|
+
let presetName;
|
|
291
|
+
let cardHeader;
|
|
292
|
+
let secondaryText;
|
|
293
|
+
let timelineDate;
|
|
294
|
+
let timelineTitle;
|
|
295
|
+
let timelineStatus;
|
|
296
|
+
let timelineIcon;
|
|
297
|
+
let { filterExpression } = pConn$.getRawMetadata().config;
|
|
298
|
+
let fieldsMeta;
|
|
299
|
+
let configFields;
|
|
300
|
+
if (isMetaWithPresets) {
|
|
301
|
+
presetId = presetMeta.id;
|
|
302
|
+
presetName = presetMeta.label;
|
|
303
|
+
cardHeader = presetMeta.cardHeader && getPresetMetaAttribute(presetMeta.cardHeader);
|
|
304
|
+
secondaryText = presetMeta.secondaryText && getPresetMetaAttribute(presetMeta.secondaryText);
|
|
305
|
+
timelineDate = presetMeta.timelineDate && getPresetMetaAttribute(presetMeta.timelineDate);
|
|
306
|
+
timelineTitle = presetMeta.timelineTitle && getPresetMetaAttribute(presetMeta.timelineTitle);
|
|
307
|
+
timelineStatus = presetMeta.timelineStatus && getPresetMetaAttribute(presetMeta.timelineStatus);
|
|
308
|
+
timelineIcon = presetMeta.timelineIcon && getPresetMetaAttribute(presetMeta.timelineIcon);
|
|
309
|
+
filterExpression = presetMeta.config.filterExpression;
|
|
310
|
+
[fieldsMeta] = presetMeta.children;
|
|
311
|
+
if (presetMeta.timelineTitle &&
|
|
312
|
+
!fieldsMeta.children.find(fieldMeta => {
|
|
313
|
+
return fieldMeta?.config?.value === presetMeta.timelineTitle?.config?.value;
|
|
314
|
+
})) {
|
|
315
|
+
const { type, config } = presetMeta.timelineTitle;
|
|
316
|
+
fieldsMeta.children.push({ type, config: { ...config, show: false } });
|
|
317
|
+
}
|
|
318
|
+
if (presetMeta.timelineDate &&
|
|
319
|
+
!fieldsMeta.children.find(fieldMeta => {
|
|
320
|
+
return fieldMeta?.config?.value === presetMeta.timelineDate?.config?.value;
|
|
321
|
+
})) {
|
|
322
|
+
const { type, config } = presetMeta.timelineDate;
|
|
323
|
+
fieldsMeta.children.push({ type, config: { ...config, show: false } });
|
|
324
|
+
}
|
|
325
|
+
configFields = getConfigFields(fieldsMeta.children, primaryFields, metaFields, classID);
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
fieldsMeta = presetMeta.props;
|
|
329
|
+
configFields = getConfigFields(fieldsMeta
|
|
330
|
+
.getPConnect()
|
|
331
|
+
.getChildren()
|
|
332
|
+
?.map(child => {
|
|
333
|
+
return child.getPConnect().getRawMetadata();
|
|
334
|
+
}), primaryFields, metaFields, classID);
|
|
335
|
+
}
|
|
336
|
+
return {
|
|
337
|
+
presetId,
|
|
338
|
+
presetName,
|
|
339
|
+
cardHeader,
|
|
340
|
+
secondaryText,
|
|
341
|
+
timelineDate,
|
|
342
|
+
timelineTitle,
|
|
343
|
+
timelineStatus,
|
|
344
|
+
timelineIcon,
|
|
345
|
+
filterExpression,
|
|
346
|
+
fieldsMeta,
|
|
347
|
+
configFields
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* [getReportColumns]
|
|
352
|
+
* Description - Returns a set of columns from the report response.
|
|
353
|
+
* @ignore
|
|
354
|
+
* @param {object} response -
|
|
355
|
+
* @returns {Set} Set of columns from the report response
|
|
356
|
+
*/
|
|
357
|
+
function getReportColumns(response) {
|
|
358
|
+
const { data: { data: reportColumns } } = response;
|
|
359
|
+
const reportColumnsSet = new Set();
|
|
360
|
+
reportColumns?.forEach(item => {
|
|
361
|
+
let val = item.pyFieldName;
|
|
362
|
+
// Remove '.' from index 0 only, if '.' is present
|
|
363
|
+
if (val[0] === '.') {
|
|
364
|
+
val = val.substring(1);
|
|
365
|
+
}
|
|
366
|
+
reportColumnsSet.add(val);
|
|
367
|
+
});
|
|
368
|
+
return reportColumnsSet;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* [getConfigFieldValue]
|
|
372
|
+
* Descritpion - Returns a valid value for a configuration field. Remove any annotations and also "."
|
|
373
|
+
* @ignore
|
|
374
|
+
* @param {object} config
|
|
375
|
+
* config.value - Raw value
|
|
376
|
+
* @returns {string} value - Value with out any annotations or "."
|
|
377
|
+
*/
|
|
378
|
+
function getConfigFieldValue(config) {
|
|
379
|
+
let { value } = config;
|
|
380
|
+
if (value.startsWith('@')) {
|
|
381
|
+
value = value.substring(value.indexOf(' ') + 1);
|
|
382
|
+
if (value[0] === '.')
|
|
383
|
+
value = value.substring(1);
|
|
384
|
+
}
|
|
385
|
+
return value;
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* [prepareConfigFields]
|
|
389
|
+
* Description - Prepares a set of configuration fields and pushes each config type to a set using the callback parameter.
|
|
390
|
+
* @ignore
|
|
391
|
+
* @param {object} configFields List of Authored fields
|
|
392
|
+
* @param {Function} pushToComponentsList Callback to push the field type to a set.
|
|
393
|
+
* @returns {Set} configFieldSet
|
|
394
|
+
*/
|
|
395
|
+
function prepareConfigFields(configFields, pushToComponentsList) {
|
|
396
|
+
const configFieldSet = new Set();
|
|
397
|
+
configFields.forEach(item => {
|
|
398
|
+
pushToComponentsList(item.type);
|
|
399
|
+
const val = getConfigFieldValue(item.config);
|
|
400
|
+
configFieldSet.add(val);
|
|
401
|
+
});
|
|
402
|
+
return configFieldSet;
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* [findAuthoredField]
|
|
406
|
+
* Description - Finds an authored field from yhe list of config fields.
|
|
407
|
+
* @ignore
|
|
408
|
+
* @param {Array} configFields List of Authored fields
|
|
409
|
+
* @param {string} fieldID Filter
|
|
410
|
+
* @returns {object} config with its field value equal to fieldID, which means an authored field
|
|
411
|
+
*/
|
|
412
|
+
function findAuthoredField(configFields, fieldID) {
|
|
413
|
+
return configFields.find(configField => {
|
|
414
|
+
const val = getConfigFieldValue(configField.config);
|
|
415
|
+
return val === fieldID;
|
|
416
|
+
});
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* [findAndUpdateAuthoredFieldConfig]
|
|
420
|
+
* Description - Find the authored field, and update its config.
|
|
421
|
+
* @ignore
|
|
422
|
+
* @param {Array} configFields List of Authored fields
|
|
423
|
+
* @param {object} item Field item to copy displayAs and category information
|
|
424
|
+
* @param {string} classId classID from the response
|
|
425
|
+
*/
|
|
426
|
+
function findAndUpdateAuthoredFieldConfig(configFields, item, classId) {
|
|
427
|
+
const authoredField = findAuthoredField(configFields, item.fieldID);
|
|
428
|
+
if (authoredField?.config) {
|
|
429
|
+
if (item.displayAs) {
|
|
430
|
+
authoredField.config.displayAs = item.displayAs;
|
|
431
|
+
}
|
|
432
|
+
authoredField.config.classID = item.classID ?? classId;
|
|
433
|
+
if (authoredField.type === USER_REFERENCE) {
|
|
434
|
+
authoredField.config.associationID = item.associationID || item.fieldID;
|
|
435
|
+
}
|
|
436
|
+
authoredField.config.category = item.category;
|
|
437
|
+
// FieldType identifies whether the field is configured as pickList
|
|
438
|
+
authoredField.config.fieldType = item.fieldType;
|
|
439
|
+
// type defined on the property rule,
|
|
440
|
+
// used for the picklist field to assign the appropriate type
|
|
441
|
+
authoredField.config.propertyType = item.dataType || item.type;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
/**
|
|
445
|
+
* [isAnExtraField]
|
|
446
|
+
* Description - Returns true if the field is an extra field. Extra field is the one which is not authored but part of the report.
|
|
447
|
+
* @ignore
|
|
448
|
+
* @param {Array} configFields List of Authored fields
|
|
449
|
+
* @param {Set} configFieldSet Set if Authored filed values
|
|
450
|
+
* @param {Set} reportColumnsSet Set of columns from the report
|
|
451
|
+
* @param {object} item Config field item
|
|
452
|
+
* @param {string} classId Class ID from the response
|
|
453
|
+
* @param {boolean} showDynamicFields Flag indicating whether fields are fetched dynamically at runtime
|
|
454
|
+
* @returns {boolean} true If the field is an extra field else false.
|
|
455
|
+
*/
|
|
456
|
+
function isAnExtraField(configFields, configFieldSet, reportColumnsSet, item, classId, showDynamicFields) {
|
|
457
|
+
// Is the field already present in authoring metadata?
|
|
458
|
+
// Mutates config fields to copy displayAs and category information
|
|
459
|
+
if (configFieldSet.has(item.fieldID)) {
|
|
460
|
+
findAndUpdateAuthoredFieldConfig(configFields, item, classId);
|
|
461
|
+
return false;
|
|
462
|
+
}
|
|
463
|
+
// If field is not authored and not part of report columns then discard it
|
|
464
|
+
return showDynamicFields || !!reportColumnsSet.has(item.fieldID);
|
|
465
|
+
}
|
|
466
|
+
/**
|
|
467
|
+
* [prepareExtraFields]
|
|
468
|
+
* Description - Returns a list of extra fields with their meta updated.
|
|
469
|
+
* @ignore
|
|
470
|
+
* @param {Array} metaFields List of fields
|
|
471
|
+
* @param {Array} configFields List of Authored fields
|
|
472
|
+
* @param {Set} configFieldSet Set if Authored filed values
|
|
473
|
+
* @param {Set} reportColumnsSet Set of columns from the report
|
|
474
|
+
* @param {string} classID Class ID from the response
|
|
475
|
+
* @param {boolean} showDynamicFields Flag indicating whether fields are fetched dynamically at runtime
|
|
476
|
+
* @returns {Array} List of extra fields with their meta updated.
|
|
477
|
+
*/
|
|
478
|
+
function prepareExtraFields(metaFields, configFields, configFieldSet, reportColumnsSet, classID, showDynamicFields) {
|
|
479
|
+
// Filter all the extra fields
|
|
480
|
+
const extraFileds = metaFields.filter(item => {
|
|
481
|
+
return isAnExtraField(configFields, configFieldSet, reportColumnsSet, item, classID, showDynamicFields);
|
|
482
|
+
});
|
|
483
|
+
return generateViewMetaData(extraFileds, classID, false);
|
|
484
|
+
// Update the meta object of each of the extra fields.
|
|
485
|
+
}
|
|
486
|
+
const AssignDashObjects = ['Assign-Worklist', 'Assign-WorkBasket'];
|
|
487
|
+
function populateRenderingOptions(name, config, field) {
|
|
488
|
+
const shouldDisplayAsSemanticLink = 'displayAsLink' in field.config && field.config.displayAsLink;
|
|
489
|
+
if (shouldDisplayAsSemanticLink) {
|
|
490
|
+
config.customObject.isAssignmentLink = AssignDashObjects.includes(field.config.classID);
|
|
491
|
+
if (field.config.value.startsWith('@CA')) {
|
|
492
|
+
config.customObject.isAssociation = true;
|
|
493
|
+
}
|
|
494
|
+
config.cellRenderer = formatConstants.WorkLink;
|
|
495
|
+
}
|
|
496
|
+
else if (name === 'pyStatusWork' || name === 'pyAssignmentStatus') {
|
|
497
|
+
config.cellRenderer = formatConstants.WorkStatus;
|
|
498
|
+
}
|
|
499
|
+
else if (name === 'pxUrgencyWork') {
|
|
500
|
+
config.cellRenderer = formatConstants.Integer;
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
export function initializeColumns(fields = [], getMappedProperty = null) {
|
|
504
|
+
return fields.map((field, originalColIndex) => {
|
|
505
|
+
let name = field.config.value;
|
|
506
|
+
if (name.startsWith('@')) {
|
|
507
|
+
name = name.substring(name.indexOf(' ') + 1);
|
|
508
|
+
if (name[0] === '.')
|
|
509
|
+
name = name.substring(1);
|
|
510
|
+
}
|
|
511
|
+
name = getMappedProperty?.(name) ?? name;
|
|
512
|
+
let label = field.config.label || field.config.caption;
|
|
513
|
+
const { show = true, displayAs } = field.config;
|
|
514
|
+
if (label.startsWith('@')) {
|
|
515
|
+
label = label.substring(3);
|
|
516
|
+
}
|
|
517
|
+
const config = {
|
|
518
|
+
name,
|
|
519
|
+
label,
|
|
520
|
+
show,
|
|
521
|
+
classID: field.config.classID,
|
|
522
|
+
id: field.id || name || originalColIndex,
|
|
523
|
+
displayAs,
|
|
524
|
+
associationID: field.config.associationID,
|
|
525
|
+
...(field.config.classID && { category: field.config.category }),
|
|
526
|
+
customObject: {},
|
|
527
|
+
fieldType: field.config.fieldType,
|
|
528
|
+
meta: {
|
|
529
|
+
...field
|
|
530
|
+
}
|
|
531
|
+
};
|
|
532
|
+
populateRenderingOptions(name, config, field);
|
|
533
|
+
return config;
|
|
534
|
+
});
|
|
535
|
+
}
|
|
536
|
+
export const getItemKey = fields => {
|
|
537
|
+
let itemKey;
|
|
538
|
+
if (fields.findIndex(field => field.id === 'pyGUID') > -1) {
|
|
539
|
+
itemKey = 'pyGUID';
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
itemKey = 'pzInsKey';
|
|
543
|
+
}
|
|
544
|
+
return itemKey;
|
|
545
|
+
};
|
|
546
|
+
export function preparePatchQueryFields(fields, isDataObject = false, classID = '') {
|
|
547
|
+
const queryFields = [];
|
|
548
|
+
fields.forEach(field => {
|
|
549
|
+
const patchFields = [];
|
|
550
|
+
if (field.cellRenderer === 'WorkLink') {
|
|
551
|
+
if (field.customObject && field.customObject.isAssignmentLink) {
|
|
552
|
+
const associationName = field.name.includes(':') ? `${field.name.split(':')[0]}:` : '';
|
|
553
|
+
patchFields.push(`${associationName}pzInsKey`);
|
|
554
|
+
patchFields.push(`${associationName}pxRefObjectClass`);
|
|
555
|
+
}
|
|
556
|
+
else if (field.customObject && field.customObject.isAssociation) {
|
|
557
|
+
const associationCategory = field.name.split(':')[0];
|
|
558
|
+
patchFields.push(`${associationCategory}:pyID`);
|
|
559
|
+
patchFields.push(`${associationCategory}:pzInsKey`);
|
|
560
|
+
patchFields.push(`${associationCategory}:pxObjClass`);
|
|
561
|
+
}
|
|
562
|
+
else if (isDataObject) {
|
|
563
|
+
const dataViewName = PCore.getDataTypeUtils().getSavableDataPage(classID);
|
|
564
|
+
const dataPageKeys = PCore.getDataTypeUtils().getDataPageKeys(dataViewName);
|
|
565
|
+
dataPageKeys?.forEach(item => (item.isAlternateKeyStorage ? patchFields.push(item.linkedField) : patchFields.push(item.keyName)));
|
|
566
|
+
}
|
|
567
|
+
else {
|
|
568
|
+
patchFields.push('pyID');
|
|
569
|
+
patchFields.push('pzInsKey');
|
|
570
|
+
patchFields.push('pxObjClass');
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
patchFields.forEach(k => {
|
|
574
|
+
if (!queryFields.find(q => q === k)) {
|
|
575
|
+
queryFields.push(k);
|
|
576
|
+
}
|
|
577
|
+
});
|
|
578
|
+
});
|
|
579
|
+
return queryFields;
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* Update the renderer type for the properties of type Page.
|
|
583
|
+
*/
|
|
584
|
+
export function updatePageFieldsConfig(configFields, parentClassID) {
|
|
585
|
+
return configFields.forEach(item => {
|
|
586
|
+
const { type, config: { value } } = item;
|
|
587
|
+
const propertyName = PCore.getAnnotationUtils().getPropertyName(value);
|
|
588
|
+
if (isEmbeddedField(value) && !isPageListInPath(propertyName, parentClassID)) {
|
|
589
|
+
item.config.componentType = type;
|
|
590
|
+
item.type = 'PagePropertyRenderer';
|
|
591
|
+
}
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
export const readContextResponse = async (context, params) => {
|
|
595
|
+
const { pConn$, apiContext, children, showDynamicFields, referenceList, isDataObject } = params;
|
|
596
|
+
// let { listContext } = params;
|
|
597
|
+
const { promisesResponseArray, apiContext: otherContext } = context;
|
|
598
|
+
// eslint-disable-next-line sonarjs/no-unused-collection
|
|
599
|
+
const listOfComponents = [];
|
|
600
|
+
const { data: { fields: metaFields, classID, isQueryable } } = promisesResponseArray[0];
|
|
601
|
+
let { data: { primaryFields } } = promisesResponseArray[0];
|
|
602
|
+
// When list is configured with Include all class fields configuration, provide support for Primary fields column
|
|
603
|
+
if (showDynamicFields) {
|
|
604
|
+
const sourceMetadata = PCore.getMetadataUtils().getDataPageMetadata(referenceList);
|
|
605
|
+
if (sourceMetadata?.primaryFields) {
|
|
606
|
+
primaryFields = sourceMetadata.primaryFields;
|
|
607
|
+
}
|
|
608
|
+
// updating metaData fieldID to normal property if it has fieldID starts with !P! or !PL!
|
|
609
|
+
updateMetaEmbeddedFieldID(metaFields);
|
|
610
|
+
}
|
|
611
|
+
updateFieldType(metaFields);
|
|
612
|
+
if (isDataObject) {
|
|
613
|
+
const compositeKeys = [];
|
|
614
|
+
const dataViewName = PCore.getDataTypeUtils().getSavableDataPage(classID);
|
|
615
|
+
const dataPageKeys = PCore.getDataTypeUtils().getDataPageKeys(dataViewName);
|
|
616
|
+
dataPageKeys?.forEach(item => (item.isAlternateKeyStorage ? compositeKeys.push(item.linkedField) : compositeKeys.push(item.keyName)));
|
|
617
|
+
if (compositeKeys.length) {
|
|
618
|
+
otherContext.setCompositeKeys(compositeKeys);
|
|
619
|
+
}
|
|
620
|
+
otherContext.fetchRowActionDetails = null;
|
|
621
|
+
}
|
|
622
|
+
const presetArray = [];
|
|
623
|
+
const rawMetadata = pConn$.getRawMetadata().config;
|
|
624
|
+
const rawPresets = rawMetadata.presets;
|
|
625
|
+
const isMetaWithPresets = rawPresets && rawPresets.length !== 0;
|
|
626
|
+
const childrenIterator = isMetaWithPresets ? rawPresets : children;
|
|
627
|
+
const resolvedPresets = pConn$.getConfigProps().presets;
|
|
628
|
+
let fields;
|
|
629
|
+
let tableConfig;
|
|
630
|
+
childrenIterator?.forEach((presetMeta, index) => {
|
|
631
|
+
const { configFields } = getTableConfigFromPresetMeta({ ...presetMeta, label: resolvedPresets[index].label }, isMetaWithPresets, pConn$, classID, primaryFields, metaFields);
|
|
632
|
+
const pushToComponentsList = fieldType => {
|
|
633
|
+
listOfComponents.push(fieldType);
|
|
634
|
+
};
|
|
635
|
+
// read report columns response - in case of nonqueryable ignore the response and rely only on the fields configured at authoing time in presets
|
|
636
|
+
const reportColumnsSet = isQueryable ? getReportColumns(promisesResponseArray[1]) : new Set();
|
|
637
|
+
const configFieldSet = prepareConfigFields(configFields, pushToComponentsList);
|
|
638
|
+
// FIXME #EmbeddedPropertyPatch
|
|
639
|
+
// TODO: Remove this merge logic when the metadata response includes all optimized embedded page and pagelists
|
|
640
|
+
// merging configured embedded properties with metadata so that while preparing extra fields, config fields can get other properties from meta(eg: category, displayAsLink)
|
|
641
|
+
// get configured embedded properties metadata and get new mergedMetaFields
|
|
642
|
+
const configEmbeddedFieldsMeta = getConfigEmbeddedFieldsMeta(configFieldSet, classID);
|
|
643
|
+
const mergedMetaFields = mergeConfigEmbeddedFieldsMeta(configEmbeddedFieldsMeta, metaFields);
|
|
644
|
+
const extraFields = prepareExtraFields(mergedMetaFields, // passing new merged meta fields which has meta of configured embedded fields of current preset
|
|
645
|
+
configFields, configFieldSet, reportColumnsSet, classID, showDynamicFields);
|
|
646
|
+
if (isQueryable) {
|
|
647
|
+
updatePageFieldsConfig(configFields, classID);
|
|
648
|
+
preparePropertyMaps([...configFields, ...extraFields], classID, context);
|
|
649
|
+
}
|
|
650
|
+
const { getMappedProperty } = context;
|
|
651
|
+
fields = initializeColumns([...configFields, ...extraFields], getMappedProperty);
|
|
652
|
+
const patchQueryFields = preparePatchQueryFields(fields, isDataObject, classID);
|
|
653
|
+
const itemKey = getItemKey(fields);
|
|
654
|
+
tableConfig = { fieldDefs: fields, patchQueryFields, itemKey, isQueryable };
|
|
655
|
+
});
|
|
656
|
+
const meta = tableConfig;
|
|
657
|
+
params.listContext = { meta, presets: presetArray, apiContext: { ...apiContext } };
|
|
658
|
+
return params.listContext;
|
|
659
|
+
};
|
|
660
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvdGVtcGxhdGUvbGlzdC12aWV3L3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBS3ZELE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQztBQUN2QyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUM7QUFDbkIsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDO0FBRXhCLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRztJQUM3QixVQUFVLEVBQUUsWUFBWTtJQUN4QixPQUFPLEVBQUUsU0FBUztJQUNsQixRQUFRLEVBQUUsVUFBVTtDQUNyQixDQUFDO0FBRUYsTUFBTSxPQUFPO0lBR1g7UUFDRSxJQUFJLENBQUMsZ0NBQWdDLEdBQUcsRUFBRSxDQUFDO1FBQzNDLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsZUFBZSxDQUFDLDJCQUEyQixHQUFHLEVBQUUsRUFBRSwyQkFBMkIsR0FBRyxFQUFFO1FBQ2hGLElBQUksQ0FBQyxnQ0FBZ0MsR0FBRztZQUN0QyxHQUFHLElBQUksQ0FBQyxnQ0FBZ0M7WUFDeEMsR0FBRywyQkFBMkI7U0FDL0IsQ0FBQztRQUNGLElB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QUFXLEdBQUcsa0JBQWtCLENBQ3BDLGdCQUFnQixFQUFFLGdHQUFnRztRQUNsSCxZQUFZLEVBQ1osY0FBYyxFQUNkLGdCQUFnQixFQUNoQixPQUFPLEVBQ1AsaUJBQWlCLENBQ2xCLENBQUM7UUFFRixJQUFJLFdBQVcsRUFBRTtZQUNmLHNCQUFzQixDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsQ0FBQztZQUM5QyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUcsWUFBWSxFQUFFLEdBQUcsV0FBVyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1NBQzFFO1FBRUQsTUFBTSxFQUFFLGlCQUFpQixFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRXRDLE1BQU0sR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLEdBQUcsWUFBWSxFQUFFLEdBQUcsV0FBVyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNqRixNQUFNLGdCQUFnQixHQUFHLHVCQUF1QixDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDaEYsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ25DLFdBQVcsR0FBRyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQzlFLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDO0lBQ3pCLE1BQU0sQ0FBQyxXQUFXLEdBQUcsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsRUFBRSxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUM7SUFDbkYsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUFDO0FBQzVCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldERlZmF1bHRWaWV3TWV0YSB9IGZyb20gJy4vRGVmYXVsdFZpZXdNZXRhJztcblxuLy8gUmVtb3ZlIHRoaXMgYW5kIHVzZSBcInJlYWxcIiBQQ29yZSB0eXBlIG9uY2UgLmQudHMgaXMgZml4ZWQgKGN1cnJlbnRseSBzaG93cyA1IGVycm9ycylcbmRlY2xhcmUgY29uc3QgUENvcmU6IGFueTtcblxuY29uc3QgVVNFUl9SRUZFUkVOQ0UgPSAnVXNlclJlZmVyZW5jZSc7XG5jb25zdCBQQUdFID0gJyFQISc7XG5jb25zdCBQQUdFTElTVCA9ICchUEwhJztcblxuZXhwb3J0IGNvbnN0IGZvcm1hdENvbnN0YW50cyA9IHtcbiAgV29ya1N0YXR1czogJ1dvcmtTdGF0dXMnLFxuICBJbnRlZ2VyOiAnSW50ZWdlcicsXG4gIFdvcmtMaW5rOiAnV29ya0xpbmsnXG59O1xuXG5jbGFzcyBEYXRhQXBpIHtcbiAgbWFwcGVkUHJvcGVydHlUb09yaWdpbmFsUHJvcGVydHk6IGFueTtcbiAgb3JpZ2luYWxQcm9wZXJ0eVRvTWFwcGVkUHJvcGVydHk6IGFueTtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5vcmlnaW5hbFByb3BlcnR5VG9NYXBwZWRQcm9wZXJ0eSA9IHt9O1xuICAgIHRoaXMubWFwcGVkUHJvcGVydHlUb09yaWdpbmFsUHJvcGVydHkgPSB7fTtcbiAgICB0aGlzLnNldFByb3BlcnR5TWFwcyA9IHRoaXMuc2V0UHJvcGVydHlNYXBzLmJpbmQodGhpcyk7XG4gICAgdGhpcy5nZXRNYXBwZWRQcm9wZXJ0eSA9IHRoaXMuZ2V0TWFwcGVkUHJvcGVydHkuYmluZCh0aGlzKTtcbiAgICB0aGlzLmdldE9yaWdpbmFsUHJvcGVydHkgPSB0aGlzLmdldE9yaWdpbmFsUHJvcGVydHkuYmluZCh0aGlzKTtcbiAgfVxuXG4gIHNldFByb3BlcnR5TWFwcyhvcmlnaW5hbFRvTWFwcGVkUHJvcGVydHlPYmogPSB7fSwgbWFwcGVkVG9PcmlnaW5hbFByb3BlcnR5T2JqID0ge30pIHtcbiAgICB0aGlzLm9yaWdpbmFsUHJvcGVydHlUb01hcHBlZFByb3BlcnR5ID0ge1xuICAgICAgLi4udGhpcy5vcmlnaW5hbFByb3BlcnR5VG9NYXBwZWRQcm9wZXJ0eSxcbiAgICAgIC4uLm9yaWdpbmFsVG9NYXBwZWRQcm9wZXJ0eU9ialxuICAgIH07XG4gICAgdGhpcy5tYXBwZWRQcm9wZXJ0eVRvT3JpZ2luYWxQcm9wZXJ0eSA9IHtcbiAgICAgIC4uLnRoaXMubWFwcGVkUHJvcGVydHlUb09yaWdpbmFsUHJvcGVydHksXG4gICAgICAuLi5tYXBwZWRUb09yaWdpbmFsUHJvcGVydHlPYmpcbiAgICB9O1xuICB9XG5cbiAgZ2V0TWFwcGVkUHJvcGVydHkocHJvcGVydHlOYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMub3JpZ2luYWxQcm9wZXJ0eVRvTWFwcGVkUHJvcGVydHlbcHJvcGVydHlOYW1lXSA/PyBwcm9wZXJ0eU5hbWU7XG4gIH1cblxuICBnZXRPcmlnaW5hbFByb3BlcnR5KHByb3BlcnR5TmFtZSkge1xuICAgIHJldHVybiB0aGlzLm1hcHBlZFByb3BlcnR5VG9PcmlnaW5hbFByb3BlcnR5W3Byb3BlcnR5TmFtZV0gPz8gcHJvcGVydHlOYW1lO1xuICB9XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDb250ZXh0KGNvbXBvbmVudENvbmZpZykge1xuICBjb25zdCB7XG4gICAgcHJvbWlzZXNBcnJheSA9IFtdIC8vIGFycmF5IG9mIHByb21pc2VzIHdoaWNoIGNhbiBiZSBpbnZva2VkIHBhcmFsZWxseSxcbiAgfSA9IGNvbXBvbmVudENvbmZpZztcbiAgY29uc3QgcHJvbWlzZXNSZXNwb25zZUFycmF5ID0gYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXNBcnJheSk7XG4gIGNvbnN0IGRhdGFBcGkgPSBuZXcgRGF0YUFwaSgpO1xuICByZXR1cm4ge1xuICAgIHByb21pc2VzUmVzcG9uc2VBcnJheSxcbiAgICBzZXRQcm9wZXJ0eU1hcHM6IGRhdGFBcGkuc2V0UHJvcGVydHlNYXBzLFxuICAgIGdldE1hcHBlZFByb3BlcnR5OiBkYXRhQXBpLmdldE1hcHBlZFByb3BlcnR5LFxuICAgIGdldE9yaWdpbmFsUHJvcGVydHk6IGRhdGFBcGkuZ2V0T3JpZ2luYWxQcm9wZXJ0eVxuICB9O1xufVxuXG4vKipcbiAqIFtnZXRGaWVsZE5hbWVGcm9tRW1iZWRkZWRGaWVsZE5hbWVdXG4gKiBEZXNjcmlwdGlvbiAgICAtICAgICAgICAgICAgICAgY29udmVydGluZyBlbWJlZGRlZEZpZWxkIG5hbWUgc3RhcnRpbmcgd2l0aCAhUCEgb3IgIVBMISB0byBub3JtYWwgZmllbGRcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eU5hbWUgICBFbWJlZGRlZEZpZWxkIG5hbWUgc3RhcnRpbmcgd2l0aCAhUCEgb3IgIVBMIVxuICogQHJldHVybnMge3N0cmluZ30gICAgICAgICAgICAgIHJldHVybnMgY29udmVydGVkIHN0cmluZyB3aXRob3V0ICFQISBvciAhUEwhIGFuZCA6XG4gKlxuICogQGV4YW1wbGUgPGNhcHRpb24+RXhhbXBsZSBmb3IgZ2V0RmllbGROYW1lRnJvbUVtYmVkZGVkRmllbGROYW1lIDwvY2FwdGlvbj5cbiAqIGdldEZpZWxkTmFtZUZyb21FbWJlZGRlZEZpZWxkTmFtZSgnIVAhT3JnYW5pc2F0aW9uOk5hbWUnKSByZXR1cm4gJ09yZ2FuaXNhdGlvbi5OYW1lJ1xuICogZ2V0RmllbGROYW1lRnJvbUVtYmVkZGVkRmllbGROYW1lKCchUEwhRW1wbG95ZWVzOk5hbWUnKSByZXR1cm4gJ0VtcGxveWVlcy5OYW1lJ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmllbGROYW1lRnJvbUVtYmVkZGVkRmllbGROYW1lKHByb3BlcnR5TmFtZSkge1xuICBsZXQgdmFsdWUgPSBwcm9wZXJ0eU5hbWU7XG4gIGlmICh2YWx1ZS5zdGFydHNXaXRoKFBBR0UpIHx8IHZhbHVlLnN0YXJ0c1dpdGgoUEFHRUxJU1QpKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcodmFsdWUubGFzdEluZGV4T2YoJyEnKSArIDEpO1xuICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvOi9nLCAnLicpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBbdXBkYXRlTWV0YUVtYmVkZGVkRmllbGRJRF1cbiAqIERlc2NyaXB0aW9uICAgIC0gICAgICAgICAgIElmIHRoZSBmaWVsZElEIGluIG1ldGEgc3RhcnRzIHdpdGggJyFQIScgb3IgJyFQTCEnIGFuZCBjb250YWlucyAnOicgdGhlbiByZXBsYWNlIHRoZW0gd2l0aCAuKGRvdClcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSB7QXJyYXl9IG1ldGFGaWVsZHMgIEZpZWxkcyBtZXRhZGF0YSBBcnJheS4gQ29udGFpbnMgbWV0YWRhdGEgb2YgYWxsIHRoZSBmaWVsZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVNZXRhRW1iZWRkZWRGaWVsZElEKG1ldGFGaWVsZHMpIHtcbiAgcmV0dXJuIG1ldGFGaWVsZHMuZm9yRWFjaChtZXRhRmllbGQgPT4ge1xuICAgIGlmIChtZXRhRmllbGQuZmllbGRJRD8uc3RhcnRzV2l0aChQQUdFKSB8fCBtZXRhRmllbGQuZmllbGRJRD8uc3RhcnRzV2l0aChQQUdFTElTVCkpIHtcbiAgICAgIG1ldGFGaWVsZC5maWVsZElEID0gZ2V0RmllbGROYW1lRnJvbUVtYmVkZGVkRmllbGROYW1lKG1ldGFGaWVsZC5maWVsZElEKTtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgaXNFbWJlZGRlZEZpZWxkID0gZmllbGQgPT4ge1xuICBpZiAoZmllbGQ/LnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgIGZpZWxkID0gZmllbGQuc3Vic3RyaW5nKGZpZWxkLmluZGV4T2YoJyAnKSArIDEpO1xuICAgIGlmIChmaWVsZFswXSA9PT0gJy4nKSBmaWVsZCA9IGZpZWxkLnN1YnN0cmluZygxKTtcbiAgfVxuICByZXR1cm4gZmllbGQ/LmluZGV4T2YoJy4nKSA+IDA7XG59O1xuXG4vKipcbiAqIFtpc1BhZ2VMaXN0UHJvcGVydHldXG4gKiBEZXNjcmlwdGlvbiAgICAtICAgICAgICBjaGVja2luZyBpZiBwcm9wZXJ0eU5hbWUgaXMgcGFnZUxpc3Qgb3Igbm90XG4gKiBAaWdub3JlXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlOYW1lICAgUHJvcGVydHlOYW1lXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gIHRydWUgaWYgcHJvcGVydHkgaXMgcGFnZUxpc3QgZWxzZSBmYWxzZVxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkV4YW1wbGUgZm9yIGlzUGFnZUxpc3RQcm9wZXJ0eSA8L2NhcHRpb24+XG4gKiBpc1BhZ2VMaXN0UHJvcGVydHkoJyFQTCFFbXBsb3llZXMuTmFtZScpIHJldHVybiB0cnVlXG4gKiBpc1BhZ2VMaXN0UHJvcGVydHkoJyFQIUVtcGxveWVlcy5OYW1lJykgcmV0dXJuIGZhbHNlXG4gKiBpc1BhZ2VMaXN0UHJvcGVydHkoJ05hbWUnKSByZXR1cm4gZmFsc2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUGFnZUxpc3RQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpIHtcbiAgcmV0dXJuIHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKFBBR0VMSVNUKTtcbn1cblxuZXhwb3J0IGNvbnN0IGlzUGFnZUxpc3RJblBhdGggPSAocHJvcGVydHlOYW1lLCBjdXJyZW50Q2xhc3NJRCkgPT4ge1xuICBpZiAoIXByb3BlcnR5TmFtZS5pbmNsdWRlcygnLicpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IFtmaXJzdCwgLi4ucmVzdF0gPSBwcm9wZXJ0eU5hbWUuc3BsaXQoJy4nKTtcbiAgY29uc3QgbWV0YWRhdGEgPSBQQ29yZS5nZXRNZXRhZGF0YVV0aWxzKCkuZ2V0UHJvcGVydHlNZXRhZGF0YShmaXJzdCwgY3VycmVudENsYXNzSUQpO1xuICBpZiAobWV0YWRhdGE/LnR5cGUgPT09ICdQYWdlIExpc3QnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGlzUGFnZUxpc3RJblBhdGgocmVzdC5qb2luKCcuJyksIG1ldGFkYXRhPy5wYWdlQ2xhc3MpO1xufTtcblxuLyoqXG4gKiBbZ2V0RW1iZWRkZWRGaWVsZE5hbWVdXG4gKiBEZXNjcmlwdGlvbiAgICAtICAgICAgICAgICAgICAgY29udmVydGluZyBub3JtYWwgZmllbGQgbmFtZSB0byBlbWJlZGRlZCBmaWVsZCBzdGFydGluZyB3aXRoICFQISBvciAhUEwhXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHlOYW1lICAgRmllbGQgbmFtZVxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzSUQgICAgICAgIGNsYXNzSUQgb2YgZGF0YXBhZ2VcbiAqIEByZXR1cm5zIHtzdHJpbmd9ICAgICAgICAgICAgICByZXR1cm5zIGNvbnZlcnRlZCBzdHJpbmcgd2l0aCAhUCEgb3IgIVBMISBhbmQgOlxuICpcbiAqIEBleGFtcGxlIDxjYXB0aW9uPkV4YW1wbGUgZm9yIGdldEVtYmVkZGVkRmllbGROYW1lIDwvY2FwdGlvbj5cbiAqIEZvciBwYWdlIHByb3BlcnR5LCBnZXRFbWJlZGRlZEZpZWxkTmFtZSgnT3JnYW5pc2F0aW9uLk5hbWUnKSByZXR1cm4gJyFQIU9yZ2FuaXNhdGlvbjpOYW1lJ1xuICogRm9yIHBhZ2VMaXN0IHByb3BlcnR5LCBnZXRFbWJlZGRlZEZpZWxkTmFtZSgnRW1wbG95ZWVzLk5hbWUnKSByZXR1cm4gJyFQTCFFbXBsb3llZXM6TmFtZSdcbiAqL1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RW1iZWRkZWRGaWVsZE5hbWUocHJvcGVydHlOYW1lLCBjbGFzc0lEKSB7XG4gIGxldCB2YWx1ZSA9IHByb3BlcnR5TmFtZTtcbiAgaWYgKGlzUGFnZUxpc3RJblBhdGgodmFsdWUsIGNsYXNzSUQpKSB7XG4gICAgdmFsdWUgPSBgIVBMISR7dmFsdWUucmVwbGFjZSgvXFwuL2csICc6Jyl9YDtcbiAgfSBlbHNlIHtcbiAgICB2YWx1ZSA9IGAhUCEke3ZhbHVlLnJlcGxhY2UoL1xcLi9nLCAnOicpfWA7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFtwcmVwYXJlUHJvcGVydHlNYXBzXVxuICogRGVzY3JpcHRpb24gICAgLSAgICAgICAgcHJlcGFyaW5nIG1hcHMgZm9yIHByb3BlcnR5IG5hbWVzIGFuZCBzZXQgaXQgaW4gZGF0YUFwaSBjb250ZXh0XG4gKiBAaWdub3JlXG4gKiBAcGFyYW0ge0FycmF5fSBmaWVsZHMgICBmaWVsZHMgYXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc0lEICBjbGFzc0lEIG9mIGRhdGFwYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gY29udGV4dCAgZGF0YUFwaSBjb250ZXh0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBwYWdlTGlzdFByb3BlcnR5IGlzIHByZXNlbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVQcm9wZXJ0eU1hcHMoZmllbGRzLCBjbGFzc0lELCBjb250ZXh0KSB7XG4gIGNvbnN0IHsgc2V0UHJvcGVydHlNYXBzIH0gPSBjb250ZXh0O1xuICBjb25zdCBtYXBzID0gZmllbGRzLnJlZHVjZShcbiAgICAoYWNjLCBmaWVsZCkgPT4ge1xuICAgICAgbGV0IHsgdmFsdWUgfSA9IGZpZWxkLmNvbmZpZztcbiAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcodmFsdWUuaW5kZXhPZignICcpICsgMSk7XG4gICAgICAgIGlmICh2YWx1ZVswXSA9PT0gJy4nKSB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxKTtcbiAgICAgIH1cbiAgICAgIGxldCBuYW1lID0gdmFsdWU7XG4gICAgICAvLyBQcmVwYXJpbmcgbmFtZSBmb3IgZW1iZWRkZWQgcHJvcGVydHlcbiAgICAgIGlmIChpc0VtYmVkZGVkRmllbGQobmFtZSkpIHtcbiAgICAgICAgbmFtZSA9IGdldEVtYmVkZGVkRmllbGROYW1lKG5hbWUsIGNsYXNzSUQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUGFnZUxpc3RQcm9wZXJ0eShuYW1lKSAmJiAhYWNjWzJdKSB7XG4gICAgICAgIGFjY1syXSA9IHRydWU7XG4gICAgICB9XG4gICAgICBhY2NbMF1bdmFsdWVdID0gbmFtZTtcbiAgICAgIGFjY1sxXVtuYW1lXSA9IHZhbHVlO1xuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sXG4gICAgW3t9LCB7fSwgZmFsc2VdXG4gICk7XG4gIHNldFByb3BlcnR5TWFwcyhtYXBzWzBdLCBtYXBzWzFdKTtcbiAgcmV0dXJuIG1hcHNbMl07XG59XG5cbi8qKlxuICogW2dldENvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YV1cbiAqIERlc2NyaXB0aW9uICAgIC0gICAgICAgICAgIEdldCB0aGUgbWV0YWRhdGEgZm9yIGNvbmZpZ3VyZWQgZW1iZWRkZWQgZmllbGRzXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0ge1NldH0gY29uZmlnRmllbGRzICBTZXQgb2YgY29uZmlnIGZpZWxkc1xuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzSUQgICAgY2xhc0lEIG9mIGRhdGFwYWdlXG4gKiBAcmV0dXJucyB7QXJyYXl9ICAgICAgICAgICBNZXRhZGF0YSBvZiBjb25maWd1cmVkIGVtYmVkZGVkIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhKGNvbmZpZ0ZpZWxkcywgY2xhc3NJRCkge1xuICBjb25zdCBjb25maWdFbWJlZGRlZEZpZWxkc01ldGE6IGFueVtdID0gW107XG4gIGNvbmZpZ0ZpZWxkcy5mb3JFYWNoKGZpZWxkID0+IHtcbiAgICBsZXQgdmFsdWUgPSBmaWVsZDtcbiAgICBpZiAoaXNFbWJlZGRlZEZpZWxkKHZhbHVlKSkge1xuICAgICAgLy8gY29udmVyc2lvbiBQYWdlLlBhZ2VMaXN0W10ucHJvcGVydHkgPT4gUGFnZS5QYWdlTGlzdC5wcm9wZXJ0eVxuICAgICAgaWYgKHZhbHVlLmluY2x1ZGVzKCdbJykpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUuaW5kZXhPZignWycpKSArIHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5pbmRleE9mKCddJykgKyAxKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1ldGEgPSBQQ29yZS5nZXRNZXRhZGF0YVV0aWxzKCkuZ2V0RW1iZWRkZWRQcm9wZXJ0eU1ldGFkYXRhKHZhbHVlLCBjbGFzc0lEKTtcbiAgICAgIG1ldGEuZmllbGRJRCA9IGZpZWxkO1xuICAgICAgY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhLnB1c2gobWV0YSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGNvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YTtcbn1cblxuLyoqXG4gKiBbbWVyZ2VDb25maWdFbWJlZGRlZEZpZWxkc01ldGFdXG4gKiBEZXNjcmlwdGlvbiAgICAtICAgICAgICAgICBHZXQgdGhlIG1ldGFkYXRhIGZvciBjb25maWd1cmVkIGVtYmVkZGVkIGZpZWxkc1xuICogQGlnbm9yZVxuICogQHBhcmFtIHtBcnJheX0gY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhICBjb25maWcgZmllbGRzIG1ldGFkYXRhLlxuICogQHBhcmFtIHtBcnJheX0gbWV0YUZpZWxkcyAgRmllbGRzIG1ldGFkYXRhIEFycmF5LiBDb250YWlucyBtZXRhZGF0YSBvZiBhbGwgdGhlIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb25maWdFbWJlZGRlZEZpZWxkc01ldGEoY29uZmlnRW1iZWRkZWRGaWVsZHNNZXRhLCBtZXRhRmllbGRzKSB7XG4gIGNvbnN0IG1lcmdlZE1ldGFGaWVsZHMgPSBbLi4ubWV0YUZpZWxkc107XG4gIGNvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YS5mb3JFYWNoKGNvbmZpZ0ZpZWxkTWV0YSA9PiB7XG4gICAgY29uc3QgZmllbGRNZXRhID0gbWV0YUZpZWxkcy5maW5kKG1ldGFGaWVsZCA9PiBtZXRhRmllbGQuZmllbGRJRCA9PT0gY29uZmlnRmllbGRNZXRhLmZpZWxkSUQpO1xuICAgIGlmICghZmllbGRNZXRhKSBtZXJnZWRNZXRhRmllbGRzLnB1c2goY29uZmlnRmllbGRNZXRhKTtcbiAgfSk7XG4gIHJldHVybiBtZXJnZWRNZXRhRmllbGRzO1xufVxuXG5jb25zdCBvbGRUb05ld0ZpZWxkVHlwZU1hcHBpbmcgPSB7XG4gICdEYXRlIFRpbWUnOiAnRGF0ZSAmIHRpbWUnLFxuICBEYXRlOiAnRGF0ZSBvbmx5J1xufTtcblxuLyoqXG4gKiBbdXBkYXRlRmllbGRUeXBlXVxuICogRGVzY3JpcHRpb24gICAgLSAgICAgICAgICAgVXBkYXRlcyB0aGUgZmllbGQgdHlwZSBpZiBpdHMgY2hhbmdlZCBpbiB0aGUgbmV3IGltcGxlbWVudGF0aW9uLiBTdWNoIG1hcHBpbmcgaXMgbWFpbnRhaW5lZCBpbiBvbGRUb05ld0ZpZWxkVHlwZU1hcHBpbmcuXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0ge0FycmF5fSBtZXRhRmllbGRzICBGaWVsZHMgbWV0YWRhdGEgQXJyYXkuIENvbnRhaW5zIG1ldGFkYXRhIG9mIGFsbCB0aGUgZmllbGRzLlxuICovXG5mdW5jdGlvbiB1cGRhdGVGaWVsZFR5cGUobWV0YUZpZWxkcykge1xuICBtZXRhRmllbGRzLmZvckVhY2gobWV0YUZpZWxkID0+IHtcbiAgICBpZiAobWV0YUZpZWxkLnR5cGUpIG1ldGFGaWVsZC50eXBlID0gb2xkVG9OZXdGaWVsZFR5cGVNYXBwaW5nW21ldGFGaWVsZC50eXBlXSB8fCBtZXRhRmllbGQudHlwZTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldFByZXNldE1ldGFBdHRyaWJ1dGUoYXR0cmlidXRlKSB7XG4gIGNvbnN0IHtcbiAgICB0eXBlLFxuICAgIGNvbmZpZzogeyBsYWJlbCwgdmFsdWUgfVxuICB9ID0gYXR0cmlidXRlO1xuICByZXR1cm4ge1xuICAgIHR5cGUsXG4gICAgbmFtZTogdmFsdWUuc3RhcnRzV2l0aCgnQCcpID8gdmFsdWUuc3Vic3RyaW5nKDQpIDogdmFsdWUsXG4gICAgbGFiZWw6IGxhYmVsLnN0YXJ0c1dpdGgoJ0AnKSA/IGxhYmVsLnN1YnN0cmluZygzKSA6IGxhYmVsXG4gIH07XG59XG5cbi8qKlxuICogW2dlbmVyYXRlVmlld01ldGFEYXRhXVxuICogRGVzY3JpcHRpb24gLSBSZXR1cm5zIGEgbGlzdCBvZiAgbWV0YW9iamVjdHMgb2YgdGhlIGZpZWxkcyBwcm92aWRlZC5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtBcnJheX0gICByYXdGaWVsZHMgICAgICAgICBMaXN0IG9mIGZpZWxkcyB0byB1cGRhdGUgbWV0YSBmb3JcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICBjbGFzc0lEICAgICAgICAgIENsYXNzIElEIGZyb20gdGhlIHJlc3BvbnNlXG4gKiBAcmV0dXJucyB7QXJyYXl9ICAgICAgICAgICAgICAgICAgICBMaXN0IG9mIGZpZWxkcyB3aXRoIHVwZGF0ZWQgbWV0YSBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZVZpZXdNZXRhRGF0YShyYXdGaWVsZHMsIGNsYXNzSUQsIHNob3dGaWVsZCkge1xuICByZXR1cm4gcmF3RmllbGRzLm1hcChpdGVtID0+IGdldERlZmF1bHRWaWV3TWV0YShpdGVtLCBjbGFzc0lELCBzaG93RmllbGQpKTtcbn1cblxuLyoqXG4gKiBbZ2V0Q29uZmlnRmllbGRzXVxuICogRGVzY3JpcHRpb24gLSBSZXR1cm5zIGxpc3Qgb2YgY29uZmlnIGZpZWxkcyB3aXRoIHByaW1hcnkgZmllbGRzIG1ldGEgdXBkYXRlZC5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtBcnJheX0gICBjb25maWdGaWVsZHMgICAgICBMaXN0IG9mIEF1dGhvcmVkIGZpZWxkc1xuICogQHBhcmFtICAge0FycmF5fSAgIHByaW1hcnlGaWVsZHMgICAgIExpc3Qgb2YgUHJpbWFyeSBGaWVsZHNcbiAqIEBwYXJhbSAgIHtBcnJheX0gICBtZXRhRmllbGRzICAgICAgICBNZXRhZGF0YSBvZiBhbGwgZmllbGRzXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgY2xhc3NJRCAgICAgICAgICAgQ2xhc3MgSUQgZnJvbSB0aGUgcmVzcG9uc2VcbiAqIEByZXR1cm5zIHtBcnJheX0gICAgICAgICAgICAgICAgICAgICBMaXN0IG9mIGFsbCBmaWVsZHMgd2l0aCB0aGVpciBtZXRhIHVwZGF0ZWQuXG4gKi9cbmZ1bmN0aW9uIGdldENvbmZpZ0ZpZWxkcyhjb25maWdGaWVsZHMsIHByaW1hcnlGaWVsZHMsIG1ldGFGaWVsZHMsIGNsYXNzSUQpIHtcbiAgY29uc3QgcHJlc2V0Q29uZmlnRmllbGRzID0gY29uZmlnRmllbGRzO1xuICBjb25zdCBwcmltYXJ5RmllbGRzVmlld0luZGV4ID0gcHJlc2V0Q29uZmlnRmllbGRzLmZpbmRJbmRleChmaWVsZCA9PiBmaWVsZC5jb25maWcudmFsdWUgPT09ICdweVByaW1hcnlGaWVsZHMnKTtcbiAgaWYgKCFwcmltYXJ5RmllbGRzIHx8ICFwcmltYXJ5RmllbGRzLmxlbmd0aCkge1xuICAgIGlmIChwcmltYXJ5RmllbGRzVmlld0luZGV4IDwgMCkgcmV0dXJuIHByZXNldENvbmZpZ0ZpZWxkcztcblxuICAgIHByZXNldENvbmZpZ0ZpZWxkcy5zcGxpY2UocHJpbWFyeUZpZWxkc1ZpZXdJbmRleCwgMSk7XG5cbiAgICByZXR1cm4gcHJlc2V0Q29uZmlnRmllbGRzO1xuICB9XG5cbiAgaWYgKHByaW1hcnlGaWVsZHNWaWV3SW5kZXggPiAtMSkge1xuICAgIC8vIGxpc3Qgb2YgdW5jb21tb24gZmllbGRzIC0gbm9uIG92ZXJsYXAgb2YgcHJpbWFyeSBmaWVsZHMgZ3JvdXBlZCB2aWV3IGFuZCBpbmRlcGVuZGVudCBlbnRpdHkgY29sdW1ucyBvZiBwcmltYXJ5IHR5cGVcbiAgICBjb25zdCB1bmNvbW1vbkZpZWxkc0xpc3QgPSBwcmltYXJ5RmllbGRzLmZpbHRlcihcbiAgICAgIHByaW1hcnlGaWVsZCA9PiAhcHJlc2V0Q29uZmlnRmllbGRzLnNvbWUocHJlc2V0Q29uZmlnRmllbGQgPT4gcHJlc2V0Q29uZmlnRmllbGQuY29uZmlnLnZhbHVlLnNwbGl0KCcuJylbMV0gPT09IHByaW1hcnlGaWVsZClcbiAgICApO1xuICAgIGNvbnN0IHVuY29tbW9uRmllbGRzUmF3TWV0YTogYW55W10gPSBbXTtcbiAgICB1bmNvbW1vbkZpZWxkc0xpc3QuZm9yRWFjaCh1bmNvbW1vbkZpZWxkID0+IHtcbiAgICAgIGNvbnN0IHVuY29tbW9uRmllbGRNZXRhID0gbWV0YUZpZWxkcy5maW5kKG1ldGFGaWVsZCA9PiBtZXRhRmllbGQuZmllbGRJRCA9PT0gdW5jb21tb25GaWVsZCk7XG4gICAgICBpZiAodW5jb21tb25GaWVsZE1ldGEpIHVuY29tbW9uRmllbGRzUmF3TWV0YS5wdXNoKHVuY29tbW9uRmllbGRNZXRhKTtcbiAgICB9KTtcbiAgICBjb25zdCB1bmNvbW1vbkZpZWxkc0NvbmZpZ01ldGEgPSBnZW5lcmF0ZVZpZXdNZXRhRGF0YSh1bmNvbW1vbkZpZWxkc1Jhd01ldGEsIGNsYXNzSUQsIHRydWUpO1xuXG4gICAgcHJlc2V0Q29uZmlnRmllbGRzLnNwbGljZShwcmltYXJ5RmllbGRzVmlld0luZGV4LCAxLCAuLi51bmNvbW1vbkZpZWxkc0NvbmZpZ01ldGEpO1xuICB9XG4gIHJldHVybiBwcmVzZXRDb25maWdGaWVsZHM7XG59XG5cbi8qKlxuICogW2dldFRhYmxlQ29uZmlnRnJvbVByZXNldE1ldGFdXG4gKiBEZXNjcmlwdGlvbiAtIEdldCB0aGUgdGFibGUgY29uZmlnIGZyb20gdGhlIHByZXNldHMgbWV0YS5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtvYmplY3R9ICAgIHByZXNldE1ldGEgICAgICAgICAgUHJlc2V0cyBtZXRhXG4gKiBAcGFyYW0gICB7Ym9vbGVhbn0gICBpc01ldGFXaXRoUHJlc2V0cyAgIHRydWUgaWYgbWV0YSBoYXMgcHJlc2V0cyBlbHNlIGZhbHNlXG4gKiBAcGFyYW0gICB7RnVuY3Rpb259ICBnZXRQQ29ubmVjdCAgICAgICAgIENhbGxiYWNrIHRvIGdldCB0aGUgUENvbm5lY3Qgb2JqZWN0XG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgICBjbGFzc0lEICAgICAgICAgICAgIENsYXNzIElEIGZyb20gdGhlIHJlc3BvbnNlXG4gKiBAcGFyYW0gICB7QXJyYXl9ICAgICBwcmltYXJ5RmllbGRzICAgICAgIExpc3Qgb2YgUHJpbWFyeSBGaWVsZHNcbiAqIEBwYXJhbSAgIHtBcnJheX0gICAgIG1ldGFGaWVsZHMgICAgICAgICAgTGlzdCBvZiBhbGwgbWV0YWZpZWxkc1xuICogQHJldHVybnMge29iamVjdH0gICAgICAgICAgICAgICAgICAgICAgICBUYWJsZSBjb25maWcgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZUNvbmZpZ0Zyb21QcmVzZXRNZXRhKHByZXNldE1ldGEsIGlzTWV0YVdpdGhQcmVzZXRzLCBwQ29ubiQsIGNsYXNzSUQsIHByaW1hcnlGaWVsZHMsIG1ldGFGaWVsZHMpIHtcbiAgbGV0IHByZXNldElkO1xuICBsZXQgcHJlc2V0TmFtZTtcbiAgbGV0IGNhcmRIZWFkZXI7XG4gIGxldCBzZWNvbmRhcnlUZXh0O1xuICBsZXQgdGltZWxpbmVEYXRlO1xuICBsZXQgdGltZWxpbmVUaXRsZTtcbiAgbGV0IHRpbWVsaW5lU3RhdHVzO1xuICBsZXQgdGltZWxpbmVJY29uO1xuICBsZXQgeyBmaWx0ZXJFeHByZXNzaW9uIH0gPSBwQ29ubiQuZ2V0UmF3TWV0YWRhdGEoKS5jb25maWc7XG4gIGxldCBmaWVsZHNNZXRhO1xuICBsZXQgY29uZmlnRmllbGRzO1xuICBpZiAoaXNNZXRhV2l0aFByZXNldHMpIHtcbiAgICBwcmVzZXRJZCA9IHByZXNldE1ldGEuaWQ7XG4gICAgcHJlc2V0TmFtZSA9IHByZXNldE1ldGEubGFiZWw7XG4gICAgY2FyZEhlYWRlciA9IHByZXNldE1ldGEuY2FyZEhlYWRlciAmJiBnZXRQcmVzZXRNZXRhQXR0cmlidXRlKHByZXNldE1ldGEuY2FyZEhlYWRlcik7XG4gICAgc2Vjb25kYXJ5VGV4dCA9IHByZXNldE1ldGEuc2Vjb25kYXJ5VGV4dCAmJiBnZXRQcmVzZXRNZXRhQXR0cmlidXRlKHByZXNldE1ldGEuc2Vjb25kYXJ5VGV4dCk7XG4gICAgdGltZWxpbmVEYXRlID0gcHJlc2V0TWV0YS50aW1lbGluZURhdGUgJiYgZ2V0UHJlc2V0TWV0YUF0dHJpYnV0ZShwcmVzZXRNZXRhLnRpbWVsaW5lRGF0ZSk7XG4gICAgdGltZWxpbmVUaXRsZSA9IHByZXNldE1ldGEudGltZWxpbmVUaXRsZSAmJiBnZXRQcmVzZXRNZXRhQXR0cmlidXRlKHByZXNldE1ldGEudGltZWxpbmVUaXRsZSk7XG4gICAgdGltZWxpbmVTdGF0dXMgPSBwcmVzZXRNZXRhLnRpbWVsaW5lU3RhdHVzICYmIGdldFByZXNldE1ldGFBdHRyaWJ1dGUocHJlc2V0TWV0YS50aW1lbGluZVN0YXR1cyk7XG4gICAgdGltZWxpbmVJY29uID0gcHJlc2V0TWV0YS50aW1lbGluZUljb24gJiYgZ2V0UHJlc2V0TWV0YUF0dHJpYnV0ZShwcmVzZXRNZXRhLnRpbWVsaW5lSWNvbik7XG4gICAgZmlsdGVyRXhwcmVzc2lvbiA9IHByZXNldE1ldGEuY29uZmlnLmZpbHRlckV4cHJlc3Npb247XG4gICAgW2ZpZWxkc01ldGFdID0gcHJlc2V0TWV0YS5jaGlsZHJlbjtcbiAgICBpZiAoXG4gICAgICBwcmVzZXRNZXRhLnRpbWVsaW5lVGl0bGUgJiZcbiAgICAgICFmaWVsZHNNZXRhLmNoaWxkcmVuLmZpbmQoZmllbGRNZXRhID0+IHtcbiAgICAgICAgcmV0dXJuIGZpZWxkTWV0YT8uY29uZmlnPy52YWx1ZSA9PT0gcHJlc2V0TWV0YS50aW1lbGluZVRpdGxlPy5jb25maWc/LnZhbHVlO1xuICAgICAgfSlcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgdHlwZSwgY29uZmlnIH0gPSBwcmVzZXRNZXRhLnRpbWVsaW5lVGl0bGU7XG4gICAgICBmaWVsZHNNZXRhLmNoaWxkcmVuLnB1c2goeyB0eXBlLCBjb25maWc6IHsgLi4uY29uZmlnLCBzaG93OiBmYWxzZSB9IH0pO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBwcmVzZXRNZXRhLnRpbWVsaW5lRGF0ZSAmJlxuICAgICAgIWZpZWxkc01ldGEuY2hpbGRyZW4uZmluZChmaWVsZE1ldGEgPT4ge1xuICAgICAgICByZXR1cm4gZmllbGRNZXRhPy5jb25maWc/LnZhbHVlID09PSBwcmVzZXRNZXRhLnRpbWVsaW5lRGF0ZT8uY29uZmlnPy52YWx1ZTtcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICBjb25zdCB7IHR5cGUsIGNvbmZpZyB9ID0gcHJlc2V0TWV0YS50aW1lbGluZURhdGU7XG4gICAgICBmaWVsZHNNZXRhLmNoaWxkcmVuLnB1c2goeyB0eXBlLCBjb25maWc6IHsgLi4uY29uZmlnLCBzaG93OiBmYWxzZSB9IH0pO1xuICAgIH1cbiAgICBjb25maWdGaWVsZHMgPSBnZXRDb25maWdGaWVsZHMoZmllbGRzTWV0YS5jaGlsZHJlbiwgcHJpbWFyeUZpZWxkcywgbWV0YUZpZWxkcywgY2xhc3NJRCk7XG4gIH0gZWxzZSB7XG4gICAgZmllbGRzTWV0YSA9IHByZXNldE1ldGEucHJvcHM7XG4gICAgY29uZmlnRmllbGRzID0gZ2V0Q29uZmlnRmllbGRzKFxuICAgICAgZmllbGRzTWV0YVxuICAgICAgICAuZ2V0UENvbm5lY3QoKVxuICAgICAgICAuZ2V0Q2hpbGRyZW4oKVxuICAgICAgICA/Lm1hcChjaGlsZCA9PiB7XG4gICAgICAgICAgcmV0dXJuIGNoaWxkLmdldFBDb25uZWN0KCkuZ2V0UmF3TWV0YWRhdGEoKTtcbiAgICAgICAgfSksXG4gICAgICBwcmltYXJ5RmllbGRzLFxuICAgICAgbWV0YUZpZWxkcyxcbiAgICAgIGNsYXNzSURcbiAgICApO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHJlc2V0SWQsXG4gICAgcHJlc2V0TmFtZSxcbiAgICBjYXJkSGVhZGVyLFxuICAgIHNlY29uZGFyeVRleHQsXG4gICAgdGltZWxpbmVEYXRlLFxuICAgIHRpbWVsaW5lVGl0bGUsXG4gICAgdGltZWxpbmVTdGF0dXMsXG4gICAgdGltZWxpbmVJY29uLFxuICAgIGZpbHRlckV4cHJlc3Npb24sXG4gICAgZmllbGRzTWV0YSxcbiAgICBjb25maWdGaWVsZHNcbiAgfTtcbn1cblxuLyoqXG4gKiBbZ2V0UmVwb3J0Q29sdW1uc11cbiAqIERlc2NyaXB0aW9uIC0gUmV0dXJucyBhIHNldCBvZiBjb2x1bW5zIGZyb20gdGhlIHJlcG9ydCByZXNwb25zZS5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtvYmplY3R9IHJlc3BvbnNlIC1cbiAqIEByZXR1cm5zIHtTZXR9IFNldCBvZiBjb2x1bW5zIGZyb20gdGhlIHJlcG9ydCByZXNwb25zZVxuICovXG5mdW5jdGlvbiBnZXRSZXBvcnRDb2x1bW5zKHJlc3BvbnNlKSB7XG4gIGNvbnN0IHtcbiAgICBkYXRhOiB7IGRhdGE6IHJlcG9ydENvbHVtbnMgfVxuICB9ID0gcmVzcG9uc2U7XG4gIGNvbnN0IHJlcG9ydENvbHVtbnNTZXQgPSBuZXcgU2V0KCk7XG4gIHJlcG9ydENvbHVtbnM/LmZvckVhY2goaXRlbSA9PiB7XG4gICAgbGV0IHZhbCA9IGl0ZW0ucHlGaWVsZE5hbWU7XG4gICAgLy8gUmVtb3ZlICcuJyBmcm9tIGluZGV4IDAgb25seSwgaWYgJy4nIGlzIHByZXNlbnRcbiAgICBpZiAodmFsWzBdID09PSAnLicpIHtcbiAgICAgIHZhbCA9IHZhbC5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIHJlcG9ydENvbHVtbnNTZXQuYWRkKHZhbCk7XG4gIH0pO1xuICByZXR1cm4gcmVwb3J0Q29sdW1uc1NldDtcbn1cblxuLyoqXG4gKiBbZ2V0Q29uZmlnRmllbGRWYWx1ZV1cbiAqIERlc2NyaXRwaW9uIC0gUmV0dXJucyBhIHZhbGlkIHZhbHVlIGZvciBhIGNvbmZpZ3VyYXRpb24gZmllbGQuIFJlbW92ZSBhbnkgYW5ub3RhdGlvbnMgYW5kIGFsc28gXCIuXCJcbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtvYmplY3R9IGNvbmZpZ1xuICogICAgICAgICAgICAgICAgICAgY29uZmlnLnZhbHVlIC0gUmF3IHZhbHVlXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB2YWx1ZSAtIFZhbHVlIHdpdGggb3V0IGFueSBhbm5vdGF0aW9ucyBvciBcIi5cIlxuICovXG5mdW5jdGlvbiBnZXRDb25maWdGaWVsZFZhbHVlKGNvbmZpZykge1xuICBsZXQgeyB2YWx1ZSB9ID0gY29uZmlnO1xuICBpZiAodmFsdWUuc3RhcnRzV2l0aCgnQCcpKSB7XG4gICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcodmFsdWUuaW5kZXhPZignICcpICsgMSk7XG4gICAgaWYgKHZhbHVlWzBdID09PSAnLicpIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBbcHJlcGFyZUNvbmZpZ0ZpZWxkc11cbiAqIERlc2NyaXB0aW9uIC0gUHJlcGFyZXMgYSBzZXQgb2YgY29uZmlndXJhdGlvbiBmaWVsZHMgYW5kIHB1c2hlcyBlYWNoIGNvbmZpZyB0eXBlIHRvIGEgc2V0IHVzaW5nIHRoZSBjYWxsYmFjayBwYXJhbWV0ZXIuXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0gICB7b2JqZWN0fSAgICBjb25maWdGaWVsZHMgICAgICAgICAgTGlzdCBvZiBBdXRob3JlZCBmaWVsZHNcbiAqIEBwYXJhbSAgIHtGdW5jdGlvbn0gIHB1c2hUb0NvbXBvbmVudHNMaXN0IENhbGxiYWNrIHRvIHB1c2ggdGhlIGZpZWxkIHR5cGUgdG8gYSBzZXQuXG4gKiBAcmV0dXJucyB7U2V0fSAgICAgICBjb25maWdGaWVsZFNldFxuICovXG5mdW5jdGlvbiBwcmVwYXJlQ29uZmlnRmllbGRzKGNvbmZpZ0ZpZWxkcywgcHVzaFRvQ29tcG9uZW50c0xpc3QpIHtcbiAgY29uc3QgY29uZmlnRmllbGRTZXQgPSBuZXcgU2V0KCk7XG4gIGNvbmZpZ0ZpZWxkcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIHB1c2hUb0NvbXBvbmVudHNMaXN0KGl0ZW0udHlwZSk7XG4gICAgY29uc3QgdmFsID0gZ2V0Q29uZmlnRmllbGRWYWx1ZShpdGVtLmNvbmZpZyk7XG4gICAgY29uZmlnRmllbGRTZXQuYWRkKHZhbCk7XG4gIH0pO1xuICByZXR1cm4gY29uZmlnRmllbGRTZXQ7XG59XG5cbi8qKlxuICogW2ZpbmRBdXRob3JlZEZpZWxkXVxuICogRGVzY3JpcHRpb24gLSBGaW5kcyBhbiBhdXRob3JlZCBmaWVsZCBmcm9tIHloZSBsaXN0IG9mIGNvbmZpZyBmaWVsZHMuXG4gKiBAaWdub3JlXG4gKiBAcGFyYW0gICB7QXJyYXl9ICAgY29uZmlnRmllbGRzIExpc3Qgb2YgQXV0aG9yZWQgZmllbGRzXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgZmllbGRJRCAgICAgIEZpbHRlclxuICogQHJldHVybnMge29iamVjdH0gICAgICAgICAgICAgIGNvbmZpZyB3aXRoIGl0cyBmaWVsZCB2YWx1ZSBlcXVhbCB0byBmaWVsZElELCB3aGljaCBtZWFucyBhbiBhdXRob3JlZCBmaWVsZFxuICovXG5mdW5jdGlvbiBmaW5kQXV0aG9yZWRGaWVsZChjb25maWdGaWVsZHMsIGZpZWxkSUQpIHtcbiAgcmV0dXJuIGNvbmZpZ0ZpZWxkcy5maW5kKGNvbmZpZ0ZpZWxkID0+IHtcbiAgICBjb25zdCB2YWwgPSBnZXRDb25maWdGaWVsZFZhbHVlKGNvbmZpZ0ZpZWxkLmNvbmZpZyk7XG4gICAgcmV0dXJuIHZhbCA9PT0gZmllbGRJRDtcbiAgfSk7XG59XG5cbi8qKlxuICogW2ZpbmRBbmRVcGRhdGVBdXRob3JlZEZpZWxkQ29uZmlnXVxuICogRGVzY3JpcHRpb24gLSBGaW5kIHRoZSBhdXRob3JlZCBmaWVsZCwgYW5kIHVwZGF0ZSBpdHMgY29uZmlnLlxuICogQGlnbm9yZVxuICogQHBhcmFtICAge0FycmF5fSAgIGNvbmZpZ0ZpZWxkcyBMaXN0IG9mIEF1dGhvcmVkIGZpZWxkc1xuICogQHBhcmFtICAge29iamVjdH0gIGl0ZW0gICAgICAgIEZpZWxkIGl0ZW0gdG8gY29weSBkaXNwbGF5QXMgYW5kIGNhdGVnb3J5IGluZm9ybWF0aW9uXG4gKiBAcGFyYW0gICB7c3RyaW5nfSAgY2xhc3NJZCAgICAgY2xhc3NJRCBmcm9tIHRoZSByZXNwb25zZVxuICovXG5mdW5jdGlvbiBmaW5kQW5kVXBkYXRlQXV0aG9yZWRGaWVsZENvbmZpZyhjb25maWdGaWVsZHMsIGl0ZW0sIGNsYXNzSWQpIHtcbiAgY29uc3QgYXV0aG9yZWRGaWVsZCA9IGZpbmRBdXRob3JlZEZpZWxkKGNvbmZpZ0ZpZWxkcywgaXRlbS5maWVsZElEKTtcbiAgaWYgKGF1dGhvcmVkRmllbGQ/LmNvbmZpZykge1xuICAgIGlmIChpdGVtLmRpc3BsYXlBcykge1xuICAgICAgYXV0aG9yZWRGaWVsZC5jb25maWcuZGlzcGxheUFzID0gaXRlbS5kaXNwbGF5QXM7XG4gICAgfVxuICAgIGF1dGhvcmVkRmllbGQuY29uZmlnLmNsYXNzSUQgPSBpdGVtLmNsYXNzSUQgPz8gY2xhc3NJZDtcblxuICAgIGlmIChhdXRob3JlZEZpZWxkLnR5cGUgPT09IFVTRVJfUkVGRVJFTkNFKSB7XG4gICAgICBhdXRob3JlZEZpZWxkLmNvbmZpZy5hc3NvY2lhdGlvbklEID0gaXRlbS5hc3NvY2lhdGlvbklEIHx8IGl0ZW0uZmllbGRJRDtcbiAgICB9XG4gICAgYXV0aG9yZWRGaWVsZC5jb25maWcuY2F0ZWdvcnkgPSBpdGVtLmNhdGVnb3J5O1xuICAgIC8vIEZpZWxkVHlwZSBpZGVudGlmaWVzIHdoZXRoZXIgdGhlIGZpZWxkIGlzIGNvbmZpZ3VyZWQgYXMgcGlja0xpc3RcbiAgICBhdXRob3JlZEZpZWxkLmNvbmZpZy5maWVsZFR5cGUgPSBpdGVtLmZpZWxkVHlwZTtcbiAgICAvLyB0eXBlIGRlZmluZWQgb24gdGhlIHByb3BlcnR5IHJ1bGUsXG4gICAgLy8gdXNlZCBmb3IgdGhlIHBpY2tsaXN0IGZpZWxkIHRvIGFzc2lnbiB0aGUgYXBwcm9wcmlhdGUgdHlwZVxuICAgIGF1dGhvcmVkRmllbGQuY29uZmlnLnByb3BlcnR5VHlwZSA9IGl0ZW0uZGF0YVR5cGUgfHwgaXRlbS50eXBlO1xuICB9XG59XG5cbi8qKlxuICogW2lzQW5FeHRyYUZpZWxkXVxuICogRGVzY3JpcHRpb24gLSBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGlzIGFuIGV4dHJhIGZpZWxkLiBFeHRyYSBmaWVsZCBpcyB0aGUgb25lIHdoaWNoIGlzIG5vdCBhdXRob3JlZCBidXQgcGFydCBvZiB0aGUgcmVwb3J0LlxuICogQGlnbm9yZVxuICogQHBhcmFtICAge0FycmF5fSAgIGNvbmZpZ0ZpZWxkcyAgICAgIExpc3Qgb2YgQXV0aG9yZWQgZmllbGRzXG4gKiBAcGFyYW0gICB7U2V0fSAgICAgY29uZmlnRmllbGRTZXQgICAgU2V0IGlmIEF1dGhvcmVkIGZpbGVkIHZhbHVlc1xuICogQHBhcmFtICAge1NldH0gICAgIHJlcG9ydENvbHVtbnNTZXQgU2V0IG9mIGNvbHVtbnMgZnJvbSB0aGUgcmVwb3J0XG4gKiBAcGFyYW0gICB7b2JqZWN0fSAgaXRlbSAgICAgICAgICAgICBDb25maWcgZmllbGQgaXRlbVxuICogQHBhcmFtICAge3N0cmluZ30gIGNsYXNzSWQgICAgICAgICAgQ2xhc3MgSUQgZnJvbSB0aGUgcmVzcG9uc2VcbiAqIEBwYXJhbSAgIHtib29sZWFufSBzaG93RHluYW1pY0ZpZWxkcyBGbGFnIGluZGljYXRpbmcgd2hldGhlciBmaWVsZHMgYXJlIGZldGNoZWQgZHluYW1pY2FsbHkgYXQgcnVudGltZVxuICogQHJldHVybnMge2Jvb2xlYW59ICAgICAgICAgICAgICAgICAgdHJ1ZSBJZiB0aGUgZmllbGQgaXMgYW4gZXh0cmEgZmllbGQgZWxzZSBmYWxzZS5cbiAqL1xuZnVuY3Rpb24gaXNBbkV4dHJhRmllbGQoY29uZmlnRmllbGRzLCBjb25maWdGaWVsZFNldCwgcmVwb3J0Q29sdW1uc1NldCwgaXRlbSwgY2xhc3NJZCwgc2hvd0R5bmFtaWNGaWVsZHMpIHtcbiAgLy8gSXMgdGhlIGZpZWxkIGFscmVhZHkgcHJlc2VudCBpbiBhdXRob3JpbmcgbWV0YWRhdGE/XG4gIC8vIE11dGF0ZXMgY29uZmlnIGZpZWxkcyB0byBjb3B5IGRpc3BsYXlBcyBhbmQgY2F0ZWdvcnkgaW5mb3JtYXRpb25cbiAgaWYgKGNvbmZpZ0ZpZWxkU2V0LmhhcyhpdGVtLmZpZWxkSUQpKSB7XG4gICAgZmluZEFuZFVwZGF0ZUF1dGhvcmVkRmllbGRDb25maWcoY29uZmlnRmllbGRzLCBpdGVtLCBjbGFzc0lkKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBmaWVsZCBpcyBub3QgYXV0aG9yZWQgYW5kIG5vdCBwYXJ0IG9mIHJlcG9ydCBjb2x1bW5zIHRoZW4gZGlzY2FyZCBpdFxuICByZXR1cm4gc2hvd0R5bmFtaWNGaWVsZHMgfHwgISFyZXBvcnRDb2x1bW5zU2V0LmhhcyhpdGVtLmZpZWxkSUQpO1xufVxuXG4vKipcbiAqIFtwcmVwYXJlRXh0cmFGaWVsZHNdXG4gKiBEZXNjcmlwdGlvbiAtIFJldHVybnMgYSBsaXN0IG9mIGV4dHJhIGZpZWxkcyB3aXRoIHRoZWlyIG1ldGEgdXBkYXRlZC5cbiAqIEBpZ25vcmVcbiAqIEBwYXJhbSAgIHtBcnJheX0gICBtZXRhRmllbGRzICAgICAgIExpc3Qgb2YgZmllbGRzXG4gKiBAcGFyYW0gICB7QXJyYXl9ICAgY29uZmlnRmllbGRzICAgICAgTGlzdCBvZiBBdXRob3JlZCBmaWVsZHNcbiAqIEBwYXJhbSAgIHtTZXR9ICAgICBjb25maWdGaWVsZFNldCAgICBTZXQgaWYgQXV0aG9yZWQgZmlsZWQgdmFsdWVzXG4gKiBAcGFyYW0gICB7U2V0fSAgICAgcmVwb3J0Q29sdW1uc1NldCBTZXQgb2YgY29sdW1ucyBmcm9tIHRoZSByZXBvcnRcbiAqIEBwYXJhbSAgIHtzdHJpbmd9ICBjbGFzc0lEICAgICAgICAgIENsYXNzIElEIGZyb20gdGhlIHJlc3BvbnNlXG4gKiBAcGFyYW0gICB7Ym9vbGVhbn0gc2hvd0R5bmFtaWNGaWVsZHMgRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgZmllbGRzIGFyZSBmZXRjaGVkIGR5bmFtaWNhbGx5IGF0IHJ1bnRpbWVcbiAqIEByZXR1cm5zIHtBcnJheX0gICAgICAgICAgICAgICAgICAgIExpc3Qgb2YgZXh0cmEgZmllbGRzIHdpdGggdGhlaXIgbWV0YSB1cGRhdGVkLlxuICovXG5mdW5jdGlvbiBwcmVwYXJlRXh0cmFGaWVsZHMobWV0YUZpZWxkcywgY29uZmlnRmllbGRzLCBjb25maWdGaWVsZFNldCwgcmVwb3J0Q29sdW1uc1NldCwgY2xhc3NJRCwgc2hvd0R5bmFtaWNGaWVsZHMpIHtcbiAgLy8gRmlsdGVyIGFsbCB0aGUgZXh0cmEgZmllbGRzXG4gIGNvbnN0IGV4dHJhRmlsZWRzID0gbWV0YUZpZWxkcy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgcmV0dXJuIGlzQW5FeHRyYUZpZWxkKGNvbmZpZ0ZpZWxkcywgY29uZmlnRmllbGRTZXQsIHJlcG9ydENvbHVtbnNTZXQsIGl0ZW0sIGNsYXNzSUQsIHNob3dEeW5hbWljRmllbGRzKTtcbiAgfSk7XG4gIHJldHVybiBnZW5lcmF0ZVZpZXdNZXRhRGF0YShleHRyYUZpbGVkcywgY2xhc3NJRCwgZmFsc2UpO1xuICAvLyBVcGRhdGUgdGhlIG1ldGEgb2JqZWN0IG9mIGVhY2ggb2YgdGhlIGV4dHJhIGZpZWxkcy5cbn1cblxuY29uc3QgQXNzaWduRGFzaE9iamVjdHMgPSBbJ0Fzc2lnbi1Xb3JrbGlzdCcsICdBc3NpZ24tV29ya0Jhc2tldCddO1xuXG5mdW5jdGlvbiBwb3B1bGF0ZVJlbmRlcmluZ09wdGlvbnMobmFtZSwgY29uZmlnLCBmaWVsZCkge1xuICBjb25zdCBzaG91bGREaXNwbGF5QXNTZW1hbnRpY0xpbmsgPSAnZGlzcGxheUFzTGluaycgaW4gZmllbGQuY29uZmlnICYmIGZpZWxkLmNvbmZpZy5kaXNwbGF5QXNMaW5rO1xuICBpZiAoc2hvdWxkRGlzcGxheUFzU2VtYW50aWNMaW5rKSB7XG4gICAgY29uZmlnLmN1c3RvbU9iamVjdC5pc0Fzc2lnbm1lbnRMaW5rID0gQXNzaWduRGFzaE9iamVjdHMuaW5jbHVkZXMoZmllbGQuY29uZmlnLmNsYXNzSUQpO1xuICAgIGlmIChmaWVsZC5jb25maWcudmFsdWUuc3RhcnRzV2l0aCgnQENBJykpIHtcbiAgICAgIGNvbmZpZy5jdXN0b21PYmplY3QuaXNBc3NvY2lhdGlvbiA9IHRydWU7XG4gICAgfVxuICAgIGNvbmZpZy5jZWxsUmVuZGVyZXIgPSBmb3JtYXRDb25zdGFudHMuV29ya0xpbms7XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3B5U3RhdHVzV29yaycgfHwgbmFtZSA9PT0gJ3B5QXNzaWdubWVudFN0YXR1cycpIHtcbiAgICBjb25maWcuY2VsbFJlbmRlcmVyID0gZm9ybWF0Q29uc3RhbnRzLldvcmtTdGF0dXM7XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gJ3B4VXJnZW5jeVdvcmsnKSB7XG4gICAgY29uZmlnLmNlbGxSZW5kZXJlciA9IGZvcm1hdENvbnN0YW50cy5JbnRlZ2VyO1xuICB9XG59XG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbGl6ZUNvbHVtbnMoZmllbGRzOiBhbnlbXSA9IFtdLCBnZXRNYXBwZWRQcm9wZXJ0eTogYW55ID0gbnVsbCkge1xuICByZXR1cm4gZmllbGRzLm1hcCgoZmllbGQsIG9yaWdpbmFsQ29sSW5kZXgpID0+IHtcbiAgICBsZXQgbmFtZSA9IGZpZWxkLmNvbmZpZy52YWx1ZTtcblxuICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKG5hbWUuaW5kZXhPZignICcpICsgMSk7XG4gICAgICBpZiAobmFtZVswXSA9PT0gJy4nKSBuYW1lID0gbmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIG5hbWUgPSBnZXRNYXBwZWRQcm9wZXJ0eT8uKG5hbWUpID8/IG5hbWU7XG5cbiAgICBsZXQgbGFiZWwgPSBmaWVsZC5jb25maWcubGFiZWwgfHwgZmllbGQuY29uZmlnLmNhcHRpb247XG4gICAgY29uc3QgeyBzaG93ID0gdHJ1ZSwgZGlzcGxheUFzIH0gPSBmaWVsZC5jb25maWc7XG4gICAgaWYgKGxhYmVsLnN0YXJ0c1dpdGgoJ0AnKSkge1xuICAgICAgbGFiZWwgPSBsYWJlbC5zdWJzdHJpbmcoMyk7XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgbmFtZSxcbiAgICAgIGxhYmVsLFxuICAgICAgc2hvdyxcbiAgICAgIGNsYXNzSUQ6IGZpZWxkLmNvbmZpZy5jbGFzc0lELFxuICAgICAgaWQ6IGZpZWxkLmlkIHx8IG5hbWUgfHwgb3JpZ2luYWxDb2xJbmRleCxcbiAgICAgIGRpc3BsYXlBcyxcbiAgICAgIGFzc29jaWF0aW9uSUQ6IGZpZWxkLmNvbmZpZy5hc3NvY2lhdGlvbklELFxuICAgICAgLi4uKGZpZWxkLmNvbmZpZy5jbGFzc0lEICYmIHsgY2F0ZWdvcnk6IGZpZWxkLmNvbmZpZy5jYXRlZ29yeSB9KSxcbiAgICAgIGN1c3RvbU9iamVjdDoge30sXG4gICAgICBmaWVsZFR5cGU6IGZpZWxkLmNvbmZpZy5maWVsZFR5cGUsXG4gICAgICBtZXRhOiB7XG4gICAgICAgIC4uLmZpZWxkXG4gICAgICB9XG4gICAgfTtcblxuICAgIHBvcHVsYXRlUmVuZGVyaW5nT3B0aW9ucyhuYW1lLCBjb25maWcsIGZpZWxkKTtcblxuICAgIHJldHVybiBjb25maWc7XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0SXRlbUtleSA9IGZpZWxkcyA9PiB7XG4gIGxldCBpdGVtS2V5O1xuICBpZiAoZmllbGRzLmZpbmRJbmRleChmaWVsZCA9PiBmaWVsZC5pZCA9PT0gJ3B5R1VJRCcpID4gLTEpIHtcbiAgICBpdGVtS2V5ID0gJ3B5R1VJRCc7XG4gIH0gZWxzZSB7XG4gICAgaXRlbUtleSA9ICdwekluc0tleSc7XG4gIH1cbiAgcmV0dXJuIGl0ZW1LZXk7XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVBhdGNoUXVlcnlGaWVsZHMoZmllbGRzLCBpc0RhdGFPYmplY3QgPSBmYWxzZSwgY2xhc3NJRCA9ICcnKSB7XG4gIGNvbnN0IHF1ZXJ5RmllbGRzOiBhbnlbXSA9IFtdO1xuICBmaWVsZHMuZm9yRWFjaChmaWVsZCA9PiB7XG4gICAgY29uc3QgcGF0Y2hGaWVsZHM6IGFueVtdID0gW107XG4gICAgaWYgKGZpZWxkLmNlbGxSZW5kZXJlciA9PT0gJ1dvcmtMaW5rJykge1xuICAgICAgaWYgKGZpZWxkLmN1c3RvbU9iamVjdCAmJiBmaWVsZC5jdXN0b21PYmplY3QuaXNBc3NpZ25tZW50TGluaykge1xuICAgICAgICBjb25zdCBhc3NvY2lhdGlvbk5hbWUgPSBmaWVsZC5uYW1lLmluY2x1ZGVzKCc6JykgPyBgJHtmaWVsZC5uYW1lLnNwbGl0KCc6JylbMF19OmAgOiAnJztcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaChgJHthc3NvY2lhdGlvbk5hbWV9cHpJbnNLZXlgKTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaChgJHthc3NvY2lhdGlvbk5hbWV9cHhSZWZPYmplY3RDbGFzc2ApO1xuICAgICAgfSBlbHNlIGlmIChmaWVsZC5jdXN0b21PYmplY3QgJiYgZmllbGQuY3VzdG9tT2JqZWN0LmlzQXNzb2NpYXRpb24pIHtcbiAgICAgICAgY29uc3QgYXNzb2NpYXRpb25DYXRlZ29yeSA9IGZpZWxkLm5hbWUuc3BsaXQoJzonKVswXTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaChgJHthc3NvY2lhdGlvbkNhdGVnb3J5fTpweUlEYCk7XG4gICAgICAgIHBhdGNoRmllbGRzLnB1c2goYCR7YXNzb2NpYXRpb25DYXRlZ29yeX06cHpJbnNLZXlgKTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaChgJHthc3NvY2lhdGlvbkNhdGVnb3J5fTpweE9iakNsYXNzYCk7XG4gICAgICB9IGVsc2UgaWYgKGlzRGF0YU9iamVjdCkge1xuICAgICAgICBjb25zdCBkYXRhVmlld05hbWUgPSBQQ29yZS5nZXREYXRhVHlwZVV0aWxzKCkuZ2V0U2F2YWJsZURhdGFQYWdlKGNsYXNzSUQpO1xuICAgICAgICBjb25zdCBkYXRhUGFnZUtleXMgPSBQQ29yZS5nZXREYXRhVHlwZVV0aWxzKCkuZ2V0RGF0YVBhZ2VLZXlzKGRhdGFWaWV3TmFtZSk7XG4gICAgICAgIGRhdGFQYWdlS2V5cz8uZm9yRWFjaChpdGVtID0+IChpdGVtLmlzQWx0ZXJuYXRlS2V5U3RvcmFnZSA/IHBhdGNoRmllbGRzLnB1c2goaXRlbS5saW5rZWRGaWVsZCkgOiBwYXRjaEZpZWxkcy5wdXNoKGl0ZW0ua2V5TmFtZSkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBhdGNoRmllbGRzLnB1c2goJ3B5SUQnKTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaCgncHpJbnNLZXknKTtcbiAgICAgICAgcGF0Y2hGaWVsZHMucHVzaCgncHhPYmpDbGFzcycpO1xuICAgICAgfVxuICAgIH1cbiAgICBwYXRjaEZpZWxkcy5mb3JFYWNoKGsgPT4ge1xuICAgICAgaWYgKCFxdWVyeUZpZWxkcy5maW5kKHEgPT4gcSA9PT0gaykpIHtcbiAgICAgICAgcXVlcnlGaWVsZHMucHVzaChrKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgcmV0dXJuIHF1ZXJ5RmllbGRzO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgcmVuZGVyZXIgdHlwZSBmb3IgdGhlIHByb3BlcnRpZXMgb2YgdHlwZSBQYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlUGFnZUZpZWxkc0NvbmZpZyhjb25maWdGaWVsZHMsIHBhcmVudENsYXNzSUQpIHtcbiAgcmV0dXJuIGNvbmZpZ0ZpZWxkcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHR5cGUsXG4gICAgICBjb25maWc6IHsgdmFsdWUgfVxuICAgIH0gPSBpdGVtO1xuICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IFBDb3JlLmdldEFubm90YXRpb25VdGlscygpLmdldFByb3BlcnR5TmFtZSh2YWx1ZSk7XG4gICAgaWYgKGlzRW1iZWRkZWRGaWVsZCh2YWx1ZSkgJiYgIWlzUGFnZUxpc3RJblBhdGgocHJvcGVydHlOYW1lLCBwYXJlbnRDbGFzc0lEKSkge1xuICAgICAgaXRlbS5jb25maWcuY29tcG9uZW50VHlwZSA9IHR5cGU7XG4gICAgICBpdGVtLnR5cGUgPSAnUGFnZVByb3BlcnR5UmVuZGVyZXInO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBjb25zdCByZWFkQ29udGV4dFJlc3BvbnNlID0gYXN5bmMgKGNvbnRleHQsIHBhcmFtcykgPT4ge1xuICBjb25zdCB7IHBDb25uJCwgYXBpQ29udGV4dCwgY2hpbGRyZW4sIHNob3dEeW5hbWljRmllbGRzLCByZWZlcmVuY2VMaXN0LCBpc0RhdGFPYmplY3QgfSA9IHBhcmFtcztcbiAgLy8gbGV0IHsgbGlzdENvbnRleHQgfSA9IHBhcmFtcztcbiAgY29uc3QgeyBwcm9taXNlc1Jlc3BvbnNlQXJyYXksIGFwaUNvbnRleHQ6IG90aGVyQ29udGV4dCB9ID0gY29udGV4dDtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvbm8tdW51c2VkLWNvbGxlY3Rpb25cbiAgY29uc3QgbGlzdE9mQ29tcG9uZW50czogYW55W10gPSBbXTtcbiAgY29uc3Qge1xuICAgIGRhdGE6IHsgZmllbGRzOiBtZXRhRmllbGRzLCBjbGFzc0lELCBpc1F1ZXJ5YWJsZSB9XG4gIH0gPSBwcm9taXNlc1Jlc3BvbnNlQXJyYXlbMF07XG4gIGxldCB7XG4gICAgZGF0YTogeyBwcmltYXJ5RmllbGRzIH1cbiAgfSA9IHByb21pc2VzUmVzcG9uc2VBcnJheVswXTtcbiAgLy8gV2hlbiBsaXN0IGlzIGNvbmZpZ3VyZWQgd2l0aCBJbmNsdWRlIGFsbCBjbGFzcyBmaWVsZHMgY29uZmlndXJhdGlvbiwgcHJvdmlkZSBzdXBwb3J0IGZvciBQcmltYXJ5IGZpZWxkcyBjb2x1bW5cbiAgaWYgKHNob3dEeW5hbWljRmllbGRzKSB7XG4gICAgY29uc3Qgc291cmNlTWV0YWRhdGEgPSBQQ29yZS5nZXRNZXRhZGF0YVV0aWxzKCkuZ2V0RGF0YVBhZ2VNZXRhZGF0YShyZWZlcmVuY2VMaXN0KTtcbiAgICBpZiAoc291cmNlTWV0YWRhdGE/LnByaW1hcnlGaWVsZHMpIHtcbiAgICAgIHByaW1hcnlGaWVsZHMgPSBzb3VyY2VNZXRhZGF0YS5wcmltYXJ5RmllbGRzO1xuICAgIH1cbiAgICAvLyB1cGRhdGluZyBtZXRhRGF0YSBmaWVsZElEIHRvIG5vcm1hbCBwcm9wZXJ0eSBpZiBpdCBoYXMgZmllbGRJRCBzdGFydHMgd2l0aCAhUCEgb3IgIVBMIVxuICAgIHVwZGF0ZU1ldGFFbWJlZGRlZEZpZWxkSUQobWV0YUZpZWxkcyk7XG4gIH1cbiAgdXBkYXRlRmllbGRUeXBlKG1ldGFGaWVsZHMpO1xuXG4gIGlmIChpc0RhdGFPYmplY3QpIHtcbiAgICBjb25zdCBjb21wb3NpdGVLZXlzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IGRhdGFWaWV3TmFtZSA9IFBDb3JlLmdldERhdGFUeXBlVXRpbHMoKS5nZXRTYXZhYmxlRGF0YVBhZ2UoY2xhc3NJRCk7XG4gICAgY29uc3QgZGF0YVBhZ2VLZXlzID0gUENvcmUuZ2V0RGF0YVR5cGVVdGlscygpLmdldERhdGFQYWdlS2V5cyhkYXRhVmlld05hbWUpO1xuICAgIGRhdGFQYWdlS2V5cz8uZm9yRWFjaChpdGVtID0+IChpdGVtLmlzQWx0ZXJuYXRlS2V5U3RvcmFnZSA/IGNvbXBvc2l0ZUtleXMucHVzaChpdGVtLmxpbmtlZEZpZWxkKSA6IGNvbXBvc2l0ZUtleXMucHVzaChpdGVtLmtleU5hbWUpKSk7XG4gICAgaWYgKGNvbXBvc2l0ZUtleXMubGVuZ3RoKSB7XG4gICAgICBvdGhlckNvbnRleHQuc2V0Q29tcG9zaXRlS2V5cyhjb21wb3NpdGVLZXlzKTtcbiAgICB9XG4gICAgb3RoZXJDb250ZXh0LmZldGNoUm93QWN0aW9uRGV0YWlscyA9IG51bGw7XG4gIH1cblxuICBjb25zdCBwcmVzZXRBcnJheSA9IFtdO1xuICBjb25zdCByYXdNZXRhZGF0YSA9IHBDb25uJC5nZXRSYXdNZXRhZGF0YSgpLmNvbmZpZztcbiAgY29uc3QgcmF3UHJlc2V0cyA9IHJhd01ldGFkYXRhLnByZXNldHM7XG4gIGNvbnN0IGlzTWV0YVdpdGhQcmVzZXRzID0gcmF3UHJlc2V0cyAmJiByYXdQcmVzZXRzLmxlbmd0aCAhPT0gMDtcbiAgY29uc3QgY2hpbGRyZW5JdGVyYXRvciA9IGlzTWV0YVdpdGhQcmVzZXRzID8gcmF3UHJlc2V0cyA6IGNoaWxkcmVuO1xuICBjb25zdCByZXNvbHZlZFByZXNldHMgPSBwQ29ubiQuZ2V0Q29uZmlnUHJvcHMoKS5wcmVzZXRzO1xuICBsZXQgZmllbGRzO1xuICBsZXQgdGFibGVDb25maWc7XG4gIGNoaWxkcmVuSXRlcmF0b3I/LmZvckVhY2goKHByZXNldE1ldGEsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgeyBjb25maWdGaWVsZHMgfSA9IGdldFRhYmxlQ29uZmlnRnJvbVByZXNldE1ldGEoXG4gICAgICB7IC4uLnByZXNldE1ldGEsIGxhYmVsOiByZXNvbHZlZFByZXNldHNbaW5kZXhdLmxhYmVsIH0sXG4gICAgICBpc01ldGFXaXRoUHJlc2V0cyxcbiAgICAgIHBDb25uJCxcbiAgICAgIGNsYXNzSUQsXG4gICAgICBwcmltYXJ5RmllbGRzLFxuICAgICAgbWV0YUZpZWxkc1xuICAgICk7XG4gICAgY29uc3QgcHVzaFRvQ29tcG9uZW50c0xpc3QgPSBmaWVsZFR5cGUgPT4ge1xuICAgICAgbGlzdE9mQ29tcG9uZW50cy5wdXNoKGZpZWxkVHlwZSk7XG4gICAgfTtcbiAgICAvLyByZWFkIHJlcG9ydCBjb2x1bW5zIHJlc3BvbnNlIC0gaW4gY2FzZSBvZiBub25xdWVyeWFibGUgaWdub3JlIHRoZSByZXNwb25zZSBhbmQgcmVseSBvbmx5IG9uIHRoZSBmaWVsZHMgY29uZmlndXJlZCBhdCBhdXRob2luZyB0aW1lIGluIHByZXNldHNcbiAgICBjb25zdCByZXBvcnRDb2x1bW5zU2V0ID0gaXNRdWVyeWFibGUgPyBnZXRSZXBvcnRDb2x1bW5zKHByb21pc2VzUmVzcG9uc2VBcnJheVsxXSkgOiBuZXcgU2V0KCk7XG5cbiAgICBjb25zdCBjb25maWdGaWVsZFNldCA9IHByZXBhcmVDb25maWdGaWVsZHMoY29uZmlnRmllbGRzLCBwdXNoVG9Db21wb25lbnRzTGlzdCk7XG5cbiAgICAvLyBGSVhNRSAjRW1iZWRkZWRQcm9wZXJ0eVBhdGNoXG4gICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgbWVyZ2UgbG9naWMgd2hlbiB0aGUgbWV0YWRhdGEgcmVzcG9uc2UgaW5jbHVkZXMgYWxsIG9wdGltaXplZCBlbWJlZGRlZCBwYWdlIGFuZCBwYWdlbGlzdHNcbiAgICAvLyBtZXJnaW5nIGNvbmZpZ3VyZWQgZW1iZWRkZWQgcHJvcGVydGllcyB3aXRoIG1ldGFkYXRhIHNvIHRoYXQgd2hpbGUgcHJlcGFyaW5nIGV4dHJhIGZpZWxkcywgY29uZmlnIGZpZWxkcyBjYW4gZ2V0IG90aGVyIHByb3BlcnRpZXMgZnJvbSBtZXRhKGVnOiBjYXRlZ29yeSwgZGlzcGxheUFzTGluaylcbiAgICAvLyBnZXQgY29uZmlndXJlZCBlbWJlZGRlZCBwcm9wZXJ0aWVzIG1ldGFkYXRhIGFuZCBnZXQgbmV3IG1lcmdlZE1ldGFGaWVsZHNcbiAgICBjb25zdCBjb25maWdFbWJlZGRlZEZpZWxkc01ldGEgPSBnZXRDb25maWdFbWJlZGRlZEZpZWxkc01ldGEoY29uZmlnRmllbGRTZXQsIGNsYXNzSUQpO1xuICAgIGNvbnN0IG1lcmdlZE1ldGFGaWVsZHMgPSBtZXJnZUNvbmZpZ0VtYmVkZGVkRmllbGRzTWV0YShjb25maWdFbWJlZGRlZEZpZWxkc01ldGEsIG1ldGFGaWVsZHMpO1xuXG4gICAgY29uc3QgZXh0cmFGaWVsZHMgPSBwcmVwYXJlRXh0cmFGaWVsZHMoXG4gICAgICBtZXJnZWRNZXRhRmllbGRzLCAvLyBwYXNzaW5nIG5ldyBtZXJnZWQgbWV0YSBmaWVsZHMgd2hpY2ggaGFzIG1ldGEgb2YgY29uZmlndXJlZCBlbWJlZGRlZCBmaWVsZHMgb2YgY3VycmVudCBwcmVzZXRcbiAgICAgIGNvbmZpZ0ZpZWxkcyxcbiAgICAgIGNvbmZpZ0ZpZWxkU2V0LFxuICAgICAgcmVwb3J0Q29sdW1uc1NldCxcbiAgICAgIGNsYXNzSUQsXG4gICAgICBzaG93RHluYW1pY0ZpZWxkc1xuICAgICk7XG5cbiAgICBpZiAoaXNRdWVyeWFibGUpIHtcbiAgICAgIHVwZGF0ZVBhZ2VGaWVsZHNDb25maWcoY29uZmlnRmllbGRzLCBjbGFzc0lEKTtcbiAgICAgIHByZXBhcmVQcm9wZXJ0eU1hcHMoWy4uLmNvbmZpZ0ZpZWxkcywgLi4uZXh0cmFGaWVsZHNdLCBjbGFzc0lELCBjb250ZXh0KTtcbiAgICB9XG5cbiAgICBjb25zdCB7IGdldE1hcHBlZFByb3BlcnR5IH0gPSBjb250ZXh0O1xuXG4gICAgZmllbGRzID0gaW5pdGlhbGl6ZUNvbHVtbnMoWy4uLmNvbmZpZ0ZpZWxkcywgLi4uZXh0cmFGaWVsZHNdLCBnZXRNYXBwZWRQcm9wZXJ0eSk7XG4gICAgY29uc3QgcGF0Y2hRdWVyeUZpZWxkcyA9IHByZXBhcmVQYXRjaFF1ZXJ5RmllbGRzKGZpZWxkcywgaXNEYXRhT2JqZWN0LCBjbGFzc0lEKTtcbiAgICBjb25zdCBpdGVtS2V5ID0gZ2V0SXRlbUtleShmaWVsZHMpO1xuICAgIHRhYmxlQ29uZmlnID0geyBmaWVsZERlZnM6IGZpZWxkcywgcGF0Y2hRdWVyeUZpZWxkcywgaXRlbUtleSwgaXNRdWVyeWFibGUgfTtcbiAgfSk7XG4gIGNvbnN0IG1ldGEgPSB0YWJsZUNvbmZpZztcbiAgcGFyYW1zLmxpc3RDb250ZXh0ID0geyBtZXRhLCBwcmVzZXRzOiBwcmVzZXRBcnJheSwgYXBpQ29udGV4dDogeyAuLi5hcGlDb250ZXh0IH0gfTtcbiAgcmV0dXJuIHBhcmFtcy5saXN0Q29udGV4dDtcbn07XG4iXX0=
|