@pepperi-addons/ngx-lib 0.4.2-beta.137 → 0.4.2-beta.139
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 -0
- package/address/address.module.d.ts +15 -0
- package/address/index.d.ts +5 -0
- package/address/public-api.d.ts +2 -0
- package/attachment/attachment.component.d.ts +94 -0
- package/attachment/attachment.module.d.ts +14 -0
- package/attachment/index.d.ts +5 -0
- package/attachment/public-api.d.ts +2 -0
- package/bread-crumbs/bread-crumbs.component.d.ts +27 -0
- package/bread-crumbs/bread-crumbs.model.d.ts +11 -0
- package/bread-crumbs/bread-crumbs.module.d.ts +15 -0
- package/bread-crumbs/index.d.ts +5 -0
- package/bread-crumbs/public-api.d.ts +3 -0
- package/carousel/carousel-item.directive.d.ts +12 -0
- package/carousel/carousel.component.d.ts +148 -0
- package/carousel/carousel.module.d.ts +8 -0
- package/carousel/index.d.ts +5 -0
- package/carousel/public-api.d.ts +3 -0
- package/checkbox/checkbox.component.d.ts +50 -0
- package/checkbox/checkbox.module.d.ts +19 -0
- package/checkbox/index.d.ts +5 -0
- package/checkbox/public-api.d.ts +2 -0
- package/color/color-picker.component.d.ts +57 -0
- package/color/color.component.d.ts +30 -0
- package/color/color.model.d.ts +1 -0
- package/color/color.module.d.ts +26 -0
- package/color/index.d.ts +5 -0
- package/color/public-api.d.ts +3 -0
- package/date/date.component.d.ts +70 -0
- package/date/date.model.d.ts +31 -0
- package/date/date.module.d.ts +23 -0
- package/date/index.d.ts +5 -0
- package/date/public-api.d.ts +2 -0
- package/draggable-items/draggable-item/draggable-item.component.d.ts +11 -0
- package/draggable-items/draggable-items.component.d.ts +36 -0
- package/draggable-items/draggable-items.model.d.ts +11 -0
- package/draggable-items/draggable-items.module.d.ts +18 -0
- package/draggable-items/index.d.ts +5 -0
- package/draggable-items/public-api.d.ts +4 -0
- package/esm2020/address/address.component.mjs +109 -0
- package/esm2020/address/address.module.mjs +54 -0
- package/esm2020/address/pepperi-addons-ngx-lib-address.mjs +5 -0
- package/esm2020/address/public-api.mjs +6 -0
- package/esm2020/attachment/attachment.component.mjs +240 -0
- package/esm2020/attachment/attachment.module.mjs +50 -0
- package/esm2020/attachment/pepperi-addons-ngx-lib-attachment.mjs +5 -0
- package/esm2020/attachment/public-api.mjs +6 -0
- package/esm2020/bread-crumbs/bread-crumbs.component.mjs +85 -0
- package/esm2020/bread-crumbs/bread-crumbs.model.mjs +7 -0
- package/esm2020/bread-crumbs/bread-crumbs.module.mjs +50 -0
- package/esm2020/bread-crumbs/pepperi-addons-ngx-lib-bread-crumbs.mjs +5 -0
- package/esm2020/bread-crumbs/public-api.mjs +7 -0
- package/esm2020/carousel/carousel-item.directive.mjs +33 -0
- package/esm2020/carousel/carousel.component.mjs +745 -0
- package/esm2020/carousel/carousel.module.mjs +17 -0
- package/esm2020/carousel/pepperi-addons-ngx-lib-carousel.mjs +5 -0
- package/esm2020/carousel/public-api.mjs +8 -0
- package/esm2020/checkbox/checkbox.component.mjs +168 -0
- package/esm2020/checkbox/checkbox.module.mjs +63 -0
- package/esm2020/checkbox/pepperi-addons-ngx-lib-checkbox.mjs +5 -0
- package/esm2020/checkbox/public-api.mjs +6 -0
- package/esm2020/color/color-picker.component.mjs +224 -0
- package/esm2020/color/color.component.mjs +90 -0
- package/esm2020/color/color.model.mjs +2 -0
- package/esm2020/color/color.module.mjs +93 -0
- package/esm2020/color/pepperi-addons-ngx-lib-color.mjs +5 -0
- package/esm2020/color/public-api.mjs +7 -0
- package/esm2020/date/date.component.mjs +312 -0
- package/esm2020/date/date.model.mjs +54 -0
- package/esm2020/date/date.module.mjs +88 -0
- package/esm2020/date/pepperi-addons-ngx-lib-date.mjs +5 -0
- package/esm2020/date/public-api.mjs +6 -0
- package/esm2020/draggable-items/draggable-item/draggable-item.component.mjs +27 -0
- package/esm2020/draggable-items/draggable-items.component.mjs +102 -0
- package/esm2020/draggable-items/draggable-items.model.mjs +2 -0
- package/esm2020/draggable-items/draggable-items.module.mjs +60 -0
- package/esm2020/draggable-items/pepperi-addons-ngx-lib-draggable-items.mjs +5 -0
- package/esm2020/draggable-items/public-api.mjs +8 -0
- package/esm2020/files-uploader/files-uploader.component.mjs +246 -0
- package/esm2020/files-uploader/files-uploader.module.mjs +79 -0
- package/esm2020/files-uploader/pepperi-addons-ngx-lib-files-uploader.mjs +5 -0
- package/esm2020/files-uploader/public-api.mjs +6 -0
- package/esm2020/form/field-generator.component.mjs +152 -0
- package/esm2020/form/form.component.mjs +1238 -0
- package/esm2020/form/form.model.mjs +2 -0
- package/esm2020/form/form.module.mjs +179 -0
- package/esm2020/form/indicators.component.mjs +23 -0
- package/esm2020/form/internal-button.component.mjs +184 -0
- package/esm2020/form/internal-carusel.component.mjs +117 -0
- package/esm2020/form/internal-carusel.service.mjs +32 -0
- package/esm2020/form/internal-field-generator.component.mjs +146 -0
- package/esm2020/form/internal-form.component.mjs +1216 -0
- package/esm2020/form/internal-list.component.mjs +513 -0
- package/esm2020/form/internal-menu.component.mjs +66 -0
- package/esm2020/form/internal-page.component.mjs +361 -0
- package/esm2020/form/internal-page.service.mjs +120 -0
- package/esm2020/form/pepperi-addons-ngx-lib-form.mjs +5 -0
- package/esm2020/form/public-api.mjs +7 -0
- package/esm2020/group-buttons/group-buttons.component.mjs +71 -0
- package/esm2020/group-buttons/group-buttons.module.mjs +59 -0
- package/esm2020/group-buttons/pepperi-addons-ngx-lib-group-buttons.mjs +5 -0
- package/esm2020/group-buttons/public-api.mjs +6 -0
- package/esm2020/image/image.component.mjs +263 -0
- package/esm2020/image/image.module.mjs +74 -0
- package/esm2020/image/image.service.mjs +50 -0
- package/esm2020/image/pepperi-addons-ngx-lib-image.mjs +5 -0
- package/esm2020/image/public-api.mjs +7 -0
- package/esm2020/images-filmstrip/images-filmstrip.component.mjs +337 -0
- package/esm2020/images-filmstrip/images-filmstrip.module.mjs +83 -0
- package/esm2020/images-filmstrip/pepperi-addons-ngx-lib-images-filmstrip.mjs +5 -0
- package/esm2020/images-filmstrip/public-api.mjs +6 -0
- package/esm2020/link/link.component.mjs +300 -0
- package/esm2020/link/link.module.mjs +80 -0
- package/esm2020/link/link.pipes.mjs +18 -0
- package/esm2020/link/pepperi-addons-ngx-lib-link.mjs +5 -0
- package/esm2020/link/public-api.mjs +7 -0
- package/esm2020/list/list-actions.component.mjs +44 -0
- package/esm2020/list/list-carousel.component.mjs +107 -0
- package/esm2020/list/list-chooser.component.mjs +64 -0
- package/esm2020/list/list-pager.component.mjs +120 -0
- package/esm2020/list/list-sorting.component.mjs +61 -0
- package/esm2020/list/list-total.component.mjs +30 -0
- package/esm2020/list/list-views.component.mjs +85 -0
- package/esm2020/list/list.component.mjs +1303 -0
- package/esm2020/list/list.model.mjs +4 -0
- package/esm2020/list/list.module.mjs +144 -0
- package/esm2020/list/list.pipes.mjs +47 -0
- package/esm2020/list/pepperi-addons-ngx-lib-list.mjs +5 -0
- package/esm2020/list/public-api.mjs +15 -0
- package/esm2020/list/virtual-scroller.mjs +1080 -0
- package/esm2020/menu/menu-item.component.mjs +115 -0
- package/esm2020/menu/menu.component.mjs +213 -0
- package/esm2020/menu/menu.model.mjs +19 -0
- package/esm2020/menu/menu.module.mjs +59 -0
- package/esm2020/menu/pepperi-addons-ngx-lib-menu.mjs +5 -0
- package/esm2020/menu/public-api.mjs +7 -0
- package/esm2020/page-layout/page-layout.component.mjs +35 -0
- package/esm2020/page-layout/page-layout.module.mjs +34 -0
- package/esm2020/page-layout/pepperi-addons-ngx-lib-page-layout.mjs +5 -0
- package/esm2020/page-layout/public-api.mjs +6 -0
- package/esm2020/profile-data-views-list/pepperi-addons-ngx-lib-profile-data-views-list.mjs +5 -0
- package/esm2020/profile-data-views-list/profile-data-view/profile-data-view.component.mjs +45 -0
- package/esm2020/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.mjs +81 -0
- package/esm2020/profile-data-views-list/profile-data-views-list.component.mjs +127 -0
- package/esm2020/profile-data-views-list/profile-data-views-list.model.mjs +2 -0
- package/esm2020/profile-data-views-list/profile-data-views-list.module.mjs +88 -0
- package/esm2020/profile-data-views-list/public-api.mjs +9 -0
- package/esm2020/quantity-selector/pepperi-addons-ngx-lib-quantity-selector.mjs +5 -0
- package/esm2020/quantity-selector/public-api.mjs +6 -0
- package/esm2020/quantity-selector/quantity-selector-validation.directive.mjs +49 -0
- package/esm2020/quantity-selector/quantity-selector.component.mjs +574 -0
- package/esm2020/quantity-selector/quantity-selector.module.mjs +82 -0
- package/esm2020/quantity-selector/quantity-selector.pipes.mjs +23 -0
- package/esm2020/query-builder/common/model/field.mjs +2 -0
- package/esm2020/query-builder/common/model/filter.mjs +2 -0
- package/esm2020/query-builder/common/model/legacy.mjs +2 -0
- package/esm2020/query-builder/common/model/operator-unit.mjs +42 -0
- package/esm2020/query-builder/common/model/operator.mjs +276 -0
- package/esm2020/query-builder/common/model/structure.mjs +2 -0
- package/esm2020/query-builder/common/model/type-map.mjs +27 -0
- package/esm2020/query-builder/common/model/type.mjs +6 -0
- package/esm2020/query-builder/common/services/output-query.service.mjs +116 -0
- package/esm2020/query-builder/common/services/query-structure.service.mjs +249 -0
- package/esm2020/query-builder/common/services/type-convertor.service.mjs +42 -0
- package/esm2020/query-builder/pepperi-addons-ngx-lib-query-builder.mjs +5 -0
- package/esm2020/query-builder/public-api.mjs +9 -0
- package/esm2020/query-builder/query-builder-item/query-builder-item.component.mjs +125 -0
- package/esm2020/query-builder/query-builder-section/query-builder-section.component.mjs +71 -0
- package/esm2020/query-builder/query-builder.component.mjs +110 -0
- package/esm2020/query-builder/query-builder.module.mjs +70 -0
- package/esm2020/query-builder/query-builder.service.mjs +102 -0
- package/esm2020/remote-loader/addon-block-loader.component.mjs +102 -0
- package/esm2020/remote-loader/addon-block-loader.service.mjs +62 -0
- package/esm2020/remote-loader/pepperi-addons-ngx-lib-remote-loader.mjs +5 -0
- package/esm2020/remote-loader/public-api.mjs +11 -0
- package/esm2020/remote-loader/remote-loader-element.component.mjs +116 -0
- package/esm2020/remote-loader/remote-loader.component.mjs +115 -0
- package/esm2020/remote-loader/remote-loader.model.mjs +2 -0
- package/esm2020/remote-loader/remote-loader.module.mjs +69 -0
- package/esm2020/remote-loader/remote-loader.service.mjs +81 -0
- package/esm2020/rich-html-textarea/pepperi-addons-ngx-lib-rich-html-textarea.mjs +5 -0
- package/esm2020/rich-html-textarea/public-api.mjs +6 -0
- package/esm2020/rich-html-textarea/rich-html-textarea.component.mjs +250 -0
- package/esm2020/rich-html-textarea/rich-html-textarea.module.mjs +95 -0
- package/esm2020/search/pepperi-addons-ngx-lib-search.mjs +5 -0
- package/esm2020/search/public-api.mjs +7 -0
- package/esm2020/search/search.component.mjs +317 -0
- package/esm2020/search/search.model.mjs +2 -0
- package/esm2020/search/search.module.mjs +70 -0
- package/esm2020/select/pepperi-addons-ngx-lib-select.mjs +5 -0
- package/esm2020/select/public-api.mjs +6 -0
- package/esm2020/select/select.component.mjs +290 -0
- package/esm2020/select/select.module.mjs +70 -0
- package/esm2020/select-panel/pepperi-addons-ngx-lib-select-panel.mjs +5 -0
- package/esm2020/select-panel/public-api.mjs +7 -0
- package/esm2020/select-panel/select-panel.component.mjs +159 -0
- package/esm2020/select-panel/select-panel.model.mjs +2 -0
- package/esm2020/select-panel/select-panel.module.mjs +70 -0
- package/esm2020/separator/pepperi-addons-ngx-lib-separator.mjs +5 -0
- package/esm2020/separator/public-api.mjs +6 -0
- package/esm2020/separator/separator.component.mjs +63 -0
- package/esm2020/separator/separator.module.mjs +18 -0
- package/esm2020/side-bar/pepperi-addons-ngx-lib-side-bar.mjs +5 -0
- package/esm2020/side-bar/public-api.mjs +7 -0
- package/esm2020/side-bar/side-bar.component.mjs +122 -0
- package/esm2020/side-bar/side-bar.model.mjs +2 -0
- package/esm2020/side-bar/side-bar.module.mjs +55 -0
- package/esm2020/signature/pepperi-addons-ngx-lib-signature.mjs +5 -0
- package/esm2020/signature/public-api.mjs +7 -0
- package/esm2020/signature/signature-dialog.component.mjs +79 -0
- package/esm2020/signature/signature.component.mjs +282 -0
- package/esm2020/signature/signature.module.mjs +91 -0
- package/esm2020/size-detector/pepperi-addons-ngx-lib-size-detector.mjs +5 -0
- package/esm2020/size-detector/public-api.mjs +6 -0
- package/esm2020/size-detector/size-detector.component.mjs +92 -0
- package/esm2020/size-detector/size-detector.module.mjs +35 -0
- package/esm2020/skeleton-loader/pepperi-addons-ngx-lib-skeleton-loader.mjs +5 -0
- package/esm2020/skeleton-loader/public-api.mjs +6 -0
- package/esm2020/skeleton-loader/skeleton-loader.component.mjs +44 -0
- package/esm2020/skeleton-loader/skeleton-loader.module.mjs +24 -0
- package/esm2020/smart-filters/boolean-filter/boolean-filter.component.mjs +75 -0
- package/esm2020/smart-filters/common/filter-actions.component.mjs +29 -0
- package/esm2020/smart-filters/common/model/base-filter-component.mjs +296 -0
- package/esm2020/smart-filters/common/model/creator.mjs +76 -0
- package/esm2020/smart-filters/common/model/field.mjs +117 -0
- package/esm2020/smart-filters/common/model/filter.mjs +2 -0
- package/esm2020/smart-filters/common/model/operator.mjs +278 -0
- package/esm2020/smart-filters/common/model/type.mjs +2 -0
- package/esm2020/smart-filters/date-filter/date-filter.component.mjs +182 -0
- package/esm2020/smart-filters/multi-select-filter/multi-select-filter.component.mjs +200 -0
- package/esm2020/smart-filters/number-filter/number-filter.component.mjs +136 -0
- package/esm2020/smart-filters/pepperi-addons-ngx-lib-smart-filters.mjs +5 -0
- package/esm2020/smart-filters/public-api.mjs +19 -0
- package/esm2020/smart-filters/smart-filters.component.mjs +141 -0
- package/esm2020/smart-filters/smart-filters.module.mjs +158 -0
- package/esm2020/smart-filters/text-filter/text-filter.component.mjs +93 -0
- package/esm2020/snack-bar/default-snack-bar.component.mjs +29 -0
- package/esm2020/snack-bar/pepperi-addons-ngx-lib-snack-bar.mjs +5 -0
- package/esm2020/snack-bar/public-api.mjs +8 -0
- package/esm2020/snack-bar/snack-bar.component.mjs +26 -0
- package/esm2020/snack-bar/snack-bar.model.mjs +7 -0
- package/esm2020/snack-bar/snack-bar.module.mjs +63 -0
- package/esm2020/snack-bar/snack-bar.service.mjs +60 -0
- package/esm2020/textarea/pepperi-addons-ngx-lib-textarea.mjs +5 -0
- package/esm2020/textarea/public-api.mjs +6 -0
- package/esm2020/textarea/textarea.component.mjs +188 -0
- package/esm2020/textarea/textarea.module.mjs +82 -0
- package/esm2020/textbox/pepperi-addons-ngx-lib-textbox.mjs +5 -0
- package/esm2020/textbox/public-api.mjs +6 -0
- package/esm2020/textbox/textbox-validation.directive.mjs +93 -0
- package/esm2020/textbox/textbox.component.mjs +582 -0
- package/esm2020/textbox/textbox.module.mjs +72 -0
- package/esm2020/top-bar/pepperi-addons-ngx-lib-top-bar.mjs +5 -0
- package/esm2020/top-bar/public-api.mjs +7 -0
- package/esm2020/top-bar/top-bar.component.mjs +112 -0
- package/esm2020/top-bar/top-bar.model.mjs +2 -0
- package/esm2020/top-bar/top-bar.module.mjs +62 -0
- package/fesm2015/pepperi-addons-ngx-lib-address.mjs +170 -0
- package/fesm2015/pepperi-addons-ngx-lib-address.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-attachment.mjs +297 -0
- package/fesm2015/pepperi-addons-ngx-lib-attachment.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.mjs +147 -0
- package/fesm2015/pepperi-addons-ngx-lib-bread-crumbs.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-carousel.mjs +804 -0
- package/fesm2015/pepperi-addons-ngx-lib-carousel.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-checkbox.mjs +237 -0
- package/fesm2015/pepperi-addons-ngx-lib-checkbox.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-color.mjs +404 -0
- package/fesm2015/pepperi-addons-ngx-lib-color.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-date.mjs +458 -0
- package/fesm2015/pepperi-addons-ngx-lib-date.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-draggable-items.mjs +192 -0
- package/fesm2015/pepperi-addons-ngx-lib-draggable-items.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-files-uploader.mjs +331 -0
- package/fesm2015/pepperi-addons-ngx-lib-files-uploader.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-form.mjs +4226 -0
- package/fesm2015/pepperi-addons-ngx-lib-form.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-group-buttons.mjs +136 -0
- package/fesm2015/pepperi-addons-ngx-lib-group-buttons.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-image.mjs +388 -0
- package/fesm2015/pepperi-addons-ngx-lib-image.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.mjs +425 -0
- package/fesm2015/pepperi-addons-ngx-lib-images-filmstrip.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-link.mjs +399 -0
- package/fesm2015/pepperi-addons-ngx-lib-link.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-list.mjs +3047 -0
- package/fesm2015/pepperi-addons-ngx-lib-list.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-menu.mjs +399 -0
- package/fesm2015/pepperi-addons-ngx-lib-menu.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-page-layout.mjs +77 -0
- package/fesm2015/pepperi-addons-ngx-lib-page-layout.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.mjs +337 -0
- package/fesm2015/pepperi-addons-ngx-lib-profile-data-views-list.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-quantity-selector.mjs +728 -0
- package/fesm2015/pepperi-addons-ngx-lib-quantity-selector.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-query-builder.mjs +1216 -0
- package/fesm2015/pepperi-addons-ngx-lib-query-builder.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-remote-loader.mjs +555 -0
- package/fesm2015/pepperi-addons-ngx-lib-remote-loader.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.mjs +349 -0
- package/fesm2015/pepperi-addons-ngx-lib-rich-html-textarea.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-search.mjs +393 -0
- package/fesm2015/pepperi-addons-ngx-lib-search.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-select-panel.mjs +237 -0
- package/fesm2015/pepperi-addons-ngx-lib-select-panel.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-select.mjs +366 -0
- package/fesm2015/pepperi-addons-ngx-lib-select.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-separator.mjs +89 -0
- package/fesm2015/pepperi-addons-ngx-lib-separator.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-side-bar.mjs +182 -0
- package/fesm2015/pepperi-addons-ngx-lib-side-bar.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-signature.mjs +455 -0
- package/fesm2015/pepperi-addons-ngx-lib-signature.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-size-detector.mjs +134 -0
- package/fesm2015/pepperi-addons-ngx-lib-size-detector.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-skeleton-loader.mjs +78 -0
- package/fesm2015/pepperi-addons-ngx-lib-skeleton-loader.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-smart-filters.mjs +1715 -0
- package/fesm2015/pepperi-addons-ngx-lib-smart-filters.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-snack-bar.mjs +183 -0
- package/fesm2015/pepperi-addons-ngx-lib-snack-bar.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-textarea.mjs +277 -0
- package/fesm2015/pepperi-addons-ngx-lib-textarea.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-textbox.mjs +748 -0
- package/fesm2015/pepperi-addons-ngx-lib-textbox.mjs.map +1 -0
- package/fesm2015/pepperi-addons-ngx-lib-top-bar.mjs +180 -0
- package/fesm2015/pepperi-addons-ngx-lib-top-bar.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-address.mjs +170 -0
- package/fesm2020/pepperi-addons-ngx-lib-address.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-attachment.mjs +297 -0
- package/fesm2020/pepperi-addons-ngx-lib-attachment.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-bread-crumbs.mjs +147 -0
- package/fesm2020/pepperi-addons-ngx-lib-bread-crumbs.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-carousel.mjs +800 -0
- package/fesm2020/pepperi-addons-ngx-lib-carousel.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-checkbox.mjs +237 -0
- package/fesm2020/pepperi-addons-ngx-lib-checkbox.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-color.mjs +401 -0
- package/fesm2020/pepperi-addons-ngx-lib-color.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-date.mjs +454 -0
- package/fesm2020/pepperi-addons-ngx-lib-date.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-draggable-items.mjs +191 -0
- package/fesm2020/pepperi-addons-ngx-lib-draggable-items.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-files-uploader.mjs +328 -0
- package/fesm2020/pepperi-addons-ngx-lib-files-uploader.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-form.mjs +4225 -0
- package/fesm2020/pepperi-addons-ngx-lib-form.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-group-buttons.mjs +136 -0
- package/fesm2020/pepperi-addons-ngx-lib-group-buttons.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-image.mjs +386 -0
- package/fesm2020/pepperi-addons-ngx-lib-image.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-images-filmstrip.mjs +422 -0
- package/fesm2020/pepperi-addons-ngx-lib-images-filmstrip.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-link.mjs +399 -0
- package/fesm2020/pepperi-addons-ngx-lib-link.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-list.mjs +3035 -0
- package/fesm2020/pepperi-addons-ngx-lib-list.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-menu.mjs +399 -0
- package/fesm2020/pepperi-addons-ngx-lib-menu.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-page-layout.mjs +77 -0
- package/fesm2020/pepperi-addons-ngx-lib-page-layout.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-profile-data-views-list.mjs +336 -0
- package/fesm2020/pepperi-addons-ngx-lib-profile-data-views-list.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-quantity-selector.mjs +726 -0
- package/fesm2020/pepperi-addons-ngx-lib-quantity-selector.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-query-builder.mjs +1202 -0
- package/fesm2020/pepperi-addons-ngx-lib-query-builder.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-remote-loader.mjs +532 -0
- package/fesm2020/pepperi-addons-ngx-lib-remote-loader.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-rich-html-textarea.mjs +349 -0
- package/fesm2020/pepperi-addons-ngx-lib-rich-html-textarea.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-search.mjs +392 -0
- package/fesm2020/pepperi-addons-ngx-lib-search.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-select-panel.mjs +236 -0
- package/fesm2020/pepperi-addons-ngx-lib-select-panel.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-select.mjs +366 -0
- package/fesm2020/pepperi-addons-ngx-lib-select.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-separator.mjs +89 -0
- package/fesm2020/pepperi-addons-ngx-lib-separator.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-side-bar.mjs +182 -0
- package/fesm2020/pepperi-addons-ngx-lib-side-bar.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-signature.mjs +450 -0
- package/fesm2020/pepperi-addons-ngx-lib-signature.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-size-detector.mjs +134 -0
- package/fesm2020/pepperi-addons-ngx-lib-size-detector.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-skeleton-loader.mjs +76 -0
- package/fesm2020/pepperi-addons-ngx-lib-skeleton-loader.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-smart-filters.mjs +1708 -0
- package/fesm2020/pepperi-addons-ngx-lib-smart-filters.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-snack-bar.mjs +180 -0
- package/fesm2020/pepperi-addons-ngx-lib-snack-bar.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-textarea.mjs +276 -0
- package/fesm2020/pepperi-addons-ngx-lib-textarea.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-textbox.mjs +748 -0
- package/fesm2020/pepperi-addons-ngx-lib-textbox.mjs.map +1 -0
- package/fesm2020/pepperi-addons-ngx-lib-top-bar.mjs +179 -0
- package/fesm2020/pepperi-addons-ngx-lib-top-bar.mjs.map +1 -0
- package/files-uploader/files-uploader.component.d.ts +60 -0
- package/files-uploader/files-uploader.module.d.ts +21 -0
- package/files-uploader/index.d.ts +5 -0
- package/files-uploader/public-api.d.ts +2 -0
- package/form/field-generator.component.d.ts +37 -0
- package/form/form.component.d.ts +93 -0
- package/form/form.model.d.ts +20 -0
- package/form/form.module.d.ts +50 -0
- package/form/index.d.ts +5 -0
- package/form/indicators.component.d.ts +10 -0
- package/form/internal-button.component.d.ts +42 -0
- package/form/internal-carusel.component.d.ts +39 -0
- package/form/internal-carusel.service.d.ts +10 -0
- package/form/internal-field-generator.component.d.ts +33 -0
- package/form/internal-form.component.d.ts +89 -0
- package/form/internal-list.component.d.ts +95 -0
- package/form/internal-menu.component.d.ts +19 -0
- package/form/internal-page.component.d.ts +73 -0
- package/form/internal-page.service.d.ts +22 -0
- package/form/public-api.d.ts +3 -0
- package/group-buttons/group-buttons.component.d.ts +24 -0
- package/group-buttons/group-buttons.module.d.ts +18 -0
- package/group-buttons/index.d.ts +5 -0
- package/group-buttons/public-api.d.ts +2 -0
- package/image/image.component.d.ts +74 -0
- package/image/image.module.d.ts +20 -0
- package/image/image.service.d.ts +14 -0
- package/image/index.d.ts +5 -0
- package/image/public-api.d.ts +3 -0
- package/images-filmstrip/images-filmstrip.component.d.ts +87 -0
- package/images-filmstrip/images-filmstrip.module.d.ts +22 -0
- package/images-filmstrip/index.d.ts +5 -0
- package/images-filmstrip/public-api.d.ts +2 -0
- package/link/index.d.ts +5 -0
- package/link/link.component.d.ts +121 -0
- package/link/link.module.d.ts +22 -0
- package/link/link.pipes.d.ts +7 -0
- package/link/public-api.d.ts +3 -0
- package/list/index.d.ts +5 -0
- package/list/list-actions.component.d.ts +18 -0
- package/list/list-carousel.component.d.ts +40 -0
- package/list/list-chooser.component.d.ts +29 -0
- package/list/list-pager.component.d.ts +39 -0
- package/list/list-sorting.component.d.ts +30 -0
- package/list/list-total.component.d.ts +11 -0
- package/list/list-views.component.d.ts +35 -0
- package/list/list.component.d.ts +177 -0
- package/list/list.model.d.ts +32 -0
- package/list/list.module.d.ts +34 -0
- package/list/list.pipes.d.ts +16 -0
- package/list/public-api.d.ts +10 -0
- package/list/virtual-scroller.d.ts +183 -0
- package/menu/index.d.ts +5 -0
- package/menu/menu-item.component.d.ts +28 -0
- package/menu/menu.component.d.ts +48 -0
- package/menu/menu.model.d.ts +25 -0
- package/menu/menu.module.d.ts +18 -0
- package/menu/public-api.d.ts +3 -0
- package/package.json +1 -1
- package/page-layout/index.d.ts +5 -0
- package/page-layout/page-layout.component.d.ts +19 -0
- package/page-layout/page-layout.module.d.ts +10 -0
- package/page-layout/public-api.d.ts +2 -0
- package/profile-data-views-list/index.d.ts +5 -0
- package/profile-data-views-list/profile-data-view/profile-data-view.component.d.ts +18 -0
- package/profile-data-views-list/profile-data-views-card/profile-data-views-card.component.d.ts +25 -0
- package/profile-data-views-list/profile-data-views-list.component.d.ts +38 -0
- package/profile-data-views-list/profile-data-views-list.model.d.ts +26 -0
- package/profile-data-views-list/profile-data-views-list.module.d.ts +23 -0
- package/profile-data-views-list/public-api.d.ts +5 -0
- package/quantity-selector/index.d.ts +5 -0
- package/quantity-selector/public-api.d.ts +2 -0
- package/quantity-selector/quantity-selector-validation.directive.d.ts +17 -0
- package/quantity-selector/quantity-selector.component.d.ts +110 -0
- package/quantity-selector/quantity-selector.module.d.ts +23 -0
- package/quantity-selector/quantity-selector.pipes.d.ts +7 -0
- package/query-builder/common/model/field.d.ts +8 -0
- package/query-builder/common/model/filter.d.ts +6 -0
- package/query-builder/common/model/legacy.d.ts +31 -0
- package/query-builder/common/model/operator-unit.d.ts +13 -0
- package/query-builder/common/model/operator.d.ts +31 -0
- package/query-builder/common/model/structure.d.ts +4 -0
- package/query-builder/common/model/type-map.d.ts +12 -0
- package/query-builder/common/model/type.d.ts +4 -0
- package/query-builder/common/services/output-query.service.d.ts +47 -0
- package/query-builder/common/services/query-structure.service.d.ts +83 -0
- package/query-builder/common/services/type-convertor.service.d.ts +13 -0
- package/query-builder/index.d.ts +5 -0
- package/query-builder/public-api.d.ts +5 -0
- package/query-builder/query-builder-item/query-builder-item.component.d.ts +41 -0
- package/query-builder/query-builder-section/query-builder-section.component.d.ts +30 -0
- package/query-builder/query-builder.component.d.ts +39 -0
- package/query-builder/query-builder.module.d.ts +20 -0
- package/query-builder/query-builder.service.d.ts +30 -0
- package/remote-loader/addon-block-loader.component.d.ts +36 -0
- package/remote-loader/addon-block-loader.service.d.ts +15 -0
- package/remote-loader/index.d.ts +5 -0
- package/remote-loader/public-api.d.ts +7 -0
- package/remote-loader/remote-loader-element.component.d.ts +32 -0
- package/remote-loader/remote-loader.component.d.ts +25 -0
- package/remote-loader/remote-loader.model.d.ts +41 -0
- package/remote-loader/remote-loader.module.d.ts +15 -0
- package/remote-loader/remote-loader.service.d.ts +15 -0
- package/rich-html-textarea/index.d.ts +5 -0
- package/rich-html-textarea/public-api.d.ts +2 -0
- package/rich-html-textarea/rich-html-textarea.component.d.ts +80 -0
- package/rich-html-textarea/rich-html-textarea.module.d.ts +25 -0
- package/search/index.d.ts +5 -0
- package/search/public-api.d.ts +3 -0
- package/search/search.component.d.ts +65 -0
- package/search/search.model.d.ts +14 -0
- package/search/search.module.d.ts +20 -0
- package/select/index.d.ts +5 -0
- package/select/public-api.d.ts +2 -0
- package/select/select.component.d.ts +67 -0
- package/select/select.module.d.ts +20 -0
- package/select-panel/index.d.ts +5 -0
- package/select-panel/public-api.d.ts +3 -0
- package/select-panel/select-panel.component.d.ts +51 -0
- package/select-panel/select-panel.model.d.ts +5 -0
- package/select-panel/select-panel.module.d.ts +19 -0
- package/separator/index.d.ts +5 -0
- package/separator/public-api.d.ts +2 -0
- package/separator/separator.component.d.ts +22 -0
- package/separator/separator.module.d.ts +8 -0
- package/side-bar/index.d.ts +5 -0
- package/side-bar/public-api.d.ts +3 -0
- package/side-bar/side-bar.component.d.ts +42 -0
- package/side-bar/side-bar.model.d.ts +4 -0
- package/side-bar/side-bar.module.d.ts +16 -0
- package/signature/index.d.ts +5 -0
- package/signature/public-api.d.ts +3 -0
- package/signature/signature-dialog.component.d.ts +29 -0
- package/signature/signature.component.d.ts +59 -0
- package/signature/signature.module.d.ts +25 -0
- package/size-detector/index.d.ts +5 -0
- package/size-detector/public-api.d.ts +2 -0
- package/size-detector/size-detector.component.d.ts +29 -0
- package/size-detector/size-detector.module.d.ts +11 -0
- package/skeleton-loader/index.d.ts +5 -0
- package/skeleton-loader/public-api.d.ts +2 -0
- package/skeleton-loader/skeleton-loader.component.d.ts +20 -0
- package/skeleton-loader/skeleton-loader.module.d.ts +9 -0
- package/smart-filters/boolean-filter/boolean-filter.component.d.ts +29 -0
- package/smart-filters/common/filter-actions.component.d.ts +12 -0
- package/smart-filters/common/model/base-filter-component.d.ts +74 -0
- package/smart-filters/common/model/creator.d.ts +6 -0
- package/smart-filters/common/model/field.d.ts +69 -0
- package/smart-filters/common/model/filter.d.ts +11 -0
- package/smart-filters/common/model/operator.d.ts +52 -0
- package/smart-filters/common/model/type.d.ts +4 -0
- package/smart-filters/date-filter/date-filter.component.d.ts +61 -0
- package/smart-filters/index.d.ts +5 -0
- package/smart-filters/multi-select-filter/multi-select-filter.component.d.ts +57 -0
- package/smart-filters/number-filter/number-filter.component.d.ts +53 -0
- package/smart-filters/public-api.d.ts +14 -0
- package/smart-filters/smart-filters.component.d.ts +35 -0
- package/smart-filters/smart-filters.module.d.ts +37 -0
- package/smart-filters/text-filter/text-filter.component.d.ts +29 -0
- package/snack-bar/default-snack-bar.component.d.ts +13 -0
- package/snack-bar/index.d.ts +5 -0
- package/snack-bar/public-api.d.ts +4 -0
- package/snack-bar/snack-bar.component.d.ts +12 -0
- package/snack-bar/snack-bar.model.d.ts +8 -0
- package/snack-bar/snack-bar.module.d.ts +19 -0
- package/snack-bar/snack-bar.service.d.ts +24 -0
- package/textarea/index.d.ts +5 -0
- package/textarea/public-api.d.ts +2 -0
- package/textarea/textarea.component.d.ts +56 -0
- package/textarea/textarea.module.d.ts +23 -0
- package/textbox/index.d.ts +5 -0
- package/textbox/public-api.d.ts +2 -0
- package/textbox/textbox-validation.directive.d.ts +22 -0
- package/textbox/textbox.component.d.ts +157 -0
- package/textbox/textbox.module.d.ts +22 -0
- package/top-bar/index.d.ts +5 -0
- package/top-bar/public-api.d.ts +3 -0
- package/top-bar/top-bar.component.d.ts +39 -0
- package/top-bar/top-bar.model.d.ts +4 -0
- package/top-bar/top-bar.module.d.ts +18 -0
|
@@ -0,0 +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.element.nativeElement.offsetWidth; // 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
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJuYWwtbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL2Zvcm0vaW50ZXJuYWwtbGlzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbGliL2Zvcm0vaW50ZXJuYWwtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLFNBQVMsR0FLWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBSUgsVUFBVSxHQUViLE1BQU0seUJBQXlCLENBQUM7Ozs7OztBQWdCakMsTUFBTSxPQUFPLHdCQUF3QjtJQXFFakMsWUFDWSxPQUFtQixFQUNuQixhQUErQixFQUMvQixFQUFxQixFQUNyQixRQUFtQjtRQUhuQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLGtCQUFhLEdBQWIsYUFBYSxDQUFrQjtRQUMvQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQUNyQixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBeEV0QixtQkFBYyxHQUFHLGlCQUFpQixDQUFDO1FBQ25DLDRCQUF1QixHQUFHLEtBQUssQ0FBQztRQUVoQyxRQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDVCxhQUFRLEdBQUcsR0FBRyxDQUFDO1FBQ2YsYUFBUSxHQUFHLEdBQUcsQ0FBQztRQUNmLGVBQVUsR0FBRyxHQUFHLENBQUM7UUFDMUIsa0NBQWtDO1FBQ3pCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLGlCQUFZLEdBQXFCLElBQUksQ0FBQztRQUN0QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLDBCQUFxQixHQUFHLEtBQUssQ0FBQztRQUM5QixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBRXhCLFlBQVk7UUFDWixnR0FBZ0c7UUFFaEcsZUFBVSxHQUFzQixJQUFJLFlBQVksRUFBMkIsQ0FBQztRQUU1RSxnQkFBVyxHQUFnRCxJQUFJLFlBQVksRUFBaUMsQ0FBQztRQU10RyxjQUFTLEdBQWMsSUFBSSxDQUFDO1FBQzVCLGNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV0QixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ1IsbUNBQThCLEdBQUcsSUFBSSxDQUFDO1FBRXRDLFdBQU0sR0FBMEIsSUFBSSxDQUFDO1FBSzdDLHNCQUFzQjtRQUNkLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFJVixjQUFTLEdBQUcsR0FBRyxDQUFDO1FBRXZCLGlCQUFZLEdBQVEsSUFBSSxDQUFDO1FBRXpCLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBRVgsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUUzQixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUV2QiwyQkFBMkI7UUFFM0IsYUFBYTtRQUNiLGtCQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ25CLFdBQU0sR0FBRyxDQUFDLENBQUM7UUFDWCxlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2Ysb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFFcEIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsb0JBQWUsR0FBUSxJQUFJLENBQUM7UUFDNUIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBU3BCLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdELElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDLGNBQWMsRUFBRSxFQUFFO1lBQ3pELElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQTlDRCxJQUFJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQThDRCxRQUFRO1FBQ0osSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFPO1FBQ2YsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUM1QjtJQUNMLENBQUM7SUFFRCxXQUFXO1FBQ1AsMEJBQTBCO1FBQzFCLHNDQUFzQztRQUN0QyxJQUFJO1FBQ0osd0JBQXdCO1FBQ3hCLG9DQUFvQztRQUNwQyxJQUFJO1FBQ0oseUJBQXlCO1FBQ3pCLHFDQUFxQztRQUNyQyxJQUFJO0lBQ1IsQ0FBQztJQUVELGlCQUFpQjtRQUNiLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLEVBQUU7WUFDM0MsT0FBTztTQUNWO1FBRUQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUM7UUFFakMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLENBQUMsK0NBQStDO1FBQ3JFLE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUMxQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQzNDLENBQUM7UUFDRiwwREFBMEQ7UUFDMUQsTUFBTSxxQkFBcUIsR0FDdkIsUUFBUSxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFdkUsTUFBTSxlQUFlLEdBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxhQUFhLEdBQUcsQ0FBQztZQUN0RCxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWE7WUFDeEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztRQUVuRCwwSEFBMEg7UUFDMUgsTUFBTSxXQUFXLEdBQ2IsZUFBZSxDQUFDLFlBQVksR0FBRyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQztZQUMzRCxDQUFDLENBQUMsRUFBRTtZQUNKLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxrQ0FBa0M7UUFFL0MsMEVBQTBFO1FBQzFFLE1BQU0sbUJBQW1CLEdBQ3JCLHFCQUFxQixHQUFHLHNCQUFzQixHQUFHLFdBQVcsQ0FBQztRQUNqRSxJQUFJLENBQUMsY0FBYyxHQUFHLGVBQWUsQ0FBQyxXQUFXLEdBQUcsbUJBQW1CLENBQUM7SUFDNUUsQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUVPLFdBQVcsQ0FBQyxTQUFrQjtRQUNsQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsU0FBUyxDQUFDO0lBQ2pDLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsUUFBUSxFQUFFLFlBQVksR0FBRyxJQUFJO1FBQy9ELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxhQUFhLENBQUMsTUFBYyxFQUFFLFFBQVEsR0FBRyxFQUFFO1FBQ3ZDLE9BQU8sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO0lBQzlDLENBQUM7SUFFRCxTQUFTO1FBQ0wsSUFDSSxJQUFJLENBQUMsU0FBUyxLQUFLLENBQUM7WUFDcEIsQ0FBQyxJQUFJLENBQUMsU0FBUztZQUNmLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhO1lBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQzNDO1lBQ0UsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDeEMsSUFBSSxFQUFFLENBQUMsV0FBVyxLQUFLLENBQUMsRUFBRTtnQkFDdEIsRUFBRSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7YUFDdkI7WUFFRCxJQUNJLElBQUksQ0FBQyxPQUFPO2dCQUNaLENBQUMsRUFBRSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsS0FBSztvQkFDOUIsZ0RBQWdEO29CQUNoRCxFQUFFLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxTQUFTO29CQUNyQyxFQUFFLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyw2QkFBNkI7b0JBQ3pELEVBQUUsQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDLDBCQUEwQjtvQkFDdEQsRUFBRSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsc0JBQXNCO29CQUNsRCxFQUFFLENBQUMsU0FBUyxLQUFLLFVBQVUsQ0FBQyxtQkFBbUI7b0JBQy9DLEVBQUUsQ0FBQyxTQUFTLEtBQUssVUFBVSxDQUFDLE9BQU87b0JBQ25DLEVBQUUsQ0FBQyxPQUFPLEtBQUssZUFBZTtvQkFDOUIsRUFBRSxDQUFDLE9BQU8sS0FBSyxrQkFBa0IsQ0FBQyxFQUN4QztnQkFDRSxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7YUFDNUI7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxFQUFFLENBQUM7U0FDM0I7UUFFRCx5QkFBeUI7UUFDekIsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztTQUM1QjtRQUVELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNoRCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3BCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxDQUFDLDhCQUE4QjtRQUMxRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDbkQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUM7UUFFakMseUVBQXlFO1FBQ3pFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLDhCQUE4QjtvQkFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUMvQixDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLGVBQWUsS0FBSyxDQUFDLENBQ25DLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQzthQUN0QjtTQUNKO1FBRUQsa0dBQWtHO1FBQ2xHLElBQUksQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUU7WUFDdEMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQ3hELENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsV0FBVyxHQUFHLGFBQWEsQ0FDekMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7WUFFMUMsSUFBSSxNQUFNLENBQUMsVUFBVSxHQUFHLG1CQUFtQixFQUFFO2dCQUN6QyxJQUFJLENBQUMsOEJBQThCLEdBQUcsSUFBSSxDQUFDO2FBQzlDO1NBQ0o7UUFFRCxJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztRQUUzQixxQkFBcUI7UUFDckIsSUFBSSxJQUFJLENBQUMsOEJBQThCLEVBQUU7WUFDckMsTUFBTSxjQUFjLEdBQVcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUMzRCxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FDekIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUM7WUFFMUMsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDekMsTUFBTSxjQUFjLEdBQW1CLElBQUksQ0FBQyxTQUFTO3FCQUNoRCxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLE1BQU0seUJBQXlCLEdBQzNCLENBQUMsR0FBRyxHQUFHLGNBQWMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUM7Z0JBRXhELGNBQWMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDdkMsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLHlCQUF5QixDQUFDLEdBQUcsR0FBRyxDQUMxRCxDQUFDO2dCQUVGLElBQUksS0FBSyxLQUFLLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3RCLGNBQWMsQ0FBQywwQkFBMEIsR0FBRyxjQUFjLENBQUMscUJBQXFCO3dCQUM1RSxjQUFjLEdBQUcsa0JBQWtCLEdBQUcsS0FBSyxDQUFDLENBQUMsV0FBVztpQkFDL0Q7cUJBQU07b0JBQ0gsY0FBYyxDQUFDLDBCQUEwQixHQUFHLGNBQWMsQ0FBQyxxQkFBcUI7d0JBQzVFLGNBQWMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO29CQUMxQyxrQkFBa0IsSUFBSSxjQUFjLENBQUMsZUFBZSxDQUFDO2lCQUN4RDthQUNKO1lBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUMxQixPQUFPLEVBQ1AsU0FBUyxDQUNaLENBQUM7U0FDTDthQUFNO1lBQ0gsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDekMsTUFBTSxjQUFjLEdBQW1CLElBQUksQ0FBQyxTQUFTO3FCQUNoRCxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzFCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDaEMsY0FBYyxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQzdDLENBQUM7Z0JBRUYsSUFBSSxLQUFLLEtBQUssTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDdEIsY0FBYyxDQUFDLDBCQUEwQjt3QkFDckMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO29CQUM3QixjQUFjLENBQUMscUJBQXFCO3dCQUNoQyxpQkFBaUIsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsMEJBQTBCO2lCQUMvRDtxQkFBTTtvQkFDSCxjQUFjLENBQUMsMEJBQTBCLEdBQUcsY0FBYyxDQUFDLHFCQUFxQjt3QkFDNUUsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO2lCQUNoQztnQkFFRCxrQkFBa0IsSUFBSSxpQkFBaUIsQ0FBQzthQUMzQztZQUVELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFDMUIsT0FBTyxFQUNQLGtCQUFrQixHQUFHLHNCQUFzQixHQUFHLElBQUksQ0FDckQsQ0FBQztTQUNMO0lBQ0wsQ0FBQztJQUVPLGNBQWM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDaEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGlCQUFpQixDQUFDLEtBQUssRUFBRSxTQUFTO1FBQzlCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN0QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsV0FBVyxDQUFDO1FBQ3JFLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDLHNEQUFzRDtJQUN6SCxDQUFDO0lBRUQsWUFBWSxDQUFDLEtBQUs7UUFDZCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRTtnQkFDekMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7Z0JBQ3ZCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFFNUIsc0VBQXNFO1lBQ3RFLElBQUksSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLElBQUksRUFBRSxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUU7Z0JBQ3RELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztnQkFDbkQsSUFBSSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7Z0JBRTNCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7b0JBQ3pDLE1BQU0sY0FBYyxHQUFtQixJQUFJLENBQUMsU0FBUzt5QkFDaEQsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUUxQixJQUFJLEtBQUssS0FBSyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUN0QixnREFBZ0Q7d0JBQ2hELElBQUksSUFBSSxDQUFDLDhCQUE4QixFQUFFOzRCQUNyQyxjQUFjLENBQUMsMEJBQTBCLEdBQUcsY0FBYyxDQUFDLHFCQUFxQjtnQ0FDNUUsY0FBYyxHQUFHLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxDQUFDLFdBQVc7eUJBQy9EOzZCQUFNOzRCQUNILElBQUksY0FBYyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFO2dDQUMvQyxjQUFjLENBQUMsZUFBZTtvQ0FDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7Z0NBQ2pDLGNBQWMsQ0FBQywwQkFBMEI7b0NBQ3JDLGNBQWMsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO2dDQUMxQyxjQUFjLENBQUMscUJBQXFCO29DQUNoQyxjQUFjLENBQUMsZUFBZSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUM7NkJBQ2pEO3lCQUNKO3FCQUNKO3lCQUFNLElBQUksY0FBYyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFO3dCQUN0RCxjQUFjLENBQUMsZUFBZTs0QkFDMUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7d0JBQ2pDLGNBQWMsQ0FBQywwQkFBMEIsR0FBRyxjQUFjLENBQUMscUJBQXFCOzRCQUM1RSxjQUFjLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztxQkFDN0M7b0JBRUQsa0JBQWtCLElBQUksY0FBYyxDQUFDLGVBQWUsQ0FBQztpQkFDeEQ7Z0JBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUMxQixPQUFPLEVBQ1AsSUFBSSxDQUFDLGVBQWUsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUMzQyxDQUFDO2FBQ0w7WUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDL0M7SUFDTCxDQUFDO0lBRUQsU0FBUyxDQUFDLEVBQUUsRUFBRSxjQUFjO1FBQ3hCLHdFQUF3RTtRQUN4RSxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUU7WUFDOUIsY0FBYyxHQUFHLFFBQVEsQ0FBQztTQUM3QjtRQUNELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDO1FBRXRCLE9BQ0ksQ0FBQztZQUNELENBQUMsQ0FBQyxTQUFTLEtBQUssRUFBRTtZQUNsQixDQUFDLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDMUMsY0FBYyxLQUFLLFFBQVEsRUFDN0I7WUFDRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDWixDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQztTQUNwQjtRQUNELElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUU7WUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGlEQUFpRDtTQUNwRTtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBSztRQUNqQixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMvQixJQUNJLEtBQUs7Z0JBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQzNEO2dCQUNFLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN6QjtpQkFBTTtnQkFDSCxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNaLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDMUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2FBQ1Q7U0FDSjtJQUNMLENBQUM7SUFFRCxzQkFBc0IsQ0FBQyxLQUFLO1FBQ3hCLCtCQUErQjtJQUNuQyxDQUFDO0lBRUQsc0JBQXNCLENBQUMsS0FBSztRQUN4QixnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFVO1FBQ25CLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNwQixPQUFPO1NBQ1Y7UUFFRCwrQkFBK0I7UUFDL0IsSUFDSSxPQUFPLEtBQUssQ0FBQyxLQUFLLEtBQUssV0FBVztZQUNsQyxPQUFPLEtBQUssQ0FBQyxHQUFHLEtBQUssV0FBVyxFQUNsQztZQUNFLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBRWpFLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN0RCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzFCO0lBQ0wsQ0FBQztJQUVELGtCQUFrQjtRQUNkLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFELENBQUM7SUFFRCxjQUFjLENBQUMsV0FBMEM7UUFDckQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELHFCQUFxQixDQUNqQix5QkFBa0Q7UUFFbEQsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2YsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsYUFBYSxDQUFDLElBQW9CO1FBQzlCLElBQUksSUFBSSxDQUFDLHFCQUFxQixFQUFFO1lBQzVCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7YUFBTTtZQUNILE1BQU0seUJBQXlCLEdBQzNCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQztZQUN6QyxPQUFPLHlCQUF5QixDQUFDO1NBQ3BDO0lBQ0wsQ0FBQztJQUVELGlCQUFpQixDQUFDLE1BQWMsRUFBRSxRQUFRLEdBQUcsRUFBRTtRQUMzQyxJQUFJLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFFdkIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDeEQsVUFBVSxHQUFHLFVBQVUsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBRWhELE9BQU8sVUFBVSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxjQUFjLENBQ2xCLE1BQU0sRUFDTixzQkFBK0IsRUFDL0IsUUFBZ0IsRUFDaEIsU0FBa0I7UUFFbEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFeEQsNEJBQTRCO1FBQzVCLElBQUksU0FBUyxFQUFFO1lBQ1gsbUJBQW1CO1lBQ25CLElBQUksQ0FBQyxjQUFjLEdBQUcsVUFBVSxDQUFDO1NBQ3BDO2FBQU07WUFDSCxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssVUFBVSxFQUFFO2dCQUNwQyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQzthQUM1QjtTQUNKO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxDQUFNLEVBQUUsSUFBb0I7UUFDcEMsbUJBQW1CO1FBQ25CLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0QyxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFFdEIsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQ3JDLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDM0QsU0FBUyxHQUFHLElBQUksQ0FBQztTQUNwQjtRQUVELElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNkLElBQUksQ0FBQyxjQUFjLENBQ2YsTUFBTSxFQUNOLElBQUksQ0FBQyxzQkFBc0IsRUFDM0IsUUFBUSxFQUNSLElBQUksQ0FDUCxDQUFDO1NBQ0w7YUFBTTtZQUNILElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtnQkFDZixPQUFPO2FBQ1Y7U0FDSjtRQUVELGtFQUFrRTtJQUN0RSxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBVSxFQUFFLE1BQWMsRUFBRSxRQUFnQjtRQUM3RCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN0QixPQUFPO1NBQ1Y7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsb0JBQW9CLENBQUMsS0FBVSxFQUFFLE1BQWMsRUFBRSxRQUFnQjtRQUM3RCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBVSxFQUFFLE1BQWMsRUFBRSxRQUFnQjtRQUN6RCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN0QixPQUFPO1NBQ1Y7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsYUFBYSxHQUFHLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsS0FBVSxFQUFFLE1BQWMsRUFBRSxRQUFnQjtRQUN6RCxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUM1QixDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELFNBQVMsQ0FBQyxDQUFDO1FBQ1AsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBYSxFQUFFLElBQW9CO1FBQzNDLE9BQU8sSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUMvQyxDQUFDO0lBRUQsVUFBVTtRQUNOLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNO1lBQ1AsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBaUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsWUFBWTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsWUFBWSxDQUNSLFNBQW9CLEVBQ3BCLFNBQWlCLEVBQ2pCLEtBQXVCLEVBQ3ZCLFdBQTRCLE9BQU8sRUFDbkMsU0FBUyxHQUFHLEVBQUU7UUFFZCxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLFFBQVEsS0FBSyxPQUFPLENBQUM7UUFDcEMsMENBQTBDO1FBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBRTNCLHNFQUFzRTtRQUN0RSxzREFBc0Q7UUFDdEQsbUNBQW1DO1FBRW5DLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUVsQixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU8sV0FBVyxDQUFDLEtBQXVCO1FBQ3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDdkMsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3JDLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBUztRQUNoQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFFZCxvQkFBb0I7UUFDcEIsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDN0QsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUN6QyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztTQUM1QjtRQUVELDBCQUEwQjtRQUMxQixLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVuRSxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQy9DLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQy9CLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUMvQztJQUNMLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxHQUFXO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDakIsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1NBQzdCO2FBQU07WUFDSCxPQUFPLEtBQUssQ0FBQztTQUNoQjtJQUNMLENBQUM7SUFFRCxlQUFlLENBQUMsR0FBVztRQUN2QixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7O3FIQTFtQlEsd0JBQXdCO3lHQUF4Qix3QkFBd0IsMDNCQ3BDckMsZzVNQTRHYzsyRkR4RUQsd0JBQXdCO2tCQVJwQyxTQUFTOytCQUNJLG1CQUFtQixRQUd2Qjt3QkFDRixpQkFBaUIsRUFBRSxtQkFBbUI7cUJBQ3pDO3dMQUdRLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csdUJBQXVCO3NCQUEvQixLQUFLO2dCQUVHLEdBQUc7c0JBQVgsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFDRyxTQUFTO3NCQUFqQixLQUFLO2dCQUtOLFVBQVU7c0JBRFQsTUFBTTtnQkFHUCxXQUFXO3NCQURWLE1BQU07Z0JBRzJCLG1CQUFtQjtzQkFBcEQsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBQ04sV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQUNFLFdBQVc7c0JBQXBDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgT25Jbml0LFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGQsXG4gICAgRWxlbWVudFJlZixcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25DaGFuZ2VzLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGRlbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgICBQZXBMYXlvdXRTZXJ2aWNlLFxuICAgIFVJQ29udHJvbCxcbiAgICBVSUNvbnRyb2xGaWVsZCxcbiAgICBGSUVMRF9UWVBFLFxuICAgIE9iamVjdHNEYXRhUm93LFxufSBmcm9tICdAcGVwcGVyaS1hZGRvbnMvbmd4LWxpYic7XG5pbXBvcnQge1xuICAgIElQZXBGb3JtRmllbGRDbGlja0V2ZW50LFxuICAgIElQZXBGb3JtRmllbGRWYWx1ZUNoYW5nZUV2ZW50LFxufSBmcm9tICcuL2Zvcm0ubW9kZWwnO1xuXG5leHBvcnQgdHlwZSBQZXBMaXN0Vmlld1R5cGUgPSAnY2FyZHMnIHwgJ2xpbmVzJyB8ICd0YWJsZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncGVwLWludGVybmFsLWxpc3QnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9pbnRlcm5hbC1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9pbnRlcm5hbC1saXN0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgaG9zdDoge1xuICAgICAgICAnKHdpbmRvdzpyZXNpemUpJzogJ3dpblJlc2l6ZSgkZXZlbnQpJyxcbiAgICB9LFxufSlcbmV4cG9ydCBjbGFzcyBQZXBJbnRlcm5hbExpc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgICBASW5wdXQoKSBub0RhdGFGb3VuZE1zZyA9ICdJdGVtcyBub3QgZm91bmQnO1xuICAgIEBJbnB1dCgpIGhpZGVBbGxTZWxlY3Rpb25Jbk11bHRpID0gZmFsc2U7XG5cbiAgICBASW5wdXQoKSB0b3AgPSAtMTtcbiAgICBASW5wdXQoKSBvYmplY3RJZCA9ICcwJztcbiAgICBASW5wdXQoKSBwYXJlbnRJZCA9ICcwJztcbiAgICBASW5wdXQoKSBzZWFyY2hDb2RlID0gJzAnO1xuICAgIC8vIEBJbnB1dCgpIHNob3dUb3BCb3JkZXIgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBzdXBwb3J0UmVzaXppbmcgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHBhcmVudFNjcm9sbDogRWxlbWVudCB8IFdpbmRvdyA9IG51bGw7XG4gICAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBkaXNhYmxlRXZlbnRzID0gZmFsc2U7XG4gICAgQElucHV0KCkgZGlzYWJsZVNlbGVjdGlvbkl0ZW1zID0gZmFsc2U7XG4gICAgQElucHV0KCkgdG90YWxzUm93ID0gW107XG5cbiAgICAvLyBAT3V0cHV0KClcbiAgICAvLyBpdGVtQ2xpY2s6IEV2ZW50RW1pdHRlcjxJUGVwTGlzdEl0ZW1DbGlja0V2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBlcExpc3RJdGVtQ2xpY2tFdmVudD4oKTtcbiAgICBAT3V0cHV0KClcbiAgICBmaWVsZENsaWNrOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8SVBlcEZvcm1GaWVsZENsaWNrRXZlbnQ+KCk7XG4gICAgQE91dHB1dCgpXG4gICAgdmFsdWVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxJUGVwRm9ybUZpZWxkVmFsdWVDaGFuZ2VFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPElQZXBGb3JtRmllbGRWYWx1ZUNoYW5nZUV2ZW50PigpO1xuXG4gICAgQFZpZXdDaGlsZCgnbm9WaXJ0dWFsU2Nyb2xsQ29udCcpIG5vVmlydHVhbFNjcm9sbENvbnQ6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgndGFibGVIZWFkZXInKSB0YWJsZUhlYWRlcjogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdzZWxlY3RBbGxDQicpIHNlbGVjdEFsbENCOiBhbnk7XG5cbiAgICBwdWJsaWMgdWlDb250cm9sOiBVSUNvbnRyb2wgPSBudWxsO1xuICAgIHB1YmxpYyB0b3RhbFJvd3MgPSAtMTtcbiAgICBpdGVtQ2xhc3M6IHN0cmluZztcbiAgICBpc1RhYmxlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBoYXNDb2x1bW5XaWR0aE9mVHlwZVBlcmNlbnRhZ2UgPSB0cnVlO1xuXG4gICAgcHJpdmF0ZSBfaXRlbXM6IEFycmF5PE9iamVjdHNEYXRhUm93PiA9IG51bGw7XG4gICAgZ2V0IGl0ZW1zKCk6IEFycmF5PE9iamVjdHNEYXRhUm93PiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pdGVtcztcbiAgICB9XG5cbiAgICAvLyBpc0NhcmRWaWV3ID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBpdGVtc0NvdW50ZXIgPSAwO1xuICAgIHNob3dJdGVtcyA9IHRydWU7XG4gICAgdmlld1R5cGU6IFBlcExpc3RWaWV3VHlwZTtcbiAgICBzY3JvbGxJdGVtczogQXJyYXk8T2JqZWN0c0RhdGFSb3c+O1xuXG4gICAgcHVibGljIFNFUEFSQVRPUiA9ICcsJztcblxuICAgIG5hdGl2ZVdpbmRvdzogYW55ID0gbnVsbDtcblxuICAgIHNlbGVjdGVkSXRlbUlkID0gJyc7XG4gICAgaG92ZXJlZEl0ZW1JZCA9ICcnO1xuXG4gICAgcHJpdmF0ZSBsb2NrRXZlbnRzID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBjb250YWluZXJXaWR0aCA9IDA7XG5cbiAgICBkZXZpY2VIYXNNb3VzZSA9IGZhbHNlO1xuXG4gICAgLy8gaGVhZGVySXNJbkZvY3VzID0gZmFsc2U7XG5cbiAgICAvLyBGb3IgcmVzaXplXG4gICAgcHJlc3NlZENvbHVtbiA9ICcnO1xuICAgIHN0YXJ0WCA9IDA7XG4gICAgc3RhcnRXaWR0aCA9IDA7XG4gICAgdGFibGVTdGFydFdpZHRoID0gMDtcblxuICAgIGlzVXNlclNlbGVjdGVkID0gZmFsc2U7XG4gICAgY2hlY2tGb3JDaGFuZ2VzOiBhbnkgPSBudWxsO1xuICAgIHVzZVZpcnR1YWxTY3JvbGwgPSB0cnVlO1xuICAgIGNhbGN1bGF0ZWRPYmplY3RIZWlnaHQ6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgbGF5b3V0U2VydmljZTogUGVwTGF5b3V0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMlxuICAgICkge1xuICAgICAgICB0aGlzLm5hdGl2ZVdpbmRvdyA9IHdpbmRvdztcbiAgICAgICAgdGhpcy5kZXZpY2VIYXNNb3VzZSA9IHRoaXMubGF5b3V0U2VydmljZS5nZXREZXZpY2VIYXNNb3VzZSgpO1xuICAgICAgICB0aGlzLmxheW91dFNlcnZpY2Uub25Nb3VzZU92ZXIkLnN1YnNjcmliZSgoZGV2aWNlSGFzTW91c2UpID0+IHtcbiAgICAgICAgICAgIHRoaXMuZGV2aWNlSGFzTW91c2UgPSBkZXZpY2VIYXNNb3VzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSAwO1xuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyV2lkdGggPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5zZXRDb250YWluZXJXaWR0aCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIC8vIGlmICh0aGlzLnZhbHVlQ2hhbmdlKSB7XG4gICAgICAgIC8vICAgICB0aGlzLnZhbHVlQ2hhbmdlLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gaWYgKHRoaXMuaXRlbUNsaWNrKSB7XG4gICAgICAgIC8vICAgICB0aGlzLml0ZW1DbGljay51bnN1YnNjcmliZSgpO1xuICAgICAgICAvLyB9XG4gICAgICAgIC8vIGlmICh0aGlzLmZpZWxkQ2xpY2spIHtcbiAgICAgICAgLy8gICAgIHRoaXMuZmllbGRDbGljay51bnN1YnNjcmliZSgpO1xuICAgICAgICAvLyB9XG4gICAgfVxuXG4gICAgc2V0Q29udGFpbmVyV2lkdGgoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2VsZWN0aW9uQ2hlY2tCb3hXaWR0aCA9IDA7XG5cbiAgICAgICAgY29uc3Qgcm93SGVpZ2h0ID0gNDA7IC8vIHRoZSB0YWJsZSByb3cgaGVpZ2h0ICgyLjVyZW0gKiAxNmZvbnQtc2l6ZSkuXG4gICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnRcbiAgICAgICAgKTtcbiAgICAgICAgLy8gVGhlIGNvbnRhaW5lci1mbHVpZCBjbGFzcyBwYWRkaW5nIGxlZnQgKyByaWdodCArIGJvcmRlclxuICAgICAgICBjb25zdCBjb250YWluZXJGbHVpZFNwYWNpbmcgPVxuICAgICAgICAgICAgcGFyc2VJbnQoc3R5bGUucGFkZGluZ0xlZnQsIDEwKSArIHBhcnNlSW50KHN0eWxlLnBhZGRpbmdSaWdodCwgMTApO1xuXG4gICAgICAgIGNvbnN0IHBhcmVudENvbnRhaW5lciA9XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQgPiAwXG4gICAgICAgICAgICAgICAgPyB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnRcbiAgICAgICAgICAgICAgICA6IHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGlmIHZlcnRpY2FsIHNjcm9sbCBzaG91bGQgYXBwZWFyLCBpZiBzbyBzZXQgdGhlIHNjcm9sbCB3aWR0aC4gKHRoaXMudG90YWxSb3dzICsgMSkgKyAxIGlzIGZvciB0aGUgaGVhZGVyIHJvdy5cbiAgICAgICAgY29uc3Qgc2Nyb2xsV2lkdGggPVxuICAgICAgICAgICAgcGFyZW50Q29udGFpbmVyLmNsaWVudEhlaWdodCA8IHJvd0hlaWdodCAqICh0aGlzLnRvdGFsUm93cyArIDEpXG4gICAgICAgICAgICAgICAgPyAxOFxuICAgICAgICAgICAgICAgIDogMDsgLy8gMTggaXMgdGhlIGRlZmF1bHQgc2Nyb2xsIHdpZHRoLlxuXG4gICAgICAgIC8vIFRoZSBzZWxlY3Rpb25DaGVja0JveFdpZHRoIHdpZHRoICsgY29udGFpbmVyRmx1aWRTcGFjaW5nICsgc2Nyb2xsV2lkdGguXG4gICAgICAgIGNvbnN0IHJvd0hlYWRlcldpZHRoVG9TdWIgPVxuICAgICAgICAgICAgY29udGFpbmVyRmx1aWRTcGFjaW5nICsgc2VsZWN0aW9uQ2hlY2tCb3hXaWR0aCArIHNjcm9sbFdpZHRoO1xuICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoID0gcGFyZW50Q29udGFpbmVyLm9mZnNldFdpZHRoIC0gcm93SGVhZGVyV2lkdGhUb1N1YjtcbiAgICB9XG5cbiAgICBjbGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jbGVhbkl0ZW1zKCk7XG4gICAgICAgIHRoaXMudWlDb250cm9sID0gbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHRvZ2dsZUl0ZW1zKGlzVmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dJdGVtcyA9IGlzVmlzaWJsZTtcbiAgICAgICAgdGhpcy5sb2NrRXZlbnRzID0gIWlzVmlzaWJsZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVNjcm9sbEl0ZW1zKHN0YXJ0SW5kZXgsIGVuZEluZGV4LCBsb2FkSW5DaHVua3MgPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2Nyb2xsSXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcbiAgICB9XG5cbiAgICBnZXRVbmlxSXRlbUlkKGl0ZW1JZDogc3RyaW5nLCBpdGVtVHlwZSA9ICcnKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGl0ZW1JZCArIHRoaXMuU0VQQVJBVE9SICsgaXRlbVR5cGU7XG4gICAgfVxuXG4gICAgc2V0TGF5b3V0KCk6IHZvaWQge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLnRvdGFsUm93cyA9PT0gMCB8fFxuICAgICAgICAgICAgIXRoaXMudWlDb250cm9sIHx8XG4gICAgICAgICAgICAhdGhpcy51aUNvbnRyb2wuQ29udHJvbEZpZWxkcyB8fFxuICAgICAgICAgICAgdGhpcy51aUNvbnRyb2wuQ29udHJvbEZpZWxkcy5sZW5ndGggPT09IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVpQ29udHJvbC5Db250cm9sRmllbGRzLmZvckVhY2goKGNmKSA9PiB7XG4gICAgICAgICAgICBpZiAoY2YuQ29sdW1uV2lkdGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBjZi5Db2x1bW5XaWR0aCA9IDEwO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5pc1RhYmxlICYmXG4gICAgICAgICAgICAgICAgKGNmLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5JbWFnZSB8fFxuICAgICAgICAgICAgICAgICAgICAvLyBjZi5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuSW5kaWNhdG9ycyB8fCA/Pz9cbiAgICAgICAgICAgICAgICAgICAgY2YuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLlNpZ25hdHVyZSB8fFxuICAgICAgICAgICAgICAgICAgICBjZi5GaWVsZFR5cGUgPT09IEZJRUxEX1RZUEUuTnVtYmVySW50ZWdlclF1YW50aXR5U2VsZWN0b3IgfHxcbiAgICAgICAgICAgICAgICAgICAgY2YuRmllbGRUeXBlID09PSBGSUVMRF9UWVBFLk51bWJlclJlYWxRdWFudGl0eVNlbGVjdG9yIHx8XG4gICAgICAgICAgICAgICAgICAgIGNmLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5OdW1iZXJJbnRlZ2VyRm9yTWF0cml4IHx8XG4gICAgICAgICAgICAgICAgICAgIGNmLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5OdW1iZXJSZWFsRm9yTWF0cml4IHx8XG4gICAgICAgICAgICAgICAgICAgIGNmLkZpZWxkVHlwZSA9PT0gRklFTERfVFlQRS5QYWNrYWdlIHx8XG4gICAgICAgICAgICAgICAgICAgIGNmLkFwaU5hbWUgPT09ICdVbml0c1F1YW50aXR5JyB8fFxuICAgICAgICAgICAgICAgICAgICBjZi5BcGlOYW1lID09PSAnUXVhbnRpdHlTZWxlY3RvcicpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjZi5MYXlvdXQuWEFsaWdubWVudCA9IDM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghdGhpcy5jZFsnZGVzdHJveWVkJ10pIHtcbiAgICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IHRoZSBjb2x1bW5zIHdpZHRoLlxuICAgICAgICBpZiAodGhpcy5jb250YWluZXJXaWR0aCA8PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnNldENvbnRhaW5lcldpZHRoKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGNDb2x1bW5zV2lkdGgoKTtcbiAgICAgICAgdGhpcy5jaGVja0ZvckNoYW5nZXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNhbGNDb2x1bW5zV2lkdGgoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGZpeGVkTXVsdGlwbGUgPSAzLjc4OyAvLyBmb3IgY29udmVydGluZyBlbSB0byBwaXhlbC5cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gdGhpcy51aUNvbnRyb2wuQ29udHJvbEZpZWxkcy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IHNlbGVjdGlvbkNoZWNrQm94V2lkdGggPSAwO1xuXG4gICAgICAgIC8vIElzIHRhYmxlIEFORCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY29sdW1uIG9mIHdpZHRoIHR5cGUgb2YgcGVyY2VudGFnZS5cbiAgICAgICAgaWYgKHRoaXMuaXNUYWJsZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudWlDb250cm9sICYmIHRoaXMudWlDb250cm9sLkNvbnRyb2xGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0NvbHVtbldpZHRoT2ZUeXBlUGVyY2VudGFnZSA9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudWlDb250cm9sLkNvbnRyb2xGaWVsZHMuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNmKSA9PiBjZi5Db2x1bW5XaWR0aFR5cGUgPT09IDFcbiAgICAgICAgICAgICAgICAgICAgKS5sZW5ndGggPT09IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGUgY29sdW1ucyBzaXplIGlzIGZpeGVkIGFuZCB0aGUgdG90YWwgaXMgc21hbGwgdGhlbiB0aGUgY29udGFpbmVyIGNoYW5nZSBpdCB0byBwZXJjZW50YWdlLlxuICAgICAgICBpZiAoIXRoaXMuaGFzQ29sdW1uV2lkdGhPZlR5cGVQZXJjZW50YWdlKSB7XG4gICAgICAgICAgICBjb25zdCB0b3RhbEZpeGVkQ29sc1dpZHRoID0gdGhpcy51aUNvbnRyb2wuQ29udHJvbEZpZWxkcy5tYXAoXG4gICAgICAgICAgICAgICAgKGNmKSA9PiBjZi5Db2x1bW5XaWR0aCAqIGZpeGVkTXVsdGlwbGVcbiAgICAgICAgICAgICkucmVkdWNlKChzdW0sIGN1cnJlbnQpID0+IHN1bSArIGN1cnJlbnQpO1xuXG4gICAgICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPiB0b3RhbEZpeGVkQ29sc1dpZHRoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNDb2x1bW5XaWR0aE9mVHlwZVBlcmNlbnRhZ2UgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRvdGFsQ2FsY0NvbHNXaWR0aCA9IDA7XG5cbiAgICAgICAgLy8gQ2FsYyBieSBwZXJjZW50YWdlXG4gICAgICAgIGlmICh0aGlzLmhhc0NvbHVtbldpZHRoT2ZUeXBlUGVyY2VudGFnZSkge1xuICAgICAgICAgICAgY29uc3QgdG90YWxDb2xzV2lkdGg6IG51bWJlciA9IHRoaXMudWlDb250cm9sLkNvbnRyb2xGaWVsZHMubWFwKFxuICAgICAgICAgICAgICAgIChjZikgPT4gY2YuQ29sdW1uV2lkdGhcbiAgICAgICAgICAgICkucmVkdWNlKChzdW0sIGN1cnJlbnQpID0+IHN1bSArIGN1cnJlbnQpO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdWlDb250cm9sRmllbGQ6IFVJQ29udHJvbEZpZWxkID0gdGhpcy51aUNvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgLkNvbnRyb2xGaWVsZHNbaW5kZXhdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbGNDb2x1bW5XaWR0aFBlcmNlbnRhZ2UgPVxuICAgICAgICAgICAgICAgICAgICAoMTAwIC8gdG90YWxDb2xzV2lkdGgpICogdWlDb250cm9sRmllbGQuQ29sdW1uV2lkdGg7XG5cbiAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGggPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgICAgICAgICAodGhpcy5jb250YWluZXJXaWR0aCAqIGNhbGNDb2x1bW5XaWR0aFBlcmNlbnRhZ2UpIC8gMTAwXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gbGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZyA9IHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aFN0cmluZyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAnY2FsYygxMDAlIC0gJyArIHRvdGFsQ2FsY0NvbHNXaWR0aCArICdweCknOyAvLyBGb3IgMTAwJVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNUaXRsZUNvbHVtbldpZHRoU3RyaW5nID0gdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoU3RyaW5nID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgIHRvdGFsQ2FsY0NvbHNXaWR0aCArPSB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICd3aWR0aCcsXG4gICAgICAgICAgICAgICAgJ2luaGVyaXQnXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHVpQ29udHJvbEZpZWxkOiBVSUNvbnRyb2xGaWVsZCA9IHRoaXMudWlDb250cm9sXG4gICAgICAgICAgICAgICAgICAgIC5Db250cm9sRmllbGRzW2luZGV4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Rml4ZWRXaWR0aCA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLkNvbHVtbldpZHRoICogZml4ZWRNdWx0aXBsZVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IGxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpeGVkV2lkdGggKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGhTdHJpbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEZpeGVkV2lkdGggLSA0ICsgJ3B4JzsgLy8gLTQgZm9yIHRoZSByb3cgcGFkZGluZy5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZyA9IHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aFN0cmluZyA9XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Rml4ZWRXaWR0aCArICdweCc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdG90YWxDYWxjQ29sc1dpZHRoICs9IGN1cnJlbnRGaXhlZFdpZHRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKFxuICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICd3aWR0aCcsXG4gICAgICAgICAgICAgICAgdG90YWxDYWxjQ29sc1dpZHRoICsgc2VsZWN0aW9uQ2hlY2tCb3hXaWR0aCArICdweCdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRSZXNpemVEYXRhKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnN0YXJ0WCA9IDA7XG4gICAgICAgIHRoaXMuc3RhcnRXaWR0aCA9IDA7XG4gICAgICAgIHRoaXMudGFibGVTdGFydFdpZHRoID0gMDtcbiAgICAgICAgdGhpcy5wcmVzc2VkQ29sdW1uID0gJyc7XG4gICAgfVxuXG4gICAgb25MaXN0UmVzaXplU3RhcnQoZXZlbnQsIGNvbHVtbktleSk6IHZvaWQge1xuICAgICAgICB0aGlzLnByZXNzZWRDb2x1bW4gPSBjb2x1bW5LZXk7XG4gICAgICAgIHRoaXMuc3RhcnRYID0gZXZlbnQueDtcbiAgICAgICAgdGhpcy5zdGFydFdpZHRoID0gZXZlbnQudGFyZ2V0LmNsb3Nlc3QoJy5oZWFkZXItY29sdW1uJykub2Zmc2V0V2lkdGg7XG4gICAgICAgIC8vIFNldCB0aGUgdGFibGVTdGFydFdpZHRoIHRvIHRoZSBjb250YWluZXIgb2Zmc2V0V2lkdGhcbiAgICAgICAgdGhpcy50YWJsZVN0YXJ0V2lkdGggPSB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDsgLy8gdGhpcy5ub1ZpcnR1YWxTY3JvbGxDb250Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgfVxuXG4gICAgb25MaXN0UmVzaXplKGV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnByZXNzZWRDb2x1bW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGhUb0FkZCA9IHRoaXMubGF5b3V0U2VydmljZS5pc1J0bCgpXG4gICAgICAgICAgICAgICAgPyB0aGlzLnN0YXJ0WCAtIGV2ZW50LnhcbiAgICAgICAgICAgICAgICA6IGV2ZW50LnggLSB0aGlzLnN0YXJ0WDtcblxuICAgICAgICAgICAgLy8gU2V0IHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uIGFuZCB0aGUgY29udGFpbmVyIG9mIHRoZSB3aG9sZSBjb2x1bW5zLlxuICAgICAgICAgICAgaWYgKHRoaXMuc3RhcnRXaWR0aCArIHdpZHRoVG9BZGQgPj0gNDggfHwgd2lkdGhUb0FkZCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLnVpQ29udHJvbC5Db250cm9sRmllbGRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBsZXQgdG90YWxDYWxjQ29sc1dpZHRoID0gMDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdWlDb250cm9sRmllbGQ6IFVJQ29udHJvbEZpZWxkID0gdGhpcy51aUNvbnRyb2xcbiAgICAgICAgICAgICAgICAgICAgICAgIC5Db250cm9sRmllbGRzW2luZGV4XTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IGxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGMgdGhlIGxhc3QgY29sdW1uIG9ubHkgaW4gcGVyY2VudGFnZSB0eXBlLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzQ29sdW1uV2lkdGhPZlR5cGVQZXJjZW50YWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgPSB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGhTdHJpbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2FsYygxMDAlIC0gJyArIHRvdGFsQ2FsY0NvbHNXaWR0aCArICdweCknOyAvLyBGb3IgMTAwJVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodWlDb250cm9sRmllbGQuQXBpTmFtZSA9PT0gdGhpcy5wcmVzc2VkQ29sdW1uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0V2lkdGggKyB3aWR0aFRvQWRkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGggKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGhTdHJpbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoIC0gNCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHVpQ29udHJvbEZpZWxkLkFwaU5hbWUgPT09IHRoaXMucHJlc3NlZENvbHVtbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0V2lkdGggKyB3aWR0aFRvQWRkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdWlDb250cm9sRmllbGQuY2FsY1RpdGxlQ29sdW1uV2lkdGhTdHJpbmcgPSB1aUNvbnRyb2xGaWVsZC5jYWxjQ29sdW1uV2lkdGhTdHJpbmcgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpQ29udHJvbEZpZWxkLmNhbGNDb2x1bW5XaWR0aCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0b3RhbENhbGNDb2xzV2lkdGggKz0gdWlDb250cm9sRmllbGQuY2FsY0NvbHVtbldpZHRoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYmxlU3RhcnRXaWR0aCArIHdpZHRoVG9BZGQgKyAncHgnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jaGVja0ZvckNoYW5nZXMgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBhcmVudChlbCwgcGFyZW50U2VsZWN0b3IpOiBhbnkge1xuICAgICAgICAvLyBJZiBubyBwYXJlbnRTZWxlY3RvciBkZWZpbmVkIHdpbGwgYnViYmxlIHVwIGFsbCB0aGUgd2F5IHRvICpkb2N1bWVudCpcbiAgICAgICAgaWYgKHBhcmVudFNlbGVjdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHBhcmVudFNlbGVjdG9yID0gZG9jdW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGFyZW50ID0gW107XG4gICAgICAgIGxldCBwID0gZWwucGFyZW50Tm9kZTtcblxuICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICBwICYmXG4gICAgICAgICAgICBwLmNsYXNzTmFtZSAhPT0gJycgJiZcbiAgICAgICAgICAgIHAuY2xhc3NOYW1lLmluZGV4T2YocGFyZW50U2VsZWN0b3IpID09PSAtMSAmJlxuICAgICAgICAgICAgcGFyZW50U2VsZWN0b3IgIT09IGRvY3VtZW50XG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgbyA9IHA7XG4gICAgICAgICAgICBwID0gby5wYXJlbnROb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwLmNsYXNzTmFtZS5pbmRleE9mKHBhcmVudFNlbGVjdG9yKSA+IC0xKSB7XG4gICAgICAgICAgICBwYXJlbnQucHVzaChwKTsgLy8gUHVzaCB0aGF0IHBhcmVudFNlbGVjdG9yIHlvdSB3YW50ZWQgdG8gc3RvcCBhdFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuXG4gICAgb25MaXN0UmVzaXplRW5kKGV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnByZXNzZWRDb2x1bW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGV2ZW50ICYmXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRQYXJlbnQoZXZlbnQuc3JjRWxlbWVudCwgJ3Jlc2l6ZS1ib3gnKS5sZW5ndGggPiAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRSZXNpemVEYXRhKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRSZXNpemVEYXRhKCk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkxpc3RIZWFkZXJNb3VzZUVudGVyKGV2ZW50KTogdm9pZCB7XG4gICAgICAgIC8vIHRoaXMuaGVhZGVySXNJbkZvY3VzID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBvbkxpc3RIZWFkZXJNb3VzZUxlYXZlKGV2ZW50KTogdm9pZCB7XG4gICAgICAgIC8vIHRoaXMuaGVhZGVySXNJbkZvY3VzID0gZmFsc2U7XG4gICAgICAgIHRoaXMub25MaXN0UmVzaXplRW5kKGV2ZW50KTtcbiAgICAgICAgdGhpcy5pbml0UmVzaXplRGF0YSgpO1xuICAgIH1cblxuICAgIG9uTGlzdENoYW5nZShldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVFdmVudHMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEZvciBvdGhlciBldmVudHMgZG8gbm90aGluZy5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGV2ZW50LnN0YXJ0ID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICAgICAgdHlwZW9mIGV2ZW50LmVuZCA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNhbGN1bGF0ZWRPYmplY3RIZWlnaHQgPSBldmVudC5jYWxjdWxhdGVkQ2hpbGRIZWlnaHQgKyAncHgnO1xuXG4gICAgICAgIGlmICghdGhpcy5sb2NrRXZlbnRzKSB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZUl0ZW1zKGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlU2Nyb2xsSXRlbXMoZXZlbnQuc3RhcnQsIGV2ZW50LmVuZCwgZmFsc2UpO1xuICAgICAgICAgICAgdGhpcy50b2dnbGVJdGVtcyh0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFBhcmVudENvbnRhaW5lcigpOiBFbGVtZW50IHwgV2luZG93IHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50U2Nyb2xsID8gdGhpcy5wYXJlbnRTY3JvbGwgOiB3aW5kb3c7XG4gICAgfVxuXG4gICAgb25WYWx1ZUNoYW5nZWQodmFsdWVDaGFuZ2U6IElQZXBGb3JtRmllbGRWYWx1ZUNoYW5nZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWVDaGFuZ2UpO1xuICAgIH1cblxuICAgIG9uQ3VzdG9taXplRmllbGRDbGljayhcbiAgICAgICAgY3VzdG9taXplRmllbGRDbGlja2VkRGF0YTogSVBlcEZvcm1GaWVsZENsaWNrRXZlbnRcbiAgICApOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZmllbGRDbGljay5lbWl0KGN1c3RvbWl6ZUZpZWxkQ2xpY2tlZERhdGEpO1xuICAgIH1cblxuICAgIGdldElzRGlzYWJsZWQoaXRlbTogT2JqZWN0c0RhdGFSb3cpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZVNlbGVjdGlvbkl0ZW1zKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IElzTm90U2VsZWN0YWJsZUZvckFjdGlvbnMgPVxuICAgICAgICAgICAgICAgIGl0ZW0gJiYgIWl0ZW0uSXNTZWxlY3RhYmxlRm9yQWN0aW9ucztcbiAgICAgICAgICAgIHJldHVybiBJc05vdFNlbGVjdGFibGVGb3JBY3Rpb25zO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0SXNJdGVtU2VsZWN0ZWQoaXRlbUlkOiBzdHJpbmcsIGl0ZW1UeXBlID0gJycpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGlzU2VsZWN0ZWQgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCB1bmlxSXRlbUlkID0gdGhpcy5nZXRVbmlxSXRlbUlkKGl0ZW1JZCwgaXRlbVR5cGUpO1xuICAgICAgICBpc1NlbGVjdGVkID0gdW5pcUl0ZW1JZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZW1JZDtcblxuICAgICAgICByZXR1cm4gaXNTZWxlY3RlZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldEl0ZW1DbGlja2VkKFxuICAgICAgICBpdGVtSWQsXG4gICAgICAgIGlzU2VsZWN0YWJsZUZvckFjdGlvbnM6IGJvb2xlYW4sXG4gICAgICAgIGl0ZW1UeXBlOiBzdHJpbmcsXG4gICAgICAgIGlzQ2hlY2tlZDogYm9vbGVhblxuICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCB1bmlxSXRlbUlkID0gdGhpcy5nZXRVbmlxSXRlbUlkKGl0ZW1JZCwgaXRlbVR5cGUpO1xuXG4gICAgICAgIC8vIHNlbGVjdCB0aGUgc2VsZWN0ZWQgaXRlbS5cbiAgICAgICAgaWYgKGlzQ2hlY2tlZCkge1xuICAgICAgICAgICAgLy8gU2V0IHNlbGV0ZWQgaXRlbVxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JZCA9IHVuaXFJdGVtSWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZEl0ZW1JZCA9PT0gdW5pcUl0ZW1JZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtSWQgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGl0ZW1DbGlja2VkKGU6IGFueSwgaXRlbTogT2JqZWN0c0RhdGFSb3cpOiB2b2lkIHtcbiAgICAgICAgLy8gU2V0IHNlbGV0ZWQgaXRlbVxuICAgICAgICBjb25zdCBpdGVtSWQgPSBpdGVtLlVJRC50b1N0cmluZygpO1xuICAgICAgICBjb25zdCBpdGVtVHlwZSA9IGl0ZW0uVHlwZS50b1N0cmluZygpO1xuICAgICAgICBsZXQgaXNDaGVja2VkID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5Jc1NlbGVjdGFibGVGb3JBY3Rpb25zKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbUlkID0gdGhpcy5nZXRVbmlxSXRlbUlkKGl0ZW1JZCwgaXRlbVR5cGUpO1xuICAgICAgICAgICAgaXNDaGVja2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0SXRlbUNsaWNrZWQoXG4gICAgICAgICAgICAgICAgaXRlbUlkLFxuICAgICAgICAgICAgICAgIGl0ZW0uSXNTZWxlY3RhYmxlRm9yQWN0aW9ucyxcbiAgICAgICAgICAgICAgICBpdGVtVHlwZSxcbiAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGlzLml0ZW1DbGljay5lbWl0KHsgc291cmNlOiBpdGVtLCB2aWV3VHlwZTogdGhpcy52aWV3VHlwZSB9KTtcbiAgICB9XG5cbiAgICBvblRhYmxlUm93TW91c2VFbnRlcihldmVudDogYW55LCBpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGV2aWNlSGFzTW91c2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaXFJdGVtSWQgPSB0aGlzLmdldFVuaXFJdGVtSWQoaXRlbUlkLCBpdGVtVHlwZSk7XG4gICAgICAgIHRoaXMuaG92ZXJlZEl0ZW1JZCA9IHVuaXFJdGVtSWQ7XG4gICAgfVxuXG4gICAgb25UYWJsZVJvd01vdXNlTGVhdmUoZXZlbnQ6IGFueSwgaXRlbUlkOiBzdHJpbmcsIGl0ZW1UeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5ob3ZlcmVkSXRlbUlkID0gJyc7XG4gICAgfVxuXG4gICAgb25DYXJkTW91c2VFbnRlcihldmVudDogYW55LCBpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGV2aWNlSGFzTW91c2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHVuaXFJdGVtSWQgPSB0aGlzLmdldFVuaXFJdGVtSWQoaXRlbUlkLCBpdGVtVHlwZSk7XG4gICAgICAgIHRoaXMuaG92ZXJlZEl0ZW1JZCA9IHVuaXFJdGVtSWQ7XG4gICAgfVxuXG4gICAgb25DYXJkTW91c2VMZWF2ZShldmVudDogYW55LCBpdGVtSWQ6IHN0cmluZywgaXRlbVR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLmhvdmVyZWRJdGVtSWQgPSAnJztcbiAgICB9XG5cbiAgICAvLyBjYWxsIHRoaXMgZnVuY3Rpb24gYWZ0ZXIgcmVzaXplICsgYW5pbWF0aW9uIGVuZFxuICAgIHdpblJlc2l6ZShlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSAwO1xuICAgICAgICB0aGlzLnNldExheW91dCgpO1xuICAgIH1cblxuICAgIHRyYWNrQnlGdW5jKGluZGV4OiBudW1iZXIsIGl0ZW06IE9iamVjdHNEYXRhUm93KTogYW55IHtcbiAgICAgICAgcmV0dXJuIGl0ZW0gJiYgaXRlbS5VSUQgPyBpdGVtLlVJRCA6IGluZGV4O1xuICAgIH1cblxuICAgIGNsZWFuSXRlbXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXRlbXNDb3VudGVyID0gMDtcbiAgICAgICAgdGhpcy5faXRlbXMgPVxuICAgICAgICAgICAgdGhpcy50b3RhbFJvd3MgPiAwID8gQXJyYXk8T2JqZWN0c0RhdGFSb3c+KHRoaXMudG90YWxSb3dzKSA6IFtdO1xuICAgICAgICB0aGlzLnNjcm9sbEl0ZW1zID0gW107XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlZE9iamVjdEhlaWdodCA9ICcnO1xuICAgIH1cblxuICAgIGdldFVJQ29udHJvbCgpOiBVSUNvbnRyb2wge1xuICAgICAgICByZXR1cm4gdGhpcy51aUNvbnRyb2w7XG4gICAgfVxuXG4gICAgaW5pdExpc3REYXRhKFxuICAgICAgICB1aUNvbnRyb2w6IFVJQ29udHJvbCxcbiAgICAgICAgdG90YWxSb3dzOiBudW1iZXIsXG4gICAgICAgIGl0ZW1zOiBPYmplY3RzRGF0YVJvd1tdLFxuICAgICAgICB2aWV3VHlwZTogUGVwTGlzdFZpZXdUeXBlID0gJ3RhYmxlJyxcbiAgICAgICAgaXRlbUNsYXNzID0gJydcbiAgICApOiB2b2lkIHtcbiAgICAgICAgdGhpcy52aWV3VHlwZSA9IHZpZXdUeXBlO1xuICAgICAgICB0aGlzLmlzVGFibGUgPSB2aWV3VHlwZSA9PT0gJ3RhYmxlJztcbiAgICAgICAgLy8gdGhpcy5pc0NhcmRWaWV3ID0gdmlld1R5cGUgPT09ICdjYXJkcyc7XG4gICAgICAgIHRoaXMudWlDb250cm9sID0gdWlDb250cm9sO1xuICAgICAgICB0aGlzLml0ZW1DbGFzcyA9IGl0ZW1DbGFzcztcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1JZCA9ICcnO1xuICAgICAgICB0aGlzLnRvdGFsUm93cyA9IHRvdGFsUm93cztcblxuICAgICAgICAvLyBmaXggYnVnIGZvciB0aGUgc2Nyb2xsVG8gdGhhdCBkb2Vzbid0IHdvcmsgb24gZWRnZSBkaXYgLCBub3Qgd2luZG93XG4gICAgICAgIC8vIGNvbnN0IHNjcm9sbGluZ0VsZW1lbnQgPSB0aGlzLmdldFBhcmVudENvbnRhaW5lcigpO1xuICAgICAgICAvLyBzY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvKDAsIDApO1xuXG4gICAgICAgIHRoaXMuY2xlYW5JdGVtcygpO1xuXG4gICAgICAgIHRoaXMudXBkYXRlSXRlbXMoaXRlbXMpO1xuXG4gICAgICAgIHRoaXMuc2V0TGF5b3V0KCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVJdGVtcyhpdGVtczogT2JqZWN0c0RhdGFSb3dbXSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNjcm9sbEl0ZW1zID0gdGhpcy5faXRlbXMgPSBpdGVtcztcbiAgICAgICAgdGhpcy5pdGVtc0NvdW50ZXIgPSBpdGVtcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgdXBkYXRlSXRlbShkYXRhOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcblxuICAgICAgICAvLyBVcGRhdGUgaXRlbXMgbGlzdFxuICAgICAgICBpbmRleCA9IHRoaXMuaXRlbXMuZmluZEluZGV4KChpKSA9PiBpICYmIGkuVUlEID09PSBkYXRhLlVJRCk7XG4gICAgICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgdGhpcy5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXNbaW5kZXhdID0gZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGxJdGVtcyBsaXN0XG4gICAgICAgIGluZGV4ID0gdGhpcy5zY3JvbGxJdGVtcy5maW5kSW5kZXgoKGkpID0+IGkgJiYgaS5VSUQgPT09IGRhdGEuVUlEKTtcblxuICAgICAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHRoaXMuc2Nyb2xsSXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbEl0ZW1zW2luZGV4XSA9IGRhdGE7XG4gICAgICAgICAgICB0aGlzLmNoZWNrRm9yQ2hhbmdlcyA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0SXNJdGVtRWRpdGFibGUodWlkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbXMuZmlsdGVyKCh4KSA9PiB4LlVJRC50b1N0cmluZygpID09PSB1aWQpO1xuICAgICAgICBpZiAoaXRlbS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gaXRlbVswXS5Jc0VkaXRhYmxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0SXRlbURhdGFCeUlEKHVpZDogc3RyaW5nKTogT2JqZWN0c0RhdGFSb3cge1xuICAgICAgICByZXR1cm4gdGhpcy5pdGVtcy5maW5kKChpdGVtKSA9PiBpdGVtLlVJRC50b1N0cmluZygpID09PSB1aWQpO1xuICAgIH1cbn1cbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJ0b3RhbFJvd3MgPT0gMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJwZXAtYm9yZGVyLWJvdHRvbVwiPlxuICAgICAgICA8cCBjbGFzcz1cInRpdGxlLXhsIG5vLWRhdGFcIj5cbiAgICAgICAgICAgIHt7IChub0RhdGFGb3VuZE1zZyA/IG5vRGF0YUZvdW5kTXNnIDogJ0xJU1QuTk9fREFUQV9GT1VORCcpIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgPC9wPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJuby1kYXRhLXN1Z2dlc3Rpb25zXCI+XG4gICAgICAgIDxwIGNsYXNzPVwic3VnZ2VzdGlvbnMtdGl0bGUgdGl0bGUtbGdcIj5cbiAgICAgICAgICAgIHt7ICdMSVNULk5PX0RBVEFfRk9VTkRfU1VHR0VTVElPTlNfVElUTEUnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgPC9wPlxuICAgICAgICA8dWwgY2xhc3M9XCJzdWdnZXN0aW9ucy1saXN0IGJvZHktbGdcIiBbaW5uZXJIdG1sXT1cIidMSVNULk5PX0RBVEFfRk9VTkRfU1VHR0VTVElPTlNfTElTVCcgfCB0cmFuc2xhdGVcIj48L3VsPlxuICAgIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG48bmctY29udGFpbmVyICpuZ0lmPVwidG90YWxSb3dzID4gMFwiPlxuICAgIDxkaXYgKm5nSWY9XCJpc1RhYmxlXCIgI3RhYmxlSGVhZGVyIGNsYXNzPVwidGFibGUtaGVhZGVyXCIgKG1vdXNldXApPVwib25MaXN0UmVzaXplRW5kKCRldmVudClcIlxuICAgICAgICAobW91c2VlbnRlcik9XCJvbkxpc3RIZWFkZXJNb3VzZUVudGVyKCRldmVudClcIiAobW91c2VsZWF2ZSk9XCJvbkxpc3RIZWFkZXJNb3VzZUxlYXZlKCRldmVudClcIlxuICAgICAgICAobW91c2Vtb3ZlKT1cIm9uTGlzdFJlc2l6ZSgkZXZlbnQpXCI+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLWhlYWRlci1wYWRkaW5nLXRvcFwiPjwvZGl2PlxuICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJ0YWJsZS1oZWFkZXItZmllbGRzZXRcIj5cbiAgICAgICAgICAgIDxmaWVsZHNldD5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBmaWVsZCBvZiB1aUNvbnRyb2w/LkNvbnRyb2xGaWVsZHM7IGxldCBqID0gaW5kZXhcIiBjbGFzcz1cImhlYWRlci1jb2x1bW4gcHVsbC1sZWZ0IGZsaXBcIlxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiBmaWVsZC5jYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZyB9XCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpcy1yZXNpemluZyc6IGZpZWxkLkFwaU5hbWUgPT09IHByZXNzZWRDb2x1bW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2lzLWZpcnN0JzogaiA9PT0gMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXMtbGFzdCc6IGogPT09IHVpQ29udHJvbD8uQ29udHJvbEZpZWxkcz8ubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgKm5nSWY9XCJmaWVsZC5UaXRsZSAhPSAnJ1wiIGlkPVwie3sgZmllbGQuQXBpTmFtZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImhlYWRlci1sYWJlbCBib2R5LXNtIHB1bGwtbGVmdCBmbGlwIHRleHQtYWxpZ24te3sgZmllbGQuTGF5b3V0LlhBbGlnbm1lbnQgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyBmaWVsZC5UaXRsZSB9fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgZmllbGQuVGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsICpuZ0lmPVwiZmllbGQuVGl0bGUgPT0gJydcIiBpZD1cInt7IGZpZWxkLkFwaU5hbWUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJoZWFkZXItbGFiZWwgYm9keS1zbSBwdWxsLWxlZnQgZmxpcFwiPiZuYnNwOzwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInN1cHBvcnRSZXNpemluZ1wiIGNsYXNzPVwicmVzaXplLWJveCBwdWxsLXJpZ2h0IGZsaXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG1vdXNlZG93bik9XCJvbkxpc3RSZXNpemVTdGFydCgkZXZlbnQsIGZpZWxkLkFwaU5hbWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3BsaXR0ZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICA8L2ZpZWxkc2V0PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiAjbm9WaXJ0dWFsU2Nyb2xsQ29udCBbbmdDbGFzc109XCJ7ICd0YWJsZS1ib2R5JzogaXNUYWJsZSwgJ2NhcmRzLWJvZHknOiAhaXNUYWJsZSB9XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaXN0RGF0YVwiPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsaXN0VG90YWxzXCI+PC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPG5nLXRlbXBsYXRlICNsaXN0RGF0YT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNjcm9sbEl0ZW1zOyBsZXQgaSA9IGluZGV4OyBsZXQgaXNGaXJzdCA9IGZpcnN0OyB0cmFja0J5OiB0cmFja0J5RnVuY1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNUYWJsZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRhYmxlLXJvd1wiIChtb3VzZWVudGVyKT1cIm9uVGFibGVSb3dNb3VzZUVudGVyKCRldmVudCwgaXRlbT8uVUlELCBpdGVtPy5UeXBlKVwiXG4gICAgICAgICAgICAgICAgKG1vdXNlbGVhdmUpPVwib25UYWJsZVJvd01vdXNlTGVhdmUoJGV2ZW50LCBpdGVtPy5VSUQsIGl0ZW0/LlR5cGUpXCIgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGdldElzSXRlbVNlbGVjdGVkKGl0ZW0/LlVJRCwgaXRlbT8uVHlwZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRlZDogaXRlbT8uVUlEICsgU0VQQVJBVE9SICsgaXRlbT8uVHlwZSA9PT0gc2VsZWN0ZWRJdGVtSWRcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBoZWlnaHQ6IGNhbGN1bGF0ZWRPYmplY3RIZWlnaHQsIHZpc2liaWxpdHk6IHNob3dJdGVtcyB8fCBpdGVtID8gJ3Zpc2libGUnIDogJ2hpZGRlbicgfVwiPlxuICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz1cInRhYmxlLXJvdy1maWVsZHNldFwiIFtuZ1N0eWxlXT1cInsgJ2JhY2tncm91bmQtY29sb3InOiBpdGVtPy5CYWNrZ3JvdW5kQ29sb3IgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIFtjYW5FZGl0T2JqZWN0XT1cIiFkaXNhYmxlZCAmJiBpdGVtPy5Jc0VkaXRhYmxlXCIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxwZXAtaW50ZXJuYWwtZm9ybSBbY2hlY2tGb3JDaGFuZ2VzXT1cImNoZWNrRm9yQ2hhbmdlc1wiIFtsYXlvdXRdPVwidWlDb250cm9sXCIgW2RhdGFdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2FuRWRpdE9iamVjdF09XCIhZGlzYWJsZWRcIiBbb2JqZWN0SWRdPVwib2JqZWN0SWRcIiBbcGFyZW50SWRdPVwicGFyZW50SWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaENvZGVdPVwic2VhcmNoQ29kZVwiIFtsb2NrRXZlbnRzXT1cImRpc2FibGVTZWxlY3Rpb25JdGVtc1wiIFtsYXlvdXRUeXBlXT1cIid0YWJsZSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzQWN0aXZlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRlbT8uVUlEICsgU0VQQVJBVE9SICsgaXRlbT8uVHlwZSA9PT0gc2VsZWN0ZWRJdGVtSWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbT8uVUlEICsgU0VQQVJBVE9SICsgaXRlbT8uVHlwZSA9PT0gaG92ZXJlZEl0ZW1JZCkgJiYgZGV2aWNlSGFzTW91c2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiAodmFsdWVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIChmaWVsZENsaWNrKT1cIm9uQ3VzdG9taXplRmllbGRDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJpdGVtQ2xpY2tlZCgkZXZlbnQsIGl0ZW0pXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvcGVwLWludGVybmFsLWZvcm0+XG4gICAgICAgICAgICAgICAgPC9maWVsZHNldD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzVGFibGVcIj5cbiAgICAgICAgICAgIDxkaXYgW2NsYXNzXT1cIml0ZW1DbGFzc1wiIChtb3VzZWVudGVyKT1cIm9uQ2FyZE1vdXNlRW50ZXIoJGV2ZW50LCBpdGVtPy5VSUQsIGl0ZW0/LlR5cGUpXCJcbiAgICAgICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJvbkNhcmRNb3VzZUxlYXZlKCRldmVudCwgaXRlbT8uVUlELCBpdGVtPy5UeXBlKVwiIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBnZXRJc0l0ZW1TZWxlY3RlZChpdGVtPy5VSUQsIGl0ZW0/LlR5cGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGxpZ2h0ZWQ6IGl0ZW0/LlVJRCArIFNFUEFSQVRPUiArIGl0ZW0/LlR5cGUgPT09IHNlbGVjdGVkSXRlbUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2NhcmQtdmlldyc6IHZpZXdUeXBlID09PSAnY2FyZHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmUtdmlldyc6IHZpZXdUeXBlID09PSAnbGluZXMnXG4gICAgICAgICAgICAgICAgICAgIH1cIiBjbGFzcz1cInB1bGwtbGVmdCBmbGlwXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IGhlaWdodDogY2FsY3VsYXRlZE9iamVjdEhlaWdodCwgdmlzaWJpbGl0eTogc2hvd0l0ZW1zIHx8IGl0ZW0gPyAndmlzaWJsZScgOiAnaGlkZGVuJyB9XCI+XG4gICAgICAgICAgICAgICAgPCEtLSBbY2FuRWRpdE9iamVjdF09XCIhZGlzYWJsZWQgJiYgaXRlbT8uSXNFZGl0YWJsZVwiIC0tPlxuICAgICAgICAgICAgICAgIDxwZXAtaW50ZXJuYWwtZm9ybSBbY2hlY2tGb3JDaGFuZ2VzXT1cImNoZWNrRm9yQ2hhbmdlc1wiIFtsYXlvdXRdPVwidWlDb250cm9sXCIgW2RhdGFdPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIFtjYW5FZGl0T2JqZWN0XT1cIiFkaXNhYmxlZFwiIFtvYmplY3RJZF09XCIgb2JqZWN0SWRcIiBbcGFyZW50SWRdPVwicGFyZW50SWRcIiBbc2VhcmNoQ29kZV09XCJzZWFyY2hDb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgW2xvY2tFdmVudHNdPVwiZGlzYWJsZVNlbGVjdGlvbkl0ZW1zXCIgW2xheW91dFR5cGVdPVwiJ2NhcmQnXCIgW2lzQWN0aXZlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtPy5VSUQgKyBTRVBBUkFUT1IgKyBpdGVtPy5UeXBlID09PSBzZWxlY3RlZEl0ZW1JZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0/LlVJRCArIFNFUEFSQVRPUiArIGl0ZW0/LlR5cGUgPT09IGhvdmVyZWRJdGVtSWQpICYmIGRldmljZUhhc01vdXNlXG4gICAgICAgICAgICAgICAgICAgICAgICBcIiAodmFsdWVDaGFuZ2UpPVwib25WYWx1ZUNoYW5nZWQoJGV2ZW50KVwiIChmaWVsZENsaWNrKT1cIm9uQ3VzdG9taXplRmllbGRDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIml0ZW1DbGlja2VkKCRldmVudCwgaXRlbSlcIj5cbiAgICAgICAgICAgICAgICA8L3BlcC1pbnRlcm5hbC1mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvbmctY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsaXN0VG90YWxzPlxuICAgIDxkaXYgKm5nSWY9XCJ0b3RhbHNSb3c/Lmxlbmd0aCA+IDAgJiYgdG90YWxzUm93Lmxlbmd0aCA8PSB1aUNvbnRyb2w/LkNvbnRyb2xGaWVsZHMubGVuZ3RoXCIgY2xhc3M9XCJ0YWJsZS10b3RhbFwiPlxuICAgICAgICA8ZmllbGRzZXQgY2xhc3M9XCJ0YWJsZS1oZWFkZXItZmllbGRzZXRcIj5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZpZWxkIG9mIHVpQ29udHJvbD8uQ29udHJvbEZpZWxkczsgbGV0IGogPSBpbmRleFwiIGNsYXNzPVwidG90YWwtY29sdW1uIHB1bGwtbGVmdCBmbGlwXCJcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiBmaWVsZC5jYWxjVGl0bGVDb2x1bW5XaWR0aFN0cmluZyB9XCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwidG90YWwtbGFiZWwgYm9keS1zbSB0ZXh0LWFsaWduLXt7IGZpZWxkLkxheW91dC5YQWxpZ25tZW50IH19XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IHRvdGFsc1Jvd1tqXSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9maWVsZHNldD5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19
|