@pega/angular-sdk-components 0.24.9 → 0.25.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/fesm2022/pega-angular-sdk-components.mjs +2832 -1807
- package/fesm2022/pega-angular-sdk-components.mjs.map +1 -1
- package/lib/_bridge/helpers/sdk-pega-component-map.d.ts +4 -0
- package/lib/_components/designSystemExtension/banner/banner.component.d.ts +0 -1
- package/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.d.ts +0 -1
- package/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.d.ts +1 -1
- package/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.d.ts +2 -1
- package/lib/_components/designSystemExtension/operator/operator.component.d.ts +2 -3
- package/lib/_components/designSystemExtension/pulse/pulse.component.d.ts +2 -3
- package/lib/_components/field/auto-complete/auto-complete.component.d.ts +8 -3
- package/lib/_components/field/cancel-alert/cancel-alert.component.d.ts +0 -1
- package/lib/_components/field/check-box/check-box.component.d.ts +5 -3
- package/lib/_components/field/currency/currency.component.d.ts +6 -4
- package/lib/_components/field/date/date.component.d.ts +17 -7
- package/lib/_components/field/date-time/date-time.component.d.ts +10 -3
- package/lib/_components/field/decimal/decimal.component.d.ts +4 -4
- package/lib/_components/field/dropdown/dropdown.component.d.ts +14 -3
- package/lib/_components/field/email/email.component.d.ts +2 -1
- package/lib/_components/field/group/group.component.d.ts +0 -1
- package/lib/_components/field/integer/integer.component.d.ts +2 -1
- package/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.d.ts +1 -2
- package/lib/_components/field/location/location.component.d.ts +71 -0
- package/lib/_components/field/multiselect/multiselect.component.d.ts +3 -3
- package/lib/_components/field/percentage/percentage.component.d.ts +6 -3
- package/lib/_components/field/phone/phone.component.d.ts +6 -8
- package/lib/_components/field/radio-buttons/radio-buttons.component.d.ts +4 -2
- package/lib/_components/field/rich-text/rich-text.component.d.ts +3 -2
- package/lib/_components/field/scalar-list/scalar-list.component.d.ts +0 -1
- package/lib/_components/field/selectable-card/selectable-card.component.d.ts +75 -0
- package/lib/_components/field/semantic-link/semantic-link.component.d.ts +0 -1
- package/lib/_components/field/text/text.component.d.ts +3 -2
- package/lib/_components/field/text-area/text-area.component.d.ts +2 -1
- package/lib/_components/field/text-content/text-content.component.d.ts +0 -1
- package/lib/_components/field/text-input/text-input.component.d.ts +2 -1
- package/lib/_components/field/time/time.component.d.ts +3 -1
- package/lib/_components/field/url/url.component.d.ts +2 -1
- package/lib/_components/field/user-reference/user-reference.component.d.ts +7 -1
- package/lib/_components/infra/Containers/flow-container/flow-container.component.d.ts +0 -2
- package/lib/_components/infra/Containers/flow-container/helpers.d.ts +1 -0
- package/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.d.ts +0 -1
- package/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.d.ts +1 -4
- package/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.d.ts +0 -1
- package/lib/_components/infra/Containers/view-container/helper.d.ts +2 -0
- package/lib/_components/infra/Containers/view-container/view-container.component.d.ts +0 -1
- package/lib/_components/infra/action-buttons/action-buttons.component.d.ts +1 -1
- package/lib/_components/infra/assignment/assignment.component.d.ts +6 -4
- package/lib/_components/infra/assignment-card/assignment-card.component.d.ts +0 -1
- package/lib/_components/infra/dashboard-filter/dashboard-filter.component.d.ts +0 -1
- package/lib/_components/infra/defer-load/defer-load.component.d.ts +3 -3
- package/lib/_components/infra/error-boundary/error-boundary.component.d.ts +1 -1
- package/lib/_components/infra/multi-step/multi-step.component.d.ts +0 -1
- package/lib/_components/infra/navbar/navbar.component.d.ts +2 -3
- package/lib/_components/infra/reference/reference.component.d.ts +23 -3
- package/lib/_components/infra/region/region.component.d.ts +0 -1
- package/lib/_components/infra/root-container/root-container.component.d.ts +3 -2
- package/lib/_components/infra/stages/stages.component.d.ts +0 -1
- package/lib/_components/infra/view/view.component.d.ts +1 -1
- package/lib/_components/template/app-shell/app-shell.component.d.ts +0 -1
- package/lib/_components/template/banner-page/banner-page.component.d.ts +0 -1
- package/lib/_components/template/base/details-template-base.d.ts +21 -0
- package/lib/_components/template/base/form-template-base.d.ts +10 -0
- package/lib/_components/template/case-summary/case-summary.component.d.ts +3 -3
- package/lib/_components/template/case-view/case-view.component.d.ts +1 -3
- package/lib/_components/template/confirmation/confirmation.component.d.ts +0 -1
- package/lib/_components/template/data-reference/data-reference.component.d.ts +0 -1
- package/lib/_components/template/default-form/default-form.component.d.ts +8 -7
- package/lib/_components/template/details/details.component.d.ts +3 -12
- package/lib/_components/template/details-narrow-wide/details-narrow-wide.component.d.ts +3 -12
- package/lib/_components/template/details-one-column/details-one-column.component.d.ts +3 -14
- package/lib/_components/template/details-sub-tabs/details-sub-tabs.component.d.ts +3 -14
- package/lib/_components/template/details-three-column/details-three-column.component.d.ts +3 -14
- package/lib/_components/template/details-two-column/details-two-column.component.d.ts +3 -14
- package/lib/_components/template/details-wide-narrow/details-wide-narrow.component.d.ts +3 -14
- package/lib/_components/template/dynamic-tabs/dynamic-tabs.component.d.ts +1 -1
- package/lib/_components/template/field-group-template/field-group-template.component.d.ts +12 -9
- package/lib/_components/template/inline-dashboard/inline-dashboard.component.d.ts +0 -1
- package/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.d.ts +0 -1
- package/lib/_components/template/list-page/list-page.component.d.ts +0 -1
- package/lib/_components/template/list-view/list-view.component.d.ts +6 -4
- package/lib/_components/template/list-view/listViewHelpers.d.ts +1 -1
- package/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.d.ts +0 -1
- package/lib/_components/template/narrow-wide-form/narrow-wide-form.component.d.ts +0 -1
- package/lib/_components/template/one-column/one-column.component.d.ts +2 -2
- package/lib/_components/template/one-column-page/one-column-page.component.d.ts +0 -1
- package/lib/_components/template/one-column-tab/one-column-tab.component.d.ts +0 -1
- package/lib/_components/template/page/page.component.d.ts +0 -1
- package/lib/_components/template/promoted-filters/promoted-filters.component.d.ts +0 -1
- package/lib/_components/template/repeating-structures/repeating-structures.component.d.ts +0 -1
- package/lib/_components/template/simple-table/simple-table.component.d.ts +0 -1
- package/lib/_components/template/simple-table-manual/helpers.d.ts +19 -4
- package/lib/_components/template/simple-table-manual/simple-table-manual.component.d.ts +10 -3
- package/lib/_components/template/simple-table-select/simple-table-select.component.d.ts +0 -1
- package/lib/_components/template/single-reference-readonly/single-reference-readonly.component.d.ts +0 -1
- package/lib/_components/template/sub-tabs/sub-tabs.component.d.ts +0 -1
- package/lib/_components/template/three-column/three-column.component.d.ts +2 -2
- package/lib/_components/template/three-column-page/three-column-page.component.d.ts +0 -1
- package/lib/_components/template/two-column/two-column.component.d.ts +2 -2
- package/lib/_components/template/two-column-page/two-column-page.component.d.ts +0 -1
- package/lib/_components/template/two-column-tab/two-column-tab.component.d.ts +0 -1
- package/lib/_components/template/utils.d.ts +7 -0
- package/lib/_components/template/wide-narrow-form/wide-narrow-form.component.d.ts +2 -2
- package/lib/_components/template/wide-narrow-page/wide-narrow-page.component.d.ts +1 -2
- package/lib/_components/template/wss-nav-bar/wss-nav-bar.component.d.ts +3 -4
- package/lib/_components/widget/app-announcement/app-announcement.component.d.ts +0 -1
- package/lib/_components/widget/attachment/attachment.component.d.ts +3 -4
- package/lib/_components/widget/case-history/case-history.component.d.ts +0 -1
- package/lib/_components/widget/feed-container/feed-container.component.d.ts +2 -3
- package/lib/_components/widget/file-utility/file-utility.component.d.ts +1 -2
- package/lib/_components/widget/quick-create/quick-create.component.d.ts +0 -1
- package/lib/_components/widget/todo/todo.component.d.ts +10 -14
- package/lib/_components/widget/utility/utility.component.d.ts +0 -1
- package/lib/_helpers/common.d.ts +1 -1
- package/lib/_helpers/createstage-utils.d.ts +1 -0
- package/lib/_helpers/formatters/boolean.d.ts +1 -2
- package/lib/_helpers/formatters/common.d.ts +2 -2
- package/lib/_helpers/formatters/currency.d.ts +1 -2
- package/lib/_helpers/formatters/date.d.ts +1 -2
- package/lib/_helpers/formatters/index.d.ts +1 -2
- package/lib/_helpers/utils.d.ts +12 -0
- package/lib/_messages/error-messages.service.d.ts +1 -1
- package/lib/_services/banner.service.d.ts +8 -0
- package/lib/_services/case.service.d.ts +1 -1
- package/lib/_services/datapage.service.d.ts +1 -1
- package/lib/_services/endpoints.d.ts +0 -1
- package/lib/_services/google-maps-loader.service.d.ts +7 -0
- package/lib/doc/KeyReleaseUpdates.md +35 -1
- package/package.json +20 -6
- package/public-api.d.ts +15 -11
- package/esm2022/lib/_bridge/angular-pconnect.mjs +0 -428
- package/esm2022/lib/_bridge/component-mapper/component-mapper.component.mjs +0 -114
- package/esm2022/lib/_bridge/helpers/sdk-pega-component-map.mjs +0 -239
- package/esm2022/lib/_bridge/helpers/sdk_component_map.mjs +0 -142
- package/esm2022/lib/_components/designSystemExtension/alert/alert.component.mjs +0 -50
- package/esm2022/lib/_components/designSystemExtension/alert-banner/alert-banner.component.mjs +0 -29
- package/esm2022/lib/_components/designSystemExtension/banner/banner.component.mjs +0 -31
- package/esm2022/lib/_components/designSystemExtension/case-create-stage/case-create-stage.component.mjs +0 -51
- package/esm2022/lib/_components/designSystemExtension/field-group/field-group.component.mjs +0 -31
- package/esm2022/lib/_components/designSystemExtension/material-case-summary/material-case-summary.component.mjs +0 -83
- package/esm2022/lib/_components/designSystemExtension/material-details/material-details.component.mjs +0 -37
- package/esm2022/lib/_components/designSystemExtension/material-details-fields/material-details-fields.component.mjs +0 -31
- package/esm2022/lib/_components/designSystemExtension/material-summary-item/material-summary-item.component.mjs +0 -36
- package/esm2022/lib/_components/designSystemExtension/material-summary-list/material-summary-list.component.mjs +0 -25
- package/esm2022/lib/_components/designSystemExtension/material-utility/material-utility.component.mjs +0 -28
- package/esm2022/lib/_components/designSystemExtension/material-vertical-tabs/material-vertical-tabs.component.mjs +0 -42
- package/esm2022/lib/_components/designSystemExtension/operator/operator.component.mjs +0 -143
- package/esm2022/lib/_components/designSystemExtension/pulse/pulse.component.mjs +0 -33
- package/esm2022/lib/_components/designSystemExtension/rich-text-editor/rich-text-editor.component.mjs +0 -93
- package/esm2022/lib/_components/designSystemExtension/wss-quick-create/wss-quick-create.component.mjs +0 -18
- package/esm2022/lib/_components/field/auto-complete/auto-complete.component.mjs +0 -286
- package/esm2022/lib/_components/field/cancel-alert/cancel-alert.component.mjs +0 -96
- package/esm2022/lib/_components/field/check-box/check-box.component.mjs +0 -223
- package/esm2022/lib/_components/field/currency/currency.component.mjs +0 -177
- package/esm2022/lib/_components/field/date/date.component.mjs +0 -225
- package/esm2022/lib/_components/field/date-time/date-time.component.mjs +0 -181
- package/esm2022/lib/_components/field/decimal/decimal.component.mjs +0 -185
- package/esm2022/lib/_components/field/dropdown/dropdown.component.mjs +0 -192
- package/esm2022/lib/_components/field/email/email.component.mjs +0 -150
- package/esm2022/lib/_components/field/group/group.component.mjs +0 -64
- package/esm2022/lib/_components/field/integer/integer.component.mjs +0 -155
- package/esm2022/lib/_components/field/list-view-action-buttons/list-view-action-buttons.component.mjs +0 -44
- package/esm2022/lib/_components/field/multiselect/multiselect.component.mjs +0 -307
- package/esm2022/lib/_components/field/multiselect/utils.mjs +0 -187
- package/esm2022/lib/_components/field/percentage/percentage.component.mjs +0 -174
- package/esm2022/lib/_components/field/phone/phone.component.mjs +0 -167
- package/esm2022/lib/_components/field/radio-buttons/radio-buttons.component.mjs +0 -184
- package/esm2022/lib/_components/field/rich-text/rich-text.component.mjs +0 -103
- package/esm2022/lib/_components/field/scalar-list/scalar-list.component.mjs +0 -96
- package/esm2022/lib/_components/field/semantic-link/semantic-link.component.mjs +0 -57
- package/esm2022/lib/_components/field/text/text.component.mjs +0 -138
- package/esm2022/lib/_components/field/text-area/text-area.component.mjs +0 -153
- package/esm2022/lib/_components/field/text-content/text-content.component.mjs +0 -69
- package/esm2022/lib/_components/field/text-input/text-input.component.mjs +0 -152
- package/esm2022/lib/_components/field/time/time.component.mjs +0 -153
- package/esm2022/lib/_components/field/url/url.component.mjs +0 -152
- package/esm2022/lib/_components/field/user-reference/user-reference.component.mjs +0 -187
- package/esm2022/lib/_components/infra/Containers/base-components/flow-container-base.component.mjs +0 -18
- package/esm2022/lib/_components/infra/Containers/base-components/helper.mjs +0 -71
- package/esm2022/lib/_components/infra/Containers/flow-container/flow-container.component.mjs +0 -487
- package/esm2022/lib/_components/infra/Containers/flow-container/helpers.mjs +0 -68
- package/esm2022/lib/_components/infra/Containers/hybrid-view-container/hybrid-view-container.component.mjs +0 -24
- package/esm2022/lib/_components/infra/Containers/modal-view-container/modal-view-container.component.mjs +0 -342
- package/esm2022/lib/_components/infra/Containers/preview-view-container/preview-view-container.component.mjs +0 -32
- package/esm2022/lib/_components/infra/Containers/view-container/view-container.component.mjs +0 -218
- package/esm2022/lib/_components/infra/action-buttons/action-buttons.component.mjs +0 -31
- package/esm2022/lib/_components/infra/assignment/assignment.component.mjs +0 -383
- package/esm2022/lib/_components/infra/assignment-card/assignment-card.component.mjs +0 -47
- package/esm2022/lib/_components/infra/dashboard-filter/dashboard-filter.component.mjs +0 -87
- package/esm2022/lib/_components/infra/defer-load/defer-load.component.mjs +0 -141
- package/esm2022/lib/_components/infra/error-boundary/error-boundary.component.mjs +0 -18
- package/esm2022/lib/_components/infra/multi-step/multi-step.component.mjs +0 -80
- package/esm2022/lib/_components/infra/navbar/navbar.component.mjs +0 -136
- package/esm2022/lib/_components/infra/reference/reference.component.mjs +0 -133
- package/esm2022/lib/_components/infra/region/region.component.mjs +0 -33
- package/esm2022/lib/_components/infra/root-container/root-container.component.mjs +0 -228
- package/esm2022/lib/_components/infra/stages/stages.component.mjs +0 -62
- package/esm2022/lib/_components/infra/view/view.component.mjs +0 -173
- package/esm2022/lib/_components/template/app-shell/app-shell.component.mjs +0 -140
- package/esm2022/lib/_components/template/banner-page/banner-page.component.mjs +0 -43
- package/esm2022/lib/_components/template/case-summary/case-summary.component.mjs +0 -101
- package/esm2022/lib/_components/template/case-view/case-view.component.mjs +0 -190
- package/esm2022/lib/_components/template/confirmation/confirmation.component.mjs +0 -68
- package/esm2022/lib/_components/template/data-reference/data-reference.component.mjs +0 -237
- package/esm2022/lib/_components/template/default-form/default-form.component.mjs +0 -61
- package/esm2022/lib/_components/template/details/details.component.mjs +0 -103
- package/esm2022/lib/_components/template/details-narrow-wide/details-narrow-wide.component.mjs +0 -72
- package/esm2022/lib/_components/template/details-one-column/details-one-column.component.mjs +0 -71
- package/esm2022/lib/_components/template/details-sub-tabs/details-sub-tabs.component.mjs +0 -66
- package/esm2022/lib/_components/template/details-three-column/details-three-column.component.mjs +0 -80
- package/esm2022/lib/_components/template/details-two-column/details-two-column.component.mjs +0 -77
- package/esm2022/lib/_components/template/details-wide-narrow/details-wide-narrow.component.mjs +0 -77
- package/esm2022/lib/_components/template/dynamic-tabs/dynamic-tabs.component.mjs +0 -64
- package/esm2022/lib/_components/template/field-group-list/field-group-list.component.mjs +0 -23
- package/esm2022/lib/_components/template/field-group-template/field-group-template.component.mjs +0 -124
- package/esm2022/lib/_components/template/field-value-list/field-value-list.component.mjs +0 -24
- package/esm2022/lib/_components/template/inline-dashboard/inline-dashboard.component.mjs +0 -22
- package/esm2022/lib/_components/template/inline-dashboard-page/inline-dashboard-page.component.mjs +0 -40
- package/esm2022/lib/_components/template/list-page/list-page.component.mjs +0 -14
- package/esm2022/lib/_components/template/list-view/DefaultViewMeta.mjs +0 -208
- package/esm2022/lib/_components/template/list-view/list-view.component.mjs +0 -1202
- package/esm2022/lib/_components/template/list-view/listViewHelpers.mjs +0 -60
- package/esm2022/lib/_components/template/list-view/utils.mjs +0 -662
- package/esm2022/lib/_components/template/multi-reference-readonly/multi-reference-readonly.component.mjs +0 -44
- package/esm2022/lib/_components/template/narrow-wide-form/narrow-wide-form.component.mjs +0 -30
- package/esm2022/lib/_components/template/one-column/one-column.component.mjs +0 -30
- package/esm2022/lib/_components/template/one-column-page/one-column-page.component.mjs +0 -16
- package/esm2022/lib/_components/template/one-column-tab/one-column-tab.component.mjs +0 -30
- package/esm2022/lib/_components/template/page/page.component.mjs +0 -52
- package/esm2022/lib/_components/template/promoted-filters/promoted-filters.component.mjs +0 -149
- package/esm2022/lib/_components/template/repeating-structures/repeating-structures.component.mjs +0 -138
- package/esm2022/lib/_components/template/simple-table/simple-table.component.mjs +0 -104
- package/esm2022/lib/_components/template/simple-table-manual/helpers.mjs +0 -270
- package/esm2022/lib/_components/template/simple-table-manual/simple-table-manual.component.mjs +0 -781
- package/esm2022/lib/_components/template/simple-table-select/simple-table-select.component.mjs +0 -129
- package/esm2022/lib/_components/template/single-reference-readonly/single-reference-readonly.component.mjs +0 -16
- package/esm2022/lib/_components/template/sub-tabs/sub-tabs.component.mjs +0 -67
- package/esm2022/lib/_components/template/three-column/three-column.component.mjs +0 -30
- package/esm2022/lib/_components/template/three-column-page/three-column-page.component.mjs +0 -16
- package/esm2022/lib/_components/template/two-column/two-column.component.mjs +0 -30
- package/esm2022/lib/_components/template/two-column-page/two-column-page.component.mjs +0 -40
- package/esm2022/lib/_components/template/two-column-tab/two-column-tab.component.mjs +0 -30
- package/esm2022/lib/_components/template/utils.mjs +0 -22
- package/esm2022/lib/_components/template/wide-narrow-form/wide-narrow-form.component.mjs +0 -30
- package/esm2022/lib/_components/template/wide-narrow-page/wide-narrow-page.component.mjs +0 -53
- package/esm2022/lib/_components/template/wss-nav-bar/wss-nav-bar.component.mjs +0 -137
- package/esm2022/lib/_components/widget/app-announcement/app-announcement.component.mjs +0 -24
- package/esm2022/lib/_components/widget/attachment/attachment.component.mjs +0 -395
- package/esm2022/lib/_components/widget/case-history/case-history.component.mjs +0 -80
- package/esm2022/lib/_components/widget/feed-container/feed-container.component.mjs +0 -521
- package/esm2022/lib/_components/widget/file-utility/file-utility.component.mjs +0 -638
- package/esm2022/lib/_components/widget/list-utility/list-utility.component.mjs +0 -57
- package/esm2022/lib/_components/widget/quick-create/quick-create.component.mjs +0 -75
- package/esm2022/lib/_components/widget/todo/todo.component.mjs +0 -214
- package/esm2022/lib/_components/widget/utility/utility.component.mjs +0 -34
- package/esm2022/lib/_directives/thousand-seperator.directive.mjs +0 -28
- package/esm2022/lib/_helpers/case-utils.mjs +0 -71
- package/esm2022/lib/_helpers/common.mjs +0 -20
- package/esm2022/lib/_helpers/currency-utils.mjs +0 -57
- package/esm2022/lib/_helpers/date-format-utils.mjs +0 -68
- package/esm2022/lib/_helpers/event-util.mjs +0 -18
- package/esm2022/lib/_helpers/field-group-utils.mjs +0 -47
- package/esm2022/lib/_helpers/filter-utils.mjs +0 -106
- package/esm2022/lib/_helpers/formatters/boolean.mjs +0 -20
- package/esm2022/lib/_helpers/formatters/common.mjs +0 -16
- package/esm2022/lib/_helpers/formatters/currency-map.mjs +0 -903
- package/esm2022/lib/_helpers/formatters/currency.mjs +0 -68
- package/esm2022/lib/_helpers/formatters/date.mjs +0 -69
- package/esm2022/lib/_helpers/formatters/format-utils.mjs +0 -68
- package/esm2022/lib/_helpers/formatters/index.mjs +0 -110
- package/esm2022/lib/_helpers/instructions-utils.mjs +0 -36
- package/esm2022/lib/_helpers/tab-utils.mjs +0 -59
- package/esm2022/lib/_helpers/template-utils.mjs +0 -56
- package/esm2022/lib/_helpers/utils.mjs +0 -386
- package/esm2022/lib/_helpers/versionHelpers.mjs +0 -12
- package/esm2022/lib/_messages/error-messages.service.mjs +0 -31
- package/esm2022/lib/_messages/get-login-status.service.mjs +0 -26
- package/esm2022/lib/_messages/oauth-response.service.mjs +0 -30
- package/esm2022/lib/_messages/progress-spinner.service.mjs +0 -30
- package/esm2022/lib/_messages/reset-pconnect.service.mjs +0 -31
- package/esm2022/lib/_messages/update-worklist.service.mjs +0 -30
- package/esm2022/lib/_services/case.service.mjs +0 -32
- package/esm2022/lib/_services/datapage.service.mjs +0 -52
- package/esm2022/lib/_services/endpoints.mjs +0 -61
- package/esm2022/lib/_services/server-config.service.mjs +0 -52
- package/esm2022/lib/_types/PConnProps.interface.mjs +0 -2
- package/esm2022/pega-angular-sdk-components.mjs +0 -5
- package/esm2022/public-api.mjs +0 -141
- package/esm2022/sdk-local-component-map.mjs +0 -9
- package/lib/_messages/get-login-status.service.d.ts +0 -10
- package/lib/_messages/oauth-response.service.d.ts +0 -14
- package/lib/_messages/reset-pconnect.service.d.ts +0 -15
|
@@ -1,395 +0,0 @@
|
|
|
1
|
-
import { Component, Input, forwardRef, ViewChild } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
4
|
-
import { MatMenuModule } from '@angular/material/menu';
|
|
5
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
6
|
-
import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
|
|
7
|
-
import download from 'downloadjs';
|
|
8
|
-
import { ComponentMapperComponent } from '../../../_bridge/component-mapper/component-mapper.component';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
import * as i1 from "../../../_bridge/angular-pconnect";
|
|
11
|
-
import * as i2 from "../../../_helpers/utils";
|
|
12
|
-
import * as i3 from "@angular/common";
|
|
13
|
-
import * as i4 from "@angular/material/progress-spinner";
|
|
14
|
-
import * as i5 from "@angular/material/menu";
|
|
15
|
-
import * as i6 from "@angular/material/icon";
|
|
16
|
-
import * as i7 from "@angular/material/button";
|
|
17
|
-
export class AttachmentComponent {
|
|
18
|
-
constructor(angularPConnect, utils, ngZone) {
|
|
19
|
-
this.angularPConnect = angularPConnect;
|
|
20
|
-
this.utils = utils;
|
|
21
|
-
this.ngZone = ngZone;
|
|
22
|
-
// For interaction with AngularPConnect
|
|
23
|
-
this.angularPConnectData = {};
|
|
24
|
-
this.label$ = '';
|
|
25
|
-
this.bRequired$ = false;
|
|
26
|
-
this.bReadonly$ = false;
|
|
27
|
-
this.bDisabled$ = false;
|
|
28
|
-
this.bVisible$ = true;
|
|
29
|
-
this.bLoading$ = false;
|
|
30
|
-
this.bShowSelector$ = true;
|
|
31
|
-
this.fileTemp = {};
|
|
32
|
-
this.allowMultiple$ = false;
|
|
33
|
-
this.extensions$ = '';
|
|
34
|
-
this.status = '';
|
|
35
|
-
this.validateMessage = '';
|
|
36
|
-
this.localizedVal = PCore.getLocaleUtils().getLocaleValue;
|
|
37
|
-
this.localeCategory = 'CosmosFields';
|
|
38
|
-
this.uploadMultipleFilesLabel = this.localizedVal('file_upload_text_multiple', this.localeCategory);
|
|
39
|
-
this.uploadSingleFileLabel = this.localizedVal('file_upload_text_one', this.localeCategory);
|
|
40
|
-
this.filesWithError = [];
|
|
41
|
-
this.files = [];
|
|
42
|
-
this.fileDownload = (data, fileName, ext) => {
|
|
43
|
-
const file = ext ? `${fileName}.${ext}` : fileName;
|
|
44
|
-
download(atob(data), file);
|
|
45
|
-
};
|
|
46
|
-
this.getAttachmentKey = (name = '') => (name ? `attachmentsList.${name}` : 'attachmentsList');
|
|
47
|
-
this.validateFileExtension = (fileObj, allowedExtensions) => {
|
|
48
|
-
if (!allowedExtensions) {
|
|
49
|
-
return true;
|
|
50
|
-
}
|
|
51
|
-
const allowedExtensionList = allowedExtensions
|
|
52
|
-
.toLowerCase()
|
|
53
|
-
.split(',')
|
|
54
|
-
.map(item => item.replaceAll('.', '').trim());
|
|
55
|
-
const extension = fileObj.name.split('.').pop().toLowerCase();
|
|
56
|
-
return allowedExtensionList.includes(extension);
|
|
57
|
-
};
|
|
58
|
-
}
|
|
59
|
-
ngOnInit() {
|
|
60
|
-
// // First thing in initialization is registering and subscribing to the AngularPConnect service
|
|
61
|
-
this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
|
|
62
|
-
this.caseID = PCore.getStoreValue('.pyID', 'caseInfo.content', this.pConn$.getContextName());
|
|
63
|
-
this.srcImg = this.utils.getImageSrc('document-doc', this.utils.getSDKStaticContentUrl());
|
|
64
|
-
this.deleteIcon = this.utils.getImageSrc('trash', this.utils.getSDKStaticContentUrl());
|
|
65
|
-
this.checkAndUpdate();
|
|
66
|
-
this.getAttachments();
|
|
67
|
-
}
|
|
68
|
-
getAttachments() {
|
|
69
|
-
let tempUploadedFiles = this.getCurrentAttachmentsList(this.getAttachmentKey(this.valueRef), this.pConn$.getContextName());
|
|
70
|
-
tempUploadedFiles = tempUploadedFiles.filter(f => f.label === this.valueRef && f.delete !== true);
|
|
71
|
-
this.files?.map(f => {
|
|
72
|
-
return f.responseProps?.pzInsKey && !f.responseProps.pzInsKey.includes('temp')
|
|
73
|
-
? {
|
|
74
|
-
...f,
|
|
75
|
-
props: {
|
|
76
|
-
...f.props,
|
|
77
|
-
onDelete: () => this.deleteFile(f)
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
: { ...f };
|
|
81
|
-
});
|
|
82
|
-
this.files = [...this.files, ...tempUploadedFiles];
|
|
83
|
-
PCore.getPubSubUtils().subscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.resetAttachmentStoredState.bind(this), this.caseID);
|
|
84
|
-
return () => {
|
|
85
|
-
PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
checkAndUpdate() {
|
|
89
|
-
// Should always check the bridge to see if the component should
|
|
90
|
-
// update itself (re-render)
|
|
91
|
-
const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
|
|
92
|
-
// ONLY call updateSelf when the component should update
|
|
93
|
-
if (bUpdateSelf) {
|
|
94
|
-
this.updateSelf();
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
// Callback passed when subscribing to store change
|
|
98
|
-
onStateChange() {
|
|
99
|
-
this.checkAndUpdate();
|
|
100
|
-
}
|
|
101
|
-
updateSelf() {
|
|
102
|
-
const configProps = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps());
|
|
103
|
-
const stateProps = this.pConn$.getStateProps();
|
|
104
|
-
const { value, label, extensions, displayMode } = configProps;
|
|
105
|
-
if (configProps.required != null) {
|
|
106
|
-
this.bRequired$ = this.utils.getBooleanValue(configProps.required);
|
|
107
|
-
}
|
|
108
|
-
if (configProps.visibility != null) {
|
|
109
|
-
this.bVisible$ = this.utils.getBooleanValue(configProps.visibility);
|
|
110
|
-
}
|
|
111
|
-
// disabled
|
|
112
|
-
if (configProps.disabled != undefined) {
|
|
113
|
-
this.bDisabled$ = this.utils.getBooleanValue(configProps.disabled);
|
|
114
|
-
}
|
|
115
|
-
if (configProps.readOnly != null) {
|
|
116
|
-
this.bReadonly$ = this.utils.getBooleanValue(configProps.readOnly);
|
|
117
|
-
}
|
|
118
|
-
if (configProps.allowMultiple != null) {
|
|
119
|
-
this.allowMultiple$ = this.utils.getBooleanValue(configProps.allowMultiple);
|
|
120
|
-
}
|
|
121
|
-
this.label$ = label;
|
|
122
|
-
this.value$ = value;
|
|
123
|
-
this.status = stateProps.status;
|
|
124
|
-
this.validateMessage = this.angularPConnectData.validateMessage;
|
|
125
|
-
this.extensions$ = extensions;
|
|
126
|
-
this.valueRef = this.pConn$.getStateProps().value;
|
|
127
|
-
this.valueRef = this.valueRef.startsWith('.') ? this.valueRef.substring(1) : this.valueRef;
|
|
128
|
-
this.displayMode = displayMode;
|
|
129
|
-
/* this is a temporary fix because required is supposed to be passed as a boolean and NOT as a string */
|
|
130
|
-
let { required, disabled } = configProps;
|
|
131
|
-
[required, disabled] = [required, disabled].map(prop => prop === true || (typeof prop === 'string' && prop === 'true'));
|
|
132
|
-
this.categoryName = '';
|
|
133
|
-
if (value && value.pyCategoryName) {
|
|
134
|
-
this.categoryName = value.pyCategoryName;
|
|
135
|
-
}
|
|
136
|
-
if (value?.pxResults && +value.pyCount > 0) {
|
|
137
|
-
this.files = value.pxResults.map(f => this.buildFilePropsFromResponse(f));
|
|
138
|
-
}
|
|
139
|
-
this.updateAttachments();
|
|
140
|
-
}
|
|
141
|
-
buildFilePropsFromResponse(respObj) {
|
|
142
|
-
return {
|
|
143
|
-
props: {
|
|
144
|
-
meta: `${respObj.pyCategoryName}, ${respObj.pxCreateOperator}`,
|
|
145
|
-
name: respObj.pyAttachName,
|
|
146
|
-
icon: this.utils.getIconFromFileType(respObj.pyMimeFileExtension)
|
|
147
|
-
},
|
|
148
|
-
responseProps: {
|
|
149
|
-
...respObj
|
|
150
|
-
}
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
updateAttachments() {
|
|
154
|
-
if (this.files.length > 0 && this.displayMode !== 'DISPLAY_ONLY') {
|
|
155
|
-
const currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.valueRef), this.pConn$.getContextName());
|
|
156
|
-
// block duplicate files to redux store when added 1 after another to prevent multiple duplicates being added to the case on submit
|
|
157
|
-
const tempFiles = this.files.filter(f => currentAttachmentList.findIndex(fr => fr.ID === f.ID) === -1 && !f.inProgress && f.responseProps);
|
|
158
|
-
const updatedAttList = [...currentAttachmentList, ...tempFiles];
|
|
159
|
-
this.updateAttachmentState(this.pConn$, this.getAttachmentKey(this.valueRef), updatedAttList);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
resetAttachmentStoredState() {
|
|
163
|
-
PCore.getStateUtils().updateState(this.pConn$?.getContextName(), this.getAttachmentKey(this.valueRef), undefined, {
|
|
164
|
-
pageReference: 'context_data',
|
|
165
|
-
isArrayDeepMerge: false
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
downloadFile(fileObj) {
|
|
169
|
-
PCore.getAttachmentUtils()
|
|
170
|
-
// @ts-ignore - 3rd parameter "responseEncoding" should be optional
|
|
171
|
-
.downloadAttachment(fileObj.pzInsKey, this.pConn$.getContextName())
|
|
172
|
-
.then((content) => {
|
|
173
|
-
const extension = fileObj.pyAttachName.split('.').pop();
|
|
174
|
-
this.fileDownload(content.data, fileObj.pyFileName, extension);
|
|
175
|
-
})
|
|
176
|
-
.catch(e => {
|
|
177
|
-
console.log(e);
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
getCurrentAttachmentsList(key, context) {
|
|
181
|
-
return PCore.getStoreValue(`.${key}`, 'context_data', context) || [];
|
|
182
|
-
}
|
|
183
|
-
validateMaxSize(fileObj, maxSizeInMB) {
|
|
184
|
-
const fileSize = (fileObj.size / 1048576).toFixed(2);
|
|
185
|
-
return parseFloat(fileSize) < parseFloat(maxSizeInMB);
|
|
186
|
-
}
|
|
187
|
-
updateAttachmentState(pConn, key, attachments) {
|
|
188
|
-
PCore.getStateUtils().updateState(this.pConn$.getContextName(), key, attachments, {
|
|
189
|
-
pageReference: 'context_data',
|
|
190
|
-
isArrayDeepMerge: false
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
deleteFile(file) {
|
|
194
|
-
const attachmentsList = [];
|
|
195
|
-
let currentAttachmentList = this.getCurrentAttachmentsList(this.getAttachmentKey(this.valueRef), this.pConn$.getContextName());
|
|
196
|
-
// If file to be deleted is the one added in previous stage i.e. for which a file instance is created in server
|
|
197
|
-
// no need to filter currentAttachmentList as we will get another entry of file in redux with delete & label
|
|
198
|
-
// eslint-disable-next-line no-unsafe-optional-chaining
|
|
199
|
-
if (this.value$ && this.value$?.pxResults && +this.value$?.pyCount > 0 && file.responseProps && file?.responseProps?.pzInsKey !== 'temp') {
|
|
200
|
-
const updatedAttachments = this.files.map(f => {
|
|
201
|
-
if (f.responseProps && f.responseProps.pzInsKey === file.responseProps.pzInsKey) {
|
|
202
|
-
return { ...f, delete: true, label: this.valueRef };
|
|
203
|
-
}
|
|
204
|
-
return f;
|
|
205
|
-
});
|
|
206
|
-
// updating the redux store to help form-handler in passing the data to delete the file from server
|
|
207
|
-
this.updateAttachmentState(this.pConn$, this.getAttachmentKey(this.valueRef), [...updatedAttachments]);
|
|
208
|
-
const newlyAddedFiles = this.files.filter(f => !!f.ID);
|
|
209
|
-
const filesPostDelete = this.files.filter(f => f.responseProps?.pzInsKey !== 'temp' && f.responseProps?.pzInsKey !== file.responseProps?.pzInsKey);
|
|
210
|
-
this.files = [...filesPostDelete, ...newlyAddedFiles];
|
|
211
|
-
} // if the file being deleted is the added in this stage i.e. whose data is not yet created in server
|
|
212
|
-
else {
|
|
213
|
-
// filter newly added files in this stage, later the updated current stage files will be added to redux once files state is updated
|
|
214
|
-
currentAttachmentList = currentAttachmentList.filter(f => f.ID !== file.ID);
|
|
215
|
-
this.files = this.files.filter(f => f.ID !== file.ID);
|
|
216
|
-
this.updateAttachmentState(this.pConn$, this.getAttachmentKey(this.valueRef), [...currentAttachmentList, ...attachmentsList]);
|
|
217
|
-
if (file.inProgress) {
|
|
218
|
-
// @ts-ignore - 3rd parameter "responseEncoding" should be optional
|
|
219
|
-
PCore.getAttachmentUtils().cancelRequest(file.ID, pConn.getContextName());
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
this.filesWithError = this.filesWithError?.filter(f => f.ID !== file.ID);
|
|
223
|
-
if (this.filesWithError.length === 0) {
|
|
224
|
-
this.clearFieldErrorMessages();
|
|
225
|
-
}
|
|
226
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
227
|
-
this.fileInput && this.fileInput.nativeElement.value ? null : '';
|
|
228
|
-
}
|
|
229
|
-
onFileAdded(event) {
|
|
230
|
-
let addedFiles = Array.from(event.target.files);
|
|
231
|
-
addedFiles = this.allowMultiple$ ? addedFiles : [addedFiles[0]];
|
|
232
|
-
const maxAttachmentSize = PCore.getEnvironmentInfo().getMaxAttachmentSize() || '5';
|
|
233
|
-
this.tempFilesToBeUploaded = [
|
|
234
|
-
...addedFiles.map((f, index) => {
|
|
235
|
-
f.ID = `${new Date().getTime()}I${index}`;
|
|
236
|
-
f.inProgress = true;
|
|
237
|
-
f.props = {
|
|
238
|
-
type: f.type,
|
|
239
|
-
name: f.name,
|
|
240
|
-
icon: this.utils.getIconFromFileType(f.type),
|
|
241
|
-
onDelete: () => this.deleteFile(f)
|
|
242
|
-
};
|
|
243
|
-
if (!this.validateMaxSize(f, maxAttachmentSize)) {
|
|
244
|
-
f.props.error = true;
|
|
245
|
-
f.inProgress = false;
|
|
246
|
-
f.props.meta = this.pConn$.getLocalizedValue(`File is too big. Max allowed size is ${maxAttachmentSize}MB.`, '', '');
|
|
247
|
-
}
|
|
248
|
-
else if (!this.validateFileExtension(f, this.extensions$)) {
|
|
249
|
-
f.props.error = true;
|
|
250
|
-
f.inProgress = false;
|
|
251
|
-
f.props.meta = `${this.pConn$.getLocalizedValue('File has invalid extension. Allowed extensions are:', '', '')} ${this.extensions$.replaceAll('.', '')}`;
|
|
252
|
-
}
|
|
253
|
-
if (f.props.error) {
|
|
254
|
-
const fieldName = this.pConn$.getStateProps().value;
|
|
255
|
-
const context = this.pConn$.getContextName();
|
|
256
|
-
PCore.getMessageManager().addMessages({
|
|
257
|
-
messages: [
|
|
258
|
-
{
|
|
259
|
-
type: 'error',
|
|
260
|
-
// @ts-ignore - Type '{ type: string; message: string; }' is not assignable to type 'MessagesConfigObject'.
|
|
261
|
-
message: pConn.getLocalizedValue('Error with one or more files', '', '')
|
|
262
|
-
}
|
|
263
|
-
],
|
|
264
|
-
property: fieldName,
|
|
265
|
-
pageReference: this.pConn$.getPageReference(),
|
|
266
|
-
context
|
|
267
|
-
});
|
|
268
|
-
}
|
|
269
|
-
return f;
|
|
270
|
-
})
|
|
271
|
-
];
|
|
272
|
-
const tempFilesWithError = this.tempFilesToBeUploaded.filter(f => f.props.error);
|
|
273
|
-
if (tempFilesWithError.length > 0) {
|
|
274
|
-
this.filesWithError = tempFilesWithError;
|
|
275
|
-
}
|
|
276
|
-
if (!this.allowMultiple$) {
|
|
277
|
-
this.files = [...this.tempFilesToBeUploaded];
|
|
278
|
-
}
|
|
279
|
-
else {
|
|
280
|
-
this.files = [...this.files, ...this.tempFilesToBeUploaded];
|
|
281
|
-
}
|
|
282
|
-
this.uploadFiles();
|
|
283
|
-
}
|
|
284
|
-
clearFieldErrorMessages() {
|
|
285
|
-
const fieldName = this.pConn$.getStateProps().value;
|
|
286
|
-
const context = this.pConn$.getContextName();
|
|
287
|
-
PCore.getMessageManager().clearMessages({
|
|
288
|
-
type: PCore.getConstants().MESSAGES.MESSAGES_TYPE_ERROR,
|
|
289
|
-
property: fieldName,
|
|
290
|
-
pageReference: this.pConn$.getPageReference(),
|
|
291
|
-
context
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
onUploadProgress() { }
|
|
295
|
-
errorHandler(isFetchCanceled, attachedFile) {
|
|
296
|
-
return error => {
|
|
297
|
-
if (!isFetchCanceled(error)) {
|
|
298
|
-
let uploadFailMsg = this.pConn$.getLocalizedValue('Something went wrong', '', '');
|
|
299
|
-
if (error.response && error.response.data && error.response.data.errorDetails) {
|
|
300
|
-
uploadFailMsg = this.pConn$.getLocalizedValue(error.response.data.errorDetails[0].localizedValue, '', '');
|
|
301
|
-
}
|
|
302
|
-
this.files.map(f => {
|
|
303
|
-
if (f.ID === attachedFile.ID) {
|
|
304
|
-
f.props.meta = uploadFailMsg;
|
|
305
|
-
f.props.error = true;
|
|
306
|
-
f.props.onDelete = () => this.deleteFile(f);
|
|
307
|
-
f.props.icon = this.utils.getIconFromFileType(f.type);
|
|
308
|
-
f.props.name = this.pConn$.getLocalizedValue('Unable to upload file', '', '');
|
|
309
|
-
f.inProgress = false;
|
|
310
|
-
const fieldName = this.pConn$.getStateProps().value;
|
|
311
|
-
const context = this.pConn$.getContextName();
|
|
312
|
-
// set errors to property to block submit even on errors in file upload
|
|
313
|
-
PCore.getMessageManager().addMessages({
|
|
314
|
-
messages: [
|
|
315
|
-
{
|
|
316
|
-
type: 'error',
|
|
317
|
-
// @ts-ignore - Type '{ type: string; message: string; }' is not assignable to type 'MessagesConfigObject'.
|
|
318
|
-
message: this.pConn$.getLocalizedValue('Error with one or more files', '', '')
|
|
319
|
-
}
|
|
320
|
-
],
|
|
321
|
-
property: fieldName,
|
|
322
|
-
pageReference: this.pConn$.getPageReference(),
|
|
323
|
-
context
|
|
324
|
-
});
|
|
325
|
-
delete f.props.progress;
|
|
326
|
-
}
|
|
327
|
-
return f;
|
|
328
|
-
});
|
|
329
|
-
}
|
|
330
|
-
throw error;
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
uploadFiles() {
|
|
334
|
-
const filesToBeUploaded = this.files
|
|
335
|
-
.filter(e => {
|
|
336
|
-
const isFileUploaded = e.props && e.props.progress === 100;
|
|
337
|
-
const fileHasError = e.props && e.props.error;
|
|
338
|
-
const isFileUploadedinLastStep = e.responseProps && e.responseProps.pzInsKey;
|
|
339
|
-
return !isFileUploaded && !fileHasError && !isFileUploadedinLastStep;
|
|
340
|
-
})
|
|
341
|
-
.map(f => window.PCore.getAttachmentUtils().uploadAttachment(f, () => {
|
|
342
|
-
this.onUploadProgress();
|
|
343
|
-
}, isFetchCanceled => {
|
|
344
|
-
return this.errorHandler(isFetchCanceled, f);
|
|
345
|
-
}, this.pConn$.getContextName()));
|
|
346
|
-
Promise.allSettled(filesToBeUploaded)
|
|
347
|
-
.then((fileResponses) => {
|
|
348
|
-
fileResponses = fileResponses.filter(fr => fr.status !== 'rejected'); // in case of deleting an in progress file, promise gets cancelled but still enters then block
|
|
349
|
-
if (fileResponses.length > 0) {
|
|
350
|
-
this.files.forEach(f => {
|
|
351
|
-
const index = fileResponses.findIndex((fr) => fr.value.clientFileID === f.ID);
|
|
352
|
-
if (index >= 0) {
|
|
353
|
-
f.props.meta = this.pConn$.getLocalizedValue('Uploaded successfully', '', '');
|
|
354
|
-
f.props.progress = 100;
|
|
355
|
-
f.inProgress = false;
|
|
356
|
-
f.handle = fileResponses[index].value.ID;
|
|
357
|
-
f.label = this.valueRef;
|
|
358
|
-
f.category = this.categoryName;
|
|
359
|
-
f.responseProps = {
|
|
360
|
-
pzInsKey: 'temp',
|
|
361
|
-
pyAttachName: f.props.name
|
|
362
|
-
};
|
|
363
|
-
}
|
|
364
|
-
});
|
|
365
|
-
this.updateAttachments();
|
|
366
|
-
if (this.filesWithError?.length === 0) {
|
|
367
|
-
this.clearFieldErrorMessages();
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
})
|
|
371
|
-
.catch(error => {
|
|
372
|
-
console.log(error);
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
ngOnDestroy() {
|
|
376
|
-
if (this.angularPConnectData.unsubscribeFn) {
|
|
377
|
-
this.angularPConnectData.unsubscribeFn();
|
|
378
|
-
}
|
|
379
|
-
PCore.getPubSubUtils().unsubscribe(PCore.getConstants().PUB_SUB_EVENTS.CASE_EVENTS.ASSIGNMENT_SUBMISSION, this.caseID);
|
|
380
|
-
}
|
|
381
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AttachmentComponent, deps: [{ token: i1.AngularPConnectService }, { token: i2.Utils }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
382
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AttachmentComponent, isStandalone: true, selector: "app-attachment", inputs: { pConn$: "pConn$", formGroup$: "formGroup$" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["uploader"], descendants: true }], ngImport: i0, template: "<div class=\"file-upload-container\" *ngIf=\"bVisible$\">\n <span class=\"attachment-label\" [ngClass]=\"{ 'file-label': bRequired$ }\">{{ label$ }}</span>\n <div *ngIf=\"(files.length === 0 && !allowMultiple$) || allowMultiple$\">\n <div\n style=\"margin-bottom: 10px\"\n id=\"attachment-container\"\n [ngClass]=\"validateMessage ? 'psdk-modal-file-selector-error' : 'psdk-modal-file-selector'\"\n >\n <div [hidden]=\"true\" id=\"attachment-ID\">\n {{ valueRef }}\n </div>\n <input hidden type=\"file\" [required]=\"bRequired$\" #uploader [id]=\"valueRef\" [multiple]=\"allowMultiple$\" (change)=\"onFileAdded($event)\" />\n <button mat-stroked-button color=\"primary\" [disabled]=\"bDisabled$\" (click)=\"uploader.click()\">\n {{\n allowMultiple$\n ? uploadMultipleFilesLabel === 'file_upload_text_multiple'\n ? 'Choose files'\n : uploadMultipleFilesLabel\n : uploadSingleFileLabel === 'file_upload_text_one'\n ? 'Choose a file'\n : uploadSingleFileLabel\n }}\n </button>\n </div>\n </div>\n <span *ngIf=\"validateMessage\" class=\"file-error\">{{ validateMessage }}</span>\n <div *ngIf=\"files && files.length > 0\">\n <div *ngFor=\"let file of files\">\n <div class=\"psdk-attachment-card\">\n <div className=\"psdk-utility-card-icon\">\n <img *ngIf=\"!file.inProgress\" class=\"psdk-attachment-card-svg-icon\" src=\"{{ srcImg }}\" />\n <mat-spinner *ngIf=\"file.inProgress\" class=\"progress-spinner\" diameter=\"40\"></mat-spinner>\n </div>\n <div class=\"psdk-attachment-card-main\">\n <div class=\"psdk-attachment-card-main-primary-label\">{{ file.props.name }}</div>\n <div *ngIf=\"file.props.meta\" [ngStyle]=\"{ color: file.props.error ? 'red' : null }\">{{ file.props.meta }}</div>\n </div>\n <div class=\"psdk-attachment-action\">\n <button id=\"delete-attachment\" *ngIf=\"file.ID\" class=\"psdk-utility-button\" (click)=\"deleteFile(file)\">\n <img class=\"psdk-utility-card-action-svg-icon\" src=\"{{ deleteIcon }}\" />\n </button>\n <div *ngIf=\"!file.ID\">\n <button id=\"setting-button\" mat-icon-button [matMenuTriggerFor]=\"actionMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item (click)=\"downloadFile(file.responseProps ? file.responseProps : {})\">Download</button>\n <button mat-menu-item (click)=\"deleteFile(file)\">Delete</button>\n </mat-menu>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".progress-spinner{text-align:center;position:absolute;left:45%}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);padding:.5rem;text-align:center;position:relative}.label-required:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}.file-error{color:var(--app-error-light-color)}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);padding:.5rem;text-align:center;position:relative}.psdk-full-width{width:100%}.psdk-label-readonly{opacity:54%;font-size:.8rem;font-weight:400}.psdk-data-readonly{padding-top:.625rem;width:100%}.psdk-attachment-list{border:1px solid var(--app-neutral-color)}::ng-deep .mat-mdc-form-field-infix{width:auto}.psdk-attachment-card{display:flex;align-items:center;border:.0625rem solid rgb(207,207,207);border-radius:.25rem;padding:.25rem 0rem .25rem .25rem;min-height:3rem;margin-bottom:.5rem}.psdk-attachment-card-main-primary-label{font-weight:500;text-overflow:ellipsis;overflow:hidden;white-space:normal}.psdk-attachment-card-main{flex-grow:2;margin-left:5px}.psdk-attachment-action{flex-grow:1;text-align:right}.psdk-attachment-card-svg-icon{width:2.5rem}.psdk-utility-button{background:none;border:none;margin-right:.5rem;cursor:pointer}.psdk-utility-card-action-svg-icon{width:1.4rem;display:inline-block}.file-div{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.5rem;text-align:center;position:relative}.file-div-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.5rem;text-align:center;position:relative}.attachment-label{display:block;margin-bottom:10px}.file-label:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "directive", type: i0.forwardRef(() => i3.NgClass), selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i0.forwardRef(() => i3.NgForOf), selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i0.forwardRef(() => i3.NgIf), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i0.forwardRef(() => i3.NgStyle), selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatProgressSpinnerModule) }, { kind: "component", type: i0.forwardRef(() => i4.MatProgressSpinner), selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatMenuModule) }, { kind: "component", type: i0.forwardRef(() => i5.MatMenu), selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i0.forwardRef(() => i5.MatMenuItem), selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i0.forwardRef(() => i5.MatMenuTrigger), selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatIconModule) }, { kind: "component", type: i0.forwardRef(() => i6.MatIcon), selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatButtonModule) }, { kind: "component", type: i0.forwardRef(() => i7.MatButton), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(() => i7.MatIconButton), selector: "button[mat-icon-button]", exportAs: ["matButton"] }] }); }
|
|
383
|
-
}
|
|
384
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AttachmentComponent, decorators: [{
|
|
385
|
-
type: Component,
|
|
386
|
-
args: [{ selector: 'app-attachment', standalone: true, imports: [CommonModule, MatProgressSpinnerModule, MatMenuModule, MatIconModule, MatButtonModule, forwardRef(() => ComponentMapperComponent)], template: "<div class=\"file-upload-container\" *ngIf=\"bVisible$\">\n <span class=\"attachment-label\" [ngClass]=\"{ 'file-label': bRequired$ }\">{{ label$ }}</span>\n <div *ngIf=\"(files.length === 0 && !allowMultiple$) || allowMultiple$\">\n <div\n style=\"margin-bottom: 10px\"\n id=\"attachment-container\"\n [ngClass]=\"validateMessage ? 'psdk-modal-file-selector-error' : 'psdk-modal-file-selector'\"\n >\n <div [hidden]=\"true\" id=\"attachment-ID\">\n {{ valueRef }}\n </div>\n <input hidden type=\"file\" [required]=\"bRequired$\" #uploader [id]=\"valueRef\" [multiple]=\"allowMultiple$\" (change)=\"onFileAdded($event)\" />\n <button mat-stroked-button color=\"primary\" [disabled]=\"bDisabled$\" (click)=\"uploader.click()\">\n {{\n allowMultiple$\n ? uploadMultipleFilesLabel === 'file_upload_text_multiple'\n ? 'Choose files'\n : uploadMultipleFilesLabel\n : uploadSingleFileLabel === 'file_upload_text_one'\n ? 'Choose a file'\n : uploadSingleFileLabel\n }}\n </button>\n </div>\n </div>\n <span *ngIf=\"validateMessage\" class=\"file-error\">{{ validateMessage }}</span>\n <div *ngIf=\"files && files.length > 0\">\n <div *ngFor=\"let file of files\">\n <div class=\"psdk-attachment-card\">\n <div className=\"psdk-utility-card-icon\">\n <img *ngIf=\"!file.inProgress\" class=\"psdk-attachment-card-svg-icon\" src=\"{{ srcImg }}\" />\n <mat-spinner *ngIf=\"file.inProgress\" class=\"progress-spinner\" diameter=\"40\"></mat-spinner>\n </div>\n <div class=\"psdk-attachment-card-main\">\n <div class=\"psdk-attachment-card-main-primary-label\">{{ file.props.name }}</div>\n <div *ngIf=\"file.props.meta\" [ngStyle]=\"{ color: file.props.error ? 'red' : null }\">{{ file.props.meta }}</div>\n </div>\n <div class=\"psdk-attachment-action\">\n <button id=\"delete-attachment\" *ngIf=\"file.ID\" class=\"psdk-utility-button\" (click)=\"deleteFile(file)\">\n <img class=\"psdk-utility-card-action-svg-icon\" src=\"{{ deleteIcon }}\" />\n </button>\n <div *ngIf=\"!file.ID\">\n <button id=\"setting-button\" mat-icon-button [matMenuTriggerFor]=\"actionMenu\">\n <mat-icon>more_vert</mat-icon>\n </button>\n <mat-menu #actionMenu=\"matMenu\">\n <button mat-menu-item (click)=\"downloadFile(file.responseProps ? file.responseProps : {})\">Download</button>\n <button mat-menu-item (click)=\"deleteFile(file)\">Delete</button>\n </mat-menu>\n </div>\n </div>\n </div>\n </div>\n </div>\n</div>\n", styles: [".progress-spinner{text-align:center;position:absolute;left:45%}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.3rem;text-align:center;position:relative}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);padding:.5rem;text-align:center;position:relative}.label-required:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}.file-error{color:var(--app-error-light-color)}.psdk-modal-file-selector-error{border:1px dashed var(--app-error-light-color);padding:.5rem;text-align:center;position:relative}.psdk-full-width{width:100%}.psdk-label-readonly{opacity:54%;font-size:.8rem;font-weight:400}.psdk-data-readonly{padding-top:.625rem;width:100%}.psdk-attachment-list{border:1px solid var(--app-neutral-color)}::ng-deep .mat-mdc-form-field-infix{width:auto}.psdk-attachment-card{display:flex;align-items:center;border:.0625rem solid rgb(207,207,207);border-radius:.25rem;padding:.25rem 0rem .25rem .25rem;min-height:3rem;margin-bottom:.5rem}.psdk-attachment-card-main-primary-label{font-weight:500;text-overflow:ellipsis;overflow:hidden;white-space:normal}.psdk-attachment-card-main{flex-grow:2;margin-left:5px}.psdk-attachment-action{flex-grow:1;text-align:right}.psdk-attachment-card-svg-icon{width:2.5rem}.psdk-utility-button{background:none;border:none;margin-right:.5rem;cursor:pointer}.psdk-utility-card-action-svg-icon{width:1.4rem;display:inline-block}.file-div{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.5rem;text-align:center;position:relative}.file-div-error{border:1px dashed var(--app-error-light-color);width:100%;padding:.5rem;text-align:center;position:relative}.attachment-label{display:block;margin-bottom:10px}.file-label:after{display:inline;content:\" *\";vertical-align:top;color:var(--app-neutral-dark-color)}\n"] }]
|
|
387
|
-
}], ctorParameters: () => [{ type: i1.AngularPConnectService }, { type: i2.Utils }, { type: i0.NgZone }], propDecorators: { pConn$: [{
|
|
388
|
-
type: Input
|
|
389
|
-
}], formGroup$: [{
|
|
390
|
-
type: Input
|
|
391
|
-
}], fileInput: [{
|
|
392
|
-
type: ViewChild,
|
|
393
|
-
args: ['uploader', { static: false }]
|
|
394
|
-
}] } });
|
|
395
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXR0YWNobWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2F0dGFjaG1lbnQvYXR0YWNobWVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBVSxVQUFVLEVBQWEsU0FBUyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRS9HLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM5RSxPQUFPLFFBQVEsTUFBTSxZQUFZLENBQUM7QUFHbEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOERBQThELENBQUM7Ozs7Ozs7OztBQWlCeEcsTUFBTSxPQUFPLG1CQUFtQjtJQW9DOUIsWUFDVSxlQUF1QyxFQUN2QyxLQUFZLEVBQ1osTUFBYztRQUZkLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUN2QyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1osV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQW5DeEIsdUNBQXVDO1FBQ3ZDLHdCQUFtQixHQUF3QixFQUFFLENBQUM7UUFHOUMsV0FBTSxH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dCB7IENvbXBvbmVudCwgT25Jbml0LCBJbnB1dCwgTmdab25lLCBmb3J3YXJkUmVmLCBPbkRlc3Ryb3ksIFZpZXdDaGlsZCwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRNZW51TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbWVudSc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyJztcbmltcG9ydCBkb3dubG9hZCBmcm9tICdkb3dubG9hZGpzJztcbmltcG9ydCB7IEFuZ3VsYXJQQ29ubmVjdERhdGEsIEFuZ3VsYXJQQ29ubmVjdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9fYnJpZGdlL2FuZ3VsYXItcGNvbm5lY3QnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9faGVscGVycy91dGlscyc7XG5pbXBvcnQgeyBDb21wb25lbnRNYXBwZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9fYnJpZGdlL2NvbXBvbmVudC1tYXBwZXIvY29tcG9uZW50LW1hcHBlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgUENvbm5GaWVsZFByb3BzIH0gZnJvbSAnLi4vLi4vLi4vX3R5cGVzL1BDb25uUHJvcHMuaW50ZXJmYWNlJztcblxuaW50ZXJmYWNlIEF0dGFjaG1lbnRQcm9wcyBleHRlbmRzIE9taXQ8UENvbm5GaWVsZFByb3BzLCAndmFsdWUnPiB7XG4gIC8vIElmIGFueSwgZW50ZXIgYWRkaXRpb25hbCBwcm9wcyB0aGF0IG9ubHkgZXhpc3Qgb24gdGhpcyBjb21wb25lbnRcbiAgdmFsdWU6IGFueTtcbiAgZXh0ZW5zaW9uczogYW55O1xuICBhbGxvd011bHRpcGxlOiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtYXR0YWNobWVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9hdHRhY2htZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXR0YWNobWVudC5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsIE1hdE1lbnVNb2R1bGUsIE1hdEljb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgZm9yd2FyZFJlZigoKSA9PiBDb21wb25lbnRNYXBwZXJDb21wb25lbnQpXVxufSlcbmV4cG9ydCBjbGFzcyBBdHRhY2htZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBwQ29ubiQ6IHR5cGVvZiBQQ29ubmVjdDtcbiAgQElucHV0KCkgZm9ybUdyb3VwJDogRm9ybUdyb3VwO1xuXG4gIC8vIEZvciBpbnRlcmFjdGlvbiB3aXRoIEFuZ3VsYXJQQ29ubmVjdFxuICBhbmd1bGFyUENvbm5lY3REYXRhOiBBbmd1bGFyUENvbm5lY3REYXRhID0ge307XG4gIEBWaWV3Q2hpbGQoJ3VwbG9hZGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGZpbGVJbnB1dDogRWxlbWVudFJlZjtcblxuICBsYWJlbCQgPSAnJztcbiAgdmFsdWUkOiBhbnk7XG4gIGJSZXF1aXJlZCQgPSBmYWxzZTtcbiAgYlJlYWRvbmx5JCA9IGZhbHNlO1xuICBiRGlzYWJsZWQkID0gZmFsc2U7XG4gIGJWaXNpYmxlJCA9IHRydWU7XG4gIGJMb2FkaW5nJCA9IGZhbHNlO1xuICBiU2hvd1NlbGVjdG9yJCA9IHRydWU7XG4gIGF0dF9jYXRlZ29yeU5hbWU6IHN0cmluZztcbiAgZmlsZVRlbXA6IGFueSA9IHt9O1xuICBjYXNlSUQ6IGFueTtcbiAgYWxsb3dNdWx0aXBsZSQgPSBmYWxzZTtcbiAgZXh0ZW5zaW9ucyQgPSAnJztcbiAgc3RhdHVzID0gJyc7XG4gIHZhbGlkYXRlTWVzc2FnZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gJyc7XG4gIHZhbHVlUmVmOiBzdHJpbmc7XG4gIGltYWdlUGF0aCQ6IHN0cmluZztcbiAgbG9jYWxpemVkVmFsID0gUENvcmUuZ2V0TG9jYWxlVXRpbHMoKS5nZXRMb2NhbGVWYWx1ZTtcbiAgbG9jYWxlQ2F0ZWdvcnkgPSAnQ29zbW9zRmllbGRzJztcbiAgdXBsb2FkTXVsdGlwbGVGaWxlc0xhYmVsID0gdGhpcy5sb2NhbGl6ZWRWYWwoJ2ZpbGVfdXBsb2FkX3RleHRfbXVsdGlwbGUnLCB0aGlzLmxvY2FsZUNhdGVnb3J5KTtcbiAgdXBsb2FkU2luZ2xlRmlsZUxhYmVsID0gdGhpcy5sb2NhbGl6ZWRWYWwoJ2ZpbGVfdXBsb2FkX3RleHRfb25lJywgdGhpcy5sb2NhbGVDYXRlZ29yeSk7XG4gIGZpbGVzV2l0aEVycm9yOiBhbnkgPSBbXTtcbiAgZmlsZXM6IGFueSA9IFtdO1xuICBjYXRlZ29yeU5hbWU6IHN0cmluZztcbiAgZGlzcGxheU1vZGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgc3JjSW1nOiBhbnk7XG4gIGRlbGV0ZUljb246IHN0cmluZztcbiAgdGVtcEZpbGVzVG9CZVVwbG9hZGVkOiBhbnlbXTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbmd1bGFyUENvbm5lY3Q6IEFuZ3VsYXJQQ29ubmVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1dGlsczogVXRpbHMsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gLy8gRmlyc3QgdGhpbmcgaW4gaW5pdGlhbGl6YXRpb24gaXMgcmVnaXN0ZXJpbmcgYW5kIHN1YnNjcmliaW5nIHRvIHRoZSBBbmd1bGFyUENvbm5lY3Qgc2VydmljZVxuICAgIHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YSA9IHRoaXMuYW5ndWxhclBDb25uZWN0LnJlZ2lzdGVyQW5kU3Vic2NyaWJlQ29tcG9uZW50KHRoaXMsIHRoaXMub25TdGF0ZUNoYW5nZSk7XG4gICAgdGhpcy5jYXNlSUQgPSBQQ29yZS5nZXRTdG9yZVZhbHVlKCcucHlJRCcsICdjYXNlSW5mby5jb250ZW50JywgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSk7XG4gICAgdGhpcy5zcmNJbWcgPSB0aGlzLnV0aWxzLmdldEltYWdlU3JjKCdkb2N1bWVudC1kb2MnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5kZWxldGVJY29uID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygndHJhc2gnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICAgIHRoaXMuZ2V0QXR0YWNobWVudHMoKTtcbiAgfVxuXG4gIGdldEF0dGFjaG1lbnRzKCkge1xuICAgIGxldCB0ZW1wVXBsb2FkZWRGaWxlcyA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy52YWx1ZVJlZiksIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpO1xuICAgIHRlbXBVcGxvYWRlZEZpbGVzID0gdGVtcFVwbG9hZGVkRmlsZXMuZmlsdGVyKGYgPT4gZi5sYWJlbCA9PT0gdGhpcy52YWx1ZVJlZiAmJiBmLmRlbGV0ZSAhPT0gdHJ1ZSk7XG4gICAgdGhpcy5maWxlcz8ubWFwKGYgPT4ge1xuICAgICAgcmV0dXJuIGYucmVzcG9uc2VQcm9wcz8ucHpJbnNLZXkgJiYgIWYucmVzcG9uc2VQcm9wcy5wekluc0tleS5pbmNsdWRlcygndGVtcCcpXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZixcbiAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgIC4uLmYucHJvcHMsXG4gICAgICAgICAgICAgIG9uRGVsZXRlOiAoKSA9PiB0aGlzLmRlbGV0ZUZpbGUoZilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogeyAuLi5mIH07XG4gICAgfSk7XG4gICAgdGhpcy5maWxlcyA9IFsuLi50aGlzLmZpbGVzLCAuLi50ZW1wVXBsb2FkZWRGaWxlc107XG4gICAgUENvcmUuZ2V0UHViU3ViVXRpbHMoKS5zdWJzY3JpYmUoXG4gICAgICBQQ29yZS5nZXRDb25zdGFudHMoKS5QVUJfU1VCX0VWRU5UUy5DQVNFX0VWRU5UUy5BU1NJR05NRU5UX1NVQk1JU1NJT04sXG4gICAgICB0aGlzLnJlc2V0QXR0YWNobWVudFN0b3JlZFN0YXRlLmJpbmQodGhpcyksXG4gICAgICB0aGlzLmNhc2VJRFxuICAgICk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIFBDb3JlLmdldFB1YlN1YlV0aWxzKCkudW5zdWJzY3JpYmUoUENvcmUuZ2V0Q29uc3RhbnRzKCkuUFVCX1NVQl9FVkVOVFMuQ0FTRV9FVkVOVFMuQVNTSUdOTUVOVF9TVUJNSVNTSU9OLCB0aGlzLmNhc2VJRCk7XG4gICAgfTtcbiAgfVxuXG4gIGNoZWNrQW5kVXBkYXRlKCkge1xuICAgIC8vIFNob3VsZCBhbHdheXMgY2hlY2sgdGhlIGJyaWRnZSB0byBzZWUgaWYgdGhlIGNvbXBvbmVudCBzaG91bGRcbiAgICAvLyB1cGRhdGUgaXRzZWxmIChyZS1yZW5kZXIpXG4gICAgY29uc3QgYlVwZGF0ZVNlbGYgPSB0aGlzLmFuZ3VsYXJQQ29ubmVjdC5zaG91bGRDb21wb25lbnRVcGRhdGUodGhpcyk7XG5cbiAgICAvLyBPTkxZIGNhbGwgdXBkYXRlU2VsZiB3aGVuIHRoZSBjb21wb25lbnQgc2hvdWxkIHVwZGF0ZVxuICAgIGlmIChiVXBkYXRlU2VsZikge1xuICAgICAgdGhpcy51cGRhdGVTZWxmKCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ2FsbGJhY2sgcGFzc2VkIHdoZW4gc3Vic2NyaWJpbmcgdG8gc3RvcmUgY2hhbmdlXG4gIG9uU3RhdGVDaGFuZ2UoKSB7XG4gICAgdGhpcy5jaGVja0FuZFVwZGF0ZSgpO1xuICB9XG5cbiAgdXBkYXRlU2VsZigpIHtcbiAgICBjb25zdCBjb25maWdQcm9wczogQXR0YWNobWVudFByb3BzID0gdGhpcy5wQ29ubiQucmVzb2x2ZUNvbmZpZ1Byb3BzKHRoaXMucENvbm4kLmdldENvbmZpZ1Byb3BzKCkpIGFzIEF0dGFjaG1lbnRQcm9wcztcbiAgICBjb25zdCBzdGF0ZVByb3BzOiBhbnkgPSB0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCk7XG4gICAgY29uc3QgeyB2YWx1ZSwgbGFiZWwsIGV4dGVuc2lvbnMsIGRpc3BsYXlNb2RlIH0gPSBjb25maWdQcm9wcztcblxuICAgIGlmIChjb25maWdQcm9wcy5yZXF1aXJlZCAhPSBudWxsKSB7XG4gICAgICB0aGlzLmJSZXF1aXJlZCQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZShjb25maWdQcm9wcy5yZXF1aXJlZCk7XG4gICAgfVxuICAgIGlmIChjb25maWdQcm9wcy52aXNpYmlsaXR5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYlZpc2libGUkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUoY29uZmlnUHJvcHMudmlzaWJpbGl0eSk7XG4gICAgfVxuXG4gICAgLy8gZGlzYWJsZWRcbiAgICBpZiAoY29uZmlnUHJvcHMuZGlzYWJsZWQgIT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmJEaXNhYmxlZCQgPSB0aGlzLnV0aWxzLmdldEJvb2xlYW5WYWx1ZShjb25maWdQcm9wcy5kaXNhYmxlZCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZ1Byb3BzLnJlYWRPbmx5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYlJlYWRvbmx5JCA9IHRoaXMudXRpbHMuZ2V0Qm9vbGVhblZhbHVlKGNvbmZpZ1Byb3BzLnJlYWRPbmx5KTtcbiAgICB9XG5cbiAgICBpZiAoY29uZmlnUHJvcHMuYWxsb3dNdWx0aXBsZSAhPSBudWxsKSB7XG4gICAgICB0aGlzLmFsbG93TXVsdGlwbGUkID0gdGhpcy51dGlscy5nZXRCb29sZWFuVmFsdWUoY29uZmlnUHJvcHMuYWxsb3dNdWx0aXBsZSk7XG4gICAgfVxuXG4gICAgdGhpcy5sYWJlbCQgPSBsYWJlbDtcbiAgICB0aGlzLnZhbHVlJCA9IHZhbHVlO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdGVQcm9wcy5zdGF0dXM7XG5cbiAgICB0aGlzLnZhbGlkYXRlTWVzc2FnZSA9IHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YS52YWxpZGF0ZU1lc3NhZ2U7XG4gICAgdGhpcy5leHRlbnNpb25zJCA9IGV4dGVuc2lvbnM7XG4gICAgdGhpcy52YWx1ZVJlZiA9ICh0aGlzLnBDb25uJC5nZXRTdGF0ZVByb3BzKCkgYXMgYW55KS52YWx1ZTtcbiAgICB0aGlzLnZhbHVlUmVmID0gdGhpcy52YWx1ZVJlZi5zdGFydHNXaXRoKCcuJykgPyB0aGlzLnZhbHVlUmVmLnN1YnN0cmluZygxKSA6IHRoaXMudmFsdWVSZWY7XG4gICAgdGhpcy5kaXNwbGF5TW9kZSA9IGRpc3BsYXlNb2RlO1xuICAgIC8qIHRoaXMgaXMgYSB0ZW1wb3JhcnkgZml4IGJlY2F1c2UgcmVxdWlyZWQgaXMgc3VwcG9zZWQgdG8gYmUgcGFzc2VkIGFzIGEgYm9vbGVhbiBhbmQgTk9UIGFzIGEgc3RyaW5nICovXG4gICAgbGV0IHsgcmVxdWlyZWQsIGRpc2FibGVkIH0gPSBjb25maWdQcm9wcztcbiAgICBbcmVxdWlyZWQsIGRpc2FibGVkXSA9IFtyZXF1aXJlZCwgZGlzYWJsZWRdLm1hcChwcm9wID0+IHByb3AgPT09IHRydWUgfHwgKHR5cGVvZiBwcm9wID09PSAnc3RyaW5nJyAmJiBwcm9wID09PSAndHJ1ZScpKTtcblxuICAgIHRoaXMuY2F0ZWdvcnlOYW1lID0gJyc7XG4gICAgaWYgKHZhbHVlICYmIHZhbHVlLnB5Q2F0ZWdvcnlOYW1lKSB7XG4gICAgICB0aGlzLmNhdGVnb3J5TmFtZSA9IHZhbHVlLnB5Q2F0ZWdvcnlOYW1lO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZT8ucHhSZXN1bHRzICYmICt2YWx1ZS5weUNvdW50ID4gMCkge1xuICAgICAgdGhpcy5maWxlcyA9IHZhbHVlLnB4UmVzdWx0cy5tYXAoZiA9PiB0aGlzLmJ1aWxkRmlsZVByb3BzRnJvbVJlc3BvbnNlKGYpKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUF0dGFjaG1lbnRzKCk7XG4gIH1cblxuICBidWlsZEZpbGVQcm9wc0Zyb21SZXNwb25zZShyZXNwT2JqKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIG1ldGE6IGAke3Jlc3BPYmoucHlDYXRlZ29yeU5hbWV9LCAke3Jlc3BPYmoucHhDcmVhdGVPcGVyYXRvcn1gLFxuICAgICAgICBuYW1lOiByZXNwT2JqLnB5QXR0YWNoTmFtZSxcbiAgICAgICAgaWNvbjogdGhpcy51dGlscy5nZXRJY29uRnJvbUZpbGVUeXBlKHJlc3BPYmoucHlNaW1lRmlsZUV4dGVuc2lvbilcbiAgICAgIH0sXG4gICAgICByZXNwb25zZVByb3BzOiB7XG4gICAgICAgIC4uLnJlc3BPYmpcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgdXBkYXRlQXR0YWNobWVudHMoKSB7XG4gICAgaWYgKHRoaXMuZmlsZXMubGVuZ3RoID4gMCAmJiB0aGlzLmRpc3BsYXlNb2RlICE9PSAnRElTUExBWV9PTkxZJykge1xuICAgICAgY29uc3QgY3VycmVudEF0dGFjaG1lbnRMaXN0ID0gdGhpcy5nZXRDdXJyZW50QXR0YWNobWVudHNMaXN0KHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLnZhbHVlUmVmKSwgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSk7XG4gICAgICAvLyBibG9jayBkdXBsaWNhdGUgZmlsZXMgdG8gcmVkdXggc3RvcmUgd2hlbiBhZGRlZCAxIGFmdGVyIGFub3RoZXIgdG8gcHJldmVudCBtdWx0aXBsZSBkdXBsaWNhdGVzIGJlaW5nIGFkZGVkIHRvIHRoZSBjYXNlIG9uIHN1Ym1pdFxuICAgICAgY29uc3QgdGVtcEZpbGVzID0gdGhpcy5maWxlcy5maWx0ZXIoZiA9PiBjdXJyZW50QXR0YWNobWVudExpc3QuZmluZEluZGV4KGZyID0+IGZyLklEID09PSBmLklEKSA9PT0gLTEgJiYgIWYuaW5Qcm9ncmVzcyAmJiBmLnJlc3BvbnNlUHJvcHMpO1xuICAgICAgY29uc3QgdXBkYXRlZEF0dExpc3QgPSBbLi4uY3VycmVudEF0dGFjaG1lbnRMaXN0LCAuLi50ZW1wRmlsZXNdO1xuICAgICAgdGhpcy51cGRhdGVBdHRhY2htZW50U3RhdGUodGhpcy5wQ29ubiQsIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLnZhbHVlUmVmKSwgdXBkYXRlZEF0dExpc3QpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0QXR0YWNobWVudFN0b3JlZFN0YXRlKCkge1xuICAgIFBDb3JlLmdldFN0YXRlVXRpbHMoKS51cGRhdGVTdGF0ZSh0aGlzLnBDb25uJD8uZ2V0Q29udGV4dE5hbWUoKSwgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMudmFsdWVSZWYpLCB1bmRlZmluZWQsIHtcbiAgICAgIHBhZ2VSZWZlcmVuY2U6ICdjb250ZXh0X2RhdGEnLFxuICAgICAgaXNBcnJheURlZXBNZXJnZTogZmFsc2VcbiAgICB9KTtcbiAgfVxuXG4gIGRvd25sb2FkRmlsZShmaWxlT2JqOiBhbnkpIHtcbiAgICBQQ29yZS5nZXRBdHRhY2htZW50VXRpbHMoKVxuICAgICAgLy8gQHRzLWlnbm9yZSAtIDNyZCBwYXJhbWV0ZXIgXCJyZXNwb25zZUVuY29kaW5nXCIgc2hvdWxkIGJlIG9wdGlvbmFsXG4gICAgICAuZG93bmxvYWRBdHRhY2htZW50KGZpbGVPYmoucHpJbnNLZXksIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpXG4gICAgICAudGhlbigoY29udGVudDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGZpbGVPYmoucHlBdHRhY2hOYW1lLnNwbGl0KCcuJykucG9wKCk7XG4gICAgICAgIHRoaXMuZmlsZURvd25sb2FkKGNvbnRlbnQuZGF0YSwgZmlsZU9iai5weUZpbGVOYW1lLCBleHRlbnNpb24pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIGZpbGVEb3dubG9hZCA9IChkYXRhLCBmaWxlTmFtZSwgZXh0KSA9PiB7XG4gICAgY29uc3QgZmlsZSA9IGV4dCA/IGAke2ZpbGVOYW1lfS4ke2V4dH1gIDogZmlsZU5hbWU7XG4gICAgZG93bmxvYWQoYXRvYihkYXRhKSwgZmlsZSk7XG4gIH07XG5cbiAgZ2V0QXR0YWNobWVudEtleSA9IChuYW1lID0gJycpID0+IChuYW1lID8gYGF0dGFjaG1lbnRzTGlzdC4ke25hbWV9YCA6ICdhdHRhY2htZW50c0xpc3QnKTtcblxuICBnZXRDdXJyZW50QXR0YWNobWVudHNMaXN0KGtleSwgY29udGV4dCkge1xuICAgIHJldHVybiBQQ29yZS5nZXRTdG9yZVZhbHVlKGAuJHtrZXl9YCwgJ2NvbnRleHRfZGF0YScsIGNvbnRleHQpIHx8IFtdO1xuICB9XG5cbiAgdmFsaWRhdGVNYXhTaXplKGZpbGVPYmosIG1heFNpemVJbk1CKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZmlsZVNpemUgPSAoZmlsZU9iai5zaXplIC8gMTA0ODU3NikudG9GaXhlZCgyKTtcbiAgICByZXR1cm4gcGFyc2VGbG9hdChmaWxlU2l6ZSkgPCBwYXJzZUZsb2F0KG1heFNpemVJbk1CKTtcbiAgfVxuXG4gIHZhbGlkYXRlRmlsZUV4dGVuc2lvbiA9IChmaWxlT2JqLCBhbGxvd2VkRXh0ZW5zaW9ucykgPT4ge1xuICAgIGlmICghYWxsb3dlZEV4dGVuc2lvbnMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBhbGxvd2VkRXh0ZW5zaW9uTGlzdCA9IGFsbG93ZWRFeHRlbnNpb25zXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnNwbGl0KCcsJylcbiAgICAgIC5tYXAoaXRlbSA9PiBpdGVtLnJlcGxhY2VBbGwoJy4nLCAnJykudHJpbSgpKTtcbiAgICBjb25zdCBleHRlbnNpb24gPSBmaWxlT2JqLm5hbWUuc3BsaXQoJy4nKS5wb3AoKS50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBhbGxvd2VkRXh0ZW5zaW9uTGlzdC5pbmNsdWRlcyhleHRlbnNpb24pO1xuICB9O1xuXG4gIHVwZGF0ZUF0dGFjaG1lbnRTdGF0ZShwQ29ubiwga2V5LCBhdHRhY2htZW50cykge1xuICAgIFBDb3JlLmdldFN0YXRlVXRpbHMoKS51cGRhdGVTdGF0ZSh0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpLCBrZXksIGF0dGFjaG1lbnRzLCB7XG4gICAgICBwYWdlUmVmZXJlbmNlOiAnY29udGV4dF9kYXRhJyxcbiAgICAgIGlzQXJyYXlEZWVwTWVyZ2U6IGZhbHNlXG4gICAgfSk7XG4gIH1cblxuICBkZWxldGVGaWxlKGZpbGUpIHtcbiAgICBjb25zdCBhdHRhY2htZW50c0xpc3Q6IGFueVtdID0gW107XG4gICAgbGV0IGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IHRoaXMuZ2V0Q3VycmVudEF0dGFjaG1lbnRzTGlzdCh0aGlzLmdldEF0dGFjaG1lbnRLZXkodGhpcy52YWx1ZVJlZiksIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpO1xuXG4gICAgLy8gSWYgZmlsZSB0byBiZSBkZWxldGVkIGlzIHRoZSBvbmUgYWRkZWQgaW4gcHJldmlvdXMgc3RhZ2UgaS5lLiBmb3Igd2hpY2ggYSBmaWxlIGluc3RhbmNlIGlzIGNyZWF0ZWQgaW4gc2VydmVyXG4gICAgLy8gbm8gbmVlZCB0byBmaWx0ZXIgY3VycmVudEF0dGFjaG1lbnRMaXN0IGFzIHdlIHdpbGwgZ2V0IGFub3RoZXIgZW50cnkgb2YgZmlsZSBpbiByZWR1eCB3aXRoIGRlbGV0ZSAmIGxhYmVsXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuc2FmZS1vcHRpb25hbC1jaGFpbmluZ1xuICAgIGlmICh0aGlzLnZhbHVlJCAmJiB0aGlzLnZhbHVlJD8ucHhSZXN1bHRzICYmICt0aGlzLnZhbHVlJD8ucHlDb3VudCA+IDAgJiYgZmlsZS5yZXNwb25zZVByb3BzICYmIGZpbGU/LnJlc3BvbnNlUHJvcHM/LnB6SW5zS2V5ICE9PSAndGVtcCcpIHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRBdHRhY2htZW50cyA9IHRoaXMuZmlsZXMubWFwKGYgPT4ge1xuICAgICAgICBpZiAoZi5yZXNwb25zZVByb3BzICYmIGYucmVzcG9uc2VQcm9wcy5wekluc0tleSA9PT0gZmlsZS5yZXNwb25zZVByb3BzLnB6SW5zS2V5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgLi4uZiwgZGVsZXRlOiB0cnVlLCBsYWJlbDogdGhpcy52YWx1ZVJlZiB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIHVwZGF0aW5nIHRoZSByZWR1eCBzdG9yZSB0byBoZWxwIGZvcm0taGFuZGxlciBpbiBwYXNzaW5nIHRoZSBkYXRhIHRvIGRlbGV0ZSB0aGUgZmlsZSBmcm9tIHNlcnZlclxuICAgICAgdGhpcy51cGRhdGVBdHRhY2htZW50U3RhdGUodGhpcy5wQ29ubiQsIHRoaXMuZ2V0QXR0YWNobWVudEtleSh0aGlzLnZhbHVlUmVmKSwgWy4uLnVwZGF0ZWRBdHRhY2htZW50c10pO1xuICAgICAgY29uc3QgbmV3bHlBZGRlZEZpbGVzID0gdGhpcy5maWxlcy5maWx0ZXIoZiA9PiAhIWYuSUQpO1xuICAgICAgY29uc3QgZmlsZXNQb3N0RGVsZXRlID0gdGhpcy5maWxlcy5maWx0ZXIoXG4gICAgICAgIGYgPT4gZi5yZXNwb25zZVByb3BzPy5wekluc0tleSAhPT0gJ3RlbXAnICYmIGYucmVzcG9uc2VQcm9wcz8ucHpJbnNLZXkgIT09IGZpbGUucmVzcG9uc2VQcm9wcz8ucHpJbnNLZXlcbiAgICAgICk7XG4gICAgICB0aGlzLmZpbGVzID0gWy4uLmZpbGVzUG9zdERlbGV0ZSwgLi4ubmV3bHlBZGRlZEZpbGVzXTtcbiAgICB9IC8vICBpZiB0aGUgZmlsZSBiZWluZyBkZWxldGVkIGlzIHRoZSBhZGRlZCBpbiB0aGlzIHN0YWdlICBpLmUuIHdob3NlIGRhdGEgaXMgbm90IHlldCBjcmVhdGVkIGluIHNlcnZlclxuICAgIGVsc2Uge1xuICAgICAgLy8gZmlsdGVyIG5ld2x5IGFkZGVkIGZpbGVzIGluIHRoaXMgc3RhZ2UsIGxhdGVyIHRoZSB1cGRhdGVkIGN1cnJlbnQgc3RhZ2UgZmlsZXMgd2lsbCBiZSBhZGRlZCB0byByZWR1eCBvbmNlIGZpbGVzIHN0YXRlIGlzIHVwZGF0ZWRcbiAgICAgIGN1cnJlbnRBdHRhY2htZW50TGlzdCA9IGN1cnJlbnRBdHRhY2htZW50TGlzdC5maWx0ZXIoZiA9PiBmLklEICE9PSBmaWxlLklEKTtcbiAgICAgIHRoaXMuZmlsZXMgPSB0aGlzLmZpbGVzLmZpbHRlcihmID0+IGYuSUQgIT09IGZpbGUuSUQpO1xuXG4gICAgICB0aGlzLnVwZGF0ZUF0dGFjaG1lbnRTdGF0ZSh0aGlzLnBDb25uJCwgdGhpcy5nZXRBdHRhY2htZW50S2V5KHRoaXMudmFsdWVSZWYpLCBbLi4uY3VycmVudEF0dGFjaG1lbnRMaXN0LCAuLi5hdHRhY2htZW50c0xpc3RdKTtcbiAgICAgIGlmIChmaWxlLmluUHJvZ3Jlc3MpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSAtIDNyZCBwYXJhbWV0ZXIgXCJyZXNwb25zZUVuY29kaW5nXCIgc2hvdWxkIGJlIG9wdGlvbmFsXG4gICAgICAgIFBDb3JlLmdldEF0dGFjaG1lbnRVdGlscygpLmNhbmNlbFJlcXVlc3QoZmlsZS5JRCwgcENvbm4uZ2V0Q29udGV4dE5hbWUoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5maWxlc1dpdGhFcnJvciA9IHRoaXMuZmlsZXNXaXRoRXJyb3I/LmZpbHRlcihmID0+IGYuSUQgIT09IGZpbGUuSUQpO1xuICAgIGlmICh0aGlzLmZpbGVzV2l0aEVycm9yLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5jbGVhckZpZWxkRXJyb3JNZXNzYWdlcygpO1xuICAgIH1cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC1leHByZXNzaW9uc1xuICAgIHRoaXMuZmlsZUlucHV0ICYmIHRoaXMuZmlsZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPyBudWxsIDogJyc7XG4gIH1cblxuICBvbkZpbGVBZGRlZChldmVudCkge1xuICAgIGxldCBhZGRlZEZpbGVzID0gQXJyYXkuZnJvbShldmVudC50YXJnZXQuZmlsZXMpO1xuICAgIGFkZGVkRmlsZXMgPSB0aGlzLmFsbG93TXVsdGlwbGUkID8gYWRkZWRGaWxlcyA6IFthZGRlZEZpbGVzWzBdXTtcbiAgICBjb25zdCBtYXhBdHRhY2htZW50U2l6ZSA9IFBDb3JlLmdldEVudmlyb25tZW50SW5mbygpLmdldE1heEF0dGFjaG1lbnRTaXplKCkgfHwgJzUnO1xuICAgIHRoaXMudGVtcEZpbGVzVG9CZVVwbG9hZGVkID0gW1xuICAgICAgLi4uYWRkZWRGaWxlcy5tYXAoKGY6IGFueSwgaW5kZXgpID0+IHtcbiAgICAgICAgZi5JRCA9IGAke25ldyBEYXRlKCkuZ2V0VGltZSgpfUkke2luZGV4fWA7XG4gICAgICAgIGYuaW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIGYucHJvcHMgPSB7XG4gICAgICAgICAgdHlwZTogZi50eXBlLFxuICAgICAgICAgIG5hbWU6IGYubmFtZSxcbiAgICAgICAgICBpY29uOiB0aGlzLnV0aWxzLmdldEljb25Gcm9tRmlsZVR5cGUoZi50eXBlKSxcbiAgICAgICAgICBvbkRlbGV0ZTogKCkgPT4gdGhpcy5kZWxldGVGaWxlKGYpXG4gICAgICAgIH07XG4gICAgICAgIGlmICghdGhpcy52YWxpZGF0ZU1heFNpemUoZiwgbWF4QXR0YWNobWVudFNpemUpKSB7XG4gICAgICAgICAgZi5wcm9wcy5lcnJvciA9IHRydWU7XG4gICAgICAgICAgZi5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgZi5wcm9wcy5tZXRhID0gdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoYEZpbGUgaXMgdG9vIGJpZy4gTWF4IGFsbG93ZWQgc2l6ZSBpcyAke21heEF0dGFjaG1lbnRTaXplfU1CLmAsICcnLCAnJyk7XG4gICAgICAgIH0gZWxzZSBpZiAoIXRoaXMudmFsaWRhdGVGaWxlRXh0ZW5zaW9uKGYsIHRoaXMuZXh0ZW5zaW9ucyQpKSB7XG4gICAgICAgICAgZi5wcm9wcy5lcnJvciA9IHRydWU7XG4gICAgICAgICAgZi5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgZi5wcm9wcy5tZXRhID0gYCR7dGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoXG4gICAgICAgICAgICAnRmlsZSBoYXMgaW52YWxpZCBleHRlbnNpb24uIEFsbG93ZWQgZXh0ZW5zaW9ucyBhcmU6JyxcbiAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgJydcbiAgICAgICAgICApfSAke3RoaXMuZXh0ZW5zaW9ucyQucmVwbGFjZUFsbCgnLicsICcnKX1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmLnByb3BzLmVycm9yKSB7XG4gICAgICAgICAgY29uc3QgZmllbGROYW1lID0gKHRoaXMucENvbm4kLmdldFN0YXRlUHJvcHMoKSBhcyBhbnkpLnZhbHVlO1xuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpO1xuICAgICAgICAgIFBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCkuYWRkTWVzc2FnZXMoe1xuICAgICAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSAtIFR5cGUgJ3sgdHlwZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmc7IH0nIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ01lc3NhZ2VzQ29uZmlnT2JqZWN0Jy5cbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBwQ29ubi5nZXRMb2NhbGl6ZWRWYWx1ZSgnRXJyb3Igd2l0aCBvbmUgb3IgbW9yZSBmaWxlcycsICcnLCAnJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHByb3BlcnR5OiBmaWVsZE5hbWUsXG4gICAgICAgICAgICBwYWdlUmVmZXJlbmNlOiB0aGlzLnBDb25uJC5nZXRQYWdlUmVmZXJlbmNlKCksXG4gICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGY7XG4gICAgICB9KVxuICAgIF07XG4gICAgY29uc3QgdGVtcEZpbGVzV2l0aEVycm9yID0gdGhpcy50ZW1wRmlsZXNUb0JlVXBsb2FkZWQuZmlsdGVyKGYgPT4gZi5wcm9wcy5lcnJvcik7XG4gICAgaWYgKHRlbXBGaWxlc1dpdGhFcnJvci5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmZpbGVzV2l0aEVycm9yID0gdGVtcEZpbGVzV2l0aEVycm9yO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuYWxsb3dNdWx0aXBsZSQpIHtcbiAgICAgIHRoaXMuZmlsZXMgPSBbLi4udGhpcy50ZW1wRmlsZXNUb0JlVXBsb2FkZWRdO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZpbGVzID0gWy4uLnRoaXMuZmlsZXMsIC4uLnRoaXMudGVtcEZpbGVzVG9CZVVwbG9hZGVkXTtcbiAgICB9XG4gICAgdGhpcy51cGxvYWRGaWxlcygpO1xuICB9XG5cbiAgY2xlYXJGaWVsZEVycm9yTWVzc2FnZXMoKSB7XG4gICAgY29uc3QgZmllbGROYW1lID0gKHRoaXMucENvbm4kLmdldFN0YXRlUHJvcHMoKSBhcyBhbnkpLnZhbHVlO1xuICAgIGNvbnN0IGNvbnRleHQgPSB0aGlzLnBDb25uJC5nZXRDb250ZXh0TmFtZSgpO1xuICAgIFBDb3JlLmdldE1lc3NhZ2VNYW5hZ2VyKCkuY2xlYXJNZXNzYWdlcyh7XG4gICAgICB0eXBlOiBQQ29yZS5nZXRDb25zdGFudHMoKS5NRVNTQUdFUy5NRVNTQUdFU19UWVBFX0VSUk9SLFxuICAgICAgcHJvcGVydHk6IGZpZWxkTmFtZSxcbiAgICAgIHBhZ2VSZWZlcmVuY2U6IHRoaXMucENvbm4kLmdldFBhZ2VSZWZlcmVuY2UoKSxcbiAgICAgIGNvbnRleHRcbiAgICB9KTtcbiAgfVxuXG4gIG9uVXBsb2FkUHJvZ3Jlc3MoKSB7fVxuXG4gIGVycm9ySGFuZGxlcihpc0ZldGNoQ2FuY2VsZWQsIGF0dGFjaGVkRmlsZSkge1xuICAgIHJldHVybiBlcnJvciA9PiB7XG4gICAgICBpZiAoIWlzRmV0Y2hDYW5jZWxlZChlcnJvcikpIHtcbiAgICAgICAgbGV0IHVwbG9hZEZhaWxNc2cgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnU29tZXRoaW5nIHdlbnQgd3JvbmcnLCAnJywgJycpO1xuICAgICAgICBpZiAoZXJyb3IucmVzcG9uc2UgJiYgZXJyb3IucmVzcG9uc2UuZGF0YSAmJiBlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yRGV0YWlscykge1xuICAgICAgICAgIHVwbG9hZEZhaWxNc2cgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZShlcnJvci5yZXNwb25zZS5kYXRhLmVycm9yRGV0YWlsc1swXS5sb2NhbGl6ZWRWYWx1ZSwgJycsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmlsZXMubWFwKGYgPT4ge1xuICAgICAgICAgIGlmIChmLklEID09PSBhdHRhY2hlZEZpbGUuSUQpIHtcbiAgICAgICAgICAgIGYucHJvcHMubWV0YSA9IHVwbG9hZEZhaWxNc2c7XG4gICAgICAgICAgICBmLnByb3BzLmVycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgIGYucHJvcHMub25EZWxldGUgPSAoKSA9PiB0aGlzLmRlbGV0ZUZpbGUoZik7XG4gICAgICAgICAgICBmLnByb3BzLmljb24gPSB0aGlzLnV0aWxzLmdldEljb25Gcm9tRmlsZVR5cGUoZi50eXBlKTtcbiAgICAgICAgICAgIGYucHJvcHMubmFtZSA9IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdVbmFibGUgdG8gdXBsb2FkIGZpbGUnLCAnJywgJycpO1xuICAgICAgICAgICAgZi5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSAodGhpcy5wQ29ubiQuZ2V0U3RhdGVQcm9wcygpIGFzIGFueSkudmFsdWU7XG4gICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKTtcbiAgICAgICAgICAgIC8vIHNldCBlcnJvcnMgdG8gcHJvcGVydHkgdG8gYmxvY2sgc3VibWl0IGV2ZW4gb24gZXJyb3JzIGluIGZpbGUgdXBsb2FkXG4gICAgICAgICAgICBQQ29yZS5nZXRNZXNzYWdlTWFuYWdlcigpLmFkZE1lc3NhZ2VzKHtcbiAgICAgICAgICAgICAgbWVzc2FnZXM6IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgLy8gQHRzLWlnbm9yZSAtIFR5cGUgJ3sgdHlwZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmc7IH0nIGlzIG5vdCBhc3NpZ25hYmxlIHRvIHR5cGUgJ01lc3NhZ2VzQ29uZmlnT2JqZWN0Jy5cbiAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdFcnJvciB3aXRoIG9uZSBvciBtb3JlIGZpbGVzJywgJycsICcnKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgcHJvcGVydHk6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgcGFnZVJlZmVyZW5jZTogdGhpcy5wQ29ubiQuZ2V0UGFnZVJlZmVyZW5jZSgpLFxuICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlbGV0ZSBmLnByb3BzLnByb2dyZXNzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9O1xuICB9XG5cbiAgdXBsb2FkRmlsZXMoKSB7XG4gICAgY29uc3QgZmlsZXNUb0JlVXBsb2FkZWQgPSB0aGlzLmZpbGVzXG4gICAgICAuZmlsdGVyKGUgPT4ge1xuICAgICAgICBjb25zdCBpc0ZpbGVVcGxvYWRlZCA9IGUucHJvcHMgJiYgZS5wcm9wcy5wcm9ncmVzcyA9PT0gMTAwO1xuICAgICAgICBjb25zdCBmaWxlSGFzRXJyb3IgPSBlLnByb3BzICYmIGUucHJvcHMuZXJyb3I7XG4gICAgICAgIGNvbnN0IGlzRmlsZVVwbG9hZGVkaW5MYXN0U3RlcCA9IGUucmVzcG9uc2VQcm9wcyAmJiBlLnJlc3BvbnNlUHJvcHMucHpJbnNLZXk7XG4gICAgICAgIHJldHVybiAhaXNGaWxlVXBsb2FkZWQgJiYgIWZpbGVIYXNFcnJvciAmJiAhaXNGaWxlVXBsb2FkZWRpbkxhc3RTdGVwO1xuICAgICAgfSlcbiAgICAgIC5tYXAoZiA9PlxuICAgICAgICB3aW5kb3cuUENvcmUuZ2V0QXR0YWNobWVudFV0aWxzKCkudXBsb2FkQXR0YWNobWVudChcbiAgICAgICAgICBmLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25VcGxvYWRQcm9ncmVzcygpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgaXNGZXRjaENhbmNlbGVkID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVycm9ySGFuZGxlcihpc0ZldGNoQ2FuY2VsZWQsIGYpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKVxuICAgICAgICApXG4gICAgICApO1xuICAgIFByb21pc2UuYWxsU2V0dGxlZChmaWxlc1RvQmVVcGxvYWRlZClcbiAgICAgIC50aGVuKChmaWxlUmVzcG9uc2VzOiBhbnkpID0+IHtcbiAgICAgICAgZmlsZVJlc3BvbnNlcyA9IGZpbGVSZXNwb25zZXMuZmlsdGVyKGZyID0+IGZyLnN0YXR1cyAhPT0gJ3JlamVjdGVkJyk7IC8vIGluIGNhc2Ugb2YgZGVsZXRpbmcgYW4gaW4gcHJvZ3Jlc3MgZmlsZSwgcHJvbWlzZSBnZXRzIGNhbmNlbGxlZCBidXQgc3RpbGwgZW50ZXJzIHRoZW4gYmxvY2tcbiAgICAgICAgaWYgKGZpbGVSZXNwb25zZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuZmlsZXMuZm9yRWFjaChmID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZmlsZVJlc3BvbnNlcy5maW5kSW5kZXgoKGZyOiBhbnkpID0+IGZyLnZhbHVlLmNsaWVudEZpbGVJRCA9PT0gZi5JRCk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICBmLnByb3BzLm1ldGEgPSB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnVXBsb2FkZWQgc3VjY2Vzc2Z1bGx5JywgJycsICcnKTtcbiAgICAgICAgICAgICAgZi5wcm9wcy5wcm9ncmVzcyA9IDEwMDtcbiAgICAgICAgICAgICAgZi5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgIGYuaGFuZGxlID0gZmlsZVJlc3BvbnNlc1tpbmRleF0udmFsdWUuSUQ7XG4gICAgICAgICAgICAgIGYubGFiZWwgPSB0aGlzLnZhbHVlUmVmO1xuICAgICAgICAgICAgICBmLmNhdGVnb3J5ID0gdGhpcy5jYXRlZ29yeU5hbWU7XG4gICAgICAgICAgICAgIGYucmVzcG9uc2VQcm9wcyA9IHtcbiAgICAgICAgICAgICAgICBwekluc0tleTogJ3RlbXAnLFxuICAgICAgICAgICAgICAgIHB5QXR0YWNoTmFtZTogZi5wcm9wcy5uYW1lXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgdGhpcy51cGRhdGVBdHRhY2htZW50cygpO1xuICAgICAgICAgIGlmICh0aGlzLmZpbGVzV2l0aEVycm9yPy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuY2xlYXJGaWVsZEVycm9yTWVzc2FnZXMoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEudW5zdWJzY3JpYmVGbikge1xuICAgICAgdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnVuc3Vic2NyaWJlRm4oKTtcbiAgICB9XG5cbiAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnVuc3Vic2NyaWJlKFBDb3JlLmdldENvbnN0YW50cygpLlBVQl9TVUJfRVZFTlRTLkNBU0VfRVZFTlRTLkFTU0lHTk1FTlRfU1VCTUlTU0lPTiwgdGhpcy5jYXNlSUQpO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmlsZS11cGxvYWQtY29udGFpbmVyXCIgKm5nSWY9XCJiVmlzaWJsZSRcIj5cbiAgPHNwYW4gY2xhc3M9XCJhdHRhY2htZW50LWxhYmVsXCIgW25nQ2xhc3NdPVwieyAnZmlsZS1sYWJlbCc6IGJSZXF1aXJlZCQgfVwiPnt7IGxhYmVsJCB9fTwvc3Bhbj5cbiAgPGRpdiAqbmdJZj1cIihmaWxlcy5sZW5ndGggPT09IDAgJiYgIWFsbG93TXVsdGlwbGUkKSB8fCBhbGxvd011bHRpcGxlJFwiPlxuICAgIDxkaXZcbiAgICAgIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTBweFwiXG4gICAgICBpZD1cImF0dGFjaG1lbnQtY29udGFpbmVyXCJcbiAgICAgIFtuZ0NsYXNzXT1cInZhbGlkYXRlTWVzc2FnZSA/ICdwc2RrLW1vZGFsLWZpbGUtc2VsZWN0b3ItZXJyb3InIDogJ3BzZGstbW9kYWwtZmlsZS1zZWxlY3RvcidcIlxuICAgID5cbiAgICAgIDxkaXYgW2hpZGRlbl09XCJ0cnVlXCIgaWQ9XCJhdHRhY2htZW50LUlEXCI+XG4gICAgICAgIHt7IHZhbHVlUmVmIH19XG4gICAgICA8L2Rpdj5cbiAgICAgIDxpbnB1dCBoaWRkZW4gdHlwZT1cImZpbGVcIiBbcmVxdWlyZWRdPVwiYlJlcXVpcmVkJFwiICN1cGxvYWRlciBbaWRdPVwidmFsdWVSZWZcIiBbbXVsdGlwbGVdPVwiYWxsb3dNdWx0aXBsZSRcIiAoY2hhbmdlKT1cIm9uRmlsZUFkZGVkKCRldmVudClcIiAvPlxuICAgICAgPGJ1dHRvbiBtYXQtc3Ryb2tlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgW2Rpc2FibGVkXT1cImJEaXNhYmxlZCRcIiAoY2xpY2spPVwidXBsb2FkZXIuY2xpY2soKVwiPlxuICAgICAgICB7e1xuICAgICAgICAgIGFsbG93TXVsdGlwbGUkXG4gICAgICAgICAgICA/IHVwbG9hZE11bHRpcGxlRmlsZXNMYWJlbCA9PT0gJ2ZpbGVfdXBsb2FkX3RleHRfbXVsdGlwbGUnXG4gICAgICAgICAgICAgID8gJ0Nob29zZSBmaWxlcydcbiAgICAgICAgICAgICAgOiB1cGxvYWRNdWx0aXBsZUZpbGVzTGFiZWxcbiAgICAgICAgICAgIDogdXBsb2FkU2luZ2xlRmlsZUxhYmVsID09PSAnZmlsZV91cGxvYWRfdGV4dF9vbmUnXG4gICAgICAgICAgICAgID8gJ0Nob29zZSBhIGZpbGUnXG4gICAgICAgICAgICAgIDogdXBsb2FkU2luZ2xlRmlsZUxhYmVsXG4gICAgICAgIH19XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxzcGFuICpuZ0lmPVwidmFsaWRhdGVNZXNzYWdlXCIgY2xhc3M9XCJmaWxlLWVycm9yXCI+e3sgdmFsaWRhdGVNZXNzYWdlIH19PC9zcGFuPlxuICA8ZGl2ICpuZ0lmPVwiZmlsZXMgJiYgZmlsZXMubGVuZ3RoID4gMFwiPlxuICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpbGUgb2YgZmlsZXNcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLWF0dGFjaG1lbnQtY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInBzZGstdXRpbGl0eS1jYXJkLWljb25cIj5cbiAgICAgICAgICA8aW1nICpuZ0lmPVwiIWZpbGUuaW5Qcm9ncmVzc1wiIGNsYXNzPVwicHNkay1hdHRhY2htZW50LWNhcmQtc3ZnLWljb25cIiBzcmM9XCJ7eyBzcmNJbWcgfX1cIiAvPlxuICAgICAgICAgIDxtYXQtc3Bpbm5lciAqbmdJZj1cImZpbGUuaW5Qcm9ncmVzc1wiIGNsYXNzPVwicHJvZ3Jlc3Mtc3Bpbm5lclwiIGRpYW1ldGVyPVwiNDBcIj48L21hdC1zcGlubmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstYXR0YWNobWVudC1jYXJkLW1haW5cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1hdHRhY2htZW50LWNhcmQtbWFpbi1wcmltYXJ5LWxhYmVsXCI+e3sgZmlsZS5wcm9wcy5uYW1lIH19PC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImZpbGUucHJvcHMubWV0YVwiIFtuZ1N0eWxlXT1cInsgY29sb3I6IGZpbGUucHJvcHMuZXJyb3IgPyAncmVkJyA6IG51bGwgfVwiPnt7IGZpbGUucHJvcHMubWV0YSB9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBzZGstYXR0YWNobWVudC1hY3Rpb25cIj5cbiAgICAgICAgICA8YnV0dG9uIGlkPVwiZGVsZXRlLWF0dGFjaG1lbnRcIiAqbmdJZj1cImZpbGUuSURcIiBjbGFzcz1cInBzZGstdXRpbGl0eS1idXR0b25cIiAoY2xpY2spPVwiZGVsZXRlRmlsZShmaWxlKVwiPlxuICAgICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstdXRpbGl0eS1jYXJkLWFjdGlvbi1zdmctaWNvblwiIHNyYz1cInt7IGRlbGV0ZUljb24gfX1cIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhZmlsZS5JRFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNldHRpbmctYnV0dG9uXCIgbWF0LWljb24tYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJhY3Rpb25NZW51XCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbj5tb3JlX3ZlcnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8bWF0LW1lbnUgI2FjdGlvbk1lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZG93bmxvYWRGaWxlKGZpbGUucmVzcG9uc2VQcm9wcyA/IGZpbGUucmVzcG9uc2VQcm9wcyA6IHt9KVwiPkRvd25sb2FkPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZGVsZXRlRmlsZShmaWxlKVwiPkRlbGV0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
|