@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,638 +0,0 @@
|
|
|
1
|
-
import { Component, Input, forwardRef } from '@angular/core';
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
4
|
-
import { MatInputModule } from '@angular/material/input';
|
|
5
|
-
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
6
|
-
import download from 'downloadjs';
|
|
7
|
-
import { ComponentMapperComponent } from '../../../_bridge/component-mapper/component-mapper.component';
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "../../../_bridge/angular-pconnect";
|
|
10
|
-
import * as i2 from "../../../_helpers/utils";
|
|
11
|
-
import * as i3 from "@angular/common";
|
|
12
|
-
import * as i4 from "@angular/material/button";
|
|
13
|
-
import * as i5 from "@angular/material/form-field";
|
|
14
|
-
import * as i6 from "@angular/material/input";
|
|
15
|
-
export class FileUtilityComponent {
|
|
16
|
-
constructor(angularPConnect, utils, ngZone) {
|
|
17
|
-
this.angularPConnect = angularPConnect;
|
|
18
|
-
this.utils = utils;
|
|
19
|
-
this.ngZone = ngZone;
|
|
20
|
-
// For interaction with AngularPConnect
|
|
21
|
-
this.angularPConnectData = {};
|
|
22
|
-
this.arFullListAttachments = [];
|
|
23
|
-
this.lu_name$ = '';
|
|
24
|
-
this.lu_icon$ = '';
|
|
25
|
-
this.lu_bLoading$ = false;
|
|
26
|
-
this.lu_count$ = 0;
|
|
27
|
-
this.lu_arActions$ = [];
|
|
28
|
-
this.lu_arItems$ = [];
|
|
29
|
-
this.va_arItems$ = [];
|
|
30
|
-
this.bShowFileModal$ = false;
|
|
31
|
-
this.bShowLinkModal$ = false;
|
|
32
|
-
this.bShowViewAllModal$ = false;
|
|
33
|
-
this.arFileMainButtons$ = [];
|
|
34
|
-
this.arFileSecondaryButtons$ = [];
|
|
35
|
-
this.arLinkMainButtons$ = [];
|
|
36
|
-
this.arLinkSecondaryButtons$ = [];
|
|
37
|
-
this.arFiles$ = [];
|
|
38
|
-
this.arFileList$ = [];
|
|
39
|
-
this.arLinks$ = [];
|
|
40
|
-
this.arLinksList$ = [];
|
|
41
|
-
this.link_title$ = '';
|
|
42
|
-
this.link_url$ = '';
|
|
43
|
-
this.closeSvgIcon$ = '';
|
|
44
|
-
this.currentCaseID = '';
|
|
45
|
-
this.getNewListUtilityItemProps = ({ att, cancelFile, downloadFile, deleteFile, removeFile }) => {
|
|
46
|
-
let actions;
|
|
47
|
-
let isDownloadable = false;
|
|
48
|
-
if (att.progress && att.progress !== 100) {
|
|
49
|
-
actions = [
|
|
50
|
-
{
|
|
51
|
-
id: `Cancel-${att.ID}`,
|
|
52
|
-
text: 'Cancel',
|
|
53
|
-
icon: 'times',
|
|
54
|
-
onClick: cancelFile
|
|
55
|
-
}
|
|
56
|
-
];
|
|
57
|
-
}
|
|
58
|
-
else if (att.links) {
|
|
59
|
-
const isFile = att.type === 'FILE';
|
|
60
|
-
const ID = att.ID.replace(/\s/gi, '');
|
|
61
|
-
const actionsMap = new Map([
|
|
62
|
-
[
|
|
63
|
-
'download',
|
|
64
|
-
{
|
|
65
|
-
id: `download-${ID}`,
|
|
66
|
-
text: isFile ? 'Download' : 'Open',
|
|
67
|
-
icon: isFile ? 'download' : 'open',
|
|
68
|
-
onClick: downloadFile
|
|
69
|
-
}
|
|
70
|
-
],
|
|
71
|
-
[
|
|
72
|
-
'delete',
|
|
73
|
-
{
|
|
74
|
-
id: `Delete-${ID}`,
|
|
75
|
-
text: 'Delete',
|
|
76
|
-
icon: 'trash',
|
|
77
|
-
onClick: deleteFile
|
|
78
|
-
}
|
|
79
|
-
]
|
|
80
|
-
]);
|
|
81
|
-
actions = [];
|
|
82
|
-
actionsMap.forEach((action, actionKey) => {
|
|
83
|
-
if (att.links[actionKey]) {
|
|
84
|
-
actions.push(action);
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
88
|
-
isDownloadable = att.links.download;
|
|
89
|
-
}
|
|
90
|
-
else if (att.error) {
|
|
91
|
-
actions = [
|
|
92
|
-
{
|
|
93
|
-
id: `Remove-${att.ID}`,
|
|
94
|
-
text: 'Remove',
|
|
95
|
-
icon: 'trash',
|
|
96
|
-
onClick: removeFile
|
|
97
|
-
}
|
|
98
|
-
];
|
|
99
|
-
}
|
|
100
|
-
return {
|
|
101
|
-
id: att.ID,
|
|
102
|
-
visual: {
|
|
103
|
-
icon: this.utils.getIconForAttachment(att),
|
|
104
|
-
progress: att.progress == 100 ? undefined : att.progress
|
|
105
|
-
},
|
|
106
|
-
primary: {
|
|
107
|
-
type: att.type,
|
|
108
|
-
name: att.name,
|
|
109
|
-
icon: 'trash',
|
|
110
|
-
click: removeFile
|
|
111
|
-
},
|
|
112
|
-
secondary: {
|
|
113
|
-
text: att.meta
|
|
114
|
-
},
|
|
115
|
-
actions
|
|
116
|
-
};
|
|
117
|
-
};
|
|
118
|
-
this.getListUtilityItemProps = ({ att, cancelFile, downloadFile, deleteFile, removeFile }) => {
|
|
119
|
-
let actions;
|
|
120
|
-
let isDownloadable = false;
|
|
121
|
-
if (att.progress && att.progress !== 100) {
|
|
122
|
-
actions = [
|
|
123
|
-
{
|
|
124
|
-
id: `Cancel-${att.ID}`,
|
|
125
|
-
text: this.pConn$.getLocalizedValue('Cancel', '', ''),
|
|
126
|
-
icon: 'times',
|
|
127
|
-
onClick: cancelFile
|
|
128
|
-
}
|
|
129
|
-
];
|
|
130
|
-
}
|
|
131
|
-
else if (att.links) {
|
|
132
|
-
const isFile = att.type === 'FILE';
|
|
133
|
-
const ID = att.ID.replace(/\s/gi, '');
|
|
134
|
-
const actionsMap = new Map([
|
|
135
|
-
[
|
|
136
|
-
'download',
|
|
137
|
-
{
|
|
138
|
-
id: `download-${ID}`,
|
|
139
|
-
text: isFile ? this.pConn$.getLocalizedValue('Download', '', '') : this.pConn$.getLocalizedValue('Open', '', ''),
|
|
140
|
-
icon: isFile ? 'download' : 'open',
|
|
141
|
-
onClick: downloadFile
|
|
142
|
-
}
|
|
143
|
-
],
|
|
144
|
-
[
|
|
145
|
-
'delete',
|
|
146
|
-
{
|
|
147
|
-
id: `Delete-${ID}`,
|
|
148
|
-
text: this.pConn$.getLocalizedValue('Delete', '', ''),
|
|
149
|
-
icon: 'trash',
|
|
150
|
-
onClick: deleteFile
|
|
151
|
-
}
|
|
152
|
-
]
|
|
153
|
-
]);
|
|
154
|
-
actions = [];
|
|
155
|
-
actionsMap.forEach((action, actionKey) => {
|
|
156
|
-
if (att.links[actionKey]) {
|
|
157
|
-
actions.push(action);
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
161
|
-
isDownloadable = att.links.download;
|
|
162
|
-
}
|
|
163
|
-
else if (att.error) {
|
|
164
|
-
actions = [
|
|
165
|
-
{
|
|
166
|
-
id: `Remove-${att.ID}`,
|
|
167
|
-
text: this.pConn$.getLocalizedValue('Remove', '', ''),
|
|
168
|
-
icon: 'trash',
|
|
169
|
-
onClick: removeFile
|
|
170
|
-
}
|
|
171
|
-
];
|
|
172
|
-
}
|
|
173
|
-
return {
|
|
174
|
-
id: att.ID,
|
|
175
|
-
visual: {
|
|
176
|
-
icon: this.utils.getIconForAttachment(att),
|
|
177
|
-
progress: att.progress == 100 ? undefined : att.progress
|
|
178
|
-
},
|
|
179
|
-
primary: {
|
|
180
|
-
type: att.type,
|
|
181
|
-
name: att.name,
|
|
182
|
-
icon: 'open',
|
|
183
|
-
click: downloadFile
|
|
184
|
-
},
|
|
185
|
-
secondary: {
|
|
186
|
-
text: att.meta
|
|
187
|
-
},
|
|
188
|
-
actions
|
|
189
|
-
};
|
|
190
|
-
};
|
|
191
|
-
this.fileDownload = (data, fileName, ext) => {
|
|
192
|
-
const file = ext ? `${fileName}.${ext}` : fileName;
|
|
193
|
-
download(atob(data), file);
|
|
194
|
-
};
|
|
195
|
-
}
|
|
196
|
-
ngOnInit() {
|
|
197
|
-
// // First thing in initialization is registering and subscribing to the AngularPConnect service
|
|
198
|
-
this.angularPConnectData = this.angularPConnect.registerAndSubscribeComponent(this, this.onStateChange);
|
|
199
|
-
const configProps = this.pConn$.resolveConfigProps(this.pConn$.getConfigProps());
|
|
200
|
-
this.lu_name$ = configProps.label ?? '';
|
|
201
|
-
this.lu_icon$ = 'paper-clip';
|
|
202
|
-
this.closeSvgIcon$ = this.utils.getImageSrc('times', this.utils.getSDKStaticContentUrl());
|
|
203
|
-
this.addAttachmentsActions = [
|
|
204
|
-
{
|
|
205
|
-
text: this.pConn$.getLocalizedValue('Add files', '', ''),
|
|
206
|
-
id: 'addNewFiles',
|
|
207
|
-
onClick: () => this.createModal('addLocalFile')
|
|
208
|
-
},
|
|
209
|
-
{
|
|
210
|
-
text: this.pConn$.getLocalizedValue('Add links', '', ''),
|
|
211
|
-
id: 'addNewLinks',
|
|
212
|
-
onClick: () => this.createModal('addLocalLink')
|
|
213
|
-
}
|
|
214
|
-
];
|
|
215
|
-
// const onViewAllCallback = () => this.onViewAll(this.arFullListAttachments);
|
|
216
|
-
this.lu_onViewAllFunction = { onClick: this.onViewAll.bind(this) };
|
|
217
|
-
this.removeFileFromList$ = { onClick: this.removeFileFromList.bind(this) };
|
|
218
|
-
this.removeLinksFromList$ = { onClick: this.removeLinksFromList.bind(this) };
|
|
219
|
-
this.updateSelf();
|
|
220
|
-
this.createModalButtons();
|
|
221
|
-
PCore.getPubSubUtils().subscribe(PCore.getEvents().getCaseEvent().CASE_ATTACHMENTS_UPDATED_FROM_CASEVIEW, this.updateSelf.bind(this), 'caseAttachmentsUpdateFromCaseview');
|
|
222
|
-
}
|
|
223
|
-
ngOnDestroy() {
|
|
224
|
-
if (this.angularPConnectData.unsubscribeFn) {
|
|
225
|
-
this.angularPConnectData.unsubscribeFn();
|
|
226
|
-
}
|
|
227
|
-
PCore.getPubSubUtils().unsubscribe(PCore.getEvents().getCaseEvent().CASE_ATTACHMENTS_UPDATED_FROM_CASEVIEW, 'caseAttachmentsUpdateFromCaseview');
|
|
228
|
-
}
|
|
229
|
-
// Callback passed when subscribing to store change
|
|
230
|
-
onStateChange() {
|
|
231
|
-
// adding a property to track in configProps, when ever the attachment file changes
|
|
232
|
-
// need to trigger a redraw
|
|
233
|
-
this.pConn$.registerAdditionalProps({
|
|
234
|
-
lastRefreshTime: `@P ${PCore.getConstants().SUMMARY_OF_ATTACHMENTS_LAST_REFRESH_TIME}`
|
|
235
|
-
});
|
|
236
|
-
// Should always check the bridge to see if the component should update itself (re-render)
|
|
237
|
-
const bUpdateSelf = this.angularPConnect.shouldComponentUpdate(this);
|
|
238
|
-
// ONLY call updateSelf when the component should update
|
|
239
|
-
if (bUpdateSelf || this.caseHasChanged()) {
|
|
240
|
-
this.updateSelf();
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
onAttachFiles(files) {
|
|
244
|
-
const attachmentUtils = PCore.getAttachmentUtils();
|
|
245
|
-
const caseID = this.pConn$.getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID);
|
|
246
|
-
if (files.length > 0) {
|
|
247
|
-
this.lu_bLoading$ = true;
|
|
248
|
-
}
|
|
249
|
-
const arFiles = Array.from(files);
|
|
250
|
-
Promise.allSettled(arFiles.map(file => attachmentUtils.uploadAttachment(file, this.onUploadProgress, this.errorHandler, this.pConn$.getContextName())))
|
|
251
|
-
.then((fileResponses) => {
|
|
252
|
-
const uploadedFiles = [];
|
|
253
|
-
fileResponses.forEach(fileResponse => {
|
|
254
|
-
if (fileResponse.status === 'fulfilled') {
|
|
255
|
-
uploadedFiles.push(fileResponse.value);
|
|
256
|
-
}
|
|
257
|
-
});
|
|
258
|
-
if (uploadedFiles.length > 0) {
|
|
259
|
-
attachmentUtils.linkAttachmentsToCase(caseID, uploadedFiles, 'File', this.pConn$.getContextName())
|
|
260
|
-
.then(() => {
|
|
261
|
-
this.refreshAttachments();
|
|
262
|
-
})
|
|
263
|
-
.catch();
|
|
264
|
-
}
|
|
265
|
-
})
|
|
266
|
-
.catch();
|
|
267
|
-
this.arFileList$ = [];
|
|
268
|
-
this.lu_bLoading$ = false;
|
|
269
|
-
}
|
|
270
|
-
refreshAttachments() {
|
|
271
|
-
this.updateSelf();
|
|
272
|
-
}
|
|
273
|
-
onUploadProgress() { }
|
|
274
|
-
errorHandler() { }
|
|
275
|
-
onAttachLinks(links) {
|
|
276
|
-
const attachmentUtils = PCore.getAttachmentUtils();
|
|
277
|
-
const caseID = this.pConn$.getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID);
|
|
278
|
-
if (links.length > 0) {
|
|
279
|
-
this.lu_bLoading$ = true;
|
|
280
|
-
}
|
|
281
|
-
const linksToAttach = links.map(link => ({
|
|
282
|
-
type: 'URL',
|
|
283
|
-
category: 'URL',
|
|
284
|
-
url: link.url,
|
|
285
|
-
name: link.linkTitle
|
|
286
|
-
}));
|
|
287
|
-
attachmentUtils.linkAttachmentsToCase(caseID, linksToAttach, 'URL', this.pConn$.getContextName())
|
|
288
|
-
.then(() => {
|
|
289
|
-
this.refreshAttachments();
|
|
290
|
-
})
|
|
291
|
-
.catch(console.log);
|
|
292
|
-
}
|
|
293
|
-
addAttachments(attsFromResp = []) {
|
|
294
|
-
this.lu_bLoading$ = false;
|
|
295
|
-
attsFromResp = attsFromResp.map(respAtt => {
|
|
296
|
-
const updatedAtt = {
|
|
297
|
-
...respAtt,
|
|
298
|
-
meta: `${respAtt.category} . ${this.utils.generateDateTime(respAtt.createTime, 'DateTime-Since')}, ${respAtt.createdBy}`
|
|
299
|
-
};
|
|
300
|
-
if (updatedAtt.type === 'FILE') {
|
|
301
|
-
updatedAtt.nameWithExt = updatedAtt.fileName;
|
|
302
|
-
}
|
|
303
|
-
return updatedAtt;
|
|
304
|
-
});
|
|
305
|
-
return attsFromResp;
|
|
306
|
-
}
|
|
307
|
-
onViewAll() {
|
|
308
|
-
this.bShowViewAllModal$ = true;
|
|
309
|
-
// add clickAway listener
|
|
310
|
-
// window.addEventListener('mouseup', this._clickAway.bind(this));
|
|
311
|
-
}
|
|
312
|
-
// Below method is not needed, still having it commented in case we want in future
|
|
313
|
-
// _clickAway(event: any) {
|
|
314
|
-
// let bInPopUp = false;
|
|
315
|
-
// // run through list of elements in path, if menu not in th path, then want to
|
|
316
|
-
// // hide (toggle) the menu
|
|
317
|
-
// for (const i in event.path) {
|
|
318
|
-
// if (event.path[i].className == 'psdk-modal-file-top' || event.path[i].tagName == 'BUTTON') {
|
|
319
|
-
// bInPopUp = true;
|
|
320
|
-
// break;
|
|
321
|
-
// }
|
|
322
|
-
// }
|
|
323
|
-
// if (!bInPopUp) {
|
|
324
|
-
// this.bShowViewAllModal$ = false;
|
|
325
|
-
// window.removeEventListener('mouseup', this._clickAway.bind(this));
|
|
326
|
-
// }
|
|
327
|
-
// }
|
|
328
|
-
_closeViewAll() {
|
|
329
|
-
this.bShowViewAllModal$ = false;
|
|
330
|
-
// window.removeEventListener('mouseup', this._clickAway.bind(this));
|
|
331
|
-
}
|
|
332
|
-
removeFileFromList(item) {
|
|
333
|
-
if (item != null) {
|
|
334
|
-
const arFileList = this.arFileList$;
|
|
335
|
-
const itemId = item.id;
|
|
336
|
-
for (let fileIndex = 0; fileIndex < arFileList.length; fileIndex++) {
|
|
337
|
-
if (arFileList[fileIndex].id == itemId) {
|
|
338
|
-
// remove the file from the list and redraw
|
|
339
|
-
this.ngZone.run(() => {
|
|
340
|
-
arFileList.splice(fileIndex, 1);
|
|
341
|
-
});
|
|
342
|
-
break;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
}
|
|
347
|
-
removeLinksFromList(item) {
|
|
348
|
-
const localLinksList = this.arLinksList$.slice();
|
|
349
|
-
if (item != null) {
|
|
350
|
-
const itemId = item.id;
|
|
351
|
-
for (let linkIndex = 0; linkIndex < localLinksList.length; linkIndex++) {
|
|
352
|
-
if (localLinksList[linkIndex].id == itemId) {
|
|
353
|
-
// remove the file from the list and redraw
|
|
354
|
-
localLinksList.splice(linkIndex, 1);
|
|
355
|
-
this.ngZone.run(() => {
|
|
356
|
-
this.arLinksList$ = localLinksList.slice();
|
|
357
|
-
});
|
|
358
|
-
break;
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
_addLink() {
|
|
364
|
-
// copy list locally
|
|
365
|
-
const localList = this.arLinksList$.slice();
|
|
366
|
-
const url = this.link_url$;
|
|
367
|
-
if (!/^(http|https):\/\//.test(this.link_url$)) {
|
|
368
|
-
this.link_url$ = `http://${this.link_url$}`;
|
|
369
|
-
}
|
|
370
|
-
// list for display
|
|
371
|
-
let oLink = {};
|
|
372
|
-
oLink.icon = 'chain';
|
|
373
|
-
oLink.ID = `${new Date().getTime()}`;
|
|
374
|
-
oLink = this.getNewListUtilityItemProps({
|
|
375
|
-
att: oLink,
|
|
376
|
-
downloadFile: null,
|
|
377
|
-
cancelFile: null,
|
|
378
|
-
deleteFile: null,
|
|
379
|
-
removeFile: null
|
|
380
|
-
});
|
|
381
|
-
oLink.type = 'URL';
|
|
382
|
-
oLink.primary.type = oLink.type;
|
|
383
|
-
oLink.visual.icon = 'chain';
|
|
384
|
-
oLink.primary.name = this.link_title$;
|
|
385
|
-
oLink.primary.icon = 'open';
|
|
386
|
-
oLink.secondary.text = url;
|
|
387
|
-
this.ngZone.run(() => {
|
|
388
|
-
// need to create a new array or summary list won't detect changes
|
|
389
|
-
this.arLinksList$ = localList.slice();
|
|
390
|
-
this.arLinksList$.push(oLink);
|
|
391
|
-
// list for actually attachments
|
|
392
|
-
const link = {};
|
|
393
|
-
link.id = oLink.id;
|
|
394
|
-
link.linkTitle = this.link_title$;
|
|
395
|
-
link.type = oLink.type;
|
|
396
|
-
link.url = url;
|
|
397
|
-
this.arLinks$.push(link);
|
|
398
|
-
// clear values
|
|
399
|
-
this.link_title$ = '';
|
|
400
|
-
this.link_url$ = '';
|
|
401
|
-
});
|
|
402
|
-
}
|
|
403
|
-
_changeTitle(event) {
|
|
404
|
-
this.link_title$ = event.srcElement.value;
|
|
405
|
-
}
|
|
406
|
-
_changeUrl(event) {
|
|
407
|
-
this.link_url$ = event.srcElement.value;
|
|
408
|
-
}
|
|
409
|
-
downloadFile(att) {
|
|
410
|
-
const attachUtils = PCore.getAttachmentUtils();
|
|
411
|
-
const { ID, name, extension, type } = att;
|
|
412
|
-
const context = this.pConn$.getContextName();
|
|
413
|
-
attachUtils
|
|
414
|
-
// @ts-ignore - 3rd parameter "responseEncoding" is optional
|
|
415
|
-
.downloadAttachment(ID, context)
|
|
416
|
-
.then((content) => {
|
|
417
|
-
if (type === 'FILE') {
|
|
418
|
-
this.fileDownload(content.data, name, extension);
|
|
419
|
-
}
|
|
420
|
-
else if (type === 'URL') {
|
|
421
|
-
let { data } = content;
|
|
422
|
-
if (!/^(http|https):\/\//.test(data)) {
|
|
423
|
-
data = `//${data}`;
|
|
424
|
-
}
|
|
425
|
-
window.open(content.data, '_blank');
|
|
426
|
-
}
|
|
427
|
-
})
|
|
428
|
-
.catch(console.error);
|
|
429
|
-
}
|
|
430
|
-
cancelFile() {
|
|
431
|
-
alert('cancel');
|
|
432
|
-
}
|
|
433
|
-
deleteFile(att) {
|
|
434
|
-
setTimeout(() => {
|
|
435
|
-
const attachUtils = PCore.getAttachmentUtils();
|
|
436
|
-
const { ID } = att;
|
|
437
|
-
const context = this.pConn$.getContextName();
|
|
438
|
-
attachUtils
|
|
439
|
-
.deleteAttachment(ID, context)
|
|
440
|
-
.then(() => {
|
|
441
|
-
this.updateSelf();
|
|
442
|
-
// let newAttachments;
|
|
443
|
-
// setAttachments((current) => {
|
|
444
|
-
// newAttachments = current.filter((file) => file.ID !== ID);
|
|
445
|
-
// return newAttachments;
|
|
446
|
-
// });
|
|
447
|
-
// if (callbackFn) {
|
|
448
|
-
// callbackFn(newAttachments);
|
|
449
|
-
// }
|
|
450
|
-
})
|
|
451
|
-
.catch(console.error);
|
|
452
|
-
});
|
|
453
|
-
}
|
|
454
|
-
removeFile() {
|
|
455
|
-
alert('remove');
|
|
456
|
-
}
|
|
457
|
-
removeNewFile() {
|
|
458
|
-
alert('remove');
|
|
459
|
-
}
|
|
460
|
-
createModal(modalType) {
|
|
461
|
-
switch (modalType) {
|
|
462
|
-
case 'addLocalFile':
|
|
463
|
-
this.ngZone.run(() => {
|
|
464
|
-
this.bShowFileModal$ = true;
|
|
465
|
-
});
|
|
466
|
-
break;
|
|
467
|
-
case 'addLocalLink':
|
|
468
|
-
this.ngZone.run(() => {
|
|
469
|
-
this.bShowLinkModal$ = true;
|
|
470
|
-
});
|
|
471
|
-
break;
|
|
472
|
-
default:
|
|
473
|
-
break;
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
createModalButtons() {
|
|
477
|
-
this.arFileMainButtons$.push({ actionID: 'attach', jsAction: 'attachFiles', name: this.pConn$.getLocalizedValue('Attach files', '', '') });
|
|
478
|
-
this.arFileSecondaryButtons$.push({ actionID: 'cancel', jsAction: 'cancel', name: this.pConn$.getLocalizedValue('Cancel', '', '') });
|
|
479
|
-
this.arLinkMainButtons$.push({ actionID: 'attach', jsAction: 'attachLinks', name: this.pConn$.getLocalizedValue('Attach links', '', '') });
|
|
480
|
-
this.arLinkSecondaryButtons$.push({ actionID: 'cancel', jsAction: 'cancel', name: this.pConn$.getLocalizedValue('Cancel', '', '') });
|
|
481
|
-
}
|
|
482
|
-
uploadMyFiles($event) {
|
|
483
|
-
// alert($event.target.files[0]); // outputs the first file
|
|
484
|
-
this.arFiles$ = this.getFiles($event.target.files);
|
|
485
|
-
// convert FileList to an array
|
|
486
|
-
const myFiles = Array.from(this.arFiles$);
|
|
487
|
-
this.arFileList$ = myFiles.map(att => {
|
|
488
|
-
return this.getNewListUtilityItemProps({
|
|
489
|
-
att,
|
|
490
|
-
downloadFile: !att.progress ? () => this.downloadFile(att) : null,
|
|
491
|
-
cancelFile: att.progress ? () => this.cancelFile() : null,
|
|
492
|
-
deleteFile: !att.progress ? () => this.deleteFile(att) : null,
|
|
493
|
-
removeFile: att.error ? () => this.removeNewFile() : null
|
|
494
|
-
});
|
|
495
|
-
});
|
|
496
|
-
}
|
|
497
|
-
getFiles(arFiles) {
|
|
498
|
-
return this.setNewFiles(arFiles);
|
|
499
|
-
}
|
|
500
|
-
setNewFiles(arFiles) {
|
|
501
|
-
let index = 0;
|
|
502
|
-
for (const file of arFiles) {
|
|
503
|
-
if (!this.validateMaxSize(file, 5)) {
|
|
504
|
-
file.error = true;
|
|
505
|
-
file.meta = 'File is too big. Max allowed size is 5MB.';
|
|
506
|
-
}
|
|
507
|
-
file.mimeType = file.type;
|
|
508
|
-
file.icon = this.utils.getIconFromFileType(file.type);
|
|
509
|
-
file.ID = `${new Date().getTime()}I${index}`;
|
|
510
|
-
index++;
|
|
511
|
-
}
|
|
512
|
-
return arFiles;
|
|
513
|
-
}
|
|
514
|
-
validateMaxSize(fileObj, maxSizeInMB) {
|
|
515
|
-
const fileSize = (fileObj.size / 1048576).toFixed(2);
|
|
516
|
-
return fileSize < maxSizeInMB;
|
|
517
|
-
}
|
|
518
|
-
onFileActionButtonClick(event) {
|
|
519
|
-
// modal buttons
|
|
520
|
-
switch (event.action) {
|
|
521
|
-
case 'cancel':
|
|
522
|
-
this.bShowFileModal$ = false;
|
|
523
|
-
this.clearOutFiles();
|
|
524
|
-
break;
|
|
525
|
-
case 'attachFiles':
|
|
526
|
-
this.bShowFileModal$ = false;
|
|
527
|
-
this.onAttachFiles(this.arFiles$);
|
|
528
|
-
this.clearOutFiles();
|
|
529
|
-
break;
|
|
530
|
-
default:
|
|
531
|
-
break;
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
onLinkActionButtonClick(event) {
|
|
535
|
-
// modal buttons
|
|
536
|
-
switch (event.action) {
|
|
537
|
-
case 'cancel':
|
|
538
|
-
this.bShowLinkModal$ = false;
|
|
539
|
-
this.clearOutLinks();
|
|
540
|
-
break;
|
|
541
|
-
case 'attachLinks':
|
|
542
|
-
this.bShowLinkModal$ = false;
|
|
543
|
-
this.onAttachLinks(this.arLinks$);
|
|
544
|
-
this.clearOutLinks();
|
|
545
|
-
break;
|
|
546
|
-
default:
|
|
547
|
-
break;
|
|
548
|
-
}
|
|
549
|
-
}
|
|
550
|
-
clearOutFiles() {
|
|
551
|
-
this.arFileList$ = [];
|
|
552
|
-
this.arFiles$ = [];
|
|
553
|
-
}
|
|
554
|
-
clearOutLinks() {
|
|
555
|
-
this.arLinksList$ = [];
|
|
556
|
-
this.arLinks$ = [];
|
|
557
|
-
this.link_title$ = '';
|
|
558
|
-
this.link_url$ = '';
|
|
559
|
-
}
|
|
560
|
-
addALink() { }
|
|
561
|
-
_fieldOnChangeLink(event) {
|
|
562
|
-
this.link_title$ = event.target.value;
|
|
563
|
-
}
|
|
564
|
-
_fieldOnChangeURL(event) {
|
|
565
|
-
this.link_url$ = event.target.value;
|
|
566
|
-
}
|
|
567
|
-
updateSelf() {
|
|
568
|
-
const caseID = this.getCaseID();
|
|
569
|
-
if (caseID) {
|
|
570
|
-
this.lu_bLoading$ = true;
|
|
571
|
-
this.fetchCaseAttachments(caseID)
|
|
572
|
-
.then(resp => {
|
|
573
|
-
this.handleAttachmentsResponse(resp);
|
|
574
|
-
})
|
|
575
|
-
.catch(err => {
|
|
576
|
-
console.log(err);
|
|
577
|
-
})
|
|
578
|
-
.finally(() => {
|
|
579
|
-
this.lu_bLoading$ = false;
|
|
580
|
-
});
|
|
581
|
-
}
|
|
582
|
-
}
|
|
583
|
-
getCaseID() {
|
|
584
|
-
return this.pConn$.getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID) || '';
|
|
585
|
-
}
|
|
586
|
-
fetchCaseAttachments(caseID) {
|
|
587
|
-
const attachmentUtils = PCore.getAttachmentUtils();
|
|
588
|
-
return attachmentUtils.getCaseAttachments(caseID, this.pConn$.getContextName());
|
|
589
|
-
}
|
|
590
|
-
handleAttachmentsResponse(resp) {
|
|
591
|
-
this.arFullListAttachments = this.addAttachments(resp);
|
|
592
|
-
this.lu_count$ = this.arFullListAttachments.length;
|
|
593
|
-
this.lu_arActions$ = this.addAttachmentsActions;
|
|
594
|
-
this.lu_arItems$ = this.getUtilityItems(this.arFullListAttachments.slice(0, 3));
|
|
595
|
-
this.va_arItems$ = this.getUtilityItems(this.arFullListAttachments);
|
|
596
|
-
}
|
|
597
|
-
getUtilityItems(attachments) {
|
|
598
|
-
return attachments.map(this.mapAttachmentToUtilityItem.bind(this));
|
|
599
|
-
}
|
|
600
|
-
mapAttachmentToUtilityItem(att) {
|
|
601
|
-
return this.getListUtilityItemProps({
|
|
602
|
-
att,
|
|
603
|
-
downloadFile: this.getDownloadFunction(att),
|
|
604
|
-
cancelFile: this.getCancelFunction(att),
|
|
605
|
-
deleteFile: this.getDeleteFunction(att),
|
|
606
|
-
removeFile: this.getRemoveFunction(att)
|
|
607
|
-
});
|
|
608
|
-
}
|
|
609
|
-
getDownloadFunction(att) {
|
|
610
|
-
return !att.progress ? () => this.downloadFile(att) : null;
|
|
611
|
-
}
|
|
612
|
-
getCancelFunction(att) {
|
|
613
|
-
return att.progress ? () => this.cancelFile() : null;
|
|
614
|
-
}
|
|
615
|
-
getDeleteFunction(att) {
|
|
616
|
-
return !att.progress ? () => this.deleteFile(att) : null;
|
|
617
|
-
}
|
|
618
|
-
getRemoveFunction(att) {
|
|
619
|
-
return att.error ? () => this.removeFile() : null;
|
|
620
|
-
}
|
|
621
|
-
caseHasChanged() {
|
|
622
|
-
const caseID = this.pConn$.getValue(PCore.getConstants().CASE_INFO.CASE_INFO_ID);
|
|
623
|
-
if (this.currentCaseID !== caseID) {
|
|
624
|
-
this.currentCaseID = caseID;
|
|
625
|
-
return true;
|
|
626
|
-
}
|
|
627
|
-
return false;
|
|
628
|
-
}
|
|
629
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FileUtilityComponent, deps: [{ token: i1.AngularPConnectService }, { token: i2.Utils }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
630
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FileUtilityComponent, isStandalone: true, selector: "app-file-utility", inputs: { pConn$: "pConn$" }, ngImport: i0, template: "<div>\n <component-mapper\n name=\"ListUtility\"\n [props]=\"{\n name$: lu_name$,\n icon$: lu_icon$,\n bLoading$: lu_bLoading$,\n count$: lu_count$,\n arActions$: lu_arActions$,\n arItems$: lu_arItems$,\n onViewAll$: lu_onViewAllFunction,\n menuIconOverrideAction$: removeFileFromList$\n }\"\n ></component-mapper>\n</div>\n\n<div *ngIf=\"bShowFileModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h3>{{ pConn$.getLocalizedValue('Add local files', '', '') }}</h3>\n <div class=\"psdk-modal-body\">\n <div class=\"psdk-modal-file-selector\">\n <input hidden type=\"file\" multiple #uploader (change)=\"uploadMyFiles($event)\" />\n\n <button mat-stroked-button color=\"primary\" (click)=\"uploader.click()\">{{ pConn$.getLocalizedValue('Upload file(s)', '', '') }}</button>\n </div>\n\n <component-mapper\n name=\"SummaryList\"\n [props]=\"{ arItems$: arFileList$, menuIconOverride$: 'trash', menuIconOverrideAction$: removeFileFromList$ }\"\n ></component-mapper>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFileMainButtons$, arSecondaryButtons$: arFileSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: onFileActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n\n<div *ngIf=\"bShowLinkModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-link-top\">\n <h3>{{ pConn$.getLocalizedValue('Add links', '', '') }}</h3>\n <div class=\"psdk-modal-link-entry\">\n <div class=\"psdk-modal-body\">\n <div class=\"psdk-modal-links-row\">\n <div class=\"psdk-links-two-column\">\n <div class=\"psdk-modal-link-data\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-label>Link title</mat-label>\n <input matInput type=\"text\" required=\"true\" (change)=\"_fieldOnChangeLink($event)\" [value]=\"link_title$\" />\n </mat-form-field>\n </div>\n <div class=\"psdk-modal-link-data\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-label>URL</mat-label>\n <input matInput type=\"text\" required=\"true\" (change)=\"_fieldOnChangeURL($event)\" [value]=\"link_url$\" />\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"psdk-modal-link-add\">\n <button mat-raised-button color=\"primary\" (click)=\"_addLink()\">{{ pConn$.getLocalizedValue('Add link', '', '') }}</button>\n </div>\n </div>\n\n <component-mapper\n name=\"SummaryList\"\n [props]=\"{ arItems$: arLinksList$, menuIconOverride$: 'trash', menuIconOverrideAction$: removeLinksFromList$ }\"\n ></component-mapper>\n </div>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arLinkMainButtons$, arSecondaryButtons$: arLinkSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: onLinkActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n\n<div *ngIf=\"bShowViewAllModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <div class=\"psdk-view-all-header\">\n <div>\n <h3>{{ pConn$.getLocalizedValue('Attachments', '', '') }}</h3>\n </div>\n <div>\n <button mat-icon-button (click)=\"_closeViewAll()\">\n <img class=\"psdk-utility-card-actions-svg-icon\" src=\"{{ closeSvgIcon$ }}\" />\n </button>\n </div>\n </div>\n <div class=\"psdk-view-all-body\">\n <component-mapper name=\"SummaryList\" [props]=\"{ arItems$: va_arItems$, menuIconOverrideAction$: removeLinksFromList$ }\"></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top,.psdk-modal-link-top{display:table;margin:auto;min-width:650px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.3rem;text-align:center}.psdk-modal-link-entry{display:flex;flex-direction:row}.psdk-modal-link-data{flex-grow:3;margin:0 .3rem}.psdk-modal-link-add{flex-grow:1}.psdk-full-width{width:100%}.psdk-modal-body{max-height:500px;overflow-y:auto;overflow-x:hidden;width:100%}.psdk-view-all-header{display:flex;justify-content:space-between}.psdk-view-all-close-icon{width:1.5rem}.psdk-view-all-body{max-height:500px;overflow-y:auto;overflow-x:hidden}.psdk-links-two-column{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem;width:85%}.psdk-modal-links-row{display:flex;flex-direction:row;justify-content:space-between}.psdk-links-add-link{padding:15px}ul{columns:2;-webkit-columns:2;-moz-columns:2}\n"], dependencies: [{ kind: "ngmodule", type: i0.forwardRef(() => CommonModule) }, { kind: "directive", type: i0.forwardRef(() => i3.NgIf), selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatButtonModule) }, { kind: "component", type: i0.forwardRef(() => i4.MatButton), selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i0.forwardRef(() => i4.MatIconButton), selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: i0.forwardRef(() => MatFormFieldModule) }, { kind: "component", type: i0.forwardRef(() => i5.MatFormField), selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i0.forwardRef(() => i5.MatLabel), selector: "mat-label" }, { kind: "ngmodule", type: i0.forwardRef(() => MatInputModule) }, { kind: "directive", type: i0.forwardRef(() => i6.MatInput), selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i0.forwardRef(() => ComponentMapperComponent), selector: "component-mapper", inputs: ["name", "props", "errorMsg", "outputEvents", "parent"] }] }); }
|
|
631
|
-
}
|
|
632
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FileUtilityComponent, decorators: [{
|
|
633
|
-
type: Component,
|
|
634
|
-
args: [{ selector: 'app-file-utility', standalone: true, imports: [CommonModule, MatButtonModule, MatFormFieldModule, MatInputModule, forwardRef(() => ComponentMapperComponent)], template: "<div>\n <component-mapper\n name=\"ListUtility\"\n [props]=\"{\n name$: lu_name$,\n icon$: lu_icon$,\n bLoading$: lu_bLoading$,\n count$: lu_count$,\n arActions$: lu_arActions$,\n arItems$: lu_arItems$,\n onViewAll$: lu_onViewAllFunction,\n menuIconOverrideAction$: removeFileFromList$\n }\"\n ></component-mapper>\n</div>\n\n<div *ngIf=\"bShowFileModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <h3>{{ pConn$.getLocalizedValue('Add local files', '', '') }}</h3>\n <div class=\"psdk-modal-body\">\n <div class=\"psdk-modal-file-selector\">\n <input hidden type=\"file\" multiple #uploader (change)=\"uploadMyFiles($event)\" />\n\n <button mat-stroked-button color=\"primary\" (click)=\"uploader.click()\">{{ pConn$.getLocalizedValue('Upload file(s)', '', '') }}</button>\n </div>\n\n <component-mapper\n name=\"SummaryList\"\n [props]=\"{ arItems$: arFileList$, menuIconOverride$: 'trash', menuIconOverrideAction$: removeFileFromList$ }\"\n ></component-mapper>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arFileMainButtons$, arSecondaryButtons$: arFileSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: onFileActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n\n<div *ngIf=\"bShowLinkModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-link-top\">\n <h3>{{ pConn$.getLocalizedValue('Add links', '', '') }}</h3>\n <div class=\"psdk-modal-link-entry\">\n <div class=\"psdk-modal-body\">\n <div class=\"psdk-modal-links-row\">\n <div class=\"psdk-links-two-column\">\n <div class=\"psdk-modal-link-data\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-label>Link title</mat-label>\n <input matInput type=\"text\" required=\"true\" (change)=\"_fieldOnChangeLink($event)\" [value]=\"link_title$\" />\n </mat-form-field>\n </div>\n <div class=\"psdk-modal-link-data\">\n <mat-form-field class=\"psdk-full-width\">\n <mat-label>URL</mat-label>\n <input matInput type=\"text\" required=\"true\" (change)=\"_fieldOnChangeURL($event)\" [value]=\"link_url$\" />\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"psdk-modal-link-add\">\n <button mat-raised-button color=\"primary\" (click)=\"_addLink()\">{{ pConn$.getLocalizedValue('Add link', '', '') }}</button>\n </div>\n </div>\n\n <component-mapper\n name=\"SummaryList\"\n [props]=\"{ arItems$: arLinksList$, menuIconOverride$: 'trash', menuIconOverrideAction$: removeLinksFromList$ }\"\n ></component-mapper>\n </div>\n </div>\n\n <component-mapper\n name=\"ActionButtons\"\n [props]=\"{ arMainButtons$: arLinkMainButtons$, arSecondaryButtons$: arLinkSecondaryButtons$ }\"\n [parent]=\"this\"\n [outputEvents]=\"{ actionButtonClick: onLinkActionButtonClick }\"\n ></component-mapper>\n </div>\n</div>\n\n<div *ngIf=\"bShowViewAllModal$\" class=\"psdk-dialog-background\">\n <div class=\"psdk-modal-file-top\">\n <div class=\"psdk-view-all-header\">\n <div>\n <h3>{{ pConn$.getLocalizedValue('Attachments', '', '') }}</h3>\n </div>\n <div>\n <button mat-icon-button (click)=\"_closeViewAll()\">\n <img class=\"psdk-utility-card-actions-svg-icon\" src=\"{{ closeSvgIcon$ }}\" />\n </button>\n </div>\n </div>\n <div class=\"psdk-view-all-body\">\n <component-mapper name=\"SummaryList\" [props]=\"{ arItems$: va_arItems$, menuIconOverrideAction$: removeLinksFromList$ }\"></component-mapper>\n </div>\n </div>\n</div>\n", styles: [".psdk-dialog-background{display:flex;flex-direction:column;justify-content:center;align-items:center;height:100%;width:100%;background-color:var(--app-dialog-background-color);position:fixed;z-index:999;top:0;left:0}.psdk-modal-file-top,.psdk-modal-link-top{display:table;margin:auto;min-width:650px;background-color:var(--app-form-color);border:1px solid var(--app-inverse-form-color);border-radius:10px;padding:20px;box-shadow:0 0 10px 3px var(--app-box-shadow-color)}.psdk-modal-file-selector{border:1px dashed var(--app-neutral-dark-color);width:100%;padding:.3rem;text-align:center}.psdk-modal-link-entry{display:flex;flex-direction:row}.psdk-modal-link-data{flex-grow:3;margin:0 .3rem}.psdk-modal-link-add{flex-grow:1}.psdk-full-width{width:100%}.psdk-modal-body{max-height:500px;overflow-y:auto;overflow-x:hidden;width:100%}.psdk-view-all-header{display:flex;justify-content:space-between}.psdk-view-all-close-icon{width:1.5rem}.psdk-view-all-body{max-height:500px;overflow-y:auto;overflow-x:hidden}.psdk-links-two-column{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem;width:85%}.psdk-modal-links-row{display:flex;flex-direction:row;justify-content:space-between}.psdk-links-add-link{padding:15px}ul{columns:2;-webkit-columns:2;-moz-columns:2}\n"] }]
|
|
635
|
-
}], ctorParameters: () => [{ type: i1.AngularPConnectService }, { type: i2.Utils }, { type: i0.NgZone }], propDecorators: { pConn$: [{
|
|
636
|
-
type: Input
|
|
637
|
-
}] } });
|
|
638
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS11dGlsaXR5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2FuZ3VsYXItc2RrLWNvbXBvbmVudHMvc3JjL2xpYi9fY29tcG9uZW50cy93aWRnZXQvZmlsZS11dGlsaXR5L2ZpbGUtdXRpbGl0eS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hbmd1bGFyLXNkay1jb21wb25lbnRzL3NyYy9saWIvX2NvbXBvbmVudHMvd2lkZ2V0L2ZpbGUtdXRpbGl0eS9maWxlLXV0aWxpdHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxLQUFLLEVBQVUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sUUFBUSxNQUFNLFlBQVksQ0FBQztBQUdsQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw4REFBOEQsQ0FBQzs7Ozs7Ozs7QUFjeEcsTUFBTSxPQUFPLG9CQUFvQjtJQThDL0IsWUFDVSxlQUF1QyxFQUN2QyxLQUFZLEVBQ1osTUFBYztRQUZkLG9CQUFlLEdBQWYsZUFBZSxDQUF3QjtRQUN2QyxVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1osV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQTlDeEIsdUNBQXVDO1FBQ3ZDLHdCQUFtQixHQUF3QixFQUFFLENBQUM7UUFFOUMsMEJBQXFCLEdBQVUsRUFBRSxDQUFDO1FBRWxDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFD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QUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMzRCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsR0FBRztRQUNuQixPQUFPLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3BELENBQUM7SUFFRCxjQUFjO1FBQ1osTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNqRixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssTUFBTSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUM7WUFDNUIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDOytHQXh1QlUsb0JBQW9CO21HQUFwQixvQkFBb0IsMEdDdEJqQywyMEhBb0dBLDR6Q0RoRlksWUFBWSw0S0FBRSxlQUFlLHVZQUFFLGtCQUFrQix5V0FBRSxjQUFjLHFaQUFtQix3QkFBd0I7OzRGQUUzRyxvQkFBb0I7a0JBUGhDLFNBQVM7K0JBQ0Usa0JBQWtCLGNBR2hCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsY0FBYyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO29JQUcvRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE5nWm9uZSwgZm9yd2FyZFJlZiwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgZG93bmxvYWQgZnJvbSAnZG93bmxvYWRqcyc7XG5pbXBvcnQgeyBBbmd1bGFyUENvbm5lY3REYXRhLCBBbmd1bGFyUENvbm5lY3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vX2JyaWRnZS9hbmd1bGFyLXBjb25uZWN0JztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vX2hlbHBlcnMvdXRpbHMnO1xuaW1wb3J0IHsgQ29tcG9uZW50TWFwcGVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vX2JyaWRnZS9jb21wb25lbnQtbWFwcGVyL2NvbXBvbmVudC1tYXBwZXIuY29tcG9uZW50JztcblxuaW50ZXJmYWNlIEZpbGVVdGlsaXR5UHJvcHMge1xuICAvLyBJZiBhbnksIGVudGVyIGFkZGl0aW9uYWwgcHJvcHMgdGhhdCBvbmx5IGV4aXN0IG9uIHRoaXMgY29tcG9uZW50XG4gIGxhYmVsPzogc3RyaW5nO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZmlsZS11dGlsaXR5JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbGUtdXRpbGl0eS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbGUtdXRpbGl0eS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgTWF0SW5wdXRNb2R1bGUsIGZvcndhcmRSZWYoKCkgPT4gQ29tcG9uZW50TWFwcGVyQ29tcG9uZW50KV1cbn0pXG5leHBvcnQgY2xhc3MgRmlsZVV0aWxpdHlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgpIHBDb25uJDogdHlwZW9mIFBDb25uZWN0O1xuXG4gIC8vIEZvciBpbnRlcmFjdGlvbiB3aXRoIEFuZ3VsYXJQQ29ubmVjdFxuICBhbmd1bGFyUENvbm5lY3REYXRhOiBBbmd1bGFyUENvbm5lY3REYXRhID0ge307XG5cbiAgYXJGdWxsTGlzdEF0dGFjaG1lbnRzOiBhbnlbXSA9IFtdO1xuXG4gIGx1X25hbWUkID0gJyc7XG4gIGx1X2ljb24kID0gJyc7XG4gIGx1X2JMb2FkaW5nJCA9IGZhbHNlO1xuICBsdV9jb3VudCQgPSAwO1xuICBsdV9hckFjdGlvbnMkOiBhbnlbXSA9IFtdO1xuICBsdV9hckl0ZW1zJDogYW55ID0gW107XG5cbiAgdmFfYXJJdGVtcyQ6IGFueVtdID0gW107XG5cbiAgbHVfb25WaWV3QWxsRnVuY3Rpb246IGFueTtcblxuICBiU2hvd0ZpbGVNb2RhbCQgPSBmYWxzZTtcbiAgYlNob3dMaW5rTW9kYWwkID0gZmFsc2U7XG4gIGJTaG93Vmlld0FsbE1vZGFsJCA9IGZhbHNlO1xuXG4gIGFyRmlsZU1haW5CdXR0b25zJDogYW55W10gPSBbXTtcbiAgYXJGaWxlU2Vjb25kYXJ5QnV0dG9ucyQ6IGFueVtdID0gW107XG5cbiAgYXJMaW5rTWFpbkJ1dHRvbnMkOiBhbnlbXSA9IFtdO1xuICBhckxpbmtTZWNvbmRhcnlCdXR0b25zJDogYW55W10gPSBbXTtcblxuICBhckZpbGVzJDogYW55W10gPSBbXTtcbiAgYXJGaWxlTGlzdCQ6IGFueVtdID0gW107XG4gIHJlbW92ZUZpbGVGcm9tTGlzdCQ6IGFueTtcblxuICBhckxpbmtzJDogYW55W10gPSBbXTtcbiAgYXJMaW5rc0xpc3QkOiBhbnlbXSA9IFtdO1xuICByZW1vdmVMaW5rc0Zyb21MaXN0JDogYW55O1xuXG4gIGxpbmtfdGl0bGUkID0gJyc7XG4gIGxpbmtfdXJsJCA9ICcnO1xuXG4gIGNsb3NlU3ZnSWNvbiQgPSAnJztcblxuICBjdXJyZW50Q2FzZUlEID0gJyc7XG5cbiAgYWRkQXR0YWNobWVudHNBY3Rpb25zOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhbmd1bGFyUENvbm5lY3Q6IEFuZ3VsYXJQQ29ubmVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB1dGlsczogVXRpbHMsXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxuICApIHt9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgLy8gLy8gRmlyc3QgdGhpbmcgaW4gaW5pdGlhbGl6YXRpb24gaXMgcmVnaXN0ZXJpbmcgYW5kIHN1YnNjcmliaW5nIHRvIHRoZSBBbmd1bGFyUENvbm5lY3Qgc2VydmljZVxuICAgIHRoaXMuYW5ndWxhclBDb25uZWN0RGF0YSA9IHRoaXMuYW5ndWxhclBDb25uZWN0LnJlZ2lzdGVyQW5kU3Vic2NyaWJlQ29tcG9uZW50KHRoaXMsIHRoaXMub25TdGF0ZUNoYW5nZSk7XG5cbiAgICBjb25zdCBjb25maWdQcm9wczogRmlsZVV0aWxpdHlQcm9wcyA9IHRoaXMucENvbm4kLnJlc29sdmVDb25maWdQcm9wcyh0aGlzLnBDb25uJC5nZXRDb25maWdQcm9wcygpKTtcblxuICAgIHRoaXMubHVfbmFtZSQgPSBjb25maWdQcm9wcy5sYWJlbCA/PyAnJztcbiAgICB0aGlzLmx1X2ljb24kID0gJ3BhcGVyLWNsaXAnO1xuXG4gICAgdGhpcy5jbG9zZVN2Z0ljb24kID0gdGhpcy51dGlscy5nZXRJbWFnZVNyYygndGltZXMnLCB0aGlzLnV0aWxzLmdldFNES1N0YXRpY0NvbnRlbnRVcmwoKSk7XG4gICAgdGhpcy5hZGRBdHRhY2htZW50c0FjdGlvbnMgPSBbXG4gICAgICB7XG4gICAgICAgIHRleHQ6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdBZGQgZmlsZXMnLCAnJywgJycpLFxuICAgICAgICBpZDogJ2FkZE5ld0ZpbGVzJyxcbiAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5jcmVhdGVNb2RhbCgnYWRkTG9jYWxGaWxlJylcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHRleHQ6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdBZGQgbGlua3MnLCAnJywgJycpLFxuICAgICAgICBpZDogJ2FkZE5ld0xpbmtzJyxcbiAgICAgICAgb25DbGljazogKCkgPT4gdGhpcy5jcmVhdGVNb2RhbCgnYWRkTG9jYWxMaW5rJylcbiAgICAgIH1cbiAgICBdO1xuICAgIC8vIGNvbnN0IG9uVmlld0FsbENhbGxiYWNrID0gKCkgPT4gdGhpcy5vblZpZXdBbGwodGhpcy5hckZ1bGxMaXN0QXR0YWNobWVudHMpO1xuXG4gICAgdGhpcy5sdV9vblZpZXdBbGxGdW5jdGlvbiA9IHsgb25DbGljazogdGhpcy5vblZpZXdBbGwuYmluZCh0aGlzKSB9O1xuXG4gICAgdGhpcy5yZW1vdmVGaWxlRnJvbUxpc3QkID0geyBvbkNsaWNrOiB0aGlzLnJlbW92ZUZpbGVGcm9tTGlzdC5iaW5kKHRoaXMpIH07XG4gICAgdGhpcy5yZW1vdmVMaW5rc0Zyb21MaXN0JCA9IHsgb25DbGljazogdGhpcy5yZW1vdmVMaW5rc0Zyb21MaXN0LmJpbmQodGhpcykgfTtcblxuICAgIHRoaXMudXBkYXRlU2VsZigpO1xuXG4gICAgdGhpcy5jcmVhdGVNb2RhbEJ1dHRvbnMoKTtcblxuICAgIFBDb3JlLmdldFB1YlN1YlV0aWxzKCkuc3Vic2NyaWJlKFxuICAgICAgKFBDb3JlLmdldEV2ZW50cygpLmdldENhc2VFdmVudCgpIGFzIGFueSkuQ0FTRV9BVFRBQ0hNRU5UU19VUERBVEVEX0ZST01fQ0FTRVZJRVcsXG4gICAgICB0aGlzLnVwZGF0ZVNlbGYuYmluZCh0aGlzKSxcbiAgICAgICdjYXNlQXR0YWNobWVudHNVcGRhdGVGcm9tQ2FzZXZpZXcnXG4gICAgKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuZ3VsYXJQQ29ubmVjdERhdGEudW5zdWJzY3JpYmVGbikge1xuICAgICAgdGhpcy5hbmd1bGFyUENvbm5lY3REYXRhLnVuc3Vic2NyaWJlRm4oKTtcbiAgICB9XG5cbiAgICBQQ29yZS5nZXRQdWJTdWJVdGlscygpLnVuc3Vic2NyaWJlKFxuICAgICAgKFBDb3JlLmdldEV2ZW50cygpLmdldENhc2VFdmVudCgpIGFzIGFueSkuQ0FTRV9BVFRBQ0hNRU5UU19VUERBVEVEX0ZST01fQ0FTRVZJRVcsXG4gICAgICAnY2FzZUF0dGFjaG1lbnRzVXBkYXRlRnJvbUNhc2V2aWV3J1xuICAgICk7XG4gIH1cblxuICAvLyBDYWxsYmFjayBwYXNzZWQgd2hlbiBzdWJzY3JpYmluZyB0byBzdG9yZSBjaGFuZ2VcbiAgb25TdGF0ZUNoYW5nZSgpIHtcbiAgICAvLyBhZGRpbmcgYSBwcm9wZXJ0eSB0byB0cmFjayBpbiBjb25maWdQcm9wcywgd2hlbiBldmVyIHRoZSBhdHRhY2htZW50IGZpbGUgY2hhbmdlc1xuICAgIC8vIG5lZWQgdG8gdHJpZ2dlciBhIHJlZHJhd1xuICAgIHRoaXMucENvbm4kLnJlZ2lzdGVyQWRkaXRpb25hbFByb3BzKHtcbiAgICAgIGxhc3RSZWZyZXNoVGltZTogYEBQICR7UENvcmUuZ2V0Q29uc3RhbnRzKCkuU1VNTUFSWV9PRl9BVFRBQ0hNRU5UU19MQVNUX1JFRlJFU0hfVElNRX1gXG4gICAgfSk7XG5cbiAgICAvLyBTaG91bGQgYWx3YXlzIGNoZWNrIHRoZSBicmlkZ2UgdG8gc2VlIGlmIHRoZSBjb21wb25lbnQgc2hvdWxkIHVwZGF0ZSBpdHNlbGYgKHJlLXJlbmRlcilcbiAgICBjb25zdCBiVXBkYXRlU2VsZiA9IHRoaXMuYW5ndWxhclBDb25uZWN0LnNob3VsZENvbXBvbmVudFVwZGF0ZSh0aGlzKTtcblxuICAgIC8vIE9OTFkgY2FsbCB1cGRhdGVTZWxmIHdoZW4gdGhlIGNvbXBvbmVudCBzaG91bGQgdXBkYXRlXG4gICAgaWYgKGJVcGRhdGVTZWxmIHx8IHRoaXMuY2FzZUhhc0NoYW5nZWQoKSkge1xuICAgICAgdGhpcy51cGRhdGVTZWxmKCk7XG4gICAgfVxuICB9XG5cbiAgb25BdHRhY2hGaWxlcyhmaWxlcykge1xuICAgIGNvbnN0IGF0dGFjaG1lbnRVdGlscyA9IFBDb3JlLmdldEF0dGFjaG1lbnRVdGlscygpO1xuICAgIGNvbnN0IGNhc2VJRCA9IHRoaXMucENvbm4kLmdldFZhbHVlKFBDb3JlLmdldENvbnN0YW50cygpLkNBU0VfSU5GTy5DQVNFX0lORk9fSUQpO1xuXG4gICAgaWYgKGZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubHVfYkxvYWRpbmckID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBhckZpbGVzOiBhbnkgPSBBcnJheS5mcm9tKGZpbGVzKTtcblxuICAgIFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgIGFyRmlsZXMubWFwKGZpbGUgPT4gYXR0YWNobWVudFV0aWxzLnVwbG9hZEF0dGFjaG1lbnQoZmlsZSwgdGhpcy5vblVwbG9hZFByb2dyZXNzLCB0aGlzLmVycm9ySGFuZGxlciwgdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKSkpXG4gICAgKVxuICAgICAgLnRoZW4oKGZpbGVSZXNwb25zZXM6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB1cGxvYWRlZEZpbGVzOiBhbnkgPSBbXTtcbiAgICAgICAgZmlsZVJlc3BvbnNlcy5mb3JFYWNoKGZpbGVSZXNwb25zZSA9PiB7XG4gICAgICAgICAgaWYgKGZpbGVSZXNwb25zZS5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICAgICAgICB1cGxvYWRlZEZpbGVzLnB1c2goZmlsZVJlc3BvbnNlLnZhbHVlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodXBsb2FkZWRGaWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgKGF0dGFjaG1lbnRVdGlscy5saW5rQXR0YWNobWVudHNUb0Nhc2UoY2FzZUlELCB1cGxvYWRlZEZpbGVzLCAnRmlsZScsIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpIGFzIFByb21pc2U8YW55PilcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoQXR0YWNobWVudHMoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5jYXRjaCgpO1xuXG4gICAgdGhpcy5hckZpbGVMaXN0JCA9IFtdO1xuICAgIHRoaXMubHVfYkxvYWRpbmckID0gZmFsc2U7XG4gIH1cblxuICByZWZyZXNoQXR0YWNobWVudHMoKSB7XG4gICAgdGhpcy51cGRhdGVTZWxmKCk7XG4gIH1cblxuICBvblVwbG9hZFByb2dyZXNzKCkge31cblxuICBlcnJvckhhbmRsZXIoKSB7fVxuXG4gIG9uQXR0YWNoTGlua3MobGlua3MpIHtcbiAgICBjb25zdCBhdHRhY2htZW50VXRpbHMgPSBQQ29yZS5nZXRBdHRhY2htZW50VXRpbHMoKTtcbiAgICBjb25zdCBjYXNlSUQgPSB0aGlzLnBDb25uJC5nZXRWYWx1ZShQQ29yZS5nZXRDb25zdGFudHMoKS5DQVNFX0lORk8uQ0FTRV9JTkZPX0lEKTtcblxuICAgIGlmIChsaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmx1X2JMb2FkaW5nJCA9IHRydWU7XG4gICAgfVxuXG4gICAgY29uc3QgbGlua3NUb0F0dGFjaCA9IGxpbmtzLm1hcChsaW5rID0+ICh7XG4gICAgICB0eXBlOiAnVVJMJyxcbiAgICAgIGNhdGVnb3J5OiAnVVJMJyxcbiAgICAgIHVybDogbGluay51cmwsXG4gICAgICBuYW1lOiBsaW5rLmxpbmtUaXRsZVxuICAgIH0pKTtcblxuICAgIChhdHRhY2htZW50VXRpbHMubGlua0F0dGFjaG1lbnRzVG9DYXNlKGNhc2VJRCwgbGlua3NUb0F0dGFjaCwgJ1VSTCcsIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpIGFzIFByb21pc2U8YW55PilcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgdGhpcy5yZWZyZXNoQXR0YWNobWVudHMoKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goY29uc29sZS5sb2cpO1xuICB9XG5cbiAgYWRkQXR0YWNobWVudHMoYXR0c0Zyb21SZXNwOiBhbnlbXSA9IFtdKSB7XG4gICAgdGhpcy5sdV9iTG9hZGluZyQgPSBmYWxzZTtcblxuICAgIGF0dHNGcm9tUmVzcCA9IGF0dHNGcm9tUmVzcC5tYXAocmVzcEF0dCA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkQXR0ID0ge1xuICAgICAgICAuLi5yZXNwQXR0LFxuICAgICAgICBtZXRhOiBgJHtyZXNwQXR0LmNhdGVnb3J5fSAuICR7dGhpcy51dGlscy5nZW5lcmF0ZURhdGVUaW1lKHJlc3BBdHQuY3JlYXRlVGltZSwgJ0RhdGVUaW1lLVNpbmNlJyl9LCAke3Jlc3BBdHQuY3JlYXRlZEJ5fWBcbiAgICAgIH07XG4gICAgICBpZiAodXBkYXRlZEF0dC50eXBlID09PSAnRklMRScpIHtcbiAgICAgICAgdXBkYXRlZEF0dC5uYW1lV2l0aEV4dCA9IHVwZGF0ZWRBdHQuZmlsZU5hbWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gdXBkYXRlZEF0dDtcbiAgICB9KTtcblxuICAgIHJldHVybiBhdHRzRnJvbVJlc3A7XG4gIH1cblxuICBvblZpZXdBbGwoKTogdm9pZCB7XG4gICAgdGhpcy5iU2hvd1ZpZXdBbGxNb2RhbCQgPSB0cnVlO1xuXG4gICAgLy8gYWRkIGNsaWNrQXdheSBsaXN0ZW5lclxuICAgIC8vIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fY2xpY2tBd2F5LmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8gQmVsb3cgbWV0aG9kIGlzIG5vdCBuZWVkZWQsIHN0aWxsIGhhdmluZyBpdCBjb21tZW50ZWQgaW4gY2FzZSB3ZSB3YW50IGluIGZ1dHVyZVxuICAvLyBfY2xpY2tBd2F5KGV2ZW50OiBhbnkpIHtcbiAgLy8gICBsZXQgYkluUG9wVXAgPSBmYWxzZTtcblxuICAvLyAgIC8vIHJ1biB0aHJvdWdoIGxpc3Qgb2YgZWxlbWVudHMgaW4gcGF0aCwgaWYgbWVudSBub3QgaW4gdGggcGF0aCwgdGhlbiB3YW50IHRvXG4gIC8vICAgLy8gaGlkZSAodG9nZ2xlKSB0aGUgbWVudVxuICAvLyAgIGZvciAoY29uc3QgaSBpbiBldmVudC5wYXRoKSB7XG4gIC8vICAgICBpZiAoZXZlbnQucGF0aFtpXS5jbGFzc05hbWUgPT0gJ3BzZGstbW9kYWwtZmlsZS10b3AnIHx8IGV2ZW50LnBhdGhbaV0udGFnTmFtZSA9PSAnQlVUVE9OJykge1xuICAvLyAgICAgICBiSW5Qb3BVcCA9IHRydWU7XG4gIC8vICAgICAgIGJyZWFrO1xuICAvLyAgICAgfVxuICAvLyAgIH1cbiAgLy8gICBpZiAoIWJJblBvcFVwKSB7XG4gIC8vICAgICB0aGlzLmJTaG93Vmlld0FsbE1vZGFsJCA9IGZhbHNlO1xuXG4gIC8vICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2NsaWNrQXdheS5iaW5kKHRoaXMpKTtcbiAgLy8gICB9XG4gIC8vIH1cblxuICBfY2xvc2VWaWV3QWxsKCkge1xuICAgIHRoaXMuYlNob3dWaWV3QWxsTW9kYWwkID0gZmFsc2U7XG5cbiAgICAvLyB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMuX2NsaWNrQXdheS5iaW5kKHRoaXMpKTtcbiAgfVxuXG4gIHJlbW92ZUZpbGVGcm9tTGlzdChpdGVtOiBhbnkpIHtcbiAgICBpZiAoaXRlbSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBhckZpbGVMaXN0ID0gdGhpcy5hckZpbGVMaXN0JDtcbiAgICAgIGNvbnN0IGl0ZW1JZCA9IGl0ZW0uaWQ7XG5cbiAgICAgIGZvciAobGV0IGZpbGVJbmRleCA9IDA7IGZpbGVJbmRleCA8IGFyRmlsZUxpc3QubGVuZ3RoOyBmaWxlSW5kZXgrKykge1xuICAgICAgICBpZiAoYXJGaWxlTGlzdFtmaWxlSW5kZXhdLmlkID09IGl0ZW1JZCkge1xuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgZmlsZSBmcm9tIHRoZSBsaXN0IGFuZCByZWRyYXdcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgYXJGaWxlTGlzdC5zcGxpY2UoZmlsZUluZGV4LCAxKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUxpbmtzRnJvbUxpc3QoaXRlbTogYW55KSB7XG4gICAgY29uc3QgbG9jYWxMaW5rc0xpc3QgPSB0aGlzLmFyTGlua3NMaXN0JC5zbGljZSgpO1xuXG4gICAgaWYgKGl0ZW0gIT0gbnVsbCkge1xuICAgICAgY29uc3QgaXRlbUlkID0gaXRlbS5pZDtcblxuICAgICAgZm9yIChsZXQgbGlua0luZGV4ID0gMDsgbGlua0luZGV4IDwgbG9jYWxMaW5rc0xpc3QubGVuZ3RoOyBsaW5rSW5kZXgrKykge1xuICAgICAgICBpZiAobG9jYWxMaW5rc0xpc3RbbGlua0luZGV4XS5pZCA9PSBpdGVtSWQpIHtcbiAgICAgICAgICAvLyByZW1vdmUgdGhlIGZpbGUgZnJvbSB0aGUgbGlzdCBhbmQgcmVkcmF3XG4gICAgICAgICAgbG9jYWxMaW5rc0xpc3Quc3BsaWNlKGxpbmtJbmRleCwgMSk7XG5cbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5hckxpbmtzTGlzdCQgPSBsb2NhbExpbmtzTGlzdC5zbGljZSgpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXROZXdMaXN0VXRpbGl0eUl0ZW1Qcm9wcyA9ICh7IGF0dCwgY2FuY2VsRmlsZSwgZG93bmxvYWRGaWxlLCBkZWxldGVGaWxlLCByZW1vdmVGaWxlIH0pID0+IHtcbiAgICBsZXQgYWN0aW9ucztcbiAgICBsZXQgaXNEb3dubG9hZGFibGUgPSBmYWxzZTtcblxuICAgIGlmIChhdHQucHJvZ3Jlc3MgJiYgYXR0LnByb2dyZXNzICE9PSAxMDApIHtcbiAgICAgIGFjdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogYENhbmNlbC0ke2F0dC5JRH1gLFxuICAgICAgICAgIHRleHQ6ICdDYW5jZWwnLFxuICAgICAgICAgIGljb246ICd0aW1lcycsXG4gICAgICAgICAgb25DbGljazogY2FuY2VsRmlsZVxuICAgICAgICB9XG4gICAgICBdO1xuICAgIH0gZWxzZSBpZiAoYXR0LmxpbmtzKSB7XG4gICAgICBjb25zdCBpc0ZpbGUgPSBhdHQudHlwZSA9PT0gJ0ZJTEUnO1xuICAgICAgY29uc3QgSUQgPSBhdHQuSUQucmVwbGFjZSgvXFxzL2dpLCAnJyk7XG4gICAgICBjb25zdCBhY3Rpb25zTWFwID0gbmV3IE1hcChbXG4gICAgICAgIFtcbiAgICAgICAgICAnZG93bmxvYWQnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBgZG93bmxvYWQtJHtJRH1gLFxuICAgICAgICAgICAgdGV4dDogaXNGaWxlID8gJ0Rvd25sb2FkJyA6ICdPcGVuJyxcbiAgICAgICAgICAgIGljb246IGlzRmlsZSA/ICdkb3dubG9hZCcgOiAnb3BlbicsXG4gICAgICAgICAgICBvbkNsaWNrOiBkb3dubG9hZEZpbGVcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogYERlbGV0ZS0ke0lEfWAsXG4gICAgICAgICAgICB0ZXh0OiAnRGVsZXRlJyxcbiAgICAgICAgICAgIGljb246ICd0cmFzaCcsXG4gICAgICAgICAgICBvbkNsaWNrOiBkZWxldGVGaWxlXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICBdKTtcbiAgICAgIGFjdGlvbnMgPSBbXTtcbiAgICAgIGFjdGlvbnNNYXAuZm9yRWFjaCgoYWN0aW9uLCBhY3Rpb25LZXkpID0+IHtcbiAgICAgICAgaWYgKGF0dC5saW5rc1thY3Rpb25LZXldKSB7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgaXNEb3dubG9hZGFibGUgPSBhdHQubGlua3MuZG93bmxvYWQ7XG4gICAgfSBlbHNlIGlmIChhdHQuZXJyb3IpIHtcbiAgICAgIGFjdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogYFJlbW92ZS0ke2F0dC5JRH1gLFxuICAgICAgICAgIHRleHQ6ICdSZW1vdmUnLFxuICAgICAgICAgIGljb246ICd0cmFzaCcsXG4gICAgICAgICAgb25DbGljazogcmVtb3ZlRmlsZVxuICAgICAgICB9XG4gICAgICBdO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogYXR0LklELFxuICAgICAgdmlzdWFsOiB7XG4gICAgICAgIGljb246IHRoaXMudXRpbHMuZ2V0SWNvbkZvckF0dGFjaG1lbnQoYXR0KSxcbiAgICAgICAgcHJvZ3Jlc3M6IGF0dC5wcm9ncmVzcyA9PSAxMDAgPyB1bmRlZmluZWQgOiBhdHQucHJvZ3Jlc3NcbiAgICAgIH0sXG4gICAgICBwcmltYXJ5OiB7XG4gICAgICAgIHR5cGU6IGF0dC50eXBlLFxuICAgICAgICBuYW1lOiBhdHQubmFtZSxcbiAgICAgICAgaWNvbjogJ3RyYXNoJyxcbiAgICAgICAgY2xpY2s6IHJlbW92ZUZpbGVcbiAgICAgIH0sXG4gICAgICBzZWNvbmRhcnk6IHtcbiAgICAgICAgdGV4dDogYXR0Lm1ldGFcbiAgICAgIH0sXG4gICAgICBhY3Rpb25zXG4gICAgfTtcbiAgfTtcblxuICBnZXRMaXN0VXRpbGl0eUl0ZW1Qcm9wcyA9ICh7IGF0dCwgY2FuY2VsRmlsZSwgZG93bmxvYWRGaWxlLCBkZWxldGVGaWxlLCByZW1vdmVGaWxlIH0pID0+IHtcbiAgICBsZXQgYWN0aW9ucztcbiAgICBsZXQgaXNEb3dubG9hZGFibGUgPSBmYWxzZTtcblxuICAgIGlmIChhdHQucHJvZ3Jlc3MgJiYgYXR0LnByb2dyZXNzICE9PSAxMDApIHtcbiAgICAgIGFjdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogYENhbmNlbC0ke2F0dC5JRH1gLFxuICAgICAgICAgIHRleHQ6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdDYW5jZWwnLCAnJywgJycpLFxuICAgICAgICAgIGljb246ICd0aW1lcycsXG4gICAgICAgICAgb25DbGljazogY2FuY2VsRmlsZVxuICAgICAgICB9XG4gICAgICBdO1xuICAgIH0gZWxzZSBpZiAoYXR0LmxpbmtzKSB7XG4gICAgICBjb25zdCBpc0ZpbGUgPSBhdHQudHlwZSA9PT0gJ0ZJTEUnO1xuICAgICAgY29uc3QgSUQgPSBhdHQuSUQucmVwbGFjZSgvXFxzL2dpLCAnJyk7XG4gICAgICBjb25zdCBhY3Rpb25zTWFwID0gbmV3IE1hcChbXG4gICAgICAgIFtcbiAgICAgICAgICAnZG93bmxvYWQnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGlkOiBgZG93bmxvYWQtJHtJRH1gLFxuICAgICAgICAgICAgdGV4dDogaXNGaWxlID8gdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0Rvd25sb2FkJywgJycsICcnKSA6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdPcGVuJywgJycsICcnKSxcbiAgICAgICAgICAgIGljb246IGlzRmlsZSA/ICdkb3dubG9hZCcgOiAnb3BlbicsXG4gICAgICAgICAgICBvbkNsaWNrOiBkb3dubG9hZEZpbGVcbiAgICAgICAgICB9XG4gICAgICAgIF0sXG4gICAgICAgIFtcbiAgICAgICAgICAnZGVsZXRlJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBpZDogYERlbGV0ZS0ke0lEfWAsXG4gICAgICAgICAgICB0ZXh0OiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnRGVsZXRlJywgJycsICcnKSxcbiAgICAgICAgICAgIGljb246ICd0cmFzaCcsXG4gICAgICAgICAgICBvbkNsaWNrOiBkZWxldGVGaWxlXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICBdKTtcbiAgICAgIGFjdGlvbnMgPSBbXTtcbiAgICAgIGFjdGlvbnNNYXAuZm9yRWFjaCgoYWN0aW9uLCBhY3Rpb25LZXkpID0+IHtcbiAgICAgICAgaWYgKGF0dC5saW5rc1thY3Rpb25LZXldKSB7XG4gICAgICAgICAgYWN0aW9ucy5wdXNoKGFjdGlvbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgaXNEb3dubG9hZGFibGUgPSBhdHQubGlua3MuZG93bmxvYWQ7XG4gICAgfSBlbHNlIGlmIChhdHQuZXJyb3IpIHtcbiAgICAgIGFjdGlvbnMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBpZDogYFJlbW92ZS0ke2F0dC5JRH1gLFxuICAgICAgICAgIHRleHQ6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdSZW1vdmUnLCAnJywgJycpLFxuICAgICAgICAgIGljb246ICd0cmFzaCcsXG4gICAgICAgICAgb25DbGljazogcmVtb3ZlRmlsZVxuICAgICAgICB9XG4gICAgICBdO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZDogYXR0LklELFxuICAgICAgdmlzdWFsOiB7XG4gICAgICAgIGljb246IHRoaXMudXRpbHMuZ2V0SWNvbkZvckF0dGFjaG1lbnQoYXR0KSxcbiAgICAgICAgcHJvZ3Jlc3M6IGF0dC5wcm9ncmVzcyA9PSAxMDAgPyB1bmRlZmluZWQgOiBhdHQucHJvZ3Jlc3NcbiAgICAgIH0sXG4gICAgICBwcmltYXJ5OiB7XG4gICAgICAgIHR5cGU6IGF0dC50eXBlLFxuICAgICAgICBuYW1lOiBhdHQubmFtZSxcbiAgICAgICAgaWNvbjogJ29wZW4nLFxuICAgICAgICBjbGljazogZG93bmxvYWRGaWxlXG4gICAgICB9LFxuICAgICAgc2Vjb25kYXJ5OiB7XG4gICAgICAgIHRleHQ6IGF0dC5tZXRhXG4gICAgICB9LFxuICAgICAgYWN0aW9uc1xuICAgIH07XG4gIH07XG5cbiAgX2FkZExpbmsoKSB7XG4gICAgLy8gY29weSBsaXN0IGxvY2FsbHlcbiAgICBjb25zdCBsb2NhbExpc3QgPSB0aGlzLmFyTGlua3NMaXN0JC5zbGljZSgpO1xuXG4gICAgY29uc3QgdXJsID0gdGhpcy5saW5rX3VybCQ7XG5cbiAgICBpZiAoIS9eKGh0dHB8aHR0cHMpOlxcL1xcLy8udGVzdCh0aGlzLmxpbmtfdXJsJCkpIHtcbiAgICAgIHRoaXMubGlua191cmwkID0gYGh0dHA6Ly8ke3RoaXMubGlua191cmwkfWA7XG4gICAgfVxuXG4gICAgLy8gbGlzdCBmb3IgZGlzcGxheVxuICAgIGxldCBvTGluazogYW55ID0ge307XG4gICAgb0xpbmsuaWNvbiA9ICdjaGFpbic7XG5cbiAgICBvTGluay5JRCA9IGAke25ldyBEYXRlKCkuZ2V0VGltZSgpfWA7XG5cbiAgICBvTGluayA9IHRoaXMuZ2V0TmV3TGlzdFV0aWxpdHlJdGVtUHJvcHMoe1xuICAgICAgYXR0OiBvTGluayxcbiAgICAgIGRvd25sb2FkRmlsZTogbnVsbCxcbiAgICAgIGNhbmNlbEZpbGU6IG51bGwsXG4gICAgICBkZWxldGVGaWxlOiBudWxsLFxuICAgICAgcmVtb3ZlRmlsZTogbnVsbFxuICAgIH0pO1xuXG4gICAgb0xpbmsudHlwZSA9ICdVUkwnO1xuICAgIG9MaW5rLnByaW1hcnkudHlwZSA9IG9MaW5rLnR5cGU7XG4gICAgb0xpbmsudmlzdWFsLmljb24gPSAnY2hhaW4nO1xuICAgIG9MaW5rLnByaW1hcnkubmFtZSA9IHRoaXMubGlua190aXRsZSQ7XG4gICAgb0xpbmsucHJpbWFyeS5pY29uID0gJ29wZW4nO1xuICAgIG9MaW5rLnNlY29uZGFyeS50ZXh0ID0gdXJsO1xuXG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIC8vIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGFycmF5IG9yIHN1bW1hcnkgbGlzdCB3b24ndCBkZXRlY3QgY2hhbmdlc1xuICAgICAgdGhpcy5hckxpbmtzTGlzdCQgPSBsb2NhbExpc3Quc2xpY2UoKTtcbiAgICAgIHRoaXMuYXJMaW5rc0xpc3QkLnB1c2gob0xpbmspO1xuXG4gICAgICAvLyBsaXN0IGZvciBhY3R1YWxseSBhdHRhY2htZW50c1xuICAgICAgY29uc3QgbGluazogYW55ID0ge307XG4gICAgICBsaW5rLmlkID0gb0xpbmsuaWQ7XG4gICAgICBsaW5rLmxpbmtUaXRsZSA9IHRoaXMubGlua190aXRsZSQ7XG4gICAgICBsaW5rLnR5cGUgPSBvTGluay50eXBlO1xuICAgICAgbGluay51cmwgPSB1cmw7XG5cbiAgICAgIHRoaXMuYXJMaW5rcyQucHVzaChsaW5rKTtcblxuICAgICAgLy8gY2xlYXIgdmFsdWVzXG4gICAgICB0aGlzLmxpbmtfdGl0bGUkID0gJyc7XG4gICAgICB0aGlzLmxpbmtfdXJsJCA9ICcnO1xuICAgIH0pO1xuICB9XG5cbiAgX2NoYW5nZVRpdGxlKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmxpbmtfdGl0bGUkID0gZXZlbnQuc3JjRWxlbWVudC52YWx1ZTtcbiAgfVxuXG4gIF9jaGFuZ2VVcmwoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMubGlua191cmwkID0gZXZlbnQuc3JjRWxlbWVudC52YWx1ZTtcbiAgfVxuXG4gIGRvd25sb2FkRmlsZShhdHQ6IGFueSkge1xuICAgIGNvbnN0IGF0dGFjaFV0aWxzID0gUENvcmUuZ2V0QXR0YWNobWVudFV0aWxzKCk7XG4gICAgY29uc3QgeyBJRCwgbmFtZSwgZXh0ZW5zaW9uLCB0eXBlIH0gPSBhdHQ7XG4gICAgY29uc3QgY29udGV4dCA9IHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCk7XG5cbiAgICBhdHRhY2hVdGlsc1xuICAgICAgLy8gQHRzLWlnbm9yZSAtIDNyZCBwYXJhbWV0ZXIgXCJyZXNwb25zZUVuY29kaW5nXCIgaXMgb3B0aW9uYWxcbiAgICAgIC5kb3dubG9hZEF0dGFjaG1lbnQoSUQsIGNvbnRleHQpXG4gICAgICAudGhlbigoY29udGVudDogYW55KSA9PiB7XG4gICAgICAgIGlmICh0eXBlID09PSAnRklMRScpIHtcbiAgICAgICAgICB0aGlzLmZpbGVEb3dubG9hZChjb250ZW50LmRhdGEsIG5hbWUsIGV4dGVuc2lvbik7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1VSTCcpIHtcbiAgICAgICAgICBsZXQgeyBkYXRhIH0gPSBjb250ZW50O1xuICAgICAgICAgIGlmICghL14oaHR0cHxodHRwcyk6XFwvXFwvLy50ZXN0KGRhdGEpKSB7XG4gICAgICAgICAgICBkYXRhID0gYC8vJHtkYXRhfWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdpbmRvdy5vcGVuKGNvbnRlbnQuZGF0YSwgJ19ibGFuaycpO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuICB9XG5cbiAgZmlsZURvd25sb2FkID0gKGRhdGEsIGZpbGVOYW1lLCBleHQpID0+IHtcbiAgICBjb25zdCBmaWxlID0gZXh0ID8gYCR7ZmlsZU5hbWV9LiR7ZXh0fWAgOiBmaWxlTmFtZTtcbiAgICBkb3dubG9hZChhdG9iKGRhdGEpLCBmaWxlKTtcbiAgfTtcblxuICBjYW5jZWxGaWxlKCkge1xuICAgIGFsZXJ0KCdjYW5jZWwnKTtcbiAgfVxuXG4gIGRlbGV0ZUZpbGUoYXR0OiBhbnkpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGNvbnN0IGF0dGFjaFV0aWxzID0gUENvcmUuZ2V0QXR0YWNobWVudFV0aWxzKCk7XG4gICAgICBjb25zdCB7IElEIH0gPSBhdHQ7XG4gICAgICBjb25zdCBjb250ZXh0ID0gdGhpcy5wQ29ubiQuZ2V0Q29udGV4dE5hbWUoKTtcblxuICAgICAgYXR0YWNoVXRpbHNcbiAgICAgICAgLmRlbGV0ZUF0dGFjaG1lbnQoSUQsIGNvbnRleHQpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGYoKTtcbiAgICAgICAgICAvLyBsZXQgbmV3QXR0YWNobWVudHM7XG4gICAgICAgICAgLy8gc2V0QXR0YWNobWVudHMoKGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAvLyAgIG5ld0F0dGFjaG1lbnRzID0gY3VycmVudC5maWx0ZXIoKGZpbGUpID0+IGZpbGUuSUQgIT09IElEKTtcbiAgICAgICAgICAvLyAgIHJldHVybiBuZXdBdHRhY2htZW50cztcbiAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAvLyBpZiAoY2FsbGJhY2tGbikge1xuICAgICAgICAgIC8vICAgY2FsbGJhY2tGbihuZXdBdHRhY2htZW50cyk7XG4gICAgICAgICAgLy8gfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goY29uc29sZS5lcnJvcik7XG4gICAgfSk7XG4gIH1cblxuICByZW1vdmVGaWxlKCkge1xuICAgIGFsZXJ0KCdyZW1vdmUnKTtcbiAgfVxuXG4gIHJlbW92ZU5ld0ZpbGUoKSB7XG4gICAgYWxlcnQoJ3JlbW92ZScpO1xuICB9XG5cbiAgY3JlYXRlTW9kYWwobW9kYWxUeXBlOiBzdHJpbmcpIHtcbiAgICBzd2l0Y2ggKG1vZGFsVHlwZSkge1xuICAgICAgY2FzZSAnYWRkTG9jYWxGaWxlJzpcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmJTaG93RmlsZU1vZGFsJCA9IHRydWU7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYWRkTG9jYWxMaW5rJzpcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmJTaG93TGlua01vZGFsJCA9IHRydWU7XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZU1vZGFsQnV0dG9ucygpIHtcbiAgICB0aGlzLmFyRmlsZU1haW5CdXR0b25zJC5wdXNoKHsgYWN0aW9uSUQ6ICdhdHRhY2gnLCBqc0FjdGlvbjogJ2F0dGFjaEZpbGVzJywgbmFtZTogdGhpcy5wQ29ubiQuZ2V0TG9jYWxpemVkVmFsdWUoJ0F0dGFjaCBmaWxlcycsICcnLCAnJykgfSk7XG4gICAgdGhpcy5hckZpbGVTZWNvbmRhcnlCdXR0b25zJC5wdXNoKHsgYWN0aW9uSUQ6ICdjYW5jZWwnLCBqc0FjdGlvbjogJ2NhbmNlbCcsIG5hbWU6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdDYW5jZWwnLCAnJywgJycpIH0pO1xuXG4gICAgdGhpcy5hckxpbmtNYWluQnV0dG9ucyQucHVzaCh7IGFjdGlvbklEOiAnYXR0YWNoJywganNBY3Rpb246ICdhdHRhY2hMaW5rcycsIG5hbWU6IHRoaXMucENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdBdHRhY2ggbGlua3MnLCAnJywgJycpIH0pO1xuICAgIHRoaXMuYXJMaW5rU2Vjb25kYXJ5QnV0dG9ucyQucHVzaCh7IGFjdGlvbklEOiAnY2FuY2VsJywganNBY3Rpb246ICdjYW5jZWwnLCBuYW1lOiB0aGlzLnBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnQ2FuY2VsJywgJycsICcnKSB9KTtcbiAgfVxuXG4gIHVwbG9hZE15RmlsZXMoJGV2ZW50KSB7XG4gICAgLy8gYWxlcnQoJGV2ZW50LnRhcmdldC5maWxlc1swXSk7IC8vIG91dHB1dHMgdGhlIGZpcnN0IGZpbGVcbiAgICB0aGlzLmFyRmlsZXMkID0gdGhpcy5nZXRGaWxlcygkZXZlbnQudGFyZ2V0LmZpbGVzKTtcblxuICAgIC8vIGNvbnZlcnQgRmlsZUxpc3QgdG8gYW4gYXJyYXlcbiAgICBjb25zdCBteUZpbGVzID0gQXJyYXkuZnJvbSh0aGlzLmFyRmlsZXMkKTtcblxuICAgIHRoaXMuYXJGaWxlTGlzdCQgPSBteUZpbGVzLm1hcChhdHQgPT4ge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0TmV3TGlzdFV0aWxpdHlJdGVtUHJvcHMoe1xuICAgICAgICBhdHQsXG4gICAgICAgIGRvd25sb2FkRmlsZTogIWF0dC5wcm9ncmVzcyA/ICgpID0+IHRoaXMuZG93bmxvYWRGaWxlKGF0dCkgOiBudWxsLFxuICAgICAgICBjYW5jZWxGaWxlOiBhdHQucHJvZ3Jlc3MgPyAoKSA9PiB0aGlzLmNhbmNlbEZpbGUoKSA6IG51bGwsXG4gICAgICAgIGRlbGV0ZUZpbGU6ICFhdHQucHJvZ3Jlc3MgPyAoKSA9PiB0aGlzLmRlbGV0ZUZpbGUoYXR0KSA6IG51bGwsXG4gICAgICAgIHJlbW92ZUZpbGU6IGF0dC5lcnJvciA/ICgpID0+IHRoaXMucmVtb3ZlTmV3RmlsZSgpIDogbnVsbFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRGaWxlcyhhckZpbGVzOiBhbnlbXSk6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5zZXROZXdGaWxlcyhhckZpbGVzKTtcbiAgfVxuXG4gIHNldE5ld0ZpbGVzKGFyRmlsZXMpIHtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIGZvciAoY29uc3QgZmlsZSBvZiBhckZpbGVzKSB7XG4gICAgICBpZiAoIXRoaXMudmFsaWRhdGVNYXhTaXplKGZpbGUsIDUpKSB7XG4gICAgICAgIGZpbGUuZXJyb3IgPSB0cnVlO1xuICAgICAgICBmaWxlLm1ldGEgPSAnRmlsZSBpcyB0b28gYmlnLiBNYXggYWxsb3dlZCBzaXplIGlzIDVNQi4nO1xuICAgICAgfVxuICAgICAgZmlsZS5taW1lVHlwZSA9IGZpbGUudHlwZTtcbiAgICAgIGZpbGUuaWNvbiA9IHRoaXMudXRpbHMuZ2V0SWNvbkZyb21GaWxlVHlwZShmaWxlLnR5cGUpO1xuICAgICAgZmlsZS5JRCA9IGAke25ldyBEYXRlKCkuZ2V0VGltZSgpfUkke2luZGV4fWA7XG4gICAgICBpbmRleCsrO1xuICAgIH1cblxuICAgIHJldHVybiBhckZpbGVzO1xuICB9XG5cbiAgdmFsaWRhdGVNYXhTaXplKGZpbGVPYmosIG1heFNpemVJbk1CKTogYm9vbGVhbiB7XG4gICAgY29uc3QgZmlsZVNpemUgPSAoZmlsZU9iai5zaXplIC8gMTA0ODU3NikudG9GaXhlZCgyKTtcbiAgICByZXR1cm4gZmlsZVNpemUgPCBtYXhTaXplSW5NQjtcbiAgfVxuXG4gIG9uRmlsZUFjdGlvbkJ1dHRvbkNsaWNrKGV2ZW50OiBhbnkpIHtcbiAgICAvLyBtb2RhbCBidXR0b25zXG4gICAgc3dpdGNoIChldmVudC5hY3Rpb24pIHtcbiAgICAgIGNhc2UgJ2NhbmNlbCc6XG4gICAgICAgIHRoaXMuYlNob3dGaWxlTW9kYWwkID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5jbGVhck91dEZpbGVzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYXR0YWNoRmlsZXMnOlxuICAgICAgICB0aGlzLmJTaG93RmlsZU1vZGFsJCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uQXR0YWNoRmlsZXModGhpcy5hckZpbGVzJCk7XG5cbiAgICAgICAgdGhpcy5jbGVhck91dEZpbGVzKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb25MaW5rQWN0aW9uQnV0dG9uQ2xpY2soZXZlbnQ6IGFueSkge1xuICAgIC8vIG1vZGFsIGJ1dHRvbnNcbiAgICBzd2l0Y2ggKGV2ZW50LmFjdGlvbikge1xuICAgICAgY2FzZSAnY2FuY2VsJzpcbiAgICAgICAgdGhpcy5iU2hvd0xpbmtNb2RhbCQgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmNsZWFyT3V0TGlua3MoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdhdHRhY2hMaW5rcyc6XG4gICAgICAgIHRoaXMuYlNob3dMaW5rTW9kYWwkID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25BdHRhY2hMaW5rcyh0aGlzLmFyTGlua3MkKTtcblxuICAgICAgICB0aGlzLmNsZWFyT3V0TGlua3MoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBjbGVhck91dEZpbGVzKCkge1xuICAgIHRoaXMuYXJGaWxlTGlzdCQgPSBbXTtcbiAgICB0aGlzLmFyRmlsZXMkID0gW107XG4gIH1cblxuICBjbGVhck91dExpbmtzKCkge1xuICAgIHRoaXMuYXJMaW5rc0xpc3QkID0gW107XG4gICAgdGhpcy5hckxpbmtzJCA9IFtdO1xuICAgIHRoaXMubGlua190aXRsZSQgPSAnJztcbiAgICB0aGlzLmxpbmtfdXJsJCA9ICcnO1xuICB9XG5cbiAgYWRkQUxpbmsoKSB7fVxuXG4gIF9maWVsZE9uQ2hhbmdlTGluayhldmVudDogYW55KSB7XG4gICAgdGhpcy5saW5rX3RpdGxlJCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfVxuXG4gIF9maWVsZE9uQ2hhbmdlVVJMKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmxpbmtfdXJsJCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgfVxuXG4gIHVwZGF0ZVNlbGYoKSB7XG4gICAgY29uc3QgY2FzZUlEID0gdGhpcy5nZXRDYXNlSUQoKTtcblxuICAgIGlmIChjYXNlSUQpIHtcbiAgICAgIHRoaXMubHVfYkxvYWRpbmckID0gdHJ1ZTtcblxuICAgICAgdGhpcy5mZXRjaENhc2VBdHRhY2htZW50cyhjYXNlSUQpXG4gICAgICAgIC50aGVuKHJlc3AgPT4ge1xuICAgICAgICAgIHRoaXMuaGFuZGxlQXR0YWNobWVudHNSZXNwb25zZShyZXNwKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIHRoaXMubHVfYkxvYWRpbmckID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGdldENhc2VJRCgpIHtcbiAgICByZXR1cm4gdGhpcy5wQ29ubiQuZ2V0VmFsdWUoUENvcmUuZ2V0Q29uc3RhbnRzKCkuQ0FTRV9JTkZPLkNBU0VfSU5GT19JRCkgfHwgJyc7XG4gIH1cblxuICBmZXRjaENhc2VBdHRhY2htZW50cyhjYXNlSUQpIHtcbiAgICBjb25zdCBhdHRhY2htZW50VXRpbHMgPSBQQ29yZS5nZXRBdHRhY2htZW50VXRpbHMoKTtcbiAgICByZXR1cm4gYXR0YWNobWVudFV0aWxzLmdldENhc2VBdHRhY2htZW50cyhjYXNlSUQsIHRoaXMucENvbm4kLmdldENvbnRleHROYW1lKCkpO1xuICB9XG5cbiAgaGFuZGxlQXR0YWNobWVudHNSZXNwb25zZShyZXNwKSB7XG4gICAgdGhpcy5hckZ1bGxMaXN0QXR0YWNobWVudHMgPSB0aGlzLmFkZEF0dGFjaG1lbnRzKHJlc3ApO1xuICAgIHRoaXMubHVfY291bnQkID0gdGhpcy5hckZ1bGxMaXN0QXR0YWNobWVudHMubGVuZ3RoO1xuICAgIHRoaXMubHVfYXJBY3Rpb25zJCA9IHRoaXMuYWRkQXR0YWNobWVudHNBY3Rpb25zO1xuXG4gICAgdGhpcy5sdV9hckl0ZW1zJCA9IHRoaXMuZ2V0VXRpbGl0eUl0ZW1zKHRoaXMuYXJGdWxsTGlzdEF0dGFjaG1lbnRzLnNsaWNlKDAsIDMpKTtcbiAgICB0aGlzLnZhX2FySXRlbXMkID0gdGhpcy5nZXRVdGlsaXR5SXRlbXModGhpcy5hckZ1bGxMaXN0QXR0YWNobWVudHMpO1xuICB9XG5cbiAgZ2V0VXRpbGl0eUl0ZW1zKGF0dGFjaG1lbnRzKSB7XG4gICAgcmV0dXJuIGF0dGFjaG1lbnRzLm1hcCh0aGlzLm1hcEF0dGFjaG1lbnRUb1V0aWxpdHlJdGVtLmJpbmQodGhpcykpO1xuICB9XG5cbiAgbWFwQXR0YWNobWVudFRvVXRpbGl0eUl0ZW0oYXR0KSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TGlzdFV0aWxpdHlJdGVtUHJvcHMoe1xuICAgICAgYXR0LFxuICAgICAgZG93bmxvYWRGaWxlOiB0aGlzLmdldERvd25sb2FkRnVuY3Rpb24oYXR0KSxcbiAgICAgIGNhbmNlbEZpbGU6IHRoaXMuZ2V0Q2FuY2VsRnVuY3Rpb24oYXR0KSxcbiAgICAgIGRlbGV0ZUZpbGU6IHRoaXMuZ2V0RGVsZXRlRnVuY3Rpb24oYXR0KSxcbiAgICAgIHJlbW92ZUZpbGU6IHRoaXMuZ2V0UmVtb3ZlRnVuY3Rpb24oYXR0KVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0RG93bmxvYWRGdW5jdGlvbihhdHQpIHtcbiAgICByZXR1cm4gIWF0dC5wcm9ncmVzcyA/ICgpID0+IHRoaXMuZG93bmxvYWRGaWxlKGF0dCkgOiBudWxsO1xuICB9XG5cbiAgZ2V0Q2FuY2VsRnVuY3Rpb24oYXR0KSB7XG4gICAgcmV0dXJuIGF0dC5wcm9ncmVzcyA/ICgpID0+IHRoaXMuY2FuY2VsRmlsZSgpIDogbnVsbDtcbiAgfVxuXG4gIGdldERlbGV0ZUZ1bmN0aW9uKGF0dCkge1xuICAgIHJldHVybiAhYXR0LnByb2dyZXNzID8gKCkgPT4gdGhpcy5kZWxldGVGaWxlKGF0dCkgOiBudWxsO1xuICB9XG5cbiAgZ2V0UmVtb3ZlRnVuY3Rpb24oYXR0KSB7XG4gICAgcmV0dXJuIGF0dC5lcnJvciA/ICgpID0+IHRoaXMucmVtb3ZlRmlsZSgpIDogbnVsbDtcbiAgfVxuXG4gIGNhc2VIYXNDaGFuZ2VkKCk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGNhc2VJRCA9IHRoaXMucENvbm4kLmdldFZhbHVlKFBDb3JlLmdldENvbnN0YW50cygpLkNBU0VfSU5GTy5DQVNFX0lORk9fSUQpO1xuICAgIGlmICh0aGlzLmN1cnJlbnRDYXNlSUQgIT09IGNhc2VJRCkge1xuICAgICAgdGhpcy5jdXJyZW50Q2FzZUlEID0gY2FzZUlEO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG4iLCI8ZGl2PlxuICA8Y29tcG9uZW50LW1hcHBlclxuICAgIG5hbWU9XCJMaXN0VXRpbGl0eVwiXG4gICAgW3Byb3BzXT1cIntcbiAgICAgIG5hbWUkOiBsdV9uYW1lJCxcbiAgICAgIGljb24kOiBsdV9pY29uJCxcbiAgICAgIGJMb2FkaW5nJDogbHVfYkxvYWRpbmckLFxuICAgICAgY291bnQkOiBsdV9jb3VudCQsXG4gICAgICBhckFjdGlvbnMkOiBsdV9hckFjdGlvbnMkLFxuICAgICAgYXJJdGVtcyQ6IGx1X2FySXRlbXMkLFxuICAgICAgb25WaWV3QWxsJDogbHVfb25WaWV3QWxsRnVuY3Rpb24sXG4gICAgICBtZW51SWNvbk92ZXJyaWRlQWN0aW9uJDogcmVtb3ZlRmlsZUZyb21MaXN0JFxuICAgIH1cIlxuICA+PC9jb21wb25lbnQtbWFwcGVyPlxuPC9kaXY+XG5cbjxkaXYgKm5nSWY9XCJiU2hvd0ZpbGVNb2RhbCRcIiBjbGFzcz1cInBzZGstZGlhbG9nLWJhY2tncm91bmRcIj5cbiAgPGRpdiBjbGFzcz1cInBzZGstbW9kYWwtZmlsZS10b3BcIj5cbiAgICA8aDM+e3sgcENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdBZGQgbG9jYWwgZmlsZXMnLCAnJywgJycpIH19PC9oMz5cbiAgICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1ib2R5XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1maWxlLXNlbGVjdG9yXCI+XG4gICAgICAgIDxpbnB1dCBoaWRkZW4gdHlwZT1cImZpbGVcIiBtdWx0aXBsZSAjdXBsb2FkZXIgKGNoYW5nZSk9XCJ1cGxvYWRNeUZpbGVzKCRldmVudClcIiAvPlxuXG4gICAgICAgIDxidXR0b24gbWF0LXN0cm9rZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJ1cGxvYWRlci5jbGljaygpXCI+e3sgcENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdVcGxvYWQgZmlsZShzKScsICcnLCAnJykgfX08L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8Y29tcG9uZW50LW1hcHBlclxuICAgICAgICBuYW1lPVwiU3VtbWFyeUxpc3RcIlxuICAgICAgICBbcHJvcHNdPVwieyBhckl0ZW1zJDogYXJGaWxlTGlzdCQsIG1lbnVJY29uT3ZlcnJpZGUkOiAndHJhc2gnLCBtZW51SWNvbk92ZXJyaWRlQWN0aW9uJDogcmVtb3ZlRmlsZUZyb21MaXN0JCB9XCJcbiAgICAgID48L2NvbXBvbmVudC1tYXBwZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8Y29tcG9uZW50LW1hcHBlclxuICAgICAgbmFtZT1cIkFjdGlvbkJ1dHRvbnNcIlxuICAgICAgW3Byb3BzXT1cInsgYXJNYWluQnV0dG9ucyQ6IGFyRmlsZU1haW5CdXR0b25zJCwgYXJTZWNvbmRhcnlCdXR0b25zJDogYXJGaWxlU2Vjb25kYXJ5QnV0dG9ucyQgfVwiXG4gICAgICBbcGFyZW50XT1cInRoaXNcIlxuICAgICAgW291dHB1dEV2ZW50c109XCJ7IGFjdGlvbkJ1dHRvbkNsaWNrOiBvbkZpbGVBY3Rpb25CdXR0b25DbGljayB9XCJcbiAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiYlNob3dMaW5rTW9kYWwkXCIgY2xhc3M9XCJwc2RrLWRpYWxvZy1iYWNrZ3JvdW5kXCI+XG4gIDxkaXYgY2xhc3M9XCJwc2RrLW1vZGFsLWxpbmstdG9wXCI+XG4gICAgPGgzPnt7IHBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnQWRkIGxpbmtzJywgJycsICcnKSB9fTwvaDM+XG4gICAgPGRpdiBjbGFzcz1cInBzZGstbW9kYWwtbGluay1lbnRyeVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInBzZGstbW9kYWwtYm9keVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1saW5rcy1yb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1saW5rcy10d28tY29sdW1uXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1saW5rLWRhdGFcIj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwicHNkay1mdWxsLXdpZHRoXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5MaW5rIHRpdGxlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgcmVxdWlyZWQ9XCJ0cnVlXCIgKGNoYW5nZSk9XCJfZmllbGRPbkNoYW5nZUxpbmsoJGV2ZW50KVwiIFt2YWx1ZV09XCJsaW5rX3RpdGxlJFwiIC8+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwc2RrLW1vZGFsLWxpbmstZGF0YVwiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJwc2RrLWZ1bGwtd2lkdGhcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlVSTDwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIHJlcXVpcmVkPVwidHJ1ZVwiIChjaGFuZ2UpPVwiX2ZpZWxkT25DaGFuZ2VVUkwoJGV2ZW50KVwiIFt2YWx1ZV09XCJsaW5rX3VybCRcIiAvPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicHNkay1tb2RhbC1saW5rLWFkZFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiX2FkZExpbmsoKVwiPnt7IHBDb25uJC5nZXRMb2NhbGl6ZWRWYWx1ZSgnQWRkIGxpbmsnLCAnJywgJycpIH19PC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxjb21wb25lbnQtbWFwcGVyXG4gICAgICAgICAgbmFtZT1cIlN1bW1hcnlMaXN0XCJcbiAgICAgICAgICBbcHJvcHNdPVwieyBhckl0ZW1zJDogYXJMaW5rc0xpc3QkLCBtZW51SWNvbk92ZXJyaWRlJDogJ3RyYXNoJywgbWVudUljb25PdmVycmlkZUFjdGlvbiQ6IHJlbW92ZUxpbmtzRnJvbUxpc3QkIH1cIlxuICAgICAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8Y29tcG9uZW50LW1hcHBlclxuICAgICAgbmFtZT1cIkFjdGlvbkJ1dHRvbnNcIlxuICAgICAgW3Byb3BzXT1cInsgYXJNYWluQnV0dG9ucyQ6IGFyTGlua01haW5CdXR0b25zJCwgYXJTZWNvbmRhcnlCdXR0b25zJDogYXJMaW5rU2Vjb25kYXJ5QnV0dG9ucyQgfVwiXG4gICAgICBbcGFyZW50XT1cInRoaXNcIlxuICAgICAgW291dHB1dEV2ZW50c109XCJ7IGFjdGlvbkJ1dHRvbkNsaWNrOiBvbkxpbmtBY3Rpb25CdXR0b25DbGljayB9XCJcbiAgICA+PC9jb21wb25lbnQtbWFwcGVyPlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2ICpuZ0lmPVwiYlNob3dWaWV3QWxsTW9kYWwkXCIgY2xhc3M9XCJwc2RrLWRpYWxvZy1iYWNrZ3JvdW5kXCI+XG4gIDxkaXYgY2xhc3M9XCJwc2RrLW1vZGFsLWZpbGUtdG9wXCI+XG4gICAgPGRpdiBjbGFzcz1cInBzZGstdmlldy1hbGwtaGVhZGVyXCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8aDM+e3sgcENvbm4kLmdldExvY2FsaXplZFZhbHVlKCdBdHRhY2htZW50cycsICcnLCAnJykgfX08L2gzPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2PlxuICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiAoY2xpY2spPVwiX2Nsb3NlVmlld0FsbCgpXCI+XG4gICAgICAgICAgPGltZyBjbGFzcz1cInBzZGstdXRpbGl0eS1jYXJkLWFjdGlvbnMtc3ZnLWljb25cIiBzcmM9XCJ7eyBjbG9zZVN2Z0ljb24kIH19XCIgLz5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwicHNkay12aWV3LWFsbC1ib2R5XCI+XG4gICAgICA8Y29tcG9uZW50LW1hcHBlciBuYW1lPVwiU3VtbWFyeUxpc3RcIiBbcHJvcHNdPVwieyBhckl0ZW1zJDogdmFfYXJJdGVtcyQsIG1lbnVJY29uT3ZlcnJpZGVBY3Rpb24kOiByZW1vdmVMaW5rc0Zyb21MaXN0JCB9XCI+PC9jb21wb25lbnQtbWFwcGVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|