@wavemaker/app-ng-runtime 11.8.0-rc.5680 → 11.8.1-next.45204
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.
- app-ng-runtime/build-task/bundles/index.umd.js +9 -33
- app-ng-runtime/build-task/esm2022/advanced/carousel/carousel-template/carousel-template.build.mjs +2 -4
- app-ng-runtime/build-task/esm2022/advanced/carousel/carousel.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/basic/default/label/label.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/basic/progress/progress-bar/progress-bar.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/containers/accordion/accordion.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/containers/repeat-template.build.mjs +2 -4
- app-ng-runtime/build-task/esm2022/containers/tabs/tabs.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/data/form/form-field/form-field.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/data/form/form.build.mjs +2 -5
- app-ng-runtime/build-task/esm2022/data/list/list.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/data/media-list/media-list.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/data/table/table-column/table-column.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/data/table/table.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/dialogs/partial-dialog/partial-dialog.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/input/file-upload/file-upload.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/navigation/menu/menu.build.mjs +2 -19
- app-ng-runtime/build-task/esm2022/navigation/popover/popover.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/page/page-content/page-content.build.mjs +1 -1
- app-ng-runtime/build-task/esm2022/page/page.build.mjs +2 -3
- app-ng-runtime/build-task/esm2022/utils/utils.mjs +1 -1
- app-ng-runtime/build-task/fesm2022/index.mjs +6 -31
- app-ng-runtime/build-task/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/advanced/carousel/bundles/index.umd.js +16 -26
- app-ng-runtime/components/advanced/carousel/carousel-template/carousel-template.directive.d.ts +2 -2
- app-ng-runtime/components/advanced/carousel/carousel.directive.d.ts +2 -2
- app-ng-runtime/components/advanced/carousel/esm2022/carousel-template/carousel-template.directive.mjs +7 -12
- app-ng-runtime/components/advanced/carousel/esm2022/carousel.animator.mjs +2 -3
- app-ng-runtime/components/advanced/carousel/esm2022/carousel.directive.mjs +7 -12
- app-ng-runtime/components/advanced/carousel/esm2022/carousel.module.mjs +2 -2
- app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs +14 -25
- app-ng-runtime/components/advanced/carousel/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/advanced/login/bundles/index.umd.js +13 -19
- app-ng-runtime/components/advanced/login/esm2022/login.component.mjs +10 -17
- app-ng-runtime/components/advanced/login/esm2022/login.module.mjs +2 -2
- app-ng-runtime/components/advanced/login/fesm2022/index.mjs +11 -18
- app-ng-runtime/components/advanced/login/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/advanced/login/login.component.d.ts +2 -2
- app-ng-runtime/components/advanced/marquee/bundles/index.umd.js +6 -11
- app-ng-runtime/components/advanced/marquee/esm2022/marquee.directive.mjs +7 -12
- app-ng-runtime/components/advanced/marquee/esm2022/marquee.module.mjs +2 -2
- app-ng-runtime/components/advanced/marquee/fesm2022/index.mjs +8 -13
- app-ng-runtime/components/advanced/marquee/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/advanced/marquee/marquee.directive.d.ts +2 -2
- app-ng-runtime/components/base/bundles/index.umd.js +282 -367
- app-ng-runtime/components/base/directives/show-in-device.directive.d.ts +6 -3
- app-ng-runtime/components/base/esm2022/components.module.mjs +2 -2
- app-ng-runtime/components/base/esm2022/directives/show-in-device.directive.mjs +15 -13
- app-ng-runtime/components/base/esm2022/pipes/custom-pipes.mjs +34 -35
- app-ng-runtime/components/base/esm2022/pipes/image.pipe.mjs +2 -2
- app-ng-runtime/components/base/esm2022/pipes/sanitize.pipe.mjs +3 -3
- app-ng-runtime/components/base/esm2022/pipes/trust-as.pipe.mjs +3 -3
- app-ng-runtime/components/base/esm2022/pipes/wm-pipe.mjs +2 -3
- app-ng-runtime/components/base/esm2022/utils/data-utils.mjs +29 -30
- app-ng-runtime/components/base/esm2022/utils/form-utils.mjs +42 -48
- app-ng-runtime/components/base/esm2022/utils/live-utils.mjs +7 -8
- app-ng-runtime/components/base/esm2022/utils/widget-utils.mjs +27 -28
- app-ng-runtime/components/base/esm2022/widgets/common/base/base-container.component.mjs +7 -8
- app-ng-runtime/components/base/esm2022/widgets/common/base/base-field-validations.mjs +22 -23
- app-ng-runtime/components/base/esm2022/widgets/common/base/base.component.mjs +16 -36
- app-ng-runtime/components/base/esm2022/widgets/common/base/dataset-aware-nav.component.mjs +18 -52
- app-ng-runtime/components/base/esm2022/widgets/common/base/partial-container.directive.mjs +5 -6
- app-ng-runtime/components/base/esm2022/widgets/common/base/stylable.component.mjs +3 -3
- app-ng-runtime/components/base/esm2022/widgets/common/base/text-content.directive.mjs +3 -3
- app-ng-runtime/components/base/esm2022/widgets/common/container/container.directive.mjs +7 -12
- app-ng-runtime/components/base/esm2022/widgets/common/dialog/dialog.service.mjs +4 -5
- app-ng-runtime/components/base/esm2022/widgets/common/item-template/item-template.directive.mjs +7 -12
- app-ng-runtime/components/base/esm2022/widgets/common/lazy-load/lazy-load.directive.mjs +7 -14
- app-ng-runtime/components/base/esm2022/widgets/common/message/message.component.mjs +10 -16
- app-ng-runtime/components/base/esm2022/widgets/common/partial/partial.directive.mjs +8 -14
- app-ng-runtime/components/base/esm2022/widgets/common/partial-param/partial-param.directive.mjs +8 -9
- app-ng-runtime/components/base/esm2022/widgets/common/pull-to-refresh/pull-to-refresh.mjs +1 -1
- app-ng-runtime/components/base/esm2022/widgets/common/redraw/redrawable.directive.mjs +4 -4
- app-ng-runtime/components/base/esm2022/widgets/common/repeat-template/repeat-template.directive.mjs +7 -12
- app-ng-runtime/components/base/esm2022/widgets/common/smooth-scroll/smooth-scroll.directive.mjs +10 -11
- app-ng-runtime/components/base/esm2022/widgets/framework/deviceview.mjs +1 -1
- app-ng-runtime/components/base/esm2022/widgets/framework/property-change-handler.mjs +2 -3
- app-ng-runtime/components/base/esm2022/widgets/framework/styler.mjs +1 -1
- app-ng-runtime/components/base/esm2022/widgets/framework/widget-props.mjs +1 -1
- app-ng-runtime/components/base/esm2022/widgets/framework/widget-proxy-provider.mjs +3 -4
- app-ng-runtime/components/base/esm2022/widgets/framework/widget-registry.mjs +1 -1
- app-ng-runtime/components/base/fesm2022/index.mjs +284 -372
- app-ng-runtime/components/base/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/base/pipes/custom-pipes.d.ts +1 -1
- app-ng-runtime/components/base/utils/data-utils.d.ts +0 -1
- app-ng-runtime/components/base/utils/widget-utils.d.ts +2 -2
- app-ng-runtime/components/base/widgets/common/base/base-container.component.d.ts +1 -1
- app-ng-runtime/components/base/widgets/common/base/base-field-validations.d.ts +1 -1
- app-ng-runtime/components/base/widgets/common/base/base.component.d.ts +2 -4
- app-ng-runtime/components/base/widgets/common/base/dataset-aware-nav.component.d.ts +1 -1
- app-ng-runtime/components/base/widgets/common/base/partial-container.directive.d.ts +1 -1
- app-ng-runtime/components/base/widgets/common/container/container.directive.d.ts +2 -2
- app-ng-runtime/components/base/widgets/common/item-template/item-template.directive.d.ts +2 -2
- app-ng-runtime/components/base/widgets/common/lazy-load/lazy-load.directive.d.ts +2 -2
- app-ng-runtime/components/base/widgets/common/message/message.component.d.ts +2 -2
- app-ng-runtime/components/base/widgets/common/partial/partial.directive.d.ts +2 -2
- app-ng-runtime/components/base/widgets/common/repeat-template/repeat-template.directive.d.ts +2 -2
- app-ng-runtime/components/basic/default/anchor/anchor.component.d.ts +2 -2
- app-ng-runtime/components/basic/default/audio/audio.component.d.ts +2 -3
- app-ng-runtime/components/basic/default/bundles/index.umd.js +119 -163
- app-ng-runtime/components/basic/default/esm2022/anchor/anchor.component.mjs +27 -31
- app-ng-runtime/components/basic/default/esm2022/audio/audio.component.mjs +11 -18
- app-ng-runtime/components/basic/default/esm2022/basic.module.mjs +2 -2
- app-ng-runtime/components/basic/default/esm2022/html/html.directive.mjs +8 -13
- app-ng-runtime/components/basic/default/esm2022/icon/icon.component.mjs +14 -19
- app-ng-runtime/components/basic/default/esm2022/iframe/iframe.component.mjs +9 -15
- app-ng-runtime/components/basic/default/esm2022/label/label.directive.mjs +9 -15
- app-ng-runtime/components/basic/default/esm2022/picture/picture.directive.mjs +7 -12
- app-ng-runtime/components/basic/default/esm2022/picture/picture.props.mjs +1 -1
- app-ng-runtime/components/basic/default/esm2022/spinner/spinner.component.mjs +30 -34
- app-ng-runtime/components/basic/default/esm2022/video/video.component.mjs +17 -21
- app-ng-runtime/components/basic/default/fesm2022/index.mjs +117 -162
- app-ng-runtime/components/basic/default/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/basic/default/html/html.directive.d.ts +2 -2
- app-ng-runtime/components/basic/default/icon/icon.component.d.ts +2 -2
- app-ng-runtime/components/basic/default/iframe/iframe.component.d.ts +2 -2
- app-ng-runtime/components/basic/default/label/label.directive.d.ts +2 -2
- app-ng-runtime/components/basic/default/picture/picture.directive.d.ts +2 -2
- app-ng-runtime/components/basic/default/spinner/spinner.component.d.ts +2 -2
- app-ng-runtime/components/basic/default/video/video.component.d.ts +2 -2
- app-ng-runtime/components/basic/progress/bundles/index.umd.js +30 -43
- app-ng-runtime/components/basic/progress/esm2022/progress-bar/progress-bar.component.mjs +15 -22
- app-ng-runtime/components/basic/progress/esm2022/progress-circle/progress-circle.component.mjs +12 -20
- app-ng-runtime/components/basic/progress/esm2022/progress.module.mjs +2 -2
- app-ng-runtime/components/basic/progress/esm2022/utils.mjs +3 -3
- app-ng-runtime/components/basic/progress/fesm2022/index.mjs +28 -42
- app-ng-runtime/components/basic/progress/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/basic/progress/progress-bar/progress-bar.component.d.ts +2 -2
- app-ng-runtime/components/basic/progress/progress-circle/progress-circle.component.d.ts +2 -3
- app-ng-runtime/components/basic/rich-text-editor/bundles/index.umd.js +13 -19
- app-ng-runtime/components/basic/rich-text-editor/esm2022/rich-text-editor.component.mjs +10 -17
- app-ng-runtime/components/basic/rich-text-editor/esm2022/rich-text-editor.module.mjs +2 -2
- app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs +11 -18
- app-ng-runtime/components/basic/rich-text-editor/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/basic/rich-text-editor/rich-text-editor.component.d.ts +2 -2
- app-ng-runtime/components/basic/search/bundles/index.umd.js +175 -186
- app-ng-runtime/components/basic/search/esm2022/data-provider/data-provider.mjs +1 -1
- app-ng-runtime/components/basic/search/esm2022/data-provider/local-data-provider.mjs +23 -26
- app-ng-runtime/components/basic/search/esm2022/data-provider/remote-data-provider.mjs +11 -12
- app-ng-runtime/components/basic/search/esm2022/scrollable.directive.mjs +3 -3
- app-ng-runtime/components/basic/search/esm2022/search.component.mjs +138 -148
- app-ng-runtime/components/basic/search/esm2022/search.module.mjs +2 -2
- app-ng-runtime/components/basic/search/fesm2022/index.mjs +174 -186
- app-ng-runtime/components/basic/search/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/basic/search/search.component.d.ts +2 -2
- app-ng-runtime/components/basic/tree/bundles/index.umd.js +17 -23
- app-ng-runtime/components/basic/tree/esm2022/tree.component.mjs +14 -21
- app-ng-runtime/components/basic/tree/esm2022/tree.module.mjs +2 -2
- app-ng-runtime/components/basic/tree/fesm2022/index.mjs +15 -22
- app-ng-runtime/components/basic/tree/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/basic/tree/tree.component.d.ts +2 -2
- app-ng-runtime/components/chart/bundles/index.umd.js +84 -97
- app-ng-runtime/components/chart/chart.component.d.ts +3 -3
- app-ng-runtime/components/chart/chart.utils.d.ts +3 -3
- app-ng-runtime/components/chart/esm2022/chart.component.mjs +68 -82
- app-ng-runtime/components/chart/esm2022/chart.module.mjs +2 -2
- app-ng-runtime/components/chart/esm2022/chart.utils.mjs +13 -14
- app-ng-runtime/components/chart/fesm2022/index.mjs +81 -95
- app-ng-runtime/components/chart/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/containers/accordion/accordion-pane/accordion-pane.component.d.ts +2 -2
- app-ng-runtime/components/containers/accordion/accordion.directive.d.ts +2 -2
- app-ng-runtime/components/containers/accordion/bundles/index.umd.js +40 -51
- app-ng-runtime/components/containers/accordion/esm2022/accordion-pane/accordion-pane.component.mjs +17 -23
- app-ng-runtime/components/containers/accordion/esm2022/accordion-pane/accordion-pane.props.mjs +4 -4
- app-ng-runtime/components/containers/accordion/esm2022/accordion.directive.mjs +19 -25
- app-ng-runtime/components/containers/accordion/esm2022/accordion.module.mjs +2 -2
- app-ng-runtime/components/containers/accordion/fesm2022/index.mjs +38 -50
- app-ng-runtime/components/containers/accordion/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/containers/layout-grid/bundles/index.umd.js +17 -32
- app-ng-runtime/components/containers/layout-grid/esm2022/layout-grid-column/layout-grid-column.directive.mjs +8 -13
- app-ng-runtime/components/containers/layout-grid/esm2022/layout-grid-row/layout-grid-row.directive.mjs +7 -12
- app-ng-runtime/components/containers/layout-grid/esm2022/layout-grid.directive.mjs +7 -12
- app-ng-runtime/components/containers/layout-grid/esm2022/layout-grid.module.mjs +2 -2
- app-ng-runtime/components/containers/layout-grid/fesm2022/index.mjs +19 -34
- app-ng-runtime/components/containers/layout-grid/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/containers/layout-grid/layout-grid-column/layout-grid-column.directive.d.ts +2 -2
- app-ng-runtime/components/containers/layout-grid/layout-grid-row/layout-grid-row.directive.d.ts +2 -2
- app-ng-runtime/components/containers/layout-grid/layout-grid.directive.d.ts +2 -2
- app-ng-runtime/components/containers/linear-layout/bundles/index.umd.js +11 -21
- app-ng-runtime/components/containers/linear-layout/esm2022/linear-layout-item/linear-layout-item.directive.mjs +7 -12
- app-ng-runtime/components/containers/linear-layout/esm2022/linear-layout.directive.mjs +7 -12
- app-ng-runtime/components/containers/linear-layout/esm2022/linear-layout.module.mjs +2 -2
- app-ng-runtime/components/containers/linear-layout/fesm2022/index.mjs +13 -23
- app-ng-runtime/components/containers/linear-layout/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/containers/linear-layout/linear-layout-item/linear-layout-item.directive.d.ts +2 -2
- app-ng-runtime/components/containers/linear-layout/linear-layout.directive.d.ts +2 -2
- app-ng-runtime/components/containers/panel/bundles/index.umd.js +85 -85
- app-ng-runtime/components/containers/panel/esm2022/panel.component.mjs +82 -83
- app-ng-runtime/components/containers/panel/esm2022/panel.module.mjs +2 -2
- app-ng-runtime/components/containers/panel/fesm2022/index.mjs +83 -84
- app-ng-runtime/components/containers/panel/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/containers/panel/panel.component.d.ts +3 -3
- app-ng-runtime/components/containers/tabs/bundles/index.umd.js +63 -74
- app-ng-runtime/components/containers/tabs/esm2022/tab-pane/tab-pane.component.mjs +8 -14
- app-ng-runtime/components/containers/tabs/esm2022/tab-pane/tab-pane.props.mjs +4 -4
- app-ng-runtime/components/containers/tabs/esm2022/tabs.animator.mjs +1 -1
- app-ng-runtime/components/containers/tabs/esm2022/tabs.component.mjs +51 -57
- app-ng-runtime/components/containers/tabs/esm2022/tabs.module.mjs +2 -2
- app-ng-runtime/components/containers/tabs/esm2022/tabs.props.mjs +1 -1
- app-ng-runtime/components/containers/tabs/fesm2022/index.mjs +61 -73
- app-ng-runtime/components/containers/tabs/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/containers/tabs/tab-pane/tab-pane.component.d.ts +2 -2
- app-ng-runtime/components/containers/tabs/tabs.component.d.ts +2 -2
- app-ng-runtime/components/containers/tile/bundles/index.umd.js +6 -11
- app-ng-runtime/components/containers/tile/esm2022/tile.directive.mjs +7 -12
- app-ng-runtime/components/containers/tile/esm2022/tile.module.mjs +2 -2
- app-ng-runtime/components/containers/tile/fesm2022/index.mjs +8 -13
- app-ng-runtime/components/containers/tile/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/containers/tile/tile.directive.d.ts +2 -2
- app-ng-runtime/components/containers/wizard/bundles/index.umd.js +98 -102
- app-ng-runtime/components/containers/wizard/esm2022/wizard-step/wizard-step.directive.mjs +8 -13
- app-ng-runtime/components/containers/wizard/esm2022/wizard.component.mjs +93 -92
- app-ng-runtime/components/containers/wizard/esm2022/wizard.module.mjs +2 -2
- app-ng-runtime/components/containers/wizard/fesm2022/index.mjs +100 -104
- app-ng-runtime/components/containers/wizard/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/containers/wizard/wizard-step/wizard-step.directive.d.ts +2 -2
- app-ng-runtime/components/containers/wizard/wizard.component.d.ts +2 -2
- app-ng-runtime/components/data/card/bundles/index.umd.js +50 -70
- app-ng-runtime/components/data/card/card-actions/card-actions.directive.d.ts +2 -2
- app-ng-runtime/components/data/card/card-content/card-content.component.d.ts +2 -2
- app-ng-runtime/components/data/card/card-footer/card-footer.directive.d.ts +2 -2
- app-ng-runtime/components/data/card/card.component.d.ts +2 -2
- app-ng-runtime/components/data/card/esm2022/card-actions/card-actions.directive.mjs +7 -12
- app-ng-runtime/components/data/card/esm2022/card-content/card-content.component.mjs +9 -15
- app-ng-runtime/components/data/card/esm2022/card-footer/card-footer.directive.mjs +7 -12
- app-ng-runtime/components/data/card/esm2022/card.component.mjs +34 -38
- app-ng-runtime/components/data/card/esm2022/card.module.mjs +2 -2
- app-ng-runtime/components/data/card/fesm2022/index.mjs +52 -72
- app-ng-runtime/components/data/card/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/data/form/bundles/index.umd.js +188 -202
- app-ng-runtime/components/data/form/esm2022/form-action/form-action.directive.mjs +9 -15
- app-ng-runtime/components/data/form/esm2022/form-field/form-field.directive.mjs +16 -21
- app-ng-runtime/components/data/form/esm2022/form-field/form-field.props.mjs +1 -1
- app-ng-runtime/components/data/form/esm2022/form-widget.directive.mjs +4 -4
- app-ng-runtime/components/data/form/esm2022/form.component.mjs +135 -139
- app-ng-runtime/components/data/form/esm2022/form.module.mjs +2 -2
- app-ng-runtime/components/data/form/esm2022/form.props.mjs +1 -1
- app-ng-runtime/components/data/form/esm2022/live-actions/dependson.directive.mjs +4 -4
- app-ng-runtime/components/data/form/esm2022/live-actions/live-actions.directive.mjs +4 -4
- app-ng-runtime/components/data/form/esm2022/live-filter/live-filter.directive.mjs +6 -7
- app-ng-runtime/components/data/form/esm2022/live-form/live-form.directive.mjs +15 -18
- app-ng-runtime/components/data/form/fesm2022/index.mjs +191 -206
- app-ng-runtime/components/data/form/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/data/form/form-action/form-action.directive.d.ts +2 -2
- app-ng-runtime/components/data/form/form-field/form-field.directive.d.ts +2 -2
- app-ng-runtime/components/data/form/form.component.d.ts +4 -4
- app-ng-runtime/components/data/form/live-form/live-form.directive.d.ts +1 -1
- app-ng-runtime/components/data/list/bundles/index.umd.js +772 -780
- app-ng-runtime/components/data/list/esm2022/list-item.directive.mjs +4 -4
- app-ng-runtime/components/data/list/esm2022/list.animator.mjs +3 -5
- app-ng-runtime/components/data/list/esm2022/list.component.mjs +764 -772
- app-ng-runtime/components/data/list/esm2022/list.module.mjs +2 -2
- app-ng-runtime/components/data/list/fesm2022/index.mjs +770 -779
- app-ng-runtime/components/data/list/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/data/list/list.component.d.ts +54 -55
- app-ng-runtime/components/data/live-table/bundles/index.umd.js +7 -13
- app-ng-runtime/components/data/live-table/esm2022/live-table.component.mjs +8 -14
- app-ng-runtime/components/data/live-table/esm2022/live-table.module.mjs +2 -2
- app-ng-runtime/components/data/live-table/fesm2022/index.mjs +9 -15
- app-ng-runtime/components/data/live-table/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/data/live-table/live-table.component.d.ts +2 -2
- app-ng-runtime/components/data/pagination/bundles/index.umd.js +110 -113
- app-ng-runtime/components/data/pagination/esm2022/pagination.component.mjs +107 -111
- app-ng-runtime/components/data/pagination/esm2022/pagination.module.mjs +2 -2
- app-ng-runtime/components/data/pagination/fesm2022/index.mjs +108 -112
- app-ng-runtime/components/data/pagination/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/data/pagination/pagination.component.d.ts +2 -2
- app-ng-runtime/components/data/table/bundles/index.umd.js +269 -314
- app-ng-runtime/components/data/table/esm2022/table-action/table-action.directive.mjs +9 -15
- app-ng-runtime/components/data/table/esm2022/table-column/table-column.directive.mjs +25 -40
- app-ng-runtime/components/data/table/esm2022/table-column/table-column.props.mjs +2 -2
- app-ng-runtime/components/data/table/esm2022/table-column-group/table-column-group.directive.mjs +8 -13
- app-ng-runtime/components/data/table/esm2022/table-cud.directive.mjs +9 -10
- app-ng-runtime/components/data/table/esm2022/table-filter.directive.mjs +58 -56
- app-ng-runtime/components/data/table/esm2022/table-row/table-row.directive.mjs +8 -13
- app-ng-runtime/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +8 -14
- app-ng-runtime/components/data/table/esm2022/table.component.mjs +150 -165
- app-ng-runtime/components/data/table/esm2022/table.module.mjs +2 -2
- app-ng-runtime/components/data/table/esm2022/table.props.mjs +2 -2
- app-ng-runtime/components/data/table/fesm2022/index.mjs +267 -313
- app-ng-runtime/components/data/table/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/data/table/table-action/table-action.directive.d.ts +2 -2
- app-ng-runtime/components/data/table/table-column/table-column.directive.d.ts +8 -8
- app-ng-runtime/components/data/table/table-column-group/table-column-group.directive.d.ts +2 -2
- app-ng-runtime/components/data/table/table-row/table-row.directive.d.ts +2 -2
- app-ng-runtime/components/data/table/table-row-action/table-row-action.directive.d.ts +2 -2
- app-ng-runtime/components/data/table/table.component.d.ts +4 -4
- app-ng-runtime/components/dialogs/alert-dialog/alert-dialog.component.d.ts +2 -2
- app-ng-runtime/components/dialogs/alert-dialog/bundles/index.umd.js +9 -15
- app-ng-runtime/components/dialogs/alert-dialog/esm2022/alert-dialog.component.mjs +10 -16
- app-ng-runtime/components/dialogs/alert-dialog/esm2022/alert-dialog.module.mjs +2 -2
- app-ng-runtime/components/dialogs/alert-dialog/fesm2022/index.mjs +11 -17
- app-ng-runtime/components/dialogs/alert-dialog/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/dialogs/confirm-dialog/bundles/index.umd.js +11 -17
- app-ng-runtime/components/dialogs/confirm-dialog/confirm-dialog.component.d.ts +2 -2
- app-ng-runtime/components/dialogs/confirm-dialog/esm2022/confirm-dialog.component.mjs +12 -18
- app-ng-runtime/components/dialogs/confirm-dialog/esm2022/confirm-dialog.module.mjs +2 -2
- app-ng-runtime/components/dialogs/confirm-dialog/fesm2022/index.mjs +13 -19
- app-ng-runtime/components/dialogs/confirm-dialog/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/dialogs/default/base-dialog.d.ts +2 -2
- app-ng-runtime/components/dialogs/default/bundles/index.umd.js +71 -75
- app-ng-runtime/components/dialogs/default/dialog-footer/dialog-footer.directive.d.ts +2 -2
- app-ng-runtime/components/dialogs/default/esm2022/base-dialog.mjs +9 -14
- app-ng-runtime/components/dialogs/default/esm2022/dialog-body/dialog-body.directive.mjs +4 -4
- app-ng-runtime/components/dialogs/default/esm2022/dialog-footer/dialog-footer.directive.mjs +7 -12
- app-ng-runtime/components/dialogs/default/esm2022/dialog-header/dialog-header.component.mjs +55 -49
- app-ng-runtime/components/dialogs/default/esm2022/dialog.module.mjs +2 -2
- app-ng-runtime/components/dialogs/default/fesm2022/index.mjs +72 -76
- app-ng-runtime/components/dialogs/default/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/dialogs/design-dialog/bundles/index.umd.js +14 -20
- app-ng-runtime/components/dialogs/design-dialog/dialog.component.d.ts +2 -2
- app-ng-runtime/components/dialogs/design-dialog/esm2022/design-dialog.module.mjs +2 -2
- app-ng-runtime/components/dialogs/design-dialog/esm2022/dialog.component.mjs +15 -21
- app-ng-runtime/components/dialogs/design-dialog/fesm2022/index.mjs +16 -22
- app-ng-runtime/components/dialogs/design-dialog/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/dialogs/iframe-dialog/bundles/index.umd.js +14 -20
- app-ng-runtime/components/dialogs/iframe-dialog/esm2022/iframe-dialog.component.mjs +15 -21
- app-ng-runtime/components/dialogs/iframe-dialog/esm2022/iframe-dialog.module.mjs +2 -2
- app-ng-runtime/components/dialogs/iframe-dialog/fesm2022/index.mjs +16 -22
- app-ng-runtime/components/dialogs/iframe-dialog/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/dialogs/iframe-dialog/iframe-dialog.component.d.ts +2 -2
- app-ng-runtime/components/dialogs/login-dialog/bundles/index.umd.js +4 -4
- app-ng-runtime/components/dialogs/login-dialog/esm2022/login-dialog.directive.mjs +4 -4
- app-ng-runtime/components/dialogs/login-dialog/esm2022/login-dialog.module.mjs +2 -2
- app-ng-runtime/components/dialogs/login-dialog/fesm2022/index.mjs +4 -4
- app-ng-runtime/components/dialogs/login-dialog/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/dialogs/partial-dialog/bundles/index.umd.js +10 -16
- app-ng-runtime/components/dialogs/partial-dialog/esm2022/partial-dialog.component.mjs +11 -17
- app-ng-runtime/components/dialogs/partial-dialog/esm2022/partial-dialog.module.mjs +2 -2
- app-ng-runtime/components/dialogs/partial-dialog/fesm2022/index.mjs +12 -18
- app-ng-runtime/components/dialogs/partial-dialog/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/dialogs/partial-dialog/partial-dialog.component.d.ts +2 -2
- app-ng-runtime/components/input/calendar/bundles/index.umd.js +38 -46
- app-ng-runtime/components/input/calendar/calendar.component.d.ts +2 -2
- app-ng-runtime/components/input/calendar/esm2022/calendar.component.mjs +35 -44
- app-ng-runtime/components/input/calendar/esm2022/calendar.module.mjs +2 -2
- app-ng-runtime/components/input/calendar/fesm2022/index.mjs +36 -45
- app-ng-runtime/components/input/calendar/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/chips/bundles/index.umd.js +61 -69
- app-ng-runtime/components/input/chips/chips.component.d.ts +3 -3
- app-ng-runtime/components/input/chips/esm2022/chips.component.mjs +58 -67
- app-ng-runtime/components/input/chips/esm2022/chips.module.mjs +2 -2
- app-ng-runtime/components/input/chips/fesm2022/index.mjs +58 -67
- app-ng-runtime/components/input/chips/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/color-picker/bundles/index.umd.js +12 -25
- app-ng-runtime/components/input/color-picker/color-picker.component.d.ts +2 -2
- app-ng-runtime/components/input/color-picker/esm2022/color-picker.component.mjs +13 -26
- app-ng-runtime/components/input/color-picker/esm2022/color-picker.module.mjs +2 -2
- app-ng-runtime/components/input/color-picker/fesm2022/index.mjs +13 -26
- app-ng-runtime/components/input/color-picker/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/currency/bundles/index.umd.js +11 -18
- app-ng-runtime/components/input/currency/currency.component.d.ts +2 -2
- app-ng-runtime/components/input/currency/esm2022/currency.component.mjs +12 -19
- app-ng-runtime/components/input/currency/esm2022/currency.module.mjs +2 -2
- app-ng-runtime/components/input/currency/fesm2022/index.mjs +12 -19
- app-ng-runtime/components/input/currency/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/default/base-form.component.d.ts +3 -3
- app-ng-runtime/components/input/default/bundles/index.umd.js +487 -610
- app-ng-runtime/components/input/default/button/button.component.d.ts +2 -2
- app-ng-runtime/components/input/default/button-group/button-group.directive.d.ts +2 -2
- app-ng-runtime/components/input/default/checkbox/checkbox.component.d.ts +2 -3
- app-ng-runtime/components/input/default/checkboxset/checkboxset.component.d.ts +2 -2
- app-ng-runtime/components/input/default/composite/composite.directive.d.ts +2 -2
- app-ng-runtime/components/input/default/dataset-aware-form.component.d.ts +4 -4
- app-ng-runtime/components/input/default/esm2022/base-form-custom.component.mjs +3 -3
- app-ng-runtime/components/input/default/esm2022/base-form.component.mjs +11 -17
- app-ng-runtime/components/input/default/esm2022/button/button.component.mjs +28 -32
- app-ng-runtime/components/input/default/esm2022/button-group/button-group.directive.mjs +7 -12
- app-ng-runtime/components/input/default/esm2022/caption-position.directive.mjs +6 -6
- app-ng-runtime/components/input/default/esm2022/checkbox/checkbox.component.mjs +17 -27
- app-ng-runtime/components/input/default/esm2022/checkboxset/checkboxset.component.mjs +103 -107
- app-ng-runtime/components/input/default/esm2022/composite/composite.directive.mjs +7 -12
- app-ng-runtime/components/input/default/esm2022/dataset-aware-form.component.mjs +26 -32
- app-ng-runtime/components/input/default/esm2022/input.module.mjs +2 -2
- app-ng-runtime/components/input/default/esm2022/number/number.component.mjs +10 -17
- app-ng-runtime/components/input/default/esm2022/radioset/radioset.component.mjs +102 -105
- app-ng-runtime/components/input/default/esm2022/select/select.component.mjs +68 -70
- app-ng-runtime/components/input/default/esm2022/switch/switch.component.mjs +31 -38
- app-ng-runtime/components/input/default/esm2022/text/base/base-input.mjs +11 -18
- app-ng-runtime/components/input/default/esm2022/text/calendar/input-calendar.component.mjs +12 -23
- app-ng-runtime/components/input/default/esm2022/text/color/input-color.component.mjs +12 -23
- app-ng-runtime/components/input/default/esm2022/text/email/input-email.component.mjs +11 -20
- app-ng-runtime/components/input/default/esm2022/text/locale/number-locale.mjs +24 -35
- app-ng-runtime/components/input/default/esm2022/text/number/input-number.component.mjs +12 -21
- app-ng-runtime/components/input/default/esm2022/text/text/input-text.component.mjs +11 -20
- app-ng-runtime/components/input/default/esm2022/textarea/textarea.component.mjs +12 -21
- app-ng-runtime/components/input/default/fesm2022/index.mjs +488 -613
- app-ng-runtime/components/input/default/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/default/number/number.component.d.ts +2 -2
- app-ng-runtime/components/input/default/radioset/radioset.component.d.ts +2 -2
- app-ng-runtime/components/input/default/select/select.component.d.ts +4 -3
- app-ng-runtime/components/input/default/switch/switch.component.d.ts +2 -2
- app-ng-runtime/components/input/default/text/base/base-input.d.ts +2 -3
- app-ng-runtime/components/input/default/text/calendar/input-calendar.component.d.ts +2 -2
- app-ng-runtime/components/input/default/text/color/input-color.component.d.ts +2 -2
- app-ng-runtime/components/input/default/text/email/input-email.component.d.ts +2 -2
- app-ng-runtime/components/input/default/text/locale/number-locale.d.ts +1 -1
- app-ng-runtime/components/input/default/text/number/input-number.component.d.ts +2 -2
- app-ng-runtime/components/input/default/text/text/input-text.component.d.ts +2 -2
- app-ng-runtime/components/input/default/textarea/textarea.component.d.ts +2 -2
- app-ng-runtime/components/input/epoch/base-date-time.component.d.ts +2 -2
- app-ng-runtime/components/input/epoch/bundles/index.umd.js +165 -214
- app-ng-runtime/components/input/epoch/date/date.component.d.ts +2 -3
- app-ng-runtime/components/input/epoch/date-time/date-time.component.d.ts +2 -2
- app-ng-runtime/components/input/epoch/esm2022/base-date-time.component.mjs +36 -44
- app-ng-runtime/components/input/epoch/esm2022/date/date.component.mjs +22 -36
- app-ng-runtime/components/input/epoch/esm2022/date/date.props.mjs +2 -2
- app-ng-runtime/components/input/epoch/esm2022/date/imaskUtil.mjs +2 -8
- app-ng-runtime/components/input/epoch/esm2022/date-time/date-time-picker.component.mjs +41 -42
- app-ng-runtime/components/input/epoch/esm2022/date-time/date-time.component.mjs +37 -49
- app-ng-runtime/components/input/epoch/esm2022/epoch.module.mjs +2 -2
- app-ng-runtime/components/input/epoch/esm2022/picker/picker.component.mjs +5 -7
- app-ng-runtime/components/input/epoch/esm2022/time/time.component.mjs +24 -35
- app-ng-runtime/components/input/epoch/fesm2022/index.mjs +161 -211
- app-ng-runtime/components/input/epoch/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/epoch/time/time.component.d.ts +2 -2
- app-ng-runtime/components/input/file-upload/bundles/index.umd.js +135 -133
- app-ng-runtime/components/input/file-upload/esm2022/file-upload.component.mjs +132 -131
- app-ng-runtime/components/input/file-upload/esm2022/file-upload.module.mjs +2 -2
- app-ng-runtime/components/input/file-upload/fesm2022/index.mjs +133 -132
- app-ng-runtime/components/input/file-upload/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/file-upload/file-upload.component.d.ts +2 -2
- app-ng-runtime/components/input/rating/bundles/index.umd.js +51 -60
- app-ng-runtime/components/input/rating/esm2022/rating.component.mjs +48 -58
- app-ng-runtime/components/input/rating/esm2022/rating.module.mjs +2 -2
- app-ng-runtime/components/input/rating/fesm2022/index.mjs +48 -58
- app-ng-runtime/components/input/rating/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/rating/rating.component.d.ts +2 -2
- app-ng-runtime/components/input/slider/bundles/index.umd.js +13 -23
- app-ng-runtime/components/input/slider/esm2022/slider.component.mjs +14 -24
- app-ng-runtime/components/input/slider/esm2022/slider.module.mjs +2 -2
- app-ng-runtime/components/input/slider/fesm2022/index.mjs +14 -24
- app-ng-runtime/components/input/slider/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/input/slider/slider.component.d.ts +2 -2
- app-ng-runtime/components/navigation/breadcrumb/breadcrumb.component.d.ts +2 -2
- app-ng-runtime/components/navigation/breadcrumb/bundles/index.umd.js +28 -33
- app-ng-runtime/components/navigation/breadcrumb/esm2022/breadcrumb.component.mjs +29 -34
- app-ng-runtime/components/navigation/breadcrumb/esm2022/breadcrumb.module.mjs +2 -2
- app-ng-runtime/components/navigation/breadcrumb/fesm2022/index.mjs +30 -35
- app-ng-runtime/components/navigation/breadcrumb/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/navigation/menu/bundles/index.umd.js +137 -154
- app-ng-runtime/components/navigation/menu/esm2022/menu-adapator.component.mjs +7 -13
- app-ng-runtime/components/navigation/menu/esm2022/menu-dropdown/menu-dropdown.component.mjs +4 -5
- app-ng-runtime/components/navigation/menu/esm2022/menu-dropdown-item/menu-dropdown-item.component.mjs +26 -27
- app-ng-runtime/components/navigation/menu/esm2022/menu.component.mjs +40 -44
- app-ng-runtime/components/navigation/menu/esm2022/menu.module.mjs +2 -2
- app-ng-runtime/components/navigation/menu/esm2022/nav/nav-item/nav-item.directive.mjs +7 -12
- app-ng-runtime/components/navigation/menu/esm2022/nav/nav.component.mjs +56 -60
- app-ng-runtime/components/navigation/menu/esm2022/nav/navigation-control.directive.mjs +3 -3
- app-ng-runtime/components/navigation/menu/fesm2022/index.mjs +135 -153
- app-ng-runtime/components/navigation/menu/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/navigation/menu/menu-adapator.component.d.ts +1 -1
- app-ng-runtime/components/navigation/menu/menu-dropdown-item/menu-dropdown-item.component.d.ts +1 -12
- app-ng-runtime/components/navigation/menu/menu.component.d.ts +2 -2
- app-ng-runtime/components/navigation/menu/nav/nav-item/nav-item.directive.d.ts +2 -2
- app-ng-runtime/components/navigation/menu/nav/nav.component.d.ts +2 -2
- app-ng-runtime/components/navigation/navbar/bundles/index.umd.js +22 -29
- app-ng-runtime/components/navigation/navbar/esm2022/navbar.component.mjs +23 -30
- app-ng-runtime/components/navigation/navbar/esm2022/navbar.module.mjs +2 -2
- app-ng-runtime/components/navigation/navbar/fesm2022/index.mjs +24 -31
- app-ng-runtime/components/navigation/navbar/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/navigation/navbar/navbar.component.d.ts +2 -2
- app-ng-runtime/components/navigation/popover/bundles/index.umd.js +11 -18
- app-ng-runtime/components/navigation/popover/esm2022/popover.component.mjs +12 -19
- app-ng-runtime/components/navigation/popover/esm2022/popover.module.mjs +2 -2
- app-ng-runtime/components/navigation/popover/fesm2022/index.mjs +13 -20
- app-ng-runtime/components/navigation/popover/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/navigation/popover/popover.component.d.ts +2 -2
- app-ng-runtime/components/page/default/bundles/index.umd.js +31 -63
- app-ng-runtime/components/page/default/content/content.component.d.ts +2 -2
- app-ng-runtime/components/page/default/esm2022/content/content.component.mjs +7 -13
- app-ng-runtime/components/page/default/esm2022/layout.directive.mjs +7 -12
- app-ng-runtime/components/page/default/esm2022/page-content/page-content.component.mjs +7 -13
- app-ng-runtime/components/page/default/esm2022/page.directive.mjs +7 -12
- app-ng-runtime/components/page/default/esm2022/page.module.mjs +2 -2
- app-ng-runtime/components/page/default/esm2022/router-outlet.directive.mjs +7 -12
- app-ng-runtime/components/page/default/esm2022/spa-page.directive.mjs +7 -12
- app-ng-runtime/components/page/default/fesm2022/index.mjs +33 -65
- app-ng-runtime/components/page/default/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/page/default/layout.directive.d.ts +2 -2
- app-ng-runtime/components/page/default/page-content/page-content.component.d.ts +2 -2
- app-ng-runtime/components/page/default/page.directive.d.ts +2 -2
- app-ng-runtime/components/page/default/router-outlet.directive.d.ts +2 -2
- app-ng-runtime/components/page/default/spa-page.directive.d.ts +2 -2
- app-ng-runtime/components/page/footer/bundles/index.umd.js +6 -11
- app-ng-runtime/components/page/footer/esm2022/footer.directive.mjs +7 -12
- app-ng-runtime/components/page/footer/esm2022/footer.module.mjs +2 -2
- app-ng-runtime/components/page/footer/fesm2022/index.mjs +8 -13
- app-ng-runtime/components/page/footer/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/page/footer/footer.directive.d.ts +2 -2
- app-ng-runtime/components/page/header/bundles/index.umd.js +6 -12
- app-ng-runtime/components/page/header/esm2022/header.component.mjs +7 -13
- app-ng-runtime/components/page/header/esm2022/header.module.mjs +2 -2
- app-ng-runtime/components/page/header/fesm2022/index.mjs +8 -14
- app-ng-runtime/components/page/header/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/page/header/header.component.d.ts +2 -2
- app-ng-runtime/components/page/left-panel/bundles/index.umd.js +7 -12
- app-ng-runtime/components/page/left-panel/esm2022/left-panel.animator.mjs +1 -1
- app-ng-runtime/components/page/left-panel/esm2022/left-panel.directive.mjs +8 -13
- app-ng-runtime/components/page/left-panel/esm2022/left-panel.module.mjs +2 -2
- app-ng-runtime/components/page/left-panel/fesm2022/index.mjs +9 -14
- app-ng-runtime/components/page/left-panel/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/page/left-panel/left-panel.directive.d.ts +2 -2
- app-ng-runtime/components/page/right-panel/bundles/index.umd.js +6 -11
- app-ng-runtime/components/page/right-panel/esm2022/right-panel.directive.mjs +7 -12
- app-ng-runtime/components/page/right-panel/esm2022/right-panel.module.mjs +2 -2
- app-ng-runtime/components/page/right-panel/fesm2022/index.mjs +8 -13
- app-ng-runtime/components/page/right-panel/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/page/right-panel/right-panel.directive.d.ts +2 -2
- app-ng-runtime/components/page/top-nav/bundles/index.umd.js +6 -11
- app-ng-runtime/components/page/top-nav/esm2022/top-nav.directive.mjs +7 -12
- app-ng-runtime/components/page/top-nav/esm2022/top-nav.module.mjs +2 -2
- app-ng-runtime/components/page/top-nav/fesm2022/index.mjs +8 -13
- app-ng-runtime/components/page/top-nav/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/page/top-nav/top-nav.directive.d.ts +2 -2
- app-ng-runtime/components/prefab/bundles/index.umd.js +18 -28
- app-ng-runtime/components/prefab/esm2022/prefab-container/prefab-container.directive.mjs +8 -14
- app-ng-runtime/components/prefab/esm2022/prefab.directive.mjs +9 -15
- app-ng-runtime/components/prefab/esm2022/prefab.module.mjs +2 -2
- app-ng-runtime/components/prefab/fesm2022/index.mjs +15 -26
- app-ng-runtime/components/prefab/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/components/prefab/prefab-container/prefab-container.directive.d.ts +2 -2
- app-ng-runtime/components/prefab/prefab.directive.d.ts +2 -2
- app-ng-runtime/core/bundles/index.umd.js +146 -158
- app-ng-runtime/core/esm2022/core.module.mjs +2 -2
- app-ng-runtime/core/esm2022/public_api.mjs +2 -3
- app-ng-runtime/core/esm2022/services/constant.service.mjs +2 -2
- app-ng-runtime/core/esm2022/services/field-type.service.mjs +4 -5
- app-ng-runtime/core/esm2022/services/field-widget.service.mjs +4 -5
- app-ng-runtime/core/esm2022/services/pagination.service.mjs +7 -8
- app-ng-runtime/core/esm2022/services/script-loader.service.mjs +3 -3
- app-ng-runtime/core/esm2022/services/state-persistence.service.mjs +17 -18
- app-ng-runtime/core/esm2022/services/user-custom-pipe-manager.service.mjs +2 -2
- app-ng-runtime/core/esm2022/services/utils.service.mjs +4 -5
- app-ng-runtime/core/esm2022/services/viewport.service.mjs +4 -5
- app-ng-runtime/core/esm2022/utils/build-utils.mjs +4 -5
- app-ng-runtime/core/esm2022/utils/dom.mjs +1 -1
- app-ng-runtime/core/esm2022/utils/event-notifier.mjs +1 -1
- app-ng-runtime/core/esm2022/utils/expression-parser.mjs +5 -6
- app-ng-runtime/core/esm2022/utils/id-generator.mjs +1 -1
- app-ng-runtime/core/esm2022/utils/lru-cache.mjs +2 -3
- app-ng-runtime/core/esm2022/utils/utils.mjs +82 -79
- app-ng-runtime/core/esm2022/utils/watcher.mjs +7 -9
- app-ng-runtime/core/esm2022/utils/wm-project-properties.mjs +1 -1
- app-ng-runtime/core/fesm2022/index.mjs +142 -158
- app-ng-runtime/core/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/core/public_api.d.ts +1 -2
- app-ng-runtime/core/services/pagination.service.d.ts +1 -1
- app-ng-runtime/core/utils/utils.d.ts +9 -5
- app-ng-runtime/http/bundles/index.umd.js +10 -10
- app-ng-runtime/http/esm2022/http-service.module.mjs +2 -2
- app-ng-runtime/http/esm2022/http.service.mjs +6 -7
- app-ng-runtime/http/esm2022/wm-http-request.mjs +1 -1
- app-ng-runtime/http/esm2022/wm-http-response.mjs +1 -1
- app-ng-runtime/http/fesm2022/index.mjs +6 -7
- app-ng-runtime/http/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/locales/angular/global/af-na.js +4 -4
- app-ng-runtime/locales/angular/global/af.js +4 -4
- app-ng-runtime/locales/angular/global/agq.js +4 -4
- app-ng-runtime/locales/angular/global/ak.js +4 -4
- app-ng-runtime/locales/angular/global/am.js +4 -4
- app-ng-runtime/locales/angular/global/ar-ae.js +4 -4
- app-ng-runtime/locales/angular/global/ar-bh.js +4 -4
- app-ng-runtime/locales/angular/global/ar-dj.js +4 -4
- app-ng-runtime/locales/angular/global/ar-dz.js +4 -4
- app-ng-runtime/locales/angular/global/ar-eg.js +4 -4
- app-ng-runtime/locales/angular/global/ar-eh.js +4 -4
- app-ng-runtime/locales/angular/global/ar-er.js +4 -4
- app-ng-runtime/locales/angular/global/ar-il.js +4 -4
- app-ng-runtime/locales/angular/global/ar-iq.js +4 -4
- app-ng-runtime/locales/angular/global/ar-jo.js +4 -4
- app-ng-runtime/locales/angular/global/ar-km.js +4 -4
- app-ng-runtime/locales/angular/global/ar-kw.js +4 -4
- app-ng-runtime/locales/angular/global/ar-lb.js +4 -4
- app-ng-runtime/locales/angular/global/ar-ly.js +4 -4
- app-ng-runtime/locales/angular/global/ar-ma.js +4 -4
- app-ng-runtime/locales/angular/global/ar-mr.js +4 -4
- app-ng-runtime/locales/angular/global/ar-om.js +4 -4
- app-ng-runtime/locales/angular/global/ar-ps.js +4 -4
- app-ng-runtime/locales/angular/global/ar-qa.js +4 -4
- app-ng-runtime/locales/angular/global/ar-sa.js +4 -4
- app-ng-runtime/locales/angular/global/ar-sd.js +4 -4
- app-ng-runtime/locales/angular/global/ar-so.js +4 -4
- app-ng-runtime/locales/angular/global/ar-ss.js +4 -4
- app-ng-runtime/locales/angular/global/ar-sy.js +4 -4
- app-ng-runtime/locales/angular/global/ar-td.js +4 -4
- app-ng-runtime/locales/angular/global/ar-tn.js +4 -4
- app-ng-runtime/locales/angular/global/ar-ye.js +4 -4
- app-ng-runtime/locales/angular/global/ar.js +4 -4
- app-ng-runtime/locales/angular/global/as.js +4 -4
- app-ng-runtime/locales/angular/global/asa.js +4 -4
- app-ng-runtime/locales/angular/global/ast.js +4 -4
- app-ng-runtime/locales/angular/global/az-cyrl.js +4 -4
- app-ng-runtime/locales/angular/global/az-latn.js +4 -4
- app-ng-runtime/locales/angular/global/az.js +4 -4
- app-ng-runtime/locales/angular/global/bas.js +4 -4
- app-ng-runtime/locales/angular/global/be-tarask.js +4 -4
- app-ng-runtime/locales/angular/global/be.js +4 -4
- app-ng-runtime/locales/angular/global/bem.js +4 -4
- app-ng-runtime/locales/angular/global/bez.js +4 -4
- app-ng-runtime/locales/angular/global/bg.js +4 -4
- app-ng-runtime/locales/angular/global/bm.js +4 -4
- app-ng-runtime/locales/angular/global/bn-in.js +4 -4
- app-ng-runtime/locales/angular/global/bn.js +4 -4
- app-ng-runtime/locales/angular/global/bo-in.js +4 -4
- app-ng-runtime/locales/angular/global/bo.js +4 -4
- app-ng-runtime/locales/angular/global/br.js +4 -4
- app-ng-runtime/locales/angular/global/brx.js +4 -4
- app-ng-runtime/locales/angular/global/bs-cyrl.js +4 -4
- app-ng-runtime/locales/angular/global/bs-latn.js +4 -4
- app-ng-runtime/locales/angular/global/bs.js +4 -4
- app-ng-runtime/locales/angular/global/ca-ad.js +4 -4
- app-ng-runtime/locales/angular/global/ca-es-valencia.js +4 -4
- app-ng-runtime/locales/angular/global/ca-fr.js +4 -4
- app-ng-runtime/locales/angular/global/ca-it.js +4 -4
- app-ng-runtime/locales/angular/global/ca.js +4 -4
- app-ng-runtime/locales/angular/global/ccp-in.js +4 -4
- app-ng-runtime/locales/angular/global/ccp.js +4 -4
- app-ng-runtime/locales/angular/global/ce.js +4 -4
- app-ng-runtime/locales/angular/global/ceb.js +4 -4
- app-ng-runtime/locales/angular/global/cgg.js +4 -4
- app-ng-runtime/locales/angular/global/chr.js +4 -4
- app-ng-runtime/locales/angular/global/ckb-ir.js +4 -4
- app-ng-runtime/locales/angular/global/ckb.js +4 -4
- app-ng-runtime/locales/angular/global/cs.js +4 -4
- app-ng-runtime/locales/angular/global/cy.js +4 -4
- app-ng-runtime/locales/angular/global/da-gl.js +4 -4
- app-ng-runtime/locales/angular/global/da.js +4 -4
- app-ng-runtime/locales/angular/global/dav.js +4 -4
- app-ng-runtime/locales/angular/global/de-at.js +4 -4
- app-ng-runtime/locales/angular/global/de-be.js +4 -4
- app-ng-runtime/locales/angular/global/de-ch.js +4 -4
- app-ng-runtime/locales/angular/global/de-it.js +4 -4
- app-ng-runtime/locales/angular/global/de-li.js +4 -4
- app-ng-runtime/locales/angular/global/de-lu.js +4 -4
- app-ng-runtime/locales/angular/global/de.js +4 -4
- app-ng-runtime/locales/angular/global/dje.js +4 -4
- app-ng-runtime/locales/angular/global/doi.js +4 -4
- app-ng-runtime/locales/angular/global/dsb.js +4 -4
- app-ng-runtime/locales/angular/global/dua.js +4 -4
- app-ng-runtime/locales/angular/global/dyo.js +4 -4
- app-ng-runtime/locales/angular/global/dz.js +4 -4
- app-ng-runtime/locales/angular/global/ebu.js +4 -4
- app-ng-runtime/locales/angular/global/ee-tg.js +4 -4
- app-ng-runtime/locales/angular/global/ee.js +4 -4
- app-ng-runtime/locales/angular/global/el-cy.js +4 -4
- app-ng-runtime/locales/angular/global/el.js +4 -4
- app-ng-runtime/locales/angular/global/en-001.js +4 -4
- app-ng-runtime/locales/angular/global/en-150.js +4 -4
- app-ng-runtime/locales/angular/global/en-ae.js +4 -4
- app-ng-runtime/locales/angular/global/en-ag.js +4 -4
- app-ng-runtime/locales/angular/global/en-ai.js +4 -4
- app-ng-runtime/locales/angular/global/en-as.js +4 -4
- app-ng-runtime/locales/angular/global/en-at.js +4 -4
- app-ng-runtime/locales/angular/global/en-au.js +4 -4
- app-ng-runtime/locales/angular/global/en-bb.js +4 -4
- app-ng-runtime/locales/angular/global/en-be.js +4 -4
- app-ng-runtime/locales/angular/global/en-bi.js +4 -4
- app-ng-runtime/locales/angular/global/en-bm.js +4 -4
- app-ng-runtime/locales/angular/global/en-bs.js +4 -4
- app-ng-runtime/locales/angular/global/en-bw.js +4 -4
- app-ng-runtime/locales/angular/global/en-bz.js +4 -4
- app-ng-runtime/locales/angular/global/en-ca.js +4 -4
- app-ng-runtime/locales/angular/global/en-cc.js +4 -4
- app-ng-runtime/locales/angular/global/en-ch.js +4 -4
- app-ng-runtime/locales/angular/global/en-ck.js +4 -4
- app-ng-runtime/locales/angular/global/en-cm.js +4 -4
- app-ng-runtime/locales/angular/global/en-cx.js +4 -4
- app-ng-runtime/locales/angular/global/en-cy.js +4 -4
- app-ng-runtime/locales/angular/global/en-de.js +4 -4
- app-ng-runtime/locales/angular/global/en-dg.js +4 -4
- app-ng-runtime/locales/angular/global/en-dk.js +4 -4
- app-ng-runtime/locales/angular/global/en-dm.js +4 -4
- app-ng-runtime/locales/angular/global/en-er.js +4 -4
- app-ng-runtime/locales/angular/global/en-fi.js +4 -4
- app-ng-runtime/locales/angular/global/en-fj.js +4 -4
- app-ng-runtime/locales/angular/global/en-fk.js +4 -4
- app-ng-runtime/locales/angular/global/en-fm.js +4 -4
- app-ng-runtime/locales/angular/global/en-gb.js +4 -4
- app-ng-runtime/locales/angular/global/en-gd.js +4 -4
- app-ng-runtime/locales/angular/global/en-gg.js +4 -4
- app-ng-runtime/locales/angular/global/en-gh.js +4 -4
- app-ng-runtime/locales/angular/global/en-gi.js +4 -4
- app-ng-runtime/locales/angular/global/en-gm.js +4 -4
- app-ng-runtime/locales/angular/global/en-gu.js +4 -4
- app-ng-runtime/locales/angular/global/en-gy.js +4 -4
- app-ng-runtime/locales/angular/global/en-hk.js +4 -4
- app-ng-runtime/locales/angular/global/en-ie.js +4 -4
- app-ng-runtime/locales/angular/global/en-il.js +4 -4
- app-ng-runtime/locales/angular/global/en-im.js +4 -4
- app-ng-runtime/locales/angular/global/en-in.js +4 -4
- app-ng-runtime/locales/angular/global/en-io.js +4 -4
- app-ng-runtime/locales/angular/global/en-je.js +4 -4
- app-ng-runtime/locales/angular/global/en-jm.js +4 -4
- app-ng-runtime/locales/angular/global/en-ke.js +4 -4
- app-ng-runtime/locales/angular/global/en-ki.js +4 -4
- app-ng-runtime/locales/angular/global/en-kn.js +4 -4
- app-ng-runtime/locales/angular/global/en-ky.js +4 -4
- app-ng-runtime/locales/angular/global/en-lc.js +4 -4
- app-ng-runtime/locales/angular/global/en-lr.js +4 -4
- app-ng-runtime/locales/angular/global/en-ls.js +4 -4
- app-ng-runtime/locales/angular/global/en-mg.js +4 -4
- app-ng-runtime/locales/angular/global/en-mh.js +4 -4
- app-ng-runtime/locales/angular/global/en-mo.js +4 -4
- app-ng-runtime/locales/angular/global/en-mp.js +4 -4
- app-ng-runtime/locales/angular/global/en-ms.js +4 -4
- app-ng-runtime/locales/angular/global/en-mt.js +4 -4
- app-ng-runtime/locales/angular/global/en-mu.js +4 -4
- app-ng-runtime/locales/angular/global/en-mv.js +4 -4
- app-ng-runtime/locales/angular/global/en-mw.js +4 -4
- app-ng-runtime/locales/angular/global/en-my.js +4 -4
- app-ng-runtime/locales/angular/global/en-na.js +4 -4
- app-ng-runtime/locales/angular/global/en-nf.js +4 -4
- app-ng-runtime/locales/angular/global/en-ng.js +4 -4
- app-ng-runtime/locales/angular/global/en-nl.js +4 -4
- app-ng-runtime/locales/angular/global/en-nr.js +4 -4
- app-ng-runtime/locales/angular/global/en-nu.js +4 -4
- app-ng-runtime/locales/angular/global/en-nz.js +4 -4
- app-ng-runtime/locales/angular/global/en-pg.js +4 -4
- app-ng-runtime/locales/angular/global/en-ph.js +4 -4
- app-ng-runtime/locales/angular/global/en-pk.js +4 -4
- app-ng-runtime/locales/angular/global/en-pn.js +4 -4
- app-ng-runtime/locales/angular/global/en-pr.js +4 -4
- app-ng-runtime/locales/angular/global/en-pw.js +4 -4
- app-ng-runtime/locales/angular/global/en-rw.js +4 -4
- app-ng-runtime/locales/angular/global/en-sb.js +4 -4
- app-ng-runtime/locales/angular/global/en-sc.js +4 -4
- app-ng-runtime/locales/angular/global/en-sd.js +4 -4
- app-ng-runtime/locales/angular/global/en-se.js +4 -4
- app-ng-runtime/locales/angular/global/en-sg.js +4 -4
- app-ng-runtime/locales/angular/global/en-sh.js +4 -4
- app-ng-runtime/locales/angular/global/en-si.js +4 -4
- app-ng-runtime/locales/angular/global/en-sl.js +4 -4
- app-ng-runtime/locales/angular/global/en-ss.js +4 -4
- app-ng-runtime/locales/angular/global/en-sx.js +4 -4
- app-ng-runtime/locales/angular/global/en-sz.js +4 -4
- app-ng-runtime/locales/angular/global/en-tc.js +4 -4
- app-ng-runtime/locales/angular/global/en-tk.js +4 -4
- app-ng-runtime/locales/angular/global/en-to.js +4 -4
- app-ng-runtime/locales/angular/global/en-tt.js +4 -4
- app-ng-runtime/locales/angular/global/en-tv.js +4 -4
- app-ng-runtime/locales/angular/global/en-tz.js +4 -4
- app-ng-runtime/locales/angular/global/en-ug.js +4 -4
- app-ng-runtime/locales/angular/global/en-um.js +4 -4
- app-ng-runtime/locales/angular/global/en-vc.js +4 -4
- app-ng-runtime/locales/angular/global/en-vg.js +4 -4
- app-ng-runtime/locales/angular/global/en-vi.js +4 -4
- app-ng-runtime/locales/angular/global/en-vu.js +4 -4
- app-ng-runtime/locales/angular/global/en-ws.js +4 -4
- app-ng-runtime/locales/angular/global/en-za.js +4 -4
- app-ng-runtime/locales/angular/global/en-zm.js +4 -4
- app-ng-runtime/locales/angular/global/en-zw.js +4 -4
- app-ng-runtime/locales/angular/global/en.js +4 -4
- app-ng-runtime/locales/angular/global/eo.js +4 -4
- app-ng-runtime/locales/angular/global/es-419.js +4 -4
- app-ng-runtime/locales/angular/global/es-ar.js +4 -4
- app-ng-runtime/locales/angular/global/es-bo.js +4 -4
- app-ng-runtime/locales/angular/global/es-br.js +4 -4
- app-ng-runtime/locales/angular/global/es-bz.js +4 -4
- app-ng-runtime/locales/angular/global/es-cl.js +4 -4
- app-ng-runtime/locales/angular/global/es-co.js +4 -4
- app-ng-runtime/locales/angular/global/es-cr.js +4 -4
- app-ng-runtime/locales/angular/global/es-cu.js +4 -4
- app-ng-runtime/locales/angular/global/es-do.js +4 -4
- app-ng-runtime/locales/angular/global/es-ea.js +4 -4
- app-ng-runtime/locales/angular/global/es-ec.js +4 -4
- app-ng-runtime/locales/angular/global/es-gq.js +4 -4
- app-ng-runtime/locales/angular/global/es-gt.js +4 -4
- app-ng-runtime/locales/angular/global/es-hn.js +4 -4
- app-ng-runtime/locales/angular/global/es-ic.js +4 -4
- app-ng-runtime/locales/angular/global/es-mx.js +4 -4
- app-ng-runtime/locales/angular/global/es-ni.js +4 -4
- app-ng-runtime/locales/angular/global/es-pa.js +4 -4
- app-ng-runtime/locales/angular/global/es-pe.js +4 -4
- app-ng-runtime/locales/angular/global/es-ph.js +4 -4
- app-ng-runtime/locales/angular/global/es-pr.js +4 -4
- app-ng-runtime/locales/angular/global/es-py.js +4 -4
- app-ng-runtime/locales/angular/global/es-sv.js +4 -4
- app-ng-runtime/locales/angular/global/es-us.js +4 -4
- app-ng-runtime/locales/angular/global/es-uy.js +4 -4
- app-ng-runtime/locales/angular/global/es-ve.js +4 -4
- app-ng-runtime/locales/angular/global/es.js +4 -4
- app-ng-runtime/locales/angular/global/et.js +4 -4
- app-ng-runtime/locales/angular/global/eu.js +4 -4
- app-ng-runtime/locales/angular/global/ewo.js +4 -4
- app-ng-runtime/locales/angular/global/fa-af.js +4 -4
- app-ng-runtime/locales/angular/global/fa.js +4 -4
- app-ng-runtime/locales/angular/global/ff-adlm-bf.js +4 -4
- app-ng-runtime/locales/angular/global/ff-adlm-cm.js +4 -4
- app-ng-runtime/locales/angular/global/ff-adlm-gh.js +4 -4
- app-ng-runtime/locales/angular/global/ff-adlm-gm.js +4 -4
- app-ng-runtime/locales/angular/global/ff-adlm-gw.js +4 -4
- app-ng-runtime/locales/angular/global/ff-adlm-lr.js +4 -4
- app-ng-runtime/locales/angular/global/ff-adlm-mr.js +4 -4
- app-ng-runtime/locales/angular/global/ff-adlm-ne.js +4 -4
- app-ng-runtime/locales/angular/global/ff-adlm-ng.js +4 -4
- app-ng-runtime/locales/angular/global/ff-adlm-sl.js +4 -4
- app-ng-runtime/locales/angular/global/ff-adlm-sn.js +4 -4
- app-ng-runtime/locales/angular/global/ff-adlm.js +4 -4
- app-ng-runtime/locales/angular/global/ff-cm.js +44 -58
- app-ng-runtime/locales/angular/global/ff-gn.js +44 -58
- app-ng-runtime/locales/angular/global/ff-latn-bf.js +4 -4
- app-ng-runtime/locales/angular/global/ff-latn-cm.js +4 -4
- app-ng-runtime/locales/angular/global/ff-latn-gh.js +4 -4
- app-ng-runtime/locales/angular/global/ff-latn-gm.js +4 -4
- app-ng-runtime/locales/angular/global/ff-latn-gn.js +4 -4
- app-ng-runtime/locales/angular/global/ff-latn-gw.js +4 -4
- app-ng-runtime/locales/angular/global/ff-latn-lr.js +4 -4
- app-ng-runtime/locales/angular/global/ff-latn-mr.js +4 -4
- app-ng-runtime/locales/angular/global/ff-latn-ne.js +4 -4
- app-ng-runtime/locales/angular/global/ff-latn-ng.js +4 -4
- app-ng-runtime/locales/angular/global/ff-latn-sl.js +4 -4
- app-ng-runtime/locales/angular/global/ff-latn.js +4 -4
- app-ng-runtime/locales/angular/global/ff-mr.js +44 -58
- app-ng-runtime/locales/angular/global/ff.js +4 -4
- app-ng-runtime/locales/angular/global/fi.js +4 -4
- app-ng-runtime/locales/angular/global/fil.js +4 -4
- app-ng-runtime/locales/angular/global/fo-dk.js +4 -4
- app-ng-runtime/locales/angular/global/fo.js +4 -4
- app-ng-runtime/locales/angular/global/fr-be.js +4 -4
- app-ng-runtime/locales/angular/global/fr-bf.js +4 -4
- app-ng-runtime/locales/angular/global/fr-bi.js +4 -4
- app-ng-runtime/locales/angular/global/fr-bj.js +4 -4
- app-ng-runtime/locales/angular/global/fr-bl.js +4 -4
- app-ng-runtime/locales/angular/global/fr-ca.js +4 -4
- app-ng-runtime/locales/angular/global/fr-cd.js +4 -4
- app-ng-runtime/locales/angular/global/fr-cf.js +4 -4
- app-ng-runtime/locales/angular/global/fr-cg.js +4 -4
- app-ng-runtime/locales/angular/global/fr-ch.js +4 -4
- app-ng-runtime/locales/angular/global/fr-ci.js +4 -4
- app-ng-runtime/locales/angular/global/fr-cm.js +4 -4
- app-ng-runtime/locales/angular/global/fr-dj.js +4 -4
- app-ng-runtime/locales/angular/global/fr-dz.js +4 -4
- app-ng-runtime/locales/angular/global/fr-ga.js +4 -4
- app-ng-runtime/locales/angular/global/fr-gf.js +4 -4
- app-ng-runtime/locales/angular/global/fr-gn.js +4 -4
- app-ng-runtime/locales/angular/global/fr-gp.js +4 -4
- app-ng-runtime/locales/angular/global/fr-gq.js +4 -4
- app-ng-runtime/locales/angular/global/fr-ht.js +4 -4
- app-ng-runtime/locales/angular/global/fr-km.js +4 -4
- app-ng-runtime/locales/angular/global/fr-lu.js +4 -4
- app-ng-runtime/locales/angular/global/fr-ma.js +4 -4
- app-ng-runtime/locales/angular/global/fr-mc.js +4 -4
- app-ng-runtime/locales/angular/global/fr-mf.js +4 -4
- app-ng-runtime/locales/angular/global/fr-mg.js +4 -4
- app-ng-runtime/locales/angular/global/fr-ml.js +4 -4
- app-ng-runtime/locales/angular/global/fr-mq.js +4 -4
- app-ng-runtime/locales/angular/global/fr-mr.js +4 -4
- app-ng-runtime/locales/angular/global/fr-mu.js +4 -4
- app-ng-runtime/locales/angular/global/fr-nc.js +4 -4
- app-ng-runtime/locales/angular/global/fr-ne.js +4 -4
- app-ng-runtime/locales/angular/global/fr-pf.js +4 -4
- app-ng-runtime/locales/angular/global/fr-pm.js +4 -4
- app-ng-runtime/locales/angular/global/fr-re.js +4 -4
- app-ng-runtime/locales/angular/global/fr-rw.js +4 -4
- app-ng-runtime/locales/angular/global/fr-sc.js +4 -4
- app-ng-runtime/locales/angular/global/fr-sn.js +4 -4
- app-ng-runtime/locales/angular/global/fr-sy.js +4 -4
- app-ng-runtime/locales/angular/global/fr-td.js +4 -4
- app-ng-runtime/locales/angular/global/fr-tg.js +4 -4
- app-ng-runtime/locales/angular/global/fr-tn.js +4 -4
- app-ng-runtime/locales/angular/global/fr-vu.js +4 -4
- app-ng-runtime/locales/angular/global/fr-wf.js +4 -4
- app-ng-runtime/locales/angular/global/fr-yt.js +4 -4
- app-ng-runtime/locales/angular/global/fr.js +4 -4
- app-ng-runtime/locales/angular/global/fur.js +4 -4
- app-ng-runtime/locales/angular/global/fy.js +4 -4
- app-ng-runtime/locales/angular/global/ga-gb.js +4 -4
- app-ng-runtime/locales/angular/global/ga.js +4 -4
- app-ng-runtime/locales/angular/global/gd.js +4 -4
- app-ng-runtime/locales/angular/global/gl.js +4 -4
- app-ng-runtime/locales/angular/global/gsw-fr.js +4 -4
- app-ng-runtime/locales/angular/global/gsw-li.js +4 -4
- app-ng-runtime/locales/angular/global/gsw.js +4 -4
- app-ng-runtime/locales/angular/global/gu.js +4 -4
- app-ng-runtime/locales/angular/global/guz.js +4 -4
- app-ng-runtime/locales/angular/global/gv.js +4 -4
- app-ng-runtime/locales/angular/global/ha-gh.js +4 -4
- app-ng-runtime/locales/angular/global/ha-ne.js +4 -4
- app-ng-runtime/locales/angular/global/ha.js +4 -4
- app-ng-runtime/locales/angular/global/haw.js +4 -4
- app-ng-runtime/locales/angular/global/he.js +4 -4
- app-ng-runtime/locales/angular/global/hi-latn.js +4 -4
- app-ng-runtime/locales/angular/global/hi.js +4 -4
- app-ng-runtime/locales/angular/global/hr-ba.js +4 -4
- app-ng-runtime/locales/angular/global/hr.js +4 -4
- app-ng-runtime/locales/angular/global/hsb.js +4 -4
- app-ng-runtime/locales/angular/global/hu.js +4 -4
- app-ng-runtime/locales/angular/global/hy.js +4 -4
- app-ng-runtime/locales/angular/global/ia.js +4 -4
- app-ng-runtime/locales/angular/global/id.js +4 -4
- app-ng-runtime/locales/angular/global/ig.js +4 -4
- app-ng-runtime/locales/angular/global/ii.js +4 -4
- app-ng-runtime/locales/angular/global/is.js +4 -4
- app-ng-runtime/locales/angular/global/it-ch.js +4 -4
- app-ng-runtime/locales/angular/global/it-sm.js +4 -4
- app-ng-runtime/locales/angular/global/it-va.js +4 -4
- app-ng-runtime/locales/angular/global/it.js +4 -4
- app-ng-runtime/locales/angular/global/ja.js +4 -4
- app-ng-runtime/locales/angular/global/jgo.js +4 -4
- app-ng-runtime/locales/angular/global/jmc.js +4 -4
- app-ng-runtime/locales/angular/global/jv.js +4 -4
- app-ng-runtime/locales/angular/global/ka.js +4 -4
- app-ng-runtime/locales/angular/global/kab.js +4 -4
- app-ng-runtime/locales/angular/global/kam.js +4 -4
- app-ng-runtime/locales/angular/global/kde.js +4 -4
- app-ng-runtime/locales/angular/global/kea.js +4 -4
- app-ng-runtime/locales/angular/global/kgp.js +4 -4
- app-ng-runtime/locales/angular/global/khq.js +4 -4
- app-ng-runtime/locales/angular/global/ki.js +4 -4
- app-ng-runtime/locales/angular/global/kk.js +4 -4
- app-ng-runtime/locales/angular/global/kkj.js +4 -4
- app-ng-runtime/locales/angular/global/kl.js +4 -4
- app-ng-runtime/locales/angular/global/kln.js +4 -4
- app-ng-runtime/locales/angular/global/km.js +4 -4
- app-ng-runtime/locales/angular/global/kn.js +4 -4
- app-ng-runtime/locales/angular/global/ko-kp.js +4 -4
- app-ng-runtime/locales/angular/global/ko.js +4 -4
- app-ng-runtime/locales/angular/global/kok.js +4 -4
- app-ng-runtime/locales/angular/global/ks-arab.js +4 -4
- app-ng-runtime/locales/angular/global/ks-deva.js +4 -4
- app-ng-runtime/locales/angular/global/ks.js +4 -4
- app-ng-runtime/locales/angular/global/ksb.js +4 -4
- app-ng-runtime/locales/angular/global/ksf.js +4 -4
- app-ng-runtime/locales/angular/global/ksh.js +4 -4
- app-ng-runtime/locales/angular/global/ku.js +4 -4
- app-ng-runtime/locales/angular/global/kw.js +4 -4
- app-ng-runtime/locales/angular/global/ky.js +4 -4
- app-ng-runtime/locales/angular/global/lag.js +4 -4
- app-ng-runtime/locales/angular/global/lb.js +4 -4
- app-ng-runtime/locales/angular/global/lg.js +4 -4
- app-ng-runtime/locales/angular/global/lkt.js +4 -4
- app-ng-runtime/locales/angular/global/ln-ao.js +4 -4
- app-ng-runtime/locales/angular/global/ln-cf.js +4 -4
- app-ng-runtime/locales/angular/global/ln-cg.js +4 -4
- app-ng-runtime/locales/angular/global/ln.js +4 -4
- app-ng-runtime/locales/angular/global/lo.js +4 -4
- app-ng-runtime/locales/angular/global/lrc-iq.js +4 -4
- app-ng-runtime/locales/angular/global/lrc.js +4 -4
- app-ng-runtime/locales/angular/global/lt.js +4 -4
- app-ng-runtime/locales/angular/global/lu.js +4 -4
- app-ng-runtime/locales/angular/global/luo.js +4 -4
- app-ng-runtime/locales/angular/global/luy.js +4 -4
- app-ng-runtime/locales/angular/global/lv.js +4 -4
- app-ng-runtime/locales/angular/global/mai.js +4 -4
- app-ng-runtime/locales/angular/global/mas-tz.js +4 -4
- app-ng-runtime/locales/angular/global/mas.js +4 -4
- app-ng-runtime/locales/angular/global/mer.js +4 -4
- app-ng-runtime/locales/angular/global/mfe.js +4 -4
- app-ng-runtime/locales/angular/global/mg.js +4 -4
- app-ng-runtime/locales/angular/global/mgh.js +4 -4
- app-ng-runtime/locales/angular/global/mgo.js +4 -4
- app-ng-runtime/locales/angular/global/mi.js +4 -4
- app-ng-runtime/locales/angular/global/mk.js +4 -4
- app-ng-runtime/locales/angular/global/ml.js +4 -4
- app-ng-runtime/locales/angular/global/mn.js +4 -4
- app-ng-runtime/locales/angular/global/mni-beng.js +4 -4
- app-ng-runtime/locales/angular/global/mni.js +4 -4
- app-ng-runtime/locales/angular/global/mr.js +4 -4
- app-ng-runtime/locales/angular/global/ms-bn.js +4 -4
- app-ng-runtime/locales/angular/global/ms-id.js +4 -4
- app-ng-runtime/locales/angular/global/ms-sg.js +4 -4
- app-ng-runtime/locales/angular/global/ms.js +4 -4
- app-ng-runtime/locales/angular/global/mt.js +4 -4
- app-ng-runtime/locales/angular/global/mua.js +4 -4
- app-ng-runtime/locales/angular/global/my.js +4 -4
- app-ng-runtime/locales/angular/global/mzn.js +4 -4
- app-ng-runtime/locales/angular/global/naq.js +4 -4
- app-ng-runtime/locales/angular/global/nb-sj.js +4 -4
- app-ng-runtime/locales/angular/global/nb.js +4 -4
- app-ng-runtime/locales/angular/global/nd.js +4 -4
- app-ng-runtime/locales/angular/global/nds-nl.js +4 -4
- app-ng-runtime/locales/angular/global/nds.js +4 -4
- app-ng-runtime/locales/angular/global/ne-in.js +4 -4
- app-ng-runtime/locales/angular/global/ne.js +4 -4
- app-ng-runtime/locales/angular/global/nl-aw.js +4 -4
- app-ng-runtime/locales/angular/global/nl-be.js +4 -4
- app-ng-runtime/locales/angular/global/nl-bq.js +4 -4
- app-ng-runtime/locales/angular/global/nl-cw.js +4 -4
- app-ng-runtime/locales/angular/global/nl-sr.js +4 -4
- app-ng-runtime/locales/angular/global/nl-sx.js +4 -4
- app-ng-runtime/locales/angular/global/nl.js +4 -4
- app-ng-runtime/locales/angular/global/nmg.js +4 -4
- app-ng-runtime/locales/angular/global/nn.js +4 -4
- app-ng-runtime/locales/angular/global/nnh.js +4 -4
- app-ng-runtime/locales/angular/global/no.js +4 -4
- app-ng-runtime/locales/angular/global/nus.js +4 -4
- app-ng-runtime/locales/angular/global/nyn.js +4 -4
- app-ng-runtime/locales/angular/global/om-ke.js +4 -4
- app-ng-runtime/locales/angular/global/om.js +4 -4
- app-ng-runtime/locales/angular/global/or.js +4 -4
- app-ng-runtime/locales/angular/global/os-ru.js +4 -4
- app-ng-runtime/locales/angular/global/os.js +4 -4
- app-ng-runtime/locales/angular/global/pa-arab.js +4 -4
- app-ng-runtime/locales/angular/global/pa-guru.js +4 -4
- app-ng-runtime/locales/angular/global/pa.js +4 -4
- app-ng-runtime/locales/angular/global/pcm.js +4 -4
- app-ng-runtime/locales/angular/global/pl.js +4 -4
- app-ng-runtime/locales/angular/global/ps-pk.js +4 -4
- app-ng-runtime/locales/angular/global/ps.js +4 -4
- app-ng-runtime/locales/angular/global/pt-ao.js +4 -4
- app-ng-runtime/locales/angular/global/pt-ch.js +4 -4
- app-ng-runtime/locales/angular/global/pt-cv.js +4 -4
- app-ng-runtime/locales/angular/global/pt-gq.js +4 -4
- app-ng-runtime/locales/angular/global/pt-gw.js +4 -4
- app-ng-runtime/locales/angular/global/pt-lu.js +4 -4
- app-ng-runtime/locales/angular/global/pt-mo.js +4 -4
- app-ng-runtime/locales/angular/global/pt-mz.js +4 -4
- app-ng-runtime/locales/angular/global/pt-pt.js +4 -4
- app-ng-runtime/locales/angular/global/pt-st.js +4 -4
- app-ng-runtime/locales/angular/global/pt-tl.js +4 -4
- app-ng-runtime/locales/angular/global/pt.js +4 -4
- app-ng-runtime/locales/angular/global/qu-bo.js +4 -4
- app-ng-runtime/locales/angular/global/qu-ec.js +4 -4
- app-ng-runtime/locales/angular/global/qu.js +4 -4
- app-ng-runtime/locales/angular/global/rm.js +4 -4
- app-ng-runtime/locales/angular/global/rn.js +4 -4
- app-ng-runtime/locales/angular/global/ro-md.js +4 -4
- app-ng-runtime/locales/angular/global/ro.js +4 -4
- app-ng-runtime/locales/angular/global/rof.js +4 -4
- app-ng-runtime/locales/angular/global/ru-by.js +4 -4
- app-ng-runtime/locales/angular/global/ru-kg.js +4 -4
- app-ng-runtime/locales/angular/global/ru-kz.js +4 -4
- app-ng-runtime/locales/angular/global/ru-md.js +4 -4
- app-ng-runtime/locales/angular/global/ru-ua.js +4 -4
- app-ng-runtime/locales/angular/global/ru.js +4 -4
- app-ng-runtime/locales/angular/global/rw.js +4 -4
- app-ng-runtime/locales/angular/global/rwk.js +4 -4
- app-ng-runtime/locales/angular/global/sa.js +4 -4
- app-ng-runtime/locales/angular/global/sah.js +4 -4
- app-ng-runtime/locales/angular/global/saq.js +4 -4
- app-ng-runtime/locales/angular/global/sat-olck.js +4 -4
- app-ng-runtime/locales/angular/global/sat.js +4 -4
- app-ng-runtime/locales/angular/global/sbp.js +4 -4
- app-ng-runtime/locales/angular/global/sc.js +4 -4
- app-ng-runtime/locales/angular/global/sd-arab.js +4 -4
- app-ng-runtime/locales/angular/global/sd-deva.js +4 -4
- app-ng-runtime/locales/angular/global/sd.js +4 -4
- app-ng-runtime/locales/angular/global/se-fi.js +4 -4
- app-ng-runtime/locales/angular/global/se-se.js +4 -4
- app-ng-runtime/locales/angular/global/se.js +4 -4
- app-ng-runtime/locales/angular/global/seh.js +4 -4
- app-ng-runtime/locales/angular/global/ses.js +4 -4
- app-ng-runtime/locales/angular/global/sg.js +4 -4
- app-ng-runtime/locales/angular/global/shi-latn.js +4 -4
- app-ng-runtime/locales/angular/global/shi-tfng.js +4 -4
- app-ng-runtime/locales/angular/global/shi.js +4 -4
- app-ng-runtime/locales/angular/global/si.js +4 -4
- app-ng-runtime/locales/angular/global/sk.js +4 -4
- app-ng-runtime/locales/angular/global/sl.js +4 -4
- app-ng-runtime/locales/angular/global/smn.js +4 -4
- app-ng-runtime/locales/angular/global/sn.js +4 -4
- app-ng-runtime/locales/angular/global/so-dj.js +4 -4
- app-ng-runtime/locales/angular/global/so-et.js +4 -4
- app-ng-runtime/locales/angular/global/so-ke.js +4 -4
- app-ng-runtime/locales/angular/global/so.js +4 -4
- app-ng-runtime/locales/angular/global/sq-mk.js +4 -4
- app-ng-runtime/locales/angular/global/sq-xk.js +4 -4
- app-ng-runtime/locales/angular/global/sq.js +4 -4
- app-ng-runtime/locales/angular/global/sr-cyrl-ba.js +4 -4
- app-ng-runtime/locales/angular/global/sr-cyrl-me.js +4 -4
- app-ng-runtime/locales/angular/global/sr-cyrl-xk.js +4 -4
- app-ng-runtime/locales/angular/global/sr-cyrl.js +4 -4
- app-ng-runtime/locales/angular/global/sr-latn-ba.js +4 -4
- app-ng-runtime/locales/angular/global/sr-latn-me.js +4 -4
- app-ng-runtime/locales/angular/global/sr-latn-xk.js +4 -4
- app-ng-runtime/locales/angular/global/sr-latn.js +4 -4
- app-ng-runtime/locales/angular/global/sr.js +4 -4
- app-ng-runtime/locales/angular/global/su-latn.js +4 -4
- app-ng-runtime/locales/angular/global/su.js +4 -4
- app-ng-runtime/locales/angular/global/sv-ax.js +4 -4
- app-ng-runtime/locales/angular/global/sv-fi.js +4 -4
- app-ng-runtime/locales/angular/global/sv.js +4 -4
- app-ng-runtime/locales/angular/global/sw-cd.js +4 -4
- app-ng-runtime/locales/angular/global/sw-ke.js +4 -4
- app-ng-runtime/locales/angular/global/sw-ug.js +4 -4
- app-ng-runtime/locales/angular/global/sw.js +4 -4
- app-ng-runtime/locales/angular/global/ta-lk.js +4 -4
- app-ng-runtime/locales/angular/global/ta-my.js +4 -4
- app-ng-runtime/locales/angular/global/ta-sg.js +4 -4
- app-ng-runtime/locales/angular/global/ta.js +4 -4
- app-ng-runtime/locales/angular/global/te.js +4 -4
- app-ng-runtime/locales/angular/global/teo-ke.js +4 -4
- app-ng-runtime/locales/angular/global/teo.js +4 -4
- app-ng-runtime/locales/angular/global/tg.js +4 -4
- app-ng-runtime/locales/angular/global/th.js +4 -4
- app-ng-runtime/locales/angular/global/ti-er.js +4 -4
- app-ng-runtime/locales/angular/global/ti.js +4 -4
- app-ng-runtime/locales/angular/global/tk.js +4 -4
- app-ng-runtime/locales/angular/global/to.js +4 -4
- app-ng-runtime/locales/angular/global/tr-cy.js +4 -4
- app-ng-runtime/locales/angular/global/tr.js +4 -4
- app-ng-runtime/locales/angular/global/tt.js +4 -4
- app-ng-runtime/locales/angular/global/twq.js +4 -4
- app-ng-runtime/locales/angular/global/tzm.js +4 -4
- app-ng-runtime/locales/angular/global/ug.js +4 -4
- app-ng-runtime/locales/angular/global/uk.js +4 -4
- app-ng-runtime/locales/angular/global/und.js +4 -4
- app-ng-runtime/locales/angular/global/ur-in.js +4 -4
- app-ng-runtime/locales/angular/global/ur.js +4 -4
- app-ng-runtime/locales/angular/global/uz-arab.js +4 -4
- app-ng-runtime/locales/angular/global/uz-cyrl.js +4 -4
- app-ng-runtime/locales/angular/global/uz-latn.js +4 -4
- app-ng-runtime/locales/angular/global/uz.js +4 -4
- app-ng-runtime/locales/angular/global/vai-latn.js +4 -4
- app-ng-runtime/locales/angular/global/vai-vaii.js +4 -4
- app-ng-runtime/locales/angular/global/vai.js +4 -4
- app-ng-runtime/locales/angular/global/vi.js +4 -4
- app-ng-runtime/locales/angular/global/vun.js +4 -4
- app-ng-runtime/locales/angular/global/wae.js +4 -4
- app-ng-runtime/locales/angular/global/wo.js +4 -4
- app-ng-runtime/locales/angular/global/xh.js +4 -4
- app-ng-runtime/locales/angular/global/xog.js +4 -4
- app-ng-runtime/locales/angular/global/yav.js +4 -4
- app-ng-runtime/locales/angular/global/yi.js +4 -4
- app-ng-runtime/locales/angular/global/yo-bj.js +4 -4
- app-ng-runtime/locales/angular/global/yo.js +4 -4
- app-ng-runtime/locales/angular/global/yrl-co.js +4 -4
- app-ng-runtime/locales/angular/global/yrl-ve.js +4 -4
- app-ng-runtime/locales/angular/global/yrl.js +4 -4
- app-ng-runtime/locales/angular/global/yue-hans.js +4 -4
- app-ng-runtime/locales/angular/global/yue-hant.js +4 -4
- app-ng-runtime/locales/angular/global/yue.js +4 -4
- app-ng-runtime/locales/angular/global/zgh.js +4 -4
- app-ng-runtime/locales/angular/global/zh-hans-hk.js +4 -4
- app-ng-runtime/locales/angular/global/zh-hans-mo.js +4 -4
- app-ng-runtime/locales/angular/global/zh-hans-sg.js +4 -4
- app-ng-runtime/locales/angular/global/zh-hans.js +4 -4
- app-ng-runtime/locales/angular/global/zh-hant-hk.js +4 -4
- app-ng-runtime/locales/angular/global/zh-hant-mo.js +4 -4
- app-ng-runtime/locales/angular/global/zh-hant.js +4 -4
- app-ng-runtime/locales/angular/global/zh.js +4 -4
- app-ng-runtime/locales/angular/global/zu.js +4 -4
- app-ng-runtime/mobile/components/basic/default/bundles/index.umd.js +143 -148
- app-ng-runtime/mobile/components/basic/default/esm2022/anchor/anchor.directive.mjs +7 -8
- app-ng-runtime/mobile/components/basic/default/esm2022/app-update/app-update.component.mjs +6 -7
- app-ng-runtime/mobile/components/basic/default/esm2022/basic.module.mjs +2 -2
- app-ng-runtime/mobile/components/basic/default/esm2022/file-browser/file-browser.component.mjs +43 -47
- app-ng-runtime/mobile/components/basic/default/esm2022/file-browser/file-selector.service.mjs +5 -7
- app-ng-runtime/mobile/components/basic/default/esm2022/image-cache/image-cache.directive.mjs +5 -6
- app-ng-runtime/mobile/components/basic/default/esm2022/network-info-toaster/network-info-toaster.component.mjs +47 -49
- app-ng-runtime/mobile/components/basic/default/esm2022/process-manager/process-management.service.mjs +2 -2
- app-ng-runtime/mobile/components/basic/default/esm2022/process-manager/process-manager.component.mjs +32 -31
- app-ng-runtime/mobile/components/basic/default/fesm2022/index.mjs +140 -146
- app-ng-runtime/mobile/components/basic/default/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/basic/default/network-info-toaster/network-info-toaster.component.d.ts +2 -2
- app-ng-runtime/mobile/components/basic/search/bundles/index.umd.js +3 -3
- app-ng-runtime/mobile/components/basic/search/esm2022/search.directive.mjs +3 -3
- app-ng-runtime/mobile/components/basic/search/esm2022/search.module.mjs +2 -2
- app-ng-runtime/mobile/components/basic/search/fesm2022/index.mjs +3 -3
- app-ng-runtime/mobile/components/basic/search/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/containers/segmented-control/bundles/index.umd.js +30 -42
- app-ng-runtime/mobile/components/containers/segmented-control/esm2022/segment-content/segment-content.component.mjs +8 -14
- app-ng-runtime/mobile/components/containers/segmented-control/esm2022/segmented-control.component.mjs +21 -28
- app-ng-runtime/mobile/components/containers/segmented-control/esm2022/segmented-control.module.mjs +2 -2
- app-ng-runtime/mobile/components/containers/segmented-control/fesm2022/index.mjs +28 -41
- app-ng-runtime/mobile/components/containers/segmented-control/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/containers/segmented-control/segment-content/segment-content.component.d.ts +2 -2
- app-ng-runtime/mobile/components/containers/segmented-control/segmented-control.component.d.ts +2 -2
- app-ng-runtime/mobile/components/data/media-list/bundles/index.umd.js +48 -53
- app-ng-runtime/mobile/components/data/media-list/esm2022/media-list-item/media-list-item.directive.mjs +2 -2
- app-ng-runtime/mobile/components/data/media-list/esm2022/media-list.component.mjs +42 -48
- app-ng-runtime/mobile/components/data/media-list/esm2022/media-list.module.mjs +2 -2
- app-ng-runtime/mobile/components/data/media-list/fesm2022/index.mjs +44 -50
- app-ng-runtime/mobile/components/data/media-list/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/data/media-list/media-list.component.d.ts +2 -2
- app-ng-runtime/mobile/components/device/barcode-scanner/barcode-scanner.component.d.ts +2 -2
- app-ng-runtime/mobile/components/device/barcode-scanner/bundles/index.umd.js +8 -14
- app-ng-runtime/mobile/components/device/barcode-scanner/esm2022/barcode-scanner.component.mjs +9 -15
- app-ng-runtime/mobile/components/device/barcode-scanner/esm2022/barcode-scanner.module.mjs +2 -2
- app-ng-runtime/mobile/components/device/barcode-scanner/fesm2022/index.mjs +10 -16
- app-ng-runtime/mobile/components/device/barcode-scanner/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/device/camera/bundles/index.umd.js +9 -15
- app-ng-runtime/mobile/components/device/camera/camera.component.d.ts +2 -2
- app-ng-runtime/mobile/components/device/camera/esm2022/camera.component.mjs +10 -16
- app-ng-runtime/mobile/components/device/camera/esm2022/camera.module.mjs +2 -2
- app-ng-runtime/mobile/components/device/camera/fesm2022/index.mjs +11 -17
- app-ng-runtime/mobile/components/device/camera/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/input/file-upload/bundles/index.umd.js +3 -3
- app-ng-runtime/mobile/components/input/file-upload/esm2022/file-upload.directive.mjs +3 -3
- app-ng-runtime/mobile/components/input/file-upload/esm2022/file-upload.module.mjs +2 -2
- app-ng-runtime/mobile/components/input/file-upload/fesm2022/index.mjs +3 -3
- app-ng-runtime/mobile/components/input/file-upload/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/page/default/bundles/index.umd.js +10 -11
- app-ng-runtime/mobile/components/page/default/esm2022/page-content-loader/page-content-loader.component.mjs +3 -4
- app-ng-runtime/mobile/components/page/default/esm2022/page.directive.mjs +4 -5
- app-ng-runtime/mobile/components/page/default/esm2022/page.module.mjs +2 -2
- app-ng-runtime/mobile/components/page/default/fesm2022/index.mjs +6 -8
- app-ng-runtime/mobile/components/page/default/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/page/left-panel/bundles/index.umd.js +3 -3
- app-ng-runtime/mobile/components/page/left-panel/esm2022/left-panel.directive.mjs +3 -3
- app-ng-runtime/mobile/components/page/left-panel/esm2022/left-panel.module.mjs +2 -2
- app-ng-runtime/mobile/components/page/left-panel/fesm2022/index.mjs +3 -3
- app-ng-runtime/mobile/components/page/left-panel/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/page/mobile-navbar/bundles/index.umd.js +35 -40
- app-ng-runtime/mobile/components/page/mobile-navbar/esm2022/mobile-navbar.component.mjs +36 -41
- app-ng-runtime/mobile/components/page/mobile-navbar/esm2022/mobile-navbar.module.mjs +2 -2
- app-ng-runtime/mobile/components/page/mobile-navbar/fesm2022/index.mjs +36 -41
- app-ng-runtime/mobile/components/page/mobile-navbar/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/page/mobile-navbar/mobile-navbar.component.d.ts +2 -2
- app-ng-runtime/mobile/components/page/tab-bar/bundles/index.umd.js +46 -52
- app-ng-runtime/mobile/components/page/tab-bar/esm2022/tab-bar.module.mjs +2 -2
- app-ng-runtime/mobile/components/page/tab-bar/esm2022/tabbar.component.mjs +43 -50
- app-ng-runtime/mobile/components/page/tab-bar/fesm2022/index.mjs +44 -51
- app-ng-runtime/mobile/components/page/tab-bar/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/components/page/tab-bar/tabbar.component.d.ts +2 -2
- app-ng-runtime/mobile/core/bundles/index.umd.js +43 -43
- app-ng-runtime/mobile/core/esm2022/core.module.mjs +3 -3
- app-ng-runtime/mobile/core/esm2022/native.xhr.mjs +1 -1
- app-ng-runtime/mobile/core/esm2022/services/device-file-cache.service.mjs +3 -3
- app-ng-runtime/mobile/core/esm2022/services/device-file-download.service.mjs +6 -7
- app-ng-runtime/mobile/core/esm2022/services/device-file-opener.service.mjs +4 -5
- app-ng-runtime/mobile/core/esm2022/services/device-file-upload.service.mjs +5 -6
- app-ng-runtime/mobile/core/esm2022/services/device-file.service.mjs +7 -8
- app-ng-runtime/mobile/core/esm2022/services/device.service.mjs +4 -5
- app-ng-runtime/mobile/core/esm2022/services/ext-app-message.service.mjs +6 -7
- app-ng-runtime/mobile/core/esm2022/services/network.service.mjs +10 -11
- app-ng-runtime/mobile/core/fesm2022/index.mjs +39 -40
- app-ng-runtime/mobile/core/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/core/services/ext-app-message.service.d.ts +1 -1
- app-ng-runtime/mobile/core/services/network.service.d.ts +1 -7
- app-ng-runtime/mobile/offline/bundles/index.umd.js +159 -176
- app-ng-runtime/mobile/offline/esm2022/models/local-db-store.mjs +21 -23
- app-ng-runtime/mobile/offline/esm2022/offline.module.mjs +3 -3
- app-ng-runtime/mobile/offline/esm2022/services/change-log.service.mjs +8 -9
- app-ng-runtime/mobile/offline/esm2022/services/local-db-data-pull.service.mjs +37 -39
- app-ng-runtime/mobile/offline/esm2022/services/local-db-management.service.mjs +47 -56
- app-ng-runtime/mobile/offline/esm2022/services/local-db.service.mjs +6 -7
- app-ng-runtime/mobile/offline/esm2022/services/local-key-value.service.mjs +2 -2
- app-ng-runtime/mobile/offline/esm2022/services/push.service.mjs +3 -3
- app-ng-runtime/mobile/offline/esm2022/services/workers/error-blocker.mjs +3 -4
- app-ng-runtime/mobile/offline/esm2022/services/workers/file-handler.mjs +13 -18
- app-ng-runtime/mobile/offline/esm2022/services/workers/id-resolver.mjs +3 -3
- app-ng-runtime/mobile/offline/esm2022/services/workers/multi-part-param-transformer.mjs +5 -9
- app-ng-runtime/mobile/offline/esm2022/utils/file-upload.utils.mjs +1 -1
- app-ng-runtime/mobile/offline/esm2022/utils/live-variable.utils.mjs +11 -12
- app-ng-runtime/mobile/offline/esm2022/utils/query-executor.utils.mjs +4 -5
- app-ng-runtime/mobile/offline/esm2022/utils/security.utils.mjs +2 -3
- app-ng-runtime/mobile/offline/esm2022/utils/utils.mjs +1 -1
- app-ng-runtime/mobile/offline/fesm2022/index.mjs +153 -171
- app-ng-runtime/mobile/offline/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/placeholder/runtime/bundles/index.umd.js +2 -3
- app-ng-runtime/mobile/placeholder/runtime/esm2022/components/app-ext.component.mjs +2 -3
- app-ng-runtime/mobile/placeholder/runtime/esm2022/mobile-runtime.module.mjs +2 -2
- app-ng-runtime/mobile/placeholder/runtime/fesm2022/index.mjs +2 -3
- app-ng-runtime/mobile/placeholder/runtime/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/placeholder/runtime-dynamic/bundles/index.umd.js +1 -1
- app-ng-runtime/mobile/placeholder/runtime-dynamic/esm2022/mobile-runtime-dynamic.module.mjs +2 -2
- app-ng-runtime/mobile/placeholder/runtime-dynamic/fesm2022/index.mjs +1 -1
- app-ng-runtime/mobile/placeholder/runtime-dynamic/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/runtime/bundles/index.umd.js +17 -21
- app-ng-runtime/mobile/runtime/esm2022/components/app-ext.component.mjs +3 -4
- app-ng-runtime/mobile/runtime/esm2022/mobile-runtime.module.mjs +4 -5
- app-ng-runtime/mobile/runtime/esm2022/services/cookie.service.mjs +3 -7
- app-ng-runtime/mobile/runtime/esm2022/services/http-interceptor.service.mjs +5 -6
- app-ng-runtime/mobile/runtime/esm2022/services/webprocess.service.mjs +3 -3
- app-ng-runtime/mobile/runtime/fesm2022/index.mjs +13 -18
- app-ng-runtime/mobile/runtime/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/runtime-dynamic/bundles/index.umd.js +5 -5
- app-ng-runtime/mobile/runtime-dynamic/esm2022/mobile-runtime-dynamic.module.mjs +2 -2
- app-ng-runtime/mobile/runtime-dynamic/esm2022/services/live-sync.service.mjs +5 -5
- app-ng-runtime/mobile/runtime-dynamic/fesm2022/index.mjs +5 -5
- app-ng-runtime/mobile/runtime-dynamic/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/mobile/variables/bundles/index.umd.js +21 -28
- app-ng-runtime/mobile/variables/esm2022/services/camera-service.mjs +5 -5
- app-ng-runtime/mobile/variables/esm2022/services/contacts-service.mjs +1 -1
- app-ng-runtime/mobile/variables/esm2022/services/datasync-service.mjs +9 -10
- app-ng-runtime/mobile/variables/esm2022/services/device-service/device-service.mjs +1 -1
- app-ng-runtime/mobile/variables/esm2022/services/device-service/location-service.mjs +1 -1
- app-ng-runtime/mobile/variables/esm2022/services/file-service.mjs +3 -11
- app-ng-runtime/mobile/variables/esm2022/services/scan-service.mjs +1 -1
- app-ng-runtime/mobile/variables/esm2022/variables.module.mjs +3 -3
- app-ng-runtime/mobile/variables/fesm2022/index.mjs +16 -24
- app-ng-runtime/mobile/variables/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/oAuth/bundles/index.umd.js +15 -15
- app-ng-runtime/oAuth/esm2022/oAuth.module.mjs +2 -2
- app-ng-runtime/oAuth/esm2022/oAuth.service.mjs +5 -6
- app-ng-runtime/oAuth/esm2022/oAuth.utils.mjs +7 -8
- app-ng-runtime/oAuth/fesm2022/index.mjs +11 -12
- app-ng-runtime/oAuth/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/package.json +1 -1
- app-ng-runtime/runtime/base/bundles/index.umd.js +243 -259
- app-ng-runtime/runtime/base/components/app-component/app.component.d.ts +1 -3
- app-ng-runtime/runtime/base/directives/accessroles.directive.d.ts +3 -4
- app-ng-runtime/runtime/base/esm2022/components/app-component/app.component.mjs +30 -34
- app-ng-runtime/runtime/base/esm2022/components/app-spinner.component.mjs +8 -9
- app-ng-runtime/runtime/base/esm2022/components/base-layout.component.mjs +4 -5
- app-ng-runtime/runtime/base/esm2022/components/base-page.component.mjs +15 -16
- app-ng-runtime/runtime/base/esm2022/components/base-partial.component.mjs +14 -15
- app-ng-runtime/runtime/base/esm2022/components/base-prefab.component.mjs +16 -17
- app-ng-runtime/runtime/base/esm2022/components/base-spa-page.component.mjs +15 -16
- app-ng-runtime/runtime/base/esm2022/components/custom-toaster.component.mjs +15 -17
- app-ng-runtime/runtime/base/esm2022/components/empty-component/empty-page.component.mjs +3 -4
- app-ng-runtime/runtime/base/esm2022/components/prefab-preview.component.mjs +3 -4
- app-ng-runtime/runtime/base/esm2022/directives/accessroles.directive.mjs +16 -24
- app-ng-runtime/runtime/base/esm2022/directives/prefab.directive.mjs +4 -4
- app-ng-runtime/runtime/base/esm2022/guards/auth.guard.mjs +3 -3
- app-ng-runtime/runtime/base/esm2022/guards/can-deactivate-page.guard.mjs +3 -3
- app-ng-runtime/runtime/base/esm2022/guards/page-not-found.guard.mjs +3 -3
- app-ng-runtime/runtime/base/esm2022/guards/role.guard.mjs +4 -5
- app-ng-runtime/runtime/base/esm2022/overrides/wm_dom_renderer.mjs +4 -4
- app-ng-runtime/runtime/base/esm2022/overrides/wm_shared_styles_host.mjs +5 -5
- app-ng-runtime/runtime/base/esm2022/resolves/app-extension.resolve.mjs +3 -3
- app-ng-runtime/runtime/base/esm2022/resolves/app-js.resolve.mjs +3 -3
- app-ng-runtime/runtime/base/esm2022/resolves/app-variables.resolve.mjs +3 -3
- app-ng-runtime/runtime/base/esm2022/resolves/i18n.resolve.mjs +3 -3
- app-ng-runtime/runtime/base/esm2022/resolves/metadata.resolve.mjs +3 -3
- app-ng-runtime/runtime/base/esm2022/resolves/security-config.resolve.mjs +3 -3
- app-ng-runtime/runtime/base/esm2022/runtime-base.module.mjs +3 -3
- app-ng-runtime/runtime/base/esm2022/services/app-defaults.service.mjs +3 -3
- app-ng-runtime/runtime/base/esm2022/services/app.manager.service.mjs +16 -19
- app-ng-runtime/runtime/base/esm2022/services/app.service.mjs +8 -9
- app-ng-runtime/runtime/base/esm2022/services/dynamic-component-ref-provider.service.mjs +4 -5
- app-ng-runtime/runtime/base/esm2022/services/http-interceptor.services.mjs +5 -6
- app-ng-runtime/runtime/base/esm2022/services/i18n.service.mjs +13 -15
- app-ng-runtime/runtime/base/esm2022/services/navigation.service.mjs +9 -10
- app-ng-runtime/runtime/base/esm2022/services/pipe-provider.service.mjs +3 -3
- app-ng-runtime/runtime/base/esm2022/services/pipe.service.mjs +3 -3
- app-ng-runtime/runtime/base/esm2022/services/prefab-manager.service.mjs +4 -5
- app-ng-runtime/runtime/base/esm2022/services/spinner.service.mjs +8 -9
- app-ng-runtime/runtime/base/esm2022/services/toaster.service.mjs +7 -8
- app-ng-runtime/runtime/base/esm2022/util/fragment-monitor.mjs +3 -3
- app-ng-runtime/runtime/base/esm2022/util/wm-route-reuse-strategy.mjs +8 -7
- app-ng-runtime/runtime/base/fesm2022/index.mjs +252 -269
- app-ng-runtime/runtime/base/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/runtime/base/overrides/wm_dom_renderer.d.ts +2 -2
- app-ng-runtime/runtime/base/services/i18n.service.d.ts +1 -1
- app-ng-runtime/runtime/dynamic/bundles/index.umd.js +21 -22
- app-ng-runtime/runtime/dynamic/esm2022/app/app.module.mjs +1 -1
- app-ng-runtime/runtime/dynamic/esm2022/app/components/page-wrapper.component.mjs +3 -4
- app-ng-runtime/runtime/dynamic/esm2022/app/services/app-extension.service.mjs +3 -3
- app-ng-runtime/runtime/dynamic/esm2022/app/services/app-js-provider.service.mjs +3 -3
- app-ng-runtime/runtime/dynamic/esm2022/app/services/app-resource-manager.service.mjs +3 -3
- app-ng-runtime/runtime/dynamic/esm2022/app/services/app-variables-provider.service.mjs +3 -3
- app-ng-runtime/runtime/dynamic/esm2022/app/services/component-ref-provider.service.mjs +5 -6
- app-ng-runtime/runtime/dynamic/esm2022/app/services/prefab-config-provider.service.mjs +3 -3
- app-ng-runtime/runtime/dynamic/esm2022/main.mjs +2 -3
- app-ng-runtime/runtime/dynamic/fesm2022/index.mjs +19 -21
- app-ng-runtime/runtime/dynamic/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/scripts/datatable/datatable.js +2 -3
- app-ng-runtime/scripts/jquery-ui/ui/widgets/droppable.js +7 -7
- app-ng-runtime/scripts/jquery-ui/ui/widgets/resizable.js +10 -13
- app-ng-runtime/scripts/jquery-ui/ui/widgets/sortable.js +7 -7
- app-ng-runtime/security/bundles/index.umd.js +17 -17
- app-ng-runtime/security/esm2022/security.module.mjs +2 -2
- app-ng-runtime/security/esm2022/security.service.mjs +13 -14
- app-ng-runtime/security/fesm2022/index.mjs +13 -14
- app-ng-runtime/security/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/security/security.service.d.ts +1 -1
- app-ng-runtime/swipey/esm2022/swipe.animation.mjs +1 -1
- app-ng-runtime/swipey/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/transpiler/bundles/index.umd.js +9 -10
- app-ng-runtime/transpiler/esm2022/build.mjs +6 -8
- app-ng-runtime/transpiler/fesm2022/index.mjs +5 -7
- app-ng-runtime/transpiler/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/variables/bundles/index.umd.js +150 -160
- app-ng-runtime/variables/esm2022/factory/variable.factory.mjs +1 -1
- app-ng-runtime/variables/esm2022/manager/action/login-action.manager.mjs +14 -15
- app-ng-runtime/variables/esm2022/manager/action/logout-action.manager.mjs +1 -1
- app-ng-runtime/variables/esm2022/manager/action/notification-action.manager.mjs +8 -9
- app-ng-runtime/variables/esm2022/manager/variable/base-variable.manager.mjs +2 -3
- app-ng-runtime/variables/esm2022/manager/variable/device-variable-manager.mjs +1 -1
- app-ng-runtime/variables/esm2022/manager/variable/device-variable-service.mjs +1 -1
- app-ng-runtime/variables/esm2022/manager/variable/web-socket-variable.manager.mjs +10 -11
- app-ng-runtime/variables/esm2022/model/action/notification-action.mjs +1 -1
- app-ng-runtime/variables/esm2022/service/metadata-service/metadata.service.mjs +3 -3
- app-ng-runtime/variables/esm2022/service/variables.service.mjs +8 -9
- app-ng-runtime/variables/esm2022/util/action/navigation-action.utils.mjs +4 -4
- app-ng-runtime/variables/esm2022/util/variable/pagination.utils.mjs +23 -30
- app-ng-runtime/variables/esm2022/util/variable/service-variable.utils.mjs +28 -29
- app-ng-runtime/variables/esm2022/util/variable/variables.utils.mjs +70 -75
- app-ng-runtime/variables/esm2022/variables.module.mjs +2 -2
- app-ng-runtime/variables/fesm2022/index.mjs +163 -174
- app-ng-runtime/variables/fesm2022/index.mjs.map +1 -1
- app-ng-runtime/variables/util/variable/service-variable.utils.d.ts +1 -1
- app-ng-runtime/build-task/.npmignore +0 -2
- app-ng-runtime/components/advanced/carousel/.npmignore +0 -2
- app-ng-runtime/components/advanced/login/.npmignore +0 -2
- app-ng-runtime/components/advanced/marquee/.npmignore +0 -2
- app-ng-runtime/components/base/.npmignore +0 -2
- app-ng-runtime/components/basic/default/.npmignore +0 -2
- app-ng-runtime/components/basic/progress/.npmignore +0 -2
- app-ng-runtime/components/basic/rich-text-editor/.npmignore +0 -2
- app-ng-runtime/components/basic/search/.npmignore +0 -2
- app-ng-runtime/components/basic/tree/.npmignore +0 -2
- app-ng-runtime/components/chart/.npmignore +0 -2
- app-ng-runtime/components/containers/accordion/.npmignore +0 -2
- app-ng-runtime/components/containers/layout-grid/.npmignore +0 -2
- app-ng-runtime/components/containers/linear-layout/.npmignore +0 -2
- app-ng-runtime/components/containers/panel/.npmignore +0 -2
- app-ng-runtime/components/containers/tabs/.npmignore +0 -2
- app-ng-runtime/components/containers/tile/.npmignore +0 -2
- app-ng-runtime/components/containers/wizard/.npmignore +0 -2
- app-ng-runtime/components/data/card/.npmignore +0 -2
- app-ng-runtime/components/data/form/.npmignore +0 -2
- app-ng-runtime/components/data/list/.npmignore +0 -2
- app-ng-runtime/components/data/live-table/.npmignore +0 -2
- app-ng-runtime/components/data/pagination/.npmignore +0 -2
- app-ng-runtime/components/data/table/.npmignore +0 -2
- app-ng-runtime/components/dialogs/alert-dialog/.npmignore +0 -2
- app-ng-runtime/components/dialogs/confirm-dialog/.npmignore +0 -2
- app-ng-runtime/components/dialogs/default/.npmignore +0 -2
- app-ng-runtime/components/dialogs/design-dialog/.npmignore +0 -2
- app-ng-runtime/components/dialogs/iframe-dialog/.npmignore +0 -2
- app-ng-runtime/components/dialogs/login-dialog/.npmignore +0 -2
- app-ng-runtime/components/dialogs/partial-dialog/.npmignore +0 -2
- app-ng-runtime/components/input/calendar/.npmignore +0 -2
- app-ng-runtime/components/input/chips/.npmignore +0 -2
- app-ng-runtime/components/input/color-picker/.npmignore +0 -2
- app-ng-runtime/components/input/currency/.npmignore +0 -2
- app-ng-runtime/components/input/default/.npmignore +0 -2
- app-ng-runtime/components/input/epoch/.npmignore +0 -2
- app-ng-runtime/components/input/file-upload/.npmignore +0 -2
- app-ng-runtime/components/input/rating/.npmignore +0 -2
- app-ng-runtime/components/input/slider/.npmignore +0 -2
- app-ng-runtime/components/navigation/breadcrumb/.npmignore +0 -2
- app-ng-runtime/components/navigation/menu/.npmignore +0 -2
- app-ng-runtime/components/navigation/navbar/.npmignore +0 -2
- app-ng-runtime/components/navigation/popover/.npmignore +0 -2
- app-ng-runtime/components/page/default/.npmignore +0 -2
- app-ng-runtime/components/page/footer/.npmignore +0 -2
- app-ng-runtime/components/page/header/.npmignore +0 -2
- app-ng-runtime/components/page/left-panel/.npmignore +0 -2
- app-ng-runtime/components/page/right-panel/.npmignore +0 -2
- app-ng-runtime/components/page/top-nav/.npmignore +0 -2
- app-ng-runtime/components/prefab/.npmignore +0 -2
- app-ng-runtime/core/.npmignore +0 -2
- app-ng-runtime/core/esm2022/services/custom-icons-loader.service.mjs +0 -26
- app-ng-runtime/core/services/custom-icons-loader.service.d.ts +0 -7
- app-ng-runtime/http/.npmignore +0 -2
- app-ng-runtime/mobile/components/basic/default/.npmignore +0 -2
- app-ng-runtime/mobile/components/basic/search/.npmignore +0 -2
- app-ng-runtime/mobile/components/containers/segmented-control/.npmignore +0 -2
- app-ng-runtime/mobile/components/data/media-list/.npmignore +0 -2
- app-ng-runtime/mobile/components/device/barcode-scanner/.npmignore +0 -2
- app-ng-runtime/mobile/components/device/camera/.npmignore +0 -2
- app-ng-runtime/mobile/components/input/file-upload/.npmignore +0 -2
- app-ng-runtime/mobile/components/page/default/.npmignore +0 -2
- app-ng-runtime/mobile/components/page/left-panel/.npmignore +0 -2
- app-ng-runtime/mobile/components/page/mobile-navbar/.npmignore +0 -2
- app-ng-runtime/mobile/components/page/tab-bar/.npmignore +0 -2
- app-ng-runtime/mobile/core/.npmignore +0 -2
- app-ng-runtime/mobile/offline/.npmignore +0 -2
- app-ng-runtime/mobile/placeholder/runtime/.npmignore +0 -2
- app-ng-runtime/mobile/placeholder/runtime-dynamic/.npmignore +0 -2
- app-ng-runtime/mobile/runtime/.npmignore +0 -2
- app-ng-runtime/mobile/runtime-dynamic/.npmignore +0 -2
- app-ng-runtime/mobile/variables/.npmignore +0 -2
- app-ng-runtime/oAuth/.npmignore +0 -2
- app-ng-runtime/runtime/base/.npmignore +0 -2
- app-ng-runtime/runtime/dynamic/.npmignore +0 -2
- app-ng-runtime/security/.npmignore +0 -2
- app-ng-runtime/swipey/.npmignore +0 -2
- app-ng-runtime/transpiler/.npmignore +0 -2
- app-ng-runtime/variables/.npmignore +0 -2
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import { Attribute, ChangeDetectorRef, Component, ContentChild, ContentChildren,
|
|
2
|
-
import { $appDigest, $invokeWatchers, App, AppDefaults, DataSource, getClonedObject, isDataSourceEqual, isDefined, isMobile, isMobileApp, isObject, noop, switchClass, StatePersistence, PaginationService, setListClass, generateGUId } from '@wm/core';
|
|
1
|
+
import { Attribute, ChangeDetectorRef, Component, ContentChild, ContentChildren, Injector, NgZone, QueryList, TemplateRef, ViewChild, ViewChildren } from '@angular/core';
|
|
2
|
+
import { $appDigest, $invokeWatchers, App, AppDefaults, DataSource, getClonedObject, isDataSourceEqual, isDefined, isMobile, isMobileApp, isNumber, isObject, noop, switchClass, StatePersistence, PaginationService, setListClass, generateGUId } from '@wm/core';
|
|
3
3
|
import { APPLY_STYLES_TYPE, configureDnD, DEBOUNCE_TIMES, getOrderedDataset, groupData, handleHeaderClick, NAVIGATION_TYPE, unsupportedStatePersistenceTypes, provideAsWidgetRef, StylableComponent, styler, ToDatePipe, toggleAllHeaders, extractDataSourceName } from '@wm/components/base';
|
|
4
4
|
import { PaginationComponent } from '@wm/components/data/pagination';
|
|
5
5
|
import { ButtonComponent } from '@wm/components/input';
|
|
6
6
|
import { registerProps } from './list.props';
|
|
7
7
|
import { ListItemDirective } from './list-item.directive';
|
|
8
8
|
import { ListAnimator } from './list.animator';
|
|
9
|
-
import { clone, cloneDeep, forEach, get, has, includes, isArray, isEmpty, isEqual, isNumber, isString, isUndefined, last, max, min, pullAllWith, pullAt, remove, some, toNumber } from "lodash-es";
|
|
10
9
|
import * as i0 from "@angular/core";
|
|
11
10
|
import * as i1 from "@wm/components/base";
|
|
12
11
|
import * as i2 from "@wm/core";
|
|
@@ -14,32 +13,30 @@ const _c0 = ["listTemplate"];
|
|
|
14
13
|
const _c1 = ["listLeftActionTemplate"];
|
|
15
14
|
const _c2 = ["listRightActionTemplate"];
|
|
16
15
|
const _c3 = ["wmList", ""];
|
|
17
|
-
const _c4 = a0 => ({ "disabled": a0 });
|
|
18
|
-
const _c5 = (a0, a1, a2, a3, a4, a5) => ({ item: a0, $index: a1, itemRef: a2, $first: a3, $last: a4, currentItemWidgets: a5 });
|
|
19
|
-
const _c6 = a0 => ({ "collapsible-content": a0 });
|
|
20
16
|
function ListComponent_div_0_Template(rf, ctx) { if (rf & 1) {
|
|
21
|
-
i0.ɵɵelementStart(0, "div",
|
|
22
|
-
i0.ɵɵelement(3, "i",
|
|
17
|
+
i0.ɵɵelementStart(0, "div", 13)(1, "h3", 14)(2, "div", 15);
|
|
18
|
+
i0.ɵɵelement(3, "i", 16);
|
|
23
19
|
i0.ɵɵelementEnd();
|
|
24
|
-
i0.ɵɵelementStart(4, "div",
|
|
25
|
-
i0.ɵɵelement(5, "div",
|
|
20
|
+
i0.ɵɵelementStart(4, "div", 15);
|
|
21
|
+
i0.ɵɵelement(5, "div", 17)(6, "div", 18);
|
|
26
22
|
i0.ɵɵelementEnd()()();
|
|
27
23
|
} if (rf & 2) {
|
|
28
|
-
const
|
|
24
|
+
const ctx_r0 = i0.ɵɵnextContext();
|
|
29
25
|
i0.ɵɵadvance(3);
|
|
30
|
-
i0.ɵɵclassMapInterpolate1("app-icon panel-icon ",
|
|
31
|
-
i0.ɵɵproperty("hidden", !
|
|
26
|
+
i0.ɵɵclassMapInterpolate1("app-icon panel-icon ", ctx_r0.iconclass, "");
|
|
27
|
+
i0.ɵɵproperty("hidden", !ctx_r0.iconclass);
|
|
32
28
|
i0.ɵɵadvance(2);
|
|
33
|
-
i0.ɵɵproperty("innerHTML",
|
|
34
|
-
i0.ɵɵadvance();
|
|
35
|
-
i0.ɵɵproperty("innerHTML",
|
|
29
|
+
i0.ɵɵproperty("innerHTML", ctx_r0.title, i0.ɵɵsanitizeHtml);
|
|
30
|
+
i0.ɵɵadvance(1);
|
|
31
|
+
i0.ɵɵproperty("innerHTML", ctx_r0.subheading, i0.ɵɵsanitizeHtml);
|
|
36
32
|
} }
|
|
33
|
+
const _c4 = function (a0) { return { "disabled": a0 }; };
|
|
37
34
|
function ListComponent_div_1_Template(rf, ctx) { if (rf & 1) {
|
|
38
|
-
const
|
|
39
|
-
i0.ɵɵelementStart(0, "div",
|
|
40
|
-
i0.ɵɵlistener("click", function ListComponent_div_1_Template_a_click_3_listener($event) { i0.ɵɵrestoreView(
|
|
41
|
-
i0.ɵɵelement(4, "i",
|
|
42
|
-
i0.ɵɵelementStart(5, "span",
|
|
35
|
+
const _r13 = i0.ɵɵgetCurrentView();
|
|
36
|
+
i0.ɵɵelementStart(0, "div", 19)(1, "ul", 20)(2, "li", 21)(3, "a", 22);
|
|
37
|
+
i0.ɵɵlistener("click", function ListComponent_div_1_Template_a_click_3_listener($event) { i0.ɵɵrestoreView(_r13); const ctx_r12 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r12.dataNavigator.navigatePage("prev", $event)); });
|
|
38
|
+
i0.ɵɵelement(4, "i", 23);
|
|
39
|
+
i0.ɵɵelementStart(5, "span", 24);
|
|
43
40
|
i0.ɵɵtext(6);
|
|
44
41
|
i0.ɵɵelementEnd()()()()();
|
|
45
42
|
} if (rf & 2) {
|
|
@@ -47,107 +44,108 @@ function ListComponent_div_1_Template(rf, ctx) { if (rf & 1) {
|
|
|
47
44
|
i0.ɵɵattribute("aria-disabled", ctx_r1.dataNavigator.isDisablePrevious);
|
|
48
45
|
i0.ɵɵadvance(2);
|
|
49
46
|
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(4, _c4, ctx_r1.dataNavigator ? ctx_r1.dataNavigator.isDisablePrevious : true));
|
|
50
|
-
i0.ɵɵadvance();
|
|
47
|
+
i0.ɵɵadvance(1);
|
|
51
48
|
i0.ɵɵattribute("aria-disabled", ctx_r1.dataNavigator.isDisablePrevious);
|
|
52
49
|
i0.ɵɵadvance(3);
|
|
53
50
|
i0.ɵɵtextInterpolate1("Go to Previous page ", ctx_r1.dataNavigator.isDisablePrevious ? ", Disabled" : "", "");
|
|
54
51
|
} }
|
|
55
52
|
function ListComponent_div_2_Template(rf, ctx) { if (rf & 1) {
|
|
56
|
-
i0.ɵɵelementStart(0, "div",
|
|
53
|
+
i0.ɵɵelementStart(0, "div", 25);
|
|
57
54
|
i0.ɵɵtext(1);
|
|
58
55
|
i0.ɵɵelementEnd();
|
|
59
56
|
} if (rf & 2) {
|
|
60
|
-
const
|
|
61
|
-
i0.ɵɵadvance();
|
|
62
|
-
i0.ɵɵtextInterpolate1(" ", "Page " +
|
|
57
|
+
const ctx_r2 = i0.ɵɵnextContext();
|
|
58
|
+
i0.ɵɵadvance(1);
|
|
59
|
+
i0.ɵɵtextInterpolate1(" ", "Page " + ctx_r2.dataNavigator.dn.currentPage + " of " + ctx_r2.dataNavigator.pageCount, "");
|
|
63
60
|
} }
|
|
64
61
|
function ListComponent_div_4_Template(rf, ctx) { if (rf & 1) {
|
|
65
|
-
i0.ɵɵelementStart(0, "div",
|
|
62
|
+
i0.ɵɵelementStart(0, "div", 26);
|
|
66
63
|
i0.ɵɵtext(1, " Press space bar to toggle drag drop mode, use arrow keys to move selected elements. ");
|
|
67
64
|
i0.ɵɵelementEnd();
|
|
68
65
|
} if (rf & 2) {
|
|
69
|
-
const
|
|
70
|
-
i0.ɵɵpropertyInterpolate("id",
|
|
66
|
+
const ctx_r3 = i0.ɵɵnextContext();
|
|
67
|
+
i0.ɵɵpropertyInterpolate("id", ctx_r3.titleId);
|
|
71
68
|
} }
|
|
72
69
|
function ListComponent_div_5_Template(rf, ctx) { if (rf & 1) {
|
|
73
|
-
i0.ɵɵelementStart(0, "div",
|
|
70
|
+
i0.ɵɵelementStart(0, "div", 27);
|
|
74
71
|
i0.ɵɵtext(1);
|
|
75
72
|
i0.ɵɵelementEnd();
|
|
76
73
|
} if (rf & 2) {
|
|
77
|
-
const
|
|
78
|
-
i0.ɵɵadvance();
|
|
79
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
74
|
+
const ctx_r4 = i0.ɵɵnextContext();
|
|
75
|
+
i0.ɵɵadvance(1);
|
|
76
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r4.ariaText + ctx_r4.currentIndex + " of " + ctx_r4.listItems.length, " ");
|
|
80
77
|
} }
|
|
78
|
+
const _c5 = function (a0, a1, a2, a3, a4, a5) { return { item: a0, $index: a1, itemRef: a2, $first: a3, $last: a4, currentItemWidgets: a5 }; };
|
|
81
79
|
function ListComponent_ng_template_7_li_0_Template(rf, ctx) { if (rf & 1) {
|
|
82
|
-
i0.ɵɵelementStart(0, "li",
|
|
80
|
+
i0.ɵɵelementStart(0, "li", 29, 30);
|
|
83
81
|
i0.ɵɵelementContainer(2, 31);
|
|
84
82
|
i0.ɵɵelementEnd();
|
|
85
83
|
} if (rf & 2) {
|
|
86
|
-
const
|
|
87
|
-
const $
|
|
88
|
-
const $
|
|
89
|
-
const $
|
|
90
|
-
const
|
|
91
|
-
const
|
|
92
|
-
i0.ɵɵclassMapInterpolate1("app-list-item ",
|
|
93
|
-
i0.ɵɵproperty("ngClass",
|
|
94
|
-
i0.ɵɵattribute("tabindex",
|
|
84
|
+
const item_r15 = ctx.$implicit;
|
|
85
|
+
const $index_r16 = ctx.index;
|
|
86
|
+
const $first_r17 = ctx.first;
|
|
87
|
+
const $last_r18 = ctx.last;
|
|
88
|
+
const _r19 = i0.ɵɵreference(1);
|
|
89
|
+
const ctx_r14 = i0.ɵɵnextContext(2);
|
|
90
|
+
i0.ɵɵclassMapInterpolate1("app-list-item ", ctx_r14.direction === "horizontal" ? "" : ctx_r14.itemsPerRowClass, "");
|
|
91
|
+
i0.ɵɵproperty("ngClass", _r19.itemClass)("wmListItem", item_r15);
|
|
92
|
+
i0.ɵɵattribute("tabindex", ctx_r14.tabindex);
|
|
95
93
|
i0.ɵɵadvance(2);
|
|
96
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
94
|
+
i0.ɵɵproperty("ngTemplateOutlet", ctx_r14.listTemplate)("ngTemplateOutletContext", i0.ɵɵpureFunction6(8, _c5, item_r15, $index_r16, _r19, $first_r17, $last_r18, _r19.currentItemWidgets));
|
|
97
95
|
} }
|
|
98
96
|
function ListComponent_ng_template_7_Template(rf, ctx) { if (rf & 1) {
|
|
99
|
-
i0.ɵɵtemplate(0, ListComponent_ng_template_7_li_0_Template, 3,
|
|
97
|
+
i0.ɵɵtemplate(0, ListComponent_ng_template_7_li_0_Template, 3, 15, "li", 28);
|
|
100
98
|
} if (rf & 2) {
|
|
101
|
-
const
|
|
102
|
-
i0.ɵɵproperty("ngForOf",
|
|
99
|
+
const ctx_r5 = i0.ɵɵnextContext();
|
|
100
|
+
i0.ɵɵproperty("ngForOf", ctx_r5.fieldDefs);
|
|
103
101
|
} }
|
|
104
102
|
function ListComponent_div_10_Template(rf, ctx) { if (rf & 1) {
|
|
105
103
|
i0.ɵɵelement(0, "div", 32);
|
|
106
104
|
} if (rf & 2) {
|
|
107
|
-
const
|
|
108
|
-
i0.ɵɵproperty("textContent",
|
|
105
|
+
const ctx_r6 = i0.ɵɵnextContext();
|
|
106
|
+
i0.ɵɵproperty("textContent", ctx_r6.nodatamessage);
|
|
109
107
|
} }
|
|
110
108
|
function ListComponent_div_11_Template(rf, ctx) { if (rf & 1) {
|
|
111
109
|
i0.ɵɵelementStart(0, "div", 33)(1, "span");
|
|
112
110
|
i0.ɵɵelement(2, "i", 34);
|
|
113
|
-
i0.ɵɵelementStart(3, "span",
|
|
111
|
+
i0.ɵɵelementStart(3, "span", 24);
|
|
114
112
|
i0.ɵɵtext(4, "Loading");
|
|
115
113
|
i0.ɵɵelementEnd();
|
|
116
114
|
i0.ɵɵelement(5, "span", 35);
|
|
117
115
|
i0.ɵɵelementEnd()();
|
|
118
116
|
} if (rf & 2) {
|
|
119
|
-
const
|
|
117
|
+
const ctx_r7 = i0.ɵɵnextContext();
|
|
120
118
|
i0.ɵɵadvance(2);
|
|
121
|
-
i0.ɵɵproperty("ngClass",
|
|
119
|
+
i0.ɵɵproperty("ngClass", ctx_r7.loadingicon);
|
|
122
120
|
i0.ɵɵadvance(3);
|
|
123
|
-
i0.ɵɵproperty("textContent",
|
|
121
|
+
i0.ɵɵproperty("textContent", ctx_r7.loadingdatamsg);
|
|
124
122
|
} }
|
|
125
123
|
function ListComponent_div_12_Template(rf, ctx) { if (rf & 1) {
|
|
126
|
-
const
|
|
127
|
-
i0.ɵɵelementStart(0, "div", 36)(1, "ul",
|
|
128
|
-
i0.ɵɵlistener("click", function ListComponent_div_12_Template_a_click_3_listener($event) { i0.ɵɵrestoreView(
|
|
124
|
+
const _r21 = i0.ɵɵgetCurrentView();
|
|
125
|
+
i0.ɵɵelementStart(0, "div", 36)(1, "ul", 20)(2, "li", 37)(3, "a", 22);
|
|
126
|
+
i0.ɵɵlistener("click", function ListComponent_div_12_Template_a_click_3_listener($event) { i0.ɵɵrestoreView(_r21); const ctx_r20 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r20.dataNavigator.navigatePage("next", $event)); });
|
|
129
127
|
i0.ɵɵelement(4, "i", 38);
|
|
130
|
-
i0.ɵɵelementStart(5, "span",
|
|
128
|
+
i0.ɵɵelementStart(5, "span", 24);
|
|
131
129
|
i0.ɵɵtext(6);
|
|
132
130
|
i0.ɵɵelementEnd()()()()();
|
|
133
131
|
} if (rf & 2) {
|
|
134
|
-
const
|
|
135
|
-
i0.ɵɵattribute("aria-disabled",
|
|
132
|
+
const ctx_r8 = i0.ɵɵnextContext();
|
|
133
|
+
i0.ɵɵattribute("aria-disabled", ctx_r8.dataNavigator.isDisableNext);
|
|
136
134
|
i0.ɵɵadvance(2);
|
|
137
|
-
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(4, _c4,
|
|
138
|
-
i0.ɵɵadvance();
|
|
139
|
-
i0.ɵɵattribute("aria-disabled",
|
|
135
|
+
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(4, _c4, ctx_r8.dataNavigator ? ctx_r8.dataNavigator.isDisableNext : true));
|
|
136
|
+
i0.ɵɵadvance(1);
|
|
137
|
+
i0.ɵɵattribute("aria-disabled", ctx_r8.dataNavigator.isDisableNext);
|
|
140
138
|
i0.ɵɵadvance(3);
|
|
141
|
-
i0.ɵɵtextInterpolate1("Go to Next page ",
|
|
139
|
+
i0.ɵɵtextInterpolate1("Go to Next page ", ctx_r8.dataNavigator.isDisableNext ? ", Disabled" : "", "");
|
|
142
140
|
} }
|
|
143
141
|
function ListComponent_div_13_a_2_Template(rf, ctx) { if (rf & 1) {
|
|
144
|
-
const
|
|
142
|
+
const _r24 = i0.ɵɵgetCurrentView();
|
|
145
143
|
i0.ɵɵelementStart(0, "a", 42);
|
|
146
|
-
i0.ɵɵlistener("click", function ListComponent_div_13_a_2_Template_a_click_0_listener($event) { i0.ɵɵrestoreView(
|
|
144
|
+
i0.ɵɵlistener("click", function ListComponent_div_13_a_2_Template_a_click_0_listener($event) { i0.ɵɵrestoreView(_r24); const ctx_r23 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r23.dataNavigator.navigatePage("next", $event)); });
|
|
147
145
|
i0.ɵɵelementEnd();
|
|
148
146
|
} if (rf & 2) {
|
|
149
|
-
const
|
|
150
|
-
i0.ɵɵproperty("ngClass",
|
|
147
|
+
const ctx_r22 = i0.ɵɵnextContext(2);
|
|
148
|
+
i0.ɵɵproperty("ngClass", ctx_r22.paginationclass)("textContent", ctx_r22.ondemandmessage);
|
|
151
149
|
} }
|
|
152
150
|
function ListComponent_div_13_Template(rf, ctx) { if (rf & 1) {
|
|
153
151
|
i0.ɵɵelementStart(0, "div", 39);
|
|
@@ -155,10 +153,10 @@ function ListComponent_div_13_Template(rf, ctx) { if (rf & 1) {
|
|
|
155
153
|
i0.ɵɵtemplate(2, ListComponent_div_13_a_2_Template, 1, 2, "a", 41);
|
|
156
154
|
i0.ɵɵelementEnd();
|
|
157
155
|
} if (rf & 2) {
|
|
158
|
-
const
|
|
159
|
-
i0.ɵɵproperty("hidden", !
|
|
156
|
+
const ctx_r9 = i0.ɵɵnextContext();
|
|
157
|
+
i0.ɵɵproperty("hidden", !ctx_r9.showNavigation || ctx_r9.onDemandLoad && ctx_r9.dataNavigator.isDisableNext || ctx_r9.dataNavigator.dataSize <= ctx_r9.pagesize || !ctx_r9.dataNavigator.dataSize && !(ctx_r9.dataNavigator.datasource == null ? null : ctx_r9.dataNavigator.datasource.pagination == null ? null : ctx_r9.dataNavigator.datasource.pagination.next));
|
|
160
158
|
i0.ɵɵadvance(2);
|
|
161
|
-
i0.ɵɵproperty("ngIf",
|
|
159
|
+
i0.ɵɵproperty("ngIf", ctx_r9.onDemandLoad);
|
|
162
160
|
} }
|
|
163
161
|
function ListComponent_ng_template_14_li_0_i_6_Template(rf, ctx) { if (rf & 1) {
|
|
164
162
|
i0.ɵɵelement(0, "i", 51);
|
|
@@ -168,73 +166,138 @@ function ListComponent_ng_template_14_li_0_span_7_Template(rf, ctx) { if (rf & 1
|
|
|
168
166
|
i0.ɵɵtext(1);
|
|
169
167
|
i0.ɵɵelementEnd();
|
|
170
168
|
} if (rf & 2) {
|
|
171
|
-
const
|
|
172
|
-
i0.ɵɵadvance();
|
|
173
|
-
i0.ɵɵtextInterpolate(
|
|
169
|
+
const groupObj_r26 = i0.ɵɵnextContext().$implicit;
|
|
170
|
+
i0.ɵɵadvance(1);
|
|
171
|
+
i0.ɵɵtextInterpolate(groupObj_r26.data.length);
|
|
174
172
|
} }
|
|
175
173
|
function ListComponent_ng_template_14_li_0_li_9_Template(rf, ctx) { if (rf & 1) {
|
|
176
|
-
i0.ɵɵelementStart(0, "li", 53,
|
|
174
|
+
i0.ɵɵelementStart(0, "li", 53, 30);
|
|
177
175
|
i0.ɵɵelementContainer(2, 31);
|
|
178
176
|
i0.ɵɵelementEnd();
|
|
179
177
|
} if (rf & 2) {
|
|
180
|
-
const
|
|
181
|
-
const $
|
|
182
|
-
const $
|
|
183
|
-
const $
|
|
184
|
-
const
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
i0.ɵɵ
|
|
188
|
-
i0.ɵɵ
|
|
189
|
-
i0.ɵɵattribute("tabindex", ctx_r1.tabindex);
|
|
178
|
+
const item_r31 = ctx.$implicit;
|
|
179
|
+
const $index_r32 = ctx.index;
|
|
180
|
+
const $first_r33 = ctx.first;
|
|
181
|
+
const $last_r34 = ctx.last;
|
|
182
|
+
const _r35 = i0.ɵɵreference(1);
|
|
183
|
+
const ctx_r29 = i0.ɵɵnextContext(3);
|
|
184
|
+
i0.ɵɵclassMapInterpolate1("app-list-item group-list-item ", ctx_r29.itemsPerRowClass, "");
|
|
185
|
+
i0.ɵɵproperty("ngClass", _r35.itemClass)("wmListItem", item_r31);
|
|
186
|
+
i0.ɵɵattribute("tabindex", ctx_r29.tabindex);
|
|
190
187
|
i0.ɵɵadvance(2);
|
|
191
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
188
|
+
i0.ɵɵproperty("ngTemplateOutlet", ctx_r29.listTemplate)("ngTemplateOutletContext", i0.ɵɵpureFunction6(8, _c5, item_r31, $index_r32, _r35, $first_r33, $last_r34, _r35.currentItemWidgets));
|
|
192
189
|
} }
|
|
190
|
+
const _c6 = function (a0) { return { "collapsible-content": a0 }; };
|
|
193
191
|
function ListComponent_ng_template_14_li_0_Template(rf, ctx) { if (rf & 1) {
|
|
194
|
-
const
|
|
192
|
+
const _r37 = i0.ɵɵgetCurrentView();
|
|
195
193
|
i0.ɵɵelementStart(0, "li", 44)(1, "ul", 45)(2, "li", 46);
|
|
196
|
-
i0.ɵɵlistener("click", function ListComponent_ng_template_14_li_0_Template_li_click_2_listener($event) { i0.ɵɵrestoreView(
|
|
194
|
+
i0.ɵɵlistener("click", function ListComponent_ng_template_14_li_0_Template_li_click_2_listener($event) { i0.ɵɵrestoreView(_r37); const ctx_r36 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r36.handleHeaderClick($event)); });
|
|
197
195
|
i0.ɵɵelementStart(3, "h4");
|
|
198
196
|
i0.ɵɵtext(4);
|
|
199
197
|
i0.ɵɵelementStart(5, "div", 47);
|
|
200
|
-
i0.ɵɵtemplate(6, ListComponent_ng_template_14_li_0_i_6_Template, 1, 0, "i", 48)
|
|
198
|
+
i0.ɵɵtemplate(6, ListComponent_ng_template_14_li_0_i_6_Template, 1, 0, "i", 48);
|
|
199
|
+
i0.ɵɵtemplate(7, ListComponent_ng_template_14_li_0_span_7_Template, 2, 1, "span", 49);
|
|
201
200
|
i0.ɵɵelementEnd()()();
|
|
202
201
|
i0.ɵɵelementStart(8, "ul");
|
|
203
|
-
i0.ɵɵtemplate(9, ListComponent_ng_template_14_li_0_li_9_Template, 3,
|
|
202
|
+
i0.ɵɵtemplate(9, ListComponent_ng_template_14_li_0_li_9_Template, 3, 15, "li", 50);
|
|
204
203
|
i0.ɵɵelementEnd()()();
|
|
205
204
|
} if (rf & 2) {
|
|
206
|
-
const
|
|
207
|
-
const
|
|
208
|
-
i0.ɵɵadvance();
|
|
209
|
-
i0.ɵɵproperty("ngClass",
|
|
210
|
-
i0.ɵɵattribute("tabindex",
|
|
211
|
-
i0.ɵɵadvance();
|
|
212
|
-
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(
|
|
205
|
+
const groupObj_r26 = ctx.$implicit;
|
|
206
|
+
const ctx_r25 = i0.ɵɵnextContext(2);
|
|
207
|
+
i0.ɵɵadvance(1);
|
|
208
|
+
i0.ɵɵproperty("ngClass", ctx_r25.listclass);
|
|
209
|
+
i0.ɵɵattribute("tabindex", ctx_r25.tabindex);
|
|
210
|
+
i0.ɵɵadvance(1);
|
|
211
|
+
i0.ɵɵproperty("ngClass", i0.ɵɵpureFunction1(10, _c6, ctx_r25.collapsible));
|
|
213
212
|
i0.ɵɵadvance(2);
|
|
214
|
-
i0.ɵɵtextInterpolate1("",
|
|
213
|
+
i0.ɵɵtextInterpolate1("", groupObj_r26.key, " ");
|
|
215
214
|
i0.ɵɵadvance(2);
|
|
216
|
-
i0.ɵɵproperty("ngIf",
|
|
217
|
-
i0.ɵɵadvance();
|
|
218
|
-
i0.ɵɵproperty("ngIf",
|
|
219
|
-
i0.ɵɵadvance();
|
|
220
|
-
i0.ɵɵclassMapInterpolate1("list-group clearfix ",
|
|
221
|
-
i0.ɵɵadvance();
|
|
222
|
-
i0.ɵɵproperty("ngForOf",
|
|
215
|
+
i0.ɵɵproperty("ngIf", ctx_r25.collapsible);
|
|
216
|
+
i0.ɵɵadvance(1);
|
|
217
|
+
i0.ɵɵproperty("ngIf", ctx_r25.showcount);
|
|
218
|
+
i0.ɵɵadvance(1);
|
|
219
|
+
i0.ɵɵclassMapInterpolate1("list-group clearfix ", ctx_r25.direction === "horizontal" ? "app-horizontal-list" : "", "");
|
|
220
|
+
i0.ɵɵadvance(1);
|
|
221
|
+
i0.ɵɵproperty("ngForOf", groupObj_r26.data);
|
|
223
222
|
} }
|
|
224
223
|
function ListComponent_ng_template_14_Template(rf, ctx) { if (rf & 1) {
|
|
225
|
-
i0.ɵɵtemplate(0, ListComponent_ng_template_14_li_0_Template, 10,
|
|
224
|
+
i0.ɵɵtemplate(0, ListComponent_ng_template_14_li_0_Template, 10, 12, "li", 43);
|
|
226
225
|
} if (rf & 2) {
|
|
227
|
-
const
|
|
228
|
-
i0.ɵɵproperty("ngForOf",
|
|
226
|
+
const ctx_r11 = i0.ɵɵnextContext();
|
|
227
|
+
i0.ɵɵproperty("ngForOf", ctx_r11.groupedData);
|
|
229
228
|
} }
|
|
230
229
|
const DEFAULT_CLS = 'app-livelist app-panel';
|
|
231
230
|
const WIDGET_CONFIG = { widgetType: 'wm-list', hostClass: DEFAULT_CLS };
|
|
232
231
|
export class ListComponent extends StylableComponent {
|
|
233
232
|
static { this.initializeProps = registerProps(); }
|
|
234
|
-
|
|
233
|
+
get selecteditem() {
|
|
234
|
+
if (this.multiselect) {
|
|
235
|
+
return getClonedObject(this._items);
|
|
236
|
+
}
|
|
237
|
+
if (_.isEmpty(this._items)) {
|
|
238
|
+
return {};
|
|
239
|
+
}
|
|
240
|
+
return getClonedObject(this._items[0]);
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Returns list of widgets present on list item by considering name and index of the widget.
|
|
244
|
+
* If we did'nt pass index, it returns array of all the widgets which are matching to widget name
|
|
245
|
+
* @param widgteName: Name of the widget
|
|
246
|
+
* @param index: Index of the widget
|
|
247
|
+
*/
|
|
248
|
+
getWidgets(widgteName, index) {
|
|
249
|
+
let $target;
|
|
250
|
+
const retVal = [];
|
|
251
|
+
if (!widgteName) {
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
if (!isDefined(index)) {
|
|
255
|
+
_.forEach(this.listItems.toArray(), (el) => {
|
|
256
|
+
$target = _.get(el.currentItemWidgets, widgteName);
|
|
257
|
+
if ($target) {
|
|
258
|
+
retVal.push($target);
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
return retVal;
|
|
262
|
+
}
|
|
263
|
+
index = +index || 0;
|
|
264
|
+
$target = _.get(this.listItems.toArray(), index);
|
|
265
|
+
if ($target) {
|
|
266
|
+
return [_.get($target.currentItemWidgets, widgteName)];
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// returns listitem reference by index value. This refers to the same method getListItemByIndex.
|
|
270
|
+
getItem(index) {
|
|
271
|
+
return this.getListItemByIndex(index);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Returns index of listItem(listItemDirective / listItemObject)
|
|
275
|
+
* If item is a directive, index is fetched from listItems
|
|
276
|
+
* If item is an object, index is fetched from fieldDefs
|
|
277
|
+
*/
|
|
278
|
+
getIndex(item) {
|
|
279
|
+
if (item instanceof ListItemDirective) {
|
|
280
|
+
return this.getListItemIndex(item);
|
|
281
|
+
}
|
|
282
|
+
else if (item) {
|
|
283
|
+
return this.fieldDefs.findIndex((obj) => _.isEqual(obj, item));
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
set selecteditem(items) {
|
|
287
|
+
this._items.length = 0;
|
|
288
|
+
this.deselectListItems();
|
|
289
|
+
if (_.isArray(items)) {
|
|
290
|
+
items.forEach(item => this.selectItem(item));
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
this.selectItem(items);
|
|
294
|
+
}
|
|
295
|
+
$appDigest();
|
|
296
|
+
}
|
|
297
|
+
constructor(inj, cdRef, datePipe, app, appDefaults, ngZone, binditemclass, binddisableitem, binddataset, binddatasource, mouseEnterCB, mouseLeaveCB, statePersistence, paginationService) {
|
|
235
298
|
let resolveFn = noop;
|
|
236
299
|
const propsInitPromise = new Promise(res => resolveFn = res);
|
|
237
|
-
super(inj, WIDGET_CONFIG,
|
|
300
|
+
super(inj, WIDGET_CONFIG, propsInitPromise);
|
|
238
301
|
this.propsInitPromise = propsInitPromise;
|
|
239
302
|
this.promiseResolverFn = resolveFn;
|
|
240
303
|
styler(this.nativeElement, this, APPLY_STYLES_TYPE.SHELL);
|
|
@@ -258,12 +321,12 @@ export class ListComponent extends StylableComponent {
|
|
|
258
321
|
// Updates pagination, filter, sort etc options for service and crud variables
|
|
259
322
|
this._listenerDestroyers = [
|
|
260
323
|
this.app.subscribe('check-state-persistence-options', options => {
|
|
261
|
-
let dataSourceName = get(this.datasource, 'name');
|
|
324
|
+
let dataSourceName = _.get(this.datasource, 'name');
|
|
262
325
|
// in Prefabs, this.datasource is not resolved at the time of variable invocation, so additional check is required.
|
|
263
326
|
if (!dataSourceName) {
|
|
264
327
|
dataSourceName = extractDataSourceName(this.binddatasource);
|
|
265
328
|
}
|
|
266
|
-
if (get(options, 'variable.name') !== dataSourceName) {
|
|
329
|
+
if (_.get(options, 'variable.name') !== dataSourceName) {
|
|
267
330
|
return;
|
|
268
331
|
}
|
|
269
332
|
this.handleStateParams(options);
|
|
@@ -278,69 +341,31 @@ export class ListComponent extends StylableComponent {
|
|
|
278
341
|
})
|
|
279
342
|
];
|
|
280
343
|
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
}
|
|
285
|
-
if (isEmpty(this._items)) {
|
|
286
|
-
return {};
|
|
287
|
-
}
|
|
288
|
-
return getClonedObject(this._items[0]);
|
|
289
|
-
}
|
|
290
|
-
set selecteditem(items) {
|
|
291
|
-
this._items.length = 0;
|
|
292
|
-
this.deselectListItems();
|
|
293
|
-
if (isArray(items)) {
|
|
294
|
-
items.forEach(item => this.selectItem(item));
|
|
295
|
-
}
|
|
296
|
-
else {
|
|
297
|
-
this.selectItem(items);
|
|
298
|
-
}
|
|
299
|
-
$appDigest();
|
|
344
|
+
getConfiguredState() {
|
|
345
|
+
const mode = this.statePersistence.computeMode(this.statehandler);
|
|
346
|
+
return mode && mode.toLowerCase();
|
|
300
347
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
}
|
|
313
|
-
if (!isDefined(index)) {
|
|
314
|
-
forEach(this.listItems.toArray(), (el) => {
|
|
315
|
-
$target = get(el.currentItemWidgets, widgteName);
|
|
316
|
-
if ($target) {
|
|
317
|
-
retVal.push($target);
|
|
318
|
-
}
|
|
319
|
-
});
|
|
320
|
-
return retVal;
|
|
321
|
-
}
|
|
322
|
-
index = +index || 0;
|
|
323
|
-
$target = get(this.listItems.toArray(), index);
|
|
324
|
-
if ($target) {
|
|
325
|
-
return [get($target.currentItemWidgets, widgteName)];
|
|
348
|
+
handleStateParams(options) {
|
|
349
|
+
if (this._pageLoad && this.getConfiguredState() !== 'none') {
|
|
350
|
+
this._pageLoad = false;
|
|
351
|
+
const widgetState = this.statePersistence.getWidgetState(this);
|
|
352
|
+
if (_.get(widgetState, 'pagination')) {
|
|
353
|
+
options.options = options.options || {};
|
|
354
|
+
options.options.page = widgetState.pagination;
|
|
355
|
+
}
|
|
356
|
+
if (_.get(widgetState, 'selectedItem')) {
|
|
357
|
+
this._selectedItemsExist = true;
|
|
358
|
+
}
|
|
326
359
|
}
|
|
327
360
|
}
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
* If item is a directive, index is fetched from listItems
|
|
335
|
-
* If item is an object, index is fetched from fieldDefs
|
|
336
|
-
*/
|
|
337
|
-
getIndex(item) {
|
|
338
|
-
if (item instanceof ListItemDirective) {
|
|
339
|
-
return this.getListItemIndex(item);
|
|
340
|
-
}
|
|
341
|
-
else if (item) {
|
|
342
|
-
return this.fieldDefs.findIndex((obj) => isEqual(obj, item));
|
|
361
|
+
triggerWMEvent(eventName, item) {
|
|
362
|
+
$invokeWatchers(true);
|
|
363
|
+
// If we have multiselect for the livelist(List with form template), in run mode deleting a record is getting failed. Becuase the selecteditem will be array of objects. So consider the last object.
|
|
364
|
+
let row = this.multiselect ? _.last(this.selecteditem) : this.selecteditem;
|
|
365
|
+
if (item) {
|
|
366
|
+
row = item;
|
|
343
367
|
}
|
|
368
|
+
this.app.notify('wm-event', { eventName, widgetName: this.name, row: row });
|
|
344
369
|
}
|
|
345
370
|
create() {
|
|
346
371
|
if (this._isDependent) {
|
|
@@ -379,478 +404,86 @@ export class ListComponent extends StylableComponent {
|
|
|
379
404
|
this.variableInflight = data.active;
|
|
380
405
|
// Fix for [WMS-23772] Update nodatafound flag once the response is recieved from the server
|
|
381
406
|
const totalEle = data.data?.pagination?.totalElements;
|
|
382
|
-
if (!isUndefined(totalEle)) {
|
|
407
|
+
if (!_.isUndefined(totalEle)) {
|
|
383
408
|
this.noDataFound = totalEle === 0 ? true : false;
|
|
384
409
|
}
|
|
385
410
|
else { // totalelements is undefined
|
|
386
|
-
this.noDataFound = isEmpty(data.data?.data);
|
|
411
|
+
this.noDataFound = _.isEmpty(data.data?.data);
|
|
387
412
|
}
|
|
388
413
|
});
|
|
389
414
|
}
|
|
390
415
|
}
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
this.onItemClick($event, listItemContext);
|
|
397
|
-
}
|
|
398
|
-
}
|
|
416
|
+
resetNavigation() {
|
|
417
|
+
this.showNavigation = false;
|
|
418
|
+
this.navControls = undefined;
|
|
419
|
+
this.infScroll = false;
|
|
420
|
+
this.onDemandLoad = false;
|
|
399
421
|
}
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
422
|
+
enableBasicNavigation() {
|
|
423
|
+
this.navControls = NAVIGATION_TYPE.BASIC;
|
|
424
|
+
this.showNavigation = true;
|
|
425
|
+
}
|
|
426
|
+
enableInlineNavigation() {
|
|
427
|
+
this.navControls = NAVIGATION_TYPE.INLINE;
|
|
428
|
+
}
|
|
429
|
+
enableClassicNavigation() {
|
|
430
|
+
this.navControls = NAVIGATION_TYPE.CLASSIC;
|
|
431
|
+
this.showNavigation = true;
|
|
432
|
+
}
|
|
433
|
+
enablePagerNavigation() {
|
|
434
|
+
this.navControls = NAVIGATION_TYPE.PAGER;
|
|
435
|
+
this.showNavigation = true;
|
|
436
|
+
}
|
|
437
|
+
setNavigationTypeNone() {
|
|
438
|
+
this.navControls = NAVIGATION_TYPE.NONE;
|
|
439
|
+
this.showNavigation = false;
|
|
440
|
+
}
|
|
441
|
+
enableInfiniteScroll() {
|
|
442
|
+
this.infScroll = true;
|
|
443
|
+
}
|
|
444
|
+
enableOnDemandLoad() {
|
|
445
|
+
this.onDemandLoad = true;
|
|
446
|
+
this.showNavigation = true;
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* Sets Navigation type for the list.
|
|
450
|
+
* @param type
|
|
451
|
+
*/
|
|
452
|
+
onNavigationTypeChange(type) {
|
|
453
|
+
this.resetNavigation();
|
|
454
|
+
switch (type) {
|
|
455
|
+
case NAVIGATION_TYPE.BASIC:
|
|
456
|
+
this.enableBasicNavigation();
|
|
457
|
+
break;
|
|
458
|
+
case NAVIGATION_TYPE.INLINE:
|
|
459
|
+
this.enableInlineNavigation();
|
|
460
|
+
break;
|
|
461
|
+
case NAVIGATION_TYPE.ADVANCED:
|
|
462
|
+
case NAVIGATION_TYPE.CLASSIC:
|
|
463
|
+
this.enableClassicNavigation();
|
|
464
|
+
break;
|
|
465
|
+
case NAVIGATION_TYPE.PAGER:
|
|
466
|
+
this.enablePagerNavigation();
|
|
467
|
+
break;
|
|
468
|
+
case NAVIGATION_TYPE.NONE:
|
|
469
|
+
this.setNavigationTypeNone();
|
|
470
|
+
break;
|
|
471
|
+
case NAVIGATION_TYPE.SCROLL:
|
|
472
|
+
this.enableInfiniteScroll();
|
|
473
|
+
break;
|
|
474
|
+
case NAVIGATION_TYPE.ONDEMAND:
|
|
475
|
+
this.enableOnDemandLoad();
|
|
476
|
+
break;
|
|
404
477
|
}
|
|
405
|
-
return this.datasource.execute(operation, options);
|
|
406
478
|
}
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
const firstIndex = this.getListItemIndex(this.firstSelectedItem);
|
|
416
|
-
const selectCount = isArray(this.selecteditem) ? this.selecteditem.length : (isObject(this.selecteditem) ? 1 : 0);
|
|
417
|
-
if (action === 'selectPrev') {
|
|
418
|
-
if (presentIndex > 0) {
|
|
419
|
-
if ((presentIndex <= firstIndex) && this.checkSelectionLimit(selectCount)) {
|
|
420
|
-
this.lastSelectedItem = this.getListItemByIndex(presentIndex - 1);
|
|
421
|
-
this.toggleListItemSelection(this.lastSelectedItem);
|
|
422
|
-
}
|
|
423
|
-
else if (presentIndex > firstIndex) {
|
|
424
|
-
this.toggleListItemSelection(this.getListItemByIndex(presentIndex));
|
|
425
|
-
this.lastSelectedItem = this.getListItemByIndex(presentIndex - 1);
|
|
426
|
-
}
|
|
427
|
-
else {
|
|
428
|
-
this.invokeEventCallback('selectionlimitexceed', { $event });
|
|
429
|
-
}
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
else if (action === 'selectNext') {
|
|
433
|
-
if (presentIndex < listItems.length - 1) {
|
|
434
|
-
if ((presentIndex >= firstIndex) && this.checkSelectionLimit(selectCount)) {
|
|
435
|
-
this.lastSelectedItem = this.getListItemByIndex(presentIndex + 1);
|
|
436
|
-
this.toggleListItemSelection(this.lastSelectedItem);
|
|
437
|
-
}
|
|
438
|
-
else if (presentIndex < firstIndex) {
|
|
439
|
-
this.toggleListItemSelection(this.getListItemByIndex(presentIndex));
|
|
440
|
-
this.lastSelectedItem = this.getListItemByIndex(presentIndex + 1);
|
|
441
|
-
}
|
|
442
|
-
else {
|
|
443
|
-
this.invokeEventCallback('selectionlimitexceed', { $event });
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
if (action === 'focusPrev') {
|
|
449
|
-
if (this.isListElementMovable) {
|
|
450
|
-
presentIndex = presentIndex <= 0 ? 0 : (presentIndex);
|
|
451
|
-
if (presentIndex === 0) {
|
|
452
|
-
return;
|
|
453
|
-
}
|
|
454
|
-
this.lastSelectedItem = this.getListItemByIndex(presentIndex);
|
|
455
|
-
const prevElt = this.getListItemByIndex(presentIndex - 1);
|
|
456
|
-
prevElt.nativeElement.before(this.lastSelectedItem.nativeElement);
|
|
457
|
-
this.lastSelectedItem.nativeElement.focus();
|
|
458
|
-
this.statePersistence.removeWidgetState(this, 'selectedItem');
|
|
459
|
-
const arr = this.listItems.toArray();
|
|
460
|
-
[arr[presentIndex - 1], arr[presentIndex]] = [arr[presentIndex], arr[presentIndex - 1]];
|
|
461
|
-
this.listItems.reset(arr);
|
|
462
|
-
this.currentIndex = presentIndex;
|
|
463
|
-
this.ariaText = "selected ";
|
|
464
|
-
}
|
|
465
|
-
else {
|
|
466
|
-
presentIndex = presentIndex <= 0 ? 0 : (presentIndex - 1);
|
|
467
|
-
this.lastSelectedItem = this.getListItemByIndex(presentIndex);
|
|
468
|
-
this.lastSelectedItem.nativeElement.focus();
|
|
469
|
-
this.currentIndex = presentIndex + 1;
|
|
470
|
-
this.ariaText = "selected ";
|
|
471
|
-
}
|
|
472
|
-
}
|
|
473
|
-
else if (action === 'focusNext') {
|
|
474
|
-
if (this.isListElementMovable) {
|
|
475
|
-
presentIndex = presentIndex < (listItems.length - 1) ? (presentIndex) : (listItems.length - 1);
|
|
476
|
-
if (presentIndex === this.listItems.length - 1) {
|
|
477
|
-
return;
|
|
478
|
-
}
|
|
479
|
-
this.lastSelectedItem = this.getListItemByIndex(presentIndex);
|
|
480
|
-
const nextElt = this.getListItemByIndex(presentIndex + 1);
|
|
481
|
-
nextElt.nativeElement.after(this.lastSelectedItem.nativeElement);
|
|
482
|
-
this.lastSelectedItem.nativeElement.focus();
|
|
483
|
-
this.statePersistence.removeWidgetState(this, 'selectedItem');
|
|
484
|
-
const arr = this.listItems.toArray();
|
|
485
|
-
[arr[presentIndex], arr[presentIndex + 1]] = [arr[presentIndex + 1], arr[presentIndex]];
|
|
486
|
-
this.listItems.reset(arr);
|
|
487
|
-
this.currentIndex = presentIndex + 2;
|
|
488
|
-
this.ariaText = "selected ";
|
|
489
|
-
}
|
|
490
|
-
else {
|
|
491
|
-
presentIndex = presentIndex < (listItems.length - 1) ? (presentIndex + 1) : (listItems.length - 1);
|
|
492
|
-
this.lastSelectedItem = this.getListItemByIndex(presentIndex);
|
|
493
|
-
this.lastSelectedItem.nativeElement.focus();
|
|
494
|
-
this.currentIndex = presentIndex + 1;
|
|
495
|
-
this.ariaText = "selected ";
|
|
496
|
-
}
|
|
497
|
-
}
|
|
498
|
-
else if (action === 'select') {
|
|
499
|
-
// if the enter click is pressed on the item which is not the last selected item, the find the item from which the event is originated.
|
|
500
|
-
if (presentIndex === -1 || !$($event.target).closest(this.lastSelectedItem.nativeElement)) {
|
|
501
|
-
const $li = $($event.target).closest('li.app-list-item');
|
|
502
|
-
const $ul = $li.closest('ul.app-livelist-container');
|
|
503
|
-
presentIndex = $ul.find('li.app-list-item').index($li);
|
|
504
|
-
}
|
|
505
|
-
this.onItemClick($event, this.getListItemByIndex(presentIndex));
|
|
506
|
-
}
|
|
507
|
-
else if (action === 'space') {
|
|
508
|
-
if (!this.enablereorder) {
|
|
509
|
-
return;
|
|
510
|
-
}
|
|
511
|
-
this.isListElementMovable = !this.isListElementMovable;
|
|
512
|
-
this.onItemClick($event, this.getListItemByIndex(presentIndex));
|
|
513
|
-
this.currentIndex = presentIndex + 1;
|
|
514
|
-
if (this.isListElementMovable) {
|
|
515
|
-
this.ariaText = `Item ${this.currentIndex} grabbed, current position `;
|
|
516
|
-
this.$ulEle.data('oldIndex', presentIndex);
|
|
517
|
-
}
|
|
518
|
-
else {
|
|
519
|
-
this.ariaText = `Item ${this.currentIndex} dropped, final position `;
|
|
520
|
-
this.onUpdate($event, undefined, presentIndex);
|
|
521
|
-
}
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
onPropertyChange(key, nv, ov) {
|
|
525
|
-
if (key === 'dataset') {
|
|
526
|
-
if (!nv && this.binddatasource && !this.datasource) {
|
|
527
|
-
return;
|
|
528
|
-
}
|
|
529
|
-
this.onDataSetChange(nv);
|
|
530
|
-
}
|
|
531
|
-
else if (key === 'datasource') {
|
|
532
|
-
if (this.dataset) {
|
|
533
|
-
this.onDataSetChange(this.dataset);
|
|
534
|
-
}
|
|
535
|
-
}
|
|
536
|
-
else if (key === 'navigation') {
|
|
537
|
-
// Support for older projects where navigation type was advanced instead of classic
|
|
538
|
-
if (nv === 'Advanced') {
|
|
539
|
-
this.navigation = 'Classic';
|
|
540
|
-
return;
|
|
541
|
-
}
|
|
542
|
-
switchClass(this.nativeElement, nv, ov);
|
|
543
|
-
this.onNavigationTypeChange(nv);
|
|
544
|
-
if (this.dataNavigator) {
|
|
545
|
-
this.dataNavigator.navigationClass = this.paginationclass;
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
else if (key === 'itemsperrow') {
|
|
549
|
-
setListClass(this);
|
|
550
|
-
}
|
|
551
|
-
else if (key === 'tabindex') {
|
|
552
|
-
return;
|
|
553
|
-
}
|
|
554
|
-
else if (key === 'pulltorefresh' && nv) {
|
|
555
|
-
this.app.notify('pullToRefresh:enable');
|
|
556
|
-
this.subscribeToPullToRefresh();
|
|
557
|
-
}
|
|
558
|
-
else if (key === 'paginationclass') {
|
|
559
|
-
if (this.dataNavigator) {
|
|
560
|
-
// Adding setTimeout because in pagination component updateNavSize method is overriding navigationclass
|
|
561
|
-
setTimeout(() => this.dataNavigator.navigationClass = nv);
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
else if (key === 'pagesize') {
|
|
565
|
-
this.dataNavigator.options = {
|
|
566
|
-
maxResults: nv
|
|
567
|
-
};
|
|
568
|
-
this.dataNavigator.widget.maxResults = nv;
|
|
569
|
-
this.dataNavigator.maxResults = nv;
|
|
570
|
-
}
|
|
571
|
-
else if (key === 'enablereorder') {
|
|
572
|
-
if (nv && this.$ulEle) {
|
|
573
|
-
this.$ulEle.attr('aria-describedby', this.titleId);
|
|
574
|
-
this.configureDnD();
|
|
575
|
-
this.$ulEle.sortable('enable');
|
|
576
|
-
}
|
|
577
|
-
else if (this.$ulEle && !nv) {
|
|
578
|
-
this.$ulEle.removeAttr('aria-describedby');
|
|
579
|
-
this.$ulEle.sortable('disable');
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
else {
|
|
583
|
-
super.onPropertyChange(key, nv, ov);
|
|
584
|
-
}
|
|
585
|
-
}
|
|
586
|
-
onItemClick(evt, $listItem) {
|
|
587
|
-
let selectCount;
|
|
588
|
-
if (!$listItem.disableItem) {
|
|
589
|
-
this.firstSelectedItem = this.firstSelectedItem || $listItem;
|
|
590
|
-
// Setting selectCount value based number of items selected.
|
|
591
|
-
selectCount = isArray(this.selecteditem) ? this.selecteditem.length : (isObject(this.selecteditem) ? 1 : 0);
|
|
592
|
-
// Handling multiselect for mobile device
|
|
593
|
-
if (this.multiselect && isMobile()) {
|
|
594
|
-
if (this.checkSelectionLimit(selectCount) || $listItem.isActive) {
|
|
595
|
-
this.toggleListItemSelection($listItem);
|
|
596
|
-
}
|
|
597
|
-
else {
|
|
598
|
-
this.invokeEventCallback('selectionlimitexceed', { $event: evt });
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
else if ((evt.ctrlKey || evt.metaKey) && this.multiselect) {
|
|
602
|
-
if (this.checkSelectionLimit(selectCount) || $listItem.isActive) {
|
|
603
|
-
this.firstSelectedItem = this.lastSelectedItem = $listItem;
|
|
604
|
-
this.toggleListItemSelection($listItem);
|
|
605
|
-
}
|
|
606
|
-
else {
|
|
607
|
-
this.invokeEventCallback('selectionlimitexceed', { $event: evt });
|
|
608
|
-
}
|
|
609
|
-
}
|
|
610
|
-
else if (evt.shiftKey && this.multiselect) {
|
|
611
|
-
let first = $listItem.context.index;
|
|
612
|
-
let last = this.firstSelectedItem.context.index;
|
|
613
|
-
// if first is greater than last, then swap values
|
|
614
|
-
if (first > last) {
|
|
615
|
-
last = [first, first = last][0];
|
|
616
|
-
}
|
|
617
|
-
if (this.checkSelectionLimit(last - first)) {
|
|
618
|
-
this.clearSelectedItems();
|
|
619
|
-
this.listItems.forEach(($liItem) => {
|
|
620
|
-
const index = $liItem.context.index;
|
|
621
|
-
if (index >= first && index <= last) {
|
|
622
|
-
this.toggleListItemSelection($liItem);
|
|
623
|
-
}
|
|
624
|
-
});
|
|
625
|
-
this.lastSelectedItem = $listItem;
|
|
626
|
-
}
|
|
627
|
-
else {
|
|
628
|
-
this.invokeEventCallback('selectionlimitexceed', { $event: evt });
|
|
629
|
-
}
|
|
630
|
-
}
|
|
631
|
-
else {
|
|
632
|
-
if (!$listItem.isActive || selectCount > 1) {
|
|
633
|
-
this.clearSelectedItems();
|
|
634
|
-
this.toggleListItemSelection($listItem);
|
|
635
|
-
this.firstSelectedItem = this.lastSelectedItem = $listItem;
|
|
636
|
-
}
|
|
637
|
-
}
|
|
638
|
-
$appDigest();
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
// Empty the list content on clear
|
|
642
|
-
clear() {
|
|
643
|
-
this.updateFieldDefs([]);
|
|
644
|
-
}
|
|
645
|
-
/**
|
|
646
|
-
* deselects item in the list.
|
|
647
|
-
* @param val: index | model of the list item.
|
|
648
|
-
*/
|
|
649
|
-
deselectItem(val) {
|
|
650
|
-
const listItem = this.getItemRefByIndexOrModel(val);
|
|
651
|
-
if (listItem && listItem.isActive) {
|
|
652
|
-
this.toggleListItemSelection(listItem);
|
|
653
|
-
}
|
|
654
|
-
}
|
|
655
|
-
/**
|
|
656
|
-
* selects item in the list.
|
|
657
|
-
* @param val: index | model of the list item.
|
|
658
|
-
*/
|
|
659
|
-
selectItem(val, statePersistenceTriggered) {
|
|
660
|
-
const listItem = this.getItemRefByIndexOrModel(val);
|
|
661
|
-
if (!listItem) {
|
|
662
|
-
return;
|
|
663
|
-
}
|
|
664
|
-
if (!listItem.isActive) {
|
|
665
|
-
this.toggleListItemSelection(listItem, statePersistenceTriggered);
|
|
666
|
-
}
|
|
667
|
-
// focus the element.
|
|
668
|
-
listItem.nativeElement.focus();
|
|
669
|
-
}
|
|
670
|
-
ngOnInit() {
|
|
671
|
-
super.ngOnInit();
|
|
672
|
-
this.handleHeaderClick = noop;
|
|
673
|
-
setTimeout(() => {
|
|
674
|
-
this.debouncedFetchNextDatasetOnScroll = this.paginationService.debouncedFetchNextDatasetOnScroll(this.dataNavigator, DEBOUNCE_TIMES.PAGINATION_DEBOUNCE_TIME, this);
|
|
675
|
-
}, 0);
|
|
676
|
-
this._items = [];
|
|
677
|
-
this.fieldDefs = [];
|
|
678
|
-
this.reorderProps = {
|
|
679
|
-
minIndex: null,
|
|
680
|
-
maxIndex: null
|
|
681
|
-
};
|
|
682
|
-
}
|
|
683
|
-
ngAfterViewInit() {
|
|
684
|
-
this.promiseResolverFn();
|
|
685
|
-
this.propsInitPromise.then(() => {
|
|
686
|
-
super.ngAfterViewInit();
|
|
687
|
-
this.setUpCUDHandlers();
|
|
688
|
-
this.selectedItemWidgets = this.multiselect ? [] : {};
|
|
689
|
-
var ele = $(this.nativeElement).find('.app-livelist-container');
|
|
690
|
-
if (this.enablereorder && !this.groupby) {
|
|
691
|
-
if (ele) {
|
|
692
|
-
ele.attr('aria-describedby', this.titleId);
|
|
693
|
-
}
|
|
694
|
-
this.configureDnD();
|
|
695
|
-
}
|
|
696
|
-
if (!this.enablereorder) {
|
|
697
|
-
if (ele) {
|
|
698
|
-
ele.removeAttr('aria-describedby');
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
if (this.groupby && this.collapsible) {
|
|
702
|
-
this.handleHeaderClick = handleHeaderClick;
|
|
703
|
-
this.toggleAllHeaders = toggleAllHeaders.bind(undefined, this);
|
|
704
|
-
}
|
|
705
|
-
setListClass(this);
|
|
706
|
-
});
|
|
707
|
-
this.setupHandlers();
|
|
708
|
-
const $ul = this.nativeElement.querySelector('ul.app-livelist-container');
|
|
709
|
-
styler($ul, this, APPLY_STYLES_TYPE.SCROLLABLE_CONTAINER);
|
|
710
|
-
if (this.enablereorder) {
|
|
711
|
-
if ($ul) {
|
|
712
|
-
$ul.setAttribute('aria-describedby', this.titleId);
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
if (!this.enablereorder) {
|
|
716
|
-
if ($ul) {
|
|
717
|
-
$ul.removeAttribute('aria-describedby');
|
|
718
|
-
}
|
|
719
|
-
}
|
|
720
|
-
if (isMobileApp() && $ul.querySelector('.app-list-item-action-panel')) {
|
|
721
|
-
this._listAnimator = new ListAnimator(this);
|
|
722
|
-
}
|
|
723
|
-
}
|
|
724
|
-
ngOnDestroy() {
|
|
725
|
-
if (this._listAnimator && this._listAnimator.$btnSubscription) {
|
|
726
|
-
this._listAnimator.$btnSubscription.unsubscribe();
|
|
727
|
-
}
|
|
728
|
-
this._listenerDestroyers.forEach(d => d && d());
|
|
729
|
-
super.ngOnDestroy();
|
|
730
|
-
}
|
|
731
|
-
ngOnDetach() {
|
|
732
|
-
super.ngOnDetach();
|
|
733
|
-
this._pageLoad = true;
|
|
734
|
-
}
|
|
735
|
-
handleEvent(node, eventName, eventCallback, locals) {
|
|
736
|
-
// tap and doubleTap events are not getting propagated.So, using mouse events instead.
|
|
737
|
-
const touchToMouse = {
|
|
738
|
-
tap: 'click',
|
|
739
|
-
doubletap: 'dblclick'
|
|
740
|
-
};
|
|
741
|
-
if (includes(['click', 'tap', 'dblclick', 'doubletap'], eventName)) {
|
|
742
|
-
this.eventManager.addEventListener(this.nativeElement, touchToMouse[eventName] || eventName, (evt) => {
|
|
743
|
-
const target = $(evt.target).closest('.app-list-item');
|
|
744
|
-
if (target.length) {
|
|
745
|
-
const listItemContext = target.data('listItemContext');
|
|
746
|
-
if (!listItemContext.disableItem) {
|
|
747
|
-
this.invokeEventCallback(eventName, {
|
|
748
|
-
widget: listItemContext,
|
|
749
|
-
$event: evt,
|
|
750
|
-
item: listItemContext.item
|
|
751
|
-
});
|
|
752
|
-
}
|
|
753
|
-
}
|
|
754
|
-
});
|
|
755
|
-
}
|
|
756
|
-
}
|
|
757
|
-
getConfiguredState() {
|
|
758
|
-
const mode = this.statePersistence.computeMode(this.statehandler);
|
|
759
|
-
return mode && mode.toLowerCase();
|
|
760
|
-
}
|
|
761
|
-
handleStateParams(options) {
|
|
762
|
-
if (this._pageLoad && this.getConfiguredState() !== 'none') {
|
|
763
|
-
this._pageLoad = false;
|
|
764
|
-
const widgetState = this.statePersistence.getWidgetState(this);
|
|
765
|
-
if (get(widgetState, 'pagination')) {
|
|
766
|
-
options.options = options.options || {};
|
|
767
|
-
options.options.page = widgetState.pagination;
|
|
768
|
-
}
|
|
769
|
-
if (get(widgetState, 'selectedItem')) {
|
|
770
|
-
this._selectedItemsExist = true;
|
|
771
|
-
}
|
|
772
|
-
}
|
|
773
|
-
}
|
|
774
|
-
triggerWMEvent(eventName, item) {
|
|
775
|
-
$invokeWatchers(true);
|
|
776
|
-
// If we have multiselect for the livelist(List with form template), in run mode deleting a record is getting failed. Becuase the selecteditem will be array of objects. So consider the last object.
|
|
777
|
-
let row = this.multiselect ? last(this.selecteditem) : this.selecteditem;
|
|
778
|
-
if (item) {
|
|
779
|
-
row = item;
|
|
780
|
-
}
|
|
781
|
-
this.app.notify('wm-event', { eventName, widgetName: this.name, row: row });
|
|
782
|
-
}
|
|
783
|
-
resetNavigation() {
|
|
784
|
-
this.showNavigation = false;
|
|
785
|
-
this.navControls = undefined;
|
|
786
|
-
this.infScroll = false;
|
|
787
|
-
this.onDemandLoad = false;
|
|
788
|
-
}
|
|
789
|
-
enableBasicNavigation() {
|
|
790
|
-
this.navControls = NAVIGATION_TYPE.BASIC;
|
|
791
|
-
this.showNavigation = true;
|
|
792
|
-
}
|
|
793
|
-
enableInlineNavigation() {
|
|
794
|
-
this.navControls = NAVIGATION_TYPE.INLINE;
|
|
795
|
-
}
|
|
796
|
-
enableClassicNavigation() {
|
|
797
|
-
this.navControls = NAVIGATION_TYPE.CLASSIC;
|
|
798
|
-
this.showNavigation = true;
|
|
799
|
-
}
|
|
800
|
-
enablePagerNavigation() {
|
|
801
|
-
this.navControls = NAVIGATION_TYPE.PAGER;
|
|
802
|
-
this.showNavigation = true;
|
|
803
|
-
}
|
|
804
|
-
setNavigationTypeNone() {
|
|
805
|
-
this.navControls = NAVIGATION_TYPE.NONE;
|
|
806
|
-
this.showNavigation = false;
|
|
807
|
-
}
|
|
808
|
-
enableInfiniteScroll() {
|
|
809
|
-
this.infScroll = true;
|
|
810
|
-
}
|
|
811
|
-
enableOnDemandLoad() {
|
|
812
|
-
this.onDemandLoad = true;
|
|
813
|
-
this.showNavigation = true;
|
|
814
|
-
}
|
|
815
|
-
/**
|
|
816
|
-
* Sets Navigation type for the list.
|
|
817
|
-
* @param type
|
|
818
|
-
*/
|
|
819
|
-
onNavigationTypeChange(type) {
|
|
820
|
-
this.resetNavigation();
|
|
821
|
-
switch (type) {
|
|
822
|
-
case NAVIGATION_TYPE.BASIC:
|
|
823
|
-
this.enableBasicNavigation();
|
|
824
|
-
break;
|
|
825
|
-
case NAVIGATION_TYPE.INLINE:
|
|
826
|
-
this.enableInlineNavigation();
|
|
827
|
-
break;
|
|
828
|
-
case NAVIGATION_TYPE.ADVANCED:
|
|
829
|
-
case NAVIGATION_TYPE.CLASSIC:
|
|
830
|
-
this.enableClassicNavigation();
|
|
831
|
-
break;
|
|
832
|
-
case NAVIGATION_TYPE.PAGER:
|
|
833
|
-
this.enablePagerNavigation();
|
|
834
|
-
break;
|
|
835
|
-
case NAVIGATION_TYPE.NONE:
|
|
836
|
-
this.setNavigationTypeNone();
|
|
837
|
-
break;
|
|
838
|
-
case NAVIGATION_TYPE.SCROLL:
|
|
839
|
-
this.enableInfiniteScroll();
|
|
840
|
-
break;
|
|
841
|
-
case NAVIGATION_TYPE.ONDEMAND:
|
|
842
|
-
this.enableOnDemandLoad();
|
|
843
|
-
break;
|
|
844
|
-
}
|
|
845
|
-
}
|
|
846
|
-
/**
|
|
847
|
-
* Update fieldDefs property, fieldDefs is the model of the List Component.
|
|
848
|
-
* fieldDefs is an Array type.
|
|
849
|
-
* @param newVal
|
|
850
|
-
*/
|
|
851
|
-
updateFieldDefs(newVal) {
|
|
852
|
-
if (this.infScroll || this.onDemandLoad) {
|
|
853
|
-
[this.fieldDefs, this.currentPage] = this.paginationService.updateFieldsOnPagination(this, newVal);
|
|
479
|
+
/**
|
|
480
|
+
* Update fieldDefs property, fieldDefs is the model of the List Component.
|
|
481
|
+
* fieldDefs is an Array type.
|
|
482
|
+
* @param newVal
|
|
483
|
+
*/
|
|
484
|
+
updateFieldDefs(newVal) {
|
|
485
|
+
if (this.infScroll || this.onDemandLoad) {
|
|
486
|
+
[this.fieldDefs, this.currentPage] = this.paginationService.updateFieldsOnPagination(this, newVal);
|
|
854
487
|
}
|
|
855
488
|
else {
|
|
856
489
|
this.fieldDefs = newVal;
|
|
@@ -870,17 +503,17 @@ export class ListComponent extends StylableComponent {
|
|
|
870
503
|
}
|
|
871
504
|
onDataChange(newVal) {
|
|
872
505
|
// Check for newVal is not empty
|
|
873
|
-
if (!isEmpty(newVal)) {
|
|
506
|
+
if (!_.isEmpty(newVal)) {
|
|
874
507
|
this.noDataFound = false;
|
|
875
508
|
this.isDataChanged = true;
|
|
876
509
|
if (this.datasource && this.datasource.execute(DataSource.Operation.IS_API_AWARE)) {
|
|
877
510
|
// clone the the data in case of live and service variables to prevent the two-way binding for these variables.
|
|
878
|
-
newVal = cloneDeep(newVal);
|
|
511
|
+
newVal = _.cloneDeep(newVal);
|
|
879
512
|
}
|
|
880
|
-
if (isObject(newVal) && !isArray(newVal)) {
|
|
881
|
-
newVal = isEmpty(newVal) ? [] : [newVal];
|
|
513
|
+
if (isObject(newVal) && !_.isArray(newVal)) {
|
|
514
|
+
newVal = _.isEmpty(newVal) ? [] : [newVal];
|
|
882
515
|
}
|
|
883
|
-
if (isString(newVal)) {
|
|
516
|
+
if (_.isString(newVal)) {
|
|
884
517
|
newVal = newVal.split(',');
|
|
885
518
|
}
|
|
886
519
|
// if the page number is greater than 1 on initial load then we render the first page.
|
|
@@ -889,7 +522,7 @@ export class ListComponent extends StylableComponent {
|
|
|
889
522
|
'page': 1
|
|
890
523
|
});
|
|
891
524
|
}
|
|
892
|
-
if (isArray(newVal)) {
|
|
525
|
+
if (_.isArray(newVal)) {
|
|
893
526
|
if (newVal.length) {
|
|
894
527
|
this.invokeEventCallback('beforedatarender', { $data: newVal });
|
|
895
528
|
}
|
|
@@ -930,13 +563,13 @@ export class ListComponent extends StylableComponent {
|
|
|
930
563
|
this.dataNavigator.setBindDataSet(this.binddataset, this.viewParent, datasetBoundExpr ? this.context : this.datasource, this.dataset, this.binddatasource, datasetBoundExpr, this.statehandler);
|
|
931
564
|
}
|
|
932
565
|
onDataSetChange(newVal) {
|
|
933
|
-
if (get(this.datasource, 'category') === 'wm.Variable' && this.getConfiguredState() !== 'none' && this._pageLoad) {
|
|
566
|
+
if (_.get(this.datasource, 'category') === 'wm.Variable' && this.getConfiguredState() !== 'none' && this._pageLoad) {
|
|
934
567
|
const widgetState = this.statePersistence.getWidgetState(this);
|
|
935
568
|
this._pageLoad = false;
|
|
936
|
-
if (get(widgetState, 'pagination')) {
|
|
569
|
+
if (_.get(widgetState, 'pagination')) {
|
|
937
570
|
this.dataNavigator.pageChanged({ page: widgetState.pagination }, true);
|
|
938
571
|
}
|
|
939
|
-
if (get(widgetState, 'selectedItem')) {
|
|
572
|
+
if (_.get(widgetState, 'selectedItem')) {
|
|
940
573
|
this._selectedItemsExist = true;
|
|
941
574
|
}
|
|
942
575
|
}
|
|
@@ -971,29 +604,29 @@ export class ListComponent extends StylableComponent {
|
|
|
971
604
|
getListItemByModel(listModel) {
|
|
972
605
|
return this.listItems.find((listItem) => {
|
|
973
606
|
let itemObj = listItem.item;
|
|
974
|
-
if (this.groupby && !has(listModel, '_groupIndex')) {
|
|
607
|
+
if (this.groupby && !_.has(listModel, '_groupIndex')) {
|
|
975
608
|
// If groupby is enabled, item contains _groupIndex property which should be excluded while comparing model.
|
|
976
|
-
itemObj = clone(itemObj);
|
|
609
|
+
itemObj = _.clone(itemObj);
|
|
977
610
|
delete itemObj._groupIndex;
|
|
978
611
|
}
|
|
979
|
-
if (isEqual(itemObj, listModel)) {
|
|
612
|
+
if (_.isEqual(itemObj, listModel)) {
|
|
980
613
|
return true;
|
|
981
614
|
}
|
|
982
615
|
}) || null;
|
|
983
616
|
}
|
|
984
617
|
updateSelectedItemsWidgets(statePersistenceTriggered) {
|
|
985
618
|
let obj = {}, widgetState;
|
|
986
|
-
const pageNum = get(this.dataNavigator, 'dn.currentPage') || 1;
|
|
619
|
+
const pageNum = _.get(this.dataNavigator, 'dn.currentPage') || 1;
|
|
987
620
|
if (this.getConfiguredState() !== 'none') {
|
|
988
621
|
// remove previously configured selected items for current page and construct new ones later below.
|
|
989
622
|
widgetState = this.statePersistence.getWidgetState(this) || {};
|
|
990
|
-
if (get(widgetState, 'selectedItem')) {
|
|
623
|
+
if (_.get(widgetState, 'selectedItem')) {
|
|
991
624
|
// when multiselect is on and an item is selected without pressing CTRL, previously selected items in state should be empty.
|
|
992
625
|
if (this.multiselect && this.selecteditem.length === 1) {
|
|
993
626
|
widgetState.selectedItem = [];
|
|
994
627
|
}
|
|
995
628
|
else {
|
|
996
|
-
remove(widgetState.selectedItem, function (selectedItem) {
|
|
629
|
+
_.remove(widgetState.selectedItem, function (selectedItem) {
|
|
997
630
|
return selectedItem.page === pageNum;
|
|
998
631
|
});
|
|
999
632
|
}
|
|
@@ -1011,8 +644,8 @@ export class ListComponent extends StylableComponent {
|
|
|
1011
644
|
this.selectedItemWidgets = item.currentItemWidgets;
|
|
1012
645
|
}
|
|
1013
646
|
obj = { page: pageNum, index: index };
|
|
1014
|
-
if (get(widgetState, 'selectedItem') && this.multiselect) {
|
|
1015
|
-
if (!some(widgetState.selectedItem, obj)) {
|
|
647
|
+
if (_.get(widgetState, 'selectedItem') && this.multiselect) {
|
|
648
|
+
if (!_.some(widgetState.selectedItem, obj)) {
|
|
1016
649
|
widgetState.selectedItem.push(obj);
|
|
1017
650
|
}
|
|
1018
651
|
}
|
|
@@ -1040,13 +673,13 @@ export class ListComponent extends StylableComponent {
|
|
|
1040
673
|
// item is not allowed to get selected if it is disabled.
|
|
1041
674
|
if ($listItem && !$listItem.disableItem) {
|
|
1042
675
|
let item = $listItem.item;
|
|
1043
|
-
if (this.groupby && has(item, '_groupIndex')) {
|
|
676
|
+
if (this.groupby && _.has(item, '_groupIndex')) {
|
|
1044
677
|
// If groupby is enabled, item contains _groupIndex property which should be excluded from selecteditem.
|
|
1045
|
-
item = clone(item);
|
|
678
|
+
item = _.clone(item);
|
|
1046
679
|
delete item._groupIndex;
|
|
1047
680
|
}
|
|
1048
681
|
if ($listItem.isActive) {
|
|
1049
|
-
this._items = pullAllWith(this._items, [item], isEqual);
|
|
682
|
+
this._items = _.pullAllWith(this._items, [item], _.isEqual);
|
|
1050
683
|
$listItem.isActive = false;
|
|
1051
684
|
}
|
|
1052
685
|
else {
|
|
@@ -1074,10 +707,10 @@ export class ListComponent extends StylableComponent {
|
|
|
1074
707
|
}
|
|
1075
708
|
if (this.isDataChanged && this.getConfiguredState() !== 'none' && listItems.length && this._selectedItemsExist) {
|
|
1076
709
|
const widgetState = this.statePersistence.getWidgetState(this);
|
|
1077
|
-
if (get(widgetState, 'selectedItem')) {
|
|
710
|
+
if (_.get(widgetState, 'selectedItem')) {
|
|
1078
711
|
this._selectedItemsExist = false;
|
|
1079
|
-
const selectedItemsLength = isArray(this.selecteditem) ? this.selecteditem.length : toNumber(!isEmpty(this.selecteditem));
|
|
1080
|
-
const currentPage = get(this.dataNavigator, 'dn.currentPage') || 1;
|
|
712
|
+
const selectedItemsLength = _.isArray(this.selecteditem) ? this.selecteditem.length : _.toNumber(!_.isEmpty(this.selecteditem));
|
|
713
|
+
const currentPage = _.get(this.dataNavigator, 'dn.currentPage') || 1;
|
|
1081
714
|
widgetState.pagination = widgetState.pagination || 1;
|
|
1082
715
|
// to prevent item selection from being triggered more than once
|
|
1083
716
|
if (selectedItemsLength !== widgetState.selectedItem.length && widgetState.pagination === currentPage) {
|
|
@@ -1089,7 +722,7 @@ export class ListComponent extends StylableComponent {
|
|
|
1089
722
|
}
|
|
1090
723
|
}
|
|
1091
724
|
}
|
|
1092
|
-
const selectedItems = isArray(this.selecteditem) ? this.selecteditem : [this.selecteditem];
|
|
725
|
+
const selectedItems = _.isArray(this.selecteditem) ? this.selecteditem : [this.selecteditem];
|
|
1093
726
|
this.firstSelectedItem = this.lastSelectedItem = null;
|
|
1094
727
|
// don't select first item if multi-select is enabled and at least item is already selected in the list.
|
|
1095
728
|
// don't select first item if state information has selected items
|
|
@@ -1138,6 +771,15 @@ export class ListComponent extends StylableComponent {
|
|
|
1138
771
|
}
|
|
1139
772
|
this.isDataChanged = false;
|
|
1140
773
|
}
|
|
774
|
+
triggerListItemSelection($el, $event) {
|
|
775
|
+
if ($el && $el[0]) {
|
|
776
|
+
const listItemContext = $el.data('listItemContext');
|
|
777
|
+
// Trigger click event only if the list item is from the corresponding list.
|
|
778
|
+
if (listItemContext.listComponent === this) {
|
|
779
|
+
this.onItemClick($event, listItemContext);
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
}
|
|
1141
783
|
setupHandlers() {
|
|
1142
784
|
this.listItems.changes.subscribe(listItems => {
|
|
1143
785
|
this.onListRender(listItems);
|
|
@@ -1176,99 +818,344 @@ export class ListComponent extends StylableComponent {
|
|
|
1176
818
|
// If ui is not present then it is called from drag and drop using keyboard
|
|
1177
819
|
const newIndex = ui === undefined ? presentIndex : ui.item.index();
|
|
1178
820
|
const oldIndex = this.$ulEle.data('oldIndex');
|
|
1179
|
-
const minIndex = min([newIndex, oldIndex]);
|
|
1180
|
-
const maxIndex = max([newIndex, oldIndex]);
|
|
1181
|
-
const draggedItem = pullAt(data, oldIndex)[0];
|
|
821
|
+
const minIndex = _.min([newIndex, oldIndex]);
|
|
822
|
+
const maxIndex = _.max([newIndex, oldIndex]);
|
|
823
|
+
const draggedItem = _.pullAt(data, oldIndex)[0];
|
|
1182
824
|
// Modify the data list only if we find a draggedItem
|
|
1183
825
|
if (draggedItem) {
|
|
1184
826
|
if (this.getConfiguredState() !== 'none') {
|
|
1185
827
|
this.statePersistence.removeWidgetState(this, 'selectedItem');
|
|
1186
828
|
}
|
|
1187
|
-
this.reorderProps.minIndex = min([minIndex, this.reorderProps.minIndex]);
|
|
1188
|
-
this.reorderProps.maxIndex = max([maxIndex, this.reorderProps.maxIndex]);
|
|
1189
|
-
data.splice(newIndex, 0, draggedItem);
|
|
1190
|
-
this.cdRef.markForCheck();
|
|
1191
|
-
this.cdRef.detectChanges();
|
|
1192
|
-
const $changedItem = {
|
|
1193
|
-
oldIndex: oldIndex,
|
|
1194
|
-
newIndex: newIndex,
|
|
1195
|
-
item: data[newIndex]
|
|
1196
|
-
};
|
|
1197
|
-
this.invokeEventCallback('reorder', { $event: evt, $data: data, $changedItem });
|
|
1198
|
-
this.$ulEle.removeData('oldIndex');
|
|
829
|
+
this.reorderProps.minIndex = _.min([minIndex, this.reorderProps.minIndex]);
|
|
830
|
+
this.reorderProps.maxIndex = _.max([maxIndex, this.reorderProps.maxIndex]);
|
|
831
|
+
data.splice(newIndex, 0, draggedItem);
|
|
832
|
+
this.cdRef.markForCheck();
|
|
833
|
+
this.cdRef.detectChanges();
|
|
834
|
+
const $changedItem = {
|
|
835
|
+
oldIndex: oldIndex,
|
|
836
|
+
newIndex: newIndex,
|
|
837
|
+
item: data[newIndex]
|
|
838
|
+
};
|
|
839
|
+
this.invokeEventCallback('reorder', { $event: evt, $data: data, $changedItem });
|
|
840
|
+
this.$ulEle.removeData('oldIndex');
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
// configures reordering the list items.
|
|
844
|
+
configureDnD() {
|
|
845
|
+
let appendTo;
|
|
846
|
+
const modalEl = $(document).find('.modal');
|
|
847
|
+
if (this.getAttr('height')) { // when height is applied to the list, append should be the ul's parent as scroll is applied to the parent
|
|
848
|
+
appendTo = 'parent';
|
|
849
|
+
}
|
|
850
|
+
else if (modalEl.length) { // In case of dialog, appendTo should be the modal ele
|
|
851
|
+
appendTo = modalEl[modalEl.length - 1];
|
|
852
|
+
}
|
|
853
|
+
else { // As default append to should be body
|
|
854
|
+
appendTo = 'body';
|
|
855
|
+
}
|
|
856
|
+
const options = isMobileApp() ? {} : {
|
|
857
|
+
appendTo: appendTo,
|
|
858
|
+
};
|
|
859
|
+
const $el = $(this.nativeElement);
|
|
860
|
+
this.$ulEle = $el.find('.app-livelist-container');
|
|
861
|
+
configureDnD(this.$ulEle, options, this.onReorderStart.bind(this), this.onUpdate.bind(this), this.onSort.bind(this));
|
|
862
|
+
this.$ulEle.droppable({ 'accept': '.app-list-item' });
|
|
863
|
+
if (isMobileApp()) {
|
|
864
|
+
this.$ulEle.sortable('disable');
|
|
865
|
+
this.$ulEle.on('touchstart', function (event) {
|
|
866
|
+
let self = this;
|
|
867
|
+
if (!self.touching) {
|
|
868
|
+
if (self.touched) {
|
|
869
|
+
clearTimeout(self.touched);
|
|
870
|
+
}
|
|
871
|
+
setTimeout(() => {
|
|
872
|
+
//Prevent context menu on mobile (IOS/ANDROID)
|
|
873
|
+
if (event.cancelable) {
|
|
874
|
+
event.preventDefault();
|
|
875
|
+
}
|
|
876
|
+
}, 50);
|
|
877
|
+
self.touched = setTimeout(() => {
|
|
878
|
+
$(event.currentTarget).addClass('no-selection');
|
|
879
|
+
//Enable draggable
|
|
880
|
+
$(event.currentTarget).sortable('enable');
|
|
881
|
+
//Set internal flag
|
|
882
|
+
self.touching = true;
|
|
883
|
+
//trigger touchstart again to enable draggable through touch punch
|
|
884
|
+
$(self).trigger(event);
|
|
885
|
+
//Choose preferred duration for taphold
|
|
886
|
+
}, 350);
|
|
887
|
+
}
|
|
888
|
+
}).on('touchend', function (event) {
|
|
889
|
+
this.touching = false;
|
|
890
|
+
$(event.currentTarget).removeClass('no-selection');
|
|
891
|
+
//Disable draggable to enable default behaviour
|
|
892
|
+
$(event.currentTarget).sortable('disable');
|
|
893
|
+
clearTimeout(this.touched);
|
|
894
|
+
}).on('touchmove', function () {
|
|
895
|
+
clearTimeout(this.touched);
|
|
896
|
+
});
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
// returns true if the selection limit is reached.
|
|
900
|
+
checkSelectionLimit(count) {
|
|
901
|
+
return (!this.selectionlimit || count < this.selectionlimit);
|
|
902
|
+
}
|
|
903
|
+
// returns listitem reference by index value.
|
|
904
|
+
getListItemByIndex(index) {
|
|
905
|
+
return this.listItems.toArray()[index];
|
|
906
|
+
}
|
|
907
|
+
/**
|
|
908
|
+
* return index of an (listItemDirective) in the listItem
|
|
909
|
+
* @param {ListItemDirective} item
|
|
910
|
+
* @returns {number}
|
|
911
|
+
*/
|
|
912
|
+
getListItemIndex(item) {
|
|
913
|
+
return this.listItems.toArray().indexOf(item);
|
|
914
|
+
}
|
|
915
|
+
// this method is called form other data widgets like table.
|
|
916
|
+
execute(operation, options) {
|
|
917
|
+
if ([DataSource.Operation.IS_API_AWARE, DataSource.Operation.IS_PAGEABLE, DataSource.Operation.SUPPORTS_SERVER_FILTER].includes(operation)) {
|
|
918
|
+
return false;
|
|
919
|
+
}
|
|
920
|
+
return this.datasource.execute(operation, options);
|
|
921
|
+
}
|
|
922
|
+
handleKeyDown($event, action) {
|
|
923
|
+
$event.stopPropagation();
|
|
924
|
+
if ($event.keyCode !== 13 && $event.keyCode !== 9 && !(($event.target.classList.contains('form-control') || $event.target.classList.contains('note-editable')) && $event.keyCode === 32)) {
|
|
925
|
+
$event.preventDefault();
|
|
926
|
+
}
|
|
927
|
+
const listItems = this.listItems;
|
|
928
|
+
let presentIndex = this.getListItemIndex(this.lastSelectedItem);
|
|
929
|
+
if (this.multiselect) {
|
|
930
|
+
const firstIndex = this.getListItemIndex(this.firstSelectedItem);
|
|
931
|
+
const selectCount = _.isArray(this.selecteditem) ? this.selecteditem.length : (_.isObject(this.selecteditem) ? 1 : 0);
|
|
932
|
+
if (action === 'selectPrev') {
|
|
933
|
+
if (presentIndex > 0) {
|
|
934
|
+
if ((presentIndex <= firstIndex) && this.checkSelectionLimit(selectCount)) {
|
|
935
|
+
this.lastSelectedItem = this.getListItemByIndex(presentIndex - 1);
|
|
936
|
+
this.toggleListItemSelection(this.lastSelectedItem);
|
|
937
|
+
}
|
|
938
|
+
else if (presentIndex > firstIndex) {
|
|
939
|
+
this.toggleListItemSelection(this.getListItemByIndex(presentIndex));
|
|
940
|
+
this.lastSelectedItem = this.getListItemByIndex(presentIndex - 1);
|
|
941
|
+
}
|
|
942
|
+
else {
|
|
943
|
+
this.invokeEventCallback('selectionlimitexceed', { $event });
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
else if (action === 'selectNext') {
|
|
948
|
+
if (presentIndex < listItems.length - 1) {
|
|
949
|
+
if ((presentIndex >= firstIndex) && this.checkSelectionLimit(selectCount)) {
|
|
950
|
+
this.lastSelectedItem = this.getListItemByIndex(presentIndex + 1);
|
|
951
|
+
this.toggleListItemSelection(this.lastSelectedItem);
|
|
952
|
+
}
|
|
953
|
+
else if (presentIndex < firstIndex) {
|
|
954
|
+
this.toggleListItemSelection(this.getListItemByIndex(presentIndex));
|
|
955
|
+
this.lastSelectedItem = this.getListItemByIndex(presentIndex + 1);
|
|
956
|
+
}
|
|
957
|
+
else {
|
|
958
|
+
this.invokeEventCallback('selectionlimitexceed', { $event });
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
if (action === 'focusPrev') {
|
|
964
|
+
if (this.isListElementMovable) {
|
|
965
|
+
presentIndex = presentIndex <= 0 ? 0 : (presentIndex);
|
|
966
|
+
if (presentIndex === 0) {
|
|
967
|
+
return;
|
|
968
|
+
}
|
|
969
|
+
this.lastSelectedItem = this.getListItemByIndex(presentIndex);
|
|
970
|
+
const prevElt = this.getListItemByIndex(presentIndex - 1);
|
|
971
|
+
prevElt.nativeElement.before(this.lastSelectedItem.nativeElement);
|
|
972
|
+
this.lastSelectedItem.nativeElement.focus();
|
|
973
|
+
this.statePersistence.removeWidgetState(this, 'selectedItem');
|
|
974
|
+
const arr = this.listItems.toArray();
|
|
975
|
+
[arr[presentIndex - 1], arr[presentIndex]] = [arr[presentIndex], arr[presentIndex - 1]];
|
|
976
|
+
this.listItems.reset(arr);
|
|
977
|
+
this.currentIndex = presentIndex;
|
|
978
|
+
this.ariaText = "selected ";
|
|
979
|
+
}
|
|
980
|
+
else {
|
|
981
|
+
presentIndex = presentIndex <= 0 ? 0 : (presentIndex - 1);
|
|
982
|
+
this.lastSelectedItem = this.getListItemByIndex(presentIndex);
|
|
983
|
+
this.lastSelectedItem.nativeElement.focus();
|
|
984
|
+
this.currentIndex = presentIndex + 1;
|
|
985
|
+
this.ariaText = "selected ";
|
|
986
|
+
}
|
|
987
|
+
}
|
|
988
|
+
else if (action === 'focusNext') {
|
|
989
|
+
if (this.isListElementMovable) {
|
|
990
|
+
presentIndex = presentIndex < (listItems.length - 1) ? (presentIndex) : (listItems.length - 1);
|
|
991
|
+
if (presentIndex === this.listItems.length - 1) {
|
|
992
|
+
return;
|
|
993
|
+
}
|
|
994
|
+
this.lastSelectedItem = this.getListItemByIndex(presentIndex);
|
|
995
|
+
const nextElt = this.getListItemByIndex(presentIndex + 1);
|
|
996
|
+
nextElt.nativeElement.after(this.lastSelectedItem.nativeElement);
|
|
997
|
+
this.lastSelectedItem.nativeElement.focus();
|
|
998
|
+
this.statePersistence.removeWidgetState(this, 'selectedItem');
|
|
999
|
+
const arr = this.listItems.toArray();
|
|
1000
|
+
[arr[presentIndex], arr[presentIndex + 1]] = [arr[presentIndex + 1], arr[presentIndex]];
|
|
1001
|
+
this.listItems.reset(arr);
|
|
1002
|
+
this.currentIndex = presentIndex + 2;
|
|
1003
|
+
this.ariaText = "selected ";
|
|
1004
|
+
}
|
|
1005
|
+
else {
|
|
1006
|
+
presentIndex = presentIndex < (listItems.length - 1) ? (presentIndex + 1) : (listItems.length - 1);
|
|
1007
|
+
this.lastSelectedItem = this.getListItemByIndex(presentIndex);
|
|
1008
|
+
this.lastSelectedItem.nativeElement.focus();
|
|
1009
|
+
this.currentIndex = presentIndex + 1;
|
|
1010
|
+
this.ariaText = "selected ";
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
else if (action === 'select') {
|
|
1014
|
+
// if the enter click is pressed on the item which is not the last selected item, the find the item from which the event is originated.
|
|
1015
|
+
if (presentIndex === -1 || !$($event.target).closest(this.lastSelectedItem.nativeElement)) {
|
|
1016
|
+
const $li = $($event.target).closest('li.app-list-item');
|
|
1017
|
+
const $ul = $li.closest('ul.app-livelist-container');
|
|
1018
|
+
presentIndex = $ul.find('li.app-list-item').index($li);
|
|
1019
|
+
}
|
|
1020
|
+
this.onItemClick($event, this.getListItemByIndex(presentIndex));
|
|
1021
|
+
}
|
|
1022
|
+
else if (action === 'space') {
|
|
1023
|
+
if (!this.enablereorder) {
|
|
1024
|
+
return;
|
|
1025
|
+
}
|
|
1026
|
+
this.isListElementMovable = !this.isListElementMovable;
|
|
1027
|
+
this.onItemClick($event, this.getListItemByIndex(presentIndex));
|
|
1028
|
+
this.currentIndex = presentIndex + 1;
|
|
1029
|
+
if (this.isListElementMovable) {
|
|
1030
|
+
this.ariaText = `Item ${this.currentIndex} grabbed, current position `;
|
|
1031
|
+
this.$ulEle.data('oldIndex', presentIndex);
|
|
1032
|
+
}
|
|
1033
|
+
else {
|
|
1034
|
+
this.ariaText = `Item ${this.currentIndex} dropped, final position `;
|
|
1035
|
+
this.onUpdate($event, undefined, presentIndex);
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
}
|
|
1039
|
+
onPropertyChange(key, nv, ov) {
|
|
1040
|
+
if (key === 'dataset') {
|
|
1041
|
+
if (!nv && this.binddatasource && !this.datasource) {
|
|
1042
|
+
return;
|
|
1043
|
+
}
|
|
1044
|
+
this.onDataSetChange(nv);
|
|
1045
|
+
}
|
|
1046
|
+
else if (key === 'datasource') {
|
|
1047
|
+
if (this.dataset) {
|
|
1048
|
+
this.onDataSetChange(this.dataset);
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
else if (key === 'navigation') {
|
|
1052
|
+
// Support for older projects where navigation type was advanced instead of classic
|
|
1053
|
+
if (nv === 'Advanced') {
|
|
1054
|
+
this.navigation = 'Classic';
|
|
1055
|
+
return;
|
|
1056
|
+
}
|
|
1057
|
+
switchClass(this.nativeElement, nv, ov);
|
|
1058
|
+
this.onNavigationTypeChange(nv);
|
|
1059
|
+
if (this.dataNavigator) {
|
|
1060
|
+
this.dataNavigator.navigationClass = this.paginationclass;
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
else if (key === 'itemsperrow') {
|
|
1064
|
+
setListClass(this);
|
|
1065
|
+
}
|
|
1066
|
+
else if (key === 'tabindex') {
|
|
1067
|
+
return;
|
|
1068
|
+
}
|
|
1069
|
+
else if (key === 'pulltorefresh' && nv) {
|
|
1070
|
+
this.app.notify('pullToRefresh:enable');
|
|
1071
|
+
this.subscribeToPullToRefresh();
|
|
1072
|
+
}
|
|
1073
|
+
else if (key === 'paginationclass') {
|
|
1074
|
+
if (this.dataNavigator) {
|
|
1075
|
+
// Adding setTimeout because in pagination component updateNavSize method is overriding navigationclass
|
|
1076
|
+
setTimeout(() => this.dataNavigator.navigationClass = nv);
|
|
1077
|
+
}
|
|
1199
1078
|
}
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
appendTo = 'parent';
|
|
1079
|
+
else if (key === 'pagesize') {
|
|
1080
|
+
this.dataNavigator.options = {
|
|
1081
|
+
maxResults: nv
|
|
1082
|
+
};
|
|
1083
|
+
this.dataNavigator.widget.maxResults = nv;
|
|
1084
|
+
this.dataNavigator.maxResults = nv;
|
|
1207
1085
|
}
|
|
1208
|
-
else if (
|
|
1209
|
-
|
|
1086
|
+
else if (key === 'enablereorder') {
|
|
1087
|
+
if (nv && this.$ulEle) {
|
|
1088
|
+
this.$ulEle.attr('aria-describedby', this.titleId);
|
|
1089
|
+
this.configureDnD();
|
|
1090
|
+
this.$ulEle.sortable('enable');
|
|
1091
|
+
}
|
|
1092
|
+
else if (this.$ulEle && !nv) {
|
|
1093
|
+
this.$ulEle.removeAttr('aria-describedby');
|
|
1094
|
+
this.$ulEle.sortable('disable');
|
|
1095
|
+
}
|
|
1210
1096
|
}
|
|
1211
|
-
else {
|
|
1212
|
-
|
|
1097
|
+
else {
|
|
1098
|
+
super.onPropertyChange(key, nv, ov);
|
|
1213
1099
|
}
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
this
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
1229
|
-
|
|
1230
|
-
|
|
1231
|
-
|
|
1232
|
-
|
|
1100
|
+
}
|
|
1101
|
+
onItemClick(evt, $listItem) {
|
|
1102
|
+
let selectCount;
|
|
1103
|
+
if (!$listItem.disableItem) {
|
|
1104
|
+
this.firstSelectedItem = this.firstSelectedItem || $listItem;
|
|
1105
|
+
// Setting selectCount value based number of items selected.
|
|
1106
|
+
selectCount = _.isArray(this.selecteditem) ? this.selecteditem.length : (_.isObject(this.selecteditem) ? 1 : 0);
|
|
1107
|
+
// Handling multiselect for mobile device
|
|
1108
|
+
if (this.multiselect && isMobile()) {
|
|
1109
|
+
if (this.checkSelectionLimit(selectCount) || $listItem.isActive) {
|
|
1110
|
+
this.toggleListItemSelection($listItem);
|
|
1111
|
+
}
|
|
1112
|
+
else {
|
|
1113
|
+
this.invokeEventCallback('selectionlimitexceed', { $event: evt });
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
1116
|
+
else if ((evt.ctrlKey || evt.metaKey) && this.multiselect) {
|
|
1117
|
+
if (this.checkSelectionLimit(selectCount) || $listItem.isActive) {
|
|
1118
|
+
this.firstSelectedItem = this.lastSelectedItem = $listItem;
|
|
1119
|
+
this.toggleListItemSelection($listItem);
|
|
1120
|
+
}
|
|
1121
|
+
else {
|
|
1122
|
+
this.invokeEventCallback('selectionlimitexceed', { $event: evt });
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
else if (evt.shiftKey && this.multiselect) {
|
|
1126
|
+
let first = $listItem.context.index;
|
|
1127
|
+
let last = this.firstSelectedItem.context.index;
|
|
1128
|
+
// if first is greater than last, then swap values
|
|
1129
|
+
if (first > last) {
|
|
1130
|
+
last = [first, first = last][0];
|
|
1131
|
+
}
|
|
1132
|
+
if (this.checkSelectionLimit(last - first)) {
|
|
1133
|
+
this.clearSelectedItems();
|
|
1134
|
+
this.listItems.forEach(($liItem) => {
|
|
1135
|
+
const index = $liItem.context.index;
|
|
1136
|
+
if (index >= first && index <= last) {
|
|
1137
|
+
this.toggleListItemSelection($liItem);
|
|
1233
1138
|
}
|
|
1234
|
-
}
|
|
1235
|
-
|
|
1236
|
-
$(event.currentTarget).addClass('no-selection');
|
|
1237
|
-
//Enable draggable
|
|
1238
|
-
$(event.currentTarget).sortable('enable');
|
|
1239
|
-
//Set internal flag
|
|
1240
|
-
self.touching = true;
|
|
1241
|
-
//trigger touchstart again to enable draggable through touch punch
|
|
1242
|
-
$(self).trigger(event);
|
|
1243
|
-
//Choose preferred duration for taphold
|
|
1244
|
-
}, 350);
|
|
1139
|
+
});
|
|
1140
|
+
this.lastSelectedItem = $listItem;
|
|
1245
1141
|
}
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
|
|
1142
|
+
else {
|
|
1143
|
+
this.invokeEventCallback('selectionlimitexceed', { $event: evt });
|
|
1144
|
+
}
|
|
1145
|
+
}
|
|
1146
|
+
else {
|
|
1147
|
+
if (!$listItem.isActive || selectCount > 1) {
|
|
1148
|
+
this.clearSelectedItems();
|
|
1149
|
+
this.toggleListItemSelection($listItem);
|
|
1150
|
+
this.firstSelectedItem = this.lastSelectedItem = $listItem;
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
$appDigest();
|
|
1255
1154
|
}
|
|
1256
1155
|
}
|
|
1257
|
-
//
|
|
1258
|
-
|
|
1259
|
-
|
|
1260
|
-
}
|
|
1261
|
-
// returns listitem reference by index value.
|
|
1262
|
-
getListItemByIndex(index) {
|
|
1263
|
-
return this.listItems.toArray()[index];
|
|
1264
|
-
}
|
|
1265
|
-
/**
|
|
1266
|
-
* return index of an (listItemDirective) in the listItem
|
|
1267
|
-
* @param {ListItemDirective} item
|
|
1268
|
-
* @returns {number}
|
|
1269
|
-
*/
|
|
1270
|
-
getListItemIndex(item) {
|
|
1271
|
-
return this.listItems.toArray().indexOf(item);
|
|
1156
|
+
// Empty the list content on clear
|
|
1157
|
+
clear() {
|
|
1158
|
+
this.updateFieldDefs([]);
|
|
1272
1159
|
}
|
|
1273
1160
|
/**
|
|
1274
1161
|
* Returns ListItem Reference based on the input provided.
|
|
@@ -1285,11 +1172,51 @@ export class ListComponent extends StylableComponent {
|
|
|
1285
1172
|
}
|
|
1286
1173
|
return listItem;
|
|
1287
1174
|
}
|
|
1175
|
+
/**
|
|
1176
|
+
* deselects item in the list.
|
|
1177
|
+
* @param val: index | model of the list item.
|
|
1178
|
+
*/
|
|
1179
|
+
deselectItem(val) {
|
|
1180
|
+
const listItem = this.getItemRefByIndexOrModel(val);
|
|
1181
|
+
if (listItem && listItem.isActive) {
|
|
1182
|
+
this.toggleListItemSelection(listItem);
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
/**
|
|
1186
|
+
* selects item in the list.
|
|
1187
|
+
* @param val: index | model of the list item.
|
|
1188
|
+
*/
|
|
1189
|
+
selectItem(val, statePersistenceTriggered) {
|
|
1190
|
+
const listItem = this.getItemRefByIndexOrModel(val);
|
|
1191
|
+
if (!listItem) {
|
|
1192
|
+
return;
|
|
1193
|
+
}
|
|
1194
|
+
if (!listItem.isActive) {
|
|
1195
|
+
this.toggleListItemSelection(listItem, statePersistenceTriggered);
|
|
1196
|
+
}
|
|
1197
|
+
// focus the element.
|
|
1198
|
+
listItem.nativeElement.focus();
|
|
1199
|
+
}
|
|
1288
1200
|
beforePaginationChange($event, $index) {
|
|
1289
1201
|
this.invokeEventCallback('paginationchange', { $event, $index });
|
|
1290
1202
|
}
|
|
1291
|
-
|
|
1292
|
-
|
|
1203
|
+
handleEvent(node, eventName, eventCallback, locals) {
|
|
1204
|
+
// tap and doubleTap events are not getting propagated.So, using mouse events instead.
|
|
1205
|
+
const touchToMouse = {
|
|
1206
|
+
tap: 'click',
|
|
1207
|
+
doubletap: 'dblclick'
|
|
1208
|
+
};
|
|
1209
|
+
if (_.includes(['click', 'tap', 'dblclick', 'doubletap'], eventName)) {
|
|
1210
|
+
this.eventManager.addEventListener(this.nativeElement, touchToMouse[eventName] || eventName, (evt) => {
|
|
1211
|
+
const target = $(evt.target).closest('.app-list-item');
|
|
1212
|
+
if (target.length) {
|
|
1213
|
+
const listItemContext = target.data('listItemContext');
|
|
1214
|
+
if (!listItemContext.disableItem) {
|
|
1215
|
+
this.invokeEventCallback(eventName, { widget: listItemContext, $event: evt, item: listItemContext.item });
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1218
|
+
});
|
|
1219
|
+
}
|
|
1293
1220
|
}
|
|
1294
1221
|
// Invoke the datasource variable by default when pulltorefresh event is not specified.
|
|
1295
1222
|
subscribeToPullToRefresh() {
|
|
@@ -1299,6 +1226,19 @@ export class ListComponent extends StylableComponent {
|
|
|
1299
1226
|
}
|
|
1300
1227
|
}));
|
|
1301
1228
|
}
|
|
1229
|
+
ngOnInit() {
|
|
1230
|
+
super.ngOnInit();
|
|
1231
|
+
this.handleHeaderClick = noop;
|
|
1232
|
+
setTimeout(() => {
|
|
1233
|
+
this.debouncedFetchNextDatasetOnScroll = this.paginationService.debouncedFetchNextDatasetOnScroll(this.dataNavigator, DEBOUNCE_TIMES.PAGINATION_DEBOUNCE_TIME, this);
|
|
1234
|
+
}, 0);
|
|
1235
|
+
this._items = [];
|
|
1236
|
+
this.fieldDefs = [];
|
|
1237
|
+
this.reorderProps = {
|
|
1238
|
+
minIndex: null,
|
|
1239
|
+
maxIndex: null
|
|
1240
|
+
};
|
|
1241
|
+
}
|
|
1302
1242
|
setUpCUDHandlers() {
|
|
1303
1243
|
const $addItem = document.getElementsByClassName("add-list-item")[0];
|
|
1304
1244
|
if ($addItem) {
|
|
@@ -1308,7 +1248,59 @@ export class ListComponent extends StylableComponent {
|
|
|
1308
1248
|
});
|
|
1309
1249
|
}
|
|
1310
1250
|
}
|
|
1311
|
-
|
|
1251
|
+
ngAfterViewInit() {
|
|
1252
|
+
this.promiseResolverFn();
|
|
1253
|
+
this.propsInitPromise.then(() => {
|
|
1254
|
+
super.ngAfterViewInit();
|
|
1255
|
+
this.setUpCUDHandlers();
|
|
1256
|
+
this.selectedItemWidgets = this.multiselect ? [] : {};
|
|
1257
|
+
var ele = $(this.nativeElement).find('.app-livelist-container');
|
|
1258
|
+
if (this.enablereorder && !this.groupby) {
|
|
1259
|
+
if (ele) {
|
|
1260
|
+
ele.attr('aria-describedby', this.titleId);
|
|
1261
|
+
}
|
|
1262
|
+
this.configureDnD();
|
|
1263
|
+
}
|
|
1264
|
+
if (!this.enablereorder) {
|
|
1265
|
+
if (ele) {
|
|
1266
|
+
ele.removeAttr('aria-describedby');
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
if (this.groupby && this.collapsible) {
|
|
1270
|
+
this.handleHeaderClick = handleHeaderClick;
|
|
1271
|
+
this.toggleAllHeaders = toggleAllHeaders.bind(undefined, this);
|
|
1272
|
+
}
|
|
1273
|
+
setListClass(this);
|
|
1274
|
+
});
|
|
1275
|
+
this.setupHandlers();
|
|
1276
|
+
const $ul = this.nativeElement.querySelector('ul.app-livelist-container');
|
|
1277
|
+
styler($ul, this, APPLY_STYLES_TYPE.SCROLLABLE_CONTAINER);
|
|
1278
|
+
if (this.enablereorder) {
|
|
1279
|
+
if ($ul) {
|
|
1280
|
+
$ul.setAttribute('aria-describedby', this.titleId);
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1283
|
+
if (!this.enablereorder) {
|
|
1284
|
+
if ($ul) {
|
|
1285
|
+
$ul.removeAttribute('aria-describedby');
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
if (isMobileApp() && $ul.querySelector('.app-list-item-action-panel')) {
|
|
1289
|
+
this._listAnimator = new ListAnimator(this);
|
|
1290
|
+
}
|
|
1291
|
+
}
|
|
1292
|
+
ngOnDestroy() {
|
|
1293
|
+
if (this._listAnimator && this._listAnimator.$btnSubscription) {
|
|
1294
|
+
this._listAnimator.$btnSubscription.unsubscribe();
|
|
1295
|
+
}
|
|
1296
|
+
this._listenerDestroyers.forEach(d => d && d());
|
|
1297
|
+
super.ngOnDestroy();
|
|
1298
|
+
}
|
|
1299
|
+
ngOnDetach() {
|
|
1300
|
+
super.ngOnDetach();
|
|
1301
|
+
this._pageLoad = true;
|
|
1302
|
+
}
|
|
1303
|
+
static { this.ɵfac = function ListComponent_Factory(t) { return new (t || ListComponent)(i0.ɵɵdirectiveInject(i0.Injector), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i1.ToDatePipe), i0.ɵɵdirectiveInject(i2.App), i0.ɵɵdirectiveInject(i2.AppDefaults), i0.ɵɵdirectiveInject(i0.NgZone), i0.ɵɵinjectAttribute('itemclass.bind'), i0.ɵɵinjectAttribute('disableitem.bind'), i0.ɵɵinjectAttribute('dataset.bind'), i0.ɵɵinjectAttribute('datasource.bind'), i0.ɵɵinjectAttribute('mouseenter.event'), i0.ɵɵinjectAttribute('mouseleave.event'), i0.ɵɵdirectiveInject(i2.StatePersistence), i0.ɵɵdirectiveInject(i2.PaginationService)); }; }
|
|
1312
1304
|
static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ListComponent, selectors: [["div", "wmList", ""]], contentQueries: function ListComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
|
|
1313
1305
|
i0.ɵɵcontentQuery(dirIndex, _c0, 5);
|
|
1314
1306
|
i0.ɵɵcontentQuery(dirIndex, _c1, 5);
|
|
@@ -1329,55 +1321,61 @@ export class ListComponent extends StylableComponent {
|
|
|
1329
1321
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.listItems = _t);
|
|
1330
1322
|
} }, features: [i0.ɵɵProvidersFeature([
|
|
1331
1323
|
provideAsWidgetRef(ListComponent)
|
|
1332
|
-
]), i0.ɵɵInheritDefinitionFeature], attrs: _c3, decls: 16, vars: 19, consts: [["
|
|
1333
|
-
|
|
1334
|
-
i0.ɵɵtemplate(
|
|
1324
|
+
]), i0.ɵɵInheritDefinitionFeature], attrs: _c3, decls: 16, vars: 19, consts: [["class", "panel-heading", 4, "ngIf"], ["class", "app-datanavigator", "aria-label", "Page navigation", 4, "ngIf"], ["aria-live", "polite", "aria-atomic", "true", "class", "sr-only", 4, "ngIf"], ["class", "sr-only", 3, "id", 4, "ngIf"], ["aria-live", "assertive", "class", "sr-only", 4, "ngIf"], ["role", "list", 3, "hidden", "keydown.enter", "keydown.space", "keydown.arrowup", "keydown.arrowdown", "keydown.arrowleft", "keydown.arrowright", "keydown.shift.arrowup", "keydown.shift.arrowdown", "keydown.shift.arrowleft", "keydown.shift.arrowright"], [3, "ngIf", "ngIfElse"], [3, "ngTemplateOutlet"], ["class", "no-data-msg", 3, "textContent", 4, "ngIf"], ["class", "loading-data-msg", 4, "ngIf"], ["class", "app-datanavigator", 4, "ngIf"], ["class", "panel-footer", 3, "hidden", 4, "ngIf"], ["groupedListTemplate", ""], [1, "panel-heading"], [1, "panel-title"], [1, "pull-left"], ["aria-hidden", "true", 3, "hidden"], [1, "heading", 3, "innerHTML"], [1, "description", 3, "innerHTML"], ["aria-label", "Page navigation", 1, "app-datanavigator"], [1, "pager"], [1, "previous", 3, "ngClass"], ["href", "javascript:void(0);", 3, "click"], ["aria-hidden", "true", 1, "wi", "wi-chevron-left"], [1, "sr-only"], ["aria-live", "polite", "aria-atomic", "true", 1, "sr-only"], [1, "sr-only", 3, "id"], ["aria-live", "assertive", 1, "sr-only"], ["role", "listitem", 3, "class", "ngClass", "wmListItem", 4, "ngFor", "ngForOf"], ["role", "listitem", 3, "ngClass", "wmListItem"], ["listItemRef", "listItemRef"], [3, "ngTemplateOutlet", "ngTemplateOutletContext"], [1, "no-data-msg", 3, "textContent"], [1, "loading-data-msg"], ["aria-hidden", "true", 1, "app-icon", "panel-icon", "fa-spin", 3, "ngClass"], [1, "loading-text", 3, "textContent"], [1, "app-datanavigator"], [1, "next", 3, "ngClass"], ["aria-hidden", "true", 1, "wi", "wi-chevron-right"], [1, "panel-footer", 3, "hidden"], ["wmPagination", "", "navigationalign.bind", "navigationalign", "navigation.bind", "navControls", "showrecordcount.bind", "showrecordcount", "maxsize.bind", "maxsize", "boundarylinks.bind", "boundarylinks", "forceellipses.bind", "forceellipses", "directionlinks.bind", "directionlinks", "show.bind", "!onDemandLoad", "paginationchange.event", "beforePaginationChange($event, $index)"], ["href", "javascript:void(0);", "class", "app-button btn btn-block", 3, "ngClass", "textContent", "click", 4, "ngIf"], ["href", "javascript:void(0);", 1, "app-button", "btn", "btn-block", 3, "ngClass", "textContent", "click"], ["class", "app-list-item-group clearfix", 4, "ngFor", "ngForOf"], [1, "app-list-item-group", "clearfix"], [1, "list-group", "item-group", 3, "ngClass"], [1, "app-list-item-header", "list-item", "list-group-header", 3, "ngClass", "click"], [1, "header-action"], ["class", "app-icon wi action wi-chevron-up", 4, "ngIf"], ["class", "label label-default", 4, "ngIf"], [3, "class", "ngClass", "wmListItem", 4, "ngFor", "ngForOf"], [1, "app-icon", "wi", "action", "wi-chevron-up"], [1, "label", "label-default"], [3, "ngClass", "wmListItem"]], template: function ListComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1325
|
+
i0.ɵɵtemplate(0, ListComponent_div_0_Template, 7, 6, "div", 0);
|
|
1326
|
+
i0.ɵɵtemplate(1, ListComponent_div_1_Template, 7, 6, "div", 1);
|
|
1327
|
+
i0.ɵɵtemplate(2, ListComponent_div_2_Template, 2, 1, "div", 2);
|
|
1335
1328
|
i0.ɵɵelementStart(3, "div");
|
|
1336
|
-
i0.ɵɵtemplate(4, ListComponent_div_4_Template, 2, 1, "div",
|
|
1329
|
+
i0.ɵɵtemplate(4, ListComponent_div_4_Template, 2, 1, "div", 3);
|
|
1330
|
+
i0.ɵɵtemplate(5, ListComponent_div_5_Template, 2, 1, "div", 4);
|
|
1337
1331
|
i0.ɵɵelementEnd();
|
|
1338
|
-
i0.ɵɵelementStart(6, "ul",
|
|
1339
|
-
i0.ɵɵlistener("keydown.enter", function ListComponent_Template_ul_keydown_enter_6_listener($event) {
|
|
1340
|
-
i0.ɵɵtemplate(7, ListComponent_ng_template_7_Template, 1, 1, "ng-template",
|
|
1341
|
-
i0.ɵɵelementContainer(8,
|
|
1332
|
+
i0.ɵɵelementStart(6, "ul", 5);
|
|
1333
|
+
i0.ɵɵlistener("keydown.enter", function ListComponent_Template_ul_keydown_enter_6_listener($event) { return ctx.handleKeyDown($event, "select"); })("keydown.space", function ListComponent_Template_ul_keydown_space_6_listener($event) { return ctx.handleKeyDown($event, "space"); })("keydown.arrowup", function ListComponent_Template_ul_keydown_arrowup_6_listener($event) { return ctx.handleKeyDown($event, "focusPrev"); })("keydown.arrowdown", function ListComponent_Template_ul_keydown_arrowdown_6_listener($event) { return ctx.handleKeyDown($event, "focusNext"); })("keydown.arrowleft", function ListComponent_Template_ul_keydown_arrowleft_6_listener($event) { return ctx.handleKeyDown($event, "focusPrev"); })("keydown.arrowright", function ListComponent_Template_ul_keydown_arrowright_6_listener($event) { return ctx.handleKeyDown($event, "focusNext"); })("keydown.shift.arrowup", function ListComponent_Template_ul_keydown_shift_arrowup_6_listener($event) { return ctx.handleKeyDown($event, "selectPrev"); })("keydown.shift.arrowdown", function ListComponent_Template_ul_keydown_shift_arrowdown_6_listener($event) { return ctx.handleKeyDown($event, "selectNext"); })("keydown.shift.arrowleft", function ListComponent_Template_ul_keydown_shift_arrowleft_6_listener($event) { return ctx.handleKeyDown($event, "selectPrev"); })("keydown.shift.arrowright", function ListComponent_Template_ul_keydown_shift_arrowright_6_listener($event) { return ctx.handleKeyDown($event, "selectNext"); });
|
|
1334
|
+
i0.ɵɵtemplate(7, ListComponent_ng_template_7_Template, 1, 1, "ng-template", 6);
|
|
1335
|
+
i0.ɵɵelementContainer(8, 7)(9, 7);
|
|
1342
1336
|
i0.ɵɵelementEnd();
|
|
1343
|
-
i0.ɵɵtemplate(10, ListComponent_div_10_Template, 1, 1, "div",
|
|
1337
|
+
i0.ɵɵtemplate(10, ListComponent_div_10_Template, 1, 1, "div", 8);
|
|
1338
|
+
i0.ɵɵtemplate(11, ListComponent_div_11_Template, 6, 2, "div", 9);
|
|
1339
|
+
i0.ɵɵtemplate(12, ListComponent_div_12_Template, 7, 6, "div", 10);
|
|
1340
|
+
i0.ɵɵtemplate(13, ListComponent_div_13_Template, 3, 2, "div", 11);
|
|
1341
|
+
i0.ɵɵtemplate(14, ListComponent_ng_template_14_Template, 1, 1, "ng-template", null, 12, i0.ɵɵtemplateRefExtractor);
|
|
1344
1342
|
} if (rf & 2) {
|
|
1345
|
-
const
|
|
1343
|
+
const _r10 = i0.ɵɵreference(15);
|
|
1346
1344
|
i0.ɵɵproperty("ngIf", ctx.title || ctx.subheading || ctx.iconclass);
|
|
1347
|
-
i0.ɵɵadvance();
|
|
1345
|
+
i0.ɵɵadvance(1);
|
|
1348
1346
|
i0.ɵɵproperty("ngIf", ctx.navigation === "Inline" && !ctx.noDataFound);
|
|
1349
|
-
i0.ɵɵadvance();
|
|
1347
|
+
i0.ɵɵadvance(1);
|
|
1350
1348
|
i0.ɵɵproperty("ngIf", ctx.navigation === "Inline" && !ctx.noDataFound);
|
|
1351
1349
|
i0.ɵɵadvance(2);
|
|
1352
1350
|
i0.ɵɵproperty("ngIf", ctx.enablereorder);
|
|
1353
|
-
i0.ɵɵadvance();
|
|
1351
|
+
i0.ɵɵadvance(1);
|
|
1354
1352
|
i0.ɵɵproperty("ngIf", ctx.listItems && ctx.enablereorder && ctx.currentIndex);
|
|
1355
|
-
i0.ɵɵadvance();
|
|
1353
|
+
i0.ɵɵadvance(1);
|
|
1356
1354
|
i0.ɵɵclassMapInterpolate2("app-livelist-container clearfix ", ctx.direction === "horizontal" ? "app-horizontal-list" : "", " ", ctx.listclass, "");
|
|
1357
1355
|
i0.ɵɵproperty("hidden", ctx.noDataFound && !ctx.variableInflight);
|
|
1358
1356
|
i0.ɵɵattribute("tabindex", ctx.tabindex);
|
|
1359
|
-
i0.ɵɵadvance();
|
|
1360
|
-
i0.ɵɵproperty("ngIf", !ctx.groupby)("ngIfElse",
|
|
1361
|
-
i0.ɵɵadvance();
|
|
1357
|
+
i0.ɵɵadvance(1);
|
|
1358
|
+
i0.ɵɵproperty("ngIf", !ctx.groupby)("ngIfElse", _r10);
|
|
1359
|
+
i0.ɵɵadvance(1);
|
|
1362
1360
|
i0.ɵɵproperty("ngTemplateOutlet", ctx.listLeftActionTemplate);
|
|
1363
|
-
i0.ɵɵadvance();
|
|
1361
|
+
i0.ɵɵadvance(1);
|
|
1364
1362
|
i0.ɵɵproperty("ngTemplateOutlet", ctx.listRightActionTemplate);
|
|
1365
|
-
i0.ɵɵadvance();
|
|
1363
|
+
i0.ɵɵadvance(1);
|
|
1366
1364
|
i0.ɵɵproperty("ngIf", ctx.noDataFound && !ctx.variableInflight);
|
|
1367
|
-
i0.ɵɵadvance();
|
|
1365
|
+
i0.ɵɵadvance(1);
|
|
1368
1366
|
i0.ɵɵproperty("ngIf", ctx.variableInflight && !ctx.pulltorefresh);
|
|
1369
|
-
i0.ɵɵadvance();
|
|
1367
|
+
i0.ɵɵadvance(1);
|
|
1370
1368
|
i0.ɵɵproperty("ngIf", ctx.navigation === "Inline" && !ctx.noDataFound);
|
|
1371
|
-
i0.ɵɵadvance();
|
|
1369
|
+
i0.ɵɵadvance(1);
|
|
1372
1370
|
i0.ɵɵproperty("ngIf", ctx.navigation !== "None");
|
|
1373
1371
|
} }, encapsulation: 2 }); }
|
|
1374
1372
|
}
|
|
1375
|
-
(()
|
|
1373
|
+
(function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ListComponent, [{
|
|
1376
1374
|
type: Component,
|
|
1377
1375
|
args: [{ selector: 'div[wmList]', providers: [
|
|
1378
1376
|
provideAsWidgetRef(ListComponent)
|
|
1379
|
-
], template: "<div class=\"panel-heading\" *ngIf=\"title || subheading || iconclass\">\n <h3 class=\"panel-title\">\n <div class=\"pull-left\">\n <i class=\"app-icon panel-icon {{iconclass}}\" aria-hidden=\"true\" [hidden]=\"!iconclass\"></i>\n </div>\n <div class=\"pull-left\">\n <div class=\"heading\" [innerHTML]=\"title\"></div>\n <div class=\"description\" [innerHTML]=\"subheading\"></div>\n </div>\n </h3>\n</div>\n\n<div class=\"app-datanavigator\" [attr.aria-disabled]=\"dataNavigator.isDisablePrevious\" aria-label=\"Page navigation\" *ngIf=\"navigation === 'Inline' && !noDataFound\">\n <ul class=\"pager\">\n <li class=\"previous\" [ngClass]=\"{'disabled': (dataNavigator ? dataNavigator.isDisablePrevious : true)}\">\n <a href=\"javascript:void(0);\" (click)=\"dataNavigator.navigatePage('prev', $event)\"\n [attr.aria-disabled]=\"dataNavigator.isDisablePrevious\">\n <i class=\"wi wi-chevron-left\" aria-hidden=\"true\"></i>\n <span class=\"sr-only\">Go to Previous page {{dataNavigator.isDisablePrevious ? ', Disabled' : ''}}</span>\n </a>\n </li>\n </ul>\n</div>\n<div *ngIf=\"navigation === 'Inline' && !noDataFound\" aria-live=\"polite\" aria-atomic=\"true\" class=\"sr-only\"> {{'Page ' + dataNavigator.dn.currentPage + ' of ' + dataNavigator.pageCount }}</div>\n\n<div>\n <div id={{titleId}} class=\"sr-only\" *ngIf=\"enablereorder\">\n Press space bar to toggle drag drop mode, use arrow keys to move selected elements.\n </div>\n\n <div aria-live=\"assertive\" *ngIf=\"listItems && enablereorder && currentIndex\" class=\"sr-only\" >\n {{ariaText + currentIndex + ' of ' + listItems.length}}\n </div>\n</div>\n\n<ul [attr.tabindex]=\"tabindex\" class=\"app-livelist-container clearfix {{direction === 'horizontal' ? 'app-horizontal-list': ''}} {{listclass}}\" role=\"list\"\n (keydown.enter)=\"handleKeyDown($event, 'select')\"\n\n (keydown.space)=\"handleKeyDown($event, 'space')\"\n\n (keydown.arrowup)=\"handleKeyDown($event, 'focusPrev')\"\n (keydown.arrowdown)=\"handleKeyDown($event, 'focusNext')\"\n (keydown.arrowleft)=\"handleKeyDown($event, 'focusPrev')\"\n (keydown.arrowright)=\"handleKeyDown($event, 'focusNext')\"\n\n (keydown.shift.arrowup)=\"handleKeyDown($event, 'selectPrev')\"\n (keydown.shift.arrowdown)=\"handleKeyDown($event, 'selectNext')\"\n (keydown.shift.arrowleft)=\"handleKeyDown($event, 'selectPrev')\"\n (keydown.shift.arrowright)=\"handleKeyDown($event, 'selectNext')\"\n [hidden]=\"noDataFound && !variableInflight\"\n>\n <ng-template [ngIf]=\"!groupby\" [ngIfElse]=\"groupedListTemplate\">\n <li *ngFor=\"let item of fieldDefs; index as $index; first as $first; last as $last;\" class=\"app-list-item {{direction === 'horizontal' ? '' : itemsPerRowClass}}\" [ngClass]=\"listItemRef.itemClass\"\n [wmListItem]=\"item\"\n #listItemRef=\"listItemRef\"\n [attr.tabindex]=\"tabindex\"\n role=\"listitem\">\n <ng-container [ngTemplateOutlet]=\"listTemplate\"
|
|
1380
|
-
}], ()
|
|
1377
|
+
], template: "<div class=\"panel-heading\" *ngIf=\"title || subheading || iconclass\">\n <h3 class=\"panel-title\">\n <div class=\"pull-left\">\n <i class=\"app-icon panel-icon {{iconclass}}\" aria-hidden=\"true\" [hidden]=\"!iconclass\"></i>\n </div>\n <div class=\"pull-left\">\n <div class=\"heading\" [innerHTML]=\"title\"></div>\n <div class=\"description\" [innerHTML]=\"subheading\"></div>\n </div>\n </h3>\n</div>\n\n<div class=\"app-datanavigator\" [attr.aria-disabled]=\"dataNavigator.isDisablePrevious\" aria-label=\"Page navigation\" *ngIf=\"navigation === 'Inline' && !noDataFound\">\n <ul class=\"pager\">\n <li class=\"previous\" [ngClass]=\"{'disabled': (dataNavigator ? dataNavigator.isDisablePrevious : true)}\">\n <a href=\"javascript:void(0);\" (click)=\"dataNavigator.navigatePage('prev', $event)\"\n [attr.aria-disabled]=\"dataNavigator.isDisablePrevious\">\n <i class=\"wi wi-chevron-left\" aria-hidden=\"true\"></i>\n <span class=\"sr-only\">Go to Previous page {{dataNavigator.isDisablePrevious ? ', Disabled' : ''}}</span>\n </a>\n </li>\n </ul>\n</div>\n<div *ngIf=\"navigation === 'Inline' && !noDataFound\" aria-live=\"polite\" aria-atomic=\"true\" class=\"sr-only\"> {{'Page ' + dataNavigator.dn.currentPage + ' of ' + dataNavigator.pageCount }}</div>\n\n<div>\n <div id={{titleId}} class=\"sr-only\" *ngIf=\"enablereorder\">\n Press space bar to toggle drag drop mode, use arrow keys to move selected elements.\n </div>\n\n <div aria-live=\"assertive\" *ngIf=\"listItems && enablereorder && currentIndex\" class=\"sr-only\" >\n {{ariaText + currentIndex + ' of ' + listItems.length}}\n </div>\n</div>\n\n<ul [attr.tabindex]=\"tabindex\" class=\"app-livelist-container clearfix {{direction === 'horizontal' ? 'app-horizontal-list': ''}} {{listclass}}\" role=\"list\"\n (keydown.enter)=\"handleKeyDown($event, 'select')\"\n\n (keydown.space)=\"handleKeyDown($event, 'space')\"\n\n (keydown.arrowup)=\"handleKeyDown($event, 'focusPrev')\"\n (keydown.arrowdown)=\"handleKeyDown($event, 'focusNext')\"\n (keydown.arrowleft)=\"handleKeyDown($event, 'focusPrev')\"\n (keydown.arrowright)=\"handleKeyDown($event, 'focusNext')\"\n\n (keydown.shift.arrowup)=\"handleKeyDown($event, 'selectPrev')\"\n (keydown.shift.arrowdown)=\"handleKeyDown($event, 'selectNext')\"\n (keydown.shift.arrowleft)=\"handleKeyDown($event, 'selectPrev')\"\n (keydown.shift.arrowright)=\"handleKeyDown($event, 'selectNext')\"\n [hidden]=\"noDataFound && !variableInflight\"\n>\n <ng-template [ngIf]=\"!groupby\" [ngIfElse]=\"groupedListTemplate\">\n <li *ngFor=\"let item of fieldDefs; index as $index; first as $first; last as $last;\" class=\"app-list-item {{direction === 'horizontal' ? '' : itemsPerRowClass}}\" [ngClass]=\"listItemRef.itemClass\"\n [wmListItem]=\"item\"\n #listItemRef=\"listItemRef\"\n [attr.tabindex]=\"tabindex\"\n role=\"listitem\">\n <ng-container [ngTemplateOutlet]=\"listTemplate\" [ngTemplateOutletContext]=\"{item: item, $index: $index, itemRef: listItemRef, $first: $first, $last: $last, currentItemWidgets: listItemRef.currentItemWidgets}\"></ng-container>\n </li>\n </ng-template>\n <ng-container [ngTemplateOutlet]=\"listLeftActionTemplate\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"listRightActionTemplate\"></ng-container>\n</ul>\n\n<div class=\"no-data-msg\" *ngIf=\"noDataFound && !variableInflight\" [textContent]=\"nodatamessage\"></div>\n\n<div class=\"loading-data-msg\" *ngIf=\"variableInflight && !pulltorefresh\">\n <span>\n <i class=\"app-icon panel-icon fa-spin\" aria-hidden=\"true\" [ngClass]=\"loadingicon\"></i>\n <span class=\"sr-only\">Loading</span>\n <span class=\"loading-text\" [textContent]=\"loadingdatamsg\"></span>\n </span>\n</div>\n\n<div class=\"app-datanavigator\" [attr.aria-disabled]=\"dataNavigator.isDisableNext\" *ngIf=\"navigation === 'Inline' && !noDataFound\">\n <ul class=\"pager\">\n <li class=\"next\" [ngClass]=\"{'disabled': (dataNavigator ? dataNavigator.isDisableNext : true)}\">\n <a href=\"javascript:void(0);\" (click)=\"dataNavigator.navigatePage('next', $event)\"\n [attr.aria-disabled]=\"dataNavigator.isDisableNext\">\n <i class=\"wi wi-chevron-right\" aria-hidden=\"true\"></i>\n <span class=\"sr-only\">Go to Next page {{dataNavigator.isDisableNext ? ', Disabled' : ''}}</span>\n </a>\n </li>\n </ul>\n</div>\n\n<div class=\"panel-footer\" *ngIf=\"navigation !== 'None'\" [hidden]=\"!showNavigation || (onDemandLoad && dataNavigator.isDisableNext) || (dataNavigator.dataSize <= pagesize) || (!dataNavigator.dataSize && !dataNavigator.datasource?.pagination?.next)\">\n <nav wmPagination\n navigationalign.bind=\"navigationalign\"\n navigation.bind=\"navControls\"\n showrecordcount.bind=\"showrecordcount\"\n maxsize.bind=\"maxsize\"\n boundarylinks.bind=\"boundarylinks\"\n forceellipses.bind=\"forceellipses\"\n directionlinks.bind=\"directionlinks\"\n show.bind=\"!onDemandLoad\"\n paginationchange.event=\"beforePaginationChange($event, $index)\"\n ></nav>\n <a *ngIf=\"onDemandLoad\" href=\"javascript:void(0);\"\n (click)=\"dataNavigator.navigatePage('next', $event)\"\n class=\"app-button btn btn-block\"\n [ngClass]=\"paginationclass\"\n [textContent]=\"ondemandmessage\"\n ></a>\n</div>\n\n<!--This template will be displayed when groupby is specified-->\n<ng-template #groupedListTemplate>\n <li *ngFor=\"let groupObj of groupedData\" class=\"app-list-item-group clearfix\">\n <ul [attr.tabindex]=\"tabindex\" class=\"list-group item-group\" [ngClass]=\"listclass\">\n <li class=\"app-list-item-header list-item list-group-header\" (click)=\"handleHeaderClick($event)\" [ngClass]=\"{'collapsible-content': collapsible}\">\n <h4>{{groupObj.key}}\n <div class=\"header-action\">\n <i class=\"app-icon wi action wi-chevron-up\" *ngIf=\"collapsible\"></i>\n <span *ngIf=\"showcount\" class=\"label label-default\">{{groupObj.data.length}}</span>\n </div>\n </h4>\n </li>\n <ul class=\"list-group clearfix {{direction === 'horizontal' ? 'app-horizontal-list': ''}}\">\n <li *ngFor=\"let item of groupObj.data; index as $index; first as $first; last as $last;\" [attr.tabindex]=\"tabindex\"\n class=\"app-list-item group-list-item {{itemsPerRowClass}}\"\n [ngClass]=\"listItemRef.itemClass\"\n [wmListItem]=\"item\" #listItemRef=\"listItemRef\">\n <ng-container [ngTemplateOutlet]=\"listTemplate\" [ngTemplateOutletContext]=\"{item: item, $index: $index, itemRef: listItemRef, $first: $first, $last: $last, currentItemWidgets: listItemRef.currentItemWidgets}\"></ng-container>\n </li>\n </ul>\n </ul>\n </li>\n</ng-template>\n" }]
|
|
1378
|
+
}], function () { return [{ type: i0.Injector }, { type: i0.ChangeDetectorRef }, { type: i1.ToDatePipe }, { type: i2.App }, { type: i2.AppDefaults }, { type: i0.NgZone }, { type: undefined, decorators: [{
|
|
1381
1379
|
type: Attribute,
|
|
1382
1380
|
args: ['itemclass.bind']
|
|
1383
1381
|
}] }, { type: undefined, decorators: [{
|
|
@@ -1395,12 +1393,7 @@ export class ListComponent extends StylableComponent {
|
|
|
1395
1393
|
}] }, { type: undefined, decorators: [{
|
|
1396
1394
|
type: Attribute,
|
|
1397
1395
|
args: ['mouseleave.event']
|
|
1398
|
-
}] }, { type: i2.StatePersistence }, { type: i2.PaginationService }, {
|
|
1399
|
-
type: Inject,
|
|
1400
|
-
args: ['EXPLICIT_CONTEXT']
|
|
1401
|
-
}, {
|
|
1402
|
-
type: Optional
|
|
1403
|
-
}] }], { listTemplate: [{
|
|
1396
|
+
}] }, { type: i2.StatePersistence }, { type: i2.PaginationService }]; }, { listTemplate: [{
|
|
1404
1397
|
type: ContentChild,
|
|
1405
1398
|
args: ['listTemplate']
|
|
1406
1399
|
}], listLeftActionTemplate: [{
|
|
@@ -1419,5 +1412,4 @@ export class ListComponent extends StylableComponent {
|
|
|
1419
1412
|
type: ViewChildren,
|
|
1420
1413
|
args: [ListItemDirective]
|
|
1421
1414
|
}] }); })();
|
|
1422
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ListComponent, { className: "ListComponent", filePath: "list.component.ts", lineNumber: 91 }); })();
|
|
1423
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvZGF0YS9saXN0L3NyYy9saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9kYXRhL2xpc3Qvc3JjL2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ0gsTUFBTSxFQUNsQixRQUFRLEVBQ1IsTUFBTSxFQUdOLFFBQVEsRUFDUixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUNILFVBQVUsRUFDVixlQUFlLEVBQ2YsR0FBRyxFQUNILFdBQVcsRUFDWCxVQUFVLEVBQ1YsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsUUFBUSxFQUNSLFdBQVcsRUFDWCxRQUFRLEVBQ1IsSUFBSSxFQUNKLFdBQVcsRUFDWCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixZQUFZLEVBQ2YsTUFBTSxVQUFVLENBQUM7QUFDbEIsT0FBTyxFQUNILGlCQUFpQixFQUNqQixZQUFZLEVBQ1osY0FBYyxFQUNkLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLGVBQWUsRUFDZixnQ0FBZ0MsRUFDaEMsa0JBQWtCLEVBQ2xCLGlCQUFpQixFQUNqQixNQUFNLEVBQ04sVUFBVSxFQUNWLGdCQUFnQixFQUVoQixxQkFBcUIsRUFDeEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUMzQyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUNILEtBQUssRUFDTCxTQUFTLEVBQ1QsT0FBTyxFQUNQLEdBQUcsRUFBRSxHQUFHLEVBQ1IsUUFBUSxFQUNSLE9BQU8sRUFDUCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFFBQVEsRUFDUixRQUFRLEVBQ1IsV0FBVyxFQUNYLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQzlELE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7SUMxRVgsQUFESixBQURKLCtCQUFvRSxhQUN4QyxjQUNHO0lBQ25CLHdCQUEwRjtJQUM5RixpQkFBTTtJQUNOLCtCQUF1QjtJQUVuQixBQURBLDBCQUErQyxjQUNTO0lBR3BFLEFBREksQUFESSxpQkFBTSxFQUNMLEVBQ0g7OztJQVBTLGVBQXlDO0lBQXpDLHVFQUF5QztJQUFvQiwwQ0FBcUI7SUFHaEUsZUFBbUI7SUFBbkIsMkRBQW1CO0lBQ2YsY0FBd0I7SUFBeEIsZ0VBQXdCOzs7O0lBUWpELEFBREosQUFESixBQURKLCtCQUFtSyxhQUM3SSxhQUMwRixZQUUxQztJQUQ1QiwwS0FBUyxrQ0FBMkIsTUFBTSxTQUFTLEtBQUM7SUFFOUUsd0JBQXFEO0lBQ3JELGdDQUFzQjtJQUFBLFlBQTJFO0lBSWpILEFBREksQUFESSxBQURJLEFBRHFHLGlCQUFPLEVBQ3hHLEVBQ0gsRUFDSixFQUNIOzs7O0lBUnVCLGVBQWtGO0lBQWxGLDBIQUFrRjtJQUVoRyxjQUFzRDs7SUFFL0IsZUFBMkU7SUFBM0UsNkdBQTJFOzs7SUFLakgsK0JBQTJHO0lBQUMsWUFBOEU7SUFBQSxpQkFBTTs7O0lBQXBGLGNBQThFO0lBQTlFLHVIQUE4RTs7O0lBR3RMLCtCQUEwRDtJQUN0RCxxR0FDSjtJQUFBLGlCQUFNOzs7SUFGRCw4Q0FBYzs7O0lBSW5CLCtCQUErRjtJQUMzRixZQUNKO0lBQUEsaUJBQU07OztJQURGLGNBQ0o7SUFESSx5R0FDSjs7O0lBb0JJLGlDQUlvQjtJQUNoQiw0QkFFOEw7SUFDbE0saUJBQUs7Ozs7Ozs7O0lBUmdGLGlIQUE0RTtJQUM3SixBQUQ4SixrREFBaUMsdUJBQzVLOztJQUlMLGVBQWlDO0lBRWpDLEFBREEsQUFEQSxzREFBaUMsc01BQ3dLLG9KQUN6Qzs7O0lBUGxMLDRFQUlvQjs7O0lBSkMsMENBQWM7OztJQWMzQywwQkFBc0c7OztJQUFwQyxrREFBNkI7OztJQUczRixBQURKLCtCQUF5RSxXQUMvRDtJQUNGLHdCQUFzRjtJQUN0RixnQ0FBc0I7SUFBQSx1QkFBTztJQUFBLGlCQUFPO0lBQ3BDLDJCQUFpRTtJQUV6RSxBQURJLGlCQUFPLEVBQ0w7OztJQUo0RCxlQUF1QjtJQUF2Qiw0Q0FBdUI7SUFFdEQsZUFBOEI7SUFBOUIsbURBQThCOzs7O0lBT3JELEFBREosQUFESixBQURKLCtCQUFrSSxhQUM1RyxhQUNtRixZQUV2QztJQUR4QiwyS0FBUyxrQ0FBMkIsTUFBTSxTQUFTLEtBQUM7SUFFOUUsd0JBQXNEO0lBQ3RELGdDQUFzQjtJQUFBLFlBQW1FO0lBSXpHLEFBREksQUFESSxBQURJLEFBRDZGLGlCQUFPLEVBQ2hHLEVBQ0gsRUFDSixFQUNIOzs7O0lBUm1CLGVBQStFO0lBQS9FLHNIQUErRTtJQUV6RixjQUFrRDs7SUFFM0IsZUFBbUU7SUFBbkUscUdBQW1FOzs7O0lBa0JyRyw2QkFLQztJQUpFLGlMQUFTLGtDQUEyQixNQUFNLFNBQVMsS0FBQztJQUl0RCxpQkFBSTs7O0lBREYsQUFEQSxnREFBMkIsdUNBQ0k7OztJQWhCdEMsK0JBQXdQO0lBQ3BQLDBCQVVPO0lBQ1Asa0VBS0M7SUFDTCxpQkFBTTs7O0lBbEJrRCxxV0FBK0w7SUFZL08sZUFBa0I7SUFBbEIsMENBQWtCOzs7SUFlTix3QkFBb0U7OztJQUNwRSxnQ0FBb0Q7SUFBQSxZQUF3QjtJQUFBLGlCQUFPOzs7SUFBL0IsY0FBd0I7SUFBeEIsOENBQXdCOzs7SUFLaEYsaUNBR21EO0lBQy9DLDRCQUU4TDtJQUNsTSxpQkFBSzs7Ozs7Ozs7O0lBTkQsd0ZBQTBEO0lBRTFELEFBREEsbURBQWlDLHdCQUNkOztJQUNMLGVBQWlDO0lBRWpDLEFBREEsQUFEQSxzREFBaUMsME9BQ2lNLDBKQUNsRTs7OztJQWZ0TCxBQURKLEFBREosOEJBQXVHLGFBQ2hCLGFBQ21FO0lBQXJGLDJMQUFTLGdDQUF5QixLQUFDO0lBQ2hHLDBCQUFJO0lBQUEsWUFDQTtJQUFBLCtCQUEyQjtJQUV2QixBQURBLCtFQUFnRSx3RUFDWjtJQUc1RCxBQURJLEFBREksaUJBQU0sRUFDTCxFQUNKO0lBQ0wsMEJBQTJGO0lBQ3ZGLGtGQUdtRDtJQU8vRCxBQURJLEFBREksaUJBQUssRUFDSixFQUNKOzs7O0lBcEI0RCxjQUFxQjtJQUFyQiwwQ0FBcUI7O0lBQ21CLGNBQWdEO0lBQWhELHlFQUFnRDtJQUM3SSxlQUNBO0lBREEsZ0RBQ0E7SUFDaUQsZUFBaUI7SUFBakIseUNBQWlCO0lBQ3ZELGNBQWU7SUFBZix1Q0FBZTtJQUkxQixjQUFzRjtJQUF0RixxSEFBc0Y7SUFDakUsY0FBa0I7SUFBaUIsQUFBbkMsMkNBQWtCLGtDQUFxQzs7O0lBWHhGLDhFQUF1Rzs7O0lBQTlFLDRDQUFnQjs7QUQ5QjdDLE1BQU0sV0FBVyxHQUFHLHdCQUF3QixDQUFDO0FBQzdDLE1BQU0sYUFBYSxHQUFHLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFDLENBQUM7QUFTdEUsTUFBTSxPQUFPLGFBQWMsU0FBUSxpQkFBaUI7YUFDekMsb0JBQWUsR0FBRyxhQUFhLEVBQUUsQUFBbEIsQ0FBbUI7SUEyRnpDLFlBQ0ksR0FBYSxFQUNiLEtBQXdCLEVBQ3hCLFFBQW9CLEVBQ3BCLEdBQVEsRUFDUixXQUF3QixFQUN4QixNQUFjLEVBQ2UsYUFBcUIsRUFDbkIsZUFBdUIsRUFDM0IsV0FBbUIsRUFDaEIsY0FBc0IsRUFDckIsWUFBb0IsRUFDcEIsWUFBb0IsRUFDbkQsZ0JBQWtDLEVBQ2xDLGlCQUFvQyxFQUNJLGVBQW9CO1FBRTVELElBQUksU0FBUyxHQUFhLElBQUksQ0FBQztRQUMvQixNQUFNLGdCQUFnQixHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQzdELEtBQUssQ0FBQyxHQUFHLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUN6QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFDekMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDO1FBQzNDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRXRCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ25DLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBRXJDLElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQztRQUU5QixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsV0FBVyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxHQUFHLFlBQVksRUFBRSxDQUFDO1FBRTFDLDhFQUE4RTtRQUM5RSxJQUFJLENBQUMsbUJBQW1CLEdBQUc7WUFDdkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsaUNBQWlDLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQzVELElBQUksY0FBYyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2dCQUNsRCxtSEFBbUg7Z0JBQ25ILElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDbEIsY0FBYyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDaEUsQ0FBQztnQkFDRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEVBQUUsZUFBZSxDQUFDLEtBQUssY0FBYyxFQUFFLENBQUM7b0JBQ25ELE9BQU87Z0JBQ1gsQ0FBQztnQkFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDcEMsQ0FBQyxDQUFDO1lBQ0YsdURBQXVEO1lBQ3ZELElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLHVCQUF1QixFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzFFLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxFQUFFO2dCQUM3QyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDO29CQUNwRCxPQUFPO2dCQUNYLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDN0IsQ0FBQyxDQUFDO1NBQ0wsQ0FBQztJQUNOLENBQUM7SUFFRCxJQUFXLFlBQVk7UUFDbkIsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPLEVBQUUsQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQVcsWUFBWSxDQUFDLEtBQUs7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRXpCLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNqRCxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0IsQ0FBQztRQUNELFVBQVUsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLFVBQVUsQ0FBQyxVQUFrQixFQUFFLEtBQWM7UUFDaEQsSUFBSSxPQUFPLENBQUM7UUFDWixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFFbEIsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2QsT0FBTztRQUNYLENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDcEIsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtnQkFDckMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLENBQUM7Z0JBQ2pELElBQUksT0FBTyxFQUFFLENBQUM7b0JBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekIsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxNQUFNLENBQUM7UUFDbEIsQ0FBQztRQUNELEtBQUssR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7UUFFcEIsT0FBTyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRS9DLElBQUksT0FBTyxFQUFFLENBQUM7WUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDTCxDQUFDO0lBRUQsZ0dBQWdHO0lBQ3pGLE9BQU8sQ0FBQyxLQUFhO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksUUFBUSxDQUFDLElBQVM7UUFDckIsSUFBSSxJQUFJLFlBQVksaUJBQWlCLEVBQUUsQ0FBQztZQUNwQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QyxDQUFDO2FBQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNkLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNqRSxDQUFDO0lBQ0wsQ0FBQztJQUVELE1BQU07UUFDRixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQUs7UUFDVCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUNwQixJQUFJLFFBQVEsQ0FBQztZQUNiLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1AsUUFBUSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDeEQsQ0FBQztZQUNELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDTCxDQUFDO0lBRUQsTUFBTSxDQUFDLElBQUs7UUFDUixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxTQUFTLENBQUMsSUFBSztRQUNYLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3BCLElBQUksUUFBUSxDQUFDO1lBQ2IsSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDUCxRQUFRLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztZQUN4RCxDQUFDO1lBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUMsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSztRQUNSLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFJO1FBQ2QsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNuQyxJQUFJLFVBQVUsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3RILElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDakIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDcEMsNEZBQTRGO2dCQUM1RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztvQkFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztnQkFDckQsQ0FBQztxQkFBTSxDQUFDLENBQUMsNkJBQTZCO29CQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUNoRCxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQztJQUVNLHdCQUF3QixDQUFDLEdBQXdCLEVBQUUsTUFBYTtRQUNuRSxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNoQixNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDcEQsNEVBQTRFO1lBQzVFLElBQUksZUFBZSxDQUFDLGFBQWEsS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUM7WUFDOUMsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQsNERBQTREO0lBQ3JELE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTztRQUM3QixJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3pJLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU0sYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFjO1FBQ3ZDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDdkwsTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQzVCLENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBaUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUUvRCxJQUFJLFlBQVksR0FBVyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFeEUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsTUFBTSxVQUFVLEdBQVcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3pFLE1BQU0sV0FBVyxHQUFXLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDMUgsSUFBSSxNQUFNLEtBQUssWUFBWSxFQUFFLENBQUM7Z0JBQzFCLElBQUksWUFBWSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUNuQixJQUFJLENBQUMsWUFBWSxJQUFJLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO3dCQUN4RSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDbEUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUN4RCxDQUFDO3lCQUFNLElBQUksWUFBWSxHQUFHLFVBQVUsRUFBRSxDQUFDO3dCQUNuQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7d0JBQ3BFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUN0RSxDQUFDO3lCQUFNLENBQUM7d0JBQ0osSUFBSSxDQUFDLG1CQUFtQixDQUFDLHNCQUFzQixFQUFFLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQztvQkFDL0QsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLE1BQU0sS0FBSyxZQUFZLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxZQUFZLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLFlBQVksSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQzt3QkFDeEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ2xFLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztvQkFDeEQsQ0FBQzt5QkFBTSxJQUFJLFlBQVksR0FBRyxVQUFVLEVBQUUsQ0FBQzt3QkFDbkMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUNwRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdEUsQ0FBQzt5QkFBTSxDQUFDO3dCQUNKLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsRUFBRSxFQUFDLE1BQU0sRUFBQyxDQUFDLENBQUM7b0JBQy9ELENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDekIsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDNUIsWUFBWSxHQUFHLFlBQVksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDdEQsSUFBSSxZQUFZLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3JCLE9BQU87Z0JBQ1gsQ0FBQztnQkFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2xFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3JDLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxHQUFHLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hGLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztnQkFDakMsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUM7WUFDaEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLFlBQVksR0FBRyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDO1lBQ2hDLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDaEMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztnQkFDNUIsWUFBWSxHQUFHLFlBQVksR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDL0YsSUFBSSxZQUFZLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQzdDLE9BQU87Z0JBQ1gsQ0FBQztnQkFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3JDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ3hGLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDO1lBQ2hDLENBQUM7aUJBQU0sQ0FBQztnQkFDSixZQUFZLEdBQUcsWUFBWSxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDbkcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDO2dCQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQztZQUNoQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzdCLHVJQUF1STtZQUN2SSxJQUFJLFlBQVksS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUN4RixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUN6RCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7Z0JBQ3JELFlBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNELENBQUM7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNwRSxDQUFDO2FBQU0sSUFBSSxNQUFNLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztnQkFDdEIsT0FBTztZQUNYLENBQUM7WUFDRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFDdkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDaEUsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1lBQ3JDLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLENBQUMsWUFBWSw2QkFBNkIsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQy9DLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsSUFBSSxDQUFDLFlBQVksMkJBQTJCLENBQUM7Z0JBQ3JFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUNuRCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFXLEVBQUUsRUFBTyxFQUFFLEVBQVE7UUFDM0MsSUFBSSxHQUFHLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNqRCxPQUFPO1lBQ1gsQ0FBQztZQUNELElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0IsQ0FBQzthQUFNLElBQUksR0FBRyxLQUFLLFlBQVksRUFBRSxDQUFDO1lBQzlCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxHQUFHLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDOUIsbUZBQW1GO1lBQ25GLElBQUksRUFBRSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztnQkFDNUIsT0FBTztZQUNYLENBQUM7WUFDRCxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzlELENBQUM7UUFDTCxDQUFDO2FBQU0sSUFBSSxHQUFHLEtBQUssYUFBYSxFQUFFLENBQUM7WUFDL0IsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7YUFBTSxJQUFJLEdBQUcsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUM1QixPQUFPO1FBQ1gsQ0FBQzthQUFNLElBQUksR0FBRyxLQUFLLGVBQWUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3hDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO1FBQ3BDLENBQUM7YUFBTSxJQUFJLEdBQUcsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1lBQ25DLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO2dCQUNyQix1R0FBdUc7Z0JBQ3ZHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUM5RCxDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksR0FBRyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxHQUFHO2dCQUN6QixVQUFVLEVBQUUsRUFBRTthQUNqQixDQUFDO1lBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDdkMsQ0FBQzthQUFNLElBQUksR0FBRyxLQUFLLGVBQWUsRUFBRSxDQUFDO1lBQ2pDLElBQUksRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7SUFDTCxDQUFDO0lBRU0sV0FBVyxDQUFDLEdBQVEsRUFBRSxTQUE0QjtRQUNyRCxJQUFJLFdBQW1CLENBQUM7UUFFeEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLFNBQVMsQ0FBQztZQUM3RCw0REFBNEQ7WUFDNUQsV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFNUcseUNBQXlDO1lBQ3pDLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxRQUFRLEVBQUUsRUFBRSxDQUFDO2dCQUNqQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzlELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDNUMsQ0FBQztxQkFBTSxDQUFDO29CQUNKLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsRUFBRSxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO2dCQUNwRSxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUMxRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQzlELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO29CQUMzRCxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzVDLENBQUM7cUJBQU0sQ0FBQztvQkFDSixJQUFJLENBQUMsbUJBQW1CLENBQUMsc0JBQXNCLEVBQUUsRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQztnQkFDcEUsQ0FBQztZQUNMLENBQUM7aUJBQU0sSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDMUMsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ3BDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUVoRCxrREFBa0Q7Z0JBQ2xELElBQUksS0FBSyxHQUFHLElBQUksRUFBRSxDQUFDO29CQUNmLElBQUksR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLENBQUM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3pDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQTBCLEVBQUUsRUFBRTt3QkFDbEQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7d0JBQ3BDLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7NEJBQ2xDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDMUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztvQkFDSCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO2dCQUN0QyxDQUFDO3FCQUFNLENBQUM7b0JBQ0osSUFBSSxDQUFDLG1CQUFtQixDQUFDLHNCQUFzQixFQUFFLEVBQUMsTUFBTSxFQUFFLEdBQUcsRUFBQyxDQUFDLENBQUM7Z0JBQ3BFLENBQUM7WUFFTCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN6QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztvQkFDMUIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUN4QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztnQkFDL0QsQ0FBQztZQUNMLENBQUM7WUFDRCxVQUFVLEVBQUUsQ0FBQztRQUNqQixDQUFDO0lBQ0wsQ0FBQztJQUVELGtDQUFrQztJQUMzQixLQUFLO1FBQ1IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksWUFBWSxDQUFDLEdBQVE7UUFDeEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNoQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsQ0FBQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVLENBQUMsR0FBRyxFQUFFLHlCQUEwQjtRQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ1osT0FBTztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUN0RSxDQUFDO1FBQ0QscUJBQXFCO1FBQ3JCLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELFFBQVE7UUFDSixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLGlDQUFpQyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxpQ0FBaUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6SyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDTixJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsWUFBWSxHQUFHO1lBQ2hCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsUUFBUSxFQUFFLElBQUk7U0FDakIsQ0FBQztJQUNOLENBQUM7SUFFRCxlQUFlO1FBQ1gsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDNUIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUN0RCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1lBRWhFLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDdEMsSUFBSSxHQUFHLEVBQUUsQ0FBQztvQkFDTixHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDL0MsQ0FBQztnQkFDRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDeEIsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3RCLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ04sR0FBRyxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO1lBQ0wsQ0FBQztZQUNELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDbkUsQ0FBQztZQUNELFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sQ0FBQyxHQUFrQixFQUFFLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ3pFLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3JCLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkQsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3RCLElBQUksR0FBRyxFQUFFLENBQUM7Z0JBQ04sR0FBRyxDQUFDLGVBQWUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzVDLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxXQUFXLEVBQUUsSUFBSSxHQUFHLENBQUMsYUFBYSxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQztZQUNwRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDNUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0RCxDQUFDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsVUFBVTtRQUNOLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRVMsV0FBVyxDQUFDLElBQWlCLEVBQUUsU0FBaUIsRUFBRSxhQUF1QixFQUFFLE1BQVc7UUFDNUYsc0ZBQXNGO1FBQ3RGLE1BQU0sWUFBWSxHQUFHO1lBQ2pCLEdBQUcsRUFBRSxPQUFPO1lBQ1osU0FBUyxFQUFFLFVBQVU7U0FDeEIsQ0FBQztRQUNGLElBQUksUUFBUSxDQUFDLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNqRSxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUM5QixJQUFJLENBQUMsYUFBYSxFQUNsQixZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxFQUNwQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNKLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3ZELElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNoQixNQUFNLGVBQWUsR0FBc0IsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO29CQUMxRSxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxDQUFDO3dCQUMvQixJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFOzRCQUNoQyxNQUFNLEVBQUUsZUFBZTs0QkFDdkIsTUFBTSxFQUFFLEdBQUc7NEJBQ1gsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJO3lCQUM3QixDQUFDLENBQUM7b0JBQ1AsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQyxDQUNKLENBQUM7UUFDTixDQUFDO0lBQ0wsQ0FBQztJQUVPLGtCQUFrQjtRQUN0QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNsRSxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVPLGlCQUFpQixDQUFDLE9BQU87UUFDN0IsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3pELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0QsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7Z0JBQ3hDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7WUFDbEQsQ0FBQztZQUNELElBQUksR0FBRyxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1lBQ3BDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVPLGNBQWMsQ0FBQyxTQUFTLEVBQUUsSUFBSztRQUNuQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIscU1BQXFNO1FBQ3JNLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDekUsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNQLEdBQUcsR0FBRyxJQUFJLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFTyxlQUFlO1FBQ25CLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFTyxxQkFBcUI7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFTyxzQkFBc0I7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDO0lBQzlDLENBQUM7SUFFTyx1QkFBdUI7UUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDO1FBQzNDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFTyxxQkFBcUI7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFTyxxQkFBcUI7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxvQkFBb0I7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVPLGtCQUFrQjtRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssc0JBQXNCLENBQUMsSUFBSTtRQUMvQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsUUFBUSxJQUFJLEVBQUUsQ0FBQztZQUNYLEtBQUssZUFBZSxDQUFDLEtBQUs7Z0JBQ3RCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUM3QixNQUFNO1lBQ1YsS0FBSyxlQUFlLENBQUMsTUFBTTtnQkFDdkIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7Z0JBQzlCLE1BQU07WUFDVixLQUFLLGVBQWUsQ0FBQyxRQUFRLENBQUM7WUFDOUIsS0FBSyxlQUFlLENBQUMsT0FBTztnQkFDeEIsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7Z0JBQy9CLE1BQU07WUFDVixLQUFLLGVBQWUsQ0FBQyxLQUFLO2dCQUN0QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDN0IsTUFBTTtZQUNWLEtBQUssZUFBZSxDQUFDLElBQUk7Z0JBQ3JCLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO2dCQUM3QixNQUFNO1lBQ1YsS0FBSyxlQUFlLENBQUMsTUFBTTtnQkFDdkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7Z0JBQzVCLE1BQU07WUFDVixLQUFLLGVBQWUsQ0FBQyxRQUFRO2dCQUN6QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDMUIsTUFBTTtRQUNkLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGVBQWUsQ0FBQyxNQUFrQjtRQUN0QyxJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN2RyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDO1FBQzVCLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckUsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDNUosQ0FBQztRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxVQUFVLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVPLFlBQVksQ0FBQyxNQUFNO1FBQ3ZCLGdDQUFnQztRQUNoQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFFbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFFMUIsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDaEYsK0dBQStHO2dCQUMvRyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUN2QyxNQUFNLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUVELElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ25CLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLENBQUM7WUFFRCxzRkFBc0Y7WUFDdEYsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNsTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUU7b0JBQ2hFLE1BQU0sRUFBRSxDQUFDO2lCQUNaLENBQUMsQ0FBQztZQUNQLENBQUM7WUFFRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUNsQixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztvQkFDaEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUM7Z0JBQ2xFLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNqQyxDQUFDO1FBQ0wsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLENBQUM7SUFDTCxDQUFDO0lBRUQsdUVBQXVFO0lBQy9ELGVBQWU7UUFDbkIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUV6QyxhQUFhLENBQUMsT0FBTyxHQUFHO1lBQ3BCLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUU7U0FDbEMsQ0FBQztRQUVGLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFFakMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDNUMsQ0FBQztRQUNELDhIQUE4SDtRQUM5SCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUM5RSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNULDBDQUEwQztRQUMxQyxJQUFJLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsOEhBQThIO1FBQzlILElBQUksQ0FBQyx1QkFBdUIsR0FBRyxhQUFhLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDN0UsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDeEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxhQUFhLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN0Qyx3RkFBd0Y7UUFDeEYsdUZBQXVGO1FBQ3ZGLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUM3QixJQUFJLENBQUMsV0FBVyxFQUNoQixJQUFJLENBQUMsVUFBVSxFQUNmLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUNqRCxJQUFJLENBQUMsT0FBTyxFQUNaLElBQUksQ0FBQyxjQUFjLEVBQ25CLGdCQUFnQixFQUNoQixJQUFJLENBQUMsWUFBWSxDQUNwQixDQUFDO0lBQ04sQ0FBQztJQUVPLGVBQWUsQ0FBQyxNQUFNO1FBQzFCLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEtBQUssYUFBYSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDL0csTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsRUFBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLFVBQVUsRUFBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pFLENBQUM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQztZQUNwQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztZQUM3QixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzlELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUMzQixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QixDQUFDO1FBQ0wsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLGVBQWUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNyRSxnR0FBZ0c7WUFDaEcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RELENBQUM7SUFDTCxDQUFDO0lBRUQsbURBQW1EO0lBQzNDLGlCQUFpQjtRQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELG1GQUFtRjtJQUMzRSxrQkFBa0I7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLFVBQVUsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssa0JBQWtCLENBQUMsU0FBUztRQUNoQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDcEMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztZQUM1QixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pELDRHQUE0RztnQkFDNUcsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDekIsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQy9CLENBQUM7WUFDRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztRQUNMLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNmLENBQUM7SUFFTywwQkFBMEIsQ0FBQyx5QkFBMEI7UUFDekQsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLFdBQVcsQ0FBQztRQUMxQixNQUFNLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO1lBQ3ZDLG1HQUFtRztZQUNuRyxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0QsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLDRIQUE0SDtnQkFDNUgsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNyRCxXQUFXLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQztnQkFDbEMsQ0FBQztxQkFBTSxDQUFDO29CQUNKLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLFVBQVUsWUFBaUI7d0JBQ3hELE9BQU8sWUFBWSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7b0JBQ3pDLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxtQkFBd0MsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQzlELENBQUM7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQXVCLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDdEQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQ2hCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNsQixJQUFJLENBQUMsbUJBQXdDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNqRixDQUFDO3FCQUFNLENBQUM7b0JBQ0osSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDdkQsQ0FBQztnQkFDRCxHQUFHLEdBQUcsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUMsQ0FBQztnQkFDcEMsSUFBSSxHQUFHLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDdkQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ3ZDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUN2QyxDQUFDO2dCQUNMLENBQUM7cUJBQU0sQ0FBQztvQkFDSixXQUFXLENBQUMsWUFBWSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLE1BQU0sSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDckUsSUFBSSxnQ0FBZ0MsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNoRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxFQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQztZQUMzRixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osT0FBTyxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLGdEQUFnRCxDQUFDLENBQUM7WUFDcEgsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHVCQUF1QixDQUFDLFNBQTRCLEVBQUUseUJBQTBCO1FBQ3BGLHlEQUF5RDtRQUN6RCxJQUFJLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUN0QyxJQUFJLElBQUksR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQzFCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQzNDLHdHQUF3RztnQkFDeEcsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzVCLENBQUM7WUFDRCxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLE1BQU0sR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUN4RCxTQUFTLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUMvQixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osbUdBQW1HO2dCQUNuRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUNwQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztnQkFDOUIsQ0FBQztnQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxFQUFDLE1BQU0sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7Z0JBQ3JFLFNBQVMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQzlCLENBQUM7WUFDRCxJQUFJLENBQUMsMEJBQTBCLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUMvRCxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFlBQVksQ0FBQyxTQUF1QztRQUN4RCw4S0FBOEs7UUFDOUssSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDckIsdUZBQXVGO1lBQ3ZGLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0csTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRCxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztnQkFDakMsTUFBTSxtQkFBbUIsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2dCQUMxSCxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkUsV0FBVyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQztnQkFDckQsZ0VBQWdFO2dCQUNoRSxJQUFJLG1CQUFtQixLQUFLLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQyxVQUFVLEtBQUssV0FBVyxFQUFFLENBQUM7b0JBQ3BHLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7d0JBQ3RDLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUUsQ0FBQzs0QkFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUN0QyxDQUFDO29CQUNMLENBQUMsQ0FBQyxDQUFDO2dCQUNQLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRTNGLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1FBRXRELHdHQUF3RztRQUN4RyxrRUFBa0U7UUFDbEUsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDOUgsTUFBTSxVQUFVLEdBQXNCLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFFdEQsSUFDSSxDQUFDLFVBQVUsQ0FBQyxXQUFXO2dCQUN2QixJQUFJLENBQUMsYUFBYTtnQkFDbEIsOEhBQThIO2dCQUM5SCxDQUFDLENBQ0csQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUNyQixFQUNILENBQUM7Z0JBQ0MsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO2dCQUM1RCw2QkFBNkI7Z0JBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkIsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDakMsTUFBTSxRQUFRLEdBQXNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDMUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztvQkFDWCxRQUFRLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztvQkFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztvQkFDakMsMkJBQTJCO29CQUMzQixRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNuQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUMsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztZQUNqRSx3RUFBd0U7WUFDeEUsZ0RBQWdEO1lBQ2hELElBQUksV0FBVyxFQUFFLElBQUksY0FBYyxDQUFDLE1BQU0sSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssTUFBTSxFQUFFLENBQUM7Z0JBQzdGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQ3pGLENBQUM7aUJBQU0sQ0FBQztnQkFDSiwwSUFBMEk7Z0JBQzFJLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN2RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDakQsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7Z0JBQ3pDLElBQUksUUFBUSxFQUFFLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxNQUFNLEdBQUcsT0FBTyxFQUFFLENBQUM7b0JBQ3JELElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUM7Z0JBQ2hELENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1lBQ2hHLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7SUFDL0IsQ0FBQztJQUVPLGFBQWE7UUFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3pDLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUNILHlDQUF5QztRQUN6QyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQy9GLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDeEQseUNBQXlDO1lBQ3pDLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BHLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUM7WUFDdkQsQ0FBQztZQUNELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVELDJDQUEyQztJQUNuQyxjQUFjLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDMUIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELDBCQUEwQjtJQUNsQixNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDbEIsMkVBQTJFO1FBQzNFLHlGQUF5RjtRQUN6RixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNqQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqRyxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ3ZELElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUMsd0JBQXdCLENBQUMsQ0FBQztnQkFDNUYsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQUM7WUFDN0MsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQsOEJBQThCO0lBQ3RCLFFBQVEsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLFlBQWE7UUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUM1QiwyRUFBMkU7UUFDM0UsTUFBTSxRQUFRLEdBQUcsRUFBRSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ25FLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTlDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRTNDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMscURBQXFEO1FBQ3JELElBQUksV0FBVyxFQUFFLENBQUM7WUFDZCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7WUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3pFLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFFekUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBRXRDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixNQUFNLFlBQVksR0FBRztnQkFDakIsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUN2QixDQUFDO1lBQ0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZDLENBQUM7SUFDTCxDQUFDO0lBRUQsd0NBQXdDO0lBQ2hDLFlBQVk7UUFDaEIsSUFBSSxRQUFRLENBQUM7UUFDYixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzNDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsMEdBQTBHO1lBQ3BJLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDeEIsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsc0RBQXNEO1lBQy9FLFFBQVEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQyxDQUFDLHNDQUFzQztZQUMzQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqQyxRQUFRLEVBQUUsUUFBUTtTQUNyQixDQUFDO1FBRUYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUVsRCxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVySCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFDLFFBQVEsRUFBRSxnQkFBZ0IsRUFBQyxDQUFDLENBQUM7UUFFcEQsSUFBSSxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRSxVQUFVLEtBQUs7Z0JBQ3hDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQztnQkFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFDakIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBQ2YsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDL0IsQ0FBQztvQkFDRCxVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUNaLDhDQUE4Qzt3QkFDOUMsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7NEJBQ25CLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzt3QkFDM0IsQ0FBQztvQkFDTCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ1AsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUMzQixDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQzt3QkFDaEQsa0JBQWtCO3dCQUNsQixDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFFMUMsbUJBQW1CO3dCQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFFckIsa0VBQWtFO3dCQUNsRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUV2Qix1Q0FBdUM7b0JBQzNDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztnQkFDWixDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEtBQUs7Z0JBQzdCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUN0QixDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFFbkQsK0NBQStDO2dCQUMvQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFM0MsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUMvQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFO2dCQUNmLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBRUwsQ0FBQztJQUVELGtEQUFrRDtJQUMxQyxtQkFBbUIsQ0FBQyxLQUFhO1FBQ3JDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRUQsNkNBQTZDO0lBQ3JDLGtCQUFrQixDQUFDLEtBQWE7UUFDcEMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssZ0JBQWdCLENBQUMsSUFBdUI7UUFDNUMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLHdCQUF3QixDQUFDLEdBQVE7UUFDckMsSUFBSSxRQUEyQixDQUFDO1FBQ2hDLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEIsUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QyxDQUFDO2FBQU0sQ0FBQztZQUNKLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ3BCLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsTUFBTTtRQUN6QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsU0FBUyxDQUFDLE1BQWM7UUFDcEIsT0FBTyxNQUFNLENBQUMsQ0FBQywyQ0FBMkM7SUFDOUQsQ0FBQztJQUVELHVGQUF1RjtJQUMvRSx3QkFBd0I7UUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO1lBQ25FLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNqRCxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ1IsQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUNYLG1DQUFtQztZQUNuQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDO0lBQ0wsQ0FBQzs4RUFwdkNRLGFBQWEsZ1BBbUdQLGdCQUFnQix3QkFDaEIsa0JBQWtCLHdCQUNsQixjQUFjLHdCQUNkLGlCQUFpQix3QkFDakIsa0JBQWtCLHdCQUNsQixrQkFBa0IsK0dBR3JCLGtCQUFrQjtvRUEzR3JCLGFBQWE7Ozs7d0NBT0wsZUFBZTs7Ozs7Ozs7MkJBRXJCLG1CQUFtQjsyQkFDaEIsaUJBQWlCOzs7Ozs4Q0FkcEI7Z0JBQ1Asa0JBQWtCLENBQUMsYUFBYSxDQUFDO2FBQ3BDOztZQ2pFTCxBQVhBLEFBWkEsOERBQW9FLGlEQVkrRixpREFXeEQ7WUFFM0csMkJBQUs7WUFLRCxBQUpBLDhEQUEwRCxpREFJcUM7WUFHbkcsaUJBQU07WUFFTiw2QkFlQztZQUZHLEFBREEsQUFEQSxBQURBLEFBRkEsQUFEQSxBQURBLEFBREEsQUFGQSxBQUZBLGtKQUFpQiwwQkFBc0IsUUFBUSxDQUFDLEtBQUMscUlBRWhDLDBCQUFzQixPQUFPLENBQUMsS0FBQyx5SUFFN0IsMEJBQXNCLFdBQVcsQ0FBQyxLQUFDLDZJQUNqQywwQkFBc0IsV0FBVyxDQUFDLEtBQUMsNklBQ25DLDBCQUFzQixXQUFXLENBQUMsS0FBQywrSUFDbEMsMEJBQXNCLFdBQVcsQ0FBQyxLQUFDLHFKQUVoQywwQkFBc0IsWUFBWSxDQUFDLEtBQUMseUpBQ2xDLDBCQUFzQixZQUFZLENBQUMsS0FBQyx5SkFDcEMsMEJBQXNCLFlBQVksQ0FBQyxLQUFDLDJKQUNuQywwQkFBc0IsWUFBWSxDQUFDLEtBQUM7WUFHaEUsOEVBQWdFO1lBWWhFLEFBREEsMkJBQXlFLE1BQ0M7WUFDOUUsaUJBQUs7WUE2Q0wsQUFyQkEsQUFaQSxBQVJBLEFBRkEsaUVBQWdHLG9EQUV2QixvREFReUQsb0RBWXNILG9HQXFCdE47OztZQTdHTixtRUFBc0M7WUFZa0QsY0FBNkM7WUFBN0Msc0VBQTZDO1lBVzNKLGNBQTZDO1lBQTdDLHNFQUE2QztZQUdWLGVBQW1CO1lBQW5CLHdDQUFtQjtZQUk1QixjQUFnRDtZQUFoRCw2RUFBZ0Q7WUFLaEQsY0FBZ0g7WUFBaEgsa0pBQWdIO1lBYzVJLGlFQUEyQzs7WUFFOUIsY0FBaUI7WUFBQyxBQUFsQixtQ0FBaUIscUNBQWlDO1lBV2pELGNBQTJDO1lBQTNDLDZEQUEyQztZQUMzQyxjQUE0QztZQUE1Qyw4REFBNEM7WUFHcEMsY0FBc0M7WUFBdEMsK0RBQXNDO1lBRWpDLGNBQXdDO1lBQXhDLGlFQUF3QztZQVFZLGNBQTZDO1lBQTdDLHNFQUE2QztZQVlyRyxjQUEyQjtZQUEzQixnREFBMkI7OztpRkRFekMsYUFBYTtjQVB6QixTQUFTOzJCQUNJLGFBQWEsYUFFWjtvQkFDUCxrQkFBa0IsZUFBZTtpQkFDcEM7O3NCQXFHSSxTQUFTO3VCQUFDLGdCQUFnQjs7c0JBQzFCLFNBQVM7dUJBQUMsa0JBQWtCOztzQkFDNUIsU0FBUzt1QkFBQyxjQUFjOztzQkFDeEIsU0FBUzt1QkFBQyxpQkFBaUI7O3NCQUMzQixTQUFTO3VCQUFDLGtCQUFrQjs7c0JBQzVCLFNBQVM7dUJBQUMsa0JBQWtCOztzQkFHNUIsTUFBTTt1QkFBQyxrQkFBa0I7O3NCQUFHLFFBQVE7cUJBeEdYLFlBQVk7a0JBQXpDLFlBQVk7bUJBQUMsY0FBYztZQUVZLHNCQUFzQjtrQkFBN0QsWUFBWTttQkFBQyx3QkFBd0I7WUFDRyx1QkFBdUI7a0JBQS9ELFlBQVk7bUJBQUMseUJBQXlCO1lBQ0wsYUFBYTtrQkFBOUMsZUFBZTttQkFBQyxlQUFlO1lBRUEsYUFBYTtrQkFBNUMsU0FBUzttQkFBQyxtQkFBbUI7WUFDRyxTQUFTO2tCQUF6QyxZQUFZO21CQUFDLGlCQUFpQjs7a0ZBVnRCLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQXR0cmlidXRlLFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsIEluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBOZ1pvbmUsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBRdWVyeUxpc3QsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICAgICRhcHBEaWdlc3QsXG4gICAgJGludm9rZVdhdGNoZXJzLFxuICAgIEFwcCxcbiAgICBBcHBEZWZhdWx0cyxcbiAgICBEYXRhU291cmNlLFxuICAgIGdldENsb25lZE9iamVjdCxcbiAgICBpc0RhdGFTb3VyY2VFcXVhbCxcbiAgICBpc0RlZmluZWQsXG4gICAgaXNNb2JpbGUsXG4gICAgaXNNb2JpbGVBcHAsXG4gICAgaXNPYmplY3QsXG4gICAgbm9vcCxcbiAgICBzd2l0Y2hDbGFzcyxcbiAgICBTdGF0ZVBlcnNpc3RlbmNlLFxuICAgIFBhZ2luYXRpb25TZXJ2aWNlLFxuICAgIHNldExpc3RDbGFzcyxcbiAgICBnZW5lcmF0ZUdVSWRcbn0gZnJvbSAnQHdtL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBBUFBMWV9TVFlMRVNfVFlQRSxcbiAgICBjb25maWd1cmVEbkQsXG4gICAgREVCT1VOQ0VfVElNRVMsXG4gICAgZ2V0T3JkZXJlZERhdGFzZXQsXG4gICAgZ3JvdXBEYXRhLFxuICAgIGhhbmRsZUhlYWRlckNsaWNrLFxuICAgIE5BVklHQVRJT05fVFlQRSxcbiAgICB1bnN1cHBvcnRlZFN0YXRlUGVyc2lzdGVuY2VUeXBlcyxcbiAgICBwcm92aWRlQXNXaWRnZXRSZWYsXG4gICAgU3R5bGFibGVDb21wb25lbnQsXG4gICAgc3R5bGVyLFxuICAgIFRvRGF0ZVBpcGUsXG4gICAgdG9nZ2xlQWxsSGVhZGVycyxcbiAgICBXaWRnZXRSZWYsXG4gICAgZXh0cmFjdERhdGFTb3VyY2VOYW1lXG59IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuaW1wb3J0IHtQYWdpbmF0aW9uQ29tcG9uZW50fSBmcm9tICdAd20vY29tcG9uZW50cy9kYXRhL3BhZ2luYXRpb24nO1xuaW1wb3J0IHtCdXR0b25Db21wb25lbnR9IGZyb20gJ0B3bS9jb21wb25lbnRzL2lucHV0JztcblxuaW1wb3J0IHtyZWdpc3RlclByb3BzfSBmcm9tICcuL2xpc3QucHJvcHMnO1xuaW1wb3J0IHtMaXN0SXRlbURpcmVjdGl2ZX0gZnJvbSAnLi9saXN0LWl0ZW0uZGlyZWN0aXZlJztcbmltcG9ydCB7TGlzdEFuaW1hdG9yfSBmcm9tICcuL2xpc3QuYW5pbWF0b3InO1xuaW1wb3J0IHtcbiAgICBjbG9uZSxcbiAgICBjbG9uZURlZXAsXG4gICAgZm9yRWFjaCxcbiAgICBnZXQsIGhhcyxcbiAgICBpbmNsdWRlcyxcbiAgICBpc0FycmF5LFxuICAgIGlzRW1wdHksXG4gICAgaXNFcXVhbCxcbiAgICBpc051bWJlcixcbiAgICBpc1N0cmluZyxcbiAgICBpc1VuZGVmaW5lZCxcbiAgICBsYXN0LCBtYXgsIG1pbiwgcHVsbEFsbFdpdGgsIHB1bGxBdCwgcmVtb3ZlLCBzb21lLCB0b051bWJlclxufSBmcm9tIFwibG9kYXNoLWVzXCI7XG5cbmRlY2xhcmUgY29uc3QgJDtcblxuY29uc3QgREVGQVVMVF9DTFMgPSAnYXBwLWxpdmVsaXN0IGFwcC1wYW5lbCc7XG5jb25zdCBXSURHRVRfQ09ORklHID0ge3dpZGdldFR5cGU6ICd3bS1saXN0JywgaG9zdENsYXNzOiBERUZBVUxUX0NMU307XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZGl2W3dtTGlzdF0nLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgcHJvdmlkZUFzV2lkZ2V0UmVmKExpc3RDb21wb25lbnQpXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBMaXN0Q29tcG9uZW50IGV4dGVuZHMgU3R5bGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gICAgc3RhdGljIGluaXRpYWxpemVQcm9wcyA9IHJlZ2lzdGVyUHJvcHMoKTtcblxuICAgIEBDb250ZW50Q2hpbGQoJ2xpc3RUZW1wbGF0ZScpIGxpc3RUZW1wbGF0ZTogVGVtcGxhdGVSZWY8RWxlbWVudFJlZj47XG5cbiAgICBAQ29udGVudENoaWxkKCdsaXN0TGVmdEFjdGlvblRlbXBsYXRlJykgbGlzdExlZnRBY3Rpb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8RWxlbWVudFJlZj47XG4gICAgQENvbnRlbnRDaGlsZCgnbGlzdFJpZ2h0QWN0aW9uVGVtcGxhdGUnKSBsaXN0UmlnaHRBY3Rpb25UZW1wbGF0ZTogVGVtcGxhdGVSZWY8RWxlbWVudFJlZj47XG4gICAgQENvbnRlbnRDaGlsZHJlbihCdXR0b25Db21wb25lbnQpIGJ0bkNvbXBvbmVudHM7XG5cbiAgICBAVmlld0NoaWxkKFBhZ2luYXRpb25Db21wb25lbnQpIGRhdGFOYXZpZ2F0b3I7XG4gICAgQFZpZXdDaGlsZHJlbihMaXN0SXRlbURpcmVjdGl2ZSkgbGlzdEl0ZW1zOiBRdWVyeUxpc3Q8TGlzdEl0ZW1EaXJlY3RpdmU+O1xuICAgIHB1YmxpYyBub0RhdGFGb3VuZDogYm9vbGVhbjtcbiAgICBwdWJsaWMgbGFzdFNlbGVjdGVkSXRlbTogTGlzdEl0ZW1EaXJlY3RpdmU7XG4gICAgcHVibGljIGZpZWxkRGVmczogQXJyYXk8YW55PjtcbiAgICBwdWJsaWMgZGlzYWJsZWl0ZW07XG4gICAgcHVibGljIG5hdmlnYXRpb246IHN0cmluZztcbiAgICBwdWJsaWMgbmF2aWdhdGlvbmFsaWduOiBzdHJpbmc7XG4gICAgcHVibGljIHBhZ2VzaXplOiBudW1iZXI7XG4gICAgcHVibGljIGRhdGFzZXQ6IGFueTtcbiAgICBwdWJsaWMgbXVsdGlzZWxlY3Q6IGJvb2xlYW47XG4gICAgcHVibGljIHNlbGVjdGZpcnN0aXRlbTogYm9vbGVhbjtcbiAgICBwdWJsaWMgb3JkZXJieTogc3RyaW5nO1xuICAgIHB1YmxpYyBsb2FkaW5naWNvbjogc3RyaW5nO1xuICAgIHB1YmxpYyBwYWdpbmF0aW9uY2xhc3M6IHN0cmluZztcbiAgICBwdWJsaWMgb25kZW1hbmRtZXNzYWdlOiBzdHJpbmc7XG4gICAgcHVibGljIGxvYWRpbmdkYXRhbXNnOiBzdHJpbmc7XG4gICAgcHVibGljIHNlbGVjdGlvbmxpbWl0OiBudW1iZXI7XG4gICAgcHVibGljIGluZlNjcm9sbDogYm9vbGVhbjtcbiAgICBwdWJsaWMgZW5hYmxlcmVvcmRlcjogYm9vbGVhbjtcbiAgICBwdWJsaWMgaXRlbXNwZXJyb3c6IHN0cmluZztcbiAgICBwdWJsaWMgaXRlbWNsYXNzOiBzdHJpbmc7XG4gICAgcHVibGljIHNlbGVjdGVkSXRlbVdpZGdldHM6IEFycmF5PFdpZGdldFJlZj4gfCBXaWRnZXRSZWY7XG4gICAgcHVibGljIHZhcmlhYmxlSW5mbGlnaHQ7XG4gICAgcHVibGljIG5hbWU7XG4gICAgcHVibGljIGN1cnJlbnRQYWdlO1xuICAgIHB1YmxpYyBkaXJlY3Rpb247XG4gICAgcHVibGljIHRhYmluZGV4O1xuICAgIHB1YmxpYyBoYW5kbGVIZWFkZXJDbGljazogRnVuY3Rpb247XG4gICAgcHVibGljIHRvZ2dsZUFsbEhlYWRlcnM6IHZvaWQ7XG4gICAgcHVibGljIGdyb3VwYnk6IHN0cmluZztcbiAgICBwdWJsaWMgY29sbGFwc2libGU6IHN0cmluZztcbiAgICBwdWJsaWMgZGF0ZVBpcGU6IFRvRGF0ZVBpcGU7XG4gICAgcHVibGljIGJpbmRpdGVtY2xhc3M6IHN0cmluZztcbiAgICBwdWJsaWMgYmluZGRpc2FibGVpdGVtOiBzdHJpbmc7XG4gICAgcHVibGljIGJpbmRkYXRhc2V0OiBzdHJpbmc7XG4gICAgcHVibGljIG1vdXNlRW50ZXJDQjogc3RyaW5nO1xuICAgIHB1YmxpYyBtb3VzZUxlYXZlQ0I6IHN0cmluZztcbiAgICBwdWJsaWMgcHVsbHRvcmVmcmVzaDogYm9vbGVhbjtcbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgICBwdWJsaWMgc3ViaGVhZGluZzogc3RyaW5nO1xuICAgIHB1YmxpYyBpY29uY2xhc3M6IHN0cmluZztcbiAgICBwdWJsaWMgbGlzdGNsYXNzOiBhbnk7XG4gICAgcHVibGljIHN0YXRlaGFuZGxlcjogYW55O1xuICAgIHB1YmxpYyBjdXJyZW50SW5kZXg6IG51bWJlcjtcbiAgICBwdWJsaWMgdGl0bGVJZDogc3RyaW5nO1xuICAgIF9pc0RlcGVuZGVudDtcbiAgICBwcml2YXRlIGl0ZW1zUGVyUm93Q2xhc3M6IHN0cmluZztcbiAgICBwcml2YXRlIGZpcnN0U2VsZWN0ZWRJdGVtOiBMaXN0SXRlbURpcmVjdGl2ZTtcbiAgICBwcml2YXRlIG5hdmlnYXRvck1heFJlc3VsdFdhdGNoOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBuYXZpZ2F0b3JSZXN1bHRXYXRjaDogU3Vic2NyaXB0aW9uO1xuICAgIHByaXZhdGUgbmF2Q29udHJvbHM6IHN0cmluZztcbiAgICBwcml2YXRlIG9uRGVtYW5kTG9hZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIF9pdGVtczogQXJyYXk8YW55PjtcbiAgICBwcml2YXRlIGRhdGFOYXZpZ2F0b3JXYXRjaGVkOiBib29sZWFuO1xuICAgIHByaXZhdGUgZGF0YXNvdXJjZTogYW55O1xuICAgIHByaXZhdGUgc2hvd05hdmlnYXRpb246IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZW9yZGVyUHJvcHM6IGFueTtcbiAgICBwcml2YXRlIGFwcDogYW55O1xuICAgIHByaXZhdGUgYXBwRGVmYXVsdHM6IGFueTtcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lO1xuICAgIHByaXZhdGUgc3RhdGVQZXJzaXN0ZW5jZTogU3RhdGVQZXJzaXN0ZW5jZTtcbiAgICBwcml2YXRlIHBhZ2luYXRpb25TZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZTtcbiAgICBwcml2YXRlIGJpbmRkYXRhc291cmNlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBtYXRjaDogc3RyaW5nO1xuICAgIHByaXZhdGUgZGF0ZWZvcm1hdDogc3RyaW5nO1xuICAgIHByaXZhdGUgZ3JvdXBlZERhdGE6IGFueTtcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZjtcbiAgICBwcml2YXRlIHByb21pc2VSZXNvbHZlckZuOiBGdW5jdGlvbjtcbiAgICBwcml2YXRlIHByb3BzSW5pdFByb21pc2U6IFByb21pc2U8YW55PjtcbiAgICBwcml2YXRlICR1bEVsZTogYW55O1xuICAgIHByaXZhdGUgX2xpc3RBbmltYXRvcjogTGlzdEFuaW1hdG9yO1xuICAgIHByaXZhdGUgX2xpc3RlbmVyRGVzdHJveWVyczogQXJyYXk8YW55PjtcbiAgICBwcml2YXRlIGRlYm91bmNlZEZldGNoTmV4dERhdGFzZXRPblNjcm9sbDogRnVuY3Rpb247XG4gICAgcHJpdmF0ZSBpc0RhdGFDaGFuZ2VkOiBib29sZWFuO1xuICAgIHByaXZhdGUgaXNMaXN0RWxlbWVudE1vdmFibGU6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBhcmlhVGV4dDogU3RyaW5nO1xuICAgIHByaXZhdGUgX3BhZ2VMb2FkO1xuICAgIHByaXZhdGUgX3NlbGVjdGVkSXRlbXNFeGlzdDtcblxuICAgIHByaXZhdGUgdG91Y2hpbmc7XG4gICAgcHJpdmF0ZSB0b3VjaGVkO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGluajogSW5qZWN0b3IsXG4gICAgICAgIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgZGF0ZVBpcGU6IFRvRGF0ZVBpcGUsXG4gICAgICAgIGFwcDogQXBwLFxuICAgICAgICBhcHBEZWZhdWx0czogQXBwRGVmYXVsdHMsXG4gICAgICAgIG5nWm9uZTogTmdab25lLFxuICAgICAgICBAQXR0cmlidXRlKCdpdGVtY2xhc3MuYmluZCcpIGJpbmRpdGVtY2xhc3M6IHN0cmluZyxcbiAgICAgICAgQEF0dHJpYnV0ZSgnZGlzYWJsZWl0ZW0uYmluZCcpIGJpbmRkaXNhYmxlaXRlbTogc3RyaW5nLFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhc2V0LmJpbmQnKSBiaW5kZGF0YXNldDogc3RyaW5nLFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhc291cmNlLmJpbmQnKSBiaW5kZGF0YXNvdXJjZTogc3RyaW5nLFxuICAgICAgICBAQXR0cmlidXRlKCdtb3VzZWVudGVyLmV2ZW50JykgbW91c2VFbnRlckNCOiBzdHJpbmcsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ21vdXNlbGVhdmUuZXZlbnQnKSBtb3VzZUxlYXZlQ0I6IHN0cmluZyxcbiAgICAgICAgc3RhdGVQZXJzaXN0ZW5jZTogU3RhdGVQZXJzaXN0ZW5jZSxcbiAgICAgICAgcGFnaW5hdGlvblNlcnZpY2U6IFBhZ2luYXRpb25TZXJ2aWNlLFxuICAgICAgICBASW5qZWN0KCdFWFBMSUNJVF9DT05URVhUJykgQE9wdGlvbmFsKCkgZXhwbGljaXRDb250ZXh0OiBhbnlcbiAgICApIHtcbiAgICAgICAgbGV0IHJlc29sdmVGbjogRnVuY3Rpb24gPSBub29wO1xuICAgICAgICBjb25zdCBwcm9wc0luaXRQcm9taXNlID0gbmV3IFByb21pc2UocmVzID0+IHJlc29sdmVGbiA9IHJlcyk7XG4gICAgICAgIHN1cGVyKGluaiwgV0lER0VUX0NPTkZJRywgZXhwbGljaXRDb250ZXh0LCBwcm9wc0luaXRQcm9taXNlKTtcbiAgICAgICAgdGhpcy5wcm9wc0luaXRQcm9taXNlID0gcHJvcHNJbml0UHJvbWlzZTtcbiAgICAgICAgdGhpcy5wcm9taXNlUmVzb2x2ZXJGbiA9IHJlc29sdmVGbjtcbiAgICAgICAgc3R5bGVyKHRoaXMubmF0aXZlRWxlbWVudCwgdGhpcywgQVBQTFlfU1RZTEVTX1RZUEUuU0hFTEwpO1xuICAgICAgICB0aGlzLmNkUmVmID0gY2RSZWY7XG4gICAgICAgIHRoaXMubmdab25lID0gbmdab25lO1xuICAgICAgICB0aGlzLmRhdGVQaXBlID0gZGF0ZVBpcGU7XG4gICAgICAgIHRoaXMuc3RhdGVQZXJzaXN0ZW5jZSA9IHN0YXRlUGVyc2lzdGVuY2U7XG4gICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UgPSBwYWdpbmF0aW9uU2VydmljZTtcbiAgICAgICAgdGhpcy5fcGFnZUxvYWQgPSB0cnVlO1xuXG4gICAgICAgIHRoaXMuYmluZGl0ZW1jbGFzcyA9IGJpbmRpdGVtY2xhc3M7XG4gICAgICAgIHRoaXMuYmluZGRpc2FibGVpdGVtID0gYmluZGRpc2FibGVpdGVtO1xuICAgICAgICB0aGlzLmJpbmRkYXRhc2V0ID0gYmluZGRhdGFzZXQ7XG4gICAgICAgIHRoaXMubW91c2VFbnRlckNCID0gbW91c2VFbnRlckNCO1xuICAgICAgICB0aGlzLm1vdXNlTGVhdmVDQiA9IG1vdXNlTGVhdmVDQjtcbiAgICAgICAgdGhpcy5iaW5kZGF0YXNvdXJjZSA9IGJpbmRkYXRhc291cmNlO1xuXG4gICAgICAgIHRoaXMuYXBwID0gYXBwO1xuICAgICAgICB0aGlzLmFwcERlZmF1bHRzID0gYXBwRGVmYXVsdHM7XG4gICAgICAgIHRoaXMudmFyaWFibGVJbmZsaWdodCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMubm9EYXRhRm91bmQgPSAhYmluZGRhdGFzZXQ7XG4gICAgICAgIHRoaXMudGl0bGVJZCA9ICd3bWxpc3QtJyArIGdlbmVyYXRlR1VJZCgpO1xuXG4gICAgICAgIC8vIFVwZGF0ZXMgcGFnaW5hdGlvbiwgZmlsdGVyLCBzb3J0IGV0YyBvcHRpb25zIGZvciBzZXJ2aWNlIGFuZCBjcnVkIHZhcmlhYmxlc1xuICAgICAgICB0aGlzLl9saXN0ZW5lckRlc3Ryb3llcnMgPSBbXG4gICAgICAgICAgICB0aGlzLmFwcC5zdWJzY3JpYmUoJ2NoZWNrLXN0YXRlLXBlcnNpc3RlbmNlLW9wdGlvbnMnLCBvcHRpb25zID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZGF0YVNvdXJjZU5hbWUgPSBnZXQodGhpcy5kYXRhc291cmNlLCAnbmFtZScpO1xuICAgICAgICAgICAgICAgIC8vIGluIFByZWZhYnMsIHRoaXMuZGF0YXNvdXJjZSBpcyBub3QgcmVzb2x2ZWQgYXQgdGhlIHRpbWUgb2YgdmFyaWFibGUgaW52b2NhdGlvbiwgc28gYWRkaXRpb25hbCBjaGVjayBpcyByZXF1aXJlZC5cbiAgICAgICAgICAgICAgICBpZiAoIWRhdGFTb3VyY2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGFTb3VyY2VOYW1lID0gZXh0cmFjdERhdGFTb3VyY2VOYW1lKHRoaXMuYmluZGRhdGFzb3VyY2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZ2V0KG9wdGlvbnMsICd2YXJpYWJsZS5uYW1lJykgIT09IGRhdGFTb3VyY2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdGF0ZVBhcmFtcyhvcHRpb25zKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLy8gU2hvdyBsb2FkaW5nIHN0YXR1cyBiYXNlZCBvbiB0aGUgdmFyaWFibGUgbGlmZSBjeWNsZVxuICAgICAgICAgICAgdGhpcy5hcHAuc3Vic2NyaWJlKCd0b2dnbGUtdmFyaWFibGUtc3RhdGUnLCB0aGlzLmhhbmRsZUxvYWRpbmcuYmluZCh0aGlzKSksXG4gICAgICAgICAgICB0aGlzLmFwcC5zdWJzY3JpYmUoJ3NldHVwLWN1ZC1saXN0ZW5lcicsIHBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpICE9PSBwYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2lzRGVwZW5kZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBzZWxlY3RlZGl0ZW0oKSB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q2xvbmVkT2JqZWN0KHRoaXMuX2l0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNFbXB0eSh0aGlzLl9pdGVtcykpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2V0Q2xvbmVkT2JqZWN0KHRoaXMuX2l0ZW1zWzBdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkaXRlbShpdGVtcykge1xuICAgICAgICB0aGlzLl9pdGVtcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLmRlc2VsZWN0TGlzdEl0ZW1zKCk7XG5cbiAgICAgICAgaWYgKGlzQXJyYXkoaXRlbXMpKSB7XG4gICAgICAgICAgICBpdGVtcy5mb3JFYWNoKGl0ZW0gPT4gdGhpcy5zZWxlY3RJdGVtKGl0ZW0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShpdGVtcyk7XG4gICAgICAgIH1cbiAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgbGlzdCBvZiB3aWRnZXRzIHByZXNlbnQgb24gbGlzdCBpdGVtIGJ5IGNvbnNpZGVyaW5nIG5hbWUgYW5kIGluZGV4IG9mIHRoZSB3aWRnZXQuXG4gICAgICogSWYgd2UgZGlkJ250IHBhc3MgaW5kZXgsIGl0IHJldHVybnMgYXJyYXkgb2YgYWxsIHRoZSB3aWRnZXRzIHdoaWNoIGFyZSBtYXRjaGluZyB0byB3aWRnZXQgbmFtZVxuICAgICAqIEBwYXJhbSB3aWRndGVOYW1lOiBOYW1lIG9mIHRoZSB3aWRnZXRcbiAgICAgKiBAcGFyYW0gaW5kZXg6IEluZGV4IG9mIHRoZSB3aWRnZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0V2lkZ2V0cyh3aWRndGVOYW1lOiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgICAgIGxldCAkdGFyZ2V0O1xuICAgICAgICBjb25zdCByZXRWYWwgPSBbXTtcblxuICAgICAgICBpZiAoIXdpZGd0ZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNEZWZpbmVkKGluZGV4KSkge1xuICAgICAgICAgICAgZm9yRWFjaCh0aGlzLmxpc3RJdGVtcy50b0FycmF5KCksIChlbCkgPT4ge1xuICAgICAgICAgICAgICAgICR0YXJnZXQgPSBnZXQoZWwuY3VycmVudEl0ZW1XaWRnZXRzLCB3aWRndGVOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoJHRhcmdldCkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwucHVzaCgkdGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCA9ICtpbmRleCB8fCAwO1xuXG4gICAgICAgICR0YXJnZXQgPSBnZXQodGhpcy5saXN0SXRlbXMudG9BcnJheSgpLCBpbmRleCk7XG5cbiAgICAgICAgaWYgKCR0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBbZ2V0KCR0YXJnZXQuY3VycmVudEl0ZW1XaWRnZXRzLCB3aWRndGVOYW1lKV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIGxpc3RpdGVtIHJlZmVyZW5jZSBieSBpbmRleCB2YWx1ZS4gVGhpcyByZWZlcnMgdG8gdGhlIHNhbWUgbWV0aG9kIGdldExpc3RJdGVtQnlJbmRleC5cbiAgICBwdWJsaWMgZ2V0SXRlbShpbmRleDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExpc3RJdGVtQnlJbmRleChpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbmRleCBvZiBsaXN0SXRlbShsaXN0SXRlbURpcmVjdGl2ZSAvIGxpc3RJdGVtT2JqZWN0KVxuICAgICAqIElmIGl0ZW0gaXMgYSBkaXJlY3RpdmUsIGluZGV4IGlzIGZldGNoZWQgZnJvbSBsaXN0SXRlbXNcbiAgICAgKiBJZiBpdGVtIGlzIGFuIG9iamVjdCwgaW5kZXggaXMgZmV0Y2hlZCBmcm9tIGZpZWxkRGVmc1xuICAgICAqL1xuICAgIHB1YmxpYyBnZXRJbmRleChpdGVtOiBhbnkpIHtcbiAgICAgICAgaWYgKGl0ZW0gaW5zdGFuY2VvZiBMaXN0SXRlbURpcmVjdGl2ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEl0ZW1JbmRleChpdGVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWVsZERlZnMuZmluZEluZGV4KChvYmopID0+IGlzRXF1YWwob2JqLCBpdGVtKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0RlcGVuZGVudCkge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyV01FdmVudCgnaW5zZXJ0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlZGl0Um93KGl0ZW0/KSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0RlcGVuZGVudCkge1xuICAgICAgICAgICAgbGV0IGxpc3RJdGVtO1xuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBsaXN0SXRlbSA9IHRoaXMuZ2V0SXRlbVJlZkJ5SW5kZXhPck1vZGVsKGl0ZW0pLml0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJXTUV2ZW50KCd1cGRhdGUnLCBsaXN0SXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUoaXRlbT8pIHtcbiAgICAgICAgdGhpcy5lZGl0Um93KGl0ZW0pO1xuICAgIH1cblxuICAgIGRlbGV0ZVJvdyhpdGVtPykge1xuICAgICAgICBpZiAodGhpcy5faXNEZXBlbmRlbnQpIHtcbiAgICAgICAgICAgIGxldCBsaXN0SXRlbTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgbGlzdEl0ZW0gPSB0aGlzLmdldEl0ZW1SZWZCeUluZGV4T3JNb2RlbChpdGVtKS5pdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyV01FdmVudCgnZGVsZXRlJywgbGlzdEl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVsZXRlKGl0ZW0/KSB7XG4gICAgICAgIHRoaXMuZGVsZXRlUm93KGl0ZW0pO1xuICAgIH1cblxuICAgIGhhbmRsZUxvYWRpbmcoZGF0YSkge1xuICAgICAgICBjb25zdCBkYXRhU291cmNlID0gdGhpcy5kYXRhc291cmNlO1xuICAgICAgICBpZiAoZGF0YVNvdXJjZSAmJiBkYXRhU291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uSVNfQVBJX0FXQVJFKSAmJiBpc0RhdGFTb3VyY2VFcXVhbChkYXRhLnZhcmlhYmxlLCBkYXRhU291cmNlKSkge1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN0YXRlUGFyYW1zKGRhdGEpO1xuICAgICAgICAgICAgICAgIHRoaXMudmFyaWFibGVJbmZsaWdodCA9IGRhdGEuYWN0aXZlO1xuICAgICAgICAgICAgICAgIC8vIEZpeCBmb3IgW1dNUy0yMzc3Ml0gVXBkYXRlIG5vZGF0YWZvdW5kIGZsYWcgb25jZSB0aGUgcmVzcG9uc2UgaXMgcmVjaWV2ZWQgZnJvbSB0aGUgc2VydmVyXG4gICAgICAgICAgICAgICAgY29uc3QgdG90YWxFbGUgPSBkYXRhLmRhdGE/LnBhZ2luYXRpb24/LnRvdGFsRWxlbWVudHM7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh0b3RhbEVsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IHRvdGFsRWxlID09PSAwID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRvdGFsZWxlbWVudHMgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9EYXRhRm91bmQgPSBpc0VtcHR5KGRhdGEuZGF0YT8uZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlckxpc3RJdGVtU2VsZWN0aW9uKCRlbDogSlF1ZXJ5PEhUTUxFbGVtZW50PiwgJGV2ZW50OiBFdmVudCkge1xuICAgICAgICBpZiAoJGVsICYmICRlbFswXSkge1xuICAgICAgICAgICAgY29uc3QgbGlzdEl0ZW1Db250ZXh0ID0gJGVsLmRhdGEoJ2xpc3RJdGVtQ29udGV4dCcpO1xuICAgICAgICAgICAgLy8gVHJpZ2dlciBjbGljayBldmVudCBvbmx5IGlmIHRoZSBsaXN0IGl0ZW0gaXMgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBsaXN0LlxuICAgICAgICAgICAgaWYgKGxpc3RJdGVtQ29udGV4dC5saXN0Q29tcG9uZW50ID09PSB0aGlzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkl0ZW1DbGljaygkZXZlbnQsIGxpc3RJdGVtQ29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZm9ybSBvdGhlciBkYXRhIHdpZGdldHMgbGlrZSB0YWJsZS5cbiAgICBwdWJsaWMgZXhlY3V0ZShvcGVyYXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKFtEYXRhU291cmNlLk9wZXJhdGlvbi5JU19BUElfQVdBUkUsIERhdGFTb3VyY2UuT3BlcmF0aW9uLklTX1BBR0VBQkxFLCBEYXRhU291cmNlLk9wZXJhdGlvbi5TVVBQT1JUU19TRVJWRVJfRklMVEVSXS5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNvdXJjZS5leGVjdXRlKG9wZXJhdGlvbiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZUtleURvd24oJGV2ZW50LCBhY3Rpb246IHN0cmluZykge1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICgkZXZlbnQua2V5Q29kZSAhPT0gMTMgJiYgJGV2ZW50LmtleUNvZGUgIT09IDkgJiYgISgoJGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ2Zvcm0tY29udHJvbCcpIHx8ICRldmVudC50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdub3RlLWVkaXRhYmxlJykpICYmICRldmVudC5rZXlDb2RlID09PSAzMikpIHtcbiAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGlzdEl0ZW1zOiBRdWVyeUxpc3Q8TGlzdEl0ZW1EaXJlY3RpdmU+ID0gdGhpcy5saXN0SXRlbXM7XG5cbiAgICAgICAgbGV0IHByZXNlbnRJbmRleDogbnVtYmVyID0gdGhpcy5nZXRMaXN0SXRlbUluZGV4KHRoaXMubGFzdFNlbGVjdGVkSXRlbSk7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0SW5kZXg6IG51bWJlciA9IHRoaXMuZ2V0TGlzdEl0ZW1JbmRleCh0aGlzLmZpcnN0U2VsZWN0ZWRJdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdENvdW50OiBudW1iZXIgPSBpc0FycmF5KHRoaXMuc2VsZWN0ZWRpdGVtKSA/IHRoaXMuc2VsZWN0ZWRpdGVtLmxlbmd0aCA6IChpc09iamVjdCh0aGlzLnNlbGVjdGVkaXRlbSkgPyAxIDogMCk7XG4gICAgICAgICAgICBpZiAoYWN0aW9uID09PSAnc2VsZWN0UHJldicpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJlc2VudEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHByZXNlbnRJbmRleCA8PSBmaXJzdEluZGV4KSAmJiB0aGlzLmNoZWNrU2VsZWN0aW9uTGltaXQoc2VsZWN0Q291bnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24odGhpcy5sYXN0U2VsZWN0ZWRJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmVzZW50SW5kZXggPiBmaXJzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3RJdGVtU2VsZWN0aW9uKHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gdGhpcy5nZXRMaXN0SXRlbUJ5SW5kZXgocHJlc2VudEluZGV4IC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdGlvbmxpbWl0ZXhjZWVkJywgeyRldmVudH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdzZWxlY3ROZXh0Jykge1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZW50SW5kZXggPCBsaXN0SXRlbXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHByZXNlbnRJbmRleCA+PSBmaXJzdEluZGV4KSAmJiB0aGlzLmNoZWNrU2VsZWN0aW9uTGltaXQoc2VsZWN0Q291bnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24odGhpcy5sYXN0U2VsZWN0ZWRJdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcmVzZW50SW5kZXggPCBmaXJzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3RJdGVtU2VsZWN0aW9uKHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gdGhpcy5nZXRMaXN0SXRlbUJ5SW5kZXgocHJlc2VudEluZGV4ICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdGlvbmxpbWl0ZXhjZWVkJywgeyRldmVudH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhY3Rpb24gPT09ICdmb2N1c1ByZXYnKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0xpc3RFbGVtZW50TW92YWJsZSkge1xuICAgICAgICAgICAgICAgIHByZXNlbnRJbmRleCA9IHByZXNlbnRJbmRleCA8PSAwID8gMCA6IChwcmVzZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZW50SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9IHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldkVsdCA9IHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCAtIDEpO1xuICAgICAgICAgICAgICAgIHByZXZFbHQubmF0aXZlRWxlbWVudC5iZWZvcmUodGhpcy5sYXN0U2VsZWN0ZWRJdGVtLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVBlcnNpc3RlbmNlLnJlbW92ZVdpZGdldFN0YXRlKHRoaXMsICdzZWxlY3RlZEl0ZW0nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSB0aGlzLmxpc3RJdGVtcy50b0FycmF5KCk7XG4gICAgICAgICAgICAgICAgW2FycltwcmVzZW50SW5kZXggLSAxXSwgYXJyW3ByZXNlbnRJbmRleF1dID0gW2FycltwcmVzZW50SW5kZXhdLCBhcnJbcHJlc2VudEluZGV4IC0gMV1dO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdEl0ZW1zLnJlc2V0KGFycik7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBwcmVzZW50SW5kZXg7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmlhVGV4dCA9IFwic2VsZWN0ZWQgXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXNlbnRJbmRleCA9IHByZXNlbnRJbmRleCA8PSAwID8gMCA6IChwcmVzZW50SW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBwcmVzZW50SW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMuYXJpYVRleHQgPSBcInNlbGVjdGVkIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2ZvY3VzTmV4dCcpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzTGlzdEVsZW1lbnRNb3ZhYmxlKSB7XG4gICAgICAgICAgICAgICAgcHJlc2VudEluZGV4ID0gcHJlc2VudEluZGV4IDwgKGxpc3RJdGVtcy5sZW5ndGggLSAxKSA/IChwcmVzZW50SW5kZXgpIDogKGxpc3RJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICBpZiAocHJlc2VudEluZGV4ID09PSB0aGlzLmxpc3RJdGVtcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG5leHRFbHQgPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICBuZXh0RWx0Lm5hdGl2ZUVsZW1lbnQuYWZ0ZXIodGhpcy5sYXN0U2VsZWN0ZWRJdGVtLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVBlcnNpc3RlbmNlLnJlbW92ZVdpZGdldFN0YXRlKHRoaXMsICdzZWxlY3RlZEl0ZW0nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSB0aGlzLmxpc3RJdGVtcy50b0FycmF5KCk7XG4gICAgICAgICAgICAgICAgW2FycltwcmVzZW50SW5kZXhdLCBhcnJbcHJlc2VudEluZGV4ICsgMV1dID0gW2FycltwcmVzZW50SW5kZXggKyAxXSwgYXJyW3ByZXNlbnRJbmRleF1dO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdEl0ZW1zLnJlc2V0KGFycik7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBwcmVzZW50SW5kZXggKyAyO1xuICAgICAgICAgICAgICAgIHRoaXMuYXJpYVRleHQgPSBcInNlbGVjdGVkIFwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwcmVzZW50SW5kZXggPSBwcmVzZW50SW5kZXggPCAobGlzdEl0ZW1zLmxlbmd0aCAtIDEpID8gKHByZXNlbnRJbmRleCArIDEpIDogKGxpc3RJdGVtcy5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBwcmVzZW50SW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMuYXJpYVRleHQgPSBcInNlbGVjdGVkIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBlbnRlciBjbGljayBpcyBwcmVzc2VkIG9uIHRoZSBpdGVtIHdoaWNoIGlzIG5vdCB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLCB0aGUgZmluZCB0aGUgaXRlbSBmcm9tIHdoaWNoIHRoZSBldmVudCBpcyBvcmlnaW5hdGVkLlxuICAgICAgICAgICAgaWYgKHByZXNlbnRJbmRleCA9PT0gLTEgfHwgISQoJGV2ZW50LnRhcmdldCkuY2xvc2VzdCh0aGlzLmxhc3RTZWxlY3RlZEl0ZW0ubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCAkbGkgPSAkKCRldmVudC50YXJnZXQpLmNsb3Nlc3QoJ2xpLmFwcC1saXN0LWl0ZW0nKTtcbiAgICAgICAgICAgICAgICBjb25zdCAkdWwgPSAkbGkuY2xvc2VzdCgndWwuYXBwLWxpdmVsaXN0LWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgICAgIHByZXNlbnRJbmRleCA9ICR1bC5maW5kKCdsaS5hcHAtbGlzdC1pdGVtJykuaW5kZXgoJGxpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25JdGVtQ2xpY2soJGV2ZW50LCB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24gPT09ICdzcGFjZScpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5lbmFibGVyZW9yZGVyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pc0xpc3RFbGVtZW50TW92YWJsZSA9ICF0aGlzLmlzTGlzdEVsZW1lbnRNb3ZhYmxlO1xuICAgICAgICAgICAgdGhpcy5vbkl0ZW1DbGljaygkZXZlbnQsIHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCkpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBwcmVzZW50SW5kZXggKyAxO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNMaXN0RWxlbWVudE1vdmFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFyaWFUZXh0ID0gYEl0ZW0gJHt0aGlzLmN1cnJlbnRJbmRleH0gZ3JhYmJlZCwgY3VycmVudCBwb3NpdGlvbiBgO1xuICAgICAgICAgICAgICAgIHRoaXMuJHVsRWxlLmRhdGEoJ29sZEluZGV4JywgcHJlc2VudEluZGV4KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmlhVGV4dCA9IGBJdGVtICR7dGhpcy5jdXJyZW50SW5kZXh9IGRyb3BwZWQsIGZpbmFsIHBvc2l0aW9uIGA7XG4gICAgICAgICAgICAgICAgdGhpcy5vblVwZGF0ZSgkZXZlbnQsIHVuZGVmaW5lZCwgcHJlc2VudEluZGV4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uUHJvcGVydHlDaGFuZ2Uoa2V5OiBzdHJpbmcsIG52OiBhbnksIG92PzogYW55KSB7XG4gICAgICAgIGlmIChrZXkgPT09ICdkYXRhc2V0Jykge1xuICAgICAgICAgICAgaWYgKCFudiAmJiB0aGlzLmJpbmRkYXRhc291cmNlICYmICF0aGlzLmRhdGFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm9uRGF0YVNldENoYW5nZShudik7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnZGF0YXNvdXJjZScpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFzZXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRGF0YVNldENoYW5nZSh0aGlzLmRhdGFzZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ25hdmlnYXRpb24nKSB7XG4gICAgICAgICAgICAvLyBTdXBwb3J0IGZvciBvbGRlciBwcm9qZWN0cyB3aGVyZSBuYXZpZ2F0aW9uIHR5cGUgd2FzIGFkdmFuY2VkIGluc3RlYWQgb2YgY2xhc3NpY1xuICAgICAgICAgICAgaWYgKG52ID09PSAnQWR2YW5jZWQnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0aW9uID0gJ0NsYXNzaWMnO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN3aXRjaENsYXNzKHRoaXMubmF0aXZlRWxlbWVudCwgbnYsIG92KTtcbiAgICAgICAgICAgIHRoaXMub25OYXZpZ2F0aW9uVHlwZUNoYW5nZShudik7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhTmF2aWdhdG9yKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhTmF2aWdhdG9yLm5hdmlnYXRpb25DbGFzcyA9IHRoaXMucGFnaW5hdGlvbmNsYXNzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2l0ZW1zcGVycm93Jykge1xuICAgICAgICAgICAgc2V0TGlzdENsYXNzKHRoaXMpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3RhYmluZGV4Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3B1bGx0b3JlZnJlc2gnICYmIG52KSB7XG4gICAgICAgICAgICB0aGlzLmFwcC5ub3RpZnkoJ3B1bGxUb1JlZnJlc2g6ZW5hYmxlJyk7XG4gICAgICAgICAgICB0aGlzLnN1YnNjcmliZVRvUHVsbFRvUmVmcmVzaCgpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3BhZ2luYXRpb25jbGFzcycpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFOYXZpZ2F0b3IpIHtcbiAgICAgICAgICAgICAgICAvLyBBZGRpbmcgc2V0VGltZW91dCBiZWNhdXNlIGluIHBhZ2luYXRpb24gY29tcG9uZW50IHVwZGF0ZU5hdlNpemUgbWV0aG9kIGlzIG92ZXJyaWRpbmcgbmF2aWdhdGlvbmNsYXNzXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmRhdGFOYXZpZ2F0b3IubmF2aWdhdGlvbkNsYXNzID0gbnYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3BhZ2VzaXplJykge1xuICAgICAgICAgICAgdGhpcy5kYXRhTmF2aWdhdG9yLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgbWF4UmVzdWx0czogbnZcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmRhdGFOYXZpZ2F0b3Iud2lkZ2V0Lm1heFJlc3VsdHMgPSBudjtcbiAgICAgICAgICAgIHRoaXMuZGF0YU5hdmlnYXRvci5tYXhSZXN1bHRzID0gbnY7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnZW5hYmxlcmVvcmRlcicpIHtcbiAgICAgICAgICAgIGlmIChudiAmJiB0aGlzLiR1bEVsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHVsRWxlLmF0dHIoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aGlzLnRpdGxlSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJlRG5EKCk7XG4gICAgICAgICAgICAgICAgdGhpcy4kdWxFbGUuc29ydGFibGUoJ2VuYWJsZScpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLiR1bEVsZSAmJiAhbnYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiR1bEVsZS5yZW1vdmVBdHRyKCdhcmlhLWRlc2NyaWJlZGJ5Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy4kdWxFbGUuc29ydGFibGUoJ2Rpc2FibGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uSXRlbUNsaWNrKGV2dDogYW55LCAkbGlzdEl0ZW06IExpc3RJdGVtRGlyZWN0aXZlKSB7XG4gICAgICAgIGxldCBzZWxlY3RDb3VudDogbnVtYmVyO1xuXG4gICAgICAgIGlmICghJGxpc3RJdGVtLmRpc2FibGVJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLmZpcnN0U2VsZWN0ZWRJdGVtID0gdGhpcy5maXJzdFNlbGVjdGVkSXRlbSB8fCAkbGlzdEl0ZW07XG4gICAgICAgICAgICAvLyBTZXR0aW5nIHNlbGVjdENvdW50IHZhbHVlIGJhc2VkIG51bWJlciBvZiBpdGVtcyBzZWxlY3RlZC5cbiAgICAgICAgICAgIHNlbGVjdENvdW50ID0gaXNBcnJheSh0aGlzLnNlbGVjdGVkaXRlbSkgPyB0aGlzLnNlbGVjdGVkaXRlbS5sZW5ndGggOiAoaXNPYmplY3QodGhpcy5zZWxlY3RlZGl0ZW0pID8gMSA6IDApO1xuXG4gICAgICAgICAgICAvLyBIYW5kbGluZyBtdWx0aXNlbGVjdCBmb3IgbW9iaWxlIGRldmljZVxuICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3QgJiYgaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrU2VsZWN0aW9uTGltaXQoc2VsZWN0Q291bnQpIHx8ICRsaXN0SXRlbS5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3RJdGVtU2VsZWN0aW9uKCRsaXN0SXRlbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzZWxlY3Rpb25saW1pdGV4Y2VlZCcsIHskZXZlbnQ6IGV2dH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoKGV2dC5jdHJsS2V5IHx8IGV2dC5tZXRhS2V5KSAmJiB0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tTZWxlY3Rpb25MaW1pdChzZWxlY3RDb3VudCkgfHwgJGxpc3RJdGVtLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSAkbGlzdEl0ZW07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24oJGxpc3RJdGVtKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdGlvbmxpbWl0ZXhjZWVkJywgeyRldmVudDogZXZ0fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChldnQuc2hpZnRLZXkgJiYgdGhpcy5tdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgICAgIGxldCBmaXJzdCA9ICRsaXN0SXRlbS5jb250ZXh0LmluZGV4O1xuICAgICAgICAgICAgICAgIGxldCBsYXN0ID0gdGhpcy5maXJzdFNlbGVjdGVkSXRlbS5jb250ZXh0LmluZGV4O1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgZmlyc3QgaXMgZ3JlYXRlciB0aGFuIGxhc3QsIHRoZW4gc3dhcCB2YWx1ZXNcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPiBsYXN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxhc3QgPSBbZmlyc3QsIGZpcnN0ID0gbGFzdF1bMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrU2VsZWN0aW9uTGltaXQobGFzdCAtIGZpcnN0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtcygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RJdGVtcy5mb3JFYWNoKCgkbGlJdGVtOiBMaXN0SXRlbURpcmVjdGl2ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSAkbGlJdGVtLmNvbnRleHQuaW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gZmlyc3QgJiYgaW5kZXggPD0gbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24oJGxpSXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSAkbGlzdEl0ZW07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzZWxlY3Rpb25saW1pdGV4Y2VlZCcsIHskZXZlbnQ6IGV2dH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoISRsaXN0SXRlbS5pc0FjdGl2ZSB8fCBzZWxlY3RDb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGVkSXRlbXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbigkbGlzdEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0U2VsZWN0ZWRJdGVtID0gdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gJGxpc3RJdGVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICRhcHBEaWdlc3QoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEVtcHR5IHRoZSBsaXN0IGNvbnRlbnQgb24gY2xlYXJcbiAgICBwdWJsaWMgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRmllbGREZWZzKFtdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBkZXNlbGVjdHMgaXRlbSBpbiB0aGUgbGlzdC5cbiAgICAgKiBAcGFyYW0gdmFsOiBpbmRleCB8IG1vZGVsIG9mIHRoZSBsaXN0IGl0ZW0uXG4gICAgICovXG4gICAgcHVibGljIGRlc2VsZWN0SXRlbSh2YWw6IGFueSkge1xuICAgICAgICBjb25zdCBsaXN0SXRlbSA9IHRoaXMuZ2V0SXRlbVJlZkJ5SW5kZXhPck1vZGVsKHZhbCk7XG4gICAgICAgIGlmIChsaXN0SXRlbSAmJiBsaXN0SXRlbS5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbihsaXN0SXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBzZWxlY3RzIGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICogQHBhcmFtIHZhbDogaW5kZXggfCBtb2RlbCBvZiB0aGUgbGlzdCBpdGVtLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtKHZhbCwgc3RhdGVQZXJzaXN0ZW5jZVRyaWdnZXJlZD8pIHtcbiAgICAgICAgY29uc3QgbGlzdEl0ZW0gPSB0aGlzLmdldEl0ZW1SZWZCeUluZGV4T3JNb2RlbCh2YWwpO1xuICAgICAgICBpZiAoIWxpc3RJdGVtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsaXN0SXRlbS5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbihsaXN0SXRlbSwgc3RhdGVQZXJzaXN0ZW5jZVRyaWdnZXJlZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZm9jdXMgdGhlIGVsZW1lbnQuXG4gICAgICAgIGxpc3RJdGVtLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5oYW5kbGVIZWFkZXJDbGljayA9IG5vb3A7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZWJvdW5jZWRGZXRjaE5leHREYXRhc2V0T25TY3JvbGwgPSB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmRlYm91bmNlZEZldGNoTmV4dERhdGFzZXRPblNjcm9sbCh0aGlzLmRhdGFOYXZpZ2F0b3IsIERFQk9VTkNFX1RJTUVTLlBBR0lOQVRJT05fREVCT1VOQ0VfVElNRSwgdGhpcyk7XG4gICAgICAgIH0sIDApO1xuICAgICAgICB0aGlzLl9pdGVtcyA9IFtdO1xuICAgICAgICB0aGlzLmZpZWxkRGVmcyA9IFtdO1xuICAgICAgICB0aGlzLnJlb3JkZXJQcm9wcyA9IHtcbiAgICAgICAgICAgIG1pbkluZGV4OiBudWxsLFxuICAgICAgICAgICAgbWF4SW5kZXg6IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMucHJvbWlzZVJlc29sdmVyRm4oKTtcbiAgICAgICAgdGhpcy5wcm9wc0luaXRQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgc3VwZXIubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICAgICAgICB0aGlzLnNldFVwQ1VESGFuZGxlcnMoKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtV2lkZ2V0cyA9IHRoaXMubXVsdGlzZWxlY3QgPyBbXSA6IHt9O1xuICAgICAgICAgICAgdmFyIGVsZSA9ICQodGhpcy5uYXRpdmVFbGVtZW50KS5maW5kKCcuYXBwLWxpdmVsaXN0LWNvbnRhaW5lcicpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5lbmFibGVyZW9yZGVyICYmICF0aGlzLmdyb3VwYnkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZS5hdHRyKCdhcmlhLWRlc2NyaWJlZGJ5JywgdGhpcy50aXRsZUlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWd1cmVEbkQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5lbmFibGVyZW9yZGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZSkge1xuICAgICAgICAgICAgICAgICAgICBlbGUucmVtb3ZlQXR0cignYXJpYS1kZXNjcmliZWRieScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwYnkgJiYgdGhpcy5jb2xsYXBzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlSGVhZGVyQ2xpY2sgPSBoYW5kbGVIZWFkZXJDbGljaztcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUFsbEhlYWRlcnMgPSB0b2dnbGVBbGxIZWFkZXJzLmJpbmQodW5kZWZpbmVkLCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldExpc3RDbGFzcyh0aGlzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0dXBIYW5kbGVycygpO1xuICAgICAgICBjb25zdCAkdWwgPSB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndWwuYXBwLWxpdmVsaXN0LWNvbnRhaW5lcicpO1xuICAgICAgICBzdHlsZXIoJHVsIGFzIEhUTUxFbGVtZW50LCB0aGlzLCBBUFBMWV9TVFlMRVNfVFlQRS5TQ1JPTExBQkxFX0NPTlRBSU5FUik7XG4gICAgICAgIGlmICh0aGlzLmVuYWJsZXJlb3JkZXIpIHtcbiAgICAgICAgICAgIGlmICgkdWwpIHtcbiAgICAgICAgICAgICAgICAkdWwuc2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JywgdGhpcy50aXRsZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlcmVvcmRlcikge1xuICAgICAgICAgICAgaWYgKCR1bCkge1xuICAgICAgICAgICAgICAgICR1bC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNNb2JpbGVBcHAoKSAmJiAkdWwucXVlcnlTZWxlY3RvcignLmFwcC1saXN0LWl0ZW0tYWN0aW9uLXBhbmVsJykpIHtcbiAgICAgICAgICAgIHRoaXMuX2xpc3RBbmltYXRvciA9IG5ldyBMaXN0QW5pbWF0b3IodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xpc3RBbmltYXRvciAmJiB0aGlzLl9saXN0QW5pbWF0b3IuJGJ0blN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fbGlzdEFuaW1hdG9yLiRidG5TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9saXN0ZW5lckRlc3Ryb3llcnMuZm9yRWFjaChkID0+IGQgJiYgZCgpKTtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBuZ09uRGV0YWNoKCkge1xuICAgICAgICBzdXBlci5uZ09uRGV0YWNoKCk7XG4gICAgICAgIHRoaXMuX3BhZ2VMb2FkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgaGFuZGxlRXZlbnQobm9kZTogSFRNTEVsZW1lbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBldmVudENhbGxiYWNrOiBGdW5jdGlvbiwgbG9jYWxzOiBhbnkpIHtcbiAgICAgICAgLy8gdGFwIGFuZCBkb3VibGVUYXAgZXZlbnRzIGFyZSBub3QgZ2V0dGluZyBwcm9wYWdhdGVkLlNvLCB1c2luZyBtb3VzZSBldmVudHMgaW5zdGVhZC5cbiAgICAgICAgY29uc3QgdG91Y2hUb01vdXNlID0ge1xuICAgICAgICAgICAgdGFwOiAnY2xpY2snLFxuICAgICAgICAgICAgZG91YmxldGFwOiAnZGJsY2xpY2snXG4gICAgICAgIH07XG4gICAgICAgIGlmIChpbmNsdWRlcyhbJ2NsaWNrJywgJ3RhcCcsICdkYmxjbGljaycsICdkb3VibGV0YXAnXSwgZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgdG91Y2hUb01vdXNlW2V2ZW50TmFtZV0gfHwgZXZlbnROYW1lLFxuICAgICAgICAgICAgICAgIChldnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gJChldnQudGFyZ2V0KS5jbG9zZXN0KCcuYXBwLWxpc3QtaXRlbScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdEl0ZW1Db250ZXh0OiBMaXN0SXRlbURpcmVjdGl2ZSA9IHRhcmdldC5kYXRhKCdsaXN0SXRlbUNvbnRleHQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGlzdEl0ZW1Db250ZXh0LmRpc2FibGVJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKGV2ZW50TmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXQ6IGxpc3RJdGVtQ29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJGV2ZW50OiBldnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW06IGxpc3RJdGVtQ29udGV4dC5pdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDb25maWd1cmVkU3RhdGUoKSB7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLnN0YXRlUGVyc2lzdGVuY2UuY29tcHV0ZU1vZGUodGhpcy5zdGF0ZWhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gbW9kZSAmJiBtb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVTdGF0ZVBhcmFtcyhvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLl9wYWdlTG9hZCAmJiB0aGlzLmdldENvbmZpZ3VyZWRTdGF0ZSgpICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhZ2VMb2FkID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCB3aWRnZXRTdGF0ZSA9IHRoaXMuc3RhdGVQZXJzaXN0ZW5jZS5nZXRXaWRnZXRTdGF0ZSh0aGlzKTtcbiAgICAgICAgICAgIGlmIChnZXQod2lkZ2V0U3RhdGUsICdwYWdpbmF0aW9uJykpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLm9wdGlvbnMgPSBvcHRpb25zLm9wdGlvbnMgfHwge307XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5vcHRpb25zLnBhZ2UgPSB3aWRnZXRTdGF0ZS5wYWdpbmF0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGdldCh3aWRnZXRTdGF0ZSwgJ3NlbGVjdGVkSXRlbScpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRJdGVtc0V4aXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdHJpZ2dlcldNRXZlbnQoZXZlbnROYW1lLCBpdGVtPykge1xuICAgICAgICAkaW52b2tlV2F0Y2hlcnModHJ1ZSk7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgbXVsdGlzZWxlY3QgZm9yIHRoZSBsaXZlbGlzdChMaXN0IHdpdGggZm9ybSB0ZW1wbGF0ZSksIGluIHJ1biBtb2RlIGRlbGV0aW5nIGEgcmVjb3JkIGlzIGdldHRpbmcgZmFpbGVkLiBCZWN1YXNlIHRoZSBzZWxlY3RlZGl0ZW0gd2lsbCBiZSBhcnJheSBvZiBvYmplY3RzLiBTbyBjb25zaWRlciB0aGUgbGFzdCBvYmplY3QuXG4gICAgICAgIGxldCByb3cgPSB0aGlzLm11bHRpc2VsZWN0ID8gbGFzdCh0aGlzLnNlbGVjdGVkaXRlbSkgOiB0aGlzLnNlbGVjdGVkaXRlbTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHJvdyA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHAubm90aWZ5KCd3bS1ldmVudCcsIHtldmVudE5hbWUsIHdpZGdldE5hbWU6IHRoaXMubmFtZSwgcm93OiByb3d9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0TmF2aWdhdGlvbigpIHtcbiAgICAgICAgdGhpcy5zaG93TmF2aWdhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLm5hdkNvbnRyb2xzID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmluZlNjcm9sbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uRGVtYW5kTG9hZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlQmFzaWNOYXZpZ2F0aW9uKCkge1xuICAgICAgICB0aGlzLm5hdkNvbnRyb2xzID0gTkFWSUdBVElPTl9UWVBFLkJBU0lDO1xuICAgICAgICB0aGlzLnNob3dOYXZpZ2F0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuYWJsZUlubGluZU5hdmlnYXRpb24oKSB7XG4gICAgICAgIHRoaXMubmF2Q29udHJvbHMgPSBOQVZJR0FUSU9OX1RZUEUuSU5MSU5FO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlQ2xhc3NpY05hdmlnYXRpb24oKSB7XG4gICAgICAgIHRoaXMubmF2Q29udHJvbHMgPSBOQVZJR0FUSU9OX1RZUEUuQ0xBU1NJQztcbiAgICAgICAgdGhpcy5zaG93TmF2aWdhdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVQYWdlck5hdmlnYXRpb24oKSB7XG4gICAgICAgIHRoaXMubmF2Q29udHJvbHMgPSBOQVZJR0FUSU9OX1RZUEUuUEFHRVI7XG4gICAgICAgIHRoaXMuc2hvd05hdmlnYXRpb24gPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0TmF2aWdhdGlvblR5cGVOb25lKCkge1xuICAgICAgICB0aGlzLm5hdkNvbnRyb2xzID0gTkFWSUdBVElPTl9UWVBFLk5PTkU7XG4gICAgICAgIHRoaXMuc2hvd05hdmlnYXRpb24gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuYWJsZUluZmluaXRlU2Nyb2xsKCkge1xuICAgICAgICB0aGlzLmluZlNjcm9sbCA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVPbkRlbWFuZExvYWQoKSB7XG4gICAgICAgIHRoaXMub25EZW1hbmRMb2FkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93TmF2aWdhdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cyBOYXZpZ2F0aW9uIHR5cGUgZm9yIHRoZSBsaXN0LlxuICAgICAqIEBwYXJhbSB0eXBlXG4gICAgICovXG4gICAgcHJpdmF0ZSBvbk5hdmlnYXRpb25UeXBlQ2hhbmdlKHR5cGUpIHtcbiAgICAgICAgdGhpcy5yZXNldE5hdmlnYXRpb24oKTtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIE5BVklHQVRJT05fVFlQRS5CQVNJQzpcbiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZUJhc2ljTmF2aWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQVZJR0FUSU9OX1RZUEUuSU5MSU5FOlxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlSW5saW5lTmF2aWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQVZJR0FUSU9OX1RZUEUuQURWQU5DRUQ6XG4gICAgICAgICAgICBjYXNlIE5BVklHQVRJT05fVFlQRS5DTEFTU0lDOlxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlQ2xhc3NpY05hdmlnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkFWSUdBVElPTl9UWVBFLlBBR0VSOlxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlUGFnZXJOYXZpZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5BVklHQVRJT05fVFlQRS5OT05FIDpcbiAgICAgICAgICAgICAgICB0aGlzLnNldE5hdmlnYXRpb25UeXBlTm9uZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQVZJR0FUSU9OX1RZUEUuU0NST0xMOlxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlSW5maW5pdGVTY3JvbGwoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkFWSUdBVElPTl9UWVBFLk9OREVNQU5EOlxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlT25EZW1hbmRMb2FkKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgZmllbGREZWZzIHByb3BlcnR5LCBmaWVsZERlZnMgaXMgdGhlIG1vZGVsIG9mIHRoZSBMaXN0IENvbXBvbmVudC5cbiAgICAgKiBmaWVsZERlZnMgaXMgYW4gQXJyYXkgdHlwZS5cbiAgICAgKiBAcGFyYW0gbmV3VmFsXG4gICAgICovXG4gICAgcHJpdmF0ZSB1cGRhdGVGaWVsZERlZnMobmV3VmFsOiBBcnJheTxhbnk+KSB7XG4gICAgICAgIGlmICh0aGlzLmluZlNjcm9sbCB8fCB0aGlzLm9uRGVtYW5kTG9hZCkge1xuICAgICAgICAgICAgW3RoaXMuZmllbGREZWZzLCB0aGlzLmN1cnJlbnRQYWdlXSA9IHRoaXMucGFnaW5hdGlvblNlcnZpY2UudXBkYXRlRmllbGRzT25QYWdpbmF0aW9uKHRoaXMsIG5ld1ZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZpZWxkRGVmcyA9IG5ld1ZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLm9yZGVyYnkpIHtcbiAgICAgICAgICAgIHRoaXMuZmllbGREZWZzID0gZ2V0T3JkZXJlZERhdGFzZXQodGhpcy5maWVsZERlZnMsIHRoaXMub3JkZXJieSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBieSkge1xuICAgICAgICAgICAgdGhpcy5ncm91cGVkRGF0YSA9IGdyb3VwRGF0YSh0aGlzLCB0aGlzLmZpZWxkRGVmcywgdGhpcy5ncm91cGJ5LCB0aGlzLm1hdGNoLCB0aGlzLm9yZGVyYnksIHRoaXMuZGF0ZWZvcm1hdCwgdGhpcy5kYXRlUGlwZSwgdW5kZWZpbmVkLCB0aGlzLmFwcERlZmF1bHRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5maWVsZERlZnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLm5vRGF0YUZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRpdGVtID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgICRhcHBEaWdlc3QoKTtcbiAgICAgICAgdGhpcy5saXN0SXRlbXMuc2V0RGlydHkoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRGF0YUNoYW5nZShuZXdWYWwpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIG5ld1ZhbCBpcyBub3QgZW1wdHlcbiAgICAgICAgaWYgKCFpc0VtcHR5KG5ld1ZhbCkpIHtcblxuICAgICAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5pc0RhdGFDaGFuZ2VkID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YXNvdXJjZSAmJiB0aGlzLmRhdGFzb3VyY2UuZXhlY3V0ZShEYXRhU291cmNlLk9wZXJhdGlvbi5JU19BUElfQVdBUkUpKSB7XG4gICAgICAgICAgICAgICAgLy8gY2xvbmUgdGhlIHRoZSBkYXRhIGluIGNhc2Ugb2YgbGl2ZSBhbmQgc2VydmljZSB2YXJpYWJsZXMgdG8gcHJldmVudCB0aGUgdHdvLXdheSBiaW5kaW5nIGZvciB0aGVzZSB2YXJpYWJsZXMuXG4gICAgICAgICAgICAgICAgbmV3VmFsID0gY2xvbmVEZWVwKG5ld1ZhbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc09iamVjdChuZXdWYWwpICYmICFpc0FycmF5KG5ld1ZhbCkpIHtcbiAgICAgICAgICAgICAgICBuZXdWYWwgPSBpc0VtcHR5KG5ld1ZhbCkgPyBbXSA6IFtuZXdWYWxdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcobmV3VmFsKSkge1xuICAgICAgICAgICAgICAgIG5ld1ZhbCA9IG5ld1ZhbC5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiB0aGUgcGFnZSBudW1iZXIgaXMgZ3JlYXRlciB0aGFuIDEgb24gaW5pdGlhbCBsb2FkIHRoZW4gd2UgcmVuZGVyIHRoZSBmaXJzdCBwYWdlLlxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YXNvdXJjZSAmJiB0aGlzLmRhdGFzb3VyY2Uub3duZXIgPT09ICdBcHAnICYmICh0aGlzLmluZlNjcm9sbCB8fCB0aGlzLm9uRGVtYW5kTG9hZCkgJiYgIXRoaXMuY3VycmVudFBhZ2UgJiYgdGhpcy5kYXRhc291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uR0VUX1BBR0lOR19PUFRJT05TKS5udW1iZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgbmV3VmFsID0gdGhpcy5kYXRhc291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uTElTVF9SRUNPUkRTLCB7XG4gICAgICAgICAgICAgICAgICAgICdwYWdlJzogMVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNBcnJheShuZXdWYWwpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdiZWZvcmVkYXRhcmVuZGVyJywgeyRkYXRhOiBuZXdWYWx9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWVsZERlZnMobmV3VmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmllbGREZWZzKFtdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZXMgdGhlIGRhdGFTb3VyY2Ugd2hlbiBwYWdpbmF0aW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBDb21wb25lbnQuXG4gICAgcHJpdmF0ZSBzZXR1cERhdGFTb3VyY2UoKSB7XG4gICAgICAgIGNvbnN0IGRhdGFOYXZpZ2F0b3IgPSB0aGlzLmRhdGFOYXZpZ2F0b3I7XG5cbiAgICAgICAgZGF0YU5hdmlnYXRvci5vcHRpb25zID0ge1xuICAgICAgICAgICAgbWF4UmVzdWx0czogdGhpcy5wYWdlc2l6ZSB8fCAyMFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZGF0YU5hdmlnYXRvcldhdGNoZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLm5hdmlnYXRvclJlc3VsdFdhdGNoKSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRvclJlc3VsdFdhdGNoLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLypSZWdpc3RlciBhIHdhdGNoIG9uIHRoZSBcInJlc3VsdFwiIHByb3BlcnR5IG9mIHRoZSBcImRhdGFOYXZpZ2F0b3JcIiBzbyB0aGF0IHRoZSBwYWdpbmF0ZWQgZGF0YSBpcyBkaXNwbGF5ZWQgaW4gdGhlIGxpdmUtbGlzdC4qL1xuICAgICAgICB0aGlzLm5hdmlnYXRvclJlc3VsdFdhdGNoID0gZGF0YU5hdmlnYXRvci5yZXN1bHRFbWl0dGVyLnN1YnNjcmliZSgobmV3VmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhQ2hhbmdlKG5ld1ZhbCk7XG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgICAvKkRlLXJlZ2lzdGVyIHRoZSB3YXRjaCBpZiBpdCBpcyBleGlzdHMgKi9cbiAgICAgICAgaWYgKHRoaXMubmF2aWdhdG9yTWF4UmVzdWx0V2F0Y2gpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdG9yTWF4UmVzdWx0V2F0Y2gudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICAvKlJlZ2lzdGVyIGEgd2F0Y2ggb24gdGhlIFwibWF4UmVzdWx0c1wiIHByb3BlcnR5IG9mIHRoZSBcImRhdGFOYXZpZ2F0b3JcIiBzbyB0aGF0IHRoZSBcInBhZ2VTaXplXCIgaXMgZGlzcGxheWVkIGluIHRoZSBsaXZlLWxpc3QuKi9cbiAgICAgICAgdGhpcy5uYXZpZ2F0b3JNYXhSZXN1bHRXYXRjaCA9IGRhdGFOYXZpZ2F0b3IubWF4UmVzdWx0c0VtaXR0ZXIuc3Vic2NyaWJlKCh2YWwpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGFnZXNpemUgPSB2YWw7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRhdGFOYXZpZ2F0b3IubWF4UmVzdWx0cyA9IHRoaXMucGFnZXNpemUgfHwgMjA7XG4gICAgICAgIHRoaXMucmVtb3ZlUHJvcGVydHlCaW5kaW5nKCdkYXRhc2V0Jyk7XG4gICAgICAgIC8vIHdoZW4gbGlzdCBoYXZpbmcgXCJkYXRhc2V0Ym91bmRleHByXCIgYXR0ciBpbmRpY2F0ZXMgdGhhdCBsaXN0IGlzIGJvdW5kIHRvIGl0ZW0gY29udGV4dFxuICAgICAgICAvLyB3aGVuIGRhdGFzZXQgaXMgYm91bmQgdG8gXCJpdGVtLkZJRUxEXCIgdGhlbiBpdGVtIGNvbnRleHQgaXMgcGFzc2VkIGFzIHRoZSBkYXRhc291cmNlLlxuICAgICAgICBjb25zdCBkYXRhc2V0Qm91bmRFeHByID0gdGhpcy5nZXRBdHRyKCdkYXRhc2V0Ym91bmRleHByJyk7XG4gICAgICAgIHRoaXMuZGF0YU5hdmlnYXRvci5zZXRCaW5kRGF0YVNldChcbiAgICAgICAgICAgIHRoaXMuYmluZGRhdGFzZXQsXG4gICAgICAgICAgICB0aGlzLnZpZXdQYXJlbnQsXG4gICAgICAgICAgICBkYXRhc2V0Qm91bmRFeHByID8gdGhpcy5jb250ZXh0IDogdGhpcy5kYXRhc291cmNlLFxuICAgICAgICAgICAgdGhpcy5kYXRhc2V0LFxuICAgICAgICAgICAgdGhpcy5iaW5kZGF0YXNvdXJjZSxcbiAgICAgICAgICAgIGRhdGFzZXRCb3VuZEV4cHIsXG4gICAgICAgICAgICB0aGlzLnN0YXRlaGFuZGxlclxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25EYXRhU2V0Q2hhbmdlKG5ld1ZhbCkge1xuICAgICAgICBpZiAoZ2V0KHRoaXMuZGF0YXNvdXJjZSwgJ2NhdGVnb3J5JykgPT09ICd3bS5WYXJpYWJsZScgJiYgdGhpcy5nZXRDb25maWd1cmVkU3RhdGUoKSAhPT0gJ25vbmUnICYmIHRoaXMuX3BhZ2VMb2FkKSB7XG4gICAgICAgICAgICBjb25zdCB3aWRnZXRTdGF0ZSA9IHRoaXMuc3RhdGVQZXJzaXN0ZW5jZS5nZXRXaWRnZXRTdGF0ZSh0aGlzKTtcbiAgICAgICAgICAgIHRoaXMuX3BhZ2VMb2FkID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAoZ2V0KHdpZGdldFN0YXRlLCAncGFnaW5hdGlvbicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kYXRhTmF2aWdhdG9yLnBhZ2VDaGFuZ2VkKHtwYWdlOiB3aWRnZXRTdGF0ZS5wYWdpbmF0aW9ufSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0KHdpZGdldFN0YXRlLCAnc2VsZWN0ZWRJdGVtJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEl0ZW1zRXhpc3QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kYXRhTmF2aWdhdG9yV2F0Y2hlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmF2aWdhdGlvbiAmJiB0aGlzLm5hdmlnYXRpb24gIT09IE5BVklHQVRJT05fVFlQRS5OT05FKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR1cERhdGFTb3VyY2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRhdGFDaGFuZ2UobmV3VmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5hdmlnYXRpb24gJiYgdGhpcy5uYXZpZ2F0aW9uICE9PSBOQVZJR0FUSU9OX1RZUEUuTk9ORSkge1xuICAgICAgICAgICAgLy8gSWYgbmF2aWdhdGlvbiBpcyBhbHJlYWR5IHNldHVwIGFuZCBkYXRhc291cmNlIGlzIGNoYW5nZWQsIHVwZGF0ZSB0aGUgZGF0YXNvdXJjZSBvbiBuYXZpZ2F0aW9uXG4gICAgICAgICAgICB0aGlzLmRhdGFOYXZpZ2F0b3Iuc2V0RGF0YVNvdXJjZSh0aGlzLmRhdGFzb3VyY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWxsIHRoZSBMaXN0SXRlbSdzIEFjdGl2ZSBzdGF0ZSBpcyBzZXQgdG8gZmFsc2UuXG4gICAgcHJpdmF0ZSBkZXNlbGVjdExpc3RJdGVtcygpIHtcbiAgICAgICAgdGhpcy5saXN0SXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW0uaXNBY3RpdmUgPSBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gRGVzZWxlY3QgYWxsIHRoZSBMaXN0SXRlbXMgYW5kIGNsZWFyIHRoZSBzZWxlY3RlZGl0ZW0oSW5PdXRCb3VuZCBQcm9wZXJ0eSBtb2RlbClcbiAgICBwcml2YXRlIGNsZWFyU2VsZWN0ZWRJdGVtcygpIHtcbiAgICAgICAgdGhpcy5kZXNlbGVjdExpc3RJdGVtcygpO1xuICAgICAgICB0aGlzLl9pdGVtcy5sZW5ndGggPSAwO1xuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBMaXN0SXRlbURpcmVjdGl2ZSBpbnN0YW5jZSBieSBjaGVja2luZyB0aGUgZXF1YWxpdHkgb2YgdGhlIG1vZGVsLlxuICAgICAqIEBwYXJhbSBsaXN0TW9kZWw6IG1vZGVsIHRvIGJlIHNlYXJjaGVkIGZvclxuICAgICAqIEByZXR1cm5zIExpc3RJdGVtIGlmIHRoZSBtb2RlbCBpcyBtYXRjaGVkIGVsc2UgcmV0dXJuIG51bGwuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRMaXN0SXRlbUJ5TW9kZWwobGlzdE1vZGVsKTogTGlzdEl0ZW1EaXJlY3RpdmUge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0SXRlbXMuZmluZCgobGlzdEl0ZW0pID0+IHtcbiAgICAgICAgICAgIGxldCBpdGVtT2JqID0gbGlzdEl0ZW0uaXRlbTtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwYnkgJiYgIWhhcyhsaXN0TW9kZWwsICdfZ3JvdXBJbmRleCcpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgZ3JvdXBieSBpcyBlbmFibGVkLCBpdGVtIGNvbnRhaW5zIF9ncm91cEluZGV4IHByb3BlcnR5IHdoaWNoIHNob3VsZCBiZSBleGNsdWRlZCB3aGlsZSBjb21wYXJpbmcgbW9kZWwuXG4gICAgICAgICAgICAgICAgaXRlbU9iaiA9IGNsb25lKGl0ZW1PYmopO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBpdGVtT2JqLl9ncm91cEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRXF1YWwoaXRlbU9iaiwgbGlzdE1vZGVsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSB8fCBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlU2VsZWN0ZWRJdGVtc1dpZGdldHMoc3RhdGVQZXJzaXN0ZW5jZVRyaWdnZXJlZD8pIHtcbiAgICAgICAgbGV0IG9iaiA9IHt9LCB3aWRnZXRTdGF0ZTtcbiAgICAgICAgY29uc3QgcGFnZU51bSA9IGdldCh0aGlzLmRhdGFOYXZpZ2F0b3IsICdkbi5jdXJyZW50UGFnZScpIHx8IDE7XG4gICAgICAgIGlmICh0aGlzLmdldENvbmZpZ3VyZWRTdGF0ZSgpICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgc2VsZWN0ZWQgaXRlbXMgZm9yIGN1cnJlbnQgcGFnZSBhbmQgY29uc3RydWN0IG5ldyBvbmVzIGxhdGVyIGJlbG93LlxuICAgICAgICAgICAgd2lkZ2V0U3RhdGUgPSB0aGlzLnN0YXRlUGVyc2lzdGVuY2UuZ2V0V2lkZ2V0U3RhdGUodGhpcykgfHwge307XG4gICAgICAgICAgICBpZiAoZ2V0KHdpZGdldFN0YXRlLCAnc2VsZWN0ZWRJdGVtJykpIHtcbiAgICAgICAgICAgICAgICAvLyB3aGVuIG11bHRpc2VsZWN0IGlzIG9uIGFuZCBhbiBpdGVtIGlzIHNlbGVjdGVkIHdpdGhvdXQgcHJlc3NpbmcgQ1RSTCwgcHJldmlvdXNseSBzZWxlY3RlZCBpdGVtcyBpbiBzdGF0ZSBzaG91bGQgYmUgZW1wdHkuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3QgJiYgdGhpcy5zZWxlY3RlZGl0ZW0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldFN0YXRlLnNlbGVjdGVkSXRlbSA9IFtdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlbW92ZSh3aWRnZXRTdGF0ZS5zZWxlY3RlZEl0ZW0sIGZ1bmN0aW9uIChzZWxlY3RlZEl0ZW06IGFueSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbS5wYWdlID09PSBwYWdlTnVtO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICh0aGlzLnNlbGVjdGVkSXRlbVdpZGdldHMgYXMgQXJyYXk8V2lkZ2V0UmVmPikubGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpc3RJdGVtcy5mb3JFYWNoKChpdGVtOiBMaXN0SXRlbURpcmVjdGl2ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuc2VsZWN0ZWRJdGVtV2lkZ2V0cyBhcyBBcnJheTxXaWRnZXRSZWY+KS5wdXNoKGl0ZW0uY3VycmVudEl0ZW1XaWRnZXRzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbVdpZGdldHMgPSBpdGVtLmN1cnJlbnRJdGVtV2lkZ2V0cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2JqID0ge3BhZ2U6IHBhZ2VOdW0sIGluZGV4OiBpbmRleH07XG4gICAgICAgICAgICAgICAgaWYgKGdldCh3aWRnZXRTdGF0ZSwgJ3NlbGVjdGVkSXRlbScpICYmIHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzb21lKHdpZGdldFN0YXRlLnNlbGVjdGVkSXRlbSwgb2JqKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2lkZ2V0U3RhdGUuc2VsZWN0ZWRJdGVtLnB1c2gob2JqKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldFN0YXRlLnNlbGVjdGVkSXRlbSA9IFtvYmpdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLmdldENvbmZpZ3VyZWRTdGF0ZSgpICE9PSAnbm9uZScgJiYgIXN0YXRlUGVyc2lzdGVuY2VUcmlnZ2VyZWQpIHtcbiAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZFN0YXRlUGVyc2lzdGVuY2VUeXBlcy5pbmRleE9mKHRoaXMubmF2aWdhdGlvbikgPCAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVBlcnNpc3RlbmNlLnJlbW92ZVdpZGdldFN0YXRlKHRoaXMsICdzZWxlY3RlZEl0ZW0nKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlUGVyc2lzdGVuY2Uuc2V0V2lkZ2V0U3RhdGUodGhpcywgeydzZWxlY3RlZEl0ZW0nOiB3aWRnZXRTdGF0ZS5zZWxlY3RlZEl0ZW19KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdSZXRhaW4gU3RhdGUgaGFuZGxpbmcgb24gV2lkZ2V0ICcgKyB0aGlzLm5hbWUgKyAnIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGN1cnJlbnQgcGFnaW5hdGlvbiB0eXBlLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VsZWN0cyB0aGUgbGlzdEl0ZW0gYW5kIHVwZGF0ZXMgc2VsZWN0ZWRpdGVtIHByb3BlcnR5LlxuICAgICAqIElmIHRoZSBsaXN0SXRlbSBpcyBhbHJlYWR5IGEgc2VsZWN0ZWQgaXRlbSB0aGVuIGRlc2VsZWN0cyB0aGUgaXRlbS5cbiAgICAgKiBAcGFyYW0ge0xpc3RJdGVtRGlyZWN0aXZlfSAkbGlzdEl0ZW06IEl0ZW0gdG8gYmUgc2VsZWN0ZWQgb2YgZGVzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHRvZ2dsZUxpc3RJdGVtU2VsZWN0aW9uKCRsaXN0SXRlbTogTGlzdEl0ZW1EaXJlY3RpdmUsIHN0YXRlUGVyc2lzdGVuY2VUcmlnZ2VyZWQ/KSB7XG4gICAgICAgIC8vIGl0ZW0gaXMgbm90IGFsbG93ZWQgdG8gZ2V0IHNlbGVjdGVkIGlmIGl0IGlzIGRpc2FibGVkLlxuICAgICAgICBpZiAoJGxpc3RJdGVtICYmICEkbGlzdEl0ZW0uZGlzYWJsZUl0ZW0pIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gJGxpc3RJdGVtLml0ZW07XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cGJ5ICYmIGhhcyhpdGVtLCAnX2dyb3VwSW5kZXgnKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIGdyb3VwYnkgaXMgZW5hYmxlZCwgaXRlbSBjb250YWlucyBfZ3JvdXBJbmRleCBwcm9wZXJ0eSB3aGljaCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSBzZWxlY3RlZGl0ZW0uXG4gICAgICAgICAgICAgICAgaXRlbSA9IGNsb25lKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBpdGVtLl9ncm91cEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCRsaXN0SXRlbS5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1zID0gcHVsbEFsbFdpdGgodGhpcy5faXRlbXMsIFtpdGVtXSwgaXNFcXVhbCk7XG4gICAgICAgICAgICAgICAgJGxpc3RJdGVtLmlzQWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGlmIG11bHRpc2VsZWN0IGlzIGZhbHNlLCBjbGVhciB0aGUgc2VsZWN0SXRlbSBsaXN0IGJlZm9yZSBhZGRpbmcgYW4gaXRlbSB0byB0aGUgc2VsZWN0SXRlbSBsaXN0LlxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5tdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLl9pdGVtcy5wdXNoKGl0ZW0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc2VsZWN0Jywge3dpZGdldDogJGxpc3RJdGVtLCAkZGF0YTogaXRlbX0pO1xuICAgICAgICAgICAgICAgICRsaXN0SXRlbS5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNlbGVjdGVkSXRlbXNXaWRnZXRzKHN0YXRlUGVyc2lzdGVuY2VUcmlnZ2VyZWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIGlzIEludm9rZWQgd2hlbiB0aGUgbW9kZWwgZm9yIHRoZSBMaXN0IFdpZGdldCBpcyBjaGFuZ2VkLlxuICAgICAqIEBwYXJhbSB7UXVlcnlMaXN0PExpc3RJdGVtRGlyZWN0aXZlPn0gbGlzdEl0ZW1zXG4gICAgICovXG4gICAgcHJpdmF0ZSBvbkxpc3RSZW5kZXIobGlzdEl0ZW1zOiBRdWVyeUxpc3Q8TGlzdEl0ZW1EaXJlY3RpdmU+KSB7XG4gICAgICAgIC8vIEFkZGVkIHJlbmRlciBjYWxsYmFjayBldmVudC4gVGhpcyBtZXRob2Qob25MaXN0UmVuZGVyKSBpcyBjYWxsaW5nIG11bHRpcGxlIHRpbWVzIHNvIGNoZWNraW5nIGlzRGF0YWNoYW5nZWQgZmxhZyBiZWNhdXNlIHRoaXMgZmFsZyBpcyBjaGFuZ2VkIHdoZW5ldmVyIG5ldyBkYXRhIGlzIHJlbmRlcmVkLlxuICAgICAgICBpZiAodGhpcy5pc0RhdGFDaGFuZ2VkKSB7XG4gICAgICAgICAgICAvLyBXaGVuZXZlciBkYXRhc2V0IGlzIGNoYW5nZWQsIHRyaWdnZXIgd2F0Y2hlcnMgdG8gZXZhbHVhdGUgbGlzdGl0ZW0gYmluZCBleHByZXNzaW9ucy5cbiAgICAgICAgICAgICRpbnZva2VXYXRjaGVycyh0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygncmVuZGVyJywgeyRkYXRhOiB0aGlzLmZpZWxkRGVmc30pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmlzRGF0YUNoYW5nZWQgJiYgdGhpcy5nZXRDb25maWd1cmVkU3RhdGUoKSAhPT0gJ25vbmUnICYmIGxpc3RJdGVtcy5sZW5ndGggJiYgdGhpcy5fc2VsZWN0ZWRJdGVtc0V4aXN0KSB7XG4gICAgICAgICAgICBjb25zdCB3aWRnZXRTdGF0ZSA9IHRoaXMuc3RhdGVQZXJzaXN0ZW5jZS5nZXRXaWRnZXRTdGF0ZSh0aGlzKTtcbiAgICAgICAgICAgIGlmIChnZXQod2lkZ2V0U3RhdGUsICdzZWxlY3RlZEl0ZW0nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkSXRlbXNFeGlzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXNMZW5ndGggPSBpc0FycmF5KHRoaXMuc2VsZWN0ZWRpdGVtKSA/IHRoaXMuc2VsZWN0ZWRpdGVtLmxlbmd0aCA6IHRvTnVtYmVyKCFpc0VtcHR5KHRoaXMuc2VsZWN0ZWRpdGVtKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhZ2UgPSBnZXQodGhpcy5kYXRhTmF2aWdhdG9yLCAnZG4uY3VycmVudFBhZ2UnKSB8fCAxO1xuICAgICAgICAgICAgICAgIHdpZGdldFN0YXRlLnBhZ2luYXRpb24gPSB3aWRnZXRTdGF0ZS5wYWdpbmF0aW9uIHx8IDE7XG4gICAgICAgICAgICAgICAgLy8gdG8gcHJldmVudCBpdGVtIHNlbGVjdGlvbiBmcm9tIGJlaW5nIHRyaWdnZXJlZCBtb3JlIHRoYW4gb25jZVxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZEl0ZW1zTGVuZ3RoICE9PSB3aWRnZXRTdGF0ZS5zZWxlY3RlZEl0ZW0ubGVuZ3RoICYmIHdpZGdldFN0YXRlLnBhZ2luYXRpb24gPT09IGN1cnJlbnRQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpZGdldFN0YXRlLnNlbGVjdGVkSXRlbS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5wYWdlID09PSBjdXJyZW50UGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShpdGVtLmluZGV4LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBpc0FycmF5KHRoaXMuc2VsZWN0ZWRpdGVtKSA/IHRoaXMuc2VsZWN0ZWRpdGVtIDogW3RoaXMuc2VsZWN0ZWRpdGVtXTtcblxuICAgICAgICB0aGlzLmZpcnN0U2VsZWN0ZWRJdGVtID0gdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gbnVsbDtcblxuICAgICAgICAvLyBkb24ndCBzZWxlY3QgZmlyc3QgaXRlbSBpZiBtdWx0aS1zZWxlY3QgaXMgZW5hYmxlZCBhbmQgYXQgbGVhc3QgaXRlbSBpcyBhbHJlYWR5IHNlbGVjdGVkIGluIHRoZSBsaXN0LlxuICAgICAgICAvLyBkb24ndCBzZWxlY3QgZmlyc3QgaXRlbSBpZiBzdGF0ZSBpbmZvcm1hdGlvbiBoYXMgc2VsZWN0ZWQgaXRlbXNcbiAgICAgICAgaWYgKGxpc3RJdGVtcy5sZW5ndGggJiYgdGhpcy5zZWxlY3RmaXJzdGl0ZW0gJiYgISh0aGlzLl9pdGVtcy5sZW5ndGggJiYgdGhpcy5tdWx0aXNlbGVjdCkgJiYgdGhpcy5fc2VsZWN0ZWRJdGVtc0V4aXN0ICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgY29uc3QgJGZpcnN0SXRlbTogTGlzdEl0ZW1EaXJlY3RpdmUgPSBsaXN0SXRlbXMuZmlyc3Q7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhJGZpcnN0SXRlbS5kaXNhYmxlSXRlbSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuaXNEYXRhQ2hhbmdlZCAmJlxuICAgICAgICAgICAgICAgIC8vIFwiaW5maW5pdGUgc2Nyb2xsXCIgb3IgXCJsb2FkIG9uIGRlbWFuZFwiIGlzIGVuYWJsZWQgYW5kIGF0IGxlYXN0IG9uZSBpdGVtIGlzIHNlbGVjdGVkIHRoZW4gZG9udCBhbHRlciB0aGUgc2VsZWN0ZWQgbGlzdCBpdGVtcy5cbiAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICAodGhpcy5pbmZTY3JvbGwgfHwgdGhpcy5vbkRlbWFuZExvYWQpICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1zLmxlbmd0aFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3RlZEl0ZW1zKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJzdFNlbGVjdGVkSXRlbSA9IHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9ICRmaXJzdEl0ZW07XG4gICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nIHRoZSBmaXJzdCByZWNvcmRcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmRlc2VsZWN0TGlzdEl0ZW1zKCk7XG4gICAgICAgICAgICBzZWxlY3RlZEl0ZW1zLmZvckVhY2goc2VsZWN0ZWRpdGVtID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0SXRlbTogTGlzdEl0ZW1EaXJlY3RpdmUgPSB0aGlzLmdldExpc3RJdGVtQnlNb2RlbChzZWxlY3RlZGl0ZW0pO1xuICAgICAgICAgICAgICAgIGlmIChsaXN0SXRlbSkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0SXRlbS5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9IGxpc3RJdGVtO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb2N1cyB0aGUgYWN0aXZlIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgbGlzdEl0ZW0ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZmllbGREZWZzLmxlbmd0aCAmJiB0aGlzLmluZlNjcm9sbCkge1xuICAgICAgICAgICAgY29uc3Qgc21vb3RoU2Nyb2xsRWwgPSB0aGlzLiRlbGVtZW50LmNsb3Nlc3QoJ1t3bXNtb290aHNjcm9sbF0nKTtcbiAgICAgICAgICAgIC8vIGlmIHNtb290aHNjcm9sbCBpcyBzZXQgdG8gZmFsc2UsIHRoZW4gbmF0aXZlIHNjcm9sbCBoYXMgdG8gYmUgYXBwbGllZFxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHNtb290aHNjcm9sbCBldmVudHMgd2lsbCBiZSBiaW5kZWQuXG4gICAgICAgICAgICBpZiAoaXNNb2JpbGVBcHAoKSAmJiBzbW9vdGhTY3JvbGxFbC5sZW5ndGggJiYgc21vb3RoU2Nyb2xsRWwuYXR0cignd21zbW9vdGhzY3JvbGwnKSA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5iaW5kSVNjcm9sbEV2dCh0aGlzLCBERUJPVU5DRV9USU1FUy5QQUdJTkFUSU9OX0RFQk9VTkNFX1RJTUUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIG1vYmlsZSBhcHAgd2hlbiBtb2RhbCBleGlzdHMsIGFuZCBsaXN0IGl0ZW1zIGhlaWdodCBpcyBncmVhdGVyIHRoYW4gdGhlIG1vZGFsIGNvbnRlbnQgcHJvdmlkZSBjY29udGFpbmVyIGEgc2Nyb2xsYWJsZSBoZWlnaHRcbiAgICAgICAgICAgICAgICBjb25zdCBtb2RhbEJvZHkgPSB0aGlzLiRlbGVtZW50LmNsb3Nlc3QoJy5tb2RhbC1ib2R5Jyk7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdEh0ID0gdGhpcy4kZWxlbWVudC5maW5kKCd1bCcpLmhlaWdodCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGFsSHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSAxNDA7XG4gICAgICAgICAgICAgICAgaWYgKGlzTW9iaWxlKCkgJiYgbW9kYWxCb2R5Lmxlbmd0aCAmJiBsaXN0SHQgPiBtb2RhbEh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuY3NzKCdoZWlnaHQnLCBtb2RhbEh0ICsgJ3B4Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuYmluZFNjcm9sbEV2dCh0aGlzLCAnPiB1bCcsIERFQk9VTkNFX1RJTUVTLlBBR0lOQVRJT05fREVCT1VOQ0VfVElNRSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzRGF0YUNoYW5nZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwSGFuZGxlcnMoKSB7XG4gICAgICAgIHRoaXMubGlzdEl0ZW1zLmNoYW5nZXMuc3Vic2NyaWJlKGxpc3RJdGVtcyA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uTGlzdFJlbmRlcihsaXN0SXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBoYW5kbGUgY2xpY2sgZXZlbnQgaW4gY2FwdHVyaW5nIHBoYXNlLlxuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndWwuYXBwLWxpdmVsaXN0LWNvbnRhaW5lcicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9ICQoJGV2ZW50LnRhcmdldCkuY2xvc2VzdCgnLmFwcC1saXN0LWl0ZW0nKTtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZpbmQgdGhlIGN1cnJlbnQgbGlzdCBpdGVtXG4gICAgICAgICAgICB3aGlsZSAodGFyZ2V0LmdldCgwKSAmJiAodGFyZ2V0LmNsb3Nlc3QoJ3VsLmFwcC1saXZlbGlzdC1jb250YWluZXInKS5nZXQoMCkgIT09ICRldmVudC5jdXJyZW50VGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnQoKS5jbG9zZXN0KCcuYXBwLWxpc3QtaXRlbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyTGlzdEl0ZW1TZWxlY3Rpb24odGFyZ2V0LCAkZXZlbnQpO1xuICAgICAgICB9LCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VycyBvbiBkcmFnIHN0YXJ0IHdoaWxlIHJlb3JkZXJpbmcuXG4gICAgcHJpdmF0ZSBvblJlb3JkZXJTdGFydChldnQsIHVpKSB7XG4gICAgICAgIHVpLnBsYWNlaG9sZGVyLmhlaWdodCh1aS5pdGVtLmhlaWdodCgpKTtcbiAgICAgICAgdGhpcy4kdWxFbGUuZGF0YSgnb2xkSW5kZXgnLCB1aS5pdGVtLmluZGV4KCkpO1xuICAgIH1cblxuICAgIC8vIFRyaWdnZXJzIGR1cmluZyBzb3J0aW5nXG4gICAgcHJpdmF0ZSBvblNvcnQoZXZ0LCB1aSkge1xuICAgICAgICAvLyBJbiBjYXNlIG9mIGluZmluaXRlIHNjcm9sbCwgd2hlbiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgc2Nyb2xsIGVuYWJsZWRcbiAgICAgICAgLy8gb24gZHJhZ2dpbmcgdGhlIGVsZW1lbnQgdG8gbGFzdCBpdGVtJ3MgcG9zaXRpb24gbWFudWFsbHkgdHJpZ2dlciBsb2FkaW5nIG9mIG5leHQgaXRlbXNcbiAgICAgICAgaWYgKHRoaXMuaW5mU2Nyb2xsKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0SXRlbU9mZnNldCA9IHRoaXMuJHVsRWxlLmZpbmQoYFtsaXN0aXRlbWluZGV4PSR7dGhpcy5maWVsZERlZnMubGVuZ3RoIC0gMX1dYCkub2Zmc2V0KCk7XG4gICAgICAgICAgICBpZiAobGFzdEl0ZW1PZmZzZXQgJiYgbGFzdEl0ZW1PZmZzZXQudG9wIDwgdWkub2Zmc2V0LnRvcCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuYmluZFNjcm9sbEV2dCh0aGlzLCAnPiB1bCcsIERFQk9VTkNFX1RJTUVTLlBBR0lOQVRJT05fREVCT1VOQ0VfVElNRSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJvdW5jZWRGZXRjaE5leHREYXRhc2V0T25TY3JvbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRyaWdnZXJzIGFmdGVyIHRoZSBzb3J0aW5nLlxuICAgIHByaXZhdGUgb25VcGRhdGUoZXZ0LCB1aSwgcHJlc2VudEluZGV4Pykge1xuICAgICAgICBjb25zdCBkYXRhID0gdGhpcy5maWVsZERlZnM7XG4gICAgICAgIC8vIElmIHVpIGlzIG5vdCBwcmVzZW50IHRoZW4gaXQgaXMgY2FsbGVkIGZyb20gZHJhZyBhbmQgZHJvcCB1c2luZyBrZXlib2FyZFxuICAgICAgICBjb25zdCBuZXdJbmRleCA9IHVpID09PSB1bmRlZmluZWQgPyBwcmVzZW50SW5kZXggOiB1aS5pdGVtLmluZGV4KCk7XG4gICAgICAgIGNvbnN0IG9sZEluZGV4ID0gdGhpcy4kdWxFbGUuZGF0YSgnb2xkSW5kZXgnKTtcblxuICAgICAgICBjb25zdCBtaW5JbmRleCA9IG1pbihbbmV3SW5kZXgsIG9sZEluZGV4XSk7XG4gICAgICAgIGNvbnN0IG1heEluZGV4ID0gbWF4KFtuZXdJbmRleCwgb2xkSW5kZXhdKTtcblxuICAgICAgICBjb25zdCBkcmFnZ2VkSXRlbSA9IHB1bGxBdChkYXRhLCBvbGRJbmRleClbMF07XG4gICAgICAgIC8vIE1vZGlmeSB0aGUgZGF0YSBsaXN0IG9ubHkgaWYgd2UgZmluZCBhIGRyYWdnZWRJdGVtXG4gICAgICAgIGlmIChkcmFnZ2VkSXRlbSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0Q29uZmlndXJlZFN0YXRlKCkgIT09ICdub25lJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVQZXJzaXN0ZW5jZS5yZW1vdmVXaWRnZXRTdGF0ZSh0aGlzLCAnc2VsZWN0ZWRJdGVtJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucmVvcmRlclByb3BzLm1pbkluZGV4ID0gbWluKFttaW5JbmRleCwgdGhpcy5yZW9yZGVyUHJvcHMubWluSW5kZXhdKTtcbiAgICAgICAgICAgIHRoaXMucmVvcmRlclByb3BzLm1heEluZGV4ID0gbWF4KFttYXhJbmRleCwgdGhpcy5yZW9yZGVyUHJvcHMubWF4SW5kZXhdKTtcblxuICAgICAgICAgICAgZGF0YS5zcGxpY2UobmV3SW5kZXgsIDAsIGRyYWdnZWRJdGVtKTtcblxuICAgICAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgY29uc3QgJGNoYW5nZWRJdGVtID0ge1xuICAgICAgICAgICAgICAgIG9sZEluZGV4OiBvbGRJbmRleCxcbiAgICAgICAgICAgICAgICBuZXdJbmRleDogbmV3SW5kZXgsXG4gICAgICAgICAgICAgICAgaXRlbTogZGF0YVtuZXdJbmRleF1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3Jlb3JkZXInLCB7JGV2ZW50OiBldnQsICRkYXRhOiBkYXRhLCAkY2hhbmdlZEl0ZW19KTtcbiAgICAgICAgICAgIHRoaXMuJHVsRWxlLnJlbW92ZURhdGEoJ29sZEluZGV4Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25maWd1cmVzIHJlb3JkZXJpbmcgdGhlIGxpc3QgaXRlbXMuXG4gICAgcHJpdmF0ZSBjb25maWd1cmVEbkQoKSB7XG4gICAgICAgIGxldCBhcHBlbmRUbztcbiAgICAgICAgY29uc3QgbW9kYWxFbCA9ICQoZG9jdW1lbnQpLmZpbmQoJy5tb2RhbCcpO1xuICAgICAgICBpZiAodGhpcy5nZXRBdHRyKCdoZWlnaHQnKSkgeyAvLyB3aGVuIGhlaWdodCBpcyBhcHBsaWVkIHRvIHRoZSBsaXN0LCBhcHBlbmQgc2hvdWxkIGJlIHRoZSB1bCdzIHBhcmVudCBhcyBzY3JvbGwgaXMgYXBwbGllZCB0byB0aGUgcGFyZW50XG4gICAgICAgICAgICBhcHBlbmRUbyA9ICdwYXJlbnQnO1xuICAgICAgICB9IGVsc2UgaWYgKG1vZGFsRWwubGVuZ3RoKSB7IC8vIEluIGNhc2Ugb2YgZGlhbG9nLCBhcHBlbmRUbyBzaG91bGQgYmUgdGhlIG1vZGFsIGVsZVxuICAgICAgICAgICAgYXBwZW5kVG8gPSBtb2RhbEVsW21vZGFsRWwubGVuZ3RoIC0gMV07XG4gICAgICAgIH0gZWxzZSB7IC8vIEFzIGRlZmF1bHQgYXBwZW5kIHRvIHNob3VsZCBiZSBib2R5XG4gICAgICAgICAgICBhcHBlbmRUbyA9ICdib2R5JztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBpc01vYmlsZUFwcCgpID8ge30gOiB7XG4gICAgICAgICAgICBhcHBlbmRUbzogYXBwZW5kVG8sXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgJGVsID0gJCh0aGlzLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLiR1bEVsZSA9ICRlbC5maW5kKCcuYXBwLWxpdmVsaXN0LWNvbnRhaW5lcicpO1xuXG4gICAgICAgIGNvbmZpZ3VyZURuRCh0aGlzLiR1bEVsZSwgb3B0aW9ucywgdGhpcy5vblJlb3JkZXJTdGFydC5iaW5kKHRoaXMpLCB0aGlzLm9uVXBkYXRlLmJpbmQodGhpcyksIHRoaXMub25Tb3J0LmJpbmQodGhpcykpO1xuXG4gICAgICAgIHRoaXMuJHVsRWxlLmRyb3BwYWJsZSh7J2FjY2VwdCc6ICcuYXBwLWxpc3QtaXRlbSd9KTtcblxuICAgICAgICBpZiAoaXNNb2JpbGVBcHAoKSkge1xuICAgICAgICAgICAgdGhpcy4kdWxFbGUuc29ydGFibGUoJ2Rpc2FibGUnKTtcbiAgICAgICAgICAgIHRoaXMuJHVsRWxlLm9uKCd0b3VjaHN0YXJ0JywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgIGlmICghc2VsZi50b3VjaGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi50b3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi50b3VjaGVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJldmVudCBjb250ZXh0IG1lbnUgb24gbW9iaWxlIChJT1MvQU5EUk9JRClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgNTApO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnRvdWNoZWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoJ25vLXNlbGVjdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9FbmFibGUgZHJhZ2dhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNvcnRhYmxlKCdlbmFibGUnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgaW50ZXJuYWwgZmxhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b3VjaGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vdHJpZ2dlciB0b3VjaHN0YXJ0IGFnYWluIHRvIGVuYWJsZSBkcmFnZ2FibGUgdGhyb3VnaCB0b3VjaCBwdW5jaFxuICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmKS50cmlnZ2VyKGV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9DaG9vc2UgcHJlZmVycmVkIGR1cmF0aW9uIGZvciB0YXBob2xkXG4gICAgICAgICAgICAgICAgICAgIH0sIDM1MCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkub24oJ3RvdWNoZW5kJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VjaGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkucmVtb3ZlQ2xhc3MoJ25vLXNlbGVjdGlvbicpO1xuXG4gICAgICAgICAgICAgICAgLy9EaXNhYmxlIGRyYWdnYWJsZSB0byBlbmFibGUgZGVmYXVsdCBiZWhhdmlvdXJcbiAgICAgICAgICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNvcnRhYmxlKCdkaXNhYmxlJyk7XG5cbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50b3VjaGVkKTtcbiAgICAgICAgICAgIH0pLm9uKCd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG91Y2hlZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3Rpb24gbGltaXQgaXMgcmVhY2hlZC5cbiAgICBwcml2YXRlIGNoZWNrU2VsZWN0aW9uTGltaXQoY291bnQ6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gKCF0aGlzLnNlbGVjdGlvbmxpbWl0IHx8IGNvdW50IDwgdGhpcy5zZWxlY3Rpb25saW1pdCk7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsaXN0aXRlbSByZWZlcmVuY2UgYnkgaW5kZXggdmFsdWUuXG4gICAgcHJpdmF0ZSBnZXRMaXN0SXRlbUJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IExpc3RJdGVtRGlyZWN0aXZlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdEl0ZW1zLnRvQXJyYXkoKVtpbmRleF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIGluZGV4IG9mIGFuIChsaXN0SXRlbURpcmVjdGl2ZSkgaW4gdGhlIGxpc3RJdGVtXG4gICAgICogQHBhcmFtIHtMaXN0SXRlbURpcmVjdGl2ZX0gaXRlbVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRMaXN0SXRlbUluZGV4KGl0ZW06IExpc3RJdGVtRGlyZWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RJdGVtcy50b0FycmF5KCkuaW5kZXhPZihpdGVtKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBMaXN0SXRlbSBSZWZlcmVuY2UgYmFzZWQgb24gdGhlIGlucHV0IHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB2YWw6IGluZGV4IHwgbW9kZWwgb2YgdGhlIGxpc3QgaXRlbS5cbiAgICAgKiBAcmV0dXJucyB7TGlzdEl0ZW1EaXJlY3RpdmV9XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRJdGVtUmVmQnlJbmRleE9yTW9kZWwodmFsOiBhbnkpOiBMaXN0SXRlbURpcmVjdGl2ZSB7XG4gICAgICAgIGxldCBsaXN0SXRlbTogTGlzdEl0ZW1EaXJlY3RpdmU7XG4gICAgICAgIGlmIChpc051bWJlcih2YWwpKSB7XG4gICAgICAgICAgICBsaXN0SXRlbSA9IHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaXN0SXRlbSA9IHRoaXMuZ2V0TGlzdEl0ZW1CeU1vZGVsKHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpc3RJdGVtO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmVmb3JlUGFnaW5hdGlvbkNoYW5nZSgkZXZlbnQsICRpbmRleCkge1xuICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3BhZ2luYXRpb25jaGFuZ2UnLCB7JGV2ZW50LCAkaW5kZXh9KTtcbiAgICB9XG5cbiAgICB0cmFja0J5Rm4oJGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuICRpbmRleDsgLy8gUmV0dXJuIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGVhY2ggaXRlbVxuICAgIH1cblxuICAgIC8vIEludm9rZSB0aGUgZGF0YXNvdXJjZSB2YXJpYWJsZSBieSBkZWZhdWx0IHdoZW4gcHVsbHRvcmVmcmVzaCBldmVudCBpcyBub3Qgc3BlY2lmaWVkLlxuICAgIHByaXZhdGUgc3Vic2NyaWJlVG9QdWxsVG9SZWZyZXNoKCkge1xuICAgICAgICB0aGlzLl9saXN0ZW5lckRlc3Ryb3llcnMucHVzaCh0aGlzLmFwcC5zdWJzY3JpYmUoJ3B1bGx0b3JlZnJlc2gnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhc291cmNlICYmIHRoaXMuZGF0YXNvdXJjZS5saXN0UmVjb3Jkcykge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNvdXJjZS5saXN0UmVjb3JkcygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRVcENVREhhbmRsZXJzKCkge1xuICAgICAgICBjb25zdCAkYWRkSXRlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJhZGQtbGlzdC1pdGVtXCIpWzBdO1xuICAgICAgICBpZiAoJGFkZEl0ZW0pIHtcbiAgICAgICAgICAgIC8vIFRyaWdnZXJlZCBvbiBjbGljayBvZiBhZGQgYWN0aW9uXG4gICAgICAgICAgICAkYWRkSXRlbS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGV2dCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIiAqbmdJZj1cInRpdGxlIHx8IHN1YmhlYWRpbmcgfHwgaWNvbmNsYXNzXCI+XG4gICAgPGgzIGNsYXNzPVwicGFuZWwtdGl0bGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInB1bGwtbGVmdFwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJhcHAtaWNvbiBwYW5lbC1pY29uIHt7aWNvbmNsYXNzfX1cIiBhcmlhLWhpZGRlbj1cInRydWVcIiBbaGlkZGVuXT1cIiFpY29uY2xhc3NcIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGluZ1wiIFtpbm5lckhUTUxdPVwidGl0bGVcIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXNjcmlwdGlvblwiIFtpbm5lckhUTUxdPVwic3ViaGVhZGluZ1wiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2gzPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJhcHAtZGF0YW5hdmlnYXRvclwiIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGF0YU5hdmlnYXRvci5pc0Rpc2FibGVQcmV2aW91c1wiIGFyaWEtbGFiZWw9XCJQYWdlIG5hdmlnYXRpb25cIiAqbmdJZj1cIm5hdmlnYXRpb24gPT09ICdJbmxpbmUnICYmICFub0RhdGFGb3VuZFwiPlxuICAgIDx1bCBjbGFzcz1cInBhZ2VyXCI+XG4gICAgICAgIDxsaSBjbGFzcz1cInByZXZpb3VzXCIgW25nQ2xhc3NdPVwieydkaXNhYmxlZCc6IChkYXRhTmF2aWdhdG9yID8gZGF0YU5hdmlnYXRvci5pc0Rpc2FibGVQcmV2aW91cyA6IHRydWUpfVwiPlxuICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiAoY2xpY2spPVwiZGF0YU5hdmlnYXRvci5uYXZpZ2F0ZVBhZ2UoJ3ByZXYnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGF0YU5hdmlnYXRvci5pc0Rpc2FibGVQcmV2aW91c1wiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwid2kgd2ktY2hldnJvbi1sZWZ0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkdvIHRvIFByZXZpb3VzIHBhZ2Uge3tkYXRhTmF2aWdhdG9yLmlzRGlzYWJsZVByZXZpb3VzID8gJywgRGlzYWJsZWQnIDogJyd9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYT5cbiAgICAgICAgPC9saT5cbiAgICA8L3VsPlxuPC9kaXY+XG48ZGl2ICpuZ0lmPVwibmF2aWdhdGlvbiA9PT0gJ0lubGluZScgJiYgIW5vRGF0YUZvdW5kXCIgYXJpYS1saXZlPVwicG9saXRlXCIgYXJpYS1hdG9taWM9XCJ0cnVlXCIgY2xhc3M9XCJzci1vbmx5XCI+IHt7J1BhZ2UgJyArIGRhdGFOYXZpZ2F0b3IuZG4uY3VycmVudFBhZ2UgKyAnIG9mICcgKyBkYXRhTmF2aWdhdG9yLnBhZ2VDb3VudCB9fTwvZGl2PlxuXG48ZGl2PlxuICAgIDxkaXYgaWQ9e3t0aXRsZUlkfX0gY2xhc3M9XCJzci1vbmx5XCIgKm5nSWY9XCJlbmFibGVyZW9yZGVyXCI+XG4gICAgICAgIFByZXNzIHNwYWNlIGJhciB0byB0b2dnbGUgZHJhZyBkcm9wIG1vZGUsIHVzZSBhcnJvdyBrZXlzIHRvIG1vdmUgc2VsZWN0ZWQgZWxlbWVudHMuXG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGFyaWEtbGl2ZT1cImFzc2VydGl2ZVwiICpuZ0lmPVwibGlzdEl0ZW1zICYmIGVuYWJsZXJlb3JkZXIgJiYgY3VycmVudEluZGV4XCIgY2xhc3M9XCJzci1vbmx5XCIgPlxuICAgICAgICB7e2FyaWFUZXh0ICsgY3VycmVudEluZGV4ICsgJyBvZiAnICsgIGxpc3RJdGVtcy5sZW5ndGh9fVxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjx1bCBbYXR0ci50YWJpbmRleF09XCJ0YWJpbmRleFwiICBjbGFzcz1cImFwcC1saXZlbGlzdC1jb250YWluZXIgY2xlYXJmaXgge3tkaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJyA/ICdhcHAtaG9yaXpvbnRhbC1saXN0JzogJyd9fSB7e2xpc3RjbGFzc319XCIgcm9sZT1cImxpc3RcIlxuICAgIChrZXlkb3duLmVudGVyKT1cImhhbmRsZUtleURvd24oJGV2ZW50LCAnc2VsZWN0JylcIlxuXG4gICAgKGtleWRvd24uc3BhY2UpPVwiaGFuZGxlS2V5RG93bigkZXZlbnQsICdzcGFjZScpXCJcblxuICAgIChrZXlkb3duLmFycm93dXApPVwiaGFuZGxlS2V5RG93bigkZXZlbnQsICdmb2N1c1ByZXYnKVwiXG4gICAgKGtleWRvd24uYXJyb3dkb3duKT1cImhhbmRsZUtleURvd24oJGV2ZW50LCAnZm9jdXNOZXh0JylcIlxuICAgIChrZXlkb3duLmFycm93bGVmdCk9XCJoYW5kbGVLZXlEb3duKCRldmVudCwgJ2ZvY3VzUHJldicpXCJcbiAgICAoa2V5ZG93bi5hcnJvd3JpZ2h0KT1cImhhbmRsZUtleURvd24oJGV2ZW50LCAnZm9jdXNOZXh0JylcIlxuXG4gICAgKGtleWRvd24uc2hpZnQuYXJyb3d1cCk9XCJoYW5kbGVLZXlEb3duKCRldmVudCwgJ3NlbGVjdFByZXYnKVwiXG4gICAgKGtleWRvd24uc2hpZnQuYXJyb3dkb3duKT1cImhhbmRsZUtleURvd24oJGV2ZW50LCAnc2VsZWN0TmV4dCcpXCJcbiAgICAoa2V5ZG93bi5zaGlmdC5hcnJvd2xlZnQpPVwiaGFuZGxlS2V5RG93bigkZXZlbnQsICdzZWxlY3RQcmV2JylcIlxuICAgIChrZXlkb3duLnNoaWZ0LmFycm93cmlnaHQpPVwiaGFuZGxlS2V5RG93bigkZXZlbnQsICdzZWxlY3ROZXh0JylcIlxuICAgIFtoaWRkZW5dPVwibm9EYXRhRm91bmQgJiYgIXZhcmlhYmxlSW5mbGlnaHRcIlxuPlxuICAgIDxuZy10ZW1wbGF0ZSBbbmdJZl09XCIhZ3JvdXBieVwiIFtuZ0lmRWxzZV09XCJncm91cGVkTGlzdFRlbXBsYXRlXCI+XG4gICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBmaWVsZERlZnM7IGluZGV4IGFzICRpbmRleDsgZmlyc3QgYXMgJGZpcnN0OyBsYXN0IGFzICRsYXN0O1wiIGNsYXNzPVwiYXBwLWxpc3QtaXRlbSB7e2RpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gJycgOiBpdGVtc1BlclJvd0NsYXNzfX1cIiBbbmdDbGFzc109XCJsaXN0SXRlbVJlZi5pdGVtQ2xhc3NcIlxuICAgICAgICAgICAgW3dtTGlzdEl0ZW1dPVwiaXRlbVwiXG4gICAgICAgICAgICAjbGlzdEl0ZW1SZWY9XCJsaXN0SXRlbVJlZlwiXG4gICAgICAgICAgICBbYXR0ci50YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgICAgICByb2xlPVwibGlzdGl0ZW1cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibGlzdFRlbXBsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRJbmplY3Rvcl09XCJjcmVhdGVDdXN0b21JbmplY3RvcignZmxhdF8nICsgJGluZGV4LCB7aXRlbTogaXRlbSwgJGluZGV4OiAkaW5kZXgsIGl0ZW1SZWY6IGxpc3RJdGVtUmVmLCAkZmlyc3Q6ICRmaXJzdCwgJGxhc3Q6ICRsYXN0LCBjdXJyZW50SXRlbVdpZGdldHM6IGxpc3RJdGVtUmVmLmN1cnJlbnRJdGVtV2lkZ2V0c30pXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cIntpdGVtOiBpdGVtLCAkaW5kZXg6ICRpbmRleCwgaXRlbVJlZjogbGlzdEl0ZW1SZWYsICRmaXJzdDogJGZpcnN0LCAkbGFzdDogJGxhc3QsIGN1cnJlbnRJdGVtV2lkZ2V0czogbGlzdEl0ZW1SZWYuY3VycmVudEl0ZW1XaWRnZXRzfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2xpPlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJsaXN0TGVmdEFjdGlvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJsaXN0UmlnaHRBY3Rpb25UZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuPC91bD5cblxuPGRpdiBjbGFzcz1cIm5vLWRhdGEtbXNnXCIgKm5nSWY9XCJub0RhdGFGb3VuZCAmJiAhdmFyaWFibGVJbmZsaWdodFwiIFt0ZXh0Q29udGVudF09XCJub2RhdGFtZXNzYWdlXCI+PC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJsb2FkaW5nLWRhdGEtbXNnXCIgKm5nSWY9XCJ2YXJpYWJsZUluZmxpZ2h0ICYmICFwdWxsdG9yZWZyZXNoXCI+XG4gICAgPHNwYW4+XG4gICAgICAgIDxpIGNsYXNzPVwiYXBwLWljb24gcGFuZWwtaWNvbiBmYS1zcGluXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgW25nQ2xhc3NdPVwibG9hZGluZ2ljb25cIj48L2k+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkxvYWRpbmc8L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibG9hZGluZy10ZXh0XCIgW3RleHRDb250ZW50XT1cImxvYWRpbmdkYXRhbXNnXCI+PC9zcGFuPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiYXBwLWRhdGFuYXZpZ2F0b3JcIiBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRhdGFOYXZpZ2F0b3IuaXNEaXNhYmxlTmV4dFwiICpuZ0lmPVwibmF2aWdhdGlvbiA9PT0gJ0lubGluZScgJiYgIW5vRGF0YUZvdW5kXCI+XG4gICAgPHVsIGNsYXNzPVwicGFnZXJcIj5cbiAgICAgICAgPGxpIGNsYXNzPVwibmV4dFwiIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnOiAoZGF0YU5hdmlnYXRvciA/IGRhdGFOYXZpZ2F0b3IuaXNEaXNhYmxlTmV4dCAgOiB0cnVlKX1cIj5cbiAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCIgKGNsaWNrKT1cImRhdGFOYXZpZ2F0b3IubmF2aWdhdGVQYWdlKCduZXh0JywgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICBbYXR0ci5hcmlhLWRpc2FibGVkXT1cImRhdGFOYXZpZ2F0b3IuaXNEaXNhYmxlTmV4dFwiPlxuICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwid2kgd2ktY2hldnJvbi1yaWdodFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5HbyB0byBOZXh0IHBhZ2Uge3tkYXRhTmF2aWdhdG9yLmlzRGlzYWJsZU5leHQgPyAnLCBEaXNhYmxlZCcgOiAnJ319PC9zcGFuPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICA8L2xpPlxuICAgIDwvdWw+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cInBhbmVsLWZvb3RlclwiICpuZ0lmPVwibmF2aWdhdGlvbiAhPT0gJ05vbmUnXCIgW2hpZGRlbl09XCIhc2hvd05hdmlnYXRpb24gfHwgKG9uRGVtYW5kTG9hZCAmJiBkYXRhTmF2aWdhdG9yLmlzRGlzYWJsZU5leHQpIHx8IChkYXRhTmF2aWdhdG9yLmRhdGFTaXplIDw9IHBhZ2VzaXplKSB8fCAoIWRhdGFOYXZpZ2F0b3IuZGF0YVNpemUgJiYgIWRhdGFOYXZpZ2F0b3IuZGF0YXNvdXJjZT8ucGFnaW5hdGlvbj8ubmV4dClcIj5cbiAgICA8bmF2IHdtUGFnaW5hdGlvblxuICAgICAgICAgbmF2aWdhdGlvbmFsaWduLmJpbmQ9XCJuYXZpZ2F0aW9uYWxpZ25cIlxuICAgICAgICAgbmF2aWdhdGlvbi5iaW5kPVwibmF2Q29udHJvbHNcIlxuICAgICAgICAgc2hvd3JlY29yZGNvdW50LmJpbmQ9XCJzaG93cmVjb3JkY291bnRcIlxuICAgICAgICAgbWF4c2l6ZS5iaW5kPVwibWF4c2l6ZVwiXG4gICAgICAgICBib3VuZGFyeWxpbmtzLmJpbmQ9XCJib3VuZGFyeWxpbmtzXCJcbiAgICAgICAgIGZvcmNlZWxsaXBzZXMuYmluZD1cImZvcmNlZWxsaXBzZXNcIlxuICAgICAgICAgZGlyZWN0aW9ubGlua3MuYmluZD1cImRpcmVjdGlvbmxpbmtzXCJcbiAgICAgICAgIHNob3cuYmluZD1cIiFvbkRlbWFuZExvYWRcIlxuICAgICAgICAgcGFnaW5hdGlvbmNoYW5nZS5ldmVudD1cImJlZm9yZVBhZ2luYXRpb25DaGFuZ2UoJGV2ZW50LCAkaW5kZXgpXCJcbiAgICA+PC9uYXY+XG4gICAgPGEgKm5nSWY9XCJvbkRlbWFuZExvYWRcIiBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiXG4gICAgICAgKGNsaWNrKT1cImRhdGFOYXZpZ2F0b3IubmF2aWdhdGVQYWdlKCduZXh0JywgJGV2ZW50KVwiXG4gICAgICAgY2xhc3M9XCJhcHAtYnV0dG9uIGJ0biBidG4tYmxvY2tcIlxuICAgICAgIFtuZ0NsYXNzXT1cInBhZ2luYXRpb25jbGFzc1wiXG4gICAgICAgW3RleHRDb250ZW50XT1cIm9uZGVtYW5kbWVzc2FnZVwiXG4gICAgPjwvYT5cbjwvZGl2PlxuXG48IS0tVGhpcyB0ZW1wbGF0ZSB3aWxsIGJlIGRpc3BsYXllZCB3aGVuIGdyb3VwYnkgaXMgc3BlY2lmaWVkLS0+XG48bmctdGVtcGxhdGUgI2dyb3VwZWRMaXN0VGVtcGxhdGU+XG4gICAgPGxpICpuZ0Zvcj1cImxldCBncm91cE9iaiBvZiBncm91cGVkRGF0YTsgbGV0IGdyb3VwSW5kZXggPSBpbmRleDtcIiBjbGFzcz1cImFwcC1saXN0LWl0ZW0tZ3JvdXAgY2xlYXJmaXhcIj5cbiAgICAgICAgPHVsIFthdHRyLnRhYmluZGV4XT1cInRhYmluZGV4XCIgY2xhc3M9XCJsaXN0LWdyb3VwIGl0ZW0tZ3JvdXBcIiBbbmdDbGFzc109XCJsaXN0Y2xhc3NcIj5cbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImFwcC1saXN0LWl0ZW0taGVhZGVyIGxpc3QtaXRlbSBsaXN0LWdyb3VwLWhlYWRlclwiIChjbGljayk9XCJoYW5kbGVIZWFkZXJDbGljaygkZXZlbnQpXCIgW25nQ2xhc3NdPVwieydjb2xsYXBzaWJsZS1jb250ZW50JzogY29sbGFwc2libGV9XCI+XG4gICAgICAgICAgICA8aDQ+e3tncm91cE9iai5rZXl9fVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItYWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiYXBwLWljb24gd2kgYWN0aW9uIHdpLWNoZXZyb24tdXBcIiAqbmdJZj1cImNvbGxhcHNpYmxlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInNob3djb3VudFwiIGNsYXNzPVwibGFiZWwgbGFiZWwtZGVmYXVsdFwiPnt7Z3JvdXBPYmouZGF0YS5sZW5ndGh9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9oND5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGNsZWFyZml4IHt7ZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAnYXBwLWhvcml6b250YWwtbGlzdCc6ICcnfX1cIj5cbiAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZ3JvdXBPYmouZGF0YTsgaW5kZXggYXMgJGluZGV4OyB0cmFja0J5OiB0cmFja0J5Rm47IGZpcnN0IGFzICRmaXJzdDsgbGFzdCBhcyAkbGFzdDtcIiBbYXR0ci50YWJpbmRleF09XCJ0YWJpbmRleFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYXBwLWxpc3QtaXRlbSBncm91cC1saXN0LWl0ZW0ge3tpdGVtc1BlclJvd0NsYXNzfX1cIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJsaXN0SXRlbVJlZi5pdGVtQ2xhc3NcIlxuICAgICAgICAgICAgICAgICAgICBbd21MaXN0SXRlbV09XCJpdGVtXCIgI2xpc3RJdGVtUmVmPVwibGlzdEl0ZW1SZWZcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJsaXN0VGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0SW5qZWN0b3JdPVwiY3JlYXRlQ3VzdG9tSW5qZWN0b3IoJ2dyb3VwXycgKyBncm91cEluZGV4ICsgJ19pdGVtXycgKyAkaW5kZXgsIHtpdGVtOiBpdGVtLCAkaW5kZXg6ICRpbmRleCwgaXRlbVJlZjogbGlzdEl0ZW1SZWYsICRmaXJzdDogJGZpcnN0LCAkbGFzdDogJGxhc3QsIGN1cnJlbnRJdGVtV2lkZ2V0czogbGlzdEl0ZW1SZWYuY3VycmVudEl0ZW1XaWRnZXRzfSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7aXRlbTogaXRlbSwgJGluZGV4OiAkaW5kZXgsIGl0ZW1SZWY6IGxpc3RJdGVtUmVmLCAkZmlyc3Q6ICRmaXJzdCwgJGxhc3Q6ICRsYXN0LCBjdXJyZW50SXRlbVdpZGdldHM6IGxpc3RJdGVtUmVmLmN1cnJlbnRJdGVtV2lkZ2V0c31cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgPC91bD5cbiAgICA8L2xpPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
1415
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvZGF0YS9saXN0L3NyYy9saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9kYXRhL2xpc3Qvc3JjL2xpc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVILFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBRWYsUUFBUSxFQUNSLE1BQU0sRUFJTixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUNILFVBQVUsRUFDVixlQUFlLEVBQ2YsR0FBRyxFQUNILFdBQVcsRUFDWCxVQUFVLEVBQ1YsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsUUFBUSxFQUNSLFdBQVcsRUFDWCxRQUFRLEVBQ1IsUUFBUSxFQUNSLElBQUksRUFDSixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLGlCQUFpQixFQUNqQixZQUFZLEVBQ1osWUFBWSxFQUNmLE1BQU0sVUFBVSxDQUFDO0FBQ2xCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxlQUFlLEVBQUUsZ0NBQWdDLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBYSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pTLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7Ozs7O0lDL0MvQywrQkFBb0UsYUFBQSxjQUFBO0lBR3hELHdCQUEwRjtJQUM5RixpQkFBTTtJQUNOLCtCQUF1QjtJQUNuQiwwQkFBK0MsY0FBQTtJQUVuRCxpQkFBTSxFQUFBLEVBQUE7OztJQUxDLGVBQXlDO0lBQXpDLHVFQUF5QztJQUFvQiwwQ0FBcUI7SUFHaEUsZUFBbUI7SUFBbkIsMkRBQW1CO0lBQ2YsZUFBd0I7SUFBeEIsZ0VBQXdCOzs7OztJQUs3RCwrQkFBbUssYUFBQSxhQUFBLFlBQUE7SUFHekgsNkpBQVMsZUFBQSxtQ0FBMkIsTUFBTSxTQUFTLENBQUEsSUFBQztJQUU5RSx3QkFBcUQ7SUFDckQsZ0NBQXNCO0lBQUEsWUFBMkU7SUFBQSxpQkFBTyxFQUFBLEVBQUEsRUFBQSxFQUFBOzs7SUFOekYsdUVBQXNEO0lBRXhELGVBQWtGO0lBQWxGLDBIQUFrRjtJQUVoRyxlQUFzRDtJQUF0RCx1RUFBc0Q7SUFFL0IsZUFBMkU7SUFBM0UsNkdBQTJFOzs7SUFLakgsK0JBQTJHO0lBQUMsWUFBOEU7SUFBQSxpQkFBTTs7O0lBQXBGLGVBQThFO0lBQTlFLHVIQUE4RTs7O0lBR3RMLCtCQUEwRDtJQUN0RCxxR0FDSjtJQUFBLGlCQUFNOzs7SUFGRCw4Q0FBYzs7O0lBSW5CLCtCQUErRjtJQUMzRixZQUNKO0lBQUEsaUJBQU07OztJQURGLGVBQ0o7SUFESSx5R0FDSjs7OztJQW9CSSxrQ0FJb0I7SUFDaEIsNEJBQWdPO0lBQ3BPLGlCQUFLOzs7Ozs7OztJQU5nRixtSEFBNEU7SUFBQyx3Q0FBaUMsd0JBQUE7SUFHL0wsNENBQTBCO0lBRVosZUFBaUM7SUFBakMsdURBQWlDLG1JQUFBOzs7SUFMbkQsNEVBTUs7OztJQU5nQiwwQ0FBYzs7O0lBWTNDLDBCQUFzRzs7O0lBQXBDLGtEQUE2Qjs7O0lBRS9GLCtCQUF5RSxXQUFBO0lBRWpFLHdCQUFzRjtJQUN0RixnQ0FBc0I7SUFBQSx1QkFBTztJQUFBLGlCQUFPO0lBQ3BDLDJCQUFpRTtJQUNyRSxpQkFBTyxFQUFBOzs7SUFIdUQsZUFBdUI7SUFBdkIsNENBQXVCO0lBRXRELGVBQThCO0lBQTlCLG1EQUE4Qjs7OztJQUlqRSwrQkFBa0ksYUFBQSxhQUFBLFlBQUE7SUFHeEYsOEpBQVMsZUFBQSxtQ0FBMkIsTUFBTSxTQUFTLENBQUEsSUFBQztJQUU5RSx3QkFBc0Q7SUFDdEQsZ0NBQXNCO0lBQUEsWUFBbUU7SUFBQSxpQkFBTyxFQUFBLEVBQUEsRUFBQSxFQUFBOzs7SUFOakYsbUVBQWtEO0lBRXhELGVBQStFO0lBQS9FLHNIQUErRTtJQUV6RixlQUFrRDtJQUFsRCxtRUFBa0Q7SUFFM0IsZUFBbUU7SUFBbkUscUdBQW1FOzs7O0lBa0JyRyw2QkFLQztJQUpFLG1LQUFTLGVBQUEsbUNBQTJCLE1BQU0sU0FBUyxDQUFBLElBQUM7SUFJdEQsaUJBQUk7OztJQUZGLGlEQUEyQix3Q0FBQTs7O0lBZmxDLCtCQUF3UDtJQUNwUCwwQkFVTztJQUNQLGtFQUtLO0lBQ1QsaUJBQU07OztJQWxCa0QscVdBQStMO0lBWS9PLGVBQWtCO0lBQWxCLDBDQUFrQjs7O0lBZU4sd0JBQW9FOzs7SUFDcEUsZ0NBQW9EO0lBQUEsWUFBd0I7SUFBQSxpQkFBTzs7O0lBQS9CLGVBQXdCO0lBQXhCLDhDQUF3Qjs7O0lBS2hGLGtDQUdtRDtJQUMvQyw0QkFBZ087SUFDcE8saUJBQUs7Ozs7Ozs7O0lBSkQseUZBQTBEO0lBQzFELHdDQUFpQyx3QkFBQTtJQUZvRCw0Q0FBMEI7SUFJakcsZUFBaUM7SUFBakMsdURBQWlDLG1JQUFBOzs7OztJQWYvRCw4QkFBOEUsYUFBQSxhQUFBO0lBRVQsNktBQVMsZUFBQSxpQ0FBeUIsQ0FBQSxJQUFDO0lBQ2hHLDBCQUFJO0lBQUEsWUFDQTtJQUFBLCtCQUEyQjtJQUN2QiwrRUFBb0U7SUFDcEUscUZBQW1GO0lBQ25GLGlCQUFNLEVBQUEsRUFBQTtJQUdkLDBCQUEyRjtJQUN2RixrRkFLSztJQUNULGlCQUFLLEVBQUEsRUFBQTs7OztJQWhCb0QsZUFBcUI7SUFBckIsMkNBQXFCO0lBQTlFLDRDQUEwQjtJQUN1RSxlQUFnRDtJQUFoRCwwRUFBZ0Q7SUFDN0ksZUFDQTtJQURBLGdEQUNBO0lBQ2lELGVBQWlCO0lBQWpCLDBDQUFpQjtJQUN2RCxlQUFlO0lBQWYsd0NBQWU7SUFJMUIsZUFBc0Y7SUFBdEYsc0hBQXNGO0lBQ2pFLGVBQWtCO0lBQWxCLDJDQUFrQjs7O0lBWG5ELDhFQW1CSzs7O0lBbkJvQiw2Q0FBYzs7QUR4RDNDLE1BQU0sV0FBVyxHQUFHLHdCQUF3QixDQUFDO0FBQzdDLE1BQU0sYUFBYSxHQUFHLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFDLENBQUM7QUFTdEUsTUFBTSxPQUFPLGFBQWMsU0FBUSxpQkFBaUI7YUFDekMsb0JBQWUsR0FBRyxhQUFhLEVBQUUsQ0FBQztJQWlHekMsSUFBVyxZQUFZO1FBQ25CLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNsQixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDdkM7UUFDRCxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hCLE9BQU8sRUFBRSxDQUFDO1NBQ2I7UUFDRCxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksVUFBVSxDQUFDLFVBQWtCLEVBQUUsS0FBYztRQUNoRCxJQUFJLE9BQU8sQ0FBQztRQUNaLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUVsQixJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2IsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNuQixDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtnQkFDdkMsT0FBTyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLGtCQUFrQixFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLE9BQU8sRUFBRTtvQkFDVCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN4QjtZQUNMLENBQUMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxNQUFNLENBQUM7U0FDakI7UUFDRCxLQUFLLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO1FBRXBCLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFakQsSUFBSSxPQUFPLEVBQUU7WUFDVCxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztTQUMxRDtJQUNMLENBQUM7SUFFRCxnR0FBZ0c7SUFDekYsT0FBTyxDQUFDLEtBQWE7UUFDeEIsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7O01BSUU7SUFDSyxRQUFRLENBQUMsSUFBUztRQUNyQixJQUFJLElBQUksWUFBWSxpQkFBaUIsRUFBRTtZQUNuQyxPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0QzthQUFNLElBQUksSUFBSSxFQUFFO1lBQ2IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNsRTtJQUNMLENBQUM7SUFFRCxJQUFXLFlBQVksQ0FBQyxLQUFLO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUV6QixJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztTQUNoRDthQUFNO1lBQ0gsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMxQjtRQUNELFVBQVUsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRCxZQUNJLEdBQWEsRUFDYixLQUF3QixFQUN4QixRQUFvQixFQUNwQixHQUFRLEVBQ1IsV0FBd0IsRUFDeEIsTUFBYyxFQUNlLGFBQXFCLEVBQ25CLGVBQXVCLEVBQzNCLFdBQW1CLEVBQ2hCLGNBQXNCLEVBQ3JCLFlBQW9CLEVBQ3BCLFlBQW9CLEVBQ25ELGdCQUFrQyxFQUNsQyxpQkFBb0M7UUFFcEMsSUFBSSxTQUFTLEdBQWEsSUFBSSxDQUFDO1FBQy9CLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDN0QsS0FBSyxDQUFDLEdBQUcsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFDekMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixDQUFDO1FBQ3pDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztRQUMzQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUV0QixJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztRQUN2QyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUVyQyxJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFFOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUNoQyxJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxZQUFZLEVBQUUsQ0FBQztRQUUxQyw4RUFBOEU7UUFDOUUsSUFBSSxDQUFDLG1CQUFtQixHQUFHO1lBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGlDQUFpQyxFQUFFLE9BQU8sQ0FBQyxFQUFFO2dCQUM1RCxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7Z0JBQ3BELG1IQUFtSDtnQkFDbkgsSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDakIsY0FBYyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztpQkFDL0Q7Z0JBQ0QsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsS0FBSyxjQUFjLEVBQUU7b0JBQ3BELE9BQU87aUJBQ1Y7Z0JBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQztZQUNGLHVEQUF1RDtZQUN2RCxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsRUFBRTtnQkFDN0MsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxLQUFLLEVBQUU7b0JBQ25ELE9BQU87aUJBQ1Y7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDN0IsQ0FBQyxDQUFDO1NBQ0wsQ0FBQztJQUNOLENBQUM7SUFFTyxrQkFBa0I7UUFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDbEUsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxPQUFPO1FBQzdCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxNQUFNLEVBQUU7WUFDeEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDdkIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxFQUFFO2dCQUNsQyxPQUFPLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO2dCQUN4QyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxXQUFXLENBQUMsVUFBVSxDQUFDO2FBQ2pEO1lBQ0QsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQzthQUNuQztTQUNKO0lBQ0wsQ0FBQztJQUVPLGNBQWMsQ0FBQyxTQUFTLEVBQUUsSUFBSztRQUNuQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIscU1BQXFNO1FBQ3JNLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQzNFLElBQUksSUFBSSxFQUFFO1lBQ04sR0FBRyxHQUFHLElBQUksQ0FBQztTQUNkO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFFRCxNQUFNO1FBQ0YsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDakM7SUFDTCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQUs7UUFDVCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbkIsSUFBSSxRQUFRLENBQUM7WUFDYixJQUFJLElBQUksRUFBRTtnQkFDTixRQUFRLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQzthQUN2RDtZQUNELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzNDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFLO1FBQ1IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQsU0FBUyxDQUFDLElBQUs7UUFDWCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbkIsSUFBSSxRQUFRLENBQUM7WUFDYixJQUFJLElBQUksRUFBRTtnQkFDTixRQUFRLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQzthQUN2RDtZQUNELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQzNDO0lBQ0wsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFLO1FBQ1IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBQ0QsYUFBYSxDQUFDLElBQUk7UUFDZCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ25DLElBQUksVUFBVSxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxFQUFFO1lBQ3JILElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtnQkFDakIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDcEMsNEZBQTRGO2dCQUM1RixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFO29CQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO2lCQUNwRDtxQkFBTSxFQUFFLDZCQUE2QjtvQkFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ2pEO1lBQ0wsQ0FBQyxDQUFDLENBQUM7U0FDTjtJQUNMLENBQUM7SUFFTyxlQUFlO1FBQ25CLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFTyxxQkFBcUI7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFTyxzQkFBc0I7UUFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDO0lBQzlDLENBQUM7SUFFTyx1QkFBdUI7UUFDM0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDO1FBQzNDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFTyxxQkFBcUI7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO0lBQy9CLENBQUM7SUFFTyxxQkFBcUI7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUMsSUFBSSxDQUFDO1FBQ3hDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxvQkFBb0I7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVPLGtCQUFrQjtRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUMvQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssc0JBQXNCLENBQUMsSUFBSTtRQUMvQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsUUFBUSxJQUFJLEVBQUU7WUFDVixLQUFLLGVBQWUsQ0FBQyxLQUFLO2dCQUN0QixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDN0IsTUFBTTtZQUNWLEtBQUssZUFBZSxDQUFDLE1BQU07Z0JBQ3ZCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2dCQUM5QixNQUFNO1lBQ1YsS0FBSyxlQUFlLENBQUMsUUFBUSxDQUFDO1lBQzlCLEtBQUssZUFBZSxDQUFDLE9BQU87Z0JBQ3hCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO2dCQUMvQixNQUFNO1lBQ1YsS0FBSyxlQUFlLENBQUMsS0FBSztnQkFDdEIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBQzdCLE1BQU07WUFDVixLQUFLLGVBQWUsQ0FBQyxJQUFJO2dCQUNyQixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztnQkFDN0IsTUFBTTtZQUNWLEtBQUssZUFBZSxDQUFDLE1BQU07Z0JBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO2dCQUM1QixNQUFNO1lBQ1YsS0FBSyxlQUFlLENBQUMsUUFBUTtnQkFDekIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzFCLE1BQU07U0FDYjtJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssZUFBZSxDQUFDLE1BQWtCO1FBQ3RDLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLHdCQUF3QixDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztTQUN0RzthQUFNO1lBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7U0FDM0I7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDZCxJQUFJLENBQUMsU0FBUyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3BFO1FBQ0QsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDM0o7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7U0FDakM7UUFDRCxVQUFVLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVPLFlBQVksQ0FBQyxNQUFNO1FBQ3ZCLGdDQUFnQztRQUNoQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUVwQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztZQUUxQixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDL0UsK0dBQStHO2dCQUMvRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNoQztZQUVELElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDeEMsTUFBTSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUM5QztZQUVELElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDcEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDOUI7WUFFRCxzRkFBc0Y7WUFDdEYsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDak0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFO29CQUNuRSxNQUFNLEVBQUUsQ0FBQztpQkFDWixDQUFDLENBQUM7YUFDRjtZQUVGLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDbkIsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO29CQUNmLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxrQkFBa0IsRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDO2lCQUNqRTtnQkFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ2hDO1NBQ0o7YUFBTTtZQUNILElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDNUI7SUFDTCxDQUFDO0lBRUQsdUVBQXVFO0lBQy9ELGVBQWU7UUFDbkIsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUV6QyxhQUFhLENBQUMsT0FBTyxHQUFHO1lBQ3BCLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUU7U0FDbEMsQ0FBQztRQUVGLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFFakMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLEVBQUU7WUFDM0IsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQzNDO1FBQ0QsOEhBQThIO1FBQzlILElBQUksQ0FBQyxvQkFBb0IsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQVcsRUFBRSxFQUFFO1lBQzlFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ1QsMENBQTBDO1FBQzFDLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFO1lBQzlCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUM5QztRQUNELDhIQUE4SDtRQUM5SCxJQUFJLENBQUMsdUJBQXVCLEdBQUcsYUFBYSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzdFLElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBRUgsYUFBYSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEMsd0ZBQXdGO1FBQ3hGLHVGQUF1RjtRQUN2RixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FDN0IsSUFBSSxDQUFDLFdBQVcsRUFDaEIsSUFBSSxDQUFDLFVBQVUsRUFDZixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFDakQsSUFBSSxDQUFDLE9BQU8sRUFDWixJQUFJLENBQUMsY0FBYyxFQUNuQixnQkFBZ0IsRUFDaEIsSUFBSSxDQUFDLFlBQVksQ0FDcEIsQ0FBQztJQUNOLENBQUM7SUFFTyxlQUFlLENBQUMsTUFBTTtRQUMxQixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsS0FBSyxhQUFhLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDaEgsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztZQUN2QixJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFlBQVksQ0FBQyxFQUFFO2dCQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxFQUFDLElBQUksRUFBRSxXQUFXLENBQUMsVUFBVSxFQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDeEU7WUFDRCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxFQUFFO2dCQUNwQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO2FBQ25DO1NBQ0o7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzVCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLGVBQWUsQ0FBQyxJQUFJLEVBQUU7Z0JBQzdELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzthQUMxQjtpQkFBTTtnQkFDSCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQzdCO1NBQ0o7YUFBTSxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxlQUFlLENBQUMsSUFBSSxFQUFFO1lBQ3BFLGdHQUFnRztZQUNoRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDckQ7SUFDTCxDQUFDO0lBRUQsbURBQW1EO0lBQzNDLGlCQUFpQjtRQUNyQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUVELG1GQUFtRjtJQUMzRSxrQkFBa0I7UUFDdEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLFVBQVUsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssa0JBQWtCLENBQUMsU0FBUztRQUNoQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDcEMsSUFBSSxPQUFPLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQztZQUM1QixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsRUFBRTtnQkFDbEQsNEdBQTRHO2dCQUM1RyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDM0IsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDO2FBQzlCO1lBQ0QsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBRTtnQkFDL0IsT0FBTyxJQUFJLENBQUM7YUFDZjtRQUNMLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztJQUNmLENBQUM7SUFFTywwQkFBMEIsQ0FBQyx5QkFBMEI7UUFDekQsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUFFLFdBQVcsQ0FBQztRQUMxQixNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakUsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxNQUFNLEVBQUU7WUFDdEMsbUdBQW1HO1lBQ25HLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvRCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxFQUFFO2dCQUNwQyw0SEFBNEg7Z0JBQzVILElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7b0JBQ3BELFdBQVcsQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO2lCQUNqQztxQkFBTTtvQkFDSCxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsVUFBUyxZQUFZO3dCQUNwRCxPQUFPLFlBQVksQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDO29CQUN6QyxDQUFDLENBQUMsQ0FBQztpQkFDTjthQUNKO1NBQ0o7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDakIsSUFBSSxDQUFDLG1CQUF3QyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDN0Q7UUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQXVCLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDdEQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNmLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDakIsSUFBSSxDQUFDLG1CQUF3QyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztpQkFDaEY7cUJBQU07b0JBQ0gsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztpQkFDdEQ7Z0JBQ0QsR0FBRyxHQUFHLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsY0FBYyxDQUFDLElBQUssSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDekQsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsRUFBRTt3QkFDeEMsV0FBVyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ3RDO2lCQUNKO3FCQUFNO29CQUNILFdBQVcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztpQkFDcEM7YUFDSjtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxNQUFNLElBQUksQ0FBQyx5QkFBeUIsRUFBRTtZQUNwRSxJQUFJLGdDQUFnQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUMvRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxFQUFDLGNBQWMsRUFBRSxXQUFXLENBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQzthQUMxRjtpQkFBTTtnQkFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLGtDQUFrQyxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0RBQWdELENBQUMsQ0FBQzthQUNuSDtTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyx1QkFBdUIsQ0FBQyxTQUE0QixFQUFFLHlCQUEwQjtRQUNwRix5REFBeUQ7UUFDekQsSUFBSSxTQUFTLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFO1lBQ3JDLElBQUksSUFBSSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGFBQWEsQ0FBQyxFQUFFO2dCQUM1Qyx3R0FBd0c7Z0JBQ3hHLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNyQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7YUFDM0I7WUFDRCxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3BCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUM1RCxTQUFTLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQzthQUM5QjtpQkFBTTtnQkFDSCxtR0FBbUc7Z0JBQ25HLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUNuQixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztpQkFDN0I7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsRUFBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO2dCQUNyRSxTQUFTLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzthQUM3QjtZQUNELElBQUksQ0FBQywwQkFBMEIsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1NBQzlEO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNLLFlBQVksQ0FBQyxTQUF1QztRQUN4RCw4S0FBOEs7UUFDOUssSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3BCLHVGQUF1RjtZQUN2RixlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxFQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQztTQUMvRDtRQUNELElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsbUJBQW1CLEVBQUU7WUFDNUcsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMvRCxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxFQUFFO2dCQUNwQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO2dCQUNqQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ2hJLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDckUsV0FBVyxDQUFDLFVBQVUsR0FBRyxXQUFXLENBQUMsVUFBVSxJQUFJLENBQUMsQ0FBQztnQkFDckQsZ0VBQWdFO2dCQUNoRSxJQUFJLG1CQUFtQixLQUFLLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxJQUFJLFdBQVcsQ0FBQyxVQUFVLEtBQUssV0FBVyxFQUFFO29CQUNuRyxXQUFXLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO3dCQUN0QyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssV0FBVyxFQUFFOzRCQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7eUJBQ3JDO29CQUNMLENBQUMsQ0FBQyxDQUFDO2lCQUNOO2FBQ0o7U0FDSjtRQUNELE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUU3RixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQztRQUV0RCx3R0FBd0c7UUFDeEcsa0VBQWtFO1FBQ2xFLElBQUksU0FBUyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxDQUFDLG1CQUFtQixLQUFLLEtBQUssRUFBRTtZQUM5SCxNQUFNLFVBQVUsR0FBc0IsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUV0RCxJQUNJLENBQUMsVUFBVSxDQUFDLFdBQVc7Z0JBQ3ZCLElBQUksQ0FBQyxhQUFhO2dCQUNsQiw4SEFBOEg7Z0JBQzlILENBQUMsQ0FDRyxDQUFDLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQztvQkFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQ3JCLEVBQ0g7Z0JBQ0UsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsVUFBVSxDQUFDO2dCQUM1RCw2QkFBNkI7Z0JBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEI7U0FDSjthQUFNO1lBQ0gsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDakMsTUFBTSxRQUFRLEdBQXNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDMUUsSUFBSSxRQUFRLEVBQUU7b0JBQ1YsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7b0JBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFRLENBQUM7b0JBQ2pDLDJCQUEyQjtvQkFDM0IsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztpQkFDbEM7WUFDTCxDQUFDLENBQUMsQ0FBQztTQUNOO1FBRUQsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3pDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDakUsd0VBQXdFO1lBQ3hFLGdEQUFnRDtZQUNoRCxJQUFJLFdBQVcsRUFBRSxJQUFJLGNBQWMsQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLE1BQU0sRUFBRTtnQkFDNUYsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLHdCQUF3QixDQUFDLENBQUM7YUFDeEY7aUJBQU07Z0JBQ0gsMElBQTBJO2dCQUMxSSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztnQkFDdkQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDO2dCQUN6QyxJQUFJLFFBQVEsRUFBRSxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksTUFBTSxHQUFHLE9BQU8sRUFBRTtvQkFDcEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sR0FBRyxJQUFJLENBQUMsQ0FBQztpQkFDL0M7Z0JBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO2FBQy9GO1NBQ0o7UUFFRCxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBRU0sd0JBQXdCLENBQUMsR0FBd0IsRUFBRSxNQUFhO1FBQ25FLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNmLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNwRCw0RUFBNEU7WUFDNUUsSUFBSSxlQUFlLENBQUMsYUFBYSxLQUFLLElBQUksRUFBRTtnQkFDeEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsZUFBZSxDQUFDLENBQUM7YUFDN0M7U0FDSjtJQUNMLENBQUM7SUFFTyxhQUFhO1FBQ2pCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBRSxTQUFTLENBQUMsRUFBRTtZQUMxQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDL0IsQ0FBQyxDQUFDLENBQUM7UUFDSCx5Q0FBeUM7UUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsMkJBQTJCLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMvRixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3hELHlDQUF5QztZQUN6QyxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxhQUFhLENBQUMsRUFBRTtnQkFDbkcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzthQUN0RDtZQUNELElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDbEQsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUVELDJDQUEyQztJQUNuQyxjQUFjLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDMUIsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELDBCQUEwQjtJQUNsQixNQUFNLENBQUMsR0FBRyxFQUFFLEVBQUU7UUFDbEIsMkVBQTJFO1FBQzNFLHlGQUF5RjtRQUN6RixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDaEIsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsa0JBQWtCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDakcsSUFBSSxjQUFjLElBQUksY0FBYyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDdEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO2dCQUM1RixJQUFJLENBQUMsaUNBQWlDLEVBQUUsQ0FBQzthQUM1QztTQUNKO0lBQ0wsQ0FBQztJQUdELDhCQUE4QjtJQUN0QixRQUFRLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxZQUFhO1FBQ25DLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDNUIsMkVBQTJFO1FBQzNFLE1BQU0sUUFBUSxHQUFHLEVBQUUsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNuRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUU5QyxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDN0MsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBRTdDLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELHFEQUFxRDtRQUNyRCxJQUFJLFdBQVcsRUFBRTtZQUNiLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFLEtBQUssTUFBTSxFQUFFO2dCQUN0QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO2FBQ2pFO1lBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDM0UsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFFM0UsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBRXRDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUMzQixNQUFNLFlBQVksR0FBRztnQkFDakIsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQzthQUN2QixDQUFDO1lBQ0YsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3RDO0lBQ0wsQ0FBQztJQUVELHdDQUF3QztJQUNoQyxZQUFZO1FBQ2hCLElBQUksUUFBUSxDQUFDO1FBQ2IsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSwwR0FBMEc7WUFDdEksUUFBUSxHQUFHLFFBQVEsQ0FBQztTQUNyQjthQUFNLElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLHNEQUFzRDtZQUMvRSxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDMUM7YUFBTSxFQUFFLHNDQUFzQztZQUMzQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1NBQ3JCO1FBRUQsTUFBTSxPQUFPLEdBQUcsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakMsUUFBUSxFQUFFLFFBQVE7U0FDckIsQ0FBQztRQUVGLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFFbEQsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFckgsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBQyxRQUFRLEVBQUUsZ0JBQWdCLEVBQUMsQ0FBQyxDQUFDO1FBRXBELElBQUksV0FBVyxFQUFFLEVBQUU7WUFDZixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsVUFBUyxLQUFLO2dCQUN2QyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO29CQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUU7d0JBQ2QsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztxQkFDOUI7b0JBQ0QsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDWiw4Q0FBOEM7d0JBQzlDLElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRTs0QkFDbEIsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO3lCQUMxQjtvQkFDTCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7b0JBQ1AsSUFBSSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFO3dCQUMzQixDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsQ0FBQzt3QkFDaEQsa0JBQWtCO3dCQUNsQixDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFFMUMsbUJBQW1CO3dCQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQzt3QkFFckIsa0VBQWtFO3dCQUNsRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUV2Qix1Q0FBdUM7b0JBQzNDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDWDtZQUNMLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxLQUFLO2dCQUM3QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztnQkFDdEIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBRW5ELCtDQUErQztnQkFDL0MsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRTNDLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDL0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRTtnQkFDZixZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQy9CLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFFTCxDQUFDO0lBRUQsa0RBQWtEO0lBQzFDLG1CQUFtQixDQUFDLEtBQWE7UUFDckMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCw2Q0FBNkM7SUFDckMsa0JBQWtCLENBQUMsS0FBYTtRQUNwQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxnQkFBZ0IsQ0FBQyxJQUF1QjtRQUM1QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCw0REFBNEQ7SUFDckQsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPO1FBQzdCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLHNCQUFzQixDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3hJLE9BQU8sS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVNLGFBQWEsQ0FBQyxNQUFNLEVBQUUsTUFBYztRQUN2QyxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsSUFBRyxNQUFNLENBQUMsT0FBTyxLQUFLLEVBQUUsSUFBSSxNQUFNLENBQUMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxFQUFFLENBQUMsRUFBRztZQUN0TCxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7U0FDM0I7UUFFRCxNQUFNLFNBQVMsR0FBaUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUUvRCxJQUFJLFlBQVksR0FBVyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFeEUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2xCLE1BQU0sVUFBVSxHQUFXLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUN6RSxNQUFNLFdBQVcsR0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUgsSUFBSSxNQUFNLEtBQUssWUFBWSxFQUFFO2dCQUN6QixJQUFJLFlBQVksR0FBRyxDQUFDLEVBQUU7b0JBQ2xCLElBQUksQ0FBQyxZQUFZLElBQUksVUFBVSxDQUFDLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxFQUFFO3dCQUN2RSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFFLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQzt3QkFDbkUsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO3FCQUN2RDt5QkFBTSxJQUFJLFlBQVksR0FBRyxVQUFVLEVBQUU7d0JBQ2xDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQzt3QkFDcEUsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7cUJBQ3JFO3lCQUFNO3dCQUNILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsRUFBRSxFQUFDLE1BQU0sRUFBQyxDQUFDLENBQUM7cUJBQzlEO2lCQUNKO2FBQ0o7aUJBQU0sSUFBSSxNQUFNLEtBQUssWUFBWSxFQUFFO2dCQUNoQyxJQUFJLFlBQVksR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDckMsSUFBSSxDQUFDLFlBQVksSUFBSSxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLEVBQUU7d0JBQ3ZFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUNsRSxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7cUJBQ3ZEO3lCQUFNLElBQUksWUFBWSxHQUFHLFVBQVUsRUFBRTt3QkFDbEMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO3dCQUNwRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztxQkFDckU7eUJBQU07d0JBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLHNCQUFzQixFQUFFLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQztxQkFDOUQ7aUJBQ0o7YUFDSjtTQUNKO1FBQ0QsSUFBSSxNQUFNLEtBQUssV0FBVyxFQUFFO1lBQ3hCLElBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFO2dCQUMxQixZQUFZLEdBQUcsWUFBWSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUN0RCxJQUFHLFlBQVksS0FBSyxDQUFDLEVBQUU7b0JBQ25CLE9BQU87aUJBQ1Y7Z0JBRUQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDOUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDMUQsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUNsRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNyQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN4RixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDMUIsSUFBSSxDQUFDLFlBQVksR0FBRyxZQUFZLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDO2FBQy9CO2lCQUFNO2dCQUNILFlBQVksR0FBRyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDO2FBQy9CO1NBQ0o7YUFBTSxJQUFJLE1BQU0sS0FBSyxXQUFXLEVBQUU7WUFDL0IsSUFBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzFCLFlBQVksR0FBRyxZQUFZLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQy9GLElBQUcsWUFBWSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRztvQkFDNUMsT0FBTztpQkFDVjtnQkFFRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM5RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUMxRCxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQzVDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQzlELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3JDLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQ3hGLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDO2FBQy9CO2lCQUFNO2dCQUNILFlBQVksR0FBRyxZQUFZLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNuRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUM5RCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUM1QyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsV0FBVyxDQUFDO2FBQy9CO1NBQ0o7YUFBTSxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDNUIsdUlBQXVJO1lBQ3ZJLElBQUksWUFBWSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxFQUFFO2dCQUN2RixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUN6RCxNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7Z0JBQ3JELFlBQVksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7U0FDbkU7YUFBTSxJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUU7WUFDM0IsSUFBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3BCLE9BQU87YUFDVjtZQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQztZQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztZQUNoRSxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUM7WUFDckMsSUFBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLENBQUMsWUFBWSw2QkFBNkIsQ0FBQztnQkFDdkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO2FBQzlDO2lCQUFRO2dCQUNMLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxJQUFJLENBQUMsWUFBWSwyQkFBMkIsQ0FBQztnQkFDckUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO2FBQ2xEO1NBQ0o7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsR0FBVyxFQUFFLEVBQU8sRUFBRSxFQUFRO1FBQzNDLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRTtZQUNuQixJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNoRCxPQUFPO2FBQ1Y7WUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQzVCO2FBQU0sSUFBSSxHQUFHLEtBQUssWUFBWSxFQUFFO1lBQzdCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDZCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUN0QztTQUNKO2FBQU0sSUFBSSxHQUFHLEtBQUssWUFBWSxFQUFFO1lBQzdCLG1GQUFtRjtZQUNuRixJQUFJLEVBQUUsS0FBSyxVQUFVLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO2dCQUM1QixPQUFPO2FBQ1Y7WUFDRCxXQUFXLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2hDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQzthQUM3RDtTQUNKO2FBQU0sSUFBSSxHQUFHLEtBQUssYUFBYSxFQUFFO1lBQzlCLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN0QjthQUFNLElBQUksR0FBRyxLQUFLLFVBQVUsRUFBRTtZQUMzQixPQUFPO1NBQ1Y7YUFBTSxJQUFJLEdBQUcsS0FBSyxlQUFlLElBQUksRUFBRSxFQUFFO1lBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFDeEMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7U0FDbkM7YUFBTSxJQUFJLEdBQUcsS0FBSyxpQkFBaUIsRUFBRTtZQUNsQyxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3BCLHVHQUF1RztnQkFDdkcsVUFBVSxDQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQyxDQUFDO2FBQzlEO1NBQ0o7YUFBTSxJQUFJLEdBQUcsS0FBSyxVQUFVLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEdBQUc7Z0JBQ3pCLFVBQVUsRUFBRSxFQUFFO2FBQ2pCLENBQUM7WUFDRixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztTQUN0QzthQUFNLElBQUksR0FBRyxLQUFLLGVBQWUsRUFBRTtZQUNoQyxJQUFJLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO2dCQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDbEM7aUJBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxFQUFFO2dCQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNuQztTQUNKO2FBQU07WUFDSCxLQUFLLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUN2QztJQUNMLENBQUM7SUFFTSxXQUFXLENBQUMsR0FBUSxFQUFFLFNBQTRCO1FBQ3JELElBQUksV0FBbUIsQ0FBQztRQUV4QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRTtZQUN4QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLFNBQVMsQ0FBQztZQUM3RCw0REFBNEQ7WUFDNUQsV0FBVyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVoSCx5Q0FBeUM7WUFDekMsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLFFBQVEsRUFBRSxFQUFFO2dCQUNoQyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFO29CQUM3RCxJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQzNDO3FCQUFNO29CQUNILElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsRUFBRSxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO2lCQUNuRTthQUNKO2lCQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxJQUFJLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUN6RCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsSUFBSSxTQUFTLENBQUMsUUFBUSxFQUFFO29CQUM3RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FBQztvQkFDM0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLFNBQVMsQ0FBQyxDQUFDO2lCQUMzQztxQkFBTTtvQkFDSCxJQUFJLENBQUMsbUJBQW1CLENBQUMsc0JBQXNCLEVBQUUsRUFBQyxNQUFNLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQztpQkFDbkU7YUFDSjtpQkFBTSxJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDekMsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7Z0JBQ3BDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO2dCQUVoRCxrREFBa0Q7Z0JBQ2xELElBQUksS0FBSyxHQUFHLElBQUksRUFBRTtvQkFDZCxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNuQztnQkFDRCxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEVBQUU7b0JBQ3hDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQTBCLEVBQUUsRUFBRTt3QkFDbEQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7d0JBQ3BDLElBQUksS0FBSyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFOzRCQUNqQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQ3pDO29CQUNMLENBQUMsQ0FBQyxDQUFDO29CQUNILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLENBQUM7aUJBQ3JDO3FCQUFPO29CQUNKLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxzQkFBc0IsRUFBRSxFQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO2lCQUNuRTthQUVKO2lCQUFNO2dCQUNILElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7b0JBQ3hDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO29CQUMxQixJQUFJLENBQUMsdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQ3hDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsU0FBUyxDQUFDO2lCQUM5RDthQUNKO1lBQ0QsVUFBVSxFQUFFLENBQUM7U0FDaEI7SUFDTCxDQUFDO0lBRUQsa0NBQWtDO0lBQzNCLEtBQUs7UUFDUixJQUFJLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssd0JBQXdCLENBQUMsR0FBUTtRQUNyQyxJQUFJLFFBQTJCLENBQUM7UUFDaEMsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDZixRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNDO2FBQU07WUFDSCxRQUFRLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzNDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFlBQVksQ0FBRSxHQUFRO1FBQ3pCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwRCxJQUFJLFFBQVEsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFO1lBQy9CLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMxQztJQUNMLENBQUM7SUFFRDs7O09BR0c7SUFDSSxVQUFVLENBQUMsR0FBRyxFQUFFLHlCQUEwQjtRQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNYLE9BQU87U0FDVjtRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFO1lBQ3BCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxRQUFRLEVBQUUseUJBQXlCLENBQUMsQ0FBQztTQUNyRTtRQUNELHFCQUFxQjtRQUNyQixRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsTUFBTTtRQUN6QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRVMsV0FBVyxDQUFDLElBQWlCLEVBQUUsU0FBaUIsRUFBRSxhQUF1QixFQUFFLE1BQVc7UUFDNUYsc0ZBQXNGO1FBQ3RGLE1BQU0sWUFBWSxHQUFHO1lBQ2pCLEdBQUcsRUFBRSxPQUFPO1lBQ1osU0FBUyxFQUFFLFVBQVU7U0FDeEIsQ0FBQztRQUNGLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFO1lBQ2xFLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQzlCLElBQUksQ0FBQyxhQUFhLEVBQ2xCLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLEVBQ3BDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ0osTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztnQkFDdkQsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO29CQUNmLE1BQU0sZUFBZSxHQUFzQixNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7b0JBQzFFLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFO3dCQUM5QixJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxFQUFFLEVBQUMsTUFBTSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQztxQkFDM0c7aUJBQ0o7WUFDTCxDQUFDLENBQ0osQ0FBQztTQUNMO0lBQ0wsQ0FBQztJQUVELHVGQUF1RjtJQUMvRSx3QkFBd0I7UUFDNUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO1lBQ25FLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQzthQUNqQztRQUNMLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDO0lBRUQsUUFBUTtRQUNKLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsaUNBQWlDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGlDQUFpQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsY0FBYyxDQUFDLHdCQUF3QixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNOLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEdBQUc7WUFDaEIsUUFBUSxFQUFFLElBQUk7WUFDZCxRQUFRLEVBQUUsSUFBSTtTQUNqQixDQUFDO0lBQ04sQ0FBQztJQUVPLGdCQUFnQjtRQUNwQixNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckUsSUFBSSxRQUFRLEVBQUU7WUFDVixtQ0FBbUM7WUFDbkMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRTtnQkFDckMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUQsZUFBZTtRQUNYLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQzVCLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEQsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztZQUVoRSxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNyQyxJQUFHLEdBQUcsRUFBRTtvQkFDSixHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztpQkFDOUM7Z0JBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3ZCO1lBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3JCLElBQUksR0FBRyxFQUFFO29CQUNMLEdBQUcsQ0FBQyxVQUFVLENBQUMsa0JBQWtCLENBQUMsQ0FBQztpQkFDdEM7YUFDSjtZQUNELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQ2xFO1lBQ0QsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLDJCQUEyQixDQUFDLENBQUM7UUFDMUUsTUFBTSxDQUFDLEdBQWtCLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDekUsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3BCLElBQUksR0FBRyxFQUFDO2dCQUNKLEdBQUcsQ0FBQyxZQUFZLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3REO1NBQ0o7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRztZQUN0QixJQUFHLEdBQUcsRUFBRTtnQkFDSixHQUFHLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUM7YUFDM0M7U0FDSjtRQUNELElBQUksV0FBVyxFQUFFLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyw2QkFBNkIsQ0FBQyxFQUFFO1lBQ25FLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0M7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixFQUFFO1lBQzNELElBQUksQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDckQ7UUFDRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEQsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxVQUFVO1FBQ04sS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQzFCLENBQUM7OEVBanZDUSxhQUFhLGdQQWtMUCxnQkFBZ0Isd0JBQ2hCLGtCQUFrQix3QkFDbEIsY0FBYyx3QkFDZCxpQkFBaUIsd0JBQ2pCLGtCQUFrQix3QkFDbEIsa0JBQWtCO29FQXZMeEIsYUFBYTs7Ozt3Q0FPTCxlQUFlOzs7Ozs7OzsyQkFFckIsbUJBQW1COzJCQUNoQixpQkFBaUI7Ozs7OzhDQWRwQjtnQkFDUCxrQkFBa0IsQ0FBQyxhQUFhLENBQUM7YUFDcEM7WUM1REwsOERBVU07WUFFTiw4REFVTTtZQUNOLDhEQUFnTTtZQUVoTSwyQkFBSztZQUNELDhEQUVNO1lBRU4sOERBRU07WUFDVixpQkFBTTtZQUVOLDZCQWVDO1lBZEcsNEdBQWlCLDBCQUFzQixRQUFRLENBQUMsSUFBQywrRkFFaEMsMEJBQXNCLE9BQU8sQ0FBQyxJQUZFLG1HQUk5QiwwQkFBc0IsV0FBVyxDQUFDLElBSkosdUdBSzVCLDBCQUFzQixXQUFXLENBQUMsSUFMTix1R0FNNUIsMEJBQXNCLFdBQVcsQ0FBQyxJQU5OLHlHQU8zQiwwQkFBc0IsV0FBVyxDQUFDLElBUFAsK0dBU3hCLDBCQUFzQixZQUFZLENBQUMsSUFUWCxtSEFVdEIsMEJBQXNCLFlBQVksQ0FBQyxJQVZiLG1IQVd0QiwwQkFBc0IsWUFBWSxDQUFDLElBWGIscUhBWXJCLDBCQUFzQixZQUFZLENBQUMsSUFaZDtZQWVqRCw4RUFRYztZQUNkLDJCQUF5RSxNQUFBO1lBRTdFLGlCQUFLO1lBRUwsZ0VBQXNHO1lBRXRHLGdFQU1NO1lBRU4saUVBVU07WUFFTixpRUFrQk07WUFHTixrSEFxQmM7OztZQWhJYyxtRUFBc0M7WUFZa0QsZUFBNkM7WUFBN0Msc0VBQTZDO1lBVzNKLGVBQTZDO1lBQTdDLHNFQUE2QztZQUdWLGVBQW1CO1lBQW5CLHdDQUFtQjtZQUk1QixlQUFnRDtZQUFoRCw2RUFBZ0Q7WUFLaEQsZUFBZ0g7WUFBaEgsa0pBQWdIO1lBYzVJLGlFQUEyQztZQWQzQyx3Q0FBMEI7WUFnQmIsZUFBaUI7WUFBakIsbUNBQWlCLGtCQUFBO1lBU2hCLGVBQTJDO1lBQTNDLDZEQUEyQztZQUMzQyxlQUE0QztZQUE1Qyw4REFBNEM7WUFHcEMsZUFBc0M7WUFBdEMsK0RBQXNDO1lBRWpDLGVBQXdDO1lBQXhDLGlFQUF3QztZQVFZLGVBQTZDO1lBQTdDLHNFQUE2QztZQVlyRyxlQUEyQjtZQUEzQixnREFBMkI7Ozt1RkR4QnpDLGFBQWE7Y0FQekIsU0FBUzsyQkFDSSxhQUFhLGFBRVo7b0JBQ1Asa0JBQWtCLGVBQWU7aUJBQ3BDOztzQkFvTEksU0FBUzt1QkFBQyxnQkFBZ0I7O3NCQUMxQixTQUFTO3VCQUFDLGtCQUFrQjs7c0JBQzVCLFNBQVM7dUJBQUMsY0FBYzs7c0JBQ3hCLFNBQVM7dUJBQUMsaUJBQWlCOztzQkFDM0IsU0FBUzt1QkFBQyxrQkFBa0I7O3NCQUM1QixTQUFTO3VCQUFDLGtCQUFrQjt1RkFwTEgsWUFBWTtrQkFBekMsWUFBWTttQkFBQyxjQUFjO1lBRVksc0JBQXNCO2tCQUE3RCxZQUFZO21CQUFDLHdCQUF3QjtZQUNHLHVCQUF1QjtrQkFBL0QsWUFBWTttQkFBQyx5QkFBeUI7WUFDTCxhQUFhO2tCQUE5QyxlQUFlO21CQUFDLGVBQWU7WUFFQSxhQUFhO2tCQUE1QyxTQUFTO21CQUFDLG1CQUFtQjtZQUNHLFNBQVM7a0JBQXpDLFlBQVk7bUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIEF0dHJpYnV0ZSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdG9yLFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIE9wdGlvbmFsLFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtcbiAgICAkYXBwRGlnZXN0LFxuICAgICRpbnZva2VXYXRjaGVycyxcbiAgICBBcHAsXG4gICAgQXBwRGVmYXVsdHMsXG4gICAgRGF0YVNvdXJjZSxcbiAgICBnZXRDbG9uZWRPYmplY3QsXG4gICAgaXNEYXRhU291cmNlRXF1YWwsXG4gICAgaXNEZWZpbmVkLFxuICAgIGlzTW9iaWxlLFxuICAgIGlzTW9iaWxlQXBwLFxuICAgIGlzTnVtYmVyLFxuICAgIGlzT2JqZWN0LFxuICAgIG5vb3AsXG4gICAgc3dpdGNoQ2xhc3MsXG4gICAgU3RhdGVQZXJzaXN0ZW5jZSxcbiAgICBQYWdpbmF0aW9uU2VydmljZSxcbiAgICBzZXRMaXN0Q2xhc3MsXG4gICAgZ2VuZXJhdGVHVUlkXG59IGZyb20gJ0B3bS9jb3JlJztcbmltcG9ydCB7IEFQUExZX1NUWUxFU19UWVBFLCBjb25maWd1cmVEbkQsIERFQk9VTkNFX1RJTUVTLCBnZXRPcmRlcmVkRGF0YXNldCwgZ3JvdXBEYXRhLCBoYW5kbGVIZWFkZXJDbGljaywgTkFWSUdBVElPTl9UWVBFLCB1bnN1cHBvcnRlZFN0YXRlUGVyc2lzdGVuY2VUeXBlcywgcHJvdmlkZUFzV2lkZ2V0UmVmLCBTdHlsYWJsZUNvbXBvbmVudCwgc3R5bGVyLCBUb0RhdGVQaXBlLCB0b2dnbGVBbGxIZWFkZXJzLCBXaWRnZXRSZWYsIGV4dHJhY3REYXRhU291cmNlTmFtZSB9IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuaW1wb3J0IHsgUGFnaW5hdGlvbkNvbXBvbmVudCB9IGZyb20gJ0B3bS9jb21wb25lbnRzL2RhdGEvcGFnaW5hdGlvbic7XG5pbXBvcnQgeyBCdXR0b25Db21wb25lbnQgfSBmcm9tICdAd20vY29tcG9uZW50cy9pbnB1dCc7XG5cbmltcG9ydCB7IHJlZ2lzdGVyUHJvcHMgfSBmcm9tICcuL2xpc3QucHJvcHMnO1xuaW1wb3J0IHsgTGlzdEl0ZW1EaXJlY3RpdmUgfSBmcm9tICcuL2xpc3QtaXRlbS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTGlzdEFuaW1hdG9yIH0gZnJvbSAnLi9saXN0LmFuaW1hdG9yJztcblxuZGVjbGFyZSBjb25zdCBfO1xuZGVjbGFyZSBjb25zdCAkO1xuXG5jb25zdCBERUZBVUxUX0NMUyA9ICdhcHAtbGl2ZWxpc3QgYXBwLXBhbmVsJztcbmNvbnN0IFdJREdFVF9DT05GSUcgPSB7d2lkZ2V0VHlwZTogJ3dtLWxpc3QnLCBob3N0Q2xhc3M6IERFRkFVTFRfQ0xTfTtcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdkaXZbd21MaXN0XScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2xpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICBwcm92aWRlQXNXaWRnZXRSZWYoTGlzdENvbXBvbmVudClcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIExpc3RDb21wb25lbnQgZXh0ZW5kcyBTdHlsYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICBzdGF0aWMgaW5pdGlhbGl6ZVByb3BzID0gcmVnaXN0ZXJQcm9wcygpO1xuXG4gICAgQENvbnRlbnRDaGlsZCgnbGlzdFRlbXBsYXRlJykgbGlzdFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxFbGVtZW50UmVmPjtcblxuICAgIEBDb250ZW50Q2hpbGQoJ2xpc3RMZWZ0QWN0aW9uVGVtcGxhdGUnKSBsaXN0TGVmdEFjdGlvblRlbXBsYXRlOiAgVGVtcGxhdGVSZWY8RWxlbWVudFJlZj47XG4gICAgQENvbnRlbnRDaGlsZCgnbGlzdFJpZ2h0QWN0aW9uVGVtcGxhdGUnKSBsaXN0UmlnaHRBY3Rpb25UZW1wbGF0ZTogIFRlbXBsYXRlUmVmPEVsZW1lbnRSZWY+O1xuICAgIEBDb250ZW50Q2hpbGRyZW4oQnV0dG9uQ29tcG9uZW50KSBidG5Db21wb25lbnRzO1xuXG4gICAgQFZpZXdDaGlsZChQYWdpbmF0aW9uQ29tcG9uZW50KSBkYXRhTmF2aWdhdG9yO1xuICAgIEBWaWV3Q2hpbGRyZW4oTGlzdEl0ZW1EaXJlY3RpdmUpIGxpc3RJdGVtczogUXVlcnlMaXN0PExpc3RJdGVtRGlyZWN0aXZlPjtcblxuICAgIHByaXZhdGUgaXRlbXNQZXJSb3dDbGFzczogc3RyaW5nO1xuICAgIHByaXZhdGUgZmlyc3RTZWxlY3RlZEl0ZW06IExpc3RJdGVtRGlyZWN0aXZlO1xuICAgIHByaXZhdGUgbmF2aWdhdG9yTWF4UmVzdWx0V2F0Y2g6IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIG5hdmlnYXRvclJlc3VsdFdhdGNoOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBuYXZDb250cm9sczogc3RyaW5nO1xuICAgIHByaXZhdGUgb25EZW1hbmRMb2FkOiBib29sZWFuO1xuICAgIHByaXZhdGUgX2l0ZW1zOiBBcnJheTxhbnk+O1xuICAgIHByaXZhdGUgZGF0YU5hdmlnYXRvcldhdGNoZWQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBkYXRhc291cmNlOiBhbnk7XG4gICAgcHJpdmF0ZSBzaG93TmF2aWdhdGlvbjogYm9vbGVhbjtcbiAgICBwdWJsaWMgbm9EYXRhRm91bmQ6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSByZW9yZGVyUHJvcHM6IGFueTtcbiAgICBwcml2YXRlIGFwcDogYW55O1xuICAgIHByaXZhdGUgYXBwRGVmYXVsdHM6IGFueTtcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lO1xuICAgIHByaXZhdGUgc3RhdGVQZXJzaXN0ZW5jZTogU3RhdGVQZXJzaXN0ZW5jZTtcbiAgICBwcml2YXRlIHBhZ2luYXRpb25TZXJ2aWNlOiBQYWdpbmF0aW9uU2VydmljZTtcblxuICAgIHB1YmxpYyBsYXN0U2VsZWN0ZWRJdGVtOiBMaXN0SXRlbURpcmVjdGl2ZTtcbiAgICBwdWJsaWMgZmllbGREZWZzOiBBcnJheTxhbnk+O1xuICAgIHB1YmxpYyBkaXNhYmxlaXRlbTtcbiAgICBwdWJsaWMgbmF2aWdhdGlvbjogc3RyaW5nO1xuICAgIHB1YmxpYyBuYXZpZ2F0aW9uYWxpZ246IHN0cmluZztcbiAgICBwdWJsaWMgcGFnZXNpemU6IG51bWJlcjtcbiAgICBwdWJsaWMgZGF0YXNldDogYW55O1xuICAgIHB1YmxpYyBtdWx0aXNlbGVjdDogYm9vbGVhbjtcbiAgICBwdWJsaWMgc2VsZWN0Zmlyc3RpdGVtOiBib29sZWFuO1xuICAgIHB1YmxpYyBvcmRlcmJ5OiBzdHJpbmc7XG4gICAgcHVibGljIGxvYWRpbmdpY29uOiBzdHJpbmc7XG4gICAgcHVibGljIHBhZ2luYXRpb25jbGFzczogc3RyaW5nO1xuICAgIHB1YmxpYyBvbmRlbWFuZG1lc3NhZ2U6IHN0cmluZztcbiAgICBwdWJsaWMgbG9hZGluZ2RhdGFtc2c6IHN0cmluZztcbiAgICBwdWJsaWMgc2VsZWN0aW9ubGltaXQ6IG51bWJlcjtcbiAgICBwdWJsaWMgaW5mU2Nyb2xsOiBib29sZWFuO1xuICAgIHB1YmxpYyBlbmFibGVyZW9yZGVyOiBib29sZWFuO1xuICAgIHB1YmxpYyBpdGVtc3BlcnJvdzogc3RyaW5nO1xuICAgIHB1YmxpYyBpdGVtY2xhc3M6IHN0cmluZztcbiAgICBwdWJsaWMgc2VsZWN0ZWRJdGVtV2lkZ2V0czogQXJyYXk8V2lkZ2V0UmVmPiB8IFdpZGdldFJlZjtcbiAgICBwdWJsaWMgdmFyaWFibGVJbmZsaWdodDtcbiAgICBwdWJsaWMgbmFtZTtcbiAgICBwdWJsaWMgY3VycmVudFBhZ2U7XG4gICAgcHVibGljIGRpcmVjdGlvbjtcbiAgICBwdWJsaWMgdGFiaW5kZXg7XG5cbiAgICBwdWJsaWMgaGFuZGxlSGVhZGVyQ2xpY2s6IEZ1bmN0aW9uO1xuICAgIHB1YmxpYyB0b2dnbGVBbGxIZWFkZXJzOiB2b2lkO1xuICAgIHB1YmxpYyBncm91cGJ5OiBzdHJpbmc7XG4gICAgcHVibGljIGNvbGxhcHNpYmxlOiBzdHJpbmc7XG4gICAgcHVibGljIGRhdGVQaXBlOiBUb0RhdGVQaXBlO1xuICAgIHB1YmxpYyBiaW5kaXRlbWNsYXNzOiBzdHJpbmc7XG4gICAgcHVibGljIGJpbmRkaXNhYmxlaXRlbTogc3RyaW5nO1xuICAgIHB1YmxpYyBiaW5kZGF0YXNldDogc3RyaW5nO1xuICAgIHByaXZhdGUgYmluZGRhdGFzb3VyY2U6IHN0cmluZztcbiAgICBwdWJsaWMgbW91c2VFbnRlckNCOiBzdHJpbmc7XG4gICAgcHVibGljIG1vdXNlTGVhdmVDQjogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBtYXRjaDogc3RyaW5nO1xuICAgIHByaXZhdGUgZGF0ZWZvcm1hdDogc3RyaW5nO1xuICAgIHByaXZhdGUgZ3JvdXBlZERhdGE6IGFueTtcbiAgICBwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZjtcbiAgICBwcml2YXRlIHByb21pc2VSZXNvbHZlckZuOiBGdW5jdGlvbjtcbiAgICBwcml2YXRlIHByb3BzSW5pdFByb21pc2U6IFByb21pc2U8YW55PjtcbiAgICBwcml2YXRlICR1bEVsZTogYW55O1xuICAgIHByaXZhdGUgX2xpc3RBbmltYXRvcjogTGlzdEFuaW1hdG9yO1xuICAgIHB1YmxpYyBwdWxsdG9yZWZyZXNoOiBib29sZWFuO1xuICAgIHByaXZhdGUgX2xpc3RlbmVyRGVzdHJveWVyczogQXJyYXk8YW55PjtcbiAgICBwcml2YXRlIGRlYm91bmNlZEZldGNoTmV4dERhdGFzZXRPblNjcm9sbDogRnVuY3Rpb247XG5cbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZztcbiAgICBwdWJsaWMgc3ViaGVhZGluZzogc3RyaW5nO1xuICAgIHB1YmxpYyBpY29uY2xhc3M6IHN0cmluZztcbiAgICBwdWJsaWMgbGlzdGNsYXNzOiBhbnk7XG4gICAgcHJpdmF0ZSBpc0RhdGFDaGFuZ2VkOiBib29sZWFuO1xuICAgIHB1YmxpYyBzdGF0ZWhhbmRsZXI6IGFueTtcbiAgICBwcml2YXRlIGlzTGlzdEVsZW1lbnRNb3ZhYmxlIDogYm9vbGVhbjtcbiAgICBwdWJsaWMgY3VycmVudEluZGV4OiBudW1iZXI7XG4gICAgcHJpdmF0ZSBhcmlhVGV4dDogU3RyaW5nO1xuICAgIHB1YmxpYyB0aXRsZUlkOiBzdHJpbmcgO1xuXG4gICAgX2lzRGVwZW5kZW50O1xuICAgIHByaXZhdGUgX3BhZ2VMb2FkO1xuICAgIHByaXZhdGUgX3NlbGVjdGVkSXRlbXNFeGlzdDtcblxuICAgIHByaXZhdGUgdG91Y2hpbmc7XG4gICAgcHJpdmF0ZSB0b3VjaGVkO1xuXG4gICAgcHVibGljIGdldCBzZWxlY3RlZGl0ZW0oKSB7XG4gICAgICAgIGlmICh0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0Q2xvbmVkT2JqZWN0KHRoaXMuX2l0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXy5pc0VtcHR5KHRoaXMuX2l0ZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBnZXRDbG9uZWRPYmplY3QodGhpcy5faXRlbXNbMF0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgbGlzdCBvZiB3aWRnZXRzIHByZXNlbnQgb24gbGlzdCBpdGVtIGJ5IGNvbnNpZGVyaW5nIG5hbWUgYW5kIGluZGV4IG9mIHRoZSB3aWRnZXQuXG4gICAgICogSWYgd2UgZGlkJ250IHBhc3MgaW5kZXgsIGl0IHJldHVybnMgYXJyYXkgb2YgYWxsIHRoZSB3aWRnZXRzIHdoaWNoIGFyZSBtYXRjaGluZyB0byB3aWRnZXQgbmFtZVxuICAgICAqIEBwYXJhbSB3aWRndGVOYW1lOiBOYW1lIG9mIHRoZSB3aWRnZXRcbiAgICAgKiBAcGFyYW0gaW5kZXg6IEluZGV4IG9mIHRoZSB3aWRnZXRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0V2lkZ2V0cyh3aWRndGVOYW1lOiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKSB7XG4gICAgICAgIGxldCAkdGFyZ2V0O1xuICAgICAgICBjb25zdCByZXRWYWwgPSBbXTtcblxuICAgICAgICBpZiAoIXdpZGd0ZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNEZWZpbmVkKGluZGV4KSkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMubGlzdEl0ZW1zLnRvQXJyYXkoKSwgKGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgJHRhcmdldCA9IF8uZ2V0KGVsLmN1cnJlbnRJdGVtV2lkZ2V0cywgd2lkZ3RlTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCR0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goJHRhcmdldCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICAgICAgaW5kZXggPSAraW5kZXggfHwgMDtcblxuICAgICAgICAkdGFyZ2V0ID0gXy5nZXQodGhpcy5saXN0SXRlbXMudG9BcnJheSgpLCBpbmRleCk7XG5cbiAgICAgICAgaWYgKCR0YXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybiBbXy5nZXQoJHRhcmdldC5jdXJyZW50SXRlbVdpZGdldHMsIHdpZGd0ZU5hbWUpXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHJldHVybnMgbGlzdGl0ZW0gcmVmZXJlbmNlIGJ5IGluZGV4IHZhbHVlLiBUaGlzIHJlZmVycyB0byB0aGUgc2FtZSBtZXRob2QgZ2V0TGlzdEl0ZW1CeUluZGV4LlxuICAgIHB1YmxpYyBnZXRJdGVtKGluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KGluZGV4KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGluZGV4IG9mIGxpc3RJdGVtKGxpc3RJdGVtRGlyZWN0aXZlIC8gbGlzdEl0ZW1PYmplY3QpXG4gICAgICogSWYgaXRlbSBpcyBhIGRpcmVjdGl2ZSwgaW5kZXggaXMgZmV0Y2hlZCBmcm9tIGxpc3RJdGVtc1xuICAgICAqIElmIGl0ZW0gaXMgYW4gb2JqZWN0LCBpbmRleCBpcyBmZXRjaGVkIGZyb20gZmllbGREZWZzXG4gICAgKi9cbiAgICBwdWJsaWMgZ2V0SW5kZXgoaXRlbTogYW55KSB7XG4gICAgICAgIGlmIChpdGVtIGluc3RhbmNlb2YgTGlzdEl0ZW1EaXJlY3RpdmUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldExpc3RJdGVtSW5kZXgoaXRlbSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmllbGREZWZzLmZpbmRJbmRleCgob2JqKSA9PiBfLmlzRXF1YWwob2JqLCBpdGVtKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IHNlbGVjdGVkaXRlbShpdGVtcykge1xuICAgICAgICB0aGlzLl9pdGVtcy5sZW5ndGggPSAwO1xuICAgICAgICB0aGlzLmRlc2VsZWN0TGlzdEl0ZW1zKCk7XG5cbiAgICAgICAgaWYgKF8uaXNBcnJheShpdGVtcykpIHtcbiAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB0aGlzLnNlbGVjdEl0ZW0oaXRlbSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGl0ZW1zKTtcbiAgICAgICAgfVxuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGluajogSW5qZWN0b3IsXG4gICAgICAgIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgZGF0ZVBpcGU6IFRvRGF0ZVBpcGUsXG4gICAgICAgIGFwcDogQXBwLFxuICAgICAgICBhcHBEZWZhdWx0czogQXBwRGVmYXVsdHMsXG4gICAgICAgIG5nWm9uZTogTmdab25lLFxuICAgICAgICBAQXR0cmlidXRlKCdpdGVtY2xhc3MuYmluZCcpIGJpbmRpdGVtY2xhc3M6IHN0cmluZyxcbiAgICAgICAgQEF0dHJpYnV0ZSgnZGlzYWJsZWl0ZW0uYmluZCcpIGJpbmRkaXNhYmxlaXRlbTogc3RyaW5nLFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhc2V0LmJpbmQnKSBiaW5kZGF0YXNldDogc3RyaW5nLFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhc291cmNlLmJpbmQnKSBiaW5kZGF0YXNvdXJjZTogc3RyaW5nLFxuICAgICAgICBAQXR0cmlidXRlKCdtb3VzZWVudGVyLmV2ZW50JykgbW91c2VFbnRlckNCOiBzdHJpbmcsXG4gICAgICAgIEBBdHRyaWJ1dGUoJ21vdXNlbGVhdmUuZXZlbnQnKSBtb3VzZUxlYXZlQ0I6IHN0cmluZyxcbiAgICAgICAgc3RhdGVQZXJzaXN0ZW5jZTogU3RhdGVQZXJzaXN0ZW5jZSxcbiAgICAgICAgcGFnaW5hdGlvblNlcnZpY2U6IFBhZ2luYXRpb25TZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIGxldCByZXNvbHZlRm46IEZ1bmN0aW9uID0gbm9vcDtcbiAgICAgICAgY29uc3QgcHJvcHNJbml0UHJvbWlzZSA9IG5ldyBQcm9taXNlKHJlcyA9PiByZXNvbHZlRm4gPSByZXMpO1xuICAgICAgICBzdXBlcihpbmosIFdJREdFVF9DT05GSUcsIHByb3BzSW5pdFByb21pc2UpO1xuICAgICAgICB0aGlzLnByb3BzSW5pdFByb21pc2UgPSBwcm9wc0luaXRQcm9taXNlO1xuICAgICAgICB0aGlzLnByb21pc2VSZXNvbHZlckZuID0gcmVzb2x2ZUZuO1xuICAgICAgICBzdHlsZXIodGhpcy5uYXRpdmVFbGVtZW50LCB0aGlzLCBBUFBMWV9TVFlMRVNfVFlQRS5TSEVMTCk7XG4gICAgICAgIHRoaXMuY2RSZWYgPSBjZFJlZjtcbiAgICAgICAgdGhpcy5uZ1pvbmUgPSBuZ1pvbmU7XG4gICAgICAgIHRoaXMuZGF0ZVBpcGUgPSBkYXRlUGlwZTtcbiAgICAgICAgdGhpcy5zdGF0ZVBlcnNpc3RlbmNlID0gc3RhdGVQZXJzaXN0ZW5jZTtcbiAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZSA9IHBhZ2luYXRpb25TZXJ2aWNlO1xuICAgICAgICB0aGlzLl9wYWdlTG9hZCA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5iaW5kaXRlbWNsYXNzID0gYmluZGl0ZW1jbGFzcztcbiAgICAgICAgdGhpcy5iaW5kZGlzYWJsZWl0ZW0gPSBiaW5kZGlzYWJsZWl0ZW07XG4gICAgICAgIHRoaXMuYmluZGRhdGFzZXQgPSBiaW5kZGF0YXNldDtcbiAgICAgICAgdGhpcy5tb3VzZUVudGVyQ0IgPSBtb3VzZUVudGVyQ0I7XG4gICAgICAgIHRoaXMubW91c2VMZWF2ZUNCID0gbW91c2VMZWF2ZUNCO1xuICAgICAgICB0aGlzLmJpbmRkYXRhc291cmNlID0gYmluZGRhdGFzb3VyY2U7XG5cbiAgICAgICAgdGhpcy5hcHAgPSBhcHA7XG4gICAgICAgIHRoaXMuYXBwRGVmYXVsdHMgPSBhcHBEZWZhdWx0cztcbiAgICAgICAgdGhpcy52YXJpYWJsZUluZmxpZ2h0ID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9ICFiaW5kZGF0YXNldDtcbiAgICAgICAgdGhpcy50aXRsZUlkID0gJ3dtbGlzdC0nICsgZ2VuZXJhdGVHVUlkKCk7XG5cbiAgICAgICAgLy8gVXBkYXRlcyBwYWdpbmF0aW9uLCBmaWx0ZXIsIHNvcnQgZXRjIG9wdGlvbnMgZm9yIHNlcnZpY2UgYW5kIGNydWQgdmFyaWFibGVzXG4gICAgICAgIHRoaXMuX2xpc3RlbmVyRGVzdHJveWVycyA9IFtcbiAgICAgICAgICAgIHRoaXMuYXBwLnN1YnNjcmliZSgnY2hlY2stc3RhdGUtcGVyc2lzdGVuY2Utb3B0aW9ucycsIG9wdGlvbnMgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBkYXRhU291cmNlTmFtZSA9IF8uZ2V0KHRoaXMuZGF0YXNvdXJjZSwgJ25hbWUnKTtcbiAgICAgICAgICAgICAgICAvLyBpbiBQcmVmYWJzLCB0aGlzLmRhdGFzb3VyY2UgaXMgbm90IHJlc29sdmVkIGF0IHRoZSB0aW1lIG9mIHZhcmlhYmxlIGludm9jYXRpb24sIHNvIGFkZGl0aW9uYWwgY2hlY2sgaXMgcmVxdWlyZWQuXG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhU291cmNlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRhU291cmNlTmFtZSA9IGV4dHJhY3REYXRhU291cmNlTmFtZSh0aGlzLmJpbmRkYXRhc291cmNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF8uZ2V0KG9wdGlvbnMsICd2YXJpYWJsZS5uYW1lJykgIT09IGRhdGFTb3VyY2VOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdGF0ZVBhcmFtcyhvcHRpb25zKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLy8gU2hvdyBsb2FkaW5nIHN0YXR1cyBiYXNlZCBvbiB0aGUgdmFyaWFibGUgbGlmZSBjeWNsZVxuICAgICAgICAgICAgdGhpcy5hcHAuc3Vic2NyaWJlKCd0b2dnbGUtdmFyaWFibGUtc3RhdGUnLCB0aGlzLmhhbmRsZUxvYWRpbmcuYmluZCh0aGlzKSksXG4gICAgICAgICAgICB0aGlzLmFwcC5zdWJzY3JpYmUoJ3NldHVwLWN1ZC1saXN0ZW5lcicsIHBhcmFtID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnbmFtZScpICE9PSBwYXJhbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2lzRGVwZW5kZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDb25maWd1cmVkU3RhdGUoKSB7XG4gICAgICAgIGNvbnN0IG1vZGUgPSB0aGlzLnN0YXRlUGVyc2lzdGVuY2UuY29tcHV0ZU1vZGUodGhpcy5zdGF0ZWhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gbW9kZSAmJiBtb2RlLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVTdGF0ZVBhcmFtcyhvcHRpb25zKSB7XG4gICAgICAgIGlmICh0aGlzLl9wYWdlTG9hZCAmJiB0aGlzLmdldENvbmZpZ3VyZWRTdGF0ZSgpICE9PSAnbm9uZScpIHtcbiAgICAgICAgICAgIHRoaXMuX3BhZ2VMb2FkID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCB3aWRnZXRTdGF0ZSA9IHRoaXMuc3RhdGVQZXJzaXN0ZW5jZS5nZXRXaWRnZXRTdGF0ZSh0aGlzKTtcbiAgICAgICAgICAgIGlmIChfLmdldCh3aWRnZXRTdGF0ZSwgJ3BhZ2luYXRpb24nKSkge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMub3B0aW9ucyA9IG9wdGlvbnMub3B0aW9ucyB8fCB7fTtcbiAgICAgICAgICAgICAgICBvcHRpb25zLm9wdGlvbnMucGFnZSA9IHdpZGdldFN0YXRlLnBhZ2luYXRpb247XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXy5nZXQod2lkZ2V0U3RhdGUsICdzZWxlY3RlZEl0ZW0nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkSXRlbXNFeGlzdCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRyaWdnZXJXTUV2ZW50KGV2ZW50TmFtZSwgaXRlbT8pIHtcbiAgICAgICAgJGludm9rZVdhdGNoZXJzKHRydWUpO1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIG11bHRpc2VsZWN0IGZvciB0aGUgbGl2ZWxpc3QoTGlzdCB3aXRoIGZvcm0gdGVtcGxhdGUpLCBpbiBydW4gbW9kZSBkZWxldGluZyBhIHJlY29yZCBpcyBnZXR0aW5nIGZhaWxlZC4gQmVjdWFzZSB0aGUgc2VsZWN0ZWRpdGVtIHdpbGwgYmUgYXJyYXkgb2Ygb2JqZWN0cy4gU28gY29uc2lkZXIgdGhlIGxhc3Qgb2JqZWN0LlxuICAgICAgICBsZXQgcm93ID0gdGhpcy5tdWx0aXNlbGVjdCA/IF8ubGFzdCh0aGlzLnNlbGVjdGVkaXRlbSkgOiB0aGlzLnNlbGVjdGVkaXRlbTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIHJvdyA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5hcHAubm90aWZ5KCd3bS1ldmVudCcsIHtldmVudE5hbWUsIHdpZGdldE5hbWU6IHRoaXMubmFtZSwgcm93OiByb3d9KTtcbiAgICB9XG5cbiAgICBjcmVhdGUoKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0RlcGVuZGVudCkge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyV01FdmVudCgnaW5zZXJ0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBlZGl0Um93KGl0ZW0/KSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0RlcGVuZGVudCkge1xuICAgICAgICAgICAgbGV0IGxpc3RJdGVtO1xuICAgICAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBsaXN0SXRlbSA9IHRoaXMuZ2V0SXRlbVJlZkJ5SW5kZXhPck1vZGVsKGl0ZW0pLml0ZW07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJXTUV2ZW50KCd1cGRhdGUnLCBsaXN0SXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGUoaXRlbT8pIHtcbiAgICAgICAgdGhpcy5lZGl0Um93KGl0ZW0pO1xuICAgIH1cblxuICAgIGRlbGV0ZVJvdyhpdGVtPykge1xuICAgICAgICBpZiAodGhpcy5faXNEZXBlbmRlbnQpIHtcbiAgICAgICAgICAgIGxldCBsaXN0SXRlbTtcbiAgICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAgICAgbGlzdEl0ZW0gPSB0aGlzLmdldEl0ZW1SZWZCeUluZGV4T3JNb2RlbChpdGVtKS5pdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyV01FdmVudCgnZGVsZXRlJywgbGlzdEl0ZW0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZGVsZXRlKGl0ZW0/KSB7XG4gICAgICAgIHRoaXMuZGVsZXRlUm93KGl0ZW0pO1xuICAgIH1cbiAgICBoYW5kbGVMb2FkaW5nKGRhdGEpIHtcbiAgICAgICAgY29uc3QgZGF0YVNvdXJjZSA9IHRoaXMuZGF0YXNvdXJjZTtcbiAgICAgICAgaWYgKGRhdGFTb3VyY2UgJiYgZGF0YVNvdXJjZS5leGVjdXRlKERhdGFTb3VyY2UuT3BlcmF0aW9uLklTX0FQSV9BV0FSRSkgJiYgaXNEYXRhU291cmNlRXF1YWwoZGF0YS52YXJpYWJsZSwgZGF0YVNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdGF0ZVBhcmFtcyhkYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLnZhcmlhYmxlSW5mbGlnaHQgPSBkYXRhLmFjdGl2ZTtcbiAgICAgICAgICAgICAgICAvLyBGaXggZm9yIFtXTVMtMjM3NzJdIFVwZGF0ZSBub2RhdGFmb3VuZCBmbGFnIG9uY2UgdGhlIHJlc3BvbnNlIGlzIHJlY2lldmVkIGZyb20gdGhlIHNlcnZlclxuICAgICAgICAgICAgICAgIGNvbnN0IHRvdGFsRWxlID0gZGF0YS5kYXRhPy5wYWdpbmF0aW9uPy50b3RhbEVsZW1lbnRzO1xuICAgICAgICAgICAgICAgIGlmICghXy5pc1VuZGVmaW5lZCh0b3RhbEVsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub0RhdGFGb3VuZCA9IHRvdGFsRWxlID09PSAwID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRvdGFsZWxlbWVudHMgaXMgdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9EYXRhRm91bmQgPSBfLmlzRW1wdHkoZGF0YS5kYXRhPy5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXROYXZpZ2F0aW9uKCkge1xuICAgICAgICB0aGlzLnNob3dOYXZpZ2F0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMubmF2Q29udHJvbHMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuaW5mU2Nyb2xsID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25EZW1hbmRMb2FkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVCYXNpY05hdmlnYXRpb24oKSB7XG4gICAgICAgIHRoaXMubmF2Q29udHJvbHMgPSBOQVZJR0FUSU9OX1RZUEUuQkFTSUM7XG4gICAgICAgIHRoaXMuc2hvd05hdmlnYXRpb24gPSB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlSW5saW5lTmF2aWdhdGlvbigpIHtcbiAgICAgICAgdGhpcy5uYXZDb250cm9scyA9IE5BVklHQVRJT05fVFlQRS5JTkxJTkU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmFibGVDbGFzc2ljTmF2aWdhdGlvbigpIHtcbiAgICAgICAgdGhpcy5uYXZDb250cm9scyA9IE5BVklHQVRJT05fVFlQRS5DTEFTU0lDO1xuICAgICAgICB0aGlzLnNob3dOYXZpZ2F0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuYWJsZVBhZ2VyTmF2aWdhdGlvbigpIHtcbiAgICAgICAgdGhpcy5uYXZDb250cm9scyA9IE5BVklHQVRJT05fVFlQRS5QQUdFUjtcbiAgICAgICAgdGhpcy5zaG93TmF2aWdhdGlvbiA9IHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXROYXZpZ2F0aW9uVHlwZU5vbmUoKSB7XG4gICAgICAgIHRoaXMubmF2Q29udHJvbHMgPSBOQVZJR0FUSU9OX1RZUEUuTk9ORTtcbiAgICAgICAgdGhpcy5zaG93TmF2aWdhdGlvbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZW5hYmxlSW5maW5pdGVTY3JvbGwoKSB7XG4gICAgICAgIHRoaXMuaW5mU2Nyb2xsID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVuYWJsZU9uRGVtYW5kTG9hZCgpIHtcbiAgICAgICAgdGhpcy5vbkRlbWFuZExvYWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNob3dOYXZpZ2F0aW9uID0gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIE5hdmlnYXRpb24gdHlwZSBmb3IgdGhlIGxpc3QuXG4gICAgICogQHBhcmFtIHR5cGVcbiAgICAgKi9cbiAgICBwcml2YXRlIG9uTmF2aWdhdGlvblR5cGVDaGFuZ2UodHlwZSkge1xuICAgICAgICB0aGlzLnJlc2V0TmF2aWdhdGlvbigpO1xuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgTkFWSUdBVElPTl9UWVBFLkJBU0lDOlxuICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlQmFzaWNOYXZpZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5BVklHQVRJT05fVFlQRS5JTkxJTkU6XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVJbmxpbmVOYXZpZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5BVklHQVRJT05fVFlQRS5BRFZBTkNFRDpcbiAgICAgICAgICAgIGNhc2UgTkFWSUdBVElPTl9UWVBFLkNMQVNTSUM6XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVDbGFzc2ljTmF2aWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQVZJR0FUSU9OX1RZUEUuUEFHRVI6XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVQYWdlck5hdmlnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgTkFWSUdBVElPTl9UWVBFLk5PTkUgOlxuICAgICAgICAgICAgICAgIHRoaXMuc2V0TmF2aWdhdGlvblR5cGVOb25lKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIE5BVklHQVRJT05fVFlQRS5TQ1JPTEw6XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVJbmZpbml0ZVNjcm9sbCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBOQVZJR0FUSU9OX1RZUEUuT05ERU1BTkQ6XG4gICAgICAgICAgICAgICAgdGhpcy5lbmFibGVPbkRlbWFuZExvYWQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBmaWVsZERlZnMgcHJvcGVydHksIGZpZWxkRGVmcyBpcyB0aGUgbW9kZWwgb2YgdGhlIExpc3QgQ29tcG9uZW50LlxuICAgICAqIGZpZWxkRGVmcyBpcyBhbiBBcnJheSB0eXBlLlxuICAgICAqIEBwYXJhbSBuZXdWYWxcbiAgICAgKi9cbiAgICBwcml2YXRlIHVwZGF0ZUZpZWxkRGVmcyhuZXdWYWw6IEFycmF5PGFueT4pIHtcbiAgICAgICAgaWYgKHRoaXMuaW5mU2Nyb2xsIHx8IHRoaXMub25EZW1hbmRMb2FkKSB7XG4gICAgICAgICAgICBbdGhpcy5maWVsZERlZnMsIHRoaXMuY3VycmVudFBhZ2VdID0gdGhpcy5wYWdpbmF0aW9uU2VydmljZS51cGRhdGVGaWVsZHNPblBhZ2luYXRpb24odGhpcywgbmV3VmFsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZmllbGREZWZzID0gbmV3VmFsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3JkZXJieSkge1xuICAgICAgICAgICAgdGhpcy5maWVsZERlZnMgPSBnZXRPcmRlcmVkRGF0YXNldCh0aGlzLmZpZWxkRGVmcywgdGhpcy5vcmRlcmJ5KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5ncm91cGJ5KSB7XG4gICAgICAgICAgICB0aGlzLmdyb3VwZWREYXRhID0gZ3JvdXBEYXRhKHRoaXMsIHRoaXMuZmllbGREZWZzLCB0aGlzLmdyb3VwYnksIHRoaXMubWF0Y2gsIHRoaXMub3JkZXJieSwgdGhpcy5kYXRlZm9ybWF0LCB0aGlzLmRhdGVQaXBlLCB1bmRlZmluZWQsIHRoaXMuYXBwRGVmYXVsdHMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmZpZWxkRGVmcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMubm9EYXRhRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZGl0ZW0gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgICAgICB0aGlzLmxpc3RJdGVtcy5zZXREaXJ0eSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25EYXRhQ2hhbmdlKG5ld1ZhbCkge1xuICAgICAgICAvLyBDaGVjayBmb3IgbmV3VmFsIGlzIG5vdCBlbXB0eVxuICAgICAgICBpZiAoIV8uaXNFbXB0eShuZXdWYWwpKSB7XG5cbiAgICAgICAgICAgIHRoaXMubm9EYXRhRm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuaXNEYXRhQ2hhbmdlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFzb3VyY2UgJiYgdGhpcy5kYXRhc291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uSVNfQVBJX0FXQVJFKSkge1xuICAgICAgICAgICAgICAgIC8vIGNsb25lIHRoZSB0aGUgZGF0YSBpbiBjYXNlIG9mIGxpdmUgYW5kIHNlcnZpY2UgdmFyaWFibGVzIHRvIHByZXZlbnQgdGhlIHR3by13YXkgYmluZGluZyBmb3IgdGhlc2UgdmFyaWFibGVzLlxuICAgICAgICAgICAgICAgIG5ld1ZhbCA9IF8uY2xvbmVEZWVwKG5ld1ZhbCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpc09iamVjdChuZXdWYWwpICYmICFfLmlzQXJyYXkobmV3VmFsKSkge1xuICAgICAgICAgICAgICAgIG5ld1ZhbCA9IF8uaXNFbXB0eShuZXdWYWwpID8gW10gOiBbbmV3VmFsXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKF8uaXNTdHJpbmcobmV3VmFsKSkge1xuICAgICAgICAgICAgICAgIG5ld1ZhbCA9IG5ld1ZhbC5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZiB0aGUgcGFnZSBudW1iZXIgaXMgZ3JlYXRlciB0aGFuIDEgb24gaW5pdGlhbCBsb2FkIHRoZW4gd2UgcmVuZGVyIHRoZSBmaXJzdCBwYWdlLlxuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YXNvdXJjZSAmJiB0aGlzLmRhdGFzb3VyY2Uub3duZXIgPT09ICdBcHAnICYmICh0aGlzLmluZlNjcm9sbCB8fCB0aGlzLm9uRGVtYW5kTG9hZCkgJiYgIXRoaXMuY3VycmVudFBhZ2UgJiYgdGhpcy5kYXRhc291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uR0VUX1BBR0lOR19PUFRJT05TKS5udW1iZXIgPiAwKSB7XG4gICAgICAgICAgICAgICAgbmV3VmFsID0gdGhpcy5kYXRhc291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uTElTVF9SRUNPUkRTLCB7XG4gICAgICAgICAgICAgICAgICdwYWdlJzogMVxuICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKF8uaXNBcnJheShuZXdWYWwpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5ld1ZhbC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdiZWZvcmVkYXRhcmVuZGVyJywgeyRkYXRhOiBuZXdWYWx9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWVsZERlZnMobmV3VmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRmllbGREZWZzKFtdKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZXMgdGhlIGRhdGFTb3VyY2Ugd2hlbiBwYWdpbmF0aW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBDb21wb25lbnQuXG4gICAgcHJpdmF0ZSBzZXR1cERhdGFTb3VyY2UoKSB7XG4gICAgICAgIGNvbnN0IGRhdGFOYXZpZ2F0b3IgPSB0aGlzLmRhdGFOYXZpZ2F0b3I7XG5cbiAgICAgICAgZGF0YU5hdmlnYXRvci5vcHRpb25zID0ge1xuICAgICAgICAgICAgbWF4UmVzdWx0czogdGhpcy5wYWdlc2l6ZSB8fCAyMFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuZGF0YU5hdmlnYXRvcldhdGNoZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmICh0aGlzLm5hdmlnYXRvclJlc3VsdFdhdGNoKSB7XG4gICAgICAgICAgICB0aGlzLm5hdmlnYXRvclJlc3VsdFdhdGNoLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLypSZWdpc3RlciBhIHdhdGNoIG9uIHRoZSBcInJlc3VsdFwiIHByb3BlcnR5IG9mIHRoZSBcImRhdGFOYXZpZ2F0b3JcIiBzbyB0aGF0IHRoZSBwYWdpbmF0ZWQgZGF0YSBpcyBkaXNwbGF5ZWQgaW4gdGhlIGxpdmUtbGlzdC4qL1xuICAgICAgICB0aGlzLm5hdmlnYXRvclJlc3VsdFdhdGNoID0gZGF0YU5hdmlnYXRvci5yZXN1bHRFbWl0dGVyLnN1YnNjcmliZSgobmV3VmFsOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhQ2hhbmdlKG5ld1ZhbCk7XG4gICAgICAgIH0sIHRydWUpO1xuICAgICAgICAvKkRlLXJlZ2lzdGVyIHRoZSB3YXRjaCBpZiBpdCBpcyBleGlzdHMgKi9cbiAgICAgICAgaWYgKHRoaXMubmF2aWdhdG9yTWF4UmVzdWx0V2F0Y2gpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdG9yTWF4UmVzdWx0V2F0Y2gudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICAvKlJlZ2lzdGVyIGEgd2F0Y2ggb24gdGhlIFwibWF4UmVzdWx0c1wiIHByb3BlcnR5IG9mIHRoZSBcImRhdGFOYXZpZ2F0b3JcIiBzbyB0aGF0IHRoZSBcInBhZ2VTaXplXCIgaXMgZGlzcGxheWVkIGluIHRoZSBsaXZlLWxpc3QuKi9cbiAgICAgICAgdGhpcy5uYXZpZ2F0b3JNYXhSZXN1bHRXYXRjaCA9IGRhdGFOYXZpZ2F0b3IubWF4UmVzdWx0c0VtaXR0ZXIuc3Vic2NyaWJlKCh2YWwpID0+IHtcbiAgICAgICAgICAgIHRoaXMucGFnZXNpemUgPSB2YWw7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGRhdGFOYXZpZ2F0b3IubWF4UmVzdWx0cyA9IHRoaXMucGFnZXNpemUgfHwgMjA7XG4gICAgICAgIHRoaXMucmVtb3ZlUHJvcGVydHlCaW5kaW5nKCdkYXRhc2V0Jyk7XG4gICAgICAgIC8vIHdoZW4gbGlzdCBoYXZpbmcgXCJkYXRhc2V0Ym91bmRleHByXCIgYXR0ciBpbmRpY2F0ZXMgdGhhdCBsaXN0IGlzIGJvdW5kIHRvIGl0ZW0gY29udGV4dFxuICAgICAgICAvLyB3aGVuIGRhdGFzZXQgaXMgYm91bmQgdG8gXCJpdGVtLkZJRUxEXCIgdGhlbiBpdGVtIGNvbnRleHQgaXMgcGFzc2VkIGFzIHRoZSBkYXRhc291cmNlLlxuICAgICAgICBjb25zdCBkYXRhc2V0Qm91bmRFeHByID0gdGhpcy5nZXRBdHRyKCdkYXRhc2V0Ym91bmRleHByJyk7XG4gICAgICAgIHRoaXMuZGF0YU5hdmlnYXRvci5zZXRCaW5kRGF0YVNldChcbiAgICAgICAgICAgIHRoaXMuYmluZGRhdGFzZXQsXG4gICAgICAgICAgICB0aGlzLnZpZXdQYXJlbnQsXG4gICAgICAgICAgICBkYXRhc2V0Qm91bmRFeHByID8gdGhpcy5jb250ZXh0IDogdGhpcy5kYXRhc291cmNlLFxuICAgICAgICAgICAgdGhpcy5kYXRhc2V0LFxuICAgICAgICAgICAgdGhpcy5iaW5kZGF0YXNvdXJjZSxcbiAgICAgICAgICAgIGRhdGFzZXRCb3VuZEV4cHIsXG4gICAgICAgICAgICB0aGlzLnN0YXRlaGFuZGxlclxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25EYXRhU2V0Q2hhbmdlKG5ld1ZhbCkge1xuICAgICAgICBpZiAoXy5nZXQodGhpcy5kYXRhc291cmNlLCAnY2F0ZWdvcnknKSA9PT0gJ3dtLlZhcmlhYmxlJyAmJiB0aGlzLmdldENvbmZpZ3VyZWRTdGF0ZSgpICE9PSAnbm9uZScgJiYgdGhpcy5fcGFnZUxvYWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZGdldFN0YXRlID0gdGhpcy5zdGF0ZVBlcnNpc3RlbmNlLmdldFdpZGdldFN0YXRlKHRoaXMpO1xuICAgICAgICAgICAgdGhpcy5fcGFnZUxvYWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChfLmdldCh3aWRnZXRTdGF0ZSwgJ3BhZ2luYXRpb24nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YU5hdmlnYXRvci5wYWdlQ2hhbmdlZCh7cGFnZTogd2lkZ2V0U3RhdGUucGFnaW5hdGlvbn0sIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKF8uZ2V0KHdpZGdldFN0YXRlLCAnc2VsZWN0ZWRJdGVtJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEl0ZW1zRXhpc3QgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5kYXRhTmF2aWdhdG9yV2F0Y2hlZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubmF2aWdhdGlvbiAmJiB0aGlzLm5hdmlnYXRpb24gIT09IE5BVklHQVRJT05fVFlQRS5OT05FKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXR1cERhdGFTb3VyY2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkRhdGFDaGFuZ2UobmV3VmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5hdmlnYXRpb24gJiYgdGhpcy5uYXZpZ2F0aW9uICE9PSBOQVZJR0FUSU9OX1RZUEUuTk9ORSkge1xuICAgICAgICAgICAgLy8gSWYgbmF2aWdhdGlvbiBpcyBhbHJlYWR5IHNldHVwIGFuZCBkYXRhc291cmNlIGlzIGNoYW5nZWQsIHVwZGF0ZSB0aGUgZGF0YXNvdXJjZSBvbiBuYXZpZ2F0aW9uXG4gICAgICAgICAgICB0aGlzLmRhdGFOYXZpZ2F0b3Iuc2V0RGF0YVNvdXJjZSh0aGlzLmRhdGFzb3VyY2UpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWxsIHRoZSBMaXN0SXRlbSdzIEFjdGl2ZSBzdGF0ZSBpcyBzZXQgdG8gZmFsc2UuXG4gICAgcHJpdmF0ZSBkZXNlbGVjdExpc3RJdGVtcygpIHtcbiAgICAgICAgdGhpcy5saXN0SXRlbXMuZm9yRWFjaChpdGVtID0+IGl0ZW0uaXNBY3RpdmUgPSBmYWxzZSk7XG4gICAgfVxuXG4gICAgLy8gRGVzZWxlY3QgYWxsIHRoZSBMaXN0SXRlbXMgYW5kIGNsZWFyIHRoZSBzZWxlY3RlZGl0ZW0oSW5PdXRCb3VuZCBQcm9wZXJ0eSBtb2RlbClcbiAgICBwcml2YXRlIGNsZWFyU2VsZWN0ZWRJdGVtcygpIHtcbiAgICAgICAgdGhpcy5kZXNlbGVjdExpc3RJdGVtcygpO1xuICAgICAgICB0aGlzLl9pdGVtcy5sZW5ndGggPSAwO1xuICAgICAgICAkYXBwRGlnZXN0KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSBMaXN0SXRlbURpcmVjdGl2ZSBpbnN0YW5jZSBieSBjaGVja2luZyB0aGUgZXF1YWxpdHkgb2YgdGhlIG1vZGVsLlxuICAgICAqIEBwYXJhbSBsaXN0TW9kZWw6IG1vZGVsIHRvIGJlIHNlYXJjaGVkIGZvclxuICAgICAqIEByZXR1cm5zIExpc3RJdGVtIGlmIHRoZSBtb2RlbCBpcyBtYXRjaGVkIGVsc2UgcmV0dXJuIG51bGwuXG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRMaXN0SXRlbUJ5TW9kZWwobGlzdE1vZGVsKTogTGlzdEl0ZW1EaXJlY3RpdmUge1xuICAgICAgICByZXR1cm4gdGhpcy5saXN0SXRlbXMuZmluZCgobGlzdEl0ZW0pID0+IHtcbiAgICAgICAgICAgIGxldCBpdGVtT2JqID0gbGlzdEl0ZW0uaXRlbTtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwYnkgJiYgIV8uaGFzKGxpc3RNb2RlbCwgJ19ncm91cEluZGV4JykpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBncm91cGJ5IGlzIGVuYWJsZWQsIGl0ZW0gY29udGFpbnMgX2dyb3VwSW5kZXggcHJvcGVydHkgd2hpY2ggc2hvdWxkIGJlIGV4Y2x1ZGVkIHdoaWxlIGNvbXBhcmluZyBtb2RlbC5cbiAgICAgICAgICAgICAgICBpdGVtT2JqID0gXy5jbG9uZShpdGVtT2JqKTtcbiAgICAgICAgICAgICAgICBkZWxldGUgaXRlbU9iai5fZ3JvdXBJbmRleDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfLmlzRXF1YWwoaXRlbU9iaiwgbGlzdE1vZGVsKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSB8fCBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlU2VsZWN0ZWRJdGVtc1dpZGdldHMoc3RhdGVQZXJzaXN0ZW5jZVRyaWdnZXJlZD8pIHtcbiAgICAgICAgbGV0IG9iaiA9IHt9LCB3aWRnZXRTdGF0ZTtcbiAgICAgICAgY29uc3QgcGFnZU51bSA9IF8uZ2V0KHRoaXMuZGF0YU5hdmlnYXRvciwgJ2RuLmN1cnJlbnRQYWdlJykgfHwgMTtcbiAgICAgICAgaWYgKHRoaXMuZ2V0Q29uZmlndXJlZFN0YXRlKCkgIT09ICdub25lJykge1xuICAgICAgICAgICAgLy8gcmVtb3ZlIHByZXZpb3VzbHkgY29uZmlndXJlZCBzZWxlY3RlZCBpdGVtcyBmb3IgY3VycmVudCBwYWdlIGFuZCBjb25zdHJ1Y3QgbmV3IG9uZXMgbGF0ZXIgYmVsb3cuXG4gICAgICAgICAgICB3aWRnZXRTdGF0ZSA9IHRoaXMuc3RhdGVQZXJzaXN0ZW5jZS5nZXRXaWRnZXRTdGF0ZSh0aGlzKSB8fCB7fTtcbiAgICAgICAgICAgIGlmIChfLmdldCh3aWRnZXRTdGF0ZSwgJ3NlbGVjdGVkSXRlbScpKSB7XG4gICAgICAgICAgICAgICAgLy8gd2hlbiBtdWx0aXNlbGVjdCBpcyBvbiBhbmQgYW4gaXRlbSBpcyBzZWxlY3RlZCB3aXRob3V0IHByZXNzaW5nIENUUkwsIHByZXZpb3VzbHkgc2VsZWN0ZWQgaXRlbXMgaW4gc3RhdGUgc2hvdWxkIGJlIGVtcHR5LlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm11bHRpc2VsZWN0ICYmIHRoaXMuc2VsZWN0ZWRpdGVtLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICB3aWRnZXRTdGF0ZS5zZWxlY3RlZEl0ZW0gPSBbXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfLnJlbW92ZSh3aWRnZXRTdGF0ZS5zZWxlY3RlZEl0ZW0sIGZ1bmN0aW9uKHNlbGVjdGVkSXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSXRlbS5wYWdlID09PSBwYWdlTnVtO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICh0aGlzLnNlbGVjdGVkSXRlbVdpZGdldHMgYXMgQXJyYXk8V2lkZ2V0UmVmPikubGVuZ3RoID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxpc3RJdGVtcy5mb3JFYWNoKChpdGVtOiBMaXN0SXRlbURpcmVjdGl2ZSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGlmIChpdGVtLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuc2VsZWN0ZWRJdGVtV2lkZ2V0cyBhcyBBcnJheTxXaWRnZXRSZWY+KS5wdXNoKGl0ZW0uY3VycmVudEl0ZW1XaWRnZXRzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbVdpZGdldHMgPSBpdGVtLmN1cnJlbnRJdGVtV2lkZ2V0cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2JqID0ge3BhZ2U6IHBhZ2VOdW0sIGluZGV4OiBpbmRleH07XG4gICAgICAgICAgICAgICAgaWYgKF8uZ2V0KHdpZGdldFN0YXRlLCAnc2VsZWN0ZWRJdGVtJykgICYmIHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFfLnNvbWUod2lkZ2V0U3RhdGUuc2VsZWN0ZWRJdGVtLCBvYmopKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWRnZXRTdGF0ZS5zZWxlY3RlZEl0ZW0ucHVzaChvYmopO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkZ2V0U3RhdGUuc2VsZWN0ZWRJdGVtID0gW29ial07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHRoaXMuZ2V0Q29uZmlndXJlZFN0YXRlKCkgIT09ICdub25lJyAmJiAhc3RhdGVQZXJzaXN0ZW5jZVRyaWdnZXJlZCkge1xuICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkU3RhdGVQZXJzaXN0ZW5jZVR5cGVzLmluZGV4T2YodGhpcy5uYXZpZ2F0aW9uKSA8IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlUGVyc2lzdGVuY2UucmVtb3ZlV2lkZ2V0U3RhdGUodGhpcywgJ3NlbGVjdGVkSXRlbScpO1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVQZXJzaXN0ZW5jZS5zZXRXaWRnZXRTdGF0ZSh0aGlzLCB7J3NlbGVjdGVkSXRlbSc6IHdpZGdldFN0YXRlLnNlbGVjdGVkSXRlbX0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ1JldGFpbiBTdGF0ZSBoYW5kbGluZyBvbiBXaWRnZXQgJyArIHRoaXMubmFtZSArICcgaXMgbm90IHN1cHBvcnRlZCBmb3IgY3VycmVudCBwYWdpbmF0aW9uIHR5cGUuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWxlY3RzIHRoZSBsaXN0SXRlbSBhbmQgdXBkYXRlcyBzZWxlY3RlZGl0ZW0gcHJvcGVydHkuXG4gICAgICogSWYgdGhlIGxpc3RJdGVtIGlzIGFscmVhZHkgYSBzZWxlY3RlZCBpdGVtIHRoZW4gZGVzZWxlY3RzIHRoZSBpdGVtLlxuICAgICAqIEBwYXJhbSB7TGlzdEl0ZW1EaXJlY3RpdmV9ICRsaXN0SXRlbTogSXRlbSB0byBiZSBzZWxlY3RlZCBvZiBkZXNlbGVjdGVkLlxuICAgICAqL1xuICAgIHByaXZhdGUgdG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24oJGxpc3RJdGVtOiBMaXN0SXRlbURpcmVjdGl2ZSwgc3RhdGVQZXJzaXN0ZW5jZVRyaWdnZXJlZD8pIHtcbiAgICAgICAgLy8gaXRlbSBpcyBub3QgYWxsb3dlZCB0byBnZXQgc2VsZWN0ZWQgaWYgaXQgaXMgZGlzYWJsZWQuXG4gICAgICAgIGlmICgkbGlzdEl0ZW0gJiYgISRsaXN0SXRlbS5kaXNhYmxlSXRlbSkge1xuICAgICAgICAgICAgbGV0IGl0ZW0gPSAkbGlzdEl0ZW0uaXRlbTtcbiAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwYnkgJiYgXy5oYXMoaXRlbSwgJ19ncm91cEluZGV4JykpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBncm91cGJ5IGlzIGVuYWJsZWQsIGl0ZW0gY29udGFpbnMgX2dyb3VwSW5kZXggcHJvcGVydHkgd2hpY2ggc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gc2VsZWN0ZWRpdGVtLlxuICAgICAgICAgICAgICAgIGl0ZW0gPSBfLmNsb25lKGl0ZW0pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBpdGVtLl9ncm91cEluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCRsaXN0SXRlbS5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1zID0gXy5wdWxsQWxsV2l0aCh0aGlzLl9pdGVtcywgW2l0ZW1dLCBfLmlzRXF1YWwpO1xuICAgICAgICAgICAgICAgICRsaXN0SXRlbS5pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBtdWx0aXNlbGVjdCBpcyBmYWxzZSwgY2xlYXIgdGhlIHNlbGVjdEl0ZW0gbGlzdCBiZWZvcmUgYWRkaW5nIGFuIGl0ZW0gdG8gdGhlIHNlbGVjdEl0ZW0gbGlzdC5cbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGVkSXRlbXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5faXRlbXMucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdCcsIHt3aWRnZXQ6ICRsaXN0SXRlbSwgJGRhdGE6IGl0ZW19KTtcbiAgICAgICAgICAgICAgICAkbGlzdEl0ZW0uaXNBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy51cGRhdGVTZWxlY3RlZEl0ZW1zV2lkZ2V0cyhzdGF0ZVBlcnNpc3RlbmNlVHJpZ2dlcmVkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1ldGhvZCBpcyBJbnZva2VkIHdoZW4gdGhlIG1vZGVsIGZvciB0aGUgTGlzdCBXaWRnZXQgaXMgY2hhbmdlZC5cbiAgICAgKiBAcGFyYW0ge1F1ZXJ5TGlzdDxMaXN0SXRlbURpcmVjdGl2ZT59IGxpc3RJdGVtc1xuICAgICAqL1xuICAgIHByaXZhdGUgb25MaXN0UmVuZGVyKGxpc3RJdGVtczogUXVlcnlMaXN0PExpc3RJdGVtRGlyZWN0aXZlPikge1xuICAgICAgICAvLyBBZGRlZCByZW5kZXIgY2FsbGJhY2sgZXZlbnQuIFRoaXMgbWV0aG9kKG9uTGlzdFJlbmRlcikgaXMgY2FsbGluZyBtdWx0aXBsZSB0aW1lcyBzbyBjaGVja2luZyBpc0RhdGFjaGFuZ2VkIGZsYWcgYmVjYXVzZSB0aGlzIGZhbGcgaXMgY2hhbmdlZCB3aGVuZXZlciBuZXcgZGF0YSBpcyByZW5kZXJlZC5cbiAgICAgICAgaWYgKHRoaXMuaXNEYXRhQ2hhbmdlZCkge1xuICAgICAgICAgICAgLy8gV2hlbmV2ZXIgZGF0YXNldCBpcyBjaGFuZ2VkLCB0cmlnZ2VyIHdhdGNoZXJzIHRvIGV2YWx1YXRlIGxpc3RpdGVtIGJpbmQgZXhwcmVzc2lvbnMuXG4gICAgICAgICAgICAkaW52b2tlV2F0Y2hlcnModHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3JlbmRlcicsIHskZGF0YTogdGhpcy5maWVsZERlZnN9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5pc0RhdGFDaGFuZ2VkICYmIHRoaXMuZ2V0Q29uZmlndXJlZFN0YXRlKCkgIT09ICdub25lJyAmJiBsaXN0SXRlbXMubGVuZ3RoICYmIHRoaXMuX3NlbGVjdGVkSXRlbXNFeGlzdCkge1xuICAgICAgICAgICAgY29uc3Qgd2lkZ2V0U3RhdGUgPSB0aGlzLnN0YXRlUGVyc2lzdGVuY2UuZ2V0V2lkZ2V0U3RhdGUodGhpcyk7XG4gICAgICAgICAgICBpZiAoXy5nZXQod2lkZ2V0U3RhdGUsICdzZWxlY3RlZEl0ZW0nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkSXRlbXNFeGlzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXNMZW5ndGggPSBfLmlzQXJyYXkodGhpcy5zZWxlY3RlZGl0ZW0pID8gdGhpcy5zZWxlY3RlZGl0ZW0ubGVuZ3RoIDogXy50b051bWJlcighXy5pc0VtcHR5KHRoaXMuc2VsZWN0ZWRpdGVtKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBhZ2UgPSBfLmdldCh0aGlzLmRhdGFOYXZpZ2F0b3IsICdkbi5jdXJyZW50UGFnZScpIHx8IDE7XG4gICAgICAgICAgICAgICAgd2lkZ2V0U3RhdGUucGFnaW5hdGlvbiA9IHdpZGdldFN0YXRlLnBhZ2luYXRpb24gfHwgMTtcbiAgICAgICAgICAgICAgICAvLyB0byBwcmV2ZW50IGl0ZW0gc2VsZWN0aW9uIGZyb20gYmVpbmcgdHJpZ2dlcmVkIG1vcmUgdGhhbiBvbmNlXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkSXRlbXNMZW5ndGggIT09IHdpZGdldFN0YXRlLnNlbGVjdGVkSXRlbS5sZW5ndGggJiYgd2lkZ2V0U3RhdGUucGFnaW5hdGlvbiA9PT0gY3VycmVudFBhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgd2lkZ2V0U3RhdGUuc2VsZWN0ZWRJdGVtLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnBhZ2UgPT09IGN1cnJlbnRQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKGl0ZW0uaW5kZXgsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtcyA9IF8uaXNBcnJheSh0aGlzLnNlbGVjdGVkaXRlbSkgPyB0aGlzLnNlbGVjdGVkaXRlbSA6IFt0aGlzLnNlbGVjdGVkaXRlbV07XG5cbiAgICAgICAgdGhpcy5maXJzdFNlbGVjdGVkSXRlbSA9IHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9IG51bGw7XG5cbiAgICAgICAgLy8gZG9uJ3Qgc2VsZWN0IGZpcnN0IGl0ZW0gaWYgbXVsdGktc2VsZWN0IGlzIGVuYWJsZWQgYW5kIGF0IGxlYXN0IGl0ZW0gaXMgYWxyZWFkeSBzZWxlY3RlZCBpbiB0aGUgbGlzdC5cbiAgICAgICAgLy8gZG9uJ3Qgc2VsZWN0IGZpcnN0IGl0ZW0gaWYgc3RhdGUgaW5mb3JtYXRpb24gaGFzIHNlbGVjdGVkIGl0ZW1zXG4gICAgICAgIGlmIChsaXN0SXRlbXMubGVuZ3RoICYmIHRoaXMuc2VsZWN0Zmlyc3RpdGVtICYmICEoIHRoaXMuX2l0ZW1zLmxlbmd0aCAmJiB0aGlzLm11bHRpc2VsZWN0KSAmJiB0aGlzLl9zZWxlY3RlZEl0ZW1zRXhpc3QgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb25zdCAkZmlyc3RJdGVtOiBMaXN0SXRlbURpcmVjdGl2ZSA9IGxpc3RJdGVtcy5maXJzdDtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICEkZmlyc3RJdGVtLmRpc2FibGVJdGVtICYmXG4gICAgICAgICAgICAgICAgdGhpcy5pc0RhdGFDaGFuZ2VkICYmXG4gICAgICAgICAgICAgICAgLy8gXCJpbmZpbml0ZSBzY3JvbGxcIiBvciBcImxvYWQgb24gZGVtYW5kXCIgaXMgZW5hYmxlZCBhbmQgYXQgbGVhc3Qgb25lIGl0ZW0gaXMgc2VsZWN0ZWQgdGhlbiBkb250IGFsdGVyIHRoZSBzZWxlY3RlZCBsaXN0IGl0ZW1zLlxuICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmluZlNjcm9sbCB8fCB0aGlzLm9uRGVtYW5kTG9hZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXRlbXMubGVuZ3RoXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGVkSXRlbXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcnN0U2VsZWN0ZWRJdGVtID0gdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gJGZpcnN0SXRlbTtcbiAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcgdGhlIGZpcnN0IHJlY29yZFxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbSgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZGVzZWxlY3RMaXN0SXRlbXMoKTtcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMuZm9yRWFjaChzZWxlY3RlZGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RJdGVtOiBMaXN0SXRlbURpcmVjdGl2ZSA9IHRoaXMuZ2V0TGlzdEl0ZW1CeU1vZGVsKHNlbGVjdGVkaXRlbSk7XG4gICAgICAgICAgICAgICAgaWYgKGxpc3RJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3RJdGVtLmlzQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gbGlzdEl0ZW07XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvY3VzIHRoZSBhY3RpdmUgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBsaXN0SXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5maWVsZERlZnMubGVuZ3RoICYmIHRoaXMuaW5mU2Nyb2xsKSB7XG4gICAgICAgICAgICBjb25zdCBzbW9vdGhTY3JvbGxFbCA9IHRoaXMuJGVsZW1lbnQuY2xvc2VzdCgnW3dtc21vb3Roc2Nyb2xsXScpO1xuICAgICAgICAgICAgLy8gaWYgc21vb3Roc2Nyb2xsIGlzIHNldCB0byBmYWxzZSwgdGhlbiBuYXRpdmUgc2Nyb2xsIGhhcyB0byBiZSBhcHBsaWVkXG4gICAgICAgICAgICAvLyBvdGhlcndpc2Ugc21vb3Roc2Nyb2xsIGV2ZW50cyB3aWxsIGJlIGJpbmRlZC5cbiAgICAgICAgICAgIGlmIChpc01vYmlsZUFwcCgpICYmIHNtb290aFNjcm9sbEVsLmxlbmd0aCAmJiBzbW9vdGhTY3JvbGxFbC5hdHRyKCd3bXNtb290aHNjcm9sbCcpID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25TZXJ2aWNlLmJpbmRJU2Nyb2xsRXZ0KHRoaXMsIERFQk9VTkNFX1RJTUVTLlBBR0lOQVRJT05fREVCT1VOQ0VfVElNRSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgbW9iaWxlIGFwcCB3aGVuIG1vZGFsIGV4aXN0cywgYW5kIGxpc3QgaXRlbXMgaGVpZ2h0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbW9kYWwgY29udGVudCBwcm92aWRlIGNjb250YWluZXIgYSBzY3JvbGxhYmxlIGhlaWdodFxuICAgICAgICAgICAgICAgIGNvbnN0IG1vZGFsQm9keSA9IHRoaXMuJGVsZW1lbnQuY2xvc2VzdCgnLm1vZGFsLWJvZHknKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsaXN0SHQgPSB0aGlzLiRlbGVtZW50LmZpbmQoJ3VsJykuaGVpZ2h0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbW9kYWxIdCA9IHdpbmRvdy5pbm5lckhlaWdodCAtIDE0MDtcbiAgICAgICAgICAgICAgICBpZiAoaXNNb2JpbGUoKSAmJiBtb2RhbEJvZHkubGVuZ3RoICYmIGxpc3RIdCA+IG1vZGFsSHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5jc3MoJ2hlaWdodCcsIG1vZGFsSHQgKyAncHgnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0aW9uU2VydmljZS5iaW5kU2Nyb2xsRXZ0KHRoaXMsICc+IHVsJywgREVCT1VOQ0VfVElNRVMuUEFHSU5BVElPTl9ERUJPVU5DRV9USU1FKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaXNEYXRhQ2hhbmdlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmlnZ2VyTGlzdEl0ZW1TZWxlY3Rpb24oJGVsOiBKUXVlcnk8SFRNTEVsZW1lbnQ+LCAkZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGlmICgkZWwgJiYgJGVsWzBdKSB7XG4gICAgICAgICAgICBjb25zdCBsaXN0SXRlbUNvbnRleHQgPSAkZWwuZGF0YSgnbGlzdEl0ZW1Db250ZXh0Jyk7XG4gICAgICAgICAgICAvLyBUcmlnZ2VyIGNsaWNrIGV2ZW50IG9ubHkgaWYgdGhlIGxpc3QgaXRlbSBpcyBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIGxpc3QuXG4gICAgICAgICAgICBpZiAobGlzdEl0ZW1Db250ZXh0Lmxpc3RDb21wb25lbnQgPT09IHRoaXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uSXRlbUNsaWNrKCRldmVudCwgbGlzdEl0ZW1Db250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBIYW5kbGVycygpIHtcbiAgICAgICAgdGhpcy5saXN0SXRlbXMuY2hhbmdlcy5zdWJzY3JpYmUoIGxpc3RJdGVtcyA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uTGlzdFJlbmRlcihsaXN0SXRlbXMpO1xuICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBoYW5kbGUgY2xpY2sgZXZlbnQgaW4gY2FwdHVyaW5nIHBoYXNlLlxuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndWwuYXBwLWxpdmVsaXN0LWNvbnRhaW5lcicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCRldmVudCkgPT4ge1xuICAgICAgICAgICAgbGV0IHRhcmdldCA9ICQoJGV2ZW50LnRhcmdldCkuY2xvc2VzdCgnLmFwcC1saXN0LWl0ZW0nKTtcbiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZpbmQgdGhlIGN1cnJlbnQgbGlzdCBpdGVtXG4gICAgICAgICAgICB3aGlsZSAodGFyZ2V0LmdldCgwKSAmJiAodGFyZ2V0LmNsb3Nlc3QoJ3VsLmFwcC1saXZlbGlzdC1jb250YWluZXInKS5nZXQoMCkgIT09ICRldmVudC5jdXJyZW50VGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXJlbnQoKS5jbG9zZXN0KCcuYXBwLWxpc3QtaXRlbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyTGlzdEl0ZW1TZWxlY3Rpb24odGFyZ2V0LCAkZXZlbnQpO1xuICAgICAgICB9LCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VycyBvbiBkcmFnIHN0YXJ0IHdoaWxlIHJlb3JkZXJpbmcuXG4gICAgcHJpdmF0ZSBvblJlb3JkZXJTdGFydChldnQsIHVpKSB7XG4gICAgICAgIHVpLnBsYWNlaG9sZGVyLmhlaWdodCh1aS5pdGVtLmhlaWdodCgpKTtcbiAgICAgICAgdGhpcy4kdWxFbGUuZGF0YSgnb2xkSW5kZXgnLCB1aS5pdGVtLmluZGV4KCkpO1xuICAgIH1cblxuICAgIC8vIFRyaWdnZXJzIGR1cmluZyBzb3J0aW5nXG4gICAgcHJpdmF0ZSBvblNvcnQoZXZ0LCB1aSkge1xuICAgICAgICAvLyBJbiBjYXNlIG9mIGluZmluaXRlIHNjcm9sbCwgd2hlbiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgc2Nyb2xsIGVuYWJsZWRcbiAgICAgICAgLy8gb24gZHJhZ2dpbmcgdGhlIGVsZW1lbnQgdG8gbGFzdCBpdGVtJ3MgcG9zaXRpb24gbWFudWFsbHkgdHJpZ2dlciBsb2FkaW5nIG9mIG5leHQgaXRlbXNcbiAgICAgICAgaWYgKHRoaXMuaW5mU2Nyb2xsKSB7XG4gICAgICAgICAgICBjb25zdCBsYXN0SXRlbU9mZnNldCA9IHRoaXMuJHVsRWxlLmZpbmQoYFtsaXN0aXRlbWluZGV4PSR7dGhpcy5maWVsZERlZnMubGVuZ3RoIC0gMX1dYCkub2Zmc2V0KCk7XG4gICAgICAgICAgICBpZiAobGFzdEl0ZW1PZmZzZXQgJiYgbGFzdEl0ZW1PZmZzZXQudG9wIDwgdWkub2Zmc2V0LnRvcCkge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvblNlcnZpY2UuYmluZFNjcm9sbEV2dCh0aGlzLCAnPiB1bCcsIERFQk9VTkNFX1RJTUVTLlBBR0lOQVRJT05fREVCT1VOQ0VfVElNRSk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJvdW5jZWRGZXRjaE5leHREYXRhc2V0T25TY3JvbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLy8gVHJpZ2dlcnMgYWZ0ZXIgdGhlIHNvcnRpbmcuXG4gICAgcHJpdmF0ZSBvblVwZGF0ZShldnQsIHVpLCBwcmVzZW50SW5kZXg/KSB7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmZpZWxkRGVmcztcbiAgICAgICAgLy8gSWYgdWkgaXMgbm90IHByZXNlbnQgdGhlbiBpdCBpcyBjYWxsZWQgZnJvbSBkcmFnIGFuZCBkcm9wIHVzaW5nIGtleWJvYXJkXG4gICAgICAgIGNvbnN0IG5ld0luZGV4ID0gdWkgPT09IHVuZGVmaW5lZCA/IHByZXNlbnRJbmRleCA6IHVpLml0ZW0uaW5kZXgoKTtcbiAgICAgICAgY29uc3Qgb2xkSW5kZXggPSB0aGlzLiR1bEVsZS5kYXRhKCdvbGRJbmRleCcpO1xuXG4gICAgICAgIGNvbnN0IG1pbkluZGV4ID0gXy5taW4oW25ld0luZGV4LCBvbGRJbmRleF0pO1xuICAgICAgICBjb25zdCBtYXhJbmRleCA9IF8ubWF4KFtuZXdJbmRleCwgb2xkSW5kZXhdKTtcblxuICAgICAgICBjb25zdCBkcmFnZ2VkSXRlbSA9IF8ucHVsbEF0KGRhdGEsIG9sZEluZGV4KVswXTtcbiAgICAgICAgLy8gTW9kaWZ5IHRoZSBkYXRhIGxpc3Qgb25seSBpZiB3ZSBmaW5kIGEgZHJhZ2dlZEl0ZW1cbiAgICAgICAgaWYgKGRyYWdnZWRJdGVtKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5nZXRDb25maWd1cmVkU3RhdGUoKSAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVBlcnNpc3RlbmNlLnJlbW92ZVdpZGdldFN0YXRlKHRoaXMsICdzZWxlY3RlZEl0ZW0nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZW9yZGVyUHJvcHMubWluSW5kZXggPSBfLm1pbihbbWluSW5kZXgsIHRoaXMucmVvcmRlclByb3BzLm1pbkluZGV4XSk7XG4gICAgICAgICAgICB0aGlzLnJlb3JkZXJQcm9wcy5tYXhJbmRleCA9IF8ubWF4KFttYXhJbmRleCwgdGhpcy5yZW9yZGVyUHJvcHMubWF4SW5kZXhdKTtcblxuICAgICAgICAgICAgZGF0YS5zcGxpY2UobmV3SW5kZXgsIDAsIGRyYWdnZWRJdGVtKTtcblxuICAgICAgICAgICAgdGhpcy5jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgY29uc3QgJGNoYW5nZWRJdGVtID0ge1xuICAgICAgICAgICAgICAgIG9sZEluZGV4OiBvbGRJbmRleCxcbiAgICAgICAgICAgICAgICBuZXdJbmRleDogbmV3SW5kZXgsXG4gICAgICAgICAgICAgICAgaXRlbTogZGF0YVtuZXdJbmRleF1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3Jlb3JkZXInLCB7JGV2ZW50OiBldnQsICRkYXRhOiBkYXRhLCAkY2hhbmdlZEl0ZW19KTtcbiAgICAgICAgICAgIHRoaXMuJHVsRWxlLnJlbW92ZURhdGEoJ29sZEluZGV4Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25maWd1cmVzIHJlb3JkZXJpbmcgdGhlIGxpc3QgaXRlbXMuXG4gICAgcHJpdmF0ZSBjb25maWd1cmVEbkQoKSB7XG4gICAgICAgIGxldCBhcHBlbmRUbztcbiAgICAgICAgY29uc3QgbW9kYWxFbCA9ICQoZG9jdW1lbnQpLmZpbmQoJy5tb2RhbCcpO1xuICAgICAgICBpZiAodGhpcy5nZXRBdHRyKCdoZWlnaHQnKSkgeyAvLyB3aGVuIGhlaWdodCBpcyBhcHBsaWVkIHRvIHRoZSBsaXN0LCBhcHBlbmQgc2hvdWxkIGJlIHRoZSB1bCdzIHBhcmVudCBhcyBzY3JvbGwgaXMgYXBwbGllZCB0byB0aGUgcGFyZW50XG4gICAgICAgICAgYXBwZW5kVG8gPSAncGFyZW50JztcbiAgICAgICAgfSBlbHNlIGlmIChtb2RhbEVsLmxlbmd0aCkgeyAvLyBJbiBjYXNlIG9mIGRpYWxvZywgYXBwZW5kVG8gc2hvdWxkIGJlIHRoZSBtb2RhbCBlbGVcbiAgICAgICAgICAgIGFwcGVuZFRvID0gbW9kYWxFbFttb2RhbEVsLmxlbmd0aCAtIDFdO1xuICAgICAgICB9IGVsc2UgeyAvLyBBcyBkZWZhdWx0IGFwcGVuZCB0byBzaG91bGQgYmUgYm9keVxuICAgICAgICAgICAgYXBwZW5kVG8gPSAnYm9keSc7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvcHRpb25zID0gaXNNb2JpbGVBcHAoKSA/IHt9IDoge1xuICAgICAgICAgICAgYXBwZW5kVG86IGFwcGVuZFRvLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0ICRlbCA9ICQodGhpcy5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgdGhpcy4kdWxFbGUgPSAkZWwuZmluZCgnLmFwcC1saXZlbGlzdC1jb250YWluZXInKTtcblxuICAgICAgICBjb25maWd1cmVEbkQodGhpcy4kdWxFbGUsIG9wdGlvbnMsIHRoaXMub25SZW9yZGVyU3RhcnQuYmluZCh0aGlzKSwgdGhpcy5vblVwZGF0ZS5iaW5kKHRoaXMpLCB0aGlzLm9uU29ydC5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLiR1bEVsZS5kcm9wcGFibGUoeydhY2NlcHQnOiAnLmFwcC1saXN0LWl0ZW0nfSk7XG5cbiAgICAgICAgaWYgKGlzTW9iaWxlQXBwKCkpIHtcbiAgICAgICAgICAgIHRoaXMuJHVsRWxlLnNvcnRhYmxlKCdkaXNhYmxlJyk7XG4gICAgICAgICAgICB0aGlzLiR1bEVsZS5vbigndG91Y2hzdGFydCcsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgIGlmICghc2VsZi50b3VjaGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi50b3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoc2VsZi50b3VjaGVkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJldmVudCBjb250ZXh0IG1lbnUgb24gbW9iaWxlIChJT1MvQU5EUk9JRClcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSwgNTApO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnRvdWNoZWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoJ25vLXNlbGVjdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9FbmFibGUgZHJhZ2dhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNvcnRhYmxlKCdlbmFibGUnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgaW50ZXJuYWwgZmxhZ1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50b3VjaGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vdHJpZ2dlciB0b3VjaHN0YXJ0IGFnYWluIHRvIGVuYWJsZSBkcmFnZ2FibGUgdGhyb3VnaCB0b3VjaCBwdW5jaFxuICAgICAgICAgICAgICAgICAgICAgICAgJChzZWxmKS50cmlnZ2VyKGV2ZW50KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9DaG9vc2UgcHJlZmVycmVkIGR1cmF0aW9uIGZvciB0YXBob2xkXG4gICAgICAgICAgICAgICAgICAgIH0sIDM1MCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkub24oJ3RvdWNoZW5kJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3VjaGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkucmVtb3ZlQ2xhc3MoJ25vLXNlbGVjdGlvbicpO1xuXG4gICAgICAgICAgICAgICAgLy9EaXNhYmxlIGRyYWdnYWJsZSB0byBlbmFibGUgZGVmYXVsdCBiZWhhdmlvdXJcbiAgICAgICAgICAgICAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnNvcnRhYmxlKCdkaXNhYmxlJyk7XG5cbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50b3VjaGVkKTtcbiAgICAgICAgICAgIH0pLm9uKCd0b3VjaG1vdmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudG91Y2hlZCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3Rpb24gbGltaXQgaXMgcmVhY2hlZC5cbiAgICBwcml2YXRlIGNoZWNrU2VsZWN0aW9uTGltaXQoY291bnQ6IG51bWJlcikge1xuICAgICAgICByZXR1cm4gKCF0aGlzLnNlbGVjdGlvbmxpbWl0IHx8IGNvdW50IDwgdGhpcy5zZWxlY3Rpb25saW1pdCk7XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsaXN0aXRlbSByZWZlcmVuY2UgYnkgaW5kZXggdmFsdWUuXG4gICAgcHJpdmF0ZSBnZXRMaXN0SXRlbUJ5SW5kZXgoaW5kZXg6IG51bWJlcik6IExpc3RJdGVtRGlyZWN0aXZlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlzdEl0ZW1zLnRvQXJyYXkoKVtpbmRleF07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIGluZGV4IG9mIGFuIChsaXN0SXRlbURpcmVjdGl2ZSkgaW4gdGhlIGxpc3RJdGVtXG4gICAgICogQHBhcmFtIHtMaXN0SXRlbURpcmVjdGl2ZX0gaXRlbVxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRMaXN0SXRlbUluZGV4KGl0ZW06IExpc3RJdGVtRGlyZWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxpc3RJdGVtcy50b0FycmF5KCkuaW5kZXhPZihpdGVtKTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZm9ybSBvdGhlciBkYXRhIHdpZGdldHMgbGlrZSB0YWJsZS5cbiAgICBwdWJsaWMgZXhlY3V0ZShvcGVyYXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKFtEYXRhU291cmNlLk9wZXJhdGlvbi5JU19BUElfQVdBUkUsIERhdGFTb3VyY2UuT3BlcmF0aW9uLklTX1BBR0VBQkxFLCBEYXRhU291cmNlLk9wZXJhdGlvbi5TVVBQT1JUU19TRVJWRVJfRklMVEVSXS5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGF0YXNvdXJjZS5leGVjdXRlKG9wZXJhdGlvbiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhhbmRsZUtleURvd24oJGV2ZW50LCBhY3Rpb246IHN0cmluZykge1xuICAgICAgICAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmKCRldmVudC5rZXlDb2RlICE9PSAxMyAmJiAkZXZlbnQua2V5Q29kZSAhPT0gOSAmJiAhKCgkZXZlbnQudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucygnZm9ybS1jb250cm9sJykgfHwgJGV2ZW50LnRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ25vdGUtZWRpdGFibGUnKSkgJiYgJGV2ZW50LmtleUNvZGUgPT09IDMyKSApIHtcbiAgICAgICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGlzdEl0ZW1zOiBRdWVyeUxpc3Q8TGlzdEl0ZW1EaXJlY3RpdmU+ID0gdGhpcy5saXN0SXRlbXM7XG5cbiAgICAgICAgbGV0IHByZXNlbnRJbmRleDogbnVtYmVyID0gdGhpcy5nZXRMaXN0SXRlbUluZGV4KHRoaXMubGFzdFNlbGVjdGVkSXRlbSk7XG5cbiAgICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0SW5kZXg6IG51bWJlciA9IHRoaXMuZ2V0TGlzdEl0ZW1JbmRleCh0aGlzLmZpcnN0U2VsZWN0ZWRJdGVtKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdENvdW50OiBudW1iZXIgPSBfLmlzQXJyYXkodGhpcy5zZWxlY3RlZGl0ZW0pID8gdGhpcy5zZWxlY3RlZGl0ZW0ubGVuZ3RoIDogKF8uaXNPYmplY3QodGhpcy5zZWxlY3RlZGl0ZW0pID8gMSA6IDApO1xuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ3NlbGVjdFByZXYnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXNlbnRJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChwcmVzZW50SW5kZXggPD0gZmlyc3RJbmRleCkgJiYgdGhpcy5jaGVja1NlbGVjdGlvbkxpbWl0KHNlbGVjdENvdW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gdGhpcy5nZXRMaXN0SXRlbUJ5SW5kZXgoIHByZXNlbnRJbmRleCAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbih0aGlzLmxhc3RTZWxlY3RlZEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZXNlbnRJbmRleCA+IGZpcnN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24odGhpcy5nZXRMaXN0SXRlbUJ5SW5kZXgocHJlc2VudEluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc2VsZWN0aW9ubGltaXRleGNlZWQnLCB7JGV2ZW50fSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3NlbGVjdE5leHQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByZXNlbnRJbmRleCA8IGxpc3RJdGVtcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocHJlc2VudEluZGV4ID49IGZpcnN0SW5kZXgpICYmIHRoaXMuY2hlY2tTZWxlY3Rpb25MaW1pdChzZWxlY3RDb3VudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9IHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbih0aGlzLmxhc3RTZWxlY3RlZEl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByZXNlbnRJbmRleCA8IGZpcnN0SW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlTGlzdEl0ZW1TZWxlY3Rpb24odGhpcy5nZXRMaXN0SXRlbUJ5SW5kZXgocHJlc2VudEluZGV4KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXggKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc2VsZWN0aW9ubGltaXRleGNlZWQnLCB7JGV2ZW50fSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ2ZvY3VzUHJldicpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuaXNMaXN0RWxlbWVudE1vdmFibGUpIHtcbiAgICAgICAgICAgICAgICBwcmVzZW50SW5kZXggPSBwcmVzZW50SW5kZXggPD0gMCA/IDAgOiAocHJlc2VudEluZGV4KTtcbiAgICAgICAgICAgICAgICBpZihwcmVzZW50SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9IHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldkVsdCA9IHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCAtIDEpO1xuICAgICAgICAgICAgICAgIHByZXZFbHQubmF0aXZlRWxlbWVudC5iZWZvcmUodGhpcy5sYXN0U2VsZWN0ZWRJdGVtLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZVBlcnNpc3RlbmNlLnJlbW92ZVdpZGdldFN0YXRlKHRoaXMsICdzZWxlY3RlZEl0ZW0nKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhcnIgPSB0aGlzLmxpc3RJdGVtcy50b0FycmF5KCk7XG4gICAgICAgICAgICAgICAgW2FycltwcmVzZW50SW5kZXggLSAxXSwgYXJyW3ByZXNlbnRJbmRleF1dID0gW2FycltwcmVzZW50SW5kZXhdLCBhcnJbcHJlc2VudEluZGV4IC0gMV1dO1xuICAgICAgICAgICAgICAgIHRoaXMubGlzdEl0ZW1zLnJlc2V0KGFycik7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBwcmVzZW50SW5kZXg7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmlhVGV4dCA9IFwic2VsZWN0ZWQgXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXNlbnRJbmRleCA9IHByZXNlbnRJbmRleCA8PSAwID8gMCA6IChwcmVzZW50SW5kZXggLSAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXgpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50SW5kZXggPSBwcmVzZW50SW5kZXggKyAxO1xuICAgICAgICAgICAgICAgIHRoaXMuYXJpYVRleHQgPSBcInNlbGVjdGVkIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2ZvY3VzTmV4dCcpIHtcbiAgICAgICAgICAgIGlmKHRoaXMuaXNMaXN0RWxlbWVudE1vdmFibGUpIHtcbiAgICAgICAgICAgICAgICBwcmVzZW50SW5kZXggPSBwcmVzZW50SW5kZXggPCAobGlzdEl0ZW1zLmxlbmd0aCAtIDEpID8gKHByZXNlbnRJbmRleCkgOiAobGlzdEl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIGlmKHByZXNlbnRJbmRleCA9PT0gdGhpcy5saXN0SXRlbXMubGVuZ3RoIC0gMSApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9IHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dEVsdCA9IHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCArIDEpO1xuICAgICAgICAgICAgICAgIG5leHRFbHQubmF0aXZlRWxlbWVudC5hZnRlcih0aGlzLmxhc3RTZWxlY3RlZEl0ZW0ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJdGVtLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlUGVyc2lzdGVuY2UucmVtb3ZlV2lkZ2V0U3RhdGUodGhpcywgJ3NlbGVjdGVkSXRlbScpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFyciA9IHRoaXMubGlzdEl0ZW1zLnRvQXJyYXkoKTtcbiAgICAgICAgICAgICAgICBbYXJyW3ByZXNlbnRJbmRleF0sIGFycltwcmVzZW50SW5kZXggKyAxXV0gPSBbYXJyW3ByZXNlbnRJbmRleCArIDFdLCBhcnJbcHJlc2VudEluZGV4XV07XG4gICAgICAgICAgICAgICAgdGhpcy5saXN0SXRlbXMucmVzZXQoYXJyKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHByZXNlbnRJbmRleCArIDI7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmlhVGV4dCA9IFwic2VsZWN0ZWQgXCI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHByZXNlbnRJbmRleCA9IHByZXNlbnRJbmRleCA8IChsaXN0SXRlbXMubGVuZ3RoIC0gMSkgPyAocHJlc2VudEluZGV4ICsgMSkgOiAobGlzdEl0ZW1zLmxlbmd0aCAtIDEpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSXRlbSA9IHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCk7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJdGVtLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IHByZXNlbnRJbmRleCArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy5hcmlhVGV4dCA9IFwic2VsZWN0ZWQgXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnc2VsZWN0Jykge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGVudGVyIGNsaWNrIGlzIHByZXNzZWQgb24gdGhlIGl0ZW0gd2hpY2ggaXMgbm90IHRoZSBsYXN0IHNlbGVjdGVkIGl0ZW0sIHRoZSBmaW5kIHRoZSBpdGVtIGZyb20gd2hpY2ggdGhlIGV2ZW50IGlzIG9yaWdpbmF0ZWQuXG4gICAgICAgICAgICBpZiAocHJlc2VudEluZGV4ID09PSAtMSB8fCAhJCgkZXZlbnQudGFyZ2V0KS5jbG9zZXN0KHRoaXMubGFzdFNlbGVjdGVkSXRlbS5uYXRpdmVFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0ICRsaSA9ICQoJGV2ZW50LnRhcmdldCkuY2xvc2VzdCgnbGkuYXBwLWxpc3QtaXRlbScpO1xuICAgICAgICAgICAgICAgIGNvbnN0ICR1bCA9ICRsaS5jbG9zZXN0KCd1bC5hcHAtbGl2ZWxpc3QtY29udGFpbmVyJyk7XG4gICAgICAgICAgICAgICAgcHJlc2VudEluZGV4ID0gJHVsLmZpbmQoJ2xpLmFwcC1saXN0LWl0ZW0nKS5pbmRleCgkbGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbkl0ZW1DbGljaygkZXZlbnQsIHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHByZXNlbnRJbmRleCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3NwYWNlJykge1xuICAgICAgICAgICAgaWYoIXRoaXMuZW5hYmxlcmVvcmRlcikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuaXNMaXN0RWxlbWVudE1vdmFibGUgPSAhdGhpcy5pc0xpc3RFbGVtZW50TW92YWJsZTtcbiAgICAgICAgICAgIHRoaXMub25JdGVtQ2xpY2soJGV2ZW50LCB0aGlzLmdldExpc3RJdGVtQnlJbmRleChwcmVzZW50SW5kZXgpKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudEluZGV4ID0gcHJlc2VudEluZGV4ICsgMTtcbiAgICAgICAgICAgIGlmKHRoaXMuaXNMaXN0RWxlbWVudE1vdmFibGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFyaWFUZXh0ID0gYEl0ZW0gJHt0aGlzLmN1cnJlbnRJbmRleH0gZ3JhYmJlZCwgY3VycmVudCBwb3NpdGlvbiBgO1xuICAgICAgICAgICAgICAgIHRoaXMuJHVsRWxlLmRhdGEoJ29sZEluZGV4JywgcHJlc2VudEluZGV4KTtcbiAgICAgICAgICAgIH0gICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFyaWFUZXh0ID0gYEl0ZW0gJHt0aGlzLmN1cnJlbnRJbmRleH0gZHJvcHBlZCwgZmluYWwgcG9zaXRpb24gYDtcbiAgICAgICAgICAgICAgICB0aGlzLm9uVXBkYXRlKCRldmVudCwgdW5kZWZpbmVkLCBwcmVzZW50SW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25Qcm9wZXJ0eUNoYW5nZShrZXk6IHN0cmluZywgbnY6IGFueSwgb3Y/OiBhbnkpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gJ2RhdGFzZXQnKSB7XG4gICAgICAgICAgICBpZiAoIW52ICYmIHRoaXMuYmluZGRhdGFzb3VyY2UgJiYgIXRoaXMuZGF0YXNvdXJjZSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25EYXRhU2V0Q2hhbmdlKG52KTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdkYXRhc291cmNlJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YXNldCkge1xuICAgICAgICAgICAgICAgIHRoaXMub25EYXRhU2V0Q2hhbmdlKHRoaXMuZGF0YXNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbmF2aWdhdGlvbicpIHtcbiAgICAgICAgICAgIC8vIFN1cHBvcnQgZm9yIG9sZGVyIHByb2plY3RzIHdoZXJlIG5hdmlnYXRpb24gdHlwZSB3YXMgYWR2YW5jZWQgaW5zdGVhZCBvZiBjbGFzc2ljXG4gICAgICAgICAgICBpZiAobnYgPT09ICdBZHZhbmNlZCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRpb24gPSAnQ2xhc3NpYyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3dpdGNoQ2xhc3ModGhpcy5uYXRpdmVFbGVtZW50LCBudiwgb3YpO1xuICAgICAgICAgICAgdGhpcy5vbk5hdmlnYXRpb25UeXBlQ2hhbmdlKG52KTtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFOYXZpZ2F0b3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFOYXZpZ2F0b3IubmF2aWdhdGlvbkNsYXNzID0gdGhpcy5wYWdpbmF0aW9uY2xhc3M7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnaXRlbXNwZXJyb3cnKSB7XG4gICAgICAgICAgICBzZXRMaXN0Q2xhc3ModGhpcyk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAndGFiaW5kZXgnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncHVsbHRvcmVmcmVzaCcgJiYgbnYpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwLm5vdGlmeSgncHVsbFRvUmVmcmVzaDplbmFibGUnKTtcbiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlVG9QdWxsVG9SZWZyZXNoKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncGFnaW5hdGlvbmNsYXNzJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YU5hdmlnYXRvcikge1xuICAgICAgICAgICAgICAgIC8vIEFkZGluZyBzZXRUaW1lb3V0IGJlY2F1c2UgaW4gcGFnaW5hdGlvbiBjb21wb25lbnQgdXBkYXRlTmF2U2l6ZSBtZXRob2QgaXMgb3ZlcnJpZGluZyBuYXZpZ2F0aW9uY2xhc3NcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCAoKSA9PiB0aGlzLmRhdGFOYXZpZ2F0b3IubmF2aWdhdGlvbkNsYXNzID0gbnYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ3BhZ2VzaXplJykge1xuICAgICAgICAgICAgdGhpcy5kYXRhTmF2aWdhdG9yLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgbWF4UmVzdWx0czogbnZcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLmRhdGFOYXZpZ2F0b3Iud2lkZ2V0Lm1heFJlc3VsdHMgPSBudjtcbiAgICAgICAgICAgIHRoaXMuZGF0YU5hdmlnYXRvci5tYXhSZXN1bHRzID0gbnY7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnZW5hYmxlcmVvcmRlcicpIHtcbiAgICAgICAgICAgIGlmIChudiAmJiB0aGlzLiR1bEVsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHVsRWxlLmF0dHIoJ2FyaWEtZGVzY3JpYmVkYnknLCB0aGlzLnRpdGxlSWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJlRG5EKCk7XG4gICAgICAgICAgICAgICAgdGhpcy4kdWxFbGUuc29ydGFibGUoJ2VuYWJsZScpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLiR1bEVsZSAmJiAhbnYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiR1bEVsZS5yZW1vdmVBdHRyKCdhcmlhLWRlc2NyaWJlZGJ5Jyk7XG4gICAgICAgICAgICAgICAgdGhpcy4kdWxFbGUuc29ydGFibGUoJ2Rpc2FibGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1cGVyLm9uUHJvcGVydHlDaGFuZ2Uoa2V5LCBudiwgb3YpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG9uSXRlbUNsaWNrKGV2dDogYW55LCAkbGlzdEl0ZW06IExpc3RJdGVtRGlyZWN0aXZlKSB7XG4gICAgICAgIGxldCBzZWxlY3RDb3VudDogbnVtYmVyO1xuXG4gICAgICAgIGlmICghJGxpc3RJdGVtLmRpc2FibGVJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLmZpcnN0U2VsZWN0ZWRJdGVtID0gdGhpcy5maXJzdFNlbGVjdGVkSXRlbSB8fCAkbGlzdEl0ZW07XG4gICAgICAgICAgICAvLyBTZXR0aW5nIHNlbGVjdENvdW50IHZhbHVlIGJhc2VkIG51bWJlciBvZiBpdGVtcyBzZWxlY3RlZC5cbiAgICAgICAgICAgIHNlbGVjdENvdW50ID0gXy5pc0FycmF5KHRoaXMuc2VsZWN0ZWRpdGVtKSA/IHRoaXMuc2VsZWN0ZWRpdGVtLmxlbmd0aCA6IChfLmlzT2JqZWN0KHRoaXMuc2VsZWN0ZWRpdGVtKSA/IDEgOiAwKTtcblxuICAgICAgICAgICAgLy8gSGFuZGxpbmcgbXVsdGlzZWxlY3QgZm9yIG1vYmlsZSBkZXZpY2VcbiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpc2VsZWN0ICYmIGlzTW9iaWxlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja1NlbGVjdGlvbkxpbWl0KHNlbGVjdENvdW50KSB8fCAkbGlzdEl0ZW0uaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbigkbGlzdEl0ZW0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc2VsZWN0aW9ubGltaXRleGNlZWQnLCB7JGV2ZW50OiBldnR9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKChldnQuY3RybEtleSB8fCBldnQubWV0YUtleSkgJiYgdGhpcy5tdWx0aXNlbGVjdCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoZWNrU2VsZWN0aW9uTGltaXQoc2VsZWN0Q291bnQpIHx8ICRsaXN0SXRlbS5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcnN0U2VsZWN0ZWRJdGVtID0gdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gJGxpc3RJdGVtO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3RJdGVtU2VsZWN0aW9uKCRsaXN0SXRlbSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzZWxlY3Rpb25saW1pdGV4Y2VlZCcsIHskZXZlbnQ6IGV2dH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZ0LnNoaWZ0S2V5ICYmIHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSAkbGlzdEl0ZW0uY29udGV4dC5pbmRleDtcbiAgICAgICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMuZmlyc3RTZWxlY3RlZEl0ZW0uY29udGV4dC5pbmRleDtcblxuICAgICAgICAgICAgICAgIC8vIGlmIGZpcnN0IGlzIGdyZWF0ZXIgdGhhbiBsYXN0LCB0aGVuIHN3YXAgdmFsdWVzXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0ID4gbGFzdCkge1xuICAgICAgICAgICAgICAgICAgICBsYXN0ID0gW2ZpcnN0LCBmaXJzdCA9IGxhc3RdWzBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jaGVja1NlbGVjdGlvbkxpbWl0KGxhc3QgLSBmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGVkSXRlbXMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0SXRlbXMuZm9yRWFjaCgoJGxpSXRlbTogTGlzdEl0ZW1EaXJlY3RpdmUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gJGxpSXRlbS5jb250ZXh0LmluZGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IGZpcnN0ICYmIGluZGV4IDw9IGxhc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3RJdGVtU2VsZWN0aW9uKCRsaUl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJdGVtID0gJGxpc3RJdGVtO1xuICAgICAgICAgICAgICAgIH0gIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3NlbGVjdGlvbmxpbWl0ZXhjZWVkJywgeyRldmVudDogZXZ0fSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghJGxpc3RJdGVtLmlzQWN0aXZlIHx8IHNlbGVjdENvdW50ID4gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0ZWRJdGVtcygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUxpc3RJdGVtU2VsZWN0aW9uKCRsaXN0SXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLmxhc3RTZWxlY3RlZEl0ZW0gPSAkbGlzdEl0ZW07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJGFwcERpZ2VzdCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gRW1wdHkgdGhlIGxpc3QgY29udGVudCBvbiBjbGVhclxuICAgIHB1YmxpYyBjbGVhciAoKSB7XG4gICAgICAgIHRoaXMudXBkYXRlRmllbGREZWZzKFtdKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgUmV0dXJucyBMaXN0SXRlbSBSZWZlcmVuY2UgYmFzZWQgb24gdGhlIGlucHV0IHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSB2YWw6IGluZGV4IHwgbW9kZWwgb2YgdGhlIGxpc3QgaXRlbS5cbiAgICAgKiBAcmV0dXJucyB7TGlzdEl0ZW1EaXJlY3RpdmV9XG4gICAgICovXG4gICAgcHJpdmF0ZSBnZXRJdGVtUmVmQnlJbmRleE9yTW9kZWwodmFsOiBhbnkpOiBMaXN0SXRlbURpcmVjdGl2ZSB7XG4gICAgICAgIGxldCBsaXN0SXRlbTogTGlzdEl0ZW1EaXJlY3RpdmU7XG4gICAgICAgIGlmIChpc051bWJlcih2YWwpKSB7XG4gICAgICAgICAgICBsaXN0SXRlbSA9IHRoaXMuZ2V0TGlzdEl0ZW1CeUluZGV4KHZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsaXN0SXRlbSA9IHRoaXMuZ2V0TGlzdEl0ZW1CeU1vZGVsKHZhbCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxpc3RJdGVtO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGRlc2VsZWN0cyBpdGVtIGluIHRoZSBsaXN0LlxuICAgICAqIEBwYXJhbSB2YWw6IGluZGV4IHwgbW9kZWwgb2YgdGhlIGxpc3QgaXRlbS5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVzZWxlY3RJdGVtICh2YWw6IGFueSkge1xuICAgICAgICBjb25zdCBsaXN0SXRlbSA9IHRoaXMuZ2V0SXRlbVJlZkJ5SW5kZXhPck1vZGVsKHZhbCk7XG4gICAgICAgIGlmIChsaXN0SXRlbSAmJiBsaXN0SXRlbS5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbihsaXN0SXRlbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBzZWxlY3RzIGl0ZW0gaW4gdGhlIGxpc3QuXG4gICAgICogQHBhcmFtIHZhbDogaW5kZXggfCBtb2RlbCBvZiB0aGUgbGlzdCBpdGVtLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZWxlY3RJdGVtKHZhbCwgc3RhdGVQZXJzaXN0ZW5jZVRyaWdnZXJlZD8pIHtcbiAgICAgICAgY29uc3QgbGlzdEl0ZW0gPSB0aGlzLmdldEl0ZW1SZWZCeUluZGV4T3JNb2RlbCh2YWwpO1xuICAgICAgICBpZiAoIWxpc3RJdGVtKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFsaXN0SXRlbS5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVMaXN0SXRlbVNlbGVjdGlvbihsaXN0SXRlbSwgc3RhdGVQZXJzaXN0ZW5jZVRyaWdnZXJlZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZm9jdXMgdGhlIGVsZW1lbnQuXG4gICAgICAgIGxpc3RJdGVtLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJlZm9yZVBhZ2luYXRpb25DaGFuZ2UoJGV2ZW50LCAkaW5kZXgpIHtcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdwYWdpbmF0aW9uY2hhbmdlJywgeyRldmVudCwgJGluZGV4fSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUV2ZW50KG5vZGU6IEhUTUxFbGVtZW50LCBldmVudE5hbWU6IHN0cmluZywgZXZlbnRDYWxsYmFjazogRnVuY3Rpb24sIGxvY2FsczogYW55KSB7XG4gICAgICAgIC8vIHRhcCBhbmQgZG91YmxlVGFwIGV2ZW50cyBhcmUgbm90IGdldHRpbmcgcHJvcGFnYXRlZC5TbywgdXNpbmcgbW91c2UgZXZlbnRzIGluc3RlYWQuXG4gICAgICAgIGNvbnN0IHRvdWNoVG9Nb3VzZSA9IHtcbiAgICAgICAgICAgIHRhcDogJ2NsaWNrJyxcbiAgICAgICAgICAgIGRvdWJsZXRhcDogJ2RibGNsaWNrJ1xuICAgICAgICB9O1xuICAgICAgICBpZiAoXy5pbmNsdWRlcyhbJ2NsaWNrJywgJ3RhcCcsICdkYmxjbGljaycsICdkb3VibGV0YXAnXSwgZXZlbnROYW1lKSkge1xuICAgICAgICAgICAgdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgdG91Y2hUb01vdXNlW2V2ZW50TmFtZV0gfHwgZXZlbnROYW1lLFxuICAgICAgICAgICAgICAgIChldnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gJChldnQudGFyZ2V0KS5jbG9zZXN0KCcuYXBwLWxpc3QtaXRlbScpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlzdEl0ZW1Db250ZXh0OiBMaXN0SXRlbURpcmVjdGl2ZSA9IHRhcmdldC5kYXRhKCdsaXN0SXRlbUNvbnRleHQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbGlzdEl0ZW1Db250ZXh0LmRpc2FibGVJdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKGV2ZW50TmFtZSwge3dpZGdldDogbGlzdEl0ZW1Db250ZXh0LCAkZXZlbnQ6IGV2dCwgaXRlbTogbGlzdEl0ZW1Db250ZXh0Lml0ZW19KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJbnZva2UgdGhlIGRhdGFzb3VyY2UgdmFyaWFibGUgYnkgZGVmYXVsdCB3aGVuIHB1bGx0b3JlZnJlc2ggZXZlbnQgaXMgbm90IHNwZWNpZmllZC5cbiAgICBwcml2YXRlIHN1YnNjcmliZVRvUHVsbFRvUmVmcmVzaCgpIHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJEZXN0cm95ZXJzLnB1c2godGhpcy5hcHAuc3Vic2NyaWJlKCdwdWxsdG9yZWZyZXNoJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGF0YXNvdXJjZSAmJiB0aGlzLmRhdGFzb3VyY2UubGlzdFJlY29yZHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFzb3VyY2UubGlzdFJlY29yZHMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmhhbmRsZUhlYWRlckNsaWNrID0gbm9vcDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmRlYm91bmNlZEZldGNoTmV4dERhdGFzZXRPblNjcm9sbCA9IHRoaXMucGFnaW5hdGlvblNlcnZpY2UuZGVib3VuY2VkRmV0Y2hOZXh0RGF0YXNldE9uU2Nyb2xsKHRoaXMuZGF0YU5hdmlnYXRvciwgREVCT1VOQ0VfVElNRVMuUEFHSU5BVElPTl9ERUJPVU5DRV9USU1FLCB0aGlzKTtcbiAgICAgICAgfSwgMCk7XG4gICAgICAgIHRoaXMuX2l0ZW1zID0gW107XG4gICAgICAgIHRoaXMuZmllbGREZWZzID0gW107XG4gICAgICAgIHRoaXMucmVvcmRlclByb3BzID0ge1xuICAgICAgICAgICAgbWluSW5kZXg6IG51bGwsXG4gICAgICAgICAgICBtYXhJbmRleDogbnVsbFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0VXBDVURIYW5kbGVycygpIHtcbiAgICAgICAgY29uc3QgJGFkZEl0ZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiYWRkLWxpc3QtaXRlbVwiKVswXTtcbiAgICAgICAgaWYgKCRhZGRJdGVtKSB7XG4gICAgICAgICAgICAvLyBUcmlnZ2VyZWQgb24gY2xpY2sgb2YgYWRkIGFjdGlvblxuICAgICAgICAgICAgJGFkZEl0ZW0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBldnQgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5wcm9taXNlUmVzb2x2ZXJGbigpO1xuICAgICAgICB0aGlzLnByb3BzSW5pdFByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0VXBDVURIYW5kbGVycygpO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1XaWRnZXRzID0gdGhpcy5tdWx0aXNlbGVjdCA/IFtdIDoge307XG4gICAgICAgICAgICB2YXIgZWxlID0gJCh0aGlzLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5hcHAtbGl2ZWxpc3QtY29udGFpbmVyJyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVuYWJsZXJlb3JkZXIgJiYgIXRoaXMuZ3JvdXBieSkge1xuICAgICAgICAgICAgICAgIGlmKGVsZSkge1xuICAgICAgICAgICAgICAgICAgICBlbGUuYXR0cignYXJpYS1kZXNjcmliZWRieScsIHRoaXMudGl0bGVJZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJlRG5EKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMuZW5hYmxlcmVvcmRlcikge1xuICAgICAgICAgICAgICAgIGlmIChlbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlLnJlbW92ZUF0dHIoJ2FyaWEtZGVzY3JpYmVkYnknKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cGJ5ICYmIHRoaXMuY29sbGFwc2libGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUhlYWRlckNsaWNrID0gaGFuZGxlSGVhZGVyQ2xpY2s7XG4gICAgICAgICAgICAgICAgdGhpcy50b2dnbGVBbGxIZWFkZXJzID0gdG9nZ2xlQWxsSGVhZGVycy5iaW5kKHVuZGVmaW5lZCwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRMaXN0Q2xhc3ModGhpcyk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldHVwSGFuZGxlcnMoKTtcbiAgICAgICAgY29uc3QgJHVsID0gdGhpcy5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3VsLmFwcC1saXZlbGlzdC1jb250YWluZXInKTtcbiAgICAgICAgc3R5bGVyKCR1bCBhcyBIVE1MRWxlbWVudCwgdGhpcywgQVBQTFlfU1RZTEVTX1RZUEUuU0NST0xMQUJMRV9DT05UQUlORVIpO1xuICAgICAgICBpZiAodGhpcy5lbmFibGVyZW9yZGVyKSB7XG4gICAgICAgICAgICBpZiAoJHVsKXtcbiAgICAgICAgICAgICAgICAkdWwuc2V0QXR0cmlidXRlKCdhcmlhLWRlc2NyaWJlZGJ5JywgdGhpcy50aXRsZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuZW5hYmxlcmVvcmRlcikgIHtcbiAgICAgICAgICAgIGlmKCR1bCkge1xuICAgICAgICAgICAgICAgICR1bC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNNb2JpbGVBcHAoKSAmJiAkdWwucXVlcnlTZWxlY3RvcignLmFwcC1saXN0LWl0ZW0tYWN0aW9uLXBhbmVsJykpIHtcbiAgICAgICAgICAgIHRoaXMuX2xpc3RBbmltYXRvciA9IG5ldyBMaXN0QW5pbWF0b3IodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xpc3RBbmltYXRvciAmJiB0aGlzLl9saXN0QW5pbWF0b3IuJGJ0blN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5fbGlzdEFuaW1hdG9yLiRidG5TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9saXN0ZW5lckRlc3Ryb3llcnMuZm9yRWFjaChkID0+IGQgJiYgZCgpKTtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICB9XG5cbiAgICBuZ09uRGV0YWNoKCkge1xuICAgICAgICBzdXBlci5uZ09uRGV0YWNoKCk7XG4gICAgICAgIHRoaXMuX3BhZ2VMb2FkID0gdHJ1ZTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicGFuZWwtaGVhZGluZ1wiICpuZ0lmPVwidGl0bGUgfHwgc3ViaGVhZGluZyB8fCBpY29uY2xhc3NcIj5cbiAgICA8aDMgY2xhc3M9XCJwYW5lbC10aXRsZVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicHVsbC1sZWZ0XCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImFwcC1pY29uIHBhbmVsLWljb24ge3tpY29uY2xhc3N9fVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIFtoaWRkZW5dPVwiIWljb25jbGFzc1wiPjwvaT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwdWxsLWxlZnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkaW5nXCIgW2lubmVySFRNTF09XCJ0aXRsZVwiPjwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlc2NyaXB0aW9uXCIgW2lubmVySFRNTF09XCJzdWJoZWFkaW5nXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvaDM+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImFwcC1kYXRhbmF2aWdhdG9yXCIgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkYXRhTmF2aWdhdG9yLmlzRGlzYWJsZVByZXZpb3VzXCIgYXJpYS1sYWJlbD1cIlBhZ2UgbmF2aWdhdGlvblwiICpuZ0lmPVwibmF2aWdhdGlvbiA9PT0gJ0lubGluZScgJiYgIW5vRGF0YUZvdW5kXCI+XG4gICAgPHVsIGNsYXNzPVwicGFnZXJcIj5cbiAgICAgICAgPGxpIGNsYXNzPVwicHJldmlvdXNcIiBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJzogKGRhdGFOYXZpZ2F0b3IgPyBkYXRhTmF2aWdhdG9yLmlzRGlzYWJsZVByZXZpb3VzIDogdHJ1ZSl9XCI+XG4gICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDp2b2lkKDApO1wiIChjbGljayk9XCJkYXRhTmF2aWdhdG9yLm5hdmlnYXRlUGFnZSgncHJldicsICRldmVudClcIlxuICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1kaXNhYmxlZF09XCJkYXRhTmF2aWdhdG9yLmlzRGlzYWJsZVByZXZpb3VzXCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ3aSB3aS1jaGV2cm9uLWxlZnRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+R28gdG8gUHJldmlvdXMgcGFnZSB7e2RhdGFOYXZpZ2F0b3IuaXNEaXNhYmxlUHJldmlvdXMgPyAnLCBEaXNhYmxlZCcgOiAnJ319PC9zcGFuPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICA8L2xpPlxuICAgIDwvdWw+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCJuYXZpZ2F0aW9uID09PSAnSW5saW5lJyAmJiAhbm9EYXRhRm91bmRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBhcmlhLWF0b21pYz1cInRydWVcIiBjbGFzcz1cInNyLW9ubHlcIj4ge3snUGFnZSAnICsgZGF0YU5hdmlnYXRvci5kbi5jdXJyZW50UGFnZSArICcgb2YgJyArIGRhdGFOYXZpZ2F0b3IucGFnZUNvdW50IH19PC9kaXY+XG5cbjxkaXY+XG4gICAgPGRpdiBpZD17e3RpdGxlSWR9fSBjbGFzcz1cInNyLW9ubHlcIiAqbmdJZj1cImVuYWJsZXJlb3JkZXJcIj5cbiAgICAgICAgUHJlc3Mgc3BhY2UgYmFyIHRvIHRvZ2dsZSBkcmFnIGRyb3AgbW9kZSwgdXNlIGFycm93IGtleXMgdG8gbW92ZSBzZWxlY3RlZCBlbGVtZW50cy5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCIgKm5nSWY9XCJsaXN0SXRlbXMgJiYgZW5hYmxlcmVvcmRlciAmJiBjdXJyZW50SW5kZXhcIiBjbGFzcz1cInNyLW9ubHlcIiA+XG4gICAgICAgIHt7YXJpYVRleHQgKyBjdXJyZW50SW5kZXggKyAnIG9mICcgKyAgbGlzdEl0ZW1zLmxlbmd0aH19XG4gICAgPC9kaXY+XG48L2Rpdj5cblxuPHVsIFthdHRyLnRhYmluZGV4XT1cInRhYmluZGV4XCIgIGNsYXNzPVwiYXBwLWxpdmVsaXN0LWNvbnRhaW5lciBjbGVhcmZpeCB7e2RpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gJ2FwcC1ob3Jpem9udGFsLWxpc3QnOiAnJ319IHt7bGlzdGNsYXNzfX1cIiByb2xlPVwibGlzdFwiXG4gICAgKGtleWRvd24uZW50ZXIpPVwiaGFuZGxlS2V5RG93bigkZXZlbnQsICdzZWxlY3QnKVwiXG5cbiAgICAoa2V5ZG93bi5zcGFjZSk9XCJoYW5kbGVLZXlEb3duKCRldmVudCwgJ3NwYWNlJylcIlxuXG4gICAgKGtleWRvd24uYXJyb3d1cCk9XCJoYW5kbGVLZXlEb3duKCRldmVudCwgJ2ZvY3VzUHJldicpXCJcbiAgICAoa2V5ZG93bi5hcnJvd2Rvd24pPVwiaGFuZGxlS2V5RG93bigkZXZlbnQsICdmb2N1c05leHQnKVwiXG4gICAgKGtleWRvd24uYXJyb3dsZWZ0KT1cImhhbmRsZUtleURvd24oJGV2ZW50LCAnZm9jdXNQcmV2JylcIlxuICAgIChrZXlkb3duLmFycm93cmlnaHQpPVwiaGFuZGxlS2V5RG93bigkZXZlbnQsICdmb2N1c05leHQnKVwiXG5cbiAgICAoa2V5ZG93bi5zaGlmdC5hcnJvd3VwKT1cImhhbmRsZUtleURvd24oJGV2ZW50LCAnc2VsZWN0UHJldicpXCJcbiAgICAoa2V5ZG93bi5zaGlmdC5hcnJvd2Rvd24pPVwiaGFuZGxlS2V5RG93bigkZXZlbnQsICdzZWxlY3ROZXh0JylcIlxuICAgIChrZXlkb3duLnNoaWZ0LmFycm93bGVmdCk9XCJoYW5kbGVLZXlEb3duKCRldmVudCwgJ3NlbGVjdFByZXYnKVwiXG4gICAgKGtleWRvd24uc2hpZnQuYXJyb3dyaWdodCk9XCJoYW5kbGVLZXlEb3duKCRldmVudCwgJ3NlbGVjdE5leHQnKVwiXG4gICAgW2hpZGRlbl09XCJub0RhdGFGb3VuZCAmJiAhdmFyaWFibGVJbmZsaWdodFwiXG4+XG4gICAgPG5nLXRlbXBsYXRlIFtuZ0lmXT1cIiFncm91cGJ5XCIgW25nSWZFbHNlXT1cImdyb3VwZWRMaXN0VGVtcGxhdGVcIj5cbiAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGZpZWxkRGVmczsgaW5kZXggYXMgJGluZGV4OyBmaXJzdCBhcyAkZmlyc3Q7IGxhc3QgYXMgJGxhc3Q7XCIgY2xhc3M9XCJhcHAtbGlzdC1pdGVtIHt7ZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAnJyA6IGl0ZW1zUGVyUm93Q2xhc3N9fVwiIFtuZ0NsYXNzXT1cImxpc3RJdGVtUmVmLml0ZW1DbGFzc1wiXG4gICAgICAgICAgICBbd21MaXN0SXRlbV09XCJpdGVtXCJcbiAgICAgICAgICAgICNsaXN0SXRlbVJlZj1cImxpc3RJdGVtUmVmXCJcbiAgICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgICAgIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJsaXN0VGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2l0ZW06IGl0ZW0sICRpbmRleDogJGluZGV4LCBpdGVtUmVmOiBsaXN0SXRlbVJlZiwgJGZpcnN0OiAkZmlyc3QsICRsYXN0OiAkbGFzdCwgY3VycmVudEl0ZW1XaWRnZXRzOiBsaXN0SXRlbVJlZi5jdXJyZW50SXRlbVdpZGdldHN9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbGk+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxpc3RMZWZ0QWN0aW9uVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxpc3RSaWdodEFjdGlvblRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG48L3VsPlxuXG48ZGl2IGNsYXNzPVwibm8tZGF0YS1tc2dcIiAqbmdJZj1cIm5vRGF0YUZvdW5kICYmICF2YXJpYWJsZUluZmxpZ2h0XCIgW3RleHRDb250ZW50XT1cIm5vZGF0YW1lc3NhZ2VcIj48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImxvYWRpbmctZGF0YS1tc2dcIiAqbmdJZj1cInZhcmlhYmxlSW5mbGlnaHQgJiYgIXB1bGx0b3JlZnJlc2hcIj5cbiAgICA8c3Bhbj5cbiAgICAgICAgPGkgY2xhc3M9XCJhcHAtaWNvbiBwYW5lbC1pY29uIGZhLXNwaW5cIiBhcmlhLWhpZGRlbj1cInRydWVcIiBbbmdDbGFzc109XCJsb2FkaW5naWNvblwiPjwvaT5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+TG9hZGluZzwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsb2FkaW5nLXRleHRcIiBbdGV4dENvbnRlbnRdPVwibG9hZGluZ2RhdGFtc2dcIj48L3NwYW4+XG4gICAgPC9zcGFuPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJhcHAtZGF0YW5hdmlnYXRvclwiIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGF0YU5hdmlnYXRvci5pc0Rpc2FibGVOZXh0XCIgKm5nSWY9XCJuYXZpZ2F0aW9uID09PSAnSW5saW5lJyAmJiAhbm9EYXRhRm91bmRcIj5cbiAgICA8dWwgY2xhc3M9XCJwYWdlclwiPlxuICAgICAgICA8bGkgY2xhc3M9XCJuZXh0XCIgW25nQ2xhc3NdPVwieydkaXNhYmxlZCc6IChkYXRhTmF2aWdhdG9yID8gZGF0YU5hdmlnYXRvci5pc0Rpc2FibGVOZXh0ICA6IHRydWUpfVwiPlxuICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKTtcIiAoY2xpY2spPVwiZGF0YU5hdmlnYXRvci5uYXZpZ2F0ZVBhZ2UoJ25leHQnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiZGF0YU5hdmlnYXRvci5pc0Rpc2FibGVOZXh0XCI+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJ3aSB3aS1jaGV2cm9uLXJpZ2h0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkdvIHRvIE5leHQgcGFnZSB7e2RhdGFOYXZpZ2F0b3IuaXNEaXNhYmxlTmV4dCA/ICcsIERpc2FibGVkJyA6ICcnfX08L3NwYW4+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgPC91bD5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwicGFuZWwtZm9vdGVyXCIgKm5nSWY9XCJuYXZpZ2F0aW9uICE9PSAnTm9uZSdcIiBbaGlkZGVuXT1cIiFzaG93TmF2aWdhdGlvbiB8fCAob25EZW1hbmRMb2FkICYmIGRhdGFOYXZpZ2F0b3IuaXNEaXNhYmxlTmV4dCkgfHwgKGRhdGFOYXZpZ2F0b3IuZGF0YVNpemUgPD0gcGFnZXNpemUpIHx8ICghZGF0YU5hdmlnYXRvci5kYXRhU2l6ZSAmJiAhZGF0YU5hdmlnYXRvci5kYXRhc291cmNlPy5wYWdpbmF0aW9uPy5uZXh0KVwiPlxuICAgIDxuYXYgd21QYWdpbmF0aW9uXG4gICAgICAgICBuYXZpZ2F0aW9uYWxpZ24uYmluZD1cIm5hdmlnYXRpb25hbGlnblwiXG4gICAgICAgICBuYXZpZ2F0aW9uLmJpbmQ9XCJuYXZDb250cm9sc1wiXG4gICAgICAgICBzaG93cmVjb3JkY291bnQuYmluZD1cInNob3dyZWNvcmRjb3VudFwiXG4gICAgICAgICBtYXhzaXplLmJpbmQ9XCJtYXhzaXplXCJcbiAgICAgICAgIGJvdW5kYXJ5bGlua3MuYmluZD1cImJvdW5kYXJ5bGlua3NcIlxuICAgICAgICAgZm9yY2VlbGxpcHNlcy5iaW5kPVwiZm9yY2VlbGxpcHNlc1wiXG4gICAgICAgICBkaXJlY3Rpb25saW5rcy5iaW5kPVwiZGlyZWN0aW9ubGlua3NcIlxuICAgICAgICAgc2hvdy5iaW5kPVwiIW9uRGVtYW5kTG9hZFwiXG4gICAgICAgICBwYWdpbmF0aW9uY2hhbmdlLmV2ZW50PVwiYmVmb3JlUGFnaW5hdGlvbkNoYW5nZSgkZXZlbnQsICRpbmRleClcIlxuICAgID48L25hdj5cbiAgICA8YSAqbmdJZj1cIm9uRGVtYW5kTG9hZFwiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMCk7XCJcbiAgICAgICAoY2xpY2spPVwiZGF0YU5hdmlnYXRvci5uYXZpZ2F0ZVBhZ2UoJ25leHQnLCAkZXZlbnQpXCJcbiAgICAgICBjbGFzcz1cImFwcC1idXR0b24gYnRuIGJ0bi1ibG9ja1wiXG4gICAgICAgW25nQ2xhc3NdPVwicGFnaW5hdGlvbmNsYXNzXCJcbiAgICAgICBbdGV4dENvbnRlbnRdPVwib25kZW1hbmRtZXNzYWdlXCJcbiAgICA+PC9hPlxuPC9kaXY+XG5cbjwhLS1UaGlzIHRlbXBsYXRlIHdpbGwgYmUgZGlzcGxheWVkIHdoZW4gZ3JvdXBieSBpcyBzcGVjaWZpZWQtLT5cbjxuZy10ZW1wbGF0ZSAjZ3JvdXBlZExpc3RUZW1wbGF0ZT5cbiAgICA8bGkgKm5nRm9yPVwibGV0IGdyb3VwT2JqIG9mIGdyb3VwZWREYXRhXCIgY2xhc3M9XCJhcHAtbGlzdC1pdGVtLWdyb3VwIGNsZWFyZml4XCI+XG4gICAgICAgIDx1bCBbYXR0ci50YWJpbmRleF09XCJ0YWJpbmRleFwiIGNsYXNzPVwibGlzdC1ncm91cCBpdGVtLWdyb3VwXCIgW25nQ2xhc3NdPVwibGlzdGNsYXNzXCI+XG4gICAgICAgICAgICA8bGkgY2xhc3M9XCJhcHAtbGlzdC1pdGVtLWhlYWRlciBsaXN0LWl0ZW0gbGlzdC1ncm91cC1oZWFkZXJcIiAoY2xpY2spPVwiaGFuZGxlSGVhZGVyQ2xpY2soJGV2ZW50KVwiIFtuZ0NsYXNzXT1cInsnY29sbGFwc2libGUtY29udGVudCc6IGNvbGxhcHNpYmxlfVwiPlxuICAgICAgICAgICAgPGg0Pnt7Z3JvdXBPYmoua2V5fX1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWFjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImFwcC1pY29uIHdpIGFjdGlvbiB3aS1jaGV2cm9uLXVwXCIgKm5nSWY9XCJjb2xsYXBzaWJsZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJzaG93Y291bnRcIiBjbGFzcz1cImxhYmVsIGxhYmVsLWRlZmF1bHRcIj57e2dyb3VwT2JqLmRhdGEubGVuZ3RofX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvaDQ+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBjbGVhcmZpeCB7e2RpcmVjdGlvbiA9PT0gJ2hvcml6b250YWwnID8gJ2FwcC1ob3Jpem9udGFsLWxpc3QnOiAnJ319XCI+XG4gICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBpdGVtIG9mIGdyb3VwT2JqLmRhdGE7IGluZGV4IGFzICRpbmRleDsgZmlyc3QgYXMgJGZpcnN0OyBsYXN0IGFzICRsYXN0O1wiIFthdHRyLnRhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJhcHAtbGlzdC1pdGVtIGdyb3VwLWxpc3QtaXRlbSB7e2l0ZW1zUGVyUm93Q2xhc3N9fVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImxpc3RJdGVtUmVmLml0ZW1DbGFzc1wiXG4gICAgICAgICAgICAgICAgICAgIFt3bUxpc3RJdGVtXT1cIml0ZW1cIiAjbGlzdEl0ZW1SZWY9XCJsaXN0SXRlbVJlZlwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxpc3RUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7aXRlbTogaXRlbSwgJGluZGV4OiAkaW5kZXgsIGl0ZW1SZWY6IGxpc3RJdGVtUmVmLCAkZmlyc3Q6ICRmaXJzdCwgJGxhc3Q6ICRsYXN0LCBjdXJyZW50SXRlbVdpZGdldHM6IGxpc3RJdGVtUmVmLmN1cnJlbnRJdGVtV2lkZ2V0c31cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgPC91bD5cbiAgICA8L2xpPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|