@energycap/components 0.31.5 → 0.32.0
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/energycap-components.min.css +2 -2
- package/energycap-email.min.css +1 -1
- package/esm2020/energycap-components.mjs +5 -0
- package/esm2020/lib/components.module.mjs +386 -0
- package/esm2020/lib/controls/banner/banner.component.mjs +106 -0
- package/esm2020/lib/controls/button/button.component.mjs +106 -0
- package/esm2020/lib/controls/button/copy-button.directive.mjs +65 -0
- package/esm2020/lib/controls/checkbox/checkbox.component.mjs +139 -0
- package/esm2020/lib/controls/collapsible-toggle/collapsible-toggle.component.mjs +38 -0
- package/esm2020/lib/controls/combobox/combobox.component.mjs +841 -0
- package/esm2020/lib/controls/dropdown/dropdown.component.mjs +237 -0
- package/esm2020/lib/controls/file-upload/file-upload.component.mjs +169 -0
- package/esm2020/lib/controls/form-control/form-control.component.mjs +86 -0
- package/esm2020/lib/controls/form-control-base.mjs +143 -0
- package/esm2020/lib/controls/form-control-label/form-control-label.component.mjs +136 -0
- package/esm2020/lib/controls/form-group/form-group.component.mjs +252 -0
- package/esm2020/lib/controls/help-popover/help-popover.component.mjs +28 -0
- package/esm2020/lib/controls/item-picker/item-picker.component.mjs +233 -0
- package/esm2020/lib/controls/link-button/link-button.component.mjs +11 -0
- package/esm2020/lib/controls/menu/menu.component.mjs +443 -0
- package/{esm2015/lib/controls/navigation/link-item.js → esm2020/lib/controls/navigation/link-item.mjs} +0 -0
- package/{esm2015/lib/controls/navigation/nav-group.js → esm2020/lib/controls/navigation/nav-group.mjs} +0 -0
- package/esm2020/lib/controls/navigation/nav-item-active.directive.mjs +92 -0
- package/{esm2015/lib/controls/navigation/nav-item.js → esm2020/lib/controls/navigation/nav-item.mjs} +0 -0
- package/esm2020/lib/controls/numericbox/numericbox.component.mjs +371 -0
- package/esm2020/lib/controls/popover/popover.component.mjs +84 -0
- package/{esm2015/lib/controls/radio-button/radio-button-option.js → esm2020/lib/controls/radio-button/radio-button-option.mjs} +0 -0
- package/esm2020/lib/controls/radio-button/radio-button.component.mjs +81 -0
- package/esm2020/lib/controls/select/select.component.mjs +87 -0
- package/esm2020/lib/controls/tabs/tabs.component.mjs +47 -0
- package/esm2020/lib/controls/textbox/textbox.component.mjs +154 -0
- package/{esm2015/lib/core/cache.service.js → esm2020/lib/core/cache.service.mjs} +9 -8
- package/{esm2015/lib/core/custom-validators.js → esm2020/lib/core/custom-validators.mjs} +0 -0
- package/{esm2015/lib/core/date-time-helper.js → esm2020/lib/core/date-time-helper.mjs} +0 -0
- package/esm2020/lib/core/error.service.mjs +57 -0
- package/esm2020/lib/core/scroll.service.mjs +89 -0
- package/esm2020/lib/core/telemetry-tracker.service.mjs +16 -0
- package/esm2020/lib/core/telemetry.service.mjs +38 -0
- package/esm2020/lib/core/validation-message.service.mjs +181 -0
- package/{esm2015/lib/core/validation-patterns.js → esm2020/lib/core/validation-patterns.mjs} +0 -0
- package/esm2020/lib/core/window.service.mjs +182 -0
- package/esm2020/lib/display/app-bar/app-bar.component.mjs +46 -0
- package/esm2020/lib/display/avatar/avatar.component.mjs +67 -0
- package/{esm2015/lib/display/avatar/avatar.service.js → esm2020/lib/display/avatar/avatar.service.mjs} +9 -7
- package/esm2020/lib/display/confirm/confirm.component.mjs +131 -0
- package/{esm2015/lib/display/dialog/dialog-content.js → esm2020/lib/display/dialog/dialog-content.mjs} +0 -0
- package/esm2020/lib/display/dialog/dialog-group/dialog-group.component.mjs +63 -0
- package/{esm2015/lib/display/dialog/dialog-types.js → esm2020/lib/display/dialog/dialog-types.mjs} +0 -0
- package/esm2020/lib/display/dialog/dialog.component.mjs +242 -0
- package/esm2020/lib/display/dialog/dialog.service.mjs +71 -0
- package/{esm2015/lib/display/help/help-types.js → esm2020/lib/display/help/help-types.mjs} +0 -0
- package/esm2020/lib/display/hierarchy/hierarchy-base.mjs +106 -0
- package/{esm2015/lib/display/hierarchy/hierarchy-mocks.spec.js → esm2020/lib/display/hierarchy/hierarchy-mocks.spec.mjs} +5 -9
- package/esm2020/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.mjs +59 -0
- package/esm2020/lib/display/item-display/item-display.component.mjs +67 -0
- package/esm2020/lib/display/json-display/json-display.component.mjs +47 -0
- package/esm2020/lib/display/resizable/resizable-base.mjs +120 -0
- package/esm2020/lib/display/resizable/resizable.component.mjs +57 -0
- package/esm2020/lib/display/spinner/spinner.component.mjs +12 -0
- package/esm2020/lib/display/splash/splash.component.mjs +42 -0
- package/esm2020/lib/display/splash/splash.service.mjs +35 -0
- package/esm2020/lib/display/table/resizable-column.component.mjs +20 -0
- package/esm2020/lib/display/table/resizable-table.directive.mjs +227 -0
- package/esm2020/lib/display/table/searchable-table.component.mjs +338 -0
- package/esm2020/lib/display/table/table-detail-row.component.mjs +27 -0
- package/esm2020/lib/display/table/table-locked-column.component.mjs +58 -0
- package/esm2020/lib/display/table/table-master-header-row.component.mjs +11 -0
- package/esm2020/lib/display/table/table-master-row.component.mjs +150 -0
- package/esm2020/lib/display/table/table-pagination.component.mjs +150 -0
- package/esm2020/lib/display/table/table-selectable-row.component.mjs +235 -0
- package/esm2020/lib/display/table/table.component.mjs +244 -0
- package/esm2020/lib/display/tags/tag.mjs +15 -0
- package/esm2020/lib/display/tags/tags.component.mjs +77 -0
- package/esm2020/lib/display/toast/toast/toast.component.mjs +77 -0
- package/{esm2015/lib/display/toast/toast-types.js → esm2020/lib/display/toast/toast-types.mjs} +0 -0
- package/esm2020/lib/display/toast/toast.service.mjs +35 -0
- package/esm2020/lib/display/toast/toaster/toaster.component.mjs +114 -0
- package/esm2020/lib/display/tooltip/tooltip.component.mjs +25 -0
- package/esm2020/lib/display/tooltip/tooltip.service.mjs +63 -0
- package/esm2020/lib/display/tree/tree.component.mjs +125 -0
- package/esm2020/lib/display/view-overlay/view-overlay.component.mjs +58 -0
- package/esm2020/lib/shared/directives/click-area-for/click-area-for.directive.mjs +32 -0
- package/esm2020/lib/shared/directives/if-viewport-width/if-viewport-width.directive.mjs +111 -0
- package/esm2020/lib/shared/directives/popup/popup-container.directive.mjs +163 -0
- package/esm2020/lib/shared/display/pipes/date-display.pipe.mjs +50 -0
- package/esm2020/lib/shared/display/pipes/highlight-text.pipe.mjs +30 -0
- package/esm2020/lib/shared/display/pipes/relative-date.pipe.mjs +48 -0
- package/esm2020/lib/shared/display/pipes/row-count.pipe.mjs +48 -0
- package/esm2020/lib/shared/display/pipes/time-display.pipe.mjs +41 -0
- package/{esm2015/lib/shared/display.js → esm2020/lib/shared/display.mjs} +0 -0
- package/esm2020/lib/shared/form-group.helper.mjs +67 -0
- package/{esm2015/lib/shared/json-helper.js → esm2020/lib/shared/json-helper.mjs} +0 -0
- package/{esm2015/lib/shared/lodash-helper.js → esm2020/lib/shared/lodash-helper.mjs} +0 -0
- package/esm2020/lib/shared/page/page-base/page-base.component.mjs +339 -0
- package/{esm2015/lib/shared/page/page-statuses.js → esm2020/lib/shared/page/page-statuses.mjs} +0 -0
- package/esm2020/lib/shared/page/page-title/page-title.component.mjs +23 -0
- package/esm2020/lib/shared/page/page-view/page-view.component.mjs +121 -0
- package/{esm2015/lib/shared/testing/hierarchy-base-test-injector-factory.spec.js → esm2020/lib/shared/testing/hierarchy-base-test-injector-factory.spec.mjs} +0 -0
- package/esm2020/lib/shared/testing/page-base-component-test-helper.spec.mjs +30 -0
- package/{esm2015/lib/shared/testing/page-base-component-test-injector-factory.spec.js → esm2020/lib/shared/testing/page-base-component-test-injector-factory.spec.mjs} +0 -0
- package/esm2020/lib/shared/testing/public-mocks.spec.mjs +132 -0
- package/{esm2015/lib/shared/testing/spy-factory.spec.js → esm2020/lib/shared/testing/spy-factory.spec.mjs} +0 -0
- package/{esm2015/lib/shared/testing/translation-mocks.spec.js → esm2020/lib/shared/testing/translation-mocks.spec.mjs} +0 -0
- package/esm2020/lib/shared/user-preference.service.mjs +17 -0
- package/esm2020/lib/shared/wizard/wizard-base/wizard-base.component.mjs +246 -0
- package/esm2020/lib/shared/wizard/wizard-buttons/wizard-buttons.component.mjs +68 -0
- package/esm2020/lib/shared/wizard/wizard-progress/wizard-progress.component.mjs +18 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/energycap-components.mjs +10090 -0
- package/fesm2015/energycap-components.mjs.map +1 -0
- package/fesm2020/energycap-components.mjs +9999 -0
- package/fesm2020/energycap-components.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components.module.d.ts +72 -0
- package/lib/controls/banner/banner.component.d.ts +3 -0
- package/lib/controls/button/button.component.d.ts +3 -0
- package/lib/controls/button/copy-button.directive.d.ts +3 -0
- package/lib/controls/checkbox/checkbox.component.d.ts +3 -0
- package/lib/controls/collapsible-toggle/collapsible-toggle.component.d.ts +3 -0
- package/lib/controls/combobox/combobox.component.d.ts +5 -2
- package/lib/controls/dropdown/dropdown.component.d.ts +3 -0
- package/lib/controls/file-upload/file-upload.component.d.ts +5 -2
- package/lib/controls/form-control/form-control.component.d.ts +3 -0
- package/lib/controls/form-control-base.d.ts +3 -0
- package/lib/controls/form-control-label/form-control-label.component.d.ts +3 -0
- package/lib/controls/form-group/form-group.component.d.ts +6 -3
- package/lib/controls/help-popover/help-popover.component.d.ts +3 -0
- package/lib/controls/item-picker/item-picker.component.d.ts +5 -2
- package/lib/controls/link-button/link-button.component.d.ts +3 -0
- package/lib/controls/menu/menu.component.d.ts +3 -0
- package/lib/controls/navigation/nav-item-active.directive.d.ts +3 -0
- package/lib/controls/numericbox/numericbox.component.d.ts +5 -2
- package/lib/controls/popover/popover.component.d.ts +3 -0
- package/lib/controls/radio-button/radio-button.component.d.ts +3 -0
- package/lib/controls/select/select.component.d.ts +3 -0
- package/lib/controls/tabs/tabs.component.d.ts +3 -0
- package/lib/controls/textbox/textbox.component.d.ts +3 -0
- package/lib/core/cache.service.d.ts +3 -0
- package/lib/core/error.service.d.ts +3 -0
- package/lib/core/scroll.service.d.ts +3 -0
- package/lib/core/telemetry-tracker.service.d.ts +3 -0
- package/lib/core/telemetry.service.d.ts +3 -0
- package/lib/core/validation-message.service.d.ts +3 -0
- package/lib/core/window.service.d.ts +3 -0
- package/lib/display/app-bar/app-bar.component.d.ts +3 -0
- package/lib/display/avatar/avatar.component.d.ts +3 -0
- package/lib/display/avatar/avatar.service.d.ts +3 -0
- package/lib/display/confirm/confirm.component.d.ts +5 -2
- package/lib/display/dialog/dialog-group/dialog-group.component.d.ts +3 -0
- package/lib/display/dialog/dialog.component.d.ts +3 -0
- package/lib/display/dialog/dialog.service.d.ts +3 -0
- package/lib/display/hierarchy/hierarchy-base.d.ts +3 -0
- package/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.d.ts +3 -0
- package/lib/display/item-display/item-display.component.d.ts +3 -0
- package/lib/display/json-display/json-display.component.d.ts +5 -2
- package/lib/display/resizable/resizable-base.d.ts +3 -0
- package/lib/display/resizable/resizable.component.d.ts +3 -0
- package/lib/display/spinner/spinner.component.d.ts +3 -0
- package/lib/display/splash/splash.component.d.ts +3 -0
- package/lib/display/splash/splash.service.d.ts +3 -0
- package/lib/display/table/resizable-column.component.d.ts +3 -0
- package/lib/display/table/resizable-table.directive.d.ts +3 -0
- package/lib/display/table/searchable-table.component.d.ts +6 -3
- package/lib/display/table/table-detail-row.component.d.ts +3 -0
- package/lib/display/table/table-locked-column.component.d.ts +3 -0
- package/lib/display/table/table-master-header-row.component.d.ts +3 -0
- package/lib/display/table/table-master-row.component.d.ts +3 -0
- package/lib/display/table/table-pagination.component.d.ts +3 -0
- package/lib/display/table/table-selectable-row.component.d.ts +5 -2
- package/lib/display/table/table.component.d.ts +3 -0
- package/lib/display/tags/tags.component.d.ts +3 -0
- package/lib/display/toast/toast/toast.component.d.ts +3 -0
- package/lib/display/toast/toast.service.d.ts +3 -0
- package/lib/display/toast/toaster/toaster.component.d.ts +3 -0
- package/lib/display/tooltip/tooltip.component.d.ts +3 -0
- package/lib/display/tooltip/tooltip.service.d.ts +3 -0
- package/lib/display/tree/tree.component.d.ts +3 -0
- package/lib/display/view-overlay/view-overlay.component.d.ts +3 -0
- package/lib/shared/directives/click-area-for/click-area-for.directive.d.ts +3 -0
- package/lib/shared/directives/if-viewport-width/if-viewport-width.directive.d.ts +3 -0
- package/lib/shared/directives/popup/popup-container.directive.d.ts +3 -0
- package/lib/shared/display/pipes/date-display.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/highlight-text.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/relative-date.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/row-count.pipe.d.ts +3 -0
- package/lib/shared/display/pipes/time-display.pipe.d.ts +3 -0
- package/lib/shared/form-group.helper.d.ts +5 -2
- package/lib/shared/page/page-base/page-base.component.d.ts +5 -2
- package/lib/shared/page/page-title/page-title.component.d.ts +3 -0
- package/lib/shared/page/page-view/page-view.component.d.ts +3 -0
- package/lib/shared/testing/public-mocks.spec.d.ts +7 -0
- package/lib/shared/user-preference.service.d.ts +3 -0
- package/lib/shared/wizard/wizard-base/wizard-base.component.d.ts +3 -0
- package/lib/shared/wizard/wizard-buttons/wizard-buttons.component.d.ts +3 -0
- package/lib/shared/wizard/wizard-progress/wizard-progress.component.d.ts +3 -0
- package/package.json +27 -15
- package/src/styles/_functions.scss +6 -4
- package/src/styles/_icons.scss +1 -1
- package/src/styles/mixins/_control-base.scss +2 -2
- package/src/styles/mixins/_form-control-base.scss +3 -1
- package/src/styles/mixins/_spinner-base.scss +3 -1
- package/bundles/energycap-components.umd.js +0 -10646
- package/bundles/energycap-components.umd.js.map +0 -1
- package/bundles/energycap-components.umd.min.js +0 -17
- package/bundles/energycap-components.umd.min.js.map +0 -1
- package/energycap-components.d.ts +0 -7
- package/energycap-components.metadata.json +0 -1
- package/esm2015/energycap-components.js +0 -8
- package/esm2015/lib/components.module.js +0 -238
- package/esm2015/lib/controls/banner/banner.component.js +0 -94
- package/esm2015/lib/controls/button/button.component.js +0 -89
- package/esm2015/lib/controls/button/copy-button.directive.js +0 -63
- package/esm2015/lib/controls/checkbox/checkbox.component.js +0 -137
- package/esm2015/lib/controls/collapsible-toggle/collapsible-toggle.component.js +0 -35
- package/esm2015/lib/controls/combobox/combobox.component.js +0 -819
- package/esm2015/lib/controls/dropdown/dropdown.component.js +0 -207
- package/esm2015/lib/controls/file-upload/file-upload.component.js +0 -172
- package/esm2015/lib/controls/form-control/form-control.component.js +0 -65
- package/esm2015/lib/controls/form-control-base.js +0 -140
- package/esm2015/lib/controls/form-control-label/form-control-label.component.js +0 -139
- package/esm2015/lib/controls/form-group/form-group.component.js +0 -254
- package/esm2015/lib/controls/help-popover/help-popover.component.js +0 -22
- package/esm2015/lib/controls/item-picker/item-picker.component.js +0 -216
- package/esm2015/lib/controls/link-button/link-button.component.js +0 -12
- package/esm2015/lib/controls/menu/menu.component.js +0 -424
- package/esm2015/lib/controls/navigation/nav-item-active.directive.js +0 -86
- package/esm2015/lib/controls/numericbox/numericbox.component.js +0 -362
- package/esm2015/lib/controls/popover/popover.component.js +0 -85
- package/esm2015/lib/controls/radio-button/radio-button.component.js +0 -78
- package/esm2015/lib/controls/select/select.component.js +0 -89
- package/esm2015/lib/controls/tabs/tabs.component.js +0 -42
- package/esm2015/lib/controls/textbox/textbox.component.js +0 -149
- package/esm2015/lib/core/error.service.js +0 -56
- package/esm2015/lib/core/scroll.service.js +0 -88
- package/esm2015/lib/core/telemetry-tracker.service.js +0 -14
- package/esm2015/lib/core/telemetry.service.js +0 -40
- package/esm2015/lib/core/validation-message.service.js +0 -185
- package/esm2015/lib/core/window.service.js +0 -191
- package/esm2015/lib/display/app-bar/app-bar.component.js +0 -42
- package/esm2015/lib/display/avatar/avatar.component.js +0 -73
- package/esm2015/lib/display/confirm/confirm.component.js +0 -127
- package/esm2015/lib/display/dialog/dialog-group/dialog-group.component.js +0 -65
- package/esm2015/lib/display/dialog/dialog.component.js +0 -229
- package/esm2015/lib/display/dialog/dialog.service.js +0 -69
- package/esm2015/lib/display/hierarchy/hierarchy-base.js +0 -106
- package/esm2015/lib/display/hierarchy/hierarchy-tree/hierarchy-tree.component.js +0 -58
- package/esm2015/lib/display/item-display/item-display.component.js +0 -57
- package/esm2015/lib/display/json-display/json-display.component.js +0 -44
- package/esm2015/lib/display/resizable/resizable-base.js +0 -119
- package/esm2015/lib/display/resizable/resizable.component.js +0 -57
- package/esm2015/lib/display/spinner/spinner.component.js +0 -12
- package/esm2015/lib/display/splash/splash.component.js +0 -45
- package/esm2015/lib/display/splash/splash.service.js +0 -34
- package/esm2015/lib/display/table/resizable-column.component.js +0 -23
- package/esm2015/lib/display/table/resizable-table.directive.js +0 -223
- package/esm2015/lib/display/table/searchable-table.component.js +0 -303
- package/esm2015/lib/display/table/table-detail-row.component.js +0 -21
- package/esm2015/lib/display/table/table-locked-column.component.js +0 -53
- package/esm2015/lib/display/table/table-master-header-row.component.js +0 -11
- package/esm2015/lib/display/table/table-master-row.component.js +0 -141
- package/esm2015/lib/display/table/table-pagination.component.js +0 -146
- package/esm2015/lib/display/table/table-selectable-row.component.js +0 -216
- package/esm2015/lib/display/table/table.component.js +0 -210
- package/esm2015/lib/display/tags/tag.js +0 -15
- package/esm2015/lib/display/tags/tags.component.js +0 -73
- package/esm2015/lib/display/toast/toast/toast.component.js +0 -70
- package/esm2015/lib/display/toast/toast.service.js +0 -34
- package/esm2015/lib/display/toast/toaster/toaster.component.js +0 -117
- package/esm2015/lib/display/tooltip/tooltip.component.js +0 -24
- package/esm2015/lib/display/tooltip/tooltip.service.js +0 -64
- package/esm2015/lib/display/tree/tree.component.js +0 -100
- package/esm2015/lib/display/view-overlay/view-overlay.component.js +0 -50
- package/esm2015/lib/shared/directives/click-area-for/click-area-for.directive.js +0 -25
- package/esm2015/lib/shared/directives/if-viewport-width/if-viewport-width.directive.js +0 -112
- package/esm2015/lib/shared/directives/popup/popup-container.directive.js +0 -160
- package/esm2015/lib/shared/display/pipes/date-display.pipe.js +0 -49
- package/esm2015/lib/shared/display/pipes/highlight-text.pipe.js +0 -26
- package/esm2015/lib/shared/display/pipes/relative-date.pipe.js +0 -49
- package/esm2015/lib/shared/display/pipes/row-count.pipe.js +0 -47
- package/esm2015/lib/shared/display/pipes/time-display.pipe.js +0 -40
- package/esm2015/lib/shared/form-group.helper.js +0 -65
- package/esm2015/lib/shared/page/page-base/page-base.component.js +0 -356
- package/esm2015/lib/shared/page/page-title/page-title.component.js +0 -19
- package/esm2015/lib/shared/page/page-view/page-view.component.js +0 -94
- package/esm2015/lib/shared/testing/page-base-component-test-helper.spec.js +0 -35
- package/esm2015/lib/shared/testing/public-mocks.spec.js +0 -126
- package/esm2015/lib/shared/user-preference.service.js +0 -15
- package/esm2015/lib/shared/wizard/wizard-base/wizard-base.component.js +0 -260
- package/esm2015/lib/shared/wizard/wizard-buttons/wizard-buttons.component.js +0 -54
- package/esm2015/lib/shared/wizard/wizard-progress/wizard-progress.component.js +0 -18
- package/fesm2015/energycap-components.js +0 -9638
- package/fesm2015/energycap-components.js.map +0 -1
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { Directive, HostBinding } from '@angular/core';
|
|
2
|
+
import { UntypedFormGroup } from '@angular/forms';
|
|
3
|
+
import { ActivatedRoute, NavigationEnd, Router } from '@angular/router';
|
|
4
|
+
import { TranslateService } from '@ngx-translate/core';
|
|
5
|
+
import { ReplaySubject, Subject } from 'rxjs';
|
|
6
|
+
import { filter, takeUntil } from 'rxjs/operators';
|
|
7
|
+
import { ErrorService } from '../../../core/error.service';
|
|
8
|
+
import { ScrollService } from '../../../core/scroll.service';
|
|
9
|
+
import { DialogService } from '../../../display/dialog/dialog.service';
|
|
10
|
+
import { SplashService } from '../../../display/splash/splash.service';
|
|
11
|
+
import { Overlay } from '../../../display/view-overlay/view-overlay.component';
|
|
12
|
+
import { PageStatus, PageStatuses } from '../page-statuses';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
export class PageInitResult {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.title = '';
|
|
17
|
+
this.subTitle = '';
|
|
18
|
+
this.subTitleUrl = '';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export class PageBaseComponent {
|
|
22
|
+
constructor(injector) {
|
|
23
|
+
/** Default css classes applied to host element */
|
|
24
|
+
this.classList = 'd-flex flex-grow';
|
|
25
|
+
/**
|
|
26
|
+
* Title for the page displayed in the header
|
|
27
|
+
*/
|
|
28
|
+
this.title = '';
|
|
29
|
+
/**
|
|
30
|
+
* Sub title for the page displayed in the header
|
|
31
|
+
*/
|
|
32
|
+
this.subTitle = '';
|
|
33
|
+
/**
|
|
34
|
+
* Sub title url for the page displayed in the header
|
|
35
|
+
*/
|
|
36
|
+
this.subTitleUrl = '';
|
|
37
|
+
/**
|
|
38
|
+
* Status overlay for the page
|
|
39
|
+
*/
|
|
40
|
+
this.status = new Overlay('pending', 'Loading');
|
|
41
|
+
/**
|
|
42
|
+
* Form group to be used if needed by the page
|
|
43
|
+
*/
|
|
44
|
+
this.formGroup = new UntypedFormGroup({});
|
|
45
|
+
/**
|
|
46
|
+
* Default invalid form message, override if a more specific message is needed
|
|
47
|
+
*/
|
|
48
|
+
this.defaultInvalidFormMessage = 'PleaseCorrectForm_SC';
|
|
49
|
+
/**
|
|
50
|
+
* Default unknown save error message, override if a more specific message is needed
|
|
51
|
+
*/
|
|
52
|
+
this.defaultUnknownSaveError = 'PageBaseUnknownSaveError_SC';
|
|
53
|
+
/**
|
|
54
|
+
* Used to opt out of hiding the splash screen when the page is loaded
|
|
55
|
+
*/
|
|
56
|
+
this.skipHideSplashOnComplete = false;
|
|
57
|
+
/**
|
|
58
|
+
* Used to unsubscribe from observables
|
|
59
|
+
*/
|
|
60
|
+
this.destroyed = new Subject();
|
|
61
|
+
/**
|
|
62
|
+
* Used to know when the page has been loaded, this will be completed
|
|
63
|
+
* after onAfterViewInit
|
|
64
|
+
*/
|
|
65
|
+
this._afterViewInitComplete = new ReplaySubject();
|
|
66
|
+
this.afterViewInitComplete = this._afterViewInitComplete;
|
|
67
|
+
/**
|
|
68
|
+
* Errors to be shown for the component.
|
|
69
|
+
* Automatically populated on promise rejection from save and shared with the UI.
|
|
70
|
+
*/
|
|
71
|
+
this._errors = '';
|
|
72
|
+
this.errorService = injector.get(ErrorService);
|
|
73
|
+
this.translateService = injector.get(TranslateService);
|
|
74
|
+
this.scrollService = injector.get(ScrollService);
|
|
75
|
+
this.router = injector.get(Router);
|
|
76
|
+
this.activatedRoute = injector.get(ActivatedRoute);
|
|
77
|
+
this.dialogService = injector.get(DialogService);
|
|
78
|
+
this.splashService = injector.get(SplashService);
|
|
79
|
+
}
|
|
80
|
+
get errors() {
|
|
81
|
+
return this._errors;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Optional lifecycle hook that is called as part of the Angular ngOnInit lifecycle hook.
|
|
85
|
+
* Called before onInit is called for the first time. Add setup logic here that does
|
|
86
|
+
* not need to be run on every reload.
|
|
87
|
+
*/
|
|
88
|
+
onFirstInit() { }
|
|
89
|
+
async ngOnInit() {
|
|
90
|
+
try {
|
|
91
|
+
this.showStatus(PageStatus.Loading);
|
|
92
|
+
this.onFirstInit();
|
|
93
|
+
this.initPromise = this.onInit();
|
|
94
|
+
await this.initPromise;
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
this.splashService.hideSplash();
|
|
98
|
+
this.onError(error);
|
|
99
|
+
}
|
|
100
|
+
;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* This method is called just after the Angular Lifecycle event ngOnAfterViewInit.
|
|
104
|
+
* It fires after all sub-components have gone through their initialization phase.
|
|
105
|
+
* It is in this phase that the view components should already exist, so a derived class should
|
|
106
|
+
* load data from the API to populate any view components. The promise that
|
|
107
|
+
* is returned must not resolve until all required data has completely loaded
|
|
108
|
+
*/
|
|
109
|
+
async onAfterViewInit() { }
|
|
110
|
+
;
|
|
111
|
+
async ngAfterViewInit() {
|
|
112
|
+
try {
|
|
113
|
+
const initResult = await this.initPromise;
|
|
114
|
+
this.parseInitResult(initResult);
|
|
115
|
+
await this.onAfterViewInit();
|
|
116
|
+
this._afterViewInitComplete.next();
|
|
117
|
+
this._afterViewInitComplete.complete();
|
|
118
|
+
await this.onFormLoadComplete();
|
|
119
|
+
if (this.status.status === 'pending') {
|
|
120
|
+
this.showStatus(PageStatus.Loaded);
|
|
121
|
+
}
|
|
122
|
+
if (!this.skipHideSplashOnComplete) {
|
|
123
|
+
this.splashService.hideSplash();
|
|
124
|
+
}
|
|
125
|
+
this.setUpRouterSubscriptions();
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
this.splashService.hideSplash();
|
|
129
|
+
this.onError(error);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* A lifecycle method that executes once all data has been loaded
|
|
134
|
+
* through ngAfterViewInit and from local storage if required.
|
|
135
|
+
* It is at this point that you can subscribe to changes on the form
|
|
136
|
+
* reliably
|
|
137
|
+
*
|
|
138
|
+
* @protected
|
|
139
|
+
* @memberof PageBaseComponent
|
|
140
|
+
*/
|
|
141
|
+
async onFormLoadComplete() { }
|
|
142
|
+
/**
|
|
143
|
+
* A lifecycle hook that is called after every NavigationEnd event.
|
|
144
|
+
*/
|
|
145
|
+
onNavigationEnd() { }
|
|
146
|
+
/**
|
|
147
|
+
* Reload the component kicking off the ngOnInit and ngAfterViewInit lifecycle hooks.
|
|
148
|
+
* Any state that needs to be reset should be done so before calling this method.
|
|
149
|
+
*/
|
|
150
|
+
reload() {
|
|
151
|
+
this._afterViewInitComplete = new ReplaySubject();
|
|
152
|
+
this.showStatus(PageStatus.Loading);
|
|
153
|
+
this.initPromise = this.onInit();
|
|
154
|
+
this.ngAfterViewInit();
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* When overridden in a derived class this method will sync the form state
|
|
158
|
+
* into the object that will be persisted to the API. The value should not
|
|
159
|
+
* actually be sent to the API yet.
|
|
160
|
+
*/
|
|
161
|
+
async applyModelUpdates() { }
|
|
162
|
+
;
|
|
163
|
+
/**
|
|
164
|
+
* Save the model state to the API and return a promise that
|
|
165
|
+
* contains the updated entityID. The promise should be rejected
|
|
166
|
+
* if the save fails and errors and the overlay status will be updated
|
|
167
|
+
* accordingly
|
|
168
|
+
*/
|
|
169
|
+
async saveToApi() { }
|
|
170
|
+
;
|
|
171
|
+
/**
|
|
172
|
+
* Called after the save has completed successfully.
|
|
173
|
+
* It is the responsibility of the derived class to navigate
|
|
174
|
+
* to a properties/status page or emit appropriately if within a dialog
|
|
175
|
+
* @param entityId
|
|
176
|
+
*/
|
|
177
|
+
onSaveComplete(entityId) { }
|
|
178
|
+
;
|
|
179
|
+
/**
|
|
180
|
+
* Function called when the user clicks save. We will first touch all controls to show validation messages
|
|
181
|
+
* if the form is invalid. If the form is valid we will attempt to save and any errors will be reported
|
|
182
|
+
* back to the user
|
|
183
|
+
* @param event
|
|
184
|
+
*/
|
|
185
|
+
async onSave(event) {
|
|
186
|
+
this.formGroup.markAllAsTouched();
|
|
187
|
+
if (this.formGroup.valid) {
|
|
188
|
+
this.showStatus(PageStatus.Saving);
|
|
189
|
+
try {
|
|
190
|
+
await this.applyModelUpdates();
|
|
191
|
+
let entityId = await this.saveToApi() || -1;
|
|
192
|
+
this._errors = '';
|
|
193
|
+
this.onSaveComplete(entityId);
|
|
194
|
+
}
|
|
195
|
+
catch (error) {
|
|
196
|
+
//clear the "saving" overlay and show the message at the top of the view through the errors property
|
|
197
|
+
this.showErrorBanner(error, this.defaultUnknownSaveError);
|
|
198
|
+
this.splashService.hideSplash();
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
else {
|
|
202
|
+
// Only show the banner with the generic message if the parent component hasn't already set one
|
|
203
|
+
// by implementing onSave for additional validation
|
|
204
|
+
if (this.errors === '') {
|
|
205
|
+
this.showErrorBanner(this.defaultInvalidFormMessage);
|
|
206
|
+
}
|
|
207
|
+
if (this.scrollContainerSelector) {
|
|
208
|
+
setTimeout(() => {
|
|
209
|
+
this.scrollService.scrollToItem(this.scrollContainerSelector, ".ng-invalid");
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Function called when the component is destroyed
|
|
216
|
+
*/
|
|
217
|
+
ngOnDestroy() {
|
|
218
|
+
this.destroyed.next();
|
|
219
|
+
this.destroyed.unsubscribe();
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Function that will log an error that is passed in to the console
|
|
223
|
+
* @param e
|
|
224
|
+
*/
|
|
225
|
+
onError(error) {
|
|
226
|
+
this.errorService.logConsoleError(error);
|
|
227
|
+
this.showErrorOverlay(error);
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Show an error message in a whole-page overlay. This will prevent any more
|
|
231
|
+
* interactions with the page. It can take a string error message or a raw API
|
|
232
|
+
* error that needs to be parsed. If the API error isn't something we can handle
|
|
233
|
+
* a generic message is shown instead
|
|
234
|
+
* @param {(Error | string)} error
|
|
235
|
+
*/
|
|
236
|
+
showErrorOverlay(error) {
|
|
237
|
+
this.getErrorMessage(error).subscribe((translatedMessage) => {
|
|
238
|
+
this.status.setStatus('error', translatedMessage);
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Show an error in the banner at the top of the screen. This will not produce a
|
|
243
|
+
* whole-page overlay like the function showError will. It can take a string error message
|
|
244
|
+
* or raw API error that needs to be parsed. If the API error isn't something we can handle,
|
|
245
|
+
* a generic message (customizable via unknownErrorDefault) is shown instead.
|
|
246
|
+
* @param error
|
|
247
|
+
* @param unknownErrorDefault
|
|
248
|
+
*/
|
|
249
|
+
showErrorBanner(error, unknownErrorDefault) {
|
|
250
|
+
this.getErrorMessage(error, unknownErrorDefault).subscribe((translatedMessage) => {
|
|
251
|
+
this._errors = translatedMessage;
|
|
252
|
+
this.showStatus(PageStatus.Loaded);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Parses and translates an API error or error string.
|
|
257
|
+
* @param e
|
|
258
|
+
* @param unknownErrorDefault
|
|
259
|
+
*/
|
|
260
|
+
getErrorMessage(e, unknownErrorDefault) {
|
|
261
|
+
let extractedMessage = this.errorService.parseApiError(e, unknownErrorDefault);
|
|
262
|
+
return this.translateService.get(extractedMessage);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Clear the errors to hide the errors banner.
|
|
266
|
+
*/
|
|
267
|
+
hideErrorBanner() {
|
|
268
|
+
this._errors = '';
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Change the display status to overlay the whole page while loading or saving
|
|
272
|
+
* and clear it when the form is ready
|
|
273
|
+
* @protected
|
|
274
|
+
* @param {PageStatus} status
|
|
275
|
+
* @memberof FormBaseComponent
|
|
276
|
+
*/
|
|
277
|
+
showStatus(status) {
|
|
278
|
+
let knownStatus = PageStatuses[status];
|
|
279
|
+
if (knownStatus) {
|
|
280
|
+
this.status.setStatus(knownStatus.status, knownStatus.message, undefined, knownStatus.noDataTemplate, knownStatus.overlayClassList);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Allows the component to enter a pending status and execute a function that on completion will return the status
|
|
285
|
+
* to hasData. If an error occurs within the callback an error banner can be shown.
|
|
286
|
+
* @param callback
|
|
287
|
+
* @returns
|
|
288
|
+
*/
|
|
289
|
+
async runBlockingAction(callback, pendingMessage) {
|
|
290
|
+
this.hideErrorBanner();
|
|
291
|
+
this.status.setStatus('pending', pendingMessage);
|
|
292
|
+
return callback().catch(error => {
|
|
293
|
+
this.showErrorBanner(error);
|
|
294
|
+
// Throw the error for any downstream components that may be listening and need to react
|
|
295
|
+
// to any errors happening within this callback
|
|
296
|
+
throw (error);
|
|
297
|
+
}).finally(() => {
|
|
298
|
+
this.showStatus(PageStatus.Loaded);
|
|
299
|
+
});
|
|
300
|
+
}
|
|
301
|
+
;
|
|
302
|
+
/**
|
|
303
|
+
* Parses the page init result and sets the necessary properties on the page
|
|
304
|
+
* @param result
|
|
305
|
+
*/
|
|
306
|
+
parseInitResult(result) {
|
|
307
|
+
this.initResult = result;
|
|
308
|
+
this.title = result.title;
|
|
309
|
+
this.subTitle = result.subTitle;
|
|
310
|
+
this.subTitleUrl = result.subTitleUrl;
|
|
311
|
+
this.breadcrumbs = result.breadcrumbs;
|
|
312
|
+
this.help = result.help;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Sets up the router event subscriptions
|
|
316
|
+
*/
|
|
317
|
+
setUpRouterSubscriptions() {
|
|
318
|
+
if (!this.navigationEndSubscription && !this.destroyed.closed) {
|
|
319
|
+
// React to navigation events
|
|
320
|
+
this.navigationEndSubscription = this.router.events.pipe(takeUntil(this.destroyed), filter(e => e instanceof NavigationEnd)).subscribe(e => {
|
|
321
|
+
try {
|
|
322
|
+
this.onNavigationEnd();
|
|
323
|
+
}
|
|
324
|
+
catch (error) {
|
|
325
|
+
this.onError(error);
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
PageBaseComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: PageBaseComponent, deps: [{ token: i0.Injector }], target: i0.ɵɵFactoryTarget.Directive });
|
|
332
|
+
PageBaseComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.0", type: PageBaseComponent, host: { properties: { "class": "this.classList" } }, ngImport: i0 });
|
|
333
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: PageBaseComponent, decorators: [{
|
|
334
|
+
type: Directive
|
|
335
|
+
}], ctorParameters: function () { return [{ type: i0.Injector }]; }, propDecorators: { classList: [{
|
|
336
|
+
type: HostBinding,
|
|
337
|
+
args: ['class']
|
|
338
|
+
}] } });
|
|
339
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1iYXNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zaGFyZWQvcGFnZS9wYWdlLWJhc2UvcGFnZS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBRSxXQUFXLEVBQStCLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBYyxhQUFhLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN4RSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUV2RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDL0UsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7QUFFNUQsTUFBTSxPQUFPLGNBQWM7SUFBM0I7UUFDRSxVQUFLLEdBQVksRUFBRSxDQUFDO1FBQ3BCLGFBQVEsR0FBWSxFQUFFLENBQUM7UUFDdkIsZ0JBQVcsR0FBWSxFQUFFLENBQUM7SUFJNUIsQ0FBQztDQUFBO0FBR0QsTUFB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QUMsSUFBSSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNLLHdCQUF3QjtRQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLHlCQUF5QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDN0QsNkJBQTZCO1lBQzdCLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQ3RELFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQ3pCLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsWUFBWSxhQUFhLENBQUMsQ0FDeEMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSTtvQkFDRixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7aUJBQ3hCO2dCQUFDLE9BQU8sS0FBSyxFQUFFO29CQUNkLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3JCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUM7OzhHQXhZbUIsaUJBQWlCO2tHQUFqQixpQkFBaUI7MkZBQWpCLGlCQUFpQjtrQkFEdEMsU0FBUzsrRkFHd0IsU0FBUztzQkFBeEMsV0FBVzt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgRGlyZWN0aXZlLCBIb3N0QmluZGluZywgSW5qZWN0b3IsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVudHlwZWRGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBOYXZpZ2F0aW9uRW5kLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIFJlcGxheVN1YmplY3QsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgTmF2SXRlbSB9IGZyb20gJy4uLy4uLy4uL2NvbnRyb2xzL25hdmlnYXRpb24vbmF2LWl0ZW0nO1xyXG5pbXBvcnQgeyBFcnJvclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL2Vycm9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBTY3JvbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zY3JvbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9kaXNwbGF5L2RpYWxvZy9kaWFsb2cuc2VydmljZSc7XHJcbmltcG9ydCB7IFNwbGFzaFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9kaXNwbGF5L3NwbGFzaC9zcGxhc2guc2VydmljZSc7XHJcbmltcG9ydCB7IEhlbHAgfSBmcm9tICcuLi8uLi8uLi9kaXNwbGF5L2hlbHAvaGVscC10eXBlcyc7XHJcbmltcG9ydCB7IE92ZXJsYXkgfSBmcm9tICcuLi8uLi8uLi9kaXNwbGF5L3ZpZXctb3ZlcmxheS92aWV3LW92ZXJsYXkuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUGFnZVN0YXR1cywgUGFnZVN0YXR1c2VzIH0gZnJvbSAnLi4vcGFnZS1zdGF0dXNlcyc7XHJcblxyXG5leHBvcnQgY2xhc3MgUGFnZUluaXRSZXN1bHQge1xyXG4gIHRpdGxlPzogc3RyaW5nID0gJyc7XHJcbiAgc3ViVGl0bGU/OiBzdHJpbmcgPSAnJztcclxuICBzdWJUaXRsZVVybD86IHN0cmluZyA9ICcnO1xyXG5cclxuICBicmVhZGNydW1icz86IE5hdkl0ZW1bXTtcclxuICBoZWxwPzogSGVscDtcclxufVxyXG5cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQYWdlQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcclxuICAvKiogRGVmYXVsdCBjc3MgY2xhc3NlcyBhcHBsaWVkIHRvIGhvc3QgZWxlbWVudCAqL1xyXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKSBwcm90ZWN0ZWQgY2xhc3NMaXN0ID0gJ2QtZmxleCBmbGV4LWdyb3cnO1xyXG5cclxuICAvKipcclxuICAgKiBUaXRsZSBmb3IgdGhlIHBhZ2UgZGlzcGxheWVkIGluIHRoZSBoZWFkZXJcclxuICAgKi9cclxuICBwdWJsaWMgdGl0bGU/OiBzdHJpbmcgPSAnJztcclxuXHJcbiAgLyoqXHJcbiAgICogU3ViIHRpdGxlIGZvciB0aGUgcGFnZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlclxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdWJUaXRsZT86IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBTdWIgdGl0bGUgdXJsIGZvciB0aGUgcGFnZSBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlclxyXG4gICAqL1xyXG4gIHB1YmxpYyBzdWJUaXRsZVVybD86IHN0cmluZyA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBTdGF0dXMgb3ZlcmxheSBmb3IgdGhlIHBhZ2VcclxuICAgKi9cclxuICBwdWJsaWMgc3RhdHVzOiBPdmVybGF5ID0gbmV3IE92ZXJsYXkoJ3BlbmRpbmcnLCAnTG9hZGluZycpO1xyXG5cclxuICAvKipcclxuICAgKiBCcmVhZGNydW1icyBkaXNwbGF5ZWQgaW4gdGhlIGhlYWRlclxyXG4gICAqL1xyXG4gIHB1YmxpYyBicmVhZGNydW1icz86IE5hdkl0ZW1bXTtcclxuXHJcbiAgLyoqXHJcbiAgICogUmVzdWx0IHJldHVybmVkIGZyb20gdGhlIG9uSW5pdCBmdW5jdGlvblxyXG4gICAqL1xyXG4gIHB1YmxpYyBpbml0UmVzdWx0ITogUGFnZUluaXRSZXN1bHQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHAgaW5mb3JtYXRpb24gZm9yIHRoZSBjb21wb25lbnQsIHdoaWNoIGNhbiBvbmx5IGJlIHNldCB0aHJvdWdoIG9uSW5pdFxyXG4gICAqL1xyXG4gIHB1YmxpYyBoZWxwOiBIZWxwIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvKipcclxuICAgKiBGb3JtIGdyb3VwIHRvIGJlIHVzZWQgaWYgbmVlZGVkIGJ5IHRoZSBwYWdlXHJcbiAgICovXHJcbiAgcHVibGljIGZvcm1Hcm91cDogVW50eXBlZEZvcm1Hcm91cCA9IG5ldyBVbnR5cGVkRm9ybUdyb3VwKHt9KTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVmYXVsdCBpbnZhbGlkIGZvcm0gbWVzc2FnZSwgb3ZlcnJpZGUgaWYgYSBtb3JlIHNwZWNpZmljIG1lc3NhZ2UgaXMgbmVlZGVkXHJcbiAgICovXHJcbiAgcHVibGljIGRlZmF1bHRJbnZhbGlkRm9ybU1lc3NhZ2U6IHN0cmluZyA9ICdQbGVhc2VDb3JyZWN0Rm9ybV9TQyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmF1bHQgdW5rbm93biBzYXZlIGVycm9yIG1lc3NhZ2UsIG92ZXJyaWRlIGlmIGEgbW9yZSBzcGVjaWZpYyBtZXNzYWdlIGlzIG5lZWRlZFxyXG4gICAqL1xyXG4gIHB1YmxpYyBkZWZhdWx0VW5rbm93blNhdmVFcnJvcjogc3RyaW5nID0gJ1BhZ2VCYXNlVW5rbm93blNhdmVFcnJvcl9TQyc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZWQgdG8gb3B0IG91dCBvZiBoaWRpbmcgdGhlIHNwbGFzaCBzY3JlZW4gd2hlbiB0aGUgcGFnZSBpcyBsb2FkZWRcclxuICAgKi9cclxuICBwdWJsaWMgc2tpcEhpZGVTcGxhc2hPbkNvbXBsZXRlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFVzZWQgdG8gdW5zdWJzY3JpYmUgZnJvbSBvYnNlcnZhYmxlc1xyXG4gICAqL1xyXG4gIHB1YmxpYyBkZXN0cm95ZWQ6IFN1YmplY3Q8YW55PiA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogVXNlZCB0byBrbm93IHdoZW4gdGhlIHBhZ2UgaGFzIGJlZW4gbG9hZGVkLCB0aGlzIHdpbGwgYmUgY29tcGxldGVkXHJcbiAgICogYWZ0ZXIgb25BZnRlclZpZXdJbml0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfYWZ0ZXJWaWV3SW5pdENvbXBsZXRlOiBSZXBsYXlTdWJqZWN0PHZvaWQ+ID0gbmV3IFJlcGxheVN1YmplY3QoKTtcclxuICBwdWJsaWMgYWZ0ZXJWaWV3SW5pdENvbXBsZXRlOiBPYnNlcnZhYmxlPHZvaWQ+ID0gdGhpcy5fYWZ0ZXJWaWV3SW5pdENvbXBsZXRlO1xyXG5cclxuICAvKipcclxuICAgKiBJZiBkZWZpbmVkIHRoZSBmb3JtIHdpbGwgYXV0b21hdGljYWxseSBzY3JvbGwgdG8gdGhlIGZpcnN0IGludmFsaWQgZm9ybSBjb250cm9sXHJcbiAgICogaWYgaXQncyBvdXRzaWRlIG9mIHRoZSB2aWV3XHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIHNjcm9sbENvbnRhaW5lclNlbGVjdG9yOiBzdHJpbmcgfCB1bmRlZmluZWQ7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YnNjcmlwdGlvbiB0byB0aGUgcm91dGVyIGV2ZW50cyBOYXZpZ2F0aW9uRW5kXHJcbiAgICogVXNlZCB0byBrbm93IGlmIGFscmVhZHkgc3Vic2NyaWJlZCB0b1xyXG4gICAqL1xyXG4gIHByaXZhdGUgbmF2aWdhdGlvbkVuZFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29tbW9uIHNlcnZpY2VzIHVzZWQgYnkgcGFnZS1iYXNlXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGVycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCBzY3JvbGxTZXJ2aWNlOiBTY3JvbGxTZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCByb3V0ZXI6IFJvdXRlcjtcclxuICBwcm90ZWN0ZWQgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlO1xyXG4gIHByb3RlY3RlZCBkaWFsb2dTZXJ2aWNlOiBEaWFsb2dTZXJ2aWNlO1xyXG4gIHByb3RlY3RlZCBzcGxhc2hTZXJ2aWNlOiBTcGxhc2hTZXJ2aWNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IpIHtcclxuICAgIHRoaXMuZXJyb3JTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KEVycm9yU2VydmljZSk7XHJcbiAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UgPSBpbmplY3Rvci5nZXQoVHJhbnNsYXRlU2VydmljZSk7XHJcbiAgICB0aGlzLnNjcm9sbFNlcnZpY2UgPSBpbmplY3Rvci5nZXQoU2Nyb2xsU2VydmljZSk7XHJcbiAgICB0aGlzLnJvdXRlciA9IGluamVjdG9yLmdldChSb3V0ZXIpO1xyXG4gICAgdGhpcy5hY3RpdmF0ZWRSb3V0ZSA9IGluamVjdG9yLmdldChBY3RpdmF0ZWRSb3V0ZSk7XHJcbiAgICB0aGlzLmRpYWxvZ1NlcnZpY2UgPSBpbmplY3Rvci5nZXQoRGlhbG9nU2VydmljZSk7XHJcbiAgICB0aGlzLnNwbGFzaFNlcnZpY2UgPSBpbmplY3Rvci5nZXQoU3BsYXNoU2VydmljZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFcnJvcnMgdG8gYmUgc2hvd24gZm9yIHRoZSBjb21wb25lbnQuXHJcbiAgICogQXV0b21hdGljYWxseSBwb3B1bGF0ZWQgb24gcHJvbWlzZSByZWplY3Rpb24gZnJvbSBzYXZlIGFuZCBzaGFyZWQgd2l0aCB0aGUgVUkuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBfZXJyb3JzOiBzdHJpbmcgPSAnJztcclxuICBwdWJsaWMgZ2V0IGVycm9ycygpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2Vycm9ycztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9wdGlvbmFsIGxpZmVjeWNsZSBob29rIHRoYXQgaXMgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIEFuZ3VsYXIgbmdPbkluaXQgbGlmZWN5Y2xlIGhvb2suXHJcbiAgICogQ2FsbGVkIGJlZm9yZSBvbkluaXQgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZS4gQWRkIHNldHVwIGxvZ2ljIGhlcmUgdGhhdCBkb2VzXHJcbiAgICogbm90IG5lZWQgdG8gYmUgcnVuIG9uIGV2ZXJ5IHJlbG9hZC5cclxuICAgKi9cclxuICBwcm90ZWN0ZWQgb25GaXJzdEluaXQoKTogdm9pZCB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGluIHRoZSBkZXJpdmVkIGNsYXNzIGFzIHBhcnQgb2YgdGhlIEFuZ3VsYXIgbmdPbkluaXRcclxuICAgKiBsaWZlY3ljbGUgaG9vay4gSXQgbXVzdCBwcm92aWRlIGEgUGFnZUluaXRSZXN1bHQgYmFjayB0byB0aGUgYmFzZSBjbGFzcyB0byBwcm9wZXJseVxyXG4gICAqIHNldCB1cCB0aGUgcGFnZS5cclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgb25Jbml0KCk6IFByb21pc2U8UGFnZUluaXRSZXN1bHQ+O1xyXG4gIHByb3RlY3RlZCBpbml0UHJvbWlzZSE6IFByb21pc2U8UGFnZUluaXRSZXN1bHQ+O1xyXG5cclxuICBwdWJsaWMgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLnNob3dTdGF0dXMoUGFnZVN0YXR1cy5Mb2FkaW5nKTtcclxuICAgICAgdGhpcy5vbkZpcnN0SW5pdCgpO1xyXG4gICAgICB0aGlzLmluaXRQcm9taXNlID0gdGhpcy5vbkluaXQoKTtcclxuICAgICAgYXdhaXQgdGhpcy5pbml0UHJvbWlzZTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMuc3BsYXNoU2VydmljZS5oaWRlU3BsYXNoKCk7XHJcbiAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGp1c3QgYWZ0ZXIgdGhlIEFuZ3VsYXIgTGlmZWN5Y2xlIGV2ZW50IG5nT25BZnRlclZpZXdJbml0LlxyXG4gICAqIEl0IGZpcmVzIGFmdGVyIGFsbCBzdWItY29tcG9uZW50cyBoYXZlIGdvbmUgdGhyb3VnaCB0aGVpciBpbml0aWFsaXphdGlvbiBwaGFzZS5cclxuICAgKiBJdCBpcyBpbiB0aGlzIHBoYXNlIHRoYXQgdGhlIHZpZXcgY29tcG9uZW50cyBzaG91bGQgYWxyZWFkeSBleGlzdCwgc28gYSBkZXJpdmVkIGNsYXNzIHNob3VsZFxyXG4gICAqIGxvYWQgZGF0YSBmcm9tIHRoZSBBUEkgdG8gcG9wdWxhdGUgYW55IHZpZXcgY29tcG9uZW50cy4gVGhlIHByb21pc2UgdGhhdFxyXG4gICAqIGlzIHJldHVybmVkIG11c3Qgbm90IHJlc29sdmUgdW50aWwgYWxsIHJlcXVpcmVkIGRhdGEgaGFzIGNvbXBsZXRlbHkgbG9hZGVkXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGFzeW5jIG9uQWZ0ZXJWaWV3SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHsgfTtcclxuICBwdWJsaWMgYXN5bmMgbmdBZnRlclZpZXdJbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgaW5pdFJlc3VsdCA9IGF3YWl0IHRoaXMuaW5pdFByb21pc2U7XHJcbiAgICAgIHRoaXMucGFyc2VJbml0UmVzdWx0KGluaXRSZXN1bHQpO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5vbkFmdGVyVmlld0luaXQoKTtcclxuXHJcbiAgICAgIHRoaXMuX2FmdGVyVmlld0luaXRDb21wbGV0ZS5uZXh0KCk7XHJcbiAgICAgIHRoaXMuX2FmdGVyVmlld0luaXRDb21wbGV0ZS5jb21wbGV0ZSgpO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5vbkZvcm1Mb2FkQ29tcGxldGUoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLnN0YXR1cy5zdGF0dXMgPT09ICdwZW5kaW5nJykge1xyXG4gICAgICAgIHRoaXMuc2hvd1N0YXR1cyhQYWdlU3RhdHVzLkxvYWRlZCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICghdGhpcy5za2lwSGlkZVNwbGFzaE9uQ29tcGxldGUpIHtcclxuICAgICAgICB0aGlzLnNwbGFzaFNlcnZpY2UuaGlkZVNwbGFzaCgpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNldFVwUm91dGVyU3Vic2NyaXB0aW9ucygpO1xyXG5cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIHRoaXMuc3BsYXNoU2VydmljZS5oaWRlU3BsYXNoKCk7XHJcbiAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIGxpZmVjeWNsZSBtZXRob2QgdGhhdCBleGVjdXRlcyBvbmNlIGFsbCBkYXRhIGhhcyBiZWVuIGxvYWRlZFxyXG4gICAqIHRocm91Z2ggbmdBZnRlclZpZXdJbml0IGFuZCBmcm9tIGxvY2FsIHN0b3JhZ2UgaWYgcmVxdWlyZWQuXHJcbiAgICogSXQgaXMgYXQgdGhpcyBwb2ludCB0aGF0IHlvdSBjYW4gc3Vic2NyaWJlIHRvIGNoYW5nZXMgb24gdGhlIGZvcm1cclxuICAgKiByZWxpYWJseVxyXG4gICAqXHJcbiAgICogQHByb3RlY3RlZFxyXG4gICAqIEBtZW1iZXJvZiBQYWdlQmFzZUNvbXBvbmVudFxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBhc3luYyBvbkZvcm1Mb2FkQ29tcGxldGUoKTogUHJvbWlzZTxhbnk+IHsgfVxyXG5cclxuICAvKipcclxuICAgKiBBIGxpZmVjeWNsZSBob29rIHRoYXQgaXMgY2FsbGVkIGFmdGVyIGV2ZXJ5IE5hdmlnYXRpb25FbmQgZXZlbnQuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIG9uTmF2aWdhdGlvbkVuZCgpOiB2b2lkIHsgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWxvYWQgdGhlIGNvbXBvbmVudCBraWNraW5nIG9mZiB0aGUgbmdPbkluaXQgYW5kIG5nQWZ0ZXJWaWV3SW5pdCBsaWZlY3ljbGUgaG9va3MuXHJcbiAgICogQW55IHN0YXRlIHRoYXQgbmVlZHMgdG8gYmUgcmVzZXQgc2hvdWxkIGJlIGRvbmUgc28gYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QuXHJcbiAgICovXHJcbiAgcHVibGljIHJlbG9hZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2FmdGVyVmlld0luaXRDb21wbGV0ZSA9IG5ldyBSZXBsYXlTdWJqZWN0KCk7XHJcblxyXG4gICAgdGhpcy5zaG93U3RhdHVzKFBhZ2VTdGF0dXMuTG9hZGluZyk7XHJcbiAgICB0aGlzLmluaXRQcm9taXNlID0gdGhpcy5vbkluaXQoKTtcclxuICAgIHRoaXMubmdBZnRlclZpZXdJbml0KCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGVuIG92ZXJyaWRkZW4gaW4gYSBkZXJpdmVkIGNsYXNzIHRoaXMgbWV0aG9kIHdpbGwgc3luYyB0aGUgZm9ybSBzdGF0ZVxyXG4gICAqIGludG8gdGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRvIHRoZSBBUEkuIFRoZSB2YWx1ZSBzaG91bGQgbm90XHJcbiAgICogYWN0dWFsbHkgYmUgc2VudCB0byB0aGUgQVBJIHlldC5cclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYXN5bmMgYXBwbHlNb2RlbFVwZGF0ZXMoKTogUHJvbWlzZTx2b2lkPiB7IH07XHJcblxyXG4gIC8qKlxyXG4gICAqIFNhdmUgdGhlIG1vZGVsIHN0YXRlIHRvIHRoZSBBUEkgYW5kIHJldHVybiBhIHByb21pc2UgdGhhdFxyXG4gICAqIGNvbnRhaW5zIHRoZSB1cGRhdGVkIGVudGl0eUlELiBUaGUgcHJvbWlzZSBzaG91bGQgYmUgcmVqZWN0ZWRcclxuICAgKiBpZiB0aGUgc2F2ZSBmYWlscyBhbmQgZXJyb3JzIGFuZCB0aGUgb3ZlcmxheSBzdGF0dXMgd2lsbCBiZSB1cGRhdGVkXHJcbiAgICogYWNjb3JkaW5nbHlcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYXN5bmMgc2F2ZVRvQXBpKCk6IFByb21pc2U8bnVtYmVyIHwgdm9pZD4geyB9O1xyXG5cclxuICAvKipcclxuICAgKiBDYWxsZWQgYWZ0ZXIgdGhlIHNhdmUgaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuXHJcbiAgICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBkZXJpdmVkIGNsYXNzIHRvIG5hdmlnYXRlXHJcbiAgICogdG8gYSBwcm9wZXJ0aWVzL3N0YXR1cyBwYWdlIG9yIGVtaXQgYXBwcm9wcmlhdGVseSBpZiB3aXRoaW4gYSBkaWFsb2dcclxuICAgKiBAcGFyYW0gZW50aXR5SWQgXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIG9uU2F2ZUNvbXBsZXRlKGVudGl0eUlkPzogbnVtYmVyKTogdm9pZCB7IH07XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBzYXZlLiAgV2Ugd2lsbCBmaXJzdCB0b3VjaCBhbGwgY29udHJvbHMgdG8gc2hvdyB2YWxpZGF0aW9uIG1lc3NhZ2VzXHJcbiAgICogaWYgdGhlIGZvcm0gaXMgaW52YWxpZC4gIElmIHRoZSBmb3JtIGlzIHZhbGlkIHdlIHdpbGwgYXR0ZW1wdCB0byBzYXZlIGFuZCBhbnkgZXJyb3JzIHdpbGwgYmUgcmVwb3J0ZWRcclxuICAgKiBiYWNrIHRvIHRoZSB1c2VyXHJcbiAgICogQHBhcmFtIGV2ZW50IFxyXG4gICAqL1xyXG4gIHB1YmxpYyBhc3luYyBvblNhdmUoZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICB0aGlzLmZvcm1Hcm91cC5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcblxyXG4gICAgaWYgKHRoaXMuZm9ybUdyb3VwLnZhbGlkKSB7XHJcbiAgICAgIHRoaXMuc2hvd1N0YXR1cyhQYWdlU3RhdHVzLlNhdmluZyk7XHJcblxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGF3YWl0IHRoaXMuYXBwbHlNb2RlbFVwZGF0ZXMoKTtcclxuICAgICAgICBsZXQgZW50aXR5SWQgPSBhd2FpdCB0aGlzLnNhdmVUb0FwaSgpIHx8IC0xO1xyXG5cclxuICAgICAgICB0aGlzLl9lcnJvcnMgPSAnJztcclxuXHJcbiAgICAgICAgdGhpcy5vblNhdmVDb21wbGV0ZShlbnRpdHlJZCk7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgLy9jbGVhciB0aGUgXCJzYXZpbmdcIiBvdmVybGF5IGFuZCBzaG93IHRoZSBtZXNzYWdlIGF0IHRoZSB0b3Agb2YgdGhlIHZpZXcgdGhyb3VnaCB0aGUgZXJyb3JzIHByb3BlcnR5XHJcbiAgICAgICAgdGhpcy5zaG93RXJyb3JCYW5uZXIoZXJyb3IsIHRoaXMuZGVmYXVsdFVua25vd25TYXZlRXJyb3IpO1xyXG4gICAgICAgIHRoaXMuc3BsYXNoU2VydmljZS5oaWRlU3BsYXNoKCk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIE9ubHkgc2hvdyB0aGUgYmFubmVyIHdpdGggdGhlIGdlbmVyaWMgbWVzc2FnZSBpZiB0aGUgcGFyZW50IGNvbXBvbmVudCBoYXNuJ3QgYWxyZWFkeSBzZXQgb25lXHJcbiAgICAgIC8vIGJ5IGltcGxlbWVudGluZyBvblNhdmUgZm9yIGFkZGl0aW9uYWwgdmFsaWRhdGlvblxyXG4gICAgICBpZiAodGhpcy5lcnJvcnMgPT09ICcnKSB7XHJcbiAgICAgICAgdGhpcy5zaG93RXJyb3JCYW5uZXIodGhpcy5kZWZhdWx0SW52YWxpZEZvcm1NZXNzYWdlKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuc2Nyb2xsQ29udGFpbmVyU2VsZWN0b3IpIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2Nyb2xsU2VydmljZS5zY3JvbGxUb0l0ZW0odGhpcy5zY3JvbGxDb250YWluZXJTZWxlY3RvciEsIFwiLm5nLWludmFsaWRcIik7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkXHJcbiAgICovXHJcbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95ZWQubmV4dCgpO1xyXG4gICAgdGhpcy5kZXN0cm95ZWQudW5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEZ1bmN0aW9uIHRoYXQgd2lsbCBsb2cgYW4gZXJyb3IgdGhhdCBpcyBwYXNzZWQgaW4gdG8gdGhlIGNvbnNvbGVcclxuICAgKiBAcGFyYW0gZSBcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgb25FcnJvcihlcnJvcjogRXJyb3IpOiB2b2lkIHtcclxuICAgIHRoaXMuZXJyb3JTZXJ2aWNlLmxvZ0NvbnNvbGVFcnJvcihlcnJvcik7XHJcbiAgICB0aGlzLnNob3dFcnJvck92ZXJsYXkoZXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhbiBlcnJvciBtZXNzYWdlIGluIGEgd2hvbGUtcGFnZSBvdmVybGF5LiBUaGlzIHdpbGwgcHJldmVudCBhbnkgbW9yZVxyXG4gICAqIGludGVyYWN0aW9ucyB3aXRoIHRoZSBwYWdlLiBJdCBjYW4gdGFrZSBhIHN0cmluZyBlcnJvciBtZXNzYWdlIG9yIGEgcmF3IEFQSVxyXG4gICAqIGVycm9yIHRoYXQgbmVlZHMgdG8gYmUgcGFyc2VkLiBJZiB0aGUgQVBJIGVycm9yIGlzbid0IHNvbWV0aGluZyB3ZSBjYW4gaGFuZGxlXHJcbiAgICogYSBnZW5lcmljIG1lc3NhZ2UgaXMgc2hvd24gaW5zdGVhZFxyXG4gICAqIEBwYXJhbSB7KEVycm9yIHwgc3RyaW5nKX0gZXJyb3JcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgc2hvd0Vycm9yT3ZlcmxheShlcnJvcjogRXJyb3IgfCBzdHJpbmcpIHtcclxuICAgIHRoaXMuZ2V0RXJyb3JNZXNzYWdlKGVycm9yKS5zdWJzY3JpYmUoKHRyYW5zbGF0ZWRNZXNzYWdlOiBzdHJpbmcpID0+IHtcclxuICAgICAgdGhpcy5zdGF0dXMuc2V0U3RhdHVzKCdlcnJvcicsIHRyYW5zbGF0ZWRNZXNzYWdlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvdyBhbiBlcnJvciBpbiB0aGUgYmFubmVyIGF0IHRoZSB0b3Agb2YgdGhlIHNjcmVlbi4gIFRoaXMgd2lsbCBub3QgcHJvZHVjZSBhXHJcbiAgICogd2hvbGUtcGFnZSBvdmVybGF5IGxpa2UgdGhlIGZ1bmN0aW9uIHNob3dFcnJvciB3aWxsLiAgSXQgY2FuIHRha2UgYSBzdHJpbmcgZXJyb3IgbWVzc2FnZVxyXG4gICAqIG9yIHJhdyBBUEkgZXJyb3IgdGhhdCBuZWVkcyB0byBiZSBwYXJzZWQuICBJZiB0aGUgQVBJIGVycm9yIGlzbid0IHNvbWV0aGluZyB3ZSBjYW4gaGFuZGxlLFxyXG4gICAqIGEgZ2VuZXJpYyBtZXNzYWdlIChjdXN0b21pemFibGUgdmlhIHVua25vd25FcnJvckRlZmF1bHQpIGlzIHNob3duIGluc3RlYWQuXHJcbiAgICogQHBhcmFtIGVycm9yIFxyXG4gICAqIEBwYXJhbSB1bmtub3duRXJyb3JEZWZhdWx0IFxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBzaG93RXJyb3JCYW5uZXIoZXJyb3I6IEVycm9yIHwgc3RyaW5nLCB1bmtub3duRXJyb3JEZWZhdWx0Pzogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmdldEVycm9yTWVzc2FnZShlcnJvciwgdW5rbm93bkVycm9yRGVmYXVsdCkuc3Vic2NyaWJlKCh0cmFuc2xhdGVkTWVzc2FnZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIHRoaXMuX2Vycm9ycyA9IHRyYW5zbGF0ZWRNZXNzYWdlO1xyXG4gICAgICB0aGlzLnNob3dTdGF0dXMoUGFnZVN0YXR1cy5Mb2FkZWQpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYXJzZXMgYW5kIHRyYW5zbGF0ZXMgYW4gQVBJIGVycm9yIG9yIGVycm9yIHN0cmluZy5cclxuICAgKiBAcGFyYW0gZSBcclxuICAgKiBAcGFyYW0gdW5rbm93bkVycm9yRGVmYXVsdCBcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgZ2V0RXJyb3JNZXNzYWdlKGU6IEVycm9yIHwgc3RyaW5nLCB1bmtub3duRXJyb3JEZWZhdWx0Pzogc3RyaW5nKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcclxuICAgIGxldCBleHRyYWN0ZWRNZXNzYWdlID0gdGhpcy5lcnJvclNlcnZpY2UucGFyc2VBcGlFcnJvcihlLCB1bmtub3duRXJyb3JEZWZhdWx0KTtcclxuICAgIHJldHVybiB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuZ2V0KGV4dHJhY3RlZE1lc3NhZ2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2xlYXIgdGhlIGVycm9ycyB0byBoaWRlIHRoZSBlcnJvcnMgYmFubmVyLlxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBoaWRlRXJyb3JCYW5uZXIoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9lcnJvcnMgPSAnJztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoYW5nZSB0aGUgZGlzcGxheSBzdGF0dXMgdG8gb3ZlcmxheSB0aGUgd2hvbGUgcGFnZSB3aGlsZSBsb2FkaW5nIG9yIHNhdmluZ1xyXG4gICAqIGFuZCBjbGVhciBpdCB3aGVuIHRoZSBmb3JtIGlzIHJlYWR5XHJcbiAgICogQHByb3RlY3RlZFxyXG4gICAqIEBwYXJhbSB7UGFnZVN0YXR1c30gc3RhdHVzXHJcbiAgICogQG1lbWJlcm9mIEZvcm1CYXNlQ29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIHNob3dTdGF0dXMoc3RhdHVzOiBQYWdlU3RhdHVzKSB7XHJcbiAgICBsZXQga25vd25TdGF0dXMgPSBQYWdlU3RhdHVzZXNbc3RhdHVzXTtcclxuICAgIGlmIChrbm93blN0YXR1cykge1xyXG4gICAgICB0aGlzLnN0YXR1cy5zZXRTdGF0dXMoa25vd25TdGF0dXMuc3RhdHVzLCBrbm93blN0YXR1cy5tZXNzYWdlLCB1bmRlZmluZWQsIGtub3duU3RhdHVzLm5vRGF0YVRlbXBsYXRlLCBrbm93blN0YXR1cy5vdmVybGF5Q2xhc3NMaXN0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFsbG93cyB0aGUgY29tcG9uZW50IHRvIGVudGVyIGEgcGVuZGluZyBzdGF0dXMgYW5kIGV4ZWN1dGUgYSBmdW5jdGlvbiB0aGF0IG9uIGNvbXBsZXRpb24gd2lsbCByZXR1cm4gdGhlIHN0YXR1c1xyXG4gICAqIHRvIGhhc0RhdGEuIElmIGFuIGVycm9yIG9jY3VycyB3aXRoaW4gdGhlIGNhbGxiYWNrIGFuIGVycm9yIGJhbm5lciBjYW4gYmUgc2hvd24uXHJcbiAgICogQHBhcmFtIGNhbGxiYWNrXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgYXN5bmMgcnVuQmxvY2tpbmdBY3Rpb24oY2FsbGJhY2s6ICgpID0+IFByb21pc2U8YW55PiwgcGVuZGluZ01lc3NhZ2U/OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xyXG4gICAgdGhpcy5oaWRlRXJyb3JCYW5uZXIoKTtcclxuICAgIHRoaXMuc3RhdHVzLnNldFN0YXR1cygncGVuZGluZycsIHBlbmRpbmdNZXNzYWdlKTtcclxuXHJcbiAgICByZXR1cm4gY2FsbGJhY2soKS5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd0Vycm9yQmFubmVyKGVycm9yKTtcclxuICAgICAgLy8gVGhyb3cgdGhlIGVycm9yIGZvciBhbnkgZG93bnN0cmVhbSBjb21wb25lbnRzIHRoYXQgbWF5IGJlIGxpc3RlbmluZyBhbmQgbmVlZCB0byByZWFjdFxyXG4gICAgICAvLyB0byBhbnkgZXJyb3JzIGhhcHBlbmluZyB3aXRoaW4gdGhpcyBjYWxsYmFja1xyXG4gICAgICB0aHJvdyAoZXJyb3IpO1xyXG4gICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc2hvd1N0YXR1cyhQYWdlU3RhdHVzLkxvYWRlZCk7XHJcbiAgICB9KTtcclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBQYXJzZXMgdGhlIHBhZ2UgaW5pdCByZXN1bHQgYW5kIHNldHMgdGhlIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzIG9uIHRoZSBwYWdlXHJcbiAgICogQHBhcmFtIHJlc3VsdCBcclxuICAgKi9cclxuICBwcml2YXRlIHBhcnNlSW5pdFJlc3VsdChyZXN1bHQ6IFBhZ2VJbml0UmVzdWx0KTogdm9pZCB7XHJcbiAgICB0aGlzLmluaXRSZXN1bHQgPSByZXN1bHQ7XHJcbiAgICB0aGlzLnRpdGxlID0gcmVzdWx0LnRpdGxlO1xyXG4gICAgdGhpcy5zdWJUaXRsZSA9IHJlc3VsdC5zdWJUaXRsZTtcclxuICAgIHRoaXMuc3ViVGl0bGVVcmwgPSByZXN1bHQuc3ViVGl0bGVVcmw7XHJcbiAgICB0aGlzLmJyZWFkY3J1bWJzID0gcmVzdWx0LmJyZWFkY3J1bWJzO1xyXG4gICAgdGhpcy5oZWxwID0gcmVzdWx0LmhlbHA7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTZXRzIHVwIHRoZSByb3V0ZXIgZXZlbnQgc3Vic2NyaXB0aW9uc1xyXG4gICAqL1xyXG4gIHByaXZhdGUgc2V0VXBSb3V0ZXJTdWJzY3JpcHRpb25zKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLm5hdmlnYXRpb25FbmRTdWJzY3JpcHRpb24gJiYgIXRoaXMuZGVzdHJveWVkLmNsb3NlZCkge1xyXG4gICAgICAvLyBSZWFjdCB0byBuYXZpZ2F0aW9uIGV2ZW50c1xyXG4gICAgICB0aGlzLm5hdmlnYXRpb25FbmRTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlci5ldmVudHMucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQpLFxyXG4gICAgICAgIGZpbHRlcihlID0+IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSxcclxuICAgICAgKS5zdWJzY3JpYmUoZSA9PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIHRoaXMub25OYXZpZ2F0aW9uRW5kKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgIHRoaXMub25FcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|
package/{esm2015/lib/shared/page/page-statuses.js → esm2020/lib/shared/page/page-statuses.mjs}
RENAMED
|
File without changes
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Component, Input } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
import * as i2 from "@angular/router";
|
|
5
|
+
export class PageTitleComponent {
|
|
6
|
+
}
|
|
7
|
+
PageTitleComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: PageTitleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
8
|
+
PageTitleComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: PageTitleComponent, selector: "app-page-title", inputs: { title: "title", titleIcon: "titleIcon", subTitle: "subTitle", subTitleUrl: "subTitleUrl" }, host: { classAttribute: "d-flex" }, ngImport: i0, template: "<i *ngIf=\"titleIcon\"\r\n class=\"flex-shrink mr-1 my-1 ec-icon ec-icon-md {{titleIcon}}\"></i>\r\n<div class=\"text-truncate\">\r\n <h1 *ngIf=\"title\"\r\n class=\"text-title-1 mb-0 py-1 text-truncate\"\r\n title=\"{{title}}\">{{title}}</h1>\r\n <p *ngIf=\"subTitle && !subTitleUrl\"\r\n class=\"text-caption-1 mb-0 mt-n1 text-truncate\">{{subTitle}}</p>\r\n <a *ngIf=\"subTitle && subTitleUrl\"\r\n id=\"subTitle_link\"\r\n class=\"d-block text-truncate mb-0 mt-n1 font-size-small\"\r\n routerLink=\"{{subTitleUrl}}\"\r\n target=\"_self\">\r\n {{subTitle}}\r\n </a>\r\n</div>", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
9
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: PageTitleComponent, decorators: [{
|
|
10
|
+
type: Component,
|
|
11
|
+
args: [{ selector: 'app-page-title', host: {
|
|
12
|
+
class: 'd-flex'
|
|
13
|
+
}, template: "<i *ngIf=\"titleIcon\"\r\n class=\"flex-shrink mr-1 my-1 ec-icon ec-icon-md {{titleIcon}}\"></i>\r\n<div class=\"text-truncate\">\r\n <h1 *ngIf=\"title\"\r\n class=\"text-title-1 mb-0 py-1 text-truncate\"\r\n title=\"{{title}}\">{{title}}</h1>\r\n <p *ngIf=\"subTitle && !subTitleUrl\"\r\n class=\"text-caption-1 mb-0 mt-n1 text-truncate\">{{subTitle}}</p>\r\n <a *ngIf=\"subTitle && subTitleUrl\"\r\n id=\"subTitle_link\"\r\n class=\"d-block text-truncate mb-0 mt-n1 font-size-small\"\r\n routerLink=\"{{subTitleUrl}}\"\r\n target=\"_self\">\r\n {{subTitle}}\r\n </a>\r\n</div>" }]
|
|
14
|
+
}], propDecorators: { title: [{
|
|
15
|
+
type: Input
|
|
16
|
+
}], titleIcon: [{
|
|
17
|
+
type: Input
|
|
18
|
+
}], subTitle: [{
|
|
19
|
+
type: Input
|
|
20
|
+
}], subTitleUrl: [{
|
|
21
|
+
type: Input
|
|
22
|
+
}] } });
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS10aXRsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NyYy9saWIvc2hhcmVkL3BhZ2UvcGFnZS10aXRsZS9wYWdlLXRpdGxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zaGFyZWQvcGFnZS9wYWdlLXRpdGxlL3BhZ2UtdGl0bGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFTakQsTUFBTSxPQUFPLGtCQUFrQjs7K0dBQWxCLGtCQUFrQjttR0FBbEIsa0JBQWtCLGdNQ1QvQix3bkJBZU07MkZETk8sa0JBQWtCO2tCQVA5QixTQUFTOytCQUNFLGdCQUFnQixRQUVwQjt3QkFDSixLQUFLLEVBQUUsUUFBUTtxQkFDaEI7OEJBR2UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXBhZ2UtdGl0bGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wYWdlLXRpdGxlLmNvbXBvbmVudC5odG1sJyxcclxuICBob3N0OiB7XHJcbiAgICBjbGFzczogJ2QtZmxleCdcclxuICB9XHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQYWdlVGl0bGVDb21wb25lbnQge1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB0aXRsZT86IHN0cmluZztcclxuICBASW5wdXQoKSBwdWJsaWMgdGl0bGVJY29uPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzdWJUaXRsZT86IHN0cmluZzsgXHJcbiAgQElucHV0KCkgcHVibGljIHN1YlRpdGxlVXJsPzogc3RyaW5nOyBcclxufVxyXG4iLCI8aSAqbmdJZj1cInRpdGxlSWNvblwiXHJcbiAgIGNsYXNzPVwiZmxleC1zaHJpbmsgbXItMSBteS0xIGVjLWljb24gZWMtaWNvbi1tZCB7e3RpdGxlSWNvbn19XCI+PC9pPlxyXG48ZGl2IGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiPlxyXG4gICA8aDEgKm5nSWY9XCJ0aXRsZVwiXHJcbiAgICAgICBjbGFzcz1cInRleHQtdGl0bGUtMSBtYi0wIHB5LTEgdGV4dC10cnVuY2F0ZVwiXHJcbiAgICAgICB0aXRsZT1cInt7dGl0bGV9fVwiPnt7dGl0bGV9fTwvaDE+XHJcbiAgIDxwICpuZ0lmPVwic3ViVGl0bGUgJiYgIXN1YlRpdGxlVXJsXCJcclxuICAgICAgY2xhc3M9XCJ0ZXh0LWNhcHRpb24tMSBtYi0wIG10LW4xIHRleHQtdHJ1bmNhdGVcIj57e3N1YlRpdGxlfX08L3A+XHJcbiAgIDxhICpuZ0lmPVwic3ViVGl0bGUgJiYgc3ViVGl0bGVVcmxcIlxyXG4gICAgICBpZD1cInN1YlRpdGxlX2xpbmtcIlxyXG4gICAgICBjbGFzcz1cImQtYmxvY2sgdGV4dC10cnVuY2F0ZSBtYi0wIG10LW4xIGZvbnQtc2l6ZS1zbWFsbFwiXHJcbiAgICAgIHJvdXRlckxpbms9XCJ7e3N1YlRpdGxlVXJsfX1cIlxyXG4gICAgICB0YXJnZXQ9XCJfc2VsZlwiPlxyXG4gICAgICB7e3N1YlRpdGxlfX1cclxuICAgPC9hPlxyXG48L2Rpdj4iXX0=
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { Overlay } from '../../../display/view-overlay/view-overlay.component';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@angular/common";
|
|
5
|
+
import * as i2 from "@angular/router";
|
|
6
|
+
import * as i3 from "../../../controls/button/button.component";
|
|
7
|
+
import * as i4 from "../../../display/view-overlay/view-overlay.component";
|
|
8
|
+
import * as i5 from "../../../controls/banner/banner.component";
|
|
9
|
+
import * as i6 from "../../../controls/dropdown/dropdown.component";
|
|
10
|
+
import * as i7 from "../page-title/page-title.component";
|
|
11
|
+
export class PageViewComponent {
|
|
12
|
+
constructor() {
|
|
13
|
+
/**
|
|
14
|
+
* Set to true when page-view is inside a dialog to adjust styles and hide breadcrumbs.
|
|
15
|
+
*/
|
|
16
|
+
this.isDialog = false;
|
|
17
|
+
/**
|
|
18
|
+
* Set to true to enable read only mode. Only a single secondary action will be available
|
|
19
|
+
*/
|
|
20
|
+
this.readonly = false;
|
|
21
|
+
/**
|
|
22
|
+
* Controls Overlay that masks the page view content. Only the header is not masked when the overlay is visible. Default is pending Overlay with no message
|
|
23
|
+
*/
|
|
24
|
+
this.status = new Overlay('pending');
|
|
25
|
+
/**
|
|
26
|
+
* Set to false to hide the entire header, including breadcrumbs and error banner. Default is true.
|
|
27
|
+
*/
|
|
28
|
+
this.showHeader = true;
|
|
29
|
+
/**
|
|
30
|
+
* Label for the actions dropdown in the header. Default is 'Actions'
|
|
31
|
+
*/
|
|
32
|
+
this.moreActionsLabel = 'Actions';
|
|
33
|
+
/**
|
|
34
|
+
* Label for the secondary button in the header. Default is 'Cancel'
|
|
35
|
+
*/
|
|
36
|
+
this.secondaryActionLabel = 'Cancel';
|
|
37
|
+
this.hideSecondaryAction = false;
|
|
38
|
+
/**
|
|
39
|
+
* Label for the primary button in the header. Default is 'Save'
|
|
40
|
+
*/
|
|
41
|
+
this.primaryActionLabel = 'Save';
|
|
42
|
+
this.hidePrimaryAction = false;
|
|
43
|
+
/**
|
|
44
|
+
* Pins the footer to the bottom of the view and overlays any overflowing content
|
|
45
|
+
*/
|
|
46
|
+
this.stickyFooter = true;
|
|
47
|
+
/**
|
|
48
|
+
* Prevents content from overflowing the view. Content must manage overflow instead.
|
|
49
|
+
*/
|
|
50
|
+
this.fitContent = false;
|
|
51
|
+
this.onPrimaryAction = new EventEmitter();
|
|
52
|
+
this.onSecondaryAction = new EventEmitter();
|
|
53
|
+
}
|
|
54
|
+
primaryAction(event) {
|
|
55
|
+
if (this.onPrimaryAction) {
|
|
56
|
+
this.onPrimaryAction.emit(event);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
secondaryAction(event) {
|
|
60
|
+
if (this.onSecondaryAction) {
|
|
61
|
+
this.onSecondaryAction.emit(event);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
PageViewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: PageViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
66
|
+
PageViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.0", type: PageViewComponent, selector: "ec-page-view", inputs: { isDialog: "isDialog", readonly: "readonly", status: "status", showHeader: "showHeader", errors: "errors", breadcrumbs: "breadcrumbs", title: "title", titleIcon: "titleIcon", subTitle: "subTitle", subTitleUrl: "subTitleUrl", moreActionsLabel: "moreActionsLabel", moreActions: "moreActions", secondaryActionLabel: "secondaryActionLabel", hideSecondaryAction: "hideSecondaryAction", primaryActionLabel: "primaryActionLabel", hidePrimaryAction: "hidePrimaryAction", customTitleTemplate: "customTitleTemplate", customActionsTemplate: "customActionsTemplate", customHeaderTemplate: "customHeaderTemplate", footerTemplate: "footerTemplate", stickyFooter: "stickyFooter", fitContent: "fitContent" }, outputs: { onPrimaryAction: "onPrimaryAction", onSecondaryAction: "onSecondaryAction" }, host: { classAttribute: "flex-grow" }, ngImport: i0, template: "<div ecOverlay\r\n [status]=\"status?.status\"\r\n [message]=\"status?.message\"\r\n [displayAsMask]=\"true\"\r\n class=\"bg-body flex-grow d-flex\">\r\n <div id=\"PageViewScrollContainer\" \r\n class=\"d-flex flex-column flex-grow scroll-y\" \r\n [class.is-dialog]=\"isDialog\"\r\n [class.fit-content]=\"fitContent\"\r\n [class.sticky-footer]=\"stickyFooter && !!footerTemplate\"\r\n [class.overlay-visible]=\"status?.status !== 'hasData'\"\r\n [class.footer-visible]=\"!!footerTemplate\">\r\n <section>\r\n <ng-content></ng-content> \r\n </section>\r\n \r\n <footer *ngIf=\"footerTemplate\">\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n </footer>\r\n\r\n <header *ngIf=\"showHeader\">\r\n \r\n <ol id=\"breadcrumbs\"\r\n *ngIf=\"breadcrumbs?.length && !isDialog\">\r\n <li *ngFor=\"let crumb of breadcrumbs; last as isLast\">\r\n <a *ngIf=\"crumb.url; else label\"\r\n [routerLink]=\"crumb.url\">\r\n <ng-container *ngTemplateOutlet=\"label\"></ng-container>\r\n </a>\r\n <ng-template #label>{{crumb.label}}</ng-template>\r\n </li>\r\n </ol>\r\n \r\n <div *ngIf=\"!customHeaderTemplate; else customHeaderOutlet\" class=\"titlebar\">\r\n <app-page-title *ngIf=\"!customTitleTemplate; else customTitle\" \r\n [title]=\"title\"\r\n [subTitle]=\"subTitle\"\r\n [subTitleUrl]=\"subTitleUrl\"\r\n [titleIcon]=\"titleIcon\"\r\n class=\"title text-truncate\">\r\n </app-page-title>\r\n \r\n <ng-template #customTitle>\r\n <div class=\"title\">\r\n <ng-container *ngTemplateOutlet=\"customTitleTemplate\"></ng-container>\r\n </div>\r\n </ng-template>\r\n \r\n <div class=\"actions\">\r\n <ec-button id=\"primaryAction\"\r\n class=\"ml-2\"\r\n *ngIf=\"!hidePrimaryAction && onPrimaryAction.observers?.length && !readonly\"\r\n [disabled]=\"status?.status === 'pending'\"\r\n type=\"primary\"\r\n [label]=\"primaryActionLabel\"\r\n (clicked)=\"primaryAction($event)\">\r\n </ec-button>\r\n <ec-button id=\"secondaryAction\"\r\n class=\"ml-2\"\r\n *ngIf=\"!hideSecondaryAction && onSecondaryAction.observers?.length\"\r\n type=\"secondary\"\r\n [label]=\"readonly ? 'Close' : secondaryActionLabel\"\r\n (clicked)=\"secondaryAction($event)\">\r\n </ec-button>\r\n <ec-dropdown id=\"moreActions\"\r\n *ngIf=\"moreActions?.length && !readonly\"\r\n [disabled]=\"status?.status === 'pending'\"\r\n class=\"ml-2\"\r\n buttonType=\"secondary\"\r\n [label]=\"moreActionsLabel\"\r\n [items]=\"moreActions\">\r\n </ec-dropdown>\r\n <ng-container *ngTemplateOutlet=\"customActionsTemplate\"></ng-container>\r\n </div>\r\n </div>\r\n \r\n <ng-template #customHeaderOutlet> \r\n <div class=\"page-header\">\r\n <ng-container *ngTemplateOutlet=\"customHeaderTemplate\"></ng-container>\r\n </div>\r\n </ng-template>\r\n \r\n <ec-banner *ngIf=\"errors\"\r\n id=\"pageViewErrors\"\r\n [class.border-bottom-0]=\"!isDialog\">\r\n <div [innerHtml]=\"errors\"></div>\r\n </ec-banner>\r\n </header>\r\n </div>\r\n</div>\r\n\r\n", styles: [":host{flex:1 1;min-height:0;display:flex}header{background-color:var(--ec-background-color-body);position:sticky;top:0;order:1;padding:1rem 1.5rem .5rem;flex:none;z-index:1}ol{font-size:var(--ec-font-size-label);line-height:1rem;grid-column:1/3;grid-row:1/2;list-style:none;padding:0;margin:0 0 .25rem}ol li{display:inline}ol li:not(:last-child):after{content:\" / \";display:inline;color:var(--ec-color-secondary-dark)}.titlebar{display:grid;grid-template-columns:auto max-content;grid-template-rows:max-content max-content;gap:0 1rem}.title{grid-column:1/2;grid-row:2/3;align-self:center}.actions{grid-column:2/3;grid-row:2/3;direction:rtl}ec-banner{margin-top:1rem}section{padding:var(--ec-page-view-padding-section, .5rem 1.5rem 2rem);order:2;flex:1 0 auto;min-height:0}footer{background-color:var(--ec-background-color-body);order:3;padding:0 1.5rem;height:4.5rem;flex:none;display:flex;align-items:center}.is-dialog header{padding:0}.is-dialog .titlebar{background-color:var(--ec-background-color);padding:1rem;border-bottom:1px solid var(--ec-border-color)}.is-dialog ec-banner{margin:0}.is-dialog section{padding:var(--ec-page-view-padding-section, 1rem 1rem 1.5rem)}.sticky-footer section{padding-bottom:4.5rem}.sticky-footer footer{position:sticky;bottom:0}.fit-content section{flex:1 1;display:flex}.footer-visible section{padding-bottom:0}.overlay-visible header{z-index:var(--ec-z-index-overlay)1}.overlay-visible ec-banner{display:none}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i3.ButtonComponent, selector: "ec-button", inputs: ["id", "disabled", "icon", "label", "badge", "tabindex", "type", "pending", "pendingIcon", "customTemplate", "isSubmit", "autofocus"], outputs: ["clicked"] }, { kind: "component", type: i4.ViewOverlayComponent, selector: "[ecOverlay]", inputs: ["status", "message", "action", "noDataTemplate", "displayAsMask", "overlayClassList"] }, { kind: "component", type: i5.BannerComponent, selector: "ec-banner", inputs: ["hidden", "id", "type", "bannerStyle", "title", "text", "list", "showCloseBtn", "autoHideOnClose", "customIcon", "rememberClosed"], outputs: ["closed"] }, { kind: "component", type: i6.DropdownComponent, selector: "ec-dropdown", inputs: ["id", "autofocus", "status", "disabled", "label", "icon", "buttonType", "buttonAlignment", "buttonTitle", "tabindex", "showArrow", "items", "menuTemplateType", "menuTitle", "menuHeight", "menuWidth", "menuMinWidth", "menuPosition", "menuFooter", "popupFixed", "buttonCustomTemplate", "pending"], outputs: ["itemSelected", "popupOpened"] }, { kind: "component", type: i7.PageTitleComponent, selector: "app-page-title", inputs: ["title", "titleIcon", "subTitle", "subTitleUrl"] }] });
|
|
67
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.0", ngImport: i0, type: PageViewComponent, decorators: [{
|
|
68
|
+
type: Component,
|
|
69
|
+
args: [{ selector: 'ec-page-view', host: {
|
|
70
|
+
class: "flex-grow"
|
|
71
|
+
}, template: "<div ecOverlay\r\n [status]=\"status?.status\"\r\n [message]=\"status?.message\"\r\n [displayAsMask]=\"true\"\r\n class=\"bg-body flex-grow d-flex\">\r\n <div id=\"PageViewScrollContainer\" \r\n class=\"d-flex flex-column flex-grow scroll-y\" \r\n [class.is-dialog]=\"isDialog\"\r\n [class.fit-content]=\"fitContent\"\r\n [class.sticky-footer]=\"stickyFooter && !!footerTemplate\"\r\n [class.overlay-visible]=\"status?.status !== 'hasData'\"\r\n [class.footer-visible]=\"!!footerTemplate\">\r\n <section>\r\n <ng-content></ng-content> \r\n </section>\r\n \r\n <footer *ngIf=\"footerTemplate\">\r\n <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n </footer>\r\n\r\n <header *ngIf=\"showHeader\">\r\n \r\n <ol id=\"breadcrumbs\"\r\n *ngIf=\"breadcrumbs?.length && !isDialog\">\r\n <li *ngFor=\"let crumb of breadcrumbs; last as isLast\">\r\n <a *ngIf=\"crumb.url; else label\"\r\n [routerLink]=\"crumb.url\">\r\n <ng-container *ngTemplateOutlet=\"label\"></ng-container>\r\n </a>\r\n <ng-template #label>{{crumb.label}}</ng-template>\r\n </li>\r\n </ol>\r\n \r\n <div *ngIf=\"!customHeaderTemplate; else customHeaderOutlet\" class=\"titlebar\">\r\n <app-page-title *ngIf=\"!customTitleTemplate; else customTitle\" \r\n [title]=\"title\"\r\n [subTitle]=\"subTitle\"\r\n [subTitleUrl]=\"subTitleUrl\"\r\n [titleIcon]=\"titleIcon\"\r\n class=\"title text-truncate\">\r\n </app-page-title>\r\n \r\n <ng-template #customTitle>\r\n <div class=\"title\">\r\n <ng-container *ngTemplateOutlet=\"customTitleTemplate\"></ng-container>\r\n </div>\r\n </ng-template>\r\n \r\n <div class=\"actions\">\r\n <ec-button id=\"primaryAction\"\r\n class=\"ml-2\"\r\n *ngIf=\"!hidePrimaryAction && onPrimaryAction.observers?.length && !readonly\"\r\n [disabled]=\"status?.status === 'pending'\"\r\n type=\"primary\"\r\n [label]=\"primaryActionLabel\"\r\n (clicked)=\"primaryAction($event)\">\r\n </ec-button>\r\n <ec-button id=\"secondaryAction\"\r\n class=\"ml-2\"\r\n *ngIf=\"!hideSecondaryAction && onSecondaryAction.observers?.length\"\r\n type=\"secondary\"\r\n [label]=\"readonly ? 'Close' : secondaryActionLabel\"\r\n (clicked)=\"secondaryAction($event)\">\r\n </ec-button>\r\n <ec-dropdown id=\"moreActions\"\r\n *ngIf=\"moreActions?.length && !readonly\"\r\n [disabled]=\"status?.status === 'pending'\"\r\n class=\"ml-2\"\r\n buttonType=\"secondary\"\r\n [label]=\"moreActionsLabel\"\r\n [items]=\"moreActions\">\r\n </ec-dropdown>\r\n <ng-container *ngTemplateOutlet=\"customActionsTemplate\"></ng-container>\r\n </div>\r\n </div>\r\n \r\n <ng-template #customHeaderOutlet> \r\n <div class=\"page-header\">\r\n <ng-container *ngTemplateOutlet=\"customHeaderTemplate\"></ng-container>\r\n </div>\r\n </ng-template>\r\n \r\n <ec-banner *ngIf=\"errors\"\r\n id=\"pageViewErrors\"\r\n [class.border-bottom-0]=\"!isDialog\">\r\n <div [innerHtml]=\"errors\"></div>\r\n </ec-banner>\r\n </header>\r\n </div>\r\n</div>\r\n\r\n", styles: [":host{flex:1 1;min-height:0;display:flex}header{background-color:var(--ec-background-color-body);position:sticky;top:0;order:1;padding:1rem 1.5rem .5rem;flex:none;z-index:1}ol{font-size:var(--ec-font-size-label);line-height:1rem;grid-column:1/3;grid-row:1/2;list-style:none;padding:0;margin:0 0 .25rem}ol li{display:inline}ol li:not(:last-child):after{content:\" / \";display:inline;color:var(--ec-color-secondary-dark)}.titlebar{display:grid;grid-template-columns:auto max-content;grid-template-rows:max-content max-content;gap:0 1rem}.title{grid-column:1/2;grid-row:2/3;align-self:center}.actions{grid-column:2/3;grid-row:2/3;direction:rtl}ec-banner{margin-top:1rem}section{padding:var(--ec-page-view-padding-section, .5rem 1.5rem 2rem);order:2;flex:1 0 auto;min-height:0}footer{background-color:var(--ec-background-color-body);order:3;padding:0 1.5rem;height:4.5rem;flex:none;display:flex;align-items:center}.is-dialog header{padding:0}.is-dialog .titlebar{background-color:var(--ec-background-color);padding:1rem;border-bottom:1px solid var(--ec-border-color)}.is-dialog ec-banner{margin:0}.is-dialog section{padding:var(--ec-page-view-padding-section, 1rem 1rem 1.5rem)}.sticky-footer section{padding-bottom:4.5rem}.sticky-footer footer{position:sticky;bottom:0}.fit-content section{flex:1 1;display:flex}.footer-visible section{padding-bottom:0}.overlay-visible header{z-index:var(--ec-z-index-overlay)1}.overlay-visible ec-banner{display:none}\n"] }]
|
|
72
|
+
}], ctorParameters: function () { return []; }, propDecorators: { isDialog: [{
|
|
73
|
+
type: Input
|
|
74
|
+
}], readonly: [{
|
|
75
|
+
type: Input
|
|
76
|
+
}], status: [{
|
|
77
|
+
type: Input
|
|
78
|
+
}], showHeader: [{
|
|
79
|
+
type: Input
|
|
80
|
+
}], errors: [{
|
|
81
|
+
type: Input
|
|
82
|
+
}], breadcrumbs: [{
|
|
83
|
+
type: Input
|
|
84
|
+
}], title: [{
|
|
85
|
+
type: Input
|
|
86
|
+
}], titleIcon: [{
|
|
87
|
+
type: Input
|
|
88
|
+
}], subTitle: [{
|
|
89
|
+
type: Input
|
|
90
|
+
}], subTitleUrl: [{
|
|
91
|
+
type: Input
|
|
92
|
+
}], moreActionsLabel: [{
|
|
93
|
+
type: Input
|
|
94
|
+
}], moreActions: [{
|
|
95
|
+
type: Input
|
|
96
|
+
}], secondaryActionLabel: [{
|
|
97
|
+
type: Input
|
|
98
|
+
}], hideSecondaryAction: [{
|
|
99
|
+
type: Input
|
|
100
|
+
}], primaryActionLabel: [{
|
|
101
|
+
type: Input
|
|
102
|
+
}], hidePrimaryAction: [{
|
|
103
|
+
type: Input
|
|
104
|
+
}], customTitleTemplate: [{
|
|
105
|
+
type: Input
|
|
106
|
+
}], customActionsTemplate: [{
|
|
107
|
+
type: Input
|
|
108
|
+
}], customHeaderTemplate: [{
|
|
109
|
+
type: Input
|
|
110
|
+
}], footerTemplate: [{
|
|
111
|
+
type: Input
|
|
112
|
+
}], stickyFooter: [{
|
|
113
|
+
type: Input
|
|
114
|
+
}], fitContent: [{
|
|
115
|
+
type: Input
|
|
116
|
+
}], onPrimaryAction: [{
|
|
117
|
+
type: Output
|
|
118
|
+
}], onSecondaryAction: [{
|
|
119
|
+
type: Output
|
|
120
|
+
}] } });
|
|
121
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zaGFyZWQvcGFnZS9wYWdlLXZpZXcvcGFnZS12aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvc3JjL2xpYi9zaGFyZWQvcGFnZS9wYWdlLXZpZXcvcGFnZS12aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFlLEtBQUssRUFBRSxNQUFNLEVBQWUsTUFBTSxlQUFlLENBQUM7QUFHakcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNEQUFzRCxDQUFDOzs7Ozs7Ozs7QUFVL0UsTUFBTSxPQUFPLGlCQUFpQjtJQTZGNUI7UUE1RkE7O1dBRUc7UUFDYSxhQUFRLEdBQVksS0FBSyxDQUFDO1FBRTFDOztXQUVHO1FBQ2EsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUUxQzs7V0FFRztRQUNhLFdBQU0sR0FBYSxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUUxRDs7V0FFRztRQUNhLGVBQVUsR0FBWSxJQUFJLENBQUM7UUFvQjNDOztXQUVHO1FBQ2EscUJBQWdCLEdBQVksU0FBUyxDQUFDO1FBTXREOztXQUVHO1FBQ2EseUJBQW9CLEdBQVksUUFBUSxDQUFDO1FBQ3pDLHdCQUFtQixHQUFHLEtBQUssQ0FBQztRQUU1Qzs7V0FFRztRQUNhLHVCQUFrQixHQUFZLE1BQU0sQ0FBQztRQUNyQyxzQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFzQjFDOztXQUVHO1FBQ2EsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFFcEM7O1dBRUc7UUFDYSxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRWxCLG9CQUFlLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDeEQsc0JBQWlCLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7SUFFM0QsQ0FBQztJQUVWLGFBQWEsQ0FBQyxLQUFVO1FBQzdCLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUN4QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNsQztJQUNILENBQUM7SUFFTSxlQUFlLENBQUMsS0FBVTtRQUMvQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3BDO0lBQ0gsQ0FBQzs7OEdBekdVLGlCQUFpQjtrR0FBakIsaUJBQWlCLGszQkNiOUIsZzNJQTJGQTsyRkQ5RWEsaUJBQWlCO2tCQVI3QixTQUFTOytCQUNFLGNBQWMsUUFHbEI7d0JBQ0osS0FBSyxFQUFFLFdBQVc7cUJBQ25COzBFQU1lLFFBQVE7c0JBQXZCLEtBQUs7Z0JBS1UsUUFBUTtzQkFBdkIsS0FBSztnQkFLVSxNQUFNO3NCQUFyQixLQUFLO2dCQUtVLFVBQVU7c0JBQXpCLEtBQUs7Z0JBS1UsTUFBTTtzQkFBckIsS0FBSztnQkFLVSxXQUFXO3NCQUExQixLQUFLO2dCQUtVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBS1UsZ0JBQWdCO3NCQUEvQixLQUFLO2dCQUlVLFdBQVc7c0JBQTFCLEtBQUs7Z0JBS1Usb0JBQW9CO3NCQUFuQyxLQUFLO2dCQUNVLG1CQUFtQjtzQkFBbEMsS0FBSztnQkFLVSxrQkFBa0I7c0JBQWpDLEtBQUs7Z0JBQ1UsaUJBQWlCO3NCQUFoQyxLQUFLO2dCQUtVLG1CQUFtQjtzQkFBbEMsS0FBSztnQkFLVSxxQkFBcUI7c0JBQXBDLEtBQUs7Z0JBS1Usb0JBQW9CO3NCQUFuQyxLQUFLO2dCQUtVLGNBQWM7c0JBQTdCLEtBQUs7Z0JBS1UsWUFBWTtzQkFBM0IsS0FBSztnQkFLVSxVQUFVO3NCQUF6QixLQUFLO2dCQUVXLGVBQWU7c0JBQS9CLE1BQU07Z0JBQ1UsaUJBQWlCO3NCQUFqQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT3V0cHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNZW51SXRlbSB9IGZyb20gJy4uLy4uLy4uL2NvbnRyb2xzL21lbnUvbWVudS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBOYXZJdGVtIH0gZnJvbSAnLi4vLi4vLi4vY29udHJvbHMvbmF2aWdhdGlvbi9uYXYtaXRlbSc7XHJcbmltcG9ydCB7IE92ZXJsYXkgfSBmcm9tICcuLi8uLi8uLi9kaXNwbGF5L3ZpZXctb3ZlcmxheS92aWV3LW92ZXJsYXkuY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZWMtcGFnZS12aWV3JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vcGFnZS12aWV3LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9wYWdlLXZpZXcuY29tcG9uZW50LnNjc3MnXSxcclxuICBob3N0OiB7XHJcbiAgICBjbGFzczogXCJmbGV4LWdyb3dcIlxyXG4gIH1cclxufSlcclxuZXhwb3J0IGNsYXNzIFBhZ2VWaWV3Q29tcG9uZW50IHtcclxuICAvKipcclxuICAgKiBTZXQgdG8gdHJ1ZSB3aGVuIHBhZ2UtdmlldyBpcyBpbnNpZGUgYSBkaWFsb2cgdG8gYWRqdXN0IHN0eWxlcyBhbmQgaGlkZSBicmVhZGNydW1icy5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgaXNEaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogU2V0IHRvIHRydWUgdG8gZW5hYmxlIHJlYWQgb25seSBtb2RlLiBPbmx5IGEgc2luZ2xlIHNlY29uZGFyeSBhY3Rpb24gd2lsbCBiZSBhdmFpbGFibGVcclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogQ29udHJvbHMgT3ZlcmxheSB0aGF0IG1hc2tzIHRoZSBwYWdlIHZpZXcgY29udGVudC4gT25seSB0aGUgaGVhZGVyIGlzIG5vdCBtYXNrZWQgd2hlbiB0aGUgb3ZlcmxheSBpcyB2aXNpYmxlLiBEZWZhdWx0IGlzIHBlbmRpbmcgT3ZlcmxheSB3aXRoIG5vIG1lc3NhZ2VcclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgc3RhdHVzPzogT3ZlcmxheSA9IG5ldyBPdmVybGF5KCdwZW5kaW5nJyk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldCB0byBmYWxzZSB0byBoaWRlIHRoZSBlbnRpcmUgaGVhZGVyLCBpbmNsdWRpbmcgYnJlYWRjcnVtYnMgYW5kIGVycm9yIGJhbm5lci4gRGVmYXVsdCBpcyB0cnVlLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93SGVhZGVyOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGlzcGxheXMgYW4gZXJyb3IgYmFubmVyIHVuZGVyIHRoZSB0aXRsZWJhciB3aGVuIHByb3ZpZGVkIGEgdmFsdWUuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGVycm9ycz86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogQnJlYWRjcnVtYnMgdG8gYmUgZGlzcGxheWVkIGluIHRoZSBoZWFkZXIuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGJyZWFkY3J1bWJzPzogTmF2SXRlbVtdO1xyXG5cclxuICAvKipcclxuICAgKiBUaXRsZSBzZXR0aW5ncy4gUGFzc2VkIHRvIHRoZSBQYWdlVGl0bGVDb21wb25lbnQuXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIHRpdGxlPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB0aXRsZUljb24/OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgcHVibGljIHN1YlRpdGxlPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzdWJUaXRsZVVybD86IHN0cmluZztcclxuICBcclxuICAvKipcclxuICAgKiBMYWJlbCBmb3IgdGhlIGFjdGlvbnMgZHJvcGRvd24gaW4gdGhlIGhlYWRlci4gRGVmYXVsdCBpcyAnQWN0aW9ucydcclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgbW9yZUFjdGlvbnNMYWJlbD86IHN0cmluZyA9ICdBY3Rpb25zJztcclxuICAvKipcclxuICAgKiBPcHRpb25zIGZvciB0aGUgYWN0aW9ucyBkcm9wZG93biBpbiB0aGUgaGVhZGVyLiBUaGUgZHJvcGRvd24gaXMgaGlkZGVuIGlmIG5vdCBvcHRpb25zIGFyZSBwcm92aWRlZC5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgbW9yZUFjdGlvbnM/OiBNZW51SXRlbVtdO1xyXG5cclxuICAvKipcclxuICAgKiBMYWJlbCBmb3IgdGhlIHNlY29uZGFyeSBidXR0b24gaW4gdGhlIGhlYWRlci4gRGVmYXVsdCBpcyAnQ2FuY2VsJ1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzZWNvbmRhcnlBY3Rpb25MYWJlbD86IHN0cmluZyA9ICdDYW5jZWwnO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBoaWRlU2Vjb25kYXJ5QWN0aW9uID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIExhYmVsIGZvciB0aGUgcHJpbWFyeSBidXR0b24gaW4gdGhlIGhlYWRlci4gRGVmYXVsdCBpcyAnU2F2ZSdcclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgcHJpbWFyeUFjdGlvbkxhYmVsPzogc3RyaW5nID0gJ1NhdmUnO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBoaWRlUHJpbWFyeUFjdGlvbiA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBSZXBsYWNlcyB0aGUgdGl0bGUsIHN1YnRpdGxlIGFuZCB0aXRsZSBpY29uXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGN1c3RvbVRpdGxlVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG5cclxuICAvKipcclxuICAgKiBJbnNlcnRlZCB0byB0aGUgbGVmdCBvZiB0aGUgZGVmYXVsdCBhY3Rpb25zXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGN1c3RvbUFjdGlvbnNUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlcGxhY2VzIHRoZSB0aXRsZWJhciBhbmQgYWN0aW9ucyBvZiB0aGUgZGVmYXVsdCBoZWFkZXIuIEJyZWFkY3J1bWJzIGFuZCBlcnJvciBiYW5uZXIgYXJlIG5vdCByZXBsYWNlZC4gQ2Fubm90IGNvbnRhaW4gYSA8aGVhZGVyPiBlbGVtZW50LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21IZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XHJcblxyXG4gIC8qKlxyXG4gICAqIENvbnRlbnQgdG8gaW5jbHVkZSBpbiB0aGUgZm9vdGVyXHJcbiAgICovXHJcbiAgQElucHV0KCkgcHVibGljIGZvb3RlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcclxuXHJcbiAgLyoqIFxyXG4gICAqIFBpbnMgdGhlIGZvb3RlciB0byB0aGUgYm90dG9tIG9mIHRoZSB2aWV3IGFuZCBvdmVybGF5cyBhbnkgb3ZlcmZsb3dpbmcgY29udGVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHB1YmxpYyBzdGlja3lGb290ZXIgPSB0cnVlO1xyXG5cclxuICAvKipcclxuICAgKiBQcmV2ZW50cyBjb250ZW50IGZyb20gb3ZlcmZsb3dpbmcgdGhlIHZpZXcuIENvbnRlbnQgbXVzdCBtYW5hZ2Ugb3ZlcmZsb3cgaW5zdGVhZC5cclxuICAgKi9cclxuICBASW5wdXQoKSBwdWJsaWMgZml0Q29udGVudCA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgcHVibGljIG9uUHJpbWFyeUFjdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQE91dHB1dCgpIHB1YmxpYyBvblNlY29uZGFyeUFjdGlvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIHB1YmxpYyBwcmltYXJ5QWN0aW9uKGV2ZW50OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLm9uUHJpbWFyeUFjdGlvbikge1xyXG4gICAgICB0aGlzLm9uUHJpbWFyeUFjdGlvbi5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWNvbmRhcnlBY3Rpb24oZXZlbnQ6IGFueSkge1xyXG4gICAgaWYgKHRoaXMub25TZWNvbmRhcnlBY3Rpb24pIHtcclxuICAgICAgdGhpcy5vblNlY29uZGFyeUFjdGlvbi5lbWl0KGV2ZW50KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGRpdiBlY092ZXJsYXlcclxuICAgIFtzdGF0dXNdPVwic3RhdHVzPy5zdGF0dXNcIlxyXG4gICAgW21lc3NhZ2VdPVwic3RhdHVzPy5tZXNzYWdlXCJcclxuICAgIFtkaXNwbGF5QXNNYXNrXT1cInRydWVcIlxyXG4gICAgY2xhc3M9XCJiZy1ib2R5IGZsZXgtZ3JvdyBkLWZsZXhcIj5cclxuICAgIDxkaXYgaWQ9XCJQYWdlVmlld1Njcm9sbENvbnRhaW5lclwiIFxyXG4gICAgICAgICAgICBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBmbGV4LWdyb3cgc2Nyb2xsLXlcIiBcclxuICAgICAgICAgICAgW2NsYXNzLmlzLWRpYWxvZ109XCJpc0RpYWxvZ1wiXHJcbiAgICAgICAgICAgIFtjbGFzcy5maXQtY29udGVudF09XCJmaXRDb250ZW50XCJcclxuICAgICAgICAgICAgW2NsYXNzLnN0aWNreS1mb290ZXJdPVwic3RpY2t5Rm9vdGVyICYmICEhZm9vdGVyVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICBbY2xhc3Mub3ZlcmxheS12aXNpYmxlXT1cInN0YXR1cz8uc3RhdHVzICE9PSAnaGFzRGF0YSdcIlxyXG4gICAgICAgICAgICBbY2xhc3MuZm9vdGVyLXZpc2libGVdPVwiISFmb290ZXJUZW1wbGF0ZVwiPlxyXG4gICAgICAgIDxzZWN0aW9uPlxyXG4gICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+ICAgIFxyXG4gICAgICAgIDwvc2VjdGlvbj5cclxuICAgICAgICBcclxuICAgICAgICA8Zm9vdGVyICpuZ0lmPVwiZm9vdGVyVGVtcGxhdGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZvb3RlclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9mb290ZXI+XHJcblxyXG4gICAgICAgIDxoZWFkZXIgKm5nSWY9XCJzaG93SGVhZGVyXCI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIDxvbCBpZD1cImJyZWFkY3J1bWJzXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiYnJlYWRjcnVtYnM/Lmxlbmd0aCAmJiAhaXNEaWFsb2dcIj5cclxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgY3J1bWIgb2YgYnJlYWRjcnVtYnM7IGxhc3QgYXMgaXNMYXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGEgKm5nSWY9XCJjcnVtYi51cmw7IGVsc2UgbGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJjcnVtYi51cmxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxhYmVsXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbGFiZWw+e3tjcnVtYi5sYWJlbH19PC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDwvb2w+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhY3VzdG9tSGVhZGVyVGVtcGxhdGU7IGVsc2UgY3VzdG9tSGVhZGVyT3V0bGV0XCIgY2xhc3M9XCJ0aXRsZWJhclwiPlxyXG4gICAgICAgICAgICAgICAgPGFwcC1wYWdlLXRpdGxlICpuZ0lmPVwiIWN1c3RvbVRpdGxlVGVtcGxhdGU7IGVsc2UgY3VzdG9tVGl0bGVcIiBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVdPVwidGl0bGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdWJUaXRsZV09XCJzdWJUaXRsZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1YlRpdGxlVXJsXT1cInN1YlRpdGxlVXJsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdGl0bGVJY29uXT1cInRpdGxlSWNvblwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0aXRsZSB0ZXh0LXRydW5jYXRlXCI+XHJcbiAgICAgICAgICAgICAgICA8L2FwcC1wYWdlLXRpdGxlPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VzdG9tVGl0bGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpdGxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UaXRsZVRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGVjLWJ1dHRvbiBpZD1cInByaW1hcnlBY3Rpb25cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhaGlkZVByaW1hcnlBY3Rpb24gJiYgb25QcmltYXJ5QWN0aW9uLm9ic2VydmVycz8ubGVuZ3RoICYmICFyZWFkb25seVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInN0YXR1cz8uc3RhdHVzID09PSAncGVuZGluZydcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJwcmltYXJ5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwicHJpbWFyeUFjdGlvbkxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2tlZCk9XCJwcmltYXJ5QWN0aW9uKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2VjLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZWMtYnV0dG9uIGlkPVwic2Vjb25kYXJ5QWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiIWhpZGVTZWNvbmRhcnlBY3Rpb24gJiYgb25TZWNvbmRhcnlBY3Rpb24ub2JzZXJ2ZXJzPy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsYWJlbF09XCJyZWFkb25seSA/ICdDbG9zZScgOiBzZWNvbmRhcnlBY3Rpb25MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrZWQpPVwic2Vjb25kYXJ5QWN0aW9uKCRldmVudClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2VjLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8ZWMtZHJvcGRvd24gaWQ9XCJtb3JlQWN0aW9uc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwibW9yZUFjdGlvbnM/Lmxlbmd0aCAmJiAhcmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwic3RhdHVzPy5zdGF0dXMgPT09ICdwZW5kaW5nJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWwtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvblR5cGU9XCJzZWNvbmRhcnlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwibW9yZUFjdGlvbnNMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJtb3JlQWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZWMtZHJvcGRvd24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbUFjdGlvbnNUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1c3RvbUhlYWRlck91dGxldD4gICBcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYWdlLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21IZWFkZXJUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgXHJcbiAgICAgICAgICAgIDxlYy1iYW5uZXIgKm5nSWY9XCJlcnJvcnNcIlxyXG4gICAgICAgICAgICAgICAgICAgaWQ9XCJwYWdlVmlld0Vycm9yc1wiXHJcbiAgICAgICAgICAgICAgICAgICBbY2xhc3MuYm9yZGVyLWJvdHRvbS0wXT1cIiFpc0RpYWxvZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBbaW5uZXJIdG1sXT1cImVycm9yc1wiPjwvZGl2PlxyXG4gICAgICAgICAgICA8L2VjLWJhbm5lcj5cclxuICAgICAgICA8L2hlYWRlcj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbiJdfQ==
|