simpo-component-library 3.6.530 → 3.6.532

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.
Files changed (233) hide show
  1. package/README.md +24 -24
  2. package/esm2022/lib/components/delete-hover-element/delete-hover-element.component.mjs +3 -3
  3. package/esm2022/lib/components/document/document.component.mjs +3 -3
  4. package/esm2022/lib/components/image-loading/image-loading.component.mjs +3 -3
  5. package/esm2022/lib/components/payment-details/payment-details.component.mjs +3 -3
  6. package/esm2022/lib/constants/business.constant.mjs +1 -1
  7. package/esm2022/lib/directive/alignment.directive.mjs +1 -1
  8. package/esm2022/lib/directive/blur-content.directive.mjs +1 -1
  9. package/esm2022/lib/directive/borderlessImage.directive.mjs +1 -1
  10. package/esm2022/lib/directive/button-directive.directive.mjs +1 -1
  11. package/esm2022/lib/directive/button-editor.directive.mjs +1 -1
  12. package/esm2022/lib/directive/color.directive.mjs +1 -1
  13. package/esm2022/lib/directive/column-directive.directive.mjs +1 -1
  14. package/esm2022/lib/directive/container-alignment.directive.mjs +1 -1
  15. package/esm2022/lib/directive/container-fir.directive.mjs +1 -1
  16. package/esm2022/lib/directive/content-title-spacing.directive.mjs +1 -1
  17. package/esm2022/lib/directive/contenteditable.directive.mjs +1 -1
  18. package/esm2022/lib/directive/corner-directive.mjs +1 -1
  19. package/esm2022/lib/directive/height.directive.mjs +1 -1
  20. package/esm2022/lib/directive/hover-animation.directive.mjs +1 -1
  21. package/esm2022/lib/directive/hoverborder.directive.mjs +1 -1
  22. package/esm2022/lib/directive/icon-directive.directive.mjs +1 -1
  23. package/esm2022/lib/directive/image-container.directive.mjs +1 -1
  24. package/esm2022/lib/directive/image-directive.directive.mjs +1 -1
  25. package/esm2022/lib/directive/image-editor.directive.mjs +1 -1
  26. package/esm2022/lib/directive/image-position.directive.mjs +1 -1
  27. package/esm2022/lib/directive/letters-only.directive.mjs +1 -1
  28. package/esm2022/lib/directive/merge-header.directive.mjs +1 -1
  29. package/esm2022/lib/directive/numbers-only.directive.mjs +1 -1
  30. package/esm2022/lib/directive/position-layout-directive.directive.mjs +1 -1
  31. package/esm2022/lib/directive/set-dynamic-background.directive.mjs +1 -1
  32. package/esm2022/lib/directive/spacing-around.directive.mjs +1 -1
  33. package/esm2022/lib/directive/spacing-horizontal.directive.mjs +1 -1
  34. package/esm2022/lib/directive/spacing.directive.mjs +1 -1
  35. package/esm2022/lib/directive/sticky-directive.mjs +1 -1
  36. package/esm2022/lib/directive/text-background-directive.directive.mjs +1 -1
  37. package/esm2022/lib/directive/text-size.directive.mjs +1 -1
  38. package/esm2022/lib/directive/translate-onhover.directive.mjs +1 -1
  39. package/esm2022/lib/directive/wrap-containers.directive.mjs +1 -1
  40. package/esm2022/lib/ecommerce/sections/address/address.component.mjs +3 -3
  41. package/esm2022/lib/ecommerce/sections/authenticate-user/authenticate-user.component.mjs +3 -3
  42. package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.component.mjs +3 -3
  43. package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.model.mjs +1 -1
  44. package/esm2022/lib/ecommerce/sections/book-appointment/book-appointment.component.mjs +3 -3
  45. package/esm2022/lib/ecommerce/sections/book-appointment/book-appointment.model.mjs +1 -1
  46. package/esm2022/lib/ecommerce/sections/cart/cart.component.mjs +3 -3
  47. package/esm2022/lib/ecommerce/sections/cart/cart.modal.mjs +1 -1
  48. package/esm2022/lib/ecommerce/sections/category-product/category-product.component.mjs +3 -3
  49. package/esm2022/lib/ecommerce/sections/category-product/category-product.model.mjs +1 -1
  50. package/esm2022/lib/ecommerce/sections/checkout/checkout.component.mjs +3 -3
  51. package/esm2022/lib/ecommerce/sections/checkout/checkout.modal.mjs +1 -1
  52. package/esm2022/lib/ecommerce/sections/customer-review/customer-review.component.mjs +3 -3
  53. package/esm2022/lib/ecommerce/sections/customer-review/customer-review.model.mjs +1 -1
  54. package/esm2022/lib/ecommerce/sections/enrollment-form/enrollment-form.component.mjs +3 -3
  55. package/esm2022/lib/ecommerce/sections/enrollment-form/enrollment-form.model.mjs +1 -1
  56. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.component.mjs +3 -3
  57. package/esm2022/lib/ecommerce/sections/featured-category/featured-category.modal.mjs +1 -1
  58. package/esm2022/lib/ecommerce/sections/featured-category/featured-collection.component.mjs +3 -3
  59. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +4 -4
  60. package/esm2022/lib/ecommerce/sections/featured-products/featured-products.modal.mjs +1 -1
  61. package/esm2022/lib/ecommerce/sections/item-varient/item-varient.component.mjs +3 -3
  62. package/esm2022/lib/ecommerce/sections/new-collection/new-collection.component.mjs +3 -3
  63. package/esm2022/lib/ecommerce/sections/new-collection/new-collection.modal.mjs +1 -1
  64. package/esm2022/lib/ecommerce/sections/order-details/order-details.component.mjs +3 -3
  65. package/esm2022/lib/ecommerce/sections/pagnination/pagnination.component.mjs +3 -3
  66. package/esm2022/lib/ecommerce/sections/passbook-transactions/passbook-transactions.component.mjs +3 -3
  67. package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.component.mjs +3 -3
  68. package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.model.mjs +1 -1
  69. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.component.mjs +3 -3
  70. package/esm2022/lib/ecommerce/sections/product-desc/product-desc.modal.mjs +1 -1
  71. package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +3 -3
  72. package/esm2022/lib/ecommerce/sections/product-list/product-list.modal.mjs +1 -1
  73. package/esm2022/lib/ecommerce/sections/returns-calculator/returns-calculator.component.mjs +3 -3
  74. package/esm2022/lib/ecommerce/sections/returns-calculator/returns-calculator.model.mjs +1 -1
  75. package/esm2022/lib/ecommerce/sections/scheme-details/scheme-details.component.mjs +3 -3
  76. package/esm2022/lib/ecommerce/sections/scheme-selection/scheme-selection.component.mjs +3 -3
  77. package/esm2022/lib/ecommerce/sections/schemes/schemes.component.mjs +3 -3
  78. package/esm2022/lib/ecommerce/sections/schemes/schemes.component.model.mjs +1 -1
  79. package/esm2022/lib/ecommerce/sections/small-product-listing/small-product-listing.component.mjs +3 -3
  80. package/esm2022/lib/ecommerce/sections/store-list/store-list.component.mjs +3 -3
  81. package/esm2022/lib/ecommerce/sections/store-list/store-list.modal.mjs +1 -1
  82. package/esm2022/lib/ecommerce/sections/store-page/store-page.component.mjs +3 -3
  83. package/esm2022/lib/ecommerce/sections/store-page/store-page.model.mjs +1 -1
  84. package/esm2022/lib/ecommerce/sections/user-basic-info/user-basic-info.component.mjs +3 -3
  85. package/esm2022/lib/ecommerce/sections/user-profile/user-profile.component.mjs +3 -3
  86. package/esm2022/lib/ecommerce/sections/user-profile/user-profile.modal.mjs +1 -1
  87. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.component.mjs +3 -3
  88. package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.model.mjs +1 -1
  89. package/esm2022/lib/ecommerce/sections/whislist/whislist.component.mjs +3 -3
  90. package/esm2022/lib/ecommerce/styles/BaseCollection.modal.mjs +1 -1
  91. package/esm2022/lib/ecommerce/styles/Collection.modal.mjs +1 -1
  92. package/esm2022/lib/ecommerce/styles/OrderedItems.modal.mjs +1 -1
  93. package/esm2022/lib/ecommerce/styles/PincodeLocation.model.mjs +1 -1
  94. package/esm2022/lib/ecommerce/styles/PincodeLocationInter.model.mjs +1 -1
  95. package/esm2022/lib/ecommerce/styles/cart.modal.mjs +1 -1
  96. package/esm2022/lib/ecommerce/styles/category.modal.mjs +1 -1
  97. package/esm2022/lib/ecommerce/styles/order.modal.mjs +1 -1
  98. package/esm2022/lib/ecommerce/styles/product.modal.mjs +1 -1
  99. package/esm2022/lib/ecommerce/styles/review.modal.mjs +1 -1
  100. package/esm2022/lib/ecommerce/styles/user.modal.mjs +1 -1
  101. package/esm2022/lib/elements/add-section/add-section.component.mjs +3 -3
  102. package/esm2022/lib/elements/address-list/address-list.component.mjs +3 -3
  103. package/esm2022/lib/elements/below-image-card/below-image-card.component.mjs +3 -3
  104. package/esm2022/lib/elements/button/button.component.mjs +3 -3
  105. package/esm2022/lib/elements/button/button.model.mjs +1 -1
  106. package/esm2022/lib/elements/card-skeleton-loader/card-skeleton-loader.component.mjs +3 -3
  107. package/esm2022/lib/elements/covering-image-card/covering-image-card.component.mjs +3 -3
  108. package/esm2022/lib/elements/editor-service.service.mjs +1 -1
  109. package/esm2022/lib/elements/heading-element/heading-element.component.mjs +3 -3
  110. package/esm2022/lib/elements/image-editor/image-editor.component.mjs +3 -3
  111. package/esm2022/lib/elements/index.mjs +1 -1
  112. package/esm2022/lib/elements/link-editor/link-editor.component.mjs +5 -4
  113. package/esm2022/lib/elements/list-home-appointment/list-home-appointment.component.mjs +3 -3
  114. package/esm2022/lib/elements/media-selector/media-selector.component.mjs +3 -3
  115. package/esm2022/lib/elements/portfolio/portfolio.component.mjs +3 -3
  116. package/esm2022/lib/elements/pricing-s1/pricing-s1.component.mjs +3 -3
  117. package/esm2022/lib/elements/property/property.component.mjs +3 -3
  118. package/esm2022/lib/elements/schedule-video-call/schedule-video-call.component.mjs +3 -3
  119. package/esm2022/lib/elements/simpo-button/simpo-button.component.mjs +3 -3
  120. package/esm2022/lib/elements/svg-divider/svg-divider.component.mjs +3 -3
  121. package/esm2022/lib/elements/text/text.component.mjs +3 -3
  122. package/esm2022/lib/elements/text-editor/text-editor.component.mjs +3 -3
  123. package/esm2022/lib/elements/top-of-image-card/top-of-image-card.component.mjs +3 -3
  124. package/esm2022/lib/pipes/amount.pipe.mjs +1 -1
  125. package/esm2022/lib/pipes/gender.pipe.mjs +1 -1
  126. package/esm2022/lib/sections/BaseSection.mjs +1 -1
  127. package/esm2022/lib/sections/add-new-section/add-new-section.component.mjs +3 -3
  128. package/esm2022/lib/sections/appointment-form/appointment-booking/appointment-booking/appointment-booking.component.mjs +3 -3
  129. package/esm2022/lib/sections/appointment-form/appointment-form.component.mjs +3 -3
  130. package/esm2022/lib/sections/appointment-form/appointment-form.model.mjs +1 -1
  131. package/esm2022/lib/sections/banner-carousel/banner-carousel.component.mjs +3 -3
  132. package/esm2022/lib/sections/banner-carousel/banner-carousel.model.mjs +1 -1
  133. package/esm2022/lib/sections/banner-grid-section/banner-grid-section.component.mjs +3 -3
  134. package/esm2022/lib/sections/blog-list/blog-list.component.mjs +3 -3
  135. package/esm2022/lib/sections/blog-list/blog-list.model.mjs +1 -1
  136. package/esm2022/lib/sections/choose-us-section/choose-us-section.component.mjs +3 -3
  137. package/esm2022/lib/sections/choose-us-section/choose-us-section.model.mjs +1 -1
  138. package/esm2022/lib/sections/faq-section/faq-section.component.mjs +3 -3
  139. package/esm2022/lib/sections/faq-section/faq-section.modal.mjs +1 -1
  140. package/esm2022/lib/sections/features-section/features-section.component.mjs +3 -3
  141. package/esm2022/lib/sections/features-section/features-section.model.mjs +1 -1
  142. package/esm2022/lib/sections/footer/footer.component.mjs +3 -3
  143. package/esm2022/lib/sections/footer/footer.modal.mjs +1 -1
  144. package/esm2022/lib/sections/header-section/header-section.component.mjs +3 -3
  145. package/esm2022/lib/sections/header-section/header-section.model.mjs +1 -1
  146. package/esm2022/lib/sections/header-text/header-text.component.mjs +3 -3
  147. package/esm2022/lib/sections/header-text/header-text.model.mjs +1 -1
  148. package/esm2022/lib/sections/image-carousel-section/image-carousel-section.component.mjs +3 -3
  149. package/esm2022/lib/sections/image-carousel-section/image-carousel.model.mjs +1 -1
  150. package/esm2022/lib/sections/image-grid-section/image-grid-section.component.mjs +3 -3
  151. package/esm2022/lib/sections/image-grid-section/image-grid-section.model.mjs +1 -1
  152. package/esm2022/lib/sections/image-section/image-section.component.mjs +3 -3
  153. package/esm2022/lib/sections/image-section/image-section.model.mjs +1 -1
  154. package/esm2022/lib/sections/location-section/location-section.component.mjs +3 -3
  155. package/esm2022/lib/sections/location-section/location-section.modal.mjs +1 -1
  156. package/esm2022/lib/sections/logo-gallery/logo-gallery.component.mjs +3 -3
  157. package/esm2022/lib/sections/logo-showcase/logo-showcase.component.mjs +3 -3
  158. package/esm2022/lib/sections/logo-showcase/logo-showcase.modal.mjs +1 -1
  159. package/esm2022/lib/sections/moving-text/moving-text.component.mjs +3 -3
  160. package/esm2022/lib/sections/moving-text/moving-text.modal.mjs +1 -1
  161. package/esm2022/lib/sections/new-services/new-services.component.mjs +3 -3
  162. package/esm2022/lib/sections/new-services/new-services.model.mjs +1 -1
  163. package/esm2022/lib/sections/new-testimonials/new-testimonials.component.mjs +3 -3
  164. package/esm2022/lib/sections/new-testimonials/new-testimonials.model.mjs +1 -1
  165. package/esm2022/lib/sections/news-letter-component/news-letter-component.component.mjs +3 -3
  166. package/esm2022/lib/sections/news-letter-component/news-letter.modal.mjs +1 -1
  167. package/esm2022/lib/sections/pricing-section/pricing-section.component.mjs +3 -3
  168. package/esm2022/lib/sections/pricing-section/pricing-section.modal.mjs +1 -1
  169. package/esm2022/lib/sections/process-modern/process-modern.component.mjs +3 -3
  170. package/esm2022/lib/sections/process-modern/process-modern.model.mjs +1 -1
  171. package/esm2022/lib/sections/process-section/process-section.component.mjs +3 -3
  172. package/esm2022/lib/sections/process-section/process-section.modal.mjs +1 -1
  173. package/esm2022/lib/sections/property-component/property-component.component.mjs +3 -3
  174. package/esm2022/lib/sections/property-component/property-component.modal.mjs +1 -1
  175. package/esm2022/lib/sections/property-list/property-list.component.mjs +3 -3
  176. package/esm2022/lib/sections/property-list/property-list.modal.mjs +1 -1
  177. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.component.mjs +3 -3
  178. package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.model.mjs +1 -1
  179. package/esm2022/lib/sections/registration-form/registration-form.component.mjs +3 -3
  180. package/esm2022/lib/sections/registration-form/registrationForm.model.mjs +1 -1
  181. package/esm2022/lib/sections/scheme-detail/scheme-detail.component.mjs +3 -3
  182. package/esm2022/lib/sections/scheme-detail/scheme-detail.modal.mjs +1 -1
  183. package/esm2022/lib/sections/service-section/service-section.component.mjs +3 -3
  184. package/esm2022/lib/sections/service-section/service-section.model.mjs +1 -1
  185. package/esm2022/lib/sections/skeleton-loader-section/skeleton-loader-section.component.mjs +3 -3
  186. package/esm2022/lib/sections/team-member-section/team-member-section.component.mjs +3 -3
  187. package/esm2022/lib/sections/team-member-section/team-member-section.model.mjs +1 -1
  188. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +3 -3
  189. package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.model.mjs +1 -1
  190. package/esm2022/lib/sections/testimonial-section/testimonial-section.component.mjs +3 -3
  191. package/esm2022/lib/sections/testimonial-section/testimonial-section.model.mjs +1 -1
  192. package/esm2022/lib/sections/testimonial-video/testimonial-video.component.mjs +3 -3
  193. package/esm2022/lib/sections/testimonial-video/testimonial-video.model.mjs +1 -1
  194. package/esm2022/lib/sections/text-section/text-section.model.mjs +1 -1
  195. package/esm2022/lib/sections/usp-video-section/usp-video-section.component.mjs +3 -3
  196. package/esm2022/lib/sections/usp-video-section/usp-video-section.model.mjs +1 -1
  197. package/esm2022/lib/sections/video-section/video-section.component.mjs +3 -3
  198. package/esm2022/lib/sections/video-section/video-section.model.mjs +1 -1
  199. package/esm2022/lib/sections/view-blog/view-blog.component.mjs +3 -3
  200. package/esm2022/lib/services/cart.service.mjs +1 -1
  201. package/esm2022/lib/services/endUser.service.mjs +1 -1
  202. package/esm2022/lib/services/image-upload-service.service.mjs +1 -1
  203. package/esm2022/lib/services/rest.service.mjs +2 -2
  204. package/esm2022/lib/services/sanitizeHtml.mjs +1 -1
  205. package/esm2022/lib/services/storage.service.mjs +1 -1
  206. package/esm2022/lib/styles/index.mjs +1 -1
  207. package/esm2022/lib/styles/style.model.mjs +1 -1
  208. package/esm2022/lib/styles/types.mjs +1 -1
  209. package/esm2022/lib/tokens/api-token.mjs +1 -1
  210. package/esm2022/public-api.mjs +1 -1
  211. package/fesm2022/simpo-component-library.mjs +188 -187
  212. package/fesm2022/simpo-component-library.mjs.map +1 -1
  213. package/lib/directive/background-directive.d.ts +1 -1
  214. package/lib/directive/button-directive.directive.d.ts +1 -1
  215. package/lib/directive/color.directive.d.ts +1 -1
  216. package/lib/ecommerce/sections/featured-category/featured-category.component.d.ts +1 -1
  217. package/lib/ecommerce/sections/featured-category/featured-collection.component.d.ts +1 -1
  218. package/lib/ecommerce/sections/new-collection/new-collection.component.d.ts +2 -2
  219. package/lib/ecommerce/sections/product-desc/product-desc.component.d.ts +1 -1
  220. package/lib/ecommerce/sections/product-list/product-list.component.d.ts +1 -1
  221. package/lib/ecommerce/sections/store-list/store-list.component.d.ts +1 -1
  222. package/lib/ecommerce/sections/store-page/store-page.component.d.ts +1 -1
  223. package/lib/elements/link-editor/link-editor.component.d.ts +1 -1
  224. package/lib/sections/banner-grid-section/banner-grid-section.component.d.ts +1 -1
  225. package/lib/sections/contact-us/contact-us.component.d.ts +1 -1
  226. package/lib/sections/header-section/header-section.component.d.ts +1 -1
  227. package/lib/sections/image-grid-section/image-grid-section.component.d.ts +1 -1
  228. package/lib/sections/moving-text/moving-text.component.d.ts +1 -1
  229. package/lib/sections/pricing-section/pricing-section.component.d.ts +1 -1
  230. package/package.json +1 -1
  231. package/simpo-component-library-3.6.532.tgz +0 -0
  232. package/src/lib/styles/global-styles.css +279 -279
  233. package/simpo-component-library-3.6.530.tgz +0 -0
@@ -468,11 +468,11 @@ export class AppointmentBookingComponent {
468
468
  }
469
469
  }
470
470
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppointmentBookingComponent, deps: [{ token: i1.RestService }, { token: i2.EventsService }, { token: i3.Router }, { token: i4.MessageService }], target: i0.ɵɵFactoryTarget.Component }); }
471
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AppointmentBookingComponent, isStandalone: true, selector: "simpo-appointment-booking", inputs: { data: "data", index: "index", edit: "edit", delete: "delete", customClass: "customClass", nextComponentColor: "nextComponentColor" }, host: { listeners: { "window: resize": "getScreenSize($event)", "document:click": "closeOnOutsideClick()" } }, providers: [MessageService], ngImport: i0, template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\n [showTransformOptions]=\"screenWidth < 475 ? 'translateY(-100%)' : ''\"></p-toast>\n<section class=\"main_section\">\n <div class=\"main_header\">\n <div class=\"header d-flex justify-content-between align-items-center\">\n <div class=\"back-btn d-flex justify-content-center align-items-center cursor-pointer gap-2 mb-3\"\n (click)=\"goBack()\">\n <mat-icon>keyboard_backspace</mat-icon><span *ngIf=\"screenWidth > 475\">Back to Home</span>\n </div>\n <div class=\"header-title\">\n <h1>Book New Appointment</h1>\n <p>{{businessName ?? \"N/A\" }}</p>\n </div>\n </div>\n\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" [style.width]=\"barWidth + '%'\"></div>\n </div>\n </div>\n <div class=\"main_body w-100 d-flex justify-content-center\"><ng-container *ngIf=\"selectedTab === 'serviceListing'\">\n <ng-container *ngIf=\"!skeletonLoader\">\n <ng-container *ngTemplateOutlet=\"serviceListing\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab === 'locationListing'\">\n <ng-container *ngTemplateOutlet=\"locationListing\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab === 'staffListing'\">\n <ng-container *ngTemplateOutlet=\"staffListing\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab === 'dateSelection'\">\n <ng-container *ngTemplateOutlet=\"dateSelection\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab==='contactDetails'\">\n <ng-container *ngTemplateOutlet=\"contactDetails\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab==='paymentTab'\">\n <ng-container *ngTemplateOutlet=\"paymentTab\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab==='statusTemplate'\">\n <ng-container *ngTemplateOutlet=\"statusTemplate\"></ng-container>\n </ng-container>\n </div>\n <div class=\"main_footer d-flex justify-content-center align-items-center\" *ngIf=\"selectedTab!=='statusTemplate'\">\n <div class=\"footer-buttons\"\n [ngStyle]=\"{'justify-content': selectedTab != 'serviceListing' ? 'space-between' : 'end'}\">\n <span class=\"back-footer-btn cursor-pointer\" (click)=\"previousStep()\"\n *ngIf=\"selectedTab != 'serviceListing'\">Back</span>\n <button class=\"continue-btn\" [disabled]=\"!activeButton\" (click)=\"nextStep()\"\n *ngIf=\"selectedTab!='paymentTab'\">{{!loader ? 'Continue' : 'Loading...'}}</button>\n <button class=\"cursor-pointer d-flex justify-content-evenly align-items-center\"\n *ngIf=\"selectedTab==='paymentTab'\" (click)=\"checkPayment()\" [disabled]=\"isProcessing\"\n [ngClass]=\"{'pay-now-btn' : selectedService?.depositAmount?.depositRequired,'complete_booking' : !selectedService?.depositAmount?.depositRequired}\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/304012c1753440087996Background.png\">\n {{selectedService?.depositAmount?.depositRequired ? 'Pay Now' : 'Complete Booking'}}\n </button>\n </div>\n </div>\n</section>\n<ng-template #serviceListing>\n <div class=\"w-60 service_section\">\n <div class=\"service-selection\">\n <h2>Select a Service</h2>\n <p>Choose the service you'd like to book</p>\n\n <div class=\"services-grid\">\n <ng-container *ngFor=\"let service of serviceData\">\n <div class=\"\" (click)=\"selectService(service)\"\n [ngClass]=\"{ 'service-card-selected' : service?.selected, 'service-card': !service?.selected }\">\n <div class=\" service-header\">\n <div class=\"service-icon\"><mat-icon>person_outline</mat-icon></div>\n <div class=\"service-info\">\n <div class=\"service-title\">{{service?.name ? service?.name : 'N/A'}}</div>\n </div>\n <div>\n <div class=\"service-price\">\u20B9{{service?.priceDetails?.price ?\n service?.priceDetails?.price : 'N/A' }}</div>\n <div class=\"service-duration\">{{service?.duration ? service?.duration : 'N/A'}} min\n </div>\n </div>\n </div>\n <div class=\"service-description\" *ngIf=\"service?.description\">\n {{service?.description ? service?.description : 'N/A'}}\n </div>\n <div class=\"home-visit\" *ngIf=\"service?.homeAppointmentAvailable\"><img\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/982126c1758628863129furniture_16406103.png\">Home\n Visit Available</div>\n </div>\n </ng-container>\n\n <!-- <div class=\"service-card\">\n <div class=\"service-header\">\n <div class=\"service-icon\">\uD83D\uDC64</div>\n <div class=\"service-info\">\n <div class=\"service-title\">General Consultation</div>\n <div class=\"service-category\">Medical</div>\n </div>\n <div>\n <div class=\"service-price\">\u20B9800</div>\n <div class=\"service-duration\">30 min</div>\n </div>\n </div>\n <div class=\"service-description\">\n Comprehensive health consultation\n </div>\n </div>\n\n <div class=\"service-card\">\n <div class=\"service-header\">\n <div class=\"service-icon\">\uD83E\uDDE0</div>\n <div class=\"service-info\">\n <div class=\"service-title\">Mental Health Counseling</div>\n <div class=\"service-category\">Mental Health</div>\n </div>\n <div>\n <div class=\"service-price\">\u20B91500</div>\n <div class=\"service-duration\">45 min</div>\n </div>\n </div>\n <div class=\"service-description\">\n Professional psychological support\n </div>\n <div class=\"home-visit\">Home Visit Available</div>\n </div>\n\n <div class=\"service-card\">\n <div class=\"service-header\">\n <div class=\"service-icon\">\u2702</div>\n <div class=\"service-info\">\n <div class=\"service-title\">Hair Cut & Styling</div>\n <div class=\"service-category\">Beauty</div>\n </div>\n <div>\n <div class=\"service-price\">\u20B91200</div>\n <div class=\"service-duration\">45 min</div>\n </div>\n </div>\n <div class=\"service-description\">\n Professional hair cutting and styling\n </div>\n <div class=\"home-visit\">Home Visit Available</div>\n </div> -->\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #locationListing>\n <div class=\"location_section\">\n <div class=\"header flex-column align-items-start\">\n <h1>Choose Location</h1>\n <p>Select where you'd like to receive the service</p>\n </div>\n\n <div class=\"location-list\">\n <ng-container *ngFor=\"let location of locationData\">\n <div (click)=\"selectLocation(location)\"\n [ngClass]=\"{ 'location-card-selected' : location?.selected, 'location-card': !location?.selected }\">\n <div class=\"location-content\">\n <div class=\"location-info\">\n <div class=\"location-icon\"><img\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/427226c1758629157758store_3171510.png\">\n </div>\n <div class=\"location-details\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <h3>{{location?.storeName ? location?.storeName : 'N/A'}}</h3>\n <!-- <div class=\"distance\"><mat-icon>location_on</mat-icon> 2.3 km</div> -->\n </div>\n <p>{{location?.addressDetails?.addressLine}}, {{location?.addressDetails?.city}},\n {{location?.addressDetails?.state}} {{location?.pincode}}</p>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <!-- <div class=\"location-card\">\n <div class=\"location-content\">\n <div class=\"location-info\">\n <div class=\"location-icon branch-icon\"></div>\n <div class=\"location-details\">\n <h3>Branch Clinic</h3>\n <p>456 Care Avenue, Health Zone, Mumbai 400015</p>\n </div>\n </div>\n <div class=\"distance\">5.8 km</div>\n </div>\n </div>\n\n <div class=\"location-card\">\n <div class=\"location-content\">\n <div class=\"location-info\">\n <div class=\"location-icon home-icon\"></div>\n <div class=\"location-details\">\n <h3>Home Visit</h3>\n <p>Your Location</p>\n </div>\n </div>\n <div class=\"distance\">0 km</div>\n </div>\n </div> -->\n </div>\n </div>\n</ng-template>\n<ng-template #staffListing>\n <div class=\"w-60 overflow-hidden staff-listing\">\n <div class=\"d-flex w-100 h-100\">\n <div class=\"w-100\">\n <!-- Header Section -->\n <div class=\"staff-header mb-3\">\n <h1>Select Staff Member</h1>\n <p class=\"staff-subtitle mb-0\">Choose your preferred professional</p>\n </div>\n\n <!-- Staff Cards -->\n <div class=\"d-flex flex-column gap-4 staff-list\">\n <ng-container *ngFor=\"let staff of staffData\">\n <div class=\"card rounded-3 p-3\" (click)=\"selectStaff(staff)\"\n [ngClass]=\"{ 'staff-card-selected' : staff?.selected, 'staff-card': !staff?.selected }\">\n <div class=\"d-flex align-items-start justify-content-between\">\n <div class=\"d-flex align-items-start flex-grow-1\">\n <div\n class=\"staff-avatar rounded-circle d-flex align-items-center justify-content-center me-4\">\n {{staff?.staffName.slice(0,3).toUpperCase()}}\n </div>\n <div class=\"staff-details flex-grow-1\">\n <h3 class=\"staff-name\">{{staff?.staffName ? staff?.staffName : 'N/A'}}</h3>\n <p class=\"staff-specialty\">General Medicine</p>\n <!-- <p class=\"staff-description mb-0\">Experienced physician with 10+ years in\n general\n medicine and wellness care.</p> -->\n </div>\n </div>\n <!-- <div class=\"rating-section\">\n <div class=\"star-rating d-flex align-items-center\">\n <span class=\"star-icon\"></span>\n <span class=\"rating-number\">4.9</span>\n </div>\n <div class=\"review-count\">156 reviews</div>\n </div> -->\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #dateSelection>\n <div class=\"w-60 date_section\">\n <div class=\"row justify-content-center h-100\">\n <div class=\"col-12 h-100\">\n <div class=\"datetime-header mb-2\">\n <h1>Select Date & Time</h1>\n <p class=\"datetime-subtitle mb-0\">Choose when you'd like your appointment</p>\n </div>\n\n <!-- Main Content -->\n <div class=\"d-flex gap-4 main_container\">\n <!-- Left Column - Date Selection -->\n <div [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\">\n <div class=\"section-card card rounded-3 p-4 h-100\">\n <h3 class=\"section-title\">Select Date</h3>\n\n <div class=\"date-picker-container d-flex align-items-center justify-content-between\"\n (click)=\"$event.stopPropagation()\">\n <input type=\"text\" class=\"date-input border-0 rounded-2\" placeholder=\"dd-mm-yyyy\"\n [value]=\"selectedDateStr\" readonly (click)=\"toggleCalendar($event)\">\n\n <mat-icon class=\"ms-2\" (click)=\"toggleCalendar($event)\">calendar_today</mat-icon>\n </div>\n <div class=\"position-relative\" (click)=\"$event.stopPropagation()\">\n <div class=\"datepicker-popover\" *ngIf=\"showCalendar\">\n <mat-calendar [(selected)]=\"selectedDate\" [dateFilter]=\"dateFilter\"\n (selectedChange)=\"onDateSelected($event)\" class=\"datepicker-calendar\">\n </mat-calendar>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Right Column - Time Selection -->\n <div class=\"time_selection\" [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\">\n <div class=\"section-card card h-100 rounded-3 p-4\">\n <h3 class=\"section-title\">Available Times</h3>\n\n <!-- Time Slots Grid -->\n <div class=\"row g-2 mb-4 overflow-scroll\">\n <ng-container *ngIf=\"!skeletonLoader ;else slotsLoader\">\n <div class=\"col-4\" *ngFor=\"let time of locationTiming\">\n <div class=\"time-slot rounded-2\" [class.selected]=\"time.selected\"\n (click)=\"selectTimeSlot(time)\">{{time ?\n time?.value : 'N/A'}}</div>\n </div>\n </ng-container>\n <ng-template #slotsLoader>\n <!-- Time Slot Grid Skeleton Loader HTML -->\n <div class=\"time-slot-grid\">\n <!-- Row 1 -->\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n\n <!-- Row 2 -->\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n\n <!-- Row 3 -->\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n\n <!-- Row 4 -->\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n\n <!-- Row 5 -->\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n\n <!-- Row 6 -->\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n </div>\n\n </ng-template>\n </div>\n\n <!-- Waitlist Section -->\n <!-- <div class=\"waitlist-section rounded-3\">\n <div class=\"d-flex align-items-start\">\n <div class=\"d-flex h-100 justify-content-between flex-column\">\n <div class=\"waitlist-title d-flex align-items-center gap-2\"><span\n class=\"waitlist-icon check-icon\"></span>No\n slots available?</div>\n <div class=\"waitlist-description d-flex align-items-center gap-2\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\"\n id=\"flexCheckChecked\">\n Add me to the waitlist for earlier\n availability\n </div>\n </div>\n <div>\n </div>\n </div>\n </div> -->\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n</ng-template>\n<ng-template #contactDetails>\n <div class=\"w-60 contact_section overflow-hidden\">\n <div class=\"d-flex h-100\">\n <div class=\"h-100 w-100\">\n <!-- Header Section -->\n <div class=\"contact-header mb-2\">\n <h1>Contact Details</h1>\n <p class=\"contact-subtitle mb-0\">Provide your contact information</p>\n </div>\n\n <!-- Form Sections -->\n <div class=\"d-flex gap-3 details_container flex-column w-100\">\n <!-- Left Column - Personal Information -->\n <div class=\"d-flex gap-4\">\n <div\n [ngClass]=\"{'w-50' : selectedService?.homeAppointmentAvailable, 'w-100' : !selectedService?.homeAppointmentAvailable}\">\n <div class=\"form-section card rounded-3 p-4 h-100\">\n <h3 class=\"section-title\">Personal Information</h3>\n\n <!-- Full Name -->\n <div class=\"mb-4\">\n <label class=\"form-label d-flex align-items-center\">\n Full Name\n <span class=\"required-asterisk\">*</span>\n </label>\n <input type=\"text\" class=\"form-control form-input rounded-2\"\n [(ngModel)]=\"appointmentPayload.customerDetail.name\"\n (ngModelChange)=\"checkRequiredValues()\" simpoLettersOnly>\n </div>\n\n <!-- Email Address -->\n <div class=\"mb-4\">\n <label class=\"form-label d-flex align-items-center\">\n Email Address\n <span class=\"required-asterisk\">*</span>\n </label>\n <input type=\"email\" class=\"form-control form-input rounded-2\"\n [(ngModel)]=\"appointmentPayload.customerDetail.email\"\n (ngModelChange)=\"checkRequiredValues()\"\n pattern=\"^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$\">\n </div>\n\n <!-- Phone Number -->\n <div class=\"mb-0\">\n <label class=\"form-label d-flex align-items-center\">\n Phone Number\n <span class=\"required-asterisk\">*</span>\n </label>\n <input type=\"tel\" class=\"form-control rounded-2\"\n [(ngModel)]=\"appointmentPayload.customerDetail.phoneNumber\"\n (ngModelChange)=\"checkRequiredValues()\" simpoNumbersOnly\n [ngClass]=\"{'mobile_number' : appointmentPayload.customerDetail.phoneNumber.length != 10}\">\n </div>\n </div>\n </div>\n <!-- Right Column - Home Visit Details -->\n <div class=\"w-50\" *ngIf=\"selectedService?.homeAppointmentAvailable\">\n <div class=\"form-section card rounded-3 p-4 h-100\">\n <h3 class=\"section-title\">Home Visit Details</h3>\n\n <!-- Home Address -->\n <div class=\"mb-4\">\n <label class=\"form-label d-flex align-items-center\">\n Home Address\n </label>\n <textarea class=\"form-control form-textarea rounded-2\"\n placeholder=\"Enter your complete address\" [(ngModel)]=\"homeAddress\"></textarea>\n </div>\n\n <!-- Special Instructions -->\n <div class=\"mb-0\">\n <label class=\"form-label d-flex align-items-center\">\n Special Instructions\n </label>\n <textarea class=\"form-control form-textarea rounded-2\"\n placeholder=\"Any special instructions for the professional (optional)\"\n [(ngModel)]=\"instructions\"></textarea>\n </div>\n </div>\n </div>\n </div>\n <div class=\"policies-container\">\n <!-- Header -->\n <h2 class=\"policies-title\">Policies & Terms</h2>\n\n <!-- Policy Items -->\n <div class=\"policy-items-container d-flex flex-column gap-3\">\n <!-- Cancellation Policy -->\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\n (click)=\"showCancellationPolicy = !showCancellationPolicy\">\n <h3 class=\"policy-title\">Cancellation Policy</h3>\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\n *ngIf=\"!showCancellationPolicy\">keyboard_arrow_right</mat-icon>\n <mat-icon *ngIf=\"showCancellationPolicy\">keyboard_arrow_down</mat-icon>\n </div>\n </div>\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\n *ngIf=\"showCancellationPolicy\">\n <span *ngFor=\"let policy of selectedService?.cancellationPolicy\">&#8226;\n {{policy}}</span>\n </div>\n\n <!-- Rescheduling Policy -->\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\n (click)=\"showReducingPolicy = !showReducingPolicy\">\n <h3 class=\"policy-title\">Rescheduling Policy</h3>\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\n *ngIf=\"!showReducingPolicy\">keyboard_arrow_right</mat-icon>\n <mat-icon *ngIf=\"showReducingPolicy\">keyboard_arrow_down</mat-icon>\n </div>\n </div>\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\n *ngIf=\"showReducingPolicy\">\n <span *ngFor=\"let policy of selectedService?.reschedulePolicy\">&#8226; {{policy}}</span>\n </div>\n </div>\n\n <!-- Acceptance Section -->\n <div class=\"acceptance-section\">\n <input type=\"checkbox\" class=\"custom-checkbox\" [(ngModel)]=\"termsAndConditions\"\n (ngModelChange)=\"checkRequiredValues()\">\n <p class=\"acceptance-text\">\n I understand and accept the cancellation & rescheduling policies and\n <span class=\"terms-link\">Terms & Conditions<span\n class=\"external-link-icon\"></span></span>\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #paymentTab>\n <div class=\"w-60 payment_section\">\n <div class=\"w-100 h-100\">\n <div class=\"w-100 d-flex justify-content-center align-items-center flex-column\">\n <!-- Header Section -->\n <div class=\"payment-header mb-3 w-100\">\n <h1>Payment & Confirmation</h1>\n <p class=\"payment-subtitle mb-0\">Review your booking and complete payment</p>\n </div>\n\n <!-- Booking Summary Card -->\n <div class=\"booking-summary-card\" [ngClass]=\"{'w-100' : screenWidth < 475,'w-50':screenWidth > 475}\">\n <h2 class=\"summary-title\">Booking Summary</h2>\n\n <!-- Service -->\n <div class=\"summary-row\">\n <div class=\"summary-label\">Service</div>\n <div class=\"summary-value\">{{selectedService?.name ? selectedService?.name : 'N/A'}}</div>\n </div>\n\n <!-- Professional -->\n <div class=\"summary-row\" *ngIf=\"selectedStaff?.staffName\">\n <div class=\"summary-label\">Professional</div>\n <div class=\"summary-value\">{{selectedStaff?.staffName ? selectedStaff?.staffName : 'N/A'}}</div>\n </div>\n\n <!-- Location -->\n <div class=\"summary-row\">\n <div class=\"summary-label\">Location</div>\n <div class=\"summary-value\">{{selectedLocation?.storeName ? selectedLocation?.storeName : 'N/A'}}\n </div>\n </div>\n\n <!-- Date & Time -->\n <div class=\"summary-row\">\n <div class=\"summary-label\">Date & Time</div>\n <div class=\"summary-value\">{{selectedDateStr ? (selectedDateStr) : 'N/A'}} at\n {{selectedTime ? selectedTime.value : 'N/A'}}</div>\n </div>\n\n <!-- Duration -->\n <div class=\"summary-row\">\n <div class=\"summary-label\">Duration</div>\n <div class=\"summary-value\">{{selectedService?.duration ? selectedService?.duration : 'N/A'}}\n minutes</div>\n </div>\n <div class=\"summary-row\">\n <div class=\"summary-label\">Tax Percent</div>\n <div class=\"summary-value\">{{selectedService?.priceDetails?.taxPercent ?\n selectedService?.priceDetails?.taxPercent : 0}}%</div>\n </div>\n <!-- Total -->\n <div class=\"summary-row total-row\">\n <div class=\"summary-label\">Total</div>\n <div class=\"summary-value\">\n <span class=\"currency-symbol\">\u20B9</span>{{selectedService?.priceDetails?.totalPrice ?\n selectedService?.priceDetails?.totalPrice : '0'}}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #statusTemplate>\n <div class=\"booking-confirmation\">\n <!-- Success Icon -->\n <div class=\"success-icon\">\n <div class=\"checkmark-circle\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/881293c1758695578518success.gif\"\n class=\"w-100 h-100\" *ngIf=\"apiStatus\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/325000c1758695564518fail.gif\"\n class=\"w-100 h-100\" *ngIf=\"!apiStatus\">\n </div>\n </div>\n\n <!-- Main Content -->\n <div class=\"confirmation-content\">\n <h1 class=\"confirmation-title\">{{apiStatus ? 'Booking Confirmed!' : 'Booking Failed'}}</h1>\n <p class=\"confirmation-message\">\n {{apiStatus ? 'Your appointment has been successfully booked.':'Failed to book you appointment. Please\n try again later'}}\n </p>\n\n <!-- Details Card -->\n <div class=\"d-flex w-100 align-items-center justify-content-center\" *ngIf=\"apiStatus\">\n <div class=\"details-card\">\n <h3 class=\"details-title\">Appointment Details</h3>\n\n <div class=\"details-row\">\n <span class=\"detail-label\">Service</span>\n <span class=\"detail-value\">{{appointmentPayload.serviceDetail?.name ?\n appointmentPayload.serviceDetail?.name : 'N/A'}}</span>\n </div>\n\n <div class=\"details-row\" *ngIf=\"appointmentPayload?.staffDetail?.name\">\n <span class=\"detail-label\">Professional</span>\n <span class=\"detail-value\">{{appointmentPayload.staffDetail?.name ?\n appointmentPayload.staffDetail?.name : 'N/A'}}</span>\n </div>\n <div class=\"details-row\">\n <span class=\"detail-label\">Date & Time</span>\n <span class=\"detail-value\">{{appointmentPayload.bookingDate ?\n appointmentPayload.bookingDate.slice(0,10) :\n 'N/A'}} at\n {{appointmentPayload.startTime ? appointmentPayload.startTime : 'N/A'}}</span>\n </div>\n </div>\n </div>\n\n\n <!-- Action Buttons -->\n <!-- <div class=\"action-buttons\">\n <button class=\"btn btn-outline\">View My Bookings</button>\n <button class=\"btn btn-primary\">Back to Admin</button>\n </div> -->\n </div>\n </div>\n</ng-template>\n<ng-template #skeletonLoader *ngIf=\"skeletonLoader\">\n <!-- Service Skeleton Loader HTML -->\n <div class=\"service-grid\">\n <!-- Skeleton Card 1 -->\n <div class=\"service-card skeleton-card\">\n <div class=\"service-header\">\n <div class=\"skeleton skeleton-icon\"></div>\n <div class=\"service-content\">\n <div class=\"skeleton skeleton-title\"></div>\n <div class=\"skeleton skeleton-price\"></div>\n <div class=\"skeleton skeleton-duration\"></div>\n </div>\n </div>\n <div class=\"skeleton skeleton-category\"></div>\n <div class=\"skeleton skeleton-description\"></div>\n <div class=\"skeleton skeleton-badge\"></div>\n </div>\n\n <!-- Skeleton Card 2 -->\n <div class=\"service-card skeleton-card\">\n <div class=\"service-header\">\n <div class=\"skeleton skeleton-icon\"></div>\n <div class=\"service-content\">\n <div class=\"skeleton skeleton-title\"></div>\n <div class=\"skeleton skeleton-price\"></div>\n <div class=\"skeleton skeleton-duration\"></div>\n </div>\n </div>\n <div class=\"skeleton skeleton-category\"></div>\n <div class=\"skeleton skeleton-description\"></div>\n <div class=\"skeleton skeleton-badge\"></div>\n </div>\n\n <!-- Skeleton Card 3 -->\n <div class=\"service-card skeleton-card\">\n <div class=\"service-header\">\n <div class=\"skeleton skeleton-icon\"></div>\n <div class=\"service-content\">\n <div class=\"skeleton skeleton-title\"></div>\n <div class=\"skeleton skeleton-price\"></div>\n <div class=\"skeleton skeleton-duration\"></div>\n </div>\n </div>\n <div class=\"skeleton skeleton-category\"></div>\n <div class=\"skeleton skeleton-description\"></div>\n <div class=\"skeleton skeleton-badge\"></div>\n </div>\n\n <!-- Skeleton Card 4 -->\n <div class=\"service-card skeleton-card\">\n <div class=\"service-header\">\n <div class=\"skeleton skeleton-icon\"></div>\n <div class=\"service-content\">\n <div class=\"skeleton skeleton-title\"></div>\n <div class=\"skeleton skeleton-price\"></div>\n <div class=\"skeleton skeleton-duration\"></div>\n </div>\n </div>\n <div class=\"skeleton skeleton-category\"></div>\n <div class=\"skeleton skeleton-description\"></div>\n <div class=\"skeleton skeleton-badge\"></div>\n </div>\n\n <!-- Skeleton Card 5 -->\n <div class=\"service-card skeleton-card\">\n <div class=\"service-header\">\n <div class=\"skeleton skeleton-icon\"></div>\n <div class=\"service-content\">\n <div class=\"skeleton skeleton-title\"></div>\n <div class=\"skeleton skeleton-price\"></div>\n <div class=\"skeleton skeleton-duration\"></div>\n </div>\n </div>\n <div class=\"skeleton skeleton-category\"></div>\n <div class=\"skeleton skeleton-description\"></div>\n <div class=\"skeleton skeleton-badge\"></div>\n </div>\n\n <!-- Skeleton Card 6 -->\n <div class=\"service-card skeleton-card\">\n <div class=\"service-header\">\n <div class=\"skeleton skeleton-icon\"></div>\n <div class=\"service-content\">\n <div class=\"skeleton skeleton-title\"></div>\n <div class=\"skeleton skeleton-price\"></div>\n <div class=\"skeleton skeleton-duration\"></div>\n </div>\n </div>\n <div class=\"skeleton skeleton-category\"></div>\n <div class=\"skeleton skeleton-description\"></div>\n <div class=\"skeleton skeleton-badge\"></div>\n </div>\n </div>\n</ng-template>", styles: ["body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;background-color:#fff;color:#000;line-height:1.6}.main_section{position:relative;height:100%}.main_header{padding:1%;width:100%;background:#fff;height:15%}.main_body{height:75%;padding-top:0%;overflow:scroll}.header{display:flex;align-items:center;justify-content:space-between}.back-btn mat-icon{height:16px!important;width:20px!important;font-size:21px!important}.back-btn span{color:#000;font-size:15px;font-weight:500}.back-btn:hover{background-color:#f0f0f0}.header-title{flex-grow:1;margin-left:2rem}.header-title h1{font-size:20px;font-weight:600;margin-bottom:0}.header-title p{color:#666;font-size:14px}.step-indicator{font-size:14px;color:#000;font-weight:700}.progress-bar{width:100%;height:8px;background-color:#e0e0e0;margin-bottom:1rem;border-radius:10px;overflow:hidden}.w-60{width:60%!important}.progress-fill{height:100%;width:14.28%;background-color:#000}.service-selection h2{font-size:20px;font-weight:600;margin:.25rem 0}.service-selection p{color:#666;font-size:16px;margin-bottom:1rem}.main_footer{border-top:1px solid lightgrey;width:100%;background-color:#fff;height:10%}.services-grid{display:grid;grid-template-columns:48% 48%;gap:15px;padding-bottom:5px}.service-card{border:1px solid lightgrey;border-radius:8px;padding:24px;background-color:#fff;cursor:pointer;transition:all .3s ease;position:relative}.service-card:hover{background-color:#f9f9f9;box-shadow:0 4px 8px #0000001a}.service-card-selected{border:2px solid black;border-radius:8px;padding:24px;background-color:#fff;cursor:pointer;transition:all .3s ease;position:relative}.service-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:3rem}.service-info{flex-grow:1}.service-icon{width:40px;height:40px;border-radius:8px;background-color:#f0f0f0;display:flex;align-items:center;justify-content:center;margin-right:1rem;font-size:20px;margin-top:.2rem}.service-title{font-size:18px;font-weight:600;margin-bottom:4px}.service-category{background-color:#f0f0f0;color:#000;padding:1% 4%;border-radius:12px;font-size:12px;font-weight:500;display:inline-block}.service-price{font-size:17px;font-weight:700;color:#000}.service-duration{font-size:12px;color:#666;display:flex;justify-content:center;align-items:center}.service-description{color:#666;font-size:15px;margin-bottom:.5rem;line-height:1.5}.home-visit{display:flex;align-items:center;font-size:12px;color:#666;border:1px solid lightgrey;padding:.5% 1%;border-radius:4px;background-color:#fff;width:10vw;height:3vh;white-space:nowrap;justify-content:space-around}.home-visit img{width:18px}.footer-buttons{display:flex;justify-content:space-between;align-items:center;width:60%}.back-footer-btn{color:#000;padding:12px 24px;font-size:16px}.continue-btn{background-color:#000;color:#fff;border:2px solid black;padding:.5%;border-radius:4px;font-size:15px!important;font-weight:600;cursor:pointer;width:6vw!important}.continue-btn:hover{background-color:#333}.continue-btn:disabled{background-color:#ccc;border-color:#ccc;cursor:not-allowed}.location_section{width:60%;overflow:hidden}.location_section .header h1{font-size:20px;font-weight:600;margin:.25rem 0}.location_section .header p{font-size:16px;color:#888;font-weight:400}.location-list{display:flex;flex-direction:column;gap:20px;height:64vh;overflow-x:scroll;padding-bottom:1%}.location-card{border:1px solid lightgrey;border-radius:12px;padding:1.5rem 1.5rem 2rem;cursor:pointer;transition:all .3s ease}.location-card:hover{box-shadow:0 4px 8px #0000001a}.location-card-selected{border:1px solid black;border-radius:12px;padding:1.5rem 1.5rem 2rem;cursor:pointer;transition:all .3s ease}.location-content{display:flex;align-items:center;justify-content:space-between}.location-info{display:flex;align-items:center;flex-grow:1}.location-icon{width:40px;height:40px;background-color:#d3d3d3;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-right:20px}.location-icon img{width:28px}.location-details{width:95%}.location-details h3{font-size:16px;font-weight:600;margin-bottom:0}.location-details p{font-size:14px;color:#aaa;line-height:1.4;margin:0}.distance{display:flex;align-items:center;color:#888;font-size:14px;margin-left:20px}.distance mat-icon{width:18px!important;height:15px!important;font-size:17px}.staff-header h1{font-size:20px;font-weight:600;margin:.25rem 0}.staff-subtitle{font-size:16px;color:#888;font-weight:400}.staff-card{border:1px solid lightgrey;cursor:pointer;transition:all .3s ease}.staff-card:hover{box-shadow:0 4px 8px #0000001a}.staff-card-selected{border-color:#666;cursor:pointer;transition:all .3s ease}.staff-avatar{width:64px;height:64px;background-color:gray;font-size:20px;font-weight:600;color:#fff}.staff-name{font-size:16px;font-weight:600;margin-bottom:0}.staff-specialty{font-size:14px;color:gray;margin-bottom:8px}.staff-description{font-size:14px;color:gray;line-height:1.4}.rating-section{display:flex;flex-direction:column;align-items:flex-end}.star-rating{color:gold;font-size:16px;margin-bottom:4px;width:100%}.rating-number{font-size:18px;font-weight:600;color:#000}.review-count{font-size:12px;color:#888}.star-icon:before{content:\"\\2b50\";margin-right:4px}.staff_section{width:60%;overflow:hidden}.staff-list{height:64vh;overflow-x:scroll;padding-bottom:1%}.datetime-header h1{font-size:20px;font-weight:600;margin:.25rem 0}.main_container{height:85%}.datetime-subtitle{font-size:16px;color:#888;font-weight:400}.section-card{border:1px solid lightgrey}.section-title{font-size:17px;font-weight:600;margin-bottom:20px}.date-picker-container{border:1px solid lightgrey}.date-picker-container mat-icon{height:17px;font-size:18px}.date-input{font-size:16px;padding:2%;width:auto;outline:none}.time-slot{border:1px solid lightgrey;font-size:14px;font-weight:500;padding:6%;cursor:pointer;transition:all .3s ease;text-align:center;min-width:80px}.time-slot:hover{box-shadow:0 4px 8px #0000001a}.time-slot.selected{background-color:#555;border-color:#777;color:#fff}.waitlist-section{background-color:#789;border:none;padding:4%;max-height:13vh}.waitlist-icon{color:#4ade80;font-size:18px}.waitlist-title{color:#fff;font-size:16px;font-weight:500;margin-bottom:8px}.mobile_number{border-color:#dc3545!important;box-shadow:0 0 0 .1rem #ffc3c3}.waitlist-description{color:#fff;font-size:14px;margin-bottom:0;font-weight:500}.waitlist-description .form-check-input{width:17px;height:17px;background-color:transparent}.waitlist-description .form-check-input:checked{background-color:#0d6efd}.check-icon:before{content:\"\\2713\"}.contact-header h1{font-size:20px;font-weight:600;margin:.25rem 0}.contact-subtitle{font-size:16px;color:#888;font-weight:400}.form-section{border:1px solid lightgrey}.section-title{font-size:16px;font-weight:600;margin-bottom:24px}.form-label{font-size:14px;font-weight:500;margin-bottom:8px}.required-asterisk{color:#ff6b6b;margin-left:4px}.form-input{border:1px solid lightgrey;font-size:16px;padding:1%;transition:all .3s ease}.form-input:focus{border-color:#777}.form-input::placeholder{color:#aaa;font-size:14px}.form-textarea{border:1px solid lightgrey;font-size:16px;padding:12px 16px;resize:vertical;max-height:120px;transition:all .3s ease}.form-textarea:focus{border-color:#777}.form-textarea::placeholder{color:#aaa;font-size:14px}.optional-label{color:#888;font-size:12px;font-style:italic}.details_container{height:89%;overflow-x:scroll;padding-bottom:1%}.policies-container{background-color:#fff;border:1px solid lightgrey;padding:2rem;border-radius:12px}.policies-title{font-size:16px;font-weight:600;color:#000;margin-bottom:1rem}.policy-item{background-color:#fff;border:1px solid lightgrey;border-radius:8px;padding:1%;cursor:pointer;transition:all .3s ease}.cancellation_policies{padding:1% .5%;font-weight:500}.policy-item:hover{background-color:#f8f9fa;border-color:#ccc}.policy-item:last-of-type{margin-bottom:32px}.policy-title{font-size:14px;font-weight:500;color:#000;margin:0}.acceptance-section{display:flex;align-items:flex-start;gap:7px;margin-top:8px}.custom-checkbox{width:18px;height:20px;background-color:#fff;border:1px solid lightgrey;border-radius:4px;margin-top:2px;cursor:pointer;position:relative;flex-shrink:0;transition:all .3s ease}.custom-checkbox:hover{border-color:#999;background-color:#f8f9fa}.custom-checkbox.checked{background-color:#007bff;border-color:#007bff}.custom-checkbox.checked:after{content:\"\\2713\";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;font-size:12px;font-weight:700}.acceptance-text{font-size:14px;color:#000;line-height:1.5;margin:0}.terms-link{color:#007bff;text-decoration:none;font-weight:500;position:relative}.terms-link:hover{color:#0056b3;text-decoration:underline}.external-link-icon{margin-left:4px;font-size:12px;opacity:.8}.external-link-icon:after{content:\"\\2197\"}.payment-header h1{font-size:20px;font-weight:600;color:#000;margin:.25rem 0}.payment-subtitle{font-size:16px;color:#666;font-weight:400}.booking-summary-card{background-color:#fff;border:1px solid lightgrey;padding:2%;border-radius:12px}.summary-title{font-size:18px;font-weight:600;color:#000;margin-bottom:32px}.summary-row{display:flex;justify-content:space-between;align-items:center;padding:12px 0}.summary-row:last-child{border-bottom:none;padding-bottom:0}.summary-label{font-size:16px;color:#000;font-weight:500}.summary-value{font-size:16px;color:#000;font-weight:400;text-align:right}.total-row{margin-top:16px;padding-top:16px}.total-row .summary-label,.total-row .summary-value{font-size:20px;font-weight:600}.currency-symbol{font-size:18px}.complete_booking{background:#e3fee3;border:none;padding:.5%;width:12vw!important;font-size:15px!important;font-weight:500;border-radius:4px;white-space:nowrap}.complete_booking img{width:30px}.pay-now-btn{justify-content:unset!important;background:#e3fee3;border:none;padding:.5%;width:8vw!important;font-size:15px!important;font-weight:500;border-radius:4px;gap:.5rem}.pay-now-btn img{width:30px}.booking-confirmation{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;width:60%;border-radius:10px}.success-icon{margin-bottom:1.5rem}.checkmark-circle{width:80px;height:80px;position:relative}.checkmark{width:80px;height:80px;border-radius:50%;display:block;stroke-width:3;stroke:#22c55e;stroke-miterlimit:10;animation:checkmark-fill .4s ease-in-out .4s forwards,checkmark-scale .3s ease-in-out .9s both}.checkmark-circle-path{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:3;stroke-miterlimit:10;stroke:#22c55e;fill:none;animation:checkmark-stroke .6s cubic-bezier(.65,0,.45,1) forwards}.checkmark-check{transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;stroke:#22c55e;stroke-width:3;animation:checkmark-stroke .3s cubic-bezier(.65,0,.45,1) .8s forwards}@keyframes checkmark-stroke{to{stroke-dashoffset:0}}@keyframes checkmark-scale{0%,to{transform:none}50%{transform:scale3d(1.1,1.1,1)}}@keyframes checkmark-fill{to{box-shadow:inset 0 0 0 30px #22c55e}}.confirmation-content{width:100%;height:80%}.confirmation-title{font-size:18px;font-weight:700}.confirmation-message{font-size:1rem;margin-bottom:1rem;line-height:1.6;font-weight:500}.details-card{background:#ffffff1a;border:1px solid lightgrey;border-radius:16px;padding:1.5rem;margin-bottom:2rem;width:35vw}.details-title{font-size:1.25rem;font-weight:600;margin:0 0 1.5rem}.details-row{display:flex;justify-content:space-between;align-items:center;padding:.75rem 0;border-bottom:1px solid rgba(255,255,255,.1)}.details-row:last-child{border-bottom:none}.detail-label{font-size:.9rem;font-weight:500}.detail-value{font-weight:600;font-size:1rem}.action-buttons{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap}.btn{padding:.75rem 1.5rem;border-radius:8px;font-weight:600;font-size:.9rem;cursor:pointer;transition:all .2s ease;border:none;min-width:140px}.btn-outline{background:transparent;border:2px solid rgba(255,255,255,.3);color:#fff}.btn-outline:hover{background:#ffffff1a;border-color:#ffffff80}.btn-primary{background:#fff;color:#1f2937}.btn-primary:hover{background:#f3f4f6;transform:translateY(-1px)}.datepicker-popover{position:absolute;z-index:1000;margin-top:8px;border-radius:16px;overflow:hidden;box-shadow:0 12px 28px #0000001f,0 2px 4px #00000014;background:#fff;border:1px solid rgba(0,0,0,.06);width:17vw}::ng-deep .datepicker-calendar{border-radius:16px!important;overflow:hidden!important;font-family:Segoe UI,Roboto,sans-serif!important;width:100%!important}::ng-deep .mat-calendar-header{background:linear-gradient(135deg,#667eea,#764ba2)!important;color:#fff!important;padding:3px!important;display:flex!important;align-items:center!important;justify-content:space-between!important;min-height:60px!important;border-radius:16px 16px 0 0!important}::ng-deep .mat-calendar-controls{display:flex!important;align-items:center!important;justify-content:space-between!important;width:100%!important;margin:2% calc(4.7142857143% - 16px)!important}::ng-deep .mat-calendar-period-button{color:#fff!important;font-weight:700!important;font-size:16px!important;letter-spacing:.5px!important;background:transparent!important;border:none!important;padding:12px 16px!important;border-radius:8px!important;transition:all .3s ease!important;flex-grow:1!important;text-align:left!important;margin:0!important;order:1!important}::ng-deep .mat-calendar-period-button:hover{background:#ffffff26!important;transform:translateY(-1px)!important}::ng-deep .mat-calendar-header .mat-calendar-controls>div{display:flex;order:2!important}::ng-deep .mat-calendar-previous-button,::ng-deep .mat-calendar-next-button{color:#fff!important;width:40px!important;height:40px!important;border-radius:50%!important;background:#ffffff1a!important;border:1px solid rgba(255,255,255,.2)!important;transition:all .3s ease!important;margin:0 4px!important;display:flex!important;align-items:center!important;justify-content:center!important}::ng-deep .mat-calendar-previous-button:hover,::ng-deep .mat-calendar-next-button:hover{background:#ffffff40!important;transform:scale(1.05)!important}::ng-deep .mat-calendar-arrow{fill:#fff!important;width:20px!important;height:20px!important}::ng-deep .mat-calendar-content{padding:10px 16px!important;background:#fff!important}::ng-deep .mat-calendar-table-header th{color:#6b7280!important;font-weight:600!important;font-size:12px!important;text-align:center!important;padding-bottom:12px!important;text-transform:uppercase!important}::ng-deep .mat-calendar-table{border-spacing:0!important;border-collapse:collapse!important;width:100%!important}::ng-deep .mat-calendar-body-cell{height:44px!important;width:44px!important;border-radius:12px!important}::ng-deep .mat-calendar-body-cell-content{width:33px!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important;font-weight:500!important;font-size:14px!important;color:#374151!important;transition:all .3s cubic-bezier(.4,0,.2,1)!important}::ng-deep .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover .mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background:#667eea1a!important;color:#667eea!important;transform:scale(1.05)!important}::ng-deep .mat-calendar-body-selected{background:linear-gradient(135deg,#667eea,#764ba2)!important;color:#fff!important;box-shadow:0 4px 12px #677eea4d!important}::ng-deep .mat-calendar-body-today:not(.mat-calendar-body-selected){border:none;color:#667eea!important;font-weight:700!important}::ng-deep .mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:#d1d5db!important}.service-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;padding:20px;width:60%}.service-card{border:1px solid #e5e5e5;border-radius:8px;padding:20px;background:#fff;box-shadow:0 2px 4px #0000001a}.service-header{display:flex;align-items:flex-start;gap:15px;margin-bottom:15px}.service-content{flex:1;display:flex;flex-direction:column;gap:8px}.skeleton{background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%;animation:skeleton-loading 1.5s infinite;border-radius:4px}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-icon{width:40px;height:40px;border-radius:50%;flex-shrink:0}.skeleton-title{height:20px;width:70%}.skeleton-price{height:18px;width:50%;align-self:flex-end}.skeleton-duration{height:14px;width:40%;align-self:flex-end}.skeleton-category{height:24px;width:25%;border-radius:12px;margin-bottom:10px}.skeleton-description{height:16px;width:85%;margin-bottom:15px}.skeleton-badge{height:32px;width:45%;border-radius:16px;margin-top:10px}@media (max-width: 768px){.service-grid{grid-template-columns:1fr;gap:15px;padding:15px}.service-card{padding:15px}}.time-slot-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;padding:16px;max-width:400px;margin:0 auto}.skeleton-time-slot{height:44px;border-radius:8px;background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%;animation:skeleton-shimmer 1.5s infinite;border:1px solid #e5e5e5;position:relative}@keyframes skeleton-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-time-slot:nth-child(2n){animation:skeleton-pulse 2s infinite}@keyframes skeleton-pulse{0%,to{opacity:1}50%{opacity:.7}}@media (max-width: 480px){.time-slot-grid{grid-template-columns:repeat(2,1fr);gap:10px;padding:12px}.skeleton-time-slot{height:40px}}@media (max-width: 320px){.time-slot-grid{grid-template-columns:1fr}}@media screen and (min-width:320px) and (max-width:475px){.back-btn{gap:.25rem!important;margin:0!important}.back-btn span{color:#000;font-size:12px;font-weight:500;white-space:nowrap}.back-btn mat-icon{font-size:16px!important;margin-bottom:0!important}.header-title{display:flex;align-items:center;margin-bottom:0rem!important}.header-title h1{font-size:16px!important}.main_header .header{padding:3%}.date_section,.service_section,.location_section,.contact_section,.payment_section{width:100%!important;padding:0% 5%}.service_section h2{font-size:17px!important;margin-bottom:0!important}.service_section p{font-size:14px!important}.main_section{height:100vh}.services-grid{display:flex;justify-content:center;flex-wrap:wrap}.service-card,.service-card-selected{width:90vw!important}.home-visit{width:40vw!important}.back-footer-btn{padding:12px 2px!important}.footer-buttons{padding:0% 3%!important;width:100%!important}.continue-btn{width:22vw!important}.main_container{flex-wrap:wrap;height:100%!important}.date_section{overflow:hidden}.date_section .time_selection{height:60%}.datepicker-popover{width:60vw!important}.details_container{height:90%!important;justify-content:space-around}.complete_booking{width:39vw!important}.booking_confirmation,.details-card{width:100%!important}.datetime-header h1{margin:0!important}}@media screen and (max-width: 475px){.main_header{height:10%}.main_body{height:83%}.main_footer{height:7%}.staff-listing{width:100%!important;padding:0% 5%}.booking-confirmation{width:auto;padding:0rem}}\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: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i6.MatCalendar, selector: "mat-calendar", inputs: ["headerComponent", "startAt", "startView", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedChange", "yearSelected", "monthSelected", "viewChanged", "_userSelection", "_userDragDrop"], exportAs: ["matCalendar"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: LettersOnlyDirective, selector: "[simpoLettersOnly]" }, { kind: "directive", type: NumbersOnlyDirective, selector: "[simpoNumbersOnly]" }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i8.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }] }); }
471
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AppointmentBookingComponent, isStandalone: true, selector: "simpo-appointment-booking", inputs: { data: "data", index: "index", edit: "edit", delete: "delete", customClass: "customClass", nextComponentColor: "nextComponentColor" }, host: { listeners: { "window: resize": "getScreenSize($event)", "document:click": "closeOnOutsideClick()" } }, providers: [MessageService], ngImport: i0, template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"screenWidth < 475 ? 'translateY(-100%)' : ''\"></p-toast>\r\n<section class=\"main_section\">\r\n <div class=\"main_header\">\r\n <div class=\"header d-flex justify-content-between align-items-center\">\r\n <div class=\"back-btn d-flex justify-content-center align-items-center cursor-pointer gap-2 mb-3\"\r\n (click)=\"goBack()\">\r\n <mat-icon>keyboard_backspace</mat-icon><span *ngIf=\"screenWidth > 475\">Back to Home</span>\r\n </div>\r\n <div class=\"header-title\">\r\n <h1>Book New Appointment</h1>\r\n <p>{{businessName ?? \"N/A\" }}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width]=\"barWidth + '%'\"></div>\r\n </div>\r\n </div>\r\n <div class=\"main_body w-100 d-flex justify-content-center\"><ng-container *ngIf=\"selectedTab === 'serviceListing'\">\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <ng-container *ngTemplateOutlet=\"serviceListing\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'locationListing'\">\r\n <ng-container *ngTemplateOutlet=\"locationListing\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'staffListing'\">\r\n <ng-container *ngTemplateOutlet=\"staffListing\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'dateSelection'\">\r\n <ng-container *ngTemplateOutlet=\"dateSelection\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='contactDetails'\">\r\n <ng-container *ngTemplateOutlet=\"contactDetails\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='paymentTab'\">\r\n <ng-container *ngTemplateOutlet=\"paymentTab\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='statusTemplate'\">\r\n <ng-container *ngTemplateOutlet=\"statusTemplate\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"main_footer d-flex justify-content-center align-items-center\" *ngIf=\"selectedTab!=='statusTemplate'\">\r\n <div class=\"footer-buttons\"\r\n [ngStyle]=\"{'justify-content': selectedTab != 'serviceListing' ? 'space-between' : 'end'}\">\r\n <span class=\"back-footer-btn cursor-pointer\" (click)=\"previousStep()\"\r\n *ngIf=\"selectedTab != 'serviceListing'\">Back</span>\r\n <button class=\"continue-btn\" [disabled]=\"!activeButton\" (click)=\"nextStep()\"\r\n *ngIf=\"selectedTab!='paymentTab'\">{{!loader ? 'Continue' : 'Loading...'}}</button>\r\n <button class=\"cursor-pointer d-flex justify-content-evenly align-items-center\"\r\n *ngIf=\"selectedTab==='paymentTab'\" (click)=\"checkPayment()\" [disabled]=\"isProcessing\"\r\n [ngClass]=\"{'pay-now-btn' : selectedService?.depositAmount?.depositRequired,'complete_booking' : !selectedService?.depositAmount?.depositRequired}\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/304012c1753440087996Background.png\">\r\n {{selectedService?.depositAmount?.depositRequired ? 'Pay Now' : 'Complete Booking'}}\r\n </button>\r\n </div>\r\n </div>\r\n</section>\r\n<ng-template #serviceListing>\r\n <div class=\"w-60 service_section\">\r\n <div class=\"service-selection\">\r\n <h2>Select a Service</h2>\r\n <p>Choose the service you'd like to book</p>\r\n\r\n <div class=\"services-grid\">\r\n <ng-container *ngFor=\"let service of serviceData\">\r\n <div class=\"\" (click)=\"selectService(service)\"\r\n [ngClass]=\"{ 'service-card-selected' : service?.selected, 'service-card': !service?.selected }\">\r\n <div class=\" service-header\">\r\n <div class=\"service-icon\"><mat-icon>person_outline</mat-icon></div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">{{service?.name ? service?.name : 'N/A'}}</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B9{{service?.priceDetails?.price ?\r\n service?.priceDetails?.price : 'N/A' }}</div>\r\n <div class=\"service-duration\">{{service?.duration ? service?.duration : 'N/A'}} min\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\" *ngIf=\"service?.description\">\r\n {{service?.description ? service?.description : 'N/A'}}\r\n </div>\r\n <div class=\"home-visit\" *ngIf=\"service?.homeAppointmentAvailable\"><img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/982126c1758628863129furniture_16406103.png\">Home\r\n Visit Available</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- <div class=\"service-card\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\">\uD83D\uDC64</div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">General Consultation</div>\r\n <div class=\"service-category\">Medical</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B9800</div>\r\n <div class=\"service-duration\">30 min</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">\r\n Comprehensive health consultation\r\n </div>\r\n </div>\r\n\r\n <div class=\"service-card\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\">\uD83E\uDDE0</div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">Mental Health Counseling</div>\r\n <div class=\"service-category\">Mental Health</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B91500</div>\r\n <div class=\"service-duration\">45 min</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">\r\n Professional psychological support\r\n </div>\r\n <div class=\"home-visit\">Home Visit Available</div>\r\n </div>\r\n\r\n <div class=\"service-card\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\">\u2702</div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">Hair Cut & Styling</div>\r\n <div class=\"service-category\">Beauty</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B91200</div>\r\n <div class=\"service-duration\">45 min</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">\r\n Professional hair cutting and styling\r\n </div>\r\n <div class=\"home-visit\">Home Visit Available</div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #locationListing>\r\n <div class=\"location_section\">\r\n <div class=\"header flex-column align-items-start\">\r\n <h1>Choose Location</h1>\r\n <p>Select where you'd like to receive the service</p>\r\n </div>\r\n\r\n <div class=\"location-list\">\r\n <ng-container *ngFor=\"let location of locationData\">\r\n <div (click)=\"selectLocation(location)\"\r\n [ngClass]=\"{ 'location-card-selected' : location?.selected, 'location-card': !location?.selected }\">\r\n <div class=\"location-content\">\r\n <div class=\"location-info\">\r\n <div class=\"location-icon\"><img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/427226c1758629157758store_3171510.png\">\r\n </div>\r\n <div class=\"location-details\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <h3>{{location?.storeName ? location?.storeName : 'N/A'}}</h3>\r\n <!-- <div class=\"distance\"><mat-icon>location_on</mat-icon> 2.3 km</div> -->\r\n </div>\r\n <p>{{location?.addressDetails?.addressLine}}, {{location?.addressDetails?.city}},\r\n {{location?.addressDetails?.state}} {{location?.pincode}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <div class=\"location-card\">\r\n <div class=\"location-content\">\r\n <div class=\"location-info\">\r\n <div class=\"location-icon branch-icon\"></div>\r\n <div class=\"location-details\">\r\n <h3>Branch Clinic</h3>\r\n <p>456 Care Avenue, Health Zone, Mumbai 400015</p>\r\n </div>\r\n </div>\r\n <div class=\"distance\">5.8 km</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"location-card\">\r\n <div class=\"location-content\">\r\n <div class=\"location-info\">\r\n <div class=\"location-icon home-icon\"></div>\r\n <div class=\"location-details\">\r\n <h3>Home Visit</h3>\r\n <p>Your Location</p>\r\n </div>\r\n </div>\r\n <div class=\"distance\">0 km</div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #staffListing>\r\n <div class=\"w-60 overflow-hidden staff-listing\">\r\n <div class=\"d-flex w-100 h-100\">\r\n <div class=\"w-100\">\r\n <!-- Header Section -->\r\n <div class=\"staff-header mb-3\">\r\n <h1>Select Staff Member</h1>\r\n <p class=\"staff-subtitle mb-0\">Choose your preferred professional</p>\r\n </div>\r\n\r\n <!-- Staff Cards -->\r\n <div class=\"d-flex flex-column gap-4 staff-list\">\r\n <ng-container *ngFor=\"let staff of staffData\">\r\n <div class=\"card rounded-3 p-3\" (click)=\"selectStaff(staff)\"\r\n [ngClass]=\"{ 'staff-card-selected' : staff?.selected, 'staff-card': !staff?.selected }\">\r\n <div class=\"d-flex align-items-start justify-content-between\">\r\n <div class=\"d-flex align-items-start flex-grow-1\">\r\n <div\r\n class=\"staff-avatar rounded-circle d-flex align-items-center justify-content-center me-4\">\r\n {{staff?.staffName.slice(0,3).toUpperCase()}}\r\n </div>\r\n <div class=\"staff-details flex-grow-1\">\r\n <h3 class=\"staff-name\">{{staff?.staffName ? staff?.staffName : 'N/A'}}</h3>\r\n <p class=\"staff-specialty\">General Medicine</p>\r\n <!-- <p class=\"staff-description mb-0\">Experienced physician with 10+ years in\r\n general\r\n medicine and wellness care.</p> -->\r\n </div>\r\n </div>\r\n <!-- <div class=\"rating-section\">\r\n <div class=\"star-rating d-flex align-items-center\">\r\n <span class=\"star-icon\"></span>\r\n <span class=\"rating-number\">4.9</span>\r\n </div>\r\n <div class=\"review-count\">156 reviews</div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #dateSelection>\r\n <div class=\"w-60 date_section\">\r\n <div class=\"row justify-content-center h-100\">\r\n <div class=\"col-12 h-100\">\r\n <div class=\"datetime-header mb-2\">\r\n <h1>Select Date & Time</h1>\r\n <p class=\"datetime-subtitle mb-0\">Choose when you'd like your appointment</p>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"d-flex gap-4 main_container\">\r\n <!-- Left Column - Date Selection -->\r\n <div [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\">\r\n <div class=\"section-card card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Select Date</h3>\r\n\r\n <div class=\"date-picker-container d-flex align-items-center justify-content-between\"\r\n (click)=\"$event.stopPropagation()\">\r\n <input type=\"text\" class=\"date-input border-0 rounded-2\" placeholder=\"dd-mm-yyyy\"\r\n [value]=\"selectedDateStr\" readonly (click)=\"toggleCalendar($event)\">\r\n\r\n <mat-icon class=\"ms-2\" (click)=\"toggleCalendar($event)\">calendar_today</mat-icon>\r\n </div>\r\n <div class=\"position-relative\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"datepicker-popover\" *ngIf=\"showCalendar\">\r\n <mat-calendar [(selected)]=\"selectedDate\" [dateFilter]=\"dateFilter\"\r\n (selectedChange)=\"onDateSelected($event)\" class=\"datepicker-calendar\">\r\n </mat-calendar>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Right Column - Time Selection -->\r\n <div class=\"time_selection\" [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\">\r\n <div class=\"section-card card h-100 rounded-3 p-4\">\r\n <h3 class=\"section-title\">Available Times</h3>\r\n\r\n <!-- Time Slots Grid -->\r\n <div class=\"row g-2 mb-4 overflow-scroll\">\r\n <ng-container *ngIf=\"!skeletonLoader ;else slotsLoader\">\r\n <div class=\"col-4\" *ngFor=\"let time of locationTiming\">\r\n <div class=\"time-slot rounded-2\" [class.selected]=\"time.selected\"\r\n (click)=\"selectTimeSlot(time)\">{{time ?\r\n time?.value : 'N/A'}}</div>\r\n </div>\r\n </ng-container>\r\n <ng-template #slotsLoader>\r\n <!-- Time Slot Grid Skeleton Loader HTML -->\r\n <div class=\"time-slot-grid\">\r\n <!-- Row 1 -->\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n\r\n <!-- Row 2 -->\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n\r\n <!-- Row 3 -->\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n\r\n <!-- Row 4 -->\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n\r\n <!-- Row 5 -->\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n\r\n <!-- Row 6 -->\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n </div>\r\n\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Waitlist Section -->\r\n <!-- <div class=\"waitlist-section rounded-3\">\r\n <div class=\"d-flex align-items-start\">\r\n <div class=\"d-flex h-100 justify-content-between flex-column\">\r\n <div class=\"waitlist-title d-flex align-items-center gap-2\"><span\r\n class=\"waitlist-icon check-icon\"></span>No\r\n slots available?</div>\r\n <div class=\"waitlist-description d-flex align-items-center gap-2\">\r\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\"\r\n id=\"flexCheckChecked\">\r\n Add me to the waitlist for earlier\r\n availability\r\n </div>\r\n </div>\r\n <div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-template>\r\n<ng-template #contactDetails>\r\n <div class=\"w-60 contact_section overflow-hidden\">\r\n <div class=\"d-flex h-100\">\r\n <div class=\"h-100 w-100\">\r\n <!-- Header Section -->\r\n <div class=\"contact-header mb-2\">\r\n <h1>Contact Details</h1>\r\n <p class=\"contact-subtitle mb-0\">Provide your contact information</p>\r\n </div>\r\n\r\n <!-- Form Sections -->\r\n <div class=\"d-flex gap-3 details_container flex-column w-100\">\r\n <!-- Left Column - Personal Information -->\r\n <div class=\"d-flex gap-4\">\r\n <div\r\n [ngClass]=\"{'w-50' : selectedService?.homeAppointmentAvailable, 'w-100' : !selectedService?.homeAppointmentAvailable}\">\r\n <div class=\"form-section card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Personal Information</h3>\r\n\r\n <!-- Full Name -->\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Full Name\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.name\"\r\n (ngModelChange)=\"checkRequiredValues()\" simpoLettersOnly>\r\n </div>\r\n\r\n <!-- Email Address -->\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Email Address\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"email\" class=\"form-control form-input rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.email\"\r\n (ngModelChange)=\"checkRequiredValues()\"\r\n pattern=\"^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$\">\r\n </div>\r\n\r\n <!-- Phone Number -->\r\n <div class=\"mb-0\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Phone Number\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"tel\" class=\"form-control rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.phoneNumber\"\r\n (ngModelChange)=\"checkRequiredValues()\" simpoNumbersOnly\r\n [ngClass]=\"{'mobile_number' : appointmentPayload.customerDetail.phoneNumber.length != 10}\">\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Right Column - Home Visit Details -->\r\n <div class=\"w-50\" *ngIf=\"selectedService?.homeAppointmentAvailable\">\r\n <div class=\"form-section card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Home Visit Details</h3>\r\n\r\n <!-- Home Address -->\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Home Address\r\n </label>\r\n <textarea class=\"form-control form-textarea rounded-2\"\r\n placeholder=\"Enter your complete address\" [(ngModel)]=\"homeAddress\"></textarea>\r\n </div>\r\n\r\n <!-- Special Instructions -->\r\n <div class=\"mb-0\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Special Instructions\r\n </label>\r\n <textarea class=\"form-control form-textarea rounded-2\"\r\n placeholder=\"Any special instructions for the professional (optional)\"\r\n [(ngModel)]=\"instructions\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"policies-container\">\r\n <!-- Header -->\r\n <h2 class=\"policies-title\">Policies & Terms</h2>\r\n\r\n <!-- Policy Items -->\r\n <div class=\"policy-items-container d-flex flex-column gap-3\">\r\n <!-- Cancellation Policy -->\r\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\r\n (click)=\"showCancellationPolicy = !showCancellationPolicy\">\r\n <h3 class=\"policy-title\">Cancellation Policy</h3>\r\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\r\n *ngIf=\"!showCancellationPolicy\">keyboard_arrow_right</mat-icon>\r\n <mat-icon *ngIf=\"showCancellationPolicy\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\r\n *ngIf=\"showCancellationPolicy\">\r\n <span *ngFor=\"let policy of selectedService?.cancellationPolicy\">&#8226;\r\n {{policy}}</span>\r\n </div>\r\n\r\n <!-- Rescheduling Policy -->\r\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\r\n (click)=\"showReducingPolicy = !showReducingPolicy\">\r\n <h3 class=\"policy-title\">Rescheduling Policy</h3>\r\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\r\n *ngIf=\"!showReducingPolicy\">keyboard_arrow_right</mat-icon>\r\n <mat-icon *ngIf=\"showReducingPolicy\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\r\n *ngIf=\"showReducingPolicy\">\r\n <span *ngFor=\"let policy of selectedService?.reschedulePolicy\">&#8226; {{policy}}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Acceptance Section -->\r\n <div class=\"acceptance-section\">\r\n <input type=\"checkbox\" class=\"custom-checkbox\" [(ngModel)]=\"termsAndConditions\"\r\n (ngModelChange)=\"checkRequiredValues()\">\r\n <p class=\"acceptance-text\">\r\n I understand and accept the cancellation & rescheduling policies and\r\n <span class=\"terms-link\">Terms & Conditions<span\r\n class=\"external-link-icon\"></span></span>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #paymentTab>\r\n <div class=\"w-60 payment_section\">\r\n <div class=\"w-100 h-100\">\r\n <div class=\"w-100 d-flex justify-content-center align-items-center flex-column\">\r\n <!-- Header Section -->\r\n <div class=\"payment-header mb-3 w-100\">\r\n <h1>Payment & Confirmation</h1>\r\n <p class=\"payment-subtitle mb-0\">Review your booking and complete payment</p>\r\n </div>\r\n\r\n <!-- Booking Summary Card -->\r\n <div class=\"booking-summary-card\" [ngClass]=\"{'w-100' : screenWidth < 475,'w-50':screenWidth > 475}\">\r\n <h2 class=\"summary-title\">Booking Summary</h2>\r\n\r\n <!-- Service -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Service</div>\r\n <div class=\"summary-value\">{{selectedService?.name ? selectedService?.name : 'N/A'}}</div>\r\n </div>\r\n\r\n <!-- Professional -->\r\n <div class=\"summary-row\" *ngIf=\"selectedStaff?.staffName\">\r\n <div class=\"summary-label\">Professional</div>\r\n <div class=\"summary-value\">{{selectedStaff?.staffName ? selectedStaff?.staffName : 'N/A'}}</div>\r\n </div>\r\n\r\n <!-- Location -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Location</div>\r\n <div class=\"summary-value\">{{selectedLocation?.storeName ? selectedLocation?.storeName : 'N/A'}}\r\n </div>\r\n </div>\r\n\r\n <!-- Date & Time -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Date & Time</div>\r\n <div class=\"summary-value\">{{selectedDateStr ? (selectedDateStr) : 'N/A'}} at\r\n {{selectedTime ? selectedTime.value : 'N/A'}}</div>\r\n </div>\r\n\r\n <!-- Duration -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Duration</div>\r\n <div class=\"summary-value\">{{selectedService?.duration ? selectedService?.duration : 'N/A'}}\r\n minutes</div>\r\n </div>\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Tax Percent</div>\r\n <div class=\"summary-value\">{{selectedService?.priceDetails?.taxPercent ?\r\n selectedService?.priceDetails?.taxPercent : 0}}%</div>\r\n </div>\r\n <!-- Total -->\r\n <div class=\"summary-row total-row\">\r\n <div class=\"summary-label\">Total</div>\r\n <div class=\"summary-value\">\r\n <span class=\"currency-symbol\">\u20B9</span>{{selectedService?.priceDetails?.totalPrice ?\r\n selectedService?.priceDetails?.totalPrice : '0'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #statusTemplate>\r\n <div class=\"booking-confirmation\">\r\n <!-- Success Icon -->\r\n <div class=\"success-icon\">\r\n <div class=\"checkmark-circle\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/881293c1758695578518success.gif\"\r\n class=\"w-100 h-100\" *ngIf=\"apiStatus\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/325000c1758695564518fail.gif\"\r\n class=\"w-100 h-100\" *ngIf=\"!apiStatus\">\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"confirmation-content\">\r\n <h1 class=\"confirmation-title\">{{apiStatus ? 'Booking Confirmed!' : 'Booking Failed'}}</h1>\r\n <p class=\"confirmation-message\">\r\n {{apiStatus ? 'Your appointment has been successfully booked.':'Failed to book you appointment. Please\r\n try again later'}}\r\n </p>\r\n\r\n <!-- Details Card -->\r\n <div class=\"d-flex w-100 align-items-center justify-content-center\" *ngIf=\"apiStatus\">\r\n <div class=\"details-card\">\r\n <h3 class=\"details-title\">Appointment Details</h3>\r\n\r\n <div class=\"details-row\">\r\n <span class=\"detail-label\">Service</span>\r\n <span class=\"detail-value\">{{appointmentPayload.serviceDetail?.name ?\r\n appointmentPayload.serviceDetail?.name : 'N/A'}}</span>\r\n </div>\r\n\r\n <div class=\"details-row\" *ngIf=\"appointmentPayload?.staffDetail?.name\">\r\n <span class=\"detail-label\">Professional</span>\r\n <span class=\"detail-value\">{{appointmentPayload.staffDetail?.name ?\r\n appointmentPayload.staffDetail?.name : 'N/A'}}</span>\r\n </div>\r\n <div class=\"details-row\">\r\n <span class=\"detail-label\">Date & Time</span>\r\n <span class=\"detail-value\">{{appointmentPayload.bookingDate ?\r\n appointmentPayload.bookingDate.slice(0,10) :\r\n 'N/A'}} at\r\n {{appointmentPayload.startTime ? appointmentPayload.startTime : 'N/A'}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <!-- Action Buttons -->\r\n <!-- <div class=\"action-buttons\">\r\n <button class=\"btn btn-outline\">View My Bookings</button>\r\n <button class=\"btn btn-primary\">Back to Admin</button>\r\n </div> -->\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #skeletonLoader *ngIf=\"skeletonLoader\">\r\n <!-- Service Skeleton Loader HTML -->\r\n <div class=\"service-grid\">\r\n <!-- Skeleton Card 1 -->\r\n <div class=\"service-card skeleton-card\">\r\n <div class=\"service-header\">\r\n <div class=\"skeleton skeleton-icon\"></div>\r\n <div class=\"service-content\">\r\n <div class=\"skeleton skeleton-title\"></div>\r\n <div class=\"skeleton skeleton-price\"></div>\r\n <div class=\"skeleton skeleton-duration\"></div>\r\n </div>\r\n </div>\r\n <div class=\"skeleton skeleton-category\"></div>\r\n <div class=\"skeleton skeleton-description\"></div>\r\n <div class=\"skeleton skeleton-badge\"></div>\r\n </div>\r\n\r\n <!-- Skeleton Card 2 -->\r\n <div class=\"service-card skeleton-card\">\r\n <div class=\"service-header\">\r\n <div class=\"skeleton skeleton-icon\"></div>\r\n <div class=\"service-content\">\r\n <div class=\"skeleton skeleton-title\"></div>\r\n <div class=\"skeleton skeleton-price\"></div>\r\n <div class=\"skeleton skeleton-duration\"></div>\r\n </div>\r\n </div>\r\n <div class=\"skeleton skeleton-category\"></div>\r\n <div class=\"skeleton skeleton-description\"></div>\r\n <div class=\"skeleton skeleton-badge\"></div>\r\n </div>\r\n\r\n <!-- Skeleton Card 3 -->\r\n <div class=\"service-card skeleton-card\">\r\n <div class=\"service-header\">\r\n <div class=\"skeleton skeleton-icon\"></div>\r\n <div class=\"service-content\">\r\n <div class=\"skeleton skeleton-title\"></div>\r\n <div class=\"skeleton skeleton-price\"></div>\r\n <div class=\"skeleton skeleton-duration\"></div>\r\n </div>\r\n </div>\r\n <div class=\"skeleton skeleton-category\"></div>\r\n <div class=\"skeleton skeleton-description\"></div>\r\n <div class=\"skeleton skeleton-badge\"></div>\r\n </div>\r\n\r\n <!-- Skeleton Card 4 -->\r\n <div class=\"service-card skeleton-card\">\r\n <div class=\"service-header\">\r\n <div class=\"skeleton skeleton-icon\"></div>\r\n <div class=\"service-content\">\r\n <div class=\"skeleton skeleton-title\"></div>\r\n <div class=\"skeleton skeleton-price\"></div>\r\n <div class=\"skeleton skeleton-duration\"></div>\r\n </div>\r\n </div>\r\n <div class=\"skeleton skeleton-category\"></div>\r\n <div class=\"skeleton skeleton-description\"></div>\r\n <div class=\"skeleton skeleton-badge\"></div>\r\n </div>\r\n\r\n <!-- Skeleton Card 5 -->\r\n <div class=\"service-card skeleton-card\">\r\n <div class=\"service-header\">\r\n <div class=\"skeleton skeleton-icon\"></div>\r\n <div class=\"service-content\">\r\n <div class=\"skeleton skeleton-title\"></div>\r\n <div class=\"skeleton skeleton-price\"></div>\r\n <div class=\"skeleton skeleton-duration\"></div>\r\n </div>\r\n </div>\r\n <div class=\"skeleton skeleton-category\"></div>\r\n <div class=\"skeleton skeleton-description\"></div>\r\n <div class=\"skeleton skeleton-badge\"></div>\r\n </div>\r\n\r\n <!-- Skeleton Card 6 -->\r\n <div class=\"service-card skeleton-card\">\r\n <div class=\"service-header\">\r\n <div class=\"skeleton skeleton-icon\"></div>\r\n <div class=\"service-content\">\r\n <div class=\"skeleton skeleton-title\"></div>\r\n <div class=\"skeleton skeleton-price\"></div>\r\n <div class=\"skeleton skeleton-duration\"></div>\r\n </div>\r\n </div>\r\n <div class=\"skeleton skeleton-category\"></div>\r\n <div class=\"skeleton skeleton-description\"></div>\r\n <div class=\"skeleton skeleton-badge\"></div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;background-color:#fff;color:#000;line-height:1.6}.main_section{position:relative;height:100%}.main_header{padding:1%;width:100%;background:#fff;height:15%}.main_body{height:75%;padding-top:0%;overflow:scroll}.header{display:flex;align-items:center;justify-content:space-between}.back-btn mat-icon{height:16px!important;width:20px!important;font-size:21px!important}.back-btn span{color:#000;font-size:15px;font-weight:500}.back-btn:hover{background-color:#f0f0f0}.header-title{flex-grow:1;margin-left:2rem}.header-title h1{font-size:20px;font-weight:600;margin-bottom:0}.header-title p{color:#666;font-size:14px}.step-indicator{font-size:14px;color:#000;font-weight:700}.progress-bar{width:100%;height:8px;background-color:#e0e0e0;margin-bottom:1rem;border-radius:10px;overflow:hidden}.w-60{width:60%!important}.progress-fill{height:100%;width:14.28%;background-color:#000}.service-selection h2{font-size:20px;font-weight:600;margin:.25rem 0}.service-selection p{color:#666;font-size:16px;margin-bottom:1rem}.main_footer{border-top:1px solid lightgrey;width:100%;background-color:#fff;height:10%}.services-grid{display:grid;grid-template-columns:48% 48%;gap:15px;padding-bottom:5px}.service-card{border:1px solid lightgrey;border-radius:8px;padding:24px;background-color:#fff;cursor:pointer;transition:all .3s ease;position:relative}.service-card:hover{background-color:#f9f9f9;box-shadow:0 4px 8px #0000001a}.service-card-selected{border:2px solid black;border-radius:8px;padding:24px;background-color:#fff;cursor:pointer;transition:all .3s ease;position:relative}.service-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:3rem}.service-info{flex-grow:1}.service-icon{width:40px;height:40px;border-radius:8px;background-color:#f0f0f0;display:flex;align-items:center;justify-content:center;margin-right:1rem;font-size:20px;margin-top:.2rem}.service-title{font-size:18px;font-weight:600;margin-bottom:4px}.service-category{background-color:#f0f0f0;color:#000;padding:1% 4%;border-radius:12px;font-size:12px;font-weight:500;display:inline-block}.service-price{font-size:17px;font-weight:700;color:#000}.service-duration{font-size:12px;color:#666;display:flex;justify-content:center;align-items:center}.service-description{color:#666;font-size:15px;margin-bottom:.5rem;line-height:1.5}.home-visit{display:flex;align-items:center;font-size:12px;color:#666;border:1px solid lightgrey;padding:.5% 1%;border-radius:4px;background-color:#fff;width:10vw;height:3vh;white-space:nowrap;justify-content:space-around}.home-visit img{width:18px}.footer-buttons{display:flex;justify-content:space-between;align-items:center;width:60%}.back-footer-btn{color:#000;padding:12px 24px;font-size:16px}.continue-btn{background-color:#000;color:#fff;border:2px solid black;padding:.5%;border-radius:4px;font-size:15px!important;font-weight:600;cursor:pointer;width:6vw!important}.continue-btn:hover{background-color:#333}.continue-btn:disabled{background-color:#ccc;border-color:#ccc;cursor:not-allowed}.location_section{width:60%;overflow:hidden}.location_section .header h1{font-size:20px;font-weight:600;margin:.25rem 0}.location_section .header p{font-size:16px;color:#888;font-weight:400}.location-list{display:flex;flex-direction:column;gap:20px;height:64vh;overflow-x:scroll;padding-bottom:1%}.location-card{border:1px solid lightgrey;border-radius:12px;padding:1.5rem 1.5rem 2rem;cursor:pointer;transition:all .3s ease}.location-card:hover{box-shadow:0 4px 8px #0000001a}.location-card-selected{border:1px solid black;border-radius:12px;padding:1.5rem 1.5rem 2rem;cursor:pointer;transition:all .3s ease}.location-content{display:flex;align-items:center;justify-content:space-between}.location-info{display:flex;align-items:center;flex-grow:1}.location-icon{width:40px;height:40px;background-color:#d3d3d3;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-right:20px}.location-icon img{width:28px}.location-details{width:95%}.location-details h3{font-size:16px;font-weight:600;margin-bottom:0}.location-details p{font-size:14px;color:#aaa;line-height:1.4;margin:0}.distance{display:flex;align-items:center;color:#888;font-size:14px;margin-left:20px}.distance mat-icon{width:18px!important;height:15px!important;font-size:17px}.staff-header h1{font-size:20px;font-weight:600;margin:.25rem 0}.staff-subtitle{font-size:16px;color:#888;font-weight:400}.staff-card{border:1px solid lightgrey;cursor:pointer;transition:all .3s ease}.staff-card:hover{box-shadow:0 4px 8px #0000001a}.staff-card-selected{border-color:#666;cursor:pointer;transition:all .3s ease}.staff-avatar{width:64px;height:64px;background-color:gray;font-size:20px;font-weight:600;color:#fff}.staff-name{font-size:16px;font-weight:600;margin-bottom:0}.staff-specialty{font-size:14px;color:gray;margin-bottom:8px}.staff-description{font-size:14px;color:gray;line-height:1.4}.rating-section{display:flex;flex-direction:column;align-items:flex-end}.star-rating{color:gold;font-size:16px;margin-bottom:4px;width:100%}.rating-number{font-size:18px;font-weight:600;color:#000}.review-count{font-size:12px;color:#888}.star-icon:before{content:\"\\2b50\";margin-right:4px}.staff_section{width:60%;overflow:hidden}.staff-list{height:64vh;overflow-x:scroll;padding-bottom:1%}.datetime-header h1{font-size:20px;font-weight:600;margin:.25rem 0}.main_container{height:85%}.datetime-subtitle{font-size:16px;color:#888;font-weight:400}.section-card{border:1px solid lightgrey}.section-title{font-size:17px;font-weight:600;margin-bottom:20px}.date-picker-container{border:1px solid lightgrey}.date-picker-container mat-icon{height:17px;font-size:18px}.date-input{font-size:16px;padding:2%;width:auto;outline:none}.time-slot{border:1px solid lightgrey;font-size:14px;font-weight:500;padding:6%;cursor:pointer;transition:all .3s ease;text-align:center;min-width:80px}.time-slot:hover{box-shadow:0 4px 8px #0000001a}.time-slot.selected{background-color:#555;border-color:#777;color:#fff}.waitlist-section{background-color:#789;border:none;padding:4%;max-height:13vh}.waitlist-icon{color:#4ade80;font-size:18px}.waitlist-title{color:#fff;font-size:16px;font-weight:500;margin-bottom:8px}.mobile_number{border-color:#dc3545!important;box-shadow:0 0 0 .1rem #ffc3c3}.waitlist-description{color:#fff;font-size:14px;margin-bottom:0;font-weight:500}.waitlist-description .form-check-input{width:17px;height:17px;background-color:transparent}.waitlist-description .form-check-input:checked{background-color:#0d6efd}.check-icon:before{content:\"\\2713\"}.contact-header h1{font-size:20px;font-weight:600;margin:.25rem 0}.contact-subtitle{font-size:16px;color:#888;font-weight:400}.form-section{border:1px solid lightgrey}.section-title{font-size:16px;font-weight:600;margin-bottom:24px}.form-label{font-size:14px;font-weight:500;margin-bottom:8px}.required-asterisk{color:#ff6b6b;margin-left:4px}.form-input{border:1px solid lightgrey;font-size:16px;padding:1%;transition:all .3s ease}.form-input:focus{border-color:#777}.form-input::placeholder{color:#aaa;font-size:14px}.form-textarea{border:1px solid lightgrey;font-size:16px;padding:12px 16px;resize:vertical;max-height:120px;transition:all .3s ease}.form-textarea:focus{border-color:#777}.form-textarea::placeholder{color:#aaa;font-size:14px}.optional-label{color:#888;font-size:12px;font-style:italic}.details_container{height:89%;overflow-x:scroll;padding-bottom:1%}.policies-container{background-color:#fff;border:1px solid lightgrey;padding:2rem;border-radius:12px}.policies-title{font-size:16px;font-weight:600;color:#000;margin-bottom:1rem}.policy-item{background-color:#fff;border:1px solid lightgrey;border-radius:8px;padding:1%;cursor:pointer;transition:all .3s ease}.cancellation_policies{padding:1% .5%;font-weight:500}.policy-item:hover{background-color:#f8f9fa;border-color:#ccc}.policy-item:last-of-type{margin-bottom:32px}.policy-title{font-size:14px;font-weight:500;color:#000;margin:0}.acceptance-section{display:flex;align-items:flex-start;gap:7px;margin-top:8px}.custom-checkbox{width:18px;height:20px;background-color:#fff;border:1px solid lightgrey;border-radius:4px;margin-top:2px;cursor:pointer;position:relative;flex-shrink:0;transition:all .3s ease}.custom-checkbox:hover{border-color:#999;background-color:#f8f9fa}.custom-checkbox.checked{background-color:#007bff;border-color:#007bff}.custom-checkbox.checked:after{content:\"\\2713\";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;font-size:12px;font-weight:700}.acceptance-text{font-size:14px;color:#000;line-height:1.5;margin:0}.terms-link{color:#007bff;text-decoration:none;font-weight:500;position:relative}.terms-link:hover{color:#0056b3;text-decoration:underline}.external-link-icon{margin-left:4px;font-size:12px;opacity:.8}.external-link-icon:after{content:\"\\2197\"}.payment-header h1{font-size:20px;font-weight:600;color:#000;margin:.25rem 0}.payment-subtitle{font-size:16px;color:#666;font-weight:400}.booking-summary-card{background-color:#fff;border:1px solid lightgrey;padding:2%;border-radius:12px}.summary-title{font-size:18px;font-weight:600;color:#000;margin-bottom:32px}.summary-row{display:flex;justify-content:space-between;align-items:center;padding:12px 0}.summary-row:last-child{border-bottom:none;padding-bottom:0}.summary-label{font-size:16px;color:#000;font-weight:500}.summary-value{font-size:16px;color:#000;font-weight:400;text-align:right}.total-row{margin-top:16px;padding-top:16px}.total-row .summary-label,.total-row .summary-value{font-size:20px;font-weight:600}.currency-symbol{font-size:18px}.complete_booking{background:#e3fee3;border:none;padding:.5%;width:12vw!important;font-size:15px!important;font-weight:500;border-radius:4px;white-space:nowrap}.complete_booking img{width:30px}.pay-now-btn{justify-content:unset!important;background:#e3fee3;border:none;padding:.5%;width:8vw!important;font-size:15px!important;font-weight:500;border-radius:4px;gap:.5rem}.pay-now-btn img{width:30px}.booking-confirmation{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;width:60%;border-radius:10px}.success-icon{margin-bottom:1.5rem}.checkmark-circle{width:80px;height:80px;position:relative}.checkmark{width:80px;height:80px;border-radius:50%;display:block;stroke-width:3;stroke:#22c55e;stroke-miterlimit:10;animation:checkmark-fill .4s ease-in-out .4s forwards,checkmark-scale .3s ease-in-out .9s both}.checkmark-circle-path{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:3;stroke-miterlimit:10;stroke:#22c55e;fill:none;animation:checkmark-stroke .6s cubic-bezier(.65,0,.45,1) forwards}.checkmark-check{transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;stroke:#22c55e;stroke-width:3;animation:checkmark-stroke .3s cubic-bezier(.65,0,.45,1) .8s forwards}@keyframes checkmark-stroke{to{stroke-dashoffset:0}}@keyframes checkmark-scale{0%,to{transform:none}50%{transform:scale3d(1.1,1.1,1)}}@keyframes checkmark-fill{to{box-shadow:inset 0 0 0 30px #22c55e}}.confirmation-content{width:100%;height:80%}.confirmation-title{font-size:18px;font-weight:700}.confirmation-message{font-size:1rem;margin-bottom:1rem;line-height:1.6;font-weight:500}.details-card{background:#ffffff1a;border:1px solid lightgrey;border-radius:16px;padding:1.5rem;margin-bottom:2rem;width:35vw}.details-title{font-size:1.25rem;font-weight:600;margin:0 0 1.5rem}.details-row{display:flex;justify-content:space-between;align-items:center;padding:.75rem 0;border-bottom:1px solid rgba(255,255,255,.1)}.details-row:last-child{border-bottom:none}.detail-label{font-size:.9rem;font-weight:500}.detail-value{font-weight:600;font-size:1rem}.action-buttons{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap}.btn{padding:.75rem 1.5rem;border-radius:8px;font-weight:600;font-size:.9rem;cursor:pointer;transition:all .2s ease;border:none;min-width:140px}.btn-outline{background:transparent;border:2px solid rgba(255,255,255,.3);color:#fff}.btn-outline:hover{background:#ffffff1a;border-color:#ffffff80}.btn-primary{background:#fff;color:#1f2937}.btn-primary:hover{background:#f3f4f6;transform:translateY(-1px)}.datepicker-popover{position:absolute;z-index:1000;margin-top:8px;border-radius:16px;overflow:hidden;box-shadow:0 12px 28px #0000001f,0 2px 4px #00000014;background:#fff;border:1px solid rgba(0,0,0,.06);width:17vw}::ng-deep .datepicker-calendar{border-radius:16px!important;overflow:hidden!important;font-family:Segoe UI,Roboto,sans-serif!important;width:100%!important}::ng-deep .mat-calendar-header{background:linear-gradient(135deg,#667eea,#764ba2)!important;color:#fff!important;padding:3px!important;display:flex!important;align-items:center!important;justify-content:space-between!important;min-height:60px!important;border-radius:16px 16px 0 0!important}::ng-deep .mat-calendar-controls{display:flex!important;align-items:center!important;justify-content:space-between!important;width:100%!important;margin:2% calc(4.7142857143% - 16px)!important}::ng-deep .mat-calendar-period-button{color:#fff!important;font-weight:700!important;font-size:16px!important;letter-spacing:.5px!important;background:transparent!important;border:none!important;padding:12px 16px!important;border-radius:8px!important;transition:all .3s ease!important;flex-grow:1!important;text-align:left!important;margin:0!important;order:1!important}::ng-deep .mat-calendar-period-button:hover{background:#ffffff26!important;transform:translateY(-1px)!important}::ng-deep .mat-calendar-header .mat-calendar-controls>div{display:flex;order:2!important}::ng-deep .mat-calendar-previous-button,::ng-deep .mat-calendar-next-button{color:#fff!important;width:40px!important;height:40px!important;border-radius:50%!important;background:#ffffff1a!important;border:1px solid rgba(255,255,255,.2)!important;transition:all .3s ease!important;margin:0 4px!important;display:flex!important;align-items:center!important;justify-content:center!important}::ng-deep .mat-calendar-previous-button:hover,::ng-deep .mat-calendar-next-button:hover{background:#ffffff40!important;transform:scale(1.05)!important}::ng-deep .mat-calendar-arrow{fill:#fff!important;width:20px!important;height:20px!important}::ng-deep .mat-calendar-content{padding:10px 16px!important;background:#fff!important}::ng-deep .mat-calendar-table-header th{color:#6b7280!important;font-weight:600!important;font-size:12px!important;text-align:center!important;padding-bottom:12px!important;text-transform:uppercase!important}::ng-deep .mat-calendar-table{border-spacing:0!important;border-collapse:collapse!important;width:100%!important}::ng-deep .mat-calendar-body-cell{height:44px!important;width:44px!important;border-radius:12px!important}::ng-deep .mat-calendar-body-cell-content{width:33px!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important;font-weight:500!important;font-size:14px!important;color:#374151!important;transition:all .3s cubic-bezier(.4,0,.2,1)!important}::ng-deep .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover .mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background:#667eea1a!important;color:#667eea!important;transform:scale(1.05)!important}::ng-deep .mat-calendar-body-selected{background:linear-gradient(135deg,#667eea,#764ba2)!important;color:#fff!important;box-shadow:0 4px 12px #677eea4d!important}::ng-deep .mat-calendar-body-today:not(.mat-calendar-body-selected){border:none;color:#667eea!important;font-weight:700!important}::ng-deep .mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:#d1d5db!important}.service-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;padding:20px;width:60%}.service-card{border:1px solid #e5e5e5;border-radius:8px;padding:20px;background:#fff;box-shadow:0 2px 4px #0000001a}.service-header{display:flex;align-items:flex-start;gap:15px;margin-bottom:15px}.service-content{flex:1;display:flex;flex-direction:column;gap:8px}.skeleton{background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%;animation:skeleton-loading 1.5s infinite;border-radius:4px}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-icon{width:40px;height:40px;border-radius:50%;flex-shrink:0}.skeleton-title{height:20px;width:70%}.skeleton-price{height:18px;width:50%;align-self:flex-end}.skeleton-duration{height:14px;width:40%;align-self:flex-end}.skeleton-category{height:24px;width:25%;border-radius:12px;margin-bottom:10px}.skeleton-description{height:16px;width:85%;margin-bottom:15px}.skeleton-badge{height:32px;width:45%;border-radius:16px;margin-top:10px}@media (max-width: 768px){.service-grid{grid-template-columns:1fr;gap:15px;padding:15px}.service-card{padding:15px}}.time-slot-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;padding:16px;max-width:400px;margin:0 auto}.skeleton-time-slot{height:44px;border-radius:8px;background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%;animation:skeleton-shimmer 1.5s infinite;border:1px solid #e5e5e5;position:relative}@keyframes skeleton-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-time-slot:nth-child(2n){animation:skeleton-pulse 2s infinite}@keyframes skeleton-pulse{0%,to{opacity:1}50%{opacity:.7}}@media (max-width: 480px){.time-slot-grid{grid-template-columns:repeat(2,1fr);gap:10px;padding:12px}.skeleton-time-slot{height:40px}}@media (max-width: 320px){.time-slot-grid{grid-template-columns:1fr}}@media screen and (min-width:320px) and (max-width:475px){.back-btn{gap:.25rem!important;margin:0!important}.back-btn span{color:#000;font-size:12px;font-weight:500;white-space:nowrap}.back-btn mat-icon{font-size:16px!important;margin-bottom:0!important}.header-title{display:flex;align-items:center;margin-bottom:0rem!important}.header-title h1{font-size:16px!important}.main_header .header{padding:3%}.date_section,.service_section,.location_section,.contact_section,.payment_section{width:100%!important;padding:0% 5%}.service_section h2{font-size:17px!important;margin-bottom:0!important}.service_section p{font-size:14px!important}.main_section{height:100vh}.services-grid{display:flex;justify-content:center;flex-wrap:wrap}.service-card,.service-card-selected{width:90vw!important}.home-visit{width:40vw!important}.back-footer-btn{padding:12px 2px!important}.footer-buttons{padding:0% 3%!important;width:100%!important}.continue-btn{width:22vw!important}.main_container{flex-wrap:wrap;height:100%!important}.date_section{overflow:hidden}.date_section .time_selection{height:60%}.datepicker-popover{width:60vw!important}.details_container{height:90%!important;justify-content:space-around}.complete_booking{width:39vw!important}.booking_confirmation,.details-card{width:100%!important}.datetime-header h1{margin:0!important}}@media screen and (max-width: 475px){.main_header{height:10%}.main_body{height:83%}.main_footer{height:7%}.staff-listing{width:100%!important;padding:0% 5%}.booking-confirmation{width:auto;padding:0rem}}\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: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i6.MatCalendar, selector: "mat-calendar", inputs: ["headerComponent", "startAt", "startView", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedChange", "yearSelected", "monthSelected", "viewChanged", "_userSelection", "_userDragDrop"], exportAs: ["matCalendar"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i7.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i7.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: LettersOnlyDirective, selector: "[simpoLettersOnly]" }, { kind: "directive", type: NumbersOnlyDirective, selector: "[simpoNumbersOnly]" }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i8.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }] }); }
472
472
  }
473
473
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppointmentBookingComponent, decorators: [{
474
474
  type: Component,
475
- args: [{ selector: 'simpo-appointment-booking', standalone: true, imports: [CdkDragPlaceholder, CommonModule, MatIcon, MatFormFieldModule, MatDatepickerModule, FormsModule, MatNativeDateModule, MatInputModule, LettersOnlyDirective, NumbersOnlyDirective, ToastModule], providers: [MessageService], template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\n [showTransformOptions]=\"screenWidth < 475 ? 'translateY(-100%)' : ''\"></p-toast>\n<section class=\"main_section\">\n <div class=\"main_header\">\n <div class=\"header d-flex justify-content-between align-items-center\">\n <div class=\"back-btn d-flex justify-content-center align-items-center cursor-pointer gap-2 mb-3\"\n (click)=\"goBack()\">\n <mat-icon>keyboard_backspace</mat-icon><span *ngIf=\"screenWidth > 475\">Back to Home</span>\n </div>\n <div class=\"header-title\">\n <h1>Book New Appointment</h1>\n <p>{{businessName ?? \"N/A\" }}</p>\n </div>\n </div>\n\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" [style.width]=\"barWidth + '%'\"></div>\n </div>\n </div>\n <div class=\"main_body w-100 d-flex justify-content-center\"><ng-container *ngIf=\"selectedTab === 'serviceListing'\">\n <ng-container *ngIf=\"!skeletonLoader\">\n <ng-container *ngTemplateOutlet=\"serviceListing\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab === 'locationListing'\">\n <ng-container *ngTemplateOutlet=\"locationListing\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab === 'staffListing'\">\n <ng-container *ngTemplateOutlet=\"staffListing\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab === 'dateSelection'\">\n <ng-container *ngTemplateOutlet=\"dateSelection\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab==='contactDetails'\">\n <ng-container *ngTemplateOutlet=\"contactDetails\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab==='paymentTab'\">\n <ng-container *ngTemplateOutlet=\"paymentTab\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab==='statusTemplate'\">\n <ng-container *ngTemplateOutlet=\"statusTemplate\"></ng-container>\n </ng-container>\n </div>\n <div class=\"main_footer d-flex justify-content-center align-items-center\" *ngIf=\"selectedTab!=='statusTemplate'\">\n <div class=\"footer-buttons\"\n [ngStyle]=\"{'justify-content': selectedTab != 'serviceListing' ? 'space-between' : 'end'}\">\n <span class=\"back-footer-btn cursor-pointer\" (click)=\"previousStep()\"\n *ngIf=\"selectedTab != 'serviceListing'\">Back</span>\n <button class=\"continue-btn\" [disabled]=\"!activeButton\" (click)=\"nextStep()\"\n *ngIf=\"selectedTab!='paymentTab'\">{{!loader ? 'Continue' : 'Loading...'}}</button>\n <button class=\"cursor-pointer d-flex justify-content-evenly align-items-center\"\n *ngIf=\"selectedTab==='paymentTab'\" (click)=\"checkPayment()\" [disabled]=\"isProcessing\"\n [ngClass]=\"{'pay-now-btn' : selectedService?.depositAmount?.depositRequired,'complete_booking' : !selectedService?.depositAmount?.depositRequired}\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/304012c1753440087996Background.png\">\n {{selectedService?.depositAmount?.depositRequired ? 'Pay Now' : 'Complete Booking'}}\n </button>\n </div>\n </div>\n</section>\n<ng-template #serviceListing>\n <div class=\"w-60 service_section\">\n <div class=\"service-selection\">\n <h2>Select a Service</h2>\n <p>Choose the service you'd like to book</p>\n\n <div class=\"services-grid\">\n <ng-container *ngFor=\"let service of serviceData\">\n <div class=\"\" (click)=\"selectService(service)\"\n [ngClass]=\"{ 'service-card-selected' : service?.selected, 'service-card': !service?.selected }\">\n <div class=\" service-header\">\n <div class=\"service-icon\"><mat-icon>person_outline</mat-icon></div>\n <div class=\"service-info\">\n <div class=\"service-title\">{{service?.name ? service?.name : 'N/A'}}</div>\n </div>\n <div>\n <div class=\"service-price\">\u20B9{{service?.priceDetails?.price ?\n service?.priceDetails?.price : 'N/A' }}</div>\n <div class=\"service-duration\">{{service?.duration ? service?.duration : 'N/A'}} min\n </div>\n </div>\n </div>\n <div class=\"service-description\" *ngIf=\"service?.description\">\n {{service?.description ? service?.description : 'N/A'}}\n </div>\n <div class=\"home-visit\" *ngIf=\"service?.homeAppointmentAvailable\"><img\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/982126c1758628863129furniture_16406103.png\">Home\n Visit Available</div>\n </div>\n </ng-container>\n\n <!-- <div class=\"service-card\">\n <div class=\"service-header\">\n <div class=\"service-icon\">\uD83D\uDC64</div>\n <div class=\"service-info\">\n <div class=\"service-title\">General Consultation</div>\n <div class=\"service-category\">Medical</div>\n </div>\n <div>\n <div class=\"service-price\">\u20B9800</div>\n <div class=\"service-duration\">30 min</div>\n </div>\n </div>\n <div class=\"service-description\">\n Comprehensive health consultation\n </div>\n </div>\n\n <div class=\"service-card\">\n <div class=\"service-header\">\n <div class=\"service-icon\">\uD83E\uDDE0</div>\n <div class=\"service-info\">\n <div class=\"service-title\">Mental Health Counseling</div>\n <div class=\"service-category\">Mental Health</div>\n </div>\n <div>\n <div class=\"service-price\">\u20B91500</div>\n <div class=\"service-duration\">45 min</div>\n </div>\n </div>\n <div class=\"service-description\">\n Professional psychological support\n </div>\n <div class=\"home-visit\">Home Visit Available</div>\n </div>\n\n <div class=\"service-card\">\n <div class=\"service-header\">\n <div class=\"service-icon\">\u2702</div>\n <div class=\"service-info\">\n <div class=\"service-title\">Hair Cut & Styling</div>\n <div class=\"service-category\">Beauty</div>\n </div>\n <div>\n <div class=\"service-price\">\u20B91200</div>\n <div class=\"service-duration\">45 min</div>\n </div>\n </div>\n <div class=\"service-description\">\n Professional hair cutting and styling\n </div>\n <div class=\"home-visit\">Home Visit Available</div>\n </div> -->\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #locationListing>\n <div class=\"location_section\">\n <div class=\"header flex-column align-items-start\">\n <h1>Choose Location</h1>\n <p>Select where you'd like to receive the service</p>\n </div>\n\n <div class=\"location-list\">\n <ng-container *ngFor=\"let location of locationData\">\n <div (click)=\"selectLocation(location)\"\n [ngClass]=\"{ 'location-card-selected' : location?.selected, 'location-card': !location?.selected }\">\n <div class=\"location-content\">\n <div class=\"location-info\">\n <div class=\"location-icon\"><img\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/427226c1758629157758store_3171510.png\">\n </div>\n <div class=\"location-details\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <h3>{{location?.storeName ? location?.storeName : 'N/A'}}</h3>\n <!-- <div class=\"distance\"><mat-icon>location_on</mat-icon> 2.3 km</div> -->\n </div>\n <p>{{location?.addressDetails?.addressLine}}, {{location?.addressDetails?.city}},\n {{location?.addressDetails?.state}} {{location?.pincode}}</p>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <!-- <div class=\"location-card\">\n <div class=\"location-content\">\n <div class=\"location-info\">\n <div class=\"location-icon branch-icon\"></div>\n <div class=\"location-details\">\n <h3>Branch Clinic</h3>\n <p>456 Care Avenue, Health Zone, Mumbai 400015</p>\n </div>\n </div>\n <div class=\"distance\">5.8 km</div>\n </div>\n </div>\n\n <div class=\"location-card\">\n <div class=\"location-content\">\n <div class=\"location-info\">\n <div class=\"location-icon home-icon\"></div>\n <div class=\"location-details\">\n <h3>Home Visit</h3>\n <p>Your Location</p>\n </div>\n </div>\n <div class=\"distance\">0 km</div>\n </div>\n </div> -->\n </div>\n </div>\n</ng-template>\n<ng-template #staffListing>\n <div class=\"w-60 overflow-hidden staff-listing\">\n <div class=\"d-flex w-100 h-100\">\n <div class=\"w-100\">\n <!-- Header Section -->\n <div class=\"staff-header mb-3\">\n <h1>Select Staff Member</h1>\n <p class=\"staff-subtitle mb-0\">Choose your preferred professional</p>\n </div>\n\n <!-- Staff Cards -->\n <div class=\"d-flex flex-column gap-4 staff-list\">\n <ng-container *ngFor=\"let staff of staffData\">\n <div class=\"card rounded-3 p-3\" (click)=\"selectStaff(staff)\"\n [ngClass]=\"{ 'staff-card-selected' : staff?.selected, 'staff-card': !staff?.selected }\">\n <div class=\"d-flex align-items-start justify-content-between\">\n <div class=\"d-flex align-items-start flex-grow-1\">\n <div\n class=\"staff-avatar rounded-circle d-flex align-items-center justify-content-center me-4\">\n {{staff?.staffName.slice(0,3).toUpperCase()}}\n </div>\n <div class=\"staff-details flex-grow-1\">\n <h3 class=\"staff-name\">{{staff?.staffName ? staff?.staffName : 'N/A'}}</h3>\n <p class=\"staff-specialty\">General Medicine</p>\n <!-- <p class=\"staff-description mb-0\">Experienced physician with 10+ years in\n general\n medicine and wellness care.</p> -->\n </div>\n </div>\n <!-- <div class=\"rating-section\">\n <div class=\"star-rating d-flex align-items-center\">\n <span class=\"star-icon\"></span>\n <span class=\"rating-number\">4.9</span>\n </div>\n <div class=\"review-count\">156 reviews</div>\n </div> -->\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #dateSelection>\n <div class=\"w-60 date_section\">\n <div class=\"row justify-content-center h-100\">\n <div class=\"col-12 h-100\">\n <div class=\"datetime-header mb-2\">\n <h1>Select Date & Time</h1>\n <p class=\"datetime-subtitle mb-0\">Choose when you'd like your appointment</p>\n </div>\n\n <!-- Main Content -->\n <div class=\"d-flex gap-4 main_container\">\n <!-- Left Column - Date Selection -->\n <div [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\">\n <div class=\"section-card card rounded-3 p-4 h-100\">\n <h3 class=\"section-title\">Select Date</h3>\n\n <div class=\"date-picker-container d-flex align-items-center justify-content-between\"\n (click)=\"$event.stopPropagation()\">\n <input type=\"text\" class=\"date-input border-0 rounded-2\" placeholder=\"dd-mm-yyyy\"\n [value]=\"selectedDateStr\" readonly (click)=\"toggleCalendar($event)\">\n\n <mat-icon class=\"ms-2\" (click)=\"toggleCalendar($event)\">calendar_today</mat-icon>\n </div>\n <div class=\"position-relative\" (click)=\"$event.stopPropagation()\">\n <div class=\"datepicker-popover\" *ngIf=\"showCalendar\">\n <mat-calendar [(selected)]=\"selectedDate\" [dateFilter]=\"dateFilter\"\n (selectedChange)=\"onDateSelected($event)\" class=\"datepicker-calendar\">\n </mat-calendar>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Right Column - Time Selection -->\n <div class=\"time_selection\" [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\">\n <div class=\"section-card card h-100 rounded-3 p-4\">\n <h3 class=\"section-title\">Available Times</h3>\n\n <!-- Time Slots Grid -->\n <div class=\"row g-2 mb-4 overflow-scroll\">\n <ng-container *ngIf=\"!skeletonLoader ;else slotsLoader\">\n <div class=\"col-4\" *ngFor=\"let time of locationTiming\">\n <div class=\"time-slot rounded-2\" [class.selected]=\"time.selected\"\n (click)=\"selectTimeSlot(time)\">{{time ?\n time?.value : 'N/A'}}</div>\n </div>\n </ng-container>\n <ng-template #slotsLoader>\n <!-- Time Slot Grid Skeleton Loader HTML -->\n <div class=\"time-slot-grid\">\n <!-- Row 1 -->\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n\n <!-- Row 2 -->\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n\n <!-- Row 3 -->\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n\n <!-- Row 4 -->\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n\n <!-- Row 5 -->\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n\n <!-- Row 6 -->\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n <div class=\"skeleton-time-slot\"></div>\n </div>\n\n </ng-template>\n </div>\n\n <!-- Waitlist Section -->\n <!-- <div class=\"waitlist-section rounded-3\">\n <div class=\"d-flex align-items-start\">\n <div class=\"d-flex h-100 justify-content-between flex-column\">\n <div class=\"waitlist-title d-flex align-items-center gap-2\"><span\n class=\"waitlist-icon check-icon\"></span>No\n slots available?</div>\n <div class=\"waitlist-description d-flex align-items-center gap-2\">\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\"\n id=\"flexCheckChecked\">\n Add me to the waitlist for earlier\n availability\n </div>\n </div>\n <div>\n </div>\n </div>\n </div> -->\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n</ng-template>\n<ng-template #contactDetails>\n <div class=\"w-60 contact_section overflow-hidden\">\n <div class=\"d-flex h-100\">\n <div class=\"h-100 w-100\">\n <!-- Header Section -->\n <div class=\"contact-header mb-2\">\n <h1>Contact Details</h1>\n <p class=\"contact-subtitle mb-0\">Provide your contact information</p>\n </div>\n\n <!-- Form Sections -->\n <div class=\"d-flex gap-3 details_container flex-column w-100\">\n <!-- Left Column - Personal Information -->\n <div class=\"d-flex gap-4\">\n <div\n [ngClass]=\"{'w-50' : selectedService?.homeAppointmentAvailable, 'w-100' : !selectedService?.homeAppointmentAvailable}\">\n <div class=\"form-section card rounded-3 p-4 h-100\">\n <h3 class=\"section-title\">Personal Information</h3>\n\n <!-- Full Name -->\n <div class=\"mb-4\">\n <label class=\"form-label d-flex align-items-center\">\n Full Name\n <span class=\"required-asterisk\">*</span>\n </label>\n <input type=\"text\" class=\"form-control form-input rounded-2\"\n [(ngModel)]=\"appointmentPayload.customerDetail.name\"\n (ngModelChange)=\"checkRequiredValues()\" simpoLettersOnly>\n </div>\n\n <!-- Email Address -->\n <div class=\"mb-4\">\n <label class=\"form-label d-flex align-items-center\">\n Email Address\n <span class=\"required-asterisk\">*</span>\n </label>\n <input type=\"email\" class=\"form-control form-input rounded-2\"\n [(ngModel)]=\"appointmentPayload.customerDetail.email\"\n (ngModelChange)=\"checkRequiredValues()\"\n pattern=\"^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$\">\n </div>\n\n <!-- Phone Number -->\n <div class=\"mb-0\">\n <label class=\"form-label d-flex align-items-center\">\n Phone Number\n <span class=\"required-asterisk\">*</span>\n </label>\n <input type=\"tel\" class=\"form-control rounded-2\"\n [(ngModel)]=\"appointmentPayload.customerDetail.phoneNumber\"\n (ngModelChange)=\"checkRequiredValues()\" simpoNumbersOnly\n [ngClass]=\"{'mobile_number' : appointmentPayload.customerDetail.phoneNumber.length != 10}\">\n </div>\n </div>\n </div>\n <!-- Right Column - Home Visit Details -->\n <div class=\"w-50\" *ngIf=\"selectedService?.homeAppointmentAvailable\">\n <div class=\"form-section card rounded-3 p-4 h-100\">\n <h3 class=\"section-title\">Home Visit Details</h3>\n\n <!-- Home Address -->\n <div class=\"mb-4\">\n <label class=\"form-label d-flex align-items-center\">\n Home Address\n </label>\n <textarea class=\"form-control form-textarea rounded-2\"\n placeholder=\"Enter your complete address\" [(ngModel)]=\"homeAddress\"></textarea>\n </div>\n\n <!-- Special Instructions -->\n <div class=\"mb-0\">\n <label class=\"form-label d-flex align-items-center\">\n Special Instructions\n </label>\n <textarea class=\"form-control form-textarea rounded-2\"\n placeholder=\"Any special instructions for the professional (optional)\"\n [(ngModel)]=\"instructions\"></textarea>\n </div>\n </div>\n </div>\n </div>\n <div class=\"policies-container\">\n <!-- Header -->\n <h2 class=\"policies-title\">Policies & Terms</h2>\n\n <!-- Policy Items -->\n <div class=\"policy-items-container d-flex flex-column gap-3\">\n <!-- Cancellation Policy -->\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\n (click)=\"showCancellationPolicy = !showCancellationPolicy\">\n <h3 class=\"policy-title\">Cancellation Policy</h3>\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\n *ngIf=\"!showCancellationPolicy\">keyboard_arrow_right</mat-icon>\n <mat-icon *ngIf=\"showCancellationPolicy\">keyboard_arrow_down</mat-icon>\n </div>\n </div>\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\n *ngIf=\"showCancellationPolicy\">\n <span *ngFor=\"let policy of selectedService?.cancellationPolicy\">&#8226;\n {{policy}}</span>\n </div>\n\n <!-- Rescheduling Policy -->\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\n (click)=\"showReducingPolicy = !showReducingPolicy\">\n <h3 class=\"policy-title\">Rescheduling Policy</h3>\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\n *ngIf=\"!showReducingPolicy\">keyboard_arrow_right</mat-icon>\n <mat-icon *ngIf=\"showReducingPolicy\">keyboard_arrow_down</mat-icon>\n </div>\n </div>\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\n *ngIf=\"showReducingPolicy\">\n <span *ngFor=\"let policy of selectedService?.reschedulePolicy\">&#8226; {{policy}}</span>\n </div>\n </div>\n\n <!-- Acceptance Section -->\n <div class=\"acceptance-section\">\n <input type=\"checkbox\" class=\"custom-checkbox\" [(ngModel)]=\"termsAndConditions\"\n (ngModelChange)=\"checkRequiredValues()\">\n <p class=\"acceptance-text\">\n I understand and accept the cancellation & rescheduling policies and\n <span class=\"terms-link\">Terms & Conditions<span\n class=\"external-link-icon\"></span></span>\n </p>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #paymentTab>\n <div class=\"w-60 payment_section\">\n <div class=\"w-100 h-100\">\n <div class=\"w-100 d-flex justify-content-center align-items-center flex-column\">\n <!-- Header Section -->\n <div class=\"payment-header mb-3 w-100\">\n <h1>Payment & Confirmation</h1>\n <p class=\"payment-subtitle mb-0\">Review your booking and complete payment</p>\n </div>\n\n <!-- Booking Summary Card -->\n <div class=\"booking-summary-card\" [ngClass]=\"{'w-100' : screenWidth < 475,'w-50':screenWidth > 475}\">\n <h2 class=\"summary-title\">Booking Summary</h2>\n\n <!-- Service -->\n <div class=\"summary-row\">\n <div class=\"summary-label\">Service</div>\n <div class=\"summary-value\">{{selectedService?.name ? selectedService?.name : 'N/A'}}</div>\n </div>\n\n <!-- Professional -->\n <div class=\"summary-row\" *ngIf=\"selectedStaff?.staffName\">\n <div class=\"summary-label\">Professional</div>\n <div class=\"summary-value\">{{selectedStaff?.staffName ? selectedStaff?.staffName : 'N/A'}}</div>\n </div>\n\n <!-- Location -->\n <div class=\"summary-row\">\n <div class=\"summary-label\">Location</div>\n <div class=\"summary-value\">{{selectedLocation?.storeName ? selectedLocation?.storeName : 'N/A'}}\n </div>\n </div>\n\n <!-- Date & Time -->\n <div class=\"summary-row\">\n <div class=\"summary-label\">Date & Time</div>\n <div class=\"summary-value\">{{selectedDateStr ? (selectedDateStr) : 'N/A'}} at\n {{selectedTime ? selectedTime.value : 'N/A'}}</div>\n </div>\n\n <!-- Duration -->\n <div class=\"summary-row\">\n <div class=\"summary-label\">Duration</div>\n <div class=\"summary-value\">{{selectedService?.duration ? selectedService?.duration : 'N/A'}}\n minutes</div>\n </div>\n <div class=\"summary-row\">\n <div class=\"summary-label\">Tax Percent</div>\n <div class=\"summary-value\">{{selectedService?.priceDetails?.taxPercent ?\n selectedService?.priceDetails?.taxPercent : 0}}%</div>\n </div>\n <!-- Total -->\n <div class=\"summary-row total-row\">\n <div class=\"summary-label\">Total</div>\n <div class=\"summary-value\">\n <span class=\"currency-symbol\">\u20B9</span>{{selectedService?.priceDetails?.totalPrice ?\n selectedService?.priceDetails?.totalPrice : '0'}}\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n<ng-template #statusTemplate>\n <div class=\"booking-confirmation\">\n <!-- Success Icon -->\n <div class=\"success-icon\">\n <div class=\"checkmark-circle\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/881293c1758695578518success.gif\"\n class=\"w-100 h-100\" *ngIf=\"apiStatus\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/325000c1758695564518fail.gif\"\n class=\"w-100 h-100\" *ngIf=\"!apiStatus\">\n </div>\n </div>\n\n <!-- Main Content -->\n <div class=\"confirmation-content\">\n <h1 class=\"confirmation-title\">{{apiStatus ? 'Booking Confirmed!' : 'Booking Failed'}}</h1>\n <p class=\"confirmation-message\">\n {{apiStatus ? 'Your appointment has been successfully booked.':'Failed to book you appointment. Please\n try again later'}}\n </p>\n\n <!-- Details Card -->\n <div class=\"d-flex w-100 align-items-center justify-content-center\" *ngIf=\"apiStatus\">\n <div class=\"details-card\">\n <h3 class=\"details-title\">Appointment Details</h3>\n\n <div class=\"details-row\">\n <span class=\"detail-label\">Service</span>\n <span class=\"detail-value\">{{appointmentPayload.serviceDetail?.name ?\n appointmentPayload.serviceDetail?.name : 'N/A'}}</span>\n </div>\n\n <div class=\"details-row\" *ngIf=\"appointmentPayload?.staffDetail?.name\">\n <span class=\"detail-label\">Professional</span>\n <span class=\"detail-value\">{{appointmentPayload.staffDetail?.name ?\n appointmentPayload.staffDetail?.name : 'N/A'}}</span>\n </div>\n <div class=\"details-row\">\n <span class=\"detail-label\">Date & Time</span>\n <span class=\"detail-value\">{{appointmentPayload.bookingDate ?\n appointmentPayload.bookingDate.slice(0,10) :\n 'N/A'}} at\n {{appointmentPayload.startTime ? appointmentPayload.startTime : 'N/A'}}</span>\n </div>\n </div>\n </div>\n\n\n <!-- Action Buttons -->\n <!-- <div class=\"action-buttons\">\n <button class=\"btn btn-outline\">View My Bookings</button>\n <button class=\"btn btn-primary\">Back to Admin</button>\n </div> -->\n </div>\n </div>\n</ng-template>\n<ng-template #skeletonLoader *ngIf=\"skeletonLoader\">\n <!-- Service Skeleton Loader HTML -->\n <div class=\"service-grid\">\n <!-- Skeleton Card 1 -->\n <div class=\"service-card skeleton-card\">\n <div class=\"service-header\">\n <div class=\"skeleton skeleton-icon\"></div>\n <div class=\"service-content\">\n <div class=\"skeleton skeleton-title\"></div>\n <div class=\"skeleton skeleton-price\"></div>\n <div class=\"skeleton skeleton-duration\"></div>\n </div>\n </div>\n <div class=\"skeleton skeleton-category\"></div>\n <div class=\"skeleton skeleton-description\"></div>\n <div class=\"skeleton skeleton-badge\"></div>\n </div>\n\n <!-- Skeleton Card 2 -->\n <div class=\"service-card skeleton-card\">\n <div class=\"service-header\">\n <div class=\"skeleton skeleton-icon\"></div>\n <div class=\"service-content\">\n <div class=\"skeleton skeleton-title\"></div>\n <div class=\"skeleton skeleton-price\"></div>\n <div class=\"skeleton skeleton-duration\"></div>\n </div>\n </div>\n <div class=\"skeleton skeleton-category\"></div>\n <div class=\"skeleton skeleton-description\"></div>\n <div class=\"skeleton skeleton-badge\"></div>\n </div>\n\n <!-- Skeleton Card 3 -->\n <div class=\"service-card skeleton-card\">\n <div class=\"service-header\">\n <div class=\"skeleton skeleton-icon\"></div>\n <div class=\"service-content\">\n <div class=\"skeleton skeleton-title\"></div>\n <div class=\"skeleton skeleton-price\"></div>\n <div class=\"skeleton skeleton-duration\"></div>\n </div>\n </div>\n <div class=\"skeleton skeleton-category\"></div>\n <div class=\"skeleton skeleton-description\"></div>\n <div class=\"skeleton skeleton-badge\"></div>\n </div>\n\n <!-- Skeleton Card 4 -->\n <div class=\"service-card skeleton-card\">\n <div class=\"service-header\">\n <div class=\"skeleton skeleton-icon\"></div>\n <div class=\"service-content\">\n <div class=\"skeleton skeleton-title\"></div>\n <div class=\"skeleton skeleton-price\"></div>\n <div class=\"skeleton skeleton-duration\"></div>\n </div>\n </div>\n <div class=\"skeleton skeleton-category\"></div>\n <div class=\"skeleton skeleton-description\"></div>\n <div class=\"skeleton skeleton-badge\"></div>\n </div>\n\n <!-- Skeleton Card 5 -->\n <div class=\"service-card skeleton-card\">\n <div class=\"service-header\">\n <div class=\"skeleton skeleton-icon\"></div>\n <div class=\"service-content\">\n <div class=\"skeleton skeleton-title\"></div>\n <div class=\"skeleton skeleton-price\"></div>\n <div class=\"skeleton skeleton-duration\"></div>\n </div>\n </div>\n <div class=\"skeleton skeleton-category\"></div>\n <div class=\"skeleton skeleton-description\"></div>\n <div class=\"skeleton skeleton-badge\"></div>\n </div>\n\n <!-- Skeleton Card 6 -->\n <div class=\"service-card skeleton-card\">\n <div class=\"service-header\">\n <div class=\"skeleton skeleton-icon\"></div>\n <div class=\"service-content\">\n <div class=\"skeleton skeleton-title\"></div>\n <div class=\"skeleton skeleton-price\"></div>\n <div class=\"skeleton skeleton-duration\"></div>\n </div>\n </div>\n <div class=\"skeleton skeleton-category\"></div>\n <div class=\"skeleton skeleton-description\"></div>\n <div class=\"skeleton skeleton-badge\"></div>\n </div>\n </div>\n</ng-template>", styles: ["body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;background-color:#fff;color:#000;line-height:1.6}.main_section{position:relative;height:100%}.main_header{padding:1%;width:100%;background:#fff;height:15%}.main_body{height:75%;padding-top:0%;overflow:scroll}.header{display:flex;align-items:center;justify-content:space-between}.back-btn mat-icon{height:16px!important;width:20px!important;font-size:21px!important}.back-btn span{color:#000;font-size:15px;font-weight:500}.back-btn:hover{background-color:#f0f0f0}.header-title{flex-grow:1;margin-left:2rem}.header-title h1{font-size:20px;font-weight:600;margin-bottom:0}.header-title p{color:#666;font-size:14px}.step-indicator{font-size:14px;color:#000;font-weight:700}.progress-bar{width:100%;height:8px;background-color:#e0e0e0;margin-bottom:1rem;border-radius:10px;overflow:hidden}.w-60{width:60%!important}.progress-fill{height:100%;width:14.28%;background-color:#000}.service-selection h2{font-size:20px;font-weight:600;margin:.25rem 0}.service-selection p{color:#666;font-size:16px;margin-bottom:1rem}.main_footer{border-top:1px solid lightgrey;width:100%;background-color:#fff;height:10%}.services-grid{display:grid;grid-template-columns:48% 48%;gap:15px;padding-bottom:5px}.service-card{border:1px solid lightgrey;border-radius:8px;padding:24px;background-color:#fff;cursor:pointer;transition:all .3s ease;position:relative}.service-card:hover{background-color:#f9f9f9;box-shadow:0 4px 8px #0000001a}.service-card-selected{border:2px solid black;border-radius:8px;padding:24px;background-color:#fff;cursor:pointer;transition:all .3s ease;position:relative}.service-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:3rem}.service-info{flex-grow:1}.service-icon{width:40px;height:40px;border-radius:8px;background-color:#f0f0f0;display:flex;align-items:center;justify-content:center;margin-right:1rem;font-size:20px;margin-top:.2rem}.service-title{font-size:18px;font-weight:600;margin-bottom:4px}.service-category{background-color:#f0f0f0;color:#000;padding:1% 4%;border-radius:12px;font-size:12px;font-weight:500;display:inline-block}.service-price{font-size:17px;font-weight:700;color:#000}.service-duration{font-size:12px;color:#666;display:flex;justify-content:center;align-items:center}.service-description{color:#666;font-size:15px;margin-bottom:.5rem;line-height:1.5}.home-visit{display:flex;align-items:center;font-size:12px;color:#666;border:1px solid lightgrey;padding:.5% 1%;border-radius:4px;background-color:#fff;width:10vw;height:3vh;white-space:nowrap;justify-content:space-around}.home-visit img{width:18px}.footer-buttons{display:flex;justify-content:space-between;align-items:center;width:60%}.back-footer-btn{color:#000;padding:12px 24px;font-size:16px}.continue-btn{background-color:#000;color:#fff;border:2px solid black;padding:.5%;border-radius:4px;font-size:15px!important;font-weight:600;cursor:pointer;width:6vw!important}.continue-btn:hover{background-color:#333}.continue-btn:disabled{background-color:#ccc;border-color:#ccc;cursor:not-allowed}.location_section{width:60%;overflow:hidden}.location_section .header h1{font-size:20px;font-weight:600;margin:.25rem 0}.location_section .header p{font-size:16px;color:#888;font-weight:400}.location-list{display:flex;flex-direction:column;gap:20px;height:64vh;overflow-x:scroll;padding-bottom:1%}.location-card{border:1px solid lightgrey;border-radius:12px;padding:1.5rem 1.5rem 2rem;cursor:pointer;transition:all .3s ease}.location-card:hover{box-shadow:0 4px 8px #0000001a}.location-card-selected{border:1px solid black;border-radius:12px;padding:1.5rem 1.5rem 2rem;cursor:pointer;transition:all .3s ease}.location-content{display:flex;align-items:center;justify-content:space-between}.location-info{display:flex;align-items:center;flex-grow:1}.location-icon{width:40px;height:40px;background-color:#d3d3d3;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-right:20px}.location-icon img{width:28px}.location-details{width:95%}.location-details h3{font-size:16px;font-weight:600;margin-bottom:0}.location-details p{font-size:14px;color:#aaa;line-height:1.4;margin:0}.distance{display:flex;align-items:center;color:#888;font-size:14px;margin-left:20px}.distance mat-icon{width:18px!important;height:15px!important;font-size:17px}.staff-header h1{font-size:20px;font-weight:600;margin:.25rem 0}.staff-subtitle{font-size:16px;color:#888;font-weight:400}.staff-card{border:1px solid lightgrey;cursor:pointer;transition:all .3s ease}.staff-card:hover{box-shadow:0 4px 8px #0000001a}.staff-card-selected{border-color:#666;cursor:pointer;transition:all .3s ease}.staff-avatar{width:64px;height:64px;background-color:gray;font-size:20px;font-weight:600;color:#fff}.staff-name{font-size:16px;font-weight:600;margin-bottom:0}.staff-specialty{font-size:14px;color:gray;margin-bottom:8px}.staff-description{font-size:14px;color:gray;line-height:1.4}.rating-section{display:flex;flex-direction:column;align-items:flex-end}.star-rating{color:gold;font-size:16px;margin-bottom:4px;width:100%}.rating-number{font-size:18px;font-weight:600;color:#000}.review-count{font-size:12px;color:#888}.star-icon:before{content:\"\\2b50\";margin-right:4px}.staff_section{width:60%;overflow:hidden}.staff-list{height:64vh;overflow-x:scroll;padding-bottom:1%}.datetime-header h1{font-size:20px;font-weight:600;margin:.25rem 0}.main_container{height:85%}.datetime-subtitle{font-size:16px;color:#888;font-weight:400}.section-card{border:1px solid lightgrey}.section-title{font-size:17px;font-weight:600;margin-bottom:20px}.date-picker-container{border:1px solid lightgrey}.date-picker-container mat-icon{height:17px;font-size:18px}.date-input{font-size:16px;padding:2%;width:auto;outline:none}.time-slot{border:1px solid lightgrey;font-size:14px;font-weight:500;padding:6%;cursor:pointer;transition:all .3s ease;text-align:center;min-width:80px}.time-slot:hover{box-shadow:0 4px 8px #0000001a}.time-slot.selected{background-color:#555;border-color:#777;color:#fff}.waitlist-section{background-color:#789;border:none;padding:4%;max-height:13vh}.waitlist-icon{color:#4ade80;font-size:18px}.waitlist-title{color:#fff;font-size:16px;font-weight:500;margin-bottom:8px}.mobile_number{border-color:#dc3545!important;box-shadow:0 0 0 .1rem #ffc3c3}.waitlist-description{color:#fff;font-size:14px;margin-bottom:0;font-weight:500}.waitlist-description .form-check-input{width:17px;height:17px;background-color:transparent}.waitlist-description .form-check-input:checked{background-color:#0d6efd}.check-icon:before{content:\"\\2713\"}.contact-header h1{font-size:20px;font-weight:600;margin:.25rem 0}.contact-subtitle{font-size:16px;color:#888;font-weight:400}.form-section{border:1px solid lightgrey}.section-title{font-size:16px;font-weight:600;margin-bottom:24px}.form-label{font-size:14px;font-weight:500;margin-bottom:8px}.required-asterisk{color:#ff6b6b;margin-left:4px}.form-input{border:1px solid lightgrey;font-size:16px;padding:1%;transition:all .3s ease}.form-input:focus{border-color:#777}.form-input::placeholder{color:#aaa;font-size:14px}.form-textarea{border:1px solid lightgrey;font-size:16px;padding:12px 16px;resize:vertical;max-height:120px;transition:all .3s ease}.form-textarea:focus{border-color:#777}.form-textarea::placeholder{color:#aaa;font-size:14px}.optional-label{color:#888;font-size:12px;font-style:italic}.details_container{height:89%;overflow-x:scroll;padding-bottom:1%}.policies-container{background-color:#fff;border:1px solid lightgrey;padding:2rem;border-radius:12px}.policies-title{font-size:16px;font-weight:600;color:#000;margin-bottom:1rem}.policy-item{background-color:#fff;border:1px solid lightgrey;border-radius:8px;padding:1%;cursor:pointer;transition:all .3s ease}.cancellation_policies{padding:1% .5%;font-weight:500}.policy-item:hover{background-color:#f8f9fa;border-color:#ccc}.policy-item:last-of-type{margin-bottom:32px}.policy-title{font-size:14px;font-weight:500;color:#000;margin:0}.acceptance-section{display:flex;align-items:flex-start;gap:7px;margin-top:8px}.custom-checkbox{width:18px;height:20px;background-color:#fff;border:1px solid lightgrey;border-radius:4px;margin-top:2px;cursor:pointer;position:relative;flex-shrink:0;transition:all .3s ease}.custom-checkbox:hover{border-color:#999;background-color:#f8f9fa}.custom-checkbox.checked{background-color:#007bff;border-color:#007bff}.custom-checkbox.checked:after{content:\"\\2713\";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;font-size:12px;font-weight:700}.acceptance-text{font-size:14px;color:#000;line-height:1.5;margin:0}.terms-link{color:#007bff;text-decoration:none;font-weight:500;position:relative}.terms-link:hover{color:#0056b3;text-decoration:underline}.external-link-icon{margin-left:4px;font-size:12px;opacity:.8}.external-link-icon:after{content:\"\\2197\"}.payment-header h1{font-size:20px;font-weight:600;color:#000;margin:.25rem 0}.payment-subtitle{font-size:16px;color:#666;font-weight:400}.booking-summary-card{background-color:#fff;border:1px solid lightgrey;padding:2%;border-radius:12px}.summary-title{font-size:18px;font-weight:600;color:#000;margin-bottom:32px}.summary-row{display:flex;justify-content:space-between;align-items:center;padding:12px 0}.summary-row:last-child{border-bottom:none;padding-bottom:0}.summary-label{font-size:16px;color:#000;font-weight:500}.summary-value{font-size:16px;color:#000;font-weight:400;text-align:right}.total-row{margin-top:16px;padding-top:16px}.total-row .summary-label,.total-row .summary-value{font-size:20px;font-weight:600}.currency-symbol{font-size:18px}.complete_booking{background:#e3fee3;border:none;padding:.5%;width:12vw!important;font-size:15px!important;font-weight:500;border-radius:4px;white-space:nowrap}.complete_booking img{width:30px}.pay-now-btn{justify-content:unset!important;background:#e3fee3;border:none;padding:.5%;width:8vw!important;font-size:15px!important;font-weight:500;border-radius:4px;gap:.5rem}.pay-now-btn img{width:30px}.booking-confirmation{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;width:60%;border-radius:10px}.success-icon{margin-bottom:1.5rem}.checkmark-circle{width:80px;height:80px;position:relative}.checkmark{width:80px;height:80px;border-radius:50%;display:block;stroke-width:3;stroke:#22c55e;stroke-miterlimit:10;animation:checkmark-fill .4s ease-in-out .4s forwards,checkmark-scale .3s ease-in-out .9s both}.checkmark-circle-path{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:3;stroke-miterlimit:10;stroke:#22c55e;fill:none;animation:checkmark-stroke .6s cubic-bezier(.65,0,.45,1) forwards}.checkmark-check{transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;stroke:#22c55e;stroke-width:3;animation:checkmark-stroke .3s cubic-bezier(.65,0,.45,1) .8s forwards}@keyframes checkmark-stroke{to{stroke-dashoffset:0}}@keyframes checkmark-scale{0%,to{transform:none}50%{transform:scale3d(1.1,1.1,1)}}@keyframes checkmark-fill{to{box-shadow:inset 0 0 0 30px #22c55e}}.confirmation-content{width:100%;height:80%}.confirmation-title{font-size:18px;font-weight:700}.confirmation-message{font-size:1rem;margin-bottom:1rem;line-height:1.6;font-weight:500}.details-card{background:#ffffff1a;border:1px solid lightgrey;border-radius:16px;padding:1.5rem;margin-bottom:2rem;width:35vw}.details-title{font-size:1.25rem;font-weight:600;margin:0 0 1.5rem}.details-row{display:flex;justify-content:space-between;align-items:center;padding:.75rem 0;border-bottom:1px solid rgba(255,255,255,.1)}.details-row:last-child{border-bottom:none}.detail-label{font-size:.9rem;font-weight:500}.detail-value{font-weight:600;font-size:1rem}.action-buttons{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap}.btn{padding:.75rem 1.5rem;border-radius:8px;font-weight:600;font-size:.9rem;cursor:pointer;transition:all .2s ease;border:none;min-width:140px}.btn-outline{background:transparent;border:2px solid rgba(255,255,255,.3);color:#fff}.btn-outline:hover{background:#ffffff1a;border-color:#ffffff80}.btn-primary{background:#fff;color:#1f2937}.btn-primary:hover{background:#f3f4f6;transform:translateY(-1px)}.datepicker-popover{position:absolute;z-index:1000;margin-top:8px;border-radius:16px;overflow:hidden;box-shadow:0 12px 28px #0000001f,0 2px 4px #00000014;background:#fff;border:1px solid rgba(0,0,0,.06);width:17vw}::ng-deep .datepicker-calendar{border-radius:16px!important;overflow:hidden!important;font-family:Segoe UI,Roboto,sans-serif!important;width:100%!important}::ng-deep .mat-calendar-header{background:linear-gradient(135deg,#667eea,#764ba2)!important;color:#fff!important;padding:3px!important;display:flex!important;align-items:center!important;justify-content:space-between!important;min-height:60px!important;border-radius:16px 16px 0 0!important}::ng-deep .mat-calendar-controls{display:flex!important;align-items:center!important;justify-content:space-between!important;width:100%!important;margin:2% calc(4.7142857143% - 16px)!important}::ng-deep .mat-calendar-period-button{color:#fff!important;font-weight:700!important;font-size:16px!important;letter-spacing:.5px!important;background:transparent!important;border:none!important;padding:12px 16px!important;border-radius:8px!important;transition:all .3s ease!important;flex-grow:1!important;text-align:left!important;margin:0!important;order:1!important}::ng-deep .mat-calendar-period-button:hover{background:#ffffff26!important;transform:translateY(-1px)!important}::ng-deep .mat-calendar-header .mat-calendar-controls>div{display:flex;order:2!important}::ng-deep .mat-calendar-previous-button,::ng-deep .mat-calendar-next-button{color:#fff!important;width:40px!important;height:40px!important;border-radius:50%!important;background:#ffffff1a!important;border:1px solid rgba(255,255,255,.2)!important;transition:all .3s ease!important;margin:0 4px!important;display:flex!important;align-items:center!important;justify-content:center!important}::ng-deep .mat-calendar-previous-button:hover,::ng-deep .mat-calendar-next-button:hover{background:#ffffff40!important;transform:scale(1.05)!important}::ng-deep .mat-calendar-arrow{fill:#fff!important;width:20px!important;height:20px!important}::ng-deep .mat-calendar-content{padding:10px 16px!important;background:#fff!important}::ng-deep .mat-calendar-table-header th{color:#6b7280!important;font-weight:600!important;font-size:12px!important;text-align:center!important;padding-bottom:12px!important;text-transform:uppercase!important}::ng-deep .mat-calendar-table{border-spacing:0!important;border-collapse:collapse!important;width:100%!important}::ng-deep .mat-calendar-body-cell{height:44px!important;width:44px!important;border-radius:12px!important}::ng-deep .mat-calendar-body-cell-content{width:33px!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important;font-weight:500!important;font-size:14px!important;color:#374151!important;transition:all .3s cubic-bezier(.4,0,.2,1)!important}::ng-deep .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover .mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background:#667eea1a!important;color:#667eea!important;transform:scale(1.05)!important}::ng-deep .mat-calendar-body-selected{background:linear-gradient(135deg,#667eea,#764ba2)!important;color:#fff!important;box-shadow:0 4px 12px #677eea4d!important}::ng-deep .mat-calendar-body-today:not(.mat-calendar-body-selected){border:none;color:#667eea!important;font-weight:700!important}::ng-deep .mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:#d1d5db!important}.service-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;padding:20px;width:60%}.service-card{border:1px solid #e5e5e5;border-radius:8px;padding:20px;background:#fff;box-shadow:0 2px 4px #0000001a}.service-header{display:flex;align-items:flex-start;gap:15px;margin-bottom:15px}.service-content{flex:1;display:flex;flex-direction:column;gap:8px}.skeleton{background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%;animation:skeleton-loading 1.5s infinite;border-radius:4px}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-icon{width:40px;height:40px;border-radius:50%;flex-shrink:0}.skeleton-title{height:20px;width:70%}.skeleton-price{height:18px;width:50%;align-self:flex-end}.skeleton-duration{height:14px;width:40%;align-self:flex-end}.skeleton-category{height:24px;width:25%;border-radius:12px;margin-bottom:10px}.skeleton-description{height:16px;width:85%;margin-bottom:15px}.skeleton-badge{height:32px;width:45%;border-radius:16px;margin-top:10px}@media (max-width: 768px){.service-grid{grid-template-columns:1fr;gap:15px;padding:15px}.service-card{padding:15px}}.time-slot-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;padding:16px;max-width:400px;margin:0 auto}.skeleton-time-slot{height:44px;border-radius:8px;background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%;animation:skeleton-shimmer 1.5s infinite;border:1px solid #e5e5e5;position:relative}@keyframes skeleton-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-time-slot:nth-child(2n){animation:skeleton-pulse 2s infinite}@keyframes skeleton-pulse{0%,to{opacity:1}50%{opacity:.7}}@media (max-width: 480px){.time-slot-grid{grid-template-columns:repeat(2,1fr);gap:10px;padding:12px}.skeleton-time-slot{height:40px}}@media (max-width: 320px){.time-slot-grid{grid-template-columns:1fr}}@media screen and (min-width:320px) and (max-width:475px){.back-btn{gap:.25rem!important;margin:0!important}.back-btn span{color:#000;font-size:12px;font-weight:500;white-space:nowrap}.back-btn mat-icon{font-size:16px!important;margin-bottom:0!important}.header-title{display:flex;align-items:center;margin-bottom:0rem!important}.header-title h1{font-size:16px!important}.main_header .header{padding:3%}.date_section,.service_section,.location_section,.contact_section,.payment_section{width:100%!important;padding:0% 5%}.service_section h2{font-size:17px!important;margin-bottom:0!important}.service_section p{font-size:14px!important}.main_section{height:100vh}.services-grid{display:flex;justify-content:center;flex-wrap:wrap}.service-card,.service-card-selected{width:90vw!important}.home-visit{width:40vw!important}.back-footer-btn{padding:12px 2px!important}.footer-buttons{padding:0% 3%!important;width:100%!important}.continue-btn{width:22vw!important}.main_container{flex-wrap:wrap;height:100%!important}.date_section{overflow:hidden}.date_section .time_selection{height:60%}.datepicker-popover{width:60vw!important}.details_container{height:90%!important;justify-content:space-around}.complete_booking{width:39vw!important}.booking_confirmation,.details-card{width:100%!important}.datetime-header h1{margin:0!important}}@media screen and (max-width: 475px){.main_header{height:10%}.main_body{height:83%}.main_footer{height:7%}.staff-listing{width:100%!important;padding:0% 5%}.booking-confirmation{width:auto;padding:0rem}}\n"] }]
475
+ args: [{ selector: 'simpo-appointment-booking', standalone: true, imports: [CdkDragPlaceholder, CommonModule, MatIcon, MatFormFieldModule, MatDatepickerModule, FormsModule, MatNativeDateModule, MatInputModule, LettersOnlyDirective, NumbersOnlyDirective, ToastModule], providers: [MessageService], template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"screenWidth < 475 ? 'translateY(-100%)' : ''\"></p-toast>\r\n<section class=\"main_section\">\r\n <div class=\"main_header\">\r\n <div class=\"header d-flex justify-content-between align-items-center\">\r\n <div class=\"back-btn d-flex justify-content-center align-items-center cursor-pointer gap-2 mb-3\"\r\n (click)=\"goBack()\">\r\n <mat-icon>keyboard_backspace</mat-icon><span *ngIf=\"screenWidth > 475\">Back to Home</span>\r\n </div>\r\n <div class=\"header-title\">\r\n <h1>Book New Appointment</h1>\r\n <p>{{businessName ?? \"N/A\" }}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width]=\"barWidth + '%'\"></div>\r\n </div>\r\n </div>\r\n <div class=\"main_body w-100 d-flex justify-content-center\"><ng-container *ngIf=\"selectedTab === 'serviceListing'\">\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <ng-container *ngTemplateOutlet=\"serviceListing\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'locationListing'\">\r\n <ng-container *ngTemplateOutlet=\"locationListing\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'staffListing'\">\r\n <ng-container *ngTemplateOutlet=\"staffListing\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'dateSelection'\">\r\n <ng-container *ngTemplateOutlet=\"dateSelection\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='contactDetails'\">\r\n <ng-container *ngTemplateOutlet=\"contactDetails\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='paymentTab'\">\r\n <ng-container *ngTemplateOutlet=\"paymentTab\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='statusTemplate'\">\r\n <ng-container *ngTemplateOutlet=\"statusTemplate\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"main_footer d-flex justify-content-center align-items-center\" *ngIf=\"selectedTab!=='statusTemplate'\">\r\n <div class=\"footer-buttons\"\r\n [ngStyle]=\"{'justify-content': selectedTab != 'serviceListing' ? 'space-between' : 'end'}\">\r\n <span class=\"back-footer-btn cursor-pointer\" (click)=\"previousStep()\"\r\n *ngIf=\"selectedTab != 'serviceListing'\">Back</span>\r\n <button class=\"continue-btn\" [disabled]=\"!activeButton\" (click)=\"nextStep()\"\r\n *ngIf=\"selectedTab!='paymentTab'\">{{!loader ? 'Continue' : 'Loading...'}}</button>\r\n <button class=\"cursor-pointer d-flex justify-content-evenly align-items-center\"\r\n *ngIf=\"selectedTab==='paymentTab'\" (click)=\"checkPayment()\" [disabled]=\"isProcessing\"\r\n [ngClass]=\"{'pay-now-btn' : selectedService?.depositAmount?.depositRequired,'complete_booking' : !selectedService?.depositAmount?.depositRequired}\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/304012c1753440087996Background.png\">\r\n {{selectedService?.depositAmount?.depositRequired ? 'Pay Now' : 'Complete Booking'}}\r\n </button>\r\n </div>\r\n </div>\r\n</section>\r\n<ng-template #serviceListing>\r\n <div class=\"w-60 service_section\">\r\n <div class=\"service-selection\">\r\n <h2>Select a Service</h2>\r\n <p>Choose the service you'd like to book</p>\r\n\r\n <div class=\"services-grid\">\r\n <ng-container *ngFor=\"let service of serviceData\">\r\n <div class=\"\" (click)=\"selectService(service)\"\r\n [ngClass]=\"{ 'service-card-selected' : service?.selected, 'service-card': !service?.selected }\">\r\n <div class=\" service-header\">\r\n <div class=\"service-icon\"><mat-icon>person_outline</mat-icon></div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">{{service?.name ? service?.name : 'N/A'}}</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B9{{service?.priceDetails?.price ?\r\n service?.priceDetails?.price : 'N/A' }}</div>\r\n <div class=\"service-duration\">{{service?.duration ? service?.duration : 'N/A'}} min\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\" *ngIf=\"service?.description\">\r\n {{service?.description ? service?.description : 'N/A'}}\r\n </div>\r\n <div class=\"home-visit\" *ngIf=\"service?.homeAppointmentAvailable\"><img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/982126c1758628863129furniture_16406103.png\">Home\r\n Visit Available</div>\r\n </div>\r\n </ng-container>\r\n\r\n <!-- <div class=\"service-card\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\">\uD83D\uDC64</div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">General Consultation</div>\r\n <div class=\"service-category\">Medical</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B9800</div>\r\n <div class=\"service-duration\">30 min</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">\r\n Comprehensive health consultation\r\n </div>\r\n </div>\r\n\r\n <div class=\"service-card\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\">\uD83E\uDDE0</div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">Mental Health Counseling</div>\r\n <div class=\"service-category\">Mental Health</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B91500</div>\r\n <div class=\"service-duration\">45 min</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">\r\n Professional psychological support\r\n </div>\r\n <div class=\"home-visit\">Home Visit Available</div>\r\n </div>\r\n\r\n <div class=\"service-card\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\">\u2702</div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">Hair Cut & Styling</div>\r\n <div class=\"service-category\">Beauty</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B91200</div>\r\n <div class=\"service-duration\">45 min</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">\r\n Professional hair cutting and styling\r\n </div>\r\n <div class=\"home-visit\">Home Visit Available</div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #locationListing>\r\n <div class=\"location_section\">\r\n <div class=\"header flex-column align-items-start\">\r\n <h1>Choose Location</h1>\r\n <p>Select where you'd like to receive the service</p>\r\n </div>\r\n\r\n <div class=\"location-list\">\r\n <ng-container *ngFor=\"let location of locationData\">\r\n <div (click)=\"selectLocation(location)\"\r\n [ngClass]=\"{ 'location-card-selected' : location?.selected, 'location-card': !location?.selected }\">\r\n <div class=\"location-content\">\r\n <div class=\"location-info\">\r\n <div class=\"location-icon\"><img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/427226c1758629157758store_3171510.png\">\r\n </div>\r\n <div class=\"location-details\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <h3>{{location?.storeName ? location?.storeName : 'N/A'}}</h3>\r\n <!-- <div class=\"distance\"><mat-icon>location_on</mat-icon> 2.3 km</div> -->\r\n </div>\r\n <p>{{location?.addressDetails?.addressLine}}, {{location?.addressDetails?.city}},\r\n {{location?.addressDetails?.state}} {{location?.pincode}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n <!-- <div class=\"location-card\">\r\n <div class=\"location-content\">\r\n <div class=\"location-info\">\r\n <div class=\"location-icon branch-icon\"></div>\r\n <div class=\"location-details\">\r\n <h3>Branch Clinic</h3>\r\n <p>456 Care Avenue, Health Zone, Mumbai 400015</p>\r\n </div>\r\n </div>\r\n <div class=\"distance\">5.8 km</div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"location-card\">\r\n <div class=\"location-content\">\r\n <div class=\"location-info\">\r\n <div class=\"location-icon home-icon\"></div>\r\n <div class=\"location-details\">\r\n <h3>Home Visit</h3>\r\n <p>Your Location</p>\r\n </div>\r\n </div>\r\n <div class=\"distance\">0 km</div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #staffListing>\r\n <div class=\"w-60 overflow-hidden staff-listing\">\r\n <div class=\"d-flex w-100 h-100\">\r\n <div class=\"w-100\">\r\n <!-- Header Section -->\r\n <div class=\"staff-header mb-3\">\r\n <h1>Select Staff Member</h1>\r\n <p class=\"staff-subtitle mb-0\">Choose your preferred professional</p>\r\n </div>\r\n\r\n <!-- Staff Cards -->\r\n <div class=\"d-flex flex-column gap-4 staff-list\">\r\n <ng-container *ngFor=\"let staff of staffData\">\r\n <div class=\"card rounded-3 p-3\" (click)=\"selectStaff(staff)\"\r\n [ngClass]=\"{ 'staff-card-selected' : staff?.selected, 'staff-card': !staff?.selected }\">\r\n <div class=\"d-flex align-items-start justify-content-between\">\r\n <div class=\"d-flex align-items-start flex-grow-1\">\r\n <div\r\n class=\"staff-avatar rounded-circle d-flex align-items-center justify-content-center me-4\">\r\n {{staff?.staffName.slice(0,3).toUpperCase()}}\r\n </div>\r\n <div class=\"staff-details flex-grow-1\">\r\n <h3 class=\"staff-name\">{{staff?.staffName ? staff?.staffName : 'N/A'}}</h3>\r\n <p class=\"staff-specialty\">General Medicine</p>\r\n <!-- <p class=\"staff-description mb-0\">Experienced physician with 10+ years in\r\n general\r\n medicine and wellness care.</p> -->\r\n </div>\r\n </div>\r\n <!-- <div class=\"rating-section\">\r\n <div class=\"star-rating d-flex align-items-center\">\r\n <span class=\"star-icon\"></span>\r\n <span class=\"rating-number\">4.9</span>\r\n </div>\r\n <div class=\"review-count\">156 reviews</div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #dateSelection>\r\n <div class=\"w-60 date_section\">\r\n <div class=\"row justify-content-center h-100\">\r\n <div class=\"col-12 h-100\">\r\n <div class=\"datetime-header mb-2\">\r\n <h1>Select Date & Time</h1>\r\n <p class=\"datetime-subtitle mb-0\">Choose when you'd like your appointment</p>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"d-flex gap-4 main_container\">\r\n <!-- Left Column - Date Selection -->\r\n <div [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\">\r\n <div class=\"section-card card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Select Date</h3>\r\n\r\n <div class=\"date-picker-container d-flex align-items-center justify-content-between\"\r\n (click)=\"$event.stopPropagation()\">\r\n <input type=\"text\" class=\"date-input border-0 rounded-2\" placeholder=\"dd-mm-yyyy\"\r\n [value]=\"selectedDateStr\" readonly (click)=\"toggleCalendar($event)\">\r\n\r\n <mat-icon class=\"ms-2\" (click)=\"toggleCalendar($event)\">calendar_today</mat-icon>\r\n </div>\r\n <div class=\"position-relative\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"datepicker-popover\" *ngIf=\"showCalendar\">\r\n <mat-calendar [(selected)]=\"selectedDate\" [dateFilter]=\"dateFilter\"\r\n (selectedChange)=\"onDateSelected($event)\" class=\"datepicker-calendar\">\r\n </mat-calendar>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Right Column - Time Selection -->\r\n <div class=\"time_selection\" [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\">\r\n <div class=\"section-card card h-100 rounded-3 p-4\">\r\n <h3 class=\"section-title\">Available Times</h3>\r\n\r\n <!-- Time Slots Grid -->\r\n <div class=\"row g-2 mb-4 overflow-scroll\">\r\n <ng-container *ngIf=\"!skeletonLoader ;else slotsLoader\">\r\n <div class=\"col-4\" *ngFor=\"let time of locationTiming\">\r\n <div class=\"time-slot rounded-2\" [class.selected]=\"time.selected\"\r\n (click)=\"selectTimeSlot(time)\">{{time ?\r\n time?.value : 'N/A'}}</div>\r\n </div>\r\n </ng-container>\r\n <ng-template #slotsLoader>\r\n <!-- Time Slot Grid Skeleton Loader HTML -->\r\n <div class=\"time-slot-grid\">\r\n <!-- Row 1 -->\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n\r\n <!-- Row 2 -->\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n\r\n <!-- Row 3 -->\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n\r\n <!-- Row 4 -->\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n\r\n <!-- Row 5 -->\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n\r\n <!-- Row 6 -->\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n <div class=\"skeleton-time-slot\"></div>\r\n </div>\r\n\r\n </ng-template>\r\n </div>\r\n\r\n <!-- Waitlist Section -->\r\n <!-- <div class=\"waitlist-section rounded-3\">\r\n <div class=\"d-flex align-items-start\">\r\n <div class=\"d-flex h-100 justify-content-between flex-column\">\r\n <div class=\"waitlist-title d-flex align-items-center gap-2\"><span\r\n class=\"waitlist-icon check-icon\"></span>No\r\n slots available?</div>\r\n <div class=\"waitlist-description d-flex align-items-center gap-2\">\r\n <input class=\"form-check-input cursor-pointer\" type=\"checkbox\"\r\n id=\"flexCheckChecked\">\r\n Add me to the waitlist for earlier\r\n availability\r\n </div>\r\n </div>\r\n <div>\r\n </div>\r\n </div>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-template>\r\n<ng-template #contactDetails>\r\n <div class=\"w-60 contact_section overflow-hidden\">\r\n <div class=\"d-flex h-100\">\r\n <div class=\"h-100 w-100\">\r\n <!-- Header Section -->\r\n <div class=\"contact-header mb-2\">\r\n <h1>Contact Details</h1>\r\n <p class=\"contact-subtitle mb-0\">Provide your contact information</p>\r\n </div>\r\n\r\n <!-- Form Sections -->\r\n <div class=\"d-flex gap-3 details_container flex-column w-100\">\r\n <!-- Left Column - Personal Information -->\r\n <div class=\"d-flex gap-4\">\r\n <div\r\n [ngClass]=\"{'w-50' : selectedService?.homeAppointmentAvailable, 'w-100' : !selectedService?.homeAppointmentAvailable}\">\r\n <div class=\"form-section card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Personal Information</h3>\r\n\r\n <!-- Full Name -->\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Full Name\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.name\"\r\n (ngModelChange)=\"checkRequiredValues()\" simpoLettersOnly>\r\n </div>\r\n\r\n <!-- Email Address -->\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Email Address\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"email\" class=\"form-control form-input rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.email\"\r\n (ngModelChange)=\"checkRequiredValues()\"\r\n pattern=\"^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$\">\r\n </div>\r\n\r\n <!-- Phone Number -->\r\n <div class=\"mb-0\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Phone Number\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"tel\" class=\"form-control rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.phoneNumber\"\r\n (ngModelChange)=\"checkRequiredValues()\" simpoNumbersOnly\r\n [ngClass]=\"{'mobile_number' : appointmentPayload.customerDetail.phoneNumber.length != 10}\">\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Right Column - Home Visit Details -->\r\n <div class=\"w-50\" *ngIf=\"selectedService?.homeAppointmentAvailable\">\r\n <div class=\"form-section card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Home Visit Details</h3>\r\n\r\n <!-- Home Address -->\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Home Address\r\n </label>\r\n <textarea class=\"form-control form-textarea rounded-2\"\r\n placeholder=\"Enter your complete address\" [(ngModel)]=\"homeAddress\"></textarea>\r\n </div>\r\n\r\n <!-- Special Instructions -->\r\n <div class=\"mb-0\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Special Instructions\r\n </label>\r\n <textarea class=\"form-control form-textarea rounded-2\"\r\n placeholder=\"Any special instructions for the professional (optional)\"\r\n [(ngModel)]=\"instructions\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"policies-container\">\r\n <!-- Header -->\r\n <h2 class=\"policies-title\">Policies & Terms</h2>\r\n\r\n <!-- Policy Items -->\r\n <div class=\"policy-items-container d-flex flex-column gap-3\">\r\n <!-- Cancellation Policy -->\r\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\r\n (click)=\"showCancellationPolicy = !showCancellationPolicy\">\r\n <h3 class=\"policy-title\">Cancellation Policy</h3>\r\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\r\n *ngIf=\"!showCancellationPolicy\">keyboard_arrow_right</mat-icon>\r\n <mat-icon *ngIf=\"showCancellationPolicy\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\r\n *ngIf=\"showCancellationPolicy\">\r\n <span *ngFor=\"let policy of selectedService?.cancellationPolicy\">&#8226;\r\n {{policy}}</span>\r\n </div>\r\n\r\n <!-- Rescheduling Policy -->\r\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\r\n (click)=\"showReducingPolicy = !showReducingPolicy\">\r\n <h3 class=\"policy-title\">Rescheduling Policy</h3>\r\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\r\n *ngIf=\"!showReducingPolicy\">keyboard_arrow_right</mat-icon>\r\n <mat-icon *ngIf=\"showReducingPolicy\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\r\n *ngIf=\"showReducingPolicy\">\r\n <span *ngFor=\"let policy of selectedService?.reschedulePolicy\">&#8226; {{policy}}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Acceptance Section -->\r\n <div class=\"acceptance-section\">\r\n <input type=\"checkbox\" class=\"custom-checkbox\" [(ngModel)]=\"termsAndConditions\"\r\n (ngModelChange)=\"checkRequiredValues()\">\r\n <p class=\"acceptance-text\">\r\n I understand and accept the cancellation & rescheduling policies and\r\n <span class=\"terms-link\">Terms & Conditions<span\r\n class=\"external-link-icon\"></span></span>\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #paymentTab>\r\n <div class=\"w-60 payment_section\">\r\n <div class=\"w-100 h-100\">\r\n <div class=\"w-100 d-flex justify-content-center align-items-center flex-column\">\r\n <!-- Header Section -->\r\n <div class=\"payment-header mb-3 w-100\">\r\n <h1>Payment & Confirmation</h1>\r\n <p class=\"payment-subtitle mb-0\">Review your booking and complete payment</p>\r\n </div>\r\n\r\n <!-- Booking Summary Card -->\r\n <div class=\"booking-summary-card\" [ngClass]=\"{'w-100' : screenWidth < 475,'w-50':screenWidth > 475}\">\r\n <h2 class=\"summary-title\">Booking Summary</h2>\r\n\r\n <!-- Service -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Service</div>\r\n <div class=\"summary-value\">{{selectedService?.name ? selectedService?.name : 'N/A'}}</div>\r\n </div>\r\n\r\n <!-- Professional -->\r\n <div class=\"summary-row\" *ngIf=\"selectedStaff?.staffName\">\r\n <div class=\"summary-label\">Professional</div>\r\n <div class=\"summary-value\">{{selectedStaff?.staffName ? selectedStaff?.staffName : 'N/A'}}</div>\r\n </div>\r\n\r\n <!-- Location -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Location</div>\r\n <div class=\"summary-value\">{{selectedLocation?.storeName ? selectedLocation?.storeName : 'N/A'}}\r\n </div>\r\n </div>\r\n\r\n <!-- Date & Time -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Date & Time</div>\r\n <div class=\"summary-value\">{{selectedDateStr ? (selectedDateStr) : 'N/A'}} at\r\n {{selectedTime ? selectedTime.value : 'N/A'}}</div>\r\n </div>\r\n\r\n <!-- Duration -->\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Duration</div>\r\n <div class=\"summary-value\">{{selectedService?.duration ? selectedService?.duration : 'N/A'}}\r\n minutes</div>\r\n </div>\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Tax Percent</div>\r\n <div class=\"summary-value\">{{selectedService?.priceDetails?.taxPercent ?\r\n selectedService?.priceDetails?.taxPercent : 0}}%</div>\r\n </div>\r\n <!-- Total -->\r\n <div class=\"summary-row total-row\">\r\n <div class=\"summary-label\">Total</div>\r\n <div class=\"summary-value\">\r\n <span class=\"currency-symbol\">\u20B9</span>{{selectedService?.priceDetails?.totalPrice ?\r\n selectedService?.priceDetails?.totalPrice : '0'}}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #statusTemplate>\r\n <div class=\"booking-confirmation\">\r\n <!-- Success Icon -->\r\n <div class=\"success-icon\">\r\n <div class=\"checkmark-circle\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/881293c1758695578518success.gif\"\r\n class=\"w-100 h-100\" *ngIf=\"apiStatus\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/325000c1758695564518fail.gif\"\r\n class=\"w-100 h-100\" *ngIf=\"!apiStatus\">\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content -->\r\n <div class=\"confirmation-content\">\r\n <h1 class=\"confirmation-title\">{{apiStatus ? 'Booking Confirmed!' : 'Booking Failed'}}</h1>\r\n <p class=\"confirmation-message\">\r\n {{apiStatus ? 'Your appointment has been successfully booked.':'Failed to book you appointment. Please\r\n try again later'}}\r\n </p>\r\n\r\n <!-- Details Card -->\r\n <div class=\"d-flex w-100 align-items-center justify-content-center\" *ngIf=\"apiStatus\">\r\n <div class=\"details-card\">\r\n <h3 class=\"details-title\">Appointment Details</h3>\r\n\r\n <div class=\"details-row\">\r\n <span class=\"detail-label\">Service</span>\r\n <span class=\"detail-value\">{{appointmentPayload.serviceDetail?.name ?\r\n appointmentPayload.serviceDetail?.name : 'N/A'}}</span>\r\n </div>\r\n\r\n <div class=\"details-row\" *ngIf=\"appointmentPayload?.staffDetail?.name\">\r\n <span class=\"detail-label\">Professional</span>\r\n <span class=\"detail-value\">{{appointmentPayload.staffDetail?.name ?\r\n appointmentPayload.staffDetail?.name : 'N/A'}}</span>\r\n </div>\r\n <div class=\"details-row\">\r\n <span class=\"detail-label\">Date & Time</span>\r\n <span class=\"detail-value\">{{appointmentPayload.bookingDate ?\r\n appointmentPayload.bookingDate.slice(0,10) :\r\n 'N/A'}} at\r\n {{appointmentPayload.startTime ? appointmentPayload.startTime : 'N/A'}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n <!-- Action Buttons -->\r\n <!-- <div class=\"action-buttons\">\r\n <button class=\"btn btn-outline\">View My Bookings</button>\r\n <button class=\"btn btn-primary\">Back to Admin</button>\r\n </div> -->\r\n </div>\r\n </div>\r\n</ng-template>\r\n<ng-template #skeletonLoader *ngIf=\"skeletonLoader\">\r\n <!-- Service Skeleton Loader HTML -->\r\n <div class=\"service-grid\">\r\n <!-- Skeleton Card 1 -->\r\n <div class=\"service-card skeleton-card\">\r\n <div class=\"service-header\">\r\n <div class=\"skeleton skeleton-icon\"></div>\r\n <div class=\"service-content\">\r\n <div class=\"skeleton skeleton-title\"></div>\r\n <div class=\"skeleton skeleton-price\"></div>\r\n <div class=\"skeleton skeleton-duration\"></div>\r\n </div>\r\n </div>\r\n <div class=\"skeleton skeleton-category\"></div>\r\n <div class=\"skeleton skeleton-description\"></div>\r\n <div class=\"skeleton skeleton-badge\"></div>\r\n </div>\r\n\r\n <!-- Skeleton Card 2 -->\r\n <div class=\"service-card skeleton-card\">\r\n <div class=\"service-header\">\r\n <div class=\"skeleton skeleton-icon\"></div>\r\n <div class=\"service-content\">\r\n <div class=\"skeleton skeleton-title\"></div>\r\n <div class=\"skeleton skeleton-price\"></div>\r\n <div class=\"skeleton skeleton-duration\"></div>\r\n </div>\r\n </div>\r\n <div class=\"skeleton skeleton-category\"></div>\r\n <div class=\"skeleton skeleton-description\"></div>\r\n <div class=\"skeleton skeleton-badge\"></div>\r\n </div>\r\n\r\n <!-- Skeleton Card 3 -->\r\n <div class=\"service-card skeleton-card\">\r\n <div class=\"service-header\">\r\n <div class=\"skeleton skeleton-icon\"></div>\r\n <div class=\"service-content\">\r\n <div class=\"skeleton skeleton-title\"></div>\r\n <div class=\"skeleton skeleton-price\"></div>\r\n <div class=\"skeleton skeleton-duration\"></div>\r\n </div>\r\n </div>\r\n <div class=\"skeleton skeleton-category\"></div>\r\n <div class=\"skeleton skeleton-description\"></div>\r\n <div class=\"skeleton skeleton-badge\"></div>\r\n </div>\r\n\r\n <!-- Skeleton Card 4 -->\r\n <div class=\"service-card skeleton-card\">\r\n <div class=\"service-header\">\r\n <div class=\"skeleton skeleton-icon\"></div>\r\n <div class=\"service-content\">\r\n <div class=\"skeleton skeleton-title\"></div>\r\n <div class=\"skeleton skeleton-price\"></div>\r\n <div class=\"skeleton skeleton-duration\"></div>\r\n </div>\r\n </div>\r\n <div class=\"skeleton skeleton-category\"></div>\r\n <div class=\"skeleton skeleton-description\"></div>\r\n <div class=\"skeleton skeleton-badge\"></div>\r\n </div>\r\n\r\n <!-- Skeleton Card 5 -->\r\n <div class=\"service-card skeleton-card\">\r\n <div class=\"service-header\">\r\n <div class=\"skeleton skeleton-icon\"></div>\r\n <div class=\"service-content\">\r\n <div class=\"skeleton skeleton-title\"></div>\r\n <div class=\"skeleton skeleton-price\"></div>\r\n <div class=\"skeleton skeleton-duration\"></div>\r\n </div>\r\n </div>\r\n <div class=\"skeleton skeleton-category\"></div>\r\n <div class=\"skeleton skeleton-description\"></div>\r\n <div class=\"skeleton skeleton-badge\"></div>\r\n </div>\r\n\r\n <!-- Skeleton Card 6 -->\r\n <div class=\"service-card skeleton-card\">\r\n <div class=\"service-header\">\r\n <div class=\"skeleton skeleton-icon\"></div>\r\n <div class=\"service-content\">\r\n <div class=\"skeleton skeleton-title\"></div>\r\n <div class=\"skeleton skeleton-price\"></div>\r\n <div class=\"skeleton skeleton-duration\"></div>\r\n </div>\r\n </div>\r\n <div class=\"skeleton skeleton-category\"></div>\r\n <div class=\"skeleton skeleton-description\"></div>\r\n <div class=\"skeleton skeleton-badge\"></div>\r\n </div>\r\n </div>\r\n</ng-template>", styles: ["body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;background-color:#fff;color:#000;line-height:1.6}.main_section{position:relative;height:100%}.main_header{padding:1%;width:100%;background:#fff;height:15%}.main_body{height:75%;padding-top:0%;overflow:scroll}.header{display:flex;align-items:center;justify-content:space-between}.back-btn mat-icon{height:16px!important;width:20px!important;font-size:21px!important}.back-btn span{color:#000;font-size:15px;font-weight:500}.back-btn:hover{background-color:#f0f0f0}.header-title{flex-grow:1;margin-left:2rem}.header-title h1{font-size:20px;font-weight:600;margin-bottom:0}.header-title p{color:#666;font-size:14px}.step-indicator{font-size:14px;color:#000;font-weight:700}.progress-bar{width:100%;height:8px;background-color:#e0e0e0;margin-bottom:1rem;border-radius:10px;overflow:hidden}.w-60{width:60%!important}.progress-fill{height:100%;width:14.28%;background-color:#000}.service-selection h2{font-size:20px;font-weight:600;margin:.25rem 0}.service-selection p{color:#666;font-size:16px;margin-bottom:1rem}.main_footer{border-top:1px solid lightgrey;width:100%;background-color:#fff;height:10%}.services-grid{display:grid;grid-template-columns:48% 48%;gap:15px;padding-bottom:5px}.service-card{border:1px solid lightgrey;border-radius:8px;padding:24px;background-color:#fff;cursor:pointer;transition:all .3s ease;position:relative}.service-card:hover{background-color:#f9f9f9;box-shadow:0 4px 8px #0000001a}.service-card-selected{border:2px solid black;border-radius:8px;padding:24px;background-color:#fff;cursor:pointer;transition:all .3s ease;position:relative}.service-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:3rem}.service-info{flex-grow:1}.service-icon{width:40px;height:40px;border-radius:8px;background-color:#f0f0f0;display:flex;align-items:center;justify-content:center;margin-right:1rem;font-size:20px;margin-top:.2rem}.service-title{font-size:18px;font-weight:600;margin-bottom:4px}.service-category{background-color:#f0f0f0;color:#000;padding:1% 4%;border-radius:12px;font-size:12px;font-weight:500;display:inline-block}.service-price{font-size:17px;font-weight:700;color:#000}.service-duration{font-size:12px;color:#666;display:flex;justify-content:center;align-items:center}.service-description{color:#666;font-size:15px;margin-bottom:.5rem;line-height:1.5}.home-visit{display:flex;align-items:center;font-size:12px;color:#666;border:1px solid lightgrey;padding:.5% 1%;border-radius:4px;background-color:#fff;width:10vw;height:3vh;white-space:nowrap;justify-content:space-around}.home-visit img{width:18px}.footer-buttons{display:flex;justify-content:space-between;align-items:center;width:60%}.back-footer-btn{color:#000;padding:12px 24px;font-size:16px}.continue-btn{background-color:#000;color:#fff;border:2px solid black;padding:.5%;border-radius:4px;font-size:15px!important;font-weight:600;cursor:pointer;width:6vw!important}.continue-btn:hover{background-color:#333}.continue-btn:disabled{background-color:#ccc;border-color:#ccc;cursor:not-allowed}.location_section{width:60%;overflow:hidden}.location_section .header h1{font-size:20px;font-weight:600;margin:.25rem 0}.location_section .header p{font-size:16px;color:#888;font-weight:400}.location-list{display:flex;flex-direction:column;gap:20px;height:64vh;overflow-x:scroll;padding-bottom:1%}.location-card{border:1px solid lightgrey;border-radius:12px;padding:1.5rem 1.5rem 2rem;cursor:pointer;transition:all .3s ease}.location-card:hover{box-shadow:0 4px 8px #0000001a}.location-card-selected{border:1px solid black;border-radius:12px;padding:1.5rem 1.5rem 2rem;cursor:pointer;transition:all .3s ease}.location-content{display:flex;align-items:center;justify-content:space-between}.location-info{display:flex;align-items:center;flex-grow:1}.location-icon{width:40px;height:40px;background-color:#d3d3d3;border-radius:8px;display:flex;align-items:center;justify-content:center;margin-right:20px}.location-icon img{width:28px}.location-details{width:95%}.location-details h3{font-size:16px;font-weight:600;margin-bottom:0}.location-details p{font-size:14px;color:#aaa;line-height:1.4;margin:0}.distance{display:flex;align-items:center;color:#888;font-size:14px;margin-left:20px}.distance mat-icon{width:18px!important;height:15px!important;font-size:17px}.staff-header h1{font-size:20px;font-weight:600;margin:.25rem 0}.staff-subtitle{font-size:16px;color:#888;font-weight:400}.staff-card{border:1px solid lightgrey;cursor:pointer;transition:all .3s ease}.staff-card:hover{box-shadow:0 4px 8px #0000001a}.staff-card-selected{border-color:#666;cursor:pointer;transition:all .3s ease}.staff-avatar{width:64px;height:64px;background-color:gray;font-size:20px;font-weight:600;color:#fff}.staff-name{font-size:16px;font-weight:600;margin-bottom:0}.staff-specialty{font-size:14px;color:gray;margin-bottom:8px}.staff-description{font-size:14px;color:gray;line-height:1.4}.rating-section{display:flex;flex-direction:column;align-items:flex-end}.star-rating{color:gold;font-size:16px;margin-bottom:4px;width:100%}.rating-number{font-size:18px;font-weight:600;color:#000}.review-count{font-size:12px;color:#888}.star-icon:before{content:\"\\2b50\";margin-right:4px}.staff_section{width:60%;overflow:hidden}.staff-list{height:64vh;overflow-x:scroll;padding-bottom:1%}.datetime-header h1{font-size:20px;font-weight:600;margin:.25rem 0}.main_container{height:85%}.datetime-subtitle{font-size:16px;color:#888;font-weight:400}.section-card{border:1px solid lightgrey}.section-title{font-size:17px;font-weight:600;margin-bottom:20px}.date-picker-container{border:1px solid lightgrey}.date-picker-container mat-icon{height:17px;font-size:18px}.date-input{font-size:16px;padding:2%;width:auto;outline:none}.time-slot{border:1px solid lightgrey;font-size:14px;font-weight:500;padding:6%;cursor:pointer;transition:all .3s ease;text-align:center;min-width:80px}.time-slot:hover{box-shadow:0 4px 8px #0000001a}.time-slot.selected{background-color:#555;border-color:#777;color:#fff}.waitlist-section{background-color:#789;border:none;padding:4%;max-height:13vh}.waitlist-icon{color:#4ade80;font-size:18px}.waitlist-title{color:#fff;font-size:16px;font-weight:500;margin-bottom:8px}.mobile_number{border-color:#dc3545!important;box-shadow:0 0 0 .1rem #ffc3c3}.waitlist-description{color:#fff;font-size:14px;margin-bottom:0;font-weight:500}.waitlist-description .form-check-input{width:17px;height:17px;background-color:transparent}.waitlist-description .form-check-input:checked{background-color:#0d6efd}.check-icon:before{content:\"\\2713\"}.contact-header h1{font-size:20px;font-weight:600;margin:.25rem 0}.contact-subtitle{font-size:16px;color:#888;font-weight:400}.form-section{border:1px solid lightgrey}.section-title{font-size:16px;font-weight:600;margin-bottom:24px}.form-label{font-size:14px;font-weight:500;margin-bottom:8px}.required-asterisk{color:#ff6b6b;margin-left:4px}.form-input{border:1px solid lightgrey;font-size:16px;padding:1%;transition:all .3s ease}.form-input:focus{border-color:#777}.form-input::placeholder{color:#aaa;font-size:14px}.form-textarea{border:1px solid lightgrey;font-size:16px;padding:12px 16px;resize:vertical;max-height:120px;transition:all .3s ease}.form-textarea:focus{border-color:#777}.form-textarea::placeholder{color:#aaa;font-size:14px}.optional-label{color:#888;font-size:12px;font-style:italic}.details_container{height:89%;overflow-x:scroll;padding-bottom:1%}.policies-container{background-color:#fff;border:1px solid lightgrey;padding:2rem;border-radius:12px}.policies-title{font-size:16px;font-weight:600;color:#000;margin-bottom:1rem}.policy-item{background-color:#fff;border:1px solid lightgrey;border-radius:8px;padding:1%;cursor:pointer;transition:all .3s ease}.cancellation_policies{padding:1% .5%;font-weight:500}.policy-item:hover{background-color:#f8f9fa;border-color:#ccc}.policy-item:last-of-type{margin-bottom:32px}.policy-title{font-size:14px;font-weight:500;color:#000;margin:0}.acceptance-section{display:flex;align-items:flex-start;gap:7px;margin-top:8px}.custom-checkbox{width:18px;height:20px;background-color:#fff;border:1px solid lightgrey;border-radius:4px;margin-top:2px;cursor:pointer;position:relative;flex-shrink:0;transition:all .3s ease}.custom-checkbox:hover{border-color:#999;background-color:#f8f9fa}.custom-checkbox.checked{background-color:#007bff;border-color:#007bff}.custom-checkbox.checked:after{content:\"\\2713\";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;font-size:12px;font-weight:700}.acceptance-text{font-size:14px;color:#000;line-height:1.5;margin:0}.terms-link{color:#007bff;text-decoration:none;font-weight:500;position:relative}.terms-link:hover{color:#0056b3;text-decoration:underline}.external-link-icon{margin-left:4px;font-size:12px;opacity:.8}.external-link-icon:after{content:\"\\2197\"}.payment-header h1{font-size:20px;font-weight:600;color:#000;margin:.25rem 0}.payment-subtitle{font-size:16px;color:#666;font-weight:400}.booking-summary-card{background-color:#fff;border:1px solid lightgrey;padding:2%;border-radius:12px}.summary-title{font-size:18px;font-weight:600;color:#000;margin-bottom:32px}.summary-row{display:flex;justify-content:space-between;align-items:center;padding:12px 0}.summary-row:last-child{border-bottom:none;padding-bottom:0}.summary-label{font-size:16px;color:#000;font-weight:500}.summary-value{font-size:16px;color:#000;font-weight:400;text-align:right}.total-row{margin-top:16px;padding-top:16px}.total-row .summary-label,.total-row .summary-value{font-size:20px;font-weight:600}.currency-symbol{font-size:18px}.complete_booking{background:#e3fee3;border:none;padding:.5%;width:12vw!important;font-size:15px!important;font-weight:500;border-radius:4px;white-space:nowrap}.complete_booking img{width:30px}.pay-now-btn{justify-content:unset!important;background:#e3fee3;border:none;padding:.5%;width:8vw!important;font-size:15px!important;font-weight:500;border-radius:4px;gap:.5rem}.pay-now-btn img{width:30px}.booking-confirmation{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;text-align:center;width:60%;border-radius:10px}.success-icon{margin-bottom:1.5rem}.checkmark-circle{width:80px;height:80px;position:relative}.checkmark{width:80px;height:80px;border-radius:50%;display:block;stroke-width:3;stroke:#22c55e;stroke-miterlimit:10;animation:checkmark-fill .4s ease-in-out .4s forwards,checkmark-scale .3s ease-in-out .9s both}.checkmark-circle-path{stroke-dasharray:166;stroke-dashoffset:166;stroke-width:3;stroke-miterlimit:10;stroke:#22c55e;fill:none;animation:checkmark-stroke .6s cubic-bezier(.65,0,.45,1) forwards}.checkmark-check{transform-origin:50% 50%;stroke-dasharray:48;stroke-dashoffset:48;stroke:#22c55e;stroke-width:3;animation:checkmark-stroke .3s cubic-bezier(.65,0,.45,1) .8s forwards}@keyframes checkmark-stroke{to{stroke-dashoffset:0}}@keyframes checkmark-scale{0%,to{transform:none}50%{transform:scale3d(1.1,1.1,1)}}@keyframes checkmark-fill{to{box-shadow:inset 0 0 0 30px #22c55e}}.confirmation-content{width:100%;height:80%}.confirmation-title{font-size:18px;font-weight:700}.confirmation-message{font-size:1rem;margin-bottom:1rem;line-height:1.6;font-weight:500}.details-card{background:#ffffff1a;border:1px solid lightgrey;border-radius:16px;padding:1.5rem;margin-bottom:2rem;width:35vw}.details-title{font-size:1.25rem;font-weight:600;margin:0 0 1.5rem}.details-row{display:flex;justify-content:space-between;align-items:center;padding:.75rem 0;border-bottom:1px solid rgba(255,255,255,.1)}.details-row:last-child{border-bottom:none}.detail-label{font-size:.9rem;font-weight:500}.detail-value{font-weight:600;font-size:1rem}.action-buttons{display:flex;gap:1rem;justify-content:center;flex-wrap:wrap}.btn{padding:.75rem 1.5rem;border-radius:8px;font-weight:600;font-size:.9rem;cursor:pointer;transition:all .2s ease;border:none;min-width:140px}.btn-outline{background:transparent;border:2px solid rgba(255,255,255,.3);color:#fff}.btn-outline:hover{background:#ffffff1a;border-color:#ffffff80}.btn-primary{background:#fff;color:#1f2937}.btn-primary:hover{background:#f3f4f6;transform:translateY(-1px)}.datepicker-popover{position:absolute;z-index:1000;margin-top:8px;border-radius:16px;overflow:hidden;box-shadow:0 12px 28px #0000001f,0 2px 4px #00000014;background:#fff;border:1px solid rgba(0,0,0,.06);width:17vw}::ng-deep .datepicker-calendar{border-radius:16px!important;overflow:hidden!important;font-family:Segoe UI,Roboto,sans-serif!important;width:100%!important}::ng-deep .mat-calendar-header{background:linear-gradient(135deg,#667eea,#764ba2)!important;color:#fff!important;padding:3px!important;display:flex!important;align-items:center!important;justify-content:space-between!important;min-height:60px!important;border-radius:16px 16px 0 0!important}::ng-deep .mat-calendar-controls{display:flex!important;align-items:center!important;justify-content:space-between!important;width:100%!important;margin:2% calc(4.7142857143% - 16px)!important}::ng-deep .mat-calendar-period-button{color:#fff!important;font-weight:700!important;font-size:16px!important;letter-spacing:.5px!important;background:transparent!important;border:none!important;padding:12px 16px!important;border-radius:8px!important;transition:all .3s ease!important;flex-grow:1!important;text-align:left!important;margin:0!important;order:1!important}::ng-deep .mat-calendar-period-button:hover{background:#ffffff26!important;transform:translateY(-1px)!important}::ng-deep .mat-calendar-header .mat-calendar-controls>div{display:flex;order:2!important}::ng-deep .mat-calendar-previous-button,::ng-deep .mat-calendar-next-button{color:#fff!important;width:40px!important;height:40px!important;border-radius:50%!important;background:#ffffff1a!important;border:1px solid rgba(255,255,255,.2)!important;transition:all .3s ease!important;margin:0 4px!important;display:flex!important;align-items:center!important;justify-content:center!important}::ng-deep .mat-calendar-previous-button:hover,::ng-deep .mat-calendar-next-button:hover{background:#ffffff40!important;transform:scale(1.05)!important}::ng-deep .mat-calendar-arrow{fill:#fff!important;width:20px!important;height:20px!important}::ng-deep .mat-calendar-content{padding:10px 16px!important;background:#fff!important}::ng-deep .mat-calendar-table-header th{color:#6b7280!important;font-weight:600!important;font-size:12px!important;text-align:center!important;padding-bottom:12px!important;text-transform:uppercase!important}::ng-deep .mat-calendar-table{border-spacing:0!important;border-collapse:collapse!important;width:100%!important}::ng-deep .mat-calendar-body-cell{height:44px!important;width:44px!important;border-radius:12px!important}::ng-deep .mat-calendar-body-cell-content{width:33px!important;height:32px!important;display:flex!important;align-items:center!important;justify-content:center!important;font-weight:500!important;font-size:14px!important;color:#374151!important;transition:all .3s cubic-bezier(.4,0,.2,1)!important}::ng-deep .mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover .mat-calendar-body-cell-content:not(.mat-calendar-body-selected){background:#667eea1a!important;color:#667eea!important;transform:scale(1.05)!important}::ng-deep .mat-calendar-body-selected{background:linear-gradient(135deg,#667eea,#764ba2)!important;color:#fff!important;box-shadow:0 4px 12px #677eea4d!important}::ng-deep .mat-calendar-body-today:not(.mat-calendar-body-selected){border:none;color:#667eea!important;font-weight:700!important}::ng-deep .mat-calendar-body-disabled>.mat-calendar-body-cell-content:not(.mat-calendar-body-selected){color:#d1d5db!important}.service-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:20px;padding:20px;width:60%}.service-card{border:1px solid #e5e5e5;border-radius:8px;padding:20px;background:#fff;box-shadow:0 2px 4px #0000001a}.service-header{display:flex;align-items:flex-start;gap:15px;margin-bottom:15px}.service-content{flex:1;display:flex;flex-direction:column;gap:8px}.skeleton{background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%;animation:skeleton-loading 1.5s infinite;border-radius:4px}@keyframes skeleton-loading{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-icon{width:40px;height:40px;border-radius:50%;flex-shrink:0}.skeleton-title{height:20px;width:70%}.skeleton-price{height:18px;width:50%;align-self:flex-end}.skeleton-duration{height:14px;width:40%;align-self:flex-end}.skeleton-category{height:24px;width:25%;border-radius:12px;margin-bottom:10px}.skeleton-description{height:16px;width:85%;margin-bottom:15px}.skeleton-badge{height:32px;width:45%;border-radius:16px;margin-top:10px}@media (max-width: 768px){.service-grid{grid-template-columns:1fr;gap:15px;padding:15px}.service-card{padding:15px}}.time-slot-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;padding:16px;max-width:400px;margin:0 auto}.skeleton-time-slot{height:44px;border-radius:8px;background:linear-gradient(90deg,#f0f0f0 25%,#e0e0e0,#f0f0f0 75%);background-size:200% 100%;animation:skeleton-shimmer 1.5s infinite;border:1px solid #e5e5e5;position:relative}@keyframes skeleton-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-time-slot:nth-child(2n){animation:skeleton-pulse 2s infinite}@keyframes skeleton-pulse{0%,to{opacity:1}50%{opacity:.7}}@media (max-width: 480px){.time-slot-grid{grid-template-columns:repeat(2,1fr);gap:10px;padding:12px}.skeleton-time-slot{height:40px}}@media (max-width: 320px){.time-slot-grid{grid-template-columns:1fr}}@media screen and (min-width:320px) and (max-width:475px){.back-btn{gap:.25rem!important;margin:0!important}.back-btn span{color:#000;font-size:12px;font-weight:500;white-space:nowrap}.back-btn mat-icon{font-size:16px!important;margin-bottom:0!important}.header-title{display:flex;align-items:center;margin-bottom:0rem!important}.header-title h1{font-size:16px!important}.main_header .header{padding:3%}.date_section,.service_section,.location_section,.contact_section,.payment_section{width:100%!important;padding:0% 5%}.service_section h2{font-size:17px!important;margin-bottom:0!important}.service_section p{font-size:14px!important}.main_section{height:100vh}.services-grid{display:flex;justify-content:center;flex-wrap:wrap}.service-card,.service-card-selected{width:90vw!important}.home-visit{width:40vw!important}.back-footer-btn{padding:12px 2px!important}.footer-buttons{padding:0% 3%!important;width:100%!important}.continue-btn{width:22vw!important}.main_container{flex-wrap:wrap;height:100%!important}.date_section{overflow:hidden}.date_section .time_selection{height:60%}.datepicker-popover{width:60vw!important}.details_container{height:90%!important;justify-content:space-around}.complete_booking{width:39vw!important}.booking_confirmation,.details-card{width:100%!important}.datetime-header h1{margin:0!important}}@media screen and (max-width: 475px){.main_header{height:10%}.main_body{height:83%}.main_footer{height:7%}.staff-listing{width:100%!important;padding:0% 5%}.booking-confirmation{width:auto;padding:0rem}}\n"] }]
476
476
  }], ctorParameters: () => [{ type: i1.RestService }, { type: i2.EventsService }, { type: i3.Router }, { type: i4.MessageService }], propDecorators: { data: [{
477
477
  type: Input
478
478
  }], index: [{
@@ -492,4 +492,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
492
492
  type: HostListener,
493
493
  args: ['document:click']
494
494
  }] } });
495
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwb2ludG1lbnQtYm9va2luZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL3NlY3Rpb25zL2FwcG9pbnRtZW50LWZvcm0vYXBwb2ludG1lbnQtYm9va2luZy9hcHBvaW50bWVudC1ib29raW5nL2FwcG9pbnRtZW50LWJvb2tpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9zZWN0aW9ucy9hcHBvaW50bWVudC1mb3JtL2FwcG9pbnRtZW50LWJvb2tpbmcvYXBwb2ludG1lbnQtYm9va2luZy9hcHBvaW50bWVudC1ib29raW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUk3RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDcEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sYUFBYSxDQUFDOzs7Ozs7Ozs7O0FBUzdDLE1BQU0sT0FBTywyQkFBMkI7SUFDdEMsWUFDVSxXQUF3QixFQUN4QixhQUE0QixFQUNuQixNQUFjLEVBQ2QsY0FBOEI7UUFIdkMsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDbkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQWdCakQsZ0JBQVcsR0FBVyxDQUFDLENBQUM7UUFTeEIsaUJBQVksR0FBRztZQUNiLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLGVBQWUsRUFBRSxLQUFLO1lBQ3RCLFlBQVksRUFBRSxLQUFLO1NBQ3BCLENBQUE7UUFDRCxtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQyxpQkFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEssZUFBVSxHQUFRLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDN0osaUJBQVksR0FBWSxLQUFLLENBQUM7UUFDOUIsZ0JBQVcsR0FBVyxFQUFFLENBQUM7UUFDekIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QiwyQkFBc0IsR0FBWSxLQUFLLENBQUM7UUFDeEMsdUJBQWtCLEdBQVksS0FBSyxDQUFDO1FBQ3BDLG9CQUFlLEdBQVEsRUFBRSxDQUFDO1FBRTFCLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBQ3pCLGlCQUFZLEdBQVcsRUFBRSxDQUFDO1FBQzFCLFdBQU0sR0FBRyxNQUFNLENBQUM7UUFDaEIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsaUJBQVksR0FBZ0IsSUFBSSxDQUFDO1FBQ2pDLG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLGdCQUFXLEdBQUc7WUFDWixJQUFJLEVBQUUsRUFBRTtZQUNSLEtBQUssRUFBRSxFQUFFO1lBQ1QsWUFBWSxFQUFFLEVBQUU7U0FDakIsQ0FBQTtRQUNELGVBQVUsR0FBRyxDQUFDLENBQWMsRUFBVyxFQUFFO1lBQ3ZDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ3pCLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQTtRQStJRCxnQkFBVyxHQUFVLEVBQUUsQ0FBQztRQThCeEIsaUJBQVksR0FBVSxFQUFFLENBQUM7UUFzQ3pCLGlCQUFZLEdBQVE7WUFDbEIsU0FBUyxFQUFFLEVBQUU7WUFDYixPQUFPLEVBQUUsRUFBRTtZQUNYLFVBQVUsRUFBRSxFQUFFO1NBQ2YsQ0FBQTtRQUNELGNBQVMsR0FBVSxFQUFFLENBQUM7UUFxRHRCLGlCQUFZLEdBQVE7WUFDbEIsT0FBTyxFQUFFLEVBQUU7WUFDWCxTQUFTLEVBQUUsRUFBRTtZQUNiLFVBQVUsRUFBRSxFQUFFO1lBQ2QsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQTtRQUNELG1CQUFjLEdBQVUsRUFBRSxDQUFDO1FBQzNCLFdBQU0sR0FBWSxLQUFLLENBQUM7UUErQnhCLGlCQUFZLEdBQVksS0FBSyxDQUFDO1FBVTlCLHVCQUFrQixHQUFZLEtBQUssQ0FBQztRQVVwQyx1QkFBa0IsR0FBUTtZQUN4QixXQUFXLEVBQUU7Z0JBQ1gsRUFBRSxFQUFFLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLEVBQUU7YUFDVDtZQUNELFdBQVcsRUFBRSxFQUFFO1lBQ2YsU0FBUyxFQUFFLEVBQUU7WUFDYixjQUFjLEVBQUU7Z0JBQ2QsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsS0FBSyxFQUFFLEVBQUU7YUFDVjtZQUNELGFBQWEsRUFBRTtnQkFDYixFQUFFLEVBQUUsRUFBRTtnQkFDTixJQUFJLEVBQUUsRUFBRTthQUNUO1lBQ0QsT0FBTyxFQUFFLEVBQUU7WUFDWCxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1NBQ2hDLENBQUE7UUFpQkQsY0FBUyxHQUFZLEtBQUssQ0FBQztJQWhhM0IsQ0FBQztJQVNELFFBQVE7UUFDTixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFHRCxhQUFhO1FBQ1gsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQWlDRCxjQUFjLENBQUMsS0FBYTtRQUMxQixJQUFJLEtBQUs7WUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDekMsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFTO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBQ08sVUFBVSxDQUFDLENBQU87UUFDeEIsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDaEQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3QixPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQsYUFBYSxDQUFDLE9BQVk7UUFDeEIsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDeEIsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNoRixJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDeEMsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxDQUFBO1FBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDMUQsQ0FBQztJQUNELGNBQWMsQ0FBQyxRQUFhO1FBQzFCLFFBQVEsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLFFBQVEsQ0FBQyxFQUFFLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3JFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3pDLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO0lBQ25DLENBQUM7SUFFRCxXQUFXLENBQUMsS0FBVTtRQUNwQixLQUFLLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3RFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUNELFFBQVE7UUFDTixJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDekQsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQ3hDLDRCQUE0QjtZQUM1Qiw0QkFBNEI7WUFDNUIsSUFBSTtZQUNKLFNBQVM7WUFDVCw2Q0FBNkM7WUFDN0MsNENBQTRDO1lBQzVDLCtCQUErQjtZQUMvQixNQUFNO1lBQ04sK0NBQStDO1lBQy9DLHlDQUF5QztZQUN6QywrQkFBK0I7WUFDL0IsTUFBTTtZQUNOLFdBQVc7WUFDWCwwQ0FBMEM7WUFDMUMsK0JBQStCO1lBQy9CLHlEQUF5RDtZQUN6RCxrQ0FBa0M7WUFDbEMsTUFBTTtZQUNOLElBQUk7WUFDSixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDekIsQ0FBQzthQUNJLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztZQUN6Qyw0QkFBNEI7WUFDNUIsd0JBQXdCO1lBRXhCLElBQUk7WUFDSixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDckIsQ0FBQzthQUNJLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxjQUFjLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7WUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUM7WUFDbkMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDeEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDM0IsQ0FBQzthQUNJLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxlQUFlLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFBO1lBQ2xNLElBQUksQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUM7WUFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUE7UUFDekIsQ0FBQzthQUNJLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO1lBQy9DLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFBO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBQ0QsWUFBWTtRQUNWLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO29CQUN4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQztpQkFDSSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssY0FBYyxFQUFFLENBQUM7Z0JBQzdDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO2dCQUMxQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO2dCQUMxQixDQUFDO3FCQUNJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDMUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQztvQkFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7Z0JBQzFCLENBQUM7WUFDSCxDQUFDO2lCQUNJLElBQUksSUFBSSxDQUFDLFdBQVcsS0FBSyxlQUFlLEVBQUUsQ0FBQztnQkFDOUMsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUNuQyxJQUFJLENBQUMsV0FBVyxHQUFHLGNBQWMsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7Z0JBQzFCLENBQUM7cUJBQ0ksSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLGlCQUFpQixDQUFDO29CQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztnQkFDMUIsQ0FBQztxQkFDSSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLENBQUM7b0JBQzFDLElBQUksQ0FBQyxXQUFXLEdBQUcsZ0JBQWdCLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO2dCQUMxQixDQUFDO1lBQ0gsQ0FBQztpQkFDSSxJQUFJLElBQUksQ0FBQyxXQUFXLEtBQUssZ0JBQWdCLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUM7Z0JBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO1lBQzFCLENBQUM7aUJBQ0ksSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsV0FBVyxHQUFHLGdCQUFnQixDQUFDO2dCQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUMxQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUE7UUFDMUIsSUFBSSxjQUFjLEdBQVE7WUFDeEIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksRUFBRTtZQUNqQyxNQUFNLEVBQUUsQ0FBQztZQUNULElBQUksRUFBRSxHQUFHO1NBQ1YsQ0FBQTtRQUNELElBQUksQ0FBQyxXQUFXLENBQUMsd0JBQXdCLENBQUMsY0FBYyxDQUFDLENBQUMsU0FBUyxDQUNqRSxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ1gsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFZLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ2pGLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQztnQkFDOUQsZ0NBQWdDO2dCQUNoQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDeEQsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMzQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3pCLENBQUM7cUJBQ0ksQ0FBQztvQkFDSixJQUFJLENBQUMsV0FBVyxHQUFHLGdCQUFnQixDQUFDO29CQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztnQkFDMUIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDLEVBQ0QsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNSLDJCQUEyQjtRQUM3QixDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbkIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxPQUFPLEdBQUcsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQUUsQ0FBQTtRQUNuRCxJQUFJLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQzlDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDWCxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxTQUFTLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUUsR0FBRyxPQUFPLEtBQUssQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNGLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTtvQkFDbEMsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7d0JBQ3hELFFBQVEsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO3dCQUMxQixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDbkMsQ0FBQztnQkFDSCxDQUFDLENBQUMsQ0FBQTtnQkFDRixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNuQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDN0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztvQkFDMUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUNyQixDQUFDO3FCQUNJLENBQUM7b0JBQ0osSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsaUJBQWlCLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO29CQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7Z0JBQzNDLENBQUM7WUFDSCxDQUFDO2lCQUNJLENBQUM7Z0JBQ0osSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLHdDQUF3QyxFQUFFLENBQUMsQ0FBQztnQkFDekgsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsMkJBQTJCO1FBQzdCLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQU9ELFdBQVc7UUFDVCxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUM1RCxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNwRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxDQUN2RCxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ1gsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztnQkFDM0YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDO2dCQUN4RCxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNoQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztvQkFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxlQUFlLENBQUM7b0JBQ25DLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO29CQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3ZDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO29CQUN6QixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQ3pDLENBQUM7cUJBQ0ksSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO29CQUNsQyxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQztvQkFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUN4QyxDQUFDO1lBQ0gsQ0FBQztpQkFDSSxDQUFDO2dCQUNKLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLHVDQUF1QyxFQUFFLENBQUMsQ0FBQztnQkFDN0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDdEIsQ0FBQztRQUNILENBQUMsRUFDRCxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ1IsMkJBQTJCO1FBQzdCLENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELGVBQWUsQ0FBQyxJQUFZO1FBQzFCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxlQUFlO1FBQzNELElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEQsSUFBSSxRQUFRLEtBQUssSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ2QsQ0FBQztRQUNELElBQUksUUFBUSxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDdEMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUNaLENBQUM7UUFFRCxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUM3QyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMvQyxPQUFPLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxRQUFRLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBU0QsaUJBQWlCO1FBQ2YsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDcEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDcEcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7UUFDckQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzdDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDaEMsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDO1FBQ3BFLElBQUksSUFBSSxDQUFDLGFBQWE7WUFDcEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3pFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFTLEVBQUUsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FBQTtZQUNGLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUseURBQXlELEVBQUUsQ0FBQyxDQUFDO1lBQy9JLENBQUM7UUFDSCxDQUFDLEVBQ0MsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztZQUM5RyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUN0QixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFHRCxjQUFjLENBQUMsSUFBUztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztRQUNyQixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQy9ELElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUNyQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssRUFBRSxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzdNLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLHVJQUF1STtRQUN6SSxDQUFDO2FBQ0ksQ0FBQztZQUNKLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBcUJELFlBQVk7UUFDVixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzFELElBQUksWUFBWSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzVCLENBQUM7YUFDSSxDQUFDO1lBQ0osSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsQ0FBQztnQkFDekQsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7WUFDbkMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDO1FBQ0QsNEJBQTRCO0lBQzlCLENBQUM7SUFFRCxpQkFBaUI7UUFDZixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDN0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN4RCxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQztRQUNyRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FBQztRQUN6RSxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUM7UUFDNUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxTQUFTLENBQUM7UUFDM0UsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUM7UUFDeEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RixJQUFJLENBQUMsa0JBQWtCLENBQUMsV0FBVyxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDO1FBQzFFLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDakYsSUFBSSxDQUFDLFdBQVcsR0FBRyxnQkFBZ0IsQ0FBQztZQUNwQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN4QixDQUFDLEVBQ0MsQ0FBQyxLQUFVLEVBQUUsRUFBRTtZQUNiLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN6RyxDQUFDLENBQ0YsQ0FBQTtJQUNILENBQUM7SUFDRCx5QkFBeUI7UUFDdkIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUM7UUFDckUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxTQUFTLENBQUM7UUFDekUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxDQUFDO1FBQzVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsU0FBUyxDQUFDO1FBQzNFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDO1FBQ3hFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDOUYsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsQ0FBQztRQUMxRSxJQUFJLENBQUMsV0FBVyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFNBQVMsQ0FDdkUsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNYLFlBQVksQ0FBQyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLGNBQWMsRUFBRSxHQUFHLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFGLENBQUMsRUFDRCxDQUFDLEtBQVUsRUFBRSxFQUFFO1lBQ2IsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7WUFDcEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3pHLENBQUMsQ0FDRixDQUFBO0lBRUgsQ0FBQztJQUNELE1BQU07UUFDSixJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDekQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLENBQUE7UUFDakUsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDNUIsQ0FBQztJQUNILENBQUM7K0dBaGVVLDJCQUEyQjttR0FBM0IsMkJBQTJCLHVVQUozQixDQUFDLGNBQWMsQ0FBQywwQkN0QjdCLDJwc0NBNnJCYyxtMmxCRHhxQmtCLFlBQVksMGxCQUFFLE9BQU8sMElBQUUsa0JBQWtCLDhCQUFFLG1CQUFtQiwwYkFBRSxXQUFXLHc3QkFBRSxtQkFBbUIsOEJBQUUsY0FBYywrQkFBRSxvQkFBb0IsK0RBQUUsb0JBQW9CLDhEQUFFLFdBQVc7OzRGQUs1TCwyQkFBMkI7a0JBUnZDLFNBQVM7K0JBQ0UsMkJBQTJCLGNBQ3pCLElBQUksV0FDUCxDQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLENBQUMsYUFDN0wsQ0FBQyxjQUFjLENBQUM7OEpBYWxCLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFRTixhQUFhO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBSzFDLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDZGtEcmFnUGxhY2Vob2xkZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2RyYWctZHJvcFwiO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pY29uXCI7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkXCI7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXJcIjtcbmltcG9ydCB7IE1hdE5hdGl2ZURhdGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IEV2ZW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9ldmVudHMuc2VydmljZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XG5pbXBvcnQgeyBCYW5uZXJDb250ZW50TW9kZWwsIEJhbm5lclNlY3Rpb25Nb2RlbCB9IGZyb20gJy4uLy4uL2FwcG9pbnRtZW50LWZvcm0ubW9kZWwnO1xuaW1wb3J0IHsgQmFja2dyb3VuZE1vZGVsLCBCYW5uZXJTdHlsZXNNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3N0eWxlcy9zdHlsZS5tb2RlbCc7XG5pbXBvcnQgeyBMZXR0ZXJzT25seURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uLy4uL2RpcmVjdGl2ZS9sZXR0ZXJzLW9ubHkuZGlyZWN0aXZlJztcbmltcG9ydCB7IE51bWJlcnNPbmx5RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGlyZWN0aXZlL251bWJlcnMtb25seS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgVG9hc3RNb2R1bGUgfSBmcm9tIFwicHJpbWVuZy90b2FzdFwiO1xuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaW1wby1hcHBvaW50bWVudC1ib29raW5nJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0Nka0RyYWdQbGFjZWhvbGRlciwgQ29tbW9uTW9kdWxlLCBNYXRJY29uLCBNYXRGb3JtRmllbGRNb2R1bGUsIE1hdERhdGVwaWNrZXJNb2R1bGUsIEZvcm1zTW9kdWxlLCBNYXROYXRpdmVEYXRlTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTGV0dGVyc09ubHlEaXJlY3RpdmUsIE51bWJlcnNPbmx5RGlyZWN0aXZlLCBUb2FzdE1vZHVsZV0sXG4gIHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcG9pbnRtZW50LWJvb2tpbmcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYXBwb2ludG1lbnQtYm9va2luZy5jb21wb25lbnQuY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBBcHBvaW50bWVudEJvb2tpbmdDb21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlc3RTZXJ2aWNlOiBSZXN0U2VydmljZSxcbiAgICBwcml2YXRlIF9ldmVudFNlcnZpY2U6IEV2ZW50c1NlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZVxuICApIHtcblxuICB9XG4gIEBJbnB1dCgpIGRhdGE/OiBCYW5uZXJTZWN0aW9uTW9kZWw7XG4gIEBJbnB1dCgpIGluZGV4PzogbnVtYmVyO1xuICBjb250ZW50PzogQmFubmVyQ29udGVudE1vZGVsO1xuICBASW5wdXQoKSBlZGl0PzogYm9vbGVhbjtcbiAgQElucHV0KCkgZGVsZXRlPzogYm9vbGVhbjtcbiAgQElucHV0KCkgY3VzdG9tQ2xhc3M/OiBzdHJpbmc7XG4gIEBJbnB1dCgpIG5leHRDb21wb25lbnRDb2xvcj86IEJhY2tncm91bmRNb2RlbDtcbiAgc3R5bGVzPzogQmFubmVyU3R5bGVzTW9kZWw7XG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuZ2V0QWxsU2VydmljZXMoKTtcbiAgICB0aGlzLmdldFNjcmVlblNpemUoKTtcbiAgfVxuICBzY3JlZW5XaWR0aDogbnVtYmVyID0gMDtcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzogcmVzaXplXCIsIFtcIiRldmVudFwiXSlcbiAgZ2V0U2NyZWVuU2l6ZSgpIHtcbiAgICB0aGlzLnNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gIH1cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snKVxuICBjbG9zZU9uT3V0c2lkZUNsaWNrKCkge1xuICAgIHRoaXMuc2hvd0NhbGVuZGFyID0gZmFsc2U7XG4gIH1cbiAgYWNjZXNzZWRUYWJzID0ge1xuICAgIHNlcnZpY2VMaXN0aW5nOiBmYWxzZSxcbiAgICBsb2NhdGlvbkxpc3Rpbmc6IGZhbHNlLFxuICAgIHN0YWZmTGlzdGluZzogZmFsc2VcbiAgfVxuICBza2VsZXRvbkxvYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBidXNpbmVzc05hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NOYW1lJykgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NOYW1lJykgOiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2JOYW1lJykgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYk5hbWUnKSA6ICcnKTtcbiAgYnVzaW5lc3NJZDogYW55ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSA/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdidXNpbmVzc0lkJykgOiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2JJZCcpID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2JJZCcpIDogJycpO1xuICBhY3RpdmVCdXR0b246IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2VsZWN0ZWRUYWI6IHN0cmluZyA9ICcnO1xuICBiYXJXaWR0aDogc3RyaW5nID0gJyc7XG4gIHNob3dDYW5jZWxsYXRpb25Qb2xpY3k6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2hvd1JlZHVjaW5nUG9saWN5OiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkU2VydmljZTogYW55ID0ge307XG4gIHNlbGVjdGVkTG9jYXRpb246IGFueTtcbiAgaG9tZUFkZHJlc3M6IHN0cmluZyA9ICcnO1xuICBpbnN0cnVjdGlvbnM6IHN0cmluZyA9ICcnO1xuICBPYmplY3QgPSBPYmplY3Q7XG4gIHNob3dDYWxlbmRhciA9IGZhbHNlO1xuICBzZWxlY3RlZERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0ZWREYXRlU3RyID0gJyc7XG4gIHVzZXJEZXRhaWxzID0ge1xuICAgIG5hbWU6ICcnLFxuICAgIGVtYWlsOiAnJyxcbiAgICBtb2JpbGVOdW1iZXI6ICcnXG4gIH1cbiAgZGF0ZUZpbHRlciA9IChkOiBEYXRlIHwgbnVsbCk6IGJvb2xlYW4gPT4ge1xuICAgIGNvbnN0IGRhdGUgPSAoZCB8fCBuZXcgRGF0ZSgpKTtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgdG9kYXkuc2V0SG91cnMoMCwgMCwgMCwgMCk7XG4gICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpID49IHRvZGF5LmdldFRpbWUoKTtcbiAgfVxuICB0b2dnbGVDYWxlbmRhcihldmVudD86IEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLnNob3dDYWxlbmRhciA9ICF0aGlzLnNob3dDYWxlbmRhcjtcbiAgfVxuXG4gIG9uRGF0ZVNlbGVjdGVkKGRhdGU6IGFueSkge1xuICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0ge307XG4gICAgdGhpcy5hY3RpdmVCdXR0b24gPSBmYWxzZTtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XG4gICAgdGhpcy5zZWxlY3RlZERhdGVTdHIgPSB0aGlzLmZvcm1hdERhdGUoZGF0ZSk7XG4gICAgdGhpcy5zaG93Q2FsZW5kYXIgPSBmYWxzZTtcbiAgICB0aGlzLmdldEF2YWlsYWJsZVNsb3RzKCk7XG4gIH1cbiAgcHJpdmF0ZSBmb3JtYXREYXRlKGQ6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRkID0gU3RyaW5nKGQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IG1tID0gU3RyaW5nKGQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgeXl5eSA9IGQuZ2V0RnVsbFllYXIoKTtcbiAgICByZXR1cm4gYCR7ZGR9LSR7bW19LSR7eXl5eX1gO1xuICB9XG5cbiAgc2VsZWN0U2VydmljZShzZXJ2aWNlOiBhbnkpIHtcbiAgICBzZXJ2aWNlLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFNlcnZpY2UgJiYgc2VydmljZS5zZXJ2aWNlSWQgIT0gdGhpcy5zZWxlY3RlZFNlcnZpY2Uuc2VydmljZUlkKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkU2VydmljZS5zZWxlY3RlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnNlbGVjdGVkU2VydmljZSA9IHNlcnZpY2VcbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlID8gdHJ1ZSA6IGZhbHNlO1xuICB9XG4gIHNlbGVjdExvY2F0aW9uKGxvY2F0aW9uOiBhbnkpIHtcbiAgICBsb2NhdGlvbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMb2NhdGlvbiAmJiBsb2NhdGlvbi5pZCAhPSB0aGlzLnNlbGVjdGVkTG9jYXRpb24uaWQpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbi5zZWxlY3RlZCA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uID0gbG9jYXRpb247XG4gIH1cbiAgc2VsZWN0ZWRTdGFmZjogYW55O1xuICBzZWxlY3RTdGFmZihzdGFmZjogYW55KSB7XG4gICAgc3RhZmYuc2VsZWN0ZWQgPSB0cnVlO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkU3RhZmYgJiYgc3RhZmYuc3RhZmZJZCAhPSB0aGlzLnNlbGVjdGVkU3RhZmYuc3RhZmZJZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFN0YWZmLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRTdGFmZiA9IHN0YWZmO1xuICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gdHJ1ZTtcbiAgfVxuICBuZXh0U3RlcCgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ3NlcnZpY2VMaXN0aW5nJykge1xuICAgICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0aGlzLnNlbGVjdGVkTG9jYXRpb24gPyB0cnVlIDogZmFsc2U7XG4gICAgICB0aGlzLmFjY2Vzc2VkVGFicy5zZXJ2aWNlTGlzdGluZyA9IHRydWU7XG4gICAgICAvLyBpZiAoIXRoaXMuYWN0aXZlQnV0dG9uKSB7XG4gICAgICAvLyAgIHRoaXMuZ2V0QWxsTG9jYXRpb25zKCk7XG4gICAgICAvLyB9XG4gICAgICAvLyBlbHNlIHtcbiAgICAgIC8vICAgaWYgKHRoaXMuYWNjZXNzZWRUYWJzLmxvY2F0aW9uTGlzdGluZykge1xuICAgICAgLy8gICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnbG9jYXRpb25MaXN0aW5nJztcbiAgICAgIC8vICAgICB0aGlzLmJhcldpZHRoID0gJzI5LjI4JztcbiAgICAgIC8vICAgfVxuICAgICAgLy8gICBlbHNlIGlmICh0aGlzLmFjY2Vzc2VkVGFicy5zdGFmZkxpc3RpbmcpIHtcbiAgICAgIC8vICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ3N0YWZmTGlzdGluZyc7XG4gICAgICAvLyAgICAgdGhpcy5iYXJXaWR0aCA9ICc0My41Nyc7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vICAgZWxzZSB7XG4gICAgICAvLyAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdkYXRlU2VsZWN0aW9uJztcbiAgICAgIC8vICAgICB0aGlzLmJhcldpZHRoID0gJzU4LjU3JztcbiAgICAgIC8vICAgICBpZiAodGhpcy5zZWxlY3RlZExvY2F0aW9uICYmIHRoaXMuc2VsZWN0ZWRTZXJ2aWNlKVxuICAgICAgLy8gICAgICAgdGhpcy5nZXRBdmFpbGFibGVTbG90cygpO1xuICAgICAgLy8gICB9XG4gICAgICAvLyB9XG4gICAgICB0aGlzLmdldEFsbExvY2F0aW9ucygpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnbG9jYXRpb25MaXN0aW5nJykge1xuICAgICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0cnVlO1xuICAgICAgdGhpcy5hY2Nlc3NlZFRhYnMubG9jYXRpb25MaXN0aW5nID0gdHJ1ZTtcbiAgICAgIC8vIGlmICghdGhpcy5hY3RpdmVCdXR0b24pIHtcbiAgICAgIC8vICAgdGhpcy5nZXRBbGxTdGFmZigpO1xuXG4gICAgICAvLyB9XG4gICAgICB0aGlzLmdldEFsbFN0YWZmKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdzdGFmZkxpc3RpbmcnKSB7XG4gICAgICB0aGlzLmFjY2Vzc2VkVGFicy5zdGFmZkxpc3RpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdkYXRlU2VsZWN0aW9uJztcbiAgICAgIHRoaXMuYmFyV2lkdGggPSAnNTguNTcnO1xuICAgICAgdGhpcy5nZXRBdmFpbGFibGVTbG90cygpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnZGF0ZVNlbGVjdGlvbicpIHtcbiAgICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gdGhpcy5hcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwubmFtZSAmJiB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5lbWFpbCAmJiB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5waG9uZU51bWJlci5sZW5ndGggPT09IDEwID8gdHJ1ZSA6IGZhbHNlXG4gICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ2NvbnRhY3REZXRhaWxzJztcbiAgICAgIHRoaXMuYmFyV2lkdGggPSAnNzAuNTcnXG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdjb250YWN0RGV0YWlscycpIHtcbiAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFZhbHVlcygpO1xuICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdwYXltZW50VGFiJztcbiAgICAgIHRoaXMuYmFyV2lkdGggPSAnODUuNTcnXG4gICAgfVxuICB9XG4gIHByZXZpb3VzU3RlcCgpIHtcbiAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFiICE9ICdzZXJ2aWNlTGlzdGluZycpIHtcbiAgICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnbG9jYXRpb25MaXN0aW5nJykge1xuICAgICAgICBpZiAodGhpcy5hY2Nlc3NlZFRhYnMuc2VydmljZUxpc3RpbmcpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ3NlcnZpY2VMaXN0aW5nJztcbiAgICAgICAgICB0aGlzLmJhcldpZHRoID0gJzE0LjI4JztcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnc3RhZmZMaXN0aW5nJykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkU3RhZmYgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5hY2Nlc3NlZFRhYnMubG9jYXRpb25MaXN0aW5nKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdsb2NhdGlvbkxpc3RpbmcnO1xuICAgICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMjkuMjgnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWNjZXNzZWRUYWJzLnNlcnZpY2VMaXN0aW5nKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdzZXJ2aWNlTGlzdGluZyc7XG4gICAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICcxNC4yOCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdkYXRlU2VsZWN0aW9uJykge1xuICAgICAgICBpZiAodGhpcy5hY2Nlc3NlZFRhYnMuc3RhZmZMaXN0aW5nKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdzdGFmZkxpc3RpbmcnO1xuICAgICAgICAgIHRoaXMuYmFyV2lkdGggPSAnNDMuNTcnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWNjZXNzZWRUYWJzLmxvY2F0aW9uTGlzdGluZykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnbG9jYXRpb25MaXN0aW5nJztcbiAgICAgICAgICB0aGlzLmJhcldpZHRoID0gJzI5LjI4JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmFjY2Vzc2VkVGFicy5zZXJ2aWNlTGlzdGluZykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc2VydmljZUxpc3RpbmcnO1xuICAgICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMTQuMjgnO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnY29udGFjdERldGFpbHMnKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnZGF0ZVNlbGVjdGlvbic7XG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnNTguNTcnO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ3BheW1lbnRUYWInKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnY29udGFjdERldGFpbHMnO1xuICAgICAgICB0aGlzLmJhcldpZHRoID0gJzcwLjU3JztcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc2VydmljZURhdGE6IGFueVtdID0gW107XG4gIGdldEFsbFNlcnZpY2VzKCkge1xuICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSB0cnVlXG4gICAgbGV0IHNlcnZpY2VQYXlsb2FkOiBhbnkgPSB7XG4gICAgICBidXNpbmVzc0lkOiB0aGlzLmJ1c2luZXNzSWQgPz8gXCJcIixcbiAgICAgIHBhZ2VObzogMCxcbiAgICAgIHNpemU6IDEwMFxuICAgIH1cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEFsbEFwcG9pbnRtZW50U2VydmljZShzZXJ2aWNlUGF5bG9hZCkuc3Vic2NyaWJlKFxuICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMuY29udGVudC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMuc2VydmljZURhdGEgPSByZXMuY29udGVudC5maWx0ZXIoKHNlcnZpY2U6IGFueSkgPT4gc2VydmljZS5hY3RpdmUgPT09IHRydWUpO1xuICAgICAgICAgIHRoaXMuc2VydmljZURhdGEuZm9yRWFjaChzZXJ2aWNlID0+IHNlcnZpY2Uuc2VsZWN0ZWQgPSBmYWxzZSk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5zZXJ2aWNlRGF0YSlcbiAgICAgICAgICBpZiAodGhpcy5zZXJ2aWNlRGF0YS5sZW5ndGggPT09IDEgJiYgIXRoaXMuYWN0aXZlQnV0dG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2VydmljZSA9IHRoaXMuc2VydmljZURhdGFbMF07XG4gICAgICAgICAgICB0aGlzLmdldEFsbExvY2F0aW9ucygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc2VydmljZUxpc3RpbmcnO1xuICAgICAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICcxNC4yOCc7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgZ3JhY2VmdWxseVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgbG9jYXRpb25EYXRhOiBhbnlbXSA9IFtdO1xuICBnZXRBbGxMb2NhdGlvbnMoKSB7XG4gICAgdGhpcy5sb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMubG9jYXRpb25EYXRhID0gW107XG4gICAgbGV0IHBheWxvYWQgPSB7IGJ1c2luZXNzSWQ6IHRoaXMuYnVzaW5lc3NJZCA/PyBcIlwiIH1cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEFsbFN0b3JlcyhwYXlsb2FkKS5zdWJzY3JpYmUoXG4gICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcy5kYXRhLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxldCBsb2NhdGlvbnMgPSByZXMuZGF0YS5kYXRhLmZpbHRlcigoc3RvcmU6IGFueSkgPT4geyByZXR1cm4gc3RvcmUuc3RhdHVzID09PSAnQUNUSVZFJyB9KTtcbiAgICAgICAgICBsb2NhdGlvbnMuZm9yRWFjaCgobG9jYXRpb246IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLnN0b3JlSWRzLmluY2x1ZGVzKGxvY2F0aW9uLmlkKSkge1xuICAgICAgICAgICAgICBsb2NhdGlvbi5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uRGF0YS5wdXNoKGxvY2F0aW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICAgIGlmICh0aGlzLmxvY2F0aW9uRGF0YS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbiA9IHRoaXMubG9jYXRpb25EYXRhWzBdO1xuICAgICAgICAgICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYWNjZXNzZWRUYWJzLmxvY2F0aW9uTGlzdGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5nZXRBbGxTdGFmZigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ2xvY2F0aW9uTGlzdGluZyc7XG4gICAgICAgICAgICB0aGlzLmJhcldpZHRoID0gJzI5LjI4JztcbiAgICAgICAgICAgIHRoaXMuYWNjZXNzZWRUYWJzLmxvY2F0aW9uTGlzdGluZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdObyBMb2NhdGlvbicsIGRldGFpbDogJ05vIExvY2F0aW9uIGFkZGVkIGZvciBzZWxlY3RlZCBzZXJ2aWNlJyB9KTtcbiAgICAgICAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKGVycm9yKSA9PiB7XG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgZ3JhY2VmdWxseVxuICAgICAgfVxuICAgICk7XG4gIH1cbiAgc3RhZmZQYXlsb2FkOiBhbnkgPSB7XG4gICAgc2VydmljZUlkOiAnJyxcbiAgICBzdG9yZUlkOiAnJyxcbiAgICBidXNpbmVzc0lkOiAnJ1xuICB9XG4gIHN0YWZmRGF0YTogYW55W10gPSBbXTtcbiAgZ2V0QWxsU3RhZmYoKSB7XG4gICAgdGhpcy5sb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gdHJ1ZTtcbiAgICB0aGlzLnN0YWZmUGF5bG9hZC5zdG9yZUlkID0gdGhpcy5zZWxlY3RlZExvY2F0aW9uPy5pZCA/PyBcIlwiO1xuICAgIHRoaXMuc3RhZmZQYXlsb2FkLnNlcnZpY2VJZCA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlPy5zZXJ2aWNlSWQgPyB0aGlzLnNlbGVjdGVkU2VydmljZS5zZXJ2aWNlSWQgOiAnJztcbiAgICB0aGlzLnN0YWZmUGF5bG9hZC5idXNpbmVzc0lkID0gdGhpcy5idXNpbmVzc0lkID8/IFwiXCI7XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxTdGFmZih0aGlzLnN0YWZmUGF5bG9hZCkuc3Vic2NyaWJlKFxuICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgIGlmIChyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuc3RhZmZEYXRhID0gcmVzLmZpbHRlcigoc3RhZmY6IGFueSkgPT4gc3RhZmYuYWN0aXZlID09PSB0cnVlICYmIHN0YWZmLmJvb2tpbmdBbGxvd2VkKTtcbiAgICAgICAgICB0aGlzLnN0YWZmRGF0YS5mb3JFYWNoKHN0YWZmID0+IHN0YWZmLnNlbGVjdGVkID0gZmFsc2UpO1xuICAgICAgICAgIGlmICh0aGlzLnN0YWZmRGF0YS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ2RhdGVTZWxlY3Rpb24nO1xuICAgICAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICc1OC41Nyc7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RhZmYgPSB0aGlzLnN0YWZmRGF0YVswXTtcbiAgICAgICAgICAgIHRoaXMuZ2V0QXZhaWxhYmxlU2xvdHMoKTtcbiAgICAgICAgICAgIHRoaXMuYWNjZXNzZWRUYWJzLnN0YWZmTGlzdGluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICh0aGlzLnN0YWZmRGF0YS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdzdGFmZkxpc3RpbmcnO1xuICAgICAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICc0My41Nyc7XG4gICAgICAgICAgICB0aGlzLmFjY2Vzc2VkVGFicy5zdGFmZkxpc3RpbmcgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnTm8gU3RhZmYgUHJlc2VudCcsIGRldGFpbDogJ05vIFN0YWZmIHByZXNlbnQgZm9yIHNlbGVjdGVkIHNlcnZpY2UnIH0pO1xuICAgICAgICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyBncmFjZWZ1bGx5XG4gICAgICB9XG4gICAgKTtcbiAgfVxuICBjb252ZXJ0VG8yNEhvdXIodGltZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBbaG91ck1pbiwgbW9kaWZpZXJSYXddID0gdGltZS5zcGxpdCgnICcpO1xuICAgIGNvbnN0IG1vZGlmaWVyID0gbW9kaWZpZXJSYXcudG9VcHBlckNhc2UoKTsgLy8gXCJBTVwiIG9yIFwiUE1cIlxuICAgIGxldCBbaG91cnMsIG1pbnV0ZXNdID0gaG91ck1pbi5zcGxpdCgnOicpLm1hcChOdW1iZXIpO1xuXG4gICAgaWYgKG1vZGlmaWVyID09PSAnUE0nICYmIGhvdXJzIDwgMTIpIHtcbiAgICAgIGhvdXJzICs9IDEyO1xuICAgIH1cbiAgICBpZiAobW9kaWZpZXIgPT09ICdBTScgJiYgaG91cnMgPT09IDEyKSB7XG4gICAgICBob3VycyA9IDA7XG4gICAgfVxuXG4gICAgY29uc3QgaGggPSBob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgbW0gPSBtaW51dGVzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCR7aGh9OiR7bW19ICR7bW9kaWZpZXJ9YDtcbiAgfVxuICBzbG90c1BheWxvYWQ6IGFueSA9IHtcbiAgICBzdG9yZUlkOiBcIlwiLFxuICAgIHNlcnZpY2VJZDogXCJcIixcbiAgICBidXNpbmVzc0lkOiBcIlwiLFxuICAgIGJvb2tpbmdEYXRlOiBcIlwiXG4gIH1cbiAgbG9jYXRpb25UaW1pbmc6IGFueVtdID0gW107XG4gIGxvYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBnZXRBdmFpbGFibGVTbG90cygpIHtcbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IGZhbHNlO1xuICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XG4gICAgdGhpcy5sb2NhdGlvblRpbWluZyA9IFtdO1xuICAgIHRoaXMuc2xvdHNQYXlsb2FkLnN0b3JlSWQgPSB0aGlzLnNlbGVjdGVkTG9jYXRpb24/LmlkID8/IFwiXCI7XG4gICAgdGhpcy5zbG90c1BheWxvYWQuc2VydmljZUlkID0gdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnNlcnZpY2VJZCA/IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLnNlcnZpY2VJZCA6ICcnO1xuICAgIHRoaXMuc2xvdHNQYXlsb2FkLmJ1c2luZXNzSWQgPSB0aGlzLmJ1c2luZXNzSWQgPz8gXCJcIjtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5zZWxlY3RlZERhdGUgPz8gbmV3IERhdGUoKTtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0ciA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlKTtcbiAgICBjb25zdCB5eXl5ID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1tID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgZGQgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgdGhpcy5zbG90c1BheWxvYWQuYm9va2luZ0RhdGUgPSBgJHt5eXl5fS0ke21tfS0ke2RkfVQwMDowMDowMC4wMDBaYDtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFN0YWZmKVxuICAgICAgdGhpcy5zbG90c1BheWxvYWQuc3RhZmZJZCA9IHRoaXMuc2VsZWN0ZWRTdGFmZi5zdGFmZklkO1xuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0Qm9va2luZ1Nsb3RzKHRoaXMuc2xvdHNQYXlsb2FkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICByZXMuZm9yRWFjaCgodGltZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubG9jYXRpb25UaW1pbmcucHVzaCh7IHNlbGVjdGVkOiBmYWxzZSwgdmFsdWU6IHRpbWUgfSk7XG4gICAgICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZTtcbiAgICAgIH0pXG4gICAgICBpZiAocmVzLmxlbmd0aCA8PSAwKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdCb29raW5nIEZhaWxlZCcsIGRldGFpbDogJ1VuYWJsZSB0byBmZXRjaCBhdmFpbGFibGUgc2xvdHMuIFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXInIH0pO1xuICAgICAgfVxuICAgIH0sXG4gICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnVW5hYmxlIHRvIGZldGNoIHNsb3RzJywgZGV0YWlsOiBlcnJvci5lcnJvci5tZXNzYWdlIH0pO1xuICAgICAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xuICAgICAgfSlcbiAgfVxuICBpc1Byb2Nlc3Npbmc6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2VsZWN0ZWRUaW1lOiBhbnlcbiAgc2VsZWN0VGltZVNsb3QodGltZTogYW55KSB7XG4gICAgdGltZS5zZWxlY3RlZCA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUaW1lICYmIHRpbWUudmFsdWUgIT0gdGhpcy5zZWxlY3RlZFRpbWUudmFsdWUpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0ZWRUaW1lID0gdGltZTtcbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRydWU7XG4gIH1cbiAgdGVybXNBbmRDb25kaXRpb25zOiBib29sZWFuID0gZmFsc2U7XG4gIGNoZWNrUmVxdWlyZWRWYWx1ZXMoKSB7XG4gICAgaWYgKHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLm5hbWUgJiYgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwuZW1haWwuaW5jbHVkZXMoJ0AnKSAmJiB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5waG9uZU51bWJlci5sZW5ndGggPT09IDEwICYmIHRoaXMudGVybXNBbmRDb25kaXRpb25zKSB7XG4gICAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRydWU7XG4gICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkU2VydmljZSwgdGhpcy5zZWxlY3RlZExvY2F0aW9uLCB0aGlzLnNlbGVjdGVkU3RhZmYsIHRoaXMuc2VsZWN0ZWREYXRlLCB0aGlzLnNlbGVjdGVkVGltZSwgdGhpcy51c2VyRGV0YWlscylcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICBhcHBvaW50bWVudFBheWxvYWQ6IGFueSA9IHtcbiAgICBzdGFmZkRldGFpbDoge1xuICAgICAgaWQ6ICcnLFxuICAgICAgbmFtZTogJydcbiAgICB9LFxuICAgIGJvb2tpbmdEYXRlOiAnJyxcbiAgICBzdGFydFRpbWU6ICcnLFxuICAgIGN1c3RvbWVyRGV0YWlsOiB7XG4gICAgICBuYW1lOiAnJyxcbiAgICAgIHBob25lTnVtYmVyOiAnJyxcbiAgICAgIGVtYWlsOiAnJ1xuICAgIH0sXG4gICAgc2VydmljZURldGFpbDoge1xuICAgICAgaWQ6ICcnLFxuICAgICAgbmFtZTogJydcbiAgICB9LFxuICAgIHN0b3JlSWQ6ICcnLFxuICAgIGJ1c2luZXNzSWQ6IHRoaXMuYnVzaW5lc3NJZCxcbiAgICBidXNpbmVzc05hbWU6IHRoaXMuYnVzaW5lc3NOYW1lXG4gIH1cbiAgY2hlY2tQYXltZW50KCkge1xuICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgICBjb25zdCByZXF1ZXN0X2Zvcm0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlJFUVVFU1RfRlJPTVwiKTtcbiAgICBpZiAocmVxdWVzdF9mb3JtID09PSAnRUNPTU1FUkNFJykge1xuICAgICAgdGhpcy5jcmVhdGVBcHBvaW50bWVudCgpO1xuICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFNlcnZpY2U/LmRlcG9zaXRBbW91bnQ/LmRlcG9zaXRSZXF1aXJlZCkge1xuICAgICAgICB0aGlzLnBheW1lbnRCb29raW5nQXBwb2ludG1lbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQXBwb2ludG1lbnQoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gdGhpcy5jcmVhdGVBcHBvaW50bWVudCgpO1xuICB9XG4gIGFwaVN0YXR1czogYm9vbGVhbiA9IGZhbHNlO1xuICBjcmVhdGVBcHBvaW50bWVudCgpIHtcbiAgICBjb25zdCBkYXRlID0gdGhpcy5zZWxlY3RlZERhdGUgPz8gbmV3IERhdGUoKTtcbiAgICBjb25zdCB5eXl5ID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1tID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgZGQgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuc3RhZmZEZXRhaWwuaWQgPSB0aGlzLnNlbGVjdGVkU3RhZmY/LnN0YWZmSWQ7XG4gICAgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuc3RhZmZEZXRhaWwubmFtZSA9IHRoaXMuc2VsZWN0ZWRTdGFmZj8uc3RhZmZOYW1lO1xuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnN0b3JlSWQgPSB0aGlzLnNlbGVjdGVkTG9jYXRpb24/LmlkO1xuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnNlcnZpY2VEZXRhaWwuaWQgPSB0aGlzLnNlbGVjdGVkU2VydmljZT8uc2VydmljZUlkO1xuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnNlcnZpY2VEZXRhaWwubmFtZSA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlPy5uYW1lO1xuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnN0YXJ0VGltZSA9IHRoaXMuY29udmVydFRvMjRIb3VyKHRoaXMuc2VsZWN0ZWRUaW1lLnZhbHVlKS5zbGljZSgwLCA1KTtcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5ib29raW5nRGF0ZSA9IGAke3l5eXl9LSR7bW19LSR7ZGR9VDAwOjAwOjAwLjAwMFpgO1xuICAgIHRoaXMucmVzdFNlcnZpY2UuYm9va0FwcG9pbnRtZW50VjIodGhpcy5hcHBvaW50bWVudFBheWxvYWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc3RhdHVzVGVtcGxhdGUnO1xuICAgICAgdGhpcy5iYXJXaWR0aCA9ICcxMDAnO1xuICAgICAgdGhpcy5hcGlTdGF0dXMgPSB0cnVlO1xuICAgIH0sXG4gICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmFwaVN0YXR1cyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnQm9va2luZyBGYWlsZWQnLCBkZXRhaWw6IGVycm9yLmVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICB9XG4gICAgKVxuICB9XG4gIHBheW1lbnRCb29raW5nQXBwb2ludG1lbnQoKSB7XG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuc2VsZWN0ZWREYXRlID8/IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBtbSA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IGRkID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnN0YWZmRGV0YWlsLmlkID0gdGhpcy5zZWxlY3RlZFN0YWZmPy5zdGFmZklkO1xuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnN0YWZmRGV0YWlsLm5hbWUgPSB0aGlzLnNlbGVjdGVkU3RhZmY/LnN0YWZmTmFtZTtcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5zdG9yZUlkID0gdGhpcy5zZWxlY3RlZExvY2F0aW9uPy5pZDtcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5zZXJ2aWNlRGV0YWlsLmlkID0gdGhpcy5zZWxlY3RlZFNlcnZpY2U/LnNlcnZpY2VJZDtcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5zZXJ2aWNlRGV0YWlsLm5hbWUgPSB0aGlzLnNlbGVjdGVkU2VydmljZT8ubmFtZTtcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5zdGFydFRpbWUgPSB0aGlzLmNvbnZlcnRUbzI0SG91cih0aGlzLnNlbGVjdGVkVGltZS52YWx1ZSkuc2xpY2UoMCwgNSk7XG4gICAgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuYm9va2luZ0RhdGUgPSBgJHt5eXl5fS0ke21tfS0ke2RkfVQwMDowMDowMC4wMDBaYDtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLnBheW1lbnRGb3JBcHBvaW50bWVudCh0aGlzLmFwcG9pbnRtZW50UGF5bG9hZCkuc3Vic2NyaWJlKFxuICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdhcHBvaW50bWVudFBheW1lbnRJZCcsIHJlcy5wZ09yZGVySWQpO1xuICAgICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlOyAgXG4gICAgICAgIHRoaXMuX2V2ZW50U2VydmljZS5jYXNoRnJlZUV2ZW50LmVtaXQoeyBkYXRhOiB7IG9yZGVyU2lnbmF0dXJlOiByZXMub3JkZXJTaWduYXR1cmUgfSB9KTtcbiAgICAgIH0sXG4gICAgICAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnUGF5bWVudCBGYWlsZWQnLCBkZXRhaWw6IGVycm9yLmVycm9yLm1lc3NhZ2UgfSk7XG4gICAgICB9XG4gICAgKVxuXG4gIH1cbiAgZ29CYWNrKCkge1xuICAgIGlmIChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlJFUVVFU1RfRlJPTVwiKSA9PT0gJ0VDT01NRVJDRScpIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FkbWluL2FwcG9pbnRtZW50cy9saXN0LWFwcG9pbnRtZW50cyddKVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnJ10pXG4gICAgfVxuICB9XG59XG4iLCI8cC10b2FzdCBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiIFtiYXNlWkluZGV4XT1cIjEwMDAwMDAwMDAwXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiXG4gICAgW3Nob3dUcmFuc2Zvcm1PcHRpb25zXT1cInNjcmVlbldpZHRoIDwgNDc1ID8gJ3RyYW5zbGF0ZVkoLTEwMCUpJyA6ICcnXCI+PC9wLXRvYXN0PlxuPHNlY3Rpb24gY2xhc3M9XCJtYWluX3NlY3Rpb25cIj5cbiAgICA8ZGl2IGNsYXNzPVwibWFpbl9oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFjay1idG4gZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyIGdhcC0yIG1iLTNcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJnb0JhY2soKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5rZXlib2FyZF9iYWNrc3BhY2U8L21hdC1pY29uPjxzcGFuICpuZ0lmPVwic2NyZWVuV2lkdGggPiA0NzVcIj5CYWNrIHRvIEhvbWU8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5cbiAgICAgICAgICAgICAgICA8aDE+Qm9vayBOZXcgQXBwb2ludG1lbnQ8L2gxPlxuICAgICAgICAgICAgICAgIDxwPnt7YnVzaW5lc3NOYW1lID8/IFwiTi9BXCIgfX08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWZpbGxcIiBbc3R5bGUud2lkdGhdPVwiYmFyV2lkdGggKyAnJSdcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1haW5fYm9keSB3LTEwMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiPjxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ3NlcnZpY2VMaXN0aW5nJ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZXJ2aWNlTGlzdGluZ1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdsb2NhdGlvbkxpc3RpbmcnXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9jYXRpb25MaXN0aW5nXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdzdGFmZkxpc3RpbmcnXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic3RhZmZMaXN0aW5nXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdkYXRlU2VsZWN0aW9uJ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImRhdGVTZWxlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFRhYj09PSdjb250YWN0RGV0YWlscydcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjb250YWN0RGV0YWlsc1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiPT09J3BheW1lbnRUYWInXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGF5bWVudFRhYlwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiPT09J3N0YXR1c1RlbXBsYXRlJ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0YXR1c1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtYWluX2Zvb3RlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIiAqbmdJZj1cInNlbGVjdGVkVGFiIT09J3N0YXR1c1RlbXBsYXRlJ1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWJ1dHRvbnNcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwieydqdXN0aWZ5LWNvbnRlbnQnOiBzZWxlY3RlZFRhYiAhPSAnc2VydmljZUxpc3RpbmcnID8gJ3NwYWNlLWJldHdlZW4nIDogJ2VuZCd9XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhY2stZm9vdGVyLWJ0biBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJwcmV2aW91c1N0ZXAoKVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFRhYiAhPSAnc2VydmljZUxpc3RpbmcnXCI+QmFjazwvc3Bhbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjb250aW51ZS1idG5cIiBbZGlzYWJsZWRdPVwiIWFjdGl2ZUJ1dHRvblwiIChjbGljayk9XCJuZXh0U3RlcCgpXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkVGFiIT0ncGF5bWVudFRhYidcIj57eyFsb2FkZXIgPyAnQ29udGludWUnIDogJ0xvYWRpbmcuLi4nfX08L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWV2ZW5seSBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRUYWI9PT0ncGF5bWVudFRhYidcIiAoY2xpY2spPVwiY2hlY2tQYXltZW50KClcIiBbZGlzYWJsZWRdPVwiaXNQcm9jZXNzaW5nXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3BheS1ub3ctYnRuJyA6IHNlbGVjdGVkU2VydmljZT8uZGVwb3NpdEFtb3VudD8uZGVwb3NpdFJlcXVpcmVkLCdjb21wbGV0ZV9ib29raW5nJyA6ICFzZWxlY3RlZFNlcnZpY2U/LmRlcG9zaXRBbW91bnQ/LmRlcG9zaXRSZXF1aXJlZH1cIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvMzA0MDEyYzE3NTM0NDAwODc5OTZCYWNrZ3JvdW5kLnBuZ1wiPlxuICAgICAgICAgICAgICAgIHt7c2VsZWN0ZWRTZXJ2aWNlPy5kZXBvc2l0QW1vdW50Py5kZXBvc2l0UmVxdWlyZWQgPyAnUGF5IE5vdycgOiAnQ29tcGxldGUgQm9va2luZyd9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9zZWN0aW9uPlxuPG5nLXRlbXBsYXRlICNzZXJ2aWNlTGlzdGluZz5cbiAgICA8ZGl2IGNsYXNzPVwidy02MCBzZXJ2aWNlX3NlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2Utc2VsZWN0aW9uXCI+XG4gICAgICAgICAgICA8aDI+U2VsZWN0IGEgU2VydmljZTwvaDI+XG4gICAgICAgICAgICA8cD5DaG9vc2UgdGhlIHNlcnZpY2UgeW91J2QgbGlrZSB0byBib29rPC9wPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZXMtZ3JpZFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHNlcnZpY2Ugb2Ygc2VydmljZURhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiIChjbGljayk9XCJzZWxlY3RTZXJ2aWNlKHNlcnZpY2UpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlcnZpY2UtY2FyZC1zZWxlY3RlZCcgOiBzZXJ2aWNlPy5zZWxlY3RlZCwgJ3NlcnZpY2UtY2FyZCc6ICFzZXJ2aWNlPy5zZWxlY3RlZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiIHNlcnZpY2UtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaWNvblwiPjxtYXQtaWNvbj5wZXJzb25fb3V0bGluZTwvbWF0LWljb24+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS10aXRsZVwiPnt7c2VydmljZT8ubmFtZSA/IHNlcnZpY2U/Lm5hbWUgOiAnTi9BJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtcHJpY2VcIj7igrl7e3NlcnZpY2U/LnByaWNlRGV0YWlscz8ucHJpY2UgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZT8ucHJpY2VEZXRhaWxzPy5wcmljZSA6ICdOL0EnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWR1cmF0aW9uXCI+e3tzZXJ2aWNlPy5kdXJhdGlvbiA/IHNlcnZpY2U/LmR1cmF0aW9uIDogJ04vQSd9fSBtaW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWRlc2NyaXB0aW9uXCIgKm5nSWY9XCJzZXJ2aWNlPy5kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VydmljZT8uZGVzY3JpcHRpb24gPyBzZXJ2aWNlPy5kZXNjcmlwdGlvbiA6ICdOL0EnfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbWUtdmlzaXRcIiAqbmdJZj1cInNlcnZpY2U/LmhvbWVBcHBvaW50bWVudEF2YWlsYWJsZVwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy85ODIxMjZjMTc1ODYyODg2MzEyOWZ1cm5pdHVyZV8xNjQwNjEwMy5wbmdcIj5Ib21lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaXQgQXZhaWxhYmxlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXJkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaWNvblwiPvCfkaQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS10aXRsZVwiPkdlbmVyYWwgQ29uc3VsdGF0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY2F0ZWdvcnlcIj5NZWRpY2FsPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtcHJpY2VcIj7igrk4MDA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1kdXJhdGlvblwiPjMwIG1pbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHJlaGVuc2l2ZSBoZWFsdGggY29uc3VsdGF0aW9uXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWljb25cIj7wn6egPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtdGl0bGVcIj5NZW50YWwgSGVhbHRoIENvdW5zZWxpbmc8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXRlZ29yeVwiPk1lbnRhbCBIZWFsdGg8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1wcmljZVwiPuKCuTE1MDA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1kdXJhdGlvblwiPjQ1IG1pbjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1kZXNjcmlwdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmVzc2lvbmFsIHBzeWNob2xvZ2ljYWwgc3VwcG9ydFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbWUtdmlzaXRcIj5Ib21lIFZpc2l0IEF2YWlsYWJsZTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWljb25cIj7inII8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS10aXRsZVwiPkhhaXIgQ3V0ICYgU3R5bGluZzwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNhdGVnb3J5XCI+QmVhdXR5PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtcHJpY2VcIj7igrkxMjAwPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZHVyYXRpb25cIj40NSBtaW48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZGVzY3JpcHRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFByb2Zlc3Npb25hbCBoYWlyIGN1dHRpbmcgYW5kIHN0eWxpbmdcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob21lLXZpc2l0XCI+SG9tZSBWaXNpdCBBdmFpbGFibGU8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNsb2NhdGlvbkxpc3Rpbmc+XG4gICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uX3NlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1zdGFydFwiPlxuICAgICAgICAgICAgPGgxPkNob29zZSBMb2NhdGlvbjwvaDE+XG4gICAgICAgICAgICA8cD5TZWxlY3Qgd2hlcmUgeW91J2QgbGlrZSB0byByZWNlaXZlIHRoZSBzZXJ2aWNlPC9wPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tbGlzdFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbG9jYXRpb24gb2YgbG9jYXRpb25EYXRhXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwic2VsZWN0TG9jYXRpb24obG9jYXRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnbG9jYXRpb24tY2FyZC1zZWxlY3RlZCcgOiBsb2NhdGlvbj8uc2VsZWN0ZWQsICdsb2NhdGlvbi1jYXJkJzogIWxvY2F0aW9uPy5zZWxlY3RlZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24taW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy80MjcyMjZjMTc1ODYyOTE1Nzc1OHN0b3JlXzMxNzE1MTAucG5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz57e2xvY2F0aW9uPy5zdG9yZU5hbWUgPyBsb2NhdGlvbj8uc3RvcmVOYW1lIDogJ04vQSd9fTwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJkaXN0YW5jZVwiPjxtYXQtaWNvbj5sb2NhdGlvbl9vbjwvbWF0LWljb24+IDIuMyBrbTwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPnt7bG9jYXRpb24/LmFkZHJlc3NEZXRhaWxzPy5hZGRyZXNzTGluZX19LCB7e2xvY2F0aW9uPy5hZGRyZXNzRGV0YWlscz8uY2l0eX19LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tsb2NhdGlvbj8uYWRkcmVzc0RldGFpbHM/LnN0YXRlfX0ge3tsb2NhdGlvbj8ucGluY29kZX19PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1jYXJkXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1pY29uIGJyYW5jaC1pY29uXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5CcmFuY2ggQ2xpbmljPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD40NTYgQ2FyZSBBdmVudWUsIEhlYWx0aCBab25lLCBNdW1iYWkgNDAwMDE1PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzdGFuY2VcIj41Ljgga208L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tY2FyZFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24taWNvbiBob21lLWljb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzPkhvbWUgVmlzaXQ8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPllvdXIgTG9jYXRpb248L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXN0YW5jZVwiPjAga208L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNzdGFmZkxpc3Rpbmc+XG4gICAgPGRpdiBjbGFzcz1cInctNjAgb3ZlcmZsb3ctaGlkZGVuIHN0YWZmLWxpc3RpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBoLTEwMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwXCI+XG4gICAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgU2VjdGlvbiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhZmYtaGVhZGVyIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGgxPlNlbGVjdCBTdGFmZiBNZW1iZXI8L2gxPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInN0YWZmLXN1YnRpdGxlIG1iLTBcIj5DaG9vc2UgeW91ciBwcmVmZXJyZWQgcHJvZmVzc2lvbmFsPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBTdGFmZiBDYXJkcyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC00IHN0YWZmLWxpc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3RhZmYgb2Ygc3RhZmZEYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCByb3VuZGVkLTMgcC0zXCIgKGNsaWNrKT1cInNlbGVjdFN0YWZmKHN0YWZmKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc3RhZmYtY2FyZC1zZWxlY3RlZCcgOiBzdGFmZj8uc2VsZWN0ZWQsICdzdGFmZi1jYXJkJzogIXN0YWZmPy5zZWxlY3RlZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IGZsZXgtZ3Jvdy0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJzdGFmZi1hdmF0YXIgcm91bmRlZC1jaXJjbGUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIG1lLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3N0YWZmPy5zdGFmZk5hbWUuc2xpY2UoMCwzKS50b1VwcGVyQ2FzZSgpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YWZmLWRldGFpbHMgZmxleC1ncm93LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJzdGFmZi1uYW1lXCI+e3tzdGFmZj8uc3RhZmZOYW1lID8gc3RhZmY/LnN0YWZmTmFtZSA6ICdOL0EnfX08L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RhZmYtc3BlY2lhbHR5XCI+R2VuZXJhbCBNZWRpY2luZTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxwIGNsYXNzPVwic3RhZmYtZGVzY3JpcHRpb24gbWItMFwiPkV4cGVyaWVuY2VkIHBoeXNpY2lhbiB3aXRoIDEwKyB5ZWFycyBpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGljaW5lIGFuZCB3ZWxsbmVzcyBjYXJlLjwvcD4gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInJhdGluZy1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Rhci1yYXRpbmcgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Rhci1pY29uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmF0aW5nLW51bWJlclwiPjQuOTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldmlldy1jb3VudFwiPjE1NiByZXZpZXdzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2RhdGVTZWxlY3Rpb24+XG4gICAgPGRpdiBjbGFzcz1cInctNjAgZGF0ZV9zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBoLTEwMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBoLTEwMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRldGltZS1oZWFkZXIgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICA8aDE+U2VsZWN0IERhdGUgJiBUaW1lPC9oMT5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJkYXRldGltZS1zdWJ0aXRsZSBtYi0wXCI+Q2hvb3NlIHdoZW4geW91J2QgbGlrZSB5b3VyIGFwcG9pbnRtZW50PC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBNYWluIENvbnRlbnQgLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtNCBtYWluX2NvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIExlZnQgQ29sdW1uIC0gRGF0ZSBTZWxlY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyd3LTUwJyA6IHNjcmVlbldpZHRoID4gNDc1ICwgJ3ctMTAwJzpzY3JlZW5XaWR0aCA8IDQ3NX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmQgY2FyZCByb3VuZGVkLTMgcC00IGgtMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPlNlbGVjdCBEYXRlPC9oMz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJkYXRlLWlucHV0IGJvcmRlci0wIHJvdW5kZWQtMlwiIHBsYWNlaG9sZGVyPVwiZGQtbW0teXl5eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWREYXRlU3RyXCIgcmVhZG9ubHkgKGNsaWNrKT1cInRvZ2dsZUNhbGVuZGFyKCRldmVudClcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtcy0yXCIgKGNsaWNrKT1cInRvZ2dsZUNhbGVuZGFyKCRldmVudClcIj5jYWxlbmRhcl90b2RheTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1wb3BvdmVyXCIgKm5nSWY9XCJzaG93Q2FsZW5kYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FsZW5kYXIgWyhzZWxlY3RlZCldPVwic2VsZWN0ZWREYXRlXCIgW2RhdGVGaWx0ZXJdPVwiZGF0ZUZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uRGF0ZVNlbGVjdGVkKCRldmVudClcIiBjbGFzcz1cImRhdGVwaWNrZXItY2FsZW5kYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhbGVuZGFyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFJpZ2h0IENvbHVtbiAtIFRpbWUgU2VsZWN0aW9uIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZV9zZWxlY3Rpb25cIiBbbmdDbGFzc109XCJ7J3ctNTAnIDogc2NyZWVuV2lkdGggPiA0NzUgLCAndy0xMDAnOnNjcmVlbldpZHRoIDwgNDc1fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZCBjYXJkIGgtMTAwIHJvdW5kZWQtMyBwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+QXZhaWxhYmxlIFRpbWVzPC9oMz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGltZSBTbG90cyBHcmlkIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0yIG1iLTQgb3ZlcmZsb3ctc2Nyb2xsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgO2Vsc2Ugc2xvdHNMb2FkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiICpuZ0Zvcj1cImxldCB0aW1lIG9mIGxvY2F0aW9uVGltaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWUtc2xvdCByb3VuZGVkLTJcIiBbY2xhc3Muc2VsZWN0ZWRdPVwidGltZS5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUaW1lU2xvdCh0aW1lKVwiPnt7dGltZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU/LnZhbHVlIDogJ04vQSd9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3Nsb3RzTG9hZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUaW1lIFNsb3QgR3JpZCBTa2VsZXRvbiBMb2FkZXIgSFRNTCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXNsb3QtZ3JpZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUm93IDEgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLXRpbWUtc2xvdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi10aW1lLXNsb3RcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tdGltZS1zbG90XCI+PC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJvdyAyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi10aW1lLXNsb3RcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tdGltZS1zbG90XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLXRpbWUtc2xvdFwiPjwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSb3cgMyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tdGltZS1zbG90XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLXRpbWUtc2xvdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi10aW1lLXNsb3RcIj48L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUm93IDQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLXRpbWUtc2xvdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi10aW1lLXNsb3RcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tdGltZS1zbG90XCI+PC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJvdyA1IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi10aW1lLXNsb3RcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tdGltZS1zbG90XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLXRpbWUtc2xvdFwiPjwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSb3cgNiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tdGltZS1zbG90XCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLXRpbWUtc2xvdFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi10aW1lLXNsb3RcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFdhaXRsaXN0IFNlY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwid2FpdGxpc3Qtc2VjdGlvbiByb3VuZGVkLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBoLTEwMCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3YWl0bGlzdC10aXRsZSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+PHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwid2FpdGxpc3QtaWNvbiBjaGVjay1pY29uXCI+PC9zcGFuPk5vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RzIGF2YWlsYWJsZT88L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FpdGxpc3QtZGVzY3JpcHRpb24gZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwiZmxleENoZWNrQ2hlY2tlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgbWUgdG8gdGhlIHdhaXRsaXN0IGZvciBlYXJsaWVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuPC9uZy10ZW1wbGF0ZT5cbjxuZy10ZW1wbGF0ZSAjY29udGFjdERldGFpbHM+XG4gICAgPGRpdiBjbGFzcz1cInctNjAgY29udGFjdF9zZWN0aW9uIG92ZXJmbG93LWhpZGRlblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGgtMTAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC0xMDAgdy0xMDBcIj5cbiAgICAgICAgICAgICAgICA8IS0tIEhlYWRlciBTZWN0aW9uIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWhlYWRlciBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMT5Db250YWN0IERldGFpbHM8L2gxPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImNvbnRhY3Qtc3VidGl0bGUgbWItMFwiPlByb3ZpZGUgeW91ciBjb250YWN0IGluZm9ybWF0aW9uPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBGb3JtIFNlY3Rpb25zIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTMgZGV0YWlsc19jb250YWluZXIgZmxleC1jb2x1bW4gdy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBMZWZ0IENvbHVtbiAtIFBlcnNvbmFsIEluZm9ybWF0aW9uIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyd3LTUwJyA6IHNlbGVjdGVkU2VydmljZT8uaG9tZUFwcG9pbnRtZW50QXZhaWxhYmxlLCAndy0xMDAnIDogIXNlbGVjdGVkU2VydmljZT8uaG9tZUFwcG9pbnRtZW50QXZhaWxhYmxlfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXNlY3Rpb24gY2FyZCByb3VuZGVkLTMgcC00IGgtMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5QZXJzb25hbCBJbmZvcm1hdGlvbjwvaDM+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBGdWxsIE5hbWUgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdWxsIE5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWlucHV0IHJvdW5kZWQtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hlY2tSZXF1aXJlZFZhbHVlcygpXCIgc2ltcG9MZXR0ZXJzT25seT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbWFpbCBBZGRyZXNzIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1haWwgQWRkcmVzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWlucHV0IHJvdW5kZWQtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwuZW1haWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoZWNrUmVxdWlyZWRWYWx1ZXMoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj1cIl5bYS16MC05Ll8lKy1dK0BbYS16MC05Li1dK1xcLlthLXpdezIsNH0kXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUGhvbmUgTnVtYmVyIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmUgTnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZWxcIiBjbGFzcz1cImZvcm0tY29udHJvbCAgcm91bmRlZC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5waG9uZU51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hlY2tSZXF1aXJlZFZhbHVlcygpXCIgc2ltcG9OdW1iZXJzT25seVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbW9iaWxlX251bWJlcicgOiBhcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwucGhvbmVOdW1iZXIubGVuZ3RoICE9IDEwfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSaWdodCBDb2x1bW4gLSBIb21lIFZpc2l0IERldGFpbHMgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy01MFwiICpuZ0lmPVwic2VsZWN0ZWRTZXJ2aWNlPy5ob21lQXBwb2ludG1lbnRBdmFpbGFibGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uIGNhcmQgcm91bmRlZC0zIHAtNCBoLTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+SG9tZSBWaXNpdCBEZXRhaWxzPC9oMz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhvbWUgQWRkcmVzcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvbWUgQWRkcmVzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLXRleHRhcmVhIHJvdW5kZWQtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIGNvbXBsZXRlIGFkZHJlc3NcIiBbKG5nTW9kZWwpXT1cImhvbWVBZGRyZXNzXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTcGVjaWFsIEluc3RydWN0aW9ucyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpYWwgSW5zdHJ1Y3Rpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0tdGV4dGFyZWEgcm91bmRlZC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkFueSBzcGVjaWFsIGluc3RydWN0aW9ucyBmb3IgdGhlIHByb2Zlc3Npb25hbCAob3B0aW9uYWwpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImluc3RydWN0aW9uc1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9saWNpZXMtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhlYWRlciAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInBvbGljaWVzLXRpdGxlXCI+UG9saWNpZXMgJiBUZXJtczwvaDI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUG9saWN5IEl0ZW1zIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvbGljeS1pdGVtcy1jb250YWluZXIgZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYW5jZWxsYXRpb24gUG9saWN5IC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb2xpY3ktaXRlbSBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dDYW5jZWxsYXRpb25Qb2xpY3kgPSAhc2hvd0NhbmNlbGxhdGlvblBvbGljeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJwb2xpY3ktdGl0bGVcIj5DYW5jZWxsYXRpb24gUG9saWN5PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvbGljeS1hcnJvdyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj48bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFzaG93Q2FuY2VsbGF0aW9uUG9saWN5XCI+a2V5Ym9hcmRfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwic2hvd0NhbmNlbGxhdGlvblBvbGljeVwiPmtleWJvYXJkX2Fycm93X2Rvd248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FuY2VsbGF0aW9uX3BvbGljaWVzIGQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMiBmdy01MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dDYW5jZWxsYXRpb25Qb2xpY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHBvbGljeSBvZiBzZWxlY3RlZFNlcnZpY2U/LmNhbmNlbGxhdGlvblBvbGljeVwiPiYjODIyNjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7cG9saWN5fX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJlc2NoZWR1bGluZyBQb2xpY3kgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvbGljeS1pdGVtIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2hvd1JlZHVjaW5nUG9saWN5ID0gIXNob3dSZWR1Y2luZ1BvbGljeVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJwb2xpY3ktdGl0bGVcIj5SZXNjaGVkdWxpbmcgUG9saWN5PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvbGljeS1hcnJvdyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj48bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFzaG93UmVkdWNpbmdQb2xpY3lcIj5rZXlib2FyZF9hcnJvd19yaWdodDwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJzaG93UmVkdWNpbmdQb2xpY3lcIj5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbmNlbGxhdGlvbl9wb2xpY2llcyBkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTIgZnctNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93UmVkdWNpbmdQb2xpY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHBvbGljeSBvZiBzZWxlY3RlZFNlcnZpY2U/LnJlc2NoZWR1bGVQb2xpY3lcIj4mIzgyMjY7IHt7cG9saWN5fX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBY2NlcHRhbmNlIFNlY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjZXB0YW5jZS1zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJ0ZXJtc0FuZENvbmRpdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGVja1JlcXVpcmVkVmFsdWVzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImFjY2VwdGFuY2UtdGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCB0aGUgY2FuY2VsbGF0aW9uICYgcmVzY2hlZHVsaW5nIHBvbGljaWVzIGFuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRlcm1zLWxpbmtcIj5UZXJtcyAmIENvbmRpdGlvbnM8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZXh0ZXJuYWwtbGluay1pY29uXCI+PC9zcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuPG5nLXRlbXBsYXRlICNwYXltZW50VGFiPlxuICAgIDxkaXYgY2xhc3M9XCJ3LTYwIHBheW1lbnRfc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgaC0xMDBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICA8IS0tIEhlYWRlciBTZWN0aW9uIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXltZW50LWhlYWRlciBtYi0zIHctMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMT5QYXltZW50ICYgQ29uZmlybWF0aW9uPC9oMT5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwYXltZW50LXN1YnRpdGxlIG1iLTBcIj5SZXZpZXcgeW91ciBib29raW5nIGFuZCBjb21wbGV0ZSBwYXltZW50PC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBCb29raW5nIFN1bW1hcnkgQ2FyZCAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9va2luZy1zdW1tYXJ5LWNhcmRcIiBbbmdDbGFzc109XCJ7J3ctMTAwJyA6IHNjcmVlbldpZHRoIDwgNDc1LCd3LTUwJzpzY3JlZW5XaWR0aCA+IDQ3NX1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic3VtbWFyeS10aXRsZVwiPkJvb2tpbmcgU3VtbWFyeTwvaDI+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTZXJ2aWNlIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+U2VydmljZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj57e3NlbGVjdGVkU2VydmljZT8ubmFtZSA/IHNlbGVjdGVkU2VydmljZT8ubmFtZSA6ICdOL0EnfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBQcm9mZXNzaW9uYWwgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiICpuZ0lmPVwic2VsZWN0ZWRTdGFmZj8uc3RhZmZOYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlByb2Zlc3Npb25hbDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj57e3NlbGVjdGVkU3RhZmY/LnN0YWZmTmFtZSA/IHNlbGVjdGVkU3RhZmY/LnN0YWZmTmFtZSA6ICdOL0EnfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBMb2NhdGlvbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPkxvY2F0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPnt7c2VsZWN0ZWRMb2NhdGlvbj8uc3RvcmVOYW1lID8gc2VsZWN0ZWRMb2NhdGlvbj8uc3RvcmVOYW1lIDogJ04vQSd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0ZSAmIFRpbWUgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5EYXRlICYgVGltZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj57e3NlbGVjdGVkRGF0ZVN0ciA/IChzZWxlY3RlZERhdGVTdHIpIDogJ04vQSd9fSBhdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VsZWN0ZWRUaW1lID8gc2VsZWN0ZWRUaW1lLnZhbHVlIDogJ04vQSd9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIER1cmF0aW9uIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+RHVyYXRpb248L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+e3tzZWxlY3RlZFNlcnZpY2U/LmR1cmF0aW9uID8gc2VsZWN0ZWRTZXJ2aWNlPy5kdXJhdGlvbiA6ICdOL0EnfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51dGVzPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+VGF4IFBlcmNlbnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+e3tzZWxlY3RlZFNlcnZpY2U/LnByaWNlRGV0YWlscz8udGF4UGVyY2VudCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTZXJ2aWNlPy5wcmljZURldGFpbHM/LnRheFBlcmNlbnQgOiAwfX0lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8IS0tIFRvdGFsIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3cgdG90YWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlRvdGFsPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3VycmVuY3ktc3ltYm9sXCI+4oK5PC9zcGFuPnt7c2VsZWN0ZWRTZXJ2aWNlPy5wcmljZURldGFpbHM/LnRvdGFsUHJpY2UgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2VydmljZT8ucHJpY2VEZXRhaWxzPy50b3RhbFByaWNlIDogJzAnfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3N0YXR1c1RlbXBsYXRlPlxuICAgIDxkaXYgY2xhc3M9XCJib29raW5nLWNvbmZpcm1hdGlvblwiPlxuICAgICAgICA8IS0tIFN1Y2Nlc3MgSWNvbiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN1Y2Nlc3MtaWNvblwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrbWFyay1jaXJjbGVcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvODgxMjkzYzE3NTg2OTU1Nzg1MThzdWNjZXNzLmdpZlwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMDAgaC0xMDBcIiAqbmdJZj1cImFwaVN0YXR1c1wiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy8zMjUwMDBjMTc1ODY5NTU2NDUxOGZhaWwuZ2lmXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTEwMCBoLTEwMFwiICpuZ0lmPVwiIWFwaVN0YXR1c1wiPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTWFpbiBDb250ZW50IC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlybWF0aW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxoMSBjbGFzcz1cImNvbmZpcm1hdGlvbi10aXRsZVwiPnt7YXBpU3RhdHVzID8gJ0Jvb2tpbmcgQ29uZmlybWVkIScgOiAnQm9va2luZyBGYWlsZWQnfX08L2gxPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJjb25maXJtYXRpb24tbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgIHt7YXBpU3RhdHVzID8gJ1lvdXIgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGJvb2tlZC4nOidGYWlsZWQgdG8gYm9vayB5b3UgYXBwb2ludG1lbnQuIFBsZWFzZVxuICAgICAgICAgICAgICAgIHRyeSBhZ2FpbiBsYXRlcid9fVxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICA8IS0tIERldGFpbHMgQ2FyZCAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImFwaVN0YXR1c1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiZGV0YWlscy10aXRsZVwiPkFwcG9pbnRtZW50IERldGFpbHM8L2gzPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5TZXJ2aWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57e2FwcG9pbnRtZW50UGF5bG9hZC5zZXJ2aWNlRGV0YWlsPy5uYW1lID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBvaW50bWVudFBheWxvYWQuc2VydmljZURldGFpbD8ubmFtZSA6ICdOL0EnfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXJvd1wiICpuZ0lmPVwiYXBwb2ludG1lbnRQYXlsb2FkPy5zdGFmZkRldGFpbD8ubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5Qcm9mZXNzaW9uYWw8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7YXBwb2ludG1lbnRQYXlsb2FkLnN0YWZmRGV0YWlsPy5uYW1lID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBvaW50bWVudFBheWxvYWQuc3RhZmZEZXRhaWw/Lm5hbWUgOiAnTi9BJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPkRhdGUgJiBUaW1lPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57e2FwcG9pbnRtZW50UGF5bG9hZC5ib29raW5nRGF0ZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwb2ludG1lbnRQYXlsb2FkLmJvb2tpbmdEYXRlLnNsaWNlKDAsMTApIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTi9BJ319IGF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3thcHBvaW50bWVudFBheWxvYWQuc3RhcnRUaW1lID8gYXBwb2ludG1lbnRQYXlsb2FkLnN0YXJ0VGltZSA6ICdOL0EnfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgPCEtLSBBY3Rpb24gQnV0dG9ucyAtLT5cbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiPlZpZXcgTXkgQm9va2luZ3M8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCI+QmFjayB0byBBZG1pbjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI3NrZWxldG9uTG9hZGVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICA8IS0tIFNlcnZpY2UgU2tlbGV0b24gTG9hZGVyIEhUTUwgLS0+XG4gICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZ3JpZFwiPlxuICAgICAgICA8IS0tIFNrZWxldG9uIENhcmQgMSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY2FyZCBza2VsZXRvbi1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24taWNvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLXRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1wcmljZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tZHVyYXRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLWNhdGVnb3J5XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1iYWRnZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFNrZWxldG9uIENhcmQgMiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY2FyZCBza2VsZXRvbi1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24taWNvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLXRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1wcmljZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tZHVyYXRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLWNhdGVnb3J5XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1iYWRnZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFNrZWxldG9uIENhcmQgMyAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY2FyZCBza2VsZXRvbi1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24taWNvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLXRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1wcmljZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tZHVyYXRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLWNhdGVnb3J5XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1iYWRnZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFNrZWxldG9uIENhcmQgNCAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY2FyZCBza2VsZXRvbi1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24taWNvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLXRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1wcmljZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tZHVyYXRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLWNhdGVnb3J5XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1iYWRnZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFNrZWxldG9uIENhcmQgNSAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY2FyZCBza2VsZXRvbi1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24taWNvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLXRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1wcmljZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tZHVyYXRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLWNhdGVnb3J5XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1iYWRnZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIFNrZWxldG9uIENhcmQgNiAtLT5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY2FyZCBza2VsZXRvbi1jYXJkXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24taWNvblwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLXRpdGxlXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1wcmljZVwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tZHVyYXRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLWNhdGVnb3J5XCI+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tZGVzY3JpcHRpb25cIj48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1iYWRnZVwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19
495
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwb2ludG1lbnQtYm9va2luZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL3NlY3Rpb25zL2FwcG9pbnRtZW50LWZvcm0vYXBwb2ludG1lbnQtYm9va2luZy9hcHBvaW50bWVudC1ib29raW5nL2FwcG9pbnRtZW50LWJvb2tpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9zZWN0aW9ucy9hcHBvaW50bWVudC1mb3JtL2FwcG9pbnRtZW50LWJvb2tpbmcvYXBwb2ludG1lbnQtYm9va2luZy9hcHBvaW50bWVudC1ib29raW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUk3RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHekQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDcEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0s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SUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDLENBQUE7UUFDakUsQ0FBQzthQUNJLENBQUM7WUFDSixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDNUIsQ0FBQztJQUNILENBQUM7K0dBaGVVLDJCQUEyQjttR0FBM0IsMkJBQTJCLHVVQUozQixDQUFDLGNBQWMsQ0FBQywwQkN0QjdCLHFodkNBNnJCYyxtMmxCRHhxQmtCLFlBQVksMGxCQUFFLE9BQU8sMElBQUUsa0JBQWtCLDhCQUFFLG1CQUFtQiwwYkFBRSxXQUFXLHc3QkFBRSxtQkFBbUIsOEJBQUUsY0FBYywrQkFBRSxvQkFBb0IsK0RBQUUsb0JBQW9CLDhEQUFFLFdBQVc7OzRGQUs1TCwyQkFBMkI7a0JBUnZDLFNBQVM7K0JBQ0UsMkJBQTJCLGNBQ3pCLElBQUksV0FDUCxDQUFDLGtCQUFrQixFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLENBQUMsYUFDN0wsQ0FBQyxjQUFjLENBQUM7OEpBYWxCLElBQUk7c0JBQVosS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFRTixhQUFhO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBSzFDLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ2RrRHJhZ1BsYWNlaG9sZGVyIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9kcmFnLWRyb3BcIjtcclxuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pY29uXCI7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xyXG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXJcIjtcclxuaW1wb3J0IHsgTWF0TmF0aXZlRGF0ZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBSZXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3Jlc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IEV2ZW50c1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9ldmVudHMuc2VydmljZSc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBCYW5uZXJDb250ZW50TW9kZWwsIEJhbm5lclNlY3Rpb25Nb2RlbCB9IGZyb20gJy4uLy4uL2FwcG9pbnRtZW50LWZvcm0ubW9kZWwnO1xyXG5pbXBvcnQgeyBCYWNrZ3JvdW5kTW9kZWwsIEJhbm5lclN0eWxlc01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3R5bGVzL3N0eWxlLm1vZGVsJztcclxuaW1wb3J0IHsgTGV0dGVyc09ubHlEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi8uLi9kaXJlY3RpdmUvbGV0dGVycy1vbmx5LmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IE51bWJlcnNPbmx5RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGlyZWN0aXZlL251bWJlcnMtb25seS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBUb2FzdE1vZHVsZSB9IGZyb20gXCJwcmltZW5nL3RvYXN0XCI7XHJcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3NpbXBvLWFwcG9pbnRtZW50LWJvb2tpbmcnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW0Nka0RyYWdQbGFjZWhvbGRlciwgQ29tbW9uTW9kdWxlLCBNYXRJY29uLCBNYXRGb3JtRmllbGRNb2R1bGUsIE1hdERhdGVwaWNrZXJNb2R1bGUsIEZvcm1zTW9kdWxlLCBNYXROYXRpdmVEYXRlTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTGV0dGVyc09ubHlEaXJlY3RpdmUsIE51bWJlcnNPbmx5RGlyZWN0aXZlLCBUb2FzdE1vZHVsZV0sXHJcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hcHBvaW50bWVudC1ib29raW5nLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYXBwb2ludG1lbnQtYm9va2luZy5jb21wb25lbnQuY3NzJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgQXBwb2ludG1lbnRCb29raW5nQ29tcG9uZW50IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZXZlbnRTZXJ2aWNlOiBFdmVudHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlXHJcbiAgKSB7XHJcblxyXG4gIH1cclxuICBASW5wdXQoKSBkYXRhPzogQmFubmVyU2VjdGlvbk1vZGVsO1xyXG4gIEBJbnB1dCgpIGluZGV4PzogbnVtYmVyO1xyXG4gIGNvbnRlbnQ/OiBCYW5uZXJDb250ZW50TW9kZWw7XHJcbiAgQElucHV0KCkgZWRpdD86IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZGVsZXRlPzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBjdXN0b21DbGFzcz86IHN0cmluZztcclxuICBASW5wdXQoKSBuZXh0Q29tcG9uZW50Q29sb3I/OiBCYWNrZ3JvdW5kTW9kZWw7XHJcbiAgc3R5bGVzPzogQmFubmVyU3R5bGVzTW9kZWw7XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmdldEFsbFNlcnZpY2VzKCk7XHJcbiAgICB0aGlzLmdldFNjcmVlblNpemUoKTtcclxuICB9XHJcbiAgc2NyZWVuV2lkdGg6IG51bWJlciA9IDA7XHJcbiAgQEhvc3RMaXN0ZW5lcihcIndpbmRvdzogcmVzaXplXCIsIFtcIiRldmVudFwiXSlcclxuICBnZXRTY3JlZW5TaXplKCkge1xyXG4gICAgdGhpcy5zY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xyXG4gIH1cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycpXHJcbiAgY2xvc2VPbk91dHNpZGVDbGljaygpIHtcclxuICAgIHRoaXMuc2hvd0NhbGVuZGFyID0gZmFsc2U7XHJcbiAgfVxyXG4gIGFjY2Vzc2VkVGFicyA9IHtcclxuICAgIHNlcnZpY2VMaXN0aW5nOiBmYWxzZSxcclxuICAgIGxvY2F0aW9uTGlzdGluZzogZmFsc2UsXHJcbiAgICBzdGFmZkxpc3Rpbmc6IGZhbHNlXHJcbiAgfVxyXG4gIHNrZWxldG9uTG9hZGVyOiBib29sZWFuID0gZmFsc2U7XHJcbiAgYnVzaW5lc3NOYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzTmFtZScpID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzTmFtZScpIDogKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdiTmFtZScpID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2JOYW1lJykgOiAnJyk7XHJcbiAgYnVzaW5lc3NJZDogYW55ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSA/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdidXNpbmVzc0lkJykgOiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2JJZCcpID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2JJZCcpIDogJycpO1xyXG4gIGFjdGl2ZUJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkVGFiOiBzdHJpbmcgPSAnJztcclxuICBiYXJXaWR0aDogc3RyaW5nID0gJyc7XHJcbiAgc2hvd0NhbmNlbGxhdGlvblBvbGljeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNob3dSZWR1Y2luZ1BvbGljeTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkU2VydmljZTogYW55ID0ge307XHJcbiAgc2VsZWN0ZWRMb2NhdGlvbjogYW55O1xyXG4gIGhvbWVBZGRyZXNzOiBzdHJpbmcgPSAnJztcclxuICBpbnN0cnVjdGlvbnM6IHN0cmluZyA9ICcnO1xyXG4gIE9iamVjdCA9IE9iamVjdDtcclxuICBzaG93Q2FsZW5kYXIgPSBmYWxzZTtcclxuICBzZWxlY3RlZERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcclxuICBzZWxlY3RlZERhdGVTdHIgPSAnJztcclxuICB1c2VyRGV0YWlscyA9IHtcclxuICAgIG5hbWU6ICcnLFxyXG4gICAgZW1haWw6ICcnLFxyXG4gICAgbW9iaWxlTnVtYmVyOiAnJ1xyXG4gIH1cclxuICBkYXRlRmlsdGVyID0gKGQ6IERhdGUgfCBudWxsKTogYm9vbGVhbiA9PiB7XHJcbiAgICBjb25zdCBkYXRlID0gKGQgfHwgbmV3IERhdGUoKSk7XHJcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcclxuICAgIHJldHVybiBkYXRlLmdldFRpbWUoKSA+PSB0b2RheS5nZXRUaW1lKCk7XHJcbiAgfVxyXG4gIHRvZ2dsZUNhbGVuZGFyKGV2ZW50PzogRXZlbnQpIHtcclxuICAgIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnNob3dDYWxlbmRhciA9ICF0aGlzLnNob3dDYWxlbmRhcjtcclxuICB9XHJcblxyXG4gIG9uRGF0ZVNlbGVjdGVkKGRhdGU6IGFueSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFRpbWUgPSB7fTtcclxuICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gZmFsc2U7XHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0ciA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlKTtcclxuICAgIHRoaXMuc2hvd0NhbGVuZGFyID0gZmFsc2U7XHJcbiAgICB0aGlzLmdldEF2YWlsYWJsZVNsb3RzKCk7XHJcbiAgfVxyXG4gIHByaXZhdGUgZm9ybWF0RGF0ZShkOiBEYXRlKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGRkID0gU3RyaW5nKGQuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgY29uc3QgbW0gPSBTdHJpbmcoZC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IHl5eXkgPSBkLmdldEZ1bGxZZWFyKCk7XHJcbiAgICByZXR1cm4gYCR7ZGR9LSR7bW19LSR7eXl5eX1gO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U2VydmljZShzZXJ2aWNlOiBhbnkpIHtcclxuICAgIHNlcnZpY2Uuc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlICYmIHNlcnZpY2Uuc2VydmljZUlkICE9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLnNlcnZpY2VJZCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkU2VydmljZS5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZFNlcnZpY2UgPSBzZXJ2aWNlXHJcbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIH1cclxuICBzZWxlY3RMb2NhdGlvbihsb2NhdGlvbjogYW55KSB7XHJcbiAgICBsb2NhdGlvbi5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZExvY2F0aW9uICYmIGxvY2F0aW9uLmlkICE9IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbi5pZCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24uc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gdHJ1ZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbiA9IGxvY2F0aW9uO1xyXG4gIH1cclxuICBzZWxlY3RlZFN0YWZmOiBhbnk7XHJcbiAgc2VsZWN0U3RhZmYoc3RhZmY6IGFueSkge1xyXG4gICAgc3RhZmYuc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRTdGFmZiAmJiBzdGFmZi5zdGFmZklkICE9IHRoaXMuc2VsZWN0ZWRTdGFmZi5zdGFmZklkKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdGFmZi5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3RlZFN0YWZmID0gc3RhZmY7XHJcbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRydWU7XHJcbiAgfVxyXG4gIG5leHRTdGVwKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdzZXJ2aWNlTGlzdGluZycpIHtcclxuICAgICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0aGlzLnNlbGVjdGVkTG9jYXRpb24gPyB0cnVlIDogZmFsc2U7XHJcbiAgICAgIHRoaXMuYWNjZXNzZWRUYWJzLnNlcnZpY2VMaXN0aW5nID0gdHJ1ZTtcclxuICAgICAgLy8gaWYgKCF0aGlzLmFjdGl2ZUJ1dHRvbikge1xyXG4gICAgICAvLyAgIHRoaXMuZ2V0QWxsTG9jYXRpb25zKCk7XHJcbiAgICAgIC8vIH1cclxuICAgICAgLy8gZWxzZSB7XHJcbiAgICAgIC8vICAgaWYgKHRoaXMuYWNjZXNzZWRUYWJzLmxvY2F0aW9uTGlzdGluZykge1xyXG4gICAgICAvLyAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdsb2NhdGlvbkxpc3RpbmcnO1xyXG4gICAgICAvLyAgICAgdGhpcy5iYXJXaWR0aCA9ICcyOS4yOCc7XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyAgIGVsc2UgaWYgKHRoaXMuYWNjZXNzZWRUYWJzLnN0YWZmTGlzdGluZykge1xyXG4gICAgICAvLyAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdzdGFmZkxpc3RpbmcnO1xyXG4gICAgICAvLyAgICAgdGhpcy5iYXJXaWR0aCA9ICc0My41Nyc7XHJcbiAgICAgIC8vICAgfVxyXG4gICAgICAvLyAgIGVsc2Uge1xyXG4gICAgICAvLyAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdkYXRlU2VsZWN0aW9uJztcclxuICAgICAgLy8gICAgIHRoaXMuYmFyV2lkdGggPSAnNTguNTcnO1xyXG4gICAgICAvLyAgICAgaWYgKHRoaXMuc2VsZWN0ZWRMb2NhdGlvbiAmJiB0aGlzLnNlbGVjdGVkU2VydmljZSlcclxuICAgICAgLy8gICAgICAgdGhpcy5nZXRBdmFpbGFibGVTbG90cygpO1xyXG4gICAgICAvLyAgIH1cclxuICAgICAgLy8gfVxyXG4gICAgICB0aGlzLmdldEFsbExvY2F0aW9ucygpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ2xvY2F0aW9uTGlzdGluZycpIHtcclxuICAgICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0cnVlO1xyXG4gICAgICB0aGlzLmFjY2Vzc2VkVGFicy5sb2NhdGlvbkxpc3RpbmcgPSB0cnVlO1xyXG4gICAgICAvLyBpZiAoIXRoaXMuYWN0aXZlQnV0dG9uKSB7XHJcbiAgICAgIC8vICAgdGhpcy5nZXRBbGxTdGFmZigpO1xyXG5cclxuICAgICAgLy8gfVxyXG4gICAgICB0aGlzLmdldEFsbFN0YWZmKCk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnc3RhZmZMaXN0aW5nJykge1xyXG4gICAgICB0aGlzLmFjY2Vzc2VkVGFicy5zdGFmZkxpc3RpbmcgPSB0cnVlO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ2RhdGVTZWxlY3Rpb24nO1xyXG4gICAgICB0aGlzLmJhcldpZHRoID0gJzU4LjU3JztcclxuICAgICAgdGhpcy5nZXRBdmFpbGFibGVTbG90cygpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ2RhdGVTZWxlY3Rpb24nKSB7XHJcbiAgICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gdGhpcy5hcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwubmFtZSAmJiB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5lbWFpbCAmJiB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5waG9uZU51bWJlci5sZW5ndGggPT09IDEwID8gdHJ1ZSA6IGZhbHNlXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnY29udGFjdERldGFpbHMnO1xyXG4gICAgICB0aGlzLmJhcldpZHRoID0gJzcwLjU3J1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ2NvbnRhY3REZXRhaWxzJykge1xyXG4gICAgICB0aGlzLmNoZWNrUmVxdWlyZWRWYWx1ZXMoKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdwYXltZW50VGFiJztcclxuICAgICAgdGhpcy5iYXJXaWR0aCA9ICc4NS41NydcclxuICAgIH1cclxuICB9XHJcbiAgcHJldmlvdXNTdGVwKCkge1xyXG4gICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFiICE9ICdzZXJ2aWNlTGlzdGluZycpIHtcclxuICAgICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0cnVlO1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ2xvY2F0aW9uTGlzdGluZycpIHtcclxuICAgICAgICBpZiAodGhpcy5hY2Nlc3NlZFRhYnMuc2VydmljZUxpc3RpbmcpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc2VydmljZUxpc3RpbmcnO1xyXG4gICAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICcxNC4yOCc7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24gPSBudWxsO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnc3RhZmZMaXN0aW5nJykge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRTdGFmZiA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuYWNjZXNzZWRUYWJzLmxvY2F0aW9uTGlzdGluZykge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdsb2NhdGlvbkxpc3RpbmcnO1xyXG4gICAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICcyOS4yOCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuYWNjZXNzZWRUYWJzLnNlcnZpY2VMaXN0aW5nKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ3NlcnZpY2VMaXN0aW5nJztcclxuICAgICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMTQuMjgnO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnZGF0ZVNlbGVjdGlvbicpIHtcclxuICAgICAgICBpZiAodGhpcy5hY2Nlc3NlZFRhYnMuc3RhZmZMaXN0aW5nKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ3N0YWZmTGlzdGluZyc7XHJcbiAgICAgICAgICB0aGlzLmJhcldpZHRoID0gJzQzLjU3JztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5hY2Nlc3NlZFRhYnMubG9jYXRpb25MaXN0aW5nKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ2xvY2F0aW9uTGlzdGluZyc7XHJcbiAgICAgICAgICB0aGlzLmJhcldpZHRoID0gJzI5LjI4JztcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5hY2Nlc3NlZFRhYnMuc2VydmljZUxpc3RpbmcpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc2VydmljZUxpc3RpbmcnO1xyXG4gICAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICcxNC4yOCc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdjb250YWN0RGV0YWlscycpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ2RhdGVTZWxlY3Rpb24nO1xyXG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnNTguNTcnO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdwYXltZW50VGFiJykge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnY29udGFjdERldGFpbHMnO1xyXG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnNzAuNTcnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIHNlcnZpY2VEYXRhOiBhbnlbXSA9IFtdO1xyXG4gIGdldEFsbFNlcnZpY2VzKCkge1xyXG4gICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IHRydWVcclxuICAgIGxldCBzZXJ2aWNlUGF5bG9hZDogYW55ID0ge1xyXG4gICAgICBidXNpbmVzc0lkOiB0aGlzLmJ1c2luZXNzSWQgPz8gXCJcIixcclxuICAgICAgcGFnZU5vOiAwLFxyXG4gICAgICBzaXplOiAxMDBcclxuICAgIH1cclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsQXBwb2ludG1lbnRTZXJ2aWNlKHNlcnZpY2VQYXlsb2FkKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuY29udGVudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnNlcnZpY2VEYXRhID0gcmVzLmNvbnRlbnQuZmlsdGVyKChzZXJ2aWNlOiBhbnkpID0+IHNlcnZpY2UuYWN0aXZlID09PSB0cnVlKTtcclxuICAgICAgICAgIHRoaXMuc2VydmljZURhdGEuZm9yRWFjaChzZXJ2aWNlID0+IHNlcnZpY2Uuc2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnNlcnZpY2VEYXRhKVxyXG4gICAgICAgICAgaWYgKHRoaXMuc2VydmljZURhdGEubGVuZ3RoID09PSAxICYmICF0aGlzLmFjdGl2ZUJ1dHRvbikge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2VydmljZSA9IHRoaXMuc2VydmljZURhdGFbMF07XHJcbiAgICAgICAgICAgIHRoaXMuZ2V0QWxsTG9jYXRpb25zKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdzZXJ2aWNlTGlzdGluZyc7XHJcbiAgICAgICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMTQuMjgnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyBncmFjZWZ1bGx5XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGxvY2F0aW9uRGF0YTogYW55W10gPSBbXTtcclxuICBnZXRBbGxMb2NhdGlvbnMoKSB7XHJcbiAgICB0aGlzLmxvYWRlciA9IHRydWU7XHJcbiAgICB0aGlzLmxvY2F0aW9uRGF0YSA9IFtdO1xyXG4gICAgbGV0IHBheWxvYWQgPSB7IGJ1c2luZXNzSWQ6IHRoaXMuYnVzaW5lc3NJZCA/PyBcIlwiIH1cclxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsU3RvcmVzKHBheWxvYWQpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcy5kYXRhLmRhdGEubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgbGV0IGxvY2F0aW9ucyA9IHJlcy5kYXRhLmRhdGEuZmlsdGVyKChzdG9yZTogYW55KSA9PiB7IHJldHVybiBzdG9yZS5zdGF0dXMgPT09ICdBQ1RJVkUnIH0pO1xyXG4gICAgICAgICAgbG9jYXRpb25zLmZvckVhY2goKGxvY2F0aW9uOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRTZXJ2aWNlLnN0b3JlSWRzLmluY2x1ZGVzKGxvY2F0aW9uLmlkKSkge1xyXG4gICAgICAgICAgICAgIGxvY2F0aW9uLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvbkRhdGEucHVzaChsb2NhdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBpZiAodGhpcy5sb2NhdGlvbkRhdGEubGVuZ3RoID09PSAxKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRMb2NhdGlvbiA9IHRoaXMubG9jYXRpb25EYXRhWzBdO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmFjY2Vzc2VkVGFicy5sb2NhdGlvbkxpc3RpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5nZXRBbGxTdGFmZigpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnbG9jYXRpb25MaXN0aW5nJztcclxuICAgICAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICcyOS4yOCc7XHJcbiAgICAgICAgICAgIHRoaXMuYWNjZXNzZWRUYWJzLmxvY2F0aW9uTGlzdGluZyA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ05vIExvY2F0aW9uJywgZGV0YWlsOiAnTm8gTG9jYXRpb24gYWRkZWQgZm9yIHNlbGVjdGVkIHNlcnZpY2UnIH0pO1xyXG4gICAgICAgICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIChlcnJvcikgPT4ge1xyXG4gICAgICAgIC8vIEhhbmRsZSBlcnJvcnMgZ3JhY2VmdWxseVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICBzdGFmZlBheWxvYWQ6IGFueSA9IHtcclxuICAgIHNlcnZpY2VJZDogJycsXHJcbiAgICBzdG9yZUlkOiAnJyxcclxuICAgIGJ1c2luZXNzSWQ6ICcnXHJcbiAgfVxyXG4gIHN0YWZmRGF0YTogYW55W10gPSBbXTtcclxuICBnZXRBbGxTdGFmZigpIHtcclxuICAgIHRoaXMubG9hZGVyID0gdHJ1ZTtcclxuICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gdHJ1ZTtcclxuICAgIHRoaXMuc3RhZmZQYXlsb2FkLnN0b3JlSWQgPSB0aGlzLnNlbGVjdGVkTG9jYXRpb24/LmlkID8/IFwiXCI7XHJcbiAgICB0aGlzLnN0YWZmUGF5bG9hZC5zZXJ2aWNlSWQgPSB0aGlzLnNlbGVjdGVkU2VydmljZT8uc2VydmljZUlkID8gdGhpcy5zZWxlY3RlZFNlcnZpY2Uuc2VydmljZUlkIDogJyc7XHJcbiAgICB0aGlzLnN0YWZmUGF5bG9hZC5idXNpbmVzc0lkID0gdGhpcy5idXNpbmVzc0lkID8/IFwiXCI7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEFsbFN0YWZmKHRoaXMuc3RhZmZQYXlsb2FkKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgdGhpcy5zdGFmZkRhdGEgPSByZXMuZmlsdGVyKChzdGFmZjogYW55KSA9PiBzdGFmZi5hY3RpdmUgPT09IHRydWUgJiYgc3RhZmYuYm9va2luZ0FsbG93ZWQpO1xyXG4gICAgICAgICAgdGhpcy5zdGFmZkRhdGEuZm9yRWFjaChzdGFmZiA9PiBzdGFmZi5zZWxlY3RlZCA9IGZhbHNlKTtcclxuICAgICAgICAgIGlmICh0aGlzLnN0YWZmRGF0YS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdkYXRlU2VsZWN0aW9uJztcclxuICAgICAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICc1OC41Nyc7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdGFmZiA9IHRoaXMuc3RhZmZEYXRhWzBdO1xyXG4gICAgICAgICAgICB0aGlzLmdldEF2YWlsYWJsZVNsb3RzKCk7XHJcbiAgICAgICAgICAgIHRoaXMuYWNjZXNzZWRUYWJzLnN0YWZmTGlzdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAodGhpcy5zdGFmZkRhdGEubGVuZ3RoID4gMSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ3N0YWZmTGlzdGluZyc7XHJcbiAgICAgICAgICAgIHRoaXMuYmFyV2lkdGggPSAnNDMuNTcnO1xyXG4gICAgICAgICAgICB0aGlzLmFjY2Vzc2VkVGFicy5zdGFmZkxpc3RpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdlcnJvcicsIHN1bW1hcnk6ICdObyBTdGFmZiBQcmVzZW50JywgZGV0YWlsOiAnTm8gU3RhZmYgcHJlc2VudCBmb3Igc2VsZWN0ZWQgc2VydmljZScgfSk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyBncmFjZWZ1bGx5XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgfVxyXG4gIGNvbnZlcnRUbzI0SG91cih0aW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgW2hvdXJNaW4sIG1vZGlmaWVyUmF3XSA9IHRpbWUuc3BsaXQoJyAnKTtcclxuICAgIGNvbnN0IG1vZGlmaWVyID0gbW9kaWZpZXJSYXcudG9VcHBlckNhc2UoKTsgLy8gXCJBTVwiIG9yIFwiUE1cIlxyXG4gICAgbGV0IFtob3VycywgbWludXRlc10gPSBob3VyTWluLnNwbGl0KCc6JykubWFwKE51bWJlcik7XHJcblxyXG4gICAgaWYgKG1vZGlmaWVyID09PSAnUE0nICYmIGhvdXJzIDwgMTIpIHtcclxuICAgICAgaG91cnMgKz0gMTI7XHJcbiAgICB9XHJcbiAgICBpZiAobW9kaWZpZXIgPT09ICdBTScgJiYgaG91cnMgPT09IDEyKSB7XHJcbiAgICAgIGhvdXJzID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBoaCA9IGhvdXJzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IG1tID0gbWludXRlcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICByZXR1cm4gYCR7aGh9OiR7bW19ICR7bW9kaWZpZXJ9YDtcclxuICB9XHJcbiAgc2xvdHNQYXlsb2FkOiBhbnkgPSB7XHJcbiAgICBzdG9yZUlkOiBcIlwiLFxyXG4gICAgc2VydmljZUlkOiBcIlwiLFxyXG4gICAgYnVzaW5lc3NJZDogXCJcIixcclxuICAgIGJvb2tpbmdEYXRlOiBcIlwiXHJcbiAgfVxyXG4gIGxvY2F0aW9uVGltaW5nOiBhbnlbXSA9IFtdO1xyXG4gIGxvYWRlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGdldEF2YWlsYWJsZVNsb3RzKCkge1xyXG4gICAgdGhpcy5hY3RpdmVCdXR0b24gPSBmYWxzZTtcclxuICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcclxuICAgIHRoaXMubG9jYXRpb25UaW1pbmcgPSBbXTtcclxuICAgIHRoaXMuc2xvdHNQYXlsb2FkLnN0b3JlSWQgPSB0aGlzLnNlbGVjdGVkTG9jYXRpb24/LmlkID8/IFwiXCI7XHJcbiAgICB0aGlzLnNsb3RzUGF5bG9hZC5zZXJ2aWNlSWQgPSB0aGlzLnNlbGVjdGVkU2VydmljZT8uc2VydmljZUlkID8gdGhpcy5zZWxlY3RlZFNlcnZpY2Uuc2VydmljZUlkIDogJyc7XHJcbiAgICB0aGlzLnNsb3RzUGF5bG9hZC5idXNpbmVzc0lkID0gdGhpcy5idXNpbmVzc0lkID8/IFwiXCI7XHJcbiAgICBjb25zdCBkYXRlID0gdGhpcy5zZWxlY3RlZERhdGUgPz8gbmV3IERhdGUoKTtcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlU3RyID0gdGhpcy5mb3JtYXREYXRlKGRhdGUpO1xyXG4gICAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuICAgIGNvbnN0IG1tID0gU3RyaW5nKGRhdGUuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICBjb25zdCBkZCA9IFN0cmluZyhkYXRlLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIHRoaXMuc2xvdHNQYXlsb2FkLmJvb2tpbmdEYXRlID0gYCR7eXl5eX0tJHttbX0tJHtkZH1UMDA6MDA6MDAuMDAwWmA7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFN0YWZmKVxyXG4gICAgICB0aGlzLnNsb3RzUGF5bG9hZC5zdGFmZklkID0gdGhpcy5zZWxlY3RlZFN0YWZmLnN0YWZmSWQ7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEJvb2tpbmdTbG90cyh0aGlzLnNsb3RzUGF5bG9hZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICByZXMuZm9yRWFjaCgodGltZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvblRpbWluZy5wdXNoKHsgc2VsZWN0ZWQ6IGZhbHNlLCB2YWx1ZTogdGltZSB9KTtcclxuICAgICAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgICAgIGlmIChyZXMubGVuZ3RoIDw9IDApIHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnQm9va2luZyBGYWlsZWQnLCBkZXRhaWw6ICdVbmFibGUgdG8gZmV0Y2ggYXZhaWxhYmxlIHNsb3RzLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyJyB9KTtcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgICAgKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnVW5hYmxlIHRvIGZldGNoIHNsb3RzJywgZGV0YWlsOiBlcnJvci5lcnJvci5tZXNzYWdlIH0pO1xyXG4gICAgICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XHJcbiAgICAgIH0pXHJcbiAgfVxyXG4gIGlzUHJvY2Vzc2luZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkVGltZTogYW55XHJcbiAgc2VsZWN0VGltZVNsb3QodGltZTogYW55KSB7XHJcbiAgICB0aW1lLnNlbGVjdGVkID0gdHJ1ZTtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkVGltZSAmJiB0aW1lLnZhbHVlICE9IHRoaXMuc2VsZWN0ZWRUaW1lLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGVkVGltZSA9IHRpbWU7XHJcbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRydWU7XHJcbiAgfVxyXG4gIHRlcm1zQW5kQ29uZGl0aW9uczogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNoZWNrUmVxdWlyZWRWYWx1ZXMoKSB7XHJcbiAgICBpZiAodGhpcy5hcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwubmFtZSAmJiB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5lbWFpbC5pbmNsdWRlcygnQCcpICYmIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLnBob25lTnVtYmVyLmxlbmd0aCA9PT0gMTAgJiYgdGhpcy50ZXJtc0FuZENvbmRpdGlvbnMpIHtcclxuICAgICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0cnVlO1xyXG4gICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLnNlbGVjdGVkU2VydmljZSwgdGhpcy5zZWxlY3RlZExvY2F0aW9uLCB0aGlzLnNlbGVjdGVkU3RhZmYsIHRoaXMuc2VsZWN0ZWREYXRlLCB0aGlzLnNlbGVjdGVkVGltZSwgdGhpcy51c2VyRGV0YWlscylcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuICBhcHBvaW50bWVudFBheWxvYWQ6IGFueSA9IHtcclxuICAgIHN0YWZmRGV0YWlsOiB7XHJcbiAgICAgIGlkOiAnJyxcclxuICAgICAgbmFtZTogJydcclxuICAgIH0sXHJcbiAgICBib29raW5nRGF0ZTogJycsXHJcbiAgICBzdGFydFRpbWU6ICcnLFxyXG4gICAgY3VzdG9tZXJEZXRhaWw6IHtcclxuICAgICAgbmFtZTogJycsXHJcbiAgICAgIHBob25lTnVtYmVyOiAnJyxcclxuICAgICAgZW1haWw6ICcnXHJcbiAgICB9LFxyXG4gICAgc2VydmljZURldGFpbDoge1xyXG4gICAgICBpZDogJycsXHJcbiAgICAgIG5hbWU6ICcnXHJcbiAgICB9LFxyXG4gICAgc3RvcmVJZDogJycsXHJcbiAgICBidXNpbmVzc0lkOiB0aGlzLmJ1c2luZXNzSWQsXHJcbiAgICBidXNpbmVzc05hbWU6IHRoaXMuYnVzaW5lc3NOYW1lXHJcbiAgfVxyXG4gIGNoZWNrUGF5bWVudCgpIHtcclxuICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IHJlcXVlc3RfZm9ybSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFwiUkVRVUVTVF9GUk9NXCIpO1xyXG4gICAgaWYgKHJlcXVlc3RfZm9ybSA9PT0gJ0VDT01NRVJDRScpIHtcclxuICAgICAgdGhpcy5jcmVhdGVBcHBvaW50bWVudCgpO1xyXG4gICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkU2VydmljZT8uZGVwb3NpdEFtb3VudD8uZGVwb3NpdFJlcXVpcmVkKSB7XHJcbiAgICAgICAgdGhpcy5wYXltZW50Qm9va2luZ0FwcG9pbnRtZW50KCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVBcHBvaW50bWVudCgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyB0aGlzLmNyZWF0ZUFwcG9pbnRtZW50KCk7XHJcbiAgfVxyXG4gIGFwaVN0YXR1czogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNyZWF0ZUFwcG9pbnRtZW50KCkge1xyXG4gICAgY29uc3QgZGF0ZSA9IHRoaXMuc2VsZWN0ZWREYXRlID8/IG5ldyBEYXRlKCk7XHJcbiAgICBjb25zdCB5eXl5ID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xyXG4gICAgY29uc3QgbW0gPSBTdHJpbmcoZGF0ZS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IGRkID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuc3RhZmZEZXRhaWwuaWQgPSB0aGlzLnNlbGVjdGVkU3RhZmY/LnN0YWZmSWQ7XHJcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5zdGFmZkRldGFpbC5uYW1lID0gdGhpcy5zZWxlY3RlZFN0YWZmPy5zdGFmZk5hbWU7XHJcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5zdG9yZUlkID0gdGhpcy5zZWxlY3RlZExvY2F0aW9uPy5pZDtcclxuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnNlcnZpY2VEZXRhaWwuaWQgPSB0aGlzLnNlbGVjdGVkU2VydmljZT8uc2VydmljZUlkO1xyXG4gICAgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuc2VydmljZURldGFpbC5uYW1lID0gdGhpcy5zZWxlY3RlZFNlcnZpY2U/Lm5hbWU7XHJcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5zdGFydFRpbWUgPSB0aGlzLmNvbnZlcnRUbzI0SG91cih0aGlzLnNlbGVjdGVkVGltZS52YWx1ZSkuc2xpY2UoMCwgNSk7XHJcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5ib29raW5nRGF0ZSA9IGAke3l5eXl9LSR7bW19LSR7ZGR9VDAwOjAwOjAwLjAwMFpgO1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5ib29rQXBwb2ludG1lbnRWMih0aGlzLmFwcG9pbnRtZW50UGF5bG9hZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ3N0YXR1c1RlbXBsYXRlJztcclxuICAgICAgdGhpcy5iYXJXaWR0aCA9ICcxMDAnO1xyXG4gICAgICB0aGlzLmFwaVN0YXR1cyA9IHRydWU7XHJcbiAgICB9LFxyXG4gICAgICAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuYXBpU3RhdHVzID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Jvb2tpbmcgRmFpbGVkJywgZGV0YWlsOiBlcnJvci5lcnJvci5tZXNzYWdlIH0pO1xyXG4gICAgICB9XHJcbiAgICApXHJcbiAgfVxyXG4gIHBheW1lbnRCb29raW5nQXBwb2ludG1lbnQoKSB7XHJcbiAgICBjb25zdCBkYXRlID0gdGhpcy5zZWxlY3RlZERhdGUgPz8gbmV3IERhdGUoKTtcclxuICAgIGNvbnN0IHl5eXkgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICBjb25zdCBtbSA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgY29uc3QgZGQgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5zdGFmZkRldGFpbC5pZCA9IHRoaXMuc2VsZWN0ZWRTdGFmZj8uc3RhZmZJZDtcclxuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnN0YWZmRGV0YWlsLm5hbWUgPSB0aGlzLnNlbGVjdGVkU3RhZmY/LnN0YWZmTmFtZTtcclxuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnN0b3JlSWQgPSB0aGlzLnNlbGVjdGVkTG9jYXRpb24/LmlkO1xyXG4gICAgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuc2VydmljZURldGFpbC5pZCA9IHRoaXMuc2VsZWN0ZWRTZXJ2aWNlPy5zZXJ2aWNlSWQ7XHJcbiAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5zZXJ2aWNlRGV0YWlsLm5hbWUgPSB0aGlzLnNlbGVjdGVkU2VydmljZT8ubmFtZTtcclxuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLnN0YXJ0VGltZSA9IHRoaXMuY29udmVydFRvMjRIb3VyKHRoaXMuc2VsZWN0ZWRUaW1lLnZhbHVlKS5zbGljZSgwLCA1KTtcclxuICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmJvb2tpbmdEYXRlID0gYCR7eXl5eX0tJHttbX0tJHtkZH1UMDA6MDA6MDAuMDAwWmA7XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLnBheW1lbnRGb3JBcHBvaW50bWVudCh0aGlzLmFwcG9pbnRtZW50UGF5bG9hZCkuc3Vic2NyaWJlKFxyXG4gICAgICAocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwb2ludG1lbnRQYXltZW50SWQnLCByZXMucGdPcmRlcklkKTtcclxuICAgICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlOyAgXHJcbiAgICAgICAgdGhpcy5fZXZlbnRTZXJ2aWNlLmNhc2hGcmVlRXZlbnQuZW1pdCh7IGRhdGE6IHsgb3JkZXJTaWduYXR1cmU6IHJlcy5vcmRlclNpZ25hdHVyZSB9IH0pO1xyXG4gICAgICB9LFxyXG4gICAgICAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ1BheW1lbnQgRmFpbGVkJywgZGV0YWlsOiBlcnJvci5lcnJvci5tZXNzYWdlIH0pO1xyXG4gICAgICB9XHJcbiAgICApXHJcblxyXG4gIH1cclxuICBnb0JhY2soKSB7XHJcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJSRVFVRVNUX0ZST01cIikgPT09ICdFQ09NTUVSQ0UnKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FkbWluL2FwcG9pbnRtZW50cy9saXN0LWFwcG9pbnRtZW50cyddKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnJ10pXHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCIgW2Jhc2VaSW5kZXhdPVwiMTAwMDAwMDAwMDBcIiBbYXV0b1pJbmRleF09XCJ0cnVlXCJcclxuICAgIFtzaG93VHJhbnNmb3JtT3B0aW9uc109XCJzY3JlZW5XaWR0aCA8IDQ3NSA/ICd0cmFuc2xhdGVZKC0xMDAlKScgOiAnJ1wiPjwvcC10b2FzdD5cclxuPHNlY3Rpb24gY2xhc3M9XCJtYWluX3NlY3Rpb25cIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtYWluX2hlYWRlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFjay1idG4gZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyIGdhcC0yIG1iLTNcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImdvQmFjaygpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+a2V5Ym9hcmRfYmFja3NwYWNlPC9tYXQtaWNvbj48c3BhbiAqbmdJZj1cInNjcmVlbldpZHRoID4gNDc1XCI+QmFjayB0byBIb21lPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlci10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgPGgxPkJvb2sgTmV3IEFwcG9pbnRtZW50PC9oMT5cclxuICAgICAgICAgICAgICAgIDxwPnt7YnVzaW5lc3NOYW1lID8/IFwiTi9BXCIgfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtYmFyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1maWxsXCIgW3N0eWxlLndpZHRoXT1cImJhcldpZHRoICsgJyUnXCI+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJtYWluX2JvZHkgdy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj48bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdzZXJ2aWNlTGlzdGluZydcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlcnZpY2VMaXN0aW5nXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ2xvY2F0aW9uTGlzdGluZydcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvY2F0aW9uTGlzdGluZ1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ3N0YWZmTGlzdGluZydcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0YWZmTGlzdGluZ1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ2RhdGVTZWxlY3Rpb24nXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkYXRlU2VsZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiPT09J2NvbnRhY3REZXRhaWxzJ1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFjdERldGFpbHNcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWI9PT0ncGF5bWVudFRhYidcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBheW1lbnRUYWJcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWI9PT0nc3RhdHVzVGVtcGxhdGUnXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdGF0dXNUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWFpbl9mb290ZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCIgKm5nSWY9XCJzZWxlY3RlZFRhYiE9PSdzdGF0dXNUZW1wbGF0ZSdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9vdGVyLWJ1dHRvbnNcIlxyXG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2p1c3RpZnktY29udGVudCc6IHNlbGVjdGVkVGFiICE9ICdzZXJ2aWNlTGlzdGluZycgPyAnc3BhY2UtYmV0d2VlbicgOiAnZW5kJ31cIj5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWNrLWZvb3Rlci1idG4gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwicHJldmlvdXNTdGVwKClcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFRhYiAhPSAnc2VydmljZUxpc3RpbmcnXCI+QmFjazwvc3Bhbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNvbnRpbnVlLWJ0blwiIFtkaXNhYmxlZF09XCIhYWN0aXZlQnV0dG9uXCIgKGNsaWNrKT1cIm5leHRTdGVwKClcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFRhYiE9J3BheW1lbnRUYWInXCI+e3shbG9hZGVyID8gJ0NvbnRpbnVlJyA6ICdMb2FkaW5nLi4uJ319PC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJjdXJzb3ItcG9pbnRlciBkLWZsZXgganVzdGlmeS1jb250ZW50LWV2ZW5seSBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFRhYj09PSdwYXltZW50VGFiJ1wiIChjbGljayk9XCJjaGVja1BheW1lbnQoKVwiIFtkaXNhYmxlZF09XCJpc1Byb2Nlc3NpbmdcIlxyXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydwYXktbm93LWJ0bicgOiBzZWxlY3RlZFNlcnZpY2U/LmRlcG9zaXRBbW91bnQ/LmRlcG9zaXRSZXF1aXJlZCwnY29tcGxldGVfYm9va2luZycgOiAhc2VsZWN0ZWRTZXJ2aWNlPy5kZXBvc2l0QW1vdW50Py5kZXBvc2l0UmVxdWlyZWR9XCI+XHJcbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvMzA0MDEyYzE3NTM0NDAwODc5OTZCYWNrZ3JvdW5kLnBuZ1wiPlxyXG4gICAgICAgICAgICAgICAge3tzZWxlY3RlZFNlcnZpY2U/LmRlcG9zaXRBbW91bnQ/LmRlcG9zaXRSZXF1aXJlZCA/ICdQYXkgTm93JyA6ICdDb21wbGV0ZSBCb29raW5nJ319XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvc2VjdGlvbj5cclxuPG5nLXRlbXBsYXRlICNzZXJ2aWNlTGlzdGluZz5cclxuICAgIDxkaXYgY2xhc3M9XCJ3LTYwIHNlcnZpY2Vfc2VjdGlvblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLXNlbGVjdGlvblwiPlxyXG4gICAgICAgICAgICA8aDI+U2VsZWN0IGEgU2VydmljZTwvaDI+XHJcbiAgICAgICAgICAgIDxwPkNob29zZSB0aGUgc2VydmljZSB5b3UnZCBsaWtlIHRvIGJvb2s8L3A+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZXMtZ3JpZFwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VydmljZSBvZiBzZXJ2aWNlRGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIiAoY2xpY2spPVwic2VsZWN0U2VydmljZShzZXJ2aWNlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3NlcnZpY2UtY2FyZC1zZWxlY3RlZCcgOiBzZXJ2aWNlPy5zZWxlY3RlZCwgJ3NlcnZpY2UtY2FyZCc6ICFzZXJ2aWNlPy5zZWxlY3RlZCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgc2VydmljZS1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWljb25cIj48bWF0LWljb24+cGVyc29uX291dGxpbmU8L21hdC1pY29uPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLXRpdGxlXCI+e3tzZXJ2aWNlPy5uYW1lID8gc2VydmljZT8ubmFtZSA6ICdOL0EnfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1wcmljZVwiPuKCuXt7c2VydmljZT8ucHJpY2VEZXRhaWxzPy5wcmljZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2U/LnByaWNlRGV0YWlscz8ucHJpY2UgOiAnTi9BJyB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWR1cmF0aW9uXCI+e3tzZXJ2aWNlPy5kdXJhdGlvbiA/IHNlcnZpY2U/LmR1cmF0aW9uIDogJ04vQSd9fSBtaW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZGVzY3JpcHRpb25cIiAqbmdJZj1cInNlcnZpY2U/LmRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NlcnZpY2U/LmRlc2NyaXB0aW9uID8gc2VydmljZT8uZGVzY3JpcHRpb24gOiAnTi9BJ319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG9tZS12aXNpdFwiICpuZ0lmPVwic2VydmljZT8uaG9tZUFwcG9pbnRtZW50QXZhaWxhYmxlXCI+PGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvOTgyMTI2YzE3NTg2Mjg4NjMxMjlmdXJuaXR1cmVfMTY0MDYxMDMucG5nXCI+SG9tZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaXQgQXZhaWxhYmxlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaWNvblwiPvCfkaQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtdGl0bGVcIj5HZW5lcmFsIENvbnN1bHRhdGlvbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY2F0ZWdvcnlcIj5NZWRpY2FsPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtcHJpY2VcIj7igrk4MDA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWR1cmF0aW9uXCI+MzAgbWluPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWRlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbXByZWhlbnNpdmUgaGVhbHRoIGNvbnN1bHRhdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1pY29uXCI+8J+noDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS10aXRsZVwiPk1lbnRhbCBIZWFsdGggQ291bnNlbGluZzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY2F0ZWdvcnlcIj5NZW50YWwgSGVhbHRoPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtcHJpY2VcIj7igrkxNTAwPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1kdXJhdGlvblwiPjQ1IG1pbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1kZXNjcmlwdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBQcm9mZXNzaW9uYWwgcHN5Y2hvbG9naWNhbCBzdXBwb3J0XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhvbWUtdmlzaXRcIj5Ib21lIFZpc2l0IEF2YWlsYWJsZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY2FyZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1pY29uXCI+4pyCPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLXRpdGxlXCI+SGFpciBDdXQgJiBTdHlsaW5nPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXRlZ29yeVwiPkJlYXV0eTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLXByaWNlXCI+4oK5MTIwMDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZHVyYXRpb25cIj40NSBtaW48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZGVzY3JpcHRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmVzc2lvbmFsIGhhaXIgY3V0dGluZyBhbmQgc3R5bGluZ1xyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob21lLXZpc2l0XCI+SG9tZSBWaXNpdCBBdmFpbGFibGU8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNsb2NhdGlvbkxpc3Rpbmc+XHJcbiAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb25fc2VjdGlvblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXIgZmxleC1jb2x1bW4gYWxpZ24taXRlbXMtc3RhcnRcIj5cclxuICAgICAgICAgICAgPGgxPkNob29zZSBMb2NhdGlvbjwvaDE+XHJcbiAgICAgICAgICAgIDxwPlNlbGVjdCB3aGVyZSB5b3UnZCBsaWtlIHRvIHJlY2VpdmUgdGhlIHNlcnZpY2U8L3A+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1saXN0XCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGxvY2F0aW9uIG9mIGxvY2F0aW9uRGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwic2VsZWN0TG9jYXRpb24obG9jYXRpb24pXCJcclxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdsb2NhdGlvbi1jYXJkLXNlbGVjdGVkJyA6IGxvY2F0aW9uPy5zZWxlY3RlZCwgJ2xvY2F0aW9uLWNhcmQnOiAhbG9jYXRpb24/LnNlbGVjdGVkIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24taW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWljb25cIj48aW1nXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvNDI3MjI2YzE3NTg2MjkxNTc3NThzdG9yZV8zMTcxNTEwLnBuZ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tZGV0YWlsc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz57e2xvY2F0aW9uPy5zdG9yZU5hbWUgPyBsb2NhdGlvbj8uc3RvcmVOYW1lIDogJ04vQSd9fTwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImRpc3RhbmNlXCI+PG1hdC1pY29uPmxvY2F0aW9uX29uPC9tYXQtaWNvbj4gMi4zIGttPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPnt7bG9jYXRpb24/LmFkZHJlc3NEZXRhaWxzPy5hZGRyZXNzTGluZX19LCB7e2xvY2F0aW9uPy5hZGRyZXNzRGV0YWlscz8uY2l0eX19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2xvY2F0aW9uPy5hZGRyZXNzRGV0YWlscz8uc3RhdGV9fSB7e2xvY2F0aW9uPy5waW5jb2RlfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImxvY2F0aW9uLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWljb24gYnJhbmNoLWljb25cIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz5CcmFuY2ggQ2xpbmljPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPjQ1NiBDYXJlIEF2ZW51ZSwgSGVhbHRoIFpvbmUsIE11bWJhaSA0MDAwMTU8L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkaXN0YW5jZVwiPjUuOCBrbTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWljb24gaG9tZS1pY29uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1kZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+SG9tZSBWaXNpdDwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5Zb3VyIExvY2F0aW9uPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGlzdGFuY2VcIj4wIGttPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjc3RhZmZMaXN0aW5nPlxyXG4gICAgPGRpdiBjbGFzcz1cInctNjAgb3ZlcmZsb3ctaGlkZGVuIHN0YWZmLWxpc3RpbmdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGgtMTAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGFmZi1oZWFkZXIgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMT5TZWxlY3QgU3RhZmYgTWVtYmVyPC9oMT5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInN0YWZmLXN1YnRpdGxlIG1iLTBcIj5DaG9vc2UgeW91ciBwcmVmZXJyZWQgcHJvZmVzc2lvbmFsPC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBTdGFmZiBDYXJkcyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTQgc3RhZmYtbGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0YWZmIG9mIHN0YWZmRGF0YVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCByb3VuZGVkLTMgcC0zXCIgKGNsaWNrKT1cInNlbGVjdFN0YWZmKHN0YWZmKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzdGFmZi1jYXJkLXNlbGVjdGVkJyA6IHN0YWZmPy5zZWxlY3RlZCwgJ3N0YWZmLWNhcmQnOiAhc3RhZmY/LnNlbGVjdGVkIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtc3RhcnQganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLXN0YXJ0IGZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic3RhZmYtYXZhdGFyIHJvdW5kZWQtY2lyY2xlIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBtZS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3N0YWZmPy5zdGFmZk5hbWUuc2xpY2UoMCwzKS50b1VwcGVyQ2FzZSgpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGFmZi1kZXRhaWxzIGZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJzdGFmZi1uYW1lXCI+e3tzdGFmZj8uc3RhZmZOYW1lID8gc3RhZmY/LnN0YWZmTmFtZSA6ICdOL0EnfX08L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzdGFmZi1zcGVjaWFsdHlcIj5HZW5lcmFsIE1lZGljaW5lPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8cCBjbGFzcz1cInN0YWZmLWRlc2NyaXB0aW9uIG1iLTBcIj5FeHBlcmllbmNlZCBwaHlzaWNpYW4gd2l0aCAxMCsgeWVhcnMgaW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmFsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWNpbmUgYW5kIHdlbGxuZXNzIGNhcmUuPC9wPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwicmF0aW5nLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXItcmF0aW5nIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Rhci1pY29uXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyYXRpbmctbnVtYmVyXCI+NC45PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJldmlldy1jb3VudFwiPjE1NiByZXZpZXdzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZGF0ZVNlbGVjdGlvbj5cclxuICAgIDxkaXYgY2xhc3M9XCJ3LTYwIGRhdGVfc2VjdGlvblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cganVzdGlmeS1jb250ZW50LWNlbnRlciBoLTEwMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGgtMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXRpbWUtaGVhZGVyIG1iLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDE+U2VsZWN0IERhdGUgJiBUaW1lPC9oMT5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImRhdGV0aW1lLXN1YnRpdGxlIG1iLTBcIj5DaG9vc2Ugd2hlbiB5b3UnZCBsaWtlIHlvdXIgYXBwb2ludG1lbnQ8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIE1haW4gQ29udGVudCAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTQgbWFpbl9jb250YWluZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIExlZnQgQ29sdW1uIC0gRGF0ZSBTZWxlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J3ctNTAnIDogc2NyZWVuV2lkdGggPiA0NzUgLCAndy0xMDAnOnNjcmVlbldpZHRoIDwgNDc1fVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1jYXJkIGNhcmQgcm91bmRlZC0zIHAtNCBoLTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPlNlbGVjdCBEYXRlPC9oMz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1waWNrZXItY29udGFpbmVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImRhdGUtaW5wdXQgYm9yZGVyLTAgcm91bmRlZC0yXCIgcGxhY2Vob2xkZXI9XCJkZC1tbS15eXl5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cInNlbGVjdGVkRGF0ZVN0clwiIHJlYWRvbmx5IChjbGljayk9XCJ0b2dnbGVDYWxlbmRhcigkZXZlbnQpXCI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1zLTJcIiAoY2xpY2spPVwidG9nZ2xlQ2FsZW5kYXIoJGV2ZW50KVwiPmNhbGVuZGFyX3RvZGF5PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLXBvcG92ZXJcIiAqbmdJZj1cInNob3dDYWxlbmRhclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWNhbGVuZGFyIFsoc2VsZWN0ZWQpXT1cInNlbGVjdGVkRGF0ZVwiIFtkYXRlRmlsdGVyXT1cImRhdGVGaWx0ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uRGF0ZVNlbGVjdGVkKCRldmVudClcIiBjbGFzcz1cImRhdGVwaWNrZXItY2FsZW5kYXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tYXQtY2FsZW5kYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gUmlnaHQgQ29sdW1uIC0gVGltZSBTZWxlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVfc2VsZWN0aW9uXCIgW25nQ2xhc3NdPVwieyd3LTUwJyA6IHNjcmVlbldpZHRoID4gNDc1ICwgJ3ctMTAwJzpzY3JlZW5XaWR0aCA8IDQ3NX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZCBjYXJkIGgtMTAwIHJvdW5kZWQtMyBwLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5BdmFpbGFibGUgVGltZXM8L2gzPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGltZSBTbG90cyBHcmlkIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTIgbWItNCBvdmVyZmxvdy1zY3JvbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyIDtlbHNlIHNsb3RzTG9hZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiICpuZ0Zvcj1cImxldCB0aW1lIG9mIGxvY2F0aW9uVGltaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1zbG90IHJvdW5kZWQtMlwiIFtjbGFzcy5zZWxlY3RlZF09XCJ0aW1lLnNlbGVjdGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0VGltZVNsb3QodGltZSlcIj57e3RpbWUgP1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWU/LnZhbHVlIDogJ04vQSd9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3Nsb3RzTG9hZGVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRpbWUgU2xvdCBHcmlkIFNrZWxldG9uIExvYWRlciBIVE1MIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1zbG90LWdyaWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUm93IDEgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tdGltZS1zbG90XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tdGltZS1zbG90XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tdGltZS1zbG90XCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSb3cgMiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi10aW1lLXNsb3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi10aW1lLXNsb3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi10aW1lLXNsb3RcIj48L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJvdyAzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLXRpbWUtc2xvdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLXRpbWUtc2xvdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLXRpbWUtc2xvdFwiPjwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUm93IDQgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tdGltZS1zbG90XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tdGltZS1zbG90XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24tdGltZS1zbG90XCI+PC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSb3cgNSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi10aW1lLXNsb3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi10aW1lLXNsb3RcIj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbi10aW1lLXNsb3RcIj48L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJvdyA2IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLXRpbWUtc2xvdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLXRpbWUtc2xvdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uLXRpbWUtc2xvdFwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gV2FpdGxpc3QgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cIndhaXRsaXN0LXNlY3Rpb24gcm91bmRlZC0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1zdGFydFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGgtMTAwIGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2FpdGxpc3QtdGl0bGUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBnYXAtMlwiPjxzcGFuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwid2FpdGxpc3QtaWNvbiBjaGVjay1pY29uXCI+PC9zcGFuPk5vXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdHMgYXZhaWxhYmxlPzwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIndhaXRsaXN0LWRlc2NyaXB0aW9uIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNoZWNrLWlucHV0IGN1cnNvci1wb2ludGVyXCIgdHlwZT1cImNoZWNrYm94XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJmbGV4Q2hlY2tDaGVja2VkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkIG1lIHRvIHRoZSB3YWl0bGlzdCBmb3IgZWFybGllclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjY29udGFjdERldGFpbHM+XHJcbiAgICA8ZGl2IGNsYXNzPVwidy02MCBjb250YWN0X3NlY3Rpb24gb3ZlcmZsb3ctaGlkZGVuXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBoLTEwMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaC0xMDAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gSGVhZGVyIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1oZWFkZXIgbWItMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMT5Db250YWN0IERldGFpbHM8L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiY29udGFjdC1zdWJ0aXRsZSBtYi0wXCI+UHJvdmlkZSB5b3VyIGNvbnRhY3QgaW5mb3JtYXRpb248L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIEZvcm0gU2VjdGlvbnMgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0zIGRldGFpbHNfY29udGFpbmVyIGZsZXgtY29sdW1uIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBMZWZ0IENvbHVtbiAtIFBlcnNvbmFsIEluZm9ybWF0aW9uIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyd3LTUwJyA6IHNlbGVjdGVkU2VydmljZT8uaG9tZUFwcG9pbnRtZW50QXZhaWxhYmxlLCAndy0xMDAnIDogIXNlbGVjdGVkU2VydmljZT8uaG9tZUFwcG9pbnRtZW50QXZhaWxhYmxlfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvbiBjYXJkIHJvdW5kZWQtMyBwLTQgaC0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+UGVyc29uYWwgSW5mb3JtYXRpb248L2gzPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEZ1bGwgTmFtZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bGwgTmFtZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0taW5wdXQgcm91bmRlZC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLm5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hlY2tSZXF1aXJlZFZhbHVlcygpXCIgc2ltcG9MZXR0ZXJzT25seT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFbWFpbCBBZGRyZXNzIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1haWwgQWRkcmVzc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWlucHV0IHJvdW5kZWQtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5lbWFpbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGVja1JlcXVpcmVkVmFsdWVzKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj1cIl5bYS16MC05Ll8lKy1dK0BbYS16MC05Li1dK1xcLlthLXpdezIsNH0kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUGhvbmUgTnVtYmVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0wXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmUgTnVtYmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZWxcIiBjbGFzcz1cImZvcm0tY29udHJvbCAgcm91bmRlZC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLnBob25lTnVtYmVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoZWNrUmVxdWlyZWRWYWx1ZXMoKVwiIHNpbXBvTnVtYmVyc09ubHlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbW9iaWxlX251bWJlcicgOiBhcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwucGhvbmVOdW1iZXIubGVuZ3RoICE9IDEwfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJpZ2h0IENvbHVtbiAtIEhvbWUgVmlzaXQgRGV0YWlscyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctNTBcIiAqbmdJZj1cInNlbGVjdGVkU2VydmljZT8uaG9tZUFwcG9pbnRtZW50QXZhaWxhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uIGNhcmQgcm91bmRlZC0zIHAtNCBoLTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5Ib21lIFZpc2l0IERldGFpbHM8L2gzPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIEhvbWUgQWRkcmVzcyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvbWUgQWRkcmVzc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS10ZXh0YXJlYSByb3VuZGVkLTJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFbnRlciB5b3VyIGNvbXBsZXRlIGFkZHJlc3NcIiBbKG5nTW9kZWwpXT1cImhvbWVBZGRyZXNzXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTcGVjaWFsIEluc3RydWN0aW9ucyAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwZWNpYWwgSW5zdHJ1Y3Rpb25zXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLXRleHRhcmVhIHJvdW5kZWQtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkFueSBzcGVjaWFsIGluc3RydWN0aW9ucyBmb3IgdGhlIHByb2Zlc3Npb25hbCAob3B0aW9uYWwpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaW5zdHJ1Y3Rpb25zXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9saWNpZXMtY29udGFpbmVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gSGVhZGVyIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJwb2xpY2llcy10aXRsZVwiPlBvbGljaWVzICYgVGVybXM8L2gyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBQb2xpY3kgSXRlbXMgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb2xpY3ktaXRlbXMtY29udGFpbmVyIGQtZmxleCBmbGV4LWNvbHVtbiBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDYW5jZWxsYXRpb24gUG9saWN5IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvbGljeS1pdGVtIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93Q2FuY2VsbGF0aW9uUG9saWN5ID0gIXNob3dDYW5jZWxsYXRpb25Qb2xpY3lcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJwb2xpY3ktdGl0bGVcIj5DYW5jZWxsYXRpb24gUG9saWN5PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9saWN5LWFycm93IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPjxtYXQtaWNvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhc2hvd0NhbmNlbGxhdGlvblBvbGljeVwiPmtleWJvYXJkX2Fycm93X3JpZ2h0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwic2hvd0NhbmNlbGxhdGlvblBvbGljeVwiPmtleWJvYXJkX2Fycm93X2Rvd248L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FuY2VsbGF0aW9uX3BvbGljaWVzIGQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMiBmdy01MDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd0NhbmNlbGxhdGlvblBvbGljeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBwb2xpY3kgb2Ygc2VsZWN0ZWRTZXJ2aWNlPy5jYW5jZWxsYXRpb25Qb2xpY3lcIj4mIzgyMjY7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7cG9saWN5fX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJlc2NoZWR1bGluZyBQb2xpY3kgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9saWN5LWl0ZW0gZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dSZWR1Y2luZ1BvbGljeSA9ICFzaG93UmVkdWNpbmdQb2xpY3lcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJwb2xpY3ktdGl0bGVcIj5SZXNjaGVkdWxpbmcgUG9saWN5PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9saWN5LWFycm93IGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPjxtYXQtaWNvblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhc2hvd1JlZHVjaW5nUG9saWN5XCI+a2V5Ym9hcmRfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJzaG93UmVkdWNpbmdQb2xpY3lcIj5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbmNlbGxhdGlvbl9wb2xpY2llcyBkLWZsZXggZmxleC1jb2x1bW4gZ2FwLTIgZnctNTAwXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dSZWR1Y2luZ1BvbGljeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBwb2xpY3kgb2Ygc2VsZWN0ZWRTZXJ2aWNlPy5yZXNjaGVkdWxlUG9saWN5XCI+JiM4MjI2OyB7e3BvbGljeX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBBY2NlcHRhbmNlIFNlY3Rpb24gLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NlcHRhbmNlLXNlY3Rpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiIFsobmdNb2RlbCldPVwidGVybXNBbmRDb25kaXRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGVja1JlcXVpcmVkVmFsdWVzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYWNjZXB0YW5jZS10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSSB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgdGhlIGNhbmNlbGxhdGlvbiAmIHJlc2NoZWR1bGluZyBwb2xpY2llcyBhbmRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRlcm1zLWxpbmtcIj5UZXJtcyAmIENvbmRpdGlvbnM8c3BhblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJleHRlcm5hbC1saW5rLWljb25cIj48L3NwYW4+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI3BheW1lbnRUYWI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidy02MCBwYXltZW50X3NlY3Rpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgaC0xMDBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBIZWFkZXIgU2VjdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXltZW50LWhlYWRlciBtYi0zIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgxPlBheW1lbnQgJiBDb25maXJtYXRpb248L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicGF5bWVudC1zdWJ0aXRsZSBtYi0wXCI+UmV2aWV3IHlvdXIgYm9va2luZyBhbmQgY29tcGxldGUgcGF5bWVudDwvcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gQm9va2luZyBTdW1tYXJ5IENhcmQgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9va2luZy1zdW1tYXJ5LWNhcmRcIiBbbmdDbGFzc109XCJ7J3ctMTAwJyA6IHNjcmVlbldpZHRoIDwgNDc1LCd3LTUwJzpzY3JlZW5XaWR0aCA+IDQ3NX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJzdW1tYXJ5LXRpdGxlXCI+Qm9va2luZyBTdW1tYXJ5PC9oMj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBTZXJ2aWNlIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlNlcnZpY2U8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj57e3NlbGVjdGVkU2VydmljZT8ubmFtZSA/IHNlbGVjdGVkU2VydmljZT8ubmFtZSA6ICdOL0EnfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBQcm9mZXNzaW9uYWwgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCIgKm5nSWY9XCJzZWxlY3RlZFN0YWZmPy5zdGFmZk5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5Qcm9mZXNzaW9uYWw8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj57e3NlbGVjdGVkU3RhZmY/LnN0YWZmTmFtZSA/IHNlbGVjdGVkU3RhZmY/LnN0YWZmTmFtZSA6ICdOL0EnfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBMb2NhdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5Mb2NhdGlvbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPnt7c2VsZWN0ZWRMb2NhdGlvbj8uc3RvcmVOYW1lID8gc2VsZWN0ZWRMb2NhdGlvbj8uc3RvcmVOYW1lIDogJ04vQSd9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEYXRlICYgVGltZSAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5EYXRlICYgVGltZTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPnt7c2VsZWN0ZWREYXRlU3RyID8gKHNlbGVjdGVkRGF0ZVN0cikgOiAnTi9BJ319IGF0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3NlbGVjdGVkVGltZSA/IHNlbGVjdGVkVGltZS52YWx1ZSA6ICdOL0EnfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEdXJhdGlvbiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5EdXJhdGlvbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPnt7c2VsZWN0ZWRTZXJ2aWNlPy5kdXJhdGlvbiA/IHNlbGVjdGVkU2VydmljZT8uZHVyYXRpb24gOiAnTi9BJ319XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW51dGVzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+VGF4IFBlcmNlbnQ8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj57e3NlbGVjdGVkU2VydmljZT8ucHJpY2VEZXRhaWxzPy50YXhQZXJjZW50ID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2VydmljZT8ucHJpY2VEZXRhaWxzPy50YXhQZXJjZW50IDogMH19JTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gVG90YWwgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93IHRvdGFsLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlRvdGFsPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1cnJlbmN5LXN5bWJvbFwiPuKCuTwvc3Bhbj57e3NlbGVjdGVkU2VydmljZT8ucHJpY2VEZXRhaWxzPy50b3RhbFByaWNlID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2VydmljZT8ucHJpY2VEZXRhaWxzPy50b3RhbFByaWNlIDogJzAnfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuPG5nLXRlbXBsYXRlICNzdGF0dXNUZW1wbGF0ZT5cclxuICAgIDxkaXYgY2xhc3M9XCJib29raW5nLWNvbmZpcm1hdGlvblwiPlxyXG4gICAgICAgIDwhLS0gU3VjY2VzcyBJY29uIC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWNjZXNzLWljb25cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrbWFyay1jaXJjbGVcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy84ODEyOTNjMTc1ODY5NTU3ODUxOHN1Y2Nlc3MuZ2lmXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMTAwIGgtMTAwXCIgKm5nSWY9XCJhcGlTdGF0dXNcIj5cclxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy8zMjUwMDBjMTc1ODY5NTU2NDUxOGZhaWwuZ2lmXCJcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMTAwIGgtMTAwXCIgKm5nSWY9XCIhYXBpU3RhdHVzXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIE1haW4gQ29udGVudCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlybWF0aW9uLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgPGgxIGNsYXNzPVwiY29uZmlybWF0aW9uLXRpdGxlXCI+e3thcGlTdGF0dXMgPyAnQm9va2luZyBDb25maXJtZWQhJyA6ICdCb29raW5nIEZhaWxlZCd9fTwvaDE+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiY29uZmlybWF0aW9uLW1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgIHt7YXBpU3RhdHVzID8gJ1lvdXIgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGJvb2tlZC4nOidGYWlsZWQgdG8gYm9vayB5b3UgYXBwb2ludG1lbnQuIFBsZWFzZVxyXG4gICAgICAgICAgICAgICAgdHJ5IGFnYWluIGxhdGVyJ319XHJcbiAgICAgICAgICAgIDwvcD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRGV0YWlscyBDYXJkIC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJhcGlTdGF0dXNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJkZXRhaWxzLXRpdGxlXCI+QXBwb2ludG1lbnQgRGV0YWlsczwvaDM+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlNlcnZpY2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3thcHBvaW50bWVudFBheWxvYWQuc2VydmljZURldGFpbD8ubmFtZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBvaW50bWVudFBheWxvYWQuc2VydmljZURldGFpbD8ubmFtZSA6ICdOL0EnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXJvd1wiICpuZ0lmPVwiYXBwb2ludG1lbnRQYXlsb2FkPy5zdGFmZkRldGFpbD8ubmFtZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlByb2Zlc3Npb25hbDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57e2FwcG9pbnRtZW50UGF5bG9hZC5zdGFmZkRldGFpbD8ubmFtZSA/XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBvaW50bWVudFBheWxvYWQuc3RhZmZEZXRhaWw/Lm5hbWUgOiAnTi9BJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPkRhdGUgJiBUaW1lPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7YXBwb2ludG1lbnRQYXlsb2FkLmJvb2tpbmdEYXRlID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcG9pbnRtZW50UGF5bG9hZC5ib29raW5nRGF0ZS5zbGljZSgwLDEwKSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTi9BJ319IGF0XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2FwcG9pbnRtZW50UGF5bG9hZC5zdGFydFRpbWUgPyBhcHBvaW50bWVudFBheWxvYWQuc3RhcnRUaW1lIDogJ04vQSd9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgICAgICAgICA8IS0tIEFjdGlvbiBCdXR0b25zIC0tPlxyXG4gICAgICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJhY3Rpb24tYnV0dG9uc1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiPlZpZXcgTXkgQm9va2luZ3M8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj5CYWNrIHRvIEFkbWluPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI3NrZWxldG9uTG9hZGVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cclxuICAgIDwhLS0gU2VydmljZSBTa2VsZXRvbiBMb2FkZXIgSFRNTCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWdyaWRcIj5cclxuICAgICAgICA8IS0tIFNrZWxldG9uIENhcmQgMSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXJkIHNrZWxldG9uLWNhcmRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24taWNvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi10aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1wcmljZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1kdXJhdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tY2F0ZWdvcnlcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLWRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1iYWRnZVwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNrZWxldG9uIENhcmQgMiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXJkIHNrZWxldG9uLWNhcmRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24taWNvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi10aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1wcmljZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1kdXJhdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tY2F0ZWdvcnlcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLWRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1iYWRnZVwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNrZWxldG9uIENhcmQgMyAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXJkIHNrZWxldG9uLWNhcmRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24taWNvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi10aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1wcmljZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1kdXJhdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tY2F0ZWdvcnlcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLWRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1iYWRnZVwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNrZWxldG9uIENhcmQgNCAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXJkIHNrZWxldG9uLWNhcmRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24taWNvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi10aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1wcmljZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1kdXJhdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tY2F0ZWdvcnlcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLWRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1iYWRnZVwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNrZWxldG9uIENhcmQgNSAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXJkIHNrZWxldG9uLWNhcmRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24taWNvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi10aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1wcmljZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1kdXJhdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tY2F0ZWdvcnlcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLWRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1iYWRnZVwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8IS0tIFNrZWxldG9uIENhcmQgNiAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXJkIHNrZWxldG9uLWNhcmRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24taWNvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtY29udGVudFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi10aXRsZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1wcmljZVwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1kdXJhdGlvblwiPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2tlbGV0b24gc2tlbGV0b24tY2F0ZWdvcnlcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNrZWxldG9uIHNrZWxldG9uLWRlc2NyaXB0aW9uXCI+PC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJza2VsZXRvbiBza2VsZXRvbi1iYWRnZVwiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+Il19