@pepperi-addons/ngx-lib 0.4.1-beta.54 → 0.4.1-beta.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/address/address.component.d.ts +30 -30
- package/address/address.module.d.ts +15 -15
- package/address/index.d.ts +5 -5
- package/address/public-api.d.ts +2 -2
- package/attachment/attachment.component.d.ts +85 -85
- package/attachment/attachment.module.d.ts +14 -14
- package/attachment/index.d.ts +5 -5
- package/attachment/public-api.d.ts +2 -2
- package/bread-crumbs/bread-crumbs.component.d.ts +27 -27
- package/bread-crumbs/bread-crumbs.model.d.ts +11 -11
- package/bread-crumbs/bread-crumbs.module.d.ts +15 -15
- package/bread-crumbs/index.d.ts +5 -5
- package/bread-crumbs/public-api.d.ts +3 -3
- package/button/button.component.d.ts +102 -102
- package/button/button.model.d.ts +14 -14
- package/button/button.module.d.ts +13 -13
- package/button/index.d.ts +5 -5
- package/button/public-api.d.ts +3 -3
- package/carousel/carousel-item.directive.d.ts +12 -12
- package/carousel/carousel.component.d.ts +148 -148
- package/carousel/carousel.module.d.ts +8 -8
- package/carousel/index.d.ts +5 -5
- package/carousel/public-api.d.ts +3 -3
- package/checkbox/checkbox.component.d.ts +50 -50
- package/checkbox/checkbox.module.d.ts +19 -19
- package/checkbox/index.d.ts +5 -5
- package/checkbox/public-api.d.ts +2 -2
- package/chips/chips.component.d.ts +93 -93
- package/chips/chips.model.d.ts +14 -14
- package/chips/chips.module.d.ts +20 -20
- package/chips/chips.service.d.ts +15 -15
- package/chips/index.d.ts +5 -5
- package/chips/public-api.d.ts +3 -3
- package/color/color-picker.component.d.ts +57 -57
- package/color/color.component.d.ts +30 -30
- package/color/color.model.d.ts +1 -1
- package/color/color.module.d.ts +26 -26
- package/color/index.d.ts +5 -5
- package/color/public-api.d.ts +3 -3
- package/core/clipboard/clipboard.directive.d.ts +5 -5
- package/core/clipboard/clipboard.service.d.ts +5 -5
- package/core/clipboard/index.d.ts +1 -1
- package/core/clipboard/public-api.d.ts +2 -2
- package/core/common/directives/auto-width.directive.d.ts +19 -19
- package/core/common/directives/button-blur.directive.d.ts +9 -9
- package/core/common/directives/button-loader.directive.d.ts +26 -26
- package/core/common/directives/data-qa.directive.d.ts +11 -11
- package/core/common/directives/div-loader.directive.d.ts +21 -21
- package/core/common/directives/index.d.ts +1 -1
- package/core/common/directives/menu-blur.directive.d.ts +10 -10
- package/core/common/directives/prevent-multi-click.directive.d.ts +7 -7
- package/core/common/directives/print.directive.d.ts +75 -75
- package/core/common/directives/public-api.d.ts +8 -8
- package/core/common/index.d.ts +1 -1
- package/core/common/model/index.d.ts +1 -1
- package/core/common/model/papi.model.d.ts +2 -2
- package/core/common/model/public-api.d.ts +3 -3
- package/core/common/model/utilities.model.d.ts +5 -5
- package/core/common/model/wapi.model.d.ts +202 -202
- package/core/common/pipes/common-pipes.d.ts +57 -57
- package/core/common/pipes/date-ago.pipe.d.ts +11 -11
- package/core/common/pipes/index.d.ts +1 -1
- package/core/common/pipes/public-api.d.ts +2 -2
- package/core/common/public-api.d.ts +4 -4
- package/core/common/services/addon.service.d.ts +48 -48
- package/core/common/services/color.service.d.ts +51 -51
- package/core/common/services/cookie.service.d.ts +53 -53
- package/core/common/services/data-convertor.service.d.ts +45 -45
- package/core/common/services/file.service.d.ts +27 -27
- package/core/common/services/index.d.ts +1 -1
- package/core/common/services/jwt-helper.service.d.ts +13 -13
- package/core/common/services/public-api.d.ts +11 -11
- package/core/common/services/session.service.d.ts +18 -18
- package/core/common/services/translate.service.d.ts +12 -12
- package/core/common/services/utilities.service.d.ts +39 -39
- package/core/common/services/validator.service.d.ts +31 -31
- package/core/common/services/window-scrolling.service.d.ts +10 -10
- package/core/customization/customization.model.d.ts +277 -277
- package/core/customization/customization.service.d.ts +159 -159
- package/core/customization/index.d.ts +1 -1
- package/core/customization/public-api.d.ts +2 -2
- package/core/http/index.d.ts +1 -1
- package/core/http/interceptors/error.interceptor.d.ts +8 -8
- package/core/http/interceptors/index.d.ts +11 -11
- package/core/http/interceptors/loader.interceptor.d.ts +11 -11
- package/core/http/interceptors/profiler.interceptor.d.ts +8 -8
- package/core/http/public-api.d.ts +2 -2
- package/core/http/services/http.service.d.ts +28 -28
- package/core/http/services/loader.service.d.ts +13 -13
- package/core/index.d.ts +1 -1
- package/core/layout/index.d.ts +1 -1
- package/core/layout/layout.service.d.ts +36 -36
- package/core/layout/public-api.d.ts +2 -2
- package/core/layout/rtl.directive.d.ts +21 -21
- package/core/portal/attach.directive.d.ts +13 -13
- package/core/portal/index.d.ts +1 -1
- package/core/portal/portal.service.d.ts +12 -12
- package/core/portal/public-api.d.ts +3 -3
- package/core/portal/target.directive.d.ts +12 -12
- package/core/public-api.d.ts +7 -7
- package/core/scroll-to/index.d.ts +1 -1
- package/core/scroll-to/public-api.d.ts +1 -1
- package/core/scroll-to/scroll-to.service.d.ts +11 -11
- package/date/date.component.d.ts +69 -69
- package/date/date.model.d.ts +31 -31
- package/date/date.module.d.ts +23 -23
- package/date/index.d.ts +5 -5
- package/date/public-api.d.ts +2 -2
- package/dialog/default-dialog.component.d.ts +12 -12
- package/dialog/dialog.component.d.ts +13 -13
- package/dialog/dialog.model.d.ts +31 -31
- package/dialog/dialog.module.d.ts +18 -18
- package/dialog/dialog.service.d.ts +27 -27
- package/dialog/index.d.ts +5 -5
- package/dialog/public-api.d.ts +4 -4
- package/draggable-items/draggable-item/draggable-item.component.d.ts +11 -11
- package/draggable-items/draggable-items.component.d.ts +36 -36
- package/draggable-items/draggable-items.model.d.ts +11 -11
- package/draggable-items/draggable-items.module.d.ts +18 -18
- package/draggable-items/index.d.ts +5 -5
- package/draggable-items/public-api.d.ts +4 -4
- package/esm2020/address/address.component.mjs +108 -108
- package/esm2020/address/address.module.mjs +53 -53
- package/esm2020/address/pepperi-addons-ngx-lib-address.mjs +4 -4
- package/esm2020/address/public-api.mjs +5 -5
- package/esm2020/attachment/attachment.component.mjs +219 -219
- package/esm2020/attachment/attachment.module.mjs +49 -49
- package/esm2020/attachment/pepperi-addons-ngx-lib-attachment.mjs +4 -4
- package/esm2020/attachment/public-api.mjs +5 -5
- package/esm2020/bread-crumbs/bread-crumbs.component.mjs +84 -84
- package/esm2020/bread-crumbs/bread-crumbs.model.mjs +6 -6
- package/esm2020/bread-crumbs/bread-crumbs.module.mjs +49 -49
- package/esm2020/bread-crumbs/pepperi-addons-ngx-lib-bread-crumbs.mjs +4 -4
- package/esm2020/bread-crumbs/public-api.mjs +6 -6
- package/esm2020/button/button.component.mjs +137 -137
- package/esm2020/button/button.model.mjs +5 -5
- package/esm2020/button/button.module.mjs +45 -45
- package/esm2020/button/pepperi-addons-ngx-lib-button.mjs +4 -4
- package/esm2020/button/public-api.mjs +6 -6
- package/esm2020/carousel/carousel-item.directive.mjs +32 -32
- package/esm2020/carousel/carousel.component.mjs +736 -736
- package/esm2020/carousel/carousel.module.mjs +16 -16
- package/esm2020/carousel/pepperi-addons-ngx-lib-carousel.mjs +4 -4
- package/esm2020/carousel/public-api.mjs +7 -7
- package/esm2020/checkbox/checkbox.component.mjs +167 -167
- package/esm2020/checkbox/checkbox.module.mjs +62 -62
- package/esm2020/checkbox/pepperi-addons-ngx-lib-checkbox.mjs +4 -4
- package/esm2020/checkbox/public-api.mjs +5 -5
- package/esm2020/chips/chips.component.mjs +157 -157
- package/esm2020/chips/chips.model.mjs +1 -1
- package/esm2020/chips/chips.module.mjs +80 -80
- package/esm2020/chips/chips.service.mjs +44 -44
- package/esm2020/chips/pepperi-addons-ngx-lib-chips.mjs +4 -4
- package/esm2020/chips/public-api.mjs +6 -6
- package/esm2020/color/color-picker.component.mjs +197 -197
- package/esm2020/color/color.component.mjs +89 -89
- package/esm2020/color/color.model.mjs +1 -1
- package/esm2020/color/color.module.mjs +92 -92
- package/esm2020/color/pepperi-addons-ngx-lib-color.mjs +4 -4
- package/esm2020/color/public-api.mjs +6 -6
- package/esm2020/core/clipboard/clipboard.directive.mjs +23 -23
- package/esm2020/core/clipboard/clipboard.service.mjs +13 -13
- package/esm2020/core/clipboard/index.mjs +4 -4
- package/esm2020/core/clipboard/public-api.mjs +5 -5
- package/esm2020/core/common/directives/auto-width.directive.mjs +76 -76
- package/esm2020/core/common/directives/button-blur.directive.mjs +23 -23
- package/esm2020/core/common/directives/button-loader.directive.mjs +111 -111
- package/esm2020/core/common/directives/data-qa.directive.mjs +22 -22
- package/esm2020/core/common/directives/div-loader.directive.mjs +60 -60
- package/esm2020/core/common/directives/index.mjs +4 -4
- package/esm2020/core/common/directives/menu-blur.directive.mjs +31 -31
- package/esm2020/core/common/directives/prevent-multi-click.directive.mjs +26 -26
- package/esm2020/core/common/directives/print.directive.mjs +144 -144
- package/esm2020/core/common/directives/public-api.mjs +12 -12
- package/esm2020/core/common/index.mjs +4 -4
- package/esm2020/core/common/model/index.mjs +4 -4
- package/esm2020/core/common/model/papi.model.mjs +2 -2
- package/esm2020/core/common/model/public-api.mjs +6 -6
- package/esm2020/core/common/model/utilities.model.mjs +56 -56
- package/esm2020/core/common/model/wapi.model.mjs +156 -156
- package/esm2020/core/common/pipes/common-pipes.mjs +166 -166
- package/esm2020/core/common/pipes/date-ago.pipe.mjs +45 -45
- package/esm2020/core/common/pipes/index.mjs +4 -4
- package/esm2020/core/common/pipes/public-api.mjs +5 -5
- package/esm2020/core/common/public-api.mjs +7 -7
- package/esm2020/core/common/services/addon.service.mjs +188 -188
- package/esm2020/core/common/services/color.service.mjs +358 -358
- package/esm2020/core/common/services/cookie.service.mjs +152 -152
- package/esm2020/core/common/services/data-convertor.service.mjs +121 -121
- package/esm2020/core/common/services/file.service.mjs +212 -212
- package/esm2020/core/common/services/index.mjs +4 -4
- package/esm2020/core/common/services/jwt-helper.service.mjs +105 -105
- package/esm2020/core/common/services/public-api.mjs +14 -14
- package/esm2020/core/common/services/session.service.mjs +70 -70
- package/esm2020/core/common/services/translate.service.mjs +45 -45
- package/esm2020/core/common/services/utilities.service.mjs +299 -299
- package/esm2020/core/common/services/validator.service.mjs +271 -271
- package/esm2020/core/common/services/window-scrolling.service.mjs +31 -31
- package/esm2020/core/customization/customization.model.mjs +301 -301
- package/esm2020/core/customization/customization.service.mjs +770 -770
- package/esm2020/core/customization/index.mjs +4 -4
- package/esm2020/core/customization/public-api.mjs +5 -5
- package/esm2020/core/http/index.mjs +4 -4
- package/esm2020/core/http/interceptors/error.interceptor.mjs +26 -26
- package/esm2020/core/http/interceptors/index.mjs +23 -23
- package/esm2020/core/http/interceptors/loader.interceptor.mjs +31 -31
- package/esm2020/core/http/interceptors/profiler.interceptor.mjs +31 -31
- package/esm2020/core/http/public-api.mjs +5 -5
- package/esm2020/core/http/services/http.service.mjs +154 -154
- package/esm2020/core/http/services/loader.service.mjs +49 -49
- package/esm2020/core/index.mjs +4 -4
- package/esm2020/core/layout/index.mjs +4 -4
- package/esm2020/core/layout/layout.service.mjs +167 -167
- package/esm2020/core/layout/public-api.mjs +5 -5
- package/esm2020/core/layout/rtl.directive.mjs +43 -43
- package/esm2020/core/portal/attach.directive.mjs +26 -26
- package/esm2020/core/portal/index.mjs +4 -4
- package/esm2020/core/portal/portal.service.mjs +35 -35
- package/esm2020/core/portal/public-api.mjs +6 -6
- package/esm2020/core/portal/target.directive.mjs +23 -23
- package/esm2020/core/public-api.mjs +10 -10
- package/esm2020/core/scroll-to/index.mjs +4 -4
- package/esm2020/core/scroll-to/public-api.mjs +5 -5
- package/esm2020/core/scroll-to/scroll-to.service.mjs +83 -83
- package/esm2020/date/date.component.mjs +306 -306
- package/esm2020/date/date.model.mjs +53 -53
- package/esm2020/date/date.module.mjs +87 -87
- package/esm2020/date/pepperi-addons-ngx-lib-date.mjs +4 -4
- package/esm2020/date/public-api.mjs +5 -5
- package/esm2020/dialog/default-dialog.component.mjs +36 -36
- package/esm2020/dialog/dialog.component.mjs +35 -35
- package/esm2020/dialog/dialog.model.mjs +32 -32
- package/esm2020/dialog/dialog.module.mjs +58 -58
- package/esm2020/dialog/dialog.service.mjs +81 -81
- package/esm2020/dialog/pepperi-addons-ngx-lib-dialog.mjs +4 -4
- package/esm2020/dialog/public-api.mjs +7 -7
- package/esm2020/draggable-items/draggable-item/draggable-item.component.mjs +26 -26
- package/esm2020/draggable-items/draggable-items.component.mjs +101 -101
- package/esm2020/draggable-items/draggable-items.model.mjs +1 -1
- package/esm2020/draggable-items/draggable-items.module.mjs +59 -59
- package/esm2020/draggable-items/pepperi-addons-ngx-lib-draggable-items.mjs +4 -4
- package/esm2020/draggable-items/public-api.mjs +7 -7
- package/esm2020/field-title/field-title.component.mjs +44 -44
- package/esm2020/field-title/field-title.module.mjs +46 -46
- package/esm2020/field-title/pepperi-addons-ngx-lib-field-title.mjs +4 -4
- package/esm2020/field-title/public-api.mjs +5 -5
- package/esm2020/files-uploader/files-uploader.component.mjs +240 -240
- package/esm2020/files-uploader/files-uploader.module.mjs +78 -78
- package/esm2020/files-uploader/pepperi-addons-ngx-lib-files-uploader.mjs +4 -4
- package/esm2020/files-uploader/public-api.mjs +5 -5
- package/esm2020/form/field-generator.component.mjs +152 -152
- package/esm2020/form/form.component.mjs +1226 -1226
- package/esm2020/form/form.model.mjs +1 -1
- package/esm2020/form/form.module.mjs +178 -178
- package/esm2020/form/indicators.component.mjs +22 -22
- package/esm2020/form/internal-button.component.mjs +183 -183
- package/esm2020/form/internal-carusel.component.mjs +116 -116
- package/esm2020/form/internal-carusel.service.mjs +31 -31
- package/esm2020/form/internal-field-generator.component.mjs +146 -146
- package/esm2020/form/internal-form.component.mjs +1215 -1215
- package/esm2020/form/internal-list.component.mjs +512 -512
- package/esm2020/form/internal-menu.component.mjs +65 -65
- package/esm2020/form/internal-page.component.mjs +361 -361
- package/esm2020/form/internal-page.service.mjs +119 -119
- package/esm2020/form/pepperi-addons-ngx-lib-form.mjs +4 -4
- package/esm2020/form/public-api.mjs +6 -6
- package/esm2020/group-buttons/group-buttons.component.mjs +70 -70
- package/esm2020/group-buttons/group-buttons.module.mjs +58 -58
- package/esm2020/group-buttons/pepperi-addons-ngx-lib-group-buttons.mjs +4 -4
- package/esm2020/group-buttons/public-api.mjs +5 -5
- package/esm2020/icon/icon-generated-all.model.mjs +113 -113
- package/esm2020/icon/icon-generated.model.mjs +441 -441
- package/esm2020/icon/icon-registry.service.mjs +24 -24
- package/esm2020/icon/icon.component.mjs +90 -90
- package/esm2020/icon/icon.module.mjs +19 -19
- package/esm2020/icon/icon.service.mjs +30 -30
- package/esm2020/icon/pepperi-addons-ngx-lib-icon.mjs +4 -4
- package/esm2020/icon/public-api.mjs +10 -10
- package/esm2020/image/image.component.mjs +246 -246
- package/esm2020/image/image.module.mjs +73 -73
- package/esm2020/image/image.service.mjs +51 -51
- package/esm2020/image/pepperi-addons-ngx-lib-image.mjs +4 -4
- package/esm2020/image/public-api.mjs +6 -6
- package/esm2020/images-filmstrip/images-filmstrip.component.mjs +336 -336
- package/esm2020/images-filmstrip/images-filmstrip.module.mjs +82 -82
- package/esm2020/images-filmstrip/pepperi-addons-ngx-lib-images-filmstrip.mjs +4 -4
- package/esm2020/images-filmstrip/public-api.mjs +5 -5
- package/esm2020/link/link.component.mjs +325 -325
- package/esm2020/link/link.module.mjs +79 -79
- package/esm2020/link/link.pipes.mjs +17 -17
- package/esm2020/link/pepperi-addons-ngx-lib-link.mjs +4 -4
- package/esm2020/link/public-api.mjs +5 -5
- package/esm2020/list/list-actions.component.mjs +43 -43
- package/esm2020/list/list-carousel.component.mjs +106 -106
- package/esm2020/list/list-chooser.component.mjs +63 -63
- package/esm2020/list/list-pager.component.mjs +119 -119
- package/esm2020/list/list-sorting.component.mjs +60 -60
- package/esm2020/list/list-total.component.mjs +29 -29
- package/esm2020/list/list-views.component.mjs +84 -84
- package/esm2020/list/list.component.mjs +1162 -1162
- package/esm2020/list/list.model.mjs +3 -3
- package/esm2020/list/list.module.mjs +143 -143
- package/esm2020/list/list.pipes.mjs +46 -46
- package/esm2020/list/pepperi-addons-ngx-lib-list.mjs +4 -4
- package/esm2020/list/public-api.mjs +14 -14
- package/esm2020/list/virtual-scroller.mjs +1061 -1061
- package/esm2020/menu/menu-item.component.mjs +114 -114
- package/esm2020/menu/menu.component.mjs +212 -212
- package/esm2020/menu/menu.model.mjs +18 -18
- package/esm2020/menu/menu.module.mjs +58 -58
- package/esm2020/menu/pepperi-addons-ngx-lib-menu.mjs +4 -4
- package/esm2020/menu/public-api.mjs +6 -6
- package/esm2020/ngx-lib.module.mjs +161 -161
- package/esm2020/page-layout/page-layout.component.mjs +34 -34
- package/esm2020/page-layout/page-layout.module.mjs +33 -33
- package/esm2020/page-layout/pepperi-addons-ngx-lib-page-layout.mjs +4 -4
- package/esm2020/page-layout/public-api.mjs +5 -5
- package/esm2020/pepperi-addons-ngx-lib.mjs +4 -4
- package/esm2020/profile-data-views-list/pepperi-addons-ngx-lib-profile-data-views-list.mjs +4 -4
- package/esm2020/profile-data-views-list/profile-data-view/profile-data-view.component.mjs +44 -44
- package/esm2020/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.mjs +64 -64
- package/esm2020/profile-data-views-list/profile-data-views-list.component.mjs +94 -94
- package/esm2020/profile-data-views-list/profile-data-views-list.model.mjs +1 -1
- package/esm2020/profile-data-views-list/profile-data-views-list.module.mjs +87 -87
- package/esm2020/profile-data-views-list/public-api.mjs +8 -8
- package/esm2020/public-api.mjs +5 -5
- package/esm2020/quantity-selector/pepperi-addons-ngx-lib-quantity-selector.mjs +4 -4
- package/esm2020/quantity-selector/public-api.mjs +5 -5
- package/esm2020/quantity-selector/quantity-selector-validation.directive.mjs +48 -48
- package/esm2020/quantity-selector/quantity-selector.component.mjs +577 -577
- package/esm2020/quantity-selector/quantity-selector.module.mjs +81 -81
- package/esm2020/quantity-selector/quantity-selector.pipes.mjs +22 -22
- package/esm2020/query-builder/common/model/field.mjs +1 -1
- package/esm2020/query-builder/common/model/filter.mjs +1 -1
- package/esm2020/query-builder/common/model/legacy.mjs +1 -1
- package/esm2020/query-builder/common/model/operator-unit.mjs +41 -41
- package/esm2020/query-builder/common/model/operator.mjs +265 -265
- package/esm2020/query-builder/common/model/structure.mjs +1 -1
- package/esm2020/query-builder/common/model/type-map.mjs +26 -26
- package/esm2020/query-builder/common/model/type.mjs +5 -5
- package/esm2020/query-builder/common/services/output-query.service.mjs +113 -113
- package/esm2020/query-builder/common/services/query-structure.service.mjs +225 -225
- package/esm2020/query-builder/common/services/type-convertor.service.mjs +41 -41
- package/esm2020/query-builder/pepperi-addons-ngx-lib-query-builder.mjs +4 -4
- package/esm2020/query-builder/public-api.mjs +8 -8
- package/esm2020/query-builder/query-builder-item/query-builder-item.component.mjs +124 -124
- package/esm2020/query-builder/query-builder-section/query-builder-section.component.mjs +70 -70
- package/esm2020/query-builder/query-builder.component.mjs +109 -109
- package/esm2020/query-builder/query-builder.module.mjs +58 -58
- package/esm2020/query-builder/query-builder.service.mjs +101 -101
- package/esm2020/remote-loader/addon-block-loader.component.mjs +101 -101
- package/esm2020/remote-loader/addon-block-loader.service.mjs +61 -61
- package/esm2020/remote-loader/pepperi-addons-ngx-lib-remote-loader.mjs +4 -4
- package/esm2020/remote-loader/public-api.mjs +10 -10
- package/esm2020/remote-loader/remote-loader-element.component.mjs +104 -104
- package/esm2020/remote-loader/remote-loader.component.mjs +108 -108
- package/esm2020/remote-loader/remote-loader.model.mjs +1 -1
- package/esm2020/remote-loader/remote-loader.module.mjs +68 -68
- package/esm2020/remote-loader/remote-loader.service.mjs +80 -80
- package/esm2020/rich-html-textarea/pepperi-addons-ngx-lib-rich-html-textarea.mjs +4 -4
- package/esm2020/rich-html-textarea/public-api.mjs +5 -5
- package/esm2020/rich-html-textarea/rich-html-textarea.component.mjs +247 -247
- package/esm2020/rich-html-textarea/rich-html-textarea.module.mjs +94 -94
- package/esm2020/search/pepperi-addons-ngx-lib-search.mjs +4 -4
- package/esm2020/search/public-api.mjs +6 -6
- package/esm2020/search/search.component.mjs +316 -316
- package/esm2020/search/search.model.mjs +1 -1
- package/esm2020/search/search.module.mjs +69 -69
- package/esm2020/select/pepperi-addons-ngx-lib-select.mjs +4 -4
- package/esm2020/select/public-api.mjs +5 -5
- package/esm2020/select/select.component.mjs +266 -266
- package/esm2020/select/select.module.mjs +69 -69
- package/esm2020/select-panel/pepperi-addons-ngx-lib-select-panel.mjs +4 -4
- package/esm2020/select-panel/public-api.mjs +6 -6
- package/esm2020/select-panel/select-panel.component.mjs +159 -158
- package/esm2020/select-panel/select-panel.model.mjs +1 -1
- package/esm2020/select-panel/select-panel.module.mjs +69 -69
- package/esm2020/separator/pepperi-addons-ngx-lib-separator.mjs +4 -4
- package/esm2020/separator/public-api.mjs +5 -5
- package/esm2020/separator/separator.component.mjs +62 -62
- package/esm2020/separator/separator.module.mjs +17 -17
- package/esm2020/side-bar/pepperi-addons-ngx-lib-side-bar.mjs +4 -4
- package/esm2020/side-bar/public-api.mjs +6 -6
- package/esm2020/side-bar/side-bar.component.mjs +121 -121
- package/esm2020/side-bar/side-bar.model.mjs +1 -1
- package/esm2020/side-bar/side-bar.module.mjs +54 -54
- package/esm2020/signature/pepperi-addons-ngx-lib-signature.mjs +4 -4
- package/esm2020/signature/public-api.mjs +5 -5
- package/esm2020/signature/signature.component.mjs +253 -253
- package/esm2020/signature/signature.module.mjs +89 -89
- package/esm2020/size-detector/pepperi-addons-ngx-lib-size-detector.mjs +4 -4
- package/esm2020/size-detector/public-api.mjs +5 -5
- package/esm2020/size-detector/size-detector.component.mjs +91 -91
- package/esm2020/size-detector/size-detector.module.mjs +34 -34
- package/esm2020/slider/pepperi-addons-ngx-lib-slider.mjs +4 -4
- package/esm2020/slider/public-api.mjs +5 -5
- package/esm2020/slider/slider.component.mjs +100 -100
- package/esm2020/slider/slider.module.mjs +41 -41
- package/esm2020/smart-filters/boolean-filter/boolean-filter.component.mjs +74 -74
- package/esm2020/smart-filters/common/filter-actions.component.mjs +28 -28
- package/esm2020/smart-filters/common/model/base-filter-component.mjs +295 -295
- package/esm2020/smart-filters/common/model/creator.mjs +75 -75
- package/esm2020/smart-filters/common/model/field.mjs +116 -116
- package/esm2020/smart-filters/common/model/filter.mjs +1 -1
- package/esm2020/smart-filters/common/model/operator.mjs +270 -270
- package/esm2020/smart-filters/common/model/type.mjs +1 -1
- package/esm2020/smart-filters/date-filter/date-filter.component.mjs +181 -181
- package/esm2020/smart-filters/multi-select-filter/multi-select-filter.component.mjs +199 -199
- package/esm2020/smart-filters/number-filter/number-filter.component.mjs +135 -135
- package/esm2020/smart-filters/pepperi-addons-ngx-lib-smart-filters.mjs +4 -4
- package/esm2020/smart-filters/public-api.mjs +18 -18
- package/esm2020/smart-filters/smart-filters.component.mjs +140 -140
- package/esm2020/smart-filters/smart-filters.module.mjs +157 -157
- package/esm2020/smart-filters/text-filter/text-filter.component.mjs +92 -92
- package/esm2020/snack-bar/default-snack-bar.component.mjs +28 -28
- package/esm2020/snack-bar/pepperi-addons-ngx-lib-snack-bar.mjs +4 -4
- package/esm2020/snack-bar/public-api.mjs +7 -7
- package/esm2020/snack-bar/snack-bar.component.mjs +25 -25
- package/esm2020/snack-bar/snack-bar.model.mjs +6 -6
- package/esm2020/snack-bar/snack-bar.module.mjs +62 -62
- package/esm2020/snack-bar/snack-bar.service.mjs +59 -59
- package/esm2020/textarea/pepperi-addons-ngx-lib-textarea.mjs +4 -4
- package/esm2020/textarea/public-api.mjs +5 -5
- package/esm2020/textarea/textarea.component.mjs +188 -182
- package/esm2020/textarea/textarea.module.mjs +81 -81
- package/esm2020/textbox/pepperi-addons-ngx-lib-textbox.mjs +4 -4
- package/esm2020/textbox/public-api.mjs +5 -5
- package/esm2020/textbox/textbox-validation.directive.mjs +92 -92
- package/esm2020/textbox/textbox.component.mjs +552 -546
- package/esm2020/textbox/textbox.module.mjs +71 -71
- package/esm2020/textbox-icon/pepperi-addons-ngx-lib-textbox-icon.mjs +4 -4
- package/esm2020/textbox-icon/public-api.mjs +5 -5
- package/esm2020/textbox-icon/textbox-icon.component.mjs +47 -47
- package/esm2020/textbox-icon/textbox-icon.module.mjs +63 -63
- package/esm2020/top-bar/pepperi-addons-ngx-lib-top-bar.mjs +4 -4
- package/esm2020/top-bar/public-api.mjs +6 -6
- package/esm2020/top-bar/top-bar.component.mjs +111 -111
- package/esm2020/top-bar/top-bar.model.mjs +1 -1
- package/esm2020/top-bar/top-bar.module.mjs +61 -61
- package/fesm2015/pepperi-addons-ngx-lib-address.mjs +143 -143
- package/fesm2015/pepperi-addons-ngx-lib-address.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-attachment.mjs +253 -253
- package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.mjs +122 -122
- package/fesm2015/pepperi-addons-ngx-lib-button.mjs +171 -171
- package/fesm2015/pepperi-addons-ngx-lib-carousel.mjs +780 -780
- package/fesm2015/pepperi-addons-ngx-lib-checkbox.mjs +206 -206
- package/fesm2015/pepperi-addons-ngx-lib-chips.mjs +255 -255
- package/fesm2015/pepperi-addons-ngx-lib-color.mjs +336 -336
- package/fesm2015/pepperi-addons-ngx-lib-color.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-date.mjs +409 -409
- package/fesm2015/pepperi-addons-ngx-lib-dialog.mjs +207 -207
- package/fesm2015/pepperi-addons-ngx-lib-draggable-items.mjs +163 -163
- package/fesm2015/pepperi-addons-ngx-lib-field-title.mjs +76 -76
- package/fesm2015/pepperi-addons-ngx-lib-files-uploader.mjs +291 -291
- package/fesm2015/pepperi-addons-ngx-lib-form.mjs +4121 -4121
- package/fesm2015/pepperi-addons-ngx-lib-form.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-group-buttons.mjs +109 -109
- package/fesm2015/pepperi-addons-ngx-lib-icon.mjs +702 -702
- package/fesm2015/pepperi-addons-ngx-lib-image.mjs +340 -340
- package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.mjs +390 -390
- package/fesm2015/pepperi-addons-ngx-lib-link.mjs +388 -388
- package/fesm2015/pepperi-addons-ngx-lib-list.mjs +2826 -2826
- package/fesm2015/pepperi-addons-ngx-lib-list.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-menu.mjs +368 -368
- package/fesm2015/pepperi-addons-ngx-lib-page-layout.mjs +59 -59
- package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.mjs +254 -254
- package/fesm2015/pepperi-addons-ngx-lib-quantity-selector.mjs +689 -689
- package/fesm2015/pepperi-addons-ngx-lib-query-builder.mjs +1119 -1119
- package/fesm2015/pepperi-addons-ngx-lib-remote-loader.mjs +504 -504
- package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.mjs +303 -303
- package/fesm2015/pepperi-addons-ngx-lib-search.mjs +356 -356
- package/fesm2015/pepperi-addons-ngx-lib-select-panel.mjs +207 -206
- package/fesm2015/pepperi-addons-ngx-lib-select-panel.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-select.mjs +308 -308
- package/fesm2015/pepperi-addons-ngx-lib-separator.mjs +73 -73
- package/fesm2015/pepperi-addons-ngx-lib-side-bar.mjs +158 -158
- package/fesm2015/pepperi-addons-ngx-lib-signature.mjs +311 -311
- package/fesm2015/pepperi-addons-ngx-lib-size-detector.mjs +114 -114
- package/fesm2015/pepperi-addons-ngx-lib-slider.mjs +130 -130
- package/fesm2015/pepperi-addons-ngx-lib-smart-filters.mjs +1634 -1634
- package/fesm2015/pepperi-addons-ngx-lib-smart-filters.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-snack-bar.mjs +152 -152
- package/fesm2015/pepperi-addons-ngx-lib-textarea.mjs +238 -232
- package/fesm2015/pepperi-addons-ngx-lib-textarea.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-textbox-icon.mjs +95 -95
- package/fesm2015/pepperi-addons-ngx-lib-textbox.mjs +679 -673
- package/fesm2015/pepperi-addons-ngx-lib-textbox.mjs.map +1 -1
- package/fesm2015/pepperi-addons-ngx-lib-top-bar.mjs +155 -155
- package/fesm2015/pepperi-addons-ngx-lib.mjs +4615 -4615
- package/fesm2015/pepperi-addons-ngx-lib.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-address.mjs +143 -143
- package/fesm2020/pepperi-addons-ngx-lib-address.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-attachment.mjs +253 -253
- package/fesm2020/pepperi-addons-ngx-lib-bread-crumbs.mjs +122 -122
- package/fesm2020/pepperi-addons-ngx-lib-button.mjs +171 -171
- package/fesm2020/pepperi-addons-ngx-lib-carousel.mjs +776 -776
- package/fesm2020/pepperi-addons-ngx-lib-checkbox.mjs +206 -206
- package/fesm2020/pepperi-addons-ngx-lib-chips.mjs +254 -254
- package/fesm2020/pepperi-addons-ngx-lib-color.mjs +333 -333
- package/fesm2020/pepperi-addons-ngx-lib-color.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-date.mjs +405 -405
- package/fesm2020/pepperi-addons-ngx-lib-dialog.mjs +203 -203
- package/fesm2020/pepperi-addons-ngx-lib-draggable-items.mjs +162 -162
- package/fesm2020/pepperi-addons-ngx-lib-field-title.mjs +76 -76
- package/fesm2020/pepperi-addons-ngx-lib-files-uploader.mjs +288 -288
- package/fesm2020/pepperi-addons-ngx-lib-form.mjs +4120 -4120
- package/fesm2020/pepperi-addons-ngx-lib-form.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-group-buttons.mjs +109 -109
- package/fesm2020/pepperi-addons-ngx-lib-icon.mjs +700 -700
- package/fesm2020/pepperi-addons-ngx-lib-image.mjs +338 -338
- package/fesm2020/pepperi-addons-ngx-lib-images-filmstrip.mjs +387 -387
- package/fesm2020/pepperi-addons-ngx-lib-link.mjs +388 -388
- package/fesm2020/pepperi-addons-ngx-lib-list.mjs +2812 -2812
- package/fesm2020/pepperi-addons-ngx-lib-list.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-menu.mjs +368 -368
- package/fesm2020/pepperi-addons-ngx-lib-page-layout.mjs +59 -59
- package/fesm2020/pepperi-addons-ngx-lib-profile-data-views-list.mjs +253 -253
- package/fesm2020/pepperi-addons-ngx-lib-quantity-selector.mjs +688 -688
- package/fesm2020/pepperi-addons-ngx-lib-query-builder.mjs +1108 -1108
- package/fesm2020/pepperi-addons-ngx-lib-remote-loader.mjs +482 -482
- package/fesm2020/pepperi-addons-ngx-lib-rich-html-textarea.mjs +303 -303
- package/fesm2020/pepperi-addons-ngx-lib-search.mjs +355 -355
- package/fesm2020/pepperi-addons-ngx-lib-select-panel.mjs +206 -205
- package/fesm2020/pepperi-addons-ngx-lib-select-panel.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-select.mjs +308 -308
- package/fesm2020/pepperi-addons-ngx-lib-separator.mjs +73 -73
- package/fesm2020/pepperi-addons-ngx-lib-side-bar.mjs +158 -158
- package/fesm2020/pepperi-addons-ngx-lib-signature.mjs +311 -311
- package/fesm2020/pepperi-addons-ngx-lib-size-detector.mjs +114 -114
- package/fesm2020/pepperi-addons-ngx-lib-slider.mjs +129 -129
- package/fesm2020/pepperi-addons-ngx-lib-smart-filters.mjs +1627 -1627
- package/fesm2020/pepperi-addons-ngx-lib-smart-filters.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-snack-bar.mjs +149 -149
- package/fesm2020/pepperi-addons-ngx-lib-textarea.mjs +237 -231
- package/fesm2020/pepperi-addons-ngx-lib-textarea.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-textbox-icon.mjs +95 -95
- package/fesm2020/pepperi-addons-ngx-lib-textbox.mjs +679 -673
- package/fesm2020/pepperi-addons-ngx-lib-textbox.mjs.map +1 -1
- package/fesm2020/pepperi-addons-ngx-lib-top-bar.mjs +154 -154
- package/fesm2020/pepperi-addons-ngx-lib.mjs +4585 -4585
- package/fesm2020/pepperi-addons-ngx-lib.mjs.map +1 -1
- package/field-title/field-title.component.d.ts +15 -15
- package/field-title/field-title.module.d.ts +15 -15
- package/field-title/index.d.ts +5 -5
- package/field-title/public-api.d.ts +2 -2
- package/files-uploader/files-uploader.component.d.ts +57 -57
- package/files-uploader/files-uploader.module.d.ts +21 -21
- package/files-uploader/index.d.ts +5 -5
- package/files-uploader/public-api.d.ts +2 -2
- package/form/field-generator.component.d.ts +39 -39
- package/form/form.component.d.ts +93 -93
- package/form/form.model.d.ts +20 -20
- package/form/form.module.d.ts +50 -50
- package/form/index.d.ts +5 -5
- package/form/indicators.component.d.ts +10 -10
- package/form/internal-button.component.d.ts +42 -42
- package/form/internal-carusel.component.d.ts +39 -39
- package/form/internal-carusel.service.d.ts +10 -10
- package/form/internal-field-generator.component.d.ts +35 -35
- package/form/internal-form.component.d.ts +89 -89
- package/form/internal-list.component.d.ts +95 -95
- package/form/internal-menu.component.d.ts +19 -19
- package/form/internal-page.component.d.ts +73 -73
- package/form/internal-page.service.d.ts +22 -22
- package/form/public-api.d.ts +3 -3
- package/group-buttons/group-buttons.component.d.ts +24 -24
- package/group-buttons/group-buttons.module.d.ts +18 -18
- package/group-buttons/index.d.ts +5 -5
- package/group-buttons/public-api.d.ts +2 -2
- package/icon/icon-generated-all.model.d.ts +112 -112
- package/icon/icon-generated.model.d.ts +446 -446
- package/icon/icon-registry.service.d.ts +9 -9
- package/icon/icon.component.d.ts +49 -49
- package/icon/icon.module.d.ts +7 -7
- package/icon/icon.service.d.ts +13 -13
- package/icon/index.d.ts +5 -5
- package/icon/public-api.d.ts +6 -6
- package/image/image.component.d.ts +66 -66
- package/image/image.module.d.ts +20 -20
- package/image/image.service.d.ts +14 -14
- package/image/index.d.ts +5 -5
- package/image/public-api.d.ts +3 -3
- package/images-filmstrip/images-filmstrip.component.d.ts +87 -87
- package/images-filmstrip/images-filmstrip.module.d.ts +22 -22
- package/images-filmstrip/index.d.ts +5 -5
- package/images-filmstrip/public-api.d.ts +2 -2
- package/index.d.ts +5 -5
- package/link/index.d.ts +5 -5
- package/link/link.component.d.ts +126 -126
- package/link/link.module.d.ts +22 -22
- package/link/link.pipes.d.ts +7 -7
- package/link/public-api.d.ts +2 -2
- package/list/index.d.ts +5 -5
- package/list/list-actions.component.d.ts +18 -18
- package/list/list-carousel.component.d.ts +40 -40
- package/list/list-chooser.component.d.ts +29 -29
- package/list/list-pager.component.d.ts +39 -39
- package/list/list-sorting.component.d.ts +30 -30
- package/list/list-total.component.d.ts +11 -11
- package/list/list-views.component.d.ts +35 -35
- package/list/list.component.d.ts +164 -164
- package/list/list.model.d.ts +31 -31
- package/list/list.module.d.ts +34 -34
- package/list/list.pipes.d.ts +16 -16
- package/list/public-api.d.ts +10 -10
- package/list/virtual-scroller.d.ts +183 -183
- package/menu/index.d.ts +5 -5
- package/menu/menu-item.component.d.ts +28 -28
- package/menu/menu.component.d.ts +48 -48
- package/menu/menu.model.d.ts +25 -25
- package/menu/menu.module.d.ts +18 -18
- package/menu/public-api.d.ts +3 -3
- package/ngx-lib.module.d.ts +24 -24
- package/package.json +1 -1
- package/page-layout/index.d.ts +5 -5
- package/page-layout/page-layout.component.d.ts +19 -19
- package/page-layout/page-layout.module.d.ts +10 -10
- package/page-layout/public-api.d.ts +2 -2
- package/profile-data-views-list/index.d.ts +5 -5
- package/profile-data-views-list/profile-data-view/profile-data-view.component.d.ts +18 -18
- package/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.d.ts +24 -24
- package/profile-data-views-list/profile-data-views-list.component.d.ts +35 -35
- package/profile-data-views-list/profile-data-views-list.model.d.ts +18 -18
- package/profile-data-views-list/profile-data-views-list.module.d.ts +23 -23
- package/profile-data-views-list/public-api.d.ts +5 -5
- package/public-api.d.ts +2 -2
- package/quantity-selector/index.d.ts +5 -5
- package/quantity-selector/public-api.d.ts +2 -2
- package/quantity-selector/quantity-selector-validation.directive.d.ts +17 -17
- package/quantity-selector/quantity-selector.component.d.ts +112 -112
- package/quantity-selector/quantity-selector.module.d.ts +23 -23
- package/quantity-selector/quantity-selector.pipes.d.ts +7 -7
- package/query-builder/common/model/field.d.ts +8 -8
- package/query-builder/common/model/filter.d.ts +6 -6
- package/query-builder/common/model/legacy.d.ts +29 -29
- package/query-builder/common/model/operator-unit.d.ts +13 -13
- package/query-builder/common/model/operator.d.ts +21 -21
- package/query-builder/common/model/structure.d.ts +4 -4
- package/query-builder/common/model/type-map.d.ts +12 -12
- package/query-builder/common/model/type.d.ts +4 -4
- package/query-builder/common/services/output-query.service.d.ts +47 -47
- package/query-builder/common/services/query-structure.service.d.ts +82 -82
- package/query-builder/common/services/type-convertor.service.d.ts +13 -13
- package/query-builder/index.d.ts +5 -5
- package/query-builder/public-api.d.ts +5 -5
- package/query-builder/query-builder-item/query-builder-item.component.d.ts +41 -41
- package/query-builder/query-builder-section/query-builder-section.component.d.ts +30 -30
- package/query-builder/query-builder.component.d.ts +39 -39
- package/query-builder/query-builder.module.d.ts +16 -16
- package/query-builder/query-builder.service.d.ts +30 -30
- package/remote-loader/addon-block-loader.component.d.ts +36 -36
- package/remote-loader/addon-block-loader.service.d.ts +15 -15
- package/remote-loader/index.d.ts +5 -5
- package/remote-loader/public-api.d.ts +7 -7
- package/remote-loader/remote-loader-element.component.d.ts +30 -30
- package/remote-loader/remote-loader.component.d.ts +25 -25
- package/remote-loader/remote-loader.model.d.ts +41 -41
- package/remote-loader/remote-loader.module.d.ts +15 -15
- package/remote-loader/remote-loader.service.d.ts +15 -15
- package/rich-html-textarea/index.d.ts +5 -5
- package/rich-html-textarea/public-api.d.ts +2 -2
- package/rich-html-textarea/rich-html-textarea.component.d.ts +79 -79
- package/rich-html-textarea/rich-html-textarea.module.d.ts +25 -25
- package/search/index.d.ts +5 -5
- package/search/public-api.d.ts +3 -3
- package/search/search.component.d.ts +65 -65
- package/search/search.model.d.ts +14 -14
- package/search/search.module.d.ts +20 -20
- package/select/index.d.ts +5 -5
- package/select/public-api.d.ts +2 -2
- package/select/select.component.d.ts +60 -60
- package/select/select.module.d.ts +20 -20
- package/select-panel/index.d.ts +5 -5
- package/select-panel/public-api.d.ts +3 -3
- package/select-panel/select-panel.component.d.ts +51 -50
- package/select-panel/select-panel.model.d.ts +5 -5
- package/select-panel/select-panel.module.d.ts +19 -19
- package/separator/index.d.ts +5 -5
- package/separator/public-api.d.ts +2 -2
- package/separator/separator.component.d.ts +22 -22
- package/separator/separator.module.d.ts +8 -8
- package/side-bar/index.d.ts +5 -5
- package/side-bar/public-api.d.ts +3 -3
- package/side-bar/side-bar.component.d.ts +42 -42
- package/side-bar/side-bar.model.d.ts +4 -4
- package/side-bar/side-bar.module.d.ts +16 -16
- package/signature/index.d.ts +5 -5
- package/signature/public-api.d.ts +2 -2
- package/signature/signature.component.d.ts +68 -68
- package/signature/signature.module.d.ts +24 -24
- package/size-detector/index.d.ts +5 -5
- package/size-detector/public-api.d.ts +2 -2
- package/size-detector/size-detector.component.d.ts +29 -29
- package/size-detector/size-detector.module.d.ts +11 -11
- package/slider/index.d.ts +5 -5
- package/slider/public-api.d.ts +2 -2
- package/slider/slider.component.d.ts +39 -39
- package/slider/slider.module.d.ts +12 -12
- package/smart-filters/boolean-filter/boolean-filter.component.d.ts +28 -28
- package/smart-filters/common/filter-actions.component.d.ts +12 -12
- package/smart-filters/common/model/base-filter-component.d.ts +74 -74
- package/smart-filters/common/model/creator.d.ts +6 -6
- package/smart-filters/common/model/field.d.ts +69 -69
- package/smart-filters/common/model/filter.d.ts +11 -11
- package/smart-filters/common/model/operator.d.ts +51 -51
- package/smart-filters/common/model/type.d.ts +4 -4
- package/smart-filters/date-filter/date-filter.component.d.ts +60 -60
- package/smart-filters/index.d.ts +5 -5
- package/smart-filters/multi-select-filter/multi-select-filter.component.d.ts +56 -56
- package/smart-filters/number-filter/number-filter.component.d.ts +52 -52
- package/smart-filters/public-api.d.ts +14 -14
- package/smart-filters/smart-filters.component.d.ts +35 -35
- package/smart-filters/smart-filters.module.d.ts +37 -37
- package/smart-filters/text-filter/text-filter.component.d.ts +28 -28
- package/snack-bar/default-snack-bar.component.d.ts +13 -13
- package/snack-bar/index.d.ts +5 -5
- package/snack-bar/public-api.d.ts +4 -4
- package/snack-bar/snack-bar.component.d.ts +12 -12
- package/snack-bar/snack-bar.model.d.ts +8 -8
- package/snack-bar/snack-bar.module.d.ts +19 -19
- package/snack-bar/snack-bar.service.d.ts +24 -24
- package/textarea/index.d.ts +5 -5
- package/textarea/public-api.d.ts +2 -2
- package/textarea/textarea.component.d.ts +56 -54
- package/textarea/textarea.module.d.ts +23 -23
- package/textbox/index.d.ts +5 -5
- package/textbox/public-api.d.ts +2 -2
- package/textbox/textbox-validation.directive.d.ts +22 -22
- package/textbox/textbox.component.d.ts +155 -153
- package/textbox/textbox.module.d.ts +22 -22
- package/textbox-icon/index.d.ts +5 -5
- package/textbox-icon/public-api.d.ts +2 -2
- package/textbox-icon/textbox-icon.component.d.ts +13 -13
- package/textbox-icon/textbox-icon.module.d.ts +16 -16
- package/top-bar/index.d.ts +5 -5
- package/top-bar/public-api.d.ts +3 -3
- package/top-bar/top-bar.component.d.ts +39 -39
- package/top-bar/top-bar.model.d.ts +4 -4
- package/top-bar/top-bar.module.d.ts +18 -18
|
@@ -1,513 +1,513 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter, ViewChild, } from '@angular/core';
|
|
2
|
-
import { FIELD_TYPE, } from '@pepperi-addons/ngx-lib';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@pepperi-addons/ngx-lib";
|
|
5
|
-
import * as i2 from "@angular/common";
|
|
6
|
-
import * as i3 from "./internal-form.component";
|
|
7
|
-
import * as i4 from "@ngx-translate/core";
|
|
8
|
-
export class PepInternalListComponent {
|
|
9
|
-
constructor(element, layoutService, cd, renderer) {
|
|
10
|
-
this.element = element;
|
|
11
|
-
this.layoutService = layoutService;
|
|
12
|
-
this.cd = cd;
|
|
13
|
-
this.renderer = renderer;
|
|
14
|
-
this.noDataFoundMsg = 'Items not found';
|
|
15
|
-
this.hideAllSelectionInMulti = false;
|
|
16
|
-
this.top = -1;
|
|
17
|
-
this.objectId = '0';
|
|
18
|
-
this.parentId = '0';
|
|
19
|
-
this.searchCode = '0';
|
|
20
|
-
// @Input() showTopBorder = false;
|
|
21
|
-
this.supportResizing = true;
|
|
22
|
-
this.parentScroll = null;
|
|
23
|
-
this.disabled = false;
|
|
24
|
-
this.disableEvents = false;
|
|
25
|
-
this.disableSelectionItems = false;
|
|
26
|
-
this.totalsRow = [];
|
|
27
|
-
// @Output()
|
|
28
|
-
// itemClick: EventEmitter<IPepListItemClickEvent> = new EventEmitter<IPepListItemClickEvent>();
|
|
29
|
-
this.fieldClick = new EventEmitter();
|
|
30
|
-
this.valueChange = new EventEmitter();
|
|
31
|
-
this.uiControl = null;
|
|
32
|
-
this.totalRows = -1;
|
|
33
|
-
this.isTable = false;
|
|
34
|
-
this.hasColumnWidthOfTypePercentage = true;
|
|
35
|
-
this._items = null;
|
|
36
|
-
// isCardView = false;
|
|
37
|
-
this.itemsCounter = 0;
|
|
38
|
-
this.showItems = true;
|
|
39
|
-
this.SEPARATOR = ',';
|
|
40
|
-
this.nativeWindow = null;
|
|
41
|
-
this.selectedItemId = '';
|
|
42
|
-
this.hoveredItemId = '';
|
|
43
|
-
this.lockEvents = false;
|
|
44
|
-
this.containerWidth = 0;
|
|
45
|
-
this.deviceHasMouse = false;
|
|
46
|
-
// headerIsInFocus = false;
|
|
47
|
-
// For resize
|
|
48
|
-
this.pressedColumn = '';
|
|
49
|
-
this.startX = 0;
|
|
50
|
-
this.startWidth = 0;
|
|
51
|
-
this.tableStartWidth = 0;
|
|
52
|
-
this.isUserSelected = false;
|
|
53
|
-
this.checkForChanges = null;
|
|
54
|
-
this.useVirtualScroll = true;
|
|
55
|
-
this.nativeWindow = window;
|
|
56
|
-
this.deviceHasMouse = this.layoutService.getDeviceHasMouse();
|
|
57
|
-
this.layoutService.onMouseOver$.subscribe((deviceHasMouse) => {
|
|
58
|
-
this.deviceHasMouse = deviceHasMouse;
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
get items() {
|
|
62
|
-
return this._items;
|
|
63
|
-
}
|
|
64
|
-
ngOnInit() {
|
|
65
|
-
this.containerWidth = 0;
|
|
66
|
-
}
|
|
67
|
-
ngOnChanges(changes) {
|
|
68
|
-
if (this.containerWidth <= 0) {
|
|
69
|
-
this.setContainerWidth();
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
ngOnDestroy() {
|
|
73
|
-
// if (this.valueChange) {
|
|
74
|
-
// this.valueChange.unsubscribe();
|
|
75
|
-
// }
|
|
76
|
-
// if (this.itemClick) {
|
|
77
|
-
// this.itemClick.unsubscribe();
|
|
78
|
-
// }
|
|
79
|
-
// if (this.fieldClick) {
|
|
80
|
-
// this.fieldClick.unsubscribe();
|
|
81
|
-
// }
|
|
82
|
-
}
|
|
83
|
-
setContainerWidth() {
|
|
84
|
-
if (!this.element.nativeElement.parentElement) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
const selectionCheckBoxWidth = 0;
|
|
88
|
-
const rowHeight = 40; // the table row height (2.5rem * 16font-size).
|
|
89
|
-
const style = getComputedStyle(this.element.nativeElement.parentElement);
|
|
90
|
-
// The container-fluid class padding left + right + border
|
|
91
|
-
const containerFluidSpacing = parseInt(style.paddingLeft, 10) + parseInt(style.paddingRight, 10);
|
|
92
|
-
const parentContainer = this.element.nativeElement.parentElement.parentElement > 0
|
|
93
|
-
? this.element.nativeElement.parentElement.parentElement
|
|
94
|
-
: this.element.nativeElement.parentElement;
|
|
95
|
-
// Calculate if vertical scroll should appear, if so set the scroll width. (this.totalRows + 1) + 1 is for the header row.
|
|
96
|
-
const scrollWidth = parentContainer.clientHeight < rowHeight * (this.totalRows + 1)
|
|
97
|
-
? 18
|
|
98
|
-
: 0; // 18 is the default scroll width.
|
|
99
|
-
// The selectionCheckBoxWidth width + containerFluidSpacing + scrollWidth.
|
|
100
|
-
const rowHeaderWidthToSub = containerFluidSpacing + selectionCheckBoxWidth + scrollWidth;
|
|
101
|
-
this.containerWidth = parentContainer.offsetWidth - rowHeaderWidthToSub;
|
|
102
|
-
}
|
|
103
|
-
clear() {
|
|
104
|
-
this.cleanItems();
|
|
105
|
-
this.uiControl = null;
|
|
106
|
-
}
|
|
107
|
-
toggleItems(isVisible) {
|
|
108
|
-
this.showItems = isVisible;
|
|
109
|
-
this.lockEvents = !isVisible;
|
|
110
|
-
}
|
|
111
|
-
updateScrollItems(startIndex, endIndex, loadInChunks = true) {
|
|
112
|
-
this.scrollItems = this.items.slice(startIndex, endIndex);
|
|
113
|
-
}
|
|
114
|
-
getUniqItemId(itemId, itemType = '') {
|
|
115
|
-
return itemId + this.SEPARATOR + itemType;
|
|
116
|
-
}
|
|
117
|
-
setLayout() {
|
|
118
|
-
if (this.totalRows === 0 ||
|
|
119
|
-
!this.uiControl ||
|
|
120
|
-
!this.uiControl.ControlFields ||
|
|
121
|
-
this.uiControl.ControlFields.length === 0) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
this.uiControl.ControlFields.forEach((cf) => {
|
|
125
|
-
if (cf.ColumnWidth === 0) {
|
|
126
|
-
cf.ColumnWidth = 10;
|
|
127
|
-
}
|
|
128
|
-
if (this.isTable &&
|
|
129
|
-
(cf.FieldType === FIELD_TYPE.Image ||
|
|
130
|
-
// cf.FieldType === FIELD_TYPE.Indicators || ???
|
|
131
|
-
cf.FieldType === FIELD_TYPE.Signature ||
|
|
132
|
-
cf.FieldType === FIELD_TYPE.NumberIntegerQuantitySelector ||
|
|
133
|
-
cf.FieldType === FIELD_TYPE.NumberRealQuantitySelector ||
|
|
134
|
-
cf.FieldType === FIELD_TYPE.NumberIntegerForMatrix ||
|
|
135
|
-
cf.FieldType === FIELD_TYPE.NumberRealForMatrix ||
|
|
136
|
-
cf.FieldType === FIELD_TYPE.Package ||
|
|
137
|
-
cf.ApiName === 'UnitsQuantity' ||
|
|
138
|
-
cf.ApiName === 'QuantitySelector')) {
|
|
139
|
-
cf.Layout.XAlignment = 3;
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
if (!this.cd['destroyed']) {
|
|
143
|
-
this.cd.detectChanges();
|
|
144
|
-
}
|
|
145
|
-
// Set the columns width.
|
|
146
|
-
if (this.containerWidth <= 0) {
|
|
147
|
-
this.setContainerWidth();
|
|
148
|
-
}
|
|
149
|
-
this.calcColumnsWidth();
|
|
150
|
-
this.checkForChanges = new Date().getTime();
|
|
151
|
-
}
|
|
152
|
-
calcColumnsWidth() {
|
|
153
|
-
const fixedMultiple = 3.78; // for converting em to pixel.
|
|
154
|
-
const length = this.uiControl.ControlFields.length;
|
|
155
|
-
const selectionCheckBoxWidth = 0;
|
|
156
|
-
// Is table AND there is at least one column of width type of percentage.
|
|
157
|
-
if (this.isTable) {
|
|
158
|
-
if (this.uiControl && this.uiControl.ControlFields) {
|
|
159
|
-
this.hasColumnWidthOfTypePercentage =
|
|
160
|
-
this.uiControl.ControlFields.filter((cf) => cf.ColumnWidthType === 1).length === 0;
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
// If the columns size is fixed and the total is small then the container change it to percentage.
|
|
164
|
-
if (!this.hasColumnWidthOfTypePercentage) {
|
|
165
|
-
const totalFixedColsWidth = this.uiControl.ControlFields.map((cf) => cf.ColumnWidth * fixedMultiple).reduce((sum, current) => sum + current);
|
|
166
|
-
if (window.innerWidth > totalFixedColsWidth) {
|
|
167
|
-
this.hasColumnWidthOfTypePercentage = true;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
let totalCalcColsWidth = 0;
|
|
171
|
-
// Calc by percentage
|
|
172
|
-
if (this.hasColumnWidthOfTypePercentage) {
|
|
173
|
-
const totalColsWidth = this.uiControl.ControlFields.map((cf) => cf.ColumnWidth).reduce((sum, current) => sum + current);
|
|
174
|
-
for (let index = 0; index < length; index++) {
|
|
175
|
-
const uiControlField = this.uiControl
|
|
176
|
-
.ControlFields[index];
|
|
177
|
-
const calcColumnWidthPercentage = (100 / totalColsWidth) * uiControlField.ColumnWidth;
|
|
178
|
-
uiControlField.calcColumnWidth = Math.floor((this.containerWidth * calcColumnWidthPercentage) / 100);
|
|
179
|
-
if (index === length - 1) {
|
|
180
|
-
uiControlField.calcTitleColumnWidthString = uiControlField.calcColumnWidthString =
|
|
181
|
-
'calc(100% - ' + totalCalcColsWidth + 'px)'; // For 100%
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
uiControlField.calcTitleColumnWidthString = uiControlField.calcColumnWidthString =
|
|
185
|
-
uiControlField.calcColumnWidth + 'px';
|
|
186
|
-
totalCalcColsWidth += uiControlField.calcColumnWidth;
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
this.renderer.setStyle(this.element.nativeElement, 'width', 'inherit');
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
for (let index = 0; index < length; index++) {
|
|
193
|
-
const uiControlField = this.uiControl
|
|
194
|
-
.ControlFields[index];
|
|
195
|
-
const currentFixedWidth = Math.floor(uiControlField.ColumnWidth * fixedMultiple);
|
|
196
|
-
if (index === length - 1) {
|
|
197
|
-
uiControlField.calcTitleColumnWidthString =
|
|
198
|
-
currentFixedWidth + 'px';
|
|
199
|
-
uiControlField.calcColumnWidthString =
|
|
200
|
-
currentFixedWidth - 4 + 'px'; // -4 for the row padding.
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
uiControlField.calcTitleColumnWidthString = uiControlField.calcColumnWidthString =
|
|
204
|
-
currentFixedWidth + 'px';
|
|
205
|
-
}
|
|
206
|
-
totalCalcColsWidth += currentFixedWidth;
|
|
207
|
-
}
|
|
208
|
-
this.renderer.setStyle(this.element.nativeElement, 'width', totalCalcColsWidth + selectionCheckBoxWidth + 'px');
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
initResizeData() {
|
|
212
|
-
this.startX = 0;
|
|
213
|
-
this.startWidth = 0;
|
|
214
|
-
this.tableStartWidth = 0;
|
|
215
|
-
this.pressedColumn = '';
|
|
216
|
-
}
|
|
217
|
-
onListResizeStart(event, columnKey) {
|
|
218
|
-
this.pressedColumn = columnKey;
|
|
219
|
-
this.startX = event.x;
|
|
220
|
-
this.startWidth = event.target.closest('.header-column').offsetWidth;
|
|
221
|
-
// Set the tableStartWidth to the container offsetWidth
|
|
222
|
-
this.tableStartWidth = this.noVirtualScrollCont.nativeElement.offsetWidth;
|
|
223
|
-
}
|
|
224
|
-
onListResize(event) {
|
|
225
|
-
if (this.pressedColumn.length > 0) {
|
|
226
|
-
const widthToAdd = this.layoutService.isRtl()
|
|
227
|
-
? this.startX - event.x
|
|
228
|
-
: event.x - this.startX;
|
|
229
|
-
// Set the width of the column and the container of the whole columns.
|
|
230
|
-
if (this.startWidth + widthToAdd >= 48 || widthToAdd > 0) {
|
|
231
|
-
const length = this.uiControl.ControlFields.length;
|
|
232
|
-
let totalCalcColsWidth = 0;
|
|
233
|
-
for (let index = 0; index < length; index++) {
|
|
234
|
-
const uiControlField = this.uiControl
|
|
235
|
-
.ControlFields[index];
|
|
236
|
-
if (index === length - 1) {
|
|
237
|
-
// Calc the last column only in percentage type.
|
|
238
|
-
if (this.hasColumnWidthOfTypePercentage) {
|
|
239
|
-
uiControlField.calcTitleColumnWidthString = uiControlField.calcColumnWidthString =
|
|
240
|
-
'calc(100% - ' + totalCalcColsWidth + 'px)'; // For 100%
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
if (uiControlField.ApiName === this.pressedColumn) {
|
|
244
|
-
uiControlField.calcColumnWidth =
|
|
245
|
-
this.startWidth + widthToAdd;
|
|
246
|
-
uiControlField.calcTitleColumnWidthString =
|
|
247
|
-
uiControlField.calcColumnWidth + 'px';
|
|
248
|
-
uiControlField.calcColumnWidthString =
|
|
249
|
-
uiControlField.calcColumnWidth - 4 + 'px';
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
else if (uiControlField.ApiName === this.pressedColumn) {
|
|
254
|
-
uiControlField.calcColumnWidth =
|
|
255
|
-
this.startWidth + widthToAdd;
|
|
256
|
-
uiControlField.calcTitleColumnWidthString = uiControlField.calcColumnWidthString =
|
|
257
|
-
uiControlField.calcColumnWidth + 'px';
|
|
258
|
-
}
|
|
259
|
-
totalCalcColsWidth += uiControlField.calcColumnWidth;
|
|
260
|
-
}
|
|
261
|
-
this.renderer.setStyle(this.element.nativeElement, 'width', this.tableStartWidth + widthToAdd + 'px');
|
|
262
|
-
}
|
|
263
|
-
this.checkForChanges = new Date().getTime();
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
getParent(el, parentSelector) {
|
|
267
|
-
// If no parentSelector defined will bubble up all the way to *document*
|
|
268
|
-
if (parentSelector === undefined) {
|
|
269
|
-
parentSelector = document;
|
|
270
|
-
}
|
|
271
|
-
const parent = [];
|
|
272
|
-
let p = el.parentNode;
|
|
273
|
-
while (p &&
|
|
274
|
-
p.className !== '' &&
|
|
275
|
-
p.className.indexOf(parentSelector) === -1 &&
|
|
276
|
-
parentSelector !== document) {
|
|
277
|
-
const o = p;
|
|
278
|
-
p = o.parentNode;
|
|
279
|
-
}
|
|
280
|
-
if (p.className.indexOf(parentSelector) > -1) {
|
|
281
|
-
parent.push(p); // Push that parentSelector you wanted to stop at
|
|
282
|
-
}
|
|
283
|
-
return parent;
|
|
284
|
-
}
|
|
285
|
-
onListResizeEnd(event) {
|
|
286
|
-
if (this.pressedColumn.length > 0) {
|
|
287
|
-
if (event &&
|
|
288
|
-
this.getParent(event.srcElement, 'resize-box').length > 0) {
|
|
289
|
-
this.initResizeData();
|
|
290
|
-
}
|
|
291
|
-
else {
|
|
292
|
-
setTimeout(() => {
|
|
293
|
-
this.initResizeData();
|
|
294
|
-
}, 0);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
onListHeaderMouseEnter(event) {
|
|
299
|
-
// this.headerIsInFocus = true;
|
|
300
|
-
}
|
|
301
|
-
onListHeaderMouseLeave(event) {
|
|
302
|
-
// this.headerIsInFocus = false;
|
|
303
|
-
this.onListResizeEnd(event);
|
|
304
|
-
this.initResizeData();
|
|
305
|
-
}
|
|
306
|
-
onListChange(event) {
|
|
307
|
-
if (this.disableEvents) {
|
|
308
|
-
return;
|
|
309
|
-
}
|
|
310
|
-
// For other events do nothing.
|
|
311
|
-
if (typeof event.start === 'undefined' ||
|
|
312
|
-
typeof event.end === 'undefined') {
|
|
313
|
-
return;
|
|
314
|
-
}
|
|
315
|
-
this.calculatedObjectHeight = event.calculatedChildHeight + 'px';
|
|
316
|
-
if (!this.lockEvents) {
|
|
317
|
-
this.toggleItems(false);
|
|
318
|
-
this.updateScrollItems(event.start, event.end, false);
|
|
319
|
-
this.toggleItems(true);
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
getParentContainer() {
|
|
323
|
-
return this.parentScroll ? this.parentScroll : window;
|
|
324
|
-
}
|
|
325
|
-
onValueChanged(valueChange) {
|
|
326
|
-
if (this.disabled) {
|
|
327
|
-
return;
|
|
328
|
-
}
|
|
329
|
-
this.valueChange.emit(valueChange);
|
|
330
|
-
}
|
|
331
|
-
onCustomizeFieldClick(customizeFieldClickedData) {
|
|
332
|
-
if (this.disabled) {
|
|
333
|
-
return;
|
|
334
|
-
}
|
|
335
|
-
this.fieldClick.emit(customizeFieldClickedData);
|
|
336
|
-
}
|
|
337
|
-
getIsDisabled(item) {
|
|
338
|
-
if (this.disableSelectionItems) {
|
|
339
|
-
return true;
|
|
340
|
-
}
|
|
341
|
-
else {
|
|
342
|
-
const IsNotSelectableForActions = item && !item.IsSelectableForActions;
|
|
343
|
-
return IsNotSelectableForActions;
|
|
344
|
-
}
|
|
345
|
-
}
|
|
346
|
-
getIsItemSelected(itemId, itemType = '') {
|
|
347
|
-
let isSelected = false;
|
|
348
|
-
const uniqItemId = this.getUniqItemId(itemId, itemType);
|
|
349
|
-
isSelected = uniqItemId === this.selectedItemId;
|
|
350
|
-
return isSelected;
|
|
351
|
-
}
|
|
352
|
-
setItemClicked(itemId, isSelectableForActions, itemType, isChecked) {
|
|
353
|
-
const uniqItemId = this.getUniqItemId(itemId, itemType);
|
|
354
|
-
// select the selected item.
|
|
355
|
-
if (isChecked) {
|
|
356
|
-
// Set seleted item
|
|
357
|
-
this.selectedItemId = uniqItemId;
|
|
358
|
-
}
|
|
359
|
-
else {
|
|
360
|
-
if (this.selectedItemId === uniqItemId) {
|
|
361
|
-
this.selectedItemId = '';
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
itemClicked(e, item) {
|
|
366
|
-
// Set seleted item
|
|
367
|
-
const itemId = item.UID.toString();
|
|
368
|
-
const itemType = item.Type.toString();
|
|
369
|
-
let isChecked = false;
|
|
370
|
-
if (item && item.IsSelectableForActions) {
|
|
371
|
-
this.selectedItemId = this.getUniqItemId(itemId, itemType);
|
|
372
|
-
isChecked = true;
|
|
373
|
-
}
|
|
374
|
-
if (this.isTable) {
|
|
375
|
-
this.setItemClicked(itemId, item.IsSelectableForActions, itemType, true);
|
|
376
|
-
}
|
|
377
|
-
else {
|
|
378
|
-
if (this.disabled) {
|
|
379
|
-
return;
|
|
380
|
-
}
|
|
381
|
-
}
|
|
382
|
-
// this.itemClick.emit({ source: item, viewType: this.viewType });
|
|
383
|
-
}
|
|
384
|
-
onTableRowMouseEnter(event, itemId, itemType) {
|
|
385
|
-
if (!this.deviceHasMouse) {
|
|
386
|
-
return;
|
|
387
|
-
}
|
|
388
|
-
const uniqItemId = this.getUniqItemId(itemId, itemType);
|
|
389
|
-
this.hoveredItemId = uniqItemId;
|
|
390
|
-
}
|
|
391
|
-
onTableRowMouseLeave(event, itemId, itemType) {
|
|
392
|
-
this.hoveredItemId = '';
|
|
393
|
-
}
|
|
394
|
-
onCardMouseEnter(event, itemId, itemType) {
|
|
395
|
-
if (!this.deviceHasMouse) {
|
|
396
|
-
return;
|
|
397
|
-
}
|
|
398
|
-
const uniqItemId = this.getUniqItemId(itemId, itemType);
|
|
399
|
-
this.hoveredItemId = uniqItemId;
|
|
400
|
-
}
|
|
401
|
-
onCardMouseLeave(event, itemId, itemType) {
|
|
402
|
-
this.hoveredItemId = '';
|
|
403
|
-
}
|
|
404
|
-
// call this function after resize + animation end
|
|
405
|
-
winResize(e) {
|
|
406
|
-
this.containerWidth = 0;
|
|
407
|
-
this.setLayout();
|
|
408
|
-
}
|
|
409
|
-
trackByFunc(index, item) {
|
|
410
|
-
return item && item.UID ? item.UID : index;
|
|
411
|
-
}
|
|
412
|
-
cleanItems() {
|
|
413
|
-
this.itemsCounter = 0;
|
|
414
|
-
this._items =
|
|
415
|
-
this.totalRows > 0 ? Array(this.totalRows) : [];
|
|
416
|
-
this.scrollItems = [];
|
|
417
|
-
this.calculatedObjectHeight = '';
|
|
418
|
-
}
|
|
419
|
-
getUIControl() {
|
|
420
|
-
return this.uiControl;
|
|
421
|
-
}
|
|
422
|
-
initListData(uiControl, totalRows, items, viewType = 'table', itemClass = '') {
|
|
423
|
-
this.viewType = viewType;
|
|
424
|
-
this.isTable = viewType === 'table';
|
|
425
|
-
// this.isCardView = viewType === 'cards';
|
|
426
|
-
this.uiControl = uiControl;
|
|
427
|
-
this.itemClass = itemClass;
|
|
428
|
-
this.selectedItemId = '';
|
|
429
|
-
this.totalRows = totalRows;
|
|
430
|
-
// fix bug for the scrollTo that doesn't work on edge div , not window
|
|
431
|
-
// const scrollingElement = this.getParentContainer();
|
|
432
|
-
// scrollingElement.scrollTo(0, 0);
|
|
433
|
-
this.cleanItems();
|
|
434
|
-
this.updateItems(items);
|
|
435
|
-
this.setLayout();
|
|
436
|
-
}
|
|
437
|
-
updateItems(items) {
|
|
438
|
-
this.scrollItems = this._items = items;
|
|
439
|
-
this.itemsCounter = items.length;
|
|
440
|
-
}
|
|
441
|
-
updateItem(data) {
|
|
442
|
-
let index = 0;
|
|
443
|
-
// Update items list
|
|
444
|
-
index = this.items.findIndex((i) => i && i.UID === data.UID);
|
|
445
|
-
if (index >= 0 && index < this.items.length) {
|
|
446
|
-
this.items[index] = data;
|
|
447
|
-
}
|
|
448
|
-
// Update scrollItems list
|
|
449
|
-
index = this.scrollItems.findIndex((i) => i && i.UID === data.UID);
|
|
450
|
-
if (index >= 0 && index < this.scrollItems.length) {
|
|
451
|
-
this.scrollItems[index] = data;
|
|
452
|
-
this.checkForChanges = new Date().getTime();
|
|
453
|
-
}
|
|
454
|
-
}
|
|
455
|
-
getIsItemEditable(uid) {
|
|
456
|
-
const item = this.items.filter((x) => x.UID.toString() === uid);
|
|
457
|
-
if (item.length > 0) {
|
|
458
|
-
return item[0].IsEditable;
|
|
459
|
-
}
|
|
460
|
-
else {
|
|
461
|
-
return false;
|
|
462
|
-
}
|
|
463
|
-
}
|
|
464
|
-
getItemDataByID(uid) {
|
|
465
|
-
return this.items.find((item) => item.UID.toString() === uid);
|
|
466
|
-
}
|
|
467
|
-
}
|
|
468
|
-
PepInternalListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepInternalListComponent, deps: [{ token: i0.ElementRef }, { token: i1.PepLayoutService }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
469
|
-
PepInternalListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: PepInternalListComponent, selector: "pep-internal-list", inputs: { noDataFoundMsg: "noDataFoundMsg", hideAllSelectionInMulti: "hideAllSelectionInMulti", top: "top", objectId: "objectId", parentId: "parentId", searchCode: "searchCode", supportResizing: "supportResizing", parentScroll: "parentScroll", disabled: "disabled", disableEvents: "disableEvents", disableSelectionItems: "disableSelectionItems", totalsRow: "totalsRow" }, outputs: { fieldClick: "fieldClick", valueChange: "valueChange" }, host: { listeners: { "window:resize": "winResize($event)" } }, viewQueries: [{ propertyName: "noVirtualScrollCont", first: true, predicate: ["noVirtualScrollCont"], descendants: true }, { propertyName: "tableHeader", first: true, predicate: ["tableHeader"], descendants: true }, { propertyName: "selectAllCB", first: true, predicate: ["selectAllCB"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"totalRows == 0\">\n <div class=\"pep-border-bottom\">\n <p class=\"title-xl no-data\">\n {{ (noDataFoundMsg ? noDataFoundMsg : 'LIST.NO_DATA_FOUND') | translate}}\n </p>\n </div>\n <div class=\"no-data-suggestions\">\n <p class=\"suggestions-title title-lg\">\n {{ 'LIST.NO_DATA_FOUND_SUGGESTIONS_TITLE' | translate}}\n </p>\n <ul class=\"suggestions-list body-lg\" [innerHtml]=\"'LIST.NO_DATA_FOUND_SUGGESTIONS_LIST' | translate\"></ul>\n </div>\n</ng-container>\n<ng-container *ngIf=\"totalRows > 0\">\n <div *ngIf=\"isTable\" #tableHeader class=\"table-header\" (mouseup)=\"onListResizeEnd($event)\"\n (mouseenter)=\"onListHeaderMouseEnter($event)\" (mouseleave)=\"onListHeaderMouseLeave($event)\"\n (mousemove)=\"onListResize($event)\">\n\n <div class=\"table-header-padding-top\"></div>\n <fieldset class=\"table-header-fieldset\">\n <fieldset>\n <div *ngFor=\"let field of uiControl?.ControlFields; let j = index\" class=\"header-column pull-left flip\"\n [ngStyle]=\"{ width: field.calcTitleColumnWidthString }\" [ngClass]=\"{\n 'is-resizing': field.ApiName === pressedColumn,\n 'is-first': j === 0,\n 'is-last': j === uiControl?.ControlFields?.length - 1\n }\">\n <label *ngIf=\"field.Title != ''\" id=\"{{ field.ApiName }}\"\n class=\"header-label body-sm pull-left flip text-align-{{ field.Layout.XAlignment }}\"\n title=\"{{ field.Title }}\">\n {{ field.Title }}\n </label>\n <label *ngIf=\"field.Title == ''\" id=\"{{ field.ApiName }}\"\n class=\"header-label body-sm pull-left flip\"> </label>\n\n <div *ngIf=\"supportResizing\" class=\"resize-box pull-right flip\"\n (mousedown)=\"onListResizeStart($event, field.ApiName)\">\n <div class=\"splitter\"></div>\n </div>\n </div>\n </fieldset>\n </fieldset>\n </div>\n\n <div #noVirtualScrollCont [ngClass]=\"{ 'table-body': isTable, 'cards-body': !isTable }\">\n <ng-container *ngTemplateOutlet=\"listData\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"listTotals\"></ng-container>\n</ng-container>\n\n<ng-template #listData>\n <ng-container *ngFor=\"let item of scrollItems; let i = index; let isFirst = first; trackBy: trackByFunc\">\n <ng-container *ngIf=\"isTable\">\n <div class=\"table-row\" (mouseenter)=\"onTableRowMouseEnter($event, item?.UID, item?.Type)\"\n (mouseleave)=\"onTableRowMouseLeave($event, item?.UID, item?.Type)\" [ngClass]=\"{\n selected: getIsItemSelected(item?.UID, item?.Type),\n highlighted: item?.UID + SEPARATOR + item?.Type === selectedItemId\n }\"\n [ngStyle]=\"{ height: calculatedObjectHeight, visibility: showItems || item ? 'visible' : 'hidden' }\">\n <fieldset class=\"table-row-fieldset\" [ngStyle]=\"{ 'background-color': item?.BackgroundColor }\">\n <!-- [canEditObject]=\"!disabled && item?.IsEditable\" -->\n <pep-internal-form [checkForChanges]=\"checkForChanges\" [layout]=\"uiControl\" [data]=\"item\"\n [canEditObject]=\"!disabled\" [objectId]=\"objectId\" [parentId]=\"parentId\"\n [searchCode]=\"searchCode\" [lockEvents]=\"disableSelectionItems\" [layoutType]=\"'table'\"\n [isActive]=\"\n (item?.UID + SEPARATOR + item?.Type === selectedItemId ||\n item?.UID + SEPARATOR + item?.Type === hoveredItemId) && deviceHasMouse\n \" (valueChange)=\"onValueChanged($event)\" (fieldClick)=\"onCustomizeFieldClick($event)\"\n (click)=\"itemClicked($event, item)\">\n </pep-internal-form>\n </fieldset>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!isTable\">\n <div [class]=\"itemClass\" (mouseenter)=\"onCardMouseEnter($event, item?.UID, item?.Type)\"\n (mouseleave)=\"onCardMouseLeave($event, item?.UID, item?.Type)\" [ngClass]=\"{\n selected: getIsItemSelected(item?.UID, item?.Type),\n highlighted: item?.UID + SEPARATOR + item?.Type === selectedItemId,\n 'card-view': viewType === 'cards',\n 'line-view': viewType === 'lines'\n }\" class=\"pull-left flip\"\n [ngStyle]=\"{ height: calculatedObjectHeight, visibility: showItems || item ? 'visible' : 'hidden' }\">\n <!-- [canEditObject]=\"!disabled && item?.IsEditable\" -->\n <pep-internal-form [checkForChanges]=\"checkForChanges\" [layout]=\"uiControl\" [data]=\"item\"\n [canEditObject]=\"!disabled\" [objectId]=\" objectId\" [parentId]=\"parentId\" [searchCode]=\"searchCode\"\n [lockEvents]=\"disableSelectionItems\" [layoutType]=\"'card'\" [isActive]=\"\n (item?.UID + SEPARATOR + item?.Type === selectedItemId ||\n item?.UID + SEPARATOR + item?.Type === hoveredItemId) && deviceHasMouse\n \" (valueChange)=\"onValueChanged($event)\" (fieldClick)=\"onCustomizeFieldClick($event)\"\n (click)=\"itemClicked($event, item)\">\n </pep-internal-form>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #listTotals>\n <div *ngIf=\"totalsRow?.length > 0 && totalsRow.length <= uiControl?.ControlFields.length\" class=\"table-total\">\n <fieldset class=\"table-header-fieldset\">\n <div *ngFor=\"let field of uiControl?.ControlFields; let j = index\" class=\"total-column pull-left flip\"\n [ngStyle]=\"{ width: field.calcTitleColumnWidthString }\">\n <label class=\"total-label body-sm text-align-{{ field.Layout.XAlignment }}\">\n {{ totalsRow[j] }}\n </label>\n </div>\n </fieldset>\n </div>\n</ng-template>", styles: [":host{height:inherit;display:grid}.no-data{margin:var(--pep-spacing-2xl, 2rem) 0}.no-data-suggestions .suggestions-title{margin:var(--pep-spacing-lg, 1rem) 0 var(--pep-spacing-sm, .5rem)}.no-data-suggestions .suggestions-list{margin:0;padding:0;padding-inline-start:var(--pep-spacing-2xl, 2rem)}.table-header{top:0}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.PepInternalFormComponent, selector: "pep-internal-form", inputs: ["isInternal", "isReport", "layout", "lockEvents", "canEditObject", "data", "lockFields", "isActive", "layoutType", "objectId", "parentId", "searchCode", "showTitle", "firstFieldAsLink", "checkForChanges"], outputs: ["valueChange", "formValidationChange", "fieldClick"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] });
|
|
470
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepInternalListComponent, decorators: [{
|
|
471
|
-
type: Component,
|
|
472
|
-
args: [{ selector: 'pep-internal-list', host: {
|
|
473
|
-
'(window:resize)': 'winResize($event)',
|
|
474
|
-
}, template: "<ng-container *ngIf=\"totalRows == 0\">\n <div class=\"pep-border-bottom\">\n <p class=\"title-xl no-data\">\n {{ (noDataFoundMsg ? noDataFoundMsg : 'LIST.NO_DATA_FOUND') | translate}}\n </p>\n </div>\n <div class=\"no-data-suggestions\">\n <p class=\"suggestions-title title-lg\">\n {{ 'LIST.NO_DATA_FOUND_SUGGESTIONS_TITLE' | translate}}\n </p>\n <ul class=\"suggestions-list body-lg\" [innerHtml]=\"'LIST.NO_DATA_FOUND_SUGGESTIONS_LIST' | translate\"></ul>\n </div>\n</ng-container>\n<ng-container *ngIf=\"totalRows > 0\">\n <div *ngIf=\"isTable\" #tableHeader class=\"table-header\" (mouseup)=\"onListResizeEnd($event)\"\n (mouseenter)=\"onListHeaderMouseEnter($event)\" (mouseleave)=\"onListHeaderMouseLeave($event)\"\n (mousemove)=\"onListResize($event)\">\n\n <div class=\"table-header-padding-top\"></div>\n <fieldset class=\"table-header-fieldset\">\n <fieldset>\n <div *ngFor=\"let field of uiControl?.ControlFields; let j = index\" class=\"header-column pull-left flip\"\n [ngStyle]=\"{ width: field.calcTitleColumnWidthString }\" [ngClass]=\"{\n 'is-resizing': field.ApiName === pressedColumn,\n 'is-first': j === 0,\n 'is-last': j === uiControl?.ControlFields?.length - 1\n }\">\n <label *ngIf=\"field.Title != ''\" id=\"{{ field.ApiName }}\"\n class=\"header-label body-sm pull-left flip text-align-{{ field.Layout.XAlignment }}\"\n title=\"{{ field.Title }}\">\n {{ field.Title }}\n </label>\n <label *ngIf=\"field.Title == ''\" id=\"{{ field.ApiName }}\"\n class=\"header-label body-sm pull-left flip\"> </label>\n\n <div *ngIf=\"supportResizing\" class=\"resize-box pull-right flip\"\n (mousedown)=\"onListResizeStart($event, field.ApiName)\">\n <div class=\"splitter\"></div>\n </div>\n </div>\n </fieldset>\n </fieldset>\n </div>\n\n <div #noVirtualScrollCont [ngClass]=\"{ 'table-body': isTable, 'cards-body': !isTable }\">\n <ng-container *ngTemplateOutlet=\"listData\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"listTotals\"></ng-container>\n</ng-container>\n\n<ng-template #listData>\n <ng-container *ngFor=\"let item of scrollItems; let i = index; let isFirst = first; trackBy: trackByFunc\">\n <ng-container *ngIf=\"isTable\">\n <div class=\"table-row\" (mouseenter)=\"onTableRowMouseEnter($event, item?.UID, item?.Type)\"\n (mouseleave)=\"onTableRowMouseLeave($event, item?.UID, item?.Type)\" [ngClass]=\"{\n selected: getIsItemSelected(item?.UID, item?.Type),\n highlighted: item?.UID + SEPARATOR + item?.Type === selectedItemId\n }\"\n [ngStyle]=\"{ height: calculatedObjectHeight, visibility: showItems || item ? 'visible' : 'hidden' }\">\n <fieldset class=\"table-row-fieldset\" [ngStyle]=\"{ 'background-color': item?.BackgroundColor }\">\n <!-- [canEditObject]=\"!disabled && item?.IsEditable\" -->\n <pep-internal-form [checkForChanges]=\"checkForChanges\" [layout]=\"uiControl\" [data]=\"item\"\n [canEditObject]=\"!disabled\" [objectId]=\"objectId\" [parentId]=\"parentId\"\n [searchCode]=\"searchCode\" [lockEvents]=\"disableSelectionItems\" [layoutType]=\"'table'\"\n [isActive]=\"\n (item?.UID + SEPARATOR + item?.Type === selectedItemId ||\n item?.UID + SEPARATOR + item?.Type === hoveredItemId) && deviceHasMouse\n \" (valueChange)=\"onValueChanged($event)\" (fieldClick)=\"onCustomizeFieldClick($event)\"\n (click)=\"itemClicked($event, item)\">\n </pep-internal-form>\n </fieldset>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!isTable\">\n <div [class]=\"itemClass\" (mouseenter)=\"onCardMouseEnter($event, item?.UID, item?.Type)\"\n (mouseleave)=\"onCardMouseLeave($event, item?.UID, item?.Type)\" [ngClass]=\"{\n selected: getIsItemSelected(item?.UID, item?.Type),\n highlighted: item?.UID + SEPARATOR + item?.Type === selectedItemId,\n 'card-view': viewType === 'cards',\n 'line-view': viewType === 'lines'\n }\" class=\"pull-left flip\"\n [ngStyle]=\"{ height: calculatedObjectHeight, visibility: showItems || item ? 'visible' : 'hidden' }\">\n <!-- [canEditObject]=\"!disabled && item?.IsEditable\" -->\n <pep-internal-form [checkForChanges]=\"checkForChanges\" [layout]=\"uiControl\" [data]=\"item\"\n [canEditObject]=\"!disabled\" [objectId]=\" objectId\" [parentId]=\"parentId\" [searchCode]=\"searchCode\"\n [lockEvents]=\"disableSelectionItems\" [layoutType]=\"'card'\" [isActive]=\"\n (item?.UID + SEPARATOR + item?.Type === selectedItemId ||\n item?.UID + SEPARATOR + item?.Type === hoveredItemId) && deviceHasMouse\n \" (valueChange)=\"onValueChanged($event)\" (fieldClick)=\"onCustomizeFieldClick($event)\"\n (click)=\"itemClicked($event, item)\">\n </pep-internal-form>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #listTotals>\n <div *ngIf=\"totalsRow?.length > 0 && totalsRow.length <= uiControl?.ControlFields.length\" class=\"table-total\">\n <fieldset class=\"table-header-fieldset\">\n <div *ngFor=\"let field of uiControl?.ControlFields; let j = index\" class=\"total-column pull-left flip\"\n [ngStyle]=\"{ width: field.calcTitleColumnWidthString }\">\n <label class=\"total-label body-sm text-align-{{ field.Layout.XAlignment }}\">\n {{ totalsRow[j] }}\n </label>\n </div>\n </fieldset>\n </div>\n</ng-template>", styles: [":host{height:inherit;display:grid}.no-data{margin:var(--pep-spacing-2xl, 2rem) 0}.no-data-suggestions .suggestions-title{margin:var(--pep-spacing-lg, 1rem) 0 var(--pep-spacing-sm, .5rem)}.no-data-suggestions .suggestions-list{margin:0;padding:0;padding-inline-start:var(--pep-spacing-2xl, 2rem)}.table-header{top:0}\n"] }]
|
|
475
|
-
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.PepLayoutService }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }]; }, propDecorators: { noDataFoundMsg: [{
|
|
476
|
-
type: Input
|
|
477
|
-
}], hideAllSelectionInMulti: [{
|
|
478
|
-
type: Input
|
|
479
|
-
}], top: [{
|
|
480
|
-
type: Input
|
|
481
|
-
}], objectId: [{
|
|
482
|
-
type: Input
|
|
483
|
-
}], parentId: [{
|
|
484
|
-
type: Input
|
|
485
|
-
}], searchCode: [{
|
|
486
|
-
type: Input
|
|
487
|
-
}], supportResizing: [{
|
|
488
|
-
type: Input
|
|
489
|
-
}], parentScroll: [{
|
|
490
|
-
type: Input
|
|
491
|
-
}], disabled: [{
|
|
492
|
-
type: Input
|
|
493
|
-
}], disableEvents: [{
|
|
494
|
-
type: Input
|
|
495
|
-
}], disableSelectionItems: [{
|
|
496
|
-
type: Input
|
|
497
|
-
}], totalsRow: [{
|
|
498
|
-
type: Input
|
|
499
|
-
}], fieldClick: [{
|
|
500
|
-
type: Output
|
|
501
|
-
}], valueChange: [{
|
|
502
|
-
type: Output
|
|
503
|
-
}], noVirtualScrollCont: [{
|
|
504
|
-
type: ViewChild,
|
|
505
|
-
args: ['noVirtualScrollCont']
|
|
506
|
-
}], tableHeader: [{
|
|
507
|
-
type: ViewChild,
|
|
508
|
-
args: ['tableHeader']
|
|
509
|
-
}], selectAllCB: [{
|
|
510
|
-
type: ViewChild,
|
|
511
|
-
args: ['selectAllCB']
|
|
512
|
-
}] } });
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ViewChild, } from '@angular/core';
|
|
2
|
+
import { FIELD_TYPE, } from '@pepperi-addons/ngx-lib';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@pepperi-addons/ngx-lib";
|
|
5
|
+
import * as i2 from "@angular/common";
|
|
6
|
+
import * as i3 from "./internal-form.component";
|
|
7
|
+
import * as i4 from "@ngx-translate/core";
|
|
8
|
+
export class PepInternalListComponent {
|
|
9
|
+
constructor(element, layoutService, cd, renderer) {
|
|
10
|
+
this.element = element;
|
|
11
|
+
this.layoutService = layoutService;
|
|
12
|
+
this.cd = cd;
|
|
13
|
+
this.renderer = renderer;
|
|
14
|
+
this.noDataFoundMsg = 'Items not found';
|
|
15
|
+
this.hideAllSelectionInMulti = false;
|
|
16
|
+
this.top = -1;
|
|
17
|
+
this.objectId = '0';
|
|
18
|
+
this.parentId = '0';
|
|
19
|
+
this.searchCode = '0';
|
|
20
|
+
// @Input() showTopBorder = false;
|
|
21
|
+
this.supportResizing = true;
|
|
22
|
+
this.parentScroll = null;
|
|
23
|
+
this.disabled = false;
|
|
24
|
+
this.disableEvents = false;
|
|
25
|
+
this.disableSelectionItems = false;
|
|
26
|
+
this.totalsRow = [];
|
|
27
|
+
// @Output()
|
|
28
|
+
// itemClick: EventEmitter<IPepListItemClickEvent> = new EventEmitter<IPepListItemClickEvent>();
|
|
29
|
+
this.fieldClick = new EventEmitter();
|
|
30
|
+
this.valueChange = new EventEmitter();
|
|
31
|
+
this.uiControl = null;
|
|
32
|
+
this.totalRows = -1;
|
|
33
|
+
this.isTable = false;
|
|
34
|
+
this.hasColumnWidthOfTypePercentage = true;
|
|
35
|
+
this._items = null;
|
|
36
|
+
// isCardView = false;
|
|
37
|
+
this.itemsCounter = 0;
|
|
38
|
+
this.showItems = true;
|
|
39
|
+
this.SEPARATOR = ',';
|
|
40
|
+
this.nativeWindow = null;
|
|
41
|
+
this.selectedItemId = '';
|
|
42
|
+
this.hoveredItemId = '';
|
|
43
|
+
this.lockEvents = false;
|
|
44
|
+
this.containerWidth = 0;
|
|
45
|
+
this.deviceHasMouse = false;
|
|
46
|
+
// headerIsInFocus = false;
|
|
47
|
+
// For resize
|
|
48
|
+
this.pressedColumn = '';
|
|
49
|
+
this.startX = 0;
|
|
50
|
+
this.startWidth = 0;
|
|
51
|
+
this.tableStartWidth = 0;
|
|
52
|
+
this.isUserSelected = false;
|
|
53
|
+
this.checkForChanges = null;
|
|
54
|
+
this.useVirtualScroll = true;
|
|
55
|
+
this.nativeWindow = window;
|
|
56
|
+
this.deviceHasMouse = this.layoutService.getDeviceHasMouse();
|
|
57
|
+
this.layoutService.onMouseOver$.subscribe((deviceHasMouse) => {
|
|
58
|
+
this.deviceHasMouse = deviceHasMouse;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
get items() {
|
|
62
|
+
return this._items;
|
|
63
|
+
}
|
|
64
|
+
ngOnInit() {
|
|
65
|
+
this.containerWidth = 0;
|
|
66
|
+
}
|
|
67
|
+
ngOnChanges(changes) {
|
|
68
|
+
if (this.containerWidth <= 0) {
|
|
69
|
+
this.setContainerWidth();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
ngOnDestroy() {
|
|
73
|
+
// if (this.valueChange) {
|
|
74
|
+
// this.valueChange.unsubscribe();
|
|
75
|
+
// }
|
|
76
|
+
// if (this.itemClick) {
|
|
77
|
+
// this.itemClick.unsubscribe();
|
|
78
|
+
// }
|
|
79
|
+
// if (this.fieldClick) {
|
|
80
|
+
// this.fieldClick.unsubscribe();
|
|
81
|
+
// }
|
|
82
|
+
}
|
|
83
|
+
setContainerWidth() {
|
|
84
|
+
if (!this.element.nativeElement.parentElement) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const selectionCheckBoxWidth = 0;
|
|
88
|
+
const rowHeight = 40; // the table row height (2.5rem * 16font-size).
|
|
89
|
+
const style = getComputedStyle(this.element.nativeElement.parentElement);
|
|
90
|
+
// The container-fluid class padding left + right + border
|
|
91
|
+
const containerFluidSpacing = parseInt(style.paddingLeft, 10) + parseInt(style.paddingRight, 10);
|
|
92
|
+
const parentContainer = this.element.nativeElement.parentElement.parentElement > 0
|
|
93
|
+
? this.element.nativeElement.parentElement.parentElement
|
|
94
|
+
: this.element.nativeElement.parentElement;
|
|
95
|
+
// Calculate if vertical scroll should appear, if so set the scroll width. (this.totalRows + 1) + 1 is for the header row.
|
|
96
|
+
const scrollWidth = parentContainer.clientHeight < rowHeight * (this.totalRows + 1)
|
|
97
|
+
? 18
|
|
98
|
+
: 0; // 18 is the default scroll width.
|
|
99
|
+
// The selectionCheckBoxWidth width + containerFluidSpacing + scrollWidth.
|
|
100
|
+
const rowHeaderWidthToSub = containerFluidSpacing + selectionCheckBoxWidth + scrollWidth;
|
|
101
|
+
this.containerWidth = parentContainer.offsetWidth - rowHeaderWidthToSub;
|
|
102
|
+
}
|
|
103
|
+
clear() {
|
|
104
|
+
this.cleanItems();
|
|
105
|
+
this.uiControl = null;
|
|
106
|
+
}
|
|
107
|
+
toggleItems(isVisible) {
|
|
108
|
+
this.showItems = isVisible;
|
|
109
|
+
this.lockEvents = !isVisible;
|
|
110
|
+
}
|
|
111
|
+
updateScrollItems(startIndex, endIndex, loadInChunks = true) {
|
|
112
|
+
this.scrollItems = this.items.slice(startIndex, endIndex);
|
|
113
|
+
}
|
|
114
|
+
getUniqItemId(itemId, itemType = '') {
|
|
115
|
+
return itemId + this.SEPARATOR + itemType;
|
|
116
|
+
}
|
|
117
|
+
setLayout() {
|
|
118
|
+
if (this.totalRows === 0 ||
|
|
119
|
+
!this.uiControl ||
|
|
120
|
+
!this.uiControl.ControlFields ||
|
|
121
|
+
this.uiControl.ControlFields.length === 0) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
this.uiControl.ControlFields.forEach((cf) => {
|
|
125
|
+
if (cf.ColumnWidth === 0) {
|
|
126
|
+
cf.ColumnWidth = 10;
|
|
127
|
+
}
|
|
128
|
+
if (this.isTable &&
|
|
129
|
+
(cf.FieldType === FIELD_TYPE.Image ||
|
|
130
|
+
// cf.FieldType === FIELD_TYPE.Indicators || ???
|
|
131
|
+
cf.FieldType === FIELD_TYPE.Signature ||
|
|
132
|
+
cf.FieldType === FIELD_TYPE.NumberIntegerQuantitySelector ||
|
|
133
|
+
cf.FieldType === FIELD_TYPE.NumberRealQuantitySelector ||
|
|
134
|
+
cf.FieldType === FIELD_TYPE.NumberIntegerForMatrix ||
|
|
135
|
+
cf.FieldType === FIELD_TYPE.NumberRealForMatrix ||
|
|
136
|
+
cf.FieldType === FIELD_TYPE.Package ||
|
|
137
|
+
cf.ApiName === 'UnitsQuantity' ||
|
|
138
|
+
cf.ApiName === 'QuantitySelector')) {
|
|
139
|
+
cf.Layout.XAlignment = 3;
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
if (!this.cd['destroyed']) {
|
|
143
|
+
this.cd.detectChanges();
|
|
144
|
+
}
|
|
145
|
+
// Set the columns width.
|
|
146
|
+
if (this.containerWidth <= 0) {
|
|
147
|
+
this.setContainerWidth();
|
|
148
|
+
}
|
|
149
|
+
this.calcColumnsWidth();
|
|
150
|
+
this.checkForChanges = new Date().getTime();
|
|
151
|
+
}
|
|
152
|
+
calcColumnsWidth() {
|
|
153
|
+
const fixedMultiple = 3.78; // for converting em to pixel.
|
|
154
|
+
const length = this.uiControl.ControlFields.length;
|
|
155
|
+
const selectionCheckBoxWidth = 0;
|
|
156
|
+
// Is table AND there is at least one column of width type of percentage.
|
|
157
|
+
if (this.isTable) {
|
|
158
|
+
if (this.uiControl && this.uiControl.ControlFields) {
|
|
159
|
+
this.hasColumnWidthOfTypePercentage =
|
|
160
|
+
this.uiControl.ControlFields.filter((cf) => cf.ColumnWidthType === 1).length === 0;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// If the columns size is fixed and the total is small then the container change it to percentage.
|
|
164
|
+
if (!this.hasColumnWidthOfTypePercentage) {
|
|
165
|
+
const totalFixedColsWidth = this.uiControl.ControlFields.map((cf) => cf.ColumnWidth * fixedMultiple).reduce((sum, current) => sum + current);
|
|
166
|
+
if (window.innerWidth > totalFixedColsWidth) {
|
|
167
|
+
this.hasColumnWidthOfTypePercentage = true;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
let totalCalcColsWidth = 0;
|
|
171
|
+
// Calc by percentage
|
|
172
|
+
if (this.hasColumnWidthOfTypePercentage) {
|
|
173
|
+
const totalColsWidth = this.uiControl.ControlFields.map((cf) => cf.ColumnWidth).reduce((sum, current) => sum + current);
|
|
174
|
+
for (let index = 0; index < length; index++) {
|
|
175
|
+
const uiControlField = this.uiControl
|
|
176
|
+
.ControlFields[index];
|
|
177
|
+
const calcColumnWidthPercentage = (100 / totalColsWidth) * uiControlField.ColumnWidth;
|
|
178
|
+
uiControlField.calcColumnWidth = Math.floor((this.containerWidth * calcColumnWidthPercentage) / 100);
|
|
179
|
+
if (index === length - 1) {
|
|
180
|
+
uiControlField.calcTitleColumnWidthString = uiControlField.calcColumnWidthString =
|
|
181
|
+
'calc(100% - ' + totalCalcColsWidth + 'px)'; // For 100%
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
uiControlField.calcTitleColumnWidthString = uiControlField.calcColumnWidthString =
|
|
185
|
+
uiControlField.calcColumnWidth + 'px';
|
|
186
|
+
totalCalcColsWidth += uiControlField.calcColumnWidth;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
this.renderer.setStyle(this.element.nativeElement, 'width', 'inherit');
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
for (let index = 0; index < length; index++) {
|
|
193
|
+
const uiControlField = this.uiControl
|
|
194
|
+
.ControlFields[index];
|
|
195
|
+
const currentFixedWidth = Math.floor(uiControlField.ColumnWidth * fixedMultiple);
|
|
196
|
+
if (index === length - 1) {
|
|
197
|
+
uiControlField.calcTitleColumnWidthString =
|
|
198
|
+
currentFixedWidth + 'px';
|
|
199
|
+
uiControlField.calcColumnWidthString =
|
|
200
|
+
currentFixedWidth - 4 + 'px'; // -4 for the row padding.
|
|
201
|
+
}
|
|
202
|
+
else {
|
|
203
|
+
uiControlField.calcTitleColumnWidthString = uiControlField.calcColumnWidthString =
|
|
204
|
+
currentFixedWidth + 'px';
|
|
205
|
+
}
|
|
206
|
+
totalCalcColsWidth += currentFixedWidth;
|
|
207
|
+
}
|
|
208
|
+
this.renderer.setStyle(this.element.nativeElement, 'width', totalCalcColsWidth + selectionCheckBoxWidth + 'px');
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
initResizeData() {
|
|
212
|
+
this.startX = 0;
|
|
213
|
+
this.startWidth = 0;
|
|
214
|
+
this.tableStartWidth = 0;
|
|
215
|
+
this.pressedColumn = '';
|
|
216
|
+
}
|
|
217
|
+
onListResizeStart(event, columnKey) {
|
|
218
|
+
this.pressedColumn = columnKey;
|
|
219
|
+
this.startX = event.x;
|
|
220
|
+
this.startWidth = event.target.closest('.header-column').offsetWidth;
|
|
221
|
+
// Set the tableStartWidth to the container offsetWidth
|
|
222
|
+
this.tableStartWidth = this.noVirtualScrollCont.nativeElement.offsetWidth;
|
|
223
|
+
}
|
|
224
|
+
onListResize(event) {
|
|
225
|
+
if (this.pressedColumn.length > 0) {
|
|
226
|
+
const widthToAdd = this.layoutService.isRtl()
|
|
227
|
+
? this.startX - event.x
|
|
228
|
+
: event.x - this.startX;
|
|
229
|
+
// Set the width of the column and the container of the whole columns.
|
|
230
|
+
if (this.startWidth + widthToAdd >= 48 || widthToAdd > 0) {
|
|
231
|
+
const length = this.uiControl.ControlFields.length;
|
|
232
|
+
let totalCalcColsWidth = 0;
|
|
233
|
+
for (let index = 0; index < length; index++) {
|
|
234
|
+
const uiControlField = this.uiControl
|
|
235
|
+
.ControlFields[index];
|
|
236
|
+
if (index === length - 1) {
|
|
237
|
+
// Calc the last column only in percentage type.
|
|
238
|
+
if (this.hasColumnWidthOfTypePercentage) {
|
|
239
|
+
uiControlField.calcTitleColumnWidthString = uiControlField.calcColumnWidthString =
|
|
240
|
+
'calc(100% - ' + totalCalcColsWidth + 'px)'; // For 100%
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
if (uiControlField.ApiName === this.pressedColumn) {
|
|
244
|
+
uiControlField.calcColumnWidth =
|
|
245
|
+
this.startWidth + widthToAdd;
|
|
246
|
+
uiControlField.calcTitleColumnWidthString =
|
|
247
|
+
uiControlField.calcColumnWidth + 'px';
|
|
248
|
+
uiControlField.calcColumnWidthString =
|
|
249
|
+
uiControlField.calcColumnWidth - 4 + 'px';
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else if (uiControlField.ApiName === this.pressedColumn) {
|
|
254
|
+
uiControlField.calcColumnWidth =
|
|
255
|
+
this.startWidth + widthToAdd;
|
|
256
|
+
uiControlField.calcTitleColumnWidthString = uiControlField.calcColumnWidthString =
|
|
257
|
+
uiControlField.calcColumnWidth + 'px';
|
|
258
|
+
}
|
|
259
|
+
totalCalcColsWidth += uiControlField.calcColumnWidth;
|
|
260
|
+
}
|
|
261
|
+
this.renderer.setStyle(this.element.nativeElement, 'width', this.tableStartWidth + widthToAdd + 'px');
|
|
262
|
+
}
|
|
263
|
+
this.checkForChanges = new Date().getTime();
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
getParent(el, parentSelector) {
|
|
267
|
+
// If no parentSelector defined will bubble up all the way to *document*
|
|
268
|
+
if (parentSelector === undefined) {
|
|
269
|
+
parentSelector = document;
|
|
270
|
+
}
|
|
271
|
+
const parent = [];
|
|
272
|
+
let p = el.parentNode;
|
|
273
|
+
while (p &&
|
|
274
|
+
p.className !== '' &&
|
|
275
|
+
p.className.indexOf(parentSelector) === -1 &&
|
|
276
|
+
parentSelector !== document) {
|
|
277
|
+
const o = p;
|
|
278
|
+
p = o.parentNode;
|
|
279
|
+
}
|
|
280
|
+
if (p.className.indexOf(parentSelector) > -1) {
|
|
281
|
+
parent.push(p); // Push that parentSelector you wanted to stop at
|
|
282
|
+
}
|
|
283
|
+
return parent;
|
|
284
|
+
}
|
|
285
|
+
onListResizeEnd(event) {
|
|
286
|
+
if (this.pressedColumn.length > 0) {
|
|
287
|
+
if (event &&
|
|
288
|
+
this.getParent(event.srcElement, 'resize-box').length > 0) {
|
|
289
|
+
this.initResizeData();
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
setTimeout(() => {
|
|
293
|
+
this.initResizeData();
|
|
294
|
+
}, 0);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
onListHeaderMouseEnter(event) {
|
|
299
|
+
// this.headerIsInFocus = true;
|
|
300
|
+
}
|
|
301
|
+
onListHeaderMouseLeave(event) {
|
|
302
|
+
// this.headerIsInFocus = false;
|
|
303
|
+
this.onListResizeEnd(event);
|
|
304
|
+
this.initResizeData();
|
|
305
|
+
}
|
|
306
|
+
onListChange(event) {
|
|
307
|
+
if (this.disableEvents) {
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
// For other events do nothing.
|
|
311
|
+
if (typeof event.start === 'undefined' ||
|
|
312
|
+
typeof event.end === 'undefined') {
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
this.calculatedObjectHeight = event.calculatedChildHeight + 'px';
|
|
316
|
+
if (!this.lockEvents) {
|
|
317
|
+
this.toggleItems(false);
|
|
318
|
+
this.updateScrollItems(event.start, event.end, false);
|
|
319
|
+
this.toggleItems(true);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
getParentContainer() {
|
|
323
|
+
return this.parentScroll ? this.parentScroll : window;
|
|
324
|
+
}
|
|
325
|
+
onValueChanged(valueChange) {
|
|
326
|
+
if (this.disabled) {
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
this.valueChange.emit(valueChange);
|
|
330
|
+
}
|
|
331
|
+
onCustomizeFieldClick(customizeFieldClickedData) {
|
|
332
|
+
if (this.disabled) {
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
this.fieldClick.emit(customizeFieldClickedData);
|
|
336
|
+
}
|
|
337
|
+
getIsDisabled(item) {
|
|
338
|
+
if (this.disableSelectionItems) {
|
|
339
|
+
return true;
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
const IsNotSelectableForActions = item && !item.IsSelectableForActions;
|
|
343
|
+
return IsNotSelectableForActions;
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
getIsItemSelected(itemId, itemType = '') {
|
|
347
|
+
let isSelected = false;
|
|
348
|
+
const uniqItemId = this.getUniqItemId(itemId, itemType);
|
|
349
|
+
isSelected = uniqItemId === this.selectedItemId;
|
|
350
|
+
return isSelected;
|
|
351
|
+
}
|
|
352
|
+
setItemClicked(itemId, isSelectableForActions, itemType, isChecked) {
|
|
353
|
+
const uniqItemId = this.getUniqItemId(itemId, itemType);
|
|
354
|
+
// select the selected item.
|
|
355
|
+
if (isChecked) {
|
|
356
|
+
// Set seleted item
|
|
357
|
+
this.selectedItemId = uniqItemId;
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
if (this.selectedItemId === uniqItemId) {
|
|
361
|
+
this.selectedItemId = '';
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
itemClicked(e, item) {
|
|
366
|
+
// Set seleted item
|
|
367
|
+
const itemId = item.UID.toString();
|
|
368
|
+
const itemType = item.Type.toString();
|
|
369
|
+
let isChecked = false;
|
|
370
|
+
if (item && item.IsSelectableForActions) {
|
|
371
|
+
this.selectedItemId = this.getUniqItemId(itemId, itemType);
|
|
372
|
+
isChecked = true;
|
|
373
|
+
}
|
|
374
|
+
if (this.isTable) {
|
|
375
|
+
this.setItemClicked(itemId, item.IsSelectableForActions, itemType, true);
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
if (this.disabled) {
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// this.itemClick.emit({ source: item, viewType: this.viewType });
|
|
383
|
+
}
|
|
384
|
+
onTableRowMouseEnter(event, itemId, itemType) {
|
|
385
|
+
if (!this.deviceHasMouse) {
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
const uniqItemId = this.getUniqItemId(itemId, itemType);
|
|
389
|
+
this.hoveredItemId = uniqItemId;
|
|
390
|
+
}
|
|
391
|
+
onTableRowMouseLeave(event, itemId, itemType) {
|
|
392
|
+
this.hoveredItemId = '';
|
|
393
|
+
}
|
|
394
|
+
onCardMouseEnter(event, itemId, itemType) {
|
|
395
|
+
if (!this.deviceHasMouse) {
|
|
396
|
+
return;
|
|
397
|
+
}
|
|
398
|
+
const uniqItemId = this.getUniqItemId(itemId, itemType);
|
|
399
|
+
this.hoveredItemId = uniqItemId;
|
|
400
|
+
}
|
|
401
|
+
onCardMouseLeave(event, itemId, itemType) {
|
|
402
|
+
this.hoveredItemId = '';
|
|
403
|
+
}
|
|
404
|
+
// call this function after resize + animation end
|
|
405
|
+
winResize(e) {
|
|
406
|
+
this.containerWidth = 0;
|
|
407
|
+
this.setLayout();
|
|
408
|
+
}
|
|
409
|
+
trackByFunc(index, item) {
|
|
410
|
+
return item && item.UID ? item.UID : index;
|
|
411
|
+
}
|
|
412
|
+
cleanItems() {
|
|
413
|
+
this.itemsCounter = 0;
|
|
414
|
+
this._items =
|
|
415
|
+
this.totalRows > 0 ? Array(this.totalRows) : [];
|
|
416
|
+
this.scrollItems = [];
|
|
417
|
+
this.calculatedObjectHeight = '';
|
|
418
|
+
}
|
|
419
|
+
getUIControl() {
|
|
420
|
+
return this.uiControl;
|
|
421
|
+
}
|
|
422
|
+
initListData(uiControl, totalRows, items, viewType = 'table', itemClass = '') {
|
|
423
|
+
this.viewType = viewType;
|
|
424
|
+
this.isTable = viewType === 'table';
|
|
425
|
+
// this.isCardView = viewType === 'cards';
|
|
426
|
+
this.uiControl = uiControl;
|
|
427
|
+
this.itemClass = itemClass;
|
|
428
|
+
this.selectedItemId = '';
|
|
429
|
+
this.totalRows = totalRows;
|
|
430
|
+
// fix bug for the scrollTo that doesn't work on edge div , not window
|
|
431
|
+
// const scrollingElement = this.getParentContainer();
|
|
432
|
+
// scrollingElement.scrollTo(0, 0);
|
|
433
|
+
this.cleanItems();
|
|
434
|
+
this.updateItems(items);
|
|
435
|
+
this.setLayout();
|
|
436
|
+
}
|
|
437
|
+
updateItems(items) {
|
|
438
|
+
this.scrollItems = this._items = items;
|
|
439
|
+
this.itemsCounter = items.length;
|
|
440
|
+
}
|
|
441
|
+
updateItem(data) {
|
|
442
|
+
let index = 0;
|
|
443
|
+
// Update items list
|
|
444
|
+
index = this.items.findIndex((i) => i && i.UID === data.UID);
|
|
445
|
+
if (index >= 0 && index < this.items.length) {
|
|
446
|
+
this.items[index] = data;
|
|
447
|
+
}
|
|
448
|
+
// Update scrollItems list
|
|
449
|
+
index = this.scrollItems.findIndex((i) => i && i.UID === data.UID);
|
|
450
|
+
if (index >= 0 && index < this.scrollItems.length) {
|
|
451
|
+
this.scrollItems[index] = data;
|
|
452
|
+
this.checkForChanges = new Date().getTime();
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
getIsItemEditable(uid) {
|
|
456
|
+
const item = this.items.filter((x) => x.UID.toString() === uid);
|
|
457
|
+
if (item.length > 0) {
|
|
458
|
+
return item[0].IsEditable;
|
|
459
|
+
}
|
|
460
|
+
else {
|
|
461
|
+
return false;
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
getItemDataByID(uid) {
|
|
465
|
+
return this.items.find((item) => item.UID.toString() === uid);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
PepInternalListComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepInternalListComponent, deps: [{ token: i0.ElementRef }, { token: i1.PepLayoutService }, { token: i0.ChangeDetectorRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
|
|
469
|
+
PepInternalListComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: PepInternalListComponent, selector: "pep-internal-list", inputs: { noDataFoundMsg: "noDataFoundMsg", hideAllSelectionInMulti: "hideAllSelectionInMulti", top: "top", objectId: "objectId", parentId: "parentId", searchCode: "searchCode", supportResizing: "supportResizing", parentScroll: "parentScroll", disabled: "disabled", disableEvents: "disableEvents", disableSelectionItems: "disableSelectionItems", totalsRow: "totalsRow" }, outputs: { fieldClick: "fieldClick", valueChange: "valueChange" }, host: { listeners: { "window:resize": "winResize($event)" } }, viewQueries: [{ propertyName: "noVirtualScrollCont", first: true, predicate: ["noVirtualScrollCont"], descendants: true }, { propertyName: "tableHeader", first: true, predicate: ["tableHeader"], descendants: true }, { propertyName: "selectAllCB", first: true, predicate: ["selectAllCB"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"totalRows == 0\">\n <div class=\"pep-border-bottom\">\n <p class=\"title-xl no-data\">\n {{ (noDataFoundMsg ? noDataFoundMsg : 'LIST.NO_DATA_FOUND') | translate}}\n </p>\n </div>\n <div class=\"no-data-suggestions\">\n <p class=\"suggestions-title title-lg\">\n {{ 'LIST.NO_DATA_FOUND_SUGGESTIONS_TITLE' | translate}}\n </p>\n <ul class=\"suggestions-list body-lg\" [innerHtml]=\"'LIST.NO_DATA_FOUND_SUGGESTIONS_LIST' | translate\"></ul>\n </div>\n</ng-container>\n<ng-container *ngIf=\"totalRows > 0\">\n <div *ngIf=\"isTable\" #tableHeader class=\"table-header\" (mouseup)=\"onListResizeEnd($event)\"\n (mouseenter)=\"onListHeaderMouseEnter($event)\" (mouseleave)=\"onListHeaderMouseLeave($event)\"\n (mousemove)=\"onListResize($event)\">\n\n <div class=\"table-header-padding-top\"></div>\n <fieldset class=\"table-header-fieldset\">\n <fieldset>\n <div *ngFor=\"let field of uiControl?.ControlFields; let j = index\" class=\"header-column pull-left flip\"\n [ngStyle]=\"{ width: field.calcTitleColumnWidthString }\" [ngClass]=\"{\n 'is-resizing': field.ApiName === pressedColumn,\n 'is-first': j === 0,\n 'is-last': j === uiControl?.ControlFields?.length - 1\n }\">\n <label *ngIf=\"field.Title != ''\" id=\"{{ field.ApiName }}\"\n class=\"header-label body-sm pull-left flip text-align-{{ field.Layout.XAlignment }}\"\n title=\"{{ field.Title }}\">\n {{ field.Title }}\n </label>\n <label *ngIf=\"field.Title == ''\" id=\"{{ field.ApiName }}\"\n class=\"header-label body-sm pull-left flip\"> </label>\n\n <div *ngIf=\"supportResizing\" class=\"resize-box pull-right flip\"\n (mousedown)=\"onListResizeStart($event, field.ApiName)\">\n <div class=\"splitter\"></div>\n </div>\n </div>\n </fieldset>\n </fieldset>\n </div>\n\n <div #noVirtualScrollCont [ngClass]=\"{ 'table-body': isTable, 'cards-body': !isTable }\">\n <ng-container *ngTemplateOutlet=\"listData\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"listTotals\"></ng-container>\n</ng-container>\n\n<ng-template #listData>\n <ng-container *ngFor=\"let item of scrollItems; let i = index; let isFirst = first; trackBy: trackByFunc\">\n <ng-container *ngIf=\"isTable\">\n <div class=\"table-row\" (mouseenter)=\"onTableRowMouseEnter($event, item?.UID, item?.Type)\"\n (mouseleave)=\"onTableRowMouseLeave($event, item?.UID, item?.Type)\" [ngClass]=\"{\n selected: getIsItemSelected(item?.UID, item?.Type),\n highlighted: item?.UID + SEPARATOR + item?.Type === selectedItemId\n }\"\n [ngStyle]=\"{ height: calculatedObjectHeight, visibility: showItems || item ? 'visible' : 'hidden' }\">\n <fieldset class=\"table-row-fieldset\" [ngStyle]=\"{ 'background-color': item?.BackgroundColor }\">\n <!-- [canEditObject]=\"!disabled && item?.IsEditable\" -->\n <pep-internal-form [checkForChanges]=\"checkForChanges\" [layout]=\"uiControl\" [data]=\"item\"\n [canEditObject]=\"!disabled\" [objectId]=\"objectId\" [parentId]=\"parentId\"\n [searchCode]=\"searchCode\" [lockEvents]=\"disableSelectionItems\" [layoutType]=\"'table'\"\n [isActive]=\"\n (item?.UID + SEPARATOR + item?.Type === selectedItemId ||\n item?.UID + SEPARATOR + item?.Type === hoveredItemId) && deviceHasMouse\n \" (valueChange)=\"onValueChanged($event)\" (fieldClick)=\"onCustomizeFieldClick($event)\"\n (click)=\"itemClicked($event, item)\">\n </pep-internal-form>\n </fieldset>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!isTable\">\n <div [class]=\"itemClass\" (mouseenter)=\"onCardMouseEnter($event, item?.UID, item?.Type)\"\n (mouseleave)=\"onCardMouseLeave($event, item?.UID, item?.Type)\" [ngClass]=\"{\n selected: getIsItemSelected(item?.UID, item?.Type),\n highlighted: item?.UID + SEPARATOR + item?.Type === selectedItemId,\n 'card-view': viewType === 'cards',\n 'line-view': viewType === 'lines'\n }\" class=\"pull-left flip\"\n [ngStyle]=\"{ height: calculatedObjectHeight, visibility: showItems || item ? 'visible' : 'hidden' }\">\n <!-- [canEditObject]=\"!disabled && item?.IsEditable\" -->\n <pep-internal-form [checkForChanges]=\"checkForChanges\" [layout]=\"uiControl\" [data]=\"item\"\n [canEditObject]=\"!disabled\" [objectId]=\" objectId\" [parentId]=\"parentId\" [searchCode]=\"searchCode\"\n [lockEvents]=\"disableSelectionItems\" [layoutType]=\"'card'\" [isActive]=\"\n (item?.UID + SEPARATOR + item?.Type === selectedItemId ||\n item?.UID + SEPARATOR + item?.Type === hoveredItemId) && deviceHasMouse\n \" (valueChange)=\"onValueChanged($event)\" (fieldClick)=\"onCustomizeFieldClick($event)\"\n (click)=\"itemClicked($event, item)\">\n </pep-internal-form>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #listTotals>\n <div *ngIf=\"totalsRow?.length > 0 && totalsRow.length <= uiControl?.ControlFields.length\" class=\"table-total\">\n <fieldset class=\"table-header-fieldset\">\n <div *ngFor=\"let field of uiControl?.ControlFields; let j = index\" class=\"total-column pull-left flip\"\n [ngStyle]=\"{ width: field.calcTitleColumnWidthString }\">\n <label class=\"total-label body-sm text-align-{{ field.Layout.XAlignment }}\">\n {{ totalsRow[j] }}\n </label>\n </div>\n </fieldset>\n </div>\n</ng-template>", styles: [":host{height:inherit;display:grid}.no-data{margin:var(--pep-spacing-2xl, 2rem) 0}.no-data-suggestions .suggestions-title{margin:var(--pep-spacing-lg, 1rem) 0 var(--pep-spacing-sm, .5rem)}.no-data-suggestions .suggestions-list{margin:0;padding:0;padding-inline-start:var(--pep-spacing-2xl, 2rem)}.table-header{top:0}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.PepInternalFormComponent, selector: "pep-internal-form", inputs: ["isInternal", "isReport", "layout", "lockEvents", "canEditObject", "data", "lockFields", "isActive", "layoutType", "objectId", "parentId", "searchCode", "showTitle", "firstFieldAsLink", "checkForChanges"], outputs: ["valueChange", "formValidationChange", "fieldClick"] }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }] });
|
|
470
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: PepInternalListComponent, decorators: [{
|
|
471
|
+
type: Component,
|
|
472
|
+
args: [{ selector: 'pep-internal-list', host: {
|
|
473
|
+
'(window:resize)': 'winResize($event)',
|
|
474
|
+
}, template: "<ng-container *ngIf=\"totalRows == 0\">\n <div class=\"pep-border-bottom\">\n <p class=\"title-xl no-data\">\n {{ (noDataFoundMsg ? noDataFoundMsg : 'LIST.NO_DATA_FOUND') | translate}}\n </p>\n </div>\n <div class=\"no-data-suggestions\">\n <p class=\"suggestions-title title-lg\">\n {{ 'LIST.NO_DATA_FOUND_SUGGESTIONS_TITLE' | translate}}\n </p>\n <ul class=\"suggestions-list body-lg\" [innerHtml]=\"'LIST.NO_DATA_FOUND_SUGGESTIONS_LIST' | translate\"></ul>\n </div>\n</ng-container>\n<ng-container *ngIf=\"totalRows > 0\">\n <div *ngIf=\"isTable\" #tableHeader class=\"table-header\" (mouseup)=\"onListResizeEnd($event)\"\n (mouseenter)=\"onListHeaderMouseEnter($event)\" (mouseleave)=\"onListHeaderMouseLeave($event)\"\n (mousemove)=\"onListResize($event)\">\n\n <div class=\"table-header-padding-top\"></div>\n <fieldset class=\"table-header-fieldset\">\n <fieldset>\n <div *ngFor=\"let field of uiControl?.ControlFields; let j = index\" class=\"header-column pull-left flip\"\n [ngStyle]=\"{ width: field.calcTitleColumnWidthString }\" [ngClass]=\"{\n 'is-resizing': field.ApiName === pressedColumn,\n 'is-first': j === 0,\n 'is-last': j === uiControl?.ControlFields?.length - 1\n }\">\n <label *ngIf=\"field.Title != ''\" id=\"{{ field.ApiName }}\"\n class=\"header-label body-sm pull-left flip text-align-{{ field.Layout.XAlignment }}\"\n title=\"{{ field.Title }}\">\n {{ field.Title }}\n </label>\n <label *ngIf=\"field.Title == ''\" id=\"{{ field.ApiName }}\"\n class=\"header-label body-sm pull-left flip\"> </label>\n\n <div *ngIf=\"supportResizing\" class=\"resize-box pull-right flip\"\n (mousedown)=\"onListResizeStart($event, field.ApiName)\">\n <div class=\"splitter\"></div>\n </div>\n </div>\n </fieldset>\n </fieldset>\n </div>\n\n <div #noVirtualScrollCont [ngClass]=\"{ 'table-body': isTable, 'cards-body': !isTable }\">\n <ng-container *ngTemplateOutlet=\"listData\"></ng-container>\n </div>\n <ng-container *ngTemplateOutlet=\"listTotals\"></ng-container>\n</ng-container>\n\n<ng-template #listData>\n <ng-container *ngFor=\"let item of scrollItems; let i = index; let isFirst = first; trackBy: trackByFunc\">\n <ng-container *ngIf=\"isTable\">\n <div class=\"table-row\" (mouseenter)=\"onTableRowMouseEnter($event, item?.UID, item?.Type)\"\n (mouseleave)=\"onTableRowMouseLeave($event, item?.UID, item?.Type)\" [ngClass]=\"{\n selected: getIsItemSelected(item?.UID, item?.Type),\n highlighted: item?.UID + SEPARATOR + item?.Type === selectedItemId\n }\"\n [ngStyle]=\"{ height: calculatedObjectHeight, visibility: showItems || item ? 'visible' : 'hidden' }\">\n <fieldset class=\"table-row-fieldset\" [ngStyle]=\"{ 'background-color': item?.BackgroundColor }\">\n <!-- [canEditObject]=\"!disabled && item?.IsEditable\" -->\n <pep-internal-form [checkForChanges]=\"checkForChanges\" [layout]=\"uiControl\" [data]=\"item\"\n [canEditObject]=\"!disabled\" [objectId]=\"objectId\" [parentId]=\"parentId\"\n [searchCode]=\"searchCode\" [lockEvents]=\"disableSelectionItems\" [layoutType]=\"'table'\"\n [isActive]=\"\n (item?.UID + SEPARATOR + item?.Type === selectedItemId ||\n item?.UID + SEPARATOR + item?.Type === hoveredItemId) && deviceHasMouse\n \" (valueChange)=\"onValueChanged($event)\" (fieldClick)=\"onCustomizeFieldClick($event)\"\n (click)=\"itemClicked($event, item)\">\n </pep-internal-form>\n </fieldset>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!isTable\">\n <div [class]=\"itemClass\" (mouseenter)=\"onCardMouseEnter($event, item?.UID, item?.Type)\"\n (mouseleave)=\"onCardMouseLeave($event, item?.UID, item?.Type)\" [ngClass]=\"{\n selected: getIsItemSelected(item?.UID, item?.Type),\n highlighted: item?.UID + SEPARATOR + item?.Type === selectedItemId,\n 'card-view': viewType === 'cards',\n 'line-view': viewType === 'lines'\n }\" class=\"pull-left flip\"\n [ngStyle]=\"{ height: calculatedObjectHeight, visibility: showItems || item ? 'visible' : 'hidden' }\">\n <!-- [canEditObject]=\"!disabled && item?.IsEditable\" -->\n <pep-internal-form [checkForChanges]=\"checkForChanges\" [layout]=\"uiControl\" [data]=\"item\"\n [canEditObject]=\"!disabled\" [objectId]=\" objectId\" [parentId]=\"parentId\" [searchCode]=\"searchCode\"\n [lockEvents]=\"disableSelectionItems\" [layoutType]=\"'card'\" [isActive]=\"\n (item?.UID + SEPARATOR + item?.Type === selectedItemId ||\n item?.UID + SEPARATOR + item?.Type === hoveredItemId) && deviceHasMouse\n \" (valueChange)=\"onValueChanged($event)\" (fieldClick)=\"onCustomizeFieldClick($event)\"\n (click)=\"itemClicked($event, item)\">\n </pep-internal-form>\n </div>\n </ng-container>\n </ng-container>\n</ng-template>\n\n<ng-template #listTotals>\n <div *ngIf=\"totalsRow?.length > 0 && totalsRow.length <= uiControl?.ControlFields.length\" class=\"table-total\">\n <fieldset class=\"table-header-fieldset\">\n <div *ngFor=\"let field of uiControl?.ControlFields; let j = index\" class=\"total-column pull-left flip\"\n [ngStyle]=\"{ width: field.calcTitleColumnWidthString }\">\n <label class=\"total-label body-sm text-align-{{ field.Layout.XAlignment }}\">\n {{ totalsRow[j] }}\n </label>\n </div>\n </fieldset>\n </div>\n</ng-template>", styles: [":host{height:inherit;display:grid}.no-data{margin:var(--pep-spacing-2xl, 2rem) 0}.no-data-suggestions .suggestions-title{margin:var(--pep-spacing-lg, 1rem) 0 var(--pep-spacing-sm, .5rem)}.no-data-suggestions .suggestions-list{margin:0;padding:0;padding-inline-start:var(--pep-spacing-2xl, 2rem)}.table-header{top:0}\n"] }]
|
|
475
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.PepLayoutService }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }]; }, propDecorators: { noDataFoundMsg: [{
|
|
476
|
+
type: Input
|
|
477
|
+
}], hideAllSelectionInMulti: [{
|
|
478
|
+
type: Input
|
|
479
|
+
}], top: [{
|
|
480
|
+
type: Input
|
|
481
|
+
}], objectId: [{
|
|
482
|
+
type: Input
|
|
483
|
+
}], parentId: [{
|
|
484
|
+
type: Input
|
|
485
|
+
}], searchCode: [{
|
|
486
|
+
type: Input
|
|
487
|
+
}], supportResizing: [{
|
|
488
|
+
type: Input
|
|
489
|
+
}], parentScroll: [{
|
|
490
|
+
type: Input
|
|
491
|
+
}], disabled: [{
|
|
492
|
+
type: Input
|
|
493
|
+
}], disableEvents: [{
|
|
494
|
+
type: Input
|
|
495
|
+
}], disableSelectionItems: [{
|
|
496
|
+
type: Input
|
|
497
|
+
}], totalsRow: [{
|
|
498
|
+
type: Input
|
|
499
|
+
}], fieldClick: [{
|
|
500
|
+
type: Output
|
|
501
|
+
}], valueChange: [{
|
|
502
|
+
type: Output
|
|
503
|
+
}], noVirtualScrollCont: [{
|
|
504
|
+
type: ViewChild,
|
|
505
|
+
args: ['noVirtualScrollCont']
|
|
506
|
+
}], tableHeader: [{
|
|
507
|
+
type: ViewChild,
|
|
508
|
+
args: ['tableHeader']
|
|
509
|
+
}], selectAllCB: [{
|
|
510
|
+
type: ViewChild,
|
|
511
|
+
args: ['selectAllCB']
|
|
512
|
+
}] } });
|
|
513
513
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL2Zvcm0vaW50ZXJuYWwtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL2Zvcm0vaW50ZXJuYWwtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLFNBQVMsR0FLWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBSUgsVUFBVSxHQUViLE1BQU0seUJBQXlCLENBQUM7Ozs7OztBQWdCakMsTUFBTSxPQUFPLHdCQUF3QjtJQXFFakMsWUFDWSxPQUFtQixFQUNuQixhQUErQixFQUMvQixFQUFxQixFQUNyQixRQUFtQjtRQUhuQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNyQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBeEV0QixtQkFBYyxHQUFHLGlCQUFpQixDQUFDO1FBQ25DLDRCQUF1QixHQUFHLEtBQUssQ0FBQztRQUVoQyxRQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDVCxhQUFRLEdBQUcsR0FBRyxDQUFDO1FBQ2YsYUFBUSxHQUFHLEdBQUcsQ0FBQztRQUNmLGVBQVUsR0FBRyxHQUFHLENBQUM7UUFDMUIsa0NBQWtDO1FBQ3pCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLGlCQUFZLEdBQXFCLElBQUksQ0FBQztRQUN0QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5QixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBRXhCLFlBQVk7UUFDWixnR0FBZ0c7UUFFaEcsZUFBVSxHQUFzQixJQUFJLFlBQVksRUFBMkIsQ0FBQztRQUU1RSxnQkFBVyxHQUFnRCxJQUFJLFlBQVksRUFBaUMsQ0FBQztRQU10RyxjQUFTLEdBQWMsSUFBSSxDQUFDO1FBQzVCLGNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV0QixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ1IsbUNBQThCLEdBQUcsSUFBSSxDQUFDO1FBRXRDLFdBQU0sR0FBMEIsSUFBSSxDQUFDO1FBSzdDLHNCQUFzQjtRQUNkLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFJVixjQUFTLEdBQUcsR0FBRyxDQUFDO1FBRXZCLGlCQUFZLEdBQVEsSUFBSSxDQUFDO1FBRXpCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBRVgsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUUzQixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUV2QiwyQkFBMkI7UUFFM0IsYUFBYTtRQUNiLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2Ysb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFFcEIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsb0JBQWUsR0FBUSxJQUFJLENBQUM7UUFDNUIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBU3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxFQUFFO1lBQ3pELElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQTlDRCxJQUFJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQThDRCxRQUFRO1FBQ0osSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFPO1FBQ2YsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUM1QjtJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1AsMEJBQTBCO1FBQzFCLHNDQUFzQztRQUN0QyxJQUFJO1FBQ0osd0JBQXdCO1FBQ3hCLG9DQUFvQztRQUNwQyxJQUFJO1FBQ0oseUJBQXlCO1FBQ3pCLHFDQUFxQztRQUNyQyxJQUFJO0lBQ1IsQ0FBQztJQUVELGlCQUFpQjtRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUU7WUFDM0MsT0FBTztTQUNWO1FBRUQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUM7UUFFakMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUMsK0NBQStDO1FBQ3JFLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQzNDLENBQUM7UUFDRiwwREFBMEQ7UUFDMUQsTUFBTSxxQkFBcUIsR0FDdkIsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFdkUsTUFBTSxlQUFlLEdBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEdBQUcsQ0FBQztZQUN0RCxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWE7WUFDeEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztRQUVuRCwwSEFBMEg7UUFDMUgsTUFBTSxXQUFXLEdBQ2IsZUFBZSxDQUFDLFlBQVksR0FBRyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUMzRCxDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQ0FBa0M7UUFFL0MsMEVBQTBFO1FBQzFFLE1BQU0sbUJBQW1CLEdBQ3JCLHFCQUFxQixHQUFHLHNCQUFzQixHQUFHLFdBQVcsQ0FBQztRQUNqRSxJQUFJLENBQUMsY0FBYyxHQUFHLGVBQWUsQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7SUFDNUUsQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVPLFdBQVcsQ0FBQyxTQUFrQjtRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFlBQVksR0FBRyxJQUFJO1FBQy9ELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxhQUFhLENBQUMsTUFBYyxFQUFFLFFBQVEsR0FBRyxFQUFFO1FBQ3ZDLE9BQU8sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO0lBQzlDLENBQUM7SUFFRCxTQUFTO1FBQ0wsSUFDSSxJQUFJLENBQUMsU0FBUyxLQUFLLENBQUM7WUFDcEIsQ0FBQyxJQUFJLENBQUMsU0FBUztZQUNmLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhO1lBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQzNDO1lBQ0UsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDeEMsSUFBSSxFQUFFLENBQUMsV0FBVyxLQUFLLENBQUMsRUFBRTtnQkFDdEIsRUFBRSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7YUFDdkI7WUFFRCxJQUNJLElBQUksQ0FBQyxPQUFPO2dCQUNaLENBQUMsRUFBRSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsS0FBSztvQkFDOUIsZ0RBQWdEO29CQUNoRCxFQUFFLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxTQUFTO29CQUNyQyxFQUFFLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyw2QkFBNkI7b0JBQ3pELEVBQUUsQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDLDBCQUEwQjtvQkFDdEQsRUFBRSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsc0JBQXNCO29CQUNsRCxFQUFFLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxtQkFBbUI7b0JBQy9DLEVBQUUsQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDLE9BQU87b0JBQ25DLEVBQUUsQ0FBQyxPQUFPLEtBQUssZUFBZTtvQkFDOUIsRUFBRSxDQUFDLE9BQU8sS0FBSyxrQkFBa0IsQ0FBQyxFQUN4QztnQkFDRSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7YUFDNUI7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDM0I7UUFFRCx5QkFBeUI7UUFDekIsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUM1QjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3BCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxDQUFDLDhCQUE4QjtRQUMxRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDbkQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUM7UUFFakMseUVBQXlFO1FBQ3pFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLDhCQUE4QjtvQkFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUMvQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLGVBQWUsS0FBSyxDQUFDLENBQ25DLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQzthQUN0QjtTQUNKO1FBRUQsa0dBQWtHO1FBQ2xHLElBQUksQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUU7WUFDdEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQ3hELENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FDekMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7WUFFMUMsSUFBSSxNQUFNLENBQUMsVUFBVSxHQUFHLG1CQUFtQixFQUFFO2dCQUN6QyxJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFDO2FBQzlDO1NBQ0o7UUFFRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUUzQixxQkFBcUI7UUFDckIsSUFBSSxJQUFJLENBQUMsOEJBQThCLEVBQUU7WUFDckMsTUFBTSxjQUFjLEdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUMzRCxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FDekIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7WUFFMUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDekMsTUFBTSxjQUFjLEdBQW1CLElBQUksQ0FBQyxTQUFTO3FCQUNoRCxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLE1BQU0seUJBQXlCLEdBQzNCLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUM7Z0JBRXhELGNBQWMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDdkMsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLHlCQUF5QixDQUFDLEdBQUcsR0FBRyxDQUMxRCxDQUFDO2dCQUVGLElBQUksS0FBSyxLQUFLLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3RCLGNBQWMsQ0FBQywwQkFBMEIsR0FBRyxjQUFjLENBQUMscUJBQXFCO3dCQUM1RSxjQUFjLEdBQUcsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLENBQUMsV0FBVztpQkFDL0Q7cUJBQU07b0JBQ0gsY0FBYyxDQUFDLDBCQUEwQixHQUFHLGNBQWMsQ0FBQyxxQkFBcUI7d0JBQzVFLGNBQWMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO29CQUMxQyxrQkFBa0IsSUFBSSxjQUFjLENBQUMsZUFBZSxDQUFDO2lCQUN4RDthQUNKO1lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUMxQixPQUFPLEVBQ1AsU0FBUyxDQUNaLENBQUM7U0FDTDthQUFNO1lBQ0gsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDekMsTUFBTSxjQUFjLEdBQW1CLElBQUksQ0FBQyxTQUFTO3FCQUNoRCxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDaEMsY0FBYyxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQzdDLENBQUM7Z0JBRUYsSUFBSSxLQUFLLEtBQUssTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDdEIsY0FBYyxDQUFDLDBCQUEwQjt3QkFDckMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO29CQUM3QixjQUFjLENBQUMscUJBQXFCO3dCQUNoQyxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsMEJBQTBCO2lCQUMvRDtxQkFBTTtvQkFDSCxjQUFjLENBQUMsMEJBQTBCLEdBQUcsY0FBYyxDQUFDLHFCQUFxQjt3QkFDNUUsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2lCQUNoQztnQkFFRCxrQkFBa0IsSUFBSSxpQkFBaUIsQ0FBQzthQUMzQztZQUVELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFDMUIsT0FBTyxFQUNQLGtCQUFrQixHQUFHLHNCQUFzQixHQUFHLElBQUksQ0FDckQsQ0FBQztTQUNMO0lBQ0wsQ0FBQztJQUVPLGNBQWM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQUssRUFBRSxTQUFTO1FBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsV0FBVyxDQUFDO1FBQ3JFLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO0lBQzlFLENBQUM7SUFFRCxZQUFZLENBQUMsS0FBSztRQUNkLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFO2dCQUN6QyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsQ0FBQztnQkFDdkIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztZQUU1QixzRUFBc0U7WUFDdEUsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxFQUFFLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRTtnQkFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO2dCQUNuRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztnQkFFM0IsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtvQkFDekMsTUFBTSxjQUFjLEdBQW1CLElBQUksQ0FBQyxTQUFTO3lCQUNoRCxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBRTFCLElBQUksS0FBSyxLQUFLLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ3RCLGdEQUFnRDt3QkFDaEQsSUFBSSxJQUFJLENBQUMsOEJBQThCLEVBQUU7NEJBQ3JDLGNBQWMsQ0FBQywwQkFBMEIsR0FBRyxjQUFjLENBQUMscUJBQXFCO2dDQUM1RSxjQUFjLEdBQUcsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLENBQUMsV0FBVzt5QkFDL0Q7NkJBQU07NEJBQ0gsSUFBSSxjQUFjLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0NBQy9DLGNBQWMsQ0FBQyxlQUFlO29DQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztnQ0FDakMsY0FBYyxDQUFDLDBCQUEwQjtvQ0FDckMsY0FBYyxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7Z0NBQzFDLGNBQWMsQ0FBQyxxQkFBcUI7b0NBQ2hDLGNBQWMsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQzs2QkFDakQ7eUJBQ0o7cUJBQ0o7eUJBQU0sSUFBSSxjQUFjLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxhQUFhLEVBQUU7d0JBQ3RELGNBQWMsQ0FBQyxlQUFlOzRCQUMxQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQzt3QkFDakMsY0FBYyxDQUFDLDBCQUEwQixHQUFHLGNBQWMsQ0FBQyxxQkFBcUI7NEJBQzVFLGNBQWMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO3FCQUM3QztvQkFFRCxrQkFBa0IsSUFBSSxjQUFjLENBQUMsZUFBZSxDQUFDO2lCQUN4RDtnQkFFRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDbEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQzFCLE9BQU8sRUFDUCxJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQzNDLENBQUM7YUFDTDtZQUVELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMvQztJQUNMLENBQUM7SUFFRCxTQUFTLENBQUMsRUFBRSxFQUFFLGNBQWM7UUFDeEIsd0VBQXdFO1FBQ3hFLElBQUksY0FBYyxLQUFLLFNBQVMsRUFBRTtZQUM5QixjQUFjLEdBQUcsUUFBUSxDQUFDO1NBQzdCO1FBQ0QsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFFdEIsT0FDSSxDQUFDO1lBQ0QsQ0FBQyxDQUFDLFNBQVMsS0FBSyxFQUFFO1lBQ2xCLENBQUMsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQyxjQUFjLEtBQUssUUFBUSxFQUM3QjtZQUNFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNaLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDO1NBQ3BCO1FBQ0QsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtZQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaURBQWlEO1NBQ3BFO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELGVBQWUsQ0FBQyxLQUFLO1FBQ2pCLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQy9CLElBQ0ksS0FBSztnQkFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDM0Q7Z0JBQ0UsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2FBQ3pCO2lCQUFNO2dCQUNILFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ1osSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUMxQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDVDtTQUNKO0lBQ0wsQ0FBQztJQUVELHNCQUFzQixDQUFDLEtBQUs7UUFDeEIsK0JBQStCO0lBQ25DLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxLQUFLO1FBQ3hCLGdDQUFnQztRQUNoQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQVU7UUFDbkIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3BCLE9BQU87U0FDVjtRQUVELCtCQUErQjtRQUMvQixJQUNJLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxXQUFXO1lBQ2xDLE9BQU8sS0FBSyxDQUFDLEdBQUcsS0FBSyxXQUFXLEVBQ2xDO1lBQ0UsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEtBQUssQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUM7UUFFakUsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUI7SUFDTCxDQUFDO0lBRUQsa0JBQWtCO1FBQ2QsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDMUQsQ0FBQztJQUVELGNBQWMsQ0FBQyxXQUEwQztRQUNyRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQscUJBQXFCLENBQ2pCLHlCQUFrRDtRQUVsRCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUU7WUFDZixPQUFPO1NBQ1Y7UUFFRCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxhQUFhLENBQUMsSUFBb0I7UUFDOUIsSUFBSSxJQUFJLENBQUMscUJBQXFCLEVBQUU7WUFDNUIsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNO1lBQ0gsTUFBTSx5QkFBeUIsR0FDM0IsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDO1lBQ3pDLE9BQU8seUJBQXlCLENBQUM7U0FDcEM7SUFDTCxDQUFDO0lBRUQsaUJBQWlCLENBQUMsTUFBYyxFQUFFLFFBQVEsR0FBRyxFQUFFO1FBQzNDLElBQUksVUFBVSxHQUFHLEtBQUssQ0FBQztRQUV2QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RCxVQUFVLEdBQUcsVUFBVSxLQUFLLElBQUksQ0FBQyxjQUFjLENBQUM7UUFFaEQsT0FBTyxVQUFVLENBQUM7SUFDdEIsQ0FBQztJQUVPLGNBQWMsQ0FDbEIsTUFBTSxFQUNOLHNCQUErQixFQUMvQixRQUFnQixFQUNoQixTQUFrQjtRQUVsQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUV4RCw0QkFBNEI7UUFDNUIsSUFBSSxTQUFTLEVBQUU7WUFDWCxtQkFBbUI7WUFDbkIsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFVLENBQUM7U0FDcEM7YUFBTTtZQUNILElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxVQUFVLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO2FBQzVCO1NBQ0o7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLENBQU0sRUFBRSxJQUFvQjtRQUNwQyxtQkFBbUI7UUFDbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3RDLElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztRQUV0QixJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDckMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUMzRCxTQUFTLEdBQUcsSUFBSSxDQUFDO1NBQ3BCO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGNBQWMsQ0FDZixNQUFNLEVBQ04sSUFBSSxDQUFDLHNCQUFzQixFQUMzQixRQUFRLEVBQ1IsSUFBSSxDQUNQLENBQUM7U0FDTDthQUFNO1lBQ0gsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO2dCQUNmLE9BQU87YUFDVjtTQUNKO1FBRUQsa0VBQWtFO0lBQ3RFLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFVLEVBQUUsTUFBYyxFQUFFLFFBQWdCO1FBQzdELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3RCLE9BQU87U0FDVjtRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUFVLEVBQUUsTUFBYyxFQUFFLFFBQWdCO1FBQzdELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFVLEVBQUUsTUFBYyxFQUFFLFFBQWdCO1FBQ3pELElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO1lBQ3RCLE9BQU87U0FDVjtRQUVELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxhQUFhLEdBQUcsVUFBVSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxLQUFVLEVBQUUsTUFBYyxFQUFFLFFBQWdCO1FBQ3pELElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxrREFBa0Q7SUFDbEQsU0FBUyxDQUFDLENBQUM7UUFDUCxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhLEVBQUUsSUFBb0I7UUFDM0MsT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQy9DLENBQUM7SUFFRCxVQUFVO1FBQ04sSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDdEIsSUFBSSxDQUFDLE1BQU07WUFDUCxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFpQixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRSxJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxZQUFZO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzFCLENBQUM7SUFFRCxZQUFZLENBQ1IsU0FBb0IsRUFDcEIsU0FBaUIsRUFDakIsS0FBdUIsRUFDdkIsV0FBNEIsT0FBTyxFQUNuQyxTQUFTLEdBQUcsRUFBRTtRQUVkLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxLQUFLLE9BQU8sQ0FBQztRQUNwQywwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFFM0Isc0VBQXNFO1FBQ3RFLHNEQUFzRDtRQUN0RCxtQ0FBbUM7UUFFbkMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBRWxCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFTyxXQUFXLENBQUMsS0FBdUI7UUFDdkMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUN2QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDckMsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFTO1FBQ2hCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUVkLG9CQUFvQjtRQUNwQixLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3RCxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO1NBQzVCO1FBRUQsMEJBQTBCO1FBQzFCLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRW5FLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUU7WUFDL0MsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDL0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQy9DO0lBQ0wsQ0FBQztJQUVELGlCQUFpQixDQUFDLEdBQVc7UUFDekIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDaEUsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUNqQixPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7U0FDN0I7YUFBTTtZQUNILE9BQU8sS0FBSyxDQUFDO1NBQ2hCO0lBQ0wsQ0FBQztJQUVELGVBQWUsQ0FBQyxHQUFXO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDbEUsQ0FBQzs7cUhBMW1CUSx3QkFBd0I7eUdBQXhCLHdCQUF3QiwwM0JDcENyQyxnNU1BNEdjOzJGRHhFRCx3QkFBd0I7a0JBUnBDLFNBQVM7K0JBQ0ksbUJBQW1CLFFBR3ZCO3dCQUNGLGlCQUFpQixFQUFFLG1CQUFtQjtxQkFDekM7d0xBR1EsY0FBYztzQkFBdEIsS0FBSztnQkFDRyx1QkFBdUI7c0JBQS9CLEtBQUs7Z0JBRUcsR0FBRztzQkFBWCxLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS04sVUFBVTtzQkFEVCxNQUFNO2dCQUdQLFdBQVc7c0JBRFYsTUFBTTtnQkFHMkIsbUJBQW1CO3NCQUFwRCxTQUFTO3VCQUFDLHFCQUFxQjtnQkFDTixXQUFXO3NCQUFwQyxTQUFTO3VCQUFDLGFBQWE7Z0JBQ0UsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgSW5wdXQsXG4gICAgT3V0cHV0LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBPbkluaXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFZpZXdDaGlsZCxcbiAgICBFbGVtZW50UmVmLFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICAgIFBlcExheW91dFNlcnZpY2UsXG4gICAgVUlDb250cm9sLFxuICAgIFVJQ29udHJvbEZpZWxkLFxuICAgIEZJRUxEX1RZUEUsXG4gICAgT2JqZWN0c0RhdGFSb3csXG59IGZyb20gJ0BwZXBwZXJpLWFkZG9ucy9uZ3gtbGliJztcbmltcG9ydCB7XG4gICAgSVBlcEZvcm1GaWVsZENsaWNrRXZlbnQsXG4gICAgSVBlcEZvcm1GaWVsZFZhbHVlQ2hhbmdlRXZlbnQsXG59IGZyb20gJy4vZm9ybS5tb2RlbCc7XG5cbmV4cG9ydCB0eXBlIFBlcExpc3RWaWV3VHlwZSA9ICdjYXJkcycgfCAnbGluZXMnIHwgJ3RhYmxlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdwZXAtaW50ZXJuYWwtbGlzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ludGVybmFsLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2ludGVybmFsLWxpc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgICBob3N0OiB7XG4gICAgICAgICcod2luZG93OnJlc2l6ZSknOiAnd2luUmVzaXplKCRldmVudCknLFxuICAgIH0sXG59KVxuZXhwb3J0IGNsYXNzIFBlcEludGVybmFsTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xuICAgIEBJbnB1dCgpIG5vRGF0YUZvdW5kTXNnID0gJ0l0ZW1zIG5vdCBmb3VuZCc7XG4gICAgQElucHV0KCkgaGlkZUFsbFNlbGVjdGlvbkluTXVsdGkgPSBmYWxzZTtcblxuICAgIEBJbnB1dCgpIHRvcCA9IC0xO1xuICAgIEBJbnB1dCgpIG9iamVjdElkID0gJzAnO1xuICAgIEBJbnB1dCgpIHBhcmVudElkID0gJzAnO1xuICAgIEBJbnB1dCgpIHNlYXJjaENvZGUgPSAnMCc7XG4gICAgLy8gQElucHV0KCkgc2hvd1RvcEJvcmRlciA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHN1cHBvcnRSZXNpemluZyA9IHRydWU7XG4gICAgQElucHV0KCkgcGFyZW50U2Nyb2xsOiBFbGVtZW50IHwgV2luZG93ID0gbnVsbDtcbiAgICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGRpc2FibGVFdmVudHMgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBkaXNhYmxlU2VsZWN0aW9uSXRlbXMgPSBmYWxzZTtcbiAgICBASW5wdXQoKSB0b3RhbHNSb3cgPSBbXTtcblxuICAgIC8vIEBPdXRwdXQoKVxuICAgIC8vIGl0ZW1DbGljazogRXZlbnRFbWl0dGVyPElQZXBMaXN0SXRlbUNsaWNrRXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGVwTGlzdEl0ZW1DbGlja0V2ZW50PigpO1xuICAgIEBPdXRwdXQoKVxuICAgIGZpZWxkQ2xpY2s6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxJUGVwRm9ybUZpZWxkQ2xpY2tFdmVudD4oKTtcbiAgICBAT3V0cHV0KClcbiAgICB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPElQZXBGb3JtRmllbGRWYWx1ZUNoYW5nZUV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBlcEZvcm1GaWVsZFZhbHVlQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgICBAVmlld0NoaWxkKCdub1ZpcnR1YWxTY3JvbGxDb250Jykgbm9WaXJ0dWFsU2Nyb2xsQ29udDogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCd0YWJsZUhlYWRlcicpIHRhYmxlSGVhZGVyOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ3NlbGVjdEFsbENCJykgc2VsZWN0QWxsQ0I6IGFueTtcblxuICAgIHB1YmxpYyB1aUNvbnRyb2w6IFVJQ29udHJvbCA9IG51bGw7XG4gICAgcHVibGljIHRvdGFsUm93cyA9IC0xO1xuICAgIGl0ZW1DbGFzczogc3RyaW5nO1xuICAgIGlzVGFibGUgPSBmYWxzZTtcbiAgICBwcml2YXRlIGhhc0NvbHVtbldpZHRoT2ZUeXBlUGVyY2VudGFnZSA9IHRydWU7XG5cbiAgICBwcml2YXRlIF9pdGVtczogQXJyYXk8T2JqZWN0c0RhdGFSb3c+ID0gbnVsbDtcbiAgICBnZXQgaXRlbXMoKTogQXJyYXk8T2JqZWN0c0RhdGFSb3c+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2l0ZW1zO1xuICAgIH1cblxuICAgIC8vIGlzQ2FyZFZpZXcgPSBmYWxzZTtcbiAgICBwcml2YXRlIGl0ZW1zQ291bnRlciA9IDA7XG4gICAgc2hvd0l0ZW1zID0gdHJ1ZTtcbiAgICB2aWV3VHlwZTogUGVwTGlzdFZpZXdUeXBlO1xuICAgIHNjcm9sbEl0ZW1zOiBBcnJheTxPYmplY3RzRGF0YVJvdz47XG5cbiAgICBwdWJsaWMgU0VQQVJBVE9SID0gJywnO1xuXG4gICAgbmF0aXZlV2luZG93OiBhbnkgPSBudWxsO1xuXG4gICAgc2VsZWN0ZWRJdGVtSWQgPSAnJztcbiAgICBob3ZlcmVkSXRlbUlkID0gJyc7XG5cbiAgICBwcml2YXRlIGxvY2tFdmVudHMgPSBmYWxzZTtcbiAgICBwcml2YXRlIGNvbnRhaW5lcldpZHRoID0gMDtcblxuICAgIGRldmljZUhhc01vdXNlID0gZmFsc2U7XG5cbiAgICAvLyBoZWFkZXJJc0luRm9jdXMgPSBmYWxzZTtcblxuICAgIC8vIEZvciByZXNpemVcbiAgICBwcmVzc2VkQ29sdW1uID0gJyc7XG4gICAgc3RhcnRYID0gMDtcbiAgICBzdGFydFdpZHRoID0gMDtcbiAgICB0YWJsZVN0YXJ0V2lkdGggPSAwO1xuXG4gICAgaXNVc2VyU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICBjaGVja0ZvckNoYW5nZXM6IGFueSA9IG51bGw7XG4gICAgdXNlVmlydHVhbFNjcm9sbCA9IHRydWU7XG4gICAgY2FsY3VsYXRlZE9iamVjdEhlaWdodDogc3RyaW5nO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBsYXlvdXRTZXJ2aWNlOiBQZXBMYXlvdXRTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNkOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXG4gICAgKSB7XG4gICAgICAgIHRoaXMubmF0aXZlV2luZG93ID0gd2luZG93O1xuICAgICAgICB0aGlzLmRldmljZUhhc01vdXNlID0gdGhpcy5sYXlvdXRTZXJ2aWNlLmdldERldmljZUhhc01vdXNlKCk7XG4gICAgICAgIHRoaXMubGF5b3V0U2VydmljZS5vbk1vdXNlT3ZlciQuc3Vic2NyaWJlKChkZXZpY2VIYXNNb3VzZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5kZXZpY2VIYXNNb3VzZSA9IGRldmljZUhhc01vdXNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jb250YWluZXJXaWR0aCA9IDA7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250YWluZXJXaWR0aCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldENvbnRhaW5lcldpZHRoKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgLy8gaWYgKHRoaXMudmFsdWVDaGFuZ2UpIHtcbiAgICAgICAgLy8gICAgIHRoaXMudmFsdWVDaGFuZ2UudW5zdWJzY3JpYmUoKTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBpZiAodGhpcy5pdGVtQ2xpY2spIHtcbiAgICAgICAgLy8gICAgIHRoaXMuaXRlbUNsaWNrLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gaWYgKHRoaXMuZmllbGRDbGljaykge1xuICAgICAgICAvLyAgICAgdGhpcy5maWVsZENsaWNrLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBzZXRDb250YWluZXJXaWR0aCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWxlY3Rpb25DaGVja0JveFdpZHRoID0gMDtcblxuICAgICAgICBjb25zdCByb3dIZWlnaHQgPSA0MDsgLy8gdGhlIHRhYmxlIHJvdyBoZWlnaHQgKDIuNXJlbSAqIDE2Zm9udC1zaXplKS5cbiAgICAgICAgY29uc3Qgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKFxuICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudFxuICAgICAgICApO1xuICAgICAgICAvLyBUaGUgY29udGFpbmVyLWZsdWlkIGNsYXNzIHBhZGRpbmcgbGVmdCArIHJpZ2h0ICsgYm9yZGVyXG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckZsdWlkU3BhY2luZyA9XG4gICAgICAgICAgICBwYXJzZUludChzdHlsZS5wYWRkaW5nTGVmdCwgMTApICsgcGFyc2VJbnQoc3R5bGUucGFkZGluZ1JpZ2h0LCAxMCk7XG5cbiAgICAgICAgY29uc3QgcGFyZW50Q29udGFpbmVyID1cbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudCA+IDBcbiAgICAgICAgICAgICAgICA/IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudFxuICAgICAgICAgICAgICAgIDogdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudDtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgaWYgdmVydGljYWwgc2Nyb2xsIHNob3VsZCBhcHBlYXIsIGlmIHNvIHNldCB0aGUgc2Nyb2xsIHdpZHRoLiAodGhpcy50b3RhbFJvd3MgKyAxKSArIDEgaXMgZm9yIHRoZSBoZWFkZXIgcm93LlxuICAgICAgICBjb25zdCBzY3JvbGxXaWR0aCA9XG4gICAgICAgICAgICBwYXJlbnRDb250YWluZXIuY2xpZW50SGVpZ2h0IDwgcm93SGVpZ2h0ICogKHRoaXMudG90YWxSb3dzICsgMSlcbiAgICAgICAgICAgICAgICA/IDE4XG4gICAgICAgICAgICAgICAgOiAwOyAvLyAxOCBpcyB0aGUgZGVmYXVsdCBzY3JvbGwgd2lkdGguXG5cbiAgICAgICAgLy8gVGhlIHNlbGVjdGlvbkNoZWNrQm94V2lkdGggd2lkdGggKyBjb250YWluZXJGbHVpZFNwYWNpbmcgKyBzY3JvbGxXaWR0aC5cbiAgICAgICAgY29uc3Qgcm93SGVhZGVyV2lkdGhUb1N1YiA9XG4gICAgICAgICAgICBjb250YWluZXJGbHVpZFNwYWNpbmcgKyBzZWxlY3Rpb25DaGVja0JveFdpZHRoICsgc2Nyb2xsV2lkdGg7XG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSBwYXJlbnRDb250YWluZXIub2Zmc2V0V2lkdGggLSByb3dIZWFkZXJXaWR0aFRvU3ViO1xuICAgIH1cblxuICAgIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNsZWFuSXRlbXMoKTtcbiAgICAgICAgdGhpcy51aUNvbnRyb2wgPSBudWxsO1xuICAgIH1cblxuICAgIHByaXZhdGUgdG9nZ2xlSXRlbXMoaXNWaXNpYmxlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hvd0l0ZW1zID0gaXNWaXNpYmxlO1xuICAgICAgICB0aGlzLmxvY2tFdmVudHMgPSAhaXNWaXNpYmxlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlU2Nyb2xsSXRlbXMoc3RhcnRJbmRleCwgZW5kSW5kZXgsIGxvYWRJbkNodW5rcyA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zY3JvbGxJdGVtcyA9IHRoaXMuaXRlbXMuc2xpY2Uoc3RhcnRJbmRleCwgZW5kSW5kZXgpO1xuICAgIH1cblxuICAgIGdldFVuaXFJdGVtSWQoaXRlbUlkOiBzdHJpbmcsIGl0ZW1UeXBlID0gJycpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaXRlbUlkICsgdGhpcy5TRVBBUkFUT1IgKyBpdGVtVHlwZTtcbiAgICB9XG5cbiAgICBzZXRMYXlvdXQoKTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMudG90YWxSb3dzID09PSAwIHx8XG4gICAgICAgICAgICAhdGhpcy51aUNvbnRyb2wgfHxcbiAgICAgICAgICAgICF0aGlzLnVpQ29udHJvbC5Db250cm9sRmllbGRzIHx8XG4gICAgICAgICAgICB0aGlzLnVpQ29udHJvbC5Db250cm9sRmllbGRzLmxlbmd0aCA9PT0gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudWlDb250cm9sLkNvbnRyb2xGaWVsZHMuZm9yRWFjaCgoY2YpID0+IHtcbiAgICAgICAgICAgIGlmIChjZi5Db2x1bW5XaWR0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNmLkNvbHVtbldpZHRoID0gMTA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLmlzVGFibGUgJiZcbiAgICAgICAgICAgICAgICAoY2YuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLkltYWdlIHx8XG4gICAgICAgICAgICAgICAgICAgIC8vIGNmLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5JbmRpY2F0b3JzIHx8ID8/P1xuICAgICAgICAgICAgICAgICAgICBjZi5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuU2lnbmF0dXJlIHx8XG4gICAgICAgICAgICAgICAgICAgIGNmLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5OdW1iZXJJbnRlZ2VyUXVhbnRpdHlTZWxlY3RvciB8fFxuICAgICAgICAgICAgICAgICAgICBjZi5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVyUmVhbFF1YW50aXR5U2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgY2YuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLk51bWJlckludGVnZXJGb3JNYXRyaXggfHxcbiAgICAgICAgICAgICAgICAgICAgY2YuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLk51bWJlclJlYWxGb3JNYXRyaXggfHxcbiAgICAgICAgICAgICAgICAgICAgY2YuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLlBhY2thZ2UgfHxcbiAgICAgICAgICAgICAgICAgICAgY2YuQXBpTmFtZSA9PT0gJ1VuaXRzUXVhbnRpdHknIHx8XG4gICAgICAgICAgICAgICAgICAgIGNmLkFwaU5hbWUgPT09ICdRdWFudGl0eVNlbGVjdG9yJylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGNmLkxheW91dC5YQWxpZ25tZW50ID0gMztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNkWydkZXN0cm95ZWQnXSkge1xuICAgICAgICAgICAgdGhpcy5jZC5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgdGhlIGNvbHVtbnMgd2lkdGguXG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lcldpZHRoIDw9IDApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29udGFpbmVyV2lkdGgoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsY0NvbHVtbnNXaWR0aCgpO1xuICAgICAgICB0aGlzLmNoZWNrRm9yQ2hhbmdlcyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2FsY0NvbHVtbnNXaWR0aCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZml4ZWRNdWx0aXBsZSA9IDMuNzg7IC8vIGZvciBjb252ZXJ0aW5nIGVtIHRvIHBpeGVsLlxuICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLnVpQ29udHJvbC5Db250cm9sRmllbGRzLmxlbmd0aDtcbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uQ2hlY2tCb3hXaWR0aCA9IDA7XG5cbiAgICAgICAgLy8gSXMgdGFibGUgQU5EIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjb2x1bW4gb2Ygd2lkdGggdHlwZSBvZiBwZXJjZW50YWdlLlxuICAgICAgICBpZiAodGhpcy5pc1RhYmxlKSB7XG4gICAgICAgICAgICBpZiAodGhpcy51aUNvbnRyb2wgJiYgdGhpcy51aUNvbnRyb2wuQ29udHJvbEZpZWxkcykge1xuICAgICAgICAgICAgICAgIHRoaXMuaGFzQ29sdW1uV2lkdGhPZlR5cGVQZXJjZW50YWdlID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51aUNvbnRyb2wuQ29udHJvbEZpZWxkcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2YpID0+IGNmLkNvbHVtbldpZHRoVHlwZSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICApLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBjb2x1bW5zIHNpemUgaXMgZml4ZWQgYW5kIHRoZSB0b3RhbCBpcyBzbWFsbCB0aGVuIHRoZSBjb250YWluZXIgY2hhbmdlIGl0IHRvIHBlcmNlbnRhZ2UuXG4gICAgICAgIGlmICghdGhpcy5oYXNDb2x1bW5XaWR0aE9mVHlwZVBlcmNlbnRhZ2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHRvdGFsRml4ZWRDb2xzV2lkdGggPSB0aGlzLnVpQ29udHJvbC5Db250cm9sRmllbGRzLm1hcChcbiAgICAgICAgICAgICAgICAoY2YpID0+IGNmLkNvbHVtbldpZHRoICogZml4ZWRNdWx0aXBsZVxuICAgICAgICAgICAgKS5yZWR1Y2UoKHN1bSwgY3VycmVudCkgPT4gc3VtICsgY3VycmVudCk7XG5cbiAgICAgICAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA+IHRvdGFsRml4ZWRDb2xzV2lkdGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0NvbHVtbldpZHRoT2ZUeXBlUGVyY2VudGFnZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdG90YWxDYWxjQ29sc1dpZHRoID0gMDtcblxuICAgICAgICAvLyBDYWxjIGJ5IHBlcmNlbnRhZ2VcbiAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uV2lkdGhPZlR5cGVQZXJjZW50YWdlKSB7XG4gICAgICAgICAgICBjb25zdCB0b3RhbENvbHNXaWR0aDogbnVtYmVyID0gdGhpcy51aUNvbnRyb2wuQ29udHJvbEZpZWxkcy5tYXAoXG4gICAgICAgICAgICAgICAgKGNmKSA9PiBjZi5Db2x1bW5XaWR0aFxuICAgICAgICAgICAgKS5yZWR1Y2UoKHN1bSwgY3VycmVudCkgPT4gc3VtICsgY3VycmVudCk7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1aUNvbnRyb2xGaWVsZDogVUlDb250cm9sRmllbGQgPSB0aGlzLnVpQ29udHJvbFxuICAgICAgICAgICAgICAgICAgICAuQ29udHJvbEZpZWxkc1tpbmRleF07XG4gICAgICAgICAgICAgICAgY29uc3QgY2FsY0NvbHVtbldpZHRoUGVyY2VudGFnZSA9XG4gICAgICAgICAgICAgICAgICAgICgxMDAgLyB0b3RhbENvbHNXaWR0aCkgKiB1aUNvbnRyb2xGaWVsZC5Db2x1bW5XaWR0aDtcblxuICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aCA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmNvbnRhaW5lcldpZHRoICogY2FsY0NvbHVtbldpZHRoUGVyY2VudGFnZSkgLyAxMDBcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSBsZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNUaXRsZUNvbHVtbldpZHRoU3RyaW5nID0gdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoU3RyaW5nID1cbiAgICAgICAgICAgICAgICAgICAgICAgICdjYWxjKDEwMCUgLSAnICsgdG90YWxDYWxjQ29sc1dpZHRoICsgJ3B4KSc7IC8vIEZvciAxMDAlXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgPSB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGhTdHJpbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgdG90YWxDYWxjQ29sc1dpZHRoICs9IHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgICAgICAnaW5oZXJpdCdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdWlDb250cm9sRmllbGQ6IFVJQ29udHJvbEZpZWxkID0gdGhpcy51aUNvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgLkNvbnRyb2xGaWVsZHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRGaXhlZFdpZHRoID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuQ29sdW1uV2lkdGggKiBmaXhlZE11bHRpcGxlXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rml4ZWRXaWR0aCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aFN0cmluZyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rml4ZWRXaWR0aCAtIDQgKyAncHgnOyAvLyAtNCBmb3IgdGhlIHJvdyBwYWRkaW5nLlxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNUaXRsZUNvbHVtbldpZHRoU3RyaW5nID0gdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoU3RyaW5nID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaXhlZFdpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0b3RhbENhbGNDb2xzV2lkdGggKz0gY3VycmVudEZpeGVkV2lkdGg7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgICAgICB0b3RhbENhbGNDb2xzV2lkdGggKyBzZWxlY3Rpb25DaGVja0JveFdpZHRoICsgJ3B4J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFJlc2l6ZURhdGEoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhcnRYID0gMDtcbiAgICAgICAgdGhpcy5zdGFydFdpZHRoID0gMDtcbiAgICAgICAgdGhpcy50YWJsZVN0YXJ0V2lkdGggPSAwO1xuICAgICAgICB0aGlzLnByZXNzZWRDb2x1bW4gPSAnJztcbiAgICB9XG5cbiAgICBvbkxpc3RSZXNpemVTdGFydChldmVudCwgY29sdW1uS2V5KTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJlc3NlZENvbHVtbiA9IGNvbHVtbktleTtcbiAgICAgICAgdGhpcy5zdGFydFggPSBldmVudC54O1xuICAgICAgICB0aGlzLnN0YXJ0V2lkdGggPSBldmVudC50YXJnZXQuY2xvc2VzdCgnLmhlYWRlci1jb2x1bW4nKS5vZmZzZXRXaWR0aDtcbiAgICAgICAgLy8gU2V0IHRoZSB0YWJsZVN0YXJ0V2lkdGggdG8gdGhlIGNvbnRhaW5lciBvZmZzZXRXaWR0aFxuICAgICAgICB0aGlzLnRhYmxlU3RhcnRXaWR0aCA9IHRoaXMubm9WaXJ0dWFsU2Nyb2xsQ29udC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgIH1cblxuICAgIG9uTGlzdFJlc2l6ZShldmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wcmVzc2VkQ29sdW1uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoVG9BZGQgPSB0aGlzLmxheW91dFNlcnZpY2UuaXNSdGwoKVxuICAgICAgICAgICAgICAgID8gdGhpcy5zdGFydFggLSBldmVudC54XG4gICAgICAgICAgICAgICAgOiBldmVudC54IC0gdGhpcy5zdGFydFg7XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgd2lkdGggb2YgdGhlIGNvbHVtbiBhbmQgdGhlIGNvbnRhaW5lciBvZiB0aGUgd2hvbGUgY29sdW1ucy5cbiAgICAgICAgICAgIGlmICh0aGlzLnN0YXJ0V2lkdGggKyB3aWR0aFRvQWRkID49IDQ4IHx8IHdpZHRoVG9BZGQgPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy51aUNvbnRyb2wuQ29udHJvbEZpZWxkcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsQ2FsY0NvbHNXaWR0aCA9IDA7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpQ29udHJvbEZpZWxkOiBVSUNvbnRyb2xGaWVsZCA9IHRoaXMudWlDb250cm9sXG4gICAgICAgICAgICAgICAgICAgICAgICAuQ29udHJvbEZpZWxkc1tpbmRleF07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSBsZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDYWxjIHRoZSBsYXN0IGNvbHVtbiBvbmx5IGluIHBlcmNlbnRhZ2UgdHlwZS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbldpZHRoT2ZUeXBlUGVyY2VudGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNUaXRsZUNvbHVtbldpZHRoU3RyaW5nID0gdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoU3RyaW5nID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NhbGMoMTAwJSAtICcgKyB0b3RhbENhbGNDb2xzV2lkdGggKyAncHgpJzsgLy8gRm9yIDEwMCVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVpQ29udHJvbEZpZWxkLkFwaU5hbWUgPT09IHRoaXMucHJlc3NlZENvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGggPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFdpZHRoICsgd2lkdGhUb0FkZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoU3RyaW5nID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aCAtIDQgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh1aUNvbnRyb2xGaWVsZC5BcGlOYW1lID09PSB0aGlzLnByZXNzZWRDb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydFdpZHRoICsgd2lkdGhUb0FkZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNUaXRsZUNvbHVtbldpZHRoU3RyaW5nID0gdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoU3RyaW5nID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGggKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdG90YWxDYWxjQ29sc1dpZHRoICs9IHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgJ3dpZHRoJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJsZVN0YXJ0V2lkdGggKyB3aWR0aFRvQWRkICsgJ3B4J1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JDaGFuZ2VzID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRQYXJlbnQoZWwsIHBhcmVudFNlbGVjdG9yKTogYW55IHtcbiAgICAgICAgLy8gSWYgbm8gcGFyZW50U2VsZWN0b3IgZGVmaW5lZCB3aWxsIGJ1YmJsZSB1cCBhbGwgdGhlIHdheSB0byAqZG9jdW1lbnQqXG4gICAgICAgIGlmIChwYXJlbnRTZWxlY3RvciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwYXJlbnRTZWxlY3RvciA9IGRvY3VtZW50O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhcmVudCA9IFtdO1xuICAgICAgICBsZXQgcCA9IGVsLnBhcmVudE5vZGU7XG5cbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgcCAmJlxuICAgICAgICAgICAgcC5jbGFzc05hbWUgIT09ICcnICYmXG4gICAgICAgICAgICBwLmNsYXNzTmFtZS5pbmRleE9mKHBhcmVudFNlbGVjdG9yKSA9PT0gLTEgJiZcbiAgICAgICAgICAgIHBhcmVudFNlbGVjdG9yICE9PSBkb2N1bWVudFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IG8gPSBwO1xuICAgICAgICAgICAgcCA9IG8ucGFyZW50Tm9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocC5jbGFzc05hbWUuaW5kZXhPZihwYXJlbnRTZWxlY3RvcikgPiAtMSkge1xuICAgICAgICAgICAgcGFyZW50LnB1c2gocCk7IC8vIFB1c2ggdGhhdCBwYXJlbnRTZWxlY3RvciB5b3Ugd2FudGVkIHRvIHN0b3AgYXRcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyZW50O1xuICAgIH1cblxuICAgIG9uTGlzdFJlc2l6ZUVuZChldmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5wcmVzc2VkQ29sdW1uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBldmVudCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0UGFyZW50KGV2ZW50LnNyY0VsZW1lbnQsICdyZXNpemUtYm94JykubGVuZ3RoID4gMFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UmVzaXplRGF0YSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0UmVzaXplRGF0YSgpO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25MaXN0SGVhZGVyTW91c2VFbnRlcihldmVudCk6IHZvaWQge1xuICAgICAgICAvLyB0aGlzLmhlYWRlcklzSW5Gb2N1cyA9IHRydWU7XG4gICAgfVxuXG4gICAgb25MaXN0SGVhZGVyTW91c2VMZWF2ZShldmVudCk6IHZvaWQge1xuICAgICAgICAvLyB0aGlzLmhlYWRlcklzSW5Gb2N1cyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm9uTGlzdFJlc2l6ZUVuZChldmVudCk7XG4gICAgICAgIHRoaXMuaW5pdFJlc2l6ZURhdGEoKTtcbiAgICB9XG5cbiAgICBvbkxpc3RDaGFuZ2UoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlRXZlbnRzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3Igb3RoZXIgZXZlbnRzIGRvIG5vdGhpbmcuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBldmVudC5zdGFydCA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgICAgIHR5cGVvZiBldmVudC5lbmQgPT09ICd1bmRlZmluZWQnXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jYWxjdWxhdGVkT2JqZWN0SGVpZ2h0ID0gZXZlbnQuY2FsY3VsYXRlZENoaWxkSGVpZ2h0ICsgJ3B4JztcblxuICAgICAgICBpZiAoIXRoaXMubG9ja0V2ZW50cykge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVJdGVtcyhmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVNjcm9sbEl0ZW1zKGV2ZW50LnN0YXJ0LCBldmVudC5lbmQsIGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlSXRlbXModHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRQYXJlbnRDb250YWluZXIoKTogRWxlbWVudCB8IFdpbmRvdyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudFNjcm9sbCA/IHRoaXMucGFyZW50U2Nyb2xsIDogd2luZG93O1xuICAgIH1cblxuICAgIG9uVmFsdWVDaGFuZ2VkKHZhbHVlQ2hhbmdlOiBJUGVwRm9ybUZpZWxkVmFsdWVDaGFuZ2VFdmVudCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHZhbHVlQ2hhbmdlKTtcbiAgICB9XG5cbiAgICBvbkN1c3RvbWl6ZUZpZWxkQ2xpY2soXG4gICAgICAgIGN1c3RvbWl6ZUZpZWxkQ2xpY2tlZERhdGE6IElQZXBGb3JtRmllbGRDbGlja0V2ZW50XG4gICAgKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZpZWxkQ2xpY2suZW1pdChjdXN0b21pemVGaWVsZENsaWNrZWREYXRhKTtcbiAgICB9XG5cbiAgICBnZXRJc0Rpc2FibGVkKGl0ZW06IE9iamVjdHNEYXRhUm93KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVTZWxlY3Rpb25JdGVtcykge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBJc05vdFNlbGVjdGFibGVGb3JBY3Rpb25zID1cbiAgICAgICAgICAgICAgICBpdGVtICYmICFpdGVtLklzU2VsZWN0YWJsZUZvckFjdGlvbnM7XG4gICAgICAgICAgICByZXR1cm4gSXNOb3RTZWxlY3RhYmxlRm9yQWN0aW9ucztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldElzSXRlbVNlbGVjdGVkKGl0ZW1JZDogc3RyaW5nLCBpdGVtVHlwZSA9ICcnKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBpc1NlbGVjdGVkID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdW5pcUl0ZW1JZCA9IHRoaXMuZ2V0VW5pcUl0ZW1JZChpdGVtSWQsIGl0ZW1UeXBlKTtcbiAgICAgICAgaXNTZWxlY3RlZCA9IHVuaXFJdGVtSWQgPT09IHRoaXMuc2VsZWN0ZWRJdGVtSWQ7XG5cbiAgICAgICAgcmV0dXJuIGlzU2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRJdGVtQ2xpY2tlZChcbiAgICAgICAgaXRlbUlkLFxuICAgICAgICBpc1NlbGVjdGFibGVGb3JBY3Rpb25zOiBib29sZWFuLFxuICAgICAgICBpdGVtVHlwZTogc3RyaW5nLFxuICAgICAgICBpc0NoZWNrZWQ6IGJvb2xlYW5cbiAgICApOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdW5pcUl0ZW1JZCA9IHRoaXMuZ2V0VW5pcUl0ZW1JZChpdGVtSWQsIGl0ZW1UeXBlKTtcblxuICAgICAgICAvLyBzZWxlY3QgdGhlIHNlbGVjdGVkIGl0ZW0uXG4gICAgICAgIGlmIChpc0NoZWNrZWQpIHtcbiAgICAgICAgICAgIC8vIFNldCBzZWxldGVkIGl0ZW1cbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWQgPSB1bmlxSXRlbUlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtSWQgPT09IHVuaXFJdGVtSWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUlkID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpdGVtQ2xpY2tlZChlOiBhbnksIGl0ZW06IE9iamVjdHNEYXRhUm93KTogdm9pZCB7XG4gICAgICAgIC8vIFNldCBzZWxldGVkIGl0ZW1cbiAgICAgICAgY29uc3QgaXRlbUlkID0gaXRlbS5VSUQudG9TdHJpbmcoKTtcbiAgICAgICAgY29uc3QgaXRlbVR5cGUgPSBpdGVtLlR5cGUudG9TdHJpbmcoKTtcbiAgICAgICAgbGV0IGlzQ2hlY2tlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0uSXNTZWxlY3RhYmxlRm9yQWN0aW9ucykge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JZCA9IHRoaXMuZ2V0VW5pcUl0ZW1JZChpdGVtSWQsIGl0ZW1UeXBlKTtcbiAgICAgICAgICAgIGlzQ2hlY2tlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc1RhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnNldEl0ZW1DbGlja2VkKFxuICAgICAgICAgICAgICAgIGl0ZW1JZCxcbiAgICAgICAgICAgICAgICBpdGVtLklzU2VsZWN0YWJsZUZvckFjdGlvbnMsXG4gICAgICAgICAgICAgICAgaXRlbVR5cGUsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhpcy5pdGVtQ2xpY2suZW1pdCh7IHNvdXJjZTogaXRlbSwgdmlld1R5cGU6IHRoaXMudmlld1R5cGUgfSk7XG4gICAgfVxuXG4gICAgb25UYWJsZVJvd01vdXNlRW50ZXIoZXZlbnQ6IGFueSwgaXRlbUlkOiBzdHJpbmcsIGl0ZW1UeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmRldmljZUhhc01vdXNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bmlxSXRlbUlkID0gdGhpcy5nZXRVbmlxSXRlbUlkKGl0ZW1JZCwgaXRlbVR5cGUpO1xuICAgICAgICB0aGlzLmhvdmVyZWRJdGVtSWQgPSB1bmlxSXRlbUlkO1xuICAgIH1cblxuICAgIG9uVGFibGVSb3dNb3VzZUxlYXZlKGV2ZW50OiBhbnksIGl0ZW1JZDogc3RyaW5nLCBpdGVtVHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaG92ZXJlZEl0ZW1JZCA9ICcnO1xuICAgIH1cblxuICAgIG9uQ2FyZE1vdXNlRW50ZXIoZXZlbnQ6IGFueSwgaXRlbUlkOiBzdHJpbmcsIGl0ZW1UeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmRldmljZUhhc01vdXNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bmlxSXRlbUlkID0gdGhpcy5nZXRVbmlxSXRlbUlkKGl0ZW1JZCwgaXRlbVR5cGUpO1xuICAgICAgICB0aGlzLmhvdmVyZWRJdGVtSWQgPSB1bmlxSXRlbUlkO1xuICAgIH1cblxuICAgIG9uQ2FyZE1vdXNlTGVhdmUoZXZlbnQ6IGFueSwgaXRlbUlkOiBzdHJpbmcsIGl0ZW1UeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3ZlcmVkSXRlbUlkID0gJyc7XG4gICAgfVxuXG4gICAgLy8gY2FsbCB0aGlzIGZ1bmN0aW9uIGFmdGVyIHJlc2l6ZSArIGFuaW1hdGlvbiBlbmRcbiAgICB3aW5SZXNpemUoZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gMDtcbiAgICAgICAgdGhpcy5zZXRMYXlvdXQoKTtcbiAgICB9XG5cbiAgICB0cmFja0J5RnVuYyhpbmRleDogbnVtYmVyLCBpdGVtOiBPYmplY3RzRGF0YVJvdyk6IGFueSB7XG4gICAgICAgIHJldHVybiBpdGVtICYmIGl0ZW0uVUlEID8gaXRlbS5VSUQgOiBpbmRleDtcbiAgICB9XG5cbiAgICBjbGVhbkl0ZW1zKCk6IHZvaWQge1xuICAgICAgICB0aGlzLml0ZW1zQ291bnRlciA9IDA7XG4gICAgICAgIHRoaXMuX2l0ZW1zID1cbiAgICAgICAgICAgIHRoaXMudG90YWxSb3dzID4gMCA/IEFycmF5PE9iamVjdHNEYXRhUm93Pih0aGlzLnRvdGFsUm93cykgOiBbXTtcbiAgICAgICAgdGhpcy5zY3JvbGxJdGVtcyA9IFtdO1xuICAgICAgICB0aGlzLmNhbGN1bGF0ZWRPYmplY3RIZWlnaHQgPSAnJztcbiAgICB9XG5cbiAgICBnZXRVSUNvbnRyb2woKTogVUlDb250cm9sIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudWlDb250cm9sO1xuICAgIH1cblxuICAgIGluaXRMaXN0RGF0YShcbiAgICAgICAgdWlDb250cm9sOiBVSUNvbnRyb2wsXG4gICAgICAgIHRvdGFsUm93czogbnVtYmVyLFxuICAgICAgICBpdGVtczogT2JqZWN0c0RhdGFSb3dbXSxcbiAgICAgICAgdmlld1R5cGU6IFBlcExpc3RWaWV3VHlwZSA9ICd0YWJsZScsXG4gICAgICAgIGl0ZW1DbGFzcyA9ICcnXG4gICAgKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmlld1R5cGUgPSB2aWV3VHlwZTtcbiAgICAgICAgdGhpcy5pc1RhYmxlID0gdmlld1R5cGUgPT09ICd0YWJsZSc7XG4gICAgICAgIC8vIHRoaXMuaXNDYXJkVmlldyA9IHZpZXdUeXBlID09PSAnY2FyZHMnO1xuICAgICAgICB0aGlzLnVpQ29udHJvbCA9IHVpQ29udHJvbDtcbiAgICAgICAgdGhpcy5pdGVtQ2xhc3MgPSBpdGVtQ2xhc3M7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWQgPSAnJztcbiAgICAgICAgdGhpcy50b3RhbFJvd3MgPSB0b3RhbFJvd3M7XG5cbiAgICAgICAgLy8gZml4IGJ1ZyBmb3IgdGhlIHNjcm9sbFRvIHRoYXQgZG9lc24ndCB3b3JrIG9uIGVkZ2UgZGl2ICwgbm90IHdpbmRvd1xuICAgICAgICAvLyBjb25zdCBzY3JvbGxpbmdFbGVtZW50ID0gdGhpcy5nZXRQYXJlbnRDb250YWluZXIoKTtcbiAgICAgICAgLy8gc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxUbygwLCAwKTtcblxuICAgICAgICB0aGlzLmNsZWFuSXRlbXMoKTtcblxuICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1zKGl0ZW1zKTtcblxuICAgICAgICB0aGlzLnNldExheW91dCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlSXRlbXMoaXRlbXM6IE9iamVjdHNEYXRhUm93W10pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zY3JvbGxJdGVtcyA9IHRoaXMuX2l0ZW1zID0gaXRlbXM7XG4gICAgICAgIHRoaXMuaXRlbXNDb3VudGVyID0gaXRlbXMubGVuZ3RoO1xuICAgIH1cblxuICAgIHVwZGF0ZUl0ZW0oZGF0YTogYW55KTogdm9pZCB7XG4gICAgICAgIGxldCBpbmRleCA9IDA7XG5cbiAgICAgICAgLy8gVXBkYXRlIGl0ZW1zIGxpc3RcbiAgICAgICAgaW5kZXggPSB0aGlzLml0ZW1zLmZpbmRJbmRleCgoaSkgPT4gaSAmJiBpLlVJRCA9PT0gZGF0YS5VSUQpO1xuICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zW2luZGV4XSA9IGRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsSXRlbXMgbGlzdFxuICAgICAgICBpbmRleCA9IHRoaXMuc2Nyb2xsSXRlbXMuZmluZEluZGV4KChpKSA9PiBpICYmIGkuVUlEID09PSBkYXRhLlVJRCk7XG5cbiAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLnNjcm9sbEl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxJdGVtc1tpbmRleF0gPSBkYXRhO1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZvckNoYW5nZXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldElzSXRlbUVkaXRhYmxlKHVpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zLmZpbHRlcigoeCkgPT4geC5VSUQudG9TdHJpbmcoKSA9PT0gdWlkKTtcbiAgICAgICAgaWYgKGl0ZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1bMF0uSXNFZGl0YWJsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldEl0ZW1EYXRhQnlJRCh1aWQ6IHN0cmluZyk6IE9iamVjdHNEYXRhUm93IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS5VSUQudG9TdHJpbmcoKSA9PT0gdWlkKTtcbiAgICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwidG90YWxSb3dzID09IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwicGVwLWJvcmRlci1ib3R0b21cIj5cbiAgICAgICAgPHAgY2xhc3M9XCJ0aXRsZS14bCBuby1kYXRhXCI+XG4gICAgICAgICAgICB7eyAobm9EYXRhRm91bmRNc2cgPyBub0RhdGFGb3VuZE1zZyA6ICdMSVNULk5PX0RBVEFfRk9VTkQnKSB8IHRyYW5zbGF0ZX19XG4gICAgICAgIDwvcD5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibm8tZGF0YS1zdWdnZXN0aW9uc1wiPlxuICAgICAgICA8cCBjbGFzcz1cInN1Z2dlc3Rpb25zLXRpdGxlIHRpdGxlLWxnXCI+XG4gICAgICAgICAgICB7eyAnTElTVC5OT19EQVRBX0ZPVU5EX1NVR0dFU1RJT05TX1RJVExFJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHVsIGNsYXNzPVwic3VnZ2VzdGlvbnMtbGlzdCBib2R5LWxnXCIgW2lubmVySHRtbF09XCInTElTVC5OT19EQVRBX0ZPVU5EX1NVR0dFU1RJT05TX0xJU1QnIHwgdHJhbnNsYXRlXCI+PC91bD5cbiAgICA8L2Rpdj5cbjwvbmctY29udGFpbmVyPlxuPG5nLWNvbnRhaW5lciAqbmdJZj1cInRvdGFsUm93cyA+IDBcIj5cbiAgICA8ZGl2ICpuZ0lmPVwiaXNUYWJsZVwiICN0YWJsZUhlYWRlciBjbGFzcz1cInRhYmxlLWhlYWRlclwiIChtb3VzZXVwKT1cIm9uTGlzdFJlc2l6ZUVuZCgkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwib25MaXN0SGVhZGVyTW91c2VFbnRlcigkZXZlbnQpXCIgKG1vdXNlbGVhdmUpPVwib25MaXN0SGVhZGVyTW91c2VMZWF2ZSgkZXZlbnQpXCJcbiAgICAgICAgKG1vdXNlbW92ZSk9XCJvbkxpc3RSZXNpemUoJGV2ZW50KVwiPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1oZWFkZXItcGFkZGluZy10b3BcIj48L2Rpdj5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwidGFibGUtaGVhZGVyLWZpZWxkc2V0XCI+XG4gICAgICAgICAgICA8ZmllbGRzZXQ+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZmllbGQgb2YgdWlDb250cm9sPy5Db250cm9sRmllbGRzOyBsZXQgaiA9IGluZGV4XCIgY2xhc3M9XCJoZWFkZXItY29sdW1uIHB1bGwtbGVmdCBmbGlwXCJcbiAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogZmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgfVwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtcmVzaXppbmcnOiBmaWVsZC5BcGlOYW1lID09PSBwcmVzc2VkQ29sdW1uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1maXJzdCc6IGogPT09IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWxhc3QnOiBqID09PSB1aUNvbnRyb2w/LkNvbnRyb2xGaWVsZHM/Lmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwiZmllbGQuVGl0bGUgIT0gJydcIiBpZD1cInt7IGZpZWxkLkFwaU5hbWUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItbGFiZWwgYm9keS1zbSBwdWxsLWxlZnQgZmxpcCB0ZXh0LWFsaWduLXt7IGZpZWxkLkxheW91dC5YQWxpZ25tZW50IH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgZmllbGQuVGl0bGUgfX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGZpZWxkLlRpdGxlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCAqbmdJZj1cImZpZWxkLlRpdGxlID09ICcnXCIgaWQ9XCJ7eyBmaWVsZC5BcGlOYW1lIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaGVhZGVyLWxhYmVsIGJvZHktc20gcHVsbC1sZWZ0IGZsaXBcIj4mbmJzcDs8L2xhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzdXBwb3J0UmVzaXppbmdcIiBjbGFzcz1cInJlc2l6ZS1ib3ggcHVsbC1yaWdodCBmbGlwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25MaXN0UmVzaXplU3RhcnQoJGV2ZW50LCBmaWVsZC5BcGlOYW1lKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNwbGl0dGVyXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgI25vVmlydHVhbFNjcm9sbENvbnQgW25nQ2xhc3NdPVwieyAndGFibGUtYm9keSc6IGlzVGFibGUsICdjYXJkcy1ib2R5JzogIWlzVGFibGUgfVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdERhdGFcIj48L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibGlzdFRvdGFsc1wiPjwvbmctY29udGFpbmVyPlxuPC9uZy1jb250YWluZXI+XG5cbjxuZy10ZW1wbGF0ZSAjbGlzdERhdGE+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBzY3JvbGxJdGVtczsgbGV0IGkgPSBpbmRleDsgbGV0IGlzRmlyc3QgPSBmaXJzdDsgdHJhY2tCeTogdHJhY2tCeUZ1bmNcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVGFibGVcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yb3dcIiAobW91c2VlbnRlcik9XCJvblRhYmxlUm93TW91c2VFbnRlcigkZXZlbnQsIGl0ZW0/LlVJRCwgaXRlbT8uVHlwZSlcIlxuICAgICAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uVGFibGVSb3dNb3VzZUxlYXZlKCRldmVudCwgaXRlbT8uVUlELCBpdGVtPy5UeXBlKVwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBnZXRJc0l0ZW1TZWxlY3RlZChpdGVtPy5VSUQsIGl0ZW0/LlR5cGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGl0ZW0/LlVJRCArIFNFUEFSQVRPUiArIGl0ZW0/LlR5cGUgPT09IHNlbGVjdGVkSXRlbUlkXG4gICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgaGVpZ2h0OiBjYWxjdWxhdGVkT2JqZWN0SGVpZ2h0LCB2aXNpYmlsaXR5OiBzaG93SXRlbXMgfHwgaXRlbSA/ICd2aXNpYmxlJyA6ICdoaWRkZW4nIH1cIj5cbiAgICAgICAgICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJ0YWJsZS1yb3ctZmllbGRzZXRcIiBbbmdTdHlsZV09XCJ7ICdiYWNrZ3JvdW5kLWNvbG9yJzogaXRlbT8uQmFja2dyb3VuZENvbG9yIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBbY2FuRWRpdE9iamVjdF09XCIhZGlzYWJsZWQgJiYgaXRlbT8uSXNFZGl0YWJsZVwiIC0tPlxuICAgICAgICAgICAgICAgICAgICA8cGVwLWludGVybmFsLWZvcm0gW2NoZWNrRm9yQ2hhbmdlc109XCJjaGVja0ZvckNoYW5nZXNcIiBbbGF5b3V0XT1cInVpQ29udHJvbFwiIFtkYXRhXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NhbkVkaXRPYmplY3RdPVwiIWRpc2FibGVkXCIgW29iamVjdElkXT1cIm9iamVjdElkXCIgW3BhcmVudElkXT1cInBhcmVudElkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hDb2RlXT1cInNlYXJjaENvZGVcIiBbbG9ja0V2ZW50c109XCJkaXNhYmxlU2VsZWN0aW9uSXRlbXNcIiBbbGF5b3V0VHlwZV09XCIndGFibGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0FjdGl2ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW0/LlVJRCArIFNFUEFSQVRPUiArIGl0ZW0/LlR5cGUgPT09IHNlbGVjdGVkSXRlbUlkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LlVJRCArIFNFUEFSQVRPUiArIGl0ZW0/LlR5cGUgPT09IGhvdmVyZWRJdGVtSWQpICYmIGRldmljZUhhc01vdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCIgKHZhbHVlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudClcIiAoZmllbGRDbGljayk9XCJvbkN1c3RvbWl6ZUZpZWxkQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiaXRlbUNsaWNrZWQoJGV2ZW50LCBpdGVtKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L3BlcC1pbnRlcm5hbC1mb3JtPlxuICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc1RhYmxlXCI+XG4gICAgICAgICAgICA8ZGl2IFtjbGFzc109XCJpdGVtQ2xhc3NcIiAobW91c2VlbnRlcik9XCJvbkNhcmRNb3VzZUVudGVyKCRldmVudCwgaXRlbT8uVUlELCBpdGVtPy5UeXBlKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25DYXJkTW91c2VMZWF2ZSgkZXZlbnQsIGl0ZW0/LlVJRCwgaXRlbT8uVHlwZSlcIiBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogZ2V0SXNJdGVtU2VsZWN0ZWQoaXRlbT8uVUlELCBpdGVtPy5UeXBlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiBpdGVtPy5VSUQgKyBTRVBBUkFUT1IgKyBpdGVtPy5UeXBlID09PSBzZWxlY3RlZEl0ZW1JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdjYXJkLXZpZXcnOiB2aWV3VHlwZSA9PT0gJ2NhcmRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdsaW5lLXZpZXcnOiB2aWV3VHlwZSA9PT0gJ2xpbmVzJ1xuICAgICAgICAgICAgICAgICAgICB9XCIgY2xhc3M9XCJwdWxsLWxlZnQgZmxpcFwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGNhbGN1bGF0ZWRPYmplY3RIZWlnaHQsIHZpc2liaWxpdHk6IHNob3dJdGVtcyB8fCBpdGVtID8gJ3Zpc2libGUnIDogJ2hpZGRlbicgfVwiPlxuICAgICAgICAgICAgICAgIDwhLS0gW2NhbkVkaXRPYmplY3RdPVwiIWRpc2FibGVkICYmIGl0ZW0/LklzRWRpdGFibGVcIiAtLT5cbiAgICAgICAgICAgICAgICA8cGVwLWludGVybmFsLWZvcm0gW2NoZWNrRm9yQ2hhbmdlc109XCJjaGVja0ZvckNoYW5nZXNcIiBbbGF5b3V0XT1cInVpQ29udHJvbFwiIFtkYXRhXT1cIml0ZW1cIlxuICAgICAgICAgICAgICAgICAgICBbY2FuRWRpdE9iamVjdF09XCIhZGlzYWJsZWRcIiBbb2JqZWN0SWRdPVwiIG9iamVjdElkXCIgW3BhcmVudElkXT1cInBhcmVudElkXCIgW3NlYXJjaENvZGVdPVwic2VhcmNoQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgIFtsb2NrRXZlbnRzXT1cImRpc2FibGVTZWxlY3Rpb25JdGVtc1wiIFtsYXlvdXRUeXBlXT1cIidjYXJkJ1wiIFtpc0FjdGl2ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbT8uVUlEICsgU0VQQVJBVE9SICsgaXRlbT8uVHlwZSA9PT0gc2VsZWN0ZWRJdGVtSWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtPy5VSUQgKyBTRVBBUkFUT1IgKyBpdGVtPy5UeXBlID09PSBob3ZlcmVkSXRlbUlkKSAmJiBkZXZpY2VIYXNNb3VzZVxuICAgICAgICAgICAgICAgICAgICAgICAgXCIgKHZhbHVlQ2hhbmdlKT1cIm9uVmFsdWVDaGFuZ2VkKCRldmVudClcIiAoZmllbGRDbGljayk9XCJvbkN1c3RvbWl6ZUZpZWxkQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpdGVtQ2xpY2tlZCgkZXZlbnQsIGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgPC9wZXAtaW50ZXJuYWwtZm9ybT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbGlzdFRvdGFscz5cbiAgICA8ZGl2ICpuZ0lmPVwidG90YWxzUm93Py5sZW5ndGggPiAwICYmIHRvdGFsc1Jvdy5sZW5ndGggPD0gdWlDb250cm9sPy5Db250cm9sRmllbGRzLmxlbmd0aFwiIGNsYXNzPVwidGFibGUtdG90YWxcIj5cbiAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwidGFibGUtaGVhZGVyLWZpZWxkc2V0XCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWVsZCBvZiB1aUNvbnRyb2w/LkNvbnRyb2xGaWVsZHM7IGxldCBqID0gaW5kZXhcIiBjbGFzcz1cInRvdGFsLWNvbHVtbiBwdWxsLWxlZnQgZmxpcFwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogZmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgfVwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRvdGFsLWxhYmVsIGJvZHktc20gdGV4dC1hbGlnbi17eyBmaWVsZC5MYXlvdXQuWEFsaWdubWVudCB9fVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyB0b3RhbHNSb3dbal0gfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZmllbGRzZXQ+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPiJdfQ==
|