@igo2/common 17.0.0-next.0 → 17.0.0-next.10
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/action/actionbar/actionbar-item.component.d.ts +75 -0
- package/action/actionbar/actionbar.component.d.ts +148 -0
- package/action/index.d.ts +5 -0
- package/action/public_api.d.ts +4 -0
- package/action/shared/action.interfaces.d.ts +18 -0
- package/action/shared/store.d.ts +8 -0
- package/action/src/action.theming.scss +5 -0
- package/action/src/actionbar/actionbar-item.theming.scss +32 -0
- package/action/src/actionbar/actionbar.theming.scss +22 -0
- package/backdrop/index.d.ts +5 -0
- package/backdrop/public_api.d.ts +2 -0
- package/badge/badge-icon.directive.d.ts +34 -0
- package/badge/index.d.ts +5 -0
- package/badge/public_api.d.ts +2 -0
- package/clickout/index.d.ts +5 -0
- package/clickout/public_api.d.ts +2 -0
- package/clone/index.d.ts +5 -0
- package/clone/public_api.d.ts +2 -0
- package/collapsible/index.d.ts +5 -0
- package/collapsible/public_api.d.ts +6 -0
- package/collapsible/src/collapsible.theming.scss +22 -0
- package/color/color-picker-form-field/index.d.ts +2 -0
- package/color/index.d.ts +5 -0
- package/color/public_api.d.ts +1 -0
- package/confirm-dialog/index.d.ts +5 -0
- package/confirm-dialog/public_api.d.ts +4 -0
- package/context-menu/index.d.ts +5 -0
- package/context-menu/public_api.d.ts +6 -0
- package/custom-html/index.d.ts +5 -0
- package/custom-html/public_api.d.ts +6 -0
- package/dom/index.d.ts +5 -0
- package/dom/public_api.d.ts +3 -0
- package/drag-drop/index.d.ts +5 -0
- package/drag-drop/public_api.d.ts +2 -0
- package/dynamic-component/index.d.ts +5 -0
- package/dynamic-component/public_api.d.ts +4 -0
- package/entity/entity-selector/index.d.ts +2 -0
- package/entity/entity-table/index.d.ts +2 -0
- package/entity/entity-table-paginator/entity-table-paginator.component.d.ts +50 -0
- package/entity/entity-table-paginator/index.d.ts +3 -0
- package/entity/entity.module.d.ts +16 -0
- package/entity/index.d.ts +5 -0
- package/entity/public_api.d.ts +5 -0
- package/entity/shared/transaction.d.ts +179 -0
- package/entity/src/entity-selector/entity-selector.theming.scss +21 -0
- package/entity/src/entity-table/entity-table.theming.scss +37 -0
- package/entity/src/entity.theming.scss +7 -0
- package/environment/index.d.ts +5 -0
- package/esm2022/action/action.module.mjs +19 -0
- package/esm2022/action/actionbar/actionbar-item.component.mjs +192 -0
- package/esm2022/action/actionbar/actionbar.component.mjs +277 -0
- package/esm2022/action/actionbar/actionbar.module.mjs +19 -0
- package/esm2022/action/igo2-common-action.mjs +5 -0
- package/esm2022/action/public_api.mjs +5 -0
- package/esm2022/action/shared/action.enums.mjs +7 -0
- package/esm2022/action/shared/action.interfaces.mjs +2 -0
- package/esm2022/action/shared/index.mjs +4 -0
- package/esm2022/action/shared/store.mjs +8 -0
- package/esm2022/backdrop/backdrop.component.mjs +22 -0
- package/esm2022/backdrop/backdrop.module.mjs +25 -0
- package/esm2022/backdrop/igo2-common-backdrop.mjs +5 -0
- package/esm2022/backdrop/public_api.mjs +3 -0
- package/esm2022/badge/badge-icon.directive.mjs +149 -0
- package/esm2022/badge/badge-icon.module.mjs +25 -0
- package/esm2022/badge/igo2-common-badge.mjs +5 -0
- package/esm2022/badge/public_api.mjs +3 -0
- package/esm2022/clickout/clickout.directive.mjs +32 -0
- package/esm2022/clickout/clickout.module.mjs +25 -0
- package/esm2022/clickout/igo2-common-clickout.mjs +5 -0
- package/esm2022/clickout/public_api.mjs +3 -0
- package/esm2022/clone/clone.module.mjs +25 -0
- package/esm2022/clone/clone.pipe.mjs +25 -0
- package/esm2022/clone/igo2-common-clone.mjs +5 -0
- package/esm2022/clone/public_api.mjs +3 -0
- package/esm2022/collapsible/collapse.directive.mjs +57 -0
- package/esm2022/collapsible/collapsible.component.mjs +38 -0
- package/esm2022/collapsible/collapsible.module.mjs +26 -0
- package/esm2022/collapsible/igo2-common-collapsible.mjs +5 -0
- package/esm2022/collapsible/public_api.mjs +10 -0
- package/esm2022/color/color-picker-form-field/color-picker-form-field.component.mjs +104 -0
- package/esm2022/color/color-picker-form-field/color-picker-form-field.module.mjs +19 -0
- package/esm2022/color/color-picker-form-field/index.mjs +3 -0
- package/esm2022/color/igo2-common-color.mjs +5 -0
- package/esm2022/color/public_api.mjs +2 -0
- package/esm2022/confirm-dialog/confirm-dialog.component.mjs +31 -0
- package/esm2022/confirm-dialog/confirm-dialog.interface.mjs +2 -0
- package/esm2022/confirm-dialog/confirm-dialog.module.mjs +27 -0
- package/esm2022/confirm-dialog/confirm-dialog.service.mjs +35 -0
- package/esm2022/confirm-dialog/igo2-common-confirm-dialog.mjs +5 -0
- package/esm2022/confirm-dialog/public_api.mjs +5 -0
- package/esm2022/context-menu/context-menu.directive.mjs +109 -0
- package/esm2022/context-menu/context-menu.module.mjs +26 -0
- package/esm2022/context-menu/igo2-common-context-menu.mjs +5 -0
- package/esm2022/context-menu/long-press.directive.mjs +66 -0
- package/esm2022/context-menu/public_api.mjs +10 -0
- package/esm2022/custom-html/custom-html.component.mjs +22 -0
- package/esm2022/custom-html/custom-html.module.mjs +25 -0
- package/esm2022/custom-html/custom-html.pipe.mjs +23 -0
- package/esm2022/custom-html/igo2-common-custom-html.mjs +5 -0
- package/esm2022/custom-html/public_api.mjs +10 -0
- package/esm2022/dom/dom.interfaces.mjs +2 -0
- package/esm2022/dom/dom.module.mjs +27 -0
- package/esm2022/dom/dom.service.mjs +35 -0
- package/esm2022/dom/igo2-common-dom.mjs +5 -0
- package/esm2022/dom/public_api.mjs +4 -0
- package/esm2022/drag-drop/drag-drop.directive.mjs +82 -0
- package/esm2022/drag-drop/drag-drop.module.mjs +25 -0
- package/esm2022/drag-drop/igo2-common-drag-drop.mjs +5 -0
- package/esm2022/drag-drop/public_api.mjs +3 -0
- package/esm2022/dynamic-component/dynamic-component.module.mjs +19 -0
- package/esm2022/dynamic-component/dynamic-outlet/dynamic-outlet.component.mjs +129 -0
- package/esm2022/dynamic-component/dynamic-outlet/dynamic-outlet.module.mjs +19 -0
- package/esm2022/dynamic-component/igo2-common-dynamic-component.mjs +5 -0
- package/esm2022/dynamic-component/public_api.mjs +5 -0
- package/esm2022/dynamic-component/shared/dynamic-component.interfaces.mjs +2 -0
- package/esm2022/dynamic-component/shared/dynamic-component.mjs +183 -0
- package/esm2022/dynamic-component/shared/dynamic-component.service.mjs +30 -0
- package/esm2022/dynamic-component/shared/index.mjs +4 -0
- package/esm2022/entity/entity-selector/entity-selector.component.mjs +174 -0
- package/esm2022/entity/entity-selector/entity-selector.module.mjs +19 -0
- package/esm2022/entity/entity-selector/index.mjs +3 -0
- package/esm2022/entity/entity-table/entity-table-row.directive.mjs +138 -0
- package/esm2022/entity/entity-table/entity-table.component.mjs +883 -0
- package/esm2022/entity/entity-table/entity-table.module.mjs +19 -0
- package/esm2022/entity/entity-table/index.mjs +3 -0
- package/esm2022/entity/entity-table-paginator/entity-table-paginator.component.mjs +158 -0
- package/esm2022/entity/entity-table-paginator/entity-table-paginator.interface.mjs +2 -0
- package/esm2022/entity/entity-table-paginator/entity-table-paginator.module.mjs +19 -0
- package/esm2022/entity/entity-table-paginator/index.mjs +4 -0
- package/esm2022/entity/entity.module.mjs +30 -0
- package/esm2022/entity/igo2-common-entity.mjs +5 -0
- package/esm2022/entity/public_api.mjs +6 -0
- package/esm2022/entity/shared/entity.enums.mjs +28 -0
- package/esm2022/entity/shared/entity.interfaces.mjs +2 -0
- package/esm2022/entity/shared/entity.utils.mjs +73 -0
- package/esm2022/entity/shared/index.mjs +10 -0
- package/esm2022/entity/shared/state.mjs +194 -0
- package/esm2022/entity/shared/store.mjs +322 -0
- package/esm2022/entity/shared/strategies/filter-custom-function.mjs +80 -0
- package/esm2022/entity/shared/strategies/filter-selection.mjs +81 -0
- package/esm2022/entity/shared/strategies/index.mjs +4 -0
- package/esm2022/entity/shared/strategies/strategy.mjs +78 -0
- package/esm2022/entity/shared/transaction.mjs +329 -0
- package/esm2022/entity/shared/view.mjs +330 -0
- package/esm2022/entity/shared/watcher.mjs +135 -0
- package/esm2022/environment/environment.interface.mjs +2 -0
- package/esm2022/environment/igo2-common-environment.mjs +5 -0
- package/esm2022/environment/public_api.mjs +2 -0
- package/esm2022/flexible/flexible.component.mjs +135 -0
- package/esm2022/flexible/flexible.module.mjs +25 -0
- package/esm2022/flexible/flexible.type.mjs +2 -0
- package/esm2022/flexible/igo2-common-flexible.mjs +5 -0
- package/esm2022/flexible/public_api.mjs +4 -0
- package/esm2022/form/form/form.component.mjs +103 -0
- package/esm2022/form/form/form.module.mjs +19 -0
- package/esm2022/form/form/index.mjs +3 -0
- package/esm2022/form/form-dialog/form-dialog.component.mjs +94 -0
- package/esm2022/form/form-dialog/form-dialog.interface.mjs +2 -0
- package/esm2022/form/form-dialog/form-dialog.module.mjs +31 -0
- package/esm2022/form/form-dialog/form-dialog.service.mjs +30 -0
- package/esm2022/form/form-dialog/index.mjs +5 -0
- package/esm2022/form/form-field/form-field-select.component.mjs +117 -0
- package/esm2022/form/form-field/form-field-text.component.mjs +126 -0
- package/esm2022/form/form-field/form-field-textarea.component.mjs +95 -0
- package/esm2022/form/form-field/form-field.component.mjs +65 -0
- package/esm2022/form/form-field/form-field.directive.mjs +11 -0
- package/esm2022/form/form-field/form-field.module.mjs +23 -0
- package/esm2022/form/form-field/index.mjs +7 -0
- package/esm2022/form/form-group/form-group.component.mjs +82 -0
- package/esm2022/form/form-group/form-group.module.mjs +19 -0
- package/esm2022/form/form-group/index.mjs +3 -0
- package/esm2022/form/form.module.mjs +32 -0
- package/esm2022/form/igo2-common-form.mjs +5 -0
- package/esm2022/form/public_api.mjs +7 -0
- package/esm2022/form/shared/form-field-component.mjs +7 -0
- package/esm2022/form/shared/form-field.service.mjs +29 -0
- package/esm2022/form/shared/form.interfaces.mjs +2 -0
- package/esm2022/form/shared/form.service.mjs +82 -0
- package/esm2022/form/shared/form.utils.mjs +41 -0
- package/esm2022/form/shared/index.mjs +6 -0
- package/esm2022/home-button/home-button.component.mjs +26 -0
- package/esm2022/home-button/home-button.module.mjs +19 -0
- package/esm2022/home-button/igo2-common-home-button.mjs +5 -0
- package/esm2022/home-button/public_api.mjs +3 -0
- package/esm2022/icon/icon/icon.component.mjs +38 -0
- package/esm2022/icon/icon.provider.mjs +14 -0
- package/esm2022/icon/igo2-common-icon.mjs +5 -0
- package/esm2022/icon/public_api.mjs +4 -0
- package/esm2022/icon/shared/icon.interface.mjs +2 -0
- package/esm2022/icon/shared/icon.service.mjs +26 -0
- package/esm2022/icon/shared/icons.mjs +32 -0
- package/esm2022/icon/shared/index.mjs +4 -0
- package/esm2022/image/igo2-common-image.mjs +5 -0
- package/esm2022/image/image-error.directive.mjs +35 -0
- package/esm2022/image/image.module.mjs +26 -0
- package/esm2022/image/public_api.mjs +7 -0
- package/esm2022/image/secure-image.pipe.mjs +66 -0
- package/esm2022/interactive-tour/igo2-common-interactive-tour.mjs +5 -0
- package/esm2022/interactive-tour/interactive-tour.component.mjs +133 -0
- package/esm2022/interactive-tour/interactive-tour.interface.mjs +2 -0
- package/esm2022/interactive-tour/interactive-tour.loader.mjs +49 -0
- package/esm2022/interactive-tour/interactive-tour.module.mjs +19 -0
- package/esm2022/interactive-tour/interactive-tour.service.mjs +303 -0
- package/esm2022/interactive-tour/public_api.mjs +6 -0
- package/esm2022/json-dialog/igo2-common-json-dialog.mjs +5 -0
- package/esm2022/json-dialog/json-dialog.component.mjs +38 -0
- package/esm2022/json-dialog/json-dialog.module.mjs +26 -0
- package/esm2022/json-dialog/json-dialog.service.mjs +26 -0
- package/esm2022/json-dialog/public_api.mjs +4 -0
- package/esm2022/keyvalue/igo2-common-keyvalue.mjs +5 -0
- package/esm2022/keyvalue/keyvalue.module.mjs +25 -0
- package/esm2022/keyvalue/keyvalue.pipe.mjs +19 -0
- package/esm2022/keyvalue/public_api.mjs +3 -0
- package/esm2022/list/igo2-common-list.mjs +5 -0
- package/esm2022/list/list-item.directive.mjs +166 -0
- package/esm2022/list/list.component.mjs +252 -0
- package/esm2022/list/list.module.mjs +26 -0
- package/esm2022/list/public_api.mjs +7 -0
- package/esm2022/panel/igo2-common-panel.mjs +5 -0
- package/esm2022/panel/panel.component.mjs +30 -0
- package/esm2022/panel/panel.module.mjs +19 -0
- package/esm2022/panel/public_api.mjs +3 -0
- package/esm2022/public_api.mjs +17 -78
- package/esm2022/select-value-dialog/igo2-common-select-value-dialog.mjs +5 -0
- package/esm2022/select-value-dialog/public_api.mjs +6 -0
- package/esm2022/select-value-dialog/select-value-check-radio-dialog.component.mjs +103 -0
- package/esm2022/select-value-dialog/select-value-dialog.enums.mjs +6 -0
- package/esm2022/select-value-dialog/select-value-dialog.interface.mjs +2 -0
- package/esm2022/select-value-dialog/select-value-dialog.module.mjs +27 -0
- package/esm2022/select-value-dialog/select-value-dialog.service.mjs +29 -0
- package/esm2022/sidenav/igo2-common-sidenav.mjs +5 -0
- package/esm2022/sidenav/public_api.mjs +3 -0
- package/esm2022/sidenav/sidenav-shim.directive.mjs +58 -0
- package/esm2022/sidenav/sidenav.module.mjs +25 -0
- package/esm2022/spinner/igo2-common-spinner.mjs +5 -0
- package/esm2022/spinner/public_api.mjs +4 -0
- package/esm2022/spinner/spinner-activity.directive.mjs +56 -0
- package/esm2022/spinner/spinner.component.mjs +30 -0
- package/esm2022/spinner/spinner.module.mjs +26 -0
- package/esm2022/stop-propagation/igo2-common-stop-propagation.mjs +5 -0
- package/esm2022/stop-propagation/public_api.mjs +10 -0
- package/esm2022/stop-propagation/stop-drop-propagation.directive.mjs +21 -0
- package/esm2022/stop-propagation/stop-propagation.directive.mjs +20 -0
- package/esm2022/stop-propagation/stop-propagation.module.mjs +26 -0
- package/esm2022/table/igo2-common-table.mjs +5 -0
- package/esm2022/table/public_api.mjs +7 -0
- package/esm2022/table/table-action-color.enum.mjs +7 -0
- package/esm2022/table/table-database.mjs +28 -0
- package/esm2022/table/table-datasource.mjs +64 -0
- package/esm2022/table/table-model.interface.mjs +2 -0
- package/esm2022/table/table.component.mjs +143 -0
- package/esm2022/table/table.module.mjs +25 -0
- package/esm2022/tool/igo2-common-tool.mjs +5 -0
- package/esm2022/tool/public_api.mjs +4 -0
- package/esm2022/tool/shared/index.mjs +6 -0
- package/esm2022/tool/shared/tool-component.mjs +9 -0
- package/esm2022/tool/shared/tool.interface.mjs +2 -0
- package/esm2022/tool/shared/tool.service.mjs +43 -0
- package/esm2022/tool/shared/toolbox.enums.mjs +2 -0
- package/esm2022/tool/shared/toolbox.mjs +192 -0
- package/esm2022/tool/tool.module.mjs +28 -0
- package/esm2022/tool/toolbox/index.mjs +3 -0
- package/esm2022/tool/toolbox/toolbox.animation.mjs +10 -0
- package/esm2022/tool/toolbox/toolbox.component.mjs +241 -0
- package/esm2022/tool/toolbox/toolbox.module.mjs +19 -0
- package/esm2022/widget/igo2-common-widget.mjs +5 -0
- package/esm2022/widget/public_api.mjs +4 -0
- package/esm2022/widget/shared/index.mjs +4 -0
- package/esm2022/widget/shared/widget.interfaces.mjs +2 -0
- package/esm2022/widget/shared/widget.mjs +4 -0
- package/esm2022/widget/shared/widget.service.mjs +22 -0
- package/esm2022/widget/widget-outlet/index.mjs +3 -0
- package/esm2022/widget/widget-outlet/widget-outlet.component.mjs +113 -0
- package/esm2022/widget/widget-outlet/widget-outlet.module.mjs +19 -0
- package/esm2022/widget/widget.module.mjs +22 -0
- package/esm2022/workspace/igo2-common-workspace.mjs +5 -0
- package/esm2022/workspace/public_api.mjs +5 -0
- package/esm2022/workspace/shared/index.mjs +4 -0
- package/esm2022/workspace/shared/store.mjs +37 -0
- package/esm2022/workspace/shared/workspace.interfaces.mjs +2 -0
- package/esm2022/workspace/shared/workspace.mjs +143 -0
- package/esm2022/workspace/workspace-selector/index.mjs +3 -0
- package/esm2022/workspace/workspace-selector/workspace-selector.component.mjs +51 -0
- package/esm2022/workspace/workspace-selector/workspace-selector.module.mjs +19 -0
- package/esm2022/workspace/workspace-widget-outlet/index.mjs +3 -0
- package/esm2022/workspace/workspace-widget-outlet/workspace-widget-outlet.component.mjs +74 -0
- package/esm2022/workspace/workspace-widget-outlet/workspace-widget-outlet.module.mjs +19 -0
- package/esm2022/workspace/workspace.module.mjs +27 -0
- package/fesm2022/igo2-common-action.mjs +505 -0
- package/fesm2022/igo2-common-action.mjs.map +1 -0
- package/fesm2022/igo2-common-backdrop.mjs +51 -0
- package/fesm2022/igo2-common-backdrop.mjs.map +1 -0
- package/fesm2022/igo2-common-badge.mjs +178 -0
- package/fesm2022/igo2-common-badge.mjs.map +1 -0
- package/fesm2022/igo2-common-clickout.mjs +61 -0
- package/fesm2022/igo2-common-clickout.mjs.map +1 -0
- package/fesm2022/igo2-common-clone.mjs +54 -0
- package/fesm2022/igo2-common-clone.mjs.map +1 -0
- package/fesm2022/igo2-common-collapsible.mjs +126 -0
- package/fesm2022/igo2-common-collapsible.mjs.map +1 -0
- package/fesm2022/igo2-common-color.mjs +127 -0
- package/fesm2022/igo2-common-color.mjs.map +1 -0
- package/fesm2022/igo2-common-confirm-dialog.mjs +91 -0
- package/fesm2022/igo2-common-confirm-dialog.mjs.map +1 -0
- package/fesm2022/igo2-common-context-menu.mjs +206 -0
- package/fesm2022/igo2-common-context-menu.mjs.map +1 -0
- package/fesm2022/igo2-common-custom-html.mjs +74 -0
- package/fesm2022/igo2-common-custom-html.mjs.map +1 -0
- package/fesm2022/igo2-common-dom.mjs +65 -0
- package/fesm2022/igo2-common-dom.mjs.map +1 -0
- package/fesm2022/igo2-common-drag-drop.mjs +111 -0
- package/fesm2022/igo2-common-drag-drop.mjs.map +1 -0
- package/fesm2022/igo2-common-dynamic-component.mjs +375 -0
- package/fesm2022/igo2-common-dynamic-component.mjs.map +1 -0
- package/fesm2022/igo2-common-entity.mjs +3036 -0
- package/fesm2022/igo2-common-entity.mjs.map +1 -0
- package/fesm2022/igo2-common-environment.mjs +4 -0
- package/fesm2022/igo2-common-environment.mjs.map +1 -0
- package/fesm2022/igo2-common-flexible.mjs +163 -0
- package/fesm2022/igo2-common-flexible.mjs.map +1 -0
- package/fesm2022/igo2-common-form.mjs +898 -0
- package/fesm2022/igo2-common-form.mjs.map +1 -0
- package/fesm2022/igo2-common-home-button.mjs +49 -0
- package/fesm2022/igo2-common-home-button.mjs.map +1 -0
- package/fesm2022/igo2-common-icon.mjs +108 -0
- package/fesm2022/igo2-common-icon.mjs.map +1 -0
- package/fesm2022/igo2-common-image.mjs +129 -0
- package/fesm2022/igo2-common-image.mjs.map +1 -0
- package/fesm2022/igo2-common-interactive-tour.mjs +490 -0
- package/fesm2022/igo2-common-interactive-tour.mjs.map +1 -0
- package/fesm2022/igo2-common-json-dialog.mjs +88 -0
- package/fesm2022/igo2-common-json-dialog.mjs.map +1 -0
- package/fesm2022/igo2-common-keyvalue.mjs +48 -0
- package/fesm2022/igo2-common-keyvalue.mjs.map +1 -0
- package/fesm2022/igo2-common-list.mjs +446 -0
- package/fesm2022/igo2-common-list.mjs.map +1 -0
- package/fesm2022/igo2-common-panel.mjs +53 -0
- package/fesm2022/igo2-common-panel.mjs.map +1 -0
- package/fesm2022/igo2-common-select-value-dialog.mjs +161 -0
- package/fesm2022/igo2-common-select-value-dialog.mjs.map +1 -0
- package/fesm2022/igo2-common-sidenav.mjs +86 -0
- package/fesm2022/igo2-common-sidenav.mjs.map +1 -0
- package/fesm2022/igo2-common-spinner.mjs +110 -0
- package/fesm2022/igo2-common-spinner.mjs.map +1 -0
- package/fesm2022/igo2-common-stop-propagation.mjs +73 -0
- package/fesm2022/igo2-common-stop-propagation.mjs.map +1 -0
- package/fesm2022/igo2-common-table.mjs +264 -0
- package/fesm2022/igo2-common-table.mjs.map +1 -0
- package/fesm2022/igo2-common-tool.mjs +535 -0
- package/fesm2022/igo2-common-tool.mjs.map +1 -0
- package/fesm2022/igo2-common-widget.mjs +176 -0
- package/fesm2022/igo2-common-widget.mjs.map +1 -0
- package/fesm2022/igo2-common-workspace.mjs +361 -0
- package/fesm2022/igo2-common-workspace.mjs.map +1 -0
- package/fesm2022/igo2-common.mjs +16 -8751
- package/fesm2022/igo2-common.mjs.map +1 -1
- package/flexible/flexible.component.d.ts +41 -0
- package/flexible/index.d.ts +5 -0
- package/flexible/public_api.d.ts +3 -0
- package/form/form/index.d.ts +2 -0
- package/form/form-dialog/form-dialog.component.d.ts +23 -0
- package/form/form-dialog/form-dialog.interface.d.ts +18 -0
- package/form/form-dialog/index.d.ts +4 -0
- package/form/form-field/form-field.directive.d.ts +5 -0
- package/form/form-field/index.d.ts +6 -0
- package/form/form-group/index.d.ts +2 -0
- package/form/form.module.d.ts +18 -0
- package/form/index.d.ts +5 -0
- package/form/public_api.d.ts +6 -0
- package/home-button/index.d.ts +5 -0
- package/home-button/public_api.d.ts +2 -0
- package/home-button/src/home-button.theming.scss +18 -0
- package/icon/icon/icon.component.d.ts +14 -0
- package/icon/icon.provider.d.ts +4 -0
- package/icon/index.d.ts +5 -0
- package/icon/public_api.d.ts +3 -0
- package/icon/shared/icon.interface.d.ts +4 -0
- package/icon/shared/icon.service.d.ts +12 -0
- package/icon/shared/icons.d.ts +9 -0
- package/icon/shared/index.d.ts +3 -0
- package/image/index.d.ts +5 -0
- package/image/public_api.d.ts +6 -0
- package/image/secure-image.pipe.d.ts +13 -0
- package/interactive-tour/index.d.ts +5 -0
- package/interactive-tour/interactive-tour.component.d.ts +33 -0
- package/interactive-tour/interactive-tour.loader.d.ts +18 -0
- package/interactive-tour/interactive-tour.service.d.ts +31 -0
- package/interactive-tour/public_api.d.ts +5 -0
- package/interactive-tour/src/interactive-tour.theming.scss +32 -0
- package/json-dialog/index.d.ts +5 -0
- package/json-dialog/public_api.d.ts +3 -0
- package/keyvalue/index.d.ts +5 -0
- package/keyvalue/public_api.d.ts +2 -0
- package/list/index.d.ts +5 -0
- package/list/public_api.d.ts +6 -0
- package/list/src/list.theming.scss +58 -0
- package/package.json +201 -3
- package/panel/index.d.ts +5 -0
- package/panel/public_api.d.ts +2 -0
- package/panel/src/panel.theming.scss +30 -0
- package/public_api.d.ts +16 -77
- package/select-value-dialog/index.d.ts +5 -0
- package/select-value-dialog/public_api.d.ts +5 -0
- package/select-value-dialog/select-value-check-radio-dialog.component.d.ts +25 -0
- package/sidenav/index.d.ts +5 -0
- package/sidenav/public_api.d.ts +2 -0
- package/spinner/index.d.ts +5 -0
- package/spinner/public_api.d.ts +3 -0
- package/spinner/spinner-activity.directive.d.ts +32 -0
- package/spinner/spinner.module.d.ts +14 -0
- package/src/common-theme.scss +19 -19
- package/stop-propagation/index.d.ts +5 -0
- package/stop-propagation/public_api.d.ts +6 -0
- package/table/index.d.ts +5 -0
- package/table/public_api.d.ts +6 -0
- package/tool/index.d.ts +5 -0
- package/tool/public_api.d.ts +3 -0
- package/tool/shared/tool.interface.d.ts +18 -0
- package/tool/shared/toolbox.d.ts +98 -0
- package/tool/src/tool.theming.scss +5 -0
- package/tool/src/toolbox/toolbox.theming.scss +105 -0
- package/tool/toolbox/index.d.ts +2 -0
- package/tool/toolbox/toolbox.component.d.ts +128 -0
- package/widget/index.d.ts +5 -0
- package/widget/public_api.d.ts +3 -0
- package/widget/shared/widget.d.ts +4 -0
- package/widget/shared/widget.service.d.ts +10 -0
- package/widget/widget-outlet/index.d.ts +2 -0
- package/widget/widget-outlet/widget-outlet.component.d.ts +71 -0
- package/workspace/index.d.ts +5 -0
- package/workspace/public_api.d.ts +4 -0
- package/workspace/shared/store.d.ts +20 -0
- package/workspace/shared/workspace.d.ts +108 -0
- package/workspace/shared/workspace.interfaces.d.ts +11 -0
- package/workspace/workspace-selector/index.d.ts +2 -0
- package/workspace/workspace-selector/workspace-selector.component.d.ts +38 -0
- package/workspace/workspace-widget-outlet/index.d.ts +2 -0
- package/workspace/workspace-widget-outlet/workspace-widget-outlet.component.d.ts +57 -0
- package/workspace/workspace.module.d.ts +14 -0
- package/esm2022/lib/action/action.module.mjs +0 -19
- package/esm2022/lib/action/actionbar/actionbar-item.component.mjs +0 -206
- package/esm2022/lib/action/actionbar/actionbar.component.mjs +0 -277
- package/esm2022/lib/action/actionbar/actionbar.module.mjs +0 -19
- package/esm2022/lib/action/index.mjs +0 -3
- package/esm2022/lib/action/shared/action.enums.mjs +0 -7
- package/esm2022/lib/action/shared/action.interfaces.mjs +0 -2
- package/esm2022/lib/action/shared/index.mjs +0 -4
- package/esm2022/lib/action/shared/store.mjs +0 -8
- package/esm2022/lib/backdrop/backdrop.component.mjs +0 -22
- package/esm2022/lib/backdrop/backdrop.module.mjs +0 -25
- package/esm2022/lib/backdrop/index.mjs +0 -2
- package/esm2022/lib/badge-icon/badge-icon.directive.mjs +0 -152
- package/esm2022/lib/badge-icon/badge-icon.module.mjs +0 -25
- package/esm2022/lib/badge-icon/index.mjs +0 -2
- package/esm2022/lib/clickout/clickout.directive.mjs +0 -32
- package/esm2022/lib/clickout/clickout.module.mjs +0 -25
- package/esm2022/lib/clickout/index.mjs +0 -2
- package/esm2022/lib/clone/clone.module.mjs +0 -25
- package/esm2022/lib/clone/clone.pipe.mjs +0 -25
- package/esm2022/lib/clone/index.mjs +0 -2
- package/esm2022/lib/collapsible/collapse.directive.mjs +0 -57
- package/esm2022/lib/collapsible/collapsible.component.mjs +0 -38
- package/esm2022/lib/collapsible/collapsible.module.mjs +0 -26
- package/esm2022/lib/collapsible/index.mjs +0 -9
- package/esm2022/lib/color-picker-form-field/color-picker-form-field.component.mjs +0 -104
- package/esm2022/lib/color-picker-form-field/color-picker-form-field.module.mjs +0 -19
- package/esm2022/lib/color-picker-form-field/index.mjs +0 -2
- package/esm2022/lib/confirm-dialog/confirm-dialog.component.mjs +0 -31
- package/esm2022/lib/confirm-dialog/confirm-dialog.interface.mjs +0 -2
- package/esm2022/lib/confirm-dialog/confirm-dialog.module.mjs +0 -27
- package/esm2022/lib/confirm-dialog/confirm-dialog.service.mjs +0 -35
- package/esm2022/lib/confirm-dialog/index.mjs +0 -4
- package/esm2022/lib/context-menu/context-menu.directive.mjs +0 -109
- package/esm2022/lib/context-menu/context-menu.module.mjs +0 -26
- package/esm2022/lib/context-menu/index.mjs +0 -9
- package/esm2022/lib/context-menu/long-press.directive.mjs +0 -66
- package/esm2022/lib/custom-html/custom-html.component.mjs +0 -22
- package/esm2022/lib/custom-html/custom-html.module.mjs +0 -25
- package/esm2022/lib/custom-html/custom-html.pipe.mjs +0 -23
- package/esm2022/lib/custom-html/index.mjs +0 -9
- package/esm2022/lib/dom/dom.interfaces.mjs +0 -2
- package/esm2022/lib/dom/dom.module.mjs +0 -27
- package/esm2022/lib/dom/dom.service.mjs +0 -35
- package/esm2022/lib/dom/index.mjs +0 -3
- package/esm2022/lib/drag-drop/drag-drop.directive.mjs +0 -82
- package/esm2022/lib/drag-drop/drag-drop.module.mjs +0 -25
- package/esm2022/lib/drag-drop/index.mjs +0 -2
- package/esm2022/lib/dynamic-component/dynamic-component.module.mjs +0 -19
- package/esm2022/lib/dynamic-component/dynamic-outlet/dynamic-outlet.component.mjs +0 -129
- package/esm2022/lib/dynamic-component/dynamic-outlet/dynamic-outlet.module.mjs +0 -19
- package/esm2022/lib/dynamic-component/index.mjs +0 -3
- package/esm2022/lib/dynamic-component/shared/dynamic-component.interfaces.mjs +0 -2
- package/esm2022/lib/dynamic-component/shared/dynamic-component.mjs +0 -183
- package/esm2022/lib/dynamic-component/shared/dynamic-component.service.mjs +0 -30
- package/esm2022/lib/dynamic-component/shared/index.mjs +0 -4
- package/esm2022/lib/entity/entity-selector/entity-selector.component.mjs +0 -174
- package/esm2022/lib/entity/entity-selector/entity-selector.module.mjs +0 -19
- package/esm2022/lib/entity/entity-table/entity-table-row.directive.mjs +0 -138
- package/esm2022/lib/entity/entity-table/entity-table.component.mjs +0 -884
- package/esm2022/lib/entity/entity-table/entity-table.module.mjs +0 -19
- package/esm2022/lib/entity/entity-table-paginator/entity-table-paginator.component.mjs +0 -156
- package/esm2022/lib/entity/entity-table-paginator/entity-table-paginator.interface.mjs +0 -2
- package/esm2022/lib/entity/entity-table-paginator/entity-table-paginator.module.mjs +0 -19
- package/esm2022/lib/entity/entity-table-paginator/index.mjs +0 -3
- package/esm2022/lib/entity/entity.module.mjs +0 -22
- package/esm2022/lib/entity/index.mjs +0 -14
- package/esm2022/lib/entity/shared/entity.enums.mjs +0 -28
- package/esm2022/lib/entity/shared/entity.interfaces.mjs +0 -2
- package/esm2022/lib/entity/shared/entity.utils.mjs +0 -73
- package/esm2022/lib/entity/shared/index.mjs +0 -10
- package/esm2022/lib/entity/shared/state.mjs +0 -194
- package/esm2022/lib/entity/shared/store.mjs +0 -322
- package/esm2022/lib/entity/shared/strategies/filter-custom-function.mjs +0 -80
- package/esm2022/lib/entity/shared/strategies/filter-selection.mjs +0 -81
- package/esm2022/lib/entity/shared/strategies/index.mjs +0 -4
- package/esm2022/lib/entity/shared/strategies/strategy.mjs +0 -78
- package/esm2022/lib/entity/shared/transaction.mjs +0 -329
- package/esm2022/lib/entity/shared/view.mjs +0 -330
- package/esm2022/lib/entity/shared/watcher.mjs +0 -135
- package/esm2022/lib/environment/environment.interface.mjs +0 -2
- package/esm2022/lib/environment/index.mjs +0 -2
- package/esm2022/lib/flexible/flexible.component.mjs +0 -135
- package/esm2022/lib/flexible/flexible.module.mjs +0 -25
- package/esm2022/lib/flexible/flexible.type.mjs +0 -2
- package/esm2022/lib/flexible/index.mjs +0 -3
- package/esm2022/lib/form/form/form.component.mjs +0 -103
- package/esm2022/lib/form/form/form.module.mjs +0 -19
- package/esm2022/lib/form/form-field/form-field-select.component.mjs +0 -117
- package/esm2022/lib/form/form-field/form-field-text.component.mjs +0 -126
- package/esm2022/lib/form/form-field/form-field-textarea.component.mjs +0 -95
- package/esm2022/lib/form/form-field/form-field.component.mjs +0 -65
- package/esm2022/lib/form/form-field/form-field.module.mjs +0 -23
- package/esm2022/lib/form/form-field/index.mjs +0 -15
- package/esm2022/lib/form/form-group/form-group.component.mjs +0 -82
- package/esm2022/lib/form/form-group/form-group.module.mjs +0 -19
- package/esm2022/lib/form/form.module.mjs +0 -25
- package/esm2022/lib/form/index.mjs +0 -13
- package/esm2022/lib/form/shared/form-field-component.mjs +0 -7
- package/esm2022/lib/form/shared/form-field.service.mjs +0 -29
- package/esm2022/lib/form/shared/form.interfaces.mjs +0 -2
- package/esm2022/lib/form/shared/form.service.mjs +0 -82
- package/esm2022/lib/form/shared/form.utils.mjs +0 -41
- package/esm2022/lib/form/shared/index.mjs +0 -6
- package/esm2022/lib/form-dialog/form-dialog.component.mjs +0 -94
- package/esm2022/lib/form-dialog/form-dialog.interface.mjs +0 -2
- package/esm2022/lib/form-dialog/form-dialog.module.mjs +0 -31
- package/esm2022/lib/form-dialog/form-dialog.service.mjs +0 -30
- package/esm2022/lib/form-dialog/index.mjs +0 -4
- package/esm2022/lib/home-button/home-button.component.mjs +0 -26
- package/esm2022/lib/home-button/home-button.module.mjs +0 -19
- package/esm2022/lib/home-button/index.mjs +0 -2
- package/esm2022/lib/image/image-error.directive.mjs +0 -35
- package/esm2022/lib/image/image.module.mjs +0 -26
- package/esm2022/lib/image/index.mjs +0 -6
- package/esm2022/lib/image/secure-image.pipe.mjs +0 -66
- package/esm2022/lib/interactive-tour/index.mjs +0 -5
- package/esm2022/lib/interactive-tour/interactive-tour.component.mjs +0 -126
- package/esm2022/lib/interactive-tour/interactive-tour.interface.mjs +0 -2
- package/esm2022/lib/interactive-tour/interactive-tour.loader.mjs +0 -49
- package/esm2022/lib/interactive-tour/interactive-tour.module.mjs +0 -19
- package/esm2022/lib/interactive-tour/interactive-tour.service.mjs +0 -299
- package/esm2022/lib/json-dialog/index.mjs +0 -3
- package/esm2022/lib/json-dialog/json-dialog.component.mjs +0 -38
- package/esm2022/lib/json-dialog/json-dialog.module.mjs +0 -26
- package/esm2022/lib/json-dialog/json-dialog.service.mjs +0 -26
- package/esm2022/lib/keyvalue/index.mjs +0 -2
- package/esm2022/lib/keyvalue/keyvalue.module.mjs +0 -25
- package/esm2022/lib/keyvalue/keyvalue.pipe.mjs +0 -19
- package/esm2022/lib/list/index.mjs +0 -6
- package/esm2022/lib/list/list-item.directive.mjs +0 -166
- package/esm2022/lib/list/list.component.mjs +0 -252
- package/esm2022/lib/list/list.module.mjs +0 -26
- package/esm2022/lib/panel/index.mjs +0 -2
- package/esm2022/lib/panel/panel.component.mjs +0 -30
- package/esm2022/lib/panel/panel.module.mjs +0 -19
- package/esm2022/lib/select-value-dialog/index.mjs +0 -5
- package/esm2022/lib/select-value-dialog/select-value-check-radio-dialog.component.mjs +0 -103
- package/esm2022/lib/select-value-dialog/select-value-dialog.enums.mjs +0 -6
- package/esm2022/lib/select-value-dialog/select-value-dialog.interface.mjs +0 -2
- package/esm2022/lib/select-value-dialog/select-value-dialog.module.mjs +0 -27
- package/esm2022/lib/select-value-dialog/select-value-dialog.service.mjs +0 -29
- package/esm2022/lib/sidenav/index.mjs +0 -2
- package/esm2022/lib/sidenav/sidenav-shim.directive.mjs +0 -58
- package/esm2022/lib/sidenav/sidenav.module.mjs +0 -25
- package/esm2022/lib/spinner/index.mjs +0 -9
- package/esm2022/lib/spinner/spinner-activity.directive.mjs +0 -56
- package/esm2022/lib/spinner/spinner.component.mjs +0 -30
- package/esm2022/lib/spinner/spinner.module.mjs +0 -21
- package/esm2022/lib/stop-propagation/index.mjs +0 -9
- package/esm2022/lib/stop-propagation/stop-drop-propagation.directive.mjs +0 -21
- package/esm2022/lib/stop-propagation/stop-propagation.directive.mjs +0 -20
- package/esm2022/lib/stop-propagation/stop-propagation.module.mjs +0 -26
- package/esm2022/lib/table/index.mjs +0 -6
- package/esm2022/lib/table/table-action-color.enum.mjs +0 -7
- package/esm2022/lib/table/table-database.mjs +0 -28
- package/esm2022/lib/table/table-datasource.mjs +0 -64
- package/esm2022/lib/table/table-model.interface.mjs +0 -2
- package/esm2022/lib/table/table.component.mjs +0 -143
- package/esm2022/lib/table/table.module.mjs +0 -25
- package/esm2022/lib/tool/index.mjs +0 -3
- package/esm2022/lib/tool/shared/index.mjs +0 -6
- package/esm2022/lib/tool/shared/tool-component.mjs +0 -9
- package/esm2022/lib/tool/shared/tool.interface.mjs +0 -2
- package/esm2022/lib/tool/shared/tool.service.mjs +0 -43
- package/esm2022/lib/tool/shared/toolbox.enums.mjs +0 -2
- package/esm2022/lib/tool/shared/toolbox.mjs +0 -184
- package/esm2022/lib/tool/tool.module.mjs +0 -28
- package/esm2022/lib/tool/toolbox/toolbox.animation.mjs +0 -10
- package/esm2022/lib/tool/toolbox/toolbox.component.mjs +0 -243
- package/esm2022/lib/tool/toolbox/toolbox.module.mjs +0 -19
- package/esm2022/lib/widget/index.mjs +0 -3
- package/esm2022/lib/widget/shared/index.mjs +0 -4
- package/esm2022/lib/widget/shared/widget.interfaces.mjs +0 -2
- package/esm2022/lib/widget/shared/widget.mjs +0 -4
- package/esm2022/lib/widget/shared/widget.service.mjs +0 -22
- package/esm2022/lib/widget/widget-outlet/widget-outlet.component.mjs +0 -114
- package/esm2022/lib/widget/widget-outlet/widget-outlet.module.mjs +0 -19
- package/esm2022/lib/widget/widget.module.mjs +0 -22
- package/esm2022/lib/workspace/index.mjs +0 -10
- package/esm2022/lib/workspace/shared/index.mjs +0 -4
- package/esm2022/lib/workspace/shared/store.mjs +0 -37
- package/esm2022/lib/workspace/shared/workspace.interfaces.mjs +0 -2
- package/esm2022/lib/workspace/shared/workspace.mjs +0 -143
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.component.mjs +0 -52
- package/esm2022/lib/workspace/workspace-selector/workspace-selector.module.mjs +0 -19
- package/esm2022/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.component.mjs +0 -74
- package/esm2022/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.module.mjs +0 -19
- package/esm2022/lib/workspace/workspace.module.mjs +0 -22
- package/lib/action/actionbar/actionbar-item.component.d.ts +0 -78
- package/lib/action/actionbar/actionbar.component.d.ts +0 -148
- package/lib/action/index.d.ts +0 -2
- package/lib/action/shared/action.interfaces.d.ts +0 -17
- package/lib/action/shared/store.d.ts +0 -8
- package/lib/backdrop/index.d.ts +0 -1
- package/lib/badge-icon/badge-icon.directive.d.ts +0 -36
- package/lib/badge-icon/index.d.ts +0 -1
- package/lib/clickout/index.d.ts +0 -1
- package/lib/clone/index.d.ts +0 -1
- package/lib/collapsible/index.d.ts +0 -5
- package/lib/color-picker-form-field/index.d.ts +0 -1
- package/lib/confirm-dialog/index.d.ts +0 -3
- package/lib/context-menu/index.d.ts +0 -5
- package/lib/custom-html/index.d.ts +0 -5
- package/lib/dom/index.d.ts +0 -2
- package/lib/drag-drop/index.d.ts +0 -1
- package/lib/dynamic-component/index.d.ts +0 -2
- package/lib/entity/entity-table-paginator/entity-table-paginator.component.d.ts +0 -49
- package/lib/entity/entity-table-paginator/index.d.ts +0 -2
- package/lib/entity/entity.module.d.ts +0 -12
- package/lib/entity/index.d.ts +0 -9
- package/lib/entity/shared/transaction.d.ts +0 -180
- package/lib/flexible/flexible.component.d.ts +0 -41
- package/lib/flexible/index.d.ts +0 -2
- package/lib/form/form-field/index.d.ts +0 -9
- package/lib/form/form.module.d.ts +0 -15
- package/lib/form/index.d.ts +0 -7
- package/lib/form-dialog/form-dialog.component.d.ts +0 -24
- package/lib/form-dialog/form-dialog.interface.d.ts +0 -18
- package/lib/form-dialog/index.d.ts +0 -3
- package/lib/home-button/index.d.ts +0 -1
- package/lib/image/index.d.ts +0 -5
- package/lib/image/secure-image.pipe.d.ts +0 -13
- package/lib/interactive-tour/index.d.ts +0 -4
- package/lib/interactive-tour/interactive-tour.component.d.ts +0 -30
- package/lib/interactive-tour/interactive-tour.loader.d.ts +0 -18
- package/lib/interactive-tour/interactive-tour.service.d.ts +0 -29
- package/lib/json-dialog/index.d.ts +0 -2
- package/lib/keyvalue/index.d.ts +0 -1
- package/lib/list/index.d.ts +0 -5
- package/lib/panel/index.d.ts +0 -1
- package/lib/select-value-dialog/index.d.ts +0 -4
- package/lib/select-value-dialog/select-value-check-radio-dialog.component.d.ts +0 -25
- package/lib/sidenav/index.d.ts +0 -1
- package/lib/spinner/index.d.ts +0 -5
- package/lib/spinner/spinner-activity.directive.d.ts +0 -32
- package/lib/spinner/spinner.module.d.ts +0 -11
- package/lib/stop-propagation/index.d.ts +0 -5
- package/lib/table/index.d.ts +0 -5
- package/lib/tool/index.d.ts +0 -2
- package/lib/tool/shared/tool.interface.d.ts +0 -18
- package/lib/tool/shared/toolbox.d.ts +0 -95
- package/lib/tool/toolbox/toolbox.component.d.ts +0 -128
- package/lib/widget/index.d.ts +0 -2
- package/lib/widget/shared/widget.d.ts +0 -4
- package/lib/widget/shared/widget.service.d.ts +0 -10
- package/lib/widget/widget-outlet/widget-outlet.component.d.ts +0 -71
- package/lib/workspace/index.d.ts +0 -6
- package/lib/workspace/shared/store.d.ts +0 -20
- package/lib/workspace/shared/workspace.d.ts +0 -108
- package/lib/workspace/shared/workspace.interfaces.d.ts +0 -11
- package/lib/workspace/workspace-selector/workspace-selector.component.d.ts +0 -38
- package/lib/workspace/workspace-widget-outlet/workspace-widget-outlet.component.d.ts +0 -57
- package/lib/workspace/workspace.module.d.ts +0 -11
- package/src/lib/action/action.theming.scss +0 -5
- package/src/lib/action/actionbar/actionbar-item.theming.scss +0 -32
- package/src/lib/action/actionbar/actionbar.theming.scss +0 -22
- package/src/lib/collapsible/collapsible.theming.scss +0 -22
- package/src/lib/entity/entity-selector/entity-selector.theming.scss +0 -21
- package/src/lib/entity/entity-table/entity-table.theming.scss +0 -37
- package/src/lib/entity/entity.theming.scss +0 -7
- package/src/lib/home-button/home-button.theming.scss +0 -18
- package/src/lib/interactive-tour/interactive-tour.theming.scss +0 -32
- package/src/lib/list/list.theming.scss +0 -58
- package/src/lib/panel/panel.theming.scss +0 -30
- package/src/lib/tool/tool.theming.scss +0 -5
- package/src/lib/tool/toolbox/toolbox.theming.scss +0 -105
- /package/{lib/action → action}/action.module.d.ts +0 -0
- /package/{lib/action → action}/actionbar/actionbar.module.d.ts +0 -0
- /package/{lib/action → action}/shared/action.enums.d.ts +0 -0
- /package/{lib/action → action}/shared/index.d.ts +0 -0
- /package/{lib/backdrop → backdrop}/backdrop.component.d.ts +0 -0
- /package/{lib/backdrop → backdrop}/backdrop.module.d.ts +0 -0
- /package/{lib/badge-icon → badge}/badge-icon.module.d.ts +0 -0
- /package/{lib/clickout → clickout}/clickout.directive.d.ts +0 -0
- /package/{lib/clickout → clickout}/clickout.module.d.ts +0 -0
- /package/{lib/clone → clone}/clone.module.d.ts +0 -0
- /package/{lib/clone → clone}/clone.pipe.d.ts +0 -0
- /package/{lib/collapsible → collapsible}/collapse.directive.d.ts +0 -0
- /package/{lib/collapsible → collapsible}/collapsible.component.d.ts +0 -0
- /package/{lib/collapsible → collapsible}/collapsible.module.d.ts +0 -0
- /package/{lib → color}/color-picker-form-field/color-picker-form-field.component.d.ts +0 -0
- /package/{lib → color}/color-picker-form-field/color-picker-form-field.module.d.ts +0 -0
- /package/{lib/confirm-dialog → confirm-dialog}/confirm-dialog.component.d.ts +0 -0
- /package/{lib/confirm-dialog → confirm-dialog}/confirm-dialog.interface.d.ts +0 -0
- /package/{lib/confirm-dialog → confirm-dialog}/confirm-dialog.module.d.ts +0 -0
- /package/{lib/confirm-dialog → confirm-dialog}/confirm-dialog.service.d.ts +0 -0
- /package/{lib/context-menu → context-menu}/context-menu.directive.d.ts +0 -0
- /package/{lib/context-menu → context-menu}/context-menu.module.d.ts +0 -0
- /package/{lib/context-menu → context-menu}/long-press.directive.d.ts +0 -0
- /package/{lib/custom-html → custom-html}/custom-html.component.d.ts +0 -0
- /package/{lib/custom-html → custom-html}/custom-html.module.d.ts +0 -0
- /package/{lib/custom-html → custom-html}/custom-html.pipe.d.ts +0 -0
- /package/{lib/dom → dom}/dom.interfaces.d.ts +0 -0
- /package/{lib/dom → dom}/dom.module.d.ts +0 -0
- /package/{lib/dom → dom}/dom.service.d.ts +0 -0
- /package/{lib/drag-drop → drag-drop}/drag-drop.directive.d.ts +0 -0
- /package/{lib/drag-drop → drag-drop}/drag-drop.module.d.ts +0 -0
- /package/{lib/dynamic-component → dynamic-component}/dynamic-component.module.d.ts +0 -0
- /package/{lib/dynamic-component → dynamic-component}/dynamic-outlet/dynamic-outlet.component.d.ts +0 -0
- /package/{lib/dynamic-component → dynamic-component}/dynamic-outlet/dynamic-outlet.module.d.ts +0 -0
- /package/{lib/dynamic-component → dynamic-component}/shared/dynamic-component.d.ts +0 -0
- /package/{lib/dynamic-component → dynamic-component}/shared/dynamic-component.interfaces.d.ts +0 -0
- /package/{lib/dynamic-component → dynamic-component}/shared/dynamic-component.service.d.ts +0 -0
- /package/{lib/dynamic-component → dynamic-component}/shared/index.d.ts +0 -0
- /package/{lib/entity → entity}/entity-selector/entity-selector.component.d.ts +0 -0
- /package/{lib/entity → entity}/entity-selector/entity-selector.module.d.ts +0 -0
- /package/{lib/entity → entity}/entity-table/entity-table-row.directive.d.ts +0 -0
- /package/{lib/entity → entity}/entity-table/entity-table.component.d.ts +0 -0
- /package/{lib/entity → entity}/entity-table/entity-table.module.d.ts +0 -0
- /package/{lib/entity → entity}/entity-table-paginator/entity-table-paginator.interface.d.ts +0 -0
- /package/{lib/entity → entity}/entity-table-paginator/entity-table-paginator.module.d.ts +0 -0
- /package/{lib/entity → entity}/shared/entity.enums.d.ts +0 -0
- /package/{lib/entity → entity}/shared/entity.interfaces.d.ts +0 -0
- /package/{lib/entity → entity}/shared/entity.utils.d.ts +0 -0
- /package/{lib/entity → entity}/shared/index.d.ts +0 -0
- /package/{lib/entity → entity}/shared/state.d.ts +0 -0
- /package/{lib/entity → entity}/shared/store.d.ts +0 -0
- /package/{lib/entity → entity}/shared/strategies/filter-custom-function.d.ts +0 -0
- /package/{lib/entity → entity}/shared/strategies/filter-selection.d.ts +0 -0
- /package/{lib/entity → entity}/shared/strategies/index.d.ts +0 -0
- /package/{lib/entity → entity}/shared/strategies/strategy.d.ts +0 -0
- /package/{lib/entity → entity}/shared/view.d.ts +0 -0
- /package/{lib/entity → entity}/shared/watcher.d.ts +0 -0
- /package/{lib/environment → environment}/environment.interface.d.ts +0 -0
- /package/{lib/environment/index.d.ts → environment/public_api.d.ts} +0 -0
- /package/{lib/flexible → flexible}/flexible.module.d.ts +0 -0
- /package/{lib/flexible → flexible}/flexible.type.d.ts +0 -0
- /package/{lib/form → form}/form/form.component.d.ts +0 -0
- /package/{lib/form → form}/form/form.module.d.ts +0 -0
- /package/{lib → form}/form-dialog/form-dialog.module.d.ts +0 -0
- /package/{lib → form}/form-dialog/form-dialog.service.d.ts +0 -0
- /package/{lib/form → form}/form-field/form-field-select.component.d.ts +0 -0
- /package/{lib/form → form}/form-field/form-field-text.component.d.ts +0 -0
- /package/{lib/form → form}/form-field/form-field-textarea.component.d.ts +0 -0
- /package/{lib/form → form}/form-field/form-field.component.d.ts +0 -0
- /package/{lib/form → form}/form-field/form-field.module.d.ts +0 -0
- /package/{lib/form → form}/form-group/form-group.component.d.ts +0 -0
- /package/{lib/form → form}/form-group/form-group.module.d.ts +0 -0
- /package/{lib/form → form}/shared/form-field-component.d.ts +0 -0
- /package/{lib/form → form}/shared/form-field.service.d.ts +0 -0
- /package/{lib/form → form}/shared/form.interfaces.d.ts +0 -0
- /package/{lib/form → form}/shared/form.service.d.ts +0 -0
- /package/{lib/form → form}/shared/form.utils.d.ts +0 -0
- /package/{lib/form → form}/shared/index.d.ts +0 -0
- /package/{lib/home-button → home-button}/home-button.component.d.ts +0 -0
- /package/{lib/home-button → home-button}/home-button.module.d.ts +0 -0
- /package/{lib/image → image}/image-error.directive.d.ts +0 -0
- /package/{lib/image → image}/image.module.d.ts +0 -0
- /package/{lib/interactive-tour → interactive-tour}/interactive-tour.interface.d.ts +0 -0
- /package/{lib/interactive-tour → interactive-tour}/interactive-tour.module.d.ts +0 -0
- /package/{lib/json-dialog → json-dialog}/json-dialog.component.d.ts +0 -0
- /package/{lib/json-dialog → json-dialog}/json-dialog.module.d.ts +0 -0
- /package/{lib/json-dialog → json-dialog}/json-dialog.service.d.ts +0 -0
- /package/{lib/keyvalue → keyvalue}/keyvalue.module.d.ts +0 -0
- /package/{lib/keyvalue → keyvalue}/keyvalue.pipe.d.ts +0 -0
- /package/{lib/list → list}/list-item.directive.d.ts +0 -0
- /package/{lib/list → list}/list.component.d.ts +0 -0
- /package/{lib/list → list}/list.module.d.ts +0 -0
- /package/{lib/panel → panel}/panel.component.d.ts +0 -0
- /package/{lib/panel → panel}/panel.module.d.ts +0 -0
- /package/{lib/select-value-dialog → select-value-dialog}/select-value-dialog.enums.d.ts +0 -0
- /package/{lib/select-value-dialog → select-value-dialog}/select-value-dialog.interface.d.ts +0 -0
- /package/{lib/select-value-dialog → select-value-dialog}/select-value-dialog.module.d.ts +0 -0
- /package/{lib/select-value-dialog → select-value-dialog}/select-value-dialog.service.d.ts +0 -0
- /package/{lib/sidenav → sidenav}/sidenav-shim.directive.d.ts +0 -0
- /package/{lib/sidenav → sidenav}/sidenav.module.d.ts +0 -0
- /package/{lib/spinner → spinner}/spinner.component.d.ts +0 -0
- /package/{lib/stop-propagation → stop-propagation}/stop-drop-propagation.directive.d.ts +0 -0
- /package/{lib/stop-propagation → stop-propagation}/stop-propagation.directive.d.ts +0 -0
- /package/{lib/stop-propagation → stop-propagation}/stop-propagation.module.d.ts +0 -0
- /package/{lib/table → table}/table-action-color.enum.d.ts +0 -0
- /package/{lib/table → table}/table-database.d.ts +0 -0
- /package/{lib/table → table}/table-datasource.d.ts +0 -0
- /package/{lib/table → table}/table-model.interface.d.ts +0 -0
- /package/{lib/table → table}/table.component.d.ts +0 -0
- /package/{lib/table → table}/table.module.d.ts +0 -0
- /package/{lib/tool → tool}/shared/index.d.ts +0 -0
- /package/{lib/tool → tool}/shared/tool-component.d.ts +0 -0
- /package/{lib/tool → tool}/shared/tool.service.d.ts +0 -0
- /package/{lib/tool → tool}/shared/toolbox.enums.d.ts +0 -0
- /package/{lib/tool → tool}/tool.module.d.ts +0 -0
- /package/{lib/tool → tool}/toolbox/toolbox.animation.d.ts +0 -0
- /package/{lib/tool → tool}/toolbox/toolbox.module.d.ts +0 -0
- /package/{lib/widget → widget}/shared/index.d.ts +0 -0
- /package/{lib/widget → widget}/shared/widget.interfaces.d.ts +0 -0
- /package/{lib/widget → widget}/widget-outlet/widget-outlet.module.d.ts +0 -0
- /package/{lib/widget → widget}/widget.module.d.ts +0 -0
- /package/{lib/workspace → workspace}/shared/index.d.ts +0 -0
- /package/{lib/workspace → workspace}/workspace-selector/workspace-selector.module.d.ts +0 -0
- /package/{lib/workspace → workspace}/workspace-widget-outlet/workspace-widget-outlet.module.d.ts +0 -0
|
@@ -1,884 +0,0 @@
|
|
|
1
|
-
import { FocusMonitor } from '@angular/cdk/a11y';
|
|
2
|
-
import { AsyncPipe, NgClass, NgFor, NgIf, NgStyle } from '@angular/common';
|
|
3
|
-
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, Optional, Output, Self } from '@angular/core';
|
|
4
|
-
import { FormControlName, FormsModule, NgControl, NgForm, ReactiveFormsModule, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
|
|
5
|
-
import { provideMomentDateAdapter } from '@angular/material-moment-adapter';
|
|
6
|
-
import { MatAutocompleteModule } from '@angular/material/autocomplete';
|
|
7
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
8
|
-
import { MatCheckboxModule } from '@angular/material/checkbox';
|
|
9
|
-
import { DateAdapter, ErrorStateMatcher, MatNativeDateModule, MatOptionModule } from '@angular/material/core';
|
|
10
|
-
import { MatDatepickerModule } from '@angular/material/datepicker';
|
|
11
|
-
import { MatFormFieldControl, MatFormFieldModule } from '@angular/material/form-field';
|
|
12
|
-
import { MatIconModule } from '@angular/material/icon';
|
|
13
|
-
import { MatInputModule } from '@angular/material/input';
|
|
14
|
-
import { MatPaginator } from '@angular/material/paginator';
|
|
15
|
-
import { MatSelectModule } from '@angular/material/select';
|
|
16
|
-
import { MatSortModule } from '@angular/material/sort';
|
|
17
|
-
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
|
|
18
|
-
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
19
|
-
import { StringUtils } from '@igo2/utils';
|
|
20
|
-
import { TranslateModule } from '@ngx-translate/core';
|
|
21
|
-
import { default as moment } from 'moment';
|
|
22
|
-
import { BehaviorSubject, Observable } from 'rxjs';
|
|
23
|
-
import { debounceTime, map } from 'rxjs/operators';
|
|
24
|
-
import { SanitizeHtmlPipe } from '../../custom-html/custom-html.pipe';
|
|
25
|
-
import { ImageErrorDirective } from '../../image/image-error.directive';
|
|
26
|
-
import { SecureImagePipe } from '../../image/secure-image.pipe';
|
|
27
|
-
import { StopPropagationDirective } from '../../stop-propagation/stop-propagation.directive';
|
|
28
|
-
import { EntityTablePaginatorComponent } from '../entity-table-paginator/entity-table-paginator.component';
|
|
29
|
-
import { EntityStore, EntityTableColumnRenderer, EntityTableScrollBehavior, EntityTableSelectionState } from '../shared';
|
|
30
|
-
import { EntityTableRowDirective } from './entity-table-row.directive';
|
|
31
|
-
import * as i0 from "@angular/core";
|
|
32
|
-
import * as i1 from "@angular/forms";
|
|
33
|
-
import * as i2 from "@angular/cdk/a11y";
|
|
34
|
-
import * as i3 from "@angular/material/core";
|
|
35
|
-
import * as i4 from "@angular/material/autocomplete";
|
|
36
|
-
import * as i5 from "@angular/material/button";
|
|
37
|
-
import * as i6 from "@angular/material/checkbox";
|
|
38
|
-
import * as i7 from "@angular/material/datepicker";
|
|
39
|
-
import * as i8 from "@angular/material/form-field";
|
|
40
|
-
import * as i9 from "@angular/material/icon";
|
|
41
|
-
import * as i10 from "@angular/material/input";
|
|
42
|
-
import * as i11 from "@angular/material/select";
|
|
43
|
-
import * as i12 from "@angular/material/sort";
|
|
44
|
-
import * as i13 from "@angular/material/table";
|
|
45
|
-
import * as i14 from "@angular/material/tooltip";
|
|
46
|
-
import * as i15 from "@ngx-translate/core";
|
|
47
|
-
export class EntityTableComponent {
|
|
48
|
-
cdRef;
|
|
49
|
-
formBuilder;
|
|
50
|
-
_focusMonitor;
|
|
51
|
-
_elementRef;
|
|
52
|
-
ngControl;
|
|
53
|
-
_parentForm;
|
|
54
|
-
_controlName;
|
|
55
|
-
_defaultErrorStateMatcher;
|
|
56
|
-
dateAdapter;
|
|
57
|
-
entitySortChange$ = new BehaviorSubject(false);
|
|
58
|
-
formGroup = new UntypedFormGroup({});
|
|
59
|
-
filteredOptions = {};
|
|
60
|
-
/**
|
|
61
|
-
* Reference to the column renderer types
|
|
62
|
-
* @internal
|
|
63
|
-
*/
|
|
64
|
-
entityTableColumnRenderer = EntityTableColumnRenderer;
|
|
65
|
-
/**
|
|
66
|
-
* Reference to the selection's state
|
|
67
|
-
* @internal
|
|
68
|
-
*/
|
|
69
|
-
entityTableSelectionState = EntityTableSelectionState;
|
|
70
|
-
/**
|
|
71
|
-
* Observable of the selection,s state
|
|
72
|
-
* @internal
|
|
73
|
-
*/
|
|
74
|
-
selectionState$ = new BehaviorSubject(undefined);
|
|
75
|
-
/**
|
|
76
|
-
* Subscription to the store's selection
|
|
77
|
-
*/
|
|
78
|
-
selection$$;
|
|
79
|
-
/**
|
|
80
|
-
* Subscription to the dataSource
|
|
81
|
-
*/
|
|
82
|
-
dataSource$$;
|
|
83
|
-
/**
|
|
84
|
-
* The last record checked. Useful for selecting
|
|
85
|
-
* multiple records by holding the shift key and checking
|
|
86
|
-
* checkboxes.
|
|
87
|
-
*/
|
|
88
|
-
lastRecordCheckedKey;
|
|
89
|
-
/**
|
|
90
|
-
* Entity store
|
|
91
|
-
*/
|
|
92
|
-
store;
|
|
93
|
-
/**
|
|
94
|
-
* Table paginator
|
|
95
|
-
*/
|
|
96
|
-
set paginator(value) {
|
|
97
|
-
this._paginator = value;
|
|
98
|
-
this.dataSource.paginator = value;
|
|
99
|
-
}
|
|
100
|
-
get paginator() {
|
|
101
|
-
return this._paginator;
|
|
102
|
-
}
|
|
103
|
-
_paginator;
|
|
104
|
-
/**
|
|
105
|
-
* Table template
|
|
106
|
-
*/
|
|
107
|
-
template;
|
|
108
|
-
/**
|
|
109
|
-
* Scroll behavior on selection
|
|
110
|
-
*/
|
|
111
|
-
scrollBehavior = EntityTableScrollBehavior.Auto;
|
|
112
|
-
/**
|
|
113
|
-
* Whether nulls should be first when sorting
|
|
114
|
-
*/
|
|
115
|
-
sortNullsFirst = false;
|
|
116
|
-
/**
|
|
117
|
-
* Show the table paginator or not. False by default.
|
|
118
|
-
*/
|
|
119
|
-
withPaginator = false;
|
|
120
|
-
/**
|
|
121
|
-
* Paginator options
|
|
122
|
-
*/
|
|
123
|
-
paginatorOptions;
|
|
124
|
-
/**
|
|
125
|
-
* Event emitted when an entity (row) is clicked
|
|
126
|
-
*/
|
|
127
|
-
entityClick = new EventEmitter();
|
|
128
|
-
/**
|
|
129
|
-
* Event emitted when an entity (row) is selected
|
|
130
|
-
*/
|
|
131
|
-
entitySelectChange = new EventEmitter();
|
|
132
|
-
/**
|
|
133
|
-
* Event emitted when the table sort is changed.
|
|
134
|
-
*/
|
|
135
|
-
entitySortChange = new EventEmitter(undefined);
|
|
136
|
-
/**
|
|
137
|
-
* Table headers
|
|
138
|
-
* @internal
|
|
139
|
-
*/
|
|
140
|
-
get headers() {
|
|
141
|
-
let columns = this.template.columns
|
|
142
|
-
.filter((column) => column.visible !== false)
|
|
143
|
-
.map((column) => column.name);
|
|
144
|
-
if (this.selectionCheckbox === true) {
|
|
145
|
-
columns = ['selectionCheckbox'].concat(columns);
|
|
146
|
-
}
|
|
147
|
-
return columns;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Data source consumable by the underlying material table
|
|
151
|
-
* @internal
|
|
152
|
-
*/
|
|
153
|
-
dataSource = new MatTableDataSource();
|
|
154
|
-
/**
|
|
155
|
-
* Whether selection is supported
|
|
156
|
-
* @internal
|
|
157
|
-
*/
|
|
158
|
-
get selection() {
|
|
159
|
-
return this.template.selection || false;
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Whether a selection checkbox should be displayed
|
|
163
|
-
* @internal
|
|
164
|
-
*/
|
|
165
|
-
get selectionCheckbox() {
|
|
166
|
-
return this.template.selectionCheckbox || false;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Whether selection many entities should eb supported
|
|
170
|
-
* @internal
|
|
171
|
-
*/
|
|
172
|
-
get selectMany() {
|
|
173
|
-
return this.template.selectMany || false;
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* Whether selection many entities should eb supported
|
|
177
|
-
* @internal
|
|
178
|
-
*/
|
|
179
|
-
get fixedHeader() {
|
|
180
|
-
return this.template.fixedHeader === undefined
|
|
181
|
-
? true
|
|
182
|
-
: this.template.fixedHeader;
|
|
183
|
-
}
|
|
184
|
-
get tableHeight() {
|
|
185
|
-
return this.template.tableHeight ? this.template.tableHeight : 'auto';
|
|
186
|
-
}
|
|
187
|
-
constructor(cdRef, formBuilder, _focusMonitor, _elementRef, ngControl, _parentForm, _controlName, _defaultErrorStateMatcher, dateAdapter) {
|
|
188
|
-
this.cdRef = cdRef;
|
|
189
|
-
this.formBuilder = formBuilder;
|
|
190
|
-
this._focusMonitor = _focusMonitor;
|
|
191
|
-
this._elementRef = _elementRef;
|
|
192
|
-
this.ngControl = ngControl;
|
|
193
|
-
this._parentForm = _parentForm;
|
|
194
|
-
this._controlName = _controlName;
|
|
195
|
-
this._defaultErrorStateMatcher = _defaultErrorStateMatcher;
|
|
196
|
-
this.dateAdapter = dateAdapter;
|
|
197
|
-
this.dateAdapter.setLocale('fr-CA');
|
|
198
|
-
}
|
|
199
|
-
/**
|
|
200
|
-
* Track the selection state to properly display the selection checkboxes
|
|
201
|
-
* @internal
|
|
202
|
-
*/
|
|
203
|
-
ngOnInit() {
|
|
204
|
-
this.handleDatasource();
|
|
205
|
-
this.dataSource.paginator = this.paginator;
|
|
206
|
-
this.store.state.change$.pipe(debounceTime(100)).subscribe(() => {
|
|
207
|
-
this.handleDatasource();
|
|
208
|
-
this.refresh();
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* @internal
|
|
213
|
-
*/
|
|
214
|
-
ngOnChanges(changes) {
|
|
215
|
-
const store = changes.store;
|
|
216
|
-
if (store && store.currentValue !== store.previousValue) {
|
|
217
|
-
this.handleDatasource();
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* Process text or number value change (edition)
|
|
222
|
-
*/
|
|
223
|
-
onValueChange(column, record, event) {
|
|
224
|
-
const key = this.getColumnKeyWithoutPropertiesTag(column);
|
|
225
|
-
record.entity.properties[key] = event.target.value;
|
|
226
|
-
}
|
|
227
|
-
/**
|
|
228
|
-
* Process boolean value change (edition)
|
|
229
|
-
*/
|
|
230
|
-
onBooleanValueChange(column, record, event) {
|
|
231
|
-
const key = this.getColumnKeyWithoutPropertiesTag(column);
|
|
232
|
-
record.entity.properties[key] = event.checked;
|
|
233
|
-
}
|
|
234
|
-
/**
|
|
235
|
-
* Process select value change (edition)
|
|
236
|
-
*/
|
|
237
|
-
onSelectValueChange(column, record, event) {
|
|
238
|
-
const key = this.getColumnKeyWithoutPropertiesTag(column);
|
|
239
|
-
record.entity.properties[key] = event.value;
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Process autocomplete value change (edition)
|
|
243
|
-
*/
|
|
244
|
-
onAutocompleteValueChange(column, record, event) {
|
|
245
|
-
this.formGroup.controls[column.name].setValue(event.option.viewValue);
|
|
246
|
-
const key = this.getColumnKeyWithoutPropertiesTag(column.name);
|
|
247
|
-
record.entity.properties[key] = event.option.value;
|
|
248
|
-
}
|
|
249
|
-
/**
|
|
250
|
-
* Process date value change (edition)
|
|
251
|
-
*/
|
|
252
|
-
onDateChange(column, record, event) {
|
|
253
|
-
const format = 'YYYY-MM-DD';
|
|
254
|
-
const value = moment(event.value).format(format);
|
|
255
|
-
const key = this.getColumnKeyWithoutPropertiesTag(column);
|
|
256
|
-
record.entity.properties[key] = value;
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Enable edition mode for one row
|
|
260
|
-
* More than one row can be edited at the same time
|
|
261
|
-
*/
|
|
262
|
-
enableEdit(record) {
|
|
263
|
-
const item = record.entity.properties || record.entity;
|
|
264
|
-
this.template.columns.forEach((column) => {
|
|
265
|
-
column.title =
|
|
266
|
-
column.validation?.mandatory && !column.title.includes('*')
|
|
267
|
-
? column.title + ' *'
|
|
268
|
-
: column.title;
|
|
269
|
-
const key = this.getColumnKeyWithoutPropertiesTag(column.name);
|
|
270
|
-
if (column.type === 'boolean') {
|
|
271
|
-
if (!item[key] || item[key] === null) {
|
|
272
|
-
item[key] = false;
|
|
273
|
-
}
|
|
274
|
-
else if (typeof item[key] === 'string') {
|
|
275
|
-
item[key] = JSON.parse(item[key].toLowerCase());
|
|
276
|
-
}
|
|
277
|
-
this.formGroup.setControl(column.name, this.formBuilder.control(item[key]));
|
|
278
|
-
}
|
|
279
|
-
else if (column.type === 'list') {
|
|
280
|
-
if (column.multiple) {
|
|
281
|
-
this.formGroup.setControl(column.name, this.formBuilder.control([item[key]]));
|
|
282
|
-
}
|
|
283
|
-
else {
|
|
284
|
-
this.formGroup.setControl(column.name, this.formBuilder.control(item[key]));
|
|
285
|
-
typeof item[key] === 'string'
|
|
286
|
-
? this.formGroup.controls[column.name].setValue(parseInt(item[key]))
|
|
287
|
-
: this.formGroup.controls[column.name].setValue(item[key]);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
else if (column.type === 'autocomplete') {
|
|
291
|
-
this.formGroup.setControl(column.name, this.formBuilder.control(item[key]));
|
|
292
|
-
this.filteredOptions[column.name] = new Observable();
|
|
293
|
-
this.filteredOptions[column.name] = this.formGroup.controls[column.name].valueChanges.pipe(map((value) => {
|
|
294
|
-
if (value?.length) {
|
|
295
|
-
return column.domainValues?.filter((option) => {
|
|
296
|
-
const filterNormalized = value
|
|
297
|
-
? value
|
|
298
|
-
.toLowerCase()
|
|
299
|
-
.normalize('NFD')
|
|
300
|
-
.replace(/[\u0300-\u036f]/g, '')
|
|
301
|
-
: '';
|
|
302
|
-
const featureNameNormalized = option.value
|
|
303
|
-
.toLowerCase()
|
|
304
|
-
.normalize('NFD')
|
|
305
|
-
.replace(/[\u0300-\u036f]/g, '');
|
|
306
|
-
return featureNameNormalized.includes(filterNormalized);
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
}));
|
|
310
|
-
let formControlValue = item[key];
|
|
311
|
-
column.domainValues.forEach((option) => {
|
|
312
|
-
if (typeof formControlValue === 'string' &&
|
|
313
|
-
StringUtils.isValidNumber(formControlValue) &&
|
|
314
|
-
!StringUtils.isOctalNumber(formControlValue)) {
|
|
315
|
-
formControlValue = parseInt(formControlValue);
|
|
316
|
-
}
|
|
317
|
-
if (option.value === formControlValue ||
|
|
318
|
-
option.id === formControlValue) {
|
|
319
|
-
formControlValue = option.value;
|
|
320
|
-
}
|
|
321
|
-
});
|
|
322
|
-
this.formGroup.controls[column.name].setValue(formControlValue);
|
|
323
|
-
if (this.isEdition(record) && column.linkColumnForce) {
|
|
324
|
-
const entity = record.entity;
|
|
325
|
-
this.formGroup.controls[column.name].setValue(entity?.properties[this.getColumnKeyWithoutPropertiesTag(column.linkColumnForce)]);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
else if (column.type === 'date') {
|
|
329
|
-
if (column.visible !== false) {
|
|
330
|
-
if (item[key]) {
|
|
331
|
-
let date = moment(item[key]);
|
|
332
|
-
item[key] = date.utc().format('YYYY-MM-DD');
|
|
333
|
-
this.formGroup.setControl(column.name, this.formBuilder.control(item[key]));
|
|
334
|
-
}
|
|
335
|
-
else {
|
|
336
|
-
const newKey = this.getColumnKeyWithoutPropertiesTag(column.name);
|
|
337
|
-
record.entity.properties[newKey] = null;
|
|
338
|
-
this.formGroup.setControl(column.name, this.formBuilder.control(null));
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
else {
|
|
343
|
-
this.formGroup.setControl(column.name, this.formBuilder.control(item[key]));
|
|
344
|
-
}
|
|
345
|
-
if (this.formGroup.controls[column.name] &&
|
|
346
|
-
this.getValidationAttributeValue(column, 'readonly')) {
|
|
347
|
-
this.formGroup.controls[column.name].disable();
|
|
348
|
-
}
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
handleDatasource() {
|
|
352
|
-
this.unsubscribeStore();
|
|
353
|
-
this.selection$$ = this.store.stateView
|
|
354
|
-
.manyBy$((record) => record.state.selected === true)
|
|
355
|
-
.subscribe((records) => {
|
|
356
|
-
const firstSelected = records[0];
|
|
357
|
-
const firstSelectedStateviewPosition = this.store.stateView
|
|
358
|
-
.all()
|
|
359
|
-
.indexOf(firstSelected);
|
|
360
|
-
const pageMax = this.paginator
|
|
361
|
-
? this.paginator.pageSize * (this.paginator.pageIndex + 1)
|
|
362
|
-
: 0;
|
|
363
|
-
const pageMin = this.paginator ? pageMax - this.paginator.pageSize : 0;
|
|
364
|
-
if (this.paginator &&
|
|
365
|
-
(firstSelectedStateviewPosition < pageMin ||
|
|
366
|
-
firstSelectedStateviewPosition >= pageMax)) {
|
|
367
|
-
const pageToReach = Math.floor(firstSelectedStateviewPosition / this.paginator.pageSize);
|
|
368
|
-
this.dataSource.paginator.pageIndex = pageToReach;
|
|
369
|
-
}
|
|
370
|
-
this.selectionState$.next(this.computeSelectionState(records));
|
|
371
|
-
});
|
|
372
|
-
this.dataSource$$ = this.store.stateView.all$().subscribe((all) => {
|
|
373
|
-
if (all[0]) {
|
|
374
|
-
this.enableEdit(all[0]);
|
|
375
|
-
}
|
|
376
|
-
this.dataSource.data = all.map((record) => {
|
|
377
|
-
return {
|
|
378
|
-
record,
|
|
379
|
-
cellData: this.template.columns.reduce((cellData, column) => {
|
|
380
|
-
const value = this.getValue(record, column);
|
|
381
|
-
cellData[column.name] = {
|
|
382
|
-
class: this.getCellClass(record, column),
|
|
383
|
-
value,
|
|
384
|
-
isUrl: this.isUrl(value),
|
|
385
|
-
isImg: this.isImg(value)
|
|
386
|
-
};
|
|
387
|
-
return cellData;
|
|
388
|
-
}, {})
|
|
389
|
-
};
|
|
390
|
-
});
|
|
391
|
-
});
|
|
392
|
-
}
|
|
393
|
-
/**
|
|
394
|
-
* Unbind the store watcher
|
|
395
|
-
* @internal
|
|
396
|
-
*/
|
|
397
|
-
ngOnDestroy() {
|
|
398
|
-
this.unsubscribeStore();
|
|
399
|
-
}
|
|
400
|
-
unsubscribeStore() {
|
|
401
|
-
if (this.selection$$) {
|
|
402
|
-
this.selection$$.unsubscribe();
|
|
403
|
-
}
|
|
404
|
-
if (this.dataSource$$) {
|
|
405
|
-
this.dataSource$$.unsubscribe();
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
/**
|
|
409
|
-
* Trackby function
|
|
410
|
-
* @param record Record
|
|
411
|
-
* @param index Record index
|
|
412
|
-
* @internal
|
|
413
|
-
*/
|
|
414
|
-
getTrackByFunction() {
|
|
415
|
-
return (_index, row) => row.record.ref;
|
|
416
|
-
}
|
|
417
|
-
/**
|
|
418
|
-
* Trigger a refresh of the table. This can be useful when
|
|
419
|
-
* the data source doesn't emit a new value but for some reason
|
|
420
|
-
* the records need an update.
|
|
421
|
-
* @internal
|
|
422
|
-
*/
|
|
423
|
-
refresh() {
|
|
424
|
-
this.cdRef.detectChanges();
|
|
425
|
-
}
|
|
426
|
-
paginatorChange(event) {
|
|
427
|
-
this.paginator = event;
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* On sort, sort the store
|
|
431
|
-
* @param event Sort event
|
|
432
|
-
* @internal
|
|
433
|
-
*/
|
|
434
|
-
onSort(event) {
|
|
435
|
-
const direction = event.direction;
|
|
436
|
-
const column = this.template.columns.find((c) => c.name === event.active);
|
|
437
|
-
if (direction === 'asc' || direction === 'desc') {
|
|
438
|
-
this.store.stateView.sort({
|
|
439
|
-
valueAccessor: (record) => this.getValue(record, column),
|
|
440
|
-
direction,
|
|
441
|
-
nullsFirst: this.sortNullsFirst
|
|
442
|
-
});
|
|
443
|
-
this.entitySortChange.emit({ column, direction });
|
|
444
|
-
this.entitySortChange$.next(true);
|
|
445
|
-
}
|
|
446
|
-
else {
|
|
447
|
-
this.store.stateView.sort(undefined);
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
/**
|
|
451
|
-
* When an entity is clicked, emit an event
|
|
452
|
-
* @param record Record
|
|
453
|
-
* @internal
|
|
454
|
-
*/
|
|
455
|
-
onRowClick(record) {
|
|
456
|
-
this.lastRecordCheckedKey = this.store.stateView.getKey(record);
|
|
457
|
-
this.entityClick.emit(record.entity);
|
|
458
|
-
}
|
|
459
|
-
/**
|
|
460
|
-
* When an entity is selected, select it in the store and emit an event. Even if
|
|
461
|
-
* "many" is set to true, this method always select a single, exclusive row. Selecting
|
|
462
|
-
* multiple rows should be achieved by using the checkboxes.
|
|
463
|
-
* @param record Record
|
|
464
|
-
* @internal
|
|
465
|
-
*/
|
|
466
|
-
onRowSelect(record) {
|
|
467
|
-
if (this.selection === false) {
|
|
468
|
-
return;
|
|
469
|
-
}
|
|
470
|
-
const entity = record.entity;
|
|
471
|
-
this.store.state.update(entity, { selected: true }, true);
|
|
472
|
-
this.entitySelectChange.emit({ added: [entity] });
|
|
473
|
-
}
|
|
474
|
-
/**
|
|
475
|
-
* Select or unselect all rows at once. On select, emit an event.
|
|
476
|
-
* @param toggle Select or unselect
|
|
477
|
-
* @internal
|
|
478
|
-
*/
|
|
479
|
-
onToggleRows(toggle) {
|
|
480
|
-
if (this.selection === false) {
|
|
481
|
-
return;
|
|
482
|
-
}
|
|
483
|
-
const entities = this.store.view.all();
|
|
484
|
-
this.entitySelectChange.emit({ added: [entities] });
|
|
485
|
-
this.store.state.updateMany(entities, { selected: toggle });
|
|
486
|
-
}
|
|
487
|
-
/**
|
|
488
|
-
* When an entity is toggled, select or unselect it in the store. On select,
|
|
489
|
-
* emit an event.
|
|
490
|
-
* @param toggle Select or unselect
|
|
491
|
-
* @param record Record
|
|
492
|
-
* @internal
|
|
493
|
-
*/
|
|
494
|
-
onToggleRow(toggle, record) {
|
|
495
|
-
if (this.selection === false) {
|
|
496
|
-
return;
|
|
497
|
-
}
|
|
498
|
-
const entity = record.entity;
|
|
499
|
-
const exclusive = toggle === true && !this.selectMany;
|
|
500
|
-
this.store.state.update(entity, { selected: toggle }, exclusive);
|
|
501
|
-
if (toggle === true) {
|
|
502
|
-
this.entitySelectChange.emit({ added: [entity] });
|
|
503
|
-
}
|
|
504
|
-
this.lastRecordCheckedKey = this.store.stateView.getKey(record);
|
|
505
|
-
}
|
|
506
|
-
/**
|
|
507
|
-
* When an entity is toggled, select or unselect it in the store. On select,
|
|
508
|
-
* emit an event.
|
|
509
|
-
* @param toggle Select or unselect
|
|
510
|
-
* @param record Record
|
|
511
|
-
* @internal
|
|
512
|
-
*/
|
|
513
|
-
onShiftToggleRow(toggle, record, event) {
|
|
514
|
-
if (this.selection === false) {
|
|
515
|
-
return;
|
|
516
|
-
}
|
|
517
|
-
if (this.selectMany === false || this.lastRecordCheckedKey === undefined) {
|
|
518
|
-
this.onToggleRow(toggle, record);
|
|
519
|
-
return;
|
|
520
|
-
}
|
|
521
|
-
// This is a workaround mat checkbox wrong behavior
|
|
522
|
-
// when the shift key is held.
|
|
523
|
-
// See https://github.com/angular/components/issues/6232
|
|
524
|
-
const range = window.document.createRange();
|
|
525
|
-
range.selectNode(event.target);
|
|
526
|
-
window.getSelection().removeAllRanges();
|
|
527
|
-
window.getSelection().addRange(range);
|
|
528
|
-
event.stopImmediatePropagation();
|
|
529
|
-
const records = this.store.stateView.all();
|
|
530
|
-
const recordIndex = records.indexOf(record);
|
|
531
|
-
const lastRecordChecked = this.store.stateView.get(this.lastRecordCheckedKey);
|
|
532
|
-
const lastRecordIndex = records.indexOf(lastRecordChecked);
|
|
533
|
-
const indexes = [recordIndex, lastRecordIndex];
|
|
534
|
-
const selectRecords = records.slice(Math.min(...indexes), Math.max(...indexes) + 1);
|
|
535
|
-
const entities = selectRecords.map((_record) => _record.entity);
|
|
536
|
-
this.store.state.updateMany(entities, { selected: toggle });
|
|
537
|
-
if (toggle === true) {
|
|
538
|
-
this.entitySelectChange.emit({ added: entities });
|
|
539
|
-
}
|
|
540
|
-
this.lastRecordCheckedKey = this.store.stateView.getKey(record);
|
|
541
|
-
}
|
|
542
|
-
/**
|
|
543
|
-
* Compute the selection state
|
|
544
|
-
* @returns Whether all, some or no rows are selected
|
|
545
|
-
* @internal
|
|
546
|
-
*/
|
|
547
|
-
computeSelectionState(selectedRecords) {
|
|
548
|
-
const states = EntityTableSelectionState;
|
|
549
|
-
const selectionCount = selectedRecords.length;
|
|
550
|
-
return selectionCount === 0
|
|
551
|
-
? states.None
|
|
552
|
-
: selectionCount === this.store.stateView.count
|
|
553
|
-
? states.All
|
|
554
|
-
: states.Some;
|
|
555
|
-
}
|
|
556
|
-
/**
|
|
557
|
-
* Whether a column is sortable
|
|
558
|
-
* @param column Column
|
|
559
|
-
* @returns True if a column is sortable
|
|
560
|
-
* @internal
|
|
561
|
-
*/
|
|
562
|
-
columnIsSortable(column) {
|
|
563
|
-
let sortable = column.sort;
|
|
564
|
-
if (sortable === undefined) {
|
|
565
|
-
sortable = this.template.sort === undefined ? false : this.template.sort;
|
|
566
|
-
}
|
|
567
|
-
return sortable;
|
|
568
|
-
}
|
|
569
|
-
/**
|
|
570
|
-
* Whether a row is should be selected based on the underlying entity state
|
|
571
|
-
* @param record Record
|
|
572
|
-
* @returns True if a row should be selected
|
|
573
|
-
* @internal
|
|
574
|
-
*/
|
|
575
|
-
rowIsSelected(record) {
|
|
576
|
-
const state = record.state;
|
|
577
|
-
return state.selected ? state.selected : false;
|
|
578
|
-
}
|
|
579
|
-
isImg(value) {
|
|
580
|
-
if (this.isUrl(value)) {
|
|
581
|
-
return (['jpg', 'png', 'gif'].indexOf(value.split('.').pop().toLowerCase()) !==
|
|
582
|
-
-1);
|
|
583
|
-
}
|
|
584
|
-
else {
|
|
585
|
-
return false;
|
|
586
|
-
}
|
|
587
|
-
}
|
|
588
|
-
isUrl(value) {
|
|
589
|
-
if (typeof value === 'string') {
|
|
590
|
-
return (value.slice(0, 8) === 'https://' || value.slice(0, 7) === 'http://');
|
|
591
|
-
}
|
|
592
|
-
else {
|
|
593
|
-
return false;
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
/**
|
|
597
|
-
* Method to access an entity's values
|
|
598
|
-
* @param record Record
|
|
599
|
-
* @param column Column
|
|
600
|
-
* @returns Any value
|
|
601
|
-
* @internal
|
|
602
|
-
*/
|
|
603
|
-
getValue(record, column) {
|
|
604
|
-
const entity = record.entity;
|
|
605
|
-
let value;
|
|
606
|
-
if (column.valueAccessor !== undefined) {
|
|
607
|
-
return column.valueAccessor(entity, record);
|
|
608
|
-
}
|
|
609
|
-
if (this.template.valueAccessor !== undefined) {
|
|
610
|
-
return this.template.valueAccessor(entity, column.name, record);
|
|
611
|
-
}
|
|
612
|
-
value = this.store.getProperty(entity, column.name);
|
|
613
|
-
if (column.type === 'boolean') {
|
|
614
|
-
if (value === undefined || value === null || value === '') {
|
|
615
|
-
value = false;
|
|
616
|
-
}
|
|
617
|
-
else if (typeof value !== 'boolean' && value !== undefined) {
|
|
618
|
-
if (typeof value === 'number') {
|
|
619
|
-
value = Boolean(value);
|
|
620
|
-
}
|
|
621
|
-
else {
|
|
622
|
-
value = JSON.parse(value.toLowerCase());
|
|
623
|
-
}
|
|
624
|
-
}
|
|
625
|
-
if (!this.isEdition(record)) {
|
|
626
|
-
value = value ? '✓' : ''; // check mark
|
|
627
|
-
}
|
|
628
|
-
}
|
|
629
|
-
else if (column.type === 'list' && value && column.domainValues) {
|
|
630
|
-
const entity = record.entity;
|
|
631
|
-
if (column.multiple) {
|
|
632
|
-
let list_id;
|
|
633
|
-
typeof value === 'string'
|
|
634
|
-
? (list_id = value.match(/[\w.-]+/g).map(Number))
|
|
635
|
-
: (list_id = value);
|
|
636
|
-
let list_option = [];
|
|
637
|
-
column.domainValues.forEach((option) => {
|
|
638
|
-
if (list_id.includes(option.id)) {
|
|
639
|
-
if (record.edition) {
|
|
640
|
-
list_option.push(option.id);
|
|
641
|
-
}
|
|
642
|
-
else {
|
|
643
|
-
list_option.push(option.value);
|
|
644
|
-
}
|
|
645
|
-
}
|
|
646
|
-
});
|
|
647
|
-
this.isEdition(record) ? (value = list_id) : (value = list_option);
|
|
648
|
-
}
|
|
649
|
-
else {
|
|
650
|
-
if (!this.isEdition(record) && column.linkColumnForce) {
|
|
651
|
-
value =
|
|
652
|
-
entity?.properties[this.getColumnKeyWithoutPropertiesTag(column.linkColumnForce)];
|
|
653
|
-
}
|
|
654
|
-
else {
|
|
655
|
-
column.domainValues.forEach((option) => {
|
|
656
|
-
if (typeof value === 'string' &&
|
|
657
|
-
StringUtils.isValidNumber(value) &&
|
|
658
|
-
!StringUtils.isOctalNumber(value)) {
|
|
659
|
-
value = parseInt(value);
|
|
660
|
-
}
|
|
661
|
-
if (option.value === value || option.id === value) {
|
|
662
|
-
this.isEdition(record)
|
|
663
|
-
? (value = option.id)
|
|
664
|
-
: (value = option.value);
|
|
665
|
-
}
|
|
666
|
-
});
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
}
|
|
670
|
-
else if (column.type === 'autocomplete' && value && column.domainValues) {
|
|
671
|
-
const entity = record.entity;
|
|
672
|
-
if (!this.isEdition(record) && column.linkColumnForce) {
|
|
673
|
-
value =
|
|
674
|
-
entity?.properties[this.getColumnKeyWithoutPropertiesTag(column.linkColumnForce)];
|
|
675
|
-
}
|
|
676
|
-
else {
|
|
677
|
-
column.domainValues.forEach((option) => {
|
|
678
|
-
if (typeof value === 'string' &&
|
|
679
|
-
StringUtils.isValidNumber(value) &&
|
|
680
|
-
!StringUtils.isOctalNumber(value)) {
|
|
681
|
-
value = parseInt(value);
|
|
682
|
-
}
|
|
683
|
-
if (option.value === value || option.id === value) {
|
|
684
|
-
value = option.value;
|
|
685
|
-
}
|
|
686
|
-
});
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
else if (column.type === 'date') {
|
|
690
|
-
if (this.isEdition(record)) {
|
|
691
|
-
if (value) {
|
|
692
|
-
let date = moment(value);
|
|
693
|
-
value = date.format();
|
|
694
|
-
this.formGroup.controls[column.name].setValue(value);
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
else if (!this.isEdition(record) && value === null) {
|
|
698
|
-
value = '';
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
if (value === undefined) {
|
|
702
|
-
value = '';
|
|
703
|
-
}
|
|
704
|
-
return value;
|
|
705
|
-
}
|
|
706
|
-
/**
|
|
707
|
-
* Method to access an entity's validation values
|
|
708
|
-
* @param column Column
|
|
709
|
-
* @param validationType string
|
|
710
|
-
* @returns Any value (false if no validation or not the one concerned)
|
|
711
|
-
* @internal
|
|
712
|
-
*/
|
|
713
|
-
getValidationAttributeValue(column, validationType) {
|
|
714
|
-
if (column.validation !== undefined &&
|
|
715
|
-
column.validation[validationType] !== undefined) {
|
|
716
|
-
return column.validation[validationType];
|
|
717
|
-
}
|
|
718
|
-
else {
|
|
719
|
-
return false;
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
isEdition(record) {
|
|
723
|
-
return record.entity.edition ? true : false;
|
|
724
|
-
}
|
|
725
|
-
/**
|
|
726
|
-
* Return the type of renderer of a column
|
|
727
|
-
* @param column Column
|
|
728
|
-
* @returns Renderer type
|
|
729
|
-
* @internal
|
|
730
|
-
*/
|
|
731
|
-
getColumnRenderer(column) {
|
|
732
|
-
if (column.renderer !== undefined) {
|
|
733
|
-
return column.renderer;
|
|
734
|
-
}
|
|
735
|
-
return EntityTableColumnRenderer.Default;
|
|
736
|
-
}
|
|
737
|
-
/**
|
|
738
|
-
* Return the table ngClass
|
|
739
|
-
* @returns ngClass
|
|
740
|
-
* @internal
|
|
741
|
-
*/
|
|
742
|
-
getTableClass() {
|
|
743
|
-
return {
|
|
744
|
-
'igo-entity-table-with-selection': this.selection
|
|
745
|
-
};
|
|
746
|
-
}
|
|
747
|
-
/**
|
|
748
|
-
* Return a header ngClass
|
|
749
|
-
* @returns ngClass
|
|
750
|
-
* @internal
|
|
751
|
-
*/
|
|
752
|
-
getHeaderClass() {
|
|
753
|
-
const func = this.template.headerClassFunc;
|
|
754
|
-
if (func instanceof Function) {
|
|
755
|
-
return func();
|
|
756
|
-
}
|
|
757
|
-
return {};
|
|
758
|
-
}
|
|
759
|
-
/**
|
|
760
|
-
* Return a row ngClass
|
|
761
|
-
* @param record Record
|
|
762
|
-
* @returns ngClass
|
|
763
|
-
* @internal
|
|
764
|
-
*/
|
|
765
|
-
getRowClass(record) {
|
|
766
|
-
const entity = record.entity;
|
|
767
|
-
const func = this.template.rowClassFunc;
|
|
768
|
-
if (func instanceof Function) {
|
|
769
|
-
return func(entity, record);
|
|
770
|
-
}
|
|
771
|
-
return {};
|
|
772
|
-
}
|
|
773
|
-
/**
|
|
774
|
-
* Return a row ngClass
|
|
775
|
-
* @param record Record
|
|
776
|
-
* @param column Column
|
|
777
|
-
* @returns ngClass
|
|
778
|
-
* @internal
|
|
779
|
-
*/
|
|
780
|
-
getCellClass(record, column) {
|
|
781
|
-
const entity = record.entity;
|
|
782
|
-
const cls = {};
|
|
783
|
-
const tableFunc = this.template.cellClassFunc;
|
|
784
|
-
if (tableFunc instanceof Function) {
|
|
785
|
-
Object.assign(cls, tableFunc(entity, column, record));
|
|
786
|
-
}
|
|
787
|
-
const columnFunc = column.cellClassFunc;
|
|
788
|
-
if (columnFunc instanceof Function) {
|
|
789
|
-
Object.assign(cls, columnFunc(entity, record));
|
|
790
|
-
}
|
|
791
|
-
return cls;
|
|
792
|
-
}
|
|
793
|
-
/**
|
|
794
|
-
* When a button is clicked
|
|
795
|
-
* @param func Function
|
|
796
|
-
* @param record Record
|
|
797
|
-
* @internal
|
|
798
|
-
*/
|
|
799
|
-
onButtonClick(clickFunc, record) {
|
|
800
|
-
this.enableEdit(record);
|
|
801
|
-
if (typeof clickFunc === 'function') {
|
|
802
|
-
clickFunc(record.entity, record);
|
|
803
|
-
}
|
|
804
|
-
}
|
|
805
|
-
/**
|
|
806
|
-
* Retrieve column name without his "properties" tag (useful for edition workspace properties)
|
|
807
|
-
*/
|
|
808
|
-
getColumnKeyWithoutPropertiesTag(column) {
|
|
809
|
-
if (column.includes('properties.')) {
|
|
810
|
-
return column.split('.')[1];
|
|
811
|
-
}
|
|
812
|
-
return column;
|
|
813
|
-
}
|
|
814
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: EntityTableComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.UntypedFormBuilder }, { token: i2.FocusMonitor }, { token: i0.ElementRef }, { token: i1.NgControl, optional: true, self: true }, { token: i1.NgForm, optional: true }, { token: i1.FormControlName, optional: true }, { token: i3.ErrorStateMatcher }, { token: i3.DateAdapter }], target: i0.ɵɵFactoryTarget.Component });
|
|
815
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.2.1", type: EntityTableComponent, isStandalone: true, selector: "igo-entity-table", inputs: { store: "store", paginator: "paginator", template: "template", scrollBehavior: "scrollBehavior", sortNullsFirst: "sortNullsFirst", withPaginator: "withPaginator", paginatorOptions: "paginatorOptions" }, outputs: { entityClick: "entityClick", entitySelectChange: "entitySelectChange", entitySortChange: "entitySortChange" }, providers: [
|
|
816
|
-
{ provide: MatFormFieldControl, useExisting: EntityTableComponent },
|
|
817
|
-
provideMomentDateAdapter()
|
|
818
|
-
], usesOnChanges: true, ngImport: i0, template: "<div class=\"table-container\" [ngStyle]=\"{ height: tableHeight }\">\r\n <table\r\n id=\"currentWorkspaceTable\"\r\n mat-table\r\n matSort\r\n [ngClass]=\"getTableClass()\"\r\n [dataSource]=\"dataSource\"\r\n [trackBy]=\"getTrackByFunction()\"\r\n (matSortChange)=\"onSort($event)\"\r\n >\r\n <ng-container matColumnDef=\"selectionCheckbox\" class=\"mat-cell-checkbox\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <ng-container *ngIf=\"selectMany\">\r\n <ng-container *ngIf=\"selectionState$ | async as selectionState\">\r\n <mat-checkbox\r\n (change)=\"onToggleRows($event.checked)\"\r\n [checked]=\"selectionState === entityTableSelectionState.All\"\r\n [indeterminate]=\"\r\n selectionState === entityTableSelectionState.Some\r\n \"\r\n >\r\n </mat-checkbox>\r\n </ng-container>\r\n </ng-container>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (mousedown)=\"$event.shiftKey ? $event.preventDefault() : null\"\r\n (click)=\"\r\n $event.shiftKey\r\n ? onShiftToggleRow(!rowIsSelected(row.record), row.record, $event)\r\n : $event.stopPropagation()\r\n \"\r\n (change)=\"onToggleRow($event.checked, row.record)\"\r\n [checked]=\"rowIsSelected(row.record)\"\r\n >\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container\r\n [matColumnDef]=\"column.name\"\r\n *ngFor=\"let column of template.columns\"\r\n >\r\n <ng-container *ngIf=\"columnIsSortable(column)\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n mat-sort-header\r\n [matTooltip]=\"column.tooltip ? column.tooltip : undefined\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!columnIsSortable(column)\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n [matTooltip]=\"column.tooltip ? column.tooltip : undefined\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getColumnRenderer(column) as columnRenderer\">\r\n <ng-container\r\n *ngIf=\"columnRenderer === entityTableColumnRenderer.Default\"\r\n >\r\n <ng-container *matCellDef=\"let row\">\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text\"\r\n *ngIf=\"!row.cellData[column.name].isUrl; else isAnUrlDefault\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n >\r\n {{ row.cellData[column.name].value }}\r\n </td>\r\n <ng-template #isAnUrlDefault>\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n >\r\n <a\r\n href=\"{{ row.cellData[column.name].value }}\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <img\r\n igoImageError\r\n *ngIf=\"row.cellData[column.name].isImg; else notImg\"\r\n src=\"{{\r\n row.cellData[column.name].value | secureImage | async\r\n }}\"\r\n width=\"50\"\r\n heigth=\"auto\"\r\n />\r\n <ng-template #notImg\r\n ><span\r\n >{{ 'igo.common.entity-table.targetHtmlUrl' | translate }}\r\n </span></ng-template\r\n >\r\n </a>\r\n </td>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"columnRenderer === entityTableColumnRenderer.HTML\">\r\n <ng-container *matCellDef=\"let row\">\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text\"\r\n *ngIf=\"!row.cellData[column.name].isUrl; else isAnUrlHTML\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n [innerHTML]=\"row.cellData[column.name].value\"\r\n ></td>\r\n <ng-template #isAnUrlHTML>\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n >\r\n <a\r\n href=\"{{ row.cellData[column.name].value }}\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <img\r\n igoImageError\r\n *ngIf=\"row.cellData[column.name].isImg; else notImg\"\r\n src=\"{{\r\n row.cellData[column.name].value | secureImage | async\r\n }}\"\r\n width=\"50\"\r\n heigth=\"auto\"\r\n />\r\n <ng-template #notImg\r\n ><span\r\n >{{ 'igo.geo.targetHtmlUrl' | translate }}\r\n </span></ng-template\r\n >\r\n </a>\r\n </td>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"columnRenderer === entityTableColumnRenderer.UnsanitizedHTML\"\r\n >\r\n <ng-container *matCellDef=\"let row\">\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text edition\"\r\n [formGroup]=\"formGroup\"\r\n *ngIf=\"isEdition(row.record); else isUnsanitizedHTML\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n >\r\n <div class=\"date-picker\" *ngIf=\"column.type === 'date'\">\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"picker\"\r\n ></mat-datepicker-toggle>\r\n <input\r\n matInput\r\n [matDatepicker]=\"picker\"\r\n [formControlName]=\"column.name\"\r\n value=\"{{ row.cellData[column.name].value }}\"\r\n (dateChange)=\"onDateChange(column.name, row.record, $event)\"\r\n />\r\n <mat-datepicker #picker></mat-datepicker>\r\n </div>\r\n <input\r\n matInput\r\n type=\"time\"\r\n *ngIf=\"column.type === 'time'\"\r\n [formControlName]=\"column.name\"\r\n step=\"900\"\r\n (focus)=\"column.onFocus($event)\"\r\n (keypress)=\"column.onChange($event)\"\r\n (blur)=\"column.onBlur($event)\"\r\n />\r\n <input\r\n matInput\r\n type=\"number\"\r\n class=\"class_number_edition\"\r\n *ngIf=\"column.type === 'number'\"\r\n [formControlName]=\"column.name\"\r\n step=\"{{ column.step }}\"\r\n value=\"{{ row.cellData[column.name].value }}\"\r\n (input)=\"onValueChange(column.name, row.record, $event)\"\r\n readonly=\"{{ getValidationAttributeValue(column, 'readonly') }}\"\r\n required=\"{{\r\n getValidationAttributeValue(column, 'mandatory')\r\n }}\"\r\n min=\"{{ getValidationAttributeValue(column, 'minValue') }}\"\r\n max=\"{{ getValidationAttributeValue(column, 'maxValue') }}\"\r\n />\r\n <input\r\n matInput\r\n type=\"text\"\r\n *ngIf=\"!column.type || column.type === 'string'\"\r\n [formControlName]=\"column.name\"\r\n value=\"{{ row.cellData[column.name].value }}\"\r\n (input)=\"onValueChange(column.name, row.record, $event)\"\r\n readonly=\"{{ getValidationAttributeValue(column, 'readonly') }}\"\r\n required=\"{{\r\n getValidationAttributeValue(column, 'mandatory')\r\n }}\"\r\n />\r\n <mat-checkbox\r\n *ngIf=\"column.type === 'boolean'\"\r\n [formControlName]=\"column.name\"\r\n [checked]=\"row.cellData[column.name].value\"\r\n (change)=\"onBooleanValueChange(column.name, row.record, $event)\"\r\n ></mat-checkbox>\r\n <mat-select\r\n *ngIf=\"column.type === 'list'\"\r\n required=\"{{\r\n getValidationAttributeValue(column, 'mandatory')\r\n }}\"\r\n [formControlName]=\"column.name\"\r\n [multiple]=\"column.multiple\"\r\n (selectionChange)=\"\r\n onSelectValueChange(column.name, row.record, $event)\r\n \"\r\n [value]=\"row.cellData[column.name].value\"\r\n >\r\n <mat-option\r\n *ngFor=\"let option of column.domainValues\"\r\n [value]=\"option.id\"\r\n [disabled]=\"option.disabled\"\r\n >\r\n {{ option.value }}\r\n </mat-option>\r\n </mat-select>\r\n <input\r\n matInput\r\n type=\"text\"\r\n [formControlName]=\"column.name\"\r\n *ngIf=\"column.type === 'autocomplete'\"\r\n [matAutocomplete]=\"auto\"\r\n required=\"{{\r\n getValidationAttributeValue(column, 'mandatory')\r\n }}\"\r\n value=\"{{ row.cellData[column.name].value }}\"\r\n readonly=\"{{ getValidationAttributeValue(column, 'readonly') }}\"\r\n />\r\n <mat-autocomplete\r\n #auto=\"matAutocomplete\"\r\n (optionSelected)=\"\r\n onAutocompleteValueChange(column, row.record, $event)\r\n \"\r\n panelWidth=\"430px\"\r\n >\r\n <mat-option\r\n *ngFor=\"let option of filteredOptions[column.name] | async\"\r\n [value]=\"option.id\"\r\n >\r\n {{ option.value }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </td>\r\n <ng-template #isUnsanitizedHTML>\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text\"\r\n *ngIf=\"\r\n !row.cellData[column.name].isUrl;\r\n else isAnUrlUnsanitizedHTML\r\n \"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n [innerHTML]=\"row.cellData[column.name].value | sanitizeHtml\"\r\n ></td>\r\n <ng-template #isAnUrlUnsanitizedHTML>\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n >\r\n <a\r\n href=\"{{ row.cellData[column.name].value }}\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <img\r\n igoImageError\r\n *ngIf=\"row.cellData[column.name].isImg; else notImg\"\r\n src=\"{{\r\n row.cellData[column.name].value | secureImage | async\r\n }}\"\r\n width=\"50\"\r\n heigth=\"auto\"\r\n />\r\n <ng-template #notImg\r\n ><span\r\n >{{ 'igo.geo.targetHtmlUrl' | translate }}\r\n </span></ng-template\r\n >\r\n </a>\r\n </td>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"columnRenderer === entityTableColumnRenderer.Icon\">\r\n <td\r\n mat-cell\r\n *matCellDef=\"let row\"\r\n class=\"mat-cell-text\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n >\r\n <mat-icon\r\n *ngIf=\"column.onClick\"\r\n svgIcon=\"{{ row.cellData[column.name].value || column.icon }}\"\r\n (click)=\"column.onClick($event)\"\r\n ></mat-icon>\r\n <mat-icon\r\n *ngIf=\"!column.onClick\"\r\n svgIcon=\"{{ row.cellData[column.name].value || column.icon }}\"\r\n ></mat-icon>\r\n </td>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"columnRenderer === entityTableColumnRenderer.ButtonGroup\"\r\n >\r\n <ng-container *matCellDef=\"let row\">\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n >\r\n <span *ngFor=\"let button of row.cellData[column.name].value\">\r\n <ng-container\r\n *ngIf=\"\r\n isEdition(row.record) === button.editMode ||\r\n button.editMode === undefined\r\n \"\r\n >\r\n <button\r\n *ngIf=\"button.style === 'mat-icon-button'\"\r\n igoStopPropagation\r\n mat-icon-button\r\n [color]=\"button.color\"\r\n (mousedown)=\"onButtonClick(button.click, row.record)\"\r\n [disabled]=\"button.disabled\"\r\n >\r\n <mat-icon svgIcon=\"{{ button.icon }}\"></mat-icon>\r\n </button>\r\n <button\r\n *ngIf=\"button.style !== 'mat-icon-button'\"\r\n igoStopPropagation\r\n mat-mini-fab\r\n [color]=\"button.color\"\r\n (mousedown)=\"onButtonClick(button.click, row.record)\"\r\n [disabled]=\"button.disabled\"\r\n >\r\n <mat-icon svgIcon=\"{{ button.icon }}\"></mat-icon>\r\n </button>\r\n </ng-container>\r\n </span>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <tr\r\n mat-header-row\r\n *matHeaderRowDef=\"headers; sticky: fixedHeader\"\r\n [ngClass]=\"getHeaderClass()\"\r\n ></tr>\r\n <tr\r\n mat-row\r\n igoEntityTableRow\r\n *matRowDef=\"let row; columns: headers\"\r\n [scrollBehavior]=\"scrollBehavior\"\r\n [ngClass]=\"getRowClass(row.record)\"\r\n [selection]=\"selection\"\r\n [selected]=\"rowIsSelected(row.record)\"\r\n (select)=\"onRowSelect(row.record)\"\r\n (click)=\"onRowClick(row.record)\"\r\n ></tr>\r\n </table>\r\n <igo-entity-table-paginator\r\n *ngIf=\"withPaginator\"\r\n [store]=\"store\"\r\n [paginatorOptions]=\"paginatorOptions\"\r\n [entitySortChange$]=\"entitySortChange$\"\r\n (paginatorChange)=\"paginatorChange($event)\"\r\n >\r\n </igo-entity-table-paginator>\r\n</div>\r\n", styles: [":host{width:100%;height:100%;display:block}:host.table-compact tr.mat-mdc-header-row,:host.table-compact ::ng-deep mat-checkbox .mat-ripple{height:36px}:host.table-compact tr.mat-mdc-row,:host.table-compact ::ng-deep mat-checkbox .mat-ripple{height:28px}:host .table-container{display:flex;flex-direction:column;height:100%;overflow:auto;flex:1 1 auto}:host .mat-cell-text{overflow:hidden;word-wrap:break-word}:host entity-table table.igo-entity-table-with-selection tr:hover{-moz-box-shadow:2px 0px 2px 0px #dddddd;-webkit-box-shadow:2px 0px 2px 0px #dddddd;-o-box-shadow:2px 0px 2px 0px #dddddd;box-shadow:2px 0 2px #ddd;cursor:pointer}:host table button{margin:7px}:host .class_hidden{visibility:hidden}:host .class_display_none{display:none}:host .class_boolean,:host .class_icon,:host .class_number{text-align:center;padding-right:35px!important}:host .class_string,:host .class_text,:host .class_number_edition{text-align:left}:host td.edition{background:#a6a6a633}:host input{border-bottom:1px solid darkgrey}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: EntityTablePaginatorComponent, selector: "igo-entity-table-paginator", inputs: ["entitySortChange$", "store", "paginatorOptions"], outputs: ["page", "paginatorChange"] }, { kind: "directive", type: EntityTableRowDirective, selector: "[igoEntityTableRow]", inputs: ["selection", "selectOnClick", "highlightSelection", "selected", "scrollBehavior"], outputs: ["select"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: ImageErrorDirective, selector: "[igoImageError]", inputs: ["errorImageUrl", "hideError"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i4.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i4.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i5.MatMiniFabButton, selector: "button[mat-mini-fab]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i7.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i7.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i7.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: // For the DateAdapter provider
|
|
819
|
-
MatOptionModule }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i12.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i12.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i13.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i13.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i13.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i13.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i13.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i13.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i13.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i13.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i13.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i13.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "pipe", type: SanitizeHtmlPipe, name: "sanitizeHtml" }, { kind: "pipe", type: SecureImagePipe, name: "secureImage" }, { kind: "directive", type: StopPropagationDirective, selector: "[igoStopPropagation]" }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i15.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
820
|
-
}
|
|
821
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.2.1", ngImport: i0, type: EntityTableComponent, decorators: [{
|
|
822
|
-
type: Component,
|
|
823
|
-
args: [{ selector: 'igo-entity-table', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
824
|
-
{ provide: MatFormFieldControl, useExisting: EntityTableComponent },
|
|
825
|
-
provideMomentDateAdapter()
|
|
826
|
-
], standalone: true, imports: [
|
|
827
|
-
AsyncPipe,
|
|
828
|
-
EntityTablePaginatorComponent,
|
|
829
|
-
EntityTableRowDirective,
|
|
830
|
-
FormsModule,
|
|
831
|
-
ImageErrorDirective,
|
|
832
|
-
MatAutocompleteModule,
|
|
833
|
-
MatButtonModule,
|
|
834
|
-
MatCheckboxModule,
|
|
835
|
-
MatDatepickerModule,
|
|
836
|
-
MatFormFieldModule,
|
|
837
|
-
MatIconModule,
|
|
838
|
-
MatInputModule,
|
|
839
|
-
MatNativeDateModule, // For the DateAdapter provider
|
|
840
|
-
MatOptionModule,
|
|
841
|
-
MatSelectModule,
|
|
842
|
-
MatSortModule,
|
|
843
|
-
MatTableModule,
|
|
844
|
-
MatTooltipModule,
|
|
845
|
-
NgClass,
|
|
846
|
-
NgFor,
|
|
847
|
-
NgIf,
|
|
848
|
-
NgStyle,
|
|
849
|
-
ReactiveFormsModule,
|
|
850
|
-
SanitizeHtmlPipe,
|
|
851
|
-
SecureImagePipe,
|
|
852
|
-
StopPropagationDirective,
|
|
853
|
-
TranslateModule
|
|
854
|
-
], template: "<div class=\"table-container\" [ngStyle]=\"{ height: tableHeight }\">\r\n <table\r\n id=\"currentWorkspaceTable\"\r\n mat-table\r\n matSort\r\n [ngClass]=\"getTableClass()\"\r\n [dataSource]=\"dataSource\"\r\n [trackBy]=\"getTrackByFunction()\"\r\n (matSortChange)=\"onSort($event)\"\r\n >\r\n <ng-container matColumnDef=\"selectionCheckbox\" class=\"mat-cell-checkbox\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n <ng-container *ngIf=\"selectMany\">\r\n <ng-container *ngIf=\"selectionState$ | async as selectionState\">\r\n <mat-checkbox\r\n (change)=\"onToggleRows($event.checked)\"\r\n [checked]=\"selectionState === entityTableSelectionState.All\"\r\n [indeterminate]=\"\r\n selectionState === entityTableSelectionState.Some\r\n \"\r\n >\r\n </mat-checkbox>\r\n </ng-container>\r\n </ng-container>\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox\r\n (mousedown)=\"$event.shiftKey ? $event.preventDefault() : null\"\r\n (click)=\"\r\n $event.shiftKey\r\n ? onShiftToggleRow(!rowIsSelected(row.record), row.record, $event)\r\n : $event.stopPropagation()\r\n \"\r\n (change)=\"onToggleRow($event.checked, row.record)\"\r\n [checked]=\"rowIsSelected(row.record)\"\r\n >\r\n </mat-checkbox>\r\n </td>\r\n </ng-container>\r\n\r\n <ng-container\r\n [matColumnDef]=\"column.name\"\r\n *ngFor=\"let column of template.columns\"\r\n >\r\n <ng-container *ngIf=\"columnIsSortable(column)\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n mat-sort-header\r\n [matTooltip]=\"column.tooltip ? column.tooltip : undefined\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!columnIsSortable(column)\">\r\n <th\r\n mat-header-cell\r\n *matHeaderCellDef\r\n [matTooltip]=\"column.tooltip ? column.tooltip : undefined\"\r\n >\r\n {{ column.title }}\r\n </th>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"getColumnRenderer(column) as columnRenderer\">\r\n <ng-container\r\n *ngIf=\"columnRenderer === entityTableColumnRenderer.Default\"\r\n >\r\n <ng-container *matCellDef=\"let row\">\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text\"\r\n *ngIf=\"!row.cellData[column.name].isUrl; else isAnUrlDefault\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n >\r\n {{ row.cellData[column.name].value }}\r\n </td>\r\n <ng-template #isAnUrlDefault>\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n >\r\n <a\r\n href=\"{{ row.cellData[column.name].value }}\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <img\r\n igoImageError\r\n *ngIf=\"row.cellData[column.name].isImg; else notImg\"\r\n src=\"{{\r\n row.cellData[column.name].value | secureImage | async\r\n }}\"\r\n width=\"50\"\r\n heigth=\"auto\"\r\n />\r\n <ng-template #notImg\r\n ><span\r\n >{{ 'igo.common.entity-table.targetHtmlUrl' | translate }}\r\n </span></ng-template\r\n >\r\n </a>\r\n </td>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"columnRenderer === entityTableColumnRenderer.HTML\">\r\n <ng-container *matCellDef=\"let row\">\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text\"\r\n *ngIf=\"!row.cellData[column.name].isUrl; else isAnUrlHTML\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n [innerHTML]=\"row.cellData[column.name].value\"\r\n ></td>\r\n <ng-template #isAnUrlHTML>\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n >\r\n <a\r\n href=\"{{ row.cellData[column.name].value }}\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <img\r\n igoImageError\r\n *ngIf=\"row.cellData[column.name].isImg; else notImg\"\r\n src=\"{{\r\n row.cellData[column.name].value | secureImage | async\r\n }}\"\r\n width=\"50\"\r\n heigth=\"auto\"\r\n />\r\n <ng-template #notImg\r\n ><span\r\n >{{ 'igo.geo.targetHtmlUrl' | translate }}\r\n </span></ng-template\r\n >\r\n </a>\r\n </td>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"columnRenderer === entityTableColumnRenderer.UnsanitizedHTML\"\r\n >\r\n <ng-container *matCellDef=\"let row\">\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text edition\"\r\n [formGroup]=\"formGroup\"\r\n *ngIf=\"isEdition(row.record); else isUnsanitizedHTML\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n >\r\n <div class=\"date-picker\" *ngIf=\"column.type === 'date'\">\r\n <mat-datepicker-toggle\r\n matSuffix\r\n [for]=\"picker\"\r\n ></mat-datepicker-toggle>\r\n <input\r\n matInput\r\n [matDatepicker]=\"picker\"\r\n [formControlName]=\"column.name\"\r\n value=\"{{ row.cellData[column.name].value }}\"\r\n (dateChange)=\"onDateChange(column.name, row.record, $event)\"\r\n />\r\n <mat-datepicker #picker></mat-datepicker>\r\n </div>\r\n <input\r\n matInput\r\n type=\"time\"\r\n *ngIf=\"column.type === 'time'\"\r\n [formControlName]=\"column.name\"\r\n step=\"900\"\r\n (focus)=\"column.onFocus($event)\"\r\n (keypress)=\"column.onChange($event)\"\r\n (blur)=\"column.onBlur($event)\"\r\n />\r\n <input\r\n matInput\r\n type=\"number\"\r\n class=\"class_number_edition\"\r\n *ngIf=\"column.type === 'number'\"\r\n [formControlName]=\"column.name\"\r\n step=\"{{ column.step }}\"\r\n value=\"{{ row.cellData[column.name].value }}\"\r\n (input)=\"onValueChange(column.name, row.record, $event)\"\r\n readonly=\"{{ getValidationAttributeValue(column, 'readonly') }}\"\r\n required=\"{{\r\n getValidationAttributeValue(column, 'mandatory')\r\n }}\"\r\n min=\"{{ getValidationAttributeValue(column, 'minValue') }}\"\r\n max=\"{{ getValidationAttributeValue(column, 'maxValue') }}\"\r\n />\r\n <input\r\n matInput\r\n type=\"text\"\r\n *ngIf=\"!column.type || column.type === 'string'\"\r\n [formControlName]=\"column.name\"\r\n value=\"{{ row.cellData[column.name].value }}\"\r\n (input)=\"onValueChange(column.name, row.record, $event)\"\r\n readonly=\"{{ getValidationAttributeValue(column, 'readonly') }}\"\r\n required=\"{{\r\n getValidationAttributeValue(column, 'mandatory')\r\n }}\"\r\n />\r\n <mat-checkbox\r\n *ngIf=\"column.type === 'boolean'\"\r\n [formControlName]=\"column.name\"\r\n [checked]=\"row.cellData[column.name].value\"\r\n (change)=\"onBooleanValueChange(column.name, row.record, $event)\"\r\n ></mat-checkbox>\r\n <mat-select\r\n *ngIf=\"column.type === 'list'\"\r\n required=\"{{\r\n getValidationAttributeValue(column, 'mandatory')\r\n }}\"\r\n [formControlName]=\"column.name\"\r\n [multiple]=\"column.multiple\"\r\n (selectionChange)=\"\r\n onSelectValueChange(column.name, row.record, $event)\r\n \"\r\n [value]=\"row.cellData[column.name].value\"\r\n >\r\n <mat-option\r\n *ngFor=\"let option of column.domainValues\"\r\n [value]=\"option.id\"\r\n [disabled]=\"option.disabled\"\r\n >\r\n {{ option.value }}\r\n </mat-option>\r\n </mat-select>\r\n <input\r\n matInput\r\n type=\"text\"\r\n [formControlName]=\"column.name\"\r\n *ngIf=\"column.type === 'autocomplete'\"\r\n [matAutocomplete]=\"auto\"\r\n required=\"{{\r\n getValidationAttributeValue(column, 'mandatory')\r\n }}\"\r\n value=\"{{ row.cellData[column.name].value }}\"\r\n readonly=\"{{ getValidationAttributeValue(column, 'readonly') }}\"\r\n />\r\n <mat-autocomplete\r\n #auto=\"matAutocomplete\"\r\n (optionSelected)=\"\r\n onAutocompleteValueChange(column, row.record, $event)\r\n \"\r\n panelWidth=\"430px\"\r\n >\r\n <mat-option\r\n *ngFor=\"let option of filteredOptions[column.name] | async\"\r\n [value]=\"option.id\"\r\n >\r\n {{ option.value }}\r\n </mat-option>\r\n </mat-autocomplete>\r\n </td>\r\n <ng-template #isUnsanitizedHTML>\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text\"\r\n *ngIf=\"\r\n !row.cellData[column.name].isUrl;\r\n else isAnUrlUnsanitizedHTML\r\n \"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n [innerHTML]=\"row.cellData[column.name].value | sanitizeHtml\"\r\n ></td>\r\n <ng-template #isAnUrlUnsanitizedHTML>\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n >\r\n <a\r\n href=\"{{ row.cellData[column.name].value }}\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <img\r\n igoImageError\r\n *ngIf=\"row.cellData[column.name].isImg; else notImg\"\r\n src=\"{{\r\n row.cellData[column.name].value | secureImage | async\r\n }}\"\r\n width=\"50\"\r\n heigth=\"auto\"\r\n />\r\n <ng-template #notImg\r\n ><span\r\n >{{ 'igo.geo.targetHtmlUrl' | translate }}\r\n </span></ng-template\r\n >\r\n </a>\r\n </td>\r\n </ng-template>\r\n </ng-template>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"columnRenderer === entityTableColumnRenderer.Icon\">\r\n <td\r\n mat-cell\r\n *matCellDef=\"let row\"\r\n class=\"mat-cell-text\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n >\r\n <mat-icon\r\n *ngIf=\"column.onClick\"\r\n svgIcon=\"{{ row.cellData[column.name].value || column.icon }}\"\r\n (click)=\"column.onClick($event)\"\r\n ></mat-icon>\r\n <mat-icon\r\n *ngIf=\"!column.onClick\"\r\n svgIcon=\"{{ row.cellData[column.name].value || column.icon }}\"\r\n ></mat-icon>\r\n </td>\r\n </ng-container>\r\n <ng-container\r\n *ngIf=\"columnRenderer === entityTableColumnRenderer.ButtonGroup\"\r\n >\r\n <ng-container *matCellDef=\"let row\">\r\n <td\r\n mat-cell\r\n class=\"mat-cell-text\"\r\n [ngClass]=\"row.cellData[column.name].class\"\r\n >\r\n <span *ngFor=\"let button of row.cellData[column.name].value\">\r\n <ng-container\r\n *ngIf=\"\r\n isEdition(row.record) === button.editMode ||\r\n button.editMode === undefined\r\n \"\r\n >\r\n <button\r\n *ngIf=\"button.style === 'mat-icon-button'\"\r\n igoStopPropagation\r\n mat-icon-button\r\n [color]=\"button.color\"\r\n (mousedown)=\"onButtonClick(button.click, row.record)\"\r\n [disabled]=\"button.disabled\"\r\n >\r\n <mat-icon svgIcon=\"{{ button.icon }}\"></mat-icon>\r\n </button>\r\n <button\r\n *ngIf=\"button.style !== 'mat-icon-button'\"\r\n igoStopPropagation\r\n mat-mini-fab\r\n [color]=\"button.color\"\r\n (mousedown)=\"onButtonClick(button.click, row.record)\"\r\n [disabled]=\"button.disabled\"\r\n >\r\n <mat-icon svgIcon=\"{{ button.icon }}\"></mat-icon>\r\n </button>\r\n </ng-container>\r\n </span>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <tr\r\n mat-header-row\r\n *matHeaderRowDef=\"headers; sticky: fixedHeader\"\r\n [ngClass]=\"getHeaderClass()\"\r\n ></tr>\r\n <tr\r\n mat-row\r\n igoEntityTableRow\r\n *matRowDef=\"let row; columns: headers\"\r\n [scrollBehavior]=\"scrollBehavior\"\r\n [ngClass]=\"getRowClass(row.record)\"\r\n [selection]=\"selection\"\r\n [selected]=\"rowIsSelected(row.record)\"\r\n (select)=\"onRowSelect(row.record)\"\r\n (click)=\"onRowClick(row.record)\"\r\n ></tr>\r\n </table>\r\n <igo-entity-table-paginator\r\n *ngIf=\"withPaginator\"\r\n [store]=\"store\"\r\n [paginatorOptions]=\"paginatorOptions\"\r\n [entitySortChange$]=\"entitySortChange$\"\r\n (paginatorChange)=\"paginatorChange($event)\"\r\n >\r\n </igo-entity-table-paginator>\r\n</div>\r\n", styles: [":host{width:100%;height:100%;display:block}:host.table-compact tr.mat-mdc-header-row,:host.table-compact ::ng-deep mat-checkbox .mat-ripple{height:36px}:host.table-compact tr.mat-mdc-row,:host.table-compact ::ng-deep mat-checkbox .mat-ripple{height:28px}:host .table-container{display:flex;flex-direction:column;height:100%;overflow:auto;flex:1 1 auto}:host .mat-cell-text{overflow:hidden;word-wrap:break-word}:host entity-table table.igo-entity-table-with-selection tr:hover{-moz-box-shadow:2px 0px 2px 0px #dddddd;-webkit-box-shadow:2px 0px 2px 0px #dddddd;-o-box-shadow:2px 0px 2px 0px #dddddd;box-shadow:2px 0 2px #ddd;cursor:pointer}:host table button{margin:7px}:host .class_hidden{visibility:hidden}:host .class_display_none{display:none}:host .class_boolean,:host .class_icon,:host .class_number{text-align:center;padding-right:35px!important}:host .class_string,:host .class_text,:host .class_number_edition{text-align:left}:host td.edition{background:#a6a6a633}:host input{border-bottom:1px solid darkgrey}\n"] }]
|
|
855
|
-
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.UntypedFormBuilder }, { type: i2.FocusMonitor }, { type: i0.ElementRef }, { type: i1.NgControl, decorators: [{
|
|
856
|
-
type: Optional
|
|
857
|
-
}, {
|
|
858
|
-
type: Self
|
|
859
|
-
}] }, { type: i1.NgForm, decorators: [{
|
|
860
|
-
type: Optional
|
|
861
|
-
}] }, { type: i1.FormControlName, decorators: [{
|
|
862
|
-
type: Optional
|
|
863
|
-
}] }, { type: i3.ErrorStateMatcher }, { type: i3.DateAdapter }], propDecorators: { store: [{
|
|
864
|
-
type: Input
|
|
865
|
-
}], paginator: [{
|
|
866
|
-
type: Input
|
|
867
|
-
}], template: [{
|
|
868
|
-
type: Input
|
|
869
|
-
}], scrollBehavior: [{
|
|
870
|
-
type: Input
|
|
871
|
-
}], sortNullsFirst: [{
|
|
872
|
-
type: Input
|
|
873
|
-
}], withPaginator: [{
|
|
874
|
-
type: Input
|
|
875
|
-
}], paginatorOptions: [{
|
|
876
|
-
type: Input
|
|
877
|
-
}], entityClick: [{
|
|
878
|
-
type: Output
|
|
879
|
-
}], entitySelectChange: [{
|
|
880
|
-
type: Output
|
|
881
|
-
}], entitySortChange: [{
|
|
882
|
-
type: Output
|
|
883
|
-
}] } });
|
|
884
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXRhYmxlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvbGliL2VudGl0eS9lbnRpdHktdGFibGUvZW50aXR5LXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbW1vbi9zcmMvbGliL2VudGl0eS9lbnRpdHktdGFibGUvZW50aXR5LXRhYmxlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNFLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLElBQUksRUFHTCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsZUFBZSxFQUNmLFdBQVcsRUFDWCxTQUFTLEVBQ1QsTUFBTSxFQUNOLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsZ0JBQWdCLEVBQ2pCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFDTCxXQUFXLEVBQ1gsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUNuQixlQUFlLEVBQ2hCLE1BQU0sd0JBQXdCLENB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O3NCQURiLEtBQUs7Z0JBT04sY0FBYztzQkFEYixLQUFLO2dCQU9OLGFBQWE7c0JBRFosS0FBSztnQkFPTixnQkFBZ0I7c0JBRGYsS0FBSztnQkFNSSxXQUFXO3NCQUFwQixNQUFNO2dCQUtHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFPRyxnQkFBZ0I7c0JBQXpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBGb2N1c01vbml0b3IgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XHJcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdDbGFzcywgTmdGb3IsIE5nSWYsIE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPcHRpb25hbCxcclxuICBPdXRwdXQsXHJcbiAgU2VsZixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFRyYWNrQnlGdW5jdGlvblxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1Db250cm9sTmFtZSxcclxuICBGb3Jtc01vZHVsZSxcclxuICBOZ0NvbnRyb2wsXHJcbiAgTmdGb3JtLFxyXG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgVW50eXBlZEZvcm1CdWlsZGVyLFxyXG4gIFVudHlwZWRGb3JtR3JvdXBcclxufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IHByb3ZpZGVNb21lbnREYXRlQWRhcHRlciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsLW1vbWVudC1hZGFwdGVyJztcclxuaW1wb3J0IHsgTWF0QXV0b2NvbXBsZXRlTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7XHJcbiAgRGF0ZUFkYXB0ZXIsXHJcbiAgRXJyb3JTdGF0ZU1hdGNoZXIsXHJcbiAgTWF0TmF0aXZlRGF0ZU1vZHVsZSxcclxuICBNYXRPcHRpb25Nb2R1bGVcclxufSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcclxuaW1wb3J0IHsgTWF0RGF0ZXBpY2tlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXInO1xyXG5pbXBvcnQge1xyXG4gIE1hdEZvcm1GaWVsZENvbnRyb2wsXHJcbiAgTWF0Rm9ybUZpZWxkTW9kdWxlXHJcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdFBhZ2luYXRvciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3BhZ2luYXRvcic7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcbmltcG9ydCB7IE1hdFNvcnRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zb3J0JztcclxuaW1wb3J0IHsgTWF0VGFibGVEYXRhU291cmNlLCBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5cclxuaW1wb3J0IHsgU3RyaW5nVXRpbHMgfSBmcm9tICdAaWdvMi91dGlscyc7XHJcblxyXG5pbXBvcnQgeyBUcmFuc2xhdGVNb2R1bGUgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcclxuaW1wb3J0IHsgZGVmYXVsdCBhcyBtb21lbnQgfSBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IFNhbml0aXplSHRtbFBpcGUgfSBmcm9tICcuLi8uLi9jdXN0b20taHRtbC9jdXN0b20taHRtbC5waXBlJztcclxuaW1wb3J0IHsgSW1hZ2VFcnJvckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2ltYWdlL2ltYWdlLWVycm9yLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IFNlY3VyZUltYWdlUGlwZSB9IGZyb20gJy4uLy4uL2ltYWdlL3NlY3VyZS1pbWFnZS5waXBlJztcclxuaW1wb3J0IHsgU3RvcFByb3BhZ2F0aW9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vc3RvcC1wcm9wYWdhdGlvbi9zdG9wLXByb3BhZ2F0aW9uLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IEVudGl0eVRhYmxlUGFnaW5hdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vZW50aXR5LXRhYmxlLXBhZ2luYXRvci9lbnRpdHktdGFibGUtcGFnaW5hdG9yLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEVudGl0eVRhYmxlUGFnaW5hdG9yT3B0aW9ucyB9IGZyb20gJy4uL2VudGl0eS10YWJsZS1wYWdpbmF0b3IvZW50aXR5LXRhYmxlLXBhZ2luYXRvci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1xyXG4gIEVudGl0eUtleSxcclxuICBFbnRpdHlSZWNvcmQsXHJcbiAgRW50aXR5U3RhdGUsXHJcbiAgRW50aXR5U3RvcmUsXHJcbiAgRW50aXR5VGFibGVDb2x1bW4sXHJcbiAgRW50aXR5VGFibGVDb2x1bW5SZW5kZXJlcixcclxuICBFbnRpdHlUYWJsZVNjcm9sbEJlaGF2aW9yLFxyXG4gIEVudGl0eVRhYmxlU2VsZWN0aW9uU3RhdGUsXHJcbiAgRW50aXR5VGFibGVUZW1wbGF0ZVxyXG59IGZyb20gJy4uL3NoYXJlZCc7XHJcbmltcG9ydCB7IEVudGl0eVRhYmxlUm93RGlyZWN0aXZlIH0gZnJvbSAnLi9lbnRpdHktdGFibGUtcm93LmRpcmVjdGl2ZSc7XHJcblxyXG5pbnRlcmZhY2UgQ2VsbERhdGEge1xyXG4gIFtrZXk6IHN0cmluZ106IHtcclxuICAgIHZhbHVlOiBhbnk7XHJcbiAgICBjbGFzczogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH07XHJcbiAgICBpc1VybDogYm9vbGVhbjtcclxuICAgIGlzSW1nOiBib29sZWFuO1xyXG4gIH07XHJcbn1cclxuXHJcbmludGVyZmFjZSBSb3dEYXRhIHtcclxuICByZWNvcmQ6IEVudGl0eVJlY29yZDxvYmplY3QsIEVudGl0eVN0YXRlPjtcclxuICBjZWxsRGF0YTogQ2VsbERhdGE7XHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnaWdvLWVudGl0eS10YWJsZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2VudGl0eS10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZW50aXR5LXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7IHByb3ZpZGU6IE1hdEZvcm1GaWVsZENvbnRyb2wsIHVzZUV4aXN0aW5nOiBFbnRpdHlUYWJsZUNvbXBvbmVudCB9LFxyXG4gICAgcHJvdmlkZU1vbWVudERhdGVBZGFwdGVyKClcclxuICBdLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQXN5bmNQaXBlLFxyXG4gICAgRW50aXR5VGFibGVQYWdpbmF0b3JDb21wb25lbnQsXHJcbiAgICBFbnRpdHlUYWJsZVJvd0RpcmVjdGl2ZSxcclxuICAgIEZvcm1zTW9kdWxlLFxyXG4gICAgSW1hZ2VFcnJvckRpcmVjdGl2ZSxcclxuICAgIE1hdEF1dG9jb21wbGV0ZU1vZHVsZSxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0RGF0ZXBpY2tlck1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIE1hdE5hdGl2ZURhdGVNb2R1bGUsIC8vIEZvciB0aGUgRGF0ZUFkYXB0ZXIgcHJvdmlkZXJcclxuICAgIE1hdE9wdGlvbk1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIE1hdFNvcnRNb2R1bGUsXHJcbiAgICBNYXRUYWJsZU1vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICBOZ0NsYXNzLFxyXG4gICAgTmdGb3IsXHJcbiAgICBOZ0lmLFxyXG4gICAgTmdTdHlsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBTYW5pdGl6ZUh0bWxQaXBlLFxyXG4gICAgU2VjdXJlSW1hZ2VQaXBlLFxyXG4gICAgU3RvcFByb3BhZ2F0aW9uRGlyZWN0aXZlLFxyXG4gICAgVHJhbnNsYXRlTW9kdWxlXHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRW50aXR5VGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuICBlbnRpdHlTb3J0Q2hhbmdlJDogQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XHJcblxyXG4gIHB1YmxpYyBmb3JtR3JvdXA6IFVudHlwZWRGb3JtR3JvdXAgPSBuZXcgVW50eXBlZEZvcm1Hcm91cCh7fSk7XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJlZE9wdGlvbnMgPSB7fTtcclxuXHJcbiAgLyoqXHJcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBjb2x1bW4gcmVuZGVyZXIgdHlwZXNcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBlbnRpdHlUYWJsZUNvbHVtblJlbmRlcmVyID0gRW50aXR5VGFibGVDb2x1bW5SZW5kZXJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBzZWxlY3Rpb24ncyBzdGF0ZVxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGVudGl0eVRhYmxlU2VsZWN0aW9uU3RhdGUgPSBFbnRpdHlUYWJsZVNlbGVjdGlvblN0YXRlO1xyXG5cclxuICAvKipcclxuICAgKiBPYnNlcnZhYmxlIG9mIHRoZSBzZWxlY3Rpb24scyBzdGF0ZVxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHNlbGVjdGlvblN0YXRlJDogQmVoYXZpb3JTdWJqZWN0PEVudGl0eVRhYmxlU2VsZWN0aW9uU3RhdGU+ID1cclxuICAgIG5ldyBCZWhhdmlvclN1YmplY3QodW5kZWZpbmVkKTtcclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaXB0aW9uIHRvIHRoZSBzdG9yZSdzIHNlbGVjdGlvblxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2VsZWN0aW9uJCQ6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgLyoqXHJcbiAgICogU3Vic2NyaXB0aW9uIHRvIHRoZSBkYXRhU291cmNlXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkYXRhU291cmNlJCQ6IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGxhc3QgcmVjb3JkIGNoZWNrZWQuIFVzZWZ1bCBmb3Igc2VsZWN0aW5nXHJcbiAgICogbXVsdGlwbGUgcmVjb3JkcyBieSBob2xkaW5nIHRoZSBzaGlmdCBrZXkgYW5kIGNoZWNraW5nXHJcbiAgICogY2hlY2tib3hlcy5cclxuICAgKi9cclxuICBwcml2YXRlIGxhc3RSZWNvcmRDaGVja2VkS2V5OiBFbnRpdHlLZXk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVudGl0eSBzdG9yZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHN0b3JlOiBFbnRpdHlTdG9yZTxvYmplY3Q+O1xyXG5cclxuICAvKipcclxuICAgKiBUYWJsZSBwYWdpbmF0b3JcclxuICAgKi9cclxuICBASW5wdXQoKSBzZXQgcGFnaW5hdG9yKHZhbHVlOiBNYXRQYWdpbmF0b3IpIHtcclxuICAgIHRoaXMuX3BhZ2luYXRvciA9IHZhbHVlO1xyXG4gICAgdGhpcy5kYXRhU291cmNlLnBhZ2luYXRvciA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHBhZ2luYXRvcigpOiBNYXRQYWdpbmF0b3Ige1xyXG4gICAgcmV0dXJuIHRoaXMuX3BhZ2luYXRvcjtcclxuICB9XHJcbiAgcHJpdmF0ZSBfcGFnaW5hdG9yOiBNYXRQYWdpbmF0b3I7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRhYmxlIHRlbXBsYXRlXHJcbiAgICovXHJcbiAgQElucHV0KCkgdGVtcGxhdGU6IEVudGl0eVRhYmxlVGVtcGxhdGU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNjcm9sbCBiZWhhdmlvciBvbiBzZWxlY3Rpb25cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNjcm9sbEJlaGF2aW9yOiBFbnRpdHlUYWJsZVNjcm9sbEJlaGF2aW9yID0gRW50aXR5VGFibGVTY3JvbGxCZWhhdmlvci5BdXRvO1xyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIG51bGxzIHNob3VsZCBiZSBmaXJzdCB3aGVuIHNvcnRpbmdcclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNvcnROdWxsc0ZpcnN0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3cgdGhlIHRhYmxlIHBhZ2luYXRvciBvciBub3QuIEZhbHNlIGJ5IGRlZmF1bHQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICB3aXRoUGFnaW5hdG9yOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhZ2luYXRvciBvcHRpb25zXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwYWdpbmF0b3JPcHRpb25zOiBFbnRpdHlUYWJsZVBhZ2luYXRvck9wdGlvbnM7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhbiBlbnRpdHkgKHJvdykgaXMgY2xpY2tlZFxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBlbnRpdHlDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8b2JqZWN0PigpO1xyXG5cclxuICAvKipcclxuICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gYW4gZW50aXR5IChyb3cpIGlzIHNlbGVjdGVkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGVudGl0eVNlbGVjdENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8e1xyXG4gICAgYWRkZWQ6IG9iamVjdFtdO1xyXG4gIH0+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgdGFibGUgc29ydCBpcyBjaGFuZ2VkLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBlbnRpdHlTb3J0Q2hhbmdlOiBFdmVudEVtaXR0ZXI8e1xyXG4gICAgY29sdW1uOiBFbnRpdHlUYWJsZUNvbHVtbjtcclxuICAgIGRpcmVjdGlvbjogc3RyaW5nO1xyXG4gIH0+ID0gbmV3IEV2ZW50RW1pdHRlcih1bmRlZmluZWQpO1xyXG5cclxuICAvKipcclxuICAgKiBUYWJsZSBoZWFkZXJzXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZ2V0IGhlYWRlcnMoKTogc3RyaW5nW10ge1xyXG4gICAgbGV0IGNvbHVtbnMgPSB0aGlzLnRlbXBsYXRlLmNvbHVtbnNcclxuICAgICAgLmZpbHRlcigoY29sdW1uOiBFbnRpdHlUYWJsZUNvbHVtbikgPT4gY29sdW1uLnZpc2libGUgIT09IGZhbHNlKVxyXG4gICAgICAubWFwKChjb2x1bW46IEVudGl0eVRhYmxlQ29sdW1uKSA9PiBjb2x1bW4ubmFtZSk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uQ2hlY2tib3ggPT09IHRydWUpIHtcclxuICAgICAgY29sdW1ucyA9IFsnc2VsZWN0aW9uQ2hlY2tib3gnXS5jb25jYXQoY29sdW1ucyk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGNvbHVtbnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEYXRhIHNvdXJjZSBjb25zdW1hYmxlIGJ5IHRoZSB1bmRlcmx5aW5nIG1hdGVyaWFsIHRhYmxlXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2U8Um93RGF0YT4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciBzZWxlY3Rpb24gaXMgc3VwcG9ydGVkXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZ2V0IHNlbGVjdGlvbigpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLnNlbGVjdGlvbiB8fCBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgYSBzZWxlY3Rpb24gY2hlY2tib3ggc2hvdWxkIGJlIGRpc3BsYXllZFxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGdldCBzZWxlY3Rpb25DaGVja2JveCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBsYXRlLnNlbGVjdGlvbkNoZWNrYm94IHx8IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciBzZWxlY3Rpb24gbWFueSBlbnRpdGllcyBzaG91bGQgZWIgc3VwcG9ydGVkXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZ2V0IHNlbGVjdE1hbnkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5zZWxlY3RNYW55IHx8IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciBzZWxlY3Rpb24gbWFueSBlbnRpdGllcyBzaG91bGQgZWIgc3VwcG9ydGVkXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZ2V0IGZpeGVkSGVhZGVyKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGUuZml4ZWRIZWFkZXIgPT09IHVuZGVmaW5lZFxyXG4gICAgICA/IHRydWVcclxuICAgICAgOiB0aGlzLnRlbXBsYXRlLmZpeGVkSGVhZGVyO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHRhYmxlSGVpZ2h0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS50YWJsZUhlaWdodCA/IHRoaXMudGVtcGxhdGUudGFibGVIZWlnaHQgOiAnYXV0byc7XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBmb3JtQnVpbGRlcjogVW50eXBlZEZvcm1CdWlsZGVyLFxyXG4gICAgcHJvdGVjdGVkIF9mb2N1c01vbml0b3I6IEZvY3VzTW9uaXRvcixcclxuICAgIHByb3RlY3RlZCBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXHJcbiAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCxcclxuICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBfcGFyZW50Rm9ybTogTmdGb3JtLFxyXG4gICAgQE9wdGlvbmFsKCkgcHJvdGVjdGVkIF9jb250cm9sTmFtZTogRm9ybUNvbnRyb2xOYW1lLFxyXG4gICAgcHJvdGVjdGVkIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI6IEVycm9yU3RhdGVNYXRjaGVyLFxyXG4gICAgcHJpdmF0ZSBkYXRlQWRhcHRlcjogRGF0ZUFkYXB0ZXI8RGF0ZT5cclxuICApIHtcclxuICAgIHRoaXMuZGF0ZUFkYXB0ZXIuc2V0TG9jYWxlKCdmci1DQScpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2sgdGhlIHNlbGVjdGlvbiBzdGF0ZSB0byBwcm9wZXJseSBkaXNwbGF5IHRoZSBzZWxlY3Rpb24gY2hlY2tib3hlc1xyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5oYW5kbGVEYXRhc291cmNlKCk7XHJcbiAgICB0aGlzLmRhdGFTb3VyY2UucGFnaW5hdG9yID0gdGhpcy5wYWdpbmF0b3I7XHJcbiAgICB0aGlzLnN0b3JlLnN0YXRlLmNoYW5nZSQucGlwZShkZWJvdW5jZVRpbWUoMTAwKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5oYW5kbGVEYXRhc291cmNlKCk7XHJcbiAgICAgIHRoaXMucmVmcmVzaCgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBjb25zdCBzdG9yZSA9IGNoYW5nZXMuc3RvcmU7XHJcbiAgICBpZiAoc3RvcmUgJiYgc3RvcmUuY3VycmVudFZhbHVlICE9PSBzdG9yZS5wcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMuaGFuZGxlRGF0YXNvdXJjZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJvY2VzcyB0ZXh0IG9yIG51bWJlciB2YWx1ZSBjaGFuZ2UgKGVkaXRpb24pXHJcbiAgICovXHJcbiAgb25WYWx1ZUNoYW5nZShjb2x1bW46IHN0cmluZywgcmVjb3JkOiBFbnRpdHlSZWNvcmQ8YW55PiwgZXZlbnQpIHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0Q29sdW1uS2V5V2l0aG91dFByb3BlcnRpZXNUYWcoY29sdW1uKTtcclxuICAgIHJlY29yZC5lbnRpdHkucHJvcGVydGllc1trZXldID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUHJvY2VzcyBib29sZWFuIHZhbHVlIGNoYW5nZSAoZWRpdGlvbilcclxuICAgKi9cclxuICBvbkJvb2xlYW5WYWx1ZUNoYW5nZShjb2x1bW46IHN0cmluZywgcmVjb3JkOiBFbnRpdHlSZWNvcmQ8YW55PiwgZXZlbnQpIHtcclxuICAgIGNvbnN0IGtleSA9IHRoaXMuZ2V0Q29sdW1uS2V5V2l0aG91dFByb3BlcnRpZXNUYWcoY29sdW1uKTtcclxuICAgIHJlY29yZC5lbnRpdHkucHJvcGVydGllc1trZXldID0gZXZlbnQuY2hlY2tlZDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByb2Nlc3Mgc2VsZWN0IHZhbHVlIGNoYW5nZSAoZWRpdGlvbilcclxuICAgKi9cclxuICBvblNlbGVjdFZhbHVlQ2hhbmdlKGNvbHVtbjogc3RyaW5nLCByZWNvcmQ6IEVudGl0eVJlY29yZDxhbnk+LCBldmVudCkge1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW4pO1xyXG4gICAgcmVjb3JkLmVudGl0eS5wcm9wZXJ0aWVzW2tleV0gPSBldmVudC52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByb2Nlc3MgYXV0b2NvbXBsZXRlIHZhbHVlIGNoYW5nZSAoZWRpdGlvbilcclxuICAgKi9cclxuICBvbkF1dG9jb21wbGV0ZVZhbHVlQ2hhbmdlKFxyXG4gICAgY29sdW1uOiBFbnRpdHlUYWJsZUNvbHVtbixcclxuICAgIHJlY29yZDogRW50aXR5UmVjb3JkPGFueT4sXHJcbiAgICBldmVudFxyXG4gICkge1xyXG4gICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29sdW1uLm5hbWVdLnNldFZhbHVlKGV2ZW50Lm9wdGlvbi52aWV3VmFsdWUpO1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW4ubmFtZSk7XHJcbiAgICByZWNvcmQuZW50aXR5LnByb3BlcnRpZXNba2V5XSA9IGV2ZW50Lm9wdGlvbi52YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFByb2Nlc3MgZGF0ZSB2YWx1ZSBjaGFuZ2UgKGVkaXRpb24pXHJcbiAgICovXHJcbiAgb25EYXRlQ2hhbmdlKGNvbHVtbjogc3RyaW5nLCByZWNvcmQ6IEVudGl0eVJlY29yZDxhbnk+LCBldmVudCkge1xyXG4gICAgY29uc3QgZm9ybWF0ID0gJ1lZWVktTU0tREQnO1xyXG4gICAgY29uc3QgdmFsdWUgPSBtb21lbnQoZXZlbnQudmFsdWUpLmZvcm1hdChmb3JtYXQpO1xyXG4gICAgY29uc3Qga2V5ID0gdGhpcy5nZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW4pO1xyXG4gICAgcmVjb3JkLmVudGl0eS5wcm9wZXJ0aWVzW2tleV0gPSB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuYWJsZSBlZGl0aW9uIG1vZGUgZm9yIG9uZSByb3dcclxuICAgKiBNb3JlIHRoYW4gb25lIHJvdyBjYW4gYmUgZWRpdGVkIGF0IHRoZSBzYW1lIHRpbWVcclxuICAgKi9cclxuICBwcml2YXRlIGVuYWJsZUVkaXQocmVjb3JkOiBFbnRpdHlSZWNvcmQ8YW55Pikge1xyXG4gICAgY29uc3QgaXRlbSA9IHJlY29yZC5lbnRpdHkucHJvcGVydGllcyB8fCByZWNvcmQuZW50aXR5O1xyXG4gICAgdGhpcy50ZW1wbGF0ZS5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4ge1xyXG4gICAgICBjb2x1bW4udGl0bGUgPVxyXG4gICAgICAgIGNvbHVtbi52YWxpZGF0aW9uPy5tYW5kYXRvcnkgJiYgIWNvbHVtbi50aXRsZS5pbmNsdWRlcygnKicpXHJcbiAgICAgICAgICA/IGNvbHVtbi50aXRsZSArICcgKidcclxuICAgICAgICAgIDogY29sdW1uLnRpdGxlO1xyXG5cclxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5nZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW4ubmFtZSk7XHJcbiAgICAgIGlmIChjb2x1bW4udHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XHJcbiAgICAgICAgaWYgKCFpdGVtW2tleV0gfHwgaXRlbVtrZXldID09PSBudWxsKSB7XHJcbiAgICAgICAgICBpdGVtW2tleV0gPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBpdGVtW2tleV0gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBpdGVtW2tleV0gPSBKU09OLnBhcnNlKGl0ZW1ba2V5XS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuc2V0Q29udHJvbChcclxuICAgICAgICAgIGNvbHVtbi5uYW1lLFxyXG4gICAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKGl0ZW1ba2V5XSlcclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnbGlzdCcpIHtcclxuICAgICAgICBpZiAoY29sdW1uLm11bHRpcGxlKSB7XHJcbiAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5zZXRDb250cm9sKFxyXG4gICAgICAgICAgICBjb2x1bW4ubmFtZSxcclxuICAgICAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKFtpdGVtW2tleV1dKVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5mb3JtR3JvdXAuc2V0Q29udHJvbChcclxuICAgICAgICAgICAgY29sdW1uLm5hbWUsXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChpdGVtW2tleV0pXHJcbiAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgIHR5cGVvZiBpdGVtW2tleV0gPT09ICdzdHJpbmcnXHJcbiAgICAgICAgICAgID8gdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29sdW1uLm5hbWVdLnNldFZhbHVlKHBhcnNlSW50KGl0ZW1ba2V5XSkpXHJcbiAgICAgICAgICAgIDogdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29sdW1uLm5hbWVdLnNldFZhbHVlKGl0ZW1ba2V5XSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnYXV0b2NvbXBsZXRlJykge1xyXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnNldENvbnRyb2woXHJcbiAgICAgICAgICBjb2x1bW4ubmFtZSxcclxuICAgICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChpdGVtW2tleV0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnNbY29sdW1uLm5hbWVdID0gbmV3IE9ic2VydmFibGU8YW55W10+KCk7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZE9wdGlvbnNbY29sdW1uLm5hbWVdID0gdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbXHJcbiAgICAgICAgICBjb2x1bW4ubmFtZVxyXG4gICAgICAgIF0udmFsdWVDaGFuZ2VzLnBpcGUoXHJcbiAgICAgICAgICBtYXAoKHZhbHVlKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZT8ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5kb21haW5WYWx1ZXM/LmZpbHRlcigob3B0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJOb3JtYWxpemVkID0gdmFsdWVcclxuICAgICAgICAgICAgICAgICAgPyB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICAgICAgIC5ub3JtYWxpemUoJ05GRCcpXHJcbiAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvW1xcdTAzMDAtXFx1MDM2Zl0vZywgJycpXHJcbiAgICAgICAgICAgICAgICAgIDogJyc7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBmZWF0dXJlTmFtZU5vcm1hbGl6ZWQgPSBvcHRpb24udmFsdWVcclxuICAgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKClcclxuICAgICAgICAgICAgICAgICAgLm5vcm1hbGl6ZSgnTkZEJylcclxuICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1tcXHUwMzAwLVxcdTAzNmZdL2csICcnKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmZWF0dXJlTmFtZU5vcm1hbGl6ZWQuaW5jbHVkZXMoZmlsdGVyTm9ybWFsaXplZCk7XHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgbGV0IGZvcm1Db250cm9sVmFsdWUgPSBpdGVtW2tleV07XHJcbiAgICAgICAgY29sdW1uLmRvbWFpblZhbHVlcy5mb3JFYWNoKChvcHRpb24pID0+IHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgdHlwZW9mIGZvcm1Db250cm9sVmFsdWUgPT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgICAgIFN0cmluZ1V0aWxzLmlzVmFsaWROdW1iZXIoZm9ybUNvbnRyb2xWYWx1ZSkgJiZcclxuICAgICAgICAgICAgIVN0cmluZ1V0aWxzLmlzT2N0YWxOdW1iZXIoZm9ybUNvbnRyb2xWYWx1ZSlcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBmb3JtQ29udHJvbFZhbHVlID0gcGFyc2VJbnQoZm9ybUNvbnRyb2xWYWx1ZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIG9wdGlvbi52YWx1ZSA9PT0gZm9ybUNvbnRyb2xWYWx1ZSB8fFxyXG4gICAgICAgICAgICBvcHRpb24uaWQgPT09IGZvcm1Db250cm9sVmFsdWVcclxuICAgICAgICAgICkge1xyXG4gICAgICAgICAgICBmb3JtQ29udHJvbFZhbHVlID0gb3B0aW9uLnZhbHVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tjb2x1bW4ubmFtZV0uc2V0VmFsdWUoZm9ybUNvbnRyb2xWYWx1ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNFZGl0aW9uKHJlY29yZCkgJiYgY29sdW1uLmxpbmtDb2x1bW5Gb3JjZSkge1xyXG4gICAgICAgICAgY29uc3QgZW50aXR5ID0gcmVjb3JkLmVudGl0eSBhcyBhbnk7XHJcbiAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tjb2x1bW4ubmFtZV0uc2V0VmFsdWUoXHJcbiAgICAgICAgICAgIGVudGl0eT8ucHJvcGVydGllc1tcclxuICAgICAgICAgICAgICB0aGlzLmdldENvbHVtbktleVdpdGhvdXRQcm9wZXJ0aWVzVGFnKGNvbHVtbi5saW5rQ29sdW1uRm9yY2UpXHJcbiAgICAgICAgICAgIF1cclxuICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICBpZiAoY29sdW1uLnZpc2libGUgIT09IGZhbHNlKSB7XHJcbiAgICAgICAgICBpZiAoaXRlbVtrZXldKSB7XHJcbiAgICAgICAgICAgIGxldCBkYXRlID0gbW9tZW50KGl0ZW1ba2V5XSk7XHJcbiAgICAgICAgICAgIGl0ZW1ba2V5XSA9IGRhdGUudXRjKCkuZm9ybWF0KCdZWVlZLU1NLUREJyk7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnNldENvbnRyb2woXHJcbiAgICAgICAgICAgICAgY29sdW1uLm5hbWUsXHJcbiAgICAgICAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKGl0ZW1ba2V5XSlcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IG5ld0tleSA9IHRoaXMuZ2V0Q29sdW1uS2V5V2l0aG91dFByb3BlcnRpZXNUYWcoY29sdW1uLm5hbWUpO1xyXG4gICAgICAgICAgICByZWNvcmQuZW50aXR5LnByb3BlcnRpZXNbbmV3S2V5XSA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLnNldENvbnRyb2woXHJcbiAgICAgICAgICAgICAgY29sdW1uLm5hbWUsXHJcbiAgICAgICAgICAgICAgdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKG51bGwpXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLnNldENvbnRyb2woXHJcbiAgICAgICAgICBjb2x1bW4ubmFtZSxcclxuICAgICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChpdGVtW2tleV0pXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKFxyXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzW2NvbHVtbi5uYW1lXSAmJlxyXG4gICAgICAgIHRoaXMuZ2V0VmFsaWRhdGlvbkF0dHJpYnV0ZVZhbHVlKGNvbHVtbiwgJ3JlYWRvbmx5JylcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHNbY29sdW1uLm5hbWVdLmRpc2FibGUoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhbmRsZURhdGFzb3VyY2UoKSB7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlU3RvcmUoKTtcclxuICAgIHRoaXMuc2VsZWN0aW9uJCQgPSB0aGlzLnN0b3JlLnN0YXRlVmlld1xyXG4gICAgICAubWFueUJ5JCgocmVjb3JkOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PikgPT4gcmVjb3JkLnN0YXRlLnNlbGVjdGVkID09PSB0cnVlKVxyXG4gICAgICAuc3Vic2NyaWJlKChyZWNvcmRzOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PltdKSA9PiB7XHJcbiAgICAgICAgY29uc3QgZmlyc3RTZWxlY3RlZCA9IHJlY29yZHNbMF07XHJcbiAgICAgICAgY29uc3QgZmlyc3RTZWxlY3RlZFN0YXRldmlld1Bvc2l0aW9uID0gdGhpcy5zdG9yZS5zdGF0ZVZpZXdcclxuICAgICAgICAgIC5hbGwoKVxyXG4gICAgICAgICAgLmluZGV4T2YoZmlyc3RTZWxlY3RlZCk7XHJcbiAgICAgICAgY29uc3QgcGFnZU1heCA9IHRoaXMucGFnaW5hdG9yXHJcbiAgICAgICAgICA/IHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplICogKHRoaXMucGFnaW5hdG9yLnBhZ2VJbmRleCArIDEpXHJcbiAgICAgICAgICA6IDA7XHJcbiAgICAgICAgY29uc3QgcGFnZU1pbiA9IHRoaXMucGFnaW5hdG9yID8gcGFnZU1heCAtIHRoaXMucGFnaW5hdG9yLnBhZ2VTaXplIDogMDtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgdGhpcy5wYWdpbmF0b3IgJiZcclxuICAgICAgICAgIChmaXJzdFNlbGVjdGVkU3RhdGV2aWV3UG9zaXRpb24gPCBwYWdlTWluIHx8XHJcbiAgICAgICAgICAgIGZpcnN0U2VsZWN0ZWRTdGF0ZXZpZXdQb3NpdGlvbiA+PSBwYWdlTWF4KVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgY29uc3QgcGFnZVRvUmVhY2ggPSBNYXRoLmZsb29yKFxyXG4gICAgICAgICAgICBmaXJzdFNlbGVjdGVkU3RhdGV2aWV3UG9zaXRpb24gLyB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZVxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5wYWdpbmF0b3IucGFnZUluZGV4ID0gcGFnZVRvUmVhY2g7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU3RhdGUkLm5leHQodGhpcy5jb21wdXRlU2VsZWN0aW9uU3RhdGUocmVjb3JkcykpO1xyXG4gICAgICB9KTtcclxuICAgIHRoaXMuZGF0YVNvdXJjZSQkID0gdGhpcy5zdG9yZS5zdGF0ZVZpZXcuYWxsJCgpLnN1YnNjcmliZSgoYWxsKSA9PiB7XHJcbiAgICAgIGlmIChhbGxbMF0pIHtcclxuICAgICAgICB0aGlzLmVuYWJsZUVkaXQoYWxsWzBdKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UuZGF0YSA9IGFsbC5tYXAoKHJlY29yZCkgPT4ge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICByZWNvcmQsXHJcbiAgICAgICAgICBjZWxsRGF0YTogdGhpcy50ZW1wbGF0ZS5jb2x1bW5zLnJlZHVjZShcclxuICAgICAgICAgICAgKGNlbGxEYXRhOiBDZWxsRGF0YSwgY29sdW1uKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmdldFZhbHVlKHJlY29yZCwgY29sdW1uKTtcclxuICAgICAgICAgICAgICBjZWxsRGF0YVtjb2x1bW4ubmFtZV0gPSB7XHJcbiAgICAgICAgICAgICAgICBjbGFzczogdGhpcy5nZXRDZWxsQ2xhc3MocmVjb3JkLCBjb2x1bW4pLFxyXG4gICAgICAgICAgICAgICAgdmFsdWUsXHJcbiAgICAgICAgICAgICAgICBpc1VybDogdGhpcy5pc1VybCh2YWx1ZSksXHJcbiAgICAgICAgICAgICAgICBpc0ltZzogdGhpcy5pc0ltZyh2YWx1ZSlcclxuICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgIHJldHVybiBjZWxsRGF0YTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAge31cclxuICAgICAgICAgIClcclxuICAgICAgICB9O1xyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVW5iaW5kIHRoZSBzdG9yZSB3YXRjaGVyXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlU3RvcmUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVTdG9yZSgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbiQkKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uJCQudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRhdGFTb3VyY2UkJCkge1xyXG4gICAgICB0aGlzLmRhdGFTb3VyY2UkJC51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2tieSBmdW5jdGlvblxyXG4gICAqIEBwYXJhbSByZWNvcmQgUmVjb3JkXHJcbiAgICogQHBhcmFtIGluZGV4IFJlY29yZCBpbmRleFxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGdldFRyYWNrQnlGdW5jdGlvbigpOiBUcmFja0J5RnVuY3Rpb248Um93RGF0YT4ge1xyXG4gICAgcmV0dXJuIChfaW5kZXgsIHJvdykgPT4gcm93LnJlY29yZC5yZWY7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFRyaWdnZXIgYSByZWZyZXNoIG9mIHRoZSB0YWJsZS4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW5cclxuICAgKiB0aGUgZGF0YSBzb3VyY2UgZG9lc24ndCBlbWl0IGEgbmV3IHZhbHVlIGJ1dCBmb3Igc29tZSByZWFzb25cclxuICAgKiB0aGUgcmVjb3JkcyBuZWVkIGFuIHVwZGF0ZS5cclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICByZWZyZXNoKCkge1xyXG4gICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBwYWdpbmF0b3JDaGFuZ2UoZXZlbnQ6IE1hdFBhZ2luYXRvcikge1xyXG4gICAgdGhpcy5wYWdpbmF0b3IgPSBldmVudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9uIHNvcnQsIHNvcnQgdGhlIHN0b3JlXHJcbiAgICogQHBhcmFtIGV2ZW50IFNvcnQgZXZlbnRcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBvblNvcnQoZXZlbnQ6IHsgYWN0aXZlOiBzdHJpbmc7IGRpcmVjdGlvbjogc3RyaW5nIH0pIHtcclxuICAgIGNvbnN0IGRpcmVjdGlvbiA9IGV2ZW50LmRpcmVjdGlvbjtcclxuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMudGVtcGxhdGUuY29sdW1ucy5maW5kKFxyXG4gICAgICAoYzogRW50aXR5VGFibGVDb2x1bW4pID0+IGMubmFtZSA9PT0gZXZlbnQuYWN0aXZlXHJcbiAgICApO1xyXG5cclxuICAgIGlmIChkaXJlY3Rpb24gPT09ICdhc2MnIHx8IGRpcmVjdGlvbiA9PT0gJ2Rlc2MnKSB7XHJcbiAgICAgIHRoaXMuc3RvcmUuc3RhdGVWaWV3LnNvcnQoe1xyXG4gICAgICAgIHZhbHVlQWNjZXNzb3I6IChyZWNvcmQ6IEVudGl0eVJlY29yZDxvYmplY3Q+KSA9PlxyXG4gICAgICAgICAgdGhpcy5nZXRWYWx1ZShyZWNvcmQsIGNvbHVtbiksXHJcbiAgICAgICAgZGlyZWN0aW9uLFxyXG4gICAgICAgIG51bGxzRmlyc3Q6IHRoaXMuc29ydE51bGxzRmlyc3RcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZW50aXR5U29ydENoYW5nZS5lbWl0KHsgY29sdW1uLCBkaXJlY3Rpb24gfSk7XHJcbiAgICAgIHRoaXMuZW50aXR5U29ydENoYW5nZSQubmV4dCh0cnVlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc3RvcmUuc3RhdGVWaWV3LnNvcnQodW5kZWZpbmVkKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gYW4gZW50aXR5IGlzIGNsaWNrZWQsIGVtaXQgYW4gZXZlbnRcclxuICAgKiBAcGFyYW0gcmVjb3JkIFJlY29yZFxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIG9uUm93Q2xpY2socmVjb3JkOiBFbnRpdHlSZWNvcmQ8b2JqZWN0Pikge1xyXG4gICAgdGhpcy5sYXN0UmVjb3JkQ2hlY2tlZEtleSA9IHRoaXMuc3RvcmUuc3RhdGVWaWV3LmdldEtleShyZWNvcmQpO1xyXG4gICAgdGhpcy5lbnRpdHlDbGljay5lbWl0KHJlY29yZC5lbnRpdHkpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBhbiBlbnRpdHkgaXMgc2VsZWN0ZWQsIHNlbGVjdCBpdCBpbiB0aGUgc3RvcmUgYW5kIGVtaXQgYW4gZXZlbnQuIEV2ZW4gaWZcclxuICAgKiBcIm1hbnlcIiBpcyBzZXQgdG8gdHJ1ZSwgdGhpcyBtZXRob2QgYWx3YXlzIHNlbGVjdCBhIHNpbmdsZSwgZXhjbHVzaXZlIHJvdy4gU2VsZWN0aW5nXHJcbiAgICogbXVsdGlwbGUgcm93cyBzaG91bGQgYmUgYWNoaWV2ZWQgYnkgdXNpbmcgdGhlIGNoZWNrYm94ZXMuXHJcbiAgICogQHBhcmFtIHJlY29yZCBSZWNvcmRcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBvblJvd1NlbGVjdChyZWNvcmQ6IEVudGl0eVJlY29yZDxvYmplY3Q+KSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24gPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlbnRpdHkgPSByZWNvcmQuZW50aXR5O1xyXG4gICAgdGhpcy5zdG9yZS5zdGF0ZS51cGRhdGUoZW50aXR5LCB7IHNlbGVjdGVkOiB0cnVlIH0sIHRydWUpO1xyXG4gICAgdGhpcy5lbnRpdHlTZWxlY3RDaGFuZ2UuZW1pdCh7IGFkZGVkOiBbZW50aXR5XSB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNlbGVjdCBvciB1bnNlbGVjdCBhbGwgcm93cyBhdCBvbmNlLiBPbiBzZWxlY3QsIGVtaXQgYW4gZXZlbnQuXHJcbiAgICogQHBhcmFtIHRvZ2dsZSBTZWxlY3Qgb3IgdW5zZWxlY3RcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBvblRvZ2dsZVJvd3ModG9nZ2xlOiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24gPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBlbnRpdGllcyA9IHRoaXMuc3RvcmUudmlldy5hbGwoKTtcclxuICAgIHRoaXMuZW50aXR5U2VsZWN0Q2hhbmdlLmVtaXQoeyBhZGRlZDogW2VudGl0aWVzXSB9KTtcclxuICAgIHRoaXMuc3RvcmUuc3RhdGUudXBkYXRlTWFueShlbnRpdGllcywgeyBzZWxlY3RlZDogdG9nZ2xlIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBhbiBlbnRpdHkgaXMgdG9nZ2xlZCwgc2VsZWN0IG9yIHVuc2VsZWN0IGl0IGluIHRoZSBzdG9yZS4gT24gc2VsZWN0LFxyXG4gICAqIGVtaXQgYW4gZXZlbnQuXHJcbiAgICogQHBhcmFtIHRvZ2dsZSBTZWxlY3Qgb3IgdW5zZWxlY3RcclxuICAgKiBAcGFyYW0gcmVjb3JkIFJlY29yZFxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIG9uVG9nZ2xlUm93KHRvZ2dsZTogYm9vbGVhbiwgcmVjb3JkOiBFbnRpdHlSZWNvcmQ8b2JqZWN0Pikge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uID09PSBmYWxzZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZW50aXR5ID0gcmVjb3JkLmVudGl0eTtcclxuICAgIGNvbnN0IGV4Y2x1c2l2ZSA9IHRvZ2dsZSA9PT0gdHJ1ZSAmJiAhdGhpcy5zZWxlY3RNYW55O1xyXG4gICAgdGhpcy5zdG9yZS5zdGF0ZS51cGRhdGUoZW50aXR5LCB7IHNlbGVjdGVkOiB0b2dnbGUgfSwgZXhjbHVzaXZlKTtcclxuICAgIGlmICh0b2dnbGUgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5lbnRpdHlTZWxlY3RDaGFuZ2UuZW1pdCh7IGFkZGVkOiBbZW50aXR5XSB9KTtcclxuICAgIH1cclxuICAgIHRoaXMubGFzdFJlY29yZENoZWNrZWRLZXkgPSB0aGlzLnN0b3JlLnN0YXRlVmlldy5nZXRLZXkocmVjb3JkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gYW4gZW50aXR5IGlzIHRvZ2dsZWQsIHNlbGVjdCBvciB1bnNlbGVjdCBpdCBpbiB0aGUgc3RvcmUuIE9uIHNlbGVjdCxcclxuICAgKiBlbWl0IGFuIGV2ZW50LlxyXG4gICAqIEBwYXJhbSB0b2dnbGUgU2VsZWN0IG9yIHVuc2VsZWN0XHJcbiAgICogQHBhcmFtIHJlY29yZCBSZWNvcmRcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBvblNoaWZ0VG9nZ2xlUm93KFxyXG4gICAgdG9nZ2xlOiBib29sZWFuLFxyXG4gICAgcmVjb3JkOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PixcclxuICAgIGV2ZW50OiBNb3VzZUV2ZW50XHJcbiAgKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb24gPT09IGZhbHNlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RNYW55ID09PSBmYWxzZSB8fCB0aGlzLmxhc3RSZWNvcmRDaGVja2VkS2V5ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5vblRvZ2dsZVJvdyh0b2dnbGUsIHJlY29yZCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBtYXQgY2hlY2tib3ggd3JvbmcgYmVoYXZpb3JcclxuICAgIC8vIHdoZW4gdGhlIHNoaWZ0IGtleSBpcyBoZWxkLlxyXG4gICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzYyMzJcclxuICAgIGNvbnN0IHJhbmdlID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XHJcbiAgICByYW5nZS5zZWxlY3ROb2RlKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XHJcbiAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkucmVtb3ZlQWxsUmFuZ2VzKCk7XHJcbiAgICB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkuYWRkUmFuZ2UocmFuZ2UpO1xyXG4gICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcblxyXG4gICAgY29uc3QgcmVjb3JkcyA9IHRoaXMuc3RvcmUuc3RhdGVWaWV3LmFsbCgpO1xyXG4gICAgY29uc3QgcmVjb3JkSW5kZXggPSByZWNvcmRzLmluZGV4T2YocmVjb3JkKTtcclxuICAgIGNvbnN0IGxhc3RSZWNvcmRDaGVja2VkID0gdGhpcy5zdG9yZS5zdGF0ZVZpZXcuZ2V0KFxyXG4gICAgICB0aGlzLmxhc3RSZWNvcmRDaGVja2VkS2V5XHJcbiAgICApO1xyXG4gICAgY29uc3QgbGFzdFJlY29yZEluZGV4ID0gcmVjb3Jkcy5pbmRleE9mKGxhc3RSZWNvcmRDaGVja2VkKTtcclxuICAgIGNvbnN0IGluZGV4ZXMgPSBbcmVjb3JkSW5kZXgsIGxhc3RSZWNvcmRJbmRleF07XHJcbiAgICBjb25zdCBzZWxlY3RSZWNvcmRzID0gcmVjb3Jkcy5zbGljZShcclxuICAgICAgTWF0aC5taW4oLi4uaW5kZXhlcyksXHJcbiAgICAgIE1hdGgubWF4KC4uLmluZGV4ZXMpICsgMVxyXG4gICAgKTtcclxuXHJcbiAgICBjb25zdCBlbnRpdGllcyA9IHNlbGVjdFJlY29yZHMubWFwKFxyXG4gICAgICAoX3JlY29yZDogRW50aXR5UmVjb3JkPG9iamVjdD4pID0+IF9yZWNvcmQuZW50aXR5XHJcbiAgICApO1xyXG4gICAgdGhpcy5zdG9yZS5zdGF0ZS51cGRhdGVNYW55KGVudGl0aWVzLCB7IHNlbGVjdGVkOiB0b2dnbGUgfSk7XHJcbiAgICBpZiAodG9nZ2xlID09PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuZW50aXR5U2VsZWN0Q2hhbmdlLmVtaXQoeyBhZGRlZDogZW50aXRpZXMgfSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmxhc3RSZWNvcmRDaGVja2VkS2V5ID0gdGhpcy5zdG9yZS5zdGF0ZVZpZXcuZ2V0S2V5KHJlY29yZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wdXRlIHRoZSBzZWxlY3Rpb24gc3RhdGVcclxuICAgKiBAcmV0dXJucyBXaGV0aGVyIGFsbCwgc29tZSBvciBubyByb3dzIGFyZSBzZWxlY3RlZFxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIHByaXZhdGUgY29tcHV0ZVNlbGVjdGlvblN0YXRlKFxyXG4gICAgc2VsZWN0ZWRSZWNvcmRzOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PltdXHJcbiAgKTogRW50aXR5VGFibGVTZWxlY3Rpb25TdGF0ZSB7XHJcbiAgICBjb25zdCBzdGF0ZXMgPSBFbnRpdHlUYWJsZVNlbGVjdGlvblN0YXRlO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uQ291bnQgPSBzZWxlY3RlZFJlY29yZHMubGVuZ3RoO1xyXG4gICAgcmV0dXJuIHNlbGVjdGlvbkNvdW50ID09PSAwXHJcbiAgICAgID8gc3RhdGVzLk5vbmVcclxuICAgICAgOiBzZWxlY3Rpb25Db3VudCA9PT0gdGhpcy5zdG9yZS5zdGF0ZVZpZXcuY291bnRcclxuICAgICAgICA/IHN0YXRlcy5BbGxcclxuICAgICAgICA6IHN0YXRlcy5Tb21lO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciBhIGNvbHVtbiBpcyBzb3J0YWJsZVxyXG4gICAqIEBwYXJhbSBjb2x1bW4gQ29sdW1uXHJcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBhIGNvbHVtbiBpcyBzb3J0YWJsZVxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGNvbHVtbklzU29ydGFibGUoY29sdW1uOiBFbnRpdHlUYWJsZUNvbHVtbik6IGJvb2xlYW4ge1xyXG4gICAgbGV0IHNvcnRhYmxlID0gY29sdW1uLnNvcnQ7XHJcbiAgICBpZiAoc29ydGFibGUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBzb3J0YWJsZSA9IHRoaXMudGVtcGxhdGUuc29ydCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiB0aGlzLnRlbXBsYXRlLnNvcnQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc29ydGFibGU7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIGEgcm93IGlzIHNob3VsZCBiZSBzZWxlY3RlZCBiYXNlZCBvbiB0aGUgdW5kZXJseWluZyBlbnRpdHkgc3RhdGVcclxuICAgKiBAcGFyYW0gcmVjb3JkIFJlY29yZFxyXG4gICAqIEByZXR1cm5zIFRydWUgaWYgYSByb3cgc2hvdWxkIGJlIHNlbGVjdGVkXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgcm93SXNTZWxlY3RlZChyZWNvcmQ6IEVudGl0eVJlY29yZDxvYmplY3Q+KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBzdGF0ZSA9IHJlY29yZC5zdGF0ZTtcclxuICAgIHJldHVybiBzdGF0ZS5zZWxlY3RlZCA/IHN0YXRlLnNlbGVjdGVkIDogZmFsc2U7XHJcbiAgfVxyXG5cclxuICBpc0ltZyh2YWx1ZSkge1xyXG4gICAgaWYgKHRoaXMuaXNVcmwodmFsdWUpKSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgWydqcGcnLCAncG5nJywgJ2dpZiddLmluZGV4T2YodmFsdWUuc3BsaXQoJy4nKS5wb3AoKS50b0xvd2VyQ2FzZSgpKSAhPT1cclxuICAgICAgICAtMVxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNVcmwodmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgdmFsdWUuc2xpY2UoMCwgOCkgPT09ICdodHRwczovLycgfHwgdmFsdWUuc2xpY2UoMCwgNykgPT09ICdodHRwOi8vJ1xyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0aG9kIHRvIGFjY2VzcyBhbiBlbnRpdHkncyB2YWx1ZXNcclxuICAgKiBAcGFyYW0gcmVjb3JkIFJlY29yZFxyXG4gICAqIEBwYXJhbSBjb2x1bW4gQ29sdW1uXHJcbiAgICogQHJldHVybnMgQW55IHZhbHVlXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZ2V0VmFsdWUocmVjb3JkOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PiwgY29sdW1uOiBFbnRpdHlUYWJsZUNvbHVtbik6IGFueSB7XHJcbiAgICBjb25zdCBlbnRpdHkgPSByZWNvcmQuZW50aXR5O1xyXG4gICAgbGV0IHZhbHVlO1xyXG4gICAgaWYgKGNvbHVtbi52YWx1ZUFjY2Vzc29yICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIGNvbHVtbi52YWx1ZUFjY2Vzc29yKGVudGl0eSwgcmVjb3JkKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnRlbXBsYXRlLnZhbHVlQWNjZXNzb3IgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS52YWx1ZUFjY2Vzc29yKGVudGl0eSwgY29sdW1uLm5hbWUsIHJlY29yZCk7XHJcbiAgICB9XHJcbiAgICB2YWx1ZSA9IHRoaXMuc3RvcmUuZ2V0UHJvcGVydHkoZW50aXR5LCBjb2x1bW4ubmFtZSk7XHJcblxyXG4gICAgaWYgKGNvbHVtbi50eXBlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09ICcnKSB7XHJcbiAgICAgICAgdmFsdWUgPSBmYWxzZTtcclxuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIHZhbHVlID0gQm9vbGVhbih2YWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHZhbHVlID0gSlNPTi5wYXJzZSh2YWx1ZS50b0xvd2VyQ2FzZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCF0aGlzLmlzRWRpdGlvbihyZWNvcmQpKSB7XHJcbiAgICAgICAgdmFsdWUgPSB2YWx1ZSA/ICcmIzEwMDAzOycgOiAnJzsgLy8gY2hlY2sgbWFya1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnbGlzdCcgJiYgdmFsdWUgJiYgY29sdW1uLmRvbWFpblZhbHVlcykge1xyXG4gICAgICBjb25zdCBlbnRpdHkgPSByZWNvcmQuZW50aXR5IGFzIGFueTtcclxuICAgICAgaWYgKGNvbHVtbi5tdWx0aXBsZSkge1xyXG4gICAgICAgIGxldCBsaXN0X2lkO1xyXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZydcclxuICAgICAgICAgID8gKGxpc3RfaWQgPSB2YWx1ZS5tYXRjaCgvW1xcdy4tXSsvZykubWFwKE51bWJlcikpXHJcbiAgICAgICAgICA6IChsaXN0X2lkID0gdmFsdWUpO1xyXG4gICAgICAgIGxldCBsaXN0X29wdGlvbiA9IFtdO1xyXG5cclxuICAgICAgICBjb2x1bW4uZG9tYWluVmFsdWVzLmZvckVhY2goKG9wdGlvbikgPT4ge1xyXG4gICAgICAgICAgaWYgKGxpc3RfaWQuaW5jbHVkZXMob3B0aW9uLmlkKSkge1xyXG4gICAgICAgICAgICBpZiAocmVjb3JkLmVkaXRpb24pIHtcclxuICAgICAgICAgICAgICBsaXN0X29wdGlvbi5wdXNoKG9wdGlvbi5pZCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgbGlzdF9vcHRpb24ucHVzaChvcHRpb24udmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHRoaXMuaXNFZGl0aW9uKHJlY29yZCkgPyAodmFsdWUgPSBsaXN0X2lkKSA6ICh2YWx1ZSA9IGxpc3Rfb3B0aW9uKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpZiAoIXRoaXMuaXNFZGl0aW9uKHJlY29yZCkgJiYgY29sdW1uLmxpbmtDb2x1bW5Gb3JjZSkge1xyXG4gICAgICAgICAgdmFsdWUgPVxyXG4gICAgICAgICAgICBlbnRpdHk/LnByb3BlcnRpZXNbXHJcbiAgICAgICAgICAgICAgdGhpcy5nZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW4ubGlua0NvbHVtbkZvcmNlKVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb2x1bW4uZG9tYWluVmFsdWVzLmZvckVhY2goKG9wdGlvbikgPT4ge1xyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJlxyXG4gICAgICAgICAgICAgIFN0cmluZ1V0aWxzLmlzVmFsaWROdW1iZXIodmFsdWUpICYmXHJcbiAgICAgICAgICAgICAgIVN0cmluZ1V0aWxzLmlzT2N0YWxOdW1iZXIodmFsdWUpXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChvcHRpb24udmFsdWUgPT09IHZhbHVlIHx8IG9wdGlvbi5pZCA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgICB0aGlzLmlzRWRpdGlvbihyZWNvcmQpXHJcbiAgICAgICAgICAgICAgICA/ICh2YWx1ZSA9IG9wdGlvbi5pZClcclxuICAgICAgICAgICAgICAgIDogKHZhbHVlID0gb3B0aW9uLnZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKGNvbHVtbi50eXBlID09PSAnYXV0b2NvbXBsZXRlJyAmJiB2YWx1ZSAmJiBjb2x1bW4uZG9tYWluVmFsdWVzKSB7XHJcbiAgICAgIGNvbnN0IGVudGl0eSA9IHJlY29yZC5lbnRpdHkgYXMgYW55O1xyXG4gICAgICBpZiAoIXRoaXMuaXNFZGl0aW9uKHJlY29yZCkgJiYgY29sdW1uLmxpbmtDb2x1bW5Gb3JjZSkge1xyXG4gICAgICAgIHZhbHVlID1cclxuICAgICAgICAgIGVudGl0eT8ucHJvcGVydGllc1tcclxuICAgICAgICAgICAgdGhpcy5nZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW4ubGlua0NvbHVtbkZvcmNlKVxyXG4gICAgICAgICAgXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb2x1bW4uZG9tYWluVmFsdWVzLmZvckVhY2goKG9wdGlvbikgPT4ge1xyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmXHJcbiAgICAgICAgICAgIFN0cmluZ1V0aWxzLmlzVmFsaWROdW1iZXIodmFsdWUpICYmXHJcbiAgICAgICAgICAgICFTdHJpbmdVdGlscy5pc09jdGFsTnVtYmVyKHZhbHVlKVxyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gcGFyc2VJbnQodmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKG9wdGlvbi52YWx1ZSA9PT0gdmFsdWUgfHwgb3B0aW9uLmlkID09PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IG9wdGlvbi52YWx1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChjb2x1bW4udHlwZSA9PT0gJ2RhdGUnKSB7XHJcbiAgICAgIGlmICh0aGlzLmlzRWRpdGlvbihyZWNvcmQpKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgICAgICBsZXQgZGF0ZSA9IG1vbWVudCh2YWx1ZSk7XHJcbiAgICAgICAgICB2YWx1ZSA9IGRhdGUuZm9ybWF0KCk7XHJcbiAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9sc1tjb2x1bW4ubmFtZV0uc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIGlmICghdGhpcy5pc0VkaXRpb24ocmVjb3JkKSAmJiB2YWx1ZSA9PT0gbnVsbCkge1xyXG4gICAgICAgIHZhbHVlID0gJyc7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB2YWx1ZSA9ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldGhvZCB0byBhY2Nlc3MgYW4gZW50aXR5J3MgdmFsaWRhdGlvbiB2YWx1ZXNcclxuICAgKiBAcGFyYW0gY29sdW1uIENvbHVtblxyXG4gICAqIEBwYXJhbSB2YWxpZGF0aW9uVHlwZSBzdHJpbmdcclxuICAgKiBAcmV0dXJucyBBbnkgdmFsdWUgKGZhbHNlIGlmIG5vIHZhbGlkYXRpb24gb3Igbm90IHRoZSBvbmUgY29uY2VybmVkKVxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGdldFZhbGlkYXRpb25BdHRyaWJ1dGVWYWx1ZShcclxuICAgIGNvbHVtbjogRW50aXR5VGFibGVDb2x1bW4sXHJcbiAgICB2YWxpZGF0aW9uVHlwZTogc3RyaW5nXHJcbiAgKTogYW55IHtcclxuICAgIGlmIChcclxuICAgICAgY29sdW1uLnZhbGlkYXRpb24gIT09IHVuZGVmaW5lZCAmJlxyXG4gICAgICBjb2x1bW4udmFsaWRhdGlvblt2YWxpZGF0aW9uVHlwZV0gIT09IHVuZGVmaW5lZFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiBjb2x1bW4udmFsaWRhdGlvblt2YWxpZGF0aW9uVHlwZV07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaXNFZGl0aW9uKHJlY29yZCkge1xyXG4gICAgcmV0dXJuIHJlY29yZC5lbnRpdHkuZWRpdGlvbiA/IHRydWUgOiBmYWxzZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgdHlwZSBvZiByZW5kZXJlciBvZiBhIGNvbHVtblxyXG4gICAqIEBwYXJhbSBjb2x1bW4gQ29sdW1uXHJcbiAgICogQHJldHVybnMgUmVuZGVyZXIgdHlwZVxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGdldENvbHVtblJlbmRlcmVyKGNvbHVtbjogRW50aXR5VGFibGVDb2x1bW4pOiBFbnRpdHlUYWJsZUNvbHVtblJlbmRlcmVyIHtcclxuICAgIGlmIChjb2x1bW4ucmVuZGVyZXIgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gY29sdW1uLnJlbmRlcmVyO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIEVudGl0eVRhYmxlQ29sdW1uUmVuZGVyZXIuRGVmYXVsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybiB0aGUgdGFibGUgbmdDbGFzc1xyXG4gICAqIEByZXR1cm5zIG5nQ2xhc3NcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBnZXRUYWJsZUNsYXNzKCk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICdpZ28tZW50aXR5LXRhYmxlLXdpdGgtc2VsZWN0aW9uJzogdGhpcy5zZWxlY3Rpb25cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gYSBoZWFkZXIgbmdDbGFzc1xyXG4gICAqIEByZXR1cm5zIG5nQ2xhc3NcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICBnZXRIZWFkZXJDbGFzcygpOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBjb25zdCBmdW5jID0gdGhpcy50ZW1wbGF0ZS5oZWFkZXJDbGFzc0Z1bmM7XHJcbiAgICBpZiAoZnVuYyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XHJcbiAgICAgIHJldHVybiBmdW5jKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge307XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gYSByb3cgbmdDbGFzc1xyXG4gICAqIEBwYXJhbSByZWNvcmQgUmVjb3JkXHJcbiAgICogQHJldHVybnMgbmdDbGFzc1xyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIGdldFJvd0NsYXNzKHJlY29yZDogRW50aXR5UmVjb3JkPG9iamVjdD4pOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBjb25zdCBlbnRpdHkgPSByZWNvcmQuZW50aXR5O1xyXG4gICAgY29uc3QgZnVuYyA9IHRoaXMudGVtcGxhdGUucm93Q2xhc3NGdW5jO1xyXG4gICAgaWYgKGZ1bmMgaW5zdGFuY2VvZiBGdW5jdGlvbikge1xyXG4gICAgICByZXR1cm4gZnVuYyhlbnRpdHksIHJlY29yZCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4ge307XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm4gYSByb3cgbmdDbGFzc1xyXG4gICAqIEBwYXJhbSByZWNvcmQgUmVjb3JkXHJcbiAgICogQHBhcmFtIGNvbHVtbiBDb2x1bW5cclxuICAgKiBAcmV0dXJucyBuZ0NsYXNzXHJcbiAgICogQGludGVybmFsXHJcbiAgICovXHJcbiAgZ2V0Q2VsbENsYXNzKFxyXG4gICAgcmVjb3JkOiBFbnRpdHlSZWNvcmQ8b2JqZWN0PixcclxuICAgIGNvbHVtbjogRW50aXR5VGFibGVDb2x1bW5cclxuICApOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSB7XHJcbiAgICBjb25zdCBlbnRpdHkgPSByZWNvcmQuZW50aXR5O1xyXG4gICAgY29uc3QgY2xzID0ge307XHJcblxyXG4gICAgY29uc3QgdGFibGVGdW5jID0gdGhpcy50ZW1wbGF0ZS5jZWxsQ2xhc3NGdW5jO1xyXG4gICAgaWYgKHRhYmxlRnVuYyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7XHJcbiAgICAgIE9iamVjdC5hc3NpZ24oY2xzLCB0YWJsZUZ1bmMoZW50aXR5LCBjb2x1bW4sIHJlY29yZCkpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbHVtbkZ1bmMgPSBjb2x1bW4uY2VsbENsYXNzRnVuYztcclxuICAgIGlmIChjb2x1bW5GdW5jIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcclxuICAgICAgT2JqZWN0LmFzc2lnbihjbHMsIGNvbHVtbkZ1bmMoZW50aXR5LCByZWNvcmQpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2xzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiBhIGJ1dHRvbiBpcyBjbGlja2VkXHJcbiAgICogQHBhcmFtIGZ1bmMgRnVuY3Rpb25cclxuICAgKiBAcGFyYW0gcmVjb3JkIFJlY29yZFxyXG4gICAqIEBpbnRlcm5hbFxyXG4gICAqL1xyXG4gIG9uQnV0dG9uQ2xpY2soXHJcbiAgICBjbGlja0Z1bmM6IChlbnRpdHk6IG9iamVjdCwgcmVjb3JkPzogRW50aXR5UmVjb3JkPG9iamVjdD4pID0+IHZvaWQsXHJcbiAgICByZWNvcmQ6IEVudGl0eVJlY29yZDxvYmplY3Q+XHJcbiAgKSB7XHJcbiAgICB0aGlzLmVuYWJsZUVkaXQocmVjb3JkKTtcclxuICAgIGlmICh0eXBlb2YgY2xpY2tGdW5jID09PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIGNsaWNrRnVuYyhyZWNvcmQuZW50aXR5LCByZWNvcmQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0cmlldmUgY29sdW1uIG5hbWUgd2l0aG91dCBoaXMgXCJwcm9wZXJ0aWVzXCIgdGFnICh1c2VmdWwgZm9yIGVkaXRpb24gd29ya3NwYWNlIHByb3BlcnRpZXMpXHJcbiAgICovXHJcbiAgcHVibGljIGdldENvbHVtbktleVdpdGhvdXRQcm9wZXJ0aWVzVGFnKGNvbHVtbjogc3RyaW5nKSB7XHJcbiAgICBpZiAoY29sdW1uLmluY2x1ZGVzKCdwcm9wZXJ0aWVzLicpKSB7XHJcbiAgICAgIHJldHVybiBjb2x1bW4uc3BsaXQoJy4nKVsxXTtcclxuICAgIH1cclxuICAgIHJldHVybiBjb2x1bW47XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJ0YWJsZS1jb250YWluZXJcIiBbbmdTdHlsZV09XCJ7IGhlaWdodDogdGFibGVIZWlnaHQgfVwiPlxyXG4gIDx0YWJsZVxyXG4gICAgaWQ9XCJjdXJyZW50V29ya3NwYWNlVGFibGVcIlxyXG4gICAgbWF0LXRhYmxlXHJcbiAgICBtYXRTb3J0XHJcbiAgICBbbmdDbGFzc109XCJnZXRUYWJsZUNsYXNzKClcIlxyXG4gICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXHJcbiAgICBbdHJhY2tCeV09XCJnZXRUcmFja0J5RnVuY3Rpb24oKVwiXHJcbiAgICAobWF0U29ydENoYW5nZSk9XCJvblNvcnQoJGV2ZW50KVwiXHJcbiAgPlxyXG4gICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJzZWxlY3Rpb25DaGVja2JveFwiIGNsYXNzPVwibWF0LWNlbGwtY2hlY2tib3hcIj5cclxuICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0TWFueVwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGlvblN0YXRlJCB8IGFzeW5jIGFzIHNlbGVjdGlvblN0YXRlXCI+XHJcbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3hcclxuICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uVG9nZ2xlUm93cygkZXZlbnQuY2hlY2tlZClcIlxyXG4gICAgICAgICAgICAgIFtjaGVja2VkXT1cInNlbGVjdGlvblN0YXRlID09PSBlbnRpdHlUYWJsZVNlbGVjdGlvblN0YXRlLkFsbFwiXHJcbiAgICAgICAgICAgICAgW2luZGV0ZXJtaW5hdGVdPVwiXHJcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGF0ZSA9PT0gZW50aXR5VGFibGVTZWxlY3Rpb25TdGF0ZS5Tb21lXHJcbiAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8L3RoPlxyXG4gICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XHJcbiAgICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgICAgKG1vdXNlZG93bik9XCIkZXZlbnQuc2hpZnRLZXkgPyAkZXZlbnQucHJldmVudERlZmF1bHQoKSA6IG51bGxcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIlxyXG4gICAgICAgICAgICAkZXZlbnQuc2hpZnRLZXlcclxuICAgICAgICAgICAgICA/IG9uU2hpZnRUb2dnbGVSb3coIXJvd0lzU2VsZWN0ZWQocm93LnJlY29yZCksIHJvdy5yZWNvcmQsICRldmVudClcclxuICAgICAgICAgICAgICA6ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVxyXG4gICAgICAgICAgXCJcclxuICAgICAgICAgIChjaGFuZ2UpPVwib25Ub2dnbGVSb3coJGV2ZW50LmNoZWNrZWQsIHJvdy5yZWNvcmQpXCJcclxuICAgICAgICAgIFtjaGVja2VkXT1cInJvd0lzU2VsZWN0ZWQocm93LnJlY29yZClcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8L21hdC1jaGVja2JveD5cclxuICAgICAgPC90ZD5cclxuICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgIDxuZy1jb250YWluZXJcclxuICAgICAgW21hdENvbHVtbkRlZl09XCJjb2x1bW4ubmFtZVwiXHJcbiAgICAgICpuZ0Zvcj1cImxldCBjb2x1bW4gb2YgdGVtcGxhdGUuY29sdW1uc1wiXHJcbiAgICA+XHJcbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2x1bW5Jc1NvcnRhYmxlKGNvbHVtbilcIj5cclxuICAgICAgICA8dGhcclxuICAgICAgICAgIG1hdC1oZWFkZXItY2VsbFxyXG4gICAgICAgICAgKm1hdEhlYWRlckNlbGxEZWZcclxuICAgICAgICAgIG1hdC1zb3J0LWhlYWRlclxyXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiY29sdW1uLnRvb2x0aXAgPyBjb2x1bW4udG9vbHRpcCA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgY29sdW1uLnRpdGxlIH19XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbHVtbklzU29ydGFibGUoY29sdW1uKVwiPlxyXG4gICAgICAgIDx0aFxyXG4gICAgICAgICAgbWF0LWhlYWRlci1jZWxsXHJcbiAgICAgICAgICAqbWF0SGVhZGVyQ2VsbERlZlxyXG4gICAgICAgICAgW21hdFRvb2x0aXBdPVwiY29sdW1uLnRvb2x0aXAgPyBjb2x1bW4udG9vbHRpcCA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3sgY29sdW1uLnRpdGxlIH19XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZ2V0Q29sdW1uUmVuZGVyZXIoY29sdW1uKSBhcyBjb2x1bW5SZW5kZXJlclwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICpuZ0lmPVwiY29sdW1uUmVuZGVyZXIgPT09IGVudGl0eVRhYmxlQ29sdW1uUmVuZGVyZXIuRGVmYXVsdFwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cclxuICAgICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICAgbWF0LWNlbGxcclxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1jZWxsLXRleHRcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIXJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0uaXNVcmw7IGVsc2UgaXNBblVybERlZmF1bHRcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0uY2xhc3NcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAge3sgcm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZSB9fVxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2lzQW5VcmxEZWZhdWx0PlxyXG4gICAgICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICAgICAgbWF0LWNlbGxcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LWNlbGwtdGV4dFwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLmNsYXNzXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8YVxyXG4gICAgICAgICAgICAgICAgICBocmVmPVwie3sgcm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZSB9fVwiXHJcbiAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgIGlnb0ltYWdlRXJyb3JcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0uaXNJbWc7IGVsc2Ugbm90SW1nXCJcclxuICAgICAgICAgICAgICAgICAgICBzcmM9XCJ7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgcm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZSB8IHNlY3VyZUltYWdlIHwgYXN5bmNcclxuICAgICAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCI1MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ3RoPVwiYXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm90SW1nXHJcbiAgICAgICAgICAgICAgICAgICAgPjxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICA+e3sgJ2lnby5jb21tb24uZW50aXR5LXRhYmxlLnRhcmdldEh0bWxVcmwnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPjwvbmctdGVtcGxhdGVcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sdW1uUmVuZGVyZXIgPT09IGVudGl0eVRhYmxlQ29sdW1uUmVuZGVyZXIuSFRNTFwiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbWF0Q2VsbERlZj1cImxldCByb3dcIj5cclxuICAgICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICAgbWF0LWNlbGxcclxuICAgICAgICAgICAgICBjbGFzcz1cIm1hdC1jZWxsLXRleHRcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIXJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0uaXNVcmw7IGVsc2UgaXNBblVybEhUTUxcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0uY2xhc3NcIlxyXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwicm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZVwiXHJcbiAgICAgICAgICAgID48L3RkPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2lzQW5VcmxIVE1MPlxyXG4gICAgICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICAgICAgbWF0LWNlbGxcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LWNlbGwtdGV4dFwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLmNsYXNzXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8YVxyXG4gICAgICAgICAgICAgICAgICBocmVmPVwie3sgcm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZSB9fVwiXHJcbiAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXHJcbiAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxyXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgIGlnb0ltYWdlRXJyb3JcclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0uaXNJbWc7IGVsc2Ugbm90SW1nXCJcclxuICAgICAgICAgICAgICAgICAgICBzcmM9XCJ7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgcm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZSB8IHNlY3VyZUltYWdlIHwgYXN5bmNcclxuICAgICAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCI1MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgaGVpZ3RoPVwiYXV0b1wiXHJcbiAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm90SW1nXHJcbiAgICAgICAgICAgICAgICAgICAgPjxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICA+e3sgJ2lnby5nZW8udGFyZ2V0SHRtbFVybCcgfCB0cmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+PC9uZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICpuZ0lmPVwiY29sdW1uUmVuZGVyZXIgPT09IGVudGl0eVRhYmxlQ29sdW1uUmVuZGVyZXIuVW5zYW5pdGl6ZWRIVE1MXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxyXG4gICAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgICBtYXQtY2VsbFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwibWF0LWNlbGwtdGV4dCBlZGl0aW9uXCJcclxuICAgICAgICAgICAgICBbZm9ybUdyb3VwXT1cImZvcm1Hcm91cFwiXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0VkaXRpb24ocm93LnJlY29yZCk7IGVsc2UgaXNVbnNhbml0aXplZEhUTUxcIlxyXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0uY2xhc3NcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyXCIgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2RhdGUnXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXHJcbiAgICAgICAgICAgICAgICAgIG1hdFN1ZmZpeFxyXG4gICAgICAgICAgICAgICAgICBbZm9yXT1cInBpY2tlclwiXHJcbiAgICAgICAgICAgICAgICA+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwicGlja2VyXCJcclxuICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb2x1bW4ubmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgIHZhbHVlPVwie3sgcm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZSB9fVwiXHJcbiAgICAgICAgICAgICAgICAgIChkYXRlQ2hhbmdlKT1cIm9uRGF0ZUNoYW5nZShjb2x1bW4ubmFtZSwgcm93LnJlY29yZCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXI+PC9tYXQtZGF0ZXBpY2tlcj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGltZVwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi50eXBlID09PSAndGltZSdcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb2x1bW4ubmFtZVwiXHJcbiAgICAgICAgICAgICAgICBzdGVwPVwiOTAwXCJcclxuICAgICAgICAgICAgICAgIChmb2N1cyk9XCJjb2x1bW4ub25Gb2N1cygkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgIChrZXlwcmVzcyk9XCJjb2x1bW4ub25DaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoYmx1cik9XCJjb2x1bW4ub25CbHVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNsYXNzX251bWJlcl9lZGl0aW9uXCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdudW1iZXInXCJcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29sdW1uLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgc3RlcD1cInt7IGNvbHVtbi5zdGVwIH19XCJcclxuICAgICAgICAgICAgICAgIHZhbHVlPVwie3sgcm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZSB9fVwiXHJcbiAgICAgICAgICAgICAgICAoaW5wdXQpPVwib25WYWx1ZUNoYW5nZShjb2x1bW4ubmFtZSwgcm93LnJlY29yZCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICByZWFkb25seT1cInt7IGdldFZhbGlkYXRpb25BdHRyaWJ1dGVWYWx1ZShjb2x1bW4sICdyZWFkb25seScpIH19XCJcclxuICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwie3tcclxuICAgICAgICAgICAgICAgICAgZ2V0VmFsaWRhdGlvbkF0dHJpYnV0ZVZhbHVlKGNvbHVtbiwgJ21hbmRhdG9yeScpXHJcbiAgICAgICAgICAgICAgICB9fVwiXHJcbiAgICAgICAgICAgICAgICBtaW49XCJ7eyBnZXRWYWxpZGF0aW9uQXR0cmlidXRlVmFsdWUoY29sdW1uLCAnbWluVmFsdWUnKSB9fVwiXHJcbiAgICAgICAgICAgICAgICBtYXg9XCJ7eyBnZXRWYWxpZGF0aW9uQXR0cmlidXRlVmFsdWUoY29sdW1uLCAnbWF4VmFsdWUnKSB9fVwiXHJcbiAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFjb2x1bW4udHlwZSB8fCBjb2x1bW4udHlwZSA9PT0gJ3N0cmluZydcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb2x1bW4ubmFtZVwiXHJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cInt7IHJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0udmFsdWUgfX1cIlxyXG4gICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uVmFsdWVDaGFuZ2UoY29sdW1uLm5hbWUsIHJvdy5yZWNvcmQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgcmVhZG9ubHk9XCJ7eyBnZXRWYWxpZGF0aW9uQXR0cmlidXRlVmFsdWUoY29sdW1uLCAncmVhZG9ubHknKSB9fVwiXHJcbiAgICAgICAgICAgICAgICByZXF1aXJlZD1cInt7XHJcbiAgICAgICAgICAgICAgICAgIGdldFZhbGlkYXRpb25BdHRyaWJ1dGVWYWx1ZShjb2x1bW4sICdtYW5kYXRvcnknKVxyXG4gICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgPG1hdC1jaGVja2JveFxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4udHlwZSA9PT0gJ2Jvb2xlYW4nXCJcclxuICAgICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiY29sdW1uLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwicm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAoY2hhbmdlKT1cIm9uQm9vbGVhblZhbHVlQ2hhbmdlKGNvbHVtbi5uYW1lLCByb3cucmVjb3JkLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICA+PC9tYXQtY2hlY2tib3g+XHJcbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3RcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29sdW1uLnR5cGUgPT09ICdsaXN0J1wiXHJcbiAgICAgICAgICAgICAgICByZXF1aXJlZD1cInt7XHJcbiAgICAgICAgICAgICAgICAgIGdldFZhbGlkYXRpb25BdHRyaWJ1dGVWYWx1ZShjb2x1bW4sICdtYW5kYXRvcnknKVxyXG4gICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb2x1bW4ubmFtZVwiXHJcbiAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwiY29sdW1uLm11bHRpcGxlXCJcclxuICAgICAgICAgICAgICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwiXHJcbiAgICAgICAgICAgICAgICAgIG9uU2VsZWN0VmFsdWVDaGFuZ2UoY29sdW1uLm5hbWUsIHJvdy5yZWNvcmQsICRldmVudClcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwicm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1vcHRpb25cclxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG9wdGlvbiBvZiBjb2x1bW4uZG9tYWluVmFsdWVzXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm9wdGlvbi5pZFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJvcHRpb24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICB7eyBvcHRpb24udmFsdWUgfX1cclxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJjb2x1bW4ubmFtZVwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNvbHVtbi50eXBlID09PSAnYXV0b2NvbXBsZXRlJ1wiXHJcbiAgICAgICAgICAgICAgICBbbWF0QXV0b2NvbXBsZXRlXT1cImF1dG9cIlxyXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJ7e1xyXG4gICAgICAgICAgICAgICAgICBnZXRWYWxpZGF0aW9uQXR0cmlidXRlVmFsdWUoY29sdW1uLCAnbWFuZGF0b3J5JylcclxuICAgICAgICAgICAgICAgIH19XCJcclxuICAgICAgICAgICAgICAgIHZhbHVlPVwie3sgcm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZSB9fVwiXHJcbiAgICAgICAgICAgICAgICByZWFkb25seT1cInt7IGdldFZhbGlkYXRpb25BdHRyaWJ1dGVWYWx1ZShjb2x1bW4sICdyZWFkb25seScpIH19XCJcclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgIDxtYXQtYXV0b2NvbXBsZXRlXHJcbiAgICAgICAgICAgICAgICAjYXV0bz1cIm1hdEF1dG9jb21wbGV0ZVwiXHJcbiAgICAgICAgICAgICAgICAob3B0aW9uU2VsZWN0ZWQpPVwiXHJcbiAgICAgICAgICAgICAgICAgIG9uQXV0b2NvbXBsZXRlVmFsdWVDaGFuZ2UoY29sdW1uLCByb3cucmVjb3JkLCAkZXZlbnQpXHJcbiAgICAgICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICAgICAgcGFuZWxXaWR0aD1cIjQzMHB4XCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIGZpbHRlcmVkT3B0aW9uc1tjb2x1bW4ubmFtZV0gfCBhc3luY1wiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJvcHRpb24uaWRcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICB7eyBvcHRpb24udmFsdWUgfX1cclxuICAgICAgICAgICAgICAgIDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICA8L21hdC1hdXRvY29tcGxldGU+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaXNVbnNhbml0aXplZEhUTUw+XHJcbiAgICAgICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICAgICBtYXQtY2VsbFxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJtYXQtY2VsbC10ZXh0XCJcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgICAgICFyb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLmlzVXJsO1xyXG4gICAgICAgICAgICAgICAgICBlbHNlIGlzQW5VcmxVbnNhbml0aXplZEhUTUxcclxuICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJyb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLmNsYXNzXCJcclxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwicm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZSB8IHNhbml0aXplSHRtbFwiXHJcbiAgICAgICAgICAgICAgPjwvdGQ+XHJcbiAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpc0FuVXJsVW5zYW5pdGl6ZWRIVE1MPlxyXG4gICAgICAgICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgICAgICAgIG1hdC1jZWxsXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWF0LWNlbGwtdGV4dFwiXHJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0uY2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICA8YVxyXG4gICAgICAgICAgICAgICAgICAgIGhyZWY9XCJ7eyByb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLnZhbHVlIH19XCJcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIlxyXG4gICAgICAgICAgICAgICAgICAgIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWdvSW1hZ2VFcnJvclxyXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJyb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLmlzSW1nOyBlbHNlIG5vdEltZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJ7e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLnZhbHVlIHwgc2VjdXJlSW1hZ2UgfCBhc3luY1xyXG4gICAgICAgICAgICAgICAgICAgICAgfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCI1MFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBoZWlndGg9XCJhdXRvXCJcclxuICAgICAgICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm90SW1nXHJcbiAgICAgICAgICAgICAgICAgICAgICA+PHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPnt7ICdpZ28uZ2VvLnRhcmdldEh0bWxVcmwnIHwgdHJhbnNsYXRlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+PC9uZy10ZW1wbGF0ZVxyXG4gICAgICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbHVtblJlbmRlcmVyID09PSBlbnRpdHlUYWJsZUNvbHVtblJlbmRlcmVyLkljb25cIj5cclxuICAgICAgICAgIDx0ZFxyXG4gICAgICAgICAgICBtYXQtY2VsbFxyXG4gICAgICAgICAgICAqbWF0Q2VsbERlZj1cImxldCByb3dcIlxyXG4gICAgICAgICAgICBjbGFzcz1cIm1hdC1jZWxsLXRleHRcIlxyXG4gICAgICAgICAgICBbbmdDbGFzc109XCJyb3cuY2VsbERhdGFbY29sdW1uLm5hbWVdLmNsYXNzXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1pY29uXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjb2x1bW4ub25DbGlja1wiXHJcbiAgICAgICAgICAgICAgc3ZnSWNvbj1cInt7IHJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0udmFsdWUgfHwgY29sdW1uLmljb24gfX1cIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJjb2x1bW4ub25DbGljaygkZXZlbnQpXCJcclxuICAgICAgICAgICAgPjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvblxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIWNvbHVtbi5vbkNsaWNrXCJcclxuICAgICAgICAgICAgICBzdmdJY29uPVwie3sgcm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS52YWx1ZSB8fCBjb2x1bW4uaWNvbiB9fVwiXHJcbiAgICAgICAgICAgID48L21hdC1pY29uPlxyXG4gICAgICAgICAgPC90ZD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAqbmdJZj1cImNvbHVtblJlbmRlcmVyID09PSBlbnRpdHlUYWJsZUNvbHVtblJlbmRlcmVyLkJ1dHRvbkdyb3VwXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPlxyXG4gICAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgICBtYXQtY2VsbFxyXG4gICAgICAgICAgICAgIGNsYXNzPVwibWF0LWNlbGwtdGV4dFwiXHJcbiAgICAgICAgICAgICAgW25nQ2xhc3NdPVwicm93LmNlbGxEYXRhW2NvbHVtbi5uYW1lXS5jbGFzc1wiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICA8c3BhbiAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIHJvdy5jZWxsRGF0YVtjb2x1bW4ubmFtZV0udmFsdWVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAgICAgICBpc0VkaXRpb24ocm93LnJlY29yZCkgPT09IGJ1dHRvbi5lZGl0TW9kZSB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5lZGl0TW9kZSA9PT0gdW5kZWZpbmVkXHJcbiAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImJ1dHRvbi5zdHlsZSA9PT0gJ21hdC1pY29uLWJ1dHRvbidcIlxyXG4gICAgICAgICAgICAgICAgICAgIGlnb1N0b3BQcm9wYWdhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgIFtjb2xvcl09XCJidXR0b24uY29sb3JcIlxyXG4gICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25CdXR0b25DbGljayhidXR0b24uY2xpY2ssIHJvdy5yZWNvcmQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiYnV0dG9uLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwie3sgYnV0dG9uLmljb24gfX1cIj48L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiYnV0dG9uLnN0eWxlICE9PSAnbWF0LWljb24tYnV0dG9uJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgaWdvU3RvcFByb3BhZ2F0aW9uXHJcbiAgICAgICAgICAgICAgICAgICAgbWF0LW1pbmktZmFiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbG9yXT1cImJ1dHRvbi5jb2xvclwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbkJ1dHRvbkNsaWNrKGJ1dHRvbi5jbGljaywgcm93LnJlY29yZClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJidXR0b24uZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJ7eyBidXR0b24uaWNvbiB9fVwiPjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgPHRyXHJcbiAgICAgIG1hdC1oZWFkZXItcm93XHJcbiAgICAgICptYXRIZWFkZXJSb3dEZWY9XCJoZWFkZXJzOyBzdGlja3k6IGZpeGVkSGVhZGVyXCJcclxuICAgICAgW25nQ2xhc3NdPVwiZ2V0SGVhZGVyQ2xhc3MoKVwiXHJcbiAgICA+PC90cj5cclxuICAgIDx0clxyXG4gICAgICBtYXQtcm93XHJcbiAgICAgIGlnb0VudGl0eVRhYmxlUm93XHJcbiAgICAgICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBoZWFkZXJzXCJcclxuICAgICAgW3Njcm9sbEJlaGF2aW9yXT1cInNjcm9sbEJlaGF2aW9yXCJcclxuICAgICAgW25nQ2xhc3NdPVwiZ2V0Um93Q2xhc3Mocm93LnJlY29yZClcIlxyXG4gICAgICBbc2VsZWN0aW9uXT1cInNlbGVjdGlvblwiXHJcbiAgICAgIFtzZWxlY3RlZF09XCJyb3dJc1NlbGVjdGVkKHJvdy5yZWNvcmQpXCJcclxuICAgICAgKHNlbGVjdCk9XCJvblJvd1NlbGVjdChyb3cucmVjb3JkKVwiXHJcbiAgICAgIChjbGljayk9XCJvblJvd0NsaWNrKHJvdy5yZWNvcmQpXCJcclxuICAgID48L3RyPlxyXG4gIDwvdGFibGU+XHJcbiAgPGlnby1lbnRpdHktdGFibGUtcGFnaW5hdG9yXHJcbiAgICAqbmdJZj1cIndpdGhQYWdpbmF0b3JcIlxyXG4gICAgW3N0b3JlXT1cInN0b3JlXCJcclxuICAgIFtwYWdpbmF0b3JPcHRpb25zXT1cInBhZ2luYXRvck9wdGlvbnNcIlxyXG4gICAgW2VudGl0eVNvcnRDaGFuZ2UkXT1cImVudGl0eVNvcnRDaGFuZ2UkXCJcclxuICAgIChwYWdpbmF0b3JDaGFuZ2UpPVwicGFnaW5hdG9yQ2hhbmdlKCRldmVudClcIlxyXG4gID5cclxuICA8L2lnby1lbnRpdHktdGFibGUtcGFnaW5hdG9yPlxyXG48L2Rpdj5cclxuIl19
|