@dropi/ui-components 1.0.12 → 1.0.13
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/README.md +55 -36
- package/dist/README.md +58 -38
- package/dist/components-source/accordion/accordion-item/accordion-item.component.d.ts +31 -0
- package/dist/components-source/accordion/accordion.component.d.ts +26 -0
- package/dist/components-source/alert/alert.component.d.ts +32 -0
- package/dist/components-source/alert-modal/alert-modal.component.d.ts +78 -0
- package/dist/components-source/alert-validation/alert-validation.component.d.ts +21 -0
- package/dist/components-source/badge/badge.component.d.ts +12 -0
- package/dist/components-source/beta-tag/beta-tag.component.d.ts +5 -0
- package/dist/components-source/breadcrumb/breadcrumb.component.d.ts +11 -0
- package/dist/components-source/card-product/card-product.component.d.ts +204 -0
- package/dist/components-source/card-section/card-section.component.d.ts +31 -0
- package/dist/components-source/checkbox-selection-list/checkbox-selection-list.component.d.ts +26 -0
- package/dist/components-source/city-selector/city-selector.component.d.ts +17 -0
- package/dist/components-source/color-picker/color-picker.component.d.ts +73 -0
- package/dist/components-source/confirm-dialog/confirm-dialog.component.d.ts +10 -0
- package/dist/components-source/country-flags/country-flags.component.d.ts +12 -0
- package/dist/components-source/date-picker/date-picker.component.d.ts +27 -0
- package/dist/components-source/date-picker-range/date-picker-range.component.d.ts +26 -0
- package/dist/components-source/dropi-avatars/dropi-avatars.component.d.ts +11 -0
- package/dist/components-source/dropi-badge/dropi-badge.component.d.ts +29 -0
- package/dist/components-source/dropi-banner-external/dropi-banner-external.component.d.ts +19 -0
- package/dist/components-source/dropi-breadcrumb/dropi-breadcrumb.component.d.ts +22 -0
- package/dist/components-source/dropi-card-checkbox/dropi-card-checkbox.component.d.ts +20 -0
- package/dist/components-source/dropi-carousel/dropi-carousel.component.d.ts +52 -0
- package/dist/components-source/dropi-checkbox/dropi-checkbox.component.d.ts +11 -0
- package/dist/components-source/dropi-chips/dropi-chips.component.d.ts +17 -0
- package/dist/components-source/dropi-country-selector/countries.data.d.ts +6 -0
- package/dist/components-source/dropi-country-selector/dropi-country-selector.component.d.ts +90 -0
- package/dist/components-source/dropi-drawer/dropi-drawer.component.d.ts +20 -0
- package/dist/components-source/dropi-dropdown/dropi-dropdown.component.d.ts +20 -0
- package/dist/components-source/dropi-favorite-button/dropi-favorite-button.component.d.ts +12 -0
- package/dist/components-source/dropi-file-upload/card-view/card-view.component.d.ts +19 -0
- package/dist/components-source/dropi-file-upload/drop-zone/drop-zone.component.d.ts +38 -0
- package/dist/components-source/dropi-file-upload/dropi-file-upload.component.d.ts +18 -0
- package/dist/components-source/dropi-file-upload/file-list/file-list.component.d.ts +39 -0
- package/dist/components-source/dropi-file-upload/grid-view/grid-view.component.d.ts +15 -0
- package/dist/components-source/dropi-ilustration-icon/dropi-ilustration-icon.component.d.ts +20 -0
- package/dist/components-source/dropi-image-overlay/dropi-image-overlay.component.d.ts +8 -0
- package/dist/components-source/dropi-languages-selector/dropi-languages-selector.component.d.ts +18 -0
- package/dist/components-source/dropi-logo/dropi-logo.component.d.ts +12 -0
- package/dist/components-source/dropi-modal/dropi-modal.component.d.ts +34 -0
- package/dist/components-source/dropi-modal/p-template.directive.d.ts +9 -0
- package/dist/components-source/dropi-navbar/dropi-navbar.component.d.ts +20 -0
- package/dist/components-source/dropi-paginator/dropi-paginator.component.d.ts +21 -0
- package/dist/components-source/dropi-phone-input/dropi-phone-input.component.d.ts +55 -0
- package/dist/components-source/dropi-radio-button/dropi-radio-button.component.d.ts +17 -0
- package/dist/components-source/dropi-search/dropi-search.component.d.ts +40 -0
- package/dist/components-source/dropi-select/dropi-select.component.d.ts +34 -0
- package/dist/components-source/dropi-skeleton/dropi-skeleton.component.d.ts +14 -0
- package/dist/components-source/dropi-steps/dropi-steps.component.d.ts +64 -0
- package/dist/components-source/dropi-switch/dropi-switch.component.d.ts +11 -0
- package/dist/components-source/dropi-table/dropi-table.component.d.ts +82 -0
- package/dist/components-source/dropi-tag/dropi-tag.component.d.ts +15 -0
- package/dist/components-source/dropi-text-area/dropi-text-area.component.d.ts +14 -0
- package/dist/components-source/dropi-tooltip/dropi-tooltip.component.d.ts +28 -0
- package/dist/components-source/dropi-youtube-lazy-video/dropi-youtube-lazy-video.component.d.ts +16 -0
- package/dist/components-source/empty/empty.component.d.ts +9 -0
- package/dist/components-source/empty-state/empty-state.component.d.ts +17 -0
- package/dist/components-source/file-upload-progress-bar/file-upload-progress-bar.component.d.ts +30 -0
- package/dist/components-source/index.d.ts +85 -0
- package/dist/components-source/input/input.component.d.ts +33 -0
- package/dist/components-source/lottie-loader/lottie-loader.component.d.ts +9 -0
- package/dist/components-source/otp-send-code/otp-send-code.component.d.ts +83 -0
- package/dist/components-source/radio-selection-list/radio-selection-list.component.d.ts +30 -0
- package/dist/components-source/read-more/read-more.component.d.ts +60 -0
- package/dist/components-source/sidebar/sidebar.component.d.ts +27 -0
- package/dist/components-source/simple-stepper/simple-stepper.component.d.ts +21 -0
- package/dist/components-source/spinner/spinner.component.d.ts +9 -0
- package/dist/components-source/tabs/tabs.component.d.ts +27 -0
- package/dist/components-source/tag-type-product/tag-type-product.component.d.ts +5 -0
- package/dist/components-source/toast/toast.component.d.ts +21 -0
- package/dist/components-source/toggle/input-toggle.component.d.ts +11 -0
- package/dist/components-source/tooltip/tooltip.component.d.ts +15 -0
- package/dist/components-source/vertical-steps/vertical-steps.component.d.ts +27 -0
- package/dist/esm2022/components-source/accordion/accordion-item/accordion-item.component.mjs +51 -0
- package/dist/esm2022/components-source/accordion/accordion.component.mjs +46 -0
- package/dist/esm2022/components-source/alert/alert.component.mjs +114 -0
- package/dist/esm2022/components-source/alert-modal/alert-modal.component.mjs +247 -0
- package/dist/esm2022/components-source/alert-validation/alert-validation.component.mjs +53 -0
- package/dist/esm2022/components-source/badge/badge.component.mjs +23 -0
- package/dist/esm2022/components-source/beta-tag/beta-tag.component.mjs +11 -0
- package/dist/esm2022/components-source/breadcrumb/breadcrumb.component.mjs +26 -0
- package/dist/esm2022/components-source/card-product/card-product.component.mjs +534 -0
- package/dist/esm2022/components-source/card-section/card-section.component.mjs +91 -0
- package/dist/esm2022/components-source/checkbox-selection-list/checkbox-selection-list.component.mjs +79 -0
- package/dist/esm2022/components-source/city-selector/city-selector.component.mjs +53 -0
- package/dist/esm2022/components-source/color-picker/color-picker.component.mjs +320 -0
- package/dist/esm2022/components-source/confirm-dialog/confirm-dialog.component.mjs +27 -0
- package/dist/esm2022/components-source/country-flags/country-flags.component.mjs +27 -0
- package/dist/esm2022/components-source/date-picker/date-picker.component.mjs +73 -0
- package/dist/esm2022/components-source/date-picker-range/date-picker-range.component.mjs +67 -0
- package/dist/esm2022/components-source/dropi-avatars/dropi-avatars.component.mjs +31 -0
- package/dist/esm2022/components-source/dropi-badge/dropi-badge.component.mjs +45 -0
- package/dist/esm2022/components-source/dropi-banner-external/dropi-banner-external.component.mjs +39 -0
- package/dist/esm2022/components-source/dropi-breadcrumb/dropi-breadcrumb.component.mjs +45 -0
- package/dist/esm2022/components-source/dropi-card-checkbox/dropi-card-checkbox.component.mjs +53 -0
- package/dist/esm2022/components-source/dropi-carousel/dropi-carousel.component.mjs +243 -0
- package/dist/esm2022/components-source/dropi-checkbox/dropi-checkbox.component.mjs +31 -0
- package/dist/esm2022/components-source/dropi-chips/dropi-chips.component.mjs +38 -0
- package/dist/esm2022/components-source/dropi-country-selector/countries.data.mjs +254 -0
- package/dist/esm2022/components-source/dropi-country-selector/dropi-country-selector.component.mjs +183 -0
- package/dist/esm2022/components-source/dropi-drawer/dropi-drawer.component.mjs +69 -0
- package/dist/esm2022/components-source/dropi-dropdown/dropi-dropdown.component.mjs +59 -0
- package/dist/esm2022/components-source/dropi-favorite-button/dropi-favorite-button.component.mjs +33 -0
- package/dist/esm2022/components-source/dropi-file-upload/card-view/card-view.component.mjs +47 -0
- package/dist/esm2022/components-source/dropi-file-upload/drop-zone/drop-zone.component.mjs +115 -0
- package/dist/esm2022/components-source/dropi-file-upload/dropi-file-upload.component.mjs +66 -0
- package/dist/esm2022/components-source/dropi-file-upload/file-list/file-list.component.mjs +95 -0
- package/dist/esm2022/components-source/dropi-file-upload/grid-view/grid-view.component.mjs +37 -0
- package/dist/esm2022/components-source/dropi-ilustration-icon/dropi-ilustration-icon.component.mjs +59 -0
- package/dist/esm2022/components-source/dropi-image-overlay/dropi-image-overlay.component.mjs +31 -0
- package/dist/esm2022/components-source/dropi-languages-selector/dropi-languages-selector.component.mjs +38 -0
- package/dist/esm2022/components-source/dropi-logo/dropi-logo.component.mjs +27 -0
- package/dist/esm2022/components-source/dropi-modal/dropi-modal.component.mjs +92 -0
- package/dist/esm2022/components-source/dropi-modal/p-template.directive.mjs +22 -0
- package/dist/esm2022/components-source/dropi-navbar/dropi-navbar.component.mjs +51 -0
- package/dist/esm2022/components-source/dropi-paginator/dropi-paginator.component.mjs +89 -0
- package/dist/esm2022/components-source/dropi-phone-input/dropi-phone-input.component.mjs +155 -0
- package/dist/esm2022/components-source/dropi-radio-button/dropi-radio-button.component.mjs +48 -0
- package/dist/esm2022/components-source/dropi-search/dropi-search.component.mjs +104 -0
- package/dist/esm2022/components-source/dropi-select/dropi-select.component.mjs +96 -0
- package/dist/esm2022/components-source/dropi-skeleton/dropi-skeleton.component.mjs +39 -0
- package/dist/esm2022/components-source/dropi-steps/dropi-steps.component.mjs +97 -0
- package/dist/esm2022/components-source/dropi-switch/dropi-switch.component.mjs +22 -0
- package/dist/esm2022/components-source/dropi-table/dropi-table.component.mjs +333 -0
- package/dist/esm2022/components-source/dropi-tag/dropi-tag.component.mjs +36 -0
- package/dist/esm2022/components-source/dropi-text-area/dropi-text-area.component.mjs +53 -0
- package/dist/esm2022/components-source/dropi-tooltip/dropi-tooltip.component.mjs +78 -0
- package/dist/esm2022/components-source/dropi-youtube-lazy-video/dropi-youtube-lazy-video.component.mjs +46 -0
- package/dist/esm2022/components-source/empty/empty.component.mjs +18 -0
- package/dist/esm2022/components-source/empty-state/empty-state.component.mjs +62 -0
- package/dist/esm2022/components-source/file-upload-progress-bar/file-upload-progress-bar.component.mjs +91 -0
- package/dist/esm2022/components-source/index.mjs +107 -0
- package/dist/esm2022/components-source/input/input.component.mjs +104 -0
- package/dist/esm2022/components-source/lottie-loader/lottie-loader.component.mjs +25 -0
- package/dist/esm2022/components-source/otp-send-code/otp-send-code.component.mjs +201 -0
- package/dist/esm2022/components-source/radio-selection-list/radio-selection-list.component.mjs +89 -0
- package/dist/esm2022/components-source/read-more/read-more.component.mjs +91 -0
- package/dist/esm2022/components-source/sidebar/sidebar.component.mjs +88 -0
- package/dist/esm2022/components-source/simple-stepper/simple-stepper.component.mjs +60 -0
- package/dist/esm2022/components-source/spinner/spinner.component.mjs +19 -0
- package/dist/esm2022/components-source/tabs/tabs.component.mjs +83 -0
- package/dist/esm2022/components-source/tag-type-product/tag-type-product.component.mjs +11 -0
- package/dist/esm2022/components-source/toast/toast.component.mjs +47 -0
- package/dist/esm2022/components-source/toggle/input-toggle.component.mjs +36 -0
- package/dist/esm2022/components-source/tooltip/tooltip.component.mjs +34 -0
- package/dist/esm2022/components-source/vertical-steps/vertical-steps.component.mjs +75 -0
- package/dist/esm2022/lib/elements-registry.mjs +343 -2
- package/dist/esm2022/utilities/interfaces/ui/dropi-table.interface.mjs +2 -0
- package/dist/esm2022/utilities/interfaces/ui/input-interface.mjs +2 -0
- package/dist/esm2022/utilities/interfaces/ui/select-interface.mjs +2 -0
- package/dist/esm2022/utilities/interfaces/ui/selection-list-interface.mjs +2 -0
- package/dist/esm2022/utilities/interfaces/ui/upload.model.mjs +5 -0
- package/dist/fesm2022/dropi-ui-components.mjs +5913 -2
- package/dist/fesm2022/dropi-ui-components.mjs.map +1 -1
- package/dist/utilities/interfaces/ui/dropi-table.interface.d.ts +45 -0
- package/dist/utilities/interfaces/ui/input-interface.d.ts +33 -0
- package/dist/utilities/interfaces/ui/select-interface.d.ts +8 -0
- package/dist/utilities/interfaces/ui/selection-list-interface.d.ts +24 -0
- package/dist/utilities/interfaces/ui/upload.model.d.ts +30 -0
- package/package.json +18 -6
- package/src/components-source/alert/alert.component.ts +12 -129
- package/src/components-source/alert-modal/alert-modal.component.ts +84 -114
- package/src/components-source/alert-validation/alert-validation.component.html +8 -0
- package/src/components-source/alert-validation/alert-validation.component.scss +225 -0
- package/src/components-source/alert-validation/alert-validation.component.ts +43 -0
- package/src/components-source/beta-tag/beta-tag.component.html +1 -0
- package/src/components-source/beta-tag/beta-tag.component.scss +26 -0
- package/src/components-source/beta-tag/beta-tag.component.ts +11 -0
- package/src/components-source/breadcrumb/breadcrumb.component.html +13 -5
- package/src/components-source/breadcrumb/breadcrumb.component.scss +8 -1
- package/src/components-source/breadcrumb/breadcrumb.component.spec.ts +26 -26
- package/src/components-source/breadcrumb/breadcrumb.component.ts +10 -12
- package/src/components-source/card-product/card-product.component.spec.ts +9 -9
- package/src/components-source/card-product/card-product.component.stories.ts +2 -2
- package/src/components-source/card-product/card-product.component.ts +294 -818
- package/src/components-source/card-section/card-section.component.html +7 -7
- package/src/components-source/card-section/card-section.component.ts +41 -15
- package/src/components-source/checkbox-selection-list/checkbox-selection-list.component.ts +42 -179
- package/src/components-source/city-selector/city-selector.component.ts +37 -137
- package/src/components-source/confirm-dialog/confirm-dialog.component.html +26 -0
- package/src/components-source/confirm-dialog/confirm-dialog.component.scss +55 -0
- package/src/components-source/confirm-dialog/confirm-dialog.component.ts +22 -0
- package/src/components-source/country-flags/country-flags.component.ts +20 -12
- package/src/components-source/date-picker/date-picker.component.ts +32 -292
- package/src/components-source/date-picker-range/date-picker-range.component.html +15 -7
- package/src/components-source/date-picker-range/date-picker-range.component.ts +42 -235
- package/src/components-source/dropi-banner-external/dropi-banner-external.component.ts +24 -185
- package/src/components-source/dropi-breadcrumb/dropi-breadcrumb.component.html +21 -21
- package/src/components-source/dropi-breadcrumb/dropi-breadcrumb.component.spec.ts +9 -9
- package/src/components-source/dropi-breadcrumb/dropi-breadcrumb.component.ts +41 -23
- package/src/components-source/dropi-breadcrumb/dropi-breadcrumb.stories.ts +12 -12
- package/src/components-source/dropi-chips/dropi-chips.component.ts +22 -87
- package/src/components-source/dropi-country-selector/countries.data.ts +256 -236
- package/src/components-source/dropi-country-selector/dropi-country-selector.component.ts +37 -25
- package/src/components-source/dropi-drawer/dropi-drawer.component.ts +91 -78
- package/src/components-source/dropi-dropdown/dropi-dropdown.component.ts +44 -47
- package/src/components-source/dropi-file-upload/card-view/card-view.component.ts +33 -53
- package/src/components-source/dropi-file-upload/drop-zone/drop-zone.component.ts +52 -123
- package/src/components-source/dropi-file-upload/dropi-file-upload.component.ts +38 -294
- package/src/components-source/dropi-file-upload/file-list/file-list.component.ts +62 -43
- package/src/components-source/dropi-file-upload/grid-view/grid-view.component.ts +23 -22
- package/src/components-source/dropi-ilustration-icon/dropi-ilustration-icon.component.scss +6 -2
- package/src/components-source/dropi-image-overlay/dropi-image-overlay.component.ts +16 -71
- package/src/components-source/dropi-modal/dropi-modal.component.ts +56 -372
- package/src/components-source/dropi-navbar/dropi-navbar.component.ts +17 -17
- package/src/components-source/dropi-paginator/dropi-paginator.component.html +18 -7
- package/src/components-source/dropi-paginator/dropi-paginator.component.ts +40 -32
- package/src/components-source/dropi-phone-input/dropi-phone-input.component.html +78 -79
- package/src/components-source/dropi-phone-input/dropi-phone-input.component.ts +29 -85
- package/src/components-source/dropi-search/dropi-search.component.ts +59 -222
- package/src/components-source/dropi-select/dropi-select.component.html +82 -131
- package/src/components-source/dropi-select/dropi-select.component.ts +60 -423
- package/src/components-source/dropi-table/dropi-table.component.html +40 -23
- package/src/components-source/dropi-table/dropi-table.component.ts +130 -374
- package/src/components-source/dropi-tag/dropi-tag.component.ts +20 -90
- package/src/components-source/dropi-text-area/dropi-text-area.component.ts +22 -48
- package/src/components-source/dropi-tooltip/dropi-tooltip.component.ts +40 -129
- package/src/components-source/empty/empty.component.html +3 -0
- package/src/components-source/empty/empty.component.scss +0 -0
- package/src/components-source/empty/empty.component.ts +16 -0
- package/src/components-source/empty-state/empty-state.component.ts +47 -19
- package/src/components-source/index.ts +82 -37
- package/src/components-source/input/input.component.html +79 -63
- package/src/components-source/input/input.component.ts +51 -97
- package/src/components-source/lottie-loader/lottie-loader.component.ts +13 -16
- package/src/components-source/otp-send-code/otp-send-code.component.ts +60 -528
- package/src/components-source/radio-selection-list/radio-selection-list.component.ts +36 -97
- package/src/components-source/sidebar/sidebar.component.spec.ts +11 -11
- package/src/components-source/sidebar/sidebar.component.stories.ts +3 -3
- package/src/components-source/sidebar/sidebar.component.ts +51 -47
- package/src/components-source/simple-stepper/simple-stepper.component.ts +20 -35
- package/src/components-source/spinner/spinner.component.html +6 -0
- package/src/components-source/spinner/spinner.component.scss +15 -0
- package/src/components-source/spinner/spinner.component.ts +17 -0
- package/src/components-source/tabs/tabs.component.spec.ts +8 -8
- package/src/components-source/tabs/tabs.component.stories.ts +5 -5
- package/src/components-source/tabs/tabs.component.ts +41 -83
- package/src/components-source/toast/toast.component.ts +40 -46
- package/src/components-source/toggle/input-toggle.component.html +34 -0
- package/src/components-source/toggle/input-toggle.component.scss +0 -0
- package/src/components-source/toggle/input-toggle.component.ts +27 -0
- package/src/components-source/toggle/inputToggleConfig.ts +11 -0
- package/src/components-source/tooltip/tooltip.component.html +22 -11
- package/src/components-source/tooltip/tooltip.component.ts +28 -13
- package/src/components-source/vertical-steps/vertical-steps.component.ts +16 -78
- package/src/lib/elements-registry.ts +413 -1
- package/src/lib/router-stub.ts +7 -0
- package/src/libreria work space.code-workspace +11 -8
- package/src/utilities/interfaces/ui/dropi-table.interface.ts +60 -0
- package/src/utilities/interfaces/ui/input-interface.ts +34 -0
- package/src/utilities/interfaces/ui/select-interface.ts +8 -0
- package/src/utilities/interfaces/ui/selection-list-interface.ts +15 -0
- package/src/utilities/interfaces/ui/upload.model.ts +41 -0
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, HostListener, Inject, Pipe, CUSTOM_ELEMENTS_SCHEMA, } from "@angular/core";
|
|
2
|
+
import { CommonModule, TitleCasePipe } from "@angular/common";
|
|
3
|
+
import { IconComponent } from "../icon/icon.component";
|
|
4
|
+
import { DropiTagComponent } from "../dropi-tag/dropi-tag.component";
|
|
5
|
+
// import { Howl } from "howler"; // Eliminado para evitar errores de dependencia
|
|
6
|
+
import { DropiIlustrationIconComponent } from "../dropi-ilustration-icon/dropi-ilustration-icon.component";
|
|
7
|
+
import { TranslateModule } from "@ngx-translate/core";
|
|
8
|
+
import * as i0 from "@angular/core";
|
|
9
|
+
import * as i1 from "@angular/common";
|
|
10
|
+
import * as i2 from "@ngx-translate/core";
|
|
11
|
+
export class AdjustNamePipeStub {
|
|
12
|
+
transform(value) {
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AdjustNamePipeStub, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
16
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: AdjustNamePipeStub, isStandalone: true, name: "adjustName" });
|
|
17
|
+
}
|
|
18
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: AdjustNamePipeStub, decorators: [{
|
|
19
|
+
type: Pipe,
|
|
20
|
+
args: [{
|
|
21
|
+
name: "adjustName",
|
|
22
|
+
standalone: true,
|
|
23
|
+
}]
|
|
24
|
+
}] });
|
|
25
|
+
export class CurrencyComponentStub {
|
|
26
|
+
value;
|
|
27
|
+
class;
|
|
28
|
+
style;
|
|
29
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CurrencyComponentStub, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
30
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CurrencyComponentStub, isStandalone: true, selector: "currency", inputs: { value: "value", class: "class", style: "style" }, ngImport: i0, template: "{{value}}", isInline: true });
|
|
31
|
+
}
|
|
32
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CurrencyComponentStub, decorators: [{
|
|
33
|
+
type: Component,
|
|
34
|
+
args: [{
|
|
35
|
+
selector: "currency",
|
|
36
|
+
standalone: true,
|
|
37
|
+
template: "{{value}}",
|
|
38
|
+
}]
|
|
39
|
+
}], propDecorators: { value: [{
|
|
40
|
+
type: Input
|
|
41
|
+
}], class: [{
|
|
42
|
+
type: Input
|
|
43
|
+
}], style: [{
|
|
44
|
+
type: Input
|
|
45
|
+
}] } });
|
|
46
|
+
export class BetaTagComponentStub {
|
|
47
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BetaTagComponentStub, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
48
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: BetaTagComponentStub, isStandalone: true, selector: "app-beta-tag", ngImport: i0, template: "", isInline: true });
|
|
49
|
+
}
|
|
50
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BetaTagComponentStub, decorators: [{
|
|
51
|
+
type: Component,
|
|
52
|
+
args: [{
|
|
53
|
+
selector: "app-beta-tag",
|
|
54
|
+
standalone: true,
|
|
55
|
+
template: "",
|
|
56
|
+
}]
|
|
57
|
+
}] });
|
|
58
|
+
export class CardProductComponent {
|
|
59
|
+
settingService;
|
|
60
|
+
favoriteService;
|
|
61
|
+
orderManual;
|
|
62
|
+
router;
|
|
63
|
+
product;
|
|
64
|
+
state = "default";
|
|
65
|
+
aS = true;
|
|
66
|
+
bettaTester = false;
|
|
67
|
+
onAddToCart = new EventEmitter();
|
|
68
|
+
onProductClick = new EventEmitter();
|
|
69
|
+
changeFavorite = new EventEmitter();
|
|
70
|
+
imageError = false;
|
|
71
|
+
brandName = "";
|
|
72
|
+
onFavoriteHover = false;
|
|
73
|
+
randomClasses = {
|
|
74
|
+
card: "",
|
|
75
|
+
imageContainer: "",
|
|
76
|
+
image: "",
|
|
77
|
+
tags: "",
|
|
78
|
+
tagsRow: "",
|
|
79
|
+
favoriteButton: "",
|
|
80
|
+
productInfo: "",
|
|
81
|
+
productHeader: "",
|
|
82
|
+
category: "",
|
|
83
|
+
stockInfo: "",
|
|
84
|
+
stockLabel: "",
|
|
85
|
+
stockValue: "",
|
|
86
|
+
productName: "",
|
|
87
|
+
supplierInfo: "",
|
|
88
|
+
supplierLabel: "",
|
|
89
|
+
supplierName: "",
|
|
90
|
+
priceContainer: "",
|
|
91
|
+
priceItem: "",
|
|
92
|
+
priceLabel: "",
|
|
93
|
+
priceValue: "",
|
|
94
|
+
separator: "",
|
|
95
|
+
actionButton: "",
|
|
96
|
+
buttonText: "",
|
|
97
|
+
};
|
|
98
|
+
mixedData = {
|
|
99
|
+
stockDivs: [],
|
|
100
|
+
supplierPriceDivs: [],
|
|
101
|
+
suggestedPriceDivs: [],
|
|
102
|
+
};
|
|
103
|
+
fakeStyles = {
|
|
104
|
+
stock: "",
|
|
105
|
+
price: "",
|
|
106
|
+
};
|
|
107
|
+
isMobile = false;
|
|
108
|
+
constructor(settingService, favoriteService, orderManual, router) {
|
|
109
|
+
this.settingService = settingService;
|
|
110
|
+
this.favoriteService = favoriteService;
|
|
111
|
+
this.orderManual = orderManual;
|
|
112
|
+
this.router = router;
|
|
113
|
+
}
|
|
114
|
+
ngOnInit() {
|
|
115
|
+
this.brandName =
|
|
116
|
+
this.settingService?.getBrandInfo()?.name?.toLowerCase() || "dropi";
|
|
117
|
+
this.generateRandomClasses();
|
|
118
|
+
this.generateFakeStyles();
|
|
119
|
+
this.generateMixedData();
|
|
120
|
+
this.checkScreenSize();
|
|
121
|
+
}
|
|
122
|
+
ngOnChanges(changes) {
|
|
123
|
+
if (changes["product"] || changes["aS"]) {
|
|
124
|
+
this.generateMixedData();
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
onResize(event) {
|
|
128
|
+
this.checkScreenSize();
|
|
129
|
+
}
|
|
130
|
+
checkScreenSize() {
|
|
131
|
+
this.isMobile = window.innerWidth <= 420;
|
|
132
|
+
}
|
|
133
|
+
generateRandomClasses() {
|
|
134
|
+
this.randomClasses = {
|
|
135
|
+
card: this.generateRandomClass("dropi-card-product"),
|
|
136
|
+
imageContainer: this.generateRandomClass("product-image-container"),
|
|
137
|
+
image: this.generateRandomClass("product-image"),
|
|
138
|
+
tags: this.generateRandomClass("product-tags"),
|
|
139
|
+
tagsRow: this.generateRandomClass("tags-row"),
|
|
140
|
+
favoriteButton: this.generateRandomClass("favorite-button"),
|
|
141
|
+
productInfo: this.generateRandomClass("product-info"),
|
|
142
|
+
productHeader: this.generateRandomClass("product-header"),
|
|
143
|
+
category: this.generateRandomClass("category"),
|
|
144
|
+
stockInfo: this.generateRandomClass("stock-info"),
|
|
145
|
+
stockLabel: this.generateRandomClass("stock-label"),
|
|
146
|
+
stockValue: this.generateRandomClass("stock-value"),
|
|
147
|
+
productName: this.generateRandomClass("product-name"),
|
|
148
|
+
supplierInfo: this.generateRandomClass("supplier-info"),
|
|
149
|
+
supplierLabel: this.generateRandomClass("supplier-label"),
|
|
150
|
+
supplierName: this.generateRandomClass("supplier-name"),
|
|
151
|
+
priceContainer: this.generateRandomClass("price-container"),
|
|
152
|
+
priceItem: this.generateRandomClass("price-item"),
|
|
153
|
+
priceLabel: this.generateRandomClass("price-label"),
|
|
154
|
+
priceValue: this.generateRandomClass("price-value"),
|
|
155
|
+
separator: this.generateRandomClass("separator"),
|
|
156
|
+
actionButton: this.generateRandomClass("action-button"),
|
|
157
|
+
buttonText: this.generateRandomClass("button-text"),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
generateMixedData() {
|
|
161
|
+
this.mixedData.stockDivs = this.generateMixedStockDivs();
|
|
162
|
+
this.mixedData.supplierPriceDivs = this.getMixedSupplierPriceDivs();
|
|
163
|
+
this.mixedData.suggestedPriceDivs = this.getMixedSuggestedPriceDivs();
|
|
164
|
+
}
|
|
165
|
+
generateFakeStyles() {
|
|
166
|
+
this.fakeStyles.stock = this.generateFakeStyleVariant();
|
|
167
|
+
this.fakeStyles.price = this.generateFakeStyleVariant();
|
|
168
|
+
}
|
|
169
|
+
get imageUrl() {
|
|
170
|
+
if (this.product && this.product.image) {
|
|
171
|
+
return `https://img.dropi.co/${this.product.image}`;
|
|
172
|
+
}
|
|
173
|
+
if (this.product && this.product.imageUrl) {
|
|
174
|
+
return this.product.imageUrl;
|
|
175
|
+
}
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
onError(event) {
|
|
179
|
+
this.imageError = true;
|
|
180
|
+
event.target.src = "./assets/utils/no-image.jpg";
|
|
181
|
+
}
|
|
182
|
+
get productTags() {
|
|
183
|
+
const tags = [];
|
|
184
|
+
if (this.product?.type?.includes("variable")) {
|
|
185
|
+
tags.push({
|
|
186
|
+
text: "Variable",
|
|
187
|
+
type: "primary",
|
|
188
|
+
state: "default",
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
if (this.product?.type?.includes("privado")) {
|
|
192
|
+
tags.push({
|
|
193
|
+
text: "Privado",
|
|
194
|
+
type: "primary",
|
|
195
|
+
state: "warning",
|
|
196
|
+
showIcon: true,
|
|
197
|
+
icon: "Lock",
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
if (this.product?.type?.includes("combo")) {
|
|
201
|
+
tags.push({
|
|
202
|
+
text: "Combo",
|
|
203
|
+
type: "primary",
|
|
204
|
+
state: "info",
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
return tags;
|
|
208
|
+
}
|
|
209
|
+
getProductStock() {
|
|
210
|
+
if (this.product?.type === "VARIABLE" && this.product?.is_variation) {
|
|
211
|
+
return this.product?.variation_stock || 0;
|
|
212
|
+
}
|
|
213
|
+
return this.product?.stock_simple || 0;
|
|
214
|
+
}
|
|
215
|
+
get stockStatus() {
|
|
216
|
+
const stock = this.getProductStock();
|
|
217
|
+
if (stock === 0)
|
|
218
|
+
return "error";
|
|
219
|
+
if (stock <= 10)
|
|
220
|
+
return "warning";
|
|
221
|
+
return "success";
|
|
222
|
+
}
|
|
223
|
+
get stockStatusClass() {
|
|
224
|
+
switch (this.stockStatus) {
|
|
225
|
+
case "success":
|
|
226
|
+
return "stock-success";
|
|
227
|
+
case "warning":
|
|
228
|
+
return "stock-warning";
|
|
229
|
+
case "error":
|
|
230
|
+
return "stock-error";
|
|
231
|
+
default:
|
|
232
|
+
return "stock-success";
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
handleAddToCart() {
|
|
236
|
+
const stock = this.getProductStock();
|
|
237
|
+
if (stock > 0) {
|
|
238
|
+
this.onAddToCart.emit(this.product);
|
|
239
|
+
if (this.orderManual) {
|
|
240
|
+
this.orderManual.setModalOpen(true);
|
|
241
|
+
this.orderManual.clearProductsIds();
|
|
242
|
+
this.orderManual.setProductsIds(Number(this.product.id));
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
handleFavoriteToggle() {
|
|
247
|
+
if (!this.product || !this.product.id)
|
|
248
|
+
return;
|
|
249
|
+
let body = { product_id: this.product.id };
|
|
250
|
+
if (!this.product.favorite) {
|
|
251
|
+
this.favoriteService?.addFavoriteProduct(body).subscribe({
|
|
252
|
+
next: (response) => {
|
|
253
|
+
if (response?.is_successful) {
|
|
254
|
+
this.product.favorite = true;
|
|
255
|
+
this.playAudio();
|
|
256
|
+
this.changeFavorite.emit(true);
|
|
257
|
+
}
|
|
258
|
+
},
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
this.favoriteService?.removeFavoriteProduct(body).subscribe({
|
|
263
|
+
next: (response) => {
|
|
264
|
+
if (response?.is_successful) {
|
|
265
|
+
this.product.favorite = false;
|
|
266
|
+
this.playAudio();
|
|
267
|
+
this.changeFavorite.emit(false);
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
});
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
getFavoriteIconColor() {
|
|
274
|
+
if (this.product?.favorite) {
|
|
275
|
+
return "#fff";
|
|
276
|
+
}
|
|
277
|
+
return this.onFavoriteHover ? "#f49a3d" : "#858ea6";
|
|
278
|
+
}
|
|
279
|
+
playAudio() {
|
|
280
|
+
// try {
|
|
281
|
+
// let sound = new Howl({
|
|
282
|
+
// src: ["assets/audio/pop.mp3"],
|
|
283
|
+
// });
|
|
284
|
+
// sound.volume(0.4);
|
|
285
|
+
// sound.play();
|
|
286
|
+
// } catch (e) {}
|
|
287
|
+
}
|
|
288
|
+
getProductDetails() {
|
|
289
|
+
let nameProductUrl = this.product.name || "producto";
|
|
290
|
+
const url = `/dashboard/product-details/${this.product.id}/${nameProductUrl}`;
|
|
291
|
+
window.open(url, "_blank");
|
|
292
|
+
}
|
|
293
|
+
getProvidersDetails() {
|
|
294
|
+
const cleanName = this.product?.supplier?.name || "proveedor";
|
|
295
|
+
if (this.router?.url === "/dashboard/search") {
|
|
296
|
+
const url = `/dashboard/provider/${this.product.supplier.id}/${cleanName}`;
|
|
297
|
+
window.open(url, "_blank");
|
|
298
|
+
}
|
|
299
|
+
else {
|
|
300
|
+
this.router?.navigate?.([
|
|
301
|
+
"/dashboard/provider",
|
|
302
|
+
this.product.supplier.id,
|
|
303
|
+
cleanName,
|
|
304
|
+
]);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
getMixedSupplierPriceDivs() {
|
|
308
|
+
return [
|
|
309
|
+
{
|
|
310
|
+
value: this.product?.supplierPrice || this.product?.sale_price || 0,
|
|
311
|
+
class: "price-real",
|
|
312
|
+
isReal: true,
|
|
313
|
+
},
|
|
314
|
+
];
|
|
315
|
+
}
|
|
316
|
+
getMixedSuggestedPriceDivs() {
|
|
317
|
+
return [
|
|
318
|
+
{
|
|
319
|
+
value: this.product?.suggestedPrice || this.product?.suggested_price || 0,
|
|
320
|
+
class: "price-real",
|
|
321
|
+
isReal: true,
|
|
322
|
+
},
|
|
323
|
+
];
|
|
324
|
+
}
|
|
325
|
+
hasStock() {
|
|
326
|
+
return this.getProductStock() > 0;
|
|
327
|
+
}
|
|
328
|
+
// Helper fakes for anti-scraping
|
|
329
|
+
generateRandomClass(base) {
|
|
330
|
+
return base + "-" + Math.random().toString(36).slice(2, 7);
|
|
331
|
+
}
|
|
332
|
+
generateFakeStyleVariant() {
|
|
333
|
+
return "";
|
|
334
|
+
}
|
|
335
|
+
generateMixedStockDivs() {
|
|
336
|
+
return [
|
|
337
|
+
{ value: this.getProductStock(), class: "stock-real", isReal: true },
|
|
338
|
+
];
|
|
339
|
+
}
|
|
340
|
+
// Re-added missing template methods
|
|
341
|
+
getCardStyles() {
|
|
342
|
+
return {};
|
|
343
|
+
}
|
|
344
|
+
getRandomProviderCategoryStyles() {
|
|
345
|
+
return {};
|
|
346
|
+
}
|
|
347
|
+
getImageContainerStyles() {
|
|
348
|
+
return {};
|
|
349
|
+
}
|
|
350
|
+
getImageStyles() {
|
|
351
|
+
return {};
|
|
352
|
+
}
|
|
353
|
+
getTagsContainerStyles() {
|
|
354
|
+
return {};
|
|
355
|
+
}
|
|
356
|
+
getTagsRowStyles() {
|
|
357
|
+
return {};
|
|
358
|
+
}
|
|
359
|
+
getFavoriteButtonStyles() {
|
|
360
|
+
return {};
|
|
361
|
+
}
|
|
362
|
+
getProductInfoStyles() {
|
|
363
|
+
return {};
|
|
364
|
+
}
|
|
365
|
+
getProductHeaderStyles() {
|
|
366
|
+
return {};
|
|
367
|
+
}
|
|
368
|
+
getCategoryStyles() {
|
|
369
|
+
return {};
|
|
370
|
+
}
|
|
371
|
+
getStockInfoStyles() {
|
|
372
|
+
return {};
|
|
373
|
+
}
|
|
374
|
+
getStockLabelStyles() {
|
|
375
|
+
return {};
|
|
376
|
+
}
|
|
377
|
+
getStockValueStyles() {
|
|
378
|
+
return {};
|
|
379
|
+
}
|
|
380
|
+
getProductNameStyles() {
|
|
381
|
+
return {};
|
|
382
|
+
}
|
|
383
|
+
getSupplierInfoStyles() {
|
|
384
|
+
return {};
|
|
385
|
+
}
|
|
386
|
+
getSupplierLabelStyles() {
|
|
387
|
+
return {};
|
|
388
|
+
}
|
|
389
|
+
getSupplierNameStyles() {
|
|
390
|
+
return {};
|
|
391
|
+
}
|
|
392
|
+
getPriceContainerStyles() {
|
|
393
|
+
return {};
|
|
394
|
+
}
|
|
395
|
+
getPriceItemStyles() {
|
|
396
|
+
return {};
|
|
397
|
+
}
|
|
398
|
+
getPriceLabelStyles() {
|
|
399
|
+
return {};
|
|
400
|
+
}
|
|
401
|
+
getPriceValueStyles() {
|
|
402
|
+
return {};
|
|
403
|
+
}
|
|
404
|
+
getSeparatorStyles() {
|
|
405
|
+
return {};
|
|
406
|
+
}
|
|
407
|
+
getActionButtonStyles() {
|
|
408
|
+
return {};
|
|
409
|
+
}
|
|
410
|
+
getButtonTextStyles() {
|
|
411
|
+
return {};
|
|
412
|
+
}
|
|
413
|
+
getFakeStockStyles() {
|
|
414
|
+
return {};
|
|
415
|
+
}
|
|
416
|
+
getFakePriceStyles() {
|
|
417
|
+
return {};
|
|
418
|
+
}
|
|
419
|
+
getRandomCardClass() {
|
|
420
|
+
return this.randomClasses.card;
|
|
421
|
+
}
|
|
422
|
+
getRandomImageContainerClass() {
|
|
423
|
+
return this.randomClasses.imageContainer;
|
|
424
|
+
}
|
|
425
|
+
getRandomImageClass() {
|
|
426
|
+
return this.randomClasses.image;
|
|
427
|
+
}
|
|
428
|
+
getRandomTagsClass() {
|
|
429
|
+
return this.randomClasses.tags;
|
|
430
|
+
}
|
|
431
|
+
getRandomTagsRowClass() {
|
|
432
|
+
return this.randomClasses.tagsRow;
|
|
433
|
+
}
|
|
434
|
+
getRandomFavoriteButtonClass() {
|
|
435
|
+
return this.randomClasses.favoriteButton;
|
|
436
|
+
}
|
|
437
|
+
getRandomProductInfoClass() {
|
|
438
|
+
return this.randomClasses.productInfo;
|
|
439
|
+
}
|
|
440
|
+
getRandomProductHeaderClass() {
|
|
441
|
+
return this.randomClasses.productHeader;
|
|
442
|
+
}
|
|
443
|
+
getRandomCategoryClass() {
|
|
444
|
+
return this.randomClasses.category;
|
|
445
|
+
}
|
|
446
|
+
getRandomStockInfoClass() {
|
|
447
|
+
return this.randomClasses.stockInfo;
|
|
448
|
+
}
|
|
449
|
+
getRandomStockLabelClass() {
|
|
450
|
+
return this.randomClasses.stockLabel;
|
|
451
|
+
}
|
|
452
|
+
getRandomProductNameClass() {
|
|
453
|
+
return this.randomClasses.productName;
|
|
454
|
+
}
|
|
455
|
+
getRandomSupplierInfoClass() {
|
|
456
|
+
return this.randomClasses.supplierInfo;
|
|
457
|
+
}
|
|
458
|
+
getRandomSupplierLabelClass() {
|
|
459
|
+
return this.randomClasses.supplierLabel;
|
|
460
|
+
}
|
|
461
|
+
getRandomSupplierNameClass() {
|
|
462
|
+
return this.randomClasses.supplierName;
|
|
463
|
+
}
|
|
464
|
+
getRandomPriceContainerClass() {
|
|
465
|
+
return this.randomClasses.priceContainer;
|
|
466
|
+
}
|
|
467
|
+
getRandomPriceItemClass() {
|
|
468
|
+
return this.randomClasses.priceItem;
|
|
469
|
+
}
|
|
470
|
+
getRandomPriceLabelClass() {
|
|
471
|
+
return this.randomClasses.priceLabel;
|
|
472
|
+
}
|
|
473
|
+
getRandomPriceValueClass() {
|
|
474
|
+
return this.randomClasses.priceValue;
|
|
475
|
+
}
|
|
476
|
+
getRandomSeparatorClass() {
|
|
477
|
+
return this.randomClasses.separator;
|
|
478
|
+
}
|
|
479
|
+
getRandomActionButtonClass() {
|
|
480
|
+
return this.randomClasses.actionButton;
|
|
481
|
+
}
|
|
482
|
+
getRandomButtonTextClass() {
|
|
483
|
+
return this.randomClasses.buttonText;
|
|
484
|
+
}
|
|
485
|
+
getMixedStockDivs() {
|
|
486
|
+
return this.generateMixedStockDivs();
|
|
487
|
+
}
|
|
488
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CardProductComponent, deps: [{ token: "SettingsService" }, { token: "ProductstService" }, { token: "OrderManualService" }, { token: "Router" }], target: i0.ɵɵFactoryTarget.Component });
|
|
489
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CardProductComponent, isStandalone: true, selector: "dropi-card-product", inputs: { product: "product", state: "state", aS: "aS", bettaTester: "bettaTester" }, outputs: { onAddToCart: "onAddToCart", onProductClick: "onProductClick", changeFavorite: "changeFavorite" }, host: { listeners: { "window:resize": "onResize($event)" } }, usesOnChanges: true, ngImport: i0, template: "<div [class]=\"getRandomCardClass()\" [style]=\"getCardStyles()\" (click)=\"getProductDetails()\">\n <app-beta-tag *ngIf=\"bettaTester\"></app-beta-tag>\n <!-- Contenedor de imagen con altura fija de 214px como en Figma -->\n <div [class]=\"getRandomImageContainerClass()\" [style]=\"getImageContainerStyles()\">\n <div [class]=\"getRandomImageClass()\" [style]=\"getImageStyles()\">\n <!-- Imagen del producto con manejo de errores -->\n <img\n [src]=\"imageUrl\"\n [alt]=\"product?.name || 'Product Image'\"\n (error)=\"onError($event)\"\n [ngClass]=\"{ 'error-img': imageError }\"\n style=\"width: 100%; height: 100%; object-fit: cover; border-radius: 8px\"\n />\n\n <!-- Tags superpuestos en la esquina superior izquierda -->\n <div\n [class]=\"getRandomTagsClass()\"\n [style]=\"getTagsContainerStyles()\"\n *ngIf=\"productTags?.length > 0\"\n >\n <div [class]=\"getRandomTagsRowClass()\" [style]=\"getTagsRowStyles()\">\n <app-dropi-tag\n *ngFor=\"let tag of productTags.slice(0, 2)\"\n [type]=\"tag?.type\"\n [state]=\"tag?.state\"\n [showIcon]=\"tag?.showIcon\"\n [icon]=\"tag?.icon\"\n [text]=\"tag?.text\"\n >\n </app-dropi-tag>\n </div>\n </div>\n\n <!-- Bot\u00F3n de favorito superpuesto en la esquina inferior derecha -->\n <div\n [class]=\"getRandomFavoriteButtonClass()\"\n [ngClass]=\"{ 'favorite-button': true, 'favorite-active': product?.favorite }\"\n [style]=\"getFavoriteButtonStyles()\"\n (click)=\"handleFavoriteToggle(); $event.stopPropagation()\"\n >\n <app-icon\n [name]=\"product?.favorite ? 'Heart-solid' : 'Heart'\"\n width=\"18px\"\n height=\"18px\"\n [color]=\"product?.favorite ? '#fff' : '#858ea6'\"\n [style]=\"{ display: 'flex', 'align-items': 'center', 'justify-content': 'center' }\"\n >\n </app-icon>\n </div>\n </div>\n </div>\n\n <!-- Informaci\u00F3n del producto -->\n <div [class]=\"getRandomProductInfoClass()\" [style]=\"getProductInfoStyles()\">\n <!-- Header con categor\u00EDa y stock -->\n <div [class]=\"getRandomProductHeaderClass()\" [style]=\"getProductHeaderStyles()\">\n <dropi-ilustration-icon\n *ngIf=\"product?.supplier?.icon\"\n [style]=\"getRandomProviderCategoryStyles()\"\n [type]=\"'insignia'\"\n [stateInsignia]=\"product?.supplier?.icon\"\n [tagProduct]=\"true\"\n ></dropi-ilustration-icon>\n\n <span\n [class]=\"getRandomCategoryClass()\"\n [style]=\"getCategoryStyles()\"\n *ngIf=\"product?.categories && product?.categories.length > 0\"\n >{{ product?.categories[0]?.name | adjustName }}</span\n >\n\n <div [class]=\"getRandomStockInfoClass()\" [style]=\"getStockInfoStyles()\">\n <span [class]=\"getRandomStockLabelClass()\" [style]=\"getStockLabelStyles()\">{{ \"stock\" | translate }}:</span>\n\n <!-- Stocks mezclados aleatoriamente (real + falsos) -->\n <span\n *ngFor=\"let stockItem of getMixedStockDivs()\"\n [class]=\"stockItem.class\"\n [style]=\"stockItem.isReal ? getStockValueStyles() : getFakeStockStyles()\"\n >\n {{ stockItem.value }}\n </span>\n\n <span\n *ngIf=\"product?.private_user_stock && product?.private_user_stock > 0\"\n class=\"stock-private-user\"\n [style]=\"{\n 'font-weight': '500',\n padding: '0px 6px',\n 'margin-left': '6px',\n 'border-radius': '4px',\n background: 'var(--Success-Success-50, #e7f8f3)',\n color: 'var(--Success-Success-500, #0abb87)',\n 'text-align': 'center'\n }\"\n >\n {{ product?.private_user_stock }}\n </span>\n </div>\n </div>\n\n <!-- Nombre del producto -->\n <h3 [class]=\"getRandomProductNameClass()\" [style]=\"getProductNameStyles()\">\n {{ product?.name | adjustName }}\n </h3>\n\n <!-- Proveedor -->\n <div [class]=\"getRandomSupplierInfoClass()\" [style]=\"getSupplierInfoStyles()\">\n <span [class]=\"getRandomSupplierLabelClass()\" [style]=\"getSupplierLabelStyles()\"\n >{{ \"supplier\" | translate }}:</span\n >\n <span\n [class]=\"getRandomSupplierNameClass()\"\n [style]=\"getSupplierNameStyles()\"\n (click)=\"getProvidersDetails(); $event.stopPropagation()\"\n >{{ product?.supplier?.name | adjustName }}</span\n >\n </div>\n\n <!-- Precios -->\n <div [class]=\"getRandomPriceContainerClass()\" [style]=\"getPriceContainerStyles()\">\n <div [class]=\"getRandomPriceItemClass()\" [style]=\"getPriceItemStyles()\">\n <span [class]=\"getRandomPriceLabelClass()\" [style]=\"getPriceLabelStyles()\"\n >{{ \"supplier price\" | translate }}</span\n >\n\n <!-- Precios de proveedor mezclados aleatoriamente (real + falsos) -->\n <currency\n *ngFor=\"let priceItem of getMixedSupplierPriceDivs()\"\n [class]=\"priceItem.class\"\n [style]=\"priceItem.isReal ? getPriceValueStyles() : getFakePriceStyles()\"\n [value]=\"priceItem.value\"\n >\n </currency>\n </div>\n <div [class]=\"getRandomPriceItemClass()\" [style]=\"getPriceItemStyles()\">\n <span [class]=\"getRandomPriceLabelClass()\" [style]=\"getPriceLabelStyles()\"\n >{{ \"suggested price\" | translate }}</span\n >\n\n <!-- Precios sugeridos mezclados aleatoriamente (real + falsos) -->\n <currency\n *ngFor=\"let priceItem of getMixedSuggestedPriceDivs()\"\n [class]=\"priceItem.class\"\n [style]=\"priceItem.isReal ? getPriceValueStyles() : getFakePriceStyles()\"\n [value]=\"priceItem.value\"\n >\n </currency>\n </div>\n </div>\n </div>\n\n <!-- Separador horizontal -->\n <div [class]=\"getRandomSeparatorClass()\" [style]=\"getSeparatorStyles()\"></div>\n\n <!-- Bot\u00F3n de acci\u00F3n principal -->\n <div\n [class]=\"getRandomActionButtonClass()\"\n [style]=\"getActionButtonStyles()\"\n (click)=\"handleAddToCart(); $event.stopPropagation()\"\n >\n <app-icon\n name=\"Shopping-cart-arrow-rigth\"\n width=\"20px\"\n height=\"20px\"\n color=\"#f49a3d\"\n [style]=\"{ display: 'flex', 'align-items': 'center', 'justify-content': 'center' }\"\n ></app-icon>\n <span [class]=\"getRandomButtonTextClass()\" [style]=\"getButtonTextStyles()\"\n >{{ \"send to client\" | translate }}</span\n >\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IconComponent, selector: "app-icon", inputs: ["name", "width", "height", "color"] }, { kind: "component", type: CurrencyComponentStub, selector: "currency", inputs: ["value", "class", "style"] }, { kind: "pipe", type: AdjustNamePipeStub, name: "adjustName" }, { kind: "component", type: BetaTagComponentStub, selector: "app-beta-tag" }, { kind: "component", type: DropiIlustrationIconComponent, selector: "dropi-ilustration-icon", inputs: ["type", "state", "stateInsignia", "tagProduct"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }] });
|
|
490
|
+
}
|
|
491
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CardProductComponent, decorators: [{
|
|
492
|
+
type: Component,
|
|
493
|
+
args: [{ selector: "dropi-card-product", standalone: true, imports: [
|
|
494
|
+
CommonModule,
|
|
495
|
+
IconComponent,
|
|
496
|
+
DropiTagComponent,
|
|
497
|
+
CurrencyComponentStub,
|
|
498
|
+
TitleCasePipe,
|
|
499
|
+
AdjustNamePipeStub,
|
|
500
|
+
BetaTagComponentStub,
|
|
501
|
+
DropiIlustrationIconComponent,
|
|
502
|
+
TranslateModule,
|
|
503
|
+
], schemas: [CUSTOM_ELEMENTS_SCHEMA], template: "<div [class]=\"getRandomCardClass()\" [style]=\"getCardStyles()\" (click)=\"getProductDetails()\">\n <app-beta-tag *ngIf=\"bettaTester\"></app-beta-tag>\n <!-- Contenedor de imagen con altura fija de 214px como en Figma -->\n <div [class]=\"getRandomImageContainerClass()\" [style]=\"getImageContainerStyles()\">\n <div [class]=\"getRandomImageClass()\" [style]=\"getImageStyles()\">\n <!-- Imagen del producto con manejo de errores -->\n <img\n [src]=\"imageUrl\"\n [alt]=\"product?.name || 'Product Image'\"\n (error)=\"onError($event)\"\n [ngClass]=\"{ 'error-img': imageError }\"\n style=\"width: 100%; height: 100%; object-fit: cover; border-radius: 8px\"\n />\n\n <!-- Tags superpuestos en la esquina superior izquierda -->\n <div\n [class]=\"getRandomTagsClass()\"\n [style]=\"getTagsContainerStyles()\"\n *ngIf=\"productTags?.length > 0\"\n >\n <div [class]=\"getRandomTagsRowClass()\" [style]=\"getTagsRowStyles()\">\n <app-dropi-tag\n *ngFor=\"let tag of productTags.slice(0, 2)\"\n [type]=\"tag?.type\"\n [state]=\"tag?.state\"\n [showIcon]=\"tag?.showIcon\"\n [icon]=\"tag?.icon\"\n [text]=\"tag?.text\"\n >\n </app-dropi-tag>\n </div>\n </div>\n\n <!-- Bot\u00F3n de favorito superpuesto en la esquina inferior derecha -->\n <div\n [class]=\"getRandomFavoriteButtonClass()\"\n [ngClass]=\"{ 'favorite-button': true, 'favorite-active': product?.favorite }\"\n [style]=\"getFavoriteButtonStyles()\"\n (click)=\"handleFavoriteToggle(); $event.stopPropagation()\"\n >\n <app-icon\n [name]=\"product?.favorite ? 'Heart-solid' : 'Heart'\"\n width=\"18px\"\n height=\"18px\"\n [color]=\"product?.favorite ? '#fff' : '#858ea6'\"\n [style]=\"{ display: 'flex', 'align-items': 'center', 'justify-content': 'center' }\"\n >\n </app-icon>\n </div>\n </div>\n </div>\n\n <!-- Informaci\u00F3n del producto -->\n <div [class]=\"getRandomProductInfoClass()\" [style]=\"getProductInfoStyles()\">\n <!-- Header con categor\u00EDa y stock -->\n <div [class]=\"getRandomProductHeaderClass()\" [style]=\"getProductHeaderStyles()\">\n <dropi-ilustration-icon\n *ngIf=\"product?.supplier?.icon\"\n [style]=\"getRandomProviderCategoryStyles()\"\n [type]=\"'insignia'\"\n [stateInsignia]=\"product?.supplier?.icon\"\n [tagProduct]=\"true\"\n ></dropi-ilustration-icon>\n\n <span\n [class]=\"getRandomCategoryClass()\"\n [style]=\"getCategoryStyles()\"\n *ngIf=\"product?.categories && product?.categories.length > 0\"\n >{{ product?.categories[0]?.name | adjustName }}</span\n >\n\n <div [class]=\"getRandomStockInfoClass()\" [style]=\"getStockInfoStyles()\">\n <span [class]=\"getRandomStockLabelClass()\" [style]=\"getStockLabelStyles()\">{{ \"stock\" | translate }}:</span>\n\n <!-- Stocks mezclados aleatoriamente (real + falsos) -->\n <span\n *ngFor=\"let stockItem of getMixedStockDivs()\"\n [class]=\"stockItem.class\"\n [style]=\"stockItem.isReal ? getStockValueStyles() : getFakeStockStyles()\"\n >\n {{ stockItem.value }}\n </span>\n\n <span\n *ngIf=\"product?.private_user_stock && product?.private_user_stock > 0\"\n class=\"stock-private-user\"\n [style]=\"{\n 'font-weight': '500',\n padding: '0px 6px',\n 'margin-left': '6px',\n 'border-radius': '4px',\n background: 'var(--Success-Success-50, #e7f8f3)',\n color: 'var(--Success-Success-500, #0abb87)',\n 'text-align': 'center'\n }\"\n >\n {{ product?.private_user_stock }}\n </span>\n </div>\n </div>\n\n <!-- Nombre del producto -->\n <h3 [class]=\"getRandomProductNameClass()\" [style]=\"getProductNameStyles()\">\n {{ product?.name | adjustName }}\n </h3>\n\n <!-- Proveedor -->\n <div [class]=\"getRandomSupplierInfoClass()\" [style]=\"getSupplierInfoStyles()\">\n <span [class]=\"getRandomSupplierLabelClass()\" [style]=\"getSupplierLabelStyles()\"\n >{{ \"supplier\" | translate }}:</span\n >\n <span\n [class]=\"getRandomSupplierNameClass()\"\n [style]=\"getSupplierNameStyles()\"\n (click)=\"getProvidersDetails(); $event.stopPropagation()\"\n >{{ product?.supplier?.name | adjustName }}</span\n >\n </div>\n\n <!-- Precios -->\n <div [class]=\"getRandomPriceContainerClass()\" [style]=\"getPriceContainerStyles()\">\n <div [class]=\"getRandomPriceItemClass()\" [style]=\"getPriceItemStyles()\">\n <span [class]=\"getRandomPriceLabelClass()\" [style]=\"getPriceLabelStyles()\"\n >{{ \"supplier price\" | translate }}</span\n >\n\n <!-- Precios de proveedor mezclados aleatoriamente (real + falsos) -->\n <currency\n *ngFor=\"let priceItem of getMixedSupplierPriceDivs()\"\n [class]=\"priceItem.class\"\n [style]=\"priceItem.isReal ? getPriceValueStyles() : getFakePriceStyles()\"\n [value]=\"priceItem.value\"\n >\n </currency>\n </div>\n <div [class]=\"getRandomPriceItemClass()\" [style]=\"getPriceItemStyles()\">\n <span [class]=\"getRandomPriceLabelClass()\" [style]=\"getPriceLabelStyles()\"\n >{{ \"suggested price\" | translate }}</span\n >\n\n <!-- Precios sugeridos mezclados aleatoriamente (real + falsos) -->\n <currency\n *ngFor=\"let priceItem of getMixedSuggestedPriceDivs()\"\n [class]=\"priceItem.class\"\n [style]=\"priceItem.isReal ? getPriceValueStyles() : getFakePriceStyles()\"\n [value]=\"priceItem.value\"\n >\n </currency>\n </div>\n </div>\n </div>\n\n <!-- Separador horizontal -->\n <div [class]=\"getRandomSeparatorClass()\" [style]=\"getSeparatorStyles()\"></div>\n\n <!-- Bot\u00F3n de acci\u00F3n principal -->\n <div\n [class]=\"getRandomActionButtonClass()\"\n [style]=\"getActionButtonStyles()\"\n (click)=\"handleAddToCart(); $event.stopPropagation()\"\n >\n <app-icon\n name=\"Shopping-cart-arrow-rigth\"\n width=\"20px\"\n height=\"20px\"\n color=\"#f49a3d\"\n [style]=\"{ display: 'flex', 'align-items': 'center', 'justify-content': 'center' }\"\n ></app-icon>\n <span [class]=\"getRandomButtonTextClass()\" [style]=\"getButtonTextStyles()\"\n >{{ \"send to client\" | translate }}</span\n >\n </div>\n</div>\n" }]
|
|
504
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
505
|
+
type: Inject,
|
|
506
|
+
args: ["SettingsService"]
|
|
507
|
+
}] }, { type: undefined, decorators: [{
|
|
508
|
+
type: Inject,
|
|
509
|
+
args: ["ProductstService"]
|
|
510
|
+
}] }, { type: undefined, decorators: [{
|
|
511
|
+
type: Inject,
|
|
512
|
+
args: ["OrderManualService"]
|
|
513
|
+
}] }, { type: undefined, decorators: [{
|
|
514
|
+
type: Inject,
|
|
515
|
+
args: ["Router"]
|
|
516
|
+
}] }], propDecorators: { product: [{
|
|
517
|
+
type: Input
|
|
518
|
+
}], state: [{
|
|
519
|
+
type: Input
|
|
520
|
+
}], aS: [{
|
|
521
|
+
type: Input
|
|
522
|
+
}], bettaTester: [{
|
|
523
|
+
type: Input
|
|
524
|
+
}], onAddToCart: [{
|
|
525
|
+
type: Output
|
|
526
|
+
}], onProductClick: [{
|
|
527
|
+
type: Output
|
|
528
|
+
}], changeFavorite: [{
|
|
529
|
+
type: Output
|
|
530
|
+
}], onResize: [{
|
|
531
|
+
type: HostListener,
|
|
532
|
+
args: ["window:resize", ["$event"]]
|
|
533
|
+
}] } });
|
|
534
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1wcm9kdWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzLXNvdXJjZS9jYXJkLXByb2R1Y3QvY2FyZC1wcm9kdWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzLXNvdXJjZS9jYXJkLXByb2R1Y3QvY2FyZC1wcm9kdWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFDTixZQUFZLEVBR1osWUFBWSxFQUNaLE1BQU0sRUFDTixJQUFJLEVBRUosc0JBQXNCLEdBQ3ZCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLGlGQUFpRjtBQUNqRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUMzRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7QUFNdEQsTUFBTSxPQUFPLGtCQUFrQjtJQUM3QixTQUFTLENBQUMsS0FBVTtRQUNsQixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7d0dBSFUsa0JBQWtCO3NHQUFsQixrQkFBa0I7OzRGQUFsQixrQkFBa0I7a0JBSjlCLElBQUk7bUJBQUM7b0JBQ0osSUFBSSxFQUFFLFlBQVk7b0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs7QUFZRCxNQUFNLE9BQU8scUJBQXFCO0lBQ3ZCLEtBQUssQ0FBTTtJQUNYLEtBQUssQ0FBTTtJQUNYLEtBQUssQ0FBTTt3R0FIVCxxQkFBcUI7NEZBQXJCLHFCQUFxQixnSUFGdEIsV0FBVzs7NEZBRVYscUJBQXFCO2tCQUxqQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSxVQUFVO29CQUNwQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLFdBQVc7aUJBQ3RCOzhCQUVVLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLOztBQVFSLE1BQU0sT0FBTyxvQkFBb0I7d0dBQXBCLG9CQUFvQjs0RkFBcEIsb0JBQW9CLHdFQUZyQixFQUFFOzs0RkFFRCxvQkFBb0I7a0JBTGhDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGNBQWM7b0JBQ3hCLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUsRUFBRTtpQkFDYjs7QUFzREQsTUFBTSxPQUFPLG9CQUFvQjtJQTZETTtJQUNDO0lBQ0U7SUFDWjtJQS9EbkIsT0FBTyxDQUFlO0lBQ3RCLEtBQUssR0FBYyxTQUFTLENBQUM7SUFDN0IsRUFBRSxHQUFZLElBQUksQ0FBQztJQUNuQixXQUFXLEdBQVksS0FBSyxDQUFDO0lBQzVCLFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO0lBQzlDLGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBZSxDQUFDO0lBQ2pELGNBQWMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBRWhELFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsU0FBUyxHQUFXLEVBQUUsQ0FBQztJQUN2QixlQUFlLEdBQUcsS0FBSyxDQUFDO0lBRXhCLGFBQWEsR0FBRztRQUNyQixJQUFJLEVBQUUsRUFBRTtRQUNSLGNBQWMsRUFBRSxFQUFFO1FBQ2xCLEtBQUssRUFBRSxFQUFFO1FBQ1QsSUFBSSxFQUFFLEVBQUU7UUFDUixPQUFPLEVBQUUsRUFBRTtRQUNYLGNBQWMsRUFBRSxFQUFFO1FBQ2xCLFdBQVcsRUFBRSxFQUFFO1FBQ2YsYUFBYSxFQUFFLEVBQUU7UUFDakIsUUFBUSxFQUFFLEVBQUU7UUFDWixTQUFTLEVBQUUsRUFBRTtRQUNiLFVBQVUsRUFBRSxFQUFFO1FBQ2QsVUFBVSxFQUFFLEVBQUU7UUFDZCxXQUFXLEVBQUUsRUFBRTtRQUNmLFlBQVksRUFBRSxFQUFFO1FBQ2hCLGFBQWEsRUFBRSxFQUFFO1FBQ2pCLFlBQVksRUFBRSxFQUFFO1FBQ2hCLGNBQWMsRUFBRSxFQUFFO1FBQ2xCLFNBQVMsRUFBRSxFQUFFO1FBQ2IsVUFBVSxFQUFFLEVBQUU7UUFDZCxVQUFVLEVBQUUsRUFBRTtRQUNkLFNBQVMsRUFBRSxFQUFFO1FBQ2IsWUFBWSxFQUFFLEVBQUU7UUFDaEIsVUFBVSxFQUFFLEVBQUU7S0FDZixDQUFDO0lBRUssU0FBUyxHQUFHO1FBQ2pCLFNBQVMsRUFBRSxFQUE4RDtRQUN6RSxpQkFBaUIsRUFBRSxFQUlqQjtRQUNGLGtCQUFrQixFQUFFLEVBSWxCO0tBQ0gsQ0FBQztJQUVLLFVBQVUsR0FBRztRQUNsQixLQUFLLEVBQUUsRUFBRTtRQUNULEtBQUssRUFBRSxFQUFFO0tBQ1YsQ0FBQztJQUVLLFFBQVEsR0FBWSxLQUFLLENBQUM7SUFFakMsWUFDcUMsY0FBbUIsRUFDbEIsZUFBb0IsRUFDbEIsV0FBZ0IsRUFDNUIsTUFBVztRQUhGLG1CQUFjLEdBQWQsY0FBYyxDQUFLO1FBQ2xCLG9CQUFlLEdBQWYsZUFBZSxDQUFLO1FBQ2xCLGdCQUFXLEdBQVgsV0FBVyxDQUFLO1FBQzVCLFdBQU0sR0FBTixNQUFNLENBQUs7SUFDcEMsQ0FBQztJQUVKLFFBQVE7UUFDTixJQUFJLENBQUMsU0FBUztZQUNaLElBQUksQ0FBQyxjQUFjLEVBQUUsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLE9BQU8sQ0FBQztRQUN0RSxJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUdELFFBQVEsQ0FBQyxLQUFVO1FBQ2pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksR0FBRyxDQUFDO0lBQzNDLENBQUM7SUFFTyxxQkFBcUI7UUFDM0IsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUNuQixJQUFJLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLG9CQUFvQixDQUFDO1lBQ3BELGNBQWMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMseUJBQXlCLENBQUM7WUFDbkUsS0FBSyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUM7WUFDaEQsSUFBSSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxjQUFjLENBQUM7WUFDOUMsT0FBTyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUM7WUFDN0MsY0FBYyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQztZQUMzRCxXQUFXLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQztZQUNyRCxhQUFhLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDO1lBQ3pELFFBQVEsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDO1lBQzlDLFNBQVMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsWUFBWSxDQUFDO1lBQ2pELFVBQVUsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDO1lBQ25ELFVBQVUsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDO1lBQ25ELFdBQVcsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsY0FBYyxDQUFDO1lBQ3JELFlBQVksRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDO1lBQ3ZELGFBQWEsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUM7WUFDekQsWUFBWSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUM7WUFDdkQsY0FBYyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxpQkFBaUIsQ0FBQztZQUMzRCxTQUFTLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQztZQUNqRCxVQUFVLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQztZQUNuRCxVQUFVLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQztZQUNuRCxTQUFTLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQztZQUNoRCxZQUFZLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQztZQUN2RCxVQUFVLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQztTQUNwRCxDQUFDO0lBQ0osQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN6RCxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ3BFLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDeEUsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUN4RCxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUMxRCxDQUFDO0lBRUQsSUFBSSxRQUFRO1FBQ1YsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDdkMsT0FBTyx3QkFBd0IsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN0RCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDMUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztRQUMvQixDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU8sQ0FBQyxLQUFVO1FBQ2hCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLDZCQUE2QixDQUFDO0lBQ25ELENBQUM7SUFFRCxJQUFJLFdBQVc7UUFPYixNQUFNLElBQUksR0FBRyxFQUFFLENBQUM7UUFFaEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNSLElBQUksRUFBRSxVQUFVO2dCQUNoQixJQUFJLEVBQUUsU0FBa0I7Z0JBQ3hCLEtBQUssRUFBRSxTQUFrQjthQUMxQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxJQUFJLENBQUMsSUFBSSxDQUFDO2dCQUNSLElBQUksRUFBRSxTQUFTO2dCQUNmLElBQUksRUFBRSxTQUFrQjtnQkFDeEIsS0FBSyxFQUFFLFNBQWtCO2dCQUN6QixRQUFRLEVBQUUsSUFBSTtnQkFDZCxJQUFJLEVBQUUsTUFBTTthQUNiLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzFDLElBQUksQ0FBQyxJQUFJLENBQUM7Z0JBQ1IsSUFBSSxFQUFFLE9BQU87Z0JBQ2IsSUFBSSxFQUFFLFNBQWtCO2dCQUN4QixLQUFLLEVBQUUsTUFBZTthQUN2QixDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sZUFBZTtRQUNyQixJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxLQUFLLFVBQVUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxDQUFDO1lBQ3BFLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxlQUFlLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsWUFBWSxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsSUFBSSxXQUFXO1FBQ2IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3JDLElBQUksS0FBSyxLQUFLLENBQUM7WUFBRSxPQUFPLE9BQU8sQ0FBQztRQUNoQyxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDbEMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVELElBQUksZ0JBQWdCO1FBQ2xCLFFBQVEsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3pCLEtBQUssU0FBUztnQkFDWixPQUFPLGVBQWUsQ0FBQztZQUN6QixLQUFLLFNBQVM7Z0JBQ1osT0FBTyxlQUFlLENBQUM7WUFDekIsS0FBSyxPQUFPO2dCQUNWLE9BQU8sYUFBYSxDQUFDO1lBQ3ZCO2dCQUNFLE9BQU8sZUFBZSxDQUFDO1FBQzNCLENBQUM7SUFDSCxDQUFDO0lBRUQsZUFBZTtRQUNiLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNyQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNwQyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDcEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzRCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFBRSxPQUFPO1FBRTlDLElBQUksSUFBSSxHQUFHLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUM7UUFFM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxTQUFTLENBQUM7Z0JBQ3ZELElBQUksRUFBRSxDQUFDLFFBQWEsRUFBRSxFQUFFO29CQUN0QixJQUFJLFFBQVEsRUFBRSxhQUFhLEVBQUUsQ0FBQzt3QkFDNUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO3dCQUM3QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ2pCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUNqQyxDQUFDO2dCQUNILENBQUM7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxlQUFlLEVBQUUscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDO2dCQUMxRCxJQUFJLEVBQUUsQ0FBQyxRQUFhLEVBQUUsRUFBRTtvQkFDdEIsSUFBSSxRQUFRLEVBQUUsYUFBYSxFQUFFLENBQUM7d0JBQzVCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQzt3QkFDOUIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDbEMsQ0FBQztnQkFDSCxDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDO1lBQzNCLE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3RELENBQUM7SUFFRCxTQUFTO1FBQ1AsUUFBUTtRQUNSLDJCQUEyQjtRQUMzQixxQ0FBcUM7UUFDckMsUUFBUTtRQUNSLHVCQUF1QjtRQUN2QixrQkFBa0I7UUFDbEIsaUJBQWlCO0lBQ25CLENBQUM7SUFFRCxpQkFBaUI7UUFDZixJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxVQUFVLENBQUM7UUFDckQsTUFBTSxHQUFHLEdBQUcsOEJBQThCLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQzlFLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxJQUFJLFdBQVcsQ0FBQztRQUM5RCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLG1CQUFtQixFQUFFLENBQUM7WUFDN0MsTUFBTSxHQUFHLEdBQUcsdUJBQXVCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUMzRSxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3QixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0JBQ3RCLHFCQUFxQjtnQkFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDeEIsU0FBUzthQUNWLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQseUJBQXlCO1FBQ3ZCLE9BQU87WUFDTDtnQkFDRSxLQUFLLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksQ0FBQztnQkFDbkUsS0FBSyxFQUFFLFlBQVk7Z0JBQ25CLE1BQU0sRUFBRSxJQUFJO2FBQ2I7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELDBCQUEwQjtRQUN4QixPQUFPO1lBQ0w7Z0JBQ0UsS0FBSyxFQUNILElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsZUFBZSxJQUFJLENBQUM7Z0JBQ3BFLEtBQUssRUFBRSxZQUFZO2dCQUNuQixNQUFNLEVBQUUsSUFBSTthQUNiO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxpQ0FBaUM7SUFDekIsbUJBQW1CLENBQUMsSUFBWTtRQUN0QyxPQUFPLElBQUksR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFDTyx3QkFBd0I7UUFDOUIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ08sc0JBQXNCO1FBQzVCLE9BQU87WUFDTCxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO1NBQ3JFLENBQUM7SUFDSixDQUFDO0lBRUQsb0NBQW9DO0lBQ3BDLGFBQWE7UUFDWCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCwrQkFBK0I7UUFDN0IsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsdUJBQXVCO1FBQ3JCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELGNBQWM7UUFDWixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxzQkFBc0I7UUFDcEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsZ0JBQWdCO1FBQ2QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsdUJBQXVCO1FBQ3JCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELG9CQUFvQjtRQUNsQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxzQkFBc0I7UUFDcEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsaUJBQWlCO1FBQ2YsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0Qsa0JBQWtCO1FBQ2hCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELG1CQUFtQjtRQUNqQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxtQkFBbUI7UUFDakIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0Qsb0JBQW9CO1FBQ2xCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELHFCQUFxQjtRQUNuQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxzQkFBc0I7UUFDcEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QscUJBQXFCO1FBQ25CLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELHVCQUF1QjtRQUNyQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxrQkFBa0I7UUFDaEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsbUJBQW1CO1FBQ2pCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELG1CQUFtQjtRQUNqQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxrQkFBa0I7UUFDaEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QscUJBQXFCO1FBQ25CLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELG1CQUFtQjtRQUNqQixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFDRCxrQkFBa0I7UUFDaEIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0Qsa0JBQWtCO1FBQ2hCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFDRCw0QkFBNEI7UUFDMUIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQztJQUMzQyxDQUFDO0lBQ0QsbUJBQW1CO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7SUFDbEMsQ0FBQztJQUNELGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDO0lBQ2pDLENBQUM7SUFDRCxxQkFBcUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztJQUNwQyxDQUFDO0lBQ0QsNEJBQTRCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxjQUFjLENBQUM7SUFDM0MsQ0FBQztJQUNELHlCQUF5QjtRQUN2QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDO0lBQ3hDLENBQUM7SUFDRCwyQkFBMkI7UUFDekIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztJQUMxQyxDQUFDO0lBQ0Qsc0JBQXNCO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFDckMsQ0FBQztJQUNELHVCQUF1QjtRQUNyQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO0lBQ3RDLENBQUM7SUFDRCx3QkFBd0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQztJQUN2QyxDQUFDO0lBQ0QseUJBQXlCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7SUFDeEMsQ0FBQztJQUNELDBCQUEwQjtRQUN4QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDO0lBQ3pDLENBQUM7SUFDRCwyQkFBMkI7UUFDekIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsMEJBQTBCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7SUFDekMsQ0FBQztJQUNELDRCQUE0QjtRQUMxQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDO0lBQzNDLENBQUM7SUFDRCx1QkFBdUI7UUFDckIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUN0QyxDQUFDO0lBQ0Qsd0JBQXdCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7SUFDdkMsQ0FBQztJQUNELHdCQUF3QjtRQUN0QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO0lBQ3ZDLENBQUM7SUFDRCx1QkFBdUI7UUFDckIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztJQUN0QyxDQUFDO0lBQ0QsMEJBQTBCO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUM7SUFDekMsQ0FBQztJQUNELHdCQUF3QjtRQUN0QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxpQkFBaUI7UUFDZixPQUFPLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ3ZDLENBQUM7d0dBNWRVLG9CQUFvQixrQkE2RHJCLGlCQUFpQixhQUNqQixrQkFBa0IsYUFDbEIsb0JBQW9CLGFBQ3BCLFFBQVE7NEZBaEVQLG9CQUFvQixvV0NuR2pDLHdvTkE2S0EsMkNEdkZJLFlBQVksOFZBQ1osYUFBYSxtR0FwREoscUJBQXFCLHFGQVhyQixrQkFBa0IsbURBc0JsQixvQkFBb0IseURBK0M3Qiw2QkFBNkIsNEhBQzdCLGVBQWU7OzRGQUtOLG9CQUFvQjtrQkFqQmhDLFNBQVM7K0JBQ0Usb0JBQW9CLGNBQ2xCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLGFBQWE7d0JBQ2IsaUJBQWlCO3dCQUNqQixxQkFBcUI7d0JBQ3JCLGFBQWE7d0JBQ2Isa0JBQWtCO3dCQUNsQixvQkFBb0I7d0JBQ3BCLDZCQUE2Qjt3QkFDN0IsZUFBZTtxQkFDaEIsV0FDUSxDQUFDLHNCQUFzQixDQUFDOzswQkFnRTlCLE1BQU07MkJBQUMsaUJBQWlCOzswQkFDeEIsTUFBTTsyQkFBQyxrQkFBa0I7OzBCQUN6QixNQUFNOzJCQUFDLG9CQUFvQjs7MEJBQzNCLE1BQU07MkJBQUMsUUFBUTt5Q0EvRFQsT0FBTztzQkFBZixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csY0FBYztzQkFBdkIsTUFBTTtnQkE0RVAsUUFBUTtzQkFEUCxZQUFZO3VCQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5qZWN0LFxuICBQaXBlLFxuICBQaXBlVHJhbnNmb3JtLFxuICBDVVNUT01fRUxFTUVOVFNfU0NIRU1BLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBUaXRsZUNhc2VQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xuaW1wb3J0IHsgSWNvbkNvbXBvbmVudCB9IGZyb20gXCIuLi9pY29uL2ljb24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBEcm9waVRhZ0NvbXBvbmVudCB9IGZyb20gXCIuLi9kcm9waS10YWcvZHJvcGktdGFnLmNvbXBvbmVudFwiO1xuLy8gaW1wb3J0IHsgSG93bCB9IGZyb20gXCJob3dsZXJcIjsgLy8gRWxpbWluYWRvIHBhcmEgZXZpdGFyIGVycm9yZXMgZGUgZGVwZW5kZW5jaWFcbmltcG9ydCB7IERyb3BpSWx1c3RyYXRpb25JY29uQ29tcG9uZW50IH0gZnJvbSBcIi4uL2Ryb3BpLWlsdXN0cmF0aW9uLWljb24vZHJvcGktaWx1c3RyYXRpb24taWNvbi5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gXCJAbmd4LXRyYW5zbGF0ZS9jb3JlXCI7XG5cbkBQaXBlKHtcbiAgbmFtZTogXCJhZGp1c3ROYW1lXCIsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIEFkanVzdE5hbWVQaXBlU3R1YiBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm0odmFsdWU6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJjdXJyZW5jeVwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZTogXCJ7e3ZhbHVlfX1cIixcbn0pXG5leHBvcnQgY2xhc3MgQ3VycmVuY3lDb21wb25lbnRTdHViIHtcbiAgQElucHV0KCkgdmFsdWU6IGFueTtcbiAgQElucHV0KCkgY2xhc3M6IGFueTtcbiAgQElucHV0KCkgc3R5bGU6IGFueTtcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImFwcC1iZXRhLXRhZ1wiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZTogXCJcIixcbn0pXG5leHBvcnQgY2xhc3MgQmV0YVRhZ0NvbXBvbmVudFN0dWIge31cblxuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0RGF0YSB7XG4gIGlkOiBzdHJpbmcgfCBudW1iZXI7XG4gIHNrdT86IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlPzogc3RyaW5nO1xuICBzYWxlX3ByaWNlOiBudW1iZXI7XG4gIHN1Z2dlc3RlZF9wcmljZTogbnVtYmVyO1xuICBwcml2YXRlX3Byb2R1Y3Q6IGJvb2xlYW47XG4gIHZhcmlhdGlvbl9zdG9jaz86IG51bWJlcjtcbiAgc3RvY2tfc2ltcGxlOiBudW1iZXI7XG4gIGlzX3ZhcmlhdGlvbjogYm9vbGVhbjtcbiAgZmF2b3JpdGU6IGJvb2xlYW47XG4gIHN1cHBsaWVyOiB7XG4gICAgaWQ6IG51bWJlcjtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgY2F0ZWdvcnlfdXNlcjogc3RyaW5nO1xuICAgIGljb24/OiBcInZlcmlmaWVkXCIgfCBcInByZW1pdW1cIiB8IFwiZXhjbHVzaXZlXCI7XG4gIH07XG4gIGNhdGVnb3JpZXM6IEFycmF5PHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gIH0+O1xuICBwcml2YXRlX3VzZXJfc3RvY2s/OiBudW1iZXI7XG4gIGxlZ2FjeV9pbWc/OiBib29sZWFuO1xuICBpbWFnZTogc3RyaW5nO1xuICBjYXRlZ29yeT86IHN0cmluZztcbiAgc3RvY2s/OiBudW1iZXI7XG4gIHN1cHBsaWVyUHJpY2U/OiBudW1iZXI7XG4gIHN1Z2dlc3RlZFByaWNlPzogbnVtYmVyO1xuICBpbWFnZVVybD86IHN0cmluZztcbiAgaXNGYXZvcml0ZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIENhcmRTdGF0ZSA9IFwiZGVmYXVsdFwiIHwgXCJob3ZlclwiIHwgXCJzZWxlY3RcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcImRyb3BpLWNhcmQtcHJvZHVjdFwiLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlLFxuICAgIEljb25Db21wb25lbnQsXG4gICAgRHJvcGlUYWdDb21wb25lbnQsXG4gICAgQ3VycmVuY3lDb21wb25lbnRTdHViLFxuICAgIFRpdGxlQ2FzZVBpcGUsXG4gICAgQWRqdXN0TmFtZVBpcGVTdHViLFxuICAgIEJldGFUYWdDb21wb25lbnRTdHViLFxuICAgIERyb3BpSWx1c3RyYXRpb25JY29uQ29tcG9uZW50LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgXSxcbiAgc2NoZW1hczogW0NVU1RPTV9FTEVNRU5UU19TQ0hFTUFdLFxuICB0ZW1wbGF0ZVVybDogXCIuL2NhcmQtcHJvZHVjdC5jb21wb25lbnQuaHRtbFwiLFxufSlcbmV4cG9ydCBjbGFzcyBDYXJkUHJvZHVjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHByb2R1Y3QhOiBQcm9kdWN0RGF0YTtcbiAgQElucHV0KCkgc3RhdGU6IENhcmRTdGF0ZSA9IFwiZGVmYXVsdFwiO1xuICBASW5wdXQoKSBhUzogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGJldHRhVGVzdGVyOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBvbkFkZFRvQ2FydCA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvZHVjdERhdGE+KCk7XG4gIEBPdXRwdXQoKSBvblByb2R1Y3RDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8UHJvZHVjdERhdGE+KCk7XG4gIEBPdXRwdXQoKSBjaGFuZ2VGYXZvcml0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Qm9vbGVhbj4oKTtcblxuICBwdWJsaWMgaW1hZ2VFcnJvciA9IGZhbHNlO1xuICBwdWJsaWMgYnJhbmROYW1lOiBzdHJpbmcgPSBcIlwiO1xuICBwdWJsaWMgb25GYXZvcml0ZUhvdmVyID0gZmFsc2U7XG5cbiAgcHVibGljIHJhbmRvbUNsYXNzZXMgPSB7XG4gICAgY2FyZDogXCJcIixcbiAgICBpbWFnZUNvbnRhaW5lcjogXCJcIixcbiAgICBpbWFnZTogXCJcIixcbiAgICB0YWdzOiBcIlwiLFxuICAgIHRhZ3NSb3c6IFwiXCIsXG4gICAgZmF2b3JpdGVCdXR0b246IFwiXCIsXG4gICAgcHJvZHVjdEluZm86IFwiXCIsXG4gICAgcHJvZHVjdEhlYWRlcjogXCJcIixcbiAgICBjYXRlZ29yeTogXCJcIixcbiAgICBzdG9ja0luZm86IFwiXCIsXG4gICAgc3RvY2tMYWJlbDogXCJcIixcbiAgICBzdG9ja1ZhbHVlOiBcIlwiLFxuICAgIHByb2R1Y3ROYW1lOiBcIlwiLFxuICAgIHN1cHBsaWVySW5mbzogXCJcIixcbiAgICBzdXBwbGllckxhYmVsOiBcIlwiLFxuICAgIHN1cHBsaWVyTmFtZTogXCJcIixcbiAgICBwcmljZUNvbnRhaW5lcjogXCJcIixcbiAgICBwcmljZUl0ZW06IFwiXCIsXG4gICAgcHJpY2VMYWJlbDogXCJcIixcbiAgICBwcmljZVZhbHVlOiBcIlwiLFxuICAgIHNlcGFyYXRvcjogXCJcIixcbiAgICBhY3Rpb25CdXR0b246IFwiXCIsXG4gICAgYnV0dG9uVGV4dDogXCJcIixcbiAgfTtcblxuICBwdWJsaWMgbWl4ZWREYXRhID0ge1xuICAgIHN0b2NrRGl2czogW10gYXMgQXJyYXk8eyB2YWx1ZTogbnVtYmVyOyBjbGFzczogc3RyaW5nOyBpc1JlYWw6IGJvb2xlYW4gfT4sXG4gICAgc3VwcGxpZXJQcmljZURpdnM6IFtdIGFzIEFycmF5PHtcbiAgICAgIHZhbHVlOiBudW1iZXI7XG4gICAgICBjbGFzczogc3RyaW5nO1xuICAgICAgaXNSZWFsOiBib29sZWFuO1xuICAgIH0+LFxuICAgIHN1Z2dlc3RlZFByaWNlRGl2czogW10gYXMgQXJyYXk8e1xuICAgICAgdmFsdWU6IG51bWJlcjtcbiAgICAgIGNsYXNzOiBzdHJpbmc7XG4gICAgICBpc1JlYWw6IGJvb2xlYW47XG4gICAgfT4sXG4gIH07XG5cbiAgcHVibGljIGZha2VTdHlsZXMgPSB7XG4gICAgc3RvY2s6IFwiXCIsXG4gICAgcHJpY2U6IFwiXCIsXG4gIH07XG5cbiAgcHVibGljIGlzTW9iaWxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChcIlNldHRpbmdzU2VydmljZVwiKSBwcml2YXRlIHNldHRpbmdTZXJ2aWNlOiBhbnksXG4gICAgQEluamVjdChcIlByb2R1Y3RzdFNlcnZpY2VcIikgcHJpdmF0ZSBmYXZvcml0ZVNlcnZpY2U6IGFueSxcbiAgICBASW5qZWN0KFwiT3JkZXJNYW51YWxTZXJ2aWNlXCIpIHByaXZhdGUgb3JkZXJNYW51YWw6IGFueSxcbiAgICBASW5qZWN0KFwiUm91dGVyXCIpIHByaXZhdGUgcm91dGVyOiBhbnksXG4gICkge31cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmJyYW5kTmFtZSA9XG4gICAgICB0aGlzLnNldHRpbmdTZXJ2aWNlPy5nZXRCcmFuZEluZm8oKT8ubmFtZT8udG9Mb3dlckNhc2UoKSB8fCBcImRyb3BpXCI7XG4gICAgdGhpcy5nZW5lcmF0ZVJhbmRvbUNsYXNzZXMoKTtcbiAgICB0aGlzLmdlbmVyYXRlRmFrZVN0eWxlcygpO1xuICAgIHRoaXMuZ2VuZXJhdGVNaXhlZERhdGEoKTtcbiAgICB0aGlzLmNoZWNrU2NyZWVuU2l6ZSgpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChjaGFuZ2VzW1wicHJvZHVjdFwiXSB8fCBjaGFuZ2VzW1wiYVNcIl0pIHtcbiAgICAgIHRoaXMuZ2VuZXJhdGVNaXhlZERhdGEoKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwid2luZG93OnJlc2l6ZVwiLCBbXCIkZXZlbnRcIl0pXG4gIG9uUmVzaXplKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmNoZWNrU2NyZWVuU2l6ZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1NjcmVlblNpemUoKSB7XG4gICAgdGhpcy5pc01vYmlsZSA9IHdpbmRvdy5pbm5lcldpZHRoIDw9IDQyMDtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVSYW5kb21DbGFzc2VzKCkge1xuICAgIHRoaXMucmFuZG9tQ2xhc3NlcyA9IHtcbiAgICAgIGNhcmQ6IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcImRyb3BpLWNhcmQtcHJvZHVjdFwiKSxcbiAgICAgIGltYWdlQ29udGFpbmVyOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJwcm9kdWN0LWltYWdlLWNvbnRhaW5lclwiKSxcbiAgICAgIGltYWdlOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJwcm9kdWN0LWltYWdlXCIpLFxuICAgICAgdGFnczogdGhpcy5nZW5lcmF0ZVJhbmRvbUNsYXNzKFwicHJvZHVjdC10YWdzXCIpLFxuICAgICAgdGFnc1JvdzogdGhpcy5nZW5lcmF0ZVJhbmRvbUNsYXNzKFwidGFncy1yb3dcIiksXG4gICAgICBmYXZvcml0ZUJ1dHRvbjogdGhpcy5nZW5lcmF0ZVJhbmRvbUNsYXNzKFwiZmF2b3JpdGUtYnV0dG9uXCIpLFxuICAgICAgcHJvZHVjdEluZm86IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcInByb2R1Y3QtaW5mb1wiKSxcbiAgICAgIHByb2R1Y3RIZWFkZXI6IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcInByb2R1Y3QtaGVhZGVyXCIpLFxuICAgICAgY2F0ZWdvcnk6IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcImNhdGVnb3J5XCIpLFxuICAgICAgc3RvY2tJbmZvOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJzdG9jay1pbmZvXCIpLFxuICAgICAgc3RvY2tMYWJlbDogdGhpcy5nZW5lcmF0ZVJhbmRvbUNsYXNzKFwic3RvY2stbGFiZWxcIiksXG4gICAgICBzdG9ja1ZhbHVlOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJzdG9jay12YWx1ZVwiKSxcbiAgICAgIHByb2R1Y3ROYW1lOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJwcm9kdWN0LW5hbWVcIiksXG4gICAgICBzdXBwbGllckluZm86IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcInN1cHBsaWVyLWluZm9cIiksXG4gICAgICBzdXBwbGllckxhYmVsOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJzdXBwbGllci1sYWJlbFwiKSxcbiAgICAgIHN1cHBsaWVyTmFtZTogdGhpcy5nZW5lcmF0ZVJhbmRvbUNsYXNzKFwic3VwcGxpZXItbmFtZVwiKSxcbiAgICAgIHByaWNlQ29udGFpbmVyOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJwcmljZS1jb250YWluZXJcIiksXG4gICAgICBwcmljZUl0ZW06IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcInByaWNlLWl0ZW1cIiksXG4gICAgICBwcmljZUxhYmVsOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJwcmljZS1sYWJlbFwiKSxcbiAgICAgIHByaWNlVmFsdWU6IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcInByaWNlLXZhbHVlXCIpLFxuICAgICAgc2VwYXJhdG9yOiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJzZXBhcmF0b3JcIiksXG4gICAgICBhY3Rpb25CdXR0b246IHRoaXMuZ2VuZXJhdGVSYW5kb21DbGFzcyhcImFjdGlvbi1idXR0b25cIiksXG4gICAgICBidXR0b25UZXh0OiB0aGlzLmdlbmVyYXRlUmFuZG9tQ2xhc3MoXCJidXR0b24tdGV4dFwiKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZU1peGVkRGF0YSgpIHtcbiAgICB0aGlzLm1peGVkRGF0YS5zdG9ja0RpdnMgPSB0aGlzLmdlbmVyYXRlTWl4ZWRTdG9ja0RpdnMoKTtcbiAgICB0aGlzLm1peGVkRGF0YS5zdXBwbGllclByaWNlRGl2cyA9IHRoaXMuZ2V0TWl4ZWRTdXBwbGllclByaWNlRGl2cygpO1xuICAgIHRoaXMubWl4ZWREYXRhLnN1Z2dlc3RlZFByaWNlRGl2cyA9IHRoaXMuZ2V0TWl4ZWRTdWdnZXN0ZWRQcmljZURpdnMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVGYWtlU3R5bGVzKCkge1xuICAgIHRoaXMuZmFrZVN0eWxlcy5zdG9jayA9IHRoaXMuZ2VuZXJhdGVGYWtlU3R5bGVWYXJpYW50KCk7XG4gICAgdGhpcy5mYWtlU3R5bGVzLnByaWNlID0gdGhpcy5nZW5lcmF0ZUZha2VTdHlsZVZhcmlhbnQoKTtcbiAgfVxuXG4gIGdldCBpbWFnZVVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLnByb2R1Y3QgJiYgdGhpcy5wcm9kdWN0LmltYWdlKSB7XG4gICAgICByZXR1cm4gYGh0dHBzOi8vaW1nLmRyb3BpLmNvLyR7dGhpcy5wcm9kdWN0LmltYWdlfWA7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvZHVjdCAmJiB0aGlzLnByb2R1Y3QuaW1hZ2VVcmwpIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2R1Y3QuaW1hZ2VVcmw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIG9uRXJyb3IoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuaW1hZ2VFcnJvciA9IHRydWU7XG4gICAgZXZlbnQudGFyZ2V0LnNyYyA9IFwiLi9hc3NldHMvdXRpbHMvbm8taW1hZ2UuanBnXCI7XG4gIH1cblxuICBnZXQgcHJvZHVjdFRhZ3MoKTogQXJyYXk8e1xuICAgIHRleHQ6IHN0cmluZztcbiAgICB0eXBlOiBcInByaW1hcnlcIiB8IFwic2Vjb25kYXJ5XCI7XG4gICAgc3RhdGU6IFwiZGVmYXVsdFwiIHwgXCJ3YXJuaW5nXCIgfCBcImluZm9cIjtcbiAgICBzaG93SWNvbj86IGJvb2xlYW47XG4gICAgaWNvbj86IHN0cmluZztcbiAgfT4ge1xuICAgIGNvbnN0IHRhZ3MgPSBbXTtcblxuICAgIGlmICh0aGlzLnByb2R1Y3Q/LnR5cGU/LmluY2x1ZGVzKFwidmFyaWFibGVcIikpIHtcbiAgICAgIHRhZ3MucHVzaCh7XG4gICAgICAgIHRleHQ6IFwiVmFyaWFibGVcIixcbiAgICAgICAgdHlwZTogXCJwcmltYXJ5XCIgYXMgY29uc3QsXG4gICAgICAgIHN0YXRlOiBcImRlZmF1bHRcIiBhcyBjb25zdCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb2R1Y3Q/LnR5cGU/LmluY2x1ZGVzKFwicHJpdmFkb1wiKSkge1xuICAgICAgdGFncy5wdXNoKHtcbiAgICAgICAgdGV4dDogXCJQcml2YWRvXCIsXG4gICAgICAgIHR5cGU6IFwicHJpbWFyeVwiIGFzIGNvbnN0LFxuICAgICAgICBzdGF0ZTogXCJ3YXJuaW5nXCIgYXMgY29uc3QsXG4gICAgICAgIHNob3dJY29uOiB0cnVlLFxuICAgICAgICBpY29uOiBcIkxvY2tcIixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnByb2R1Y3Q/LnR5cGU/LmluY2x1ZGVzKFwiY29tYm9cIikpIHtcbiAgICAgIHRhZ3MucHVzaCh7XG4gICAgICAgIHRleHQ6IFwiQ29tYm9cIixcbiAgICAgICAgdHlwZTogXCJwcmltYXJ5XCIgYXMgY29uc3QsXG4gICAgICAgIHN0YXRlOiBcImluZm9cIiBhcyBjb25zdCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0YWdzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcm9kdWN0U3RvY2soKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5wcm9kdWN0Py50eXBlID09PSBcIlZBUklBQkxFXCIgJiYgdGhpcy5wcm9kdWN0Py5pc192YXJpYXRpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnByb2R1Y3Q/LnZhcmlhdGlvbl9zdG9jayB8fCAwO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcm9kdWN0Py5zdG9ja19zaW1wbGUgfHwgMDtcbiAgfVxuXG4gIGdldCBzdG9ja1N0YXR1cygpOiBcInN1Y2Nlc3NcIiB8IFwid2FybmluZ1wiIHwgXCJlcnJvclwiIHtcbiAgICBjb25zdCBzdG9jayA9IHRoaXMuZ2V0UHJvZHVjdFN0b2NrKCk7XG4gICAgaWYgKHN0b2NrID09PSAwKSByZXR1cm4gXCJlcnJvclwiO1xuICAgIGlmIChzdG9jayA8PSAxMCkgcmV0dXJuIFwid2FybmluZ1wiO1xuICAgIHJldHVybiBcInN1Y2Nlc3NcIjtcbiAgfVxuXG4gIGdldCBzdG9ja1N0YXR1c0NsYXNzKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLnN0b2NrU3RhdHVzKSB7XG4gICAgICBjYXNlIFwic3VjY2Vzc1wiOlxuICAgICAgICByZXR1cm4gXCJzdG9jay1zdWNjZXNzXCI7XG4gICAgICBjYXNlIFwid2FybmluZ1wiOlxuICAgICAgICByZXR1cm4gXCJzdG9jay13YXJuaW5nXCI7XG4gICAgICBjYXNlIFwiZXJyb3JcIjpcbiAgICAgICAgcmV0dXJuIFwic3RvY2stZXJyb3JcIjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBcInN0b2NrLXN1Y2Nlc3NcIjtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVBZGRUb0NhcnQoKTogdm9pZCB7XG4gICAgY29uc3Qgc3RvY2sgPSB0aGlzLmdldFByb2R1Y3RTdG9jaygpO1xuICAgIGlmIChzdG9jayA+IDApIHtcbiAgICAgIHRoaXMub25BZGRUb0NhcnQuZW1pdCh0aGlzLnByb2R1Y3QpO1xuICAgICAgaWYgKHRoaXMub3JkZXJNYW51YWwpIHtcbiAgICAgICAgdGhpcy5vcmRlck1hbnVhbC5zZXRNb2RhbE9wZW4odHJ1ZSk7XG4gICAgICAgIHRoaXMub3JkZXJNYW51YWwuY2xlYXJQcm9kdWN0c0lkcygpO1xuICAgICAgICB0aGlzLm9yZGVyTWFudWFsLnNldFByb2R1Y3RzSWRzKE51bWJlcih0aGlzLnByb2R1Y3QuaWQpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVGYXZvcml0ZVRvZ2dsZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJvZHVjdCB8fCAhdGhpcy5wcm9kdWN0LmlkKSByZXR1cm47XG5cbiAgICBsZXQgYm9keSA9IHsgcHJvZHVjdF9pZDogdGhpcy5wcm9kdWN0LmlkIH07XG5cbiAgICBpZiAoIXRoaXMucHJvZHVjdC5mYXZvcml0ZSkge1xuICAgICAgdGhpcy5mYXZvcml0ZVNlcnZpY2U/LmFkZEZhdm9yaXRlUHJvZHVjdChib2R5KS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZT8uaXNfc3VjY2Vzc2Z1bCkge1xuICAgICAgICAgICAgdGhpcy5wcm9kdWN0LmZhdm9yaXRlID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMucGxheUF1ZGlvKCk7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZUZhdm9yaXRlLmVtaXQodHJ1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZmF2b3JpdGVTZXJ2aWNlPy5yZW1vdmVGYXZvcml0ZVByb2R1Y3QoYm9keSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2U/LmlzX3N1Y2Nlc3NmdWwpIHtcbiAgICAgICAgICAgIHRoaXMucHJvZHVjdC5mYXZvcml0ZSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5wbGF5QXVkaW8oKTtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlRmF2b3JpdGUuZW1pdChmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0RmF2b3JpdGVJY29uQ29sb3IoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5wcm9kdWN0Py5mYXZvcml0ZSkge1xuICAgICAgcmV0dXJuIFwiI2ZmZlwiO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5vbkZhdm9yaXRlSG92ZXIgPyBcIiNmNDlhM2RcIiA6IFwiIzg1OGVhNlwiO1xuICB9XG5cbiAgcGxheUF1ZGlvKCkge1xuICAgIC8vIHRyeSB7XG4gICAgLy8gICBsZXQgc291bmQgPSBuZXcgSG93bCh7XG4gICAgLy8gICAgIHNyYzogW1wiYXNzZXRzL2F1ZGlvL3BvcC5tcDNcIl0sXG4gICAgLy8gICB9KTtcbiAgICAvLyAgIHNvdW5kLnZvbHVtZSgwLjQpO1xuICAgIC8vICAgc291bmQucGxheSgpO1xuICAgIC8vIH0gY2F0Y2ggKGUpIHt9XG4gIH1cblxuICBnZXRQcm9kdWN0RGV0YWlscygpOiB2b2lkIHtcbiAgICBsZXQgbmFtZVByb2R1Y3RVcmwgPSB0aGlzLnByb2R1Y3QubmFtZSB8fCBcInByb2R1Y3RvXCI7XG4gICAgY29uc3QgdXJsID0gYC9kYXNoYm9hcmQvcHJvZHVjdC1kZXRhaWxzLyR7dGhpcy5wcm9kdWN0LmlkfS8ke25hbWVQcm9kdWN0VXJsfWA7XG4gICAgd2luZG93Lm9wZW4odXJsLCBcIl9ibGFua1wiKTtcbiAgfVxuXG4gIGdldFByb3ZpZGVyc0RldGFpbHMoKTogdm9pZCB7XG4gICAgY29uc3QgY2xlYW5OYW1lID0gdGhpcy5wcm9kdWN0Py5zdXBwbGllcj8ubmFtZSB8fCBcInByb3ZlZWRvclwiO1xuICAgIGlmICh0aGlzLnJvdXRlcj8udXJsID09PSBcIi9kYXNoYm9hcmQvc2VhcmNoXCIpIHtcbiAgICAgIGNvbnN0IHVybCA9IGAvZGFzaGJvYXJkL3Byb3ZpZGVyLyR7dGhpcy5wcm9kdWN0LnN1cHBsaWVyLmlkfS8ke2NsZWFuTmFtZX1gO1xuICAgICAgd2luZG93Lm9wZW4odXJsLCBcIl9ibGFua1wiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yb3V0ZXI/Lm5hdmlnYXRlPy4oW1xuICAgICAgICBcIi9kYXNoYm9hcmQvcHJvdmlkZXJcIixcbiAgICAgICAgdGhpcy5wcm9kdWN0LnN1cHBsaWVyLmlkLFxuICAgICAgICBjbGVhbk5hbWUsXG4gICAgICBdKTtcbiAgICB9XG4gIH1cblxuICBnZXRNaXhlZFN1cHBsaWVyUHJpY2VEaXZzKCkge1xuICAgIHJldHVybiBbXG4gICAgICB7XG4gICAgICAgIHZhbHVlOiB0aGlzLnByb2R1Y3Q/LnN1cHBsaWVyUHJpY2UgfHwgdGhpcy5wcm9kdWN0Py5zYWxlX3ByaWNlIHx8IDAsXG4gICAgICAgIGNsYXNzOiBcInByaWNlLXJlYWxcIixcbiAgICAgICAgaXNSZWFsOiB0cnVlLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG5cbiAgZ2V0TWl4ZWRTdWdnZXN0ZWRQcmljZURpdnMoKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgdmFsdWU6XG4gICAgICAgICAgdGhpcy5wcm9kdWN0Py5zdWdnZXN0ZWRQcmljZSB8fCB0aGlzLnByb2R1Y3Q/LnN1Z2dlc3RlZF9wcmljZSB8fCAwLFxuICAgICAgICBjbGFzczogXCJwcmljZS1yZWFsXCIsXG4gICAgICAgIGlzUmVhbDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgXTtcbiAgfVxuXG4gIGhhc1N0b2NrKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmdldFByb2R1Y3RTdG9jaygpID4gMDtcbiAgfVxuXG4gIC8vIEhlbHBlciBmYWtlcyBmb3IgYW50aS1zY3JhcGluZ1xuICBwcml2YXRlIGdlbmVyYXRlUmFuZG9tQ2xhc3MoYmFzZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYmFzZSArIFwiLVwiICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMiwgNyk7XG4gIH1cbiAgcHJpdmF0ZSBnZW5lcmF0ZUZha2VTdHlsZVZhcmlhbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJcIjtcbiAgfVxuICBwcml2YXRlIGdlbmVyYXRlTWl4ZWRTdG9ja0RpdnMoKTogYW55W10ge1xuICAgIHJldHVybiBbXG4gICAgICB7IHZhbHVlOiB0aGlzLmdldFByb2R1Y3RTdG9jaygpLCBjbGFzczogXCJzdG9jay1yZWFsXCIsIGlzUmVhbDogdHJ1ZSB9LFxuICAgIF07XG4gIH1cblxuICAvLyBSZS1hZGRlZCBtaXNzaW5nIHRlbXBsYXRlIG1ldGhvZHNcbiAgZ2V0Q2FyZFN0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0UmFuZG9tUHJvdmlkZXJDYXRlZ29yeVN0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0SW1hZ2VDb250YWluZXJTdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldEltYWdlU3R5bGVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBnZXRUYWdzQ29udGFpbmVyU3R5bGVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBnZXRUYWdzUm93U3R5bGVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBnZXRGYXZvcml0ZUJ1dHRvblN0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0UHJvZHVjdEluZm9TdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldFByb2R1Y3RIZWFkZXJTdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldENhdGVnb3J5U3R5bGVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBnZXRTdG9ja0luZm9TdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldFN0b2NrTGFiZWxTdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldFN0b2NrVmFsdWVTdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldFByb2R1Y3ROYW1lU3R5bGVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBnZXRTdXBwbGllckluZm9TdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldFN1cHBsaWVyTGFiZWxTdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldFN1cHBsaWVyTmFtZVN0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0UHJpY2VDb250YWluZXJTdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldFByaWNlSXRlbVN0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0UHJpY2VMYWJlbFN0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0UHJpY2VWYWx1ZVN0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0U2VwYXJhdG9yU3R5bGVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuICBnZXRBY3Rpb25CdXR0b25TdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldEJ1dHRvblRleHRTdHlsZXMoKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG4gIGdldEZha2VTdG9ja1N0eWxlcygpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgZ2V0RmFrZVByaWNlU3R5bGVzKCkge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGdldFJhbmRvbUNhcmRDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLmNhcmQ7XG4gIH1cbiAgZ2V0UmFuZG9tSW1hZ2VDb250YWluZXJDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLmltYWdlQ29udGFpbmVyO1xuICB9XG4gIGdldFJhbmRvbUltYWdlQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5pbWFnZTtcbiAgfVxuICBnZXRSYW5kb21UYWdzQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy50YWdzO1xuICB9XG4gIGdldFJhbmRvbVRhZ3NSb3dDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLnRhZ3NSb3c7XG4gIH1cbiAgZ2V0UmFuZG9tRmF2b3JpdGVCdXR0b25DbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLmZhdm9yaXRlQnV0dG9uO1xuICB9XG4gIGdldFJhbmRvbVByb2R1Y3RJbmZvQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5wcm9kdWN0SW5mbztcbiAgfVxuICBnZXRSYW5kb21Qcm9kdWN0SGVhZGVyQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5wcm9kdWN0SGVhZGVyO1xuICB9XG4gIGdldFJhbmRvbUNhdGVnb3J5Q2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5jYXRlZ29yeTtcbiAgfVxuICBnZXRSYW5kb21TdG9ja0luZm9DbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLnN0b2NrSW5mbztcbiAgfVxuICBnZXRSYW5kb21TdG9ja0xhYmVsQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5zdG9ja0xhYmVsO1xuICB9XG4gIGdldFJhbmRvbVByb2R1Y3ROYW1lQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5wcm9kdWN0TmFtZTtcbiAgfVxuICBnZXRSYW5kb21TdXBwbGllckluZm9DbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLnN1cHBsaWVySW5mbztcbiAgfVxuICBnZXRSYW5kb21TdXBwbGllckxhYmVsQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5zdXBwbGllckxhYmVsO1xuICB9XG4gIGdldFJhbmRvbVN1cHBsaWVyTmFtZUNsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmRvbUNsYXNzZXMuc3VwcGxpZXJOYW1lO1xuICB9XG4gIGdldFJhbmRvbVByaWNlQ29udGFpbmVyQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5wcmljZUNvbnRhaW5lcjtcbiAgfVxuICBnZXRSYW5kb21QcmljZUl0ZW1DbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLnByaWNlSXRlbTtcbiAgfVxuICBnZXRSYW5kb21QcmljZUxhYmVsQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5wcmljZUxhYmVsO1xuICB9XG4gIGdldFJhbmRvbVByaWNlVmFsdWVDbGFzcygpIHtcbiAgICByZXR1cm4gdGhpcy5yYW5kb21DbGFzc2VzLnByaWNlVmFsdWU7XG4gIH1cbiAgZ2V0UmFuZG9tU2VwYXJhdG9yQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5zZXBhcmF0b3I7XG4gIH1cbiAgZ2V0UmFuZG9tQWN0aW9uQnV0dG9uQ2xhc3MoKSB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tQ2xhc3Nlcy5hY3Rpb25CdXR0b247XG4gIH1cbiAgZ2V0UmFuZG9tQnV0dG9uVGV4dENsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLnJhbmRvbUNsYXNzZXMuYnV0dG9uVGV4dDtcbiAgfVxuXG4gIGdldE1peGVkU3RvY2tEaXZzKCkge1xuICAgIHJldHVybiB0aGlzLmdlbmVyYXRlTWl4ZWRTdG9ja0RpdnMoKTtcbiAgfVxufVxuIiwiPGRpdiBbY2xhc3NdPVwiZ2V0UmFuZG9tQ2FyZENsYXNzKClcIiBbc3R5bGVdPVwiZ2V0Q2FyZFN0eWxlcygpXCIgKGNsaWNrKT1cImdldFByb2R1Y3REZXRhaWxzKClcIj5cbiAgPGFwcC1iZXRhLXRhZyAqbmdJZj1cImJldHRhVGVzdGVyXCI+PC9hcHAtYmV0YS10YWc+XG4gIDwhLS0gQ29udGVuZWRvciBkZSBpbWFnZW4gY29uIGFsdHVyYSBmaWphIGRlIDIxNHB4IGNvbW8gZW4gRmlnbWEgLS0+XG4gIDxkaXYgW2NsYXNzXT1cImdldFJhbmRvbUltYWdlQ29udGFpbmVyQ2xhc3MoKVwiIFtzdHlsZV09XCJnZXRJbWFnZUNvbnRhaW5lclN0eWxlcygpXCI+XG4gICAgPGRpdiBbY2xhc3NdPVwiZ2V0UmFuZG9tSW1hZ2VDbGFzcygpXCIgW3N0eWxlXT1cImdldEltYWdlU3R5bGVzKClcIj5cbiAgICAgIDwhLS0gSW1hZ2VuIGRlbCBwcm9kdWN0byBjb24gbWFuZWpvIGRlIGVycm9yZXMgLS0+XG4gICAgICA8aW1nXG4gICAgICAgIFtzcmNdPVwiaW1hZ2VVcmxcIlxuICAgICAgICBbYWx0XT1cInByb2R1Y3Q/Lm5hbWUgfHwgJ1Byb2R1Y3QgSW1hZ2UnXCJcbiAgICAgICAgKGVycm9yKT1cIm9uRXJyb3IoJGV2ZW50KVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ2Vycm9yLWltZyc6IGltYWdlRXJyb3IgfVwiXG4gICAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgb2JqZWN0LWZpdDogY292ZXI7IGJvcmRlci1yYWRpdXM6IDhweFwiXG4gICAgICAvPlxuXG4gICAgICA8IS0tIFRhZ3Mgc3VwZXJwdWVzdG9zIGVuIGxhIGVzcXVpbmEgc3VwZXJpb3IgaXpxdWllcmRhIC0tPlxuICAgICAgPGRpdlxuICAgICAgICBbY2xhc3NdPVwiZ2V0UmFuZG9tVGFnc0NsYXNzKClcIlxuICAgICAgICBbc3R5bGVdPVwiZ2V0VGFnc0NvbnRhaW5lclN0eWxlcygpXCJcbiAgICAgICAgKm5nSWY9XCJwcm9kdWN0VGFncz8ubGVuZ3RoID4gMFwiXG4gICAgICA+XG4gICAgICAgIDxkaXYgW2NsYXNzXT1cImdldFJhbmRvbVRhZ3NSb3dDbGFzcygpXCIgW3N0eWxlXT1cImdldFRhZ3NSb3dTdHlsZXMoKVwiPlxuICAgICAgICAgIDxhcHAtZHJvcGktdGFnXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgdGFnIG9mIHByb2R1Y3RUYWdzLnNsaWNlKDAsIDIpXCJcbiAgICAgICAgICAgIFt0eXBlXT1cInRhZz8udHlwZVwiXG4gICAgICAgICAgICBbc3RhdGVdPVwidGFnPy5zdGF0ZVwiXG4gICAgICAgICAgICBbc2hvd0ljb25dPVwidGFnPy5zaG93SWNvblwiXG4gICAgICAgICAgICBbaWNvbl09XCJ0YWc/Lmljb25cIlxuICAgICAgICAgICAgW3RleHRdPVwidGFnPy50ZXh0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9hcHAtZHJvcGktdGFnPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIEJvdMOzbiBkZSBmYXZvcml0byBzdXBlcnB1ZXN0byBlbiBsYSBlc3F1aW5hIGluZmVyaW9yIGRlcmVjaGEgLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIFtjbGFzc109XCJnZXRSYW5kb21GYXZvcml0ZUJ1dHRvbkNsYXNzKClcIlxuICAgICAgICBbbmdDbGFzc109XCJ7ICdmYXZvcml0ZS1idXR0b24nOiB0cnVlLCAnZmF2b3JpdGUtYWN0aXZlJzogcHJvZHVjdD8uZmF2b3JpdGUgfVwiXG4gICAgICAgIFtzdHlsZV09XCJnZXRGYXZvcml0ZUJ1dHRvblN0eWxlcygpXCJcbiAgICAgICAgKGNsaWNrKT1cImhhbmRsZUZhdm9yaXRlVG9nZ2xlKCk7ICRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiXG4gICAgICA+XG4gICAgICAgIDxhcHAtaWNvblxuICAgICAgICAgIFtuYW1lXT1cInByb2R1Y3Q/LmZhdm9yaXRlID8gJ0hlYXJ0LXNvbGlkJyA6ICdIZWFydCdcIlxuICAgICAgICAgIHdpZHRoPVwiMThweFwiXG4gICAgICAgICAgaGVpZ2h0PVwiMThweFwiXG4gICAgICAgICAgW2NvbG9yXT1cInByb2R1Y3Q/LmZhdm9yaXRlID8gJyNmZmYnIDogJyM4NThlYTYnXCJcbiAgICAgICAgICBbc3R5bGVdPVwieyBkaXNwbGF5OiAnZmxleCcsICdhbGlnbi1pdGVtcyc6ICdjZW50ZXInLCAnanVzdGlmeS1jb250ZW50JzogJ2NlbnRlcicgfVwiXG4gICAgICAgID5cbiAgICAgICAgPC9hcHAtaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIEluZm9ybWFjacOzbiBkZWwgcHJvZHVjdG8gLS0+XG4gIDxkaXYgW2NsYXNzXT1cImdldFJhbmRvbVByb2R1Y3RJbmZvQ2xhc3MoKVwiIFtzdHlsZV09XCJnZXRQcm9kdWN0SW5mb1N0eWxlcygpXCI+XG4gICAgPCEtLSBIZWFkZXIgY29uIGNhdGVnb3LDrWEgeSBzdG9jayAtLT5cbiAgICA8ZGl2IFtjbGFzc109XCJnZXRSYW5kb21Qcm9kdWN0SGVhZGVyQ2xhc3MoKVwiIFtzdHlsZV09XCJnZXRQcm9kdWN0SGVhZGVyU3R5bGVzKClcIj5cbiAgICAgIDxkcm9waS1pbHVzdHJhdGlvbi1pY29uXG4gICAgICAgICpuZ0lmPVwicHJvZHVjdD8uc3VwcGxpZXI/Lmljb25cIlxuICAgICAgICBbc3R5bGVdPVwiZ2V0UmFuZG9tUHJvdmlkZXJDYXRlZ29yeVN0eWxlcygpXCJcbiAgICAgICAgW3R5cGVdPVwiJ2luc2lnbmlhJ1wiXG4gICAgICAgIFtzdGF0ZUluc2lnbmlhXT1cInByb2R1Y3Q/LnN1cHBsaWVyPy5pY29uXCJcbiAgICAgICAgW3RhZ1Byb2R1Y3RdPVwidHJ1ZVwiXG4gICAgICA+PC9kcm9waS1pbHVzdHJhdGlvbi1pY29uPlxuXG4gICAgICA8c3BhblxuICAgICAgICBbY2xhc3NdPVwiZ2V0UmFuZG9tQ2F0ZWdvcnlDbGFzcygpXCJcbiAgICAgICAgW3N0eWxlXT1cImdldENhdGVnb3J5U3R5bGVzKClcIlxuICAgICAgICAqbmdJZj1cInByb2R1Y3Q/LmNhdGVnb3JpZXMgJiYgcHJvZHVjdD8uY2F0ZWdvcmllcy5sZW5ndGggPiAwXCJcbiAgICAgICAgPnt7IHByb2R1Y3Q/LmNhdGVnb3JpZXNbMF0/Lm5hbWUgfCBhZGp1c3ROYW1lIH19PC9zcGFuXG4gICAgICA+XG5cbiAgICAgIDxkaXYgW2NsYXNzXT1cImdldFJhbmRvbVN0b2NrSW5mb0NsYXNzKClcIiBbc3R5bGVdPVwiZ2V0U3RvY2tJbmZvU3R5bGVzKClcIj5cbiAgICAgICAgPHNwYW4gW2NsYXNzXT1cImdldFJhbmRvbVN0b2NrTGFiZWxDbGFzcygpXCIgW3N0eWxlXT1cImdldFN0b2NrTGFiZWxTdHlsZXMoKVwiPnt7IFwic3RvY2tcIiB8IHRyYW5zbGF0ZSB9fTo8L3NwYW4+XG5cbiAgICAgICAgPCEtLSBTdG9ja3MgbWV6Y2xhZG9zIGFsZWF0b3JpYW1lbnRlIChyZWFsICsgZmFsc29zKSAtLT5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAqbmdGb3I9XCJsZXQgc3RvY2tJdGVtIG9mIGdldE1peGVkU3RvY2tEaXZzKClcIlxuICAgICAgICAgIFtjbGFzc109XCJzdG9ja0l0ZW0uY2xhc3NcIlxuICAgICAgICAgIFtzdHlsZV09XCJzdG9ja0l0ZW0uaXNSZWFsID8gZ2V0U3RvY2tWYWx1ZVN0eWxlcygpIDogZ2V0RmFrZVN0b2NrU3R5bGVzKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgc3RvY2tJdGVtLnZhbHVlIH19XG4gICAgICAgIDwvc3Bhbj5cblxuICAgICAgICA8c3BhblxuICAgICAgICAgICpuZ0lmPVwicHJvZHVjdD8ucHJpdmF0ZV91c2VyX3N0b2NrICYmIHByb2R1Y3Q/LnByaXZhdGVfdXNlcl9zdG9jayA+IDBcIlxuICAgICAgICAgIGNsYXNzPVwic3RvY2stcHJpdmF0ZS11c2VyXCJcbiAgICAgICAgICBbc3R5bGVdPVwie1xuICAgICAgICAgICAgJ2ZvbnQtd2VpZ2h0JzogJzUwMCcsXG4gICAgICAgICAgICBwYWRkaW5nOiAnMHB4IDZweCcsXG4gICAgICAgICAgICAnbWFyZ2luLWxlZnQnOiAnNnB4JyxcbiAgICAgICAgICAgICdib3JkZXItcmFkaXVzJzogJzRweCcsXG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiAndmFyKC0tU3VjY2Vzcy1TdWNjZXNzLTUwLCAjZTdmOGYzKScsXG4gICAgICAgICAgICBjb2xvcjogJ3ZhcigtLVN1Y2Nlc3MtU3VjY2Vzcy01MDAsICMwYWJiODcpJyxcbiAgICAgICAgICAgICd0ZXh0LWFsaWduJzogJ2NlbnRlcidcbiAgICAgICAgICB9XCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHByb2R1Y3Q/LnByaXZhdGVfdXNlcl9zdG9jayB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTm9tYnJlIGRlbCBwcm9kdWN0byAtLT5cbiAgICA8aDMgW2NsYXNzXT1cImdldFJhbmRvbVByb2R1Y3ROYW1lQ2xhc3MoKVwiIFtzdHlsZV09XCJnZXRQcm9kdWN0TmFtZVN0eWxlcygpXCI+XG4gICAgICB7eyBwcm9kdWN0Py5uYW1lIHwgYWRqdXN0TmFtZSB9fVxuICAgIDwvaDM+XG5cbiAgICA8IS0tIFByb3ZlZWRvciAtLT5cbiAgICA8ZGl2IFtjbGFzc109XCJnZXRSYW5kb21TdXBwbGllckluZm9DbGFzcygpXCIgW3N0eWxlXT1cImdldFN1cHBsaWVySW5mb1N0eWxlcygpXCI+XG4gICAgICA8c3BhbiBbY2xhc3NdPVwiZ2V0UmFuZG9tU3VwcGxpZXJMYWJlbENsYXNzKClcIiBbc3R5bGVdPVwiZ2V0U3VwcGxpZXJMYWJlbFN0eWxlcygpXCJcbiAgICAgICAgPnt7IFwic3VwcGxpZXJcIiB8IHRyYW5zbGF0ZSB9fTo8L3NwYW5cbiAgICAgID5cbiAgICAgIDxzcGFuXG4gICAgICAgIFtjbGFzc109XCJnZXRSYW5kb21TdXBwbGllck5hbWVDbGFzcygpXCJcbiAgICAgICAgW3N0eWxlXT1cImdldFN1cHBsaWVyTmFtZVN0eWxlcygpXCJcbiAgICAgICAgKGNsaWNrKT1cImdldFByb3ZpZGVyc0RldGFpbHMoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgICAgICAgPnt7IHByb2R1Y3Q/LnN1cHBsaWVyPy5uYW1lIHwgYWRqdXN0TmFtZSB9fTwvc3BhblxuICAgICAgPlxuICAgIDwvZGl2PlxuXG4gICAgPCEtLSBQcmVjaW9zIC0tPlxuICAgIDxkaXYgW2NsYXNzXT1cImdldFJhbmRvbVByaWNlQ29udGFpbmVyQ2xhc3MoKVwiIFtzdHlsZV09XCJnZXRQcmljZUNvbnRhaW5lclN0eWxlcygpXCI+XG4gICAgICA8ZGl2IFtjbGFzc109XCJnZXRSYW5kb21QcmljZUl0ZW1DbGFzcygpXCIgW3N0eWxlXT1cImdldFByaWNlSXRlbVN0eWxlcygpXCI+XG4gICAgICAgIDxzcGFuIFtjbGFzc109XCJnZXRSYW5kb21QcmljZUxhYmVsQ2xhc3MoKVwiIFtzdHlsZV09XCJnZXRQcmljZUxhYmVsU3R5bGVzKClcIlxuICAgICAgICAgID57eyBcInN1cHBsaWVyIHByaWNlXCIgfCB0cmFuc2xhdGUgfX08L3NwYW5cbiAgICAgICAgPlxuXG4gICAgICAgIDwhLS0gUHJlY2lvcyBkZSBwcm92ZWVkb3IgbWV6Y2xhZG9zIGFsZWF0b3JpYW1lbnRlIChyZWFsICsgZmFsc29zKSAtLT5cbiAgICAgICAgPGN1cnJlbmN5XG4gICAgICAgICAgKm5nRm9yPVwibGV0IHByaWNlSXRlbSBvZiBnZXRNaXhlZFN1cHBsaWVyUHJpY2VEaXZzKClcIlxuICAgICAgICAgIFtjbGFzc109XCJwcmljZUl0ZW0uY2xhc3NcIlxuICAgICAgICAgIFtzdHlsZV09XCJwcmljZUl0ZW0uaXNSZWFsID8gZ2V0UHJpY2VWYWx1ZVN0eWxlcygpIDogZ2V0RmFrZVByaWNlU3R5bGVzKClcIlxuICAgICAgICAgIFt2YWx1ZV09XCJwcmljZUl0ZW0udmFsdWVcIlxuICAgICAgICA+XG4gICAgICAgIDwvY3VycmVuY3k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgW2NsYXNzXT1cImdldFJhbmRvbVByaWNlSXRlbUNsYXNzKClcIiBbc3R5bGVdPVwiZ2V0UHJpY2VJdGVtU3R5bGVzKClcIj5cbiAgICAgICAgPHNwYW4gW2NsYXNzXT1cImdldFJhbmRvbVByaWNlTGFiZWxDbGFzcygpXCIgW3N0eWxlXT1cImdldFByaWNlTGFiZWxTdHlsZXMoKVwiXG4gICAgICAgICAgPnt7IFwic3VnZ2VzdGVkIHByaWNlXCIgfCB0cmFuc2xhdGUgfX08L3NwYW5cbiAgICAgICAgPlxuXG4gICAgICAgIDwhLS0gUHJlY2lvcyBzdWdlcmlkb3MgbWV6Y2xhZG9zIGFsZWF0b3JpYW1lbnRlIChyZWFsICsgZmFsc29zKSAtLT5cbiAgICAgICAgPGN1cnJlbmN5XG4gICAgICAgICAgKm5nRm9yPVwibGV0IHByaWNlSXRlbSBvZiBnZXRNaXhlZFN1Z2dlc3RlZFByaWNlRGl2cygpXCJcbiAgICAgICAgICBbY2xhc3NdPVwicHJpY2VJdGVtLmNsYXNzXCJcbiAgICAgICAgICBbc3R5bGVdPVwicHJpY2VJdGVtLmlzUmVhbCA/IGdldFByaWNlVmFsdWVTdHlsZXMoKSA6IGdldEZha2VQcmljZVN0eWxlcygpXCJcbiAgICAgICAgICBbdmFsdWVdPVwicHJpY2VJdGVtLnZhbHVlXCJcbiAgICAgICAgPlxuICAgICAgICA8L2N1cnJlbmN5PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDwhLS0gU2VwYXJhZG9yIGhvcml6b250YWwgLS0+XG4gIDxkaXYgW2NsYXNzXT1cImdldFJhbmRvbVNlcGFyYXRvckNsYXNzKClcIiBbc3R5bGVdPVwiZ2V0U2VwYXJhdG9yU3R5bGVzKClcIj48L2Rpdj5cblxuICA8IS0tIEJvdMOzbiBkZSBhY2Npw7NuIHByaW5jaXBhbCAtLT5cbiAgPGRpdlxuICAgIFtjbGFzc109XCJnZXRSYW5kb21BY3Rpb25CdXR0b25DbGFzcygpXCJcbiAgICBbc3R5bGVdPVwiZ2V0QWN0aW9uQnV0dG9uU3R5bGVzKClcIlxuICAgIChjbGljayk9XCJoYW5kbGVBZGRUb0NhcnQoKTsgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCJcbiAgPlxuICAgIDxhcHAtaWNvblxuICAgICAgbmFtZT1cIlNob3BwaW5nLWNhcnQtYXJyb3ctcmlndGhcIlxuICAgICAgd2lkdGg9XCIyMHB4XCJcbiAgICAgIGhlaWdodD1cIjIwcHhcIlxuICAgICAgY29sb3I9XCIjZjQ5YTNkXCJcbiAgICAgIFtzdHlsZV09XCJ7IGRpc3BsYXk6ICdmbGV4JywgJ2FsaWduLWl0ZW1zJzogJ2NlbnRlcicsICdqdXN0aWZ5LWNvbnRlbnQnOiAnY2VudGVyJyB9XCJcbiAgICA+PC9hcHAtaWNvbj5cbiAgICA8c3BhbiBbY2xhc3NdPVwiZ2V0UmFuZG9tQnV0dG9uVGV4dENsYXNzKClcIiBbc3R5bGVdPVwiZ2V0QnV0dG9uVGV4dFN0eWxlcygpXCJcbiAgICAgID57eyBcInNlbmQgdG8gY2xpZW50XCIgfCB0cmFuc2xhdGUgfX08L3NwYW5cbiAgICA+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
|