simpo-component-library 3.7.4 → 3.7.5
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 +24 -24
- package/esm2022/lib/components/delete-hover-element/delete-hover-element.component.mjs +3 -3
- package/esm2022/lib/components/deprecated-section/deprecated-section.component.mjs +1 -1
- package/esm2022/lib/components/document/document.component.mjs +3 -3
- package/esm2022/lib/components/image-loading/image-loading.component.mjs +3 -3
- package/esm2022/lib/components/payment-details/payment-details.component.mjs +3 -3
- package/esm2022/lib/constants/business.constant.mjs +1 -1
- package/esm2022/lib/directive/alignment.directive.mjs +1 -1
- package/esm2022/lib/directive/blur-content.directive.mjs +1 -1
- package/esm2022/lib/directive/borderlessImage.directive.mjs +1 -1
- package/esm2022/lib/directive/button-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/button-editor.directive.mjs +1 -1
- package/esm2022/lib/directive/color.directive.mjs +1 -1
- package/esm2022/lib/directive/column-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/container-alignment.directive.mjs +1 -1
- package/esm2022/lib/directive/container-fir.directive.mjs +1 -1
- package/esm2022/lib/directive/content-title-spacing.directive.mjs +1 -1
- package/esm2022/lib/directive/contenteditable.directive.mjs +1 -1
- package/esm2022/lib/directive/corner-directive.mjs +1 -1
- package/esm2022/lib/directive/height.directive.mjs +1 -1
- package/esm2022/lib/directive/hover-animation.directive.mjs +1 -1
- package/esm2022/lib/directive/hoverborder.directive.mjs +1 -1
- package/esm2022/lib/directive/icon-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/image-container.directive.mjs +1 -1
- package/esm2022/lib/directive/image-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/image-editor.directive.mjs +1 -1
- package/esm2022/lib/directive/image-position.directive.mjs +1 -1
- package/esm2022/lib/directive/letters-only.directive.mjs +1 -1
- package/esm2022/lib/directive/merge-header.directive.mjs +1 -1
- package/esm2022/lib/directive/numbers-only.directive.mjs +1 -1
- package/esm2022/lib/directive/position-layout-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/set-dynamic-background.directive.mjs +1 -1
- package/esm2022/lib/directive/spacing-around.directive.mjs +1 -1
- package/esm2022/lib/directive/spacing-horizontal.directive.mjs +1 -1
- package/esm2022/lib/directive/spacing.directive.mjs +1 -1
- package/esm2022/lib/directive/text-background-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/text-size.directive.mjs +1 -1
- package/esm2022/lib/directive/translate-onhover.directive.mjs +1 -1
- package/esm2022/lib/directive/video-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/wrap-containers.directive.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/address/address.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/authenticate-user/authenticate-user.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/book-appointment/book-appointment.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/brands-with-image-background-columns/brands-with-image-background-columns.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/cart/cart.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/cart/cart.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/categories-with-image-background-columns/categories-with-image-background-columns.component.mjs +5 -7
- package/esm2022/lib/ecommerce/sections/category-product/category-product.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/category-product/category-product.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/checkout/checkout.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/checkout/checkout.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/customer-review/customer-review.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/customer-review/customer-review.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/enrollment-form/enrollment-form.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/enrollment-form/enrollment-form.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/featured-brand/featured-brand.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/featured-brand/featured-brand.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/featured-category/featured-category.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/featured-category/featured-category.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/featured-category/featured-collection.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/featured-products/featured-products.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/item-varient/item-varient.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/new-collection/new-collection.component.mjs +5 -5
- package/esm2022/lib/ecommerce/sections/new-collection/new-collection.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/order-details/order-details.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/pagnination/pagnination.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/passbook-transactions/passbook-transactions.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/product-desc/product-desc.component.mjs +5 -19
- package/esm2022/lib/ecommerce/sections/product-desc/product-desc.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +15 -268
- package/esm2022/lib/ecommerce/sections/product-list/product-list.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/refer-earn/refer-earn.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/refer-earn/refer-earn.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/returns-calculator/returns-calculator.component.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/returns-calculator/returns-calculator.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/scheme-details/scheme-details.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/scheme-selection/scheme-selection.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/schemes/schemes.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/schemes/schemes.component.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/small-product-listing/small-product-listing.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/store-list/store-list.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/store-list/store-list.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/store-page/store-page.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/store-page/store-page.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/user-basic-info/user-basic-info.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/user-profile/user-profile.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.component.mjs +33 -3
- package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/whislist/whislist.component.mjs +3 -3
- package/esm2022/lib/ecommerce/styles/BaseCollection.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/Brand.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/Collection.modal.mjs +1 -2
- package/esm2022/lib/ecommerce/styles/OrderedItems.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/PincodeLocation.model.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/PincodeLocationInter.model.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/cart.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/category.modal.mjs +1 -2
- package/esm2022/lib/ecommerce/styles/order.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/product.modal.mjs +1 -11
- package/esm2022/lib/ecommerce/styles/review.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/user.modal.mjs +1 -1
- package/esm2022/lib/elements/add-section/add-section.component.mjs +3 -3
- package/esm2022/lib/elements/address-list/address-list.component.mjs +3 -3
- package/esm2022/lib/elements/below-image-card/below-image-card.component.mjs +3 -3
- package/esm2022/lib/elements/booking-cart-groups/booking-cart-groups.component.mjs +3 -3
- package/esm2022/lib/elements/button/button.component.mjs +3 -3
- package/esm2022/lib/elements/button/button.model.mjs +1 -1
- package/esm2022/lib/elements/card-skeleton-loader/card-skeleton-loader.component.mjs +3 -3
- package/esm2022/lib/elements/covering-image-card/covering-image-card.component.mjs +3 -3
- package/esm2022/lib/elements/editor-service.service.mjs +1 -1
- package/esm2022/lib/elements/heading-element/heading-element.component.mjs +3 -3
- package/esm2022/lib/elements/index.mjs +1 -1
- package/esm2022/lib/elements/link-editor/link-editor.component.mjs +3 -3
- package/esm2022/lib/elements/list-home-appointment/list-home-appointment.component.mjs +3 -3
- package/esm2022/lib/elements/media-selector/media-selector.component.mjs +3 -3
- package/esm2022/lib/elements/my-bookings/my-bookings.component.mjs +119 -9
- package/esm2022/lib/elements/portfolio/portfolio.component.mjs +3 -3
- package/esm2022/lib/elements/pricing-s1/pricing-s1.component.mjs +3 -3
- package/esm2022/lib/elements/property/property.component.mjs +3 -3
- package/esm2022/lib/elements/simpo-button/simpo-button.component.mjs +3 -3
- package/esm2022/lib/elements/svg-divider/svg-divider.component.mjs +3 -3
- package/esm2022/lib/elements/text/text.component.mjs +3 -3
- package/esm2022/lib/elements/text-editor/text-editor.component.mjs +7 -7
- package/esm2022/lib/elements/top-of-image-card/top-of-image-card.component.mjs +3 -3
- package/esm2022/lib/pipes/amount.pipe.mjs +1 -1
- package/esm2022/lib/pipes/gender.pipe.mjs +1 -1
- package/esm2022/lib/sections/BaseSection.mjs +1 -1
- package/esm2022/lib/sections/add-new-section/add-new-section.component.mjs +3 -3
- package/esm2022/lib/sections/appointment-form/appointment-booking/appointment-booking/appointment-booking.component.mjs +3 -3
- package/esm2022/lib/sections/appointment-form/appointment-form.model.mjs +1 -1
- package/esm2022/lib/sections/banner-carousel/banner-carousel.component.mjs +3 -3
- package/esm2022/lib/sections/banner-carousel/banner-carousel.model.mjs +1 -1
- package/esm2022/lib/sections/banner-grid-section/banner-grid-section.component.mjs +3 -3
- package/esm2022/lib/sections/blog-list/blog-list.component.mjs +3 -3
- package/esm2022/lib/sections/blog-list/blog-list.model.mjs +1 -1
- package/esm2022/lib/sections/brand-story-section/brand-story-section.component.mjs +3 -3
- package/esm2022/lib/sections/brand-story-section/brand-story-section.modal.mjs +1 -1
- package/esm2022/lib/sections/button-grid-section/button-grid-section.component.mjs +3 -3
- package/esm2022/lib/sections/choose-us-section/choose-us-section.component.mjs +3 -3
- package/esm2022/lib/sections/choose-us-section/choose-us-section.model.mjs +1 -1
- package/esm2022/lib/sections/condensed-and-gradient/condensed-and-gradient.component.mjs +3 -3
- package/esm2022/lib/sections/countdown-banner/countdown-banner.component.mjs +3 -3
- package/esm2022/lib/sections/countdown-banner/countdown-banner.component.model.mjs +1 -1
- package/esm2022/lib/sections/faq-columns-cards/faq-columns-cards.component.mjs +3 -3
- package/esm2022/lib/sections/faq-columns-cards/faq-columns-cards.modal.mjs +1 -1
- package/esm2022/lib/sections/faq-section/faq-section.component.mjs +3 -3
- package/esm2022/lib/sections/faq-section/faq-section.modal.mjs +1 -1
- package/esm2022/lib/sections/feature-experience-section/feature-experience-section.component.mjs +3 -3
- package/esm2022/lib/sections/feature-experience-section/feature-experience-section.modal.mjs +1 -1
- package/esm2022/lib/sections/features-section/features-section.component.mjs +3 -3
- package/esm2022/lib/sections/features-section/features-section.model.mjs +1 -1
- package/esm2022/lib/sections/footer/footer.component.mjs +7 -10
- package/esm2022/lib/sections/footer/footer.modal.mjs +1 -1
- package/esm2022/lib/sections/four-features-centered-image/four-features-centered-image.component.mjs +3 -3
- package/esm2022/lib/sections/four-features-centered-image/four-features-centered-image.modal.mjs +1 -1
- package/esm2022/lib/sections/header-section/header-section.component.mjs +7 -12
- package/esm2022/lib/sections/header-section/header-section.model.mjs +1 -1
- package/esm2022/lib/sections/header-text/header-text.component.mjs +3 -3
- package/esm2022/lib/sections/header-text/header-text.model.mjs +1 -1
- package/esm2022/lib/sections/image-background/image-background/image-background.component.mjs +3 -3
- package/esm2022/lib/sections/image-background/image-background/image-background.component.model.mjs +1 -1
- package/esm2022/lib/sections/image-carousel-section/image-carousel-section.component.mjs +3 -3
- package/esm2022/lib/sections/image-carousel-section/image-carousel.model.mjs +1 -1
- package/esm2022/lib/sections/image-grid-hotspot/image-grid-hotspot.component.mjs +3 -3
- package/esm2022/lib/sections/image-grid-hotspot/image-grid-hotspot.model.mjs +1 -1
- package/esm2022/lib/sections/image-grid-section/image-grid-section.component.mjs +3 -3
- package/esm2022/lib/sections/image-grid-section/image-grid-section.model.mjs +1 -1
- package/esm2022/lib/sections/image-section/image-section.component.mjs +3 -3
- package/esm2022/lib/sections/image-section/image-section.model.mjs +1 -1
- package/esm2022/lib/sections/location-section/location-section.component.mjs +3 -3
- package/esm2022/lib/sections/location-section/location-section.modal.mjs +1 -1
- package/esm2022/lib/sections/logo-showcase/logo-showcase.component.mjs +3 -3
- package/esm2022/lib/sections/logo-showcase/logo-showcase.modal.mjs +1 -1
- package/esm2022/lib/sections/moving-text/moving-text.component.mjs +3 -3
- package/esm2022/lib/sections/moving-text/moving-text.modal.mjs +1 -1
- package/esm2022/lib/sections/new-services/new-services.component.mjs +3 -3
- package/esm2022/lib/sections/new-services/new-services.model.mjs +1 -1
- package/esm2022/lib/sections/new-testimonials/new-testimonials.component.mjs +3 -3
- package/esm2022/lib/sections/new-testimonials/new-testimonials.model.mjs +1 -1
- package/esm2022/lib/sections/news-letter-component/news-letter-component.component.mjs +3 -3
- package/esm2022/lib/sections/news-letter-component/news-letter.modal.mjs +1 -1
- package/esm2022/lib/sections/overlapping-image/overlapping-image.component.mjs +3 -3
- package/esm2022/lib/sections/overlapping-image/overlapping-image.component.modal.mjs +1 -1
- package/esm2022/lib/sections/pricing-section/pricing-section.component.mjs +3 -3
- package/esm2022/lib/sections/pricing-section/pricing-section.modal.mjs +1 -1
- package/esm2022/lib/sections/process-modern/process-modern.component.mjs +3 -3
- package/esm2022/lib/sections/process-modern/process-modern.model.mjs +1 -1
- package/esm2022/lib/sections/process-section/process-section.component.mjs +3 -3
- package/esm2022/lib/sections/process-section/process-section.modal.mjs +1 -1
- package/esm2022/lib/sections/product-info-section/product-info-section.component.mjs +3 -3
- package/esm2022/lib/sections/product-info-section/product-info-section.component.modal.mjs +1 -1
- package/esm2022/lib/sections/property-component/property-component.component.mjs +3 -3
- package/esm2022/lib/sections/property-component/property-component.modal.mjs +1 -1
- package/esm2022/lib/sections/property-list/property-list.component.mjs +3 -3
- package/esm2022/lib/sections/property-list/property-list.modal.mjs +1 -1
- package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.component.mjs +3 -3
- package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.model.mjs +1 -1
- package/esm2022/lib/sections/registration-form/registration-form.component.mjs +3 -3
- package/esm2022/lib/sections/registration-form/registrationForm.model.mjs +1 -1
- package/esm2022/lib/sections/scheme-detail/scheme-detail.component.mjs +3 -3
- package/esm2022/lib/sections/scheme-detail/scheme-detail.modal.mjs +1 -1
- package/esm2022/lib/sections/service-section/service-section.component.mjs +3 -3
- package/esm2022/lib/sections/service-section/service-section.model.mjs +1 -1
- package/esm2022/lib/sections/skeleton-loader-section/skeleton-loader-section.component.mjs +3 -3
- package/esm2022/lib/sections/team-member-section/team-member-section.component.mjs +3 -3
- package/esm2022/lib/sections/team-member-section/team-member-section.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-masonry/testimonial-masonry.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-masonry/testimonial-masonry.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-section/testimonial-section.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-section/testimonial-section.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-slider/testimonial-slider.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-slider/testimonial-slider.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-video/testimonial-video.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-video/testimonial-video.model.mjs +1 -1
- package/esm2022/lib/sections/text-section/text-section.model.mjs +1 -1
- package/esm2022/lib/sections/usp-video-section/usp-video-section.component.mjs +3 -3
- package/esm2022/lib/sections/usp-video-section/usp-video-section.model.mjs +1 -1
- package/esm2022/lib/sections/video-carousel-section/video-carousel-section.component.mjs +3 -3
- package/esm2022/lib/sections/video-carousel-section/video-carousel.model.mjs +1 -1
- package/esm2022/lib/sections/video-grid-section/video-grid-section.component.mjs +3 -3
- package/esm2022/lib/sections/video-grid-section/video-grid-section.model.mjs +1 -1
- package/esm2022/lib/sections/video-section/video-section.component.mjs +3 -3
- package/esm2022/lib/sections/video-section/video-section.model.mjs +1 -1
- package/esm2022/lib/sections/video-showcase/video-showcase.component.mjs +3 -3
- package/esm2022/lib/sections/view-blog/view-blog.component.mjs +1 -1
- package/esm2022/lib/services/analytics.service.mjs +1 -1
- package/esm2022/lib/services/booking-product-cart.service.mjs +1 -1
- package/esm2022/lib/services/cart.service.mjs +1 -1
- package/esm2022/lib/services/endUser.service.mjs +1 -1
- package/esm2022/lib/services/image-upload-service.service.mjs +1 -1
- package/esm2022/lib/services/rest.service.mjs +19 -38
- package/esm2022/lib/services/sanitizeHtml.mjs +1 -1
- package/esm2022/lib/services/storage.service.mjs +1 -1
- package/esm2022/lib/styles/gradient-extension.mjs +1 -1
- package/esm2022/lib/styles/index.mjs +1 -1
- package/esm2022/lib/styles/style.model.mjs +1 -1
- package/esm2022/lib/styles/text-size.extension.mjs +1 -1
- package/esm2022/lib/styles/types.mjs +1 -1
- package/esm2022/lib/tokens/api-token.mjs +1 -1
- package/esm2022/public-api.mjs +1 -1
- package/fesm2022/simpo-component-library.mjs +409 -625
- package/fesm2022/simpo-component-library.mjs.map +1 -1
- package/lib/ecommerce/sections/product-desc/product-desc.component.d.ts +0 -4
- package/lib/ecommerce/sections/product-list/product-list.component.d.ts +1 -46
- package/lib/ecommerce/sections/verify-payment/verify-payment.component.d.ts +6 -0
- package/lib/ecommerce/styles/Collection.modal.d.ts +0 -1
- package/lib/ecommerce/styles/category.modal.d.ts +0 -1
- package/lib/ecommerce/styles/product.modal.d.ts +0 -42
- package/lib/elements/my-bookings/my-bookings.component.d.ts +25 -1
- package/lib/sections/footer/footer.component.d.ts +2 -2
- package/lib/services/rest.service.d.ts +6 -13
- package/package.json +1 -1
- package/simpo-component-library-3.7.5.tgz +0 -0
- package/esm2022/lib/utils/list-route.util.mjs +0 -56
- package/lib/utils/list-route.util.d.ts +0 -21
- package/simpo-component-library-3.7.004.tgz +0 -0
|
@@ -9,9 +9,10 @@ import * as i0 from "@angular/core";
|
|
|
9
9
|
import * as i1 from "../../services/rest.service";
|
|
10
10
|
import * as i2 from "../../services/storage.service";
|
|
11
11
|
import * as i3 from "primeng/api";
|
|
12
|
-
import * as i4 from "
|
|
13
|
-
import * as i5 from "@angular/
|
|
14
|
-
import * as i6 from "
|
|
12
|
+
import * as i4 from "../../services/events.service";
|
|
13
|
+
import * as i5 from "@angular/common";
|
|
14
|
+
import * as i6 from "@angular/material/icon";
|
|
15
|
+
import * as i7 from "primeng/toast";
|
|
15
16
|
/**
|
|
16
17
|
* "My Bookings" - a customer's own booking history (Upcoming/Past), a detail view per booking,
|
|
17
18
|
* and cancellation. The list endpoint returns full BookingGroup records - enough for
|
|
@@ -19,10 +20,11 @@ import * as i6 from "primeng/toast";
|
|
|
19
20
|
* above), so load() issues one extra GET .../lines call per row to fill them in.
|
|
20
21
|
*/
|
|
21
22
|
export class MyBookingsComponent {
|
|
22
|
-
constructor(restService, storageService, messageService) {
|
|
23
|
+
constructor(restService, storageService, messageService, eventsService) {
|
|
23
24
|
this.restService = restService;
|
|
24
25
|
this.storageService = storageService;
|
|
25
26
|
this.messageService = messageService;
|
|
27
|
+
this.eventsService = eventsService;
|
|
26
28
|
this.currentTab = 'LIST';
|
|
27
29
|
this.profTab = 'upcoming';
|
|
28
30
|
this.loading = true;
|
|
@@ -43,6 +45,13 @@ export class MyBookingsComponent {
|
|
|
43
45
|
this.reschConfirming = false;
|
|
44
46
|
this.reschError = '';
|
|
45
47
|
this.reschNoSlots = false;
|
|
48
|
+
// ------------------------------------------------------------------------------ Add Service
|
|
49
|
+
this.addServicePanelOpen = false;
|
|
50
|
+
this.addServiceLoading = false;
|
|
51
|
+
this.addServiceOptions = [];
|
|
52
|
+
this.addServiceSelected = [];
|
|
53
|
+
this.addServiceSubmitting = false;
|
|
54
|
+
this.addServiceError = '';
|
|
46
55
|
}
|
|
47
56
|
/** Same contrast algorithm as ColorDirective (directive/color.directive.ts) - reimplemented as
|
|
48
57
|
* a pure getter rather than reusing that directive directly, since its [simpoColor] only ever
|
|
@@ -193,6 +202,9 @@ export class MyBookingsComponent {
|
|
|
193
202
|
get canRescheduleSelected() {
|
|
194
203
|
return !!this.selected && this.selected.status === 'BOOKED' && !!this.selected.canReschedule;
|
|
195
204
|
}
|
|
205
|
+
get canAddServiceSelected() {
|
|
206
|
+
return !!this.selected && this.selected.status === 'BOOKED';
|
|
207
|
+
}
|
|
196
208
|
viewBookingDetail(b) {
|
|
197
209
|
this.selected = b;
|
|
198
210
|
this.currentTab = 'DETAIL';
|
|
@@ -289,6 +301,104 @@ export class MyBookingsComponent {
|
|
|
289
301
|
this.reschError = error?.error?.message || error?.error?.detail || 'Unable to reschedule this booking';
|
|
290
302
|
});
|
|
291
303
|
}
|
|
304
|
+
openAddServicePanel() {
|
|
305
|
+
if (!this.selected)
|
|
306
|
+
return;
|
|
307
|
+
this.addServicePanelOpen = true;
|
|
308
|
+
this.addServiceError = '';
|
|
309
|
+
this.addServiceSelected = [];
|
|
310
|
+
this.addServiceLoading = true;
|
|
311
|
+
this.restService.getAddServiceOptions(this.selected.groupId).subscribe((res) => {
|
|
312
|
+
this.addServiceLoading = false;
|
|
313
|
+
this.addServiceOptions = res ?? [];
|
|
314
|
+
}, () => {
|
|
315
|
+
this.addServiceLoading = false;
|
|
316
|
+
this.addServiceOptions = [];
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
closeAddServicePanel() {
|
|
320
|
+
this.addServicePanelOpen = false;
|
|
321
|
+
}
|
|
322
|
+
isAddServiceSelected(service) {
|
|
323
|
+
return this.addServiceSelected.some((s) => s.serviceId === service.serviceId);
|
|
324
|
+
}
|
|
325
|
+
toggleAddService(service) {
|
|
326
|
+
const index = this.addServiceSelected.findIndex((s) => s.serviceId === service.serviceId);
|
|
327
|
+
if (index > -1)
|
|
328
|
+
this.addServiceSelected.splice(index, 1);
|
|
329
|
+
else
|
|
330
|
+
this.addServiceSelected.push(service);
|
|
331
|
+
}
|
|
332
|
+
/** Mirrors appointment_service's DepositUtils#getServiceDepositAmount exactly - fixed amount
|
|
333
|
+
* takes precedence over percent, 0 when no deposit is configured. Only used to decide which
|
|
334
|
+
* endpoint to call (a live Cashfree checkout vs. the direct add) - the backend re-derives this
|
|
335
|
+
* itself and never trusts a client-computed amount. */
|
|
336
|
+
serviceDeposit(service) {
|
|
337
|
+
const d = service?.depositAmount;
|
|
338
|
+
if (!d?.depositRequired)
|
|
339
|
+
return 0;
|
|
340
|
+
if (d.fixedAmount > 0)
|
|
341
|
+
return d.fixedAmount;
|
|
342
|
+
const price = service?.priceDetails?.totalPrice ?? 0;
|
|
343
|
+
return ((d.depositPercent ?? 0) / 100) * price;
|
|
344
|
+
}
|
|
345
|
+
/** Summed across every currently-checked service - drives both the running total shown in the
|
|
346
|
+
* panel and which endpoint addService() calls (same total the backend independently re-derives
|
|
347
|
+
* and actually enforces). */
|
|
348
|
+
get addServiceTotalDeposit() {
|
|
349
|
+
return this.addServiceSelected.reduce((sum, s) => sum + this.serviceDeposit(s), 0);
|
|
350
|
+
}
|
|
351
|
+
addService() {
|
|
352
|
+
if (!this.selected || this.addServiceSubmitting || !this.addServiceSelected.length)
|
|
353
|
+
return;
|
|
354
|
+
const serviceIds = this.addServiceSelected.map((s) => s.serviceId);
|
|
355
|
+
const deposit = this.addServiceTotalDeposit;
|
|
356
|
+
this.addServiceSubmitting = true;
|
|
357
|
+
this.addServiceError = '';
|
|
358
|
+
if (deposit <= 0) {
|
|
359
|
+
this.restService.addServiceToBooking(this.selected.groupId, serviceIds).subscribe(() => {
|
|
360
|
+
this.addServiceSubmitting = false;
|
|
361
|
+
this.addServicePanelOpen = false;
|
|
362
|
+
const summary = this.addServiceSelected.length === 1
|
|
363
|
+
? this.addServiceSelected[0].name + ' added'
|
|
364
|
+
: this.addServiceSelected.length + ' services added';
|
|
365
|
+
this.messageService.add({ severity: 'success', summary });
|
|
366
|
+
this.refreshSelectedServiceLines();
|
|
367
|
+
}, (error) => {
|
|
368
|
+
this.addServiceSubmitting = false;
|
|
369
|
+
this.addServiceError = error?.error?.message || 'Unable to add these services';
|
|
370
|
+
});
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
// Deposit required - nothing is attached to the booking until this payment is verified
|
|
374
|
+
// (BookingGroupService#confirmServiceAddOn), same live-checkout pattern the original booking
|
|
375
|
+
// flow already uses (see this component's own confirmReschedule/cancelBooking neighbors -
|
|
376
|
+
// none of those touch payment - and appointment-booking.component.ts's holdBooking success
|
|
377
|
+
// handler for the actual precedent). One checkout for the whole batch's summed deposit.
|
|
378
|
+
this.restService.generateAddServicePaymentToken(this.selected.groupId, serviceIds).subscribe((order) => {
|
|
379
|
+
this.addServiceSubmitting = false;
|
|
380
|
+
localStorage.setItem('addOnPaymentId', order.pgOrderId);
|
|
381
|
+
this.eventsService.cashFreeEvent.emit({ data: { orderSignature: order.orderSignature } });
|
|
382
|
+
}, (error) => {
|
|
383
|
+
this.addServiceSubmitting = false;
|
|
384
|
+
this.addServiceError = error?.error?.message || 'Unable to start payment for these services';
|
|
385
|
+
});
|
|
386
|
+
}
|
|
387
|
+
refreshSelectedServiceLines() {
|
|
388
|
+
if (!this.selected)
|
|
389
|
+
return;
|
|
390
|
+
const groupId = this.selected.groupId;
|
|
391
|
+
this.restService.getGroupLines(groupId).pipe(catchError(() => of([]))).subscribe((lines) => {
|
|
392
|
+
const booking = this.allBookings.find((b) => b.groupId === groupId);
|
|
393
|
+
const services = (lines ?? []).flatMap((l) => (l.services ?? []).map((s) => ({
|
|
394
|
+
name: s.name, durationMinutes: s.durationMinutes, price: s.price
|
|
395
|
+
})));
|
|
396
|
+
if (booking)
|
|
397
|
+
booking.services = services;
|
|
398
|
+
if (this.selected?.groupId === groupId)
|
|
399
|
+
this.selected.services = services;
|
|
400
|
+
});
|
|
401
|
+
}
|
|
292
402
|
openCancelConfirm() {
|
|
293
403
|
if (!this.selected)
|
|
294
404
|
return;
|
|
@@ -313,16 +423,16 @@ export class MyBookingsComponent {
|
|
|
313
423
|
this.messageService.add({ severity: 'error', summary: 'Error', detail: error?.error?.detail ?? 'Could not cancel this booking' });
|
|
314
424
|
});
|
|
315
425
|
}
|
|
316
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MyBookingsComponent, deps: [{ token: i1.RestService }, { token: i2.StorageServiceService }, { token: i3.MessageService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
317
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MyBookingsComponent, isStandalone: true, selector: "simpo-my-bookings", inputs: { data: "data" }, providers: [MessageService], viewQueries: [{ propertyName: "reschDayStripRef", first: true, predicate: ["reschDayStrip"], descendants: true }], ngImport: i0, template: "<p-toast position=\"bottom-right\"></p-toast>\r\n\r\n<div class=\"mb-root\">\r\n <ng-container *ngIf=\"currentTab === 'LIST'\">\r\n <div class=\"mb-title\">My Bookings</div>\r\n\r\n <div class=\"mb-tabs\">\r\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'upcoming'\" (click)=\"setProfTab('upcoming')\">Upcoming</button>\r\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'past'\" (click)=\"setProfTab('past')\">Past</button>\r\n </div>\r\n\r\n <div class=\"mb-loading\" *ngIf=\"loading\">Loading your bookings\u2026</div>\r\n\r\n <div class=\"mb-rows\" *ngIf=\"!loading && !isEmpty\">\r\n <button type=\"button\" class=\"mb-row\" *ngFor=\"let b of rows\" (click)=\"viewBookingDetail(b)\">\r\n <div class=\"mb-row-stripe\" [ngClass]=\"b.mode === 'HOME_VISIT' ? 'stripe-home' : b.mode === 'VIDEO_CALL' ? 'stripe-video' : 'stripe-store'\"></div>\r\n <div class=\"mb-row-info\">\r\n <div class=\"mb-row-top\">\r\n <div class=\"mb-row-title\">{{title(b)}}</div>\r\n </div>\r\n <div class=\"mb-row-when\">{{when(b)}}</div>\r\n <div class=\"mb-row-detail\">{{detail(b)}}</div>\r\n </div>\r\n <div class=\"mb-row-end\">\r\n <span class=\"mb-status\" [ngClass]=\"statusClass(b.status)\">{{statusLabel(b.status)}}</span>\r\n </div>\r\n </button>\r\n </div>\r\n\r\n <div class=\"mb-empty\" *ngIf=\"isEmpty\">\r\n <mat-icon class=\"mb-empty-icon\">event_busy</mat-icon>\r\n <div class=\"mb-empty-title\">No {{profTab}} bookings yet.</div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"currentTab === 'DETAIL' && selected\">\r\n <button type=\"button\" class=\"mb-back\" (click)=\"backToList()\">\r\n <mat-icon>arrow_back</mat-icon> Back to My Bookings\r\n </button>\r\n\r\n <div class=\"mb-detail-card\">\r\n <div class=\"mb-detail-header\">\r\n <div class=\"mb-detail-title-row\">\r\n <div class=\"mb-detail-title\">{{title(selected)}}</div>\r\n <span class=\"mb-status\" [ngClass]=\"statusClass(selected.status)\">{{statusLabel(selected.status)}}</span>\r\n </div>\r\n <div class=\"mb-detail-when\">{{when(selected)}}</div>\r\n </div>\r\n\r\n <div class=\"mb-detail-rows\">\r\n <div class=\"mb-detail-row\" *ngIf=\"selected.services?.length\">\r\n <div class=\"mb-detail-k\">Services</div>\r\n <div class=\"mb-detail-v\">{{serviceNames(selected)}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\" *ngIf=\"selected.productLines?.length\">\r\n <div class=\"mb-detail-k\">Products</div>\r\n <div class=\"mb-detail-v\">{{productNames(selected)}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\" *ngIf=\"selected.customerDetail\">\r\n <div class=\"mb-detail-k\">Contact</div>\r\n <div class=\"mb-detail-v\">{{selected.customerDetail?.name}} \u00B7 {{selected.customerDetail?.phoneNumber}} \u00B7 {{selected.customerDetail?.email}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\" *ngIf=\"selected.mode === 'HOME_VISIT' && selected.addressDetails\">\r\n <div class=\"mb-detail-k\">Address</div>\r\n <div class=\"mb-detail-v\">{{selected.addressDetails?.addressLine1}}, {{selected.addressDetails?.city}}, {{selected.addressDetails?.state}} {{selected.addressDetails?.zipCode}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\" *ngIf=\"servicePriceTotal(selected) > 0\">\r\n <div class=\"mb-detail-k\">Service price</div>\r\n <div class=\"mb-detail-v\">\u20B9{{servicePriceTotal(selected)}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\" *ngIf=\"selected.homeVisitCharge\">\r\n <div class=\"mb-detail-k\">Home visit charge</div>\r\n <div class=\"mb-detail-v\">\u20B9{{selected.homeVisitCharge}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\">\r\n <div class=\"mb-detail-k\">Total</div>\r\n <div class=\"mb-detail-v\">\u20B9{{totalDue(selected)}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\">\r\n <div class=\"mb-detail-k\">Paid</div>\r\n <div class=\"mb-detail-v\">{{paidLabel(selected)}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\" *ngIf=\"pendingAmount(selected) > 0\">\r\n <div class=\"mb-detail-k\">Pending at appointment</div>\r\n <div class=\"mb-detail-v\">\u20B9{{pendingAmount(selected)}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-video-link\" *ngIf=\"selected.mode === 'VIDEO_CALL' && selected.videoCallLink && selected.status !== 'CANCELLED'\">\r\n <mat-icon>videocam</mat-icon>\r\n <a [href]=\"selected.videoCallLink\" target=\"_blank\">{{selected.videoCallLink}}</a>\r\n </div>\r\n\r\n <div class=\"mb-policy\" *ngIf=\"canRescheduleSelected\">\r\n <div class=\"mb-policy-title\">Reschedule policy</div>\r\n <div class=\"mb-policy-text\">You can reschedule this booking up to {{rescheduleCutoffHours}} hour{{rescheduleCutoffHours === 1 ? '' : 's'}} before the appointment time.</div>\r\n </div>\r\n <div class=\"mb-policy\" *ngIf=\"canCancelSelected && cancellationPolicy\">\r\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\r\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\r\n </div>\r\n\r\n <div class=\"mb-actions-row\" *ngIf=\"selected.status === 'BOOKED' || canCancelSelected\">\r\n <button\r\n type=\"button\"\r\n class=\"mb-reschedule-btn\"\r\n *ngIf=\"selected.status === 'BOOKED'\"\r\n [disabled]=\"!canRescheduleSelected\"\r\n [title]=\"!canRescheduleSelected ? selected.rescheduleBlockedReason : ''\"\r\n [style.borderColor]=\"styles?.background?.accentColor\"\r\n [style.color]=\"styles?.background?.accentColor\"\r\n (click)=\"openReschedulePanel()\"\r\n >Reschedule booking</button>\r\n <button\r\n type=\"button\"\r\n class=\"mb-cancel-btn\"\r\n *ngIf=\"canCancelSelected\"\r\n [disabled]=\"cancelling\"\r\n [style.borderColor]=\"styles?.background?.accentColor\"\r\n [style.color]=\"styles?.background?.accentColor\"\r\n (click)=\"openCancelConfirm()\"\r\n >\r\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\r\n </button>\r\n </div>\r\n\r\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"mb-resch-backdrop\" *ngIf=\"reschedulePanelOpen\" (click)=\"closeReschedulePanel()\">\r\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"mb-resch-header\">\r\n <div class=\"mb-resch-title\">Choose a new date & time</div>\r\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeReschedulePanel()\">×</button>\r\n </div>\r\n\r\n <div class=\"mb-resch-body\">\r\n <div class=\"mb-resch-daystrip-row\">\r\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(-1)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"></path></svg>\r\n </button>\r\n <div class=\"mb-resch-daystrip\" #reschDayStrip>\r\n <button\r\n type=\"button\"\r\n class=\"mb-resch-day\"\r\n *ngFor=\"let day of reschDays\"\r\n [class.active]=\"day.iso === reschSelectedIso\"\r\n [style.background]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\r\n [style.borderColor]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\r\n (click)=\"selectReschDay(day)\"\r\n >\r\n <span class=\"mb-resch-day-dow\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.dow}}</span>\r\n <span class=\"mb-resch-day-num\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.num}}</span>\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(1)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"></path></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"mb-resch-slots-loading\" *ngIf=\"reschLoadingSlots\">Loading available times\u2026</div>\r\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!reschLoadingSlots && reschNoSlots\">No slots available on this date. Try another date.</div>\r\n <div class=\"mb-resch-slots\" *ngIf=\"!reschLoadingSlots && reschSlots.length\">\r\n <button\r\n type=\"button\"\r\n class=\"mb-resch-slot\"\r\n *ngFor=\"let slot of reschSlots\"\r\n [class.active]=\"slot === reschSelectedTime\"\r\n [style.background]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\r\n [style.borderColor]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\r\n [style.color]=\"slot === reschSelectedTime ? contrastColor : null\"\r\n (click)=\"selectReschTime(slot)\"\r\n >{{slot}}</button>\r\n </div>\r\n\r\n <div class=\"mb-resch-error\" *ngIf=\"reschError\">{{reschError}}</div>\r\n </div>\r\n\r\n <div class=\"mb-resch-footer\">\r\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeReschedulePanel()\">Cancel</button>\r\n <button\r\n type=\"button\"\r\n class=\"mb-resch-confirm\"\r\n [disabled]=\"reschInvalid\"\r\n [style.background]=\"reschInvalid ? null : styles?.background?.accentColor\"\r\n [style.color]=\"reschInvalid ? null : contrastColor\"\r\n (click)=\"confirmReschedule()\"\r\n >\r\n {{reschConfirming ? 'Confirming\u2026' : 'Confirm new slot'}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-resch-backdrop\" *ngIf=\"cancelConfirmOpen\" (click)=\"closeCancelConfirm()\">\r\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"mb-resch-header\">\r\n <div class=\"mb-resch-title\">Cancel this booking?</div>\r\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeCancelConfirm()\">×</button>\r\n </div>\r\n <div class=\"mb-resch-body\">\r\n <div class=\"mb-policy-text\">This can't be undone.</div>\r\n <div class=\"mb-policy\" *ngIf=\"cancellationPolicy\">\r\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\r\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\r\n </div>\r\n </div>\r\n <div class=\"mb-resch-footer\">\r\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeCancelConfirm()\">Keep booking</button>\r\n <button type=\"button\" class=\"mb-resch-confirm\" [disabled]=\"cancelling\" (click)=\"cancelBooking()\">\r\n {{cancelling ? 'Cancelling\u2026' : 'Yes, cancel booking'}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".mb-root{display:flex;flex-direction:column;gap:16px;padding:4px 0 24px}.mb-title{font-size:20px;font-weight:600;color:#1b2436}.mb-tabs{display:flex;background:#f5f2ee;border-radius:8px;padding:4px;gap:4px;width:fit-content}.mb-tab{border:none;background:transparent;border-radius:6px;padding:8px 18px;font-size:13.5px;font-weight:500;color:#8a94a3;cursor:pointer}.mb-tab.active{background:#fff;color:#1b2436;font-weight:600;box-shadow:0 1px 3px #00000012}.mb-loading{font-size:13.5px;color:#8a94a3;padding:20px 0}.mb-rows{display:flex;flex-direction:column;gap:12px}.mb-row{border:1px solid #EEE9E3;border-radius:10px;padding:16px 18px;display:flex;align-items:flex-start;gap:14px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-row-stripe{width:3px;align-self:stretch;border-radius:999px;flex:none}.stripe-home{background:#16233a}.stripe-video{background:#7c3a11}.stripe-store{background:#8a94a3}.mb-row-info{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.mb-row-title{font-size:14.5px;font-weight:600;color:#1b2436}.mb-row-when{font-size:12.5px;color:#6b7688}.mb-row-detail{font-size:12px;color:#8a94a3}.mb-row-end{flex:none}.mb-status{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:600;border-radius:999px;padding:4px 9px;white-space:nowrap}.status-confirmed{background:#e8f4ee;color:#1e7a4b}.status-completed{background:#f2eee9;color:#8a7c6c}.status-cancelled{background:#fbedec;color:#b4432e}.status-pending{background:#fdf3e3;color:#b36b00}.status-ongoing{background:#e3f2fd;color:#1565c0}.mb-empty{display:flex;flex-direction:column;align-items:center;gap:10px;padding:50px 20px;text-align:center}.mb-empty-icon{font-size:40px!important;height:40px!important;width:40px!important;color:#c9b7a2!important}.mb-empty-title{font-size:14.5px;color:#8a94a3}.mb-back{display:flex;align-items:center;gap:6px;border:none;background:none;padding:0;cursor:pointer;font-size:12.5px;color:#7c3a11;margin-bottom:6px;width:fit-content}.mb-back mat-icon{font-size:16px!important;height:16px!important;width:16px!important}.mb-detail-card{border:1px solid #EEE9E3;border-radius:12px;padding:20px 22px;display:flex;flex-direction:column;gap:16px;background:#fff}.mb-detail-header{display:flex;flex-direction:column;gap:6px;padding-bottom:14px;border-bottom:1px solid #F0ECE7}.mb-detail-title-row{display:flex;align-items:center;gap:10px}.mb-detail-title{font-size:17px;font-weight:600;color:#1b2436}.mb-detail-when{font-size:13px;color:#6b7688}.mb-detail-rows{display:flex;flex-direction:column;gap:12px}.mb-detail-row{display:flex;justify-content:space-between;gap:16px;font-size:13px}.mb-detail-k{color:#8a94a3;flex:none}.mb-detail-v{color:#1b2436;font-weight:500;text-align:right}.mb-video-link{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#f2f9f5;border-radius:8px;font-size:13px;color:#2c6a4b}.mb-video-link mat-icon{color:#1e7a4b!important;flex:none}.mb-policy{background:#fbfaf8;border:1px solid #EDE8E2;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:4px}.mb-policy-title{font-size:12px;font-weight:600;color:#a08b72;text-transform:uppercase;letter-spacing:.06em}.mb-policy-text{font-size:12.5px;line-height:1.6;color:#5f6b7c}.mb-cancel-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-cancel-btn:disabled{opacity:.6;cursor:not-allowed}.mb-cancelled-note{font-size:13px;color:#b4432e;font-weight:600}.mb-actions-row{display:flex;gap:12px}.mb-actions-row .mb-reschedule-btn,.mb-actions-row .mb-cancel-btn{flex:1}.mb-reschedule-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-reschedule-btn:disabled{opacity:.5;cursor:not-allowed}.mb-resch-backdrop{position:fixed;inset:0;background:#1b243673;display:flex;align-items:center;justify-content:center;padding:16px;z-index:1000}.mb-resch-panel{width:100%;max-width:440px;max-height:85vh;border-radius:14px;background:#fff;box-shadow:0 20px 50px #14141e40;display:flex;flex-direction:column;overflow:hidden}.mb-resch-header{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid #F0ECE7;flex:none}.mb-resch-body{padding:18px 20px;overflow-y:auto}.mb-resch-footer{display:flex;gap:10px;padding:14px 20px;border-top:1px solid #F0ECE7;flex:none}.mb-resch-footer .mb-resch-cancel,.mb-resch-footer .mb-resch-confirm{flex:1}.mb-resch-cancel{height:46px;border:1.5px solid #E2E2E9;border-radius:8px;background:#fff;color:#5f6b7c;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-title{font-size:14px;font-weight:600;color:#1b2436}.mb-resch-close{border:none;background:none;font-size:18px;color:#8a94a3;cursor:pointer;line-height:1;width:max-content}.mb-resch-daystrip-row{display:flex;align-items:center;gap:4px;margin-bottom:14px}.mb-resch-daystrip{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;scroll-behavior:smooth}.mb-resch-daystrip::-webkit-scrollbar{height:5px}.mb-resch-daystrip::-webkit-scrollbar-thumb{background:#eee9e3;border-radius:999px}.mb-resch-nav{flex:none;width:26px!important;height:26px;border:1px solid #EEE9E3;border-radius:999px;background:#fff;color:#8a94a3;cursor:pointer;display:flex;align-items:center;justify-content:center}.mb-resch-nav:hover{border-color:#7c3a11;color:#7c3a11}.mb-resch-day{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;width:50px!important;padding:8px 0;border:1px solid #EEE9E3;border-radius:10px;background:#fff;cursor:pointer}.mb-resch-day:hover{border-color:#7c3a11}.mb-resch-day-dow{font-size:10.5px;color:#8a94a3;text-transform:uppercase}.mb-resch-day-num{font-size:13.5px;font-weight:600;color:#1b2436}.mb-resch-slots-loading,.mb-resch-slots-empty{font-size:12.5px;color:#8a94a3;margin-bottom:14px}.mb-resch-slots{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.mb-resch-slot{padding:9px 6px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;font-size:12.5px!important;color:#1b2436;cursor:pointer}.mb-resch-error{margin-top:14px;font-size:12.5px;color:#b4432e}.mb-resch-confirm{height:46px;border:none;border-radius:8px;background:#94a3b8;color:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-confirm:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i6.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }] }); }
|
|
426
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MyBookingsComponent, deps: [{ token: i1.RestService }, { token: i2.StorageServiceService }, { token: i3.MessageService }, { token: i4.EventsService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
427
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MyBookingsComponent, isStandalone: true, selector: "simpo-my-bookings", inputs: { data: "data" }, providers: [MessageService], viewQueries: [{ propertyName: "reschDayStripRef", first: true, predicate: ["reschDayStrip"], descendants: true }], ngImport: i0, template: "<p-toast position=\"bottom-right\"></p-toast>\n\n<div class=\"mb-root\">\n <ng-container *ngIf=\"currentTab === 'LIST'\">\n <div class=\"mb-title\">My Bookings</div>\n\n <div class=\"mb-tabs\">\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'upcoming'\" (click)=\"setProfTab('upcoming')\">Upcoming</button>\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'past'\" (click)=\"setProfTab('past')\">Past</button>\n </div>\n\n <div class=\"mb-loading\" *ngIf=\"loading\">Loading your bookings\u2026</div>\n\n <div class=\"mb-rows\" *ngIf=\"!loading && !isEmpty\">\n <button type=\"button\" class=\"mb-row\" *ngFor=\"let b of rows\" (click)=\"viewBookingDetail(b)\">\n <div class=\"mb-row-stripe\" [ngClass]=\"b.mode === 'HOME_VISIT' ? 'stripe-home' : b.mode === 'VIDEO_CALL' ? 'stripe-video' : 'stripe-store'\"></div>\n <div class=\"mb-row-info\">\n <div class=\"mb-row-top\">\n <div class=\"mb-row-title\">{{title(b)}}</div>\n </div>\n <div class=\"mb-row-when\">{{when(b)}}</div>\n <div class=\"mb-row-detail\">{{detail(b)}}</div>\n </div>\n <div class=\"mb-row-end\">\n <span class=\"mb-status\" [ngClass]=\"statusClass(b.status)\">{{statusLabel(b.status)}}</span>\n </div>\n </button>\n </div>\n\n <div class=\"mb-empty\" *ngIf=\"isEmpty\">\n <mat-icon class=\"mb-empty-icon\">event_busy</mat-icon>\n <div class=\"mb-empty-title\">No {{profTab}} bookings yet.</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"currentTab === 'DETAIL' && selected\">\n <button type=\"button\" class=\"mb-back\" (click)=\"backToList()\">\n <mat-icon>arrow_back</mat-icon> Back to My Bookings\n </button>\n\n <div class=\"mb-detail-card\">\n <div class=\"mb-detail-header\">\n <div class=\"mb-detail-title-row\">\n <div class=\"mb-detail-title\">{{title(selected)}}</div>\n <span class=\"mb-status\" [ngClass]=\"statusClass(selected.status)\">{{statusLabel(selected.status)}}</span>\n </div>\n <div class=\"mb-detail-when\">{{when(selected)}}</div>\n </div>\n\n <div class=\"mb-detail-rows\">\n <div class=\"mb-detail-row\" *ngIf=\"selected.services?.length\">\n <div class=\"mb-detail-k\">Services</div>\n <div class=\"mb-detail-v\">{{serviceNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.productLines?.length\">\n <div class=\"mb-detail-k\">Products</div>\n <div class=\"mb-detail-v\">{{productNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.customerDetail\">\n <div class=\"mb-detail-k\">Contact</div>\n <div class=\"mb-detail-v\">{{selected.customerDetail?.name}} \u00B7 {{selected.customerDetail?.phoneNumber}} \u00B7 {{selected.customerDetail?.email}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.mode === 'HOME_VISIT' && selected.addressDetails\">\n <div class=\"mb-detail-k\">Address</div>\n <div class=\"mb-detail-v\">{{selected.addressDetails?.addressLine1}}, {{selected.addressDetails?.city}}, {{selected.addressDetails?.state}} {{selected.addressDetails?.zipCode}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"servicePriceTotal(selected) > 0\">\n <div class=\"mb-detail-k\">Service price</div>\n <div class=\"mb-detail-v\">\u20B9{{servicePriceTotal(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.homeVisitCharge\">\n <div class=\"mb-detail-k\">Home visit charge</div>\n <div class=\"mb-detail-v\">\u20B9{{selected.homeVisitCharge}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Total</div>\n <div class=\"mb-detail-v\">\u20B9{{totalDue(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Paid</div>\n <div class=\"mb-detail-v\">{{paidLabel(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"pendingAmount(selected) > 0\">\n <div class=\"mb-detail-k\">Pending at appointment</div>\n <div class=\"mb-detail-v\">\u20B9{{pendingAmount(selected)}}</div>\n </div>\n </div>\n\n <div class=\"mb-video-link\" *ngIf=\"selected.mode === 'VIDEO_CALL' && selected.videoCallLink && selected.status !== 'CANCELLED'\">\n <mat-icon>videocam</mat-icon>\n <a [href]=\"selected.videoCallLink\" target=\"_blank\">{{selected.videoCallLink}}</a>\n </div>\n\n <div class=\"mb-policy\" *ngIf=\"canRescheduleSelected\">\n <div class=\"mb-policy-title\">Reschedule policy</div>\n <div class=\"mb-policy-text\">You can reschedule this booking up to {{rescheduleCutoffHours}} hour{{rescheduleCutoffHours === 1 ? '' : 's'}} before the appointment time.</div>\n </div>\n <div class=\"mb-policy\" *ngIf=\"canCancelSelected && cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n\n <div class=\"mb-actions-row\" *ngIf=\"selected.status === 'BOOKED' || canCancelSelected\">\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"selected.status === 'BOOKED'\"\n [disabled]=\"!canRescheduleSelected\"\n [title]=\"!canRescheduleSelected ? selected.rescheduleBlockedReason : ''\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openReschedulePanel()\"\n >Reschedule booking</button>\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"canAddServiceSelected\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openAddServicePanel()\"\n >Add service</button>\n <button\n type=\"button\"\n class=\"mb-cancel-btn\"\n *ngIf=\"canCancelSelected\"\n [disabled]=\"cancelling\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openCancelConfirm()\"\n >\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\n </button>\n </div>\n\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\n </div>\n </ng-container>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"reschedulePanelOpen\" (click)=\"closeReschedulePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Choose a new date & time</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeReschedulePanel()\">×</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-daystrip-row\">\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(-1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"></path></svg>\n </button>\n <div class=\"mb-resch-daystrip\" #reschDayStrip>\n <button\n type=\"button\"\n class=\"mb-resch-day\"\n *ngFor=\"let day of reschDays\"\n [class.active]=\"day.iso === reschSelectedIso\"\n [style.background]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n (click)=\"selectReschDay(day)\"\n >\n <span class=\"mb-resch-day-dow\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.dow}}</span>\n <span class=\"mb-resch-day-num\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.num}}</span>\n </button>\n </div>\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"></path></svg>\n </button>\n </div>\n\n <div class=\"mb-resch-slots-loading\" *ngIf=\"reschLoadingSlots\">Loading available times\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!reschLoadingSlots && reschNoSlots\">No slots available on this date. Try another date.</div>\n <div class=\"mb-resch-slots\" *ngIf=\"!reschLoadingSlots && reschSlots.length\">\n <button\n type=\"button\"\n class=\"mb-resch-slot\"\n *ngFor=\"let slot of reschSlots\"\n [class.active]=\"slot === reschSelectedTime\"\n [style.background]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.color]=\"slot === reschSelectedTime ? contrastColor : null\"\n (click)=\"selectReschTime(slot)\"\n >{{slot}}</button>\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"reschError\">{{reschError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeReschedulePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"reschInvalid\"\n [style.background]=\"reschInvalid ? null : styles?.background?.accentColor\"\n [style.color]=\"reschInvalid ? null : contrastColor\"\n (click)=\"confirmReschedule()\"\n >\n {{reschConfirming ? 'Confirming\u2026' : 'Confirm new slot'}}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"cancelConfirmOpen\" (click)=\"closeCancelConfirm()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Cancel this booking?</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeCancelConfirm()\">×</button>\n </div>\n <div class=\"mb-resch-body\">\n <div class=\"mb-policy-text\">This can't be undone.</div>\n <div class=\"mb-policy\" *ngIf=\"cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n </div>\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeCancelConfirm()\">Keep booking</button>\n <button type=\"button\" class=\"mb-resch-confirm\" [disabled]=\"cancelling\" (click)=\"cancelBooking()\">\n {{cancelling ? 'Cancelling\u2026' : 'Yes, cancel booking'}}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"addServicePanelOpen\" (click)=\"closeAddServicePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Add service(s)</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeAddServicePanel()\">×</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-slots-loading\" *ngIf=\"addServiceLoading\">Loading services\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!addServiceLoading && addServiceOptions.length === 0\">\n No services available to add right now.\n </div>\n\n <div class=\"mb-addsvc-list\" *ngIf=\"!addServiceLoading && addServiceOptions.length\">\n <button\n type=\"button\"\n class=\"mb-addsvc-row\"\n [class.selected]=\"isAddServiceSelected(service)\"\n *ngFor=\"let service of addServiceOptions\"\n [disabled]=\"addServiceSubmitting\"\n (click)=\"toggleAddService(service)\"\n >\n <input type=\"checkbox\" class=\"mb-addsvc-checkbox\" [checked]=\"isAddServiceSelected(service)\" (click)=\"$event.stopPropagation()\" (change)=\"toggleAddService(service)\" />\n <div class=\"f1\">\n <div class=\"mb-addsvc-name\">\n {{service.name}}\n <span class=\"mb-addsvc-meta\" *ngIf=\"service.duration\">{{service.duration}} min</span>\n </div>\n </div>\n <div class=\"mb-addsvc-price\" *ngIf=\"service.priceDetails?.totalPrice\">\u20B9{{service.priceDetails.totalPrice}}</div>\n </button>\n </div>\n\n <div class=\"mb-addsvc-total\" *ngIf=\"addServiceSelected.length && addServiceTotalDeposit > 0\">\n Deposit due now: \u20B9{{addServiceTotalDeposit}}\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"addServiceError\">{{addServiceError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\" *ngIf=\"!addServiceLoading && addServiceOptions.length\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeAddServicePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"!addServiceSelected.length || addServiceSubmitting\"\n [style.background]=\"!addServiceSelected.length ? null : styles?.background?.accentColor\"\n [style.color]=\"!addServiceSelected.length ? null : contrastColor\"\n (click)=\"addService()\"\n >\n {{addServiceSubmitting ? 'Adding\u2026' : 'Add ' + (addServiceSelected.length || '') + ' service' + (addServiceSelected.length === 1 ? '' : 's')}}\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".mb-root{display:flex;flex-direction:column;gap:16px;padding:4px 0 24px}.mb-title{font-size:20px;font-weight:600;color:#1b2436}.mb-tabs{display:flex;background:#f5f2ee;border-radius:8px;padding:4px;gap:4px;width:fit-content}.mb-tab{border:none;background:transparent;border-radius:6px;padding:8px 18px;font-size:13.5px;font-weight:500;color:#8a94a3;cursor:pointer}.mb-tab.active{background:#fff;color:#1b2436;font-weight:600;box-shadow:0 1px 3px #00000012}.mb-loading{font-size:13.5px;color:#8a94a3;padding:20px 0}.mb-rows{display:flex;flex-direction:column;gap:12px}.mb-row{border:1px solid #EEE9E3;border-radius:10px;padding:16px 18px;display:flex;align-items:flex-start;gap:14px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-row-stripe{width:3px;align-self:stretch;border-radius:999px;flex:none}.stripe-home{background:#16233a}.stripe-video{background:#7c3a11}.stripe-store{background:#8a94a3}.mb-row-info{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.mb-row-title{font-size:14.5px;font-weight:600;color:#1b2436}.mb-row-when{font-size:12.5px;color:#6b7688}.mb-row-detail{font-size:12px;color:#8a94a3}.mb-row-end{flex:none}.mb-status{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:600;border-radius:999px;padding:4px 9px;white-space:nowrap}.status-confirmed{background:#e8f4ee;color:#1e7a4b}.status-completed{background:#f2eee9;color:#8a7c6c}.status-cancelled{background:#fbedec;color:#b4432e}.status-pending{background:#fdf3e3;color:#b36b00}.status-ongoing{background:#e3f2fd;color:#1565c0}.mb-empty{display:flex;flex-direction:column;align-items:center;gap:10px;padding:50px 20px;text-align:center}.mb-empty-icon{font-size:40px!important;height:40px!important;width:40px!important;color:#c9b7a2!important}.mb-empty-title{font-size:14.5px;color:#8a94a3}.mb-back{display:flex;align-items:center;gap:6px;border:none;background:none;padding:0;cursor:pointer;font-size:12.5px;color:#7c3a11;margin-bottom:6px;width:fit-content}.mb-back mat-icon{font-size:16px!important;height:16px!important;width:16px!important}.mb-detail-card{border:1px solid #EEE9E3;border-radius:12px;padding:20px 22px;display:flex;flex-direction:column;gap:16px;background:#fff}.mb-detail-header{display:flex;flex-direction:column;gap:6px;padding-bottom:14px;border-bottom:1px solid #F0ECE7}.mb-detail-title-row{display:flex;align-items:center;gap:10px}.mb-detail-title{font-size:17px;font-weight:600;color:#1b2436}.mb-detail-when{font-size:13px;color:#6b7688}.mb-detail-rows{display:flex;flex-direction:column;gap:12px}.mb-detail-row{display:flex;justify-content:space-between;gap:16px;font-size:13px}.mb-detail-k{color:#8a94a3;flex:none}.mb-detail-v{color:#1b2436;font-weight:500;text-align:right}.mb-video-link{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#f2f9f5;border-radius:8px;font-size:13px;color:#2c6a4b}.mb-video-link mat-icon{color:#1e7a4b!important;flex:none}.mb-policy{background:#fbfaf8;border:1px solid #EDE8E2;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:4px}.mb-policy-title{font-size:12px;font-weight:600;color:#a08b72;text-transform:uppercase;letter-spacing:.06em}.mb-policy-text{font-size:12.5px;line-height:1.6;color:#5f6b7c}.mb-cancel-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-cancel-btn:disabled{opacity:.6;cursor:not-allowed}.mb-cancelled-note{font-size:13px;color:#b4432e;font-weight:600}.mb-actions-row{display:flex;gap:12px}.mb-actions-row .mb-reschedule-btn,.mb-actions-row .mb-cancel-btn{flex:1}.mb-reschedule-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-reschedule-btn:disabled{opacity:.5;cursor:not-allowed}.mb-resch-backdrop{position:fixed;inset:0;background:#1b243673;display:flex;align-items:center;justify-content:center;padding:16px;z-index:1000}.mb-resch-panel{width:100%;max-width:440px;max-height:85vh;border-radius:14px;background:#fff;box-shadow:0 20px 50px #14141e40;display:flex;flex-direction:column;overflow:hidden}.mb-resch-header{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid #F0ECE7;flex:none}.mb-resch-body{padding:18px 20px;overflow-y:auto}.mb-resch-footer{display:flex;gap:10px;padding:14px 20px;border-top:1px solid #F0ECE7;flex:none}.mb-resch-footer .mb-resch-cancel,.mb-resch-footer .mb-resch-confirm{flex:1}.mb-resch-cancel{height:46px;border:1.5px solid #E2E2E9;border-radius:8px;background:#fff;color:#5f6b7c;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-title{font-size:14px;font-weight:600;color:#1b2436}.mb-resch-close{border:none;background:none;font-size:18px;color:#8a94a3;cursor:pointer;line-height:1;width:max-content}.mb-resch-daystrip-row{display:flex;align-items:center;gap:4px;margin-bottom:14px}.mb-resch-daystrip{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;scroll-behavior:smooth}.mb-resch-daystrip::-webkit-scrollbar{height:5px}.mb-resch-daystrip::-webkit-scrollbar-thumb{background:#eee9e3;border-radius:999px}.mb-resch-nav{flex:none;width:26px!important;height:26px;border:1px solid #EEE9E3;border-radius:999px;background:#fff;color:#8a94a3;cursor:pointer;display:flex;align-items:center;justify-content:center}.mb-resch-nav:hover{border-color:#7c3a11;color:#7c3a11}.mb-resch-day{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;width:50px!important;padding:8px 0;border:1px solid #EEE9E3;border-radius:10px;background:#fff;cursor:pointer}.mb-resch-day:hover{border-color:#7c3a11}.mb-resch-day-dow{font-size:10.5px;color:#8a94a3;text-transform:uppercase}.mb-resch-day-num{font-size:13.5px;font-weight:600;color:#1b2436}.mb-resch-slots-loading,.mb-resch-slots-empty{font-size:12.5px;color:#8a94a3;margin-bottom:14px}.mb-resch-slots{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.mb-resch-slot{padding:9px 6px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;font-size:12.5px!important;color:#1b2436;cursor:pointer}.mb-resch-error{margin-top:14px;font-size:12.5px;color:#b4432e}.mb-addsvc-list{display:flex;flex-direction:column;gap:8px}.mb-addsvc-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 12px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-addsvc-row.selected{background:#f6f2fc;border-color:#6d28d9}.mb-addsvc-row:disabled{opacity:.6;cursor:default}.mb-addsvc-checkbox{flex:none;width:16px;height:16px;cursor:pointer}.mb-addsvc-row .f1{flex:1}.mb-addsvc-name{font-size:13px;color:#1b2436}.mb-addsvc-meta{display:block;font-size:11.5px;color:#8a94a3;margin-top:2px}.mb-addsvc-price{font-size:13px;font-weight:600;color:#1b2436;flex:none}.mb-addsvc-total{margin-top:12px;font-size:12.5px;font-weight:600;color:#1b2436}.mb-resch-confirm{height:46px;border:none;border-radius:8px;background:#94a3b8;color:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-confirm:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i7.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }] }); }
|
|
318
428
|
}
|
|
319
429
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MyBookingsComponent, decorators: [{
|
|
320
430
|
type: Component,
|
|
321
|
-
args: [{ selector: 'simpo-my-bookings', standalone: true, imports: [CommonModule, MatIconModule, ToastModule], providers: [MessageService], template: "<p-toast position=\"bottom-right\"></p-toast>\r\n\r\n<div class=\"mb-root\">\r\n <ng-container *ngIf=\"currentTab === 'LIST'\">\r\n <div class=\"mb-title\">My Bookings</div>\r\n\r\n <div class=\"mb-tabs\">\r\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'upcoming'\" (click)=\"setProfTab('upcoming')\">Upcoming</button>\r\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'past'\" (click)=\"setProfTab('past')\">Past</button>\r\n </div>\r\n\r\n <div class=\"mb-loading\" *ngIf=\"loading\">Loading your bookings\u2026</div>\r\n\r\n <div class=\"mb-rows\" *ngIf=\"!loading && !isEmpty\">\r\n <button type=\"button\" class=\"mb-row\" *ngFor=\"let b of rows\" (click)=\"viewBookingDetail(b)\">\r\n <div class=\"mb-row-stripe\" [ngClass]=\"b.mode === 'HOME_VISIT' ? 'stripe-home' : b.mode === 'VIDEO_CALL' ? 'stripe-video' : 'stripe-store'\"></div>\r\n <div class=\"mb-row-info\">\r\n <div class=\"mb-row-top\">\r\n <div class=\"mb-row-title\">{{title(b)}}</div>\r\n </div>\r\n <div class=\"mb-row-when\">{{when(b)}}</div>\r\n <div class=\"mb-row-detail\">{{detail(b)}}</div>\r\n </div>\r\n <div class=\"mb-row-end\">\r\n <span class=\"mb-status\" [ngClass]=\"statusClass(b.status)\">{{statusLabel(b.status)}}</span>\r\n </div>\r\n </button>\r\n </div>\r\n\r\n <div class=\"mb-empty\" *ngIf=\"isEmpty\">\r\n <mat-icon class=\"mb-empty-icon\">event_busy</mat-icon>\r\n <div class=\"mb-empty-title\">No {{profTab}} bookings yet.</div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"currentTab === 'DETAIL' && selected\">\r\n <button type=\"button\" class=\"mb-back\" (click)=\"backToList()\">\r\n <mat-icon>arrow_back</mat-icon> Back to My Bookings\r\n </button>\r\n\r\n <div class=\"mb-detail-card\">\r\n <div class=\"mb-detail-header\">\r\n <div class=\"mb-detail-title-row\">\r\n <div class=\"mb-detail-title\">{{title(selected)}}</div>\r\n <span class=\"mb-status\" [ngClass]=\"statusClass(selected.status)\">{{statusLabel(selected.status)}}</span>\r\n </div>\r\n <div class=\"mb-detail-when\">{{when(selected)}}</div>\r\n </div>\r\n\r\n <div class=\"mb-detail-rows\">\r\n <div class=\"mb-detail-row\" *ngIf=\"selected.services?.length\">\r\n <div class=\"mb-detail-k\">Services</div>\r\n <div class=\"mb-detail-v\">{{serviceNames(selected)}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\" *ngIf=\"selected.productLines?.length\">\r\n <div class=\"mb-detail-k\">Products</div>\r\n <div class=\"mb-detail-v\">{{productNames(selected)}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\" *ngIf=\"selected.customerDetail\">\r\n <div class=\"mb-detail-k\">Contact</div>\r\n <div class=\"mb-detail-v\">{{selected.customerDetail?.name}} \u00B7 {{selected.customerDetail?.phoneNumber}} \u00B7 {{selected.customerDetail?.email}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\" *ngIf=\"selected.mode === 'HOME_VISIT' && selected.addressDetails\">\r\n <div class=\"mb-detail-k\">Address</div>\r\n <div class=\"mb-detail-v\">{{selected.addressDetails?.addressLine1}}, {{selected.addressDetails?.city}}, {{selected.addressDetails?.state}} {{selected.addressDetails?.zipCode}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\" *ngIf=\"servicePriceTotal(selected) > 0\">\r\n <div class=\"mb-detail-k\">Service price</div>\r\n <div class=\"mb-detail-v\">\u20B9{{servicePriceTotal(selected)}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\" *ngIf=\"selected.homeVisitCharge\">\r\n <div class=\"mb-detail-k\">Home visit charge</div>\r\n <div class=\"mb-detail-v\">\u20B9{{selected.homeVisitCharge}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\">\r\n <div class=\"mb-detail-k\">Total</div>\r\n <div class=\"mb-detail-v\">\u20B9{{totalDue(selected)}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\">\r\n <div class=\"mb-detail-k\">Paid</div>\r\n <div class=\"mb-detail-v\">{{paidLabel(selected)}}</div>\r\n </div>\r\n <div class=\"mb-detail-row\" *ngIf=\"pendingAmount(selected) > 0\">\r\n <div class=\"mb-detail-k\">Pending at appointment</div>\r\n <div class=\"mb-detail-v\">\u20B9{{pendingAmount(selected)}}</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-video-link\" *ngIf=\"selected.mode === 'VIDEO_CALL' && selected.videoCallLink && selected.status !== 'CANCELLED'\">\r\n <mat-icon>videocam</mat-icon>\r\n <a [href]=\"selected.videoCallLink\" target=\"_blank\">{{selected.videoCallLink}}</a>\r\n </div>\r\n\r\n <div class=\"mb-policy\" *ngIf=\"canRescheduleSelected\">\r\n <div class=\"mb-policy-title\">Reschedule policy</div>\r\n <div class=\"mb-policy-text\">You can reschedule this booking up to {{rescheduleCutoffHours}} hour{{rescheduleCutoffHours === 1 ? '' : 's'}} before the appointment time.</div>\r\n </div>\r\n <div class=\"mb-policy\" *ngIf=\"canCancelSelected && cancellationPolicy\">\r\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\r\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\r\n </div>\r\n\r\n <div class=\"mb-actions-row\" *ngIf=\"selected.status === 'BOOKED' || canCancelSelected\">\r\n <button\r\n type=\"button\"\r\n class=\"mb-reschedule-btn\"\r\n *ngIf=\"selected.status === 'BOOKED'\"\r\n [disabled]=\"!canRescheduleSelected\"\r\n [title]=\"!canRescheduleSelected ? selected.rescheduleBlockedReason : ''\"\r\n [style.borderColor]=\"styles?.background?.accentColor\"\r\n [style.color]=\"styles?.background?.accentColor\"\r\n (click)=\"openReschedulePanel()\"\r\n >Reschedule booking</button>\r\n <button\r\n type=\"button\"\r\n class=\"mb-cancel-btn\"\r\n *ngIf=\"canCancelSelected\"\r\n [disabled]=\"cancelling\"\r\n [style.borderColor]=\"styles?.background?.accentColor\"\r\n [style.color]=\"styles?.background?.accentColor\"\r\n (click)=\"openCancelConfirm()\"\r\n >\r\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\r\n </button>\r\n </div>\r\n\r\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\r\n </div>\r\n </ng-container>\r\n\r\n <div class=\"mb-resch-backdrop\" *ngIf=\"reschedulePanelOpen\" (click)=\"closeReschedulePanel()\">\r\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"mb-resch-header\">\r\n <div class=\"mb-resch-title\">Choose a new date & time</div>\r\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeReschedulePanel()\">×</button>\r\n </div>\r\n\r\n <div class=\"mb-resch-body\">\r\n <div class=\"mb-resch-daystrip-row\">\r\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(-1)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"></path></svg>\r\n </button>\r\n <div class=\"mb-resch-daystrip\" #reschDayStrip>\r\n <button\r\n type=\"button\"\r\n class=\"mb-resch-day\"\r\n *ngFor=\"let day of reschDays\"\r\n [class.active]=\"day.iso === reschSelectedIso\"\r\n [style.background]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\r\n [style.borderColor]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\r\n (click)=\"selectReschDay(day)\"\r\n >\r\n <span class=\"mb-resch-day-dow\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.dow}}</span>\r\n <span class=\"mb-resch-day-num\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.num}}</span>\r\n </button>\r\n </div>\r\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(1)\">\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"></path></svg>\r\n </button>\r\n </div>\r\n\r\n <div class=\"mb-resch-slots-loading\" *ngIf=\"reschLoadingSlots\">Loading available times\u2026</div>\r\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!reschLoadingSlots && reschNoSlots\">No slots available on this date. Try another date.</div>\r\n <div class=\"mb-resch-slots\" *ngIf=\"!reschLoadingSlots && reschSlots.length\">\r\n <button\r\n type=\"button\"\r\n class=\"mb-resch-slot\"\r\n *ngFor=\"let slot of reschSlots\"\r\n [class.active]=\"slot === reschSelectedTime\"\r\n [style.background]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\r\n [style.borderColor]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\r\n [style.color]=\"slot === reschSelectedTime ? contrastColor : null\"\r\n (click)=\"selectReschTime(slot)\"\r\n >{{slot}}</button>\r\n </div>\r\n\r\n <div class=\"mb-resch-error\" *ngIf=\"reschError\">{{reschError}}</div>\r\n </div>\r\n\r\n <div class=\"mb-resch-footer\">\r\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeReschedulePanel()\">Cancel</button>\r\n <button\r\n type=\"button\"\r\n class=\"mb-resch-confirm\"\r\n [disabled]=\"reschInvalid\"\r\n [style.background]=\"reschInvalid ? null : styles?.background?.accentColor\"\r\n [style.color]=\"reschInvalid ? null : contrastColor\"\r\n (click)=\"confirmReschedule()\"\r\n >\r\n {{reschConfirming ? 'Confirming\u2026' : 'Confirm new slot'}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"mb-resch-backdrop\" *ngIf=\"cancelConfirmOpen\" (click)=\"closeCancelConfirm()\">\r\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"mb-resch-header\">\r\n <div class=\"mb-resch-title\">Cancel this booking?</div>\r\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeCancelConfirm()\">×</button>\r\n </div>\r\n <div class=\"mb-resch-body\">\r\n <div class=\"mb-policy-text\">This can't be undone.</div>\r\n <div class=\"mb-policy\" *ngIf=\"cancellationPolicy\">\r\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\r\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\r\n </div>\r\n </div>\r\n <div class=\"mb-resch-footer\">\r\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeCancelConfirm()\">Keep booking</button>\r\n <button type=\"button\" class=\"mb-resch-confirm\" [disabled]=\"cancelling\" (click)=\"cancelBooking()\">\r\n {{cancelling ? 'Cancelling\u2026' : 'Yes, cancel booking'}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [".mb-root{display:flex;flex-direction:column;gap:16px;padding:4px 0 24px}.mb-title{font-size:20px;font-weight:600;color:#1b2436}.mb-tabs{display:flex;background:#f5f2ee;border-radius:8px;padding:4px;gap:4px;width:fit-content}.mb-tab{border:none;background:transparent;border-radius:6px;padding:8px 18px;font-size:13.5px;font-weight:500;color:#8a94a3;cursor:pointer}.mb-tab.active{background:#fff;color:#1b2436;font-weight:600;box-shadow:0 1px 3px #00000012}.mb-loading{font-size:13.5px;color:#8a94a3;padding:20px 0}.mb-rows{display:flex;flex-direction:column;gap:12px}.mb-row{border:1px solid #EEE9E3;border-radius:10px;padding:16px 18px;display:flex;align-items:flex-start;gap:14px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-row-stripe{width:3px;align-self:stretch;border-radius:999px;flex:none}.stripe-home{background:#16233a}.stripe-video{background:#7c3a11}.stripe-store{background:#8a94a3}.mb-row-info{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.mb-row-title{font-size:14.5px;font-weight:600;color:#1b2436}.mb-row-when{font-size:12.5px;color:#6b7688}.mb-row-detail{font-size:12px;color:#8a94a3}.mb-row-end{flex:none}.mb-status{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:600;border-radius:999px;padding:4px 9px;white-space:nowrap}.status-confirmed{background:#e8f4ee;color:#1e7a4b}.status-completed{background:#f2eee9;color:#8a7c6c}.status-cancelled{background:#fbedec;color:#b4432e}.status-pending{background:#fdf3e3;color:#b36b00}.status-ongoing{background:#e3f2fd;color:#1565c0}.mb-empty{display:flex;flex-direction:column;align-items:center;gap:10px;padding:50px 20px;text-align:center}.mb-empty-icon{font-size:40px!important;height:40px!important;width:40px!important;color:#c9b7a2!important}.mb-empty-title{font-size:14.5px;color:#8a94a3}.mb-back{display:flex;align-items:center;gap:6px;border:none;background:none;padding:0;cursor:pointer;font-size:12.5px;color:#7c3a11;margin-bottom:6px;width:fit-content}.mb-back mat-icon{font-size:16px!important;height:16px!important;width:16px!important}.mb-detail-card{border:1px solid #EEE9E3;border-radius:12px;padding:20px 22px;display:flex;flex-direction:column;gap:16px;background:#fff}.mb-detail-header{display:flex;flex-direction:column;gap:6px;padding-bottom:14px;border-bottom:1px solid #F0ECE7}.mb-detail-title-row{display:flex;align-items:center;gap:10px}.mb-detail-title{font-size:17px;font-weight:600;color:#1b2436}.mb-detail-when{font-size:13px;color:#6b7688}.mb-detail-rows{display:flex;flex-direction:column;gap:12px}.mb-detail-row{display:flex;justify-content:space-between;gap:16px;font-size:13px}.mb-detail-k{color:#8a94a3;flex:none}.mb-detail-v{color:#1b2436;font-weight:500;text-align:right}.mb-video-link{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#f2f9f5;border-radius:8px;font-size:13px;color:#2c6a4b}.mb-video-link mat-icon{color:#1e7a4b!important;flex:none}.mb-policy{background:#fbfaf8;border:1px solid #EDE8E2;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:4px}.mb-policy-title{font-size:12px;font-weight:600;color:#a08b72;text-transform:uppercase;letter-spacing:.06em}.mb-policy-text{font-size:12.5px;line-height:1.6;color:#5f6b7c}.mb-cancel-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-cancel-btn:disabled{opacity:.6;cursor:not-allowed}.mb-cancelled-note{font-size:13px;color:#b4432e;font-weight:600}.mb-actions-row{display:flex;gap:12px}.mb-actions-row .mb-reschedule-btn,.mb-actions-row .mb-cancel-btn{flex:1}.mb-reschedule-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-reschedule-btn:disabled{opacity:.5;cursor:not-allowed}.mb-resch-backdrop{position:fixed;inset:0;background:#1b243673;display:flex;align-items:center;justify-content:center;padding:16px;z-index:1000}.mb-resch-panel{width:100%;max-width:440px;max-height:85vh;border-radius:14px;background:#fff;box-shadow:0 20px 50px #14141e40;display:flex;flex-direction:column;overflow:hidden}.mb-resch-header{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid #F0ECE7;flex:none}.mb-resch-body{padding:18px 20px;overflow-y:auto}.mb-resch-footer{display:flex;gap:10px;padding:14px 20px;border-top:1px solid #F0ECE7;flex:none}.mb-resch-footer .mb-resch-cancel,.mb-resch-footer .mb-resch-confirm{flex:1}.mb-resch-cancel{height:46px;border:1.5px solid #E2E2E9;border-radius:8px;background:#fff;color:#5f6b7c;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-title{font-size:14px;font-weight:600;color:#1b2436}.mb-resch-close{border:none;background:none;font-size:18px;color:#8a94a3;cursor:pointer;line-height:1;width:max-content}.mb-resch-daystrip-row{display:flex;align-items:center;gap:4px;margin-bottom:14px}.mb-resch-daystrip{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;scroll-behavior:smooth}.mb-resch-daystrip::-webkit-scrollbar{height:5px}.mb-resch-daystrip::-webkit-scrollbar-thumb{background:#eee9e3;border-radius:999px}.mb-resch-nav{flex:none;width:26px!important;height:26px;border:1px solid #EEE9E3;border-radius:999px;background:#fff;color:#8a94a3;cursor:pointer;display:flex;align-items:center;justify-content:center}.mb-resch-nav:hover{border-color:#7c3a11;color:#7c3a11}.mb-resch-day{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;width:50px!important;padding:8px 0;border:1px solid #EEE9E3;border-radius:10px;background:#fff;cursor:pointer}.mb-resch-day:hover{border-color:#7c3a11}.mb-resch-day-dow{font-size:10.5px;color:#8a94a3;text-transform:uppercase}.mb-resch-day-num{font-size:13.5px;font-weight:600;color:#1b2436}.mb-resch-slots-loading,.mb-resch-slots-empty{font-size:12.5px;color:#8a94a3;margin-bottom:14px}.mb-resch-slots{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.mb-resch-slot{padding:9px 6px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;font-size:12.5px!important;color:#1b2436;cursor:pointer}.mb-resch-error{margin-top:14px;font-size:12.5px;color:#b4432e}.mb-resch-confirm{height:46px;border:none;border-radius:8px;background:#94a3b8;color:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-confirm:disabled{opacity:.5;cursor:not-allowed}\n"] }]
|
|
322
|
-
}], ctorParameters: () => [{ type: i1.RestService }, { type: i2.StorageServiceService }, { type: i3.MessageService }], propDecorators: { data: [{
|
|
431
|
+
args: [{ selector: 'simpo-my-bookings', standalone: true, imports: [CommonModule, MatIconModule, ToastModule], providers: [MessageService], template: "<p-toast position=\"bottom-right\"></p-toast>\n\n<div class=\"mb-root\">\n <ng-container *ngIf=\"currentTab === 'LIST'\">\n <div class=\"mb-title\">My Bookings</div>\n\n <div class=\"mb-tabs\">\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'upcoming'\" (click)=\"setProfTab('upcoming')\">Upcoming</button>\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'past'\" (click)=\"setProfTab('past')\">Past</button>\n </div>\n\n <div class=\"mb-loading\" *ngIf=\"loading\">Loading your bookings\u2026</div>\n\n <div class=\"mb-rows\" *ngIf=\"!loading && !isEmpty\">\n <button type=\"button\" class=\"mb-row\" *ngFor=\"let b of rows\" (click)=\"viewBookingDetail(b)\">\n <div class=\"mb-row-stripe\" [ngClass]=\"b.mode === 'HOME_VISIT' ? 'stripe-home' : b.mode === 'VIDEO_CALL' ? 'stripe-video' : 'stripe-store'\"></div>\n <div class=\"mb-row-info\">\n <div class=\"mb-row-top\">\n <div class=\"mb-row-title\">{{title(b)}}</div>\n </div>\n <div class=\"mb-row-when\">{{when(b)}}</div>\n <div class=\"mb-row-detail\">{{detail(b)}}</div>\n </div>\n <div class=\"mb-row-end\">\n <span class=\"mb-status\" [ngClass]=\"statusClass(b.status)\">{{statusLabel(b.status)}}</span>\n </div>\n </button>\n </div>\n\n <div class=\"mb-empty\" *ngIf=\"isEmpty\">\n <mat-icon class=\"mb-empty-icon\">event_busy</mat-icon>\n <div class=\"mb-empty-title\">No {{profTab}} bookings yet.</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"currentTab === 'DETAIL' && selected\">\n <button type=\"button\" class=\"mb-back\" (click)=\"backToList()\">\n <mat-icon>arrow_back</mat-icon> Back to My Bookings\n </button>\n\n <div class=\"mb-detail-card\">\n <div class=\"mb-detail-header\">\n <div class=\"mb-detail-title-row\">\n <div class=\"mb-detail-title\">{{title(selected)}}</div>\n <span class=\"mb-status\" [ngClass]=\"statusClass(selected.status)\">{{statusLabel(selected.status)}}</span>\n </div>\n <div class=\"mb-detail-when\">{{when(selected)}}</div>\n </div>\n\n <div class=\"mb-detail-rows\">\n <div class=\"mb-detail-row\" *ngIf=\"selected.services?.length\">\n <div class=\"mb-detail-k\">Services</div>\n <div class=\"mb-detail-v\">{{serviceNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.productLines?.length\">\n <div class=\"mb-detail-k\">Products</div>\n <div class=\"mb-detail-v\">{{productNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.customerDetail\">\n <div class=\"mb-detail-k\">Contact</div>\n <div class=\"mb-detail-v\">{{selected.customerDetail?.name}} \u00B7 {{selected.customerDetail?.phoneNumber}} \u00B7 {{selected.customerDetail?.email}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.mode === 'HOME_VISIT' && selected.addressDetails\">\n <div class=\"mb-detail-k\">Address</div>\n <div class=\"mb-detail-v\">{{selected.addressDetails?.addressLine1}}, {{selected.addressDetails?.city}}, {{selected.addressDetails?.state}} {{selected.addressDetails?.zipCode}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"servicePriceTotal(selected) > 0\">\n <div class=\"mb-detail-k\">Service price</div>\n <div class=\"mb-detail-v\">\u20B9{{servicePriceTotal(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.homeVisitCharge\">\n <div class=\"mb-detail-k\">Home visit charge</div>\n <div class=\"mb-detail-v\">\u20B9{{selected.homeVisitCharge}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Total</div>\n <div class=\"mb-detail-v\">\u20B9{{totalDue(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Paid</div>\n <div class=\"mb-detail-v\">{{paidLabel(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"pendingAmount(selected) > 0\">\n <div class=\"mb-detail-k\">Pending at appointment</div>\n <div class=\"mb-detail-v\">\u20B9{{pendingAmount(selected)}}</div>\n </div>\n </div>\n\n <div class=\"mb-video-link\" *ngIf=\"selected.mode === 'VIDEO_CALL' && selected.videoCallLink && selected.status !== 'CANCELLED'\">\n <mat-icon>videocam</mat-icon>\n <a [href]=\"selected.videoCallLink\" target=\"_blank\">{{selected.videoCallLink}}</a>\n </div>\n\n <div class=\"mb-policy\" *ngIf=\"canRescheduleSelected\">\n <div class=\"mb-policy-title\">Reschedule policy</div>\n <div class=\"mb-policy-text\">You can reschedule this booking up to {{rescheduleCutoffHours}} hour{{rescheduleCutoffHours === 1 ? '' : 's'}} before the appointment time.</div>\n </div>\n <div class=\"mb-policy\" *ngIf=\"canCancelSelected && cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n\n <div class=\"mb-actions-row\" *ngIf=\"selected.status === 'BOOKED' || canCancelSelected\">\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"selected.status === 'BOOKED'\"\n [disabled]=\"!canRescheduleSelected\"\n [title]=\"!canRescheduleSelected ? selected.rescheduleBlockedReason : ''\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openReschedulePanel()\"\n >Reschedule booking</button>\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"canAddServiceSelected\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openAddServicePanel()\"\n >Add service</button>\n <button\n type=\"button\"\n class=\"mb-cancel-btn\"\n *ngIf=\"canCancelSelected\"\n [disabled]=\"cancelling\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openCancelConfirm()\"\n >\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\n </button>\n </div>\n\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\n </div>\n </ng-container>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"reschedulePanelOpen\" (click)=\"closeReschedulePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Choose a new date & time</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeReschedulePanel()\">×</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-daystrip-row\">\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(-1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"></path></svg>\n </button>\n <div class=\"mb-resch-daystrip\" #reschDayStrip>\n <button\n type=\"button\"\n class=\"mb-resch-day\"\n *ngFor=\"let day of reschDays\"\n [class.active]=\"day.iso === reschSelectedIso\"\n [style.background]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n (click)=\"selectReschDay(day)\"\n >\n <span class=\"mb-resch-day-dow\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.dow}}</span>\n <span class=\"mb-resch-day-num\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.num}}</span>\n </button>\n </div>\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"></path></svg>\n </button>\n </div>\n\n <div class=\"mb-resch-slots-loading\" *ngIf=\"reschLoadingSlots\">Loading available times\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!reschLoadingSlots && reschNoSlots\">No slots available on this date. Try another date.</div>\n <div class=\"mb-resch-slots\" *ngIf=\"!reschLoadingSlots && reschSlots.length\">\n <button\n type=\"button\"\n class=\"mb-resch-slot\"\n *ngFor=\"let slot of reschSlots\"\n [class.active]=\"slot === reschSelectedTime\"\n [style.background]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.color]=\"slot === reschSelectedTime ? contrastColor : null\"\n (click)=\"selectReschTime(slot)\"\n >{{slot}}</button>\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"reschError\">{{reschError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeReschedulePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"reschInvalid\"\n [style.background]=\"reschInvalid ? null : styles?.background?.accentColor\"\n [style.color]=\"reschInvalid ? null : contrastColor\"\n (click)=\"confirmReschedule()\"\n >\n {{reschConfirming ? 'Confirming\u2026' : 'Confirm new slot'}}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"cancelConfirmOpen\" (click)=\"closeCancelConfirm()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Cancel this booking?</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeCancelConfirm()\">×</button>\n </div>\n <div class=\"mb-resch-body\">\n <div class=\"mb-policy-text\">This can't be undone.</div>\n <div class=\"mb-policy\" *ngIf=\"cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n </div>\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeCancelConfirm()\">Keep booking</button>\n <button type=\"button\" class=\"mb-resch-confirm\" [disabled]=\"cancelling\" (click)=\"cancelBooking()\">\n {{cancelling ? 'Cancelling\u2026' : 'Yes, cancel booking'}}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"addServicePanelOpen\" (click)=\"closeAddServicePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Add service(s)</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeAddServicePanel()\">×</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-slots-loading\" *ngIf=\"addServiceLoading\">Loading services\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!addServiceLoading && addServiceOptions.length === 0\">\n No services available to add right now.\n </div>\n\n <div class=\"mb-addsvc-list\" *ngIf=\"!addServiceLoading && addServiceOptions.length\">\n <button\n type=\"button\"\n class=\"mb-addsvc-row\"\n [class.selected]=\"isAddServiceSelected(service)\"\n *ngFor=\"let service of addServiceOptions\"\n [disabled]=\"addServiceSubmitting\"\n (click)=\"toggleAddService(service)\"\n >\n <input type=\"checkbox\" class=\"mb-addsvc-checkbox\" [checked]=\"isAddServiceSelected(service)\" (click)=\"$event.stopPropagation()\" (change)=\"toggleAddService(service)\" />\n <div class=\"f1\">\n <div class=\"mb-addsvc-name\">\n {{service.name}}\n <span class=\"mb-addsvc-meta\" *ngIf=\"service.duration\">{{service.duration}} min</span>\n </div>\n </div>\n <div class=\"mb-addsvc-price\" *ngIf=\"service.priceDetails?.totalPrice\">\u20B9{{service.priceDetails.totalPrice}}</div>\n </button>\n </div>\n\n <div class=\"mb-addsvc-total\" *ngIf=\"addServiceSelected.length && addServiceTotalDeposit > 0\">\n Deposit due now: \u20B9{{addServiceTotalDeposit}}\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"addServiceError\">{{addServiceError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\" *ngIf=\"!addServiceLoading && addServiceOptions.length\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeAddServicePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"!addServiceSelected.length || addServiceSubmitting\"\n [style.background]=\"!addServiceSelected.length ? null : styles?.background?.accentColor\"\n [style.color]=\"!addServiceSelected.length ? null : contrastColor\"\n (click)=\"addService()\"\n >\n {{addServiceSubmitting ? 'Adding\u2026' : 'Add ' + (addServiceSelected.length || '') + ' service' + (addServiceSelected.length === 1 ? '' : 's')}}\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".mb-root{display:flex;flex-direction:column;gap:16px;padding:4px 0 24px}.mb-title{font-size:20px;font-weight:600;color:#1b2436}.mb-tabs{display:flex;background:#f5f2ee;border-radius:8px;padding:4px;gap:4px;width:fit-content}.mb-tab{border:none;background:transparent;border-radius:6px;padding:8px 18px;font-size:13.5px;font-weight:500;color:#8a94a3;cursor:pointer}.mb-tab.active{background:#fff;color:#1b2436;font-weight:600;box-shadow:0 1px 3px #00000012}.mb-loading{font-size:13.5px;color:#8a94a3;padding:20px 0}.mb-rows{display:flex;flex-direction:column;gap:12px}.mb-row{border:1px solid #EEE9E3;border-radius:10px;padding:16px 18px;display:flex;align-items:flex-start;gap:14px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-row-stripe{width:3px;align-self:stretch;border-radius:999px;flex:none}.stripe-home{background:#16233a}.stripe-video{background:#7c3a11}.stripe-store{background:#8a94a3}.mb-row-info{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.mb-row-title{font-size:14.5px;font-weight:600;color:#1b2436}.mb-row-when{font-size:12.5px;color:#6b7688}.mb-row-detail{font-size:12px;color:#8a94a3}.mb-row-end{flex:none}.mb-status{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:600;border-radius:999px;padding:4px 9px;white-space:nowrap}.status-confirmed{background:#e8f4ee;color:#1e7a4b}.status-completed{background:#f2eee9;color:#8a7c6c}.status-cancelled{background:#fbedec;color:#b4432e}.status-pending{background:#fdf3e3;color:#b36b00}.status-ongoing{background:#e3f2fd;color:#1565c0}.mb-empty{display:flex;flex-direction:column;align-items:center;gap:10px;padding:50px 20px;text-align:center}.mb-empty-icon{font-size:40px!important;height:40px!important;width:40px!important;color:#c9b7a2!important}.mb-empty-title{font-size:14.5px;color:#8a94a3}.mb-back{display:flex;align-items:center;gap:6px;border:none;background:none;padding:0;cursor:pointer;font-size:12.5px;color:#7c3a11;margin-bottom:6px;width:fit-content}.mb-back mat-icon{font-size:16px!important;height:16px!important;width:16px!important}.mb-detail-card{border:1px solid #EEE9E3;border-radius:12px;padding:20px 22px;display:flex;flex-direction:column;gap:16px;background:#fff}.mb-detail-header{display:flex;flex-direction:column;gap:6px;padding-bottom:14px;border-bottom:1px solid #F0ECE7}.mb-detail-title-row{display:flex;align-items:center;gap:10px}.mb-detail-title{font-size:17px;font-weight:600;color:#1b2436}.mb-detail-when{font-size:13px;color:#6b7688}.mb-detail-rows{display:flex;flex-direction:column;gap:12px}.mb-detail-row{display:flex;justify-content:space-between;gap:16px;font-size:13px}.mb-detail-k{color:#8a94a3;flex:none}.mb-detail-v{color:#1b2436;font-weight:500;text-align:right}.mb-video-link{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#f2f9f5;border-radius:8px;font-size:13px;color:#2c6a4b}.mb-video-link mat-icon{color:#1e7a4b!important;flex:none}.mb-policy{background:#fbfaf8;border:1px solid #EDE8E2;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:4px}.mb-policy-title{font-size:12px;font-weight:600;color:#a08b72;text-transform:uppercase;letter-spacing:.06em}.mb-policy-text{font-size:12.5px;line-height:1.6;color:#5f6b7c}.mb-cancel-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-cancel-btn:disabled{opacity:.6;cursor:not-allowed}.mb-cancelled-note{font-size:13px;color:#b4432e;font-weight:600}.mb-actions-row{display:flex;gap:12px}.mb-actions-row .mb-reschedule-btn,.mb-actions-row .mb-cancel-btn{flex:1}.mb-reschedule-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-reschedule-btn:disabled{opacity:.5;cursor:not-allowed}.mb-resch-backdrop{position:fixed;inset:0;background:#1b243673;display:flex;align-items:center;justify-content:center;padding:16px;z-index:1000}.mb-resch-panel{width:100%;max-width:440px;max-height:85vh;border-radius:14px;background:#fff;box-shadow:0 20px 50px #14141e40;display:flex;flex-direction:column;overflow:hidden}.mb-resch-header{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid #F0ECE7;flex:none}.mb-resch-body{padding:18px 20px;overflow-y:auto}.mb-resch-footer{display:flex;gap:10px;padding:14px 20px;border-top:1px solid #F0ECE7;flex:none}.mb-resch-footer .mb-resch-cancel,.mb-resch-footer .mb-resch-confirm{flex:1}.mb-resch-cancel{height:46px;border:1.5px solid #E2E2E9;border-radius:8px;background:#fff;color:#5f6b7c;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-title{font-size:14px;font-weight:600;color:#1b2436}.mb-resch-close{border:none;background:none;font-size:18px;color:#8a94a3;cursor:pointer;line-height:1;width:max-content}.mb-resch-daystrip-row{display:flex;align-items:center;gap:4px;margin-bottom:14px}.mb-resch-daystrip{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;scroll-behavior:smooth}.mb-resch-daystrip::-webkit-scrollbar{height:5px}.mb-resch-daystrip::-webkit-scrollbar-thumb{background:#eee9e3;border-radius:999px}.mb-resch-nav{flex:none;width:26px!important;height:26px;border:1px solid #EEE9E3;border-radius:999px;background:#fff;color:#8a94a3;cursor:pointer;display:flex;align-items:center;justify-content:center}.mb-resch-nav:hover{border-color:#7c3a11;color:#7c3a11}.mb-resch-day{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;width:50px!important;padding:8px 0;border:1px solid #EEE9E3;border-radius:10px;background:#fff;cursor:pointer}.mb-resch-day:hover{border-color:#7c3a11}.mb-resch-day-dow{font-size:10.5px;color:#8a94a3;text-transform:uppercase}.mb-resch-day-num{font-size:13.5px;font-weight:600;color:#1b2436}.mb-resch-slots-loading,.mb-resch-slots-empty{font-size:12.5px;color:#8a94a3;margin-bottom:14px}.mb-resch-slots{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.mb-resch-slot{padding:9px 6px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;font-size:12.5px!important;color:#1b2436;cursor:pointer}.mb-resch-error{margin-top:14px;font-size:12.5px;color:#b4432e}.mb-addsvc-list{display:flex;flex-direction:column;gap:8px}.mb-addsvc-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 12px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-addsvc-row.selected{background:#f6f2fc;border-color:#6d28d9}.mb-addsvc-row:disabled{opacity:.6;cursor:default}.mb-addsvc-checkbox{flex:none;width:16px;height:16px;cursor:pointer}.mb-addsvc-row .f1{flex:1}.mb-addsvc-name{font-size:13px;color:#1b2436}.mb-addsvc-meta{display:block;font-size:11.5px;color:#8a94a3;margin-top:2px}.mb-addsvc-price{font-size:13px;font-weight:600;color:#1b2436;flex:none}.mb-addsvc-total{margin-top:12px;font-size:12.5px;font-weight:600;color:#1b2436}.mb-resch-confirm{height:46px;border:none;border-radius:8px;background:#94a3b8;color:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-confirm:disabled{opacity:.5;cursor:not-allowed}\n"] }]
|
|
432
|
+
}], ctorParameters: () => [{ type: i1.RestService }, { type: i2.StorageServiceService }, { type: i3.MessageService }, { type: i4.EventsService }], propDecorators: { data: [{
|
|
323
433
|
type: Input
|
|
324
434
|
}], reschDayStripRef: [{
|
|
325
435
|
type: ViewChild,
|
|
326
436
|
args: ['reschDayStrip']
|
|
327
437
|
}] } });
|
|
328
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXktYm9va2luZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lbGVtZW50cy9teS1ib29raW5ncy9teS1ib29raW5ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2VsZW1lbnRzL215LWJvb2tpbmdzL215LWJvb2tpbmdzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7O0FBNkI1Qzs7Ozs7R0FLRztBQVNILE1BQU0sT0FBTyxtQkFBbUI7SUFDOUIsWUFDbUIsV0FBd0IsRUFDeEIsY0FBcUMsRUFDckMsY0FBOEI7UUFGOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsbUJBQWMsR0FBZCxjQUFjLENBQXVCO1FBQ3JDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQTJCakQsZUFBVSxHQUFzQixNQUFNLENBQUM7UUFDdkMsWUFBTyxHQUF3QixVQUFVLENBQUM7UUFDMUMsWUFBTyxHQUFHLElBQUksQ0FBQztRQUNmLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsc0JBQWlCLEdBQUcs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QUMsY0FBYyxDQUFDO2lKQVdsQixJQUFJO3NCQUFaLEtBQUs7Z0JBc0NzQixnQkFBZ0I7c0JBQTNDLFNBQVM7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFRvYXN0TW9kdWxlIH0gZnJvbSAncHJpbWVuZy90b2FzdCc7XHJcbmltcG9ydCB7IGZvcmtKb2luLCBvZiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBSZXN0U2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3Jlc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IFVzZXIgfSBmcm9tICcuLi8uLi9lY29tbWVyY2Uvc3R5bGVzL3VzZXIubW9kYWwnO1xyXG5cclxuaW50ZXJmYWNlIEJvb2tpbmdSb3cge1xyXG4gIGdyb3VwSWQ6IHN0cmluZztcclxuICBtb2RlOiAnU1RPUkVfVklTSVQnIHwgJ0hPTUVfVklTSVQnIHwgJ1ZJREVPX0NBTEwnO1xyXG4gIGJvb2tpbmdEYXRlOiBzdHJpbmc7XHJcbiAgc3RhcnRUaW1lPzogc3RyaW5nO1xyXG4gIGVuZFRpbWU/OiBzdHJpbmc7XHJcbiAgc3RhdHVzOiAnUEVORElORycgfCAnQk9PS0VEJyB8ICdIT0xEJyB8ICdPTkdPSU5HJyB8ICdDT01QTEVURUQnIHwgJ0NBTkNFTExFRCc7XHJcbiAgc3RvcmVOYW1lPzogc3RyaW5nO1xyXG4gIGN1c3RvbWVyRGV0YWlsPzogeyBuYW1lOiBzdHJpbmc7IHBob25lTnVtYmVyOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmcgfTtcclxuICBhZGRyZXNzRGV0YWlscz86IHsgcmVjZWl2ZXJOYW1lOiBzdHJpbmc7IHJlY2VpdmVyUGhvbmU6IHN0cmluZzsgYWRkcmVzc0xpbmUxOiBzdHJpbmc7IGFkZHJlc3NMaW5lMj86IHN0cmluZzsgY2l0eTogc3RyaW5nOyBzdGF0ZTogc3RyaW5nOyB6aXBDb2RlOiBzdHJpbmcgfTtcclxuICBwcm9kdWN0TGluZXM/OiB7IGl0ZW1OYW1lOiBzdHJpbmc7IHF1YW50aXR5OiBudW1iZXIgfVtdO1xyXG4gIC8qKiBOb3QgcGFydCBvZiB0aGUgR0VUIC9ib29raW5nL2dyb3VwL215IHJlc3BvbnNlIC0gc2VydmljZXMgbGl2ZSBvbiB0aGUgc2VwYXJhdGVcclxuICAgKiBCb29raW5nRGV0YWlsIGNvbGxlY3Rpb24gKEZLJ2QgdmlhIHNlcnZpY2VMaW5lSWRzLCBub3QgZGVub3JtYWxpemVkIG9udG8gQm9va2luZ0dyb3VwKSwgc29cclxuICAgKiB0aGlzIGlzIGZpbGxlZCBpbiBjbGllbnQtc2lkZSBhZnRlciBsb2FkKCkgdmlhIGEgcGVyLXJvdyBHRVQgLi4uL2xpbmVzIGNhbGwuICovXHJcbiAgc2VydmljZXM/OiB7IG5hbWU6IHN0cmluZzsgZHVyYXRpb25NaW51dGVzOiBudW1iZXI7IHByaWNlOiBudW1iZXIgfVtdO1xyXG4gIHZpZGVvQ2FsbExpbms/OiBzdHJpbmc7XHJcbiAgdG90YWxDb2xsZWN0ZWRBdEJvb2tpbmc/OiBudW1iZXI7XHJcbiAgdG90YWxQYXlhYmxlPzogbnVtYmVyO1xyXG4gIGhvbWVWaXNpdENoYXJnZT86IG51bWJlcjtcclxuICAvKiogVHJhbnNpZW50LCBjb21wdXRlZCBvbiBldmVyeSBiYWNrZW5kIHJlYWQgb2YgdGhpcyBncm91cCAtIHNlZSBCb29raW5nR3JvdXAjY2FuUmVzY2hlZHVsZS4gKi9cclxuICBjYW5SZXNjaGVkdWxlPzogYm9vbGVhbjtcclxuICByZXNjaGVkdWxlQmxvY2tlZFJlYXNvbj86IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIFwiTXkgQm9va2luZ3NcIiAtIGEgY3VzdG9tZXIncyBvd24gYm9va2luZyBoaXN0b3J5IChVcGNvbWluZy9QYXN0KSwgYSBkZXRhaWwgdmlldyBwZXIgYm9va2luZyxcclxuICogYW5kIGNhbmNlbGxhdGlvbi4gVGhlIGxpc3QgZW5kcG9pbnQgcmV0dXJucyBmdWxsIEJvb2tpbmdHcm91cCByZWNvcmRzIC0gZW5vdWdoIGZvclxyXG4gKiBkYXRlL3N0YXR1cy9hZGRyZXNzL3Byb2R1Y3RzIC0gYnV0IHNlcnZpY2VzIGJvb2tlZCBhcmVuJ3Qgb24gdGhhdCByZWNvcmQgKHNlZSBCb29raW5nUm93LnNlcnZpY2VzXHJcbiAqIGFib3ZlKSwgc28gbG9hZCgpIGlzc3VlcyBvbmUgZXh0cmEgR0VUIC4uLi9saW5lcyBjYWxsIHBlciByb3cgdG8gZmlsbCB0aGVtIGluLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzaW1wby1teS1ib29raW5ncycsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBUb2FzdE1vZHVsZV0sXHJcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9teS1ib29raW5ncy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL215LWJvb2tpbmdzLmNvbXBvbmVudC5jc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNeUJvb2tpbmdzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcbiAgKSB7IH1cclxuXHJcbiAgQElucHV0KCkgZGF0YTogYW55O1xyXG4gIHN0eWxlczogYW55O1xyXG5cclxuICAvKiogU2FtZSBjb250cmFzdCBhbGdvcml0aG0gYXMgQ29sb3JEaXJlY3RpdmUgKGRpcmVjdGl2ZS9jb2xvci5kaXJlY3RpdmUudHMpIC0gcmVpbXBsZW1lbnRlZCBhc1xyXG4gICAqIGEgcHVyZSBnZXR0ZXIgcmF0aGVyIHRoYW4gcmV1c2luZyB0aGF0IGRpcmVjdGl2ZSBkaXJlY3RseSwgc2luY2UgaXRzIFtzaW1wb0NvbG9yXSBvbmx5IGV2ZXJcclxuICAgKiAqc2V0cyogYSBjb21wdXRlZCBjb2xvciBhbmQgbmV2ZXIgY2xlYXJzIGl0LCB3aGljaCB3b3VsZCBsZWF2ZSBhIHN0YWxlIGNvbG9yIHN0dWNrIG9uIGFcclxuICAgKiBjaGlwIGFmdGVyIGl0IHRvZ2dsZXMgZnJvbSBhY3RpdmUgYmFjayB0byBpbmFjdGl2ZS4gRXZlcnkgYWNjZW50LWNvbG9yZWQgZWxlbWVudCBoZXJlIGlzXHJcbiAgICogZWl0aGVyIGFsd2F5cy1vbiAobmV2ZXIgdG9nZ2xlcykgb3IgZHJpdmVuIGJ5IHRoaXMgc2FtZSBnZXR0ZXIsIHNvIHRoZXJlJ3MgZXhhY3RseSBvbmVcclxuICAgKiBkZWZpbml0aW9uIG9mIFwid2hhdCB0ZXh0IGNvbG9yIGdvZXMgb24gdGhlIGFjY2VudCBjb2xvclwiIGluIHRoaXMgZmlsZS4gKi9cclxuICBnZXQgY29udHJhc3RDb2xvcigpOiBzdHJpbmcge1xyXG4gICAgbGV0IGhleCA9IHRoaXMuc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvcjtcclxuICAgIGlmICghaGV4KSByZXR1cm4gJyNmZmZmZmYnO1xyXG4gICAgaWYgKGhleC5sZW5ndGggPCA2KSB7XHJcbiAgICAgIGxldCBleHBhbmRlZCA9ICcjJztcclxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBoZXgubGVuZ3RoOyBpKyspIGV4cGFuZGVkICs9IGhleFtpXSArIGhleFtpXTtcclxuICAgICAgaGV4ID0gZXhwYW5kZWQ7XHJcbiAgICB9XHJcbiAgICBjb25zdCByID0gcGFyc2VJbnQoaGV4LnNsaWNlKDEsIDMpLCAxNik7XHJcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4LnNsaWNlKDMsIDUpLCAxNik7XHJcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoaGV4LnNsaWNlKDUsIDcpLCAxNik7XHJcbiAgICBjb25zdCBicmlnaHRuZXNzID0gKHIgKiAyOTkgKyBnICogNTg3ICsgYiAqIDExNCkgLyAxMDAwO1xyXG4gICAgcmV0dXJuIGJyaWdodG5lc3MgPiAxMzAgPyAnIzAwMDAwMCcgOiAnI2ZmZmZmZic7XHJcbiAgfVxyXG5cclxuICBjdXJyZW50VGFiOiAnTElTVCcgfCAnREVUQUlMJyA9ICdMSVNUJztcclxuICBwcm9mVGFiOiAndXBjb21pbmcnIHwgJ3Bhc3QnID0gJ3VwY29taW5nJztcclxuICBsb2FkaW5nID0gdHJ1ZTtcclxuICBjYW5jZWxsaW5nID0gZmFsc2U7XHJcbiAgY2FuY2VsQ29uZmlybU9wZW4gPSBmYWxzZTtcclxuXHJcbiAgcHJpdmF0ZSBhbGxCb29raW5nczogQm9va2luZ1Jvd1tdID0gW107XHJcbiAgdXBjb21pbmc6IEJvb2tpbmdSb3dbXSA9IFtdO1xyXG4gIHBhc3Q6IEJvb2tpbmdSb3dbXSA9IFtdO1xyXG4gIHNlbGVjdGVkOiBCb29raW5nUm93IHwgbnVsbCA9IG51bGw7XHJcbiAgY2FuY2VsbGF0aW9uUG9saWN5OiB7IHRpdGxlOiBzdHJpbmc7IHBvbGljeURldGFpbHM6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XHJcbiAgcmVzY2hlZHVsZUN1dG9mZkhvdXJzID0gMjQ7XHJcblxyXG4gIC8vIFJlc2NoZWR1bGUgcGFuZWwgLSBkYXRlIHN0cmlwICsgc2xvdCBncmlkLCBtYXRjaGluZyB0aGUgYWRtaW4gc2lkZSdzIFJlc2NoZWR1bGVBcHBvaW50bWVudENvbXBvbmVudC5cclxuICBAVmlld0NoaWxkKCdyZXNjaERheVN0cmlwJykgcmVzY2hEYXlTdHJpcFJlZj86IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xyXG4gIHJlc2NoZWR1bGVQYW5lbE9wZW4gPSBmYWxzZTtcclxuICByZXNjaERheXM6IHsgaXNvOiBzdHJpbmc7IGRvdzogc3RyaW5nOyBudW06IHN0cmluZyB9W10gPSBbXTtcclxuICByZXNjaFNlbGVjdGVkSXNvID0gJyc7XHJcbiAgcmVzY2hTZWxlY3RlZFRpbWUgPSAnJztcclxuICByZXNjaFNsb3RzOiBzdHJpbmdbXSA9IFtdO1xyXG4gIHJlc2NoTG9hZGluZ1Nsb3RzID0gZmFsc2U7XHJcbiAgcmVzY2hDb25maXJtaW5nID0gZmFsc2U7XHJcbiAgcmVzY2hFcnJvciA9ICcnO1xyXG4gIHJlc2NoTm9TbG90cyA9IGZhbHNlO1xyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuc3R5bGVzID0gdGhpcy5kYXRhPy5zdHlsZXM7XHJcbiAgICB0aGlzLmxvYWQoKTtcclxuICB9XHJcblxyXG4gIGxvYWQoKSB7XHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgY29uc3QgYnVzaW5lc3NJZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdidXNpbmVzc0lkJykgPz8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2JJZCcpID8/ICcnO1xyXG4gICAgY29uc3QgdXNlcklkID0gKHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpIGFzIFVzZXIpPy51c2VySWQgPz8gJyc7XHJcbiAgICBpZiAoIWJ1c2luZXNzSWQgfHwgIXVzZXJJZCkge1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRNeUJvb2tpbmdzKGJ1c2luZXNzSWQsIHVzZXJJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmFsbEJvb2tpbmdzID0gKHJlcyA/PyBbXSkgYXMgQm9va2luZ1Jvd1tdO1xyXG4gICAgICB0aGlzLnNwbGl0Qm9va2luZ3MoKTtcclxuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMubG9hZFNlcnZpY2VMaW5lcygpO1xyXG4gICAgfSwgKCkgPT4ge1xyXG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0Q2FuY2VsbGF0aW9uUG9saWN5KGJ1c2luZXNzSWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5jYW5jZWxsYXRpb25Qb2xpY3kgPSAocmVzID8/IFtdKVswXSA/PyBudWxsO1xyXG4gICAgfSwgKCkgPT4ge1xyXG4gICAgICAvLyBOb24tZmF0YWwgLSB0aGUgZGV0YWlsIHZpZXcganVzdCB3b24ndCBzaG93IGEgcG9saWN5IG5vdGUuXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEJ1c2luZXNzQXBwb2ludG1lbnRTZXR0aW5ncyhidXNpbmVzc0lkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMucmVzY2hlZHVsZUN1dG9mZkhvdXJzID0gcmVzPy5yZXNjaGVkdWxlQ3V0b2ZmSG91cnMgPz8gMjQ7XHJcbiAgICB9LCAoKSA9PiB7XHJcbiAgICAgIC8vIE5vbi1mYXRhbCAtIGZhbGxzIGJhY2sgdG8gdGhlIGRlZmF1bHQgY3V0b2ZmIHVzZWQgZm9yIGRpc3BsYXkgb25seTsgdGhlIGJhY2tlbmQgaXMgdGhlXHJcbiAgICAgIC8vIHJlYWwgc291cmNlIG9mIHRydXRoIGFuZCBlbmZvcmNlcyBpdHMgb3duIGFjdHVhbCBjb25maWd1cmVkIHZhbHVlIHJlZ2FyZGxlc3MuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaXNVcGNvbWluZyhiOiBCb29raW5nUm93KTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuICAgIHJldHVybiAoYi5zdGF0dXMgPT09ICdIT0xEJyB8fCBiLnN0YXR1cyA9PT0gJ0JPT0tFRCcgfHwgYi5zdGF0dXMgPT09ICdQRU5ESU5HJyB8fCBiLnN0YXR1cyA9PT0gJ09OR09JTkcnKSAmJiBuZXcgRGF0ZShiLmJvb2tpbmdEYXRlKSA+PSB0b2RheTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3BsaXRCb29raW5ncygpIHtcclxuICAgIHRoaXMudXBjb21pbmcgPSB0aGlzLmFsbEJvb2tpbmdzLmZpbHRlcigoYikgPT4gdGhpcy5pc1VwY29taW5nKGIpKTtcclxuICAgIHRoaXMucGFzdCA9IHRoaXMuYWxsQm9va2luZ3MuZmlsdGVyKChiKSA9PiAhdGhpcy5pc1VwY29taW5nKGIpKTtcclxuICB9XHJcblxyXG4gIC8qKiBPbmUgYm9va2luZyBoaXN0b3J5IGxvYWQsIGJvdW5kZWQgdG8gdGhpcyBjdXN0b21lcidzIG93biBib29raW5ncyAtIGEgcGVyLXJvdyBjYWxsIGhlcmUgaXNcclxuICAgKiBmaW5lLCB1bmxpa2UgYW4gdW5ib3VuZGVkL3BhZ2luYXRlZCBsaXN0LiBGYWlsdXJlcyBhcmUgc3dhbGxvd2VkIHBlci1yb3cgKGZhbGxzIGJhY2sgdG8gbm9cclxuICAgKiBzZXJ2aWNlIG5hbWVzIGZvciB0aGF0IHJvdykgcmF0aGVyIHRoYW4gYmxvY2tpbmcgdGhlIHdob2xlIHBhZ2Ugb24gb25lIGJhZCBncm91cC4gKi9cclxuICBwcml2YXRlIGxvYWRTZXJ2aWNlTGluZXMoKSB7XHJcbiAgICBpZiAoIXRoaXMuYWxsQm9va2luZ3MubGVuZ3RoKSByZXR1cm47XHJcbiAgICBmb3JrSm9pbihcclxuICAgICAgdGhpcy5hbGxCb29raW5ncy5tYXAoKGIpID0+XHJcbiAgICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRHcm91cExpbmVzKGIuZ3JvdXBJZCkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKFtdKSkpXHJcbiAgICAgIClcclxuICAgICkuc3Vic2NyaWJlKChhbGxMaW5lczogYW55W10pID0+IHtcclxuICAgICAgdGhpcy5hbGxCb29raW5ncy5mb3JFYWNoKChiLCBpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgbGluZXMgPSBhbGxMaW5lc1tpXSA/PyBbXTtcclxuICAgICAgICBiLnNlcnZpY2VzID0gbGluZXMuZmxhdE1hcCgobDogYW55KSA9PiAobC5zZXJ2aWNlcyA/PyBbXSkubWFwKChzOiBhbnkpID0+ICh7XHJcbiAgICAgICAgICBuYW1lOiBzLm5hbWUsIGR1cmF0aW9uTWludXRlczogcy5kdXJhdGlvbk1pbnV0ZXMsIHByaWNlOiBzLnByaWNlXHJcbiAgICAgICAgfSkpKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCByb3dzKCk6IEJvb2tpbmdSb3dbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5wcm9mVGFiID09PSAndXBjb21pbmcnID8gdGhpcy51cGNvbWluZyA6IHRoaXMucGFzdDtcclxuICB9XHJcbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMubG9hZGluZyAmJiB0aGlzLnJvd3MubGVuZ3RoID09PSAwO1xyXG4gIH1cclxuXHJcbiAgc2V0UHJvZlRhYih0YWI6ICd1cGNvbWluZycgfCAncGFzdCcpIHtcclxuICAgIHRoaXMucHJvZlRhYiA9IHRhYjtcclxuICB9XHJcblxyXG4gIHByb2R1Y3ROYW1lcyhiOiBCb29raW5nUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiAoYi5wcm9kdWN0TGluZXMgPz8gW10pLm1hcCgocCkgPT4gcC5pdGVtTmFtZSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJyk7XHJcbiAgfVxyXG4gIHNlcnZpY2VOYW1lcyhiOiBCb29raW5nUm93KTogc3RyaW5nIHtcclxuICAgIHJldHVybiAoYi5zZXJ2aWNlcyA/PyBbXSkubWFwKChzKSA9PiBzLm5hbWUpLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpO1xyXG4gIH1cclxuICB0aXRsZShiOiBCb29raW5nUm93KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IG1vZGVMYWJlbCA9IGIubW9kZSA9PT0gJ0hPTUVfVklTSVQnID8gJ0hvbWUgVmlzaXQnIDogYi5tb2RlID09PSAnVklERU9fQ0FMTCcgPyAnVmlkZW8gQ2FsbCcgOiAnU3RvcmUgVmlzaXQnO1xyXG4gICAgY29uc3QgaXRlbXMgPSBbdGhpcy5zZXJ2aWNlTmFtZXMoYiksIHRoaXMucHJvZHVjdE5hbWVzKGIpXS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKTtcclxuICAgIHJldHVybiBpdGVtcyA/IGAke21vZGVMYWJlbH0gwrcgJHtpdGVtc31gIDogbW9kZUxhYmVsO1xyXG4gIH1cclxuICB3aGVuKGI6IEJvb2tpbmdSb3cpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGIuYm9va2luZ0RhdGUpLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tSU4nLCB7IHdlZWtkYXk6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnIH0pO1xyXG4gICAgcmV0dXJuIGIuc3RhcnRUaW1lID8gYCR7ZGF0ZX0gwrcgJHtiLnN0YXJ0VGltZX1gIDogZGF0ZTtcclxuICB9XHJcbiAgZGV0YWlsKGI6IEJvb2tpbmdSb3cpOiBzdHJpbmcge1xyXG4gICAgaWYgKGIubW9kZSA9PT0gJ0hPTUVfVklTSVQnICYmIGIuYWRkcmVzc0RldGFpbHMpIHJldHVybiBgJHtiLmFkZHJlc3NEZXRhaWxzLmNpdHl9LCAke2IuYWRkcmVzc0RldGFpbHMuc3RhdGV9YDtcclxuICAgIGlmIChiLm1vZGUgPT09ICdTVE9SRV9WSVNJVCcgJiYgYi5zdG9yZU5hbWUpIHJldHVybiBiLnN0b3JlTmFtZTtcclxuICAgIHJldHVybiBiLmN1c3RvbWVyRGV0YWlsPy5uYW1lID8/ICcnO1xyXG4gIH1cclxuICBzdGF0dXNMYWJlbChzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoc3RhdHVzID09PSAnQ09NUExFVEVEJykgcmV0dXJuICdDb21wbGV0ZWQnO1xyXG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiAnQ2FuY2VsbGVkJztcclxuICAgIGlmIChzdGF0dXMgPT09ICdIT0xEJyB8fCBzdGF0dXMgPT09ICdQRU5ESU5HJykgcmV0dXJuICdQYXltZW50IFBlbmRpbmcnO1xyXG4gICAgaWYgKHN0YXR1cyA9PT0gJ09OR09JTkcnKSByZXR1cm4gJ0luIFByb2dyZXNzJztcclxuICAgIHJldHVybiAnQ29uZmlybWVkJztcclxuICB9XHJcbiAgc3RhdHVzQ2xhc3Moc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHJldHVybiAnc3RhdHVzLWNvbXBsZXRlZCc7XHJcbiAgICBpZiAoc3RhdHVzID09PSAnQ0FOQ0VMTEVEJykgcmV0dXJuICdzdGF0dXMtY2FuY2VsbGVkJztcclxuICAgIGlmIChzdGF0dXMgPT09ICdIT0xEJyB8fCBzdGF0dXMgPT09ICdQRU5ESU5HJykgcmV0dXJuICdzdGF0dXMtcGVuZGluZyc7XHJcbiAgICBpZiAoc3RhdHVzID09PSAnT05HT0lORycpIHJldHVybiAnc3RhdHVzLW9uZ29pbmcnO1xyXG4gICAgcmV0dXJuICdzdGF0dXMtY29uZmlybWVkJztcclxuICB9XHJcbiAgcGFpZExhYmVsKGI6IEJvb2tpbmdSb3cpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGIudG90YWxDb2xsZWN0ZWRBdEJvb2tpbmcgJiYgYi50b3RhbENvbGxlY3RlZEF0Qm9va2luZyA+IDAgPyBg4oK5JHtiLnRvdGFsQ29sbGVjdGVkQXRCb29raW5nfWAgOiAnTm90aGluZyDigJQgZnJlZSc7XHJcbiAgfVxyXG4gIHNlcnZpY2VQcmljZVRvdGFsKGI6IEJvb2tpbmdSb3cpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChiLnNlcnZpY2VzID8/IFtdKS5yZWR1Y2UoKHN1bSwgcykgPT4gc3VtICsgKHMucHJpY2UgfHwgMCksIDApO1xyXG4gIH1cclxuICB0b3RhbER1ZShiOiBCb29raW5nUm93KTogbnVtYmVyIHtcclxuICAgIHJldHVybiAoYi50b3RhbFBheWFibGUgPz8gMCkgKyAoYi5ob21lVmlzaXRDaGFyZ2UgPz8gMCk7XHJcbiAgfVxyXG4gIHBlbmRpbmdBbW91bnQoYjogQm9va2luZ1Jvdyk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgdGhpcy50b3RhbER1ZShiKSAtIChiLnRvdGFsQ29sbGVjdGVkQXRCb29raW5nID8/IDApKTtcclxuICB9XHJcbiAgZ2V0IGNhbkNhbmNlbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhdGhpcy5zZWxlY3RlZCAmJiAodGhpcy5zZWxlY3RlZC5zdGF0dXMgPT09ICdIT0xEJyB8fCB0aGlzLnNlbGVjdGVkLnN0YXR1cyA9PT0gJ0JPT0tFRCcgfHwgdGhpcy5zZWxlY3RlZC5zdGF0dXMgPT09ICdQRU5ESU5HJyk7XHJcbiAgfVxyXG4gIGdldCBjYW5SZXNjaGVkdWxlU2VsZWN0ZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkICYmIHRoaXMuc2VsZWN0ZWQuc3RhdHVzID09PSAnQk9PS0VEJyAmJiAhIXRoaXMuc2VsZWN0ZWQuY2FuUmVzY2hlZHVsZTtcclxuICB9XHJcblxyXG4gIHZpZXdCb29raW5nRGV0YWlsKGI6IEJvb2tpbmdSb3cpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWQgPSBiO1xyXG4gICAgdGhpcy5jdXJyZW50VGFiID0gJ0RFVEFJTCc7XHJcbiAgICB0aGlzLnJlc2NoZWR1bGVQYW5lbE9wZW4gPSBmYWxzZTtcclxuICB9XHJcbiAgYmFja1RvTGlzdCgpIHtcclxuICAgIHRoaXMuY3VycmVudFRhYiA9ICdMSVNUJztcclxuICAgIHRoaXMuc2VsZWN0ZWQgPSBudWxsO1xyXG4gICAgdGhpcy5yZXNjaGVkdWxlUGFuZWxPcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVzY2hlZHVsZVxyXG5cclxuICBvcGVuUmVzY2hlZHVsZVBhbmVsKCkge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkKSByZXR1cm47XHJcbiAgICB0aGlzLnJlc2NoZWR1bGVQYW5lbE9wZW4gPSB0cnVlO1xyXG4gICAgdGhpcy5yZXNjaFNlbGVjdGVkVGltZSA9ICcnO1xyXG4gICAgdGhpcy5yZXNjaEVycm9yID0gJyc7XHJcbiAgICB0aGlzLmJ1aWxkUmVzY2hEYXlTdHJpcCgpO1xyXG4gICAgaWYgKHRoaXMucmVzY2hEYXlzLmxlbmd0aCkgdGhpcy5zZWxlY3RSZXNjaERheSh0aGlzLnJlc2NoRGF5c1swXSk7XHJcbiAgfVxyXG4gIGNsb3NlUmVzY2hlZHVsZVBhbmVsKCkge1xyXG4gICAgdGhpcy5yZXNjaGVkdWxlUGFuZWxPcGVuID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGJ1aWxkUmVzY2hEYXlTdHJpcCgpIHtcclxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG4gICAgdGhpcy5yZXNjaERheXMgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTQ7IGkrKykge1xyXG4gICAgICBjb25zdCBkID0gbmV3IERhdGUodG9kYXkpO1xyXG4gICAgICBkLnNldERhdGUoZC5nZXREYXRlKCkgKyBpKTtcclxuICAgICAgdGhpcy5yZXNjaERheXMucHVzaCh7XHJcbiAgICAgICAgaXNvOiBkLnRvSVNPU3RyaW5nKCksXHJcbiAgICAgICAgZG93OiBkLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tSU4nLCB7IHdlZWtkYXk6ICdzaG9ydCcgfSksXHJcbiAgICAgICAgbnVtOiBkLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tSU4nLCB7IGRheTogJ251bWVyaWMnIH0pLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBNb3VzZSB1c2VycyBoYXZlIG5vIHN3aXBlL3RyYWNrcGFkIGdlc3R1cmUgZm9yIHRoZSBob3Jpem9udGFsbHktc2Nyb2xsaW5nIGRheSBzdHJpcCAtIGdpdmVcclxuICAgKiB0aGVtIGV4cGxpY2l0IHByZXYvbmV4dCBhcnJvd3MgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHNoaWZ0K3doZWVsIChtYXRjaGVzIHRoZSBhZG1pbiBzaWRlJ3NcclxuICAgKiBSZXNjaGVkdWxlQXBwb2ludG1lbnRDb21wb25lbnQjc2Nyb2xsRGF5cykuICovXHJcbiAgc2Nyb2xsUmVzY2hEYXlzKGRpcmVjdGlvbjogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBlbCA9IHRoaXMucmVzY2hEYXlTdHJpcFJlZj8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICghZWwpIHJldHVybjtcclxuICAgIGVsLnNjcm9sbEJ5KHsgbGVmdDogZGlyZWN0aW9uICogMTYwLCBiZWhhdmlvcjogJ3Ntb290aCcgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RSZXNjaERheShkYXk6IHsgaXNvOiBzdHJpbmcgfSkge1xyXG4gICAgdGhpcy5yZXNjaFNlbGVjdGVkSXNvID0gZGF5LmlzbztcclxuICAgIHRoaXMucmVzY2hTZWxlY3RlZFRpbWUgPSAnJztcclxuICAgIHRoaXMucmVzY2hFcnJvciA9ICcnO1xyXG4gICAgdGhpcy5mZXRjaFJlc2NoU2xvdHMoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmV0Y2hSZXNjaFNsb3RzKCkge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkKSByZXR1cm47XHJcbiAgICB0aGlzLnJlc2NoTG9hZGluZ1Nsb3RzID0gdHJ1ZTtcclxuICAgIHRoaXMucmVzY2hOb1Nsb3RzID0gZmFsc2U7XHJcbiAgICB0aGlzLnJlc2NoU2xvdHMgPSBbXTtcclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0UmVzY2hlZHVsZVNsb3RzKHRoaXMuc2VsZWN0ZWQuZ3JvdXBJZCwgdGhpcy5yZXNjaFNlbGVjdGVkSXNvKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMucmVzY2hMb2FkaW5nU2xvdHMgPSBmYWxzZTtcclxuICAgICAgdGhpcy5yZXNjaFNsb3RzID0gcmVzID8/IFtdO1xyXG4gICAgICB0aGlzLnJlc2NoTm9TbG90cyA9IHRoaXMucmVzY2hTbG90cy5sZW5ndGggPT09IDA7XHJcbiAgICB9LCAoKSA9PiB7XHJcbiAgICAgIHRoaXMucmVzY2hMb2FkaW5nU2xvdHMgPSBmYWxzZTtcclxuICAgICAgdGhpcy5yZXNjaE5vU2xvdHMgPSB0cnVlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RSZXNjaFRpbWUodGltZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLnJlc2NoU2VsZWN0ZWRUaW1lID0gdGltZTtcclxuICB9XHJcblxyXG4gIGdldCByZXNjaEludmFsaWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gIXRoaXMucmVzY2hTZWxlY3RlZElzbyB8fCAhdGhpcy5yZXNjaFNlbGVjdGVkVGltZSB8fCB0aGlzLnJlc2NoQ29uZmlybWluZztcclxuICB9XHJcblxyXG4gIGNvbmZpcm1SZXNjaGVkdWxlKCkge1xyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkIHx8IHRoaXMucmVzY2hJbnZhbGlkKSByZXR1cm47XHJcbiAgICB0aGlzLnJlc2NoQ29uZmlybWluZyA9IHRydWU7XHJcbiAgICB0aGlzLnJlc2NoRXJyb3IgPSAnJztcclxuICAgIHRoaXMucmVzdFNlcnZpY2UucmVzY2hlZHVsZUJvb2tpbmcodGhpcy5zZWxlY3RlZC5ncm91cElkLCB0aGlzLnJlc2NoU2VsZWN0ZWRJc28sIHRoaXMucmVzY2hTZWxlY3RlZFRpbWUpLnN1YnNjcmliZSgoZ3JvdXA6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnJlc2NoQ29uZmlybWluZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnJlc2NoZWR1bGVQYW5lbE9wZW4gPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkLmJvb2tpbmdEYXRlID0gZ3JvdXA/LmJvb2tpbmdEYXRlID8/IHRoaXMucmVzY2hTZWxlY3RlZElzbztcclxuICAgICAgICB0aGlzLnNlbGVjdGVkLnN0YXJ0VGltZSA9IGdyb3VwPy5zdGFydFRpbWUgPz8gdGhpcy5zZWxlY3RlZC5zdGFydFRpbWU7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbmRUaW1lID0gZ3JvdXA/LmVuZFRpbWUgPz8gdGhpcy5zZWxlY3RlZC5lbmRUaW1lO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuY2FuUmVzY2hlZHVsZSA9IGdyb3VwPy5jYW5SZXNjaGVkdWxlID8/IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQucmVzY2hlZHVsZUJsb2NrZWRSZWFzb24gPSBncm91cD8ucmVzY2hlZHVsZUJsb2NrZWRSZWFzb24gPz8gJyc7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zcGxpdEJvb2tpbmdzKCk7XHJcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ0Jvb2tpbmcgcmVzY2hlZHVsZWQnIH0pO1xyXG4gICAgfSwgKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5yZXNjaENvbmZpcm1pbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5yZXNjaEVycm9yID0gZXJyb3I/LmVycm9yPy5tZXNzYWdlIHx8IGVycm9yPy5lcnJvcj8uZGV0YWlsIHx8ICdVbmFibGUgdG8gcmVzY2hlZHVsZSB0aGlzIGJvb2tpbmcnO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvcGVuQ2FuY2VsQ29uZmlybSgpIHtcclxuICAgIGlmICghdGhpcy5zZWxlY3RlZCkgcmV0dXJuO1xyXG4gICAgdGhpcy5jYW5jZWxDb25maXJtT3BlbiA9IHRydWU7XHJcbiAgfVxyXG4gIGNsb3NlQ2FuY2VsQ29uZmlybSgpIHtcclxuICAgIHRoaXMuY2FuY2VsQ29uZmlybU9wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGNhbmNlbEJvb2tpbmcoKSB7XHJcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQgfHwgdGhpcy5jYW5jZWxsaW5nKSByZXR1cm47XHJcbiAgICB0aGlzLmNhbmNlbGxpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5jYW5jZWxCb29raW5nR3JvdXAodGhpcy5zZWxlY3RlZC5ncm91cElkLCAnQ2FuY2VsbGVkIGJ5IGN1c3RvbWVyJykuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5jYW5jZWxsaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuY2FuY2VsQ29uZmlybU9wZW4gPSBmYWxzZTtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHRoaXMuc2VsZWN0ZWQuc3RhdHVzID0gJ0NBTkNFTExFRCc7XHJcbiAgICAgIHRoaXMuc3BsaXRCb29raW5ncygpO1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdCb29raW5nIGNhbmNlbGxlZCcgfSk7XHJcbiAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmNhbmNlbGxpbmcgPSBmYWxzZTtcclxuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiBlcnJvcj8uZXJyb3I/LmRldGFpbCA/PyAnQ291bGQgbm90IGNhbmNlbCB0aGlzIGJvb2tpbmcnIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCI+PC9wLXRvYXN0PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1iLXJvb3RcIj5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudFRhYiA9PT0gJ0xJU1QnXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWItdGl0bGVcIj5NeSBCb29raW5nczwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi10YWJzXCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItdGFiXCIgW2NsYXNzLmFjdGl2ZV09XCJwcm9mVGFiID09PSAndXBjb21pbmcnXCIgKGNsaWNrKT1cInNldFByb2ZUYWIoJ3VwY29taW5nJylcIj5VcGNvbWluZzwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXRhYlwiIFtjbGFzcy5hY3RpdmVdPVwicHJvZlRhYiA9PT0gJ3Bhc3QnXCIgKGNsaWNrKT1cInNldFByb2ZUYWIoJ3Bhc3QnKVwiPlBhc3Q8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi1sb2FkaW5nXCIgKm5nSWY9XCJsb2FkaW5nXCI+TG9hZGluZyB5b3VyIGJvb2tpbmdz4oCmPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLXJvd3NcIiAqbmdJZj1cIiFsb2FkaW5nICYmICFpc0VtcHR5XCI+XHJcbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcm93XCIgKm5nRm9yPVwibGV0IGIgb2Ygcm93c1wiIChjbGljayk9XCJ2aWV3Qm9va2luZ0RldGFpbChiKVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctc3RyaXBlXCIgW25nQ2xhc3NdPVwiYi5tb2RlID09PSAnSE9NRV9WSVNJVCcgPyAnc3RyaXBlLWhvbWUnIDogYi5tb2RlID09PSAnVklERU9fQ0FMTCcgPyAnc3RyaXBlLXZpZGVvJyA6ICdzdHJpcGUtc3RvcmUnXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy1pbmZvXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcm93LXRvcFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcm93LXRpdGxlXCI+e3t0aXRsZShiKX19PC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctd2hlblwiPnt7d2hlbihiKX19PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcm93LWRldGFpbFwiPnt7ZGV0YWlsKGIpfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcm93LWVuZFwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi1zdGF0dXNcIiBbbmdDbGFzc109XCJzdGF0dXNDbGFzcyhiLnN0YXR1cylcIj57e3N0YXR1c0xhYmVsKGIuc3RhdHVzKX19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJtYi1lbXB0eVwiICpuZ0lmPVwiaXNFbXB0eVwiPlxyXG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJtYi1lbXB0eS1pY29uXCI+ZXZlbnRfYnVzeTwvbWF0LWljb24+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1lbXB0eS10aXRsZVwiPk5vIHt7cHJvZlRhYn19IGJvb2tpbmdzIHlldC48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudFRhYiA9PT0gJ0RFVEFJTCcgJiYgc2VsZWN0ZWRcIj5cclxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItYmFja1wiIChjbGljayk9XCJiYWNrVG9MaXN0KClcIj5cclxuICAgICAgPG1hdC1pY29uPmFycm93X2JhY2s8L21hdC1pY29uPiBCYWNrIHRvIE15IEJvb2tpbmdzXHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWNhcmRcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1oZWFkZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXRpdGxlLXJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC10aXRsZVwiPnt7dGl0bGUoc2VsZWN0ZWQpfX08L2Rpdj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWItc3RhdHVzXCIgW25nQ2xhc3NdPVwic3RhdHVzQ2xhc3Moc2VsZWN0ZWQuc3RhdHVzKVwiPnt7c3RhdHVzTGFiZWwoc2VsZWN0ZWQuc3RhdHVzKX19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtd2hlblwiPnt7d2hlbihzZWxlY3RlZCl9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93c1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCIgKm5nSWY9XCJzZWxlY3RlZC5zZXJ2aWNlcz8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5TZXJ2aWNlczwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+e3tzZXJ2aWNlTmFtZXMoc2VsZWN0ZWQpfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQucHJvZHVjdExpbmVzPy5sZW5ndGhcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPlByb2R1Y3RzPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXZcIj57e3Byb2R1Y3ROYW1lcyhzZWxlY3RlZCl9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCIgKm5nSWY9XCJzZWxlY3RlZC5jdXN0b21lckRldGFpbFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1rXCI+Q29udGFjdDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+e3tzZWxlY3RlZC5jdXN0b21lckRldGFpbD8ubmFtZX19IMK3IHt7c2VsZWN0ZWQuY3VzdG9tZXJEZXRhaWw/LnBob25lTnVtYmVyfX0gwrcge3tzZWxlY3RlZC5jdXN0b21lckRldGFpbD8uZW1haWx9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCIgKm5nSWY9XCJzZWxlY3RlZC5tb2RlID09PSAnSE9NRV9WSVNJVCcgJiYgc2VsZWN0ZWQuYWRkcmVzc0RldGFpbHNcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPkFkZHJlc3M8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPnt7c2VsZWN0ZWQuYWRkcmVzc0RldGFpbHM/LmFkZHJlc3NMaW5lMX19LCB7e3NlbGVjdGVkLmFkZHJlc3NEZXRhaWxzPy5jaXR5fX0sIHt7c2VsZWN0ZWQuYWRkcmVzc0RldGFpbHM/LnN0YXRlfX0ge3tzZWxlY3RlZC5hZGRyZXNzRGV0YWlscz8uemlwQ29kZX19PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIiAqbmdJZj1cInNlcnZpY2VQcmljZVRvdGFsKHNlbGVjdGVkKSA+IDBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPlNlcnZpY2UgcHJpY2U8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPuKCuXt7c2VydmljZVByaWNlVG90YWwoc2VsZWN0ZWQpfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQuaG9tZVZpc2l0Q2hhcmdlXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5Ib21lIHZpc2l0IGNoYXJnZTwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+4oK5e3tzZWxlY3RlZC5ob21lVmlzaXRDaGFyZ2V9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5Ub3RhbDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+4oK5e3t0b3RhbER1ZShzZWxlY3RlZCl9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5QYWlkPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXZcIj57e3BhaWRMYWJlbChzZWxlY3RlZCl9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCIgKm5nSWY9XCJwZW5kaW5nQW1vdW50KHNlbGVjdGVkKSA+IDBcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPlBlbmRpbmcgYXQgYXBwb2ludG1lbnQ8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPuKCuXt7cGVuZGluZ0Ftb3VudChzZWxlY3RlZCl9fTwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi12aWRlby1saW5rXCIgKm5nSWY9XCJzZWxlY3RlZC5tb2RlID09PSAnVklERU9fQ0FMTCcgJiYgc2VsZWN0ZWQudmlkZW9DYWxsTGluayAmJiBzZWxlY3RlZC5zdGF0dXMgIT09ICdDQU5DRUxMRUQnXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPnZpZGVvY2FtPC9tYXQtaWNvbj5cclxuICAgICAgICA8YSBbaHJlZl09XCJzZWxlY3RlZC52aWRlb0NhbGxMaW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+e3tzZWxlY3RlZC52aWRlb0NhbGxMaW5rfX08L2E+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeVwiICpuZ0lmPVwiY2FuUmVzY2hlZHVsZVNlbGVjdGVkXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeS10aXRsZVwiPlJlc2NoZWR1bGUgcG9saWN5PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeS10ZXh0XCI+WW91IGNhbiByZXNjaGVkdWxlIHRoaXMgYm9va2luZyB1cCB0byB7e3Jlc2NoZWR1bGVDdXRvZmZIb3Vyc319IGhvdXJ7e3Jlc2NoZWR1bGVDdXRvZmZIb3VycyA9PT0gMSA/ICcnIDogJ3MnfX0gYmVmb3JlIHRoZSBhcHBvaW50bWVudCB0aW1lLjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeVwiICpuZ0lmPVwiY2FuQ2FuY2VsU2VsZWN0ZWQgJiYgY2FuY2VsbGF0aW9uUG9saWN5XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeS10aXRsZVwiPnt7Y2FuY2VsbGF0aW9uUG9saWN5LnRpdGxlfX08L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRleHRcIj57e2NhbmNlbGxhdGlvblBvbGljeS5wb2xpY3lEZXRhaWxzfX08L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItYWN0aW9ucy1yb3dcIiAqbmdJZj1cInNlbGVjdGVkLnN0YXR1cyA9PT0gJ0JPT0tFRCcgfHwgY2FuQ2FuY2VsU2VsZWN0ZWRcIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGNsYXNzPVwibWItcmVzY2hlZHVsZS1idG5cIlxyXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZC5zdGF0dXMgPT09ICdCT09LRUQnXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhY2FuUmVzY2hlZHVsZVNlbGVjdGVkXCJcclxuICAgICAgICAgIFt0aXRsZV09XCIhY2FuUmVzY2hlZHVsZVNlbGVjdGVkID8gc2VsZWN0ZWQucmVzY2hlZHVsZUJsb2NrZWRSZWFzb24gOiAnJ1wiXHJcbiAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib3BlblJlc2NoZWR1bGVQYW5lbCgpXCJcclxuICAgICAgICA+UmVzY2hlZHVsZSBib29raW5nPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cIm1iLWNhbmNlbC1idG5cIlxyXG4gICAgICAgICAgKm5nSWY9XCJjYW5DYW5jZWxTZWxlY3RlZFwiXHJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiY2FuY2VsbGluZ1wiXHJcbiAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkNhbmNlbENvbmZpcm0oKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAge3tjYW5jZWxsaW5nID8gJ0NhbmNlbGxpbmfigKYnIDogJ0NhbmNlbCBib29raW5nJ319XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLWNhbmNlbGxlZC1ub3RlXCIgKm5nSWY9XCJzZWxlY3RlZC5zdGF0dXMgPT09ICdDQU5DRUxMRUQnXCI+VGhpcyBib29raW5nIGhhcyBiZWVuIGNhbmNlbGxlZC48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctY29udGFpbmVyPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtYmFja2Ryb3BcIiAqbmdJZj1cInJlc2NoZWR1bGVQYW5lbE9wZW5cIiAoY2xpY2spPVwiY2xvc2VSZXNjaGVkdWxlUGFuZWwoKVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXBhbmVsXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtaGVhZGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXRpdGxlXCI+Q2hvb3NlIGEgbmV3IGRhdGUgJmFtcDsgdGltZTwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VSZXNjaGVkdWxlUGFuZWwoKVwiPiZ0aW1lczs8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtYm9keVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1kYXlzdHJpcC1yb3dcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtbmF2XCIgKGNsaWNrKT1cInNjcm9sbFJlc2NoRGF5cygtMSlcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTE1IDE4bC02LTYgNi02XCI+PC9wYXRoPjwvc3ZnPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtZGF5c3RyaXBcIiAjcmVzY2hEYXlTdHJpcD5cclxuICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwibWItcmVzY2gtZGF5XCJcclxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF5IG9mIHJlc2NoRGF5c1wiXHJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJkYXkuaXNvID09PSByZXNjaFNlbGVjdGVkSXNvXCJcclxuICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJkYXkuaXNvID09PSByZXNjaFNlbGVjdGVkSXNvID8gc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6IG51bGxcIlxyXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXkuaXNvID09PSByZXNjaFNlbGVjdGVkSXNvID8gc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6IG51bGxcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RSZXNjaERheShkYXkpXCJcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWItcmVzY2gtZGF5LWRvd1wiIFtzdHlsZS5jb2xvcl09XCJkYXkuaXNvID09PSByZXNjaFNlbGVjdGVkSXNvID8gY29udHJhc3RDb2xvciA6IG51bGxcIj57e2RheS5kb3d9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1iLXJlc2NoLWRheS1udW1cIiBbc3R5bGUuY29sb3JdPVwiZGF5LmlzbyA9PT0gcmVzY2hTZWxlY3RlZElzbyA/IGNvbnRyYXN0Q29sb3IgOiBudWxsXCI+e3tkYXkubnVtfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXJlc2NoLW5hdlwiIChjbGljayk9XCJzY3JvbGxSZXNjaERheXMoMSlcIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTkgMThsNi02LTYtNlwiPjwvcGF0aD48L3N2Zz5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtc2xvdHMtbG9hZGluZ1wiICpuZ0lmPVwicmVzY2hMb2FkaW5nU2xvdHNcIj5Mb2FkaW5nIGF2YWlsYWJsZSB0aW1lc+KApjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1zbG90cy1lbXB0eVwiICpuZ0lmPVwiIXJlc2NoTG9hZGluZ1Nsb3RzICYmIHJlc2NoTm9TbG90c1wiPk5vIHNsb3RzIGF2YWlsYWJsZSBvbiB0aGlzIGRhdGUuIFRyeSBhbm90aGVyIGRhdGUuPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXNsb3RzXCIgKm5nSWY9XCIhcmVzY2hMb2FkaW5nU2xvdHMgJiYgcmVzY2hTbG90cy5sZW5ndGhcIj5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIGNsYXNzPVwibWItcmVzY2gtc2xvdFwiXHJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzbG90IG9mIHJlc2NoU2xvdHNcIlxyXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInNsb3QgPT09IHJlc2NoU2VsZWN0ZWRUaW1lXCJcclxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwic2xvdCA9PT0gcmVzY2hTZWxlY3RlZFRpbWUgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogbnVsbFwiXHJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJzbG90ID09PSByZXNjaFNlbGVjdGVkVGltZSA/IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiBudWxsXCJcclxuICAgICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInNsb3QgPT09IHJlc2NoU2VsZWN0ZWRUaW1lID8gY29udHJhc3RDb2xvciA6IG51bGxcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UmVzY2hUaW1lKHNsb3QpXCJcclxuICAgICAgICAgID57e3Nsb3R9fTwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtZXJyb3JcIiAqbmdJZj1cInJlc2NoRXJyb3JcIj57e3Jlc2NoRXJyb3J9fTwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1mb290ZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXJlc2NoLWNhbmNlbFwiIChjbGljayk9XCJjbG9zZVJlc2NoZWR1bGVQYW5lbCgpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBjbGFzcz1cIm1iLXJlc2NoLWNvbmZpcm1cIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInJlc2NoSW52YWxpZFwiXHJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJyZXNjaEludmFsaWQgPyBudWxsIDogc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXHJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwicmVzY2hJbnZhbGlkID8gbnVsbCA6IGNvbnRyYXN0Q29sb3JcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1SZXNjaGVkdWxlKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIHt7cmVzY2hDb25maXJtaW5nID8gJ0NvbmZpcm1pbmfigKYnIDogJ0NvbmZpcm0gbmV3IHNsb3QnfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWJhY2tkcm9wXCIgKm5nSWY9XCJjYW5jZWxDb25maXJtT3BlblwiIChjbGljayk9XCJjbG9zZUNhbmNlbENvbmZpcm0oKVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXBhbmVsXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtaGVhZGVyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXRpdGxlXCI+Q2FuY2VsIHRoaXMgYm9va2luZz88L2Rpdj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXJlc2NoLWNsb3NlXCIgKGNsaWNrKT1cImNsb3NlQ2FuY2VsQ29uZmlybSgpXCI+JnRpbWVzOzwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWJvZHlcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRleHRcIj5UaGlzIGNhbid0IGJlIHVuZG9uZS48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5XCIgKm5nSWY9XCJjYW5jZWxsYXRpb25Qb2xpY3lcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGl0bGVcIj57e2NhbmNlbGxhdGlvblBvbGljeS50aXRsZX19PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRleHRcIj57e2NhbmNlbGxhdGlvblBvbGljeS5wb2xpY3lEZXRhaWxzfX08L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1mb290ZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXJlc2NoLWNhbmNlbFwiIChjbGljayk9XCJjbG9zZUNhbmNlbENvbmZpcm0oKVwiPktlZXAgYm9va2luZzwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtY29uZmlybVwiIFtkaXNhYmxlZF09XCJjYW5jZWxsaW5nXCIgKGNsaWNrKT1cImNhbmNlbEJvb2tpbmcoKVwiPlxyXG4gICAgICAgICAge3tjYW5jZWxsaW5nID8gJ0NhbmNlbGxpbmfigKYnIDogJ1llcywgY2FuY2VsIGJvb2tpbmcnfX1cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
438
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXktYm9va2luZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lbGVtZW50cy9teS1ib29raW5ncy9teS1ib29raW5ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2VsZW1lbnRzL215LWJvb2tpbmdzL215LWJvb2tpbmdzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQThCNUM7Ozs7O0dBS0c7QUFTSCxNQUFNLE9BQU8sbUJBQW1CO0lBQzlCLFlBQ21CLFdBQXdCLEVBQ3hCLGNBQXFDLEVBQ3JDLGNBQThCLEVBQzlCLGFBQTRCO1FBSDVCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUNyQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUEyQi9DLGVBQVUsR0FBc0IsTUFBTSxDQUFDO1FBQ3ZDLFlBQU8sR0FBd0IsVUFBVSxDQUFDO1FBQzFDLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFD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RyxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1lBQy9CLElBQUksSUFBSSxDQUFDLFFBQVE7Z0JBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsV0FBVyxDQUFDO1lBQ3RELElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLENBQUMsQ0FBQztRQUNqRixDQUFDLEVBQUUsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNoQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLElBQUksK0JBQStCLEVBQUUsQ0FBQyxDQUFDO1FBQ3BJLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzsrR0FsYVUsbUJBQW1CO21HQUFuQixtQkFBbUIsMEZBSm5CLENBQUMsY0FBYyxDQUFDLDZJQzlDN0Isa3BjQXlSQSw4OE5ENU9ZLFlBQVksNlZBQUUsYUFBYSxtTEFBRSxXQUFXOzs0RkFLdkMsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxhQUN4QyxDQUFDLGNBQWMsQ0FBQzs2S0FZbEIsSUFBSTtzQkFBWixLQUFLO2dCQXNDc0IsZ0JBQWdCO3NCQUEzQyxTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgVG9hc3RNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RvYXN0JztcbmltcG9ydCB7IGZvcmtKb2luLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBFdmVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXZlbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL2Vjb21tZXJjZS9zdHlsZXMvdXNlci5tb2RhbCc7XG5cbmludGVyZmFjZSBCb29raW5nUm93IHtcbiAgZ3JvdXBJZDogc3RyaW5nO1xuICBtb2RlOiAnU1RPUkVfVklTSVQnIHwgJ0hPTUVfVklTSVQnIHwgJ1ZJREVPX0NBTEwnO1xuICBib29raW5nRGF0ZTogc3RyaW5nO1xuICBzdGFydFRpbWU/OiBzdHJpbmc7XG4gIGVuZFRpbWU/OiBzdHJpbmc7XG4gIHN0YXR1czogJ1BFTkRJTkcnIHwgJ0JPT0tFRCcgfCAnSE9MRCcgfCAnT05HT0lORycgfCAnQ09NUExFVEVEJyB8ICdDQU5DRUxMRUQnO1xuICBzdG9yZU5hbWU/OiBzdHJpbmc7XG4gIGN1c3RvbWVyRGV0YWlsPzogeyBuYW1lOiBzdHJpbmc7IHBob25lTnVtYmVyOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmcgfTtcbiAgYWRkcmVzc0RldGFpbHM/OiB7IHJlY2VpdmVyTmFtZTogc3RyaW5nOyByZWNlaXZlclBob25lOiBzdHJpbmc7IGFkZHJlc3NMaW5lMTogc3RyaW5nOyBhZGRyZXNzTGluZTI/OiBzdHJpbmc7IGNpdHk6IHN0cmluZzsgc3RhdGU6IHN0cmluZzsgemlwQ29kZTogc3RyaW5nIH07XG4gIHByb2R1Y3RMaW5lcz86IHsgaXRlbU5hbWU6IHN0cmluZzsgcXVhbnRpdHk6IG51bWJlciB9W107XG4gIC8qKiBOb3QgcGFydCBvZiB0aGUgR0VUIC9ib29raW5nL2dyb3VwL215IHJlc3BvbnNlIC0gc2VydmljZXMgbGl2ZSBvbiB0aGUgc2VwYXJhdGVcbiAgICogQm9va2luZ0RldGFpbCBjb2xsZWN0aW9uIChGSydkIHZpYSBzZXJ2aWNlTGluZUlkcywgbm90IGRlbm9ybWFsaXplZCBvbnRvIEJvb2tpbmdHcm91cCksIHNvXG4gICAqIHRoaXMgaXMgZmlsbGVkIGluIGNsaWVudC1zaWRlIGFmdGVyIGxvYWQoKSB2aWEgYSBwZXItcm93IEdFVCAuLi4vbGluZXMgY2FsbC4gKi9cbiAgc2VydmljZXM/OiB7IG5hbWU6IHN0cmluZzsgZHVyYXRpb25NaW51dGVzOiBudW1iZXI7IHByaWNlOiBudW1iZXIgfVtdO1xuICB2aWRlb0NhbGxMaW5rPzogc3RyaW5nO1xuICB0b3RhbENvbGxlY3RlZEF0Qm9va2luZz86IG51bWJlcjtcbiAgdG90YWxQYXlhYmxlPzogbnVtYmVyO1xuICBob21lVmlzaXRDaGFyZ2U/OiBudW1iZXI7XG4gIC8qKiBUcmFuc2llbnQsIGNvbXB1dGVkIG9uIGV2ZXJ5IGJhY2tlbmQgcmVhZCBvZiB0aGlzIGdyb3VwIC0gc2VlIEJvb2tpbmdHcm91cCNjYW5SZXNjaGVkdWxlLiAqL1xuICBjYW5SZXNjaGVkdWxlPzogYm9vbGVhbjtcbiAgcmVzY2hlZHVsZUJsb2NrZWRSZWFzb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogXCJNeSBCb29raW5nc1wiIC0gYSBjdXN0b21lcidzIG93biBib29raW5nIGhpc3RvcnkgKFVwY29taW5nL1Bhc3QpLCBhIGRldGFpbCB2aWV3IHBlciBib29raW5nLFxuICogYW5kIGNhbmNlbGxhdGlvbi4gVGhlIGxpc3QgZW5kcG9pbnQgcmV0dXJucyBmdWxsIEJvb2tpbmdHcm91cCByZWNvcmRzIC0gZW5vdWdoIGZvclxuICogZGF0ZS9zdGF0dXMvYWRkcmVzcy9wcm9kdWN0cyAtIGJ1dCBzZXJ2aWNlcyBib29rZWQgYXJlbid0IG9uIHRoYXQgcmVjb3JkIChzZWUgQm9va2luZ1Jvdy5zZXJ2aWNlc1xuICogYWJvdmUpLCBzbyBsb2FkKCkgaXNzdWVzIG9uZSBleHRyYSBHRVQgLi4uL2xpbmVzIGNhbGwgcGVyIHJvdyB0byBmaWxsIHRoZW0gaW4uXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3NpbXBvLW15LWJvb2tpbmdzJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTWF0SWNvbk1vZHVsZSwgVG9hc3RNb2R1bGVdLFxuICBwcm92aWRlcnM6IFtNZXNzYWdlU2VydmljZV0sXG4gIHRlbXBsYXRlVXJsOiAnLi9teS1ib29raW5ncy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9teS1ib29raW5ncy5jb21wb25lbnQuY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBNeUJvb2tpbmdzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSByZXN0U2VydmljZTogUmVzdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXZlbnRzU2VydmljZTogRXZlbnRzU2VydmljZSxcbiAgKSB7IH1cblxuICBASW5wdXQoKSBkYXRhOiBhbnk7XG4gIHN0eWxlczogYW55O1xuXG4gIC8qKiBTYW1lIGNvbnRyYXN0IGFsZ29yaXRobSBhcyBDb2xvckRpcmVjdGl2ZSAoZGlyZWN0aXZlL2NvbG9yLmRpcmVjdGl2ZS50cykgLSByZWltcGxlbWVudGVkIGFzXG4gICAqIGEgcHVyZSBnZXR0ZXIgcmF0aGVyIHRoYW4gcmV1c2luZyB0aGF0IGRpcmVjdGl2ZSBkaXJlY3RseSwgc2luY2UgaXRzIFtzaW1wb0NvbG9yXSBvbmx5IGV2ZXJcbiAgICogKnNldHMqIGEgY29tcHV0ZWQgY29sb3IgYW5kIG5ldmVyIGNsZWFycyBpdCwgd2hpY2ggd291bGQgbGVhdmUgYSBzdGFsZSBjb2xvciBzdHVjayBvbiBhXG4gICAqIGNoaXAgYWZ0ZXIgaXQgdG9nZ2xlcyBmcm9tIGFjdGl2ZSBiYWNrIHRvIGluYWN0aXZlLiBFdmVyeSBhY2NlbnQtY29sb3JlZCBlbGVtZW50IGhlcmUgaXNcbiAgICogZWl0aGVyIGFsd2F5cy1vbiAobmV2ZXIgdG9nZ2xlcykgb3IgZHJpdmVuIGJ5IHRoaXMgc2FtZSBnZXR0ZXIsIHNvIHRoZXJlJ3MgZXhhY3RseSBvbmVcbiAgICogZGVmaW5pdGlvbiBvZiBcIndoYXQgdGV4dCBjb2xvciBnb2VzIG9uIHRoZSBhY2NlbnQgY29sb3JcIiBpbiB0aGlzIGZpbGUuICovXG4gIGdldCBjb250cmFzdENvbG9yKCk6IHN0cmluZyB7XG4gICAgbGV0IGhleCA9IHRoaXMuc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvcjtcbiAgICBpZiAoIWhleCkgcmV0dXJuICcjZmZmZmZmJztcbiAgICBpZiAoaGV4Lmxlbmd0aCA8IDYpIHtcbiAgICAgIGxldCBleHBhbmRlZCA9ICcjJztcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaGV4Lmxlbmd0aDsgaSsrKSBleHBhbmRlZCArPSBoZXhbaV0gKyBoZXhbaV07XG4gICAgICBoZXggPSBleHBhbmRlZDtcbiAgICB9XG4gICAgY29uc3QgciA9IHBhcnNlSW50KGhleC5zbGljZSgxLCAzKSwgMTYpO1xuICAgIGNvbnN0IGcgPSBwYXJzZUludChoZXguc2xpY2UoMywgNSksIDE2KTtcbiAgICBjb25zdCBiID0gcGFyc2VJbnQoaGV4LnNsaWNlKDUsIDcpLCAxNik7XG4gICAgY29uc3QgYnJpZ2h0bmVzcyA9IChyICogMjk5ICsgZyAqIDU4NyArIGIgKiAxMTQpIC8gMTAwMDtcbiAgICByZXR1cm4gYnJpZ2h0bmVzcyA+IDEzMCA/ICcjMDAwMDAwJyA6ICcjZmZmZmZmJztcbiAgfVxuXG4gIGN1cnJlbnRUYWI6ICdMSVNUJyB8ICdERVRBSUwnID0gJ0xJU1QnO1xuICBwcm9mVGFiOiAndXBjb21pbmcnIHwgJ3Bhc3QnID0gJ3VwY29taW5nJztcbiAgbG9hZGluZyA9IHRydWU7XG4gIGNhbmNlbGxpbmcgPSBmYWxzZTtcbiAgY2FuY2VsQ29uZmlybU9wZW4gPSBmYWxzZTtcblxuICBwcml2YXRlIGFsbEJvb2tpbmdzOiBCb29raW5nUm93W10gPSBbXTtcbiAgdXBjb21pbmc6IEJvb2tpbmdSb3dbXSA9IFtdO1xuICBwYXN0OiBCb29raW5nUm93W10gPSBbXTtcbiAgc2VsZWN0ZWQ6IEJvb2tpbmdSb3cgfCBudWxsID0gbnVsbDtcbiAgY2FuY2VsbGF0aW9uUG9saWN5OiB7IHRpdGxlOiBzdHJpbmc7IHBvbGljeURldGFpbHM6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIHJlc2NoZWR1bGVDdXRvZmZIb3VycyA9IDI0O1xuXG4gIC8vIFJlc2NoZWR1bGUgcGFuZWwgLSBkYXRlIHN0cmlwICsgc2xvdCBncmlkLCBtYXRjaGluZyB0aGUgYWRtaW4gc2lkZSdzIFJlc2NoZWR1bGVBcHBvaW50bWVudENvbXBvbmVudC5cbiAgQFZpZXdDaGlsZCgncmVzY2hEYXlTdHJpcCcpIHJlc2NoRGF5U3RyaXBSZWY/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcbiAgcmVzY2hlZHVsZVBhbmVsT3BlbiA9IGZhbHNlO1xuICByZXNjaERheXM6IHsgaXNvOiBzdHJpbmc7IGRvdzogc3RyaW5nOyBudW06IHN0cmluZyB9W10gPSBbXTtcbiAgcmVzY2hTZWxlY3RlZElzbyA9ICcnO1xuICByZXNjaFNlbGVjdGVkVGltZSA9ICcnO1xuICByZXNjaFNsb3RzOiBzdHJpbmdbXSA9IFtdO1xuICByZXNjaExvYWRpbmdTbG90cyA9IGZhbHNlO1xuICByZXNjaENvbmZpcm1pbmcgPSBmYWxzZTtcbiAgcmVzY2hFcnJvciA9ICcnO1xuICByZXNjaE5vU2xvdHMgPSBmYWxzZTtcblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnN0eWxlcyA9IHRoaXMuZGF0YT8uc3R5bGVzO1xuICAgIHRoaXMubG9hZCgpO1xuICB9XG5cbiAgbG9hZCgpIHtcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xuICAgIGNvbnN0IGJ1c2luZXNzSWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NJZCcpID8/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdiSWQnKSA/PyAnJztcbiAgICBjb25zdCB1c2VySWQgPSAodGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCkgYXMgVXNlcik/LnVzZXJJZCA/PyAnJztcbiAgICBpZiAoIWJ1c2luZXNzSWQgfHwgIXVzZXJJZCkge1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0TXlCb29raW5ncyhidXNpbmVzc0lkLCB1c2VySWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuYWxsQm9va2luZ3MgPSAocmVzID8/IFtdKSBhcyBCb29raW5nUm93W107XG4gICAgICB0aGlzLnNwbGl0Qm9va2luZ3MoKTtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5sb2FkU2VydmljZUxpbmVzKCk7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldENhbmNlbGxhdGlvblBvbGljeShidXNpbmVzc0lkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLmNhbmNlbGxhdGlvblBvbGljeSA9IChyZXMgPz8gW10pWzBdID8/IG51bGw7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgLy8gTm9uLWZhdGFsIC0gdGhlIGRldGFpbCB2aWV3IGp1c3Qgd29uJ3Qgc2hvdyBhIHBvbGljeSBub3RlLlxuICAgIH0pO1xuXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRCdXNpbmVzc0FwcG9pbnRtZW50U2V0dGluZ3MoYnVzaW5lc3NJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZXNjaGVkdWxlQ3V0b2ZmSG91cnMgPSByZXM/LnJlc2NoZWR1bGVDdXRvZmZIb3VycyA/PyAyNDtcbiAgICB9LCAoKSA9PiB7XG4gICAgICAvLyBOb24tZmF0YWwgLSBmYWxscyBiYWNrIHRvIHRoZSBkZWZhdWx0IGN1dG9mZiB1c2VkIGZvciBkaXNwbGF5IG9ubHk7IHRoZSBiYWNrZW5kIGlzIHRoZVxuICAgICAgLy8gcmVhbCBzb3VyY2Ugb2YgdHJ1dGggYW5kIGVuZm9yY2VzIGl0cyBvd24gYWN0dWFsIGNvbmZpZ3VyZWQgdmFsdWUgcmVnYXJkbGVzcy5cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNVcGNvbWluZyhiOiBCb29raW5nUm93KTogYm9vbGVhbiB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiAoYi5zdGF0dXMgPT09ICdIT0xEJyB8fCBiLnN0YXR1cyA9PT0gJ0JPT0tFRCcgfHwgYi5zdGF0dXMgPT09ICdQRU5ESU5HJyB8fCBiLnN0YXR1cyA9PT0gJ09OR09JTkcnKSAmJiBuZXcgRGF0ZShiLmJvb2tpbmdEYXRlKSA+PSB0b2RheTtcbiAgfVxuXG4gIHByaXZhdGUgc3BsaXRCb29raW5ncygpIHtcbiAgICB0aGlzLnVwY29taW5nID0gdGhpcy5hbGxCb29raW5ncy5maWx0ZXIoKGIpID0+IHRoaXMuaXNVcGNvbWluZyhiKSk7XG4gICAgdGhpcy5wYXN0ID0gdGhpcy5hbGxCb29raW5ncy5maWx0ZXIoKGIpID0+ICF0aGlzLmlzVXBjb21pbmcoYikpO1xuICB9XG5cbiAgLyoqIE9uZSBib29raW5nIGhpc3RvcnkgbG9hZCwgYm91bmRlZCB0byB0aGlzIGN1c3RvbWVyJ3Mgb3duIGJvb2tpbmdzIC0gYSBwZXItcm93IGNhbGwgaGVyZSBpc1xuICAgKiBmaW5lLCB1bmxpa2UgYW4gdW5ib3VuZGVkL3BhZ2luYXRlZCBsaXN0LiBGYWlsdXJlcyBhcmUgc3dhbGxvd2VkIHBlci1yb3cgKGZhbGxzIGJhY2sgdG8gbm9cbiAgICogc2VydmljZSBuYW1lcyBmb3IgdGhhdCByb3cpIHJhdGhlciB0aGFuIGJsb2NraW5nIHRoZSB3aG9sZSBwYWdlIG9uIG9uZSBiYWQgZ3JvdXAuICovXG4gIHByaXZhdGUgbG9hZFNlcnZpY2VMaW5lcygpIHtcbiAgICBpZiAoIXRoaXMuYWxsQm9va2luZ3MubGVuZ3RoKSByZXR1cm47XG4gICAgZm9ya0pvaW4oXG4gICAgICB0aGlzLmFsbEJvb2tpbmdzLm1hcCgoYikgPT5cbiAgICAgICAgdGhpcy5yZXN0U2VydmljZS5nZXRHcm91cExpbmVzKGIuZ3JvdXBJZCkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKFtdKSkpXG4gICAgICApXG4gICAgKS5zdWJzY3JpYmUoKGFsbExpbmVzOiBhbnlbXSkgPT4ge1xuICAgICAgdGhpcy5hbGxCb29raW5ncy5mb3JFYWNoKChiLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmVzID0gYWxsTGluZXNbaV0gPz8gW107XG4gICAgICAgIGIuc2VydmljZXMgPSBsaW5lcy5mbGF0TWFwKChsOiBhbnkpID0+IChsLnNlcnZpY2VzID8/IFtdKS5tYXAoKHM6IGFueSkgPT4gKHtcbiAgICAgICAgICBuYW1lOiBzLm5hbWUsIGR1cmF0aW9uTWludXRlczogcy5kdXJhdGlvbk1pbnV0ZXMsIHByaWNlOiBzLnByaWNlXG4gICAgICAgIH0pKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCByb3dzKCk6IEJvb2tpbmdSb3dbXSB7XG4gICAgcmV0dXJuIHRoaXMucHJvZlRhYiA9PT0gJ3VwY29taW5nJyA/IHRoaXMudXBjb21pbmcgOiB0aGlzLnBhc3Q7XG4gIH1cbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmxvYWRpbmcgJiYgdGhpcy5yb3dzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIHNldFByb2ZUYWIodGFiOiAndXBjb21pbmcnIHwgJ3Bhc3QnKSB7XG4gICAgdGhpcy5wcm9mVGFiID0gdGFiO1xuICB9XG5cbiAgcHJvZHVjdE5hbWVzKGI6IEJvb2tpbmdSb3cpOiBzdHJpbmcge1xuICAgIHJldHVybiAoYi5wcm9kdWN0TGluZXMgPz8gW10pLm1hcCgocCkgPT4gcC5pdGVtTmFtZSkuZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJyk7XG4gIH1cbiAgc2VydmljZU5hbWVzKGI6IEJvb2tpbmdSb3cpOiBzdHJpbmcge1xuICAgIHJldHVybiAoYi5zZXJ2aWNlcyA/PyBbXSkubWFwKChzKSA9PiBzLm5hbWUpLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpO1xuICB9XG4gIHRpdGxlKGI6IEJvb2tpbmdSb3cpOiBzdHJpbmcge1xuICAgIGNvbnN0IG1vZGVMYWJlbCA9IGIubW9kZSA9PT0gJ0hPTUVfVklTSVQnID8gJ0hvbWUgVmlzaXQnIDogYi5tb2RlID09PSAnVklERU9fQ0FMTCcgPyAnVmlkZW8gQ2FsbCcgOiAnU3RvcmUgVmlzaXQnO1xuICAgIGNvbnN0IGl0ZW1zID0gW3RoaXMuc2VydmljZU5hbWVzKGIpLCB0aGlzLnByb2R1Y3ROYW1lcyhiKV0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oJywgJyk7XG4gICAgcmV0dXJuIGl0ZW1zID8gYCR7bW9kZUxhYmVsfSDCtyAke2l0ZW1zfWAgOiBtb2RlTGFiZWw7XG4gIH1cbiAgd2hlbihiOiBCb29raW5nUm93KTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoYi5ib29raW5nRGF0ZSkudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1JTicsIHsgd2Vla2RheTogJ3Nob3J0JywgZGF5OiAnbnVtZXJpYycsIG1vbnRoOiAnc2hvcnQnLCB5ZWFyOiAnbnVtZXJpYycgfSk7XG4gICAgcmV0dXJuIGIuc3RhcnRUaW1lID8gYCR7ZGF0ZX0gwrcgJHtiLnN0YXJ0VGltZX1gIDogZGF0ZTtcbiAgfVxuICBkZXRhaWwoYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgaWYgKGIubW9kZSA9PT0gJ0hPTUVfVklTSVQnICYmIGIuYWRkcmVzc0RldGFpbHMpIHJldHVybiBgJHtiLmFkZHJlc3NEZXRhaWxzLmNpdHl9LCAke2IuYWRkcmVzc0RldGFpbHMuc3RhdGV9YDtcbiAgICBpZiAoYi5tb2RlID09PSAnU1RPUkVfVklTSVQnICYmIGIuc3RvcmVOYW1lKSByZXR1cm4gYi5zdG9yZU5hbWU7XG4gICAgcmV0dXJuIGIuY3VzdG9tZXJEZXRhaWw/Lm5hbWUgPz8gJyc7XG4gIH1cbiAgc3RhdHVzTGFiZWwoc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChzdGF0dXMgPT09ICdDT01QTEVURUQnKSByZXR1cm4gJ0NvbXBsZXRlZCc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiAnQ2FuY2VsbGVkJztcbiAgICBpZiAoc3RhdHVzID09PSAnSE9MRCcgfHwgc3RhdHVzID09PSAnUEVORElORycpIHJldHVybiAnUGF5bWVudCBQZW5kaW5nJztcbiAgICBpZiAoc3RhdHVzID09PSAnT05HT0lORycpIHJldHVybiAnSW4gUHJvZ3Jlc3MnO1xuICAgIHJldHVybiAnQ29uZmlybWVkJztcbiAgfVxuICBzdGF0dXNDbGFzcyhzdGF0dXM6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NPTVBMRVRFRCcpIHJldHVybiAnc3RhdHVzLWNvbXBsZXRlZCc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0NBTkNFTExFRCcpIHJldHVybiAnc3RhdHVzLWNhbmNlbGxlZCc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0hPTEQnIHx8IHN0YXR1cyA9PT0gJ1BFTkRJTkcnKSByZXR1cm4gJ3N0YXR1cy1wZW5kaW5nJztcbiAgICBpZiAoc3RhdHVzID09PSAnT05HT0lORycpIHJldHVybiAnc3RhdHVzLW9uZ29pbmcnO1xuICAgIHJldHVybiAnc3RhdHVzLWNvbmZpcm1lZCc7XG4gIH1cbiAgcGFpZExhYmVsKGI6IEJvb2tpbmdSb3cpOiBzdHJpbmcge1xuICAgIHJldHVybiBiLnRvdGFsQ29sbGVjdGVkQXRCb29raW5nICYmIGIudG90YWxDb2xsZWN0ZWRBdEJvb2tpbmcgPiAwID8gYOKCuSR7Yi50b3RhbENvbGxlY3RlZEF0Qm9va2luZ31gIDogJ05vdGhpbmcg4oCUIGZyZWUnO1xuICB9XG4gIHNlcnZpY2VQcmljZVRvdGFsKGI6IEJvb2tpbmdSb3cpOiBudW1iZXIge1xuICAgIHJldHVybiAoYi5zZXJ2aWNlcyA/PyBbXSkucmVkdWNlKChzdW0sIHMpID0+IHN1bSArIChzLnByaWNlIHx8IDApLCAwKTtcbiAgfVxuICB0b3RhbER1ZShiOiBCb29raW5nUm93KTogbnVtYmVyIHtcbiAgICByZXR1cm4gKGIudG90YWxQYXlhYmxlID8/IDApICsgKGIuaG9tZVZpc2l0Q2hhcmdlID8/IDApO1xuICB9XG4gIHBlbmRpbmdBbW91bnQoYjogQm9va2luZ1Jvdyk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIHRoaXMudG90YWxEdWUoYikgLSAoYi50b3RhbENvbGxlY3RlZEF0Qm9va2luZyA/PyAwKSk7XG4gIH1cbiAgZ2V0IGNhbkNhbmNlbFNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc2VsZWN0ZWQgJiYgKHRoaXMuc2VsZWN0ZWQuc3RhdHVzID09PSAnSE9MRCcgfHwgdGhpcy5zZWxlY3RlZC5zdGF0dXMgPT09ICdCT09LRUQnIHx8IHRoaXMuc2VsZWN0ZWQuc3RhdHVzID09PSAnUEVORElORycpO1xuICB9XG4gIGdldCBjYW5SZXNjaGVkdWxlU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zZWxlY3RlZCAmJiB0aGlzLnNlbGVjdGVkLnN0YXR1cyA9PT0gJ0JPT0tFRCcgJiYgISF0aGlzLnNlbGVjdGVkLmNhblJlc2NoZWR1bGU7XG4gIH1cbiAgZ2V0IGNhbkFkZFNlcnZpY2VTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkICYmIHRoaXMuc2VsZWN0ZWQuc3RhdHVzID09PSAnQk9PS0VEJztcbiAgfVxuXG4gIHZpZXdCb29raW5nRGV0YWlsKGI6IEJvb2tpbmdSb3cpIHtcbiAgICB0aGlzLnNlbGVjdGVkID0gYjtcbiAgICB0aGlzLmN1cnJlbnRUYWIgPSAnREVUQUlMJztcbiAgICB0aGlzLnJlc2NoZWR1bGVQYW5lbE9wZW4gPSBmYWxzZTtcbiAgfVxuICBiYWNrVG9MaXN0KCkge1xuICAgIHRoaXMuY3VycmVudFRhYiA9ICdMSVNUJztcbiAgICB0aGlzLnNlbGVjdGVkID0gbnVsbDtcbiAgICB0aGlzLnJlc2NoZWR1bGVQYW5lbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZXNjaGVkdWxlXG5cbiAgb3BlblJlc2NoZWR1bGVQYW5lbCgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQpIHJldHVybjtcbiAgICB0aGlzLnJlc2NoZWR1bGVQYW5lbE9wZW4gPSB0cnVlO1xuICAgIHRoaXMucmVzY2hTZWxlY3RlZFRpbWUgPSAnJztcbiAgICB0aGlzLnJlc2NoRXJyb3IgPSAnJztcbiAgICB0aGlzLmJ1aWxkUmVzY2hEYXlTdHJpcCgpO1xuICAgIGlmICh0aGlzLnJlc2NoRGF5cy5sZW5ndGgpIHRoaXMuc2VsZWN0UmVzY2hEYXkodGhpcy5yZXNjaERheXNbMF0pO1xuICB9XG4gIGNsb3NlUmVzY2hlZHVsZVBhbmVsKCkge1xuICAgIHRoaXMucmVzY2hlZHVsZVBhbmVsT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFJlc2NoRGF5U3RyaXAoKSB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHRoaXMucmVzY2hEYXlzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCAxNDsgaSsrKSB7XG4gICAgICBjb25zdCBkID0gbmV3IERhdGUodG9kYXkpO1xuICAgICAgZC5zZXREYXRlKGQuZ2V0RGF0ZSgpICsgaSk7XG4gICAgICB0aGlzLnJlc2NoRGF5cy5wdXNoKHtcbiAgICAgICAgaXNvOiBkLnRvSVNPU3RyaW5nKCksXG4gICAgICAgIGRvdzogZC50b0xvY2FsZURhdGVTdHJpbmcoJ2VuLUlOJywgeyB3ZWVrZGF5OiAnc2hvcnQnIH0pLFxuICAgICAgICBudW06IGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1JTicsIHsgZGF5OiAnbnVtZXJpYycgfSksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogTW91c2UgdXNlcnMgaGF2ZSBubyBzd2lwZS90cmFja3BhZCBnZXN0dXJlIGZvciB0aGUgaG9yaXpvbnRhbGx5LXNjcm9sbGluZyBkYXkgc3RyaXAgLSBnaXZlXG4gICAqIHRoZW0gZXhwbGljaXQgcHJldi9uZXh0IGFycm93cyBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gc2hpZnQrd2hlZWwgKG1hdGNoZXMgdGhlIGFkbWluIHNpZGUnc1xuICAgKiBSZXNjaGVkdWxlQXBwb2ludG1lbnRDb21wb25lbnQjc2Nyb2xsRGF5cykuICovXG4gIHNjcm9sbFJlc2NoRGF5cyhkaXJlY3Rpb246IG51bWJlcikge1xuICAgIGNvbnN0IGVsID0gdGhpcy5yZXNjaERheVN0cmlwUmVmPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBlbC5zY3JvbGxCeSh7IGxlZnQ6IGRpcmVjdGlvbiAqIDE2MCwgYmVoYXZpb3I6ICdzbW9vdGgnIH0pO1xuICB9XG5cbiAgc2VsZWN0UmVzY2hEYXkoZGF5OiB7IGlzbzogc3RyaW5nIH0pIHtcbiAgICB0aGlzLnJlc2NoU2VsZWN0ZWRJc28gPSBkYXkuaXNvO1xuICAgIHRoaXMucmVzY2hTZWxlY3RlZFRpbWUgPSAnJztcbiAgICB0aGlzLnJlc2NoRXJyb3IgPSAnJztcbiAgICB0aGlzLmZldGNoUmVzY2hTbG90cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBmZXRjaFJlc2NoU2xvdHMoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkKSByZXR1cm47XG4gICAgdGhpcy5yZXNjaExvYWRpbmdTbG90cyA9IHRydWU7XG4gICAgdGhpcy5yZXNjaE5vU2xvdHMgPSBmYWxzZTtcbiAgICB0aGlzLnJlc2NoU2xvdHMgPSBbXTtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldFJlc2NoZWR1bGVTbG90cyh0aGlzLnNlbGVjdGVkLmdyb3VwSWQsIHRoaXMucmVzY2hTZWxlY3RlZElzbykuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZXNjaExvYWRpbmdTbG90cyA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNjaFNsb3RzID0gcmVzID8/IFtdO1xuICAgICAgdGhpcy5yZXNjaE5vU2xvdHMgPSB0aGlzLnJlc2NoU2xvdHMubGVuZ3RoID09PSAwO1xuICAgIH0sICgpID0+IHtcbiAgICAgIHRoaXMucmVzY2hMb2FkaW5nU2xvdHMgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzY2hOb1Nsb3RzID0gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbGVjdFJlc2NoVGltZSh0aW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLnJlc2NoU2VsZWN0ZWRUaW1lID0gdGltZTtcbiAgfVxuXG4gIGdldCByZXNjaEludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLnJlc2NoU2VsZWN0ZWRJc28gfHwgIXRoaXMucmVzY2hTZWxlY3RlZFRpbWUgfHwgdGhpcy5yZXNjaENvbmZpcm1pbmc7XG4gIH1cblxuICBjb25maXJtUmVzY2hlZHVsZSgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQgfHwgdGhpcy5yZXNjaEludmFsaWQpIHJldHVybjtcbiAgICB0aGlzLnJlc2NoQ29uZmlybWluZyA9IHRydWU7XG4gICAgdGhpcy5yZXNjaEVycm9yID0gJyc7XG4gICAgdGhpcy5yZXN0U2VydmljZS5yZXNjaGVkdWxlQm9va2luZyh0aGlzLnNlbGVjdGVkLmdyb3VwSWQsIHRoaXMucmVzY2hTZWxlY3RlZElzbywgdGhpcy5yZXNjaFNlbGVjdGVkVGltZSkuc3Vic2NyaWJlKChncm91cDogYW55KSA9PiB7XG4gICAgICB0aGlzLnJlc2NoQ29uZmlybWluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNjaGVkdWxlUGFuZWxPcGVuID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmJvb2tpbmdEYXRlID0gZ3JvdXA/LmJvb2tpbmdEYXRlID8/IHRoaXMucmVzY2hTZWxlY3RlZElzbztcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zdGFydFRpbWUgPSBncm91cD8uc3RhcnRUaW1lID8/IHRoaXMuc2VsZWN0ZWQuc3RhcnRUaW1lO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmVuZFRpbWUgPSBncm91cD8uZW5kVGltZSA/PyB0aGlzLnNlbGVjdGVkLmVuZFRpbWU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuY2FuUmVzY2hlZHVsZSA9IGdyb3VwPy5jYW5SZXNjaGVkdWxlID8/IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLnJlc2NoZWR1bGVCbG9ja2VkUmVhc29uID0gZ3JvdXA/LnJlc2NoZWR1bGVCbG9ja2VkUmVhc29uID8/ICcnO1xuICAgICAgfVxuICAgICAgdGhpcy5zcGxpdEJvb2tpbmdzKCk7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnk6ICdCb29raW5nIHJlc2NoZWR1bGVkJyB9KTtcbiAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZXNjaENvbmZpcm1pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzY2hFcnJvciA9IGVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCBlcnJvcj8uZXJyb3I/LmRldGFpbCB8fCAnVW5hYmxlIHRvIHJlc2NoZWR1bGUgdGhpcyBib29raW5nJztcbiAgICB9KTtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBZGQgU2VydmljZVxuXG4gIGFkZFNlcnZpY2VQYW5lbE9wZW4gPSBmYWxzZTtcbiAgYWRkU2VydmljZUxvYWRpbmcgPSBmYWxzZTtcbiAgYWRkU2VydmljZU9wdGlvbnM6IGFueVtdID0gW107XG4gIGFkZFNlcnZpY2VTZWxlY3RlZDogYW55W10gPSBbXTtcbiAgYWRkU2VydmljZVN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgYWRkU2VydmljZUVycm9yID0gJyc7XG5cbiAgb3BlbkFkZFNlcnZpY2VQYW5lbCgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQpIHJldHVybjtcbiAgICB0aGlzLmFkZFNlcnZpY2VQYW5lbE9wZW4gPSB0cnVlO1xuICAgIHRoaXMuYWRkU2VydmljZUVycm9yID0gJyc7XG4gICAgdGhpcy5hZGRTZXJ2aWNlU2VsZWN0ZWQgPSBbXTtcbiAgICB0aGlzLmFkZFNlcnZpY2VMb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEFkZFNlcnZpY2VPcHRpb25zKHRoaXMuc2VsZWN0ZWQuZ3JvdXBJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlT3B0aW9ucyA9IHJlcyA/PyBbXTtcbiAgICB9LCAoKSA9PiB7XG4gICAgICB0aGlzLmFkZFNlcnZpY2VMb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmFkZFNlcnZpY2VPcHRpb25zID0gW107XG4gICAgfSk7XG4gIH1cbiAgY2xvc2VBZGRTZXJ2aWNlUGFuZWwoKSB7XG4gICAgdGhpcy5hZGRTZXJ2aWNlUGFuZWxPcGVuID0gZmFsc2U7XG4gIH1cblxuICBpc0FkZFNlcnZpY2VTZWxlY3RlZChzZXJ2aWNlOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5hZGRTZXJ2aWNlU2VsZWN0ZWQuc29tZSgocykgPT4gcy5zZXJ2aWNlSWQgPT09IHNlcnZpY2Uuc2VydmljZUlkKTtcbiAgfVxuICB0b2dnbGVBZGRTZXJ2aWNlKHNlcnZpY2U6IGFueSkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5hZGRTZXJ2aWNlU2VsZWN0ZWQuZmluZEluZGV4KChzKSA9PiBzLnNlcnZpY2VJZCA9PT0gc2VydmljZS5zZXJ2aWNlSWQpO1xuICAgIGlmIChpbmRleCA+IC0xKSB0aGlzLmFkZFNlcnZpY2VTZWxlY3RlZC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGVsc2UgdGhpcy5hZGRTZXJ2aWNlU2VsZWN0ZWQucHVzaChzZXJ2aWNlKTtcbiAgfVxuXG4gIC8qKiBNaXJyb3JzIGFwcG9pbnRtZW50X3NlcnZpY2UncyBEZXBvc2l0VXRpbHMjZ2V0U2VydmljZURlcG9zaXRBbW91bnQgZXhhY3RseSAtIGZpeGVkIGFtb3VudFxuICAgKiB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgcGVyY2VudCwgMCB3aGVuIG5vIGRlcG9zaXQgaXMgY29uZmlndXJlZC4gT25seSB1c2VkIHRvIGRlY2lkZSB3aGljaFxuICAgKiBlbmRwb2ludCB0byBjYWxsIChhIGxpdmUgQ2FzaGZyZWUgY2hlY2tvdXQgdnMuIHRoZSBkaXJlY3QgYWRkKSAtIHRoZSBiYWNrZW5kIHJlLWRlcml2ZXMgdGhpc1xuICAgKiBpdHNlbGYgYW5kIG5ldmVyIHRydXN0cyBhIGNsaWVudC1jb21wdXRlZCBhbW91bnQuICovXG4gIHByaXZhdGUgc2VydmljZURlcG9zaXQoc2VydmljZTogYW55KTogbnVtYmVyIHtcbiAgICBjb25zdCBkID0gc2VydmljZT8uZGVwb3NpdEFtb3VudDtcbiAgICBpZiAoIWQ/LmRlcG9zaXRSZXF1aXJlZCkgcmV0dXJuIDA7XG4gICAgaWYgKGQuZml4ZWRBbW91bnQgPiAwKSByZXR1cm4gZC5maXhlZEFtb3VudDtcbiAgICBjb25zdCBwcmljZSA9IHNlcnZpY2U/LnByaWNlRGV0YWlscz8udG90YWxQcmljZSA/PyAwO1xuICAgIHJldHVybiAoKGQuZGVwb3NpdFBlcmNlbnQgPz8gMCkgLyAxMDApICogcHJpY2U7XG4gIH1cblxuICAvKiogU3VtbWVkIGFjcm9zcyBldmVyeSBjdXJyZW50bHktY2hlY2tlZCBzZXJ2aWNlIC0gZHJpdmVzIGJvdGggdGhlIHJ1bm5pbmcgdG90YWwgc2hvd24gaW4gdGhlXG4gICAqIHBhbmVsIGFuZCB3aGljaCBlbmRwb2ludCBhZGRTZXJ2aWNlKCkgY2FsbHMgKHNhbWUgdG90YWwgdGhlIGJhY2tlbmQgaW5kZXBlbmRlbnRseSByZS1kZXJpdmVzXG4gICAqIGFuZCBhY3R1YWxseSBlbmZvcmNlcykuICovXG4gIGdldCBhZGRTZXJ2aWNlVG90YWxEZXBvc2l0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYWRkU2VydmljZVNlbGVjdGVkLnJlZHVjZSgoc3VtLCBzKSA9PiBzdW0gKyB0aGlzLnNlcnZpY2VEZXBvc2l0KHMpLCAwKTtcbiAgfVxuXG4gIGFkZFNlcnZpY2UoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkIHx8IHRoaXMuYWRkU2VydmljZVN1Ym1pdHRpbmcgfHwgIXRoaXMuYWRkU2VydmljZVNlbGVjdGVkLmxlbmd0aCkgcmV0dXJuO1xuICAgIGNvbnN0IHNlcnZpY2VJZHMgPSB0aGlzLmFkZFNlcnZpY2VTZWxlY3RlZC5tYXAoKHMpID0+IHMuc2VydmljZUlkKTtcbiAgICBjb25zdCBkZXBvc2l0ID0gdGhpcy5hZGRTZXJ2aWNlVG90YWxEZXBvc2l0O1xuICAgIHRoaXMuYWRkU2VydmljZVN1Ym1pdHRpbmcgPSB0cnVlO1xuICAgIHRoaXMuYWRkU2VydmljZUVycm9yID0gJyc7XG5cbiAgICBpZiAoZGVwb3NpdCA8PSAwKSB7XG4gICAgICB0aGlzLnJlc3RTZXJ2aWNlLmFkZFNlcnZpY2VUb0Jvb2tpbmcodGhpcy5zZWxlY3RlZC5ncm91cElkLCBzZXJ2aWNlSWRzKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2VTdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWRkU2VydmljZVBhbmVsT3BlbiA9IGZhbHNlO1xuICAgICAgICBjb25zdCBzdW1tYXJ5ID0gdGhpcy5hZGRTZXJ2aWNlU2VsZWN0ZWQubGVuZ3RoID09PSAxXG4gICAgICAgICAgPyB0aGlzLmFkZFNlcnZpY2VTZWxlY3RlZFswXS5uYW1lICsgJyBhZGRlZCdcbiAgICAgICAgICA6IHRoaXMuYWRkU2VydmljZVNlbGVjdGVkLmxlbmd0aCArICcgc2VydmljZXMgYWRkZWQnO1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnc3VjY2VzcycsIHN1bW1hcnkgfSk7XG4gICAgICAgIHRoaXMucmVmcmVzaFNlbGVjdGVkU2VydmljZUxpbmVzKCk7XG4gICAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2VTdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWRkU2VydmljZUVycm9yID0gZXJyb3I/LmVycm9yPy5tZXNzYWdlIHx8ICdVbmFibGUgdG8gYWRkIHRoZXNlIHNlcnZpY2VzJztcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIERlcG9zaXQgcmVxdWlyZWQgLSBub3RoaW5nIGlzIGF0dGFjaGVkIHRvIHRoZSBib29raW5nIHVudGlsIHRoaXMgcGF5bWVudCBpcyB2ZXJpZmllZFxuICAgIC8vIChCb29raW5nR3JvdXBTZXJ2aWNlI2NvbmZpcm1TZXJ2aWNlQWRkT24pLCBzYW1lIGxpdmUtY2hlY2tvdXQgcGF0dGVybiB0aGUgb3JpZ2luYWwgYm9va2luZ1xuICAgIC8vIGZsb3cgYWxyZWFkeSB1c2VzIChzZWUgdGhpcyBjb21wb25lbnQncyBvd24gY29uZmlybVJlc2NoZWR1bGUvY2FuY2VsQm9va2luZyBuZWlnaGJvcnMgLVxuICAgIC8vIG5vbmUgb2YgdGhvc2UgdG91Y2ggcGF5bWVudCAtIGFuZCBhcHBvaW50bWVudC1ib29raW5nLmNvbXBvbmVudC50cydzIGhvbGRCb29raW5nIHN1Y2Nlc3NcbiAgICAvLyBoYW5kbGVyIGZvciB0aGUgYWN0dWFsIHByZWNlZGVudCkuIE9uZSBjaGVja291dCBmb3IgdGhlIHdob2xlIGJhdGNoJ3Mgc3VtbWVkIGRlcG9zaXQuXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZW5lcmF0ZUFkZFNlcnZpY2VQYXltZW50VG9rZW4odGhpcy5zZWxlY3RlZC5ncm91cElkLCBzZXJ2aWNlSWRzKS5zdWJzY3JpYmUoKG9yZGVyOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuYWRkU2VydmljZVN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhZGRPblBheW1lbnRJZCcsIG9yZGVyLnBnT3JkZXJJZCk7XG4gICAgICB0aGlzLmV2ZW50c1NlcnZpY2UuY2FzaEZyZWVFdmVudC5lbWl0KHsgZGF0YTogeyBvcmRlclNpZ25hdHVyZTogb3JkZXIub3JkZXJTaWduYXR1cmUgfSB9KTtcbiAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlU3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlRXJyb3IgPSBlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgJ1VuYWJsZSB0byBzdGFydCBwYXltZW50IGZvciB0aGVzZSBzZXJ2aWNlcyc7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hTZWxlY3RlZFNlcnZpY2VMaW5lcygpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQpIHJldHVybjtcbiAgICBjb25zdCBncm91cElkID0gdGhpcy5zZWxlY3RlZC5ncm91cElkO1xuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0R3JvdXBMaW5lcyhncm91cElkKS5waXBlKGNhdGNoRXJyb3IoKCkgPT4gb2YoW10pKSkuc3Vic2NyaWJlKChsaW5lczogYW55KSA9PiB7XG4gICAgICBjb25zdCBib29raW5nID0gdGhpcy5hbGxCb29raW5ncy5maW5kKChiKSA9PiBiLmdyb3VwSWQgPT09IGdyb3VwSWQpO1xuICAgICAgY29uc3Qgc2VydmljZXMgPSAobGluZXMgPz8gW10pLmZsYXRNYXAoKGw6IGFueSkgPT4gKGwuc2VydmljZXMgPz8gW10pLm1hcCgoczogYW55KSA9PiAoe1xuICAgICAgICBuYW1lOiBzLm5hbWUsIGR1cmF0aW9uTWludXRlczogcy5kdXJhdGlvbk1pbnV0ZXMsIHByaWNlOiBzLnByaWNlXG4gICAgICB9KSkpO1xuICAgICAgaWYgKGJvb2tpbmcpIGJvb2tpbmcuc2VydmljZXMgPSBzZXJ2aWNlcztcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkPy5ncm91cElkID09PSBncm91cElkKSB0aGlzLnNlbGVjdGVkLnNlcnZpY2VzID0gc2VydmljZXM7XG4gICAgfSk7XG4gIH1cblxuICBvcGVuQ2FuY2VsQ29uZmlybSgpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQpIHJldHVybjtcbiAgICB0aGlzLmNhbmNlbENvbmZpcm1PcGVuID0gdHJ1ZTtcbiAgfVxuICBjbG9zZUNhbmNlbENvbmZpcm0oKSB7XG4gICAgdGhpcy5jYW5jZWxDb25maXJtT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgY2FuY2VsQm9va2luZygpIHtcbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWQgfHwgdGhpcy5jYW5jZWxsaW5nKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxsaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmNhbmNlbEJvb2tpbmdHcm91cCh0aGlzLnNlbGVjdGVkLmdyb3VwSWQsICdDYW5jZWxsZWQgYnkgY3VzdG9tZXInKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxsaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmNhbmNlbENvbmZpcm1PcGVuID0gZmFsc2U7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZCkgdGhpcy5zZWxlY3RlZC5zdGF0dXMgPSAnQ0FOQ0VMTEVEJztcbiAgICAgIHRoaXMuc3BsaXRCb29raW5ncygpO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnQm9va2luZyBjYW5jZWxsZWQnIH0pO1xuICAgIH0sIChlcnJvcjogYW55KSA9PiB7XG4gICAgICB0aGlzLmNhbmNlbGxpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdFcnJvcicsIGRldGFpbDogZXJyb3I/LmVycm9yPy5kZXRhaWwgPz8gJ0NvdWxkIG5vdCBjYW5jZWwgdGhpcyBib29raW5nJyB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPHAtdG9hc3QgcG9zaXRpb249XCJib3R0b20tcmlnaHRcIj48L3AtdG9hc3Q+XG5cbjxkaXYgY2xhc3M9XCJtYi1yb290XCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50VGFiID09PSAnTElTVCdcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWItdGl0bGVcIj5NeSBCb29raW5nczwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLXRhYnNcIj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItdGFiXCIgW2NsYXNzLmFjdGl2ZV09XCJwcm9mVGFiID09PSAndXBjb21pbmcnXCIgKGNsaWNrKT1cInNldFByb2ZUYWIoJ3VwY29taW5nJylcIj5VcGNvbWluZzwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi10YWJcIiBbY2xhc3MuYWN0aXZlXT1cInByb2ZUYWIgPT09ICdwYXN0J1wiIChjbGljayk9XCJzZXRQcm9mVGFiKCdwYXN0JylcIj5QYXN0PC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItbG9hZGluZ1wiICpuZ0lmPVwibG9hZGluZ1wiPkxvYWRpbmcgeW91ciBib29raW5nc+KApjwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLXJvd3NcIiAqbmdJZj1cIiFsb2FkaW5nICYmICFpc0VtcHR5XCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXJvd1wiICpuZ0Zvcj1cImxldCBiIG9mIHJvd3NcIiAoY2xpY2spPVwidmlld0Jvb2tpbmdEZXRhaWwoYilcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy1zdHJpcGVcIiBbbmdDbGFzc109XCJiLm1vZGUgPT09ICdIT01FX1ZJU0lUJyA/ICdzdHJpcGUtaG9tZScgOiBiLm1vZGUgPT09ICdWSURFT19DQUxMJyA/ICdzdHJpcGUtdmlkZW8nIDogJ3N0cmlwZS1zdG9yZSdcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy1pbmZvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy10b3BcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctdGl0bGVcIj57e3RpdGxlKGIpfX08L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcm93LXdoZW5cIj57e3doZW4oYil9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctZGV0YWlsXCI+e3tkZXRhaWwoYil9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy1lbmRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1iLXN0YXR1c1wiIFtuZ0NsYXNzXT1cInN0YXR1c0NsYXNzKGIuc3RhdHVzKVwiPnt7c3RhdHVzTGFiZWwoYi5zdGF0dXMpfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItZW1wdHlcIiAqbmdJZj1cImlzRW1wdHlcIj5cbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1iLWVtcHR5LWljb25cIj5ldmVudF9idXN5PC9tYXQtaWNvbj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1lbXB0eS10aXRsZVwiPk5vIHt7cHJvZlRhYn19IGJvb2tpbmdzIHlldC48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9uZy1jb250YWluZXI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRUYWIgPT09ICdERVRBSUwnICYmIHNlbGVjdGVkXCI+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1iYWNrXCIgKGNsaWNrKT1cImJhY2tUb0xpc3QoKVwiPlxuICAgICAgPG1hdC1pY29uPmFycm93X2JhY2s8L21hdC1pY29uPiBCYWNrIHRvIE15IEJvb2tpbmdzXG4gICAgPC9idXR0b24+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWNhcmRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdGl0bGUtcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC10aXRsZVwiPnt7dGl0bGUoc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1iLXN0YXR1c1wiIFtuZ0NsYXNzXT1cInN0YXR1c0NsYXNzKHNlbGVjdGVkLnN0YXR1cylcIj57e3N0YXR1c0xhYmVsKHNlbGVjdGVkLnN0YXR1cyl9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtd2hlblwiPnt7d2hlbihzZWxlY3RlZCl9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93c1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQuc2VydmljZXM/Lmxlbmd0aFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPlNlcnZpY2VzPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+e3tzZXJ2aWNlTmFtZXMoc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCIgKm5nSWY9XCJzZWxlY3RlZC5wcm9kdWN0TGluZXM/Lmxlbmd0aFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPlByb2R1Y3RzPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+e3twcm9kdWN0TmFtZXMoc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCIgKm5nSWY9XCJzZWxlY3RlZC5jdXN0b21lckRldGFpbFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPkNvbnRhY3Q8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXZcIj57e3NlbGVjdGVkLmN1c3RvbWVyRGV0YWlsPy5uYW1lfX0gwrcge3tzZWxlY3RlZC5jdXN0b21lckRldGFpbD8ucGhvbmVOdW1iZXJ9fSDCtyB7e3NlbGVjdGVkLmN1c3RvbWVyRGV0YWlsPy5lbWFpbH19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQubW9kZSA9PT0gJ0hPTUVfVklTSVQnICYmIHNlbGVjdGVkLmFkZHJlc3NEZXRhaWxzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1rXCI+QWRkcmVzczwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPnt7c2VsZWN0ZWQuYWRkcmVzc0RldGFpbHM/LmFkZHJlc3NMaW5lMX19LCB7e3NlbGVjdGVkLmFkZHJlc3NEZXRhaWxzPy5jaXR5fX0sIHt7c2VsZWN0ZWQuYWRkcmVzc0RldGFpbHM/LnN0YXRlfX0ge3tzZWxlY3RlZC5hZGRyZXNzRGV0YWlscz8uemlwQ29kZX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VydmljZVByaWNlVG90YWwoc2VsZWN0ZWQpID4gMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPlNlcnZpY2UgcHJpY2U8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXZcIj7igrl7e3NlcnZpY2VQcmljZVRvdGFsKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQuaG9tZVZpc2l0Q2hhcmdlXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1rXCI+SG9tZSB2aXNpdCBjaGFyZ2U8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXZcIj7igrl7e3NlbGVjdGVkLmhvbWVWaXNpdENoYXJnZX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPlRvdGFsPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+4oK5e3t0b3RhbER1ZShzZWxlY3RlZCl9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5QYWlkPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+e3twYWlkTGFiZWwoc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCIgKm5nSWY9XCJwZW5kaW5nQW1vdW50KHNlbGVjdGVkKSA+IDBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5QZW5kaW5nIGF0IGFwcG9pbnRtZW50PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+4oK5e3twZW5kaW5nQW1vdW50KHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi12aWRlby1saW5rXCIgKm5nSWY9XCJzZWxlY3RlZC5tb2RlID09PSAnVklERU9fQ0FMTCcgJiYgc2VsZWN0ZWQudmlkZW9DYWxsTGluayAmJiBzZWxlY3RlZC5zdGF0dXMgIT09ICdDQU5DRUxMRUQnXCI+XG4gICAgICAgIDxtYXQtaWNvbj52aWRlb2NhbTwvbWF0LWljb24+XG4gICAgICAgIDxhIFtocmVmXT1cInNlbGVjdGVkLnZpZGVvQ2FsbExpbmtcIiB0YXJnZXQ9XCJfYmxhbmtcIj57e3NlbGVjdGVkLnZpZGVvQ2FsbExpbmt9fTwvYT5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5XCIgKm5nSWY9XCJjYW5SZXNjaGVkdWxlU2VsZWN0ZWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeS10aXRsZVwiPlJlc2NoZWR1bGUgcG9saWN5PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGV4dFwiPllvdSBjYW4gcmVzY2hlZHVsZSB0aGlzIGJvb2tpbmcgdXAgdG8ge3tyZXNjaGVkdWxlQ3V0b2ZmSG91cnN9fSBob3Vye3tyZXNjaGVkdWxlQ3V0b2ZmSG91cnMgPT09IDEgPyAnJyA6ICdzJ319IGJlZm9yZSB0aGUgYXBwb2ludG1lbnQgdGltZS48L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeVwiICpuZ0lmPVwiY2FuQ2FuY2VsU2VsZWN0ZWQgJiYgY2FuY2VsbGF0aW9uUG9saWN5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGl0bGVcIj57e2NhbmNlbGxhdGlvblBvbGljeS50aXRsZX19PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGV4dFwiPnt7Y2FuY2VsbGF0aW9uUG9saWN5LnBvbGljeURldGFpbHN9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1hY3Rpb25zLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQuc3RhdHVzID09PSAnQk9PS0VEJyB8fCBjYW5DYW5jZWxTZWxlY3RlZFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaGVkdWxlLWJ0blwiXG4gICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZC5zdGF0dXMgPT09ICdCT09LRUQnXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWNhblJlc2NoZWR1bGVTZWxlY3RlZFwiXG4gICAgICAgICAgW3RpdGxlXT1cIiFjYW5SZXNjaGVkdWxlU2VsZWN0ZWQgPyBzZWxlY3RlZC5yZXNjaGVkdWxlQmxvY2tlZFJlYXNvbiA6ICcnXCJcbiAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIChjbGljayk9XCJvcGVuUmVzY2hlZHVsZVBhbmVsKClcIlxuICAgICAgICA+UmVzY2hlZHVsZSBib29raW5nPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cIm1iLXJlc2NoZWR1bGUtYnRuXCJcbiAgICAgICAgICAqbmdJZj1cImNhbkFkZFNlcnZpY2VTZWxlY3RlZFwiXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkFkZFNlcnZpY2VQYW5lbCgpXCJcbiAgICAgICAgPkFkZCBzZXJ2aWNlPC9idXR0b24+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBjbGFzcz1cIm1iLWNhbmNlbC1idG5cIlxuICAgICAgICAgICpuZ0lmPVwiY2FuQ2FuY2VsU2VsZWN0ZWRcIlxuICAgICAgICAgIFtkaXNhYmxlZF09XCJjYW5jZWxsaW5nXCJcbiAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIChjbGljayk9XCJvcGVuQ2FuY2VsQ29uZmlybSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7Y2FuY2VsbGluZyA/ICdDYW5jZWxsaW5n4oCmJyA6ICdDYW5jZWwgYm9va2luZyd9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItY2FuY2VsbGVkLW5vdGVcIiAqbmdJZj1cInNlbGVjdGVkLnN0YXR1cyA9PT0gJ0NBTkNFTExFRCdcIj5UaGlzIGJvb2tpbmcgaGFzIGJlZW4gY2FuY2VsbGVkLjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cblxuICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtYmFja2Ryb3BcIiAqbmdJZj1cInJlc2NoZWR1bGVQYW5lbE9wZW5cIiAoY2xpY2spPVwiY2xvc2VSZXNjaGVkdWxlUGFuZWwoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1wYW5lbFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXRpdGxlXCI+Q2hvb3NlIGEgbmV3IGRhdGUgJmFtcDsgdGltZTwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXJlc2NoLWNsb3NlXCIgKGNsaWNrKT1cImNsb3NlUmVzY2hlZHVsZVBhbmVsKClcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWJvZHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWRheXN0cmlwLXJvd1wiPlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtbmF2XCIgKGNsaWNrKT1cInNjcm9sbFJlc2NoRGF5cygtMSlcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCIgc3Ryb2tlLXdpZHRoPVwiMi4yXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCI+PHBhdGggZD1cIk0xNSAxOGwtNi02IDYtNlwiPjwvcGF0aD48L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtZGF5c3RyaXBcIiAjcmVzY2hEYXlTdHJpcD5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibWItcmVzY2gtZGF5XCJcbiAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGRheSBvZiByZXNjaERheXNcIlxuICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImRheS5pc28gPT09IHJlc2NoU2VsZWN0ZWRJc29cIlxuICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJkYXkuaXNvID09PSByZXNjaFNlbGVjdGVkSXNvID8gc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6IG51bGxcIlxuICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwiZGF5LmlzbyA9PT0gcmVzY2hTZWxlY3RlZElzbyA/IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiBudWxsXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFJlc2NoRGF5KGRheSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1iLXJlc2NoLWRheS1kb3dcIiBbc3R5bGUuY29sb3JdPVwiZGF5LmlzbyA9PT0gcmVzY2hTZWxlY3RlZElzbyA/IGNvbnRyYXN0Q29sb3IgOiBudWxsXCI+e3tkYXkuZG93fX08L3NwYW4+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWItcmVzY2gtZGF5LW51bVwiIFtzdHlsZS5jb2xvcl09XCJkYXkuaXNvID09PSByZXNjaFNlbGVjdGVkSXNvID8gY29udHJhc3RDb2xvciA6IG51bGxcIj57e2RheS5udW19fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtbmF2XCIgKGNsaWNrKT1cInNjcm9sbFJlc2NoRGF5cygxKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTkgMThsNi02LTYtNlwiPjwvcGF0aD48L3N2Zz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXNsb3RzLWxvYWRpbmdcIiAqbmdJZj1cInJlc2NoTG9hZGluZ1Nsb3RzXCI+TG9hZGluZyBhdmFpbGFibGUgdGltZXPigKY8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXNsb3RzLWVtcHR5XCIgKm5nSWY9XCIhcmVzY2hMb2FkaW5nU2xvdHMgJiYgcmVzY2hOb1Nsb3RzXCI+Tm8gc2xvdHMgYXZhaWxhYmxlIG9uIHRoaXMgZGF0ZS4gVHJ5IGFub3RoZXIgZGF0ZS48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXNsb3RzXCIgKm5nSWY9XCIhcmVzY2hMb2FkaW5nU2xvdHMgJiYgcmVzY2hTbG90cy5sZW5ndGhcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibWItcmVzY2gtc2xvdFwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2xvdCBvZiByZXNjaFNsb3RzXCJcbiAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwic2xvdCA9PT0gcmVzY2hTZWxlY3RlZFRpbWVcIlxuICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwic2xvdCA9PT0gcmVzY2hTZWxlY3RlZFRpbWUgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogbnVsbFwiXG4gICAgICAgICAgICBbc3R5bGUuYm9yZGVyQ29sb3JdPVwic2xvdCA9PT0gcmVzY2hTZWxlY3RlZFRpbWUgPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogbnVsbFwiXG4gICAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic2xvdCA9PT0gcmVzY2hTZWxlY3RlZFRpbWUgPyBjb250cmFzdENvbG9yIDogbnVsbFwiXG4gICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UmVzY2hUaW1lKHNsb3QpXCJcbiAgICAgICAgICA+e3tzbG90fX08L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWVycm9yXCIgKm5nSWY9XCJyZXNjaEVycm9yXCI+e3tyZXNjaEVycm9yfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtZm9vdGVyXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtY2FuY2VsXCIgKGNsaWNrKT1cImNsb3NlUmVzY2hlZHVsZVBhbmVsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwibWItcmVzY2gtY29uZmlybVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cInJlc2NoSW52YWxpZFwiXG4gICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwicmVzY2hJbnZhbGlkID8gbnVsbCA6IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJyZXNjaEludmFsaWQgPyBudWxsIDogY29udHJhc3RDb2xvclwiXG4gICAgICAgICAgKGNsaWNrKT1cImNvbmZpcm1SZXNjaGVkdWxlKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3tyZXNjaENvbmZpcm1pbmcgPyAnQ29uZmlybWluZ+KApicgOiAnQ29uZmlybSBuZXcgc2xvdCd9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtYmFja2Ryb3BcIiAqbmdJZj1cImNhbmNlbENvbmZpcm1PcGVuXCIgKGNsaWNrKT1cImNsb3NlQ2FuY2VsQ29uZmlybSgpXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXBhbmVsXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtdGl0bGVcIj5DYW5jZWwgdGhpcyBib29raW5nPzwvZGl2PlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXJlc2NoLWNsb3NlXCIgKGNsaWNrKT1cImNsb3NlQ2FuY2VsQ29uZmlybSgpXCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtYm9keVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRleHRcIj5UaGlzIGNhbid0IGJlIHVuZG9uZS48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeVwiICpuZ0lmPVwiY2FuY2VsbGF0aW9uUG9saWN5XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeS10aXRsZVwiPnt7Y2FuY2VsbGF0aW9uUG9saWN5LnRpdGxlfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRleHRcIj57e2NhbmNlbGxhdGlvblBvbGljeS5wb2xpY3lEZXRhaWxzfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1mb290ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1jYW5jZWxcIiAoY2xpY2spPVwiY2xvc2VDYW5jZWxDb25maXJtKClcIj5LZWVwIGJvb2tpbmc8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1jb25maXJtXCIgW2Rpc2FibGVkXT1cImNhbmNlbGxpbmdcIiAoY2xpY2spPVwiY2FuY2VsQm9va2luZygpXCI+XG4gICAgICAgICAge3tjYW5jZWxsaW5nID8gJ0NhbmNlbGxpbmfigKYnIDogJ1llcywgY2FuY2VsIGJvb2tpbmcnfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWJhY2tkcm9wXCIgKm5nSWY9XCJhZGRTZXJ2aWNlUGFuZWxPcGVuXCIgKGNsaWNrKT1cImNsb3NlQWRkU2VydmljZVBhbmVsKClcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtcGFuZWxcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC10aXRsZVwiPkFkZCBzZXJ2aWNlKHMpPC9kaXY+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VBZGRTZXJ2aWNlUGFuZWwoKVwiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtYm9keVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtc2xvdHMtbG9hZGluZ1wiICpuZ0lmPVwiYWRkU2VydmljZUxvYWRpbmdcIj5Mb2FkaW5nIHNlcnZpY2Vz4oCmPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1zbG90cy1lbXB0eVwiICpuZ0lmPVwiIWFkZFNlcnZpY2VMb2FkaW5nICYmIGFkZFNlcnZpY2VPcHRpb25zLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgIE5vIHNlcnZpY2VzIGF2YWlsYWJsZSB0byBhZGQgcmlnaHQgbm93LlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItYWRkc3ZjLWxpc3RcIiAqbmdJZj1cIiFhZGRTZXJ2aWNlTG9hZGluZyAmJiBhZGRTZXJ2aWNlT3B0aW9ucy5sZW5ndGhcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwibWItYWRkc3ZjLXJvd1wiXG4gICAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiaXNBZGRTZXJ2aWNlU2VsZWN0ZWQoc2VydmljZSlcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHNlcnZpY2Ugb2YgYWRkU2VydmljZU9wdGlvbnNcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImFkZFNlcnZpY2VTdWJtaXR0aW5nXCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBZGRTZXJ2aWNlKHNlcnZpY2UpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJtYi1hZGRzdmMtY2hlY2tib3hcIiBbY2hlY2tlZF09XCJpc0FkZFNlcnZpY2VTZWxlY3RlZChzZXJ2aWNlKVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIiAoY2hhbmdlKT1cInRvZ2dsZUFkZFNlcnZpY2Uoc2VydmljZSlcIiAvPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImYxXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1hZGRzdmMtbmFtZVwiPlxuICAgICAgICAgICAgICAgIHt7c2VydmljZS5uYW1lfX1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1iLWFkZHN2Yy1tZXRhXCIgKm5nSWY9XCJzZXJ2aWNlLmR1cmF0aW9uXCI+e3tzZXJ2aWNlLmR1cmF0aW9ufX0gbWluPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWFkZHN2Yy1wcmljZVwiICpuZ0lmPVwic2VydmljZS5wcmljZURldGFpbHM/LnRvdGFsUHJpY2VcIj7igrl7e3NlcnZpY2UucHJpY2VEZXRhaWxzLnRvdGFsUHJpY2V9fTwvZGl2PlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItYWRkc3ZjLXRvdGFsXCIgKm5nSWY9XCJhZGRTZXJ2aWNlU2VsZWN0ZWQubGVuZ3RoICYmIGFkZFNlcnZpY2VUb3RhbERlcG9zaXQgPiAwXCI+XG4gICAgICAgICAgRGVwb3NpdCBkdWUgbm93OiDigrl7e2FkZFNlcnZpY2VUb3RhbERlcG9zaXR9fVxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtZXJyb3JcIiAqbmdJZj1cImFkZFNlcnZpY2VFcnJvclwiPnt7YWRkU2VydmljZUVycm9yfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtZm9vdGVyXCIgKm5nSWY9XCIhYWRkU2VydmljZUxvYWRpbmcgJiYgYWRkU2VydmljZU9wdGlvbnMubGVuZ3RoXCI+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtY2FuY2VsXCIgKGNsaWNrKT1cImNsb3NlQWRkU2VydmljZVBhbmVsKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwibWItcmVzY2gtY29uZmlybVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFhZGRTZXJ2aWNlU2VsZWN0ZWQubGVuZ3RoIHx8IGFkZFNlcnZpY2VTdWJtaXR0aW5nXCJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCIhYWRkU2VydmljZVNlbGVjdGVkLmxlbmd0aCA/IG51bGwgOiBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwiIWFkZFNlcnZpY2VTZWxlY3RlZC5sZW5ndGggPyBudWxsIDogY29udHJhc3RDb2xvclwiXG4gICAgICAgICAgKGNsaWNrKT1cImFkZFNlcnZpY2UoKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7e2FkZFNlcnZpY2VTdWJtaXR0aW5nID8gJ0FkZGluZ+KApicgOiAnQWRkICcgKyAoYWRkU2VydmljZVNlbGVjdGVkLmxlbmd0aCB8fCAnJykgKyAnIHNlcnZpY2UnICsgKGFkZFNlcnZpY2VTZWxlY3RlZC5sZW5ndGggPT09IDEgPyAnJyA6ICdzJyl9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19
|